Meblog

このブログ記事は個人の見解であり、所属する組織の公式見解ではありません

PSPと私

今更PSPタクティクスオウガなどプレイしてみる。

PSPを手に入れたのは最近だから今のタイミングで仕方ないのだ…

 

PSPは最近なんとなく手持ち無沙汰でゲームしたくなる事があり、中古品を手に入れた。

本体は箱なしだったけど、かなり状態のいいやつを手に入れた。6500円くらい。

初期のものは、遊んでいるうちにディスクが飛び出してくるというウワサを聞いたから、避けた。携帯ゲーム機のくせにディスクを読む音がするのが、すごく違和感がある..

 

ところで、これむずいなあ。普通にキャラクターががしがし死んでいく。
スーパーファミコン版とくらべると、死ぬのが3回までゆるされていたり、履歴を辿って前の手番から始められたりして、かなり簡単になってはいると思うんだけど。それでもまだ難しい。

------

どうも電車の中や外食してる間など、公共機関で携帯ゲームをするのは気が引ける。オトナだし。
周りを見てみると、割りと平気でPSPやらDSやら大人も楽しんでいるのがわかる。
よく見る光景ではあるのだけど、自分の中ではまだまだ違和感がある。
もしかしたら、気にしていないのは彼らプレイヤー自身だけなのであって、知らず知らず奇異な目で見られてるのではないか、と思うのだ。
そんな中、PSPを颯爽と持ち出してプレイする勇気がわかないのだ。

 

しかし、既にスマホゲームはかなりの市民権を得てるように思う。
たぶんこの大きな違いは、スマホの場合はゲームに特化したデバイスでなく、ぱっと見ではゲームをしているのか、まとめサイトをみているのか、メールみてるのかわからないからだろう。

-----

あんまり電車乗らないから、関係ないっちゃ関係ないんだけどね。
たまたま出張で電車乗る機会があったってこと

無題はやめようかな

いろいろためしためし

    • -

なんとも自堕落な生活を送りがちなので、英会話教室など検討し、おためしコースを申し込んでいる。
とはいえ、特に英語を本気で学ぶ気はなく、なんというか、とりあえずの暇つぶしになればいっか、程度のもので。
いよいよ社内でTOEIC受けないと、ってなったときに対応しようかと。

これでも、そのうち、TOEICじゃなくて、そのうちTOEFLとかIELTSとかに切り替わっていくのかしら。。
すると、また考えないといけないな。

    • -

先日買おうかどうか迷った本
(タイトル忘れた。。)

なんか古いんだけど、結局ブートローダとかの仕組みって変わらないから、買う価値もありそうだけど。
この手の本って高いし、読破するのも結構しんどいから、買うのに結構決心がいるんだ。
どうせ暇なんだし、とりあえず買ってから考えるのもありだな。

Amazon.co.jp: Embedded Android: Karim Yaghmour: 洋書
やっぱ買うならおらO'REILLYかな、という気もするが、英語か。
ドヤ顔するにはちょうどいいけどな

あるいは
Amazon.co.jp: 基礎から学ぶ 組み込みAndroid: 坂本 俊之, 出村 成和, 渡邊 昌之: 本
このあたりかな。

無題

ちょっと見た目かえた。
twitterとかのリンク先はまだ設定していない。どうすっかね。
本当はアーカイブページにリンク貼りたいけど、はてなにはそういう機能ないのかね。
一気に参照したいんだけどな。

      • -

retconという単語がある。

Retroactive continuity - Wikipedia, the free encyclopedia

Retroactive-continuityの略らしいんだけど、意味がよくわからない。"遡及関連"...?なんだかわからない。

英和には乗ってなかったんだけど、要するに今までのストーリーを何らかの後付で覆すことのようだ。"大どんでん返し"か。この日本語より狭義にはなるイメージだけど。

この単語を調べるにあたり、困ったのがWikitionaryやWikipediaで出てきたretconの例。いろいろなフィクションが紹介されているんだけど、どれもあんまり知らないストーリーだ。これじゃ理解できない..

