in the mythosil

Rhythm & Biology.

選択文字列を検索するChrome Extension

選択文字列をキーバインド一発でYahooなりGoogleなりで検索する方法が無いかなと思って探してみたけれども、意外と見つからなかったので作ってしまいました。

Chromeのデフォルトの機能として、選択文字列を右クリックすれば検索するメニューが表示されますが、この1アクションさえも面倒くさいと感じる人は少なくないと思います。
他にも選択文字列を検索するextensionはありますが、検索エンジンを選択するポップアップが表示されたりと、結局1アクション余分なものしか見つかりませんでした。

今回作ったExtensionの機能はシンプルなもので、文字列を選択した状態で「Command+Enter」を押せば、新しいタブでYahooでの検索結果が表示されるというものです。

https://github.com/mythosil/chrome-selection-search

ファイル構成

  • chrome-selection-search/
    • manifest.json
    • selection-search.js
    • background.js

manifest.json

{
  "manifest_version": 2,
  "name": "Selection-Search",
  "description": "Search the selected words in a new tab",
  "version": "1.0",
  "background": {
    "persistent": false,
    "scripts": [ "background.js" ]
  },
  "content_scripts": [{
    "matches": [ "http://*/*", "https://*/*" ],
    "js": [ "selection-search.js" ]
  }]
}

タブ操作には通常パーミッションが必要となりますが、今回はchrome.tabs.createしか使わないため不要です。

selection-search.js

window.addEventListener('keydown', function(e) {
  if (e.metaKey && e.keyCode == 13) {
    var text = window.getSelection().toString();
    if (text.length > 0) {
      chrome.extension.sendMessage({ text: text }, function(response) {});
    }
  }
}, false);

macのCommandキーが押されていると、e.metaKeyがtrueとなります。
EnterキーのkeyCodeは13です。
この部分は好みのキーバインドに書き換えて使ってください。

background.js

chrome.extension.onMessage.addListener(function(req, sender, callback) {
  if (sender.tab) { // from a content script
    if (req.text !== undefined) {
      var url = encodeURI("http://search.yahoo.co.jp/search?ei=UTF-8&fr=crmas&p=" + req.text);
      var properties = { url: url };
      chrome.tabs.create(properties, function(tab) {});
    }
  }
});

補足

content script内ではchrome.tabsがundefinedとなっているため、backgroundにメッセージを投げてタブ操作をさせるというややこしいことをしています。
実際は、こんなまわりくどいことをしなくても、window.openを使えばbackground.jsは不要です。
メッセージパッシングを使ってみたかっただけです。

疑問

検索エンジンが決めうちになっていますが、Chromeのデフォルトで設定されている検索エンジンを使いたいです。これを取得するAPIはあるのでしょうか。

oil refine install時に"It is not safe to rely on the system's timezone settings"と出る場合の対処法

FuelPHPのプロジェクト作成時に

$ oil refine install

としたら以下のようなエラーが表示されるようになりました。

Fatal error: Uncaught exception 'Fuel\Core\PhpErrorException' with message 'date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.'

1.4以前ではタイムゾーンが指定されていない場合にデフォルトでUTCが選択されていましたが、1.4から上記のようなエラーがでるようになったようです。
http://fuelphp.com/forums/discussion/11506/uncaught-exception-with-message-date-unsafe-to-rely-on-systems-timezone

このページに書かれてる通り、php.iniにタイムゾーンを設定することで正しく動くようになりました。

; php.ini
date.timezone = "Asia/Tokyo"

GitLabのインストール

さくらVPS(CentOS)にGitLabをインストールした際のメモ。

参考:https://github.com/gitlabhq/gitlabhq/blob/stable/doc/installation.md

yum

今回はDBにsqlite3を利用するため、あらかじめyumでインストールしておきます。
その他、gitは当たり前として、wgetcurlもインストールしておくこと。
また、後でcharlock_holmesをインストールするときにlibicu-develも必要となるので、これもインストール。
さらに、redisもインストールして走らせておきます。

$ su -
% yum install sqlite-devel libicu-devel redis
% /etc/init.d/redis start

ユーザ作成

まずgitユーザとgitlabユーザを作成。
gitlabユーザはgitグループに入れます。
また、gitlabユーザが/home/gitにアクセスできるようにパーミッションを変更します。

$ sudo useradd git
$ sudo passwd git
$ sudo useradd gitlab
$ sudo passwd gitlab
$ sudo usermod -G git gitlab
$ sudo chmod g+rx /home/git

また、後で必要になるため、一時的にgitlabユーザをsudoersに入れておきます。
(gitlabの動作を確認できたらsudoersから外しておく)

$ sudo vim /etc/sudoers
gitlab  ALL=(ALL)  ALL

ruby(1.9.2-p320)のインストール

環境を汚さないよう、gitlabユーザのホームディレクトリ以下にインストールします。
gemのアップデートもやっておきます。

