ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

High SierraにVirtualBox 5.2をいれようとすると「機能拡張がブロックされました」といわれてインストールに失敗する

mag.osdn.jp

VirtualBox 5.2、オートインストールとか、クラウドへのエクスポートとか色々魅力的じゃないですか。 そこでまあ、早速ダウンロードしてワクワクしながらインストールするわけですよ。で、これ。

f:id:ytooyama:20171020001126p:plain:w400

なんでやねん。

ログを見たら「Kernel Extention Blocked」となっていました。なんかこの事象、ワタシ、見覚えがあります!

f:id:ytooyama:20171020001508p:plain:w400

解説している記事を発見。どうやらHigh Sierraで導入された新しいセキュリティ機能である「SKEL」によるものだそうです。

applech2.com

そして、その記事にあるように「環境設定 → セキュリティとプライバシー → 一般」を開き、許可ボタンを押します。

f:id:ytooyama:20171020001334p:plain:w400

その後、もう一度インストールを試行...からのインストール終了。お疲れ様でした。

f:id:ytooyama:20171020001405p:plain:w400

正直この機能、問題が起きたときのオペレーションの説明がなさすぎて失敗だと思いますよ。Appleさん。

もう、数日かけてでもSierraに戻す!...とても付き合いきれません。

[10/21追記] 「Time Machine バックアップから復元」をつかって、Sierraにダウングレードしました。マシンやTime Machine用ストレージの性能とかストレージサイズによると思いますが、だいたい1時間位でもとに戻せました。あとは各種システムやアプリケーションのアップデート、必要なアプリケーションのインストールをして完了です。

スーパーファミコン互換機があっという間に壊れたので交換した話

これを7月に注文して、9月の末にようやく届きました。

https://www.amazon.co.jp/gp/product/B073WFL5G8/

数週間...とはいっても、間にイベントが入ったので実質使用したのは数時間程度だったのですが、昨日ゲームをやっていたら突然プツリと画面が映らなくなって、音声も出なくなりました。

使っていなかったのですが、3色のAVケーブルを接続して見たところ、音声だけでてきます。 どうやら不良品っぽいです。

そこで、昨日交換依頼をAmazonにかけたら、翌日(というか、今日)届いていました。 週末、不良品を着払いで発送しないとな。

ちなみに製品ページを見ると、割とこの機種壊れやすいそうです。交換品は何日持つでしょうか。 これでダメだったら返金してもらって、中古のスーファミを入手しようと思います。

ちなみにこの互換機は9000円くらいするのですが、実物は相当安っぽく、作りも雑でちゃっちいです。 互換機なんてどれもそんなものでしょうか。

古いバージョンのJDKの取り扱いとJAVA_HOMEの指定方法

特にJavaで何か開発しているわけではないのですが、新機能の「jshell」を使ってみたかったので、Java SE 9をインストールしてみました。基本的にOracleのサイトからJava SE 9をダウンロードして使うだけなのですが、新しいバージョンをインストール後にjava,javacコマンドでバージョンを確認したらJava 8u144が出力されたのでおかしいと思い調べたところ、削除しない限りJDKは上書きされずにシステムに残るということを知りました。早速コマンドを実行した結果が次の通りです。

% /usr/libexec/java_home -V
Matching Java Virtual Machines (5):
    9, x86_64:  "Java SE 9" /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
    1.8.0_144, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
    1.8.0_141, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_141.jdk/Contents/Home
    1.8.0_131, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
    1.8.0_121, x86_64:  "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home

見事に複数のバージョンのJDKがシステムに存在してますね。ちなみにJDK 8はバージョンあたり350MBくらいでした。とりあえず、「jdk-9.jdk」と「jdk1.8.0_144.jdk」だけ残して削除することにしました(1GB程度、空きました)。

さて、私はJavaのバージョンを次のようにJAVA_HOMEで定義しています。zshを使っているので.zshrcに記述してます。

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
(Java 8を使う場合)

export JAVA_HOME=`/usr/libexec/java_home -v 9`
(Java 9を使う場合)

Java 9ではバージョンの指定は1.9ではなく、9と指定する様です。

iOS 11でアプリのアップデートがあるはずなのに来ない時のTips

iOS 11ではアプリケーションのセーブデータを残したまま、アプリ本体だけを削除する機能というのが実装されました。

この機能自体はiPhoneのストレージ不足に陥った場合に役立つ機能ではあるのですが、同時期にアプリはiTunesではなくiOSバイスで管理が必須になったのが影響しているのか、アプリのページを開くと新しいバージョンが掲示されているのにも関わらず、App Storeアプリを開いてもそのアプリのアップデートが一向に現れない...なんてことが多々起こるようになりました。

これ自体はiOS 11のバグだと思われます。しばらく放置していても良かったのですが、すごく気になるので対処方法を調べてみました。 結果、先ほど説明した「アプリ本体だけを削除」した後、「アプリを再インストールする」という方法で対応可能でした。

