githubでフォークしたレポジトリを更新

githubでフォークしたレポジトリってそのままにしていましたが、更新する必要があったので本家の変更を取り込む方法をメモ。

手順

1. フォークしたレポジトリの作成

git clone xxx

2. 本家のレポジトリをリモートに登録

git remote add honke https://git://github.com/xxx.git

3. リモートの確認

git remote
 honke <--- remoteに追加された本家
 origin <--- 自分のgithub上のorigin

4. 本家の更新をローカルに反映(ローカルレポジトリはmaster)

git pull --rebase honke master

5. 自分のmasterを更新

git push origin master

MemoryAnalyzerの使い方

久しぶりの投稿ですが、最近はAndroidのアプリを作ってました。
ちょっと落ち着いたのでMemoryAnalyzerの使い方をまとめておきます。

AndroidiPhoneと違ってGCがあるのでメモリを特に意識しなくてもいいって思ってましたが、変な作り方をするとOutOfMemoryが出てすぐにアプリケーションが落ちます。
そうなる前に、MemoryAnalyzerでメモリをチェックしましょう。

インストール

ここから該当OSのファイルをダウンロードして展開します。
http://www.eclipse.org/mat/downloads.php

Dumpファイルの取得

EclipseでDumpファイルを作成します。

最初にメモリを調査したいアプリケーションをデバックモードで起動します。
次に、DDMS画面のDevicesの中に調査したいアプリケーションが存在するので、選択した状態にします。
「Update Heap」という緑色のタンクアイコンをクリックします。
「Cause GC」ボタンを押すと、今のメモリ状況が表示されます。

アプリケーションの動作チェックとDumpファイルの保存

アプリケーションを動かしてみます。

今回は、ActivityAとActivityBをチェックしてみます。
ActivityAは、メニュー画面。ActivityBは、画像を扱うActivityです。
ActivityAからActivityBへ画面遷移し、ActivityBを終了させた後、ActivityAが表示されます。
ここで、先ほど押した「Cause GC」ボタンを数回押します。(3回程度)
「Dump HPROF file」という緑色のタンクに赤い矢印がついたアイコンをクリックします。
Dumpファイルを任意の場所に保存します。

Dumpファイルの変換

先ほど保存したDumpファイルを下記のコマンドで変換します。

hprof-conv com.android.sample.hprof sample.hprof

Dumpファイルの調査

MemoryAnalyzerを起動します。

File -> Open Heap Dump... から、変換したDumpファイルを読み込みます。

読み込んだら、ダイアログが表示されるので、「Leak Suspects Report」を選択します。

すると、グラフが表示されます。

調査


左から3つ目の「Open Dominator Tree for entire heap」ボタンを押して、ツリーで表示させます。

調査したいオブジェクトを選択し、右クリック -> 「Path To GC Roots」-> 「with all references」を選択します。

すると、そのオブジェクトを参照しているクラスが表示されます。
参照されているとGCされないので、いずれメモリがリークします。そうならないように、参照が終わったら、メモリをきちんと片付けましょう。

rdoc 生成時に js と images が含まれない

環境

ruby 1.9.2p290
rvm 1.10.2

rvm 環境だと起こるようです。

対策

参考サイトに書かれている通り、

vim ~/.rvm/rubies/default/lib/ruby/1.9.1/rdoc/generator/darkfish.rb

    # 154行目
    next if path =~ /#{File::SEPARATOR}\./

を以下に修正

    next if path =~ /#{File::SEPARATOR}\.[^#{File::SEPARATOR}]+$/

再度、rake doc:appをすると js と image がありました。



参考サイト:http://iandeth.dyndns.org/mt/ian/archives/000688.html

rhodesを試す

rubyiOSandroidアプリ開発ができる rhodes(ローズ)を試してみたので、その覚え書き。

rhodesでアプリ開発する前に

ruby1.9系 を使用している人は、rvm とかをいれて ruby のバージョンを切り替えられるようにしておくと良いです。
iphone のアプリを作成したい場合は、iOSSDKとかを入れておく必要があります。
android のアプリを作成したい場合は、JDK(JavaDevelopmentKit)、SDK(SoftwareDevelopmentKit)、NDK(NativeDevelopmentKit)を入手しておく必要があります。

rhodesのインストール

まずは、gemでrhodesをインストールします。
ruby のバージョンは、1.8.7 を使用。

 # gem install rhodes

あっという間にインストールされます。
rhodes は、3.3.1 をインストールしました。

rhodesのセットアップ

JDKとかSDKのパスを登録します。(iPhoneSDKは自動で認識するようです)
androidを開発しない場合は、JDKとかのパスはブランクのままEnterでOK。

 $ rhodes-setup
 > JDK path (required) (/Library/Java/Home): ブランクのままEnter
 > Android SDK path (blank to skip) (): /Users/xxxx/android-sdk-mac_x86 ・・・パスを入力してEnter 
 > Android NDK path (blank to skip) (): /Users/xxxx/android-ndk-r7 ・・・パスを入力してEnter
 > Windows Mobile 6 SDK CabWiz (blank to skip) (): ブランクのままEnter
 > BlackBerry JDE 4.6 (blank to skip) (): ブランクのままEnter
 > BlackBerry JDE 4.6 MDS (blank to skip) (): ブランクのままEnter
 > BlackBerry JDE 4.2 (blank to skip) (): ブランクのままEnter
 > BlackBerry JDE 4.2 MDS (blank to skip) (): ブランクのままEnter

