「 2014年03月 」一覧

Ubuntuで EGL使えるか?

先日NVIDIAのドライバをインストールした Ubuntu ですが、なんとEGLやGLES2についてのライブラリをもっているようでした。(331.20ではダメだった・・・)

これは X 上で EGL & GLES2が使えるんじゃないかと思い試してみることにしました。

続きを読む


NVIDIAドライバのインストール(Ubuntuにて)

Ubuntuで NVIDIA からドライバダウンロードしてきて最新版を追いかける人向けの内容です。今回は NVIDIA-Linux-x86_64-331.49 ドライバを用いての内容です。作業開始前にドライバはダウンロードしておきましょう。

まず Xサーバー関係の開発用パッケージのインストールをしておきます
sudo apt-get install xserver-xorg-dev

/etc/default/grub を開いて、GRUB_CMDLINE_LINUX_DEFAULT の行を編集

sudo grub-mkconfig -o /boot/grub/grub.cfg を実行

Xサーバーの停止
sudo /etc/init.d/lightdm stop

ここから ssh でつないでコンソールで作業.

このような結果になったらパッケージを削除していきます。

sudo apt-get --purge remove xserver-xorg-video-nouveau
sudo apt-get --purge remove nvidia-319 nvidia-common nvidia-settings-319

システムを再起動します。
再起動後再び Xサーバーを停止します。
sudo /etc/init.d/lightdm stop

再びコンソールでの作業をしたいので ssh 経由で作業します。
ここの段階までにNVIDIAからドライバをダウンロードしておいてください。

ダウンロードしたファイルの場所で、下記コマンドを実行します.

sudo sh NVIDIA-Linux-x86_64-331.49.run

Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 331.49..........................................

インストールを手順に沿って進めた後、再起動します。

インストール後うまくXが起動したら、NVIDIA X Server Settings を開いてみます。
(これは検索してみつけます)
いわゆるNVIDIAコントロールパネルですが、これでインストールしたドライバになっているかどうか確認して下さい。


WiFi経由でadb接続

防水キャップの都合もあるので頻繁に microUSB の接続をしたくなかったので、WiFi経由によるadb接続を試してみました。

手順

いくつか解説サイトがあるもののあまりうまくいかなかったので、自分なりの方法でうまくいった手順をここで紹介したいと思います。

  1. USBケーブルでPCとスマホを接続する
  2. adb tcpip 5555 とコマンドを入力する
  3. USBケーブルを外す
  4. adb connect IPアドレス:5555 とコマンドを入力する

ポート番号 5555 は任意の番号に変えても大丈夫そうです。
また指定するIPアドレスは端末上で取得できているIPアドレスを指定します。

一度USB接続をしてadbコマンド発行、というのが最初の手順として必要そうな気配でした。
注意点としては、端末がスリープ状態に陥ると通信できなることです。そのため、「充電中はスリープしない」オプションを有効にして、充電させつつ使うとかにする感じですね。
幸い Z1 Compactは USBとは別に充電できるので、これで開け閉めすることなく目的を果たせそうです。


XPERIA Z1 Compact の初期イメージ取得&リストアについて

Z1 Compact を用いて初期イメージの取得&リストアをやってみました。
自分が辿った記録を残しておきますが、この手順は推奨するものではありません。同じようにやる方も自己責任において作業するようにしてください。
起動しなくなったとか破壊されてしまったとか、そういった症状が出てしまっても当方は一切の責任を負いません。

初期ロムイメージの取得&作成

色々と実験するまえには、初期イメージを取得&作成しておき、いざというときに元に戻せるように準備しておきます。これらには以下のソフトウェアを使用します。

  • Sony Mobile Update Service
  • FlashTool

Sony Mobile Update Service のインストール

http://www.sonymobile.co.jp/support/software/updateservice/
ここから Sony Mobile Update Service と呼ばれるソフトウェアをダウンロードして、インストールします。「Xperia SO-01BおよびスマートワイヤレスステレオヘッドセットMW1用」とかありますが、気にせずにインストールします。

sony-update-service-1

以下の画面が現れたら、Z1f を選択します。
最近ダウンロードしたものだと Z2 すら候補にでているようです。

sony-update-service-2

