GIMPのスクリプトをPythonでつくる(Python-Fu)
・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
JavaでJSONを扱うことになりそう、とのことで事前学習。
JSONとは?
JSON (JavaScript Object Notation)は、軽量のデータ交換フォーマットです。
JSON http://www.json.org/json-ja.html より
日本語だと、上記URLが一次情報?
JavaでJSON
外部ライブラリを使わずに、JavaでJSONを扱おうとすると、下記URLの実装になるみたいです。
Java SEの標準APIだけでJSONを扱うサンプル(JDK 1.6以降、1.8も対応) - ぐーたら書房
Javaで利用されているJSONの外部ライブラリ
下記2つが主に利用されていそう。
- Jackson
- Jsonic
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)
手順
- GitHubのアカウントをつくる
- Git for Windowsのダウンロードとインストール
- Git for Windowsの設定
- GitHubにリポジトリを作る
- ローカル環境にリポジトリを作る
- ローカルリポジトリにcommitする
- リモートリポジトリにpushする
1.GitHubのアカウントをつくる
Step1:ユーザー名、メールアドレス、パスワードを入力する。
Step2:プランを選ぶ。私はFreeを選びました。
Step3:飛ばしました。(アンケートだったと思います)
Step1で入力したメールアドレスにメールが届きます。
メール内の"Verify email address"をクリック。
# 私はここでログインを求められました。(ブラウザを跨いで作業していたため)
タイトルが"Welcome to GitHub!"の、メールが届けば登録完了です。
3.Git for Windowsの設定
私家版 Git For Windowsのインストール手順 | OPC Diary
上記のURLの手順に倣って作業しました。
以下は補足になります。
グローバルの設定
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として設定する
Git Credential Manager(GCM)のインストール
作業していません。
# 先にpushまでいきたかった
5.ローカル環境にリポジトリを作る
6.ローカルリポジトリにcommitする
7.リモートリポジトリにpushする
【GitHub超初心者入門】この前初めてGitHubを使い始めたエンジニア見習いが書くGitHubの使い方と実践~とりあえず一緒に動かしてみようぜ!~ - Qiita
上記のURLを参考に実施しました。
しばらくはGitHubに慣れることからかな。
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回@サイボウズ株式会社 松山オフィス を開催 #pronama - なか日記
- プログラミング生放送勉強会 第47回@サイボウズ株式会社 松山オフィス に参加したった! - だるろぐ
- プログラミング生放送勉強会 第47回@サイボウズ株式会社 松山オフィス参加記録 : 毎日プログラム
- 【コミュニティイベント参加レポート... - The Official Microsoft MVP Community | Facebook
【自分用まとめ】プログラミング生放送勉強会第47回@サイボウズ株式会社松山オフィス - Togetter
今回の会場は、4/3に移転したサイボウズ株式会社松山オフィス。
話題のkintoneポスター4枚が、出迎えてくれました。
受付。
サイボウズ飴があったので、頂きました。
サイボウズノートは品切れでした。残念。
# あとで存在を知った
受付を済ませて、中へ。
以前にも増して、おしゃれになってました。
でも、天井はコンクリむき出しで、ラボっぽいなあ、なんて。
いろんなタイプのテーブルとイスがあって、選べていいですね~
座敷エリアには、人をダメにするクッションもありました。
勉強会冒頭、プロ生ちゃんTシャツ希望者プレゼントがあり、Sサイズを頂きました。
あと、今回の名札、勉強会の名札とは思えないほど、ポップでした!
プロ生ちゃんマジ天使!
さて、勉強会のセッションとLTについて。
ASP.NET、Docker、AWS、three.js、Microsoft Flow、GitHub、Kotlin、VizCommand、にゃーん…どれも使ったことのないもので、話についていくのがやっとでした。
自分が、モダンとかけ離れたところに居ることを痛感します。
そのギャップに気づかせてくれる勉強会が、愛媛で毎年開催されていることがありがたい。
あと、プロ生はLT希望者が多くて素晴らしいです。
熱く語っていたり、試行錯誤したんだなと思えることが語られたり、とても良い刺激を受けました。
私も、気になったものをやってみることから始めよう。
数日後、ホッテントリチェックしていたら、今回の勉強会で知った、AWS Lambdaが苦手なことと、モブプログラミングを見かけて、思わず( ^ω^)おっ
はてなブックマーク - なぜAWS LambdaとRDBMSの相性が悪いかを簡単に説明する - Sweet Escape
以上、勉強会参加しました初記事でした。
スタッフの皆様、登壇者の皆様、お疲れ様でした。
この場に参加できたことに、感謝。
ありがとうございました。
はじめてのVBA
・はじめての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」をクリック
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...)