掘りごたつワークのススメ

いつもはログハウスみたいな部屋にこもってバランスボールに座って仕事してるのだけど、工事で部屋を追われた関係で掘りごたつで仕事してたら思いの外良かったのでオススメしてみる。

とはいえ、スタンディング以上に DIY が大変そう。。。

机の感じ

f:id:dany1468:20150723003511j:plain

古いコタツなので、ディスプレイ(22インチぐらい?)とキーボード置くとほぼ机の半分以上が埋まる。正直東京時代のデスクより横幅は狭い。。

でも、ティッシュとか、本とかは適当に周りに放置できるので机自体はすっきりするかもしれない。

引きの画

f:id:dany1468:20150723003547j:plain

割りと風が通る部屋なので自宅から風鈴とか持ってきて置いてみた。

オフィスのこの棟には自分しか居ないので、Apple Music の適当な playlist を一日中イヤホン無しで流してるのだが、たまに鳴る風鈴は悪くない。

メリット

いつでも仰向けで寝れる

実際寝る事はあまり無いと言っておくが、背伸びついでに座椅子の背もたれを倒すとそのまま寝転がれるのはかなりリラックスできる。これは、通常の机とチェアでは不可能なので結構なメリットだと思う。

足の裏が床に着く

足が長くないのと、普段使っている机の高さが変えられないので、いつも床に足の裏がつかない。自分の体質かもしれないが、長時間座っていると太ももの裏が痛くなったり、足がだるくなったりする。

掘りごたつは昔の人用なのか足が簡単に床につくので気持ち疲れが少ない気がする。コタツの中にクッションを置くと足置きにもなって伸ばす事もできる。

ホワイトボードが使いやすい

f:id:dany1468:20150723003558j:plain

脳内メモリが少ないせいかプログラミングしてるとすぐに落書きしたくなるのでホワイトボードはよく使うのだけど、掘りごたつだと座ってる場所が要は通常の床なので、ホワイトボードを広い床に置いてそのまま書くことができる。

いつもの机とチェアだと、どうしても机を片してホワイトボードを置くか、小さいホワイトボードを用意したりするか、はたまた違う部屋で地べたに座ってやるかになるのでめんどいのだが、その点が劇的に改善される。

デメリット

座椅子

まあ、会社支給のチェアやバランスボールに比べるとやはり腰への負担はある。けれど先ほどの足の裏を接地できるのと相殺されているのか、そこまでデメリットと感じなかった。

正直普通のコタツで仕事したりすると、1 時間ももたないので、足の裏が接地できるのは全然違うと思う。

終わりに

プログラマのような長時間座っているような職種は、やはり椅子やそれに変わるスタンディングやバランスボールが必要だなと思っていたけど、意外にも古い家にある掘りごたつがフィットしたという発見。

まあ、とりあえず長時間働かないのが一番なので、それをオススメします。(自分はできてないけど。。)

スタンディングは

まだ一日中できないですけどこちらも悪く無いです。足の接地面をどうするかがまだ課題ですけど、身体が自由に動くので楽。

私はこいつを使ってますが、まあまあ安定するのでオススメです。

www.amazon.co.jp

AASM を使ってみた。主に Callback。

STATESMAN を使ってみたかったのだけど、使いたかったシーンが state を持ったテーブル1つだったので、ちょっと STATESMAN だと冗長だったので断念。

AASM

github.com

The Ruby Toolbox - State Machines

state machine カテゴリでは 2 位で、今でも開発は行われているようなので良さそうに見える。

日本語の解説記事も発見。

使ってみる

対象

ActiveRecord Enum を使って status というカラムを列挙型として使っているモデルがあるとします。

class Task < ActiveRecord::Base
  enum status: {opened: 0, assigned: 1, rejected: 2, finished: 3}
end

このステータスは、それぞれ遷移する順序があるという場合です。

state の設定

https://github.com/aasm/aasm#activerecord-enums

