2012年10月27日土曜日

EXCELでタイムライン表示

計算結果のうち、複数のイベントが何秒に発生し、それらの関係をまとめるためによくタイムラインを作ります。それ用の表示プログラムもこれまで何種類も作ってきたんですが、OSが変わったり、windows manager、あるいはミドルウェアが変わったりで同じような機能のものを何回もつくってきた気がします。
ふと思いついたのが、最近のEXCELって機能が増えてきたから、グラフのうちの散布図を使えばできるんでないか?横軸を時間、縦軸はイベントの種類を適当につけてラベルを散布図のマークのところにつけれれば・・・ と思ってぐぐってみたら、結構みんなおんなじこと考えるんですね。いくつもヒットしましたが、microsoftの公式見解では「不可能」とのこと。Σ(゜д゜lll) ええ~~、そんなにはっきりいわれちゃうと、と思ったんですが他にヒットしてみたのを見ると、なんか頑張れば似たようなものができるというのがありました。いくつか調べてみて、何とか思い描くものができました。結構、手順は複雑ですが、一度作れれば後は各イベントの時間をペーストしてやれば、いろんな計算結果をきれいにレポートにまとめれます。
ちょっと長いですが、手順をまとめます。

①まずデータを用意します。下図に示したように、第1列にイベント名称(これをラベルとして散布図に表示したい)、第2列にそのイベントの発生時間、第3列が今回の肝として散布図を描くために各イベントの種類(シーケンスと定義しましたが特にイベントの順番というわけではありません)を定義します。散布図として描くのは図中で選択してあるセルです。


②これで選択してあるエリアで、散布図を描きます。
こんな感じになり、横軸が時間なのはいいですが、肝心のグラフ中のイベントのマークのところにラベルがつきません。ここに手作業で一つずつラベルを定義してやります。

③散布図中のイベントマークのところをマウスで左クリックしてやると、すべてのマークが選択され、各マーク(イベント)のところにシーケンスの値がラベルとして右側(デフォルト位置)に表示されます。
なんとなくイメージに近くなりました。ここで細工を加えます。

④ここでさらに右クリックする等して「データラベルの書式設定」を表示させます。デフォルトでは「ラベルの内容」はY値になっていますが、これを「系列名」にしてやります。


⑤やりたいことは、このラベルのところを第1列で定義した各イベントの名前にしたいのです。ここで一つのマークだけを選択するために、最初のマークをShiftキーを押しながら右クリックしてやります。すると一つだけ選択状態になります。
表示されている各マーク(イベント)の表示がシーケンスという表示に手順④でなっていますが、そのうちの一つだけが選択された状態になりました。

⑥さてここが重要です。この状態で、「=」キーを押してやります。表示上は何も変わりませんが、そこで当該マークのラベルにしたい名前が定義してあるセルを選択します。(下図の例では、「ABC」を選択した結果です)
みごと望みの表示になりました。これを各マークで繰り返し、グラフに表示したいイベント名のセルを定義していきます。ラベルの表示位置はここではデフォルトの「右側」のままですが、手順④のところの「データラベルの書式設定」で上にも下にもできます。

またここが重要なのですが、こういうタイムチャートを描いていると計算結果によってとなりあうイベントの時間が近くてラベルが重なりあって見難くなります。そういう時は各イベントで定義してある「シーケンス」の値を適当に調整して表示位置を上下に変えます。

これで一度できてしまえば、時間の列のところに任意の計算結果をペーストしてやればきれいなタイムチャートの完成です。この様なことをやってくれるadd-inを作ったよというHPもありましたが、ちょっと怖かったので今回は手作業で行いました。

2012年10月14日日曜日

Git入門



これまで仕事ではソースコードの形態管理にSubversionを使ってきました。しかし最近、世の中が分散形態管理システムのGitが評判になってきており、ちょっと試してみようと思いました。しかし、調べてみても一般的なコマンドの説明ばかりで、具体的にGitサーバーをどう設定したらいいのかとかまとめてあるのが見つかりません。この土日でやってみたのをまとめておきます。具体的には以下のような環境です。



自宅で用意したものです。クライアントはもっと種類増やしてもいいんですが、まとめるのが大変なのと、Gitが基本CUIでGUI環境があまりよくない、あと日本語文字コードの扱いに問題があるとのことだったので、UTF-8に統一してあります。


X.Gitのインストール

Ubuntu等のマシンで以下を実行してgitのパッケージをインストールする。
$ yum install git-core (Ubuntuは sudo apt-get install git-core でした)

