shogo のすべての投稿

「自動車保有関係手続のワンストップサービス (OSS)」を使って引っ越し手続きをしてみた

同じ県内で引っ越しに伴い、管轄警察署・運輸局が変更になったので自分で手続きをしてみました。
普通自動車の場合、通常は警察署で車庫証明を取得し、その後運輸局で車検証の変更(所在地と登録番号)を行い、ナンバープレートの発行と交換を行います。
司法書士さんに頼むと 2~3万円程度でやって貰えるそうですが、「自動車保有関係手続きのワンストップサービス」というものを使うと出向かずに家から出来るそうなのでやってみました。

結論から言えば、家から一歩も出ずに手続きが完了できるわけではなく最終的には車検証の書き換えやナンバープレートの交換で運輸局に出向くなどが必要となります。
また、管轄省庁をまたぐためか非常に煩雑(警察、都道府県、国土交通省 etc…)で、ネットショッピングのようにポチポチでは終わりません。もう少しどうにかなるといいけど。

続きを読む 「自動車保有関係手続のワンストップサービス (OSS)」を使って引っ越し手続きをしてみた

立て直し

旧サイトはハックされてしまい、投稿は消されてしまいました。
キャッシュや投稿の下書きから復旧できた一部だけ復旧しています (すんすん

cron でフォルダやデータベースのバックアップが設定できたので再公開します

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)
ebay2.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」で簡易版の記事の保存です