AASM は標準で ActiveRecord Enum を上手く扱えます。ポイントは column: enum名 と指定するところです。今回は enum が integer のカラムなので enum: true というオプションを省略できる。

class Task < ActiveRecord::Base
  include AASM

  enum status: {opened: 0, assigned: 1, rejected: 2, finished: 3}

  aasm column: :status do
    state :opened, initial: true
    state :assigned
    state :rejected
    state :finished
  end
end

event と transition の指定

class Task < ActiveRecord::Base
  include AASM

  enum status: {opened: 0, assigned: 1, rejected: 2, finished: 3}

  aasm column: :status do
    state :opened, initial: true
    state :assigned
    state :rejected
    state :finished

    event :assign do
      transitions from: :opened, to: :assigned
    end

    event :reject do
      transitions from: %i(opened assigned), to: :rejected
    end

    event :finish do
      transitions from: :assigned, to: :finished
    end
  end
end

ここは特に説明不要ですかね。

Callback を指定してみる

https://github.com/aasm/aasm#callbacks

以下の順序と関連を押さえておけばなんとなく大丈夫かと。

begin
  event           before
  event           guards
  transition      guards
  old_state       before_exit
  old_state       exit
  transition      after
  new_state       before_enter
  new_state       enter
  ...update state...
  event         success             # if persist successful
  old_state       after_exit
  new_state       after_enter
  event           after
rescue
  event           error
end

aasm/callbacks_spec.rb at master · aasm/aasm · GitHub

Callback のテストを見ると、順序、設定場所、渡ってくる引数がわかりやすい。

class Task < ActiveRecord::Base
  include AASM

  enum status: {opened: 0, assigned: 1, rejected: 2, finished: 3}

  aasm column: :status do
    state :opened, initial: true
    state :assigned
    state :rejected, after_enter: :after_enter_rejected
    state :finished, after_enter: :after_enter_finished

    event :assign do
      transitions from: :opened, to: :assigned do
        after do |user|
          self.user = user
          self.assigned_at = Time.zone.now
        end
      end
    end

    event :reject do
      transitions from: %i(opened assigned), to: :rejected
    end

    event :finish do
      transitions from: :assigned, to: :finished
    end
  end

  def after_enter_rejected
     # reject 時の処理
  end

  def after_enter_finished
    # finish 時の処理
  end
end

今回の特殊な点として、assign 時に一緒にアサインされたユーザーと、アサイン時刻を記録したかったので、transition に対する after callback を指定した。

transition after callback は名前は after だが、status の値の更新前に実行されるので、結果的に UPDATE 文が1つにできる。もちろん、status の更新が不可能な状態ならば実行されない。

task = Task.create
task.opened? # => true
task.assign!(current_user) 

task.assigned? # => true
task.user # => current_user 

# ダメな場合
task.update(status: 3, user_id: nil)
task.may_assign? # => false
task.assign!(current_user) # => AASM::InvalidTransition
task.user # => nil

Transaction 使えばもっとキレイにかけるのかなぁ。 https://github.com/aasm/aasm#transaction-support

結局もう一度 save するのか。

aasm/validator.rb at 44a17aa5357d60e20cbd1a5da4a27063e113ffa2 · aasm/aasm · GitHub

#

今回は Guards に関しては利用用途が無かったのだが、いろいろできそうなのでまた調べたい。

Auto Layout を設定する時に使いそうな Xcode の画面のメモ

慣れない IDE は、慣れるまでが大変ですね。。いろいろ高機能になっているせいか、6 年前に Eclipse から Visual Studio に移った時よりもしんどさを感じる。。

とりあえず使いそうな部分だけ

  • イシューナビゲータで問題があるか確認できる
  • Dock でエラーの詳細を確認できる
  • Canvas エリアの下でサイズクラスと制約に関する設定ができる
  • サイズインスペクター内で制約の閲覧と設定ができる

