« 2011年07月 | メイン | 2011年10月 »

2011年08月 アーカイブ

2011年08月02日

とある研修医の証言

こんなことがあったそうな...。

患者 : 「それではまた来週お願いします。」
医者 : 「はい。」
(バタン)
研修医 : 「先輩、良いんですか? あんなこと言って...。」
医者 : 「ん? 何がだ?」
研修医 : 「だって、ほら、さっきの民間療法の話...。」
医者 : 「あぁ、あれか。良いんだよ。あちらが言い出したことだ。」
研修医 : 「でも、医学会では有効性は否定されてるんですよね? それどころか危険だとも言われてるんですよね?」
医者 : 「若いな...。」
研修医 : 「えっ?」
医者 : 「あのな、よく考えてみろ。向こうは民間療法の有効性を信じて疑ってない。医学をわかってないのに、説明して理解できると思うか?」
研修医 : 「いや、でも...。」
医者 : 「でもじゃない。こっちは慈善事業じゃないんだ。」
研修医 : 「だからって、明らかに危険な状態になるのに黙って見ているんですか? 職業倫理としてどうなんですか?」
医者 : 「あぁ! もううるさい! 良いか? よく聞け! 俺達の仕事は『正しいことをする』ことじゃない! 『患者の言った通りにする』ことだ! 望んだ通りにやるんだから良いじゃないか!」
研修医 : 「......。」

嫌な医者ですねぇ。関わりたくもない。

おっと、エディタが変な置換をしてたみたいです。
 s/患者/クライアント/
 s/医者/プロジェクトリーダー/
 s/研修医/プログラマ/
 s/民間療法/簡単ログイン/
 s/医学会/セキュリティ界/
 s/医学/技術/
アンドゥアンドゥっと。

クライアント : 「それではまた来週お願いします。」
プロジェクトリーダー : 「はい。」
(バタン)
プログラマ : 「先輩、良いんですか? あんなこと言って...。」
プロジェクトリーダー : 「ん? 何がだ?」
プログラマ : 「だって、ほら、さっきの簡単ログインの話...。」
プロジェクトリーダー : 「あぁ、あれか。良いんだよ。あちらが言い出したことだ。」
プログラマ : 「でも、セキュリティ界では有効性は否定されてるんですよね? それどころか危険だとも言われてるんですよね?」
プロジェクトリーダー : 「若いな...。」
プログラマ : 「えっ?」
プロジェクトリーダー : 「あのな、よく考えてみろ。向こうは簡単ログインの有効性を信じて疑ってない。技術をわかってないのに、説明して理解できると思うか?」
プログラマ : 「いや、でも...。」
プロジェクトリーダー : 「でもじゃない。こっちは慈善事業じゃないんだ。」
プログラマ : 「だからって、明らかに危険な状態になるのに黙って見ているんですか? 職業倫理としてどうなんですか?」
プロジェクトリーダー : 「あぁ! もううるさい! 良いか? よく聞け! 俺達の仕事は『正しいことをする』ことじゃない! 『クライアントの言った通りにする』ことだ! 望んだ通りにやるんだから良いじゃないか!」
プログラマ : 「......。」

あー、こんな技術者とは関わりたくないですよねぇ。

今時、『かんたんログイン』や『個体識別番号による認証』を採用しようとしている技術者がいたら、よっぽどアンテナの感度が悪いか、アンテナが折れているので気をつけましょうね。もしかして、クライアントや利用者の安全を考えていないのかも...。

※ この話はフィクションです。用法・用量を守ってお使いください。

2011年08月13日

zshのプロンプトにgit statusの情報(の一部)を表示する

