KotlinでHelloWorld
はじめに
先日、私の送別会の場でKotlinやるという話を聞いて、悔しかったので少しは触っておこうと思った次第です。
で、忘れないようにとりあえずblog書く。
Kotlinとは
- InteliJ IDEAで有名なJetBrainsが作成したJVM言語。
- JavaScriptに変換や、Androidでも動く。
環境構築
- Windowsの場合
- GitHubのリリースページから取得。
- 解凍して好きなとこに置けばOK。
- 好みで
bin
をPATHに追加する。
- SDKMAN
sdk install kotlin
HelloWorld
- 以下のコードを
hello.kt
として保存。
fun main(args: Array<String>) { println("Hello, World!") }
公式に乗ってた
- jarを作成
kotlinc hello.kt -include-runtime -d hello.jar
- 実行
java -jar hello.jar
classにして実行
- コンパイル
- kotlinc hello.kt
- 実行
kotlin HelloKt
REPL
kotlinc-jvm
script
- 以下のコードを
hello.kts
として保存。
println("Hello World")
- 実行
kotlinc -script hello.kts
はじめてMacを使って困ったことまとめ
はじめに
年末にはじめてMacを購入しました。(MacBook Pro 2016 13インチ)
10年以上ずっとWindowsのみだった*1私がMacを触ったら困ったことだらけだった上、基本的な事がわからない場合には、調べても出て事ないという事が結構ありました。
WindowsからMacを触る方の役に立つかもしれないので、私の経験を記載しておきます。
基本操作
- ctrl + space 日本語切り替え
- 英字キーボードの場合は英数、かなキーがない*2
- ctrl + クリック 右クリックメニュー
- 2本指でスクロール
- アプリケーションのメニューバーは最上部
- Windowの上ではなく、画面の最上部
- FinderがWindowsでいうExplorer
- 特定のディレクトリを開きたい場合は、メニュー → 移動 → フォルダへ移動
超基本ショートカット
- command + c コピー
- command + v 貼り付け
キーの読み方?
- command ⌘
- shift ⇧
- option ⌥
- control ⌃
- caps lock ⇪
Windowsと比較した場合の修飾キーについて
Spotlite検索
- command + space Spotlite検索
- これさえ覚えておけばアプリケーション名入れれば呼び出せる
- これを知るまでターミナルの開き方すらわからず。。。(terminalを入力すれば出てくる。)
インストール
- 何かアプリケーションをインストールする場合、Windowsのようなインストーラーが出た場合は問題ないが、↓のようなのが出る場合があります。
- これが出たら、アイコンをドラッグしましょう。
- アプリケーションフォルダにバイナリを移動している?
エスケープ文字
Option + ¥
- Macでは円マーク(¥)とバックスラッシュ(\)はちゃんと区別される。
英字キーボードで英数、かなキー
Karabiner-Elements
Gitのインストール
- Homebrewインストール時に必要となるXCodeのCommandLine Toolsでインストールされる
- が、バージョン低かったりと使いにくいのでHomebrewで別途インストールがオススメ
brew install git
ちなみに個人的な課題
Gebでファイルをダウンロードする
概要
- Gebでファイルをダウンロードするコードです。
- downloadBytes(java.lang.String)を使用することで可能。
コード
@Grapes([ @Grab("org.gebish:geb-core:1.1"), @Grab("org.seleniumhq.selenium:selenium-chrome-driver:3.0.1"), ]) import org.openqa.selenium.chrome.ChromeDriver import geb.Browser println "start ${new Date().format('yyyy/MM/dd HH:mm:ss')}" // chromedriver.exeは前もって準備が必要。 System.setProperty("webdriver.chrome.driver", "./driver/chromedriver.exe") def downLoadPath = $/C:\work\20170301/$ Browser.drive(driver : new ChromeDriver()) { go "http://gebish.org" def bytes = downloadBytes($("a")[0].@href) // ↑のURLは実際にはhtmlですがファイル名はzipで保存してみます。 def outputPath = "${downLoadPath}/hoge.zip" new File(outputPath).newOutputStream().write(bytes) } println "end ${new Date().format('yyyy/MM/dd HH:mm:ss')}"
Groovyで今週の月曜日の日付を取得する
概要
今週の月曜日の日付を取得するという要件があったため色々考えましたが、シンプルになりませんでした。
もっとシンプルな方法があると思うのでどなたか教えてください。。。
コード
def f = { it - (it.day != 0 ? it.day - 1: it.day + 6) } assert f(new Date("2017/01/01")).format("yyyy年MM月dd日(E)") == "2016年12月26日(月)" assert f(new Date("2017/01/02")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)" assert f(new Date("2017/01/03")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)" assert f(new Date("2017/01/04")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)" assert f(new Date("2017/01/05")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)" assert f(new Date("2017/01/06")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)" assert f(new Date("2017/01/07")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)" assert f(new Date("2017/01/08")).format("yyyy年MM月dd日(E)") == "2017年01月02日(月)" assert f(new Date("2017/01/09")).format("yyyy年MM月dd日(E)") == "2017年01月09日(月)" assert f(new Date("2017/01/10")).format("yyyy年MM月dd日(E)") == "2017年01月09日(月)"
PhantomJSDriverは「com.codeborne」を使用する
概要
GebでChromeからPhantomJSに変えようとしたらハマったのでメモします。
PhantomJSを使う場合、「phantomjsdriver
」のグループIDは「com.codeborne
」を使用しましょう。
Web上でサンプルを探すと、1.1は「com.github.detro.ghostdriver
」、1.2は「com.github.detro
」のようなグループIDがでてきますが、ghostdriverのリポジトリを見るともうサポートできないと書かれています。
で、色々forkされていますが、2017/02/06現在は「com.codeborne
」を使用するのがベターみたいです。(codeborneはselenideを開発しているようなので、これからもアップデートされる確率は高いでしょう。)
Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.browserlaunchers.Proxies
とか言われて泣いている人は試してみてください。
コード
@Grapes([ @Grab("org.gebish:geb-core:1.1"), @Grab("com.codeborne:phantomjsdriver:1.3.0"), ]) import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.phantomjs.PhantomJSDriverService import org.openqa.selenium.phantomjs.PhantomJSDriver import geb.Browser import geb.Configuration println "start ${new Date().format('yyyy/MM/dd HH:mm:ss')}" def caps = new DesiredCapabilities() // phantomjs.exeは前もって準備が必要。 caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,"./driver/phantomjs.exe"); def conf = new Configuration() conf.driver = new PhantomJSDriver(caps) Browser.drive(conf) { go "http://gebish.org" assert title == "Geb - Very Groovy Browser Automation" assert $("h1#logo").text() == "Geb (pronounced “jeb”)" } println "end ${new Date().format('yyyy/MM/dd HH:mm:ss')}"
余談
ハマったので「geb-example-gradle」で試してみた所、PhantomJSは失敗します。理由はPhantomJS自体をダウンロードして配置してるのですが、中身が階層化されるように変更されたのか、取得できないという。。。(Windowsしか試していません。)
説明下手ですね。
「geb-example-gradle\build\webdriver\phantomjs\phantomjs.exe
」を期待しているのに、
「geb-example-gradle\build\webdriver\phantomjs\bin\phantomjs.exe
」となるので失敗します。
多分この辺りなので、余裕のある方はプルリクでも出せば取り込まれるような気がします。
更に余談
Geb自体も過去に「org.codehaus.geb
」から「org.gebish
」にグループIDが変更されていてハマった事があったりします。こういうのって誰もがハマるものなんですかね。
We Are JavaScripters! @3rdに参加してきた #wajs #21cafe
はじめに
1月30日(月)*1に「We Are JavaScripters! @3rd」という勉強会に参加してきた時のメモです。
今回で3回連続参加となった勉強会でしたが、今回も楽しめました。ただ、ちょっとした事という割にはそれなりにレベルが高くなっておりました。(ハイレベルという訳ではないです。)懇親会ではレベル下げていきたいという話も出ていたので、また初心者枠で何か発表しようかしら?
概要
「JSの勉強会って、登壇する人がハイレベルな人ばっかりだな〜」 と思ったのがきっかけで作った勉強会、「We Are JavaScripters」! 自分が学んだこと/気づいたこと/面白かったこと/失敗したこと/ハマったこと/挑戦したこと/デバッグテクニック/オススメツール・開発環境/お気に入りのライブラリ/オレオレライブラリ/実はこうだった言語仕様/tips などなど、 お酒を片手に、気軽に発信できる場を目指しています^^/ ※誰でも怖がらずに登壇できる空気を作りたいだけだけなので、もちろん玄人のみなさんも登壇大歓迎です!!
LT.1:JSの基本的なことをちょっと掘り下げてみる話(prototype編・・かも) - @ta__miyan
- prototypeというかコンストラクタ、Objectについて
- ネイティブオブジェクトは全てコンストラクタ関数から生成されている。
- JSの世界は全てオブジェクト?
- プリミティブ型にプロパティの参照やメソッド呼び出しを行った場合、一時的にオブジェクトに変換されている。
- 参照渡しと値渡しについてはググれ
- 次回はprototypeの話をする。
LT.2:モテル駆動開発に基づくElmという選択 - @boiyaa
- Elmはモテる
- インストールだけすればOK。
- Elmは純粋関数型言語。
- やさしく関数の世界にいざなってくれる。
- 必ずモテる銀の弾丸ではない。
- 半年に一回ペースで破壊的アップデートあり。
- 純粋な?関数型言語用語?を使っていない。
LT.3:Angular2のChangeDetectionを観察する - @yuuta_moriyama_1
- ディベートのオンラインシステムを開発。
- 仲間募集中
- リファクタリングプラン。
- Immutable Objects
- 通常は変更されたときに、全てのコンポーネントを見に行ってしまう。
- 全てを見に行かないように制御する
- Component Lifecycle
- Componentには生成されてから削除されるまでにそれぞれのフェーズでフック可能。
LT.4:PrimeNGという選択肢 - @shinse
- PrimeNGという選択肢について
- ライブラリ
- いわゆる大企業が業務フローを固めるために使うアプリケーション
- Angular向けUIライブラリ
- おじさん受けの良い機能が多い
- コンシュマーみたいなUIを使いたがっている。
- そんなおじさま方にうける。
LT.5:ES6で関数型プログラミング - @Kawabata_Lemon
- ES6時代の関数型プログラミング
- 関数型とは。
- 値とどう向き合うか。
- ある入力に対する出力がいつも同じ値を返す
- 変数の巻き上げ。
var
は呼び出し時に宣言していなくても、エラーとならない。
- 関数型を使うと考え方が身につく
- 問題が起こりにくい感覚がみにつく。
LT.6:anime.jsがいいらしい - @711fumi
- anime.jsがいいらしい
- ロゴが派手
- 数100行位のシンプルなライブラリ
- 複雑な動きはできない?
- V2がでそう!
- 見た人に何を感じてほしいか考える
- http://anime-js.com/
LT.7:サーバサイドエンジニアにこそ試して欲しいBaaS - @moongift
- サーバサイドエンジニアにこそ使って欲しいBaaS
- MOONGIFTの中の人。
- NCMBMania
- mbaas
- http://mb.cloud.nifty.com/about.htm
LT.8:名前の話 - @chikoski
- JavaScriptのモジュールはES2015で定義されている。
- が、ブラウザでは実装は一切されていない。。。
- モジュールを使うと、名前が外に出ないので、適当な名前でOKw
*1:なんでいつも月曜日?
Groovyでメール送信
概要
Groovyのスクリプトでメール送信する機会がありました。
AntBuilderで飛ばせる的な記載はありましたが、意外とサンプルそのまま動かせるものがなかったのでメモしておきます。
コード
@Grab(group='javax.activation', module='activation', version='1.1.1') @Grab(group='javax.mail', module='mail', version='1.4.7') @GrabConfig(systemClassLoader=true) def ant = new AntBuilder() ant.mail( from: "from@example.com", tolist: "to@example.com", message: "本文", subject: "タイトル", mailhost: "smtphost", messagemimetype: "text/html", )
備考
- messageを改行する場合は「
<br/>
」を使用する。- Gmailにて確認。
- 「
message.replaceAll("\n","<br/>")
」という形になるか?
- toが複数人の場合は「,」で繋げる。