📰 Topics

Inputの多い一週間でしたが、WriteやTryは少なめです。
一方、初づくしの一週間でもありました。
Markowlの初Issue対応、Kotlinテスト初導入、はてなの初3桁など。

Table of Contents

書いたこと

今週はありません。

読んだこと/聴いたこと

Conceptのプレゼン表示

仕事のMTGではじめてConceptを使ってみました。
驚いたのは外部ディスプレイに接続したとき、他のアプリケーションのように不完全な画面サイズでミラーリングされなかったことです。

手元のiPadとは別に画面を拡張することができ、以下の特徴があります。

  • 画面にはキャンバスのみが表示される (プレゼンのフルスクリーンモードのよう)
  • 画面の解像度に表示範囲が最適化され、手元のiPadには表示範囲に枠線が表示される

この機能により、手元で小さな文字を書いてもスクリーンでは鮮明に表示されます。
このユーザー体験は想像以上に最高でした😄

詳しくは公式ドキュメントをご覧ください。

土日の体感時間を“1週間”に延ばせる!? 目からウロコの「時間の長さコントロール法」

自分の時間をゆっくり進める方法が紹介されています。
あっという間に1日/1週間が終わってしまう..と危機感を感じている方は是非!

印象に残ったこと。

  • 冒頭の動画による体感時間
  • 代謝をコントロールすることで時間の感じ方を変えられる
  • 明るくて広くてやまかしい場所

社内勉強会で専門的技術力を高めるには

前半はTLSのコアな話が出てきて面食らいますが、後半に素晴らしい教えがあります。
専門的技術力を高めるために大事なことから下が心に響きました。

ざっくり言うと、『基礎を大事に1次情報を何回も学びアウトプットしよう』という感じです。
熟練者になるためには基礎の積み重ねからは逃げられないと思っています。

なぜDiscordはGoからRustへ移行するのか

Why Discord is switching from Go to Rust - Discord Blogの内容を和訳された記事です。
パフォーマンス改善を目的としてGoからRustに移行したストーリーが書かれています。

元記事が秀逸な理由として、Goのソースコードまで見てチューニングを頑張ったけれど厳しかった..という過程でRustに移行した効果が書かれていることですね。
Rustにしたらパフォーマンス上がったという話と違い、具体的な壁がどこに存在するのかをイメージできました。

あと、リアルタイムビッグデータの扱いに長けたScyllaDBを初めて知りました。

Rustのモジュールの使い方 2018 Edition版

クレートとモジュールの説明からはじまり、具体的な利用シーンごとにどのような挙動をするのか、どういう用途で使えるかが丁寧に書かれています。

特にlib.rsとmain.rsセクションの以下は大変参考になりました。なるほどです。

さて、ここからはスタイルの話ですが、私がRustを書く時はmain.rsの中にmodを書くことはないです。必ずlib.rsを作って、そこでライブラリとしてまとめてからmain.rsで使います。「アプリケーションはアプリケーションを記述するための巨大なDSLとそれを使った小さな実装からなる」という思想ですね。明示的に境界を作ることで自然とAPIを設計出来るのでコードが整理しやすくなります。

Webブラウザ上で純粋なHTTPだけで単方向リアルタイム通信を可能にするHTTPのストリーミングアップロードが遂にやってくる

ReadableStreamとHTTP POSTでストリーミングができるという話。
ファイルのストリーミングと違い、終わりが曖昧なものにも使えるのが違いという理解です。

piping-serverも気になります。何かに使えそう。

現場トランスフォーメーション~アジャイル導入5つの壁を越えろ~

アジャイルを導入したあとに立ち塞がる壁をどう越えればいいかについての資料です。
難しい用語がなく、くだけた言い回しが多いので専門書が苦手な方にもオススメ。

個人的に好きなスライドは以下です。

失敗したエンジニア組織施策としくじりの反省

『お恐らく貴方の会社もやってるのでは…』
と思わせるような耳の痛い..リアルな話が丁寧に分析されています。

引用ではなく独自の解釈を含めた言い回しですが、印象に残ったのは以下です。

  • 上の人自らが情報収集に動くべき (情報はもらうものじゃない)
  • 普段かかわらない人をレビュアーにいれるなら初期がベスト
  • 組織横断の取り組みは困ったときに相談受けるくらいで実はちょうどいいのかも

Best 8 JavaScript Testing Frameworks In 2020

JavaScriptのテストフレームワークベスト8 in 2020。

私はJestが好きでそれしか使っていないので、初めにでてきたのは嬉しいですね😄
e2eテストはChrome以外を対象にするかどうかがキモだな..と思いました。

そして、Cypressはないんですね。★は20000越えているのに..。

スターは2000弱ですが個人的にはQA WOLFが気になっています。

試したこと

【Vue】Teleport(portal-vue)

Vue3で実装されるTeleportのようなライブラリportal-vueを導入してみました。

Teleportの仕様はこちら。

用途はNotificationの表示です。

Menuに仕込んだダイアログの処理完了時に表示すると、Menuを閉じたあとNotificationが隠れてしまうので、その対策として入れました。
よくあるモーダルダイアログを使うケースに似ていると思います。

Nuxt moduleが用意されているので npm i portal-vue でインストールしたあとにnuxt.config.jsをいじるだけで終了でした。プラグイン不要です。

調べたこと

