今年のGood紹介(2):コナミスポーツクラブ コンディショニングラボ

今年も色んなものにお金を使いました。 中でも「これはお金払う価値あった、Good!」と自分が感じたものについて、紹介していこうと思います。 記事がきっかけに、誰かのQOL向上に役立ったら良いな、と思って書いていきます!

コナミスポーツクラブ コンディショニングラボ

コナミスポーツクラブはいわゆるジムですが、そこに併設するような形で、マンツーマンでトレーニングなどを見てもらえる施設・プログラムがあります。

www.konami.com

(※Webページを見ていただくとわかる通り、東京・神奈川・大阪の計7箇所しかないため、実際に行けない方も多そう。 その場合は、「専門家に見てもらうことで筋トレのモチベーションが上がったよ!」という話として読んでいただけたらと思います)

きっかけ

これまで、ジムに入会しつつもあまり続かない、、ということを繰り返していて、結局運動する習慣が身につきませんでした。 続かないパターンとしては、どういう風にトレーニングすればよくわからず自己流でやる→いまいち結果につながらない→モチベーション低下、という感じでした。

しかし、今年に入って腰がしばしば痛くなるなど、いよいよ運動不足が気になっていました。 最近は「困ったときはとりあえず人に頼ろう!」という気持ちになっていたので、あまり高すぎない、マンツーマンで筋トレを教えてもらう手段は無いかと探してみました。 結果、自宅に近いし、1回30分3000円程度で、マンツーマンのプログラムとしてはリーズナブルに感じたため、コナミに行ってみることにしました。

ここが良かった!

  • トレーナーはプロなので安心感がある
  • 何よりマンツーマンの時間が貴重!自分の状態に即したポイントやアドバイスがもらえる
    • 例えば、自分は普段から姿勢が左右に歪んでいて、スクワットをするときもかなり右脚に重心が偏っていた。トレーニング時に偏らないよう気をつけることで姿勢の改善にもつながる、といった指摘をもらった(自分では絶対気づけない)
    • 他にも、筋トレ中の姿勢のアドバイスも細かくもらえる
    • 教わったポイントを覚えておけば、自宅で自主トレするときも活用できる。
  • とにかく手軽でないと継続できない確信があったため、「自宅でできる最低限のトレーニングを教えてください」と言ってみたところ、「腕立て伏せ・腹筋・スクワット・デッドリフトを基本にすればよい」と良いアドバイスがもらえた。これくらいなら続けられる!とモチベーションUPにつながった

まとめ

実は、最近はもうジムには通っていませんが、自宅で定期的に筋トレが続けられています。 今まであまりに運動していなかったせいもありますが、駅で階段を上り下りするときに明らかに身体が軽く感じるし、寝起きの悪さも改善したように思います。

自己流で本/雑誌を読んだりしても、運動の経験が無いとフォームをどうすれば良いかなどが実感としてわからず、半信半疑で続けるしかないように思います。 そのような場合、専門家に見てもらう価値はとても高いと思います。 「ジムに入会してみたけど続かない」「いまいちトレーニングがうまくいってるかわからない」という人は、数ヶ月集中的に(自分は週一で行ってました)マンツーマンで教わるだけで、生活が変わるかもしれません。

腕立て伏せをしてると手首が痛くなったので、↓こんな器具も買ってしまいました。

今年のGood紹介(1):レアジョブ英会話

今年も色んなものにお金を使いました。 中でも「これはお金払う価値あった、Good!」と自分が感じたものについて、紹介していこうと思います。 記事がきっかけに、誰かのQOL向上に役立ったら良いな、と思って書いていきます! いずれも回し者ではありません。

レアジョブ

オンライン英会話のレアジョブです。有名なのでご存知の方も多いかと思います。

www.rarejob.com

きっかけ

今年の4月と10月、仕事でアメリカに出張する機会がありました。 英語は読み書きならある程度できるつもりだし、TOEICで920点を取ったこともありました。

しかし正直なところ、話す・聞くのコミュニケーションは経験が少なく、苦手意識がかなり強かったです。 せっかくの機会だし、ということで、コスパが良く手軽にレッスンを受けられそうなレアジョブを数ヶ月集中的に使ってみました。 料金プランは毎日1レッスン(25分)受けられる、月額約10,000円のコースです(会社から半額補助いただきました)。

