2021-01-01から1年間の記事一覧

トイレクラスで見る凝集度と責務

トイレとは何か? 社内向けに凝集度と責務について発表しました。 正直、プレゼン形式での発表は慣れないので全然うまく話せませんでしたが、調べるためのインデックスができればいいくらいの気持ちと、LTにも慣れていきたいなと思ってやってます。 折角なの…

Scalaz の Tree で違いがあるかを判定する

※Treeのflattenの結果が同じ値ならば常に同じであることを前提としていて、実際そうなのかをちゃんと確認してないので少し怪しいところあり。 ここ1年くらい木構造に悩まされていますが、scalaz の Tree を使っていて、2つの木に違いが存在するかを判定した…

Scalaでの例外処理メモ

例外についてものすごく参考になった記事と、個人的メモ。 参考になった記事 明日から使える実践エラーハンドリング Scala界隈では有名ながくぞさんのSlideですね。私はこれを読んで初めて例外が何か理解できた気がしました。 他にもスライドはあります。 ht…

【Scala】Option 利用指針

Scalaでよく使うものに Option 型があると思います。Option 型は値が存在するかもしれないことを示す型です。Javaで値がないを表現するためには null を使うのが一般的でした。Java 8からは Optional 型 ができたようですが、古いJavaのプロダクトでは null …

Mac mini m1 買った(届いてない)。選択理由

今更ながら、Mac mini m1 買いました。 動機 単純に、今使っている MacBook Pro 2016 (16GB, 2.9GHz デュアルコア)が開発用途での利用に厳しくなってきたからです。IntelliJを起動するのに数分かかったり、キーボードの入力から反映まで1〜2秒のタイムラグ…

Scala で Builder Pattern

ScalaでJava like なBuilder Patternを書く機会は自分の場合あまり無い(Static Factoryで事足りることが多い)のですが、少し古いJavaのプロダクトのリファクタをした際にBuilder Patternで生成処理を書き直したので、Scalaの場合はどうなるのか見ていこう…

Haskell 勉強メモ9

セクション 中置関数に対して、セクションという機能を使って部分適用をすることができる。 divideByTen :: (Floating a) => a -> a divideByTen = (/10) *Main> divideByTen 30 3.0 これは 30 / 10 と同義。 高階関数 関数を受け取り、2回適用する関数を書…

木勉強メモ

木構造の取扱はプログラマなら基本なのかもだけれど、アルゴリズムとデータ構造をちゃんと勉強したことなかったので、必要ベースで勉強していく。 用語 用語説明根(root)親を持たないノード。1つの木に対して1つ根。辺(edge)親から子へのリンク。葉(leaf)子…

Haskell 勉強メモ8

高階関数 Haskell は関数を引数にとったり、返り値として関数を返すことができる。このような関数を高階関数と呼ぶ。Scalaにもある。 カリー化関数 Haskellの全ての関数は、引数を1つだけ取る。今まで、複数引数を取っているように見えたものは全てカリー化…

Apache POI 調査