画面の指示に従い、XPERIA Z1f を操作してPCに接続します。
(ボリュームダウンのボタンを押しつつ、PCと接続するらしい)

接続後、同意するにチェックを入れて続行します。

sony-update-service-3

sony-update-service-4
インストールしたフォルダ内を確認してみます。

(インストールした場所)\Sony Mobile\Update Service\db\13740270\blob_fs
このフォルダの中に、FILE_**** というファイルが存在していると思います。
これらを適当な場所にコピーしておきます。

自分の場合には、以下の4つのファイルができていました。

  • FILE_279914849
  • FILE_280597449
  • FILE_280611813
  • FILE_280734528

FlashToolのインストール

http://www.flashtool.net/index.php
ここから、FlashTool をダウンロードします。
試したバージョンは、 flashtool-0.9.14.0-windows.exe です。
FlashToolを起動して、 メニューの Tools/SEUS Decrypt を選択します。
なお起動する際には、32bit/64bitで実行体が違うようなので環境にあった物を起動してください。

flashtool-1

メニュー選択後には、先ほどの FILE_**** をコピーしたフォルダを選択するウィンドウが表示されます。
ファイル項目が出てくると思いますので、これを全て右側に移して、convertボタンを押します。ここでしばらく時間がかかることがあります。

ファイルの解析が終わるとファイル選択の画面が出てきます。
ここで、 Branding, Version の部分に任意の文字列を入力します。
Deviceの部分はダブルクリックすると候補を選べるようになっています。

まず左側に出ているファイル名を全て右側に移します。
その後、下記に示す一部のファイルを除外(左側へ戻す)します。

  • partition-image.sin
  • simlock.ta (存在すれば)

ここまでの作業をやった結果の状態は以下のような感じになります。

flashtool-2

そして、Createボタンを押します。
しばらく待っているとログの中で Bundle creation finished と表示されると思います。
これが出たら完了です。
FlashToolのインストールフォルダの中に firmwares というフォルダがあり、この中にftf というファイルができているかと思います。
自分の環境では、以下のファイルができあがっていました。

  • D5503_14.2.A.1.114_unbrand.ftf
  • D5503_14.2.A.1.114_unbrand.ftf.torrent
  • X10_V1_BLRelock.ftf

・・・おそらく torrent ファイルは不要だと思います。

ここまでの作業で、初期ファームウェアのイメージファイルが完成です。

リストアの確認

よくバックアップだけ取得して、リストアの確認をしなかったりします。
リストアの処理まで確認できてようやく意味あるバックアップとなるので、ここで確認しておきます。

FlashTool を起動します。
起動後、稲妻のアイコンをクリックします。
続いて、Flashmode を選択します。

flashtool-3

うまくいっていれば Firmware の項目で先ほど入力したものが並んでいると思います。
ここでは D5503 デバイスを選択して、Wipe 項目全てにチェックを入れてリストアを行ってみます。

flashtool-4

Flashボタンを押します。ちょっと準備に時間がかかるようです。
準備ができると以下のような画面になるので、電源をOFFにした状態のデバイスを
ボリュームダウンボタンを押しながら、microUSBを接続します。

flashtool-5

データ復旧(リストア)作業中は以下のような感じです。
緑のバーが右側に到達し、Flashing finished と表示されれば処理完了です。

flashtool-6

最後に、端末の電源を入れて正常に起動するかを確認して作業完了です。
これでいざというときに、元に戻す準備が整いました。

参考

これらの作業を行う際には、下記のサイトを参考にさせてもらいました。
http://blog.redbox.ne.jp/xperia-z1f-so-02f-root.html


Z1 Compact で ndk-gdb を試す

XPERIA Z1f というか Z1 Compact を接続できるようになったので、早速ネイティブデバッグができるかどうかを試してみたいと思います。
一番の心配事はこの端末が Android 4.3 を標準で採用しており、以前の記事にもあったように 4.3 では複数の端末でデバッグできないという状況になっている点です。

早速 hello-jni サンプルを用いて、デバッグ接続がうまくできるか確認してみます。
Java側でブレークポイント設定しておいて、そのときに ndk-gdb を起動させてみたのがこちらになります。

xperia-z1comact-1

