某所で書いたけど、パーマリンク付きの世界にコピペ。

平気な顔をする

なんか、厳しい戦いや、高度な動きが求められることはあると思し、自尊心や承認がポッキリいく場面も増えるだろうけど、基本平気な顔をしていく。失敗もするだろうが表に出さないし、成功しても表向きは淡々としたい。

クリティカルセクションに走りこむ

「見えている」けど「ハードな」クリティカルセクションに走りこんでシュートを打っていく。

「見えていない」ものはまだあるだろが、「見えている」範囲でもまだ十分できていない。まず、本来ならできるレベルの動きは全部できるようにする。

引いて打つことをもっと上手になる

自分でやってしまうと周りが動かなくなるのが加速する立場になった。ということで、譲る、一歩引く、思い切って黙る、場合により答えを言わない、などの寝技引き技を身に付ける。自分の小さな成果にこだわらず、絶大なバーンを今年は2、3回と考える。

でももちろん、どうしようもない時はまだ前線で戦えるよう方は暖めておく。見極めは、難しいが頑張る。

要するにローラーではなくチャージャーで戦えるようになる。


あ、今年はスプラトゥーンの例えを多くしていくので何卒

bootsnapといえば最近のレイルズでデフォルトでGemfileに書かれることで有名になりましたが、Rubyアプリケーション一般に活用できます。

Lokkaの場合とてもシンプルで、まずGemfileに一行追記してbundleします

--- a/Gemfile
+++ b/Gemfile
@@ -45,6 +45,7 @@ gem 'mimemagic'                                                    
 Dir["public/plugin/lokka-*/Gemfile"].each {|path| eval(open(path) {|f| f.read }) }

 group :production do
+  gem 'bootsnap'                                                                    
   gem 'puma'
   gem 'dm-mysql-adapter', '1.2.0'
 end

あとは公式に書いてある通り、Lokkaで最初に読み込まれる init.rbBundler.setup 直後に設定を書いておけばOKです。

--- a/init.rb                                                       
+++ b/init.rb                                                       
@@ -4,5 +4,18 @@ $:.unshift File.join(File.dirname(__FILE__), 'lib')
 require 'rubygems'                                                 
 require 'bundler'                                                  
 Bundler.setup                                                      
+                                                                   
+require 'bootsnap'                                                 
+env = ENV['RACK_ENV'] || ENV['RAILS_ENV'] || "development"         
+Bootsnap.setup(                                                    
+  cache_dir:            'tmp/cache',                               
+  development_mode:     env == 'development',                      
+  load_path_cache:      true,                                      
+  autoload_paths_cache: true,                                      
+  disable_trace:        true,                                      
+  compile_cache_iseq:   true,                                      
+  compile_cache_yaml:   true                                       
+)                                                                  
+                                                                   
 require 'lokka'                                                    
 I18n.reload!

本サイトのLokkaにも適用してみました。どうでしょうか?

2017年に行ってきたことを振り返ってみると。

コミュニティ

その他地方での試合中心に何本か。 Speakerdeckを眺めると コンテナ関連の発表を今年 12本 行ったようだ。月刊コンテナ太郎だ。RubyKaigi 2017では結局喋れなかったが、福岡を飛び出してとにかく絞り出すようにアウトプットを続けていた。

一つのテーマでここまで徹底的にアウトプットするのは振り返るととても良いことのように思う。自分自身ではワンパターンに陥っているのでは?? と恐れることもあったが、通して眺めてみると一定の進化というか、ちゃんと議論が深まっている側面も読み取れるのでこういうことはやるべきだなあと思った。

Linuxコンテナというものが、ここまでいろいろな思惑の飛び交う分野になってくるとは、Haconiwaを思いついた時にはあまり考えていなかったりもしたのだけれど、まあHaconiwaのおかげで普通にコンテナを使っている人よりは若干(ほんの若干ね?)視野角広く界隈を眺めることができて、面白い時代に関われているなあと思うことはある。Haconiwaがこうなったのも、同僚を始め様々なツッコミをくれた皆さんのおかげである。

あとは、コミュニティ関係では何より福岡Ruby会議02をやっていったが、昨日話した通り。

お仕事

お仕事ではやはり、先日β版となったロリポップ!マネージドクラウドにがっぷり四つで取り組んだことを挙げなければなるまい。

