GIMPのスクリプトをPythonでつくる(Python-Fu)

dosomething.hatenablog.com

・ACゲームにハマった
社会人2年目からとあるACゲームにハマっている。これが身体を動かすゲームで、運動不足解消になっている。身体を動かして汗をかくの楽しい。

※ACゲーム=ダンエボ

公式アプリで投稿せずに、リザルト画像をスクリーンショットで残すと、余計な枠がついてしまうため、いつもGIMPで手作業で切り抜いていました。

この切り抜き作業をPython-Fuでスクリプト化してみた、備忘録です。

ググったところ、GIMPスクリプト作成で利用できるのは、「Script-Fu」と「Python-Fu」の2つ。
私が選んだのは「Python-Fu」。
Python、自動化に興味があって、やってみたかったんです。
これは良い機会だなあと。

Pythonの開発環境構築にあたっては、下記の記事にお世話になりました。
Python を使用して GIMP 用のプラグインを作成する

Python用のEclipseは、下記のサイトからダウンロードしました。
Eclipse 日本語化 | MergeDoc Project
Pythonを選んでダウンロードすれば、PyDevプラグインがデフォルトでインストールされています。
日本語化もされてます。
ダウンロードすれば、すぐにPythonのコードが書けます。便利。

Python-Fuの書き方や罠については、下記の記事が参考になりました。
PythonでGIMPのスクリプトを書く(Python-Fuの書き方) | d.sunnyone.org
imageとlayerの引数を書き忘れていたせいで動かなかったことに気づいたし、雛形が完成されてる。

そういえば、これは罠なのだろうか。
コメントを入れたら、スクリプトGIMPに認識されなかった。
そういう仕様なのだろうか?よく分からない。
# GitHub公開用にコメント入れたら、メニュー項目から消えてしまった

ということで、今回つくったPython-Fuはこちら↓

これを使えば、ワンクリックで切り抜くことができます。

こんな感じの、ラクするためのプログラミングにも、もっと取り組みたい。

JavaでJSON

JavaJSONを扱うことになりそう、とのことで事前学習。


JSONとは?

JSON (JavaScript Object Notation)は、軽量のデータ交換フォーマットです。

JSON http://www.json.org/json-ja.html より
日本語だと、上記URLが一次情報?


JavaJSON

外部ライブラリを使わずに、JavaJSONを扱おうとすると、下記URLの実装になるみたいです。
Java SEの標準APIだけでJSONを扱うサンプル(JDK 1.6以降、1.8も対応) - ぐーたら書房


Javaで利用されているJSONの外部ライブラリ

下記2つが主に利用されていそう。

Jackson

JacksonはJava7以上で利用可能っぽいです。
(Java6だとObjectMapperクラスを呼び出した時点で落ちました。)

一時情報として見るべきWikiは下記URL?
JacksonHome - FasterXML Wiki

Jacksonを利用するに当たって、下記URLを参考にしました。
Jacksonの便利な使い方 [初心者向け] - Qiita
Java Jacksonの基本的な使い方 | 酒と涙とRubyとRailsと

今回動作確認で作成したPOJOは下記Userクラス。

public class User {
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

…で動作確認はこんな感じでやりました。

public class JacksonSample {
    private static ObjectMapper om = new ObjectMapper();

