Keep on moving

あんまりまとまってないことを書きますよ

作業環境を XPS 13 2-in-1 7390 にした(Windows10/Ubuntu 19.10)

お正月どこも行かなすぎ君です。 お正月に久々に持ち歩いてるノートPCを変えました。Ubnutu19.10でそこそこいい感じで使えています。

TL;DR

  • Linux Desktopでそこそこ便利につかえている
  • 仕事でMacつかっていて便利な辞書とかMagicTouchpadとかは対応してないけど一応なんとかなってる

選び方

想定していた用途はこんな感じ。

  • 持ち歩いて気になることを調べたい。 
  • カフェでコード書きたい
    • PythonJava/Scala(切実) をいい感じで書きたい
    • IntelliJをつかってもそこそこいいDXになってほしい

選定のポイントは - 1.3kg以下 - 英語キーボード - メモリ16GB - Linuxで動かす実績がある - [Optional] 4K (3840x2160)液晶

で、前回も買ったけどnew XPS13にしました。1.27Kgで正月なのでちょっとお安く売ってたこともありこれにしました。

www.dell.com

ひとまず Linuxをいれる

www.eisbahn.jp

買ってからyoichiro さんのブログを見つけてこりゃArch入れるしかないかなーと思ったけど ひとまずUbuntu19.10いれたらそこそこ動いているのでそのまま使っている。 Linuxカーネルのバージョンが 5.3系だからかもしれない。やっぱりダメそうならArchに切り替える予定。 Windowsはちょっとなんかするときにあると便利なので一旦残すことにした。

キーボードの設定

  • CapsLockをCtrlに

こちらを参考にいれてみた

linux.just4fun.biz

MacOSっぽく 右alt でime-on, 左altでime-offがしたくてこちらを設定

qiita.com

辞書

MacOSだと便利な辞書が入っているんだけど、Linux Desktopだとないのでこちらを導入

chrome.google.com

これに英辞郎の辞書をいれた. v144.8のテキストの方は使えた(最新版は暗号化されてるけどいろいろ考えるとしょうがない)

www.eijiro.jp

まだできていないこと

Dell/XPS/XPS-13-7390-2-in-1 - Ubuntu Wiki

ここにも書かれているけどやっぱ以下はうまくいってない.

  • 指紋認証(finger print)
  • suspend/resume
    • 蓋を閉じておいてもそれなりに動いているらしくバッテリーを消費する

あとカメラが使えないはずなのにつかえているっぽい。Google Meetとかでも使えた 実はPyCon mini shizuokaではこのpcから配信したんだけどうまくカメラもつかえていた。 masahito.hatenablog.com

参考

medium.com

まとめ

一部使えない機能があるけどLinux Desktopでそこそこつかえています。 LaptopでLinux Desktopで使いたい人には良いかもです。これで指紋認証とかつかえると最強なんすけどねぇ。 それにしても前にxps 13 9343にUbuntuいれたときはタッチパッドとかが使えるようになるまでに相当設定入れないと動かなかったんですが、 インストールしただけでスルッと動くようになってきましたね。

Dell XPS 13 (9343) - ArchWiki

PyCon mini Shizuoka 2020(online) #python_shizu でスピーカーとして話した

PyCon mini Shizuoka 2020(online) でスピーカーとして話したので感じたことをざっくり書いておきたいと思います。 参加者として

TL;DR

  • オンライン開催楽しかった。Live配信で2トラックで流してくれたおかげで両方話が追えたのがすごい
  • 運営の皆さんお疲れ様でした。
  • スピーカーは話しているときに観衆の反応がわからないのですごい不安になってくる。

オンライン開催について

昨今のコロナウィルスの話に対応してオンライン開催になりました。 決定してから10日くらいで環境を用意したとのことでスタッフの皆さん非常にお疲れ様でした。

shizuoka.pycon.jp

発表内容

仕事でもお世話になっているデータ基盤環境について今回は発表しました。 ここ一年くらいの勉強の成果をまとめた感じです。 マネージドサービスの利用の進めと定型化(template化, framework化)が大事だよってのが伝えたかったことです。

