2020年1月23日木曜日

apt の「壊れた変更禁止パッケージ」への対処方法

WineHQ 5.0 を入れました。 WineHQ / Wine は大型アップデートの度に、よく環境が壊れるアプリで、今回もやはり壊れてしまいました。 たまに出る「壊れた変更禁止パッケージ」の良い例だったので、直し方をまとめておきます。

まずはマニュアル通りにインストールしていって、以下のエラーが出たことを想定します。 古いバージョンを入れていた人は遭遇するのではないでしょうか。
$ sudo apt install --install-recommends winehq-stable
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 winehq-stable : 依存: wine-stable (= 5.0.0~bionic)
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

上記エラーでは、winehq-stable じゃなくて wine-stable でコケてるとわかりました。 では wine-stable を入れてみましょう。
$ sudo apt install --install-recommends wine-stable
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 wine-stable : 依存: wine-stable-i386 (= 5.0.0~bionic)
 wine-stable : 依存: wine-stable-amd64 (= 5.0.0~bionic)
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

駄目です。今度は記載されている依存ライブラリ (wine-stable-i386 と wine-stable-amd64) を入れていきます。 どちらも i386 / amd64 の違いだけで、出てくるエラーは一緒です。 libfaudio0 なるものを先に入れる必要があるみたいです (下)。
$ sudo apt install --install-recommends wine-stable-i386
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 wine-stable-i386:i386 : 依存: libfaudio0:i386 しかし、インストールすることができません
                         推奨: libcapi20-3:i386 しかし、インストールされようとしていません
                         推奨: libcups2:i386 しかし、インストールされようとしていません
                         推奨: libglu1-mesa:i386 しかし、インストールされようとしていません または
                                 libglu1:i386
                         推奨: libgsm1:i386 しかし、インストールされようとしていません
                         推奨: libgssapi-krb5-2:i386 しかし、インストールされようとしていません
                         推奨: libkrb5-3:i386 しかし、インストールされようとしていません
                         推奨: libodbc1:i386 しかし、インストールされようとしていません
                         推奨: libosmesa6:i386 しかし、インストールされようとしていません
                         推奨: libsane:i386 または
                                 libsane1:i386 しかし、インストールされようとしていません
                         推奨: libsdl2-2.0-0:i386 しかし、インストールされようとしていません
                         推奨: libv4l-0:i386 しかし、インストールされようとしていません
                         推奨: libxcomposite1:i386 しかし、インストールされようとしていません
                         推奨: libxcursor1:i386 しかし、インストールされようとしていません
                         推奨: libxfixes3:i386 しかし、インストールされようとしていません
                         推奨: libxi6:i386 しかし、インストールされようとしていません
                         推奨: libxinerama1:i386 しかし、インストールされようとしていません
                         推奨: libxrandr2:i386 しかし、インストールされようとしていません
                         推奨: libxrender1:i386 しかし、インストールされようとしていません
                         推奨: libxslt1.1:i386 しかし、インストールされようとしていません
                         推奨: libxxf86vm1:i386 しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

libfaudio0 とはなんぞやと 公式 を見ると、ひっそりインストールが必要だよ、と書いてある。 直では入れられないのでダウンロードしてくる必要があります。 バージョンが変わる可能性が高いので、以下のコードをベタ打ちせず、公式のリンク から URL を辿ってください。 これじゃ apt で入れる意味ないじゃんという気分がある。
$ wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/amd64/libfaudio0_19.07-0~bionic_amd64.deb
$ wget https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/i386/libfaudio0_19.07-0~bionic_i386.deb
$ sudo dpkg -i libfaudio0_19.07-0~bionic_amd64.deb
以前に未選択のパッケージ libfaudio0:amd64 を選択しています。
(データベースを読み込んでいます ... 現在 271879 個のファイルとディレクトリがインストールされています。)
libfaudio0_19.07-0~bionic_amd64.deb を展開する準備をしています ...
libfaudio0:amd64 (19.07-0~bionic) を展開しています...
libfaudio0:amd64 (19.07-0~bionic) を設定しています ...
libc-bin (2.27-3ubuntu1) のトリガを処理しています ...

$ sudo dpkg -i libfaudio0_19.07-0~bionic_i386.deb
以前に未選択のパッケージ libfaudio0:i386 を選択しています。
(データベースを読み込んでいます ... 現在 271744 個のファイルとディレクトリがインストールされています。)
libfaudio0_19.07-0~bionic_i386.deb を展開する準備をしています ...
libfaudio0:i386 (19.07-0~bionic) を展開しています...
dpkg: 依存関係の問題により libfaudio0:i386 の設定ができません:
 libfaudio0:i386 は以下に依存 (depends) します: libsdl2-2.0-0 (>= 2.0.8).

