読者です 読者をやめる 読者になる 読者になる

ぽかぽかウンティの自由帳

ぽかぽか動物園から投稿します。

リモートワーク用のデスクトップPCを変更

リモートで家から仕事するとき、今までは初任給で購入したPCを使っていた。

PC ThinkCentre M55 Tower 8802
アーキテクチャ 32bit
CPU Core 2 Duo
メモリ 4GB
ストレージ HDD 1TB
グラフィックボード オンボード
サウンドカード Sound Blaster X-Fi Fatal1ty

Ubuntu 16.10 が普通に動作するし Rhythmbox で音楽流せるしでほとんど問題はなかった。
ブラウザは Chromium を使用していたので Chrome の 32bit 切り捨てもそんなにダメージはなかった。

しかし最近なんでか Vim がもたつくようになってしまった。

ネットワーク遅延でもなさそうだし、何かが CPU 喰ってる訳でもなさそうだし自分のスキルじゃ原因を追求できなかった。

デスクトップマシンは他に Dell の PC を持っていて Windows 10iTunes を使うときだけ使っていた。

PC Studio XPS 435MT
アーキテクチャ 64bit
CPU Core i7
メモリ 9GB
ストレージ HDD 1TB
グラフィックボード NVIDIA GeForce 9800 GTX+
サウンドカード SE-300PCIE

いい機会なので Dell の方を仕事のメインマシンにしようと思った。

最初の懸念点が低確率で発生するフリーズする現象だった。どうも会社の同僚からもらったグラボ起因らしかった。

次の懸念点が Ubuntu でサウンドカードが ALSA レベルで認識されない問題だった。こちらは面倒なので諦めた。

いい機会だから SSD とグラボとサウンドカードを新規に購入した。計3万5千円くらいの出費になった。

ストレージ SSD 256GB * 2
グラフィックボード NVIDIA GeForce GTX750Ti
サウンドカード Creative Sound BlasterX G5

SSD は 2つ購入して Windows 10Ubuntuデュアルブートにした。HDDに比べてやっぱ速い。

時代は USB-DAC らしいが高かったので外付けサウンドカードにした。USB に差しただけでちゃんと Ubuntu も認識した。

しかしいまいちその違いがわからない。USB接続で音を良くする点においては USB-DAC も外付けサウンドカードも似たようなもんか。

グラボの方は Linux 用のベンダードライバもあるし何も問題なかった。

これで快適に仕事ができる。うれしい。

www.geforce.com
Sound Blaster X-Fi Fatal1ty – 迫力のゲームサウンドをX-RAM搭載サウンドカードで
ONKYO PCオーディオ製品情報:SE-300PCIE - PCIeデジタルオーディオボード | オンキヨー株式会社

Creative Sound BlasterX G5 高音質 ポータブル ゲーミング USBオーディオ  ハイレゾ 対応 Windows Mac PS4  SBX-G5

Creative Sound BlasterX G5 高音質 ポータブル ゲーミング USBオーディオ ハイレゾ 対応 Windows Mac PS4 SBX-G5

トラウマ

matome.naver.jp

何かこう... ミキサーで粗い物を細かく砕く音をスケールでかくしたような...
何かこう... 固いモノが重金属に打ち付けられるような...

まさか自分が乗っている電車が人を轢くとは...

あの音はしばらく忘れられない...

骨が... 当たる音だ... 決っしてチャリンコなんかじゃない...

だって駅のホーム下だもん...

シン・ゴジラの第四形態の姿勢でキーボード打てたら健康的かもね

シン・ゴジラを初めて見て、中の人というかモーションキャプチャー担当の野村萬斎さんの姿勢がすごく健康的に感じた。

あの宝玉を持って胸を張って歩く姿勢、しばらく真似してる。ただし家の中で。

あの体制のまま座ってキーボード打てたら仕事中も健康的でいられると思うんだよね。

だからセパレート式キーボードを買って机の下に貼り付けて椅子の肘当てを適当に調節すればイケるんじゃないかって。

Freestyle2 for PC - Kinesis Corporation » Kinesis Corporation » Where comfort and productivity go hand in hand.

nippondanji.blogspot.jp

こんな健康的なスーパーエンジニアが言ってるんだから間違いない。

kitajimaquatics でも「綱引きのときみたいにもっと背中を使って泳ぐ」と教わったし。

普段の生活じゃ身体の前しか使わないからなー。

ジャパンマスターズ水泳の結果をスクレイピングした

まだ2回しか出場していないけど、水泳のマスターズ大会のスターターリストや結果ページは時代を感じるテイストになっている。そして年ごと種目ごとの階層になっている。

root ディレクトリは以下。漂うフレーム臭。

http://www.tdsystem.co.jp/

これをチームベースの階層に整形した。年ごとに微妙に文字コードが違ってて小一時間ハマった。2012年より前のデータは 404 not found だった。

github.com

NEW GAME! のオフィスレイアウトいいなぁ

ここ最近、労務とチームに頼み込んで7月からお試しリモートワークをさせてもらってる。

