タグ

ブックマーク / xuwei-k.hatenablog.com (21)

  • Scala 3のscala.deriving.Mirrorの実装詳細は?生成コードは?SumOfとProductOfの違いは?Scala 2の場合は?調べてみました! - xuwei-k's blog

    少しふざけたタイトルをつけましたが、以下、基的に超真面目なマニアックな話をします。 Scala 3から、ある程度の定型的なtype classのinstance生成時に低レベルなmacroを書かずに便利に綺麗に書けるMirrorという仕組みが標準で追加されています。 docs.scala-lang.org https://github.com/lampepfl/dotty/blob/3.1.3-RC2/library/src/scala/deriving/Mirror.scala 雑に一言で説明すると、shapeless 2における Generic や LabelledGeneric に近いものが標準に入りました。 今回は、それ自体の紹介ではなく、タイトルに書いた通り、それの内部実装の話です。よってMirrorそのものの詳細な使い方や説明はしません。 また、versionはひとまずSca

    Scala 3のscala.deriving.Mirrorの実装詳細は?生成コードは?SumOfとProductOfの違いは?Scala 2の場合は?調べてみました! - xuwei-k's blog
    krrrr
    krrrr 2022/04/22
  • sbtで依存しているprojectのみにcleanなどの特定のタスクを実行する - xuwei-k's blog

    以下のような質問を某所で受けたので 書きました gist.github.com 既にあるとか、もっといい感じに書ける、みたいなのがあればお知らせください。 ちなみに、デフォルトでは単体のprojectしかcleanしないのは、完全にsbt的には意図した挙動のはずです。 デフォルトが今回自分が書いたような挙動では、逆に特定の単体のprojectだけをcleanしようとすると手段がなくて困るので。とはいえ、その手段が提供されていればデフォルトのcleanの挙動がそっちでも困らない?といえるかもしれませんが。 > もっといい感じに書ける、みたいなのがあればお知らせください。 自力でloopしなくても、classpathTransitiveRefsを使えば同じことできそうです。 val ref = thisProjectRef.value (ref +: buildDependencies.val

    sbtで依存しているprojectのみにcleanなどの特定のタスクを実行する - xuwei-k's blog
    krrrr
    krrrr 2019/12/18
  • 1443641775

    よく「どうやって情報手に入れてるの?」みたいに聞かれますが、そんなの、ひたすら時間かけてgithubみたりメーリングリスト読んだり最近ではgitterの会話読んでるに決まってます。 どうやって(How)ではなく、なぜ(Why)、自分がそんなことをするようになったのかを、あらためて書いてみる気になったので書いてみたいと思います。 書こうと思ったのは、Howだけ書いても、Why書かないとあまり意味ないと思うことが多くなったからですかね。(この件に関しては) 無責任に大雑把にいうと、(どんな理由であれ)情熱みたいなものがあれば、Howは自然に身につきます、たぶん。 なお、少し長くなるし、自分語りっぽくなるし、いつも書いてるようなものとは少し方向性が違い、具体的なすぐ役に立つ技術的な内容*1は基出てこないので、期待してるものが違うと思う人は、ここで読むのやめたほうがいいと思います。 どれほどコー

    1443641775
    krrrr
    krrrr 2015/10/01
  • ScalaでOperational Monadを使って作ったAPI clientの内部実装の解説 - xuwei-k's blog

    気が向いたら書く、と言っていた解説を書きます。 Operational Monadを使用した最初のversion0.2.0を出してから、色々機能追加したり試行錯誤したりして、結構変わっています。その辺りの試行錯誤や経緯も少し含めて、内部の実装や設計の説明を書きます。 https://github.com/xuwei-k/ghscala まず最初に、自分が作ったgithub API clientの中で、Operational Monad以外に使われているScalazの機能一覧を挙げてみます。このあたり知らない人は、まずこれらを勉強したほうがいいかも*1 Monad始めScalazの基的なこと NaturalTransformation http://d.hatena.ne.jp/xuwei/20130912/1378984786 Scalaz独自のEither EitherT(Either

    ScalaでOperational Monadを使って作ったAPI clientの内部実装の解説 - xuwei-k's blog
    krrrr
    krrrr 2015/08/31
  • ScalaでOperational Monadできた - xuwei-k's blog

    3ヶ月くらい前に、途中まで書きましたが ScalaでOperational Monad(未完成) あらためて続きをやってみたらできましたヤッタ-。 「できた」というのは、とりあえず fumieval さんの以下の記事のコード Freeモナドを超えた!?operationalモナドを使ってみよう を、Scalaに翻訳できたということです。 ポイントとしては 数日前ScalazにCoyoneda追加されてたので、それを使うようにした 前回liftFという関数がよくわからなくて詰まったが、一ヶ月前に追加されてた https://github.com/scalaz/scalaz/commit/da7867cecf36ac61 fumievalさんのコード中にでてくるProgramという型は、数日前Scalazに追加されてるFreeCと同じだった https://github.com/scalaz/

    ScalaでOperational Monadできた - xuwei-k's blog
  • sbtにおけるKeyとは何か? 〜 有向非巡回グラフ(Directed Acyclic Graph)とsbt - xuwei-k's blog

    sbtを使ったことがある人なら、たいていSettingKeyやTaskKeyという言葉を聞いたことがあるはずです。もし聞いたことがなくても、1度でもsbtを使ったことがあるなら、すでに知らないうちにそれらに触れているはずでしょう。 それらSettingKeyやTaskKeyを含んだsbtの内部DSLについては、その独特さゆえに、好みが分かれることが多いと思います。 そもそも なぜSettingKeyやTaskKeyという概念が必要なのか? それらは一体何なのか? ということに関して、少し別の視点から考察や解説をしてみることによって、sbt自体の理解の手助けとなることを目的として、このエントリを書いてみます。 なんだか、少しばかり堅苦しい始まり(?)にしてみましたが、つまり 「sbtのKeyは有向非巡回グラフにおけるNodeであり、build.sbtは有向非巡回グラフを組み立てるDSLである

    sbtにおけるKeyとは何か? 〜 有向非巡回グラフ(Directed Acyclic Graph)とsbt - xuwei-k's blog
    krrrr
    krrrr 2015/08/05
    “DAG”
  • 「Scalaに存在演算子を求めるのは間違っているだろうか」の解答例 - xuwei-k's blog

    なにやってるんだ・・・、と思いつつ見てたら、とりあえず解答を思いついてしまったので貼っておきます。 Scalaに存在演算子を求めるのは間違っているだろうか ちなみに、あくまで解答"例"であって、他にも色々方法あるかもしれません。 ちゃんと調べきれてないので確証が全く無いのですが、「Type Dynamicによるメソッド呼び出しのselectDynamicへの変換」と「implicit classによる暗黙の型変換」は両立しないみたい・・・? はい、自分の知る限り両立しないです。なので、方針を説明すると 最初の一回だけ明示的にDynamic用のオブジェクトにラップする処理を書く _valueとかを呼び出したら、OptionではなくDynamic用のオブジェクトにラップしたまま返す あと、valueに限らないものができたので、 _valueでなくても _hoge でも、むしろアンダースコアなし

    「Scalaに存在演算子を求めるのは間違っているだろうか」の解答例 - xuwei-k's blog
    krrrr
    krrrr 2015/07/15
  • sbt plugin作成時のデバック、テスト方法 - xuwei-k's blog

    赤坂Scalaに初めて行って来ました。 http://atnd.org/events/32263 そこで話してきたことをちょっと簡単に。 参加したメンバーの人は、sbt pluginちょっとは作った経験はあるみたいですが、テストやデバック方法あまり知らないようなので、話してきました。 まず 「どうデバックするか?」 という話題になって、 「publish-localして試してる」 という話がでました。もちろんそれでもいいのですが、キャッシュとか関係して面倒*1だし、それよりもちょっとだけ便利かもしれない方法の紹介です。 勉強会中にtweetしましたが #akskscala URL sbt で github にあるライブラリを直接使う方法 2012-09-20 21:03:50 via web sbtにはgithubを直接参照できる機能があります。上記のyoshioriさんの記事は、日語で

    sbt plugin作成時のデバック、テスト方法 - xuwei-k's blog
    krrrr
    krrrr 2015/05/12
  • モナドの本当の力を引き出す・・・モナドによる同期/非同期プログラミングの抽象化 - xuwei-k's blog

    以下の2つの続き ScalaでFutureとEitherを組み合わせたときに綺麗に書く方法 FutureとEitherの話の続き(ApplicativeとMonadの違い) 上記の2つ(特に最初の方)を読んだことを前提で書くので、読んでない人は先にそちらを読みましょう。 なんだか少し関連する話(?)で盛り上がっていて、書かないといけない気がしてきたので 非同期プログラミングの難しさとScalaのFuture そのtogetterの議論について色々書きたいこと*1もありますが、それは置いておき、表題の「モナドによる同期/非同期プログラミングの抽象化」について書きます。というか、(非同期プログラミングの話より)便乗してモナドとモナドトランスフォーマーの便利さを話したいだけかもしれません(?) 前回2つは「Future使って非同期にしても、だいたい関数の体同じでいけるよ」ということを書きました

    モナドの本当の力を引き出す・・・モナドによる同期/非同期プログラミングの抽象化 - xuwei-k's blog
    krrrr
    krrrr 2015/03/29
  • Scala標準ライブラリのscala.xml.XML.loadStringなどを直接使うとXXE(XML External Entity)という脆弱性になるので気をつけましょう - xuwei-k's blog

    liftというweb frameworkのメーリングリストで「ちょっとセキュリティの問題見つかってリリースしたから、アップデートしてくれ」というのが2015/3/16 (月曜)頃に流れてくる https://groups.google.com/d/topic/liftweb/NSXpg778Oos/discussion ↓ 脆弱性の詳細はすぐには明かされなかった。つまり深刻なの?lift以外にも影響あるの?(それを匂わせるような書き方) 金曜くらいには発表するとある。わざとgithubにも該当のtagはpushされてないようだ ↓ つい先ほど「詳細マダー?」「DPPがblog書いたらしいよ」 http://blog.goodstuff.im/lift_xxe_vulnerability ↓ というわけで、詳細でました。XXEググると、日語だと、(わりと古いけど)以下のblogが詳しくわか

    Scala標準ライブラリのscala.xml.XML.loadStringなどを直接使うとXXE(XML External Entity)という脆弱性になるので気をつけましょう - xuwei-k's blog
  • slamdataについて - xuwei-k's blog

    これは、purescriptアドベントカレンダーの6日目です。 slamdataってなんだよ?というのを書きます。自分もそれほど詳しくないですが。 簡単に要点を先にまとめると purescriptを実際に使ってるベンチャー(?)企業 社員の人が、purescript自体やいくつかのライブラリにも貢献している 以前"Scalaのすごい人がいる"というので紹介したPrecog http://d.hatena.ne.jp/xuwei/20121018/1350524933 という会社とCTOが同じ precog自体は、なくなったらしい?そのあたり詳しく知らない こんな記事 10 Lessons I Learned from Doing My First Real Startup をCTOが書いてたので、読むとよいと思う precogのときと大体同じような、MongoDB使って、そこにリレーショナ

    slamdataについて - xuwei-k's blog
    krrrr
    krrrr 2014/12/08
  • Reactive Manifestoではないほうの本当のReactive Programming? - xuwei-k's blog

    タイトルにわざとReactive Manifestoを入れたのは、まずこちらのtogetterご覧ください pokarimさんのReactive Manifestoに関する印象 あと、タイトルの最後に、はてなマーク入れたのは、自分がReactive Programmingに詳しくなく、色々自信ないからです。 間違いあったらツッコミください さて、Reactive Programmingとはそもそもなんなのか?厳密に定義できるのか?は、詳細に議論できるほどの知識を持ち合わせていないので逃げます(おい まずは、話のとっかかりとして、上記のtogetterの主役となってるpokarimさんの過去の記事(4年近く前!) を結構長めに引用してみます。(はてぶが600以上ついてる・・・) なぜリアクティブプログラミングは重要か。 まず次のような定義を行います。 a = 1 b = a * 3 そしてa

    Reactive Manifestoではないほうの本当のReactive Programming? - xuwei-k's blog
    krrrr
    krrrr 2014/09/28
  • ScalaでFutureとEitherを組み合わせたときに綺麗に書く方法 - xuwei-k's blog

    組み合わせるとはつまりアレのことを書くのですが、一応それほど前提知識無くても理解できるように書いてみます。さて、なぜいきなりEitherとFutureか?というと play2とか使ってると、Futureがよく出てくる Futureをそこら中でAwaitしたらFuture使う意味がないので、Future[A]をmapやflatMapなどでどんどん連鎖させて、メソッドの型にFutureが大量に出現! Futureは非同期に行われる処理であり、そこで例外発生したら、その中に例外を含むしかない(単純に例外投げるわけにはいかないというか不可能) Scala標準ライブラリのFutureは、Throwable型で例外を保持できるようになってる 逆にいうと、Throwableでしか保持できない 例外の種類が多くなってきて、プログラムが複雑になった場合、Throwableではなくもっと限定された独自のエラー

    ScalaでFutureとEitherを組み合わせたときに綺麗に書く方法 - xuwei-k's blog
    krrrr
    krrrr 2014/09/20
  • Scala2.10から2.11の変更点 - xuwei-k's blog

    例のごとく、最初に注意書き まだfinalがでていないので、細かい部分変わるかもしれません*1 個人的に、「大きい変更点だなと思ったもの」「ライブラリ側のユーザーが直接使うクラス関連*2」「なんとなく興味があるもの」を中心にとりあげただけで、すべてを網羅してるわけではありません finalがでるまではできるだけ随時更新する予定です Scala2.11.0は、今のところ順調にいけば2014年の2月には最初のRCがでて*3、3月にはfinalがでるらしいです。*4 https://issues.scala-lang.org/browse/SI しばらくこの記事がblogの一番上にくるように、少し未来の日付にしておきます。 2.9から2.10のときの変更点に比べると、だいぶ少ないですね。(2.9から2.10の変更点が多すぎただけですが)細かく追えていませんが、その分コンパイラ側の細かいパフォーマ

    Scala2.10から2.11の変更点 - xuwei-k's blog
    krrrr
    krrrr 2014/09/10
  • Scalaのマクロの基礎。評価タイミング、評価回数と、健全性 - xuwei-k's blog

    Scalaのマクロというより、一般的にマクロに共通する基であり重要な部分です。それをScala使って説明するだけです。 Scalaのマクロは、未だexperimentalという位置づけで、他の機能に比べれば仕様やAPIが変わりやすい状態です。そして、機能が搭載されてからあまり時間が経っていないこともあって*1あまり一般的に使われているとはいえない状態でしょう。しかし、Cなどのマクロとは違い、Scalaのものはある程度は格的にコンパイル時に抽象構文木を自由にいじれるものであり、使いこなせるようになってくるとなかなかおもしろいです。 マクロというと、ある程度の人はLispを思い浮かべると思いますが(?)、先ほど書いた「格的に抽象構文木いじれる」という点はまさにLispと共通する部分もあります(もちろん異なる部分も多くあります)。 つまり、これから説明することは、On Lisp*2 On

    Scalaのマクロの基礎。評価タイミング、評価回数と、健全性 - xuwei-k's blog
    krrrr
    krrrr 2014/08/31
  • sbtrcでsbt pluginを追加できるようにしておくと便利なことに気づいた - xuwei-k's blog

    sbtには、便利なのにあまり知られてない.sbtrcという仕組みがあります。 rcというのは、bashrcとかzshrcとかのあれです。 ホームディレクトリ/.sbtrc に置いておくか、それぞれのプロジェクトのディレクトリのトップに置いておくと読み込まれます。 よく使うコマンドのalias設定しておけます。aliasの設定機能自体知ってる人少ないかも? たとえば自分は、今まで以下のようにしてます alias cd=project alias ls=projects alias c=compile alias t=test alias r=run alias tc=test:compile alias to=test-only alias tq=test-quickこれ、aliasにしても、タブ補完が同じように効くのでとても便利です。 さて、これもまたあまり知ってる人少ないと思いますが、s

    sbtrcでsbt pluginを追加できるようにしておくと便利なことに気づいた - xuwei-k's blog
    krrrr
    krrrr 2014/08/08
  • ScalazのEndo - xuwei-k's blog

    @markhibberd さんの Endo の話がわかりやすかったので、勝手に日語の説明をつけたスライドを作りました もとのスライド http://mth.io/talks/patterns-in-types-ylj 日語の説明つけたもの http://gist-slide.appspot.com/5607773/endo.md https://gist.github.com/5607773 あと、他にもスライド公開してたので、みんな読むといいよ Argonaut Purely-Functional Library Design in Scala Zippers, Comonads and Data Structures in Scala それと、scalaj-httpのRequestに関してこのパターン使えるなぁーと思ったので、作ってみた https://gist.github.co

    ScalazのEndo - xuwei-k's blog
  • Scalaで、FutureやOptionやListがネストしてしまったときに、いい感じに変換する方法 - xuwei-k's blog

    Optionで説明してますが、ListやEitherでも同じはずです。とりあえずsequenceとjoinで、どんなにネストしていても、大概変換できるはず? *1 *1:パフォーマンスとか、sequenceの呼び出し順による、細かい動作の違いとかはあれですが。もし似たような感じで困ったら、聞いて下さい

    Scalaで、FutureやOptionやListがネストしてしまったときに、いい感じに変換する方法 - xuwei-k's blog
    krrrr
    krrrr 2014/07/13
  • HaskellのGADTsすごいなーと思ったのと、それをscalaz.Leibniz使って頑張る話 - xuwei-k's blog

    まず、下記の10行程度のScalaコードをご覧ください sealed abstract class Foo[A, B] final case class X[A]() extends Foo[A, A] final case class Y[A, B](a: A, b: B) extends Foo[A, B] object Main { def hoge[F[_, _], A, B, C](foo: Foo[A, B], bar: F[A, C]): F[B, C] = foo match { case X() => bar case Y(a, b) => ??? // Yの場合のコードはどうでもいいので } } これは、コンパイルエラーになります(Scala2.11.1)。しかし、HaskellでGADTs使って同様のコード書くと、コンパイル通るらしいです。これの話をします。*1 Sc

    HaskellのGADTsすごいなーと思ったのと、それをscalaz.Leibniz使って頑張る話 - xuwei-k's blog
  • Scala2.11から、unapplyメソッドの戻り値型の仕様が拡張されます - xuwei-k's blog

    この変更 https://github.com/scala/scala/pull/2848 すでに2.11.0-M5に入っているので試せます。unapplyとは、パターンマッチの際に使われる特別なメソッド名です。 一言でいうと 「今まではscala.Option型*1を返さないといけなかったが、getとisEmptyというメソッドを持っていればなんでもいい」 という仕様になりました。scala.Option自体には、もともとisEmptyとgetが存在していたので、基的には2.10以前とソースコードは互換性あるはずです。 この変更の目的のほとんどは、パフォーマンス面でしょう。「unapplyのメソッドから返すためだけに毎回Optionに包む」という余計なオーバヘッドを、今回の変更と、「2.10から入ったvalue class」を併用して避けるためです。また、Option[AnyVal]の

    Scala2.11から、unapplyメソッドの戻り値型の仕様が拡張されます - xuwei-k's blog
    krrrr
    krrrr 2014/04/18