    public static void main(String[] args) throws Exception {
        // POJO→JSON
        User user1 = new User();
        user1.setId(1);
        user1.setName("HAL");
        String json1 = om.writeValueAsString(user1);
        System.out.println(json1);

        // JSON→POJO
        String json2 = "{\"id\":\"2\", \"name\":\"PET\"}";
        User user2 = om.readValue(json2, User.class);
        System.out.println("id:" + user2.getId());
        System.out.println("name:" + user2.getName());
    }
}
Jsonic

先にJsonicの動作確認コードをば。

public class JsonicSample {
    public static void main(String[] args) {
        // POJO→JSON
        User user1 = new User();
        user1.setId(1);
        user1.setName("HAL");
        String json1 = JSON.encode(user1);
        System.out.println(json1);

        // JSON→POJO
        String json2 = "{\"id\":\"2\", \"name\":\"PET\"}";
        User user2 = JSON.decode(json2, User.class);
        System.out.println("id:" + user2.getId());
        System.out.println("name:" + user2.getName());
    }
}

JsonicはJava6以上で利用可能です。

Jsonicの一次情報は下記URL。
http://jsonic.osdn.jp/

Jsonic、こんな感じでも使えるよ~ということで、参考になりそうなURLは下記。
Java JSONICでjsonな文字列をオブジェクトに直接デコード - Symfoware
jsonicのlistだけを持つクラスを使いたくない場合 - だましだまし


一次情報をチェックすることを心がけようとしているのですが、やはり英語が多い…。
英語が読めないと厳しいなあと思う、今日この頃…。

あとググる前にダウンロードファイル確認しよう。
Sampleちゃんと入ってたの、あとから気づいた…。



↓↓↓2017/07/30 追記
Javaで利用されているJSONの外部ライブラリとしてもうひとつ、Googleが提供しているGsonを見つけたので、試してみました。

Gsonの一次情報は下記URL。
GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back

動作確認のコードは下記。

public class GsonSample {
    public static void main(String[] args) {
        // POJO→JSON
        User user1 = new User();
        user1.setId(1);
        user1.setName("HAL");
        Gson gson = new Gson();
        String json1 = gson.toJson(user1);
        System.out.println(json1);

        // JSON→POJO
        String json2 = "{\"id\":\"2\", \"name\":\"PET\"}";
        User user2 = gson.fromJson(json2, User.class);
        System.out.println("id:" + user2.getId());
        System.out.println("name:" + user2.getName());
    }
}

上記のコードを書くにあたって、UserGuideのObject Examplesを参考にしました。
gson/UserGuide.md at master · google/gson · GitHub


基本の使い方は、ほぼほぼ同じみたいですね。

はじめてのGitHub

"Write Code Every Day"をやってみたい!
いい機会だから、GitHubも始めてみよう!ってことで、昨夜から作業を始めて、今日のお昼ぐらいに初pushできました。
ここまでの備忘録をまとめておきます。



作業

  • 作業日:2017/07/08-2017/07/09
  • OS:Windows8.1(64bit)

手順

