2011/12/23

Cygwin Terminal が起動しない

最近、Cygwin をアップデートしました。
Cygwin Terminal というメニューが追加になっていて、mintty が使えるようになったみたいです。
ところが、そのメニューをクリックしてみると、
/usr/bin/mintty: could not load icon from '/Cygwin-Terminal.ico'
というエラーが出てしまうのです。

Cygwin のホームディレクトリには Cygwin-Terminal.ico はちゃんと存在します。
そして何よりも、以下の条件が全く同じ他のマシンでは問題なく実行されているのです。

Windows7 (64bit)
cygwin 1.7.9(0.237/5/3)
mintty 1.0.2


うーん。原因不明です。
とりあえず対症療法としては、Cygwin Terminal メニューを右クリック → プロパティ


ここの、リンク先が以下のようになっているので、
C:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico -

以下のようにアイコン指定部分を削除してしまいます。
C:\cygwin\bin\mintty.exe -

これで一応起動するようにはなります。

2011/12/09

Dropbox SDK for Android を使ってみた (4) - ファイルをアップロードする

Dropbox SDK for Android を使ってみた (3) - Access Tokenを保存する で認証できるようになったら、次はファイルをアップロードしてみます。

ファイルのアップロードは以下のように、putFile というメソッドを使って実行することができます。

2011/12/04

Emacsclient ERROR

emacs23.1.1 on Windows7 (64bit) での出来事。
ある日突然、以下のようなエラーが出るようになってしまいました。
emacsclientw.exe: connect: 対象のコンピューターによって拒否されたため、接続できませんでした。

このエラーの後、立ち上がりはするのだけれど、別ウィンドウで表示されてしまうのです。
原因はいくつか考えられると思うのですが、私の場合は、emacs を終了しているのも関わらず、以下のファイルが残っているのが問題でした。
%HOME%\.emacs.d\server\server
記憶にはないのですが、emacsを強制終了してしまったかして、serverファイルが消えずに残っていたみたいです。
このファイルを削除して起動しなおしたら問題なく動作するようになりました。

2011/11/26

Ice Cream Sandwich を BeagleBoard-xM 用にビルドしてみた (2) - ソースコード取得

Ice Cream Sandwich を BeagleBoard-xM 用にビルドしてみた (1) - 前準備 で環境は整ったので、次はソースコードをダウンロードします。
まず、最初にコードをダウンロードしてくるディレクトリを作成します。名前は何でも良いのですが、今回は“mydroid”にしました。
$ cd ~
$ mkdir mydroid
$ cd mydroid

