pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


find によるファイル検索で複数の拡張子を対象に探す

find で .h と .cpp の一覧を取得する必要が出たので方法をメモとして残します。

find . -type f \( -name '*.h' -or -name '*.cpp' \) | xargs ...

ファイル名やディレクトリ名にスペースが含まれるために -print0 したい場合は抽出条件の後に -print0 を記述します。

find . -type f \( -name '*.h' -or -name '*.cpp' \) -print0 | xargs -0 ...

先に -print0 してしまうと -name の条件式が評価されないようなので気を付けましょう。

SNSへのシェアボタンとはてなスターをブログの設定から外してみる

SNSへのシェアボタンとはてなスターをブログのパーツから外したらどのようにアクセス傾向が変わるかを検証してみようと思い、実際に外してみました。

現状、このブログへのアクセスは検索サービスからの流入ばかりです。検索サービス以外からの流入は無視できる程度しかありません。 f:id:pslabo:20200727062937p:plain

また、個別の記事を読んだらそのまま離脱という行動パターンの割合が高いです記事を読みに来てくれる方は情報収集と思いますが、大半の記事は自分で試したことや調べたことを書いているだけなので、目的の情報が得られたら離脱、という行動パターンになるのは必然と思います。

そうすると、検索サービス以外からの流入はあまり考えなくても良さそうですなので、外してみようと考えました。

この状態で8月末くらいまで運用してみて、違いが出るかどうかを調べてみようと思います。

単語の読みに同じ文字が3回続けて出現する単語をSKKの辞書から探す

はてなブックマークにこういうのを見付けたので、実際どれくらいあるものかと思い、SKKの辞書から抽出してみました。

anond.hatelabo.jp

$ nkf -w SKK-JISYO.L | ./find3chars.awk | cat -n
     1  かたたたk /肩叩/
     2  --- /——/
     3  ---- /——/
     4  ... /…/・・・;中黒x3/……;三点ダッシュx2 →....../
     5  ...... /……/
     6  1000 /千/サウザンド/thousand/
     7  aaa /トリプルA/
     8  basssolo /ベースソロ/
     9  businessscene /ビジネスシーン/
    10  businessschool /ビジネススクール/
    11  businesssoft /ビジネスソフト/
    12  casssini /カッシーニ/
    13  crossstitch /クロスステッチ/
    14  dressshirt /ドレスシャツ/
    15  dressshirts /ドレスシャツ/
    16  fff /フォルテッシシモ;ffより強く/fortessissimo/
    17  grassski /グラススキー/
    18  kissscene /キスシーン/
    19  parisiennne /パリジェンヌ/
    20  ppp /ピアニッシッシモ;ppより弱く/pianississimo/
    21  presssheet /プレスシート;和製英語/
    22  sssize /SSサイズ/SSサイズ/
    23  stainlesssteel /ステンレススチール/ステンレススティール/
    24  successstory /サクセスストーリー/
    25  uuu /ウンウンウニウム/Unununium/
    26  いとこおおおじ /従兄弟大小父/
    27  いとこおおおば /従兄弟大小母/
    28  うんえいいいん /運営委員/
    29  うんえいいいんかい /運営委員会/
    30  おおおか /大岡/
    31  おおおかえちぜん /大岡越前/
    32  おおおかさばき /大岡裁き;人情的な裁定/
    33  おおおかやま /大岡山/
    34  おおおかやまえき /大岡山駅/
    35  おおおく /大奥/
    36  おおおくさま /大奥様/
    37  おおおじ /大叔父;祖父母の弟/大伯父;祖父母の兄/従祖父/
    38  おおおとこ /大男/
    39  おおおば /大叔母;祖父母の妹/大伯母;祖父母の姉/従祖母/
    40  おおおみ /大臣/
    41  おおおやぶん /大親分/
    42  おおおんな /大女/
    43  かたたたき /肩叩き;辞職勧告/
    44  かみおおおか /上大岡/
    45  きききりん /樹木希林/
    46  きんゆうさいせいいいんかい /金融再生委員会/
    47  けいきゅうかみおおおか /京急上大岡/
    48  こうへいいいんかい /公平委員会/
    49  こくさいほげいいいんかい /国際捕鯨委員会/
    50  ざんていいいん /暫定委員/
    51  ざんていいいんかい /暫定委員会/
    52  しめいいいんかい /指名委員会;委員会等設置会社の取締役会内に設置される委員会/
    53  そこここ /其処此処/
    54  たいかいいいんちょう /大会委員長/
    55  ちょうていいいん /調停委員/
    56  ちょうていいいんかい /調停委員会/
    57  でんききき /電気機器/
    58  でんきききこうがく /電気機器工学/
    59  ひょうかかかく /評価価格/
    60  ふくしししゅつ /福祉支出/
    61  ふともももく /フトモモ目/Myrtales/
    62  ふともももくあぐん /フトモモ目亜群/
    63  みんせいいいん /民生委員/
    64  やまもももく /ヤマモモ目/Myricales/

