December 26, 2012

Ubuntuで最初にやったことメモ

以前、以下の記事を書きました。

さくらのクラウドでパブリックアーカイブからUbuntuサーバを作成した後にやること
http://madroom-project.blogspot.jp/2012/12/ubuntu_20.html

これとは別の環境で行った、細々とした作業のメモになります。


■デフォルトのエディタを変更する
$ sudo update-alternatives --config editor
"Selection"で対応する数値を入力します。

参考:
http://www.ecchan893.net/?p=359



■特定ユーザでsudoを使用可能にする
* rootで行いました。
# visudo
"root ALL=(ALL) ALL"みたいな感じの下辺りに、以下を追記します。
[ユーザ名] ALL=(ALL:ALL) ALL

参考:
http://www.garunimo.com/program/linux/visudo.xhtml



■sudoに続くコマンドの補完を有効にする
$ vim ~/.bashrc
以下を追記します。
complete -cf sudo
参考:
http://www.webupd8.org/2010/03/how-to-autocomplete-commands-preceded.html



■ログインシェルを変更する
$ sudo chsh [ユーザ名]
"/bin/bash"や"/bin/sh"を入力します。

参考:
http://www.k-tanaka.net/unix/chsh.html



■パッケージレポジトリの変更
バックアップを取るなら取って
$ sudo cp /etc/apt/souces.list /etc/apt/souces.list.yyyymmdd
$ sudo vim /etc/apt/souces.list
して、該当箇所を変更します。(us.archive.ubuntu.comをjp.archive.ubuntu.comに変更とか。)

編集が終わったら、念の為
$ sudo apt-get update
$ sudo apt-get upgrade -y
しました。

参考:
http://d.hatena.ne.jp/nullpobug/20120608/1339082202

--

というわけで、大人の事情から、今年最後の記事でした。

Ubuntuにrcconfをインストールする

自動起動サービスの管理が出来るrcconfをインストールしてみます。

インストール
sudo apt-get install -y rcconf dialog
使い方
sudo rcconf
アスタリスクがついているサービスが自動起動するサービスです。

参考:
Ubuntuで簡単に自動起動するサービスを確認/設定するには?
http://interu.hatenablog.com/entry/20100527/1274962900

FuelPHP Advent Calendar 2012の電子書籍が達人出版会から出版されました!!


達人出版会 - FuelPHP Advent Calendar 2012
http://tatsu-zine.com/books/fuelphpadvent2012

ATND - FuelPHP Advent Calendar 2012
http://atnd.org/events/33753

記事が出揃ったのが昨日、電子書籍の出版が本日の午前という、ビックリするくらいのスピード感でしたね。@kenji_s さん、全体の取りまとめ、ありがとうございました & お疲れ様でした。参加者の皆様も、ありがとうございました & お疲れ様でした。

昨年は、どんな機能があるのだろうと手探り状態でしたし、参加者の人数も少なかったので(13人)、それなりに綱渡り状態だったのが懐かしいです。(それはそれで楽しかったです。)比べて、今年のAdvent Calendarは実用的な内容が多かったです。25人で1記事ずつでしたし、一年でここまで変わるのって凄いなーと思いました。

今回、僕は二日目を担当しました。JSのサンプルコード書くのもアレだなーというのと、実際に何か作ってみようと思わせるネタを意識したという(表向きの!?)理由から、軽めな内容にしたんですが、その後、色々なノウハウの記事が出てきて、非常に参考になりましたし、書籍が誕生するまでの工程に触れられたのも面白かったです。

電子書籍は無料で、フォーマットはEPUBとPDFが用意されているので、是非、ダウンロードして読んでみて下さい。

--

昨年のAdvent Calendarは以下になります。

技術評論社 - FuelPHP Advent Calendar 2011

ATND - FuelPHP Advent Calendar 2011

December 25, 2012

GitLabのグループの権限についてメモ


GitLabのグループの権限について、メモしておきます。(間違えていたら教えて下さい。。。)
GitLab 4.0で確認しています。

Guest
* issueの作成 (Create new issue)
* コメントを残す (Leave comments)
* ウォールへの書込 (Write on project wall)

Reporter
* Guestの全権限
* プロジェクトのpull (Pull project code)
* プロジェクトのダウンロード (Download project)
* マージリクエストの作成 (Create new merge request)
* コードスニペットの作成 (Create a code snippets)

Developer
* Reporterの全権限
* ブランチの作成 (Create new branches)
* protectedでないブランチへのpush (Push to non-protected branches)
* protectedでないトブランチの削除 (Remove non-protected branches)
* (Gitの)タグの追加 (Add tags)
* wikiの編集 (Write a wiki)

Master
* Developerの全権限
* メンバーの追加 (Add new team members)
* protectedなブランチへのpush (Push to protected branches)
* protectedなブランチの削除 (Remove protected branches)
* force push (Push with force option)
* プロジェクトの編集 (Edit project)
* Deploy Keysの追加 (Add Deploy Keys to project)
* Hookの設定 (Configure Project Hooks)

Owner
* Masterの全権限
* 他のネームスペースへの移動 (Transfer project to another namespace)
* プロジェクトの削除 (Remove project)

Ownerは必ず一人で、その他は任意な人数になります。尚、"マージリクエストの作成"とは、WEB上での操作であり、Gitの操作では有りません。また、protectedなブランチへのマージリクエストを受け付けられるのは、Master以上となります。

AdministratorをOwnerにして、プロジェクトのリーダーをMasterにして、リーダー以外をDeveloperにするのを基本にして、使っていってみたいと思います。


December 24, 2012

Ubuntu 12.04(同一サーバ)にGitLabとJenkinsとRedmineをインストールしてサブディレクトリ(URL)で動かす

大げさなタイトルですが、分散させて書いてみました。とりあえず、以下の順で確認しています。基本的には、順不同(単一でもOKなはず)です。また、さくらはあんまり関係ないですし、前提条件は、極力無くした内容です。

1. さくらのクラウドでパブリックアーカイブからUbuntuサーバを作成した後にやること
http://madroom-project.blogspot.jp/2012/12/ubuntu_20.html

2. Ubuntu 12.04にGitLab 4.0をインストールしてMySQLとApacheで動かす
http://madroom-project.blogspot.jp/2012/12/ubuntu-1204gitlab-40mysqlapache.html
* とりあえず、初期アカウントでログイン成功までは確認が取れました。

3. Ubuntu 12.04にJenkinsをインストールしてApacheでポート80で動かす
http://madroom-project.blogspot.jp/2012/12/ubuntu-1204jenkinsapache80.html
* とりあえず、トップ画面の表示までは確認が取れました。

4. Ubuntu 12.04にRedmine 2.2.0をインストールしてMySQLとApacheで動かす
http://madroom-project.blogspot.jp/2012/12/ubuntu-1204redmine-220apache.html
* とりあえず、初期アカウントでログイン成功までは確認が取れました。

/etc/apache2/sites-available/のgitlabとjenkinsとredmineは、上手くまとめたいなー。
しかし、久々にくたびれた。。。

Ubuntu 12.04にGitLab 4.0をインストールしてMySQLとApacheで動かす

基本的には https://github.com/gitlabhq/gitlabhq/blob/4-0-stable/doc/install/installation.md の通りですが、NginxではなくApacheで動かしてみます。

尚、vimのインストール等、省略している箇所があります。

1. パッケージのインストール
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev  wget curl git-core openssh-server redis-server postfix checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev
* Postfix関係で、 "General type of mail configuration:"は"Internet Site"を選択しました。
* Postfix関係で、ドメイン(FQDN)の入力をしました。/etc/postfix/main.cfのmydestinationの値に設定されていました。

2. pythonのバージョンを確認
$ python --version
Python 2.7.3
* 2.5以上が必要とのことです。また、3.xは非サポートとのことです。

3. Ruby(ruby-1.9.3-p327)とBundlerのインストール
http://madroom-project.blogspot.jp/2012/12/ubuntu-1204ruby_23.html

4. ユーザの追加、グループの編集、鍵の作成
$ sudo adduser \
  --system \
  --shell /bin/sh \
  --gecos 'Git Version Control' \
  --group \
  --disabled-password \
  --home /home/git \
  git

$ sudo adduser --disabled-login --gecos 'GitLab' gitlab

$ sudo usermod -a -G git gitlab

$ sudo -u gitlab -H ssh-keygen -q -N '' -t rsa -f /home/gitlab/.ssh/id_rsa
5. Gitoliteのインストールと設定
$ cd /home/git
$ sudo -u git -H git clone -b gl-v320 https://github.com/gitlabhq/gitolite.git /home/git/gitolite

$ sudo -u git -H mkdir /home/git/bin
$ sudo -u git -H sh -c 'printf "%b\n%b\n" "PATH=\$PATH:/home/git/bin" "export PATH" >> /home/git/.profile'
$ sudo -u git -H sh -c 'gitolite/install -ln /home/git/bin'

$ sudo cp /home/gitlab/.ssh/id_rsa.pub /home/git/gitlab.pub
$ sudo chmod 0444 /home/git/gitlab.pub

$ sudo -u git -H sh -c "PATH=/home/git/bin:$PATH; gitolite setup -pk /home/git/gitlab.pub"

$ sudo chmod 750 /home/git/.gitolite/
$ sudo chown -R git:git /home/git/.gitolite/

$ sudo chmod -R ug+rwXs,o-rwx /home/git/repositories/
$ sudo chown -R git:git /home/git/repositories/
* 以下の"example.com"は適切な値に置換して下さい。
$ echo "Host localhost
   StrictHostKeyChecking no
   UserKnownHostsFile=/dev/null" | sudo tee -a /etc/ssh/ssh_config

$ echo "Host example.com
   StrictHostKeyChecking no
   UserKnownHostsFile=/dev/null" | sudo tee -a /etc/ssh/ssh_config
