Anaconda + Tensorflow + Visual Studio Code

目的

WindowsVisual Studio Codeを使用したTensorflow開発をで行えるようにしてみる。

手順

1.Anacondaのインストール + Tensorflow 開発環境の構築

以下を参考にtensorflowの開発環境を構築。
Windows版AnacondaでTensorFlow環境構築 - Qiita

2.Visual Studio Codeのインストール

ここからダウンロードしてインストールするだけ。
Download Visual Studio Code - Mac, Linux, Windows

3.拡張機能Python」の導入

Visual Studio Code を起動したら、「Ctrl + Shift + X」でMarketplaceを開いて、検索窓に「Python」を入力すると引っかかってくる。

4.ワークスペース設定の変更

Pythonを実行したりデバッグしたりするとき、tensorflow用のPython.exeを使用してくれないと色々困るので、ワークスペース用の個別設定を実施する。
「ファイル」からtensorflow開発用のフォルダを開いたら、「ファイル」⇒「基本設定」⇒「設定」を開く。

「ユーザー設定」タブが開くので、右上のプルダウンを「ワークスペース設定」に変更し、内容を以下に変更する

{
    "python.pythonPath": "{Anacondaのインストールフォルダ}/envs/tensorflow/python"
}

5.ビルドタスクの構成

いちいちターミナルから実行するのも面倒なので、ビルドタスクを構成する。 「タスク」⇒「タスクの構成」を選択すると、tasks.jsonが開くので、以下の通り記述する。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "taskName": "Python",
            "command": "${config:python.pythonPath}",
            "type": "shell",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "args": [
                "${file}"
            ]
        }
    ]
}

6.動作確認

1で作成したtensorflow_intro.pyを開き、「Ctrl + Shift + B」を押下。

「ターミナル」ウィンドウの出力結果が1で実行した結果と一致していればOK。

7.デバッグ確認

「Ctrl + Shift + D」でデバッグウィンドウを開いて、左上の歯車アイコンをクリック。
launch.jsonが作成されるので、左上のプルダウンを「Python」に設定する。
再度tensorflow_intro.pyを開き、「F5」を押下。
ちゃんと動作すればOK。

補足

「Pylintがインストールされてない」のような警告が出るが、インストールされているとコンパイルエラー等を事前検知してくれるので便利。

【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つのファイルを比較する - 発熱するマイナ魂