Scala勉強会@東北

みんなのコード

新規コードの追加は、こちらへお願いいたします。

サンプルプログラムから凄いコードまで、ライセンス上問題ない自作のコードならなんでも結構です。
どんどん紹介して下さい。勉強会で鑑賞したいと思います。
コードは、CodeBinPastieGist 等に置いておくと、ブラウザ上で行番号付で参照できるので、説明する時に楽になるでしょう。

ViewImagesInFeed.scala

  • friendsfeed 経由で Flickr の新着イメージの feed を取得して、定期的に各々のサムネイルを表示します。
  • feed からイメージの URL を取得するのに、XML を処理しています。
  • 定期的に feed を取得したり、イメージを書き換えるのに Actor を使っています。
  • > scalac ViewImagesInFeed.scala
  • > scala ViewImagesInFeed
  • ymnk
  • scalaでswing
  • (初等数学的な意味の)関数をプロットします。
  • > scalac jp/takeda_soft/examples/Plotter.scala
  • > scala jp.takeda_soft.examples.Main
  • ※package切っちゃった、ごめんなさいごめんなさい><
  • takedasoft

TwitterTimeline.scala

  • Twitter API を用いて Timeline を取得し表示します。
  • 特筆すべきことはありませんが、java で書くよりは簡潔になりますね。 
  • > scalac TwitterTimeline.scala
  • > scala TwitterTimeline
  • > scala TwitterTimeline username passwd
  • ymnk

LoanProcessor.scala

  • 元利均等方式の毎月返済額と年間返済額を計算します。
  • 借り入れ金額、返済年数、金利を入力します。
  • 計算を押すと計算します。
  • > scalac LoanProcessor.scala
  • > scala xibbar.LoanProcessor
  • ※package深いといやーね。w
  • xibbar

Case.scala

  • case classを使って構文木を計算するだけです。 
  • > scalac Case.scala
  • > scala Case
  • h_sakurai

CompileAndLoad.scala , CompileAndLoad2.scala

  • 標準入力から文字列を読み込んでコンパイルし、JVM内へ動的に load します。
  • 評価結果が (String)=>_ な無名関数だったら、"Hello" を適用して結果を出力します。
  • scala 2.7.2.RC* が必要です。
  • > scalac CompileAndLoad.scala
  • > echo "(x:String)=>x.reverse" | scala CompileAndLoad
  • ymnk

Nabeatsu.scala

  • implicitでIntを拡張してみました。
  • ベタですみません。
  • > scalac jp/takeda_soft/examples/Nabeatsu.scala
  • > scala jp.takeda_soft.examples.Nabeatsu
  • takedasoft

DynamicPlotter.scala

  • takedasoftさんの Plotter.scala へのオマージュ。
    CompileAndLoad2 を使って動的に数式を コンパイルして描画します。
  • scala 2.7.2.RC* が必要です。
  • > scalac DynamicPlotter.scala Plotter.scala CompileAndLoad2.scala
  • > scala DynamicPlotter
    実行後、標準入力に無名関数を入力して見てください。例えば、(x:Int)=>x+10
  • ymnk

Calc2.scala

  • 四則演算をします。
  • 正規表現で字句解析
  • パターンマッチングで構文解析
  • スタックマシンのコードにリストとしてコンパイル
  • スタックマシンとして実行
  • > scalac Calc2.scala
  • > scala Calc2 1*2+3*4
  • h_sakurai

RealtimeTakahashiMethod.scala

  • 高橋メソッドをやります
  • コンソールでテキストを入力し、エンターを押します。
  • すると、ウィジェットに表示されます。
  • > scalac RealtimeTakahashiMethod.scala
  • > scala xibbar.RealtimeTakahashiMethod
  • 相変わらず特別なことは何もしてません。
  • せめてブロックを使ったコードを書きたかったけど、無理するのヤメた。
  • xibbar

TakahashiMethodInScalaSwing.scala

  • xibbar さんの RealtimeTakahashiMethod.scala を scala.swing パッケージで実装してみました。
  • おまけで、コンソールでテキストを入力するのが面倒だったので、
    web から文字列を拾ってきて表示するようにしてみました
    みたいな
  • > scalac TakahashiMethodInScalaSwing.scala
  • > scala TakahashiMethodInScalaSwing  
  • ymnk

calc3.scala 

  • Calc2.scala の変更バージョンです。
  • 字句解析をストリームを使って行うようにした。(評価は1回だけだけど遅延される。また、位置をトークンに保存する。)
  • コンパイルを:::演算子を使わず、::演算子で結合することで高速化。(最後reverseする)
  • エラー箇所を出す。
  • fscかわいいよfsc
  • > fsc calc3.scala
  • > scala calc3.main
  • h_sakurai