予想に反して、うまくndk-gdb 接続できており、ネイティブデバッグが使用可能でした。gdbコマンドを実行してブレークポイントを設定して、そのときのコールスタック情報を確認することもできました。

xperia-z1comact-2

一応、/proc の下を確認してみたいと思います。前回と同様に調査してみます。

u0_a210   16498 398   859000 20328 ffffffff 00000000 S com.example.hellojni
u0_a210   17151 10691 592    316   ffffffff 00000000 S lib/gdbserver
shell@D5503:/ $ run-as com.example.hellojni
run-as com.example.hellojni
shell@D5503:/data/data/com.example.hellojni $ cd /proc/16498
cd /proc/16498
shell@D5503:/proc/16498 $ ls -l
ls -l
dr-xr-xr-x u0_a210  u0_a210           2014-03-15 13:00 attr
-r-------- u0_a210  u0_a210         0 2014-03-15 12:41 auxv
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 cgroup
--w------- u0_a210  u0_a210         0 2014-03-15 13:00 clear_refs
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 12:40 cmdline
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 comm
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 coredump_filter
lrwxrwxrwx u0_a210  u0_a210           2014-03-15 13:00 cwd -> /
-r-------- u0_a210  u0_a210         0 2014-03-15 13:00 environ
lrwxrwxrwx u0_a210  u0_a210           2014-03-15 12:41 exe -> /system/bin/app_process
dr-x------ u0_a210  u0_a210           2014-03-15 13:00 fd
dr-x------ u0_a210  u0_a210           2014-03-15 13:00 fdinfo
-r-------- u0_a210  u0_a210         0 2014-03-15 13:00 io
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 limits
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 loginuid
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 maps
-rw------- u0_a210  u0_a210         0 2014-03-15 12:41 mem
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 mountinfo
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 mounts
-r-------- u0_a210  u0_a210         0 2014-03-15 13:00 mountstats
dr-xr-xr-x u0_a210  u0_a210           2014-03-15 13:00 net
dr-x--x--x u0_a210  u0_a210           2014-03-15 13:00 ns
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 12:40 oom_adj
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 oom_score
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 oom_score_adj
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 pagemap
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 personality
lrwxrwxrwx u0_a210  u0_a210           2014-03-15 13:00 root -> /
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 sched
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 schedstat
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 sessionid
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 smaps
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 stack
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 12:40 stat
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 statm
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 status
dr-xr-xr-x u0_a210  u0_a210           2014-03-15 12:40 task
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:00 wchan
shell@D5503:/proc/16498 $
shell@D5503:/proc $ cd ../17151
cd 17151
shell@D5503:/proc/17151 $ ls -l
ls -l
dr-xr-xr-x u0_a210  u0_a210           2014-03-15 13:06 attr
-r-------- u0_a210  u0_a210         0 2014-03-15 13:06 auxv
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 cgroup
--w------- u0_a210  u0_a210         0 2014-03-15 13:06 clear_refs
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 12:41 cmdline
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 comm
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 coredump_filter
lrwxrwxrwx u0_a210  u0_a210           2014-03-15 13:06 cwd -> /data/data/com.example.hellojni
-r-------- u0_a210  u0_a210         0 2014-03-15 13:06 environ
lrwxrwxrwx u0_a210  u0_a210           2014-03-15 13:06 exe -> /data/app-lib/com.example.hellojni-2/gdbserver
dr-x------ u0_a210  u0_a210           2014-03-15 13:06 fd
dr-x------ u0_a210  u0_a210           2014-03-15 13:06 fdinfo
-r-------- u0_a210  u0_a210         0 2014-03-15 13:06 io
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 limits
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 loginuid
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 maps
-rw------- u0_a210  u0_a210         0 2014-03-15 13:06 mem
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 mountinfo
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 mounts
-r-------- u0_a210  u0_a210         0 2014-03-15 13:06 mountstats
dr-xr-xr-x u0_a210  u0_a210           2014-03-15 13:06 net
dr-x--x--x u0_a210  u0_a210           2014-03-15 13:06 ns
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 12:41 oom_adj
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 oom_score
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 oom_score_adj
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 pagemap
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 personality
lrwxrwxrwx u0_a210  u0_a210           2014-03-15 13:06 root -> /
-rw-r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 sched
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 schedstat
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 sessionid
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 smaps
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 stack
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 12:41 stat
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 statm
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 status
dr-xr-xr-x u0_a210  u0_a210           2014-03-15 12:41 task
-r--r--r-- u0_a210  u0_a210         0 2014-03-15 13:06 wchan

