AlfredでTerminal / Shellを利用する

こんにちは。最近仕事でmacを使うようになったbeaglesoftの真鍋です。

私のパソコン遍歴は色々と紆余曲折しているのですが、なんだかんだ言ってもmacは便利です。Windowsは色々と遅く感じてしまうし、Linuxだと開発以外の仕事では少し不便というところなのでmacはちょうどいい塩梅になっています。

Alfred

macは便利なのですが、その便利を支えるアプリケーションは結構たくさんあります。その中でも、とりあえずこれはと言われるとやはりAlfred - Productivity App for Mac OS Xが真っ先に思いつきます。

Alfredは単なるランチャーアプリケーションなのですが、おそらくエディタやターミナルと同じくらい頻繁に利用します。というのも、何かをしようと思ったときにまずAlt + Spaceから始まることが多いからです。

また、GoogleでAlfredと検索すればいろいろな機能についての紹介があります。使う人のコンテキストにもよるのでしょうが、いろいろな人にとって便利なアプリケーションではないでしょうか。

AlfredでTerminalやシェルを使う

さて、Alfred3のFeatuersにはいろいろな機能がありますが、Terminal / Shellという機能があります。この機能ではAlfredに>を入力することでTerminalや指定したShellコマンドを実行することができます。

例えば> topと入力すると、Terminalが起動しtopコマンドが実行されます。

iTermが利用したい

この機能便利なのですが、デフォルトではTerminalが起動します。私はいつもiTermを利用しているのでできればiTermが起動してほしいです。

ちょっとGoogleで検索したところ以下のようにiTermを起動するためのScriptがわかりやすい説明とともに紹介されていました。

stuartcryan/custom-iterm-applescripts-for-alfred: Custom iTerm Applescripts for Alfred

かんたんに手順をまとめると、、、

  1. curl --silent 'https://raw.githubusercontent.com/stuartcryan/custom-iterm-applescripts-for-alfred/master/custom_iterm_script_iterm_2.9.applescript' | pbcopyを実行します。
  2. Alfredを起動してpreを入力し、show Alfred preferencesを表示します。
  3. FeaturesTerminal / Shellを表示します。
  4. ApplicationをCustomに変更してCommand+Pで貼り付けます。
  5. Alfredを再起動します。

これで設定は完了です。今回はAlfred3を利用したのですが、古いバージョンを利用する場合にはダウンロードするスクリプトが異なるようなので注意してください。

それでは、楽しいmacライフを!

SDKMANでJavaの開発環境をセットアップする

こんにちは。beaglesoftの真鍋です。

Javaの開発環境はJDKのインストールに始まりビルドツールであるmavenやgradleのインストールまで行う必要があります。以前はそれぞれ別々にインストールする必要があったのですが、最近ではこれらのツールを管理するツールが提供されておりかなり便利にインストールができます。そのツールがcurl -s “https://get.sdkman.io” | bashです。

JDKのインストールについて

JDKのインストールについてSDK MANで実行することは可能ですが、インストール後の設定でJAVA_HOMEの設定などを行う必要があるためOracle社からJDKをダウンロードしてインストールすることをおすすめします。

SDK MANのインストール

SDK MANのインストールは以下のコマンドを実行します。

$ curl -s "https://get.sdkman.io" | bash


