満員電車
最近研修があり、スーツを着込んで電車で一時間半かけ通勤した。2日間の研修なんだけどね。
なんともまぁ悪夢というか。
よく世のサラリーマンは毎朝コレに耐えてるなあというか。
-
-
-
- -
-
-
僕は普段私服で会社にかよっている。しかも歩いて20分のところにあるので、徒歩通勤だ。
定時出勤なので、8:50の始業時間に出勤してないといけないんだけど、通勤ラッシュというものを体験したことがない。
さかのぼって、学生時代も電車通学していなかった。
ラッキーなことに実家とキャンパスが近く、十分に自転車通学できる範囲だったのだ。
電車通勤すら経験の無い自分が、スーツを着て早起きをして電車通学するなんて、なかなかない機会だったのだけれど、これがなんとも21世紀とは思えない体験だった。
朝、通勤時間を考慮し、1時間早くおきる。
そして、約100分間の通勤時間。
世間の平均からしてみれば、大して長い通勤時間ではないと思うんだけど。実際体験してみると、これがなかなか大変なことだ。
長い乗り換えに、満員電車。
通勤時間なので、給料なんて出ていないが、一日の中で一番疲れる時間の一つだと思う。
会社について始業するころには、もう疲れている、
一刻も早く仕事は終わりたいが、帰りの満員電車のことを考えると憂鬱になってくる。
-
- -
この延々とつづく電車通勤という儀式は、サラリーマン特有のものだけど、実は意味なんてなものだ。
ましてや、満員電車なんてのは、21世紀になって久しいのに、未だ解決解決できない信じがたい労苦である。
- -
この情報化社会においては、技術的にはリモートワークも可能であるし、フレックス勤務だって
かなり市民権を得ているように思う。
リモートワークやフレックス勤務などで、技術的にも制度的にも、満員電車にのる必要性なんてどこにもない。
それにこれらを効率的に導入すれば通勤時間を抑えられ、会社だって広大なオフィスを用意しなくてすむ。
そうすれば、賃料も抑えられ、割りといいことづくめだ。
この改善が全く進まないのは、上層部のリテラシの低さと、日本の「我慢すればいい」という美意識のせいだろうと思う。
長々と書いたけど、実はこのあたりを詳しく掘り下げる気はない。。
(論じる能力もないし、今まで嫌というほどくりかえされた議論だからだ。)
過去の事例を鑑みると「フレックスを導入するとやっぱり効率が下がった」とか、「リモートワークなんて制御不能だった」なんて反例は容易に見つけることができる。
しかし、この現状は、人のストレス度合いとしても、業務の効率化という観点からしても、決して最適解ではないと思う。
これから打破すべき現状だし、解決していかなければならない問題だと思っている。
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)を参照してください。特に中止すべき事項として以下が挙げられます。
通知を用いている場合
通知を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 APIとOpenGL ES 3.1のネイティブもサポートしています。
Android5,0で提供される64-bitサポートを用いるには、NDK Revision 10cをNDKページからダウンロード、インストールしてください。NDKの重要な変更やバグフィクスの状況についてはリリースノートを参照してください。
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()を用いると更新することができる。