ITも大抵筋肉でなんとかなる

気が向いたら技術的なことも書くかもしれないですが、技術的なこと=ITとは限りません。

プロフィール

基本情報

職業

Webサイト・SNS

  • 作ったWebサイト(公開中)やSNSなど

ホームページ

趣味

筋トレ・弓道

Qiita

Twitter

続きを読む

毎日投稿することの難しさ

最近は毎日ブログを更新する、ということを目的としてやっています。継続は力なりというのでとりあえずやってみようという試みです。しかし毎日更新しようと思うと、ネタはあっても時間がない。こういううっすい内容を挟むしかないですね。
どの物事にも言えることですが毎日やるということは難しいです。今日なんかは寝不足なせいか割と頭が回っていないので書こうにもなかなか難しい状態です。それでもなんとか文章を書きまとめることはしています。なんとなくでいいからやってみるということがどれほど効果を得られるかは不明ですが、今のところ人生でこの作戦を取って失敗したことは無いです。そう考えると適当でもいいという心持でとりあえずやってみるというのは性に合ってるのかもしれません。自分に合ったメソッドを見つけて能力向上を目指していきたいですね。

ディスカバリーチャンネルの「ザ・秘境生活」がすごい

www.youtube.com

ご存知の方も多いのではないかと思いますが、最近このシリーズにハマっています。エド・スタフォードという元軍人がフルチンで撮影機材以外何も持たずに秘境に降り立ち、10日間生き延びる…というものです(回によっては防寒のためにズボンを履いていたりします)。これがすごい。

何がすごいかっていうと、まるで原始時代のような暮らしをしながら現代の英知を駆使して10日間生き延びるさまがすごいんです。「昔の人はこうしていました」「現地の人はこうしていました」「これは食べられる草です」「獲物を捕まえるために罠を仕掛けましょう」と動画の中で平然と語っていますが、そもそも現代においてサバイバル技術などほぼ必要はないわけでこの人は一体どこまでそういうことに精通しているんだ、と…。そして原始時代のような暮らしと書きましたが、これは「昔人間もこのように暮らしていたのだな」というさまを垣間見れるという意味です。

突飛なようですがこれを見ていると人間における労働というのは一つ残らず自動化されるべきだなと思いました。その辺の細やかな話は気が向いたら書こうかなと思っています。例としては罠ですね。本来であれば道具を作って狩りを行なうというのが食料調達の基本になるわけですが、狩りをしているシーンは一切出てきません。一人なので狩りが現実的ではないということもあるとは思いますが、罠というのはある種作ってしまえばあとは労力がかかりにくい食料調達の方法です。罠にかかったかどうか確認しに行くだけで済みます。その間に別のことができるわけです。そのうえ狩りと違いカロリーも消費しづらいですので、非常に効率的なやり方だなと思います。

現代社会においてはある種IT分野が、罠にあたる部分だろうなと思います。ITを使ってどんどん自動化されていき労働をできるだけ少なくする、これが理想の形です。動画内でも言及していますが、獲物が取れず労働ばかりしているとだんだん気がめいってくるわけです。つまり日常を楽しむ余裕がなくなるわけです。余裕がなくなると労働のことばかりに気が取られてしまいさらに余裕がなくなってしまうという悪循環に陥ります。

何が言いたいのか暗喩的内容になってしまいましたが、直球の結論を書いておくと早いところコンピュータに仕事をすべてやってもらって最低限の労働で生きていける世の中になってほしいなという。そういう。やつです。というような学びを得ることができるし、単純にエド・スタフォードという人間が非常に面白いですし、サバイバル術に関しても面白いですので是非とも。期間限定っぽいので(どれぐらいの期間限定なのかは分からない)、早めに見ておくことをおすすめします。

MySQLの文字コード指定はutf8ではなくutf8mb4を使う

タイトルの通り。utf8だと歴史的経緯で絵文字などが使えないそうで、トラブルのもとになる。「別に絵文字格納しないし」という場合でも念のためこちらを指定しておくとよいだろう。
先日書いた記事を更新しておかねば…

ブログのレイアウトやシンタックスハイライトの設定を変えました

ブログのレイアウトが技術ブログっぽくなかったというか、コードを乗っけるには適していなかったような感じがしたので変えました。
ついでと言っては何ですが、シンタックスハイライトの設定もMonokai風に変えております。この辺は好みの問題もありますが、技術ブログなので読みやすさをできるだけ重視したつもりです。(実はコードのフォントも微妙に変えています)
今後も細やかな改善はしていきたいと思います。

Node.jsのインストール for CentOS7

使う機会があったのでメモ

概要

Node.jsをインストールしnpmコマンド、nvmコマンドをなどを使えるようにする

対象の環境

CentOS7(Virtualbox上)

今回インストールするNode.jsのバージョン

v8.12.0 (LTS)

インストール

この辺の手順は公式のGitHubに書いてあったものをそのまま使用

モジュールの取得