このサービスは、去年縁あって関わったSqaleで感じた様々な思いを乗っけることができたり、自作の技術がなぜかコアコンピンタンス風なところとして新しいサービスに組み込まれるのを体験したり、メンバーにやたら優秀な若手が多くひたすら刺激を受けたり、いろいろ思うところが多い。いやしくも10年近く自作サービスの開発や運用に関わらせてもらっているが、その中でも初めての経験ばかりとなるサービスであったし、これからもまだまだそうであるような予感がしている。

何より、 @matsumotory との粘り強い仕事の成果でもあるので、非常にエモい。

来年以降ももっとやばい感じにするべく関わっていくし、やばい感じにしていかねばとも思う。

もう一つ印象に残ったのは、9月に福岡支社で初めて実施したインターンで、先日ブログを書いてくださったちくわさんを始め優秀な学生さんと関われたし、インターンで知り合ったzuminさんに福岡Ruby会議02でボランティアスタッフをしてくださった学生さんを紹介してもらうなど、面白いつながりができるきっかけとなってよかった。

2017年がどういう年であったか

2015年末に僕は所属企業のエンジニア職位制度の、昇格プロセスに落ちた。そして、翌年から @matsumotory がぼく達の上の職位に就くことになった。

その翌年、Haconiwaのコアアイデアを思いつき、その勢いでRubyKaigiにスピーカーデビューを果たした。

Haconiwaのアイデアを最初に社のSlackで話した時、 @matsumotory に、「で、どういうところが新しいの? どうしてこのソフトウェアを作って、どういう風に育てたいの? 既存のコンテナとどう使い分ける、あるいはどう勝っていくの?」と質問されたのを、同じく同僚であるmonochromeganeさんの振り返りを読んで思い出した。

僕はその時まで、オープンソースソフトウェア - OSSは好きであったけれど、なんとなく盆栽の自慢的な、自分のアイデアを形にしてクールなハックをしたと、悦に入るためであるような側面を、重視してしまっていたような気がしている。なのでこの質問には正直面食らったのであった。

OSSを武器にして、育て上げて未知の未解決の問題に取り組んでいくこと(それが新規性だ)。そういう発想を持っていなかったのである。それから、 @matsumotory の胸を借りるように、たくさんの議論、指摘、ツッコミ、時には叱咤激励を受け、Haconiwaのアイデアを練り上げ、FastContainerの発想にほんの少しだけ貢献し、それらを実現して大きな問題を解決するにはどうすればいいか考え、考え抜くということを繰り返してきた。

そういう中で、なんとなくわかってきたことは、自分は今までそれなりに満足して、会社や界隈のそれなりのレベルを保ちながら楽しくコードを書き、アウトプットをしてきた、そういうのを続けていたように思えてきて、で、それは本当に良かったのかなあということだ。それで、 ちゃんと自分で自分を、自分の人生の主人公にできていたか? と思った。

@matsumotory は間違い無く、自分で自分の人生の主人公を生きている。少なくとも彼が世界で為すべき仕事のために、全力投球をして、そういう物語を生き抜く覚悟を背負っている。2年と少し、ここまで近い距離で一緒に仕事をしてきて、見えたことである。

また、 WSA研の開催概要 を眺めて、自分には、このレベルまで自分のエンジニアとしての人生を掛けて取り組むべきテーマがあるのだろうか、もしここでLinuxコンテナの話をしてちゃんとcompetitiveに議論をすることができるのだろうか? と思ったりもした。

僕はどうしてソフトウェアを書いてものづくりをしているのかというと、自分にはものづくりでしかこの世の中にコミットができないんじゃないかと思っているからだ。けれど、それはわかった、で、「世の中へのコミット」はいいけれど、自分としては何をコミットしたいの? そういうことを考えるようになった。

2017年は、それまでの2年間と比べて、自分が主人公としてコマ割りされているかな? と思う瞬間が多めであったように思う(なお、これは少し自画自賛を含んでいる)。主人公になるには、主人公に戻ってくるにはどうすればいいか来年も考え抜きたい。

おまけ

読み返してみると、ほとんど松本さんへのラブレターになっていてあまりにも恥ずかしいじゃないか!!!!1

2017年に食べた福岡飯振り返りでこの記事を締めさせていただきます。

続きを読む。

公式に書く予定もありますが、なんとなく下書きしてみます。

手始めに公式のプロジェクト lokka/lokka をチェックアウトして、手元で以下のパッチを当てていきます。

Pumaで動くようにする

ついでにdm-postgres-adapterに依存してしまうことも防いどきます。