無題

もっと情報の粒度を落として色々書き残そう。もともとそういう目的で始めたんだった。
「無題」ってはそういう日記的なものってことで。なんで素直にタイトルを「日記」としないかというと、なんとなく馬鹿っぽいから。

やっぱ見た目とかもっと手を入れたほうがいいかもなあ。

            • -

DNSについて

しきりに.tokyoを宣伝しているのを見かけるようになった。
.tokyo 東京のドメイン誕生。一般登録開始 380円|お名前.com

それにしてもDNSの業者っていまいちブラックボックスでよくわからない。
要するに固定IPアドレスを取得できたら、それをひもづけるドメインを取得して、そのドメインDNSサーバーに登録する。そんで、名前が要求されたら、そのIPアドレスを返す。もし、要求されたサーバーが当該のドメインを持っていなかったら、上位のサーバーに問い合わせる。で、DNSのルックアップテーブルを更新するってのが、だいたいの流れだと思うんだけど、これだと結局どうやってドメインを登録するのかがわからない。自分でDNSサーバーに登録しにいくのかな、みたいな。

結局はっきりとまだ答えは得れていないんだけど、結局承認する組織があって、そこが業者指定して、登録ができるってわけね。

wikipediaたち
ICANN - Wikipedia
日本ネットワークインフォメーションセンター - Wikipedia


日本語バージョンがねえ..時間があったら読もう。
ICANN


よく教科書なんかに「インターネットは誰のものでもない」なんて書かれてるけど、まあ結局そうはいかないよねってとこか。DNSしかり、HTMLとか広く流布してるフォーマットだって利権は多く絡むわけで、放置ってわけにもいかないしね。

            • -

職場で記事拾って読んだりするんだけど、結局全部読み切れなかったり、リンク失ったりで問題ありなんだよなあ。ここに書くことで少しでもアウトプットできればいいんだけど。あ、誰かの役に立つってわけでなくね。

Important Behavior Changes

Android 5.0 APIs | Android DevelopersのImportant Behavior Changesを全文訳しました。誤訳、ツッコミ、入れるべき訳註あれば教えて下さい。

      • -

Important Behavior Changes (重要な動作変更)

すでにリリース済みのAndroidアプリがある場合、Android5.0による影響があるかもしれません。注意をお願いします。

新しいAndroid Runtime(ART)に対するテストを行っていない場合

4.4では試験的にAndroid Runtime(ART)を導入しました。4.4ではARTは代替の機能であり、デフォルトではDalvicが使われていました。Android5.0ではARTがデフォルトのランタイムになります。

ARTの新機能の概要を見るにはIntroducing ARTを参照してください。主な変更点としては次のようなものがあります。

ARTへの乗り換えでは、ほとんどのアンドロイドアプリは変更の必要はありません。しかし一方で、Dalvicでは動いていたものがARTでは動作しない、という技術も存在します。最重要な課題についてはVerifying App Behavior on the Android Runtime (ART)を参照してください。特に中止すべき事項として以下が挙げられます。

  • C/C++コードを用いるためのJNIを用いている場合
  • 非標準のツール(難読化などの)を用いている場合
  • compacting GCと相容れない技術を使っている場合(現在、ARTではCompactingGCは実装していないが、Android Open Source Projectで進行中です)

通知を用いている場合

通知をAndroid5.0のアカウントに変更することに注意してください。Android 5.0 に対応する通知のデザインについて詳しく知りたい場合にはhttp://developer.android.com/design/patterns/notifications.html:notifications design guideを参照すること

マテリアルデザインスタイル

マテリアルデザインを適用しているため、通知は白背景(もしくは薄い色)の上に濃い文字で描かれます。

音とバイブレーション

Ringtone, MediaPlayer, Vibratorクラスを用いて音やバイブを扱っている場合には、このコードを削除し、システムがpriorityモードで正しく通知できるようにしてください。もしくはNotification.Builderメソッドを用いて、音やサウンドを追加するようにしてください。

