現場の人と指揮する人

現場あがりで指揮をする人が自分が現場にいるつもりで指揮を出し続けると大抵大変なことになると思う。

全体で10の作業ができるとすると現場の人は10の作業を1つのプロジェクトに割り当てることができるんだけど、指揮する人はそうは行かなくてせいぜい3がいいところだと思う。指揮する人が現場の人間のつもりだと、作業を割り当てれる時間が減っているのに自分も全てを知らないといけないと思っちゃって全部に口出ししちゃう。でも、作業時間が減ったのに同じパフォーマンスを出すとか無理なわけで、指揮を出す人ってそのプロジェクトがどこに向かっているのかだけに目を向ければ十分なんだと思う。プロジェクトがどこに向かっているかを把握して向かっていく場所を修正してあげるっていうのが指揮する人の役割で、プロジェクト自体を動かすのは現場の人間というスタンスのほうがうまくいくんじゃないかな。

指揮する人がいつまでたっても現場の人間のつもりで作業してしまうと、指揮する人の作業量が増えすぎて「指揮する人が倒れる」or「指揮する人の作業が全て中途半端になる」ってことになりそう。だって、絶対的に作業時間が足りないんだもの、どれだけ効率化しようとしても無理なのはしょうがないよね。「頑張ればなんとかなる!」とかいって、自分の作業量を増やして中途半端に指揮する人が現場に絡んだら、どんな作業をしていたのかの報告をきくだけで作業が終わるとか本末転倒な未来しか想像できないよね。現場も疲弊するし指揮する人ももやもやするしで双方に全く利益がないことになりそう。

これってすごく難しいバランス感覚だと思うんだよなー。端的に知りたい部分だけを聞いて現場の人の作業を想像してうまく言ってるかどうかを判断して作業は現場の人間に任せて方向性が合うようにうまく指示を出す。書いてみるとわかるけど神業だよな。作業しちゃいけない立場だけどプロジェクトは成功させないといけないってどう頑張ればいいのかわからなくなりそう。

location.hrefでの画面遷移はSEO的にどうなの?

色々調べてみたがGoogleさんがどういう解析をしているのかがわからないので結論は出ない。

http://www.suzukikenichi.com/blog/google-can-read-javascript-and-pass-pagerank-and-anchor-text/

Googleは、Javascriptのリンクも通常のリンクと同じように取り扱い、PageRankも渡すし、アンカーテキストも評価するようになりました。

ただし同一ページ内にスクリプトのコードが存在している場合で、スクリプトファイルを外部化している場合は対象になりません。

という記事が2009年に出ているので、これよりもクロールしなくなっているということは無いんだと想像できて、同一ページにlocation.hrefでアンカーを貼った場合は評価してくれることになる。別の言い方をすると、別ページにlocation.hrefによるページ遷移を書いた場合はアンカーテキストとして認識されず、それ以降のリンクをクロールしてくれないってことになる。

最近動的にページを作るサイトが増えているけど、少なくともアンカータグで記載している静的サイトに比べて動的に作成するコードが別ソースに書かれているサイトはSEO的に弱くなるんだろう。ajaxでデータ受信して動的に作成するサイトの場合、「#!」でハッシュ値を教えてあげてそれに対応した静的ページを作れば問題ないらしい。なんでそんな手間なことをやらないといけないんだって気がしなくはないんだが、JSの中身まで全部解析しろっていうのも刻な話しなんだろう。

結論としてはツールとして使われるようなサイトの場合は、TOPページがインデックスされれば問題ないという割り切りをして使いやすさを求めてajaxで動的に作成するっていうのはありだけど、Googleからの流入を狙っているようなサイト(ブログとか)でajaxで動的にメニュー作ってみようとかはやらないほうがいいんだろうなぁ。


Google Closure Compilerでフォルダ配下のjsファイルを1ファイルにまとめる

やるならシェル書いたほうがいい。

#!/bin/bash # 環境変数 rootPath="../html/js" outputFileName="all.js" compileLevel="SIMPLE_OPTIMIZATIONS" # jsファイル一覧取得 paths="" separate=" –js " for file in `find $rootPath -name \*.js` do paths=${paths}${separate}${file} done # コンパイル java -jar compiler.jar ${paths} –language_in ECMASCRIPT5 –compilation_level ${compileLevel} –js_output_file ${outputFileName}

それだけ。dirが指定出来ればそれでいいのに・・・。

パズドラが正解ってわけではないと思う

