小さな会社のFacebookページ制作・運用ガイド

Facebookはローカルな関係をネットに投影しているだけなのであまり面白さを感じないんだけど、店舗持っているヒトには良いツールなのかもしれないなぁと思ったので読んでみた。というより佳肴 季凛さんのFacebookの使い方上手だなぁと思ったので、Facebookも面白そうだなと思ったという。

要するに美味しいものが好きなだけなんですが、、、

オンラインからオフラインに導く施策をO2Oっていうらしい(知らんかった)。

本書は入門者向けの構成かな、インサイトの見方くらいしか見るとこなかった。もう少し、ソーシャルな方向から考えてる本のほうが良かったかな。

ズルデザStylusでモック体質の愛され★ウェブサイトみたいな

Rubyのヒトは迷わずSass+Compass使うのかもしれないけど、僕は見た目がすっきりしているStylusのほうが好きです。

Stylusのよいところ

  • Pythonっぽくかける
  • coffescriptっぽくもある
  • {}を極力使わなくていいので右手の小指に負担がかからない(Emacsユーザーは酷使するのは左手小指で十分)
  • Jadeを使えば全てインデントで統一できる
  • nibがある

Stylusのよくないところ

  • LESS2Stylusがない(twitter-bootstrap困る)

Sass関係ないですね。

ズルいStylus

ズルいデザインが良かったので、自分のためにStylus+nibで関数(mixin)にしておくことにした。CSSプリプロセッサのメリットはこういったデザイナーさんの知恵というかプロセスに名前を付けて単なる関数に落とし込めることだと思うんだけど、そういうライブラリはまだあんまないよなと思う。

こういう考え方はwebよりもPixateみたいなスマホとかそっち方面のほうが効果的なのかなぁ。

stylusにtext-shadowがなかったのでズルい線とズルいグラデーションしかやってない。ボックスとかは書くの飽きた。

最近プログラマー(僕はプログラマーじゃないんだけど)向けのデザインのスライドが増えてきて嬉しいですね。

もちろん予約した

ProductName スマートフォンデザインでラクするために
石嶋 未来
技術評論社 / 2499円 ( 2013-01-29 )


ジブリの森に行ってきた

先週ちょっと行ってきた。中は写真撮影禁止だが、外はOKなので少しだけ。

屋上にラピュタロボがおった。

1358941978

トトロもおった。

1358941977

正直あまり期待してなかったがいい意味で裏切られた。

自分のアタマで考える

今さら読んだが、基本的なことが書いてあったので、知らない人が読むと目から鱗なのかもしれない。

結局フレームワークにあてはめるのは単なる技術だからなぁ。フレームワークを駆使するのは「未来に通用する論理の到達点」の入り口に立つためであってという感じかなぁ。立たないってのはそれ以前の問題なので。結局その先が難しいんですよね。

知識とは「過去の事実の積み重ね」であり、思考とは「未来に通用する論理の到達点」です。

ProductName 自分のアタマで考えよう
ちきりん
ダイヤモンド社 / 1470円 ( 2011-10-28 )


ブレークスルーってのは論理の積み重ねとかフレームワークからは見いだせないと思う。フレームワークで過去の事実の積み重ねから枠を作っておいて、その枠を如何にに破壊するかというか、そんな感じだからなぁ。

「自分のアタマで考える」ってことはそういうことかなと思う。

化合物の入力にjava製のプラグインはもう流行んないだろうなぁと思った

NARのDatabase IssueにMMPのサービスが載るんだとか思いつつ、SwissBioisostereにアクセスしたら、構造描画にjava製のプラグインを要求するので使うのをやめた。

なんかが良いかなと思うが。chemdoodleのチュートリアルは結構面白いしbackbone.jsなんかと組み合わせられるんじゃないかなぁ。

あとで試す。

ビジネスの成功はデザイン

後半の湯山玲子さんの話が面白かった。

デザインとは、そこからあることを読み取って、その発見をもとにビジュアル化し、社会と共有、共感していく行為なのです。

ProductName ビジネスの成功はデザインだ
神田 昌典
マガジンハウス / 1470円 ( 2010-07-08 )


薦められていたので、今度読んでみようっと。

ProductName デュシャンは語る (ちくま学芸文庫)
マルセル デュシャン
筑摩書房 / 998円 ( 1999-05 )


ProductName 芸術起業論
村上 隆
幻冬舎 / 1680円 ( 2006-06 )


イノベーションを生みだすために必要なこと

リーン・スタートアップを読んだ。

リーン・スタートアップとは、スタートアップの成功確率を高める方策を集めたものである。

アイデアよりも実行すべきかどうか

「この製品を作れるか」と自問したのでは駄目。いまは、人間が思いつける製品ならまず間違いなく作れる時代だ。問うべきなのは「この製品は作るべきか」

検証できない仮説は意味ないですね。ただモチベーションを上げる手段としての仮説はアレだよなぁと。

ユーザーストーリーは検証による学びが得られてはじめて完結だと考えること

創薬プロセスももうちょっとこういったことを意識しないと駄目だろうなぁと思うが。

リーンスタートアップにおける製品開発プロセスでは「行わなければならない実験をプル信号としてそれに反応する」と考えるべきだ

ピボットのタイプに種類があることを知った。

  • ズームイン型
  • ズームアウト型
  • 顧客セグメント型

npm startのデフォルトはnode server.js