$ su - gitlab
$ mkdir -p local/src
$ cd local/src
$ wget ftp://ftp.iij.ad.jp/pub/lang/ruby/1.9/ruby-1.9.2-p320.tar.gz
$ tar xvfz ruby-1.9.2-p320.tar.gz
$ cd ruby-1.9.2-p320
$ ./configure --prefix=$HOME/local/ruby-1.9.2-p320
$ make
$ make install
$ vim ~/.bashrc
export PATH=$HOME/local/ruby-1.9.2-p320/bin:$PATH
$ source ~/.bashrc
$ gem i rubygems-update
$ update_rubygems

python(2.7.3)のインストール

rubyと同様、環境を汚さないようにgitlabユーザのホームディレクトリ以下にインストールします。
後で必要になるため、libpythonへのパスも通しておきます。

$ su - gitlab
$ cd local/src
$ wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz
$ tar xvfz Python-2.7.3.tgz
$ cd Python-2.7.3
$ ./configure --enable-shared --prefix=$HOME/local/python-2.7.3
$ make
$ make install
$ vim ~/.bashrc
export PATH=$HOME/local/python-2.7.3/bin:$HOME/local/ruby-1.9.2-p320/bin:$PATH
export LD_LIBRARY_PATH=$HOME/local/python-2.7.3/lib:$LD_LIBRARY_PATH

easy_install、pipのインストール

$ su - gitlab
$ cd local/src
$ wget http://peak.telecommunity.com/dist/ez_setup.py
$ python ez_setup.py
$ easy_install pip

gitoliteのインストール

gitlabユーザのssh鍵を作成し、公開鍵をgitユーザのホームディレクトリに置いておきます。

$ su - gitlab
$ mkdir .ssh
$ ssh-keygen -t rsa -P "" -f .ssh/id_rsa
$ sudo cp .ssh/id_rsa.pub /home/git/gitlab.pub
$ sudo chmod 0444 /home/git/gitlab.pub

gitユーザのホームディレクトリ以下にインストールします。

$ su - git
$ git clone -b gl-v304 git://github.com/gitlabhq/gitolite.git /home/git/gitolite
$ ./gitolite/install -ln /home/git/bin
$ PATH=$PATH:$HOME/bin
$ gitolite setup -pk /home/git/gitlab.pub
$ sed -i 's/0077/0007/g' /home/git/.gitolite.rc
$ exit
$ sudo chmod -R g+rwX /home/git/repositories/
$ sudo chown -R git:git /home/git/repositories/

リポジトリにアクセスできるかを確認します。
下の通りに表示され、/tmp/gitolite-adminが作成されていればOK(確認できたら削除)。

$ su - gitlab
$ git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin
Initialized empty Git repository in /tmp/gitolite-admin/.git/
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
$ rm -rf /tmp/gitolite-admin

gitlabのインストール

まず必要となるライブラリを先にインストールし、。

$ su - gitlab
$ gem i charlock_holmes --version '0.6.8'
$ pip install pygments
$ gem i bundler

gitlabをダウンロードしてきます。

$ git clone -b stable git://github.com/gitlabhq/gitlabhq.git gitlab

設定ファイルを設置します。
DBに関しては、今回はsqliteを利用します。

$ cd gitlab
$ cp config/gitlab.yml.example config/gitlab.yml
$ cp config/database.yml.sqlite config/database.yml

次にgemをインストールするのですが、その前にGemfileに書かれている'https://'の部分を'git://'に書き換えます。また、今回はDBにmysqlを利用しないため、mysql2のインストールも行わないようにします。

