Keep on moving

あんまりまとまってないことを書きますよ

PostgresqlでUpdate/Select

やってみたらできた。このへんはRDBMSごとに書き方が変わりそうだな

-- T1.date2にT2のdate2を月末にスライドして格納
 update T1 set date1=a.date1, date2= a.date2 from 
  (select id, date1,
    to_date(to_char(date2,'yyyy-mm-01'),'yyyy-mm-dd') 
     + interval '1 month' + interval '-1 day' date2 
    from T2) a 
  WHERE T1.fk_id = a.id;

Eclipse Collectionガンガン使おう

うまくまとまらないけど、つらつら書いてみようと思う。

vaskir's blog: Hash maps: Rust, F#, D, Go, Scala

読んでてScalaの数値があんまり良くない原因がコメント欄で書かれてた

Scala/JVM's boxing and unboxing is very slow in such a tight loop.
Eclipse collections may be useful.

https://gist.github.com/zakki/66d785b4a9d3c64bc9f8199d7e290e07 13x faster

ただ、元コードがRustでの

  • std::collections::{HashMap}へのキー追加
  • Vecで頭から参照しながら足してく

なので、int[]で計算してたのが気になったのでeclipseコレクションつかって計算してみた

  • org.eclipse.collections.impl.factory.primitive.IntIntMaps
  • org.eclipse.collections.impl.factory.primitive.IntLists
import org.eclipse.collections.api.list.primitive.MutableIntList;
import org.eclipse.collections.impl.factory.primitive.IntIntMaps;
import org.eclipse.collections.impl.factory.primitive.IntLists;

import java.util.Random;
import java.util.function.Supplier;
import java.util.stream.IntStream;


public class Main {

	private static <T> void  time(final String name, Supplier<T> func) {
		long s = System.nanoTime();
		func.get();
		System.out.println(String.format("%s: %d elapsed.", name, (System.nanoTime() - s) / 1_000_000));
	}

	public static void main(String[] args) {
		final MutableIntList source = IntLists.mutable.empty();
		final Random r = new Random();
		IntStream.range(0, 50_000_000).forEach(i -> source.add(r.nextInt()));

		time("Insertion", () -> source.injectInto(IntIntMaps.mutable.empty(), (x, y) -> {
			x.put(y, 0);
			return x;
		}));

		time("Lookups", () -> source.injectInto(0, (x, y) -> x + (y % 10)));
	}
// Insertion: 4793 elapsed.
// Lookups: 482 elapsed.
}

https://gist.githubusercontent.com/masahitojp/475f8da57fd54f56bf9d7786c1311f6a/raw/d9f208ea1c9e29d6b644fbdf38f41d4014074a5b/ECMain.java


それにしてもMapは遅いなぁ。。。
// Map
Insertion : 42535 elapsed.

// eclipse collectionを使用
Insertion: 1040 elapsed. 

まとめ


boxing/unboxingがきになるときはEclipese Collectionを積極的につかうべし

Ubuntu 16.04 でiPhone にUSB でインターネット共有する

Ubuntu 15.10 から16.04にアップグレードしたところiPhoneでUSBでつないでインターネット共有できなくなったので
つながるようにした時の作業内容をまとめます

iphethのインストー

これのインストールと有効化がひつようです。

Ubuntu – Details of package ipheth-utils in xenial

sudo apt-get install ipheth-utils
sudo modprobe ipheth

これで iPhoneをインターネット共有したあとでラップトップPCにUSBでつないで、インターネッツにつながれば成功

/etc/modules への登録


起動時に毎回modprobeするのが面倒なそこのあなた!そんな僕みたいなあなたは /etc/modules に以下のように追加しましょう。
ここに記入するときはmodprobeはいりません

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
ipheth



これでUbuntuラップトップでもスタバでどやりんぐできるようになれました

C++11/14でPython3を拡張する(pybind11)

ブログ書くの久しぶりだなぁ。。。
システムプログラムってやつを初めて勉強してるので、まとめときます。

tl;;dr

このライブラリをつかうとBoost::Pythonよりも簡単にC++11/1
でPython3を拡張できる。

github.com

簡単な使い方

TODO 後で書く

CMakeとの連携

TODO 後で書く

まとめ

コード

github.com

回文かどうかを判定する関数を実装して、いろいろ速度計測してみた

回文かどうかを判定する関数を書きたくなりまして、goで実装してみました。
回文 - Wikipedia


さくっとかけてしまったのでなんパターンか書いてみて一番早い書き方を探ってみました。
近頃仕事でJVM言語を書く機会が多いので、久々に違う言語でかくと楽しいもんですよねー

実装案

以下の4実装で比較してみました

  1. reverseして元の文字列と比較
  2. 文字列を最初/最後 => 2番目/後ろから2番目 => ...で比較
  3. ↑をutf8モジュールを使って実装
  4. ↑をutf8モジュール+rangeで回す実装

結果

というわけでutf8モジュール+rangeで回す実装が一番早いみたいです。
もっと良い実装を思いついた方がいましたら、ぜひ教えてください。

ArchLinuxでJava環境を整える

近頃プライベートではMac OS X or Ubuntu で開発することが多いのですが、
たまには気分転換に家の開発環境をArchLinux に変更してみました。

JDKとかを手で入れるしかないのかなーと思ってたら、 @ さんに
pacmanでいれられるコトを聴いたので早速設定してみました

ArchLinuxでのJava の管理法

こちらを参考にする。
Java (日本語) - ArchWiki

java-runtime-common と java-environment-common をインストールすることで使えるようになる
archlinux-java コマンドを使うことで切り替え可能。
ちなみに僕はOpenJDKは仕事ではまったことがあるので使わないことにしてます。

Oracle JDKのインストール

AUR (en) - jdk

こちらを入れる。

AURについてはこちらを参照する。

Arch User Repository (日本語) - ArchWiki

Oracle JDK をインストールすると、上記のarchlinux-java がPATHの設定をうまいことやってくれます。どうやらJAVA_HOMEはforce setting しない様子。

ここまで来るとIDEとかも動くはず。

JVM言語いれたり、プロジェクト管理ツールいれたり

maven , gradle, scala, sbt,clojure, leiningenとかをあとは入れていけばいいだけ
現状、 gradle, leiningen はAURから取得する必要があるけど、ほかはpacman でインストール可能。

まとめ

homebrewのほうが便利だと思ってたけど、Archはここらへんよく出来てました。