Hatena Developer Blog

はてな開発者ブログ

はてなサマーインターン2013の募集を開始しました!

はてなサマーインターン2013の募集を開始しました。コースは、はてな独自のWebサービス開発手法/技術を体験する「Webサービス開発コース」と、サービスの改善に繋がる基盤技術の開発/研究に取り組む「大規模システムコース」の2つです。

対象は2014年3月以降に卒業予定の高専生、大学生、大学院生です。募集の締め切りは2013年6月16日(日)です。はてなのサービスに興味があり、Webエンジニアとして働いてみたいという学生の皆様からのご応募をお待ちしています。

はてなサマーインターン2013の詳細は、募集ページよりご確認ください。

概要

  • 募集締め切り
    • 2013年6月16日(日)24時(日本標準時)
  • 開催日程
    • 2013年8月12日(月)~9月6日(金)(平日のみ 全20日)
  • 会場
    • はてな 京都本社(京都市中京区)
    • ※遠方から参加される方にはインターンシップ期間中、弊社から徒歩圏内に宿泊先を用意します。また、京都までの往復交通費は(上限25,000円)はてなが負担します。

過去のサマーインターンの様子

前回までのサマーインターンの様子は、年別に以下のブログやページにまとめています。参加者が取り組んだ内容や感想などを盛り込んでおりますので、ぜひご覧ください。

「はてなサマーインターン2013」を開催します

今年も学生を対象としたエンジニア向け「はてなサマーインターン2013」を開催します。開催時期、応募方法などの詳細は5月上旬をめどにこのブログで発表します。参加を考えている方は、以下のリンク先にあるフォームからメールアドレスを登録していただくと、案内のメールをお送りします。

エンジニア向けはてなサマーインターンとは

2008年より毎年開催されているインターンシッププログラムです。Webサービス開発者としての技術を身につけ、実際にはてなのサービス開発を行う、実践的な内容となっています。
過去のはてなサマーインターンについては以下のリンクをご覧ください。
http://www.hatena.ne.jp/company/staff/intern

うごメモはてなの情報取得APIを公開しました

※追記 (04/12 19:30): うごメモはてな情報取得APIの公開を終了しました
※追記 (05/07 20:00): 再提供に伴って最新のAPI情報に合わせて修正しました

こんにちは、id:nitro_idiot です。
本日、うごメモはてなの様々な情報を取得することができるAPIを公開しました。

提供は2013年5月31日のうごメモはてなのサービス終了をもって終了しますが、ユーザ様により自由な形でのデータ保管ができるよう開発・公開しました。

このAPIでは以下の情報を取得することができます。

作品情報
作品の作者や親作品情報、スターなどの評価の数や、FLV・アニメーションGIFのURIなどを取得できます。
ユーザの作品
ユーザが投稿したすべての作品の情報を取得できます。
お気に入り作者
ユーザがお気に入りしているユーザ情報を取得できます。
ファン
あるユーザをお気に入りしているユーザ情報を取得できます。
作品のコメント
ある作品に投稿されたすべてのコメントを取得できます。
うごレター受信箱・送信箱一覧
自分の受信箱・送信箱に入っているうごレターの情報を取得できます。
スター
作品・コメントについたスターの情報を取得できます。

すべてJSON形式で結果を返すので、お好きなプログラム言語をお使いいただけます。

詳しくはHatena Developer Centerの以下のページをご覧ください。

サンプルコード

以下はユーザ情報を取得する各言語でのサンプルコードです。

Perl
use utf8;
use LWP::UserAgent;
use JSON::XS qw(decode_json);

binmode(STDOUT, ":utf8");

my $ua = LWP::UserAgent->new;

sub api_request {
    my ($uri) = @_;
    my $res = $ua->get($uri);

    die $res->status_line if $res->is_error;

    decode_json($res->content);
}

my $movies = api_request('http://ugomemo.hatena.ne.jp/11F9E990AA34FFBC@DSi/movies.json?token={ここにAPIトークンを入れる}');

printf "ピョコライフさんは%d個の作品を投稿しています。\n", $movies->{count};
#-> ピョコライフさんは31個の作品を投稿しています。

初めてのPerl 第6版

初めてのPerl 第6版

Common Lisp
(ql:quickload :drakma)
(ql:quickload :yason)

