The jonki

呼ばれて飛び出てじょじょじょじょーんき

レザークラフト始めました

f:id:jonki:20150314151701j:plain

唐突ですが、レザークラフト始めました。理由としては色々あるんですが、これまで電子工作、3D CADなどでやってきたように、自分と遠い分野のスキルを色々身につけたいと思ったのが大きな理由の一つ。とりあえず何も知識ないまま開始しました。

まずは道具集め!ということでAmazonでクラフト社のセットをポチ。クラフト社はレザークラフト界では大手だと思います。これが1万円ちょっと。更に知識0だったので初心者本も購入。作例が7つぐらいあってチュートリアル式に少しずつレベルを上げることができます。知識0からレザークラフトの作業をひと通り学べました。ちなみにこのスタンダードセットにはカード入れケースの工作セットがあるので、これだけでレザークラフトデビューができます。

はじめてのレザークラフト

はじめてのレザークラフト

本には写真がかなり詳しく書いてありますが、ところどころわかりにくいところなど下記サイト管理者様の初心者用動画に助けられました。実店舗、ネット店舗のオススメも出してくれているので助かります。

お買い物

東京の実店舗としては、浅草や秋葉原に多くあるようですが、近場のこの辺に行っています。

誠和という大手の直営店が入っています。そこまで広くないですが、道具も革もひと通り揃っています。お買い得品が多いわけではないですが、それでも十分な製品カバーだと思います。

ユザワヤって布だけかと思ってましたが、立派なレザークラフトコーナーがありました。キーチェーンやハトメなどの小物ももちろんあります。革もやすいハギレから大きなものまで一通りありました。ただコーナーが綺麗に整理されていないので少し探しにくいかも。

実用レベルを目指して

本に合った内容を一通り(7品くらい)作ってみたところ、完成度としてはかなり微妙、というか失敗ばかり。もちろん機能的には問題ありませんが、貼り合わせやコバ磨きが汚すぎて到底使おうとは思えませんでした。。そこでこれまたAmazonで下記の本をポチリ。

大人のレザークラフト [一流プロがこっそり教える] (Professional Series)

大人のレザークラフト [一流プロがこっそり教える] (Professional Series)

  • 作者: スタジオタッククリエイティブ
  • 出版社/メーカー: スタジオタッククリエイティブ
  • 発売日: 2013/01/25
  • メディア: 単行本
  • この商品を含むブログを見る

内容としては、初心者用というよりは脱初心者、完成度の上げ方、にフォーカスをあてている本です。解説も丁寧なので作り方が分からない、というところはないと思います。この本に載っているものをいくつか作ったので記念に写真を載せています。残念ながら私の作ったものは本の作例と比べるとかなり残念…。ですが、貼り合わせやコバ磨きなど、きれいな仕上げのための方法が満載なので、何回もトライしてレベルを上げろ!って感じです。ちなみに材料費は革によってピンきりです。使った革は1DC(100cm2)の値段が30円~300円ぐらいです。動物の種類、色、加工処理、厚さ、糸(色、厚さ)いろんな組わせを試せるので自分好みに仕上げられて楽しいです。


f:id:jonki:20150314151546j:plain

キーケース
f:id:jonki:20150314151824j:plain

カード入れ
f:id:jonki:20150314151853j:plain

ミニ財布
f:id:jonki:20150314152021j:plain

コインケース
f:id:jonki:20150314152132j:plain

最後に

3個ぐらい作ったところで飽きるかと思ってましたが、意外にもハマってます。上に載せたキーケースは実際に使ってます。もっと上達していけば、実用的でオリジナルな作品が作れるそうです。また電子工作とか3Dプリンターとかもせっかくやってきているので、このあたりの異分野コラボ作品も作っていきたいです。

おうちハック発表会#2 でLTしてきた

おうちハック発表会#2で、おうちハックアドベントカレンダーで書いた下の記事を発表してきました。


ちょっと未来のティッシュケースを考えてみた - The jonki


発表してきた記事はこちらです。

今回は3Dプリンターで作ってきたものも持っていったのですが、興味がある人が結構たくさんいて嬉しかったですね。今後ともたくさん役に立つたくさん記事を書きたいですね。

f:id:jonki:20150201215536j:plain

JavaScript/Node.jsで使えるステートマシンライブラリMachina.jsを試してみた

Machina.jsJavaScript/Node.jsでステートマシンを扱えるフレームワークです。最近私が書いているNode.jsのコードでステートマシンを導入したら、便利になりそうなところがあったので導入してみました。Machina.jsを日本語で取り扱っている記事が見当たらなかったので、参考になればと思います。なんと呼べばよくわかりませんが、とりあえず私はマキナと呼んでいます。

ステートマシンって?

いわゆる有限オートマトンFSM:Finite State Machine)です。システムの有限個の状態とその関係を遷移という矢印でつないだものですね。if文をたくさん書いて汚いコードになってしまった時、UMLのステートマシン図とかに落として整理しますね。

Machina.jsを選んだ理由

