PythonにてRequestsとBeautifulsoupのライブラリを使い、自分のWebサイトをスクレイピングしてみた

最近お仕事でWebのスクレイピングの話題がホットになっているので、実際、どういうところまでPythonを使ってできるのか試してみました。

なお、PythonにはWebからデータを取得してくるライブラリがたくさんあるようなのですが、今回は、

・Webサイトからのデータ取得・・・Requests
・HTMLデータの解析・・・Beautifule Soup

を利用することにしました。

他にもSeleniumというものもあり、そのライブラリを使えばHTMLデータの取得から解析までまとめてできるようなんですが、どうやら少し重いらしいので、それぞれ専門のライブラリに任せてみることにしました。

なお、Python開発環境のセットアップや必要なライブラリのインポート方法については以下の記事で書いていますので、もしよければ読んでみてください。

http://k2-ornata.com/mac_python_install_and_excel_operation/

ではさっそくやってみます。

1.ライブラリの読み込み

PyCharm を起動し新しいプロジェクトを作成した後、先ほどのRequests とBeautiful Soupのライブラリを取り込みます。

ライブラリの追加

ぶっちゃけ、これで準備は完了です。

2.プログラミング

それでは、おもむろにプログラミングを始めましょう。

ちなみに今回スクレイピングするサイトは自分のブログサイト
http://k2-ornata.com/security-countermeasure/
になっています。

そして、今回書いたコードは以下の通りです。

import requests
from bs4 import BeautifulSoup

url = "http://k2-ornata.com/security-countermeasure/"

res = requests.get(url)

soup = BeautifulSoup(res.content, "html.parser")

ttl_tag = soup.select("h1")

ttl_txt =soup.head.title.text

hed2 = soup.find('h2', id='cspm').text

print(ttl_tag,':',ttl_txt,':',hed2)

全部で9行ありますが、ざっくり言うと、

最初の2行・・・ライブラリ(Requests, Beautifule Soup)の読み込み
次の3行・・・RequestsをつかってWebサイトデータの読み込み
次の3行・・・Beautiful soupをつかってHTMLデータから必要なデータを抽出
最後の1行・・・抽出したデータを”:”で区切って画面に表示

となっていて、実行結果はこちらです。

[<h1 class="entry-title">セキュリティ対策技術</h1>] : セキュリティ対策技術 – k2-ornata : CSPMとCWPP

うーん、結構簡単に出来ちゃいました。

でもWebサイトのHTML構造をちゃんと把握しないとデータの抽出がうまくいかないので、そのあたりの解析が難しいかなと思いました。

また、Beautiful Soupでデータを抽出するときに、いろいろなやり方があるようなのでそれをマスターするのも大変そうです。

ということで、以下に少しBeautiful Soupの使い方をまとめておきます。

3.Beautifule Soup によるデータ抽出方法

1.select関数を使う

“soup.select(“h1”)”のように記載すると<h1></h1>タグで囲まれたデータをタグも含めて取ってきてくれるようです。

今回の実行結果では以下のようなデータが取れました。

[<h1 class="entry-title">セキュリティ対策技術</h1>] 

2.head.title.textみたいに書く^^

“soup.head.title.text”みたいに書くと、HTMLデータの中の「ヘッダー」の中の「タイトル」についてテキストのみを取ってきてくれるみたいです。

今回の実行結果では以下の部分が該当します。

セキュリティ対策技術 – k2-ornata

正直、タイトルをどうやって判断しているのかよくわかっていません。なんで後ろに” – k2-ortana”ってついてくるんだろう?^^

3.find関数を使う

“soup.find(‘h2′, id=’cspm’).text”のように記載すると、<h2></h2>タグで囲まれたもののうち、”id”属性が”cspm”となっているものを選んで、テキスト属性だけ取り出してくれるようです。

今回の実行結果では以下の部分が該当します。

CSPMとCWPP

4.最後に

今回実際スクレイピングしてみて、とっつきとしては思った以上に簡単だなあと思いました。

ただし、属性のついていないタグのデータとか、表のセルを指定してデータを取得するとかやりだすと、いろいろテクニックやライブラリを使わないといけなさそうです。

次に機会があればもう少しつっこんで試してみたいと思っています。

<参考サイト>

・PythonでWebスクレイピングをする方法を解説!【入門編】(Udemy)
https://udemy.benesse.co.jp/development/python-work/web-scraping.html
・[Python入門]Beautiful Soup 4によるスクレイピングの基礎(@IT)
https://atmarkit.itmedia.co.jp/ait/articles/1910/18/news015.html

またまた竹内謙礼さんの本「販売魔女と死の眼鏡」を読んでみました

最近、本を読むとなると仕事や私生活に役立ちそうなものを中心に買いあさっています。

その中でも、今、私の中で大注目なのは竹内謙礼さんのビジネスノベルシリーズになります。

その中で今回は「販売魔女と死の眼鏡」を読んでみました。

販売魔女と死の眼鏡(PHP文庫)

一見、他の本とくらべると軽い感じ?

正直、いろんなサイトのレビューを見ている感じ、他の本とくらべると評価が低いように思えました。

また本の厚さも若干薄いので、そこも少し購入をためらわれるところかもしれません。

しかし、実際に読んでみると、ビジネスマンとして考えなければならないことがしっかり書かれておりました。

人のこころが読めるとビジネスは楽勝なのか?

この本の主人公は、ある人にあこがれて会社を退職し、独立してバックの販売店を始めるのですが、最初はなかなかうまく売り上げが伸びません。