(defun api-request (uri)
  (multiple-value-bind (body status)
      (drakma:http-request uri :want-stream t)
    (when (> status 399)
      (error (princ-to-string status)))
    (yason:parse body)))

(defvar *movies*
 (api-request "http://ugomemo.hatena.ne.jp/11F9E990AA34FFBC@DSi/movies.json?token={ここにAPIトークンを入れる}"))

(format t
        "~&ピョコライフさんは~D個の作品を投稿しています。~%"
        (gethash "count" *movies*))
;-> ピョコライフさんは31個の作品を投稿しています。

実践Common Lisp

実践Common Lisp

  • 作者: Peter Seibel,佐野匡俊,水丸淳,園城雅之,金子祐介
  • 出版社/メーカー: オーム社
  • 発売日: 2008/07/26
  • メディア: 単行本(ソフトカバー)
  • 購入: 8人 クリック: 192回
  • この商品を含むブログ (69件) を見る

どうぞご利用ください。

Windows ストア アプリの作り方

こんにちは。id:nagayamaです。
現在僕は、はてなブックマークのディレクターという仕事をしています。Webサービスを提供するディレクターたるもの、新しいデバイスやプラットフォームがどういった仕組みになっているのかを体系的に理解しておくのは大事な事です。
今回ははてなブックマークからWindows ストア アプリがリリースされたのをきっかけに、そのアプリの開発に携わったid:nobuokaの力をかりつつ、簡単なはてなブックマークのアプリを実際に作りながら、その仕組みを学びました。
その一連の流れをチュートリアルのような形でまとめたものを公開します。実際のソースコードはGitHubでも公開しています。ぜひ最後までお読みいただき、興味がでた方は手許にcloneして遊んでみてください。

Windows ストア アプリについて

Windows ストア アプリの概要は Windows ストア アプリの概要 に詳しくありますが、とくにWeb開発者にとって注目すべきなのは、

Web 開発テクノロジに関する知識をお持ちの場合は、HTML5、カスケード スタイル シート レベル 3 (CSS3)、JavaScript を使って 新しいユーザーインターフェースのWindows ストア アプリを開発できます。

という箇所でしょう。
今回は、実際にHTML5, CSS, JavaScriptで開発するスタイルで、はてなブックマーク人気エントリーを表示するアプリを作っていく過程を解説していきたいと思います。

開発環境

Windows ストア アプリを開発するにはWindows 8が必要です。
開発者向けの試用版が提供されていますので、こちらをダウンロードして使います。
Oracle社が提供しているVirtualBoxや、VMware社が提供する各種仮想化環境にインストールして開発する事ができますので、OSを一からインストールする事ができない環境でも試す事ができます。

OSのインストールが完了したら続いて、開発ツールのインストールを行います。
デベロッパーセンターのダウンロードページへアクセスします。
f:id:nagayama:20121030130216j:image:w512
「詳細情報および他の言語を入手する (英語)」というリンクをたどり、「Visual Studio Express 2012 for Windows 8」のDownload language を日本語にし「Install now」からインストールを開始します。
f:id:nagayama:20121030130217j:image:w512

インストールが完了したらもちろん起動です。
f:id:nagayama:20121030130218j:image:w512

起動時にプロダクトキーの入力を求められますが、今回は試用という事でこのウィンドウは閉じて先に進めます。
f:id:nagayama:20121018173305j:image:w512

プロジェクトの作成とデバッグ

マイクロソフトのアカウントを入力してログインすると、Start Pageが開きます。
f:id:nagayama:20121018173444j:image:w512

設定によって英語のインターフェースで起動する事がありますが、その時は右上のquick launchに「language」と打ち込み言語設定を変更します。
f:id:nagayama:20121030130219j:image:w512

日本語に設定して再起動すると…
f:id:nagayama:20121030130220j:image:w512

UIが日本語になりました。
f:id:nagayama:20121030130221j:image:w512

ではさっそくプロジェクトを作っていきましょう。
プロジェクトにはテンプレートという雛形があります。色々なテンプレートがありますが、今回はこの中から「グリッド アプリケーション」を選択します。
f:id:nagayama:20121030130222j:image:w512

テンプレートが開き、開発を始める準備が整いました。
f:id:nagayama:20121030130224j:image:w512

