ytooyamaのブログ

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

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

macOSとMacTeXでTeX文書入門(その1)

お仕事の都合で、最近TeXについて調べています。

インターネット上を検索するといろいろな参考資料が出てきますし、[改訂第7版]LaTeX2ε美文書作成入門も買ってもらったのでお仕事が非常にはかどっていますが、本当の初歩的な話が少なかったので、まとめたメモなんかを撒き散らしてみます。

まず、表題の「macOSとMacTeXの準備」についてですが、 MacTeXインストールしました。インストール後にTeX Liveユーティリティを起動して各種コンポーネントをアップデート、TeX Shopを起動してアップデートを実施します。

f:id:ytooyama:20170829225614p:plain:w360

アップデートが終わったらTeX Shopを再度起動して、日本語の取り扱いをしやすくするためにこちらの情報を参考に設定を開いて、プロファイル設定からpTeX(ptex2pdf)を選択して「OK」ボタンを押す。終わったらTeXShopを再起動。

f:id:ytooyama:20170829225621p:plain:w360

これで環境構築は完了。

最初のTeX文書

Texの基本はまずドキュメントタイプを定義して、タグを開いたら閉じるということです。HTMLとかXMLみたいな感じですね。 とりあえずこちらを参考にしつつ、次のようなコードをTeX Shopエディターに書いてみます。

\documentclass{jsarticle}
\begin{document}
おはよう
\end{document}

書き終わったら左上の「タイプセット」ボタンをクリックします。そうすると文書の保存ダイアログが表示され、名前をつけて保存するとPDFが生成され、別のウィンドウで生成したPDFを表示できます。

f:id:ytooyama:20170829231034p:plain:w360

あとはひたすら中身を書いていくだけです。書籍や「TeX入門」などのキーワードで検索すれば良い情報が見つかるはず。

割と柔軟に解釈してくれるので本来はきっちりタグを定義すべきではありますが、こんな感じで書いていくと…

\documentclass[dvipdfmx]{jsarticle}
\usepackage{tcolorbox}
\begin{document}
おはよう

\begin{description}
    \item[a)] 選択肢1
    \item[b)] 選択肢2
    \item[c)] 選択肢3
\end{description}

こんにちは

こんばんは

\begin{tcolorbox}[title=box title]
box contents
\end{tcolorbox}

\end{document}

こんな感じのPDFファイルが出来上がります。

f:id:ytooyama:20170829231824p:plain

Webなどで調べると、\begin{document}から始まっているものが多くて動かなくて困ったので、こんな感じでブログにまとめてみました。本来の目的は「PandocとTeXを使ってMarkdownの文書をPDF化」するのが目的でしたが、TeXを直接触るのも意外と楽しかったので、もう少しいろいろ試してみたいと思います。もう少しまともな文章を書けるようにしたいですね。

まとめると

  • \documentclassから書き始める
  • 出力に必要なパッケージは\usepackageで定義する
  • \begin{document}の中に要素を入力しておく。
  • \end{document}で終わり

LinuxとPandoc、TeX LiveでMarkDownをPDFに変換しようとしたらいろいろハマった

前回こんな日記を書きました。

ytooyama.hatenadiary.jp

今度はLinuxでそれをやってみようと思いました。 ところがなかなかうまく行かないわけです。

具体的にどんな問題があるかですが、以下の二つの問題があります。

  • Mac版のAdobe Readerで閲覧したドキュメントをコピーペーストしようとすると不要な空白がちょくちょく入る
    • でも、プレビューでは問題ない
  • Mac標準のプレビューで開いて保存するとPDFの目次が消えてしまう

悩ましい問題です。

ちなみに1個目の問題は次のような感じです。閲覧するだけであればそのように見えるので問題ないのですが、PDFからコピーペーストすると次のような感じでちょくちょく空白が入ってしまうようです。ビューのデータは正しいけどテキストデータは壊れているという例ですね。

http_proxy ="http :// proxy.example.com :8080/"
https_proxy =" https :// proxy.example.com :8080/"
controller# vi /etc/glance/glance -api.conf
hostnamectl set -hostname controller
sudo add -apt -repository cloud -archive:newton

