Lambdaカクテル

京都在住Webエンジニアの日記です

技術

Shapelessの勉強(その2)

Shapelessの勉強をしていて、これは2日目の備忘録。教科書は、The Type Astronaut’s Guide to Shapeless。 1日目はこれ blog.3qe.us 前回は、Chapter 2まで進み、GenericとHList、Coproductについて学んだ。 復習 Shapelessが用意している型クラスのイディオ…

Catsを使ってReader関手・Reader Applicative関手を勉強したよ

先日、Haskellで書かれたおもしろFizzBuzzの事を思い出した。読んだときはよく分からなかったけれど、型クラスへの理解が進んで、結構意味が分かるようになりつつある。そこで、それにまつわる要素をちゃんと勉強することにした。勉強といってもCatsでの使い…

Shapelessの勉強(その1)

ScalaにはShapelessというジェネリックプログラミングを推進するためのライブラリがあって、同じ型の構造を持つCase Class間を変換するといった操作ができるのだけれど、あまり詳しいことは知らなかったので、公式のガイドブックを読んで勉強することにした…

ScalaのCatsのAlternativeチョットワカル

Scalaの関数型ライブラリ(?)であるCatsには色々な型クラスが実装されていて、だいたい良く使うのはMonoidとかMonoidKとかApplicativeとかなんだけど、その昔関数型FizzBuzzのことを考えていたときにAlternativeが使われていて、そのことがずっと気になって…

Noneは空文字に写したい、そんな君のためにcombineAllがある