ちゃんと動作するかどうか、まずはF5キーを押してデバッグモードにはいります。
f:id:nagayama:20121018173447j:image:w256 f:id:nagayama:20121018173448j:image:w256
ちゃんと動いてますね。

この際にシミュレーターをつかってデバッグすると動作確認画面と開発環境を行き来しやすくなります。
f:id:nagayama:20121030130223j:image:w512

Windows ストア アプリのHTML

f:id:nagayama:20121030130224j:image:w512

では実際にコードを追いかけてみましょう。
まずdefault.htmlを見てみると、body要素の中に

<div id="contenthost" data-win-control="Application.PageControlNavigator" data-win-options="{home: '/pages/groupedItems/groupedItems.html'}"></div>

という記述があります。他のHTMLへのパスがかいてありますが、このHTMLを読み込んで表示しているようですね。
このモデルは単一ページナビゲーション モデルといいデベロッパーセンターに詳しい解説がありますが、通常のWebページではスクリプトをロードする度に初期化されてしまうので、単一のページを起点に画面遷移などが行える仕組みになっています。

groupedItems.htmlの中を見てみると色々な記述があります。
その中でも以下のような「data-win-control="WinJS.Binding.Template"」という属性がついたdiv要素がいくつかあります。

    <div class="headertemplate" data-win-control="WinJS.Binding.Template">

このWinJS.Binding.Templateは、いわゆるテンプレートエンジンに相当するもので、PerlですとTemplateTookit, PHPだとSmarty, RubyだとAmritaなどに近いもののようです。
このテンプレートエンジンの詳しい使い方は http://msdn.microsoft.com/ja-jp/library/windows/apps/hh758329.aspx で参照する事ができます。
簡単には、

    <h4 class="item-title" data-win-bind="textContent: title"></h4>

という風にdata-win-bindという属性を使ってバインドした変数を展開していきます。

このテンプレートの定義の下には、実際に画面に表示されるHTMLが記述されています。
今回は HatenaBookmark というプロジェクト名にしたためアプリのタイトルとして HatenaBookmark が表示されていますが、プロジェクト名にはコロンなどの記号が使えませんので、この h1 の中を「Hatena::Bookmark」に変更してみます。

    <h1 class="titlearea win-type-ellipsis">
        <span class="pagetitle">Hatena::Bookmark</span>
    </h1>

アプリのデータ構造

さて、実際のデータはどこにあるのでしょう。
まず、groupedItems.htmlと同じディレクトリにある、groupedItems.jsを見てみます。
どうやらこの中では、groupedItems.htmlの要素にイベントやデータを割りあてているようです。
具体的には下の箇所で、 ListViewにData.groups.dataSourceを渡しています。

        // This function updates the ListView with new layouts
        _initializeLayout: function (listView, viewState) {
            /// <param name="listView" value="WinJS.UI.ListView.prototype" />

            if (viewState === appViewState.snapped) {
                listView.itemDataSource = Data.groups.dataSource;
                listView.groupDataSource = null;
                listView.layout = new ui.ListLayout();
            } else {
                listView.itemDataSource = Data.items.dataSource;
                listView.groupDataSource = Data.groups.dataSource;
                listView.layout = new ui.GridLayout({ groupHeaderPosition: "top" });
            }
        },

では、このDataを定義しているのはどこでしょうか。groupedImtes.jsの中にはそれらしい所はみつかりません。
もう一度groupedItems.htmlに戻り、head要素の中をみてみると、groupedItems.jsの他に

    <script src="/js/data.js"></script>

という、いかにもといったスクリプトを読み込んでいます。

さっそくdata.jsをみてみると、

    // TODO: Replace the data with your real data.
    // You can add data from asynchronous sources whenever it becomes available.
    generateSampleData().forEach(function (item) {
        list.push(item);
    });

というTODOがありました。
ここでlistにitemを登録して、Dataを作っているようですので、generateSampleData()をみるとどういったデータが送られてくるのかがわかるはずです。

f:id:nagayama:20121030130225j:image:w512

