2016年9月24日土曜日

Phalcon を使ってみた

Phalconは「A full-stack PHP framework delivered as a C-extension」というフレームワークです。
ベンチマークで超絶速度(PHPフレームワークにおいて)をたたき出すポテンシャルを持っています。
Phalcon 公式はこちら

Phalcon、PHPビルトインサーバーでも動作するってよ

Phalconの公式ドキュメントはかなり詳細なことまで書かれています。
もちろん、サーバー設定方法まで丁寧に記載されています。
で、PHP5.4から搭載されたPHPビルトインサーバーの設定も書かれていました。
PHP ビルトインサーバーの利用
この設定は .htrouter.php というファイル(.htaccess的なもの)で、これを行わないとPhalconのデフォルトと同一の設定になりません。
 
<?php
if (!file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    $_GET['_url'] = $_SERVER['REQUEST_URI'];
}
return false;
 
このファイルを使用してサーバーを起動
php -S localhost:8000 -t /public .htrouter.php
これで.htrouter.phpを使用してサーバーへアクセするようになります。

ところがどっこい

さて、これを使用していたもののタイトル通りにここではまってしまいました。
例えばGETにクエリ(パラメーター、Query String…等呼ばれ方はいろいろ)を付与し “/foo/bar?baz=qux” というURLへアクセスすると、ルーティングが上手く動作しなくなります。
変数などをダンプしてみると、
“bar?baz=qux” という文字列がルーティングの判定時に使われています。
本来この時点で取得しなければいけないのは “bar” という文字列だけです。
Phalconのルーティングは、ControllerクラスのActionと呼ばれる関数を使用して動的に呼び出しています。
上記の場合、bar?baz=quxAction()みたいな呼ばれ方をしてしまうということです。
本当はbarAction()を呼ばなければならない。

ならば正せばいい

実際のところ、このことが全く分からず(むしろ勝手にクエリストリングが分割されると思い込んでいたのも問題だった)、1日ハマって見つけたサイトがこちら。
Route not matches URI with querystring · Issue #379 · phalcon/cphalcon
ハイ、公式のgithubのissuesでした。
このissueを読んで上記のルーティングの仕組みをやっと理解。
出来上がった .htrouter.php はこちら
 
<?php
if (!file_exists(__DIR__ . '/' . $_SERVER['REQUEST_URI'])) {
    if (!empty($_SERVER['REQUEST_URI'])) {
       $uriParts = explode('?', $_SERVER['REQUEST_URI']);
       $uri = $uriParts[0];
    } else {
       $uri = '/';
    }
    $_GET['_url'] = $uri;
}

return false;

このポイントの記事が全く見つからず、きっとPHP ビルトインサーバーをみんなが使ってないだけ俺の知識が浅いんじゃないうんきっとそうに違いない。と自己弁護しつつPhalconライフをお楽しみたいと思います。
追伸: 実はvar_dumpで$_GETとかを見ていればヒントがあった。困ったときはvar_dump。

2016年8月14日日曜日

systemd-nspawnを使ってみた

使ってみた

当初は conoha に立てた Arch Linux へ Docker をインストールして、そこでredisとかnginxとかを動かそうかと調べていた。
しかし、systemdが動いてるなら systemd-nspawn なるコンテナ型仮想化システムがいい感じだと風の噂で聞いたのでこちらを試すことにした。

習うより慣れてみる

コンテナ化の知識は全くなく、Dockerでさえどうやって使うのかさえ分からなかった。
自分で構築したことでそれなりに理解出来た…気がする。
以下はとりあえず、Arch Linux のsystemd-nspawn の解説をかいつまんで進行します。
ぶっちゃけちゃると、今回の記事の情報はArchWikiに全部載ってます。
ArcyWikiは、Linuxに関する基本的なところから充実の内容なのでビギナーの方からでもお勧めです。

コンテナの作成

mkdir ~/MyContainer
pacstrap -i -c -d ~/MyContainer base