そんな中、突然、人の心が読める黒い眼鏡を手に入れます。

そして、それをビジネスに利用しようとしますが、人のこころが読めたからといってそう簡単にうまくいかず、悪戦苦闘していきます。

独立を考えている人にぜひおすすめ

その苦闘の中で、主人公は顧客が望んだとおり物やサービスを提供するだけではダメだということに気がついていきます。

もし私が同じように独立して会社を始めたとしても、この主人公と同じような考えに囚われ、この本の最後に得られるような考え方はできないでしょう。

これから独立を考えている人がいたら、ぜひ、この本を読んでみることをお勧めします。この本で得られる視点は、ビジネスを継続的に成長させていくために非常に重要だと思います。

また会社勤めをしている場合でも、単純にお客様の要望に応えていくだけでは疲弊していくだけで、仕事や自分自身の継続的な飛躍にはつながらないでしょう。
会社の中で自分がステップアップしていくためには非常に重要な考えかただと思います。

最後に

もしここまで読んできになる人がいたら、ぜひ買って最後まで読んでみてください。

また、竹内謙礼さんの他の本のレビューのリンクを貼っておきますので、その他にどんな本を書かれているのか気になる方は、こちらも見てみてもらえるとうれしいです。

http://k2-ornata.com/books_souzoku-kamen/

MacにPythonの開発環境(PyCharm)をインストールしてExcelファイルの内容を読み込むプログラムを動かしてみた

最近、セキュリティの自動化製品であるSOARの勉強をしておりますが、SOARからpythonのプログラムを動かせばなんでもできそうだなとおもっています。

そこで、今後の為にpythonの勉強をしてみることにしました。

1.python3のダウンロード&インストール

Macでpython3の環境を整える方法は以下の2種類の方法があります。

a.Webサイトからインストーラをダウンロード
b.Homebrewでインストール

今回は a.のWebサイトからダウンロードする方法でインストールしてみました。この場合、以下のサイトにアクセスします。

https://www.python.org/downloads/

すると以下のサイトが表示されるので、上部にあるメニューから「Downloads」-[macOS]を選択します。

Pythonのダウンロードサイト

すると、mac用のインストーラがいくつか表示されていますので、そこから好きなバージョンをダウンロードします。

ダウンロードが終わったら、それをマウスでダブルクリックするとインストールされます。

これで基本的なpythonの開発・実行環境は準備できました。

しかし、このインストーラに含まれる開発環境は基本的な物なので、使いがってはあまりよくなさそうです。

そこで、PyCharmというVisual Studio的な開発環境をインストールします。

2.PyCharmのインスール

PyCharmは以下のサイトからダウンロード可能です。

https://www.jetbrains.com/ja-jp/pycharm/

上記URLにアクセスすると以下のようなサイトが表示されるので、真ん中の「ダウンロード」をマウスでクリックします。

PyCharmのダウンロードサイト

するとさらに以下の画面が表示されるので無償版の Community のダウンロードボタンを押してダウンロードします。

PyCharmのダウンロード画面

ダウンロード後のインストールについては、他のアプリケーションと同じ操作方法で実施します。

3.PyCharm の起動

PyCharm を起動すると以下のウィンドウが表示されますので、「New Project」を選択します。

PyCharm 起動直後

すると新しいプロジェクトの設定画面が出てきますので、とりあえず赤枠のプロジェクト名だけ設定し、「Create」ボタンを押します。

新しいプロジェクトの設定画面

これで開発画面が開きます。

4.Excelを扱うライブラリopenpyxlのインストール

開発画面からプログラムを書く前に、Excelを扱う為のライブラリをインストールしておきます。

PyCharm のメニューから「Preferences」を選択します。

プリファレンスの選択

Preferencesのウィンドウが出たら左側のペインから「Project:<プロジェクト名>」-「Python Interpreter」を選択します。

python interpreterを選択

さらにメインウィンドウにある小さな「+」を押すと以下の画面が表示されますので、openpyxlと打ち込んで検索し、一番下にある「Install Package」ボタンを押しインストールします。

openpyxlライブラリの選択

5.Excelファイルのセルの情報を読み込むプログラムの記述

これでExcelファイルを扱う開発環境が整いましたので、プログラムを作成します。

指定したファイルのセル(この場合、B1セル)を読み込むだけであれば、以下のような簡単なプログラムで作成できます。

import openpyxl

wb = openpyxl.load_workbook('../../Downloads/sample.xlsx')
sheet = wb['sample']
value = sheet.cell(row=1, column=2).value
wb.close()

print(value)

なお今回読み込んでいるファイルの情報は以下の通りです。

ファイルの場所:ダウンロードフォルダ直下
ファイル名:sample.xlsx
シート名:sample

6.PyCharmでのプログラム実行

プログラムを書いたらそれを実行します。
実行についてもPyCharm上で行うことができます。

プログラムを記述したメインの画面でマウスを右クリックし、「Run ‘main’」を選択します。

pythonの実行

実行するとウィンドウの下側に実行結果を表示する画面が表示されます。

python実行結果

今回の場合、B1セルに”共通”という文字が書かれているのですが、その文字が赤枠の部分に正しく出力されています。
(なんかその手前にワーニングっぽいものが出てますが、とりあえず無視で。。。)

7.ターミナルで実行する場合

今回開発したプログラム”main.py”はターミナル上でも実行することができますが、別途、Homebrewなどでpythonの環境やopenpyxlを整えておく必要がありそうです。

その上で以下のコマンドを実行すれば、同様の結果が得られます。