RINGER_MODE_SILENTを設定すると、新しいpriorityモードが設定されます。端末のPriorityモードを元のままにしておきたい場合は、RINGER_MODE_NORMALかRINGER_MODE_VIBRATEを設定するようにしてください。

今まではAndroidはSTREAM_MUSICをタブレット端末のボリュームコントロールにおけるマスタとして用いてきました。Android 5.0では、マスタボリュームはフォンでもタブレットでも統一され、STREAM_RINGかSTREAM_NOTIFICATIONでコントロールするようになりました。

ロックスクリーン上の通知

Android 5.0のデフォルトでは、通知はユーザのロックスクリーンに出現するようになりました。ユーザは機密情報が表示されるのを防ぐかどうかを選ぶことができ、これを選択した場合には、システムは自動的に通知上のテキストを修正します。この通知をカスタマイズするにはsetPublicVersion()を使います。

メディアプレイバック

プレイバックステータスを表示したり、コントロールを渡す通知を実装していた場合、RemoteViews.RemoteViewをカスタムするのではなく、Notification.MediaStyleテンプレートを使うことを検討してください。どちらの実装方法を選んだとしても通知のvisibilityをVISIBILITY_PUBLICに設定してください。これはロックスクリーンからのアクセスを可能にします。また、Andrid5.0の初期の時点で既に、RemoeControlClientではもうロックスクリーン上に表示しないことに留意してください。詳しくは「RemoteControlClientを使っている場合」を参照してください。

ヘッドアップ 通知

通知はデバイスが(デバイスがロックされておらず、スクリーンがON状態である)アクティブのとき、小さなフロートウインドウの中に表示することができます(ヘッドアップ通知と呼ばれています)。ヘッドアップ通知は、今までの通知のコンパクトにしたものに似ていますが、アクションボタンを表示できる点が異なります。ユーザはヘッドアップ通知上のボタンを押すことによって、対応するアプリを起動することなく、通知に反応したり、無視したりすることができます。

どのようなときにヘッドアップ通知が出るか、その条件を以下に上げてみます。

  • ユーザのアクティビティがフルスクリーン(fullScreenIntent)のとき
  • 通知の優先度が高く、通知音やバイブを用いているとき

既に今までのアプリにこのような使用場面があったとき、ヘッドアップ通知が正しく出ることを確認して下さい。

RemoteControlClient を用いている場合

RemoteControlClientは非推奨となりました。その代わりにMediaSession APIが使用可能となります。

Android5.0のロックスクリーンはMediaSessionやRemoteControlClientの遠隔操作UIを表示しません。その代わりにロックスクリーンの通知を介したplaybackコントロールが使用可能です。これはアンロック状態とロック状態で一貫性のあるUIを提供するよう、playbackではメディアボタンを表示する以上のコントロールが与えられます。

これを実現すべく、Android5.0ではNotification.MediaStyleテンプレートを新たに導入します。Notification.MeiaStyleはアプリのメディアプレイバック通知に埋め込まれたボタンにNotification.Builder.addAction()によって追加した通知アクションを変換します。システムに通知が現在再生中のメディアを制御するということを知らせるためには、セッショントークンをsetSession()メソッドに渡します。

通知をロックスクリーンに表示しても(ロックスクリーンのセキュリティがかかっていなくても)問題ないことを確認し、通知のvisibilityをVISIBLY_PUBLICに設定してください。詳しくは「ロックスクリーン通知」を参照してください。

getRecentTasks()を用いている場合

Android5.0の「起動履歴のドキュメントとアクティビティ並列表示」機能のイントロダクションにもあるように、ActivityManage.getRecentTasks()メソッドはプライバシー強化のため非推奨となりました。後方互換のため、このメソッドはデータのサブセットを返します。また、このサプセットは呼び出し元の自タスクやHomeなどのタスクを含んでいます。もしこのメソッドが自分の自分のタスクを返してしまう場合、getApTask()をお使いください。

NDKを用いている場合