* 以下、sshのポートを変更していると、"ssh: connect to host localhost port 22: Connection refused"のエラーが出ます。その場合、"ssh://git@localhost:[ポート番号]/gitolite-admin.git"の形式にして下さい。( https://github.com/gitlabhq/gitlabhq/issues/1063#issuecomment-9956749 より。)
$ sudo -u gitlab -H git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin

$ sudo rm -rf /tmp/gitolite-admin
6. MySQLのインストール(phpMyAdminは不要)
http://madroom-project.blogspot.jp/2012/12/ubuntumysql.html

7. MySQLの設定
* パスワード等は、適宜置換して下さい。
$ mysql -u root -p

mysql> CREATE USER 'gitlab'@'localhost' IDENTIFIED BY 'gitlab';
mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost';
mysql> \q

$ sudo -u gitlab -H mysql -u gitlab -p -D gitlabhq_production
mysql> \q
8. GitLabのインストールと設定
$ cd /home/gitlab
$ sudo -u gitlab -H git clone https://github.com/gitlabhq/gitlabhq.git gitlab
$ cd /home/gitlab/gitlab
$ sudo -u gitlab -H git checkout 4-0-stable

$ cd /home/gitlab/gitlab
$ sudo -u gitlab -H cp config/gitlab.yml.example config/gitlab.yml

$ sudo chown -R gitlab log/
$ sudo chown -R gitlab tmp/
$ sudo chmod -R u+rwX  log/
$ sudo chmod -R u+rwX  tmp/

$ sudo -u gitlab -H cp config/unicorn.rb.example config/unicorn.rb
* 以下、"localhost"を実際のドメイン名に書き換えます。
$ sudo -u gitlab -H vim config/gitlab.yml
9. GitLab用のDB(Mysql)設定
* 以下、コピーした後、productionのusernameとpasswordを書き換えます。
$ sudo -u gitlab cp config/database.yml.mysql config/database.yml
10. Gemパッケージのインストール(MySQLの場合)
$ cd /home/gitlab/gitlab
$ sudo gem install charlock_holmes --version '0.6.9'
$ sudo -u gitlab -H bundle install --deployment --without development test postgres
11. Gitの設定
$ sudo -u gitlab -H git config --global user.name "GitLab"
$ sudo -u gitlab -H git config --global user.email "gitlab@localhost"
12. GitLabのHook設定
$ sudo cp ./lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive
$ sudo chown git:git /home/git/.gitolite/hooks/common/post-receive
13. DBの初期化
$ sudo -u gitlab -H bundle exec rake gitlab:app:setup RAILS_ENV=production
* sshのポートを変更していると、"ssh: connect to host localhost port 22: Connection refused"のエラーが出ます。その場合、/home/gitlab/.ssh/configを編集します。
$ sudo -u gitlab vim /home/gitlab/.ssh/config
-- /home/gitlab/.ssh/config --
Host localhost
Port [ポート番号]
14. 初期化スクリプトのインストールとGitLabの起動
$ sudo wget https://raw.github.com/gitlabhq/gitlab-recipes/master/init.d/gitlab -P /etc/init.d/
$ sudo chmod +x /etc/init.d/gitlab

$ sudo update-rc.d gitlab defaults 21
$ sudo service gitlab start
15. ステータスの確認
$ sudo -u gitlab -H bundle exec rake gitlab:env:info RAILS_ENV=production
$ sudo -u gitlab -H bundle exec rake gitlab:check RAILS_ENV=production
16. ApacheとPassengerのインストール(RubyとBundlerはインストール済)
http://madroom-project.blogspot.jp/2012/12/ubuntu-1204apachepassenger.html

17. Apacheの設定
$ sudo vim /etc/apache2/sites-available/gitlab
-- /etc/apache2/sites-available/gitlab --
* 以下、"sudo passenger-install-apache2-module"した際の内容に、"RailsBaseURI /gitlab"を付け加えています。とりあえずGitLab専用の設定という意味で、/etc/apache2/sites-available/gitlabに隔離しています。
LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.18/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.18
#PassengerRuby /usr/local/bin/ruby
 
RailsBaseURI /gitlab
18. Apacheの設定反映
$ sudo ln -s /home/gitlab/gitlab/public /var/www/gitlab
$ sudo a2ensite gitlab
$ sudo service apache2 reload

19. [ベースURL]/gitlab にアクセス
* 初期のアカウントは admin@local.host / 5iveL!fe です。

December 23, 2012

Ubuntu 12.04にApacheとPassengerをインストールする

コマンドのメモです。

1. RubyとBundlerをインストールする
http://madroom-project.blogspot.jp/2012/12/ubuntu-1204ruby_23.html

2. ApacheとPassengerをインストールする
$ sudo apt-get install -y apache2 libcurl4-openssl-dev apache2-prefork-dev libapr1-dev libaprutil1-dev
$ sudo gem install passenger
$ sudo passenger-install-apache2-module
--------------------------------------------
The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.18/ext/apache2/mod_passenger.so
   PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.18
   PassengerRuby /usr/local/bin/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Press ENTER to continue.


--------------------------------------------
Deploying a Ruby on Rails application: an example

Suppose you have a Rails application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public    
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:

  /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.18/doc/Users guide Apache.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
https://www.phusionpassenger.com

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.

Ubuntu 12.04にRubyとBundlerをインストールする

参考
http://jurakudai.blog92.fc2.com/blog-entry-19.html

1. パッケージのインストール
$ sudo apt-get install -y make gcc g++ wget libssl-dev zlib1g-dev libreadline-dev libxslt-dev libxml2-dev libyaml-dev paco
2. Ruby(ruby-1.9.3-p327)のインストール
* 最新バージョンは、http://ftp.ruby-lang.org/pub/ruby/ 等で確認して下さい。
$ cd ~
$ mkdir tmp
$ cd tmp
$ wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p327.tar.gz
$ tar xfvz ruby-1.9.3-p327.tar.gz
$ cd ruby-1.9.3-p327
$ ./configure
$ make
$ sudo paco -D make install
$ ruby --version
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]
3. gem install時にドキュメント生成を行わないように、~/.gemrcを編集
$ vim ~/.gemrc
-- ~/.gemrc --
gem: --no-ri --no-rdoc #追加
4. Bundlerをインストール
$ sudo gem install bundler

Ubuntu 12.04にRedmine 2.2.0をインストールしてMySQLとApacheで動かす

参考:
http://shirangana.info/115/?page_id=611
http://two-pack-sbs.blogspot.jp/2012/06/ubuntu-1204redmine-203.html

1. パッケージのインストール
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install -y libyaml-dev libncurses5-dev libgdbm-dev libssl-dev libreadline-dev tk-dev zlib1g-dev libmysqld-dev libmagickcore-dev libmagickwand-dev apache2-dev paco
2. MySQLのインストール(phpMyAdminは不要)
http://madroom-project.blogspot.jp/2012/12/ubuntumysql.html

3. Ruby(ruby-1.9.3-p327)とBundlerのインストール
http://madroom-project.blogspot.jp/2012/12/ubuntu-1204ruby_23.html

4. MySQLの設定
$ sudo vim /etc/mysql/conf.d/characterset.cnf
-- characterset.cnf --
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
$ sudo service mysql restart
4-2. MySQLの設定確認
$ mysql -u root -p
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> \q
5. Redmine用のMySQLデータベースとユーザを作成
* パスワード等は、適宜置換して下さい。
$ mysql -u root -p

mysql> create database redmine default character set utf8;
mysql> grant all on redmine.* to redmine@localhost identified by 'redmine';
mysql> flush privileges;
mysql> \q
6. Redmine(2.2.0)のインストール
$ cd ~/tmp
$ wget http://rubyforge.org/frs/download.php/76627/redmine-2.2.0.tar.gz
$ tar xfvz redmine-2.2.0.tar.gz
$ sudo mv redmine-2.2.0 /usr/local/
$ sudo ln -s /usr/local/redmine-2.2.0 /usr/local/redmine
7. データベースへの接続設定
$ sudo vim /usr/local/redmine/config/database.yml
-- database.yml --
* 内容は、適宜置換して下さい。
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: "redmine"
  encoding: utf8
8. メールサーバへの接続設定
$ sudo vim /usr/local/redmine/config/configuration.yml
-- configuration.yml --
* 内容は、適宜置換して下さい。
production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      address: "localhost"
      port: 25
      domain: 'example.com'
9. Gemパッケージのインストール
$ cd /usr/local/redmine
$ bundle install --without development test postgresql sqlite
10. Redmineの初期設定とデータベースのテーブル作成
$ rake generate_secret_token
$ RAILS_ENV=production rake db:migrate
11. ApacheとPassengerのインストール(RubyとBundlerはインストール済)
http://madroom-project.blogspot.jp/2012/12/ubuntu-1204apachepassenger.html

12. Apacheの設定
$ sudo vim /etc/apache2/sites-available/redmine
-- /etc/apache2/sites-available/redmine --
* 以下、"sudo passenger-install-apache2-module"した際の内容に、"RailsBaseURI /redmine"を付け加えています。とりあえずRedmine専用の設定という意味で、/etc/apache2/sites-available/redmineに隔離しています。
LoadModule passenger_module /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.18/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.9.1/gems/passenger-3.0.18
#PassengerRuby /usr/local/bin/ruby

RailsBaseURI /redmine
13. Apacheの設定反映
$ sudo ln -s /usr/local/redmine/public /var/www/redmine
$ sudo a2ensite redmine
$ sudo service apache2 reload
14. [ベースURL]/redmine にアクセス
初期のアカウントは admin / admin です。

December 22, 2012

Ubuntu 12.04にJenkinsをインストールしてApacheでポート80で動かす

メモ。


(1)
Jenkinsをインストール
$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install -y jenkins
(2)
/etc/default/jenkinsの"JENKINS_ARGS"に"--prefix=/jenkins"を追加(URLをサブディレクトリ式にする為)
/etc/default/jenkinsに「JAVA_ARGS="-Dfile.encoding=utf-8"」を追記(Git Pluginの文字化け対応)
$ sudo vim /etc/default/jenkins
-- /etc/default/jenkins --
JAVA_ARGS="-Dfile.encoding=utf-8"

...

JENKINS_ARGS="--webroot=$JENKINS_RUN/war --httpPort=$HTTP_PORT --ajp13Port=$AJP_PORT --preferredClassLoader=java.net.URLClassLoader --prefix=/jenkins"
(3)
Jenkinsをリスタート
$ sudo service jenkins restart
(4)
Apacheをインストール
$ sudo apt-get install -y apache2
(5)
proxyの設定
$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
$ sudo vim /etc/apache2/sites-available/jenkins
-- /etc/apache2/sites-available/jenkins --
* URLは、適切な値に置換して下さい。
ProxyPass /jenkins http://xxx.xxx.xxx.xxx:8080/jenkins
ProxyPassReverse /jenkins http://xxx.xxx.xxx.xxx:8080/jenkins
(6)
設定を反映
$ sudo a2ensite jenkins
$ sudo service apache2 restart
(7)
[ベースURL]/jenkins にアクセス
参考:
https://wiki.jenkins-ci.org/display/JENKINS/Running+Jenkins+behind+Apache
https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu

(8)
グラフで文字化けが発生するので、好きな日本語フォントをインストールします。
https://wiki.ubuntulinux.jp/UbuntuTips/Desktop/InstallFont
sudo apt-get install -y ttf-umefont
Jenkinsのシステム情報の"java.home"の"lib"に移動します。
cd /usr/lib/jvm/java-6-openjdk-i386/jre/lib
フォントを配置します。
sudo mkdir -p fonts/fallback
cd fonts/fallback/
sudo ln -s /usr/share/fonts/truetype/horai-umefont/ume-pgc4.ttf
Jenkinsを再起動します。
sudo service jenkins restart

参考: Jenkins on Ubuntu の文字化けを直す
http://shunirr.hatenablog.jp/entry/2013/01/10/175426


P.S.
ジョブとかは /var/lib/jenkins/ 以下に作成されるようです。

December 21, 2012

Ubuntuにpacoをインストールする

makeでインストールしたファイルをpacoというパッケージで管理できるみたいなので入れてみます。
http://paco.sourceforge.net/

1. インストール
$ sudo apt-get install -y paco
$ paco --version
paco-2.0.9  (28 June 2010)
Copyright (C) David Rosal <davidrr sourceforge.net="sourceforge.net">
Protected by the GNU General Public License
2. 使い方
# パッケージのインストール
$ paco -D make install

# パッケージの一覧
$ paco -a

# パッケージの削除
$ paco -r package
■参考
http://80286.blog62.fc2.com/blog-entry-176.html

UbuntuにNginxをインストールする

コマンドのメモです。
$ sudo apt-get install -y nginx

UbuntuにMySQL(とphpMyAdmin)をインストールする

コマンドのメモです。phpMyAdminは必要に応じて。
$ sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev phpmyadmin
$ mysql --version
mysql  Ver 14.14 Distrib 5.5.28, for debian-linux-gnu (x86_64) using readline 6.2
* 途中、rootユーザのパスワードを入力します。