コンテナの手動起動

systemd-nspawn -bD ~/MyContainer -n
-bDn という感じで書くとエラーで起動しないです。
-nはホストのネットワークを共有になります。127.0.0.1を使ってコンテナへもネットワーク接続出来るということになります。

コンテナのサービス起動

systemctl enable machines.target
mv ~/MyContainer /var/lib/machines/MyContainer
systemctl enable systemd-nspawn@MyContainer.service
systemctl start systemd-nspawn@MyContainer.service

トラブルシューティング

ログインが出来ない

arch-nspawn login: root
Login incorrect
こう出たときはコンテナのディレクトリ上にある /etc/securetty のターミナル名のリストに pts/0 を追加。このファイルはホストから開く(どっちにしてもログインできないので)。
ホストとRedisコンテナとuwsgiコンテナをProxyで繋いだりしたのでそこら辺も書く予定。

2016年7月29日金曜日

サイト移行中。

独自ドメイン+WPのブログへデザインのHTMLを直しながら地道に移転中だったりします。

http://blog.dstribe.net/

2016年7月18日月曜日

ST3 日本語環境向けプラグイン MultibyteWordSeparators の解説

MultibyteWordSeparators とは?

Sublime Text 3 向けのマルチバイト文字列に対応した単語移動をサポートするパッケージです。
github:SublimeMultibyteWordSeparators
※ 5/1現在Package Controlに登録申請中のため、インストールは手動になります。
※ 5/4にPackage Controlに取り込まれました。

日本語に対応しているエディタの場合、単語移動でカーソル移動すると漢字・ひらがな・カタカナ・英数字を判別し、単語らしきところでカーソルが止まるようになっています。

Sublime Text 3 は、日本語を単語移動しようとすると2byte文字列が判別できず、一つの単語として移動してしまいます。

そこで単語移動出来るように MultibyteWordSeparators を作成しました。

どうやってるの?

漢字・ひらがな・カタカナ・英語・数字・記号のグループを作成し、片っ端から正規表現で引っかけています。

次に、カーソルの位置が漢字であればそれを主とし、主となる文字種から変わるまでカーソルを移動させ続けます。

例えば、ひらがなと同じリストに数字を入れればひらがなと同じ種別と判別され、移動もひらがなと数字は一緒に移動されます。

つまり、厳密には”単語”移動ではないです。

形態素解析は使わなかったの?

そういうわけで、形態素解析は使っていません。
実際のところ、開発時に形態素解析が手軽に使えることを知らなかった、という理由もあったり無かった……。

ちょっと形態素解析の場合について考えてみたけど、現在のカーソル位置から前後の文章をある程度チェックする手間、カーソル位置がその文書のどこに当たるのかをそれぞれチェックする必要がありそうで、逆に手間かも……。

個人的には現在のやり方がベターな気がしてます。

日本語の単語移動の件は困ってる方も結構いるようだったので、このプラグインが一助になればいいなと思いを込めての宣伝でした。

5/9 ver1.1.0 へアップデート

マウスでのダブルクリックでの単語選択に対応
マウスでダブルクリックを行った際、マウスカーソルの下にある文字を検出して単語を選択する機能を追加

以上。

2016年7月12日火曜日

ST3 日本語環境向けプラグイン ConvertFullHalfWidth の解説

ConvertFullHalfWidth とは?

Sublime Text 3 向けのカタカナ・アルファベット・数字を全角半角文字に変換するプラグインです。
github:SublimeConvertFullHalfWidth
※ 以前はConvertZenHanという名称で公開していましたが、同じような名前のプラグインがすでに公開されていたので変更しました。
なお、変換にはPyPIで公開されている jaconv を使用しています。

どうやってるの?

選択文字列とどの文字を変換対象にするかのフラグをプラグインのコマンドに渡し、フラグに従ってjacnonvに文字列を渡すだけ!

今後の追加予定

