2017/03/17

Windows 環境で Gradle 3.4.1 を使う

ギョームで Java を使うことになったので、 Gradle の復習をしていく。

環境構築

Chocolatey なんて使わせてもらえないから手動構築を行う。 手順は Gradle | Installation 参照。

バイナリの入手

Binary-Only のリンクからファイルをダウンロード。 (2017/3/16 時点では、gradle-3.4.1-bin.zip がダウンロードされる)

展開してパスを通す

  1. %USERPROFILE%\develop\ ディレクトリを作成
  2. 「1.」で作成したディレクトリで gradle-3.4.1-bin.zip を展開し、できたディレクトリを gradle-3.4.1 にリネーム
    • %USERPROFILE%\develop\gradle-3.4.1 というディレクトリができる
  3. %USERPROFILE%\develop\gradle-3.4.1\bin にパスを通す
  4. 環境変数 JAVA_HOME を設定する

動作確認

> cd %USERPROFILE%\project\
> mkdir GradleTest
> cd GradleTest
> gradle init --type java-application

これでプロジェクトのひな型ができたので、早速ビルドする。

> gradlew.bat build

本来は gradlew.bat を使う必要はない(すでに環境構築してあるホストだから)けど、配布された側になったつもりで gradlew.bat を使う。

gradle や、依存ライブラリをダウンロードしたうえでビルドしてくれる。

>gradlew.bat run
:compileJava UP-TO-DATE
:processResources NO-SOURCE
:classes UP-TO-DATE
:run
Hello world.

大丈夫そう。

設定ファイル作成

  • eclipse で実装
  • JUnit でテスト
  • findbugs 使う(html レポート)
  • jacoco 使う(html レポート)
  • checkstyle 使う(html レポート)
  • build するだけで findbugs, jacoco, checkstyle のレポートを出力する
  • lombok 使う
  • args4j 使う

あたりの設定を追加。

/*
 * This build file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Java project to get you started.
 * For more details take a look at the Java Quickstart chapter in the Gradle
 * user guide available at https://docs.gradle.org/3.4.1/userguide/tutorial_java_projects.html
 */

// Apply the java plugin to add support for Java
apply plugin: 'java'

// Apply the application plugin to add support for building an application
apply plugin: 'application'