アプリケーションの作成

rhogen コマンドでアプリケーションを作成します。
railsみたいですね。

 $ rhogen app sample
 > Generating with app generator:
 >      [ADDED]  sample/app/loading.png
 >      [ADDED]  sample/rhoconfig.txt
 >      [ADDED]  sample/build.yml
 >      [ADDED]  sample/.gitignore
 >      [ADDED]  sample/app/application.rb
 >      [ADDED]  sample/app/index.erb
 >      [ADDED]  sample/app/index.bb.erb
 >      [ADDED]  sample/app/layout.erb
 >      [ADDED]  sample/app/loading.html
 >      [ADDED]  sample/Rakefile
 >      [ADDED]  sample/app/helpers
 >      [ADDED]  sample/icon
 >      [ADDED]  sample/app/Settings
 >      [ADDED]  sample/public

次にモデルを作成してみましょう。

 $ rhogen model user name,tel,email
 > Generating with model generator:
 >      [ADDED]  app/User/index.erb
 >      [ADDED]  app/User/edit.erb
 >      [ADDED]  app/User/new.erb
 >      [ADDED]  app/User/show.erb
 >      [ADDED]  app/User/index.bb.erb
 >      [ADDED]  app/User/edit.bb.erb
 >      [ADDED]  app/User/new.bb.erb
 >      [ADDED]  app/User/show.bb.erb
 >      [ADDED]  app/User/user_controller.rb
 >      [ADDED]  app/User/user.rb
 >      [ADDED]  app/test/user_spec.rb

index.erbの最下部のリンクを編集して保存。

 $ vi app/index.erb
 ---------------------------------------------
<li><a href="#">Add link here...</a></li>
↓
<li><a href="/app/User/index">UserList</a></li>
 ---------------------------------------------


環境に合わせてbuild.ymlを編集します。

 $ vi build.yml
 ---------------------------------------------
android:
  version: 2.1
 ↓
android:
  version: 2.2
 ---------------------------------------------

以上で準備完了です。

アプリケーションの起動

androidの場合

 $ rake run:android

iPhoneの場合

 $ rake run:iphone


ビルドに少し時間はかかりますが、シュミレーターでアプリケーションが立ち上がりました。
全ての機能が使えるわけではありませんが、rails感覚でスマートフォン開発ができるのはいいですね。

2012/2/9 追記

標準のシュミレーターを立ち上げる方法を教えてもらいました。(ビルドしないので立ち上がりが速いです)
通常のシュミレーターを立ち上げるコマンドに、「:rhosimulator」を付与します。

 $ rake run:iphone:rhosimulator

rails3のroutes

rails3 で pathprefix を指定する場合は、namespace を使用します。

$ vi config/routes.rb
------------------------------------------------
namespace :admin do
  resources :users
end
------------------------------------------------

この場合、パスは、/admin/users、コントローラーは、app/controllers/admin/users_controller.rb に置かれたAdmin::UsersControllerとなります。


もしパスだけに名前空間をつけたい場合は、scope を使用します。

$ vi config/routes.rb
------------------------------------------------
scope "/admin" do
  resources :users
end
------------------------------------------------

この場合、パスは、/admin/users、コントローラーは、app/controllers/users_controller.rb に置かれたUsersControllerとなります。

反対にコントローラーだけに名前空間をつけたい場合は、scope :moduleを使用します。

$ vi config/routes.rb
------------------------------------------------
scope :module => "admin" do
  resources :users
end
------------------------------------------------


参考:http://irohiroki.com/2010/08/29/rails3-routes

xen環境構築

xenの環境構築手順

環境

OS : Debian(squeeze)

xenのインストール

必要なものをaptでインストールします。

# aptitude update
# aptitude install bridge-utils debootstra
# aptitude install xen-linux-system-2.6.32-5-xen-amd64
# aptitude install xen-tools
# aptitude install linux-headers-2.6.32-5-common-xen

xend-config.sxpの編集

# cp -p /etc/xen/xend-config.sxp /etc/xen/xend-config.sxp.orig
# vi /etc/xen/xend-config.sxp

------------------------------------------------
# (network-script network-bridge)
↓
 (network-script network-bridge)
------------------------------------------------

grubの修正

起動順番を変更します。

まずは現状をチェック。

$ grep menuentry /boot/grub/grub.cfg