phpMyAdminをインストールした場合は、更に
$ sudo ln -s /usr/share/phpmyadmin /var/www
$ sudo service apache2 restart
をして、[ベースURL]/phpmyadmin にアクセス
* 公開される配置する場合、別途セキュリティ対策が必要です。

■参考
2.4. Linux に MySQL をインストールする
http://dev.mysql.com/doc/refman/5.1/ja/linux-rpm.html

Ubuntuで不要パッケージを、依存関係含めて削除する

以下のコマンドで良いらしい。
$ sudo apt-get autoremove xxx

■参考
不要になったパッケージを削除してくれる、autoremove
http://d.hatena.ne.jp/wadap/20080109/1199891111

Ubuntuのapt-getでパッケージをアンインストールするコマンド
http://www.miuxmiu.com/archives/2011/03/31/ubuntu_apt-get_package_uninstallation_command.html

UbuntuにApacheとPHPとPEARをインストールする

2013/01/02 追記:
ソースからもインストールしてみました。
http://madroom-project.blogspot.jp/2013/01/ubuntu550alpha2.html

--

コマンドのメモです。pearも一緒に。
$ sudo apt-get install -y apache2 php5 libapache2-mod-php5 php-pear
$ sudo /etc/init.d/apache2 restart
$ php --version
PHP 5.3.10-1ubuntu3.4 with Suhosin-Patch (cli) (built: Sep 12 2012 18:59:41) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies

December 20, 2012

さくらのクラウドでパブリックアーカイブからUbuntuサーバを作成した後にやること

自分用アーカイブ用メモです。随時、書き足していきます。

1. 公開鍵の登録

2. SSHの設定
http://madroom-project.blogspot.jp/2012/12/sshubuntu.html

2-2. ~/.ssh/configの編集(ローカル)
Host xxx.xxx.xxx.xxx
User xxx
Hostname xxx.xxx.xxx.xxx
IdentityFile xxx
port xxx
3. ファイアウォールの設定
http://madroom-project.blogspot.jp/2012/12/ubuntu.html

4. パッケージの更新
$ sudo apt-get update
$ sudo apt-get upgrade -y
5. pacoのインストール
http://madroom-project.blogspot.jp/2012/12/ubuntupaco.html

6. rcconfのインストール
http://madroom-project.blogspot.jp/2012/12/ubunturcconf.html

7. MySQLのインストール(phpMyAdmin除く)
http://madroom-project.blogspot.jp/2012/12/ubuntumysql.html

8. RubyとBundlerのインストール
http://madroom-project.blogspot.jp/2012/12/ubuntu-1204ruby_23.html

9. ApacheとPassengerのインストール
http://madroom-project.blogspot.jp/2012/12/ubuntu-1204apachepassenger.html

Ubuntuでファイアウォール設定メモ

1. 状態の確認
$ sudo ufw status
2. デフォルトで全てのポートを無効にする
$ sudo ufw default deny
3. ファイアウォールを有効化
$ sudo ufw enable
4. 許可するポートを指定
$ sudo ufw allow http
$ sudo ufw allow https
$ sudo ufw allow 12345
5. 反映
$ sudo ufw reload
許可するポートの削除は
$ sudo ufw delete allow http
$ sudo ufw delete allow https
$ sudo ufw delete allow 12345

UbuntuでSSHのセキュリティ設定メモ

その他、いろいろあるとは思いますが。。。

1. /etc/ssh/sshd_configを編集
# 22以外の適当なポート番号
Port xxx

# プロトコルを制限
Protocol 2

# rootでのログインは不可
PermitRootLogin no

# 空のパスワードは不可
PermitEmptyPasswords no

# パスワード認証方式は不可
PasswordAuthentication no

2. sshdを再起動
$ sudo service ssh reload

■参考
Ubuntu/ssh(sshd)の設定:
http://tobysoft.net/wiki/index.php?Ubuntu%2Fssh(sshd)%A4%CE%C0%DF%C4%EA

SSHのセキュリティ設定(Port番号変更等):
http://takahitokikuchi.poitan.net/2011/11/01/ssh%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E8%A8%AD%E5%AE%9Aport%E7%95%AA%E5%8F%B7%E5%A4%89%E6%9B%B4%E7%AD%89/

December 17, 2012

DOMPDFでPDFファイルサイズを小さくする

DOMPDFには標準で、以下のフォントがインストールされています。

Some fonts. PDFs internally support Helvetica, Times-Roman, Courier & Zapf-Dingbats,
https://github.com/dompdf/dompdf より。 )

マルチバイト文字を扱う場合、自分でフォントをインストールする必要があります。
http://madroom-project.blogspot.jp/2012/11/fuel-pdfhtmlpdf.html

試しにマルチバイト文字を含むPDFを出力してみると、ファイルサイズがかなり大きくなりました。恐らく、PDFにフォントデータそのものが丸ごと含まれているとか、そんな感じかなと。

情報も少なかったのですが、dompdf_config.custom.inc.php の
define("DOMPDF_ENABLE_FONTSUBSETTING", true);
をコメントアウト解除することで、ファイルサイズが小さくなりました。(4MBくらいから8KBくらいまで縮小されました。)

尚、その際、Undefined offsetのNoticeが出てしまったので
error_reporting(0);
して応急処置しました。
Undefined offsetのNotice理由は気になりますが、とりあえず。。。

December 16, 2012

FuelPHPのDebug::dumpを最初から開いた状態にする

Debug::dumpは便利なのですが、配列等の場合、開かないと中身を見れません。(昔のバージョンは最初から開いていたと思うのですが。)

最初から開いた状態にするには、どこかに
Debug::$js_toggle_open = true;
を書くだけです。

僕は、git ignoreしている config/development/config.php に書いています。
https://github.com/mp-php/fuel-myapp/blob/master/config/development/config.php

December 15, 2012

PiwikのAPIと使用するtokenについて

メモです。

APIのURL形式は
[BASE_URL]/index.php?module=API&method=[Method Name]&format=[FORMAT]&token_auth=[TOKEN]

ex)
[Method Name]: API.getPiwikVersion
[FORMAT]: JSON
[TOKEN]: [BASE_URL]/index.php?module=API&action=listAllAPI&idSite=1&period=day&date=yesterday で確認できました。

尚、token_authはユーザ毎に発行されるようなので、APIを使用する為の、専用ユーザを作成すると良いかも。

Piwik API Reference:
http://piwik.org/docs/analytics-api/reference/


以下、標準パラメータ(Standard API parameters)の簡易メモ。

* idSite
Piwikに設定したトラッキングサイトのidか。

* period
day / week / month / year / range を指定可能。

* date
periodと一緒に用いる模様。

* segment
各種条件指定。詳細は http://piwik.org/docs/analytics-api/segmentation/

* format
レスポンス形式の指定。

Google2PiwikでGoogle AnalyticsのデータをPiwikにインポートする(Mac/Win)

Mac OS X Mountain LionとWindows 7(64bit)で確認しています。
環境により、不要な箇所、あるいは別途対処が必要な箇所があるかもしれません。

インポートにはGoogle2Piwikというツールを用います。
Google2Piwikは、Piwikのプラグインというより、単独で使用するPythonスクリプトです。
使い方等は後述します。

尚、Google2Piwikの実行時、Google Analyticsで使用しているID/Passwordが必要になります。
セキュリティが気になる場合、適当なGmailアカウントを対象のGoogle Analyticsユーザに追加して、そちらのID/Passwordを使うと良いかもしれません。

参考:
Export Google Analytics data to Piwik – google2piwik:
http://piwik.org/blog/2011/02/exporting-google-analytics-to-piwik-google2piwik/?doing_wp_cron=1355487930.9467959403991699218750


(1) pythonのバージョン確認
$ python --version
Python 2.7.2
* Macには最初から入っていました。Winは http://www.python.org/getit/ からインストールしました。


(2) gdata-python-clientのインストール
$ cd ~
$ mkdir tmp
$ cd tmp/
$ wget http://gdata-python-client.googlecode.com/files/gdata-2.0.17.zip
--21:51:48--  http://gdata-python-client.googlecode.com/files/gdata-2.0.17.zip
           => `gdata-2.0.17.zip'
Resolving gdata-python-client.googlecode.com... 74.125.31.82
Connecting to gdata-python-client.googlecode.com[74.125.31.82]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3,038,210 [application/zip]

100%[====================================>] 3,038,210    601.75K/s    ETA 00:00

21:51:53 (571.68 KB/s) - `gdata-2.0.17.zip' saved [3038210/3038210]

$ tar zxvf gdata-2.0.17.zip
$ cd gdata-2.0.17
$ sudo python setup.py install
* 最新版は http://code.google.com/p/gdata-python-client/downloads/list で確認。


(3) MySQLのインストール
* Winではこの手順は不要でした。

http://dev.mysql.com/downloads/mysql/
からdmgをDL、インストール。

尚、MAMPのMySQLでは後述の「MySQLdb(MySQL-Python)のインストール」で以下のエラーが出ました。
_mysql.c:44:10: fatal error: 'my_config.h' file not found


(4) MySQLdb(MySQL-Python)のインストール
Win7(64bit)用のexeは http://www.codegood.com/archives/129 からDLできました。
以下、Macでの手順です。

http://sourceforge.net/projects/mysql-python/
からDLして適当な場所に解凍。site.cfgに以下を設定。
mysql_config = /usr/local/mysql/bin/mysql_config
インストール。
$ sudo python setup.py build
$ sudo python setup.py install
細かく確認していませんが
$ ARCHFLAGS='-arch x86_64' sudo python setup.py build
$ ARCHFLAGS='-arch x86_64' sudo python setup.py install
と記載されている記事もありました。
http://d.hatena.ne.jp/tell-k/20110421/1303399818

尚、
$ sudo easy_install MySQL-python
でもOKのようです。
http://d.hatena.ne.jp/jYoshiori/20070913/1189693855


以下、後述の処理で「見つからいなよ」系のエラーが出たので、実行しました。
$ sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock


(5) Google2Piwikの設定
http://clearcode.cc/offer/open-source-projects/google2piwik/
https://github.com/clearcode/Google2Piwik

DLして適当な場所に解凍。
google2piwik.conf.sampleをgoogle2piwik.confとしてコピー。
設定項目は以下の通りです。

[google]
* user_login … Gmailアドレス
* user_pass ... Gmailアドレスのパスワード
* table_id ... ga:[Google AnalyticsのプロファイルID]
* api_key ... https://code.google.com/apis/console/ > API Access > Simple API Access > API keyの値

[mysql]
* table_prefix ... piwikのインストール時に「piwik_」とした場合、当項目は「piwik」でOKでした。
その他の項目は割愛します。

[export]
* start ... エクスポートする開始日
* end ... エクスポートする終了日

[piwik]
* site_id ... piwik側のsite_id
* site_url ... トラッキング対象サイトのURL


(6) Google2Piwikの設定確認
$ python google2piwik.py -c
Checking configuration file: [OK]

Checking Google Analytics
Attempting login: [OK]
Simple query on table: [OK]

Checking MySQL Access
Initialize database connection: [OK]
Checking tables: [OK]
Checking site: [OK]


(7) Google2Piwikの実行
$ python google2piwik.py
尚、table_idの確認は
$ python google2piwik.py -p