↓を読んで思ったこと

http://toaru-sipro.com/?p=4729

でも、作っていて「このチェックリストは絶対では無い」と思っていますし、自分にもそう言い聞かせています。

チェックリストってゲームで作るのは難しいんだと思う。ゲームにはそれぞれで狙っているターゲットってものがあるはずで、万人に受けるゲームなんてそもそもないんだと思う。尖っていない丸いゲームを万人ウケのゲームって称されることが多いと思うんだが、それって万人に受けるって言うよりも万人ができるってゲームなだけなんじゃないのかな。

上記の通り、僕がコンサルを担当していたら、パズドラはパズドラじゃなくなっていたでしょう。

そう。パズドラってすごく絶妙なバランスで出来上がってるんだと思う。そもそも初回開発の時は全然違うゲームだったって以下のリンクでも言ってる。

http://toyokeizai.net/articles/-/13026

運ですね。これをやったから上手くいったんじゃないかという分析は、正直くだらない。僕たちが作っているゲームは妥協せず、すべて魂を込めて作っています。

合計で4回作り直しています。開発期間は5カ月で、デザインのほか、感触を何回も確かめました。最初は四方にしか動けなかったので、爽快感がない、テンポが悪いということで自由に動けるようにしましたが、そうすると逆に簡単になり過ぎてしまったので、タイムゲージ(制限時間)を導入しました。ドロップ(パズル)を1回動かすときのタイムゲージを4秒にしたのは、そのためです。

そのゲームが面白くなるための試行錯誤を繰り返した結果で、これは面白いって思ったとしても刺さらないことがあるんだろう。まず、パズドラがこうだからこれが正解だって思ってしまっているのは間違いなんだと思う。パズドラはパズドラが狙っているゲーム層とゲーム性が合わさってああいう訴求方法をやっていてそれがあたったていう事実はあるんだろうけど、じゃあ別のゲームでパズドラがこうだからこうしましょうっていう考え方は多分違う。自分が作ったゲーム性・対象ユーザによって訴求方法は変えるべきで何かを参考にするのではなく新規にそれぞれで考えるものなんじゃないのかな。

そのそれぞれに新規で考える時にその人の経験したノウハウが活かされてうまくいく確率っていうものが変わっていくんじゃないかな。パズドラに縛られる必要はないと思う。言われているように違う人がプロデュースしたら今のパズドラは出来上がってないんでしょう。けどもしかしたらそっちのほうが今より売れているかもしれない。早めに海外展開を考えて今よりも市場が大きいところに行っていたのかもしれない。たらればで言えばいくらでも色々なことが言えるしパズドラっていうのは最近では一番流行っているけどそれが正解ってわけではないと思うよ。

styledoccoのドキュメント少なすぎだろ

styledoccoを使ってみてすげーハマったので覚書

本家サイト

http://jacobrask.github.com/styledocco/

ドキュメント乗ってなさすぎだろっていう

インストールやらの手順

http://ameblo.jp/ca-1pixel/entry-11453624925.html

ここに書いてあるとおり。コマンド一発ですね

sudo npm install -fg styledocco

はまったこと

htmlが認識しない

ちょっと変更して動かしてみたけれど一向にCSSが反映されないと思ったら、改行がないとhtmlを認識してくれないっぽい。改行の位置は重要。

/*
## もっと見る
各種リストのもっと見るボタンです。commonに移動したほうがいいかも
<-- ここに改行がないと認識しない --> 
	<div class="more">
		もっと見る
	</li>
*/
.more {
	line-height: 2;
	text-align: center;
}
.more.tap {
	background-color: #ddd;
}

stylusが認識しない

以下のコマンドで動くかなぁと思ったが動いてくれない。どこみてもsass使った例しか書いてないしstylusにこだわる必要ないからsassに変更した。

styledocco –preprocessor "stylus"

compassが認識しない

preprocessorの指定に以下を追加することで動く

–preprocessor "sass –compass"

まとめ

ドキュメントの自動生成でstyledoccoは綺麗だからいいんだけど、ドキュメントがなさすぎる。本家サイトのdocumentが404pageに行くってどうなのよ。。。もうちょっとつかってみてダメだったら違う奴に変更しようかなぁ。

aidlで色々な値を送る

Androidのサービス感通信はaidlを使ってできる。使い方とかについては前に書いた

http://blog.choilabo.com/20121031/184

んで、今度は、aidlで色々な値を送ってみた。

