Spacemacsデビューした

f:id:blackawa:20171003215304p:plain

久しぶりにEmacs触り始めたんだけど、ふと思い立ってSpacemacsデビューしてみた。 なんかあっても既存のEmacs用の.emacs.dはdotfileに残ってるし、と思って。

インストール

github.com

のREADME.mdを見るのが良さそう。

僕は今入ってるEmacsを一度アンインストールして、READMEどおりにemacs-plusを入れ直した。

Clojureを書く

最初に起動するとVimライクなキーバインドにするかEmacsライクなキーバインドにするかとか聞かれる。

qiita.com

でオススメされたとおりにVim(Evil)を選ぶ。

最初にインストールが終わった状態では全然キーボードが動かなかったから一回再起動したら動き出した。

elnodeでweb serverを起動してみる

Emacsといえばweb serverなのでelnodeを入れる。が、layerはなさそう。 いろいろあがいた挙句、結局<list-packages>からのelnodeを選んでインストールしてしまった。負けた。

適当な.elファイルを開いてサンプルコードをコピペすれば動く。

additional-packageにgithubを指定したりもしてみたけど思ったとおりに動かない。負けた感ある。

ハマりどころ

これはMacEmacs触る人はよくぶつかるのかもだけど、MacにはもともとEmacsがインストールされている。( /usr/bin/emacs ) ので、PATHで /usr/local/bin/emacs を最初に評価させて、brewで入れたEmacsが起動するように設定する。

マイナーなライブラリを入れるには少しlayerの学習が必要そう。

JVMツールの簡単インストーラー、sdkmanのことを紹介させてくれ

f:id:blackawa:20171003133129p:plain

SDKMAN! the Software Development Kit Manager

この完全に他のツールとかぶりそうな名前、かつアメコミみたいなアイコンのツールが、まー便利。 わりと前からあるから、みんな知ってるかもしれないし、そもそもこのツールについて人と話したことがあんまりない。けど、個人的に紹介したいからさせてもらう。

sdkmanとは

インストールすると、sdk install xxx みたいな感じでJVM系の各種ツールをインストールできるツール。

なんとJavaもインストールできる。

もうこれで良くない?

使い方

Installation - SDKMAN!を読んでくれ。 brewのインストールと同じでインストールスクリプトbashで実行するだけ。ちょう簡単。 .bashrcとか.zshrcの末尾にちょっと勝手に追記されるから、それだけ確認しておいて。

試してみる

手元のMacはすでに環境構築済みなのでVagrantで建てたubuntuで試す。

vagrant init ubuntu/xenial64
vagrant up
vagrant ssh

# ここからubuntu
curl -s "https://get.sdkman.io" | bash
# unzipコマンドがないよって怒られる。実はunzipを入れても次はzipがないよって言われるので入れておく
sudo apt-get install unzip zip
curl -s "https://get.sdkman.io" | bash
# インストール成功して.bashrcと.zshrcの末尾にちょびっと追記される。
source "/home/ubuntu/.sdkman/bin/sdkman-init.sh"

# インストールできたか調べる
sdk version

# Javaをインストールしてみる
which java # -> 何も返ってこない
sdk install java 9.0.0-zulu
which java # -> /home/ubuntu/.sdkman/candidates/java/current/bin/java
java --version
# openjdk 9.0.0.15
# OpenJDK Runtime Environment (Zulu build 9.0.0.15+181)
# OpenJDK 64-Bit Server VM (Zulu build 9.0.0.15+181, mixed mode)

# Mavenもインストールしてみる
which mvn # -> 何も返ってこない
sdk install maven
which mvn # -> /home/ubuntu/.sdkman/candidates/maven/current/bin/mvn

# 動く
mvn archetype:generate # 当たり前だけどすごい

簡単すぎ。Javaインストールできるってすごい。

既存のツールが入っちゃってる人へ

消して。

brewで入れたなら brew uninstall xxx しよう。 Windowsならバイナリを消して環境変数PATHに入れた設定とかを消せばいいんじゃないかな。

Macならbrewとかportとかあるから、こういうのは特にWindows勢にとってめちゃめちゃ強力なツールになると思うな。

Overtone始めたらClojureのシーケンス操作の哲学にマッチしすぎててスゲー!ってなった話

