Hatena::ブログ(Diary)

bufferings

2011-11-20

変態アドベントカレンダー 2011 11日目

03:15 |

こんばんは!変態アドベントカレンダー( http://atnd.org/events/22020 )の11日目です。

Chrome拡張作りました。

変態アドベントカレンダー 2011 11日目 - Chrome Web Store


  • Chrome拡張のアイコンをクリックするといつでもATNDにいけます。
  • Googleさんで検索したときに便利になります。

ソース

javascriptの書き方わからんのやけど(´・ω・`)。一応書いとくね。

manifest.json

設定ファイルね。

browser_actionがブラウザの右上に出てるアイコンの部分。

content_scriptsがページ読み込んだときの動作。

{
  "name": "変態アドベントカレンダー 2011 11日目",
  "version": "1.2",
  "description": "\"変態アドベントカレンダー2011\"の11日目のChrome拡張です。",
  "icons": {
    "16": "icons/hen16.png",
    "32": "icons/hen32.png",
    "48": "icons/hen48.png",
    "128": "icons/hen128.png"
  },
  "browser_action": {
    "default_icon": "icons/hen19.png",
    "default_title": "変態アドベントカレンダー2011"
  },
  "background_page": "background.html",
  "content_scripts": [ {
    "js": [ "content.js" ],
    "matches": [ "http://www.google.com/search?*", "http://www.google.co.jp/search?*" ],
    "run_at": "document_end"
  } ],
  "permissions": [
    "tabs",
    "http://www.google.com/search?*",
    "http://www.google.co.jp/search?*"
  ]
} 

background.html

アイコンクリックしたらatndに飛ぶようにしたー。

<html>
<head>
<script>
const ATND_URL = "http://atnd.org/events/22020";

function goToAtnd() {
  chrome.tabs.getAllInWindow(undefined, function(tabs) {
    for (var i = 0, tab; tab = tabs[i]; i++) {
      if (tab.url && isAtndUrl(tab.url)) {
        chrome.tabs.update(tab.id, {selected: true});
        return;
      }
    }
    chrome.tabs.create({url: ATND_URL});
  });
}

function isAtndUrl(url) {
  return (url == ATND_URL);
}

chrome.browserAction.onClicked.addListener(function(tab) {
  goToAtnd();
});

</script>
</head>
</html>

content.js

もしかして: 変態?

var topstuffElem = document.getElementById('topstuff')
if(topstuffElem) {
  var element = document.createElement('p');
  element.className='ssp';
  element.innerHTML = '<span class="spell ng">もしかして: </span><a href="http://atnd.org/events/22020" class="spell"><b>変態</b></a>&nbsp;&nbsp;<br>';
  topstuffElem.appendChild(element);
}

ちなみに

ChromeWebStoreで"変態"で検索かけると...

Chrome Web Store

わーい


続くといいなぁ。おやすみ。

2011-11-13

「やきに駆動 秋のJava祭典スペシャル in 大阪〜こりん星 #yakiniku4j 」 に参加した

00:42 |

atnd

http://atnd.org/events/20138

togetter

http://togetter.com/li/213867

前座

  • @tan_go238 :JVM
  • @backpaper0 :synchronizedやjava.util.concurrent、actorなどの並行処理
  • @irof :“JUnit使って学習テスト書いてからオレオレコレクションを作るって感じです”
  • @hakurai :スレッドとロック(Java仮想マシン仕様第8章)
  • @s_kozake :“お題は当日発表でお願いします”(play.jobs, cron4j, mybatis)


という感じで。濃い話をきき。その勢いで。コリン星(港区?)に乗り込んで焼肉食う。


流れ

ゆうこりんの動画をみるために四苦八苦するおじさんたちなう

肉の画像が出た瞬間にテンションが上がる勉強会

「読める!読めるぞ!!私にもバイトコードが読めるっ!」 「読めるかー!」

お菓子がいっぱいあるけど、食べ過ぎると肉が食えなくなる罠。

#yakiniku4j ってなに? Yakiniku APIJava ラッパ?

まさかのエスペラント語での発表!!

小倉優子に学ぶプログラマとして知るべきたったひとつのこと 2011-11-13 at やきに駆動 秋のJava祭典スペシャル in 大阪こりん星

きのこ/たけのこ戦争勃発

@tan_go238 さん、たけのこの里出身らしい

ウラガミはセキュリティーに弱いし廃棄コストがかかるとのこと


本番

会場到着

f:id:bufferings:20111114002015j:image:w360

ソーセージ長い!!

f:id:bufferings:20111114002014j:image:w360


あとは食ったり喋ったりに必死。


お疲れさまでした。

これをよめっつーことがわかった。



面白かった。次は鍋のついでにテストの話ききたいな。|ω・)

2011-09-07

Scrum Boot Camp 関西 2011 ( #scrumbc ) に参加したのや

| 00:39 |

すごく面白かった

9/7(WED)に神戸国際会議場で開催されたScrum BC 関西に参加した。

すごく面白かった。


Scrum BC 関西

http://codezine.jp/devsumi/2011/kansai/special


Scrum BCが気になっている人たちへ

是非行っとくべき!


Scrumやりたいなぁとか

やろうとしてるけど難しいなぁとか

やってるけど悩んでるとか


そういう人は是非行くとヨイと思います。

コーチのみなさんがとても丁寧に応えてくれます。


メンバーもみんな前を向いているので

とても良いチーム経験をすることができます。


形式

形式は座学+ワークショップ。なので。知識だけでなく体験も得られ。

その体験によって知識を噛み砕くことができる。


さらに。噛み砕いていく中で疑問が生まれても。

経験豊富なコーチ陣がその場で応えてくれる。(答えてくれるというより応えてくれる。)


チーム

まず最初に参加者でチームを組んだ。6or5人×6チーム。

イイ方法でイイ具合に分けてくれたので。レベル偏らず。


そして僕はイイメンバーと出会うことができたのだ。わーい。


まぁ僕のチームに限らず。どこのチームもイイ感じだったなぁ。

皆が前向きってスバラシイ。

今日はそういう集まりだから当たり前といえば当たり前なんだけど。>前向き


コーチ

アジャイル実践者でありアジャイルコーチでもある経験豊富な方々。

この方々が講師やファシリテーターをしてくれる。


このコーチが6人いる。・・・贅沢すぎるやろ。

高校の授業を6人の先生から教えてもらってる感じ。といえば分かりやすいかな。


コーチ・チーム

講師をしている方のフォローを他のコーチがしたり。

コーチ同士で説明を補いあったり。


何かの質問に対してのコーチ達の意見もそれぞれ違う部分があって。

だから一人の意見だけに偏らない。

なんかチームっぽいよね。これがまた為になる。


コーチ自体がなるほど。良いチーム。


Q&A

質問を壁に貼っといたら。時間があるときにコーチが回答してくれるという

ステキシステム。


全体の流れ

最初は

  • 座学「Scrum概論」

ふむふむ。


んで。ランチ混んでるからずらそうってことで。

急遽予定を変えて。もひとつ

  • 座学「役割:プロダクトオーナー/スクラムマスター/チーム」

ほほー。実際自分の中でココが一番難しい。


昼ごはん食べて心地良く眠ろうかというところで。

スプリントについて学んだ。・・・でも、きぃくやしー。


次は

あれ?オレ今日会社で仕事してるんだっけ?と思った。


そんなこんなであっという間に時間がオーバーして。

  • ふりかえり

Problemに「相談できる人があまりいない」とあげたら。

それをTryに移して「よかったら相談してよ」と言ってくれた。

イイチームだなぁ。。゚(゚´Д`゚)゚。


感想


整理

本やウェブサイトで自分なりに勉強していたが。

実践者の口から聞くとまた印象が違って良かった。


また、参加者同士で組んだチームのメンバーの話も

とても参考になった。


今まで頭の中にランダムに放りこまれていた情報を

このブートキャンプによって大分整理することができたなぁ。


制約

本には「こうやるべき」ということが書いてあるんだけど。

実際には色々な制約の中でやらないといけなくて。

自分は従うことができてないことの方が多い。


アジャイルやってる他の人はどんな感じなんだろう?と思っていたので

現場の状況を聞いたり話したりすることができてとても参考になった。


体験

そして、ユーザーストーリー作成とプランニングポーカー

ワークショップで実際にこれらを体験することができた。


とても貴重な体験をさせてもらった。


取り入れたいのぅ・・・。

どうやるのが自分のいる環境にとって良いのかを考えなきゃいけない。


最後に

コーチの皆さん。チームの皆さん。

めっちゃ面白かったです。ありがとうございました。


それにしても

川口さんのスベリ芸は超絶かっこよかったナー。

2011-06-11

からあげ合宿に参加してきた #rkaraage

22:18 |

金曜の夜から土曜の夜まで八王子の山寺にてもくもくコーディングしてきた。


ツイッター上で同じ会社の東京の人たちが「開発合宿やろーぜ」的な話をしてたので。

軽い気持ちで「俺もいきたいのー」とつぶやいたら。本当に社内メールでお誘いが来た!

ので行ってきた。


目標

一日中もくもくコーディングしたいなーと思ってただけで。

特に何を作るかは決めてなかったんだけど。緊張感と達成感のためにゴールは決めてました。


ゴール:最終的に動作して成果発表できるものを作るコト


京都GTUGのハッカソンの経験から心がけたのは

  • 『欲張らない』:シンプルな機能にすること
  • 『こだわらない』:発表するための必要最低限の機能だけにすること

じゃないと。できあがらない。


作ろうとしたもの

会場までの移動時間に。ぼけーっ。

インターネットTVが家にあったらどうだろう?と妄想。

Webサイト開いて買い物とかするんだろか。

テレビといえばリモコンだよね。

あ。インターネットにつながってるなら携帯で操作できるんじゃね?


ということで。リモコン作ることにしました。


アンドロイドアプリ作ってみたいなーと思ったけど。全く知らないので今回は無理。欲張らない。

GWTGAEを使ったWebアプリでなんとかしよう。


てことは。Webサイトを操作できるWebアプリ作ろう。てことか。

欲張らずに。画面スクロールだけの機能をもったリモコンにしよう。


悩む

自作のページにスクリプト埋めておいたらリモコン操作できるだろうけど。

「bufferingsのブログをリモコン操作できます」ってだれとく?

どんなサイトでも操作できたほうがいいよね。


で。しばらく考える。

Chrome Extensionなら実現できるんじゃね?

・・・なんとなく。


Chrome Extension

Chrome Extensionは、お手軽につくれるとはよく耳にするものの。

全く無知だったもので。まずはドキュメントを読む。

Not Found - Google Chrome


Getting Startedを読んで画像ポップアップ作った。うへー。すげー簡単なんだなー。

そしてBrowser Actions、Page Actionsへ読み進もうとするも1行ごとに意識がとぶ。

あきらめて布団でさくっと寝た。


朝起きて。自分がやりたいのはBrowser Actionsでできそうだと理解。

Background Pages、Content Scripts、Tabsを読んだ。

他にも色々ドキュメント読みたかったけど、こだわらずに。必要そうな部分だけを読んだ。


Channel API

リモコンを作ろうと思ったときから頭の中にはGAEのChannelAPIがあった。

これでプッシュすればできそうだよねと。


これも使ったことなかったので。かずのりさん、すぎゃーんさん、しゅーじさんのサイトを見ながらfmfm。

ユーザー毎に異なるトークンを作れたらいいけどそれは後回しにしよう。(そしてやっぱりその対応の時間はなかった)


GAE+GWTのプロジェクトを作って。今回DataStoreを使わないので。Slim3も使わず。

単純なServletGwt-RPCだけを使った。本当はRequestFactoryを使ってみたかったけど、こだわら(ry


joinサーブレットを作ってトークンがbackground.htmlに返されるところまでを確認。


GWT

上スクロールボタンと下スクロールボタンを持った画面を用意すれば良いよね。

と。GwtDesignerを起動。やっぱり起動が遅いものの。起動後の動作は案外軽快。


レイアウトパネルとボタンを適当にぺたっとして。サイズをプロパティパネルで設定。

結構きれいなコードが生成された。GwtDesigner結構便利カモ。


OnClickのイベントハンドラ生成して。Css作成して。

サクっとできた。GwtDesigner結構便利カモ。


あとは。使い慣れてるGWT-RPCで適当にメソッド作った。

プッシュしてみたけど反応なし。あれ?


しばらく悩んで。試しにデプロイしてみた。

ら、プッシュに反応。おー。


Content Scripts

あとは。Content Scriptsでと思ったけど。

どうもExtensionのフォルダに入ってないものの読み込ませ方が分からなかったので。

例えばGooglejQueryとか。どうやって突っ込むんだっけー?とか。


結局Content Scriptsも使わずに

「スクロールさせる」という処理をexecuteScriptで埋め込んだ。


発表

ぎりぎりなんとか。発表できる程度のものができた。

GAE上のWebアプリの上下ボタンを押したら。Chromeで開いてるサイトが上下に移動する。というシンプルなもの。


リモコンっぽく画面に向けて操作してしまうけど。

いや。アメリカで画面開いてても操作できるわけだ。一人でちょっと感動した。


そして。満足した。


最後に


@rainydragon さん

すばらしい会場を提供して下さりありがとうございます。

さすがの環境構築に惚れました。そして眠りっぷりも見事でしたw!


@kogee さん

色々手配や調整ありがとうございました。

誘ってくれてありがとーございました!


@参加されたみなさん。

もくもくしてたので全然会話なかったけど楽しかったです。

途中ほむほむ言ってて何語か分からなかったりしましたがwww。

それも含めてとてもいい刺激を受けました。ありがとうございました。


@自分

仕事では調整ごととかレビューとかが多くてコーディングをがつがつやれてなかったので

なんかもうすっきりした。かなりすっきりした。

あと自分の知識のなさに絶望した。がんばろう。


みなさんすばらしいエンジニアで一緒にいれて嬉しかったです。

2011-06-07

#slim3 のentityToModelが遅い?

| 03:07 |

てあったので。気になって見てみた。

    @Override
    public Navigation run() throws Exception {
        StringBuilder time = new StringBuilder();

        long start = System.currentTimeMillis();

        AsyncDatastoreService ds =
            DatastoreServiceFactory
                .getAsyncDatastoreService(DatastoreServiceConfig.Builder
                    .withDefaults());
        List<Entity> entityList =
            ds.prepare(new Query("Bar")).asList(
                FetchOptions.Builder.withDefaults());

        time.append(System.currentTimeMillis() - start).append(" ");

        for (Entity e : entityList) {
            Bar model = new Bar();
            model.setKey(e.getKey());
            model.setSortValue((java.lang.String) e.getProperty("sortValue"));
        }

        time.append(System.currentTimeMillis() - start).append(" ");

        sessionScope("getSlim3", time.toString());

        return redirect(basePath);
    }

結果は 1 1316 millis。

でもktrwjrでentityToModelを10000回呼び出しても数十msで終わる。

なんだろなー。



追記


こういうことでした。