読者です 読者をやめる 読者になる 読者になる

たにしきんぐダム

プログラミングやったりアニメやゲーム見たり京都に住んだりしてます

Scala関西勉強会でscala.Eitherとscalaz.\/の違いを話してきた

Scala関西勉強会で scala.Eitherscalaz.\/ の違いについて話してきました!
connpass.com

この話題、ブログとか漁ってみると3年前あたりに活発に議論されてる話だった...
僕自身for式の中でパターンマッチさせようとしてハマったものの(僕の検索能力の低さもあるけど)それを解説している記事にぶつかるまで時間がかかってしまったので、これについて解説する記事が一つでも増えると良いなーと思って発表しました。

考え事

\/単位元も定義されてる\/-(Monoid[B].zero)

https://github.com/scalaz/scalaz/blob/series/7.3.x/core/src/main/scala/scalaz/Either.scala#L411-L418

-\/(Monoid[A].zero)じゃないのかーって思ったけど、+++の実装を見てみると確かに\/-(Monoid[B].zero)\/appendについての単位元になってるなぁ@@

https://github.com/scalaz/scalaz/blob/series/7.3.x/core/src/main/scala/scalaz/Either.scala#L230-L238


今回の勉強会、バリュエーション豊かで基礎から応用まで幅広い内容のセッションがあってすごく良かった!
会場提供のエムオーテックス株式会社様、主催の@aa7thさん、@ryu1_okdさん、ありがとうございました!

参考

余談

発表中両手あげてバンザイして全身で\/を表現したりしてた

また参加します!

空間インデックス(R-tree)の理論と実践-理論編

空間データを効率良く検索するためには、インデックス構造が必要です.
しかしながら B-tree INDEXのような一次元的なデータ構造は、空間データといった多次元空間に属するデータを扱うには不向きです. (Geohashという緯度経度の情報を文字列のような B-tree に適したデータにハッシングする方法もありますが)

理論編では R-tree INDEX という多次元データを効率良く扱うためのデータ構造についてと、実践編ではPostgreSQL(PostGIS) や MySQL を用いた空間インデックスの使い方について紹介していこうと思います。
R-treeインデックスは多次元のデータを格納することができますが、以下では簡単のため2次元のデータを例にとって解説していきます。

この記事を読むにあたって B-tree についてある程度の知識があると分かり易いかもしれません。

目次

  • 目次
  • 空間データ
  • R-tree INDEX
  • 参照処理
    • 点検索
    • 範囲検索
  • データの挿入・削除
    • 挿入処理
    • 節点の分割
      • Exhaustive Algorithm
      • Quadratic-Cost Algorithm
      • Linear-Cost Algorithm
    • 削除
    • 更新処理
  • まとめ
  • 参考文献
続きを読む

Wantedlyで筋トレしてきた話

3/2(水) ~ 3/4(金) にWantedly株式会社のインターンに参加してきました.

www.wantedly.com

3日間ではどうしても実践的なことはできないし、プロトタイピングや技術の研修みたいなことをして筋トレして結果にコミットしましょうとのこと.

オフィスは白金台にあり、綺麗なところだったけどランチの値段も異常だし家賃も異常らしく住むのは難しそう
白金台で安いランチ尋ねたら東大の学食勧められたりした.

ちなみにWantedlyはジョジョが好きらしく、僕がメンターさんと面談することになった会議室の部屋の名前はクレイジー・ダイヤモンドだった. アニメ4部楽しみですね.

1日目

1日目はプロトタイピング お題として「シゴトでココロオドル」というWantedlyっぽいテーマが与えられて1日でアプリケーションのプロトタイプを作るという感じでした。

プロトタイピングの成果はCEOの仲さんから何度かフィードバックを頂くこともでき、普段アイデアが思いつかずアプリ作れないマンとしては良い体験でした!

やっぱりユーザーが使う理由の動機付けとかって大事だよね。趣味で技術ドリブンで作るのは楽しいけどまず第一に考えるべきなのはユーザー様のことだよねってなった。

2日目

2日目はReact講義&Reactなどを用いた実践。夕方頃まではReact速習会受けてた、教材も分かりやすかったし上手くReact学習できて良かったです!!

その後はWantedlyの新卒学生用ページをAPIが与えられるので、Reactを使ってクライアントサイドを実装しなおそうということに。

モダンなフロントは普段あまり書いたこと無かったけれど最近マイクロサービスアーキテクチャとか流行ってるし良い練習になりました。

(ちなみに開発途中に本番の方にちょっとしたバグをいくつか見つけてメンターさんに報告したら次の日には直ってたので、こうやってシュッシュとissueが立ってすぐに本番に取り込まれるスピード感はベンチャーならではだなぁ)

3日目

前日の開発の続きとその発表、他のチームが思ったよりも高い完成度のものを発表してて、普段フロントやらないと言えども精進せねばならないなぁとか思った。

懇親会

見たこと無い食べ物が大量にあって凄かった... f:id:tanishiking24:20160314014815j:plain

Wantedlyのインフラ構成の話とか少しだけ聞くことができて楽しかったです!

まとめ

3日間という短い期間でしたがベンチャー気質の強い集団の中で過ごすことができたのは純粋に楽しい体験でした。
3日間ありがとうございました!

Scala でジェネレータを作ったり、遅延評価してみる

メリークリスマス!!!!!!
この記事は CAMPHOR- Advent Calendar 2015 の25日目の記事です.

Scala はまだ始めたばかりですがとりあえずジェネレータ作ったり遅延評価してみようと思います.

これまでの流れ

ジェネレータ

