無限に繰り返すスライドショーの作り方

勉強会が始まるまでの案内用に無限に続くスライドショーを作ったのでメモ
※PowerPoint2016です。

以下のように設定して後は放置。

1、無限ループするよう設定
「スライドショータブ」
 ⇒「スライドショーの設定」
  ⇒「オプション」
   ⇒「Escキーが押されるまで繰り返す」をチェック
   
2、自動的に切り替わるように設定
全シートを選択してから
「画面切り替えタブ」
 ⇒「画面切り替えのタイミング」
  ⇒「クリック時」から「自動的に切り替え」に変更
   その後任意の時間を設定
   (シートの選択を解除してから個別のシートの時間を変更することも可能)
   
これでOK。

RESTとは何か。

簡単に言うと「RESTとは、Representational State Transferの略でソフトウェアアーキテクチャのスタイルのひとつ」しかしこれがまたややこしくしている。
なぜかというとよくセットで語られるSOAPは仕様。それに対してRestはアーキテクチャ。なのでRESTは細かいところを定めているわけじゃなくて
多種多様なものがRESTと呼ばれてしまっている。

RESTは、初めはアーキテクチャの原則と制約の集まり(後述)を指していたが、次第に、XMLやHTTPを使った簡易なウェブベースのインターフェイスのうち、WebサービスSOAPプロトコルのような MEP(Message Exchange Pattern; SOAPノード相互のメッセージ交換のパターンを確立するための雛型)ベースの特別な抽象化をしないもののことを、大まかに意味する用語として使われるようになった

REST - Wikipedia

なのでRESTといわれたら相手がどのようなRESTをイメージしているのか確認するといい。
RESTの定義には色々あるがマーチンファウラーが定義しているRESTful成熟度の3レベルモデルが相手の理解を知るにはよい指標となるとおもう。
martinfowler.com

  • Level 0 Plain Old XML(昔ながらの単純にXMLを返すやり方)
  • Level 1 URLでリソースを表すようにする(リソースを動詞でなく名詞で表す)
  • Level 2 HTTPメソッドGET, POST, PUT, DELETE等を正しく使い分ける
  • Level 3 レスポンスの中に関連するリンクを含める

Level3はNetflixAPIとか、API自体がハイパーメディアとして動作するようなもの。ほぼ見かけない。
今世界で言われている大半のAPIはLevel2。Level1だとWebで公開するとハテブとかでちょっとけちつけられる可能性がある。
でも上記にあってなくても使いやすければLevel1でも悪くないとおもうよ。だってちゃんとしたRestで考えると色々使いにくいから。。。

そんな使いにくさもありDropBoxがRestのサポートをやめたり、*1
GoogleAPIもHTTP2ではgRPCを主軸においてたり、今後Restから次のステージが模索されている。
とはいえ本家RESTも大事なのでちゃん仕様を統一しようてことでOpen API Initiative*2がSwaggerベースで仕様統一を検討し始めている。

RESTが誕生して16年。これからも目が離せませんね

Ubuntu にsar(sysstat)をインストールする。

性能がちょっとおそいなとか、IOどうなってるんだろうなとおもったらsysstatが便利です。
かんたんなものはtopとか眺めているといいですが、ちょっときがきいたものをみたければ迷わずsysstatを使いましょう。

Ubuntuにはデフォでは入っていないのでインストールします。

インストール&設定

$ sudo apt-get install sysstat

設定ファイルを書き換えて性能取得を有効にします

$ sudo vi /etc/default/sysstat
ENABLED="false"
  ↓
ENABLED="true"

サービス起動します

$ sudo /etc/init.d/sysstat start
 * Starting the system activity data collector sadc                                        [ OK ]
$

デフォルトだとCronでこんな感じに動きます。

$ cat /etc/cron.d/sysstat
# The first element of the path is a directory where the debian-sa1
# script is located
PATH=/usr/lib/sysstat:/usr/sbin:/usr/sbin:/usr/bin:/sbin:/bin

# Activity reports every 10 minutes everyday
5-55/10 * * * * root command -v debian-sa1 > /dev/null && debian-sa1 1 1

# Additional run at 23:59 to rotate the statistics file
59 23 * * * root command -v debian-sa1 > /dev/null && debian-sa1 60 2

つまりXX時05分から10分毎にログをとって、23時59分にログファイルをローテートする為にもう一度実行しています。
ログはこんな感じでファイルで出力されます。

$ ls  -l /var/log/sysstat/
total 12
-rw-r--r-- 1 root root 11756 Oct  3 03:15 sa03

