住所入力画面に飛びます。住所の入力方法は↓あたりを参考にするといいと思います。-海外通販購入ガイド-注文ボタンを押すと、入力した住所の確認モーダルが表示されるので改めて正しく入力できてるか確認しましょう。ことで、一通り全種類注文してみました。予定だと16日に届くらしいので楽しみですね。一年間自分のブログでは何も書いてないことに気づいた。欲しいTweet広告を非表示にするもっと読むコメントを書く2015-12-23Platedとは何なのか?この記事はadventar版Scalaアドベントカレンダーの21日目です。担当は@aoiroaoinoです。17日ズサーしてる場合じゃなかった。遅刻しちゃってすみません。まえがきいつも通りMonocleの話です。事の発端はこのissueとPRでした。https://github.com/julien-truffaut/Monocle/pull/289全く知らなかったのだけど、追加されたexampleやらtestやら眺めてたら便利そうだったので。Platedのインスタンスまず、Plated自体は型クラスで定義は以下のとおり。A]なplateを一つ要求してるだけです。Traversalは以下のように定義されています。メソッドを定義しろって言ってるだけです。現在)で定義されてるインスタンスは以下の8つです。StringListIListVectorStreamTreeFreeCofree要するにTraversalを定義できればいいので、例えば自前で定義した型のインスタンスを定義することもできます。exampleにあるJsonの例を参考に、json4sのJsonASTに対して定義してみるとこんな感じ。}}で、インスタンスの定義方法をだらだら書きましたが、んじゃこんなの定義して何が嬉しいのかって話です。Platedの使い方Plated自体はインスタンスになってるデータ型に対して以下の関数を提供します。※見やすさの為にコメントやら実装やらを消しました。元のコードはこちらを参照してください。A}で、今回はとりあえずrewriteとtransformの使い方(?)だけざっくり。対象のデータ型はJsonが分かりやすそうなので、上で定義したjson4sのやつを使います。※ちゃんと動くサンプルコードはこちら。操作する対象のjsonはこんな感じ。JValueとなりますね。JValueの要素に対してfを適用していき、Someだったら再度適用、Noneだったら次の要素というのを繰り返し、それを全要素に対して行います。畳み込みの様な振る舞いをします。こいつも同様に全要素を走査するんですが、rewriteと違って、fを適用した結果に関わらず次の要素に進みます。おなじみのmapの様な振る舞いをします。)}で、これを知って一層某MonadicJValueとかいうclassに対して何がもなでぃっくじゃーみたいな気分になれるわけです。結局Platedは何なのか?どこから来たのか?本当はここをメインに書きたかったんですけど、掲載日過ぎた今日現在でもあんまりちゃんと理解できてないので調べた内容だけ。Uniplateが元になってるっぽい。(?)で発表されたものらしい。まとめ見つけた肝心の論文に関しては読み始めたものの、相も変わらずぐうの音も出ない状態なので、皆さんなんでそんなにカジュアルにラノベ感覚で論文読めるんですかっ???って気分になったので、引き続き頑張りますとだけ...。Lens楽しくて追っかけてたらSYBに至るとは思ってなかったので、しばらくはSYB関連調べて浸ってみるのも良さそうってのが感想です。あと来年はHaskellと英語頑張るのが良さそうですね。17:48Platedとは何なのか?Tweet広告を非表示にするもっと読むコメントを書く2015-12-18macro-compatを使ってmacroの互換性を簡単に管理するこの記事はadventar版Scalaアドベントカレンダーの17日目です。リリースされましたよ。めでたいですね!!さて、本日はそんなMonocleでも使ってる(?)Scalaのマクロのお話です。個人的にはそもそもあんまりマクロ使わないですし、使ったとしても2.11系のみ対応だったりで、2.10系との互換性を意識したことがなかったんですが、Scalaの複数のメジャーバージョンを跨ぐライブラリともなると話は別なようです。v1.2.0)ではLensやPrism、Isoなどを生成するようなマクロがあります。scala-2.11ディレクトリ以下にそれぞれMacrosCompatibilityというtraitを作って、そこで吸収していました。GitHub最近はsbt側で上記ディレクトリの管理もやってくれるようになりましたが、依然コードの方は自前で書かなければなりません。いう、Miles(@milessabin)さんが開発してるライブラリです。github.com使い方は簡単。2.11.xのAPIを使って普通にマクロを書いて、その実装を書いたclassに@bundleをつけると勝手に2.10.x系向けのコードも生成してくれます。やってることは単純で、2.11.xのAPIに対応する2.10.x向け変換メソッドをimplicitとか使ってゴリゴリと定義してあるBundleトレイトをマクロアノテーションを使って、該当のクラスにmix-inしてるだけです。GitHub大変便利なmacro-compatですが、まだまだ開発途中の様子で、しばしば欲しい変換メソッドが定義されていなかったりします。Reqしましょう!以上、とってもあっさりですがmacro-compatの紹介でした。素敵なマクロライフを〜。00:53macro-compatを使ってmacroの互換性を簡単に管理するTweet広告を非表示にするもっと読むコメントを書く2015-09-23Monocleのコミッターになりました夕飯食べてる最中にリプライ通知が来て、確認したらなってた。2015一応お誘い(?)っぽい話は一昨日くらいにGitterで直接受けていました。正直なところ本当にあたしでいいんですか?って気持ちもあったりしますが、最近LensやPrismが楽しくてしょうがないし、引き続きPR投げたりはしようと思ってたので、せっかく頂いた機会だし頑張ってみようと思います。_)m追記:2015-10-28書けと言われたので会社の方のブログにも書きました。techlog.mvrck.co.jp追記:2015-12-19今更だけど、タイトルわかりにくかったので修正した。Scalazわざわざ丁寧に書く内容ではないよなーとか思ってたので書くつもりは全くなかったけど、色々思うところがあったのでブログのネタにした。前からLens&Prism関連の話に興味を持ってて、ScalaでLensを提供するMonocleってライブラリをよく触って遊んでた。argonautを参考にこんなの作り始めたりしたけど、使ってると案の定不満とか足らない機能とか見えてくるわけです。typoしてきた経験(?)を生かして、少しだけcontributeしたってだけの話です。Foldにlengthメソッド追加できるんじゃね?monocle.Foldの中身眺めてたらfoldMapってメソッド名見えるし、なんならscalaz.FoldableからFoldインスタンス作れるし、本家Haskellのlensパッケージの方にもlengthメソッドが存在するくらいだから、追加できるやろと思ってやってみたら出来たのでPR出してマージされた。https://github.com/julien-truffaut/Monocle/pull/236Either3のOpticsがなかったMonocleのpackage構成って、Scalazと似たような構成になっていて*2、monocle/stdディレクトリ以下に各種データ構造に対するインスタンスが定義されてます。その中身をScalazの方のscalaz/stdと比べてみると、Monocle側に存在しない奴が幾つか見つかるわけですね。その中でもEither3が簡単そうだったので、既存のmonocle.EitherOpticsを参考にして追加のPR出したらマージされた。https://github.com/julien-truffaut/Monocle/pull/242ちなみにEither3って何だよって思った方は定義をどうぞ。名前通りの中身ですね。EphemeralStreamのOpticsがなかったもう一つ見つけた中で簡単そうだったのがscalaz.EphemeralStream。いうものかって書こうとしたら、既に2年以上も前に書かれてました。ほとんど中身は変わってないっぽい(?)ので、詳しくはこちらで。scalaz.EphemeralStream#zipWithIndexが無かった事に気づいた。定義するのが一番綺麗か悩んだけど、PR出してマージされたので良かった。https://github.com/scalaz/scalaz/pull/998ただ、Monocleの方はまだ出してないです。Truffaut氏的にはScalazからCatsに移行したい様子っぽいので、Scalazにしかないようなデータ構造やらに依存するようなPR出しまくってえぇんか?的な思いに至って以降、忙しさを言い訳にちょっと放置中です。内部的にはScalazべったりでそんなに簡単にはいかないだろうし、Scalazにしかないようなデータ構造に対するOpticsは別途モジュール切り出してサポートするって言ってるけど、以降のサポートとかも含めてちょっと難しいんじゃない?ってのが正直なところです。importのエラー*5が出てきたのでコメントしてみた。StdInstancesって定義されてるpackage.scalaファイルの消し忘れっぽかったんだけど、なんか深夜に完全にテンパって仕様上ありえないコメントとかしちゃって辛かった(←ただ、-Ywarn-unused-importオプション追加に関しては前向きっぽいので、追加PR出してみるといいんじゃないですかね?チャンスです。独学大学情報学部とか見ればなんと無くわかるんじゃないかと思います。compose系メソッド名と記号メソッド名の対応は覚えたんだけど、記号メソッド入力するときにほぼ右手のみでしかも4-5文字ってめちゃくちゃキーボード打ちにくくて不便なので、何か共通の記号一文字でできないかと思ってやってみたのが、これ。GitHub以前のv0.x系の頃には一律composeってメソッド名だったのだけど、こんな感じでoverloadするとうまく動作しない問題があった。それを暗黙の変換かますと回避できたりしないかなーってなんと無く思ってやってみたけど、そんなことはなかったし、詳しく追うのも疲れたのでお蔵入りコードとなりました。この問題、回避策をご存知の方いれば教えて頂きたく。まとめここ三週間くらいプライベートではこんな感じの事やってた。英語は適当過ぎるの良くないけど、それなりに頑張るとそれなりに通じるっていう知見を得たので、議論できる程度まで上げたいですね、英語力。2015-09-16アラカルト形式importはscalazが最初ではない模様。2015-09-17cats化難しいんじゃないの?とかって内容の記事書いて次の日にcats化のブランチがremoteにpushされたし。うぅむ、PR出てくるのも時間の問題っぽい...。GitHub*1:結果的には入れてないです。メリットなかったので。*2:独習Scalazにはアラカルト形式って呼称がありますね。2015-09-16参照。02:02MonocleとScalazにcontributeした話Tweet広告を非表示にするもっと読むコメントを書く次のページプロフィールid:Aoino新宿でScala書くお仕事してます。モナモナした話が大好きです。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。