25行目までの内容は今回抽出したいものとは趣旨が違いますが、26 - 64行目までの39件がSKKの辞書で確認できました。ぱっと見には、「い」または「お」が続くケースが多いようですね。ただしこの方法ですべての単語が網羅できているわけでもありません。たとえば「獅子身中の虫」がここにはありません(SKK-JISYO.L に単語として収録されていませんただしSKK-JISYO.requested には含まれています)

またこの方法で抽出できた単語のうち、同じ文字が4文字以上出現するケースは一つもありませんでした。

実際の抽出方法ですが、SKKの辞書はこちらのリポジトリからダウンロードしました。 github.com

またSKKの辞書は EUC-JP なので、nkfUTF-8 に変換しつつ、単語の読みに同じ文字が3回続けて出現するケースを下記のスクリプトで抽出しています。このスクリプトmacOS 上で試したのですが、macOS標準のawkは substr() で Unicode文字を正しく数えられないようでしたので、代わりに homebrew でインストールした gawk を使用しています。

#!/usr/local/bin/awk -f

{
    count=0

    prev = substr($1,1,1)
    for ( i = 2 ; i <= length($1) ; i++ ) {
        current = substr($1,i,1)

        if ( prev == current ) count++
        else count=0

        #print count, current
        prev = current

        if ( count >= 2 ) {
            print $0
            next
        }
    }
}

東海道・山陽新幹線のネット予約でスマートEXとEX予約のどちらに入会すべきかを考える

東海道・山陽新幹線をネット予約する場合の基本的な選択肢はスマートEXまたはEX予約だと思いますが、どちらもオンライン予約できて、乗車直前まで予約変更可能という点は共通です。しかし細かい内容が違います。

比較 スマートEX EX予約
年会費 不要 必要(1,100円)
運賃 通常料金-200円 EX予約会員向け価格
支払い 任意のクレジットカード 一部のクレジットカード
乗車方法 任意の交通系ICカード 乗車専用ICカード
ポイントプログラム なし ポイントに応じてグリーン車が利用可能(プラスEX会員は対象外)

年会費の有無と、運賃の差額分を考慮した場合に、利用頻度によってどちらを選ぶのが適当かを考えてみました。

どのサービスを選ぶべきか?

新幹線の年間乗車回数により、ちょうどよいサービスが違います。

年間乗車回数 選択すべきサービス 理由
東京-新大阪を往復6回以上利用 EX予約 ポイントプログラムでグリーン車に年1回乗車可能。年会費は指定のクレジットカード(年2,200円〜)+EX予約(年1,100円)
3回〜11回 EX予約(プラスEX会員) 既存のクレジットカードでEX予約会員登録でき、おトクな料金で乗車可能、年会費1,100円
1〜2回 スマートEX 年当たりの新幹線利用回数が1回以下の場合は年会費不要のスマートEX一択

スマートEXとEX予約の金額や差額(閑散期)は次のとおり。すべて東京駅からの乗車です。

行先 普通車自由席 普通車指定席 スマートEX EX予約 スマートEXとEX予約の差額
名古屋 10,560 11,100 10,900 10,310 590
京都 13,320 13,970 13,770 13,070 700
新大阪 13,870 14,520 14,320 13,620 700
博多 22,220 23,190 22,990 21,720 1,270

東京-名古屋の場合で590円なので、往復利用するなら1080円の差額。年会費のかからないスマートEXのほうが費用的にメリットがあります。新大阪や京都の往復を年1回利用するならEX予約(プラスEX会員)に切り替えたほうがメリットがあります。ただしEX予約は入会申し込みを行ってから乗車専用ICカードを受け取って利用可能になるまでのタイムラグがあるので、ある程度余裕を持って申し込む必要があります。入会して明日の予約をとりたい、というような差し迫った用途の場合はスマートEXしか選択肢がありません。