repository を initialize します。今回は、Ice Cream Sandwich を取ってくるため、android-4.0.1_r1 タグを指定しました。
2011/11/27 追記 Ubuntu 11.10 では、android-4.0.1_r1 はコンパイルできないようです。現時点で最新のソースは11.10 にも対応しているようなので、新たなタグが打たれるまでの間は、masterブランチから取ってきてやる必要がありそうです。(参考: ICS full_x86-eng build failure (Ubuntu 11.10 x64)
$ repo init -u https://android.googlesource.com/platform/manifest -b master

ユーザ名とメールアドレスを聞かれるので、入力します。
ソースコードを取得するだけなら、何を入力しても大丈夫のようですが、正確な情報を入れておいた方が良いでしょう。

2011/11/25

Ice Cream Sandwich を BeagleBoard-xM 用にビルドしてみた (1) - 前準備

@ Ubuntu 11.10

大分、放ったらかしになっていた BeagleBoard-xM がかわいそうなので、 Ice Cream Sandwich (ICS) をインストールして遊んであげようかと思い立ちました。
(実は、ICS が動いている端末を買う余裕がないだけ…)

Windows XP (32bit) 上の VMware に Ubuntu (64bit) をインストールしてみた ところなので、一から環境作り直し。
ブログネタとしては丁度良いですな。

というわけで、Initializing a Build Environment を参考に、まずは環境構築から。

Windows XP (32bit) 上の VMware に Ubuntu (64bit) をインストールしてみた

Gingerbread 以降のコンパイルには 64bit 版の Ubuntu が必要とのこと。
が、うちには最近買ったノートPC以外に64bit OS が乗ってるマシンがないですよと。

ノートPC に VMware 入れてもいいんだけど、それだったらデスクトップをデュアルブートにすれば良い気もするし、そもそも、「32bit の XP 上に 64bit Ubuntu って乗せられないんだっけ?」と思ったわけです。
で、ちょっと探してみたら、VMware Playerを使う(前)という記事にCPU次第では問題なくいけるとの記述が。

というわけで、以下のようなスペックで試してみました。

CPU: Intel(R) Core(TM)2 Quad CPU Q9550
VM:  VMware 4.0.1
HOS: Windows XP (32bit)
GOS: Ubuntu 11.10 (64bit)


結果、普通にインストールできました。
特に何の工夫もいらなかったので、書くことないです。

単なる動作報告ですな。

2011/11/24

Dropbox SDK for Android を使ってみた (3) - Access Tokenを保存する

Dropbox SDK for Android を使ってみた (2) - 認証画面を表示する では最もシンプルに Dropbox の認証画面を表示する方法を書きましたが、その方法だと、Activity を起動する度に認証画面が出てきてしまい、あまり実用的ではありません。
ではどうしたら良いのかというと、 Preference に Access Token を保存してやれば、前回までにアクセスした情報を覚えていてくれるので、認証画面を再度表示させる必要はありません。

以下が、Access Token を Preference に保存する場合のサンプルです。
Dropbox SDK for Android を使ってみた (2) - 認証画面を表示する のコードと diff をとって見てもらうと分かりやすいかもしれません。

しつこいようですが、App Key の Status が "Development" だと、App Key を作成したアカウントのみでログイン可能なので気を付けてください。←自分、やっちゃってるんで…orz

2011/11/23

Dropbox SDK for Android を使ってみた (2) - 認証画面を表示する

Dropbox SDK for Android を使ってみた (1) - 前準備 で Dropbox SDK を使用する準備ができたら、 認証画面を表示して、Dropbox のフォルダにアクセス出来るようにしなければなりません。

以下は認証画面を表示する最もシンプルな方法です。
ただ、この方法は、Activity にアクセスする度に認証画面が表示されてしまうので、あまり実用的ではありません。

現実的には Access Token を保存しておき、すでに認証済みであれば認証画面を出さないという方法になると思いますが、そちらの方法は、Dropbox SDK for Android を使ってみた (3) - Access Tokenを保存するに書いたので、そちらを参照してください。

以下は、認証画面を出すプロセスをわかりやすくするために作ったサンプルです。
APP_KEY、 APP_SECRET、 ACCESS_TYPE を適切に書き換えてやれば動作します。

ちなみに、App Key の Status が "Development" だと、App Key を作成したアカウントのみでログイン可能なので気を付けてください。

Dropbox SDK for Android を使ってみた (1) - 前準備

DropBox は Android からアクセスできるAPIを提供してくれています。
今回、ちょっとそのSDKを使ってみたので、その方法を書いておこうと思います。

まずは、前準備から。

2011/11/22

Android プロジェクトを jar ライブラリ化できるのか?

以前、Android プロジェクトを jarライブラリ化する というエントリで、
本件、Googleが公式に出来ないと発表していることがわかりました。 res を使っている場合、jarライブラリ化するのは諦めた方が良さそうです。
と書きました。
ただ、みなさん考えることは同じのようで、ADT r14 でこれを解決したという記事を見つけました!
Android Developers Blog: Changes to Library Projects in Android SDK Tools, r14

「おー、やったー」と思って、いろいろやってみました。
が、結果を先に書いておくと、まだ res を含んだプロジェクトの jarライブラリ化は出来ないようです。

その辺の勘違いについて書いておこうと思います。

2011/11/08

Android Market のマイアプリが何かおかしくなった

「利用可能なアップデートがあります」という Notify が出たので、Android Market アプリを立ち上げてみましたが、インストールしてあるはずのアプリが全然出てきません。

「おかしいなぁ」と思って、よくよく見てみると上部に表示されているメールアドレスが普段使っている物ではないではないですか。
確かにマルチアカウント設定にしてはいるけど、今までは大丈夫だったのだけど。


というわけで、メニューからアカウントを選択して、メインのアカウントに変更してやれば問題なく更新できました。

いつの間にか、Android Market がマルチアカウントに対応したみたいですね。

2011/10/19

VAIO Type W に Ubuntu をデュアルブートで入れてみた

VAIO Type W に Ubuntu をデュアルブートで入れてみた - Wubi編 1 でデュアルブート環境を作ったものの、ブートローダが2回も表示されるという何だかちょっと気持ちが悪い感じになってしまいました。
そもそも、Windows のファイルシステム上に Ubuntu をインストールしているため、MBR から直接 Ubuntu を起動できないんですね。
(もしかしたら出来るかもしれませんが、結構トリッキーなことをしないとダメだと思われます)

で、結局 Wubi を使用しないで正攻法でデュアルブート環境を作ってみることにしました。
参考にさせていただいたのは、Windows 7とUbuntuが仲良く共存できるデュアルブート環境の作り方 です。

2011/10/15

オペレーティング システムの一覧を表示する時間を 0秒にしてしまった場合の復旧方法

Windowsブートローダーが表示されるのが嫌で 「オペレーティング システムの一覧を表示する時間」を0秒にしてしまったのですが、これが悲劇の始まりでした・・・
(詳細は VAIO Type W に Ubuntu をデュアルブートで入れてみた - Wubi編 2 を参照ください)

で、これを復旧させるにはどうしようかと調べたところ、bcdedit というコマンドを使えばオーケーということがわかりました。
「そっかー、これで一件落着…ってイヤイヤイヤイヤ、確かに、デュアルブート先がWindowsマシンだったら一件落着ですけど、今回、入ってるのは Ubuntu。bcdedit 実行できないじゃん…」

Windows7 のシステム修復ディスクをUSBで起動する

とある事情によって、Windows7 のシステム修復ディスクが必要、かつCD-ROMブートが出来ないネットブックでという状況になってしまったので、USBブートできるシステム修復ディスクを作ってみました。

2011/10/14

VAIO Type W に Ubuntu をデュアルブートで入れてみた - Wubi編 2

最初に書いておきます。
ここに書いてあることは、やってはいけません。
完全に私の失敗談ですので、

前回(VAIO Type W に Ubuntu をデュアルブートで入れてみた - Wubi編 1)で デュアルブート化には成功したのですが、Windows ブートローダーと GRUBブートマネージャ の両方でブート領域を聞かれるので面倒くさいという課題に直面しました。

Windows ブートマネージャで Ubuntu を選択しても
Windows ブートローダー
 もう一回、選択しないといけない
GRUB のブートマネージャ

ここで、GRUBの方をよく見ると、Windows7 って項目があるじゃないですか。

で、私、安直に考えたわけです。
「おー、なるほどWindowsのブートローダーを切って GRUB だけ使えばいいじゃん」と。

2011/10/13

VAIO Type W に Ubuntu をデュアルブートで入れてみた - Wubi編 1

我が家には VAIO Type W があるのですが、久しく使われておらず可哀そうです。

正直、帯に短したすきに長しなのですが、せっかくなので何かに使ってあげたいと思い、Ubuntuをインストールしてみることにしました。
特に用途はないのですが、まぁ、もっさり感がなくなると良いなぁとか思いながら。
VAIO Type W はリカバリ領域がHDDにあったりと、Windowsを消しちゃうと何かと不便そうなので、もとの Windows を残したまま、デュアルブートでインストールしてみることにしました。

2011/09/30

Android Project で res を使う Library を作る

Android Project で res ディレクトリ以下を使用する Library を作成する場合は、名前が被るとうまくいかないという問題があります。
(参考:Android Project で Is Library を使う場合、res の管理に注意

では、どのようにすれば良いのかというと、Android Developers の Managing Projects
Use prefixes to avoid resource conflicts
To avoid resource conflicts for common resource IDs, consider using a prefix or other consistent naming scheme that is unique to the project (or is unique across all projects).
と書かれています。
つまり、Resource を定義するときに、他と被らないようなプレフィックスをつけるとか、特殊な名前のつけ方を検討するとかしましょう。ってことのようです。

やり方はいろいろあると思うのですが、手っ取り早いのはパッケージ名(ネームスペース)を使っちゃう方法ではないかと思いますので、以下にその方法を書いておきたいと思います。

2011/09/17

Android で現在のテーマカラー等を取得する

Android はテーマを変えるだけでアプリケーション全体の見た目を変えることが出来るので便利です。
設定でテーマを選ぶと、雰囲気が変わるアプリってありますよね。
そういうアプリを作りたくて、テーマでカラーチェンジ出来るように意識して作っていると、現在のテーマカラーを知りたいということが結構あります。

例えば、Viewを使ってアンダーライン等を作ってる場合などですね。
白を基調としたアプリの場合は黒いラインを引きたいですし、黒基調の場合は白いラインにしたいのです。
で、そういう方法は無いものかと探していたら、

Accessing Resources | Android Developers
リソースへのアクセス | ソフトウェア技術ドキュメントを勝手に翻訳 (日本語訳)

を見つけました。
というわけで、水平区切りラインを書きたい場合にはlayoutの中に以下のように書いてやると良いみたいです。

<View
  android:layout_width="fill_parent"
  android:layout_height="1dp"
  android:background="?android:attr/colorForeground" />

ちなみに、取得できるAttributeは以下のディレクトリを調べるとわかります。

%Android_SDK%/docs/reference/android/R.attr.html

2011/09/05

Pogoplug に OpenPogo を入れてみたが HDD が認識されなくなった

最初に書いておきます。
こんなタイトルつけてみましたが、実はOpenPogoは関係ありませんでした。
完全にぬれ衣です。 でも、勘違いしてもしょうがないかなって言う状況だったんですよ。

 というわけで、以下、その状況の説明。

2011/08/31

Android SDK を再インストールしたら Javadoc が表示されなくなった

2012/01/17 追記
別件で同じ問題が起こり、下記の付け焼刃的な解決方法ではうまく行かなくなったので、もう少しましな方法を見つけました。
Google APIs の Javadoc が表示されなくなった



諸事情で Android SDK を再インストールしました。(installer_r12-windows.exe)

そうしたら、インテリセンスライクなやつがうまく動かなくなって、
Note: This element has no attached source and the Javadoc could not be found in the attached Javadoc.
っていうエラーが…

で、よくよく見てみると、SDKのインストールディレクトリが

C:\Program Files\Android\android-sdk

になっている。

2011/08/11

Android Project で Is Library を使う場合、res の管理に注意

以前、Android プロジェクトを jarライブラリ化する というエントリで
res以下を使用したい場合は、上記の Is Library を使用することでライブラリ化することが可能です。
と書いたのですが、最近、Is Library を使っていても res 以下の扱いは注意しなければいけないことに気づきました。
具体的には、Library と Application(使用する側)に同じ名前のリソースがあると、コンパイルエラーにはならないが、実行時におかしなことが起こるのです。

この辺の事情は、以下のサイトに詳しく書いてあります。

2011/08/01

XWin Server の .xinitrc

Cygwin 1.7.7
X Server 1.9.2

X Server を立ち上げた時に、いろいろとデフォルト動作してほしいことがあります。 Cygwin の X Server を立ち上げると、xterm が起動するので、 .xinitrc みたいなファイル(デフォルトで走るシェルスクリプト)があるはずだと思ったのですが、探してもないのです。

で、いろいろ調べてみた結果、わかりました。
結論から言うと、「設定ファイルは(自分で作らないと)ない」らしいです。

2011/07/29

hgsubversion が突然動かなくなった

Subversion より Mercurial でしょ。ということで、hgsubversion を使って Subversion のレポジトリにアクセスしているのですが、ここ数日、Synchronize しようとすると
hgclonewrapper() takes exactly 4 non-keyword arguments (5 given)
というエラーがでて Synchronize できなくなってしまいました。

調べてみると、以下に情報があって、TortoiseHg と hgsubversion のバージョン不整合が原因みたいです。
https://bitbucket.org/tortoisehg/thg/issue/916/typeerror-hgclonewrapper-takes-exactly-4

TortoiseHghgsubversion
2.0.5810OK
2.1.1810NG
2.1.1819OK


2011/07/11

Kindle に Epub 形式の電子書籍をいれてみた

妻の姉から結婚祝いにAmazon kindle3をもらいました。ただ、私、英語の本といったら技術書しか読みません・・・いや、読めません。
というわけで、早速 O'Reilly の本を買ってみることにしました。
ところが、Amazon.com で売っている O'Reilly は決して安くないんですね。
これなら日本語の本買ったほうが良いなぁと思ってしまう…

ただ、以前どこかで O'Reilly の電子書籍が10分の1くらいの値段で手に入ると聞いたことがあったので、少し調べてみました。
すると、Android Market では DRM FREE の O'Reilly 本が激安で手に入ることがわかったのです。
(参考: たった600円でオライリー本をKindleで読む方法
かつ、Android にインストールした本はエクスポートしてkindle3にも入れることができるようなのです。
これはやってみるしかないということで、やってみた結果をレポートします。

AIR GEAR を使ってみた(2) - error while loading initial content

AIR GEAR を使ってみた(1) - インストール」 でプロジェクトを作成してみたものの、
error while loading initial content
というエラーが出て動きませんでした。


このエラー、ググって見ると、どうもバージョン情報が合っていない場合に出るようです。そこで、application.xml を開いてみると、先頭の2行は
<?xml version="1.0" encoding="utf-8" ?>
<application xmlns="http://ns.adobe.com/air/application/1.1">
となっています。

今回インストールした AIR のバージョンはもっと大きいはずなので、ここがおかしいようです。

2011/07/10

AIR GEAR を使ってみた(1) - インストール

Eclipse で AIR アプリケーションを作成できるプラグイン AIR GEAR というものがあるということで、使ってみることにしました。

2011/06/20

AdSense が表示されなくなった

ここ数日、ブログに AdSense が表示されなくなりました。
ブラウザを変えてもダメ。
持ってる二つのブログ両方に表示されなくなったので、コードの問題でもなさそう。
(とはいえ、両方とも blogger だから可能性はゼロではないか…)
規約に違反した等のメールも届いていません。

AdSense のページにログインすることは出来ます。
18日からレポートのログが残っていないので、18日から配信が止まっているようです。


と、ここでアカウント情報の住所が間違っていることに気づきました。
(わざとじゃないですよ)
もしかして、これのせいかなぁ。。。

とりあえず、修正しました。
PIN コードが送られてくるらしいので、それを待ってみることに。
それでダメならフォーラムに投稿してみようかな。

2011/06/03

Android プロジェクトを jarライブラリ化する

Android に関わらず、プログラムを書いていると、作った成果物をライブラリ化したいと思うことは多々あります。
Eclipse の Android 開発環境(ADT) には Is Library という設定があって、ソースコードのままライブラリとして利用出来ます。
ただ、この方法だと、再配布がしにくいです。
というわけで、Eclipse の Javaプロジェクトを jarライブラリ化する機能を使って、Android プロジェクトを jarライブラリ化する方法を紹介したいと思います。

2011/6/5 追記
この方法はres以下を使用するAndroidプロジェクトには使用できないようです。(いろいろ実験してみましたが無理でした。うまい方法をご存知の方は是非教えてください。)
res以下を使用したい場合は、上記の Is Library を使用することでライブラリ化することが可能です。
Is Libary の詳しい使い方は ADTによるLibrary Projects という Kazzz さんのエントリがわかりやすいです。

2011/8/12 追記
本件、Googleが公式に出来ないと発表していることがわかりました。
res を使っている場合、jarライブラリ化するのは諦めた方が良さそうです。
その辺については、Android Project で Is Library を使う場合、res の管理に注意 というエントリにまとめたので、参考にしてみてください。
res を使用しない場合は、以下の要領でjarライブラリ化可能ですが、Google が公式に認めていない以上、お勧めは出来ません。あしからず。

2011/05/31

R cannot be resolved to a variable がどうしても消えない

Android で開発していると、 R cannot be resolved to a variable というエラーが頻発します。


こういう時は、Eclipse が gen ディレクトリの作成をミスっているのが原因なので、

  1. gen ディレクトリ以下を全て削除してみる
  2. プロジェクト → クリーン としてみる

とかすると普通は直るのです。

ところが、今回は何回やってもエラーが消えないのです。
で、よくコンソールの出力を見てみたところ、

2011-05-31 21:29:57 - Test] res\drawable-hdpi\icon.png.org:0: エラー: Resource entry icon is already defined.
[2011-05-31 21:29:57 - Test] res\drawable-hdpi\icon.png:0: Originally defined here.

って書いてありました。
つまり、「res ディレクトリの中に icon.png が2個あるよ」ってエラーだったのです。
正確には icon.png と icon.png.org なのですが、どうも両方とも同じ物として認識してしまうようです。

というわけで、res フォルダの中に .org がついたファイルなど余計な物があるとうまくいかないということがわかりました。
バージョン管理ツールを使っている方など要注意です。

最初からコンソールをちゃんと読んでおけば気づいたのにねぇ。
慣れって恐ろしいです。

2011/03/26

ホームボタン と 戻るボタン で Activity の終了処理が異なる

@Android 2.1 Xperia

Android の Activity は以下のようなライフサイクルを持っているというのは、大抵の本やサイトで紹介されています。(以下の図は Tech Booster さんから頂きました。大変わかり易いです)

ただ、「Activity がもう表示されない」という状態も
  • 戻るボタンで Activity が消える
  • ホームボタンで Activity が消える
  • 省電力モードになって画面が消える
  • 他のアプリケーションがかぶさって Activity が消える
といろいろなパターンがあります。
そして、最近気づいたのですが、これらのパターンで呼ばれるイベントが異なるようなのです。

以下、Xperia で動作させてみたときのログです。

起動
DEBUG/LifeCycleTest(3005): onCreate
DEBUG/LifeCycleTest(3005): onStart
DEBUG/LifeCycleTest(3005): onResume



戻るボタン
DEBUG/LifeCycleTest(3005): onPause
DEBUG/LifeCycleTest(3005): onStop
DEBUG/LifeCycleTest(3005): onDestroy



アイコンクリック
DEBUG/LifeCycleTest(3005): onCreate
DEBUG/LifeCycleTest(3005): onStart
DEBUG/LifeCycleTest(3005): onResume



ホームボタン
DEBUG/LifeCycleTest(3005): onSaveInstanceState
DEBUG/LifeCycleTest(3005): onPause
DEBUG/LifeCycleTest(3005): onStop



アイコンクリック
DEBUG/LifeCycleTest(3005): onRestart
DEBUG/LifeCycleTest(3005): onStart
DEBUG/LifeCycleTest(3005): onResume



時間がたって画面消灯
DEBUG/LifeCycleTest(3028): onSaveInstanceState
DEBUG/LifeCycleTest(3028): onPause



電源ボタン
DEBUG/LifeCycleTest(3028): onResume



画面回転
DEBUG/LifeCycleTest(3028): onSaveInstanceState
DEBUG/LifeCycleTest(3028): onPause
DEBUG/LifeCycleTest(3028): onStop
DEBUG/LifeCycleTest(3028): onDestroy
DEBUG/LifeCycleTest(3028): onCreate
DEBUG/LifeCycleTest(3028): onStart
DEBUG/LifeCycleTest(3028): onRestoreInstanceState
DEBUG/LifeCycleTest(3028): onResume



ハードウェアキーでカメラアプリ起動
DEBUG/LifeCycleTest(3028): onSaveInstanceState
DEBUG/LifeCycleTest(3028): onPause
DEBUG/LifeCycleTest(3028): onStop


戻るボタンで Activity が見えなくなる場合は onDestroy が呼ばれてアプリケーションが終了しているのに対し、ホームボタンの場合は onPause でサスペンド状態になるようです。
ユーザから見ると、どちらも同じ動作に見えるんですけどね。
また、単に画面が消える場合は onStop で止まるようです。

あと、 onSaveInstanceState と onRestoreInstanceState は呼ばれる時と呼ばれない時があるみたいです。これ、対になっていないと意味がないような気がするのですが…
この結果だけみると、あまり使い道が無いような気がします。
この辺については、もう少し調べてみる必要がありそうです。
誰か詳しい方がいらっしゃいましたら、是非教えてください。

2011/10/11 追記
「ユーザから見ると、どちらも同じ動作に見えるんですけどね」と書いたのですが、Androidの思想的には全然違う動作のようです。
ホームボタンを押した場合は、ホームアプリケーションが起動して現在のアプリケーションが後ろに隠れるだけなのに対し、戻るボタンはActivityスタックからポップするという動作になるようです。
Activityのスタックについては、Y.A.M の 雑記帳: Android Activity, Task, Stack, Launch mode が非常にわかりやすかったので、是非参考にしてみてください。


以下に、実際に動作させたコードを載せておきます。

2011/03/22

Mercurial で過去のログメッセージを変更する

@ Mercurial 1.8.1
@ TortoiseHg 2.0.2

Mercurial は一つ前のコミットをロールバックでなかったことにできますが、2つ以上前のログを変更する方法はあまり公開されていない気がします。
しかし、MQというキューを管理するExtensionを使えば、比較的簡単に実現することができます。
といっても、以下のような制約があるので、実用できる場面は少ないかもしれません。
  • Synchronize 先には反映されません
    (最後に例を載せておきます)
  • マージポイント以前には戻れません

以下では、TortoiseHg を使った例を示しますが、コマンドラインでも可能です。コマンドラインユーザはきっとMQもバリバリ使いこなしているかと思うので、こんな説明は必要ないでしょう。(超勝手な想像だな…)

2011/03/21

Googleドキュメント のスプレッドシートで通貨表示が$になってしまった

Googleドキュメント に既存のスプレッドシートをアップロードしたところ、通貨表示が$になってしまいました。(図1 左の矢印)
セルを選択して通貨を¥にすることは出来るのですが(図1 右の矢印)、この方法だと通貨に小数点以下2桁まで表示されてしまいます。(図2)
図1

図2

いろいろ試してみたところ、
ファイル → スプレッドシートの設定 → 地域と言語
を日本語にしてやると、デフォルト通貨が¥になり、小数なしの通貨を選択できるようになりました。(図3)
図3

2011/02/25

MercurialEclipse が dotencode なんちゃらってエラーを吐くようになった

あるプロジェクトを Eclipse にインポートしたら、
requirement 'dotencode' not supported!.
ってエラーが出るようになってしまいました。


dotencode Mercurial でググってみると、どうも Mercurial 1.7.0 以降で追加された新しいリポジトリ形式らしいです。
Tortoise HG では問題なく動作しているので、
ウィンドウ → 設定 → チーム → Mercurial
  • Use default (built-in) Mercurial executable のチェックを外す
  • Mercurial 実行ファイルに  C:\Program Files\TortoiseHg\hg.exe  と入力
とすると、とりあえず動作するようにはなりました。

2011/02/08

Android のデフォルトアイコンを調べる

Android アプリケーションでは
android.R.drawable.xxx
と書くことでデフォルトで用意されているアイコンなどを使用することができます。
(Rの前に android とついているところがポイントです)

どのようなアイコンが使えるのか調べるためには、

android-sdk-dir/platforms/android-X/data/res

を見れば良いのですが、このディレクトリにあるアイコン全部を使えるわけではないのです。
どうも、「layout で使う用」と「一般に公開する用」で出しわけている模様。

「デフォルトで使えるアイコンの一覧が欲しいなぁ」と思って探してみたものの、見つかりませんでした。(あんまり本気で探してないから、本当はあるかも)
プログラマーたるもの、無いものは作れば良いのです。
というわけで、作ってみました。
意外とあっさり。リフレクションって素晴らしい!

2011/02/04

Eclipse に既存の Android プロジェクトをインポートする際、はまるポイント3

Eclipse に既存の Android プロジェクトをインポートする際、はまるポイント1
Eclipse に既存の Android プロジェクトをインポートする際、はまるポイント2
に続いて、もう一点はまったのでご報告します。

インポートした際、@override などのアノテーションでひっかかる場合は、以下の方法で治るかもしれません。

2011/10/11 追記
最近、Javaのアップデートが激しいので、以下のようなエラーが出ました。
Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.
これ、指示されたように Fix Project Properties を選択してもうまくいかない場合があります。
というのも、Fix Project Properties は以下のコンパイラ選択を自動でやり直してくれるツール(?)なのですが、何故か1.5にしちゃうんです。
もとが1.6で作成されているプロジェクトの場合、Fix Project Properties では直りません。以下の手順を手動で実行して1.6にしてあげましょう。


プロジェクト右クリック → プロパティー → Java コンパイラー

プロジェクト固有の設定を可能にするにチェックを入れて、コンパイラ準拠レベルを変更します。
ちょっと前までは、1.5 でないとコンパイルできなかったのですが、最近になって 1.6 でもコンパイルが通るようになったみたいです。(あんまり調べてませんが…)
どちらか、プロジェクトで採用しているコンパイラを選ばないとうまくいきません。


また、デフォルトのコンパイラから変更してしまうことも出来ます。

ウィンドウ → 設定 → Java → コンパイラ

この方法で変更すると、同じワークスペースのプロジェクト全部に影響するので気をつけてください。


2011/02/03

EGIT をインストール

@ Eclipse 3.6 Helios Service Release 1

EclipseにGitの機能を追加するプラグインEGIT
ちょっと古いサイトを見ると、EGITはアップデートサイトからインストールできますって書いてあって、以下のアドレスが示されている。
http://www.jgit.org/update-site/
で、いつものように、
ヘルプ → 新規ソフトウェアのインストール
ってやると普通にインストール出来ちゃったりする。

でも、よく見てみるとバージョンが 0.4.9 とかで古い…
(EGIT 関連のサイトを巡ってて気づいたのです)

本家の EGITのサイト に行ってみると、すでに 0.10.1 がリリースされているのだという。
むー、大分古いのを入れてしまった。
(といっても、まだメジャーバージョンアップはしてないのね)
というわけで、アンインストールして、本家のEGITを入れることにしました。

ところが!!
リポジトリーの追加をしようとすると 「ロケーションの重複」 と出て追加が出来ないのです。

どういうこと?
と思ったら、EGIT のサイトはデフォルト(?)でプラグインのリストに入ってるみたいですね。
"使用可能なソフトウェア・サイト"というリンクをクリックして

出てきた一覧から、本家のサイト http://download.eclipse.org/egit/updates を探します。

チェックして、OKを押せば作業対象のドロップダウンリストに表示されるようになります。
めでたしめでたし。

ちなみに、0.4.9 と 0.10.1 ではかなりインターフェースに差がありました。

2011/02/02

Android で Googleドキュメントの一覧を取得する

@ Xperia (Android 2.1 Eclair)

Googleドキュメントやその他のGoogleのサービスは、その多くがHTTPアクセスでXMLを取得できるAPIを用意しているため、比較的容易にその通信を実装することができます。

↓ Google Docs のプロトコル
http://code.google.com/intl/en/apis/documents/docs/3.0/developers_guide_protocol.html

しかし、定型文のプロトコルを毎回ユーザが実装するのは面倒くさい。ってことで、Google は各言語からアクセス可能なラッパーAPIを用意しています。

↓ Google Data API
http://code.google.com/intl/en/apis/gdata/docs/client-libraries.html

ちょっと前まではこの Google Data API で Android用のAPIも定義されていたのですが、最近になって分離したみたいです。というわけで、上記の Google Data API では Android用のプログラムは書けません。
トライはしてみたのですが、どうもうまくいきませんでした。API としては結構良い出来なんですがねぇ。
とはいえ、GoogleがAndroidを見捨てるはずがありません。現在は以下のAPIを使うことができます。

↓ Google API Client Library for Java
http://code.google.com/p/google-api-java-client/

というより、今後Java用のAPIはこちらに移行するんでしょうかね。 このAPIはまだアルファバージョンのため、まだ不完全感が漂っていますが、使ってみると結構良い感じです。
以下にAndroidアプリケーションから Google API Client Library for Java を使って Googleドキュメント の一覧を取得するサンプルを挙げておきます。
  1. いつも通り Eclipse上で Android プロジェクトを作成します
  2. Google API Client Library for Java から google-api-client-x.x.x-java.zip をダウンロードして解凍します。今回は、google-api-client-1.2.2-alpha-java.zip を使用しました。
  3. プロジェクト直下に lib ディレクトリを作成し、先のライブラリをおきます。少なくともこのバージョンでは google-api-client-1.2.2-alpha.jar という1ファイルにまとめられているようです。
    (その他のファイルはソースコード等です。デバッグには使えますが、コンパイルするだけなら必要ありません。)
  4. Eclipse上でプロジェクトをリフレッシュ(F5)します。lib ディレクトリが表示されるので、ライブラリを選択して、
    右クリック→ビルド・パス→ビルド・パスに追加
    としてライブラリを登録します。
  5. MainActivity.java、 AndroidManifest.xml を以下のように修正します。
    MainActivity.java
    package com.kokufu.test;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import android.accounts.Account;
    import android.accounts.AccountManager;
    import android.accounts.AuthenticatorException;
    import android.accounts.OperationCanceledException;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.ViewGroup.LayoutParams;
    import android.widget.TextView;
    
    import com.google.api.client.googleapis.GoogleHeaders;
    import com.google.api.client.googleapis.GoogleTransport;
    import com.google.api.client.googleapis.GoogleUrl;
    import com.google.api.client.http.HttpRequest;
    import com.google.api.client.http.HttpTransport;
    import com.google.api.client.util.Key;
    import com.google.api.client.xml.XmlNamespaceDictionary;
    import com.google.api.client.xml.atom.AtomParser;
    
    public class MainActivity extends Activity {
        private static final String TAG = "GoogleDocsTest";
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            // AccountManager を通じてGoogleアカウントを取得
            AccountManager manager = AccountManager.get(this);
            Account[] accounts =
                        manager.getAccountsByType("com.google");
            Bundle bundle = null;
            try {
                bundle = manager.getAuthToken(
                        accounts[0], // テストなので固定
                        "writely",   // ※1
                        null,
                        this,
                        null,
                        null).getResult();
            } catch (OperationCanceledException e) {
                Log.e(TAG, "", e);
                return;
            } catch (AuthenticatorException e) {
                Log.e(TAG, "", e);
                return;
            } catch (IOException e) {
                Log.e(TAG, "", e);
                return;
            }
    
            String authToken = "";
            if (bundle.containsKey(AccountManager.KEY_INTENT)) {
                // 認証が必要な場合
                Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT);
                int flags = intent.getFlags();
                flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK;
                intent.setFlags(flags);
                startActivityForResult(intent, 0);
                // 本当はResultを受けとる必要があるけど割愛
                return;
            } else {
                // 認証用トークン取得
                authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
            }
    
            // 送信準備
            HttpTransport transport = GoogleTransport.create();
            GoogleHeaders headers = (GoogleHeaders) transport.defaultHeaders;
            headers.setApplicationName("Kokufu-GoogleDocsTest/1.0");
            headers.gdataVersion = "3";
            headers.setGoogleLogin(authToken); // 認証トークン設定
    
            // Parser を準備して Transport にセットする
            AtomParser parser = new AtomParser();
            // 空の Dictionary でとりあえず問題なさげ
            parser.namespaceDictionary =
                       new XmlNamespaceDictionary();
            transport.addParser(parser);
    
            // 送信
            Feed feed = null;
            try {
                HttpRequest request = transport.buildGetRequest();
                request.url = new GoogleUrl("https://docs.google.com/feeds/default/private/full"); // ※2 
                feed = request.execute().parseAs(Feed.class);
            } catch (IOException e) {
                Log.e(TAG, "", e);
                return;
            }
    
            // 結果を表示
            String tmp = "";
            for (Entry entry : feed.entries) {
                tmp += entry.title + "\n";
            }
            TextView v = new TextView(this);
            v.setText(tmp);
            this.addContentView(
                    v,
                    new LayoutParams(LayoutParams.WRAP_CONTENT,
                                     LayoutParams.WRAP_CONTENT));
        }
    
        /**
         * Feed タグ
         */
        private class Feed {
            @Key("entry")
            public List entries = new ArrayList();
        }
    
        /**
         * Entry タグ
         */
        private class Entry {
            @Key
            public String summary;
    
            @Key
            public String title;
    
            @Key
            public String updated;
          }
    }
    

    AndroidManifest.xml に以下のパーミッションを追加
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.INTERNET" />
    
