DCGANを使って画像を生成してみた

DCGANを使って画像を生成してみました。

学習用のデータにはいらすとやの画像を使用しました。
学習に使用したファイルの数はわずか145個ですが、いらすとや風の画像が作られます。

Herokuを使ったのは初めてですが、簡単に使えて便利ですね。
人気があるのも納得です。
これから使っていきたいと思いました。

DCGANやTensorFlowについては、今後ブログで書くかもしれません。

Anacondaの古いバージョンを取得するには

Anacondaの古いバージョンを取得するには

Anacondaの古いバージョンは、「Anaconda installer archive」からダウンロードできます。

最新版で問題があるときは、古いバージョンを試してみると良いかもしれません。

Python(Anaconda)で”TypeError: parse() got an unexpected keyword argument ‘transport_encoding'”エラー

Python(Anaconda)を使っていて、pipでインストールしようとしたら、次のようなエラーになった。

TypeError: parse() got an unexpected keyword argument 'transport_encoding'

次のコマンドを実行したら、インストールできるようになった。

conda install -c anaconda html5lib

PythonでJanomeを使って形態素解析した結果をファイルに保存する

PythonでJanomeを使って形態素解析した結果をファイルに保存する方法です。

PythonでJanomeを使って形態素解析」のコメント欄で質問をもらったので、書いておきます。

実行環境は

$ python3 --version
Python 3.5.2

ソースコードです。

from janome.tokenizer import Tokenizer

tokenizer = Tokenizer()
with open("token.txt", "w") as fp:
    for token in tokenizer.tokenize("すもももももももものうち"):
        fp.write(str(token))
        fp.write("\n")

実行結果

すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も   助詞,係助詞,*,*,*,*,も,モ,モ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
も   助詞,係助詞,*,*,*,*,も,モ,モ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
の   助詞,連体化,*,*,*,*,の,ノ,ノ
うち  名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

PythonでJanomeを使って形態素解析

JanomeはPythonで書かれた形態素解析のライブラリです。
インストールが簡単で、Mecabをインストールできない環境でも使用できる点が魅力です。

Janomeのインストール

次のコマンドでインストールできます。

pip install janome

Janomeの使い方

Tokenizerをインポートします。

>>> from janome.tokenizer import Tokenizer

Tokenizerオブジェクトを作ります。

>>> tokenizer = Tokenizer()

Tokenizerオブジェクトのtokenize()メソッドに解析する文字列を渡します。
返り値はTokenオブジェクトのlistです。

>>> for token in tokenizer.tokenize("すもももももももものうち"):
...     print(token)
...
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

tokenize()メソッドの引数streamにTrueを指定すると、返り値がgeneratorになります。

tokenize()メソッドの引数wakatiにTrueを指定すると、返り値が表層形(surface)のみになります。

>>> for token in tokenizer.tokenize("すもももももももものうち", wakati=True):
...     print(token)
...
すもも
も
もも
も
もも
の
うち

Tokenオブジェクトは、次のインスタンス変数を持ちます。

surface (表層形)
part_of_speech (品詞)
infl_type (活用型)
infl_form (活用形)
base_form (基本形)
reading (読み)
phonetic (発音)
node_type

実行例

>>> tokens = tokenizer.tokenize("吾輩は猫である")
>>> print(tokens[0])
吾輩    名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ
>>> tokens[0].surface
'吾輩'
>>> tokens[0].part_of_speech
'名詞,代名詞,一般,*'
>>> tokens[0].infl_type
'*'
>>> tokens[0].infl_form
'*'
>>> tokens[0].base_form
'吾輩'
>>> tokens[0].reading
'ワガハイ'
>>> tokens[0].phonetic
'ワガハイ'

part_of_speechはカンマ区切りなので、次のようにして値を取得できます。

>>> tokens[0].part_of_speech.split(',')[0]
'名詞'
>>> tokens[0].part_of_speech.split(',')[1]
'代名詞'
>>> tokens[0].part_of_speech.split(',')[2]
'一般'
>>> tokens[0].part_of_speech.split(',')[3]
'*'

最後に

実行環境

  • Linux Mint
  • Python バージョン3.5.2
  • Janome バージョン0.3.5

