MediaInfoのコンパイルエラー

gentooをアップデートしていると、時々思わぬエラーで躓きます。

今回はMediaInfoがemergeに失敗しました。

 

/usr/lib/gcc/x86_64-pc-linux-gnu/5.4.0/../../../../lib64/libmediainfo.so: undefined reference to `ZenLib::Ztring::FindAndReplace(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, unsigned long, ZenLib::ztring_t)'
collect2: error: ld returned 1 exit status
make: *** [Makefile:414: mediainfo] エラー 1
 * ERROR: media-video/mediainfo-0.7.96::gentoo failed (compile phase):
 *   emake failed
 *
 * If you need support, post the output of `emerge --info '=media-video/mediainfo-0.7.96::gentoo'`,
 * the complete build log and the output of `emerge -pqv '=media-video/mediainfo-0.7.96::gentoo'`.
 * The complete build log is located at '/var/tmp/portage/media-video/mediainfo-0.7.96/temp/build.log'.
 * The ebuild environment file is located at '/var/tmp/portage/media-video/mediainfo-0.7.96/temp/environment'.
 * Working directory: '/var/tmp/portage/media-video/mediainfo-0.7.96/work/MediaInfo/Project/GNU/CLI'
 * S: '/var/tmp/portage/media-video/mediainfo-0.7.96/work/MediaInfo'

 

この、"collect2: error: ld returned 1 exit status"というのは、ほとんどの場合、そんな関数ねえよ!っていうエラーだそうで、どんな関数かは、その前の行を見ると、"undefined reference to `ZenLib::Ztring(以下略)"と書いてあるので、Zenlibという関数がないよ、ということだそうです。

 

で、自分でコードを書いたのなら、「あー、関数のスペルミスか」となりますが、emergeなのでそんなはずはありません。

google先生に聞いてみると、gccのバージョン違いで関数が見つからない場合があるようです。

 

gentoo ~ # emerge -p libzen

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild R ] media-libs/libzen-0.4.35

 

やはりありました!

これをemergeし直してから、MediaInfoをemerge -uするとすんなり通りました。

 

エラー文はよく読んでみるものですね。

Gentooのclamavでclamav-unofficial-sigsを使う

普通に

 

gentoo ~ # emerge clamav-unofficial-sigs

 

と、してインストールすると、現時点ではマトモに使えない3.7.2が落ちてくる。

これでは使えないので、test版を使うことに。

うちは64bit環境なので、

 

gentoo ~ # nano /etc/portage//package.accept_keywords

で、つぎの一行を追加

 

app-antivirus/clamav-unofficial-sigs ~amd64

 

そして、~amd64のテスト版を、バージョンまでしっかりとしていてemerge

 

gentoo ~ # emerge =app-antivirus/clamav-unofficial-sigs-5.6.1

 

続いてclamavアカウントに関する設定。

clamavアカウントがbashを利用できるように設定します。

 

gentoo ~ # usermod -s /bin/bash clamav

 

そして、アカウントをロック

gentoo ~ # passwd -l clamav

 

つづいて、設定ファイルを1カ所だけ変更。コメントアウトをハズします。

 

gentoo ~ # nano /etc/clamav-unofficial-sigs/user.conf

 

user_configuration_complete="yes"

 

最後に、ログのディレクトリを作成します。

 

gentoo ~ # mkdir /var/log/clamav-unofficial-sigs

gentoo ~ # chown clamav:root /var/log/clamav-unofficial-sigs

 

では、手動で実行します。

 

gentoo ~ # su clamav -c /usr/sbin/clamav-unofficial-sigs.sh

################################################################################
eXtremeSHOK.com ClamAV Unofficial Signature Updater
Version: v5.6.1 (2017-03-18)
Required Configuration Version: v72
Copyright (c) Adrian Jon Kriel :: admin@extremeshok.com
################################################################################

(以下、出力省略)

 

あとは、上記コマンドをcronに入れるだけですね。

 

GentooでPerlのコンフリクト

Perlのバージョンが古く、emerge -u worldでアップデートしようにもいろいろなPerlのモジュールがコンフリクトしてアップデートされないとき、

 

gentoo ~ # emerge --with-bdeps=y --backtrack=1000 --nodeps perl

 

 で、perl本体だけをバージョンアップし、さらに、

 