Scalaをやっていて、val x: Option[String] = Noneを""に写したいことが100万回くらいある。しかしx.getOrElse("")と書くのは納得いかない、という状況になっていた。 なぜかというと、Stringはモノイドだし、モノイドには空要素emptyがあるはずで、Option[A…

sshuttleのssh.pyは、いかにしてssh先で起動したpythonとの双方向通信を確立するか

仕事ではテレワーク環境を作るためにsshuttleを使っているのだけれど、中身はあまり読み込んでいないので、勉強のためにちょっと中身を読んでみたところ勉強になる箇所を見付けたのでメモ。 ssh.py sshuttleは、踏み台となるホストに対してsshセッションを張…

○ー○ー○○ー○ー○ーに当てはまる言葉をWikipediaから探してくるツールを自作した

anond.hatelabo.jp 特定のリズムにあてはまる日本語を頑張って探したくなることがたまにある。そして、定期的に↑のような記事が流行っては、仕事が手につかなくなる!このままでは、○ー○ー○○ー○ー○ーを考える時間によって日本のGDPが押し下げられてしまう。 …

変数名に🤔絵文字💀を使いたい🤓

プログラミングをしていると、この変数はOptionだから、時としてNoneであるよ、と名前で表現したくなることがしばしばある。型システムが強力なので勝手にOptionであることはマウスをかざせば分かるけれど、一瞥して分かるほうが読む側としてはありがたいは…

ScalaTestでテーブルテストをやりたかったらforAllを使うといいぞ

こういう感じで書けます。 import org.scalatest.prop.TableDrivenPropertyChecks import org.scalatest.funspec.AnyFunSpec // 必要なのは TableDrivenPropertyChecks なので、あとは好きなstyleを選んでよい class FooSpec extends AnyFunSpec with TableD…

無名クラス中でそれ自身の型を表現するにはthis.typeと書く

無名クラスのunapplyを書きたかった。 val foo = new { // ... def unapply(it: /* ここに自分自身の型 */) = Some(...) } でもこういうときって自分自身の型をどう表現すればよいの!?と思って職場でうなっていたところ、 id:tarao さんが助けてくれた。解…

TmuxでGitHubのStatusを確認できるプラグインを作った

GitHubのステータスAPIを叩いた情報がTmuxに表示される たまにGitHub Actionsの様子がおかしいな〜と思ってGitHub Statusを見に行くとトラブルが発生していたりする。こういう情報にすぐ気付きたいな〜と思ったので、Tmuxのステータスバーに勝手にGitHubのス…

Scala+Sangria+Akkaで書かれたGraphQLのsubscription実装が面白いので分かった範囲で紹介する

しょうもなグラムというパロディSNSを作っている。キラキラした投稿ではなく、しょうもない投稿を褒め称えていくというコンセプトのSNSで、「いいね」ボタンの代わりに「しょうもな」ボタンがある。ハートマークではなく、ウンコのマークになっている。 まあ…

Rustでnpm watchっぽいことをやるにはcargo-watchが便利

npmにはwatchする文化があって、ファイル変更を検知して自動ビルドなどを走らせたりできる。 www.npmjs.com Rustにも似たような機能が欲しい。というのも、趣味でWebアプリケーションを書いているので、コードの修正を検知して勝手にサーバを再起動させたい…

anyenvからasdfに移行する

anyenvをこれまで使ってきたけど遅いという問題があって、試しに最近流行ってそうなasdfを使ってみることにした。 github.com ところでasdfはCommon Lispのビルドツールと名前が丸被りしていて、それだけ気に入らない。(リポジトリ上ではasdf-vmという名前に…

機能をリリースするときはいくつかのモジュールに分けてリリースしていくと良い

というのは一見当然なのだけれど、いつも意識しておくと良いと思ったのでメモだけする。定期的に、やっぱり分割リリースできるとありがたい、という気持ちになる。 いくつかのリリース可能なモジュールに分割する でかい機能を一気にリリースしようとすると…

Egrepって何?BSDとの互換性は?兄弟はいるの?調べてみました!

今まであまり知らずに使ってきたけれど、egrepはgrep -Eのエイリアスだった。 $ man egrep (なんとgrepのmanが表示される) (snip) In addition, the variant programs egrep, fgrep and rgrep are the same as grep -E, grep -F, and grep -r, respectively.…

業務用マシンがモッサリしていたけど省電力設定になっていたっぽい

業務マシンはけっこう良いやつを使っているのだけれど、どことなくブラウザの動作がモッサリして気になっていた。 もしかして省電力になっているのではないかと突然思い、様子を見てみると省電力設定になっていた。 $ cat /sys/devices/system/cpu/cpu0/cpuf…

考える事が多そうなときは、スコープを切って考える事を減らすというテクニックを活用している

例えばソフトウェアを開発していて、大きな1つの機能を開発しているとする。3つマイルストーンがあって、それらを全て達成したら無事リリース完了だとする。 こういったとき、よくやってしまいがちなのが、3つのマイルストーンの全ての解像度を上げてうまく…

返り値がBooleanのとき、Type Aliasすると分かりやすくなって便利

普段Booleanを返すメソッドというとisFooBar()という名前になっているからどういう挙動をしているか一目瞭然なのだけれど、たまに副作用の結果をBooleanで返すメソッドがある。 def isEmpty(): Boolean = { ... } // 一目瞭然 def createFooBar(): Boolean =…

技術ブログの記事で「はじめに」とか書かなくて良いかもしれない

なぜかというと、記事を読みたい人は大別して2つのルートでやってくると思っているから。 検索してやってくる ブログの更新とかTwitterに流れた「書きました」といったツイートを辿ってくる 前者はこういう情報を知りたいという気持ちが既にあるはずなので、…

AWS IoT Buttonで勤怠付けるためのコードをGoでリライトした

自分は元々IoTボタンを使って勤怠を付けていたのだけれど、Goの練習がしたかったのでRubyコードをGoでリライトした。ちなみにコード量は(ボイラープレート的記述によって)増えた。とはいえ分かりやすさはほぼ変わっていないし、型がつく安心感がある。 うち…

ada1p1みたいな形式でzpoolにattachしたディスクをgptラベルで再認識させるのは不可能っぽい

tl;dr zpoolにraidz1のvdevがぶらさがっている状況下で、そのvdevにada1p1といった形式でattachされているディスクがある GPTパーティションラベルのほうが分かりやすいので、gpt/foobarとして「貼り替え」を行いたい replaceでできるかと思ったが不可能だっ…

Eitherを使ったSpecificationパターンで遊ぶ + 仕様を通過するたびに型が弱まっていくのはどうか

DDDにSpecificationパターンというのがある。仕様をドメインモデルから切り離して、単独で扱えるようにしましょう、というもの。 素朴にScalaで実装すると…… trait Spec[A] { def isSatisfiedBy(a: A): Boolean } こうなる。具体的にSpecを実装してみると、…

Scastie(ScalaのオンラインIDEみたいなやつ)をセルフホスティングする

Scalaユーザの間ではよく知られた存在であるScastieはOSSで、自分でソースをクローンしてくると手元で動かすことができる。自宅サーバで動かすことができないか試してみたところ割とあっさり動いたので手順のメモ。 Scastie 手元で動かす Docker環境下で動か…

仕様や要件聞いているときに手元でER図を描いたりしている

「こういう機能作りたいんですけど」みたいな会話をするとき、理解した内容で手元のノートにER図を描いていたらコーナーケースの仕様漏れを発見できたりして有用だった。 このあいだ新機能の話をプランナたちとしていて、普段だったらフムフムと一通り聞いた…

Github Actionsで他のリポジトリのIssueにコメントを残すにはOrganizationレベルのPersonal Access Tokenが必要になる

やりたいこと GithubのPull-Reqに特定のラベルをつけたとき、別のリポジトリにあるIssueにその旨コメントしたい。 前提知識 我らがチームでは、Pull-Request機能を使って、stagingブランチからmasterまたはmainブランチにマージすることでリリースフローが回…

FreeBSDのZFSファイルサーバ再インストールRTAはーじまーるよー

キッチンに乱雑に置かれているサーバ この記事は「はてなエンジニア Advent Calendar 2021」の13日目の記事です。 qiita.com 昨日は id:papix の 『Perlで @EXPORT を @EXPORT_OK に置き換える』でした。 papix.hatenablog.com 目次 目次 時に、2021年の師走の…

ソート 大なり 小なり 記号 ascendant descendant どっち 一瞬で覚える方法

ソートするときの記号の方向が覚えられないという悩みがある。 多くの言語では、比較演算子を使ってコレクションをソートする操作が定義されている。 // scalaだと... val lis = Seq(...) // なんかのリスト lis.sortWith((a, b) => a < b) // 昇順ってどっ…

GitHub ActionsからAWS使うときはアクセスキーIDをそのままシークレット名に含めるとよさそう

tl;dr MY_TEAM_AWS_${ACCOUNT_NAME}_${IAM}_AKIAXXXXXXXX みたいなシークレット名にしましょうという話です 本編 自分のチームではJenkinsからGitHub Actions(GHA)への脱出を継続的にやっている。プロダクトに歴史があるからJenkinsがいろいろな所で使われて…

const関数おもしろい(そしてアプリカティブファンクタへ……)

最近型クラスとかを勉強しているのだけれど、その中でconst関数というのを見て感心した。 yomi322.hateblo.jp const Haskellだと以下の通りに書く: const x _ = x Scala風に書く(ここからはScalaで書いていく)と以下の通りに書く: def const[A, B](x: A) =…

Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?