Centos7でdefaultのkernelを変更する

いっつも忘れる。使わないコマンドは忘れるので、メモする。 そのうち、メモしたことも忘れちゃうんだけど。。。

## kernelのバージョンアップはyumでok
[root@cent701 foxtrot]# yum update kernel

## installされたかどうかはgrubbyで。(このコマンドを忘れちゃう。。)
## 先ほどinstallした最新のkernelになっていればok
[root@cent701 foxtrot]# grubby --default-kernel
/boot/vmlinuz-3.10.0-1127.19.1.el7.x86_64

他にどんなkernelがはいっているんだっけの確認

[root@cent701 foxtrot]# grubby --info=ALL
index=0
kernel=/boot/vmlinuz-3.10.0-1127.19.1.el7.x86_64
args="ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8"
root=/dev/mapper/centos-root
initrd=/boot/initramfs-3.10.0-1127.19.1.el7.x86_64.img
title=CentOS Linux (3.10.0-1127.19.1.el7.x86_64) 7 (Core)
index=1
kernel=/boot/vmlinuz-3.10.0-1062.18.1.el7.x86_64
args="ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8"
root=/dev/mapper/centos-root
initrd=/boot/initramfs-3.10.0-1062.18.1.el7.x86_64.img
title=CentOS Linux (3.10.0-1062.18.1.el7.x86_64) 7 (Core)
index=2
kernel=/boot/vmlinuz-3.10.0-957.el7.x86_64
args="ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8"
root=/dev/mapper/centos-root
initrd=/boot/initramfs-3.10.0-957.el7.x86_64.img
title=CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
index=3
kernel=/boot/vmlinuz-0-rescue-ee6bae33538ba760429884428832c0ea
args="ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
root=/dev/mapper/centos-root
initrd=/boot/initramfs-0-rescue-ee6bae33538ba760429884428832c0ea.img
title=CentOS Linux (0-rescue-ee6bae33538ba760429884428832c0ea) 7 (Core)
index=4
non linux entry

kernelを元に戻したいときはindexを指定すればok

## いまの指定を確認
[root@cent701 foxtrot]# grubby --default-index
0
## 1個前だと1を指定。indexはgrubby --info=ALLで出てきたやつ。
[root@cent701 foxtrot]# grubby --set-default-index=1
## rebootしたら反映

Golangの初期設定をする

さぁ。Goを始めようと思ってanyenv入れて、goenv入れて、って何度もやっている気がして、その都度調べているので、メモを残すことにしました。

anyenvでgoenvを入れる

% anyenv install goenv

anyenvで入れたgoenvの場所を確認

% ls -ld .anyenv/envs/goenv

.zshrcに記載

export GOENV_ROOT=$HOME/.anyenv/envs/goenv
export GOPATH=$HOME/go
export PATH=$GOENV_ROOT/bin:$PATH
export PATH=$PATH:$GOPATH/bin
eval "$(goenv init -)"

execを実行して再読み込み

% exec $SHELL

goenvのpathが通った

foxtrot@MacBook-Pro-3 ~ % goenv -v
goenv 2.0.0beta11
foxtrot@MacBook-Pro-3 ~ %

goをinstall

foxtrot@MacBook-Pro-3 ~ % goenv install -l
Available versions:
  1.2.2
  1.3.0
  1.3.1
  1.3.2
...
# とりあえず最新
foxtrot@MacBook-Pro-3 ~ % goenv install 1.14.6
Downloading go1.14.6.darwin-amd64.tar.gz...
-> https://golang.org/dl/go1.14.6.darwin-amd64.tar.gz
Installing Go Darwin 64bit 1.14.6...
Installed Go Darwin 64bit 1.14.6 to /Users/foxtrot/.anyenv/envs/goenv/versions/1.14.6

番外編

  • goをdownloadできないなぁと思ったら、ローカルの時刻がずれていたことがあった。 最近の証明書はexpire dateの他にstart dateもあって、全然時刻を合わせていなかったら、証明書のエラーになっていた。
Peer's Certificate has expired.
  • vimのautoindentが効かないなぁ。vim-goのせいかなと思っていたら、おまけでvimrcに追加したset pasteのせいだった。
  • みんなのGo言語にあるように、ghqとpecoも合わせて入れると良いんだろうな。この辺のセットアップはansibleにしたら良いんだろうか。

Cluster HAT Kitを購入しました

