hamacoの日記

どうでもいい日常をたれながす日記だと思う

S.M.A.R.T の総書き込み量を見たらびっくりした

M1 macスワップが多いからか SSD に書き込みが多くて寿命が…みたいな話を見たのでふと今の MacBook Pro の総書き込み量を見てみたら思ったよりも多くてビックリしたってだけの話。

やったこと

まず smartctl コマンドを使えるようにしないといけないので、homebrew でサクッとインストール。

$ brew install smartmontools

インストールしたら diskutil list コマンドで SSD がどのデバイスなのか調べる。

$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:                 Apple_APFS Container disk1         500.0 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +500.0 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD - Data     452.6 GB   disk1s1
   2:                APFS Volume Preboot                 80.4 MB    disk1s2
   3:                APFS Volume Recovery                528.9 MB   disk1s3
   4:                APFS Volume VM                      7.5 GB     disk1s4
   5:                APFS Volume Macintosh HD            11.3 GB    disk1s5

今回は Fusion Drive とか起動ディスクを違うのにしてたりとか、そういう変なことは特になにもしてない普通の MacBook だったので /dev/disk0 だった。
あとはこれを smartctl で調べるだけ。

$ sudo smartctl -a /dev/disk0                                       
smartctl 7.2 2020-12-30 r5155 [Darwin 19.6.0 x86_64] (local build)
Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Number:                       APPLE SSD SM0512L
Serial Number:                      C02702400YFHCGX15
Firmware Version:                   CXS6AA0Q
PCI Vendor/Subsystem ID:            0x144d
IEEE OUI Identifier:                0x002538
Controller ID:                      2
NVMe Version:                       <1.2
Number of Namespaces:               1
Local Time is:                      Thu Mar 25 13:13:51 2021 JST
Firmware Updates (0x06):            3 Slots
Optional Admin Commands (0x0006):   Format Frmw_DL
Optional NVM Commands (0x001f):     Comp Wr_Unc DS_Mngmt Wr_Zero Sav/Sel_Feat
Maximum Data Transfer Size:         256 Pages

Supported Power States
St Op     Max   Active     Idle   RL RT WL WT  Ent_Lat  Ex_Lat
 0 +     6.00W       -        -    0  0  0  0        5       5
 1 -   0.0400W       -        -    1  1  1  1      210    1200
 2 -   0.0050W       -        -    2  2  2  2     1900    5300

=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

SMART/Health Information (NVMe Log 0x02)
Critical Warning:                   0x00
Temperature:                        42 Celsius
Available Spare:                    100%
Available Spare Threshold:          10%
Percentage Used:                    81%
Data Units Read:                    1,642,514,638 [840 TB]
Data Units Written:                 1,590,124,954 [814 TB]
Host Read Commands:                 10,984,994,601
Host Write Commands:                7,790,862,063
Controller Busy Time:               37,645
Power Cycles:                       30,250
Power On Hours:                     8,266
Unsafe Shutdowns:                   206
Media and Data Integrity Errors:    0
Error Information Log Entries:      0

Error Information (NVMe Log 0x01, 16 of 64 entries)
No Errors Logged

Data Units Written の所が総書き込み量なんだけど、814 TB とかになっていて寿命ヤベーんじゃねーの?って感じでドキドキ。
でも、よく見てみるとそのちょっと上にある Percentage Used が 81% だったので、この SSD の寿命は 1000TB まではセーフっぽくて、多分もう1年弱は持つのかな? セフセフ。

DiscordPHP を使って Discord のメッセージを取得した #phperkaigi

はじめに

先日開催した PHPerKaigi 2021 で、Ask the Speaker など参加者同士のコミュニケーションのために Discord を利用した。
以前開催した iOSDC Japan 2020 ではボイスチャットが結構使われていたので、PHPerKaigi でも当初の想定ではボイスチャットがメインでテキストチャットはあまり使われない想定だった。
しかし PHPer にはテキストチャットの方が需要が高いみたいで結構テキストでのやり取りがメインになっていたので、最終日の表彰の時とかにそのデータを使わないのも勿体ないかなと思い Discord のメッセージを取得する Bot を書いた。

Discord の Bot を作るのは結構簡単だったんだけど、会期中にサクッと作るにはちょっとめんどくさいことも多かったので、次回以降のスタッフ業の時の為にどうやったかをメモとして残しておく。

ちなみに参考にしたサイトは下記。

Bot を Discord のサーバーに追加

まずは Discord で対象のサーバーに Bot を追加する必要があるので Bot を追加する。

事前準備

Discord の API を叩く時にサーバーID とかチャンネルID とかを取得する必要があるので、事前に開発者モードを有効にしておくと簡単にその辺りが取得できて便利。
開発者モードを有効にするには、ユーザー設定にある「テーマ」から「開発者モード」を有効にするだけ。(なぜテーマにあるのかは謎)

f:id:hamaco:20210330181816p:plain

開発者モードを有効にすると、サーバーアイコンやサーバー名、チャンネルやメッセージなどを右クリックした時に「IDをコピー」というのが増えるので、簡単にそれぞれの ID を取ることができて Bot を作るのが捗る(というか他の方法を知らない)。