きっと他にもある。。

f:id:dany1468:20150705182340p:plain

Align, Pin, Resolve Auto Layout Issue

Auto Layout 関連はだいたいここから設定できる。Editor メニューからもできる。

f:id:dany1468:20150705182354p:plain

制約を直接編集

サイズインスペクターからでなくても編集できる

f:id:dany1468:20150705182350p:plain

Dock 内でエラーを確認

赤いボタンを押したら一気に解決してくれたりする

f:id:dany1468:20150705182359p:plain

サイズクラスを指定する場合に使う

まだ良くわかりません

f:id:dany1468:20150705182346p:plain

#

こういうのに疲れるとコードで指定するようになるんですかね。。

Ruby でもメソッドをブロックの代わりに渡したい

C# でコードを書いていると以下のようなコードを R# がよく薦めてきます。(久しぶりに C# 書いたけど、これで合ってるかな。。)

// 前提
var list = new[] {1, 2, 3, 4};

private int Method(int) {
  // なんか処理して int を返す
}

// before
list.Select(x => Method(x));

// after
list.Select(Method);

ここで使ってる SelectIEnumerableメソッドですが、引数は System.Func<TSource, TResult>delegate となっています。

after のようにできるのは、その delegateシグネチャが一致しているメソッドであれば同じように扱えるという仕様を利用しています。

Ruby の Symbol#to_proc

RubySymbol#to_proc があるので配列の各要素のメソッドを以下のように呼び出せます。

list = [1, 2, 3, 4]

list.map(&:to_s) # 単に数値を文字に変えるだけですが、int の to_s メソッドを呼び出している。
=> ["1", "2", "3", "4"]

これは Ruby を使い出してすごい便利と思った機能だったのですが、一方で C# のようにメソッドを渡せないのかなぁと思ってました。

def double(num)
  num * 2
end

list.map {|num| double(num) }

# これを list.map(double) ぐらいで書きたい

Method は to_proc できるらしい

Object#method で Method のオブジェクトにできるので

double_method = method(:double)
=> #<Method: Object#double>

double_method.to_proc
=> #<Proc:0x007fb79abcf0d0 (lambda)>

list.map(&double_method)
# or
list.map(&method(:double))

ちょっと冗長に見えるけど、少しだけ C# の書き方に近い感じになって嬉しい。でも method を呼び出すのは、ちょっと微妙っちゃ微妙ですよね。。

参考リンク

Web Designing vol.186 を読んだ

今年登壇させてもらったイベントがきっかけで一年間 Web Designing を送ってもらえる事になったのでちょっとした感想など。 Web デザインやってたころは毎月買ってたので懐かしい。

Web Designing 2015年 07月号

Web Designing 2015年 07月号

佐藤ねじさんと吉永龍樹さんの特集

個人にフォーカスした2つの記事がとても面白かった。

二足のわらじで仕事を分ける吉永さんの働き方や、本職のデザイナではない所で見出したクリエイティブでの戦い方は興味深かかったし、勉強になった。

佐藤ねじさんの記事では「面白い」と「真面目」の配合率や「funny」と「interesting」の配合率の話しが面白かった。 「仕事は楽しい方がいい」と口にする事があるのだけど、自分にとって「仕事で楽しい」とはどういう事なのか言語化できていなかったので、「配合率」というのは考え方として取り入れたいと思った。

作品も素敵なものが多くて、同じ 82 年生まれとして背筋が伸びる思いがした。

座談会:Web と IoT の「いま」と「これから」

IoT というワードや、Kickstarter みたいなサイトで面白いプロダクトがたくさん出ているのは見ていても、「今どういうものが作られているのか?」というのは見えていなかったのでありがたい特集でした。