参考URL

詳しく知りたい人は、以下のURLの方が詳しく書いてある。

http://www.atmarkit.co.jp/fsmart/articles/android31/01.html

http://www.atmarkit.co.jp/fsmart/articles/android32/01.html

送れる値

aidlで送ることができる値は、以下の種類がある

https://sites.google.com/a/techdoctranslator.com/jp/android/appendix/aidl

  • Java 言語のプリミティブ型 ( int、boolean、その他 ) — import 文は不要です。
  • 以下のクラスのどれかひとつ ( import 文は不要 ) 。
    • String
    • List – リストの要素すべては、他の AIDL で生成されたインターフェイスと Parcelable を含む、このリストのタイプのどれかである必要があります。オプションで “総称型” クラスとして使用されることもあります ( 例、List ) 。メソッドは List インターフェイスを使って生成されますが、もう一方の受信する側の実際の具象クラスでは常に ArrayList になります。
    • Map – マップの要素すべては、他の AIDL で生成されたインターフェイスと Parcelable を含む、このリストのタイプのどれかである必要があります。総称型のマップ ( 例、Map の形式 ) はサポートされていません。メソッドは Map インターフェイスを使用して生成されますが、もう一方の受信する側の実際の具象クラスでは常に HashMap 型となります。
    • CharSequence – これは TextView と他のウィジェットオブジェクトにより使用される CharSequence タイプ用に便利です。

in, out, inout

Javaのプリミティブ型についてはinとかoutとか付けなくても問題ないみたいだけど、MapとかListとか使おうとした場合はこれを書かないとエラーになる。以下@itからの転記。

interface ICalculatorService { // 【3】
    oneway void registerCallback(ICalculatorCallback callback); // 【4】
    oneway void unregisterCallback(ICalculatorCallback callback);
    int add(int lhs, int rhs);
    void sum(in List values); // 【5】
    void rotate(inout int[] array, int num);
    int eval(in CalculatorExpression exp);
}

独自クラスを作った場合

独自クラスの受け渡しはPerticalを使って行う。ここは試してないから割愛。僕はたまたまHashMapを渡す必要があったからそこに独自クラスを載せて送ることはできた。Perticalを使用する例は@itに書いてあるからそちらを参照下さい。

aidl

package com.choilabo.dpbxplayer.aidl;
interface IServiceConnection {
	void setMap(in Map objMap);
}

service

	@Override
	public void setMap(Map objMap) throws RemoteException {
		// Map型はHashMapになるらしいのでキャスト
		HashMap<Integer, HogeClass> items = (HashMap<Integer, HogeClass>) objMap;

		// 以下itemsを使って好きな様に処理をする
	}

まとめ

in、out、inoutをつけないとエラーが出てaidlがコンパイルできなかくて小一時間ハマった。Serviceに対して独自Classを送るサンプルっていうのが非常に少なかったんだけど一般的にやらないのかなぁ。結構使うときは多いと思うんだけどどうなんだろう。

mp3ファイルのID3TAGを取得するならMyID3がよさげ

調べたので覚書。タイトルのままだけどandroidでID3TAGを取得するならMyID3が使いやすかった

download

以下からjarをダウンロード

https://sites.google.com/site/eternalsandbox/myid3-for-android

http://jakarta.apache.org/regexp/

sample code

こんな感じで取得できる

	File file = new File(filepath);
	MusicMetadataSet src_set = new MyID3().read(file);
	MusicMetadata metadata = (MusicMetadata) src_set.getSimplified();
	title = metadata.getSongTitle();
	albumTitle = metadata.getAlbum();
	artist = metadata.getArtist();

	// 読み込んだタグを画面に設定
	Log.d(TAG, title);
	Log.d(TAG, artist);
	Log.d(TAG, albumTitle);
	Log.d(TAG, track);

便利便利。なかなかいかす。

他に試そうとしたもの

Java ID3 Tag Library

サンプルコードを動かしてみたけど、全く値が取れず。Compressがfalseとかなってたんで、解析に失敗してるみたい。ファイルが悪いのか使い方が悪いのか調べるのもだるかったんで放置。

jaudiotagger

accも解析してくれるっていうすぐれものとうたっている。けど、依存関係でsun.nio.ch.directbufferがないとだめっていわれるんだけどこいつがよくわからないからやめた。

まとめ

AndroidならMyID3がAndroid用としてライブラリ作ってくれてるし、これを使うほうがいいんじゃないかなー。