正常なパーミッションとなっていることが確認できました。
当然この maps を確認してみると・・・(一部抜粋)

shell@D5503:/proc/16498 $ cat maps

70d6a000-70d6d000 r-xp 00000000 b3:19 292071     /data/app-lib/com.example.hellojni-2/libhello-jni.so
70d6d000-70d6e000 r--p 00002000 b3:19 292071     /data/app-lib/com.example.hellojni-2/libhello-jni.so
70d6e000-70d6f000 rw-p 00003000 b3:19 292071     /data/app-lib/com.example.hellojni-2/libhello-jni.so

shell@D5503:/proc/17151 $ cat maps
cat maps
00008000-00046000 r-xp 00000000 b3:19 292072     /data/app-lib/com.example.hellojni-2/gdbserver
00047000-00049000 rw-p 0003e000 b3:19 292072     /data/app-lib/com.example.hellojni-2/gdbserver
00049000-0004d000 rw-p 00000000 00:00 0
00966000-0097a000 rw-p 00000000 00:00 0          [heap]
b6f57000-b6f58000 r--p 00000000 00:00 0
b6f58000-b6f70000 r--s 00000000 00:0c 6131       /dev/__properties__

このようになっており、自身のsoの情報も確認できました。どおりで正常にデバッグできる訳です。

Android 4.3 搭載で初めてネイティブデバッグ(ndk-gdb)が動く端末に出逢いました。運がよかったと思います。


Xperia Z1fというかZ1Compact 到着

愛用していた GalaxyS2 もそろそろ限界を感じ始めたので、とうとう XPERIA X1f に乗り換えてみることにしました。今回もまたグローバルモデルを購入したので、Z1f は海外版では Z1 Compact という名称となっておりこちらを購入しました。

ちなみに限界を感じ始めた、というのはあくまで開発者視点で、という意味で、単にメールやブラウザといった日常用途では全然問題は無いです。OpenGL ES 3.0 や豊富なGL拡張、クアッドコア、といった点で使ってみたい!と思っている自分にとっては、ということなので一般ユーザーはまだまだS2で十分かもしれません。

早速 XPERIA Z1Compact について環境セットアップなどしてみました。
まず搭載されているAndroidのバージョンは 4.3 でした。
また変な言語ロケールでしたが、日本語も選ぶことができたのでこの点は問題ないようです。Android 4から国際版でも日本語が入るようになった、とか聞いたような。

開発者モードを有効にすべく、ビルドバージョンを連続タップして、開発者向けオプションを出現させます。
その後 USB デバッグを有効にしておきます。

adbで接続するために、ドライバのinfを書き換えておきます。
手元の端末では下記のような記述を android_winusb.infに追加して、ドライバインストールを行いました。

;SONY XPERIA Z1 Compact
%SingleAdbInterface%        = USB_Install, USB\VID_0FCE&PID_51A7
%CompositeAdbInterface%     = USB_Install, USB\VID_0FCE&PID_51A7&MI_01

ここまでは割と一般的な内容ですが、一応VID,PIDなど inf をさらしてみました。

次回は開発者用としてどこまで動くか?を調べてみたいと思います。


Galaxy S4 (GT-I9505)に Kitkat をいれてみた

以前 Android 4.3 (JB) を入れてしまった Galaxy S4 でデバッグができない!と嘆いていましたが、最近 KitKat (4.4) のファームウェアが公開されたのでこれを導入してみることにしました。

4.3が入った状態のものについて、もう少し状況を説明しておきます。工場出荷状態では 4.2 だったようですが、これを 4.3へと上げてしまったところ、ダウングレードできない状態となっていました。また、ダウンロードモードに入ったときでも、”Write Protection: Enable” という表示が出るようになってしまい、ネイティブデバッグを必要とするような状況で開発機として使うには向かない状態となっていました。

KitKat のインストール