Excelを操作したいみたいな状況は割とよくある。Pythonとかのスクリプト言語だと結構対処法をが見つかるけど、Scalaだと、Java資産のApache POIくらいしかない上に情報もそんなにない(poi.scala のようなラッパーライブラリもあるようだけど、プロダクショ…

Haskell勉強メモ 7

クイックソート アルゴリズムの定番クイックソート。 といっても、私はアルゴリズムをちゃんと勉強したことないので名前しか知らないのだけれど。。 これを関数型ではどうやって解くのかを見ていく。 が、先に手続き型ではどうやるのか。アルゴリズム本を見…

Haskell 勉強メモ6

再帰 関数型言語では再帰はよく出てくる。 最大値を求める関数を考えてみる。命令的に考えると、現在の最大値を保持する変数を用意し、リストの全ての要素についてループして、変数を更新していく形になる。Scalaで書いてみると def maximum(list: List[Int]…

Haskell 勉強メモ5

let式 let 式は変数を束縛する。 let 式自身も式。式であるとは、「値を持つ」ということ。 円柱の表面積を求める。 cylinder :: Double -> Double -> Double cylinder r h = let sideArea = 2 * pi * r * h topArea = pi * r ^ 2 in sideArea + 2 * topArea…

Haskell 勉強メモ4

関数を書くための構文 パターンマッチ Scala でもたくさん使うパターンマッチ。Haskell版も見てく。 渡された数が7かどうかを判別する関数。 Haskell版 lucky :: Int -> String lucky 7 = "LUCKY NUMBER SEVEN!" lucky x = "Sorry, you're out of luck, pal!…

Haskell 勉強メモ3

型変数 Haskellの head 関数の型を見てみる。 *Main> :t head head :: [a] -> a この a が型変数と呼ばれる。型変数によって関数を複数の型に対して動作するようにできる。型変数を用いた関数は多相的関数と呼ばれる。 どのような型でも良いという性質のこと…

Haskell 勉強メモ2

明示的な型宣言 Haskellの型宣言は2行で書く模様。こういう書き方は初めて。 removeNonUppercase :: [Char] -> [Char] removeNonUppercase st = [c | c <- st, c `elem` ['A' .. 'Z']] *Main> removeNonUppercase("HelloWorld") "HW" addThree :: Int -> Int…

Haskell 勉強メモ 1

関数型プログラミングをちゃんとやろうと思って「すごいHaskellたのしく学ぼう!」を買って読み始めた。その勉強メモ。自分のメイン言語はScalaなので、気になったところを比較しながら見ていく。 内包表記 Haskellのリスト内包表記。集合の内包的記法の概念…

階層構造のデータから特定のプロパティを抽出して、フラットにする

json のような階層構造を持つデータから特定のプロパティを再帰的に探索して、平坦なリストにしたものを取得したい場面に出会ったのでメモする。 データ構造 case class Tree( value: Int, children: List[Tree] ) 木構造?というか、自身のリストを持つよう…

Slick の java.time 対応

普段 PlayFramework + Scala で開発していて、ORMには Slick を使うことが多い。Slickは version 3.3 から java.time をサポートするようになったのだが、MySQL の型との対応がひどく(ほとんどTEXTにマッピングされて使い物にならない)、DBにMySQLを使う場…

Scala で FizzBuzz

今更だけど、FizzBuzzやってみる。 「1から100までの数字を画面に表示する」「3の倍数のときは数字の代わりにFizzと表示する」「5の倍数のときは数字の代わりにBuzzと表示する」「15の倍数のときは数字の代わりにFizzBuzzと表示する」プログラム フィズバズ…

implicit class を利用して Seq (とか)にメソッドを生やす

case class の Seq に対するメソッドを生やしたい時どうするか。例えば、下記のような case class があるとする。 case class Range( min: Int, max: Int ) これの Seq つまり、Seq[Range] に対して、含まれるRangeの中から、最小の min と 最大の max を取…

最近よくやるPlayFrameworkでのRequest Body(Json)の簡易Validation

業務では BodyParser での parse 時に 簡易的なValidationをすることが多い。以前は、型チェック程度の本当に簡易な Validation しかしていなかったが、最近はもう少し細かく Validation をしつつ、レスポンスを分けれるようにする書き方をすることが多いの…

ControllerComponents の中身を少し見てみる

PlayFrameworkを使っていると、まるで呪文のように何も考えずにControllerに書いている、これ。 class HomeController @Inject() ( cc: ControllerComponents )(implicit ec: ExecutionContext) extends AbstractController(cc) { この、ControllerComponent…

play.filters.headers で設定する contentSecurityPolicy は Play 2.7 から非推奨になっている

New Content Security Policy FilterThere is a new Content Security Policy filter available that supports CSP nonce and hashes for embedded content.The previous setting of enabling CSP by default and setting it to default-src 'self' was too …

IntelliJ に package prefix を省略してくれるPluginが追加されていた。

JetBrainsのブログ Enhanced Package Prefixes 試したいことがあり、新しく Scala のプロジェクトを作成しようとしたら、見慣れないものが追加されていた。 Package prefix なるものが追加されていたPackage prefix なるもの 以前からあったものを見落として…