kinjouj.github.io

angular-cache

2015-07-17T08:11:22+09:00 JavaScript angular.js

angular.jsには$cacheFactory?っていうのがあるけれどもおそらくはlocalStorageとかにキャッシュしたりするような機構は備わっていないはず。でそういうのを出来るようになるangular-cacheっていうのを使ってみたのでメモ

Google Cloud Endpoints(Java)を使ってみた

2015-06-24T17:03:46+09:00 Java Google App Engine JavaScript

公式ドキュメント: https://cloud.google.com/appengine/docs/java/endpoints

今までGoogle App Engineを使ってWeb API的なのを定義する際、Slim3を使ってOAuthServiceで認証情報を取得してJSONでレスポンス返す的な事を一から実装してたりとかしてたけど、今時そんな事しなくてもGoogle Cloud Endpointsを使う事で同等な事をさらっと出来るようになってるらしい

っていう事でドキュメントを読みつつやってみた

angular.js directiveのbindToController

2015-06-20T16:45:37+09:00 JavaScript angular.js

参考: AngularJS1.4とbindToController

参考から引用すると

Directiveを自作する時に、コントローラーへ値を引き渡し、バインディングするには$scopeが必要でしたが、これが$scopeいらずで行えるようになりました。ng-controllerのas構文では先行して可能だったことがDirectiveでも可能になったんです。また、1.4では、どの値をバインディングするのか、どの値をバインディングしないのかを明確に定めることができるようになりました。

との事。要はdirectiveで指定されるcontrollerにdirectiveが持つscope等で指定したパラメーター等をcontrollerのプロパティとして伝播し利用する事が1.3からbindToControllerを使って可能になり、1.4からはbindToControllerのパラメーターの設定によりバインディングの設定等が行えるようになったよ的な事かと

っていう事でやってみる

ECMAScript6でangular.js

2015-06-17T01:29:42+09:00 JavaScript angular.js

angular.js(1.x)を使ってるけどJavaScriptをbabel.jsを使ってECMAScript6で書きたい。そういう場合どうすれば良いのか色々調べてみた

※angular.jsアプリケーション全体をES6で書いて検証した訳ではないので本当に問題が無いかは不明

※あくまで開発よりはビルドする方法なネタ

ServiceWorkerを使ったPush APIをやってみた

2015-05-17T00:00:00+09:00 JavaScript

公式ドラフトドキュメント?: http://www.w3.org/TR/push-api/

参考1: http://updates.html5rocks.com/2015/03/push-notificatons-on-the-open-web

参考2: http://qiita.com/tomoyukilabs/items/8fffb4280c1914b6aa3d

前から気になってたServiceWorkerを使ってPush APIを実装するっていうのが話題になってた気がするので、ざっくりと参考を読みつつやってみた

jestのrunAllTimers/runOnlyPendingTimers

2015-04-12T00:00:00+09:00 JavaScript

参考1: https://facebook.github.io/jest/docs/timer-mocks.html

参考2: http://qiita.com/koba04/items/2f97904b3ca247fc1917

以前に出した上記の参考資料2にも書いてるけど

runAllTimersは全てのTimerで待っている処理を実行させて、runOnlyPendingTimersはその時点でPendingになっているものだけを実行します。 setTimeoutで再帰しているような実装の場合、runAllTimersを使ってしまうと無限ループになるのでその時はrunOnlyPendingTimersを使って1つずつ進めながらテストを書いていきます。

っていう事で検証してみた

jestを使ってReact.jsなスクリプトをテストする

2015-04-11T12:00:00+09:00 JavaScript React.js

公式ドキュメント: https://facebook.github.io/jest/docs/tutorial-react.html

参考: http://qiita.com/koba04/items/2f97904b3ca247fc1917

参考資料1: https://facebook.github.io/react/docs/test-utils.html

参考資料2: https://facebook.github.io/jest/docs/mock-functions.html

React.jsで書かれたコンポーネントをjestを使ってテストしてみる。ただそれだけ

jestの__mocks__ディレクトリに関して

2015-04-11T00:00:00+09:00 JavaScript

前回のjestを使ってReact.jsなコンポーネントをテストするネタを書いたけど、その最後に_mocks_を使うとモック化されるオブジェクトを意図的に別のに差し替えるような事が可能らしいとの事でやってみた

