Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

サクラエディタで特定のフォルダにYYYYMMDD_番号.txtで保存するマクロを作成

最近の趣味はサクラエディタのPull Requestを眺めることです。 昔から愛用してきたサクラエディタですがマクロを使ったことはありませんでした。
ということで毎日よく簡易的にメモをテキストエディタに書いてYYYYMMDD.txtみたいな形式で保存するのですが、
日付を間違えたり、名前を変更するのをめんどくさがったり、保存先がデスクトップに散ったりなどがありがちなので
デスクトップのmemoというフォルダを用意して新規作成時orマクロ実行時にmemo配下に YYYYMMDD_[無題の後の番号].txtというので自動保存するマクロを作成しました。 古のWSH(JScript)が使えるんですね。

マクロの準備

次のコードをsaveByDate.jsという名前で%APPDATA%\sakuraフォルダに保存します。

// saveByDate.js
// see: https://gist.github.com/RYLSnmm/432a35eb3f885722a4f95e8f0ef9df6b
// デフォルトの設置場所:ユーザーごとにインストールなら
//   %APPDATA%sakuraに本ファイルを設置する
// 共通設定よりマクロを設定 文法はWSHに準拠(JScript)
// 新規/開ファイル後にチェックを入れて設定したほうが捗るかも
(function() {
    if (Editor.GetFilename() != "") { return; }
    
    var wsh_shell = new ActiveXObject("WScript.Shell");
    var DEFAULT = {
        savedir: wsh_shell.ExpandEnvironmentStrings("%USERPROFILE%") + "\\Desktop\\memo",
        filename_template: "{{YYYY}}{{MM}}{{DD}}_{{number}}.txt",
        charset: "UTF-8",
        linebreak: "CRLF"
    };
    var savedir = DEFAULT.savedir;
    var filename_template = DEFAULT.filename_template;
    var charset = DEFAULT.charset;
    var linebreak = DEFAULT.linebreak;
    
    var number = Editor.ExpandParameter("$n");
    var filename = createFromTemplate(filename_template, getNowForTemplate(), {number: number});
    var path = savedir + "\\" + filename;

    var fso = new ActiveXObject("Scripting.FileSystemObject");
    if (!fso.FolderExists(savedir)) {
        fso.CreateFolder(savedir);
    }
    
    Editor.FileSaveAs(path, charset, linebreak);
    
    function createFromTemplate(tstr /*, ...args*/) {
        var obj = mergeObjects(Array.prototype.slice.call(arguments, 1));
        return tstr.replace(/\{\{(.*?)\}\}/g, function(_, name) {
            return obj[name] || "";
        });
    }

    function mergeObjects(objects) {
        var result = {};
        for (var i = 0; i < objects.length; i++) {
            var obj = objects[i];
            for (var k in obj) {
                if (obj.hasOwnProperty(k)) {
                    result[k] = obj[k];
                }
            }
        }
        return result;
    }

    function getNowForTemplate() {
        var d = new Date();
        return {
            YYYY: padLeft(d.getFullYear(), 4),
            MM: padLeft(d.getMonth() + 1, 2),
            DD: padLeft(d.getDate(), 2)
        };
    }

    function padLeft(value, len, char) {
        char = char || "0";
        var padding = Array.apply(null, Array(len + 1)).join(char);
        return (padding + value).slice(-len);
    }
})();

設定

サクラエディタを立ち上げて、設定 > 共通設定 > マクロ タブを選択し、

名前:saveByDate
Id: 0
File: saveByDate.js
自動実行: 新規/開ファイル後にチェック

で右下の設定ボタンを押します。

すると次回から新規作成時にmemoフォルダ配下にYYYYMMDD_[無題の後の番号].txtという名前で
ファイルを保存するようになります。

おまけ

この方法だと、サクラエディタを開いてすぐ閉じてしまうなど
0kBのファイルがそこそこできることがありますので、 次のようなバッチファイルを%USERPROFILE%\Desktop\memoにおいて実行すると消えます。

@echo off
cd %~dp0
for %%F in (*) do if %%~zF equ 0 del "%%F"
pause