dpkg: パッケージ libfaudio0:i386 の処理中にエラーが発生しました (--install):
 依存関係の問題 - 設定を見送ります
libc-bin (2.27-3ubuntu1) のトリガを処理しています ...
処理中にエラーが発生しました:
 libfaudio0:i386

なんかエラー出たので、エラー報告に従って淡々と解決していきます。
$ sudo apt install libc-bin
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
libc-bin はすでに最新バージョン (2.27-3ubuntu1) です。
これらを直すためには 'apt --fix-broken install' を実行する必要があるかもしれません。
以下のパッケージには満たせない依存関係があります:
 libfaudio0:i386 : 依存: libsdl2-2.0-0:i386 (>= 2.0.8) しかし、インストールされようとしていません
E: 未解決の依存関係です。'apt --fix-broken install' を実行してみてください (または解法を明示してください)。

$ sudo apt --fix-broken install
 :
長いので省略 (インストール成功)
 :

$ sudo dpkg -i libfaudio0_19.07-0~bionic_i386.deb
(データベースを読み込んでいます ... 現在 271844 個のファイルとディレクトリがインストールされています。)
libfaudio0_19.07-0~bionic_i386.deb を展開する準備をしています ...
libfaudio0:i386 (19.07-0~bionic) で (19.07-0~bionic に) 上書き展開しています ...
libfaudio0:i386 (19.07-0~bionic) を設定しています ...
libc-bin (2.27-3ubuntu1) のトリガを処理しています ...

ここまで来てすべてのエラーが消え、やっと準備が整いました。 最初に入力したインストールコマンドを打ち直してみましょう。
$ sudo apt install --install-recommends winehq-stable

処理過程は長いので載せませんが、インストール成功しました! 相変わらずハマりポイントが多い。お世話になってはいるけど、これがあるから Wine は好きになれない。

2020年1月13日月曜日

フリゲ紹介: 疾風戦記フォースギア2

疾風戦記フォースギア2 はロックマンちっくなアクションゲーム。



とても面白くおすすめの作品ですが、最初ハマったポイントがあるので書いておくと、 主人公のサチ / セツナを「強化しながら」クリアを目指すアクションゲームになります。 キーボードだとステージセレクト画面 (左下)で F キーを押すと強化やカスタム化ができる画面が開けます (右下)。 最初これに気付かずにプレイしていました。 強化やカスタム化をせずにプレイすると、ノーマルでもボスが激ムズに感じると思うので、注意。

強化やカスタム化をするとノーマルモードはマイルドな難易度で、ロックマンシリーズ (1~X2 くらい) よりは難易度が低い。 ほとんどの人はノーマルが良いかと思います。 以前の作品: 疾風戦記フォースギア は難易度が高かったので、間口が広がってとても嬉しい。 ノーマルは万人向けですが、しっかりとハードモードもあるので、アクションが苦手な人から高難易度アクションがしたい人まで、幅広く楽しめます。



アクションはまさにロックマン X のようなシステムです。 ダッシュもできるし、チャージショットもできる。 最初は 2 人の主人公 (最大 6 人!) が居て、性能も異なります。 サチはショットとブレード、セツナは 2種類のショットです (左下)。

X ボタンのジャンプ中にもう一度何らかのキーを押すとアクションが派生する「エアリアルアクション」が本作の目玉でしょうか。 サチは 2 段ジャンプ、セツナは高速旋回ができます。 強化することで真空波を出せるようになったりします (右下)。楽しい。



ステージをクリアしていくだけでなくストーリーも用意されていますし、イベントも起きたり、色々と凝ってます (左下)。 ステージも「これは見たことない!」というギミックがたくさんあって、楽しめると思います。 当然ながらボス戦もあり (右下)、HP が減ってからパターンが変わったりと、作りこみを感じます。

ボス戦はステージより難しめと思いますが、ノーマルできちんと強化していれば、私はそこまで詰まっていないです。 強化していけばどんな人でもクリアできるようになっている仕組みは、凄く良いと思いました。 ただ冒頭でも述べたように、強化なしだと私の腕前ではあきらめたボスもいます。 あとステージが長めなので、コンティニューが無限なのは良かったです。 ドットから細部の作り込みまで、凄く丁寧に感じます。



強化なしのノーマルモードやハードモードだとボスがめちゃ強いので、プロプレイヤーのオワタ式プレイを見てみたいですね。 ハードモードだとロックマンシリーズよりずっと難しい気がする。 …などと書いていたら、既にめちゃくちゃうまい人がプレイしていた…。