リンク切れてるっていう連絡をもらったので更新しておきました(2018/01/30)。


モデルにgoogle tasksのapiを使ってbackbone.jsでアプリをつくるチュートリアルを読んだ。

package.jsonのscriptsのセクションにstartがないのにnpm startでサーバーが立ち上がるのはなんでじゃろかー?って不思議だったので、ぐぐってみた。

npm startのデフォルトはnode server.jsらしい。

btask

Backbone.sync

RESTfulなAPIじゃない場合とか他のライブラリを使いまわす場合どうするのかなと思って調べてみたらBackbone.syncを上書きすればいいらしい。modelのほうはいじらないでsyncでよろしくやればいいみたい。

Backbone.sync = function(method, model, options) {
  var requestContent = {};
  options || (options = {});

  switch (model.url) {
    case 'tasks':
      requestContent.task = model.get('id');
    break;

    case 'tasklists':
      requestContent.tasklist = model.get('id');
    break;
  }

  switch (method) {
    case 'create':
      requestContent['resource'] = model.toJSON();
      request = gapi.client.tasks[model.url].insert(requestContent);
      Backbone.gapiRequest(request, method, model, options);
    break;

    case 'update':
      requestContent['resource'] = model.toJSON();
      request = gapi.client.tasks[model.url].update(requestContent);
      Backbone.gapiRequest(request, method, model, options);
    break;

    case 'delete':
      requestContent['resource'] = model.toJSON();
      request = gapi.client.tasks[model.url].delete(requestContent);
      Backbone.gapiRequest(request, method, model, options);
    break;

    case 'read':
      request = gapi.client.tasks[model.url].list(options.data);
      Backbone.gapiRequest(request, method, model, options);
    break;
  }
};

HUNTER×HUNTER 蟻編

Nexus7を導入してから漫画をよく読むようになった。ブックオフにいかんでもいいしな。蟻編は面白いので最後のほうをまとめて買ってしまった。ワンクリック恐るべし。

ProductName HUNTER×HUNTER 19: No.19 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


ProductName HUNTER×HUNTER 20: No.20 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


ProductName HUNTER×HUNTER 21: No.21 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


ProductName HUNTER×HUNTER 22: No.22 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


ProductName HUNTER×HUNTER 23: No.23 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


ProductName HUNTER×HUNTER 24 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


ProductName HUNTER×HUNTER 25 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


ProductName HUNTER×HUNTER 26: NO.26 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


ProductName HUNTER×HUNTER 27 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


ProductName HUNTER×HUNTER 28 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


ProductName HUNTER×HUNTER 29 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


ProductName HUNTER×HUNTER 30 (ジャンプコミックスDIGITAL)
冨樫 義博
集英社 / ?円 ( 2012-12-03 )


Backbone.jsのソースコードを読んだ

日本語のアノテーションがついているソースコードを読んだので、ちょっとわかりにくかったあたりをメモっておく。

コールバックリスト(107行目)

リスト構造にしてあんのかなと思ったがtailってなんだろうと思ったら最後尾を常に指すようにしているらしい。

while (event = events.shift()) {
  list = calls[event];
  node = list ? list.tail : {};
  node.next = tail = {};
  node.context = context;
  node.callback = callback;
  calls[event] = {tail: tail, next: list ? list.next : node};
}

これは最後尾のobjectのnextとtailが同じ物を指すようにしているのでさくっと最後に空のオブジェクトの参照を保持している。全てのコールバックを実行するのはnextでたどればいいようになっている。Spine.jsは普通に配列使っていたけどリストにするメリットはなんかあるのかなぁ。

実際の動きはこんな感じ。

> node = {}
{}
> node.next = tail = {}
{}
> node.context = "ctx1"
'ctx1'
> node.callback = "callback1"
'callback1'
> calls = {tail: tail, next: node}
{ tail: {},
  next: 
   { next: {},
     context: 'ctx1',
     callback: 'callback1' } }
> list = calls
{ tail: {},
  next: 
   { next: {},
     context: 'ctx1',
     callback: 'callback1' } }
> node = list.tail
{}
> node.next = tail = {}
{}
> node.context = "ctx2"
'ctx2'
> node.callback = "callback2"
'callback2'
> calls = {tail: tail, next: list.next}
{ tail: {},
  next: 
   { next: 
      { next: {},
        context: 'ctx2',
        callback: 'callback2' },
     context: 'ctx1',
     callback: 'callback1' } }

tailとnextは同じ空のオブジェクトを指しているので、常に次の参照を保持したまま大きくなっていく。

void 0 (283行目)

void 0はundefinedになる。

> void 0
undefined

success = option.success (342行目)

if (success) success(model, resp);って何やっているのかなぁと思ったのだが、opttion.successを上書きしてしまうので、元々のoption.successを残しておいてコールバックで呼び出しているだけだった。

var model = this;
var success = options.success;
options.success = function(resp, status, xhr) {
  if (!model.set(model.parse(resp, xhr), options)) return false;
  if (success) success(model, resp);
};
options.error = Backbone.wrapError(options.error, model, options);
return (this.sync || Backbone.sync).call(this, 'read', this, options);

},

element (1190行目)

$elとelが存在する。

this.$el = (element instanceof $) ? element : $(element);
this.el = this.$el[0];

ステートフルJavascriptを読んであればそんなに難しくないので、コードリーディングにちょうどいいかも