Android5.0は64-bit systemをサポートしています。64-bit拡張はアドレス空間とパフォーマンスを広げる一方、既存の32-bitシステムも完全サポートします。64-bitのサポートは暗号化のためのOpenSSLのパフォーマンスも向上させています。また、このリリースは新たなnative media のNDK APIOpenGL ES 3.1のネイティブもサポートしています。

Android5,0で提供される64-bitサポートを用いるには、NDK Revision 10cをNDKページからダウンロード、インストールしてください。NDKの重要な変更やバグフィクスの状況についてはリリースノートを参照してください。

Serviceにbindしている場合

Context.bindService()メソッドは明示的インテントを必要としました。暗黙的インテントを受け取った場合にはExceptionを投げます。アプリのセキュリティのため、サービスをスタートするときやバインドするときには明示的インテントを使用するようにしてください。そしてサービスのインテントフィルターは宣言しないようにしてください。

Google Map api v2 Androidのutility libraryでClusterを用いたときに、アイコンをカスタマイズする

目標

Google Maps Android API utility libraryを用いてClusterを使ったのはいいものの、Clusterから外れたMarkerに対し、画像を用いたアイコンを適用する方法がわからなかった。本稿では、その方法を調査したので、紹介します。

緒言

GoogleMap api v2を最近職場で使う用事があった。
Markerをカスタムし、オリジナルのアイコンを1000個ほど落とした時、やたらGCが発生するようになってしまった。

GC_FOR_ALLOC freed ***

アイコン作成時にBitmapまわりでメモリ管理を誤ったかと思ったが、なんだかそうでもないらしい。

問題らしきもの

ここを参照すると、単にピンを落としただけでGCが走るような現象が書いてある。
android google maps v2 lag when markers are being drawn/updated - Stack Overflow

タイトル:Android google map v2における更新時のラグ
マーカ(ピンのこと)の正しい管理方法は何ですか?
スクロールやズーム時に見えているところだけ表示しようとしているのですが、うまくいきません。

Clusterを使っているのはいいけど、APIをコールしすぎだね。
君のソースだと、みたところ25MBほどメモリを食っているね。
GoogleMapv2では全てのAPI呼び出しでプロセス間通信を行うからGCが走るんだろうね。
解決法?メモリ消費を十分に抑えるってのがヒントになるんじゃないかな。

うーむ、本当にプロセス間通信を使っているかは眉唾ものだし、メモリ消費を減らせ、といわれてもなあ。

ところで、Clusterってなんのことを言っているんだろう??

Cluster

ピンを落としただけでGCが走るようじゃ使い物にならないが、そうはいってもしかたがない。
ここでClusterを調査してみた。

Clusterってのは、ピンが数個あつまったところをまとめて表示してくれる代物らしい。ピンを描画するのに凄く時間がかかっているみたいなので、Clusterを用いて描画対象を減らせばなんとかなるんじゃないかと思う。目的は、Markerを大量に落とすことではなく、表示方法にはこだわらず落ちないアプリにすることである。
なので、特にこだわりなく、Clusterを使ってみる。

Google Maps Android API utility library

ここで、Google MapのAPIを拡張してくれるライブラリを導入する。
Google Maps Android API utility library

ライブラリの導入ってのは何だか面倒なイメージがあるが、AndroidStudioを使っていればGradleに次を追加し、Syncすれば一発で導入できる。
module配下にあるbuild.gradleに書き込む。そしたら依存関係は数秒で解消だ。

dependencies {
    compile 'com.google.maps.android:android-maps-utils:0.3+'
}

いやー、便利だ。

動かし方

サンプルがdemo配下のClusteringDemoActivity.javaにある。
googlemaps/android-maps-utils · GitHub

また簡単なインストラクションが次にある。
Google Maps Android Marker Clustering Utility - Google Maps Android API v2 — Google Developers

でも不満点が..

サンプルをビルドするとわかるけど、Cluster自体を実装するのは割りと簡単にできる。

でもこれだとMarkerがデフォルトのデザインのままで変更できない。Clusterから外れた個別のMarkerがデフォルトのピンの見た目なのだ。
Clusterの方はインストラクションの方にカスタム方法が書いてあるが、Marker側に関しては言及がない。
さて、どうしたものか。。

