2010年8月アーカイブ

S式で書くプレゼンツール「L5」をリリースしました

| 【8分で読めるよ!】 | コメント(0) | トラックバック(0)
※重要 この記事は古いです。新しいバージョンに移動する

 以前公開したS式で書くプレゼンツール「L5」の続報です。

 公開時と比べるとプレゼンを書くためのマクロの整備と、それに伴った機能拡張がされています。今まではほとんど自分一人が使うために開発を続けていましたが、既に実用レベルに達していると感じる完成度になったためver1.0.0として正式リリースすることにしました。

http://github.com/fukamachi/L5/tree/1.0.0

 1.0.1をリリースしました。

http://github.com/fukamachi/L5/tree/1.0.1

セットアップ

 L5を使うにはLeiningenというClojureのビルドツールが必要です。

※Clojure本体のインストールは必要ありません。Leiningenが勝手にダウンロードします。

Leiningen

 まずはLeiningenの最新安定版(1.3.0)を導入します。

$ sudo wget -O /usr/local/bin/lein http://github.com/technomancy/leiningen/raw/1.3.0/bin/lein
$ sudo chmod a+x /usr/local/bin/lein
$ lein self-install

※先日 @peccul さんから、L5のビルドが途中で止まってしまうという現象が報告されました。原因を探ると、Leiningen 1.3.0からのバグが原因のようです。このバグにはL5側が回避するような修正をしたため、現在はLeiningenによる不具合は改善されています。

L5

 L5の導入は簡単です。gitが入っていない場合はDownloadsからtgz/zipをダウンロードできます。

$ git clone git://github.com/fukamachi/L5
$ cd L5
$ git checkout refs/tags/1.0.1
$ lein deps

 これでセットアップが完了です。ここで、以下のコマンドを実行するとサンプルのプレゼンテーションが起動します。

$ lein run presen

チュートリアル

下準備

 L5を起動すると、L5のディレクトリルートにある run.clj というファイルが実行されます。この実行ファイルでは以下の2つを定義します。

  • コンテキスト (フレームの大きさ、文字の色など)
  • スライド

 デフォルトのrun.cljには以下のように書いてあります。

;; Delete this line and write your slides below.
(load-file "sample.clj")

 これはsample.cljをロードするだけのコードで、プレゼンの記述はsample.cljに書かれています。

 新しいプレゼンテーションは、コメント通りにまずrun.cljの2行を削除してから始めます。

 その後、以下のように名前空間を定義します。名前空間の名前は何にしても構いません。

(ns L5.sample
  (:use L5 L5.layout))

 これで準備完了です。

コンテキスト

 次にコンテキストを定義します。コンテキスト定義にはdefcontextを使います。

(defcotext {...})

 以下は640x480のフレームで、フォントは「Gill Sans」の30ptを指定しています。

(defcontext
  {:width 640 :height 480
   :font (Font. "Gill Sans" 0 30)})

 コンテキストには主に以下のパラメータがあります。

color文字色 (Colorオブジェクト)
background-color文字色 (Colorオブジェクト)
background-image背景画像 (ImageIOオブジェクト)
widthスライドの横幅
heightスライドの縦幅
paddingパディングをMapで指定 (例: {:top 100 :right 20 :bottom 100 :left 20})
fontフォント (Fontオブジェクト)

 これらはスライド内で適宜変更することができます。詳細は次節で説明します。

スライド

 次はいよいよスライドを作ります。スライドはdefslidesで定義します。

(defslides slide-functions*)

 例を出します。

(defslides
  (p (with-title "自己紹介"
       (item "深町英太郎です"
               "Webプログラマ"
               "Lisper (CL, Clojure)"
               "Perl5, JavaScript..."
               "オープンソース愛好家"))))

 ここで、pはpageを表しています。このスライドは item の中身の文字列を一行ずつ箇条書きで表示するスライドです。

Screenshot.png

 ここで使用できる主なAPIは以下の通りです。

  • レイアウト関連
p[& body]ページ
title-page[& strs]表紙用の整列された大きな文字を表示
with[params & body]一時的にcontextのパラメータを上書きして実行
with-size[size & body]一時的にコンテキストのサイズを変更
with-padding[padding & body]上を指定ピクセルだけ空けて表示
with-title[title & body]上部にタイトルをつけたレイアウト
  • 文字関連
