稲枝の押入れ

いなえが適当なことを書いては、しまっておく場所

VsVimのすゝめ (3) : Vim説明編

記事の一覧

VsVimの導入

Vimの説明に入る前に、VsVimを取り敢えず導入してみましょう。やっぱり手を動かせると実感できるからね。大丈夫、みんなやってるよ。いつでもやめられるよ。

  • まず上のメニューから[ツール]->[拡張機能と更新プログラム]を選択する
  • 左カラムでオンラインを選択する
  • 右上のVisual Stuio ギャラリーの検索の窓にvimと入力する
  • 中央のカラムにVsVimと表示されたら選択してダウンロードをおす
  • インストールの確認ウィンドウがひらくので、ライセンスを確認して内容に問題がなければインストールを押す
  • ウィンドウ右下の今すぐ再起動を押すなどしてVSを再起動する

ようこそ!!以上で君はVimの世界に足を踏み入れました。

VsVimは、VSの機能との共存の関係などで通常のVimとは少し違うところがあります。ぶっちゃけ機能に制限があったりします。というわけで、特にVsVimで使用可能なVimの機能を優先的に紹介しつつや個人的なオススメ設定も含めて後で紹介していこうと思っています。

ですがその前に、まずはVimについて簡単に説明します。

Vim

じゃあ次は神…じゃなくてVimについて紹介していきましょう。

Vimテキストエディタの一種で、とても多くのファンを持つ人気高性能エディタのうちの1つです。統合開発環境ではありませんが、デフォルトの機能に加えて、多くのプラグインが有志によって開発されているため、不便はほとんどないかと思います。ただし、VsVimではプラグインを(おそらく)使えないので、ここではプラグインの話はしません。Vimのスタンダードな機能について紹介します(いわゆる「バニラ」と呼ばれる状態で使えるものがメインです)。

モード

Vimにはモードという概念があります。そんなに難しいものではないのですが、見慣れない人の方が多いものなので最初は面食らうかもしれません。簡単に言うと、Vimには移動用モード・編集用モード・入力用モード・選択用モードといった風にモードがあり、これらを切り替えてテキストを編集します。

例を見てみましょう。

この世の至高はVisual Studio!!

と書き込まれたテキストファイルを編集して

この世の至高はVim!!

と書き換えることを考えます。最初は行頭にカーソルがあると考えます。つまり

|この世の至高はVisual Studio!!

という状態から始めます。(ここでは仮に|をカーソルとして扱います((Vimのカーソルは文字間ではなく文字上にあるのですがここでは簡単のため文字の間にカーソルがあるとして考えます)))

まず、「移動用モード」で

この世の至高は|Visual Studio!!

の位置まで移動します。

そして、「選択用モード」で

この世の至高は[Visual Studio]!!

と選択します([]で囲まれた範囲を選択範囲とします)。

そして、選択範囲を

この世の至高は|!!

と削除します(|がカーソル位置です)

そして、入力用モードにして、「Vim」と入力することで

この世の至高はVim|!!

と目的のテキストに無事書き換えられました(もちろん、以上の文章の修正は何らかの意図を含むものではありません!!!!!!!!!!!!!!!)

ノリとしてはこういう感じですが、もう少しだけ厳密に見ていきましょう

実際にはモードは

  • ノーマルモード
  • インサートモード
  • ビジュアルモード
  • コマンドラインモード

などがあります。基本的にはこの4つを使うのがほとんどなのでまずはこれを覚えておけば大丈夫です。では、これらについて見ていきましょう。

ノーマルモード

ノーマルモードはその名前の通り通常時のモードです。移動に加えて操作処理を行うことが出来ます。基本的にノーマルモードを基準に他のモードと行き来をします。

ノーマルモードでは、

  • 移動(motion)
  • 削除やペーストなどのテキスト操作処理(operator)
  • 他のモードへの移行

などが出来ます

インサートモード

インサートモードは、いわゆる通常のテキストエディタと同様に、入力をそのままファイルに書き込むモードです。Vimに慣れていない間は最悪このモードにして矢印を使って移動すれば通常のテキストエディタと同様の使い方もできます。

インサートモードでは、

などが出来ます

ビジュアルモード

ビジュアルモードは範囲選択をするモードです。基本的には、ビジュアルモード開始時の位置から、動かしたカーソルの位置までを選択範囲とします。様々な操作をすることも可能で、その場合基本的に操作は選択範囲に対して行われます

ビジュアルモードでは、

  • 移動(motion)
  • 削除やペーストなどのテキスト操作処理(選択範囲に対して)(operator)
  • ノーマルモードに戻る

などが出来ます

コマンドラインモード

コマンドラインモードはコマンドを実行できるモードです。検索や置換、その他様々な機能をコマンドによって実行できます。入力は全てコマンドラインへの入力として判断されます

コマンドラインモードでは、

などが出来ます。

モード間遷移まとめ

各モード間の遷移については、親子関係のように

という感じになっていて、各モードは自分の親もしくは子にのみ遷移できると覚えておけばいいです。よって、例えばインサートモードからビジュアルモードに変えたいときは

インサートモード->ノーマルモード->ビジュアルモード

といった感じに遷移することになります。つまり、ノーマルモードは全てのモードの拠点のような役割も持つことになります。

モード切替のキー(基本)

では実際にどうやってモードを切替えるのか、という話ですが、モード切り替えは以下のキーで行います。実は他にもあるのですが、これだけあれば困ることはないので、まずはこれを覚えましょう。(C-hogeというのはCtrlを押しながらhogeというキーを押すという意味です)