対処方法

まず、「設定 > 一般 > iPhoneストレージ」を開きます。

該当のアプリを選択し、「Appを取り除く」をタップします。ここで「Appを削除」を実行するとセーブデータも消えてしまいますので、くれぐれも注意してください。大抵のアプリは別の手段でデータを復元できることがありますが、事前にある手順を踏んでおかないとデータを復元できない場合があります

f:id:ytooyama:20171011205511p:plain:w300

もう一度確認が表示されるので「Appを取り除く」をタップします。これでアプリだけが削除されます。 すると表記が次のように変わるので、「Appを再インストール」を実行します。これで、最後に使っていたバージョンではなく、新しいバージョンがダウンロードされるようです。

f:id:ytooyama:20171011205835p:plain:w300

本例は「ぷよぷよクエスト」で実際に想定どおり動いたのを確認していますが、アプリによっては問題が発生することがあります。同じ操作を行おうと考えている場合は、バックアップを取ってから試してください。ただし、iOS 11サポートをうたっているアプリであれば問題ないはずです。

ちなみにアプリを削除後、初回起動時に「利用規約」の表示がされることがあります。そのまま進めば元のデータを使ってゲームを続行できるのを私の環境では確認しています。

iOS 11のアプリ管理機能を使う場合の注意点

何となく想像がつくと思いますが、アプリをiOSバイスで管理する必要があるということは、App Storeから削除された古いアプリはこの機能を使って削除すると再インストールできなくなるので注意が必要です。

Docker for MacがHigh Sierraで動かない問題は最新安定版で解決

Docker for MacがHigh Sierraで動かなくて焦ったのですが、最近のバージョンを入れなおしたら何とか動くようになりました。 アップデート前は「Docker Community Edition 17.06.2-ce-mac27」がインストールされていました。このバージョンはSierraでは動作しますが、High Sierraでは正常動作しないようです。

ところで割とHigh Sierra+Docker for Macのバグが頻繁に挙げられているようです。まだしばらく安定しないかもしれませんね。

docs.docker.com

