Cygwin を久し振りにアップデートしたところ grep の動作がおかしくなってしまいました。Emacsからgrepを呼び出ほとんどヒットしないのです。ターミナルのbashからgrepを実行した場合はちゃんとヒットするのに。
調べてみたらすぐに原因が分かりました。grepがv2.24になり、ロケールをちゃんと認識するようになったのが原因のようです。(ていうか、今までロケールを認識していなかったのが少し驚きです。)
スポンサーリンク
2016年5月23日月曜日
2016年5月5日木曜日
Inkscape タイルクローンの回転がうまくいかない
Inkscape のタイルクローンでオブジェクトに回転を付けるとうまくいかない問題に悩んでいました。例えば以下の様なタイルクローン図形を作りたいとします。
実際にやってみると以下の様になってしまいます。
実際にやってみると以下の様になってしまいます。
2016年4月30日土曜日
Android Immersive モードを使ってみた
Android 4.4でImmersiveモードがサポートされました。これは画面上部のシステムバーや下部のナビゲーションバーを隠してフルスクリーンをアプリで使えるようにするものです。日本語に訳すと「没入モード」や「没頭モード」ということになりますが、今一つしっくりこないのでImmersiveモードで通します。
最近ではこのモードを使うアプリも増えてきました。アプリを初めて起動した時、以下の様なメッセージが表示されるのを見たことがある人も多いでしょう。
メッセージにある様にシステムバー、ナビゲーションバーを表示するには画面の上端から下(または下端から上)へ向かってスワイプします。
2016年3月22日火曜日
Android SDK をアップデートしたら Genymotion エミュレータが使えなくなってしまった
Androidアプリの開発においてエミュレータは非常に便利です。ある程度まではエミュレータを使って開発するのが常套になっています。
自分は本家GoogleのAndroidエミュレータ(AVD)とGenymotionのエミュレータを使い分けていますが、やはりどうみてもGenymotionの方がよく出来ています。高速だし、Google Playを使う方法も確立されているので、Androidのほとんどの機能はGenymotion上でテストすることができます。
遅かったAVDも最近のバージョンアップでそこそこ高速になりましたが、まだしょっちゅうクラッシュするし、意味不明なLogCatエラーメッセージを大量に吐き出したりする昔からある問題は全く直っていません。やはり使い勝手はGenymotionに劣ります。何よりもGoogle Playを使った機能(アプリ内購入とか)がテストできないのは致命的です。
さてGenymotionですが、最近のAndroid SDKのバージョンアップで使えなくなってしまいました。正確に言うと、ベータチャンネルで公開されているAndroid Platform-Toolsをv24 rc1にするとデバイスを認識できなくなってしまうのです。adb devices を実行すると以下のようなメッセージが出ます。
まあまだベータバージョンだし、よくあることです。暫く待ってみるかと思ったのですが、調べてみたら簡単に直ることが分かりました。
自分は本家GoogleのAndroidエミュレータ(AVD)とGenymotionのエミュレータを使い分けていますが、やはりどうみてもGenymotionの方がよく出来ています。高速だし、Google Playを使う方法も確立されているので、Androidのほとんどの機能はGenymotion上でテストすることができます。
遅かったAVDも最近のバージョンアップでそこそこ高速になりましたが、まだしょっちゅうクラッシュするし、意味不明なLogCatエラーメッセージを大量に吐き出したりする昔からある問題は全く直っていません。やはり使い勝手はGenymotionに劣ります。何よりもGoogle Playを使った機能(アプリ内購入とか)がテストできないのは致命的です。
さてGenymotionですが、最近のAndroid SDKのバージョンアップで使えなくなってしまいました。正確に言うと、ベータチャンネルで公開されているAndroid Platform-Toolsをv24 rc1にするとデバイスを認識できなくなってしまうのです。adb devices を実行すると以下のようなメッセージが出ます。
[D:\]adb devices List of devices attached adb server version (32) doesn't match this client (35); killing... error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037: 通常 、各ソケット アドレスに対してプロトコル、ネットワーク アドレス、またはポートのどれか 1 つのみを使用できます。 (10048) could not read ok from ADB Server * failed to start daemon * error: cannot connect to daemon
まあまだベータバージョンだし、よくあることです。暫く待ってみるかと思ったのですが、調べてみたら簡単に直ることが分かりました。
2016年3月9日水曜日
Android プロジェクトのマルチcatchステートメント
Javaの世界ではJava7は既に過去の遺物で、Java8が主流になってからずいぶん経ちます。Androidアプリの開発環境はこの流れからずいぶん遅れていて、長い間公式にはJDK7でした。最近になってようやくJDK8になったようですが、それでもJDK8の全機能が使える訳ではなく、JDK7の機能でさえ限定的で、使える部分があったり、なかったりという中途半端さです。そんな中途半端な機能の一つにマルチcatch(multi-catch)ステートメントがあります。
2016年3月5日土曜日
Inkscape v0.91のスナップがうまく働かない
Inkscape でパスのノードがスナップしなくなってしまいました。
例えばペンツールで線を描くときはノードごとにグリッドにスナップしてくれるのですが、それを後でノードツールで位置調整しようとすると各ノードがスナップしてくれません。
画面右側のスナップツールバーにノードをスナップするかどうかを指定するボタンがあります。
しかしこれを設定してみてもどうもうまくいきません。
色々調べてみてようやく原因が分かりました。色々な解説ページの説明が間違っているのです。というか正確に言うと最新バージョンの仕様に合っていないのです。
例えば この解説ページ を見ると、これらのボタンは「スナップ先」を設定することになっています。
Inkscape の公式ページから辿れる ドキュメント でもそうなっています。
しかしこの部分、長い間メジャーバージョンであったv0.48と現在の最新版であるv0.91で仕様が変わったようです。v0.91ではスナップ先を指定するのではなく、何をスナップするか(つまりスナップ元)を指定するボタンになりました。意味がまったく逆です。
マウスオーバーで表示されるツールチップでは正しい動作が表示されます。
この部分多くの人が混乱しているらしく、あちこちのメーリングリストで質問があがっています。ドキュメントはそのうち更新されると思いますが、スナップがおかしいと思ったらこの部分チェックしてみてください。
例えばペンツールで線を描くときはノードごとにグリッドにスナップしてくれるのですが、それを後でノードツールで位置調整しようとすると各ノードがスナップしてくれません。
画面右側のスナップツールバーにノードをスナップするかどうかを指定するボタンがあります。
しかしこれを設定してみてもどうもうまくいきません。
色々調べてみてようやく原因が分かりました。色々な解説ページの説明が間違っているのです。というか正確に言うと最新バージョンの仕様に合っていないのです。
例えば この解説ページ を見ると、これらのボタンは「スナップ先」を設定することになっています。
Inkscape の公式ページから辿れる ドキュメント でもそうなっています。
しかしこの部分、長い間メジャーバージョンであったv0.48と現在の最新版であるv0.91で仕様が変わったようです。v0.91ではスナップ先を指定するのではなく、何をスナップするか(つまりスナップ元)を指定するボタンになりました。意味がまったく逆です。
マウスオーバーで表示されるツールチップでは正しい動作が表示されます。
この部分多くの人が混乱しているらしく、あちこちのメーリングリストで質問があがっています。ドキュメントはそのうち更新されると思いますが、スナップがおかしいと思ったらこの部分チェックしてみてください。
2016年2月22日月曜日
Android Fragment トランザクション - バックスタックの落とし穴
Android アプリケーションで Fragment を使ったことのない人はまずいないと思います。Fragment のバックスタック操作については特に難しいことなないと思っていたのですが、意外な落とし穴があることに気付きました。
Fragment を replace() するときに addToBackStack() すればスタックに追加されるし、しなければ追加されない。スタックに追加されていれば Back キーで戻ることができる。何も難しいことはありません。しかし実際にやってみるとどうもうまくいきません。
どんなときにうまく行かないかと言うと、例えば以下の例を考えます。
FragmentA, FragmentB, FragmentC の三つの Fragment を考えます。FragmentA を起点に FragmentManager#replace() で FragmentB, FragmentC へ遷移していきます。A→B に遷移するときは addToBackStack() でバックスタックに登録し、B→C に遷移するときは登録しません。概略のコードは以下のようになります。
Fragment を replace() するときに addToBackStack() すればスタックに追加されるし、しなければ追加されない。スタックに追加されていれば Back キーで戻ることができる。何も難しいことはありません。しかし実際にやってみるとどうもうまくいきません。
どんなときにうまく行かないかと言うと、例えば以下の例を考えます。
FragmentA, FragmentB, FragmentC の三つの Fragment を考えます。FragmentA を起点に FragmentManager#replace() で FragmentB, FragmentC へ遷移していきます。A→B に遷移するときは addToBackStack() でバックスタックに登録し、B→C に遷移するときは登録しません。概略のコードは以下のようになります。
登録:
投稿
(
Atom
)