Pepper くんがガリバーで接客してて、それが効率よくお客さんの意見を引き出すというのは、最近見たマツコとマツコの実験みたいで面白い。 一口に IoT といっても、単なる便利ガジェットから、Beacon 使って広告に活用したりビッグデータ人工知能をバックエンドに置いてインタラクティブなレコメンドに使ったり、それこそサメのアラート( Celever Buoy ) みたいに人命のためやヘルスケア用のものもあったりと多岐にわたっているんだなぁと改めて感じた。

個人的には排泄タイミングを教えてくれる DFree がとても気になったというか欲しいです。。

トップの特集は Web プロジェクトの立ち上げ方みたいなものだったんですが、WBS やら出てきて既視感がすごかったのでさらっと流し読みに。。そういう分野でもプロジェクトマネジメントの課題はあるんだなぁと。。

第九回 tokushima.rb に参加してきた

第九回tokushima.rb

先月は予定があって参加できなかったので、一ヶ月ぶりの参加となりました。

Twitterライクなサービスを実際に自分の手で作ってみよう

これまで私が参加した回はほぼもくもく会だったのですが、今回は初めてお題がある感じに。

講師役の ka さんが説明しつつ、みんながそれに沿ってコマンド打ったり、コード書いたり、コード書いたりしてました。

とは別に ka さんの Public contributions が半端無い。500 日以上連続だと。

あまり個別の工夫点まで作れませんでしたが、とりあえず私がいけたのはここまで。

github.com

Rails Tutorial と違い、mongoid を使って作るので、ActiveRecord とは微妙にできる事が違ったりして、簡単な部分もありつつ、ハマる部分もありでした。( has_many through ができないのは意外。)

公式にあたるの大事

(英語が多いけど)公式ドキュメントをちゃんと読むようにしようと、ka さんが何度か言われてました。

これまでも何度かいろんな人に言われた記憶があります。

感想

仕事でも Ruby/Rails を使っているはずなのですが、日々の仕事は既存のコードの修正がほとんど(というか全て)なので、なかなか rails new からすることはないんですよね。

Rails Tutorial をやったのも、少し遠い記憶になってしまって、こうやって何も無い所から機能を追加していくのは、また Rails の違った側面や魅力が見えて楽しいなぁと感じました。(というか、いろいろ調べながらじゃないと全然進められなかった。。)

次回は 「Gem を作ってみよう」だそうですので、また楽しみですね!

久しぶりに Rails でテストの環境作る

プライベートで作ってた Rails のアプリを久しぶりに改造しようと思ったら、テスト全く書いて無くて死にそうになった。。集中して開発してる時はいいけど、やっぱダメですね。

設定したもの

  • RSpec
  • FactoryGirl
  • spring
  • direnv

Gemfile

group :development do
  gem 'pry-byebug', group: 'test'
  gem 'spring'
  gem 'tapp-awesome_print', group: 'test'
end

group :test do
  gem 'database_rewinder'
  gem 'factory_girl_rails', group: 'development'
  gem 'fuubar', '~> 2.0.0.beta'
  gem 'rspec-rails'
  gem 'spring-commands-rspec'
end

prytapp も使いたいので追加

RSpec

$ rails generate rspec:install

spec_helper.rb, rails_helper.rb が生成される。

$ bundle binstubs rspec-core

bin/rspec を追加

DatabaseRewinder

spec/rails_helper.rb

  config.before :suite do
    DatabaseRewinder.clean_all
  end

  config.after :each do
    DatabaseRewinder.clean
  end

FactoryGirl

spec/rails_helper.rb

-# Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
+Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

spec/support/factory_girl.rb

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods

  config.before :suite do
    begin
      DatabaseRewinder.start
      FactoryGirl.lint
    ensure
      DatabaseRewinder.clean
    end
  end
end

spring

$ bundle exec spring binstub --all

direnv

bin って打つのを省略します。

$ export EDITOR=vi
$ direnv edit .

エディタが開くので .envrc に以下を記述

export PATH=$PWD/bin:$PATH

とりあえずこれで書き始める事ができました。capybara 系はまた書くときに。