Thanks for using...


     SSSSSSSSSSSSSSS DDDDDDDDDDDDD       KKKKKKKKK    KKKKKKK
   SS:::::::::::::::SD::::::::::::DDD    K:::::::K    K:::::K
  S:::::SSSSSS::::::SD:::::::::::::::DD  K:::::::K    K:::::K
  S:::::S     SSSSSSSDDD:::::DDDDD:::::D K:::::::K   K::::::K
  S:::::S              D:::::D    D:::::DKK::::::K  K:::::KKK
  S:::::S              D:::::D     D:::::D K:::::K K:::::K
   S::::SSSS           D:::::D     D:::::D K::::::K:::::K
    SS::::::SSSSS      D:::::D     D:::::D K:::::::::::K
      SSS::::::::SS    D:::::D     D:::::D K:::::::::::K
         SSSSSS::::S   D:::::D     D:::::D K::::::K:::::K
              S:::::S  D:::::D     D:::::D K:::::K K:::::K
              S:::::S  D:::::D    D:::::DKK::::::K  K:::::KKK
  SSSSSSS     S:::::SDDD:::::DDDDD:::::D K:::::::K   K::::::K
  S::::::SSSSSS:::::SD:::::::::::::::DD  K:::::::K    K:::::K
  S:::::::::::::::SS D::::::::::::DDD    K:::::::K    K:::::K
   SSSSSSSSSSSSSSS   DDDDDDDDDDDDD       KKKKKKKKK    KKKKKKK


                      mmmmmmm    mmmmmmm     aaaaaaaaaaaaa  nnnn  nnnnnnnn
                    mm:::::::m  m:::::::mm   a::::::::::::a n:::nn::::::::nn
                   m::::::::::mm::::::::::m  aaaaaaaaa:::::an::::::::::::::nn
                   m::::::::::::::::::::::m           a::::ann:::::::::::::::n
                   m:::::mmm::::::mmm:::::m    aaaaaaa:::::a  n:::::nnnn:::::n
                   m::::m   m::::m   m::::m  aa::::::::::::a  n::::n    n::::n
                   m::::m   m::::m   m::::m a::::aaaa::::::a  n::::n    n::::n
                   m::::m   m::::m   m::::ma::::a    a:::::a  n::::n    n::::n
                   m::::m   m::::m   m::::ma::::a    a:::::a  n::::n    n::::n
                   m::::m   m::::m   m::::ma:::::aaaa::::::a  n::::n    n::::n
                   m::::m   m::::m   m::::m a::::::::::aa:::a n::::n    n::::n
                   mmmmmm   mmmmmm   mmmmmm  aaaaaaaaaa  aaaa nnnnnn    nnnnnn


                                                 Now attempting installation...

Looking for a previous installation of SDKMAN...
Looking for unzip...
Looking for zip...
Looking for curl...
Looking for sed...
Installing SDKMAN scripts...
Create distribution directories...
Getting available candidates...
Prime the config file...
Download script archive...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 20944  100 20944    0     0   9382      0  0:00:02  0:00:02 --:--:--  142k
Extract script archive...
Install scripts...
Set version to 5.5.10+240 ...
Attempt update of zsh profiles...



All done!


Please open a new terminal, or run the following in the existing one:

    source "/Users/user/.sdkman/bin/sdkman-init.sh"

Then issue the following command:

    sdk help

Enjoy!!!

次にターミナルなどを新しく起動して以下のコマンドを実行します。

$ source "/Users/{user}/.sdkman/bin/sdkman-init.sh"
$ sdk help
==== BROADCAST =================================================================
* 12/08/17: Kscript 1.6.0 released on SDKMAN! #kscript
* 10/08/17: Azul Zulu 9ea13 is now available for download from SDKMAN! on Linux, Mac OSX, Windows. #java
* 09/08/17: Java 8u144 released on SDKMAN! #java
================================================================================

Usage: sdk <command> [candidate] [version]
       sdk offline <enable|disable>

   commands:
       install   or i    <candidate> [version]
       uninstall or rm   <candidate> <version>
       list      or ls   [candidate]
       use       or u    <candidate> [version]
       default   or d    <candidate> [version]
       current   or c    [candidate]
       upgrade   or ug   [candidate]
       version   or v
       broadcast or b
       help      or h
       offline           [enable|disable]
       selfupdate        [force]
       flush             <candidates|broadcast|archives|temp>

   candidate  :  the SDK to install: groovy, scala, grails, gradle, kotlin, etc.
                 use list command for comprehensive list of candidates
                 eg: $ sdk list

   version    :  where optional, defaults to latest stable if not provided
                 eg: $ sdk install groovy

ここまででSDK MANのインストールは完了です。特にmacやUbuntuで設定内容が異なることはありません。素晴らしいですね!

JDKのインストール