東京-新大阪の往復利用が年6回を超えるようなら、ポイントプログラムでたまるポイントで少なくとも年1回はのぞみのグリーン車を普通車指定席の料金で利用できます。ただしポイントはJR東海や西日本、一部のビューカードでEX予約で乗車する場合のみ溜まります。EX予約(プラス EX会員)やスマートEXは対象外なので、利用頻度が高い方は対象のクレジットカードを作ってEX予約に申し込みましょう。ポイントの利用については、グリーンプログラムで予約可能な残席がある場合に可能です。繁忙期は対象の残席がないこともありますが、それを除けば利用できるケースが多いと思います。 expy.jp

ちなみに、東京駅-博多駅区間を新幹線で移動する場合は、3往復半の利用でのぞみのグリーン車が普通車指定席料金で利用できるポイントが溜まります。この区間は飛行機を選ぶケースのほうが多いと思いますが、飛行機利用だと「羽田空港まで1時間、羽田空港で搭乗まで30分〜1時間、飛行機移動1時間30分、到着してから博多駅まで30分」という移動時間になりますので移動している感が強いと思います。細切れに分割された時間となるので、移動中に何かの作業をするとしたら、せいぜい、空港での搭乗まちと飛行機移動中くらいに限られます。しかし新幹線移動だと5時間というまとまった時間が取れるので、移動時間で浪費するというよりは、作業しながら移動という時間に当てられるので、案外ありです。

macOSの解像度をコマンドラインツールで変更する displayplacer の対応解像度一覧表示を改修する

先日、macOSの解像度をコマンドラインツールで変更する displayplacer の記事を投稿しましたが、このツールの微妙な欠点は、対応解像度を一覧表示する形式と、実際に解像度を指定する際の形式が似ているようで違っていて、本当に微妙なところで使いづらい点だと思います。

pslabo.hatenablog.com

そこで、一覧表示の形式にパッチを当てることにしました。displayplacer.c の下記の2箇所を修正するだけです。