Bot の作成

Discord の Bot 自体を作るのはめちゃくちゃ簡単で、Discord Developer Portal から New Application をクリックして名前を入力して、Settings > Bot から Add bot を押すだけで OK。
ちなみにこの時 test みたいにめちゃくちゃよく使われるような名前にすると、アプリケーションは作れるけど Bot を作ろうとすると怒られるので、ある程度ちゃんとした名前で作る必要あり。

Bot をサーバーに追加する

Bot を作ったら、Settings > General Information に行き、CLIENT ID をコピーして、下記 URL の {CLIENT_ID} 部分を置き換えてブラウザでアクセス。

https://discordapp.com/oauth2/authorize?&client_id={CLIENT_ID}&scope=bot&permissions=0

アクセスすると Bot をサーバーに追加する画面が表示されるので、対象のサーバーを選択して「認証」をクリック。
サーバー管理者じゃなかったりしてプルダウンに対象のサーバーがでてこない時は、サーバー管理者に確認して Bot を追加する権限を付与してもらう必要があります。

f:id:hamaco:20210330181649p:plain

サーバーに Bot を追加できるかどうかは、サーバー設定のロールから自分のロールで「サーバー管理」の権限があるかどうかを確認して有効になってれば OK。

f:id:hamaco:20210330181711p:plain

メッセージを取得するコードを書く

Bot の追加ができたら、あとはもうコードを書いてメッセージを取得するだけ。

DiscordPHP のインストール

今回は DiscordPHP を使うので、まずは DiscordPHP を Composer でインストールした。

github.com

$ composer require team-reflex/discord-php

新規メッセージを取得するコードを書く

まずは誰かが新規でメッセージを投稿したら、それを取得して保存する処理を書く。 といってもめちゃくちゃ簡単でこのくらいのコードを書くだけで動きっぱなしになり、新規投稿があると標準出力に投稿者名と内容が流れてくるようになった。

<?php

use Discord\Discord;
use Discord\Parts\Channel\Message;
use Discord\WebSockets\Event;

require_once __DIR__ . '/vendor/autoload.php';

$token = '{TOKEN}'; // Developer Portal から取得した Bot のトークン

$discord = new Discord(['token' => $token]);
$discord->on('ready', function (Discord $discord) {
    $discord->on(Event::MESSAGE_CREATE, function (Message $message, Discord $discord) {
        echo "{$message->author->username}: {$message->content}" . PHP_EOL;
        // 実際はここでメッセージを DB とかなにかに保存する
    });
});

$discord->run();

最初、最後の $discord->run(); を書いていなくてなんで動かないか謎だったけど、Qiita をよく見たら書いてあった。

過去のメッセージを取得するコードを書く

PHPerKaigi 2021 の Day1 の途中から取得を始めたため、過去の投稿を取得する必要があったので、Discord のチャンネル毎に過去の投稿を全部取得するコードも書いた。
実際はチャンネルをループで回して全部取得したけど、サンプルは1つのチャンネルの全投稿を取得しています。

<?php

use Discord\Discord;
use Discord\Helpers\Collection;
use Discord\Parts\Channel\Channel;
use Discord\WebSockets\Event;

require_once __DIR__ . '/vendor/autoload.php';

$token = '{TOKEN}'; // Developer Portal から取得した Bot のトークン

$channel_id = '{CHANNEL_ID}'; // チャンネル名を右クリックから「IDをコピー」で取得したチャンネルID

function getMessageHistories(Channel $channel, array $option = [])
{
    $channel->getMessageHistory($option)->done(function (Collection $messages) use ($channel) {
        foreach ($messages as $message) {
            echo "{$message->author->username}: {$message->content}" . PHP_EOL;
            // 実際はここでメッセージを DB とかなにかに保存する
        }

        if (count($messages) === 100) {
            getMessageHistories($channel, ['before' => $message]);
        }
    });
}

$discord = new Discord(['token' => $token]);
$discord->on('ready', function (Discord $discord) use ($channel_id) {
    $channel = $discord->getChannel($channel_id);
    getMessageHistories($channel);
});

$discord->run();

おわりに

前回の iOSDC Japan 2020 から引き継いだコードもあるが、今回「ニコニコ生放送」「Twitter」「Discord」と投稿内容を取得したなかでは Discord が圧倒的に楽だった。
使ったライブラリのおかげもあると思うけど、殆ど自分でコードを書かなくてもリアルタイムに新規投稿を取得でき、めんどくさいことを考えなくて済んだのはよい。
まあ Twitter もちゃんと Streaming API を使えば楽だったんだろうけど、結構昔に書いたコードの焼き直しで済ませてしまったので…。

SQLite 3 でデータを JSON で出力する

PHPerKaigi 2021 で、SQLite にぶち込んでたデータを JSON 形式にして渡す必要があったので、SQLite のデータを JSON にする方法を調べたらめっちゃ簡単に JSON で出力できたって話。

SQLite 3.33.0 から、出力モードに JSON が選べるようになったらしく、なにか特別なことをしなくても出力モードの変更と、結果の出力先の指定をしてあげるだけでよかった。