diff --git a/Gemfile b/Gemfile
index 78cfcd7..9fc2fdc 100644
--- a/Gemfile
+++ b/Gemfile
@@ -45,6 +45,8 @@ gem 'mimemagic'
 Dir["public/plugin/lokka-*/Gemfile"].each {|path| eval(open(path) {|f| f.read }) }

 group :production do
+  gem 'puma'
+  gem 'dm-mysql-adapter', '1.2.0'
 end

 group :development, :test do
@@ -65,9 +67,5 @@ group :test do
 end

 group :mysql do
-  gem 'dm-mysql-adapter', '1.2.0'
-end
-
-group :postgresql do
-  gem 'dm-postgres-adapter', '1.2.0'
+  # gem 'dm-mysql-adapter', '1.2.0'
 end

これで bundle install してGemfile.lockさんも更新してコミット。

dummyの bin/rails を作る

起動コマンドが bin/rails server -e production -p 80 になるので、そのコマンドをrackupにリダイレクトするようなシェルスクリプトを置いて chmod a+x しておく。一緒に、各種環境変数を調整しておくと吉。

こーゆー感じです。

#!/bin/bash
# mode: shell

export LANG="ja_JP.UTF-8"
export TZ="Asia/Tokyo"
export RUBYOPT="--encoding=UTF-8:UTF-8"

if test -f /var/app/.env; then
  source /var/app/.env
fi

case "$1" in
  server)
    export RACK_ENV=production
    cd /var/app/current
    exec bundle exec rackup -s Puma --port 80
    ;;
esac

database.yml を作る

DATABASE_URL を認識するようにする。デフォルトでgitignoreされているのでgit add -fなりで強制追加する。

development:
  dsn: sqlite3://<%= root %>/db/development.sqlite3
test:
  dsn: <%= ENV['DATABASE_URL'] || "sqlite3://#{root}/db/test.sqlite3" %>
production:
  dsn: "<%= ENV['DATABASE_URL'] %>"

seed fileをちょこっと直す

puts が、うまく標準出力をつかまないようで、動かない。 $stderr.puts ならいいのかもしれないし、きっといずれマネクラ側で対応します...。

diff --git a/db/seeds.rb b/db/seeds.rb
index 1137f63..9021a38 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -5,33 +5,33 @@ Site.create!(:title => "Test Site",
              :dashboard => %q(<p>Welcome to Lokka!</p><p>To post a new article, choose "<a href=""/admin/posts/new"">New</a>" under "Posts" on the menu to the left. To change the title of the site, cho
ose "Settings" on the menu to the left. (The words displayed here can be changed anytime through the "<a href=""/admin/site/edit"">Settings</a>" screen.)</p>),
              :theme => "jarvi",
              :created_at => created_at,
-             :updated_at => updated_at) && puts("site was successfully created") if Site.all.blank?
+             :updated_at => updated_at) if Site.all.blank?

 User.create!(:name => "test",
              :hashed_password => "6338db2314bba79531444996b780fa7036480733",
              :salt => "2Z4H4DzATC",
              :permission_level => 1,
              :created_at => created_at,
-             :updated_at => updated_at) && puts("user was successfully created") if User.all.blank?
+             :updated_at => updated_at) if User.all.blank?

 Entry.create!(:user_id => 1,
               :title => "Test Post",
               :body => "<p>Welcome to Lokka!</p><p><a href=""/admin/"">Admin login</a> (user / password : test / test)</p>",
               :type => "Post",
               :created_at => created_at,
-              :updated_at => updated_at) && puts("entry was successfully created") if Entry.all.blank?
+              :updated_at => updated_at) if Entry.all.blank?

 Snippet.create!(:id => 1,
                 :name => "Test Snippet",
                 :body => "Text for test snippet.",
                 :created_at => created_at,
-                :updated_at => updated_at) && puts("snippett was successfully created") if Snippet.all.blank?
+                :updated_at => updated_at) if Snippet.all.blank?

 Tag.create!(:id => 1,
-            :name => "lokka") && puts("tag was successfully created") if Tag.all.blank?
+            :name => "lokka") if Tag.all.blank?

 Tagging.create!(:id => 1,
                 :taggable_id => 1,
                 :taggable_type => "Entry",
                 :tag_context => "tags",
-                :tag_id => 1) && puts("tagging was successfully created") if Tagging.all.blank?
+                :tag_id => 1) if Tagging.all.blank?

テーマの中で変な挙動をする点をなおす

具体的には多重エスケープや、フォームオブジェクトに必要な変数がないなどある。