2020年1月12日日曜日

フリゲ紹介: 想色のパレット

想色のパレット は「16歳の時点で、村を出て行くか嫁ぐか就職するかしないとドナーの対象になる」というヤバイ村に住んでいる少女パレットが、臓器売買の危機から逃れるために魔女を目指す物語。



たった 2 日間しかない期限で入学金 (1億) を稼いで入学届を出す、というぶっ飛んだストーリー (左下) ですが、中身はとても面白い。 マップ下のシークラ島から、女の子 (パレット) のいるあたりの魔導士学校まで到達することが、目的となります (右下)。

ゲームシステムも割とぶっ飛んだところがあり、画面が動く動く。宝箱が空を飛ぶ。 画像ではうまく説明できないのですが、単純に技術力が凄い。 この技術力の高さが、本作品の一番の売りかも知れません。 実際にプレイしてみることをおすすめします。



魔導士学校に着くまでに、様々な場所でお使いをしたり、金目のものを探すことになります。 探索も戦闘もシンプルな形式ですが (下)、キャラごとに役割がうまく分かれていて、歯ごたえがあります。 連戦するほど敵が強くなり、10連勝するとご褒美があったり、経験値が増えたりする。 10連戦するとボス並みに強い。



もちろんボスも居ます。 どれもかなりの強敵で、一戦一戦かなりの歯ごたえがある (左下)。 しっかりレベルを上げつつ、スキルツリー (右下) をうまく成長させることがポイントかと思います。 成長のさせ方は意外と頭を使う。



クリアまで 5~6時間の作品ですが、短時間のわりに、予想以上に歯ごたえのあった作品でした。 クリア後もやりこみ要素があります。

フリゲ紹介: 孔明のアクション

孔明のアクション は、しょぼんのアクション を想起させる「孔明」アクションゲーム。 海外でも しょぼんのアクション は Cat Mario という名前で、意外と人気なんですよね。



最近の人は「孔明」って知っているでしょうか。 わざと理不尽な配置で即死させるゲーム、とでも言えば良いのでしょうか。 一言で言うと死んで覚えるゲームです。 もし知らなければ、一度で良いのでやってみてくださいね。

この手のゲームはついついプレイしてしまうのですが、案の定なかなかの難易度でした。 しょぼんのアクションとは異なり、オワタ式ではないので主人公は少し強くなってます。 なんとソードやショットが使えます! (下)



まあ武器があっても死ぬときはあっさり死ぬんですがね…。 しょぼんのアクションのようなゲームを探している人には良いかも知れません。

フリゲ紹介: クラスメイズ

クラスメイズ は怪異に巻き込まれた6人の少年少女の物語、ホラー風謎解きRPG。



様々な理由から迷宮化してしまった学校に囚われてしまった 6 人が、学校からの脱出を目指す探索 RPG です。 いかにもホラーゲームに見えますが、ホラー成分は強くなく、むしろ正統派な RPG に感じる。 プレイスタイルにもよりますが、1 周 2~5 時間程度、真クリアには 2~3周、だいたい 10時間くらいの作品と思います。

主人公は 6 人から自由に選べ、キャラごとに特性が異なります (左下)。 たとえば 大和 充 は敵が次のマップにいるかどうか探知でき、弓道部らしく弓矢で攻撃できる特徴があります。 キャラ次第でスタート位置も変わったり (右下)、置かれている状況は様々です。



どのキャラでも迷宮化した学校を探索していくことに変わりはありません。 探索自体はシンプルな探索 RPG (下) ですが、索敵能力などのキャラ特性を活かしていくことが重要です。 キャラごとに様々なプレイが楽しめるのも良いところだと思います。

怪異は影のような存在で、戦闘にもなります (右下)。 戦闘はシンプルなターン形式ですが、役割分担をしっかりしないと難しい場面もあります。 ターンごとに隊列変更できるシステムがこのゲームでは凄く重要で、面白さを引き出しています。 これと同じものを戦闘系 RPG で突き詰めたものやってみたいなあ。

引きが悪いと難しいキャラも居ますが、ヒント部屋も用意されているので、 あまり気にせず色々なキャラで遊んでみるとよいと思います。



探索を進めていくと、様々な場所で仲間が見つかります。 仲間を増やしていくと戦闘がどんどん楽になっていくので、最初は仲間を増やすことに集中すると良さそうです。



ネタバレはしないほうが良いゲームなので紹介もあっさりですが、 完全クリアを目指そうとすると、結構なボリュームの謎解き要素があります。 またラスボスだけでなく、真ラスボス、裏ボスと、やりこみ要素もたくさんあります。 裏ボスはめちゃくちゃ強い…。

