そろそろmedias wpとandroidについてレポート

買ってから結構たったし、簡単にレポート。

前提

  • 2台持ち
  • 電話してない
  • amadana
    • プリインが違う
  • 自宅ではwi-fi

いいところ

テザリング

簡単に設定できたし、速度も出る。なんだかんだでdocomo回線を選んだのは正しかったと思う。auはどうなんだろう。
まぁ、これのおかげでiPodやらデバイスの幅が広がったのは非常によかった。iPad2とか安くなったら手に入れたい。

薄い、軽い

うりにしてるだけあって、薄いし軽い。サイズは大きいんだけど、ポケットに入るから別に問題ない。が、別の問題はある。

カメラ

画質は良くはないけど、シャッター超速い。NECだからか、androidだからかはちょっと分からない。

悪いところ

消せないプリインアプリ

ATOKとか、客がうっかり消して騒ぎそうなやつは理解できるんだけど、よもや「ついっぷる」やら「モシモカメラ」なんかが消せないとは思わなかった。
一番残念なのは「Delivery DJ」というamadanaモデルにプリインされているアプリ。タスクを切っても何故か端末ロック画面で立ち上がる。
アップデート分をアンインストールすると立ち上がらなくなったので、取り敢えずそれで対処してるが、マイアプリ画面で表示されてウザい……。

SPモードメール

アプリレビューで「スリル満点!星0個」とかあって「それツールの感想ちゃう! ゲームの感想や!」とつっこむなどして楽しんだ。

電池

WPじゃないやつの電池が全然持ってなかったし、さらにfelicaとか入れて持つわけねーだろって思ってたけど、案の定だった。

ホームボタンがタッチ&電源ボタンが押しづらい

この2つの要因で、スリープから解除しづらい。電源ボタンがもう少し面積広ければ……。

ワンセグのアンテナ

接着剤で固定してやろうかと思うくらいパカパカしてて物に引っかかる。ワンセグ見ないから邪魔でしか無い。

まとめ

点数つけるなら65点かなぁ。
目的がはっきりしてた(テザリング&各種SNS)ので、それなりに気に入ってはいる。
あと、見た目も赤いカバーをつけたら結構いい感じになって良かった。
……ただ、2台持ちじゃないとキツイと思う。電池持たなすぎ。電話使ってなくてこれだからなー。
正直、電池を含めて、ハード面でやや行き届かない点を感じる。

Titanium Studioを64bit版Windows7で動かそうとしてハマりにハマった

タイトル通り。うんざり。
一応、KitchenSinkが動くとこまで行きましたが、エミュレータ重くて、土曜に届くはずだった実機待ちだったのに届かず、何というか色々気が削がれています。

インストール手順

  • JDK6 32bit版をダウンロード、インストール
  • Android SDKをインストール
  • Android SDKを起動して、Accept Allでプラグイン全部インストール
    • 不要なものを切り分ける知識はまだ無い。ってかKitchenSinkを動かすんならどうしようもないかもしれない。
  • Titanium Studioのフリー版をインストール
    • ログイン必須
  • Titanium Studio起動前に、下記ファイルを書き換える
    • C:\ProgramData\Titanium\mobilesdk\win32\1.7.1\android\builder.py
    • 「logcat」でファイル検索して、以下の箇所を見つけて修正
emulator_cmd = [
    self.sdk.get_emulator(),
    '-avd',
    avd_name,
    '-port',
    '5560',
    '-sdcard',
    self.sdcard,
    '-logcat',
    "\"*:d *\"", ←こう書き換える。元は"'*:d *'"となっている
    '-no-boot-anim',
    '-partition-size',
    '128' # in between nexusone and droid
]
  • Titanium起動
  • window→preference→Aptana→Titaniumから、Android SDKを指定する。
    • 指定するパスに半角スペースを含まないように気をつける。Program Files(x86)なら、PROGRA~2で指定する。
    • Google APIs Android SDK 2.2以降に。
  • KitchenSinkをダウンロード、workspaceに解凍してインポート
    • gitからインポートもできたけど、↓に書くハマりポイントに注意
  • KitchenSinkプロジェクトを右クリックしてRun As→Android Emulator
    • 重いので、止まってるように見えてもしっかりまつこと

ハマりポイント

JDK32bitのものを使う

これはAndroid SDKの方の問題。
多分これのせいでかなりの時間を失ってる。
ってか、そもそもAndroid SDKをよく知らずにいきなりTitaniumを始めようとしたのが問題な気がする。

KitchenSinkはTitanium Studioのgitで落とすと変になる

一度コンテンツを残して削除し、Titaniumプロジェクトとしてインポートしなおすと直る。
どうも、リポジトリの奥のほうにあるtiappファイルを見に行っちゃうみたい。

実行できない