onCreate の中に全部書いちゃうという酷いプログラムですが…まぁ可読性は良いってことで。これくらいシンプルにかけちゃうっていうのが、ライブラリを使う魅力ですね。

わかりやすさを重視して書いているので、Google Account が登録されていないような端末で動作させるとアプリが落ちます。その他、通信状況が悪かったりしてもうまくいかないことがあると思いますが、その辺ご容赦ください。

また、このやり方で、Google Docs 以外のGoogleサービスにもほとんどアクセスが可能です。
ポイントは ※1 に書いてある"writely"という文字列(authTokenType)。この"writely"が、Google Docsに対するアクセス権の認証を意味しています。
その他の authTokenType 一覧は無いものかと探してみたら、まさにタイムリー!!
Mine さんの AndroidのGoogle Authenticatorを解析(?)してみた という投稿に詳しく書いてあります。
素晴らしい!

また、※2の Query についてはGoogle Docs のプロトコル
http://code.google.com/intl/en/apis/documents/docs/3.0/developers_guide_protocol.html
に詳しく載っています。
この辺を読まなくても良いくらいに隠蔽してくれるとAPIとして使いやすいんですけどねぇ。
まぁ、アルファ版なんで仕方がありません。API仕様もこれからどんどん変わっていく可能性があるので、この記事の賞味期限は短めだろうなぁ…

