dogwood008の開発メモ!

最近のマイブームは機械学習, Ruby on Rails。中でも機械学習を使った金融商品の自動取引に興味があります。

最近話題のスポーツスーパープレー(野球とバスケ)(634文字)

野球とバスケのスーパープレー動画です。

f:id:dogwood008:20151108235140j:plain Photo by Michael R Stoller Jr ※画像は動画とは関係ありません。イメージです。

動画はどちらもニコ動から。

こういうの見ると「すげぇ!」ってわくわくするよね。

結局、八方美人は成立しないし、他人は理不尽な理由で叱責する(1532文字)

これくらいでいったい何がそんな逆鱗に触れるのか、といったことがなくはない。ネットだと顔が見えない分、余計にその要素が強くなる。

例え話をしよう。 あなたは飯屋でバイトをしていて、ある客から豆腐の注文を受けた。醤油とポン酢を選べて、その客はなんとなしにポン酢を選んだ。特にそこにこだわりはなさそうに見える。

いざ厨房へ行ってみると、ポン酢はちょうど在庫を切らしている。仕方がないので「お客様、申し訳ございません。只今ポン酢をきらしておりまして、醤油しかご用意できません。如何致しましょうか。」と例の客に聞いた。これが逆鱗に触れ、「俺はいつもポン酢で食べるんだ!なぜ醤油しかないんだ!」と叱責される。

そりゃ店長が入荷をミスったか、バイトリーダーが在庫をいい加減に数えたか、おそらくそのへんだろう。しかし、客は別にそれを聞きたい訳じゃない。怒ったところでポン酢が泉の如く湧き出てくるか、といってそんなことはありえないのは自明である。もしそんな泉が存在すれば、私は大変嬉しい。

結局のところ、例の客がポン酢豆腐を食えなかった理由は明確にただ一つである。店長が、バイトリーダーが、とか、そんなのは関係ない。「この店に来てしまった」つまり、「運が悪かった」のである。従って、アルバイトであるあなたが例の客に叱責された理由も「運が悪かった」ためである。

結局のところ、人の気持ちなんて虫の居所次第であり、唯一コンピュータと同じなのは「バグが全ての原因である」ということなのだ。

【期間限定】1000円でできるCoCo壱番屋(ココイチ)でのおすすめメニュー 夜食ったら幸せが持続したまま寝られる【11月末まで】【広告記事では無い】(876文字)

こんにちは。皆さんご存じ、カレー店のCoCo壱番屋(通商ココイチ)で豪遊する方法です。 やり方は簡単。

  1. 店に入る
  2. おもむろにメニューを取り出し、「メンチカツカレー (700 or 721円)」と「蒸し鶏と大根の塩ダレサラダ(288円)」を頼む
  3. 蒸し鶏と大根の塩ダレサラダだけ先に来るので、カレーが来るまでに食い始める
  4. カレーも頂く
  5. 幸せ (988 or 1009円)

蒸し鶏と大根の塩ダレサラダ f:id:dogwood008:20151106001521p:plain 「蒸し鶏と大根の塩ダレサラダ」 - ココイチのメニュー|カレーハウスCoCo壱番屋より引用

メンチカツカレー f:id:dogwood008:20151106001721p:plain 「メンチカツカレー」 - ココイチのメニュー|カレーハウスCoCo壱番屋より引用

この塩だれサラダの塩だれが本当にウマい。1人で2皿はぺろっと食べられてしまうくらいの旨さ。 11月末で無くなってしまうので、まだの人は是非食べて頂きたい。なんなら、カレーよりもこのサラダだけでも食べて頂きたい。(良識ある大人はやめよう)

そしてメンチカツ。揚げたてカリカリの旨いメンチカツを塩だれでしょっぱくなったところに駆け巡る。冷たい塩だれと熱々メンチカツのハーモニー。そして定番のカレーの漁夫の利状態。これ。

しかも先にサラダを食べておくことで、カレーライス(というよりは米)を食ったときに上がる血糖値を、上がりにくくするこうかまであるのです! www.kewpie.co.jp

重ねて言いますが、蒸し鶏と大根の塩ダレサラダは期間限定です。まだの人は是非ココイチへ足を運んでみてください。 なお、この記事はココイチからお金をもらって書いているのではないことを付記しておきます。

Rubyスクリプト内からシェル実行するときに、クォートの面倒な処理を全部引き受けてくれるモジュール「Shellwords」

f:id:dogwood008:20151106000435p:plain image by Tom Schaub

ongaeshi.hatenablog.com

詳しい話はid:tuto0621さんのブログに譲るとして、10秒で何ができるかを説明する。

こんな感じで使える。

require 'shellwords'

system("ls #{Shellwords.escape(ARGV[0])}")

こんな仕組み。

irb(main):013:0> Shellwords.escape("foo bar.txt")
=> "foo\\ bar.txt"
irb(main):014:0> Shellwords.escape("a+b+c bar.txt")
=> "a\\+b\\+c\\ bar.txt"

便利。

Kotlinの公式リファレンスを翻訳してみた(一部) - 基本文法

f:id:dogwood008:20151018001028p:plain

Kotlinの公式リファレンスを翻訳してみました。まだ一部ですが、ぼちぼち進めていきたいと思います。


基本文法

パッケージの定義

パッケージの記述は、ソースファイルの先頭になければならない。

package my.demo

import java.util.*

// ...

ディレクトリやパッケージに合致する必要はない。 ソースファイルをファイルシステムの任意の位置に置くことができる。

Packagesを参照のこと。