------------------------------------------------
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-xen-amd64' --class debian --class gnu-linux --class gnu --class os {
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-xen-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64' --class debian --class gnu-linux --class gnu --class os {
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-xen-amd64 and XEN 4.0-amd64' --class debian --class gnu-linux --class gnu --class os --class xen {
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-xen-amd64 and XEN 4.0-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os --class xen {
------------------------------------------------

何もしないとDebian GNU/Linux, with Linux 2.6.32-5-xen-amd64が起動します。

Debian GNU/Linux, with Linux 2.6.32-5-xen-amd64 and XEN 4.0-amd64が通常起動するように修正します。

# mv -i /etc/grub.d/10_linux /etc/grub.d/21_linux
# update-grub

------------------------------------------------
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.32-5-xen-amd64
Found initrd image: /boot/initrd.img-2.6.32-5-xen-amd64
Found linux image: /boot/vmlinuz-2.6.32-5-xen-amd64
Found initrd image: /boot/initrd.img-2.6.32-5-xen-amd64
Found linux image: /boot/vmlinuz-2.6.32-5-amd64
Found initrd image: /boot/initrd.img-2.6.32-5-amd64
done
------------------------------------------------

起動順番を確認。

$ grep menuentry /boot/grub/grub.cfg

------------------------------------------------
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-xen-amd64 and XEN 4.0-amd64' --class debian --class gnu-linux --class gnu --class os --class xen {
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-xen-amd64 and XEN 4.0-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os --class xen {
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-xen-amd64' --class debian --class gnu-linux --class gnu --class os {
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-xen-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64' --class debian --class gnu-linux --class gnu --class os {
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {
------------------------------------------------

Debian GNU/Linux, with Linux 2.6.32-5-xen-amd64 and XEN 4.0-amd64が最初に起動されるようになりました。

save/restore動作の変更

xenの終了時にログを残さないようにします

# vi /etc/default/xendomains

------------------------------------------------
#XENDOMAINS_RESTORE=true
XENDOMAINS_RESTORE=false

#XENDOMAINS_SAVE=/var/lib/xen/save
XENDOMAINS_SAVE=""
------------------------------------------------

再起動

# reboot

再起動後にxm listを実行してみます

# xm list

------------------------------------------------
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  7192     8     r-----      9.1
------------------------------------------------

これでDomain-0が完了しました。

Domain-U (guests)作成ファイルの修正

# vi /etc/xen-tools/xen-tools.conf

環境に合わせて変更します。
------------------------------------------------ 
size   = 50Gb      # Disk image size.
memory = 512Mb    # Memory size
swap   = 2Gb    # Swap size
 
# Default gateway and netmask for new VMs
gateway    = x.x.x.x
netmask    = 255.255.255.0
 
# When creating an image, interactively setup root password
passwd = 1
 
# Let xen-create-image use pygrub, so that the grub from the VM is used, which means you no longer need to store kernels outside the VMs. Keeps things very flexible.
pygrub=1
------------------------------------------------

Domain-Uの作成

ipアドレスとホスト名を指定して実行します。

# xen-create-image --ip xxx.xxx.xxx.xxx --hostname hoge --passwd

これでDomain-Uが作成できました。

Domain-Uの自動起動

Domain-0が起動した際に自動で起動するように設定します。
Domain-0での作業します。

起動ファイルをxen-ryutekiとします。
xendが起動した後に起動するようにして、xendが終了するよりも前に終了するようにします。

# vi /etc/init.d/xen-ryuteki
------------------------------------------------
#!/bin/sh
### BEGIN INIT INFO
# Provides: xen-ryuteki
# Required-Start: $network xend
# Required-Stop: xend
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: xen-ryuteki start/stop script
# Description: Start and stop xen-ryuteki
# placed in /etc/init.d.
### END INIT INFO

domain=ryuteki

case "$1" in
  start)
    xm create ${domain}.cfg
    ;;

  stop)
    xm shutdown $domain
    ;;

  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;

esac
------------------------------------------------

自動起動の設定

# update-rc.d xen-ryuteki defaults

参考URL

こちらを参考にしました。
http://wiki.debian.org/Xen

ruby1.9.2 で opensslがインストールできない

久しぶりにサーバーを構築していたらこんな問題に遭遇。

環境

OS : debian
ruby1.9.2 p290
rubyはソースからインストールしました。

opensslのインストール

rubyのopensslフォルダに移動

$ cd src/ruby-1.9.2-p290/ext/openssl/
$ ruby extconf.rb

すると、こんなエラーが。

=== OpenSSL for Ruby configurator ===
=== Checking for system dependent stuff... ===
checking for t_open() in -lnsl... no
checking for socket() in -lsocket... no
checking for assert.h... yes
=== Checking for required stuff... ===
checking for openssl/ssl.h... no
=== Checking for required stuff failed. ===
Makefile wasn't created. Fix the errors above.

ググったらこんな情報を発見。
http://www.kano4.com/259

libssl-dev というものが必要のよう。
やってみる。

# aptitude install libssl-dev


その後は、順調にインストールが完了しました。

$ cd src/ruby-1.9.2-p290/ext/openssl/
$ ruby extconf.rb
$ make
# make install

貴重な情報ありがとうございました。