サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
iPhone 16
mizunashi-mana.github.io
Twitter から Mastodon に移住して一ヶ月ほど経ち、あんまり Twitter に戻る気がなくなってきた。せっかくなので、備忘録と案内を兼ねて、Mastodon への移住経緯とその後のことや、いろいろ感想などをまとめておこうと思う。とりあえず、一言で言うと Twitter には多分戻らんと思うのでよろしくという感じ。 Mastodon への移住 正直きっかけは今でもよく分からない。2023/01/30 に毎度ながら Twitter を開いて TL を見てたんだが、ふと寂しさを覚えた。割と、流速は速かったと思うので人がいなかったわけでも無さそう。そもそも「フォロー中」のタブが増えてから、割と Twitter で寂しさを覚えることは多かった。凍結騒動で色んな人が凍結され Mastodon に行ったみたいなことも聞いていたので、なんかあまり「フォロー中」のタブの人口がいないことが原因
何番煎じか分からないが、個人的に詰まったので備忘録。JDK には、暗号用の乱数生成器 SecureRandom クラスが用意されている。そして、このクラスには、 getInstanceStrong というメソッドが用意されている。この名前はいかにも強そうで、基本的にはこのメソッドを使っていれば安全そうに見える。ところが、このメソッドは何も考えずに使うと思わぬ落とし穴にハマることになる。今回はその話をする。 突然フリーズするサーバ アリスはボブに頼まれ、単純なデータベースへの読み書きを担当する API サーバを作ることになった。読み書きするデータは機密性の高いもので、万が一にも漏洩するのは良くないし、生データに触れるのも制限された人のみにすべきで、それはアリスに対しても開示できないものなので、データベースに保存するデータは全てサーバ側で書き込み側から鍵を受け取って暗号化してから保存することに
前に PEG パーサジェネレータライブラリ ptera を作っているという話をしたが,今回はその第二弾.ptera で Haskell2010 の文法パーサを例に追加してみたんだが,その過程で色々あったのでその備忘録. 結論から言うと,ptera に前回から以下の拡張を加えた. 先読みを強化し,もうちょっとちゃんと機能するように 文脈依存でパースができるようにした 後は,Template Haskell で文法書けるようにしたりもしたが,まあそれはいいでしょ. Haskell2010 と ptera ptera でひとまず Template Haskell で文法が書けるフロントエンド部分作った後,Haskell 2010 ぐらいパースできないと使い物にならないなあと言う感じで Haskell の example project 書いてみたんだが,ここで色々つまづいてしまった.主に今回説明
最近 PEG パーサジェネレータライブラリを作っているんだが,一旦区切りがついたので忘れないうちに備忘録をまとめておく. さて,PEG は曖昧さが存在しない言語を定義する為の文法だ.基本的には文法自体は結構単純で書きやすい.構文解析も単純ではある.ただ,愚直に構文解析すると入力の長さに対して指数時間かかってしまうため,取り扱いが少し難しい.ただ,入力の長さ分のメモリを用意することで,解析時間を入力の長さに対して線形時間にする packrat parsing という手法が提案され,最近では PEG をプログラミング言語の文法の定義方法として採用する言語も増えているようだ. PEG の魅力はなんといっても曖昧さを排除できる点と,文法程度を簡潔にできる点だろう.ただ,あまりいい感じのパーサ生成ライブラリがない場合も多い.Haskell にもあんまりいい感じのがなかった.なので今回は,PEG の勉
パッチファイルの形式にはいくつかあるわけだが, git の diff で使われている形式について,ちょっと調べたのでそのメモ. diff 形式 diff コマンドが吐き出す形式は色々ある.主に以下のものがあるらしい [1] : 通常の形式 差分部分だけを表示する, diff のデフォルトの表示形式 コンテキスト形式 差分部分周辺も含めて,どういう風に変わったかが分かるようになっている,表示形式 side by side 形式 2列で差分を表示する形式 スクリプト形式 ed コマンドなどでそのまま実行すれば,差分を適用できる形式 if-then-else 形式 CPP のマクロで,両方を切り替えられるようにした形式.差分部分を #ifdef で囲って出してくれ,指定したマクロ変数を定義すると古いのに切り替えられる. 色々あるけど,パッチを送信する際よく使用されるのは,プレーンテキストでも差分
Unicode は、文字コードの標準を目指して創設された規格であり、文字をどう処理するか、テキストデータとしてどう表すかを規定している。今や国際的に普及した規格で、特に Unicode が規定する符号化方式 UTF-8 は、いまやテキストデータのエンコーディングデファクト標準となっている。 Unicode は歴史的経緯からサロゲートコードポイントという仕様を包含している。今回は、この仕様の紹介と、UTF-8 を使う際の注意点を見ていく。なお, Unicode 13.0.0: https://www.unicode.org/versions/Unicode13.0.0/ を元にしていく. Unicode と固定長の夢 当初、Unicode は ASC-II の固定長 7bit 表現に倣い、固定長 16bit で世界中の文字を表現する規格として提案された。当時の提案 [1] では、 In th
Prometheus は、メトリクスの監視を行うためのモニタリングツールだ。各種メトリクスを出す exporter とそれを集計する Prometheus サーバ、及びその集計結果を監視しアラートを出すアラートマネージャで主に構成されている。Prometheus それ自体は便利なんだが、Kubernetes クラスタを監視したい場合色々追加で設定が必要で、結構めんどくさい。そこで、Kubernetes 用に Prometheus をカスタマイズして提供してくれるパッケージがいくつか出ている。今回はそのうちの Prometheus Operator を触る機会があって、せっかくなので使い方を備忘録として残しておく。 Prometheus Operator のインストール まずは、Kubernetes / helm が入った環境用意する。一応、Kubernetes のバックエンドは今回は Do
クロスプラットフォームのエラー監視を行う Sentry というサービスがある.ブログに試しに導入してみたので,それについて書く. Sentry について Sentry は,提供されている SDK を PHP コードや JavaScript コードに埋め込むことで,エラーを Sentry に送り,管理画面から確認できるようにするサービスだ.コードが https://github.com/getsentry/sentry で公開されていて,オンプレでも動かせる. https://sentry.io/ にデプロイされていて,今回はそれを使っている. 例えば JavaScript でエラーが取れると,以下のような情報が見れる [1]: 管理画面ではエラーを共有したり,コメントをつけたり,似たエラーを見れたり,色々充実してる.今回は使用していないが,ユーザーにフィードバックを求めるダイアログを表示し
Haskell には型クラスと呼ばれる重要な機能がある.これは名前の通り,型をクラス分けするための機能で,その型に対してある操作が構成できることをその型の性質とみなし,性質に名前がつけられる機能だ.この機能は,アドホック多相,つまりは型による静的なオーバーロードを実現する仕組みとしての側面もある.型クラスに対しては,型ごとにそのインスタンス,つまり操作の実装を与えることができ,ある型がある型クラスに所属していることを型注釈で表明することができる.その表明は,コンパイラによるインスタンスの自動検索で解決され,解決できなかった場合は型エラーになる. さて,型クラスの仕組みは coherence という,かなり強い性質を要求する.今回は,この coherence がどういう役割を持つかを,Haskell を例に見ていく.また,orphan インスタンスと呼ばれる特殊なインスタンスと cohere
先日、Haskell 界隈で遅延評価によってデバッグがし辛いのはどんな時かと言う話があった。見た感じ、遅延評価によってデバッグのしにくさはそんなに変わらないと言う意見が結構あり、個人的には衝撃だった。僕自身は遅延評価にだいぶヘイトを溜めてる人なので、どういう状況でデフォルト遅延評価が嫌かを実感できる問題を作った。この問題を解けば、きっとヘイトを共有できるはずってわけ。一緒に地獄に落ちような。 なお、かなり主観に寄っていて、結構書き殴ってる部分が多いので、厳密な議論をするにはあまり良い例ではないかもしれない。個人的には、備忘録的な意味合いも強くて、今まで詰まったやつをまとめておくかみたいな感じでもある。 先に結論を書いておくと、 プログラム自体が大きくて [1] 複雑な制御構造をしていて (optional) 以下のいずれかの条件を満たす 遅延評価を機能として使っている デバッグ対象が効率に
注意 この記事は公開当時主張に誤りを含んでいたため,大幅に書き直しています.また,公開当時の主張の誤りについても,付録として載せておきました. Haskell で State モナドはモナドの代表格だ.Haskell 入門者は,多くの場合,状態を伴った計算を State モナドで書くことを習うだろう.しかし,実用上の多くの場面では,State モナドではなく他の選択肢を選んだ方がいい場合がある.一つの選択肢が,Reader モナドと可変参照を使う方法だ.今回は,この手法を使う利点と利用場面について考えていこうと思う. なお,環境として以下を想定している.
Debian GNU/Linux 10 ,コードネーム buster が安定板リリースを迎え結構経ったので,そろそろアップグレード案件やるかみたいな感じになった. さて, buster からは iptables に代わり nftables が採用されている.なので, iptables から nftables に移行が推奨されている.で,既存の iptables のルールセットを nftables 用に書き直したので,その備忘録. なお,参考文献は以下だが,こちとらインフラは素人の普段はプログラマ屋さんなので結構間違ってるかもしれない. https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes https://wiki.archlinux.jp/index.php/Nfta
今回は,GHC拡張の一つ RankNTypes の紹介をしようと思う.もうちょっとちゃんとまとめたのをいつか Haskell-jp かどっかに投稿したいと思ってるんだが,時間が (さっさと書け). さて, Haskell のプログラミングにおいて多相関数はかなり重要な役割を持つ.しかしながら,標準の範囲では多相関数自体を第一級の値として扱うことはできない.私たちに許されるのは,多相関数を定義することだけだ.まあ,それだけでもかなり有用なんだけど,多相関数を第一級で扱えると,色々プログラミングの幅が広がる.今回は,多相関数を第一級として扱うというのはどういうことか,そしてそれをするにはどうすればいいか,そうすることで何がうれしいのかを簡単に触れられたらと思っている. 多相関数を第一級で扱うとはどういうことか (パラメトリック)多相関数 ((parametric) polymorphic fu
元ネタは Trees that grow . Haskell では代数的データ型 (ADT) を使ってプログミングに使うデータ構造を定義し,その構造を操作することによりプログラミングを行う. ADT はパターンマッチが容易で,再帰的に定義でき,基本的に閉じた構造になっている.そのため便利な反面,その機能が保守で仇となる場合もある.この問題は古くから知られており,いくつかの解決策も提案されてきた.今回はこのうち,現在 GHC で採用されつつある type family を使った解決方法を紹介する. なお,環境として以下を想定している. The Expression Problemプログラミング,特に Haskell を使用したプログラミングにおいて,データ型は非常に重要な役割を持つ.特に,一部のプログラムにおいては,根幹をなすデータ型がいくつか存在するような場合もある.この場合データ型の扱い
Haskell はいくつかのリテラルで型クラスを使用したオーバーロードを許容している.例えば,Haskell で 1 と書いた場合,この型は 1 :: Num a => a になり, Num のインスタンスを定義することで,リテラルに対する実体をユーザも制御できるようになっている.GHC拡張で文字列に対してのオーバーロードなども提供されている.ただ,提供するデータ型とリテラルによっては,プログラムが意図通りに動かなかったりクラッシュしてしまったりすることがある.これを事前にチェックする仕組みを,コンパイラプラグインで実装する方法を紹介する. なお,環境として以下を想定している. Haskell のオーバーロードリテラルHaskell では整数及び浮動小数点数リテラルにおいて,オーバーロードが許容されている.それぞれ, 整数リテラル: Num のインスタンス 浮動小数点数リテラル: Frac
現在, GHC に 線形型の提案 がされていて活発に議論されている.プロトタイプも ここ から利用可能だ. Docker イメージも利用可能なので,気軽に試せると思うので,ぜひ試してみてくれ. さて,そんな線形型の提案の裏で,副産物として Local Do という拡張が提案されている.今回は,その拡張の紹介と最近思ってることのお話. Local Do 拡張 Haskell の do 構文は,ご存知の通りモナドのメソッドを使った式を手続き型ライクに書ける構文だ: この構文は次の Prelude にある定義を想定している [1]: class Applicative m => Monad m where (>>=) :: m a -> (a -> m b) -> m b class Monad m => MonadFail m where fail :: String -> m a (>>)
GHC は,最適化のため Call Arity と呼ばれるコード解析を行っている.この解析で,自由変数が何個引数を持っていいかを判定し,イータ展開を可能にする.リストにおける融合変換とも密接な関係のある解析だ.こいつの存在とどういうことをやっているかはだいたい知っていたんだけど,ちょっと詳しく知りたい事例があったので調べてみた.そのメモ. なお元ネタは,Breitner (nomeata) 先生の Call Arity . イータ展開と最適化 Haskell は知っての通り関数型プログラミング言語なので,息を吐くように関数を第1級として使うし,標準ライブラリに無数の高階関数がある.関数は全てカリー化されていて,部分適用も可能だ.ただ困ったことに Haskell は実用されており,これらの関数型プログラミング言語で常用されているテクニックで書かれたプログラムで,通常のプログラミング言語程度と
最近, (特に境界条件を伴った) 多相関数が言語ごとにどういうコードを吐くかが気になったので, Haskell とコードの生成方針が異なるという噂の Rust を見てみることにした.その覚え書き.なお, Rust 普段使いではないので間違ってるかもしれないのと,情報が古いかもしれない. https://rust-lang.github.io/rustc-guide/about-this-guide.html が主な参考文献.使った rustc は, rustc: 1.37.0-nightly (4edff843d 2019-06-16) cargo: 1.37.0-nightly (545f35425 2019-05-23) で, macOS で試してる. Rust のコンパイルフロー まず, Rust のコンパイルフローとその情報を見る方法について,確認する. Rust は大体以下の流れ
Haskell の IO モナドって,中身どうなってたんだろと気になってて,ちょっと調べてみた.そのメモ. IO モナドと RealWorld まずは基本から. IO モナドは, Haskell の根幹となるモナドで, main も IO で書く. GHC では中身は次のように定義されている [1]: -- In GHC.Types module of ghc-prim package newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #)) 見ての通り, IO a は State# RealWorld -> (# State# RealWorld, a #) の newtype だ.あんまり見慣れない State# RealWorld という型と (# , #) という型が出てきたけど, State# RealWo
Haskell-jp でちょっと話題になったので, OSS ライセンスについての個人的な色々を書いておこうと思う.なお,僕は OSS にも著作権にも明るくないので,この記事は多数間違いを含む可能性がある.それぞれ僕の独自の解釈の可能性があるので,そこは注意してほしい. そもそもライセンスとは,要は許可証で,何かを使用する際に,その配布者がそれを使って何をして良いか何をしてはいけないかを書いた文書のことだ.配布者が「それを守れるなら使っていいよ」と,使用許諾を出すときに出す契約書のようなものだ. OSS ライセンスは,その文書のテンプレのようなもので,現在は Open Source Initiative ,通称 OSI が承認したものを指す事が多いんじゃないだろうか.そのリストは https://opensource.org/licenses/alphabetical から見れる.有名な オ
末尾呼び出し最適化 Java は末尾呼び出し最適化をしないことで有名だ [2].だけど, Scala は末尾呼び出し最適化を行う.具体的にコードを見てみる: $ cat src/TailCallOpt.scala object TailCallOpt { def tailCallFunc(a: Long): Long = { if (a > 10) a else tailCallFunc(a + 1) } } $ scalac -Ystop-after:tailcalls -Xprint:fields,tailcalls src/TailCallOpt.scala [[syntax trees at end of fields]] // TailCallOpt.scala package <empty> { object TailCallOpt extends Object { def <
https://kazu-yamamoto.hatenablog.jp/entry/2019/04/11/111238 の記事に触発されて,ちょっと書く気になった.こちらも面白い記事なので,ぜひ参照してほしい. Haskell 2020 で Applicative が追加される見込みだ (そもそもちゃんと 2020 年に出るのか怪しそうだが).それを踏まえて,標準ライブラリに入る Haskell の特徴的な一連の型クラス Functor / Applicative / Monad の個人的な捉え方を書いておこうと思う.なお,あくまで個人的な捉え方なので,形式的でないし,広く受け入れられている考え方とは乖離している可能性があるので,そこは注意してほしい. 概要 それぞれの型クラスが表すものは端的に言えば, Functor 変換の一般化 Applicative 関数適用の一般化 Monad 手
someFunc = let v = 42 -- See Note [The Answer To Life] in v {- Note [The Answer To Life] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "The Answer to the Ultimate Question of Life, the Universe, and Everything" is 42. After seven and a half million years of calculation, deep thoughts finally output the answer. -} 例えば, https://gitlab.haskell.org/ghc/ghc/blob/ghc-8.6.4-release/compiler/prelude/TysPrim.hs#L593 のような感じ
このページを最初にブックマークしてみませんか?
『mizunashi-mana.github.io』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く