ここからは各アプリケーションのインストールです。インストールできるアプリケーションを表示します。

$ sdk list

================================================================================
Available Candidates
================================================================================
q-quit                                  /-search down
j-down                                  ?-search up
k-up                                    h-help

--------------------------------------------------------------------------------
Activator (1.3.10)                   http://www.lightbend.com/activator/download

Typesafe is a GUI/CLI tool to help with building reactive applicaions. It uses
sbt (simple build tool) behind the scenes to build, run, and test your project.
It provides a code editing interface, and provides templaes and seeds for you to
clone and use.

                                                         $ sdk install activator
--------------------------------------------------------------------------------
Ant (1.10.1)                                             https://ant.apache.org/

Apache Ant is a Java library and command-line tool whose mission is to drive
processes described in build files as targets and extension points dependent
upon each other. The main known usage of Ant is the build of Java applications.
Ant supplies a number of built-in tasks allowing to compile, assemble, test and
run Java applications. Ant can also be used effectively to build non Java
applications, for instance C or C++ applications. More generally, Ant can be
used to pilot any type of process which can be described in terms of targets and
tasks.

                                                               $ sdk install ant
--------------------------------------------------------------------------------
...

listを表示することで、インストール可能なアプリケーションとインストール法オフが表示されます。例えば、Antの場合にはsdk install antでインストールできることがわかります。

groovyのインストール

groovyのインストールは以下の通り実行します。

$ groovy -v
zsh: command not found: groov

$ sdk install groovy

Downloading: groovy 2.4.12

In progress...

######################################################################## 100.0%

Installing: groovy 2.4.12
Done installing!


Setting groovy 2.4.12 as default.

$ groovy -v
Groovy Version: 2.4.12 JVM: 1.8.0_144 Vendor: Oracle Corporation OS: Mac OS X

mavenのインストール

mavenのインストールは以下の通り実行します。

$ mvn -v
zsh: command not found: mvn
ymanabe ~ $ sdk install maven

Downloading: maven 3.5.0

In progress...

######################################################################## 100.0%

Installing: maven 3.5.0
Done installing!


Setting maven 3.5.0 as default.
$ mvn -v
Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T04:39:06+09:00)
Maven home: /Users/{user}/.sdkman/candidates/maven/current
Java version: 1.8.0_144, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.12.6", arch: "x86_64", family: "mac"

Gradleのインストール

最後にGradleのインストールを行います。

$ gradle -v
$ sdk install gradle

Downloading: gradle 4.1

In progress...

######################################################################## 100.0%

Installing: gradle 4.1
Done installing!


Setting gradle 4.1 as default.

$ gradle -v

------------------------------------------------------------
Gradle 4.1
------------------------------------------------------------

Build time:   2017-08-07 14:38:48 UTC
Revision:     941559e020f6c357ebb08d5c67acdb858a3defc2

Groovy:       2.4.11
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_144 (Oracle Corporation 25.144-b01)
OS:           Mac OS X 10.12.6 x86_64

最後に

これでJavaに関する環境構築はかなり楽になるのではないでしょうか。手動でインストールを行っていた方はぜひ利用してみてください。

Gradleのtestタスクでソースコードがコピーされない

こんにちは。beaglesoftの真鍋です。

IntelliJでJavaクラスファイルを作成するところがKotlinファイルを作成してからKotlin使い始めました。

さて、先日Gradleを利用してテストを実行しよう(gradle clean test)としたところ、:test NO-SOURCEと表示されテストが実行されない事象に遭遇しました。あまりにもアタリマエのことなのでGoogleで検索しても出てこなかったため簡単にまとめてみます。

状況

プロジェクトの構成はGradleのJavaプラグインの規約に準拠したプロジェクト構成でした。

