クライアント証明書はオプションだったのか

Go

GoでHTTPSサーバをシュッと書いて、curl --cacertで動作確認したら普通に動いたんだが、そういえばcurlはクライアント証明書送ってないんじゃないかって疑問が出てきた。 結論から言うと、サーバからクライアントへの証明書要求はオプションであって、Listen…

Heroku Loginについてメモ

heroku loginで何が起きるか、herokuのgitにgit pushするときにどうやって認証しているか、について気になって調べたのでメモ。 heroku loginで認証情報を~/.netrcに作成 https://devcenter.heroku.com/articles/authentication herokuにgit pushするときに…

本番データの修正をためらうきもち

例えば、本来 not null であるべきカラムが null可 になってしまっていて、データにnullと空文字が混在していたとする。このとき、既存のデータを null => 空文字 に修正して、null可 => not nullに修正するのがあるべき姿で正しい修正だと思う。 しかし、こ…

bundle installでmysql2のgemがインストールできずに詰まった

あるあるネタらしくググると、xcode-select --installやそもそもmysqlをインストールしてないからbrew install mysqlで解決するという記事がいろいろ出てきた。 qiita.com しかし、自分の場合、xcode-select --installしてもbrew install mysqlしても解決し…

herokuにmasterでないブランチをpushする

herokuにmasterでないブランチをpushすると怒られた。 git push heroku_staging foo こうやる。 git push heroku_staging foo:master 参考 devcenter.heroku.com : は何? 上記のgit pushで出てきた:がわからなかったので調べた。結論は以下になる。 git pus…

MySQL Protocolに入門する

ふと気になった。 ローカル開発環境でMySQLに接続するときにはTCPかunix domain socketを使用していた。ここで、例えばAPIにアクセスするときにはさらにHTTPなどのプロトコルを使用することになるが、MySQLでは一体何のプロトコルを使用しているんだろうとい…

go vetでprintfuncsオプションを使った

Go

go vetコマンドはPrintfのようなメソッドに対してフォーマットで表示する変数の数とその引数の数が一致しない場合(以下参照)にチェックしてくれる。 fmt.Printf("%v, %v\n", "test") しかし、例えば標準logパッケージをラップするパッケージを作った際に、同…

SchemeインタープリタをGoで書いた

Go

背景 Structure and Interpretation of Computer Programs(SICP)を読んでいた。第4章でメタ循環評価機という話題が上がる。これはSchemeのインタープリタをSchemeで書くという、一見矛盾しているようなそんなものである。一旦、そのまま本を読み進めScheme…

プロセスが環境変数をもつ

