CakePHP2 – phpQueryを使う

phpQuery
Github:TobiaszCudnik/phpquery
Composer対応したやつ:zomberg/phpquery

使い方

CakePHP3 – Log出力にMonologを使う

Seldaek/monolog

$ composer require monolog/monolog

bootstrap.phpに下記を追加

config/logger.phpに下記を追加

こんな感じで使える。Slackとかに飛ばしたりしたいというときに役立ちそう。

cakeの標準機能でログ出力の調整をする場合は、app.phpのLog設定箇所を変更する。

CakePHPで作られたquickapps/cmsを使ってみる

quickapps/cmsは、CakePHPで作成されたCMSだそうです。ライセンスはGPL-3.0dだそうです。GitHubスターが150個くらい。試しにインストールしてみます。

インストール

$ composer create-project -s dev quickapps/website [website_name]

インストール画面


結構かっこいい。ワードプレスのようなインストール画面でインストール終わったらちゃんと表示された。

ホームページ


フォルダ構成が不思議な感じ。全部プラグイン内で動いてるみたいで、srcフォルダもない。

CakePHP3 – MinifyHtmlプラグイン

WyriHaximus/MinifyHtml

HTMLを圧縮して出力してくれるプラグイン。

インストール

$ composer require wyrihaximus/minify-html

bootstrap.phpに下記を追加。

設定

AppView.phpに下記を追加。

デバッグモードだと圧縮しない。本番モードなら上記だけで圧縮してくれる。

CakePHP3 – whoopsプラグイン

gourmet/whoops

whoopsという、かっこいいエラー画面にしてくれるプラグイン。

$ composer require gourmet/whoops:~1.0

bootstrap.phpの下記ErrorHandlerの箇所を修正する。

修正後

404の場合は変わらないけど、500の場合は、下記のエラー画面に変わった。確かにきれいでわかり易い。

CakePHP3用のよさそうなプラグイン

FriendsOfCake/awesome-cakephp

認証系

FriendsOfCake/Authenticate
CakeDC/users
dereuromark/cakephp-tinyauth
ivanamat/cakephp3-captcha
ADmad/cakephp-jwt-auth
ADmad/CakePHP-HybridAuth

認可系

ivanamat/cakephp3-aclmanager
JcPires/CakePhp3-AclManager
PilOop/cakephp3-auth-acl-bootstrap-adminlte

アップロード系

josegonzalez/cakephp-upload
jrbasso/MeioUpload
davidyell/CakePHP3-Proffer

管理画面系

FriendsOfCake/crud-view
prakashw3expert/cakephp3.0-admin
KarlJakober/CakeAutoAdmin

Bootstrap系

FriendsOfCake/bootstrap-ui

REST API系

CakeDC/cakephp-api
multidots/cakephp-rest-api
hantsy/angularjs-cakephp-sample
Wizehive/cakephp-api-utils
patarkf/cakephp3restapi

グラフ描画系

netusco/CakePhp3-ChartJs
scottharwell/GoogleCharts

ソーシャル系

webtechnick/CakePHP-Facebook-Plugin

画像系

burzum/cakephp-imagine-plugin

検索系

CakeDC/search
FriendsOfCake/search

色々入ってる系

dereuromark/cakephp-tools

CRUD系

FriendsOfCake/crud

カテゴリー・タグ・お気に入り・コメント・評価系

CakeDC/tags
CakeDC/categories
CakeDC/favorites
CakeDC/comments
CakeDC/ratings

CSV系

FriendsOfCake/CakePdf
FriendsOfCake/cakephp-csvview

PDF系

FriendsOfCake/CakePdf

Asset系

markstory/asset_compress

ストレージ系

burzum/cakephp-file-storage

キャッシュ系

ceeram/clear_cache

CMS系

croogo/croogo

チケット管理ツール系

yandod/candycane

Q&Aサイト系

Datawalke/Coordino

WYSIWYG系

CakeDC/TinyMCE

Markdown系

ivanamat/cakephp3-markdown

開発サポート系

