家で作業と家事を同時にこなす「家事ポモドーロ・テクニック」がとても良かったので布教します

家で作業をすると、ついその前に部屋を片付けてしまったり、周りにある誘惑に負けて、全然作業が進まないことありませんか?

そんなときは、ポモドーロ・テクニックを使って作業と家事を交互に行うと、作業も集中できるし、家事も片付くしで一挙両得だよ! というお話です。

ポモドーロ・テクニックって?

集中して仕事をこなすために、25分毎に時間を区切って仕事をする時間管理術。Francesco Cirillo氏が1992年、自身の勉強効率を上げるために考案した。

ポモドーロテクニックとは - はてなキーワード

詳しい方法は、上記はてなキーワードの記事をご覧ください。

家事ポモドーロ・テクニックとは?

ポモドーロ・テクニックを応用して、一定時間集中して作業を行った後は、一定時間家事を行います。

自分の場合、飽きっぽいので15分で、集中して作業をした後、次の15分で家事を行っています。

そして、それを4セット(合計2時間)繰り返したら、長めの休憩を入れます。

家事ポモドーロ・テクニックの利点

実際にやってみたところ、作業を集中して行えるのはもちろんなのですが、他にも様々な利点がありました。

  • 家事が精神的報酬に 家事は肉体労働なので、頭脳労働である作業の合間に行うことで、リフレッシュできます
  • 家事の合間に、作業のアイデアが浮かぶ。作業だけを集中して行うより、より良い作業ができるようになりました。
  • 家事も作業も片付く!

細かいテクニック

  • やるべき家事をTODOリストに入れておくと、次何しようかと悩まなくて良くなります
  • 家事も仕事も中途半端で終わせると、次やる時のコンテキスト・スイッチが少なくて良いです
    • きっちり終わらせると、次やることの精神的ハードルが高くなる

そんな感じで、家事ポモドーロ・テクニック。超おすすめです!!

アジャイルな時間管理術 ポモドーロテクニック入門

アジャイルな時間管理術 ポモドーロテクニック入門

scope は、戻り値が `nil` や `false` のときも `ActiveRecord::Relation` を返す

条件式付きのscpoeをクラスメソッドに移行する際に、問題になる

例: scopeの場合

class Item < ApplicationRecord
  scope :by_name, -> name { where('name like ?', "%#{name}%") if name.present? }
end

引数の値が nil でも、 ActiveRecord::Relation がキチンと返ってくる

Item.by_name(nil).order(:created_at) #=> ActiveRecord::Relation

例: クラスメソッドの場合

class Item < ApplicationRecord
  def self.by_name(name)
    if name.present?
      where('name like ?', "%#{name}%")
    end
  end
end

この場合、Item.by_namenil を渡すとエラーが発生する

Item.by_name(nil).order(:created_at) #=> NoMethodError: undefined method `order' for nil:NilClass

どうすればよいの?

nil の代わりに all を返せば ActiveRecord::Relation が返るようになる

  def self.by_name(name)
    if name.present?
      where('name like ?', "%#{name}%")
    else
      all
    end
  end
Item.by_name(nil).order(:created_at) #=> ActiveRecord::Relation

Active Record の scope を使う必然性ってあるの?

と思って調べたら、Rails ガイドに、

スコープでのメソッドの設定は、クラスメソッドの定義と完全に同じ (というよりクラスメソッドの定義そのもの) です。どちらの形式を使用するかは好みの問題です。

と、言われたので、 特に必然性は無いらしい

ちなみに、 引数を使う場合はクラスメソッドを推奨するそうです

スコープで引数を使用するのであれば、クラスメソッドとして定義する方が推奨されます。クラスメソッドにした場合でも、関連オブジェクトからアクセス可能です。

あと、適当にぐぐったら「以前の時代は特別なものだったけど、今は別に使わなくてもよいのでは?」という話を見つけて、それもそうかという気持ちになりました

追記

こちらの記事の「追記」にあるように「 ActiveRecord::Relation を返す chainable な検索処理は scope で書く」というスタイルも、model 内でのメソッドの役割が明確になって良いのかもしれないですね

EC2の仮想化方式についてのおぼえがき

