2017/12/10

CentOS 7 上に CUDA 9 環境を構築する

CentOS7 上に CUDA 9 を入れることがあったのでそのメモ。


環境

  • OS: CentOS Linux release 7.4.1708 (Core)
  • CUDA: 9.0
  • GPU: Nvidia GTX 1070


GPU を認識しているか確認

CentOS 側が GPU を認識しているかどうかは
  • lspci
などで分かります。出力の中にGPUの名前があればOK。


CUDA のインストール

ドライバは入っているものとします。というか特殊なGPUで以外 xorg-x11-drv-nvidia-libs などを入れると動いたり。
この辺は試行錯誤したので minimal な手順が残ってなかったり……。
ということでドライバ周りは飛ばして、CUDA のインストールをします。

まずは NVIDIA の公式サイトから、CUDA をダウンロードします。ここのページでOSやバージョンを選んでいく。
今回は Linux + x86_64 + RHEL + 7 + rpm(network) を使います。

後は出てきたコマンドに従うだけ。
  • wget http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-repo-rhel7-9.0.176-1.x86_64.rpm
  • sudo rpm -i cuda-repo-rhel7-9.0.176-1.x86_64.rpm
  • sudo yum clean all
  • sudo yum install -y cuda
rpm(network) だと、インストールの際に依存パッケージも入るので、これでおしまい。
1G とか降ってくるので、コマンドは短かくても結構時間がかかったりします。

なお、記事を書いている時点(2017/12/10) では 7.5, 8.0 も入れることができます。
具体的には
  • $ sudo yum install -y cuda-8-0
のようにバージョンを指定してあげるとOK。
バージョンを省略すると最新の CUDA が入ります。

/usr/local/cuda 以下にいろいろと入るので、PATH などを設定します。具体的には

などですね。


GPU が動いてるか確認

  • $ nvidia-smi
あたりでGPUの状態が分かります。結果は

のように出力されます。この場合GPUの使用率は100%なので、かなり頑張っていますね。


参考

2017/12/05

AMD OpenCL が wget できなくて困った話

環境

  • OS: CentOS Linux release 7.4.1708(No GUI)
  • AMD OpenCL: 2.0
  • fglrx: 14.41
  • GPU: Radeon HD 5770


OpenCL を wget したい

さて、こんな構成のマシンでGPU使ってみるかー、と思って作業。
X とかは入れていないので GUI は無し。
んで、公式サイトから URL を取得して wget する。
  • $ wget  https://www2.ati.com/drivers/linux-amd-14.41rc1-opencl2-sep19.zip
一瞬で終わったが unzip できない
中身を見ると「ダウンロード中」みたいな html になっている。勘弁してくれ。

困っている人は他にもいて、--referer オプションを付けると良いよ、と。ということで
  • wget --referer='https://www2.ati.com' https://www2.ati.com/drivers/linux-amd-14.41rc1-opencl2-sep19.zip
としたらダウンロードできた。やったね。


参考

2017/12/03

Ruby を使って Kobo の情報を取得する #okinawarb

この記事は Okinawa.rb Advent Calendar 2017 3日目の記事です。
2日目は @_atton さんの「amazon-ecs を使って Kindle マンガの情報を取得する」でした。
というか私ですね。連投です。


経緯

しかし Amazon Advertising API の利用は却下されてしまいました。
取ってしまったドメインを何とか活用しようと思ったログです。


どうして kobo なのか

当初は BookWalker か honto あたりで同じことをする予定でした。
しかし BookWalker ではそれらしきものは無し。
honto は完全に更地でした(これが本家かは不明)。
ということで両方とも無理。

困っていたら本関連のAPI まとめを発見。
軽く見ていると、リンクは辿れませんが楽天のAPIがあります。
楽天と言えば kobo があることを思いだす。

なので kobo の API が無いかなー、と思って探すとありました
ドメイン取っちゃったし、何らかのコンテンツを提供するために使うことにしました。


Rakuten Developers 登録

Amazon Advertising API と同様にまずは token を手に入れるところから。
developer 向けページでアカウントを作成。
New App で Application を作ります。なんだか Twitter みたいですね。
そうしたら
  • (Application|Developer) ID
  • application secret
  • Affiliate ID
が発行されます。
これらのパラメタを使ってリクエストを組み立てることになります。


厚い無料本の山

API endpoint は https://app.rakuten.co.jp/services/api/Kobo/EbookSearch/20170426 です。
これに対して post すれば情報が手に入る。
日付が入ってるのが気になる。リリース日とかなのだろうけれど。
詳細は楽天Kobo電子書籍検索APIにありますが、いくつかの条件を付与可能。

無料本は sort='+itemPrice' とかすると出てくるので問題は無い。
しかし、 minimum_price 相当が無いっぽい。これは痛い。
加えて、kobo には大量の本が登録されているので、sort='+itemPrice' とかしてると有料の本まで取得できない。
具体的には 30 * 10 とかしても無料のものばかり。
分冊版とかおためし版とか青空文庫があるのが原因な気もします。

その辺をフィルタすると50冊くらいにになる。が、無料のものしか無いのは変わらず。
頭が痛い例としては、ユーザアンケート調査が本として登録されているとか。

無料本の何が問題かと言うと、報酬面。
アフィリエイトは有料本を買ってもらわないと報酬が発生しないので、無料本を買って貰っても報酬ゼロ。
なのでマネタイズができない。困った。
結局 ebook-comic.info のドメインは取ったものの、どうしようかは考え中です。
何かアイデアあればください。


ドキュメントについて

ちなみに、ドキュメントは Kobo の方が断然良い。
実際、誰かのブログを見ずに公式ドキュメントだけでリクエストを作れた。
Amazon Advertising API は微妙で、まずドキュメントはログインしないと見られない。
その上、ドキュメントの記述とレスポンスが違ったりする。つらい。
大抵 body にエラーが書いてあるので読めば問題は対処は可能ですが。


リクエストのサンプルコード

なお、koboのリクエスト例はこんな感じ。
1リクエストで30個(Amazonは10個)取れたりと都合が良いところも多いのです。
しかし、私の周辺では kobo を使っている人を見たことがない……


まとめ

とりあえず無料本を取得するところまではできました。
しかし affiliate の収入が絶望的なので使わない気もする。

ということで Okinawa.rb Advent Calendar 3日目の記事でした。
なお、クリスマスプレゼントはこちらで募集しています。よろしくね。

明日の担当は @_simanman さんです。


環境

  • OS: Ubuntu 16.04.3 LTS 
  • ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]


参考

2017/12/02

amazon-ecs を使って Kindle マンガの情報を取得する #okinawarb

この記事は Okinawa.rb Advent Calendar 2017 2日目の記事です。
1日目は @hanachin さんの「Rubyで国民健康保険料を計算する」でした。

Amazon は Product Advertising API というものを提供していて、商品を検索したりできます。
利用するためには affiliate.amazon.co.jp への登録が必要です。
加えて、 Advertising API を使うサイトなども申請する必要があります。
ちなみに登録に関してはにはこちらの記事が有用です。

Product Advertising API の token を取得したので、いざ商品検索。
具体的にはこちらを参考にしつつ書き始めましたが、この記事では商品検索リクエスト(item_search)を使っています。
私は検索ではなく「特定の値段以下のKindle本」が欲しいので、send_request で直接リクエストを作ることにしました。

とは言え実行するアクションは「ItemSearch」なので検索に相当します。
なお、 Advertising API は「特定のノード以下の情報を検索」ができます。
browse_node: 2293143051 というマジックナンバーがそれです。
2293143051 は Kindle book store のノードのようです。
Amazon本家のサイトの「Kindle ストア」にカーソルを合わせたりすると URL に含まれていて、他にも大量にあります

さて、リクエストの目星が付いたので実行してみましょう。
あれ。取れていませんね。何故だろう。

デバッグのために request を inspect したりして request の URI を取得。
その上参考記事の URI と比較すると、どうやら amazon.com に request を送っているようです。
(ここはエラーの詳細を書きたかったのですが、BANされたので割愛)
ということで marketplace: 'ja' を追加すると amazon.co.jp にリクエストを送るようになりました。
これで無料の Kindle 本を取得できました。


まとめ

amazon-ecs を使って無料の Kindle 本を集めることができました。
私はやってないのですが、これを購入する部分まで書くと素敵なことになりそうですね。

ということで Okinawa.rb Advent Calendar 2日目の記事でした。
なお、クリスマスプレゼントはこちらで募集しています。
明日の担当は @_atton さんです。というか私です。そして3日目の記事はこちら


環境

  • OS: Ubuntu 16.04.3 LTS 
  • ruby: 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]
  • rubygems: 2.6.13
  • amazon-ecs: 2.5.0


参考

2017/11/26

Git の hook を使って merge line がある時には commit できないようにする

Git で merge した時に conflict すると
みたいな形で表示されます。これを解決して commit すれば問題解決。
しかし、複数部分が conflict していると、たまにこの線を commit することがあります。つらい。
それを阻止したいのですが、人の手でやることでは無いので自動化します。


