Skip to content

Instantly share code, notes, and snippets.

View takawitter's full-sized avatar

Takao Nakaguchi takawitter

View GitHub Profile
@takawitter
takawitter / Invoker.java
Created July 14, 2013 03:13
https://gist.github.com/takawitter/5985742 の件、IllegalAccessExceptionが起こる原因は別にScheme(kawa)に限らないので、Javaのみで再現させてみた。MainクラスとInvokerクラスは別パッケージ。これはスクリプト言語だけでなく、msgpack-rpcとかのRPCライブラリ系にもよくある話。
package pkg2;
public class Invoker{
public static void invoke(Runnable instance) throws Exception{
instance.run(); // ok
instance.getClass().getMethod("run").invoke(instance); // ng, IllegalAccessException
}
}
@takawitter
takawitter / InvokeJavaFromScheme.java
Last active December 19, 2015 16:39
kawaでJavaオブジェクトのメソッドを呼び出す方法は複数あるけど、匿名クラス(やpublicではないクラス)の場合挙動が変わってくる。そのまとめ。kawaはのバージョンは1.13。
import kawa.standard.Scheme;
public class InvokeJavaFromScheme {
public static void main(String[] args) throws Throwable{
Scheme s = Scheme.getInstance();
// objにRunnableを実装した匿名クラスのインスタンスを設定。
// runメソッドはRunnableインタフェースのメソッドだから、問題なく呼べるはず。
s.define("obj", new Runnable(){
public void run() {
System.out.println("hello");
@takawitter
takawitter / gist:5895868
Last active December 19, 2015 04:18
ThreadPoolExecutorに値を返すlambda(or closure)をsubmitしたい。submit(Callable<T> task)が呼ばれればOKなんだけど、ThreadPoolExecutorにはsubmit(Runnable task)も存在するので、普通にlambdaを渡すと曖昧性が解消できない。そのためCallable<T>を明示する必要があるが、その方法が言語によって違うって話。 ScalaとJythonとJRubyは直接やる方法が無さそうなので、ラッパークラスをかましてる。
/*
* tp は Executors.newCachedThreadPool 等を使って生成
*/
// Rhino(JavaScript)
tp.submit(new Callable({call: function(){ return 1;}}));
// Groovy
tp.submit({1} as Callable)
@takawitter
takawitter / ScalaInvoke.java
Created June 13, 2013 23:51
JavaからScalaを呼び出すコード。カレントディレクトリ直下のlibディレクトリに関連ライブラリ(Scala本体含む)が入っている前提。 Settingsのclasspathに利用するライブラリのjar(Scala自体のもの含む)を追加して、setByUserをtrueに。それをIMainに渡すことでクラスパスが通る。 変数bind時の出力を押さえるためにquietBindを使ってる。
package scalatest;
import java.io.File;
import scala.tools.nsc.Settings;
import scala.tools.nsc.interpreter.IMain;
import scala.tools.nsc.interpreter.NamedParamClass;
public class ScalaInvoke {
public static void main(String[] args) throws Exception{
@takawitter
takawitter / LZEnd.java
Created May 25, 2013 06:18
とりあえずLZ77.javaを改造してLZEndを実装。まだ完備辞書使ってないのでちゃんとしたLZEndではないし、圧縮率もめちゃ悪い(というかたいてい増える)。あと構築方法もLZEndのものとは異なる。でもLZEndの特徴であるランダムアクセスは実現できてるし、そのおかげで展開時に展開済み文字列にアクセスしなくても良いようになってる。
public class LZEnd {
static class Phrase{
public Phrase() {
}
public Phrase(int phraseNum, int ref, int len, char nonMatchedChar) {
this.phraseNum = phraseNum;
this.ref = ref;
this.len = len;
this.nonMatchedChar = nonMatchedChar;
}
@takawitter
takawitter / CpToUrls.java
Created May 22, 2013 02:27
classpathを":"で区切ってURL配列にする。CollectionUtilとかFunctionはservicegridのライブラリ(http://sourceforge.net/p/servicegrid/code/HEAD/tree/service-grid-server/trunk/jp.go.nict.langrid.commons/ )内のクラス。
URL[] paths = CollectionUtil.stream(Arrays.asList(cp.split(File.pathSeparator)))
.map(new Function<String, URL>() {
public URL apply(String value) {
try {
return new File(value).toURI().toURL();
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
})
@takawitter
takawitter / LZSS.java
Created May 14, 2013 14:17
ちょっとLZSSに浮気。http://ja.wikipedia.org/wiki/LZSS を参考に、さらに一致文字数が2文字未満の場合は無視するようにした。compress6.6秒、363万文字+282byte(bit列サイズ)になった。
import java.io.IOException;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class LZSS {
public static class LZSSData{
@takawitter
takawitter / LZ77.java
Created May 14, 2013 00:12
「高速文字列解析の世界」を参考に、LZ77実装してみた。非常に単純な実装で、compress1はマッチする文字列を元配列をなめて求める方式。compress2は文字出現位置をマップで持つ方式。 Wikipedia日本語タイトルをTrieに格納してできたTail配列に対してやってみると、513万文字が435万文字になった。 compress1が31.7秒、compress2が8.9秒。ウィンドウサイズは8192。
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class LZ77 {
public static void compress1(CharSequence src, Appendable out, int windowSize)
throws IOException{
@takawitter
takawitter / ScalaJSR223Test.java
Last active March 12, 2021 10:38
The sample code to run scala via JSR223 API. I turn usejavacp option true at line 10. Unless that you have to use http://github.com/rjolly/jarlister to list classes in scala-library.jar into MANIFEST.MF of jar that contains this ScalaTest class. I use Scala-2.11.6 to run this code.
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import scala.tools.nsc.interpreter.IMain;
import scala.tools.nsc.settings.MutableSettings.BooleanSetting;
public class ScalaTest {
public static void main(String[] args) throws Exception{
ScriptEngine engine = new ScriptEngineManager().getEngineByName("scala");
((BooleanSetting)(((IMain)engine).settings().usejavacp())).value_$eq(true);
@takawitter
takawitter / gist:5477296
Created April 28, 2013 15:49
libディレクトリの全jarファイルをクラスパスとして連結。
Arrays.stream(new File("lib").listFiles(f -> f.getName().endsWith(".jar")))
.map(f -> f.getAbsolutePath())
.reduce(".", (l, r) -> l + File.pathSeparator + r)