pslaboが試したことの記録

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

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

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


Ubuntu 16.04LTS に入れておきたいパッケージのメモ

完全に自分用のメモ。思いついたら追記する。

汎用的に使いそうなパッケージ

sudo apt install jq nkf dos2unix clang gcc vim fish

説明は省略。

Delphi for LInux の必須パッケージ

RAD Studio/Delphi 10.2 Tokyo Enterprise 以上では Linux 向けのコンパイラが含まれるけど、それを利用する場合の必須パッケージを記しておく。

なお、Embarcadero の evangelist な方々の手順には joe が入っているけど、これは要らんと思う。サーバ屋が joe とか使わないでしょ。せいぜい、vimemacs 。また、同様の理由で p7zip-full も要らないはず。そもそも p7zip が必要な状況が良くわからん。アーカイブ作ったり展開したりするなら必要だけど、Delphi for Linux のビルドでそんな作業は無いはず。

sudo apt install wget curl build-essential zlib1g-dev libcurl4-gnutls-dev

WindowsでIPv6を無効化したり有効化したり

単なるメモ。

IPv6 を無効化したらDelphi/C++BuilderLinux版PAServerがWindows10 1703 Creators Update の Bash on Windows で動かないかな、と思ったので試してみたけど変化なし。

https://support.microsoft.com/ja-jp/help/929852/how-to-disable-ipv6-or-its-components-in-windows

日付から曜日を求めるワンライナーを awkで

ウェブサイトにイベントの告知記事を書くときに、過去の記事を書き換えて流用しようとすると、日付は書き換えたけど曜日を書き換え忘れていたり、あるいは間違えて書いてしまったり、ということがあります。そういう間違いをチェックするのに日付とカレンダーを付き合わせても良いのだけれど、どうせなら何かのロジックで処理したい。

さて、曜日の計算を汎用的に行うにはツェラーの公式を使うのが基本ですけど、それだと処理が冗長になります。そんなことをせずとも、指定した日付に対応する曜日を取得する処理をカレンダー関連のコマンドや関数で取得する方がシンプルです。

そこで awk で日付文字列をパースしつつ、mktimeで内部形式(unix秒)に変換したのち、strftime で曜日だけ取得するように書いてみました。

awk -F "[年月日/]" '{ print strftime("%a", mktime( $1 " " $2 " " $3 " 0 0 0" )) }'

そうするとこんなふうに利用できます。

$ echo 2017/05/18 | awk -F "[年月日/]" '{ print strftime("%a", mktime( $1 " " $2 " " $3 " 0 0 0" )) }'
Thu
$ echo '2017年5月18日' | awk -F "[年月日/]" '{ print strftime("%a", mktime( $1 " " $2 " " $3 " 0 0 0" )) }'
Thu
$ awk -F "[年月日/]" '{ print strftime("%a", mktime( $1 " " $2 " " $3 " 0 0 0" )) }'
2017年 5月 18日
Thu
2017/5/18
Thu

日本語で表示してほしいなら LANG=ja_JP.UTF8 しておけばOKですね。

$ export LANG=ja_JP.UTF8
$ echo 2017/05/18 | awk -F "[年月日/]" '{ print strftime("%a", mktime( $1 " " $2 " " $3 " 0 0 0" )) }'
木

Windows10でスタートメニューが出ない場合の解決方法として良く紹介される手順の意味を確認する

自分自身はWindows10でスタートメニューが出ない不具合に遭遇したことは無いけれど、世の中的には割とあるらしい。

さて、そういう場合の対処方法として良く紹介される手順にはこういうものがある。これを管理者権限で実行するらしい。

dism /online /cleanup-image /restorehealth
sfc /scannow
powershell
Get-AppXPackage -AllUsers |Where-Object {$_.InstallLocation -like “*SystemApps*”} | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppXManifest.xml”}

これを単にコピペしてもよいのだけど、エンジニア的には内容を理解しておくほうが良さげ。

そこでこれらのコマンドの意味を確認しつつ、もっと切りつけ可能な部分はないかと考えてみる。

個々の処理の意味

dism.exe

dismはWindowsのイメージを操作するツール。

パラメータ 意味
/online 現在実行中のOSイメージに対して操作を行う
/cleanup-image イメージに対してクリーンアップおよび回復を試みる
/restorehealth コンポーネントストアの破損の有無をスキャンし、必要に応じて修復を試みる

sfc.exe

ファイルシステムの整合性をスキャンして、間違ったバージョンを正しい Windows バージョンに置換する

パラメータ 意味
/scannow 整合性をスキャンすると同時に、問題のあるファイルの修復も行う

Get-AppXPackage -AllUsers

すべてのユーザ向けのインストール済みストアアプリの情報を取得する

powershell

cmd.exe から PowerShell を起動する。

Where-Object {$_.InstallLocation -like “SystemApps”}

インストール先のフルパスに SystemApps を含むアプリだけを抽出する。

Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppXManifest.xml”}

抽出されたストアアプリについて、DisableDevelopmentMode でアプリを再登録する(サイドローディングする)

処理の最適化?

