【Thunderbird】LightningとMicrosoft Exchangeのカレンダーを連携

※注意: この記事は未完です。

調べてみたけど、古めの情報しか出てこなかったのでメモ。

環境: Thunderbird 38.3.0

諸事情あってGoogleからMS Exchangeへの移行を余儀なくされた。

メールはIMAPだったのでさくっと移行できたけど、Lightningの予定とMS Exchangeの予定表を同期したかった。

まず、Exchange側からICSを取得する。

  1. 予定表の歯車マークから、「オプション」→「予定表」→「予定表の公開」
  2. 「予定表の選択」で同期したい予定表を選択
  3. 「アクセス許可の選択」から公開したい内容を選択
  4. HTMLとICSのURLが表示されるので、ICSの方をコピー

次に、Lightningに対して先程取得したICSを設定する。

  1. 「ファイル」→「新規作成」→「カレンダー」
  2. 「ネットワークのサーバに保存する」にチェックを入れ、「次へ」
  3. フォーマットで「iCalendar(ICS)」にチェックをいれ、場所欄に先程取得したICSを貼り付けて「次へ」
  4. カレンダー名を入力
  5. 画面にしたがって完了

これでカレンダーがLightningでカレンダーを見られるようになった。
しかし、Lightning側で予定を追加しようとしたら弾かれた。ICSだしそりゃそうか。

時間がないので今日はここまで。

catch句の存在しないtry-catch-finally

こんな要件があった。

  1. メソッドAがメソッドBを呼び出している
  2. メソッドBでExceptionが発生した場合でも必ずやりたい処理がある
  3. ExceptionはメソッドAでcatchしたい

実装するには、メソッドBではExceptionをcatchせずにfinallyで残処理をやらせて、メソッドAでcatchさせればいい。

しかし、try-catch-finallyでfinallyを省略することはあっても、catchを省略することなんてあったか……そもそもできるのか?

試してみた。

Main.java

package sample;

public class Main {

	public static void main(String[] args) {
		try{
			throwException();
		}catch(Exception e){
			// 例外をここでcatch
			System.out.println("例外発生");
			e.printStackTrace();
		}
	}

	private static void throwException(){
		int arr[] = new int[3];

		try{
			// 意図的にArrayIndexOutOfBoundsExceptionを発生させる
			arr[10] = 5;
			System.out.println("処理正常終了");
		}finally{
			// catchを書かずにfinally
			System.out.println("finally句に入りました");
		}
	}

}

実行結果

finally句に入りました
例外発生
java.lang.ArrayIndexOutOfBoundsException: 10
	at sample.Main.throwException(Main.java:20)
	at sample.Main.main(Main.java:7)

できたできた。
けど、こういう書き方って普通しないのかなあ?
もっといい書き方があれば教えてください。

poiを使用したExcelデータの読み込み@Java

忘れないようにサンプルコードを残しておく。

1. xlsファイル