man githooks

  • $ man git
    • とりあえず man を読む。
    • /hook とかすると githooks というものがあると。
  • $ man githooks
    • $GIT_DIR/hooks か core.hooksPath/* のファイルを読み込むと書いてあります。
    • hooksPath を設定してみます。~/.gitconfig あたりに
    • を追記。
    • たぶん git confing --global とかでもできる。
    • 実際やることは ~/.gitconfig への書き込みだから同じなのだけれど。
    • これで全リポジトリに対する設定終わり。
  • ~/.config/git/hooks/pre-commit を書く
    • こんな感じかな。参考とか
    • これで commit 前に <<<<<< などの線があったら警告してくれます。
    • 実際は単なる shell script ですね。hook なので特定の action があった時に起動してれる感じ。
    • ちなみに git init したリポジトリの .git/hooks/* あたりを見ると sample があったりします。


動作サンプル

さて実際はどう動くかと言うと、こんな感じ。
commit したのに status が clean になってませんね。
これでミスって merge を解決し忘れたファイルを commit することも無いでしょう。めでたしめでたし。


おまけ

ソースにどうしても <<<<<< などの線を入れたい場合は
  • $ git commit --no-verify
とか使うと良いようです。
この hook を足す commit そのものが hook に引っかかったので使いました。


参考

2017/11/22

Ubuntu 16.04 + Nginx + Let's Encrypt で https 化する

基本的には表題の通り。
というかもともと certbot というものがあって、対話的に質問に答えるだけで設定が終わります
一応ログとして残す、くらいで。
最初の頃は letsencrypt コマンドを直叩きしてたのですが、certbot が楽でした。
certbot は http -> https への Redirect configuration まで入れてくれる。便利。みたいな話。
ちなみに https 化したサイトは Kindle格安マンガまとめKindle 無料マンガまとめ です。


環境

  • Ubuntu 16.04 LTS
  • certbot: 0.19.0
  • letsencrypt: 0.19.0


コマンド

  • # add-apt-repository ppa:certbot/certbotapt-get
    • ENTER
  • # apt-get update
  • # apt-get install -y python-certbot-nginx
  • # vi /etc/nginx/sites-available/default
    • server_name _;
    • server_name kindle-comic.info
    • とかに。適宜自分のドメインに置き換えてください。
  • # nginx -t
    • で syntax check できます。
  • # certbot --nginx -d kindle-comic.info
    • mail address とか聞かれる
    • terms and condition に同意するかどうか。アグリーってやつだ。
    • メールアドレスを公開するか。No かなー。
    • http -> https の Redirect をするか。もちろんするので2を選択。
  • # systemctl restart nginx
    • これで https 化完了


おまけ

certbot 楽で良い。おまかせなのが逆に難点かもだけれど。
nginx の configuration 書いたこと無い身としてはありがたかった。
ちなみに、 Let's Encrypt で取れる証明書は有効期間が3ヶ月らしい。
ので、だいたいの人が自動更新するよう cron に書くようですね。
私はこんな感じかな。
  • # crontab -e

あと AWS の EC2 を使っていたら Security Group で Inbound の 443 を空けるのを忘れないように。
ということで、Kindle格安マンガまとめ と Kindle 無料マンガまとめ を https 化した話でした。みんな使ってねー。


参考

2017/11/14

G Suite でプライマリドメインを変更できない時は試用期間でないか疑う

Google には GMail などの G Suite というものがあります

独自ドメインで GMail を運用するとかできて便利。
これは複数のドメインを持つことも可能で、それぞれにアカウントを作ったりできます。
なお、複数ドメインを持つと各ドメインに(プライマリ|セカンダリ)ドメインという区別がつきます。
これはデフォルトのドメインの指定です。
例えば Google Site を使う時、URL にはプライマリドメインが含まれます。

プライマリドメインは変更が可能らしいのですが、そんな項目が無い。
仕方が無いのでサポートに連絡してみることにしました。
英語だと24時間対応しているらしいので英語でちょちょいと。
その結果、「試用期間内はプライマリドメインの変更ができない」と言われました。
んで、試用期間を今日終わらせても良いなら対応できるよ、とのこと。

ということで試用期間を終わらせて有償プランになったらプライマリドメインが変更可能になりました。やったね。

にしても Perfect! とか Awesome! とか言ってくる人が対応してくれたので、愉快なチャットでした。


参考

2017/11/13

Ubuntu 16.04 LTS で NeoVim を使う

AWS の EC2 インスタンスに Ubuntu 16.04 があったので使ってみる。
環境構築の中で NeoVim のインストールと設定をしたログ。


環境

  • OS: Ubuntu 16.04.3 LTS
  • apt: 1.2.24
  • NeoVim: 0.2.0
  • Ruby: 2.3.1p112
  • neovim gem: 0.6.1
  • Python2: 2.7.12
  • pip2: 8.1.1
  • python2-neovim: 0.2.0
  • Python3: 3.5.2
  • pip3: 8.1.1
  • python3-neovim: 0.2.0


NeoVim 本体をインストール

  • # apt-get install -y software-properties-common python-software-properties
  • # add-apt-repository ppa:neovim-ppa/stable
    • Enter 押す必要があったけれど -y とか付けたら良かったのかな
  • # apt-get update
  • # apt-get install neovim
で neovim 本体は入ります。楽で良い。


dot_files を設定する

私は dot_files を公開しているので
  • git clone https://github.com/atton/dot_files
  • cd dot_files
  • ./install.sh
で設定終了。備えあれば何とやら。


NeoVim の環境を整える

私が使ってるプラグインが python3 必須だったりするのでその辺も整備。
  • # apt-get install -s ruby bundler
  • # gem install neovim
  • # apt-get install -y python3 python3-dev python3-pip python python-dev python-pip
  • # pip3 install neovim
  • # pip install neovim
で python2 + python3 + ruby の環境が整った。
:CheckHealth すると clipboard が無い以外は問題無い、とのことでOK。
自己診断機能便利ですよね。 brew doctor とか。


おまけ

ec2 の IP 覚えるとか domain 振るのとか面倒なので私の ~/.ssh/config はこんな感じ。
というかOSごとに default user name 違うってなんでやねん。

2017/11/12

tmux 2.6 を全角記号対応させる

2017/08/30 に tmux 2.6 がリリースされました。
それに伴ない、例によって分割線を ascii にするバージョンをリリースしました。
分割線の表示が変になる問題は Terminal.app が原因だったので、細々と自分用のをリリースしていこうかと(2.5の時)。

なお、作業としては rebase のみでパッチの変更点はありません。


環境

  • OS: macOS 10.12.6
  • tmux: border-ascii-2.6(65784831fcf0040b78d68b180c6ca8c1210e4317) (patched)
  • utf8proc: 2.1(562edab805b82d66622914d06a5da3f53cd54a17)
  • Homebrew: 1.3.6-217-g441c212
  • Homebrew/homebrew-core: git revision cf537; last commit 2017-11-11
  • Ricty: 3.2.2(no option)


インストール用コマンド

  • $ brew tap atton/customs
  • $ brew install atton/customs/utf8proc
  • $ brew install --HEAD atton/customs/tmux

2017/11/11

ドワンゴの Scala 研修用テキストに Pull Request を投げた

ドワンゴ在籍時代に新人向けの Scala 研修がありました。
研修テキストはGitHubで公開されていて、間違いや修正点があれば Pull Reqest を投げることができます。
テキストを読んでいると、文とサンプルコードの整合性が取れていないのに気付いたので、修正の PR を出しました。
そうしたらマージされた。やったね。

2017/11/04

#vimconf2017 にいってきた

2017/11/04(Sat) に Vimconf 2017 があったのでいってきました。


所感

なんか全体的に高級感あった。
全席電源あるし、WiFiは問題なく快適だし。昼ごはんはおいしい(あと白い恋人も付いてくる)。
いんたーなしょなるかんふぁれんす感はかなりありましたね。


はやぶささんの発表

haya14busa さんの Vim 活の歴史。
みんなに助けてもらったとか、アイデアを貰ったとか。
とあるプラグインの一部をライブラリとして切り出してもらったりとか、ハートフルな話。
私は EasyMotion 使ってないし、紹介された plugin もあまり入れて無いので、私とは違うタイプの Vimmer っぽそう。
スライドの途中でもあったけれど「Vim ユーザには多様性があって良い」とのこと。
Windows ユーザも多そうだしね。
『VimScript はペイする言語』(うろおぼえ)
置換時の offest とかは知らなかった。 conceal はう、頭が。


key note by fatih

He told about vim-go includes golang histories.
I interested commands uses go using AST.
It means very power full 2-way communication between vim and golang.
Another hand can be actioned easily for other hand(like use go-fmt in vim).
It's very important and interesting factor the in recent languagse.
Multi-platform support is very difficult(like PATH).
He gets 40+ ebooks from users say `I used vim-go. Where I donate?`


おひるごはん

豪華なすき焼き弁当でした。美味しかった。


参加費用5400円ではあるけれど、良いものに出て赤字にならないのかな、と思ったら赤字だそうです。


鼎談(3 vim legends)

3人とも Windows ユーザなんだそう。
なので Win で動かなかったらパッチぶん投げたりする方々。
でも Bram の意思とか気分とかで取り込まれたり、取り込まれなかったりとか。
昔のものを掘り起こすと、意外に取り込んでくれたりするらしい。
Windows ユーザは大変そうだなー、という事を感じる。makeencoding とか。
あと壊れてたら自分で Contrubute する精神重要だよな、とも感じる。
卒論の時の yak shaving が元で vim に patch 作るとかすごいよなー。
「割と度胸あるよね」「新幹線の中で作ってきた」「俺達には共通言語のCがあるやん」などのパワーワードが乱舞する。


cocopon さんの話

cocopon さんの colorscheme の話。
icebarg と言えば知ってる人は知ってるそう。
vim で syntax highlight を作るにはどうするか、に始まり、どういう風に配色を作るかまで。
ちなみに私は colorscheme は default で使っているというテキトーさである。
それでもおさえるべき汎用的なポイントはあったかな。
  • コンセプトを決める
  • 困ったらコンセプトに立ち帰る
とか。
ですが、この辺から体調が悪くなり始めてダウン。帰っちゃいました。


まとめ

会場とか高級感あった。参加者の話も分かりやすくまとまってた。
mopp さんの司会も分かりやすく聞きとりやすい英語だった。
惜しむらくは体調不良かな。懇親会が本番説もあるのでそこまでいけなかったのは口惜しいですが仕方無し。
ブログを書くまでが勉強会、は達成できたので良しとしよう。
Vimconf 2017 運営の方々 & 発表者の方々 ありがとうございました。

2017/11/03

うっかり消してしまった iPhone の計算機アプリを復元する

iOS 10 のどこかから、標準でインストールされているアプリを消せるようになりました。
ヒントとか使ってなくて邪魔なのでガンガン消していく。
その中で、「計算機アプリを消しても Control Center に計算機あるから良いかな」と思って計算機アプリを削除。
そうしたら、Control Center にある計算機も消えてしまいました。困った。

なので計算機アプリを復活させたログ。


環境

  • iPhone: SE 64GB
  • iOS: 10.3.3


復活方法

AppStore の購入済みの項目には無い。AppStore で検索をしても出てこない。困った。
何故こういう形になっているかは不明ですが、復活したので良し。


参考

業務委託時の開発費には消費税がかかる

タイトルの通りらしいです。

我々エンジニアは、業務委託の際、
  • ソフトウェアを開発し、その対価として報酬を貰う
ということをしています。

  • (2) 対価を得て行う取引
などに相当します。
なお、フリーランスである個人事業主も事業者として扱われます。
よって、報酬には消費税が課税されるので注意してください。

しかし、世の中には知らないと損をすることが多すぎる。


宣伝

ちなみに、この記事を書いている 2017/11 時点では、 2017/12 以降の仕事がありません。
なので絶賛お仕事募集中です。詳細は随時更新される atton.github.io にて。


参考

2017/11/01

tmux のバグを踏んだので Pull Request を作ったら Terminal.app のバグだった話

さて。私は tmux の線を ascii にするパッチを自分であてています
tmux は線を ascii で表示するか、UTF-8 で表示するのオプションがあります。
今日日 UTF-8 非対応というのは稀なので、基本は UTF-8 で表示される筈です。


問題

tmux の線に使われている文字が曲者で、EastAsianAmbiguous という文字種です。
これは文字幅を1にするか2にするか、言語圏によって決めます。
そんな文字を分割線に使うと、言語圏によって線の長さが変わってしまいます。
幅を決める部分は tmux の内部実装と glibc と utf8proc があります。
それらが EastAsianAmbiguous に対応していると問題ないのですが、 全部非対応。これはつらい。

UTF-8 で表示する際は、EastAsianAmbiguous を幅固定の線にする Pull Request を作りました


Pull Request による変更点

単に文字の置換です。

という変更をしています。
両方とも固定で幅が1なので、言語圏に依存しません。

例えば、このように表示が崩れていた場合でも
この Pull Request によってこのように綺麗に表示してくれます。やったね。

修正と文字リテラル

さて、当然ですが、文字を置換するにはソースをいじる必要があります。
tty-acs.c というファイルに文字テーブルがあるのでそれらを変更。具体的には x と q です。
さてこれで修正完了、と思ったら "\342\224\200" という謎の表記がある

実はこいつが分からなくて今まで PR を作ってませんでした。
q に相当する ─ (0x2500) のページを見つめていると、
  • UTF-8 (binary) 11100010:10010100:10000000
という表記が。

こいつをさらに良く見ると8進数で 3bit ずつ表記されていることに気がつく。
修正する予定の (0xffda) は
  • UTF-8 (binary) 11101111:10111111:10011010
なので
  • 11 101 111:10 111 111:10 011 010
  • 3 5 7: 2 7 7: 2 3 2
  • \357\277\232
書いてみると動いた。やったね。
単に私がこの文字リテラルを知らなかっただけなのですが、閃いた時は楽しかったですね。


メンテナのコメント

この PR で EastAsianAmbiguous を排除するので言語圏に依存せず正しい線が引けます。
なのでマージされると思っていましたが、メンテナの環境では上手くいかないらしい

んで、以下のオプションを試してくれと
set -as terminal-overrides ',*:U8=0'
こいつを .tmux.conf に書くも、やっぱり私の環境だと上手くいかない。

UTF-8 表示に強制するオプションのようなのですが、そいつを修正するパッチなのに……
正確には ACS というものを使って線を描画するようです

ちなみに Terminal.app + Ricty では上手くいかない。こうなります。

動かないよって文句を言ったら、「ACS サポートしてないターミナル使ってない?」と。

いやいや公式の Terminal.app ですよと内心思いましたが、iTerm2 と xterm を試すことにしました。
そうしたら何と綺麗に表示されるではありせんか

どうやら Terminal.app は ACS をサポートしていないようです。つらい。

iTerm2 に乗り換えを検討しましたが、今度は EastAsianAmbiguous に対応しているか問題に変わる。
面倒になったので今まで通りの
  • Terminal.app
  • 独自パッチの tmux
で運用していこうと思います。

しかし tmux のバグだと思ったら Terminal.app だとは。
流石にそれは修正できない。

これはちょっとしたぼやきなのですが、Terminal.app は結構バグがあるらしい。
Terminal Multiplexer のメンテナが言うからには、色々あったんだろうな、と察する。
しかし nicm さん対応が早い。最初のコメントは10分とかでついた気がする。
反応が早いのはこちらとしても助かるし、いろいろと助言を貰えました。
まー助言の結果 Terminal.app は残念というオチなのですが。

ということで、tmux のバグを踏だので Pull Request を作ったら Terminal.app のバグでした。


環境



参考

2017/10/31

アカウント凍結が流行っているので Twitter の全ツイート履歴を取得して残す

Twitter では最近アカウント凍結が頻発してるようです。
悪意のあるツイートを多くしたり、ヤバめの R-18 の絵を載せたツイートをしたり、通報されると凍結だとの噂。
凍結される心当たりは無いですが、フォローが1000になったので、記念に全履歴を取得しておくことにしました。


履歴取得方法

まずは Twitter にログインして
  • 設定とプライバシー > ユーザ情報 > 全ツイート履歴
で全ツイート履歴をリクエストします。
しばらくすると「準備が出来たよ」とメールが来ます。
私の場合は1時間もかからなかったんかな。

次に、メールに含まれる URL を開いて全履歴をダウンロードします。
具体的には zip が手に入るので、解凍すれば全ツイート取得完了。
zip 中の index.html を開くと全ツイートを確認できます。
ちなみに私の全ツイートはこんな感じatton.github.io に載せました。
検索とかもできるますし、いつ頃にどれだけツイートしてるか、棒グラフが表示されたり便利。
流石に初期のころのツイートは懐しさしか無いですね。

ということで全ツイート履歴が手に入ったので凍結されても過去のツイートを見ることだけはできる。
しかし、本来重要なのはフォロワーの方だと思います。
例えば friends.nico で全フォロワーが再現できたらTwitter が消えても何ら問題が無くなる。
アカウント対応表みたいなのがあれば話は早いんですけれどね。

良く見ると記念ツイートなのにお仕事を募集している。早く仙人になりたい。

2017/10/30

Mercurial Repository を Git Repository に変換する

Findy という転職サイトが GitHub の public repository からスキル偏差値なるものを算出してくれます。
一度登録してみると、スキル偏差値はプレミアム本会員になるギリギリの60でした。
実際どのくらいなのだろう60。定量的な値になってると良いのだけれど。

さて、 GitHub には大学とは関係ない個人のプロダクトとかを載せていました。
大学での課題やプロダクトは大学の Mercurial Repository に残しています。
ですが、この際 GitHub にも載せることにしました。
単にスキル偏差値を上げたいだけとも言う。
単に bitbucket に上げても良いのだけれどそれだと Findy に拾って貰えないので。


環境構築

Mercurial から Git への変換は fast-export を使います。
  • $ git clone https://github.com/frej/fast-export
こいつは python を内部で使ってるのでその調整も必要です。
  • $ easy_install mercurial
とかかな。
私は python2 を brew で明示的に入れてるので
  • $ vim fast-export/hg-fast-export.sh
    • python -> python2
  • $ pip2 install mercurial
とか。実行時にエラーが出なければOKだと思います。


自分だけが Author の Mercurial Repository の変換

fast-export のセットアップが終わったら、変換します。
  • $ mkdir git_repo
  • $ cd git_repo
  • $ git init
  • $ ../fast-export/hg-fast-export.sh -r /path/to/hg_repo
これで Mercurial の Repository を元に git に commit しまくってくれます。
きちんと時刻とかも残るので便利。


Author Information が気に入らない場合

私は大学時代の時は大学のメールアドレスで commit していたので、GitHub にはアイコンが無い。
これはちょっ悲しいので Author の情報を変更する。
具体的には username と email ですね。変更するには
とかすると良い。長いけれど1コマンドです。
これは他人の commit も変更できちゃうので完全に悪用厳禁ですね。


他の人も commit している repository の変換

最初にやることは変わらずに変換。
  • $ ../fast-export/hg-fast-export.sh -r /path/to/hg_repo
んで、 Author を変更する時に発行するコマンドを変えます。
if 文で自分の変えたい username+email を指定してあげています。

これで指定したものだけが変更されます。便利。
こっちも長いけれど1コマンドですね。
これで他人の成果をきちんと残したまま、自分の気に入らないメールアドレスを書き換えられます。
やっぱり悪用厳禁なコマンドなので注意。


fast-export で変換した Repository List

どうせなので公開できる成果物のリストを残しておきます。
この成果物が誰かの参考になれば幸いです。


オチ

この後 Findy で GitHub 再連携をしたところ、算出方法が変わったようで51に下がりました。かなしい。


環境

  • OS: macOS 10.12.6
  • fast-export (cc8fefe0083bc38c781341a86a1779dc5941f6e2)
  • python: 2.7.10
    • pip: 9.0.1
    • mercurial: 4.3.3
  • Mercurial: 4.3.3
  • Git: 2.14.3


参考

2017/10/29

M3 に行ってきた

M3-2017秋<第40回即売会> へ行ってきました。
所謂音楽の同人販売ですね。


所感

お祭り騒ぎ。Rubykaigi の時も同じこと言ってたな。
実際、フライヤーの絵は上手いものが多く、ざらっと眺めていても目の保養になる。
とか絵に注目していたら、有名どころの作曲家がポンとブースを出していたりするのでびっくりイベントですよ。


入場前

今回は台風のせいもあってか雨が酷かった。
大雨の中長蛇の列に並ぶのは大変しんどかったです。
傘で片手が塞がっているので、パンフレットも読めないしでさんざんでした。
始まる前から帰りたい気持ちがちょっと出てきたレベル。
たぶん雨合羽を羽織るのが正解かな。


CD購入とか迷子とか

入場したら入場したで楽しくなってくる。お祭りだしね。
知り合いのブースを回ったり、ふと立ち寄ったブースで直感のもとにCDを買ったり。
完全に楽しんでましたね。
とりあえず回る予定だったブースも回れて満足。
どのくらい満足したかといえば、財布の中身が100円になるくらい。次は増額必須だな。
ちなみに今回も無事迷子になりました。10秒くらいで見失ったかな。
あとパンフレットをパラパラしていたら Ctrl+A を見付ける。もちろんCDを買う。
完全にあれは偶然ではなく必然だったな。愉快なことは良いことだ。
どうせデジタルでインポートするので、 CD を買うことには引け目があったけれど、イベントを楽しむ上では必須だよね。
もちろん基本はデジタルで配布してます、みたいなサークルもあった。
この辺楽にならないものかなー。


ちょっと残念だった点 or 次回改善したい点

ジャンル名が分からないのでどんな曲か想像つかない。
テクノ、とは何かみたいな。
加えて、ジャケットと曲は直接関係無い場合も珍しくないので、良ジャケットが良曲とも限らない。
ただ、もちろんそれは主催者側も把握しているようで、試聴コーナーとかありました。
ジャケ買いする場合は完全に全てのものを買うことになりかねないのでそこは審美眼を養わねばなるまい。
あとイヤホン忘れたのが致命傷でしたね。
疲れたので早々に撤退しましたが、時間の許す限り試聴コーナーに篭り続けるという技も良さそうだ。


まとめ

いやなんか楽しかった。
ちょうど作業用BGMに飽きてきた頃合いだったんだよな。
あと、M3 は年2回らしいので次は春に参加かな。


おまけ

以下、参加時のツイート(何も考えていない)。









2017/10/23

CentOS7 で VLAN を設定する

オンプレサーバ + VLAN で区切られた network を想定します。
オンプレサーバで VM を提供する場合、1つの NIC が複数の VLAN に足が生えてる状態する必要があります。
その設定をした時のログ。


環境

  • OS: CentOS Linux release 7.2.1511 (Core)
  • Kernel: 3.10.0-327.10.1.el7.x86_64


VLAN に足が生える想定の Interface (Bridge)を作る

VLAN 1つに対して1つの Bridge を作成します。
例えば VLAN 111 に足を生やすとしたら

などを /etc/sysconfig/network-scripts/ifcfg-br111 として作成します。
brctl とかで状態を見られたりしますね。


VLAN を指定して、実 Interface から Bridge する

VLAN に足を生やす元の Interface は bond0 としましょう。
先程作った br に対して実際の Interface の VLAN=yes 版をブリッジします。

とかを /etc/sysconfig/network-scripts/ifcfg-bond0.111 に書きます。
これで br111 は VLAN 111 に通信できます。
こちら側のファイルも VLAN ごとに設定を作成する必要がありますね。

  • # systemctl restart network
してきちんと network が上がってきて通信できるか確認しましょう。
複数の VLAN が1ポート内で入り混ざることを、スイッチ側にも設定しないといけない気もしますが、そこは私がやらなかったので割愛。


参考





CentOS7 で複数の NIC を束ねて bonding する

オンプレのサーバだと複数の NIC を積んでいることがあります。
それらの NIC を束ねて帯域幅を増やしたり、NIC を冗長化するなど活用法は多々あります。
今回は束ねて帯域幅を増やす設定のログを残しておきます。


環境

  • OS: CentOS Linux release 7.2.1511 (Core)
  • Kernel: 3.10.0-327.10.1.el7.x86_64
  • NIC: ifcfg-(p2p1|p2p2|p3p1|p3p2) として認識している


束ねる集約先になる、仮想の Interface を作る

まずは集約先の Interface を作ります。

とかを /etc/sysconfig/network-scripts/ifcfg-bond0 に作成。
mode=4 だと LACP で束ねてくれます。


物理NIC の Interface で集約先を指定

物理NIC の Interface で集約先を指定。
とかを /etc/sysconfig/network-scripts/ifcfg-p2p1 に作成。
具体的には Master に bond0 を指定して、SLAVE=yes にします。
これを ifcfg-(p2p1|p2p2|p3p1|p3p2) 全てに適用してみます。そうすると4本を1つに束ねられる。
最後は、設定をファイルに書き込んだ後に
  • # systemctl restart network
で適用。これできちんと network が上がってきたらOK。
単純に考えると帯域幅が4倍になってるはずです。

参考

2017/10/17

問答無用でテキストファイルの文字コードを UTF-8 にする

この記事 を見ていて文字化けとかつらいよなー、と思うなど。
私だったら nkf を CLI で使うかな、と思ったのでそれを書いておこうかなと思います。


コマンド

UTF-8 + 改行コードを unix にする、だと
  • $ nkf -wLu --override **/*.html
