The Man Who Fell From The Wrong Side Of Sky:最新 5 日分

2020/2/28(Fri)

[自宅システム管理] Windows 10のカスタマイズ(2) - フォトビューアをMicrosoft PhotosからPhoto Viewerに戻す

Windows10からデフォルトのフォトビューアが Microsoft PhotosというUWPアプリに変更になってるんだけど、これまでのPhoto Viewerとぱっとみ似てるが操作性は結構違う上に何より動作が数十倍遅いので、パソコンを使う理由の8割がデジカメ写真鑑賞の老人からまたクレームの山になること請け合いなので大いに困る。

@何はともあれMicrosoft Photosをアンインストールする

似たようなアプリが2つあると老人が混乱するのでな、なんせ老人はもう10年以上パソコンを使ってるにも関わらず今自分が使ってるのがワイの入れたPhotoshop Elementsなのか手前で勝手に入れたGimpなのかの区別すらつかないレベルなもんでな…ほんまクレームつけられる身にもなって欲しいですわ。

あとついでにWindows 10からデフォルトの画像編集ソフトがペイントから3Dペイントとかいうクソアプリに変わったけど老人に不要な機能なのでこいつら関係も全部削除。ほんとは元製図屋なんだしCADのひとつでも扱えて然るべきなんだが、現役時代にCADを小馬鹿にして導入すら検討せず時代に取り残され仕事を失ったピーの末路やな。

まあええわ、アンインストール自体は「設定→アプリと機能」から簡単にできるけど、それじゃ面白みが無いのでPowerShellで実行すると

$list =
  'Microsoft.Microsoft3DViewer',
  'Microsoft.MixedReality.Portal',
  'Microsoft.MSPaint',
  'Microsoft.Print3D',
  'Microsoft.Windows.Photos'
Get-ProvisionedAppxPackage -Online | Where-Object {
    $list -contains $_.DisplayName
} | ForEach-Object {
    Remove-ProvisionedAppxPackage -Online -PackageName $_.PackageName
}

ちゅー感じですかね(要管理者権限)、うん面白くもなんもねーわ。

@レジストリを編集してPhoto Viewerを復活させる

別にWindows 7からバイナリ持ってこなくてもPhoto Viewer自体はTIFFビューア及び印刷プレビューのためのツールとして生き残ってるのでレジストリ操作だけでおk。 ググるとやり方を紹介するブログがいくつもヒットするし、NTLiteのようなTweakツールでも設定項目として用意されるのですでにご利用の方もおられるだろう、え?相変わらずUNIXなんて使ってんの?(煽り)

ところがどうもネタ元が全部同じでしかも中途半端な仕事なので、どの記事の通りにレジストリを編集してもMicrosoft Photosをアンインストールした状態だと

  • 「設定→既定のアプリ」でフォトビューアの項が「規定を選ぶ」つまりアプリ無しになっていまう
  • そのため画像ファイルをクリックしたときの既定の動作が「プレビュー」でなく「編集」に変わってしまい、ペイントが起動してしまう
  • Photo Viewerのメニューから「開く」を選ぶとPhoto Viewer自身が候補に出てくる無限ループって怖くね?状態

なのよね。

ということでワイがWindows 7のレジストリとしばし格闘して作った.regがこちら(bitbucketにも 置いておく)。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Applications\photoviewer.dll\shell\open]
"MuiVerb"="@photoviewer.dll,-3043"

[HKEY_CLASSES_ROOT\Applications\photoviewer.dll\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\Applications\photoviewer.dll\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\icofile\shell\open]
"MuiVerb"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,\
  69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,\
  00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,\
  72,00,5c,00,70,00,68,00,6f,00,74,00,6f,00,76,00,69,00,65,00,77,00,65,00,72,\
  00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,34,00,33,00,00,00

[HKEY_CLASSES_ROOT\icofile\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\icofile\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\jpegfile\shell\open]
"MuiVerb"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,\
  69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,\
  00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,\
  72,00,5c,00,70,00,68,00,6f,00,74,00,6f,00,76,00,69,00,65,00,77,00,65,00,72,\
  00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,34,00,33,00,00,00