WindowsではGitoliteがクライアントとしてよさげ。
と思ったら、Eclipseだと標準でGitプラグイン(EGit)が入っており、「インポート」で普通にサーバーを選択できた。
(Gitコマンドはファイル名→右クリックの「チーム」のサブメニューにある)

MacだとXcodeでgitクライアントのCUI版はインストールされるらしいが、GUI付はGitXがいいらしい。
(でもこれは0.7で開発が止まってるように見える。日本語大丈夫だろうか?)
(入ってなかった。ググったらcode.googleにあるよ!)


0. サーバーの設定
基本Ubuntuはクライアント利用が前提であり、最近は特にセキュリティの問題からサーバー関係のプログラム(サービス)は特に自分からインストール・設定してやらないといけません。(Redhatでもかなりまえにtelnetdが外されて(パッケージすらなくなった!)びっくりした)

最初にgit用にアカウントを作ります。リポジトリは基本この下におきます。(管理者権限を付加しておいたほうが後々便利です。設定後はとったほうがいいですが、このあとgitアカウントで設定いろいろしますから)

まずsshをインストールしないといけません。
「ソフトウェアセンター」で入れましょう。(sudo apt-get install sshdだと ないと言われた。名称が少し違うようだ)

ところでデフォルトではsshからrootでログインできてしまいます!(ダメやん、そんなの)
$ sudo vi /etc/ssh/sshd_config

PermitRootLogin no ← noにしておく

$ sudo /etc/init.d/ssh restart

でsshサービスを再起動しましょう。
念のため以下のコマンドでちゃんと起動しているか確認。

$ sudo lsof -nPi:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 3750 root 3r IPv4 16769 0t0 TCP *:22 (LISTEN)
sshd 3750 root 4u IPv6 16771 0t0 TCP *:22 (LISTEN)

さて実際に使うにはssh鍵をサーバー、クライアントの双方に登録してやらないといけません。一番簡単なのはクライアント→サーバにsshでログイン(このとき鍵の生成を聞かれて、登録されます)。再度、サーバーからクライアントにsshでログインしなおす(これで双方のssh鍵が互いに登録されます)
ただ今回はサーバ:Ubuntu、クライアント:Macで試してますが、Mac側が当然のごとくsshだろうがリモート接続は許してくれません。
クライアント(Mac)でssh鍵を生成します。

$ ssh-keygen -t rsa

ここでパスワードを聞かれますが、複数のマシンでパスワードが異なってるとめんどくさいので、いんちきですが「空」でリターンだけ押してやります。2回聞かれますが、それでポスワードが「空」の鍵が生成できます。(せめてすべてのマシンで同じパスワードで設定してやるくらいしたほうがいいんだけど。まあ仕事でやるのとは別なんで)
これでMacのホームで.ssh/id_rsa.pubが生成できますから、これをサーバー側に送ってやり(scpがいいでしょう)、サーバー側のリポジトリを公開するユーザーのホーム/.ssh/authorized_keysにアペンドしてやりましょう。(くれぐれもコピーはしないように!1マシン=1行で登録されてますから、コピーなんてするとほかのマシンの設定が消えてしまいます。なお最初の登録時には.ssh/自体存在しないことがありますが、そのときは自分で作成します)


1.まずgitサーバーのマシンでリポジトリの作成(サーバーのgitアカウントで実行)
gitアカウントのホームに作ります。

$ mkdir project.git
$ cd project.git  ←<リポジトリを作成するディレクトリ>
$ git init ←これ不要かもしれません。クライアントが必要なだけの気もする。

.git/というリポジトリが保存されるディレクトリが作成されるだけなので、同じ階層に共有するリソースを作成する。
ここで注意ですが、ここで生成されるのはgitリポジトリであり、ファイル本体はこのリポジトリ内にあり、素で見てもファイル名なんかは見えません。gitサーバーでもリポジトリ内のファイルがどうなってるかみたいなら、別アカウントでこのリポジトリのクローンを作ってやりましょう。

2.クライアント側の環境設定をする
各クライアント(まずはMacです)で以下のコマンドを実行します。homeディレクトリの.gitconfigというファイルに登録されます。(EclipseではGUIで行いますが、登録内容は同じです)

$ git config --global user.name "Hoge Hoge" ←当該リソースを触った人です
$ git config --global user.email hoge@home.com
$ git config --global core.qutepath false (ファイル名の文字化けを防ぐ)// 別のより新しい記事ではこの記載がない
$ git config --global core.editor "'C:/Program Files/sakura/sakura.exe’ -code=4" (デフォルトのエディタを設定 なければviがデフォルトになる)