ちなみにファイル名ですが、「saDD」という形式で「DD」部分に日付が入ります。
パラメータをいじるとYYYYMMDDとかにも出来ます。詳しくは内部で使われているsadcコマンドのマニュアルを見ましょう

       The  standard  system  activity  daily  data  file is named saDD unless
       option -D is used, in which case its name  is  saYYYYMMDD,  where  YYYY
       stands  for  the  current year, MM for the current month and DD for the
       current day.  By default it is located in the  /var/log/sysstat  direc‐
       tory.

参照してみる

CPU情報を表示してみます(sa03のところは見たいファイルにあわせて変更する)

$ sar -f /var/log/sysstat/sa03 -P ALL
Linux 4.4.0-36-generic (ubuntu-1404)    10/03/2016      _x86_64_        (2 CPU)

02:41:01 AM       LINUX RESTART

02:45:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
02:55:01 AM     all      0.05      0.00      0.09      0.00      0.00     99.87
02:55:01 AM       0      0.04      0.00      0.10      0.00      0.00     99.86
02:55:01 AM       1      0.05      0.00      0.07      0.00      0.00     99.87

02:55:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
03:05:01 AM     all      0.05      0.00      0.07      0.00      0.00     99.89
03:05:01 AM       0      0.03      0.00      0.08      0.00      0.00     99.89
03:05:01 AM       1      0.06      0.00      0.06      0.00      0.00     99.89

03:05:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
03:15:01 AM     all      0.04      0.00      0.05      0.00      0.00     99.91
03:15:01 AM       0      0.02      0.00      0.06      0.00      0.00     99.91
03:15:01 AM       1      0.05      0.00      0.04      0.00      0.00     99.91

Average:        CPU     %user     %nice   %system   %iowait    %steal     %idle
Average:        all      0.04      0.00      0.07      0.00      0.00     99.89
Average:          0      0.03      0.00      0.08      0.00      0.00     99.89
Average:          1      0.05      0.00      0.06      0.00      0.00     99.89

ロードアベレージをみるのはこんな感じ

$ sar -f /var/log/sysstat/sa03 -q

メモリやネットワークなども見れます。詳しくは以下等を参照しましょう。
Linux - sarコマンドについて - Qiita

Ksarで見やすく表示

コマンドで仔細に見るのもいいですが、GUIで見やすく見るほうがなにかと便利なのでKSARでみてみましょう。
https://sourceforge.net/projects/ksar/files/beta/
から、「kSar-5.1.0-beta4.zip」をダウンロード

$ export LC_ALL=C && export S_TIME_FORMAT=ISO

をうって言語と時間設定を直してから

$ sar  -A 10 300 > performance.txt

でいけます。


詳しい使い方は以下にまとめてあります。
garapon.hatenablog.com

最新のHyperLederFabricをProxy環境下でビルドする

2016/06にv0.5-developer-previewが出たfabricですが、現在も日々コードが書き換わりまくっています。
今日落とすと0.7.0がおちてきます。直近のマイルストンは以下のとおり
・2016/10 :アルファ版
・2017/01 :v0.1-ベータ版
・2017/03 :v1.0正式版

製品ソースも変わっていますし、開発環境の構築の中の仕組みも結構変わっているようです。
最新版(0.7.0)をProxy環境下でビルドしたら結構はまったので対処法を記載しておきます。
※Porxyが必要ない環境であれば以下手順でビルドするのは変わっていません。
garapon.hatenablog.com


各種準備

事前準備、fabricのソースのDLまでは以下手順に従い進めましょう。
Windows上にhyperledger/fabricを環境構築する。 - 自分の仕事を憎むには人生は余りにも短い

Vagrantファイルの書き換え

fabric\devenv\Vagrantfile
を修正してProxy設定を入れます。L33の下にこんな風書きます。

Vagrant.configure('2') do |config|
if Vagrant.has_plugin?("vagrant-proxyconf")
    config.proxy.http = "http://proxyserver:8080/"
    config.proxy.https = "http://proxyserver:8080/"
    config.proxy.no_proxy = "localhost,127.0.0.1"
end

VM起動

cd %GOPATH%\src\github.com\hyperledger\fabric\devenv\
vagrant up

upが終わったらprovisionしていきましょう。

vagrant up --provision

DockerImageのビルド準備

DockerImageをこれからビルドしていくのですが、その中でProxy設定が通らないものがありますので
先にProxy設定をいれていきます。

