2011/02/28

Native Client APIを試す

C、C++で作ったファイルをJavaScriptから実行できるNative Client SDKがリリースされたので、さっそく試してみました。(windowsで。)

まずは、Google Chrome Canary Buildのダウンロードサイトからexeファイルをダウンロードします。

ダウンロードした「ChromeSetup.exe」をダブルクリックしてインストールを行ないます。
(インストールを行なう際に、検索エンジンを選ぶ必要があります。)

インストール完了後、Google Chrome Canary Buildを立ち上げる。
Photobucket
アドレスバーに「about:flags」を入力後、「Native Client」を有効に設定します。
Photobucket
設定完了し、再度、ブラウザを立ち上げたら、Native Client SDKをダウンロードを行い、「naclsdk_win.exe」ファイルをダブルクリックしてインストールします。
Photobucket
インストール完了後、コマンドプロンプトを立ち上げ、インストールしたディレクトリの直下にある「examples」に移動し、「httpd.cmd 5103」を実行します。

実行後、Examplesに紹介されているプログラムを動かします。

停止したい場合は、「http://localhost:5103/?quit=1」にアクセスを行ないます。

2011/02/27

[lifehack]ゲーム離れって本当かよ?

最近、「ゲーム離れ」という言葉をよく聞くが、本当に起こっているのか?
たぶん、起きてない。

18歳から49歳の年齢層では、80%近くがモバイルデバイスでカジュアルゲームをプレイしているのに対し、従来型のゲームをプレイしているのは50%をわずかに下回る。

via:モバイルソーシャルゲームと従来型ゲームの利用実態が明らかに--米調査

一昔前だったら、こんな現象なんてなかったのに、確実にハードでゲームをやらなくなっている。

かつ、ゲームという定義がそもそもあやふやになりつつあるような気がする。

なので、今後、この流れを認識している状態で任天堂やソニーがどう動くのかが見ものである。

2011/02/26

[chrome web store]adsense導入の件

Packaged Appにgoogle adsenseが導入できるかどうか確認したところ、NGだそうです。

ちょっとがっくり。。。

2011/02/25

[Google Libraries API]手っ取り早くロード

前回、[Google Libraries API]APIをloadするで、動的に、ライブラリをインクルードする方法を書きましたが、もっと簡単な方法がありました。

それは、Librariesに記載されているPathのURLをそのままsrc属性に書けば、インクルードすることができます。

例えば、jQueryの場合、Pathは、https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.jsなので、

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js" >

と書けばオッケーです。

これは、便利。

2011/02/24

GoolgeTV

会社でGoogleTVを発見したので、ちょっくら拝見

Photobucket
液晶は、SHARP製で、次の写真が、クラウドTVの全容。

Photobucket

Photobucket
上は、リモコン。若干、操作にとまどってしまった。

OSは、android2.1だった。

驚いたのは、日本で電源を入れたにもかかわらず、海外のテレビ番組をみることができた。
もちろん、すべてのテレビ番組をみることはできなかったが。

さらに、netflixのアプリが入っていたが、会員契約をしていなかったので、オンデマンド映画を見る事ができなかった。
今後、クラウドTVを通して、オンデマンドで映画を見る事が当たり前になるんだろうなーっと思ったのだが、その一端に触れたかった。

ゲームアプリなど、もっと使用頻度が高いとされているアプリがまったく入っていなかったので、androidマーケットから購入したアプリの使いかっても結局、わからずじまい。

テレビ上で、アプリを購入してから使うまでの一連の流れを試してみたかった。

唯一の救いは、ネット閲覧できたということ。
検索エンジンは、もちろん、chrome。

いくつかサイトを見て、思ったのは、PC、スマホ、テレビの3端末に対応させるような作り方をしなければなと。
インターフェースもまだ本決まりの部分はないと思うので、今後、研究されていくだろう。

今後、クラウドTVを通して世の中がどう変化していくのかとても楽しみです。

2011/02/23

[html]articleタグ

小話なのですが、HTML リファレンスを眺めていたら、articleというタグを発見。