[HKEY_CLASSES_ROOT\jpegfile\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\jpegfile\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\Paint.Picture\shell\open]
"MuiVerb"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,\
  69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,\
  00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,\
  72,00,5c,00,70,00,68,00,6f,00,74,00,6f,00,76,00,69,00,65,00,77,00,65,00,72,\
  00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,34,00,33,00,00,00

[HKEY_CLASSES_ROOT\Paint.Picture\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\Paint.Picture\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\pjpegfile\shell\open]
"MuiVerb"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,\
  69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,\
  00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,\
  72,00,5c,00,70,00,68,00,6f,00,74,00,6f,00,76,00,69,00,65,00,77,00,65,00,72,\
  00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,34,00,33,00,00,00

[HKEY_CLASSES_ROOT\pjpegfile\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\pjpegfile\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\pngfile\shell\open]
"MuiVerb"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,\
  69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,\
  00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,\
  72,00,5c,00,70,00,68,00,6f,00,74,00,6f,00,76,00,69,00,65,00,77,00,65,00,72,\
  00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,34,00,33,00,00,00

[HKEY_CLASSES_ROOT\pngfile\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\pngfile\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\wdpfile\shell\open]
"MuiVerb"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,\
  69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,\
  00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,\
  72,00,5c,00,70,00,68,00,6f,00,74,00,6f,00,76,00,69,00,65,00,77,00,65,00,72,\
  00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,34,00,33,00,00,00

[HKEY_CLASSES_ROOT\wdpfile\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\wdpfile\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\WPDContextMenu.Image\shellex\ContextMenuHandlers\ShImageViewer]
@="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Bitmap]
"ImageOptionFlags"=dword:00000001
"FriendlyTypeName"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,\
  00,46,00,69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,\
  77,00,73,00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,\
  00,65,00,72,00,5c,00,50,00,68,00,6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,\
  65,00,72,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,35,00,36,00,00,\
  00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Bitmap\DefaultIcon]
@="%SystemRoot%\\System32\\imageres.dll,-70"

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Bitmap\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Bitmap\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.JFIF]
"EditFlags"=dword:00010000
"ImageOptionFlags"=dword:00000001
"FriendlyTypeName"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,\
  00,46,00,69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,\
  77,00,73,00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,\
  00,65,00,72,00,5c,00,50,00,68,00,6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,\
  65,00,72,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,35,00,35,00,00,\
  00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.JFIF\DefaultIcon]
@="%SystemRoot%\\System32\\imageres.dll,-72"

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.JFIF\shell\open]
"MuiVerb"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,\
  69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,\
  00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,\
  72,00,5c,00,70,00,68,00,6f,00,74,00,6f,00,76,00,69,00,65,00,77,00,65,00,72,\
  00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,34,00,33,00,00,00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.JFIF\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.JFIF\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Jpeg]
"EditFlags"=dword:00010000
"ImageOptionFlags"=dword:00000001
"FriendlyTypeName"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,\
  00,46,00,69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,\
  77,00,73,00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,\
  00,65,00,72,00,5c,00,50,00,68,00,6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,\
  65,00,72,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,35,00,35,00,00,\
  00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Jpeg\DefaultIcon]
@="%SystemRoot%\\System32\\imageres.dll,-72"

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Jpeg\shell\open]
"MuiVerb"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,\
  69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,\
  00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,\
  72,00,5c,00,70,00,68,00,6f,00,74,00,6f,00,76,00,69,00,65,00,77,00,65,00,72,\
  00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,34,00,33,00,00,00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Jpeg\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Jpeg\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Png]
"ImageOptionFlags"=dword:00000001
"FriendlyTypeName"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,\
  00,46,00,69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,\
  77,00,73,00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,\
  00,65,00,72,00,5c,00,50,00,68,00,6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,\
  65,00,72,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,35,00,37,00,00,\
  00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Png\DefaultIcon]
