パスワードに使うと混乱するアルファベッドと数字
パスワードを「ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789」からランダムに生成すると、表示上とてもよく似てるアルファベッドがあります。フォントによっては区別するように出来ていますが、標準フォントなどでは区別つきにくい場合が多いです。それらの文字はタイプミスを起こして混乱しやすいので、とても似ている文字はどちらか片方だけを使うとか、どちらも使わないというのがあります。で、とても似ている文字一覧という名のメモ。たまに更新する。
- | - | - | 例 | - |
S(大文字「S」) | 5(数字5) | - | S5S5SSSS5 | |
O(大文字「O」) | 0(数字0) | - | O0O0OOO0 | |
I(大文字「I」) | l (小文字「 l」) | 1(数字「1」) | I1lI1l1l1lllI1lIl | |
b(小文字「b」) | 6 (数字6) | - | b6b6b6bb6bb6 | 案外ほとんどのフォントで見分けられる |
D(大文字「D」) | O(大文字「O」) | - | DODODOOODOD | 案外(ry |
PHP53/PHP55比較メモ
switch と 連想配列の取り出し、どっちが速いか気になったので比較してみた。
PHP5.5 での比較
$ /usr/local/Cellar/php55/5.5.4/bin/php switch_or_array.php start arr ... Finish: 8.5129861831665 start sw ... Finish: 5.0694410800934
PHP5.3 での比較
$ /usr/local/Cellar/php53/5.3.27/bin/php switch_or_array.php start arr ... Finish: 10.038110971451 start sw ... Finish: 6.0564711093903
まぁこんなことになりましたよっと。
Django + Uwsgi + nginx in CentOS6
なんか uWSGI が(私の中で)はやりっぽいので使ってみる。久しぶりに Django で遊びたくなったし。
要は WSGI だけど、それを Cで書いて速くした感じ?
いろいろな機能があるみたい。
設定がLDAPから取れたりクラスタリングとか複数インスタンスの管理とかRPCのサポートとかメモリー内ストレージとかUDPでロギングとか。
VirtualEnv 対応してるみたい。
よくわからん。
SakuraVPS の無料券もろたのでやってみる。せっかくだしね。
で、初めは標準の python2.6 でやってたけど、 thread に対応してないのと開発環境がPython2.7でやっちゃったので、threadに対応した python2.7 を作ってやる。でもこれやっても「*** Python threads support is disabled. You can enable it with --enable-threads ***」と言われる。解せぬ。
1. Python のインストール先は `/opt/local`
2. 作ったアプリケーションのインストール先は `/srv/www`
3. virtualenv の先は `/srv/www/py27`
先に断っておくと、shell の実行で先頭が「$」のは一般ユーザ、先頭が「#」が チャーリールート です。
必要なのを入れておく
忘れないように。git いります。
$ sudo mkdir -p /opt/local /srv/www $ sudo chgrp wheel /opt/local /srv/www $ sudo yum install git $ sudo yum install libxml2-devel libxml2-python
Python2.7 のインストール
$ yum install mysql mysql-server mysql-devel $ curl -O http://python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2 $ tar jxf Python-2.7.5.tar.bz2 $ cd Python $ ./configure --with-thread --enable-shared --prefix=/opt/local $ make -j2 $ sudo make install
でこれだと、libpython2.7.so.1.0 がねーぞksと言われて動かんので対応させる。
# echo '/opt/local/lib' > /etc/ld.so.conf.d/python-2.7.conf # ldconfig
setuptools 入れて、pip入れて、virtualenv を入れて、環境汚染がないように venv で作業環境を作って、その中にdjangoやuwsgiを入れる。
# wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | /opt/local/bin/python # /opt/local/bin/easy_install setuptools # /opt/local/bin/easy_install pip # /opt/local/bin/pip install virtualenv # cd /srv/www # virtualenv --distribute --no-site-packages --python=/opt/local/bin/python py27 # source py27/bin/activate (py27)# pip install MySQL-python uwsgi django
ここまで出来たら、MySQLとDjangoの設定する。ここでは割合。
ハマったところだけメモ。Django の MEDIA_ROOT 及び TEMPLATE_PATH を `os.path.abspath("./template") ` にしていたのを絶対パスで指定。
次にフロントエンド側。何かと使う機会がなかった Nginxを使ってみる
# yum install nginx
アプリの設定
今回は趣味でやったものだから github(https://github.com/a-yasui/djangoTest) に投下済。起動スクリプトや、nginxの設定、uwsgiの設定も入ってるよ☆
- uwsgi: uwsgiのLinux用起動スクリプト
- uwsgi_http.ini: uwsig の設定ファイル
- uwsgi.conf: nginx の設定ファイル
以下に各ファイルの設定方法など。
uwsgi
uwsgi は init.d に置くスクリプトです。環境によっては中の変数などは変えてください。
# cp uwsgi /etc/init.d/ # chmod +x /etc/init.d/uwsgi # chkconfig --levels 235 uwsgi on # service uwsgi start
uwsgi.conf
Nginx の設定ファイルです。同上
SERVER_DOMAIN および IPADDRESS にはそれぞれ適切な値を。
# cp uwsgi.conf /etc/nginx/conf.d/ # service nginx restart
uwsgi_http.ini
uwsgi の設定ファイル。SERVER_DOMAIN には適切な値を入れてください。そして、uwsgi にある変数「UWSGI_VASSALS」で指定しているパス上に置いてください。
django/tonbo/tonbo/settings.py
django の設定。django/tonbo/tonbo/settings.py.default を django/tonbo/tonbo/settings.py にコピーして、django/tonbo/tonbo/settings.py の中身を編集。
編集する変数
1. ADMINS: (名前, メールアドレス)のタプルにする。エラーなどが起きた時に飛んでくる。
2. ALLOWED_HOSTS: ホスト名を入れてください。サブドメインとかもここで追加するみたい。
3. TIME_ZONE, LANGUAGE_CODE: お国に合わせてください
4. MEDIA_ROOT: この場合だと、 /srv/www/djangoTest/django/tonbo/media
5. STATIC_ROOT: この場合だと、 /srv/www/djangoTest/django/tonbo/static
6. TEMPLATE_DIRS: この場合だと、 /srv/www/djangoTest/django/tonbo/template
最後に
最後に忘れないようにやっておく。
MySQL のユーザ作成とパスワードと、データベースの設定。データベース作成時に文字コードの指定忘れてたら、どこぞの誰かみたいに友人知り合いに見してバグってやがるwwwと言われて泣きをみる。私だけど。
(py27)$ mysql -uroot -p… > grant usage on *.* to django@localhost identified by '…'; > create database django_db default character set utf8; > grant all on django_db.* django@localhost; > flush privileges; > ^D (py27)$ python ./manage.py syncdb (py27)$ python ./manage.py collectstatic
こんな感じ。
nginx でキャッシュさせるようにしてなかったり色々アレなのは今後の課題。
Ex: 参考一覧
https://gist.github.com/jniltinho/5565617
http://d.hatena.ne.jp/paraches/20120321/1332307423
http://uwsgi-docs.readthedocs.org/en/latest/Install.html
http://taichino.com/engineer-life/linux/2170
http://d.hatena.ne.jp/m-hiyama/20120312/1331513519
Vagnrat入れてVirutalBox入れて挫折したメモ
タイトル通り。わっちのマシン(MBA Mid 2011, 11-inch, メモリー2G)ではキツイ。開けてメモリー追加するのも怖いので、新しいの買うまでVMはお蔵行きかなぁ
1. vagrant init
とりあえずこのコマンドで、 Vagrantfile が作られるのでそこに追加してく感じでやった。
2. vagrantbox
VM のイメージ。VagrantBoxes(http://www.vagrantbox.es)にあるのを使ったらいいみたい。
3. chef-solo
なんか Vagrantfile のあるディレクトリに、 myrecipes というディレクトリを作って、その下に default.rb を作って書いてきゃいいみたい。よくわからんけど。
参考
http://www.engineyard.co.jp/blog/2013/chef-and-vagrant-gives-you-next-dev/
http://qiita.com/rasenn/items/5bd59ea051c8f040c9f4
CakePHP2 で Mock
AuthComponent でどうやって Mock を書くんだろうと今頃になって理解できたのでメモ書き
<?php class AdminsControllerTest extends ControllerTestCase { public function setUp() { parent::setUp(); $Admins = $this->generate('Admins', array('components' => 'Auth')); $Admins->constructClasses(); // 認証まわりをセッションを使わずに mock でごまかす $Admins->Auth->expects($this->any()) ->method('user') ->will($this->returnValue(array( 'id' => '10', 'mail' => 'a.yasui+10@gmail.com', 'pass' => '<これを知った所で誰も幸せにならない>', 'created' => '2013-02-28 16:24:35', 'modified' => '2013-02-28 16:26:11' ))); $Admins->Auth->expects($this->any()) ->method('id') ->will($this->returnValue(10)); } }
こうやったればいいらしい
Laravel で OAuth ログインをやる
自作webサイトにて、TwitterやFacebookのアカウントでログインする機能を付ける方法
手っ取り早いのが one-auth を使う。けど、ドキュメントがちょっとわかりにくくて、結局はよく知らん人が Youtube にアップロードしたTutorial 動画 http://www.youtube.com/watch?v=xlUFiZhwFiE を見た。
インストール
インストールは簡単。トップディレクトリにて下記のコマンド
$ php artisan bundle:install oneauth $ php artisan migrate
次に oneauth bundle を application/bundles.php へ使うと宣言。とりあえず初期状態から始めたらこんな感じになるはず。
<?php return array( 'docs' => array('handles' => 'docs'), 'oneauth' => array('auto' => true), );
使用例 〜サービスのID などを設定。
各サービス種設定をします。必要最低限でいい。
bundles/oneauth/config/api.php
<?php return array( 'facebook' => array( 'id' => '', // Application ID 'secret' => '', // Secret 'scope' => 'email', // Scope, Email情報を取るとかそんなの ), 'twitter' => array( 'key' => '', // Consumer key 'secret' => '', // Consumer Secret ), // ... その他もろもろ );
callback などそこら辺のURLを設定
<?php return array( 'registration' => 'user/social_register', 'login' => 'user/social_login', 'callback' => 'connect/callback', 'registered' => '/', 'logged_in' => '/', );
この場合だと、
1. 初期登録は http://localhost/index.php/user/social_register
2. ログインは http://localhost/index.php/user/social_login
3. 各サービスからリターンされてきた時に受け取るURL http://localhost/index.php/connect/callback
になりますよ。そんなわけで、Twitter などで使用する場合、Callback URL は http://
使用例 〜 データベースのスキーマなど
こんな感じ。ここで重要なのは、provider_name, social_uid の2つが必須
CREATE TABLE `provider` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `provider_name` varchar(10) NOT NULL DEFAULT '', `social_uid` bigint(11) NOT NULL, `created_at` datetime NOT NULL, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `provider_social_uid_idx` (`social_uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
使用例 〜 ユーザ側を作成
application/routes.php に下記の一行を頭のほうに追加。意味はわかるよね…
<?php Route::controller(Controller::detect());
魔法のコントローラファイルを作成。よくわからんけど、callbackの時に使うっぽい
application/controller/connect.php
<?php class Connect_Controller extends OneAuth\Auth\Controller {}
リダイレクトされてきて、認証などが成功した時にする処理を書きますよっと。
application/controller/user.php
<?php class User_Controller extends OneAuth\Auth\Controller { public function action_term () { return View::make("user.term"); } public function action_social_login() { $user_data = Session::get('oneauth'); // ユーザデータ取得 $provider = Provider::where_provider_name($user_data['provider']) ->where_social_uid($user_data["info"]["uid"])->first(); // 削除 Session::forget('user_data'); // ログインできたかで移動先変更 if (!is_null($provider)) { Auth::login($provider->id, true); return Redirect::to('user/terms'); } return Redirect::to('/'); } public function action_social_register () { $user_data = Session::get("oneauth"); // ユーザデータ取得 $provider = Provider::where_provider_name($user_data['provider']) ->where_social_uid($user_data["info"]["uid"])->first(); if (!is_null($provider)) { Auth::login($provider->id, true); return Redirect::to('user/terms'); } $provider = new Provider; $provider->social_uid = $user_data["info"]["uid"]; $provider->name = $user_data["provider"]; // プロバイダー情報を保存 $provider->save(); Auth::login($provider->id, true); // 削除 Session::forget('user_data'); return Redirect::to('user/terms')->with( 'success', 'welcome! Thank you to join the slide :)'); } }
後はテンプレート
「Connect to Twitter」とかリンクはこんな感じのタグを埋め込んで
<div>{{ HTML::link('connect/session/twitter', 'Login with Twitter', array('class' => "btn")) }}</div> <div>{{ HTML::link('connect/session/facebook', 'Login with Facebook', array('class' => "btn")) }}</div>
やればよし。
ログインの後は、 /user/term に飛ぶのでその簡単なテンプレを用意してやればヨロシ。
application/view/user/term.blade.php
<html> <head><title>Welcome!</title></head> <body>Welcome :) </body> </html>
Laravel のメモ書き
メモ書き Laravel PHP
1. 基本的にMVC
2. 少しいじったけど、突貫物から中規模物に向いてる感じっぽい
3. /controller/action/arg1/arg2 とかできるけど、ルータで自分で独自のを仕向ける事が前提、最悪ルータに無名関数でアクションを書くことも出来るのがミソ。
4. routes.php には、配列などに納めて書くのではなく、ベタ書き。
routes.php の感じ
<?php Route::get('/', function() { return View::make('home.index'); });
ルート(/)アクセスは、applications/views/home/index.blade.php を見る。home.index でそういう意味になるっぽい
<?php Route::get('t/(:any?)', array('uses' => 'item@top'));
applications/controllers/item.php にある Item_Controller の action_top を呼び出す。
呼び出された item.php は View のインスタンスを返したらいいっぽい。
<?php /* applications/controllers/item.php */ class Item_Controller extends Base_Controller { public function action_top(){ $query = Item::where("name", "=", URI::segment(2)); if ((int)($query->count()) === 0) return Response::error('404'); $books = $query->get(); // name にはpath_info を、items にはDBにある情報を Item/top.blade.php に渡す $result = View::make('Item.top') ->with("name", URI::segment(2)) ->with("items", $items); return $result; } }
Item クラスは applications/models/Item.php にある。これでDBの情報取れる。楽。対多など関連性を持たせるには、関数作って、中で return $this->belong_to("hoge"); とかやるっぽい。
<?php /* applications/models/Item.php */ class Item extends Eloquent { public static $table = 'items'; }
テンプレートタグは blade と言われているのを使うっぽい。独自+PHPを実行する、みたいな?