水曜日, 4月 26, 2017

Java: アダプターを作る。

車輪を発明なんていいますよね。でも自前で直せるっていうメリットはあります。

あれ?これなんでないんだろうって思ったらネットで探してなければ作る。この精神(勢い)が大事ですね。

よく考えてみると作れる!ってのは存外いけます。作ったら仕組みが理解できます。

Java アダプターの話です。アダプターってのは addActionListener() でリスナーをつけるとき、リスナーを実装したクラスを使うのでなくてその場で内部クラス(アダプター)をつくる方法です。

機能がまとまって書けるのでコードが読みやすくなります。

この便利なアダプターですが、なぜか ActionListener のがない。

で、作りました。アダプターってなんだろうって考えたわけですね。なんかのクラスでリスナーが実装されていればいい。

import java.awt.event.ActionListener;
abstract class ActionAdaptor implements ActionListener {
}
これで動きます。これだけなんですね。んー なんか探すより作ったほうが早い。

こんなケースもあるわけなんですね。

土曜日, 4月 22, 2017

文字列変換:変換文字列をそれぞれ指定する

学校で習うような複雑なアルゴリズムを使う機会ってのは実際ほとんどないですね。

クイックソートを実装するなんてのはまずない。あれを一発で通せなんていう無茶な要求がありましたよね。ハノイの塔とか。

複雑であればライブラリを使う。

それでも多少は面倒なときもあります。

文字列を分割するとか。

これ、特定の文字列を変換するコードです。全ての文字列を単変換ならライブラリがありますが、各変換ごと数値を当てはめるとかカスタマイズするとなるとやっぱり書かざるを得ない。

public String replaceParam(String str, String[] list) {
String res = "";
int index = 0;
int count = 0;
int prev = 0;
while ((index = str.indexOf('?', index)) != -1) {
if (count < list.length) {
if (prev < index) {
res += str.substring(prev, index);
}
res += list[count];
count++;
}
index++;
prev = index;
}
if (prev < str.length()) {
res += str.substring(prev);
}
return res;
}

金曜日, 4月 21, 2017

Java: タイムアウト実践編

タイム・アウト実践編です。

終わらない(かもしれない)仕事を時間制限をつけて実行します。

ここはスレッドを用いたクラスを用います。

スレッドを synchronized された関数で呼び出します。

一定時間のち interrupt() を呼び出してスレッドを終了します。

FileTask task=new FileTask(fn);
try {
Thread.sleep(10);
task.interrupt();
if(task.retrieved && task.exists){
// file exists
}else{
// otherwise
}
} catch (InterruptedException e) {
// time out
}

FileTask の定義です。

時間がかかるファイルアクセスをスレッドで実行します。コマンドを走らせて終了時フラグをセットします。

class FileTask extends Thread{
boolean retrieved=false;
boolean exists=false;
String fn="";
FileTask(String fn){
this.fn=fn;
start();
}
public void run(){
try{
File file=new File(fn);
String[] list=file.list();
if(list!=null)
{
exists=true;
}
retrieved=true;
}catch(Exception e){
log.error("File access error",e);
}
}
}
view raw FileTask.java hosted with ❤ by GitHub

これで終わらない仕事は強制終了です。

木曜日, 4月 20, 2017

Java: タイム・アウト

この仕事が終わらない

なんて状態はよくあります。

終わらないなら強制終了させねばなりません。

指定時間内で終わらない仕事は強制終了する、そんな方法(コード)をお見せします。

Java で時間を指定するならスレッドを使うしかありません。

便利なクラスが提供されていますが基本はスレッドです。

行う動作を別スレッドで走らせて、指定時間が来たら interrupt() をかけます。

public class TimeOut extends Thread{
MyTask task;
public TimeOut(MyTask task){
this.task=task;
start();
}
public void run(){
try{
Thread.sleep(1000);
task.interrupt();
}catch(Exception e){
}
}
public static void main(String args[]){
MyTask task=new MyTask();
new TimeOut(task);
}
}
class MyTask extends Thread{
MyTask(){
start();
}
public void run(){
try{
for(;;){
System.out.print("*");
sleep(100);
}
}catch(Exception e){
}
}
}
view raw TimeOut.java hosted with ❤ by GitHub

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...