ページ

2023年1月15日日曜日

サイトの移動

記事を移動しました。 https://www.keydrop.net Laravel9など記事は新規サイトにて記載

2017年8月20日日曜日

Mac Sierraでapache +PHP5.6をPHP7.1を利用する手順

PHP5.6=>PHP7.1をMac Sierraで利用するための手順


名称概要
実行日2017/08/20
OSMacOS Sierra
Apache2.4.27
BrewHomebrew 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というサービスを利用して対応してみましたが以下の理由で対応しました。他に良いものもあるかもしれないですが自分の中ではこれが一番しっくりきました。
無料で利用できる
非SSLで利用可能
Mac & Windows系の主要ブラウザ対応(iOSは非対応)
早速検証環境を羅列
環境 概要
2017/08/19日検証
プッシュサービス OneSignal
Webサーバ macOS Sierra上にapache(Apache/2.4.25)
ホスト http://localhost/~{ユーザ名}/
基本的にMacを触っていれば初期状態?で利用できるものを前提にしてみました。
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を指定


まずは 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();
  1. 少し複雑な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を呼び出すのが
少し面倒だったのでまとめ

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をインストールし実施


  • 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ステップで最急降下法を実現しています。


# おまじない
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)


この流れになります。
何の脈略もないのですが自己理解のための簡易解説となります。