結果、ペラペラとまではいかないものの、ネイティブスピーカーとコミュニケーションを取る上での自信に大きくつながりました!

行きの機内で何気なく英語音声・字幕なしで映画を見てみたら「(なんとか)聞ける、聞けるぞ!」となった体験も印象的でした。

ここが良かった!

  • 短時間でも毎日話していると、耳・口がやはり慣れてくる感覚があった。レッスンは毎日受けないと損(自分のプランだと、レッスン権を翌日以降に持ち越しできない)なので、毎日英語に触れるモチベーションも自然に湧く
  • 同じ講師に継続的に見てもらえたので、徐々にリラックスして効率もアップできた(これは良い講師に当たるかや、講師のスケジュールにもよる)
  • 社内の会議室でレッスンを受けることができ、便利だった(ノートPC・ヘッドセット・ネット環境があればどこでも受講できる)

Tips

講師の選び方

  • 講師紹介ページで肉声による自己紹介音声が聞ける。これは絶対聞いて講師選びの参考にした方が良いと思った
    • 講師はフィリピン人で、発音がネイティブに近い人もいればクセのある人もいて、ばらつきがある。 自分は「ネイティブスピーカーの発音に慣れたい」という目的があったので、少し早口でかつネイティブに近い発音の人を選んだ
    • 講師によって性格というかテンションも結構違う。音声から大体感じ取れるので、合いそうな人を選ぶと楽しいレッスンになりやすい
  • 講師の出身大学や学科も載っている。
    • USの大学出身の講師だと、発音が良い傾向があった
      • ただしかなり数は少ないので、自分は必須条件にはしていなかった
    • 出身学科が自分と近い人だと、共通の話題が持てて話が弾みやすかった(自分の場合は情報科学系)

レッスン内容

  • 「これ英語で言いたいけど言えなくて困る!」と思ったら、何でも質問して解消するようにすると、教科書の内容+αの学びが得られて、実際の会話に役立った
    • 例えば "Questions?" と訊かれたとき、自分はロボットみたいにいつも "No, OK" ばっかり言ってたので、どんなバリエーションがあるかとか聞いてみた("No for the question", "Not at all", "Nothing in particular", "None at the moment", "No questions at all" とかバンバン教えてもらえた)

まとめ

場所も選ばず初期投資もほぼ不要なのでスモールスタートできます。 自分は明確な目標があったので継続できましたが、特に目標のない人でも、一度体験してみて将来に備えても損は無いと思いました!

Quarkusについて(@関ジャバ勉強会)

この投稿の概要

JavaのWebフレームワークQuarkusについて、Java最新フレームワーク特集@関ジャバというイベントで勉強できたのでまとめます。

当日のスピーカーはRed Hat/Java Champion/Microsoft MVPEdson Yanagaさん。 肩書きがすごい。 デモ中心の発表で、とにかくポイントがわかりやすかった印象です。

Quarkus(クォーカス)とは?

quarkus.io

Javaの最新Webフレームワーク。

"Supersonic Subatomic Java"というキャッチフレーズ。Supersonicは動作の速さ、Subatomicはメモリフットプリントの小ささの比喩かな?

高速なHot Replace

発表では"Developer Joy"というメッセージと共に、開発が快適なことがとにかく強調されていた。

./mvnw compile quarkus:devで開発サーバーが立ち上がり、locahost:8080にリクエストするごとに差分チェック・再コンパイルされる。 少なくともテストプロジェクトだと確かに速い。

2019-11-27 04:42:28,836 INFO  [io.qua.dev] (vert.x-worker-thread-4) Hot replace total time: 0.232s

JVM/ネイティブバイナリ両対応

JVM用のjarも吐けるし、GraalVM用ネイティブバイナリも吐ける。 ネイティブ用はmvn package -Pnativeで。 ネイティブバイナリは実行高速だけど、コンパイルはかなり遅いとのこと。*1

その他の特徴

  • VS CodeIntelliJ IDEA用のプラグインが整備されていて快適に開発できる
  • quarkus-maven-pluginを使えばHibernateなどをエクステンションとして簡単に依存追加できる
  • Panache(パナッシュ)というライブラリで永続化が便利らしい
    • よくあるRepository的なインタフェースだけでなく、ActiveRecord的なインタフェースも使える(Developer.listAll()のような)
  • Springからの移行が容易