【IDEA】自作プラグインがincompatibleエラー

IntelliJ IDEAを2020.2にバージョンアップしたら、自作プラグインがエラーになりました。
新しいバージョンが対応バージョンに含まれていないことが原因です。

制限した覚えはなかったので調べたところ、設定が不十分でした。
以下の記事に追記しています。

【TypeScript】Axiosでmultipart/form-dataのpostができない

multipart/form-dataは複数データを送るので、その境目を示すためboundaryの指定が必要です。

axios.post(url, data, { headers })dataにObjectを指定すると、リクエストヘッダにboundaryが付与されないため失敗します。
dataにObjectではなく FormDataクラスのインスタンスを渡すと上記問題が解消されます。

【Portal-Vue】1つのportal-targetを複数portalで指定すると上手く表示されない

以下のようなケースでhoge1とhoge2どちらかが表示されませんでした。

<portal-target name="hoge" />

<portal to="hoge">hoge1</portal>
<portal to="hoge">hoge2</portal>

<portal-target>multipleを指定しなければいけないようです。

<portal-target name="hoge" multiple />

<portal to="hoge">hoge1</portal>
<portal to="hoge">hoge2</portal>

<portal>orderは指定しなくても平気でした。

整備したこと

JetBrains Toolbox Appの導入

IntelliJ IDEAしか使っていないため今まではScoopで運用していました。
ところが scoop updateした場合に設定がすべてリセットされてしまいました..。

ならば機会にJetBrains Toolbox Appを試してみようと思ったわけです。
クリティカルな不具合があった場合の切り戻しも簡単そうですし😉

Intellij IDEAを2020.2にアップデート

主にWeb系の開発をしているためWebStormの記事が参考になりました。

全体的に素晴らしいリリース内容ですが、特に興奮したものは2つあります。

Using Prettier as the default formatter

デフォルトのフォーマッターでPrettierが使えます!
すぐに設定変更しました。

これで標準フォーマットかPrettierかで気を遣う日々ともオサラバです👋
また、標準フォーマット特有の機能をPrettierで使えるのもありがたい..。

New tools for finding problems in your code

一番嬉しいのはProblems tool windowの追加ですね。
逆になぜ今まで無かったのか不思議なくらい便利です😆

その他

他にもワクワクするような変更が沢山あります。
機会を見つけて試していきたいですね💪

  • Vue/Nuxt周りの補完強化
  • Vue/NuxtのCode Style追加
  • Loopやoptional chaining / nullish coalescingのIntention強化
  • WSL2内のプロジェクトではWSL2のGitを使えるようになった
  • Gitの操作/UI改善
  • 機械学習のコード補完(試験的機能)
  • ターミナルからデバッグ開始
  • Debugger ConsoleでObjectの詳細な情報が見られるようになった

Kotlinの単体テストを導入

はじめてKotlinの単体テストを書いてみました。
導入したプロダクトはMarkowlです。

以下を参考にさせていただきました。

build.gradleを以下のように変更しました。

  dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
-   testCompile group: 'junit', name: 'junit', version: '4.12'
+   testImplementation("org.jetbrains.kotlin:kotlin-test")
+   testImplementation("org.jetbrains.kotlin:kotlin-test-junit")
  }

あとはparameterizedテストを書くだけでOK。

package net.mamansoft.markowl.util
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import kotlin.test.Test
import kotlin.test.assertEquals

@RunWith(Parameterized::class)
class JapaneseTest(private val arg: String, private val expected: Int) {
    companion object {
        @JvmStatic
        @Parameterized.Parameters
        fun data() = listOf(
            arrayOf("ほげ", 4),
            arrayOf("ホゲホゲ", 4),
            arrayOf("保毛★", 6)
        )
    }
    @Test
    fun test() {
        assertEquals(expected, width(arg))
    }
}

classのコンストラクタ引数とarrayOfの順番をあわせるのがミソです。

今週のリリース

Markowl v0.5.2 ~ v0.6.0

プラットフォームバージョン2020.1以外でインストールできない不備を修正

互換性の設定が甘かったです..。

キリル文字の幅に対応

キリル文字の幅を2ではなく1にしました。

他言語の幅についてもIssueが作成されたら対応していきたいと思っています💪

Togowl v2.7.0 ~ v2.8.0

新規タスク作成で任意の期日を指定可能に

タスク作成ダイアログの一番右のボタンで任意の期日を指定できます。

もともとそこにあった『期日なしで作成』ボタンは消しました。
Togowl使用中に期日無しタスクを作るケースがなかったので。

タスクの編集機能

タスクエントリのメニューからタスクの編集ができるようになりました。
名前、プロジェクト、ラベルの変更ができます。

期日や並び順の変更はスワイプメニューからとなります。

Owlelia v0.13.0 ~ v0.14.0

DateTimeクラスのメソッド追加

以下のメソッド/getterを追加しました。

  • DateTime.today()
  • plusHours()
  • plusMinutes()
  • minusHours()
  • minusSeconds()
  • overwriteDate()
  • isStartOfDay
  • rfc3339WithoutTimezone

テスト整備

Lineカバレッジが62%から90%まで上昇しました😄

その他

2ヶ月前に書いた記事が初のはてな3桁に到達していました🎉

当時、結構頑張って書いたのもあり結果が出るのは嬉しいですね☺️