public void printDataFromXls() {

    String filePath = "D:/test/file.xls";

    try {
        //Excelのワークブックの読み込み
        POIFSFileSystem poiFile = new POIFSFileSystem (new FileInputStream(filePath));
        HSSFWorkbook wb = new HSSFWorkbook(poiFile);

        //シートの読み込み
        HSSFSheet sheet = wb.getSheet("Sheet1");

        //値読み込み
        for(int i = 1; i <= sheet.getLastRowNum(); i++) {
            HSSFRow row = sheet.getRow(i);
            HSSFCell cell = row.getCell(0);
            String cellString = cell.getStringCellValue();
            System.out.println(cellString);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}

2. xlsxファイル

public void printDataFromXlsx() {

    String filePath = "D:/test/file.xlsx";
    
    try {
        //Excelのワークブックの読み込み
        FileInputStream fis = new FileInputStream(filePath);
        XSSFWorkbook wb = new XSSFWorkbook(fis);

        //シートの読み込み
        XSSFSheet sheet = wb.getSheet("Sheet1");

        //値読み込み
        for(int i = 1; i <= sheet.getLastRowNum(); i++) {
            XSSFRow row = sheet.getRow(i);
            XSSFCell cell = row.getCell(0);
            String cellString = cell.getStringCellValue();
            System.out.println(cellString);
        }
    } catch (Throwable e) {
        e.printStackTrace();
    }

}

はまった所

  • xlsxファイルの取込で、コンパイルは通るのに実行するとNoClassDefFoundError

poiを取得した際に一緒についてくる、ooxml-libディレクトリ内のxmlbeans-2.3.0.jarをビルドパスに通してなかったせい。
コンパイル通っても気を抜いちゃだめですね。

Windowsキー + カーソルキー。

ご操作でWindows + → 押したら面白い動きをしたのでメモ。

押すたびにウィンドウが以下のように繰り返す

  1. アクティブウィンドウがディスプレイの左半分に寄る
  2. アクティブウィンドウがディスプレイの右半分に寄る
  3. アクティブウィンドウがそのディスプレイで元のサイズに戻る

マルチディスプレイの場合は1と2の間で次のディスプレイに移動。

押すたびにウィンドウが以下のように繰り返す

  1. アクティブウィンドウがディスプレイの右半分に寄る
  2. アクティブウィンドウがディスプレイの左半分に寄る
  3. アクティブウィンドウが元のサイズに戻る

マルチディスプレイの場合は1と2の間で次のディスプレイに移動。

アクティブウィンドウが最大化する

  • アクティブウィンドウが最大化している時、元のサイズに戻る
  • アクティブウィンドウが最大化していない時、最小化される

DOCTYPEとQuirksモード

IEでブラウザの互換テストをする時に、ドキュメント(レンダリング)モードってなんだよ、と思ったのが始まり。

  • Quirksモードとは

ブラウザのレンダリングモードを過去のブラウザのそれに合わせるモード。
(後方)互換モード、等と呼ばれることも。

  • Quirksモードが使用される条件

ブラウザのレンダリングモードはサイト側、クライアント側どちらでも指定することが可能。


クライアント側はブラウザに依存するので割愛。

サイト側では、DOCTYPE宣言の内容によって使用するレンダリングモードを指定する。
DOCTYPEの宣言例として、DOCTYPEスイッチ-HTMLの基本に一覧がある。

  • IEのQuirksモードには二つある

IEのQuirksモードには「Internet Explorer 5 Quirks」と「Quirks」がある。
これは、IE10以降ではQuirksモードでもHTML5が動作するよう変更されたもので、IE9以前のQuirksモードとは別物のため両方搭載されている。
テスト時には組み合わせに気をつけよう。
参考: IE6〜9とIE10とでQuirksモードの動作が違う、どうすれば解決できるか? - ふろしき.js

ファイル差分比較@eclipse

なんとかできないもんかと悩んでいたら、eclipseでできた。

  1. 比較したい2ファイルを選択
  2. 右クリック→「比較」→「相互」

へー。

参考: eclipseを利用して2つのファイルを比較する - 発熱するマイナ魂

<input type="hidden"> と <table>(いまさらIE7)

こういうhtmlを書く必要があった。

<table>
  <tr>
    <input type="hidden" name="hoge1" value="fuga1">
    <td>1行目</td>
  </tr>
  <tr>
    <input type="hidden" name="hoge2" value="fuga2">
    <td>2行目</td>
  </tr>
  <tr>
    <input type="hidden" name="hoge3" value="fuga3">
    <td>3行目</td>
  </tr>
</table>

このとき、IE7だとテーブルの上に謎のスペースができてしまう。

解決策:

以下のように改変。

<table>
  <tr>
<input type="hidden" name="hoge1" value="fuga1"><td>1行目</td>
  </tr>
  <tr>
<input type="hidden" name="hoge2" value="fuga2"><td>2行目</td>
  </tr>
  <tr>
<input type="hidden" name="hoge3" value="fuga3"><td>3行目</td>
  </tr>
</table>

inputタグの前後にスペースやら改行やらが入っていると問題らしい。

補足:
そもそも、この書き方自体がhtmlの記述の仕方に反しているので、よくないと思う。
以下更なる対処法。

<table>
  <tr>
    <td style="display: none;"><input type="hidden" name="hoge1" value="fuga1"></td>
    <td>1行目</td>
  </tr>
  <tr>
    <td style="display: none;"><input type="hidden" name="hoge2" value="fuga2"></td>
    <td>2行目</td>
  </tr>
  <tr>
    <td style="display: none;"><input type="hidden" name="hoge3" value="fuga3"></td>
    <td>3行目</td>
  </tr>
</table>

これなら反していない。はず。