lines[& strs]引数の文字列を一行ずつ表示
item[& strs]引数の文字列のそれぞれの行の先頭に”・”をつけて表示 (itemizeの略)
enum[& strs]引数の文字列のそれぞれの行の先頭に行番号をつけて表示 (enumerateの略)
align[align & strs]文字列をセンタライズして表示
t[& strs]引数の文字列を画面いっぱいに表示 (Takahashiの略)
img[file]指定されたファイル名の画像を表示
fit[& strs]表示領域いっぱいに文字列を表示
txt[& strs]必要に応じて文字を折り返して表示

実行時リロード

 スライドを書いたら、L5のルートでlein run presenを実行して起動できます。ただ、スライドを一部変更したときにいちいちL5を再起動するのは面倒です。

 L5にはスライドのホットリロード機能があり、[R]キーを押すだけで再起動せずにエディタで書いたスライドの内容を反映することができます。

キー操作

次のページ: [Right]、[Enter]、[Space] 前のページ: [Left]、[Backspace] フルスクリーン: [F5] (トグル)、[Esc] (解除) ホットリロード: [R]

PDF出力

 L5には書いたスライドをPDFとして出力する機能があります。L5のルートディレクトリで以下のコマンドを実行してください。

 $ lein run export

 少し待つと同じディレクトリに”output.pdf”というファイルが出力されます。

開発状況

 見ての通りGitHubでオープンソースとして公開しています。BTSにはGitHub付属のIssuesを利用しています。

L5の未来

 あまり新しいソフトウェアの未来を語るとあとで恥ずかしいことになりそうですが、少しだけ。

 L5の設計思想は「自分に合わせたプレゼンツールを設計できる」というものです。S式とマクロによる抽象化で、自分のプレゼンスタイルに合わせたDSLを構築することができます。これは今後も続けていく方針です。

 また、将来的には完成度として劣らないプレゼンテーションを作れるようにしたいです。Keynoteは美しさの面で非常に素晴らしいツールです。L5はそういった「美しさ」も劣らないソフトウェアとして改善していこうと思います。

本当にLispはカッコが多い?

| 【14分で読めるよ!】 | コメント(38) | トラックバック(9)

 先日のブログで少しだけ出てきましたが、今アリエルに高校生の飯田さんがアルバイトに来ています。プログラム言語はCとJavaをやっているようですが、Lispにも興味があるようです。興味があるみたいなので実践Common LispやらプログラミングGaucheを読ませたり、目の前でLispプログラムを見せたりしていました。

飯田「すごく…カッコが多いですね」
僕「え、そうですか?」
飯田「閉じカッコあたりとか」
僕「あー、でもこれってあんまり気にならないですよ」
飯田「気になります」

 Lispを書いている人には理解してもらえるでしょうが、カッコってそんなに気にならないですよね? それに、普通の言語でfunc(a1, a2)と書くところを、Lispでは(func a1 a2)と書いているだけなので、それほどカッコの数で違いがないように思います。

僕「カッコは多くないですよ」
飯田「多いですよ」
僕「多くないですよ」
飯田「多いですよ」

 カッとなったので、実際に数えてみることにしました。

カッコの数を数える

 そもそもカッコが多いとか少ないの判断はどうすればいいんでしょうか。カッコの数/行数 で出せるかなと思ったのですが、それだと行数のやたら多い言語が有利です。なので、同じ仕様のプログラムを各言語で作って比較するようにしました。

 作ったプログラムの仕様は以下の通りです。

  • 指定数までの階乗(factorial)を表示するプログラム
  • 指定数はコマンドライン引数で指定できる
  • 20を指定したときの表示は以下
    1! = 1
    2! = 2
    3! = 6
    4! = 24
    5! = 120
    6! = 720
    7! = 5040
    8! = 40320
    9! = 362880
    10! = 3628800
    11! = 39916800
    12! = 479001600
    13! = 6227020800
    14! = 87178291200
    15! = 1307674368000
    16! = 20922789888000
    17! = 355687428096000
    18! = 6402373705728000
    19! = 121645100408832000
    20! = 2432902008176640000
  • 引数が指定されなかったときは1の階乗

 それぞれの言語のプログラムを、以下のPerlワンライナーを使ってカッコを数えました。

perl -e ‘$_=join//,@ARGV;print s/[(){}\[\]]//g||0’ `cat filename`
perl -nle '$a+=tr/(){}//}{print$a' filename

※追記: 角カッコも数えたほうがいいと指摘されたのでワンライナーの正規表現に角カッコを追加しました。

※追記: dankogaiさんにワンライナーの添削をされてしまったので修正しました。

使用言語

 長くなってきたのでリンクを貼ります。

Java

 まずは一番苦手なJavaで書いてみました。