先にまとめ

  • AMI(Amazon Machine Image)の仮想化方式は、準仮想化 (PV) およびハードウェア仮想マシン (HVM) の2種類
  • 現在はHVMを推奨している
    • 公式曰く: 最適なパフォーマンスを得るために、インスタンスを起動するときには、現行世代のインスタンスタイプと HVM AMI を使用することをお勧めします
    • 特別なハードウェアサポート(拡張ネットワーキングや GPU 処理など)も受けられる
  • 旧世代のインスタンスタイプは、PVしかサポートしていない

仮想化方式とは?

  • EC2は、仮想化マシンモニタ Xen 上で動作している
  • Xenが、仮想マシンを作る方式には、HVMとPVの2種類の仮想化方式がある

PV (paravirtual。準仮想化)

実在のハードウェアを完全にエミュレートする代わりに、仮想マシン環境を実現するのに都合の良い仮想的なハードウェアを再定義する方式

メリット

  • 以前は、ハードウェア制御のオーバーヘッドが無いので、HVMとくらべて速度が早かった

デメリット

  • ハードウェアを仮想化しているので、特別なハードウェア拡張を利用できない
    • EC2だと拡張ネットワーキングや GPU 処理など

HVM (Hardware-assited VM。完全仮想化)

物理マシン用に用意されたOSをそのままXen上で動作させる方式

メリット

  • 物理マシンのハードウェアを利用できる

デメリット

  • 以前は、物理マシンのハードウェアを操作するためのオーバーヘッドにより、PVより遅かった
  • 現在は、オーバーヘッドが発生しやすい部分(IOなど)について、PVと同様のドライバを使うことで回避している(らしい)

参考

docs.aws.amazon.com

kanny.hateblo.jp

Xen (仮想化ソフトウェア) - Wikipedia

どうぶつタワーバトルを社内に普及したいのでプレゼン

この記事は feedforce Advent Calendar 2017 の 11 日目の記事です

ドーモ、社内ニンジャスレイヤー推進おじさん かせいさんです

前回は、Waka F のNY旅行の話でした。アドベントカレンダーでまさかのYouTubeでした。すごい!

www.youtube.com

さて、ニューヨーク旅行からのこちらは、みなさんご存知、どうぶつタワーバトルのお話です

アドベントカレンダーにかこつけて、どうぶつタワーバトルを社内で流行させるべく、プレゼンいたします

どうぶつタワーバトルとは!?

どうぶつタワーバトルは、12月初旬ころから爆発的に流行しているe-sportsです

f:id:kasei_san:20171211205257j:plain

どんなゲームなの

物理エンジンで構築された世界で、2人オンライン対戦でどうぶつさんを交互に積み上げて、バランスを崩して、盤の外に落としたほうが負けというゲームです。シンプル!

f:id:kasei_san:20171211112101p:plain

どうぶつタワーバトルの何がすごいか?

上で見たように、ぱっとみゆるふわな低年齢向けのパズルゲームに見えますが... 運と、技術介入要素のバランスが大変絶妙で、カードゲームやボドゲ好きな人が次々と沼に落ています

以下は沼にはまった、マジック・ザ・ギャザリングの日本人プロプレイヤーの市川佑樹さん (DTBはどうぶつタワーバトルの略称。1600-1700はレーティングで、RAGEはe-sportsのイベント名です)

運ゲーとしてのどうぶつタワーバトル

このゲーム、何も考えないでプレイすると運ゲーになります

ランダムに出るどうぶつを乗せ合うので、最終的に乗せらせられないどうぶつが出てきたプレイヤーが負けになるためですね

下の画像は、終盤に面積が広いキリンを引いた様子。これはかなり辛いです

f:id:kasei_san:20171211204304p:plain

ただ、運ゲーだからといって面白くないかというと別で、後半ギリギリの展開で何を引くか...!? というシーンではかなり手に汗を握ります...!

技術介入ゲーとしてのどうぶつタワーバトル

とはいえ、どうぶつタワーバトルは、ただの運ゲーというわけではなく、かなりの技術介入要素があります

何も考えず積むのではなく、戦略を練ることと、将棋の棋譜のようにパターンを知ることで勝率をかなり上げることができます