Anaconda3とAnaconda2のインストール(Windows)

f:id:fa11enprince:20200115005038j:plain 例によって備忘録です。 Anaconda3とAnaconda2をWindowsで共存させる方法です。 ありふれた記事なのでGit Bashで使う方法も記載しました。 Python2のEOLが到来したというのに何をしているんだという感じですが、
いまだにNodeの安定板がPython2に依存しているっぽい(node-gypとか…)ので
とりあえず備忘録。はやくPython2滅んでくれ。
Nodeのインストーラーも相変わらず、
てな感じですので…。 Anaconda2を環境変数付きでインストール Anaconda3を環境変数付きでインストール ちなみに私はどちらも64bit版を選んでいます。 環境変数は後にインストール(=上のほう)が優先されます。 あれ?順番はインストーラーによるかも。 とりあえず上のほうが優先されるのでできればPython3の環境変数群を上に持っていきます。

次のバッチファイルを作成します

@echo off
rem ユーザの権限によって異なる様子
rem 管理者 %USERPROFILE%\
rem 通常ユーザー(Just Me) C:\Users\%USERNAME%\AppData\Local\Continuum\
rem 全ユーザー(All Users) C:\ProgramData\ -> C:\Users\All Users (Symbolic link) 
rem https://docs.anaconda.com/anaconda/user-guide/faq/
rem https://stackoverflow.com/questions/37117571/where-does-anaconda-python-install-on-windows

cd %USERPROFILE%\Anaconda2
copy python.exe python2.exe

cd %USERPROFILE%\Anaconda2\Scripts
copy anaconda.exe  anaconda2.exe
copy anaconda-script.py  anaconda2-script.py
copy conda.exe  conda2.exe
copy conda-script.py  conda2-script.py
copy easy_install.exe  easy_install2.exe
copy easy_install-script.py  easy_install2-script.py
copy pip.exe  pip2.exe
copy pip-script.py pip2-script.py
copy spyder.exe  spyder2.exe
copy spyder-script.py  spyder2-script.py

pause

これで実行すると

> python2 --version
Python 2.7.16 :: Anaconda, Inc.
> python --version
Python 3.7.4

ちなみにConEmuとかでGit Bashを使っている場合は、

$ cd ~
$ echo "source $HOME/Anaconda2/etc/profile.d/conda.sh" >> .bashrc
$ echo "source $HOME/Anaconda3/etc/profile.d/conda.sh" >> .bashrc
$ echo "alias python2='winpty python2'" >> .bashrc
$ echo "alias python='winpty python'" >> .bashrc

としてください。 なんかwinptyってGit for Windowsで対話モードのコマンドがうまく動かないことがあるそうなのでそのための対処です。 ちなみにこの状態で.bash_profileがないとWARNINGとともに初回ログイン時に勝手に.bash_profileが作られますのでご安心を。
※インストール方法(Just MeかAll Usersか)やユーザ権限によって変わり、
Just Meを選んだ場合は
$HOME/AppData/Local/Continuum/Anaconda2
$HOME/AppData/Local/Continuum/Anaconda3になる。 いずれにしてもwhere condaで調べられる。

npmの設定ファイルの場所

f:id:fa11enprince:20191129234333j:plain npm config setするよりエディタで直接いじりたくなる人向けの内容
npm config listとかで設定を見ると思うが、
そもそもどっちに設定されているんだっけ?
ってのもあるので…
npm -g config listというのもある。

npmの設定ファイルの場所

普通はnpm config setでやると思うが、面倒な場合
プロジェクト毎かユーザ毎かのを書き換える

種別 Linux Windows
プロジェクト毎 /path/to/project/.npmrc C:\path\to\project\.npmrc
ユーザ毎 ~/.npmrc %USERPROFILE%\.npmrc
グローバル $PREFIX/npmrc %APPDATA%\npm\etc\npmrc
ビルトイン /path/to/install/npm/npmrc C:\path\to\install\npm\npmrc