fabric\images\javaenv\Dockerfile.in
L3とL9を書き換えます。WgetcurlにProxyを設定します

L3:RUN wget http://services.gradle.org/distributions/gradle-2.12-bin.zip -P /tmp --quiet
L9:  && curl -fsSL http://apache.osuosl.org/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN

L3:RUN wget -e HTTP_PROXY=http://proxyserver:8080/ http://services.gradle.org/distributions/gradle-2.12-bin.zip -P /tmp --quiet
L9:  && curl -fsSL -x proxyserver:8080 http://apache.osuosl.org/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN

とします。

fabric\core\chaincode\shim\java\javabuild.sh
を書き換えます。GradleにProxyをとおします。

gradle -q -b ${PARENTDIR}/core/chaincode/shim/java/build.gradle build

これが

gradle -Dhttp.proxyHost=proxyserver -Dhttp.proxyPort=8080 -Dhttps.proxyHost=proxyserver -Dhttps.proxyPort=8080 -q -b ${PARENTDIR}/core/chaincode/shim/java/build.gradle build

こうなる


これでOK。
おわったら立ち上がったLinuxにログインして作業を進めます。
garapon.hatenablog.com

DockerImageのビルド

さっそくビルドしましょう。

$ cd $GOPATH/src/github.com/hyperledger/fabric
$ make peer-image
$ make membersrvc-image

確認します。

$ docker images
REPOSITORY                      TAG                             IMAGE ID            CREATED             SIZE
hyperledger/fabric-membersrvc   latest                          6e0ad0ce5870        2 hours ago         1.44 GB
hyperledger/fabric-membersrvc   x86_64-0.7.0-snapshot-42ca84b   6e0ad0ce5870        2 hours ago         1.44 GB
hyperledger/fabric-peer         latest                          6323f96d118c        3 hours ago         1.446 GB
hyperledger/fabric-peer         x86_64-0.7.0-snapshot-42ca84b   6323f96d118c        3 hours ago         1.446 GB
hyperledger/fabric-javaenv      latest                          484a2c1d472e        3 hours ago         791 MB
hyperledger/fabric-javaenv      x86_64-0.7.0-snapshot-42ca84b   484a2c1d472e        3 hours ago         791 MB
hyperledger/fabric-ccenv        latest                          12e4b7c10976        3 hours ago         1.439 GB
hyperledger/fabric-ccenv        x86_64-0.7.0-snapshot-42ca84b   12e4b7c10976        3 hours ago         1.439 GB
hyperledger/fabric-src          latest                          8b4953ed2add        3 hours ago         1.418 GB
hyperledger/fabric-src          x86_64-0.7.0-snapshot-42ca84b   8b4953ed2add        3 hours ago         1.418 GB

いっぱい出来ましたね。

fabricネットワークの起動

さてきどうしましょう。起動する前に
fabric\bddtests\bdd-docker\docker-compose-4-consensus-batch.yml
を修正します。
L18を

    - 7050:7050

と書き直しましょう。これを7050にしておくことでVagrantを起動している外からアクセス可能になります。

書き直したら起動!

$ cd cd $GOPATH/src/github.com/hyperledger/fabric/bddtests/bdd-docker
$ docker-compose -f docker-compose-4-consensus-batch.yml up --force-recreate -d

確認してみると

$ docker ps
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                    NAMES
a8e67ef73d7c        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   2 hours ago         Up 2 hours                                   bdddocker_vp2_1
215ecca8e1a3        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   2 hours ago         Up 2 hours                                   bdddocker_vp1_1
83688e10e2a3        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   2 hours ago         Up 2 hours                                   bdddocker_vp3_1
2e4ba2618554        hyperledger/fabric-peer         "sh -c 'exec $GOPATH/"   2 hours ago         Up 2 hours          0.0.0.0:7050->7050/tcp   bdddocker_vp0_1
d94ead61d86d        hyperledger/fabric-membersrvc   "membersrvc"             2 hours ago         Up 2 hours                                   bdddocker_membersrvc0_1

動いてますね。

やれやれ

Windowsのバッチファイルで日付取得するたった一つの冴えたやり方

みなさんCMDつかってますかー!
日本のエンタープライズで働いている限り使わざるを得ないCMDいやいや使うよりかっこよく使いこなしましょう。

CMDで日付(今日だったら20160926)のファイル名を作りたいときとき
Windows環境変数「DATE」の中には日付が入っていますが、スラッシュ含みの形式になっています。2016/09/26といった形式。(環境で異なることがあります)
しかしスラッシュはWindowsのファイルやフォルダ名に使用できないため、スラッシュを取り除く必要があります。