gentoo ~ # perl-cleaner --al

 

 で、perlのモジュールをすべてバージョンが一致したものに変えてくれる。

 

 それからemerge -u worldとか-uDNとかやるといいカンジ。

ディスククローンで複製したWindows7で起動時に0x0000007Bエラー

会社で異動があり、移動先でPCがあたる。

このPC、今時500GBのHDDだ。

WD BlueでAFT仕様。

ここ数年、異動してPCがあたる度に、SSDにディスククローンをして、SSDで利用していた。

なにしろ、セキュリティに厳しい会社なので、あちこちWindows標準のEFSで暗号化がかけられ、さらに、MS-OfficeやPDFなどは、社内からしか開けないような独自の暗号化も掛けている。

ただでさえアクセスが遅いHDDをSSDに載せ替えるだけでも、体感的にだいぶ早くなる。

で、今までAOMEI Backupperでライブクローンをすれば、差し替えるだけですんなり起動していたのだが、今回に限っては「Windowsを起動しています」の画面で再起動を繰り返す。

元のハードディスクにつなぎ替え、通常に起動して、システムエラー発生時「自動的に再起動する」をOFFにした。

 

Windows 7でシステムエラー発生時に自動で再起動しないよう設定する方法

121ware.com > サービス&サポート > Q&A > Q&A番号 013044

 

で、再度クローンしてSSDから起動。

すると、STOP 0x0000007Bと表示された。

このエラーでググっても、ディスク自体が悪いのでCHKDSKしろとか、MBRが壊れているのでbootsectでMBRを書き直せとか出てきますが、どれをやってもエラーは解決せず。

HDDから起動し、SSDをDドライブとして使ってみても、何ら問題なくSSDは使える。

HDDがAFTで物理セクタが4K、SSDが512バイトだから、セクタアライメントのせいか?と思ったけど、どうやらそうではなさそう。

AOMEIが悪いのかと、EASEUS TodoBackupを使ってみるも、症状は同じ。

万事休す。

 

と、英語でWindows7 Clone 0x0000007Bでググると、ありました!

マイクロソフトはもちろん、Acronis、Veritas、Citrixといった、有名どころのバックアップソフトの会社や仮想化ソフトの会社はしっかりと自体を把握しておりました。

 

"Stop 0x0000007B" error after you use a Group Policy setting to prevent the installation of devices in Windows 7 or Windows Server 2008 R2

https://support.microsoft.com/ja-jp/help/2773300/stop-0x0000007b-error-after-you-use-a-group-policy-setting-to-prevent

 

これによれば、グループポリシーエディタで他のデバイスIDやリムーバブルディスクのインストールを防止する設定を入れた場合、クローン後のデバイスからは起動できなくなっているようです。

それがわかるのは、次のレジストリの値が1になっている場合だそうです。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\PnP\DisableCDDB

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\PnP\DontStartRawDevices

 

で、元のHDDを接続し、起動してregeditで確認してみると、ビンゴ!

両方ともに1になっていました。

これを0に書き換え、念のためControlSet001なども書き換えておきました。

そして、再起動など一切せずにAOMEI Backupperを使ってディスククローン。(再起動するとまた1に戻ります。)

クローンされたSSDにつなぎ直して起動。

 

ちゃんと起動しましたとさ。

 

もしかすると富士通ソフトウェア製のSystemwalker Desktop Keeperがインストールされているので、こいつが起動時(もしくは終了時)に、レジストリの値を書き換えているのかもしれません。

 

なお、元のディスクがもう手元にない場合、Windows PEやインストールディスクを使用して、コマンドプロンプトからRegeditを起動し、\Windows\System32\config\SYSTEM のレジストリハイブを読み込んで、上記の値を直すそうですが、私はこの方法は試していないため、他に譲ります。

 

参考 インストールディスクやWindows PEから、起動できないWindowsディスクのレジストリを直す。

レジストリの修正 - PCと解

 

とりあえず、この件に関する日本語解説がなかったので、備忘録として。

GentooでPythonのアップデートを怠ってしまった時のメモ

まず、誤ってPython-2.7を消してしまったけど、Python-execがブロックしている場合、強制的にPython-2.7をインストール。

 

gentoo ~ # emerge -O =dev-lang/python-2.7.12

 

そして、お互いにブロックしているPython-3.4とPython-execがアップデートできない問題は、Python-3.3をアンマージをすれば解決するらしい。

 