最適化、というほどでもないけれど、今回の作業はそもそも「PowerShellを管理者権限で実行」し、PowerShell上から下記3点を実行すればよさげ。特に Windows10 Creators Update ではコマンドプロンプトから PowerShell への置換が進みつつあるので、わざわざコマンドプロンプトから powershell を実行する意味がない。

dism /online /cleanup-image /restorehealth
sfc /scannow
Get-AppXPackage -AllUsers |Where-Object {$_.InstallLocation -like “*SystemApps*”} | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppXManifest.xml”}

sedで日本語表記の日付から年月日の漢字を消して/に置き換える

2017年 4月 19日や2017年4月19日のような日付形式をsedで置換しようとしたら意外にハマったのでメモ。

ポイントは以下の通り。 - ( や ) はエスケープ必要 - blankspace もエスケープ必要? - + や ? もエスケープ必要 - { や } もエスケープ必要

やりたいパターンマッチはこういう内容。

https://regexper.com/#(%5B0-9%5D%2B)%E5%B9%B4%20%3F(%5B0-9%5D%2B)%E6%9C%88%20%3F(%5B0-9%5D%2B)%E6%97%A5

だけど sed ではエスケープせねばならない部分が多いので、結果的にこういう処理になる。

$ echo '2017年  4月 19日' | sed 's/\([0-9]\+\)年\ \?\([0-9]\+\)月\ \?\([0-9]\+\)日/\1\/\2\/\3/g'
2017/4/19

上記の内容を踏まえたうえで日本語の日付時刻から漢字を抜く処理をこんなふうに書いてみた。

#!/bin/sed -f

s/\([0-9]\+\)年\ \?\([0-9]\+\)月\ \?\([0-9]\+\)日/\1\/\2\/\3/g
s/\([0-9]\+\)時\ \?\([0-9]\+\)分\ \?\([0-9]\+\)秒/\1:\2:\3/g
s/曜日//g
s/日/Sun/g
s/月/Mon/g
s/火/Tue/g
s/水/Wed/g
s/木/Thu/g
s/金/Fri/g
s/土/Sat/g

Windows10でタスクバーから時計を消す

アプリの操作デモを静止画や動画キャプチャーする場合に、タスクバーの時計が出ていると不都合な場合があるのですが、めったにやらない作業だけに忘れてしまいがちなのでメモしておく。

設定アプリから「システム」で検索すると「システムアイコンのオン/オフの切り替え」という項目が出るので、これを選ぶ。
f:id:pslabo:20170417112340p:plain


すると「時計」という項目があるので、これをオフにすれば、タスクバーから時計が消える。
f:id:pslabo:20170417112409p:plain

縦1200ピクセルの液晶モニタを縦向きで使ったらとても便利だった

職場の自分のデスクには3台のディスプレイがある。

1280x1024
1920x1080
1920x1200

いままではこれを次のような配置で使っていました。横置きと縦置きを組み合わせるのは、とても独特な配置だと自分でも思います。だけど、この配置は案外使いやすいんですよ。

f:id:pslabo:20170414215123p:plain

まず、右側のディスプレイを縦配置にしているのは、縦長の文書を読むのにちょうどよいからです。また、上下を半分に使い分けることでアプリのウィンドウ表示が横長のものを上下に2枚配置できます。ただしWindows10のショートカットキーではウィンドウを上下にキレイに配置する方法がないので、それを補填するために Sizer
http://www.brianapps.net/sizer/ というツールを使っています。

そして左側のディスプレイは閲覧頻度が低いけれど常時表示したいものを出しておく。

中央がメインの作業場なので、ここには最も広いディスプレイをアサインしてみました。。

そしてこれらのディスプレイは一度に支給されたものではなく、余っているものを順次徴用した結果、このような配置になっています。

今から新規にすべて買い揃えるならば、センターのディスプレイは4Kにするかも。


でも、ふと気づきました。

右のディスプレイを上下半分で使うと、上半分、下半分の大きさは 1024x768 に毛が生えた程度の広さでしかなく、微妙に狭いことに。

なのでこんなふうに変えてみることにしました。

f:id:pslabo:20170414220338p:plain

正直なところ、中央のディスプレイの縦が120ピクセル減っても大勢に影響はありません。

でも右のディスプレイの上半分、下半分がそれぞれ1200x960になるわけで、これはつまり1280x800に近い大きさが確保されていることになります。

些細な違いでしかないけれど、その違いが自分にとっては案外大きい違いだと気づきました。


ここまで書いていて、さらにふと思い出した。昨年3月までの勤務先ではこんな配置で使っていたことを。

f:id:pslabo:20170414220242p:plain

実は今回の構成とおなじく、縦1200ピクセルのモニタを縦置きで使っていたのです。そうすると1280x800のノートパソコンの液晶を上下に2枚並べているのと同様の使い勝手になるので、みやすさが全然違います。

たとえば、パワポの資料を上下に並べて片方を見ながらもう片方を編集、とか、動画をどちらかの半分で再生しながらもう半分で別のアプリを表示、などの使い方をやってみると、とても良い感じに使えることに気づくはずです。

というわけで、マルチモニタ構成の中に縦1200ピクセルのモニタがあるならば、一度縦向きで使ってみることをオススメいたします。