josegonzalez/cakephp-mail-preview
ebrigham1/cakephp-error-email

その他

passbolt/passbolt_api
josegonzalez/cakephp-environments
josegonzalez/cakephp-queuesadilla
fheider/cakephp-datatables
scherersoftware/cake-notifications

cakephp3 – DB設定時のTime Zoneエラー

Windows10でXampp使ってcakephp3を動かすとき、DB設定のtimezoneをAsia/Tokyoにすると下記エラーがでた。
General error: 1298 Unknown or incorrect time zone: ‘Asia/Tokyo’

対処法は、ここのとおりやったらできた。

ここから、timezone_2017a_posix_sql.zipをダウンロード・展開して、出てきたsqlファイルをどこかに置く。

そして、下記のようにやる。
$ cd /d/xampp/mysql/bin
$ ./mysql -u root mysql -p < /e/timezone_posix.sql

GCPでUbuntu16・Nginx・PHP7・cakePHP3環境をつくる

Google Cloud Platform(GCP)はAWSのgoogle版です。ここにサービスの説明があります。

Compute Engine

まずプロジェクトを作成する。次に、Compute Engineのコンソールで、VMインスタンスを作成する。ゾーンを日本、マシンタイプをf1-micro、OSをUbuntu16.10で作成してみた。数十秒程度でインスタンスが作成完了し、ブラウザ上でssh接続、ターミナル操作がすぐ可能になった。

マシンタイプの変更方法

参考:vm instanceのMachine type変更方法
IPをスタティックにして、ディスクを削除しないようにしながら、VMインスタンスを削除して、新しくインスタンスをつくるらしい。この間サーバは止まってしまう。でもいずれにしても結構簡単に切替は可能。

ローカル環境でssh接続できるようにする

google cloud SDKをインストールする。インストール完了したら初期設定が動き出すので、ログインしたりゾーン選択したりする。
Compute EngineのVMインスタンスの画面にある、ssh接続用のgcloudコマンドを実行する。これでssh接続できた。

PHPとかNginxとかをインストールする

$ sudo apt-get update
$ sudo apt-get install php
$ php -v
PHP 7.0.15-0ubuntu0.16.10.4 (cli) ( NTS )
$ sudo apt-get install nginx
$ nginx -v
nginx version: nginx/1.10.1 (Ubuntu)
$ sudo apt-get install git vim composer

デフォルトでapache2が入っていて起動されているようだ。
$ sudo systemctl stop apache2
$ sudo systemctl start nginx

Cloud DNS

https://cloud.google.com/dns/quickstart
上記に従って、DNS APIを有効にして、DNSコンソールからドメインを追加する。記載されているネームサーバに合わせて、ドメインのネームサーバを変更して、必要な設定をすると反映される。

Cloud SQL

Google Cloud SQL ドキュメント
Cloud DNSと同様にAPIを有効にしてインスタンスを作成する。Compute Engineから接続するには、ネットワークの承認が必要。下記にやり方が書いてあった。
MySQL クライアントを Compute Engine から接続する

Compute Engineを設定してCakephp3を動かす

$ sudo vim /etc/nginx/sites-available/default

$ sudo systemctl restart nginx
$ cd /var/www/html
$ sudo apt-get install php-fpm php-intl php-mbstring php-zip
$ sudo composer create-project –prefer-dist cakephp/app hoge.com

Compute EngineをCloud SQLにつなぐ

phpmyadminを使う

$ sudo apt-get install mysql-client
$ sudo apt-get install phpmyadmin
$ sudo vim /etc/phpmyadmin/config-db.php

config-db.php

$dbnameがないとエラーになるけど、内容は適当でも大丈夫だった。

$ sudo echo “hoge:$(openssl passwd -apr1 hogepassword)” > /path/to/hogepath
$ sudo chmod 604 /path/to/hogepath
$ sudo vim /etc/nginx/sites-available/default

コマンドラインでmysqlにつなぐ

$ mysql –host=[INSTANCE_IP_ADDR] –user=root -p

cakephp3でmysqlにつなぐ