2個目の問題はちょっと深刻です。OS X Lion (10.7)以降では「オートセーブ、バージョン、再開」機能が実装されました。保存が自動的かつ定期的に行われるので「あっ、セーブするの忘れた!」といった事故を防いでくれます。

support.apple.com

この機能自体は意味便利な機能です。対応しているアプリケーションであればこの機能はデフォルトで機能します。標準アプリケーションであるプレビューももちろんのこと。

さらにSierraではPDFKitというのが刷新され、iOSのそれと共通化されました。一見良さそうなのですが、iOSという制限のあるOSの上で使うのには十分であるものの、フルデスクトップ環境で使うにはあまりにも貧弱だったようで、次のように正規の手段で発行されたPDFをプレビューアプリで開くと

  • 「オートセーブ、バージョン、再開」機能が働いて自動セーブされる
  • 自動セーブされるとPDFの内容が破壊されて一部の情報が欠落される

という2コンボを喰らいます。今日はこの仕様バグに悩まされました。 Sierraの10.12.2くらいまでおかしくて、10.12.4で主要な問題は修正されましたが、以降のバージョンでも引き続きPDF周りはおかしいという声が多く上がっているようです。

applech2.com applech2.com

全く困ったものです。この問題の回避策は次の通りです。

Adobe Readerを使う

一番真っ先に思いつくと思いますが、残念ながらコピーペースト問題があります。Adobe Readerで表示したPDFコンテンツからコピーしたデータは信頼性がありません。最悪の場合、文字化けしたデータがコピーされることもあります。閲覧、印刷といった本来の使い方であれば問題はありません。

プレビューを使う

プレビューは上記のコピーペースト問題は起きないようです。ただし前にあげた「オートセーブ、バージョン、再開」機能の問題があり、事前に設定を変えておかないとデータが自然に破損します

PDFファイルを読み込んでプレビューでPDFとしてエクスポートするとデータが欠落したPDFファイルを出力するという問題もあります。つまり、Sierra以降のプレビューでPDFを扱うとデータが壊れるという話です。

以下のページの「プレビュー」の項目に書かれている方法で回避できるようです。私は「defaults write com.apple.Preview ApplePersistence -bool no」を設定してしまいました。プレビューで編集作業をほとんどしないのでまあこの設定でも影響ないと思います。

https://oku.edu.mie-u.ac.jp/~okumura/macosx/

他のPDFビューアーを使う

いろいろ調べたら次のページを見つけました。機能が豊富で良い感じです。 Skimでコピーペースト、エクスポート、上書きなどやってみましたが、いずれも問題は起きませんでした。 なので、今後はMacではSkimを使っていこうと思います。

itea40.jp

とりあえず理由がわかったので、LinuxとPandoc、TeX LiveでMarkDownをPDFに変換する方法をまとめたいと思います。そのうちブログにまとめたいと思います。

macOSとPandoc、MacTeXでMarkDownをPDFに変換する

最近、ドキュメントやメモはMarkDownで書くことが多くなっています。 実はこのブログもMarkDown形式で書いていたりします。

そしてMarkDownで書いたドキュメントを配布する際にPDF出力しているのですが、現在利用しているエクスポートツールが

  • とにかく重い
  • 色々対応するには独自タグを入れなければならず、ソースが汚くなる
  • 100ページを超えるとよくフリーズする
  • 100ページを超えるとレイアウトが崩れる、書式の変換に失敗する
  • バグがとにかく多い

…という問題があり、移行先を会社のみんなで検討していました(特に4つ目が厄介で、出力後に目視して確認していました)。 とりあえず私は定番のPandocとMacTeXをmacOSにインストールして使ってみることにしました。

エクスポートするツールの選定

エクスポートするツールを選択するにあたり、いくつか必要な機能がありました。目次機能、改ページ機能、見出しのレベルから章番号(1. とか 1-1..みたいなもの)を自動で割り振ってくれる機能、コマンド実行例を示すための書式…などです。これまで使っていたツールはこの目次機能にバグがありました。

これらの中でも特に重要視していたのが「必要な箇所で改ページする機能」です。PandocとMacTeXの組み合わせだと、「\clearpage」というタグを入れるだけで改ページしてくれました。コマンド部分はPandocのオプションで「–highlight-style=」で指定すると良いようです。私はzenburnがお気に入りです。PDFに目次を含める場合はPandocのオプションで「–toc」を含めるといい感じにやってくれるようです。詳細はこちらをご覧ください。