これ自体は、特段、変わったタグではないのですが、ここまで用意する必要があるのかどうか疑問に思ってしまった。

2011/02/22

[jQuery]動的にtextareaの高さを調節

facebookのニュースフィードに文字を入力するとき、動的に、textareaの高さが変わる仕掛けになっています。
どうやってそれを実現しているのかな~っと気になって調べたのですが、結局わからず。。。

しかし、似たような機能を実装しているjQuery Pluginとかないのかなーっとgoogle検索を行なったところ、ありました。

Elastic – Make your textareas grow Facebook style jQuery plugin
というエントリーでプログラムが紹介されていました。

導入方法は超簡単。

サンプルコードのダウンロードを行い、

$('#textareaのid').elastic();

を書くだけ。

確かに、サンプルコードを読んでみると、そうなっておりました。

うむうむ、便利、便利。

2011/02/21

[facebook]user_idのexpiresを回避する方法

機能、facebookでuser_idを取得する方法について書きましたが、実は、user_idには、expiresが設定されていて、ある一定期間がすぎるとリクエストが飛ばせないようになっております。

それを回避するためには、https://www.facebook.com/dialog/oauthにリダイレクトを行う際に、scope変数に、offline_accessを設定する必要があります。

これを設定すれば、expiresに悩まされる事なく、ガンガンリクエストを飛ばすことができます。

なんと、便利な。

2011/02/20

[facebook][GoogleAppEngine]アプリの作り方その2

前回、アプリの作り方Hello Worldというタイトルで、facebook上にアプリをのっける方法を書きましたが、実は、あれでは、IDを取得できていないことがわかりました。

なので、今日は、その修正版のプログラムを紹介


#!/usr/bin/env python
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import os
import urllib
import base64

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util

#django
from google.appengine.dist import use_library
use_library('django', '1.0')
from django.utils import simplejson
from google.appengine.ext.webapp import template

class MainHandler(webapp.RequestHandler):
def get(self):
__error = self.request.get('error')
if __error:
#redirect facebook
self.redirect("http://www.facebook.com/",permanent=True)
else:
self.redirect("http://apps.facebook.com/test/")

def post(self):
f_app_id = "●●●●●●"

redirect_url = "http://hoge.appspot.com/test/"
redirect_url = redirect_url.encode('utf-8')

auth_url = "https://www.facebook.com/dialog/oauth?client_id=" + f_app_id
auth_url = auth_url + "&redirect_uri=" + urllib.quote_plus(redirect_url)
auth_url = auth_url + "&scope=offline_access"

signed_request = self.request.get('signed_request')

sig, payload = signed_request.split('.', 1)
sig = self.base64_url_decode(sig)
query = simplejson.loads(self.base64_url_decode(payload))

#not logined
if not query.has_key("user_id"):
self.response.out.write("<script>top.location.href='")
self.response.out.write(auth_url)
self.response.out.write("</script>")
#already auth and load index.html
else:
template_values = {
'user_id':query["user_id"] ,
'oauth_token': query["oauth_token"]
}
path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))

def base64_url_decode(self,data):
sdata = data.encode('ascii')
sdata += '=' * (4 - (len(sdata) % 4))
return base64.urlsafe_b64decode(sdata)

def main():
application = webapp.WSGIApplication(
[('/test/', MainHandler)],
debug=True
)
util.run_wsgi_app(application)

if __name__ == '__main__':
main()


こうすることによって、エラーの場合と、アプリの承認と両方対応することができます。

処理の流れとして、最初に、MainHandlerのpostメソッドがコールされます。
で、facebookサーバーから送られてくるsigned_request の中に、user_idが存在しない場合は、auth_url変数に設定されているURLにリダイレクトします。

リダイレクト後、アプリを承認するかどうかの確認画面が表示されます。

もし、この段階で、否認を選択した場合に、MainHandlerクラスのgetメソッドがコールされます。
その際に、error変数をfacebookサーバーが送信してくるので、この値をもって、否認されることが確認できます。

