近況ですが、java での開発から C/C++, JavaScript を使った開発が今はメインになっています。 現在、ざっくりとした要求仕様から、[基本仕様]-[詳細仕様] が確定していない状態で開発するスタイルが板に付いています。実装(コーディング)前の設計段階で、…

3年以上放置して思い出したように更新しています。久しぶりにというか、書いていたことも忘却しかけている。しばらくすると放置状態になってしまうので、過去の仕事のことなどを日記に書き残していこうかなと思っています。長い間プログラマー・SEとして、仕…

要求仕様問題プロジェクト その過程

要求仕様に関しては、いつも確定しないまま実装に入ってインクリメンタルな開発を行うことが多かった。しかし、ついこの前の組み込み系通信システムの開発は完全なウォーターフォール型でした。結果はなんとか結合テストまで完了しましたが、その過程は散々…

要求仕様化問題

3年以上も放置状態だったんですね。 久しぶりに更新します。現在も、3年前とかわらずプログラマとして働いています。この3年間の変化として、短期間ですが、違う開発のお仕事を経験しました。 未経験の開発環境、カテゴリでの開発でした。 業務系のWindowsア…

ByteBuffer は便利 DataInputStream の readFully みたいに指定サイズを Byte バッファに読み込んで ByteBuffer にして返すメソッド。 この時のデータはリトルエンディアン import java.nio.{ByteBuffer,ByteOrder} ..snip.. def read[S

夏休みが終わり(ByteBufferと文字列エンコーディング)

今日で8月も終り。 はやかった今年の8月も。あっという間でしたが、夏休みは3日間いただきました。でも宿題が残っている..

[Scala] java のアレは scala でどう書くの

基本的なことでも慣れないうちは、どう書けばよいかと、ググる日々.. scala でプログラミングし出して慣れない scala で java のアレはどう書くのか? と簡単な処理でも勝手が違うので少し戸惑った事。 byte バッファ java だと byte[] buffer = new byte[siz…

構造的部分型(Structural Subtyping)

型の階層構造とは関係なく特定のメソッドを定義して、このメソッドを持つ型として定義できる。 Ruby や python のダックタイピングと同じようなもの戻り値の型が Unit で引数無しの close メソッドを持つ型を構造的部分型として指定 def using[S <: { def close(): Unit }, U](s: S)(f: S => U): U = { </:>…

上限境界、下限境界

上限境界、下限境界を指定して型パラメータまたは抽象型の型に制限をつけることができる。 上限境界(upper bounds) [T : T は、型 Parent のサブ型(子の型)を参照 型パラメータまたは抽象型の型のスーパー型(親の型: Parent)から許可 サブ型への境界は Nothi…

型パラメータの変位指定(variance)

型パラメータで型の横に共変(+), 反変(-)の変位アノテーションを付けて変位指定ができる。 変位指定アノテーションを付けない場合は非変(nonvariant)になる。 どのパラメータ型を渡せるかの3種類の規則を指定。 共変(covariant) 型コンストラクタに共変の変…

暗黙の型変換 (implicit conversion)

型変換用の関数の定義に implicit つけると型変換が必要な場面で自動的に型変換関数が実行される。例えば forへ指定する Int to Int で暗黙の型変換が使用されている。 1 to 3 は RichInt の to メソッドから Range(1,2,3) が返される。 1 の Int は、暗黙の…

パターンマッチ (基本のメモ)

パターンマッチは条件分岐を記述する switch 文に似た構文 主にデータの比較、分解、抽出の用途で使用する。 実行時に該当するパターンが選択肢にない場合は scala.MatchError が発生する。 switch の default はないが、default と同等のパターンとしてワイ…

Option#getOrElse

前に勉強用に書いたXMLファイルの要素と属性の表示「XMLファイルの要素と属性をベタに表示」はXMLファイルにXML宣言がない場合は処理できなかったので、Opttion#getOrElse でXMLファイルにXML宣言がない場合は、デフォルトのエンコーディングに UTF-8 を指定…

XMLファイルの要素と属性をベタに表示

XMLファイルを読み込むプログラムを勉強がてらつくりました。Scala は XML 操作が便利。 scala.xml.parsing.ConstructingParser に Source を渡すとXML操作用の Document が取得できるので Node を使って要素のラベルと値、属性、子要素をすべてベタに表示。…

ベンチマーク

Scala で処理時間を計測する Benchmark trait があったので 試しに 1から100万の整数要素を持つリストの各要素を合計する計算処理の時間を、 末尾再帰関数、forループ、whileループ、List の sum で計測してみた。Benchmark の runBenchmarkメソッドは引数の…

再帰

関数型言語では、副作用のないプログラムを行うため繰り返し処理はループではなく再帰を使用。 ただ、Scala で限定的に使用するループで副作用(変数の更新)があっても特に問題なさそうだが、やはりできるだけ副作用のない再帰を使いたい。 再帰のサンプルは…

関数型言語を採用する時の壁

副作用のない処理、パターンマッチ、ケースクラス、ファーストクラス関数、高階関数、クロージャ、カリー化、関数部分適用、末尾再帰、アクター、並列処理、型推論.. それぞれが関連しあって簡潔なコードが書けて、副作用によるバグも減少できるメリットがあ…

暗黙の引数 (implicit parameters)

引数の型に合わせた暗黙の値を指定しておくと、関数(メソッド)呼び出し時の引数を省略できる。 関数定義の引数リストで引数名の前に implicit を付けると暗黙の引数が適用される。 引数を省略しないときは関数呼び出し時の指定値がそのまま渡される。 implic…

桜満開ですが、明日は雨

最近、早起きできていなかったので、ひさびさに早起きした。仕事は少しだけ中だるみ状態。Scala の勉強をぼちぼちと進めているので、仕事で実用的に使える機会をなんとかつくりたいがなかなか難しい。あっ、こんな時間、出勤しなくては..あと、関数型プログ…

Stream

Listとほぼ同じで、違いは実際に要素が指定されるまで作成が遅延される。 要素が無限に続くリストや要素数を事前に決められないリストとして表現できる。Stream.cons は List の :: と同じように 先頭要素とリスト(Stream)を連結する。 cons は Streamコンパ…

遅延評価

名前渡し引数(by-name parameter) 名前渡し引数は、メソッド内で引数の名前が実際に使用される時に評価される。 引数が複数回参照される場合は、参照される度に評価される。 引数の型の前に => を付ける。(引数名: => 型) Scala は通常は、値渡し(関数を呼び…

デフォルト引数、名前付き引数

デフォルト引数 関数、メソッドの定義で引数にデフォルト値を指定できる。 デフォルト引数は引数の一部またはすべてに指定できる。 デフォルト引数は、関数、メソッドの定義の際に 引数名: 型 = デフォルト値 の形式で定義する。 可変長引数と併用することは…

リストバッファ

ListBuffer は mutable (変更可能) な List。 頻繁に追加、変更する場合は List だと新規に List を作成し直すため処理効率が 低下するので、そんな場合に ListBuffer を使用します。ただし Scala は ListBuffer を暗黙には import していないので、使用する…

List の使い方(続き5)

List の高階メソッド ( exists, forall, sortWith, foldLeft, foldRight ) 特定の条件に合致する要素があるかを判定する リストの要素中に条件に合致する要素があるかどうかを判断する。 要素を引数にとりBooleanを返す述語関数を引数に指定する。 要素中に1…

List の使い方(続き4)

List の高階メソッド ( foreach, map, filter, find, partition ) foreach すでに、何度も使用している foreach はリストの各要素に対して、 引数で指定された関数を適用させる。 foreach に指定する引数は、1つの引数をとり戻り値が Unit(戻り値無し) の関…

部分適用関数、カリー化

部分適用関数 複数の引数をとる関数の引数の一部に値を指定し、残った引数を未適用にした状態の 部分適用関数を作成できる。foo の3つの引数の内、真ん中の引数を未確定にして前後の引数を指定した 部分適用関数値を pa に代入。 pa は foo の真ん中の引数だ…

ローカル関数、プレースホルダー

ローカル関数 関数定義のスコープ内に、関数を定義できる。 同じスコープ内からしか見えないローカル関数になる。 ローカル関数は外側の関数の引数や変数にアクセスできる。 scala> def foo(list: List[String], n:Int) = { | def bar(s: String) = if (s co…

引数の事前条件チェック

コンストラクタの引数や関数の引数がある条件を満たしているかの 事前のチェックは、require を使用する方法がある。 scala> def foo(a: Double, b: Double) = { require(b != 0); a / b } foo: (a: Double, b: Double)Double scala> foo(5, 2) res0: Double…

[Scala] Play 2.0

Play 2.0 *1 の勉強用に貼り付けました。(勉強はこれから) Play framework Play 2.0 Play framework (日本語) Play 2.0 (日本語) 3ヶ月程前の記事ですが、Java から Scala へ .. 見たいな雰囲気。http://www.infoq.com/jp/news/2011/12/playframework-typesa…

副作用

関数型プログラミングでは「メソッドはどんな副作用(side effect)も持ってはならない」 *1 *2 という発想があります。 仕事でも、副作用がないプログラミングはバグを減らせる御利益があると思って java のプログラムで複数のオブジェクトが参照する Map や …