• HTML5 History API を徹底的に試してみる

    History APIとは

    History APIはHTML5の機能のひとつで、ブラウザの戻る進むボタンのイベントを取得してページの内容を動的に変えることができるものです。なかなか便利な機能ではあったのですが、ちょっとつまずきポイントが多く、癖もかなりあるっぽいので徹底的に試してみようと思います。

    スタック

    ブラウザの履歴の一つ一つの記録をスタックといい、一つ履歴が増える度にスタックが増える。そしてHistoryAPIを使うとこのスタックをページ推移を行わなくても増やすことができます。

    HistoryAPIによってスタックが増えた場合は、ブラウザの戻るボタンを押してもページ遷移が発生せず、何も起きない。それがHistory API。

    スタックの追加

    スタックを追加するには、このようにやります。

    history.pushState("hoge", null, "/hoge");Code language: JavaScript (javascript)

    これで、履歴が一つ分増えます。これを実行すると、ブラウザの戻るボタンを一度押しても何も起きません。(ページ推移が発生しません)
    しかし、二回ボタンを押すといつもどおりページ推移が発生します。

    しかし、このhistory.pushStateを使う前に必ず

    history.replaceState("index");Code language: JavaScript (javascript)

    とします。

    これをすることでGoogle Developer Tools もしくは Firebug上で

    history

    と入力し、エンターを押すと、historyオブジェクトが見えるので、historyオブジェクトを展開し、stateプロパティを確認すると、そこがindexになっていることが確認できます。

    必ずこれをやっておかないとめんどくさいことになります。

    ブラウザの戻る・進むイベントを監視する

    jQueryを使っていますが、jQueryの場合はこのように書くことでイベントが実装できます。

    $(window).on("popstate", function(_event){
        var state = _event.originalEvent.state;
        console.log("_event", _event);
        console.log("state", state);
    });Code language: JavaScript (javascript)

    これをソースコード内に記述して、

    history.pushState("hoge", null, "/hoge");Code language: JavaScript (javascript)

    を実行して、ブラウザの戻るボタンをクリックします。

    Google Developper Tools または Firebugのコンソールで確認すると、 state がindexになっていることがわかります。

    これがハマりポイントでした。最初に history.replaceState(“index”); をしたことで、index と表示されたわけですが、これをやらないとここが、 null になってしまいます。

    最初このstateの値は hoge になるものだと思っていたのですが、実はそうではなく、戻るページに設定されているstateらしいです。

    構造的には「index -> hoge」 という構造になっています。

    このあたりがややこしいので注意が必要です。

    Tips

    History APIは基本的に以上の仕組みさえ理解すればそれだけですんなりと使えますが、他にも覚えておくと便利な点をあげておきます。

    history.state

    現在のstateを確認できます。indexなのかhogeなのか。

    history.back()

    これを実行するとブラウザを戻ります。ページ内に戻るボタンを設置する場合はこのメソッドを使用します。ただ、対応していないブラウザもあるので機能を切り分ける必要があります。

    history.forward()

    これを実行するとブラウザを進みます

    history.go(num)

    指定した履歴へジャンプします。

    history.length

    現在の履歴の数を表示します

    location.pathname

    現在のドメインを覗いたディレクトリパスを取得します

    location.search

    現在のURLの?の後ろのパラメータを取得します

  • 個人情報を持たないWebサービスの設計

    Webサービスを作るにあたってどうしても考えなければならないのが、個人情報の取り扱いについて。メールアドレスや名前をもらっただけでもそれだけでも個人情報になるし、IDやパスワードを与えても個人情報になる。Webサービス自体はとてもおもしろいものなのに、信頼できないサイトだった場合使ってくれないこともしばしばある。

    このめんどくさい個人情報の取り扱いをなんとかしてパスする方法はないものかとこの記事では考えてみることにする。

    個人情報とは何か

    Webサービスを作るにあたって最低限必要なものを上げてみる。

    • お名前
    • メールアドレス
    • ID
    • パスワード
    • セッションID

    最低限、このくらいは必要になるだろう。最後のセッションIDというのは、今ログインしているかどうかを判断するのに使う。クッキーで保持されているもののことです。

    では、この5つの項目をパスすれば、個人情報をもたないWebサービスを作ることができるのではないかと考えてみる。

    コンセプト

    そもそもなぜ個人情報が必要なのかというと、自分専用のページを持つということにつきると思う。マイページ。Webサービス上で自分という存在をアピールすることができることがどんなWebサービスにおいても共通解であると思う。例えば、はてなブックマークも自分がはてブしたりすることで、そのWebページに対してコメントを書き加えられる。チラ裏みたいなことができる。

    そういったものを提供できなくては、Webサービスとして成り立たないのではない。だけども、それをやってしまうと個人情報を持つことになる。ではどうすべきか・・・、はい、考えました。

    限定公開URLという考え方

    ユーザーに対してあなた専用のページを与えるのではなく、URLさえ知らなかければ誰もアクセスできないページを提供するということです。IDやPWなどは一切必要とせず、その限定公開URLをユーザーに対して提供する。しかも、仕様上何個でも限定公開URLを発行できる。ボード

    誰にもURLさえ教えなければ、それを自分専用に使うこともできるし、他の人に共有することもできる。

    限定公開URLにとどまらない

    しかも、URLに限定することも実はなくて、「アイデンティケーションコード」を一つだけ持っていればそのコードに対してAPIによってPOSTしたりGETしたりすることによって、例えばChrome拡張にそのコードを登録するだけで、使えるようなサービスが運用できる。ちなみに、アイデンティフィケーションはIDの略なので、IDCODEという意味になってしまうが、ここはIDとは差別化したいのでそう呼ぶことにした。

    ボード

    この限定公開URLによって運用するWebサービスのことをこの記事では以下「ボード」と呼ぶことにします。限定公開URLがひとつのボードとして提供されるという意味からです。

    問題点

    ただ、ボードを提供するにあたって問題点となるのはやはり、限定公開URLなのにもかかわらず、第三者によって傍受されてしまう危険性があるということ、なので日記サイトとか、個人情報に密接に関わりそうそうなWebサービスはできるだけ避けたほうがいい。HTTPSを使わない場合は、更にそのリスクが高まる。

    ではどんなWebサービスがいいのか

    診断メーカーなどは、名前(ニックネーム)を入力するだけですぐに結果がもらえる。そういったWebサービスであれば、個人情報を持つリスクが最小限に抑えられる。

    OAuthというやり方も

    実はHTTPSを使わくてもある程度個人情報を保護できるやり方があり、OAuthを使ってログインすると、限定公開URLを使わなくてもある程度安全なWebサービスを運用できる。診断メーカーもそのうちの一つ。

  • プロジェクト管理ソリューション「JIRA」を試す

    前から気になっていたプロジェクト管理ソリューションJIRAを試してみようと思います。プロジェクト管理と言えばRedmine等のBTSとかリポジトリ管理とかそんなかんじのものを思い浮かべますが、JIRAもそれと同じようなものであるようです。

    しかも高機能な上に、他のプロジェクト管理ツールからチケットをインポートできる機能も併せ持つ今話題のプロジェクト管理ツールだということですから、これは見逃せません。しかも安い。

    というわけで使ってみた。

    お試しということで体験版をダウンロードします。

    # ダウンロード先
    http://www.atlassian.com/ja/software/jira/download
    
    cd /usr/local/src/
    wget http://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-5.2.4.tar.gz
    tar zxvf atlassian-jira-5.2.4.tar.gz
    cd atlassian-jira-5.2.4-standalone/Code language: PHP (php)

    中身を見てみる

    .
    ├── NOTICE
    ├── README.html
    ├── README.txt
    ├── atlassian-jira
    ├── bin
    ├── conf
    ├── external-source
    ├── lib
    ├── licenses
    ├── logs
    ├── temp
    ├── tomcat-docs
    ├── webapps
    └── workCode language: CSS (css)

    README.txt があるので vim で開いてみます。

    vim README.txtCode language: CSS (css)
    BRIEF INSTALL GUIDE
    -------------------
    
    1. Install Oracle's (formerly Sun's) Java Development Kit (JDK) or
       Java Runtime Environment (JRE) version 1.6 or above:
    
       http://www.oracle.com/technetwork/java/javase/downloads/index.html
    
    2. Set the JAVA_HOME variable to where you installed Java. The Windows
       and Linux installers will do this for you. See the following instructions
       for details:
    
       http://docs.atlassian.com/jira/docs-052/Installing+Java
    
    3. Set your JIRA Home Directory.
       Instructions on how to set your JIRA Home Directory can be found here:
    
       http://docs.atlassian.com/jira/docs-052/Setting+your+JIRA+Home+Directory
    
    4. Run 'bin\\start-jira.bat' (for Windows) or 'bin/start-jira.sh' (for Linux/Solaris)
       to start JIRA. Check that there are no errors on the console. See below for
       troubleshooting advice.
    
    5. Point your browser at http://localhost:8080/
       You should see JIRA's Setup Wizard.
    
    Full documentation is available online at:
    
    http://docs.atlassian.com/jira/docs-052/Installing+JIRACode language: PHP (php)

    なるほど・・・。これは敷居が高そうだ・・。
    とりあえず1番から進めていきます。

    JREのインストール

    JIRAを動かすにはJavaが必要なので、 ここからJDKかJREをダウンロードします。私はJDKを選択しました。

    そしてインストール

    tar xzvf jdk-7u10-linux-x64.gz
    cd jdk1.7.0_10/
    mv jdk1.7.0_10 /usr/local/
    vim $HOME/.bashrc
    
    # 追加
    export  PATH=/usr/local/jdk1.7.0_10/bin:$PATH
    
    #vimを保存して終了し、実行
    export  PATH=/usr/local/jdk1.7.0_10/bin:$PATH
    
    Code language: PHP (php)

    ここまでやって、javaを実行できるか確認します。

    java -version
    java version "1.7.0_10"
    Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
    Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)Code language: CSS (css)

    これでjavaが実行できるようになりました。

    JAVA_HOMEを定義

    echo JAVA_HOME="/usr/local/jdk1.7.0_10/" >> /etc/environment
    JAVA_HOME="/usr/local/jdk1.7.0_10/"
    echo $JAVA_HOMECode language: PHP (php)

    を実行して、環境変数にJAVA_HOMEを定義します。

    実行

    cd atlassian-jira-5.2.4-standalone/
    bin/start-jira.sh

    これでもう実行できるようです。

    JIRAへアクセス

    http://localhost:8080/

    へアクセスします。

    なんかでてきた

    スクリーンショット 2013-01-03 7.29.43

    どうやらJIRAのホームディレクトリがないというエラーのようです。JIRAのホームディレクトリを指定するには環境変数としてJIRA_HOMEを定義してやればいいようです。

    echo JIRA_HOME="/home/nocturne-project/JIRA/" >> /etc/environment
    JIRA_HOME="/home/nocturne-project/JIRA/"
    echo $JIRA_HOMECode language: PHP (php)

    環境変数の設定が完了したら、一度JIRAのプロセスをキルします。

    ps aux | grep JIRA
    kill (JIRAのpid)

    あらためて実行

    スクリーンショット 2013-01-03 7.41.26

    おお!来ました!

    データベースの選択では、とりあえずお試しなので内部を選択しました。この操作には少し時間がかかります。

    アプリケーションの設定

    スクリーンショット 2013-01-03 7.43.33

    評価ライセンスの発行

    スクリーンショット 2013-01-03 7.45.51

    アンケートが求められる

    スクリーンショット 2013-01-03 7.46.42

    管理者アカウントの登録

    スクリーンショット 2013-01-03 7.48.08

    送信メールサーバーの設定

    スクリーンショット 2013-01-03 7.49.05

    ようこそ画面

    スクリーンショット 2013-01-03 7.49.57

    ダッシュボード

    System Dashboard - test

    プロジェクト管理画面

    Demonstration - test

    これには驚きました。メニュー部分がAJAXの非同期読み込みで、ぬるぬる画面が切り替わります。
    スクリーンショット 2013-01-03 7.52.57

    課題作成画面(チケット作成画面)

    スクリーンショット 2013-01-03 7.54.09
    なんとモーダルウィンドウ!

    スクリーンショット 2013-01-03 7.56.29

    スクリーンショット 2013-01-03 7.54.09
    課題(チケット)の作成は非同期通信で一瞬で終わる。早い!

    課題リスト(チケットリスト)

    スクリーンショット 2013-01-03 7.58.16
    見て分かる通り、検索結果のフィルタは保存できる機能がすごい!

    スクリーンショット 2013-01-03 7.59.33
    ネジマークをクリックすれば、各チケットにダイレクトに状態の変更が可能!

    課題のクローズ

    スクリーンショット 2013-01-03 8.00.33スクリーンショット 2013-01-03 8.00.42

    課題のクローズもほんの一瞬で終わる。

    一目瞭然なチャート

    スクリーンショット 2013-01-03 8.01.41
    まだあまり課題を登録していないのでわかりずらいですが、課題数ベースで作成した課題と完了済みの課題との比較チャートです。一目均衡表の雲のようです。

    誰の作業量が一番多いのか、少ないのかわかる課題画面

    スクリーンショット 2013-01-03 8.03.43
    この機能こわいですね。作業量ベースで差が丸見えというか・・。力を魅せつけられるというか・・。

    プラグインの導入

    スクリーンショット 2013-01-03 8.06.26

    gitプラグイン(有料)

    スクリーンショット 2013-01-03 8.09.27
    これはマイナスポイントかなぁ・・。デフォルトではCVSだけなのかなリポジトリ管理は。

    スクリーンショット 2013-01-03 8.12.02
    あれっ・・コミットしてたはずなのですが・・・。

    まとめ

    メリット

    • AJAXによる非同期読み込みで画面遷移をほとんど発生させずストレスのない挙動
    • 非プログラマな職の人でも使いやすい。直感的でわかりやすい
    • グラフが見やすい
    • 進捗管理しやすい
    • 他の人の作業状況が把握しやすい
    • シンプル
    • プラグインが簡単にいれられる
    • 最初のインストールが少しむずかしいが、インストールさえできれば簡単

    デメリット

    • リポジトリ管理がヒドイ
    • シンプルすぎて細かいところに手がとどいてない感じがする
    • バージョンやマイルストーン・・・どこ・・?
    • やっぱりバーンダウンチャートがほしい
    • RedMineのTime Trackerプラグインには勝てない
    • Redmineのチャートプラグインのほうが高機能

    追記(2013/07/20)

    JIRAのの最新版では下記の機能が追加されていました。かなり使えるようになっており、RedMineを超えているかもしれません。

    • マイルストーン(バージョン管理)
    • bitbacket連携によるgitの利用(5userまで無料)
    • TEMPOプラグインによるタイムトラッキング機能(1000円買いきりの機能)