Skip to content

Instantly share code, notes, and snippets.

@matsu-chara
matsu-chara / pfds_story.md
Last active July 15, 2019 08:32
PFDSのストーリー

PFDSのストーリー

中身はともかく、ストーリーを忘れないようにメモ

純粋関数型言語でデータ構造を書くと以下のような利点が得られて嬉しい

  • 自動的に永続性(persistent)が得られる。(要素を更新した後でも、更新前のデータに安全にアクセス可能)
    • 破壊的代入を伴う命令形言語で実装された多くのデータ構造は短命(ephemeral)である。
  • 命令形言語では複雑になる、ある主のデータ構造が抽象化を通して非常にシンプルになる(LinkedList, Red-Black Tree)
@matsu-chara
matsu-chara / random_access_list.md
Last active June 15, 2023 09:13
2進数のゼロなし表現 (Zeroless Representation)の応用

2進数のゼロなし表現 (Zeroless Representation)の応用

2進数といえば通常{0,1}で数字を表現するが、各桁を{1,2}で表現するゼロなし表現という手法が存在する。 一見しただけでは、特に意味がないこの表現方法だが、「ある種のデータ構造は記数法表現を通して2進数と密接に関連する。」 という事実を通して計算量の削減に応用することができる。

モチベーション

高速にランダムインデックスアクセス可能なデータ構造がほしい。

@matsu-chara
matsu-chara / gol
Last active June 23, 2017 05:18
go link in bash
#!/bin/bash
CONF_PATH="$HOME/.config/gol/links"
# _gol_record key
_gol_record() {
key="$1"
if [ -n "$key" ]; then
grep "$key " "$CONF_PATH"
@matsu-chara
matsu-chara / foo.scala
Created May 27, 2017 16:13
基本的には実装詳細を隠蔽しつつDBに入れる時など限定で値を取り出す方法
case class Foo(value: Int)
case class Bar(value: String)
case class Baz(private val foo: Foo, private val bar: Bar) {
def fooBar: String = foo.value.toString + bar.value
}
val baz = Baz(Foo(1), Bar("bar"))
scala> Baz.unapply
case def unapply(x$0: Baz): Option[(Foo, Bar)]
@matsu-chara
matsu-chara / gateaway.scala
Last active May 23, 2017 01:42
finatra風?コントローラ
import com.twitter.util.Future
import scala.reflect.ClassTag
// generated code
case class FooReqThrift(value: Int)
case class ThriftException(message: String, cause: Throwable) extends RuntimeException(message, cause)
// libs
abstract class RequestAdapter[ReqThrift, ReqDto] {
def adapt(a: ReqThrift): Future[ReqDto]
@matsu-chara
matsu-chara / abbr_pipe.fish
Last active May 9, 2017 05:12
abbr on pipe position for fish
# basically from http://qiita.com/masa0x80/items/346b4b9c0ff08205995e
function __insert_abbreviation
commandline | read -l buffer
switch (string trim -r $buffer | string split ' ')[-1]
case G
string replace "G" "| grep" $buffer | read replaced
case X
string replace "X" "| xargs -I {}" $buffer | read replaced
case H
@matsu-chara
matsu-chara / coursier.sh
Created April 18, 2017 12:08
cousierをONにしたりOFFにしたりする君
# coursierをon
function coursier_enable() {
sed -i 's/\/\/\(addSbtPlugin("io.get-coursier" % "sbt-coursier" % ".*")\)/\1/' ~/.sbt/0.13/plugins/global.sbt
}
# coursierをoff
function coursier_disable() {
sed -i '/^addSbtPlugin("io.get-coursier" % "sbt-coursier" % ".*")/s/^/\/\//' ~/.sbt/0.13/plugins/global.sbt
}
@matsu-chara
matsu-chara / _危険例外渡しミス.scala
Last active March 16, 2017 05:24
危険例のようにabstract class宣言時やextends時にcauseのデフォルト引数でnullを指定するとcauseを渡し忘れる事故が発生するので避けた方が好ましい。(causeを渡し忘れているためスタックトレースが追跡できない状態になっているが、コンパイルは通るし相当気づきにくいので本番でエラーログみようとして初めて情報がないことに気づく・・・という事故)
abstract class DomainException(message: String, cause: Throwable) extends RuntimeException(message, cause)
sealed abstract class FooDomainException(message: String, cause: Throwable) extends DomainException(message, cause)
// causeが必ず存在するような例外
case class BarDomainException(message: String, cause: Throwable) extends FooDomainException(message, cause)
// causeがあったりなかったりするような例外
case class BazDomainException(message: String, cause: Throwable = null) extends FooDomainException(message, cause)
@matsu-chara
matsu-chara / a.scala
Last active March 2, 2017 05:10
scala comment compile error
// \r\n a ==> ok
// \u000D\u000A b ==> compile error
@matsu-chara
matsu-chara / FieldNameAndValuePorter.scala
Last active March 13, 2017 06:09
get field name of case class and get type checked new value. (scalameta 1.6.0, paradise 3.0.0-M7)
package scalaworld.macros
package com.folio.account.macros
import scala.collection.immutable.Seq
import scala.meta._
/**
* annotation for case class.
*