$ vim Gemfile
(https://をgit://に書き換え、gem "mysql2"をコメントアウト)
$ bundle install --without development test --no-deployment

gemのインストールを行いますが、下のコマンドは失敗します。

$ bundle install --without development test --deployment
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.

この原因は、先ほどGemfileをいじったことのようです。
解決策はいまいち理解していないのですが、stackoverflowに書かれていた方法でうまく動いています。
参考:http://stackoverflow.com/questions/6785626/unable-to-update-gems-on-production-server

$ bundle install --without development test --no-deployment
$ bundle update
$ bundle install --without development test --deployment

gitの設定をしておきます。

$ git config --global user.name 'gitlab'
$ git config --global user.email 'gitlab@example.com'

データベースのセットアップをします。
最後にadminのユーザ名・パスワードが表示されますので、これをメモっておきます。

/home/gitlab/gitlab/vendor/bundle/ruby/1.9.1/gems/blankslate-3.1.2/lib/blankslate.rb:51: warning: undefining `object_id' may cause serious problems

というエラーがでますが、とりあえず無視しておいて大丈夫そうです。
原因・解決策をお分かりになる方がいたら教えていただきたいです。

$ bundle exec rake gitlab:app:setup RAILS_ENV=production
.....
Administrator account created:

login.........admin@local.host
password......5iveL!fe
.....

フックのセットアップをします。

$ sudo cp ./lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive
$ sudo chown git:git /home/git/.gitolite/hooks/common/post-receive

最後に、正しくインストールが行われているかを確認します。
"NO"が出ていなければ問題ありません。

$ bundle exec rake gitlab:app:status RAILS_ENV=production

gitlab動作確認

まずgitlabを起動します。
デフォルトでは3000番ポートで起動しますので、必要に応じてiptablesの設定を行って下さい。

$ su - gitlab
$ cd gitlab
$ bundle exec rails s -e production

3000番ポートにアクセスして表示されたら、先ほどメモしておいたadminアカウントでログインします。
初回アクセス時には表示されるまでかなり時間がかかりますが、気長に待っていれば大丈夫です。
ログインが確認できたら動作確認完了ですが、adminのパスワードはすぐに変えておきましょう。もしくは、新たな管理者を作成して、adminアカウントを消しておきましょう。

設定変更

リポジトリを1つ作ってみると分かるのですが、httpアクセスのポート番号が80になっており、このままでは正しくアクセスできません。
正しいポート番号(デフォルトなら3000)を、config/gitlab.ymlに設定する必要があります。
その他、必要に応じてconfig以下のファイルを修正します。

auto mergeの有効化

gitlabはブランチ間でmerge requestを送ることができます。
手作業でマージしてもいいのですが、gitlabにはauto merge機能があり、この作業を楽にしてくれます。
ただし、デフォルトでは有効になっていないため、以下のコマンドを実行し、gitlabを再起動します。

$ bundle exec rake gitlab:app:enable_automerge RAILS_ENV=production

まとめ

以上でgitlabの全インストール工程が完了しました。
ここからさらにunicornで動かしたりといった作業があったりもしますが、これに関しては後日。

FuelPHP入門を読んだ

今月はじめに発売されたばかりのFuelPHP入門を読みました。
といっても、前半の半分を読んで、残りはまだざっと目を通した程度です。


まだ情報も少ない中で、これだけまとまった情報が得られるのは非常に貴重だと思います。
1.1をベースに書かれていますが、1.2RCに関する補足もあります(現在FuelPHPの最新版は1.2になっています)。


話の流れとしては、

  1. 概要
  2. インストール
  3. ディレクトリ構成
  4. コントローラ
  5. ビュー
  6. モデル
  7. フォーム処理
  8. 認証とセッション管理
  9. Email
  10. コアクラス
  11. コーディング規約
  12. コマンドラインツール
  13. 統合開発環境

となっています。
コーディング規約に数ページ割いているのは、「どんどん開発コミュニティに参加してよ」というメッセージでしょうか。


本を読みつつFuelPHPを触ってみた感想としては、特別すごい機能があるわけではないですが、とても気が利いてて、使いやすいフレームワークだなと感じました。
autoloaderのおかげでいちいちrequireを書く必要がありませんし、認証機能も標準で入っていています。Paginationも簡単に書けますし、キャッシュを利用したい場合にはmemcachedやredisを使えます。
PHP歴は2ヶ月もなく、CakePHPSymfonyといった有名フレームワークもまだ使ったことがありませんが、最初に触るフレームワークとしてFuelPHPはとても良いのではないかと思っています。


他のフレームワークを知らないので「比べてみてこうだ」といったことが書けないのが残念ですが、非常にいいフレームワークであることは間違いないと思います。
しばらく使い倒しつつ、coreのコードも読んでいこうと思います。

FuelPHP入門

FuelPHP入門

FuelPHPを動かす

インストール

FuelPHPをインストールする方法は2種類あるようで、1つはoilコマンドというものを使う方法。2つ目はzipでダウンロードしてくる、もしくはgit cloneする方法。
oilコマンドを使ってインストールするには、

$ curl get.fuelphp.com/oil | sh
$ cd <document_root>
$ oil create <project_name>

とします。一方、フレームワークをダウンロードしてきた場合には、

$ mkdir <project_name> && cd <project_name>
$ unzip fuelphp.zip
$ php oil refine install

とします。
これは公式サイトにのっている方法なのですが、oilを使うときにはsudoが必要になるため、sudoが入っていない環境ではcurlのとこで失敗します。ですので、

$ curl get.fuelphp.com/oil > install_oil.sh

としておいて、sudoを削除し、

$ su
# sh install_oil.sh

としなければいけません。

動作確認

oil createした後、localhost//publicにアクセスすると"Welcome!"が表示されます。
このままでは、localhost/にアクセスしてもダメです(.htaccessが無い)ので、

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /<project_name>
    RewriteRule ^(/)?$ public/index.php/$1 [L] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d                                                                                   
    RewriteRule ^(.*)$ public/index.php/$1 [L] 
</IfModule>

のように.htacessを書いて、に設置しておく必要があります。
(補足:テスト時にはこのようにしておくのもいいですが、publicディレクトリをDocumentRootにするようapacheの設定を変えた方が安全ですし、.htaccessを書く必要もありません)

まとめ

以上で、とりあえずFuelPHPを動かすところまでです。
次はドキュメント読みながらmvc書いていってみます。