(8) インポート後
Please go to your Piwik installation folder and run misc/cron/archive.sh script.
と表示されるので、指示通りPiwikのインストールディレクトリに移動して、以下を実行しました。
$ ./misc/cron/archive.sh
最後に
Finished Scheduled tasks.
と表示されました。
APIを用いた確認はまだしていませんが、それっぽくレコードが増えていたので、たぶん成功。。。

December 14, 2012

Piwikをインストールする

メモです。

公式:
http://piwik.org/

GitHub:
https://github.com/piwik/piwik

PiwikJapan 日本Piwikユーザー会:
http://www.piwikjapan.org/

DLやgit cloneで適切な場所に配置して piwik/index.php にアクセス。画面の支持に従い進める。主な入力項目は以下の通り。

* DB情報
* ログイン情報
* トラッキングするサイト情報

December 11, 2012

もしGitHubに間違ったauthorとcommitterでpushしてしまったら。

GitHubに直接関係する話では有りませんが、GitHub絡みでよくやらかすので、メモしておきます。全コミットのauthorとcommitterを書き換える手順です。

globalなuser.nameが"xxx"
globalなuser.emailが"xxx@example.com"
で設定されているとします。

特定のレポジトリの
user.nameを"mamor"
user.emailを"mamor@example.com"
にするつもりが、設定を忘れて、前述のglobalなuser.nameとuser.emailでcommitしてGitHubにpushしてしまったら。何としてでも書き換えたくなります。

尚、この操作は、GitHub(というかbareレポジトリ)を複数人で使っている場合は絶対に行わないで下さい。もはや破壊行為です。また、一人で使っていても、複数端末でcloneしている場合は、ちょっと手こずるかもしれません。(authorとcommitterを書き換えた端末以外の端末では、cloneし直すのが手っ取り早いのかな。)

(1) 予め、globalなuser.nameとuser.emailを設定します。
$ git config --global user.name "xxx"
$ git config --global user.email "xxx@example.com"
(2) GitHubでレポジトリを作成して、cloneして、statusを見てみます。
$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
(3) 適当に3コミットほどしてみます。
$ touch xxx.txt
$ git add xxx.txt
$ git commit -m "xxx"
[master (root-commit) 8541db6] xxx
 0 files changed
 create mode 100644 xxx.txt

$ touch yyy.txt
$ git add yyy.txt
$ git commit -m "yyy"
[master 7c73ecb] yyy
 0 files changed
 create mode 100644 yyy.txt

$ touch zzz.txt
$ git add zzz.txt
$ git commit -m "zzz"
[master 6dcfe97] zzz
 0 files changed
 create mode 100644 zzz.txt
本当はこの操作の前に
$ git config user.name "mamor"
$ git config user.email "mamor@example.com"
をすべきでした。という話です。

(4) logを見てみます。
$ git log
commit 6dcfe97230f09bc793175a5af1a15027292c53c2
Author: xxx <xxx@example.com>
Date:   Tue Dec 11 21:51:33 2012 +0900

    zzz

commit 7c73ecbc337361bca1af5d1722816666bd6b0d33
Author: xxx <xxx@example.com>
Date:   Tue Dec 11 21:51:11 2012 +0900

    yyy

commit 8541db609a8ee4c9797216ef131bb4699c66281c
Author: xxx <xxx@example.com>
Date:   Tue Dec 11 21:50:37 2012 +0900

    xxx
(5) pushします。
$ git push origin master
Password for 'https://mp-php@github.com':
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 548 bytes, done.
Total 7 (delta 1), reused 0 (delta 0)
To https://mp-php@github.com/mp-php/test.git
 * [new branch]      master -> master
(6) authorとcommitterを書き換えます。
$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME='mamor'; GIT_AUTHOR_EMAIL='mamor@example.com'; GIT_COMMITTER_NAME='mamor'; GIT_COMMITTER_EMAIL='mamor@example.com';"
Rewrite 6dcfe97230f09bc793175a5af1a15027292c53c2 (3/3)
Ref 'refs/heads/master' was rewritten
* もし、直近の2コミットのみを修正したい場合は"HEAD~2..HEAD"を末尾に付け足します。

(7) logを見てみます。全コミットのハッシュ値も変わっています。(4)とは全く別物です。
$ git log
commit 43b748b0386713e31bce00593991438204c981e0
Author: mamor <mamor@example.com>
Date:   Tue Dec 11 21:51:33 2012 +0900

    zzz

commit df224eaec1c14f6e352dbfc485bb781f3b98a357
Author: mamor <mamor@example.com>
Date:   Tue Dec 11 21:51:11 2012 +0900

    yyy

commit 9d74427602221a9c6711be91bf9029159b177e49
Author: mamor <mamor@example.com>
Date:   Tue Dec 11 21:50:37 2012 +0900

    xxx
(8) 強制pushします。
$ git push origin master -f
Password for 'https://mp-php@github.com':
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 551 bytes, done.
Total 7 (delta 1), reused 0 (delta 0)
To https://mp-php@github.com/mp-php/test.git
 + 6dcfe97...43b748b master -> master (forced update)

authorとcommitterの書き換え参考:
http://d.hatena.ne.jp/idesaku/20090908/1252419890
http://d.hatena.ne.jp/flalin/20110330/1301484566
http://d.hatena.ne.jp/naga_sawa/20110119/1295420861

authorとcommitterの違い参考:
http://d.hatena.ne.jp/shigemk2/20120310/1331314603

December 2, 2012

FuelPHPでphpDocumentor 2のドキュメントを作成する小物TaskをGitHubに置いておきました。

先に、phpDocumentor 2がインストールされている必要があります。
▼phpDocumentor 2のインストール手順(Mac/Win/Linux)
http://madroom-project.blogspot.jp/2012/12/phpdocumentor-2macwin.html

また、当Taskは、以下のTaskと姉妹的な感じで実装してあります。
▼FuelPHPでカバレッジレポートを作成する小物TaskをGitHubに置いておきました。
http://madroom-project.blogspot.jp/2012/11/fuelphptaskgithub.html

当Taskのソースは、以下になります。
https://github.com/mp-php/fuel-myapp/blob/master/tasks/phpdoc.php

php oil r phpdoc:htmlでhtmlのドキュメントが作成されます。
第一引数が除外するディレクトリ(デフォルトは"")
* 指定ディレクトリは第二引数からの相対パス
* カンマ区切りで複数ディレクトリを指定可能
第二引数が入力ディレクトリ(デフォルトは"fuel/app/classes/")
第三引数が出力ディレクトリ(デフォルトは"../docs/")
となります。
引数の順がちょっとおかしい気もしますが、個人的な省略の頻度から、とりあえずこの順番にしています。後々、変更するかもしれません。

第三引数のディレクトリに対して削除処理を行った後、ドキュメントを作成します。
第三引数のディレクトリが存在する場合、-fオプションを付与していないと即時終了します。

IDEの設定ファイル等をGIt管理から避ける為に、プロジェクトを以下の構成にしているので、デフォルトディレクトリも、workと並ぶようにしています。

--
プロジェクトルート/
    work/(ここをGit管理)
    xxx/
    yyy/
    docs/(今回のtaskで生成するディレクトリのデフォルト)
    その他、IDEの設定ファイル等
--

尚、php oil r phpdocとphp oil r phpdoc:helpでヘルプ表示です。


ドキュメントもちゃんと書いていきたい。

FuelPHPで画像をプログラムから出力する方法。切り取る方法。応用する方法。

2012/12/02 15:53追記
Input::extension()メソッドで、URLの拡張子を取得可能とご教示を頂きました。「1. 画像をプログラムから出力する方法」について、内容を修正しました。
--

FuelPHP Advent Calendar 2012 2日目です。@madmamor です。
昨日は @kenji_s さんの「FuelPHPのこの1年」でした。

本日は「FuelPHPで画像をプログラムから出力する方法。切り取る方法。応用する方法。」を紹介します。WEB開発でよくある、ユーザによる画像アップロード機能の実装に際して、参考になれば幸いです。尚、当記事の内容はFuelPHP 1.4で確認しています。

1. 画像をプログラムから出力する方法

以下のようなコントローラを用意します。
<?php

class Controller_Image extends Controller
{

    private static $exts = array(
        'gif' => 'image/gif',
        'jpg' => 'image/jpeg',
        'jpeg'=> 'image/jpeg',
        'png' => 'image/png',
    );

    public function get_image($file_name = null)
    {
        $ext = Input::extension();
        $file_path = APPPATH.'tmp'.DS.$file_name.'.'.$ext;

        if ( ! is_file($file_path))
        {
            throw new Exception('Invalid file name.');
        }

        return Response::forge(
            file_get_contents($file_path),
            200,
            array('Content-Type' => static::$exts[$ext])
        );
    }

}
get_image()は、URLのセグメントから画像ファイル名を受け取り、その画像を出力します。

使い方は簡単で、Viewファイルに、以下のようなimgタグを書くだけです。
<img src="<?php echo Uri::create('image/image/xxx.png'); ?>" alt="xxx" />

2. 画像を切り取る方法

以下の方法で、切り取りつつ保存出来ます。
Image::load($path1)->crop($x1, $y1, $x2, $y2)->save($path2);
$x1 と $y1 が始点座標、$x2 と $y2 が終点座標です。$path1 が元のファイル名で、$path2 が保存するファイル名です。

Imageクラス:


3. 応用する方法

以上の2つの機能を組み合わせて、最近よく見かける方式の画像アップロード機能が実装できます。

例えばSNSで、ユーザがプロフィール画像をアップロードする際、画像の 縦幅 / 横幅 / 比率 はバラバラなので、それらをサーバサイドで一定の基準に基づき処理する必要があります。また、プロフィール画像はデザインとの関係も強く、切り取りやリサイズ処理が入るケースも多いと思われます。

その際、その基準(比率を維持する??横幅がNピクセル以上ならリサイズする?? etc…)の決定が煩わしいのであれば、ユーザに任せてしまうのも、一つの方法です。

例えばJcropのようなjQueryライブラリと組み合わせることで、ユーザによる切り取り機能を実装できます。

Jcrop:


Jcropは、比率固定の切り取りや、サイズ固定の切り取りが可能です。切り取りのchangeイベントも、随時キャッチできます。Jcrop側で、比率と、ミニマムな幅を制御すれば、サーバサイドの処理も楽になりますね。

実装の基本的なステップは、以下の流れになります。

画面1(ファイルアップロード画面)

  • 通常の画像アップロード画面を用意、ユーザに画像をアップロードさせる。

画面2(リサイズ画面)

  • 画面1から送信された画像を非公開ディレクトリにテンポラリとして保存。
  • 「1. 画像をプログラムから出力する方法」でHTMLに出力。
  • Jcropで切り取り、始点座標と終点座標をhiddenで送信。
セッションを用いない場合は、併せて、テンポラリとして保存されているファイル名もhiddenで送信する必要があります。

画面3(完了画面)

  • 画面2から送信されたhidden値を使い、「2. 画像を切り取る方法」で切り取って、正式に保存。
  • 切り取った画像を表示。等。

絵的にも面白い(カッコいい)機能と思いますので、機会があれば是非、取り入れてみて下さい。

また、更なる応用で、ドラッグドロップに対応したシームレスなアップロードを目指す場合、以下が参考になりそうです。

jQuery File Upload Plugin:


明日は @mkkn_info さんの「Fuel PHP を使ったモジュール開発入門」です。お楽しみに!

December 1, 2012

phpDocumentor 2のインストール手順(Mac/Win/Linux)