jaconvにはひらがな→カタカナ、カタカナ→ひらがなの変換もあるのでこの変換も出来るように実装予定。

/** 「もう仕事としてはガラケー特化のサイトなんて作らないよねー」っと思ってたらドンピシャでスマホサイトをガラケー向けに作り変えるお仕事来てプラグイン大勝利で震えたのはいい思い出。 */

以上。

2016年3月22日火曜日

EditorConfigを使い始めたらプログラマー世界の繋がりを感じた。

開発界隈では自分のエディター設定をプロジェクトのコーディング規約に合わせる作業ってのがあります(コーディング規約が無い場合も多々あるが)。

そこでこのEditorConfig (http://editorconfig.org/) をお勧め。
これを使ってみたんだけど、プログラマーの世界って繋がってるなぁ、って思っちゃったり。そんな大層なことじゃないかも知れないけれど。

# editorconfig.org
root = true

[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
max_line_length = 80

[*.py]
max_line_length = 79

[*.{rb,js}]
indent_size = 2

2015年10月4日日曜日

Sublime Text 3 のPHP系プラグイン覚え書き

自分が使用しているSublime Text 3 のプラグインでPackage Control でインストールする以外で必要な作業をまとめ。
随時追加していく予定。

Composer

PHP界隈では必須になりつつあるPEARに変わるライブラリ管理ツール。
/** Sublime Text とは関係ないけど、PHPerは使用できるようにしておいた方がいいです。 */
  1. インストール
    公式サイト: https://getcomposer.org/
  2. 下記パスを環境変数に追加。
    ※追加しないとcomposerでインストールしたものがパス無しで実行できない
    %USERPROFILE%\AppData\Roaming\Composer\vendor\bin
  3. Composerはそのままだとけっこう遅いので国内ミラーサーバーを設定
    参考: http://qiita.com/Hiraku/items/51961aa49f7a2922011d
    登録するコマンドは下記
    composer config -g repositories.packagist composer http://packagist.jp
  4. 完了

SublimeLinter

SublimeLinter-phpcs

コマンドラインツールのPHP Codesinifferを使用するとコーディング規約をチェックしてエラーを表示してくれる
  1. コマンドラインツールのインストール
    composer global require squizlabs/php_codesniffer=*

SublimeLinter-phpmd

コマンドラインツールのPHP Mess Detectorを使用するとプログラムで怪しいところをチェックしてエラーを表示してくれる
  1. コマンドラインツールのインストール
    composer global require phpmd/phpmd=*

2015年6月23日火曜日

SSH Foward Agentの設定

gitへのFoward Agent介してやろうと思った時に、次回もあっさりいけるようにメモっとく。

SSH Foward Agent設定

  1. $ vi /etc/ssh/sshd_config
  2. AllowAgentForwarding を探す
  3. 無ければ項目ごと追加で下記のように設定
    AllowAgentForwarding yes
  4. wq してvi終了
  5. $ service ssh restart
  6. 完了

ついでに

.ssh/config設定

  1. $ vi ~/.ssh/config
  2. 下記を設定
    Host github.com
      ForwardAgent yes
  3. wq してvi終了
  4. 完了

2015年6月21日日曜日

Windows なのか Ruby なのか…

Windows + Ruby だと unicorn が使えないとかアレが使えないとか制限多すぎてRubyとWindowsに嫌気がさしてきた(;´Д`)

2015年4月12日日曜日

ubuntuのキー配列

ubuntuで一部のキーが押せなかったのでその対処法。

日本語配列に変更

$ sudo dpkg-reconfigure keyboard-configuration

GUIの設定画面が立ち上がったら

標準国際105キー(国際)PC→日本語→日本語→キーボード配置のデフォルト→コンポーズキー無し

これで大丈夫そう。

やっとvirtualboxのUbuntuをとりあえずメイン代わりに使えるようになる気がする。

2015年3月12日木曜日

Windows 7(64bit) + MinGW(64bit) + msys

とある開発でruby gemを使おうと思っていたところ、どうにもこうにもMinGWでのBuildが必要になったので導入した話。
Rubyでgemとか使うならとりあえず入れておいて損はないはず。
シェルアプリのminttyについても記載していますが、実際のbuildには関係ないです。

MingGW(64bit) インストール

  1.  x86_64-4.9.2-release-posix-seh-rt_v3-rev0.7z をDL
  2. C:\MinGW64\ 配下に展開
  3. Windowsの環境設定へ C:\MinGW64\bin を追加

msys インストール

  1. mingw-get-setup.exe をDL
  2. C:/MinGW64 をインストール先としてインストール
  3. コマンドプロンプトで
    C:\MinGW64\bin\mingw-get install msys-base msys-mintty
    でインストール

Unix的なシェル mintty の使用設定

  1. ショートカットを新規で作成
  2. ショートカットのパスはひとまず
    C:\MinGW64\msys\1.0\bin\mintty.exe -
  3. ランチャーに登録するなりピン止めするなり。

mintty 対話対応

minttyはアプリケーションの対話型に対応していないため、winptyなるアプリケーションを導入。対話型に対応できるようになります。
  1.  https://github.com/rprichard/winpty/downloads/ から winpty-0.1.1-msys.zip をダウンロード
  2. C:\mingw64\msys\1.0\bin\配下にzip内のファイルを全部入れる
  3. minttyの起動用ショートカットの引数を下記に
    /usr/bin/console /usr/bin/bash --login -i
※minttyで設定している /usr/bin/ というパスは、C:\mingw64\msys\1.0\bin\ のことを指してる。 

2015年2月28日土曜日

カラーテーマの base16 eightiesのRGB値

最近乗り換えた sublime textの theme の base16。

※参考リンク
Base16
Base16 Color Schemes - Packages - Package Control

以前から愛用していたZenburnと同じような低コントラストのeighties(dark)を使用。
こちらの方がちょっとくっきり見える(気がする)。


RGB値が必要だったけど、ちょっと探しても見当たらなかったのでメモがてらに。

Windowsで愛用のターミナルアプリRLoginのカラーテーブルとして貼っておきます。

Screen.ColorTable=[[45,45,45],[57,57,57],[81,81,81],[116,115,105],[160,159,147],[211,208,200],[232,230,223],[242,240,236],[242,119,122],[249,145,87],[255,204,102],[153,204,153],[102,204,204],[102,153,204],[204,153,204],[210,123,83]];

2015年1月25日日曜日

情報収集はRSSリーダーが最高な気がしてる。

キュレーションサービスはGunosyとかいろいろやってみたけど、やはり自分にはRSSが一番な気がする。
以下RSSを使っているシンプルな4つの理由。

  1. 興味のあるジャンルだけを引っ張ってくる
    当然ながらRSSは、自分が欲しい情報だけを登録しているのであまり無駄な情報が無い。
  2. スマホアプリがこなれていてだいたい高速動作
    自分が使っているAndroidアプリのgReader (Play Store: gReader) が最高という理由でもあるかもしれない。以下が使用している理由。
    • 画像をDLしない
    • wi-fiの時だけキャッシュ用データをDLする
    • 本文のみをシンプルに表示する(表とかも消えてたりするけど)
  3.  Feedに登録するのが面倒
    "手軽"ってことは、不要なものさえ不要と思わなくなってしまう。

    その点、RSSリーダーはFeedを登録する手間がある。
    本当に必要なサイトだけを定点観測する気にならないと登録しない。
    ちなみにRSSを管理しているのはFeedly。

    /** 金持ちと言われている人たちが真の金持ちになれないのは、カードなんかで容易に不要なものを大量に買ってしまうからだ */
  4. MVNO回線に優しい
    2.の gReader の
    • 画像をDLしない
    • wi-fiの時だけキャッシュ用データをDLする
    この点が本当にありがたい。
    とはいえ、IIJmioの最低2GB~になってくれたおかげで、多少画像があっても問題ないけど。

流行のキュレーションサービスもいいけど、見たい情報だけを見られる旧き良きRSSもたまには思い出してあげてください…。

2013年12月16日月曜日

Sublime Text 3 対応プラグイン MoveMultiByteWord

Sublime Text 3向けのマルチバイト文字列に対応した単語移動をサポートするパッケージ MoveMultiByteWord を絶賛公開中!
あなたの Sublime Text 3 の環境がちょっとだけ日本語に優しくなります。
https://bitbucket.org/dat/movemultibyteword

2013年12月7日土曜日

Sublime Text 3 のCtagsプラグイン改造

Sublime Text 3で搭載された関数ジャンプ(GoTo Definition)のクイックパネルはファイルパスで絞り込みが出来て便利。
そんなわけでCTagsプラグインのクイックパネルもファイルパスで絞り込みできるように改造した。
このオプションは探したけど無かった…無いよね?

CTagsのプラグインはコチラ: https://github.com/SublimeText/CTags

--- 改造前ctagsplugin.py Sat Dec 07 01:13:05 2013
+++ 改造後ctagsplugin.py Thu Dec 05 12:41:29 2013
@@ -371,7 +371,7 @@
 """Formatting helper functions"""
 
 
-def format_tag_for_quickopen(tag, show_path=True):
+def format_tag_for_quickopen(tag, show_path=False):
     """Format a tag for use in quickopen panel.
 
     :param tag: tag to display in quickopen
@@ -389,9 +389,9 @@
             f += string.Template(
                 '    %($field)s$punct%(symbol)s').substitute(locals())
 
-    format = [(f or tag.symbol) % tag, tag.ex_command]
-    format[1] = format[1].strip()
-
+    # format = [(f or tag.symbol) % tag, tag.ex_command]
+    # format[1] = format[1].strip()
+    format = tag.filename
     if show_path:
         format.insert(1, tag.filename)


こんな感じに該当箇所を書き換えると変更できます。
コメントアウトは念のため残しているだけなので消しちゃってもいいと思います。 この改造はたぶんST2でも使えるんじゃないかな。

2013年8月11日日曜日

phpのvar_dumpでデバッグを分かりやすくするテンプレート

var_dump('ExecFile: '.basename(__FILE__).'('.__LINE__.')', 'FUNCTION: '.__FUNCTION__, 変数名);

var_dumpはカンマ区切りで引数を無制限に渡すことが出来る。 これを使い、どのファイルの何行目のどの関数で呼び出されたdumpかを表示しておける。

ソースを追いかけているとどこでdumpしたのか忘れがちになるけど、こうしておけばいつでも削除箇所が分かって手間が少ない。

2013年8月3日土曜日

Sublime Text のプラグインのコマンドに好きなキーを割り当てる

掲題通りで、キーを割り当ててみる。
参考として今回は諸事情で割り当てを行ったSortTabsのGithubを見てみよう。

SortTabs/sort_tabs.py at master · bizoo/SortTabs · GitHub


Sublime textのPluginは
class SortTabsByNameCommand
のようにCommandが付くClass名に対してショートカットキーを設定することが出来る。
SortTabsByNameCommandは名前の通り、タブの名前でソートするコマンド。
ではこのコマンドにキーを割り当ててみる。
{ "keys": ["ctrl+alt+s"], "command": "sort_tabs_by_name" }
と、こうなる。
他のキーマップに倣って好きなkeysを設定する。
さらにcommandを見てもらうとClass名と違うことが分かる。
SortTabsByNameCommand
sort_tabs_by_name
よく見比べてもらえれば容易なことで、Commandを削除し、最初の文字以外の大文字の前にアンダースコアを入れ、文字は全部小文字にするだけ。

これでキーを押してみるとタブがいつでも名前順にソートできる。

/** 今更感のあるエントリーだなぁ。 */

2013年5月6日月曜日

初心かどうか分からないけど。

少し時間を費やせば良かっただけなのに、ユーザーを裏切ったんじゃないのか。
ユーザーは数十人しかいなかったけどやる価値はあったんじゃないのか。
コストが見合うならやってもいいと言われて結局やらなかった。

開発者ってそんなんだったっけ。
採算度外視でユーザーエクスペリエンスとか自分の欲求を追求してなんぼな職業じゃなかったっけ?

そうなんだよ。
そこをなんとかするんだよ!

2013年3月3日日曜日

Mercurialでバックアップ取ればいいじゃない?

星の数ほどあるバックアップツール。
「バックアップ重要だよね」と思って設定してたけど、掲題件の通り分散バージョン管理ツールでもできるやん?しかも完全にバージョン管理だよ!

と思ったので、近々Mercurial+Jenkins(Windowsのタスクでもいいと思うけど)あたりで構築してみるというTODOメモでした。

記事じゃなくてすみません。RTMあたりで管理しろと。

2013年1月20日日曜日

Sublime Text 2にPHPのCodeSnifferを追加。

PHPをPSR規約に準拠して書こうと思い立ったのでいくつかの規約を自分で選んで準拠チェックが出来るCodeSnifferを追加した。
このプラグインは他にもいくつか機能があり、自分はPSR準拠にフォーマットしてくれる機能も設定している。
プラグインはsublime-phpcs
プラグインの詳細はこちら

プラグインのインストールはいつも通りPackage Controlなので割愛。

このプラグインはPearのPHP_CodeSnifferライブラリが必要なので下記のコマンドで導入。

pear channel-update pear.php.net
pear clear-cache
pear install PHP_CodeSniffer
※1行目と2行目は念のため。

ついでにPSR準拠のソースに自動で変換してくれるPHP Coding Standards Fixerも使う。
これはsublime-phpcsのオプションとして対応している。
使用するためにはPHP Coding Standards Fixer本体ファイルが必要なので下記から導入。
PHP Coding Standards Fixer
これを適当な場所に置く。
自分はsublime Text 2の\Data\Packages\User\配下に設置。

追記(2013-08-03 17:44): どうやら以前書いたものは使えなくなったみたい。
どこかのアップデート時にsettingが変わったようで、新しいものにしないと動かなくなったので気づいた。
現在はExampleとして
Data\Packages\Phpcs\example-settings
にファイルが入っているのでそれを使った方が無難。

ユーザー設定は下記。参考程度にどうぞ。
設定するうえで必須なのはphp_cs_fixer_executable_path。
このパスはコマンドラインへそのまま渡すので"php "から書かないと動かないので要注意。
{
    // Execute the sniffer on file save
    "phpcs_execute_on_save": false,

    // PHP_CodeSniffer settings

    // Additional arguments you can specify into the application
    //
    // Example:
    // {
    //     "--standard": "PEAR",
    //     "-n"
    // }
    "phpcs_additional_args": {
        "--standard": "PSR2",
        "-n": ""
    },


    // Show the errors in the quick panel so you can then goto line
    "phpcs_show_quick_panel": false,

    // PHP-CS-Fixer settings

    // Fix the issues on save
    "php_cs_fixer_on_save": false,

    // Show the quick panel
    "php_cs_fixer_show_quick_panel": true,

    // Path to where you have the php-cs-fixer installed
    "php_cs_fixer_executable_path": "php \"Sublime Text 2インストールパス\\Data\\Packages\\User\\php-cs-fixer.phar\"",

    // Additional arguments you can specify into the application
    //
    // Example:
    // {
    //     "--level": "all"
    // }
    "php_cs_fixer_additional_args": {
        "--level": "psr2"
    },


    // PHP Linter settings

    // Are we going to run php -l over the file?
    "phpcs_linter_run": false

}