gentoo ~ # emerge -C =dev-lang/python-3.3.5-r1

 

これで、Python-3.4のインストールとPython-execのアップデートが実施できる。

でも、emergeをいろいろ走らせると、最初に必ず

python-exec: Invalid impl in /etc/python-exec/python-exec.conf: python3.3

 と言われる。

これは、Python-3.3がインストールされていないのに、python3.3がコンフィグの中に残っているからだそうだ。

これは、eselectで編集する。

 

gentoo ~ # eselect python edit

 

私の場合はnanoが起動するので、python3.3の文字列を消すだけ。

これで解消!

証明書をSHA-1からSHA-2へ移行

自分のサーバーにスマホChromehttps接続するとエラーになる現象に遭遇。

エラー内容は「NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM」

ほっとこうと思ったら、影響が大きかった。

詳細を見ると、SHA-1をサポートしていないとのこと。

対処方法はSHA-2:256bit証明書の再発行しかないようです。

私が使っているのはRapidSSL

再発行するために、RapidSSLユーザーページに行きます。

 

GeoTrustのユーザーページ

https://products.geotrust.com/orders/orderinformation/authentication.do

 

ものすごく素っ気ないページが出てくるので、対象ドメインと登録してあるeメールアドレス、そして、ロボット対策の数字を入れます。

すると、3分ほどでログインページのURLがメールが返ってくるので、メールから該当ページを開きます。

 

アクセスするとこんな感じ。こちらも素っ気ない

f:id:naoyukinagano:20170626224508p:plain

 

左にあるReissue Certificateが再発行なので、これをクリック。

 

f:id:naoyukinagano:20170626224758p:plain

 

「Hashing Algorithm:」の選択を、必ず「SHA-256 with RSA and SHA-256 root」にして、CSRを貼り付けます。

って、ホントはCSRの作成方法も書くといいんでしょうけど、256bit用のCSRはだいぶ前に作成してあったので、ここでは割愛。

サーバには"rapidssl_sha256.csr"というファイル名で保存してあったようで、それを貼り付けるために、

gentoo csr # cat rapidssl_sha256.csr

で、CSRファイルの内容をTermに表示させて、それをコピペしました。

注意点として、CSRは、

-----BEGIN CERTIFICATE REQUEST-----

という文字列で始まり、

-----END CERTIFICATE REQUEST-----

という文字列で終わります。

opensslで生成する際には拡張子は自由につけられるため、ファイル名や拡張子を誤ると、なんだかわからなくなりますが、catで先頭の文字列を確認するとわかりますね。

 

規約に同意してSubmitを押すと、またもやメールが飛んでくるそうです。

RapidSSL Certificate Request Confirmation」というタイトルのメールです。

すべて英語ですが、メールの中程にあるURLをクリックすると、承認画面が現れます。

スクショ取り忘れましたが、最下部の「承認」をクリックします。

オーダーが承認されましたというページが現れます。

証明書はメールで届いていますので、差し替えます。

 

証明書のファイルがどれなのかわからないときは、Apache2のコンフィグを見るとわかります。

SSLCertificateFileで始まる行がそれです。

 

gentoo # cat /etc/apache2/vhosts.d/00_default_ssl_vhost.conf | grep SSLCertificateFile

SSLCertificateFile /etc/ssl/csr/rapidssl.crt

 

では、rapidssl.crtを書き換えます。

gentoo # nano /etc/ssl/csr/rapidssl.crt

すべての文字列を消して、メールで来た証明書文字列の

-----BEGIN CERTIFICATE-----
から
-----END CERTIFICATE-----
までを貼り付けて保存します。
そうですね、さっきのcsrファイルと違って、証明書は-----BEGIN CERTIFICATE-----で始まっているんですね。

これだけで再起動したら動きそうですが、GeoTrustのSSLチェッカーで中間証明書が違うと怒られてしまいました。

GeoTrust SSL Checker

https://cryptoreport.rapidssl.com/checker/views/certCheck.jsp

 

では、中間証明書も入れ替えます。

中間証明書の場所を調べましょう

SSLCertificateChainFileの行です。

gentoo # cat /etc/apache2/vhosts.d/00_default_ssl_vhost.conf | grep SSLCertificateChainFile

SSLCertificateChainFile  /etc/ssl/csr/intermediate.crt

では、intermediate.crtを書き換えます。

 