ありました。
さきほどのアプリで表示された内容がここに格納されていますので、ここの内容を書き換えれば、きっと内容もかわるはず。

    var sampleGroups = [
        { key: "group1", title: "最近の人気エントリー", subtitle: "はてなで人気の話題", backgroundImage: darkGray, description: "最近はてなブックマークで人気のある話題です" },
    ];

    // Each of these sample items should have a reference to a particular
    // group.
    var sampleItems = [
        { group: sampleGroups[0], title: "人気記事: 1", subtitle: "これはすごい", description: "概要がここにはいります。", content: "本文がここにはいります", backgroundImage: lightGray },
        { group: sampleGroups[0], title: "人気記事: 2", subtitle: "これはきれい", description: "概要がここにはいります。", content: "本文がここにはいります", backgroundImage: darkGray },
        { group: sampleGroups[0], title: "人気記事: 3", subtitle: "これはべんり", description: "概要がここにはいります。", content: "本文がここにはいります", backgroundImage: mediumGray },
        { group: sampleGroups[0], title: "人気記事: 4", subtitle: "これはやばい", description: "概要がここにはいります。", content: "本文がここにはいります", backgroundImage: darkGray },
        { group: sampleGroups[0], title: "人気記事: 5", subtitle: "これはひどい", description: "概要がここにはいります。", content: "本文がここにはいります", backgroundImage: mediumGray }
    ];

今回は人気エントリーRSSを利用するので、上記のように書き換えてみます。
これで実行してみると、ご覧の通り内容が書きかわってぐっとそれっぽくなってきました。
f:id:nagayama:20121018173308j:image:w512

つづいては、このデータ構造をはてなブックマークRSSを取得して作りだしていきます。

Web上のコンテンツの取得

WinJS.xhrという関数を使ってRSSを取得します。
WinJS.xhrはXMLHttpRequestのラッパーになっていて、これを使うとWeb上のコンテンツを簡単にダウンロードしてアプリから利用する事ができます。
http://msdn.microsoft.com/ja-jp/library/windows/apps/hh868282.aspx

サーバとの通信は非同期になるので、コールバック関数の中でlistにpushするという処理を行うようにします。

    WinJS.xhr({ url: feedUrl }).done(
    function complete(result) {
        // この関数で処理する
    },
    function error(error) {
    });

はてなブックマークではJSON形式でのフィード提供をしていないので、Googleが提供しているAPIを利用させていただき、RSSをJSONに変換します。

    var feedUrl = "http://b.hatena.ne.jp/hotentry.rss";
    feedUrl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&output=json&num=999&q=" + encodeURIComponent(feedUrl);

現在は人気エントリーしか表示しませんが、他のカテゴリーも表示できるようにカテゴリーのグループをつくっておきます。

    var categories = [
        { key: "group1", title: "最近の人気エントリー", subtitle: "はてなで人気の話題", description: "最近はてなブックマークで人気のある話題です" },
    ];

WinJS.xhrを利用して、取得したJSONにgropu属性を追加してlistにpushしていきます。
このlistはWinJS.Binding.Listのインスタンスにpushするなどの操作をする事で、動的に表示しているリストの要素を変更する事ができます。

    WinJS.xhr({ url: feedUrl })
        .done(function complete(result) {
            var jsonData = JSON.parse(result.response);
            jsonData.responseData.feed.entries.forEach(function (item) {
                item.group = categories[0];
                list.push(item);
            });
        });

    /* サンプルデータは表示しないようにコメントアウトしておきます
    generateSampleData().forEach(function (item) {
        list.push(item);
    });
    */

実行すると、ついに人気エントリーのコンテンツが表示されるようになりました!
f:id:nagayama:20121018173309j:image:w512

テンプレートの編集

でも少し見た目が変ですね…。
この見た目をいじるためには、上でも述べたgroupedItems.htmlの中のテンプレートを変更します。

    <div class="itemtemplate" data-win-control="WinJS.Binding.Template">
        <div class="item">
            <img class="item-image" src="#" data-win-bind="src: backgroundImage; alt: title" />
            <div class="item-overlay">
                <h4 class="item-title" data-win-bind="textContent: title"></h4>
                <h6 class="item-subtitle win-type-ellipsis" data-win-bind="textContent: subtitle"></h6>
            </div>
        </div>
    </div>

背景色を変更するために画像が設定されていましたが、そこをcontentSnippetに変更して概要を表示するようにします。

    <img class="item-image" src="#" data-win-bind="src: backgroundImage; alt: title" /><div data-win-bind="textContent: contentSnippet"></div>

サブタイトルは無いので削除します。

    <h6 class="item-subtitle win-type-ellipsis" data-win-bind="textContent: subtitle"></h6>

