システムの信頼性を向上させる方法
【結論】
システムの信頼性を向上させるには、同じ構成を2系統用意すれば良い
信頼性と費用には相関関係がある。
【目次】
はじめに
スポーツの大会では、試合当日や試合中に選手が怪我をして試合を続行できなくなった時の交代要員として補欠を用意します。
これと同じ考えは、システムを構築する上でも必要になってきます。
システムや機器が故障した際に迅速に復旧できるように、同じシステムを2系統用意しておき、普段は片方を稼働させ、もう片方は待機させておきます。
この方式をデュプレックスシステムといいます。
稼働しているシステム(1系)に対して、待機させる側のシステム(2系)の状態によって、下表のように分類されます。
方式名 | 1系 | 2系 | 耐障害性 | 運用コスト |
---|---|---|---|---|
ホットスタンバイ | 稼働 | 常時1系と同期を取り、直ぐに交代できるように待機。 | 高 | 高 |
ウォームスタンバイ | 稼働 | 1系と動機を取らずに待機。 | 中 | 中 |
コールドスタンバイ | 稼働 | 機器の電源を入れずに待機。 | 低 | 低 |
ホットスタンバイ
同じシステムを複数用意し常時同期を取得するため、障害発生時は短時間で復旧できます。
さらに、平常時は複数のシステムで処理を行えるため、サービス品質の向上にも繋げることができます。
しかし、同じシステムを複数構築し運用する必要があるため、お金もかかります。
ウォームスタンバイ
ホットスタンバイ同様に同じシステムを複数用意はしますが、リアルタイムでの同期は行わないため、平常時の運用コストは下げることができます。
しかし、障害の発生時は、メイン系から待機系への処理の引き継ぎが発生するため、ホットスタンバイと比べると復旧時間はかかります。
コールドスタンバイ
普段は別の用途で使用し、障害発生時に手動で切り替える方式。
一番運用コストは安いが、障害発生時の影響が一番大きい。
参考情報
デュプレックスシステムとは - IT用語辞典 e-Words
ホットスタンバイ(ホットスペア)とは - IT用語辞典 e-Words
コールドスタンバイ(コールドスペア)とは - IT用語辞典 e-Words
さいごに
現場で聞こえてくる話をカレーを作る場合で例えてみました。
お客さん:「カレーを作ってください。」
ITエンジニア:「カレーを作りました。」
お客さん:ルーをちょっと舐めてから、「なんで甘いカレーなの?カレーって言ったら普通辛いよね。作り直してくれる。」
ITエンジニア:「辛いカレーを作り直しました。」
お客さん:「これだよこれ。やっぱりカレーは辛くないと。ところでさ、なんで具材こんなに小さく切ってるの?普通カレーの具材ってもっと大きくしない。作り直してくれる。」
ITエンジニア:「かしこまりました。。(なんで、最初の段階で言わないんだよ)」
ナルシストになりたくて…
【結論】
鏡を見つめてうっとりすることだけが、ナルシストになるための手段ではない。
己の日々の行動を見つめてナルシストになる方法だってある。
【目次】
はじめに
今のところは、後から見返すと毎日ブログ更新している風に見える私ですが、継続する力があるわけでも、鋼の意志を持っているわけでもありません。
むしろ、意志は弱いです。。
油断していると、直ぐにYoutubeに手が伸びて1,2時間溶かしています。
そんな私がブログ更新を毎日続けている理由は見栄だけです。
「毎日ブログ書いてる俺ってかっこよくねぇー」的な。
イケてるフェイスの持ち主であれば、鏡を見て髪をイジイジしながら「今日の俺もイケてる!!」的なこともできたのですが…
残念フェイスの持ち主である私は、鏡を見ても悲しくなるだけなのであまり見ないようにしています。
さらに、年齢を重ねるにつれて頭皮の砂漠化現象が問題になってきました。。。
砂漠化に悩まされたくなかった私は、どうせいつか砂漠になるなら自らの手で伐採してやる!!
と覚悟を決めて、バリカンと友好契約を結んだので、イジイジする髪の毛もありません。
ナルシストへの憧れ
鏡を見つめてうっとりできない私ですが、ナルシストに対する願望はあります。
ナルシストにはマイナスイメージが付きまとう印象ですが、私の解釈は以下です。
「ナルシスト=自分の事が好きな人」
嫌いな物を勧めてくる人に対して、好印象を持つ人はいないと思います。
「私はこれが嫌いですけど、あなたはこれを好きになって下さい。」
と言われて、
「へぇ、ちょっと試してみようかな。」
と言う物好きな人はそうそういないと思います。
これと同じことは自分自身に対しても言えます。
「私は自分のことが凄く嫌いですけど、仲良くして下さい。」
と言われて、「この人と仲良くなりたい。」と思う人はいません。
それよりは、
「私は毎日ブログ更新を120日続けたので継続する力はあります。」
と言われた方が、少なくとも前者よりは仲良くしたいと思うはずです。
とYoutube公演家の人が言っていました。
この動画にいたく感銘したので、人に嫌いな自分を勧めたくないがためにナルシストになりたいと考えました。
ナルシストになるために
鏡を見つめてもナルシストになれない人間は、日々の行動を見つめてナルシストになるしかありません。
ナルシストになる行動は色々ある思いますが私は以下を選択しました
「毎日ブログ更新しながら、国家情報技術者試験に受かる」
ぶっちゃけ、仕事しながら、毎日ブログ更新してさらに試験勉強とかシンドイです。
試験勉強を言い訳にして毎日ブログ更新を辞めようかとも考えました。
しかし、ナルシストになるために鏡を使えない私は、困難と思える道を歩み続けることでしかナルシストにはなれません。
私のナルシスト道はこれからが始まりなのです。
さいごに
...毎日ブログ更新している人間は、定期的にネタ記事を書いて気分転換しているんです🥺
【Linux】正規表現を駆使してsedコマンドで置換してみた
【結論】
- 置換(ちかん)とは、あるものを他のものに置き換えること。(念の為)
- Linuxでは
sed
コマンドで文字列を置換できる。 - 正規表現と組み合わせることで、汎用的な置換ができる。
- 正規表現を使いこなせると、自分に酔うことができる。(個人の感想)
【目次】
はじめに
次のsed
コマンドを実行すると
$ cat hoge.txt | sed 's/^.*href="\(.*\)">\(.*\)<.*$/\1,\2/'
以下のhoge.txtファイルを
<a class="entry-title-link" href="url1">ブログのタイトル1</a> <a class="entry-title-link" href="url2">ブログのタイトル2</a> <a class="entry-title-link" href="url3">ブログのタイトル3</a>
次のように置換することができます。
url1,ブログのタイトル1 url2,ブログのタイトル2 url3,ブログのタイトル3
なぜこのような置換が行えるかについてまとめました。
sedコマンドの書式
sed
コマンドは文字列を置換するためのコマンドで、構文は以下になります。
$ sed 's/置換前の文字/置換後の文字/'
以下のファイル(fruit_list.txt)があったとします。
$ cat fruit_list.txt apple banana orange lemon melon
このうち、appleを大文字に置換して出力する場合は次のコマンドを実行します。
$ cat fruit_list.txt | sed 's/apple/APPLE/' APPLE banana orange lemon melon $ cat fruit_list.txt | sed "s/apple/APPLE/"
ちなみに、引数は'
でなく"
で囲むこともでき、使い分けのルールはPythonと同じです。
"
を含む文字を置換する場合は'
で囲み、'
を含む文字を置換する場合は"
で囲みます。
"
と'
を含む文字を置換したい場合は、\"
とか\'
のように\
でエスケープしてあげればOKです。
sedコマンドを分解する
sed
コマンド自体は大したことないのですが、汎用性を持たせるために正規表現を使おうとすると、一気にややこしくなります。
難解な呪文を理解するためには、分解して一つ一つ理解していけばいい。
と言う持論に従って、正規表現を使ったsedコマンドを分解したのが下図になります。
置換対象の文字
^.*href="
の解説\(.*\)">/(.*^)<
の解説- 正規表現で一部の文字列を抜き出す場合、
()
で囲みます。 <.*$
の解説$
は文字列の末尾を表します。<.*$
と書くことで、<
から末尾までの文字を表しています。
置換後の文字
置換対象の文字の説明で、✨()
での抜き出しは複数指定することができ、左から順に1,2,3...と数字が割り振られていきます。✨と説明しました。
ここで割り振られた数字は、置換後の文字で\1
や\2
と記述して指定することで任意のフォーマットに変換して置換することができます。
参考情報
sedでダブルクォーテーションの中にある文字列を抽出する - Qiita
さいごに
前職では正規表現を使ってコードを書くことはなく、ログから特定の文字列を抜き出すのに知っていたら便利程度でしかありませんでした。よって、正規表現を使わずとも、エディタやエクセルの機能を活用すればなんとかできたので、正規表現は避けていました💦
しかし、現在の業務では正規表現を使ってロジックを組む機会が多々あるので仕方なく勉強していました😭
しかし最近は、一見すると意味不明な記号の羅列にしか見えない正規表現を使いこなせてきている自分に酔っている自分がいます😎
【Linux】|,grep,curl,seq,xargs,sed,;の解読
【結論】
curl
コマンドを使えば、HTTPリクエストを投げることができる。|
を使えばコマンドの実行結果を次のコマンドに渡すことができる。- その際に、
xargs
コマンドを実行すれば、受け取った結果を引数として特定のコマンドを実行することができる。 grep
コマンドを使えば、指定した文字列がヒットする行だけを表示することができる。- さらに、その結果を
sed
コマンドに渡せば特定の文字列を抜き出すことができる。 seq
コマンドを使えば、任意の数字を出力できる。- コマンドの末尾に
;
を付ければ、1行で複数コマンド実行できる。
【目次】
はじめに
前回、Linuxコマンドを駆使してハテナブログに投稿した記事のURLとタイトル一覧を取得するコマンドを書きました。
今回は、上記で使用した呪文を解読していきます。
|
について
Linuxコマンドにおいて、|
はコマンドの実行結果を次のコマンドに渡すつなぎの役割をしてくれます。
よく使う例は、grep
コマンドと組み合わせて、出力結果をフィルタリングするケースです。
ファイルを開くcat
コマンドだけを実行すると、次のようにファイルの内容を全て表示します。
$ cat fruit_list.txt apple banana orange lemon melon bash-3.2
しかし、cat
の結果を|
を介してgrep
コマンドに渡すことでフィルタリングすることができます。
$ cat fruit_list.txt | grep a apple banana orange
上記方法は、cat
だけでなく、実行結果をフィルタリングしたいケースで汎用的に使えます。
HTTPリクエストを投げるcurl
と組み合わせることで、簡易スクレイピングも実装できます。
(実行結果は簡略化して記載しています。)
$ curl https://hira98.hatenablog.com/archive/2019/6 | grep "entry-title-link" <a class="entry-title-link" href="url">ブログのタイトル1</a> <a class="entry-title-link" href="url">ブログのタイトル2</a> <a class="entry-title-link" href="url">ブログのタイトル3</a> 〜〜省略〜〜
xargs
について
|
を使うとコマンドの実行結果を全て渡してしまいます。
grep
でフィルタリングするだけであれば特に問題ありません。
しかし、実行するコマンドに指定する引数の一部として利用するケースでは、|
だけでは役不足です。
そんな時に使うのが、xargs
コマンドです。
使用例を示すために、たとえば1〜Nの連番がついたファイルを作成したいとします。
連番を出力するには、seq
コマンドを使います。
$ seq 5 1 2 3 4 5
ファイル作成はtouch
コマンドを使います。
$ touch ブログ.md $ ls ブログ.md
seq
とtouch
コマンドを|
とxargs
を使ってつないであげることで、1〜Nの連番がついたファイルを作成できます。
$ seq 5 | xargs -I@ touch ブログ_@.md $ ls ブログ_1.md ブログ_2.md ブログ_3.md ブログ_4.md ブログ_5.md
xargs -I@
と指定することで、以降ではseq 5 |
で受け取った結果(1〜5の文字)を@
記号として扱います。
結果、touch ブログ_@.md
には1〜5の文字になった状態で実行されます。
要は、以下のコマンドを実行したのと同じ結果を一回のコマンドを実行するだけで得ることができます。
$ touch ブログ_1.md $ touch ブログ_2.md $ touch ブログ_3.md $ touch ブログ_4.md $ touch ブログ_5.md
seq
とxargs
を駆使してURLの一部を変更しながらcurl
コマンドを実行することで、12ヶ月分のブログ一覧を取得できます。
$ seq 12 | xargs -I@ curl https://hira98.hatenablog.com/archive/2019/@?page=1 | grep "entry-title-link"
sed
について
ざっくり言うと、正規表現を使って文字列の一部を抜き出すためのコマンドです。
sed
を使えば、以下のファイル(hoge.txt)を
<a class="entry-title-link" href="url1">ブログのタイトル1</a> <a class="entry-title-link" href="url2">ブログのタイトル2</a> <a class="entry-title-link" href="url3">ブログのタイトル3</a>
次ように置換することができます。
url1,ブログのタイトル1 url2,ブログのタイトル2 url3,ブログのタイトル3
この処理を行うには、次のsed
コマンドを実行すればいいだけです。
$ cat hoge.txt | sed 's/^.*href="\(.*\)">\(.*\)<.*$/\1,\2/'
…sed
コマンドの呪文に触れると記事が長くなりそうなので、解読は次回にします。
ぶっちゃけ、以下を参考にして、色々試してたらなんか上手くできた🎉程度しか理解できていないです💦
sed 's/^.*"\(.*\)".*$/\1/' # ダブルクォーテーションの場合
;
について
コマンドの末尾を表す記号です。
1回の実行で1コマンドしか実行しない時は省略可能ですが、1回の実行で複数のコマンドを実行したい場合に使用します。
ハテナブログの記事一覧は1ページで30記事分しか表示されないため、6月など31日まである場合2ページに分かれて表示されてしまいます。
しかし、Linuxコマンドで「次へボタンがある場合はリンク先のページも確認する。」といった器用なことはできません。
苦肉の策として、1から12ヶ月全てが2ページあることにして、各月2回HTTPリクエストを投げたいた固めに;
を使っています。
参考情報
sedでダブルクォーテーションの中にある文字列を抽出する - Qiita
さいごに
複雑に見える呪文も細かく分解して、一つ一つ理解していけば大した事はない😤
【Linux】ハテナブログに投稿した記事の一覧を取得する方法
【結論】
【目次】
はじめに
「120日間毎日ブログ投稿したぜ💪」的な記事を出すための下準備として、ハテナブログに投稿した記事のタイトルとURLをスクレイピングで取得しようと思います。
ただし、スクレイピングといってもコードは書きません。
Linuxのコマンドを1回実行するだけです。
ハテナブログの分析
スクレイピングをするには対象サイトのページ構成を把握する必要があります。
ハテナブログでは、記事の一覧は月間アーカイブのリンク先で確認することができます。
記事の一覧表示では、1ページあたりに30記事分のリンクを表示し、次のようなURLのフォーマットになっており、年単位や月単位での一覧表示できます。
https://[アカウント名].hatenablog.com/archive/[年]/[月]?page=[ページ数]
記事一覧に表示される各記事へのリンクは、次のようなフォーマットで記述されています。
<a class="entry-title-link" href="[記事へのリンク]">[記事のタイトル]</a>
ここまで分かれば後はコマンドを実行するだけです。
実行するコマンド
以下のコマンドを実行すると、hira98
アカウントが2019
年にハテナブログに投稿した記事の一覧をURL,記事のタイトル
の形式でhira98.txt
ファイルに出力してくれます。
seq 12 | xargs -I@ curl https://hira98.hatenablog.com/archive/2019/@?page=1 | grep "entry-title-link" | sed 's/^.*href="\(.*\)">\(.*\)<.*$/\1,\2/' > hira98.txt;seq 12 | xargs -I@ curl https://hira98.hatenablog.com/archive/2019/@?page=2 | grep "entry-title-link" | sed 's/^.*href="\(.*\)">\(.*\)<.*$/\1,\2/' >> hira98.txt
若干使いづらいのでシェル化しようとも考えたのですが、うまく動作しないので諦めました。
個人でしか使わない上に、アカウント名と年を置換すれば流用できるので良しとします。
コマンドの動作確認
念の為、他のアカウントでも試してみました。
以下のアカウントだと、#
でコメントアウトされた行もヒットしましたが、それを除けば意図した結果を取得できました。
seq 12 | xargs -I@ curl https://ryoutaku-jo.hatenablog.com/archive/2019/@?page=1 | grep "entry-title-link" | sed 's/^.*href="\(.*\)">\(.*\)<.*$/\1,\2/' > ryoutaku-jo.txt;seq 12 | xargs -I@ curl https://ryoutaku-jo.hatenablog.com/archive/2019/@?page=2 | grep "entry-title-link" | sed 's/^.*href="\(.*\)">\(.*\)<.*$/\1,\2/' >> ryoutaku-jo.txt
...因みに本当に欲しかったのは、上記コマンドの実行結果だったりします。
参考情報
sedでダブルクォーテーションの中にある文字列を抽出する - Qiita
Linuxコマンド【 seq 】連続した数字の列を出力・表示 - Linux入門 - Webkaru
xargsコマンドで覚えておきたい使い方・組み合わせ7個(+1個) | 俺的備忘録 〜なんかいろいろ〜
Linuxコマンド【 seq 】連続した数字の列を出力・表示 - Linux入門 - Webkaru
さいごに
以前聞いた、インフラエンジニアの「コマンド実行すればいいでしょ。」発言の意味が少しだけ分かってきた気がします。
【Ansible】[name="hoge"]から[hoge]だけ抜き出す方法
【結論】
しかし、正規表現を使いこなせないと、1行のコードを書くのに1日以上費やしてしまうハメになる😭
【目次】
はじめに
APIを叩いて取得したXMLの文字列から、必要な部分だけを取り出してリストにする。
要は、これを
"<name=\"Apple-01\"><name=\"Orange-02\"><name=\"Banana-03\">"
こうしたい
["Apple-01", "Orange-02", "Banana-03"]
ということをAnsibleで行う場合、XMLを解析するための.yml
ファイルを別途別途用意する必要があります。
しかし、わざわざ別ファイルを用意するのも手間だったので、今回は正規表現を使ってリスト化しました。
Pythonで書いた場合
ソース(.py)
import re # 正規表現操作モジュール # ダミーデータ設定 fruit_str = "<name=\"Apple-01\"><name=\"Orange-02\"><name=\"Banana-03\">" print(f"str => {fruit_str}") # nameの文字の抜き出し fruit_list = re.findall(r'name=\"([A-Za-z0-9-]*)\"', fruit_str) print(f"list => {fruit_list}")
実行結果
str => <name="Apple-01"><name="Orange-02"><name="Banana-03"> list => ['Apple-01', 'Orange-02', 'Banana-03']
Ansibleで書いた場合
ソース(.yml)
--- - hosts: localhost # 自分自身に接続する tasks: - name: ダミーデータ設定 set_fact: fruit_str: "<name=\"Apple-01\"><name=\"Orange-02\"><name=\"Banana-03\">" - debug: msg="str => {{fruit_str}}" - name: nameの文字の抜き出し set_fact: fruit_list: "{{ fruit_str | regex_findall('name=\"([A-Za-z0-9-]*)\"') }}" - debug: msg="list => {{ fruit_list }}"
実行結果
参考情報
Filters — Ansible Documentation
re --- 正規表現操作 — Python 3.7.4 ドキュメント
さいごに
正規表現という呪文を使いこなせるようになりたい。
【Ansible】ソートされたリストの並び順をチェックする方法
【結論】
- Pythonであれば
index()
でリストの添字を取得できるので簡単に比較できる。 - 同じことをAnsibleでも実装したかったのですが、いくら探してもPythonの
index()
に相当する書き方を見つけることができませんでした。 - よって、苦肉の索として辞書型に変換して比較することにしました。
- 本記事で紹介する書き方より良いAnsibleの書き方をご存知の方は教えて欲しいです。
【目次】
はじめに
現在業務でAnsibleを使ってファイアウォールの設定を自動で行うプレイブックの開発を行っています。
ファイアウォールにポリシーを追加して並び替える部分はAPIを叩いて実装できたのですが、ポリシーが意図通りに並び変わっていることを確認する処理の実装にかなり手間取ったのでブログにまとめました。
前提条件
Ansibleでソートされたリストの並び順をチェックする方法の解説がメインであるため、ファイアウォールやAPIを叩いてポリシーを取得する方法についての説明は省略します。
ポリシーの一覧は既に優先度の高い順にリストに格納されているものとします。
pythonの場合
policy_list = ["red", "green", "aaaa", "yellow", "purple"]
Ansibleの場合
- set_fact: policy_list: ["red", "green", "aaaa", "yellow", "purple"]
Pythonで書いた場合
policy_check()
ではリストの要素のインデックス(何番目か)を取得して比較しています。
これが一般的な実装方法だと思われます。
しかし、policy_check_yml()
ではリスト型をわざわざ辞書型に変換してから、優先度を比較しています。
理由は、Ansibleでindex()
に相当するモジュールを見つけれなかったので、苦肉の策として辞書型に変換して書いた処理を解説するためにPythonでも書いています。
ソース(.py)
def policy_check(policy_list, base_policy, sorted_policy): # ポリシーの優先度チェック1 if policy_list.index(base_policy) < policy_list.index(sorted_policy): print(f"優先度高:{base_policy}") else: # ポリシーの優先度チェック2 print(f"優先度高:{sorted_policy}") def policy_check_yml(policy_list, base_policy, sorted_policy): # ポリシーリストを辞書型に変換 rank_dic = {} for i,v in enumerate(policy_list): rank_dic[v] = i # ポリシーの優先度チェック1 if rank_dic[base_policy] < rank_dic[sorted_policy]: print(f"優先度高:{base_policy}") else: # ポリシーの優先度チェック2 print(f"優先度高:{sorted_policy}") def main(): # 変数初期化 policy_list = ["red", "green", "aaaa", "yellow", "purple"] base_policy = "aaaa" sorted_policy = "green" # Pythonde書く場合 policy_check(policy_list, base_policy, sorted_policy) # Ansibleの実装をPythonに置き換えた場合 policy_check_yml(policy_list, base_policy, sorted_policy) main()
実行結果
優先度高:green 優先度高:green
Ansibleで書いた場合
かなり強引に書いている自覚はあります。
ソース(.yml)
--- - hosts: localhost # 自分自身に接続する tasks: - naeme: 変数初期化 set_fact: base_policy: "aaaa" sorted_policy: "green" policy_list: ["red", "green", "aaaa", "yellow", "purple"] num_id: 1 - name: ポリシーリストを辞書型に変換 set_fact: num_id: "{{(num_id|int) + (1|int)}}" rank_dic: "{{ rank_dic | default({}) | combine( {item: num_id} ) }}" with_items: "{{ policy_list }}" - debug: msg="{{rank_dic}}" - name: ポリシーの優先度チェック1 debug: msg="優先度高:{{base_policy}}" when: rank_dic[base_policy] < rank_dic[sorted_policy] - name: ポリシーの優先度チェック2 debug: msg="優先度高:{{sorted_policy}}" when: rank_dic[base_policy] > rank_dic[sorted_policy]
実行結果
💩コードを撲滅するために...
以下のような「俺ならこう書くぜ」的なのが出てくるのを期待してます🥺
jsonであれば vars_files で直接読み込めるので、こんなので行ける気も・・! pic.twitter.com/ogAlBWCHql
— よこち(yokochi) (@akira6592) 2019年7月13日
参考情報
Python, enumerateの使い方: リストの要素とインデックスを取得 | note.nkmk.me
さいごに
Aさん:「なんで、配布されているディスプレイを使わないんですか?」
Bさん:「谷に落ちても大丈夫なように、普段から鍛えているんです。」
Aさん:「なるほどww。ひどいところは、ノートPCだけでマウスすら配布されないですからね。」
職場でこんな会話が聞こえてきて、笑ってしまった🤣