RapidSSLの256bit rootのcrtは次のURLにあります。

https://knowledge.rapidssl.com/support/ssl-certificate-support/index?page=content&actp=CROSSLINK&id=SO28590

 

上のリンク先にある

-----BEGIN CERTIFICATE-----
から
-----END CERTIFICATE-----
までが中間証明書ですので、これを貼り付けて保存します。

(中間"証明書"と、証明書の一種なので、サーバー証明書同様、-----BEGIN CERTIFICATE-----で始まってますね。)

 

gentoo # nano /etc/ssl/csr/intermediate.crt

中をすべて消して、上記の新たな中間証明書に書き換えます。

 

Apacheを再起動しましょう。

gentoo # # /etc/init.d/apache2 restart
 * Stopping apache2 ...                                                                                        [ ok ]
 * Starting apache2 ...                                                                                        [ ok ]

 

これで無事にアクセスできるはず。

 

SonoffをHomekit(homebridge)に対応させる。

Homekit用にHomebridgeのインストールまでしましたが、今度は本物のリレーを動かします。

おあつらえ向きに、Sonoffという製品が安く売っています。

 

 

こいつを購入して使います。

しかし、そのままだと中国のクラウドからコントロールすることになり、せっかくのHomekitは生かせません。

なので、まずはファームウェアをESP easyに入れ替えます。

ファームを入れ替えるためにはシリアル通信を出来るようにしなければならないため、次の2つも併せて購入しました。

 

使うのはこのうち5Pinだけなんですけどね。

 

 これでSonoffのシリアルとPCのUSBを変換します。ピンヘッダー用のケーブルもついてきます。

 

で、届いたら早速コジ開けて基板にピンヘッダーを半田付けします。

f:id:naoyukinagano:20170618225947j:plain

スルーホールが1カ所しかないのでわかりやすいです。

5ピンを半田付けしますが、使わないピンもあるようです。

 

で、接続します。

f:id:naoyukinagano:20170618230009j:plain

ボタンがある方から3.3V,RX,TX,GNDで、最後の1ピンは使いません。

 

で、USB-UARTコンバーター側は、

f:id:naoyukinagano:20170618230025j:plain

とまぁ、対向側とTX-RXが接続されるようにクロスさせます。

 

で、ファームウェア書き換えモードにするために、Sonoffのボタンを押しながらPCのUSBに刺します。

(後述しますが、そのまま刺すと書き換えできません。)

COMポートとして認識されますので、何番なのかをデバイスマネージャで調べます。

f:id:naoyukinagano:20170618233655p:plain

COM3ですね。

 

で、次の場所からESP easyというファームウェアをダウンロードします。

ESPEasy - Let's Control It

バージョンはR120です。

"Current stable: ESPEasy R120"

と書いてある場所から、"ESPEasy_R120.zip"をダウンロードして解凍します。

 

コマンドプロンプトを出して、解凍したフォルダに移動し、flash.cmdを実行します。

3つの質問をされますので、環境に合わせて適切に答えましょう。

COMポートは上記で調べましたのでその番号(ここでは3)、フラッシュメモリのサイズはSonoffの場合1024です。ダウンロードしたESP Easyのバージョンは120です。

 

C:\ >flash.cmd

Comport (example 3, 4, ..)           :3
Flash Size (example 512, 1024, 4096) :1024
Build (example 71, 72, ..)           :120

 

そうすると、たくさんの・・・が出て、

starting app without reboot
        espcomm_send_command: sending command header
        espcomm_send_command: sending command payload
        espcomm_send_command: receiving 2 bytes of data
closing bootloader
        flush start
        setting serial port timeouts to 1 ms
        setting serial port timeouts to 1000 ms
        flush complete
続行するには何かキーを押してください . . .

 となって終了します。

 

もしも、

warning: espcomm_sync failed
error: espcomm_open failed
続行するには何かキーを押してください . . .

 で終わっていたら、書き換えに失敗しているので、ピンとの結線が間違っているか、Sonoffのボタンを押しながらUSBを刺さなかったのかのどちらかです。