topdownop.scala 

  • 再帰下降型の演算子順位法によるパーサの例です。
  • この方法が簡単で美しいと思っていて、自分の作っている言語のパーサに使おうとしてます。
  • 文法要素を増やさなくても演算子の優先順位を指定するだけで優先順位を持った式を表すことができます。
  • ソースも短い
  • ほとんど、ducktypingで再帰もほとんど使ってないので簡単だと思います。
  • この手法だと、動的(実行時やコンパイル時)に演算子を定義して使うことが可能。
  • 複雑な文法にはおそらく不向き。マイナーな構文解析方法。
  • > fsc topdownop.scala
  • > scala topdownop.main
  • h_sakurai

ftdop.scala 

  • topdownop.scala を関数型言語的に書き換えたものです。
  • 副作用なしで、末尾再帰を使って最後まで計算します。
  • 構文解析のロジックは8行
  • > fsc ftdop.scala
  • > scala ftdop.main 1*2+3*4
  • h_sakurai

XML2JSON.scala

  • XMLデータをJSON形式へ変換します。
  • 以前、scala.xml.Node を XPath スタイルでアクセスしてみました。
    今回は再帰的になめてまわるには?ということでやってみました。
  • > scalac XML2JSON.scala
  • > scala XML2JSONTest
  • ymnk

ExtendCookBook.scala

  • 初心者向け
  • typeの使い方、継承、オブジェクトの生成の仕方についていろいろなやり方を盛り込んでみました。
  • > scalac jp/takeda_soft/examples/ExtendCookBook.scala
  • > scala jp.takeda_soft.examples.ExtendCookBook
  • takedasoft

Calc2WithParserCombinator.scala

  • Calc2.scala で対象にしている数式の字句解析および構文解析を scala.util.parsing.combinator package に含まれているパーサーコンビネータを用いて実装してみました。
  • > scalac Calc2WithParserCombinator.scala Calc2.scala
  • > scala Calc2WithParserCombinator '1*2+3*4'
  • ymnk

JSON2XML.scala

  • scala.util.parsing.json.JSON という object があるので、これを使ってなんかできないかということで、 JSON形式の文字列をXMLデータへ変換するプログラムを書いてみました。JSON -> XML への変換を必要とする局面はあまりないでしょうけど...
  • > scalac JSON2XML.scala
  • > scala JSON2XMLTest
  • ymnk

FriendOrFollow.scala

  • FriendOrFollow.com みたいなの。
    scala.collection._ パッケージの使用例としてちょうどいいかなと思い書いてみました。
  • > scalac FriendOrFollow.scala
  • > scala FriendOrFollowTest  screen_name twitter_user twitter_passwd
  • ymnk 

DragonPlotter.scala   (変型版)CaosPlotter.scala

  •  ドラゴン曲線を描くアプレット。アルゴリズム辞典から借用
  •  関数を取り替えていろいろなものが描けるようにしたい。
  • > scalac DragonPlotter.scala Plotter.scala
  • > scala takedasoft.DragonPlotter
  • takedasoft

SortingDemo.scala

  • scala.util.Sorting の使い方に絡めて view bounds '<%' の説明ができるかも...と思い書いてみました。
  • > scalac SortingDemo.scala
  • > scala SortingDemo  twitter_screen_name followers_count
  • ymnk 

GitLooseObject.scala

  • git の .git/objects/ の下にある looseな(packされていない)オブジェクトを読むプログラムです。
  • > scalac GitLooseObject.scala
  • git で管理されているディレクトリで、
    > scala GitLooseObjectTest .git/objects
  • ymnk 

DumpGenericsSignature.scala

  • .class ファイルを解析して、クラス及びメソッドの総称型を表示します。
  • .class ファイルの解析には、コンパイラ内で使われてる scala.tools.nsc.symtab.classfile.ClassfileParser を使っています。
  • > scalac DumpGenericsSignature.scala
  • > scala DumpGenericsSignature foo.class
  • ymnk 

pdr.scala

  • paradraw のpdrファイル(test.pdr)を解析して読み込んで、java2dで表示します。
  • PHPで作ってたMing用のものを移植しただけですけど、flashっぽくて嬉しいです。
  • >scalac pdr.scala
  • >scala pdr.main
  •  h_sakurai