Windowsで動かしてないだろ開発者……。いやまぁ、どのみちmacじゃないとiPhoneアプリのテスト出来ないから、気持ちは分かるんだけどさ……。
修正方法は↑に書いた通り。AndroidSDKのパス指定と、後一箇所はソースいじるしかない。
んで、ちと信用ならなかったんで、Titanium Studio本体を半角スペースの無いところに置いたり、ワークスペースから半角スペース抜いたりしてます。多分関係ないとは思うけど……。

タブの画像が出ない

これが分からない。
二回目の起動で必ず起こる感じ。
正直、実機でやれば起こらないのかなーと思わなくもないので放置してる

まとめ

勉強会+自己学習に、意気揚々だったんですが、かなりやる気が削がれちゃってます。
というか、iOSエミュレータはまぁまぁ速いだとか、そもそも半角スペースのアレはmacじゃ起きないわな、とか色々聞こえてきて「mac買えってか!?」って叫びたくなった。macbook欲しい。

たったの40行! jQueryでニコ動の右上を表示するChrome拡張作成法(イマイチ)

jQueryスクレイピングのしやすいライブラリです。

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="http://code.jquery.com/jquery-1.6.1.js"></script>
  </head>
    <div id="bukkonuki">悲しいけれど、ぶっこぬかれる運命なのよね</div>
    <div id="result"></div>
    <script>
      $.get(location.href, function(html) {
        $('#result')
          .html(
            $('#bukkonuki', '<div>' + html + '</div>').html()
          );
      });
    </script>
  </body>
</html>

上のhtmlは適当なところに設置(ローカルじゃ駄目です)して見てみれば動きます。ざっと以下の動作。

  1. 自分自身をajaxで取得
  2. 取得したhtmlをjqueryのcontextにつっこみ、ID指定でスクレイピング
  3. bukkonukiの中身をresultに表示

でも、jQueryのgetとかajaxとかってのは、XMLHttpRequestを利用しているので、クロスドメインが出来ません。
自分とこにあるコンテンツをスクレイピングする意味なんてほとんど無いので使えませんね。残念。


……となるのですが、こいつが活用できる場所があります。それが以下。

  • node.jsなどのサーバサイドjs
  • Chrome Extension

で、今回はChrome拡張で使ってみます。ということで……

たったの40行! jQueryでニコ動の右上を表示するChrome拡張作成法

またかよwと言われそうだけど、日曜大工で発表した関係で、簡単に作れるものを紹介してみようかなと。

  • 以下の3ファイルを作成して、
  • jquery-1.6.1.min.jsを同じところにおいて、
  • 適当なicon.pngを作成すればOK。
background.html
<script src="jquery-1.6.1.min.js"></script>
<script>
	var migiue = 'Now Loading ...';
	
	(function() {
		function getMigiue() {
			$.get('http://www.nicovideo.jp/migiue', function(html) {
				migiue = $('#migiueText', '<div>' + html + '</div>').text();
			});
		}
		
		getMigiue();
		
		setInterval(getMigiue, 24 * 60 * 60 * 1000);
	})();
</script>
popup.html
<!doctype html>
<html>
	<head>
		<style>
			#migiue {
				color: black;
				text-decoration: none;
				font-weight: bold;
				white-space: nowrap;
			}
		</style>
	</head>
	<body>
		<a href="http://www.nicovideo.jp/migiue" target="_blank" id="migiue"></a>
		<script>
			document.getElementById('migiue').innerText = chrome.extension.getBackgroundPage().migiue;
		</script>
	</body>
</html>
manifest.json
{
  "name": "niconico migiue",
  "description": "niconico migiue",
  "version": "0.0.1",
  "browser_action": {
    "default_icon": "icon.png",
    "popup": "popup.html"
  },
  "background_page": "background.html",
  "permissions": [ "http://www.nicovideo.jp/migiue" ]
}
実行結果


こんな感じです。

大事な話

外部公開するときは気をつけてください。
スクレイピングを使ってサイトを作る場合と違い、各自がアクセスに行くので、相手側に迷惑をかける場合があります。
上のスクリプトも、backgroundで取得したものを使い、かつ1日に1回のリロードとして、アクセスを極力減らしています。
なので、この技術が生きるのは、使うメンバーが限定している個人利用の場合が多いでしょう。私も活用してるのは社内向けのExtensionのみ。
とはいえ、サーバサイドjsで使うのも若干癖があって微妙なんだよな。
うーん、イマイチ。

たったの50行! node.js でツイート垂れ流しサイト作成法

修正:よく数えたら60じゃなくて50行だった。しかもハッシュタグ垂れ流しでなく好きなキーワード(もちろんハッシュもなんだけど)監視するものになっていた。適当すぎた。