WPFのFormattedTextクラスのプロパティを表示するサンプルアプリケーション

FormattedTextクラスのBaseline/Extent/OverhangAfter/OverhangLeading/OverhangTrailingプロパティが描画テキストのどの部分の値なのかわかりにくかったので、確認できるサンプルアプリケーションを作成しました。

チェックボックスにチェックを入れると、該当するプロパティが示している値を表示します。

チェックボックスのチェックを切り替えて、各プロパティの関聯を確認できます。

詳細はソースコードを見るとわかると思います。

プログラミングに最適なフォントFiraCodeをWindowで使うには

プログラミングに最適なフォントFiraCodeをWindowで使うには

FiraCodeは、プログラミングに最適なフォントです。

「0(数字のゼロ)」と「O(アルファベットのオー)」のようなよく似た文字が見分けやすくなっています。

1行目は、0 O D
2行目は、1 l I
3行目は、2 Z
4行目は、8 B
です。

プログラミングでよく使われる記号、たとえば「==」「!=」「<=」「->」などもを見やすく表示します。

「!==」「=>」「==」が見やすくなっています。

WindowsにFiraCodeをインストールするには

  1. ttfフォルダー内のttfファイルをダブルクリックします。

  2. インストールボタンを押すとインストールが始まります。

  3. 1と2の作業をすべてのフォントに対して行います。

以上でインストール完了です。

FiraCodeをVisual Studio Code 2017で使うには

  1. メニューから「ファイル」→「設定」→「基本設定」を選択します。

  2. 次の行を追加します。

    // フォント ファミリを制御します。
    "editor.fontFamily": "Fira Code",
    
    // フォントの合字を使用します
    "editor.fontLigatures": true,
    

以上で、FiraCodeが利用できるようになりました。

FiraCodeをVisual Studioで使うには

  1. メニューから「ツール」→「オプション」を選択します。

  2. 「環境」→「フォントおよび色」を選択し、フォントを「Fira Code」にします。

以上で、FiraCodeが利用できるようになりました。

WPFのコントロール上のマウスカーソルを変更するには

WPFのコントロール上のマウスカーソルを変更するには、QueryCursorイベントを使用します。

mShape.QueryCursor += ShapeQueryCursor;

マウスカーソルがコントロール上に移動すると、QueryCursorイベントが発生します。

引数QueryCursorEventArgsのCursorプロパティに表示するマウスカーソルを設定します。

private void ShapeQueryCursor(object sender, QueryCursorEventArgs e)
{
  e.Cursor = Cursors.Cross;
  e.Handled = true;
}

標準のマウスカーソルを使用する場合は、Cursorプロパティを設定しません。

private void ShapeQueryCursor(object sender, QueryCursorEventArgs e)
{
  if (...)
  {
    e.Cursor = Cursors.Cross;
   }
   else
   {
     // 設定しない場合は標準のマウスカーソル
   }
  e.Handled = true;
}

なお、QueryCursorEventArgsのCursorプロパティにnullを設定した場合、Cursorプロパティの値はCursors.Noneになり、マウスカーソルは表示されません。

Visual Studio Codeの設定の備忘録

メニューの「ファイル」→「基本設定」→「設定」を選択と設定が表示される。
左側が既定の設定、右側に変更する設定を挿入する。

垂直ルーラーを表示する

80文字目と120文字目にルーラーを表示する

// 垂直ルーラーを表示する列
"editor.rulers": [80, 120],

空白文字を表示する

// エディターで空白文字を表示する方法を制御します。'none'、'boundary' および 'all' が使用可能です。'boundary' オプションでは、単語間の単一スペースは表示されません。
"editor.renderWhitespace": "boundary",

ファイルを開くときにエンコードを推測する

// 有効な場合、ファイルを開くときに文字セット エンコードを推測します
"files.autoGuessEncoding": true,

ファイルの改行コードを設定する

// 既定の改行文字。LF の場合には \n を CRLF の場合には \r\n を使用してください。
"files.eol": "\r\n",

末尾の空白をトリミングする