とか。 glob が長いと怒られるのなら
  • $ find -name '*.html' | xargs -L1 nkf -wLu --override
とか。 git 管理下にあるのなら
  • $ git ls-files | xargs -L1 nkf -wLu --override
とかでも良いでしょう。

meta タグの置換はとりあえず単に Shift_JIS を UTF-8 にするだけでいけると仮定。
それなら
  • $ sed -i -e 's/Shift_JIS/UTF-8/'
でいけます。 確か -i オプションは GNU 版の sed にしかなかったはず。
meta タグを検出する必要があったら正規表現を複雑にする必要がありますね。


おまけ

このファイルの文字コード何だ? となったら
  • $ nkf -g file.txt
で分かります。


環境

  • OS: macOS Sierra 10.12.6
  • nkf: Network Kanji Filter Version 2.1.4 (2015-12-12) 
  • sed: gsed (GNU sed) 4.4

2017/10/13

VALU で貰ったビットコインを換金する

VALU にアカウントを作っていたのですが、私のVALUを買ってくれる人がいました。
もちろん VALU でのやりとりは bitcoin 。
とりあえず遊びで仮想通貨に触れてみるのも良いかなと思って換金してみました。


ビットコイン購入/販売所 のアカウントを作る

まずは貰った bitcoin の送り先を確保します。
銀行に口座を作るみたいな感じですね。
とりあえず国内取引量最大らしい bitFlyer にアカウントを作る。