qiita.com

Pandocがあれば色々な形式にエクスポートすることができますが、PDF出力するには例えばMacTeXなどが必要だそうです。以下、macOS SierraにPandocとMacTeXをインストールした時の試行錯誤したログです。

インストールする

次のように実行します。HomebrewとXCodeが事前に必要です。

tooyamac% brew install lua pandoc pandoc-crossref

インストール後、PDF出力に必要らしいMacTeXをダウンロードしてインストールします。

実はbrew cask install mactexでもインストールできるらしいのですが、すごい時間がかかるので公式サイトからダウンロードします。pkg形式のファイルなのでダウンロードしたものをダブルクリックしてインストールするだけです。リンク先はこちらに日本のミラーサイトが掲載されているので、その中から選びます。

初めてのPDF出力

出力しよう。おや?

tooyamac% pandoc -t beamer ./hoge.md -o ./hoge.pdf
pandoc: pdflatex not found. pdflatex is needed for pdf output.

pdflatex がないようです。さっきインストールしたけど?

ググった!

見つかった!

どうやらバイナリーのパスが旧来から変わったようです。とはいえ、参考にしたページに書かれたパスも違っていたんですけど、探したらどうやらSierraではここに展開されるようです。とりあえずシンボリックリンクを貼ればなんとかなるようです。

tooyamac% ln -s /Library/TeX/Root/bin/x86_64-darwin/pdflatex /usr/local/bin/

そしてもう一度試したら今度は別のバイナリーがないと言われました。先ほどのと同様、 /Library/TeX/Root/bin/x86_64-darwin/にバイナリーがあったため、シンボリックリンクではなく、パスを通すことにしました。bashなら.bashrc、zshなら.zshrcに書けば良いようです。macOSの場合はpandocコマンドの実行に管理権限とかsudoを実行する必要はないため、ユーザーのrcファイルに書くだけで良いようです。私はzsh大好き人間なので次のファイルに記述しました。

tooyamac% vi ~/.zshrc
...
export PATH=/Library/TeX/Root/bin/x86_64-darwin:$PATH

tooyamac% source ~/.zshrc

3度目のPDF出力

出力しよう。おや?

また、エラーが出ました。 エラーログを取り忘れたので具体的なエラーを含めることができませんが、Markdownソースに日本語が入っているとエラーになるようです。

最後の行に「–latex-engine=xelatex」オプションを使ってくれと出ているので実行してみると、エラーは出ずにコマンドが通りました。ただし、英語部分だけ出力されるという悲しい状態でした。

tooyamac% pandoc input.md -o test.pdf -V documentclass=ltjarticle
...
Try running pandoc with --latex-engine=xelatex.

4度目のPDF出力

出力されたPDFに日本語が出てこない問題はここに書かれていました。「–latex-engine=lualatex」を指定すれば良いようです。

betrue12.hateblo.jp

最終的には

最終的には次のオプションを指定して出力することで、ほぼ希望通りのものを出力することができました。

tooyamac% pandoc -D latex > mytemplate.tex

tooyamac% pandoc -F pandoc-crossref document.md -o document.pdf -V documentclass=ltjsarticle --latex-engine=lualatex --template=mytemplate.tex --highlight-style zenburn --toc -N

環境を作るのはなかなか大変でしたが、クリックするとその部分にジャンプできる「役立つ目次」や割と簡単な記述で「改ページ」が入れられるようになった点、あの重いエクスポートツールを起動しないでも良い点は非常に良いかなと思います。

残す課題は?

表紙がシンプルすぎるのでどうしようか検討中です。表紙くらいなら別のソフトウェアを使って作ったものを差し込んでしまえばいいんじゃないか?…というのもアイデアとしてはアリだと思っています。

RHEL7/CentOS 7の解像度変更

解像度を変更するにはvga=771とかvga=773をカーネルパラメーターに記述みたいな記事が多いようです。CentOS 7の解像度の変更もそれで行うみたいなブログ記事を多く見つけました。ただ、実際にその通り設定してもKernelがグラフィックドライバーを読み込むまでは指定した解像度で表示されますが、グラフィックドライバーが読み込まれると高解像度に設定されてしまいます。

