メモの日々


2002年01月08日(火) 眠い日

会社

  • 10:55 ひどく眠い。
  • PalmOS4.1のROMを手に入れた。Agreeするだけでダウンロードできるようになっていた。

[mobile] 携帯端末用個人認証システム「MobileSAFE」を発売

携帯電話向けの認証システムMobile SAFEのプレスリリース。JavaWorld2月号より。

テレビ

  • 何も見ずに寝た。

2003年01月08日(水) 藤本美貴、モーニング娘。加入へ

[life] エラー

ERROR LOG INFOMATIONメイルがどんどん来る。伊藤さんなんとかして。

開発時の人間でメイル受けているのはおれだけ。エラーメイルはなるべく多くの人に配信するようにしないと不公平感が残るな。

[tdiary] tDiary

tDiary情報。Asumi日記より。

[soft] フリーな IMAP Server の選び方

4つの実装を比較している。When The Rain Falls Silverより。IMAP一度は使ってみたい。

[windows] どぼん!のVisual Basic .NET Tips

.NETでのファイルの取り扱いを調べていて参考になったのでメモ。まだVisualStudioのヘルプではなかなか目的のページを見つけることができない。動作緩慢だし。


2004年01月08日(木)

生活

  • やっとメッセージキューにメッセージを送りそれを受信することができるようになった。プログラムが動くと楽しい。でもこのペースじゃいかんな。
  • 久ーしぶりに会社の同期が集まって飲み会。他人の子供にはあまり興味湧かない。自分の子供は溺愛してみせましょう。

やること

  • 靴紐を買う

2008年01月08日(火)

  • 今日もメイルたくさん書いた。仕事進まず。

[soft][howto] FileZilla 2で公開鍵認証を行う

FileZillaで公開鍵認証を使おうと思ったら、できそうなメニューがどこにも無い。できないのかと諦めかけたが、検索したらPuTTY付属のPageantを使えばできることを知った。

Pageantに秘密鍵を読み込ませた後、FileZillaを使って普通にサーバに接続すればよい。

あー、FileZillaってとっくにバージョン3になっているのか。バージョンアップしたら状況違うのかも。

[java] Eclipse 3.3.1.1 でOverrideアノテーションがコンパイルエラーに

設定の[Java]->[コンパイラー]で「コンパイラー準拠レベル」を6.0から5.0に変更したら、Overrideアノテーションを使っている所が軒並みコンパイルエラーになった。いや、もしかしたらGenericsも一緒に使っている所だけかも。よくわからない。

コンパイラー準拠レベルを6.0にしておけば問題はない。未来にはまるかもしれないのでメモ。

追記

この原因は、インタフェースのメソッドに対してOverrideアノテーションを書けるようになったのがJDK 1.6以降だからみたい。


2014年01月08日(水)

[java] JavaFXでプログラム終了処理

JavaFX 2で始めるGUI開発 第3回 コントロール その1JavaFX 2で始めるGUI開発 第4回 コントロール その2を読んだ。基本的なコントロールが色々紹介されている。Swingとほぼ同じかなという感想。

気になったのは、「JavaFXのアプリケーションを終了させるためには、javafx.application.Platformクラスのexitメソッドをコールします。」という所。PlatformクラスというのはSwingUtilitiesみたいなクラスだった。そのexitメソッド

If this method is called after the Application start method is called, then the JavaFX launcher will call the Application stop method and terminate the JavaFX application thread.

ということで、System.exit()を呼ぶのとは違いアプリケーションの終了時処理を行う余地があるということかな。試してみたくなったので、終了するだけのアプリケーションを作ってみる。

できあがり

画面イメージ

メニューバーは黒いのか。丸角なのはイマイチ。

  • ファイルメニューの終了を選ぶと終了する。
  • 閉じるボタンなどでウィンドウを閉じようとしても終了しない。

と動作する。以下ソースコード。

メインクラス

package exit;

import java.io.IOException;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;

public class Exiter extends Application {
    @Override
    public void start(Stage primaryStage) throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource("Exiter.fxml"));
	primaryStage.setScene(new Scene(root));

        primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent t) {
                System.out.println("handle " + t.getEventType());
                t.consume();
            }
        });

	primaryStage.setTitle("Exiter");
	primaryStage.show();
    }

    @Override
    public void stop() {
        System.out.println("stop Exiter");
    }

    public static void main(String[] args) {
	launch(args);
    }
}
  • ウィンドウを閉じる動作では終了しないようにするため、Window#setOnCloseRequest()でイベントハンドラを設定し、その中でEvent#consume()を呼ぶようにしてみた。
  • Application#stop()をオーバーライドしてこのメソッドが呼び出されていることを確認。

コントローラクラス

package exit;

import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;

public class ExiterController {
    @FXML
    public void handleExit(ActionEvent event) {
        Platform.exit();
    } 
}
  • 終了メニューが選ばれたときのイベントハンドラを実装しているだけ。Platform.exit()を使う。

FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane prefHeight="200" prefWidth="300"
            xmlns:fx="http://javafx.com/fxml"
            fx:controller="exit.ExiterController">
  <top>
    <MenuBar>
      <menus>
        <Menu text="ファイル">
          <items>
            <MenuItem text="終了" onAction="#handleExit" />
          </items>
        </Menu>
      </menus>
    </MenuBar>
  </top>
</BorderPane>
  • 連載のサンプルの真似。前回まではルート要素がAnchorPaneだったけど、今回はBorderPaneを使っている。

追記

終了のフックについての記事があったのでリンクしておく。setOnCloseRequest()を使うのはよくないのかも。

[c++] Boost Timerで時間を計る

Boost Timerは以前使ったことがあるのだけれど、もう一度使おうとしたら何も覚えていなかったのでサンプルをメモ。

#include <chrono>
#include <iostream>

#define _GLIBCXX_USE_NANOSLEEP
#include <thread>
#undef _GLIBCXX_USE_NANOSLEEP

#include <boost/timer/timer.hpp>

int main() {
  boost::timer::auto_cpu_timer timer0;
  boost::timer::auto_cpu_timer timer1;

  timer0.start();
  std::this_thread::sleep_for(std::chrono::seconds(1));
  timer0.stop();

  timer1.start();
  std::this_thread::sleep_for(std::chrono::seconds(2));
  timer1.stop();

  timer0.resume();
  std::this_thread::sleep_for(std::chrono::seconds(3));
  timer0.stop();

  std::cout << "timer0: ";
  timer0.report();
  std::cout << "timer1: ";
  timer1.report();
}
timer0:  4.000136s wall, 0.000000s user + 0.000000s system = 0.000000s CPU (n/a%)
timer1:  2.000066s wall, 0.000000s user + 0.000000s system = 0.000000s CPU (n/a%)
  • ヘッダオンリではなくビルド時に libboost_timer をリンクする必要がある。
  • auto_cpu_timerクラスを使うと、経過時間・ユーザ時間・CPU時間を計ってくれる。
  • インスタンスを作っただけで計測は開始されている。
  • start()でゼロから計測を開始。
  • stop()で計測を停止。
  • resume()で計測を再開。
  • report()で結果を出力。

ついでにC++11の<chrono>と<thread>を初めて使ってみたけれど、古いGCCだとマクロを定義しないとstd::this_thread::sleep_for()を使えないみたいだった。