これでだいぶ見た目がすっきりしました。
f:id:nagayama:20121018173310j:image:w512

ブックマーク数を表示する

しかし何かが足りません。そうブックマーク数です。
はてなブックマークではそのエントリーにつけられたブックマーク数を表示する画像APIを提供しています。
今回はそれを使って、ブックマーク数を表示してみましょう。

data.jsにもどって、

    WinJS.xhr({ url: feedUrl })
        .done(function complete(result) {
            var jsonData = JSON.parse(result.response);
            jsonData.responseData.feed.entries.forEach(function (item) {
                item.group = categories[0];
                item.counterImageURL = "http://b.st-hatena.com/entry/image/" + item.link; // 画像APIのURLを追加する
                list.push(item);
            });
        });

このデータを表示するために以下のHTMLをgroupedImtes.htmlのテンプレートに追加します。

    <div class="item-subtitle win-type-ellipsis"><img data-win-bind="src: counterImageURL" /></div>

これではてなブックマークらしくなりました。
f:id:nagayama:20121018173311j:image:w512


HTMLとJavaScriptをつかったアプリには、ローカルコンテキストと Webコンテキストというの2つのコンテキストがあります。
ローカルコンテキストではWebサイトでよく使われているような外部ドメインの JavaScript を読み込みができないという制限があったり、Webコンテキストではシステムへのアクセスが制限されます。
(詳しくは http://msdn.microsoft.com/ja-jp/library/windows/apps/hh465373.aspx を参照してください)
こういった制限があるため、各アイテムをクリックした時に不正なHTMLを挿入しようとしている旨の警告がでて強制終了してしまいます。
ここでは、toStaticHTMLを利用してHTMLを制限に収まる形にして挿入します。
あわせて、表示に必要のない要素はコメントアウトしました。
itemDetail.jsの中を以下のように変更します。

        var item = options && options.item ? Data.resolveItemReference(options.item) : Data.items.getAt(0);
        element.querySelector(".titlearea .pagetitle").textContent = item.group.title;
        element.querySelector("article .item-title").textContent = item.title;
        /*element.querySelector("article .item-subtitle").textContent = item.subtitle;
        element.querySelector("article .item-image").src = item.backgroundImage;
        element.querySelector("article .item-image").alt = item.subtitle;*/
        element.querySelector("article .item-content").innerHTML = toStaticHTML(item.content);
        element.querySelector(".content").focus();

また、グループの一覧を表示するgroupDetail.htmlも不必要な要素を表示しないようにして、概要の部分にcontentSnippetを表示したりします。

    <div class="headertemplate" data-win-control="WinJS.Binding.Template">
        <h2 class="group-subtitle" data-win-bind="textContent: subtitle"></h2>
        <!-- img class="group-image" src="#" data-win-bind="src: backgroundImage; alt: title" / -->
        <h4 class="group-description" data-win-bind="innerHTML: description"></h4>
    </div>
    <div class="itemtemplate" data-win-control="WinJS.Binding.Template">
        <div class="item">
            <!-- img class="item-image" src="#" data-win-bind="src: backgroundImage; alt: title" / -->
            <div class="item-info">
                <h4 class="item-title" data-win-bind="textContent: title"></h4>
                <!--h6 class="item-subtitle win-type-ellipsis" data-win-bind="textContent: subtitle"></h6 -->
                <div><img data-win-bind="src: counterImageURL" /></div>
                <div class="item-description" data-win-bind="textContent: contentSnippet"></div>
            </div>
        </div>
    </div>

さて、これで一通りブックマークのRSSから得られる情報を表示しました。
さらにCSSなどを使って見た目を調整したり、ユーザーさんのコメントを表示したり、たとえばReadabilityのAPIと組み合わせて、アプリ内で本文を確認できる仕組みをつけたり、色々な応用が考えられます。

DOM Explorer の使い方

さらにカスタマイズをしていくなかで、DOM Explorerの使い方を覚えておくと便利です。
デバッグを実行している間に、デバッグ → ウィンドウ → DOM Explorerで開くことができます。
f:id:nagayama:20121030130226j:image:w512

左上の「要素の選択」をクリックすると、シミュレーターの方に画面が切り替わり、その中のカーソルの下にあるエレメントに青い枠がでます。
これで調べたいエレメントをクリックすると、現在どのようなHTMLが描画されどのようなスタイルが適用されているかが分析できます。
f:id:nagayama:20121030130227j:image:w512

Stylesのタブの中はリアルタイムに値を変更できますので、ここで調節した値をCSSにして保存すればHTMLでアプリケーションを作っている感覚で見た目を変更する事ができます。

今後の道標

ここまでチュートリアル形式で Windows ストア アプリ開発の方法を見てきましたが、Windows ストア アプリ開発で使用できる機能は他にも様々に存在します。 さらに開発を進めていくうえで参考になるドキュメントを紹介します。

まず、JavaScript で開発する場合に限らず、Windows ストア アプリにどのような機能を実装すべきなのか、どのようなユーザー体験を提供すべきなのか、といったことは、下記ドキュメントをご覧ください。

また、JavaScript で開発する場合に参考にすべきドキュメントについては、下記ページにロードマップとしてまとまっていますので、こちらを参考にしてください。

ロードマップとしてまとまっているとはいえ、それでも量が膨大ですので、最初に読むと良さそうなドキュメント類をいくつか紹介します。

サンプルコードについて

MSDN には、Windows ストア アプリのサンプルコードが多数存在します。 Microsoft によって提供されているものもありますし、第三者により提供されているものもあります。 特に Microsoft によって提供されている各種機能のサンプルコードはわかりやすいものが多く充実しておりますので、ドキュメントを見てよくわからなければサンプルコードを検索するということを心がけるとよいと思います。

これらのサンプルコードは web 上で検索してダウンロードすることもできますが、Visual Studio の "New Project" の "Online" から検索してダウンロードしてくることもできます。

スプラッシュ画面とタイル画像やロゴ画像の変更方法について

スプラッシュ画面に表示される画像やロゴ画像は、プロジェクトのルートディレクトリにある package.appxmanifest で指定されます。 スプラッシュ画面に表示される画像の変更方法は下記ドキュメントをご覧ください。

ロゴ画像なども同様に package.appxmanifest を編集することで変更できます。 ロゴなどの画像のサイズは下記ドキュメントをご覧ください。

WinJS ライブラリとクラス定義、名前空間定義の補助メソッドについて

この記事の中では特に説明せずに使用してきましたが、JavaScript で Windows ストア アプリを開発するための機能が WinJS ライブラリとして提供されています。 WinJS ライブラリにはクラスを定義するための補助関数から各種 UI やアニメーションまで多くの機能が含まれています。

特に基本的な補助機能であるクラス定義や名前空間定義に関しては下記ドキュメントをご覧ください。

コントロールについて

ユーザーとの対話を行うアプリケーションでは、コンテンツをユーザーに見せたりユーザーとの相互作用を行ったりするための制御器――すなわちコントロールが必要となります。 HTML 要素そのものもユーザーとの相互作用を行うための機能を持つ (例えば type=checkbox のインプット要素を例にすると、ユーザーの操作によりチェック状態が変化し、また、そのチェック状態をユーザーに見えるように表示するという機能があります) ので、JavaScript を使う Windows ストア アプリでは HTML 要素そのものもコントロールだとみなすことができます (HTML コントロール)。 また、HTML 要素そのものだけでなく、WinJS ライブラリによって提供されるコントロール (WinJS コントロール) もあります。

この記事中でも、プロジェクトテンプレート内でもともと使用されているコントロールとして WinJS.UI.ListView コントロールなどを使用しました。 コントロールを使いこなすことで、Windows ストア アプリとして一貫した見た目、操作性を少ない労力で提供することができます。 コントロールについて、詳しくは下記ドキュメントをご覧ください。

さらに、独自のコントロールを定義することも可能です。 詳しくは下記ブログ記事をご覧ください。

コントラクトについて

Windows ストア アプリでは、コントラクトを用いて別のアプリや Windows のシステムとの間の対話的操作のサポートを宣言することができます。 例えばはてなブックマークアプリでは表示中のエントリページの URI を共有す
る共有ソースコントラクトを実装しているので、その URI を共有してメールアプリや twitter アプリで使用するということが容易になっています。 コントラクトについては下記ドキュメントとブログ記事をご覧ください。

特によく使われるであろう 3 つのコントラクトについて、以下にドキュメントを挙げます。

まとめ

さて、だいぶ駆け足でお送りしてきましたが、Windows ストア アプリの概要は掴めたでしょうか。
アプリという形にするためには、デザインガイドラインを含めいくつかの制限を乗り越える必要はありますが、やはりWeb開発者としては普段使い慣れ親しんだHTMLとJavaScriptという開発環境と、既存のWebアプリケーションの資産を有効に活用できるという事もあり、これまでのWindows デスクトップ アプリケーション開発に比べてぐっと身近に感じる事ができました。
今回のソースコードは以下で公開していますので、是非手許にcloneして試してみてください。
https://github.com/hatena/WindowsStoreAppTutorial

締め切りました: はてな東京開発センターを開設します&エンジニア向けセミナーのお知らせ

9月20日14:00追記
締切日時となりましたので、応募を締め切りました。
多数のご応募ありがとうございました。

お申込みいただいた方へは別途メールにてご連絡させていただきます。

*

こんにちは、はてなCTOの id:stanakaです。
株式会社はてなは、10月下旬に東京オフィスを表参道へ移転します。合わせて東京開発センターを開設し、エンジニア採用をスタートします。東京開発センターの開設の意図などについて詳しくは、プレスリリースをご覧ください。

http://hatena.g.hatena.ne.jp/hatenapress/20120911/1347340094

今回、新東京オフィスの移転に先駆けて、オープン前のオフィス予定地でエンジニア向けセミナー「Hatena Engineer Seminar」を、2012年9月26日(水)に開催します。主にウェブサービスに関わっておられるエンジニアの方々を対象に、はてなのサービス開発のビジョンや体制について紹介します。また、開発チームのエンジニアスタッフより、具体的なサービス開発の企画、設計や、その中で使われている技術について紹介します。

懇親会には私 id:stanaka やスピーカーはもちろん、翌日のYAPC::Asia Tokyo 2012のために上京しているエンジニアも参加する予定です。はてなのサービスにご興味いただいている皆さまのご参加を心よりお待ちしています。

申し込みページ:(※2012年9月20日(木) 10:00締切) 応募締め切りました

Hatena Engineer Seminar 概要

  • セミナー名:Hatena Engineer Seminar
  • 日時:2012年9月26日(水) 19:00-21:30(18:30 受付開始/懇親会含む)
  • 参加費:無料
  • 定員:30名(応募者多数の場合は抽選とさせていただきます)
  • 会場:株式会社はてな 新東京オフィス
    • 所在地:東京都港区南青山6-5-55 青山サンライトビル3F

      大きな地図で見る
    • ※オフィスオープン前につき、電源や無線LANの提供はございません
  • ハッシュタグ:#hatenatech
セミナー申し込み方法
  • お申し込み:以下のページからお申し込みください
  • 締切:2012年9月20日(木) 10:00

発表内容およびスピーカー

はてなのサービス開発と東京開発センターの立ち上げ

by 執行役員 CTO 田中慎司(id:stanaka / @

はてなは、これまでに様々なサービスを提供してきました。今後、選択と集中を行いながら、さらにサービスを飛躍させることを目指しています。ここでは、この飛躍に向けた、はてなのサービス開発のビジョンや、それをサービスとして実現するための体制について、お話しします。
また、はてなのエンジニア陣の技術的な取り組みや、サービス開発を通して成長してもらうために心掛けていること、東京での開発拠点を立ち上げる狙いなどをお話しします。

プロフィール

株式会社はてな 執行役員最高技術責任者。情報学博士。1998年京都大学工学部情報工学科卒業、2000年同情報学研究科社会情報学専攻修了。2006年同博士後期課程修了。NTT研究所を経て、2006年はてな入社。サーバ/インフラからフロントエンドまではてなのサービス群の技術全体を俯瞰している。著書に「サーバー/インフラを支える技術」「Web開発者のための大規模サービス技術入門」(いずれも共著)。

はてなにおけるアプリケーションエンジニアの役割

by はてなブックマーク アプリケーションエンジニア 山家雄介(id:yanbe / @

はてなブックマークを例に、サービス開発部におけるアプリケーションエンジニアの役割についてご紹介します。サービス開始後7年間に溜まった4900万エントリーと1.3億ブックマークをパフォーマンスを維持しつつ活用するためのオープンソースプロダクトの活用手法や、機械学習を利用したスパム判定システム、iPhone/AndroidアプリとしてのスピンアウトであるB!KUMAガールズの企画から開発までの流れ、そして、エンジニアとしてはてなで働くことのやりがいなどをお話しします。

プロフィール

2005年 卒業研究にてソーシャルブックマークに関する研究に着手。NTTサイバーコミュニケーション総合研究所 インターン、U.C.Berkeley School of Information 客員研究員を経て、2011年3月にソーシャルブックマークを利用したウェブマイニングの研究にて、京都大学大学院 情報学研究科 博士課程修了。 博士(情報学)。 2011年4月 アプリケーションエンジニアとして株式会社はてなに入社。入社後は一貫してはてなブックマークの開発に従事。

はてなのサービスを支えるインフラについて

by システムプラットフォーム部 DevOpsエンジニア 田村嘉久(id:shoichimasuhara / @

はてなのサービスを支えるインフラシステムのご紹介をします。日々変化するはてなのサービスに柔軟かつ迅速に対応するために設計された高可用なシステム - サーバ・ネットワーク、そしてミドルウェアの仕組み、またそれらを設計・構築・管理・運用する、はてなインフラ担当のシステムプラットフォーム部エンジニアの役割や業務を具体的な内容を交えながらお話します。

プロフィール

自衛隊、レンタルサーバ会社勤務を経て、2012年3月はてなに入社。はてなのインフラを支えるシステムプラットホーム部所属。サーバ・ミドルウェアオペレーションから調達まで幅広く担当。

【お知らせ】YAPC::Asia Tokyo 2012に参加します!

セミナーの翌日から開催される、世界最大のPerlの祭典「YAPC::Asia Tokyo 2012」に、はてなもスポンサーとして協力しています。
はてなエンジニアからも、id:onishiid:motemenid:hakobe932id:shiba_yu36がトーク予定です。その他のエンジニアも参加予定です。はてなスタッフを見かけた方はお気軽に交流してください!
HOME | YAPC::Asia Tokyo 2012

社内ユーザテスト勉強会のスライドを公開します

UX

こんにちは、id:uedayです。
5/22にはてな社内でユーザテストについての勉強会を実施しました。

良いユーザ体験には、ユーザが迷わず快適に操作できるインタフェースが不可欠です。
ユーザビリティを評価する方法としてユーザテストがありますが、はてなブログチームでは、「アジャイル・ユーザビリティ―ユーザエクスペリエンスのためのDIYテスティング―」という本を参考に、社内でユーザテストを行っています。

今回の勉強会は導入編として、ユーザテストのメリットや事例など基礎的なことを解説したスライドを発表しました。
ご興味のある方はご覧ください。

アジャイル・ユーザビリティ ―ユーザエクスペリエンスのためのDIYテスティング―

アジャイル・ユーザビリティ ―ユーザエクスペリエンスのためのDIYテスティング―

今後も社内で事例を増やして、ノウハウを共有したいと思っています。

Kyoto.lisp TT #1 を開催しました

こんにちは、id:nitro_idiot です。主にLispに興味があります。

5/12(土)に、京都のLispコミュニティ「Kyoto.lisp」の最初のイベントである「Tech Talk #1」を開催しました。

Kyoto.lispは4/1に設立宣言をした新しいLisp方言コミュニティです。4/1に思いついてブログを書いたので虚構だと思われた方もいらっしゃったようですが、Tech Talkの開催により設立が既成事実となりました。

京都は世界最初のCommon Lisp処理系である「Kyoto Common Lisp」が生まれた場所でもあり、コミュニティ設立には良い場所だと思います。

今回のイベントの詳細な様子と発表内容はKyoto.lispのブログレポートをご覧ください。


また、イベントの様子をはてなアルバムにアップロードしましたので合わせてご覧ください。


「次はいつですか?」という質問を開催直後から多くいただいておりますが、次回は9月頃に何らかの形のイベントを開催する予定です。

今年はInternational Lisp Conference (国際Lisp会議) 2012も京都で開催されますし、関西圏のLisperにとって楽しい一年になりそうですね!


現在はてなでは、Lisperと一緒に働きたいかもしれないエンジニアを積極募集しているのかもしれません! 夏はインターンも実施予定のようですので奮ってご応募ください!