.
├── README.md
├── beagle-customer.iml
├── build
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── src
    ├── main
    │   ├── java
    │   │   └── net
    │   │       └── beaglesoft
    │   │           └── customer
    │   └── resources
    │       ├── META-INF
    │       │   └── net
    │       │       └── beaglesoft
    │       │           └── customer
    │       ├── application-prod.properties
    │       ├── application-staging.properties
    │       ├── application.properties
    │       ├── db
    │       │   └── migration
    │       ├── logback-spring.xml
    │       ├── static
    │       └── templates
    └── test
        ├── java
        │   └── net
        │       └── beaglesoft
        │           └── customer
        │               ├── controllers
        │               │   ├── BarControllerTest.groovy
        │               │   └── ...
        │               └── services
        │                   ├── FooService.groovy
        │                   └── ...
        └── resources
            ├── application.properties
            └── logback-spring.xml

また、build.gradleは特段の処理を追加することもなく以下のような標準的な内容となっていました。

group 'beagle-customer'
version '1.0-SNAPSHOT'

buildscript {
    ext.kotlin_version = '1.1.2'
    ext {
        springBootVersion = '1.5.4.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

repositories {
    mavenCentral()
    repositories {
        mavenCentral artifactUrls: [
                'http://jasperreports.sourceforge.net/maven2',
                'http://jaspersoft.artifactoryonline.com/jaspersoft/third-party-ce-artifacts/'
        ]
    }
}

apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: "groovy"
apply plugin: 'idea'
apply plugin: 'jacoco'
apply plugin: 'org.springframework.boot'

version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

idea {
    module {
        inheritOutputDirs = false
        outputDir = file("$buildDir/classes/main/")
    }
}

springBoot {
    mainClass = "net.beaglesoft.customer.CustomerApp"
}

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

// DOMA用の設定
processResources.destinationDir = compileJava.destinationDir
compileJava.dependsOn processResources

dependencies {
.. 省略
}

task wrapper(type: Wrapper) {
    gradleVersion = '3.4.1'
}

原因

原因はテストファイルにありました。今回テストは[Spock](http://spockframework.org/]を利用しているため、テストファイルの保存先はjavaではなくgroovyとするのが正しいということがわかりました。

.
├── README.md
├── beagle-customer.iml
├── build
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── src
    ├── main
    │   ├── java
    │   │   └── net
    │   │       └── beaglesoft
    │   │           └── customer
    │   └── resources
    │       ├── META-INF
    │       │   └── net
    │       │       └── beaglesoft
    │       │           └── customer
    │       ├── application-prod.properties
    │       ├── application-staging.properties
    │       ├── application.properties
    │       ├── db
    │       │   └── migration
    │       ├── logback-spring.xml
    │       ├── static
    │       └── templates
    └── test
        ├── groovy
        │   └── net
        │       └── beaglesoft
        │           └── customer
        │               ├── controllers
        │               │   ├── BarControllerTest.groovy
        │               │   └── ...
        │               └── services
        │                   ├── FooService.groovy
        │                   └── ...
        └── resources
            ├── application.properties
            └── logback-spring.xml

気づいてしまえば当たり前なのですが、ミニマムプロジェクトを作成して同じようにGradleの設定を行ってビルドを実行していたところ記述するテストごとにtestディレクトリにディレクトリが作成されていることに気づいたのが最初でした。

その後Groovyプラグインのドキュメントをよく読んでみるとまさにそのことが記述されていました。

[The Groovy Plugin - Gradle User Guide Version 3.3] (https://docs.gradle.org/3.3/userguide/groovy_plugin.html#sec:groovy_project_layout)

src/test/java Test Java source

src/test/groovy Test Groovy sources. May also contain Java sources for joint compilation.

結論

ドキュメントはよく読まないといけないのですが、どこを読めばいいか(すべてを読むことは最初は難しい…)を探るためにも、単純なミニマムコードを用意してうまく行かないことを確認するのは大事ですね。

あと、Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築にはとてもおせわになりました。うまく行かないときはGoogleで検索して出てきたコードの断片をとりあえず貼り付けて動くか?なんてことをやりがちなのですが、正しい情報でないこともありました。

Gradleはどういうものかということがとてもわかり易く記述されていたので役立ちました。公式ガイドもわかりやすいのですが、紙の書籍のほうがパラパラと見れてよかったです。