トップ 追記

Route 477

過去の日記


2014-04-15

[lifehack] センスを磨く方法

よくセンスがある、ない、みたいな言い方をするけど、インターネットのどこかで見かけた「センスは有り無しではなく磨くものである」という言葉が気に入っている。
実際センスがある人だって、生まれた瞬間にはセンスなかったはずで、人生のどこかで徐々に獲得したはずだから、磨くものであるという表現は正しいと思う。

ところで、センスを磨くための方法というのを考えたことがある。
それは「2つの選択肢を比較する」ことです。

よくお絵かき教室かなんかの広告で、「AとB、構図として良いのはどちらでしょうか?」みたいなやつがある。
真っ白な紙を渡されて「良い構図を考えてください」と言われてもお手上げだけど、2つの選択肢から選ぶだけなら、絵の素養がなくても考えやすい。

プログラミングでも、ソースコードが綺麗とか、設計にセンスがあるとか言うけど、これも2つの書き方を両方試してみて、どちらがどのように良いか考えるというのを繰り返すことで徐々に良くなっていく。今でもインデントをどうするかとか、mapとeachのどっちで書くのが読みやすいかとか、このデータをどっちのクラスに持たせるのが保守性が高そうとか、よく試行錯誤してる。

これを繰り返すことで、判断が無意識レベルまで昇華された状態が「センスがある」というやつなのかなぁと。
(プロ棋士が、具体的な手を読み始める前に直感で「なんとなくこの手が良さそう」と感じるがごとく。)

まとめると、センスという言葉は「良さ」が数値化できない分野において使われるもので、最初から「良い」ものを提示することは初心者には困難だが、「2つのうちの良い方」を判断することを繰り返すことで、徐々に良いものを作れるようになるのではないかと思っています。


2014-04-14

[softs] Rails製のTODOアプリ「Tracks」をセットアップしてみた

最近またTODOアプリを使おうとしてるのだけど、MacでもAndroidでも使えて、そこそこ複雑なことができて、見た目が気に入るやつがなかなか見つからなかったので、Tracksという、自分でセットアップするタイプのGTDアプリを試してみることにした。

http://getontracks.org/

TracksはRailsで書かれていて、githubにソースがある。スクリーンショットのページを見るとどんなものか分かりやすいかも知れない。

bitnamiというところでVM(?)を配ってるので、これを入れるととりあえずローカルで動かせるようだけど、今回はソースから動かしてみる。

インストール

基本的に https://github.com/TracksApp/tracks/blob/v2.2.2/doc/installation.textile を上から順にやるだけ。

  1. ソースコードの取得。zipを解凍するか、git cloneしてからgit checkout v2.2.2するなど。
  2. DBを決める。ここではSQLiteを使うことにします。 Gemfileを編集して、mysql2の行をコメントアウト。
  3. $ bundle install --without development,test
    • 環境によっては、nokogiriのビルドのために yum install libxml2-devel libxslt-devel などが必要
  4. config/database.yml.tmplをコピーしてconfig/database.ymlを作る。productionの項を削除し、その下にあるSQLite用のproduction設定を有効化する。
  5. config/site.yml.tmplをコピーしてconfig/site.ymlを作る。
    • salt, secret_token: 適当なランダムな文字列にする (例:$ ruby -rsecurerandom -e 'puts SecureRandom.hex(64)' )
    • time_zone: "Tokyo"など
    • subdir: '/'以外にデプロイする場合は指定
  6. Passengerとか使わない場合は、config/environments/production.rbを開いてconfig.serve_static_assetsをtrueにしておく(忘れるとスタイルシートが適用されない)
  7. $ bundle exec rake db:migrate RAILS_ENV=production
  8. $ bundle exec rake assets:precompile
  9. $ bundle exec rails server -e production → http://localhost:3000/ を開く

使い方