ParttyServer.scala

  • Actorの題材として、いつもお世話になっている partty のサーバを書いてみました。
  • partty.org コマンドからの接続を他の partty サーバに relay しつつ、TCP port 7777 でゲストに対してサービスを提供します。
  • > scalac ParttyServer.scala
  • > scala ParttyServer
  • ymnk 

ftdop2.scala

  • ftdop.scalaを発展させてました。
  • 括弧(){}[]、関数呼び出しa()、配列アクセスa[]ブロックa{}
  • シンボル(識別子)を追加
  • 環境を用意して、変数への値の代入 例)a = 1
  • パーシャル関数を使って、... matchをなくしてみる。
  • 式の連結 1+1 2+2は 空白の意味を持つ@演算子というのを用意して
  • 接続していることに。
  • if else式も追加。
  • 前置演算子、後置演算子追加
  • >scalac ftdop2.scala
  • >scala ftdop2.main "a=2*3 b=3*4 a+b"
  • h_sakurai

PiMachinBig.scala, PiMachinBig2.scala

  • Machin の公式を使って、円周率をもとめます。
  • きしださんの書かれた java のプログラム(PaiMachinBig クラス)を、単にscala の implicit def を使って書いただけです。
  • > scalac PiMachinBig.scala
  • > scala PiMachinBig
  • ymnk 

ARCFour.scala, FilesOnWinny.scala

  • RFC4345 で参照されている、Arcfour を実装してみました。
  • 後者ですが、ARCFour.scala の動きの確認をかねて、p2p ネットワーク上に流れているファイル名を表示させてみました。
  • ymnk 

ftdop3.scala ftdop3Spec.scala

  • ストリームを使用するように変更。
  • 関数を追加。a=fun(c)c+1 a(2)で、3が返る。
  • h_sakurai
  • specsでテストケース書いてみました。scala -cp specs-xx.jar ftdop3.ftdopSpec
  • takedasoft

SkypeChat2Twitter.scala

  • Skype4Java を使った例題として、Skype Chat と Twitter 間でメッセージを相互にやりとりするプログラムを書いてみました。
  • ymnk 