  1. GitHubのアカウントをつくる
  2. Git for Windowsのダウンロードとインストー
  3. Git for Windowsの設定
  4. GitHubリポジトリを作る
  5. ローカル環境にリポジトリを作る
  6. ローカルリポジトリにcommitする
  7. リモートリポジトリにpushする

1.GitHubのアカウントをつくる

github.com

Step1:ユーザー名、メールアドレス、パスワードを入力する。
Step2:プランを選ぶ。私はFreeを選びました。
Step3:飛ばしました。(アンケートだったと思います)

Step1で入力したメールアドレスにメールが届きます。
メール内の"Verify email address"をクリック。
# 私はここでログインを求められました。(ブラウザを跨いで作業していたため)
タイトルが"Welcome to GitHub!"の、メールが届けば登録完了です。


2.Git for Windowsのダウンロードとインストー

3.Git for Windowsの設定

私家版 Git For Windowsのインストール手順 | OPC Diary
上記のURLの手順に倣って作業しました。
以下は補足になります。

Git for Windowsのダウンロードとインストー
  • ダウンロードしたバージョン:2.13.2
  • デフォルト設定のままインストールしました。
グローバルの設定
SSHキーの作成

補足はありません。手順通りに作業しました。

posh-gitのインストー

"Windows PowerShell"を右クリック > 「管理者として実行」をクリック
…で手順通りに作業しました。

しかし、

インストール後の説明通り、プロファイルをリロードします。

これだけがよくわからず、何もしていません。
# インストール後の説明が異なっていました。

エディタの設定

秀丸に設定しました。

git for windowsで秀丸を使ってコミットメッセージを編集したい | GENDOSU@NET
上記のURLを参考に、秀丸に設定しました。

editor = 'C:/Program Files (x86)/Hidemaru/Hidemaru.exe' //fu8

以下、失敗談。
コマンド叩いていけるかなあと思って試したものの、秀丸が起動せず。
試行錯誤中に叩いたコマンドが2つ通ったせいで、2つ設定されてました。

$ git config --global core.editor "C:\Program Files (x86)\Hidemaru\Hidemaru.exe"
$ git config --global core.editor \"'C:/Program Files \(x86\)/Hidemaru/Hidemaru.exe' /fu8\"
$ git config -l
core.editor=C:\Program Files (x86)\Hidemaru\Hidemaru.exe
core.editor="C:/Program Files \(x86\)/Hidemaru/Hidemaru.exe

gitコマンド及びls等UNIXコマンドでの文字化け対策

コマンドプロンプト」を右クリック > 「管理者として実行」をクリック
…で手順通りに作業しました。

「コントロールパネル」 > 「システムの詳細設定」 > 「環境変数
…のユーザー環境変数に追加されてました。
コマンド嫌いなら、ここから設定しても大丈夫だと思います。

# 蛇足。あれこれググってる最中に見つけたんですが、GitHub for Windowsもあるようなので、コマンドが嫌ならこちらの方がいいのかも?

Visual Studio Codeをdiff toolとして設定する
シンボリックリンクのためのWindows側の設定他
Git Credential Manager(GCM)のインストー

作業していません。
# 先にpushまでいきたかった


4.GitHubリポジトリを作る

5.ローカル環境にリポジトリを作る

6.ローカルリポジトリにcommitする

javaで正規表現 その後の話

とあるコードが数字→英数字になる仕様変更に取り組んだ、その後の話。

数字の頃にNGにしていたコードは、従来通りNGにしてくださいという仕様変更が発生。

…でレビューと試験が依頼されたわけだけども、上がってきたコードを見て頭を抱えた。
もとの仕様を満たした場合のif条件の中に、さらにif条件が追加されていた。

…モヤモヤしたので、自分で書いてみた。

public static boolean isTargetCode(String strCode)
{
	if (!strCode.matches("^[0-9a-zA-Z]{3}$"))
	{
		return false;

	}

	int intCode = 0;

	try {
		intCode = Integer.parseInt(strCode);

	} catch (NumberFormatException nfe) {
		// 英字交じりの場合
		return true;

	}

	return intCode > 0 && intCode <= 500;
}

「プログラミング生放送勉強会 第47回@サイボウズ 株式会社 松山オフィス」に参加してきました

2017年6月17日に、「プログラミング生放送勉強会 第47回@サイボウズ株式会社 松山オフィス」に参加してきました。
第34回以来、2回目の参加。


6/17 プログラミング生放送勉強会 第47回@サイボウズ株式会社 松山オフィス 開催! – プログラミング生放送

【自分用まとめ】プログラミング生放送勉強会第47回@サイボウズ株式会社松山オフィス - Togetter


今回の会場は、4/3に移転したサイボウズ株式会社松山オフィス。
話題のkintoneポスター4枚が、出迎えてくれました。

受付。
サイボウズ飴があったので、頂きました。
サイボウズノートは品切れでした。残念。
# あとで存在を知った

受付を済ませて、中へ。
以前にも増して、おしゃれになってました。
でも、天井はコンクリむき出しで、ラボっぽいなあ、なんて。
いろんなタイプのテーブルとイスがあって、選べていいですね~
座敷エリアには、人をダメにするクッションもありました。


勉強会冒頭、プロ生ちゃんTシャツ希望者プレゼントがあり、Sサイズを頂きました。
あと、今回の名札、勉強会の名札とは思えないほど、ポップでした!
f:id:PET_HAL:20170701213933j:plain
プロ生ちゃんマジ天使!


さて、勉強会のセッションとLTについて。

ASP.NET、Docker、AWS、three.js、Microsoft Flow、GitHub、Kotlin、VizCommand、にゃーん…どれも使ったことのないもので、話についていくのがやっとでした。
自分が、モダンとかけ離れたところに居ることを痛感します。
そのギャップに気づかせてくれる勉強会が、愛媛で毎年開催されていることがありがたい。

あと、プロ生はLT希望者が多くて素晴らしいです。
熱く語っていたり、試行錯誤したんだなと思えることが語られたり、とても良い刺激を受けました。
私も、気になったものをやってみることから始めよう。

数日後、ホッテントリチェックしていたら、今回の勉強会で知った、AWS Lambdaが苦手なことと、モブプログラミングを見かけて、思わず( ^ω^)おっ

はてなブックマーク - なぜAWS LambdaとRDBMSの相性が悪いかを簡単に説明する - Sweet Escape


以上、勉強会参加しました初記事でした。

スタッフの皆様、登壇者の皆様、お疲れ様でした。
この場に参加できたことに、感謝。
ありがとうございました。

はじめてのVBA

ExcelVBAと格闘した時の、備忘録。

ミッションは、CSVが出力できる、Excelを作ること。

・はじめてのVBA
・本開発までの暫定対応

品質
・改修想定なし
・問題なく動く(想定通りに使った場合に限る)

構成
シート1:説明書シート。コピペボタン・CSV出力ボタンをつける
シート2:CSV出力元シート(シート3の入力値をコピペする)。セルの書式を設定する。
シート3:ユーザが入力するシート。プルダウンを作る。



Excel
仕様上、月日は0埋め。

月日が1桁の時も日付の先頭を揃えたい
(ググったワード:"excel 日付 0埋め")

セルを右クリック > 「セルの書式設定」を選択
「表示形式」タブ > 「分類」から「ユーザー定義」を選択

パターン1
「種類」yyyy/mm/dd > 「OK」をクリック
例)セルの入力値→"2017/7/1"
表示 →"2017/07/01"