先に結果ですが、バージョンアップは成功しました。その結果 Kitkat(4.4.2)がインストール成功しました(Write Protection: Enableと表示されている状況のまま更新はできた)。
かるく作業の流れを書いておきますが、詳しくは検索してもっと親切なサイトをみたほうがよいと思います・・・。

使用したのは odin 3.09 です。また使用したファームは、I9505XXUFNB8_I9505OXAFNB8_DBT.zip です。
このzipを展開して I9505XXUFNB8_I9505OXAFNB8_I9505XXUFNB8_HOME.tar.md5 というファイルができあがるので、これをodinの AP ボタンを押してファイル選択しておきます。

Galaxy S4をダウンロードモードにして PCに接続してデバイスマネージャーから確認しておきます。?マークが出ていたりしてデバイスが正常に認識できていない場合、ファームの更新は行えないので対象となるUSBドライバをインストールして認識できるようにしておきます。(SAMSUNG USB Driver for MobilePhones というものがあるので).
adbが使えるようになっているからこのドライバも適用済み、とは限らないので開発者であってもドライバインストールすることになる可能性があります。

うまくいくと、odin3 の画面で COM:** というような表記で認識していることがわかります。これが出ていない場合認識されていないので認識できるように設定して下さい。

認識できていればあとはSTARTボタンを押して、しばらく放置します。
うまくいくと書き込み終了後にはデバイスがリブートして、新システムで起動してきます。

書き込み成功したときには odin はこんな感じで表示されています。

odin3-kitkat

また起動後の Galaxy S4 のほうでのOSバージョン確認画面ではこんな感じです。

galaxy-s4-kitkat

ndk-gdb の動作確認

hello-jni のサンプルを起動させて ndk-gdb-py にて接続してみたときを前回と同様に確認してみます。

$ adb shell
$ run-as com.example.hellojni
$ ls -l
ls -l
drwxrwx--x u0_a202  u0_a202           2013-01-10 21:12 cache
srwxrwxrwx u0_a202  u0_a202           2014-03-08 21:05 debug-socket
lrwxrwxrwx install  install           2014-03-08 19:09 lib -> /data/app-lib/com.
example.hellojni-1

$ ls -l /proc/19315  # gdbserverのPIDが 19315 だったので.
dr-xr-xr-x u0_a202  u0_a202           2014-03-08 21:10 attr
-r-------- u0_a202  u0_a202         0 2014-03-08 21:10 auxv
-r--r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 cgroup
--w------- u0_a202  u0_a202         0 2014-03-08 21:10 clear_refs
-r--r--r-- u0_a202  u0_a202         0 2014-03-08 21:05 cmdline
-rw-r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 comm
-rw-r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 coredump_filter
lrwxrwxrwx u0_a202  u0_a202           2014-03-08 21:10 cwd -> /data/data/com.exa
mple.hellojni
-r-------- u0_a202  u0_a202         0 2014-03-08 21:10 environ
lrwxrwxrwx u0_a202  u0_a202           2014-03-08 21:10 exe -> /data/app-lib/com.
example.hellojni-1/gdbserver
dr-x------ u0_a202  u0_a202           2014-03-08 21:10 fd
dr-x------ u0_a202  u0_a202           2014-03-08 21:10 fdinfo
-r--r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 limits
-rw-r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 loginuid
-r--r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 maps
-rw------- u0_a202  u0_a202         0 2014-03-08 21:10 mem
-r--r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 mountinfo
-r--r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 mounts
-r-------- u0_a202  u0_a202         0 2014-03-08 21:10 mountstats
dr-xr-xr-x u0_a202  u0_a202           2014-03-08 21:10 net
dr-x--x--x u0_a202  u0_a202           2014-03-08 21:10 ns
-rw-r--r-- u0_a202  u0_a202         0 2014-03-08 21:05 oom_adj
-r--r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 oom_score
-rw-r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 oom_score_adj
-r--r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 pagemap
-r--r--r-- u0_a202  u0_a202         0 2014-03-08 21:10 personality
lrwxrwxrwx u0_a202  u0_a202           2014-03-08 21:10 root -> /