ちなみに
npm config setだとユーザ毎のファイルが
npm -g config setだとグローバルのファイルが書き換わる
紛らわしいがnpm install -gはビルトインのnode_modules
-gを付けないときはプロジェクト毎。

参考

https://stackoverflow.com/questions/15536872/nodejs-npm-global-config-missing-on-windows/22847156
https://stackabuse.com/the-ultimate-guide-to-configuring-npm/

Maven + Eclipseでマルチモジュールプロジェクトを作成する

f:id:fa11enprince:20190723093752j:plain 良く忘れるのでメモ
様々な事情でプライベートリポジトリを立てられなかったりする場合や、 そもそもプライベートリポジトリ立てるまでもないよねというときに便利なマルチモジュールプロジェクトの構成を作ります。 お題目は、Spring Boot + MongoDB + PostgreSQLにしましょう。
ちなみにですが、あまり解説はしていませんが、本プロジェクトはマルチデータソースに対応しています。
PostgreSQL + MongoDBです。

概要

少々解説すると、

@SpringBootApplication
@ComponentScan(basePackages = { "${packages.common.component}", "${app.package}" })
public class SampleDbAccessApp implements ApplicationRunner {
    @Autowired
    PosgresSampleService postgresSampleService;
    @Autowired
    MongoSampleService mongoSampleService;
    
    public static void main(String[] args) {
        SpringApplication.run(SampleDbAccessApp.class, args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        PostgresSample postgre = new PostgresSample();
        postgre.setName("John");
        postgresSampleService.save(postgre);
        List<PostgresSample> findResult1 = postgresSampleService.findAll();
        findResult1.forEach(System.out::println);
        
        MongoSample mongo = new MongoSample();
        mongo.setName("Kate");
        mongoSampleService.save(mongo);
        List<MongoSample> findResult2 = mongoSampleService.findAll();
        findResult2.forEach(System.out::println);
    }
}

最初のコードによる設定周りさえきちんとやっておけば、特に意識せず上記のように使えます。
PosgresSampleService がPostgresSampleRepository 経由で
PostgreSQLにアクセスできます。
MongoSampleService が MongoSampleRepository 経由で
MongoDBにアクセスできます。

ちなみにWindows前提です。Mac/Linuxも大して変わらないと思います。

ソフト バージョン 備考
Java 1.8
Maven 3.6.1
lombok 1.18.8
Eclipse 2019-12
Font Myrica M
PostgreSQL 10.9 Docker利用
MongoDB 3.6.13 Docker利用
Spring Boot 2.1.6

あと、Docker for WindowsとHyper-V(Windows 10 Pro)が必要です。 なければ、直接入れるなどしてください。 Eclipse IDE 2019‑12で日本語のコメント文字の不具合が修正されていましたのでフォントは不要です。

完成したもの

今回作成するものの完成品です。 下記は具体的な手順です。まさかのJavaのインストールから書いてます。

手順

Javaのインストール

Adopt Open JDK等をインストールします。 インストーラーが準備されているので方法は割愛します。
AdoptOpenJDK - Open source, prebuilt OpenJDK binaries
Java 8のHotSpotがおすすめです。

Mavenのインストール

Maven – Download Apache Maven
よりapache-maven-3.6.1-bin.zipダウンロードします。
ダウンロードしたものを解凍しapache-maven-3.6.1をC直下に移動します。
Cに移動した後、binの位置が下記のようになっていればOKです。
C:\apache-maven-3.6.1\bin
環境変数を設定します。
M2_HOME%USERPROFILE%\.m2
さらに今回はシステム環境変数のほうに上記binのパスを設定します。
C:\apache-maven-3.6.1\bin

Proxy環境で虐げられている人は、まぁ調べてくださいというところですが、
ヒントはやり方は2通りあって、%USERPROFILE%\.m2\settings.xmlを作成するのが一番お手軽です。

念のためコマンドプロンプトにmvn -vを打って下記が表示されればOKです。

>mvn -v
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-05T04:00:29+09:00)
Maven home: C:\apache-maven-3.6.1\bin\..
Java version: 1.8.0_192, vendor: Azul Systems, Inc., runtime: C:\Program Files\Zulu\zulu-8\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