関数の定義

2つのInt型の引数を持ち、Int型を戻り値とする関数:

fun sum(a: Int, b: Int): Int {
  return a + b
}

実体と推論された戻り値の型を持つ関数:

fun sum(a: Int, b: Int) = a + b

意味のある値を返さない関数:

fun printSum(a: Int, b: Int): Unit {
  print(a + b)
}

Unit型の戻り値は、省略できる:

public fun printSum(a: Int, b: Int) {
  print(a + b)
}

Functionsを参照のこと。

ローカル変数の定義

1度だけ代入できる(読み取り専用)ローカル変数:

val a: Int = 1
val b = 1   // `Int`型が推論される
val c: Int  // 初期値が与えられない場合、型指定が必要
c = 1       // 明確な代入

Mutable(可変)な変数:

var x = 5 // `Int`型が推論される
x += 1

Properties And Fieldsも参照のこと。

Stringテンプレートの使用

fun main(args: Array<String>) {
  if (args.size() == 0) return

  print("First argument: ${args[0]}")
}

String templatesも参照のこと。

条件式

fun max(a: Int, b: Int): Int {
  if (a > b)
    return a
  else
    return b
}

if{: .keyword }を式のように使用することもできる:

fun max(a: Int, b: Int) = if (a > b) a else b

if{: .keyword }-expressionsを参照のこと。

null許容変数の使用と null{: .keyword }のチェック

null{: .keyword }値を許容するのであれば、明示的にnull許容であると表記しなければならない。

もしstrが整数値を持たなければ、 null{: .keyword }を返す:

fun parseInt(str: String): Int? {
  // ...
}

null許容値を戻り値として返す関数を使う:

fun main(args: Array<String>) {
  if (args.size() < 2) {
    print("Two integers expected")
    return
  }

  val x = parseInt(args[0])
  val y = parseInt(args[1])

  // `x`, `y`はnullが入っていることがあるので、`x * y`はエラーを引き起こす
  if (x != null && y != null) {
    // `x`と`y`は、nullチェックの後自動的に非null許容型へキャストされる
    print(x * y)
  }
}

or

  // ...
  if (x == null) {
    print("Wrong number format in '${args[0]}'")
    return
  }
  if (y == null) {
    print("Wrong number format in '${args[1]}'")
    return
  }

  // `x`と`y`は、nullチェックの後自動的に非null許容型へキャストされる
  print(x * y)

Null-safetyを参照のこと。

型チェックと自動キャストの使用

is{: .keyword }演算子は、式がその型のインスタンスであるかを確かめる。 もし可変なローカル変数やプロパティが特定の型でチェックされれば、明示的にキャストする必要はない:

fun getStringLength(obj: Any): Int? {
  if (obj is String) {
    // `obj` はこのブランチ内では自動的に`String`へキャストされる
    return obj.length
  }

  // `obj` は型チェックが行われたブランチ外では、まだ`Any`型である
  return null
}

or

fun getStringLength(obj: Any): Int? {
  if (obj !is String)
    return null

  // `obj` はこのブランチ内では自動的に`String`へキャストされる
  return obj.length
}

or even

fun getStringLength(obj: Any): Int? {
  // `obj` は`&&`の右側では自動的に`String`へキャストされる
  if (obj is String && obj.length > 0)
    return obj.length

  return null
}

Classes and Type castsを参照のこと。

forループの使用

fun main(args: Array<String>) {
  for (arg in args)
    print(arg)
}

or

for (i in args.indices)
  print(args[i])

for loopを参照のこと。

whileループの使用

fun main(args: Array<String>) {
  var i = 0
  while (i < args.size())
    print(args[i++])
}

while loopを参照のこと。

when式の使用

fun cases(obj: Any) {
  when (obj) {
    1          -> print("One")
    "Hello"    -> print("Greeting")
    is Long    -> print("Long")
    !is String -> print("Not a string")
    else       -> print("Unknown")
  }
}

when expressionを参照のこと。

範囲の使用

in{: .keyword }演算子を使用すると、ある数が範囲内にあるかをチェックできる:

if (x in 1..y-1)
  print("OK")

ある数が範囲外かチェックする:

if (x !in 0..array.lastIndex)
  print("Out")

範囲内で反復する:

for (x in 1..5)
  print(x)

Rangesを参照のこと。

コレクションの使用

コレクション内で反復する:

for (name in names)
  println(name)

コレクションがあるオブジェクトを含むかを in{: .keyword }演算子で調べる:

if (text in names) // names.contains(text) が呼ばれる
  print("Yes")

関数リテラルをfiltermapのコレクションとして使用する:

names
    .filter { it.startsWith("A") }
    .sortedBy { it }
    .map { it.toUpperCase() }
    .forEach { print(it) }

Higher-order functions and Lambdasを参照のこと。

カップ焼きそば+生卵+無糖炭酸水は至高の味

例えば焼きそばUFO。一平ちゃんでも良い。

こいつをいつも通り作った後、LLサイズの生卵をポトンと落としてかき混ぜる。

生卵UFO、無糖炭酸水、生卵UFO、無糖炭酸水の順で頂く。これが至高。 生卵とソースが絡み合って口の中がマッタリしたところに、炭酸水がシュワーッと駆け抜ける。これ。

無糖炭酸水を推奨するけど、必須では無い。(ただし、焼きそばのソースが既に甘いので、おすすめはしない。)

生卵+カップ焼きそばはよくある旨い食べ方だと思うが、そこに無糖炭酸水をプラスして提唱しているのは自分だけではないだろうか。