ない場合は、承認されたことになるので、もう一度、自分にリダイレクトを行います。
で、リダイレクトされたときには、user_idが付与されているので、それを使って、GraphApiなどをコールすることができるようになります。

取得するまで時間がかかりましたが、こうして処理をテンプレにしておくと、後で、振り返ることができるので、便利かなと。

2011/02/19

[Chrome Web Store]国の選択

Chrome Web Store International Support: Developer Previewによると、16カ国の中からどの国にアプリをリリースするか選択できるようになったそうです。

まぁー、こう言ったことは、すでに、AppStoreでは装備されている機能なので、何も目新しくはないのですが、今回の動きからいよいよ今年は、本格的にchrome web storeのローカライゼーションが開始されるんだろうなーっと思い、1エントリー。

2011/02/18

[facebook][Google App Engine]Graph API

Google App Engineを使って、Graph APIを取得する方法について。
Graph APIの仕様は、ここにあるので、これにそった実装を行う。

#!/usr/bin/env python
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.api import urlfetch

class MainHandler(webapp.RequestHandler):
def post(self):
url = " https://graph.facebook.com/" + "Authenticationでゲットしたfacebook id"
result = urlfetch.fetch(url)
if result.status_code == 200:
ret = "var ret;"
ret = ret + "ret = {result:true"
ret = ret + " , content:" + result.content
ret = ret + "};"
self.response.out.write(ret)
else:
self.response.out.write("var ret;ret={result:false};")

def main():
application = webapp.WSGIApplication(
[('/hoge', MainHandler)],
debug=True
)
util.run_wsgi_app(application)

if __name__ == '__main__':
main()

こんな風に実装を行えば、JSON形式でしかも、true or falseを確認した上で、以降の処理を行うことができる。

https://graph.facebook.com/の後に、AuthenticationでゲットしたIDを突っ込んであげれば、基本情報を取得することができます。

こうしてテンプレ化しておけば、いくらでも使い回しができるので、便利かなと。

2011/02/17

[IT用語]ARPUって?

最近、ARPUという言葉を結構聞くので、何かなと?

月間電気通信事業収入。通信事業における、加入者一人あたりの月間売上高。携帯電話事業者の収益性の比較などによく用いられる指標である。

via:ARPU

これって、ソーシャルアイテムとかまでに話を膨らませると、一人当たりの月間売上高ということになるんだなと。

あくまで、月間売上高なので、純益とかを示す指標などもあればなーっと。

結局は、そこが大事なのだから。

2011/02/16

[本]一瞬で自分を変える法

こちらも親父が持っていたので拝借。

1 あなたを大物にする「不思議な力」
2 「勝利の方程式」のマスター法
3 自分を変える「信念強化」法
4 「成功者のメンタリティ」七つの法則
5「一瞬にして劇的に」自分が進化する!
6 「やる気」が自動発火する身体のつくり方
7 相手の「深層心理」を鋭く読む法
8 カリスマが必ず持っている「三つの武器」
9 「戦わずして勝つ」言葉の魔力
10 「新基軸を打ち出す」のが上手い人
11「つねに最高の自分」を引き出すプログラミング
12 富と成功「五つのカギ」
13 最後に、あなたの成功を確信する!

via:目次

他の成功哲学書とは、違って抽象的な部分が少なく、神経言語プログラミング(NLP)を使って他人とコミュニケーションを取っていく方法を中心に内容が展開されていた。

自分、自分と相手に強要するのではなく、あくまで相手を中心にあわせる方法で、かなり気に入ってしまった。

さっそく明日から実践してみようと思った。が、あからさまに相手の呼吸やトークのトーン、ペースなどを真似すると、話相手が馬鹿にされているのかと感じてしまう可能性も考えられたので、あまり露骨に合わせるのはやめておいた方がいいかなと思った。

と感想を書いていたら、人は見た目が9割を思い出してしまった。外見もさることながら、身振りや手振りや声の調子なども総合してあの本では見た目と定義していた。

ある意味通じるものがあるのではないだろうか?