3.クライアントのマシンでリポジトリのクローンを作成する。
今回は1.でリポジトリ名をproject.gitとしたので、何となく作業用ファイルを置く場所も「project」にしてしまいました。そのあたりは実際に使うときに変えてください。

$ cd <クローンを作成するディレクトリ>
$ git init ←記憶が明確でないけど必要な気がする
(20131016:結果的には同じですが間違えてました。git initいりません。)
$ mkdir project     // クローンを作成するディレクトリ
$ git clone git@<ホストアドレス>:/home/git/project.git project

これでsshによりgitサーバーからリポジトリのクローンがローカルに作られます。(ただ最初は空っぽですが)サーバーの指定がgitのsshで直接やる一番原始的なコマンドで、本当はhttp, httpsでスマートにやりたいんですが、そのためにはApatch等の設定が大変なので、それはまた今度ということに)
実は今回いろいろ試しながらやってたので、もしかしたらMacやUbuntuではcloneやるまえに、git initする必要があると思います。EclipseだとGUIが勝手にやってしまってるかもしれないんで。cloneする前に、.git/というリポジトリ情報を保存するエリアを作成しておく必要がある気がします。(1.のサーバー側準備でgit initコマンドしてますが、今から調べるとこれ意味なかったような状態になっており、施行錯誤してるときにクライアントで先にgiti initやった記憶があります。)


4.クライアント側で作業をする

さてクローンが無事できたので(最初だと空っぽだけど)、最初のファイルを作ります。

$ vi text.txt

適当にテキストをいれ、これをクライアント側のローカル・リポジトリに追加しましょう。

$ git add text.txt ←最初の1回は当該ファイルを管理対象に追加する指定が必要です
$ git commit ←ローカル・リポジトリへのcommitです。エディタでコメントを求められます。正式にはコミットするファイルをこのあとに引数で与えます。


5.gitサーバのリポジトリにローカルを反映させます。

$ git push origin master

(originってなんだ?ってとこですが、gitサーバーのリポジトリを示しています。一度、cloneコマンドを行った時にアドレスが記録されているのでこれでいいんですが、全部書くと以下のようになります。

$ git push git@<ホストアドレス>:/home/git/project.git master

最後のmasterはブランチ名です。masterは当然デフォルトのやつです。Subversionでいうところのtrunkにあたります。)
2回目以降は単に以下でいけます。それはそれでどこに作用するのかわからないので怖いんですが。

$ git push


6.別のクライアントにローカルリポジトリを作成する

ここからが本番です。別のマシン(今回は別のUbuntuでいきます。Windowsは慣れてからで)にローカルリポジトリを作成します。
まず2.の環境設定をします。わざとユーザー名は変えておきましよう。(Hiroyuki Maeda2)後で誰が変更したのか確認できるようにです。
次に、3.の手順でクローン・リポジトリを作成します。すると今度は3.でcloneを作ったところでリポジトリに追加したtext.txtが作業エリアに登場してきます。


7.別のクライアントでファイルを編集

text.txtに2行目を追加します。それをコミットしてpushします。

$ vi etxt.txt
$ git add text.txt
$ git commit ←ここでコミットログ求められます
$ git push origin master


7.最初のクライアントでgitサーバーのリポジトリを取得

さて2番目のクライアントがファイルを変更しました。1番目のクライアントでそれを取得します。

$ git pull ←必要ならoriginやmasterの情報を付加します
シェルには何やらファイルが変更されたとのメッセージが。
確認すると、確かに2行目が追加されています。

$ git log

これでコミットログを確認すると確かにログが表示されます。


8.コミットログやファイル本体に日本語使うとどうなる?

さて実際に使いこもうと思うと、最初の難関が日本語です。(正確には文字コード)
UbuntuなんかはUTF-8だし、MacはSJIS(と思ったんですがsnow Lepord以降はUTF-8のようでした)、Widnowsは今はUnicode(ほとんどUTF-8)です。

試してみたら、Ubuntu側で日本語でログやらファイルを編集しても、Macでは無事よめちゃいます??自動で文字コード変換してる? ちょっとこれ以上はWindowsも入れてみないとなんともわかりません。


9.Windowsでローカル・リポジトリを作成