Java/JVMクラウドの歴史との関連

同日、楽天の椎葉さんによるMicronaut(こちらもJavaフレームワーク)に関する発表がありました。 その内容とも併せると、Java/JVMアプリやクラウドの歴史が垣間見えて勉強になったので、自分の理解を簡単にまとめておきます。

クラウド以前

強力なオンプレサーバーで長時間サービスが動き続けていた。そのため、

  • サービスの起動はまれで、ブートが遅くても気にならない
  • 時間が経ってウォームアップが十分になれば、JVM上で高いパフォーマンスを発揮
  • メモリは必要ならたくさん積めば良い

一方クラウドネイティブ時代

コンテナ・マイクロサービスなどの流れもあいまって、サービスは小さいサーバーで頻繁に起動/終了されるのが普通になってきている。すると

  • ブートが遅いと厳しい
  • ウォームアップ・JITコンパイラに頼りづらくパフォーマンスが出づらい
  • IaaSだとメモリが高い

なので

以下の特徴を持つQuarkusやMicronautなどのフレームワークが、時代に合わせる形で発展してきている。

  • 起動が早い
  • メモリフットプリントが小さい
  • ネイティブバイナリも使える

所感

自分個人は業務ではWebフレームワーク選定などはしないので、そのあたりの事情が知れて勉強になりました。

また、時代とともにWebフレームワークへの要求が変化してきている、ということも興味深かったです。

既存のSpringやPlayなどのフレームワークがそのあたりの変化にどう反応しているのか、Quarkus、Micronaut以外のフレームワークについて、GraalVMについてなど、知らないことも多いので折を見て調べていこうと思います。

参考資料

*1:実際試そうと思ったけど、MacでGraalVMのnative-imageインストールに手間取ったのでまた後日

「エンジニアの知的生産術」読書メモ(作成中)

はじめに

  • 知的生産=知識を用いて価値を生み出すこと。
    • 新しい知識を生み出すことが重要

1章:新しいことを学ぶには

学びのサイクル「情報収集・モデル化・検証」の3つの各要素についての解説。

2章:やる気を出すには

感想

3章:記憶を鍛えるには

  • アウトプットすると記憶しやすい → 「テスト」をしよう
  • 間隔反復法。忘れるくらい時間が経ってから復習すると効果的 (Cepada et al., 2009)
    • SuperMemo, Anki といったツールがある
  • 教材(テストの問題)を自分で作るのがよい

感想

  • 大問題として、「何を記憶すべきか?」と言われると自分は即答できない。
    • 記憶するためのメソッドは得られたので、覚えるべきことは何かを考えていく。教材を作ってメソッドを実践したい。

4章:効率的に読むには

  • 「読む」目的は、「有用な情報を見つける」「情報をもとに理解を組み立てる」の2つある。
  • 実際の読書は、2つの目的のグラデーションの間のどこかに落ちる
  • 2つの目的どちらを重視するかによって、速読のアプローチも異なる

感想

  • 自分は「組み立てる」読書に特化していて、「見つける」読書をあまりしていないと思った。
    • 言い換えれば、通読に囚われている。完璧主義な読書をしすぎ。
      • 全てちゃんと理解していなくても、「この本には〇〇が書いてあった」と言える状態に素早くなる、という価値観を持っていきたい
      • Whole Mind Systemを試してみたい。先人のブログがあった
        • 熟成のため、ちゃんと理解せずに寝ることになる。これまで、それを避けていたことで、細か過ぎる読み方をしていたと思うので、読み方を変えてみてどうなるか面白そう
  • シンプルに、本を読む前に「何のために読む?」を一旦書いておくと良さそう

5章:考えをまとめるには

得た断片的知識の集合を整理する方法について。主にKJ法。知識の断片から、図解や文章が得られる。

感想

  • 情報が多くて頭が整理できなくなったときに、この章の手法を実践して試してみたい。

6章:アイデアを思いつくには

  • 例えばプレゼン発表資料や企画書などを作るのに使えそうな話
  • イデアは、耕す→芽生える→育てる→耕す→...というサイクルを経て得られる
    • 耕す=情報を集め(これは5章)、かき混ぜ、つながりを見出すこと
      • 整理された情報をどう「アイデア」に言語化するか。いろいろなメソッドが紹介されている。
    • 芽生える、は管理できないフェーズ。
    • 育てる、は検証によってアイデアを磨くフェーズ。MVPを作って他人に意見をもらうなど。

