OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShellだけでExpingのような連続pingを実行する

# はじめに
ネットワークのお仕事をされている方でしたら Exping というツール
を使ったことがある方がいらっしゃると思います。
障害テスト時の通信断時間を確認したりするときに便利ですよね。
ですが、この手のツールを諸事情によりインストールできないことがあるかもしれません。
ここでは、Windows標準のPowerShellだけで似たようなことをやってみます。

検証環境はWindows 10、PowerShe ll5.0ですですが、
特に凝ったこったをやってないので、
Windows 7 PowerShell 2.0でもできるかもしれません。

# 実装

```powershell
:psping.ps1

# pingを実行する宛先を指定する
$targets = @"
192.168.1.1
192.168.1.9
192.168.1.8
192.168.1.14
"@ -split "\r\n"

# 設定
# pingを実行する間隔(ミリ秒)
$interval = 500

# 繰り返し数
$repeat   = 100

@(1..$repeat) | foreach {
    $targets | foreach {
        # 間隔をあけるためのsleep
        Start-Sleep -Milliseconds $interval
        try {
            # ping実行
            $tc = Test-Connection $_ -count 1 -ErrorAction Stop
            
            #結果の格納
            $result = "○"
        } catch [Exception] {
            # 失敗した場合
            $result = "×"
        }
        # 現在時刻
        $datetime = Get-Date -F "yyyy/MM/dd HH:mm:ss.fff"

        # CSV形式で結果情報を作成
        $row = $result + "," + $datetime  + "," + $tc.Address + "," + $tc.ResponseTime 
        
        # CSVからオブジェクトを出力
        $row | ConvertFrom-Csv -Header @("Result","DateTime","Target","ResponseTime(ms)")
    }

} | Out-GridView -Title "Ping Results" # グリッドビューを表示する

```
Test-Connection コマンドの実装上の事情により、
戻り値のIPv4Addressはあえて表示させてません。
参考：[Test-Connectionが遅い理由と対策方法について](http://stknohg.hatenablog.jp/entry/2016/06/16/231239)

# 実行例
```
D:\>powershell -File  psping.ps1 -ExecutionPolicy RemoteSigned
```

![psping.gif](https://qiita-image-store.s3.amazonaws.com/0/124069/541bf1e7-3198-90b7-767a-dc8b27003b6b.gif)

実装が荒い部分もあり、ベースとしてはこのような感じになるかと思います。
Docker for Windows で、ホストのファイルが見えない！


Docker for Windows の設定でドライブ毎の共有設定をしないと、volume で指定したホストのフォルダは見えても、ファイルが見えないようです。

以下では、まずは現象を確認します。
その後、設定変更したのちに解消したことを確認します。

# 設定前

## ホスト

```bash
> dir /w

[.]       [..]      hoge.go
```

## コンテナ起動 & 現象を確認

```bash
>docker run --rm -it -v //c/_devel/gopath/src/my/hoge:/go/src/app golang:1.6-onbuild bash
root@4c49fa09a4fc:/go/src/app# ls
root@4c49fa09a4fc:/go/src/app#
```

hoge.go があるはずなのに… :fearful: 

# 設定後
## 設定
![image](https://qiita-image-store.s3.amazonaws.com/0/32149/c0e3bc45-0390-3f47-40c1-071af3d2420a.png)

## コンテナ起動 & 解消したことを確認

```bash
> docker run --rm -it -v //c/_devel/gopath/src/my/hoge:/go/src/app golang:1.6-onbuild bash
root@f6a9390777dc:/go/src/app# ls
hoge.go
root@f6a9390777dc:/go/src/app#
```

今度は、きちんとファイルが見えていますね。 :smiley:
npm-scriptsでpugをcompile

# jadeじゃなくてpug

![9338635.png](https://qiita-image-store.s3.amazonaws.com/0/47955/63533744-b986-b22e-c30d-10e902fe71d1.png)


随分とStaticなHtmlを書いていなかったところ、久しぶりにちょっと書くことになったので色々どれにしようか悩んでJade触るかと思ったところ、いつの間にかJade（うさぎ）さんがPug（犬）さんに変わっていました。

名前と拡張子、一部機能が変わっただけのようなのでドキュメントサイトもJadeのままです。
が、以下のように **node-moduleにpugを追加** して **npm-scripts** でcompileしようとすると怒られます。

## pug

#### インストールとpackage.json

```
$ npm i pug --save
```

```json:package.json
{
  "name": "hogehoge",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "compile-pug": "pug --hierarchy -o public/ src/"
  },
  "dependencies": {
    "pug": "^2.0.0-beta3"
  },
  ...
}
```

#### ディレクトリとファイル
- src/
    - index.pug
    - foo-dir/
        - bar.pug


jadeの時は `jade --hierarchy -o public/ src/` で良かったのですが、pugは **pug**　と **pug-cli** が必要です。

入れましょう。

```
$ npm i pug pug-cli --save
```

これでcompile通ります。 名前が変わったのは権利関係の問題だそうです。fm...
傾斜計 (v0.3) > MPU-9250の測定速度を1Hzにする

```txt:動作環境
ESP-WROOM-02
MPU-9250 https://strawberry-linux.com/catalog/items?code=12250
ライブラリ https://github.com/jrowberg/i2cdevlib/
```

## 測定周期の変更

Jeff RowbergによるMPU用ライブラリとサンプルスケッチMPU6050_DMP6を使った場合、デフォルトではMPU-9250の測定は100Hzで行われ、FIFOの扱いをきちんとしないとFIFO overflowになる。

測定間隔を100Hzから落とす方法について調べた。

参考 https://sites.google.com/site/yamagajin/home/mpu6050

ライブラリのヘッダーファイル(MPU6050_6Axis_MotionApps20.h)を変更すると測定周期を変更できるとのこと。MPU-9250の場合はMPU9150_9Axis_MotionApps41.hになる。

ただし、ライブラリのヘッダファイルそのものを変更すると、今後MPU-9250を使用するすべてのソフトがその測定周期になってしまう。

ここでは、`#include "ファイル.h"`の仕組みを考慮した変更を行う。

## 変更ファイルのローカル化

`#inlcude "ファイル.h"`をソース内で定義した場合、ヘッダーファイルのサーチ順番は以下となる。

1. ローカルのフォルダ
2. インクルードファイルパスが通っているフォルダ (Arduino\Librariesなど)

つまり、ローカルのフォルダにMPU9150_9Axis_MotionApps41.hがあり、Arduino\LibrariesにもMPU9150_9Axis_MotionApps41.hのファイルがある場合、ローカルフォルダのMPU9150_9Axis_MotionApps41.hが使われる。

ローカルフォルダのMPU9150_9Axis_MotionApps41.hの測定周期を変更すると、ローカルフォルダに同ファイルがない他のプロジェクトではArduino\Libraries内のヘッダーが使われるので、それらのプロジェクトではデフォルトの100Hzの測定周期となる。
ヘッダファイルの変更を特定のプロジェクトだけに制限できることになる。

以下のコピー元からコピー先にファイルをコピーして、コピー先の設定を変更するといい。

- コピー元: \Arduino\libraries\MPU9150\MPU9150_9Axis_MotionApps41.h
- コピー先: \Arduino\esp8266_160701_MPU9250\MPU9150_9Axis_MotionApps41.h
(\Arduino\esp8266_160701_MPU9250: 今回のプロジェクトフォルダ)

## MPU9150_9Axis_MotionApps41.hの変更

参考 https://sites.google.com/site/yamagajin/home/mpu6050
を参考に以下の行を変更した。

```MPU9150_9Axis_MotionApps41.h
//    0x02,   0x16,   0x02,   0x00, 0x03                // D_0_22 inv_set_fifo_rate
    0x02,   0x16,   0x02,   0x00, 0xC7                // D_0_22 inv_set_fifo_rate

    // This very last 0x01 WAS a 0x09, which drops the FIFO rate down to 20 Hz. 0x07 is 25 Hz,
    // 0x01 is 100Hz. Going faster than 100Hz (0x00=200Hz) tends to result in very noisy data.
    // DMP output frequency is calculated easily using this equation: (200Hz / (1 + value))

    // It is important to make sure the host processor can keep up with reading and processing
    // the FIFO output at the desired rate. Handling FIFO overflow cleanly is also a good idea.
```

上記コメントにあるように、(200Hz / (1 + value))が測定周期になるので、valueには199となるように0xC7を指定した。これで1Hzとなる。

元のコードは0x03を使っていたので、50Hzだったようだ。


## code (v0.3)

[v0.3 @ github](https://github.com/yasokada/esp8266_160701_MPU9250/releases/tag/v0.3)

実際に実行したところ、1Hzの測定間隔となった。

距離計と組合せてポータブル3Dスキャナとする場合はこれくらいの測定周期がいいかと思う。
現役高校生プログラマーが日々実践していること

#自己紹介
中２でHTML/CSS/JavaScriptに出会いそこからPHP/MySQL等のサーバーサイドに触れWeb技術を極め
高２でiOS開発を初め今ではObj-c/Swiftを操り、クライアント～サーバーサイドまでをこなすまでに成長。
仕事はテレアポ、進路は日本電子。
薔薇とチーズが好きな１７歳現役高校生。

#はじめに
僕は趣味でプログラミングをしているホビープログラマーで現在は主にiOSアプリ開発に携わっています。

以前、勉強させてもらっている会社のプログラマーさんに「qiitaとかになにかアウトプットしてみたら？もしかしたら高校生プログラマって話題になるかもよ？！」と言われたことが初投稿に至るきっかけでした。
自分でもちょっと話題になればいいなと思い書いています（笑）
ただ、人に何かを教えられるほど技術力はないので同年代のプログラマーさんや趣味でやっている方に向けて自分が実践している習慣に焦点を置いて書きます。
何か参考になることがあれば光栄です。

#メモ
趣味でやっていると作業と作業の間が開いてしまうことがあり「あれ？これどこまでやったけ？」や「え？この間まで動いてたけど！？」と忘れてしまい前回の作業内容を思い出すだけで約１０分。。
そんな時間がもったいないなと思いメモを執るようになりプロジェクトごとにメモを作り<プロジェクト名　Scenario>と名付け進捗やアイデアを書いています。

内容としては作業の終わりに日付、作業内容、メモ、ハマったところ、次の作業内容をテンプレとして作り僕は箇条書きが好きなので基本的に箇条書きで書いています


そのScenarioを作業前に必ず見返すことでスムーズに作業を始められタイムロスが減り、メモ、ハマったところを作業後に思い出しながら書くことで覚えたことが定着するようになり効果抜群です。

やっぱり人間は忘れていく生き物で忘備録としてメモを執ることは大切だなと思っています。

#アイデアをとことん出す
自分は「アイデアこそ動力源」だと思っています。
アイデアが出れば自然にモチベーションが上がる経験は誰もがあるのではないでしょうか。

まず質ではなく量を出すことに重点を置いてつまらないと思うようなアイデアでもほかのアイデアと組み合わせることで斬新なアイデアに生まれ変わったことがあります。

そしてアイデアが出たときには新鮮なうちにメモするように心がけています。

まぁ自分は毎日アイデアがぽんぽん出てくるほどクリエイティブな人間ではないので行き詰ったときには必ず相談する友人がいます。
人と話すことで得られるものは多いなと日々思い、できれば多くのコミュニティにも参加したいとも思っています


#ユーザーを作る
趣味でプログラミングをする'ひとり開発'では仕事と違いやらなければいけない責任はなく、よりモチベーションが問われると思います。
以前自分も「このアプリにはこういうユーザーがいてこういう時に役に立つ」と空想のユーザーを想定し開発していました。ただそれでは達成感と自己満足しか得られず何か物足りず"使ってもらう喜び"が得られませんでしたが今は一般公開用のアプリではなく実際に身内（今は主に彼女）と使えるアプリの開発をしていて'使ってもらう喜び'を感じられモチベーションの向上に繋がっていることは間違いないです。
更には、使ってもらうことを考えUI/UXにも考えが及ぶようになりました。

#自分の制作物をかわいがる
自分は制作物をChildrenと名付けています。
育児の経験はないですがわが子のように愛情を注ぎ開発を行っています。

「愛するということはすべてを受け入れることだ」と偉い人が言っていました。
なので僕は不完全でも、つまらなくても愛情を注いでいます。

#おわりに
何かお役に立てましたでしょうか？

qiitaに投稿するのは初めての経験でいい刺激になりまた書きたいなと思います。
高校生プログラマーの開発事情について需要があればまた書こうと思います。
加えて間違いなどありましたらコメントからご指摘お願いします。

長くなってしまい拙い文章でしたが最後までお付き合いいただきありがとうございます。
jshellを使ってみた


#jshellとは？
java9からの新規機能で、javaのREPLツールです。

##REPLとは？
Read Eval Print Loop の略で打ち込まれた命令を読み込み（Read）評価し（Eval)出力し(Print)、また命令待ち状態に戻る(Loop)ものです。
java以外の言語ではすでに備わっているものも多いです。

#jsehllの導入
https://jdk9.java.net/download/
こちらからjdkをダウンロードしてパスを通すだけです。
ですが、私の場合はこちらからダウンロードしたものにパスを通し、jshellを起動しても「現在のフィードバック・モードと異なります」なるwarningが大量に流れて、起動自体はちゃんとするのですが、評価した値が表示されませんでした。
そこで、ジェンキンスから最新の成功ビルドをダウンロードしてパスを通すことに・・・
これでwarningログなしに起動し、評価した値をコンソールに表示させることができました。
https://adopt-openjdk.ci.cloudbees.com/view/OpenJDK/job/openjdk-1.9-linux-x86_64/lastSuccessfulBuild/

    jshell
>|  Welcome to JShell -- Version 9-internal
|  Type /help for help

##jshellで何ができるの？
簡単なコードを即時評価できるので簡単なコードを書きたいときに使えます。

    -> 1+1
>|  Expression value is: 2
|    assigned to temporary variable $4 of type int

値を評価し、更に一時変数に格納してくれます。
なので変数宣言しなくても評価した値を使うことができます。

    -> System.out.println($4)
>2

#jshellによりjavaの学習コストは下がるのか？
javaに限らずプログラミングの基礎を教える研修ってなぜか頑なにIDEを使わせようとしないですよね。
私も最近研修を担当したので、その件を講義したのですが無駄でした。
なので、生徒はいままでHello Worldを出力するまでに
1. mainクラスが書いてあるファイルを作成
2. コードを書く
3. javacコマンドでコンパイル
4. javaコマンドで実行
という手順を踏まないといけませんでした。
それが、jshellを使うと
1. jshellを起動する
2. コードを書く
これだけでいけてしまうのでとても楽ですし、今までコンパイルするまでわからなかった変数名の間違いなど（IDEを使わないのでとても多かった）が即時フィードバックされるので、そういうつまらないところでつまずき、プログラミングに苦手意識を与えられる生徒が減ってくれると思います。
さらに自動保管機能もあるのでタイプミスはほとんどなくなります。
最初からIDEを使えばいいだけなんですけどね・・・

#まとめ
1. jshellは簡単なコードを確認するのに便利
2. jshellはIDEを使えない初心者にとって学習コストが減る

jshellではクラスを作成したり、起動時にimportを構成する設定を行ったりいろいろなことができるので、次回jshellで便利なコマンド集を作りたいと思います。
macで便利なツールまとめ

開発者にとって、macが便利なツールをまとめる

## ターミナルツール
### iTerm
tab分割、ホットキーなど便利な機能満載
[iTerm2を使いこなす](http://neko-mac.blogspot.com/2015/02/iterm2.html)
ここを参考に設定ファイルを出力して、GitHubで管理する(ほかのマシンにしたら、再設定するのが面倒)
[iTerm2の設定をインポート・エクスポートする方法](http://qiita.com/reoring/items/a0f3d6186efd11c87f1b)


## 開発ツール
### sequel pro
mysqlのツール、workbenchよりは使いやすい
ただ複数SQLの結果が複数タブで出力できないのが不満、もう少しタブ機能を充実したい

## 情報収集
### feedly
RSSで最新技術情報収集で使う、アカウントを登録すれば、どこでも同期できる



## メモリ管理
### memory monitor
VirutalMachine、IDEを起動すると、メモリが足りなくて動作が遅い場合は、これを使うとサクサクと動く

## Finder
### finderpathでパスを入力して簡単い移動できる
[FinderPath – MacのFinderにアドレスバーを追加する便利なユーティリティ](http://www.softantenna.com/wp/mac/finder-path/)
[こちら](http://pc-karuma.net/mac-app-startup/)を参考にしてログイン時に自動起動した

## UMLモデリングツール
### astah community
無料でそこそこの機能が持ってる

## Editor
### Fraise
TABで管理できるEditorを探して、こちらにした
IDEの補助として、メモなどで利用することで十分便利
[もうMac用エディタソフトは『Fraise』でいいんじゃないか、と思える理由](http://blog.rimikcolor.com/archives/1766)
CloudFlareからCloudFrontに移行してハマった話

簡単に切り替えればいいだけかと思いましたが、違いました。

## 初期の構成

(HTTPS) -> CloudFlare -> (HTTP) -> Heroku -> Rails

## 移行後の構成１

(HTTPS) -> CloudFront -> (HTTP) -> ELB -> (HTTP) -> Elastic Beanstalk -> Rails

### Distribution Settings

Alternate Domain Names (CNAMEs): exsample.com
SSL Certificate: Custom SSL Certificate (ACMで作成)

### Origin Settings

Origin Domain Name: ELB
Origin Protocol Policy: HTTPS Only

### Default Cache Behavior Settings

Viewer Protocol Policy: Redirect HTTP to HTTPS
Allowed HTTP Methods: GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE

## 移行後の構成２

移行後の構成１は、単純にはうまく行きません。まず、CloudFrontはデフォルトでは多くのヘッダーを削除します。

カスタムオリジンの場合のリクエストとレスポンスの動作 - Amazon CloudFront

例えば、Hostが削除されるのでredirect_toしたときに、RailsがURLをELBのURLで返してしまってexsample.comからELBのURLに移動してしまいます。

もともと、コンテンツ配信用でCloudFlareのような使用方法ではなかったからだと思います。そのため、いくつかのヘッダーを許可しましょう。

### Default Cache Behavior Settings

Whitelist Headers:
Authorization
Host
Refere
X-Forwarded-For

※ CloudFlontの設定を変更した時は念の為にStatusがDeployedになるまで待ちましょう。

## 移行後の構成３

移行後の構成２は、またまたうまく行きません。CloudFront -> (HTTP) -> ELBの通信が、HTTPなのでX-Forwarded-ForにHTTPが入ってしまい、これまたRailsがredirect_toをhttpsからhttpに書き換えてしまいます。

X-Forwarded-ForはLoad Balancerのための仕様なので、Railsも対応してくれていて、そこにhttpsが入っていれば実際のリクエストがhttpでもうまく処理してくれます。

CloudFrontからの通信はCloudFront-Forwarded-Protoに入ってるのですが、ちょっと新しい概念だったりするのでRailsでは単純には対応してくれていません。

通常は、Nginxでリバースプロキシを設定するのだと思いますが、面倒なのでHTTPS化してしまいましょう。

AWSの無料SSL ACMはTokyo Regionとかでは現時点では使えません。いつか使えることを夢見つつSSL証明書を購入しましょう。
一番安いSecure Core SSLに乗り換える | デフよん

EC2 -> ロードバランサー -> リスナー -> 編集から追加し、HTTPS - HTTPで追加しましょう。SSL 証明書からSSLを追加できるので、追加しましょう。
ELB の ComodoSSL 証明書を更新 - Qiita

(HTTPS) -> CloudFront -> (HTTPS) -> ELB -> (HTTP) -> Elastic Beanstalk -> Rails

また、ロードバランサーにRoute53からAレコードのエイリアスでelb.exsample.comとかを設定してCloudFrontのoriginをelb.exsample.comに変更しましょう。

ちなみに証明書を削除する方法はこちらです。
ELBに設定したSSL証明書の削除～｜期限切れ ロードバランサ 方法 セキュア 対処 対応 設定 トラブルシューティング | ナレコムAWSレシピ

## 移行後の構成４

さて、移行後の構成３はうまく行きません。CloudFrontはCloudFlareと違って、Cookiesの転送はしてくれません。あと、Queryを転送してくれません。設定しましょう。これで、うまくいきました！

Default Cache Behavior Settings

Forward Cookies: All
Query String Forwarding and Caching: Forward all, cache based on all
Intel Edison ArduinoをMacで使ってみた

ハイスペックArduinoということでEdison版を購入したので最低限動くところまで試してみた。ちなみにPCはMacOSXです。
> ![Edison](https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Intel_Edison_Arduino_Photo.gif/800px-Intel_Edison_Arduino_Photo.gif)
> Wikipediaよりhttps://en.wikipedia.org/wiki/Intel_Edison

# 用意するもの
- ハードウェア
 - Edison Arduino アマゾンで購入
 - micro USBケーブル 2本 付属に無いので予め準備
- ソフトウェア
 - ARDUINO 1.6.9 https://www.arduino.cc/en/Main/Software
- 参考資料
 - Getting Started http://edison-lab.jp/gettingstarted/edison-arduino/mac/

# 組み立て
0. Edison本体をEdisonのボードに付属のナットで固定する。
0. USB端子の脇にあるスイッチをmicro USB側に設定しておく
0. micro USBケーブルを2本PCに接続する
0. ArduinoをMacで起動する
0. ツール＞ボード＞ボードマネージャーを開き「Intel i686 Boards by Intelバージョン1.6.7+1.0」(Verは現時点)をインストールする。インストール時にダウンロードが行われるので、Proxyなどの設定が必要な場合は予めAruduino＞Preferences＞ネットワークで設定しておく。
0. ツール＞ボード＞Interl(R)Edisonを選択する
0. ツール＞シリアルポート＞/dev/cu.usbmodemXXXXX(Intel(R)Edison)を選択する。ここまででセットアップは完了

# サンプル実行
## Lチカ(LED点滅)
0. ファイル＞スケッチの例＞01.Basics＞Blink
0. 画面左上の→(右矢印ボタン)をクリックするとコンパイルとEdisonへのプログラム書き込みを行い、実行してくれる
0. 電源LEDの右下のLEDが一定周期でチカチアすれば完成。

## Wifi経由でのWebページ取得
0. ファイル＞スケッチの例＞Wifi(Edison)＞WifiWebClient
0. SSIDとパスワード部分を入力する``` char ssid[] = "XXXXXXX"; char pass[] = "XXXXXXXXXXXXXXXXXX"; ```
0. 左上の→ボタンをクリックしてコンパイル＆実行する
0. ツール＞シリアルモニタを開き、右下のビットレートを9600bpsに設定する
0. 少し待つとWiFi経由でWebページが取得され表示される。

## まとめ
意外と簡単にWFi経由での操作までできたので、次はIoTでよく使われるMQTTでデータを送るテストをしてみようと思います。
PuTTYで「Unable to use key file」と出たときの対処法

OpenSSHの鍵にPuttyは対応していないので、PuTTYgenで対応させる。

手順は以下。

1. PuTTYgenを起動。
2. 「Load」をクリックして秘密鍵を読み込んで指示通り進む。
3. 「Save」でキーを保存する。

あとはPuTTYで保存した鍵を読み見込む。
[VLC]RTSPで配信する

# RTSPとは
Real Time Streaming Protocol（リアルタイム・ストリーミング・プロトコル）は IETF において標準化されたリアルタイム性のあるデータの配布 (ストリーミング) を制御するためのプロトコルである．
参考[wikipedia-Real Time Streaming Protocol](https://ja.wikipedia.org/wiki/Real_Time_Streaming_Protocol)
よく聞くhttpとは「Hyper Text Transfer Protocol」といい，ハイパーテキストと呼ばれる文章を転送のための規格です．それに対し，RTSPとはリアルタイムストリーミングのための規格です．
動画を配信するときはRTSPが最も適しているわけです．なので，今回はVLCを使ってRTSPで配信するやり方を書きたいと思います．

# 配信側の設定
[ファイル]から[キャプチャーデバイスを開く]を選択します．以下の画面で，配信したい入力デバイスを設定します．
<img width="686" alt="スクリーンショット 2016-07-02 0.36.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/56557/25172ab9-ed8d-4b85-d1e0-4dc7b2d4ddb2.png">
[ストリーミング/保存]の項目にチェックを入れて，詳しい設定をします．
<img width="686" alt="スクリーンショット 2016-07-02 0.36.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/56557/9dbe08ee-8c32-a0ef-253b-bc36d3449153.png">
ストリーミングタイプをRTPに設定し，アドレスを224.0.0.1でポートを1900に設定します．トランスエンコーディングオプションでビデオとオーディオにチェックを入れることを忘れないでください．
RTPのアドレスについては以下のサイトを参考にしてください．基本的にRTSPでは224.0.0.0 ～ 239.255.255.255のアドレスを使用します．
[Multicast Address](http://www.infraexpert.com/study/multicast2.htm)
okを押して，これで配信側の設定は終わりになります．

# 受信側の設定
受信設定を行いますが，一つのVLCアプリケーションだけ起動してる状態では同時に配信と受信を行うことができません．なので二つウインドウを開く必要があります．macでは，.appファイルを複製し，違うディレクトリに置いて，VLCを二つ起動できるようにします．
[ファイル]から[ネットワークを開く]を選択します．httpで開きたいときは直接URLを入力し，実行してください．今回はRTPストリームをするので，[RTP/UDPストリームを開く]を選択します．
<img width="690" alt="スクリーンショット 2016-07-02 0.37.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/56557/624e4230-0392-4d01-27f7-0f5bc7e9f0f4.png">
RTPマルチキャスを選択し，先ほど入力したアドレスとポートを入力します．
<img width="686" alt="スクリーンショット 2016-07-02 0.37.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/56557/44e77ad3-1e71-6896-f7e0-13cc6ed057a4.png">
これで，受信側の設定は以上となります．

# 配信/受信してみる
今回はスクリーンを配信しました．このように配信と受信を行うことができました．
![スクリーンショット 2016-07-02 20.22.44.png](https://qiita-image-store.s3.amazonaws.com/0/56557/b7410bcb-4f63-5b98-afb8-dcb36f4c2cd9.png)
それでは素敵なRTSPライフを送ってください．
Redisデータ永続化の種類とサービス稼動時の切り替え注意点

# 前提
以下は Redis 2.8 以降を前提としています

# Redisのデータ永続化の種類
Redisではデータの管理手法として３種類あります。

・メモリでデータを管理する方式（揮発性ベース）
・特定のタイミングでデータをディスクに保存する方式（RDBベース）
・随時データをディスクに保存する方式（AOFベース）

'RDB'や'AOF'とすることでRedisを再起動してもはファイルからメモリにデータを読み込みなおすためデータの永続化がはかれる。というものです。

パフォーマンス劣化などの弊害もあるため、提供するサービスの内容とメリデメを見て選択することになります。

### 揮発性ベース
データをすべてメモリ内で保有して処理します。
Redisの再起動でデータがすべてロストしてしまうので、これが許容できるケースで利用します。

|  | 説明 |
|:--|:--|
|メリット|・最高パフォーマンス|
|デメリット|・再起動でデータは全ロスト|

設定例　　：

```conf
    save ""
```

### RDBベース
指定したタイミングでデータをファイルに保存します。（非同期スナップショット）
Redisの再起動において軽微なデータロストが発生するので、それが許容できるケースで利用します。
Redisの'save'ディレクティブで保存タイミングを設定します。

|  | 説明 |
|:--|:--|
|メリット|・高パフォーマンス|
|デメリット|・再起動で保存前の更新データがロストする|

設定例　　：　save　[□□秒以内に保存]　[〇〇回更新後]

```conf
    dir /var/run/redis              # RDB/AOFの格納ディレクトリを指定する
    dbfilename 6379.rdb             # RDBのファイル名を指定する
    rdbcompression yes              # RDBの圧縮要否を指定する
    save 900 1                      #      1回の更新後 900 秒以内に同期する
	save 300 10                     #     10回の更新後 300 秒以内に同期する
    save 60 10000                   # 10,000回の更新後  60 秒以内に同期する
```
### AOFベース
常にデータをファイルに保存します。（デフォルトは秒単位の保存なので"ほぼ"同期保存となります）
データロストが許容できないケースで利用します。
RDBベースと並行稼動できますが、正直メリットは感じられません。

|  | 説明 |
|:--|:--|
|メリット|・データ毀損が（ほぼ）無い|
|デメリット|・低パフォーマンス（50〜100倍程度のレスポンス遅延）<br>・リソース大量消費（データ保存時に格納サイズの倍以上のメモリが必要）|

設定例　　：

```conf
    dir /var/run/redis              # RDB/AOFの格納ディレクトリを指定する
    appendonly yes                  # AOFの利用要否を指定する
	appendfilename 6379.aof         # デフォルトは appendonly.aof となる
    appendfsync everysec            # デフォルトで秒単位に同期する（中速で動作する）
    # appendfsync always            # 常に同期する（低速だが安全に動作する
    # appendfsync no                # OSに任せる（高速に動作する）
    auto-aof-rewrite-min-size 32mb  # AOFのファイルサイズが32MByte以下はリビルド（最適化）の対象外とする
    auto-aof-rewrite-percentage 100 # AOFのファイルサイズが倍増(100%)した場合にリビルド（最適化）する
```

# サービス稼動中の永続化方式変更時の注意点
稼働中のモード変更では、'CONFIG'コマンドによるサービス中のモード変更と設定ファイル（redis.conf）の変更をあわせてしておかないと運用時と再起動時の永続化モードの差異によって運用時のデータがロストしてしまう可能性があります。

## データロスト事例
###（１）AOFからRDBに切り替えるケース
'AOF'稼動中のRedisをパフォーマンスを高めるため'CONFIG SET'コマンドで'RDB'に切り替えた。
あわせて設定ファイルも'RDB'に変更する予定だったが忘れた。
数日後のサーバ再起動で、設定ファイルが'AOF'ままだったので、'RDB'切り替え前の
古い'AOF'ファイルで起動されてしまい'RDB'で運用していた期間のデータが消えた。

###（２）RDBからAOFに切り替えるケース
'RDB'稼動中のRedisを、可用性を高めるため設定ファイルを'AOF'に切り替えた。
あわせて'CONFIG SET'コマンドで'AOF'に切り替える予定だったが忘れてしまった。
数日後のサーバ再起動で、期待どおりに'AOF'起動されたが'AOF'ファイルが存在せず、データなしで起動されてしまい'RDB'で運用されていた再起動前のデータがすべてロストしてしまった。
※ Redisは'RDB'と'AOF'の並行動作時、'AOF' > 'RDB' の優先順でデータを読み込みなおす

###（３）RDBからAOFに切り替えるケース
'RDB'稼動中のRedisの可用性を高めるため'CONFIG SET'コマンドで'AOF'に切り替えた。
あわせて設定ファイルも'AOF'に更新する予定だったが忘れた。（＝'AOF'で運用が継続された）
数日後のサーバ（Redis）再起動で誤った'RDB'設定で起動してしまい、古い'RDB'ファイルで起動された。
（'AOF'に切り替え後のデータがすべてロストした）

# 最後に
Redisは利用する機能の特質上、どんどん更新情報が登録されていくものなので、サービス再開後の切り戻しは厳しい（できない！）ってことを念頭において、より上流工程で永続化方式を決定しておくべきですね。
仕方なく途中で変更する場合は、手順でしくらないよう注意したいと思います。
VirtualBoxで"/sbin/rcvboxdrv setup"を行っても"Bad argument setup"が出るときの対処法

VirtualBoxに入っているWindows7が急に起動できなくなりました。
その時、```/sbin/rcvboxdrv setup```をしろとのメッセージが。
そこで実行してみたところ

```
$ sudo /sbin/rcvboxdrv setup
Bad argument setup
```

と出てきます。これは困りましたね。
でも大丈夫。以下のようにすれば解決します。

```$ sudo /usr/lib/virtualbox/vboxdrv.sh setup```

Enjoy!
Raspberry Pi 3を導入するための初期セットアップメモ


# Raspberry Pi 3が発売された！
Raspberry Pi 3が発売されました。今回からWifiとBluetoothがオンボードになって、Wifiのアンテナが不要になってちょっとうれしいので買ってみました。

そこで、いろいろ苦難の連続だったので、コマンドなどのメモを残しておきたいと思います。

ちなみに、OSはRaspbian（jessie）です。
一応、wheezyからの更新手順も書いておきます。

# 早速セットアップ

## HDMIを使用可能にする。（起動時に有効化）
/boot/config.txtをテキストエディタで編集します。Macの場合だと、SDカードへの書き込み後にマウントされるので、直接開くことができます。

config.txtの以下の行をコメントを外すと有効になります。

```bash:config.txt
# hdmi_force_hotplug=1
```

## パッケージの更新

（apt-get dist-upgradeは不要かな？古いRaspberry Piの更新も行ったので、一応残しておきます）

```bash:コマンド
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
```

## （おまけ）wheezy→jessieの更新
1. /etc/apt/sources.listを編集します。
	1. wheezyをjessieに書き換えます。
2. パッケージの更新の手順を踏みます。
3. 再起動

## 日本語用のターミナルをインストール

```bash:コマンド
$ sudo apt-get install jfbterm
```

## 日本語フォントもインストール

```bash:コマンド
$ sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname
```

## ロケールを日本語に設定

```bash:コマンド
$ sudo raspi-config
```

以下の設定を行う。（詳しくは画像を参照して下さい）

1. 国際化オプションの設定を開く
2. Change Localeを選ぶ
3. ロケールをja_JP.UTF-8にする。
4. 標準のロケールに設定変更
5. 一応再起動

![ロケールの変更.png](https://qiita-image-store.s3.amazonaws.com/0/11925/f9a2444e-6808-737e-9fff-f18620a0aa86.png "ロケールの変更.png")

![国際化オプション.png](https://qiita-image-store.s3.amazonaws.com/0/11925/0abdde6b-e2a3-b499-82ce-3da760c06b1c.png "国際化オプション.png")

![ロケールの変更2.png](https://qiita-image-store.s3.amazonaws.com/0/11925/db23beed-8e1c-a430-173f-cbcd8e715862.png "ロケールの変更2.png")

![標準のロケール設定.png](https://qiita-image-store.s3.amazonaws.com/0/11925/66aefeeb-f240-aad6-e608-de0d67d97f4c.png "標準のロケール設定.png")

再起動しないと設定が反映されない？

## キーボードの設定
GUIから設定しようと思いましたが、手元の環境がVNCServer経由だったので、設定が起動せず…。（後日追記する予定）

* Menu→preference→raspi-configを選択
	* キーボードの設定があるので、そこで、日本語キーボードを選択

## 音声出力の設定
```bash:コマンド
$ amixer cset numid=3 1
```

これは、イヤホンジャック固定かつ、アナログ出力の設定をします。私の用途ではイヤホンジャックを通じてスピーカから音声を出す必要があったので、このコマンドを実行しました。このコマンドは再起動後も有効です。

## Wifiの設定
これは、GUIから設定すると便利だし、確かに繋がるようになりますが、現時点で設定するとWifiがつながらない所で起動するとWifiに繋がるまで固まります。（私だけ？）
以前のように設定ファイルを編集すれば大丈夫だと思われる。

ということで、現時点ではおすすめしませんが、raspi-configから設定可能です。

# 参考サイト
http://qiita.com/ttyokoyama/items/7afe6404fd8d3e910d09
http://nonstop-engineering.hatenablog.com/entry/raspberry-pi-first-setting
http://qiita.com/spicemanjp/items/91e4239934bc94ba463a
https://linuxconfig.org/raspbian-gnu-linux-upgrade-from-wheezy-to-raspbian-jessie-8
http://qiita.com/JO3QMA/items/b0892ce38f9220abea29
http://qiita.com/ttyokoyama/items/7afe6404fd8d3e910d09
http://qiita.com/plsplsme/items/57b8d79d3725497fd69b

# Disclaimer
* この記事は個人的なものです｡私の雇用者とは全く関係はありません｡（一応つけておきます）
composerのバージョン指定方法 ~(チルダ) ^(キャレット) *(アスタリスク)の違いが分かる

## この記事でわかること

* セマンティックバージョニングとは何かが分かる
* conposerで指定するバージョン番号の意味が分かる
* composerでのバージョン指定は何を指定すれば良いか分かる

### 対象の読者

* セマンティックバージョニングという言葉を知らない
  * 知っているが、よく分かってない
* composerでバージョン指定の記号の意味が分からない
  * とりあえず、前の人が使ってたから `v1.0.*` のままにしてる


### セマンティックバージョニングとは

composerで、ライブラリのインストールをする際にはバージョン番号を指定する必要があり、
その指定方法によって、実際にインストールされるバージョンが異なります。

故に、このバージョン番号の意味を知っておかないと、知らない間にバージョンアップされて動かない。
等のバグの温床を生む可能性があります。

このバージョン番号について理解するために、今バージョニングで一般的であり、packagistで公開されている多くのライブラリが採用しているセマンティックバージョニングについて知る必要があります。

詳しくは、[セマンティックバージョニング](http://semver.org/lang/ja/)を参照してください。

### セマンティックバージョニングの重要な部分の抜粋

* バージョン番号は、 `x.y.x` と記載する
  * x > メジャー番号
  * y > マイナー番号
  * z > パッチバージョン
* これらの数値の上げ方にはルールがある
  * 番号は整数値で、先頭に0(ゼロ)をつけてはいけない
  * 後方互換性のあるバグ修正時には、パッチバージョンを上げる
  * 後方互換性のある変更時には、マイナーバージョンを上げる
  * 後方互換性のない変更時には、メジャーバージョンを上げる

## composerにおけるバージョン番号指定

バージョン番号の指定にはいくつかの方法があります。

指定|対象のバージョン
---|---|---
2.0.5|2.0.5
2.0.*|2.0.0以上、2.1.0未満
2.*|2.0.0以上、3.0.0未満
^2.0|2.0.0以上、2.1.0未満
^2.0.5|2.0.5以上、2.1.0未満
~2.0|2.0.0以上、3.0.0未満
~2.0.5|2.0.5以上、3.0.0未満
2.*@dev(開発バージョンも対象にする)|2.0.0-dev(例)
dev-master|1.0.0未満(開発中のバージョン)

### まとめ

* `^(キャレット)` はパッチバージョンが最新のものだけ入れる
* `~(チルダ)` は、マイナーバージョンが最新のものだけ入れる
* `*(アスタリスク)` は、指定した箇所で最新のものを入れる
  * `^2.0` と `2.0.*` は同義
  * `^2.0` と `2.*` は同義
* `^`も`~`も後方互換性を維持した(セマンティックバージョニングの定義上では)バージョンで最新のものを入れる
* 違いは、バグ修正バージョンだけを上げるか、マイナーバージョンまで上げるかの違い
* 複数人で開発する場合には、チームでバージョン指定のルールを決めとくと良いでしょう

大事なのは、あくまでもセマンティックバージョニングが推奨されているだけで、ライブラリ作者によっては定義の捉え方が異なったり、守られてない場合もあるので、臨機応変に対応していく必要はあります。
Githubを使った開発方法と流れ(Github-flow)

超わかりやすいｗ
参考:[Github-flowを分かりやすく図解してみた](http://b.pyar.bz/blog/2014/01/22/github-flow/)

以下引用
> # Github flowって何よ？
> 
> 複数人で開発するときに、github上のリポジトリをどう運用するかをまとめたもの。
> 
> # 概要教えて
> 
> * masterブランチのものは、いつでもデプロイ出来る状態で無ければならない
> * 新しい何かに取り組む際は、masterからブランチを作成する
> * 作成したブランチは、説明的な名前を付ける（例: new-oauth2-scopes）
> * 作成したブランチは、定期的にgithub上へgit pushする
> * フィードバックや助言、ブランチのマージをして欲しいときは、github上でpull requestを作成する
> * 他の誰かがレビューをする。
> * OKが出たら、masterへmargeできる
> * マージをしてmasterへpushしたら、直ちにデプロイをする

僕らも基本的にはmasterブランチが本番deploy用。

基本はstagingブランチで作業。
バグ対応や簡単な修正はstagingブランチで実施。
テスト環境には、stagingブランチをdeployするようにしています。
なので、

* stagingブランチで作業  
  or  
  新機能はわかりやすい名前での新ブランチを作成して作業
* stagingにpush
* (レビュー)
* テスト環境にdeploy
* 実働テスト

という工程があってから

* masterへstagingブランチをpull requestする。
* そしてレビュー。
* 問題なければマージ(werckerなどで自動テスト走る）。
* deployをする。

という感じでやってます。

こういうのも日々改善ですね。いい仕組みで取り組みたい。
オンラインLaTeX執筆環境OverLeafで日本語文書を作成する

**目次が生成されないバグが解消されたので， 該当する節を削除しました(2017/12/17)**

# OverLeafとは

- [OverLeaf: Real-time Collaborative Writing and Publishing Tools with Integrated PDF Preview](https://www.overleaf.com/signup?ref=b92bb05fa923)

![overleaf.png](https://qiita-image-store.s3.amazonaws.com/0/128298/ce599f7d-c633-e28b-936e-c5fa6e7904da.png)

オンライン上のLaTeX執筆環境です．
便利な点は

1. ローカルからTeX環境を消し去ることができる（環境構築しなくてイイ！）
2. リアルタイムプレビュー機能
3. Googleドライブのような共同編集機能
4. 差分管理機能（現バージョンと以前のものとの比較とか）
5. 豊富なテンプレート集（主要な学会のテンプレートはそろっています）
6. Find Position機能（プレビュー内のテキストを選択すると，対応するソースにとべる）
7. Dropboxへの保存（Proアカウントのみ．ただし2,3人招待するとアンロックされる）

などなど．
自分はoverleafが便利すぎてローカル環境から完全に移行してしまった人間です．

# OverLeafで日本語を使うには

以下のサイトが詳しいです．

- [Overleaf で日本語を使用する方法 - TeX Alchemist Online](http://doratex.hatenablog.jp/entry/20150903/1441252705)

このサイト中の「別の方法2：XeLaTeX で日本語を使用する」を自分は使っています．
つまり，overleafで適当にプロジェクトを作り，

- 右上の歯車アイコンからSettingsの中のAdvanced Build Options->LaTeX EngineをXeLaTeXに変更
- ヘッダーに以下の宣言を追加

```tex
\documentclass[a4paper]{bxjsarticle}  
\usepackage{zxjatype}
\usepackage[ipa]{zxjafont}
```

# 付録
## 最小限のテンプレート
overleafで日本語文章を作成する際の最小限のテンプレートを置いておきます．

```tex
\documentclass[a4paper]{bxjsarticle}  
\usepackage{zxjatype}
\usepackage[ipa]{zxjafont}

\title{タイトルだよ}
\author{著者だよ}
\date{\today}

\begin{document}
\maketitle
\tableofcontents

\section{overleafさんこんにちは}
こんにちはこんにちは！

\end{document}
```

## よくある日本語フォーマット
overleaf上のサンプルを置いておきます．(Read Onlyですが)

- [よくある日本語フォーマット - overleaf](https://www.overleaf.com/read/mkxksbpznsnc)

## 招待リンク
この投稿を読んでoverleafはじめようかなって思った人は下のリンクからログインしてもらえると嬉しいなって．
このリンクから始めると僕にもみなさんにも追加で100MB降って来るので．

- [OverLeaf 招待リンク](https://www.overleaf.com/signup?ref=b92bb05fa923)
WordPress 抜粋と「続きを読む」のカスタマイズ小ネタ

抜粋と「続きを読む」は似てるようだが、テンプレートタグが `the_excerpt()` か `the_content()` かで結果が異なるので注意。

# 抜粋 `the_excerpt()`
https://developer.wordpress.org/reference/functions/the_excerpt/

## the_excerpt() で使われるテキストの優先順位と末尾の処理

1. 投稿作成/編集画面 の抜粋文入力欄の内容
2. ↑がなく、`<!-- more -->`タグがあればその前まで
3. ↑がなければ投稿本文の最初の55個の単語（日本語版の場合は110文字）が使われ、末尾に`[...]`がつく

全てにおいて抜粋のテキストからはHTMLタグと画像が除去される。
なお、`the_excerpt()` そのままでは文末に本文へのリンクが作成されないので注意。

## 抜粋される文字数の変更

### 日本語の場合
**必ず** WP Multibyte Patchの機能を使うこと
http://eastcoder.com/code/wp-multibyte-patch/

`/wp-content/plugins/wp-multibyte-patch/wpmp-config-sample-ja.php` を `/wp-content/wpmp-config.php` にコピーして設定内容を変える

```php:wpmp-config-sample-ja.php
<?php
$wpmp_conf['excerpt_mblength'] = 10;
```

### 日本語以外の場合
「単語数」なので注意

```php:excerpt-length.php
<?php
/**
 * Filter the except length to 20 characters.
 *
 * @param int $length Excerpt length.
 * @return int (Maybe) modified excerpt length.
 */
function wpdocs_custom_excerpt_length( $length ) {
    return 20;
}
add_filter( 'excerpt_length', 'wpdocs_custom_excerpt_length', 999 );
```

## 行末の処理を変える

### 自動抜粋の場合、`[...]` ではなく`...`に変更

```php:wpdocs-excerpt-more.php
<?php
/**
 * Filter the excerpt "read more" string.
 *
 * @param string $more "Read more" excerpt string.
 * @return string (Maybe) modified "read more" excerpt string.
 */
function wpdocs_excerpt_more( $more ) {
    return '...';
}
add_filter( 'excerpt_more', 'wpdocs_excerpt_more' );
```

### 必ず末尾にリンク

[Code Reference](https://developer.wordpress.org/reference/functions/the_excerpt/) で紹介されているコードは自動抜粋の場合の処理なので、必ずなら `get_the_excerpt` フィルターで処理した方がいいかも

```php:get-the-excerpt-add_link.php
<?php
/**
 * Filter the excerpt string link to the post.
 *
 * @param string $post_excerpt The post excerpt.
 * @param WP_Post $post Post object.
 * @return string (Maybe) modified "read more" excerpt string.
 */
function my_get_the_excerpt( $post_excerpt, $post ) {
	$more = sprintf( '<a class="more-link" href="%1$s">%2$s</a>',
		get_permalink( $post->ID ),
		__( 'Read More', 'textdomain' )
	);
	return $post_excerpt . $more;
}
add_filter( 'get_the_excerpt', 'my_get_the_excerpt', 10, 2 );
```

# 続きを読む `the_content()`

https://codex.wordpress.org/Customizing_the_Read_More

アーカイブ系では `<!-- more -->`タグがあればその前まで表示するが、反面、毎回投稿作成時に手動でタグを入れなければならない。

## デフォルトで入るアンカーをなくす

```php:remove-more-link-scroll.php
<?php
function remove_more_link_scroll( $link ) {
	$link = preg_replace( '|#more-[0-9]+|', '', $link );
	return $link;
}
add_filter( 'the_content_more_link', 'remove_more_link_scroll' );
```
WordPress 表示している固定ページが属する最上位〜全ての子孫ページのリストを表示

数が増えるとカスタムメニューで対応しきれないよね。
どうせなら自動で出したいよね。

```php:view-all-family-page-link.php
<?php
// 指定した固定ページが属する先祖・子孫全て表示
// 指定がない場合は表示している固定ページ
function view_all_family_page_link( $post_id = '' ) {

	if ( empty( $post_id ) ) {
		if ( ! is_page() ) {
			return;
		}
		global $post;
		$post_id = $post->ID;
	}

	$ancestor = array_pop( get_post_ancestors( $post_id ) );
	if( ! empty( $ancestor ) ) {
		$parent = $ancestor;
	} else {
		$parent = $post_id;
	}

	$args = array(
		'child_of'     => $parent,
		'echo'         => 0,
		'sort_column'  => 'menu_order, post_title',
		'title_li'     => '', 
	);
	$children = wp_list_pages($args);

	$output = '';
	if ( $children ) {
		$output .=  '<nav id="list_pages-' . $parent . '" class="page-navigation">' . "\n";
		$output .=  "<ul>\n" . $children . "</ul>\n";
		$output .=  "</nav>\n";
	}
	echo $output;
}
```

`wp_list_pages()` に渡すパラメーターを変えれば階層のあるカスタム投稿タイプでも対応可能。

マークアップはお好みで
WordPress 投稿の前後記事へのリンクにアイキャッチ画像を使う

# 見本
![スクリーンショット 2016-07-01 17.47.22.png](https://qiita-image-store.s3.amazonaws.com/0/18348/b5e98ed8-c05c-8ec6-1b55-23de39cacf6a.png)

[AMIMOTO公式サイト](https://ja.amimoto-ami.com/)の投稿で実装してる

# 仕様

- 記事タイトルの背景にアイキャッチ画像を使う。なければテーマで設定した画像
- 画像全体がボタン
- CSSで暗く見えるようにしておいて、マウスホバー時はちょっと明るくする

# ソース

## PHP

[get_adjacent_post()](https://developer.wordpress.org/reference/functions/get_adjacent_post/) は表示している投稿の前後の投稿の情報を取得する関数。
マークアップはお好みで。
画像をインラインスタイルシートで背景にしているのは、レスポンシブなどで当該部分のサイズが変わっても画像のトリミングが同じ見た目になるようにCSSで調整しているから。

```php:my-post-navigation.php
<?php
if ( ! function_exists( 'my_post_navigation' ) ) :
/**
 * Display navigation to next/previous set of posts when applicable.
 */
function my_post_navigation() {

	$post_nav_html = '';
	// ダミー画像用意しておく
	$prev_post_img = get_template_directory_uri() . '/images/dummy.png';
	$next_post_img = get_template_directory_uri() . '/images/dummy.png';

	$prev_post = get_adjacent_post( false, '', true );
	if ( is_a( $prev_post, 'WP_Post' ) ) {
		if ( has_post_thumbnail( $prev_post->ID ) ) {
			$prev_post_img = wp_get_attachment_image_src( get_post_thumbnail_id( $prev_post->ID ), 'large' );
			$prev_post_img = $prev_post_img[0];
		}
		$post_nav_html .= '<div class="nav-previous">' . "\n";
		$post_nav_html .= '<a href="' . get_permalink( $prev_post->ID ) . '" rel="prev" style="background-image:url(' . $prev_post_img . ')"><span class="link-text"><span class="adjacent-text">Previous</span><br>' . get_the_title( $prev_post->ID ) . '</span></a>';
		$post_nav_html .= '</div>' . "\n";
	}

	$next_post = get_adjacent_post( false, '', false );
	if ( is_a( $next_post, 'WP_Post' ) ) {
		if ( has_post_thumbnail( $next_post->ID ) ) {
			$next_post_img = wp_get_attachment_image_src( get_post_thumbnail_id( $next_post->ID ), 'large' );
			$next_post_img = $next_post_img[0];
		}
		$post_nav_html .= '<div class="nav-previous">' . "\n";
		$post_nav_html .= '<a href="' . get_permalink( $next_post->ID ) . '" rel="prev" style="background-image:url(' . $next_post_img . ')"><span class="link-text"><span class="adjacent-text">Next</span><br>' . get_the_title( $next_post->ID ) . '</a></span>';
		$post_nav_html .= '</div>' . "\n";
	}

	if ( ! empty( $post_nav_html ) ) :
?>
	<nav class="navigation post-navigation" role="navigation">
		<h2 class="screen-reader-text"><?php esc_html_e( 'Post navigation', 'mytheme' ); ?></h2>
		<div class="nav-links">
		<?php echo $post_nav_html; ?>
		</div><!-- .links -->
	</nav><!-- .navigation -->
<?php
	endif;
}
endif;
```
`single.php` あたりに `<?php my_post_navigation(); ?>` ッて書いておけばOK。

## css

hover時にopacity変えてるけど、その辺はよしなに。
`background-size: cover` で画像が調整されるようにしてある。

```css:my-post-navigation.css
.post-navigation .nav-previous a,
.post-navigation .nav-next a {
	display: block;
	color: white;
	background: #353c3f;
	background-repeat: no-repeat;
	background-position: center center;
	background-size: cover;
}
.post-navigation .nav-previous a:hover,
.post-navigation .nav-next a:hover {
	opacity: 0.9;
}
.post-navigation .nav-previous .link-text,
.post-navigation .nav-next .link-text {
	padding: 20px;
	display: block;
	rgba(0, 0, 0, 0.5);
}
```
jQuery ページ内リンクと先頭に戻るスムーズスクロール

# 仕様

- ページ内リンク（ハッシュ#）はその位置までスクロール
- Page Topボタンを押すと先頭までスクロール
- Page Topボタンはある程度スクロールしたらふわっと出るようにしたい。

# デモ

https://jsfiddle.net/gatespace/bwqsed6m/

# ソース

CSSとHTMLのマークアップはおこのみで。
jQuery 1.12〜3.x.x でも動くよ。

```html:page-top.html
<div id="page-top"><a href="#_top">Page Top</a></div>
```

`<a href="#">` としていないのは、他のJavaScriptでそのような指定があるときバッティングしないようにするため。


```js:page-scroll.js
(function($){

    /*
     * jQuery page scroll
     */

    var topBtn  = $('#page-top'); // 先頭に戻るボタンの入るDOM
    var topHash = '#_top'; // 先頭に戻るボタンのhrefの中身
    var viewPos = 100; // 先頭に戻るボタンが表示され始める位置

    // jQuery 1.9 以降用のブラウザ判定
    var isHtmlScroll = (function() {
        var html = $('html'),
        top = html.scrollTop();
        var el = $('<div/>').height(10000).prependTo('body');
        html.scrollTop(10000);
        var rs = !!html.scrollTop();
        html.scrollTop(top);
        el.remove();
        return rs;
    })();

    // 先頭に戻るボタンの表示
    $(window).scroll(function () {
        if ($(this).scrollTop() > viewPos ) {
            topBtn.fadeIn();
        } else {
            topBtn.fadeOut();
        }
    });

    $('a[href*=\\#]:not([href=\\#])').click( function() { // スムーズスクロール
        var href = this.hash;
        var $target = $(href == topHash || href == "" ? 'body' : href);
        if ( $target.length > 0 ) {
            var top = $target.offset().top;
            $(isHtmlScroll ? 'html' : 'body').animate({
                scrollTop: top
            }, 'slow', 'swing');
        }
        return false;
    });
})(jQuery);
```
スクロールするとヘッダーがふわっと固定されるパターン

網元公式サイトでも実装してるヘッダーのとこね。
https://ja.amimoto-ami.com/

# 仕様
1. HTMLはワンソース
2. スクロールしたらヘッダーは常に上部に固定

# デモ

https://jsfiddle.net/gatespace/66hhetbr/

# ソース

- JavaScript（jQuery） はスクロール量を判定して対象の DOM に CSS クラスを付与（削除）するだけ
- CSS で `.scrolled` の見た目作っておく
- `.scrolled` 有り・無し間のアニメーションは `transition` 使う

```js:masthead-scroll.js
(function($) {
	$(window).on('load resize', function(){
		// masthead scroll
		var header   = $('#header-nav'); // fixed DOM
		var addclass = 'scrolled'; // add css class
		var offset   = header.offset();
		var scrollY  = offset.top; // scroll
	
		$(window).scroll(function() {
		if ($(window).scrollTop() > scrollY) {
			header.addClass(addclass);
		} else {
			header.removeClass(addclass);
		}
	});
})(jQuery);
```

`.scrolled` の見た目はお好みで。
（デモの方はもうちょっと細かく指定している）

```css:masthead.css

#masthead {
  padding: 15px;
  background: white;
  -webkit-transition: all 0.3s;
     -moz-transition: all 0.3s;
      -ms-transition: all 0.3s;
       -o-transition: all 0.3s;
          transition: all 0.3s;
}

#masthead.scrolled {
  color: white;
  background: rgba(0, 0, 0, 0.8);
  position: fixed;
  top: 0;
  left: 0;
  z-index: 1;
  width: 100%;
}

```

IE9？　知らない子ですね。
（クラスは付与されるので、transitionが無効＝ふわっとならないだけ）
Oracle 12c Enterprise EditionをRHEL7.0にインストールした時のログ


# 必要なユーザの作成

 # groupadd oinstall
 # groupadd dba
 
 # useradd -g oinstall -G dba oracle
 # passwd oracle
 
 
# カーネルパラメータの調整

RHEL7.0をインストールした直後と、Oracle推奨値の比較は以下のとおり。

| カーネル・パラメータ | RHELの初期値 | Oracleの推奨最小値 |
| --- | --- | --- |
| semmsl | 250 | 250 |
| semmns | 32000 | 32000 |
| semopm | 32 | 100 |
| semmni | 128 | 128 |
| shmall | 18446744073692774399 | 物理メモリー・サイズ(ページ数)の40% |
| shmmax | 18446744073692774399 | 物理メモリー・サイズ(ページ数)の50% |
| shmmni | 4096 | 4096 |
| panic_on_oops | 1 | 1 |
| file-max | 382715 | 6815744 |
| ip_local_port_range | 32768	60999 | 9000	65500 |
| rmem_default | 212992 | 262144 |
| rmem_max | 212992 | 4194304 |
| wmem_default | 212992 | 262144 |
| wmem_max | 212992 | 1048576 |
| aio-max-nr | 1048576 | 1048576 |

よって、Oracleの推奨最小値を満たしていない値はRHELの設定を上書きすることで満たすようにする。

```/etc/sysctl.conf
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
```

反映。

```
[root@localhost archinwater]# sysctl -p
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
```

# リソース制限の確認

`Oracle`ユーザでログインして以下を確認する。

| 項目 | 確認方法 | リソース | RHELの初期値(KB) | Oracleの推奨値(KB) |
| --- | --- | --- | --- | --- |
| オープン・ファイル記述子数(ソフト制限) | $ ulimit -Sn | nofile | 1024 | 1024 | 
| オープン・ファイル記述子数(ハード制限) | $ ulimit -Hn | nofile | 4096 | 65536 | 
| 単一ユーザが使用可能なプロセス数(ソフト制限) | $ ulimit -Su | nproc | 4096 | 2047 |
| 単一ユーザが使用可能なプロセス数(ハード制限) | $ ulimit -Hu | nproc | 15048 | 16384 |
| プロセスのスタック・セグメントのサイズ(ソフト制限) | $ ulimit -Ss | stack | 8192 | 10240 | 
| プロセスのスタック・セグメントのサイズ(ハード制限) | $ ulimit -Hs | stack | unlimited | 10240以上、32768以下 | 

これも設定ファイルを書き直し。

```/etc/security/limits.conf
<domain>		 <type>		<item>			  <value>
oracle           hard    nofile          65536
oracle           hard    nproc           16384
oracle           soft    stack           10240
```

# Oracleベース・ディレクトリの作成

 # mkdir -p /home/oracle_base_dir
 # chown -R oracle:oinstall /home/oracle_base_dir
 # chmod -R 775 /home/oracle_base_dir
 
# 必要なパッケージのインストール

Oracle DBで必要なパッケージをインストールしておく。

 # subscription-manager repos --enable rhel-7-server-optional-rpms
 # yum install ksh compat-libstdc++-33 libaio-devel compat-libcap1

# インストール

* カーネルパラメータ系でwarningが発生するが、無視してOK
* インストールの途中で、2本ほどroot権限でShell Scriptを実行しろと出るので、指示に従う
* インストーラが文字化けしたので、

```
$ ./runInstaller -jreloc /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.91-1.b14.el7_2.x86_64/jre/
```

みたいなことをして回避

# Enterprise Managerの設定

インストール直後に https://localhost:5500/em/ にアクセスすると、証明書関連のエラーが出て接続出来ない。デフォルトでHTTP用にポートが割り当てられていないので、SQL*Plus経由でポートを設定してやり、HTTPで接続するようにすればよい。

```
oracle$ sqlplus / as sysdba;

SQL> exec DBMS_XDB_CONFIG.SETHTTPPORT(5503);

PL/SQLプロシージャが正常に完了しました。
```
htaccessで特定のIPだけ許可



…しょうもないけど毎回調べているので備忘録

```

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !=/maintenance.html
RewriteCond %{REMOTE_ADDR} !=#{IPアドレス}
RewriteRule ^.*$ - [R=503,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>


```
プログラミング教室で iOS アプリの作り方を説明しました. その3

[前回](http://qiita.com/mironal/items/6577263b28546e706a89)

---

## 概要

今回は iOS アプリケーションのライフサイクルの説明をしました。

普通に新入社員研修でやるような内容だと思います。

諸事情により、生徒は実質１人でしたのでほぼマンツーマンでした。

## やること

### Cocoapods の使い方

- インストール
  - gem install cocoapods
  - pod setup
  - Pod init
  - Podfile を編集して
  - pod install
  - xcworkspace の方を開く
- Alamofire を入れてみる (HTTP ライブラリ)
  - https://github.com/Alamofire/Alamofire
- json API を叩いてみる
- cocoapods ライブラリの探し方
  - https://cocoapods.org/ で検索する

### iOS アプリケーションのライフサイクル

- AppDeleagte
  - AppDelegate とは？
  - ライフサイクル
- UIViewController
  - UIViewController とは？
  - ライフサイクル

### 自分で調べる方法

`[UIViewController ライフサイクル]` とかでググると色々出てくるので自分で調べられる。

- http://qiita.com/kayo_h/items/4710c4ac02a191652a96
- http://qiita.com/Uejun/items/6055aca59a370200609a


## 進め方(1.5時間)

### Cocoapods の使い方

- `pod setup` がなぜか終わらず悲しい...
- 何時まで待っても終わらないので Cocoapods の使い方をざっくりと説明して終わりにしました
- 適当な API を叩いて Json を取得する処理を書こうと思ったのですが止めました

### iOS アプリケーションのライフサイクル

AppDelegate のライフサイクルを知るためにそれぞれのメソッドにブレークポイントを貼ってアプリを起動したり、ホームボタンを押したりしてどのメソッドが呼ばれるのか確認しました。

その後、 それぞれどんなときにどんな処理をするために使用するのかをざっくりと説明しました。

次に UIViewController のライフサイクルを説明しました。

AppDelegate の時と同様にそれぞれのメソッドにブレークポイントを貼っていつどんなメソッドが呼ばれるのかを確認しました。

次に `viewDidLoad` でラベルやボタンを追加する処理を書いて動作を確かめました。

### 画面遷移

若干時間が余ったので別の ViewController に遷移する処理を書きました。

iOS では画面遷移には大きくモーダルとプッシュの2種類があるのでそれぞれどのように動作するのかを確認しました。

最初はモーダルの表示を行いました。

次にプッシュの動作を確認しました。

Xcode が生成する Single View Application は NavigationController が最初は追加されていないので StoryBoard で NavigationController を追加した後に遷移が行われることを確認しました。

これらの遷移はコードで行って確認しましたがその後、コードを消し同じことを StoryBoard でやる方法を確認しました。

これらの画面遷移について説明して時間が来たので終了です。

## まとめ

Xcode のバージョンが古かったため作業が行えない状態になった生徒がいたため、暇にさせてしまいましたのが反省点です(悲しいことに OS のアップデートが始まった...)。

ライフサイクルの説明もただダラダラと説明するのではなくもっと実際にアプリを作りながら説明したほうが良かったと後で思いました。

別に機会にサンプルプログラムを用意してそれを動かしたり改造したりという感じで進められたらいいのかなと思います。
skflowでMNIST（DCNN）

# skflowでMNIST

## skflowとは

TensorFlowをScikit Learnのように簡単に使うためのインターフェース
~~TensorFlowに含まれている（[TF Learn](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/learn/python/learn)）~~
TensorFlow0.9から独立して、書き方も以下の古いものより書きやすくなっている（[TFLearn](http://tflearn.org/#quick-overview)）

## 実行環境

EC2（AWS）のg2.2xlargeインスタンス（オレゴン = 米国西部）
Python 2.7.6
TensorFlow 0.8.0
scipy 0.17.1（scikit-learnに必要）
scikit-learn 0.17.1

AWSのインスタンスは他人のAMIを使って初期化したが、自分で導入したい場合は以下を参考

[EC2のGPU instanceでTensorFlow動かすのにもうソースからのビルドは必要ないっぽい？](http://memo.sugyan.com/entry/2016/06/25/013155)

## ソースコード

今回、DCNN（Deep Convolutional Neural Network）で複雑なネットワークを組む際の参考にするためにやってみたので、パラメーターは適当だし、あまりMNIST用ではないと思う

```python:mnist.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from sklearn import metrics
import tensorflow as tf
from tensorflow.contrib import learn as skflow
from tensorflow.contrib.learn.python.learn.datasets import mnist as source

mnist = source.load_mnist()

def max_pool_2x2(tensor_in):
    return tf.nn.max_pool(tensor_in, ksize = [1, 2, 2, 1], strides = [1, 2, 2, 1], padding = 'SAME')

def my_model(X, y):
    X = tf.reshape(X, [-1, 28, 28, 1])

    with tf.variable_scope('layer1'):
        with tf.variable_scope('conv1'):
            h_conv1 = skflow.ops.conv2d(X, n_filters = 16, filter_shape = [3, 3], bias = True, activation = tf.nn.relu)
        with tf.variable_scope('conv2'):
            h_conv2 = skflow.ops.conv2d(h_conv1, n_filters = 32, filter_shape = [3, 3], bias = True, activation = tf.nn.relu)
            h_pool1 = max_pool_2x2(h_conv2)

    with tf.variable_scope('layer2'):
        with tf.variable_scope('conv3'):
            h_conv3 = skflow.ops.conv2d(h_pool1, n_filters = 64, filter_shape = [3, 3], bias = True, activation = tf.nn.relu)
        with tf.variable_scope('conv4'):
            h_conv4 = skflow.ops.conv2d(h_conv3, n_filters = 128, filter_shape = [3, 3], bias = True, activation = tf.nn.relu)
            h_pool2 = max_pool_2x2(h_conv4)
            h_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 128])

    h_fc = skflow.ops.dnn(h_flat, [1024, 1024], activation = tf.nn.relu, dropout = 0.5)
    return skflow.models.logistic_regression(h_fc, y)

classifier = skflow.TensorFlowEstimator(model_fn = my_model, n_classes = 10, batch_size = 100, steps = 20000, learning_rate = 0.001, optimizer = 'Adam')
classifier.fit(mnist.train.images, mnist.train.labels)
score = metrics.accuracy_score(mnist.test.labels, classifier.predict(mnist.test.images))
print('Accuracy: {0:f}'.format(score))
```

## 参考にしたページ

[skflow - mnist.py](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/skflow/mnist.py)
[Introduction to Scikit Flow](http://terrytangyuan.github.io/2016/03/14/scikit-flow-intro/)
[TensorFlow Python reference documentation](https://www.tensorflow.org/api_docs/python/index.html)
mkdirしてcdするshell関数

オプションをmkdirに渡したいなと思ったので、shell関数の勉強を兼ねて作成してみました。`.bashrc`等に書き込めば動きます

```sh
mkcd () {
  exec 3>&1

  cd "`
  if mkdir "$@" 1>&3; then
      while [ $# -gt 0 ]
      do
          case "$1" in
              -- ) printf '%s' "$2"; exit 0;;
              -* ) shift;;
              * ) printf '%s' "$1"; exit 0;;
          esac
      done
      printf '.'
      exit 0
  else
      printf '.'
      exit 1
  fi
  `"

  exec 3>&-
}
```

**やりたかったこと**

-   実行時にオプションを指定できる
-   なるたけPOSIXの範囲内
-   変数で環境を汚染しない

**使用例**

```sh
$ mkcd d
$ mkcd -vp p/c
$ mkcd d -- -v  # GNU
$ mkcd d -v     # BSD
```

**参考文献**

-   <http://qiita.com/akokubu/items/d577d0d8ccc6464286c1>
-   <http://qiita.com/richmikan@github/items/bd4b21cf1fe503ab2e5c>
-   <http://pubs.opengroup.org/onlinepubs/009604599/utilities/exec.html>
-   <http://www.in-ulm.de/~mascheck/various/cmd-subst/>
オフラインリアルタイムどう書くE05 Ruby で解く

問題はこちら

http://qiita.com/Nabetani/items/c516875b13a4d282affe

```rb
require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'

  gem 'activesupport', require: 'active_support/all'

  gem 'minitest', require: 'minitest/autorun'
  gem 'minitest-reporters'

  gem 'awesome_print'
  gem 'tapp'

  gem 'pry'
  gem 'pry-rescue', require: 'pry-rescue/minitest'
  gem 'pry-stack_explorer'
end

MAP = {
  1 => {
    A: %i(A B),
    B: %i(B C),
    C: %i(C),
  },
  2 => {
    A: %i(A C),
    B: %i(B),
    C: %i(B C),
  },
  3 => {
    A: %i(A C),
    B: %i(A B),
    C: %i(C),
  },
  4 => {
    A: %i(A),
    B: %i(A B),
    C: %i(B C),
  },
  5 => {
    A: %i(A),
    B: %i(B C),
    C: %i(A C),
  },
  6 => {
    A: %i(A B),
    B: %i(B),
    C: %i(A C),
  },
  7 => {
    A: %i(A),
    B: %i(),
    C: %i(C),
  },
  8 => {
    A: %i(),
    B: %i(B),
    C: %i(C),
  },
  9 => {
    A: %i(A),
    B: %i(B),
    C: %i(),
  },
}

def solve(input)
  input.reverse.each_char.reduce(%i(A B C)) {|ok, c|
    MAP[c.to_i].select {|k, vs| vs.any? {|v| ok.include?(v) } }.keys
  }.join.downcase.presence || ?-
end

TEST_DATA = <<~EOS
/*0*/ test( "1728398", "bc" );
/*1*/ test( "789", "-" );
/*2*/ test( "274", "ac" );
/*3*/ test( "185", "abc" );
/*4*/ test( "396", "ab" );
/*5*/ test( "1278", "abc" );
/*6*/ test( "7659832", "a" );
/*7*/ test( "178", "bc" );
/*8*/ test( "189", "ab" );
/*9*/ test( "197", "a" );
/*10*/ test( "278", "ac" );
/*11*/ test( "289", "bc" );
/*12*/ test( "297", "a" );
/*13*/ test( "378", "ac" );
/*14*/ test( "389", "b" );
/*15*/ test( "397", "ab" );
/*16*/ test( "478", "c" );
/*17*/ test( "489", "bc" );
/*18*/ test( "497", "ab" );
/*19*/ test( "578", "bc" );
/*20*/ test( "589", "b" );
/*21*/ test( "597", "ac" );
/*22*/ test( "678", "c" );
/*23*/ test( "689", "ab" );
/*24*/ test( "697", "ac" );
/*25*/ test( "899", "b" );
/*26*/ test( "7172", "ac" );
/*27*/ test( "54787", "bc" );
/*28*/ test( "83713", "bc" );
/*29*/ test( "149978", "-" );
/*30*/ test( "159735", "abc" );
/*31*/ test( "1449467", "abc" );
/*32*/ test( "9862916", "b" );
/*33*/ test( "96112873", "ab" );
/*34*/ test( "311536789", "-" );
/*35*/ test( "281787212994", "abc" );
/*36*/ test( "697535114542", "ac" );
EOS

Minitest::Reporters.use!(Minitest::Reporters::ProgressReporter.new)

describe 'Doukaku' do
  TEST_DATA.each_line do |test|
    input, expected = test.scan(/"(.*)", "(.*)"/)[0]

    it input do
      assert_equal expected, solve(input)
    end
  end
end
```

25 分くらいで終わって時間があまったので `MAP` のところがなんとかできないかやっていたがビミョー。

4..6 は 1..3 までのものの線対称になっていることに気づいたくらいで、他の法則性はわからず...

```rb
MAP = Hash.new do |hash, key|
  tracks = (:A..:C).map {|c| [c, [c]] }.to_h

  case key
  when 1
    tracks[:A] << :B
    tracks[:B] << :C
  when 2
    tracks[:A] << :C
    tracks[:C] << :B
  when 3
    tracks[:A] << :C
    tracks[:B] << :A
  when 4..6
    tracks = tracks.keys.map {|k| [k, MAP[key - 3].select {|_, v| v.include?(k) }.keys] }.to_h
  when 7
    tracks[:B] = []
  when 8
    tracks[:A] = []
  when 9
    tracks[:C] = []
  end

  tracks
end
```