どんな戦略があるの

シンプルな戦略では「奇をてらったことはしない」というのがあります。対戦中やプレイ動画で見られるスーパープレイを「ようし、俺もやってやるぜ!」なんてマネすると大体死にます

しばらくは我慢して、安定する置き方を覚えましょう。レートの低いうちは、自分が死なないプレイをしていると、結構な確率で相手が自滅して勝ちになります

自分もこれに気がついてから、だいぶ勝率が上がりました

技術介入要素まとめ

そんな感じで、運ゲーに見せかけて、気付きをプレイスタイルに取り込むと、結構わかりやすく勝率が上がります

f:id:kasei_san:20171211213242p:plain

また、レーティングという形で、自分の強さが可視化されているので、数値ベースにPDCAサイクルを廻しやすいのもポイントです

運と技術介入要素のバランスの良いゲームは良ゲー

持論ですが 運と技術介入要素のバランスの良いゲームは良ゲー と思っています

なぜなら、運要素がゼロだと、強い相手には絶対に勝てないので、初心者には面白みが薄く、取っ掛かりも悪いです。また、盛り上がりにも欠けます (そっちのほうがストイックで好きという人も居ると思いますが)

また逆に、すごろくのように、運要素のみだと一時的には盛り上がりますが、すぐに飽きてしまいます

どうぶつタワーバトルや、一部のカードゲームのように運と技術介入要素のバランスが良いと、引きに一喜一憂して盛り上がりつつも、さらに、自分の工夫で勝率が上がっていくいう楽しみを得ることができます

まとめ

どうぶつタワーバトルは、ゆるふわな見た目にも関わらず、運と技術介入要素のバランスが良い

運と技術介入要素のバランスの良いゲームは良ゲー

すなわち、どうぶつタワーバトルは良ゲー

みんなもやってみよう

iPhone、アンドロイドでプレイ可能です!

どうぶつタワー

どうぶつタワー

  • Yuta Yabuzaki
  • ゲーム
  • 無料

play.google.com

明日のアドベントカレンダー

mizukmb の「新卒エンジニアの生態について」です! お楽しみに!!

週報 2017/11/27週 Dockerを勉強した週

期間

2017/11/27(月) 〜 2017/12/03(日)

インプット

SOFT SKILLS ソフトウェア開発者の人生マニュアル

SOFT SKILLS ソフトウェア開発者の人生マニュアル

パプリカ

パプリカ

  • 疲れて帰ってきたのにそのまま深夜までイッキ見してしまった映画
  • 夢の中の世界をアニメならではの表現で延々と見させられた
  • 今畝監督の他の作品も見たい

機動戦士ガンダム公式設定集 アナハイム・ジャーナル U.C.0083-0099

機動戦士ガンダム公式設定集 アナハイム・ジャーナル U.C.0083-0099

  • はしゃいでたら、ウソの学会誌を作る人なんだから、こういうのにハマるのだろうと指摘されて納得するなど

アウトプット

kasei-san.hatenablog.com

kasei-san.hatenablog.com

  • Dockerを理解すべく手を動かし中

note.mu

  • Evernoteに書きなぐってあったのを偶然見つけたので供養
  • このゲーム本当にゲーム開始までの設定が魅力的なので、むしろそれをゲームで体験したい...

KPT

Keep

  • 「とりあえず、12月はDockerを勉強する! ECSで動かしたり、CircleCIで、ブランチ毎に自動的に環境を立ち上げられるようにする」と決めた

t-wada さんが、弊社TDD本読書感想会に参加して頂けそう!

Problem

ややオーバーキャパシティ気味

キャリア支援やマネージメントに関する本を読めていない

Try

引き続きDockerを進める

来週末の社内LTのネタを考える

今後の予定

adventar.org

  • 12/11(月)

yumenosora.connpass.com

  • 勢いでLT申し込んでしまったので何か書かねば...

危機感にかられて今更Dockerを学び直す人の記録(Railsを動かしてみる編)

これまでのあらすじ

概要を理解して、Imageを作ってコンテナをうごかしてみました

kasei-san.hatenablog.com

kasei-san.hatenablog.com

今日やること

