思考実験室

日々のつれづれ

『nginx実践ガイド』をもとに、Vagrantとnginxを使った開発環境を作成してみる

めっきりミドルウェア、サーバーサイドをやらなくなった(そして苦手でもある)ので、連休を利用してnginxを触っています。
Dockerでやるのが今のトレンドなんだろうとは思うのだけれど、confを設定したり、hostsを編集したりと考えたときに、わかりやすくLinux(CentOS)を弄るほうが楽そうということでVagrantを採用して、そのうえにnginxを立ててみます。
というのを、以下の書籍をもとに手を動かしている最中です。

nginx実践ガイド impress top gearシリーズ

nginx実践ガイド impress top gearシリーズ

本書では刊行が2017年ということもあり、一部記述に古いところがあります。本記事では触れませんが、たとえばRubyGemsのjekyllは、Rubyのバージョンが2.4以上をサポートの対象とするため、デフォルトでインストールされているRubyは削除し、バージョンを2.4以上にすべきなどです(LTSを考慮すれば、2.6か2.7ぐらいが妥当かと)。
nginxを触るのが初めてということもあり、個人メモとしてまとめておくこととします。


VagrantおよびVirtualBoxのホスト側で使用するバージョンを確認

まずは公式サイトより、VagrantVirtualBoxを入手しておいてください。

www.vagrantup.com

www.virtualbox.org

なお私は以下のバージョンで実行しました。

$ vagrant -v
Vagrant 2.2.6
$ VBoxManage -v
6.0.4r128413

Vagrantfileを作成

その後、Vagrantを実行して仮想環境を作成していきます。
まずは任意のディレクトリに移動し、 vagrant init コマンドを実行していきます。

すると、カレントディレクトリに Vagrantfile が作成されているはずです。

次に、テキストエディタにて、Vagrantfileを編集していきます。
設定内容が英語で書かれていますが、一旦はコピペでOK。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  # 使用するBOXはCentOS7
  config.vm.box = "centos/7"
  
  # プライベートネットワークを作成する
  config.vm.network "private_network", ip: "192.168.33.10"

  # 共有するディレクトリがあれば追記(今はまだないのでコメントアウト)
  # config.vm.synced_folder "../data", "/vagrant_data"

  # VirtualBoxに割り当てる設定
  config.vm.provider "virtualbox" do |vb|
    # Display the VirtualBox GUI when booting the machine
     #vb.gui = true
  
     # Customize the amount of memory on the VM:
     vb.memory = "4096"
  end

  # rootユーザーにて、provision実行時に実行されるSHELL
  config.vm.provision "shell", inline: <<-SHELL
    # 一応実行しとこう
    yum -y update
  SHELL
end

nginxおよびその他パッケージをインストール

# selinuxの無効化
$ sudo vi /etc/selinux/config
# SELINUX=disable に設定

# 便利パッケージらしいので予めインストールしておきます
# yum updateでインストール済みかも
$ sudo yum -y install yum-utils

# nginxリポジトリを追加
$ sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# nginxをインストール
$ sudo yum install -y nginx

# ファイアウォールの設定
# firewallを起動
$ sudo systemctl start firewalld

# httpサービスを開放
$ sudo firewall-cmd --add-service http
$ sudo firewall-cmd --add-service http --permanent

# nginxの起動
sudo systemctl start nginx

nginxがブラウザから起動しているか確認する

以下にアクセス、Welcome to nginx! が確認できればOK

http://192.168.33.10


virtualhostを設定して、特定のドメインにアクセスしても表示されることを確認する

開発を行っていく際、 192.168.33.10 に毎度アクセスするのはなんか格好わるいので、virtualhostを設定して、それっぽく特定のドメインにアクセスした際に、設定したものが正しく表示されることを確認します。まずは表示用のファイル類やドキュメントルートのパーミッションなどを変更しておきます。

# sampleというディレクトリを作成
$ sudo mkdir /var/www/html/sample

# nginxユーザーにも読み取り・実行権限を与えるため、755としておく
$ sudo chmod -R 755 /var/www/html/sample

# HTMLファイルを作成する
$ sudo mkdir /var/www/html/sample/index.html
# sudo vi /var/www/html/sample/index.html

基本的には空でもよいですが、例のごとくHello, worldを表示できるようにファイルを用意しておきます。

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <h1>Hello, world</h1>
  </body>
<html>