とうとうライブができるプログラマーになることにしたので、Overtoneを始めた。

目標

  • (SHOULD)音作りを雰囲気だけかじる(ここは今回重要でない)
  • ドラムで軽やかなリズムを奏でる
  • ドラムに合わせてメロディが流れるようにする
  • だんだん音を足していく
  • (SHOULD)フィルターをかける

これくらいできればなんかそれっぽい感じになるでしょ。

始め方

github.com

を読んで頑張ろう。変化に耐えられる心を持てってwikiに書いてあったから、変化に耐えられない日記はポインタと化します。

使い方メモ

definst

楽器(というか音色)を定義できるっぽい。デフォルトでもいろいろあるけど。

ctl

今鳴っている音に対して変更をかけられる。なんかライブっぽくてかっこいい。 フィルターをだんだんかけていく、みたいなのもこれを使えるのかな。

(definst quux [freq 440] (* 0.3 (saw freq)))
(quux)
(ctl quux :freq 660)
;; => 1オクターブ上がる
(stop)

sample

サンプリング音源を鳴らす。 freesoundっていう無料音源サイト?からダウンロードすることもできるみたい。 コマンド叩いたらブラウザが開いて、ログインを求められた。面白い。

(def water-drops (freesound 50623))
(water-drops)
;; => 水音が鳴る
(stop)

この音を加工したりもできるんだろうな。

play-chord

コードを鳴らす。

(defn play-chord [a-chord]
  (doseq [note a-chord] (saw2 note)))
(play-chord (chord :C4 :major))

すごい。 chordはdoseqできるみたいだから、多分 chord 関数はシーケンス生成してるんだな。 実装見たら実際そうだった。すごい。こんなところでClojure likeなシーケンス操作が出てくるなんて!

ってことは、chordはシーケンスだから複数のコードを合成する、みたいなこともできるのか。 たとえばCmM7を鳴らしたい時は、

(let [minor7 (chord :C4 :m7)
      major7 (chord :C4 :M7)]
  (-> (concat minor7 major7)
       distinct
       play-chord))
;; =>  不穏な音

play-chordされる前の Set シーケンスの中身を見てみたら合ってそう。 こんなに簡単に複雑なコードを鳴らせるなら、ジャズが捗りますな(雑な偏見)。

metronome

ビートを定義する。

(defonce metro (metronome 120))

(metro) すると今のビートが取れるようになる。これを渡して、at関数で任意のタイミングでビートが鳴らせるようになる。

(defn chord-progression-beat [m beat-num]
   (at (m (+ 0 beat-num)) (play-chord (chord :C4 :major)))
   (at (m (+ 4 beat-num)) (play-chord (chord :G3 :major)))
   (at (m (+ 8 beat-num)) (play-chord (chord :A3 :minor)))
   (at (m (+ 14 beat-num)) (play-chord (chord :F3 :major)))
   (apply-at (m (+ 16 beat-num)) chord-progression-beat m (+ 16 beat-num) []))

けっこう冗長だから、もっとシンプルに書けそうだな。

とはいえ、これを実行すると延々けっこうきれいなコード進行が鳴り続ける。プログラミングで実現してるなんて。すごい。 しかもこれはシーケンスを解釈してるだけ。なんてこった!シーケンスすげぇな。

これの実行中は、関数を再定義すると apply-at された時に定義が書き換えられて新しいコード進行が始まる。

さらに別の、たとえばドラムトラックを書いて評価すれば、それがメトロノームに合わせて演奏される。

metro-npm

metronomeの内容を書き換える。つまりテンポを変えられる。

そういえば小節の概念がないな。 多分、ループを作った時のapply-atするタイミング次第で変拍子でもなんでもいいんだろうな。

わからないこと

sc-ugenっていうオブジェクトを足し算したり掛け算したりするサンプルコードの意味がわからない。 SuperCollider Unit Generatorのことらしいから、SuperColliderをちょっとさわってみないといけないのかな。

あとは、そもそもオシレーターってなんだっけ??SAWって波の形だよね?みたいなレベルで音楽用語がわからない。 DAWさわっててもギター弾いてても曲書いてても、わからないことだらけだぁ。