7月は週に1日だけ、8月は週に2日だけ、問題なければ9月は週に3日も家で仕事して良いことになっている。そして今のところ問題は発生していない。

7月の仕事内容は自分1人で1つのプロジェクトを進める感じで、通勤時間がなくなってその分を仕事やプライベートに使えて圧倒的に時間と空間効率が良いことがわかった。アウトプットも自他ともに認めて出せた。

「あれ?会社に行く必要なくね?」「そういえば会社って無駄に空間と時間の縛りキツくね?」と感じてた頃からリモートワークの方が効率がいいことは色々な記事を読んで予測はしていたが、予想以上に効率的と判明して非常に良かった。プログラマでホント良かった。

しかし8月は同じプロジェクトに追加で1人アサインされて、スキル的にその人の面倒も見なくてはならないので、ここで本当のリモートワークの利点欠点が見えてくると思う。

8月が問題なければ9月は週2日しか出勤しなくて良くなり、かなり時間的に余裕のある人生が待っている。8月は勝負どころである。

話は変わるが...

newgame-anime.com

今期も安定のまんがタイムきらら枠。こんな職場だったら逆にリモートワークなんてやってる場合じゃねぇ。私もズボン脱いで会社に泊まるわ。逆にリモートライフになるわ。

しかしこの4人で1ブロック、普段は対角を向いて座り、団欒時は中心を向いて話し合えるオフィスレイアウトいいなぁ。非常に落ち着く。壁もあるから葉っぱも必要ないし。ちなみに私は会社で葉っぱ2枚刺しである。

matome.naver.jp

空調戦争の回も面白かった。私は25℃で妥協しているが、それでも27℃に上げられる。しまいにはパネルに28℃推奨とシールが貼られる始末。役所並に思考停止である。断固として25℃に下げてやる。てめぇら冬場は暖房27℃にするくせに。血が通っていないんじゃぁないか。

北島康介選手の弟と同じ組で100m自由形を泳いだけど去年より1秒遅かったジャパンマスターズ2016千葉国際水泳場

やっぱ日々気持ちよく泳いでるだけじゃベストタイムなんて出ない。ゲロ吐くくらいキツイ練習しないと進歩はしない。この悔しさを来年まで何とか覚えていたい。。
でも少しは懸垂効果出て欲しかった... 期待したのに...

f:id:proxy0721:20160716094044j:plain
f:id:proxy0721:20160716142535j:plain

北島康介選手の弟の亮二さんは最近水泳始めたらしいのにこのタイム。化け物か... ハンドボールやってたらしく、身体はできていた感じ。

細川大輔選手は相変わらず速くて今年も52秒台だった。

自分は今年は前半31秒だったらしく、後半37秒。スタミナ不足ってやつや...

今年 http://www.tdsystem.co.jp/Masters/JM2016/013.HTM
去年 http://www.tdsystem.co.jp/Masters/JM2015/013.HTM

How we can join multiple tables, aggregate multiple columns, and sort by its aggregated columns on the Rails ActiveRecord?

RailsActiveRecord で複数テーブルを結合して複数カラムで集計して、その集計結果でソートしたい場合のレールの乗り方がわからなかったので色々と試した結果、疲れた。

例えば以下みたいな普通の SQLActiveRecord::Relation で組み立てて、かつ ActiveRecord::Base を継承したモデルや便利な Gem のインターフェースを使う場合の話。

/* student has many scores */
SELECT
  students.*,
  AVG(scores.math) AS avg_math_score,
  AVG(scores.english) AS avg_english_score
FROM
  students
    INNER JOIN scores
      ON students.id = scores.student_id
WHERE
  students.id IN (1, 2, 3)
GROUP BY
  students.id
ORDER BY
  avg_math_score DESC

github.com
github.com

結論から言うと eager_load や preload や includes などの Association cache 機構には頼れなかった。そして Association での Draper gem の利用を諦めた。

Students
  .select(students.*)
  .select('AVG(scores.math) AS avg_math_score')
  .select('AVG(scores.english) AS avg_english_score')
  .joins('LEFT OUTER JOIN scores ON students.id = scores.student_id')
  .group('students.id')
  .order('avg_math_score DESC')

で Student モデルに avg_math_score や avg_english_score のメソッドが生えた形で結果配列を取得できるようになる。Kaminari Gem のページネーションはそのまま使える。しかし N+1 クエリを防ぐためには Association での Draper Gem は諦めざるを得なかった。

Rails5 だと left_joins というクエリインターフェースが追加されているみたいなので、バージョン上げたら試してみようと思う。

qiita.com

includes は内部で条件に応じて eager_load や preload の挙動となる。

qiita.com

preload は絞り込み条件が付くとエラーになるので今回の要件ではそもそも使えない。

eager_load だと内部で t0_r0 みたいに列名を管理してモデルオブジェクトをキャッシュしているみたいで、その過程で独自に select で追加した集計結果列が捨てられてしまっていた。さらに内部で意図しない壊れたカウントクエリが発行されてしまいエラーになった。

前提として arel とかは個人的には手を出したくない。もっといい方法がないか引き続き探ってみたい。