やはりこの手のきちんとしたコミュニケーション法が一学問として確立してもおかしくないのではとますます思ってしまった?
(大学では専門課程としてあるのかもしれないが、中高では当然、存在しない。)

だって、相手がいて初めて自分という存在も成り立つのだから。
この本を通してさらに人間関係に磨きをかけたいと思いました。


2011/02/15

[css]textareaのフォーカスの色を変更

表題通りなのだが、一般的にtextareaにフォーカスが当たった場合、枠線の色が変更されるようになっています。

それを解除する方法ですが、Chrome のtextarea にfocusした時に 黄色く枠線が光るのをやめたい。。を参考にすると、CSSでoutlineをnoneに設定するといけるようです。

実際に試してところ確かに、枠線の色が消えました。

元記事は、chromeだけでしたが、firefoxや、IEでも消えました。

2011/02/14

[iPhone][HTML]ブックマークのiconを設定

iPhoneのsafariで開いたサイトをホーム画面にブクマした場合のアイコンを設定する方法を調査しました。
Specifying a Webpage Icon for Web Clipによると、iPhone、iPod touch用に72x72とiPad用に114x114のpngファイルを用意すればよさそうです。

で、用意したファイルを使って下記のタグを入れることによって設定することができます。

<link rel="apple-touch-icon" sizes="72x72" href="touch-icon-ipad.png" />
<link rel="apple-touch-icon" sizes="114x114" href="touch-icon-iphone4.png" />


2011/02/13

[JavaScript]配列のlengthプロパティについて

arrayのlengthを書き換えることによって、配列そのものの大きさを変更できることは、この本で知ったのですが、では、lengthプロパティに負つまりマイナスの値を入れるとどうなるのだろうか?

var ary = ["hoge","fuga","piyo"];

alert(ary);

ary.length = -1;

alert(ary);​

alert(typeof ary)

上のようなソースで検証した結果、1回目は、すべての配列の値が表示されたが、それ以降は何も表示されなかった。
(chromeで動作)

せめて、エラーならエラー情報を表示してほしいものだが、何も起こらないとなると、こいつはいったい何なのか?

typeofで何も値を返さないということは、そもそも変数自体が宣言されていないと解釈しても間違ってなさそうなのだが。

まーいずれにしても値設定がそもそも不正なので、気にする必要もないと思うのですが。。。

2011/02/12

[css]textareaの縦幅の大きさ

textareaの縦幅を調節する方法は、colsが一般的だと思うのですが、CSSを使ってどうにかできないのかなーっと思っていたら、10.textarea の clos と rows がブラウザにより異なる表示する問題で、width属性で調整できるとわかりました。

さっそく試したところ、確かに縦幅を調節することができました。

便利だなー。

2011/02/10

[Google App Engine]Redirectの方法

ちょっと、facebookiアプリのログイン周りで、リダイレクトをする必要があったので、その方法について調査することにしました。

まず、少しぐぐってみると、djangoを使ったリダイレクトが紹介されていたのですが、実際に試してみるとどうもうまくいかん。

そこで、Google App Engineにビルトインされていないかリファレンスを読んだら、ありましたよー。

ここここにやり方が書いてあって、どうやら、こんな感じでいけちゃうみたい。

self.redirect("http://yahoo.co.jp")
これだと、302でリダイレクトをすることになり、301でリダイレクトを行いたい場合は、
self.redirect("http://yahoo.co.jp", permanent=True)
と第二引数にTrueを入れる事によって可能となります。

すごく便利です。

2011/02/09

[iPhone][JavaScript]setIntervalが働かない件

今日、ちょっと自分のGAE環境化で試してみたのですが、どうやら、iPhone上でスクロールしているときに、どうやら、setIntervalが動作しないようだ。

なぜだろうか?

これって仕様なの?

試してみてないので、断定はできないのですが、おそらくsetTimeoutも働かないかもしれない。
つまり、スクロール中は、タイムのカウントが止まっているのかなと。

2011/02/08

[iPhone][JavaScript]縦幅に関するあれこれ

ちょっとiPhone上のscreenの幅と高さを知りたくなったので、取得方法について
iPhone/iPod と iPadのscreen.widthをみると、どうやら、