to.scala ti.scala

  • k.inabaさんのこのへんにあった、MTTのパワーポイントの最初の変換プログラムを書いてみました。
  • MTTとはMacro Tree Transducerの略で構文木をパースして出力がなにかあるものってものみたいなやつみたいです。
  • http://www.kmonos.net/wlog/87.html#_1636080727
  • 簡単な、マッチングで、リストを変換するというもののようです。
  • 正直よくわかってません(汗

TmpFileSpec.scala , myProjFullSpec.scala

  •  scala用BDDフレームワーク specs を使ってみました。 
  •  specs-1.4.1.jar がCLASSPATHに必要です。
  •  テスト対象のTmpFile.scalaはあえて未実装を残しています。
  • takedasoft

MessengerHub

  • SkypeChat2Twitter.scala を発展させて、複数のメッセージングシステム間でメッセージをやりとりするようにしてみました。
  • メッセージングシステムへの接続を Connector(Messenger.scala) として抽象化。
  • RFC1459 を参照して、IRCの簡単なクライアントを実装しました(IRCConnecor)。
  • 現在は、Twitter、SkypeChat、IRC間でメッセージをやりとりできます。
  • ファイル数の制限のせいか MessengerHub を browser で表示できないようです。
    git clone git://gist.github.com/37415.git gist-37415 でソースを取得できます。
  • ymnk 

app.scala

  • scalaでアプレットを作って、proguardでjarファイルを圧縮するサンプルです。
  • scalaのコード自体はほとんど意味を成しません。
  • 詳しい説明は、はてなダイアリーに書きました。
  • h_sakurai

a patch for vscaladoc

ScalaSwing.scala

  • xibbar さんの "はじめての swing on jruby" シリーズでの例題を scala.swing API を使って書いてみました。
  • ymnk

ftdop4.scala

  • 関数がクロージャになるように変更
  • Lisp相当のマクロが使えるように変更
  • シンボルが使える
  • h_sakurai

osc.scala

  • FM音源をscalaで再生するアプリ、アプレット
  • MMLを書いて、ctrl+Sで再生、ctrl+Dで停止できる。
  • 元はwonderflのコレ
  • アプレットのアドレスはコチラ
  • h_sakurai

game.scala beep.scala pdr.scala

  • scalaで作ったjava2dを使ったゲームアプリ、アプレット
  • java audioを使った効果音も鳴ります。beep.scala
  • pdrファイル(画像データ)はgistには全部置けなかったので、アプレットのjarファイルから引っ張り出してください。
  • アプレットのアドレスはコチラ (実行にはjava6が必要です)
  • mkd で通常のscalaアプリを実行できます。mkrでapplet用のproguardで圧縮したjarが出来ます。
  • h_sakurai
  • ymnk: http://gist.github.com/54326 に java5 の環境でコンパイル・実行できる版を置きました。

HoppityHop.scala

  • Facebook Jobs にあった、Hoppity Hop! という(いわゆる Fizz-Buzz)問題です。
  • パターンマッチの例題として書いてみました。
  • ymnk 

RomanNumerals.scala

    AdaScript.scala

    RFBProtocol.scala

    LingrBot.scala

      • チャットサービス Lingr に接続して、メッセージの監視及び投稿を行う簡単なプログラムです。
      • 参考: Lingr API Documentation
      • ymnk 

      JOGLDemo.scala

      • Java OpenGLライブラリをscalaから使ってみました。今後関数っぽい何かを表示する予定
      • https://jogl.dev.java.net/
      • scalac -classpath "/jogl/lib/gluegen-rt.jar:/jogl/lib/jogl.jar" JOGLDemo.scala
      • java -Djava.library.path="/jogl/lib" -classpath "./classes:scala-library.jar:/jogl/lib/gluegen-rt.jar:/jogl/lib/jogl.jar" takedasoft.JOGLDemo
      • takedasoft
      • ymnk追記) JAVA_OPTS="-Djava.library.path=/jogl/lib" scala -classpath ".:/jogl/lib/gluegen-rt.jar:/jogl/lib/jogl.jar" takedasoft.JOGLDemo

      PostMultiPartFormData.scala

        • HTTP Post multipart/form-data を使って、ファイルやデータを転送するプログラムです。
        • 参考: RFC 1867
        • ymnk 

        ActorInSingleThread.scala

          • Actor を single thread で動かすデモです。
          • Google App Engine で Lift が動かない理由として、new Thread できないことがあげられています。ソースを見たところで、CometActor  をあきらめればなんとか動きそうな雰囲気なので、最小限の修正ですますのには flag を作って GAE では Actor を single thread で動かせばよい?
          • 追記: SingleThreadedScheduler を使っても、object Actor で java.util.Timer を new するため、GAE では exception が発生して動かない。また、lift 内部で平行性を前提にロジックを組んであるところがあるので、single thread では無理でした。
          • fsc ActorInSingleThread
          • マルチスレッド: scala ActorInSingleThread
          • シングルスレッド: scala ActorInSingleThread single
          • ymnk 

          CreateParser.scala

          • ParserCombinatorでSQLのCreate文をパースしてみました。
          • 利用方法として、Daoのジェネレータをつくってみました。実用できるまで頑張ってみる予定。
          • takedasoft

          TwitterStreamingAPI.scala

          • Twitter で最近サポートされた、Streaming API をたたくプログラムを書いてみました。
          • fsc TwitterStreamingAPI.scala
          • ymnk

          ScalaMobileTest.scala

          • 小ネタ。scala.mobileパッケージの使い方のメモです。
          • fsc TwitterStreamingAPI.scala
          • takedasoft

          lift-gae-jdo

          • GAE/J 上の Liftweb で JDO を使うサンプルプログラムです。
          • owned One-to-Many な関係にあるオブジェクトを扱います。
          • 参考: README
          • ymnk

          scalajdo

          • scalaからJDOを使うための wrapper クラスです。
          • ymnk

          chat

          • AJAX と Comet を使った、real-time chat アプリ。
          • Derek Chen-Becker さんのプレゼンで説明されているコードを実際に動くようにしたもの。
          • ymnk

          TwitterStreamingAPI.scala

          • Streaming APIの track をサポート。
          • track は最近追加されたもので、指定したキーワードを含むつぶやきを取得します。
          • fsc TwitterStreamingAPI.scala
          • ymnk

          track-keyword

          man-in-the-middle-attack

          dstream-client

          • 勉強会で使っている画面共有の仕掛けを改良して、外部の画面を表示できるようにしてみました。そのためのクライアントソフトです。
          • mvn scala:run で起動できます。
          • 起動する前に、http://lift.jcraft.com/dstream/ で Sign Up して、自分のチャンネルを登録しておくと、そこで画面を共有できます。
          • VNC または java.awt.Robot による画面生成を選べます。
          • 参考: PostMultiPartFormData.scalaRFBProtocol.scala
          • ymnk

          新規コードの追加は、こちらへお願いいたします。