speakerdeck.com

オンラインで話してみた感想

  • スピーカーは話しているときに観衆の反応がわからないのですごい不安になってくる。
    • 思っていた以上に自分が観客の反応をみながら話してたんだなってのが実感できました。
    • 実は 香港 とか 台湾 とか海外で話したとき以上に緊張しました。
    • Twiterで反応があったときはすごい嬉しかった。24motzさんのツイートが話してる側の癒やしでした。

  • 録画をみた感じだと配信がちゃんと成功していてすごい安心感がありました。スタッフの皆さんGJ
  • 緊張するとえーとかまーとかがふえて時間が伸びがちですね。
  • 実はオンライン用に3日くらい前に内容を練り直したので練習不足もたたって時間オーバーしてしまった。練習もっと増やせばよかった。

まとめ

現地に行かずに家から参加するのって初めてで予想がつかなかったんですが参加して本当に良かったなと思います。 実はオンラインで話すかを確認いただいたときにやるかどうか悩んでいたんですが、いまとなってはやってみて本当に良かったと思います。 良いチャレンジの機会になったかなと。なんども書いていますがスタッフのみなさんありがとうございました。

またリアルな場で開催するときには是非参加させてください。

react-static をTypeScriptで始める

React Staticでよく遊んでるのでいくつかTipsをまとめておこうと思います。 今日は React Static でTypeScriptを使うときのTipsをご紹介します。

react-static をTypeScriptで始める

CLIツールをglobalにインストールする

$ npm i -g react-static

or

$ yarn global add react-static

新しいプロジェクトを作る

$ react-static create

ちなみに npxコマンドからでもプロジェクトを作ることができます。 globaに入れなくて済むので、僕はこっちが好きです 😄

npx react-static create

or

npx react-static create --template typescript --name=my-static-site

実行方法

cd "my-static-site"

yarn start - Start the development server
yarn build - Build for production
yarn serve - Test a production build locally

さて

しかしこのまま yarn startしても実行時にエラーが出てうまく動きません(2019/07/09現在) templateで作成される yarn.lockに書いてあるreact-staticに不具合があるためです。

yarn upgrade-interactive

で最新版のreact-staticにアップグレードすれば起動できます.

一応修正をPRで送って無事取り込まれたので、次のreact-staticがリリースされるとこの辺の作業がいらないはず....

github.com

ま、ここだけ抜けちゃえばハマることはないはずなので、ぜひReact Staticで遊んでみてください!

Play Framework 2.7.x + EvolutionsでEvolutionsが動かなくなった時のTips

Play Frameworkのバージョンを 2.6から2.7に上げていてEvolutionsが動かなくなるパターンがあるので共有です。 限定的な条件なんですが、私はとてもハマったので次にハマった人のために情報を残しておこうと思います。 :sob:

TL;DR

  • Play Framework 2.6以下 + HTTP Request Handlersを拡張している + Evolutionsを使っている場合にEvolutionsが実行されなくなる
  • DefaultHttpRequestHandlerの書き方が変更になり2.6までのコンストラクターがDeprecatedになったのが原因
  • 2.7で追加されたコンストラクタを追加するように変更する必要がある

起こったこと

  • Play Framework 2.6以下 + HTTP Request Handlersを拡張している + Evolutionsを使っている場合にEvolutionsが実行されなくなる
    • 正確にいうとPlay Frameworkでローカルで開発用にDEVモードで実行した時に play_evolutionsテーブルが作られるが、 d.sql(dには数字が入る)が実行されなくなる

原因詳細

Play2.6で DefaultHttpRequestHandler を拡張していて、2.7に上げてビルドするとこんなwarningが出る。

