投稿

7月, 2017の投稿を表示しています

bashrcに環境変数が定義されていなければ設定する

.bashrcに環境変数が定義されていなければ設定するメモ。
ぶっちゃけ他にいい方法が普通にあると思うからググった方が早いと思う。

普通に環境変数を定義する単純に定義するだけなら、普通にechoで書き込む。



bashrcに未定義の場合のみ定義する最近はAnsibleを触ることが多いので、何度も実行されないように書く。
他にいいやり方はあるんだろうけど、とりあえずはgrepの結果が空文字列であるかどうかで判断。



ダサい気もするけど、パッと思いついたのはこれだし、当分はこれで行く。

GCE無料枠のTerraform定義

Google Cluod Platformでは、 Always Freeという制度があり、様々なリソースに対して無料枠を用意ししています。
各リソースの無料枠については、こちらのページを参照した方がいいと思います。

GCEの無料枠もちろん、GCEことGoogle Compute Engine(AWSで言えばEC2にあたる)にも無料枠が存在します。

以下が、無料枠についての説明です。
引用) https://cloud.google.com/compute/pricing?hl=ja

1 つの f1-micro VM インスタンス(1 か月あたり、バージニア州北部を除く米国リージョン)
30 GB の HDD 永続ディスク ストレージ(1 か月あたり)
5 GB のスナップショット ストレージ(1 か月あたり)
1 GB の北米から他のリージョン宛て下り(1 か月あたり、中国およびオーストラリアを除く)
ということなのです。

インスタンスサイズインスタンスサイズは、無料枠の説明に書いてある通り、f1-microです。
スペックは、CPUは仮想CPUが1つ、メモリが0.6GBというサイズですね。
性能が良いとはお世辞にも言えないので、用途は限られそうです。

リージョンバージニア州北部のリージョン名が分からないのですが、オレゴン・アイオワ・サウスカロライナが対象です。

オレゴン ... us-west1アイオワ ... us-central1サウスカロライナ ... us-east1
ディスクディスクに関しては特にいうことはないですが、SSDではないことに注意。
日本語のドキュメントでは、標準設定容量と言われているHDDのことですね。

ネットワークGCEでは上りが無料なので、下りのみで考えます。
料金はこちらに書いてますが、対象の米国リージョンでは、0~1TBの使用に関しては$0.12のようです。
f1-microでこれを超えるような事は、そうそうないと思います。

無料枠のTerraformGCEの無料枠で使えるインスタンスの定義を、書いておきます。



追加ディスクない最小限構成です。

もっと大きいインスタンス使いたいけど、自分のお金ではやりたくないですね......

VagrantのAnsible Local Provisionerの実行ユーザー

開発環境は、Vagrantで構築することが多くなりました。
Vagrantでは、Ansible Local Provisionerという機能があり、VMへのAnsibleのインストールやPlaybookに従って構成管理出来ます。
そう、Ansibleの実行時にハマりました。