これまでzshの右プロンプト(RPROMPT)にはgitのリポジトリ名を表示するようにしていた。
表示内容を決定する関数はこれ。
function get-git-branch(){
    typeset +g rtn
    typeset +g branch
    branch=$(git branch -a 2>/dev/null | grep "^*" | tr -d '\* ')
    if [[ -z $branch ]] then
    else
        if [[ $branch == "master" ]] then
            rtn="%{${fg[red]}%}(${branch})%{${reset_color}%}"
        else
            rtn="%{${fg[green]}%}(${branch})%{${reset_color}%}"
        fi
    fi
    echo $rtn
}
リポジトリがmasterの時は赤、それ以外は緑になるようにしていた。
で、git statusの内容も表示させたいなと思い関数を書き換えた。
function get-git-status(){

    typeset +g rtn
    typeset +g gitstatus
    typeset +g branch
    typeset +g staging
    typeset +g unstage
    typeset +g untrack
    typeset +g color

    gitstatus=$(git status 2>/dev/null)

    if [[ -z $gitstatus ]] then
    else

        branch=$(echo ${gitstatus} | grep "^# On branch " | sed s/^#\ On\ branch\ //)

        if [[ -z $branch ]] then
        else

            staging=$(echo ${gitstatus} | grep "^# Changes to be committed:$" | wc -l|sed s/\ //g)
            unstage=$(echo ${gitstatus} | grep "^# Changes not staged for commit:$" | wc -l|sed s/\ //g)
            untrack=$(echo ${gitstatus} | grep "^# Untracked files:$" | wc -l|sed s/\ //g)

            if [[ $staging == "1" ]] then
                staging=":^"
            else
                staging=""
            fi
            if [[ $unstage == "1" ]] then
                unstage=":*"
            else
                unstage=""
            fi
            if [[ $untrack == "1" ]] then
                untrack=":?"
            else
                untrack=""
            fi
            if [[ $branch == "master" ]] then
                color="${fg[red]}"
            else
                color="${fg[green]}"
            fi

            rtn="%{${color}%}(${branch}${staging}${unstage}${untrack})%{${reset_color}%}"

        fi

    fi

    echo $rtn

}
これで、stagingされているファイルがある時には「^」、git管理下のファイルに変更がある時には「*」、git管理下ではないファイルがある時には「?」が表示されるようになる。

便利便利!

贅沢をいうとファイル数も表示されるともっと便利なんだろうけど、この課題は先送り。

実際のprecmdはリンク先を参照のこと。

2011年08月14日

EclipseでAndroidプロジェクトをMavenで管理するための環境構築 + Emacsキーバインドの設定

追記
情報が古くなったので、書き直しました。
個人用メモ。開発環境をゼロから構築するエントリーを書く予定が試行錯誤しすぎてよくわからなくなってしまったから妥協したともいう。環境はMac OS X Lion(10.7)。
Eclipse
Eclipseは「Eclipse IDE for Java EE Developers」の3.6.2(Helios SR2)を利用。
Eclipseの日本語化
Eclipseを日本語化したものもあるが、何か起きたときに原因追及がしにくくなるので後で簡単に英語版に戻せるように日本語化パックを使う。日本語化パックはblanco Frameworkの「Eclipse 日本語化言語パック (サードパーティ版)」の「3.6.0 Stream Build」を使用。今のところ、Eclipseの最新版の3.7.xには日本語化パックがない模様。
Eclipseディレクトリ直下の「dropins」に「nlpack」ディレクトリを作り、ダウンロードしたものを解凍。解凍すると「eclipse/dropins/nlpack/eclipse/features」と「eclipse/dropins/nlpack/eclipse/plugins」以下に日本語化パックが入る。プラグインを「eclipse/features」と「eclipse/plugins」に入れるようにと書いてある文書を見かけるが、何かあった時の問題の切り分けに苦労するので、「dropins」を活用する方法がお勧め。
Android SDK
以下のURLからr12(version 3.1)をダウンロードして「~/Developer/」直下に解凍。
最新版はr13(version 3.2)なんだけど、ダウンロードページのトップがr12になっているのでr12にした。もしかして、r13はまだ不安定???

配置がHome配下なのは、パーミッションの問題に悩む必要がないため。入れたSDKのバージョンがわからなくなるのも面倒なのでディレクトリ名は「android-sdk-mac_x86」のまま。
Eclipseのプラグイン
以下、全てEclipse経由でインストール。「ヘルプ」=>「新規ソフトウェアのインストール...」を選択すると、「インストール」ダイアログが開くので「追加」をクリックし、任意の「名前」とダウンロード用の「ロケーション」のURLを入力し「OK」をクリック。「ロケーション」と自分がつけている「名前」は、各プラグイン別に後述。「名前」は自分がわかりやすいものに変更すると後で混乱しない。

「インストール」ダイアログの「作業対象」から追加したロケーションを選択すると、リストボックスにダウンロードできるプラグインの一覧が表示されるので、インストールしたいプラグインをチェックボックスで選択し「次へ」をクリック。後は指示に従ってインストール。途中、ライセンスの使用条件に同意する画面が出てくるので、そこだけ気をつける。
ADT Plugin for Eclipse
AndroidアプリケーションをEclipseで開発するためのプラグイン。ADTはAndroid Development Toolsの略。
「名前」と「ロケーション」は以下の通り。
名前 : Android Development Tools Plugin(ADT Plugin)
ロケーション : https://dl-ssl.google.com/android/eclipse/

インストール後、「Eclipse」=>「環境設定...」=>「Android」=>「SDK Location」にAndroid SDKディレクトリのパスを入力する必要がある。「~/Developer/android-sdk-mac_x86」と入力できれば良かったんだけど、絶対パスでないとだめらしい。ここでは、「/Users/[ログインユーザ名]/Developer/android-sdk-mac_x86」とした。

パスを設定後、「ウィンドウ」=>「Android SDK and AVD Manager」でダイアログを開き、「Available packages」でSDKや「Platform-tools」のインストール、「Virtual devices」でAndroid端末のエミュレータを作成することができるようになる。
M2Eclipse
MavenをEclipseから使うためのプラグイン。Mavenそのものが組み込まれているので、別途Mavenをインストールする必要がない。
「名前」と「ロケーション」は以下の通り。
名前 : m2eclipse
ロケーション : http://m2eclipse.sonatype.org/sites/m2e

Mavenは日本語の情報が少ないが、「Apache Maven 2.0入門」という良本がある。現状のMavenの最新版は3.0.3だけどお勧め。新品が売っていないので絶版しているのかもしれない。Maven3向けに書き換えたものを出し欲しい。
Maven Integration for Android Development Tools
Mavenに対応したAndroidのプロジェクトを作成するためのプラグイン。
「名前」と「ロケーション」は以下の通り。
名前 : Maven Integration for Android Development Tools
ロケーション : https://svn.codespot.com/a/eclipselabs.org/m2eclipse-android-integration/updates/m2eclipse-android-integration/
ロケーション : http://m2eclipse-android-integration.googlecode.com/svn/trunk/com.byluroid.eclipse.maven.android.update/
「svn.codespot.com」からダウンロードできるのは現状では0.2.4と0.2.5で、「m2eclipse-android-integration.googlecode.com」は0.2.3。

このプラグインをインストールすると、Mavenプロジェクトを作成するときに、「android-quickstart」というArchetypeが選択できるようになる。「android-quickstart」をもとにプロジェクトを作成すると、「maven-android-plugin」の設定がされたpom.xmlが作られる。ただ、pom.xmlを少し修正する必要がある。

まず、公式サイトにもある通り、Android SDKのパスを設定する必要がある。pom.xmlの「project>build>plugins」配下の「maven-android-plugin」の「configuration>sdk」に、「<path>${user.home}/Developer/android-sdk-mac_x86</path>」を追加する。

また、このまま開発を行っていると「[ERROR] Cannot add resources from jar Duplicate files at the same path inside the APK」とエラーが出て正常なAPKファイルが作成できなくなることがある。原因は「Maven package」を実行するときにtarget配下に追加するjarファイルが重複するため。この問題を解消するには、「maven-android-plugin」のバージョンを「2.9.0」系に上げ、「configuration」直下に「<extractDuplicates>true</extractDuplicates>」を追加する必要がある。

既存のAndroidプロジェクトをMavenに対応させる場合にも、「android-quickstart」で作成されるpom.xmlを参考にするとよい。

あと、最新のEclipseである3.7(Indigo)だとそのままでは使えないらしい。詳細は以下のURL。
Emacs+ Eclipse Plug-in
Eclipseは設定でEmacsに似たキーバインドに変更することができるが、中途半端感が否めない。「Emacs+ Eclipse Plug-in」は、よりEmacsのキーバインドに近づけることができるプラグイン。
「名前」と「ロケーション」は以下の通り。
名前 : Emacs+ Eclipse Plug-in
ロケーション : http://www.mulgasoft.com/emacsplus/update-site

インストール後、「Eclipse」=>「環境設定...」=>「一般」=>「キー」の「スキーム」から「Emacs+ Scheme」を選択する。これを入れたら、イライラすることがなくなった。

m2eclipse-android-integrationで作成されるpom.xmlの修正版

現行のバージョンのMaven Integration for Android Development Tools(m2eclipse-android-integration)のandroid-quickstartで作成されるpom.xmlは修正が必要なことは前のエントリーで説明した通り。
修正前と修正後のpom.xmlをあげておく。前のエントリーの環境が前提なので、適時修正が必要。targetは、Android2.1(API7)。
修正前
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.kanasansoft.sample</groupId>
  <artifactId>sample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>apk</packaging>
  <name>sample</name>

  <dependencies>
    <dependency>
      <groupId>com.google.android</groupId>
      <artifactId>android</artifactId>
      <version>2.2.1</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>com.jayway.maven.plugins.android.generation2</groupId>
        <artifactId>maven-android-plugin</artifactId>
        <version>2.8.3</version>
        <configuration>
          <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>
          <assetsDirectory>${project.basedir}/assets</assetsDirectory>
          <resourceDirectory>${project.basedir}/res</resourceDirectory>
          <nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory>
          <sdk>
            <platform>7</platform>
          </sdk>
          <deleteConflictingFiles>true</deleteConflictingFiles>
          <undeployBeforeDeploy>true</undeployBeforeDeploy>
        </configuration>
        <extensions>true</extensions>
      </plugin>

      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
修正後
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.kanasansoft.sample</groupId>
  <artifactId>sample</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>apk</packaging>
  <name>sample</name>

  <dependencies>
    <dependency>
      <groupId>com.google.android</groupId>
      <artifactId>android</artifactId>
      <version>2.2.1</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>com.jayway.maven.plugins.android.generation2</groupId>
        <artifactId>maven-android-plugin</artifactId>
        <version>2.9.0-beta-5</version>
        <configuration>
          <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>
          <assetsDirectory>${project.basedir}/assets</assetsDirectory>
          <resourceDirectory>${project.basedir}/res</resourceDirectory>
          <nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory>
          <sdk>
            <platform>7</platform>
            <path>${user.home}/Developer/android-sdk-mac_x86</path>
          </sdk>
          <deleteConflictingFiles>true</deleteConflictingFiles>
          <undeployBeforeDeploy>true</undeployBeforeDeploy>
          <extractDuplicates>true</extractDuplicates>
        </configuration>
        <extensions>true</extensions>
      </plugin>

      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

2011年08月20日

OS X Lion(10.7)に羊を数えさせる方法

ふと思いついたので書いてみたら簡単に動いた。

OS X Lion(10.7)が日本語の音声データに対応した。これで、Text to Speechで日本語を喋らせることができる。
標準では、日本語対応の音声データは入っていないはずなので、インストールが必要。
日本語音声データの簡単なインストール方法
「システム環境設定」の「スピーチ」から「テキスト読み上げ」を選択し、「システムの声」プルダウンメニューの「カスタマイズ...」を選択する。
開いたダイアログから、「日本語(日本)」の中の「Kyoko」にチェックを入れ「OK」をクリック。
音声データがインストールされていない場合は、ダウンロードが始まる。
Lionに羊を数えさせる
次、ターミナルを開いて以下を実行。
% ruby -e "(1..10000).map{|n| system(\"say -v Kyoko 羊が\"+n.to_s+\"匹\");sleep 1}"
10000匹まで数えてくれますよ!
その他の情報
実は、日本語で羊を数えても全然眠くならないらしい。諸説あるようだけど、英語だと「sleep」と「sheep」の発音が似ているからとかなんとか...。
Google

タグ クラウド