@="%SystemRoot%\\System32\\imageres.dll,-71"

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Png\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Png\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Wdp]
"EditFlags"=dword:00010000
"ImageOptionFlags"=dword:00000001

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Wdp\DefaultIcon]
@="%SystemRoot%\\System32\\wmphoto.dll,-400"

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Wdp\shell\open]
"MuiVerb"=hex(2):40,00,25,00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,\
  69,00,6c,00,65,00,73,00,25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,\
  00,20,00,50,00,68,00,6f,00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,\
  72,00,5c,00,70,00,68,00,6f,00,74,00,6f,00,76,00,69,00,65,00,77,00,65,00,72,\
  00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,33,00,30,00,34,00,33,00,00,00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Wdp\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,72,00,75,00,\
  6e,00,64,00,6c,00,6c,00,33,00,32,00,2e,00,65,00,78,00,65,00,20,00,22,00,25,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,46,00,69,00,6c,00,65,00,73,00,\
  25,00,5c,00,57,00,69,00,6e,00,64,00,6f,00,77,00,73,00,20,00,50,00,68,00,6f,\
  00,74,00,6f,00,20,00,56,00,69,00,65,00,77,00,65,00,72,00,5c,00,50,00,68,00,\
  6f,00,74,00,6f,00,56,00,69,00,65,00,77,00,65,00,72,00,2e,00,64,00,6c,00,6c,\
  00,22,00,2c,00,20,00,49,00,6d,00,61,00,67,00,65,00,56,00,69,00,65,00,77,00,\
  5f,00,46,00,75,00,6c,00,6c,00,73,00,63,00,72,00,65,00,65,00,6e,00,20,00,25,\
  00,31,00,00,00

[HKEY_CLASSES_ROOT\PhotoViewer.FileAssoc.Wdp\shell\open\DropTarget]
"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

[HKEY_CLASSES_ROOT\SystemFileAssociations\.bmp\OpenWithList\PhotoViewer.dll]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.dib\OpenWithList\PhotoViewer.dll]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.gif\OpenWithList\PhotoViewer.dll]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.ico\OpenWithList\PhotoViewer.dll]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.jfif\OpenWithList\PhotoViewer.dll]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.jpe\OpenWithList\PhotoViewer.dll]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.jpeg\OpenWithList\PhotoViewer.dll]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.jpg\OpenWithList\PhotoViewer.dll]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.jxr\OpenWithList\PhotoViewer.dll]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.png\OpenWithList\PhotoViewer.dll]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.rle\OpenWithList\PhotoViewer.dll]

[HKEY_CLASSES_ROOT\SystemFileAssociations\.wdp\OpenWithList\PhotoViewer.dll]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations]
".jpg"="PhotoViewer.FileAssoc.Jpeg"
".wdp"="PhotoViewer.FileAssoc.Wdp"
".jfif"="PhotoViewer.FileAssoc.JFIF"
".dib"="PhotoViewer.FileAssoc.Bitmap"
".png"="PhotoViewer.FileAssoc.Png"
".bmp"="PhotoViewer.FileAssoc.Bitmap"
".jpe"="PhotoViewer.FileAssoc.Jpeg"
".jpeg"="PhotoViewer.FileAssoc.Jpeg"
".gif"="PhotoViewer.FileAssoc.Gif"

長げえよ!

あとついでに3Dペイントをアンインストールしても、右クリックのコンテキストメニューに「3Dペイントで編集」が残ってしまって邪魔なのでこれもレジストリを編集して消す(やっぱりbitbucketに 置いておく)。

Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\.bmp\Shell\3D Edit]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\.gif\Shell\3D Edit]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\.jfif\Shell\3D Edit]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\.jpe\Shell\3D Edit]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\.jpeg\Shell\3D Edit]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\.jpg\Shell\3D Edit]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\.png\Shell\3D Edit]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\.tif\Shell\3D Edit]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\.tiff\Shell\3D Edit]

@結論

これでようやっとWindows 7と同様に軽快なPhoto Viewerで画像プレビューができるようになったけど、次の大型アップデートで全部消えたりするリスクからは逃れられないのだ、やっぱりWindows 7 ESU買った方が良くね(2回目)

2020/2/27(Thu)