会社の上司からClusterHatKitという複数台のRaspberry piをまとめて動かせるおもちゃを紹介してもらったので、購入しました。 特に複数台構成でなんかやりたいことがあったわけではないんですけどね。

f:id:foxtrot0304:20190602135306j:plain

日本ではCluster HATは購入できるのですが、Cluster HAT Kitはまだ購入できないみたいなので、イギリスのショップから購入。

ちなみにCluster HAT Kitは、以下のものがセットになった商品です。 Rapberry Pi Zero Wは通常は1サイトで1つしか買えないのですが、Kitだと4枚まとめて買えます。

Cluster HAT Kit
Raspberry Pi Zero W * 4
8GB Class 10 Micro SD Cards * 4
USBケーブル(Cluster HAT Kitと母艦のRaspberry pi をつなぐやつ)
ネジ?というか接続パーツ(Cluster HAT Kitと母艦のRaspberry pi をつなぐやつ)

USBケーブルとネジ?の説明が一緒になってしまいましたが察してください。
あと、Micro SD Cardは8Gbyteって買いてあるけれど、16Gbyteが入っていました。 大は小を兼ねるだからよいのかな。

購入したショップはModmypiというイギリスのサイトです。

www.modmypi.com

アメリカのショップでも売っているみたいですが、為替とか計算したらイギリスのショップが安かったので。

私が購入した時の価格は以下のような感じでした。

cluster hat kit 83.33ポンド = 83.33ポンド * 147円 = 12249円
raspberry pi 3 28.33ポンド = 28.33ポンド * 147円 = 4164円

Raspberry Pi 3はCluster HAT Kitの母艦として使用するために購入しました。 日本でも同じぐらいの値段で購入できるのですが、別々に購入するとめんどいので、、、 ClusterHATKitもRaspberry pi 3も税金は会計時に除いてくれます。
今サイトを見たら、ClusterHATKitは74.99ポンドだったので、ClusterHATKitのほうの値段は、送料も含んだ価格かも。 ClusterHATKitに付属しているraspberry pi zero が pi zero W(無線LAN付き)だったので、83.33ポンドであっているようでした。

5/4に注文して、5/7に発送。 5/14に自宅に到着しました。 意外とはやい!

包装は簡易なもの。これはこれでよいですね。

f:id:foxtrot0304:20190517082013j:plain

ここから、電源を入れるまでに試行錯誤があるのですが、他の方も紹介してあったりするので、詳細は割愛。 とりあえず、メモ程度に。

MicroSDカードの使用領域の拡張

最初のOS起動時にUpdateでコケる。。。 ディスクの空き領域が不足しているみたいで、OSのImageの分しか確保されていませんでした。 こちらは、raspi-configというコマンドで設定可能でした。

$ sudo raspi-config
# 以下を選択
7 Advanced Options     Configure advanced settings
# 以下を選択
Expand Filesystem Ensures that all of the SD card storage is available to the OS

fdiskを自動でやってくれているみたい。 これなら慣れればraspi-configコマンドを使用しなくても自分でもできるのかな。

Raspberry pi zeroへの接続

pi zero自体は、以下のコマンドで母艦から電源ONできます。

$ clusterhat on

その辺のコマンドはClusterHATKitのページを参考に。

ClusterHAT - Setup Control

起動したら、pingがとおって感動します。 この辺の設定はNATするかどうかのOSイメージでちょっと変わるのかもしれません。

$ ping pi@p1.local

以下のコマンドを使ってpi zeroに接続します。

# 1番目のpi zeroに接続する場合
$ minicom p1

で、ユーザ・パスは、いつものraspberry pi のデフォルトかと思うじゃないですか。
それがClusterHATはデフォルトが違っていて、以下に記載がありました。

ClusterHAT - Setup Software

デフォルトが違うなんてつゆ知らず、なんか設定や接続方法が間違っているんじゃないかと結構時間を費やしてしまいました。
最初から公式マニュアルを読むべきですね。

とりあえず、vimとか必要なものを入れたり、LDAPに対応させたら、あとは構成管理でもしますかねー。
落ち着いたら、他の方がやっているように、kubernetes-the-hard-wayでもやってみようかと思っています。

---追記---

2019/06/22

ClusterHATKitに付属しているRaspberry Pi ZeroはRaspberry Pi Zero Wの間違いのようでした。Pi Zero Wになると無線LANの機能が付いてきます。 ただ、いまはModmypiのショップには売っていないみたいですね。 ClusterHATKitの購入に進もうとすると、ThePiHutなるショップに飛ばされましたが、転送先のThePiHutでは売っていませんでした。