多分この辺りの修正で動くようになったんだと思います。

  • Fix instability on High Sierra (docker/for-mac#2069, docker/for-mac#2062, docker/for-mac#2052, docker/for-mac#2029, docker/for-mac#2024)
  • Fix password encoding/decoding (docker/for-mac#2008, docker/for-mac#2016, docker/for-mac#1919, docker/for-mac#712, docker/for-mac#1220).

iOS 11のバックグラウンド更新機能を賢く設定してバッテリーをセーブする

iOSのバックグラウンド更新機能とは、アプリケーションをバックグラウンドで実行中にも内容の定期的な更新を許可するという設定です。デフォルトではオンに設定されており、全てのアプリケーションでバックグラウンド更新を許可されています。

pc-karuma.net

iOS10 まではバックグラウンド更新機能はオンにするかしないか、アプリごとにオンにするかしないかの設定くらいしかできませんでした。iOS 11ではこの機能が更新され、次のようにネットワーク接続環境を選ぶことができるようになりました。

  • オフ
  • Wi-Fi (接続時のみ許可する)
  • Wi-Fi とモバイルデータ通信 (の全ての接続で許可する)

そこである程度最低限のアプリのみ許可して、この設定を「Wi-Fi 」にしてみました。 次のような結果になりました。この使い方だと、2日くらい持つかもしれませんね。

  • バッテリー残量 72%
  • 使用時間 3時間7分
  • スタンバイ時間 15時間7分

Microsoftのメールサービスのアカウントに届くURL付きメールが書き換わっている?

Microsoftのメールサービスのアカウントに届くURL付きメールのURL部分が次のようになっていました。 HTMLメールのリンクボタン部分のURLやテキストメールに記述されたURLが、下記のドメインから始まるメールアドレスに書き換わっていました。ドメインの「nam01」の部分は来るメールによって変わっていました。いくつかサブドメインがあるんでしょう。

https://nam01.safelinks.protection.outlook.com/?url=https://<実際のURLっぽいもの>

おかしいなと思って他のメールも見ましたが、昔から使っているhotmailアカウントのメールアドレス宛に送られてくるメールのURLが上記のURLに書き換わっているようです。

調べたら次のブログ記事を発見。

emtunc.org

ただ、これについて言及している日本語の記事は見つかりませんでした。ドメインに「outlook.com」が含まれるのでMicrosoftのサービス経由になっているんだろうなと思って調べたら案の定そのようでした。一応digコマンドの結果を載せておきます。

% dig safelinks.protection.outlook.com

; <<>> DiG 9.8.3-P1 <<>> safelinks.protection.outlook.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29608
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;safelinks.protection.outlook.com. IN   A

;; AUTHORITY SECTION:
protection.outlook.com. 120 IN  SOA va3netglb002.messaging.microsoft.com.protection.outlook.com. hostmaster.va3netglb002.messaging.microsoft.com.protection.outlook.com. 2012099780 10800 3600 604800 120

UbuntuでOpenCVを使う方法

※ 9/4 12:00 インストールパッケージ名が間違っていたので修正

f:id:ytooyama:20170902205927p:plain:w460

上図は、任意の画像から顔を検出したところ

OpenCVOSSの画像処理ライブラリーです。C++, C, Python, Java からの操作や、Windows, Linux, Mac OS, iOS, Androidをサポートしています。

日本で出ているOpenCVの書籍の多くはC++を実行させるためにWindowsVisual Studioを使わせるパターンが多いですが、OpenCV自体は前述のようにWindows以外でも動かすことができます。今回は汎用的に使えるLinuxで動かすことにしました。

とりあえず今回はUbuntu上で動かす流れを書いてみたいと思います。 インストール方法は次のサイトを参考にしました。

milq.github.io

ただし、この方法は必要なライブラリーをインストールしない場合がありますので、次のようにコマンドを実行してインストールしました。

$ sudo apt install libopencv-dev libcv2.4 libcvaux2.4 libcvaux-dev libhighgui-dev libhighgui2.4 libopencv-highgui-dev libopencv-highgui2.4-deb0 libopencv-imgproc2.4v5 libopencv-imgproc-dev

インストールするUbuntuのバージョンによって、インストールできる各コンポーネントのバージョンが異なると思います。apt searchコマンドで必要なパッケージの名前を確認しましょう。

$ apt search opencv
$ apt search libcv
$ apt search highgui

今回使ったのはUbuntu 17.04で、このバージョンでインストールできるOpenCVは2.4.9.1でした。もっと新しいOpenCVを使いたい場合はPPAを探しましょう。ただ、OpenCV 2と3ではソースコードの書き方が違うと思います。注意しましょう。

必要に応じて、他のlibopencv-*のような名前のライブラリーを追加で入れます。ちなみにOpenCVlibopencv-*のライブラリーを全てインストールするとOSを含めて/は6GB消費していました。

OpenCV 2ではPython2でAPIを使ってAPIを叩けるようです。追加でこの辺りのパッケージを入れておくといいようです。

$ sudo apt install python-opencv python-numpy python-scipy python-matplotlib python-urllib3 

インストールがおわったら、いろいろ動かして見ましょう。OpenCVソースコードにサンプルのソースコードがいろいろ収録されているので、これをダウンロードします。

$ wget https://github.com/opencv/opencv/archive/2.4.13.3.zip
$ unzip 2.4.13.3.zip

サンプルをいろいろ実行してみます。C++版のコードはLinuxではg++コマンドでビルドする必要があります。実行結果は-oで指定したファイル(ここでは便宜的にファイルの最後に.outをつけたファイル名にしています)を実行すると、実行結果が表示されます。Pythonのコードを実行したい場合はpython2のディレクトリー内のサンプルを実行してください。だいたい同じようなサンプルソースが揃っています。

$ cd opencv-2.4.13.3/sample/cpp
$ g++ inpaint.cpp -o inpaint.out `pkg-config --libs --cflags opencv` 
$ ./inpaint.out

ここまでできたら、次に以下のサイトを参考にいろいろやって見ましょう。このサイトではC++版のソースコードがサンプルとして掲載されています。

OpenCV.jp : OpenCV逆引きリファレンス — OpenCV-CookBook

Pythonから使う場合は次のサイトの例が参考になりそうです。

OpenCV-Python チュートリアル文書のページへようこそ! — OpenCV-Python Tutorials 1 documentation

Ubuntuのデスクトップ環境

UbuntuのMinimalCDをダウンロードして、Ubuntu 17.04をインストールしました。インストールの最後に追加でインストールするパッケージの選択が出るので、Ubuntu Mate minimalを追加で選択しました。

ソースの編集環境

ソースの編集にはgeditを使いました。選択した理由はなんとなくです。

ビルド方法

C++ソースコードは、次のようなコマンドラインを端末で実行します。

g++ hoge.cpp -o hoge.out `pkg-config --libs --cflags opencv` 
./hoge.out

画像から顔を検出する

顔を検出するのコードを実行しても何も起こらないので、なぜかなと思ったら評価器を用意する必要があったんですね。ソースコードにもxmlファイルを定義しているところがあって気がつきました。ソースパッケージのdataディレクトリーやGithubにいくつか用意されていますので、ソースコードの以下の部分のパスを正しく設定すればちゃんと動きました。

...
  // 分類器の読み込み
  std::string cascadeName = "./haarcascade_frontalface_alt.xml"; // Haar-like
  //std::string cascadeName = "./lbpcascade_frontalface.xml"; // LBP

最後にOpenCVについてまとまっていたスライドがあったので、以下に埋め込んでおきます。

www.slideshare.net