npmで'fsm'などの検索ワードで検索してダウンロードが多いモノを選びました。Machina.jsのgithubリポジトリを見ると現在の時点でスター数が893でした。これは間違いなさそうです。ライセンスもMITです。

インストール

Node.jsを利用している場合はnpmで入ります。通常のJavaScriptで使う場合は、公式ページサイトから、あるいはgithubからcloneしてきて、中にあるlib/machina,min.jsを使えば良さそうです。

$ npm install machina

基本的な使い方

公式のReadmeでも良いのですが、他にも例を探していたらわかりやすい記事があったのでそれをベースに解説します。

たとえば車のギヤのステートマシンを定義したいと思います。状態はN(ニュートラル)がデフォルト、1速、R(バック)の3つのギヤを考えます。下記の例ではそれぞれの状態においてアクセルを踏んだ時(accelerate)したときに車がどのように振る舞うかがわかります。かなりシンプルですし、コメントをたくさん書いたので見てみてください。

// コンストラクタ版 
var machina = require('machina'); 
var Car = machina.Fsm.extend({ 
  initialState: 'N',  // ステートマシンの初期状態
    states: {  // 状態を定義
      'N': {  // 各状態
        accelerate: function() { // その状態が扱う振る舞い(関数) 
          console.log('the gear is not set'); 
        } 
      }, 
      'R': { 
        accelerate: function() { 
          console.log('move back'); 
        } 
      }, 
      '1': { 
        accelerate: function() { 
          console.log('move forward'); 
        } 
      }, 
    }, 
}); 

var car = new Car(); 

car.on('transition', function(data) {
  console.log('state change:', data.fromState, 'to', data.toState);
});

// handleはcarインスタンスの現在の状態の関数(振る舞い)accelerateを探して、実行します
// transitionは引数で与えられたステートに遷移します
car.handle('accelerate'); // -> 'the gear is not set'
car.transition('1');      // -> 'state change: N to 1'
car.handle('accelerate'); // -> 'move forward'
car.transition('R');      // -> 'state change: 1 to R'
car.handle('accelerate'); // -> 'move back'


上記の例はコンストラクタ版ですが、インスタンス版でも良いと思います。

var machina = require('machina'); 
var car = new machina.Fsm({
  ///////略
});


またhandleをラップするとタイポなどがあった場合に早く見つけられそうです。

var machina = require('machina'); 
var Car = machina.Fsm.extend({ 
  initialState: 'N', 
    states: { 
      ///////略
    }, 
    accelerate: function() { 
      this.handle('accelerate'); 
    }, 
    shift: function(newGear) { 
      this.transition(newGear); 
    }, 
}); 

var car = new Car();  
car.shift('1'); 
car.accelerate(); 
car.shift('N'); 
car.accelerate();

よく使いそうなもの

machina.Fsm Prototypeとして公式に一覧がありますが、よく使いそうなものを上げていきます。initialState、handle、transitionは既に前例で登場済みなのでスキップします。

_onEnter/_onExit

こちらはそのステートに入ったタイミングと次のステートに切り替わるタイミングで呼ばれます。例えば先程のRのステートのところにこれを追加すると下記のような結果になります。そのステートにおけるinitialize/finalizeはこの中ですると良さそうです。

      'R': { 
        _onEnter: function() {
          console.log('R: _onEnter');
        },
        accelerate: function() { 
          console.log('move back'); 
        },
        _onExit: function() {
          console.log('R: _onExit');
        },
      }, 
  • 出力結果
state change: N to R                                                                           
R: _onEnter
R: _onExit
state change: R to 1
emit/on/off

emitではオリジナルのイベントを呼び出すことができます。作ったイベントはon/offでコールバックの登録、解除ができます。ここでは例で'broken'イベントを作ってみます。非常にJavaScriptらしい書き方でイベントとコールバックを登録できますね。

///////略
      'R': { 
        accelerate: function() { 
          this.emit('broken', 'aiueo');
        },
      }, 
///////略

var car = new Car(); 

car.on('broken', function(data) {
  console.log('broken!', data);
});

car.shift('R'); 
car.accelerate();
  • 出力結果
broken! aiueo
deferUntilTransition

これは次のTransitionまでその関数(振る舞い)をキューイングしてくれます。例を見るのが一番分かりやすい思います。例えばネットワークのステートを考えた時にrequestHttpという何かしらのサーバーにリクエストするような関数を考えてみます。ただし、これがoffline状態の時に呼ばれてしまうとクライアント側は再度requestHttpをしないといけません。そこで、このdeferUntilTransitionを呼んでおけばrequestHttpという振る舞いがmachinaにキューに積まれます。そして、deferUntilTransitionの引数にはonlineを与えているので、ステートがonlineになっただけでonlineステートのrequestHttpが実行され、安全に処理できます。
これを使いこなせれば上級者の仲間入りができそうです。ちなみにdeferUntilTransitionの引数に何も入れないと、何らかのステートに変わったら発動する、という条件に変わるようです。