そんなときは

%DATE:/=%

をつかいましょう。

ログに吐くならこんな感じですね。

echo aa >> %DATE:/=%.log

これは日付文字列の「2016/09/26」に対して「/」を「」空文字に置換するという命令です。


ネットで検索すると以下のやり方が主流なようなのだけど、ぱっとみの可読性が低く僕はすきじゃない。

echo %date:~0,4%%date:~5,2%%date:~8,2%

これは「2016/09/26」から0-4文字と5-7文字目と必要な文字を抜き出して知れらを結合しています。
ぜひ上記の文字抜き出しで書いていて可読性を下げているバッチスクリプトがあったら「%DATE:/=%」で書き直してみてはいかがだろうか

ちなみにどちらもちゃんと同じ結果です。もちろん

C:\Users\garapon>echo %DATE:/=%
20160926

C:\Users\garapon>echo %DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
20160926

TIME部分も必要な場合TIMEはミリ秒の区切り文字が異なる為、切り出しをしないといけないのでそれはわるくないとおもいますよ。

游ゴシックはフォントサイズや拡大縮小で見た目が変化し別の文字に見える

まず、この文字を見てください
f:id:GARAPON:20160921121356p:plain

何に見えます?
数字の8の下にアンダーバーがあるような文字にみえてなんじゃこりゃってなる。
そこから考えてみるとあ、「一旦」?ってなってそうおもってみればみえなくないですが、
感じなのに角が丸まって見えるのが非常に違和感があります。
漢数字の1も留めが着いてない単なる棒なので余計わかりにくい。

拡大してみると
f:id:GARAPON:20160921121407p:plain
こんな感じで角が薄く表示されている。

比較

游ゴシック、MeiryoUI、MSゴシックでフォントサイズで比較してみるとこんな感じ。
f:id:GARAPON:20160921121451p:plain
サイズ8、11、14で丸くなっていることがわかる。比べてみるとMeiryoも縦線が太くなったりしている。
MSゴシックはちゃんときれい。

フォントデザインの仕組みは良くわかりませんがこれは気持ち悪い。
Windowsの問題なのかもしらんけども、解像度が低くてもきれいに見えるようなフォントがいいなぁ、、、、、

Opencv3.1で顔検出

かおかおかおーかおかおかーおーかおかおかおー by たくみ

ということで顔検出してみる。

Opencvインストール

http://opencv.org/downloads.html
からDLした3.1を適当に解凍。以後の例では「C:\tool\opencv-3.1.0」に解凍したとしてすすめます。
3系と2系でAPIが結構変わっているので古いサンプルを動かしたい人は2系のほうがいいかもしれませんが、私は最新版で行きます。

Javaから使う準備

Javaから呼び出すには2つ作業が必要です
1、「C:\tool\opencv-3.1.0\build\java\opencv-310.jar」をクラスパスに通す
2、「C:\tool\opencv-3.1.0\build\java\x64\opencv_java310.dll」にパスを通す
2はめんどくさいので、手抜きするなら該当のDLLをプロジェクトフォルダ直下にコピーしましょう。

カスケード分類の用意

C:\tool\opencv-3.1.0\sources\data\haarcascades にあるhaarcascade_frontalface_default.xml を同じくプロジェクトフォルダ直下におきましょう。

動かしてみる

こんなソースを書きます。
http://opencv.blog.jp/java/face_detect
が2系のソースなので「org.opencv.highgui.Highgui」ではなく「org.opencv.imgcodecs.Imgcodecs」で読み書きをするように書き換えました。

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.objdetect.CascadeClassifier;

public class 顔検出 {

    public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        // 入力画像の取得	
        Mat im = Imgcodecs.imread("input.jpg");
        // カスケード分類器で顔探索
        CascadeClassifier faceDetector = new CascadeClassifier("haarcascade_frontalface_default.xml");
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(im, faceDetections);
        // 見つかった顔を矩形で囲む
        for (Rect rect : faceDetections.toArray()) {
            Imgproc.rectangle(im, new Point(rect.x, rect.y),
                    new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 0, 255), 5);
        }
        // 結果を保存
        Imgcodecs.imwrite("ouput.png", im);
    }
}

んで実行すると、、、

f:id:GARAPON:20160913175405p:plain
5名中4名は見えました。さすがに横顔は無理ですね。しかしすげー世界だなーいろいろらくだなー


顔写真はココから借用 http://www.photo-ac.com/