react-router

2015-04-01T00:00:00+09:00 JavaScript React.js

react-routerを使ってみた。

※React.jsな構成の考え方とかとりあえず反映せずにざらーって書いてるので(ry

※やたらと長い上に書いた本人以外わかりづらいと思うので公式ドキュメント読んだ方が良い

chrome.gcm

2014-10-24T00:00:00+00:00 Chrome Extension JavaScript Java

参考1: https://developer.chrome.com/apps/cloudMessaging

参考2: http://docs.monaca.mobi/3.5/ja/manual/backend/push_config/gcm/ (※主に設定の有効の仕方等)

ちょっと前にはchrome.pushMessagingっていうAPIが公開(って言っても一年以上前)されてたはずなのですが、現在これがどうもlegacy扱いになっている模様で現在はchrome.gcmを使うのが良いっぽそう。確かpushMessagingの方はwebstoreを経由してインストールしたアプリで無いと使えないのかどうかまでは覚えてないが、gcmはcrxパッケージングした拡張であれば使う事が可能らしい

っていう事でやってみた

※おそらくはChrome Sync(ChromeでのGoogleアカウントのログイン機能)をやっておかないと出来ないのかも知れない

directiveのmultiElement

2014-07-25T00:00:00+00:00 angular.js JavaScript

<!DOCTYPE html>
<html ng-app="sample">
  <head>
    <script src="https://code.angularjs.org/1.3.0-beta.16/angular.js"></script>
    <script src="app.js"></script>
  </head>
  <body ng-controller="SampleCtrl">
    <div directive1-start></div>
    <div directive1-end></div>
  </body>
</html>

みたいなのがあった場合において

ng-directiveのscope

2014-07-20T00:00:00+00:00 angular.js JavaScript

参考: AngularJSのdirectiveとは

<html ng-app="sample"
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.14/angular.min.js"></script>
    <script src="main.js"></script>
  </head>
  <body>
    <div ng-controller="SampleCtrl">
      <h4>controller: {% raw %}{{message}}{% endraw %}</h4>
      <div directive1>
        <h4>directive1: {% raw %}{{message}}{% endraw %}</h4>
        <div directive2>
          <h4>directive2: {% raw %}{{message}}{% endraw %}</h4>
        </div>
      </div>
    </div>
  </body>
</html>

っていうのに作ったng-directiveに対してscopeを設定するかしないかで何が変わるのか検証してみた

スクロールによるページング処理に関して#2

2014-07-13T00:00:00+00:00 JavaScript

参考: 要素が画面上に見えているかどうかを調べる

jquery.inview: https://github.com/protonet/jquery.inview

スクロールによるページング処理に関してではスクロールして末尾に達したら問答無用でロードを実行するような仕組みになっているけど、要素が見えているかをチェックしたりする事も一応出来るし、それをサポートするjQueryプラグインも存在する

※上記のinviewとか以前に検証したjQueryで特定のセレクタとかが見えているに対してなんかするやつとか

っていう事でちょいとやってみた(inviewとかを使わずに参考のを見つつ)

scope.$evalで引数を設定する方法

2014-07-02T00:00:00+00:00 angular.js JavaScript

参考: https://docs.angularjs.org/api/ng/service/$parse

angular.jsでng-initのような式評価を使う」の続き的な所として、scope.$eval(attrs.ngCall)をすればng-initのような式評価で実行させる事が出来るっていうのは前回で書いたが、例えばそのngCallで呼び出される$scope等に定義した関数等の場合に引数にdone等のようななんらかの処理を完了させるようなコールバックを引数に渡せるようにしたいとかっていう要件な場合な件を調査してみた

angular.jsをやってみる (24) - ng-non-bindable -

2014-05-12T00:00:00+00:00 angular.js JavaScript Ruby Rails

参考: AngularJSとサーバーサイドテンプレートの混在とngNonBindable

※上記の参考を必読することをオススメ

上記参考にも書いてるのですが、例えばクエリーなどにおいてangular.jsが処理されるような記法なクエリーが含まれているとXSSになるっていう話があるのですが、実際自分でやってみた。

※実検証はRails4を使ってやった

angular.jsをやってみる (20) - $q -

2014-04-10T00:00:00+00:00 angular.js JavaScript

公式リファレンス: http://docs.angularjs.org/api/ng/service/$q

以下の例だと非常に微妙なんだけれども、例えば

var Sample = (function() {

  var values = ["hoge", "fuga", "foobar"];

  function Sample() {
  }

  Sample.prototype.getName = function(cb) {
    setTimeout(function() {
      var index = Math.floor(Math.random() * values.length);
      cb(values[index]);
    }, 1000);
  }

  return Sample;

})();

なんていうのがあった場合に

angular.module("app", [])
  .factory("SampleFactory", function() {
    return {
      getName: function() {
        var name;

        var sample = new Sample();
        sample.getName(function(value) {
          name = value;
        });

        return name;
      }
   };
  })
  .controller("SampleController", function($scope, SampleFactory) {
    $scope.name = SampleFactory.getName();
  });

だなんてやってもSampleFactory.getNameで返される値はundefinedにしかならない。そりゃその値が返される際にまだコールバックが発生していないのでname変数は初期化すらされずundefinedになるっていうオチ

んまぁこういうパターンだと別にfactoryしなくても良いケースなので分かりづらいけど、要は非同期処理等が行われるにあたって、それが完了した際に通知するような仕組みを利用しなければ正常に値が取得できないような場合には$qなDeferredオブジェクトを利用する事で可能っぽい。っていう事で$qを使って上記コードを書き換えると

angular.jsをやってみる (19) - 動的に追加したエレメントに対して$animate.enter -

2014-04-08T00:00:00+00:00 angular.js JavaScript

公式リファレンス: http://docs.angularjs.org/api/ngAnimate/service/$animate

例えばクリックイベントによりノードを追加したりするにあたって、ngAnimateなアニメーションを利用したい場合とかに$animate.enter等を利用する事で出来るっぽいのでやってみた

とりあえず、わかりやすい例としては画面上に通知的なのを出す。それをクリックイベントにてエレメントを追加し$animateを使ってfadeIn/fadeOutなアニメーション的な事をする

angular.jsをやってみる (18) - $emit -

2014-04-06T00:00:00+00:00 angular.js JavaScript

前回のangular.jsをやってみる (17) – $broadcast -の続き。$broadcastと$emitを同時に書くとごちゃごちゃになる気がしたので分けた次

で前回で$broadcastはそれを実行したスコープから下への子孫内スコープのイベントをfireするっていう形だったのですが、$emitはその逆というか自身のスコープから親のスコープへのイベントをfireするっていう事な模様

という事でやってみた

angular.jsをやってみる (17) - $broadcast -

2014-04-04T00:00:00+00:00 angular.js JavaScript

公式リファレンス: http://docs.angularjs.org/api/ng/type/$rootScope.Scope

※ややこしいので公式リファレンス読むかググった方が良い

node.jsのEventEmitter的なのという説明が正しいかは知らないけど、そんな感じでイベント通知による処理を促したり出来る模様。で今回は$broadcastのみ。$emitは次回(ややこしいので)

angular.jsをやってみる (15) - ngAnimate -

2014-04-02T00:00:00+00:00 angular.js JavaScript

参考: AngularJSでちゃちゃっとアニメーションを試す - AngularJS Ninja

公式リファレンス: http://docs.angularjs.org/api/ngAnimate

んまぁ名前からしてCSS3?なアニメーションな機能をサポートするものっぽい。単純にng-repeatしている部分なエントリーをフィルターし、出る際にフェードインさせたり、消えたりする際にフェードアウトさせたりをやってみる

angular.jsをやってみる (14) - $scope.$apply -

2014-03-31T00:00:00+00:00 angular.js JavaScript

参考: AngularJS のデータバインドを支える $apply

公式リファレンス: http://docs.angularjs.org/api/ng/type/$rootScope.Scope

angular.jsにある$httpを使ってXHRするようなケースパターンだと$applyは内部的に行われているらしいので必要ないらしいのですが、$httpを使わずに独自でXHRを使ってHTTPリクエストを行いレスポンスを取得して結果をビューにバインドしたいようなケースの場合には$applyをしないとデータバインドが正常に行われない模様。というか行われないではなくてされてはいるけど、それが反映されない状態になってるだけなのかなと

という事でやってみた。ちょっと前に書いてたTwitter APIを使ったChrome拡張なやつでangular.jsを使ってはいるが$httpを使ってないケースなのでこれがちょうど良いのではと

angular.jsをやってみる (13) - $sceとngSanitize -

2014-03-28T00:00:00+00:00 angular.js JavaScript

※ややこしいので公式ドキュメント読んだ方がいい

<div ng-controller="SampleController">
  <span>{% raw %}{{message}}{% endraw %}</span>
</div>

的な感じになってて

angular.module("app", [])
  .controller("SampleController", function($scope) {
    $scope.message = '<span style="color: red">hoge</span>';
  });

みたいにすると、$scopeとかに含まれるHTMLとかはエスケープされて出力されるらしい

Spring WebMVCをやってみる (10) - gsonを使う -

2013-12-15T00:00:00+00:00 Java Spring Framework JavaScript

例えば

  • @ResponseBodyアノテーションがついてるメソッドでStringじゃなくてオブジェクトだとかをぶん投げたりとか
  • @RequestBodyアノテーションがついてるメソッドの引数でStringじゃなくてオブジェクトだとかを指定したりとか

っていうケースな場合にJSONで投げられる事を前提とするのであれば、MessageConverterな方式を利用する事でサポート出来るらしいのでやってみた

angular.jsをやってみる (2) - $interpolateProvider -

2013-10-22T00:00:00+00:00 angular.js JavaScript

{% raw %} angular.jsで$interpolateっていう機能を使う事で{{ model.name }}っていうのが評価されて出力されるわけだけど、デフォルトではstartSymbolが{{で、endSymbolが}}っていう事になってる。$interpolateProviderを使うことでこの設定を変える事も出来る模様 {% endraw %}

Rails assets pipeline

2013-10-08T00:00:00+00:00 JavaScript Ruby Rails

何やらRailsを使っててJavaScriptとかをgemとかで配布してRailsプロジェクトに組み込んだりするっていうのがあったりするわけで。例えばTwitter BootstrapのCSSとかJSとかをGemfileにそういうgemを定義する事でサクッと出来るっつー訳。でその仕組み的なのがRails assets pipelineっていうのかなと、これCoffeeScriptとかならコンパイルして使えるようにする事も出来るらしいとの事(今回はやらないけど)

とりあえずこの仕組みを使ってangular.jsなプロジェクトを別にしてRailsプロジェクトに組み込むっていう事をしてみる

angular.jsのkarmaを使ったテスト

2013-09-10T00:00:00+00:00 angular.js JavaScript

AngularJSなコントローラーとかの単体テストに関しては

describe("...", function() {
  it("...", function() {
    var scope = {};
    var controller = new SampleController(scope);

    // 以下省略
  });
});

的な事が http://docs.angularjs.org/tutorial/step_02 には既に書いてあるから良いんだけど、で実際HTMLと組み合わせて処理とかをテストするにはどうすれば良いのかがこのセクションの次に書いてあるe2eテストっていう方式を採用すれば出来るらしい。んまぁそういう事じゃないような気もするのだけど

んまぁとりあえずやってみたんでレポート

yuidocでアンダースコア(アンダーバー)を使うと消える件

2013-03-18T00:00:00+00:00 JavaScript

var Sample = (function() {

  /**
   * @class Sample
   * @constructor
   */
  function Sample() {};

  /**
   * @method getUser
   * @return {Object} current user by localStorage(sample_current_user)
   */
  Sample.prototype.getUser = function() {
    return localStorage.getItem("sample_current_user");
  };

  return Sample;

})();

みたいなコード及びyuidocなドキュメントアノテーション?を書いた状態でyuidocすると

「mocha-phantomjs+jscoverageでコードカバレッジ出力」な流れをgruntに移植する

2013-03-17T12:00:00+09:00 grunt JavaScript

今までは

jscoverage lib
mocha-phantomjs -R json-cov test/runner.html | json2htmlcov > coverage.html

な感じなのを普通に実行してカバレッジを出力していた。こういうのもどうかと思うので、最近というかちょっと前だと思うけどGruntっていうNode.jsベースなビルドタスクツールな感じなので移植してみた

Backbone.jsを始めてみる

2013-02-22T00:00:00+00:00 Backbone.js JavaScript

タイトル通り、以前から勉強しようと思ってたBackbone.jsを始めてみる事に。でこれどう説明すれば良いのかが微妙だけど、「RESTful WebアプリケーションのためのJSサイドのMVCフレームワーク」的な感じかなと。一応色々機能があって(ry

とにかく、 http://backbonejs.org を読みつつ進めてみる

zombie.js

2013-01-28T00:00:00+00:00 JavaScript Node.js

※defunctじゃないよww

以前にsodaを使ってJavaScript UI Component?な所をシステムに結合した状態でテストするっていうのをやったんですが、sodaをやる前からzombie.jsっていうのがあるのは知ってたんですがやらず嫌いなのもどうもなっていう事で使ってみた。要件はまったく同じでJavaScriptなイベントが実行されるリンクをクリックしたりして検証してみたりしてみる

mongodbを使ってみる (7) - MapReduce -

2013-01-17T00:00:00+00:00 JavaScript MongoDB

MongoDBにもれなく付いてくる(笑)MapReduceを使ってみる。ただ使っても面白くないので

  • fluentdを使ってnginxのアクセスログをtailする
  • fluentdでパースされたアクセスログをfluent-plugin-mongoを使ってMongoDBにプッシュする
  • MongoDB MapReduce APIを使って、アクセスカウント統計を作る

という流れで

node.jsでdocument/window依存なスクリプトをグダる (2)

2013-01-14T00:00:00+00:00 JavaScript Node.js

node-jqueryがwindowなグローバルがあればXMLHttpRequestをロードしてくれるっていう事実が発覚したのですが

それは置いといて、node vm contextな扱いとかでrunnerなJS作ってnode.jsでjQueryを扱うテストとか色々出来ないかなーっと模索しているのですが、とりあえずやってみた(但し、QUnitとか除外)

node.jsでdocument/window依存なスクリプトをグダる

2013-01-13T00:00:00+00:00 JavaScript Node.js

例えばJavaScriptなUIコンポーネントというかなんかを書いて、それをテストする際にはQUnitだとか、操作エミュレーションではSelenium使ったりすると思うのですが。でnode.jsを使ってdocumentやwindowに依存するスクリプトを実行する場合どうするかって話。んまぁ要件により様々だとは思いますけど

でnode.jsのモジュールでjsdomっつーのがあって、それを利用してあーだらこーだらできねーかなーって思って色々やってみた

Chrome Extension開発を勉強してみる (22) - chrome.alarmsを使う -

2012-12-16T00:00:00+00:00 Chrome Extension JavaScript

Chrome Extensionで定期実行処理をやる場合だとchrome.alarmsを使う方が良い模様(理由はEvent Pagesに関係する模様。これに関しては後日)

でchrome.alarmsはバージョンによってはexperimentalになってたりする。例えばUbuntu12.04でChromiumだとchrome.alarmsはexperimentalでChromeだと正式で使用できる。又、ChromiumとかだとperiodInMinutesが使用できないとか色々あるみたいで

ということでminumum_chrome_versionを23辺りに設定して使う

Google API Client Library for JavaScriptを使ってAnalytics APIに接続するメモ

2012-09-05T00:00:00+00:00 JavaScript

ちょっと要件があって色々調べてました。そのメモなんですが、Google APIsの認証方式ってOAuth2だと思うのですが、OAuth2のRefresh Tokenだとかそういう所に関しては今回はノータッチです

でまるっきりやってる事は https://developers.google.com/analytics/resources/tutorials/hello-analytics-api と同じです。なので「英語ドキュメントなんて楽勝だぜ」ていう方はこの記事を読まない方が良いです

Native Client(NaCl)をやってみる (4) - dlopen(dlfcn.h)を使う -

2012-08-26T00:00:00+00:00 C JavaScript Native Client

Native Clientのデモにはdlopenっていうのが入ってるのですが、これを単純にやってみる。っていってもこれをそのまま動かすんじゃなくて、作ったtest.cをlibtest.soにして、それをNative Clientから使う(恐らくはNative Client環境のコンパイラを使わないと動かせれないんだと思われる。検証してないけど)

Slim3でrespond_toもどき

2012-08-19T00:00:00+00:00 Java JavaScript

IndexController.java

package server_director.controller.profile;

import org.slim3.controller.Navigation;

import server_director.controller.ServerDirectorController;
import server_director.model.Profile;
import server_director.service.ProfileService;

import com.google.appengine.api.users.User;

public class IndexController extends ServerDirectorController {

    ProfileService service = new ProfileService();

    @Override
    protected Navigation run() throws Exception {
        User user = service.getUser();

        if (!service.isLogin() || user == null) {
            return redirect(service.createLoginURL("/profile"));
        }

        Profile profile = service.getProfile();

        requestScope("profile", profile);

        return forward("/WEB-INF/jsp/index.jsp");
    }
}

まぁてな感じで継承しているクラス以外は普通のSlim3コントローラークラス。もちろんコントローラー側でJSONに変換したりっていう処理は含まれない(あるがJSONに変換する処理自体はModelに。それは以下参照)

Native Client(NaCl)をやってみる (2) - NativeClient側でメッセージ受信 -

2012-07-15T12:00:00+09:00 C JavaScript Native Client

前回のはNative Client側からメッセージングでデータを送信して、それをNative Clientを使ってる側から受信するっていうのをやりました。今度はそれを双方向性にしてみようと思います。まぁ単純に

  • Native Client側からHTML側にデータを送る
  • HTML側からNative Client側にデータを送る (で受け取ったらデータをHTML側に送る)

Chrome Extension開発を勉強してみる (6) - Page Action -

2012-07-13T00:00:00+09:00 Chrome Extension JavaScript

ページアクションを使ってみる。ページアクションって何なの?として

てな感じでURLバーの右側に付けられるアイコンをクリックする事でポップアップなページを出せる事が出来る模様。但し、グローバルに常に出すような場合にはページアクションではなくブラウザアクションを採用するのが正しい模様。とりあえず上記の[S]なアイコンが出せるまでをやってみる

Chrome Extension開発を勉強してみる (3) - 右クリック拡張でTwitter intent -

2012-05-31T00:00:00+00:00 Chrome Extension JavaScript

実際に使ってるのを例に書いてみる

要件

見ているWebサイトをTwitterのツイートフォームにタイトルとURLをツイートするのを支援する拡張機能。方式として右クリックメニューに拡張アプリのアイコンと名前を出してそれを選択する事で新しいタブにてツイートフォームのページを表示させる。サイトによっては共有ツールが無い場合があり、サイトをツイートしたりするのが何かとめんどくさいので(以前に)作ってみた

Node.jsのrequire.cache

2012-05-07T00:00:00+00:00 JavaScript Node.js

Node.jsのrequireは読み込んだ後にその.jsファイルをキャッシュするような事は以前書いた。でこれ不都合な場合もある。それが「テストケース時にモジュールのprototypeを意図的に書き換えた場合にその後のテストケースにも影響する」っていうところがあるようで。

Node.jsのrequire

2012-05-03T00:00:00+00:00 JavaScript Node.js

  • requireで参照された場合に特定の処理を行わない
  • nodeコマンドによるスクリプト実行だと通常どおり処理を行う

というもの。なぜこういうのが必要になったのかと言うと、単純に実行を行うスクリプトとそれに伴うオブジェクト定義等を行うスクリプト(module.exportsする)を分けてしまえば良いだけの話になるのだけど、それをする為だけにわざわざスクリプト別にするという明らかにめんどくさい事の必要性ってないよねって思う所。んで、そうすると「じゃあこれどうやって単体テストするの?」って話になるわけで。なので1と2で処理を分ける、つまりrequireをした時は特定の実行コンテキストに及ぶ処理は行わない、そうする事でオブジェクト定義側を単体テストで流し込む事が出来るでしょうと。じゃあそれNode.jsでどうやるのって話。ドキュメントにそれらしいのがある

http://nodejs.org/docs/v0.6.15/api/all.html#all_accessing_the_main_module

「require.main === module」とい式自体がnodeコマンドにより実行された場合はtrueで、逆にrequireを使って処理された場合はfalseになるっぽい。という感じでやれば良いらしい。という事でテスト的に書いてみると

jQuery.bindの引数

2011-12-04T00:00:00+00:00 JavaScript jQuery

jQueryを使ってリンクを作ってonclickイベントを発生させたい場合にはbindを使えば良いけど、このイベントにデータを引き渡したい場合には第2引数にJavaScriptのObject型を渡して第3引数側にfunctionを指定する。そのfunctionの引数にはEventなObject型を持つ