ModMyPiのトップページに

ModMyPi has been acquired by The Pi Hut. As such, all new orders should be placed directly at The Pi Hut's webstore

ってあるから、買収されたみたいですね。。 ClusterHATKitが入荷されると良いですね。

ModMyPi LTD | Everything Raspberry Pi!

コンウェイの法則で思ったこと

コンウェイの法則って知っていますか?

以下のような法則です。

システムを設計する組織は、その構造をそっくりまねた構造の設計を生み出してしまう

だそうです。
この法則について書かれた本を読んだわけではないので、詳しくは知りませんが、メルヴィン・コンウェイという方が言われた法則らしいので、コンウェイの法則なんですね。

メルヴィン・コンウェイ - Wikipedia

このコンウェイの法則、最初に何かで読んだときはそんなことないやろと思っていました。
システムの設計なんて、その時々で変わるはずだと思っていたからです。
当てはまらないなと思いつつも、そういう考え方もあるんだなと印象に残りました。
どこで読んだかは覚えていないですけどね!

先日、「エンジニアリング組織論への招待」を読んでいるとまたコンウェイの法則が出てきました。
技術組織の生産性を語る中での登場です。
ここであげられていたコンウェイの法則の例は以下のようなものでした。

ある機能開発をするために3つの別のチームとの協議と4つの稟議書に印鑑が必要となる。
その結果、そういったコミュニケーションを回避しても実装できるような機能を重点的に開発した方が効率が良いと判断するようになる。

この例には納得です。
ありそうなものです。
システムを改良するときに、改良の方法としてA案とB案があったとしてA案の方が変更点も少ないし今後のメンテナンス性も良いんだけど、B案の方が(組織構造的に)段違いに早く実装できるとなればユーザーに提供するスピードやその他のタスクなども考慮してB案を選んでしまいそうです。
その繰り返しでシステムが出来上がっちゃう。
この例が組織構造か?と言われると疑問なところも感じますが、本の中で話されていたコミュニケーションの構造=組織構造と考えれば、法則に当てはまるなと思います。法則の原文にも the communication structures of these organizationsってあるんですね。

そして、今週、あるタイミングでまたまたコンウェイの法則が頭に浮かびました。
目指すべきシステムを作るために何かしらの仕組みを作るのも良いのですが、法則とは逆説的に、意図したチーム体系を作るのもありなのかなと。
例えばバグが少ない安定したシステムを作るために常に複数人で作業するようにするとか。
ここでも出てきたか、コンウェイの法則みたいな感じです。

今振り返れば、私が最初にコンウェイの法則を知ったときは、比較的に自由にやらせてもらえる組織構造だったんですね。
だからシステムの設計=自分の思想であって、組織の構造が反映されるなんて結びつかなかったのかなと思いました。
システムはどんなチームがつくっても一緒だと思っていましたが、実際は色濃く反映されるんですね。

こんななんでもない話で3月のブログは終わりとしたいと思います。

以上。

これもどうでもよいですが、ある言葉を知ってから、その単語が目に飛び込んでくるようになったとかありますよね。
いやー最近流行っているなぁとか思うのですが、実は前からバンバン使われていたけれど自分の意識に入ってこなかっただけだったという。
今回のコンウェイの法則がそうですし、他では、最近は「泰斗」って言葉がそうでした。

FACTFULNESS を読みました

気づけば、2019年も1月が終わってしまいましたね。。 2018年は1記事しか書いていない体たらくだったので、2019年はせめて1ヶ月1記事は書けるよう頑張ります。 1月は終わってしまったので、今月から本気出します。

新年最初のblogは、最近、話題のFACT FULNESSを読み終わったので、その感想を書きました。

FACTFULNESS(ファクトフルネス) 10の思い込みを乗り越え、データを基に世界を正しく見る習慣

FACTFULNESS(ファクトフルネス) 10の思い込みを乗り越え、データを基に世界を正しく見る習慣

読んだきっかけは、はてブでオススメしている記事を見かけたことと、会社の方が薦めていたので、購入しました。 TEDでの前提知識があったからか内容も理解しやすく1日ぐらいで読み終わることができました。 (はてブで読んだ記事に筆者のTEDトークの紹介があったので、本を読む前にトークを見ていました。) 過去の筆者の体験談がところどころにあって、飽きさせない工夫があったと思います。 そのあたりの読ませ方は上手ですね。