以前の4.3の時と比べてうまくパーミッションの設定ができているようです。
これなら ndk-gdb の接続がうまくいくのも納得です。
(記事中では書いていませんが、ちゃんとブレークポイントを設定できることも確認してみました)。

まとめ

無事にネイティブデバッグができる端末として復活できた Galaxy S4 で、一安心です。4.3バージョンでは色々と問題があちこちで起こっているようなので、どの端末も 4.4 が使えるようになるといいなと思います。
また、この S4 ですが実は友人のもので、快くfirmwareの更新を許可してくれたことにとても感謝しています。


TortoiseGit で自分リポジトリを公開 その2

自分の作業用ローカルリポジトリでコード編集などしていて、中央サーバーにあげるまでもないが、他ユーザーに公開したいということがあります。前回はそれで git daemon の機能で公開を試みた、という感じだったのですが、ちょといまいちな結果で終わってしまいました。

結局公開用リポジトリを作業用PCに準備して、それを他ユーザーに公開する、という流れになるわけですが、作業用ローカルリポジトリ作成した段階ではどこからcloneしたわけでもなかったりするので、まずは作業用ローカルリポジトリから、公開用リポジトリを作成することが必要になってきます。

そのコマンドは以下のようになります。

これで作業用から公開用を作成することができます。
またこれと同じことを tortoiseGit でやるためには Clone メニューから下記のような感じで設定することでできます。

tortoisegit-clone

あとはこの公開用リポジトリパスを公開設定すればOKです。
Windowsなら、Windowsのファイル共有で公開してしまう方法が、楽だとおもいます。

受け取る側もこのWindowsファイル共有上でのファイルパス情報をもらって、cloneすることができます。
コマンドライン git でやる場合の注意点としては、パス区切りとしての円マーク(¥)を / を使わないといけないことでしょうか。tortoiseGitの場合には、このあたりはWindowsパス文字列で問題ないようです。

Linuxからアクセスするには

Windowsファイル共有で公開した場合には、Linux側でこのフォルダを cifs ファイル共有としてローカルにマウントしてしまうのがよいと思います。
このとき、rootのみファイル書き込み権限があるためにマウント時には少々オプションが必要になります。

パスワード制限されていたりするとユーザー名&パスワードの情報が必要になります。またマウント後、対象ディレクトリが書き込みできるかどうかパーミッションを確認しておくことが必要です。
問題が無ければ、このマウントしたパスから git clone することでリポジトリのcloneができます。ここまでできればpushもうまくできるようです。


TortoiseGit で自分リポジトリを公開(daemon機能)

約1年くらい前からgitを触り始めました。よくわからない状態から始めて、1人で黙々と機能を触っていただけだったのですが、ブランチ作ってコミット&プッシュ、Subversionとの連携として使うなどまではそれなりにやれるようになりました。
 最近Mercurialを使って作業をすることがあったのですが、この1年ほどのgitでの経験に色々と助けられた気がします。特にSubversion使用時の時の考え方から分散リポジトリ系への考え方への頭の切り替えが学習コストの大きいものだったと思います。

さて、Mercurial では自分のリポジトリを簡単に公開することが可能でした。TortoiseHg を使ってですが、ウェブサーバーの機能をGUI上から起動することができ、他のユーザーとのやりとりがすごく楽でした。恐ろしいことに公開したリポジトリ(しかも自分の作業用)は、他のユーザーからのPushも受け取ることができるという点です。これは設定次第でできることで、デフォルトは読み込みだけできるような制限付きで公開されます。

 同じことが Git でもできると便利だなと思ったので調べてみたのが今回の内容となります。

Gitでリポジトリ公開

これからの内容はWindows限定とします。また比較的新しいgit,tortoiseGit を使っている前提とします。

  • tortoiseGit 1.8.7
  • Git 1.8.5.2 (or 1.9.0)
  • Windows7 x64

こんな環境で試してみています。

さて「自分の作業用のリポジトリを今だけ公開する」というイメージで、リポジトリの公開設定をしてみます。先ほどのMercurialにおけるリポジトリの公開事例に近いことをやりたい、と考えてもらえればと思います。
このとき、作業リポジトリのフォルダどこかでtortoiseGitのメニューを開き、バックグラウンド稼働というメニューを選択します。すると、git daemonコマンドが実行されて公開状態となります。このとき git プロトコルが使用されて公開されます。