$ sudo vim /var/www/html/hoge.com/config/app.php
hostをCloud SQLにする。

Let’s EncryptでSSL取得・設定

hoge.comとphpmyadminをhttps接続のみ可能にする。hoge.comにhttpアクセスした場合はhttpsにリダイレクトさせる。

$ sudo apt-get install letsencrypt
$ sudo systemctl stop nginx
$ sudo letsencrypt certonly –standalone -d hoge.com
$ sudo letsencrypt certonly –standalone -d hogehoge.com
$ sudo systemctl start nginx
$ sudo vim /etc/nginx/sites-available/default

$ sudo systemctl restart nginx

Python3 – 対数

Pythonで対数を出すには、math.logを使います。import mathで使えるようになります。

0.30102999566398114

これは、10を何乗したら2になるか?です。log102です。
試しに、10を0.30102999566398114乗してみます。

1.9999999999999998

100の0.5乗は、100の平方根なので10です。

10.0

27の0.3333333333333333333333333333333333333333333乗は、大体27の立方根なので、3に近いはずです。

3.0

おージャスト3.0になった。

2.9999999999999964

3.0

少数15桁までだと2.99…になりますが、16桁にするとジャスト3.0になる。

10を底とする対数を常用対数といいます。

対数関数と指数関数は逆関数の関係にあります。逆関数はy=xに対して対称です。指数関数と対数関数のグラフを書いてみます。
y = axの指数関数と、y = logaxの対数関数を書きます。

numpyを使いたいので、math.logではなくnp.logを使います。aを2として、np.log2を使います。例えばnp.log2(4)とすると2になります。2を底とした4の対数を出しています。

対称なのか全然これじゃ分からない。

対数関数は、
対数が1より小さいとき、
底が1より大きければ、真数は底より小さい。
底が1より小さければ、真数は底より大きくなる。

対数関数を、底の大きさのパターンで2つ書いてみる。

2100の桁数を出すには、常用対数を使います。
log102100 = 100log102 = 100 * 0.30102999566398114 = 30.102999566398114
よって31桁です。10の2乗は100なので3桁です。10の3乗は1000で4桁です。2.1乗は100より大きく、1000より小さいので3桁です。30.10乗は31桁です。

Python3 – xのn乗のグラフ(matplotlibのsubplotとアニメーション)

GIFアニメーション

matplotlibのアニメーション作成は2つ種類があって、ArtistAnimationとFuncAnimationとがある。

参考:matplotlib でアニメーションを作る

ArtistAnimation は、あらかじめ全てのグラフを配列の形で用意しておき、それを1枚ずつ流すというものである。FuncAnimationは予め完成したグラフを渡すのではなく、アニメーションの1フレームごとに関数を実行する。データが巨大すぎる場合や潜在的に無限に続く場合に便利。

ArtistAnimation

ArtistAnimationを使って、xの2乗~10乗のグラフを配列に入れて、アニメーションをつくってみる。

サンプルコード

結果

これだと、10乗のグラフのyが大きすぎて、他がみんな直線みたいになってしまった。

FuncAnimation

FuncAnimationを使ってやってみる。

結果

指数が偶数ならy軸に対称のグラフになり、奇数なら原点に対象のグラフになります。原点に対象っていうのか。

Subplot

matplotlibで複数のグラフを表示したいときにsubplotが使えます。
参考:[Python]Matplotlibで複数のグラフを描画する方法

サンプルコード

結果

Python3 – 変数のスコープについて

下記コードのとき結果は1と表示されます。

下記コードのときエラーになります。

UnboundLocalError: local variable ‘n’ referenced before assignment

参考:なぜ変数に値があるのに UnboundLocalError が出るのですか?

これは、あるスコープの中で変数に代入を行うとき、その変数はそのスコープに対してローカルになり、外のスコープにある同じ名前の変数を隠すからです。foo の最後の文が x に新しい値を代入しているので、コンパイラはこれをローカル変数であると認識します。その結果、先の print(x) が初期化されていないローカル変数を表示しようとして結果はエラーとなります。

