巨人の肩の上に登る

先人の積み重ねた発見に基づいて、なにかを発見しようとすることを指す。

UX/UXDとは何か?- RECRUIT UXDインターンに行って来た -

ユーザエクスペリエンスデザイン(UXD)とは何か?

いきなりですが、僕なりのUXDの理解を述べます.

UXDは、”ユーザ体験(UX)の設計(Design)”と直訳することができるが、抽象度の高い概念なので、そのままでは非常に理解しがたい。そこで、同程度の抽象度である”意志伝達”を例に考える。

UXDと意思伝達は、次のような対応だと考えられる。

f:id:mayo_yamasaki:20140226230815p:plain

要するに、UXDとはユーザ体験を設計するための手段の総称であり、具体的な手段としては、UI設計やマーケティング、プログラミングなどがある。

参考記事:
Func09.com


さて、何故”UX/UXDとは何か?”という話になったのかという経緯を書いていきます。

RECRUIT UXD インターンに参加してきた

f:id:mayo_yamasaki:20120622182051j:plain

RECRUIT HOLDINGS WINTER INTERNSHIP UXDスペシャリストコース に参加してきました。
就職活動の時期とかなりオーバラップしている1月下旬から2月下旬までの4週間のインターンシップ

参加した経緯

昨年末に募集があり、Webソリューションコース、Web マーケタースペシャリスト養成コース、UXDスペシャリストコース、データ解析スペシャリストコースの4種類がありました。(募集ページ

個人的には、UXDかデータ解析で少し悩んだのですが、視野を広げたかったのと、昨年は研究開発と開発のインターンに参加したこともあり、UXDコースに応募してみた。

UXDインターン

インターンシップの内容は実践形式で、かなり自由度が高いものでした。
4、5人のチームに一人のメンターが担当する形で、進め方やMTG頻度も自由。

感想

成果を挙げることができず、残念な結果に...。
メンターさんは非常に熱い方で、チームメンバーもモチベーションが高く、4週間楽しんで取り組みことができました。

一方で、自身の能力の不足や課題が浮き彫りになったので、その点を意識しつつ知識と経験を積んでいければと思っています。

UXって何だ?

インターンシップは上記でも触れたように、実践形式でしたので、必然的にUXが何か?を自分で考える必要があります。

ところが、適当にGoogleしてみても、長々とした説明の割に何を言ってるのか理解するのに時間がかかる記事ばかり。ですので、自分なりに簡潔に”UXDとは何か?”に対する答えを考えてみた次第です。


関連記事

文字列を数値に変える関数

久しぶりにC言語を書いてみた.

文字列を数値に変える関数

仕様
関数名:string2double
引 数:char*
返り値:double

浮動小数点、正負の文字列に対応

#include<stdio.h>
#include<math.h>
#include<string.h>

double string2double(char*);

int main (void)
{
    
    char *str = "-1234.567";
    double v = string2double(str);
    printf("%lf\n", v);
    
    return 0;
}

double string2double(char* str)
{

    int len = strlen(str);
    int begin = 0;
    int flag = 1;
    double val = 0.0;
    double weight = 1.0;
    
    if (str[0] == '-') {
        begin = 1;
        flag *= -1;
    }

    for (int i=len-1; i>=begin; i--) {
        if (str[i] == '.') {
            weight /= pow(10, (len - 1 - i));
        }
    }

    for (int i=len-1; i>=begin; i--) {
        if (str[i] == '.') continue;
        val += weight * (double)(str[i] - '0');
        weight *= 10.0;
    }

    return flag * val;
}
$ gcc string2double.c -o string2double -lm
$ ./string2double
-1234.567000

ゲーミフィケーションを考える上でのゲームとは?

昨日久しぶりにゲーミフィケーションの話をして,ジェーン・マゴニガルがTEDで話した「ゲームで築くより良い世界」というプレゼンを思い出した.
Evernoteにメモがあったので,再度まとめてみる.

ジェーン・マゴニガル「ゲームで築くより良い世界」


なぜ,ゲームをしてるときは困難にもめげず,挑戦し続けることができるのか?
多くに人がゲームに熱中できる理由を考えるのも面白い.

1. エピックストーリー

壮大な物語(エピックストーリー)は,動機、最終目的を与える.
e.g. 世界を救う,お姫様を助ける

2. 超えられる壁

現在のレベルに最適化された問題が与えられる.つまり、達成しえない問題が与えられない.
e.g. ストーリーの進行に合わせて敵が強くなる

3. フィードバック

続けるための動機を維持する.
e.g. レブルアップ,力+1,知性+1

4. フレンド

一緒に挑戦する,助け合う,切磋琢磨する仲間の存在.
e.g. オンラインゲーム

ゲーミフィケーションを考える上で,役に立つかも.

関連記事

Mavericksで音声認識Juliusを試してみる

Mac OS X Mavericks 10.9 で,大語彙連続音声認識エンジン Julius を試してみる.

PortAudio のインストール

文字通り,Audio系のライブラリです.

PortAudio - an Open-Source Cross-Platform Audio APIから,pa_stable_v19_20111121.tgz をダウンロードする.

$ tar -xzf pa_stable_v19_20111121.tgz
$ cd portaudio
$ env CFLAGS='-arch i386' LDFLAGS='-arch i386' ./configure --disable-mac-universal

次に以下の操作を行います。

  1. Makefile の CFLAGS から -Werror を削除
  2. include/pa_mac_core.h で次のような変更を行う
- #include <AudioUnit/AudioUnit.h>
- //#include <AudioToolbox/AudioToolbox.h>
+ #include <CoreAudio/CoreAudio.h>

最後にinstallする.

$ make
$ sudo make install


Julius のインストール

julius-4.2.3.tar.gz

$ tar -xzf julius-4.2.3.tar.gz
$ cd julius-4.2.3
$ env CFLAGS='-O3 -arch i386' LDFLAGS='-arch i386' ./configure --enable-words-int --with-mictype=portaudio

julius-4.2.3/julius/main.c の 197行目を下記のように編集.

- if (j_adin_init(recog) == FALSE) return;
+ if (j_adin_init(recog) == FALSE) return -1;
$ make
$ sudo make install


ディクテーションキットのインストール

dictation-kit-v4.2.3.tar.gz

$ tar -xzf dictation-kit-v4.2.3.tar.gz 


実行してみる

-charconv でエンコードを指定するのですが,utf8を指定すると次のような Error を吐きます.

Error: charconv_libjcode: only "sjis", "euc-jp" and "jis" can be used with libjcode.

仕方なく,"euc-jp" で試してみる(※文字化けする場合は,端末のエンコーディングを合わして下さい). 詳しくは,付録 B. オプション一覧 を参照されたい.

$ cd dictation-kit-v4.2.3
$ julius -C fast.jconf -charconv euc-jp euc-jp
...
<<< please speak >>>
# ここで”音声認識”と発音
pass1_best:  音声認識
sentence1:  音声認識 。


関連記事

Clojureでナップサック問題を動的計画法で解く

ナップサック問題とは

ある容量Cのナップサックと,n個の品物が与えられたとする.n個の品物は,それぞれ異なる容量Ciと価値piだとする.このとき,ナップサックの容量Cを超えない範囲で,品物の価値の総和を最大にする組み合わせを求める.
詳しくは,ナップサック問題 - Wikipedia を参照されたい.

デコード

今回は,同じ品物を一つまでしか入れられない場合を考える.
この場合の動的計画法の考え方は次のようになる.

  1. 容量の総和が 0 のときの,価値の総和を 0 とする.
  2. 品物 i を選択する
  3. すべての計算した容量の総和と価値の総和の組み合わせに対して,品物 i を加えた場合と、そうでない場合を考える.
  4. 容量の総和がナップサックの最大容量以下であり,すでに計算されたその容量での価値の総和よりも,現在考えている価値の総和の方が高い場合,価値の総和を更新する.
  5. すべての品物に対して2-4を繰り返す.

テキストだけでは分かりにくいと思うので,下記の記事を参考にして下さい.
最強最速アルゴリズマー養成講座:病みつきになる「動的計画法」、その深淵に迫る (1/4) - ITmedia エンタープライズ

コード

ソースコード全体は,Gihub に公開している.
今回はClojureで実装したのだが,あんまり慣れていないのですごく汚い.

core.clj
(ns knapsack-problem.core)
(use '[clojure.java.io])

(defn getItems [path del]
  "import items from filepath. path: filepaht, del: data delimiter"
  (let [lines (line-seq (reader path))]
    (map (fn [line]
           (map (fn [x]
                  (read-string x))
                (-> (.split line del) seq)))
          lines)))

(defn dp [items limit]
  "solved knapsack problem using dp. items: (cost value), limit: cost limit"
  (def table {"0" 0})
  (def backpointer {"0" (ref [])})
  (doseq [item items]
    (def cached_backpointer backpointer)
    (doseq [cell table]
      (let [cost (str (+ (read-string (first cell))
                        (first item)))
            value (+ (last cell) (last item))]
        (if (<= (read-string cost) limit)
          (if (or (not (table cost)) (and (table cost) (< (table cost) value)))
              (do
                (if (or (not (backpointer cost)) (< (table cost) value))
                  (def backpointer (assoc backpointer
                                          cost
                                          (ref @(cached_backpointer (first cell))))))
                (def table (assoc table cost value))
                (dosync (alter (backpointer cost) conj item))))))))
  [table backpointer])

(defn getMaxValueAndElement [items backpointer]
  "get mav value in. items: (cost value), backpointer: {cost: [items]}"
  (def m ["0" 0])
  (doseq [item items]
    (if (< (last m) (last item))
      (def m [(first item) (last item)]))
    )
  [(last m) @(backpointer (first m))])

(defn -main []
  "knapsack problem decoder"
  (let [table (dp (getItems "resources/input.csv" ",") 10)]
    (getMaxValueAndElement (first table) (last table))))

getItems は,ファイルから容量と価値の組をタプルで取り出します.
dp の部分で,先程紹介した動的計画法を用いてナップサック問題を解き,最終的な容量と価値の組とそこまでの経路を返します.
getMaxValueAndElement は,dpが返した組の中の最大価値と,その場合の要素の組を返します.

最後に,上記で示した記事の例を計算した結果を示します.

input.csv
3,2
4,3
1,2
2,3
3,6
result
[14 [(4 3) (1 2) (2 3) (3 6)]]

Clojure でファイルの入出力

検索してもそれらしい情報が出てこなかったので,メモ.
clojure 1.5.1では,javaのioを使っています(公式 API).

FINENAME がファイル名だとすると,下記にファイルの中身を一行づつ出力するプログラムを示します.

(use '[clojure.java.io])
(let [lines (line-seq (reader "FILENAME"))]
    str lines)

簡単ですが,以上.

映画マネーボールを観て

f:id:mayo_yamasaki:20140112221430j:plain

あらすじ

若くして球団のゼネラルマネージャーとなったビリー・ビーンは,ある日,イエール大学経済学部卒のピーターと出会い,彼が主張するデータ重視の運営論に,貧乏球団が勝つための突破口を見出し,周囲の反対を押し切って,後に”マネーボール理論”と呼ばれる戦略を実践していく。当初は理論が活きずに周囲から馬鹿にされるが,熱い信念と挑戦することへの勇気が,メジャーリーグの常識を覆す実話.ブラッド・ピット主演×「ソーシャル・ネットワーク」の製作スタッフのタッグで贈る.(※ iTuensの詳細の要約)

感想

ここ一年くらいに見た中で,一番面白い映画でした.実話であり,スタートアップマインドを感じる点も数多くあり.ビリーの最後の選択も良かったと思います.

ちなみに,2013年1月時点ではセール中で,SD版なら iTuens Store から 100円でレンタルできます.たまたま残金が150円残っていたので,今回始めて iTuens Store を使ってみたのですが,中々良いです.

スタートアップと映画マネーボール

スタートアップ界隈で受けそうな映画だなーと思って,調べてみると,2013年02月のSEO Japanの記事が引っかかりました.映画自体は2011年公開で,当時話題になったそうです.
この下記の記事は,HubSpot創業者の記事の翻訳だそうです.
映画「マネーボール」に登場する17のセリフに学ぶスタートアップの教訓

マネーボール理論について

野球において,データを統計学的見地から客観的に分析し、選手の評価や戦略を考える分析手法をセイバーメトリクス(SABRmetrics)と言うそうです.

彼らの考えた理論は,出塁率長打率・選球眼・慎重性などを重要な要素として位置づけています.その上で,過去の野球データから回帰分析で得点期待値を定義し,これを最大化する要素を持つ選手を選択する方法だそうです.(詳しくは wikipedia マネーボール 参照).

面白そうなので,機会があれば調べてみたい.