git-background

他の環境からは上記で公開されているリポジトリから clone や pull などで内容を取得することができるようになります。バックグラウンド稼働後に開くウィンドウで、 git://xxx.yyy.zzz.www/ というアドレスが表示されているかと思いますが、これがサーバーのアドレスとなります。
なお、英語表記モードのままGUIを使っている場合、このバックグラウンド稼働という項目は “Daemon” として表示されているのでご注意下さい。Background という項目では見当たらないので・・・。

注意事項

Windows上でこの公開を行うときには知っておくべき点があります。
まず Gitプロトコルですが、公式の説明にはこのように記載があります(Gitサーバープロトコル)。

次は Git プロトコルです。これは Git に標準で付属する特別なデーモンです。専用のポート (9418) をリスンし、SSH プロトコルと同様のサービスを提供しますが、認証は行いません。Git プロトコルを提供するリポジトリを準備するには、git-daemon-export-ok というファイルを作らなければなりません (このファイルがなければデーモンはサービスを提供しません)。ただ、このままでは一切セキュリティはありません。Git リポジトリをすべての人に開放し、クローンさせることができます。しかし、一般に、このプロトコルでプッシュさせることはありません。プッシュアクセスを認めることは可能です。しかし認証がないということは、その URL を知ってさえいればインターネット上の誰もがプロジェクトにプッシュできるということになります。これはありえない話だと言っても差し支えないでしょう。

このようにあるので、Pushアクセスを認めることができるかのようです・・・しかし、tortoiseGit のほうの説明にはこのようにあります(3.10. Daemon)。

Sometimes you want to quickly share you local repository to others without pushing to a remote git repository.

Caution
The selected repository is exported for read/write access without further authentication.

このために流し読みしていると read/write アクセスが必要である、という点だけ見てPushもできそうな気配を感じます。しかし最初の文章にあるとおり、リモートのリポジトリにPush無しという制限下で、という部分を忘れてはいけません。
 Windowsではこの方法を使う場合、他ユーザーへ読み取りのみの公開で使うという前提があるようです。これに気づかなくて色々と試行錯誤していました・・・。

テスト(その1)

うまくいかない組み合わせをメモしておきます。なかば自分のためです(笑)

Windowsクライアント Linuxクライアント
Linuxでgit://公開 NG NG
Windowsでgit://公開 NG NG

うまくいく組み合わせがあったように思いましたが、自分の作業リポジトリを公開する際にはどれでもダメなようです。

テスト(その2) 追記

うまくいかない組み合わせをメモしておきます。なかば自分のためです(笑)
うまくいった組み合わせがあったように思ったのでさらなる調査です。


前回と条件が違うのは、自分の作業リポジトリは公開しない、という点です。
作業用は公開しないが、別フォルダに作成した公開用のリポジトリを gitプロトコルで公開という状況です。
この別フォルダに用意した公開用のリポジトリは下記のコマンドで作成しています。

Windowsクライアント Linuxクライアント
Linuxでgit://公開 NG OK
Windowsでgit://公開 NG OK

このような結果となり、Windowsのgitクライアントでは失敗することがわかりました。このことからもgitプロトコル公開でPushさせる、というのは禁止事項にしておいた方が無難な気がします。


CRT非依存の続き

前回結構かいたつもりですが、それの補足や追加調査でわかったことを書いておきます。

C++は本当につかえない?

できることならC++のクラスとか使って開発したいですが、new/delete 使えなかった記憶があったので調べてみました。
 結果、通常のnew, delete を使用した際にはCRT依存が発生してしまいます。しかし!グローバルのnewをオーバーロードする方式で new/delete の処理を横取りすれば、この依存が発生しないことがわかりました。個人的にはすばらしい発見でした。(そもそも例外は使わない前提。前回の記事でOFFに設定していますし)

エントリポイントの設定について

前回エントリポイントの設定をするように書きましたが、実は他の方法があるようです。
規定のライブラリ省略をするように設定すると下記の関数がエントリポイントとできるようです。

どのみち規定のライブラリ名の省略オプションは有効にしておいた方がいいみたいですし、こっちのほうがよいのかもしれません。