import java.math.BigInteger;
public class Factorial {
  public static void main(String[] args) {
    int n = (args.length == 0) ? 1 : Integer.parseInt(args[0]);
    BigInteger acc = BigInteger.ONE;
    for (int i=1; i<=n; ++i) {
      acc = acc.multiply(BigInteger.valueOf(i));
      System.out.println(i + "! = " + acc);
    }
  }
}

 カッコの数は24個です。

※追記: @cocoatomoさんがコメントでおかしい点を指摘してくれたので修正しました。

 Javaの三項演算子の条件項はカッコがなくても動くようですが、Sunのコーディング規約に「"?"の前に二項演算子があるときはカッコをつけろ」と書いてあるのでつけました。

Scheme

 苦手な気がする順にいきます。次はScheme(Gauche)です。

#!/usr/local/bin/gosh

(use srfi-1)

(define (fact n)
  (if (zero? n) 1
    (* n (fact (- n 1)))))

(define (main args)
  (for-each
   (lambda (i) (print i "! = " (fact i)))
   (iota
    (if (null? (cdr args)) 1 (string->number (cadr args))) 1)))

 カッコの数は42個です。最後の行は本当は(or (cadr args) 1)とか書きたかったのですが、Schemeでは(cadr ‘(“hoge”))がErrorになるので引数の数を調べないといけません。面倒ですね。

 また、これはJavaのコードに比べると少し非効率です。Javaのコードが1回のループで済むのに対して、このコードはループの中で回数分のfactの呼び出しがされます。これを回避するにはmemoizeを使えばいいのですが、面倒なのでやめます。

※追記: @yadokarielectri さんから指摘を受けてコードを修正しました。

※追記: @valvallow(Twitter)さんからfoldを使うfactの例を教えてもらいました。詳細はコメント参照。Scheme=再帰っていう発想しかなかったぜ!

※追記: @illness072さんの例。カッコは20個で、素直なコードではカッコが一番少なそうです。

;; カッコは20個
(use srfi-1)

(fold (lambda (x y) (print (- x 1) "!= " y) (* x y)) 1
      (iota (x->integer (get-optional *argv* 1)) 2))

※追記: Shiroさんがコメントで例を2つ投下してくれました。Schemeでカッコ18個ってなんぞ…。

#!/usr/bin/env gosh
(use gauche.experimental.app)
(define (bar i)
  (if (= i 0)
      1
      (rlet1 r ($ * i $ bar $ - i 1)
             (print i "! = " r))))
($ bar $ x->integer $ get-optional *argv* 1)

※追記: koguroさんがコメントでカッコ16個の例を…。Gauche限定ですが一応動くようです。なにこれすごい。