// 有効にすると、ファイルの保存時に末尾の空白をトリミングします。
"files.trimTrailingWhitespace": true,

ファイルの末尾を改行にする

// 有効にすると、ファイルの保存時に最新の行を末尾に挿入します。
"files.insertFinalNewline": true,

ターミナルにBash on Ubuntuを使う

// Windows でターミナルが使用するシェルのパス。 Windows に同梱されているシェルを使用する場合 (cmd、PowerShell、または Bash on Ubuntu) 。
"terminal.integrated.shell.windows": "C:\\Windows\\sysnative\\bash.exe",

MSTestでprivateメソッドをテストする

MSTestでprivateメソッドをテストする方法。

下記のサンプルクラスを使用します。

MyClassは、privateメソッドの”greet”と、staticのprivateメソッド”add”を持ちます。

public class MyClass
{
  private string greet(string name)
  {
    return "Hello " + name;
  }

  private static int add(int a, int b)
  {
      return a + b;
  }
}

privateメソッドのテスト

privateメソッドをテストするには、PrivateObjectクラスのInvokeメソッドを使用します。

[TestMethod]
public void TestGreet()
{
  var myClass = new MyClass();
  var pbObj = new PrivateObject(myClass);
  var actual = (string)pbObj.Invoke("greet", "World");
  Assert.AreEqual("Hello World", actual);
}

テスト対象のインスタンスを引数にして、PrivateObjectのオブジェクトを作成します。

実行するprivateメソッドの名前と、メソッドの引数をInvokeメソッドに渡します。
Invokeメソッドはobjectを返しますので、適切な型に変換します。

private staticのテスト

private staticメソッドをテストするには、PrivateTypeクラスのInvokeStaticメソッドを使用します。

[TestMethod]
public void TestAdd()
{
  PrivateType privateType = new PrivateType(typeof(MyClass));
  int actual = (int)privateType.InvokeStatic("add", 1, 2);
  Assert.AreEqual(3, actual);
}

staticなprivateメソッドをテストするには、テストするクラスを引数にしてPrivateTypeオブジェクトを作成します。

実行するstaticなprivateメソッドの名前と、メソッドの引数をInvokeStaticメソッドに渡します。
InvokeStaticメソッドはobjectを返しますので、適切な型に変換します。

親クラスのメソッドをテストするには

親クラスのプライベートメソッドをテストする場合は、PrivateObjectの引数に親クラスを指定する必要があります。

たとえば、SubClassのオブジェクトを使って、親クラス(MyClass)のaddメソッドをテストする場合です。

public class MyClass
{
    private string greet(string name)
    {
    return "Hello " + name;
    }

    private static int add(int a, int b)
    {
    return a + b;
    }
}

public class SubClass : MyClass
{
}

次のようにSubClassのオブジェクトでjプライベートメソッドを実行しようとするとMissingMethodException例外が発生し、「見つからないメンバーにアクセスしようとしました。」というエラーになる。

[TestMethod]
public void TestSubAdd()
{
  var subClass = new SubClass();
  var pbObj = new PrivateObject(subClass);
  var actual = (string)pbObj.Invoke("greet", "World"); // MissingMethodException「見つからないメンバーにアクセスしようとしました。」
  Assert.AreEqual("Hello World", actual);
}

PrivateObjectの引数にテストしたいクラス(MyClass)を指定することで、テストできます。

[TestMethod]
public void TestSubAdd()
{
  var subClass = new SubClass();
  var pbObj = new PrivateObject(subClass);
  //var pbObj = new PrivateObject(subClass, knew PrivateType(typeof(MyClass)));
  var actual = (string)pbObj.Invoke("greet", "World");
  Assert.AreEqual("Hello World", actual);
}

privateフィールドのテスト

privateフィールドの値を取得するには、PrivateObjectのGetField()メソッドを使用します。

public class MyClass
{
    private string name;
    public MyClass(string name)
    {
        this.name = name;
    }
}


[TestMethod]
public void TestNamet()
{
    var myClass = new MyClass("Hello World");
    var pbObj = new PrivateObject(myClass);
    var name = (string)pbObj.GetField("name");
    Assert.AreEqual("Hello World", name);
}