FACTFULNESS、自分がいかに思い込みだったのかわかる良い本でした。 世界の現状に関するいろいろな3択クイズがあるのですが、ことごとく外してしまいました。 自分の環境で物事を考えていたかですね。 私の頭の中は10数年前の高校の知識からアップデートされておらず、世界もそのままだと思い込んでいました。 「バカの壁」とはちょっと違うかもしれませんが、壁があったのです。

また、この本の良いところは、壁を壊してくれるだけでなく、なぜその壁が発生していたのか、その原因をFACTFULLNESSとして明らかにしていっていることだと思います。 ITエンジニアとして、親しみのある格言で言うならば、「推測するな計測せよ」かなと受け取りました。

FACTFULLNESSの1つとして恐怖本能というものが出てくるのですが、これは「恐ろしいものには自然と目がいってしまうことに気づくこと」というものだそうです。 ついつい、仕事の中でも失敗した時のリスクを考えてしまうのですが、そればかり考えないで、忘れちゃってもよいかもですね。(リスクはなくすようにしますよ!!) この本能に基づくものというのは、「エンジニアリング組織論への招待」の中でも認知の歪みとして出てきますね。 こちらはまだ読みかけなので、どういう発見があるか楽しみです。

意外というか興味深かったことは、筆者の体験談の1つに、ある出来事を第3次世界大戦と勘違いするという箇所があります。 私の中で戦争は急に勃発しないものと思っていますが、それは平和な日本で育った環境からの感覚なのかもしれません。 他にも何かあった気がしますが、何かと気づきが多い本でよかったです。

多様性についての考え方をメモ

こんにちは。 気づいたら2018年も2ヶ月を過ぎ去ろうとし、2017年は2記事しか書いていないことに気づきました。 あまりアウトプットはしていないですが、なんやかんやで2017年は良い経験をし、成長した年だったと思っています。

diversity、多様性はちょっと前からキーワードとしてあがっている言葉です。 フィンテックや一昔前で言えばクラウドのように言葉だけが先に流行してしまい、えっそれ違うのでは?みたいなこともよく思います。 私自身も、なんとなく言葉の意味だけ捉え、多様性があったほうが良いよねと思っていました。 けれども「多様性がある」と「チーム内でいろんな意見がある状態」というのは違うよねと薄々感じていたところ、もうずいぶん前ですが、目を通した新聞に多様性についての記事がありましたので、簡単にまとめます。

目に留まったのは、日経新聞の「やさしい経済学」での連載です。 内容は「経営戦略としてのダイバーシティ」だったのでチームの一員としての目線ではなく、経営者からの目線でしたが、参考になりました。

まずは、ダイバーシティにはプラスの効果とマイナスの効果があるという話。 3つの理論があげられていました。
1つ目は、集団の情報・意思決定理論という理論。集団のメンバーが多様になることによって、利用できる情報や考え方が増えるため、問題解決能力などでプラスの効果を生むというものです。
2つ目は、ソーシャルカテゴリー理論。集団がウチ・ソトに分かれて互いに偏見を持つようになることから、コミュニケーションの問題、関係性の対立から足並みを揃えるのが難しくなるというものです。
3つ目は、類似性アトラクション理論。類似=似ている人には親近感を覚え、逆に自分とは違いすぎる人とは話をしても無駄と思って話をしなくなるイメージです。多様性で考えると、集団としてまとまりにくくなるというものです。
すべて意識はしていないですが、なんとなく理解できます。

ダイバーシティの特性として表層次元の多様性と深層次元の多様性にわけることが可能ということでした。
表層次元の特性は、人種・民族、性別、国籍といったものです。深層次元の特性は、経歴、知識、スキル、能力といった特性です。
表層の多様性をいかすため、それと密接な関係にある表層の多様性に着目することを「アイデンティティコンシャス」といい、深層の多様性を活かすため、あえて表層の多様性を意識しないことを「アイデンティティブラインド」というらしいです。 シリコンバレーのIT企業は、知識・能力に着目する「アイデンティティブラインド」に当てはまるとか。

ダイバーシティのマネジメント手法として「放任」「規範醸成」「指揮と統制」があげられていました。
「放任」とは、仕事に関連する個性のみに着目し、その他の個性に関しては関与しない方法です。
「規範醸成」とは、異質な意見の対立を相互触発を促すものとして奨励する風土を築くことです。
「指揮と統制」とは、組織的権限を調整し、メンバー同士の関係性をマネジメントすることです。明確に「すべきこと」「してはいけないこと」を決め、周知徹底しなければならないとありました。
3つどれかのパターンをとるわけではなく、組織の状態に応じて、組み合わせることが大切だとありました。