diff --git a/public/theme/jarvi/entry.erb b/public/theme/jarvi/entry.erb
index 54b198d..1fae1b7 100644
--- a/public/theme/jarvi/entry.erb
+++ b/public/theme/jarvi/entry.erb
@@ -3,7 +3,7 @@
     <h2 class="title"><a href="<%= url(@entry.link) %>"><%= @entry.title %></a></h2>
   </div>
   <div class="body">
-    <%= @entry.body %>
+    <%= @entry.body.html_safe %>
   </div>
   <div class="footer">
     <div class="created_at"><%= l(@entry.created_at, :format => :long) %></div>

diff --git a/public/theme/jarvi_mobile/entry.erb b/public/theme/jarvi_mobile/entry.erb
index b467749..10e4989 100644
--- a/public/theme/jarvi_mobile/entry.erb
+++ b/public/theme/jarvi_mobile/entry.erb
@@ -8,7 +8,7 @@
 </div>
   </div>
   <div class="body">
-    <%= @entry.body %>
+    <%= @entry.body.html_safe %>
   </div>
 <% if logged_in? %>
     <p><a href="<%= url(@entry.edit_link) %>"><%= t('edit') %></a></p>
@@ -36,6 +36,7 @@
   <% end %>

   <div class="form">
+    <%  @comment = Comment.new %>
     <%= comment_form %>
   </div>
 </div>

これは本家にプルリクしたい気持ちもありつつ、お待ちください。

パワードバイロリポップにする

みんな頼む!!1

diff --git a/public/theme/jarvi/layout.erb b/public/theme/jarvi/layout.erb
index f927f30..87a67c1 100644
--- a/public/theme/jarvi/layout.erb
+++ b/public/theme/jarvi/layout.erb
@@ -50,7 +50,7 @@
     </div>
     <div id="footer">
       <div class="copy"><%= link_to @site.title, url('/') %></div>
-      <div class="poweredby wide">powered by <%= link_to 'Lokka', 'http://lokka.org' %></div>
+      <div class="poweredby wide">powered by <%= link_to 'Lokka', 'http://lokka.org' %> && <%= link_to 'ロリポップ!マネージドクラウド', 'https://mc.lolipop.jp/' %></div>
     </div>
     <%= footer %>
   </body>

diff --git a/public/theme/jarvi_mobile/layout.erb b/public/theme/jarvi_mobile/layout.erb
index 551161a..b104cdf 100644
--- a/public/theme/jarvi_mobile/layout.erb
+++ b/public/theme/jarvi_mobile/layout.erb
@@ -80,6 +80,7 @@
     <div id="footer">
       <div class="copy"><a href="<%= url('/') %>"><%= @site.title %></a></div>
       <div class="poweredby">powered by <a href="http://lokka.org/">Lokka</a></div>
+      <div class="poweredby">...and <a href="https://mc.lolipop.jp/">ロリポップ!マネージドクラウド</a></div>
       <div class="switch"><a href="?theme=pc">PC Theme</a></div>
     </div>
     <%= footer %>

上記について、一通りコミットしてpush可能にする。

以下は、マネージドクラウドにsshログインして実施。

ビルドスクリプトをカスタマイズする

/var/app/user_command.sh というファイルが存在すると、 git push の時のビルドコマンドを置き換えることができるのである。

以下のようなファイルを作る。

#!/bin/sh

export NOKOGIRI_USE_SYSTEM_LIBRARIES=1
export RAILS_ENV=production
export RACK_ENV=production

bundle install --deployment --without development,test --path vendor/bundle
# 管理画面とにらめっこして頑張って組み立ててくれ!!1
export DATABASE_URL="mysql://special-tenjin-3563_XXXXX:Y0ur_Password@mysql-1.mc.lolipop.lan/special-tenjin-3563_YYYYY"
bundle exec rake db:setup

echo 'export DATABASE_URL="mysql://special-tenjin-3563_XXXXX:Y0ur_Password@mysql-1.mc.lolipop.lan/special-tenjin-3563_YYYYY"' > /var/app/.env

あとは git push lolipop master する

ビルド成功まで待つ。


これで、 https://youahosu.lolipop.io/ にアクセッすると、やや待ってからのち、Lokkaのデフォルトの画面が上がると思うので、管理画面に入ってユーザパスワードを変更し、あとは普通に更新してください。

こういうノリで、 sinatra や hanami のアプリケーションも本当は動くとおもいます。

何かあれば、取り急ぎ、ツイラーでリプライください。

Enjoy!!1

頑張って対応しています :bow:

Recent Entries