↓の通りコマンド打ってファイル作っていけば、twitterで指定したキーワードを監視してだらだら垂れ流すサイトが出来上がります。

必要なもの

  • node.jsとnpmをインストールした環境
  • 適当なtwitterアカウント

コマンド

  • ワークスペース作って必要ライブラリインスト
  • linuxじゃない方はなんとなくそれっぽいことをして下さい
mkdir twithash
cd twithash
mkdir views

npm install socket.io
npm install twitter-node
npm install express

vi web.js
vi views/index.html

web.jsの中身

  • アカウントID, アカウントパスワードを書き換えて下さい
  • キーワードも好きなものを設定して下さい。twitterの制限上10個までとなります。「https」は数がちょうどいい感じです。
const sys = require('sys'),
      express = require('express'),
      app = express.createServer(),
      io = require('socket.io'),
      TwitterNode = require('twitter-node').TwitterNode;

// express
app.configure(function() {
  app.use(express.static(__dirname + '/views'));
});
app.listen(8888);

// socket.io
const socket = io.listen(app);

// twitter
var twitter = new TwitterNode({
  user: 'アカウントID',
  password: 'アカウントパスワード',
  track: ['https'] // ハッシュタグとか適当な単語に書き換えるよろし
});

twitter
  .addListener('tweet', function(tweet) {
    socket.broadcast(tweet.text);
  })
  .stream();

index.htmlの中身

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>twithash</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
    <script src="/socket.io/socket.io.js"></script>
    <script>
      var socket = new io.Socket();
      socket.connect();
      socket.on('message', function(t) {
        $('<div></div>')
          .text(t)
          .prependTo('#tweets');
      });
    </script>
  </head>
  <body>
    <div id="tweets"></div>
  </body>
</html>

実行

node web.js

localhost:8888 にアクセスし、指定したキーワードのツイートがだらだら垂れ流されれば完成!

ぶっちゃけ

「コマンド入れても50行なので、みなさんぜひやってみてください!」とか煽っても、環境構築が一番大変だってのはみんな分かってるよね、うん。
ただ、私の環境はさくらvpsCentOS 5.5で、割とつまずきはなかったです。
twitterのidとpwは設定ファイルとかに外出しすべきですね。ライブラリもあるし、無くても適当にやっちゃえばいいかなーと思います。
完成したら、herokuのnode.jsホスティングでもやってみると良いです。カンタンに全世界に公開でき、一定の負荷を超えるまでは無料です。herokuのドキュメントが英語だけど分かりやすいので、それほどつまずかないと思います。
しかしnpmとherokuは素晴らしい。一旦熱が冷めたnode.jsだったけど、一気に再燃しましたw

コメ返し

id:t_43z

そうなんですよねー。現状、herokuで動かしてるサイトはchromeでもxhr-pollingになるんで、胸張って「html5だぜ!」と言えない感じです。
herokuは使い手側でしかない状態なんで、もうちょっとちゃんと調べたいです。

id:mitukiii

expressとかモロsinatra。思想的にそりゃそうなんですけどね。rubyも使えるようになっときたいなー。

expressを使わない理由が無かった

expressとは、よく使われてる表現では「node.js用のsinatra」です。↓の記述を見た瞬間に脊髄反射的にnpm install expressする人も多いはず。

var express = require('express'),
    app = express.createServer();

app.get('/', function(req, res){
    res.send('Hello World');
});

app.listen(3000);

で、こいつはコンフィグで静的ファイルを吐き出すように設定できます。端的に言えば、node.jsとexpressと下の6行のコードがあれば、apache http serverの代わりになるわけです。

var express = require('express'),
    app = express.createServer();

app.configure(function() {
  app.use(express.static(__dirname + '/views'));
});

app.listen(80);

これだけで、viewsディレクトリ以下の静的ファイルを放出するサーバが作れます。
流石にyum install httpdには叶わないですが、node.jsとnpmをインストールしちゃってる人には、ものすごく簡単なのが分かると思います。

本題

重要なのが、↑のコードのexpress#createServerで作られたサーバは、node.js標準のhttpサーバのprototypeを継承して作られたものだと言う事。
そのため既存ライブラリとの組み合わせが非常にスムーズです。socket.ioだと↓のような感じ。

var express = require('express'),
    app = express.createServer(),
    io = require('socket.io');

// express
app.configure(function() {
  app.use(express.static(__dirname + '/views'));
});
app.listen(80);

// socket.io
var socket = io.listen(app);

はい。あとは、viewsディレクトリの中にsocket.ioのクライアントとなるhtmlを突っ込んでしまえば、websocketなサービスが作れてしまいます。あらまぁ。

結論

特に理由が無ければ、express使ったほうが何かと便利そうです。
しかしまぁ、npmが素晴らしいなぁ。上記まで辿りつくのに10分掛からなかったよ。