ClusterRendererを継承したアイコンカスタマイズ

いろいろ調査し、独自にコードを書いてみた。
以下抜粋である。

/**
 * 各地点をClusterとして管理するインナークラス
 */
public class MyItem implements ClusterItem {
    private final LatLng mPosition;
    private final Bitmap mBitmap;

    public MyItem(double lat, double lng, Bitmap bitmap) {
        mPosition = new LatLng(lat, lng);
        mBitmap = bitmap;
    }

    @Override
    public LatLng getPosition() {
        return mPosition;
    }

    public String getBitmap() {
        return mBitmap;
    }
}

/**
 * レンダラのカスタムクラス
 */
public class OwnIconRendered extends DefaultClusterRenderer<MyItem>{
    public OwnIconRendered(Context context, GoogleMap map, ClusterManager<MyItem> clusterManager) {
        super(context, map, clusterManager);
    }

    @Override
    protected void onBeforeClusterItemRendered(MyItem item,
                                               MarkerOptions markerOptions) {
        // ここで更新をかける。
        // 引数としてitemが与えられるので、これの画像を変更する
        Bitmap bitmap = item.getBitmap();
        if(bitmap != null) {
            markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
        }
    }
}

単にレンダラのメソッドをオーバライドし、itemに対してbitmapを変更しているだけである。
都合により、スクリーンショットが載せられないが、これでCluster外のMarkerに対して、画像によるピン画像をはりつけることができた。

何故かこの方法がGoogleでサーチをかけても出てこず、苦労した。

ちなみに

Clusterをそのまま用いると、ズームをしないと更新されないことがある。
レンダラをオーバライドしたせいかなと思ったが、違うようだ。。
これはClusterManager#cluster()を用いると更新することができる。

頭痛薬の話

食中毒

食中毒になり、熱が全く収まらなくなった。最初にいった医者で貰ったのは「カロナール」。しかし、これは解熱剤の中でも相当効き目のゆるいものであり、あまり効果がみられなかった。
2件目へいき、もう少し効き目の強い解熱鎮痛剤を所望したところ、「SG顆粒」を処方された。これを服用したところ、たちどころに熱が下がり、ほんの15分ほどであらかた頭痛も収まってしまったのである。

私的解熱鎮痛剤ランキング

これは自分にとってかなりショッキングな出来事であった。今までのランキングを大きく塗り替えることになるからである。
それでは、ランキングを見てみよう(完全に主観である)。

  1. SG顆粒
  2. メルヂンゴールド
  3. イブA錠
  4. ロキソプロフェン系(ロキソニンなど)
  5. アスピリン系(バファリンなど)

まあ、地味なランキングだ。ところでメルヂンゴールドもイブア錠もイブプロフェンという有効成分が含まれている。なので、自分にはイブプロフェンが合ってると思っていた。ところが、SG顆粒アセトアミノフェンという解熱鎮痛成分が含まれているらしい。

これが覿面にきいているのかどうかはわからないけど、直感的にいうならば、この顆粒状ってのが一つポイントなのではないかと思う。この顆粒状という点が、効き始めの早さに重要な役を担っているのではないかと思うのだ。

そうみると、成分と効き目にあまり相関がないようにも思えるが、どうもアスピリンは効きにくい気がする。バファリンは割と解熱鎮痛剤の代表格に収まっているが、偏頭痛もちからはあまり愛用されているイメージがない。(もしくは効かないと文句を言いつつ、有名さから盲目的に使用しているかのどちらかだ。)

とにかく、SG顆粒の効き目には驚いた。だいたい最近はロキソニンが処方されるもんだと思っていたが、これはなかなかの体験をした。

参考

市販の頭痛薬の成分と特徴|市販の頭痛薬の特徴と選び方ガイド
http://medical-cost.net/Syurui_tokutyo.html

SG配合顆粒|goo辞書
http://dictionary.goo.ne.jp/leaf/kusuri/754/m0u/