凄く綺麗にまとまってて、とても楽しめた作品でした。

2020年1月10日金曜日

Vim の colorscheme をランダムに変えて保存する

Vim 9 で Vim Script が Python より早くなりそうなので、以前作った vimの配色を起動時刻ごとにランダムに変える のコードを少し書き変えて、Vim Script にしてみました。 初めてまともに Vim Script を書いた気がする。

機能としては、F5 でランダムに colorscheme を変え、cs で設定を保存する。これだけです。 変更した colorscheme を保存する機能が、一番作りたかったところです。
function ColorSchemeChange()
  function! RandInt(Low, High) abort
      let l:milisec = str2nr(matchstr(reltimestr(reltime()), '\v\.\zs\d+'))
      return l:milisec % (a:High - a:Low + 1) + a:Low
  endfunction
  let schemes = globpath(&rtp, "colors/*.vim")
  let filelist = split(schemes, "\n")
  let filepath = filelist[RandInt(0, len(filelist))]
  let filename = split(filepath, '/')[-1]
  let colorscheme = split(filename, '\.')[0]
  exec 'colorscheme ' . colorscheme
endfunction
function ColorSchemeSave()
  let colorscheme = execute('colorscheme')[1:]
  let config = ['set background=' . &background, "colorscheme " . colorscheme]
  call writefile(config, expand('~/.vimrc.colorscheme'))
endfunction
nnoremap cs :call ColorSchemeSave()
nnoremap <F5> :call ColorSchemeChange()<CR>:colorscheme<CR>
nnoremap bd :set background=dark<CR>
nnoremap bl :set background=light<CR>

" colorscheme monokai
execute ':source ' . '~/.vimrc.colorscheme'
このスクリプトと、colorscheme のリストをまとめたプラグインを併用すると、colorscheme を気軽に変更できます。 colorscheme のリストは以下が有名ですが、他にもあります。 私は flazz/vim-colorschemes を vim-plug から利用しています。
ところで colorscheme を変更するプラグインは、ランダムではなく一つずつチェックしながら変更するものがいくつかあります。 ただ変更したものを保存できないため不満だったのと、 flazz/vim-colorschemes くらい colorscheme が多くなってくると一つ一つ選ぶ気が起きないので、ランダムなものが欲しかった。


話は変わりますが、Vim Script って arr[1:] みたいな Numpy 表記ができるんですね。 Vim で Deep Learning もできなくはないんだなあ…。

2020年1月9日木曜日

Hugo で sitemap.xml の changefreq / priority をページ単位で設定する

Hugo で sitemap.xml の priority / changefreq をページ単位で設定する方法をまとめておきます。 みんな使いそうなテクニックだけど、どこにも書かれてなかったので、少し時間が掛かった。 テンプレートを改良したもの (以下) を layouts/sitemap.xml に保存しましょう。
{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>" | safeHTML }}
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
  xmlns:xhtml="http://www.w3.org/1999/xhtml">
  {{ range .Data.Pages }}
  <url>
    <loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
    <lastmod>{{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}</lastmod>{{ end }}{{ with .Params.changefreq }}
    <changefreq>{{ . }}</changefreq>{{ end }}{{ if ge .Params.priority 0.0 }}
    <priority>{{ .Params.priority }}</priority>{{ end }}{{ if .IsTranslated }}{{ range .Translations }}
    <xhtml:link
                rel="alternate"
                hreflang="{{ .Lang }}"
                href="{{ .Permalink }}"
                />{{ end }}
    <xhtml:link
                rel="alternate"
                hreflang="{{ .Lang }}"
                href="{{ .Permalink }}"
                />{{ end }}
  </url>
  {{ end }}
</urlset>

content/*.md は以下のように書きます。
---
Title: Hugooo
Lastmod: 2020-01-01
changefreq: weekly
priority: 0.5
---
Hello world!

これで sitemap.xml の changefreq / priority をページ単位で設定できます。 .Params の後ろは小文字じゃないといけないので注意しましょう。

ここまでの説明だと、/tags/, /taxonomies/ の出力が、Google Search Console でエラーが出る時があります。 状況次第では、sitemap.xml の記述の調整が必要です。 タクソノミー自体が不要な場合は config.toml に以下を記述することで回避できます。
disableKinds = ["taxonomy", "taxonomyTerm"]


Googlebot は priority を見ておらず、changefreq や lastmod もそんなに見てないと言われています。 とは言え他の検索エンジンは不明なので、設定できるのであればしても損はないかと思います。 少なくとも何も設定できないデフォルト状態よりは良いかなあ。