[自宅システム管理] Windows 10のカスタマイズ(1) - Microsoft IMEをなるべくWindows 7と同じ使い勝手に戻す

新型コロナ(not トヨタ車)騒動で病院もパニック状態なようで、予防措置として家族の面会も禁止と相成った、まぁWindows 10移行作業で現実逃避でもするかね…

入院してない方の老人はもう10年以上パソコン使ってるにも関わらず、Caps Lockやカナ入力のキーボード操作からの解除を覚える気が無いので、マウス操作でMicorosoft IME言語バーのボタンから操作させるよう教えていたのだよね。

ところが困ったことにWindows 10はデフォルトでMicrosoft IMEの言語バーが表示されないのだよな、通知領域に英語/日本語のモード切替ができるアイコンがあるだけちゅーどうしてこうなった状態。

まぁ設定変更すりゃいいだけなんだけど、これがまたメニュー階層が深く検索からショートカットしようにも名前も覚えづらいので備忘録的に書いておく。

@言語バーを表示する

言語バーを表示する設定は 「設定→時刻と言語→言語→スペルチェック、入力、キーボードの設定→キーボードの詳細設定」で「使用可能な場合にデスクトップ言語バーを使用する」にチェックを入れる。

これで言語バーが表示される。

直接レジストリを編集してセットするには

[HKEY_CURRENT_USER\Control Panel\Desktop]
"UserPreferencesMask"=hex(3):9E,1E,07,80,12,00,00,00

[HKEY_CURRENT_USER\Control Panel\Desktop]
"UserPreferencesMask"=hex(3):9E,1E,07,80,12,01,00,00

とUserPreferencesMaskの6バイト目の第1ビットにフラグたてればOK(反映されるにはログオフが必要)。

ただし上記をそのまま.regファイルとして結合しちゃうと他のデスクトップの視覚効果の設定まで変わっちゃうので、PowerShellで

$path = 'HKCU:Control Panel\Desktop'
$key = 'UserPreferencesMask'
$value = (Get-ItemProperty -Path $path).$key
if (-not ($value[5] -band 0x1)) {
    $value[5] = $value[5] -bor 0x1
    Set-ItemProperty -Path $path -Name $key -Type Binary -Value $value
}

とすればいい。

@言語バーを最小化表示する(タスクバーにドックする)

そして言語バーについてはさっきの項目の直下にある「言語バーのオプション」をクリックして「テキストサービスと入力言語」ダイアログを表示し、「言語バー」タブを開くと

  • デスクトップ上でフロート表示する(0)
  • タスクバーに固定する(4)
  • 表示しない(3)

の設定があるのでこれをお好きなように設定すればいい。

レジストリで変更するには以下のキーに

[HKEY_CURRENT_USER\Software\Microsoft\CTF\LangBar]
"ShowStatus"=dword:00000004

選択した値をセットすればよい(反映されるにはログオフが必要)。

今回はWindows 7でのデフォルトと同じくタスクバーに固定を選択する。

ところがこのままだとタスクバー上に最小限のアイコンしか表示されず、当初の言語バーなしと大差ない状態に、アホかよ。

@最小化した言語バーに追加のボタンを表示させる

よってさっきの項目の直下にある「言語バーアイコンをタスクバーで表示する」の項目にチェックを入れてほかのアイコンも表示する。

これをレジストリで設定するには以下のキーに

[HKEY_CURRENT_USER\Software\Microsoft\CTF\LangBar]
"ExtraIconsOnMinimized"=dword:00000001

値(1)をセットする(反映されるにはログオフが必要)。

まぁこんなもんでええか…

@ここで一点バグ

ただし一点だけ困ったことにタスクバーにドックだと、CAPS/KANAボタン及びオプションボタンの文字および境界色がタスクバーと同じになってしまって見えないという不具合があるのだ、無理矢理フラットUI化した弊害ですかねこれ。もう直せる人間残ってないとかそういうパターンな気がする。

アクセシビリティをハイコントラスト設定にすると見えるけど、これはさすがに常用できんわ…