勘違いしていたのだがプロセスが環境変数を保持している。ユーザが持っているわけではない。 supervisodをrootユーザで実行し、その子プロセスが実行するアプリケーションは別ユーザで実行するようにsupervisor.confを設定( http://supervisord.org/configur…

GoのバイナリをデプロイするためにGitHub ReleaseからDLするツールをGoで書いた

Go

GoのバイナリをデプロイするためにGitHub Enterprise(以下、GHE)のReleaseにアップロードしておいたバイナリをダウンロードするツールをGoで書いた話をする。 背景 複数の開発が並行していてGitHubのブランチと本番・ステージ環境が対応付けできなかったり、…

AWSでアラームの閾値を設定する

AWS

GoでLambdaを含むいわゆる一般的なサーバレスな環境(API Gateway <=> Lambda <=> DynamoDB + CloudWatch)を構築した。監視のためCloudWatchでアラームを設定する必要があったのだが、そのアラームでの閾値の考え方がよくわからなかったのでメモする。アラー…

UIの更新はmain threadから行う

iOSからAPIにリクエストを送って返ってきたjsonを画面に表示させたい、というシンプルな実装をしようとしたら詰まったのでメモする。まず、以下のように実装したがエラーが発生した。 @IBOutlet weak var myTextView: UITextView! func makeData() { let url…

GitHub Enterpriseからreviewdogを使用できないときに見るメモ

GitHub Enterpriseのバージョンが古い場合、新しいreviewdog( > 0.9.7)が動作しないので0.9.6のreviewdogを試してみるとよい。 GitHub & GitHub Enterprise Support: As of version 0.9.7, reviewdog completely switched to use new Pull Reqeust Review Co…

RFC2822のフォーマットでテキストを作成するパッケージを書いた

Go

前にgmail APIを叩いた時にRFC2822について調べたが、絶対にフォーマットを忘れる自信があったので簡単なパッケージとしてまとめた。 特にメールのヘッダーに日本語を使いたい時のフォーマットなんて覚えて置ける自信がまるでなかったので。 ブログで記事と…

Serverless Frameworkで複数AWSアカウントを切り替えられるようにする

AWS

serverless.com AWSのアクセスキーを登録すると~/.aws/credentialsに情報が登録される。登録方法は以下を参照。 https://serverless.com/framework/docs/providers/aws/guide/credentials#setup-with-serverless-config-credentials-command 通常だと上記リ…

Goでgmail APIを叩いて下書きを作成する

Go

Go Quickstart | Gmail API | Google Developers 上記を参考にした。サンプルコードは最後に記載する。実装してる途中でメールの題名に日本語を設定できず、RFC2822について調べる必要があったのでメモしておく。 RFC2822 https://www.ietf.org/rfc/rfc2822.…

Goでbase64エンコードを実装する

Go

base64を自分の理解のために実装してみる。 手順はこちらの記事がわかりやすいです。RFCで読むならこちら。 実装したコードは以下の通りです。ほとんど標準パッケージ。 package main import ( "fmt" "os" ) const encodeStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZa…

gitで開くエディタをemacsにする

gitでgit rebase -iするときにデフォルトでvimが起動するがemacsに起動してほしい。emacsで書きたいんだ。 というわけでその設定を行った。~/.gitconfigファイルに以下の設定を追加するだけでよかった。 [core] editor="emacs"

nginxでレスポンスをgzipで圧縮する

nginxでレスポンスをgzipで圧縮するための設定を調べた。 nginxでgzipモジュールを提供しているのでこれを利用する。設定例は以下の通り。 http { gzip on; gzip_comp_level 2; gzip_types text/plain text/css text/xml application/xml text/javascript ap…

Emacs × Go でタグジャンプ

helm-gtagsを使ってて、RubyとかPHP書いてたときにはうまくタグを作れてたんだけどGolangでうまく作れてなかった。以下の記事を見つけて試しにやってみたらうまくいった。 Using GNU GLOBAL · GitHub /usr/local/etc/gtags.confを上記の通り修正して以下のコ…

logrotateのタイミングでsupervisordのプロセスが落ちる

結論から言うと、ドキュメントちゃんと読んでなかったおれが悪い。 例えば、nginxのログに対してlogrotateの設定ファイルを書くと、 /var/log/nginx/*log { create 0644 nginx nginx daily rotate 10 missingok notifempty compress postrotate [ -f /var/ru…

Convert markdown to pdf

Mac

自分用メモ。 markdown-pdfを使用してmarkdownをpdfに変換する node.jsの公式サイトからnpmをインストールする Node.js markdown-pdfをインストールする $ npm install markdown-pdf 適用したいCSSをgithubからcloneする 自分はmixu/markdown-stylesを使用し…

golangでpanicをrecoverしたときにスタックトレースを表示する

Go

golangではそもそもpanicしないようにコードを書くべきだしpanicが発生するならここで発生するのだと把握した上でコードを書くべきだ、という認識はある。とはいえ、golang書き始めてまもないので「念のために」recoverをコードに書いておきたかった。 具体…

2017年を振り返る

2017年はWebエンジニア1年目の年だった。つらつらとやったことを振り返る。 最初の半年はRailsを書いていた。初めてのWeb開発だったので最初はさすがに覚えることが多く大変だったが、ビジネスロジックが中心だったので1ヶ月もするとだいたい慣れてきた。…

negroniの実装をちゃんと理解できていなかったので自分で書き直してみる

Go

以前、ミドルウェアをうまく扱うパッケージとしてnegroniを紹介したが、改めてコードを読むとちゃんと理解できていなかったので自分で書き直してみる。車輪の再発明。GitHubに上げるまでもないのでここに残す。 GitHub - urfave/negroni: Idiomatic HTTP Mid…

supervisorの起動スクリプト

supervisorの最新版をeasy_installでインストールしたら起動スクリプトがなかったので簡単なやつを書いた。centos6.7で /etc/init.d/supervisord として配置する。 #!/bin/sh # # supervisord - this script starts and stops supervisord # # chkconfig: 35…

deferでのrecoverのよくわからない挙動がよくわからない

Go

deferで呼び出した関数でrecoverした場合にはpanicは発生しない。 https://play.golang.org/p/Z0oJ2I26wq8 package main import "fmt" func main() { defer recoverFunc() panic("Panic happens!") } func recoverFunc() { if err := recover(); err != nil …

Goでgraceful restartをミニマムに書く

Go

前回の記事でgraceful shutdownをミニマムに実装した。その続きでgraceful restartをミニマムに標準パッケージのみで実装してみる。 takayukinakata.hatenablog.com 参考にしたのは以下のパッケージ。 github.com 実装 前回と同様、理解のために最低限の実装…

Goでgraceful shutdownをミニマムに書く

Go

graceful shutdownの仕組みがわかってなかったので自分でミニマムに実装してみる。 コード量が小さく読みやすかったので以下のパッケージを参考にした。 github.com github.com 実装 自分でミニマムに実装したコードは以下の通り。アクティブな接続が返って…

Goアプリケーションをsupervisorでdaemonとして起動する

起動したGoのアプリケーションをdaemonプロセスとして動かす。なお、Centos6.7を使用している。 Supervisor: A Process Control System — Supervisor 3.3.3 documentation Install $ wget https://bootstrap.pypa.io/ez_setup.py -O - | python $ easy_insta…