まずはユーザ名とパスワードを決めて、アカウントを作る。
右側のフォームからタスクを追加できる。「Add action」を押すと「Contextは必須です」と言われるので、とりあえずinboxとでも入力しておく。
Home画面ではこのContextによってタスクが分類されるので、home, work, shoppingなど、自分の分かりやすいように分ける。

その他Tips。

  • ProjectsはGTDでいうプロジェクトで、複数のタスクから成るような大きなTODO (「引っ越し」とか) を管理するためのもの。
  • Ticklerは「Show from」に日付があるタスクの一覧。特定の日を過ぎてから表示させたいタスクに使う。
  • タスクには☆を付けることができ、Starred欄からスター付きの一覧を見ることができる (用途としては、例えば「今日やるもの」にスターを付けるとか)。
  • 右下の「Mobile Site」をクリックするか http://localhost:3000/mobile にアクセスすると、モバイル用の画面になる。
  • Macの場合はfluidを使ってデスクトップアプリ化すると、ブラウザのタブを探す代わりにCmd-Tabでウィンドウを探せるので便利。

2014-04-01

[mac] Brewfileを使ってみた

最近のhomebrewだとデフォルトでbrew bundleコマンドが使えるらしい。Brewfileというファイルに入れるパッケージを書いておくと、(Rubyのbundlerみたいに) コマンド一発で必要なパッケージを揃えられるので、MacBookを新しくしたときに役に立つ。あとテキストファイルなので自分の入れてるパッケージを、「ツール」「ライブラリ」「開発用」「言語処理系」とか分かりやすくグループ分けして整理できるのが良かった。

homebrew-cask

この拡張を入れると、brewでMacアプリ(*.dmg等)も入れられるようになる。

$ brew tap phinze/cask
$ brew install brew-cask

alfred

Mac用ランチャーのalfredもcaskに移行してみた。

  1. まず今あるalfredを起動し、Quitする (今回はこれ忘れたのでps aux|grep Alfredでpid調べてkillした)
  2. brew cask install aflred
  3. brew cask alfred link

最後のやつは、caskで入れたアプリをAlfredから検索できるようにする設定です (caskは~/Applications以下にアプリを入れるので、そのままだとAflredで検索できない)。

よなよなエール 最高金賞 ビール ギフト セット 5種 10缶 金賞地ビール 3種 330ml×6本 飲み比べセット (金・琥珀・黒色ビール各2本)


2014-03-25

[games] Threes!

なんか世界で上位1%とかに入ったから(Android版)「このゲーム攻略したわwww」とか思ったけど、今日もっかいやってみたら全然良いスコアが出なくて困った。攻略してなかった。

Threesはモバイル向けのパズルゲームで、1とか2とかを足して大きい数字にしていく感じです。けっこうTLでスコアレポートを見てたから、有料アプリだったことに驚いた。

やってみるとグラフィックが綺麗だし、よく見るとそれぞれの数字に顔が付いてて、固有の名前とプロフィールとボイス(!)が付いてるとか、プロダクトへの愛を感じる仕上がりです。
流行ったモバイルゲーというとFlappy Birdを思い出すけど、あれは一人で作ってたんだっけ。Threesはスタッフ欄があるのでチームで作ってるみたいです。

戦略について

せっかくなので注意してるところを簡単に書いておきます。

2048というブラウザで遊べる類似アプリがあって、さらにそれを自動化したやつがあるので、これを眺めてるとなんとなく良い手順が分かります(というブコメがあったのでやってみたらその通りだった)。

具体的には。

形をよくする

端的な説明が難しいけど、下図みたいに「端に行くに従って数字が単調増加する」状態がよい状態です。逆に左上に1とか2とかが埋まってしまうと発掘が困難になり、デッドスペースと化してしまうので注意が必要。

48 24 12
24 12
6  
先読みする

Threes!の場合はネクストが表示されている(1, 2, 3, それ以上の4通り)ので、それを見ながら次の手を考えます。ネクストは移動があった列にしか出現しないみたいです。