$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
=> Downloading nvm from git to '/home/hoge/.nvm'
=> Cloning into '/home/hoge/.nvm'...
remote: Counting objects: 267, done.
remote: Compressing objects: 100% (242/242), done.
remote: Total 267 (delta 31), reused 86 (delta 15), pack-reused 0
Receiving objects: 100% (267/267), 119.47 KiB | 0 bytes/s, done.
Resolving deltas: 100% (31/31), done.
=> Compressing and cleaning up git repository

=> Appending nvm source string to /home/hoge/.bashrc
=> Appending bash_completion source string to /home/hoge/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

環境変数の設定

上記の通り設定してくれと書いてあるのでその通り設定

$ {
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
} >> ~/.bashrc
$ source ~/.bashrc

環境変数の設定を確認

適切に設定されていれば$ nvm --versionでバージョンが確認できるはず

$ nvm --version
0.33.11

Node.jsのインストール

このままではnvmが入っただけであるので、Node.jsはインストールされていない。下記の手順でNode.jsをインストールしていく。

  • Node.jsのバージョンを確認
    • 特に新規で環境を作る場合はLTSの最新を使うのがおすすめ、今回はその手順を紹介している
  • インストール

Node.jsのバージョンを確認

$ nvm ls-remoteでインストールできるNode.jsのバージョンが確認できるが、かなりの数のバージョンが存在するせいでものすごい勢いでログが流れて行ってしまうので注意されたい。本記事ではgrepコマンドを使ってLTSのみを出力することで、LTSの最新バージョンを確認した。

$ nvm ls-remote  | grep LTS
~~
        v8.10.0   (LTS: Carbon)
        v8.11.0   (LTS: Carbon)
        v8.11.1   (LTS: Carbon)
        v8.11.2   (LTS: Carbon)
        v8.11.3   (LTS: Carbon)
        v8.11.4   (LTS: Carbon)
        v8.12.0   (Latest LTS: Carbon)

最新はv8.12.0であることが分かったためこれをインストールする。

インストール

特に難しいことはない。

$ nvm install v8.12.0
Downloading and installing node v8.12.0...
Downloading https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.xz...
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v8.12.0 (npm v6.4.1)
Creating default alias: default -> v8.12.0

確認

npmコマンド・nodeコマンドを使用しバージョンを表示できればインストール成功である。

$ npm --version
6.4.1
$ node --version
v8.12.0

スキルの棚卸しを行なって思ったこと

タイトルの通りスキルの棚卸をしています。スキルというか、ポートフォリオを作るための基盤なんですが。さてはてどうやって書いたらよいのか…。自分を売り込むためのものなのでどうしてもいろいろ書きたくなってしまうのですが、それじゃいけないもっと必要な情報のみに絞るべき…などいろいろなことを考えながら書いているとなかなか上手く書けず。難しいです。やったこととできるようになったことを淡々と書けばいいのかしら…。

ところでスキルの棚卸しをしていて気付いたことがあります。それはベンチャー企業(私の場合はベンチャー(笑)でしたが)に入るメリットです。正確にはある程度裁量のある仕事のできるベンチャーになります。それは「いろいろな技術に触る機会が多くなる」ということ。ベンチャーの場合大抵の場合人数が足りていませんので、一人でいろいろな役割を兼務する必要があります。私が一番兼務したときは

  • インフラ設計・構築
  • ミドルウェア構築
  • データベース設計・構築
  • ビルド職人(のちにJenkinsを自分で構築し自動化)
  • コーディング(フロント・バック両方)

みたいな感じでした。インフラに関してはAWSで契約しVPSでネットワーク設定をしEC2でサーバを立てApacheTomcatをインストールしSSL/TLS対応を行ないRDSでデータベースサーバを立てデプロイをしソフトウェアの動作確認をしながらコーディングを行なう…そんな感じでした。よくやってたなぁと思います。その上2年目でしたからね…よく生きてたなと…。今だったら全部当たり前にできますけど、当時は「Linuxってなに?プロンプト?WindowsDOSみたいなやつじゃないの?FQDN?何そのDQNみたいなやつ…CIDR…?サブネットマスクApacheってなに…?Apache TomcatApacheじゃないの…?」って感じだったので控えめに言って死でしたね。もっと学生のときに勉強しておけばよかった…。

これだけ兼務していると何が起きるかって、家に帰ってWebサービスを作ろうと思ったとき何も困らなくなることですね。何を用意して何をすれば作れるのかはすぐ分かるようになったので、動くものを作ることに関してはそこまで苦労せずできるようになりました。チューニングとかセキュリティ関連はそこまでちゃんとやったわけじゃないのでもし公開するならその辺を勉強しながらやることになりますが、逆にその程度で済むという感じです。

まぁ察しの良い方は気付いていると思いますが信じられないほどブラックでした。辞めてから1年以上「なんで僕はあんなクソみたいな会社に入ってしまったんだ…人生終わったようなもんだよ…もうだめだ…」とか思ってましたが、いろいろできるようになった点はとてもよかったと思いますし、PMがあまりにも無能すぎてめちゃくちゃ裁量があったのでいろいろ自分で決められたのはよかったです。