私の環境ではZuleのJDKを使っていますが、たぶん、Adopt Open JDK HotSpotのほうがおすすめです。

PostgreSQLのインストール

https://www.enterprisedb.com/downloads/postgres-postgresql-downloads よりダウンロードしてインストールしてもいいのですが、 docker-composeで入れることにします。 GitHubのReadMe.mdを参照してください。
initdbがうまくいかない場合は
File in docker-entrypoint-initdb.d never get executed when using docker compose - Stack Overflow
に記載してあるように

$ docker volume ls
$ docker volume rm docker_postgresql

として、この後docker-compose up -dをし直せばちゃんと動きます。 にしてもDocker For Windowsでvolumeが簡単にマウントできない問題とか
初回一発再起動しないとまともに動かない問題ってどうにかならないんだろうか。

MongoDBのインストール

Download MongoDB Community Server | MongoDB より3.6.13をダウンロードしてもいいのですが、 docker-composeで入れることにします。 GitHubのReadMe.mdを参照してください。

Eclipseのインストール

2019-06版を入手します。 https://www.eclipse.org/downloads/ ダウンロードした後、インストーラーを立ち上げて、
Eclipse IDE for Enterprise Java Developersを選択します。

いろいろAcceptを聞いてくるので受け入れます。

フォントの設定

特にSTS(Spring Boot Suite)と組み合わせると日本語文字化けが特にコメント周りで発生するので デフォルトフォントをMyrica Mに変更します。 Preference > General > Appearence > Colors and Fonts
Java Editor Text Fontを選択し、Edit Default
でお好みのフォントに変更できます。

lombokのインストール

Java開発ならもはや必須です。標準に取り込んでほしいくらいです。
単なるGetter/Setterを書かなくていいばかりでなく、それ以上の恩恵があります。
https://projectlombok.org/download
よりlombok.jarをダウンロードし、jarをダブルクリックします。 しばらくするとecliseを検知するので、Install/Updateをクリックします。 そのあと、Eclipseを再起動します。

Maven Projectの作成

Eclipseを立ち上げて、
File > New > Maven Projectを選択します。
ひとまずNextを押します。
f:id:fa11enprince:20190728215501p:plain ArtifactIdがmaven-archetype-archetypeのを選びます。
実はどれでもいいです。あとで書き換えるので。
(実はいらないものが含まれてて後でEclipseからビルドパスを消したりしてます。
他にいいもの知っている方がいたら教えてください)
f:id:fa11enprince:20190728215737p:plain

Group Id: com.example.multi-module
Artifact Id: multi-module-project-sample
Version: 0.0.1
Package: com.example.multiModule

としFinishを押下します。
f:id:fa11enprince:20190728223147p:plain

pom.xmlをダブルクリックし、開きます。
Spring Boot用に次のように編集します。 Spring Bootに加えよく使うものを依存関係に含めます

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <groupId>com.example.multi-module</groupId>
    <artifactId>multi-module-project-sample</artifactId>
    <version>0.0.1</version>
    <packaging>pom</packaging>
    <name>Archetype - multi-module-project-sample</name>
    <url>http://maven.apache.org</url>
    
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
    </dependencies>
</project>

このとき、packagingpomになっていることが重要です。
いらないフォルダができるので消しておきます。
(src/main/resourcesなど…)

共通モジュールの作成

commonという名前でモジュールを作成します。
プロジェクトエクスプローラーのmulti-module-project-sampleを右クリックし、
New > Other > Maven > Maven Moduleを選択します。
f:id:fa11enprince:20190728221559p:plain
multi-module-commonとModule Nameに入力します。
f:id:fa11enprince:20190728223336p:plain
ArtifactIdがmaven-archetype-archetypeのを選びます。
f:id:fa11enprince:20190728221816p:plain
下記を入力します。

Group ID: com.example.multi-module-common
Package: com.example.multiModule.common

そしてFinishを押下します。
f:id:fa11enprince:20190729002139p:plain
こうすると、親のpom.xmlに

 <modules>
        <module>multi-module-common</module>
    </modules>