要点だけ書くと、remote_userで実行ユーザーを指定しても、そのユーザーで実行されないのです。
例えば、以下のようなplaybookだと、systemdモジュールのところでエラーになります。(Boxはcentos/7



remote_userでrootを指定しているので成功するように思ってたんですが、これじゃダメでした。
これだ!っていう情報が見つからなかったですが、何を指定しようとvagrantユーザーで実行されます。
そのため、

sudoで実行する必要がある箇所にのみ、become: trueをつけるトップレベルでbecome: trueにし、sudoで実行する必要がないところだけbecome: falseにする
あたりが、落としどころこかなぁと思いつつ。

Alpineのパッケージ一覧

仕事ではDockerに触れる機会が余りないのですが、プライベートでは結構使っています。
Dockerを本格的に使うと、Dockerイメージのサイズ削減に勤しむことになるんですが、ベースイメージをAlpineにすることが多くなります。
Alpineだとパッケージが提供されておらず、自前ビルドする必要がある時が多いため、そのビルドに必要なパッケージが存在するのか確認したい時が多々あります。
そういう時は、Alpine packagesで必要なパッケージを探せます。

適当にコンテナ立ち上げて探した方が早いんですが、立ち上げられない時に利用する時には便利です。

BitbucketのプライベートリポジトリをCircleCIでビルドする時にハマった

イメージ
楽できるCIツールないかなぁと探しているんですが、CircleCIをよく聞くので利用しようと思い、試してみました。

仕事でも使えればいいなぁと思い、実際に使ってみようとBitbucketのプライベートリポジトリで試したところ、ビルド結果が未ログインユーザーでも見れてしまうことが確認出来てしまいました。

ビルド結果が見える?すでにCircleCIを利用している方などから話を聞いてみたのですが、「404 Not Found」とのことでした。
話を聞いた人がGithubのプライベートリポジトリを利用している方でしたので、Bitbucket特有の問題かなぁと思い、調査してみました。


本当に見えるのか先に結論を言うと、設定ミスでした!すいません!

設定ミスというか初期設定が予期せぬ設定になっているのが、原因でしたね。
初期設定のままだと、何が問題だったかというと

未ログインユーザーでビルド結果が閲覧可能(標準出力や.circleci/config.ymlが閲覧可能)URLフラグメントの推測が容易なので、未ログインユーザーで成果物(artifact)が取得可能
結構ヤバそうですよね。
なんで、ちょっと注意点を。

何故、ビルド結果が見える?Bitbucketについてだけ言っていきます。(Githubはならないという話ですし、Githubの有料アカウント持ってない)
Add Projectでリポジトリを選択すると、そのリポジトリがプライベートであろうとなかろうと、ビルド結果が見えるような初期設定になっているようです。
これは、Free and Open Sourceという設定が、初期でONになっているためのようでした。

そのため、プロジェクト追加後は、この設定を出来る限り早くオフにすることを推奨します。(ビルド結果を公開したい場合は除く)



最後にちゃんと設定を見て見つけておけば良かっただけですので、こういうことがないように出来る限り注意してきたいと思います...
リプライなどをくれた皆さん、ありがとうございました。

もし、Bitbucketのプライベートリポジトリを連携する時は、注意してくださいね!

Let's Encryptの証明書を導入してみました

特に難しいこともなく、割りと簡単に導入することが出来ました。
すでに公開されているサーバーであれば、比較的簡単に導入出来ますし、Dockerで構築している方は、便利なイメージなども公開されているので探してみてくださいね。

本当にハマりどころ無かったのが逆に怖い

Devise関連のControllerの親クラス

BigQueryを使う仕事が、ちょっと暇になってしまったので、またRails周りの記事を少し。

Devise関連のControllerの親クラスRuby on Railsを使っている人達では有名なDeviseですが、その中で使われているControllerが何を継承しているのか追ってみます。(2017年7月19日 v4.3.0時点)

Devise::SessionsControllerまずは、Deviseを使う時に必ず見かけると言っても過言ではないDevise::SessionControllerを見ましょうかか。
このクラスの定義はapp/controllers/devise/sessions_controller.rbになります。

先頭の数行を抜粋してみてみると、



DeviseControllerを継承していますね。
それでは、次にDeviseControlelrの定義を見ましょうか。

DeviseControllerこのクラスの定義はapp/controllers/devise_controller.rbです。

こちらも抜粋。



どうやら、DeviseControllerの親クラスは、Devise.parent_controller.constantizeで評価時に動的に決まっているようです。
それじゃ、このparent_controllerの中身は一体何なのでしょうか?

DeviseDeviseは、lib/devise.rbで定義されています。
こちらで、parent_controllerを探してみましょう。

では、抜粋!

はい、定義が見つかりましたね。
parent_controllerの中身は、ApplicationControllerという文字列のようです。
つまり、ApplicationControllerがDeviseControllerの親クラスでした。

そのため、ApplicationControllerで定義しているメソッドなどがDevise::SessionsControllerなどでも利用可能であり、コールバックを定義しているなら実行されてしまうわけです。

DeviseControllerの親クラスを変更するこちらは、難しいこともないです。
抜粋したコード内のコメントを見てもらうと分かるのですが、initializerで変更することが可能です。

変…

SELinuxが有効なサーバーでSSHのポートを変更する

我が家のサーバーを入れ替えする時に、新サーバーのOSをSELinuxが有効なCentOS7に切り替えました。
SELinuxを触るのが久しぶりで、sshdのポートを変更する時にハマったメモ。

sshd.confを書き換えるいつも通り、sshd.confを書き換えて、ポートを変更します。



この状態で、sshdの再起動をしてもエラーが起きます。
エラーログを保存するのを忘れたので割愛。

semanageコマンドでポート解放semanageというコマンドがあるらしく、これを利用してポートを解放します。



この後に、sshdを再起動すると、エラーなく再起動することが出来ます。

SELinuxは、開発用のVMだとすぐ切ってしまうので、これからは少しでも仲良くしていきたいと思いましたね。

普段使いはDiscord

仕事で使うチャットツールはSlackが多いのですが、プライベートではDiscordに完全移行しました。

Slackが用意している機能よりは不十分な方も多いかもしれませんが、投稿APIはSlack互換やGithub互換のAPIがあり、既存の外部サービスとの連携が容易であったり、グループ通話が簡単に出来る点で移行するきっかけになりました。
Mackerelの通知もちゃんと表示されます。

Discordを使い始めたのは、去年の7月ぐらいですね。
Tree of Saviorというオンラインゲームを始めた頃ですね。

ゲームやってる人は、Discordも念頭に入れてみるといいと思います。

Amazonプライムデー

昨日の18時からAmazonプライムデーが開催中ですね。
今回は目当てのものが余りないので、とりあえずHDD買ったぐらいです。
とはいえ、TSUKUMOで買っても大体同じ値段です(笑)

PCパーツ買う時は、ちゃんと他サイトで事前に情報集めとこうと誓った。

Digdagでbundle install

最近は、Digdag+Embulkでデータ収集する仕事しています。

普段からRubyを使う機会が多いので、遅かれ早かれRuby APIを使うことになるのですが、スクリプトを書くとなると、それなりのロジックを組み込む時があります。
そういう時、車輪の再発明は面倒なので、公開されているGemを使って書きたい。
DigdagはJRubyではなくrubyコマンドを実行しているだけなので、bundle installが発行さえできればよい。(そのためRubyが実行できない場合は使えない)
いくつか手法があり、こういう記事がヒットします。
が、もっとシンプルにいきたい。
それならシェルで実行しようという考えにいきつきます。

プロジェクト内にGemfileとGemfile.lockを含めて、digdag push
後は、Digdagに以下のようなタスクを追加する。



複数のプロジェクトが同時に実行されたらエラーが出ると思いますが、現状はこれで。
もっと良い方法があれば、是非教えてほしい。