apply {
    plugin 'eclipse'
    plugin 'checkstyle'
    plugin 'findbugs'
    plugin 'jacoco'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8
version = 1.0

[compileJava, compileTestJava]*.options*.encoding = "UTF-8"

// In this section you declare where to find the dependencies of your project
repositories {
    // Use jcenter for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

[checkstyleMain, checkstyleTest, findbugsMain, findbugsTest]*.ignoreFailures = true

configurations {
    provided
}

sourceSets {
    main {
        compileClasspath += configurations.provided
    }
}

eclipse.classpath {
    plusConfigurations += [ configurations.provided ]
    minusConfigurations += [ configurations.provided ]
}

dependencies {
    // This dependency is found on compile classpath of this component and consumers.
    compile 'com.google.guava:guava:20.0'

    // Use JUnit test framework
    testCompile 'junit:junit:4.12'
    testCompile "org.hamcrest:hamcrest-all:1.3"

    compile 'args4j:args4j:2.0.16'
    provided 'org.projectlombok:lombok:1.16.4'
}

// Define the main class for the application
mainClassName = 'App'

test {
    doLast {
        tasks.jacocoTestReport.execute()
    }
}

jacocoTestReport {
    reports {
        xml.enabled = false
        html.enabled = true
        html.destination = "${buildDir}/reports/jacoco"
    }
}

tasks.withType(FindBugs) {
    reports {
        xml.enabled = false
        html.enabled = true
    }
}

tasks.withType(Checkstyle) {
    reports {
        xml.enabled false
        html.enabled true
        html.destination = "${buildDir}/reports/checkstyle/checkstyle.html"
    }
}

jar {
    manifest {
        attributes 'Implementation-Title': 'Test App.'
        attributes 'Implementation-Version': 1.0
        attributes "Main-Class" : "App"
    }
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}

動くか試す。

> gradlew.bat build

うん、一通りレポート出力されているっぽい。

とりあえずこんなものでいいか。

2017/03/09

YukiTask を MSYS2 on Windows 環境で試した

結城タスク / YukiTask - A Simple Task Manager for Command Line Lovers. が気になったので、 Windows で使えないか試行錯誤してみた。その作業記録。

前提環境

  • OS : Windows 10 Pro 64bit
  • MSYS2 環境インストール済み
    • /etc/fstab/C/Users/mikoto を指定しているので、「Windows のホームディレクトリ == MSYS2 環境のホームディレクトリ」になっている状態
  • RubyInstaller for Windows の 2.3.3 をインストール済みなので、これを使用する

作業ログ

Setup YukiTask を参照しながらセットアップ。 (今回はお試しなので、 .bashrc に追記しないで試している。)

$ cd ~project
$ wget https://github.com/hyuki0000/yukitask/archive/master.zip
$ unzip master.zip
$ cd yukitask-master
$ mv yukitask/ ~

$ export EDITOR=~/app/vim80-kaoriya-win64/gvim.exe
$ export PATH=~/yukitask:$PATH
$ export PATH=$PATH:/C/Ruby23-x64/bin/
$ source ~/yukitask/command_aliases
$ source ~/yukitask/here_aliases

導入はできたはずなので YukiTask TODO management を試してみる。

$ mkdir ~/project/yukitask_practice
$ cd ~/project/yukitask_practice
$ here yukitask_practice
'pbcopy' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
~/yukitask/here_aliases is updated.
alias yukitask_practice='pushd C:/Users/mikoto/project/yukitask_practice; show_todo'
Execute Command+V on the command line to update aliases.

pbcopy がないのか...。 pbcopy の代替設定を行って再挑戦。

$ function pbcopy() {
>     echo $* > /dev/clipboard
> }
$ cd ~/project/yukitask_practice
$ here yukitask_practice
'pbcopy' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
~/yukitask/here_aliases is updated.
alias yukitask_practice='pushd C:/Users/mikoto/project/yukitask_practice; show_todo'
Execute Command+V on the command line to update aliases.

あー...。 ~/yukitask/here が Ruby スクリプトで、 system() でコマンド実行しているから functioin で関数定義するだけじゃ無理なのか。

処理内容を見る限り、ペーストでの ~/yukitask/here_aliases の再読み込みができないだけで ~/yukitask/here_aliases の更新自体はされているようなので保留とする。

更新時は source ~/yukitask/here_aliases を自力で打つ感じで。

ということで続きをやってみる。

$ cd
$ yukitask_practice
~/project/yukitask_practice ~
bash: /home/mikoto/yukitask/show_todo: /usr/bin/ruby: 誤ったインタプリタです: No such file or directory

oh...。~/yukitask/show_todo の shebang が /usr/bin/ruby になっているから ruby が見つからない。 #!/usr/bin/ruby#!/usr/bin/env ruby に書き換えて実行。

あ、あと、関係ないけど移動は pushd でやっているのね。

$ cd
$ yukitask_practice
~/project/yukitask_practice ~
cat: '$HOME/yukitask/TODO': No such file or directory

えーと、今度は、ホームディレクトリを表すのに $HOME を使用しているから、 Windows ネイティブのの Ruby からだと環境変数が見えないのか。

$HOME~ に修正して試してみる。

$ yukitask_practice
~/project/yukitask_practice ~
This is your global TODO file.
Use 'TT' command to edit this file.

ok。 続きを実施。

$ T # TODO 修正
$ cd
$ yukitask_practice
~/project/yukitask_practice ~ ~
This is your global TODO file.
Use 'TT' command to edit this file.
yukitask_practice's TODO

ちゃんと動いているっぽい。

続いて YukiTask Make を試す。 さっき使ったプロジェクトをそのまま流用。

$ cd ~/project/yukitask_practice
$ cp ~/yukitask/makefile.default makefile
$ m # エディタで makefile が開かれる
$ mk
You are executing 'mk' command. Please edit your 'makefile'.

こちらも大丈夫そう。

ちゃちゃっと試していきましょう。 次は YukiTask Graph

$ start ~/yukitask/graph-recent.html # 空白のページが表示された

あれー??? ~/yukitask/touch_task あたりが原因かな?とあたりを付けてソースを読む。

~/yukitask/touch_tasksystem("update_graph") が怪しいので、 とりあえず ~/yukitask/update_graph 単独で実行してみる。

$ cd ~/project/yukitask_practice
$ update_graph
$ start ~/yukitask/graph-recent.html # グラフが表示された

これは、 Windows ネイティブの Ruby 使っているから PATH が通っていないんだなきっと。

うーん、MSYS2 環境から Windows ネイティブ Ruby 呼ぶのが間違いなきがしてきた。 とはいえ MSYS2 の Ruby 入れると使い分けとかいろいろややこしくなりそう。

面倒なので bash 経由で呼び出すように修正した。 bash なら環境変数よしなに取り扱ってくれそうだし。

%s/system("update_graph")/system("bash -c \\\"\~\/yukitask\/update_graph\\\"") 的な感じで書き換えて再挑戦。

$ cat /dev/null > ~/yukitask/graph-recent.html
$ mk
$ start ~/yukitask/graph-recent.html # グラフが表示された

何となく mk の実行時間長くなった気がするけどとりあえずグラフの更新は成功した。

感想

MSYS2 の packman でインストールできる ruby を使うようにすれば、 今回つまずいた中のいくつかは回避できるんじゃないかな? 特にこだわりが無いのであればそちらを推奨。

yukitask 自体の設定ファイル的な存在が makefile なので、 プロジェクトルートに Makefile が存在するようなプロジェクトの管理はできなそう。 (昨今そんなプロジェクトはめったにないけれど)

基本的な設定は ~/yukitask 下で管理されているので、 プロジェクトルート直下の TODOmakefile.gitignore に登録すれば、 公開前提のプロジェクトでもいい感じに管理できそう。 (場合によっては TODO すら ignore 設定しなくてもよい感じ)

ここまで試してみて、グラフ表示に魅力を感じてきているので、使い方を模索しつつなるべく体をなじませていきたい感じ。

参考資料

2017/02/19

AArch64 armasm の勉強 システムレジスタの値を取得する実習

前々回前回で、システムレジスタについてと、 C 言語から armasm のサブルーチンを呼び出す方法が分かった気がする。 なので、実際にプログラムを作成してレジスタの値が取得できるかを確かめる。

前提

この辺の作業で使った環境を引き続き使用している。

作成したプログラム

main.c

#include <string.h>
#include <types.h>
#include <uart.h>

#include "SystemRegisters.h"

#define BUF_LENGTH 255

int main() {

    char cbuf[BUF_LENGTH];

    uint32 daifFlags = daif();
    ltoa(daifFlags, cbuf, BUF_LENGTH, 2);
    print("daifFlags = ");
    println(cbuf);

    uint32 nzcvFlags = nzcv();
    ltoa(nzcvFlags, cbuf, BUF_LENGTH, 2);
    print("nzcvFlags = ");
    println(cbuf);

    while (1);

    return 0;
}

SystemRegisters.h

#include <types.h>

extern uint32 daif();
extern uint32 nzcv();

SystemRegisters.S

.global daif
daif:
    MRS X0, DAIF
    RET
.global nzcv
nzcv:
    MRS X0, NZCV
    RET

とりあえずこれで確認してみる。

実行結果は下記。

daifFlags = 1111000000
nzcvFlags = 1100000000000000000000000000000

printf を実装してないから表示がちょっと残念だけど、 下記、条件フラグの記載を見る限り、 DAIF フラグが全部立ってるので、割り込みはすべて Disable であることと、 Z, C フラグが立ってることを確認できた???

とりあえず今日はここまで。 明日はこれでいろいろなレジスタの状態を確認していってみようか。