パターン2
「種類」yyyymmdd > 「OK」をクリック
例)セルの入力値→"2017/7/1"
表示 →"20170701"


複数の候補から選択する項目。
項目によって、数字が全角だったり半角だったり…。
入力よりも、選ばせた方がよさそう。
そうだ、プルダウンを作ろう。

3ステップ!Excelでプルダウンリストを作成する方法|エクセルハック
(ググったワード:"excel プルダウン")

「データ」タブ > 「データの入力規則」をクリック > 「データの入力規則」を選択
「設定」タブ > 「リスト」を選択 > 「ドロップダウン リストから選択する」にチェックを入れる > 「元の値」に候補を","区切りで入力 > 「OK」をクリック



VBA
まずは、メインのCSV出力を作る。

EXCELからCSVファイルの出力方法について - Excel(エクセル) 締切済 | 教えて!goo
(ググったワード:"エクセル csv 出力 ボタン")

回答No.5のコードを参考にさせていただく。
マクロ実行でCSVが出力されることは確認できた。

これをベースにどんどん仕様を盛り込んでいく。


次に、ファイル名に設定する今日の日付の取得。


VBAで今日の日付をyyyymmdd形式で取得する-Date・Format関数:エクセルマクロ・Excel VBAの使い方-VBA関数 http://www.relief.jp/itnote/archives/excel-vba-today-yyyymmdd.php
(ググったワード:"エクセル マクロ 日付取得")


最後に、シートの入力値のコピペ。

エクセルVBA 別シートの複数のセルの値をコピーする方法 - Excel(エクセル) 解決済 | 教えて!goo
(ググったワード:"エクセル マクロ シート コピー 範囲 指定")


