Runner in the High

技術のことをかくこころみ

メモ

フロントエンドとしての/サーバーサイドとしての"フルスタック"さ

最近思うがなんとなくフルスタックと一口に言っても、ソフトウェアエンジニアにおける"フルスタック"にはサーバーサイドとしてのフルスタックと、フロントエンドとしてのフルスタックがあるような気がしている。この言い方が妥当かどうかは分からない。 サー…

makeのlengthとcapacityについて、それからbytes.Bufferのアロケーション処理速度について

izumisy.work 上記の記事をstackoverflowで質問したら回答がついた。 stackoverflow.com 結論から言うと自分はmakeの使い方を間違えていて、makeの第3引数にあたるcapacityを省略してスライスを作成するとそこには空データが埋まってしまうとのこと。 なので…

リテラル値でmakeしたらヒープに乗らなくてアロケーションの回数は少なくなるんじゃないか?という実験

goコンパイラの最適化によって、可変長配列であってもリテラル値でlength指定されていればコンパイルする時点で確保するデータサイズが決定し結果的にランタイム時にアロケーションを発生させなくなるのではないかという仮説。 テストコード package app imp…

io.Readerで先頭Nバイトを読み捨てる

package main import ( "io" "io/ioutil" "strings" "os" ) func main() { a := strings.NewReader("123456789") r := io.LimitReader(a, 5) t := io.TeeReader(r, ioutil.Discard) io.ReadAll(t) io.Copy(os.Stdout, a) // 6789 }

ioutil.Discardとio.CopyNでメモリアロケーションせずデータサイズを判定する

ioutil パッケージに Discard という /dev/null 的な io.Writer が用意されている。 最近これを使うタイミングがあったのでメモ。以下のようなコードがあるとする。 package main import ( "fmt" "io" "io/ioutil" "strings" ) func main() { a := strings.N…

deferで参照している変数のポインタを更新しても参照は変わらないっぽい

こういうやつ type Closer struct{ Value string } func (c *Closer) Close(id string) { fmt.Printf("Closed(%s): %p\n", id, c) } func newCloser(c *Closer) { n := &Closer{Value: "aaa"} fmt.Printf("New: %p\n", n) c = n } func main() { c := &Close…

BlueoothドングルTP-Link UB400をUbuntuで使う

これを買った TP-Link Bluetooth USBアダプタ ブルートゥース子機 PC用/ナノサイズ / Ver4.0 / 3年保証 UB400TP-LINKAmazon デバイス情報を見てみるとどうやら Cambridge Silicon Radio とかいうやつらしい。 at 15:26:52 ❯ lsusb Bus 005 Device 001: ID 1d…

フロントエンドアプリケーションにおいて状態をどこに置くべきか論

後学のために自分の考えていることをまとめてみる。 考えられるパターン これまでの経験から以下4つのパターンがある。 ローカルStateでprop-drillingする ローカルStateかつイベント経由でデータ交換をする グローバルStoreとローカルStateを併用する グロ…

Elmにおける比較処理の高速化テクニック

ここで触れられてた話がおもしろいかったのでざっくり紹介 discourse.elm-lang.org 文字列比較はcase文のほうが早い(ことがある) これは遅い ensureNonBreakingSpace : Char -> Char ensureNonBreakingSpace char = if char == ' ' then nonBreakingSpace …

ScalaではIntとStringを比較してもコンパイルエラーにならない

社内で以下のScalaコードがコンパイルエラーにならないというのが盛り上がっていた。 println(1 == "a") // コンパイル通るし結果はfalseになる 普段ElmとGoばっかり書いている&Scalaのことをとりあえず型に厳しい言語だと思いこんでいたこともあり若干意外…

J:COM船橋で2/17から通信障害があったらしい

J:COMから現時点で正式なアナウンスはなにもないが、どうやら千葉県船橋市内一帯で2/17から2/20にかけて通信障害が発生していたらしい。 この障害の影響で、上り速度が1Mbps以下しかでない日が3日間ほど続いた。症状としては上り回線の輻輳状態のような感じ…

官僚制とマイクロサービス

現代では官僚制というとなんだか政治的でネガティブな面ばかりが取り沙汰されている面があるが、実際には業務の効率化という観点では、近代的な合理性を追求する優れたモデルである。 官僚制にはネガティブな面はあるものの、組織としてスケーラビリティを維…

mercari/datastoreがDistinctOnメソッドをサポートした

先日PRを出していたものがマージされた。 github.com GCP DatastoreのDistinctOnは履歴系テーブルを触るときに便利で、例えばチームごとのログイン履歴を保持するLoginHistoryというカインドに対して「全チームの最新のログイン履歴を取得する」というクエリ…

2020年末Rustlang環境構築

以下をやるだけ # インストール&初期セットアップ $ brew install rustup rust-analyzer $ rustup-init $ rustup update # プロジェクト作成 $ mkdir your_own_rust_project $ cd your_own_rust_project $ cargo init --vcs git --bin # rust-analyzerを使…

ElmでサードパーティーなUI系モジュールを使う際にはTEAを前提にしたインターフェースでラップする

Elm Packagesで公開されているモジュールの中にはTEAでいうところのviewやmodelしか提供されていないものがあったりする。 これがコレクション系モジュールだとか関数単位での機能提供が目的のモジュールであればまだ問題ないが、UIを提供するタイプのモジュ…

メルカリでiMac 21inchを売るときのあれこれ(発送とか初期化とか)

先日2019年モデルのiMac 21inchをメルカリで売った。 下取りとか買取で調べると6-7万くらいで買い叩かれる&一度発送しての査定なのでかなり不安(送ったら1000円とかにされたりするかもしれないし)だが、メルカリであれば先に値段が決まるので嬉しい。 手数…

Ubuntu 20.04でUSBのWiFiアダプタ(WDC-300SU2SBK)を認識させる方法

インターネットで調べたところ、どうやらUbuntuがサポートするrtl8192cuというチップとして認識させれば動くとのこと。 エレコム Wi-Fi 無線LAN 子機 300Mbps 11n/g/b 2.4GHz専用 USB2.0 コンパクトモデル ブラック WDC-300SU2SBK発売日: 2014/05/11メディア…

BigQueryのDATE関数とタイムゾーン周りの挙動

よく分からんところがあるので整理した。 SELECT date("2020-7-1T23:59:59+0900", "Asia/Tokyo") as tzDateWithTzString, date("2020-7-1T23:59:59", "Asia/Tokyo") as dateWithTzString, date("2020-7-1T23:59:59+0900") as tzDate, date("2020-7-1T23:59:5…

vim-lspでElm用のVim環境を構築する

ElmCast/elm-vimをやめてvim-lspとasyncompleteを使ってelm-language-serverに対応したVim環境を整えたのでメモ。 github.com プラグイン導入 vim-plugでvim-lspとasyncomplete系のプラグインを一気に導入する。すでに導入していれば不要。 Plug 'prabirshre…

開発チームの振り返りタイミングのパターン

考えることがあったので雑にメモ。 1. 毎週末(木曜日or金曜日) 最も一般的なパターン。木曜日ないし金曜日にその1週間を振り返る。 1スプリントを1weekと置いていれば毎週何らかの成果物があるはずなので、それに対する振り返りがこの時間にあたる。 毎週3…

shelm: 脱法Elmパッケージマネージャー

elm/core などのカーネルモジュールにバグがあるとき、公式のバグ修正を待っていられないことがある。物によってはアプリケーションの動作に大きな影響があったりして早急な修正が必要になる場合もある。 そのような場合にはshelmを使うことで、自分たちで野…

Fitbit Charge 4でSpotifyアプリ連携がインストールできない場合の対処法

Fitbit Charge 4を買った Fitbit Charge4 GPS搭載フィットネストラッカー Black/Black L/Sサイズ [日本正規品] FB417BKBK-FRCJK発売日: 2020/04/14メディア: エレクトロニクス Spotify連携が利用できない Charge 4には、Bluetoothで接続している端末と連携し…

nvmやrbenvを遅延ロードさせる

nodeとかrubyとか特定のコマンドを使うときまでバージョンマネージャのローディングが遅延できたらなー思って調べてみたら、alias/unaliasを用いて遅延ロードっぽいことをやるテクニックを知った。 例えばnvmは以下のようにnodeやnpmなどのようなコマンドが…

Intellij IDEAのVMオプションとVSCodeの設定をイジってフリーズを減らす

去年末にお金をケチって買ったiMac 2019(Core i3 3.6 GHz, 8GB)でIntellij IDEAとVSCodeを起動していると、文字の入力もできないくらいレインボークルクルが頻発して仕事どころじゃないことがここの所よくあった。 数年前に買ったThinkCentreで動かしているU…

gcloudコマンドでGAEアプリケーションデプロイ時に指定できるバージョン名には使える文字種に制限がある。

gcloud app deploy コマンドを使ってGAEアプリケーションをデプロイする際には--versionというオプションを使うことでバージョン名を自分で指定できるので、ブランチ名とかIDとかをバージョンとして出したくなる。 しかし、試しにブランチ名を含めてバージョ…

Elmのモジュール分割における区分軸の観点

Elmアプリケーションにおいてモジュールを作る際に、モジュールへ機能をどう凝集させるかに関して。 機能による区分 かつてElmにおいて一般的だった分割方針。グレーの部分がひとつのモジュールを表している。 ModelとUpdate, Viewなどをすべて別のモジュー…

iHerbでよく買うもの

過去に書いたこの記事を思い出したので、久しぶりに同じような記事を書くことにした。 izumisy.work 前提として自分はそんなにガチなトレーニーでもなんでもなく、どちらかといえば自分の健康増進のために筋力トレーニングをしたりサプリメントを摂取したり…

ZIOによるDIの最小サンプル

公式のドキュメントや他の人の書いたブログ記事を読みつつ書いてみたのでメモ。 zio.dev import zio.{IO, RIO, Runtime, Task, UIO, URIO, ZIO} // Userリポジトリのインタフェース case class User(name: String) object UserRepo { trait Service { def lo…

実装と処理の分離でfor-comprehensionを使う

前回の記事の続きです izumisy.work 前の記事だと継続渡しのスタイルで処理を表現していたが、継続渡しだとシンプルにインデントがどんどん深くなっていくという微妙な点がある。 Scalaにはfor文というのが用意されているので、継続渡しスタイルよりもfor文…

継続渡しスタイルを用いた実装と処理の分離

ほぼZIOのbackgroundセクションにあるサンプルそのものだが、備忘録的に残しておく zio.dev いわゆるfor-comprehensionを使わずに、Applicationをミクスインした各ADTがそれぞれrestという名前で次の処理をコールバックとして取る実装(継続渡しスタイル)に…