が追加されます。 ここでmulti-module-project-commonのpom.xmlを次のように書き換えます。

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.multi-module</groupId>
        <artifactId>multi-module-project-sample</artifactId>
        <version>0.0.1</version>
    </parent>
    <groupId>com.example.multi-module-common</groupId>
    <artifactId>multi-module-common</artifactId>
    <name>Archetype - multi-module-common</name>
    <url>http://maven.apache.org</url>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>
    </dependencies>
</project>

一旦ここで親プロジェクトから右クリック > Maven > Maven Installを実行します。

共通モジュールのソースコードを書きます

最初に貼ってあるGitHubを参照してください。

メインのモジュールを作成

ここは実際にはWebAppだったりBatchだったりすると思うのですが、サンプルなので単純なバッチとします。 例によって、親プロジェクトを右クリックしてサブモジュールを追加します。 New > Other > Maven > Maven Moduleを選択します。
multi-module-batchとModule Nameに入力します。
f:id:fa11enprince:20190729003706p:plain
ArtifactIdがmaven-archetype-archetypeのを選びます。
f:id:fa11enprince:20190729003823p:plain
下記を入力します。

Group ID: com.example.multi-module-batch
Package: com.example.multiModule.batch

f:id:fa11enprince:20190729003948p:plain
pom.xmlからバージョンのみ消して下記のようになっていればOKです

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.multi-module</groupId>
        <artifactId>multi-module-project-sample</artifactId>
        <version>0.0.1</version>
    </parent>
    <groupId>com.example.multi-module-batch</groupId>
    <artifactId>multi-module-batch</artifactId>
    <packaging>pom</packaging>
    <name>Archetype - multi-module-batch</name>
    <url>http://maven.apache.org</url>
</project>

ちなみに書き忘れてましたが、いらないフォルダができるので消しておきます。
(`src/main/resourcesなど…)
またこのモジュールもpomのpackaging指定にします。

さらにサンプル用モジュールを作成します

先程作ったcom.example.multi-module-batchの配下にサンプル用のモジュールを作成します。 例によってこの配下にMaven Moduleを作成します。 キャプチャは飽きたと思うので

Module Name: sample-db-access
Group Id: com.example.sample-db-access
Package: com.example.multiModule.sampleDbAccess

とします。 pom.xmlからバージョン指定を消します。さらにdependencyに先程作成したcommonを追加してあげます。

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.example.multi-module-batch</groupId>
        <artifactId>multi-module-batch</artifactId>
        <version>0.0.1</version>
    </parent>
    <groupId>com.example.sample-db-access</groupId>
    <artifactId>sample-db-access</artifactId>
    <name>Archetype - sample-db-access</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>com.example.multi-module-common</groupId>
            <artifactId>multi-module-common</artifactId>
            <version>0.0.1</version>
        </dependency>
    </dependencies>
</project>

この辺りでMavenが文句を言ってくるのでプロジェクトを右クリックして
Maven > Update Maven Project
を実行しますと黙ります。

ソースコードを書きます

前述のGitHubを参照してください。

おまけ Ecliseの設定

プロジェクトとパッケージを階層表示にする

インストール直後だとデフォルトでいろいろ嫌なところがあるので変更します。
トップの親プロジェクトをProject Explorerで選択し、▽マークのアイコンを押します。
Project Presentation > Hierarchical さらに
Package Presentation > Hierarchical にします。

空白、Tab、改行などを表示する

Window > Preferences > General > Editors > Text Editors
Show whitespace charactersをチェックしてOKを押下します。

参考リンク

Eclipseでコメントの前の方だけ文字化けする - Qiita
3. Maven 入門 (7) | TECHSCORE(テックスコア)
GitHub - spring-projects/spring-data-examples: Spring Data Example Projects
GitHub - mbogner/spring-boot-multiple-databases
Compose ファイル・リファレンス — Docker-docs-ja 17.06 ドキュメント
Docker for Windowsでpostgresのデータマウントができない人へ - Qiita
MongoDB + mongo-expressをDocker Composeでお手軽構築 - Qiita