次に、nginxの設定ファイルを編集していきます。Apacheと同じく、 conf.d 配下に設定を追加していくことができます。

# ログ出力用ディレクトリを作成
$ sudo mkdir /var/log/nginx/sample

# viにてnginxの設定を編集
$ sudo vi /etc/nginx/conf.d/sample.conf
# /etc/nginx/conf.d/sample.conf
server {
    listen       80;
    server_name  sample.com;

    access_log  /var/log/nginx/sample/access_log;
    error_log   /var/log/nginx/sample/error_log;

    location / {
        root   /var/www/html/sample;
        index  index.html index.htm;
    }
}

なお、access_logerror_log/var/log/nginx/sample 配下に設定しましたが、権限は777に変更しておきましょう。

$ sudo chmod -R 777 /var/log/nginx/sample

最後にホストマシンのhostsを変更します。
windos、macそれぞれあるのですが、Macの場合は以下の手順とします。

$ sudo vi /etc/hosts
# 以下をhostsに追加
# 192.168.33.10     sample.com

そして、 http://sample.com にアクセスして、Hello, world が出力されていれば成功です!お疲れさまでした!!


Apacheなどのミドルウェアを少しかじっていれば、nginxもそこまで難しくないのかなと思いました。記述が古くて、yumれないとかあるので、ググリ力が試されますが、仮想環境を触って自分で開発環境を作ってみるのも楽しいと思います。何よりLinuxに少しは強くなれるので、時間をみつけてはこういったことをやっていきたいと思います。

RubyでサクッとCGI

Websocketを使って簡単なチャットを作ってみたい。とりあえず、どこかのサーバにリクエストを送ったらws / wss プロトコルで返ってくればいいはず。 Webscoketでも使用するポートは同じなので、まずは素のHTMLを返す処理を作ってあげます。 以下の Vagrantfile を用意します。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.6"
  config.vm.network "private_network", ip: "192.168.33.10"

  # Apacheにて権限を変更しておかないと実行ができない
  config.vm.synced_folder "./cgi","/home/cgi-resources", mount_options: ['dmode=755','fmode=755']
end

ホストOS側では以下を実行します。

# cgi用のリソースを置くために用意しておく
$ mkdir cgi

# Vagrantを実行
$ vagrant up --provision

起動が完了したら、 vagrant ssh コマンドで、リモートホストにアクセスし、apacherubyをインストールする。
そもそも論では、インラインシェルで書くべきで、rubyも2.0しかインストールされませんが、確認用なのであまり気にせずやっていきましょう。

$ yum -y install httpd
$ systemctl enable httpd.service
$ sudo yum -y intall ruby

/etc/httpd/conf/httpd.conf を確認すると

# Supplemental configuration
#
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf

とあるように、apache/etc/httpd/conf.d 配下に、拡張子 .conf を設定したファイルを配置すれば、 httpd.conf を直接いじる必要はないです。

cgi-setting.conf

Alias /cgi home/cgi-resources
<Directory "home/cgi-resources">
  Require all granted
  Options +ExecCGI
  AddHandler cgi-script .rb
</Directory>

もちろん、 sudo systemctl restart httpd を忘れずに。 そして最後にrubyファイルを設置します。

home/cgi-resources/hello.rb

#!/bin/ruby

print "Content-type: text/html\n\n"
print "<html>"
print "<body><h1>Hello, cgi</h1><h2>this is ruby</h2></body>"
print "</html>"

http://192.168.33.10/cgi/hello.rb にアクセスすると、先ほどの記載した内容が表示されるはずです。

