Lambdaカクテル

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

scala

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…

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

プログラミングをしていると、この変数は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 さんが助けてくれた。解…

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

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

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

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

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

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

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

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

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

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

string_randomをScalaでやる

string_random.jsというライブラリがある。正規表現を与えると、それを満たすような文字列を生成してくれる便利なやつだ。 デモページもある。 cho45.stfuawsc.com おもしろい このライブラリはjavascript用だが、正規表現を満たす文字列をいくつか生成した…

Scala 3で言語処理系を作ってる

馴染みのプログラミング言語に新しいバージョンが出てもあれやこれや理由を付けてなかなか学ばないのが人の常。やらなきゃなーなんて言っている間はだいたいやらないんだ。 そんな中Twitterで雑誌『Web+DB Press』にScala3の記事が出ている事を知った俺は速…

Akka StreamsでReactive FizzBuzzした 〜Akka Streams入門〜

Reactive streamという概念をなんとなく知っていたが、実際には使ったことがなかったので、そのうち使ってみたいと思っていた矢先の話。 みずほ銀行の文脈ではてブを眺めてたら、無停止システムに関する記事が出てきて、これが面白かった。 koduki.hatenablo…

ScalaからGoogleSpreadsheetに書き込んだ

ScalaでGoogle Spreadsheetに書き込んでみたメモです。 概要 とその前に、設定ファイルまわりちゃんとしておく SDKをインストールする GCPのコンソールでアプリと認証情報を作る コーディング クレデンシャルの取得 && OAuth実行 Spreadsheet APIを叩く 最上…

AsanaのCSVエクスポートをなんとか擬似的に自動化する

弊チームではプロジェクト管理にAsanaを使っているのだけれど、それとは関係無く、バーンアップチャートを作っていこうというチーム横断の機運があり、社内の有志がGoogle Spreadsheetで動くテンプレートを作ってくれている。AsanaのCSVエクスポート機能を使…

CatsでFizzBuzzする

以下の記事を参考にCatsでも頑張ってみたけど、途中までしかできなかった・・・。 itchyny.hatenablog.com import cats._ import cats.implicits._ import cats.data._ implicit val F = Monoid[Option[String]] implicit val Al = Alternative[Option] val …

akka-httpで得られるJSONレスポンスをcase classに自動マップする方法

調べてみたけどぜんぜん分からなくて3日くらい悩んだのでメモ. akka-http まずakka-httpについて.akka-httpは見てのとおりakkaで作られたHTTPライブラリで,client業もserver業もこなせる何でも屋です.じゃあakkaは何かというと,アクターモデルによる非…

scalatra + twirlでリバースルーティングする

暮らしているとリバースルーティングしたい日があります.例えばテンプレートの中で別のエンドポイントへのリンクを作りたいとき,直にURLを書きたくないですよね.修正に弱いし. いまどきのWebアプリケーションはエンドポイントを渡すと勝手にURLが作られ…

Case classを同じメンバのcase classに変換する

Case Classを変換したいことがある。具体的には今作ってる年表作成ツールで,ドメインモデルであるdomain.Timelineをテンプレート用のDTOであるapplication.dto.Timelineに変換したいのだが,domain.timelineはそのフィールドにSeq[domain.Event]を保持して…

Scalaで型パラメータ付きクラス(トレイト)と抽象型付きクラス(トレイト)復習したところ全称型と存在型に出会った

だいたい同じことができる(ような気がする)別々の2つの言語機能についてよくわかっていないので書く。 // 筆者は型初心者。 型パラメータ traitには型パラメータを設けることができる。いわゆるジェネリクスというやつである。 trait Plus[A] { def plus(a…

Scalaのfor-comprehensionのパチモンをCommon Lispで実装した(多値使って)

何言ってるんだという感じですがこういう感じです。 (defun find-user (username) (if (string= username "windymelt") (return-left :windymelt) (return-right "User Not Found"))) (defun check-passwd (user passwd) (if (and (eq user :windymelt) (str…

ツイッターのふぁぼをクロールするツール作った/俺TUEEEを大事にしたい

今日はツイッターのふぁぼをダウンロードしてくるやつを作った Scalaは神 https://github.com/windymelt/dumpfav 自分のふぁぼが検索できなくて困っていたので、ふぁぼを200件ずつクロールして保存するツール作った。 JSONを吐くのであとはElasticsearchとか…

型クラスまわりの用語を整理した

用語のうち曖昧だった部分を整理した。お勉強です。まちがっていたらマサカリをください。著者はCSの学位を持たないかけだしです。 多相(多態)(polymorphism) 関数とかが引数の型によってさまざまな振舞いをすること より厳密には、値(関数を含む)が型を取る…

ScalaでDI(Play framework2.7 + Guice編)

ScalaでDIします。Google GuiceというDIコンテナを用いて,Play Framework上で,またより一般的なScalaアプリケーション上でDIを行う方法について説明します。 Dependency Injection ナイーブなDI (コンストラクタ・インジェクション) DIコンテナ,DI手法 Gu…

ScalaのTypesafe config(Lightbend config)で環境変数を含んだ文字列を設定する

ScalaにはTypesafe config(今はTypesafeはLightbendという社名になっているのでLightbend configかもしれない)という便利な設定ファイルライブラリがあり,ScalaのWebアプリケーションフレームワークであるPlay frameworkでは標準的に採用されている。これは…

ScalaのPlayアプリケーションをsbt-native-packagerの力を借りてDockerで動かす

おはこんばんちわ.普段はLispをやっていますが今日はScalaをやります. わけあってPlayアプリケーションを構築しようとしているのですが,時代はクラウド.環境構築やデプロイであれこれ悩みたくありません.そういうわけで,Docker化を見越したアプリケー…

情報科提督のための、艦これで理解する「オブジェクト指向」

艦これってオブジェクト指向を説明するのにかなり優れた教材なのでは!?と思ったので、艦これを用いてオブジェクト指向を説明したいと思います。内容は簡単にしているので正確には間違っている箇所があるかもしれませんが、ご容赦ください。 事の成り行き T…

Play framework 2.3.xでShift_JISのリクエストを扱う方法

要点 Play framework 2.3.xとUTF-8について解説します Shift_JISでパーセントエンコードされたデータを扱う事の困難性を解説します 実際にPlay framework 2.3.xで上記のデータを受け取る方法について解説します Play frameworkとUTF-8 Play framework 2.3.x(…

SBTプロジェクトのバージョンに"-SNAPSHOT"を付加する理由

SBTに限らないことかもしれないが、g8のようなテンプレートを利用してSBTプロジェクトを作成すると、バージョン名のデフォルトがX.Y.Z-SNAPSHOTとなっていることがある。この理由が分かったのでメモ。 要点 Ivy2はローカルなレポジトリのキャッシュを保有し…

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