2013/01/03 追記:
Linux(Ubuntu)でも同様の手順でインストールが出来ました。伴って、一部、書き足しています。

--

公式:
http://www.phpdoc.org/

GitHub:
https://github.com/phpDocumentor/phpDocumentor2

以下、Mac(MAMP)とWin(XAMPP)とLinux(Ubuntu)で確認しています。コマンド形態(sudoとか)は、適宜置換して下さい。
$ pear update-channels
$ pear upgrade pear
$ pear upgrade-all
$ pear channel-discover pear.phpdoc.org
$ pear install -a phpdoc/phpDocumentor-alpha
$ phpdoc --version
phpDocumentor version 2.0.0a11
もしphpdoc/phpDocumentor-alphaのinstallで
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 587262 bytes) in /xxx/PEAR/Installer.php on line 580
のようなエラーが出たら
php -i | grep 'Configuration File'
で表示されるphp.iniのmemory_limitを
memory_limit = -1
にして、再度実行してみて下さい。(もとに戻すのを忘れずに。)

参考:
http://stackoverflow.com/questions/415801/allowed-memory-size-of-33554432-bytes-exhausted-tried-to-allocate-43148176-byte

基本的な使い方は
$ phpdoc -d [入力ディレクトリ] -t [出力ディレクトリ]
です。Twitter Bootstrapを採用しているのでキレイですね。

ヘルプの表示は
$ phpdoc -h
になります。

最低限必要な手順は、以上となります。
以下、補足です。

GraphVizというものがインストールされていないと
Unable to find the `dot` command of the GraphViz package. Is GraphViz correctly installed and present in your path?
と出ます。

GraphVizはMacとWinで、それぞれ、以下からDL可能です。

Mac:(mountainlion用は2012/12/01現在、graphviz-2.29.20121121.0545.pkgです。)
http://www.graphviz.org/Download_macos.php

Win:
http://www.graphviz.org/Download_windows.php

Ubuntuでは、以下のコマンドでインストールが可能です。
$ sudo apt-get install -y graphviz

GraphVizをインストールすることで、クラス継承図も出力してくれるようになります。

以下、Mac/Winそれぞれのトラブルシューティングメモです。
尚、環境によっては必要のない(無駄な)手順があるかもしれません。

Mac:
(1)
前述のGraphVizが見つからないエラーがどうにも消えませんでした。
試しにdotコマンドを実行してみると
$ dot
dyld: Library not loaded: /usr/lib/libltdl.7.dylib
  Referenced from: /usr/local/bin/dot
  Reason: image not found
Trace/BPT trap: 5
となり、libltdl.7.dylibというものが見つかっていない事が原因のようで
cp /opt/local/lib/libltdl.7.dylib /usr/lib/
したら解決しました。

実は最初、間違えてlion用のgraphviz-2.28.0.pkgを先にインストールしてしまったので、それが原因だったのかもしれません。

参考:
http://syrioyaji.homeunix.com:8000/wordpress/?p=263



Win:
(1)
phpdocを実行した時に
Could not open input file: \phpdoc.php
と出ました。
xxx\xampp\php\phpdoc.batの最終行を
"%PHPBIN%" "xxx\xampp\php\phpdoc.php" %*
に修正しました。

(2)
xxx\xampp\php\phpdoc.php を xxx\xampp\php\phpdoc としてコピーしました。

(3)
php.iniに
extension=php_xsl.dll
を追加しました。

(4)
PATHを通して再起動しました。



先にWinにインストールして、Winは無駄に手強いなーと思っていたら、Macの方がハマった。悔しい。。。

MAMPにnode.jsをインストール

メモ。
$ cd /Applications/MAMP/tmp/
$ mkdir node
$ cd node
$ wget http://nodejs.org/dist/v0.8.14/node-vx.x.x.tar.gz
$ tar zxvf node-vx.x.x.tar.gz
$ cd node-vx.x.x
$ ./configure
$ make
$ sudo make install
$ node --version
v0.8.14
node-vx.x.x.tar.gzの最新版確認は
http://nodejs.org/download/
から。

以下、参考にさせて頂きました。
新年早々 Node.jsをMAMPにインストールしてみた。

Gdata APIでGoogle Analytics情報を取得する際に、APIコール数を減らすポイント


2012/12/01現在、Gdata APIによるGoogle Analytics情報の取得は、デイリーで50000コールが上限となっています。
この上限を超えない事だけを意識すれば良いかと言うと、そうでもありません。
例えば定時処理で大量にAPIをコールする場合、仮に1コールで1秒を要すると、50000コールで約14時間必要となるので、その辺りの考慮も必要です。

その際、重要なポイントは、以下の二つになりそうです。

(1). 1APIにおける最大返却行数は10000行
https://developers.google.com/analytics/devguides/reporting/core/v3/reference#maxResults
"The Analytics Core Reporting API returns a maximum of 10,000 rows per request"

(2). API(GET)によるアクセス時、最大URL長は2073バイトとなる模様(環境により異なる??)
2073バイトで正常なレスポンス、2074バイトで異常なレスポンスになりました。

この二つをまとめると、意識すべきことは、APIのリクエストパラメータを工夫して
URL長が2073バイト以内になるようにしつつ
10000行に限りなく近い行数のレスポンスを狙う
になります。
パラメータには正規表現も使えるので、理想なリクエストを見つけたいところです。

パラメータの確認には、以下が重宝しそうです。
Google Analytics Query Explorer 2:
http://ga-dev-tools.appspot.com/explorer/

パラメータについて、まとめておきます。
ids : Google AnalyticsのプロファイルID
metrics : 指標
dimensions : 指標の次元
sort : ソート順
start-date : 開始日
end-date : 終了日
segment : (調査中...)
filters : 正規表現等のフィルタ
start-index : 開始行No.
max-results : 返却される最大行数

公式ヘルプ:
https://support.google.com/analytics/?hl=ja

metricsとdimensionsの使い方ですが
metricsでPV数や新規訪問数といった、取得する指標を決定して
dimensionsで細分化(年単位、月単位、URL単位...)を行う
と理解しています。

ディメンションと指標:
https://support.google.com/analytics/bin/answer.py?hl=ja&answer=1033861

segmentが、まだ良くわかっていないのですが、以下に関係しているのだろうか。。。

アドバンス セグメントについて
https://support.google.com/analytics/bin/answer.py?hl=ja&answer=1033017


パラメータについて、以下を参考にさせて頂きました。

[C#] Google Analytics Data Export API を使う - ページごとのページビュー数の取得:
http://www.ipentec.com/document/document.aspx?page=csharp-google-analytics-data-export-api-get-value


まずは、URLのルールと取得したい情報の整理を行い、
次に、それらから最も効率良くAPIをコールするパラメータを見つける事が近道と思います。

行き当たりばったりで突き進むと怪我しそう。。。

November 14, 2012

FuelPHPのfuel-pdfパッケージをセットアップしてHTMLをPDFにコンバートして出力

とりあえずMAC(Mountain Lion)で。(OS毎に変化するのはload_font.phpの実行部分のみと思います。)

--
追記:
Windowsでもbashで全く同様にload_font.phpを実行して、フォントのインストールが出来ました。
--

fuel-pdfを fuel/packages/pdf として配置する。
https://github.com/fuel-packages/fuel-pdf

pdf/lib/dompdfを
https://github.com/dompdf/dompdf
で差し替える。

https://github.com/PhenX/php-font-lib
を pdf/lib/dompdf/lib/php-font-lib として配置する。

pdf/lib/dompdf/load_font.phpを実行してフォントをインストールする。
php load_font.php osaka /Library/Fonts/Osaka.ttf
* Windows 7のフォントは C:\Windows\Fonts にあります。

以下、使い方のサンプル。
Package::load('pdf');
$pdf = Pdf::factory('dompdf')->init();

$html ='<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>xxx</title>
<style>
body { font-family: "Osaka;" }
</style>
</head>
<body>
マルチバイトテスト
</body>
</html>';

$pdf->load_html($html);
$pdf->render();
$pdf->stream("xxx.pdf");
metaのcharsetの指定方法に注意。(HTML5の形式はNGみたい。)

--
追記:
上記のサンプルはDOMPDFを使用していますが、TCPDFというライブラリも使用できます。
TCPDFもHTMLからのPDFコンバートが可能と思いますが、どちらのライブラリを使用するにせよ、
多くの人が期待するかもしれない(?)twitter bootstrapとの組み合わせは、
(2012/11/14時点では)無理です。(CSS3に非対応な為。)

追記2: (2013/05/01)
以下、関連記事です。
DOMPDFでPDFファイルサイズを小さくする
http://madroom-project.blogspot.jp/2012/12/dompdfpdf.html

November 12, 2012

FuelPHPのscafdbタスクを改良しました。

2013/01/14 追記

FuelPHP1.5で、当タスクをベースにしたfromdbタスクが公式に実装されました。
https://github.com/fuel/oil/commit/fcb51348c7d4c401895d4e10119fd795fdc57a94
FuelPHP1.5以降は、fromdbタスクをお使い下さい。

--

大した改良では無いですが、scafdb:scafとscafdb:modelで、
複数テーブルの指定に対応しておきました。
https://github.com/mp-php/fuel-myapp/blob/master/tasks/scafdb.php
https://github.com/mp-php/fuel-myapp/commit/a6357fce3bf3e0e0c9f5a906cd6222da0e7f4d6c

複数テーブルを指定する場合、カンマ区切りで指定して下さい。
単一テーブルの場合、これまでと同様です。

scafdbについては、以下を御覧下さい。
http://www.slideshare.net/mamoruotsuka/fuelphp-tokyo-vol220120923
http://madroom-project.blogspot.jp/2012/06/fuelphpscaffoldtaskgithub.html

尚、FuelPHP1.4でoil generateを正しく実行する為に、以下の修正が必要です。
https://github.com/fuel/oil/commit/74f58bf6ddb1c0c556dc336f578cd3babc4e9755
(追記: パッチが当たっていますので、この修正はもう不要です。)

November 10, 2012

FuelPHP1.4とconfigファイル

FuelPHP1.4がリリースされています。

1.4で初期設定がcore/configに移動したことで、DL直後は
app/config/config.php
app/config/db.php
の2ファィルが、空の配列をreturnするようになっています。

app/config/config.phpも、これからは上書きしたい値のみを書きます。

app/config/db.phpはPDOを用いる場合、"default.type"を書き足す必要があります。
これは、core/config/db.phpでPDO用とMySQLi用の設定がそれぞれ"default"で
定義されていて、MySQLiが後勝ちで"default"になるためです。
(たぶん、これまでDL直後は、PDOがdefaultだったと思う。)

--
追記:
デフォルトでPDOに向くようにパッチが当たっていました。

November 6, 2012

FuelPHPのGdataパッケージを作りました。

GitHubにUPしてあります。
(README等は、後日書く予定です。)

やっていることは簡単で、google-api-php-clientをFuelPHP的にforgeするだけです。

使い方は、以下になります。

(1)
app/config.phpのalways_load.packagesに'gdata'を加えるか
任意の場所でPackage::load('gdata')して有効にします。

(2)
packages/gdata/config/gdata.php
をapp/config/以下にコピーして、編集します。

(3)
forgeする際、サービス名を渡して下さい。
$gdata = Gdata::forge($service_name);

カレンダーのAPIを使うなら
$gdata = Gdata::forge('calendar');
になります。

$gdata->client
$gdata->service
を駆使して処理を進める感じです。

その他、以下を一通りforge出来ます。(と思っています。。。)
packages/gdata/vendor/google-api-php-client/src/contrib/Google_[サービス名]Service.php

同一プロセスで複数のGdataインスタンスを扱いたい場合は
$gdata_xxx = Gdata::forge('xxx', $instance_name);
$gdata_yyy = Gdata::forge('yyy', $instance_name);
になります。

app側からconfigを上書きしたい場合は、第三引数に配列を渡して下さい。
中でマージしています。
$gdata = Gdata::forge('xxx', 'default', $config);
以下、ControllerでGoogleカレンダー一覧を取得するサンプルです。
public function action_login()
{
    $g = static::get_gdata();
    Response::redirect($g->client->createAuthUrl());
}

public function action_callback()
{
    $g = static::get_gdata();
    $g->client->authenticate();
    //$access_token = $g->client->getAccessToken();
    $calendars = $g->service->calendarList->listCalendarList();
    Debug::dump($calendars);
    exit();
}

private static function get_gdata()
{
    Package::load('gdata');
    return Gdata::forge('calendar'); 
}
refresh tokenの使い方を調べないとなー。

November 4, 2012

FuelPHPのFBページのフィードを取得する

もちろん、FuelPHPのFBページじゃなくてもOKです。


参考:
FacebookページのフィードURLを取得してフィードリーダーで購読する方法
http://www.koikikukan.com/archives/2012/04/19-003333.php


1). FBページのURLを調べる
https://www.facebook.com/jp.fuel