覚えたこと

  • /etc/httpd/conf.d/*.conf を追加すると、 httpd.conf を直接編集せずとも設定の追加ができる
  • RubyCGI処理は意外とハマる、こういうときのphpはめっちゃ楽

流行りに乗ることとリモートワークの風潮

波に乗ろう、それが流行りの病でも

コロナウイルスの影響もあり、私が務めている会社でも手始めに時差出勤が始まりました。東京五輪に向けリモートワーク自体はもともと検討はしていましたが、いよいよ影響が甚大になりそうという「予想」から、本格的にリモートワークについて検討を行っているようです。リモートワークの是非については問いません。会社で仕事をしたほうが集中できる人もいるし、逆に家で仕事することを許可してもらうと非常に助かるという方の理由もわかります。なので、働き方の一つとしてリモートワークが選択肢に上がることは良いことだと思います。

幸か不幸か、コロナウイルスという流行りの病がリモートワークや時差出勤を推し進めたようなきらいがあります。会社がなぜリモートワークを推し進めたのかについて意識的に、あるいは無自覚に推し進めている理由を類推して言語化しておき、頭の中にあるモヤモヤを吐き出しておきたいと思います。

流行りだからやる

まず、「流行りだからやる」という傾向について。大きな会社が次第にリモートワークを検討だけでなく実施にまで動いていることから、それが大きなうねりとなってリモートワークの拡大になっているような気がします。それと同時に、リモートワークをやっていないことそれ自体がリスクであるというような、同質性という日本の気質を象徴するようなそれが、リモートワークを加速させているように思います。

それは意識的に、乗らなきゃ損

一方でこうした流行り病に乗っかって、既成事実を打ち上げて就業規則は後付で変えればいい、という動きもあるかと思います。リモートワークをしたいと思っており、超えるべきハードルが高くてなかなかに重い腰を動かしたのは、「まずはやってみて」というアクション。全体の空気から乗っておこうという意思決定。それが良い悪いではなく、会社や団体といった組織体は、自身を縛る法に、例えば就業規則によって縛られているため制度を変えて運用までのアクションに時間を有しますが、流行りに乗り一足飛びで行動して後付けで制度を整えることでこれを乗り越えよう。このように考えていた企業も多いのではないかと考えます。砕けた言葉で言うならば、「乗るっきゃない、このビッグウェーブに…!」。

まとめ

結局のところ、以下の理由でリモートワークへの動きが出てきているのではないかと考えます。

  • リモートワークが流行り出したのは、他の企業がやりだしたから
  • リモートワークをやっていないことによるリスクが大きいから
  • 緊急事態を利用して、制度の整備よりも先に実体を変えてしまう
  • 古い制度をかえるきっかけとなった

しかし一方でこの考え方はリスクもあり、例えば他の企業がやらないのでやらない、緊急事態を利用して実体を変えてしまい制度を形骸化させるといったことが考えられます。例えばC・シュミット曰く「例外状態」といった、権威主義への回帰であるし、イノベーションとはなりえない横並び主義を現前化させたことにほかなりません。よくもわるくも、日本らしいなあと思って流行り病を静観しております。

なんでエンジニアになったんだっけって話

はじめに

今年になって弊社では制度面での改革が行われています。面談ではその人のいまのライフステージやエンジニアとしてどのようになっていきたいのか、おおざっぱに言えばその人の生き方を二人三脚で考えるやり方に変わろうとしています。その動きを受けて上司や同僚と話をしながら思ったこととして、「自分は何がやりたくてこの業界に入ったんだっけ」と思い出すためにこの記事を書きたいと思います。業界に対する志望動機を再確認し文章化しておくことで、別の会社に転職を決意したときにもそもそも私の原点はブレないだろうし、今の会社でやるべきことの軸を立ち返ることでどのような気持ちで仕事に取り組むのかを整理できると思っているからです。

はじめてのお仕事

大学院で公共政策を研究していたのですが、公共政策というよりも「公共」それ自体について興味があり、政治学社会学、思想史などもかじっていました。家から徒歩3分の場所にあり、大学が閉まる時間ギリギリまで本を読んだり論文や資料を読んだりしてノートにまとめたりを繰り返していました。講義を含む1日8時間以上勉強をほぼ毎日していたので、実は社会人になってから労働時間を辛いなあと思ったりしたことはそこまでなく、勉強時間が労働時間に置き換わった程度のことに感じていました。そのため比較的シームレスに学生から社会人に移行できたような気がします。

IT業界に入る前は残業前提で資料をまとめたり、大量の個人情報をエクセルのセルに入力したり、非常に定形的な作業をしていました。FAXも使うし電話も使う、なんともならないときには人海戦術でなんとか仕事をさばく、そのような職場で働いておりました。

Excelの関数は社会人になってから少し勉強して使えるようになったレベルでしたが、この頃から作業の自動化をできないものかと考えていました。大量の個人情報の入力は、フォームを作成すれば入力の手間が省けて楽になるはずだ。Excelの「マクロを記録」を知ってから、半自動化ができるように工夫をしていました。

転職を決意する

いつまでも今の仕事をしていられないなあと思っていたことや、手に職ある仕事をということでIT業界へ転職を決意しました。人と関わる仕事は楽しいけれども、一方で属人的な仕事を非属人化させる仕組みを作ることが仕事のモチベーションになっていたことや、いっそ作業を自動化したい、作業を楽にしたいという気持ちは変わらずあって、IT業界がしっくり来ると思ったからです。

最終的にはコンサルタントになりたいなとは考えていたので、ITを使ったコンサルタントの仕事ができるようまずは基礎的な能力を磨こうとも考えていました。

初めてのIT会社、実態は...?

いわゆる第二新卒の扱いとして某IT会社に入社しました。大学を卒業した新卒の子が同期で、一人だけかなり浮いていたように感じていました。Javaの研修(サクラエディタで編集して、 $ javac Hoge.javaコンパイルして実行...、IDE使おうよ...)をしたり、VBAマクロを使った簡易なプロジェクト演習や、ビジネスマナー研修を経て2ヶ月後の6月に某銀行系のプロジェクトに配属されました。

出向先への通勤途中で『なれる!SE』を読みはじめ、エンジニアという誇れる職業(室見さんしゅき...)への憧れや、情熱を持って仕事に取り組むことの格好良さに感銘を受けました。

実際にやっていたことはCOBOLのソースを読んだり、JCLでプログラムを実行したり、打鍵テストを実行したり。当時の人月単価はよくわからないものの、アルバイトでもできるような簡単な仕事から作業を任されるようになりました。案件が銀行系ということもあって、外側に出るインターネットは使えないためOSSの利用は当たり前にできませんでしたが、VBAの利用は許されていたので、VBAを使ってコードを書いていたりしました。

その後別のプロジェクトに配属され、そこでは機器検証業務を実施していました。なぜか夜勤でしかも片道2時間、残業は+2~3時間を前提としていたプロジェクトで定時で帰ると白い目で見られるというプロジェクトだったため、身体と精神を軽く病みつつ重症化する前に金融系のプロジェクトにアサイン。そこでようやくJavaを書く環境に配属されました。

(検証業務に意味がないとは思わないけれど、検証だけをしているだけの仕事は意味がないのかなと思ったりします。そこでできた人脈もあるので一概に否定はしませんが)

そこでのプロジェクトは比較的長く1.5年在籍していました。Java + Eclipse + SVN の開発環境の構築も初めてでしたし、データベースをローカルで構築することもなかったですし、1から10まで先輩社員に教えてもらいました。設計書も揃っているし、詳細設計書(プログラム設計書)もあり、どのように書くのか(IF文レベルでやることが書いてある)が明記されてあり、正しいJavaプログラムの書き方をそこで覚えたような気がします。

現在について

前職はいろいろな理由(禁則事項)があって転職しているわけですが、振り返ってみるとエンドユーザーに寄り添ったシステムを作れているのだろうか、エンドユーザーがもっと楽できるシステムを構築するという、この業界にはいった志をときどき忘れたり守れてないときもあると思ったりします。初志貫徹、この気持ちは忘れないようにしておきましょう。

プログラマとして楽しいと思う実装ももちろん大事ではありますが、エンドユーザーあってのシステムだということをもう一度肝に命じるわけであります。

2019年ふりかえりと2020年に向けて

2019年について

やったこと

今更感があるが資格を取得した

プログラマー1年生でも取る人は取ってしまう資格だから、誇れるものではないが、資格取得を目指してちゃんと時間を使ったという実感だけはあるし、自信にも繋がるなと思った。LPICなんかまさに実務よりで、実際に業務で役に立っていると実感する。

フロントエンドまわりについても、人に教えられるレベルぐらいにはスキルを磨けたのかなとは思う。

  • 非同期処理まわりの取り扱い(Axios, async / await)
  • Vue + Vuex + Router の構成
  • ReactおよびReactNative
  • TypeScript

Vue.jsについては割と成長曲線が鈍化傾向というか、ときめきが少なくなったように思う。ある程度のナレッジが溜まった状態。しかし、WebpackとVueを組み合わせと途端にconfig関連を弄る行為が辛くなる。

フロントエンドのテストについては、どう書くかよりも、どの粒度感で書けばいいのかという問題のほうが多い。正規表現を使う部分だけはすべてテストを書くが、それ以外は別にいいかって思ったりする。フロントエンドエンジニアが賞味なところいないので、フロントエンドのテストがわからない部分がある。DOMがレンダリングされたかどうかのようなテストを書く工数は天秤に釣り合わないと感じる。

Reactがやりたいし、TypeScriptの型システムはこれからも勉強が必要だと思う。

社内で勉強会(読書会)を企画した。参加人数はそこまで増えなかったが、社内の文化醸成に役立てたのではないかと思っている。「振り返り」を行い「次の目標を立てる」文化は必要だと思っていて、『カイゼン・ジャーニー』を読んだことは非常に有意義だったと思う。部署やチーム(デザイナや、別案件)が違うが、だからこそその読書会で得られた知識・知見を持ち帰り、実行できた部分はあるのかなと思う。社内で勉強会を企画して、それに賛同してくれて、読書会を行えるという先駆例を作れたことも意義はあったと思う。

カイゼン・ジャーニー たった1人からはじめて、「越境」するチームをつくるまで

カイゼン・ジャーニー たった1人からはじめて、「越境」するチームをつくるまで

2週間ほどAWSの構築を手伝うことがあった。2週間程度では大した知識はついていないが、Linuxで構成したApachのWebサーバを全世界に向けて公開する、といったことを行えるようになったことは経験として得られたことはありがたかった。AWSの構築や運用などについては、また機会があればやりたい。

今まで手書きで日記(ほぼ日)を書いたが、すこし時間を無駄にしている気がしたのでやめた。気が向いたら再開するかもしれないが、思い立ったときにやる程度の日記が性にあっているのかもしれないと思う。

反省

  • SNSで毒づきすぎた
  • 人に対するあたりがきついときがあった

接し方や態度を改める必要はないにしても、あとから振り返ってきついことをしたかなあと後々反省することもある。

2020年に向けて

今年のテーマは、自力・実力、基礎能力の向上。 IT業界に入って5年目となり、年齢的にも中堅どころとなるが、仕事をすればするほど足りないところを露呈しているなとも思う。やっている仕事ベースでは影響は出ないが、専門から少し離れたレベルだと話についていけないなあと感じることが多い。CS(コンピューター・サイエンス)学部卒ではないため、コンピューターに対する基礎の部分がすっぽり抜けて落ちているなと思うので、この部分は埋めていこうかと思っている。資格とか取ればいいんじゃないかな。

資格で言えば

  • 基本情報(一昨年受けて落ちた以降、未受験)
  • 応用情報
  • HTML5 プロフェッショナル認定試験 Level 1, 2

あたりは取得したい。余裕があればCCENTやAWSのアソシエイトなんかも取れると良いなと思う、が特に資格を取ること自体についてこだわりがある方ではない。

経験年数的なところもあって、アーキテクトの部分については興味がある。設計技法、たとえばドメイン駆動設計やテスト駆動開発オブジェクト指向プログラミング。読んで血肉に変えて、プロジェクトで活かせられると最高ではないかと思う。

本を読むことを目的にはしたくはないが、技術関連書籍は12冊(1ヶ月1冊)は読めると良いと思う。

体重は減らしたい、10%程度減ると良いと思う。

以上。

hoge配下にnpmでhogeモジュールをインストールしてはいけない

とりあえずReactをはじめてみようとのことで、以下のようなことをやってみた

$ mkdir react
$ cd react/
$ npm init -y

Wrote to /Users/username/react/package.json:

{
  "name": "react",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

で、次にreactをnpmよりinstallしようとしたら、ダメだった

$ npm install --save react


npm ERR! code ENOSELF
npm ERR! Refusing to install package with name "react" under a package
npm ERR! also called "react". Did you name your project the same
npm ERR! as the dependency you're installing?
npm ERR! 
npm ERR! For more information, see:
npm ERR!     <https://docs.npmjs.com/cli/install#limitations-of-npms-install-algorithm>

Did you name your project the same as the dependency you're installing?
「あなたのプロジェクト名と同じ名前のモジュールをインストールしましたか?」とあります。
つまり、react 配下にreactはインストールできないんですね、というお話でした。

Java SE 8 Programmer I の資格を取りました

タイトルの通り資格を取りました。
Java SE 8 Silver のほうが日本語として通っていると思います。

とくにこれということはないのですし、ご報告というものでもないのですが、ご報告で。
ちなみに、今のところGoldの資格を取る気はありません。
Javaのリリースサイクルは半年になってしまったので、正直Oracle公認のJava 8でさえ古臭くなっていて、新しい資格がそのうちでるんじゃないかなあ、と予想しています。

今年はLPIC Level 1 を取りたいです。
以上。