応急的にYosemiteでCoreutilsを使う

はじめに

YosemiteにアプデするとHomebrewのCoreutilsが使えなくなる問題があって、brew link coreutilsシンボリックリンクが生成されないのが根本的な問題っぽいんだけど、修正待ってられないので応急処置を施す。

やりかた

実行ファイルが/usr/local/Cellar/coreutils/`version`/libexec/gnubinにあるのでパス通せばいい

export PATH=/usr/local/Cellar/coreutils/8.23/libexec/gnubin:$PATH

みたいな。バージョン上がったら使えなくなるけど、その頃には直ってるやろ。修正されたら消すのを忘れずに(いつまでも古いバージョン実行し続ける

Play Tips

はじめに

Play使ってて困ったことと解決方法纏めてみた。

カンマ区切りしたい

JavaのString.formatの書式で、%,dとかすると、数値にカンマ付けられる。

ScalaのString Interpolationを使えばこんな風に。

f"${num}%,d"

Play Templateでもこんな風に

@{f"${num}%,d"}

以下サンプル

https://github.com/ponkotuy/MyFleetGirls/blob/fb4f3681ca9ba13a84b6bb141cccef66367f57be/server/app/views/user/statistics.scala.html#L38

JavaScriptライブラリ管理

MyFleetGirlsという自作アプリでは、JavaScriptのライブラリはcdnjsから取ってくることにしている。リポジトリにjs入れるのはライセンスとか面倒くさいし、ビルドツール側でjsライブラリを持ってくる仕組みを整えるのは面倒くさかったからである。

ただ一方で、この状態でページ数が増えると、ライブラリのバージョンアップがひどく面倒くさくなる。また、複数バージョンが乱立したりしたら元も子もなくて、jsのロードが増えてページが重くなったりと、いいことがまるでない。

という訳で、cdnjsのURLを一元管理するようにした。

https://github.com/ponkotuy/MyFleetGirls/blob/ac6bbcae5df5b66031d7483e119685813df59a68/server/app/views/Js.scala

使い方はこんな感じ

https://github.com/ponkotuy/MyFleetGirls/blob/ac6bbcae5df5b66031d7483e119685813df59a68/server/app/views/user/dock.scala.html#L2

コメントにもあるように、Template全体でimportしたいならsbtに以下のように設定すればいい

TwirlKeys.templateImports += "views.Js"

エロゲ回想シーンのスクショを自動で取る

はじめに

30億のデバイスで動くJava(とScala)でエロゲ回想シーンの自動スクショを取るツールを作ってみた。

要件

とりあえず必要なのは、

  • WindowのタイトルからWindowの範囲を取得する
  • プログラム側から自動でクリックする
  • Windowをアクティブにする
  • スクショを取る
  • スクショと画像を比較する - 回想シーンの終了判定で必要です

Window情報を取得

JNAを使ってWindows APIを叩く。

自動クリック

java.awtのRobotを使う。

Windowをアクティブにする

Window情報からRobotでクリック。

スクショを取る

Robotでいける。

画像比較

上記のBufferedImageと、ImageIOで画像ファイルをロードして生成したBufferedImageをgetColorで比較。

チョットハヤイLongMapを計測してみる

Scaladoc調べてたらLongMapとかいうのを発見した。2.7からimmutableなLongMapが、2.11でmutableなものが実装されている。

Scaladocによると「Longに特化したHashMapでHashMapよりはやい」とのことなので軽くテストしてみた。

import scala.collection.immutable.LongMap
import scala.util.Random

object Main {
  val Max = 1000000L
  val Xs = (0L to Max)
  val random = new Random()
  val randoms = Xs.map(_ => math.abs(random.nextLong % Max))

  def main(args: Array[String]): Unit = {
    println("Map: " + timer {
      val map = Xs.map(it => it -> it.toString).toMap
      randoms.map(map.apply)
    }.toString)

    println("LongMap:" + timer {
      val map = LongMap(Xs.map(it => it -> it.toString):_*)
      randoms.map(map.apply)
    }.toString)
  }

  def timer(f: => Any): Long = {
    val start = System.currentTimeMillis
    f
    System.currentTimeMillis - start
  }
}

計測結果は、

Map
1387ms
LongMap
1030ms

言うほど差が出る訳でも無さそう…?

BitBucketでpull requestのcommitをローカルで試す

最近会社でBitBucketを使うことが多いのだけど、色々分からん操作があって、しかもググってもGitHubほどすぐ分からなかったりする。

今回はBitBucketのpull requestをローカルで試したいときにどうするかという話。実はpull requestのURLでpullするだけだった

git pull https://bitbucket.org/ponkotuy/MyFleetGirls/pull-request/7/wip/diff

GitHubと比較して、ls-remoteしても、pull requestらしきブランチ出てこないし、BitBucketはこの点に関して、実装を隠蔽する方向らしい。

JSONログのUNIX Timeを読みやすくする

はじめに

JSONでログためてると、

{"time": 1408715718, ...}
{"time": 1409718175, ...}
...

みたいなデータを人間が見えるようにしたいとかいう要望は結構あると思いますが、そんなときにシェル1行で見えるようにしたメモ

コマンド

cat orig.txt | jq '.time' | sed -e "s/^/@/" | xargs -n1 date "+%m/%d %H:%M" --date | paste -d , - orig.txt

解説

jq

JSONパーサ。かなり便利で、.がルート要素、.timeでルート直下のtimeを取れます。複数行にわたっててもよしなにやってくれました。

sed

言わずもがな。頭に@付けただけです(dateが解析に必要)

xargs

-n1で1コマンドあたり1つの引数に制限できるので、それぞれの行に対してdateを呼び出すのに使いました。

date

--date "@1408715718"とかやると、UNIX Timeを読める形式に直してくれます

paste

行毎に結合できます

awk使うバージョン

awkで日付処理してる

cat orig.txt | jq '.time' | gawk '{ strftime("%m/%d %H:%M",$0); }' | paste -d , - orig.txt

add-apt-repositoryしようとしたら困った話

add-apt-repositoryとは

ぼくもちゃんと分かっている訳ではないけど、aptに野良リポジトリの登録を簡単にする支援ツールみたいな奴。

MariaDBなんかは公式で用意しているので

https://downloads.mariadb.org/mariadb/repositories/#mirror=yamagata-university&distro=Debian&version=10.0&distro_release=sid

こっからrepository追加すればapt-get updateで自動更新までやってくれる訳だ。

で、MariaDBのrepositoryを追加しようとしたらハマった。

解決方法

なんかMariaDBの解説とはadd-apt-repositoryの実行ファイルが入ってるパッケージが異なるっぽい。最近変わった模様?新しいパッケージはsoftware-properties-commonだから、こちらをインストールしたら問題なく動いた。

ちなみにこれはapt-fileでadd-apt-repositoryを検索することで見つけることができた。apt-file便利