When it’s ready.

出来るまで出来ない

GDD2011 bootcampでAppsScriptやりますた

GDDの前哨戦として、BootCampが開催されました。その中でGoogleAppsScriptの初心者向けのハンズオンセミナーを行いました。

ネタとしては

  1. GASの概要説明 (資料
  2. 入門ハンズオン (全員で一緒にハンズオン) 資料
  3. 応用ハンズオン (紙資料を配布して個別にハンズオン) 資料

特に入門と応用のハンズオン資料はよくできているので、まだ、GASに興味はあるけどどこから始めていいのかわからない方には参考になると思います。資料はそれぞれ id:ymotonpooさんと id:shin1ogawa さん作成になります。スバラシス

Bootcampをやってみて

土曜日の朝10時開始というちょいとキツめの時間にもかかわらず、大変大勢の方に参加頂きました。GASハンズオンには約40名が参加されていました。(部屋的にはきっちり埋まっていて、遅れてきて入れなかった方もいるとあとで聞いて申し訳ありません。1テーブル3名にすればまだ入れましたね)

40名もいるのに、GAS経験者はなんと1名。まさにBootcampにうってつけで、未経験者の方にGASを紹介できてよかったです。ハンズオンセミナーなのに若干、発表の分量が多かった(40分)のでもう少し短くしてその分手を動かしてもらったほうが良かったと反省しております。

今回参加にあたり、2つ参加条件がありました。Gmailアカウントと無線LANで使用可能なPCの持参です。ハンズオンでGASをやるので当たり前なのですが、特にブラウザーの指定等はしていませんでした。実際参加されていた方のブラウザーを見て回っていたのですが、1名がIE、2名がFFで残りは全てChromeでした。FFを抜いて2位になるのも時間の問題とどこかのエントリで見た気がしますがGDD参加者に限って言えばほぼChromeに乗り換え終了している感じでした。2008年の9月にChromeのベータ版が出たことを考えると驚異的なスピードでシェア拡大していることを肌で感じました。

イーモバ端末買い直したら、毎月4000円も浮いた

なんとかと畳は新しいほうがいいといいますが、現代的に言うと
PCと回線は新しいほうがいいのは間違いなさそうです。

イーモバの回線を数年使っています。一時期UQに浮気した際も解約せずに持っていました。その後UQは解約したけど・・・(電波弱すぎた、最近は良くなったのかな?)

イーモバ歴

  1. USB接続のd02hw
    1. http://emobile.jp/products/hw/d02hw/
  2. 謎OS端末s11ht (なんでこれ買ったんだろ?)
    1. http://emobile.jp/products/ht/s11ht/
  3. USB接続の速いやつ d31hw
    1. http://emobile.jp/products/hw/d31hw/
  4. PocketWifi d25hw
    1. http://emobile.jp/products/hw/d25hw/

気づけば色々買い換えてる。携帯電話みたいに番号の縛りがないので気軽に変えたり追加したり出来て便利ですよね>イーモバ

特にUSB端末からWifi端末変わっ時は、出っ張りがなくなっただけでなく複数端末で使えるようになったのが画期的でしたね。今となっては、PocketWifiでないと考えられないです。

クレジットカードの明細を眺めていたときに、イーモバから毎月2回線分引き落とされてる事に気づきました。2400円強と5800円弱合わせて8000円も払っていました。少なくとも18ヶ月・・・お馬鹿ですね。

解約しに浜松町のイーモバショップに行ってみたら、GP02という最新のPocketWifiが契約から2年間毎月3880円で利用できる事を知った。しかも、下り速度が42Mbps(今は7.2Mbps)も有るんですね。まぁ理論値で。

で、とっとと2回線とも解約して、GP02に変えました。

契約整理の前後比較

Before

  • 月額:8200円
    • 使ってないS11HTの回線 > 2400円
    • メインのPocketWifi > 5800円

Change

  • 合計:11000円
    • 解約手数料 > 5400円
    • 手数料 > 3150円
    • 端末代 > 4980円

After

  • 月額:3880円
    • Before差額 > 4320円

解約手数料は、契約時から2年経ってない場合。残付き数x900円です。
3ヶ月もしないで今回の変更分は相殺されて、その後は毎月4千円もオトクになる計算。

変えてみて雑感

GP02にすると下りの速度が7Mbpsから42Mbpsにアップのおまけ付きです。
バッテリーの持ち具合は、今のところd25hw と同じくらい使えてる感じです。
気のせいか充電の時間が早い気がします。電源OFF状態から、利用可能になるまでの時間はD25HWとほとんど変わらない気がする。

メリットは、維持費の大幅安。バッテリーが新品。回線速度向上への期待。
あと何気に嬉しいのは、利用中にPCに接続すると普通に充電してくれる事。今までの端末は、回線利用中はPCに接続しても充電出来なかった。これのおかげかバッテリー切れになる事がほとんどなくなった気がする。

デメリットは、デカイ。3回りくらいでかい感じです。困るほどのデカさじゃないですがd25hwと比較するとかなり大柄になります。

もともと、イーモバの回線の管理をちゃんとしてなかったのがアホ過ぎますが、PocketWifiのみを
使用している人もGP02に乗り換えるだけで毎月2千円ほどお安くなる計算です。

PocketWifiの初期型を使ってる人もそろそろ乗り換え時期かもしれないですぇ
残月数を調べてサクっとGP02に乗り換えるのも有りかもしれないです。

EMOBILE Pocket WiFi GP02

EMOBILE Pocket WiFi GP02

超シンプルな、pushState + Ajax = PJAXのサンプル Flask編

HTML5熱いですね。いろんな意味で

BigPipeやら、HTMLでテンプレートエンジンとかいろいろ出ていますがユーザービリティ下げちゃいけないよねって事は、どの技術でも大切な共通項ですね。pjax = pushState + ajax使えば、リッチな人にはサクサクなUIを、そうじゃない人にもそれなりに提供できる。その上、戻るボタンもサーチエンジンにも優しいとくれば、これは試さないわけには行かないですね。

動作サンプル: http://pjax.atu.si/

Pjaxするとどうなるのか?

非同期動作時

http://pjax.atu.si にアクセスをして、リンクをクリックすると要素が非同期に変更される。
非同期に更新されているがURLは、シンプルなものに変更される。

同期動作時

http://pjax.atu.si/parts/xhttp://pjax.atu.si/parts/y にアクセスするとページ全体が、同期的に更新される。ローカルブラウザでレンダリングされない。


Pythonのサンプルが全然無かったので、Flaskで実装してみました。メチャシンプルですぉ
ファイル構成

.
├── __init__.py
├── main.py
├── static
│   └── js
│       ├── jquery-1.6.2.min.js
│       └── jquery.pjax.js
└── templates
    └── pjax.html

クライアント側

<!DOCTYPE HTML>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>PJAX and Flask</title>
  <script src="/static/js/jquery-1.6.2.min.js" type="text/javascript"></script>
  <script src="/static/js/jquery.pjax.js" type="text/javascript"></script>
  <script>
  //$(function() {
  $(document).ready(function() {
    console.log('load done');
    $('a').click(function(evt){
      evt.preventDefault();
      console.info(evt);
    });
    $("a.js-pjax").pjax("#main");
  });
  </script>
</head>
<body>
<a href="/parts/x" data-pjax="main" class='js-pjax'>パーツX</a><br>
<a href="/parts/y" data-pjax="main" class='js-pjax'>パーツY</a><br>
<div id="main">
{% if p.main  %}
 {{ p.main }}
{% endif %}
</div>
</body>
</html>
  • aタグのデフォルト動作をキャンセルし、パーツXとパーツYのリンクを乗っ取る。
  • $(リンク要素).pjax(DOM要素) で、リンク要素が押されるとX-PJAXヘッダー付きのリクエストが流れて、レスポンスがDOM要素に詰め込まれる。
#!/usr/bin/env python
#coding:utf-8


from flask import Flask,render_template, request
import os

os.chdir('/var/www/pjax_flask/src')
app = Flask(__file__)

@app.route('/')
def index():
  p = {}
  return render_template('pjax.html', p=p)

@app.route('/parts/<type>')
def get_parts(type):
  p = {}
  if "X-PJAX" in request.headers:
    return 'only parts %s'%(type)
  p['main'] = 'all page with parts %s'%(type)
  return render_template('pjax.html', p=p)

def main():
  app.run(host='0.0.0.0')

if __name__ == '__main__':
  app.debug = 1
  main()

パーツのリクエストが非同期で飛んで来る時は、jquery.pjaxがヘッダーにX-PJAX付与される。直接リクエストが来るときには、X-PJAXが付与されない。よって、非同期の時はパーツのみレスポンスし、直接リクエストが来る場合には、テンプレートを使ってレンダリングし全体をレスポンスとして返す。

やってみて

jquery.pjax理解するのが、大変だったけど実際に実装するのは簡単だった。
これくらいの手数が増える程度で、戻る対応出来たり、JS非対応ブラウザに対応出来たりするのは感動もの。
今後大きく利用される可能性があると感じるのは、動かしてみて挙動自体に違和感がなく想像通りに動いているっていうのところ。何でもかんでも新しいモノに変われば良いってもんじゃない、以前と同じように使えてるように見えて実はAJAX出来たり、それと同じ様に見えてるのに、非AJAXで動作してるっていうのがいいよね。

ソースはこちら : https://bitbucket.org/a2c/pjax_flask/

昨日の続き>実名登録に関して

一晩で色々ツッコミありがとうございます。とても勉強になります。ネットは全然専門じゃないので想像100%ですが、実名主義に感しては感情的な意見が多かったので、お金的な側面から眺めるとすっきりすると思いました。そういうのも全部ひっくるめて、いろんな人がサービスをチョイスしていけばより適切な世界になるんじゃなかろうかと・・・

Kil『本当のプロフィールを知っているサービスでは、適切な広告出しやすくなり、Win-Win-Winの関係を構築しやすくなります』 どこのTVCMが、プロフィールを知って適切な広告を出してくれてるの?? 全然同じじゃない。2011/08/11

広告を出す仕組みが同じということではなくて、ギブ&テイクという意味で同じじゃなかろうかという考えです。利用者すべての各人に適切な広告を出したいネットと、広告を見て欲しい人だけ集めるTVでは、おっしゃるとおり全然同じじゃないです。

iwwブログtwitter「架空の人はモノ買わない」このあたりから論理がおかしい気がする。匿名の人は架空の人では無いし。2011/08/11

匿名の人が適当に書いたプロフィールは、架空の人ではないとするとどんな人なんでしょうか?架空のプロフィールが、本人の趣向にあっていて購買活動につながるならばリアルプロフィールより効果は高いですね。そうなると、非実名主義になるかも知れないですね。

retletんー、実名別にぜんぜんユニーク値じゃないしこの論のとおりなら顕名でいいじゃんって思う。この件でほんとに困ってる人は匿名じゃなくて顕名にしたいのでは2011/08/11

”顕名にしたい”>そう思います、本名を求めてるけど嘘がない情報が欲しいだけでリアル実名である必要はない>リアルと結びつかなければ良い、と思います。でも、そういう仕組や文化がないので安直に実名を求められてる。やり方が納得いかなければ、サービスを使うなという一方的なやり方が、反感をかったり、悲しんでたりする人がいる。リターンに見合わないコストだと感じる人がいるのが問題。CMも視聴者は選択できないけど、チャンネルの選択権があるので強制感が少ないですよね。同時にFacebook+とか Google# とかあればまた変わってくるのかも知れない。ネットワークの外部性がポータブルになれば、サービスサイドからユーザーサイドへ決定権が移動する。

fukkenGoogle+が流行ったら広告バンバン載せてくると思う//求む意見らしいけど、だいぶ話にならない。世の実名SNSは広告単価を上げるためにやってるって?実名SNSは裏でこっそり個人情報を名寄せするために運営されてるって?2011/08/11

勝手な想像ですので、話にならない事だらけかと思います。ハヤッたら広告バンバン載せるとは言ってないです、すでに出してる広告をよりマッチさせるためにいろんな趣向を出してもらうためのサービスじゃないのか?そのために実名を強制することでより正確な情報を提供させているのではないのか?という組み立てです。名寄せに使えるっていうのは後付ですね違和感あってすみません。名寄せなのか、ユーザー情報提供なのかわかりませんがそういう情報の売買っておいしいと思うんですが、誰もやらないんでしょうか?

ymseagullGoogle+に広告がで始めるのはこれからですよ。googlefacebook内に広告が出せないのが悔しくて悔しくてたまらないのですから。自分たちのSNS内で友人たちのサークルができ始めたら当然ソーシャルな広告を生むでしょう。2011/08/11

そうかも知れませんが今のところは広告ないですよね? FB内に広告を出せないことより、FBのように個人のプライベートな情報を集められないのが悔しいのじゃないのかと考えています。今後、FBは何かに変わるかも知れないけどユーザーの情報はどこにいっても使い回し出来るのではないかと思うので。

kusigahama戸籍名は重複しうるから一意ではないし、住所登録でもしない限り紐付けの役には立たない。2011/08/11

そうですね、紐付けの役には立たないですね、すみません。Cookieとか使ってもダメなのかな?気になる。

itochanadアバター商売だと、架空のキャラクタの裏側にいる実名でない人物が物を買っているように思う2011/08/11

アバター商売の顧客で、お金を払って幸せな人 "未来に生きてる人達" が羨ましいです。実経済は、アバター商売よりはるかに大きな気がするんですが、気のせいかも知れない。

p260-2001fp『Amazonは完全に実名制なのに誰も叩いていないのは』ここ違和感。Amazonに登録する事で第三者に実名が知られたり、購買履歴が閲覧されたりするんだっけ?別に細かい差違がどうこうっていう話ではないだろうけど・・・2011/08/11

第三者というのは、同サービスを使用している人と言う意味かと思うのですが、Amazonはユーザー情報を勝手に公開しないですね。公開しなくてもAmazonは他人も含めどっぷりその情報を使って、オススメを計算していると思いますが、昨日のエントリでは、そこの説明がうまくいってないですね、気づかせてくれてありがとうございます。Googleは本当に人と人を結び付けたいのかも知れないですね・・・えっ?

tienoti良考察。SNSってCMを2分間見せるための28分最新ヒットチャート歌番コンテンツだったのか。ポケモン番組の途中のCMはポケモン製品ってのがgoogleをハブに今後たくさんうまれるのでせうね。2011/08/11

ありがとうございます。

hazardprofile瑣末なことだけどAmazonのオススメ品の制度が恐ろしく高いというのは初耳 使えないシステムだと思ってた2011/08/11

個人的には、Amazonでは検索した商品より、オススメ品の商品を購入している数が多い気がします。一回の購入で3品買う時、1個は欲しかったやつで残り2個はおすすめされたやつとか・・・完全にやられてますね>自分。オススメはその人の履歴だけでなく、同じ商品を見ていた人達の動向も知っているからより正確なんだろうなぁと考えていました。使えないと思う方が居たのに気付かさせてくれてありがとうございます。

TVのCMとSNSの実名登録は同じ

実名を求めるSNSに対して色々な意見が飛び交っている中、皆様は実名登録されているでしょうか? 中2病発症中のa2cです。

そもそも、実名で騒がれているのはFacebookGoogle+の2大サービスですね。そして、不思議なことに、「実名はけしからん」とか「匿名で言いじゃん」とかそういう事言っているのは、匿名OKなどこぞのBlogやらTwitterでワーワー言われてるんですよ、不思議ですねぇ。Google+なんて意見を報告する仕組みがあって、そこから中の人に直に言えるのにわざわざ届かない&誰が言ったかわかりにくい仕組みを使って実名登録強制制度をDisっている訳です。と言うことで、そういう人は私と同じく、中2病のかまってちゃんという事でスルーでOKデスネ。

で、実際のところなんで実名なのかっていうと、架空の人はモノ買わないからですよね。買うかも知れないけど、本当に買ってるのは架空の人を作ってる実名な人であるからです。特例で架空の人の為に実名な人がモノを買ってあげている未来に生きている人がいるかも知れませんが、そんな人は超高校級イノベーターなので無視しても影響が少ない(どころか影響なんて無い)ので無視

そして余談ですが、facebook にあって Google+ に無い物があります、わかりますか?抽象的に言うとシンプルさであり、具体的に言うと、広告です。Google+には、びっくりするくらい広告がないんです、素晴らしく作りこんだWebUIがあり各種モバイル端末のネイティブアプリがあり、写真のアップロードなんて事実上無制限になっている(=作るのにも、運用するのにもメチャお金がかかってる)のにも関わらず、Google+には広告がないんです。素晴らしいですね。
 理由は簡単ですね、広告を出す所が別に用意されてるだけなんです。検索結果だったり、Gmailの隙間だったり、ありとあらゆるBlogやECサイトの広告枠たち、これらになんぼでも広告出せるわけです。だから、Google+には広告なんて載せる必要がない。対してFBは、FB上が全てです。他に広告だす隙間を持っていないんですね。だからしょうがないからFB上に色々と広告がのってくるわけです。当たり前のことを言ってすみません。広告なんてウザいですよね。無いほうがいいですよね。広告いっぱいのってて嬉しい人なんて見たこと有りません。

でも、広告がないとサービスがなくなります。ただでは作ることも運用することも出来ないですから。代わりにユーザーからお金貰えばいいじゃんとか言った所で、外部性も働いてない面白いかどうか分からないサービスにあなたはいくら払えますか?まぁ、殆どの人が払わないと思います。だから、ユーザーからお金を直接貰うよりも、ユーザーのために生活を豊かにする製品やサービスの広告をだして、ユーザーは購入しその購入代金の一部を広告媒体主に還元する。そうやっていったほうがWin-Win-Win(ユーザ:広告主:広告媒体)の関係が構築できますよね?そう思いませんか?

思わなくてもっといい方法があったら、今直ぐその方法を実行したほうがイイです、絶対今より良い世界が作れます。頑張ってください!(本気で言ってます)

問題は、本当に生活が豊かになったりする広告を出せるのか?って話です。例えば匿名性のサービスがあったとします。そのサービスに登録する時に、うその性別や趣味を登録したり、プロフィールを全く登録しない場合には、サービス側(広告媒体)は、ユーザーの傾向を理解していません。そんな広告媒体が、適切な広告をユーザーに見せられるわけもなく、あまり嬉しくない広告を出す可能性が高くなります。一方、本当のプロフィールを知っているサービスでは、適切な広告出しやすくなり、Win-Win-Winの関係を構築しやすくなりますよね。

そんなもん「匿名のまま正しきプロフィールを入れて、クリックしたものとか統計取れば適切な広告出し易くなるじゃん」とか、そういうツッコミもあるかと思います、しかし、実名はどこに行っても実名なので、サービスが変わったとしても一意です。簡単に別のサービスとの情報のヒモ付が出来ます、エコですね。匿名と匿名だったら、ID違うのにスゲー興味の似てる別人ということになりますよね。そうやって、個が特定されればされるほど、情報が多ければ多いほど適切な広告が出しやすくなり、あなたの知らなかった欲しかったモノが手に入る訳です。

まぁ、それで生活が豊かになるのかはわかりませんが、どうせ見るなら、ハズレた広告よりアタリな広告を見たいものですよね。例えば、Amazonは完全に実名制なのに誰も叩いていないのは、Win-Winの関係が成り立っているし、オススメ品の精度も恐ろしく高いですよね。(Amazonがリスク取ってるっていうのもあるけども)

要するにコレって、コストパフォーマンスとか、リスクとリターンの話だよね。て思うわけです。便利なSNSプラットフォームをタダで使わせる代わりにリアルな情報提供しなさいってことです。(逆じゃないんですよね、ユーザーから”情報やるからサービス作れ”には決してならない)昔聞いた好きな言葉で言うと ”ギムを蒔かずにフクシを食べる” 事は(長期的な目で見て)出来ないって事です。当たり前な話ですね。スミマセン。

どこが、「TVのCMとSNSの実名登録は同じ」なのかというとTVの場合は、30分の番組だったら本当に見て欲しいのはCMなんですよね、本編はCMを見て欲しい人が集まるようにしているネタ(フィルター)です。28分最新の歌を提供するからCMみて購入してねってことです。効率のいいやり方だと思いませんか?これが、2分間笑いを提供するから28分間CM見てねになったら誰も見ないです。時間パフォーマンスが悪すぎるからです。そうやって、ユーザへのメリットを提供しつつ、ギリギリのデメリットに抑えて、適切な広告を出そうとするTVの仕組み、ん? 何かに似てるよね、実名登録のSNSと同じじゃん!! ということになります。でも、実際は実名登録することに慣れていないので、心理的慣性の法則が働き「なんで今まで匿名だったのに実名登録しなくちゃいけないんだキーッ」みたいな状況が生まれている。匿名のままがよかったら匿名のままどんどんアド踏んでバンバン物買えば実名の必要性が下がるよ、そうじゃなければ登録しろよゴルァとなるわけです。どちらにせよユーザーに選択肢は無いんですが。

最後のパートで話がそれましたが、どれだけ効率良く購買活動につなげるのかと言う意味では、「TVのCMとSNSの実名登録は同じ」という切り口考えたらスッキリしたので久々の長文エントリー。最後まで読んでいただきありがとうございます。あなたの意見を聞かせてください。

本音を言うと、「選択の自由と、行使の力があったらお金なんて要らない」のになぁと思います。OSSやスター・トレックボイジャーの世界ではお金ないですもんね。そんな世界になればいいですね。

Chrome Book の基本のキ

GoogleIO 2011で参加者に配布されたChrome Bookをやっと入手出来た。

箱から出して即使おうと思ったのに、コンセントが必要なくらいバッテリー残量がなかったり
初ブート時にはアップデートが走ってなかなか使えないのがいい感じに憎たらしいですが
一旦起動してみると、想像以上に快適。普段使ってるMBP15 i7と遜色ない感じで使えてます。
若干フォントの表示がOSXよりも雑な感じがするけど、Winよりも遥かに綺麗です。

さて、ChromeBookを使う上で、いくつかtipsを紹介(まだ触り始めて2時間くらいだけど・・・)

装飾キー

chromeを使う上で、コントロールキーは非常に重要です。新規タブであったり、タブの移動、なんとかバーにフォーカス移動であったり
その全てにおいてctrlキーを多用するわけですが、”a”キーの隣は謎の検索ボタンになってたりします。右小指の隣は重要なキー(エンター)なのに
なんで左小指の隣には、caps lockだったり検索ボタンだったりそこまで重要じゃないキーをアサインするのか理解できないです。
しかし、さすがGoogleさん数少ないシステムの設定項目(4項目)の中に修飾キーの変更できる項目が含まれます。
これで、検索キー、ctrlキー、altキーに好きなキーをアサインできます。

とりあえづ、検索とctrlを入れ替えました。MBPと違和感なく操作できます。

新規ウィンドウ

新規タブは、同一画面上にタブが増えていく(ctrl+t)でいつものパターンですが、ウィンドウシステムのないchrome osではどうなるのか?
フルスクリーンモードのLionのように画面が横方向に追加されてい来ます。追加される場所は、フォーカスが当たっている画面の右隣です。
元からある画面はどんどん右に追いやられます。この挙動は好みが別れるところなのでいずれオプションがつくかと思います。

画面間の移動のショートカットは、順番に移動するならalt+tab でさくさく移動します。
ダイレクトに移動したければ、alt+数字 でその番目の画面にジャンプします。

ターミナル画面

なにげにメインになりそうな、ターミナルがchrome osには用意されています。
zshやらbashやらそういう便利な使い慣れたshellはないですが、croshというshが提供されています。
lsもvimもないですが、topはあります。他にはモデム周りやapn設定関係があります。

その中でsshコマンドが用意されているのですがこれが一癖あります。

一般的には

% ssh hoge.com -l foo

みたい感じで使うかと思いますが、そのやり方は使えません。

% ssh
ssh> host hoge.com
ssh> user foo
ssh> connect

とやることでsshサーバに接続できます。sakuraのvpnに問題なく接続できました。接続しちゃえばあとは何でも自由自在ですね。ウマー
ホスト情報は、一回覚えさせるとssh コマンドを抜けるまで覚えているので2回目以降はconnectだけで再接続できます。

以上、chrome bookのファーストインプレッションでした。
これは相当使える気がします。

オールドPython2.4.xでのtimeoutの仕込み方

Python2.6だと

import urllib2
def hoget():
  try:
    result = urllib2.urlopen(req_url, timeout=5)
    return result.read()
  except urllib2.URLError, e:
    print e

で仕込めるらしいが、Python2.4.3だと使えない。(いまさら2.4なのが痛いが)

で、2.4だとどうすればいいのか分かったのでメモ

import urllib2
import socket
socket.setdefaulttimeout(5)

def hoget():
  try:
    result = urllib2.urlopen(req_url, timeout=5)
    return result.read()
  except urllib2.URLError, e:
    print e

これでいける。カツル!