まぁどうせCAPS/KANAをオフにする目的でしか使わないだろうから今回は大目に見る、クレームが来たらフロートに戻すかな。

@邪魔くさいIMEステータス表示をオフにする

そんであのIMEの切替の度に画面の真ん中にでっかくVisual Bellが表示されるのがウザいので、それをOFFにするには 「設定→地域と言語→言語→優先する言語→日本語」をクリックし表示された「オプション」を押す。 続けて「言語のオプション:日本語→キーボード→Microsoft IME」をクリックし表示されたオプションを押す。 表示された「Microsoft IME」画面で「画面中央に入力モードを表示する」のチェックを外す。

別解としてはMicrosoft IMEの言語バーの「ツール→プロパティ」ダイアログで以下同文。

レジストリで直接弄るなら

[HKEY_CURRENT_USER\Software\Microsoft\IME\15.0\IMEJP\MSIME]
"ShowImeModeNotification"=dword:00000000

とする、こちらはログオフ不要で即時反映される。

こいつらの設定はデフォルトユーザーのレジストリに統合しておきたい感もあるんだけど、UserPreferencesMaskあたりの値は%USERPROFILE%\Default\NTUSER.DATの中みてみると存在しないようで、新規ユーザ作成時に上書きされて消されるんじゃないかなぁという気がするので試していない。

@結論

いやーもうWindows 7 ESU買った方がいいんじゃねえかなこれ…

2020/2/10(Mon)

[pなんとかsrc] gccの提供するライブラリとパッケージシステムが生み出す地獄

いい加減捨てたいpなんとかsrcなんだけど、複数のgccがインストールされている環境で異なるバージョンのgccでビルドしたバイナリをリンクすると、それぞれのgccが用意するlibgcc_sがチャンポンでリンクされて気持ち悪いことになる問題があったのよね。

ところが何時の頃からかよう知らんけど、今のpなんとかsrcではlibgcc_sはoptions.mkに定義されてるように

###
### Don't install libgcc if it's older than the system one
###
.if empty(PKG_OPTIONS:Malways-libgcc)

.  for _libdir_ in ${_OPSYS_LIB_DIRS}
.    if exists(${_libdir_})
BASE_LIBGCC!=                   find ${_libdir_} -name libgcc_s.so
BASE_LIBGCC_MATCH_STRING!=      ${ECHO} ${BASE_LIBGCC} ${GCC8_DIST_VERSION} | \
                                ${AWK} -f ../../mk/scripts/larger_symbol_version
.awk
.      if ${BASE_LIBGCC_MATCH_STRING:Mnewer}
DELETE_INSTALLED_LIBGCC=        yes
.      endif
.    endif
.  endfor

.  if ${DELETE_INSTALLED_LIBGCC:Uno}
post-install:   delete-installed-libgcc
delete-installed-libgcc:
        ${FIND} ${DESTDIR} -name 'libgcc_s.so*' -delete

.  endif

.endif

みたいな処理がMakefileにあって、システムのlibgcc_sとバージョン同じなら削除するというkludgeが入ってこれで一件落着解決したぜ!ってことらしい、うーんこの。

ちなみにlibgcc_sはずっと1.0からバージョン変わってないので常に消されるかんじ、Solaris方面だけalways-libgccがオプション指定されて常に残すようになってるのはまぁこの荒っぽい方法では問題があるんだろう、そりゃ起きるわ。

まぁ臭いものに蓋をしたのだけど、同じ問題はgccが提供する他のライブラリ例えばlibstdc++なんかでも発生するんですわ、なもんで結局のところパッケージシステムってのは常に単一バージョン(最新が望ましい)のgccによってビルドされるのが理想なんよね。

しかしpなんとかsrcではそのパッケージがそのコンパイラでサポートされるC/C++の新機能が必要なときだけ、mk/compiler/gcc.mkに定義されてるGCC_REQDというマクロを使って都度切り替えるという逃げをうっているのだ。