あまりにもブラックなベンチャーに入ってしまうと身体を壊す危険もあるのでお勧めできませんが、そうでないところであれば一度入ってみるというのも悪くないのでは?と思えるようになりました。成長したということでここはひとつ…。

pyenvとpyenv-virtualenvを導入する

概要

pyenvを導入してPython3系とPython2系を同じマシン内に同居できるようにする。

まえがき

  • Pythonは現在大きく分けて2系と3系がある
    • 2系は2.6以下と2.7以上で結構違うみたい(2系はよく知らない)
  • 今後は3系が主流になる
  • が一部ライブラリがまだ3系に対応していないことや2系を前提に動くツールが2018/10/09現在も多い
  • GNU/Linuxにデフォルトで入っている2系を削除し3系を入れるのはリスクが高い
  • そこで切り替えをコマンド1つでできるようになるpyenvを導入する
  • ついでにpyenv-virtualenvも入れる

前提モジュールのインストール

RHEL系(CentOS7など)

$ sudo yum -y groupinstall "Development Tools"
$ sudo yum -y install \
    readline-devel \
    zlib-devel \
    bzip2-devel \
    sqlite-devel \
    openssl-devel \
    libXext.x86_64 \
    libSM.x86_64 \
    libXrender.x86_64 \
    gcc \
    gcc-c++ \
    libffi-devel \
    python-devel \
    bzip2

Debian系(Ubuntuなど)

$ sudo apt-get -y install \
    gcc \
    make \
    openssl \
    libssl-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev

pyenvおよびpyenv-virtualenvのインストール

Gitからソースを取得

ディレクトリの配置先は/opt/pyenvとする。homeディレクトリ配下に配置する例もよく見るが、他のユーザから参照できない問題が発生するので/opt/pyenv配下に配置している。

$ sudo git clone https://github.com/pyenv/pyenv.git /opt/pyenv
$ sudo git clone https://github.com/pyenv/pyenv-virtualenv.git /opt/pyenv/plugins/pyenv-virtualenv
$ sudo chmod -R 777 /opt/pyenv

環境変数の設定

コマンドを使用できるように設定。

$ {
    echo export PYENV_ROOT=/opt/pyenv
    echo export PATH='$PYENV_ROOT'/bin:'$PATH'
    echo 'eval "$(pyenv init -)"'
    echo 'eval "$(pyenv virtualenv-init -)"'
} | sudo tee /etc/profile.d/pyenv.sh
$ sudo chmod 644 /etc/profile.d/pyenv.sh
$ source /etc/profile

Python本体のインストール

  • 現在(2018/10/09)の最新は3.7.0(?)なのでそれを入れる
$ pyenv install -v 3.7.0
  • pyenv installには下記のようにCFLAGSの指定も可能
$ CFLAGS="-fPIC" pyenv install -v 3.7.0

mod_wsgi使用時はCFLAGS="-fPIC"を指定しインストールしたPythonを使用しなければエラーとなる(2年ぐらい前の話なので今はどうか分からないが…)

pyenvの使用法

localオプション

  • $ pyenv local 3.7.0などとして使用する
  • 対象のディレクトリ配下のみPythonのバージョンが切り替わる
  • 対象のディレクトリ配下に.python-versionというファイルを作成するので、gitを使う場合は.gitignore.python-versionを記載しないと対象に入ってしまう(あえて入れるという手もあるが)

globalオプション

  • $ pyenv global 3.7.0などとして使用する
  • ディレクトリのPythonが指定したバージョンとなる

pyenv-virtualenvの使用法

環境を作成する

環境を作成する場合は下記のようにpyenv virtualenv {元にする環境の名称(バージョン番号)} {作成する環境の名称}とする。作成される環境は作成元の環境を引き継ぐ。つまりpipインストールで何かモジュールを入れている環境を元にした場合、作成した環境も同じものがインストールされている状態となる。

$ pyenv virtualenv 3.7.0 hoge
Requirement already satisfied: setuptools in /opt/pyenv/versions/3.7.0/envs/hoge/lib/python3.7/site-packages
Requirement already satisfied: pip in /opt/pyenv/versions/3.7.0/envs/hoge/lib/python3.7/site-packages

作成した環境を使用する

通常のpyenvと同様。

$ pyenv local hoge
(hoge) $ pyenv versions
  system
  3.7.0
* hoge (set by /hoge/fuga/.python-version)

作成した環境を削除する

こちらも通常のpyenvと同様。

$ pyenv uninstall hoge

参考

まとめ

Pythonのバージョン問題はなかなか解決しない問題で結構厄介だったりします。この方法でサクッと違うバージョンのPythonを入れておくといざというときにトラブル対処がしやすくなる…気がします。ちなみにcronで動かす場合はトラブルになりやすいので、どのPythonで動かすのかを意識した方がよいです。一番確実そうなのはPythonの実行ファイル実体をフルパスで書いてしまうことかと思います。多分。