<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Trial and Spiral</title>
        <link>https://blog.solunita.net/</link>
        <description>試行錯誤顛末記録。或いは日記的な何か。
Web技術寄りな雑記Blog</description>
        <lastBuildDate>Fri, 01 Jul 2022 00:58:31 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>Gridsome Feed Plugin</generator>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[0.40.8/2022-06]（振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2022-06/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2022-06/</guid>
            <pubDate>Fri, 01 Jul 2022 00:50:23 GMT</pubDate>
            <content:encoded><![CDATA[<h2>来た道[2022-06]</h2>
<p>2022年もいそがしくしている間に振り返りせずにすでに半年が経過してしまいました。これではマズいなーと思ったのでやっていきます。</p>
<h3>出来事/体験</h3>
<p>年末年始、GWとムスメ氏を連れて実家に帰ったり。その折に子供も遊べる施設に行ったり、以前よりはコロナの影響で制限してたこともなくなり、また子供の成長とともにいけるところも広がりました。</p>
<p>本当に子供の成長はすごいもので、日々いろんなことを吸収し、できることが増えています。以前より楽にはなったものの、ステージが上がればまた新たな悩みもでてきて、親であることの難しさを実感する毎日です。</p>
<p>1月あたりに感染性の胃腸炎で30分置きに嘔吐したのは本当に焦りました。医療相談に電話して、それから夜間診療し、吐き気止めの座薬を入れ一段落。なんとかなったと思ったら僕も妻氏も感染し発症。時間差じゃなかったらヤバかったです。</p>
<h3>習慣</h3>
<p>できてないですねー。
体力の衰えを感じるので、そろそろ本当にちゃんと運動していきたい。</p>
<h3>アウトプット/創作活動</h3>
<p>こちらもできてないですね。
意欲はあるものの……</p>
<p>最近は構成管理ツールitamaeのmruby版、mitamaeを使ってMacの環境構築をするための設定をポチポチ進めています。</p>
<h3>装備、環境</h3>
<p>仕事の日用に服を決め、平日はまったく同じ服を着ている生活になって早3年。そろそろヨレてきたので刷新しました。
自分自身を含め、誰も自分の服装なんて気にしちゃいないし、毎日服を選択する手間が省けるのでこれはみんなにオススメしていきたい。私服的作業着スタイル。</p>
<p>半年なのでその他いろいろ買いました。</p>
<LinkCard url="https://item.rakuten.co.jp/sanwadirect/150-sncerg11/" site-name="楽天市場" title="エルゴノミクスチェア ハイチェア" description="[150-SNCERG11]【サンワダイレクト限定品】【送料無料】。【毎月1日限定 クーポンで1800円OFF】エルゴノミクスチェア ハイチェア 人間工学椅子 高さ調整 スタンディングデスク 上下昇降デスク対応 疲労軽減マット付 耐荷重125kg キャスター付き ブラック 在宅ワーク 在宅" image-url="https://shop.r10s.jp/sanwadirect/cabinet/1/150-sncerg11.jpg" />
<p>椅子を買いました。スタンディングデスク用の椅子。オフィスには昇降可能なハイチェアがって使い勝手がいいので、それに変わるものとして買いました。
スタンディング状態で腰かけても良し、背もたれに使うも良し、でなかなか良好です。難点はかなり大きいこと。
机の上げ下げするより手軽なので以前より立ってる時間が伸びて良い感じです。</p>
<AdCard asin="B07DPRFY5J" title=" シービージャパン 踏み台 ベージュ 耐荷重100kg トイレ用サポート ヨークデル " image-url="https://m.media-amazon.com/images/I/61vo3HU1zvL._AC_SY879_.jpg" date="2022-07-01" searchWords="トイレ用サポート ヨークデル" />
<p>子供のトイレトレーニングのために買った足置き。
これは大人も使えるんですが、便の出がマジで変わるのでめちゃくちゃ愛用してます。すごい！</p>
<AdCard asin="B09HZ3X6WM" title=" ケミカルジャパン ダンボールストッカー ブラック 横12cm 縦38.5cm 奥行10.5㎝ 挟んで 運べる 結びやすい 省スペース 軽量 組み立て不要 段ボール収納 " image-url="https://images-fe.ssl-images-amazon.com/images/I/61-CZF3IBCL.__AC_SX300_SY300_QL70_ML2_.jpg" date="2022-07-01" searchWords="ケミカルジャパン ダンボールストッカー" />
<p>そして今までダンボールの扱いに困っててみつけた、ダンボールストッカー。これの良いところは挟みこむ形式なので比較的省スペースなこと、そしてそのまま持っていけること。この半年のベストバイかもしれない。</p>
<AdCard asin="B07L1FVM6T" title=" アイリスオーヤマ リクック熱風オーブン FVX-M3B-B ds-2188146 " image-url="https://m.media-amazon.com/images/I/61ZBbHOq5XL._AC_SX679_.jpg" date="2022-07-01" searchWords="アイリスオーヤマ リクック" />
<p>そして最近熱風オーブン、いわゆるノンフライヤーを買いました。トースターが古かったのでリプレイスしつつ、子供が好きだから揚げものもぼちぼちやるようになったのでこちらでできないかと。トーストは美味しくできるし、冷凍揚げものにも使えるので今のところかなり満足。</p>
<h3>お仕事環境</h3>
<p>そういえばテックリードというやつになりました（他はわかりませんが）弊社の場合、テクニカル寄りというよりは、リリースに責任を持つとか、プロダクト方面にも寄ったチームリーダー的役割です。
35歳を越えてからエンジニアに転身した身で5年でここまで来たのはなかなか誇ってもいいのでは、という満足と、やはりいろいろ足りてないところも多いので精進するのみです。
幸いステレオタイプなエンジニアに欠けがちなコミュニケーションスキル方面には抵抗がないので自分の強みを上手くつかって立ちまわっています。逆に言うとそこでバリューを出すしかないとも言うが。</p>
<p>あとは認定スクラムマスタの研修を受け、試験をパスしたので、認定スクラムマスターという肩書を得ました。資格系を取得したのは久々ですね。上手く伸ばしていきたいところ。</p>
<h3>消費趣味</h3>
<p>あいかわらずゲーム三昧です。
去年ずっとやってきたノックアウトシティはやらなくなっちゃいました。
最近はSwitch Sports、ローラーチャンピオンズをやったり、フォールガイズをあたりやったりしてます。
コロナの影響か、期待していたゲームの出来が酷かったり、延期したりで、今はあまり前ほどのめりこんでないですが、ノックアウトシティで出会ったフレンドと別ゲーでもしょっちゅう遊べてる、その関係性と環境がとても良い感じです。</p>
<p>そうそう、Apexも一時期やってました。バトロワシューター慣れるために向きあった感じです。あまり上手くなれてはいませんが、楽しむための素養を身につけるところまではいけた、という感じ。
そうそう、10年以上前のXbox 360で一緒に遊んでたころのフレンドとも再び一緒にゲームできた経験はとても良かったです。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[0.40.2/2021-12]（月次振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2021-12/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2021-12/</guid>
            <pubDate>Fri, 14 Jan 2022 12:32:31 GMT</pubDate>
            <content:encoded><![CDATA[<!-- ひとこと -->
<p>2021年も終わってしまいました。昨年は本当に早く感じました。コロナ禍にあり外出や集まりを制限せざるを得なくなり、刺激が減って同じような日常が多かったせいなのかな、と感じています。
2022年は状況良くなると良いなあ、と思いつつ遅くなったふりかえりです。</p>
<h2>来た道[2021-12]</h2>
<h3>出来事/体験</h3>
<p>僕自身ではないですが、妻がムスメ氏を連れて妻の友人と動物園に行く日がありました。ムスメ氏自身も楽しんでいて、僕も一人の時間として使えたので良い日になりました。ムスメ氏の成長具合とコロナで様子を見ていましたが、今年はこういう日が増やせると良いなあ。逆パターンで妻が一人になれる時間も含め。</p>
<p>そしてクリスマスがありました。ムスメ氏はサンタさんやクリスマスソングなど楽しんでるものの多分イベントとしてクリスマスを認識してないよう。それでもプレゼントであげたおままごとキッチンは大喜びで遊んでるので父親の面目躍如でした。</p>
<h3>習慣</h3>
<p>そろそろ運動習慣再開しないと思いつつなんか毎日ヘトヘトなのでがんばれない。
体がバキバキなのでストレッチだけでもやっていきたい。</p>
<h3>アウトプット/創作活動</h3>
<p>なにもできてない。2022年はなんかしら個人開発をして世に出したいなあ。</p>
<h3>装備、環境</h3>
<p>鍵の締め忘れ防止になるやつを買いました。アナログな仕組みで鍵をかけるとインジケーターの色が変わるやつです。これによって僕みたいな「あれ？鍵しめてきたっけ？」みたいに不安になる民にオススメのやつです。
これはマジもっと早くに買っておけばよかった感。
<AdCard asin="B08QN2YDJ8" title=" カギの閉め忘れ防止 MIWA ChecKEY2 (チェッキー2) ブラック " image-url="https://m.media-amazon.com/images/I/51zfx5ssMkL._AC_SX679_.jpg" date="2022-01-14" searchWords="MIWA ChecKEY2" /></p>
<h3>お仕事環境</h3>
<p>インターン氏が12月いっぱいをもって終了になり、僕のメンターも終わりました。やはり人を指導するという経験は教えられることがたくさんあるなあと思いつつ、上手くできなかった反省点も山ほどあったのでこれからも精進していきたい。</p>
<h3>消費趣味</h3>
<p>相変わらずドッジボール（Knockout City）三昧です。
悲しいことにプレイ人口がそう多くなく、嬉しいことにプレイヤーのみんなはこのゲームを大好きでやりつづけている結果、けっこうなプレイヤーと何度も当たり、その結果仲良くなっています。</p>
<p>クルーというギルド的なチームのシステムをあるものの、その枠組みを越えて楽しくゲームできる仲間がたくさん増えた2021年でした。</p>
<p>2022年、そのつながりを保ったままドッジボールに限らずいろんなゲームで楽しんでいけたら嬉しいなあと思います。</p>
<h2>OKR</h2>
<ul>
<li>
<p>Objective：丁寧にコントロールできる環境を作る</p>
<ul>
<li>❌ KR：GTDを再整理して再開できている</li>
<li>❌ KR：家の中のモノが整理、収納がきちんとされている</li>
</ul>
</li>
</ul>
<!-- どうだったか -->
<p>GTDはぜんぜんレビューがおいついてないです。年末年始に実家に帰ったのでその折にやろうと思ってたんですが、結局できなかった。考えが甘かったですね。</p>
<p>そして整理収納もまだまだ。棚を新調したのでだいぶ片付き進捗はありますが、完了したとは言いきれず。</p>
<h3>ORK振り返り</h3>
<!-- どうしたらできたか、目標の立てかたがマズかったのか -->
<p>じゃあどうすれば達成できたかというと、結局のところそれらの事にあたる時間をいかに捻出するか、なんですが、それはもう結局ゲームする時間を少しガマンするしかなさそうな。</p>
<h2>行く道[2022-01]</h2>
<p>Objective：丁寧にコントロールできる環境を作る
□ KR：GTDを再整理して再開できている
□ KR：家の中のモノが整理、収納がきちんとされている</p>
<p>できてないので再トライです。とりあえず、GTDだけでもちゃんとやっていきたい所存。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[0.40.1/2021-11]（月次振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2021-11/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2021-11/</guid>
            <pubDate>Thu, 09 Dec 2021 00:20:26 GMT</pubDate>
            <content:encoded><![CDATA[<p>まじ超早かった。あっという間に11月終わってしまった。</p>
<h2>来た道[2021-11]</h2>
<h3>出来事/体験</h3>
<p>ムスメ氏と妻氏の親友家族と一緒に動物園に行きました。11月初旬は11月とは思えないくらい暖かくて、芝生でランチが楽しかった。コロナの影響であまりいろんなところに連れてってやれてないのでこれから機会を増やしていきたいな。</p>
<p>あとは妻氏がおでかけしてムスメ氏を日中僕一人で見てる日がありました。自我が芽生え始めてからは始めてで、それでも不機嫌になることなく一日を終えられたのが良かった。これから親もリフレッシュに遊びにいけるという試金石になりました。</p>
<h3>習慣</h3>
<p>やはりいったん習慣がストップすると再度スタートするのはなかなか難しく運動できてません。そしてまた風邪をひきました。無念。今のところ100％ムスメ氏の風邪を移さされてますが、よく考えると歯磨き当番なので、その後にろく手を洗ってないのが原因っぽい。気をつけよう。</p>
<p>最近、以前に買った猫背にならないようなコルセットを装着しています。まる一日つけてるとちょっと痛みがでますが適度にやる分にはけっこういいです。背筋のばして、肩甲骨引いていきましょう。</p>
<h3>アウトプット/創作活動</h3>
<p>珍しく有給をとったので一日ガッツリ勉強兼趣味開発してました。仕事より集中した気がします。とても良い時間だったのでやはり将来的に週4勤務、週1個人開発で生活していきたい欲が高まりました。</p>
<h3>装備、環境</h3>
<p>ブラックフライデーのセールでmi band 6を買いました、ちょっと前のやつ（3ぐらい？）は持ってたんですが、どこかに行ってしまい、買いなおし。この価格で電池持ちが良く小さいサイズっていうのはやはり最小限スマートウォッチとしてはとても良いですね。</p>
<AdCard asin="B097918L2C" title=" 【日本正規代理店品】Xiaomi Mi スマートバンド6 日本語版 1.56インチディスプレイ 血中酸素レベル測定 14日間のバッテリー持続時間 心拍数 睡眠モニタリング 30 種類エクササイズモード 5ATM防水 LINE・メッセージ・着信・座りすぎ通知 " image-url="https://images-fe.ssl-images-amazon.com/images/I/51wIk0RMFWS.__AC_SX300_SY300_QL70_ML2_.jpg" date="2021-12-09" searchWords="Xiaomi Mi スマートバンド6" />
<h3>お仕事環境</h3>
<p>コロナが落ちついたので週1出社になりました。確かに出社してコミュニケーションをとる利点もわかるけど、リモートに最適化された今は通勤を含めた出社するデメリットが大きすぎてまだ賛同はしかねますねえ。ましてやフルリモート！　ってしてしまえば居住地が制限されなくなるアドバンテージあるのになあ、と思います。</p>
<p>例えば独り身だったらフルリモート可のところに転職して本当に好きなところを居住地に選んで生きる、っていうのは大きく選択肢に入りますね。</p>
<h3>消費趣味</h3>
<p>ドッジボール（ノックアウトシティ）はあいかわらずですが、アウトライダースをまたイチからはじめました。ドッジボールのフレンドがSteamのセールで買ったのがきっかけ。前はほぼソロ専だったからマルチできて楽しいです。PS版もセール来たら良かったのに。</p>
<LinkCard url="https://www.jp.square-enix.com/outriders/" site-name="OUTRIDERS（アウトライダーズ）｜SQUARE ENIX" title="OUTRIDERS（アウトライダーズ）｜SQUARE ENIX" description="アウトライダーとして、人類の未来を切り拓け！最大3人のチームを結成し戦うCOOPシューティングゲーム『OUTRIDERS』公式サイト" image-url="https://www.jp.square-enix.com/outriders/assets/img/ogp.png" />
<p>他にはヘルダイバーもやってます。こちらはPSのセールで激安になってたので友人に勧めてみたら気にいってくれたようで。ライトかつシビアな協力ゲーとしては本当に出来が良い。続編を心待ちにしたい。</p>
<LinkCard url="https://www.playstation.com/ja-jp/games/helldivers/" site-name="PlayStation" title="HELLDIVERS（ヘルダイバー） | ゲームタイトル | PlayStation" description="仲間と結束して人類を勝利へと導け！ 爽快・硬派・超骨太のSFシューティングが登場!!" image-url="https://image.api.playstation.com/vulcan/img/cfn/11307fximt3e75YAEPhKvHikkgjn-qVMIzz2dFz_GXbUD96YnVPG8vLRsx_Kz3nt9zcxFz7JeZCsxBZfARnNT444uAAA1u0E.png" />
<h2>目標</h2>
<p>11月は目標を立てずにやってきました。ちょっと小休止。とはいえ、どういうことをやっていこうとか今はこれをやってみようとかそれなりに考えますね。逆に目標立てても同程度しか考えていないので、目標を立てることがちゃんと推進力になりえてないかもしれない。</p>
<p>長期的に目標なく過ごしてしまうのは良くないけど、短期的に目標ないつきがあってもアリだなと思いました。</p>
<h2>行く道[2021-12]</h2>
<p>12月というより、来年は「丁寧に確実にこなし、コントロールできている感のある日常」を目標としたいところです。12月はそのための助走期間としようかな。幸い、12月とか1月とかって掃除や整理に注力する機運が高まる時期なのでそれを上手く利用していきましょう。</p>
<ul>
<li>
<p>Objective：丁寧にコントロールできる環境を作る</p>
<ul>
<li>□ KR：GTDを再整理して再開できている</li>
<li>□ KR：家の中のモノが整理、収納がきちんとされている</li>
</ul>
</li>
</ul>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[0.40.0/2021-10]（月次振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2021-10/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2021-10/</guid>
            <pubDate>Mon, 15 Nov 2021 00:29:05 GMT</pubDate>
            <content:encoded><![CDATA[<p>もう月なかばになってしまいましたが、ちゃんと振り返り。
40の大台にのってしまったけどなにがあったわけではなくフワっと乗ってしまった感は否めない。</p>
<h2>来た道[2021-10]</h2>
<h3>出来事/体験</h3>
<p>10月は自分の誕生日がありました。もう40になってしまったことに自分で驚きです。初老です。不惑です。が、いまだに惑ってばかりです。前の節目、30になるときは世界を旅してる時でキルギスで迎えたのはよく覚えています。あれから10年、あのときなりたかった自分になれてるだろうか……</p>
<p>運動の秋ということでムスメ氏の運動会がありました。保育園の送迎は妻氏がやってくれてるのでムスメ氏が他者と触れあってるのをあまり目にしないですが、それが見えたので感動でした。ウチの子に限らず、どの子も眩しいほどに微笑ましさが爆発していました。</p>
<p>ロボット掃除機ルンバをサブスクで導入しました。こういう高額なものがサブスクでお試し的に使えるのは良いですね。自分の家と使い方にどのモデルがマッチするか、どのぐらい効果あるのかわからなかったのでサブスクで導入しました。</p>
<LinkCard url="https://www.irobot-jp.com/robotsmartplan/" title="Robot Smart Plan＋ | アイロボット公式サイト" description="キレイに掃除できるか気になる、価格が気になる、という声にお応えして、よりお試ししやすく、Robot Smart Plan＋が進化しました。是非、まずは一度、ご体験ください。" image-url="https://www.irobot-jp.com/robotsmartplan/img/ogp.png" />
<p>その後、体験が良かったのとサブスクと新品購入の金額を天秤にかけ、技術の進歩によるモデルチェンジも考慮に入れたらサブスクでいいかということになり継続を決めました。</p>
<p>唯一の誤算はムスメ氏がめちゃくちゃ怖がったこと。それはもうちょっと目を離したり同じ部屋で独りで遊ばせてこちらは家事をやる、なんてことができなくなる支障が出るレベルで怖がったのが大変でした。</p>
<p>これに関してはベースステーションを見えないところに設置すること、ムスメが居る時間には起動させないことでなんとかなりました。こういうこともあるのでサブスクで試せるのは良かったですね。</p>
<p>あとは初めてフリマアプリ（ラクマ）を使いました。PS4を売却したんですが、付属していた純正ケーブルを紛失していましたが代替で使っていたものをつけました。こういう選択が取れるので買取店に売るより便利ですね。</p>
<p>出品即売約、コンビニでラクマ用の配送を使い、びっくりするほど簡単かつすぐ終わった体験はとても良かったです。金額はそこまで重視してませんでしたが調べればなんとなく相場感わかるので、それも満足でした。</p>
<p>純正品じゃないものが混じっていたり、使用感のあるものだったのでクレームが心配でしたが、全くなかったです。今後も効果的に使っていこうかな。</p>
<h3>習慣</h3>
<p>仕事が終わりすぐ育児タイムになるんですが、頭と気分がまだ仕事から抜けきらず、仕事のことを考えつづけ上の空みたいな感じでした。</p>
<p>これをなんとかするために仕事終わって育児に入るときにHIITによるトレーニングを挟むことにしました。これは体も鍛えられ、気分もリフレッシュ、ムスメ氏も喜ぶ（一緒に運動したがる）とかなり上手くワークしてくれていました。</p>
<p>が、月半ばでまた風邪を引き、とぎれてしまいました。なかなか体に関する習慣をキープするのは難しいですね。</p>
<h3>アウトプット/創作活動</h3>
<p>特になし</p>
<h3>装備、環境</h3>
<p>相変わらずノックアウトシティにハマっている僕ですが、PS5のプレイ環境を良くしました。</p>
<p>PS5はPS4、PS5どちらのソフトも基本的に動作しますが、PS5のゲームは純正DualSenseしか原則的に動きません。ノックアウトシティはPS4版のみでした（今はPS5版がリリースされました）。純正DualSenseがどうも手に合わないのでコントローラを変えるのではなく、アタッチメントで良くする方向で改善しました。</p>
<p>もともと滑り易かったのでシリコンカバーをつけていましたがそれでもあまり良くない。なので思いきって貼るタイプのグリップを導入しました。</p>
<AdCard asin="B08MPB26PS" title=" A5(エーファイブ) PS5 エイム コントローラー グリップ 滑り止め【張り替え保証付属】PRIGMA プリグマ AIMINGGRIP+PLUS for PS5 プレイステーション5 " image-url="https://m.media-amazon.com/images/I/61BCESYfPNL._AC_SX679_.jpg" date="2021-11-15" searchWords="PS5 エイム コントローラー グリップ 滑り止め【PRIGMA プリグマ AIMINGGRIP+PLUS for PS5" />
<p>加えて、雑な操作をしているとLRトリガーから手が滑ったり、高さが低くトリガーの押しが遅れる気がしたのでこれもアタッチメントで高さを上げつつ伸ばしました。</p>
<AdCard asin="B08QNPMB6W" title=" PS5コントローラ用アタッチメント『アクションアシストセット5』 - PS5 " image-url="https://m.media-amazon.com/images/I/61wsLchQtnL._AC_SY879_.jpg" price="￥777" date="2021-11-15" searchWords="PS5コントローラ用アタッチメント『アクションアシストセット5』 - PS5" />
<p>この2つのアイテムによって操作感は劇的に良くなりました。もしかしたらもっといいものがあるかもですが、DualSenseに不満がなくなりました。</p>
<p>さらに長いUSB Type-Cケーブルを買い、無線接続から有線接続に変えました。応答速度が上がった気がしますが、たぶん気のせいです。が、バッテリーの心配がないのでこれはこれで楽です。</p>
<p>加えて、それまでコントローラのピンジャックに有線イヤホンを刺していましたがどうもマイクが変。思いきってSoundBlasterでUSBからアナログ変換してイヤホンを差すようにしました。別途ピンマイクも使えるのでPS5経由でのVC環境も良くなりました。</p>
<AdCard asin="B01EH510AW" title=" Creative Sound BlasterX G1 ポータブル ゲーミング USBオーディオ ハイレゾ 対応 Windows Mac PS4 SBX-G1 " image-url="https://m.media-amazon.com/images/I/71-ag5DRE3L._AC_SY879_.jpg" date="2021-11-15" searchWords="Creative Sound BlasterX G1 ポータブル ゲーミング USBオーディオ ハイレゾ 対応 Windows Mac PS4 SBX-G1" />
<h3>お仕事環境</h3>
<p>自分の居る部署で学生インターン生を受け入れることとなり、僕がメインの担当として対応しています。前職などで人に教える経験はあったものの、教えるのはなかなか難しいなあと思い知らされます。</p>
<p>自分の仕事も進めていかなければいけないし、教える時間もかかる、そのバランスのとりかたとか。人にモチベーション高く居てもらう方法や、指導の仕方、態度や言葉遣いなど。やればやるほど本当にまだまだだなあと思い知ります。</p>
<p>これも自分の成長の一助にしていけたらなあと思いがんばろう。</p>
<h3>消費趣味</h3>
<p>マリオパーティの新作を買いました。今作は過去のシリーズから評判の高いミニゲームが入っていて、僕のプレイしていた4、5のゲームもあるのが楽しいです。やはりビーチバレーは名作。</p>
<AdCard asin="B097C67NF2" title=" マリオパーティ スーパースターズ|オンラインコード版 " image-url="https://m.media-amazon.com/images/I/81XJoakMakS._AC_SX679_.jpg" price="￥5,841" date="2021-11-15" searchWords="マリオパーティ スーパースターズ|オンラインコード版" />
<p>またオンラインにもちゃんと対応しているため、最近はドッジボール仲間とワイワイやってます。</p>
<h2>目標</h2>
<ul>
<li>❌ リングフィット以外に筋トレを週3回以上する</li>
<li>❌ ストレッチも週3回以上する</li>
<li>❌ 寝起き、お昼、終業後に少し体を動かして体から上機嫌モードに入れるのを毎日やる</li>
</ul>
<p>どれもダメでしたね、原因は月半ばにひいた風邪。体調崩したからできないのは仕方ないとはいえ、その後なかなか再開は難しいですね。かといって体調不良期間はカウント外とするのもどこからどこまでを体調不良期間とするかが明確でない以上、良い解決法ではなさそうです。</p>
<h2>行く道[2021-11]</h2>
<p>さて、11月の目標ですが、考えあぐねて10日以上たってしまいました。目標が決まらないことで振り返りをしないというほうがマズい気がしたので、いっそ今月は目標を設定せず、目標から解放された気持ちで臨んでみようと思います。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ドッジボールゲームKnockoutCityについて熱く語る]]></title>
            <link>https://blog.solunita.net/posts/how-fun-to-play-knockout-city/</link>
            <guid>https://blog.solunita.net/posts/how-fun-to-play-knockout-city/</guid>
            <pubDate>Sat, 06 Nov 2021 12:10:23 GMT</pubDate>
            <content:encoded><![CDATA[<p>Knockout CityというゲームをプレイステーションではPS Plusの11月のFreePlayの特典になっています。これにより新規プレイヤーが爆増し、リリース直後以外では<strong>今が一番の始めるチャンス</strong>となってます。
なぜこんなに楽しめているか、という話がしたい！</p>
<h2>まとめ</h2>
<ul>
<li>PS plusで新規プレイヤーが爆増し、初心者も多い今が始める最大のチャンス！</li>
<li>エイムがほとんど要らないので楽しめる人が多い</li>
<li>TPS要素と読み合い、立ち周り重視のアクション性の高いシステム</li>
<li>プレイヤーの民度が高い</li>
</ul>
<h2>なぜ今が始める最大のチャンスなのか</h2>
<ul>
<li>PS Plusフリプ入りで新規プレイヤーが爆増中</li>
<li>新規プレイヤーが多いほど、新規プレイヤー同士で対戦することになり新規プレイヤーにはやりやすい</li>
<li>先日のアップデートでBotとの練習もできるようになった</li>
</ul>
<p>（僕も含め）リリース初期から今もプレイする人のほうが割合的に多かったこれまでは、初心者でも熟練者とマッチしてしまうこともあり、初心者にとっては苦くツライ試合をさせられてたことは否定できません。</p>
<p>ですが、新規プレイヤーが爆増中の今は違います。リリース直後以来の、初心者が初心者と試合して、ゆっくりと上手くなる土壌が復活しました。</p>
<p>なぜ今、新規プレイヤーが増えているのか？　ノックアウトシティは試用版がありランク25までは無料でできますが、それ以後は通常2,000円です。これがPS Plusの11月のフリープレイ特典になり、制限のない製品版が今なら無料で手に入ります。</p>
<p>これにより今まで興味を持ってたプレイヤー、試用版をやって興味はあるが買うに至らかなったプレイヤー、リリース直後の無料期間以後やめてしまったプレイヤー、知人がやるから誘われたプレイヤーなど様々なプレイヤーがプレイ開始しており、<strong>リリース直後以来では最大の新規プレイヤーの波</strong>が来ています。</p>
<p>これは今だけ無料化されてるPSユーザーだけでなく、他機種でも有料ではありますが、新しく始めるチャンスです！　今しかないってぐらいチャンスです！</p>
<LinkCard url="https://www.playstation.com/ja-jp/games/knockout-city/" site-name="PlayStation" title="Knockout City | ゲームタイトル | PlayStation" description="PS4で『Knockout City』を入手しよう。最新のチームベースのマルチプレイヤーゲームで、ハチャメチャに楽しくて激しい勝負に飛び込もう。" image-url="https://image.api.playstation.com/vulcan/img/rnd/202109/2708/4xu33sRfAp3DnaEplooYCj7e.png" />
<h2>そもそもノックアウトシティとはどんなゲームなのか</h2>
<p>ノックアウトシティとはPC, Xbox, PS(4,5), Switch、<strong>どのハードでもクロスプレイ可能</strong>な乱闘系ストリートドッジボールのゲームです。</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/BAMIRfeUb8Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<p>通常のスポーツのドッジボールのようなコートはなく、箱庭的で立体的なステージの中でバトルします。球は1つだけではなくステージ内にたくさん落ちていますし、ドッジボールなので相手の投げた球をキャッチもできます。</p>
<p>基本はルールによって2-4人でチームを組み、規定ポイントを先取したチームの勝ちです。相手を倒すとポイントが入るゲームがメインですが、他にも倒すとポイントになるアイテムが落ちるので拾う、相手を倒すと球になるのでゴールに入れる、などの変則ルールもあります。</p>
<p>ドッジボールの名のとおり、回避することもできますし、タックルを相手に当てれば相手をふっとばしつつ球を落とさせることもできます。そしてパス、チームの仲間に自分の球をパスもできます。</p>
<p>操作自体はシンプルながらも、個人技も連携もテクニックは存在しますので、入り口はカジュアルですが奥深いプレイにも十分楽しめます。</p>
<p>ストリートランク（Lv）25までは<strong>全てのハードともに無料体験できる</strong>のでまずはDLして遊んでみるのがオススメです！</p>
<h2>ノックアウトシティのここが面白い</h2>
<ul>
<li>ロックオン追尾なのでエイミング下手でも楽しめ、参加できてる感がある</li>
<li>FPS/TPSと違いキャッチができるので攻められても切り返せる</li>
<li>パスのシステムで連携が大事で手軽で楽しい</li>
</ul>
<p>通常のFPSやTPSでは弾は自分で狙わないとまず当たりません。いわゆるエイミングですが、これはかなりの練習を必要とします。</p>
<p>ノックアウトシティのシュートはロックオンによる追尾式で<strong>エイミングはほぼ不要</strong>です。FPS初心者にありがちな弾が全然当たらず参加できてる感もなく面白くない、みたいなことはありません。</p>
<p>とはいえ前述の通りキャッチがあるため、ロックオンしてるからといって適当に投げてもあたりません。逆に<strong>一方的に狙われてもキャッチできます</strong>。ダメージは入らないどころか攻守交代です。当たらなければどうということはない、というやつです。</p>
<p>さらにはパス。チームメイトと無言でも連携しやすく、自分自身はキルがとれなくても<strong>パスによるアシストでチームを勝ちに導く</strong>こともできます。パスは弾速も上がるためただ連携して動く以上に重要な行動になっています。</p>
<p>他にも楽しいところは挙げればキリがないですが、まずはこの3点が特に良いところです。</p>
<h2>ノックアウトシティのここが残念</h2>
<p>とはいえまあちょっと残念なこともないわけではありません。</p>
<ul>
<li>キャラのカスタムのセンスが日本人受けしにくい</li>
<li>（今現在は）リーグがチームエリミネーション、イベントはバトロワという初心者向けでない仕様</li>
</ul>
<p>キャラの顔や髪型、服などは好きにカスタマイズできます。今は種類も非常に多いんですが、ただあまり日本人好みでないようなデザインが多いように思います。ランクが上がり沢山手に入れた後はともかく最初のころの選択肢が少ないときはどうしても変な格好になってしまいがち。</p>
<p>基本のルールはチームKOという3vs3で10回相手を先に倒す、というルールになります。</p>
<p>ですが、シーズン3のリーグ（ランクマッチ）はチームエリミネーションというルールです。全滅するまでリスポーンせず、1デスが重く、やや初心者には楽しみにくいルールであることは否めません。</p>
<p>加えてフリプ化と同時に始まったKOロワイヤルもソロ8人によるバトロワ形式です。ノックアウトシティの醍醐味であるパスが意味をなさないルールであるとともに、早くにデスすると待ち時間が長く、8人のうち1人しか勝ちにならないルールで、こちらも初心者が気軽に楽しみ易いルールとは言い難いです。</p>
<p>幸い、<strong>シーズン4ではリーグのルールがチームKO</strong>に戻ることが決まってますし、イベントも2週間限定なのでいずれ解消される問題ではあります。ツラかったらいつでもずっと楽しめる基本にして王道の<strong>チームKOをストリートマッチで遊ぶのがオススメ</strong>です。</p>
<h2>ドッジボールとホーミングシステムの親和性</h2>
<h3>ホーミングがもたらす公平感</h3>
<p>前述のとおり（弾ではなく）球をシュートするとホーミングします。これが銃で打ち合うようなFPS、TPSと大きく違い、エイミングがほとんど必要ありません。これによって得られる恩恵はエイミングが下手な人でも楽しめるだけではありません。</p>
<ul>
<li>PCのキーボード+マウス環境とコンシューマのコントローラ操作の差がなくなる</li>
<li>通信状況が良くない状況に左右されにくくなる</li>
</ul>
<p>という利点があります。</p>
<p>そもそもロックオン式で精緻なエイミングが不要になので、PCのキーボード+マウス環境とコントローラの差が発生しにくくなり、有利だから勝った負けた、と判ずることなく<strong>公平感を持ってプレイ</strong>しやすくなります。</p>
<p>さらにシビアなFPSだとラグのよる当たったように見えて当たってない、もしくは逆の当たってないように見えて当たってる、のようなホーミングかつ弾ではなく球なのでFPSほどシビアな判定を必要としません。結果としてある程度ping値が高くても比較的快適にプレイできできるようになっています。</p>
<p>（もちろん極端に通信状況が悪い場合、ラグがないことはない）</p>
<h3>ドッジボールでホーミングだからこその楽しさと奥深さ</h3>
<p>普通のFPS, TPSと違いこれはドッジボールです。銃の弾が飛んでくるわけでじゃなく、球が飛んできます。球はホーミングするため、FPSの場合は動けば避けることができますが、ホーミングなため簡単に避けることはできません。その変わりタイミング良くボタンを押すことでキャッチができます。</p>
<p>球は銃の弾ほど早くないため、投げるのを見てからキャッチが間に合うことも多いですし、そうなると逆にボールを持って有利にすらなります。</p>
<p>しかし、同時にフェイクという技術があります。いわゆる投げるフリです。これを折り混ぜることで、<strong>近距離では格闘ゲームさながらの読み合い</strong>になります。</p>
<p>ボールに緩急つけて投げたり、近距離や速い球を先読みでキャッチしたり、逆に先読みを潰すためにフェイクいれたりとさながら心理戦になります。</p>
<p>加えて、シューターと違って弾が常にあるわけではなく、球を拾うかキャッチしないといけません。敵を先に見つけたからといって球がなければなにもできません。</p>
<p>しかもロックオンされている場合、画面に表示され、どの方角から狙われてるかもわかります。これにより先に狙われたのから絶大な有利があるわけではなく、<strong>何をされたのかわからないまま終わるようなことも少なく、初心者でも楽しめる</strong>作りになっています。</p>
<p>それでいて、上級者になればそのシステムを加味したうえで相手の隙を突いたり、あえて牽制につかったり、決してただとっつきやすくしただけでなく、深みもあります。</p>
<h1>こんな人にオススメ</h1>
<ul>
<li>PvPのシューターに興味があるけどエイムが下手で楽しめない</li>
<li>弾を打つだけでなくアクション性の高いゲームが好き</li>
<li>操作が複雑すぎず覚えやすいゲームのほうが好き</li>
<li>連携や共闘感を手軽に味わいたい</li>
</ul>
<p>というようなプレイヤーにはハマると思います。もちろん入り口はカジュアルめですが、底の浅いゲームではなく、上手くできるようになればなるほど、次の課題や伸びしろも見えてきます。</p>
<p>エイム力より読み合い力と反射神経、アクションゲームのような操作感、パスによる手軽で強力な連携と共闘感、これらが上手く噛み合えばハマると思います。
PS版だけでなく、PCやSwitch、Xboxの人とも遊べるのでぜひまずは体験版を触ってみてください。</p>
<p>初心者の方も沢山増えているので、近々自分も通ってきた初心者指南的な話も書きたいと思います。</p>
<LinkCard url="https://www.ea.com/ja-jp/games/knockout-city" title="「ノックアウトシティ」 - EA公式サイト" description="「Knockout City™」で熱いドッジボールバトルを体験しましょう。2021年5月21日に無料で体験" image-url="https://media.contentapi.ea.com/content/dam/eacom/c-ko/images/2021/02/koc-keyart-image-asset-16x9.jpg.adapt.crop191x100.1200w.jpg" />
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[0.39.10,11/2021-08,09]（月次振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2021-09/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2021-09/</guid>
            <pubDate>Fri, 08 Oct 2021 04:00:33 GMT</pubDate>
            <content:encoded><![CDATA[<p>先月分、サボリました。ので今回は8月、9月分です。仕事が忙しいのと体調崩してたりしてたらあっというまに2か月が過ぎさっていました。</p>
<h2>来た道[2020-08,09]</h2>
<h3>出来事/体験</h3>
<p>8月は毎週風邪を引いてたような気がします。恐るべし保育園の洗礼。そして落ちついたと思ったらワクチンの副反応。もう本当に毎週熱だしてました。重ならなかったのを幸いと喜ぶべきか。
そんななか9月のあたまには100人以上が参加する社内ハッカソンイベントの実行委員長として準備を頑張るも忙殺され、よく生き延びたな、という感じでした。
9月の終わりには体調も仕事も落ちつき、シルバーウィークに夏期休暇を混ぜて一週間やすみ、ムスメ氏を連れて実家に帰省しました。言葉を覚え始めたムスメ氏の語彙力がぐんぐん伸びてますが、刺激があるとさらに爆発的に伸び、成長ってすごいなあと関心するばかりです。</p>
<p>そして僕は大して成長してないっていうね。</p>
<p>そうそう、もう何年も眼鏡の度を変えておらず、眼鏡をつくるときも以前と同じ度で、みたいに作ってたので、休みがとれたときに眼科にちゃんとした検眼に行きました。結果は眼鏡ありで2.0。見えすぎぐらいなんで疲れるようならたびを落としてもいいかも、という話でした。</p>
<p>なんにせよ悪化してないとは良かったです。が、せっかく休みなら瞳孔を開く目薬とか使った本格的な検査までやればよかったかもなあとちょっとだけ後悔。その対応ができる眼科を調べるのを怠りましたね。まあまた来年ぐらいにやりましょう。</p>
<h3>習慣</h3>
<p>体調悪いのが続き、運動の週間も勉強の週間も続けることができずいったん停止。10月から本気だす。</p>
<h3>アウトプット/創作活動</h3>
<p>最低限の振り返りブログすらサボってしまったのでなにもなく。</p>
<p>強いていえば、唯一の楽しみだったノックアウトシティというドッジボールゲームのプレイング改善点を言語化したぐらい。これは今月ブログに書きたい。</p>
<h3>装備、環境</h3>
<p>布団に入って寝る前の読書が至福の時間なんですが、愛用のKindle Paperwhiteが完全に沈黙しまして。無いのに耐えられないのでなくなくセールでもなく普通の日にすぐに買いました。</p>
<p>が、その後、すぐにセールかつ新バージョンが出てヘコみました。しかも数日後文鎮化した旧Paperwhiteを付けてみたら正常に動くっていうね……もうなんだったのか。</p>
<p>が、防水Paperwhiteは良いですね！　特にお風呂読書もたしなむ僕としてはノーガードでお風呂に持って入れるのは嬉しいかぎり。</p>
<AdCard asin="B07HCSQ48P" title=" Kindle Paperwhite 防水機能搭載 wifi 8GB ブラック 広告つき 電子書籍リーダー " image-url="https://m.media-amazon.com/images/I/61rlEkSvl9L._AC_SX679_.jpg" price="￥8,980" date="2021-10-08" searchWords="Kindle Paperwhite" />
<p>Wi-Fiルーターを新調しました。ずっとGoogle Nest Wi-FiがWiFi6に対応したら買おうと思ってたんですが、いつまでも出ないのと、使っていたルーターの調子が怪しくなってきたので思いきって奮発しました。</p>
<p>WiFi6 + メッシュです。WiFi6対応機器はまだPS5しかないのであまり恩恵がないですが、メッシュで家の中どこでも不安定にならずに通信できてます。2LDKにはオーバースペック感は否めませんが。まあルーターなんてそうそう頻繁に買うものではないのでいいか、という感じ（予定はないけど）将来的に大きい家に移るとしてもたぶん5年ぐらいはこれで戦えるはず。</p>
<LinkCard url="https://www.amazon.co.jp/gp/product/B08D6L11JC/ref=ppx_yo_dt_b_asin_title_o06_s00?ie=UTF8&psc=1" title="Amazon.co.jp: NETGEAR Orbi WiFi6 Mini メッシュWiFi AX4200 2台セット 無線LANルーター 11ax トライバンド RBK752 無償3年保証 【Nintendo Switch/PS5/iPhone/android】 : 家電＆カメラ" description="オンライン通販のAmazon公式サイトなら、NETGEAR Orbi WiFi6 Mini メッシュWiFi AX4200 2台セット 無線LANルーター 11ax トライバンド RBK752 無償3年保証 【Nintendo Switch/PS5/iPhone/android】を 家電＆カメラストアで、いつでもお安く。当日お急ぎ便対象商品は、当日お届け可能です。アマゾン配送商品は、通常送料無料。" />
<h3>お仕事環境</h3>
<p>なんといっても前述の社内ハッカソンイベントの実行委員長をやったのが大きかったです。</p>
<p>普段のエンジニアとしての立ち周りとは全然違う、プロジェクトマネジメント力みたいなものを求められ、そしてそれがあまり得意でないことが浮き彫りになりました。というか人に仕事をお願いするのがめちゃくちゃ苦手なようです。
そして準備まわりに奔走し、僕の本分であるエンジニアリングに注力できなかったのもストレスがありましたね。進む日数、出せない進捗、積み上がるタスク、作れない時間……
本番は、前々職がイベント制作業だったキャリアとなんとか上手く活かせたかなーとは思います。なんか久々に本番前の不安と緊張、本番中の緊張と高揚、本番終了のカタルシスみたいなものを味わいました。参加者の皆さんはとても協力的だったので上手くいきましたね。ありがたい。
そして海外の参加者もいたので自分の語学力を含めた海外経験もなんとか活かせました。が、足りないところも見えたので、やはり英語、日常的に使っていかないとマズいなーと痛感。</p>
<p>ま、そんなこんなでツラくもありましたが、終わってしまえばいろいろ良い経験させてもらったなーとも思います。最終的には楽しかった！</p>
<h3>消費趣味</h3>
<p>もうずっとKnockout Cityです。ドッジボールのゲームです。たぶん毎日やってました。</p>
<p>ゲーム自体が楽しいのはもちろんですが、クルー（という同好のグループ、クラン的なもの）を作り自分がリーダーとなり小さいながらも運営してコミュニケーションしてるのも続けてプレイする後押しになっています。</p>
<p>リーダーとして小さいながらもコミュニティを運営していく大変さ、面白さもあるんですが、それよりもこの一緒に遊べる仲間が忙しい日々や仕事やプライベートが上手く行かない日の僕にどれだけ救いをもたらしたか。所謂「サード・プレイス」の役割になってくれて、一緒に遊んでくれている皆さんには感謝しかない。</p>
<p>シーズン3も始まったばかりだし、クロスプレイもでき、ランク25までは無料体験できるので本当にオススメです。
特に（僕のように）PvPシューター好きや興味あるけど、エイムが下手って人には刺さると思います。球はホーミングするのでエイミングより立ちまわりやキャッチが重要です。</p>
<LinkCard url="https://www.ea.com/ja-jp/games/knockout-city" title="「ノックアウトシティ」 - EA公式サイト" description="「Knockout City™」で熱いドッジボールバトルを体験しましょう。2021年5月21日に無料で体験" image-url="https://media.contentapi.ea.com/content/dam/eacom/c-ko/images/2021/02/koc-keyart-image-asset-16x9.jpg.adapt.crop191x100.1200w.jpg" />
<h2>目標</h2>
<ol>
<li>
<p>身体的アプローチに寄せて日々をハッピーにする</p>
<ul>
<li>❌ 上機嫌でいられるための身体的アプローチをする</li>
<li>❌ リングフィット以外に筋トレをする</li>
<li>❌ ストレッチもちゃんと再開する</li>
</ul>
</li>
</ol>
<p>ダメダメでした。多忙と体調悪いことから筋トレはもちろんリングフィットすらやってませんでした。ストレッチはこまごまとやってはいますが、ちゃんとはできてませんねえ。上機嫌でいられるための身体的アプローチも全然だめでした、意識すらいってませんでしたねえ。</p>
<p>余裕がないのがいけなかったと言いわけは立つものの、今のままじゃいけないなあ、とも。</p>
<h2>行く道[2020-10]</h2>
<ol>
<li>
<p>身体的アプローチに寄せて日々をハッピーにする</p>
<ul>
<li>□ 寝起き、お昼、終業後に少し体を動かして体から上機嫌モードに入れるのを毎日やる</li>
<li>□ リングフィット以外に筋トレを週3回以上する</li>
<li>□ ストレッチも週3回以上する</li>
</ul>
</li>
</ol>
<p>基本的には前回の引きつづきですが、前回のものは達成判定がわかりにくい書きかたなのを修正しました。</p>
<p>他にもインプット、アウトプット系もやっていきたいんですがそこは今月試してみて感触を掴んでから来月ぐらいに目標に入れていこうかな。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[39.9/2021-07]（月次振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2021-07/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2021-07/</guid>
            <pubDate>Sun, 08 Aug 2021 12:16:30 GMT</pubDate>
            <content:encoded><![CDATA[<p>なんか7月も一瞬で過ぎさった気がします。仕事まわりでいろいろやることが増えたからかな？</p>
<h2>来た道[2020-07]</h2>
<h3>出来事/体験</h3>
<p>ムスメ氏の初外食デビューでした。大き目の公園にいった帰りによってみました。想像してたより全然おとなしくモグモグしてくれたのが嬉しかったとともに、これからムスメも連れて外食できる選択肢が増えたことがありがたいです。</p>
<p>初水族館にも行ってみました。ここのところ急激に言葉を覚えだしたので「おおっきいねー」とか言うのが可愛くてたまらんでした。コロナでいままで自粛してたぶんワクチンで落ち着きが見えたらいろんなものを見せてあげたいなあ。</p>
<p>そして月末近くはムスメ氏からの風邪が家庭内パンデミックひきおこしてダウンしてました。全然直らなかったで立てつづけに2種の風邪を引いたもよう。</p>
<h3>習慣</h3>
<p>毎日の振り返り全然してないです。週次も。これはいかんです。習慣がとぎれたというより、振り返りをしない習慣がついてしまったような感じ。コーディングする機会が減ったことにより技術知見が増えにくくなってるのもあるかもしれません。でもそれそれで他のことに対する振り返りをしたほうが良いですね。</p>
<p>それとは別に、機嫌良くふるまうことを習慣化しようとトライしてみました。 先月の振り返りでも書きましたが、機嫌良く居ることではなく振る舞うこと、というのがポイントです。そう意識してたからか少しはできた気がしますが、まだまだです。</p>
<h3>アウトプット/創作活動</h3>
<p>なんにもできていない。</p>
<h3>装備、環境</h3>
<p>とくになんにも変わってない。</p>
<h3>お仕事環境</h3>
<p>特に変わりありませんが、自分が実行委員長になっている社内イベントのあれこれが本格化して忙しくなってきました。やることはそこまで多くないんですが、普段のエンジニアリングと全然違うことをやり、かつ、初体験なので脳内リソースがハンパなく取られるというか。</p>
<p>逆に採用の協力として技術面接の一員として参加するのは慣れてきました。が、英語でのやりとりなので英語力が酷く落ちてるのを実感する日々です。なんとかしたいなあ。</p>
<h3>消費趣味</h3>
<p>あいかわらずドッジボール（Knockout City）ばっかりです。</p>
<p>実はクルー（というクラン的なグループ機能）を組んでいて、そのキャプテン（=管理者）なんですが、Discordサーバーを立ち上げたり管理したり、Botを入れたりしていました。人数の少ないクルーなのでそれほど大変ではないんですが、クルーの方針を決めたりするのはなかなか面白い体験です。</p>
<p>メインはDiscordになるんですが、これは使えば使うほど面白いシステムですね。従来のボイスチャットとは全然違う。サーバーという単位で自由に運営できるので中のカスタマイズも自由で自分達の色がでるし、Botで機能を拡張したり。Slackと似ているけど、ボイスが主体なのとあくまでメインのゲームなどがあってその補助ツールの側面なので違うところも多いですね。なによりボイス回りが素晴しく快適なのはすごいの一言。</p>
<p>前も書いたかもしれませんが、オンラインメインのゲームの攻略やコミュニケーションは匿名掲示板の時代ではなくなってきたなぁと実感します。あちらは後ろ向きな発言する方々がかなり目立ちます。面白いと思えるゲームに出会ったら人数多く活発な公開Discordサーバーを探して入ってしまうほうがよっぽど楽しめると思います。</p>
<h2>OKR</h2>
<ul>
<li>
<p>Objective：いつも上機嫌に振る舞えるようになる</p>
<ul>
<li>✅ KR：上機嫌でいることに関する本を読む</li>
<li>✅ KR：上機嫌でいられるための身体的アプローチをする</li>
</ul>
</li>
</ul>
<p>本は二冊読みました。</p>
<AdCard asin="null" title=" いつも機嫌がいい人の小さな習慣 仕事も人間関係もうまくいく88のヒント (毎日新聞出版) " image-url="null" date="2021-08-08" searchWords="つも機嫌がいい人の小さな習慣" />
<p>こちらはちょっと合わず。ちょっとしたハッピーを集めていつもハッピーで居ましょうみたいな感じ。悪くないけど僕のアプローチとは全然違いました。</p>
<AdCard asin="null" title=" 上機嫌の作法 (角川oneテーマ21) " image-url="null" date="2021-08-08" searchWords="上機嫌の作法" />
<p>こちらはななかなか良かったです。身体的アプローチについてそこそこ書いてありました。かつ読みやすかったです。これ系の本がもっとあると良いのだけど。</p>
<p>で、実践の結果ですが一応は効果あったかな、と思います。が、劇的に変わったかというとまだまだですね。積み重ねが大事なのでがんばっていきます。</p>
<h2>行く道[2020-08]</h2>
<ul>
<li>
<p>Objective：身体的アプローチに寄せて日々をハッピーにする</p>
<ul>
<li>□ KR：上機嫌でいられるための身体的アプローチをする</li>
<li>□ KR：リングフィット以外に筋トレをする</li>
<li>□ KR：ストレッチもちゃんと再開する</li>
</ul>
</li>
</ul>
<p>上機嫌の身体的アプローチは継続。風邪でリングフィットも休んでましたが直ってきたので再開、それとともにオリンピックと他のことで刺激を受けることがあったため筋トレちゃんとやろうと思いました。また最近サボりがちなストレッチもちゃんと再開していきます。</p>
<p>そしてアウトプットの習慣もちょっとちゃんとやらないとなあ……と思う日々です。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[39.8/2021-06]（月次振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2021-06/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2021-06/</guid>
            <pubDate>Thu, 15 Jul 2021 14:32:50 GMT</pubDate>
            <content:encoded><![CDATA[<p>月も半ばですが6月の振り返りです。だいぶ過ぎてしまいましたがやってきます。</p>
<h2>来た道[2020-06]</h2>
<h3>出来事/体験</h3>
<p>瞬間最大風速的に人生で数えるほどのメンタルが不安定になりました。色々と反省。やりたいこと、やらなきゃいけないこともありますが、7月、まずはここをなんとかしようと思いました。</p>
<h3>習慣</h3>
<p>日次、週次の振り返りが疎かになってきています。日次についての原因はスケジュールしてるにもかかわらずスケジュールを守っていないことですね。日次ができてないから週次もおっくうになりできていないと。</p>
<p>インプットの習慣は上々です。お風呂では大体読書していますし、技術書から実用書まで幅広く読むようになってきました。これは苦と思ってないので引き続きできる範囲で継続していきたい。</p>
<h3>アウトプット/創作活動</h3>
<p>React（Next.js）とFirebaseで軽くWebアプリを作ろうと思ってたんですが、なかなか進まず。キモはフォームの入力内容から画像を作るところです。イメージできてるものを作るのは楽しいんですが、どうすればいいかってところから学習コストを払いつつ作ることへ、最近はなかなか面倒と思うようになってきました。</p>
<p>勉強しながら作る、というは学習のあり方としてかなり有効なのは知っていますが、まったく知見がない状態で技術やライブラリ選定から始めるのはツライですねえ。相談できる場があれば良いのですが。</p>
<h3>装備、環境</h3>
<p>今月の消費は全然ないですね。強いていえばPS5用のコントローラグリップを買ったぐらい。ただ使い心地はめちゃくちゃ向上した、という感じでもないので、完全に好みによる感じですかね。</p>
<h3>お仕事環境</h3>
<p>まず、業務では海外拠点もあり、そこのエンジニア採用に協力するようになりました。採用系は初挑戦ですし、候補者のコードも見なければいけないし、加えて実際の面接（オンライン）も英語でやらなきゃいけないというなかなかハードシチュエーションですが、新たな挑戦、無理しすぎず頑張っていきたいです。</p>
<p>加えて弊社では年イチで1週間の社内ハッカソンイベントがありますが、今回の実行委員長になりました。これも新たなチャレンジですね。自分の幅を広げるために頑張っていきたいです。</p>
<p>どちらの話も嫌ではないものの、自分から率先して手を上げたわけではないので、年数や経験を重ねていくとコード書いてるだけじゃダメなんだなあと身に沁みて感じました。</p>
<h3>消費趣味</h3>
<p>あいかわらずドッジボール（Knockout City）の毎日です。知人を誘ってもイマイチ反応薄かったんですが、実はリアルなドッジボールやくにお君を想像してたようで、言葉だけでは全然面白さが伝わってませんでした。</p>
<p>ちょっと上手くなるのに見返すためにも布教にも使えるので最近ではプレイ動画をちょいちょい撮るようにしています。</p>
<h2>目標</h2>
<ul>
<li>❌ 日次と週次振り返りを継続する</li>
<li>✅ 3日に一度、5分はインプットorアウトプットのための行動をする</li>
<li>❌ 自分のWillと、仕事をしていくなかWillを見つめなおす</li>
</ul>
<p>冒頭書いたように日次、週次レビューできてないわけではないですが、疎かにしているので達成とは言えないですね。</p>
<p>インプットはバッチリ。</p>
<p>自分の仕事でのWillは多少考えたもののまだぼんやりとしています。今月（7月）仕事での目標に対していろいろアクションがあるのでその中でなにか答えが見い出せたら、と思っています。</p>
<h2>行く道[2020-07]</h2>
<ol>
<li>
<p>Objective：いつも上機嫌に振る舞えるようになる</p>
<ul>
<li>□ KR：上機嫌でいることに関する本を読む</li>
<li>□ KR：上機嫌でいられるための身体的アプローチをする</li>
</ul>
</li>
</ol>
<p>今月は一重にこれでいきます。</p>
<p>僕は、「気持ちをコントロールするのはほぼ不可能。身体操作から気持ちにアプローチするほうがよっぽど簡単で頼りになる」という理念があります。笑うから、笑顔だから楽しい、というアプローチです。落ちつくには深呼吸、そういう話です。</p>
<p>我々は人間には気持ちという掴みどころのないものを操作する方法は未だ確立されてないんです。そんな難しいことを頑張ろうとせず、身体操作をきっかけに気持ちを制御する方法に注力すべきです。</p>
<p>今回は上機嫌でいること。本当に心から上機嫌でいるかは二の次で、上機嫌に振舞いつづけることが重要と感じました。</p>
<p>肩の力を抜いたり、楽しそうにしていたり。発声や言動も含みます。</p>
<p>そして不機嫌は伝播しますが、気持ちは不機嫌でも振舞いが上機嫌だったら伝播させずにいられるはずです。</p>
<p>それらをひっくるめていつも上機嫌に振る舞えるようになる、です。どのようなアプローチができるかは本を読んでから考えようと思います。特に実際達成できたか（振る舞えてたか）を測る指標を立てづらいのでどうできるかなあ、といったところ。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[39.7/2021-05]（月次振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2021-05/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2021-05/</guid>
            <pubDate>Sun, 06 Jun 2021 11:02:46 GMT</pubDate>
            <content:encoded><![CDATA[<p>もう5月も終わっちゃいましたね。GWがあったので今月は特に早く感じた気がします。なんだかこの状況下、日々が淡々と進んでいきますね。季節の変わりめなので体調に影響でました。</p>
<h2>来た道[2020-05]</h2>
<h3>出来事/体験</h3>
<p>GW、実家に帰りました。両親、兄弟ともにムスメ氏にメロメロでした。人見知りもせず、かといっていろいろわかってきだしたので可愛い盛りですね。ムスメも楽しそうだし、両親も大喜びだったのでとても良かった。また車移動オンリーだったので他人との接触を最小限に抑えれたのもの良かったです。</p>
<p>出来事としてあったというか、できなかったというか。結婚記念日があったはずななのに育児を含めた日々を生きることにせいいっぱいで何もできませんでした。なんかしたいと思いつつも。</p>
<h3>習慣</h3>
<p>習慣というか、Udemyでの学習を始めました。定期的に学習しなきゃと思いつつも、就業後に体力、精神力のどちらか一方または両方が枯渇していて、本を開いてーとか手を動かしてーというのがハードル高いです。</p>
<p>ちょうどこういうインプットしたい、と思ってたUdemyが安いのを見つけたので見だしたら動画のため、ハードルが低く、また、お風呂にスマホ持ちこめばお風呂でも観れるので重宝しています。</p>
<h3>アウトプット/創作活動</h3>
<p>とくにありませんでした。無念。</p>
<h3>装備、環境</h3>
<p>今月は（も）いろいろ買いましたね。</p>
<LinkCard url="https://www.jins.com/jp/airframe/" site-name="JINS - 眼鏡（メガネ・めがね）" title="Airframe（軽量メガネ） | JINS - 眼鏡（メガネ・めがね）" description="まるで空気のようなストレスフリーなかけ心地。そんな究極のかけ心地を実現したJINSのAirframe。" image-url="https://www.jins.com/jp/client_info/JINSJINS/view/userweb/ext/airframe/img/og.jpg" />
<p>まず眼鏡を数年振りに買いました。朝寝起きでムスメ氏の相手をしていたらバキっと見事に折られました。フレームの耐久性と軽さ、掛け心地重視でJINSのヒンジレスAirFrameを買いました。今のところ好調です。それとは別にそろそろちゃんと眼科で検眼したいな。</p>
<AdCard asin="B081RXBLPL" title=" daccolino ダッコリーノ ベーシック (オリーブイエロー) " image-url="https://images-na.ssl-images-amazon.com/images/I/41v8nFATR9L._AC_.jpg" price="￥32,560" date="2021-06-06" searchWords="daccolino ダッコリーノ" />
<p>ダッコリーノという簡易だっこ紐になる鞄を買いました。同種のものにパパコソというのがあります。ダッコリーノに決めたのは、背中サポート帯が付いてることと、座る部分にフレームが入ってること。値段はだいぶしますが、かなり満足していて出かけるときに役立ちました。特にサッとつけれると、エレベータやエスカレータ探したり遠まわりしなくて良くなるし、両手も空けれるので良いですね。</p>
<p>エアコンも買いました。去年末に越したここには寝室にエアコンがありませんでした。さすがに最近寝苦しくなってきたのでそこそこのものを買いました。今のエアコンってそこそこするんですねえ。出費はあったものの、旧居ではエアコンは備えつけで古いものを使い続けるしかなかったんですが、新しいものはやはり良いものです、性能的に。ここを転居しても移設できるといいなあ。</p>
<AdCard asin="B08YN6ZJDN" title=" Secrui ワイヤレスチャイム インターホン 配線不要 玄関ちゃいむ 無線 簡単 防水防塵 32メロディー 300M遠距離無線範囲 5段階音量調節 0dB～120dB 送信機1 受信機2 ホワイト " image-url="https://images-fe.ssl-images-amazon.com/images/I/61Ess16RuEL.__AC_SX300_SY300_QL70_ML2_.jpg" price="￥2,580" date="2021-06-06" searchWords="Secrui ワイヤレスチャイム インターホン 配線不要" />
<p>仕事部屋にいると玄関チャイムが全く聞こえず、宅配がわからない問題があったため後付けチャイムを買いました。部屋の中の鳴る側に電源こそつかうものの、複数箇所が同時に鳴るし、設置も簡単でした。聞こえない問題は完全に解消されて快適になりました。</p>
<h3>お仕事環境</h3>
<p>全社のエンジニアミーティングで最近の活動について喋りました。本業はサーバーサイドやりながら、フロントエンドもやってます的な話。結構前から目指してたスタイルではありますが、ひとまずスタートラインには立てたかな、という感じ。悩みは尽きませんが。</p>
<p>そろそろだいぶ遅くにエンジニアになってサバイブしている話をこのへんに絡めてアウトプットしたい所存。</p>
<h3>消費趣味</h3>
<LinkCard url="https://boardgamearena.com/welcome" site-name="Board Game Arena" title="このサイトでプレイ可能なゲームリスト" description="このサイトでプレイ可能なゲームリスト" image-url="https://x.boardgamearena.net/data/themereleases/200316-1631/img/mainsite/landing_img.png" />
<p>かねてからのボードゲーム仲間とBoardGameArenaでオンラインで遊びました。以前プレイしたときとき体験の良さが予想を上まわらなかったんですが、原因はセレスティアを遊んだからなような気がしています。割り込みでできるアクションが多く、都度プレイヤーに聞いてくるのでテンポが非常に悪い。逆に今回は別のゲームをやったらかなり体験良かったのでまたやっていきたいね、となりました。</p>
<LinkCard url="https://www.ea.com/ja-jp/games/knockout-city" title="「ノックアウトシティ」 - EA公式サイト" description="「Knockout City™」で熱いドッジボールバトルを体験しましょう。2021年5月21日に無料で体験" image-url="https://media.contentapi.ea.com/content/dam/eacom/c-ko/images/2021/02/koc-keyart-image-asset-16x9.jpg.adapt.crop191x100.1200w.jpg" />
<p>新作のドッジボールゲームnockout Cityやってみたらドハマりしました。エイム力が要らないので、多少の通信都合やハード差がないのがクロスプレイと相性良く楽しいですね。昔からのドッジボールという遊びを今のゲームに上手く落としこんだな、と思います。カジュアルな間口とチームや立ち回りの奥深さもちゃんとあってしばらく楽しんでいけそうです。</p>
<h2>目標</h2>
<ul>
<li>✅  日次と週次振り返りを継続する</li>
<li>❌  3日に一度、5分はインプットorアウトプットのための行動をする</li>
</ul>
<p>振り返りは継続できています。が、ちょっと適当になってきてる感があるので引きしめていきたい。</p>
<p>インプット、アウトプットはなかなか難しいですね。上にも書いたようにやはり、自分の自由な時間には体力と気力が枯渇しています。Udemyの導入によって兆しが見えつつはありますが。</p>
<p>週イチブログをやめましたが、それ以来、1記事も書きませんでした。書こうとは思ってるもののやはりネタもなく。仕事をしてればインプットもあるにはあるんですが、記事にする程度のものかというとそこまででもなく、Twitterで事足りるレベルなんですよね。</p>
<h2>行く道[2021-06]</h2>
<ul>
<li>日次と週次振り返りを継続する</li>
<li>3日に一度、5分はインプットorアウトプットのための行動をする</li>
<li>自分のWillと、仕事をしていくなかWillを見つめなおす</li>
</ul>
<p>継続とリベンジ。</p>
<p>それと人生のWillはちゃんとあるものの、仕事で目標設定となったとき、ちゃんと上手くリンクしてないというかそもそも仕事にフォーカスしてないというか。最近おざなりだったのでちゃんと向きあう季節ですね、1年も折り返し地点ですし。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[39.6/2021-04]（月次振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2021-04/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2021-04/</guid>
            <pubDate>Sat, 08 May 2021 14:39:02 GMT</pubDate>
            <content:encoded><![CDATA[<p>なかなかコロナ禍が明けませんね。GWがあり、ちょっと出遅れましたが先月の振り返りです。</p>
<h2>来た道[2021-03]</h2>
<h3>出来事/体験</h3>
<p>ムスメ氏が保育園に行きはじめ、妻さんが職場復帰しました。ムスメ氏は人見知り全然しないのでさっそく嬉々として保育園に登園し、親としては大助かりです。</p>
<p>妻さんも基本出勤ですが、たまにリモートでも仕事しており、ムスメ氏がいない家で二人でいるのが新鮮です。かなり久々に二人で外食をしました。自分の仕事はあまり変わらずだけどそれでも4月になれば環境かわるものですね。</p>
<h3>習慣</h3>
<p>週イチブログやめました。理由としては、あまりネタがないのに週イチを継続することを目的としてなんとか捻り出した出枯らしのように薄い記事を書きつづけることの無為さ、ネタはないか探しつづけながら過す一週間のストレス、それらが意味のあるものに思えなくなったことが理由です。
もちろん、週イチブログコミュニティを通してある程度習慣化でき、強制力がなくともコンスタントにブログを書いていける気がしているのも大きな要因です。結局ネタの濃度は上がらないかもしれませんが、今後は楽しみながらブログを続けていきたいと思います。</p>
<p>先月、今月の目標として挙げた日次と週次の振り返り、ちゃんとできています。なかなか良い感じ。詳しくは後述。</p>
<h3>アウトプット/創作活動</h3>
<p>Slack App用のフレームワーク、Boltの最新版（v3)をいじってました。socket-modeというWebSocketによる通信ができるようになったお陰で開発と動作確認にngrokのようなサービスを使わなくていいのはとても良いですね！
ですが、今あるものをリプレイスしようと思ったらfirestoreを使うんですがこれをちゃんとTypeScriptでやろうとする学習コストを時間的に払うのがおっくうでまだ進めていません。</p>
<h3>装備、環境</h3>
<AdCard asin="B01DB70A9O" title=" スティックシェーバースリムヘッド ブラック KQ1805 " image-url="https://images-na.ssl-images-amazon.com/images/I/41%2B-RgVzktL._AC_.jpg" price="￥1,280" date="2021-05-08" searchWords="スティックシェーバースリムヘッド ブラック KQ1805" />
<p>以前から悩んでいて鼻毛カッターを買いました。実はすでにUSB充電式を持っていたんですが、そんなに頻繁に使わないので毎度使いたいときには電池が切れてる状態でした。今回のはどうせそうならと思い電池式にしたのと、径細めにしました。細いの、なかなか良いです。</p>
<AdCard asin="B08WQ6346B" title=" バッファロー nasne HDDレコーダー 2TB 地デジ / BS / CS チューナー torne 【 PS4 / iPhone / iPad / Android / Windows 対応 】 NS-N100 " image-url="https://images-fe.ssl-images-amazon.com/images/I/71oH8yIfQYL.__AC_SX300_SY300_QL70_ML2_.jpg" date="2021-05-08" searchWords="バッファロー nasne HDDレコーダー 2TB 地デジ / BS / CS チューナー torne 【 PS4 / iPhone / iPad / Android / Windows 対応 】 NS-N100" />
<p>Baffalo版として新生したnasneを買いました。これは先日購入したモバイルディスプレイとChromecast with Google TVで使うのが目的で、torne mobileを入れればモバイルディスプレイでもTVを観ることができるようになりました。もちろんスマホやタブレットで観ることもできます。</p>
<AdCard asin="B07ZKP357V" title=" エレコム ゲーム用ボイスチャットミキサー スマホ通話しながらSwitch/PS4のゲーム音を聞けるデジタルミキサー HSAD-GM30MBK " image-url="https://images-fe.ssl-images-amazon.com/images/I/71ruwcwbEDL.__AC_SX300_SY300_QL70_ML2_.jpg" price="￥2,127" date="2021-05-08" searchWords="エレコム ゲーム用ボイスチャットミキサー HSAD-GM30MBK" />
<p>他にはゲーム用にヘッドホンミキサを買いました。というか買ってたんですが品切れだったのがようやく届きました。わりと安いもので、ゲーム機からのUSBヘッドセットとして入力したものとスマホのアナログ端子の音を混ぜつて1つのヘッドホンに出力するというもの。ヘッドホン側のマイク入力はスマホ側に流れます。要はゲーム音とスマホのDiscordやLINE通話などの音を混ぜて聞き、そのマイクはスマホ側のDiscordなりLINE通話に流す、ゲームしながらボイチャする環境を整えるものです。</p>
<p>いろいろあるなかでこれを選んだのはゲーム機側からの入力がUSBなので音の回り込みをある程度防げそうだからです。アナログ端子は良くも悪くもガバガバ仕様で、こういった廉価なものでミキシングができちゃう反面、聞いてる音がマイク側に流れこみやすい性質もあります。これは片側がUSB入力なのでそれを軽減できるだろうと思いました。実際に試したところ、少し聞こえるけど気になる程じゃない、とのことでした。僕はOutriders（PS5）でDiscord併用、妻さんはモンハンライズでLINE通話と併用で楽しめています。</p>
<h3>お仕事環境</h3>
<p>4月になり弊チームにも新卒のメンバーがJOINしてきました。随分まわり道をした僕と違って純粋かつ真面目、そして優秀と素晴しいですね。僕もいろいろ勉強させてもらうつもりで挑みます。</p>
<p>そして折りしもちょうど緊急事態宣言の谷間だったので弊社でもこじんまりながらも入社式が行なわれました。その中で2年目の方からスピーチがありましたが、とても素晴しく、僕が社会人二年目でこんなこと言えただろうかと関心しました。</p>
<p>初心忘るるべからずですね。僕も見習ってがんばっていこうと気持ちを改めました。</p>
<h3>消費趣味</h3>
<p>楽しみにしてたOutridersがリリースされました。これのためにPS5を間に合わせて購入したといってもいいでしょう。事実、ロードは爆速、60FPS安定してますし最高です。ゲーム自体も楽しいんですが、残念ながらいまだにバグが多いです。致命的なものもありましたが現在ではあらかた直っています。</p>
<p>先月末ですが妻さんがモンハンライズを買ったので、ちょこちょこ僕もやっています。Outridersの高難度が疲れるので気楽に楽しめるものをと手を伸ばしました。</p>
<h2>目標</h2>
<ul>
<li>✅ 週次レビューと週次で中振り返りもする</li>
<li>✅ 毎日（平日）ログをとり、小振り返りする</li>
</ul>
<p>ちゃんとできました。要因としては毎日の小振り返りをちゃんとスケジュールして時間を決めて確保してるのが良かったです。それがあるから週次の振り返りもやりやすかったです。良い感じなのでこれからも継続していきたいと思います。</p>
<h2>行く道[2021-04]</h2>
<ul>
<li>□ 日次と週次振り返りを継続する</li>
<li>□ 3日に一度、5分はインプットorアウトプットのための行動をする</li>
</ul>
<p>振り返りは良い感じなのでこのまま継続で。</p>
<p>週イチブログをやめたのもインプットが足りてないから、ということでなかなか時間や気力の確保が難しいながらもコンスタントに手をつけることだけはしていこうと思います。5分ぐらいと設定しておけば、とりあえず手をつける、となりますし、ヤル気は慣性が働くので余力があれば5分にとどまらずできるはず、という目論見です。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Notionで日報的な日次ログをとりつつポモドーロテクニックを併用しはじめた]]></title>
            <link>https://blog.solunita.net/posts/taking-daily-logs-with-pomodoro-in-notion/</link>
            <guid>https://blog.solunita.net/posts/taking-daily-logs-with-pomodoro-in-notion/</guid>
            <pubDate>Sun, 11 Apr 2021 12:05:25 GMT</pubDate>
            <content:encoded><![CDATA[<p>先月の振り返りときにも書いたんですが、月次振り返りが思うほど効果でてない、とか、GTDの週次レビューが時間かかるとか、の問題に対策として日次で軽く振り返りする作戦を打ち立てました。</p>
<p>実際にやりかたをNotionでやってみていますが、これがなかなか良いという話。</p>
<h2>概要</h2>
<ul>
<li>Notionのテンプレート機能はいいぞ</li>
<li>Linked Database機能もいいぞ</li>
<li>合わせてやるといいぞ</li>
</ul>
<h2>Notion is何？</h2>
<p>情報管理ツールの1つで、EvernoteやScrapboxと同系統のWebサービスです。</p>
<LinkCard url="https://www.notion.so/" site-name="Notion" title="Notion – The all-in-one workspace for your notes, tasks, wikis, and databases." description="A new tool that blends your everyday work apps into one. It&#39;s the all-in-one workspace for you and your team." image-url="https://www.notion.so/front-static/meta/default.png" />
<p>実際使いこなしていくと機能面では結構違うんですが、目的としては個人またはチームでの情報管理です。Markdown互換の書き味を保ちつつ、ファイル間リンク、データベース機能やTrelloのようなカンバンボード風の表示など、多機能です。</p>
<h1>なぜやったか、期待すること</h1>
<p>冒頭に書いたとおり、月次や週次でのレビューが上手くいってないので、日次で軽くやるようにしました。</p>
<p>週次で言えば月曜の仕事中に考えたことを手掛かりなしに週末のプライベートな時間に思い出すのは難しいです。日次のデータがあれば、週末に日次のデータを振り返ればいいわけです。</p>
<p>これによって振り返りにかかる時間の短縮とともに濃度も上げる狙いです。また、日次で振り返りしていれば例え週次や月次で漏れてしまっていても、日次で前日の結果をもとに翌日トライしてたりするはずです。</p>
<h2>実際やったこと</h2>
<p>記録していく媒体はNotionにしました。Notionはデータベース的にデータを持てるため、際限なく情報が増えていくようなものと相性が良く、さらに文書のプロパティを自由に設定できるので管理もしやすいです。DBごとにフィルタやソートも聞くので過去のものを探すのにも不自由しません。</p>
<p>まず、ざっくり何が必要か考えて仮で書いてみました。必要な項目は、</p>
<ul>
<li>TODO</li>
<li>気になったこと、今日得た知見</li>
<li>
<p>振り返り（YWT）</p>
<ul>
<li>やったこと</li>
<li>わかったこと</li>
<li>つぎやること</li>
</ul>
</li>
<li>今日はどうだったか</li>
</ul>
<p>という感じで始めてみました。</p>
<p>具体的にはNotionでDaily LogsというTable Databaseを作り、templateに上記の項目を見出しとしてセットしました。</p>
<p>振り返りにはYWTを採用しました。KPTのKeepよりもわかったことを積み重ねていくのが合いそうだな、と思ったのが理由です。</p>
<h3>YWTではなくYWNT</h3>
<p>従来のYWT（やったこと、わかったこと、次にやること）をやっていましたが、どうもちょっとハマらない感がありました。これはわかったことは確定的な知見によりがちで、そこまで至ってないものを記録しづらいのが原因と考えました。</p>
<p>そこで悩んだこと（N）を追加してみました。</p>
<p>これは悩んでやってみたけど、まだわかったという結果に至ってもいないものも入ってきます。同時に悩んだ = 作業に時間がかかった原因であること、が多いですし、以前自分で何か理由があってこうしたけどあの時何を考えて（悩んで）、そう結論を出したんだっけ、ということも多いので記録するようにしました。</p>
<h3>やることにポモドーロテクニックを使うようにした</h3>
<p>以前ポモドーロテクニックについて本を読み記事を書きました。</p>
<LinkCard url="https://blog.solunita.net/posts/learn-pomodoro-technique-properly/" site-name="Trial and Spiral" title="Pomodoro Technique 再入門 - 今まで僕のやっていたものがポモドーロテクニックは全然理解せずにやっていた違うものでした | Trial and Spiral" description="勤務形態が変わり、これを機に仕事（作業）をこなす1つの方法としてポモドーロテクニックに再入門しました。これが予想以上に衝撃で、今まで自分のやっていたポモドーロテクニックは全然ポモドーロテクニックのことを理解していないものだと知りました。 ネットの情報やポモドーロテクニックに触れ..." image-url="https://blog.solunita.net/assets/static/cover.75e41ba.dd3080e00fac785c6b35800e7be03e0a.jpg" />
<p>が、その後運用は上手くいってませんでした。原因の一端として、計画シートの運用や、どうだったかの記録がちゃんと取れてないと思っています。ポモドーロテクニックの本質は25分サイクルではなく、プランして、集中できたかを計測し、次に行かすポモドーロニックの計画シートにあると思っています。</p>
<p>ある程度の柔軟さが求められるため手書きが一番やりやすいですが、Excelのシートでもできるような感じです。ExcelのシートでできるならNotionのTable Databaseでも実現できる！　と考えたのがブレークスルーでした。</p>
<p>具体的にはDaily Logsとは別にPomodoroというTable Databaseを作り、ポモドーロテクニックの本を参考にこんな感じのプロパティにしました。</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3cmW5PHTCedmoH608-HypUsuzJaBBbMIQ29x_DU41G7mZIOHB99Cq0AtqFHP2wILczUGxDXnwItK9kMIA95vdIP4qMKPOnuNIigdjTwwgyle2MzYfcknc73xXhRLXh-fd9lvf4igl_L1Vs_RC2ZA5c-=w2060-h1584-no?authuser=0"></p>
<h3>ポモドーロテクニックの情報をDaily Logに乗せる</h3>
<p>これはNotionのLinked Databaseを使います。これによってDailyLogの1ページに共通して1つのTable Databaseを表示できます。</p>
<p>ただし、その日以外のものを表示したくないのでフィルタで表示を絞ります。</p>
<p>ここは少し運用でカバー味があるのですが、Templateとしては完了日をis Emptyにしておきます。</p>
<p>そしてその日の振り返りときにやれたものに対して、その日を設定していき、最後にフィルタをその日指定にして完了です。これを振り返り時のルーティンとしてやっています。</p>
<p>この時、手がつけられず翌日以降に持ち越しの案件は完了日がないため、翌日にtemplateからnewするときに自動的に表示されるようになっているという仕組みです。</p>
<h3>なにかあればとりあえず書きとめる</h3>
<p>実際の作業中、誰かから何か依頼があったり、違うことを考えたり、どうしても非集中は避けられません。ポモドーロテクニックではそれも計測するシートになっています。この日次ログのシートはポモドーロテクニックの進捗も管理しているため常に表示しておき、いつでも追記できるようになっています。ここに自由に書いていきます。</p>
<p>これが極力ポモドーロのサイクルを守るためのメモになりますし、日の終わりに振り返りをするときにこの雑記から、上記のYWNTに落としこんでいけます。</p>
<h3>今日の気分と感想</h3>
<p>今日の気分は5段階評価にしました。これはテキストで書くのではなく、プロパティのドロップダウンとして設定しました。</p>
<p>それとは別に感想欄を設けました。ここは一言、今日はどうだったー的に書くものです。
また余談ですが残業したかどうかでプライベートの時間や気分にけっこう影響すると感じていたので、残業したかどうかのチェックも用意しました。実際どのぐらいの頻度で残業したか計測してみようという試みです。</p>
<h3>（現状の）最終的な形</h3>
<p>以上の経過を経て、今は</p>
<ul>
<li>
<p>プロパティ</p>
<ul>
<li>Mood（気分を5段階評価）</li>
<li>OverWork（残業の有無）</li>
</ul>
</li>
<li>今日気になること</li>
<li>Pomodoro</li>
<li>メモ</li>
<li>YWNT</li>
<li>感想</li>
</ul>
<p>という感じです。</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3f9U_xFMB9AK6BMWQ4PmKIVjrGVJtgosZU-VcigehqaFAQyaC5eW9BRIblcrDUfwaWM_PNEkWqsA5sDjEMapIOcGkWAFvvmrPv3yup42yxda1N3c8eisx7aW9H5SA0hiGG5EQtmGETruzo3NRh1KC4K=w1435-h1584-no?authuser=0"></p>
<h2>やってみた結果</h2>
<p>今のところけっこう上手くワークしています。ひとまず毎日それほど苦もなくログが取れています。これはやはりテンプレートとしてスキーマを決めたこと、Notionが書きやすい、という2点が大きな要因だと思っています。</p>
<p>その他の要因として、毎日終業するぐらいの時間に15分程度の振り返り時間をあらかじめスケジューリングしてるのも大きいです。一度忙しくて、あとでやろうとして見事に忘れその日を終えました。GTDでも言われているようにスケジュールは聖域ですね。</p>
<p>プロパティで気分と残業の有無を計測しているので、これが積み重なると簡単にその月に残業は多かったのか、全体的に良い気分の月だったのか、などもわかりそうです。</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3cPU4PbBzi42Hgb_KCivYu88ZtGvMEVSPm85nrJ5CQGDRtCM1G1aiKPUEzQ5_OI6YmSQxNGte0Ih8OhYihRtKI6-vC8P4uI4C4TdDckDohaHiwB3q5I4a-D8kgUah3GGQGOx3q3BTcva9lz1SL_xZeh=w2180-h1194-no?authuser=0"></p>
<p>もちろんそれらはExcelとかでもできますが、Notionでは自由に書くスペースも同時に確保できて一元管理ができるのが利点ですね。</p>
<h2>感想</h2>
<p>Notionは他にもすごい機能がいっぱいあって機能を使おうとしてかえって乱雑になることもあるので注意が必要です。道具に振り回されるというか。</p>
<p>今回、この仕組みは上手くハマりましたね。NotionのDatabaseとTemplateは例えば3行日記などの日次で振り返るフォーマットにはかなり良い感じで使えそうです。</p>
<p>あとはこれが良い感じで何ヶ月も継続できるかどうかだ……</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[39.5/2021-03]（月次振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2021-03/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2021-03/</guid>
            <pubDate>Sat, 03 Apr 2021 11:30:36 GMT</pubDate>
            <content:encoded><![CDATA[<p>今年も4分の1が終わりました。早いものですね。最近いまいちです。一年も4分の1が終わってしまったので巻き返していきたい。</p>
<h2>来た道[2021-03]</h2>
<h3>出来事/体験</h3>
<p>なんか胸に違和感というか苦しさがあり病院に行きました。一応異常なしとのことでした。以前から稀に胸がグッと苦しくなることもあったのでやはり心配ではあります。今も違和感が完全にないわけではないんですよね。なんだろう。しばらく様子見たあと、再検査に行きます。</p>
<p>PS5を買いました。ようやく。現行のPS4ゲームのクオリティアップと4月からのゲームをやりたいという理由です。疲れましたね。いろんなところの抽選に落ち、Amazonや楽天の争奪戦に破れ。結局ヨドバシカード持ちの妻とヨドバシアキバに土曜の朝行って買いました。それからめっきりPS5発売情報を追ってないですが、ヨドバシカードで店頭販売狙いが一番楽で早いかもしれません。</p>
<p>無事買えたことより、これで争奪戦からイチ抜けたできた気持ちの安堵の恩恵のほうが大きいというのがなんとも。もちろんゲームライフ自体も向上しましたが。</p>
<h3>習慣</h3>
<p>あまり習慣化ちゃんとできてませんね。良くない。ストレッチも英語学習も全くやってないわけではないのですが、頻度は大分落ちています。</p>
<h3>アウトプット/創作活動</h3>
<p>CLI用のコマンドをちょっと作ろうとしたんですが、 結局開発環境を整えたところで止まってしまっています。</p>
<h3>装備、環境</h3>
<p>PS5以外にもいろいろ買いました。</p>
<LinkCard url="https://store.google.com/jp/product/chromecast_google_tv" site-name="Google Store" title="Chromecast with Google TV" description="Chromecast with Google TV turns any TV into a smart TV with one seamless experience for all your streaming apps." image-url="https://lh3.googleusercontent.com/lPergWbp7um1fCeFFKOUalK-YMWAZiyIziIbvLXdTfZlSmaLz19yWOrenUd-TFZSRdAq7oyFYT-QRdNsJ1LtVg" />
<p>まずはChromecast with Google TV。以前買ったポータブルディスプレイに繋げてつかっています。動作もキビキビ動いて快適です。楽にオンデマンドのサービスを観たりしていますが、本当の目的は4月に手に入るバッファロー版新型nasne + torne mobileでテレビを観られるようにしたかった目的です。</p>
<AdCard asin="B07RZNG5Q4" title=" avedio links 4K 60Hz HDMI 切替器 分配器 3入力1出力 HDMI2.0b セレクター HDMI切り替え3ポート HDMI スイッチャー HDCP2.2 HDR 3D 1080P Xbox PS4 Fire Stick HDTV対応 手動切替 電源不要 (高速HDMIケーブル付き) " image-url="https://images-na.ssl-images-amazon.com/images/I/71hGUB1YSAL._SX522_.jpg" price="￥1,999" date="2021-04-03" searchWords="4K 60Hz HDMI 切替器 分配器" />
<p>それとともにHDMIスイッチャーを買いますいた。HDMIも規格が細かいので対応機器を探すのがかなり面倒ですね。とりあえず無電源かつHDMI2.0b対応のものを。ケーブルも中継器も4K 60Hz, HDR対応のものを正確に探すのが大変です。</p>
<AdCard asin="B07ZQGDHP2" title=" アイリスオーヤマ リンサークリーナー 染み抜き 布製品洗浄機 水と空気の力で汚れを吸い取る 温水対応 コンパクト 掃除機 RNS-300 " image-url="https://images-na.ssl-images-amazon.com/images/I/51GalKFZqnL._AC_.jpg" price="￥7,861" date="2021-04-03" searchWords="アイリスオーヤマ リンサークリーナー 染み抜き 布製品洗浄機 水と空気の力で汚れを吸い取る 温水対応 コンパクト 掃除機 RNS-300" />
<p>他にはカーペットなどのクリーナー買いました。水で濡らしてバキュームで吸うタイプ。使ってみましたが、本当に良く落ちます。ウチはほぼ全面白いカーペット敷きなんですが、今まで少し汚れが気になったり汚さないように気をつけていましたが、これのおかげで汚れても掃除すればいいや、という気持ちで生活できるようになった心理的効果が大きいです。もっと早く買っていても良かったな、という感じ。</p>
<p>あとはムスメ氏の保育園が始まるのもあり、ついに電動アシスト付き自転車を買いました。ちょっと重めな荷物をもって乗ってみましたがすごいですね。グンって感じで漕ぎ出しをサポートしてくれますね。</p>
<p>そんなこんなでけっこうな散財月でした。いろいろ要り用でしたね。</p>
<h3>お仕事環境</h3>
<p>お仕事環境特に変わらずです。ようやくフロントエンドにも慣れてきました。が、今まで自分は本職じゃない割にはCSSとかけっこうデキると思っていましたが、以外にそちらで詰まったり時間がかかることが多く、課題も見えてきました。</p>
<h3>消費趣味</h3>
<p>シン・エヴァンゲリオンの公開が話題になったので、ようやく序・破・Qを観ました。中学のリアルタイムの時以来のエヴァです。シンは観に行くかわかりませんが、楽しめました。と、同時に特に序を観たとき、自分の中学時代のことがいろいろFlashバックして、変な恥ずかしいようないたたまれないような気分になりました。</p>
<h2>目標</h2>
<ul>
<li>❌ 最低週4でストレッチする</li>
<li>❌ 最低週4で積んでる技術書、実用書を読むまたは英語のトレーニングをする</li>
<li>❌ 最低週4で何か運動する</li>
</ul>
<p>どれもダメでした。運動やストレッチ、勉強はしてないことはないんですが、一定頻度で継続できてませんでしたね。ちょっとリズムが崩れたり、疲れたりするとなかなかですね。</p>
<p>対処法法としては、 目標を低くする。例えば、ストレッチの最初のところだけはやる、とか、英語の1センテンスだけやる、とか。人のモチベーションには慣性があるのでとっかかりだけするようにして、あとは慣性に任せるというアプローチがよさそう。</p>
<p>別の視点としては、例えば残業したする日は疲れてるし、自由時間も少ないし、なにより自分に言い訳がなりたつのでついサボりがち。とはいえ疲れてるのは仕方ないとして、そもそもどれぐらいの頻度で残業してるのかモニタリングするのもアリだな、と思いました。</p>
<h2>行く道[2021-04]</h2>
<ul>
<li>□ 毎日（平日）ログをとり、小振り返りする</li>
<li>□ 週次レビューと週次で中振り返りもする</li>
</ul>
<p>まずこれだけをやりたいと思います。トラッキング。GTDも結局上手くまわってないですし。
先日月イチ挑戦コミュニティのほうで雑談していて、月イチの振り返りがイマイチちゃんと振り返れてない、という相談をしました。原因としては</p>
<ul>
<li>自分一人なので意見に限りがある</li>
<li>スクラムのレトロスペクティブを考えたら月イチだと比率的に4時間必要。現実的ではないかも</li>
</ul>
<p>という話になりました。</p>
<p>であれば、まず小さく日時で振り返る。まとめて週イチで少し振り返る。それを元に月イチで振り返る。という作戦にしてみます。まず記録をとることから。プライベートでこうして立ててる目標はダメでももしかしたら仕事で奮闘していたりするかもしれないですし。</p>
<p>ちなみにこの取り組みと同時にポモドーロテクニックもちゃんとやるようにしてみています。毎日ログとって振り返るのであれば、ポモドーロテクニックのフォーマットに乗せちゃえば一石二鳥じゃないか、という試みです。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[技術英語を本当に正しい発音をつらぬくか考えて、長いものに巻かれようと決めた話]]></title>
            <link>https://blog.solunita.net/posts/should-we-pronounce-english-accurately-in-japanese-conversation/</link>
            <guid>https://blog.solunita.net/posts/should-we-pronounce-english-accurately-in-japanese-conversation/</guid>
            <pubDate>Sun, 28 Mar 2021 13:12:36 GMT</pubDate>
            <content:encoded><![CDATA[<p>エンジニアとしてやっていると避けてとおれない英語。英単語がそのまま使われる場面も多いのですが、どうにも変な発音だな、と思うことや、この単語の正しい読みとは、と思うことがあります。</p>
<p>しかし、英語の発音の正しさよりも一般的に言われている発音をするほうが、コミュニケーションに齟齬が生まれず良いんではなかろうか、そもそも和製英語だってあるし、正しさを貫くよりも共通認識を合わせるが良いだろうな、と自分のなかで決めた話です。</p>
<h1>概要</h1>
<ul>
<li>エンジニアが日常で使う単語に英語が多いけど、変な発音が一般化してたりする</li>
<li>正しい発音にこだわって伝わなければ意味がないので、正しさは置いておいて認識を合わせにいく</li>
<li>一方で正しい発音も知っておくほうがいい</li>
</ul>
<h2>発端</h2>
<p>僕が気持ち悪く感じてた代表選手は<code>warn</code>。カタカナにするとウォーンが正しいです。<code>warning</code>ならウォーニング。warはウォーですね。スターワーズとは言わないし、ワールドワートゥーとも言わないです。なんだけど、みんなwarningって出るとワーニングと言っていて、日本人（エンジニア）同士の会話でウォーニングと発音されているのを聞いたことはありません。</p>
<p>最近よく耳にするようになった、賞を意味する<code>award</code> ですが、これはもっと一般的にアワードと言われていますね。ミュージックアワードとか。これも同じくアウォードがより正確です。が、なぜかアワード。みんなスターワーズとか言うのだろうか、というと言わない。このブレが気持ち悪くないですか？</p>
<h2>そして僕は英語として考えるのを止めた</h2>
<p>warに限らずこういう英語の発音からするとちょっと変な発音はいくつかありますが、 気になるものの気にしないことにしました。</p>
<h3>コミュニケーションの本質は意思疎通ができること</h3>
<p>発音が正確でも伝わらない言葉は意味がないし、逆を言えば発音が不正確でも伝わればいいんです。ウォーニングが出てますよって言って伝わらない状況より、ワーニングが出てますよ、っていって伝わるほうがコミュニケーションとしてはよっぽど価値があるはず</p>
<h3>気持ち悪さに自分で理屈をつける</h3>
<p>その行為を自分でヨシとするにはまだ少しの気持ち悪さが残る。これを飲み下すには何かしらの理屈が必要でした。</p>
<p>そもそも例えば僕も含めてDatabaseを意味するDBをデービーと言う例に始まり、すでにして自分も英語的発音に近くない言葉も許容しています。他にはnullをヌルとか。defaultもデフォルトが一般的ですね。正しくはディです。</p>
<p>となれば今さらこれは良い、これは良くないなんて考えないで一般的にそう言われてるものに従うので良いんじゃないかと思いました。</p>
<p>もとは英単語を見ても英語に近いカタカナな日本語として認識するというか。そう、英語のような日本語なんだ。そう思うことにしました。</p>
<h3>お互いに英語を母語としないときもある</h3>
<p>そもそも僕等がそうであるように、コミュニケーションに英語を使う場面でも相手も英語ネイティブではないケースもあります。我々がカタカナに引きづられガチなのに対して、各国いろいろな発音の癖もあります。だからもう英語の発音的正しさを気にしすぎても仕方ないかな、と思いました。伝わればいい、というの唯一の正義。</p>
<p>ものすごい余談ですが、僕はいろいろと今までの経験で、英語を聞いてその人の母語が何語かけっこうな確度でわかります。英語ネイティブでも場所によって訛りがあるのだから音の正しなんてものはきっとあってないようなもんです。</p>
<h3>短縮系をどう読むか、ネイティブもブレブレな件</h3>
<p>charとかenumとか。charはcharacter、enumはenumerationとかから来ていますね。これらはチャーだったりキャラだったり。enumもイニュムではなくイナムだったり。directoryを指すdirはディルだったりディアだったり。</p>
<p>なにが正解かわからないのでもはや気にするのをやめました。</p>
<h2>とはいえ英語でちゃんとした発音も知っておいたほうが良い</h2>
<p>世界がどんどん距離が縮まり、海外の人とのやり取りも多くなってきました。で、あるなら、やはりここまで書いた話はともかく、英語としてはどう読むのか知っておかないとこんどは海外の人とのコミュニケーションに支障をきたします。自分が喋らない場合でも聞いてわかるかわからないかは重要ですね。</p>
<h3>発音記号をちゃんと見る</h3>
<p>個人的な偏見かもしれませんが、知らない英単語を調べるとき、発音記号まで見る人って少なくないですか？　いやそれ以前に発音記号の読み方を知らないのかもしれない。</p>
<p>英語を調べるとき、Google検索でササッと見るのではなく、発音記号付きのサイトでみる。もしくはMacであれば付属の辞書アプリにちゃんと和英辞書も入ってますのでそっちを使う。</p>
<p>余談ですが、その時ちゃんと品詞まで見るといいです。英語を扱ううえで品詞はめちゃくちゃ重要です。</p>
<h3>今まで僕が出会った気になったもの</h3>
<h4>route</h4>
<p>routingとか、routesとか良くでてきますね。アメリカ英語的にはラウタ、と発音するのが近いです。が、日本人同士でルート、ルーティングと言っていてラウタと言ってるのを聞いたことはありません。これも知識として知っておいたほうがいいですね。</p>
<h4>parse</h4>
<p>ス、じゃなくてズ、濁ります。パーズとかパーザーとか。ただし、これはもしかしたら米語と英語で違うかもしれません。濁ってもいいんだな、と思っておけば良さそう。僕は日本語時でもたまに癖で濁ってしまいますが、通じるのであまり気にしていません。</p>
<h4>そのほか誤読されがちなやつ</h4>
<table>
<thead>
<tr>
<th>単語</th>
<th>正</th>
<th>誤</th>
</tr>
</thead>
<tbody>
<tr>
<td>height</td>
<td>ハイト</td>
<td>ヘイト</td>
</tr>
<tr>
<td>width</td>
<td>ウィズ、ウィドゥス</td>
<td>ワイズ</td>
</tr>
<tr>
<td>async</td>
<td>エイシンク</td>
<td>アシンク</td>
</tr>
<tr>
<td>allow</td>
<td>アラウ</td>
<td>アロウ</td>
</tr>
<tr>
<td>deny</td>
<td>ディナイ</td>
<td>デニー</td>
</tr>
<tr>
<td>alt</td>
<td>オルト</td>
<td>アルト</td>
</tr>
</tbody>
</table>
<h2>感想</h2>
<p>そもそも、fとh、lとr、bとv、sとth、あたりをちゃんと言い分けてないのでもう英語発音的正しさを日本語の会話の中で気にしても栓なきことですね。それでも誤読は多少気になりますが。</p>
<p>伝わればいいのだ！　日本語で会話してる時は、warnはワーン、awardはアワード、でもStar Warsはスターウォーズ、それでいいじゃない。はい、解散！</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[CLIツールを作るためにoclifを試してみたら簡単すぎて吃驚した]]></title>
            <link>https://blog.solunita.net/posts/start-to-develop-cli-by-oclif-is-surprisedly-fast/</link>
            <guid>https://blog.solunita.net/posts/start-to-develop-cli-by-oclif-is-surprisedly-fast/</guid>
            <pubDate>Sun, 21 Mar 2021 12:28:28 GMT</pubDate>
            <content:encoded><![CDATA[<p>CLI用のコマンドを作ってみようと思いたったのですが、CLI開発フレームワークoclifを試してみたらとても簡単で環境構築もすんなりできたのでびっくりしたという話。</p>
<h2>概要</h2>
<ul>
<li>ある用途で思いたってCLIのコマンド作ろうと思った</li>
<li>oclifというCLI用のフレームワークがあったので試してみた</li>
<li>簡単すぎてびっくりした</li>
<li>追加でPrettierとJestも対応してみました</li>
</ul>
<h2>動機</h2>
<p>誰しもCLIのコマンドをつくりたくなることがたまにある。僕はある。</p>
<p>今回はGUIを作るまでもなく、コマンドでシュッと実行したい作業があったので勉強と遊びを兼ねてコマンドを作ることにしました。CLIの開発ツールはいろいろありますが、今回はやりたいことを実現するのにすでに知見としてあるものを流用したい背景aからNode.jsでやることにしまた。</p>
<p>Node.jsにもCLI用を作るためのライブラリがさらにいくつかありますが、今回はoclifというものを使うことにしました。</p>
<LinkCard url="https://oclif.io/docs/introduction" title="Introduction · oclif: The Open CLI Framework" description="oclif is a framework for building CLIs in Node. It can be used like a [simple flag parser](https://github.com/oclif/command#usage) but is capable of much more. It&#39;s designed to be extensible so that you can easily add plugins such as the [update warning plugin](https://github.com/oclif/plugin-warn-if-update-available) or build your own for users to install at runtime." />
<p>Open Command Line Interface Frameworkの略らしく、oclifはHerokuでも使われています。</p>
<h2>期待すること</h2>
<p>簡単にサクッと作りたい、かつ、TypeScriptに対応していて、テストまで書きやすいと尚いい、という感じですね。</p>
<h2>実際やったこと</h2>
<h3>導入</h3>
<p>まずはoclifの導入ですね。oclifにはscaffolding用のコマンドが用意されていますのでそれを叩きます。
と、その前にシングルコマンドかマルチコマンドかを指定する必要があります。</p>
<p>シングルコマンドはよくあるタイプのコマンドで</p>
<pre><code class="language-bash">$ foo --bar baz
</code></pre>
<p>のように<code>foo</code>コマンドだけの用途です。もちろんオプションを引数で指定できます。一方マルチコマンドというのは</p>
<pre><code class="language-bash">$ foo bar --hoge
$ foo baz --fuga
</code></pre>
<p>みたいな、<code>foo</code>コマンドの中でさらにサブコマンドが存在するパターンです。</p>
<p>とりあえずは <code>sample</code> というシングルコマンドを作ってみようと思います。</p>
<pre><code class="language-bash">$ npx oclif single sample

     _-----_     ╭──────────────────────────╮
    |       |    │      Time to build a     │
    |--(o)--|    │  single-command CLI with │
   `---------´   │  oclif! Version: 1.17.0  │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

</code></pre>
<p>と叩くと対話的に各設定が進んでいきます。</p>
<pre><code class="language-bash"># npmのpackageの名称を設定
? npm package name sample

# コマンドの名称
? command bin name the CLI will export sample

# コマンド説明
? description a sample command by oclif

# 作者
? author Aqui TSUCHIDA @AquiTCD

# バージョン
? version 0.0.0

# ライセンス
? license MIT

# GitHubのオーナー
? Who is the GitHub owner of repository (https://github.com/OWNER/repo) AquiTCD

# GitHubのリポジトリ
? What is the GitHub name of repository (https://github.com/owner/REPO) sample

# package manager(yarn or npm)
? Select a package manager yarn

# TypeScriptを使うか
? TypeScript Yes

# ESlintを使うか
? Use eslint (linter for JavaScript and Typescript) Yes

# テストフレームワークとしてmochaを使うか
? Use mocha (testing framework) Yes

# CIを設定するか（e.g. circleCI)
? Add CI service config

</code></pre>
<p>と、こういう設定がでます。ここまで答えると設定した内容で新しいディレクトリができて、その中で指定したpackage managerで必要なライブラリのインストールが開始されます。</p>
<p>さらにTypeScriptを使うかどうかは<code>Y</code>で答えれば関連ライブラリも入れてくれますし、テストも組みこんでくれます（ただしmocha限定なのはちょっと残念）。</p>
<p>個人的にはこれが素晴しく便利で、自分でせっせと<code>package.json</code>を書くことはしなくてもいいのはもちろんTSの導入までやってくれるのはありがたいです。TSの環境構築はわりとつまりやすかったりどのような方法にするか迷うポイントだったりするので大変助かります。</p>
<p>つまりこれでもう導入が完了しちゃいます。素晴しく楽チン。</p>
<h3>動かしてみる</h3>
<p>今回はシングルコマンドです。前述のスキャッフォールドでいくつかのオプションもすでに実装済みです。</p>
<pre><code class="language-bash">$ cd sample # sampleとして作ったので移動

$ bin/run
# => hello world from ./src/index.ts

$ bin/run --name Aqui
# => hello Aqui from ./src/index.ts

$ bin/run --help
# describe the command here
#
# USAGE
#   $ sample [FILE]
#
# OPTIONS
#  -f, --force
#  -h, --help       show CLI help
#  -n, --name=name  name to print
#  -v, --version    show CLI version
</code></pre>
<p>という感じです。すごいですね。あとはじっくり<code>/src/index.ts</code>の中をせっせと実装すれば完成しちゃいます。楽ですね！</p>
<h2>環境をもうちょっと整える</h2>
<h3>Prettierを導入</h3>
<p>Node.js系のフォーマッタであるPrettierを入れます。ESlintと組み合わせるとき、このあたりはコロコロと短期間でベストプラクティスが変わるので要注意ですが、現時点での方法を考えてみましょう。</p>
<p>現時点でもっとも有力な話としては、ESLintとPrettierは別個でかける（pretter-eslintやeslint-plugin-prettierを使わない）という考え方のようです。</p>
<p>こちらを参考にさせていただきました。
<LinkCard url="https://blog.ojisan.io/prettier-eslint-cli" title="Prettier と ESLint の組み合わせの公式推奨が変わり plugin が不要になった" description="前に書いた ESLint と Prettier の共存設定とその根拠について が公式推奨が変わったことにより一部間違った情報になっているのでその訂正記事です。 該当記事に書いた内容は Prettier" image-url="https://blog.ojisan.io/static/ac61bf3a4d211cde35121e0e73c7d7d3/ee604/visual.png" /></p>
<p>まず、prettierとeslint-config-prettierを入れます。</p>
<pre><code class="language-bash"> $ yarn add -D prettier eslint-config-prettier
</code></pre>
<p>eslint-config-prettierはPrettierとESlint両方の対応があるものはESlint側の設定を無効化するものです。これは入れておきます。</p>
<p>次にESlintの設定を書きます。スキャッフォールド時に作られてるはずなので<code>.eslintrc</code>を変更するのですが、個人的にはコメントアウトが効くからjs形式がお勧めです。</p>
<p>つまり <code>.eslintrc.json</code>を<code>.eslintrc.js</code>にリネームして</p>
<pre><code class="language-jsx">module.exports = {
  extends: ['oclif', 'oclif-typescript', 'prettier'],
  rules: {
    // ...ご自由に
  }
}
</code></pre>
<p>とします。</p>
<p>Prettierもデフォルト動作以外にルールを指定したい場合は<code>.pretterrc</code>を作ります。これも同じく個人的にはjsで作るのがいいと思っています。</p>
<p>次にpackage.jsonを少し修正しておきます。</p>
<pre><code class="language-json">// ... 略
{
"scripts": {
    // ...略
    "lint:eslint": "eslint . --ext .ts --config .eslintrc.js",
    "lint:prettier": "prettier . \"!test*\" --check",
    "fix": "yarn fix:eslint &#x26;&#x26; yarn fix:prettier",
    "fix:eslint": "yarn lint:eslint --fix",
    "fix:prettier": "yarn lint:prettier --write"
 }
}
</code></pre>
<p>と、こんな変更箇所はこんな感じですかね。</p>
<p>ESLintとPrettierを切り離しているので<code>fix</code>ところで<code>&#x26;&#x26;</code>を使って連結しています。</p>
<h3>mochaではなくJestを使う</h3>
<p>oclifではMochaが使われています。Mocha一択です。ですが、いろんな理由からMochaを使わず変わりにJestを使いたいこともあると思います。</p>
<p>ここでやや面倒なのがMochaを使う場合 、<code>@oclif/test</code>というテスト用ユーティリティを使いますが、これはMochaで使うことが前提なのでJestでは使えません。そのあたりも含めてJestをどう導入していくかをやっていきます。</p>
<h4>Jestの導入</h4>
<p>まずJestを入れます。TSでやるとして、ここではBabel経由でやる方法ではなく<code>ts-jest</code>を使う方法でやっていきます。</p>
<pre><code class="language-bash">$ yarn add -D jest ts-jest @types/jest
</code></pre>
<p>次にJestの設定を書きます。<code>jest.config.js</code>をプロジェクトルートに作って</p>
<pre><code class="language-js">module.exports = {
  testEnvironment: 'node',
  moduleFileExtensions: ['ts', 'js', 'json'],
  testPathIgnorePatterns: [
    '/node_modules/',
    '&#x3C;rootDir>/__tests__/helpers/'
  ],
  transform: { '^.+\\.(ts|tsx)$': 'ts-jest' },
  coverageReporters: ['lcov', 'text-summary'],
  collectCoverageFrom: ['src/**/*.ts'],
  coveragePathIgnorePatterns: ['/templates/'],
  coverageThreshold: {
    global: {
      branches: 100,
      functions: 100,
      lines: 100,
      statements: 100,
    },
  },
}
</code></pre>
<p>こんなふうに書きました。これは一例なので好みによって変わってきます。 oclifのJest導入のmergeされずにcloseされたPRがあるのですが概おおむね違ってないのでそれを参考にしています。注意点として</p>
<pre><code class="language-js"> transform: { '^.+\\.(ts|tsx)$': 'ts-jest' },
</code></pre>
<p>ここは<code>ts-jest</code>を使うのに必要です。</p>
<p>それと、</p>
<pre><code class="language-js">testPathIgnorePatterns: [
  '/node_modules/',
  '&#x3C;rootDir>/__tests__/support/'
],
</code></pre>
<p>が注意ポイントです。jestのデフォルトではテストファイルは<code>__tests__</code>というディレクトリの置くことになっています。今回<code>@oclif/test</code>を使えない変わりにJestでmockしたいところをhelperとして書くことにしました。</p>
<p>また、package.jsonにも</p>
<pre><code class="language-json">{
// ...略
"scripts": {
    // ...略
    "test": "jest",
  }
}
</code></pre>
<p>を追加しておくといいでしょう。</p>
<h4>Jestでoclifを書くためのhelperを作る</h4>
<p>この記事が詳しいです。</p>
<p><a href="https://martianwabbit.com/2018/05/25/testing-oclif-with-jest.html">https://martianwabbit.com/2018/05/25/testing-oclif-with-jest.html</a></p>
<p>簡単に言えばoclifの最終的な結果である標準出力をJestのmockを使って取得できるようにしています。</p>
<p>これと同じ方法で上手く切り出してる例が <a href="https://github.com/LiskHQ/lisk-core/issues/322">https://github.com/LiskHQ/lisk-core/issues/322</a> にありました。</p>
<p>これらを参考にして <code>__test__/support/testCommand.ts</code>にhelperを作ってみます。</p>
<pre><code class="language-tsx">export const testCommand = async (
  klass: typeof Command,
  argv: string[] = []
): Promise&#x3C;{ stdout: string[] }> => {
  const result: string[] = []

  const originalWrite = process.stdout.write

  const writeMock = jest
    .spyOn(process.stdout, 'write')
    .mockImplementation((val, encoding, cb): boolean => {
      result.push(val as string)

      if (process.env.TEST_OUTPUT) {
        originalWrite(val, encoding, cb)
      } else if (cb) {
        cb()
      }

      return true
    })

  await klass.run(argv)

  writeMock.mockRestore()

  return {
    stdout: result,
  }
}
</code></pre>
<p>そうしたら、テストのほうで読みこんで使うようにします。<code>__tests__/index.test.ts</code>は具体的にこんな感じになるでしょう。</p>
<pre><code class="language-tsx">import Sample = require('../src/index')

describe('elgtm', () => {
  it('returns hello world', async () => {
    const { stdout } = await testCommand(Sample, [])
    expect(stdout[0]).toContain('hello world')
  })
})
</code></pre>
<p>これで<code>yarn test</code>なり<code>jest</code>なりを叩いてみてテストがパスすればOKですね！</p>
<h2>やってみた結果</h2>
<p>prettierの導入自体はoptionalなのですが、まあこれらのベストプラクティスがコロコロ変わるNode.js系はツライなあ、という感じです。</p>
<p>テストフレームワークをJestに対応させないのはおそらく関連するhelperもJest用に作らなければいけないことで進んでいないようですが、これはPRやIssueもあるのでできれば積極的に対応して欲しいと感じました。</p>
<h2>感想</h2>
<p>PrettierとJestの導入にちょっと面倒さを感じましたが、逆を言えば、これらのことはやらずスキャフォールディングで作られるそのままの環境でOKであれば爆速でCLIの開発に入れますね。それは本当に凄いことです。</p>
<p>まだちゃんとしたコマンドを作るところまでいってないですが、マルチコマンドもシングルコマンドも対応できますし、パッとみてどうなってるかもわかるので本当に楽に開発しはじめられる！　という印象でした。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[鬼滅の刃が嫌いだった話。或いは知ってる前提で進まれると寂しさを感じるという話。]]></title>
            <link>https://blog.solunita.net/posts/i-feel-sad-when-a-movement-become-common/</link>
            <guid>https://blog.solunita.net/posts/i-feel-sad-when-a-movement-become-common/</guid>
            <pubDate>Sun, 14 Mar 2021 13:46:27 GMT</pubDate>
            <content:encoded><![CDATA[<p>僕は鬼滅の刃が嫌いだった。正確に言えば、鬼滅の刃を知ってることが前提になった世の中から取り残されてる気がして寂しさを覚えて、その原因が嫌いだった、という話。ただのポエムです。先にいっておきますが、すごいとりとめもなければ、まとまってもいない話です。</p>
<p>ちなみにその後、鬼滅の刃を読み、面白かったと思ったし、使われていた言葉も理解できたので今は嫌いではないです（かといって好きでもなく、普通に面白かった作品の1つ、という位置付けですが）</p>
<h2>爆発的ヒットによる大衆の常識化</h2>
<p>鬼滅の刃が近年稀にみる爆発的なヒットとなったのは記憶に新しいと思います。メディアはこぞってとりあげ、タイアップものも沢山でるようになりました。テレビではなんとかの呼吸だとか全集中だとか良く耳にしましたね。
この時の世界はまるで、全ての人間が鬼滅の刃の内容を知っていて、呼吸だとか集中だとかも知っているのが常識みたいな流れではなかったでしょうか。</p>
<p>当時、鬼滅の刃に興味を示さなかった僕としては、すごい疎外感を覚えました。それと大の大人が割とマジメになんとかの呼吸だの全集中とか言う様を見て、なんか恥ずかしいような気持ちさえありました。
これらがいろいろ混ざりあった結果、その元になっている作品がなんとなく嫌いだな、という感情に発展しました。</p>
<h2>僕らの世代がやってきてしまったこと</h2>
<p>しかし、ふと冷静になってみるとこの現象は僕らの世代が今までやってきたことにとても近いなと考えるようになりました。
僕はいわゆるジャンプ黄金期と呼ばれる時代に少年期を過ごしました。化け物のようはヒット作が数多くでましたが、その中でもドラゴンボールは突出してると言えたでしょう。
そう、僕らの世代でドラゴンボールを知らない人がいるなんて考えたことありません。かめはめ波はもちろん、界王拳やスーパーサイヤ人などみんなもっている共通認識だと疑ったこともないほどです。</p>
<p>そしてドラゴンボールは原作のほかTVシリーズでは続編があったこと、再放送やゲームが出続けたことにより、幅広い世代に受け入れられたと認識しています。今と比べて娯楽が少なかったことや、ネットやスマホなど同じ時間を食い合う存在が少なかったこともあるでしょう。</p>
<p>規模や期間は違えど最大瞬間風速的なものは同じ感じかなと思います。</p>
<p>以前、今の若者世代の中でドラゴンボールにあまり馴染みがない層から、オッサンはなんでもドラゴンボールに例えるから不快、という意見を効いたことがあります。まさしく、今回の鬼滅ヒットではこの逆の現象が僕におきてたのかもしれません。</p>
<p>まあ、呼吸や集中というWordや行動はドラゴンボールのそれに比べて日常により近く、その結果だれでも口にしやすい背景はあると思いますが、それでも僕が界王拳！　とか高校生にもなって叫んでたら恥ずかしいので、やっぱりなんとかの呼吸！　とか全集中！　とかみんなよく恥ずかしくないな、と思わざるをえませんが。</p>
<h2>知っていることが前提で進まれることへの不快感</h2>
<p>とまあ、ここまでで何が言いたかったかいえば、前提知識が必要なことをさも常識のように話されると不快だというだけの話なんですが、思いあたったことが他にもあります。</p>
<h3>ロードオブザリング（指輪物語）つまりファンタジー</h3>
<p>今あるファンタジーの基礎を作ったものの1つではないでしょうか。映画、ヒットしましたが、僕は1作目の冒頭でつまらなさが勝ちました（後に理解してちゃんと観ましたが）。
いわゆるエルフ、ドワーフ、オークなどがでてきます。これらはそれ以後いろいろな作品にも登場します。基本は近いものがありますが、作品数が多すぎてわりとブレています。</p>
<p>そして映画ロードオブザリングのツラかったところは、こういう存在がどのようなものかほとんど触れられないことです。つまり予習前提の映画になっています。映画というある程度限られた尺の中に詰めるのは無理があったのかもしれません。</p>
<h3>時代劇</h3>
<p>僕は時代劇が大好きなんですが、そんな僕に言わせれば、時代劇もファンタジーの一種です。日本の中世ベースにしたファンタジーです。</p>
<p>同年代で若い世代であまり時代劇が好きな人にあったことがありません。逆に僕らの親やその親の世代はわりと好きな人は多い印象です。これは親やその親の世代は時代劇の世界と自分達がそれほど遠くなく、またさらに娯楽の少ない時代ですので慣れ親しんでいたのもあるでしょう、つまり上の話で言う予習済み状態です。</p>
<p>自分が何も知らない前提で時代劇を読んでみると驚くほど説明が少ないです。将軍とか、殿様とか、侍とかそのへんはまあ知ってる人も多いと思いますが、時代劇を読むと普通に大目付や近習などの役職や、部屋住みなどの背景事情が含まれた用語が沢山でてきます。これを知らずに世界を味わったりはもちろん時には物語を追うのが難しいほどです。しかもこれらに対して説明があることは稀です。あったらあったで野暮なんですが。</p>
<p>と、こういうことが原因で時代劇の入口はなかなか狭いんだろうなあ、と感じます。</p>
<h2>その後の対策</h2>
<p>結局そこまで鬼滅の刃に興味はなかったものの、知らないことで受ける微弱なストレスが面倒に感じたので原作がそう長くもないのもあって一気に読みました。読んだことが無駄だとは思わない程度には面白かったです（残念ながら世間で話題になるほどハマりもしませんでしたが）。</p>
<p>今回思ったのは、一過性のヒットが常識のようになって、知っている前提で話されることが多くなってくると寂しい気持ちになることが多いので、とっとと履修してしまったほうが楽だなあ、という話でした。</p>
<p>その教訓を元に次は中学三年生以来見ていないエヴァを序から追っていこうと思います。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ステッパーを導入したので、仕事中にスタンディングデスクを併用して踏み踏みしてる話]]></title>
            <link>https://blog.solunita.net/posts/introduce-stepper-as-my-new-gear/</link>
            <guid>https://blog.solunita.net/posts/introduce-stepper-as-my-new-gear/</guid>
            <pubDate>Sat, 06 Mar 2021 12:32:33 GMT</pubDate>
            <content:encoded><![CDATA[<p>Stay Homeじゃなくても基本Stay Homeな僕ですが、流石に運動不足だよなと思いステッパーを導入してみた話。レビュー的な体験談です。ちなみにスタンディングデスクと併用です。</p>
<h2>概要</h2>
<ul>
<li>運動不足が気になってステッパーを導入した</li>
<li>なかなか良いけど本当に集中するときは足は止まる</li>
<li>スタンディング状態も長くなったのでヨシ</li>
</ul>
<h2>ステッパー is何？</h2>
<p>トレーニンググッズの1つで足踏み機です。台的なものに乗り、その場で歩く運動をするものです。電源も不要なものがほとんどです。踏み込みの種類で大きくわけてストレート、ツイスト、サイドとあります。</p>
<h2>やってみた結果</h2>
<p>僕はスタンディングデスクで仕事していますが、メモリー機能付き電動型な頻度で座っていました。今回はステッパーを導入し、スタンディングデスクと併用して、足踏みしながら仕事する作戦です。
ちなみに今回買ったのはコレです。</p>
<AdCard asin="B0819WPKD4" title=" 東急スポーツオアシス ツイストステッパー Premium (プレミアム) " image-url="https://images-na.ssl-images-amazon.com/images/I/81hDuMNteEL._AC_SX679_.jpg" price="￥13,080" date="2021-03-06" searchWords="東急スポーツオアシス ツイストステッパー Premium" />
<p>めちゃくちゃ吟味したわけじゃないですが、そこそこちゃんとしているものを選びました。これはツイストタイプで、選んだ理由はツイスト（腰をひねる）動作が脂肪燃焼に効果的らしいという知見からです。
ちなみにこの機種は逆向きしても使え、ツイスト時の負荷のかかりかたが変わります。個人的にこれは飽き防止と使う筋肉を分散したかったので良かったです。</p>
<h3>高さについて</h3>
<p>ステッパーに乗る分、机が高くないと困りますね。台にのってるわけですから。所有するスタンディングデスクの高さのMAXでちょうど位でした。これ以上背が低いとベストポジションには来なさそうですね。つまり僕にとっては許容範囲ですが、個人差によっては難しいかもしれません。</p>
<p>ただ、手やキーボードの高ささえ合えばディスプレイはアームやスタンドで角度や高さを変えられるものが多いので融通は効くかもしれません。事実、僕はステッパーにのって昇降の分もあるので少し調節しています。</p>
<h3>設置しやすさ</h3>
<p>椅子に座ってる時はステッパーを足元に置いています。乗るときにデスクの昇降ボタンを押し、デスクが上がっていく時間でススッとズラして設置しています。手作業でやる面倒さは残りますが、それでも苦に思うほどではありません。全然許容範囲です。</p>
<h3>実際できているか</h3>
<p>やってみた結果、集中してるときは流石に足が止まります。例えばこのブログを書く程度の作業であれば足を動かしながらできています。それでもずっと足踏みしっぱなしではなく、踏みながら書き、ちょっと考ええたりするときに足が止まり、また書きつつ踏み出す、という感じです。もしかしたら楽器の奏者みたいな足と手の動きを日常的に並列してる人はもっと上手くできるかもしれません。</p>
<p>そして、深い考察をしながらコーディングするときは難しいですね。考えるオンリーであればまだ可能ですが、大抵は書くと考えるを交互に繰り返しています。集中度が深くなると足が止まってしまいます。</p>
<p>逆に言えばミーティング中などは全然大丈夫です。特に聞き側にまわるようなミーティング中であればここぞとばかりにフミフミしてます。</p>
<h3>運動してる感</h3>
<p>これはステッパーによって負荷が違いますので一概に言えませんが、けっこう負荷は感じます。今回導入したものは体感で言えば平坦な道を歩くよりはやや力強く踏みこんでいかないといけない感じです。これをそれなりに継続してフミフミしつづけるとそれなりに疲れます。当たり前ですが息も上がってきます。ちゃんと大腿四頭筋に効きます。</p>
<h3>音や振動</h3>
<p>これもステッパーに寄りけりですが、今回導入したものは無音とは言えませんが気になるほどではありません。最下部まで踏み込むとストッパー部との衝突音と振動は避けられませんが、通常利用ではそこまで踏むことはなく逆の足側を踏み込むことになります。つまり発生しません。</p>
<p>踏み変える時にグッと音はします。これは今のところ気になるレベルではありませんね。ただし継続利用して劣化などがあるとちょっとどうなるか、という感じです。</p>
<h3>うれしい誤算</h3>
<p>今までスタンディングはわりと持続せず疲れてしまって座る機会もそれなり多かったです。ですが、歩きを挟むことで座らないでいける時間が増えました。これは立ち仕事でも一箇所に立ち続ける仕事のほうが歩きを適度に挟む仕事より疲れるのと同じでしょうね。</p>
<h3>残念だった点</h3>
<p>ステッパー自体が、というわけではないんでしょうが素足または靴下で乗ると思いの外、足の裏、特にカカトにかかる負荷が大きく、足が痛くなりました。まあクッション性がないので当たり前なんですが。素足でアスファルトの地面を歩いてるようなものですね。</p>
<p>今はやっすい室内運動靴を履いてやってます。ゆくゆくは足が強くなって素足でできれば尚良しなんですが。</p>
<h2>感想</h2>
<p>つい使わないで終わってしまう日もあるのですが、今のところはおおむね買って良かったと思っています。いざ仕事するぞって時にステッパーに乗るとそこはかとないパシフィック・リム感があります。搭乗！　みたいな。</p>
<p>例えば読書するときやゲームするときも使っていきたいなと思っていますが、部屋を跨いで移動させたりが面倒でできてません。今度やろう。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[39.4/2021-02]（月次振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2021-02/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2021-02/</guid>
            <pubDate>Sun, 28 Feb 2021 12:14:35 GMT</pubDate>
            <content:encoded><![CDATA[<h2>来た道[2021-02]</h2>
<h3>出来事/体験</h3>
<p>とくに目新しいものはなしです。緊急事態宣言下なのでそれが正しい姿ではある気はするんですが、やはり何かしら刺激が欲しいものですね。</p>
<p>強いていえば家の壁紙の補修をしました。転居後の整理などで、壁をちょっと黒くしてしまったところと、壁紙を削ってしまったところがあったので補修にトライしてみました。</p>
<AdCard asin="B01N8VZQ0V" title=" SEED 壁の汚れ隠し SK-TA5LC ライトアイボリー 3796590664 " image-url="https://images-na.ssl-images-amazon.com/images/I/51BZDHWNGIL._AC_.jpg" price="￥476" date="2021-02-28" searchWords="SEED 壁の汚れ隠し SK-TA5LC ライトアイボリー" />
<p>黒い場所はこれで対応。まんま修正テープです。でも色みさえ合えばかなり自然になおります。パッと見全然わかりません。</p>
<AdCard asin="B004JPY4R2" title=" 日本ミラコン産業 クロスの補修 クロス型取りなおし3点セット M-503 " image-url="https://images-na.ssl-images-amazon.com/images/I/61J0eLat0pL._SY679_.jpg" price="￥638" date="2021-02-28" searchWords="日本ミラコン産業 クロスの補修 クロス型取りなおし3点セット M-503" />
<p>そして削ってしまったところはこちら。大丈夫なところで型をとり、削ってしまったところにパテをつけて型を押しあてて復元する感じです。これスゴイです。想像よりもずっと目立ちません。</p>
<p>これら、あーやってしまったなーと思っていた自責の念が霧散したのでとても良かったです。</p>
<h3>習慣</h3>
<p>勉強やストレッチ習慣は思うように進まず。</p>
<p>休日はムスメ氏に合わせて夕飯を18時ごろに食べるようにしました。これが思いのほか良く、日中に料理しなきゃいけない大変さはあるものの、自由に使えるまとまった時間が増えました。あと、内蔵負担的に健康的ですね。</p>
<h3>アウトプット/創作活動</h3>
<p>こちらも特になく、こまごまとブログは続けていますが最近ネタに困っています。何を書こうか数日モヤモヤ悩まされた結果、薄い記事を書くのが果たして良いのかと自問しはじめました。書く習慣はついた気がするのでいったんノルマ制を止めてみても良い気がしてきた今日このごろ。</p>
<h3>装備、環境</h3>
<p>ステッパーを買いました。仕事中、スタンディングデスクの下で踏み踏みしています。なかなか良いですね。もうすこしいろいろ試してからそのうちレビュー記事を書きます。</p>
<AdCard asin="B0819WPKD4" title=" 東急スポーツオアシス ツイストステッパー Premium (プレミアム) " image-url="https://images-na.ssl-images-amazon.com/images/I/81hDuMNteEL._AC_SX679_.jpg" price="￥13,080" date="2021-02-28" searchWords="東急スポーツオアシス ツイストステッパー Premium (プレミアム)" />
<p>また、ポータブルディスプレイも買いました。これもなかなか良いです。ポテンシャルを引き出せてない感はあるもののやはりケチらないでハイエンドなものにしておいたのは正解だった気がします。これも別の機会にレビューします。</p>
<AdCard asin="B08K8G8PBN" title=" モバイルモニター GMK 14インチ モバイルディスプレイ4K Adobe100%色域 HDR 薄型 IPS パネル軽量 USB Type-C/Mini HDMI/mini DP スタンドカバー PS4/XBOX/Switch/PC/Macなど対応 KD1 " image-url="https://images-na.ssl-images-amazon.com/images/I/61pXqnvEiwL._AC_SX679_.jpg" price="￥32,999" date="2021-02-28" searchWords="モバイルモニター GMK 14インチ モバイルディスプレイ4K Adobe100%色域 HDR 薄型 IPS パネル軽量 USB Type-C/Mini HDMI/mini DP スタンドカバー PS4/XBOX/Switch/PC/Macなど対応 KD1" />
<h3>お仕事環境</h3>
<p>特に変わりなし。</p>
<h3>消費趣味</h3>
<p>今はハマってるゲームがこれといってない状態ですね。積んでたゼルダBotWをやってみたり、ソロモンプログラムを始めてみたり。</p>
<p>期待していたOUTRIDERSというハクスラTPSのDEMO版が出たのでちょこちょこやっています。いろいろと惜しく感じるところはありますがおおむね面白いし、ストーリーがけっこう好きなので多分買います。クロスプレイ可というのも大きいですね。PCやXbox系の知人と遊べるのはとても嬉しい。</p>
<h2>目標</h2>
<ul>
<li>❌ 最低週4でストレッチする</li>
<li>❌ 最低週4で積んでる技術書、実用書を読む</li>
<li>❌ 最低週4で何か運動する</li>
</ul>
<p>どれもダメでしたね。仕事が忙しかったという言い訳はありつつも。ステッパーも使う日もあればそうでない日もあり。久々に週末のリングフィットアドベンチャーもサボりました。</p>
<p>本を読む時間が取りずらかったのでお風呂で瞬間英作文のトレーニングをしていました。ですがこれも週4には屆かず。とはいえ少しはできていたので継続していきたい。</p>
<h2>行く道[2021-03]</h2>
<ul>
<li>□ 最低週4でストレッチする</li>
<li>□ 最低週4で積んでる技術書、実用書を読むまたは英語のトレーニングをする</li>
<li>□ 最低週4で何か運動する（ステッパー含む）</li>
</ul>
<p>単純にリベンジですね。がんばるぞー！</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Railsでrecordをdestroyする時、validation的に条件を設定する]]></title>
            <link>https://blog.solunita.net/posts/validation-for-recoed-destroying-in-rails/</link>
            <guid>https://blog.solunita.net/posts/validation-for-recoed-destroying-in-rails/</guid>
            <pubDate>Sat, 27 Feb 2021 12:14:23 GMT</pubDate>
            <content:encoded><![CDATA[<p>Railsを使っていて、ある状態に当てはまらないときレコードを削除するdestroyを成功させたくないみたいなこと、あると思います。createするときのvalidationに対してdestroy時のvalidationというか。そんなときどうするか、という話です。</p>
<h2>概要</h2>
<ul>
<li>あるレコードが条件に合わないとき、レコードを削除できてしまうと困る</li>
<li>条件に合わない場合はdestroy時にエラーにして、削除が成功しないようにする</li>
<li><code>before destroy</code> と <code>throw abort</code> を使おう</li>
</ul>
<h2>動機</h2>
<p>例えば1 projectに関連するの複数todoがあるとします。 Rails的に言えば<code>project has_many todos</code>ですね。そしてtodoはstateとして<code>backlog</code>をデフォルトとして、<code>wip</code>,<code>done</code>と遷移していく3パターンの状態のどれかを持つとします。</p>
<p>この時、todoは<code>wip</code>の状態では削除できないものとします。そしてprojectの削除時も関連するtodoの中に<code>wip</code>のものが1つでもあれば削除させたくないとします。</p>
<p>このようなとき、Railsではdestroyできてしまえないようにするにはどんな方法があるでしょうか、という話です。</p>
<h3>期待すること</h3>
<p>あるレコードを削除するとき、条件に合わない場合レコードの削除を成功しないようにしたい。</p>
<p>さらに<code>dependent: :destroy</code>など関連レコードを一緒に削除する場合、関連レコード側が削除できない条件にひっかかった場合、元もと削除しようとしたレコードも削除できてはいけない。</p>
<p>その制約をなんとかして担保したい。</p>
<h2>実際やったこと</h2>
<p>まず最小限のサンプルとしてRailsでProjectとTodoのモデルがどうなってるか確認したいと思います。</p>
<p>親となるProject</p>
<pre><code class="language-ruby"># /app/models/project.rb

# == Schema Information
#
# Table name: projects
#
#  id          :bigint           not null, primary key
#  title       :string           not null
#  created_at  :datetime         not null
#  updated_at  :datetime         not null
#
class Project &#x3C; ApplicationRecord
  has_many :todos, dependent: :destroy
end
</code></pre>
<p>そしてその子であるTodo</p>
<pre><code class="language-ruby"># /app/models/todo.rb

# == Schema Information
#
# Table name: todos
#
#  id          :bigint           not null, primary key
#  project_id  :bigint           not null
#  title       :string           not null
#  state       :integer          default(0) not null
#  created_at  :datetime         not null
#  updated_at  :datetime         not null
#
class Todo &#x3C; ApplicationRecord
  belongs_to :project

  enum state: { backlog: 0, wip: 1, done: 2 }
end
</code></pre>
<p>という感じです。stateは今回はenumで定義してDB的にはIntegerにしました。</p>
<p>今この状態では特になにもしてないので、</p>
<p><code>todo.destroy!</code>とするとエラーもなくレコードが削除されますね。</p>
<p>projectがいくつかtodoをもっている場合、<code>project.destroy!</code>すると、<code>dependent: :destroy</code>が設定されているため、子のtodoも同時に削除されるはずです。コンソールでやるとなると</p>
<pre><code class="language-bash">$ bin/rails c -s
#
> project = Project.create(title: 'new project')
...
> todo1 = Todo.create(title: 'todo1', project: project)
...
> todo2 = Todo.create(title: 'todo2', project: project)
...
# ここまでで project は 2つのtodoを持つ状態

> todo2.destroy!
# todo2単体が削除される

> project.destroy!
# projectと子のtodo1が削除される
</code></pre>
<p>という感じでしょうか。</p>
<p>では、前述のとおり、現在wipな状態にあるtodoを削除できなくさせたいとします。</p>
<p>これには<code>ActiveRecord::Callbacks</code> の <code>before_destroy</code>を使ってdestroy時に状態を確認するメソッドを作って指定します。今回はwipではないことを保証するとして<code>ensure_not_in_progress</code>というメソッドをつくることにします。</p>
<pre><code class="language-ruby"># /app/models/todo.rb

class Todo &#x3C; ApplicationRecord
  belongs_to :project

  enum state: { backlog: 0, wip: 1, done: 2 }

  before_destroy :ensure_not_in_progress

  private

  def ensure_not_in_progress
    if wip?
      errors.add(:base, 'todo is still work in progress')
      throw :abort
    end
  end
end
</code></pre>
<p>という感じですね。ちなみにRailsのenumを使うとenumの定義に<code>?</code>がついた、 確認用のメソッドが自動で生えます。つまり<code>wip?</code>というメソッドはenum定義時に自動で使えるようになっていて、stateが<code>wip</code>の場合は<code>true</code>を返してくれます。</p>
<p>そして<code>wip?</code>が<code>true</code>なら、まずバリデーションメソッドと同じように<code>errors.add</code>でエラーを追加します。そして大事なのが<code>throw :abort</code>です。これによって削除が成功しないように止めることができます。</p>
<p>ではまたコンソールで試してみましょう。</p>
<p>1projectに1つは普通のtodo、もう1つはwipなtodoを作ります。</p>
<pre><code class="language-bash">$ bin/rails c -s
#
> project = Project.create(title: 'new project')
...
> todo = Todo.create(title: 'todo', project: project)
...
> wip_todo = Todo.create(title: 'wip_todo', project: project, state: :wip)
...
# ここまでで project は stateがbacklogとwipのtodo1つづつを持つ状態

# wip_todoの削除を試みる

> wip_todo.destroy!
ActiveRecord::RecordNotDestroyed: Failed to destroy the record

# 削除できないことを確かめられました！
</code></pre>
<p>はい、これで期待どおり削除できないようになりました。そのまま続けて親のprojectを削除しようとするとどうなるかも見ていきましょう</p>
<pre><code class="language-bash">> project.destroy!
D, [2021-02-27T20:51:39.855214 #1555] DEBUG -- :    (0.2ms)  SAVEPOINT active_record_1
D, [2021-02-27T20:51:39.860684 #1555] DEBUG -- :   Todo Load (4.7ms)  SELECT `todos`.* FROM `todos` WHERE `todos`.`project_id` = 1
D, [2021-02-27T20:51:39.863723 #1555] DEBUG -- :   Todo Destroy (0.3ms)  DELETE FROM `todos` WHERE `todos`.`id` = 1
D, [2021-02-27T20:51:39.891990 #1555] DEBUG -- :    (26.1ms)  ROLLBACK TO SAVEPOINT active_record_1
ActiveRecord::RecordNotDestroyed: Failed to destroy the record

# 削除できないことを確認できた！
</code></pre>
<p>はい、こちらも削除できないですね。ちゃんとROLLBACKしてくれています。削除できるもう片方の子も削除されていませんね。</p>
<p>これであとはstateがwipじゃなくなったら削除できればいいですね、それも試してみましょう。</p>
<pre><code class="language-bash">> wip_todo.update!(state: :done)
#  wip_todo の state を done に変更

> project.reload
# projectのインスタンスをreloadして子のtodosを取得しなおし

> project.destroy!
D, [2021-02-27T20:54:53.359573 #1555] DEBUG -- :    (0.2ms)  SAVEPOINT active_record_1
D, [2021-02-27T20:54:53.361002 #1555] DEBUG -- :   Todo Load (0.4ms)  SELECT `todos`.* FROM `todos` WHERE `todos`.`project_id` = 1
D, [2021-02-27T20:54:53.364240 #1555] DEBUG -- :   Todo Destroy (0.3ms)  DELETE FROM `todos` WHERE `todos`.`id` = 1
D, [2021-02-27T20:54:53.365608 #1555] DEBUG -- :   Todo Destroy (0.2ms)  DELETE FROM `todos` WHERE `todos`.`id` = 2
D, [2021-02-27T20:54:53.366736 #1555] DEBUG -- :   Project Destroy (0.2ms)  DELETE FROM `projects` WHERE `projects`.`id` = 1
D, [2021-02-27T20:54:53.367482 #1555] DEBUG -- :    (0.1ms)  RELEASE SAVEPOINT active_record_1
</code></pre>
<p>はい、wipではないので期待どおりprojectとそれがもつ2つのtodoごと削除が成功しました。</p>
<h2>今回あまり触れなかったこと</h2>
<p>上記ではあまり触れてないですが、<code>destroy!</code>としているところ<code>destroy</code>にすると単純に失敗した場合falseが返ります。成否を判定して処理を変える場合でないのであれば基本的には<code>!</code>付きのほうがエラーがわかりやすくていいですね。</p>
<p>あとは当然<code>delete</code>や<code>delete_all</code>の場合は効きません。が、意図的にそれらを使わないときの削除は基本<code>destroy</code>を使うのが一般的なので問題ないはずです。</p>
<h2>感想</h2>
<p>今回は削除時にある条件によっては削除が失敗する実装をしました。コールバックメソッドは賛否両論ありますが、今回のように1モデル内で簡潔するような単純な場合はアリかな、と思っています。</p>
<p>それでなかったら削除用のメソッドやサービスを別で作ることになり、それはそれで使い忘れるという不安な点もありますし。</p>
<p>ともあれ、簡単ですが使いどころは意外に多いので備忘録的に書いておきます。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[翻訳をすることで学習につなげようとしたけど失敗した話。或いはDeepLが凄かった話。]]></title>
            <link>https://blog.solunita.net/posts/translating-driven-studying-does-not-work-for-me/</link>
            <guid>https://blog.solunita.net/posts/translating-driven-studying-does-not-work-for-me/</guid>
            <pubDate>Sun, 21 Feb 2021 13:08:55 GMT</pubDate>
            <content:encoded><![CDATA[<p>とある海外の技術記事が良かったので、翻訳をすることでそれを学習に役立てようとしましたが、最終的にDeepL（機械翻訳）にかけたものと比べたら圧倒的にDeepLのほうがクオリティが高く、これは意味なかったなーという知見というか失敗録というか。</p>
<h2>まとめ</h2>
<ul>
<li>英語の技術記事が良かったので翻訳することで学習に役立てようとした</li>
<li>どうも上手く訳せなかった部分もあったのでDeepLも使ってみた</li>
<li>DeepLのほうが良かったのと、（僕は）英語は英語のままで理解できるので翻訳駆動学習が駆動しなかった</li>
</ul>
<h2>DeepL is何？</h2>
<LinkCard url="https://www.deepl.com/home" title="DeepL" description="DeepL trains artificial intelligence to understand and translate texts." image-url="https://www.DeepL.com/img/favicon/deepl_logo_600_300.png" />
<p>DeepLはAIを使った機械翻訳Webサービスです。制限はありますが無料でも十分使えます。従来の機械翻訳サービスと大きく違うのは翻訳後の日本語が驚くほど自然な文章な点です。今までの機械翻訳はひと目で機械翻訳とわかるようなもので、これは英語と日本語が大きく違うので難しいと思われてきました。しかしDeepLで翻訳された文章はもはや機械翻訳とはわからないほど自然です</p>
<h2>動機</h2>
<p>そもそも翻訳駆動学習をしようと思ったのは</p>
<ul>
<li>自分の英語力の向上のため</li>
<li>記事に紹介された技術を理解し咀嚼し、記憶に定着させるため</li>
</ul>
<p>の二点を狙って試みました。</p>
<p>それとともに技術に関して自分自身の見解も加えて、最終的にアウトプットできたらいいなと考えました。</p>
<h1>実際やってみた</h1>
<p>実際に1記事まるまる機械翻訳に頼らず自分の能力のみで訳してみました（知らない単語を辞書で調べるのはしました）。結果として上手く日本語にできなかったところ、（DeepLではない）機械翻訳かのような不自然な直訳したような箇所も散見されるような出来でした。記事の内容を十分に咀嚼し、理解できたものの、翻訳してそれを他人が見て容易に理解できるクオリティとはとても思いませんでした。</p>
<p>もともと僕は英語はそこそこ会話できますし、文書を読んでもそれなりにちゃんと理解できます。しかしその時の僕は英語を英語のまま理解しています。しかし、翻訳となると英語を理解する能力とは別に、読みやすい日本語に変換する能力も要求されると身に沁みて感じました。</p>
<p>そこでものは試しとDeepLにかけてみたところ、段落ごとに見ていっても自分で書いたわけよりも読みやすく感じたものが多い結果となりました。一部そのままではわかりにくいところもなくはないのですが、少なくとも僕の翻訳よりは自然だと思えました。</p>
<p>となると、僕が翻訳記事を挙げる意味はまったくなく、各人がそれぞれDeepLなり翻訳をかけるほうがまだ理解を助けてくれるでしょう。</p>
<p> 理由としては2点あります。</p>
<ol>
<li>DeepLなど機械翻訳技術は時が進むほど精度があがる（はず）ため</li>
<li>できれば翻訳より原文に当たるほうが良く、翻訳はあくまでも理解の一助でしかない</li>
</ol>
<p>DeepL以前でも技術の進歩で機械翻訳は精度を上げてきました。それが今のAIや機械学習技術ならよりいっそう速いスピードでしょう。となると現時点での翻訳をしてしまうより、見たひとが必要なタイミングで遅延評価的に機械翻訳するほうがより精度の高い結果を読めるはずです。</p>
<p>もう一点は技術記事に限らず、翻訳100％原文と同じ意味にはなりません。それは情緒的な文章はもちろん、技術的な文章でもそうだと感じています。したがって常に原文を当たるべきであり、原文では意味がわからなかった場合だけ翻訳の助けを借りるのが正しい翻訳の使い方だと思っています。</p>
<h2>僕が翻訳駆動学習はやめておこうと思った理由</h2>
<p>前述のとおり、英語は英語として理解できていて、原文の文章も翻訳することなく理解できています。そのため、そもそも自分自身は翻訳された文章をそれほど必要としていません。</p>
<p>今回訳文を書いたことによって確かに理解が深まり咀嚼できた感はありますが、それはそれまで流し読み的にしか読んでなかったことに原因があります。つまり翻訳を通して咀嚼できたというよりは、精読して理解を深めたことが要因です。これは翻訳せずとも原文のまま精読しても十分実現可能です。</p>
<p>加えて、仮に僕が翻訳した文章をアウトプットしたとして、翻訳した文章だけを見る翻訳記事を世に出してしまうより、翻訳しないことで原文へのアクセスを妨げないほうが良いと判断しました。</p>
<p>唯一意味があったと思うのは知らない単語がいくつかでてきたのでその単語の意味を知ったぐらいです。これも原文を精読すれば達成できることですね。</p>
<p>最終的に、翻訳には理解するための知識と翻訳用の日本語力が必要ということが思い知りました。技術の理解を深めたいだけなので、僕にとって時間対効果のコスパが悪いです。翻訳家になりたいのであれば別ですが。</p>
<h2>感想</h2>
<p>今回は翻訳駆動学習を試みたら失敗した、という話でした。本来なら今日アップしようとしていた記事は翻訳された文章だったのですが、思惑どおりいかずダメだったので失敗談を記事にしました。</p>
<p>まず原文をちゃんと精読しよう、ということともっとDeepLに頼っていってもいいな、と思えたのでヨシとします。やることを決めるのと同じぐらいやらないことを決めるのは大切、と信じて。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[来た道、行く道 LifeJourney[39.3/2021-01]（月次振り返り）]]></title>
            <link>https://blog.solunita.net/posts/life-journey-2021-01/</link>
            <guid>https://blog.solunita.net/posts/life-journey-2021-01/</guid>
            <pubDate>Thu, 04 Feb 2021 13:03:12 GMT</pubDate>
            <content:encoded><![CDATA[<p>2021年ももう1月立ちました。早いもんですね。ちょっと過ぎてしまいましたが粛々と振り返ります。</p>
<h2>来た道[2021-01]</h2>
<h3>出来事/体験</h3>
<p>なにか特筆すべきはなかったように思いますね。やはりコロナ禍の今は何か新しい出来事が起こりにくい、起こしにくいですね。ううむ。</p>
<h3>習慣</h3>
<p>ストレッチをまた再開しました。今度はちゃんと本を見て、カウントするタイマーをセットしてやっています。痛みを少し感じるまで、とか伸びるまで、とかではなくカウントでやるのはやりやすいですね。</p>
<h3>アウトプット/創作活動</h3>
<p>ブログは良い感じでできてますね。やはり昨年終わりに見につけた日々、ちょこちょこ書く戦略が僕には向いてるようです。</p>
<h3>装備、環境</h3>
<p>こちらも特に変わりなし。</p>
<h3>お仕事環境</h3>
<p>昨年終わりごろから変わらずフロントエンドやっています。やればやるほどサーバーサイドとの違いやフロント専任の人との格差を思い知らされちょっと疲れてきました。こう、ただでさえ自分で自分の自己肯定感を削るタイプなところに追い打ちをかけられるような。</p>
<p>現プロジェクトが落ちつくまではやりますが、その後、フロントエンドに完全に転身するかというと、そのモチベーションはあまりないかな、という気持ち。</p>
<h3>消費趣味</h3>
<p>Ghost of Tsushimaのマルチが一段落して今はRemnant from the Ashesに戻ってきました。やはりこのゲーム面白いです。最近の僕はシビア目なCoopが性に合うという自覚を得ました。</p>
<h2>OKR</h2>
<ol>
<li>
<p>Objective: 継続的なアウトプット駆動でスキルアップを実現する</p>
<ul>
<li>✅ KR：最低週4ではアウトプットする時間を実践する</li>
</ul>
</li>
<li>
<p>Objective: 平穏な心とともに日々を楽しむ</p>
<ul>
<li>❌ KR：毎日、最低でも朝昼晩のどこかで心身とも安らぐ時間をつくること</li>
</ul>
</li>
</ol>
<p>アウトプット、主にブログを書いていますがこれは良い感じでした。濃度はともかく技術系記事ばかりだったのも良かったです。</p>
<p>一方で「心身とも安らぐ時間」を具体的にどうしていいかわからずでした。月の半ばからストレッチをやってみましたが、心身ともに安らいでるかと言うとNOですね。仕事のお昼休みにヨガのシャバーサナを意識してねっころがってたりもします。瞑想もちょっとまたやってみたり。でもどれもしっくり来ない感がありますね。</p>
<p>結局総じて特に何もない一月でした。ただメンタルも現在進行形であまり良くないのでローギアで進む月だったのでしょう。焦らずです。</p>
<h2>行く道[2021-02]</h2>
<ul>
<li>□ 最低週4でストレッチする</li>
<li>□ 最低週4で積んでる技術書、実用書を読む</li>
<li>□ 最低週4で何か運動する</li>
</ul>
<p>いつもOKR式でやっていますが、考えて考えてもコレといってピンとこなかったので粛々と小さなことから習慣化に向けてやっていきます。</p>
<p>なんでも習慣化する、しないの境界は週4回らしいです。週4以上のペースを保つとそのまま習慣化する確率が高く、それを下回ると習慣化しにくいらしいです。それを約8週は続けるのが良いさそうな。</p>
<p>今月はガッと頑張るのではなくローギアで一歩ずつ行こうと思います。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[BrakemanでRailsの脆弱性を検知して防ぐ]]></title>
            <link>https://blog.solunita.net/posts/security-check-for-rail-by-brakeman/</link>
            <guid>https://blog.solunita.net/posts/security-check-for-rail-by-brakeman/</guid>
            <pubDate>Thu, 28 Jan 2021 12:22:03 GMT</pubDate>
            <content:encoded><![CDATA[<p>今までもテストや監視を紹介してきましたが今回は脆弱性をとりあげてみます。幸いにもRails用にBrakemanというGemで機械的に脆弱性診断を行えます。これさえやっておけば完璧と断言できるわけではありませんが、人の手でやるには限界があるので導入しておくにこしたことはありません。</p>
<h2>概要</h2>
<ul>
<li>Railsの脆弱性診断にBrakemanを使う</li>
<li>CI（GitHub Action）で自動で診断するようにする</li>
</ul>
<h2>Brakeman is何？</h2>
<p>BrakemanはRails用の脆弱性診断Gemです。SQLインジェクションなどの代表的な脆弱性を始め、様々な脆弱性を静的解析してくれます。これをやっておけば完璧、ということではありませんが転ばぬ先の杖として定期的に診断しておくと安心です。</p>
<h2>期待すること</h2>
<p>もしもうっかり脆弱性を含んだ実装をしてしまった場合、リリースする前やマージする前に気づいて脆弱性を含んだアプリケーションをリリースしてしまうことを防ぎたい、というのがモチベーションです。</p>
<h2>実際やったこと</h2>
<p>ずBrakemanをインストールします。普通にgem installしたり、RailsのGemfileに書いたり、Dockerで走らせたり、といろいろありますが、今回はシンプルにGemfileに書いていこうと思います。</p>
<pre><code class="language-ruby">group :development do
  gem 'brakeman', require: false
end
</code></pre>
<p>ですね。そうしたらいつもどおり <code>bundle install</code>を実行します。これで入ったはずなのでとりあえず実行してみましょう。</p>
<pre><code class="language-shell">$ bundle exec brakeman
# =>
Loading scanner...
Processing application in /path/to/rails_project
Processing gems...
[Notice] Detected Rails 6 application
Processing configuration...
[Notice] Escaping HTML by default
Parsing files...
</code></pre>
<p>みたいな感じで実行され、結果がでると思います。例えばここで、あえてSQLインジェクションの可能性を持つコードを書いてみましょう。</p>
<pre><code class="language-ruby">User.where("name = '#{params[:name]}'")
</code></pre>
<p>こんな感じ。それで再度Brakemanを回すと</p>
<pre><code class="language-shell">$ bundle exec brakeman
# =>
Loading scanner...
# 中略...
== Warning Types ==

SQL Injection: 1

== Warnings ==

Confidence: High
Category: SQL Injection
Check: SQL
Message: Possible SQL injection
Code: User.where("name = '#{params[:name]}'")
File: app/controllers/home_controller.rb
Line: 4
</code></pre>
<p>のように表示されます。想定どおり検出されました。</p>
<h3>自動化する</h3>
<p>せっかく検出できることがわかりましたが手動で実行するのは心もとないですね。</p>
<p>できれば自動でチェックするのが良いでしょう。</p>
<p>パっと思いつく手段としてはGit hooksのpre-commitやpre-pushでやるか、CIでやるかでしょうか。</p>
<p>CIでできるのであれば個人的に前者はお勧めしません。Git hooksは<code>—no-verify</code>オプションで回避できますし、個人の設定如何で変わってしまうので担保にするには弱いです。</p>
<p>ではCIでやることにしましょうか。幸い、最近のGitHubではGitHub Actionが使えますのでそれでやってみます。</p>
<p><code>.github/workflows/brakeman.yml</code>を作り</p>
<pre><code class="language-yaml">name: brakeman
on:
  - pull_request
jobs:
  brakeman:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-ruby@v1
        with:
          ruby-version: '2.7'
      - run: gem install --no-document bundler
      - run: bundle install --quiet --jobs 4 --retry 3
      - run: bundle exec brakeman -Aqw1 --no-pager
</code></pre>
<p>と書きます（<code>run</code>で指定しているオプションは一例なので必要に応じて変更してください）</p>
<p>次にGitHubにpushしPull Requestを作ります。そうするとこのYAMLに従って、GitHub Actionsが走り、最終的に</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3fWO0BrUhKWixZcYI2yZ44wr-Fzt01_-LSDDq7qXD-afnMQUf02B5yYjLQ80wjaAn8rrsTIyTLEcBDDD-PP90cuUbpakAmqzGPlkMEVsioj7PAvTydJ7-uxnB5fxvRiwq8d9iPfxrgVUAII8vYGGroj=w1680-h472-no?authuser=0"></p>
<p>と表示されます。</p>
<p>もちろん誤検出や大丈夫なケースもありますし、逆にBrakemanでは検出できない脆弱性もあると思うので工夫が必要ですが、ひとまずこれで疑わしきコードの混入に気づきやすいようになったはずです。</p>
<h2>今回触れなかったこと</h2>
<p>上にも書いたようにBrakemanの設定オプションにはあまり触れませんでした。<code>—help</code>で見るか</p>
<LinkCard url="https://github.com/presidentbeef/brakeman/blob/main/OPTIONS.md" site-name="GitHub" title="presidentbeef/brakeman" description="A static analysis security vulnerability scanner for Ruby on Rails applications - presidentbeef/brakeman" image-url="https://repository-images.githubusercontent.com/865250/f3fcf800-fa3a-11e9-86eb-f3442b9cf66d" />
<p>に全てオプションが書いてあります。</p>
<p>また、</p>
<LinkCard url="https://brakemanscanner.org/docs/options/ja.html" title="Brakeman: Options" description="Brakeman is a static analysis security vulnerability scanner for Ruby on Rails applications." />
<p>には日本語化されたドキュメントもあります。</p>
<h2>感想</h2>
<p>今回はBrakemanによる脆弱性診断とその自動化をしてみました。</p>
<p>一人で個人開発をしているとQAも限界がありますし、そのための労力を減らすため静的解析や自動化を上手く使い開発に集中したいですね。</p>
<p>LinterやTest、エラー監視の導入と一緒にBrakemanもRails Templateに入れてしまって、新しいプロジェクトを始めるときに常に入るようすると尚良さそうです。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sentryを入れてRailsのエラー監視ををする（sentry-ruby, sentry-rails）]]></title>
            <link>https://blog.solunita.net/posts/set-up-sentry-for-rails-by-sentry-rails/</link>
            <guid>https://blog.solunita.net/posts/set-up-sentry-for-rails-by-sentry-rails/</guid>
            <pubDate>Sat, 23 Jan 2021 15:36:31 GMT</pubDate>
            <content:encoded><![CDATA[<p>Sentryというエラー監視サービスがあります。少し前まで<code>sentry-raven</code>というGemで導入していましたが、sentry-ravenはメンテナンスモードに入り、変わりに<code>sentry-ruby</code>, <code>sentry-rails</code>を使うように案内されていました。</p>
<p>今回はそれをキャッチアップしながら導入してみます。</p>
<h1>概要</h1>
<ul>
<li>エラー監視のためにsentryをRailsで使えるようにしたい</li>
<li>sentry-Ruby, sentry-railsを使ってsentryを導入する（not sentry-raven）</li>
<li>実際に試してみる</li>
</ul>
<h2>Sentry is何？</h2>
<p>Sentryとはアプリケーション監視、とりわけエラー監視ツールのSaaSです。Developer Planであれば件数の制限こそありますが無料で使いはじめることができます。</p>
<p>フロントエンドでもサーバーサイドでもどちらでも使うことができ、対応する言語やフレームワークも多く、導入も簡単なので手始めに入れるにはもってこいです。</p>
<h2>なぜやったか</h2>
<p>動機はエラー監視したいこと。やはり動作確認だけでは限界がありますし、ユーザーが実際にどんなエラーに遭遇しているかも知りたいです。また関連するAPIなどを使っている場合、連携先に問題がおこってる場合でも把握しやすいです。</p>
<p>冒頭でも書いたように、Railsで使うには今までは<code>sentry-raven</code>というGemを使っていました。それが開発が終了し、メンテンスモードに入りました。これからは<code>sentry-ruby</code>と<code>sentry-rails</code>を使うように案内されているため、実際にやりながら導入してみようという流れです。</p>
<h2>期待すること</h2>
<p>sentry-ravenを使わない方法でRailsで出たエラーをsentryで監視、なんらかの方法で開発者に通知する、というのが今回のゴールです。</p>
<h2>実際やったこと</h2>
<h3>Sentryに登録</h3>
<p>ここからSignUpします（すでにしてある場合は不要）</p>
<LinkCard url="https://sentry.io/welcome/" site-name="Sentry" title="Application Monitoring and Error Tracking Software" description="Self-hosted and cloud-based error monitoring that helps software teams discover, triage, and prioritize errors in real-time." image-url="https://www.sentry.dev/_assets2/static/index-1e7a4349067ba590c6841d7a2ada0013.jpg" />
<p>次に使うRailsプロジェクト用にSentryのProjectを作ります。
（こちらもすでに設定されていれば不要）</p>
<h3>導入</h3>
<p>まず公式ドキュメントを見ます。</p>
<LinkCard url="https://docs.sentry.io/platforms/ruby/guides/rails/" title="Rails" description="On this page, we get you up and running with Sentry&#39;s SDK, so that it will automatically report errors and exceptions in your application. If you don&#39;t already" image-url="https://docs.sentry.io/meta.png" />
<p>基本はこのドキュメントしたがってやります。
もしくはSentryのコンソールに<code>Setup Sentry</code>とステップにわかれた案内があるのでそちらがわかりやすいかもしれません。</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3f5n27uOWXG-c6mnz7q1CyHbbczQfDnIN9fP2oJLgmy2KyxUgY0dbB-D4feC4v_el0PRW-3255bSnq6kxxYKgbL5xKC4vTGayEt5N7uIXPx7hbn3K2NHT6jrZxFQVuymgZZFSXKvirmVYGE2SylgOcn=w1198-h1526-no?authuser=0"></p>
<p>Gemfileに</p>
<pre><code class="language-ruby">gem "sentry-ruby"
gem "sentry-rails"
</code></pre>
<p>を書いて<code>bundle install</code>ですね。場合によってはproduction環境用のみのインストールでも良いかもしれません。そのへんは各環境と設定に応じて。</p>
<p>次に<code>config/initializers/sentry.rb</code>を作って</p>
<pre><code class="language-ruby">Sentry.init do |config|
  config.dsn = 'https://examplePublicKey@o0.ingest.sentry.io/0' # ここは書き換えが必要
  config.breadcrumbs_logger = [:active_support_logger]

  # To activate performance monitoring, set one of these options.
  # We recommend adjusting the value in production:
  config.traces_sample_rate = 0.5
  # or
  config.traces_sampler = lambda do |context|
    true
  end
end
</code></pre>
<p>を書きます（ドキュメントそのまま）。</p>
<p>最低限の設定はこれですが、<code>config.dsn</code>に入れるsentry_dsnはSentryのWebコンソールでcreate projectすると表示されています。一応ベタ書きではなく環境変数などで指定するのを推奨されているのでご注意ください。</p>
<p>では、ローカルの開発環境で試して適当にエラーを起こしてみます。
そしてSentryのWebコンソールをみると、こんな感じで記録されていますね。</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3fj8zKXwWxbrvLBWqB7YwBCoYDxT7yVJdyXCEn21Qd9-tzYwnlXxB9r1ZR1uN1UIHJ9KWxxj8zlEhEjooGsByhvUVykvT9Q4eU3YoTk4QndT1tK-zNXhDxIhNQm2CewCMLNc7mzaWmCUDNDss7ALhGG=w1870-h584-no?authuser=0"></p>
<p>これでひとまずは成功です。</p>
<h2>設定</h2>
<pre><code class="language-ruby">config.enabled_environments = %w[production]
config.environment = Rails.env
</code></pre>
<p>基本的に開発環境では必要ないので対象をproductionに絞ります。例えば動作検証要にstaging環境とかあればそれも含めるほうが多いことでしょう。</p>
<p>その他、大事なのはエラーを出したときに個人情報などの秘匿すべきデータの扱いです。</p>
<pre><code class="language-ruby">config.send_default_pii = true
</code></pre>
<p>これは場合によりけりです。デフォルトが<code>false</code>になっていて、<code>true</code>にすると、UserのIP、Cookie、request bodyがSentryに送信されるようになります。
当然あるユーザを特定できる要素なため、扱いには注意が必要ですね。</p>
<p>例えば仮にどのユーザであるとか、同一のエラーは同一のユーザかどうかを見たい程度であれば、ApplicationControllerなどで</p>
<pre><code class="language-ruby">class ApplicationController &#x3C; ActionController::Base
  before_action :set_sentry_context

  private

  def set_sentry_context
    Sentry.set_user(id: current_user&#x26;.id)
  end
end
</code></pre>
<p>のようにしておけば、アプリケーション内の特定の情報をSentryに渡すことができます。</p>
<p>その他の注意点としては秘匿すべき情報を渡さないようにする処理、いわゆるサニタイズです。Sentryが外部サービスである以上、それが送信されること自体を避けなければなりません。これは従来のsentry-ravenで提供されていた仕組み（<code>config.sanitize_fields</code>）が使えなくなっていて、今はこのように書きます。</p>
<pre><code class="language-ruby">Sentry.init do |config|
  filter = ActiveSupport::ParameterFilter.new(Rails.application.config.filter_parameters)
  config.before_send = lambda do |event, hint|
    # note1: if you have config.async configured, the event here will be a Hash instead of an Event object
    # note2: the code below is just an example, you should adjust the logic based on your needs
    event.request.data = filter.filter(event.request.data)
    event
  end
end
</code></pre>
<p>（こうなった経緯は<a href="https://github.com/getsentry/sentry-ruby/issues/1140">Add better documentation for sanitizing data · Issue #1140 · getsentry/sentry-ruby)</a>にIssueがあります）。
もちろん、デフォルトでフィルタされる以外のものでフィルタしたいものがあれば、Rails側の<code>Rails.application.config.filter_parameters</code>に追加しておいてください。</p>
<p>その他の詳しい設定は一度こちらに目を通すといいでしょう。以前に<code>sentry-raven</code>を使っていた場合なども設定のAPIが変更されているため注意が必要です。</p>
<LinkCard url="https://docs.sentry.io/platforms/ruby/configuration/" title="Configuration for Ruby" description="Additional configuration options for the SDK." image-url="https://docs.sentry.io/meta.png" />
<h3>通知する</h3>
<p>Sentryでエラーを検知したらそれを何らかの方法で通知が来ると便利です。
Slack Integrationが便利なんですがBusiness Plan以上でないと使えないため別の方法を考えます。
（以前Slackで使われていた連携も使えないことはないのですが、Legacy Integrationと定義されておりいつ使えなくなるかわからないためここでは割愛します）。</p>
<p>Business Plan以上を使ってるのであれば何も気にせず以下のドキュメントを参考にすればすぐできるはずです。</p>
<LinkCard url="https://docs.sentry.io/product/integrations/slack/" title="Slack" description="Learn more about Sentry&#39;s Slack integration and how you can triage, resolve, and ignore Sentry issues directly from Slack." image-url="https://docs.sentry.io/meta.png" />
<p>ひとまずオーソドックスにE-mailで通知するようにしてみましょう。</p>
<p>SentryのWebコンソールからサイドメニューの<code>Alerts</code>を選択、続いて<code>Create Alert Rule</code>を押して新しいルールを作ります。</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3dco_fWCCOl2mG48PDwgezzXggsBkiUKxGVg5G9JglC3MB3-IZIShbYqYax81Ic9UoQvp7S1tmild5Okm7G4T3RPiOgucM5ej7gZdXBMV089NrLTMdWt-LYPPY-8N6VH4kQQsGEisJXHQNr4Kv3fYkg=w2254-h922-no?authuser=0"></p>
<p>ルールはひとまず最低限必要なのはタイトルとどうするか、です。
適当なタイトルをつけ、THENを<code>send e-mail</code>にして宛先を選びます。</p>
<p><img src="https://lh3.googleusercontent.com/pw/ACtC-3fbviAI-FU3aVRBp8sxa0Bwlj6goXhWQm7G6Mc6ujdB3oGgwOssdc6XnwOdnhbOM372CIuqp12l4Oks31dHLL62fPR2fM5lOw3F3YNaWsd47MXjCn_bMpRbhit-DwZElWFW9Omi0rXGJMFY60sJ3kwV=w1826-h1424-no?authuser=0"></p>
<p>これでもう一度適当なエラーを起こしてみてSentryからメールが届いたらOKですね。</p>
<h2>今回触れなかったこと</h2>
<p>すでに今まで<code>sentry-raven</code>を使っていた場合はこちらに移行ガイドがあります。</p>
<LinkCard url="https://docs.sentry.io/platforms/ruby/migration/" title="Migration Guide for Ruby" description="Learn about how to migrate from the deprecated sentry-raven SDK." image-url="https://docs.sentry.io/meta.png" />
<p>また、<code>sentry-sidekiq</code>を使うことでSidekiq経由で非同期的にエラー監視ができます。できればこれもやっておいたほうが良いでしょう。</p>
<p>非同期ではなく同期的だと万が一Sentryサービスのサーバー側が応答しない場合、処理がそこで止まってしまいます。ユーザーへの応答が無駄に遅くなりますし、タイムアウトした場合ユーザーに通知されるエラー内容も変わってしまいます。 ただし、Sidekiqが動いていることが前提になるため今回は導入としては割愛します。</p>
<h2>感想</h2>
<p>今回はSentryをライブラリを新しいものでRailsに入れてみました。しかし、僕はたまたまTwitterで見かけたので今回のアップデートに気づいたんですが、以前から使っててそのまま動いてるとライブラリが変わるとなかなか気づけないですね。</p>
<p>Sentryはサーバーサイドだけでなく、フロントエンドでも比較的簡単に導入できるので、ひとまず最初の環境構築のフェーズでシュっと入れておくのを癖づけるが良いだろうなあと思いました。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[JavaScriptで正確に文字数をカウントする]]></title>
            <link>https://blog.solunita.net/posts/count-string-accurately-in-javascript/</link>
            <guid>https://blog.solunita.net/posts/count-string-accurately-in-javascript/</guid>
            <pubDate>Fri, 15 Jan 2021 12:21:57 GMT</pubDate>
            <content:encoded><![CDATA[<p>どうも。最近は仕事ではめっきりTypeScriptを書いています。そんな中で、え！　? 文字数カウントで単純に<code>String.length</code>じゃダメなの！　? と思ったので備忘録的に書き残しておきます。</p>
<h2>概要</h2>
<ul>
<li>JavaScriptでは文字列のカウントは<code>length</code>メソッドでは不十分</li>
<li>サロゲートペアを含む文字列のカウントがズレる</li>
<li>代替の方法と正規表現のカウントについて</li>
</ul>
<h2>普通にやる文字数カウント</h2>
<p>TypeScriptを含むJavaScriptのフロントエンド環境では、例えばフォームの文字数によるバリデーションなどを代表として文字列をカウントする状況があると思います。</p>
<p>特に深く考えず文字数のカウントをする場合は、<code>String.length</code>と書くと思います。</p>
<p>しかし、実はこの<code>length</code>は厳密には文字数ではなくコードユニット数です。これで問題になるのがUnicodeでサロゲートペアを含む文字列です。</p>
<p>では、ちょっと動きを見てみます。</p>
<pre><code class="language-js">'aeiou'.length
// => 5
'あいうえお'.length
// => 5
'ニコ😀'.length
// => 4
'𠮷野屋'.length
// => 4
</code></pre>
<p>となります。</p>
<p>絵文字だけならまだしも一部、漢字の異体字も2文字判定になります。</p>
<p>これが困るケースはフロントエンドでのカウントとサーバーサイドやDB側でのカウントにズレがある場合ですね。</p>
<h2>正確にやる文字数カウント</h2>
<p>では、どうすればいいかというと結論から言えば<code>[...string].length</code>でカウントする方法です。</p>
<pre><code class="language-js">[...'aeiou'].length
// => 5
[...'あいうえお'].length
// => 5
[...'ニコ😀'].length
// => 3
[...'𠮷野屋'].length
// => 3
</code></pre>
<p>解説すると、配列の中で文字列をスプレッド構文で展開、配列の要素数を数えることで正確な文字数を出しています。</p>
<p>ちなみにこの方法はMDNにも案内されています。</p>
<LinkCard url="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/length#unicode" title="String length - JavaScript | MDN" description="length プロパティは String オブジェクトの文字列長を UTF-16 コードユニットの数で表します。 length は、 string インスタンスの読み取り専用データプロパティです。" />
<p>ちなみに注意点としては、スプレッド構文はES6以降の対応なのでレガシーなブラウザでも動作させるならbabelなどのpolyfillで対応が必要になる点はご注意ください。</p>
<h2>では正規表現でのカウントは？</h2>
<p>正規表現では文字数の指定が可能です。例えば5文字以上10文字以下の文字列を判定するとしたら、</p>
<pre><code class="language-js">/^.{5,10}$/.test('aeiouあいうえお')
// => true
</code></pre>
<p>ですね。これに前述のとおり絵文字などが入るとどうでしょう？</p>
<pre><code class="language-js">/^.{5,10}$/.test('aeiouあいうえ😀')
// => false
</code></pre>
<p>となり、JS(TS)の正規表現での文字数指定はlengthと同じカウントということがわかりました。</p>
<p>といっても大抵の場合、正規表現で文字数まで判定する場合はパスワードやemailアドレス、電話番号など、アルファベットや数字に限定する場合がほとんどなのでそこまで心配する必要もないことが多いです。</p>
<pre><code class="language-js">/^\w{5,10}$/.test('aeiouあいうえお')
// => false
/^\w{5,10}$/.test('aeiouuoiea')
// => true
</code></pre>
<p>ただやはり知らないと思わぬ罠にハマることもあるので気をつける必要はありそうです。</p>
<p>もしどうしても正規表現で入力文字を検証しつつ、同時に文字数にも制限を設け、しかも文字列にサロゲートペアを含む文字列を入るようなケースがあるとしたら、正規表現と前述の正確な文字列の算出を併用して、どちらもパスするようなら、みたいな関数を作るのが確実そうですね。</p>
<h2>感想</h2>
<p>今回はJS(TS)での文字数の正確なカウントについての注意でした。実はこの記事を書きはじめるまでMDNにスプレッド構文による解決法が記載されていることを知りませんでした。</p>
<p>一度配列化するのは少しhackyな気もしますが、逆に言えばその方法が適切だという裏付けでもあり、自信を持って使えそうで良かったです。</p>
<p>この知識はUnicode、特に我々のような非アルファベット圏のユーザーには欠かせない注意ポイントですね。</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Visual Studio Code のキーボードショートカットで発火してるコマンドを探す方法]]></title>
            <link>https://blog.solunita.net/posts/how-to-find-keybind-what-fired-in-vscode/</link>
            <guid>https://blog.solunita.net/posts/how-to-find-keybind-what-fired-in-vscode/</guid>
            <pubDate>Mon, 11 Jan 2021 08:50:01 GMT</pubDate>
            <content:encoded><![CDATA[<p>Visual Studio Code（以下VSCode）では他の一般的なエディタと同様、特定の操作をキーボードショートカットで実行できます。</p>
<p>デフォルトで設定されているもの以外、拡張機能で追加されるものもありますし、キーマップセット専用の拡張もあります。これらは基本的に便利なんですが、中には自分の好みと合わないものもあります。そして場合によっては意図せず発火してしまい、何が発火してるかわからないと変更も難しいという逆に使いづらい現象にハマります。</p>
<p>今回はそれを特定し、不使用にしたという話。</p>
<h2>概要</h2>
<ul>
<li>意図せず発火し、何が発火しているかわからないので調べて潰しようがないものがあった</li>
<li>VSCodeで発火しているショートカットを調べる方法</li>
<li>調べて判明したらそのショートカットを潰す方法</li>
</ul>
<h2>動機</h2>
<p>様々なケースがあると思いますが、今回、僕の状況としてはEmacsキーバインドを実現するための拡張、Awesome Emacs Keymapを使っています。</p>
<LinkCard url="https://marketplace.visualstudio.com/items?itemName=tuttieee.emacs-mcx" title="Awesome Emacs Keymap - Visual Studio Marketplace" description="Extension for Visual Studio Code - Emacs Friendly Keymap with multi cursor support, improved mark-mode experience, clipboard and kill-ring integration, and lots of improvements and bug fixes." image-url="https://tuttieee.gallerycdn.vsassets.io/extensions/tuttieee/emacs-mcx/0.24.1/1610189586333/Microsoft.VisualStudio.Services.Icons.Default" />
<p>おおむね良好で素晴らしい拡張ですが、 エディタ内で<key>Cmd</key>+<key>f</key>で検索窓を開いたとき、検索窓内で<key>Ctrl</key>+<key>f</key>,<key>Ctrl</key>+<key>b</key>でキャレットを移動しようとすると検索窓が閉じてしまいます。個人的にはこの挙動は望んでいません。</p>
<p>しかし、VSCodeのショートカット一覧の画面か<code>Ctrl + f</code>などで調べてみても、該当するものが多すぎてどれかわかりません（そして基本的には必要なので手を加えたくない）。</p>
<p>方法としては自分<key>Ctrl</key>+<key>f</key>にキャレット移動するように指定する方法も考えましたが、優先度の問題もあり可能であれば、やはり指定して無効化するのが正攻法です。</p>
<h2>実際やったこと</h2>
<p>まずキーボードショートカットについては<a href="https://code.visualstudio.com/docs/getstarted/keybindings">ここ（Visual Studio Code Key Bindings）</a>に書いてあります。</p>
<LinkCard url="https://code.visualstudio.com/docs/getstarted/keybindings" title="Visual Studio Code Key Bindings" description="Here you will find the complete list of key bindings for Visual Studio Code and how to change them." image-url="https://code.visualstudio.com/assets/docs/getstarted/keybinding/customization_keybindings.png" />
<p>そして何が発火するか調べる方法は<a href="https://code.visualstudio.com/docs/getstarted/keybindings">ここ（Visual Studio Code Key Bindings#troubleshooting-keybindings）</a>にあります。</p>
<LinkCard url="https://code.visualstudio.com/docs/getstarted/keybindings#_troubleshooting-keybindings" title="Visual Studio Code Key Bindings" description="Here you will find the complete list of key bindings for Visual Studio Code and how to change them." image-url="https://code.visualstudio.com/assets/docs/getstarted/keybinding/customization_keybindings.png" />
<p>実際にやってみましょう。</p>
<p>コマンドパレットを開いて</p>
<p><code>Developer: Toggle Keyboard Shortcuts Troubleshooting</code>と入力します。全て入力しなくても途中でサジェストされると思います。</p>
<p>実行すると、ログが流れるパネルが表示されます。これを表示したまま、今回、何のコマンドが発火しているかわからないコマンドを実際に発火させます。</p>
<p>前述の自分の例でいえば <key>Cmd</key>+<key>f</key>`で検索窓を開き、何文字か入力したあと<key>Ctrl</key> + <key>b</key>を入力してみます。</p>
<p>そうすると沢山でるログを丁寧に見ていくと、</p>
<pre><code class="language-ruby">[2021-01-11 16:59:30.988] [renderer7] [info] [KeybindingService]: / Received  keydown event - modifiers: &#x3C;key>Ctrl&#x3C;/key>], &#x3C;key>c&#x3C;/key>ode: KeyB, keyCode: 66, key: b
[2021-01-11 16:59:30.988] [renderer7] [info] [KeybindingService]: | Converted keydown event - modifiers: &#x3C;key>Ctrl&#x3C;/key>], &#x3C;key>c&#x3C;/key>ode: KeyB, keyCode: 32 ('B')
[2021-01-11 16:59:30.988] [renderer7] [info] [KeybindingService]: | Resolving&#x3C;key>Ctrl&#x3C;/key>+[K&#x3C;key>e&#x3C;/key>yB]
[2021-01-11 16:59:30.988] [renderer7] [info] [KeybindingService]: \ From 4 keybinding entries, matched emacs-mcx.executeCommands, when: editorFocus &#x26;&#x26; findWidgetVisible &#x26;&#x26; !isComposing &#x26;&#x26; !replaceInputFocussed, source: user extension tuttieee.emacs-mcx.
</code></pre>
<p>というような記述を見つけました。</p>
<p>つまり<code>emacs-mcx.executeCommands</code> が<code>when: editorFocus &#x26;&#x26; findWidgetVisible &#x26;&#x26; !isComposing &#x26;&#x26; !replaceInputFocussed</code>の状況のとき発火していて、これは<code>source: user extension tuttieee.emacs-mcx.</code>で設定されたもの、ということです。</p>
<p>見つかりましたね。</p>
<p>あとはコマンドパレットで<code>Open: keyboard shortcut</code>を実行し、ショートカット一覧を開きます。</p>
<p>ここで、上記問題のコマンド、もしくは状況の<code>editorFocus &#x26;&#x26; findWidgetVisible &#x26;&#x26; !isComposing &#x26;&#x26; !replaceInputFocussed</code>で調べても良いでしょう。</p>
<p>対象のものを見つけだしたら、右クリック（or Ctrl+クリック）で<code>キーバインドの削除</code>を実行します。</p>
<p>そうすると一覧から削除され、このコマンドは無効化されます。</p>
<p>ここで、このコマンドはいったん削除し、戻す方法がなさそうに見えます、<code>Open: keyboard shortcut(JSON)</code>のほうで、GUIではなく設定のJSONファイルを見にいくと、</p>
<pre><code class="language-ruby">{
    "key": "Ctrl + b",
    "command": "-emacs-mcx.executeCommands",
    "when": "editorFocus &#x26;&#x26; findWidgetVisible &#x26;&#x26; !isComposing &#x26;&#x26; !replaceInputFocussed"
},
</code></pre>
<p>という記述が最後に追加されているはずです。この<code>"command": "-emacs-mcx.executeCommands"</code>がポイントです。最初に<code>-</code>が付与されているため、これは無効化されたコマンドになっています。</p>
<p>もし元のように動作させたくなった場合、このJSONからこの記述を削除すればまた元のように動作しますし、一覧にも表示されるようになります。</p>
<h2>やってみた結果</h2>
<p>これで無事発火しなくなりました。あとは<key>Ctrl</key>+<key>f</key>のほうも潰してやれば良さそうです。ちなみにVSCodeの拡張ではなく、VSCodeそのものが持つデフォルトショートカットは<a href="https://code.visualstudio.com/docs/getstarted/keybindings#_default-keyboard-shortcuts">ここ（Visual Studio Code Key Bindings#default-keyboard-shortcuts）</a>を見ると良いですね。</p>
<LinkCard url="https://code.visualstudio.com/docs/getstarted/keybindings#_default-keyboard-shortcuts" title="Visual Studio Code Key Bindings" description="Here you will find the complete list of key bindings for Visual Studio Code and how to change them." image-url="https://code.visualstudio.com/assets/docs/getstarted/keybinding/customization_keybindings.png" />
<p>簡易的には<a href="https://code.visualstudio.com/docs/getstarted/tips-and-tricks#_keyboard-reference-sheets">ここ（Visual Studio Code Tips and Tricks#keyboard-reference-sheets）</a>に一覧も用意されています。便利ですね。</p>
<LinkCard url="https://code.visualstudio.com/docs/getstarted/tips-and-tricks#_keyboard-reference-sheets" title="Visual Studio Code Tips and Tricks" description="Visual Studio Code Tips and Tricks for power users." image-url="https://code.visualstudio.com/opengraphimg/opengraph-docs.png" />
<p><code>Open: keyboard shortcut</code>から開くGUIによるエディタの「ソース」が規定になっていても拡張で入るものもあるのでVSCode本来のデフォルトショートカットは上記のリンクで確認するのが正しそうです。</p>
<h2>感想</h2>
<p>実はこういう発想に至ったのも以前僕はAtomをメインで使っていた時期があり、Atomでは何が発火したか表示する機能があったんですね。なのでそれと同じことができれば、という発想になりました。</p>
<p>キーバインドのカスタマイズは上手く自分の手になじむものでないとツライですし、なにより意図せず発火するのはもっとツライですね。</p>
<p>これでようやくEmacキーバインドのVSCodeがストレスなく使えるようになりました、万歳！</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[RSpecをちょっと楽に書くためにaggregate_failuresとRequestDescriberを設定する]]></title>
            <link>https://blog.solunita.net/posts/easy-to-write-rspec-by-aggregate-failures-and-request-describer/</link>
            <guid>https://blog.solunita.net/posts/easy-to-write-rspec-by-aggregate-failures-and-request-describer/</guid>
            <pubDate>Thu, 07 Jan 2021 23:01:58 GMT</pubDate>
            <content:encoded><![CDATA[<hr>
<p>テストコードというものは必要だし、大切だし、適切に使えばそれはそれは心強い武器となります。が、そうはいってもやはり書くのが手間で、人間面倒だとつい疎かになりがちですね。</p>
<p>今回はRSpecを書くにあたってちょっと横着するための手段として、<code>aggregate_failures</code>の設定と<code>RequestDescriber</code>の導入をしていきます。</p>
<h2>概要</h2>
<ul>
<li>テストの必要性や有用性は十分に理解してるもののやはり面倒</li>
<li>だから少しでも楽をしたい</li>
<li>設定の変更と、Gemを入れてちょっと楽に書こう</li>
</ul>
<h2>aggregate_failures is何？</h2>
<LinkCard url="https://relishapp.com/rspec/rspec-core/docs/expectation-framework-integration/aggregating-failures" title="Aggregating Failures - Expectation framework integration - RSpec Core - RSpec - Relish" description="Relish helps your team get the most from Behaviour Driven Development. Publish, browse, search, and organize your Cucumber features on the web." />
<p>RSpecではテストケースを書く際に<code>it</code>でブロックを作ります。この1つの<code>it</code>の中で複数のアサーションを書いた場合、通常だと複数の項目がパスしなかったとしても最初にパスしなかったものしかわかりません。</p>
<p>これが従来1つのテストケースでexpectするものは1つ、と言われていた所以です。</p>
<p>aggregate_failuresの設定をすると1つの<code>it</code>の中で複数のexpectが期待どおりでなかったとしても、何がどうダメだったかわかりるようになります。</p>
<p>つまり、それまで複数書いていた同じ前提のテストケースを纏めることができるようになります。</p>
<h3>設定方法</h3>
<h3>テストケースに指定して使う</h3>
<p>まず、こんなケースがあるとします。</p>
<pre><code class="language-ruby">it "ユーザーの姓、名がレスポンスにあること" do
  subject
  expect(response.body).to include user.first_name
  expect(response.body).to include user.last_name
end
</code></pre>
<p>この場合、最初のものでパスしないと2つめも結果は期待どおりなのか、どうなのかわかりません。</p>
<pre><code class="language-ruby">it "ユーザーの姓、名がレスポンスにあること" do
  subject
  aggregate_failures do
  expect(response.body).to include user.first_name
  expect(response.body).to include user.last_name
end
</code></pre>
<p>そこでこの場合 <code>aggregate_failures</code> ブロックでアサーションを囲むように書きかえると両方の結果もちゃんと出るようになります。</p>
<h3>デフォルトで効かせる</h3>
<p><code>spec/spec_helper.rb</code>に以下のように書くだけです。</p>
<pre><code class="language-ruby">RSpec.configure do |config|
  config.define_derived_metadata do |meta|
    meta[:aggregate_failures] = true
  end
end
</code></pre>
<p>これだけです。</p>
<p>注意点としてはRuboCopで <code>RSpec::MultipleExpectations</code> が効いていると警告されてしまうのでルールを緩めておきましょう。</p>
<p><a href="https://www.rubydoc.info/gems/rubocop-rspec/1.7.0/RuboCop/Cop/RSpec/MultipleExpectations">https://www.rubydoc.info/gems/rubocop-rspec/1.7.0/RuboCop/Cop/RSpec/MultipleExpectations</a></p>
<h2>RSpec::RequestDescriber is何？</h2>
<LinkCard url="https://github.com/r7kamura/rspec-request_describer" site-name="GitHub" title="r7kamura/rspec-request_describer" description="An RSpec plugin to write self-documenting request-specs. - r7kamura/rspec-request_describer" image-url="https://avatars1.githubusercontent.com/u/111689?s=400&v=4" />
<p>RSpec用のGemで、RSpecのRequestSpec時にDSLを拡張し、<code>describe</code>に書いたリクエストがそのままSubjectとして扱われるようになります。</p>
<p>利点は、通常説明を書く文字列としての意味しかない<code>describe</code>がそのまま前提の挙動になるため、説明とテストケースが意図せず整合性が崩れてしまうこともなくなりますし、記述量も減ります。</p>
<p>デメリットはこのGemを知らないとなぜ前提を書いていないにもかかわらず期待通りの挙動をするのかまったくわからないことです（余談ですが、昔これでかなりハマりました）</p>
<h3>RSpec::RequestDescriberの導入</h3>
<p>基本的にはREADMEにあるとおりですが、まずGemfileにいつものように</p>
<pre><code class="language-ruby">group :test do
  gem 'rspec-request_describer' 
end
</code></pre>
<p>と書いて<code>bundle install</code>します。</p>
<p>次に<code>spec/rails_helper.rb</code>に</p>
<pre><code class="language-ruby">RSpec.configure do |config|
  config.include RSpec::RequestDescriber, type: :request
end
</code></pre>
<p>と追記します。これで導入はOKです。</p>
<p>そしてRequestSpecで</p>
<pre><code class="language-ruby">RSpec.describe 'GET /users' do
  it { is_expected.to eq 200 }
end
</code></pre>
<p>のように書けば動作します。</p>
<p>describeの後に続く説明がHTTP METHODとPATHの組み合わせになっていますね。</p>
<p>こうすることでsubjectが自動で決まります。なのでここでは<code>is_expected</code>でsubjectを評価し、status 00になるかのテストとなっています。</p>
<h2>実際どうなるか</h2>
<p>以前使ったテストに修正を入れてみてみましょう。achievement（実績）の一覧を取得するとき、普通だと</p>
<pre><code class="language-ruby">require 'rails_helper'

RSpec.describe "Achievements", type: :request do
  describe "GET /achievements" do
    subject { get "/achievements" }
    let(:achievements) { FactoryBot.create_list :achievement, 3 }

    before do
      FactoryBot.create_list(:achievement, 3)
    end

    it "returns 200" do
      subject
      expect(response.status).to eq 200
    end

    it "returns body with achievements" do
      subject
      expect(response.body).to include Achievement.first.title
    end
  end
end
</code></pre>
<p>みたいなテストがあるとします。</p>
<p>普通だとこのように、1テストケースで1つのexpectを書きます。前述の通り、どちらかでパスしなかった場合、両方パスしてないのか、片方だけなのかわからないため、1ケース1expectを守るように心がけます。</p>
<p>また、describeはあくまでただの文字列による説明です。expectするsubjectはちゃんと<code>subject { get "/achievements" }</code>と指定します。逆にいうとdescribeの内容とこのsubjectが食いちがってもコード的には問題ありません。</p>
<p>これを前述の設定を加えた場合、以下のように書き変えれます</p>
<pre><code class="language-ruby">require 'rails_helper'

RSpec.describe "Achievements", type: :request do
  describe "GET /achievements" do
    let(:achievements) { FactoryBot.create_list :achievement, 3 }

    before do
      FactoryBot.create_list(:achievement, 3)
    end

    it "returns 200 with achievement titles" do
      is_expected.to eq 200
      expect(response.body).to include Achievement.first.title
    end
  end
end
</code></pre>
<p>と書くことができます。</p>
<p>かなり短かくかけましたね。同じ前提で1つのケースとしてまとめられるので、見通しが良くなります。しかもdescribeの文字列とrequestの内容が確実に一致するため、安心です。</p>
<h2>触れなかったこと</h2>
<p>RequestDescriberでは、<code>let(:params)</code>のようにリクエストパラメータを設定できますし、パスの変数も設定できます。このあたりはREADMEを是非参照ください。</p>
<h2>感想</h2>
<p>今回は2つの設定（1つはGem）の導入で少しRSpecを書く環境を楽にしました。テストを書くのがつらいとどうしてもサボりがちになり、それは割れ窓理論を呼び、カバレッジの甘いテストになります。その結果、中途半端なテストになり、それがさらにテストの必要性に懐疑的なスタンスを生み……と悪循環になっていきます。</p>
<p>そのためにも少しでもテストを楽に書くこと、担保すべきをきっちり担保することを心がけるのは思ったよりも大事なことだと個人的に思います。それにTDDだ書く際にもシュっとテストケースを用意できたほうが捗りますしね。</p>
]]></content:encoded>
        </item>
    </channel>
</rss>