2). FBページのURLのwwwをgraphに置き換える
https://graph.facebook.com/jp.fuel

3). 2にアクセスして返却されるjsonの"id"をコピー
https://graph.facebook.com/jp.fuel の場合は 355539997857756

4). フィード取得
https://www.facebook.com/feeds/page.php?format=rss20&id=[取得したID]
https://www.facebook.com/feeds/page.php?format=atom10&id=[取得したID]

https://www.facebook.com/jp.fuel の場合は
https://www.facebook.com/feeds/page.php?format=rss20&id=355539997857756
https://www.facebook.com/feeds/page.php?format=atom10&id=355539997857756

PHP Coding Standards Fixerのインストールや使い方のメモ

■本家
http://cs.sensiolabs.org/


■インストール
wget http://cs.sensiolabs.org/get/php-cs-fixer.phar -O xxx/php-cs-fixer.phar


■アップデート
php php-cs-fixer.phar self-update


■使い方
php php-cs-fixer.phar fix /path/to/dir
php php-cs-fixer.phar fix /path/to/file


■使い方(levelオプション指定)
php php-cs-fixer.phar fix /path/to/project --level=psr0
php php-cs-fixer.phar fix /path/to/project --level=psr1
php php-cs-fixer.phar fix /path/to/project --level=psr2
php php-cs-fixer.phar fix /path/to/project --level=all


■使い方(fixersオプション指定)
php php-cs-fixer.phar fix /path/to/dir --fixers=linefeed,short_tag,indentation


■fixersオプションの意味(一部、表現に間違いあるかも)
* indentation
インデントをスペースx4に。

* braces
クラス名とメソッド名に続く括弧は次の行にする。制御構造に続く括弧は同じ行にする。


* linefeed
PHPファイルの改行コードをLFに。

* trailing_spaces
行末のホワイトスペースを削除。

* unused_use
使用していないuseステートメントを削除。

* php_closing_tag
PHPの閉じタグ ?> を削除。

* short_tag
ショートタグは使わない。

* return
returnの前は一行空ける。

* visibility
全てのプロパティやメソッドは可視性を宣言する。

* phpdoc_params
phpdocの@paramは縦に整列する。

* eof_ending
ファイルの末尾は改行する。

* extra_empty_lines
余分な空白行を削除。

* include
includeするファイルの指定に括弧は使わない。

* PSR0
クラスは、その名前空間に一致するパスに配置する必要があり、少なくとも一つの名前空間の深さにすると、クラス名がファイル名と一致する必要があります。(自動翻訳のまま)

* controls_spaces
制御構造に続く括弧の左にはスペースを空ける。

* elseif
else ifの代わりにelseifを使う。


■個人的な感想
levelオプション指定(無指定含む)で使うことは無さそう。
fixersオプション指定で使うと便利そう。
その時、indentationとbracesは使わなそう。

なので
php php-cs-fixer.phar fix /path/to/dir --fixers=linefeed,trailing_spaces,unused_use,php_closing_tag,short_tag,return,visibility,phpdoc_params,eof_ending,extra_empty_lines,include,PSR0,controls_spaces,elseif
かなー。

backbone.jsのmodelとHTTPメソッドのメモ


model.save()
* idが無いとpost
* idが有るとput

model.destroy()
* idが無いと通信しなかった
* idが有るとdelete

FuelPHPのController_RestとPUT/DELETEとPHPの標準入力についてメモ

2013/05/19 追記:
実はv1.2の頃から Input::json() メソッドがあり、backbone.js(JSON通信)については、それを使えば良いっぽいです。Input::json() の使い方は Input::post() とかの使い方と同じなはずです。

--

backbone.jsを使っていて、当問題に出くわしました。

PHPの標準入力は
http://php.net/manual/ja/wrappers.php.php
"php://input でオープンしたストリームは、一度しか読み込めません。"
との事です。

Controller_RestでPUT/DELETEの時
* Controller_Rest::_detect_format
* Input::param
* Input::hydrate
と進んで、Input::hydrateでfile_get_contents('php://input')しているようです。

そのためか、Controller_Restを継承したサブクラスのメソッド(put_xxx/delete_xxx)で
file_get_contents('php://input')しても、内容は読み込めませんでした。

Input::put/Input::deleteで取れなくは無いのですが、試しにInput::putをログ出力してみると
--
Array
(
    [{"id":"xxx","name":"yyy"}] =>
)
--
という、奇妙な形に。。。

至急、解決したかったので、Inputクラスをapp側で拡張、置換。
以下のメソッドを実装して、凌ぐことにしました。
public static function php_input()
{
    static::$php_input === null and static::$php_input = file_get_contents('php://input');
    return static::$php_input;
}
とりあえず、以下の形で取得できました。
--
{"id":"xxx","name":"yyy"}
--

backbone.jsのmodel.save()の送信値(PHP)

backbone.jsのmodel.save()の送信値は標準入力に入ってくるので、PHPだと以下の方法で取り出します。
$json = json_decode(file_get_contents('php://input'));
echo $json->xxx;
--
追記
file_get_contents('php://input')は一回しか出来ないようですね。
http://php.net/manual/ja/wrappers.php.php
フレームワーク側で勝手にfile_get_contents('php://input')している時は、注意ですね。
--

November 2, 2012

FuelPHPでカバレッジレポートを作成する小物TaskをGitHubに置いておきました。

以下になります。
https://github.com/mp-php/fuel-myapp/blob/master/tasks/coverage.php

php oil r coverage:htmlでhtmlのレポートが作成されます。
第一引数がディレクトリ(デフォルトは"../coverage/")
第二引数がグループ(デフォルトは"App")
となります。

--
追記:
coverage:clover
coverage:text
coverage:php
coverage:all
も追加しておきました。引数はcoverage:htmlと同じです。
--


第一引数のディレクトリに対して削除処理を行った後、レポートを作成します。


--
追記:
暗示的に削除処理を行うのも良くないなーということで、対象ディレクトリ(ファイル)が存在する場合、
-fオプションを付与していないと即時終了するように修正しておきました。
--

IDEの設定ファイル等をGIt管理から避ける為に、プロジェクトを以下の構成にしているので、デフォルトディレクトリも、workと並ぶようにしています。

--
プロジェクトルート/
    work/(ここをGit管理)
    xxx/
    yyy/
    coverage/(今回のtaskで生成するディレクトリのデフォルト)
    その他、IDEの設定ファイル等
--

尚、php oil r coverageとphp oil r coverage:helpでヘルプ表示です。


作る時間よりも、MAMP関係のパスに苦戦してた時間の方が長かった。。。

October 27, 2012

backbone.js関係のソースリンクメモ


jQuery(最新版)
http://code.jquery.com/jquery-latest.min.js
http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js


jQuery(バージョン指定)
http://code.jquery.com/jquery-[version].min.js
http://ajax.googleapis.com/ajax/libs/jquery/[version]/jquery.min.js


underscore.js(GitHub)
https://github.com/documentcloud/underscore

backbone.js(GitHub)
https://github.com/documentcloud/backbone

HTML Escape Helper(Chrome拡張)が便利。

ブログにサンプルのHTMLコードを書く時は、一旦、適当なエスケープサービスサイトに行ってエスケープしてから貼り付けて書いていました。
これが非常に面倒でうんざりしてきたので、Chromeの拡張を探したら、有りました。

HTML Escape Helper
https://chrome.google.com/webstore/detail/html-escape-helper/jbecnlhnhpflhdghljloofiahhdidngj

とても便利です。感謝。
逆変換と、タブの&nbsp; x 4変換が出来ると最高だなー。

backbone.jsでTwitter Bootstrapのdropdown-menuのclickを監視してclickされたliの属性を取得する

メモ。

HTML
<ul class="dropdown-menu">
    <li id="id_xxx">xxx</li>
    <li id="id_yyy">yyy</li>
    <li id="id_zzz">zzz</li>
</ul>

View(backbone)
events:
{
    "click .dropdown-menu li" : "click",
},

//略

click: function(e)
{
    console.log($(e.target).attr("id"));
},

October 21, 2012

FuelPHPのoilが喋りました!!

ホントですw
MAC OS X Mountain Lionで確認しました。
(後半に書きますが、oilが喋るのはMACのみだと思います。)

試しに
--
php oil r yahman --speak
--
としてみて下さい。
(tasks/yahman.phpは存在しない状態で実行して下さいね。)


ソースを確認したところ
packages/oil/classes/command.php
\Cli::option('speak') and `say --voice="Trinoids" "{$e->getMessage()}"`;
が犯人ですw


この愛らしく(?)無駄(!?)な機能は、1.0には無く、1.1で備わったみたいです。
https://github.com/fuel/oil/commit/d783136dc8c7add1b61fbb0cb84156a9cb577d8e
ググってもあまり情報が出てこなかったので、放置されていたのでしょうか。。。


`say --voice="Trinoids" "yahman"`;
とかすれば、意図的に喋らせることが出来ます。


このsayコマンド、MACのコマンドなんですね。

前述の"Trinoids"は声の種類を指定していて、他にもありますね。


ブラウザが急に喋り出して止め方がわからずパニックにさせられるアレですかね??


仕掛けがわかれば大したことはないですし、何の役にも立ちませんが(笑)、
こういった遊び心はイーんじゃないでしょうか。

あと、コントローラとかでやっても喋りませんので、
無駄に企んだりしないようにw


P.S.
oilのhelpを見ると、-tでも喋るとありますが、実際には喋りません。
報告くらいはすべきだろうか。。。

October 15, 2012

さくらインターネットの共用サーバにFuelPHPのoilコマンドをインストールする

さくらインターネットの共用サーバにoilコマンドをインストール出来ました。
以下を参考にさせて頂きました。
さくらインターネットで FuelPHP をインストールするには?


共用サーバなので
http://press.nekoget.com/fuelphp_doc/index.html
のように
$ curl get.fuelphp.com/oil | sh
としても、パーミッションの関係で失敗するので、少し遠回りする必要があります。