(dotimes (i (x->integer (get-optional *argv* "1")))
   (set! SIGHUP (* SIGHUP #0=(+ i 1)))
   (print #0# "!=" SIGHUP))

※追記: さらにShiroさんがchatonでカッコ2個の例を…。

http://practical-scheme.net/chaton/gauche/a/2010/08/26#entry-4c767601-54916

JavaScript

 次はRhinoで動かしたJavaScript。

var fact = function (n) {
  return n ? n * fact(n - 1) : 1;
};

for (var i=1; i<=(arguments[0]||1); ++i) {
  print(i+"! = "+fact(i));
}

 カッコの数は18個です。ロジックはSchemeと同じですね。Schemeと同じく非効率です。JavaScriptなのでfor文で回せば効率もいい気がしますが、JavaScriptなのでどうでもいいです。

※追記: コメントでEhren(Twitter)さんがJavaScriptの例を追加してくれました。

for(n=m=1,z=arguments[0]||1;z>=n;n++,m*=n)print(n+”! = “+m)

 これならカッコは4個です。角カッコを入れると6個ですが、角カッコも入れたほうがいいのかな? 入れるとLisp系は特に影響がないけどJavaとJavaScriptが不利に…。

 角カッコもカウントするようにしました。カッコは6個です。

Clojure

 次はClojureです。

#!/usr/bin/clj

(defn fact []
  (letfn [(fact-seq [n acc]
             (lazy-seq
               (cons acc (fact-seq (inc n) (* (inc n) acc)))))]
    (fact-seq 1 1)))

(let [n (Integer/parseInt (first *command-line-args*))
      facts (take n (fact))]
  (dotimes [i n]
    (print (format "%d! = %d\n" (+ 1 i) (nth facts i)))))

 効率を考えてlazy-seqを使って、先に階乗のリストを取ってくるようにしました。最後のdotimesでnthを呼ぶあたりが苦しいですが、まあ仕方ないのかなぁ。

 Clojureは他の言語と違った角カッコも数えたほうがいいと思うので、ワンライナーの正規表現部分を少し変えました。カッコの数は50個です。Clojureはところどころ角カッコなのでそれほど気にならなかったですが、カッコ自体はかなり多いんですね。

※追記: pokarimさんがコメント欄でClojureの例を出してくれました。

 まずはdoseqを使った例。カッコの数は20個です。

(doseq
    [i (range 1 (inc (Integer/parseInt (nth *command-line-args* 0 "1"))))]
  (printf "%d! = %d\n" i (apply * (range 1 (inc i)))))

 下はloopを使った例。カッコの数は22個です。

(loop [n 1
       acc 1
       to (Integer/parseInt (nth *command-line-args* 0 "1"))]
  (when (<= n to)
    (printf "%d! = %d\n" n acc) 
    (recur (inc n) (* (inc n) acc) to)))

 さらに違う実装も。計算量も同じでカッコが18個に。

(reduce #(do
           (printf "%d! = %d\n" (- %2 1) %1)
           (* %1 %2))
        (range 1 (+ 2 (Integer/parseInt (nth *command-line-args* 0 "1")))))

 pokarimさんの例は僕のものより高速ですし、Clojureのカッコ数は18を採用します。

Common Lisp

 さてさて、Common Lispです。処理系はSBCL 1.0.29です。

#!/usr/local/bin/sbcl --script

(loop for i from 1 to (or (parse-integer (cadr *posix-argv*)) 1)
      for acc = 1 then (* acc i)
      do (format t "~a! = ~a~%" i acc))

 効率とか考えたらloopになりました。決してカッコを減らすためではありません。効率を考えていたら偶然カッコが減っていたのです。

 カッコの数は12個です。

※追記: kurohuku さんがさらに頑張ってくれました。

(set-macro-character #\! #'(lambda (stream char) (read-delimited-list #\$ stream t)))
! loop for i from 1 to ! read-from-string ! or ! car ext:*args* $ "1" $ $ for acc = 1 then ! * acc i $ do ! format t "~A! = ~A~%" i acc $ $

 カッコの数は8個。…ってリードマクロはチートじゃないですかw すべてのCLプログラムはカッコ数8個以下w

Perl

 Perlが一番得意っていうとそうでもないですが、最後はPerlです。

sub fact {
    my $n = shift;
    if ($n == 0) {
        return 1;
    }
    else {
        return $n * fact($n - 1);
    }
}

my $n = shift || 1;
for (1..$n) {
    printf("%d! = %d\n", $_, fact($_));
}

 バカ正直に書くとこんな感じになりました。カッコの数は18個です。

 しかし、これはPerlです。”There are too many ways to do it.”です。こんな退屈なコードはやめましょう。

 たとえば、関数factの中のif文は三項演算子で書き直すことができます。また、定義済みの関数はカッコなしで呼ぶことができます。さらに、for文は後置できます。書き直すと以下のようになります。

#!/usr/bin/perl

use warnings;
use strict;

sub fact {
    my $n = shift;
    $n ? $n * fact($n - 1) : 1;
}

printf "%d! = %d\n", $_, fact $_ for 1..shift || 1;

 カッコの数は4個! 驚異的です。

まとめ

Java24
Scheme20
JavaScript16
Clojure18
Common Lisp12
Perl4


 ほら! JavaよりCommon Lispのほうがカッコが少ないですよね! ってかPerl…。

 まあ! ということで! カッコが嫌いな人はJavaではなくCommon Lispをやりましょう :)

他の言語

 他にmiyamukoさんがコメントでRubyのコードを書いてくれました。カッコは0個です。endでブロックを表すとかずるい…

 あと、アリエルのHaskeller、藤田さんがHaskellのコードも書いてくれました。カッコは8個です。本気出せばもっと減るらしいですが…

転載元: http://ideone.com/ItWtS

main = mapM_ (uncurry p) $ take 21 $ zip [0..] $ scanl (*) 1 [1..]
    where p i n = putStrLn $ show i ++ "! = " ++ show n

 rokujyouhitomaさんがコメントでPythonのコードを書いてくれました。コメント欄のせいでインデントが可哀想なことになっていたので転載。

import sys

def fact(n):
   if n == 0:
       return 1
   return n * fact(n-1)

if __name__ == '__main__':
   for i in xrange(1, int(sys.argv[1])+1):
       print("%s! = %s" % (i, fact(i)))

 これはカッコが16個。

import sys

fact = lambda n: 1 if n==0 else n * fact(n-1)

if __name__ == '__main__':
   for i in xrange(1, int(sys.argv[1])+1):
       print("%s! = %s" % (i, fact(i)))

 こっちはカッコが14個。

 さらに西尾泰和さんがPythonでカッコを0個に! (角カッコはカウントしていない?)

第2回 偏屈文学サロン的シンポジウムを開催しました

| 【5分で読めるよ!】 | コメント(0) | トラックバック(0)

 人数を調整したかったので大々的な募集はしていませんでしたが、今日、第2回 偏屈文学サロン的シンポジウムを開催しました。

 面白い会でしたし、せっかくなのでまとめておきます。

主旨

 「文学サロン」と言うと文学の話をしなきゃいけないと思ってしまいますが、そもそも文学サロンというのは有識者が集まってわいわいと酒を飲みながら議論を交わす会だったらしいです。聞いた話ですけどね。議題は基本的に何でもよく、文学を離れて政治などについて議論することも多かったようです。まあ聞いた話なんですけどね。

 そこで、現代でもそれをやろうと思い、Twitter上で知り合いの偏屈な人たちを集めて飲み会をしようという考えで始まりました。そのため参加者はプログラマに限りません。むしろいろいろな職業のほうが議論も多様化して面白いでしょう。

参加者紹介

 参加者は以下の4人です。声をかけた人数はもうちょっと多かったのですが、皆来られず集まったのは4人でした。終わってからの感想ですが、むしろこれくらい少人数のほうが議論もテンポよく進んでよさそうです。

 雑談は多岐に渡り、リア充とは、クラウド合コン、クソゲーなどなど。#henkutsuを見れば話した内容が少しだけ追えます。

Lightning Talk

 第1回は普通の飲み会だったのですが、今回は参加者でLightning Talkもやりました。少人数なので居酒屋でMacBookを持ち込んでプレゼンしました。

 以下はプレゼン内容です。

「偏屈のスゝメ」 by @meymao

 偏屈とは何か。偏屈の素晴らしさ。偏屈は頑固とは違う。偏屈はもっと評価されるべき。そんな熱い偏屈論でした。

「突撃砲の歴史」 by @IMAGEDRIVE [発表資料]

 突撃砲(戦車)の誕生から戦場での役割、終焉まで。iPadのKeynoteでの発表でした。電子書籍の話じゃなかったのか!

「偏屈な死に方」 by @okuramasafumi

 大倉氏はスライドなしの口頭LT。

「人間性が最も現れるのは死に際である。偏屈な人間は偏屈な死に方をしているはずだ」ニーチェの死に様は皆真似しないように(むしろ積極的に真似すべき?)。

「Lisp Poetry」by @nitro_idiot [発表資料]

 Lispで詩を書いてみました。資料は自作のプレゼンツール「L5」で作り、PDFに変換してSlideshareにアップロードしました。

書籍交換会

 さらに今回は、参加者がお互いおすすめの書籍を持ち合って交換する催しもしました。あみだくじアプリがなかったので以下のワンライナーを2回走らせて交換相手を決めました。

alias randomize="perl -MList::Util=shuffle -E 'say for shuffle @ARGV'"

 以下は交換内容です。

「人間の土地」サン=テグジュペリ

 サン=テグジュペリの本は「星の王子様」しか知りませんでした。かなり真面目に選んでくれたようなので、たまには紙の本も読もうと思います。


「リナックスの革命」ペッカ ヒマネン他

 プログラマがいない会なのでさすがに技術書を渡すのは憚られ、読み物として面白いものを選びました。ハッカー倫理を労働倫理と結びつけて考察している点が面白いです。

 面白いんですが、肝心の本を家に忘れてしまいました :p @IMAGEDRIVEさんすいません。また今度会ったときに渡します><


「寺山修司少女詩集」寺山修司

 「え、あたいは何を渡せばいいんだろう。あたいが持ってる本ってみんな持ってそうだしなぁ。詩だったら読むだろうし」ってことで詩集だそうです。@okuramasafumiはPerlで詩でも書けばいいと思う。


「本を読む本」M.J.アドラー C.V.ドーレン

 タイトル通り、読書をするための本らしいです。

まとめ

 Lispから戦車まで、幅広い話があって4時間近く話し込んでしまいました。思ったよりもいい会になってよかったです。早くも第3回の話まで出ていますが、第3回は半年後の2月開催かな?

 会合だけでなくサイト運営も考えているのですが、こっちはなかなかまとまりそうにないです。ドメインは取ってしまったので、この会に興味がある人は僕に連絡ください。えーと、飲みにでもいきますか?

L5が実行時にスライドを逐次更新できるようになりました

| 【1分で読めるよ!】 | コメント(0) | トラックバック(0)
※重要 この記事は古いです。新しいバージョンに移動する

 つい先日、L5というプレゼンツールを公開しました。

 ただ、公開したとはいえ、L5はまだ開発が続いています。今日、新機能を2つほどつけたので紹介します。

新機能1 ホットリローディング

 今まではテキストエディタでスライドを書いて、一度プレゼンの画面を確認したいと思ったときは、L5自体を再起動するしかありませんでした。それもすぐに起動してくれるならいいのですが、何せClojureなので再起動に時間がかかってしまいます。

 そこで、L5自体を再起動させずに、実行時にスライドを再読み込みする機能をつけました。使い方はフレームで「R」キーを押すだけです。試してみてください。

 そのうち「R」を押すのすら面倒になったら自動リロードに変わるかもしれません。

新機能2 実行中のL5にアクセス

 こちらは実装する気はなかったのですが、デバッグに楽だったのでつけました。

 まず、L5を別のターミナルで起動させておきます。

$ nc localhost 12345 25
clojure.core=> (ns L5.core)
nil
L5.core=> @(:current @*context*)
0

 上記のように実行中のL5にREPLでアクセスできます。用途はたぶんデバッグ以外ありません。デバッグが好きな人は試してみてください。

意見や報告や要望をください

 もし使ってみた人がいれば意見や要望をください。GitHub付属のIssuesか、Twitterに日本語か英語かS式でコメントしてくれたら返信します。

クリエイティビティを喚起しろ!

| 【4分で読めるよ!】 | コメント(0) | トラックバック(0)

 先日以下のような切れ端がTumblrを流れてきました。

「最近はデザインわかってないデザイナーもどきが多い」とは言うが、
まあ、そりゃそうなって当然だろうよ。
昨今、実践を通じてデザイナーが育つ場なんか、どこにもないんだから。

今時のデザイナーの求人は、全て実務経験者のみ。
実務経験○年以上が当たり前。
アシスタントなんか募集している会社は、ほぼ無い。
非正規での募集は多いが、まともなヤツはまず応募しないね。
正社員じゃないと職歴(実務経験)扱いされないからね。

つまり今、だーれもデザイナーを育てていないんだよ。
こうしている間も、日本ではデザイナー育成が完全ストップ状態。
後継者なんか期待するなよ? 今後まず現れないだろうから。

実務経験の壁を知っているから、若者はもうデザイナーなんか目指さないよ。
これから零細企業は、残り少ない高齢デザイナーを
死に物狂いで奪い合うしか生き残る道が無い。


これからの時代、一からデザイナーを育てる体力のない企業は
ただ滅びるにまかせるだけなのさ・・・

 そう言われると確かにデザイナという人間は周りにあんまりいないように思います。少なくとも僕はデザイナ的デザイナに会ったことはありません。ひょっとするとデザイナというのはいない、もしくは非常に希少な存在なのかもしれません。

 けれど、デザイナが求められなくなっているというわけではないでしょう。何かを作り出すことがあれば、自然とそれをデザインするという行為も必要になるはずです。僕自身もプログラムという創造物を生み出しますし、そのデザインにはよく苦慮します。

 デザイナはいないのにデザインするものはなくならない。これは本当に恐ろしいことです。

 僕も自分のプログラムを、いつまでもいるのかわからないような存在にまかせることはできません。そこで僕はデザイナになることにしました。

デザインとは何か

デザイナーはファインアーティスト(純粋な芸術家)ではなく、コマーシャルアーティスト(商業的な芸術家)であることだ。つまり、自分のために服をつくるのではなく、クライアント(得意先)に対して服をつくらなければならない。

 創造するという行為には二つの種類があります。一つは自分の表現したいものを作るということ。もう一つは顧客の欲しいものを作るということ。そして多くの創造行為はこの二つの両方を兼ね合わせたものと見ることで説明ができます。

 たとえば、自分の表現したいものを最大化し、顧客の利益を無視したものを創造する行為には名前があります。それは俗にアートと呼ばれるものです。特に実利を求められず、アーティストは自分の望むものを自由に創造できます。  一方、実利のみを追い求めたものというのは特別な名前はついていませんが、玄人受けする作品にはよく見られます。

 もちろん、どちらか一方に偏っている必要はありません。実利のバイアスを受けた中で、どのように自己を表現できるか。これがデザインにおける最も挑戦的な課題です。いくら自分がクールだと思うデザインをしてもそれを誰も欲しがらなければ意味がありません。そして僕はこれこそをクリエイティビティと呼ぼうと思います。

iPhone vs Android

 たとえば、デザインという視点からiPhoneとAndroidを比較してみましょう。この二つは同じスマートフォンであり、これから市場のシェアをどちらが占めるかという点は注目されています。面白いのはこの二つがデザイン性という観点から見ても正反対なところです。

 iPhoneのデザインはクールです。UIは統一されており、ユーザが機能を探して迷子になることはありません。iPhoneアプリを作る側から見ても、誰が作っても素晴らしいUIになります。

 一方でAndroidのデザインはそれほど洗練されていません。Androidのクールな点は機能面が充実していることです。マルチタスクやアプリの常駐は当たり前のようにあります。

 これだけを見ると、どちらも利点欠点が均衡しているように見えます。しかし、未来を考えればそうとも言えません。

 iPhoneは最新のOS、「iOS4」で多くの新機能が盛り込まれました。今までなくて不便だったマルチタスクが実装されましたし、ホームでアイコンをフォルダ分けできるようになりました。一方でAndroidの最新版、「2.2 Froyo」で目立った変更点はJITによる処理の高速化程度です。デザインに関する変更点はまったくないのです。

 デザイン的な価値がその見た目と実利にあるとすれば、iPhoneはその両方に最大化する方向に動いたのに対し、Androidは実利をさらに推し進めたと見ることができます。

 この動きの延長として未来を想像してわかるのは、将来的にはiPhoneのシェアは確定的になり、Androidは二位に落ち着くだろうということです。

 僕の予想では、これからはデザインが良いものしか受け入れられない時代が来るでしょう。そのためにも今のうちに自分のクリエイティビティを磨くことは大事です。

クリエイティビティを喚起しろ!

 このクリエイティビティというのはどのように高めることができるのでしょうか。僕の考えでは以下の二つがあります。

1. クリエイティブなものに触れる

こういう嫌な細かい問題の何が嫌らしいかというと、 それから学べることが何もないということだ。 コンパイラを書くのは面白い。それによって、コンパイラとは何かが学べるからだ。 バグだらけのソフトのインタフェースを書くことからは何も学べない。 バグはランダムだからだ。ハッカーは単に気難しいから嫌な細かい問題を避けるんじゃない。 それは、むしろ自己防衛の問題なんだ。嫌な細かい問題に関わっていると、バカになる。 良いハッカーがそれを避けるのは、 ファッションモデルがチーズバーガーを避けるのと同じ理由だ。
Great Hackers by Paul Graham

 以前、デザイナと働いているプログラマが、「デザイナはデザインの悪いBTSを使いたがらない」という話をしているのを聞いたことがあります。デザイナは本当にクリエイティブなものを知っています。そしてそれは同時にクリエイティブでないものを知ることにもなるのです。ファッションモデルがチーズバーガーを避けるのと同じように、この嗅覚はデザインを知っているという指標として良いものと言えるでしょう。

2. クリエイタは何を考えているのか?

 クリエイティブなものに触れることは自分のデザインセンスを測る良い指標になりえますが、それだけではデザインすることはできません。重要なのはその創造物ではなく、創造という行為だからです。これを創造した人間が何を見て、何を考えてこのようなものを作り出したのか、それを考えることでデザイナの視点を学ぶことができるでしょう。

 これを端的に表すなら、優秀なデザイナを念頭に置き、そして彼なら目の前のものをどのようにデザインするだろうと考えることです。

まとめ

  • デザインは自分と世界の兼ね合い
  • iPhoneはクールだ
  • 「Appleならこれをどうデザインするだろう」

S式で書くプレゼンツール「L5」を作りました

| 【4分で読めるよ!】 | コメント(0) | トラックバック(0)
※重要 この記事は古いです。新しいバージョンに移動する

 夏ですね。夏といえばオープンソースの季節です。みんなオープンソースしていますか? 僕は風邪を引いています。

「うぅ、苦しい。死ぬ。僕が死んだら僕のGitHubに残されたオープンソースプロジェクトたちを頼む……」

 えっと、新しくS式で書くプレゼンツールの「L5」を公開しました。

http://github.com/fukamachi/L5

「L5」って何?

 「L5」はLisperによるLisperのためのプレゼンテーションツールです。S式でスライドを記述し、スライドショーを表示します。

 たとえばこんな感じ。

(p (with-title "自己紹介"
       (item "深町英太郎です"
             "Webプログラマ"
             "Lisper (CL, Clojure)"
             "Perl5, JavaScript..."
             "オープンソース愛好家")))

 pはページを表していて、with-titleで上の表題、itemが箇条書きを表しています。

 スライドショーではこんな感じになります。

Screenshot.png

 本体はClojureで実装されており、ここの中ではすべてのClojureコードが使えます。これは既存のAPIを使って自分の好きなようにマクロでラップできるということです。この透過性はLisperにとって天国になりえるでしょう。L5はLisperのためのプレゼンツールです。

なぜ新しく作ったの?

 名前の由来は言うまでもなく、amachangさんの「S6」(前バージョンはS5)です。S6はJavaScriptとHTMLで記述できるプレゼンツールで、PowerPointのようなGUIのプレゼンツールを好まない技術者層によく使われています。テキストエディタでも気軽に書けるプレゼンツールという点ではL5もS6と同じです。

 テキストベースのプレゼンツールは他にもあります。けれど、構文が複雑だったりおまじないコードが多かったり、ものによっては簡潔さのためにパワー不足になっているものもあります。

 これらはマクロを持つLispがもっとも得意とする分野です。僕は自由度が高く簡潔な構文を持つ(またそれを自分で定義できる)プレゼンツールが欲しかったのです。

インストール

 あらかじめLeiningenがセットアップされていることを確認してください。(Clojure本体は必要ないかも?)

$ git clone git://github.com/fukamachi/L5
$ cd L5
$ lein deps

使い方

 L5はLeiningenのプラグインの一つである、lein-runを使っています。これはローカルアプリケーション用にターミナルからLeiningenプロジェクトを起動できるプラグインです。

 プレゼンを始めるには以下のコマンドを実行します。

$ lein run presen

 ソースを何も変更しない状態ではサンプルのプレゼンテーションが始まります。サンプルというか、アリエルの社内で発表したClojure勉強会の資料です。せっかくなので読んでみてください。

 起動してタイトルが表示されたら起動完了です。その後は矢印の左・右でスライドをいったりきたりできます。

 また、F5キーを押すとフルスクリーンモードに切り替わります。

記述方法

 lein run presenが実行されると、プロジェクトルートにあるinit.cljというファイルがロードされます。基本的にこのファイルを変更すればプレゼンを記述できます。デフォルトではsample.cljをロードするだけのコードです。

 L5は現在活発に開発が行われているので、APIはすぐに変わってしまうかもしれません。けれど現状のAPIはコードを読む人にとっても何らかのヒントになると思うので書いておきます。

  • p - ページ
  • with - contextのパラメータを変更して表示
  • item - 箇条書き(前置記号”・”)
  • lines - 一行ごとに記述
  • th - 内容をページ全体に最大化(TakaHashiの略)

 基本的にはこれくらいですが、他にいくつか便利なエイリアスがあるので、調べたい人はlayout.cljを見てください。

PDFへの出力

 プレゼンツールにPDF出力は欲しいです。まだ実装したてなので安定しませんが、L5にはPDFへのエクスポート機能が実装されています。

$ lein run export

 少し時間がかかるのですが、これを実行するとスライドの内容がoutput.pdfという名前で出力されます。

 ただ、さっきUbuntuで試してみるとスライドが大幅にずれていました。Javaの「Write once, run anywhere」にだまされた感じです。そのうち対応するのでそれまでお待ちください。Macでは正常に動くはずです。

 output.pdf [SlideShare]

ロードマップ

 L5は未完成の代物です。現状でも足りないと思える機能がいくつも思い当たります。

  • 画像や動画を埋め込めるようにする
  • スライドショー中に変更した記述をリロードできる機構を用意
  • スライドショー中にコンソールに次のスライドの内容を表示
  • 独立したJARファイルにしてポータビリティを増す
  • Twitterハッシュタグとの連携
  • アニメーション
  • スライドの美しさ

まとめ

 勉強会で発表することがあれば、プレゼンツールは数ヶ月に一回は使うものです。その長さは30分だったり5分だったり。レイアウトもさまざまだったり。

 プレゼンツールに自分を合わせるのではなく、自分に合うプレゼンツールに仕立てられるツールにしていきたいです。

このアーカイブについて

このページには、2010年8月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2010年7月です。

次のアーカイブは2010年9月です。

Ariel Labs
Name:深町英太郎
Age:23歳
Living:京都府
Company:はてな
Hatena Id:id:nitro_idiot
Facebook:eitarow.fukamachi
mixi:ID:6756132
Twitter:nitro_idiot
GitHub:fukamachi
LinkedIn:eitarowfukamachi

最近のコメント

Techonrati

Technorati search

» リンクしているブログ

Powered by Movable Type 4.23-ja