19:50:51 [warn] /app/modules/CustomRequestHandler.scala:14:11: constructor DefaultHttpRequestHandler in class DefaultHttpRequestHandler is deprecated (since 2.7.0): Use the main DefaultHttpRequestHandler constructor 19:50:51 [warn] ) extends DefaultHttpRequestHandler(

www.playframework.com

www.playframework.com

抜粋して変更点をかくと

2.6

class VirtualHostRequestHandler @Inject() (errorHandler: HttpErrorHandler,
    configuration: HttpConfiguration, filters: HttpFilters,
    fooRouter: foo.Routes, barRouter: bar.Routes
  ) extends DefaultHttpRequestHandler(
    fooRouter, errorHandler, configuration, filters
  ) {

2.7

class VirtualHostRequestHandler @Inject() (
    webCommands: WebCommands,                // 2.7から追加されたもの
    optionalDevContext: OptionalDevContext,  // 2.7から追加されたもの
    errorHandler: HttpErrorHandler,
    configuration: HttpConfiguration, filters: HttpFilters,
    fooRouter: foo.Routes, barRouter: bar.Routes
  ) extends DefaultHttpRequestHandler(
    webCommands, optionalDevContext, fooRouter, errorHandler, configuration, filters
  ) {

この時2.6のドキュメントで触れられている方のコンストラクタを使うとこんなコードになる

playframework/HttpRequestHandler.scala at master · playframework/playframework · GitHub

  def this(router: Router, errorHandler: HttpErrorHandler, configuration: HttpConfiguration, filters: HttpFilters) = {
    this(new DefaultWebCommands, None, router, errorHandler, configuration, filters.filters)
  }

そう、この場合optionalDevContext がNoneになってしまう。

playframework/HttpRequestHandler.scala at master · playframework/playframework · GitHub

    // If we've got a BuildLink (i.e. if we're running in dev mode) then run the WebCommands.
    // The WebCommands will have a chance to intercept the request and override the result.
    // This is used by, for example, the evolutions code to present an evolutions UI to the
    // user when the access the web page through a browser.
    //
    // In prod mode this code will not be run.
    val webCommandResult: Option[Result] = optDevContext.flatMap { devContext: DevContext =>
      webCommands.handleWebCommand(request, devContext.buildLink, devContext.buildLink.projectPath)
    }

そう、この場合webCommandResultがNoneになってしまうのが原因でEvolutionsが起動しなくなっていました。 Evolutionsは Play FrameworkのWebCommandを使って実行されているため、影響を受けてしまったようです。 というわけで ここはdeprecatedなwarningが出ないように変更してやれば無事Evolutionsが実行されるようになります。

class VirtualHostRequestHandler @Inject() (
    webCommands: WebCommands,                // 2.7から追加されたもの
    optionalDevContext: OptionalDevContext,  // 2.7から追加されたもの
    errorHandler: HttpErrorHandler,
    configuration: HttpConfiguration, filters: HttpFilters,
    fooRouter: foo.Routes, barRouter: bar.Routes
  ) extends DefaultHttpRequestHandler(
    webCommands, optionalDevContext, fooRouter, errorHandler, configuration, filters
  ) {

気づいてしまえばすぐに直せるんですが、ちょっとわかりづらいですね。。Play Frameworkのバージョンを上げるとdeprecatedなwarningが出がちなのですが、きちんと確認した方がハマりどころをへらせそうですね。

さらに詳細

サンプル

github.com

pep572で遊ぶ そして mypyはまだ対応してないっぽい

Python3.8a0がリリースされましたね。

www.python.org

さっそく PEP 572 で遊んでみました。

TL;DR

  • PEP572をざっくり触った
  • mypyはまだPEP572に対応していない

ざっくり使い方

# current 
env_base = os.environ.get("PYTHONUSERBASE", None)
if env_base:
    return env_base

# Improved:

if env_base := os.environ.get("PYTHONUSERBASE", None):
    return env_base

こんな感じで ifとか while内で変数に格納しつつ条件をつけられるようになった感じです。

## Type Hintsの当て方

残念ながら現在のmypyバージョンでは pep 572に対応していません(泣)

将来的には対応するんじゃないかなーと思います。PEP-0526 ではこんな記述があります

Only single assignment targets and single right hand side values are allowed. In addition, one cannot annotate variables used in a for or with statement; they can be annotated ahead of time, in a similar manner to tuple unpacking:

a: int for a in my_iter: ...

予想ですが、以下のようにtype hintsがかけるようになる可能性があるかもです。

env_base : str
if env_base := os.environ.get("PYTHONUSERBASE", None):
    return env_base

PEP526の拡張がでるかもなので、もう少し調べてみます。 ひさびさに調べて結果がでなかったことをブログに書いたな....

自作キーボード入門ーErgo42 をつくった

2019年あけましておめでとうございます。 前から気になってた自作キーボード作成に挑んでみました。

ちなみに電子工作は高校の技術の授業以来でした。はんだづけがひさしぶりすぎてだいぶ苦戦しました。 軽くメモをのこしておきます。

モチベーション

https://ergodox-ez.com/

職場でErgoDoxを使っていて非常にまんぞくしています。 家とかカフェでも使いたいなーと思うんですが、ただコレを持って歩くのは割と重いし大きいしなんかいいのないかなーと ずっと思ってました。

自作キーボードの話は知っていたのですが、さすがにはんだ付けが必要って話を聞いていて二の足をふんでましたが、年末に時間があるなってことに気づいて思い切って始めてみました。

キーボードの選定

ergo42を選んでみた.キーキャップ選んだりするのが醍醐味だってのがわかりつつまずは1個つくってみたくてキーキャップなどが全部ついてるコンプリートキットを選んでみた。

booth.pm

ちなみにDSA White Keycap + Kailh Pro Burgundyを選びました。正直何を選ぶべきかよくわかんなくて上から一番目をえらびました。笑

組み立てるためにかったもの

キーボード自作、特に Helix キーボードキットの製作に最低必要な工具のメモ · GitHub

こちらを参考に色々買いました。必須って書かれてるものはほんとちゃんと買うといいと思います。 追加で買ったコテ先は使いやすかったです、腕と経験はもので補えるんだなってことを痛感しました。 あとリードベンダー-は作業しててまじでほしくなりました。

組み立て方

qiita.com

色んな人が書いてくれてますがこちらのページを参考にしました。 はんだ付けは高校の授業以来なんで大分苦戦しました。テスターの使い方も説明書をちゃんと読まないとわかんなくてほんと大変だったんですが、 その分キーボードが動いてくれたときの感動はひとしおでしたね。

現在のキーボード配置

ErogoDoxにくらべてキー数が減った分スゴく悩んでます。

    /* BASE
   * ,------------------------------------------------.   ,------------------------------------------------.
   * | ESC  |  `   |   Q  |   W  |   E  |   R  |  T   |   |  Y   |   U  |   I  |   O  |   P  |   [  |   ]  |
   * |------+------+------+------+------+------+------|   |-------------+------+------+------+------+------|
   * | META | LCtrl|   A  |   S  |   D  |   F  |  G   |   |  H   |   J  |   K  |   L  |   ;  |   '  |   \  |
   * |------+------+------+------+------+------+------|   |------|------+------+------+------+------+------|
   * | SYMB | LSft |   Z  |   X  |   C  |   V  |  B   |   |  N   |   M  |   ,  |   .  |   /  |  UP  | RSft |
   * |------+------+------+------+------+------+------|   |------+------+------+------+------+------+------|
   * | LGUI | TAB  |      |      | LAlt | RAlt | Bksp |   |Space |Enter |   -  |   =  | LEFT | DOWN | RIGHT|
   * `----------------

ちなみに僕が欲しいなーと思ってると配列は以下のような感じで日々設定を書き換えてる感じです。 - 右手の親指でスペース、エンターキーを叩きたい - 左手の親指でバックスペースキーを叩きたい - LAltで英語、RAltで日本語を入力できるようにしたい。(コレは英字キーボードで僕がよくやる設定)

,まとめ

作るときは大変だったんですが、組み上げて動いてみてくれると本当にウレシイもんですね。 正直できあがりは割とキーの高さが不揃いだったりで正直あんまりきれいじゃないんですが、使ってみるとそれがまたかわいいですね。

ほんとたのしいんでみんなぜひ一度手を出して欲しいなーと思ってます。

参考

qiita.com

kuenishi.hatenadiary.jp テスターでどのモードで確認するかとかはこちらで学ばせてもらいました。