以下がその方法になります。
尚、~/.cshrcや~/.profileで~/local/bin/にパスを通してある前提です。



(1) 移動
--
%cd ~/local/bin/
--



(2) ~/local/bin/oilとしてDL
--
%curl get.fuelphp.com/oil > oil
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   244  100   244    0     0    364      0 --:--:-- --:--:-- --:--:--   518
--



(3) ~/local/bin/oilを編集
* bashのパスを変更。
* PREFIXを修正。
* sudoの記述を削除。

以下、diffです。
--
%diff oil.org oil
1c1
< #!/bin/bash
---
> #!/usr/local/bin/bash
3c3
< PREFIX="/usr/bin/"
---
> PREFIX="/home/[username]/local/bin/"
6,7c6,7
< sudo sh -c "curl --silent http://get.fuelphp.com/installer.sh > ${PREFIX}oil"
< sudo chmod +x ${PREFIX}oil
---
> sh -c "curl --silent http://get.fuelphp.com/installer.sh > ${PREFIX}oil"
> chmod +x ${PREFIX}oil
--



(4) ~/local/bin/oilに実行権限を与えて、実行
--
%chmod +x oil
%./oil
--



(5) 再度、~/local/bin/oilを編集
* bashのパスを変更。

以下、diffです。
--
%diff oil.org oil
1c1
< #!/bin/bash
---
> #!/usr/local/bin/bash
--