# GCC_REQD
#       The minimum version of the GNU Compiler Collection that is
#       required to build this package. Setting this variable doesn't
#       change the compiler that is used for building packages. See
#       ONLY_FOR_COMPILER for that purpose. This is a list of version
#       numbers, of which the maximum version is the definitive one.
#
#       This variable can also be set by the user when USE_PKGSRC_GCC
#       is in effect to ensure that a specific compiler is used for
#       packages which do not specify a higher version.

まあgcc3以降に含まれるlibstdc++(いわゆるlibstdc++v3ってやつ)はずっと7のままなので、SONAME(≒メジャー番号)一致するからバイナリ後方互換があるわけで、この方法でも普通は問題にならんはずなんだ。正しく運用されていればな!

ところが現在のpなんとかsrcってやつの運用はそうではない、恐ろしいことに/usr/pkg/gcc${VERSION}とすべて別のディレクトリにインストールされてしまうのだ。 そもそも別ディレクトリじゃなきゃlibgcc_sもかような問題は起きなかったわけで。

その上リンクオプションに-Wl,-rpathまで指定してRPATH埋め込んでくれやがるので、いろいろとヤバい状態になってしまう。

$ find /usr/pkg -regex "/usr/pkg/gcc[[:digit:]]*/lib/libstdc\+\+\.so\.[[:digit:]]*\.[[:digit:]]*" 2>/dev/null | sort
/usr/pkg/gcc48/lib/libstdc++.so.7.19
/usr/pkg/gcc49/lib/libstdc++.so.7.20
/usr/pkg/gcc5/lib/libstdc++.so.7.21
/usr/pkg/gcc6/lib/libstdc++.so.7.22
/usr/pkg/gcc7/lib/libstdc++.so.7.24
/usr/pkg/gcc8/lib/libstdc++.so.7.25
/usr/pkg/gcc9/lib/libstdc++.so.7.27

ここで一点注意、Linuxとpなんとかsrc(つまりNなんとかBSD基準)ではlibstdc++のバージョンが違う、なもんでgccの ABI Policy and Guidelines読んでてクッソ混乱するのいいよねよくない。

基本的にはLinuxにおけるlibstdc++6.0.Xはpなんとかsrcではlibstdc++7.Xになるので適宜脳内で置換してちょうだい。 おそらく64bit time_tの時に必要に迫られて独自に6から7にmajor crunkしたんだっけ?もう記憶にないですわ。 でもこのルールだとオレオレN6のbaseのlibstdc++は/usr/lib/libstdc++.so.7.14になるはずなんだけど、なんで/usr/lib/libstdc++.so.7.1なんだっけか、多分何も考えてなかったんだろうけど。

話を戻してなぜダメなのかを説明する、まず以下のコード

#include <iostream>
using namespace std;
void
foo()
{
        cout << "foo" << endl;
}

これをgcc7で以下の通り共有ライブラリとしてビルド

$ /usr/pkg/gcc7/bin/g++ -fPIC -shared -Wl,-soname,libfoo.so.0 -o libfoo.so.0 foo.cc
$ ln -sf libfoo.so.0 libfoo.so
$ ldd libfoo.so
libfoo.so:
        -lstdc++.7 => /usr/pkg/gcc7//lib/./libstdc++.so.7
        -lm.0 => /usr/lib/libm.so.0
        -lgcc_s.1 => /usr/lib/libgcc_s.so.1
        -lc.12 => /usr/lib/libc.so.12

そしてもういっちょ

#include <iostream>
using namespace std;
void
bar()
{
        cout << "bar" << endl;
}

こいつも以下同文、ただしgcc8を使う。

$ /usr/pkg/gcc8/bin/g++ -fPIC -shared -Wl,-soname,libbar.so.0 -o libbar.so.0 bar.cc
$ ln -sf libbar.so.0 libbar.so
$ ldd libbar.so
libbar.so:
        -lstdc++.7 => /usr/pkg/gcc8/lib/./libstdc++.so.7
        -lm.0 => /usr/lib/libm.so.0
        -lgcc_s.1 => /usr/lib/libgcc_s.so.1
        -lc.12 => /usr/lib/libc.so.12

そんで最後にlibfooとlibbarをリンクするプログラム