screen.width
screen.height

via:iPhone/iPod と iPadのscreen.width

で固定値として取得できるようです。

開発を行なうときは、参考にしたい値です。

2011/02/07

[python]urlsafe_b64encodeメソッドって

facebookのサンプルアプリをみていたら、

base64.urlsafe_b64encode()

という記述があったので、何かなと思って調査したところ、18.12. base64 — RFC 3548: Base16, Base32, Base64 Data Encodingsにヒットして、どうやら、エンコードをしてくれるメソッドなのだが、「+」の代わりに、「-」を「\」の代わりに「_」にそれぞれ変更してくれるようです。

2011/02/04

[blogger]androidアプリがリリース

されました。

参考は↓
Blogger Buzz: Introducing Blogger Android App

iPhone版もだしてほしいなー。

2011/02/03

[mac]便利すぎるF11

windowsでいうところの「ウィンドウズ+d」みたいなものってマックにないのかなーっと探していたら、発見。

こちらを参考にすると、どうやらF11でいけるみたいです。

さっそくためしてみたのですが、すごく便利。


2011/02/02

[本]果たして正義とは?これからの「正義」の話をしよう

妻の陣痛がひどくない内にこちらを読了

第1章 正しいことをする
第2章 最大幸福原理──功利主義
第3章 私は私のものか?──リバタリアニズム(自由至上主義)
第4章 雇われ助っ人──市場と倫理
第5章 重要なのは動機──イマヌエル・カント
第6章 平等をめぐる議論――ジョン・ロールズ
第7章 アファーマティブ・アクションをめぐる論争
第8章 誰が何に値するか?──アリストテレス
第9章 たがいに負うものは何か?――忠誠のジレンマ
第10章 正義と共通善
謝辞
原注

via:目次

果たして「正義」とはなんなのだろうか?

著者であるマイケルサンデルは、ずばりこの問題を身近な例えから問題提起している。

たまたま、親父が持っていたので手に取ってみたが、当初、タイトルと目次的に著者は回答を出さずに、読者に委ねる形で結ぶと考えており、最後に著者自身回答を提示していたことに驚きを隠せなかった。

その答えは本書で確認していただくこととして、他に思ったこととして、当時、高校3年生の時に、政経と倫理の授業が選択制だったので、x軸とy軸のように交わる事のない一種の独立した存在だと思っていたのだが、本書を通して、それが交わるつまり政治倫理学というものがあるのを初めて知りました。

この手の本を読んだことも初めてなので、ここからは推論の領域になってくるのだが、過去の哲学者が唱えた教えを紹介するのだが、歴史順ではなく、不規則な形で紹介されているのもめずらしいのではと思った。

結構な数の哲学者、思想家が登場したので、そのすべてを理解しきれたかと聞かれれば、首を縦に振るのは難しいかもしれない。
なので、繰り返し読む必要があるだろう。

後、話の本筋としてはずれてしまうのだが、プライベートライアンってリアルな世界でもホントにあるんだなと。

いずれにしても、本書を読んでおいて損はないだろう。

2011.02.06追記
danさんの理の不安 - 書評 - これからの「正義」の話をしようで知ったのですが、どうやら、YouTubeで講義を一般公開しているようなので、ブログに貼付けておきます。



2011/02/01

[JavaScript]JavaScriptはもっと変態

javascriptの関数が変態すぎるというエントリーを読んで、追加でちょっと。

JavaScriptは、いくつかビルドインされている関数があるのですが、それを上書きすることができるということ。

例えば、下のようなソースがあるとする。

var hoge = new Date();
alert(hoge);

これを実際に実行すると返ってくる値は、日付ですが、下のように書き換えることもできます。

function Date(){
var foo = "Hello World";
alert(foo);
}

var hoge = new Date();

こうすると、日付ではなくて、「Hello World」がかえってきます。

もともと、この仕様はlisp言語から引き継がれたものです。

一歩間違えるととんでもないことが起こりますが、使い方を誤らなければ協力なパワーを発揮します。