nFact

n!

WindowsでLinuxのfindのような検索を行う

WindowsLinuxのfindコマンドと同等のものをやりたいとき、結構困りますよね。

うっかりWindowsのFINDを使ってしまうと

FIND: パラメータの書式が違います

とか言われてしまう…これがあのいつものdirコマンドでなんとかできます。

dir コマンドを使ったfindのような検索

dirコマンドの再帰的にファイルを表示するオプションを使う方法です。

dir /s /b *検索文字列*

例えば「カレントディレクトリ以下のJavaファイルを検索したい場合」は

dir /s /b *.java*

となります。

find . -name "*.java"

に近い結果が表示されます。

dirに指定しているオプションの/s/bの意味は次のとおりです。

  /B          ファイル名のみを表示します (見出しや要約が付きません)。
  /S          指定されたディレクトリおよびそのサブディレクトリのすべての
              ファイルを表示します。

他に設定できるオプションの詳細は次のコマンドでわかります。

dir /?

コマンドの返り値( %ERRORLEVEL% )によって、ファイルが見つかったかどうかがわかります。
0が返ると検索成功、1が返ると検索失敗(ファイルが見つからなかった場合など)です。

... > dir /s /b *.java*
(ここに結果が表示される)

... > echo %ERRORLEVEL%
0

... > dir /s /b *.javaaaaaaa*
ファイルが見つかりません

... > echo %ERRORLEVEL%
1

これを覚えればFINDで怒られることもなさそうです。

Cloud Source RepositoriesからGKEへアプリケーションをデプロイさせるまでの流れ

5/26に正式公開となったCloud Source Repositoriesから、GKEへアプリケーションをデプロイさせるまでの流れについて、試してみたので記事にしてみます。

TL;DR

  • Cloud Source Repositoriesでリポジトリを作成して、
  • Container Registoryでトリガーを作ってイメージをビルドして、
  • gcloudコマンドでクラスタにデプロイ

Cloud Source Repositoriesとは

GCP上でホストされるgitリポジトリです。プライベートリポジトリをほぼ無制限に*1持つことができるのが特徴です。

コミット履歴の表示、ソースの編集機能など、最低限必要な機能は一通り揃っている上、Stackdriverなどの既存サービスと統合されています。こちらは後日試していきたいですね。

Cloud Source Repositoriesを始める

コンソールに移動して、左カラムから「Source Repositories」を選択します。

f:id:noko_k:20170526233744p:plain

これが初めての画面ですね、ワクワクしますね!

「開始」を押すと、最初のリポジトリ名を何にするか聞かれます。

作成すると、次のような空のリポジトリの画面が出てきました。

f:id:noko_k:20170526233959p:plain

3つの選択肢がありますが、それぞれ、

「ローカルGitレポジトリからCloudレポジトリへのコードのpush」

今持っているソースはGitHubやBitBucketにホストされていないソースで、ローカルに持っている場合、このオプションが使えます。 Google Cloud SDKが必要です。

「ローカル Git レポジトリへの Cloud レポジトリのクローン作成」

外部ホスティングサービスや手元にソースが無く、Cloud Repositoriesから新規のリポジトリを作成する場合は、こちらを選択します。 こちらも、Google Cloud SDKが必要です。

GitHub または Bitbucket からの自動ミラーリング

既にGitHubやBitBucketを利用している場合は、このオプションが一番楽だと思います。ブラウザのみで完結します。

今回は、3つ目のミラーリングを試してみようと思います。 *2

GitHubリポジトリをSource Repositoriesへミラーリングする

f:id:noko_k:20170526235224p:plain

3つ目のミラーリングを選択して、GitHubへ接続すると、GCPリポジトリ一覧を引っ張ってきてくれるので、 ミラーしたいリポジトリを選択してから「接続」をクリックします。

すると、120MBぐらいのリポジトリでしたがものの数秒でリポジトリがミラーされ、GCPからソースが見えるようになりました! :tada:すごい時代になりましたね。

pushトリガーを作成する

ソースがGCPに上がったので、pushをトリガーにしてコンテナをビルドしたいと思います。

「Container Registory」から、「トリガーの作成」へ移ります。

画面の表示の通り、設定をさくさく進めていきます。

今回は、タグがpushされたときにトリガーしたいので、「トリガーのタイプ」を「タグ」にし、イメージ名を

gcr.io/プロジェクト名/$REPO_NAME:$TAG_NAME

に変更しました。 使える変数は、 $PROJECT_ID, $REPO_NAME, $BRANCH_NAME, $TAG_NAME, $COMMIT_SHAがあるみたいです。

トリガーを実行する

作成したトリガーを、リポジトリへのpushなどで動作テストをします。

f:id:noko_k:20170527000944p:plain