sqlite> .mode json
sqlite> .once 'phperkaigi-tweets-day1.json'
sqlite> SELECT * FROM tweets WHERE created_at BETWEEN '2021-03-27 00:00:00' AND '2021-03-27 23:59:59' ORDER BY created_at;
sqlite> .exit

これだけで、カレントディレクトリに phperkaigi-tweets-day1.json ができあがるのでおしまい。 めっちゃ簡単でしたわー。

Windows Terminal がうるさくて、iTerm2 の Silence bell みたいな設定がないかなーと探していたら、どうやら bellStyle というのがあるらしいので設定したら静かになった。 プロファイルの設定なので、profiles の中で設定して終わり。

    "profiles":
    {
        "defaults":
        {
            "bellStyle": "none",
            ...
        },
    }

どうやら Windows Terminal 1.6 Preview だと visual とか指定ができてタブにベルアイコンがでるとかそういうのもあるらしいけど要らないので普通に none で。

久しぶりの Windows でずっとよく分からず困っていた、Shift とか Ctrl とかのモディファイアキーを押しっぱなしにしているとキーリピートが発生する件、やっぱりイライラするのでふとのどかのデフォルト設定にしたらどうなるんだろうって、プロファイルを切り替えたら発生しなくなった。 てことはやっぱり自分の設定が悪さしてるんだろうなということで、キーリピートの設定をコメントアウトしてみたら直った。 前に一度設定全部消して試してみたつもりだったけどなにか失敗してたのかなぁ。

削除した設定はこれ。Windows 10 になってからちゃんと効いてるのか若干怪しい感じでもあったのでまあ困らないんじゃないかなと思っている。

def option KeyboardDelay = enable 5 5

GitHub CLI が正式リリースされてから hub からの乗り換えをしようとしているけど、地味にリポジトリをブラウザで開くのがめんどくさかったので gh open で開けるようにエイリアスを設定したった。

$ gh alias set open 'repo view --web'

なんかどうなっているのかよく分からないけど WSL2 内の Ubuntu で実行しても Windows 側のブラウザが開くのでこれで多少 hub に近付いて便利になった。 あとは tig で見てる時に o で該当箇所をブラウザで開くのができるとサイコーなんだけどなさそうなんだよねぇ。

サクナヒメ買った

Twitterとかで見ていて気になり過ぎてしまったので多分ゼルダ以来久しぶりにゲームを買った。

とりあえず1回目の収穫と最初のボスを倒すくらいまでやったけど、初回の収穫でいまいちやねとか言われてしまうとそうだけど、そうなんだけど初めてなんだからもうちょい優しくしてよ!って気持ちになるw

 

どの程度米に力を入れれば良いのか分からなくて、朝一に言われるがまま水の調整をして冒険に行く。 くらいのことしかしてなかったので、まあそうよねって感じだけど、肥溜めとか見えてるし多分もうちょっと進めると色々要素増えてきて農家感増してくるんだろうなー、と思っている。

 

ただ、最初の時点からずっと全体的にあんまり登場キャラクターに良い印象がないのでそこがなー。

Windows でマルチモニタ環境のカーソル移動が引っかかってめんどくさすぎたので Non Stick Mouse in corners of Windows 10 ってのを入れて四隅が引っかからないようにした。
ダウンロードした exe ファイルがそのまま実行ファイルだったので、Explorershell:startup をアドレスバーに入れてスタートアップ開いてそこに放り込んで終わり。

まだ再起動してないけどこれで邪魔な引っかかりから開放されて平和なマルチモニタ生活が送れるはず。

Windowsがメインマシンになる未来が見えない

Windows 使ってみようと思ってから10日ほど経ったけど、Windows をメインにしていける未来が今のところ見えていない。  

平日は仕事があるのであまり使ってないんだけど、休日に触っていると何かやる度に今時の Windows  が分からなくてハマったり、Windows のアホみたいな挙動にイライラさせられてハマったり、WSL との連携が難しくてハマったりで快適に開発ができる状態に全然ならない。

使用初日に VS Code で簡単な修正の PR が投げれた時は思ったより簡単に行けたやんって感じだったのにその先がなかなか。  

でもまあ三歩進んで二歩下がる感じで少しずつは進んでいるのでいつかはメインマシンにできると信じたいなぁ。

Windows Terminal を入れてみた

Windows 10 時代のターミナルがなにかよく分からなかったので、とりあえず名前をよく見る Windows Terminal を入れて試用中。
プロファイル作って簡単に接続できたりするらしいんだけど、まだ WSL にしか繋がないのでそこは置いといて、フォント設定して、透過設定して、カーソルを変更した。

    "profiles":
    {
        "defaults":
        {
            // Put settings here that you want to apply to all profiles.
            "fontFace": "Source Code Pro",
            "fontSize": 12,
            "cursorShape": "filledBox",
            "useAcrylic": true,
            "acrylicOpacity": 0.85
        },
    }

ところで Windows Terminal の透過設定ってアプリがアクティブな時にだけ有効なん?