(6) 好きな場所に移動してoil create xxxする
--
%cd ~/xxx/yyy
%oil create fuelphp
Cloning into './fuelphp'...
remote: Counting objects: 14421, done.
remote: Compressing objects: 100% (5009/5009), done.
remote: Total 14421 (delta 9810), reused 13585 (delta 9179)
Receiving objects: 100% (14421/14421), 2.20 MiB | 643 KiB/s, done.
Resolving deltas: 100% (9810/9810), done.
Submodule 'docs' (git://github.com/fuel/docs.git) registered for path 'docs'
Submodule 'fuel/core' (git://github.com/fuel/core.git) registered for path 'fuel/core'
Submodule 'fuel/packages/auth' (git://github.com/fuel/auth.git) registered for path 'fuel/packages/auth'
Submodule 'fuel/packages/email' (git://github.com/fuel/email.git) registered for path 'fuel/packages/email'
Submodule 'fuel/packages/oil' (git://github.com/fuel/oil.git) registered for path 'fuel/packages/oil'
Submodule 'fuel/packages/orm' (git://github.com/fuel/orm.git) registered for path 'fuel/packages/orm'
Submodule 'fuel/packages/parser' (git://github.com/fuel/parser.git) registered for path 'fuel/packages/parser'
Cloning into 'docs'...
remote: Counting objects: 7747, done.
remote: Compressing objects: 100% (2740/2740), done.
remote: Total 7747 (delta 5252), reused 7282 (delta 4874)
Receiving objects: 100% (7747/7747), 2.26 MiB | 729 KiB/s, done.
Resolving deltas: 100% (5252/5252), done.
Submodule path 'docs': checked out 'dfe62191224b794010e15d1ccf464f2597e3102c'
Cloning into 'fuel/core'...
remote: Counting objects: 24248, done.
remote: Compressing objects: 100% (7339/7339), done.
remote: Total 24248 (delta 16925), reused 23655 (delta 16381)
Receiving objects: 100% (24248/24248), 3.77 MiB | 730 KiB/s, done.
Resolving deltas: 100% (16925/16925), done.
Submodule path 'fuel/core': checked out '61ef4c098485035f4d625d87238e4d408dfa59e5'
Cloning into 'fuel/packages/auth'...
remote: Counting objects: 621, done.
remote: Compressing objects: 100% (410/410), done.
remote: Total 621 (delta 278), reused 549 (delta 211)
Receiving objects: 100% (621/621), 74.91 KiB | 80 KiB/s, done.
Resolving deltas: 100% (278/278), done.
Submodule path 'fuel/packages/auth': checked out 'd5c78ff7e3b1698334747587505d79baf59a3158'
Cloning into 'fuel/packages/email'...
remote: Counting objects: 426, done.
remote: Compressing objects: 100% (250/250), done.
remote: Total 426 (delta 175), reused 414 (delta 164)
Receiving objects: 100% (426/426), 58.61 KiB, done.
Resolving deltas: 100% (175/175), done.
Submodule path 'fuel/packages/email': checked out '6a38100229aa02c905d143c200a0dac5184a174e'
Cloning into 'fuel/packages/oil'...
remote: Counting objects: 1207, done.
remote: Compressing objects: 100% (494/494), done.
remote: Total 1207 (delta 695), reused 1180 (delta 674)
Receiving objects: 100% (1207/1207), 151.56 KiB | 174 KiB/s, done.
Resolving deltas: 100% (695/695), done.
Submodule path 'fuel/packages/oil': checked out 'e0947076c4058104f92d8465ccb82d2ac93f6b72'
Cloning into 'fuel/packages/orm'...
remote: Counting objects: 14665, done.
remote: Compressing objects: 100% (4426/4426), done.
remote: Total 14665 (delta 10152), reused 14514 (delta 10018)
Receiving objects: 100% (14665/14665), 2.10 MiB | 661 KiB/s, done.
Resolving deltas: 100% (10152/10152), done.
Submodule path 'fuel/packages/orm': checked out '42a37ce5d639bc6485b907764280dca3285a2bf9'
Cloning into 'fuel/packages/parser'...
remote: Counting objects: 764, done.
remote: Compressing objects: 100% (368/368), done.
remote: Total 764 (delta 384), reused 710 (delta 334)
Receiving objects: 100% (764/764), 128.80 KiB | 80 KiB/s, done.
Resolving deltas: 100% (384/384), done.
Submodule path 'fuel/packages/parser': checked out 'f85eafe3ed198bf51feb7c3c1c7116aa3a77ea24'
Made writable: /home/xxx/yyy/fuelphp/fuel/app/cache
Made writable: /home/xxx/yyy/fuelphp/fuel/app/logs
Made writable: /home/xxx/yyy/fuelphp/fuel/app/tmp
Made writable: /home/xxx/yyy/fuelphp/fuel/app/config
--

FuelPHPのORMでconditionsを持ったRelationの書き方。

FuelPHPではORMモデルでテーブル間のリレーションを設定出来ます。
例えば
Model_Parent(parentsテーブル)とModel_Child(childrenテーブル)が1:N。
parents.id = children.parent_id。
として
children.gender = 'male' のカラムのみをcreated_atの昇順で取得する$_has_many。
children.gender = 'female'のカラムのみをcreated_atの昇順で取得する$_has_many。
を設定する場合、以下の書き方になります。
(order_byはascの場合、KeyのみでもOKです。)
protected static $_has_many = array(
    'children_male' => array(
        'key_from' => 'id',
        'model_to' => 'Model_Child',
        'key_to' => 'parent_id',
        'cascade_save' => true,
        'cascade_delete' => true,
        'conditions' => array(
            'where' => array(array('gender', '=', 'male')),
            'order_by' => array('created_at' => 'asc'),
        ),
    ),
    'children_female' => array(
        'key_from' => 'id',
        'model_to' => 'Model_Child',
        'key_to' => 'parent_id',
        'cascade_save' => true,
        'cascade_delete' => true,
        'conditions' => array(
            'where' => array(array('gender', '=', 'female')),
            'order_by' => array('created_at' => 'asc'),
        ),
    ),
);
参考:

使い方は、以下の通りです。
$parent = Model_Parent::find($parent_id);
$children_male = $parent->children_male;
$children_female = $parent->children_female;

FuelPHPでUndefined class constant 'MYSQL_ATTR_COMPRESS'

メモです。


FuelPHPで以下のエラーが出たら
ErrorException [ Error ]: Undefined class constant 'MYSQL_ATTR_COMPRESS'

config/db.phpのconnection設定に
--
'compress' => false,
--
を追加。


環境:
FuelPHP(1.3)

参考:


P.S.
ついでにQiitaのFuelPHPタグのフィードを購読するようにしました。
http://qiita.com/tags/FuelPHP/feed.atom

October 8, 2012

do.comは便利かも

do.comというタスク管理サービスを知りました。
https://do.com/

プロジェクト単位でのタスク管理が可能なサービスです。
今のところ、無料で使えるようです。

大分類としてグループがあります。グループは複数作成可能です。
また、グループの中に複数のプロジェクト、複数のタスクを作成可能です。

タスクは、プロジェクトに属しても属さなくても良いみたいです。
なので、グループのみに依存していて、プロジェクトには依存しない。
みたいなタスクが作れます。

共同作業者は、グループ単位とプロジェクト単位で、それぞれ設定可能なようです。

タスクには添付ファイルを付けられます。
面白いのが、Googleドライブ内のファイルを添付出来る点です。
その際、Google側での認証が必要なのですが、
けっこう色々な権限を許可しなければなりませんでした。

なので、メインのGoogleアカウントとサブのGoogleアカウントで
Googleドライブ内の特定のディレクトリを共有。
サブのアカウントでdo.comと連携。の形にしてみました。

これで、do.com側がアクセスできるのはサブのアカウント。
ドキュメントの編集はメインのアカウントでも可能。となります。

ただ、やり取りのサクサク感はchatworkに軍配有りな印象。
do.comは、とりあえず一人で使い込んでみよう。。。

October 4, 2012

FuelPHPのFormatクラスのCSVで囲い文字をダブルクォートでは無くす方法(configファイル未使用)

以下、FuelPHP 1.3で確認しています。

囲い文字という表現が正しいかはさて置き、FuelPHPのFormatクラスは、
CSVの各値がダブルクォートで囲まれている事を前提にしています。

参考:
FuelPHP の Format クラスは CSV が「"」で囲まれることを前提にしている

ソースを見てみると、以下のConfig値が有りました。
* format.csv.newline
* format.csv.delimiter
* format.csv.enclosure
* format.csv.escape
* format.csv.regex_newline

囲い文字のダブルクォートはformat.csv.enclosureになります。

アプリ側で
Config::set('format.csv.enclosure', '')
しても、反応はありませんでした。

理由は、Format::_init()でConfig::load('format', true)している部分です。
アプリ側でsetした値が飛んでしまいます。

app/configディレクトリにformat.phpを置いても良いのですが、
どうも気が進まなかったので、以下の方法で半ば強引にねじ伏せてみました。

(1)
アプリ側でConfig::load('format'true)する。

(2)
アプリ側でConfig::set('format.csv.enclosure', '')する。

(3)
普通にFormatクラスを使う。
ex). $data = Format::forge($data, 'csv')->to_array();

これでOKです。

ポイントは
Config::load($file, $group = null, $reload = false, $overwrite = false)
の$overwriteはfalseがデフォルトである部分です。

アプリ側で先にConfig::load('format'true)して
Format::_init()でのConfig::load('format'true)を無効化する感じです。

--

2012/10/06 追記
$overwriteじゃなくて$reloadかも。

MantisBTのファイルアップロードで関係している値

php.ini:
upload_max_filesize
post_max_size

config_inc.php(MantisBT):
$g_max_file_size

保存先がDB(MySQL)なら、さらに以下。

my.cnf:
max_allowed_packet

max_allowed_packetにほんの少しハマってしまいました。。。
要注意。

September 28, 2012

FuelPHPのAssetクラスとassetsディレクトリ構造

FuelPHPのAssetクラスは主にpublic/assetsディレクトリ内にある
* jsディレクトリ
* cssディレクトリ
* imgディレクトリ
内のjsファイル、cssファイル、画像ファイルに対するHTMLタグを生成するのに使います。

メソッドはそれぞれ
* Asset::js()
* Asset::css()
* Asset::img()
となります。

ただ、例えばjqueryのプラグインを導入した時等、
その中に入っているjs、css、画像ファイルを前述のjs、css、imgディレクトリに
分けて入れてしまっては、メンテナンス性が悪くなる恐れがあります。

個人的には、以下のような感じで、そのまままとめて放り込みたいです。

--
public/
 assets/
  js/
  css/
  img/
  jquery/
   plugin1/
    plugin1.js
    plugin1.css
    plugin1.png
   plugin2/
    plugin2.js
    plugin2.css
    plugin2.png
--

そこで、ドキュメントを参考に
Asset::add_path('assets/jquery/', array('css', 'js', 'img'));
して
Asset::js('plugin1/plugin1.js');
してみたのですが、エラーとなってしまいました。
http://docs.fuelphp.com/classes/asset/usage.html#/method_add_path
http://press.nekoget.com/fuelphp_doc/classes/asset/usage.html#/method_add_path

諦めようかなと思ったのですが、試しに
Asset::add_path('assets/jquery/', 'css');
Asset::add_path('assets/jquery/', 'js');
Asset::add_path('assets/jquery/', 'img');
として
Asset::js('plugin1/plugin1.js');
してみると、うまくいきました。
Asset::css('plugin1/plugin1.css');
もOKでした。
imgメソッドは確認していませんが、たぶんOKでしょう。

Asset::add_path処理を共通化したい場合、各Controllerの親Controllerのbefore()で問題無いですが、
controller_startedイベントで行なっていも良いのかなと思います。
http://docs.fuelphp.com/classes/event.html
http://press.nekoget.com/fuelphp_doc/classes/event.html


--

追記
controller_startedイベントだとRestコントローラの時も通ってしまう??
そのうち確認しておこう。。。

追記2
上記、Restコントローラでも通りました。
イベントクラスの使い所難しいなー。。。

September 15, 2012

FuelPHP1.3のArr::pluckが便利そう。

先日、FuelPHP1.3がリリースされました。

CHANGELOG:

FuelPHP1.3で、Arr::pluckというメソッドが新登場しています。

例えば<select>の選択肢を、とあるテーブルから作る時
* <option>のvalue値をidカラム値
* 表示値をxxxカラム値
のようにしたりしますが、そんな時に役立ちそうです。

August 25, 2012

ZF2のzendgdataパッケージをインストールする

Zend Framework2のzendgdataパッケージをインストールしてみました。

以下、コマンドメモです。

$ mkdir xxx
$ cd xxx/
$ wget http://packages.zendframework.com/pyrus.phar
$ php pyrus.phar . channel-discover packages.zendframework.com
$ php pyrus.phar . install zf2/zendgdata --optionaldeps

次は、これをFuelPHPのpackageでラッピングかなー。

MACにwgetをインストール(リンクメモ)

以下を参考にさせて頂きました。

Mac OS Xにwgetをインストール:
http://d.hatena.ne.jp/lalablog+solr/20120113/1326462739

各バージョン:
http://ftp.gnu.org/gnu/wget/
ftp://ftp.gnu.org/gnu/wget/

August 7, 2012

FuelPHPの小ネタ。Num::bytes()メソッド。

大した話では無いのですが、FuelPHPにはNum::bytes()というメソッドがあります。
これが地味に便利です。

ドキュメント:
http://docs.fuelphp.com/classes/num.html#/method_bytes

ドキュメントに記載されているサンプルの通り、特定の書式の文字列を
バイト数にして返してくれます。

例えばUploadクラスで、Uploadされるファイルのmax sizeを設定できます。
http://docs.fuelphp.com/classes/upload/usage.html#/method_process
この時、バイト数を直接設定しても構いませんが、
0の数が良くわからなくなってくるので、そんな時に役に立ちます。

こういったさりげないメソッドを上手く使えた時って嬉しいですね。

Numクラスは他にも地味で便利なメソッドが多いなー。

August 1, 2012

FuelPHP 2.0-dev のインストールメモ。


調査がてら、少しずつ見ていこうと思います。
とりあえず、macでやってみました。(この内容はOSあまり関係なさそうですが。)

Github:
https://github.com/fuelphp

レポジトリ:
https://github.com/fuelphp/fuelphp

インストール:
git clone https://github.com/fuelphp/fuelphp.git xxx
cd xxx
./composer.phar install

publicディレクトリにアクセスしてみると。


PDT(Eclipse)の設定:
プロジェクトを右クリック > Properties > PHP Interpreter > PHP Version > PHP 5.4

PHP 5.4のローカル環境を整えねば。

July 28, 2012

FuelPHPでProfilerが表示されない件。

自分を含め、ポツポツと遭遇される方がいるようなのでメモしておきます。

FuelPHPでProfilingの設定が正しくされているにも関わらずProfilerが表示されない場合、
まず間違いなく
fuel/core/vendor/phpquickprofiler/display.php
の改行コードがLFでは無いです。

これが原因で、display.phpの以下をスルーしてしまい、ブラウザ側でエラーとなっているはずです。
--
$css = str_replace("\n", "",  ...(略)
--


2012/07/30 追記
上記の$cssは、HTML上にjsのコードとして出力され、その時に改行コードが
残っているとjsのエラーとなり、Profilerが表示されません。

尚、FuelPHPの各ファイルはLFとなっており、この問題が発生するのは
GItの設定や、各種解凍ソフトによる、改行コードの自動変換に起因すると思われます。

pull requestは出してみたのですが、マージはされませんでした。
https://github.com/fuel/core/pull/1083
結論としては、ユーザ側で正しく設定して下さい。(LFにして下さい。)
となります。

確かに、改行コードが絡む問題がたまたまProfilerで発生しただけで
他所で発生し得る可能性も当然あり、そういった意味では当たり前の結果とも思います。

この問題に限っては、あたかもProfilerの設定が間違っているように
見えてしまうのが厄介ではありますが。


2012/07/31 追記
ドキュメントのCoding Standardsにも
--
Line Endings
Line endings should be Unix-style LF.
--
と記載がありました。
http://docs.fuelphp.com/general/coding_standards.html

FuelPHPのORMの$_propertiesでform設定と除外フィールド。その2。



以前、以下の記事を書きました。

FuelPHPのORMの$_propertiesでform設定と除外フィールド。
http://madroom-project.blogspot.jp/2012/07/fuelphpormpropertiesform.html

この方法、以下の問題が発生しましした。
(1) モデルの$_propertiesにvalidationを定義。
(2) $_observersにOrm\Observer_Validationを設定、before_saveで自動実行。
(3) (2)のタイミングで、skip設定したカラムのvalueが消えてしまう。

結果として、例えばskip設定したカラムのvalueが整数型だった場合、
値が飛ぶことにより0がinsertされてしまう。
(結果はMySQLの設定等で異なると思います。)

解決策は、$_propertiesの該当フィールドに対して、
skip設定を使わず、typeにfalseを設定することです。
--
'form' => array('type' => false),
--

参考:
http://docs.fuelphp.com/packages/orm/creating_models.html


P.S.
skip設定は、入力項目上は必要だけどDBには保存しない項目。
という認識でOKなのだろうか。
ボケてました。skip設定したら入力項目に出て来ませんね。

July 21, 2012

FacebookのAPIで画像をアルバムにpostする時、プライバシー設定が効かない。


FacebookのAPIを用いて画像をpostする時に、プライバシー(公開範囲)設定で
少しハマったのでメモしておきます。

ドキュメント:
https://developers.facebook.com/docs/reference/api/post/

FacebookのAPIでpostする時、privacyパラメータで公開範囲の指定が可能です。
* PHPでの例
'privacy' => array(
    'value' => 'CUSTOM',
    'friends' => 'SELF',
),

この時に注意しなければならないのが、前述のドキュメントのprivacy項に記載されている
Note: This privacy setting only applies to ...
の部分。

自アカウントへのpostなら指定されたプライバシー設定を受け付けるが、
他アカウントへのpost時には無視します。みたいな事が書かれています。

Facebookはユーザのみでなく、アルバムや画像にも同等なidを付与する仕様から、
自身が所有するアルバムも、Facebook側では他アカウントとみなすと思われます。

具体的には、ユーザにもアルバムにも画像にも、その他全ての情報(?)に
以下の形式でアクセスが可能な仕様です。
ttps://www.facebook.com/[id]

つまり、自身のidと、自身の所有するアルバムのidは異なり、
他アカウント扱いとなるようです。

なので、このアルバムにこのプライバシー設定で画像をpostする。と処理を書いても、
他アカウントへのpostとして扱われてしまい、そのプライバシー設定は無視される。
(アルバム側の設定に依存する。)
となるのかなーと。

だとすれば納得ですね。。。
誤認識を含んでいたらすみません。

July 15, 2012

FuelPHPのORMの$_propertiesでform設定と除外フィールド。

2012/07/28 追記

当記事の方法は、若干の問題を含みます。
併せて以下も御覧ください。

FuelPHPのORMの$_propertiesでform設定と除外フィールド。その2。
http://madroom-project.blogspot.jp/2012/07/fuelphpormpropertiesform2.html

--

ORMモデルではFieldsetで使用されるformの設定が可能です。

呼び出しは、以下の形式になります。
$fieldset = Fieldset::forge()->add_model('Model_Xxx');
その際、created_atとupdated_atも入力項目として表示されてしまいました。
ちょっと迷走しかけたのですが、skip設定が可能なことを教えて頂き解決しました。
* primary keyは勝手にskipされるので設定不要です。
protected static $_properties = array(
    'id',
    'name' => array(
        'form' => array('type' => 'text'),
    ),
    'created_at' => array(
        'skip' => true,
    ),
    'updated_at' => array(
        'skip' => true,
    ),
);
$_propertiesにはform設定だけでなく、Validation設定も可能なので
上手くここでまとめると便利だろうなー。

July 14, 2012

FuelPHPでMySQLのビューライクなModel_Crud

MySQLのビューみたいなニュアンスのModel_Crudを試してみました。

以下、実験結果です。

テーブルを2つ、適当に用意します。

create table parents
(
    id int not null auto_increment,
    parent_name varchar(255) not null,
    parent_gender enum('male','female') not null,
    primary key (id)
);

create table children
(
    id int not null auto_increment,
    parent_id int not null,
    child_name varchar(255) not null,
    child_gender enum('male','female') not null,
    primary key (id)
);


Modelを用意します。(Model_Crudを継承。)
app/classes/model/dummyview.php

<?php class Model_DummyView extends \Model_Crud {     public static function get() {         $sql = 'select                     c.child_name,                     c.child_gender,                     p.parent_name,                     p.parent_gender                 from                     children as c                 inner join parents as p on p.id = c.parent_id';         return DB::query($sql)->as_object(get_class())->execute()->as_array();     } }

コントローラ等、任意の場所でgetメソッドを呼んで出力してみます。
Debug::dump(Model_DummyView::get());

メリットは
* as_objectで自身にデータをセットすることで、FuelPHP流の処理を継続できること。
* $_propertiesが不要なので、1つのモデルで複数のメソッドを用意できること。

以下の場合に、出番があるかも。
* 複雑なjoin等を必要とする。
* 表示にしか使わない。