2024年8月23日を最終出社日として、日本マイクロソフトを退職しました。
続きを読む 日本マイクロソフトを退職しましたshogo のすべての投稿
「自動車保有関係手続のワンストップサービス (OSS)」を使って引っ越し手続きをしてみた
同じ県内で引っ越しに伴い、管轄警察署・運輸局が変更になったので自分で手続きをしてみました。
普通自動車の場合、通常は警察署で車庫証明を取得し、その後運輸局で車検証の変更(所在地と登録番号)を行い、ナンバープレートの発行と交換を行います。
司法書士さんに頼むと 2~3万円程度でやって貰えるそうですが、「自動車保有関係手続きのワンストップサービス」というものを使うと出向かずに家から出来るそうなのでやってみました。
結論から言えば、家から一歩も出ずに手続きが完了できるわけではなく最終的には車検証の書き換えやナンバープレートの交換で運輸局に出向くなどが必要となります。
また、管轄省庁をまたぐためか非常に煩雑(警察、都道府県、国土交通省 etc…)で、ネットショッピングのようにポチポチでは終わりません。もう少しどうにかなるといいけど。
立て直し
旧サイトはハックされてしまい、投稿は消されてしまいました。
キャッシュや投稿の下書きから復旧できた一部だけ復旧しています (すんすん
cron でフォルダやデータベースのバックアップが設定できたので再公開します
HP Z840 Workstation を「組み立てる」- (2) 組み立て編
中古で購入した HP Z840 Workstation を組み立てていきます。
調達編でも記載しましたが、この PC は CPU やメモリが抜かれているので、中古で部品を集めて組み立てていきます。
HP Z840 Workstation を「組み立てる」- (1) 調達編
諸般の事情で、2 CPU、メモリマシマシの PC (というよりサーバー) が必要になったため、準備することにしました。
ただし、新品でマザーボードを準備したり、中古のマシンをそのまま使用するわけではなく、コストを抑えるために部品が抜かれたマシンをベースにつぎはぎして作っていきます。
ベースに選んだのは HP Z840 Workstation です。理由はシンプルで、2 CPU 搭載できること、メモリ単価の安い DDR4 メモリが使用できること。
ヤフオクや eBay 等で部品を集めましたが、その価格を紹介します。$1 = 114円換算です。
物品 | 価格 | 入手元 | 備考 |
---|---|---|---|
HP Z840 本体のみ | 45,000円 | ヤフオク | ケース、電源、マザーボードのみ |
Intel Xeon E5-2670V3 (2つ) | 11,581円 | AliExpress | |
DDR4 32GB PC4-17000(8枚) 中古 | 84,360円 ($740.28) | ebay | 本体だけなら $639.92 (1枚$80) 送料と通関で約$100 |
HP 2.5 to 3.5 SSD Hard Drive Tray (668261-001) 4 つ | 9,060円 ($79.52) | ebay | 2.5インチ SAS HDD 用 |
HP Z Turbo G2 PCIe Adapter Kit w Heatsink (822947-002) | 7,000円 ($61.31) | ebay | 本体価格 $35.00 M.2 SSDをブートドライブにするためのボード |
Lenovo Nvidia Quadro NVS 510 2GB GDDR3 PCI-e x16 Graphics Card (00FC861) | 6,900円 ($60.49) | ebay | 本体価格 $39.99 |
ainex JP-DX1 [ナノダイヤモンドグリス 3g] | 1,320円 | ヨドバシカメラ | |
ainex ACP-HC18A [15A対応AC電源ケーブル 1.8m] | 1,680円 | ヨドバシカメラ | 電源が 1100W なので 15A 対応 |
HDD はありませんが、一般家庭に転がっている SAS 2.5インチ 1TB×4 や M.2 SSD を流用します。
合計17万円程度で、2 CPU (12c24t ×2)、RAM 256GB のワークステーション、サーバーが準備できました。
ただし、物は中古品なので、掃除や検品の上で組み立てが必要です。
> 組み立て編へ続く
SIerを退職し、日本マイクロソフトに入社しました
2019年12月、SIerを退職し、日本マイクロソフトへ入社しました。
SIerには、新卒から7年間ほど、お客様先に設置されたIBMメインフレームのシステム管理者の1人として勤務してきましたが、最終的に休職となりそのまま退職いたしました。
前職で関係のありました皆様には、大変お世話になり、またご迷惑をおかけいたしました。
前職では、主にメインフレームを中心にz/OS、WebSphere Application Sever for z/OS 並びにSMP/Eの担当者として活動をしてきましたが、日本マイクロソフトではサポートエンジニアとしてAzure PaaS領域の技術サポートを担当することになります。
前職でのプロジェクト自体は運用フェーズに入っており、まだ継続中のため、詳細はお話しすることが出来ませんが、メインフレームがレガシーだから嫌になった訳ではなく、モチベーションの維持が困難になった、とだけ記載しておきます。
休職状態から復職するか検討する中で、いくつかの企業(外資系のITコンサル、SIerなど)から転職のお誘いを頂きましたが、自分がやりがいは何だったのか、目標に到達するにはどうあるべきかを考えた結果、最終的にマイクロソフトのサポートエンジニアという職種を選んだ次第です。
クラウドのサポートエンジニアとして半年が経過して感じたこととしては、クラウドもメインフレームも変わらず、むしろクラウドはメインフレームが実現してきたことを達成するために、同じ方向へ向かおうとしているように感じます。それをコモディティ化された技術でソフトウェアとして達成するか、専用部品を使用して、より物理に近いレベルで実現するかの違いしかないと感じています。
確かに Azure ではCOBOLやPL/Iは動きませんし、製品も違うので、問題の調査に使用するツールも違います。しかし、基本情報技術者試験レベルで「コンピュータは常識で考えてどう動くか、自分がミドルウェアの開発者ならどうするか、どこを調べるか」というレベルで考えると対して変わりはありません。
SIerの現場で経験してきた事で生かせる部分は多々あり、それに助けられる部分も多々ある状況です。
これから先、お客様のお役に立てるように精進し、日々変わっていくクラウドの技術を学び続ける日々を楽しもうと思います。
Linux software RAIDを拡張する
Linuxでファイルサーバ、またはストレージを構築している場合、software RAIDを使用している人も多いと思われますが、
「mdadmを使用して、1TB HDD×4台のRAID5を3TB HDD×4台に移行したい」という場合、データロストなしでどうやるのかを検証した。
前提
検証作業は、VMware ESXi 5.5上の仮想マシンで実施。
Debian 9.0(stretch)
$ sudo mdadm --version mdadm - v3.4 - 28th January 2016
16GBの仮想ディスク4台を32GB 4台の構成へ移行するシナリオで実施する。
なお、RAID上にはデータのみであり、OSが入ったディスクは別途存在するものとする。
準備
検証環境の準備作業として、仮想マシン用に16GBのディスクを4台準備し、RAID 5を構成する。
実機であれば、SATAポート数の制約などで拡張時に入れ替えを実施すると思われるが、仮想マシンのためポートはたくさんある。
そこで、最初から16GBと32GBのディスク 4台ずつ、合計8台分を準備、接続しておく。
デバイスの割当ては下記の様になる。
16GB: sdb-sde
32GB: sdf-sdi
まず、ESXi上でvmdkを作成する。
# vmkfstools -d thin -c 16G ./disk-1a.vmdk # vmkfstools -d thin -c 16G ./disk-2a.vmdk # vmkfstools -d thin -c 16G ./disk-3a.vmdk # vmkfstools -d thin -c 16G ./disk-4a.vmdk # vmkfstools -d thin -c 32G ./disk-1b.vmdk # vmkfstools -d thin -c 32G ./disk-2b.vmdk # vmkfstools -d thin -c 32G ./disk-3b.vmdk # vmkfstools -d thin -c 32G ./disk-4b.vmdk
vmxファイルを編集して、ディスクを割り当てる。
vmxファイルをリロードさせるために、getallvmsでVMの番号を取得する。
取得した番号をreloadで指定すると、vi等で書き換えた内容が反映される(ここは20番だった)。
vim-cmd vmsvc/getallvms vim-cmd vmsvc/reload 20
続いて、Linux上でRAIDを作成する。
めんどくさがりなので、下記の様にデバイス名を変数化してpartedで各ディスクを初期化する。
DEV=/dev/sdb sudo parted -s -a optimal ${DEV} mklabel gpt sudo parted -s -a optimal ${DEV} mkpart primary ext2 0% 100% sudo parted -s -a optimal ${DEV} set 1 raid on sudo parted -s -a optimal ${DEV} print
結果、各ドライブにLinux RAID用のパーティションが1つづつ作成される。
$ sudo parted -s -a optimal ${DEV} print Model: VMware Virtual disk (scsi) Disk /dev/sdb: 17.2GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 17.2GB 17.2GB primary raid $
次に、mdadmコマンドでRAID 5を作成し、ext4で初期化する。
sudo mdadm --create --verbose /dev/md0 --level=5 --raid-devices=4 /dev/sd[b-e]1 sudo sh -c "mdadm -Ds >> /etc/mdadm/mdadm.conf" sudo mkfs.ext4 /dev/md0
同期完了まで待つ
$ cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid5 sde1[4] sdd1[2] sdc1[1] sdb1[0] 50300928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [UUU_] [>....................] recovery = 3.6% (619004/16766976) finish=93.8min speed=2867K/sec unused devices: <none> $
↓
$ cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid5 sde1[4] sdd1[2] sdc1[1] sdb1[0] 50300928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU] unused devices: <none> $
これで検証準備が整った。
RAIDの拡張
いよいよディスクを入れ替えて、RAIDを拡張していく。
ディスクの入れ替え
RAID5のディスクを1台ずつ、別のディスクに入れ替えていく
最初にMDから1台のディスクを切り離す
まず、取り外し対象となるディスクの確認をする。物理ディスクの場合シリアル番号などを確認の上で、物理的な取り外し対象を確認すること。
sudo smartctl -a /dev/sdb
つづいて、RAID上から入れ替えの対象デバイスに故障フラグを立てて、取り外すする。
sudo mdadm /dev/md0 --fail /dev/sdb1 sudo mdadm /dev/md0 --remove /dev/sdb1
続いて、新しいディスクをRAIDに組み込む。実機であれば、ここで停止→ディスク入れ替え→ディスク初期化が行われているはずである。
sudo mdadm --add /dev/md0 /dev/sdb1
ディスクをADDするとすぐに同期が開始される
$ cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] md0 : active raid5 sdf1[5] sde1[4] sdd1[2] sdc1[1] 50300928 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/3] [_UUU] [>....................] recovery = 0.1% (30204/16766976) finish=46.1min speed=6040K/sec unused devices: <none> $
あとは、新しいディスクでの同期完了まで待ち。
新しいディスクでの同期が完了したら、別のディスクを入れ替えて繰り返す。
mdデバイスの拡張
一通りディスクを入れ替えたら、いよいよMDデバイス自体を拡張する。
拡張前のArray Sizeは17GBx(4-1)の51GB
Used Dev SizeはRAID5の場合、パリティ+ユーザーデータのため1パーティション分の約17GB程度が使用されている
shogo@debian:~$ sudo mdadm --detail /dev/md0 /dev/md0: Version : 1.2 Creation Time : Fri Mar 9 22:41:54 2018 Raid Level : raid5 Array Size : 50300928 (47.97 GiB 51.51 GB) Used Dev Size : 16766976 (15.99 GiB 17.17 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Sat Mar 10 07:51:59 2018 State : clean, degraded, recovering Active Devices : 3 Working Devices : 4 Failed Devices : 0 Spare Devices : 1 Layout : left-symmetric Chunk Size : 512K Rebuild Status : 2% complete Name : debian:0 (local to host debian) UUID : 0a0f4244:db70abac:863ee0fe:41be0dd8 Events : 26 Number Major Minor RaidDevice State 5 8 81 0 spare rebuilding /dev/sdf1 1 8 33 1 active sync /dev/sdc1 2 8 49 2 active sync /dev/sdd1 4 8 65 3 active sync /dev/sde1 shogo@debian:~$
mdデバイスを拡張
sudo mdadm --grow /dev/md0 --bitmap none sudo mdadm --grow /dev/md0 --size=max
shogo@debian:~$ sudo mdadm --detail /dev/md0 /dev/md0: Version : 1.2 Creation Time : Fri Mar 9 22:41:54 2018 Raid Level : raid5 Array Size : 100632576 (95.97 GiB 103.05 GB) Used Dev Size : 33544192 (31.99 GiB 34.35 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Sat Mar 10 21:09:10 2018 State : clean, resyncing Active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 Layout : left-symmetric Chunk Size : 512K Resync Status : 54% complete Name : debian:0 (local to host debian) UUID : 0a0f4244:db70abac:863ee0fe:41be0dd8 Events : 110 Number Major Minor RaidDevice State 5 8 81 0 active sync /dev/sdf1 6 8 97 1 active sync /dev/sdg1 8 8 129 2 active sync /dev/sdi1 7 8 113 3 active sync /dev/sdh1 shogo@debian:~$ 同期(拡張の反映?)が実行される shogo@debian:~$ cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] [linear] [multipath] [raid0] [raid1] [raid10] md0 : active raid5 sdi1[8] sdh1[7] sdg1[6] sdf1[5] 100632576 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU] [=================>...] resync = 89.9% (30186296/33544192) finish=0.2min speed=199303K/sec unused devices: shogo@debian:~$
以上でMDデバイスの拡張が完了した。
md上のパーティション、ファイルシステムの拡張
最後に、MDデバイス上のパーティションやファイルシステムを拡張する。
一般的なファイルシステム拡張と同様に実施すれば良い。
まず、mdデバイスをアンマウントして、ファイルシステムチェックを実行
sudo fsck -f /dev/md0
パーティション拡張前
shogo@debian:~$ sudo parted -s /dev/md0 print Model: Linux Software RAID Array (md) Disk /dev/md0: 51.5GB Sector size (logical/physical): 512B/512B Partition Table: loop Disk Flags: Number Start End Size File system Flags 1 0.00B 51.5GB 51.5GB ext4 shogo@debian:~$
パーティション拡張(resize2fs)後
shogo@debian:~$ sudo parted -s /dev/md0 print Model: Linux Software RAID Array (md) Disk /dev/md0: 103GB Sector size (logical/physical): 512B/512B Partition Table: loop Disk Flags: Number Start End Size File system Flags 1 0.00B 103GB 103GB ext4 shogo@debian:~$
以上の操作で、Linux Software RAIDは拡張が可能になっている。
SeleniumによるEvernoteの自動クリップ
インフラエンジニアなのでSeleniumなどのフロントエンド系は触ることはないのですが、「連載記事をまとめてEvernoteのWebクリッパーでクリップしたい」と考えて自動化する手段を調べた結果、Seleniumによるバッチ処理という答えにたどり着きました。
やっていることはシンプルで、SeleniumからGeckoドライバーでFirefoxを起動したあと、URLを開く、ショートカットキーを押下する、次のURLを開く…を続けるだけ。
PythonでSeleniumやGeckoドライバの配置についてはググっていただき、「listをfor文で回すな」等のツッコミはご容赦下さい…
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
def loader_url(filepath):
urllist = list()
with open(filepath, "r") as f:
line = f.readline()
while line:
line_trim = line.strip()
# 空行はスキップする
if len(line_trim) == 0:
line = f.readline()
continue
# 処理の開始
urllist.append(line_trim)
line = f.readline()
return urllist
def evernote_webclip(url, driver=None):
# キー操作
WEBCLIPPER_KICK = "`"
WEBCLIPPER_SIMPLE = "C"
# 待ち時間
LOAD_PAGE = 5 # ページ読取り待ち
SEND_WEBCLIP = 5 # Webクリップ起動まで
LOAD_NEXT_PAGE = 10 # 簡易版の次のページ読み込みを待つ
STORE_WAIT = 10 # ページ保存
if driver == None:
driver = webdriver.Firefox()
driver.get(url)
# 読取り待ち
time.sleep(LOAD_PAGE)
element = driver.find_element_by_tag_name("html")
# Webクリッパーを起動
element.send_keys(WEBCLIPPER_KICK);
# Webクリッパーの起動待ち
time.sleep(SEND_WEBCLIP)
# 簡易版記事の保存
element.send_keys(WEBCLIPPER_SIMPLE);
time.sleep(LOAD_NEXT_PAGE)
element.send_keys(Keys.ENTER);
# Webクリッパーの起動待ち
time.sleep(STORE_WAIT)
if __name__ == '__main__':
firefox_profile = r'C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles\123abcde.default'
url_file = r'C:\Users\user\Documents\selenium_urls.txt'
url_list = loader_url(url_file)
driver = webdriver.Firefox(firefox_profile)
for url in url_list:
evernote_webclip(url, driver=driver)
変数定義などが多いため、実際の処理部分はそんなに多くありませんので詳細はコードを見ていただきたいですが、下記の様な実装になっています。
- loader_url()関数は、渡されたテキストファイルに書かれている1行ごとのURLをリストに格納します
- evernote_webclip()関数は、URLとドライバーを元にEvernote WebClipを使って保存します
- Selenium内でショートカットキーを発行するには、何か要素をつかむ必要があるようなので、適当にhtmlタグをつかませています
- evernote_webclip()関数内で発行しているWebCliperのショートカットキーは「`」でWebCliper起動、「C」で簡易版の記事の保存です