基本的に、「形のよさ」が維持される手を選びます。

結合を急がない

「よしあと3手で大きい数字ができるぞ!」みたいな時でも、そのまま何も考えずに大きい数字を作りに行ってしまうと残しが絶望的になったりするので、結合を急いではいけません。徹底して、形のよさだけに注目するのが良いみたいです (もちろん大きな数字を作るのが最善手であるケースもありますが)。ついつい大きい数字に目が行きがちですが、盤面全体を見たほうが良いです。


2014-03-04

[biwascheme] R7RS Libraryについての調査

メモです。ソースはr7rs.pdf (final draft)。

だいたいこんな感じか?

;; ライブラリ stack
(define-library (stack)
  (export make-stack stack-push stack-pop)
  (import (scheme base))
  (begin
    (define (make-stack n)
       ...

;; メイン
(import (scheme base) (stack))

(define s (make-stack 10))
...
  • ライブラリ名は(net http)みたいに階層化する
    • (scheme ...)は言語により予約済
    • (srfi ...)も予約済
  • ライブラリ定義に書けるもの:

    • export : ここで指定した識別子がエクスポートされる
      • (rename a b)を使うと内部と違う名前でエクスポートできる
    • import : このライブラリが依存するライブラリを書く
    • begin : ライブラリ本体を書く
    • include, include-ci : ファイルをライブラリの本体部分に埋め込む
    • include-library-declarations : ファイルをライブラリの宣言部分に埋め込む
    • cond-expand : cond-expandした結果を、ライブラリの宣言部分に埋め込む
  • 実装例

    • 1. cond-expandを展開する
    • 2. このライブラリのための環境を用意する(importした束縛が含まれていること)
    • 3. すべてのbegin, include, include-ciを、それらが書かれた順にその環境内で展開する
    • あるいは(この節、よく分からなかった)
  • ライブラリのロード

    • 式を上から順に実行
    • ロードのタイミング:programやlibrary bodyがライブラリの定義を参照している場合は、それらの評価前にライブラリをロードする
      • あるライブラリが2回以上importされているとき、処理系は読み込みを2回以上行ってもよい*1
    • これはsyntax定義についても同様
    • ただし、例えばあるプログラムが(import (only (foo) a) (only (foo) b))と書いていた場合は、fooは1回だけ読み込むものとする

整理すると、あるライブラリが「2つ以上のprogram/libraryからimportされている」場合は2回以上読み込んでもよい。しかし「ある一つのprogram/libraryに2回以上importが書いてある場合」に関しては1回しか読み込んではいけない、ということか?わざわざ後者の注釈を付けたのは何故なんだろうなぁ(単純に速度の問題とか?)

ライブラリのimport (5.2)

programは1つ以上のインポート定義と、それに続くプログラム本体(式 or 定義 の列)からなる。
chibi-schemeで試してみたけど、確かに最初にimport書かないとエラーになった。あとchibiではライブラリは.sldという拡張子にするらしい

(import (scheme base) (scheme write))
(display "Hello, world!") (newline)
  • (import xx)

    • ライブラリ名 : ライブラリ全体を読み込む
    • only : 特定の束縛のみ読み込む
    • except : 特定の束縛以外を読み込む
    • prefix : 束縛に自動でプレフィクスを付けて読み込む
    • rename : 束縛のうちの特定の名前を置き換えつつ読み込む
  • 名前が重複した場合はエラー

  • importした名前をdefineやset!で上書きしようとした場合はエラーになる
    • ただしREPL内ではこれは許されるべき(should)

ファイルのinclude (4.1.7)

(include "xx" "yy")はファイル名を受け取り、それをその場に展開する (Rubyでいうload相当か)。

*1 のでライブラリのトップレベルに副作用のあるコードを書くときは注意、ということかな


過去の日記