掘りごたつワークのススメ
いつもはログハウスみたいな部屋にこもってバランスボールに座って仕事してるのだけど、工事で部屋を追われた関係で掘りごたつで仕事してたら思いの外良かったのでオススメしてみる。
とはいえ、スタンディング以上に DIY が大変そう。。。
机の感じ
古いコタツなので、ディスプレイ(22インチぐらい?)とキーボード置くとほぼ机の半分以上が埋まる。正直東京時代のデスクより横幅は狭い。。
でも、ティッシュとか、本とかは適当に周りに放置できるので机自体はすっきりするかもしれない。
引きの画
割りと風が通る部屋なので自宅から風鈴とか持ってきて置いてみた。
オフィスのこの棟には自分しか居ないので、Apple Music の適当な playlist を一日中イヤホン無しで流してるのだが、たまに鳴る風鈴は悪くない。
メリット
いつでも仰向けで寝れる
実際寝る事はあまり無いと言っておくが、背伸びついでに座椅子の背もたれを倒すとそのまま寝転がれるのはかなりリラックスできる。これは、通常の机とチェアでは不可能なので結構なメリットだと思う。
足の裏が床に着く
足が長くないのと、普段使っている机の高さが変えられないので、いつも床に足の裏がつかない。自分の体質かもしれないが、長時間座っていると太ももの裏が痛くなったり、足がだるくなったりする。
掘りごたつは昔の人用なのか足が簡単に床につくので気持ち疲れが少ない気がする。コタツの中にクッションを置くと足置きにもなって伸ばす事もできる。
ホワイトボードが使いやすい
脳内メモリが少ないせいかプログラミングしてるとすぐに落書きしたくなるのでホワイトボードはよく使うのだけど、掘りごたつだと座ってる場所が要は通常の床なので、ホワイトボードを広い床に置いてそのまま書くことができる。
いつもの机とチェアだと、どうしても机を片してホワイトボードを置くか、小さいホワイトボードを用意したりするか、はたまた違う部屋で地べたに座ってやるかになるのでめんどいのだが、その点が劇的に改善される。
デメリット
座椅子
まあ、会社支給のチェアやバランスボールに比べるとやはり腰への負担はある。けれど先ほどの足の裏を接地できるのと相殺されているのか、そこまでデメリットと感じなかった。
正直普通のコタツで仕事したりすると、1 時間ももたないので、足の裏が接地できるのは全然違うと思う。
終わりに
プログラマのような長時間座っているような職種は、やはり椅子やそれに変わるスタンディングやバランスボールが必要だなと思っていたけど、意外にも古い家にある掘りごたつがフィットしたという発見。
まあ、とりあえず長時間働かないのが一番なので、それをオススメします。(自分はできてないけど。。)
スタンディングは
まだ一日中できないですけどこちらも悪く無いです。足の接地面をどうするかがまだ課題ですけど、身体が自由に動くので楽。
私はこいつを使ってますが、まあまあ安定するのでオススメです。
AASM を使ってみた。主に Callback。
STATESMAN
を使ってみたかったのだけど、使いたかったシーンが state を持ったテーブル1つだったので、ちょっと STATESMAN
だと冗長だったので断念。
AASM
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 エリアの下でサイズクラスと制約に関する設定ができる
- サイズインスペクター内で制約の閲覧と設定ができる
きっと他にもある。。
Align, Pin, Resolve Auto Layout Issue
Auto Layout 関連はだいたいここから設定できる。Editor
メニューからもできる。
制約を直接編集
サイズインスペクターからでなくても編集できる
Dock 内でエラーを確認
赤いボタンを押したら一気に解決してくれたりする
サイズクラスを指定する場合に使う
まだ良くわかりません
#
こういうのに疲れるとコードで指定するようになるんですかね。。
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);
ここで使ってる Select
は IEnumerable
のメソッドですが、引数は System.Func<TSource, TResult>
の delegate となっています。
after のようにできるのは、その delegate とシグネチャが一致しているメソッドであれば同じように扱えるという仕様を利用しています。
Ruby の Symbol#to_proc
Ruby は Symbol#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 デザインやってたころは毎月買ってたので懐かしい。
- 作者: ウェブデザイン
- 出版社/メーカー: マイナビ
- 発売日: 2015/06/18
- メディア: 雑誌
- この商品を含むブログ (1件) を見る
佐藤ねじさんと吉永龍樹さんの特集
個人にフォーカスした2つの記事がとても面白かった。
二足のわらじで仕事を分ける吉永さんの働き方や、本職のデザイナではない所で見出したクリエイティブでの戦い方は興味深かかったし、勉強になった。
佐藤ねじさんの記事では「面白い」と「真面目」の配合率や「funny」と「interesting」の配合率の話しが面白かった。 「仕事は楽しい方がいい」と口にする事があるのだけど、自分にとって「仕事で楽しい」とはどういう事なのか言語化できていなかったので、「配合率」というのは考え方として取り入れたいと思った。
作品も素敵なものが多くて、同じ 82 年生まれとして背筋が伸びる思いがした。
座談会:Web と IoT の「いま」と「これから」
IoT というワードや、Kickstarter みたいなサイトで面白いプロダクトがたくさん出ているのは見ていても、「今どういうものが作られているのか?」というのは見えていなかったのでありがたい特集でした。
Pepper くんがガリバーで接客してて、それが効率よくお客さんの意見を引き出すというのは、最近見たマツコとマツコの実験みたいで面白い。 一口に IoT といっても、単なる便利ガジェットから、Beacon 使って広告に活用したりビッグデータと人工知能をバックエンドに置いてインタラクティブなレコメンドに使ったり、それこそサメのアラート( Celever Buoy ) みたいに人命のためやヘルスケア用のものもあったりと多岐にわたっているんだなぁと改めて感じた。
個人的には排泄タイミングを教えてくれる DFree がとても気になったというか欲しいです。。
トップの特集は Web プロジェクトの立ち上げ方みたいなものだったんですが、WBS やら出てきて既視感がすごかったのでさらっと流し読みに。。そういう分野でもプロジェクトマネジメントの課題はあるんだなぁと。。
第九回 tokushima.rb に参加してきた
先月は予定があって参加できなかったので、一ヶ月ぶりの参加となりました。
Twitterライクなサービスを実際に自分の手で作ってみよう
これまで私が参加した回はほぼもくもく会だったのですが、今回は初めてお題がある感じに。
講師役の ka さんが説明しつつ、みんながそれに沿ってコマンド打ったり、コード書いたり、コード書いたりしてました。
とは別に ka さんの Public contributions が半端無い。500 日以上連続だと。
あまり個別の工夫点まで作れませんでしたが、とりあえず私がいけたのはここまで。
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
pry
と tapp
も使いたいので追加
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
系はまた書くときに。