https://github.com/overtone/overtone/blob/master/docs/ugens.mdを見てる限りは、サンプルコードに出てきて宣言元を辿れないやつはこのsc-ugenオブジェクトだったから、ugensのページに対応するものがありそう。

Clojureを書く時についつい忘れがちなキーバインドまとめ

最近2ヶ月ぶりくらいにClojureを書き始めたら、手癖で覚えてるキーバインドもありつつ、なんかここらへん押せばいいって手が勝手に動くけどちょっと違うらしくて動かない、ってやつもあり。

毎回思い出すのつらいからまとめることにした。

キー 起こること
<C-c><M-j> REPL起動
<C-c><C-q> REPL停止
<C-c><M-n> 今カーソルが開いているnamespaceに、REPLを移動させる
<M-.> 宣言に飛ぶか聞かれる
<M-,> <M-.>で飛んだ元に戻る
<M-s> 今カーソルがある位置から見て直上のカッコを消す

archetypeをMaven Central Repositoryに登録する

f:id:blackawa:20170929020542p:plain

作ったarchetypeMaven Central Repositoryに登録した。 Railsくらいとはいかなくても、せっかくSpringはモジュールが揃ってるんだから、プロジェクト作成した瞬間に機能の雛形が手に入る世界を作りたい。

やったこ

  • JIRAチケットを切る。
  • 鍵生成する。
  • Maven Central Repositoryに登録する。

チケットを切る

Maven Central Repositoryにリリースするには、まずSonatypeのOSS Repositoryに登録してそこでリリース資材を作るとMaven Central Repositoryに同期されるっぽい。

ので、まずSonatype OSS Repositoryに登録する。ために、チケットを起票する。

http://central.sonatype.org/pages/ossrh-guide.htmlにあるとおりにする。ここで手順書いてもいつまで正しいかわからんし。 書くべき項目がいくつかあるのでそれを守る。 チケット種別に気をつけて。

ちなみに今回起票したのはこのチケット。ご参考までに。 [OSSRH-34598] spring-bootstrapping-archetype - Sonatype JIRA

返事が来るのを待つ

自分のドメイン blackawa.jp をgroupIdに指定したら、「ほんとにそのドメイン持ってる?別にgithub.ioドメインとか使っていいんだよ」ってコメントがついて、「もってるよ。なんか証明書類必要なら教えて」って言ったら承認された。

承認されるとSonatype OSS Repositoryにjarをアップロードできるようになったよ、ってコメントがつくので、そしたらアップロードできる。

GnuPG鍵を生成して登録する

アップロードするためには、鍵を作って鍵サーバーに登録し、jarに署名しないといけない。 Working with PGP Signaturesで言われたとおりにする。正直よくわからん。

Maven Centralのstagingにデプロイする

~/.m2/settings.xmlを以下のような内容にして mvn clean deploy する。 これがちょっとわかんなくてハマった。

ossrhの方のid/passwordはチケット起票した時にログインしたJIRAと同じやつってどこにも書いてなかった気がするけど雰囲気で入れてみたらそうだった。 英語斜め読みしかできないから多分見逃した。

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
  https://maven.apache.org/xsd/settings-1.0.0.xsd">
  <servers>
    <server>
      <id>ossrh</id>
      <username>blackawa</username>
      <password>*****</password>
    </server>
    <server>
      <id>gpg.passphrase</id>
      <passphrase>*****</passphrase>
    </server>
  </servers>
</settings>

deployできたらhttps://oss.sonatype.org/#nexus-search;quick~spring-bootstrapping-archetypeで検索にヒットするようになる。 そしたらJIRAチケットにコメントがついて、maven central repositoryには10分後くらいに、search.maven.org には2時間後くらいに反映されるよ、と教えてもらえる。

ハマりどころ

鍵情報がないのもログインできないのも全部401 Unauthorizedしか言われないのがちょっとしんどかったけど、分かれば大したことなかった。 pom.xmlけっこうちゃんと書かないといけない。けどそれはちゃんと具体的に怒られるから良かった。

参考

https://maven.apache.org/guides/mini/guide-central-repository-upload.html http://central.sonatype.org/pages/apache-maven.html http://central.sonatype.org/pages/working-with-pgp-signatures.html

自分用のスクラムツールを、自分のドメインにHTTPSで立てる