ビルドの進捗は、「ビルド履歴」から見ることができるようで、リアルタイムにログなどから状況を知ることができる上、Stackdriver Loggingにもログが転送されていますので、エラーが発生したとしても後で追うことができます。便利ですね。

ビルドが完了したら、「Container Registry」で確認をすることができます。

先程のイメージ名で設定したとおり、1.2のタグを打ってpushすると

gcr.io/プロジェクト名/さっき作ったリポジトリ名:1.2

のような名前でイメージが出来上がりました。

GKEへのデプロイ

Container Registryに保存されているので、gcloudコマンドなどで、デプロイすることができます。

Container Engineで、次のようなコンテナクラスタがあるとします。 既にある方は読み替えて頂いて、無い方は新しく作るなどをしてください。

  • クラスタの名前: c-1
  • ゾーン: asia-northeast1-a

Google Cloud SDKのプロパティセット

# プロジェクトのセット
$ gcloud config set project nfact-sandbox              
Updated property [core/project].

# ゾーンのセット
$ gcloud config set compute/zone asia-northeast1-a     
Updated property [compute/zone].

# クラスタをセット
$ gcloud config set container/cluster c-1              
Updated property [container/cluster].

# 資格情報を取得
$ gcloud container clusters get-credentials c-1        
Fetching cluster endpoint and auth data.
kubeconfig entry generated for c-1.

デプロイ

# nginxという名前で、gcr.io/nfact-sandbox/nginx-lb:1.2 のイメージをデプロイ
$ kubectl run nginx --image=gcr.io/nfact-sandbox/nginx-lb:1.2 --port=80  
deployment "nginx" created

# Podsの状態を確認
$ kubectl get pods
NAME                    READY     STATUS    RESTARTS   AGE
nginx-408405411-phglg   1/1       Running   0          24s

STATUSがRunningになっていますね!デプロイができました!

まとめというか雑感

  • めちゃめちゃ簡単でした。
  • 作業はちょっと多いものの初回だけみたいな作業が多くを占めるので問題なし
  • 最初にリポジトリやトリガーなどを作っておいてしまえば、コマンド一発でデプロイできることがわかりました。
  • GitHubへの連携も非常にスムーズで、これから活用していきたいですね
  • 関係無いのですが初回だけ必要なプロパティのセットが、よく忘れるので1コマンドでひとまとまりになってると助かるなという感じです

*1:5ユーザー、50GBまでの制限はあります。個数の制限は無いようです

*2:私は既に連携済みだったのでここはどうなるかわからないですが、初めてGitHubやBitBucketをGCPと連携させる場合、OAuthが発生するのではないかなーと思います。

JJUG CCC 2016 Fallに参加してきました。

f:id:noko_k:20161203120624j:plain

前回がJavaOne報告会の記事だったんですね。お久しぶりな感じです。

JJUG CCCの参加はこれで3回目ですかね。

今回も過去最大の規模を記録したらしく、
計48セッション、9トラック(うち1つはブース展示とショートセッション)、
約900人くらいが参加したとのことで、Scala Matsuri以来の大規模なイベントでしたw

サイトがこちら
www.java-users.jp 結構良い感じのデザインの特設サイトもできてましたwすごい。

セッションの質も運営のレベルもかなり高いです。
発表していただいた方々、スタッフの方々には本当に感謝です。ありがとうございました。

参加したセッション

今日は午後からの参加でした。
雑なコメントなので内容とかはその資料とかを見ていただく感じで。

  • Javaエンジニアのためのブロック チェーン入門
    bitcoinとかでよく話題に出てくるブロックチェーンってなんだろう?的な概念的なところから、分散台帳、その仕組み、マイナーとビットコイン、競合?サービス諸々。 あと、発表者の方がエヴァのフォントを購入してました。

  • GitBucketを支えるJava技術とグローバルで使われるOSSの作り方
    @takezoenさんのセッションで割りとテンション上がって聞いてました。
    技術力もすごいですがコミュニティを作るための取り組みというか地道だけどすごい...。

あと、Twirlとか見て、やっぱりタイプセーフなのは良いよなぁと思いました。

  • JVMのトラブル解決のためにやったこと~メモリー/スレット
    泥臭い系かな〜と思ってたので個人的にはちょっと外れ。

  • JVM言語とJava、切っても切れないその関係
    やんくさんのセッションです。
    JVM言語の開発にJava関係者が加わってたのが意外な感じです。

- Featherweight JavaやGroovyの漸進的型付けについて

Groovyが漸進的型付けを実現してるんじゃないか?という話でした。
式はわからなかったけど感覚的になんとなくなるほど〜!ってなりました。

懇親会

??????? f:id:noko_k:20161203192953j:plain

まとめ

最初にも書きましたが、本当に良いイベントでした。
会社の開発とかだとテンション上がらないし、
こういう良い刺激を受けて、新しいものを追い続けて行かないとなー!
と思いました。

おつかれさまでした!