とりあえず1から順番に無限に数字を生成するジェネレータを作ってみます.
Scalaではクロージャを使うことで割と簡単に実現することができます.

クロージャは評価可能な局所変数と評価する関数をまとめたもので、以上の例のように状態を保持する、関数を返す関数のようなものを定義することができます.

上の例の無名関数は実行されるたびに局所変数numの値を増やしてからnum:Intを返します.

遅延評価

クロージャを使ったジェネレータでも遅延評価が実現できていることが分かると思いますが、Stream を使うことによって遅延評価を簡単に実現することもできます.

まずは Stream の簡単な例を見てみましょう. Stream は List によく似ています.

Stream(1, ?) とはどういうことでしょうか?
Stream は先ほど述べたように List に似ているのですが、List の tail には残りの List へのポインタが入っているのに対して
Stream の tail には lazy val (? の正体) が入っています. lazy val はもちろん実際に計算に値が必要になるまで評価されることはないため、Streamの要素は遅延評価され無限の長さを持つことができます.

以下の例はStreamを使って同様のことを実現したものです.

range は Stream型を返すので以上のように再帰的に定義することができます.

フィボナッチ数列を無限に返すストリーム

それでは Stream を使って無限にフィボナッチ数を返すストリームを作ってみましょう.
コードは以下のような感じになります.

何故これが無限にフィボナッチ数を返すストリームになるかを解説していきます.

以下のような表を見てみると分かりやすいかもしれません.
これはfibGenfibGen.tail などの Stream を正格コレクションに直した場合の数字列です.

1 2 3 4 5 #
1 1 2 3 5 fibGen.tail
0 1 1 2 3 fibGen
(0,1) (1,1) (1,2) (2,3) (3,5) fibGen.zip(fibGen.tail)
1 2 3 5 8 fibGen.zip(fibGen.tail).map(n => n._1 + n._2)

このようにfibGenをひとつシフトしてその和を足せば 残りのストリームを定義することができます.

追記

View

scala にはコレクションを仮想的に遅延評価するためにビューという機能があります.
Stream以外のコレクションはすべて正格評価されるのですが、任意のコレクションをビューという遅延評価される仮想的なコレクションに変換し、forceメソッドで正格評価されるコレクションに戻すことができます. 例えば以下のような感じです

Stream と違って無限リストを生成することは出来ませんが、異常に巨大なコレクションの一部のみを取得したい場合などは気軽に遅延評価をすることができて便利だと思います. 詳しくは Collections - ビュー - Scala Documentation を参照お願いします


CAMPHOR- Advent Calendar は延長します!!!
明日は@ryota-kaです. お楽しみに!

参考

pixivインターンに参加して中学生から使ってるpixivのコード見た

12/12(土), 12/13(日) の二日間で pixiv株式会社の短期インターンに参加してきました.

ssl.pixiv.net

pixivはほぼROM専ながらも中学生の頃からよく使っているサイトで(ちなみに今は大学3回生) その中身を触らせてもらっただけでなく、まだ新鮮なバグにも取り組まさせてもらえて最高だった!

f:id:tanishiking24:20151215165007j:plain:w300

はしゃいでいる様子

エントリー

2日間だけだし、面接もなく事前課題に対して出したプルリクの内容で決めるということらしかったのでかなり気軽にエントリーしたのを覚えてる.

事前課題

事前課題として与えられたのは脆弱性が含まれているという小さなウェブアプリケーション. その中から脆弱性を発見してそれを改善するプルリクを出すことで事前課題提出ということになった.(先進的っぽい!)

直せたのは一つだけだったけれど、ほかにもたくさん脆弱性はあったっぽいし もっと頑張りたかった...!

インターン開始

インターンが始まってみると まさかのpixiv本体のインターン1日前のスナップショットと その時点で本体に残ってたissue(社員もまだ手をつけてない?)から適当にメンター陣が選んだissue(15個くらい)をインターン生たちでつぶすという感じでした. 現場感あってすごい.

インターン生の開発環境として開発サーバーが与えられます. 開発環境のセットアップはほとんど自動化されてたりREADMEに詳しく書かれていたりしたのでサクサクっとストレスなく開発環境を整えることができて体験が良かった.

開発中

Github上でも現実でもメンターさんが手厚くフォローしてくれます.

f:id:tanishiking24:20151215163745j:plain 様子です

バグを直すのにpixivの重厚なコードに目を通す必要があったのですが、10年前からあるサービスなのにきちんと設計されていたので全然読みやすかった.

オフィス

すごい楽しげだった.

色使い凄いし集中できるのかなぁと思ってたけど 開発中は画面しか見てないから気にならないし、ふと周りを見回したら自分の好きな物(フィギュアとかイラストとか)が視界に入って幸せでした. 椅子も座り心地最高だった

f:id:tanishiking24:20151215171414j:plain:w400

絵馬凄い

総評

最終的には2日間で6つくらいのissueに対してプルリクを投げてOKをもらった(割と簡単めなissueにばかり手を出していたけど)

早めに作られたプルリクで良さそうなコードが本体に取り込まれるという感じで、結局僕の提出したプルリクでとりこまれることになったのは 1つで社内フレームワークに対するバグフィックスでした. 社会貢献できてよかった.

感想

楽しかったし勉強になった!

やはり自分はセキュリティまわりの知識が乏しいなぁという印象も受けたのでこれから勉強すべきことも分かった.(とりあえず徳丸本読みます)

pixivのエンジニアさんのレベルは非常に高く、会社の雰囲気も凄く楽しげで、こういう会社で働くのはとても楽しいだろうなぁ

懇切丁寧に指導してくれたメンターさんも二日間ながらも一緒にした皆もありがとうございました!