f:id:blackawa:20170927160905p:plain

自分用のタスク管理ツールがHTTPSで立ってるってカッコイイなと思って、実際やってみた。

実は1年に1回くらい思ってて、毎回挫折してた。今回初めて成功したことになる。嬉しい。

やったこ

https://taiga.io/)をblackawa.jpのサブドメインに立てて、HTTPS化する。 そのために、Certificate managerで証明書を発行する。 Route53 -> Elastic Load Balancer -> EC2の経路でアクセスさせる。 HTTPへのアクセスがあった時HTTPSにリダイレクトさせる。 taigaのユーザー登録機能を切る。

手順

EC2だけで動かす

taigaが公開してるドキュメントに、インストール用のスクリプトを使う手順があるのでそれをチラ見する。 ubuntu用に書かれてるので、EC2のt2-microでubuntuを立てて手順に従うと、数分でtaigaが起動する。 具体的には、nginx -> circus(gunicorn) -> django の構成のWebアプリケーションが、circusctlで起動する。

EC2の(Elasticじゃない)IPとURLで80番ポートにアクセスすると画面が見れる。

今回はELBを立てるので、Elastic IPの取得は不要。(僕は一度取得してしまったので後から消した。)

Route53でサブドメインを切ってEC2とつなぐ

ネットワークよくわからないけど、Hosted Zoneの子要素としてRecord Setというのがあって、こいつを足すことでサブドメインにアクセスが来た時に違うIPに通信を流すことができるぽい。 work.blackawa.jp にアクセスされた時用の「Aレコード」を切る。宛先はエイリアスなしで、一旦EC2のIP。

たしか反映されるのに数分タイムラグがあった気がする。

nslookup work.blackawa.jp

と打って、「いやそんなん知らんわ」と言われなくなったらOK。 逆にnslookupして名前解決できてなさそうならRecordSetの設定内容を見直す。

ブラウザからアクセスすると画面が見れるはず。

証明書を取る

次はELBを立てたいので、証明書を取得する。最初 let's encrypt を使ってみようかと思ってたけどAWS先生がやってくれると聞いてそっちにした。 ここがけっこうハマった。

証明書を取るには、 1. 証明してほしいドメインを指定して申請する 1. 確認メールを受信する 1. メールを開いて「Approve」ボタンを押す

という手順を踏む必要がある。この「証明してほしいドメインを指定して」ってのと、「メールを受け取る」っていうのにハマった。

メールは admin@blackawa.jp に飛んでくる

お名前.comならメール転送サービスが使えるからそれを設定しておく。 あと、Route53にお名前.comのメールサーバーに向けたMXレコードを追加する必要がある。これがないと転送が効かない。

反映されるのにちょっとかかる。自分で admin@blackawa.jp にメールを投げてみて届くようになればOK。

サブドメインを「別名」に指定する

証明書を申請する時、ドメイン名を指定できる。 ここに work.blackawa.jp と入れると、メールが admin@work.blackawa.jp に飛んでくるが、お名前.com的にはそんなサブドメインは知らないので当然転送サービスで転送できない。 だからといってドメインを「blackawa.jp」にすると、それで手に入れた証明書を使っても「証明されてるドメインとURLのドメインが違うからこれ危険やで」とブラウザに怒られる。 そこで、ドメインは「blackawa.jp」にしつつ、別名で「work.blackawa.jp」を指定する。 するとメールは admin@blackawa.jp に届き、かつサブドメインで使っても怒られない。

ただ、今にして思うとサブドメインワイルドカードとか使えたのかな?とか思う。たとえばblog.blackawa.jpを増やす時証明書を申請し直すのめんどくさそう。

ELBを立てる

ここも結構ハマった。

こいつはHTTPSかHTTP、もしくはその両方を受け取ってくれる。 どこにどのプロトコルで転送するかは、ELBの子要素である「ターゲット」が知っているのでELBは使用するターゲットを指定するだけ。

...なように見える。正直よくわからん。

ターゲットはHTTPでEC2に通信を転送させる

最初、「HTTPS化だしここもHTTPSにしとけばええやろ」と思ってHTTPSにしたら502 Bad Gatewayが出て困った。nginxのログにも出ないし。 仕組みを想像したらここはHTTPのままで良いのでは?と気づいて直したら動いた。