ビットコインアドレスを確認する

次に送信先のアドレスを確認します。
口座番号みたいなものですね。
bitFlyer だと
  • 設定 > bitFlyer アカウントご登録内容
にあります。
例えば「3K61u2B3k5bGmwCyDSMKyL8uF5xi7z863D」といった3から始まる長い文字列です。


VALU から bitFlyer に送金する

VALU で貰った bitcoin を確認したアドレス宛に送信します。
  • メニュー > 口座の管理 > 送金
で先程確認したアドレスを指定して、送金する bitcoin の数を決めます。
手数料で 0.0005 bitcoin ほど VALU に取られるので注意。
手数料は 2017/10/13 の時点だと300円ちょっとくらい? ですね。


bitFlyer で着金していることを確認する

bitcoin の送金には時間がかかります。
私の場合だと1時間くらいかかりました。
あとは bitFlyer で日本円に換金して終わりです。やったね。


最後に

このような手順で VALU でもらった bitcoin を日本円に換金できます。
また、もしこの記事に価値を感じた方は「3K61u2B3k5bGmwCyDSMKyL8uF5xi7z863D」に bitcoin を送ってくれると幸いです。

2017/10/12

systemd 制御下のプロセスの SEGV を追う

systemd で起動したプロセスがいつの間にか死んでる。
systemctl status を確認すると SEGV している。SEGV ......
SEGV の原因を追うために systemd 管理下のプロセスで core を取る方法とかのログ。
ちなみにそのプロセスは FreeRADIUS ですね。


コアを dump するように

  • $ vim /etc/security/limits.d/core.conf
  • $ vim /etc/sysctl.d/core.conf

コアを取るように設定。
  • $ reboot
したら設定の適用完了。


動作確認