公式のクイックスタートガイドを元に、ローカルのDockerでRailsを動かしてみる

docs.docker.com

ワーキングディレクトリ作成

cd .
mkdir -p work/rails_docker_demo
cd work/rails_docker_demo
git init

Dockerfile について

概要編でも軽く説明したが、Imageの環境を定義するDockerfileと言うものがあり、クイックスタートガイドでは、それでRails環境を作るように書かれている

Dockerfileに以下を定義

FROM ruby:2.4.2
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

コマンド解説

リファレンスはこちらを参照

docs.docker.com

FROM

ベースとなるImageを定義。

クイックスタートでの定義がちょっと古かったので、dockerhubのrubyオフィシャルから安定最新っぽい2.4.2に変更した

RUN

/bin/sh -c でコマンドを実行する

WORKDIR

ワーキングディレクトリを定義

これ以下のコマンドでのカレントディレクトリが、ワーキングディレクトリになる

COPY

Dockerホストからファイルをコピー

DockerホストでGemfile作成

source 'https://rubygems.org'
gem 'rails', '5.1.4'

COPY Gemfile.lock のために空の Gemfile.lock を作成

touch Gemfile.lock

docker-compose.yml の作成

version: '3'
services:
  db:
    image: postgres
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

docker-compose とは?

ホスト上の複数のコンテナを一元管理する為のツール

docker-compose.yml で定義

今回は、webと、dbのコンテナの設定をそれぞれ定義している

docker-compose.yml のコマンド解説

リファレンスはこちらを参照

docs.docker.com

version

docker-compose のバージョン指定。最新なら 3

services

各コンテナをサービスとして定義する場所

image

imageのタグ、id等を定義。dockerfileの FROM と同じ?

build

dockerfileのPATH

command

コンテナに定義されているデフォルトのコマンドを上書きする

volumes

PATHをボリュームとして定義

ボリューム

コンテナを実行するときに、ホストのディレクトリをコンテナのディレクトリにマウントできる

このとき、マウントされた領域をボリュームという

ports

docer run のpublishオプションと同じもの?

depends_on

依存関係の定義

今回の場合、webを起動するには、dbの起動が必要

環境のビルド

docker-compose run は、docker-compose.yml に定義された環境を作成して、コマンドを実行。完了したら各コンテナを終了する

docker-compose run web rails new . --force --database=postgresql

docker-compose のコマンド解説

run

ワンオフなタスクの実行

特定のサービスを指定する必要がある

指定したサービス用のコンテナと、それと依存関係にあるサービス用のコンテナが起動する

実行後、コンテナは停止する

docker container build を実行していない場合、一緒に実行される

build

docker-compose.yml の内容に従って環境がビルドされる

Dockerfileを変更した場合は、今回ならば Gemfile を変更した場合、build が必要

buildではまだコンテナは作成されない??

up

コンテナを作成して起動する

start

環境の再構築

新しいgemを追加したり、Dockerfieを更新した場合

docker-compose build

DBへの接続

config/database.yml を以下のように変更する

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password:
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test

環境の起動

$ docker-compose up

rake db:create の実行

docker-compose run web rake db:create

localhost:3000/ に接続

f:id:kasei_san:20171202180135p:plain

👏

環境の停止

docker-compose down

環境のステータス

docker-compose ps

起動時

        Name                       Command               State           Ports
---------------------------------------------------------------------------------------
railsdockerdemo_db_1    docker-entrypoint.sh postgres    Up      5432/tcp
railsdockerdemo_web_1   bundle exec rails s -p 300 ...   Up      0.0.0.0:3000->3000/tcp

終了時

        Name                       Command               State    Ports
-----------------------------------------------------------------------
railsdockerdemo_db_1    docker-entrypoint.sh postgres    Exit 0
railsdockerdemo_web_1   bundle exec rails s -p 300 ...   Exit 1

ここまでのコード

github.com

感想

とりあえず、動かすことができたという感じ

これで実際にどうやって、開発/本番環境の運用をしていくのかイメージは湧いていない

今後

ECSや、herokuで、docker on rails な環境を動作させてみる

参考

qiita.com

qiita.com

qiita.com

qiita.com