Route53をELBに向ける

ここは簡単。新しいAレコードを追加すればOK。

ここまでやると、HTTPSサブドメインにアクセスして画面表示ができるはず。できなければ通信がどこまでたどりつけたか調べながら頑張れ。

  • nslookup が結果を返すならRoute53が名前解決してくれてる
  • Bad GatewayならELBとEC2でリクエストとレスポンスがうまくできてない
  • EC2のURLにアクセスして表示できるなら、EC2インスタンスとアプリケーションはうまく動いてる
  • 証明書エラーならCertificate Managerに申請したドメインサブドメインが一致してない可能性あり

くらいかな。

HTTPで通信されたらHTTPSにリダイレクトする

Redirect HTTP Traffic to HTTPS Using ELBを読んで頑張る。 他にもQiitaにも日本語でこれと同じことが書いてあったりするから読んで頑張る。

まぁよくあるパターンで、ELB経由でHTTP通信が飛んで来る時はリクエストヘッダーに特定のキーが付与されてるからそれをチェックすると良いよ、ってやつ。

アカウント開設できないようにする

これはtaigaの話だけど、 Taiga: Setup FAQs and common bugsにあるとおり、taiga-backとtaiga-frontそれぞれの設定を書き換えることで無料アカウント登録の口を閉じられる。 これをやっておかないと知らない人がアカウント作れちゃうので。

ここまでやれば、https://work.blackawa.jp みたいなことができる。嬉しい。

今後の展開

自前で建てたアプリなのにHTTPSで、ブラウザのURLバーが緑色に輝くのは、正直QOL上がる。みんなやろう。

今後はブログを子URLにするのと、監視基盤入れてみたいな。 あと、次にドメインを買う時はお名前.comじゃなくてAWSで買おう。

塩漬けだったblackawa.jpにS3とRoute53で自己紹介ページを置く

f:id:blackawa:20170927160431p:plain

しばらく前に買って放置していた blackawa.jp を、とうとう使い始めることにした。 というのも自分用にスクラム管理ツールを立てたくなったからで、今回の話はオマケではある。

やったこ

これまで「このドメインはお名前.comによって管理されています」としか出なかったblackawa.jpにアクセスした時、blackawa | Programmerが閲覧できる。

そのために、ドメインDNSサーバーをRoute53に指定し、S3に向ける。

前提条件

  • ドメイン blackawa.jp はお名前.comで購入済み。

手順

S3を立てる

S3に新しいBucketを立てる。ドメイン名と同じ名前のBucketを作り、Web Hostingを有効にすると良いらしい。 indexページとerrorページを尋ねられるので、index.htmlとかにしておけばいいと思う。

で、index.htmlを置く。僕はこれの公開範囲をいじらないとS3のURLから見られるようにならなかったので、なんか設定が足りなかったのかも。

ここでは、S3のURLからindex.htmlが見られるようになればOK。 S3のURLはなんか命名ルールがあるから調べて。

Route53を立てる

AWSコンソールでRoute53にアクセスして、新しいHosted Zoneを立てる。立てるとDNSサーバーのURLが4つ発行される。 Route53ではIPアドレスを指定できる他にもELBとかS3にエイリアスを張れて、今回は当然S3へのエイリアスを張る。

お名前.com側で、blackawa.jpにアクセスした時にRoute53で名前解決するように指定する

今度はonamae.comにアクセスし、使うDNSをRoute53のDNSサーバーに書き換える。 更新したらしばらく

nslookup blackawa.jp

を叩き続ける。表示が変わったら実際に切り替わってるはず。 ブラウザからblackawa.jpにアクセスしてみて思ったとおりの画面が出てればOK。

お疲れ様でした。

ハマりどころ

ブラウザにアクセスしても出ないことがあった。 けど、 - blackawa.jpは名前解決されているか? - S3のHTMLは誰でも見られるか?

を確認すればどこが悪いかわかるのでそこまでハマらなかった。

参考資料

忘れた。

今後の展開

はてなブログか自前で立てたブログサーバーも blackawa.jp 配下に配置したい。 はてなブログのデザインがあんまり好きになれないから、勉強がてら立ててもいいかなって思ってる。