さて今度はWindowsです。eclipseがEGitをインストール済みなので、これを使います。importでGitを取り込めますが、サーバ側がsshの設定しかしてないので、プロトロコルは当然sshでいきます。
取り込んでみると、ファイル自体はやはりUTF-8でした。(ただ鍵ファイルの設定がみあたらない。もしかして鍵なしのssHでいってしまったかも)
コミットログのヒストリを見てみると、ちゃんと誰が修正したかもわかります。(このために、ユーザー名を2つのクライアントで変えておきました)なおローカル・リポジトリはEclipseのworkspace以下に各プロジェクトが保存されていますが、当該プロジェクト名フォルダ直下に「.git」フォルダが作られていますので、そこで管理されています。
ところでEclipseだとuser.nameとかどこで管理しているのか?それはPreference → Team → Git → Configurationのところでkeyとvalueの設定をするところがあります。ここにuse.nameとかuser.emailとか設定します。注意するのがcore.autocrlfで、これいつもEclipse起動時にDialogがでて気になりググってみたら、push/pull時に改行コードを自動的にCRLFにしてしまうかどうかという設定でした。当然、falseにしておきます。(おそらくこれはWindows独特の設定だと思います。Windowsだけは改行が昔からCRLFですが、LinuxやMacはLFだけですから。)
あと注意が必要なのが、commitとpush/pullのやりかたです。基本右クリックで表示されるメニュー内のTeamサブメニューでやるんですが、ファイルを選択したときはcommitしかでません。プロジェクトで右クリックするとpush/pullのサブメニューがでてきます。(当たり前といえば、当たり前ですが)



疑問 git pushでローカルのリポジトリがサーバーに送られるが、その時に衝突が起きた場合どうなるのか?

Windows側でファイルを更新、pushしてからMac側でその更新をpullして確認。その後、Ubuntu側で(最新のpullをする前に)独自の修正をしてpushしようとしたらサーバーからrejectされました。
一番いいのは作業する前に

$ git fetch
$ git diff FETCH_HEAD

を行い、自分のローカルリポジトリをサーバー上のものと調べてること。

$ git merge FETCH_HEAD

もしpushしてrejectされるようなら、上記を行い手作業でマージして差分を解消してからpushしなおしになります。(先にpullしてサーバーとローカルリポジトリの同期をしてから、pushしなおさないといけないかもしれません。この方法だと最後にマージのログがヒストリに残りました。)一番簡単なのは、自分の作業用ファイルをどっかにおいておいて、pullして作業環境をサーバとあわせ、さきほど別のところにおいておいたファイルを見ながら修正することでしょうね。

実際にUbuntu側で問題を解決しpushしたあと、Windows側でpullしてhistoryを見てみた画像です。なんか以下にもmergeやったよ、という記録まで残ってます。


最後に日本語の文字コードについて。基本、UTF-8が問題でないようです。ファイル名もUTF-8なら問題ありません。ただところどころ使ってる環境によって日本語がファイル名のログ表示が化けるものがありますが、結果は大丈夫です。(このあたりはまだまだだと感じました)WindowsのGit GUIでも日本語ファイル名の扱いに問題がでるようですし、一番問題がなさそうながどのOSでもEclipseのようです。CUIでやるのが基本のようですが、いまどきそれはつらい。(Git作ったLinusはバリバリのコマンド入力の人らしいし、このあたりはだいぶ時代に遅れています。)



2012年10月12日金曜日

Ubuntu更新エラー

なんか時々、Ubuntuを使っていて更新マネージャーが起動してエラーを起こすことがよくありました。その時は無視してるうちに解消していたのですが、この3,4か月さわってなかったため、今日起動してみたら200個以上のパッケージが更新対象に・・・当然のごとく更新でエラーがでました。
どうしても消えなくて、やむなくググるとありました。

$ sudo apt-get update  (更新データベースのリポジトリ同期です)

$ sudo apt-get upgrade (更新が必要なパッケージの更新作業自体を行います)

昔の記憶だとupdateだけだったと思うんですが、役割が分担されてます。おそらく更新マネージャはGUIでこれら2つのコマンドと同じようなことをしてるんでしょうが、状態ファイルの管理がうまくいかないことがあるんでしょうね。(多人数でプログラム作ってると似たようなことよく経験しました)もう手作業でやったほうがいいかしらん。

注:ただパッケージの種類にもよりますが、再起動が必要なものがあります。そのためGUIの更新マネージャでは最後に「再起動してください」というボタンが表示されますが、CUIでコマンド実行してるとそんなのはできません。念のため、上記2つのコマンド実行後、再起動して更新マネージャで確認するのが確実です。