感想

  • これも、実際にプレゼン資料を作るときとか、企画を考えるときに見直して実践してみたい。

7章:何を学ぶかを決めるには

  • 具体的な戦略
    • 探索:自分にぐっと来るものを探す(時間に余裕のある学生向け)。内面ベース。
    • 拡大再生産:筆者の造語、企業経営の考え方を個人の学びに適用する。今の知識から得られる時間・お金の再投資と、立場(ポジション)の活用。
      • 立場の活用には、ある分野で卓越することが重要。そのために学ぶ分野をずらしたり、かけ合わせたりする。

感想

  • 自分は王道/レッドオーシャンに飛び込みがちだけど、それは思考停止してるだけではと思わされた
    • 差別化してニッチに入って学ぶのはなんとなくカッコ悪い気もしていた
    • しかし、学ぶこと自体は価値につながらない。他の人が持たないものが価値につながると考えれば、ニッチに入ることこそ全体最適/王道かもしれない。

なぜスクラムイベントにタイムボックスが必要なのか

背景

スクラムガイドにも明記されている通り、スクラムイベント*1にはタイムボックス(時間上限)が定められている。 よって、イベントは決められた時間内に終わる必要がある(終わらなければふりかえって改善する必要がある)。 しかし、「なぜふりかえりを時間内に終わる必要があるのか?」と訊かれた際、「ルールだから」としか言えずちょっと困ってしまった。 スクラムガイドにも、なぜタイムボックスを設けるのかは書かれていない。

タイムボックスのメリット

以下のようなメリットがあるので、タイムボックス厳守と言われるのだろうと思います:

  • 全般
    • 締切があることで切迫感が生まれ、時間内に成果を出すよう集中しやすい
      • 詳しくないけれど、Temporal Motivation Theoryという心理学の理論によれば、締切が近づくとモチベーション(動機づけ)が上がると言われている
  • ミーティング
    • ミーティングは長くなっていくものなので、それを防ぐ
  • スプリント
    • インクリメントを定期的にチェックすることで透明性につながる
    • 開発にリズムが生まれる
    • 期間が一定な方がベロシティなどを計測/比較しやすい

あと、スクラムイベントというよりタスクの話だけど、終わりが不明瞭なタスク(調査など)でも明確に定義できる、というメリットもある。

まとめ/所感

  • 上記のようなメリットを認識した上でタイムボックスを守っていくのが良さそう。
  • 自分の経験では、ミーティングは延長しがちだけど、スプリントを延長したことはない。なので、ミーティングも延長せずに運用することはできるはず。

参考ページ

*1:スプリント/スプリントプランニング/デイリースクラム/スプリントレビュー/スプリントレトロスペクティブ

Fist to Five(フィスト・トゥ・ファイブ)について

  • Fist to Five:合意形成の手法の一つ。会議の参加者に挙手を求める。参加者は、示す指の本数で賛成の度合いを表す。
  • いくつかの方法(ルール)があり、細かい部分で異なっている
    • 何本ならどういう意味か、など
  • どのルールが「正しい」かをこだわるのはナンセンスだとは思うが、ルールを明確にすることは重要
    • 曖昧なまま行うと、結果の解釈がブレて、納得感が薄れるので

ということで、実際やる場合はどれかのルールを選ぶ必要がある。 どんなルールがあるかを調べて、選びやすくしておくと良さそうなので、以下にメモしておく。

Learning with Fist of Five Voting - Agile For All

  • やる前に、目的を明確にしておくことが重要
    • 現状の確認 (check-in)
    • 現状を知って合意を増す (learn and gain consensus)
    • 多数決で先に進む (vote and move forward)

ルール1(著者のおすすめ)

意味
0本 反対。合意して先に進むことを妨げる
1本 重大な不安があるが、合意して先に進むことは妨げない。支持する前に不安を解消したい
2本 懸念があるが、試してみてもよい
3本 支持する
4本 良いと思う
5本 極めて素晴らしいと思う

ルール2

0本(Fist)が無いパターン

意味
1本 反対。合意して先に進むことを妨げる
2本 懸念があるが一案だと思う。支持する前に不安を解消したい
3本 支持するが、賛否の中間あたり
4本 良いと思う
5本 極めて素晴らしいと思う