C-[については、ホームポジションから離れないためにも覚えておくと幸せです

Vimのカーソルの位置

通常のテキストエディタや、Vimの「インサートモード」時は、カーソルは文字間にあるのに対して、Vimの「ノーマルモード」時のカーソルでは文字間ではなく文字そのものにあるということを頭に入れておいてください。例えば

Vim最高

というテキストがあるとき、カーソルを行頭に移動した場合は

[V]im最高

という風にV上にカーソルがある状態になります([]がカーソルのある位置)

モード切替のキー(発展)

もしあなたがVimをこれからどんどん使っていこうと思っているとしたら(なんと素晴らしいことでしょう!マスターして是非僕に教えてください!)、モード切替キーについて、より詳細に以下も覚えると良いでしょう。これが使えるだけでも大分便利になります。

  • ノーマルモード
    • インサートモードへの切り替え
      • i : 現在位置の左側にカーソルがある状態にしてインサートモードに切り替える
      • I : その行の先頭からみて最初の(空白ではない)文字の左側にカーソルがある状態にしてインサートモードに切り替える
      • a : 現在位置の右側にカーソルがある状態にしてインサートモードに切り替える
      • A : 行末にカーソルがある状態にしてインサートモードに切り替える
      • o : 現在位置の下に行を追加してその行にカーソルがある状態にしてインサートモードに切り替える
      • O : 現在位置の上に行を追加してその行にカーソルがある状態にしてインサートモードに切り替える
      • gi : 最後に入力があった位置にカーソルがある状態にしてインサートモードに切り替える
    • ビジュアルモードへの切り替え
      • v : ビジュアルモードに切り替える
      • V : 行単位選択のビジュアルモードに切り替える
      • C-v : 矩形範囲選択のビジュアルモードに切り替える

インサートモードについて例を出すと、

上の行
適当[]文章
下の行

があった時に、それぞれのキーを押した際にインサートモードになる位置については

上の行
O
I適当i[]a文章A
o
下の行

となります

モーション(基本)

モーション(motion)とは簡単に言うと移動操作のことです。Vimではモーションを用いて移動ができます。モーションは基本的にノーマルモードとビジュアルモードでのみ使えます。

上下左右の移動

移動のためのモーションのキーは以下の通りです
h : 左
j : 下
k : 上
l : 右

一見分かりづらいかもしれませんが、これらのキーはキーボード上でhjklという順に配置されています。つまりその位置が←↓↑→という矢印キーに置き換わったように移動操作が出来ます。

そのため慣れると直感的な操作が可能になります。その位置もホームポジションからほとんど動かさずに打てる位置なので使いやすいです。

はい、これで移動のための矢印キーを押すためにホームポジションから手を離す日々とはオサラバ。常にホームポジション引きこもりの完成ですね。最高!!!

単語単位の移動

ついでに単語単位で左右に移動するモーションのキーも紹介しておきます w : 単語単位で右に移動 b : 単語単位で左に移動 e : 右側にある単語の末尾に移動 ge : 左側にある単語の末尾に移動

これはVSでいうCtrl + 左右矢印に相当します。矢印の呪縛からまた一つ解き放たれますね。

モーションの組み合わせ

モーションの前に数字をつけることでその回数分押したのと同じ動きをします。例えば

zero one two three four five six seven

の最初のzにカーソルがある時に、4回wを押すとfourfまでカーソルが動くが、4wと押した場合も同様にカーソルが動く

モーション(発展)

その他のモーションについて自分が便利だと思うものについて書いておきます。最悪覚えてなくてもそれほど不便でもないかな?他にもモーションは結構あるので気になったら調べてみてください

ここで特に断りなく順方向、逆方向と書かれていた場合、カーソル位置からみた時にそれより後ろを順方向、それより手前を逆方向として考えます。

その行の該当する文字の位置に移動する

f : 次に押した文字を、順方向に検索した場所に移動する
F : 次に押した文字を、逆方向に検索した場所に移動する
t : fの移動箇所が一文字分手前版
T : Fの移動箇所が一文字分手前版
; : 検索後、順方向に繰り返し検索
, : 検索後、逆方向に繰り返し検索

これ何気に便利。例えば

[z]ero one two three four five six seven

の先頭にカーソルがある時にfsと押すと

zero one two three four five [s]ix seven

と、カーソル位置より後ろで最初にsが出てくる位置であるsixsに移動します。

この状態で;と押すと

zero one two three four five six [s]even

と、再度fsを押したのと同じ動作をして(つまりカーソル位置より後ろで最初にsが出てくる位置に移動して)、sevensに移動します。

さらにこの状態からFoと押すと

zero one two three f[o]ur five six seven

カーソル位置より手前で最初にoが出てくるfouroに移動します。

この状態で;と押すと

zero one tw[o] three four five six seven

と、再度Foを押したのと同じ動作をして(つまりカーソル位置より手前で最初にoの出てくる位置に移動して)、twooに移動します。

ファイル内で検索する

/ : 順方向に文字列検索 ? : 逆方向に文字列検索 * : カーソルのある位置の単語を完全一致で順方向に文字列検索 # : カーソルのある位置の単語を完全一致で逆方向に文字列検索 g* : カーソルのある位置の単語を順方向に文字列検索 g# : カーソルのある位置の単語を逆方向に文字列検索 n : 検索後、順方向に繰り返し検索 N : 検索後、逆方向に繰り返し検索

VSでいうCtrl + Fに相当する。

対応する括弧に移動する

% : 対となる括弧へ移動

意外と使い勝手が良い。VSでいうCtrl + [に相当する

ただし、プリプロセッサ命令ガリガリのクソコードだったりするとテキストベースで判断してるからか正確に対応する括弧に飛ばなかったりする。クソコードを読まざるを得ないときはVSの方を使おう

今いる関数の始点/終点に移動する

[[ : 逆方向に見ていき、1桁目が{で始まる最初の位置に移動
]] : 順方向に見ていき、1桁目が{で始まる最初の位置に移動
[] : 逆方向に見ていき、1桁目が}で始まる最初の位置に移動
][ : 順方向に見ていき、1桁目が}で始まる最初の位置に移動

1文字目は「検索の方向」を指定し、2文字目は「1文字目と同じ文字なら{、1文字目と違う文字なら}を検索する」ことを指定すると覚えるといいです。

何故かチートシートとかにも書かれてないことがあったりする子。

{を最後に書く宗教の方には残念ですが、もし行頭に書くようなら、例えば関数の頭や関数の終わりに飛べるので便利。今いる関数のはじめに飛びたいときや最後に飛びたい時に使えます。

仮に{を行末に書く宗教だとしても、関数の最後に飛んで%で対応する括弧に飛べば関数の始点に飛べるので完全に使えない子ではないです

namespaceがある?はい、あきらめましょう。

これ類似する機能とかでもVSにあるのだろうか?(知らないのであったら教えてください)

ファイルの先頭/末尾に移動する

gg : ファイルの先頭に移動する
G : ファイルの末尾に移動する

行頭/行末に移動する

0 : 行頭に移動する
^ : 行頭(空白ではない文字の最初)に移動する
$ : 行末に移動する

画面単位でスクロールする

C-b : 画面分上にスクロールする
C-f : 画面分下にスクロールする
C-u : 画面半分分上にスクロールする
C-d : 画面半分分下にスクロールする

キーはback,forword,up,downで覚えると良い。画面分スクロールか画面半分分スクロールかのどちらか覚えとけば十分だと思う

オペレータ(基本)

次にオペレータを紹介します。オペレータ(operator)とは、削除やコピー、貼り付け等といった操作のことを言います。

ここを見れば取り敢えずVimを使えはするようになるはず。モーションと同じくオペレータも基本的にノーマルモードとビジュアルモードでのみ使えます。

1文字削除

x : カーソルの位置の文字を消す

ペーストするとこの時消した文字が貼り付けられるので切り取りといったほうが近い?この辺はレジスタとか調べると分かるけど多分最初は知らなくて平気。

ビジュアルモード中は選択範囲が削除されます。

削除

d : 削除する

ビジュアルモード中に押した場合はその選択範囲が削除されます。

ノーマルモード中はdの次に何を押すかによって削除できるものが決まる。例えばdの次にモーションを入力するとそのモーションによって移動した場所までを削除する。その他少し特殊でよく使うものは以下。

dd : 一行削除する
D : 行末までを削除する

このへんでVSのCtrl + XCtrl + Lは代用できる

ヤンク

y : ヤンクする

ヤンクとはまあ簡単に言うとコピーのこと。

dと同様にビジュアルモード中に押した場合はその選択範囲がヤンクされる。

ノーマルモード中もdと同様にyの次に何を押すかによって何をヤンク出来るかが決まる。d同様モーションを追記すればその範囲をヤンク出来る。またも特殊でよく使うのは以下

yy : 一行ヤンクする

ここで注意すべきなのは設定しないとヤンクされたものとコピーされてクリップボードに入っているものは別ということです。

ペースト

p : ヤンクされたものが範囲の場合はカーソルの後ろに、行の場合は下に貼り付けする
P : ヤンクされたものが範囲の場合はカーソルの前に、行の場合は上に貼り付けする

ヤンクした範囲(または切り取りや削除した範囲)を貼り付ける。クリップボードの内容が貼り付けられるわけではないので注意

やり直す

u : やり直す(undo)
C-r : やり直す(redo)

Ctrl + ZCtrl + Yと同じ。

オペレータ(発展)

最悪後は使いながらこういう機能欲しいなあと思うたびググって覚えていけば良いと思うのですが、一応おすすめのものを適当に紹介しておきます

マクロ

これはオペレータ枠でいいのか微妙にわからないけど書いておく。定型的処理に使うと便利

q : マクロの記録開始/解除
@ : マクロの実行

qを押した後アルファベット1字を押すことでその後の操作をそのアルファベットに紐づけて記憶する。記憶した操作は、@の後にそのアルファベット1字を押すことで再現できる。

例えば

void update();
void draw();
void initialize();
void finalize();

という風にあったとして、すべての行のvoidの前にvirtualを、();の間に= 0を入れたいとき(つまり純粋仮想関数にしたい時)を考える。この時、

  • updateの行でqaと押す(aにマクロを記録)
  • Iを入力(行頭に移動して入力(インサートモード)を開始)
  • virtualと入力
  • C-[を押す(ノーマルモードに切替える)
  • f;と押す(その行の;がある位置に移動する)
  • iと押す(;の前にカーソルを移動して入力を開始)
  • = 0と入力する
  • C-[を押す(ノーマルモードに切替える)
  • qを押す(マクロの記録を終了する)
  • jを押す(drawの行に移動する)
  • @aと押す(aに記録されたマクロを実行する)
  • initializefinalizeの行でもマクロを実行する

とすることで実現できます。

ちなみにVSの補完をマクロ中の入力で使った場合補完されていない実際にキーボードで打たれた文字のみが入力されてしまうので注意しましょう。上の例でvirtualと入力するところでvirまで打ってからVSの補完機能で入力を完了した場合、マクロ使用時に入力されるのはvirのみとなります。

大文字小文字の変換

~ : 大文字小文字を変換する

hoge[f]unction();

という文章があった時にこのカーソル位置のまま~を押すと

hogeF[u]nction();

となる

再度実行

. : 最後の変更を繰り返す

ちょっと癖があって難しいが、使えると強力。使い方だけ知りたいならこことか見とけばいいかな?

コマンド

ここまでコマンドラインモードでできることに触れていなかったので簡単に説明しておこうかとおもいます。

コマンドラインモードはその名前の通りコマンド入力ができるモードです。このモードの状態で特定のコマンドを入力してEnterを押すことでそのコマンドに応じた機能を使うことが出来ます。

コマンドラインモードには:で遷移するため、それぞれのコマンドには先頭に:がついて表記される事が多いです。Vimについて調べて:から始まる操作が出てきたら、それはコマンド入力なのだと思っておくと良いでしょう。

以下、簡単なコマンドについて幾らか列挙しておきます。コマンドラインモードは特にVsVimでは制約の多いところになるので、調べたものが使えないことは多々あります(例えばコマンドラインウィンドウが使えない)。ここではVsVimで使えるものだけを書いておきますが、色々試してみて、使える便利なコマンドがあったら教えてください。

ファイルを閉じる/保存

:q : ファイルを閉じる
:!q : 変更を破棄してファイルを閉じる
:w : ファイルを保存
:wq : ファイルを保存して閉じる

ファイルを閉じたい時、そのファイルに変更がある場合は、単純にファイルを保存して閉じるか、変更を破棄してファイルを閉じる必要があります。

ハイライト

:set hlsearch : 検索文字列のハイライトを表示するようにする
:set nohlsearch : 検索文字列のハイライトを表示するようにする
:noh : 検索文字列のハイライトを表示しないようにする(次回検索時からは設定準拠)。nohかそれ以上長ければnohlsearchの途中のどこで止めてもいけるっぽい

検索した時のハイライト表示のオンオフが出来る。

置換

:s/hoge/bar/ : 現在の行の行頭から見て最初のhogeという文字列をbarに置換する :%s/hoge/bar/ : ファイル内の行頭から見て最初のhogeという文字列をbarに置換する :s/hoge/bar/g : 現在の行のhogeという文字列を全てbarに置換する :%s/hoge/bar/g : ファイル内のhogeという文字列を全てbarに置換する

以上の通り、sは置換、sの前に%をつけるとファイル全体が対象になる、最後にgをつけると全てを置換するがつけないと行頭から見て最初のものだけが置換される、くらい覚えとけば取り敢えず置換を機能としては使えると思います。

実は置換正規表現が使えたりとか便利な機能が色々あったりしますそのへんは必要になり次第ググってください。

VsVim向けのオススメ設定

疲れてきたのでこのへんでVimの説明はやめてVsVimの設定について書いておこうと思います

個人の好みもあると思うので個人的なオススメだけ紹介しておきます

C-[

ノーマルモードに戻るのにEscキーを使うのではなくC-[を使いたいが、VsVimではデフォルトではC-[は使えない(もしかするとインストール言語が日本語でなければ使えるかも)。HHKB使ってるとかでなければ有効化はほぼ必須かと思います

方法は以下の通り

  1. ツール>オプションを開く
  2. 環境>キーボードを開く
  3. 「以下の文字列を含むコマンドを表示」の欄に 「編集.選択解除」といれて、下の一覧に出てきた「 編集.選択解除」を選ぶ
  4. 「ショートカットキー」の枠内で「C-[」を押す
  5. 割り当てボタンを押す

参考 : VsVimのC-[を使えるようにする

highlight

検索等した時のハイライトがデフォルトのがあまりイケてない。VsVimの設定から変えられるオススメは以下

  • Highlight Incremental Search = Sienna (検索時のハイライトもいい感じに)

コマンド部

下のコマンドモード時に使う部分がVSのテーマがDark?だったりすると浮いてて少しダサい。CUI風にするには以下のようにすればいい

  • Command margin Background Color = Black (下のコマンド部の背景色を変えたければ)
  • Command margin Foreground Color = White (下のコマンド部の文字色を変えたければ)

vsとvimどっちのキーを優先するか

VsVimではVSのキーとVimのキーとがあるためどちらを優先するかを設定できる(というかしておかないと思ったように行かない場面が多い)

デフォルトでは全てVS優先になっていると思うのでここではVsVim優先にするかという観点で書く

VsVim優先にしたやつ

VsVimを優先にしておいたほうがよさそうなやつら

  • C-[ : 上記C-[の設定をしていれば設定しなくても大丈夫かも
  • C-d : 半分下に移動(down)
  • C-u : 半分上に移動(up)
  • C-n : 次に移動(next),補完
  • C-p : 前に移動(previous)
  • C-v : 矩形VisualMode

難しいやつ

  • C-r : VSでC-r,C-rがリネーム。意外と使いたくなったりする。Vimではredo。なお、redoも使用頻度が高い
  • C-f : VSの検索のほうが右のスクロールバーに位置が表示されたりと嬉しいことがあったりもする。Vimでは画面分のスクロール

.vimrcの設定

Vimには.vimrcという設定ファイルがあって、ここに色々書くことで簡単に設定を出来る

VsVimでは%userprofile%\.vsvimrcに書くことで自動で起動時に設定してくれるらしい
%userprofile%は、C:\Users\usernameのこと。エクスプローラ%userprofile%と打てばいいと思う

以下簡単な例

"検索時にハイライトする
set hlsearch 
"大文字小文字を区別しない
set ignorecase    
" エラーメッセージの表示時にビープを鳴らさない
set noerrorbells
" vim の矩形選択で文字が無くても右へ進める
set virtualedit=block    

突然の死

なんか疲れて雑になってきたので終わりにします

参考

VsVimのすゝめ (2) : VSおさらい編

記事の一覧

注意

この記事では例えばCtrlキーとVキーとを押す場合に、VSのショートカットキーについて言及する場合はCtrl + Vといった感じで表記しますが、VimでのショートカットキーについてはC-vといった表記をします

VSの便利な機能達

VsVimの便利さを語る前にそもそもVSで元からどういう事ができるのかに触れようと思います。

機能、といいながら取り敢えずショートカットでよく使うのを列挙してみました。VSは特にデバッグ周りを簡単にできる便利機能が本当にたくさん入っているので探してみると幸せになれると思います。

ファイル移動

Ctrl + Tab

マジクソ便利。開いたファイルの履歴を持っていてくれる。履歴は使うたび更新されるので、例えば.h.cppを行き来するのも同じキーを押すだけ。楽。キーが押しやすいのも良。

Ctrlを押したままTabを複数回押すと履歴を更に遡れる。

実は開いてるウィンドウに移動したりもできるので、キーボードから手を離さず君の起こしたその素晴らしいコンパイルエラーの箇所を見に行くことも出来る。最高にクール。

左右に移動したい時に矢印とかいうダサいもの使わなくても行ければもっとクールだったのにな

宣言/定義に移動

(Ctrl +) F12
Alt + F12

言わずもがな。Altを押していると現在の位置に宣言/定義を表示できる。宣言へ移動は実はCtrl + F12らしいが特にCtrlを押さなくても宣言に移動できる

全ての参照を検索

Shift + F12

一応シンボルで検索はかけてるみたいで同じ名前の関数(例えばupdate()とか)でも、どのクラスのアップデートかとか見てくれるんだけど、絞って表示がないせいでイマイチの使い勝手の子。一応テキスト検索もしてるのでコメント欄とかも拾ってくれたりする。ソートもできないし…小規模コードだったらこれで充分

単語単位で移動

Ctrl + 左右キー

例えば

nomalEnemyGeneratedNum = nomalEnemyPreGeneratedNum + normalEnemyGeneratedNumAtThisStep;

みたいなクソコードがあった時に、左右キーで移動すると時間がかかるけど単語単位で動けば一瞬。シングルトン使った処理書いてたりすると長くなるよね、わかる(白目)

矢印とかいうゴミを使わなければ最高だった

インクルードされたファイルに移動

Ctrl + Shift + G

#include"hoge.h"hoge.hの位置にカーソルがある時に使うとhoge.h(ファイル)に移動できる。いや、F12でいけるようにしようよ

前の位置に戻る

Ctrl + -

移動系をした後に元に戻るのに便利。ちなみにShiftもおしておくと逆方向に戻れる。

現在のファイルを自動インデント

Ctrl + K , Ctrl +D

神。インデント戦争とか言う不毛なものからドロップアウトできる。Tabだろうがスペースだろうが、設定すればいいんじゃないですかね。僕はどっちでもいいのでしてません。

気になるあの子がスペース派だとわかった瞬間設定を変えてこのショートカットを全てのソースで叩く、そういう青春もあるかもしれません。ただし、ソリューションもしくはプロジェクト内に複数設定を混在させるのはやめようね。

ショートカットはキルデスで覚えるとよろしい(?)ちなみに選択範囲のみインデントしたい場合は選択してCtrl + K , Ctrl + Fケンタッキーフライドチキンとか覚えとけばいいんじゃないすかね(適当)Ctrl押しながらKDCtrl押しながらAKFと同じ。AK47とかで覚えとけばいいかもだけどKDで足る。

関数の定義を自動生成

Ctrl +. して選択肢から「関数名ファイル名の定義を作成」

これは地味に便利。hoge.hでこれを使った場合、ちゃんとhoge.cppに定義を作ってくれるしインクルードもしてくれる。厳密にどう言う判定なのかは謎。 本来はCtrl + .は確かヒントか何かを出すキーだったはずだけどこれしか使ってない

出てきた選択肢を矢印で選択しないといけないのが辛い

補完

Ctrl + Space

シンボルで補完が出るのでスコープが違う変数がかかったり、ありもしないメンバが候補に出たりは(基本的に)しない。また、候補の横のアイコンからそれが関数なのか変数なのか等もわかる。

テンプレート引数のところで使おうとするとうまく動かないのなんとかならないですかね。

関数の宣言の参照

Ctrl + Shift + Space

関数の引数を確認したり出来る。カーソル位置の引数は太文字で表示される。オーバーロードされている場合、自分で宣言を選べる。前はデフォルトは自動で検知した合致する型のオーバーロードが表示されてたけど今は自分で選ばないといけないみたい

行ごと移動

Alt + 上下キー

行ごと移動する。上に移動する時は1行上が1行下になることになる。

矢印…

リネーム

Ctrl + R, Ctrl + R

シンボル単位で名前を変えてくれる。

名前を考えるのが苦手な僕のコードは取り敢えずclass Hogevoid Fugaが暗躍跋扈する。動くようになってcommitが近づいてきたらこいつの出番。素晴らしいコードの出来上がりで今日も拙者お疲れって感じ。

純粋仮想関数周りでたまにうまくリネームされないので何度かやらないといけなかったりする。

検索

Ctrl + F Ctrl + Shift + F

まあこれはどこでも同じ。VSで特に嬉しいことがあるとすれば合致する文字列がファイルのどこにあるか右側を見るとわかる。あと選択範囲内のみで検索可能。Shiftを押すと検索結果を一覧表示できる。目grepなどが出来たり

置換

Ctrl + H

これも同じ。VS上で特段変わる事と言えば選択範囲内のみに置換を適用する事ができるとか。新しい系列のクラス作るの面倒な時は既存のをコピって範囲選択して置換したりするのは内緒。選択範囲置換、意外と使い勝手いい。

矩形選択

Alt + 選択

選択はキーボードかマウスかで。矩形選択後にそのまま入力すると複数行に変更が入るのが便利な時がある。あとこれで範囲絞って置換が使える場面も稀にある。

矢印かマウスを使わないといけないのが玉に瑕

ステップアウト/ステップイン/ステップオーバー

F10 : ステップオーバー
F11 : ステップイン
Shift + F11 : ステップアウト

簡単に使える。最強機能なのに初心者だったりすると意外と使ってない人が多い気がする。かくいう僕も先輩に教えてもらって知りました。まあ、こういうの意外と気づくタイミングないよね。

ブレークポイント

F9

楽。これとステップ実行でめっちゃデバッグ捗る

ビルド

F5

Shiftも押すとでビルドを中止できる

コード内容を適用

Alt + F10

デバッグ実行中などにコードを変更した場合に、再度ビルドしなくてもコードの変更内容を反映できる。UIとかの位置の調節とかに便利。ただし、例えば初期化などの位置を書き換えた場合に遡及的に変更が反映されるわけではないので注意。

情報を表示する

Ctrl + K, Ctrl + I

カーソルのある位置のものについて情報を表示する。変数のコメントを見たいときや赤波線の内容を確認したいときなどに便利

取り消し

Esc

大体の行動(検索窓を開くなど)を取り消して戻れる。実行後に戻すのはundo。あくまでこれは「しようかと思ったけどやっぱやーめた」とかに使う

ブックマーク

Ctrl + K, Ctrl + K : 登録/解除
Ctrl + K, Ctrl + N : 次のに移動
Ctrl + K, Ctrl + P : 前のに移動

欲しい機会があるかはわからんが、たまに3箇所以上を行き来する必要があったりするときは便利。もしくは1つだけ登録してホーム的な使い方もできる

コピー

Ctrl + C

選択しないで押すと1行をコピーできる

切り取り

Ctrl + X

何を今更と思うかもしれないけど、選択せずに使うと1行を消せるのでたまに使う

1行切り取り

Ctrl +(Shift +) L

1行切り取る。Shiftを押すとクリップボードには入らず1行削除になる。

過去のクリップボード履歴から貼り付け

Ctrl + Shift + V

Vを連打した数だけ前のやつが見れる。何気にこれ欲しいと思ってて気付いてない人いそう。

折りたたむ/展開する

Ctrl + M,Ctrl + M

コードの規模が大きくなって来たらとりあえずこれで折りたたんで全体を眺めたりする。そもそもそんな状態の時はファイルわけをしようという話だけどなかなかそれが難しい時もあるんだよね、うん

コメントアウト/アンコメント

Ctrl + K, Ctrl + C : コメントアウト
Ctrl + K, Ctrl + U : アンコメント

頻度は高くないけど便利。ストレスが減るし、気軽にコメントアウトできる。

行頭/行末,ファイルの先頭/末尾に移動する

Home : 行頭に移動する End : 行末に移動する
Ctrl + Home : ファイルの先頭移動する
Ctrl + End :ファイルの末尾に移動する

Home,`Endキー意外と使わんやろ?Vim使わないなら便利やで。

画面単位で上下に移動する

PgUp
PgDown

Vimを使えない悲しい環境なら便利なので使ったほうがいい。画面単位で上下できるよ

Ctrlつけると画面内の一番上/下に移動出来るけどこれは滅多に使わん

まとめ

はい、とりあえずVSのオススメ機能を並べました。「そうそうこれ便利」みたいなのから「こんな機能あったのか」みたいなのもあったかもしれません。ちなみに全機能一覧なんかもあるから調べるといいかも。

VSの記事みたいな感じになってるけどそろそろVimについての話を始めようかと思います。

前の記事 : VsVimのすゝめ (1) : 背徳編 次の記事 : VsVimのすゝめ (3) : Vim説明編

VsVimのすゝめ (1) : 背徳編

はじめに

CCS Advent Calendar 2018

この記事はCCS Advent Calendar 2018]の9日目の記事として書かれました。他の記事も覗いてみると楽しいと思います!

前の記事 by @mattyan1053

次の記事 by マナ板

注意

本記事は普段VSを使っているけどVimもVsVimも使ったことがない人を対象として想定して書いています。

本記事内には一部過激な表現が見られるかもしれませんが、常にあなたが最大限好意的に解釈した場合に得られる内容が書いてあると思ってください。初心者なので間違いがあった場合はこっそり教えてください。

日本においては日本国憲法20条で信教の自由が認められているのであなたがどのような信仰を持っていても構いませんが、それは僕に対しても同様であることを忘れないでください。いずれにしても信仰は尊いものです。なんの話やねんと思いますが、宗教戦争を起こしたいわけじゃないので宣戦布告の類は勘弁してください

記事の構成について

なんか長々してきて見づらくなってきたので記事を複数に分けました。簡単なナンバリングとサブタイトル的なものをつけようと思ってますのでご容赦ください。

記事の一覧

Visual Studio

さて、皆さんエディタや統合開発環境は何を使っていますか?

僕は良くVisual Studio(以下VS)を使っています。個人であれば基本無料で使えますし、機能も豊富ということで使っている人が多いのではないでしょうか?

ですが、VSには弱点があります。唐突ではありますが、優秀な皆さんはもうお気付きかと思います。そう、「VSはVimではない」のです。「VSの数多ある機能をマスターすればVimに負けずとも劣らない作業効率が得られる」とおっしゃる方がいれば、私は「確かにそうかもしれない」というでしょう。かくいう私もそれなりにVSを使えるようになって来た頃にはそんなことを思いはしました。しかし、それは「Vimではない」のです。

実は僕は今までひたすらにVSを使ってきました。初めてもVSに捧げました。インストールディスクをPCに挿入する瞬間のあの情景と高鳴りは、一生僕の中に在り続けるでしょう。

一方で僕は、Vimをあえて遠ざけてさえいました。「ぼくのとうごうかいはつかんきょうがまけるわけない…っ!」と意固地になっていたのかもしれません。きっと、自分が崩れてしまうのが怖かったのです。

しかし、Vimを使う度にその思いにも疑念が湧いていくのを感じました。Vimは良いのでは?この操作性はもしかしたらVSよりも…いやそんなはずは… そしてやがて、スタンダードポジションから手を動かさずに済む悦びに咽び泣き、JKを指先で弄ぶその快感を忘れられない身体になっていきました。*1

とはいえ僕にも今から考えるとちっぽけな、けれどかつての僕にとってはとても大きな矜持がありました。引くに引けなくなっていたとも取れるかもしれません。「絶対にVimになんか負けたりしない!!」とVSを頑なに使い続けていたのですが、その脳裏にチラつくのはいつもVimでした。単語単位で移動しようと左手でCtrlを押し、右手をキーボードから少し離して矢印キーに移そうとする度に

「こんな時、アイツ(Vim)だったら手を離さなくていいよって言ってくれるのにな」

と、想ってはならない事を想ってしまうのです。しかし、背徳感とは何かを燃え上がらせるのでしょうか、僕の中のあんなにも頑なだった心は気付けば溶かされていき、「VSもVimも良いところがある、どちらが良いなんてものじゃないだろう」「そもそも環境とエディタじゃ土俵が…」などという苦しい言い訳をしながら、VSとVim、そのどちらにも身体を許す日々を続けている自分がいました。Vimには勝てなかったよ…

本命はVS、でも…そうやって簡単なテストコードはVimで書くようになってしまいました。今考えるとWandboxはキューピットだったのでしょう。彼の上で何度もVimに触れました。指先で弄ぶと悦ぶVimを見て、僕は興奮していました。

ですがそんなどっちつかずに揺れる僕の前に、魅力的な誘惑が持ち上がります。その誘惑はこう言いました
「どちらかを愛すのではなく、どちらも愛してしまえばいい」
僕は答えます
「そんなことは出来ない、わかっている、いつか選ばないといけないんだ」
それでも誘惑は甘く僕を誑かします
「君はどちらも愛しているのだろう?愛とは排他制御じゃないんだよ。どちらもtrue loveさ」
その言葉を聞いて世界が開けていくのを感じました。そうして僕はVSとVim、この2つとともに生きていくことを決めたのです。例えそこに困難が待ち受けているとしても…

飽きた

はい、飽きたので普通にやっていきます。VSにはVS上でもVimの機能を大凡使えるようにするVsVimという拡張機能があります。

追加するのは簡単ですが、その説明は後でするとして、一応VsVimの説明に入る前に、通常のVSの便利機能をおさらいしておきましょう。

次の記事 : VsVimのすゝめ (2) : VSおさらい編

*1:待って通報しないで最後まで読んだら意味分かるから

DXライブラリのアーカイブ化を楽にしたい

以前DXライブラリのパスワード付きアーカイブ機能を楽に使いたかったので適当なソフト作ったとかいう記事を書いたけど、そんな大層なことしなくてもよくね?ということに気づいたので手順をメモ。

簡単に言うとバッチファイルを作成して、それを叩けばいい状態にするだけ。

まずメモ帳を開いて

@echo off

::リソースフォルダの名前を指定
set ARCHIVED_NAME=image

::アーカイブファイルの拡張子の指定
set EXPANSION_NAME=ncs

::パスワード
set ARCHIVE_PASSWORD=password

:wait_delete_input

echo.

::入力受付
set /P INPUT_STR="%ARCHIVED_NAME%.dxa 及び %ARCHIVED_NAME%.%EXPANSION_NAME%を削除します。よろしいですか?(y/n)"

echo.

::入力に応じて分岐する
if "%INPUT_STR%"=="y" (
    echo 削除します
    del %ARCHIVED_NAME%.%EXPANSION_NAME%
    del %ARCHIVED_NAME%.dxa
) else if "%INPUT_STR%"=="n" (
    ::noの場合は何もしない
    echo アーカイブファイルを削除せずにアーカイブファイルを作成します
) else (
    echo エラー : y もしくは n を入力してください
    goto wait_delete_input
)

echo.

::パスワードを指定してアーカイブを呼び出す
echo アーカイブ化します
call C:\DxLib_VC\Tool\DXArchive\DxaEncode.exe -K:%ARCHIVE_PASSWORD% ./%ARCHIVED_NAME%

:wait_archive_input

echo.

::入力受付
set /P INPUT_STR="拡張子を.dxaから.%EXPANSION_NAME%に変更します。よろしいですか?(y/n)"

::入力に応じて分岐する
if "%INPUT_STR%"=="y" (
    ::拡張子がデフォルトでは.dxaなので、指定した拡張子に変更する
    echo 拡張子を指定したものに変更します
    ren *.dxa *.%EXPANSION_NAME% 
) else if "%INPUT_STR%"=="n" (
    rem noの場合は何もしない
) else (
    echo エラー : y もしくは n を入力してください
    goto wait_archive_input
)

echo.

::終了待ち
echo 終了しました
pause

exit /b 0

と書いてアーカイブ化したいリソースフォルダと同じ階層に置く。ちなみにimageアーカイブ化したいリソースフォルダの名前(本当はパスなので適当に変えても良い)に、ncsは自分のアーカイブファイルの拡張子に、passwordは使用したいパスワードに置換する。

そしてpass_archive.batとか適当な名前で保存する。

これで自動アーカイブバッチが作成されるので、アーカイブ化したいときにpass_archive.batをダブルクリックする。これだけ。

バッチファイルにそこそこコメントは書いておいたので適当に弄ってください。入力を待たない版は以下

@echo off

::リソースフォルダの名前を指定
set ARCHIVED_NAME=image

::アーカイブファイルの拡張子の指定
set EXPANSION_NAME=ncs

::パスワード
set ARCHIVE_PASSWORD=password

echo 削除します
del %ARCHIVED_NAME%.%EXPANSION_NAME%
del %ARCHIVED_NAME%.dxa

echo.

::パスワードを指定してアーカイブを呼び出す
echo アーカイブ化します
call C:\DxLib_VC\Tool\DXArchive\DxaEncode.exe -K:%ARCHIVE_PASSWORD% ./%ARCHIVED_NAME%

echo.

::拡張子がデフォルトでは.dxaなので、指定した拡張子に変更する
echo 拡張子を指定したものに変更します
ren *.dxa *.%EXPANSION_NAME% 

echo.

::終了待ち
echo 終了しました
pause

exit /b 0

githubへのプロジェクト追加手順メモ

前提

この記事はプロジェクトをgithubで管理したい時の手順をメモとして残すものである。 今回はプロジェクトの作成工程については全く触れない。また、流れを記しておくことに重きを置くので詳細には立ち入らない。

また、公開鍵や秘密鍵の登録等は終わらせているものとする。

工程の列挙

新規プロジェクトの場合

既存プロジェクトの場合

整理

新規プロジェクトであっても既存プロジェクトであっても、ローカルリポジトリとリモートリポジトリを作ってそれらを紐付けるという点では変わらないので、それらの手順を見ていく

作業内容

ローカルリポジトリの作成

sourceTreeなら新規/クローンを作成する->リポジトリを作成リポジトリを作りたいディレクトリを指定すれば良い。コマンドでやる場合もgit initなんかで行けるはず

リモートリポジトリの作成

今回はgithubの使用を前提としているのでログインして右上の+マークからNew Repositoryを選択してリポジトリ名を入れたりしてCreate Repositoryを押せば終わり。

リモートリポジトリの作成自体はgit initで出来るらしい(参考 : 簡単解説】Gitリポジトリの新規作成するinitコマンドの使い方)が、githubコマンドラインから新規作成出来るのかは知識不足でわからない。

ローカルリポジトリとリモートリポジトリの紐づけ

github上で作成してsetupをしていない場合、quick setupの案内が出ているのでurlをコピーする。

sourceTreeの場合は上野ツールバーリポジトリ->リポジトリ設定を選び、開いたウィンドウのリモートタブで追加を押してパスにリモートリポジトリのurlを、名前のところに管理に使うための名前を適当に入力する

pushしてみる

適当な初期commitを済ませたら(既存プロジェクトなら不要)commitしてみる

pushしたいブランチを選んでpushしてみてうまく行けば成功

VSで警告レベルの変更項目が見つからない

ちょっとしたことだけど、10分位頭をひねっていたのでメモ。

状況

警告レベルを最大にしたかったのでプロジェクト作成時に設定しようとしたが、プロパティを見ても項目を見つけられなかった。

プロパティから設定するんじゃないっけ?と思いググったが、やはりプロジェクトプロパティから警告レベルの変更は出来るっぽい(こちら参照。ただ個人的には警告レベルを上げるならまだしも非表示にするのはやめたほうがいいと思う)。

[構成プロパティ] のカテゴリを選択し、[C/C++] のカテゴリを選択

とあるが、その[C/C++]カテゴリが見つからない

解決

あれ?と思ったけど空のプロジェクトで作ったのが原因だった(プロジェクトが[C/C++]を認識できてなかった)

プロジェクトにmain.cppみたいなプロジェクトを作成したら無事[C/C++]カテゴリがプロパティに追加されたのでC/C++->全般->警告レベルを変更して終了。

初心者がローカル上にmastodonサーバーを立てる練習をした話

目次

注意

経緯

本記事はLinuxについて「cdでディレクトリ移動できるらしい」くらいしか知らなかった初心者が恐れ多くも知る人ぞ知るおっさん幼女先輩クソ映画大好きおじさん監視のもと、shimaidonとかいう簡易イキボタンのあるmastodon(何度見ても訳わからん)の運営に参加する為に、最低限のことを出来るようになるためしごかれた教えていただいた際、出された課題を解決するまでの経過をまとめたものである。

非常に勉強になったので同じようなことをしている人がもしいたらと思い公開することにしたが、前述の通りかなりの初心者なので間違いが多い可能性があることはご容赦願いたい。また、間違いがあった場合は指摘をいただけるとありがたい。

課題の内容

今回は以下の課題を出されたのでそれを解決する事を目的としていた。

  • mastodonサーバをVM上に構築する
    • CentOS7のminimal上に構築する
    • パッケージマネージャの使用について制限を設ける
      • 原則、更新系のものにおいては以下のもの以外使用を禁止する
        • yum groupinstall "Base"
        • yum groupinstall "Development Tools"
      • 参照系のパッケージマネージャについては使用しても良い
      • Dockerのインストールに際してとそれ以降については例外的に更新系のパッケージマネージャの使用を許可する
    • webサーバはnginxを使用する
      • 初期設定終了後は基本的にssh接続をする
  • サーバ監視を入れる

チェックポイント

上記課題に対して、以下のようなチェックポイントが課されていた

  1. サーバに外部から接続できること
  2. nginxが正常に動作していること
  3. dockerが正常に導入できていること
  4. docker-composeが正常に導入できていること
  5. mastodonのトップページがみれてトゥートできること ※外部ってのはインターネット介してでなくていい(サーバ上じゃないローカルネットワーク)

概要

というわけなので本記事はざっくりいうと

  • windows上でVMを立てて
  • そこにCentOS7 minimalを立て
  • インストールマネージャに制限のある中で
  • nginxdockerをつかって
  • 外部からアクセスできるような
  • mastodonサーバを立てる 為に頑張ったといった内容になる。

環境

ホストOS

OS:Windows 7 Ultimate Service Pack 1

プロセッサ:Intel Core i7-4790 CPU @ 3.60GHz

実装メモリ: 16.0GB

システムの種類: 64ビット オペレーティングシステム

ゲストOS

今回はホストOS上にVMを立ててそこにサーバを構築する。VMを立てるのにはVirtualBoxを使用する。今回はVirtualBox グラフィカルユーザーインターフェース バージョン 5.2.6 r120293 (Qt5.6.2)を使用した。

ゲストOSとしてはCentOS-7-x86_64-Minimal-1708.isoをイメージとして使用してOSはCentOS7 Linux release 7.4.1708 (Core)を用いた。

ターミナルソフト

sshのターミナルソフトとしてはRLogin Version 2.23.1(2018/01/30)を使用した。

VM上にOSを立てる

VirtualBoxの導入

VirtualBoxのダウンロード

VirtualBox公式のダウンロードページからWindows platform packageをダウンロードする

VirtualBoxのインストール

VirtualBox-5.2.6-120293-Win.exeと言った感じの名前のファイルを実行して、インストーラに従ってインストールする。

インストールが終了したら起動する。

OSの入手

CentOSダウンロードページからMinimal ISOを選択してダウンロードする。

仮想マシンを作成する

名前とOS

上部メニューから「新規(N)」を選択し、好きな名前をつけ、「タイプ(T)」をLinuxに、「バージョン(V)」をRed Hat(64bit)にして次へを押す。名前をCentOS等にすると自動でタイプとバージョンは設定されるので基本それでいいはず。ここでは名前をCentOS7にする。

同名で作成できない

同名の仮想マシンを作成しようとすると「仮想マシンのフォルダー{仮想マシン名}を親フォルダ{仮想マシンの置かれるフォルダ名。C:/Users/***/VirtualBox VMsとか}に作成できません。 このフォルダーは既に存在し、ほかマシンに属している可能性があります」と出る。もし元の仮想マシンが既に必要ないなら、そこでVirtualBox上で「右クリック->除去」から「すべてのファイルを削除」すると新しく同名の仮想マシンを作成できるようになる。

モリーサイズ

ここでは余裕を持って8192MBメモリとする。

ハードディスク

「仮想ハードディスクを作成する」を選択して「作成」を押す。

ハードディスクのファイルタイプ

書いてある通り、他の仮想ソフトウェアで使用する必要がなければ設定はVDI(VirtualBox Disk Image)のままにして「次へ」を押す。

物理ハードディスクにあるストレージ

「可変サイズ」を選択して「次へ」を押す。

ファイルの場所とサイズ

名前はそのままでVM名とおなじになっていると思うのでそのままでいい。仮想ハードディスクは「20.00GB」にして「作成」を押すと、VMが作成される。

起動する

作成したVMをダブルクリックもしくは上部メニューの起動から起動する。「開始したい新しい仮想マシンを含むディスクのある、仮想高額ディスクか、ディスクが挿入されている物理光学ドライブを選択してください。 このディスクはコンピューターを起動することができ、仮想マシンにインストールしたいオペレーティングシステムを含んでいなければなりません。このディスクは仮想マシンをオフにした次の回に自動的に取り出されますが、必要であればデバイスメニューから取り出すこともできます」と出ていたらここでCentOS7のシステムイメージを設定する。CentOS-7-x86_64-Minimal-1708.isoと言った感じのもの。そうしたら「起動」を押してOSのインストールに進む

CentOSのインストール

Test this media & Install CentOS7を選択すると色々走った後にGUIが起動する。

言語は「日本語」を選択して次へ進む。

「システム」の「インストール先」を設定しないとインストールを開始できないが、クリックして設定画面に入ったら何もせず「完了」を押して元の画面に戻れば自動パーティションに自動で設定されるので「インストールの開始」を押して次に進む。

インストールしてるうちにrootパスワードとユーザを作成しておく。そうしたら「設定終了」を押す。

再起動しろと言われるのでそれに從う。

これでインストールは終了。

ネットにつなげる

ネットに繋がらない

$ nmcli device

でネットワークインターフェースを確認する(参考)と、

DEVICE  TYPE      STATE         CONNECTION
enp0s3  ethernet  disconnected  --

と表示されたら接続されていない。

自動起動設定をオンにする

# nmcli c mod enp0s3 connection.autoconnect yes

再起動

インターネットへの自動接続設定をしたなら、設定を反映させるためにネットワークデーモンを再起動する

$ service network restart

つながったか確認

$ nmcli device

を実行して

DEVICE  TYPE      STATE         CONNECTION
enp0s3  ethernet  connected     enp0s3

となっていたらOK。

SELinuxを永続的に無効にする

SELinuxとは

wikipediaによると

Security-Enhanced Linux (SELinux) は、アメリカ国家安全保障局 (NSA) がGPL下で提供しているLinuxカーネルに強制アクセス制御 (MAC) 機能を付加するモジュールの名称。

こいつが有効になっているとその強力なアクセス制限のせいで作業中に躓く事があるので切っておく。

有効無効を確認する

参考:SELinuxを無効化する

SELinuxが有効かを確認する

$ getenforce

を実行する。表示される内容によって現在の状態がわかる。

表示される内容 意味
enforcing SELinux機能、アクセス制御が有効
permissive SElinuxは警告を出力するが、アクセス制限は無効
disabled SElinux機能、アクセス制御が無効

永続的に無効にする

今回は永続的に無効にすることを考える。SELinuxの設定ファイルは/etc/selinux/configなので、

# vi /etc/selinux/config

でこれを開き、

SELINUX=enforcing

とある行を

SELINUX=disabled

と書き換える。設定を反映させるためにrebootコマンド等で再起動する。

sudoを使えるようにする

sudoとは?

sudoコマンドは他のユーザや他のグループの権限でコマンドを実行できるコマンド。特に指定せず実行した場合、スーパーユーザとして実行したことになる。

スーパーユーザとしてコマンドを実行したい場合、ユーザを変更出来るsuコマンドで一旦スーパーユーザになってから実行するという方法があるが、コマンド実行後また元のユーザに戻らなければならないのは煩雑だし、かといってスーパーユーザで作業をするのは危険だし…という問題があるが、こういう場合はsudoを使うと良い。

sudoがデフォルトで許可されているユーザグループに属す

CentOSではデフォルトでsudoできるグループとしてwheelグループが用意されているため、追加した一般ユーザーをwheelグループに追加し、sudoできるようにする。余談だが、Debianの場合は、sudoグループがデフォルトでsudo出来るグループとして用意されている(出典)。

# usermod -aG wheel {ユーザー名}

でサブグループを追加する。

アカウントが既にサブグループに入っているかわからなければidコマンド

$ id {ユーザ名}

とすれば確認できる。

クライアントからのssh接続での操作ができる環境を作る

参考: - Linux(CentOS7)でSSHを利用する。 - CentOS7.3でSSH接続(パスワード認証)する方法

前提

VM上からだと何かと使い勝手が悪いのでsshクライアント(ここではRLogin)を使ってゲストOSであるCentOSにアクセスするようにする。

SSHサーバーはプリインストールされているのでその先をやる。

SSHサーバ(CentOS)側の設定

SSHの設定

/etc/ssh/sshd_configを開いて

変更箇所 変更後
#PermitRootLogin yes PermitRootLogin no
#PasswordAuthentication yes PasswordAuthentication yes
#PermitEmptyPasswords no PermitEmptyPasswords no

と書き換え保存して終了する。

サービスの起動

以下のコマンドを実行してSSHのサービスを起動する

# systemctl start sshd.service

実行したら以下のコマンドでサービスが起動できているか確認する

# systemctl status sshd.service

緑の字でactive (runnning)と表示されていたらSSHのサービスが起動している。

ファイアウォールの設定

SSH用のポート(22番ポート)はMinimal ISOでも元から開放されているので、設定は不要。

もし開放されていなかったとしても、CentOS7ではsshdと同様firewalldsystemdで管理されているので

# systemctl stop firewalld.service

とすれば停止して取り敢えず接続確認は出来る。

一般ユーザの作成

先ほどrootユーザーによるリモートログインを禁止したので、リモートログインするための一般ユーザを準備する。とはいえ、既にリモートログインしたいユーザがあるのであればわざわざ追加する必要はない。

以下、一般ユーザが準備できていない場合について書く。

一般ユーザーを追加する

# useradd {ユーザー名}

追加した一般ユーザーにパスワードを設定する。

# passwd {ユーザー名}
  • New password:
  • Retype new password:

でパスワードを2回入力したら、パスワードの設定は完了。

IPアドレスの確認

$ ip a show enp0s3

IPアドレスをメモしておく

クライアント側の設定

ターミナルソフトはRLoginを使う

ホストOS側のipアドレスの確認

ホストOS(Windows)で、Windows+Rを押して出てきたウィンドウにcmdと入力してEnterを押してコマンドプロンプトを起動したら、ipconfigコマンドを実行する。

イーサネット アダプター ローカル エリア接続」みたいに書いてあるところの「IPv4 アドレス」をメモする。

VM(VirtualBox)の設定

参考:ローカルPCとVirtual Boxの仮想マシンとのネットワーク接続、どうなってる?

NATやポートフォーワードの設定をしないとゲストOSにはアクセスできないのでそれをやる。

環境設定

  1. ウィンドウ上部タブの「ファイル->環境設定」をクリックし、でてきたウィンドウの左カラムから「ネットワーク」をクリックする。
  2. 右カラムに、上に「NATネットワーク」と書かれた空のボックスがあるのでその右にある「+」のついたマーク(マウスオーバーすると、「新しいNATネットワークを追加します。」と出るところ)をクリックする。
  3. 空だったボックス内に新たに「NatNetwork」という名前のネットワークが作成されるので、それをダブルクリック、もしくは選択した状態で右の歯車の付いたマークをクリックして、編集(NATネットワーク詳細)ウィンドウを開く。
  4. ネットワーク名(N):」を好みのものに変え(今回は変更しない)、下にある「ポートフォワーディング(P)」と書かれたボタンをクリックする。
  5. また空のボックスの表示されたウィンドウが開く。上部タブの「IPv4」が選択されている事を確認し、右の「+」のついたマークをクリックする。

そうすると空のボックス内に「Rule 1」という新しいルールが追加されるので、

項目名
名前 わかり易い名前に任意に決める。ここでは「sshRule
プロトコル TCPのままにしておく
ホストIP ホストOS(Windows)のコマンドプロンプトipconfigコマンドを使って確認したアドレスを指定。今回は「192.168.2.100
ホストポート ウェルノウンポート(0~1023)を避けて指定する今回は「2022」にした
ゲストIP ゲストOS(CentOS)でip a showコマンドを実行して確認したアドレスを指定。今回は「10.0.2.15」にした
ゲストポート 22」を指定

としたらOKを押して「環境設定」は終了。

仮想マシンごとの設定

  1. 接続したい仮想マシンを選択し、上にある「設定(S)」をクリックするか、右クリックメニューから「設定(S)」を選択するとウィンドウが開くので、左カラムから「ネットワーク」をクリックする。
  2. 右カラムのタブが「アダプター1」になっているのを確認したら、「割り当て(A):」を「NATネットワーク」にする。そうすると下に「名前(N):」という項目が操作可能になるので、ここでさっき作成した「NatNetwork」を指定する。

OKを押したらこれでVM側の設定は終了なので、ターミナルソフト側の設定に移る。

ターミナルソフト(RLogin)の設定

左上の電源プラグの様なマークの「サーバー接続」をクリックすると「Server Select」ウィンドウが開くので、右のボタンから「新規(N)」をクリックする。そうするとサーバーエントリーを設定するウィンドウが開くので

|項目名|値| |:--|:--| |エントリー(上段)|任意の名前。今回はVM_CentOS7とした。| |プロトコル|sshを選択| |Server Address|ホストIPを入力。今回は「192.162.2.100」を入力| |Socket Port|VMでホストポートとして指定したポートを入力。今回は「2022」| |User Name|ユーザ名を入力。今回はinaenomaki| |Password/Phrase|ユーザのパスワードを入力| |Term|xtermを指定| |デフォルト文字セット|UTF-8を指定| 残りは空欄もしくはチェックは外しておく。

これで設定は完了。

英語に直す

ここを参考に

# localectl set-locale LANG=en_US.UTF-8

として再起動する。

[inaenomaki@localhost ~]$ localectl status
   System Locale: LANG=en_US.UTF-8
       VC Keymap: jp
      X11 Layout: jp

と英語になっている。

前準備

許可されているパッケージマネージャ

# yum groupinstall "Base"
# yum groupinstall "Development Tools"

を実行する

作業ディレクト

以下は /home/inaenomaki 下で行った

Webサーバーを立てる

nginxに必要なものを予め用意しておく

nginxとは

「nginx(えんじんえっくす)とは、ロシア人のIgor Sysoe氏によって作られたメモリ使用量の少ない高速なオープンソースのWebサーバー」だ(出典)。今回はこれを使う。

PCREの用意

ダウンロード

$ wget http://sourceforge.net/projects/pcre/files/pcre/8.36/pcre-8.36.tar.gz

展開

$ tar xvzf pcre-8.36.tar.gz

zlibの用意

ダウンロード

$ wget http://zlib.net/zlib-1.2.11.tar.gz

展開

$ tar xvzf zlib-1.2.11.tar.gz

nginxの用意

ダウンロード

$ wget http://nginx.org/download/nginx-1.7.7.tar.gz

展開

$ tar xvzf nginx-1.7.7.tar.gz

nginxのインストール

configure

構成としては

となっているので、

$ cd ~/nginx-1.7.7/

してひとつ下のディレクトリに入った後

$ ./configure --prefix=/usr/local/lib/nginx-1.7.7 --with-pcre=../pcre-8.36 --with-zlib=../zlib-1.2.11

としてソースディレクトリを指定する。

make

$ make

make install

$ sudo make install

実行ファイルのパスを通す

/usr/local/bin/がスーパユーザ・一般ユーザ共にパスが通っているので

 $ sudo ln -s /usr/local/lib/nginx-1.7.7/sbin/nginx /usr/local/bin/

としてnginxの実行ファイルへのシンボリックリンクを貼る

sudo時にもパスが通るようにする

visudosudoersを開き、

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/lib/nginx-1.7.7/sbin/

こうしてsudoersを保存してlessでちゃんと変更されていることを確認する。

sudoで実行してみると

[inaenomaki@localhost ~]$ sudo nginx -v   
[sudo] password for inaenomaki:    
nginx version: nginx/1.7.7   

ちゃんとsudoでも実行できるようになった。

nginxをサービス化する

定義ファイルを作成する

公式サイトの提供している定義ファイルを少し変えて使う(参考)。

/etc/systemd/systemに定義ファイルを置く。

$ sudo vi /etc/systemd/system/nginx.service

として

[Unit]   
Description=The NGINX HTTP and reverse proxy server   
After=syslog.target network.target remote-fs.target nss-lookup.target   
   
[Service]   
Type=forking   
PIDFile=/usr/local/lib/nginx-1.7.7/logs/nginx.pid   
ExecStartPre=/usr/local/lib/nginx-1.7.7/sbin/nginx -t   
ExecStart=/usr/local/lib/nginx-1.7.7/sbin/nginx   
ExecReload=/bin/kill -s HUP $MAINPID   
ExecStop=/bin/kill -s QUIT $MAINPID   
PrivateTmp=true   
   
[Install]   
WantedBy=multi-user.target

とする。

Unitがサービスとして認識されたか確認する

$ sudo systemctl list-unit-files --type=service | grep nginx

nginx.serviceが表示されていれば認識されている。

サービスを有効化する

$ sudo systemctl enable nginx

実行すると

Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /etc/systemd/system/nginx.service.

と出てシンボリックが作成される。

サービスを有効化出来たか確認する

$ sudo systemctl list-unit-files --type=service | grep nginx

nginxを起動する

$ sudo systemctl start nginx

起動できたか確認する

$ sudo systemctl status nginx

Active: active (running)となっていれば大丈夫。

ポートフォワーディングを設定する

VM上ではnginxは起動したように見えるので、きちんとそこに接続できるか試す。本来ならnginxの起動しているPCのアドレスにアクセスすればそれで済むのだが、今回はゲストOS上でnginxを動かしていて、ホストOSのブラウザからnginxにアクセスして接続できるか・正常に動いているかを確認したいので、ssh接続の時と同じくポートフォーワーディングを設定する。

VirtualBoxの設定を変更する

前回と同じく、ファイル->環境設定から開いたウィンドウの左カラムでネットワークを選択し、右カラムでssh接続する時に作ったNatNetworkをダブルクリックもしくは選択してOKを押す。またウィンドウが開いたらポートフォーワードをクリックして更にウィンドウを開き、IPv4タブになっているのを確認したら、右のプラスマークの新規ポートフォワーディングルールを追加します。からルールを追加し、

項目名
名前 ルールの名前。ここではhttpRuleとした
プロトコル TCP
ホストIP ホストOSのIPアドレス。ここでは192.168.2.100
ホストポート ポートフォワーディングするホストOSのポート。ここでは8888とした
ゲストIP ゲストOSのIPアドレス。ここでは10.0.2.15
ゲストポート ゲストOSの転送先のポート。http接続をするつもりなので80を指定

としたらOKを押して閉じる。(参考:外部からVirtualBox内のサーバにアクセス)

ポート開放する

デフォルトだとfirewalldがアクセスさせてくれないのでTCPの80番ポートを開ける。

$ sudo firewall-cmd --zone=public --add-service=http --permanent

として恒久的に開く設定にし、

$ sudo firewall-cmd --reload

で設定を反映する

$ sudo firewall-cmd --list-all

serviceshttpが追加されていれば大丈夫。

接続できるか確認する

ブラウザ上からhttp://192.168.2.100:8888/と指定してアクセスする

Welcome to nginx! If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org. Commercial support is available at nginx.com.

Thank you for using nginx.

と出れば上手くいっている。

PC内からアクセス確認したいのであれば

$ curl localhost:80

とすればいい。

Dockerの導入

Dockerとは?

Wikipediaによると

Docker(ドッカー)はコンテナ型の仮想化環境を提供するオープンソースソフトウェアである。

雑に読んだ感じ、物理的に1つのサーバ上に、無駄を少なく複数のアプリケーションを走らせたいという要請から考えられた概念がコンテナ型の仮想化であり、これを提供するソフトウェアがDockerという感じ。

今回はMastdonをコンテナとして扱う事を目指すのでこれを使う

古いバージョンの確認

古いバージョンのdockerが入っているとうまくいかないことがあるらしいので入っていない事を確認する。

$ yum list installed | grep docker

として何も表示されなければ問題ない。

厳密にやりたいのであれば

$ yum list installed | egrep 'docker(|-(client(|-latest)|common|latest(|-logrotate)|logrotate|selinux|engine(|-selinux)))' 

とする。(-Eオプションは拡張正規表現の使用参考)

必要なパッケージのインストール

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

をして必要なパッケージをインストールする

リポジトリの追加

$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

を実行してリポジトリを追加する。

無事/etc/yum.repos.d/docker-ce.repoリポジトリが保存されれば成功。

リポジトリの更新

$ sudo yum makecache fast

ここではyumリポジトリが最新である事を確認して更新している。

Docker CEのインストール

リポジトリ(/etc/yum.repos.d/docker-ce.repo)の設定も終わったので、インストールをする。

$ sudo yum install docker-ce

Dockerを起動する

$ sudo systemctl start docker.service

としてDockerを起動する。 Active: active (running)となっていれば

正しくインストールされているか確認する

dockerが正しくインストールされているのを確認するため、hello-worldイメージを実行する。

$ sudo docker run hello-world   

上手く行けば良い感じのメッセージが表示される。

Docker Composeの導入

参考: - 複数のDockerコンテナを自動で立ち上げる構成管理ツール「Docker Compose」(Dockerの最新機能を使ってみよう:第7回) - docker-composeを使うと複数コンテナの管理が便利に - Docker Compose - Docker Compose のインストール

公式でも必要としているのでDocker Composeを入れる。

Docker Composeって?

複数のコンテナを使うDockerアプリケーションを定義・実行するためのツール(参考)で、コマンドを1つ実行するだけで、設定した全てのサービスを作成・起動する事ができる(参考)

設定された依存関係に応じて適切な順番でコンテナが起動されるようになっており、コマンド1つで簡単に必要なサービスを開始できたり、逆にコンテナを停止させる際も、自動的に適切な順番でコンテナを停止させるようになっている。

Docker Composeのダウンロード

GitHub上にあるComposeリポジトリのリリース・ページに移動し、指示に従いcurlコマンドを実行する。

$ sudo curl -L https://github.com/docker/compose/releases/download/1.20.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

としたらうまくいった。

権限の追加

参考:パーミッションなどを設定する!chmodコマンドの詳細まとめ【Linuxコマンド集】

$sudo chmod +x /usr/local/bin/docker-compose

sudo時にもパスが通るようにする

docker-compose/usr/local/binにあるので一般ユーザにはパスは通っているが、sudo時のパスは通っていないので通す。visudosudoersを開き、

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/lib/nginx-1.7.7/sbin/:/usr/local/bin/

とする。

動いていることを確認

$ docker-compose --version

$ sudo docker-compose --version

として、バージョンが表示されれば大丈夫

Mastdonを導入する

前提

これからダウンロードするMastdonプロジェクトには、Dockerfiledocker-compose.ymlが含まれていて、これはDocker Composeの少なくともバージョン1.10.0で必要とされる。これらの関係については、Dockerで雑にMastodonを起動する方法にわかりやすい図があるので良さげ。以下その図

いい図

入れるバージョン

最新版Mastodonはローカルに立てるのは非常に面倒くさい。よってここではMastodonv2.0.0を入れる。

参考

v2.0.0の最新コミットは2017/10/19だったので、最新版ではなく2017/10/27にコミットされた際の過去のDocker-Guideを参考に

v2.0.0をclone

cloneする。

$ git clone -b v2.0.0 https://github.com/tootsuite/mastodon mastodon_v2

移動

$ cd mastodon_v2/

以下特に断りが無ければここで作業

checkout

cloneの際にメッセージが出ていたのでcheckout(参考)

$ git checkout refs/tags/v2.0.0

設定ファイルのコピー

$ cp .env.production.sample .env.production

設定ファイルを変更する

.env.productionLOCAL_HTTPSfalseにする。ついでにLOCAL_DOMAINsaigoudon.netにする

# Federation
# Note: Changing LOCAL_DOMAIN or LOCAL_HTTPS at a later time will cause unwanted side effects.
# LOCAL_DOMAIN should *NOT* contain the protocol part of the domain e.g https://example.com.
LOCAL_DOMAIN=saigoudon.net
LOCAL_HTTPS=false

こうなったら大丈夫。

docker-compose.ymlの変更

docker-compose.yml

image: gargron/mastodon

となっている所を

image: gargron/mastodon:v2.0.0

としておいた。ここについてはcloneしてくるバージョンを指定するだけでいいのかこれも必須なのか要確認。

log保存用ディレクトリの作成

今更だがlog保存用ディレクトリを作って、以降ここにlogを残しておく。

$ mkdir mylogs

| tee mylogs/docker-compose_build.logを後ろにつけてlog保存用ディレクトリにも結果を残す。teeコマンドは、標準入力で受け取ったものを、標準出力と指定された出力先にそれぞれ出力するコマンド。

イメージのビルド

$ sudo docker-compose build | tee mylogs/docker-compose_build.log

secretsの生成と設定

以下を三回実行してそれぞれ生成されたsecretを何処かにメモしておく

$ sudo docker-compose run --rm web rake secret

その後

$ sudo vi .env.production

して.env.productionを開き、

# Application secrets
# Generate each with the `RAILS_ENV=production bundle exec rake secret` task (`docker-compose run --rm web rake secret` if you use docker compose)
PAPERCLIP_SECRET=f3fa3a(略)a220c7f
SECRET_KEY_BASE=96304(略)e848323
OTP_SECRET=1933c7(略)79b21e5

  • PAPERCLIP_SECRET
  • SECRET_KEY_BASE
  • OTP_SECRET

のそれぞれ=の右に入力した。

VAPID_keysの生成と設定

今度は

$ docker-compose run --rm web rake mastodon:webpush:generate_vapid_key

を実行してVAPID_PRIVATE_KEY=の右側とVAPID_PUBLIC_KEY=の右側をメモしておき、.env.production

  • VAPID_PRIVATE_KEY
  • VAPID_PUBLIC_KEY

にそれぞれ書き込む

# VAPID keys (used for push notifications
# You can generate the keys using the following command (first is the private key, second is the public one)
# You should only generate this once per instance. If you later decide to change it, all push subscription will
# be invalidated, requiring the users to access the website again to resubscribe.
#
# Generate with `RAILS_ENV=production bundle exec rake mastodon:webpush:generate_vapid_key` task (`docker-compose run --rm web rake mastodon:webpush:generate_vapid_key` if you use docker compose)
#
# For more information visit https://rossta.net/blog/using-the-web-push-api-with-vapid.html
VAPID_PRIVATE_KEY=VBOB(略)qX_l1NgSLA=
VAPID_PUBLIC_KEY=BHLWTwr9MW_QE74n8_b(略)C8g=

データベースの作成

$ sudo docker-compose run --rm web rake db:migrate

うまくいかない時は

バージョンは違うが、v2.3.0のリリースノートもしくはその日本語訳を見ると、

Troubleshooting
If you are using Docker with docker-compose and are getting a PG::ConnectionBad: could not translate host name "db" to address: Name does not resolve, you might have to do docker-compose down (make sure you were using volumes so you won't lose data!) before you can run any further docker-compose commands.

トラブルシューティング Dockerでdocker-composerを使用し、PG::ConnectionBad: could not translate host name "db" to address: Name does not resolveが出る場合、docker-composeコマンドを走らせる前に、docker-compose down(Volumesを使用し、データを失わないようにしてください!)を実行する必要があるかもしれません」 とある。

プリコンパイル

$ sudo docker-compose run --rm web rake assets:precompile | tee mylogs/asetts_precompile.log

起動

$ sudo docker-compose up -d

errorが出てうまくいかない時は

別にmastodonを構築しようとしていたなら、それが邪魔をしている可能性があるのでそれらをdocker-compose downする。

状態の確認

$ sudo /usr/local/bin/docker-compose ps

動いていれば全てのStateUpになっているはず。

接続テスト

ポートフォワードのmastodonRuleはホストポート3333、ゲストポート3000にした。 Chromeからhttp://192.168.1.3:3333/に接続する。

内部から接続すると

[inaenomaki@localhost mastodon_v2]$ curl localhost:3000
<html><body>You are being <a href="http://localhost:3000/about">redirected</a>.</body></html>

起動までに時間がかかることもあるので注意。

起動したかを確認するのには、docker-compose logs

$ sudo docker-compose logs -f

として起動したことを確認すると良い。

こうして、無事立てることに成功した。

Mackerelでmastodonサーバを監視する

参考:Mackerelをはじめる

Mackerelとは?

Mackerelは複数のサーバーのリソース状況やサービスのパフォーマンスを可視化、監視するためのサービスのこと。

Mackerelでは、mackerel-agentと呼ばれるプログラムをサーバーにインストールすることでホストを登録する。協調してはたらくホストをまとめる『サービス』、サービス内のホストの役割である『ロール』によってホストを管理し、エージェントが収集したホストの状況をウェブ上で視覚的に確認できる

またMackerelでは、ユーザはオーガニゼーション(団体、組織)に所属し、複数人で共同で管理を行うことができる。

オーガニゼーションの作成

ページ左上あたりからオーガニゼーションの作成をする。

ここではmylocal-mastodonという名前でオーガニゼーションを作成した。

プランはTrialにしたが、Freeでもよさそう。(要確認)

オーガニゼーションのトップページのinstructionによると、


1. 最初のオーガニゼーションを作成

{自分の登録メールアドレス}さんが所属するひとつめのオーガニゼーションをつくります。


2. 新規ホストを登録する

Mackerelにホストを登録するには、登録したいホストにmackerel-agentをインストールする必要があります。


3. サービスをつくってみましょう

Mackerelでは、協調してはたらくホスト群をまとめる『サービス』と、
サービス内の役割である『ロール』を使ってホストを管理します。
サービスをつくることで、複数台のホストの状態を一画面で素早く確認できるようになります。


4. ロールをつくる

エージェントをインストールしたホストを実際にサービスの一員として認識させるためには、
ホストのサービスにおける役割である『ロール』が必要です。
サービスのページから新しいロールを作成できます。


5. ホストにロールを紐付ける

作成したロールにホストをひもづけてみましょう。
ホストの一覧から、ロールを設定してください。あるいは、各ホストの設定画面から紐付けることもできます。


おめでとうございます!

ここまでの操作で基本的なMackerelにおけるリソース監視ができるようになりました。
ここからは、もう一歩進んだ使い方を紹介します。


ホストやサービスなどの監視をする

監視対象がどのような条件を満たした時に異常な状態であるかを決める監視ルールを設定できます。
監視ルールの条件をもとに発生したアラートはアラート一覧画面から確認できます。


アラートの通知先を振り分ける

発生したアラートの通知先を特定のサービスや監視ルールごとに自由に分類・設定できます。
プロジェクトチームや職種別チームなど、組織の開発スタイルに合わせた通知先の運用に便利です。


共同管理者を招待する

Mackerelでは、オーガニゼーションごとに共同の管理者を指定・招待できます。
オーガニゼーションの詳細ページから招待メールを送信してください。


という手順で進んでいくのでこれに從う。

新規ホストの登録

「新規ホストの登録」を押すと、使用OSを聞かれるのでCentOS/RedHatを選択してプルダウンメニューに書いてある

$ curl -fsSL https://mackerel.io/file/script/setup-all-yum-v2.sh | MACKEREL_APIKEY='(略)' sh

を実行する。

動作の確認がしたければ

$ sudo journalctl -u mackerel-agent.service

とする。

サービスを作る

「新しいサービスを作成」からサービスを作る。ここではサービス名はmastodonにした。

ロールを作る

「新規ロールを作成する」からロールを作る。ここではロール名はwebにした。

ホストにロールを紐つける

左カラムの「Hosts」を選択するとホスト一覧が表示されるが、さっき追加したホストの「サービス/ロール」の所に「ロールを設定」ボタンがあるのでこれを押す。そうしたらさっき作ったロール(mastodon: web)が表示されるので選択して「更新」を押す。

dockerのメトリクスをとれるようにする

参考:Dockerをモニタリングする

エージェントが基本的なメトリクスについてはとるようにするので、dockerのメトリクスを設定して取れるようにする。

Dockerコンテナの消費リソースを把握するには、Dockerが利用しているリソースの統計情報を参照する。Dockerのリソースの統計情報はAPIを利用して取得する。技術的な詳細は公式ドキュメントを参照のこと。

Mackerelではmackerel-plugin-dockerを利用することで、各コンテナのリソース消費の統計情報を取得しカスタムメトリックグラフとして可視化することができる。 mackerel-plugin-dockerは公式プラグイン集に含まれてるので、まずは公式プラグイン集をインストールする。

公式プラグイン集のインストール

参考ミドルウェアのメトリック可視化に公式プラグイン集を使う

$ sudo yum install mackerel-agent-plugins

でインストールする。

[inaenomaki@localhost ~]$ sudo yum install mackerel-agent-plugins
[sudo] password for inaenomaki: 
Loaded plugins: fastestmirror, langpacks

(略)

Installed:
  mackerel-agent-plugins.x86_64 0:0.46.0-1.el7.centos

Complete!

となったら成功。

プラグイン/usr/binにインストールされているので、mackerel-agentの設定ファイルに、利用するプラグインに合わせて以下のような設定を追加する。設定の反映には、mackerel-agentの再起動が必要となる。

設定の追加

プラグイン集がインストール出来たら、以下の設定を/etc/mackerel-agent/mackerel-agent.confに追記する。

[plugin.metrics.docker]
command = "mackerel-plugin-docker -name-format name"

これにより、そのホスト上で動作するDockerコンテナのCPU使用率メモリ消費量IO使用量(IOPS、転送バイト数とキュー長)が可視化される。

設定の反映には、mackerel-agentの再起動が必要なので再起動する。

$ systemctl restart mackerel-agent.service 

これでHostsのカスタムメトリックにDockerのメトリックが表示されるようになる。

ログ監視を行う

参考:ログ監視をおこなう

目標

/var/log/messageserrorという文字列が出力されたかどうかを監視したい。

公式チェックプラグイン集のインストール

参考:チェック監視に公式チェックプラグイン集を使う

$ sudo yum install mackerel-check-plugins

を実行する。

[inaenomaki@localhost etc]$ sudo yum install mackerel-check-plugins
[sudo] password for inaenomaki: 
Loaded plugins: fastestmirror, langpacks

(略)

Installed:
  mackerel-check-plugins.x86_64 0:0.18.0-1.el7.centos

Complete!

とでたら成功

check-logを使う

check-logを使ってログ監視を行う。特定ファイルの特定文字列の出現について検出したい場合、/etc/mackerel-agent/mackerel-agent.confを開き、

[plugin.checks.access_log]
command = "check-log --file {監視したいファイル名} --pattern {検出したい文字列}"

と追記する。つまり、--fileオプションに監視対象のファイルを、--patternオプションに、エラー文言を検出したいパターンを正規表現で指定する。

今回は/var/log/messageserrorという文字列が出力されたかどうかを監視したいので、/etc/mackerel-agent/mackerel-agent.confを開き

[plugin.checks.access_log]
command = "check-log --file /var/log/messages --pattern error"

と追記する。

設定の反映には、mackerel-agentの再起動が必要なので再起動する。

$ systemctl restart mackerel-agent.service 

ログ監視が無事追加されていれば「Hosts」で「Host」を選んだ時の右の「Monitors」に

 access_log
LOG OK: 0 warnings, 0 criticals for pattern /error/.

と表示される。

Monitorsの方から見ても見えないのが何故かわかっていないので要確認。

アラートが自動クローズされないようにする

追加したログ監視について、アラートがでた時に自動でクローズしないようにしたい。

そのためには/etc/mackerel-agent/mackerel-agent.confのログ監視の項目にprevent_alert_auto_closeのオプションを追加するといい(参考1,参考2)。

よって、

[plugin.checks.access_log]
command = "check-log --file /var/log/messages --pattern error"
prevent_alert_auto_close = true

とさっき編集したところをprevent_alert_auto_close = trueを追加する形で書き換える。

設定を反映させるためにmackerel-agentを再起動する。

[inaenomaki@localhost log]$ systemctl restart mackerel-agent.service 

これでアラートが自動クローズされなくなった。