--- displayplacer.c.orig  2020-07-24 16:517.000000000 +0900
+++ displayplacer.c 2020-07-24 17:23:29.000000000 +0900
@@ -283,9 +283,10 @@
 
         printf("Resolutions for rotation %i:\n", (int) CGDisplayRotation(curScreen));
         for (int i = 0; i < modeCount; i++) {
+            printf("id:%i ", curScreen);
             modes_D4 mode = modes[i];
 
-            printf("  mode %i: res:%dx%d", i, mode.derived.width, mode.derived.height);
+            printf("  mode:%i res:%dx%d", i, mode.derived.width, mode.derived.height);
 
             if (mode.derived.freq) {
                 printf(" hz:%i", mode.derived.freq);

そして改修したバージョンのdisplayplacerを使って解像増度設定を対話的に行うラッパースクリプトは次のようになります。

#!/bin/bash

which -s percol
if [ $? -eq 0 ]; then
    interactive_helper="percol"
fi

which -s peco
if [ $? -eq "0" ]; then
    interactive_helper="peco"
fi

if [ ${interactive_helper} == "" ]; then
    echo "abort: peco or percol requires to run"
    exit 1
fi

displayresolutionselect=$(
    displayplacer.new list |
    awk '$0 ~ /^id:/ { print }' |
    $interactive_helper
)

displayplacerparam=$(
    echo $displayresolutionselect |
    /usr/bin/awk '{ print $1" "$2 }'
)

displayplacer "${displayplacerparam}"
echo "change to \"${displayresolutionselect}\""

昨日、こちらの記事に投稿したスクリプトに比べて、さほど実装量は減りませんでした。 pslabo.hatenablog.com

ただし awk の文字列処理部分はシンプルになったので、これでよいのではと思っています。awk の処理が2箇所残っているのは、1箇所は displayplacer list の出力結果から解像度一覧だけを取得するための処理ですし、もう1箇所は id と mode だけを抽出するための処理です。その他の部分は peco や percol の検出などの処理なのでこれ以上削ることはできません。

自作キーボードには興味があるけど、そのまえにファンクションキーを使わないように矯正しなきゃ

エンジニアの方はなんらかの形でキーボードにこだわりがあると思いますが、自分自身も一応拘りがあり、1993年-2000年ごろは英語キーボードを使用していました。しかし英語キーボードに慣れすぎていると出先のPCを操作するときに困りますし、ノートパソコンの場合は英語キーボードが選択できるメーカーが限られるので、キーボード配列自体は日本語キーボードを選択しつつも、ここ15年くらいはMicrosoft の Ergonomic keyboard を使っています。

amzn.to amzn.to

Microsoftが販売するハードウェアって案外モノがよく、特に Ergonomic keyboard は一般的には高価な製品のはずですが、Microsoft製品はとてもリーズナブルな価格帯です。しかし実際に使うと、Ergonomic Keyboardという点とは別の点で不満があります。Natural Ergonomic Keyboard 4000 は、とにかく大きい。Sculpt Ergonomic はパームレスト部分の痛みが早いです。

そのような理由から、Microsoft 社製以外の Ergnomic キーボードも選択肢として考えたいのですが、Ergnomic は以前は選択肢が少ないことが悩みでした。しかし最近は自作キーボード向けに左右分離型のキーボードのキットも出回っていますから、選択肢は増えました。しかしいまのところは自作キーボードには手を出していません。手を出していない理由は「日々のPC操作の中にファンクションキーを使う操作が残っている」ためです。

とはいえ、実際にファンクションキーを使う操作が残っているのは、Excelでセル編集を開始するためにF2を押したり、かな漢字変換の際に入力中の文字列をひらがな、カタカナ、全角英数字、半角英数字に変換する程度の操作の頻度が高いので、ファンクションキーを使わない操作系に矯正すれば、自作キーボードに行けそうです。ただしこれらの操作は無意識のうちに行っているので、ちょっと時間をかけて矯正しなければならないかもしれない。

実際、過去に Happy Hacking Keyboard を購入したこともあるのですが、これが原因で使いこなすことができませんでした。

そういう前科があるので、うまく矯正できるかどうかわからないのですが、これからちょっとチャレンジしてみようと思います。

現状で下記2点のキーボードが気になっていますので、なんとか矯正したい。

ergodox-ez.com

yushakobo.jp

macOSで解像度変更をコマンドで実行できるdisplayplacerを対話的に利用するスクリプトを書く

先日、次の記事でmacOSの画面解像度をコマンドラインで変更できるツールを紹介したのですが、利用可能な解像度を探して手入力するのが面倒に感じたので、対話的に選んで実行できるラッパースクリプトを書きました。

pslabo.hatenablog.com

実行すると利用可能な解像度一覧が表示されます。一覧はインクリメンタルサーチで候補を絞り込めます。この操作のために peco or percol を使用します。 f:id:pslabo:20200723185808g:plain

このような機能を次の実装で実現しています。

  1. displayplacer list を実行して display id と mode をリスト化する
  2. リストを peco or percol で選択できるようにする
  3. 選択されたリストから id:xxx mode:nnn を取得して displayplacer を実行して解像度を変える

displayplacer list のリスト表示自体がそのままパラメータとして再利用できる形式であれば、displayplacer $( displayplacer list | peco ) のように実行すれば済むのですが、惜しいことにそのまま渡せない形式だったため、こういう実装でカバーしました。

スクリプト自体は bash の書き出しで始まっていますが、主要な文字列処理は awk です。スクリプトを changeres.sh とかの名前で保存してご利用ください。

#!/bin/bash

which -s percol
if [ $? -eq 0 ]; then
    interactive_helper="percol"
fi

which -s peco
if [ $? -eq "0" ]; then
    interactive_helper="peco"
fi

if [ ${interactive_helper} == "" ]; then
    echo "abort: peco or percol requires to run"
    exit 1
fi

displayresolutionselect=$(
    displayplacer list |
    /usr/bin/awk '
        $1 == "Contextual" {
            id=$4
        }

        $1 == "mode" {
            printf "id:%s%s\n", id, $0
        }' | 
    $interactive_helper
)

displayplacerparam=$(
    echo $displayresolutionselect |
    /usr/bin/awk '
        BEGIN {
            FS="[ :\t]+"
        }

        {
            printf "%s:%s %s:%s\n", $1,$2,$3,$4
        }'
)

if [ "${displayplacerparam}" == ": :" ]; then
    echo "$0: cancelled"
    exit 1
fi

displayplacer "${displayplacerparam}"
echo "change to \"${displayresolutionselect}\""