きちんと取れるか、死んでたプロセスに

    • $ kill -11 <pid>
    とかしたら core が取れるか確認できます。


    その後

    取れたコアを使って gdb で原因を追っていく。
    その際に bt などが使えないのがつらいので
    • $ yum --enablerepo='*debug*' install /usr/lib/debug/.build-id/9c/hogehogefugafuga

    とかしておく。
    こうすると freeradius-debuginfo が入って bt とかを見られるようになる。
    とかとかしながらデバッグして原因を突き止めたのがこの記事です。


    環境

    • OS: CentOS Linux release 7.4.1708 (Core) 
    • kernel: 3.10.0-693.2.2.el7.x86_64
    • systemd: 219 +PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
    • FreeRADIUS: 3.0.4

    Amazon Mastercard ゴールドを無料で再発行してもらった

    東京に引っ越してから Amazon を使う機会が増えたので Amazon Mastercard ゴールド を作りました。
    プライムユーザが Amazon で買い物をすると 2.5% ポイントとして還元してくれる。
    普通に使っても 1% 還元なのでその辺のポイントカードを持ち歩くよりは楽。

    という感じでクレカライフを楽しんでいたのですが、財布を洗濯するという悲劇が発生。
    結果クレカは無惨にも曲がってしまい、どう見ても使えない状態に。
    サポートデスクに電話したら「ゴールドカードの会員様は無料で新しいカードを発行させて頂きます」と。
    紛失した訳ではないので、番号とかもそのまま、カードを再発行してもらえました。

    手厚いサポートという感じだ。こういう面も含めて便利で良い。

    zmv を使ってまとめてファイルを rename する

    zsh には zmv という機能があって、glob で指定した部分を置換できます。
    例えば *.jpg というファイル群をまとめて *.jpeg に変換できます。

    仮に以下のようなファイル群があったとして

    • ls

    bar.jpg foo.jpg fuga.jpg hoge.jpg piyo.jpg
    • zmv -w  '*.jpg' '*.jpeg'
    すると以下のようになります。
    • ls
    bar.jpeg foo.jpeg fuga.jpeg hoge.jpeg piyo.jpeg
    便利。zmv を使うには .zshrc に
    autoload -Uz zmv
    と書く必要があります。

    ちなみに dry-run option も存在していて、 -n で dry-run ができます。
    • zmv -n -w  '*.jpg' '$1.jpeg'
    mv -- bar.jpg bar.jpeg
    mv -- foo.jpg foo.jpeg
    mv -- fuga.jpg fuga.jpeg
    mv -- hoge.jpg hoge.jpeg
    mv -- piyo.jpg piyo.jpeg

    以上、ちょっとした小技 zmv でした。-w とか -W は help を読んでみてね。
    man zshall とかを読んでも良いかも。


    環境

    • zsh: 5.4.2 (x86_64-apple-darwin16.7.0)

    CentOS7 で GFS2 を構築/本番運用したノウハウまとめ

    GFS2 を構築したり運用した時のノウハウを共有。
    どちらかと言うと「こういう事もあったなー」的なエピソードのまとめです。


    systemctl restart network はしてはいけない

    死にます。
    単一ノードの reboot は問題無くできます。
    といって network の restart はノードが fence されてしまってクラスタから切り離されます。
    クラスタから切り離されるのはまだ良い方で、最悪 HACluster 全体を巻き込んで死にます。
    具体的には gfs2 を mount しているディレクトリに ls したら永遠に返ってこない。
    全体を reboot で復活します。
    network の configuration を変える時は pcs stop --all とかしてくださいね。


    fsck.gfs2 は(直る時もある|直らない時もある)

    死んだ時にはファイルが壊れたりするのですが、場合によれば fsck.gfs2 で直ります。
    ただし、直らない時もあります。具体的には24時間以上かかっても終わらない。
    gfs2 のサイズを大きく(テラオーダー)作ったのが原因かもしれませんが、直らない時は直らないです。
    gfs2 を作った後に小さくすることはできませんが、大きくすることはできるます。
    なので、最初は小さいサイズから作るのが良さそうです。


    CPU/Network の利用率が100%になると fence される

    各ノードの死活管理には fence というものを使います。
    初期設定だと Network の利用率が100% になった時、ノードがクラスタから外されます。
    あとは CPU の使用率が高すぎる時とか。
    VMイメージのバックアップを取るためにノードが死んだりしました。
    まー1ノードくらい落ちても動くための HACluster だから良いのかもしれないけれど。


    umount までできるスクリプトを組んでおく + PowerChute との連携はしっかり

    当然ですが、gfs2 上にあるファイルに読み書きしている時には umount できません。
    例えば VM を gfs2 に置いてると、destroy する必要があります。
    停電した際に電源が UPS に切り替わった時、 umount できないと焦ります。
    スクリプトとかを書いておいて、よしなにしてくれるようにした方が良いでしょう。
    出来れば pcs で管理して、gfs2 を止める時に kvm で動いている VM を全て destroy した方が良いです。
    あとは停電対策として PowerChute とかとも連携すると良いですね。


    scsi-shooter は暇なノードに置いておくと良い

    fence を行なうノードはクラスタに1つで良いです。
    なので、全ノードが fence 用のプロセスを起動している訳ではない。
    死活監視のプロセスなので忙しいノードよりは暇なノードに置いた方が良いことが多いです(さっきの100%問題とか)。


    公式ドキュメントを読もう

    というかgfs2の参考文献とかだと公式ドキュメントしかなかったりします。
    設定から何から書かれているので読みましょう。


    環境

    • OS: CentOS Linux release 7.2.1511 (Core) 
    • Kernel: 3.10.0-327.10.1.el7.x86_64
    • pcs: 0.9.143


    参考

    2017/10/10

    Docker でデータの保存先をデフォルトの場所から変更する

    Docker は CentOS7 だと image などを /var/lib/docker 以下に保存します。
    しかし、その場所を使わずに他の場所へと変更することも可能です。
    例えば、SSD のドライブに置くようにしたらイメージの読み書きが早くなるでしょう。
    データの場所を変更するには /etc/sysconfig/docker を編集して -g オプションを追加します。
    具体的にはこんな感じ。

    これで

    • # systemctl restart docker
    すると、 -g で指定したディレクトリにデータが保存されるようになります。やったね。


    環境

    • OS: CentOS Linux release 7.2.1511 (Core)
    • Kernel: 3.10.0-327.10.1.el7.x86_64
    • Docker: version 1.12.6, build c4618fb/1.12.6


    参考

    2017/10/09

    virsh vol-create-from を使って異なる storage pool 間でイメージをコピーする

    libvirt はVMイメージの置き場として Storage Pool というものを提供しています。
    Storage Pool は libvirt が操作可能な記憶領域です。
    例えば、 Akatsuki による VM 貸し出しのフローは

    • テンプレート用のVMイメージをテンプレートのストレージプールから読み取る
    • 貸し出し用ストレージプールにテンプレートのVMイメージをコピー
    • 貸し出しインスタンスとしてコピーされたものを起動する
    といった形式になっています。



    状況

    • ストレージプール a と b がある
    • ストレージプール a に hoge.img がある
    • hoge.img をストレージプール b に fuga.img として複製したい


    状況を再現するコマンド

    とりあえず前提条件のストレージプール a と b を作ります。
    今回のストレージプールはディレクトリタイプ。
    他にも特定のデバイスをプールにするタイプなどいろいろあります。
    • # virsh pool-define-as a dir - - - - /path/to/a
    • # virsh pool-build a
    • # virsh pool-start a
    • # virsh pool-autostart a
    • # virsh pool-define-as b dir - - - - /path/to/b
    • # virsh pool-build b
    • # virsh pool-start b
    • # virsh pool-autostart b
    これで2つのストレージプールができました。

    そして a に hoge.img を作ります。
    • # virsh vol-create-as  --pool a hoge.img 10G
    イメージができました。vol-list で確認します。

    この hoge.img を b にコピーしたい。

    やり方はいくつかありますが、今回は vol-create-from を使う方針でいきます。
    その場合は xml が必要なので dumpxml で作っておきます。
    • # virsh vol-dumpxml  --pool a hoge.img > fuga.xml
    fuga.xml  の key や path を hoge の情報から、所望の情報に変更しましょう。
    今回は /path/to/b/fuga.img になるように書き換えます。

    そして vol-create-from でコピー。
    • # virsh vol-create-from --inputpool a --vol hoge.img --pool b  --file fuga.xml 
    再度 vol-list で確認します。

    fuga.img が作成できていることが分かります。やったね。


    環境

    • OS: CentOS Linux release 7.4.1708 (Core)
    • Kernel: 3.10.0-693.2.2.el7.x86_64
    • virsh: 3.2.0


    参考

    TimeMachine の Local Backup を無効にする

    作業中に df したら謎のボリュームが増えている。
    どうやら TimeMachine の Local Backup というやつらしい
    MBP の中に Backup 用のデータを溜めておいて、 TimeMachine の Disk 無しで復元などができるらしい。
    私の Backup の運用としては邪魔なので無効化。
    SSD の容量持ってかれるのは嫌なので。

    • $ sudo tmutil disablelocal
    これで消える。


    参考


    2017/10/07

    Akatsuki を OSS 化した

    Akatsuki を OSS 化して GitHub で公開しました



    Akatsuki とは琉球大学情報工学科のシステムです。具体的には
    • 学生のIP申請
      • 対応するドメインを内向き DNS へと登録
      • その IP を DHCP で配れるように
    • 学生のVM新規作成/起動
    • 学生のパスワード変更
      • unix login
      • 802.11X で無線に繋ぐ際の RADIUS を提供
    といったことができます。


    つまり今まで記事で部分部分を解説していたものの本体です。
    関連している記事は以下。


    公開にあたって

    もちろん大学の内部情報をそのまま GitHub に投げるわけにはいきません。
    なので、こいつは OSS 化用にいじってあります。
    具体的には漏れたらまずい情報を消してあります。
    あとライセンスは MIT だし気にせず自分でいじって公開していく。

    その手順として
    • $ git rm very-important-information
      • で公開してはいけない情報を消して
    • $ git commit
      • コミットします。
    • $ git rebase -i --root
      • その後に rebase します。
      • 全部 fixup して一つのコミットにまとめてしまいます
      • fixup しないと復元ができてしまうので、消しても意味がない。
      • ということで、逆に言えばこの手順を踏めばアカンやつを隠蔽できます。


    まとめ

    所謂実績の一つとして見てもらえると良いかなー、と思って OSS 化しました。
    ということで、大学生/大学院生時代にしていた仕事の1つが OSS になりました。

    2017/10/06

    Heroku の Hobby プランの PostgreSQL が一杯になったので Standard にアップグレードした

    Rails を使った Web application を heroku の hobby プラン(無料枠) で運用中、DBへの書き込みができなくなる。

    • $ heroku logs

    を漁ると

    ActiveRecord::StatementInvalid (PG::InsufficientPrivilege: ERROR:  permission denied

    とある。何事だろう。
    調べたら、レコードが多すぎる時に発生するらしい。

    • $ heroku pg:info

    すると無料枠の 10k レコードを越えていました。
    というかぴったり 10k 制限じゃないんだ。優しさなのかなんなのか。

    参照した記事の場合、レコードを消して対応していました。
    私の場合、レコードを消すわけにはいかないので、 hobby からの upgrade をすることにしました。


    コマンド

    正直なことを言えば公式のドキュメントが最強です。
    指示通りでそのまま問題なくアップグレードできます。
    なので、コメント付きで公式ドキュメントをなぞるくらいの気持ちでログを残します。
    • $ heroku maintenance:on
      • Application を止めます。メンテナンスモードですね。
      • おお、これは所謂「停止メンテ」だ。何が起こるか分からないのが良いですね。
    • $ heroku addons:create heroku-postgresql:standard-0
      • DB を新規に作成。プランは standard にしました。
    • $ heroku pg:wait
      • 新規作成したDBを使えるようにします。
    • $ heroku pg:info
      • を見ると DB が増えています。
    • $ heroku pg:copy DATABASE_URL HEROKU_POSTGRESQL_BLACK_URL
      • 古いDBから新しいDBにコピー。
      • DATABASE_URL は置換するとかではなく、この文字列で正しい。
      • なので postgresql-lively-12345 とかに書き換える必要は無いです。
      • 公式ドキュメントだと PINK とかだったかな。どうやらネーミングは色らしい。
    • $ heroku pg:promote HEROKU_POSTGRESQL_BLACK_URL
      • 新しい standard の方をメインのDBにセットします
      • これで DB の移行は終わり
    • $ heroku maintenance:off
      • メンテナンスモード終了
      • これで DB がアップグレードされた状態で Web Application が上がります。
    流石 PaaS 。サクサクメンテができるのでインフラに手間がかからない。
    ということで淡々とアップグレードができたのでした。ぱちぱち。



    参考

    2017/10/03

    私がフリーランスになってから行なった手続き

    さて、私は 2017/08/10 からフリーランスのエンジニアになった訳ですが、その際の手続きを残していこうと思います。
    これはフリーランスになりたい人向けの先人のログです。
    もちろん当時の状況を反映したものなので、貴方がフリーランスになる時は話が違うかもしれませんが、それは御愛嬌。


    はじめに

    まずフリーランスという単語ですが、特定の組織に所属しないという意味だそうです。
    なので法的には個人事業主という立場になる場合が多いと思います。


    個人事業主になるには

    税務署に開業届を提出します。
    開業freeeなどを使うと質問に答えるだけで開業届を作成してくれます。便利。
    これを所轄の税務署に提出すればあなたも個人事業主。
    ただし、今まで会社が行なってきた税金や保険や年金の支払いを自分で行う必要があります。


    確定申告と会計ソフト

    まずは税金について。個人事業主になると確定申告が必要になります。

    確定申告は、収入や経費などを計算して所得税を計算し、それを収めることらしいです。
    確定申告には白色申告と青色申告があって、青色の方が複雑な分65万円分の控除が受けられるようです。
    また、青色申告をしますよ、という事前届けが必要。
    ちなみに開業freeeでは青色申告の申請書類も作ってくれるので便利。
    青色申告をするためには開業後から一定期間内に提出する必要があったはずです。
    私は開業届と一緒に提出したので気にしていない。
    なので青色申告の申請書類も税務署に申告ですね。

    流石に自分で帳簿をつけたくないので会計ソフトを使うことにしました。
    使うのは freee 。開業freee でお世話になりましたからね。


    健康保険

    会社にいた時は、会社の健康保険で通院費用負担が3割でした。
    しかし個人事業主は全額負担しなくてはなりません。これは恐ろしい。
    それを回避するために誰でも入れる国民健康保険があります。
    計算すると場合によっては結構高くなる場合もあるらしいです。

    別の手として、会社に所属していた時の健康保険を継続する方法があります。
    任意継続呼ばれるもので、2年間だけの制限付きですが同じ健康保険を続けられます。
    ただ、会社時代は会社が半分保険代を出していたので、負担額は倍になります。
    しかし、病院代全額負担にはかえられない。
    任意継続申請の期限は退職日から2週間以内なので早めに動いた方が良いです。

    ドワンゴでは、関東ITソフトウェア健康保険(ITS)に加入していました。
    エンジニアの初任給は30万円だったので、それに対応する等級だと 25k とか。

    私は任意継続を選びました。
    ある意味、2年後にまた今後どうするか考える機会が発生することになります。
    退職時に貰った書類を提出して口座振り込みで任意継続は完了。

    なお、保険証は一旦返却するので、保険証が存在しない恐怖の2週間が存在します。


    国民年金

    年金などの手続きも自分でやる必要があります。
    これも退職から2週間以内。手続きを行うのは市町村役場。
    離職表などを持っていく必要があります。
    ちなみに私の退職日は 08/09 なのですが、厚生年金は7月まで加入扱いで、8月から国民年金という形になります。

    ねんきんネットで手続きできるかと思いましたが、項目が無い。
    担当の年金事務所に電話したら、窓口での対応になるとのことでした。

    ということで年金事務所へ。

    • 身分証明書
    • 年金手帳
    • 離職票
    を持っていきました。

    国民年金への切り替えとして「国民年金被保険者関係届書」を作成して提出しました。
    これで切り替えはOK。この手続きには身分証明書と年金手帳のみでOKでした。


    国民年金保険料免除(失業時)

    切り替え自体はこれで終わりですが、担当者から失業時の保険料免除について教えてくれました。
    学生特例制度みたいなものですね。
    年金を納めなくて良いのは同じですが、免除になると半額を国が出した扱いにしてくれます。
    学生特例制度だと受給期間だけしか増えないのでこれは大きいですね。
    失業時は前年の所得を減らして計算するそうです。
    あと、人によっては失業保険とかも受けられると思います。
    有効期間は1年間。16k * 12 は大きい。申請しました。
    結果が出るのは二ヶ月後とのこと。


    まとめ

    フリーランスになってからの方が社会制度とかをいろいろと知った気がします。
    やはり必要になると人間調べるものです。
    あと、世の中は知らないと損をすることが多い。
    また、こういう制度もあるよ、という助言はいつでも歓迎です。
    この記事が、フリーランスになりたい貴方の参考になれば幸いです。


    おまけ: 毎月かかる費用

    さて、一応書いておかねばならないのは出費。
    開業届けに関しては費用はかかりません。
    健康保険は月 25k ほど。これは収入に対して比例するので増減します。
    国民年金は月 16k ほど。これは固定。
    両方とも前納制度とかがあるのでちょっとお得になる時もあります。
    税金は収入次第。

    ということで、私だと毎月40kくらいが無くなります。
    その分も踏まえて仕事ができるとうれしいものです。

    なお、この記事を書いている 2017/10/03 時点ではフリーランスを続けられています。頑張ってる。


    参考

    2017/09/23

    RGhost に PR を送ってマージされた

    現プロジェクトで画像を扱う機会があって RGhost を使っていました。
    その時以下のようなエラーが。パッと見て何が起きたか何も分からない。

    具体的にその時は Tempfile を渡していたのですが、nil 関係無くても出てくる。

    ちょっと困ったなー、ということで調べてみる。
    具体的にエラーが発生しているのは shellescape というメソッド。
    これを呼んでるのはこことかこことかここ
    RGhost は ImageMagick を使って画像を変換するのでそれ用に引数を shellescape しているようです。
    (書いてて思ったけれど ImageMagick 側は何もAPIとか提供してないのかな)

    それで、よくよく見てみると file_in は case を使って @document のクラスで確定するらしい
    あー、それなら Tempfile は扱えないな。
    ということで File にして一時の問題は解決。
    他の人にも同じ轍を踏んで欲しくないので、対応してないのならメッセージが出るとかした方が良いな、と思う。

    ということで PR にしてみました
    やったことは単純で、case に else 節を足して例外を投げるように変更。
    RGhost::Document と File と String しか対応してないよー、と例外経由でメッセージが出るようになった。
    RSpec ももちろん追加。
    gemspec に RSpec のバージョンが指定されていないのが若干ひやひやものである。
    3.0 未満の RSpec だと raise_error とか無かった気がする。
    あと浮動小数の値がちょっと違う。なんか最近YARVに変更入ったっけ。分からない。
    そのあたりも含めて最新に合わせつつ、バージョン情報とかを PR に書いて投げた。
    そしたら一晩でマージしてくれた。対応早くてうれしい。

    という訳で Rubykaigi の熱がさめないうちに OSS 活動をしたのであった。まる。

    2017/09/22

    Rubykaigi 2017 に行ってきた #rubykaigi

    2017/09/18-20 にあった Rubykaigi 2017 へと行ってきました。


    所感

    完全にお祭り。インターネットでよく見掛ける人がその辺にごろごろいるし、毎晩ご飯とお酒が振る舞われるし。
    ちょっと所用のせいで二日目からの参加になりましたが、みんな毎晩呑んで寝不足ー、みたいなお祭り騒ぎ状態でした。


    真面目な感想

    全体的に発表のクオリティが高い。
    個人的には海外から来ている方々の発表がジョーク含め、センス良い感じがあった。
    日本人の発表は良くも悪くも淡々としたので文化を感じる。
    淡々と恐しいことをさらっとやってのける感じは流石だが。
    この辺は文字通り国際会議的な感じはあった。文化のごった煮だ。
    と言いつつ一番印象に残ったのは@syouhei さんの「Glitching ruby script」。
    American Fuzzy Lop という Glitch するアルゴリズムをコードに適用して、「ちょっと変更されたけれど、実行結果は変わらない」みたいなコードを作成できる。
    んでそれがコーナーケースとして刺さったりするらしい。面白い。
    あと American Fuzzy Lop の画像検索結果が良いね。
    感想としては、視野の広さと応用力を感じた。いやーそうくるか、みたいな。

    一日目に参加できなったので笹田さんの発表が気になっている。
    二日目以降の発表で「前に笹田さんが発表していたのでスキップ」が数度あった。何を話されていたのだろう。
    あとは vs The World が聞けなかったのも痛いか。

    実は LT に応募してたのだが、「僕らからすると別に特別目新しい内容でも無いので reject 」と言われてしまった。
    メールが来た時はちょっと残念だったが、実際のLTを見るとレベル高かった。
    仮に採用されていた時には確かに場違い的な内容になりかねなかった。危ない。


    個人用な雑な感想とちょっとしたイベントメモとか

    • 『二つ名を得よ。』
    • 翻訳業界ではその辺で神が降臨したりしてビビる
    • 背後に隠れているコンテキストの方が話す内容に影響するというか単語の意味を決める
    • お前の単価は(高すぎる|適切|低すぎる)
    • 「我々は賢いので」
    • 「ぬるかるさん遅いですね」「あの子は最近帰ってくるの遅いから」「言い方が不良息子の母」
    • 名刺を渡そうとして名刺入れをズボンのポケットから取ったら勢い良く渡す相手のご飯の皿にダイブ。
    • 「Why did you think this idea?」
    • 「なんで髪伸ばしてるんですか」「地毛で女装するためです」
    • 「女装するとメイクスキルが上がって、顔を見るとどのくらい加工しているかが分かるようになる」
    • 超ハイテンションで帰ってきたぬるかるさん、10m歩いてクールダウンして真顔。
    • 「スピノザは良いぞ」
    • 「良く分かんねーことが発生すると神なんだよ」
    • 「聖書は自己言及もするし矛盾もしてる」「クソリプ対策みたいですね」
    • MessagePack の作者と遭遇して名刺交換。 Alice で採用していると伝える。
    • OC さんを知る者と遭遇する。世は狭い
    • 雑談していると思ったら妻帯者からの高度なのろけが飛んでくる
    • 「マイノリティに立っていきたい」「実際面倒が多い」
    • 「家って何?」
    • 君は(雑魚|普通の人|ヤバいやつ)
    • 「社交性発揮してきます」
    • 荷造り5分で東京駅に行ったら広島駅につける。4時間と2万円かかるけれど。飛行機か。
    • でも足元はゆったりで快適で読書が捗る
    • 「いやー酒が呑めるようになっちゃって」
    • 「若いっていつまで名乗って良いのですかね」「若くても老害はいる。逆もしかり。そういうことだ」
    • 唐突の「デカ外人クイーズ」
    • アメリカだと公園で飲酒は違法だったりする(ので日本で呑みに行くぜ)
    • 「Github という小さい会社で働いています」
    • データの可視化は重要だ……(メモリのフラグメンテーションを見ながら)
    • 「Type? Compile Time が無いなら Run Time で取れば良いじゃん(テスト動かしながら)」
    • 「あー草Tシャツの人ね」
    • 「今日一日で一生分の「うぇーい」を使った」
    • 超高速で便器の蓋が開くレゴ
    • 「やんちゃハウスは治安が悪い」「前は川沿いが治安悪かった」
    • 「論理やんちゃハウスと物理やんちゃハウスがある」
    • 「Typhoon season is very risky」
    • 寝不足だと眠い


    まとめ

    という感じで完全に祭り気分でした。実際そんな感じで過ごしてる人のが多かった印象。
    体力がゼロだったので観光はしなかったが、広島限定茶葉も買ってお好み焼きも食べて広島もちょっとエンジョイした。
    わいわいしてたなー。運営の皆様ありがとうございました。

    2017/08/31

    Rails 5.1 の form_with に remote: false を指定する時に気をつけること

    Rails で form を書いていて、「ここは非同期に ajax にしよう」となった時は form_for などに remote: true を渡すと実現できます。
    逆に、同期の POST にしようと思ったら明示的に remote: false とする訳ですが、 Rails 5.1 で form_with に remote: false を書いても POST にならない。
    調べてみると、local オプションというものになったようです
    加えてどうやらデフォルトが ajax の様子。ちょっと引っかかりました。

    とはいえ実態は data-remote に false を設定しているだけなので

    のどちらで書いても同期のPOSTリクエストになります。


    環境

    • macOS Sierra 10.12.6
    • ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
    • Rails 5.1.3


    参考

    2017/08/23

    MoneyForward Meetup vol.12(Cashless Talk Night) に行ってきた

    2017/08/22 に開催された MoneyForward Meetup vol.12(Cashless Talk Night) に行ってきました。
    東京に来てから始めてのイベント参加かな。

    MoneyForward のプレミアムユーザ + ヘビー(?)ユーザなのでどんな感じか軽く覗く程度の気持ちで行きました。
    現時点で14サービス連携していた。結構使ってる方に入るのかな。そうでも無いのかもしれない。

    Cashless の Cash は現金での支払いとかのことを指すようです。
    そもそもお金という概念がー、みたいな話が聞けたらと思っていたのは内緒。
    みんな現金についてどう考えていたり、どう Cashless 生活をしているのか、をお酒を飲みながらわいわい話そう、という会でした。
    そういう点では思想が近い人が多かったかな。
    現金面倒、とりあえずクレカで、みたいな。

    普段の meetup は tech な話もするようですが今回はどっちかと言えば意見交換メイン。
    グループワークで発表なんかもして学生気分していました。
    ちなみに発表は良かったと褒められました。わーい。お世辞かもしれないけれどね。

    VALU の話やビットコイン、Cash (写真取って査定できる方) とか Kyash、 Paymo とかの話が当然のように出ていて、流行を感じました。
    私としてはとりあえず全部触ったことはあるのかな?
    そういう意味では強烈に目新しいものは無かった。
    ただ、それにも意味はあると思っていて、最近の流行りを軽くは追えている根拠になる。
    流行りとかは場所の雰囲気で強烈に感じるものなので、感じ取れるだけ上々かな、と。

    Fintech って単語がありますが、私自身は tech だけの人間。
    話を聞くだけで帰るつもりでしたが、グループワークもあり、結構話した感があります。
    そういう意味では若干 Finance の方に足を突っ込んでたりするのだろうか。NISAとか開設したし。不労所得欲しい。
    私の情報源は MoneyForward のコラムだったりするので、中の人たちと話ができるのは当然と言えば当然かもしれない。

    でもやっぱりクラスタに違いはあって、アカウント名(あっとん)で参加登録しているのは私だけでした。みんな本名。
    名刺も渡したのですが、アカウント名義の名刺なので並べたら浮くはず。
    あとイベントの参加率は登録人数に対して少なかったのかな?
    とりあえず登録するだけする人がいる、みたいな話はTLで目にしたことはあるが実在していたのか。

    フリーランスになったので、イベントで営業とかするべきなのかもしれないけれど特にしなかったかな。
    軽く名刺渡す時にフリーランスですと名乗りはした。
    ちょっと愉快だったのが、受付で滞在時間などを書く紙があったて、その欄に所属会社が必須項目として存在していた。でも書けないので白紙で出した。
    あとは名刺交換していたら前職の人がいた。世の中は狭い……

    という感じで話をしながらただ飯を食べてきたのでした。ありがとう MoneyForward さん。ごちそうさまでした。

    2017/08/15

    GitHub のアカウント名を atton にしてもらった話

    GitHub のアカウント名は前々までは atton- だったのですが、atton-.github.io が URLとして認識されづらい問題があったので変更をお願いしてみました。

    GitHub には Name Squatting Policy なるものがあり、名前を取るのは早いもん勝ちだけれど流石に使ってない奴に名前を使われ続けるのも何なので、全然使われてないアカウントなら消してあげるよ、みたいなもののようです。

    参考にもあるようにテキトーに英文をちょちょっと書いて送る。
    実名も載せたのでここでは公開できませんが、

    • atton github で検索すると私が出る
    • 他のサービスでも私がだいたい atton として通っている
    と主張してみたらものの1時間くらいであっさり開放してくれました。
    その後は名前変更から atton に変更してしまっておしまい。
    ということで使いやすい atton.github.io が使えるようになりました。やったね。
    しかし、このブログから参照していたURLが404になる可能性もあるのでその辺りは補完して欲しいです。


    参考

    2017/07/31

    株式会社ドワンゴを退職します

    まさかこんなに早く退職エントリを書くとは。
    表題の通り、株式会社ドワンゴを退職します。

    いろいろと働くことについて考えることが増えたため、一旦辞めて整理をしようと思い、辞める流れとなりました。
    何度も相談にのってくれた上長、自分と長く話して思考の整理を手伝ってくれたメンターさん、これからの将来について相談してくれたmesoさん、仕切り直しを提案してくれた人事さんには感謝しています。
    これだと何か強制操作されて良いイメージだけ書くようにしてるみたいですが、そんなことはもちろん無いです。

    まー書けないような複雑な事情とかもあって、人生相談みたいなことをされたり、心配されたり、後押しされたり、無反応だったり、といろいろありました。
    そのあたりも含めて話をしてくださったみなさんには感謝しかありません。
    いろいろと考えた結果、一度はおもしろそうな方向にサイコロを振りたくなったのです。

    ということで宣伝をば。
    しばらくは東京でフリーランスのエンジニアとして活動していこうと思います。
    なので

    • リモートワークのお仕事を依頼したい
    • リモートワークのお仕事を一緒にやって欲しい
    • 社員として雇いたい
    • 養いたい
    といったことがあれば、おいしい御飯の奢りと一緒ならお話を伺います。
    ちなみに Rails とか書けます。その辺りのスキルは github.io にまとめてあります。

    色々とありますが、おもしろいことになれば良いな。の一言です。

    最後に、退職エントリ恒例の欲しいものリストを貼っておきます。
    この記事を書いた段階ではレビュー待ち状態なので無理ですが、 VALU で直接支援してくれても喜びます。


    それでは、ありがとうございました&これからもよろしくお願い致しします。

    2017/07/21

    Laravel 5.1 の quickstart を Laravel 5.4 で実行する

    Laravel には tutorial 的な quickstart があるのですが、ドキュメントは 5.1 までしか提供されていない。
    5.4 の tutorial 的なものは laracast という形で動画で提供されています。
    動画を見てコードを書くのが性に合わなかったので 5.4 で 5.1 の quickstart をやってみたログ。
    ちなみに作るものは所謂 TODO リストというやつで、よくチュートリアルで作るやつですね。
    index, create, delete があるだけ、って感じ。


    環境

    • Scientific Linux release 7.2 (Nitrogen)
    • PHP 5.6.30
    • Laravel 5.4.22
    • Apache httpd 2.4.26


    5.1 -> 5.4 変更点

    具体的な変更点は実は1つしかなくて、Routing の `app/Http/routes.php` の内容を `routes/web.php` に置くだけ。
    どうやら Laravel 5.4.22 は api/web/console/channel ごとに routes を分けられる構成になっているっぽい。
    書いてて思ったけれど割とモダン。
    OR-mapper も extends するだけて使えるタイプっぽいし。
    個人的には Routing 部分に処理が出てきたりするのは Sinatra っぽいな、と感じました。
    あと html template の名前が blade でかっこ良い。が、宿命的に書きづらい。
    ということで作った Repository はこちら。5.4 環境でも何ら問題無く動きます。



    Apache 2.4.26 で動かす

    Apache 2.4.26 で動かすためには `public` を DocumentRoot にする必要があります。
    例えば
    DocumentRoot "/home/atton/quickstart/public/"
    <Directory "/home/atton/quickstart/public/">
    とか。 permission もきちと整えておくこと。
    あと DirectoryIndex は index.php にしておいた方が良いかも。
    それと AllowOverride All と Requite all granted を書いておくこと必要があります。
    加えて LoadModule rewrite_module modules/mod_rewrite.so をコメントインしておく。
    .htaccess とかは Laravel が用意してくれるので問題無し。

    さらに言えば、使うDatabase が MySQL なら MySQL の PDO が必要なので ./configure の段階で
    • ./configure --with-openssl --with-zlib --enable-mbstring --enable-zip --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql
    とかしておく必要があります。つまり前記事の段階ではオプションが足りていなかったってことですね。
    ということで 5.1 の quickstart を 5.4 で動かしたログでした。


    参考

    2017/07/18

    ActiveLDAP が Timeout Module を使っていた

    かなり前の記事になりますが、ActiveLDAP が Process.fork を使っているせいで PostgreSQL との相性が悪いバグがありました。
    具体的には Timeout を指定すると fork したプロセスを使って Timeout を確認しているせいで pg の connection を使いはたしてしまう、というのが原因でした。

    本当に具合が悪い時は Ruby がコアダンプを吐いて死ぬ時もあったので、直してしまってRuby会議2017のLTネタ にでもしようと思って調査を続行。
    最新版では再現しないのでソースを読んでみたらそもそも Process.fork をしていない。
    Timeout というものに block を渡している
    なんと Timeout なる Module があるようで、それに時間の処理を一任しているようです。

    Timeout Module 知らなかった。
    Timeout の処理って面倒なので自分が次に Timeout の処理を書くことがあったら使おうと思いましたまる。
    ソース読むのはおもしろかったけれどネタが無くなってしまったな。どうしようかな。

    2017/07/13

    Scientific Linux 7 に NeoVim を入れる

    これまたタイトル通りの作業ログ。
    CheckHealth が通る NeoVim にプラグインを入れるまで。

    環境

    • Scientific Linux release 7.3 (Nitrogen)
    • NeoVim 0.1.7


    インストール方法

    NeoVim 公式ドキュメントを見るとどうやら epel から入れられるっぽい?
    • # yum -y install epel-release
    • # curl -o /etc/yum.repos.d/dperson-neovim-epel-7.repo https://copr.fedorainfracloud.org/coprs/dperson/neovim/repo/epel-7/dperson-neovim-epel-7.repo
    • # yum install --enablerepo=epel jemalloc
    • # yum -y install neovim
    で NeoVim 0.1.7 が入った。


    CheckHealth を通す

    どうせなので CheckHealth が通るように gem とかを入れる。
    • # yum --enablerepo=epel install -y python-neovim msgpack msgpack-devel ruby ruby-devel python2 python2-devel python34 python34-devel python34-pip
    • # gem install neovim
    • # easy_install pip
    • # pip install neovim
    • # pip3 install neovim
    これで CheckHealth で怒られなくなった。


    dein.vim を入れる

    NeoVim に移った際にプラグインマネージャを dein に変更したのでそれのインストールも。公式の通り
    • $ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
    • $ sh ./installer.sh ~/.config/nvim
    としておしまい。
    あとは :call dein#install() として他のプラグインをインストールして環境構築完了、と。

    2017/07/12

    PHP 5.6.30 + Laravel 5.4 の環境を整える

    タイトル通りな環境を作った時のログ。


    環境

    • Scientific Linux release 7.2 (Nitrogen)
    • composer 1.4.2
    • PHP 5.6.30
    • Laravel 5.4


    PHP の再ビルド

    最初からネタバレ全開でいくと、前回入れたPHPでは Laravel は動きません。
    openssl や zlib や mbstring や zip が必要らしい。なので正解な最小の config は
    • ./configure --with-openssl --with-zlib --enable-mbstring --enable-zip --with-apxs2=/usr/local/apache2/bin/apxs
    っぽい。こいつで再 make + make install



    Composer を入れる

    Laravel 公式の Installation を見ると composer という package manager を使うと良いらしい。
    書かれている通りに
    • $ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    • $ php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
    • $ php composer-setup.php
    • $ php -r "unlink('composer-setup.php');"
    とすると composer.phar なるファイルが直下にできる。
    これが package manager の実行ファイルっぽい。
    適当な場所に放置して大丈夫かと思っていたら /usr/local/bin とかに置くと良いっぽい。
    • # mv composer.phar /usr/local/bin/composer
    これで package manager が入った。


    Laravel を入れる

    composer が入ったのであとは
    • $ composer global require "laravel/installer"
    する。
    ログに "Changed current directory to /home/atton/.config/composer" とか出ているので config は $HOME/.config/composer あたりに書かれるらしい。
    その下を漁ってみると .config/composer/vendor/bin に laravel があるのを発見したので
    • export PATH=$HOME/.config/composer/vendor/bin:$PATH 
    とかして PATH に追加。これで laravel が使えるようになった。試しに
    • $ laravel new blog
    すると blog が生成されたので動いているっぽい。


    参考

    Apache Solr 6.6 を Scientific Linux 7.2 にインストールする

    表題の通り。インストールしたログです。あとちょっと遊んだログ。


    環境

    • Scientific Linux release 7.2 (Nitrogen)
    • Apache Solr 6.6


    インストール

    • # yum install -y java
    • # wget http://ftp.jaist.ac.jp/pub/apache/lucene/solr/6.6.0/solr-6.6.0.tgz
    • # tar xzf solr-6.6.0.tgz
    • # solr-6.6.0/bin/install_solr_service.sh solr-6.6.0.tgz
    でおしまい。service にも systemctl にも登録されている。便利。


    チュートリアル

    QuickStart が用意されているので遊んでみる。
    xml とか json とかのデータを食わせることができて、それらを検索できるっぽいです。
    • # systemctl start solr
    しておいて
    • $ /opt/solr/bin/solr create -c gettingstarted
    とかでコレクションを作る。コレクションに情報を集約する感じかな。
    ちなみに root で bin/solr create とかすると怒られる。
    su - solr するとデータのディレクトリとかがあるので、ここにデータが入るのだろう。

    QuickStart を参考に
    • /opt/solr/bin/post -c gettingstarted /opt/solr/docs
    • /opt/solr/bin/post -c gettingstarted example/exampledocs/*.xml
    • /opt/solr/bin/post -c gettingstarted example/exampledocs/books.json
    • /opt/solr/bin/post -c gettingstarted example/exampledocs/books.csv
    とかでデータを食わせる。食わせたデータは RESTful に検索できるとのこと。

    ということでいろいろと検索してみる。
    • $ curl "http://localhost:8983/solr/gettingstarted/select?indent=on&q=*:*&wt=json"
      • でとりあえず何にでもマッチするクエリを投げる
      • 検索は key:value ってフォーマットらしい
      • なので *:* はなんでもマッチする感じですね
    • $ curl "http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=foundation"
      • で "foundation" を含むデータを探す。
      • 返ってくるデータの形式は json
      • たぶん json 以外にも対応している
    • $ curl "http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=foundation&fl=id"
      • 返すフィールドを id のみに制限。
      • fl が field の略か。
    とかとかいろいろあるらしい。

    ブラウザからもアクセス可能でその場合はデフォルトだと 8983 番で listen している。
    マルチバイト文字の扱いが地味に気になるがその辺りも対応しているのなら便利そうだ。
    でも始めて聞いたな Solr 。界隈では有名なのだろうか。


    参考

    2017/07/07

    Redis 3.2.x を ScientificLinux 7 に入れる

    表題の通り。


    環境

    • Scientific Linux release 7.2 (Nitrogen)
    • Redis: 3.2.9


    インストール

    • # wget http://download.redis.io/releases/redis-3.2.9.tar.gz
    • # tar xzf redis-3.2.9.tar.gz
    • # cd redis-3.2.9
    • # cat INSTALL
      • see README とある
    • # make
      • いきなり make で良いらしい
      • あと make test してね、と
    • # make test
      • tcl が無いとテストしてくれないらしい。
    • # yum install -y tcl
    • # make test
      • 通った
    • # make install
      • /usr/local/bin/redis-server とかに入っている。
      • redis-cli が  client かな


    systemd 管理下に置く

    どうやら init.d 用のスクリプトはあるらしいが systemd の unit  は無いっぽい。
    それはともあれ install_server.sh があるので設定くらいは置いて欲しいので実行


    service は当然無いので abort したが /etc/redis/6397.conf とかは作ってくれた。
    作られた conf を適当なところに置いて service ファイルを書く。

    • # mv /etc/redis/6397.conf /etc/redis.conf
    • # rm -rf /etc/redis
    • # vi /usr/lib/systemd/system/redis.service
    • # systemctl daemon-reload
    • # systemctl start redis
    で動いた。
    ちなみに --daemonize no を消すと起動してくれなかった。


    参考

    MySQL 5.7.x を rpm から入れる

    タイトルの通り。MySQL 5.7 系の最新版を rpm から入れます。


    環境

    • Scientific Linux release 7.2 (Nitrogen)
    • mysql-5.7.18


    インストール方法

    今回は結構シンプルで、公式 が rpm を提供しています。
    今回必要なのは mysql-client と mysql-server なので、この二つとその依存先を入れます。
    rpm -i した時に依存先が無いよって怒ってくるので、そのあたりを察すると良いです。
    • $ wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar
    • $ tar xf mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar
    • # rpm -i mysql-community-common-5.7.18-1.el7.x86_64.rpm
    • # rpm -i mysql-community-libs-5.7.18-1.el7.x86_64.rpm
    • # rpm -i mysql-community-client-5.7.18-1.el7.x86_64.rpm
    • # rpm -i mysql-community-server-5.7.18-1.el7.x86_64.rpm
    くらいで。


    MySQL を使う

    まずは起動。 systemd 登録とかしてくれるので楽だ。
    • # systemctl start mysql
    公式によれば
    • # grep 'temporary password' /var/log/mysqld.log
    すれば temporary password があるのでそれを使ってログインしろ、と
    • # mysql -u root -p
    先程 grep したパスワードを入れてログイン。パスワード変更のために
    • mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'hogehoge';
    とかする。結構パスワード強度に厳しい。
    これで MySQL 5.7.x が使えるようになった。
    チュートリアルとかも充実しているのでサポート強い。


    参考