この問題を調べたらRHELのナレッジベースのページが見つかりました。

RHEL 6 および RHEL 7 で VGA コンソールのテキスト解像度を 80x25 に設定する方法 - Red Hat Customer Portal

RHEL/CentOS 6まではvga=771みたいな記述が動くようですが、どちらかというとvideoを使った方が良いようです。

# vi /etc/default/grub
...
GRUB_CMDLINE_LINUX="... video=640x480"

# grub2-mkconfig -o /boot/grub2/grub.cfg
# reboot

いや、なんでこんなことを急に言ったかというと、仮想マシンマネージャーで仮想マシンのコンソールを開くとログインプロンプトが開いているだけの画面でこんなに大きくていざ使おうとするとスクロールとか面倒だなと思いまして。

Ubuntu Xenial (16.04) でLinux kernel 4.10が利用可能に

Ubuntu Xenialでlinux-generic-hwe-16.04をインストールしている場合、Linux kernel 4.10が利用可能になったようです。 アップデートしようとしたら出てきました。 今日はそれだけです。

~$ sudo apt-get dist-upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:
  linux-headers-4.10.0-27 linux-headers-4.10.0-27-generic
  linux-image-4.10.0-27-generic linux-image-extra-4.10.0-27-generic
The following packages will be upgraded:
  linux-generic-hwe-16.04 linux-headers-generic-hwe-16.04
  linux-image-generic-hwe-16.04
3 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 61.2 MB of archives.
After this operation, 308 MB of additional disk space will be used.
Do you want to continue? [Y/n]

ちなみにLinux kernel 4.10の変更点一覧

kernelnewbies.org

そのほか

Debian 8.9への更新

検証用のVLAN環境で色々動かしているDebian Jessieのアップデートを行った。バージョンが8.9になった。そろそろDebian 9にしようか、どうしようか。

RHEL7.4 Betaのカーネルを触ってみた

CentOS 7.3でRHEL7.4 Betaのカーネルをビルドして動かしてみた。ネットワークパフォーマンスが上がった。噂通りEL 7.4は期待できそう。ちなみにCentOS 7.3でRHEL7.4 Betaのカーネルを動かした理由ですがDPDK+OVS環境のパフォーマンスが上がるか調べたかったためです。予想通り良い結果が出てホッとしています。

MAAS 2.2が標準リポジトリーで提供されるようになった

MAAS 2.2がUbuntu Xenialのメインリポジトリーにてインストール可能になった模様(7/20頃?)。しばらく2.2系を使いたいので、PPAは-rオプションで削除した。

続・macOSでリモートサーバーに接続してLinuxの仮想マシンマネージャーを操作する

先日、こんなことを書きました。

ytooyama.hatenadiary.jp

そして、最近macOS 10.12.6のアップデートを適用したのですが、それ以降つぎのようにリモートサーバーにSSH接続するとエラーが表示され、リモートサーバー上でソフトウェアを実行してもXサーバーが起動してないよみたいなエラーになります。つまり、XアプリケーションのSSH転送ができなくなっていました。

% ssh -XC root@172.17.32.90
Warning: untrusted X11 forwarding setup failed: xauth key data not generated

エラーでWeb検索した結果、次のようなフォーラムのページを見つけました。

stackoverflow.com

ssh_configになにがしを書けとか、-Yオプションを使うといいよとか、Xquartzを再インストールすると良いよとか色々あり、再インストール以外は書かれていることは一通り試してみたのですがダメで、私の環境の場合は結局、次のように設定したらなんとかなりました。

その設定方法とは、macOS側のsshクライアントの設定にXAuthLocationを指定するというものでした。パスはOS Xのバージョンによって違うようです。とりあえずwhichコマンドやwhereisコマンドなどで探せば良いと思います。そこで出てきたパスをXAuthLocationとして指定します。ちなみにHost *のところに書いてしまいましたが、X転送するホストが決まっている場合は、ホスト名をきちんと書いても良いかもしれません。

% vi ~/.ssh/config
Host *
...
XAuthLocation /opt/X11/bin/xauth