入力されたセルだけをコピペ範囲にしたい。

No.8 ワークシートの最終行、最終列を取得する
(ググったワード:"マクロ 最大行")


マクロ実行用のボタンをつける。

Excel マクロ実行ボタンを作ろう~やさしいマクロ講座
(ググったワード:"マクロ ボタン")

操作の説明を書いて、Excel完成。


ところが、処理にやたら時間がかかる。
処理速度の改善へ。

Office TANAKA - Excel VBA高速化テクニック[無駄な表示を止める]
Office TANAKA - Excel VBA高速化テクニック[名前で呼ぶな]
Office TANAKA - Excel VBA高速化テクニック[セルの指定方法]
Office TANAKA - Excel VBA高速化テクニック[セルを配列に入れる]
(ググったワード:"マクロ 処理 高速化")


…で、最終的にできたマクロがこんな感じ、だったような。

Sub copyInputValue()
 Dim sh2 As Worksheet
 Dim sh3 As Worksheet
 Dim tmp As Variant
 Application.ScreenUpdating = False
 Set sh2 = Worksheets(2)
 Set sh3 = Worksheets(3)
 maxRow = sh3.Cells(Rows.Count, 1).End(xlUp).Row
 maxCol = sh3.Cells(1, Columns.Count).End(xlToLeft).Column
 tmp = sh3.Range(sh3.Cells(2, 1), sh3.Cells(maxRow, maxCol))
 sh2.Range(sh2.Cells(2, 1), sh2.Cells(maxRow, maxCol)) = tmp
 Application.ScreenUpdating = True
 End Sub

Sub outputCsv()
 Application.DisplayAlerts = False
 Application.ScreenUpdating = False
 main_f = ActiveWindow.Caption
 out_pass = ActiveWorkbook.Path & "\"
 Sheets(2).Select
 Sheets(2).Copy
 ActiveWorkbook.SaveAs Filename:= _
 out_pass & Format(Date, "yyyymmdd") & ".csv", _
 FileFormat:= xlCSV, CreateBackup:= False
 ActiveWindow.Close
 Application.ScreenUpdating = True
 Application.DisplayAlerts = True
 End Sub

もうひとつマクロ作ってたような気がするけど、忘れた。

finalなListでaddできちゃう問題

とあるコードが数字→英数字になる仕様変更に取り組んだときの、気づきと備忘録、その2。


正規表現は満たしていても、NGにするコードが、仕様としていくつか含まれている。
その仕様を含んだ実装。

final List<String> NG_CODE_LIST = new ArrayList<String>();
{
	NG_CODE_LIST.add("000");
	NG_CODE_LIST.add("999");
}

if(targetCode.matches("^[0-9a-zA-Z]{3}+$") && !NG_CODE_LIST.contains(targetCode))
{
	// コードのチェック仕様を満たしている場合の処理
} else {
	// コードのチェック仕様を満たしていない場合の処理
}

finalなのにadd?
finalで定数であることは宣言してるから…ってそれでいいのか?

腑に落ちなかったので、"final list java"でググって調べたところ、以下の記事を発見。
neos21.hatenablog.com

final List<String> NG_CODE_LIST = Collections.unmodifiableList(Arrays.asList("000", "999"));

if(targetCode.matches("^[0-9a-zA-Z]{3}$") && !NG_CODE_LIST.contains(targetCode))
{
	// コードのチェック仕様を満たしている場合の処理
} else {
	// コードのチェック仕様を満たしていない場合の処理
}

この実装なら、NG_CODE_LISTにaddしようものなら例外が発生するようになる、ということらしい。
厳密に禁止したいときはこちらの方がよさげ。

あとついでに、Arrays.asListにしてみた。
可変(ArrayList)である必要ないし、問題ないよね?
https://docs.oracle.com/javase/jp/6/api/java/util/Arrays.html#asList(T...)