python main.py

<参考サイト>

・Pythonの開発環境を用意しよう!(Mac)(https://prog-8.com/docs/python-env)
・PythonでExcelを操作し自動化する方法! 読み込みや書き込み、グラフまで徹底解説(https://camp.trainocate.co.jp/magazine/python-excel/)
・PyCharmとは!? 特徴と使い方入門(https://zero-cheese.com/4258/?utm_source=pocket_mylist)
・PythonでExcelファイル(xlsx)を読み書きするopenpyxlの使い方(https://note.nkmk.me/python-openpyxl-usage/?utm_source=pocket_mylist)

Wimaxを再起動したらアンテナがバツ(×)になってインターネットに繋がらなくなったのでサポートに電話したらすぐに解決した話

今朝、とある理由からWimax端末(NEC Speed Wifi 5G X11)の電源を再起動したところ、端末のアンテナマークがバツ(×)になりインターネットに接続できなくなりました。

再起動以外は何にもしていないので理由がわからず、サポートに電話してみたところ、SIMを挿し直してください、と言われました。

ああ、それかー。と思いながら以下の手順で挿し直したところ、無事解決したので記録しておきます。

1.Wimaxの電源を切る(前面にある3つのボタンのうち真ん中を長押し)

.Wimaxの左上に細長い蓋があるので、左端に爪をかけて取り外す

3.白っぽいSIMが刺さっているのが見えるので、指でそれを押して完全に取り外す

細長い蓋を開けたところ

4.完全に取り外したら、それを再度指で押し込んで差し込む

5.2.で外した細長い蓋をはめ直す

6.Wimaxの電源を入れる(前面にある3つのボタンのうち真ん中を長押し

うーん、SIMを取り付け直すという発想に思い至らなかった自分にくやしいですが、さすが、サポートはノウハウを蓄積しているなと感心しました。

しかしなんで、電源再起動だけじゃだめなんだろう。

バッテリーがあるので微弱な電波が残っているのかなー。そうであれば、一度、バッテリーを外すという手もあるのかもしれませんね。

ちなみに、インターネットには繋がっているんだけど、受信感度が悪いなぁと言う場合は、クレードルを装着してみるという手もあります。

http://k2-ornata.com/wimax_5g-x11_cradle/

テキストで作成した議事録をWordに取り込んだ後、フォーマットを整形するVBAを作成してみた(その2)テーブルの追加

前回、Word VBAを利用して文字の検索やアラインメント、文字の修飾などを実施しました。

http://k2-ornata.com/word-vba_minutes_format/

今回は、テーブル(表)を作成し、その中に日時や場所、参加者を入れ込んでみたいと思います。

1.処理イメージ

元となるデータのイメージは以下の通りです。
テキストデータをWordに取り込み、なんの修飾もしていない状態です。

元データのイメージ

また、完成形のイメージは以下の通りです。
タイトルの下にテーブルを作成し、その中に「日時」「場所」「参加者」の情報を移動させます。

VBAで加工後のデータイメージ

2.VBAのプログラム説明

ここでは前回の(その1)から変更した部分を中心に説明していきます。
前回同様、初心者なのでプログラムがダサいのはおおめに見てください。

Option Explicit

Sub editMinuts()

Dim d_tbl As Table
Dim d_exc As String
Dim d_txt As String

' Chr(10): Line Feed, Chr(13): Carriage Return
d_exc = Chr(10) & Chr(13)

With Selection.Find
    .Text = "2022."
    .MatchByte = True
    .Wrap = wdFindContinue
    .Execute
    Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
End With

With Selection.Find
    .Text = "議事録"
    .Wrap = wdFindContinue
    .Execute
    Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
End With

' 1 line forward
Selection.Move wdLine, 1

' insert return charactor
Selection.TypeParagraph

' 1 line forward
Selection.Move wdLine, 1

' create table
Set d_tbl = ActiveDocument.Tables.Add(Selection.Range, 3, 2, wdWord9TableBehavior)

' insert charactor into table
d_tbl.Cell(1, 1).Select
Selection.TypeText Text:="日時"

d_tbl.Cell(2, 1).Select
Selection.TypeText Text:="場所"

d_tbl.Cell(3, 1).Select
Selection.TypeText Text:="参加者"

' find date&time charator
With Selection.Find
    .Text = "日時:"
    .Wrap = wdFindContinue
    .Execute
'    Selection.Font.Bold = True
End With

' forward cursor 1 charactor
Selection.Move wdCharacter, 1

' select charactor from cursor to line end
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveEndWhile Cset:=d_exc, Count:=wdBackward

' get charactor from cursor to line end
d_txt = Selection.Text

' check d_txt contents
'MsgBox d_txt

Selection.Sentences(1).Delete

' insert d_txt into d_tbl
d_tbl.Cell(1, 2).Select
Selection.TypeText Text:=d_txt

' find place charator
With Selection.Find
    .Text = "場所:"
    .Wrap = wdFindContinue
    .Execute
'    Selection.Font.Bold = True
End With

' forward cursor 1 charactor
Selection.Move wdCharacter, 1

' select charactor from cursor to line end
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveEndWhile Cset:=d_exc, Count:=wdBackward

' get charactor from cursor to line end
d_txt = Selection.Text

' check d_txt contents
'MsgBox d_txt

Selection.Sentences(1).Delete

' insert d_txt into d_tbl
d_tbl.Cell(2, 2).Select
Selection.TypeText Text:=d_txt

' find attendance charator
With Selection.Find
    .Text = "参加者:"
    .Wrap = wdFindContinue
    .Execute
'    Selection.Font.Bold = True
End With

' forward cursor 1 charactor
Selection.Move wdCharacter, 1

' select charactor from cursor to line end
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveEndWhile Cset:=d_exc, Count:=wdBackward

' get charactor from cursor to line end
d_txt = Selection.Text

' check d_txt contents
'MsgBox d_txt

Selection.Sentences(1).Delete

' insert d_txt into d_tbl
d_tbl.Cell(3, 2).Select
Selection.TypeText Text:=d_txt


With Selection.Find
    .Text = "アクションアイテム:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With


With Selection.Find
    .Text = "次回:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

Selection.Move wdLine, 1

Selection.InsertBreak Type:=wdPageBreak

With Selection.Find
    .Text = "内容:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

End Sub

以下、ポイントを解説していきます。

Dim d_tbl As Table
Dim d_exc As String
Dim d_txt As String

' Chr(10): Line Feed, Chr(13): Carriage Return
d_exc = Chr(10) & Chr(13)

<解説>
最初の3行で変数を定義し、その中の一つ d_exc にLine Feed と Carriage Returnキャラクタを設定しています。
これは後ほど、カーソル位置から行末までの文字を選択する際に、改行の制御文字を含まない為の処理となっています。

' create table
Set d_tbl = ActiveDocument.Tables.Add(Selection.Range, 3, 2, wdWord9TableBehavior)

' insert charactor into table
d_tbl.Cell(1, 1).Select
Selection.TypeText Text:="日時"

d_tbl.Cell(2, 1).Select
Selection.TypeText Text:="場所"

d_tbl.Cell(3, 1).Select
Selection.TypeText Text:="参加者"

<解説>
ActiveDocument.Tables.Addの部分で3×2のテーブルを作成し、その後、それぞれの行の最初の列に「日時」「場所」「参加者」の文字を書き込んでいます。

With Selection.Find
    .Text = "日時:"
    .Wrap = wdFindContinue
    .Execute
'    Selection.Font.Bold = True
End With

' forward cursor 1 charactor
Selection.Move wdCharacter, 1

<解説>
最初のfind処理で”日時:”のところにカーソルが来ているはず?なので、その後のSelection.Moveのところで1文字分カーソルを進ませています。
なぜ1文字でよいのかよくわかっていませんが、こうするとうまくいきました。(笑

' select charactor from cursor to line end
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Selection.MoveEndWhile Cset:=d_exc, Count:=wdBackward

<解説>
Selection.EndkeyのExtend:=wdExtendで選択範囲を維持しながら、Unit:=wdLineで行末に移動しています。
また、Selection.MoveEndWhile Cset:=d_excにて、先ほどd_excに設定したキャラクタが右隣に来るまで移動させています。

' get charactor from cursor to line end
d_txt = Selection.Text

' check d_txt contents
'MsgBox d_txt

Selection.Sentences(1).Delete

' insert d_txt into d_tbl
d_tbl.Cell(1, 2).Select
Selection.TypeText Text:=d_txt

<解説>
d_txt = Selection.Textにて、現在選択されている範囲の文字をd_txtに取り込み、Selection.Sentences(1).Deleteでその行を消し去った後、d_txtの内容をテーブルのセル(1,2)にセットしています。

どうでしょう、なんとなくきちんとした議事録っぽくなってきた感じがしませんか?

次に機会があれば「アクションアイテム:」のところで複数行を一気に選択して表に入れる処理を作成できればと思っています。

参考サイト:

・インストラクターのネタ帳(Word VBAで表を作成・挿入する)
https://www.relief.jp/docs/word-vba-add-a-table.html
・インストラクターのネタ帳(Word VBAでカーソルを行末に移動する)
https://www.relief.jp/docs/word-vba-selection-endkey-wdline.html
・みんなのワードマクロ(【コード】選択範囲を広げるWordマクロ(2))
https://www.wordvbalab.com/code/11726/

テキストで作成した議事録をWordに取り込んだ後、フォーマットを整形するVBAを作成してみた(その1)文字検索&アラインメント

お仕事で議事録を作成するときに、まずはその場でメモを作成し、あとでWordに清書することがあると思います。

でも、メモからWordに取り込んで書式を整えるのって、結構時間がかかる割に、あまり価値のある作業ではないですよね。

そこで、今回は時短のために、テキストから取り込んだデータのフォーマットを自動的に整えるWord VBAを作成してみました。

1.変換前のWordデータ・イメージ

こちらはテキストの内容をWordに取り込んだ直後のイメージです。見た目は考えず、とりあえず打ち込んでいくとこんな感じになっていると思います。

フォーマットを整える前のデータ・イメージ

2.変換後のWordデータ・イメージ

1.の殴り書き状態からVBAを利用することで、以下の状態にフォーマットを整えさせます。

フォーマット調整後(1ページ目)

<解説>
1行目の作成日付を右寄せする。
2行目の「議事録」をタイトルとしてセンタリングする。
3行目〜9行目までの「日時:」「場所:」「参加者:」「アクションアイテム:」「次回:」を太字にする。

フォーマット調整後(2ページ目)

<解説>
10行目を次ページにした上で「内容:」を太字にする。

3.変換用VBA

そして以下がフォーマット整型用のVBAになります。(素人なので書き方がダサくてすみません。)

Option Explicit

Sub editMinuts()

With Selection.Find
    .Text = "2022."
    .MatchByte = True
    .Wrap = wdFindContinue
    .Execute
    Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
End With

With Selection.Find
    .Text = "議事録"
    .Wrap = wdFindContinue
    .Execute
    Selection.ParagraphFormat.Alignment = wdAlignParagraphCenter
End With

With Selection.Find
    .Text = "日時:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

With Selection.Find
    .Text = "場所:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

With Selection.Find
    .Text = "参加者:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

With Selection.Find
    .Text = "アクションアイテム:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

With Selection.Find
    .Text = "次回:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

Selection.Move wdLine, 1

Selection.InsertBreak Type:=wdPageBreak

With Selection.Find
    .Text = "内容:"
    .Wrap = wdFindContinue
    .Execute
    Selection.Font.Bold = True
End With

End Sub

4.VBAの解説

それではポイントを少し解説しておきます。
なお、かなりアバウトに勉強しながら書いているので、雰囲気で説明している部分があります。
正確にはマイクロソフトの公式サイトなどを読んでください。

最初の方の3〜10行目あたり

With Selection.Find
    .Text = "2022."
    .MatchByte = True
    .Wrap = wdFindContinue
    .Execute
    Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
End With

<解説>
.Text = “2022.”:データの中から”2022.”を検索します。
.MatchByte = True:上記”2022.”に完全に一致する文字を検索します。(全角などはヒットしないようにしています)
.Wrap = wdFindContinue:1つ見つかっても、次を見つけにいきます。
.Execute:検索を実行します。
Selection.ParagraphFormat.Alignment = wdAlignParagraphRight:見つかったら、それを含む行を右寄せします。

下から8〜9行目あたり

Selection.Move wdLine, 1

Selection.InsertBreak Type:=wdPageBreak

<解説>
Selection.Move wdLine, 1:一つ手前の処理で「次回:」まで検索していますので、その下に改ページを入れる為、カーソルを1行進ませます。
Selection.InsertBreak Type:=wdPageBreak:改ページを挿入します。

今回は以上になりますが、今後時間があれば、Wordに表を入れるVBAなどを作成してみたいと考えています。

セキュリティインシデント対応の自動化手順を検討してみた

最近、セキュリティ人材の不足やアラートの増加などの理由から、SOAR(Security Orchestration Automation Response)というカテゴリの製品が、少しずついろいろな会社に導入し始めているのではないかと思います。

しかし、いざSOARを使ってインシデント対応を自動化しようとしたときに、どこから手をつけはじめたらよいのかわからないといったお悩みを持つ方が、たくさんいらしゃるのではないでしょうか。

そんな中、今回いろいろなセキュリティや自動化に関するサイトも参考にしながら、既存のインシデント対応手順をどう自動化していけばいいか考察してみました。

以下、私の方で考えた自動化検討の手順になります。

1.インシデント対応を手順書化
2.インシデント対応をフローチャート化
3.定型的な判断・処理がないか洗い出し
4.SOARで連携可能なシステムを確認
5.自動化の優先度を検討

1.インシデント対応を手順書化

普段、実施しているインシデント対応手順を手順書に落としてみます。

そのときに対応の流れを記載するだけではなく、人が判断している部分や処理している部分をより具体的に書くとよいでしょう。

具体的に書けるということは、定型化できる可能性があるということになります。

2.インシデント対応をフローチャート化

手順書ができたら、次にそれをベースにフローチャートを書いてみましょう。

このときに、通常であれば、ある役割の人からある役割の人へと、人(もしくは部署)をベースとしてフローをつなげていくと思います。

人だけではなくシステムも考慮

しかし、自動化する場合には、人だけではなくシステム(メール、SIEM、インシデント管理、セキュリティ機器など)も含めてフローチャート化してあげるとよいでしょう。

こうすることにより、あるシステムから別のシステムに対して人が介在していることが明らかになり、そこが自動化検討のポイントになってきます。

ただし注意が必要なのは、人から人への流れであったとしても自動化できることがあるかもしれない、ということです。

例えば、SOAR製品によってはメールを人に送信し、そのメール内のリンクをクリックさせることでSOARが提供しているWebインターフェイスにアクセスさせ、その人から何らかのレスポンスを返信させる、といったことが可能な場合があるからです。

今できていないことも考慮

ここまでは今、実際にやっていることが対象となっていますが、追加で考えておくとよいことがあります。

今はいろいろな事情でてきていないけれども、可能であれば今後、やってみたいと思っていることです。

自動化によりインシデント対応のスピードアップが計れるようになります。しかし、そこで考えを止めておくのは少しもったいないかと思います。

スピードアップにより空いた時間を使い、これまでできなかったことを行える余裕が出てくる可能性がありますので、それらも自動化の検討対象に入れておくとベストだと思います。

3.定型的な判断・処理がないか洗い出し

以上により自動化検討のポイントが明らかになったら、次はそのポイントにおいて普段、定型的な判断や処理をおこなっていないか確認します。

つまりパターン化されていないかということです。もしパターンかされているのであれば自動化のロジックを作成できる可能性があります。

たとえば、あるシステムから取り込んだデータにおいて、その中のある項目の値によって決まった処理をおこなっていたり、追加調査などを行っていないか、などです。

こうして検討を進めていけば、以下のような処理以外はすべて自動化できる可能性が見出せるでしょう。

・どうしても人の経験値に頼って判断せざるを得ない部分
・関係者の総意が必要となる重要な意思決定
・ネットワークでは対処できない物理的な作業(被疑PCの利用者からの回収など)

4.SOARで連携可能なシステムを確認

SOARを導入済みの場合

もしすでに導入済のSOARがあるのであれば、それがフローチャートに書き出した各システムと連携できるかどうかを確認します。

もしSOARがそのシステムと連携できるのであれば、その部分は自動化候補となります。

また、直接連携可能となっていないシステムであっても、自動化できる可能性はあると思います。別途そのシステムと連携可能なプログラムを個別に作成し、それとSOARを連携させればよいのです。

しかしこのとき注意が必要なのは、個別開発したプログラムとSOARとの間でトラブルが発生しても、SOAR提供ベンダーによってサポートされない可能性があるということです。

この場合、自己責任で対応しなければなりません。それを避けたいのであれば、SOARがサポートしていないシステムとの連携は避けたほうがよいでしょう。

これからSOARを導入する場合

もしSOARをまだ導入していないのであれば、フローチャートに記載した連携対象の各システムを数多くサポートしている、もしくはどうしても優先的に連携させたいシステムをサポートしているSOARを、購入の検討対象にあげるとよいと思います。

なお、今後自動化の対象範囲を広範囲に広げる場合には、それにより新たに連携が必要となるシステムとも連携が可能か、検討に含めておくとよいでしょう。

5.自動化の優先度を検討

自動化できる部分をピックアップし、それが複数ある場合には、どこから先に手をつけるかを検討する必要があります。

この自動化の優先度決めについては、自動化により何を目指しているかによるでしょう。
自動化のメリットとしては、以下のものが考えられます。

・スピードアップ
・人手不足の解消
・対応品質の均一化

これらをキーワードに自動化可能なポイントに優先順位をつけて検討していくとよいでしょう。

以降、2022.5.4 追記

スピードアッ

例えばスピードアップを目指す場合、現在、その対応にどれくらいの時間がかかっているか、整理してみるとよいでしょう。

時間がかかっている処理を自動化するほうが、ROI(Return On Investment)は高いですよね。

人手不足の解消

人手不足の解消ということであれば、頻繁に発生している処理を自動化するほうがROIは高いですね。

対応品質の均一化

これは自動化というよりその一歩手前のインシデント対応の手順書化によるメリットなのではないかと思います。
したがって、自動化という意味であれば、優先順位は低いかもしれませんね。

参考サイト

・セキュリティ運用④-「セキュリティ運用自動化」を実現するSOAR 導入の3つのステップ(MACNICA)
https://www.macnica.co.jp/business/security/manufacturers/fireeye/feature_07.html?utm_source=pocket_mylist

・インシデント対応の切り札「SOAR」とは何か?自動化とセキュリティ人材育成の強い武器に(NEC)
https://www.nec-solutioninnovators.co.jp/ss/insider/column17.html?utm_source=pocket_mylist

・「情報セキュリティ事故対応ガイドブック」の公開(情報セキュリティ大学院大学)
http://lab.iisec.ac.jp/~hiromatsu_lab/sub07.html

・「SOAR」は魔法の自動化ツールなのか!? ~失敗しないセキュリティ運用自動化への道~(MACNICA)
https://mnb.macnica.co.jp/2021/03/soar.html?utm_source=pocket_mylist


自転車の後輪タイヤの空気が抜けていたのでチューブを交換してみた

我が家には5年以上前に購入した、普段、たまにしか乗っていないクロスバイクがあります。

先日、その自転車に久しぶりに空気を入れて出かけた後、数日後にたまたま確認してみたところ、すっかり空気がなくなっていました。

それが後輪だったのでパンクだったらちょっとめんどくさいなと思ってはいたのですが、今日、思い切ってタイヤのチューブを交換してみました。

そこで、その時の記録を残しておきます。

ちなみに、自転車のことはかなり素人なので、専門用語は使っていません。なんとなく雰囲気でいろいろな部品を表現しています。(笑

1.後輪のタイヤを自転車のフレームから外す

後輪のタイヤを外す手順は以下の通りでした。

・チェーンを6速(一番外側の小さい部分)に入れる
・ブレーキを緩める
・タイヤのロックを外す
・自転車を持ち上げてタイヤをフレームとチェーンから外す

この中で一番の難関は最後のフレームから外す部分でした。

なんといっても後輪にはギアとチェーンがあり、ギアからチェーンを外すのがうまくいくかどうかが心配でした。

実際、単純にタイヤをはずそうとすると変速部分(2つギアが飛び出ているところ)がじゃまになってうまくはずれません。

しかし、その変速部分を手袋をした手で真後ろに引いてからフレームを持ち上げると、タイアがスッと外れます。(やってみるとおもったより簡単!)

2.車輪のフレームからタイヤとチューブを外す

車輪のフレームからタイヤとチューブを外す手順は以下の通り行いました。

・逆U字型のタイヤの皮を片方だけフレームの外に外す
(空気注入口と反対からやると良い)
・チューブごとタイヤを車輪のフレームから外す
・チューブをタイヤから抜き出す

この中で一番難しかったのは、最初のタイヤの皮をフレームから外し始めるところでした。

Youtubeの動画を見ていると、タイヤがとても柔らかそうで、指で摘めば比較的簡単に外れるように見えました。

しかし、実際にやると私の自転車のタイヤの皮は思った以上に硬く、素手では難しい状態でした。

そこで、自転車購入時に一緒に購入していたタイヤ交換セットのヘラ?(長さ7cmくらいの薄っぺらくなっているもの)を1本使いました。

そのヘラを車輪のフレームとタイヤの皮の間に差し込んで、タイヤの皮を持ち上げ、フレームの外に逃しました。

その後、逃した部分を指で押さえながら、さらに隣10cmくらいのところにヘラを差し込んで次々と外に逃していきます。

しかし、正直1本だと少しやりづらかったです。(隣の皮を逃している最中に、さっきの皮がなんどかフレームの中に戻ってしまいました。)

やはり、2本のヘラを使って、1本のヘラで最初に逃したところを維持しながら、もう1本でとなりの皮を逃していくというのが正解だったと思います。

タイヤの皮の片方を全部フレームの外に逃してしまえば、その後のタイヤとチューブをまるごとフレームから外すのは簡単です。

車輪のフレームからタイヤとチューブをセットで外したところ

3.新しいチューブをセットする

新しいチューブを車輪のフレームにセットする手順は以下の通り行いました。

・タイヤの皮の片側だけをフレームの中に収める
・新しいチューブに軽く空気を入れる
・新しいチューブをフレームの中に収める
・タイヤの皮のもう片方をフレームに収める

この中でポイントなのは2番目〜3番目の新しいチューブに軽く空気を入れてから、フレームの中に収める部分でしょう。

チューブをフレームに戻すときに、タイヤの皮の残りの方も一緒にフレームに入れた方がいいのか最初悩みました。

しかし、まずはチューブだけフレームにしっかり入れ込んでおいて、その後にタイヤの皮のもう片方をフレームに収める、といった形で1つずつやった方が良いようです。

新しいチューブをフレームに押し込んでいるところ

また4番目のタイヤの皮のもう片方をフレームに収める部分も少しこつが必要そうでした。

フレームに皮を収め始めるのは比較的簡単でしたが、残り20cmくらいになると入れづらくなってきます。

このときに、一度フレームにはめこんだ皮の部分を再度しっかりはめなおす(皮とフレームをぴったりくっつけなおすイメージかな?)ように、もう一度一周してみると良いようです。

そしてもう一度、はめづらかった最後の20cmあたりをトライしてみると、今度は少し楽にはまりそうになっていると思いますので、そこで思い切ってちからを入れて最後まではめました。

4.タイヤに空気を入れる

タイヤに空気を入れる前に

・チューブがタイヤとフレームの間に挟まっていないか確認

をしましょう。これをちゃんとやらないとまたパンクしちゃうと思います。

タイヤの横腹を以下の写真のように押し上げると、フレームの中の色のついたシール?(私の場合、緑色でした)が綺麗に見えるとおもいます。

チューブがフレームとタイヤの間に挟まってないか確認

もしチューブがタイヤの皮の中にちゃんと収まっていないと、タイヤの皮のしたからチューブがのぞいてしまうと思いますので、そうなっていないか一周確認します。

そして、車輪の反対側からも同じように一周し、両面チェックします。

以上が問題なければタイヤに空気を入れます。

5.車輪を自転車のフレームに戻す

車輪を自転車のフレームに戻すのは、外したときとまったく逆のことをします。

ここのポイントは、やはり、チェーンをギアにうまく噛ませる部分だと思います。

自転車のフレームを車輪に乗せるときに、外すときと同様、変速のための2つのギアを真後ろに引っ張っておいて、チェーンを6速に乗せながらおこなうとうまく行きました。

なお、チェーンを6速ギアに乗せるときに、うまい場所に乗せないとチェーンが緩んでしまうのではないかと思っていました。

しかし実際には、それほど気にしなくても適当にやってしまえばなんとかなるようです。

今回はいろいろ確認しながら作業したので、1時間くらいかかったと思いますが、馴れれば15分〜30分でできるのではないかと思います。

慣れるほどやりたい作業ではありませんが。。。

介護記録:冷凍弁当「まごごろケア食」が届いたので試食&冷蔵庫に入れてみた

先週の日曜日に、おじいちゃんにたまに食べてもらうお弁当として、「まごごろケア食」の冷凍弁当を7個頼んでみました。

やはり自分で弁当を買いにいってもらうと、どうしても好きなもの(揚げ物など)に偏ってしまっているようだからです。

http://k2-ornata.com/frozen-foot_pay_with_amazon_pay/

そして、3日後の水曜の夕方にその冷凍弁当が届きました。

その後、その冷凍弁当を冷蔵庫に入れてみたり、試食してみたりしましたので、その際のレビューを記載しておきます。

予想していたよりかなりコンパクト

冷凍弁当が届く前に一番気にしていたのが、冷蔵庫にちゃんと入るかどうか、ということでした。

我が家の冷蔵庫はすでに冷凍食品がかなりはいっていますし、おじいちゃんのアパート用にかった冷蔵庫は、1人用の小さめの冷蔵庫だったからです。

しかし、実際に届いた段ボールをみたところ思ったより小さく、これはかなり小さいなー、余裕で冷凍庫に入りそうだなという感じでした。

「まごごろケア食」7食分

以下はダンボールを開けたところ。無駄なくすっきりはいっています。

「まごごろケア食」7食分 開封状態

以下が実際におじいちゃんのアパートにある1人用の冷蔵庫(よくあるタイプのやつ)がこちら。

おじいちゃんの冷蔵庫(1人用)

冷蔵庫の上に置いてある電子レンジと比較してもらうと、冷凍庫部分の大きさがわかると思います。(まあ、だいたい電子レンジと同じくらいの大きさですね。奥行きは電子レンジよりありますが。)

そして、こちらが冷凍弁当4つを冷凍庫にいれた状態。縦にもう2つは入りそうですし、横にもう1セット、そして手前にもかなり余裕があります。
14個一度に買ってもなんとかなりそうな気がします。

冷凍庫に冷凍弁当を4つ入れた状態

やさいたっぷりでやさしい味。ただし添加物もけっこう入っている?

なぜ、上の写真で冷凍庫に4つしかいれなかったか。それは、みんなで1度、試食してみたからです。

冷凍弁当をあっためる際は、袋の一部に切り込みを入れて、そのまま電子レンジへ。600Wで3分くらいです。

そして私が試食したのがこちら。メインは左上の大根と魚(シーチキン?)の煮物と左下のにんじんとゴボウのキンピラだと思います。また右にも人参やグリンピース(こちらは甘め)がはいっております。

7個のお弁当のなかでも特に野菜が多めな気がしました。

やさいたっぷり

私的には味も比較的良いのではないかとおもいましたが、食感的には、かなりやわらかめで、すこし噛む力が衰えてきたお年寄り向けな感じがしました。

うちのじいいちゃんは、だいぶん歯が悪くなってきているのでちょうど良い気はします。

一方、おじいちゃんは別の冷凍弁当を食べましたが、「冷凍弁当なのでこんなものかなぁ」という感じでした。

また、私の妻はというと、割と添加物に敏感な人間のようで、すこし食べたあと、添加物が結構入っているように感じたようです。

私もすこし妻が食べている冷凍弁当も食べてみましたが、私が食べてもちょっと添加物ぽい味がした料理が一部にあったので、お弁当の種類によっては、添加物を感じるかもしれません。

まだこの冷凍弁当作戦については試行錯誤中なので、別のお弁当もいろいろ試してみたいなと思っています。

介護記録:冷凍弁当「まごごろケア食」をamazon pay で単発購入してみた

昨年の12月頃からうちのおじいちゃんに、実家の山口から川崎の私の家の近くのアパートに引っ越してきもらい、お世話しております。

最初は一日3食すべてを私の家に来てもらい一緒に食事してもらっていましたが、私はリモートワークで働いているので、毎回決まった時間に食事を準備するのがなかなかつらい状態でした。

また、おじいちゃんの方もこちらに手がかかっているのがわかっているようで、すこし遠慮している(もう少し自由にしたい?)ようでした。

そこで最近、朝食以外は1人で自由に食べてもらっていますが、様子をみてみると、やはり食べ物がかたよりがちで、クリームパンやいなり寿司など、簡単なもので済ましてしまっていることが多いようです。

そこで、インターネットでなにか良いサービスがないか調べていたところ、定期的に宅配してくれる冷凍弁当があるようなので、試しに頼んでみることにしました。

どこの冷凍弁当がよいのか?

冷凍弁当を詳しく調べてみたところ、川崎では、「まごころケア食」や「ナッシュ」、「ワタミ」など様々な会社から提供されているようで少し迷いました。

ナッシュは味が良くておかずの種類も豊富なため評判のようですが、やや1食あたりの価格が高く、また単発購入がなさそうです。(定期購入を1回で終わらせることはできそうですが。)

一方で、まごごろケア食の方は価格が少しやすく、さらに初回初回限定で180円引きになっています。(おそらく定期購入時の割引と同額)
また、味の方も比較的評判がよさそうですので、試しに頼んでみることにしました。

まごころケア食 初回限定セット(2022.4.10時点)

なお、各社のくわしい比較は下記のDelicious Plusのサイトに書かれているので、参考になると思います。

川崎市でおすすめの宅配弁当5社を比較!うまい、安い、早い、宅食はどこ[ワタミ/まごころケア食/タイヘイ/ナッシュ/コープ](Delicious Plus)
https://deliciousplus.jp/takusyoku-kanagawa-kawasaki/

まごごろケア食の初回限定セットを注文

初回限定セットを注文するには、まごころケア食 Webサイトのトップページから「商品一覧」を選択します。

まごころケア食 Webサイトのトップページ

すると下記のように「定期」の印がついていない初回限定セットが表示されますので、ここから「購入する」を選択します。

まごころケア食 商品一覧

amazon payで購入

なお、初めての会社(Webサイト)でオンライン購入する際にめんどうなのが、会員登録だったりします。

自分の住所やクレジット番号を入れたりするのってちょっとめんどくさいし、クレジットカード番号を渡すほど信用できるのか心配だったりしますよね。

その点についても、まごころケア食のサイトでは銀行振込やコンビニエンスストアでの支払いなどいろいろな支払い方法が可能となっています。

さらに、私が書籍や映画などの視聴のためにサブスク契約しているamazonのアカウント情報を使った支払いができるようでしたので、今回はその方法で購入してみることにしました。

商品一覧のページから初回限定セットの「購入する」ボタンを押すと、以下の画面が表示され、一番下に「amazon pay」で支払うボタンがあることが確認できます。

まごごろケア食 購入ウィザード1

そして「amazon pay」をクリックすると、以下のようにAmazonからまごころケア食に名前、e-mail、そして配送先住所が提供される旨の警告がでますので、利用規約などを確認の上、「続行」ボタンを押します。

まごごろケア食 購入ウィザード2

すると、最終確認画面が表示されますので、必要なチェックボックスにチェックを入れ、「決済画面へ進む」を押します。

以上で注文が確定し、注文番号が書かれた下記のWeb画面表示とともに確認メールが送られてきます。

あとは配送されてくるのを待つだけですが、集めた情報からだと注文後、2〜3日かかるようです。

配送されてきたら、試食や冷蔵庫への保管結果などを含めてレビューできればと思っています。