2011/02/01

hg から git へ変換

最近、gitの出番が多くなってきました。
今まで、自分のソースの管理は hg (Mercurial) でやってきたのですが、git の操作に慣れるためにも、これまでの履歴を git で管理しようかと思いまして、こちらのサイトを参考に変換してみました。

$ git clone git://repo.or.cz/fast-export.git

$ mkdir git

$ cd git; git init; cd ..

$ mkdir hg

$ cd hg; hg clone ********; cd ..

$ ls
fast-export  git  hg

$ cd git/

$ ../fast-export/hg-fast-export.sh -r ../hg/********

  1. fast-export をとってきます
  2. git の空レポジトリを作成します
  3. 変換元の hg レポジトリをクローン
  4. git のトップディレクトリで hg-fast-export.sh を実行すれば、変換完了です

とりあえず、私の環境では、ブランチもきちんと変換されました。
個人用のレポジトリなので、あまり複雑ではないですが。

2011/01/13

Android SDK 付属のサンプルを Eclipse にインポートする

Eclipse に既存の Android プロジェクトをインポートする で既存のプロジェクトをインポートする方法を書きましたが、 Android SDK 付属のサンプルは、.project ファイルがないため、この方法ではインポートすることができません。

ただ、Android SDK 付属のサンプルはもっと簡単にインポートすることができます。


  1. ファイル → 新規 → Android プロジェクト

  2. Create project from existing sample
    ビルド・ターゲットを選択すると、そのバージョン付属のサンプルが選択できるようになります。

2011/01/11

Android のソースコードビルドでコンパイルエラー

@ Ubuntu VMware用仮想マシン (Ubuntu 8.04 LTS)

VMware 上の Ubuntu で Android のソースコード (Eclair) をビルドしてみたら、以下のようなエラーを出して止まってしまいました。

acp: file 'out/host/linux-x86/obj/EXECUTABLES/vm-tests_intermediates/tests/data' does not exist
make: *** [out/host/linux-x86/bin//../cts_dalviktests] エラー 1

repo でバージョン指定して取ってきたコードなので、おかしいと思ってググってみると、以下に「仮想マシンのメモリサイズが足りないでは」との記述が。
というわけで、仮想マシンのメモリサイズを 1024MB に変更して再ビルド。
今度はちゃんと通りました。

https://groups.google.com/group/android-developers/msg/8891b5cc57bbb223?hl=ja


2011/01/04

Eclipse に既存の Android プロジェクトをインポートする際、はまるポイント2

参考:
Eclipse に既存の Android プロジェクトをインポートする
Eclipse に既存の Android プロジェクトをインポートする際、はまるポイント1

上記を実行しても、まだエラーが出る場合は、エラーの箇所を追っかけてみます。
マーカー → エラー

よくあるのが、日本語コードの不一致です。エラーの箇所をチェックすると、文字化けがその上部に発生したりしていないでしょうか?その場合は、日本語コードを確認してみます。
  1. インポートしたプロジェクトを選択して、
    右クリック → プロパティ

  2. リソース → テキストファイルのエンコード
    その他を選択して、文字化けしないようなエンコードを選択してやってください。

これでもまだ、うまく動かない場合は、エラーの箇所を1つづつ追っかけてやる必要があります。
これはなかなか厄介です。
今後、またはまるような場合があった場合は、記事を書こうかと思います。

穀風: Eclipse に既存の Android プロジェクトをインポートする際、はまるポイント3

Eclipse に既存の Android プロジェクトをインポートする際、はまるポイント1

Eclipse に既存の Android プロジェクトをインポートする でインポートまで完了しても、私の経験では、かなりの確率でそのままでは動きません。
まず、一番最初に疑われるのが、適切なバージョンのAPIがインストールされていない場合です。

インポート直後、コンソールに "Unable to resolve target 'xxxxxxxx:xxxxx APIs:?'" のようなエラーが出ていないか確認します。
このエラーが出ている場合は、
  1. ウィンドウ → Android SDK および AVD マネージャー → Avbailable packages
    先ほどのエラーで出ていたバージョンの API をインストールします。 revision ではなく、API のバージョンなので気を付けてください。(私は何度か間違えましたww)

    また、気を付けなければいけないのが、Google Maps 等を使っているようなアプリケーションの場合、Android Repository ではなく、
    Third party Add-ons → Google Inc. add-ons
    からSDKをインストールしなければならない
    ということです。これは、Google Maps のように、一部の API は Android 標準ではなく、Google の Add-on として提供されているためです。その辺の詳しい事情は、Google Maps がらみの書籍には大抵書いてありますので、そちらを参考にしてください。
    実際、どのAPIが必要なのかは、先ほどのコンソールに出ていたエラーで大体推測できます。
  2. インストール後、
    右クリック → プロパティ

  3. Android → Project Build Target
    先ほどインストールしたターゲットを選択します。
    ここで選択する項目を間違えると、結構はまるので気を付けてください。

    インストール後、ここにターゲットが出てこない場合は一度 Eclipse を再起動すると出てくると思います。それでも出てこない場合は、もう一度 Android SDK および AVD マネージャーを開いて、インストールされているか確認してみましょう。
これでも、うまく動かない場合は Eclipse に既存の Android プロジェクトをインポートする際、はまるポイント2 を参考にしてみてください。

Eclipse に既存の Android プロジェクトをインポートする

@Eclipse Pleiades 3.6 Helios
@ADT 8.0.1
@Android SDK Rev. 8

Android でサンプルプログラム等の既存プロジェクトをインポートする方法を書いておきます。インポート自体は Eclipse でよく行う作業だと思うのですが、Android SDKのバージョンが違ったりすると、うまく動かないことがあるので、そのあたりを回避するヒントも書いておこうかと思います。
前提条件として、新規の Android プログラムは Eclipse でコンパイルして動作する状態とします。

注: .project ファイルのないサンプルは、以下の方法ではインポートすることができません。Android SDK 付属のサンプルは Android SDK 付属のサンプルを Eclipse にインポートする にインポートする方法を書きました。
2013/11/16 追記
.project のない Android プロジェクトをインポートする方法を書きました。
穀風: Eclipse に .project の無い既存の Android プロジェクトをインポートする
  1. ウィンドウ → 設定 → Android
    まず最初に SDK ロケーションが正しく設定されているか確認しておきます。
    Workspace を新規に作るとSDKロケーションが変わってしまいますので。
  2. ファイル → インポート → 一般 → 既存プロジェクトをワークスペースへ → 次へ

  3. ルートディレクトリーの選択
    インポートしたいディレクトリを選択します。選択ディレクトリ以下を検索して、インポートできるプロジェクトが一覧表示されます。
    .project ファイルがない場合は何も表示されません。その場合は、Eclipse でインポートできるサンプル等ではないので、別の方法で Eclipse に取り込んでやる必要があります。
    2013/11/16 追記
    .project のない Android プロジェクトをインポートする方法を書きました。
    穀風: Eclipse に .project の無い既存の Android プロジェクトをインポートする

  4. 完了
これで何のエラーもなく動作すればラッキーですが、そうは問屋がおろしません。
そういう場合は、
Eclipse に既存の Android プロジェクトをインポートする際、はまるポイント1
Eclipse に既存の Android プロジェクトをインポートする際、はまるポイント2
を参考にしてみてください。

2011/01/03

Cygterm で日本語エンコードを変更する

私は cygwin のターミナルに cygterm (Tera Term に付属) を使っていますが、デフォルトの日本語エンコードが SJIS になってるのです。(少なくとも、 Tera Term Ver. 4.68 では)

ただ、そのままだと、ls って打ったら日本語ファイルが文字化けしてしまうのです。
ちなみに、ls のバージョンは 8.8 です。
$ ls --version
ls (GNU coreutils) 8.8
Packaged by Cygwin (8.8-1)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Richard M. Stallman and David MacKenzie.
これを回避するには、Cygterm の設定を変えてあげればよいのですが、いつも忘れてしまうので、以下に書いておこうと思います。

変更するのは、 /KR と /KT のところだけです。

C:\Program Files\teraterm\cygterm.cfg
# CygTerm setting

TERM = ttermpro.exe %s %d /E /KR=UTF-8 /KT=UTF-8 /VTICON=CygTerm /nossh
TERM_TYPE = vt100
PORT_START = 20000
PORT_RANGE = 40
SHELL = auto
ENV_1 = MAKE_MODE=unix
ENV_2 = 
LOGIN_SHELL = Yes
# HOME_CHDIR = No
SSH_AGENT_PROXY = No