2012年10月9日火曜日

nexus7とiPad3

家にNexus7がきて1週間くらいでしょうか。iPad3も持ってるんで、使い比べて感じたことなどを。

1. バッテリーのもち
Nexus7が4,325mAh、対してiPad3が11,666mAhと倍以上の差です。そのため、明らかにiPad3の方がもちます。本当に1週間で1回充電すればOKです。(そのかわり充電にはかなり時間がかかります)Nexus7は2,3日で再充電が必要になる感じです。もうちょい持ってくれると嬉しいんだけど。

2. 持ち運びのしやすさ
これはもうNexus7の圧勝です。軽いし(iPad3に比べて、ほぼ半分の重さ)、カバンに入れても邪魔にならないサイズです。昔はノートPCなんて持ち運んでいて、iPadが出た時は感動したものですが、人間欲望には際限がないですね。

Nexus7はせっかく速いCPU(Tegra3)持ってるんだから、それも試して見たいですがちょっと適当なゲームを持っていないのでそのうちにでも。

2012年10月6日土曜日

iOS6のマップ騒動について

題名の件について、ネットでは様々な記事が流れてます。でも結論として、いかにこのマップサービスでGoogleが先行しているかを思い知らされました。そりゃ、数年前からやってるし、金かけてストリートビューとか、裁判沙汰になりながら位置情報データを記録してましたからね~ やっぱマップというと位置に付属する情報がいかに正確か(現状に近いか、新鮮さ)が命だよね~。
10年以上前のGoogleがペーパー(論文)で出してきた自社システムの情報みてると、よくここまで10年くらい金使えたよな~と感心します。でもそのおかげで、大量のデータを世界中の誰よりも蓄積できて、その成果が今でてます。今からほかの会社が、この種のサービスしたいと思っても追いつけるんだろかと考えちゃいますね。(Appleはこのままではヤバイと気づいたのはいいけど、データの蓄積できてない段階でサービスをスタートさせたのはまずかったね。)
でも本当にGoogleのシステムはすごいな~と昔から感心してました。Linuxをベースにしてるとはいえ、ファイルシステムから全部自分のサービス用に特化してるし。そもそもHDDの故障データにはびっくりしました。直感的にはそうだよな~とは思ってたけど、データで示されるとやはりHDDって機械部品だよな~と実感します。(初期故障の比率はある程度あって、それをこせるとある程度(数年)は動く、でもそれ過ぎると一気にまた故障率が上がる)

2012年10月5日金曜日

Nexus7買ったよ!

9/25の発売日の夜、家でGoogle Playからついポチりました。(購入)パッドなんて、iPadを2台(1代目と3代目)持ってるんですが、やはり一台くらいはAndroidが欲しかったのと、出張なんかでは7インチのほうが大きさ的にやさしいよね、ということで。(やっぱiPadでかいよ)
なかなかこなくてFedexで追跡。(通知メールを見たら、宅配業者はFedexとのこと。でもNexus7て台湾のASUS、でも製造工場は中国だよね?)

なんと、香港のFedexから始まっとる!2,3日中国からの輸出手続きで本土とやりとり後、関空へ。そこでも入関に1日かけてやっと国内輸送。最後はちょうど家が留守のときにきて、夜に無事受け取りました。(住所が大阪なんで、一瞬あせった)
無事とどきました。さっそく箱をあけて電源Onとしようとしたら、、、バッテリーがチャージされてない!?これまでこの手のものって、たいてい出荷検査の関係とかでバッテリーはフルチャージに近い状態だったんですが、こんなの初めて。しかたなく電源つないでしばらくチャージ。

ちゃんとおまけの「トランスフォーマー」も入ってます。面食らったのが、最初にgoogleアカウント名が入力済みとは聞いてたんですが、いきなりスマホでいれてるアプリのうち、Nexus7でも対応してるやつをダウンロードしてインストールしちゃったこと。なんか最初はそうだったけど、選択できるようになったって記事あったのに。おかげでこっちでは必要ないものをいくつかアンインストールしました。7インチはやはりだいぶ小さい感じですが、出張のときはこっちのほうがよさそうです。少し環境構築しないと。(エディタくらいは使いたいよね。Google Appで簡単なワープロ使えますが、あれはネット環境ないとだめだし、こいつはWiFiモデルしかない。オフラインでも使える機能、こいつでも使えるんかな)
さてさて、iPadとバッテリーの持ちとかいろいろ比較してみないと。