#include <iostream>
using namespace std;
extern void foo();
extern void bar();
int
main()
{
        foo();
        bar();
}

こいつをシステムのgcc(オレオレN6はgcc45)でビルドしようとすると

$ g++ -Wl,-rpath,. -L. -lfoo -lbar -o main main.cc
./libfoo.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)@GLIBCXX_3.4'
./libfoo.so: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)@GLIBCXX_3.4'
./libfoo.so: undefined reference to `std::cout@GLIBCXX_3.4'
./libfoo.so: undefined reference to `std::ios_base::Init::Init()@GLIBCXX_3.4'
./libfoo.so: undefined reference to `std::ios_base::Init::~Init()@GLIBCXX_3.4'
./libfoo.so: undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))@GLIBCXX_3.4'

ご覧の通りリンク通らんのですわな、そもそもN6 baseのlibstdc++って長いことld_elf.soにELF symbol versioningが実装されてなかった関係で--disable-symversつきでビルドされとるんやなこれ。 そんなんすっかり忘れとったわ。

まぁオレオレN6のgccが古過ぎる上にもうサポート終了してるから本家では発症しないのだろう、ということでここは--enable-symversつきになったかは知らんけどN7と同じgcc48を使ってみる。

$ /usr/pkg/gcc48/bin/g++ -Wl,-rpath,. -L. -lfoo -lbar -o main main.cc
$ ldd main
main:
        -lfoo.0 => ./libfoo.so.0
        -lstdc++.7 => /usr/pkg/gcc7/lib/./libstdc++.so.7
        -lm.0 => /usr/lib/libm.so.0
        -lgcc_s.1 => /usr/lib/libgcc_s.so.1
        -lc.12 => /usr/lib/libc.so.12
        -lbar.0 => ./libbar.so.0
        -lstdc++.7 => /usr/pkg/gcc8//lib/./libstdc++.so.7
        -lstdc++.7 => /usr/pkg/gcc48/lib/./libstdc++.so.7

今度はリンク成功したんだけど、ldd(1)の結果をみてお分かりのようにlibstdc++がgcc{48,7,8}と3つもリンクされてしまっとるのよねこれ。

そんでプログラムを実行してどのlibstdc++が使われるのかを見てみると(前も書いた気がするけどNのバヤイlddで表示される順ではないのだ)

$ ktruss ./main | grep libstdc++
  6501      1 main     open("/usr/pkg/gcc48/x86_64--netbsd/lib/./libstdc++.so.7", 0, 0x2b6364747362696c) Err#2 ENOENT
  6501      1 main     open("/usr/pkg/gcc48/lib/./libstdc++.so.7", 0, 0x2b6364747362696c) = 3
  6501      1 main     open("/usr/pkg/gcc7/x86_64--netbsd/lib/./libstdc++.so.7", 0, 0x2b6364747362696c) Err#2 ENOENT
  6501      1 main     open("/usr/pkg/gcc7/lib/./libstdc++.so.7", 0, 0x2b6364747362696c) = 3
  6501      1 main     open("/usr/pkg/gcc8//lib/./libstdc++.so.7", 0, 0x38) = 3

とmain.ccをビルドしたgcc48のlibstdc++が最初に読み込まれてる、なもんで以前書いた リンカとリンクローダーの挙動を念頭に考えるとこいつが使われわけやね。

そうすると以前書いた 共有ライブラリの前方互換性問題を踏んでしまう可能性があるわよねこれ、まぁこの記事で取り上げてるUndefined symbolみたいなわかりやすい問題は起きない(後にリンクされてるlibstdc++のものが使われるから)、よって余計に性質が悪いのだけど。

これなぁ本当はヘッダはそれぞれ別ディレクトリでええけどライブラリはちゃんと全部/usr/pkg/libの下にインストールしてlibstdc++.so(\.7)?をlibstdc++.so.7.27(最新版)のsymlinkとすることで、すべてのバージョンのgccが最新のlibstdc++をリンクするようにせんとアカンはずなんだがなぁ、それでもbaseのlibstdc++についてはsymverやRPATHの問題残るけど。

そんでそもそも論としてやっぱ以前にも書いたけど 異なる--std=*でコンパイルしたオブジェクトは混ぜるな危険問題もあるからなぁ(C++はnamespaceあるから多少はマシとはいえ)、これは正直パッケージシステム側で解決しきれる問題じゃないよね。

これまではlibstdc++だけ気をつけてればよいすなわちC++を滅ぼせばよかったんだが、C11以降はアトミックやら複素数やらスレッドやらでCもこの問題から逃げられねえからな。まとめてC/C++滅べ。

2020/2/5(Wed)

[オレオレN6] lang/gcc8でビルドエラー

表題の通りなのだが、理由自体は非常にシンプルでgccのビルドにはいくつか依存ライブラリがあるのだけど

がfor文の()内変数宣言を使ってるのでC99でビルドする必要があるのだけどそうなっとらんのが理由であった。

libtool: compile:  cc -DHAVE_CONFIG_H -I. -I../../../gcc-8.3.0/gmp/mpn -I.. -D__GMP_WITHIN_GMP -I../../../gcc-8.3.0/gmp -DOPERATION_compute_powtab -I/usr/include -DNO_ASM -g -c compute_powtab.c -o compute_powtab.o
compute_powtab.c: In function 'mpn_compute_powtab_mul':
compute_powtab.c:142:3: error: 'for' loop initial declarations are only allowed in C99 mode
compute_powtab.c:142:3: note: use option -std=c99 or -std=gnu99 to compile your code
...

これ最近のコミットでdevel/gmpのバージョンが6.1.2から6.2.0に上がったことで発生するようになった模様。

まぁ必要な修正は

diff --git a/lang/gcc8/Makefile b/lang/gcc8/Makefile
index 9267b35682..51128d178e 100644
--- a/lang/gcc8/Makefile
+++ b/lang/gcc8/Makefile
@@ -23,7 +23,7 @@ EXTRACT_ONLY=         ${DEFAULT_DISTFILES}

 NOT_FOR_PLATFORM=      Interix-*-*

-USE_LANGUAGES=         c c++
+USE_LANGUAGES=         c99 c++
 USE_TOOLS+=            gmake makeinfo sed tar
 USE_TOOLS.NetBSD+=     gsed
 PYTHON_FOR_BUILD_ONLY= tool

だけなのでそう大きな問題ではないのだけど、なんで本家でこれ問題にならんのだろうな。 オレオレN6のgcc 4.5.3だとエラーになるけどそれ以降は警告レベルに緩められたのだろうか。 もはやそのあたりの挙動の違いとかすっかり記憶の彼方もいいところなのでな…

そして今更lang/gcc9が生えてることに気づいて、changelog流し読みしてたら C2Xなどという脳が理解を拒否する文字列があって恐怖した。 そうかーC90AMD1から四半世紀にC99からもう20年以上C11からですらもうすぐ10年なのかーどうせ誰も実装する気も使われることもない新機能がまたくるのかー(しろめ)

2020/2/4(Tue)

[チラシの裏] 続々・オレオレN6とKVM VirtIOで障害

また数日落ちてたんだけどこれは 前に書いた通りさくらVPSで突然オレオレN6がKVMで起動に失敗するようになった対策にカーネルだけN8.1に入換えたせいで、uname(1)の結果は8.1を返すけども実際のユーザーランドはオレオレN6 ABIなもんで、p**srcの行儀の悪いMakefileやconfigureが悪さしてビルドが頻繁に止まる上にコンパイル通ってもABI壊れてるのか不規則にcore吐いたりして収拾つかなかったせい。 騙し騙しでここ数ヶ月運用してたのだが、OpenSSL 1.0系がEOLなので入換えるかーってところで詰んだ。/bin/shからして挙動不審でconfigureの実行中にsegmentation fault起こしたりで話にならん。

もうわざわざ変なOS使って苦労する意味もないので標準OSに戻すかと準備してたんだが、ふとboot promptでオレオレN6でもモノリシックカーネルの方を選択したら正常に起動しやがった、クソァ!