タグ

ブックマーク / zenn.dev/110416 (10)

  • Scala でナイーブな HPACK(RFC 7541 ) を実装する

    About HPACK は HTTP/2 で利用されるヘッダ圧縮方式である. RFC 7541 で仕様が定められている. 最近業務で使っている RustgRPC に関する記事を書いたのだが、gRPC のベースにある HTTP/2 について全然理解してない気がしてきたので色々と RFC を読んでみた. HTTP/2 の RFC の中で RFC 7541 - HPACK: Header Compression for HTTP/2 は分量も少なくサンプルも充実していて、試しに実装してみるのにちょうどいい題材だったのでこれを Scala で実装してみた. 実装したコードの cloc . --vcs git の結果は以下の通り. コメント・空行やテストも含めて 1000 行未満. --------------------------------------------------------

    Scala でナイーブな HPACK(RFC 7541 ) を実装する
    Windymelt
    Windymelt 2024/01/03
    Scala 3の機能を余すところなく使ってて良い
  • Scala 3 boundary/break で optional chaining と error short circuit

    また、Rust ではResult で失敗する関数や Option で None になる処理に ? をつけることで処理を short-circuit して抜け出せる. これは TypeScriptKotlin の optional chaining を Result 型にも拡張したものとしてみることができる. Rust: Result の short-circuit pub fn f() -> Result<i32,String> { let str = may_fail_with_string()?; let i = str.parse::<i32>().map_err(|_| "error message".to_string())?; Ok(i) } fn may_fail_with_string() -> Result<String,String> { todo!() }

    Scala 3 boundary/break で optional chaining と error short circuit
    Windymelt
    Windymelt 2023/12/07
    おもしろい、Scala 3の最新機能活用してて便利なものが作られている
  • http4s で簡単な JWT 認証

    この記事は以下の記事の続きです. http://localhost:8080/echo/name に GET リクエストを送ると name が返ってくるサーバーは以下のように書けます. (http4s の最小構成: サーバーのコードと同一.) // 非同期ランタイム //> using lib "org.typelevel::cats-effect:3.4.5" // http 関係 // http の基型など //> using lib "org.http4s::http4s-core:1.0.0-M38" // ルーティング DSL など //> using lib "org.http4s::http4s-dsl:1.0.0-M38" // http サーバー //> using lib "org.http4s::http4s-ember-server:1.0.0-M38" impo

    http4s で簡単な JWT 認証
    Windymelt
    Windymelt 2023/10/13
    良い、なんかの機会に使いたいな
  • Scala(JVM) で機械学習(NLP, Deep Learning, Neural Net, etc)

    BERT 周りの知識 tokenize (日語向け)BERT では, 分かち書き(word segmentation) + subword 分割した後でトークナイズ処理をする. 分かち書き + subword 分割 の部分は pre-tokenize と呼ぶことがある. 入力テキストを subword まで分割して辞書(語彙)に含まれる tokenid にマッピングする処理をトークナイズと呼ぶ. subword 分割とトークナイズ処理は model の vocabulary に依存する. vocabularyファイルがサブワード分割の学習の結果生成され*5、サブワード分割を行う際に必要になる。 BERT派生のモデルでは従来の単語分かち書きだけでなく、さらに細かい分かち書き単位であるサブワード分割という処理が適用される。 モデル的にはこの処理は必須というわけではないものの、報告されているタ

    Scala(JVM) で機械学習(NLP, Deep Learning, Neural Net, etc)
  • Scala のビルドツール mill を紹介する.

    この記事は Scala アドベントカレンダー 10 日目の記事です. もともとは bleep というビルドツールを紹介する予定でしたが、 mill の方がユーザー数が多く、いくつかの有名なプロジェクトは mill でビルドされているので mill を紹介することにします. 15 日目の atty303 さんごめんなさいm(_ _)m ちなみに bleep は sbt・millとはまた別のビルドツールです. まだ開発段階のようですが GraalVM で生成したネイティブバイナリで実行可能だったり、 sbt のプラグインとの互換性があったり既にいくつかの IDE サポートが動いていたり、など将来が期待できます.(yet another HOGE HOGE が大量にあるのはどうにかならんのか、とは思うが...🙃) mill について さて、Scala のデファクトのビルドツールは sbt だが

    Scala のビルドツール mill を紹介する.
  • Circe の機能で様々な形態のJSONを列挙型(enum/sealed trait)として扱う

    Scala では複数の型のどれか一つになる列挙型を sealed trait や enum を使って定義できます. JSON には列挙型の概念が存在しないので、列挙型はさまざまな方法でシリアライズ・デシリアライズされることがあります. このような enum のシリアライズ・デシリアライズをする際に Rust の serde の ADT のシリアライズ・デシリアライはとても便利です. 実は Scala の circe でも似たようなことができるんですよ? 😊 なお、以降のコードは次の環境で実行されている. //> using scala "3.3.0" //> using dep "io.circe::circe-core:0.14.5" //> using dep "io.circe::circe-generic:0.14.5" import io.circe.* import io.c

    Circe の機能で様々な形態のJSONを列挙型(enum/sealed trait)として扱う
    Windymelt
    Windymelt 2023/09/01
    超良い記事!! JSONでEnumを表現する方法いろいろがScalaのCirceではどのように行なわれるか。
  • React Tutorial の Tic Tac Toe を Scala.js & Laminar & Vite でやる.

    Laminar とは...? 🤔となった人はこちらの記事も読んでみるといいかもしれません. Goal レポジトリはこちら Hands-on 使うもの Scala.js sbt Vite Laminar ライブリロードでインタラクティブに開発するためにシェルを二つ開いて一つで npm run dev を、もう一つで sbt ~fastLinkJS を実行します. npm run dev で vite の開発サーバーが立ち上がり、http://localhost:3000 でアプリケーションがサーブされます. sbt ~fastLinkJS を実行すると src/main/scala 以下の 変更を検知して 変更があるたびにビルドが走ります. display UI まずは src/main/scala/tictactoe/Index.scala をみてみましょう. 次のようなコードがあります

    React Tutorial の Tic Tac Toe を Scala.js & Laminar & Vite でやる.
  • Laminar ではじめる Scala.js フロントエンド

    Laminar は Scala で書かれたリアクティブな宣言的 UI ライブラリです. Scala でコードをかいて Scala.js にコンパイルすることでブラウザで動作するフロントエンドアプリケーションをつくれます. Scala.js と Laminar, Scalacss, Scalatag を使えば、JS を一切使わずに型安全に Scalaフロントエンドを構築することができます. TypeScript の狂気的な型(誉め言葉)や JSのゆるゆるな言語仕様に疲れたそこのあなた! Scala.js を使ってみませんか? この記事では以下のデモサイトのコードをいくつか抜き出して Laminar の書き方をざっくり紹介します. このデモでは Laminar と Laika という Scala 製のテキスト変換ツール(pandoc のように中間AST を挟むことで多様な入力形式に対応して

    Laminar ではじめる Scala.js フロントエンド
  • Scala JS で GCP Cloud Functions を書き、Terraform でデプロイする

    この記事の内容は https://github.com/i10416/scalajs-cloudfunctions.g8 レポジトリにテンプレートとして置いてあります. テンプレートを使えば GCPGitHub Actions の Workload Identity Pool を使って Keyless 認証でデプロイできるようになっています. g8 i10416/scalajs-cloudfunctions.g8 REAME に従って、TerraformGitHub Actions の環境変数を設定設定する 以上の手続きでサンプルをシュッとデプロイできるようにしてあります. 概要 cloud functions は(Request, Response) 型( express の Request, Response に似ているが少し仕様が違う )を受け取って Any または Pr

    Scala JS で GCP Cloud Functions を書き、Terraform でデプロイする
    Windymelt
    Windymelt 2023/03/07
    便利そう
  • http4s の最小構成:サーバー

    // 非同期ランタイム //> using lib "org.typelevel::cats-effect:3.4.5" // http 関係 // http の基型など //> using lib "org.http4s::http4s-core:1.0.0-M38" // ルーティング DSL など //> using lib "org.http4s::http4s-dsl:1.0.0-M38" // http サーバー //> using lib "org.http4s::http4s-ember-server:1.0.0-M38" import cats.effect._ import org.http4s.HttpRoutes // Request => F[Response] を表現する型 import com.comcast.ip4s._ // ipv4"0.0.0.0",

    http4s の最小構成:サーバー
    Windymelt
    Windymelt 2023/01/16
    良い記事!!! (SIGINT受け取らなくて困ったけど)
  • 1