var machina = require('machina'); 
var Network = machina.Fsm.extend({ 
  initialState: 'offline', 
    states: { 
      'offline': { 
        'requestHttp': function() {
          console.log('requestHttp is deferred');
          this.deferUntilTransition('online'); 
        },
      }, 
      'online': { 
        'requestHttp': function() {
          console.log('request...');
        },
      }, 
    }, 
}); 
var network = new Network(); 

network.on('transition', function(data) {
  console.log('state change:', data.fromState, 'to', data.toState);
});

network.handle('requestHttp');
setTimeout(function() {
  network.transition('online');
}, 1000);
  • 出力結果
requestHttp is deferred                                                                        
state change: offline to online
request... // -> deferされてたrequestHttpが1秒後のステートがonlineに変わったところで呼ばれる
アスタリスク(*)

関数としてアスタリスク(*)を書いておけば、定義されていない関数が呼ばれた場合にそれで受け止めることができます。色々例を探していると前述のdeferUntilTransitionを組み合わせて、ステートが変わったタイミングで再度その関数を呼ぼうとする例が多かったですね。これでクライアントからの呼び出しをちゃんとキャッチできる訳です。

///////略
      'N': { 
        '*': function() {
          console.log('handler is not defined');
        },
///////略

var car = new Car(); 
car.handle('hogehoge');
  • 出力結果
handler is not defined 

まとめ

JavaScript/Node.jsで使えるステートマシンライブラリのMachina.jsを試してみました。非常にシンプルでカスタマイズ性のあるフレームワークになっているのが分かりました。ただ一番重要なのはステートマシンをしっかり設計し、それを実際にコードに落とすことですね。結局設計がしょぼいと純粋にif文を羅列したほうがわかりやすいときもあるので、本末転倒にならないようにしたいところです。

壁掛けのヘッドホンハンガーを3Dプリンターで作ってみた

f:id:jonki:20150118133239j:plain
f:id:jonki:20150118132755j:plain
f:id:jonki:20150118131134j:plain


ヘッドホンが溜まってきて置き場所に困っていたのと、壁掛けの棚を作ってみたいと思い、上の写真で上げたようなものを作ってみました。

壁掛け棚

壁にかける棚も自分で作ってみました。近所の島忠で板を買ってきてL字金具で止めただけです。無印でも安いので良かったのですが、せっかくなので自分で作りました。また賃貸なのでホッチキスで壁に固定する金具も買いました。


今回使った3Dモデル

特になんの工夫もないですが、何となく曲面にしてヘッドフォンへの負担を軽減させています。またケーブルを引っ掛ける突っ張りも作りました。

Headphone hanger 3D Model Made with 123D 123D Design


今回使ったフィラメント

今回はwinboという会社のUP Plus互換のABSフィラメントを使いました。公式のPP3DPオリジナルフィラメント(ABS樹脂500g)は税抜きで4644円なのでgあたりで9.288円。今回使ったのは700g 2780円なのでgあたり3.97円。なんと半額以下です。またホイールが透明なので、残量も見えて便利です。
私は公式フィラメントしか知らないのであまり参考にならないと思いますが、プリントしやすさも見た目もあまり遜色ないように思いました(サポート材と内部構造が見える画像を下に貼りました)。ただ注意点としては、ホイール経が少し大きいのでホイール保持部と少し干渉します。ここは3Dプリンターで自分で作ることもできますが、ちょっとぐいっと上の部分曲げてあげればホイールが回転できるので特に問題なはさそうです。(写真参考)


f:id:jonki:20150118141640j:plain
f:id:jonki:20150118131202j:plain

まとめ

今回ヘッドフォンの壁掛けスタンドを作ってみました。私が持っている3Dプリンターはそんなに大きいものも精度の良い物も作れませんが、こういった日常をちょっと便利にするものはすぐ作れるので面白いですね。自分が欲しいベストサイズのものを作れるのが嬉しいです。今回作ったヘッドフォンスタンドは既存の完成した製品がたくさんあるので、それを参考にしつつ自分のオリジナルに組み込んでいく知的活動はたまらないものがあります。

Xperiaの卓上ホルダを縦型にするアダプターを3Dプリンターで作ってみた

f:id:jonki:20150112214653j:plain

Xperiaシリーズには卓上ホルダという充電Dockスタンドが付いていて便利です。ただ基本的には私は縦向きでしか使わないので、これを縦型でも使えるようなアダプターを自分で作ってみました。卓上ホルダ用の穴を開けておき、そこにハメて使うようなスタイルです。スマホは卓上ホルダの磁力だけで浮いています。

見た目

f:id:jonki:20150112214726j:plain

f:id:jonki:20150112214024j:plain

f:id:jonki:20150112221220j:plain

3D Model

今回も123D Designでモデルを作り、UP Plus2でプリントしたものになります。

Xperia Dock Stand 3D Model Made with 123D 123D Design


実はこの前に一回失敗してます。下の画像の左が最初モデリングしたもの、右側が成功したものになります。左のものは角度をキツくし過ぎたために取り付けると前に倒れてしまいました。そこで傾斜を緩くし、土台も広めにしてバランスを良くしました。この辺りの失敗しながら試行錯誤できるのは、3Dプリンターオーナーのメリットですね。

f:id:jonki:20150112220241j:plain