(私はボタンを押さずにUSBに接続したので、書き換えられない!!と思って焦りました。)

 

 書き換えが終了したら、USBを抜き刺します。

 今度はボタンを押さずに。

 そうすると、"ESP_0"というWiFiSSIDが飛んでいますので、パスワード"configesp"で接続します。

 そして、ブラウザで"http://192.168.4.1"にアクセスすると、ESP easyがSSIDの候補を表示するので、お家のWiFiSSIDを選択し、パスワードを入れてSubmitします。

 

 これで、ESP easyに書き換わったSonoffがお家のWiFiに接続されます。

 でも、ESP easyはDHCPIPアドレスを受け取るため、最初は何らかの方法でどのIPアドレスになったかを調べます。

(私はいつもiOSのFingというアプリを使って検出しています。)

 

 で、ブラウザでそのIPアドレスにアクセスし、Configを見ます。

f:id:naoyukinagano:20170619001327p:plain

 ここで、固定IPにするために、"Optonal Settings"に希望する固定IPアドレスを入れます。

 ついでに、Controller IPにHomebridgeを入れたサーバーのIPアドレス、Portに80を入れておきます。(必要ないかも?)

 

 続いて、ボタン類の登録です。

Devicesの1にあるEditボタンを押して、次のように登録します。

 

f:id:naoyukinagano:20170619002521p:plain

GPIOはリレーが接続されているピンになります。

これをSwitchと解釈させるようです。

 

SubmitしてCloseしたら、つぎは2をEditして次のように入力します。

f:id:naoyukinagano:20170619002740p:plain

GPIO0は基盤についているボタンそのものです。

Submitしてください。

それぞれ役割が与えられました。

 

ちなみに、GPIO13がLEDだそうなので、"Hardware"にある"Wifi Status Led:"をGPIO-13にしてSubmitしておけば、WiFiが生きるとLEDが光るようになります。

 

"Tools"にある"Advanced"に入り、"Rules"のチェックを入れSubmitすると、"Devices"と"Tools”の間に"Rules"が出てきます。

このRulesをクリックします。

 

私は次のように入れました。

On System#Boot do
    gpio,12,1
EndOn

On PowerOn Do
    gpio,12,1
EndOn

On PowerOff Do
    gpio,12,0
EndOn

On Button#State Do
    If [Button#State] = 0
        gpio,12,0
        gpio,13,1
    Else
        gpio,12,1
        gpio,13,0
    EndIf
EndOn

まず最初の"On System#Boot do"ですが、ブート時に実施することを示します。

gpio,12,1で、GPIO12をHighにします。そうするとリレースイッチがONになります。

これは、照明で使うためで、壁の片切スイッチを入れた際に、照明がつくようにするためです。

ただし、つくまでにはBootを待つ必要があるため10秒ほどかかります。

 

"On PowerOn Do"と"On PowerOff Do"は、それぞれPowerOnコマンド、PowerOffコマンドを受け取ったときに実施する内容です。

PowerOnでGPIO12をHighつまりリレーをONです。

これは、"http:///control?cmd=event,PowerOn"というURLでコマンドが呼び出されます。


"On Button#State Do" は、先ほどのDevicesで2に登録したNameがButtonというスイッチをGPIO0に定義したと思います。

GPIO0はSonoffのスイッチですので、これが押されたときにどういう動作をするのか?ということです。

トグルスイッチになっていますよね?

 

さて、Sonoffはここまでで、次にHomebridgeの設定です。

npmでプラグイン"homebridge-sonoff-basic-espeasy"をインストールします。

gentoo # npm install -g homebridge-sonoff-basic-espeasy request

 

/var/homabridgeにある"config.json"を編集します。

私は「寝室の電気」として使います。

gentoo # nano /var/homabridge/config.json

 {
    "bridge": {
        "name": "Homebridge",
        "username": "44:8A:5B:9F:1D:FF",
        "port": 51826,
        "pin": "031-45-154"
    },

    "description": "dummy",

    "accessories": [
        {
            "accessory": "DummySwitch",
            "name": "ダミースイッチ"
        },
        {
                "accessory": "SonoffBasicESPEasy",
                "name": "寝室の電気",
                "ip": "SonoffのIPアドレス"
    }

    ]
}

 これで、localを再起動すればOK

 

gentoo # /etc/init.d/local restart

 

ちなみに、リレーを動かすにはそこそこの電流が必要なようで、USB-UARTコンバータから送られる3.3V電源では動きませんでした。

AC100Vをインプットにつないで実験すると、しっかり動作しました。

照明に組み込んで終了です。

 

参考にしたサイト

www.npmjs.com

www.rutg3r.nl

Tutorial Rules - Let's Control It