私も含め、日本人ってみんなと横並びの教育だったので尖ることよりも合わせることを重視しますよね。 それは国民性であり、また別の議論になるのでしょうが、多様性を活かし難い集団になりがちであることは間違いない気がします。 議論も下手ですしね。私もうまい人を見習いたいです。 多様性を理論的に仕事のいち手段として理解することによって、いろんなことがスムーズにいくのでしょうか。

またWIREDという雑誌で「Identityデジタル時代のダイヴァーシティ」というタイトルで多様性が取り扱われていました。 アイデンティティダイバーシティと何が関連するんだと不思議に思っていましたが、アイデンティティの違いが多様性を生み出しているんですね。 そう考えると、アイデンティティダイバーシティは切り離すことができないものだと思います。 アイデンティティを理解するというか、自分を掘り下げ自分という人間を理解することで、多様性への理解や厚みを持たせることもできるかもしれません。
私もまずは自分自身をもっと知ることから始めようかな。

Let's Encrypt の certbotのエラー

Let's Encryptで証明書を発行しようとした時にハマったのでメモします。

証明書を発行するために、ドメインの認証をする必要があるのですが、いまは便利なものでcertbotという仕組みが用意されているようです。 検索すれば情報がたくさん出てきます。

さっそく私のCent7の環境でもcertbotで証明書を発行するべく、試してみましたが、ImportError: No module named contrib.pyopensslというエラーが出てしまいました。。。

[root@test foxtrot]# certbot certonly --webroot -w ~/cert -d example.jp
Traceback (most recent call last):
  File "/bin/certbot", line 9, in <module>
    load_entry_point('certbot==0.19.0', 'console_scripts', 'certbot')()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 378, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2566, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "/usr/lib/python2.7/site-packages/certbot/main.py", line 19, in <module>
    from certbot import client
  File "/usr/lib/python2.7/site-packages/certbot/client.py", line 11, in <module>
    from acme import client as acme_client
  File "/usr/lib/python2.7/site-packages/acme/client.py", line 33, in <module>
    import urllib3.contrib.pyopenssl  # pylint: disable=import-error
ImportError: No module named contrib.pyopenssl
[root@test foxtrot]#

このエラーは、以下のようなissueを参考にしました。

github.com github.com

何個か書かれていた手順をためしたり、パッケージをアップデートすることによって解決できました。

### pyOpenSSLのアップデート
[root@test foxtrot]# rpm -Uvh pyOpenSSL-0.15.1-1.el7.noarch.rpm
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:pyOpenSSL-0.15.1-1.el7           ################################# [ 50%]
整理中 / 削除中...
   2:pyOpenSSL-0.13.1-3.el7           ################################# [100%]
[root@test foxtrot]#

### シンボリックリンクの作成
[root@test foxtrot]# ln -s /usr/lib/python2.7/site-packages/OpenSSL /usr/lib/python2.7/site-packages/pyOpenSSL
[root@test foxtrot]#
[root@test foxtrot]#
[root@test foxtrot]# ls -ld /usr/lib/python2.7/site-packages/pyOpenSSL
lrwxrwxrwx 1 root root 40 11月 19 12:13 /usr/lib/python2.7/site-packages/pyOpenSSL -> /usr/lib/python2.7/site-packages/OpenSSL
[root@test foxtrot]#

### python-urllibのアップデート
[root@test foxtrot]# yum update python-urllib
...
[root@test foxtrot]# rpm -qa | grep urllib
python-urllib3-1.10.2-3.el7.noarch
[root@test foxtrot]#

再度発行を試します。 この度は、調子よくメールアドレスとか聞いてきたのですが、また別のエラーが。。。 なんかのパッケージにバグがあるっぽいなと。。。

...
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
An unexpected error occurred:
TypeError: cannot concatenate 'str' and 'tuple' objects
Please see the logfiles in /var/log/letsencrypt for more details.

どうしようかなーと考えて、再度検索し、結局別のcertbotをもってくることで解決しました。 参考にしたのは、gitのcertbotを持ってくる手順です。

qiita.com

これでなんとかかんとか証明書を発行することができました。 次は証明書の更新の自動化とかどうしようかなぁと考えています。