戯言と技術
普段使うコマンドや、困ったことをまとめた備忘録的技術ブログ たまに趣味のネタw
ページ
2023年1月15日日曜日
2017年8月20日日曜日
Mac Sierraでapache +PHP5.6をPHP7.1を利用する手順
PHP5.6=>PHP7.1をMac Sierraで利用するための手順
基本はこれで行けるはずですが、自分の環境では行けず以下を対応
php.iniが古いのが問題の可能性が高い
php5.6からphp7.1向けのphp.iniを公式サイトからphp-7.1.8.tar.bz2をDLし
Downloadフォルダに解凍後以下を実施
これで行けました。
名称 | 概要 |
---|---|
実行日 | 2017/08/20 |
OS | MacOS Sierra |
Apache | 2.4.27 |
Brew | Homebrew 1.3.1 |
$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/php
$ brew tap homebrew/apache
$ brew update
-- 不要なら外す
$ brew unlink php56
$ brew install php71 --with-httpd24
-- 普段CakePHPをよく利用するのでついでに手順化
$ brew install php71-intl php71-pdo-pgsql
$ sudo vi /etc/apache2/httpd.conf
-- 以下の変更--
# LoadModule php5_module libexec/apache2/libphp5.so
LoadModule php7_module /usr/local/opt/php71/libexec/apache2/libphp7.so
-------------
$ sudo vi /etc/apache2/other/php7.conf
--- 以下を追加 ---
SetHandler application/x-httpd-php
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
DirectoryIndex index.html index.php
---------------
sudo mv /etc/apache2/other/php5.conf /etc/apache2/other/php5.conf.bk
-- versionチェック
$ php -v
$ sudo apachectl restart
基本はこれで行けるはずですが、自分の環境では行けず以下を対応
less /var/log/apache2/error_log
---- エラーログをチェック -----
[Sun Aug 20 20:53:25.102393 2017] [mpm_prefork:notice] [pid 86] AH00163: Apache/2.4.25 (Unix) PHP/7.1.8 configured -- resuming normal operations
[Sun Aug 20 20:53:25.102609 2017] [core:notice] [pid 86] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
---------------------------
php.iniが古いのが問題の可能性が高い
php5.6からphp7.1向けのphp.iniを公式サイトからphp-7.1.8.tar.bz2をDLし
Downloadフォルダに解凍後以下を実施
sudo mv /etc/php.ini /etc/php.ini.20170820
sudo cp Downloads/php-7.1.8/php.ini-production /etc/php.ini
これで行けました。
localhostでWebプッシュの実現(OneSignal編)
Webプッシュ技術が流行っているので試しに実装及びまとめてみました。
環境は以下に記載ですが、localhostで試験的にやってみたい人向けに書いています。
OneSignalというサービスを利用して対応してみましたが以下の理由で対応しました。他に良いものもあるかもしれないですが自分の中ではこれが一番しっくりきました。
基本的にMacを触っていれば初期状態?で利用できるものを前提にしてみました。
に登録、登録にはメアド&パスワードでOK
GitHubとかその他でも可
ここは自分で適当に決める今回は`Test’で作成
何も考えず
まずは Safariの設定をするので
必須入力が、2つで
残り2つは製品をリリースするのなら触った方が良いがとり得ず今は放置
何も考えず
この画面に来ると2つのことをする必要がある
1. 承認用HTMLの作成
2. ブラウザから承認
まずは、
以下のソースを記載
http://localhost/
にアクセスしてアクセスを許可をしてサイトに戻り確認作業
とここまでがSafariの設定次にその他ブラウザ対応
個人的にですが実はSafariの方が簡単でした。
この方法でFireFoxも対応可能です。
入力情報がこの場合は、
色々試したのですがこうしないと正しく登録できない。
どうやらChromeやFireFoxだとローカル内のOneSignalSDKWorker.jsが必要みたいでこれを取って来る必要があります。
この内容の注意したいところがあります。
例えばサイトのアクセスが
少しみてみるとCrhome用のデバッグコンソールに出て来るので失敗する場合は、エラーログをチェックしてみると良いです。
環境は以下に記載ですが、localhostで試験的にやってみたい人向けに書いています。
OneSignalというサービスを利用して対応してみましたが以下の理由で対応しました。他に良いものもあるかもしれないですが自分の中ではこれが一番しっくりきました。
無料で利用できる早速検証環境を羅列
非SSLで利用可能
Mac & Windows系の主要ブラウザ対応(iOSは非対応)
環境 | 概要 |
---|---|
2017/08/19日検証 | |
プッシュサービス | OneSignal |
Webサーバ | macOS Sierra上にapache(Apache/2.4.25) |
ホスト | http://localhost/~{ユーザ名}/ |
http://localhost/index.htmlに実現するイメージです。
1.サイトに登録
https://onesignal.com/に登録、登録にはメアド&パスワードでOK
GitHubとかその他でも可
登録作業は本質ではないので省略
2.新しいプロジェクトの設定(Safari編)
2-1.プロジェクト名の入力
Add a new app
を押し新規作成 ここは自分で適当に決める今回は`Test’で作成
2-2.WebSite Pushを指定
WebSiet Push
を選択2-3.Apple Safariを指定
Apple Safari
を指定2-4.テストサイト情報を指定
必須入力が、2つで
Site Name
これは適当で良い今回はTest1
を指定 Site URL
ここにhttp://localhost
を指定 残り2つは製品をリリースするのなら触った方が良いがとり得ず今は放置
2-5.SDKの指定
何も考えず
Websiet Push
を選択2-6.Test実行
この画面に来ると2つのことをする必要がある
1. 承認用HTMLの作成
2. ブラウザから承認
まずは、
承認用HTMLの作成
から # sudo vi /Library/WebServer/Documents/index.html.en
以下のソースを記載
<html>
<script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async='async'></script>
<script>
var OneSignal = window.OneSignal || [];
OneSignal.push(["init", {
appId: "{Your App IDを置き換え}",
httpPermissionRequest: {enable: true},
allowLocalhostAsSecureOrigin: true,
autoRegister: true,
notifyButton: {enable: false}
}]);
</script>
<body>
<h1>It works!</h1>
</body>
</html>
自分で、Your App IDを置き換え
部分を書き換えてください。ブラウザから承認
の実行 http://localhost/
にアクセスしてアクセスを許可をしてサイトに戻り確認作業
とここまでがSafariの設定次にその他ブラウザ対応
個人的にですが実はSafariの方が簡単でした。
3.その他ブラウザ対応
次はその他ブラウザ今回のテストはChromeで実施この方法でFireFoxも対応可能です。
3-1.設定情報の登録
App Setting
=> Google Chrome and Mozilla Firefox
=> CONFIGURE
の順番で移動入力情報がこの場合は、
https://localhost
にしてMy site is not fully HTTPS
設定をチェックをつけないようにして登録します。 色々試したのですがこうしないと正しく登録できない。
3-2.追加ファイルの設置
ここで認証の前に一つ対応が入ります。index.html
の変更は不要なのですが追加でJSファイルが1つ必要です。# cd /Library/WebServer/Documents/
# sudo wget https://cdn.onesignal.com/sdks/OneSignalSDKWorker.js
どうやらChromeやFireFoxだとローカル内のOneSignalSDKWorker.jsが必要みたいでこれを取って来る必要があります。
この内容の注意したいところがあります。
例えばサイトのアクセスが
http://localhost/~{ユーザ名}/index.html
この場合でもOneSignalSDKWorker.js
のアクセス先はhttp://localhost/OneSignalSDKWorker.js
にする必要があるところです。少しみてみるとCrhome用のデバッグコンソールに出て来るので失敗する場合は、エラーログをチェックしてみると良いです。
2017年6月24日土曜日
CakePHP クエリービルダー活用
CakePHP 3系を利用したQueryBuilderの活用法
複雑なSQL(Group BYを主体)を記載する方法を記載
基本的に、特別なケースでない場合初期化の処理は
省きController上で動作させる前提で記載します
Software | Version |
---|---|
Postgres | 9.6.1 |
CakePHP | 3.3.16 |
まずはテーブルとデータを作成.
SQL
CREATE TABLE users (
user_id SERIAL,
user_name VARCHAR(256),
role VARCHAR(32) DEFAULT 'author',
created_date TIMESTAMP DEFAULT NOW(),
update_date TIMESTAMP DEFAULT NOW(),
PRIMARY KEY(user_id)
);
CREATE TABLE products (
product_id SERIAL,
product_name VARCHAR(256),
price INTEGER,
PRIMARY KEY(product_id)
);
CREATE TABLE product_orders (
product_order_id SERIAL,
product_id INTEGER,
date TIMESAMP,
user_id INTEGER,
PRIMARY KEY(product_order_id)
);
データ用SQL
INSERT INTO users(user_name) VALUES
('User A'),
('User B');
INSERT INTO products(product_name, price) VALUES
('product A', 1000),
('product B', 100),
('product C', 200);
INSERT INTO product_orders(product_id, date, user_id) VALUES
(1, '2017/06/24 15:00:00', 1),
(1, '2017/06/24 16:00:00', 2),
(2, '2017/06/24 17:00:00', 3),
(1, '2017/06/25 15:00:00', 2),
(2, '2017/06/25 16:00:00', 3),
(2, '2017/06/26 15:00:00', 1);
基本的な共通処理
use Cake\ORM\TableRegistry;
public function initialize(array $config) {
$this->Users = TableRegistry::get('Users');
$this->Products = TableRegistry::get('Products');
$this->ProductOrders = TableRegistry::get('ProductOrders');
}
1. 簡単なGroup BY
商品IDと合計件数を抽出
SQL
SELECT product_id, COUNT(product_order_id) AS total FROM product_orders GROUP BY product_id;
PHP
$productOrders = $this->ProductOrders->find();
$datas = $productOrders->select([
'product_id',
'total' => $productOrders->func()->count('product_order_id')
])->toArray();
- 少し複雑なGroup By
SELECT
product_id, product_name, T1.total
FROM
products
INNER JOIN (
SELECT
product_id, COUNT(product_order_id) AS total
FROM
product_orders
WHERE
date >= '2016/06/25'
GROUP BY product_order_id
) AS T1 USING(product_id)
PHP
$products = $this->Products->find();
$productOrders = $this->ProductOrders->find();
$datas = $productOrders->select([
'product_id',
'total' => $productOrders->func()->count('product_order_id')->where(['date' => new Time('2017-06-25')])
]);
$productsRecored = $products->join([
'T1' => [
'table' => $datas,
'type' => 'INNER',
'conditions' => 'T1.product_id = Products.product_id',
]
])->select([
"product_id",
"product_name",
"total" => "T1.total"
])->toArray();
自分が困ったSQLを記載
2016年7月24日日曜日
Cakephp3を利用しShellでComponentを利用する.
cakephp3を利用してShellでComponentを呼び出すのが
少し面倒だったのでまとめ
どうやらオートロードできないみたいなので自分でコンポーネントを初期化する必要があるみたいです。
Abstract化したりしてリフレクション的な感じで簡易化できそうな気もするのでできたら追記予定。
少し面倒だったのでまとめ
src/Controller/Component/TestsComponent.php
<?php namespace App\Controller\Component; use Cake\Controller\Component; class TestsComponent extends Component { public function test() { echo "OK\n"; } }
src/Shell/SampleShell.php
<?php namespace App\Shell; use Cake\Console\ConsoleOptionParser; use Cake\Console\Shell; use Cake\Log\Log; use Psy\Shell as PsyShell; use Cake\Controller\Component; use Cake\Controller\ComponentRegistry; use App\Controller\Component\TestsComponent; class SampleShell extends Shell { public function initialize() { $this->Tests = new TestsComponent(new ComponentRegistry()); } public function main() { $this->Tests->test(); } }
どうやらオートロードできないみたいなので自分でコンポーネントを初期化する必要があるみたいです。
Abstract化したりしてリフレクション的な感じで簡易化できそうな気もするのでできたら追記予定。
2016年7月2日土曜日
CentOS 7にTensorFlowをインストールする
自分メモ
以下のWindowsにVirutal Boxをインストールし実施
普通にインストールしてネットワークが起動しない場合は以下を実施して対処
ネットーワークの起動
インストール時にonbootをonにしていない場合はこの設定が必要です。
$ nmcli c
=====
NAME UUID TYPE DEVICE
enp0s3 xxxxxxx-xxxxx-xxxx-xxxxx-xxxxxxxxxxx 802-3-ethernet enp0s3
=========
enp0s3がデバイスのID
onbootを有効にする。
$ nmcli c m enp0s3 connection.autoconnect yes
ネットワークの再起動
$ systemctl restart NetworkManager
$ systemctl restart network
IPアドレスの確認
$ ip addr
pipのインストール
$ yum install -y epel-release
$ yum install -y python-pip
$ pip install pip --upgrade
その他ライブラリのインストール
$ yum install -y python-devel python-virtualenv
TensorFlowのインストール
$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl
TensorFlowの環境設定ファイルを設置
$ virtualenv --system-site-packages ~/tensorflow
TensorFlowの設定を呼び出し
$ source ~/tensorflow/bin/activate
$ vi test.py
========以下を貼り付け============
import tensorflow as tf
import numpy as np
==================================
$ python test.py
エラーが出なければ成功
まとめ
CentOS6系とかと比べてほとんど変わらないです。
以下のWindowsにVirutal Boxをインストールし実施
- Virtual Box 5.0.22 r108108
- 実施日:2016/06/28
- OS CentOS-7-x86_64-Minimal-1511
普通にインストールしてネットワークが起動しない場合は以下を実施して対処
ネットーワークの起動
インストール時にonbootをonにしていない場合はこの設定が必要です。
$ nmcli c
=====
NAME UUID TYPE DEVICE
enp0s3 xxxxxxx-xxxxx-xxxx-xxxxx-xxxxxxxxxxx 802-3-ethernet enp0s3
=========
enp0s3がデバイスのID
onbootを有効にする。
$ nmcli c m enp0s3 connection.autoconnect yes
ネットワークの再起動
$ systemctl restart NetworkManager
$ systemctl restart network
IPアドレスの確認
$ ip addr
pipのインストール
$ yum install -y epel-release
$ yum install -y python-pip
$ pip install pip --upgrade
その他ライブラリのインストール
$ yum install -y python-devel python-virtualenv
TensorFlowのインストール
$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl
TensorFlowの環境設定ファイルを設置
$ virtualenv --system-site-packages ~/tensorflow
TensorFlowの設定を呼び出し
$ source ~/tensorflow/bin/activate
$ vi test.py
========以下を貼り付け============
import tensorflow as tf
import numpy as np
==================================
$ python test.py
エラーが出なければ成功
まとめ
CentOS6系とかと比べてほとんど変わらないです。
2015年12月14日月曜日
Tensorflowで学ぶ最急降下法
Tensorflowで学ぶ最急降下法
ありきたりですが、Tensorflowの初期サンプルに掲載されている
最急降下法(train.GradientDescentOptimizer)の解説です。
最急降下法とは、ある式を作りその式に基づき
微分を行いもっとも傾きから最小の値を算出する手法です。
TensorFlowのget startedにあるIntroductionが
この最急降下法のサンプルとなります。
大まかなフローとしては
Step1.初期データ作成
Step2.予測モデルする方程式を作成
Step3.ロス関数と目標設定を作成
Step4.最適化の実行
すごくざっくりですがこの4ステップで最急降下法を実現しています。
この流れになります。
何の脈略もないのですが自己理解のための簡易解説となります。
ありきたりですが、Tensorflowの初期サンプルに掲載されている
最急降下法(train.GradientDescentOptimizer)の解説です。
最急降下法とは、ある式を作りその式に基づき
微分を行いもっとも傾きから最小の値を算出する手法です。
TensorFlowのget startedにあるIntroductionが
この最急降下法のサンプルとなります。
大まかなフローとしては
Step1.初期データ作成
Step2.予測モデルする方程式を作成
Step3.ロス関数と目標設定を作成
Step4.最適化の実行
すごくざっくりですがこの4ステップで最急降下法を実現しています。
# おまじない
import tensorflow as tf
import numpy as np
### Step1.初期データ作成 ###
# ランダムなxの値を作成
x_data = np.random.rand(100).astype("float32")
# y = 0.1x + 0.3の式に基づいた値を算出
y_data = x_data * 0.1 + 0.3
### Step2.予測モデルする方程式を作成 ###
# W 上でいう aに値する係数を初期値として-1.0~1.0の範囲でランダム生成
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
# bの値を初期値0で作成
b = tf.Variable(tf.zeros([1]))
# y = W * x + bを再現
y = W * x_data + b
### Step3.ロス関数と目標設定を作成 ###
# 予想した結果y - 実際のyのデータ二乗した結果の平均をlossと位置付ける
loss = tf.reduce_mean(tf.square(y - y_data))
# Learning Rateの指定
optimizer = tf.train.GradientDescentOptimizer(0.5)
# lossが最小化する値を目的に置く
train = optimizer.minimize(loss)
### Step4.最適化の実行 ###
# TensorFlowの実行準備
init = tf.initialize_all_variables()
# graphの準備
sess = tf.Session()
sess.run(init)
# 201回の最適化を実行
for step in xrange(201):
sess.run(train)
# 20回毎に途中の値を出力
if step % 20 == 0:
print step, sess.run(W), sess.run(b)
この流れになります。
何の脈略もないのですが自己理解のための簡易解説となります。
登録:
投稿 (Atom)