globalだよと宣言すると大丈夫になります。

ネストされたスコープだと、nonlocalが使えます。

Python3 – matplotlibでアニメーションGIFをつくる

matplotlib.animatioを使うとアニメーションがつくれます。自分の環境ではgifで保存しようとしたら、imagemagickがなくてエラーになりました。imagemagickのインストールとかはここに書いてありました。

Imagemagick

http://www.imagemagick.org/script/binary-releases.php#windows

Imagemagickのパスをmatplotlibに設定する必要がある。下記のようにするとmatplotlibが見ている設定ファイルの場所がわかる。

自分はユーザディレクトリ内のAnaconda3の中の下記だった。

matplotlibrcの最後の行らへんに、下記行があるので、ここにImagemagickのパスを入れる。

コメントを外して、下記のように入力します。入力の際、パスを「’」で囲むと下記のようなエラーになります。


C:\Users\hoge\Anaconda3\lib\site-packages\matplotlib\animation.py:782: UserWarning: MovieWriter imagemagick unavailable
warnings.warn(“MovieWriter %s unavailable” % writer)
Traceback (most recent call last):
File “C:/Users/hoge/hoge.py”, line 15, in
ani.save(‘sample.gif’, writer=’imagemagick’)
File “C:\Users\hoge\Anaconda3\lib\site-packages\matplotlib\animation.py”, line 810, in save
writer.grab_frame(**savefig_kwargs)
File “C:\Users\hoge\Anaconda3\lib\contextlib.py”, line 66, in __exit__
next(self.gen)
File “C:\Users\hoge\Anaconda3\lib\site-packages\matplotlib\animation.py”, line 196, in saving
self.finish()
File “C:\Users\hoge\Anaconda3\lib\site-packages\matplotlib\animation.py”, line 389, in finish
+ ‘ Try running with –verbose-debug’)
RuntimeError: Error creating movie, return code: 1 Try running with –verbose-debug

サンプルコード

Python3 – 素因数分解

素因数分解

正の整数 n を素因数分解するための最も単純な方法は、2 から順に √n までの素数で割っていく方法である(Trial division(英語版))。しかし、n が大きくなると、この方法では困難である。

結果
[3, 79, 519507173]

参考:Python Finding Prime Factors

Python3 – timeitを使ってコマンドライン上で関数の実行速度を計る

コマンドラインで実行できるので、プログラムに計測用のコードを書かなくてよくて便利。

timeit — 小さなコード断片の実行時間計測

計測方法

自分の環境だと、実行したいpythonファイル(hoge.py)がおいてあるディレクトリで、下記のようにやると動きます。(hoge.pyのtest関数の実行速度を計測したい場合)

計測結果の見方

試しに、ここで作成した素数を出すコードの速度を計測してみます。ファイル名は、eratos.pyです。

結果

結果の見方がややこしい。
参考:ライブラリ:timeit

-nは、1試行あたりの実行回数。-rは試行回数らしい。下記のように指定できる。

上記の場合は、処理を10回連続で実行したときの時間を5回計測し、そのうちの最小時間を返してくれているらしい。デフォルトだと連続で100回実行して、ランダムなタイミング(?)で3回だけ時間を計測して、3回のうち一番時間が短かった結果を返してくれているということかな?まあ何しろこれで実行時間が簡単に計測できるので便利です。

時間の単位は、下記になります。

単位名 単位
ナノ秒 1,000,000,000 nsec(ns) 10の-9乗 s
マイクロ秒 1,000,000 usec(µs) 10の-6乗 s
ミリ秒 1,000 msec(ms) 10の-3乗 s
1 sec(s) 1s

Python3 – 素数

エラトステネスの篩

エラトステネスの篩

結果
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]

参考:素数と仲良しになる3つのプログラム

フェルマーの小定理

フェルマーの小定理で素数か判定できる。

Pythonを使って高速素数判定をしてみる」に詳しく書いてあった。フェルマーテストというので出せるけど、素数じゃないものも出しちゃう可能性があって、より高性能な方法がある。それもこのサイトに書いてある。