Ryuzeeさんの資料

例:Effective Retrospective | Ryuzee.com

意味
0本 この時点で決定を行うこと自体に反対
1本 重大な問題がある。そのまま決定したらアクションを起こす
2本 問題がある。もっと話し合いをしたい
3本 良いと思わないが自分はそれでも構わない
4本 良いので協力する
5本 素晴らしいので自分が実行のリーダーになっても良い

Leadership Nudge 142 - Fist to Five

www.youtube.com

  • 2択でなく、支持の程度を尋ねる目的
  • 0(明確に反対)〜5(大賛成)の間で投票

Webpackのexternalsについて

webpack 4.19.1 を使っています。

背景

Webpackの設定でexternalsを使うと、指定したモジュールをバンドル対象から外して外部依存のままにできる。 典型的には、ブラウザの<script>タグで別途CDNからjQueryをロードする前提で、かつソース内でjQueryimportしていると、webpack実行時にはモジュール解決できずエラーになってしまうが、externals指定することでエラーを回避できる。

たとえば

/* webpack.config.js */
module.exports = [{
  // ...
  entry: 'main.js',
  externals: {
    hoge: 'fuga'
  },
  // ...
}]

こんな設定で

/* main.js */
import {app} from 'electron';
import hoge from 'hoge';

// ...

をバンドルすると、hogenode_modules/とかに存在しなくてもwebpackはエラーにならず、バンドル後のファイルでは単に

module.exports = fuga;

となる。つまり、変数fugaが定義されていることを前提に、それをhogeモジュールとして使うようにバンドルしてくれる。

問題

公式ドキュメントを読んだが、いまいちexternalsの書き方がよくわからなかった。 stringarray, objectfunctionregexの5通りの記法があるらしい。 stringは上に書いた説明で良さそうだけど、後ろ4つについて理解したい。

結果

まだわかってない部分が多い。何かわかったら追記する...

array

externals: {
  hoge: ['fuga', 'piyo']
}

と書くと、モジュールの定義は

module.exports = fuga["piyo"];

と出力されていた。定義済みオブジェクトの子孫プロパティをモジュールと見なしたいときに使うと良さそう。

object

正確に言うと、stringの書き方を包含している模様。なのでstring以外にあたる書き方について。 結論から言うと、どう使うのかよくわからない。 ドキュメント同様

externals : {
  hoge : {
    root: ['fuga', 'piyo']
  }
}

と書くと、module.exports = fuga["piyo"]になるのだろうと思いきや

module.exports = undefined;

となりまともに実行できないバンドルができる。 ソースを見れば何かわかるのかもしれないが。。

function

これを使うと、ソースでimportしていたモジュールを、バンドルではCommonJS requireされるようにできる模様。 理解できていないけど、

externals: [
  function(context, request, callback) {
    if (request === 'hoge') {
      return callback(null, 'commonjs ' + request);
    }
    callback();
  }
]

と設定することで

module.exports = require("hoge");

なるバンドルができる。callbackの第2引数に'commonjs hoge'を渡している。第1引数は謎。 他にもできることがありそうではある。

実は個人的に一番知りたかったのがこれだった。

2018-09-23 1:00 追記

  • commonjs以外に指定できるキーワードには、this,window,self,global,commonjs2,amd,umd,umd2がある模様(ソース
  • callbackの第2引数に'commonjs ' + requestを指定する代わりに、callback(null, request, 'commonjs')と指定することもできる(ソース

regex

stringと同様。モジュール名と同名の変数が定義されていることが前提のバンドルができる。

(おまけ)予備調査

Webpackの吐くJSファイルはどんな構造になってるのか、そもそもわかってなかったので少し見た。 きっと設定で変わる部分もありそうだけど、自分の手元で見たものは以下のような感じになっていた。

(function(modules) {
  // 必要な関数の定義 + エントリポイントの実行
})({
  "モジュール1の名前": (function(...) {
    // モジュール1の定義
  }),
  "モジュール2の名前": (function(...) {
    // モジュール2の定義
  }),
  // ...
});
  • 全体は一つの匿名関数の定義となっていて、即時実行される
  • その際の引数として、全てのモジュールを持つオブジェクトが渡されている
  • エントリポイントもモジュールの一つとして扱われており、匿名関数の末尾でロード(実行)される

という感じ。