OmniAICreator/Qiita-1.07M huggingface dataset:
RealmファイルをwatchOSにfileTransferしたときの実機で生じるエラーと解決方法

#はじめに
RealmファイルをiOSからwatchOSにfileTransferで送信しようとしたときに、実機ランで`make_dir() failed: Operation not permitted`というエラーが生じました。この解決方法について備忘のためにメモを残します。

#現象
実機ランすると、iOSがwatchOSにRealmファイルをfileTransferしたときに、`default.realm.management': make_dir() failed: Operation not permitted`というエラーが生じました。シミュレータでランしたときには、このエラーが発生しません。

Realm Swift 2.4.4、Xcode 8.2、iOS10.2.1、watchOS 3.1.1、シミュレータ(iOS/Watch)Version 10.0(SimulatorApp-236.7)という環境でした。

#原因
watchOSがRealmファイルを受け取った後、そのファイルは読取り専用領域に保持されます。一方、Realmは管理のためにその領域に書き込みをしようとします。ここで権限がない操作が行われようとしたため、`Operation not permitted`というエラーが発生していました。

このエラーがAppleWatch実機のみで発生し、一方でシミュレータで発生しないのは、シミュレータが書込み権限の動作を完全にシミュレートできていないためだと考えられます。

プログラマが意図してwatchOS側のRealmファイルを変更しようとしなくても、Realm自体が書込みをしようとするので、この挙動は意識しておく必要があります。

#解決
エラーが出てしまう従来のコードは、こちらです。読み取り専用領域にファイルが作られるので、Realmが管理用に編集しようとしたときにエラーが発生します。

```swift:before
// When the file was received
    func session(_ session: WCSession, didReceive file: WCSessionFile) {
        
        //set the recieved file to default Realm file
        var config = Realm.Configuration()
        config.fileURL = file.fileURL
        Realm.Configuration.defaultConfiguration = config
        
        // display the first of realm objects
        let realm = try! Realm()
        if let firstField = realm.objects(Field.self).first{
            realmLabel.setText(firstField.text)
        }
    }
```

解決のために、受信したファイルをそのまま利用するのではなく、そのコピーを書込み権限のあるdocumentDirectory配下に作り、そのパスを使うことにします。

加えて、同名のファイルがあるとFileManagerの重複ファイルエラーが発生してしまうので、その対応が必要になります。今回は、既存ファイルがあればそれを削除した後で、コピーするように実装します。

具体的には次のようなコードになります。

```swift:after
// When the file was received
    func session(_ session: WCSession, didReceive file: WCSessionFile) {
        
        //set the recieved file to default Realm file
        var config = Realm.Configuration()
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let documentsDirectory = paths[0]
        let realmURL = documentsDirectory.appendingPathComponent("data.realm")
        if FileManager.default.fileExists(atPath: realmURL.path){
            try! FileManager.default.removeItem(at: realmURL)
        }
        try! FileManager.default.copyItem(at: file.fileURL, to: realmURL)
        config.fileURL = realmURL
        Realm.Configuration.defaultConfiguration = config
        
        // display the first of realm objects
        let realm = try! Realm()
        if let firstField = realm.objects(Field.self).first{
            realmLabel.setText(firstField.text)
        }
    }
```

これで解決できました。

なお、FileManager.default.fileExists(atPath:)の引数には、realmURL.pathを代入します。引数がString型ですが、.absoluteStringや.relativeStringではありません。

#参考リンク
今回のソースファイルは全部こちらのリポジトリで公開しています。
[SampleRealmOnWatchOS3](https://github.com/hsylife/SampleRealmOnWatchOS3)

基本的にこちらのコードの考え方を参考にしています。ただし、既存ファイルがあると重複エラーが発生するので、今回はその対応を加えて実装しました。
[Apple WatchにRealmのデータを転送できない](http://ja.stackoverflow.com/questions/31655/apple-watchにrealmのデータを転送できない/31678)
Objective-CのHeaderでSwiftのenumを使う

Objective-Cの`.h`ファイルでSwiftのenumを使いたいと思ってググったら、この記事をみつけた。
[How to reference Swift enum in Objective\-C Header \- Stack Overflow](http://stackoverflow.com/questions/33487850/how-to-reference-swift-enum-in-objective-c-header)

- **質問**  
classだったら `@class className;` って書けるんだけど。enumではどうするんだ？
- **わかってない人**  
`#include "<ProjectName>-Swift.h"` って書いたらいいんやで  
 ※ *`.h`ファイルに書いたらエラー出る*
- **１番ましな回答**  
`.m`ファイルに privateプロパティとして書くのはできるで。


privateプロパティとして書けたところで`.m`ファイルからしかアクセスできなくて役に立たないので、ええ感じにしてみた。

```swift
@objc enum SwiftEnumState: Int {
    case foo = 0
    case bar
    case baz
}
```

Swift側のenum宣言は普通。Objective-Cで使いたいから`@objc`付けて、Int型にしておく。

```objc
@interface ObjCClass : NSObject

@property (assign, nonatomic) NSInteger __rawValueOfSwiftEnumState__;

@end
```

Objective-Cの`.h`ファイルに、プロパティとして、enumのrawValueを設定。直接アクセスすんな的な名前をつけとく

```swift
extension ObjCClass {

    var swiftEnumState: SwiftEnumState {
        get {
            return SwiftEnumState(rawValue:__rawValueOfSwiftEnumState__) ?? .foo
        }
        set {
            __rawValueOfSwiftEnumState__ = newValue.rawValue
        }
    }
}
```

Swift側にextensionでComputedプロパティとして、enumでアクセスできるようにラッパーを用意すると、

```objc
@interface ObjCClass (SWIFT_EXTENSION(ProjectName))

@property (nonatomic) enum SwiftEnumState swiftEnumState;

@end
```

`<ProjectName>-Swift.h` に、このように変換されるので、
privateじゃないプロパティとしてenumを使えるようになりました。

あぁ、リファクタリングして全部Swiftに書き換えたい。
PHP Warning:  Unknown: Unable to clear session lock record in

# HTTPのセッションをmemcachedでメモリ管理したいのだが・・・

### 環境
- Apache 2.4.23
- php 7.0.13
- memcached 1.4.33 (ElastiCache)

### 症状
sessionへのアクセス時にエラーになり、$_SESSIONが使えない

`session.lazy_write = Off`
を設定すると少し動作が改善されて数回に１回の割合で$_SESSIONへのアクセスがエラーになる。

`memcached.sess_lock_wait_min = 250`
を設定すると、さらに安定するが、数十回に１回ぐらいの割合で$_SESSIONへのアクセスがエラーになる。

# workaround

memcached をやめて、redis に変更（php？のバージョンアップで改善されると思われるので・・・）。
https://pecl.php.net/package/redis/3.1.1 このあたりからモジュールをインストール

`[Session]
session.save_handler = redis
session.save_path = "aws-XXXXX-XXXXX.XXXXX.XXXXX.cache.amazonaws.com:6379"`

この設定だけで、動作確認OK。

AWSなので、memcached/redisどちらを使ってもコストは一緒。
最終的に、redisのクラスタ構成で安定稼働を目指します。

![2017-03-19 17_46_04-phpinfo().png](https://qiita-image-store.s3.amazonaws.com/0/163916/8ac95e09-b697-e827-9c4d-6e155b465e82.png)

参考：
https://github.com/magento/magento2/issues/5319
https://forums.aws.amazon.com/thread.jspa?threadID=240538
米軍式AAR (After Action Review) は使えるか？

After Action Review (AAR) は、第二次世界大戦当時の米軍で、企画段階で時間をかけてきっちり作戦を作り上げるよりも、大まかな作戦で小まめにレビューを繰り返しながら戦う部隊の生存率が高かったことに教訓を得て広まった手法です。現在では軍隊に限らず、幅広く活用されています。

実は筆者も実際にやったことはないのですが（機会がなくて。。。）、よさそうなので取り上げてみました。機会があればやってみたいと思います。

#AARの４ステップ

AARの段取りについては、必ずしもきっちりと統一された方法論があるわけではないらしく、いろいろな流派があるようですが、大まかに言って以下の4ステップで、あとは現場の実情に応じてアレンジしていけばいいようです。

__ステップ1 計画__
計画は、常日頃から用意しておくものです。段取りや報告様式などを取り決めておくことになりますが、ここで重要なのはファシリテーター（司会者）の選任です。主ファシリテーターの休暇、病気、逃亡などに備えて、副ファシリテーターも決めておくとよいでしょう。

__ステップ2 準備__
障害対応、重要な商談、デスマーチ、戦闘などのアクションが行われている間、ファシリテーターはAARの開催に備えて準備をします。アクションの時系列や、重要な会議や指示などを記録し、いつでも取り出せるように準備します。作業手順書などの重要書類も確保しましょう。現場の写真を撮ることも有効かもしれません。

アクションが行われている間、ファシリテーターはこの準備作業を行います。人手の足りない最中にあって、貴重な人材一名をAAR準備に張り付けるのは簡単ではないかもしれませんが、そこは現場のリーダーが決断して下さい。

__ステップ3 開催__
アクションが終わったら、メンバーが状況を忘れないうちにAARを開催します。短時間でいいので、すぐやりましょう。ファシリテーターさん、出番です！段取りとしては、以下の内容を、この順序で進めていきます。

__1. そもそも我々何をしようとしていたのか？__
__2. 実際には何が起きたのか？__
__3. なぜそうなったのか？__
__4. 次があるとしたら、どのように改善するか？__

YouTubeに載っている米軍の教材などを参考にして、雰囲気を掴むのがよさそうです。

__ステップ4 フォローアップ__
AARの内容をファシリテーターが報告書にまとめます。関係者に回付したり、長期保存してKYTの教材として活用したりするとよいでしょう。

#Q&A

__Q. 最後に全員で、<font color=red>ゼロ災でいこうヨシ！</font>とか掛け声をかけるの？__

A. 4ラウンドKYTをやっていると、やりたくなりますよね！その掛け声。しかし、ここで思い出すべきは、AARが戦場で生まれた手法だということです。

ゼロ災というスローガンは、普段は「災」がない状態であって、定常的な業務を日々積み重ねていくような現場では機能します。しかし、軍隊が出動するのは既に「災」な現場ですし、敵がいるのですから、予定通りに行動できないのが当たり前です。そもそも前提からして災であって、ゼロ災ではないのです。

情報システムの開発や運用にあてはめるなら、普段の定常的な業務でヒューマンエラーを防止するには、4ラウンドKYTが有効だと思います。「ゼロ災でいこうヨシ！」もいいでしょう。しかし、デスマーチになった場合やシステム障害が起きた場合の対応を事後にレビューするのはAARです。「ゼロ災でいこうヨシ！」はありません。

そんなところでしょうか。

__Q. 要は、なぜなぜ分析をやれということ？__

A. AARで意外に重要なのが、 「そもそも我々は何をしようとしていたのか？」という最初の設問です。そんなの分かり切っていると思っても、自分の頭で整理して口に出すことが重要ですので、省略せず必ず行ってください。この点は、日本で広く行われているトヨタ式なぜなぜ分析と大きく違うところだと思います。

#参考文献

AFTER-ACTION REVIEW TECHNICAL GUIDANCE
米国国際開発庁
http://pdf.usaid.gov/pdf_docs/PNADF360.pdf

After Action Review (Pause and Learn)
NASA
https://km.nasa.gov/wp-content/uploads/sites/3/2015/11/After-Action-Review.pdf

How to Conduct an AAR
US Army ROTC Curriculum
https://www.youtube.com/watch?v=tM_3mWtjyFg&t=555s
AuthenticationType というプロパティについて

AuthenticationType というプロパティについて

本当はOwinのAuthenticationTypeについて調べていたが、ほかにもいろいろあることが分かった。
そのメモ。

## ①IAuthenticationModule.AuthenticationType プロパティ
名前空間：　System.Net
　
　認証モジュールが提供する認証の種類を示す文字列。
　AuthenticationType プロパティは、認証モジュールによって実装される認証の種類を識別します。
　AuthenticationType プロパティは、認証モジュールが登録されているかどうかを判断するために AuthenticationManager.Register メソッドで使用し、登録された認証モジュールを削除するために AuthenticationManager.Unregister メソッドで使用します。

## ②IIdentity.AuthenticationType プロパティ
名前空間：　System.Security.Principal

　ユーザーを識別するために使用する認証の種類
　認証の種類は、オペレーティング システムまたは別の認証プロバイダーによって、共通言語ランタイムに渡されます。 
　基本認証、NTLM、Kerberos、および Passport は、認証の種類の例を示します。

## ③AuthenticationOptions.AuthenticationTypeプロパティ
名前空間：　Microsoft.Owin.Security 

　オプションのAuthenticationTypeは、IIdentity AuthenticationTypeプロパティに対応します。
　パイプラインで同じ認証ミドルウェアタイプを複数回使用するために、異なる値を割り当てることができます。

### ②と③は関連がありそう。
OWINの認証モードに関する疑問

OWINの認証モードに関する疑問

　AuthenticationMode

って何？
日本語に訳すと「認証モード」であるが、この設定には２つある
一つめは「Active」
もう一つは「Passive」

https://msdn.microsoft.com/en-us/library/microsoft.owin.security.authenticationmode(v=vs.113).aspx

で再度確認する。

##AuthenticationMode列挙型
###アクティブ：アクティブモードでは、認証ミドルウェアは要求が到着するとユーザーIDを変更し、応答が離れるとプレーン401も変更します。
###受動的：パッシブモードでは、認証ミドルウェアは尋ねられたときにのみユーザーIDを提供し、余分なチャレンジデータで指定された認証タイプが401の応答のみを変更します。

とか。。。
うーん。よくわからん。

AuthenticationOptionsは、「AuthenticationOptions」抽象クラスでプロパティとして定義されていて、デフォルトは「Active」らしい。

ここに記事があった。
　https://long2know.com/2015/06/owin-authentication-modes/

Activeの場合の部分の記事を日本語に訳してみる（っていってもGoogleで）

「OWINが401応答を検出し、AuthenticationModeが "Active"の場合、要求からのURLハッシュは取得されません。
URLハッシュを利用するSPAのようなアプリケーションを作成する場合、クライアント/ブラウザでハッシュを利用するページにリンク/ブックマークすることができないため、問題が発生します。
これは、OWINがAuthenticaitonModeが "Active"で設定されたAuthenticationTypeが定義されている場合、OWINは完全にログインするプロセスを引き継ぐからです。
もう1つの選択肢は、OWINが401応答を傍受しようとしていないことを意味する "Passive" AuthenticationModeを有効にすることです。パッシブモードでは、
OWIN認証フローを開始するためにアプリケーションで明示的にチャレンジを発行する必要があります」

今度はPassive（受動的）の説明

「もう1つの選択肢は、OWINが401応答を傍受しようとしていないことを意味する "Passive" AuthenticationModeを有効にすることです。
パッシブモードでは、OWIN認証フローを開始するためにアプリケーションで明示的にチャレンジを発行する必要があります。」

という訳なんで、

「アクティブモードは簡単ですが、最初はMVCコントローラにリダイレクトするために外部プロバイダでパッシブモードを使用する必要があります。
このコントローラは、URL内のハッシュフラグメントを検出し、ハッシュをクエリパラメータとして別のMVCコントローラアクションにリダイレクトするJavaScriptを含むビューを返します。
最後のリダイレクトでは、OWINチャレンジが発行されます。」

とか。

ようはActiveは自動で処理するけど、Passiveは処理をしていしてやらないとだめよ、ってことか。
もう少し調べたらまた追記します。
RaspberryPiでNHKラジオ(らじる★らじる録音編

# はじめに

ネットラジオを録音できる環境を構築します

- rtmpdump: ストリーミングを取得するためのツール
- ffmpeg: 取得したファイルをmp3に変換するのに使用する
- らじ録音用スクリプト: 色々で回ってるので利用しちゃう

# 開発環境とgitが入っていない人のために…

以下をインストール

- build-essential
- autoconf
- libtool
- git

gcc等開発環境をインストール

```shell-session:開発環境インストール
raspberry$ sudo apt-get install build-essential
```

libfdk-aacを作成するのに必要なので、autoconfとlibtoolをインストール

```shell-session:環境構築
raspberry$ sudo apt-get install autoconf libtool
```

gitのインストール

```shell-session:gitインストール
raspberry$ sudo apt-get install git
```

最低限のConfigくらいしておけってことで…

```shell-session:gitのconfig
raspberry$ git config --global user.name "Your Name"
raspberry$ git config --global user.email "Your@mailaddressmail.com"
```

# 録音環境の構築

## rtmpdumpのインストール

apt-getでインストールするだけ…

```shell-session:rtmpdumpのインストール
raspberry$ sudo atp-get install rtmpdump
```

## ffmpegのインストール

ちょいと面倒です…
rasbianでは、apt-getでffmpegはインストール出来ないっぽいので、ソースからビルドすることにします
m4aのままmp3化しなければ必要のないツールです

### 追加codecを準備

- lame: mp3エンコーダー
- fdk-aac: AACエンコーダー

lameはライブラリだけインストールで、apt-getで可能

```shell-session:mp3lameのインストール
raspbeerry$ sudo apt-get install libmp3lame-dev
```

fdk-aacは、Soueceから構築なので、まずはSourceを持ってくる
(別にGITコマンドでなくても良いが…)

```shell-session:fdk-aacの取得
raspberry$ git clone https://github.com/mstorsjo/fdk-aac.git
```

そして、ビルドとインストール

```shell-session:fdk-aacの構築・インストール
raspberry$ ./autogen.sh
raspberry$ ./configure
raspberry$ make
raspberry$ sudo make install 
```

共有ライブラリの依存関係情報を更新します

```shell-session:ライブラリ依存関係更新
raspberry$ sudo /sbin/ldconfig
```

### ffmoegのビルドとインストール

gitでリポジトリをクローンします

```shell-session:ffmpegの取得
raspberry$ git clone https://github.com/FFmpeg/FFmpeg.git
```

配下に移動…

```shell-session:ffmpegの構築・インストール
raspberry$ ./configure --prefix=/usr/local --enable-libmp3lame  -enable-libfdk-aac
raspberry$ make
raspberry$ sudo make install
```

60分位かかる…
configureをきちんと指定し必要な機能のみでコンパイルすればもっと速いとは思います

```shell-session:configureのhelp
raspberry$ ./configure --help
```

でオプションを確認できるのでよきに計らってください…

コーデックの確認

```shell-session:ffmpeg確認
raspberry$ ffmpeg -fomarts
raspberry$ ffmpeg -codecs
```

## 録音用スクリプト

自作しても良いが、優れたスクリプトがあるので利用してしまいます

https://gist.github.com/matchy2/f03205246e1a12b3b027

を使わせ頂きました…

# cronに設定

NHKの基礎英語を例に

```shell-session:crontab
00 06 * * 1,2,3,4,5 ~/bin/rec_nhk.sh NHK2 15 /home/hoge/rec 基礎英語1 1> /dev/null 2> /dev/null
15 06 * * 1,2,3,4,5 ~/bin/rec_nhk.sh NHK2 15 /home/hoge/rec 基礎英語2 1> /dev/null 2> /dev/null
30 06 * * 1,2,3,4,5 ~/bin/rec_nhk.sh NHK2 15 /home/hoge/rec 基礎英語3 1> /dev/null 2> /dev/null
```

なんだけど：

- 連続録音出来るか?
- 録音しながらのmp3変換が可能か?

とか色々テストが必要そうですね…

連続録音は可能でした…
でも、録音しながらのmp3変換はSDカードのI/O負荷を考えて、スクリプトを書き換えて録音とmp3エンコードを分離しました…

# おわりに

これで、NKHネットラジオを録音できる環境が出来たので、今後はWebアプリでも作るつもりです…
pyautoguiでクリックマクロが作りたい（展望）

ちょっと待って！
関数多すぎるやん！

``` jidou.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import pyautogui as pg
import time as ti
import random as rm

grapath="bpic/"


def clicker(x,y):
	if x != None and y != None:
		pg.click(x,y,button="left",duration=0.5)
	else:
		print("nooo")

def clicktimerand():
	time=rm.randint(1,5)
	return time

def syutuxy():
	x,y=pg.locateCenterOnScreen(grapath+"syutu.png")
	return x,y

def syuturand(x,y):
	rx=rm.randint(-39,21)
	ry=rm.randint(-39,26)
	x=x+rx
	y=y+ry
	return x,y

def hokyuxy():
	x,y=pg.locateCenterOnScreen(grapath+"hokyu.png")
	return x,y

def hokyurand(x,y):
	rx=rm.randint(-27,27)
	ry=rm.randint(-30,30)
	x=x+rx
	y=y+ry
	return x,y

def honxy():
	x,y=pg.locateCenterOnScreen(grapath+"hon.png")
	return x,y

def honrand(x,y):
	rx=rm.randint(-7,7)
	ry=rm.randint(-8,8)
	x=x+rx
	y=y+ry
	return x,y

def endxy():
	x,y=pg.locateCenterOnScreen(grapath+"end.png")
	return x,y

def endrand(x,y):
	rx=rm.randint(-7,7)
	ry=rm.randint(-8,8)
	x=x+rx
	y=y+ry
	return x,y

###StartUp#################################
ti.sleep(1)
pg.FAILSAFE=True #move to left over

###Schedule#################################
syutub=syutuxy()
hokyux,hokyuy=hokyuxy()

hokyurx,hokyury=hokyurand(hokyux,hokyuy)
clicker(hokyurx,hokyury)

ti.sleep(2) #loading = Black out

honx,hony=honxy()
honrx,honry=honrand(honx,hony)
ti.sleep(clicktimerand())
clicker(honrx,honry)

print("Di endou")
```

ほげー:alien:
とりあえず各ボタンの中心座標、とそれらのランダム座標を生成する関数を作ったらこんなに…
ていうか勢いで作ってるから変数の名前もややこしくなってきてるし…
<br>
・今回の引っかかりポイント
画像探しが早すぎてloding中に探してた　→sleepでおやすみ
帰ってきた時は若干フィルターかかっててsyutuが認識できないっぽい
<br>
・展望
変数は減らす　→関数の引数を減らす
クリックの長さもランダムに
しっかりフローチャート書いてスケジューリングしないと滅茶苦茶になってしまう
全部の画像探してないで、初期画面で一箇所取って、そこから相対座標で…ゴニョゴニョ
week_fieldとmonth_fieldの値をARのdate型カラムで受け取る方法

HTML5からINPUTタグに week と month 型が加わりました。これが使われているのを見たことがないのですが Rails ではちゃんと対応する week_field と month_field が用意されています。ということはモデルとのデータのやりとりもスムーズに行えるようにしてくれているのだろうと思いきや、ブラウザから渡された値が想定外の形式として判断されてしまいます。これは悲しい。

具体的には week は "2017-W01" 形式、month は "2017-01" 形式でブラウザから渡されるので、これを date 型のカラムで受け取るという想定で書いてみると、

```ruby
require "active_record"
ActiveRecord::VERSION::STRING   # => "5.1.0.beta1"

ActiveRecord::Migration.verbose = false
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")

ActiveRecord::Schema.define do
  create_table :users do |t|
    t.date :foo
    t.date :bar
  end
end

class User < ActiveRecord::Base
end

user = User.new
user.foo = "2017-W01"
user.foo                         # => nil
user.bar = "2017-01"
user.bar                         # => nil
```
このように nil になってしまいます。

## 対策1. モデル側で変換する

```ruby
User.class_eval do
  def foo=(v)
    super v.present? ? v.to_date : ""
  end
  def bar=(v)
    super v.present? ? "#{v}-01" : ""
  end
end

user = User.new
user.foo = "2017-W01"
user.foo                         # => Mon, 02 Jan 2017
user.bar = "2017-01"
user.bar                         # => Sun, 01 Jan 2017
```

無難にこんなんでいい気もします。

## 対策2. モンキーパッチを当てる

```ruby
ActiveModel::Type::Date.class_eval do
  prepend Module.new {
    def fast_string_to_date(string)
      case
      when super
        super
      when string.match(/\A\d+-\d+\z/)
        "#{string}-01".to_date
      when string.match(/\A\d+-W\d+\z/)
        string.to_date
      end
    end
  }
end

user = User.new
user.foo = "2017-W01"
user.foo                         # => Mon, 02 Jan 2017
user.bar = "2017-01"
user.bar                         # => Sun, 01 Jan 2017
```

datetime 型にも対応しようと思ったら、そっちも変更が必要です。

## 対策3. カラムの型を文字列型にしておく

```ruby
ActiveRecord::Schema.define do
  create_table :users do |t|
    t.string :foo
    t.string :bar
  end
end
```

確実に保存できます。が、日付データが文字列で入っていることに違和感があるのと、DBを使った検索がしずらいのと、結局使う時は to_date 等の変換をしないといけないのでメリットは少なそうです。
Macにhomebrewでcomposerをインストール

# Macにcomposerを入れたメモ（短いです）

[これの続き](http://qiita.com/yamatmoo/items/4ff2fe1785f771e67e08)

#### PHPの確認
```
$ php -v
PHP 7.1.2 (cli) (built: Feb 17 2017 10:51:21) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
```

#### brewでcomposerをインストール
```
$ brew install homebrew/php/composer
==> Installing composer from homebrew/php
==> Downloading https://homebrew.bintray.com/bottles-php/composer-1.4.1.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring composer-1.4.1.el_capitan.bottle.tar.gz
🍺  /usr/local/Cellar/composer/1.4.1: 5 files, 1.8MB
```

####　確認
```
$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.4.1 2017-03-10 09:29:45
```

終了。
Visual Studio2017でBot Frameworkを試す

先日発表されたVisual Studio2017を使ってBotの開発をしてみます。
これから何回かに分けていろいろと試してみたいと思います。

# 開発環境

Visual Studio 2017 Communityで開発を行います。以下よりダウンロードしインストールを行います。
[ダウンロードサイト](https://www.visualstudio.com/thank-you-downloading-visual-studio/?sku=Community&rel=15)

![SnapCrab_NoName_2017-3-11_12-11-17_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/171118/cda1fa32-e729-b2c4-4cab-4eadcb37ce69.png "SnapCrab_NoName_2017-3-11_12-11-17_No-00.png")

# Bot Framework Template

[Bot Frameworkダウンロードサイト](https://docs.botframework.com/en-us/downloads/#navtitle "Bot Framework")よりBotを開発するためのテンプレートをダウンロードします。


ダウンロードしたテンプレートをzipのまま以下の場所に置きます。
以下はVisual Studio 2017の場合

C:\Users\[[ユーザ名]\Documents\Visual Studio 2017\Templates\ProjectTemplates\Visual C#

# Bot Framework Emulator
次にBot Emulatorを[ダウンロード](https://emulator.botframework.com/)し、インストールします。
Emulatorはコンソール版もあります。（Mac版もあります）

Emulator起動直後の画面
![SnapCrab_Bot_Framework_Emulator_2017-3-11_12-22-18_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/171118/e5899d8d-41f9-53f7-6006-c545f709c5be.png "SnapCrab_Bot_Framework_Emulator_2017-3-11_12-22-18_No-00.png")

ここでは起動の確認だけ行っておきます。

# Bot Frameworkプロジェクトの作成
まずはBotテンプレートのプロジェクトを作成します。

Visual Studioのメニューより*ファイル＞新規作成＞プロジェクト*を選択します。
![2017-3-11_13-50-44_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/171118/f97d61f9-22d8-8a08-f9cf-327d3dce06be.png "2017-3-11_13-50-44_No-00.png")

新しいプロジェクトウィンドウの右上の検索エリアに*bot*と入力し、検索します。
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/171118/6dac42c1-473e-29b3-df32-65c84e8ac76f.png "skitch.png")

名前・場所・ソリューション名称デフォルトのままとしておきます。

# Botアプリケーションの実行
さっそく起動してみます。
ビルドが成功するとブラウザが立ち上がります。



次にBot Emulatorを起動し、Botアプリケーションに接続します。
画面上部の*Enter your endpoint URL*のフィールドにブラウザに表示されているURL＋/api/messages/を入力します。
ブラウザに表示されているURLが http://localhost:xxxx/ の場合、入力するURLは http://localhost:xxxx/api/messages となります。

画面下部の*Type your message...*フィールドにメッセージを入力してみます。
以下のように応答が返ってくれば成功です。
![Emulator_2017-3-11_14-25-11_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/171118/8cfaeec0-5248-d33b-e42a-df19d2bbf133.png "Emulator_2017-3-11_14-25-11_No-00.png")


次回はMicrosoft Translatorを利用して翻訳Botを作りたいと思います。
Reactではidよりrefを使ったほうがいい

idとrefって実質的に同じだから、それならidでいいじゃんという話を前に同僚としていたのですが、色々使っててやっぱりrefの方がいいなと思ったのでポイントをまとめます。

## 名前の影響範囲を限定できる

idってHTML文書内で一意になる必要があるわけです。Componentの呼び出し階層の下の方でidを定義した場合、同じ名前を他で使ってるかどうかわからなくなりますね。実質的に問題がなくても、可能性があるだけで落ち着かない。（なので自分はそもそもid属性を極力避ける）

その点、refであればそのComponentの中だけの事なので、影響を気にせず使えるわけです。

## コードなので表現力がある

繰り返し属性に対してidを振るような場合、以下みたいな感じになるかと思います。

```js
list.map((n,i) => (
  <input id={`list[${i}].name`} type='text' defaultValue={n.name} onChange={e => this.doSomething(e,i)} />
))
```

Template literal 合ってたかなって毎回調べますね。今も調べた。言語をまたぐとやんなっちゃいますね。使うときも```document.getElementById(`list[${i}].name`)```とかせにゃならん。

refならこう

```js
list.map((n,i) => (
  <input ref={r => {
      this.list = this.list || []
      this.list[i] = {name: r}
    }} type='text' defaultValue={n.name} onChange={e => this.doSomething(e,i)} />
))
```

めんどくさかったので冗長になりましたが、`list`の初期化とかはコンストラクタでやればいいです。これで`this.list[i].name`で参照できる。

----

以上より、refを積極的に使いたいと思う次第です。
ネットワークとは（OSI参照モデル）

ネットワーク通信の構造を理解していないので、トラブルシューティングができなかったので、調べたことをまとめました。

OSI参照モデル
http://www.infraexpert.com/study/networking3.html

##前提

コンピューターが通信するときには、少なくとも「どの相手」に通信するかが分かっていないと、通信できない。
だからMACアドレス、ip、ポートを使って、どの機器のどのアプリケーションに通信するかを明確にする必要がある。

（低レイヤー層から順番に解説）

MACアドレス：PCとかwifiルーターについている物理的なネットワークの接続口（LANケーブルや、wifi）等。PCでもwifiとLANケーブルがあればどっちの接続口か判明させる為に、Macアドレスは2つになる。

ipアドレス：ネットワーク上に接続されている機器に割り振られている。

ポート：指定された、MACアドレス、pアドレスのどのアプリケーションと通信するかを、ポートで決定する。だから一アプリケーションは一ポートを占有する。


##デバッグをするとき
デバッグするときは、低レイヤー層からデバッグしていく。高レイヤー層でデバッグしても原因が低レイヤー層にあれば永遠に解決できない。


##URLから読み解くネットワーク通信

例えば、こんなurlがあるとする。

http://192.168.0.107:8080

この例でいくと、"http://"http通信で、ip"192.168.0.107"の、"8080"というポートを占有しているアプリケーションを相手に通信する。
Bilboard nedir ?

yeni nesil sosyal imleme ve içerik paylaşım siteniz. En güncel haberlerden en ilginç bilgilere tek sayfada erişip, trendlere taşıyabileceğiniz sitemizin misyonu kolay yoldan bilgiye erişmeniz için sosyal medyadaki günlük gelişmelerden kısa ve öz alıntılar yaparak trendleri sizin oy ve yorumlarınızla belirlemek. http://bilboard.net
ESP-WROOM-02プログラムでalignを指定する方法

ESP-WROOM-02でrtcメモリやflashメモリにデータを読み書きする場合、読み書きに使うメモリのアドレスを32bit境界に合わせなければなりません。その方法を調べたのでメモします。

# 要約
変数宣言に ` __attribute__((aligned(4)))` を付ければよい。

```cpp
uint8 data __attribute__((aligned(4)));
```

# alignが必要な場面
例えば、rtcメモリを読む関数 system_rtc_mem_read の定義は次のようになっています。

```cpp
bool system_rtc_mem_read(uint32 src_addr, void *des_addr, uint32 load_size);
```

第2引数の`des_addr`は32ビット境界のアドレスでなければなりません。つまり、16進数で表した場合下１桁が 0, 4, 8, C のいずれかでなければなりません。

# alignを指定しないでプログラムを書いた例（その1）
グローバル変装として`uint8 dataBuffer[8];`を宣言しているプログラム書いた場合、アドレスがどうなっているか試してみましょう。

```cpp:program1-no-align.ino
uint8 dataBuffer[8];

void setup() {
  Serial.begin(115200);
  delay(10); // macのserial consoleが文字化けしないためのおまじない
  Serial.println("");
  Serial.println("--- setup() ---");

}

void loop() {
  Serial.println("--- loop() ---");
  printAddress("dataBuffer=", (uint32)dataBuffer);

  Serial.println("Wait for 10 seconds");
  delay(10*1000);
}

void printAddress(char *name, uint32 address) {
  Serial.print(name);
  Serial.println(address, HEX);
}
```

このプログラムをmac上のArduino IDEでコンパイルしてESP-WROOM-02で実行してみると次のような結果が得られます。

```
--- setup() ---
--- loop() ---
dataBuffer=3FFEE298
Wait for 10 seconds
```

アドレスの下１桁が `8` なのでこれでOKです。

# alignを指定しないでプログラムを書いた例（その2）
では、先ほどのプログラムにグローバル変数 `uint8 aaa;` を追加してみましょう。

```cpp:program2-no-align.ino
uint8 dataBuffer[8];
uint8 aaa;


void setup() {
  Serial.begin(115200);
  delay(10); // macのserial consoleが文字化けしないためのおまじない
  Serial.println("");
  Serial.println("--- setup() ---");

}

void loop() {
  Serial.println("--- loop() ---");
  printAddress("dataBuffer=", (uint32)dataBuffer);
  printAddress("aaa =", (uint32)&aaa);

  Serial.println("Wait for 10 seconds");
  delay(10*1000);
}

void printAddress(char *name, uint32 address) {
  Serial.print(name);
  Serial.println(address, HEX);
}
```

このプログラムを実行してみるとこういう結果が得られます。

```
--- setup() ---
--- loop() ---
dataBuffer=3FFEE299
aaa =3FFEE298
Wait for 10 seconds
```

dataBufferのアドレスの下１桁が `9` になっています。これではいけません。
変数を色々宣言していると、そのアドレスが何になるかはコンパイラ任せなので、32bit境界になるかどうかは運任せになります。

# alignを指定したプログラム
「この変数は32bit境界に配置してね！」とコンパイラにお願いすることができます。お願いの方法はコンパイラによってまちまちです。ESP-WROOM-02用のプログラムをArduino IDEで記述する場合は、変数宣言に ` __attribute__((aligned(4)))` を付ければ良いことがわかりました。

先ほどのプログラムにこれを付けてみるとこうなります。


```cpp:program3-with-align.ino
uint8 dataBuffer[8] __attribute__((aligned(4)));
uint8 aaa;


void setup() {
  Serial.begin(115200);
  delay(10); // macのserial consoleが文字化けしないためのおまじない
  Serial.println("");
  Serial.println("--- setup() ---");

}

void loop() {
  Serial.println("--- loop() ---");
  printAddress("dataBuffer=", (uint32)dataBuffer);
  printAddress("aaa =", (uint32)&aaa);

  Serial.println("Wait for 10 seconds");
  delay(10*1000);
}

void printAddress(char *name, uint32 address) {
  Serial.print(name);
  Serial.println(address, HEX);
}
```

このプログラムを実行するとこういう結果が得られます。

```
--- setup() ---
--- loop() ---
dataBuffer=3FFEE29C
aaa =3FFEE298
Wait for 10 seconds
```

dataBufferのアドレスの下1桁が `C` になっているので、32bit境界なのでOKです。

# TODO
Macでしか動作を確かめていないので、Windowsでもやってみる必要があります。
ElectronでPC画面上にコメントが流せるデスクトップアプリを作ってみた

# はじめに
PC画面上にコメントが流せるデスクトップアプリをElectronで作ってみました。
名前は、「wakaba」です。


![panel.png](https://qiita-image-store.s3.amazonaws.com/0/77608/31aa37ad-c58e-b0da-3698-ba6a67b9601e.png)


コメントはTwitterから特定のキーワードを含むツイートを取得して流します。
イベントやライブコーディングの時に使うと面白いかもしれません。

コンポーネントの部分は、Reactではなく、Riotを使いました。

## 動作
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">PC画面上にコメントが流せるデスクトップアプリをElectronで作りました。<br>Twitterからツイートを取得して、コメントを流しています。<br><br>GitHub: <a href="https://t.co/v8OKRqf0It">https://t.co/v8OKRqf0It</a><br>ダウンロード: <a href="https://t.co/ScVcy1HaLS">https://t.co/ScVcy1HaLS</a> <a href="https://t.co/o6S3FBGZK3">pic.twitter.com/o6S3FBGZK3</a></p>&mdash; yuki540 (@eriri_jp) <a href="https://twitter.com/eriri_jp/status/843348414305783808">2017年3月19日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 使い方
### ダウンロード


~~ダウンロードしたものが動かない問題解決しました！
Macの方は、下記のリンクからダウンロードしてください。~~

Mac / Windows / Linux全てのパッケージ化をしました！
~~Windowsと~~Linuxは動作確認してないので、動かなかった場合はTwitterなどで知らせてくれる嬉しいです。
Windowsでも動作するという報告をしていただきました！ありがとうございます！
[https://github.com/yuki540net/wakaba/releases/tag/v0.0.1](https://github.com/yuki540net/wakaba/releases/tag/v0.0.1)

### Twitterにログイン
まず、Twitterにログインしてください。
<img width="1277" alt="login.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/31739b63-9a9d-594c-8468-86d062cf6ed1.png">


### キーワードを入力
中央のテキストボックスに取得したいキーワードを入力し、検索ボタンを押してください。
<img width="1275" alt="keyword.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/11e1d864-10ae-ef40-cb6a-4b788c6fe598.png">

そうすると、そのキーワードを含んだツイートが画面上に流れます。
<img width="1274" alt="comment.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/f5de0408-ae16-0764-2df6-5ead77729597.png">


### 履歴の確認
矢印のボタンを押すと、履歴の確認ができます。
<img width="476" alt="log_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/f2576593-3e1e-2489-98b0-e7cc805ef69c.png">
<img width="370" alt="log_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/b9776c25-f337-b1a3-49a8-08129cac4f32.png">


### 文字サイズ・色
文字サイズ・色の設定ができます。
矢印のボタンを押すと、設定画面が出てきます。
<img width="476" alt="settings_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/c791ddce-16bf-e919-2d52-14203ca48ba5.png">

スライダーを調整すると、文字の大きさを変えることができます。
<img width="1276" alt="settings_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/bbddb83f-bbc0-4df1-d20c-816ab9d3c052.png">

色の付いたボタンを押すと、文字の色を変えることができます。
<img width="1275" alt="settings_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/e5fb75db-a451-91b3-5797-0c1bd45c5553.png">


### コメントの表示・非表示
矢印のボタンを押すと、コメントの表示・非表示ができます。
<img width="476" alt="toggle_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/fcd52fbb-1ed0-3bb3-ffc6-e3ae077c9a32.png">
<img width="1274" alt="toggle_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/77608/e88c000f-3367-20f9-6df6-95836768655b.png">


## さいごに
これから、ちょこちょこアップデートしていきながら在学中の専門学校のプレゼンとかで使おうかなと思います。
よければ、GitHubのStarつけてください。

GitHub: [https://github.com/yuki540net/wakaba](https://github.com/yuki540net/wakaba)
Twitter: [@eriri_jp](https://twitter.com/eriri_jp)
[短文メモ]KDE5 Plasmaデスクトップで、DVDビデオのディスクを入れてもデバイスの通知からだとファイルマネージャでしか開けないときの対処

DVDを再生自体できない人は
https://wiki.archlinuxjp.org/index.php/%E5%85%89%E5%AD%A6%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96#DVD
などを見て下さい。再生はできるけど、デバイスの通知欄に表示されない場合の対処の説明。

動画プレイヤーはMPVを想定しています。その他のプレイヤーの場合は、別途、コマンドライン変えて下さい。
$HOME/.local/share/solid/actions/Open-DVD-Video-with-mpv.desktop を作成し、以下のように記述。

```$HOME/.local/share/solid/actions/Open-DVD-Video-with-mpv.desktop
[Desktop Action open]
Exec=mpv --dvd-device=%d dvd://
Icon=mpv
Name=Open DVD Video with mpv

[Desktop Entry]
Actions=open;
Type=Service
X-KDE-Action-Custom=true
X-KDE-Solid-Predicate=[StorageVolume.ignored == false AND OpticalDisc.availableContent == 'Data|VideoDvd']
```

`%d`が、デバイスのパスに化けます。DVD入れるところが複数ついてない限りは、なくても再生できると思いますが、念の為。
その後、再ログインか、もしくはplasmashellを殺して立ち上げ直す必要があります。
iPhoneの画面を記録する私の好きなアプリ

私は彼らのデバイスの画面を記録する方法を知らない多くの人々を知っています。 この記事では、好きなものをいくつか挙げたいと思います。

#私のiPhoneの情報
1. iPhone 6s
2. iOS 10.2の使用

#私のお気に入りのスクリーンレコーダーアプリ
1. AirShou
2. QuickTime Player
3. Shou
4. XRecorder

私はその助けを願っています。 これらのアプリのほとんどは脱獄を必要としないので、どのタイプのiPhone、iPod touch、またはiPadにもインストールできます。

#参照
https://www.cydiageeks.com/cydia-tweaks-record-iphone-screen-jailbroken-no-jailbreak.html
Markdownを覚えると超捗った話

# Markdown最高！
Markdownってすごい便利ですよね。  
Qiitaを書いている人は当たり前に使っていると思います。  
僕がMarkdownを覚えて捗ったことやツールなどをまとめたいと思います。  

## テキストなのでgitで管理できる
- テキストファイルなのでgitで管理可能（当たり前だけど）
- githubに上げるのはちょっと…って人はgithub cloneである[GitLab](https://about.gitlab.com/)というのがある
- gitで管理すると、差分表示が見れるし、○○_最新(2).xlsとかいうトンデモない事態にならなくてすむ

## Markdown対応エディタを使えばプレビューできれいに
- [Atom](https://atom.io/)だと標準でMarkdownプレビュー機能がある
  - ぱぱっとメモってプレビュー機能で見せるだけでかなり見やすい
  - HTMLで保存もできる
![sc 2017-03-19 15.20.49.png](https://qiita-image-store.s3.amazonaws.com/0/164786/be1006fa-c10e-52f0-2e09-28b93881d270.png)
- ※国産エディタの[Boostnote](https://boostnote.io/)も使いやすい


## pdfで簡単なスライドを作成できる
- [Marp](https://yhatt.github.io/marp/)でMarkdownをそのままpdfに
- 罫線(-----)で区切るとページを区切れる
- 軽い打ち合わせやプレゼンしたい時に便利
![sc 2017-03-19 15.22.53.png](https://qiita-image-store.s3.amazonaws.com/0/164786/99437355-0d52-c8fd-0587-c3074029868b.png)

## スタイリッシュでカッコイイプレゼンがしたい
- [reveal-js](http://lab.hakim.se/reveal-js/)
- Markdownをサポートしているので、かっちょいいプレゼンをしたいときに使っている

## 静的Webサイトを作れる
- [MkDocs](http://www.mkdocs.org/)
- Markdownで書いていれば、MkDocsで静的Webサイトを簡単に作成できる
- こういうのを「静的サイトジェネレータ」と言うらしい
  - 他にもたくさんあるので調べてみると面白い

## Markdownで書いたメールをレンダリング
- [Markdown Here](https://chrome.google.com/webstore/detail/markdown-here/elifhakcjgalahccnjkneoccemfahfoa?hl=ja)を使えばOK（Chromeのみ）
- GmailをMarkdownで書いてMakrdown Hereでポチっとやると綺麗になって超捗ります
![sc 2017-03-19 15.25.22.png](https://qiita-image-store.s3.amazonaws.com/0/164786/d29287e4-c9d4-bfc0-c105-41b783ae07c7.png)

## その他
- 構造を意識して文章がかけるようになった
- 箇条書きを意識するため、普通にメモするときでも大事なことをまとめられるようになった

## 脱Excel！
- 議事録や簡単な手順書レベルなら、Excel使わなくていいんじゃないかなと思います
- 本気の設計書や管理表などは、まだまだExcelから抜けるのは難しいんじゃないかなあと思います
  - 本当はやだけど
cmakeで環境変数を使ってディレクトリを指定したい


**手順**
`$ENV{HOGE}` を使う。ENVをつけよう。
`${HOGE}` そのままだとうまくいかない。


```例
cmake_minimum_required(VERSION 3.8)

include_directories(
        $ENV{GTEST_DIR}/include
        )

add_executable(
        fuga
        fuga.cpp
        )

target_link_libraries(
        fuga
        $ENV{GMOCK_DIR}/gtest/libgtest.a
        $ENV{GMOCK_DIR}/gtest/libgtest_main.a
        )
```
Visual Studio 2017でバージョン管理

Visual Studio 2017 でバージョン管理を行い、NASに作成したリモートリポジトリにプッシュするまでの手順です。

#環境
2017/9/17追記）以下のバージョンに更新しました
Windows 7 Professional SP1 64bit
Visual Studio 2017 Community Version 15.3.4
TortoiseGit 2.4.0.2
Git for Windows 2.12.2

※TortoiseGitはなくてもかまいませんが、Visual Studioだけだと使いにくいのでインストールしておくことをおすすめします。

#ローカルリポジトリ作成
プロジェクトを作成するとき「新しいGitリポジトリの作成」をチェックします。
![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/11f5c355-53a7-b43e-6b94-5d5d56118510.png)

これでローカルリポジトリが作成されバージョン管理することができるようになります。

#リモートリポジトリ作成
NASにリモートリポジトリを作成するフォルダーを作成する。
![bbb.png](https://qiita-image-store.s3.amazonaws.com/0/112075/5cde463e-4d06-ca49-96c8-096dab4c2c43.png)

作成したフォルダーを右クリックして「Gitここにリポジトリを作成...」を選択する。
![ccc.png](https://qiita-image-store.s3.amazonaws.com/0/112075/e2dbdeb6-5592-ab3b-d75a-bd6417e92374.png)

ダイアログが表示されるので「Bareを生成(作業ディレクトリーを作りません)」をチェックしてOKボタンを押す。
![ddd.png](https://qiita-image-store.s3.amazonaws.com/0/112075/6ddba4d4-af27-1f43-39bc-2c552a91bb0f.png)

これで空のリモートリポジトリが作成されます。

#リモートリポジトリにプッシュ
ローカルリポジトリの内容をリモートリポジトリへプッシュします。

Visual Studioのチームエクスプローラーから同期を選択する。
![eee.png](https://qiita-image-store.s3.amazonaws.com/0/112075/b4d413cb-d065-b392-9da2-f60ab6b58c7f.png)

リモートリポジトリにプッシュからGitリポジトリを発行ボタンを押すと、リモートリポジトリのURLを入力するエリアが表示されるので上で作成したフォルダーを指定します。
![fff.png](https://qiita-image-store.s3.amazonaws.com/0/112075/deea5456-1487-2b9a-2629-09af83ef3081.png)

リモートリポジトリのURLは以下のように入力しました。
```
//<NASサーバー名>/Public/git/repos/<プロジェクト名>
```
公開ボタンを押したらリモートリポジトリへプッシュされます。

~~これで変更をコミットしてリモートリポジトリと同期できるように・・・なってない！！！？~~
2017/9/17追記） 原因は分かりませんができるようになっていました。

#不具合
~~リモートリポジトリと同期しようとすると以下のエラーが表示される。~~

~~リモート リポジトリへのプッシュ中にエラーが発生しました: Git process failed unexpectedly.~~

~~TortoiseGitでは問題なく同期できるのですが、Visual Studioから行うとエラーになって同期できません。~~
~~原因は今のところわかっていません・・・。~~
CentOS7でMacのHFS+ドライブをマウントする

# はじめに
先日稼働させたCentOS7上のsambaサーバーのNASに、もともとMacで共有していたドライブをコピーしたくてHFS+をマウントさせよう！というお話。

WiFi経由でファイルコピーしようとしたら遅すぎて・・w

# Do it!
## kmod-hfsplusをインストールする

yumコマンド・・・のリポジトリが足りてないので追加します。
で、インストールします。

```
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
# yum install kmod-hfsplus
```

## HFS+パーティションをマウントする

partedコマンドでパーティションを確認します。
***注意：fdiskコマンドだとGPTはうまく表示されないのでドツボにハマります！***

```
# parted -l

モデル: BUFFALO External HDD (scsi)
ディスク /dev/sdb: 3001GB
セクタサイズ (論理/物理): 512B/4096B
パーティションテーブル: gpt
ディスクフラグ: 

番号  開始    終了    サイズ  ファイルシステム  名前                  フラグ
 1    20.5kB  210MB   210MB   fat32             EFI System Partition  boot
 2    210MB   3000GB  3000GB  hfs+              Share HD 2
```


マウントしてみましょう。（リードオンリーです）

```
# mount -t hfsplus -o ro /dev/sdb2 /media/hfs
```

いけたかな？

```
# ll /media/hfs

合計 776
drwxrwxr-x 1 nobody nobody      9  5月  2  2016 Backup
drwxrwxr-x 1 nobody nobody     36  1月 11 13:29 Books
drwxrwxr-x 1 nobody nobody      6  8月 14  2015 Develop
drwxr-xr-x 1 nobody nobody      4  6月 18  2016 Documents
drwxrwxr-x 1 nobody nobody      4  3月 22  2015 Games
drwxrwxr-x 1 nobody nobody      8  2月 15 23:37 Media
drwxrwxr-x 1 nobody nobody     11 10月 29 22:23 Movies
drwxrwxr-x 1 nobody nobody     21 10月 30 01:26 Music
drwxrwxr-x 1 nobody nobody     15 12月  4 15:47 Photos
drwxr-xr-x 1 nobody nobody      5  5月 15  2016 Users
drwxrwxr-x 1 nobody nobody      5 10月 30 13:59 Virtual
drwxr-xr-x 1 nobody nobody      7  2月 11 22:00 Works
```

見えましたw

# 参考
[CentOS7 で Mac で使っている外付けハードディスク (hfsplus) を読む](http://xr0038.hatenadiary.jp/entry/2015/05/28/154640)
CentOS7にコマンドでVirtualBoxをインストールする方法

# はじめに

諸事情でCentOS7上にVirtualBoxを動かす必要が出てきたので、インストールしてみました。

# VirtualBoxをインストールする

まずはOracleのパブリックキーをインポートします。

```
# wget http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc
# rpm --import oracle_vbox.asc
```

次に、Virtual Boxに関するリポジトリを追加します。

```
# wget http://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo -O /etc/yum.repos.d/virtualbox.repo
```

yumコマンドで確認しましょう。

```
# yum update
# yum list *virtualbox*
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
利用可能なパッケージ
VirtualBox-4.3.x86_64               4.3.40_110317_el7-1               virtualbox
VirtualBox-5.0.x86_64               5.0.32_112930_el7-1               virtualbox
VirtualBox-5.1.x86_64               5.1.14_112924_el7-1               virtualbox
```

現時点では5.1が最新ですね。
インストールしてみましょう。

```
# yum -y install VirtualBox-5.1
```

vboxdrvサービスが登録されているハズなので状態を確認しておきましょう。

```
# systemctl status vboxdrv
● vboxdrv.service - VirtualBox Linux kernel module
   Loaded: loaded (/usr/lib/virtualbox/vboxdrv.sh; enabled; vendor preset: disabled)
   Active: active (exited) since 日 2017-02-26 19:40:38 JST; 1min 8s ago
  Process: 21662 ExecStart=/usr/lib/virtualbox/vboxdrv.sh start (code=exited, status=0/SUCCESS)
```

*このとき、私のCentOS7に gcc, make, kernel-devel が入っていなかったためハマりました・・*
*vboxdrvサービスがコケてたので、これらをインストールしたところうまくいきました。*
*コケたときの状態がこちら*

```
# systemctl -l status vboxdrv
● vboxdrv.service - VirtualBox Linux kernel module
   Loaded: loaded (/usr/lib/virtualbox/vboxdrv.sh; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 日 2017-02-26 19:23:22 JST; 40s ago
  Process: 3209 ExecStart=/usr/lib/virtualbox/vboxdrv.sh start (code=exited, status=1/FAILURE)

 vboxdrv.sh[3209]: yum install gcc make
 vboxdrv.sh[3209]: yum install kernel-devel-3.10.0-327.el7.x86_64
 vboxdrv.sh[3209]: (The last command may fail if your system is not fully updated.)
 vboxdrv.sh[3209]: yum install kernel-devel
 vboxdrv.sh[3209]: vboxdrv.sh: failed: Look at /var/log/vbox-install.log to find out what went wrong.
 vboxdrv.sh[3245]: failed: Look at /var/log/vbox-install.log to find out what went wrong.
 systemd[1]: vboxdrv.service: control process exited, code=exited status=1
 systemd[1]: Failed to start VirtualBox Linux kernel module.
 systemd[1]: Unit vboxdrv.service entered failed state.
 systemd[1]: vboxdrv.service failed.
```

# 参考

こちらのサイトを参考にさせていただきました。
[CentOS 7にVirtual Boxをインストールする(俺的備忘録 〜なんかいろいろ〜)](https://orebibou.com/2014/12/centos-7%E3%81%ABvirtual-box%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/)
Rubyでファイルのmodeを確認する


```.rb
File::Stat.new(file).mode.to_s(8)
# => "100444"
```

そのまま `File::Stat#mode`を出力すると整数を返されて何がなんだかわからなくなるので `to_s(8)`で8進数に変換して読みましょう。
[Swift3]文字列が人名かどうかをバリデーションする方法

アプリからユーザの個人情報などをサーバに送る前にフィールド文字列が適切かどうかバリデーションチェックすることがあると思う。

人名(氏名)の指定文字列が適切かどうかのチェック方法を調べてみた。

# ひらがなかどうか

`NSPredicate`を使用して正規表現で評価することができる。
（Objective-C時代から何度も調べてる気がするが...。Swiftでも同様でした。）

```swift:String+Extension.swift
func isHiragana(_ str: String) -> Bool {
    let regex = "^[ぁ-ゞ]+$"
    let predicate = NSPredicate(format:"SELF MATCHES %@", regex)
    return predicate.evaluate(with: str)
}
```

# カタカナかどうか

カタカナも`regex`の内容を変更するだけでOK！

```swift:String+Extension.swift
func isKatakana(_ str: String) -> Bool {
    let regex = "^[ァ-ヾ]+$"
    let predicate = NSPredicate(format:"SELF MATCHES %@", regex)
    return predicate.evaluate(with: str)
}
```

# 漢字かどうか

漢字も`regex`の内容を変更するだけでOK！

でも、漢字って一体何？
実は人名としての漢字の文字コード指定範囲は選定が結構むずい。

ググった結果、[ここ](http://tama-san.com/kanji-regex/)のサイトから以下のグループにすることにした。

|コード         |内容                                       |
|:-------------|:------------------------------------------|
|3005          |々                                         |
|3007          |〇                                         |
|303b          |〻                                         |
|3400 ~ 9fff   |CJK統合漢字拡張A（＋易経の六十四卦）＋CJK統合漢字 |
|f900 ~ faff   |CJK互換漢字                                 |
|20000 ~ 2ffff |CJK統合漢字拡張B〜D＋CJK互換漢字追加            |

```swift:String+Extension.swift
func isKanji(_ str: String) -> Bool {
    let regex = "^[\u{3005}\u{3007}\u{303b}\u{3400}-\u{9fff}\u{f900}-\u{faff}\u{20000}-\u{2ffff}]+$"
    let predicate = NSPredicate(format:"SELF MATCHES %@", regex)
    return predicate.evaluate(with: str)
}
```

# 氏名かどうか

人名のバリデーションは、上記のひらがな/カタカナ/漢字に英大文字/英小文字を条件に加えることにした。


```swift:String+Extension.swift
func isKanji(_ str: String) -> Bool {
    let regex = "^[A-Za-zぁ-ゞァ-ヾ\u{3005}\u{3007}\u{303b}\u{3400}-\u{9fff}\u{f900}-\u{faff}\u{20000}-\u{2ffff}]+$"
    let predicate = NSPredicate(format:"SELF MATCHES %@", regex)
    return predicate.evaluate(with: str)
}
```

更にいい条件をご存知の方がいらっしゃったらお教え頂けると嬉しいです！


参考サイト：
---
Unicodeで「漢字」の正規表現
http://tama-san.com/kanji-regex/

Swiftでひらがなとカタカナのバリデーションをする
http://qiita.com/k-yamada@github/items/1c8c8a17a96516eb8311
ScrapyでのUser-Agentの変更

#User-Agentの変更
デフォルトでは、settings.pyに指定がないので、Scrapyのバージョンがそのまま使われます。

例）

```
***.***.***.*** - - [18/Mar/2017:23:07:21 -0400] "GET / HTTP/1.1" 200 68 "-" "Scrapy/1.3.2 (+http://scrapy.org)"
```

例えば、settings.pyに以下のように指定します。

```py3:settings.py
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8'
```

再度クロールしてみると、以下のようになりました。

```
***.***.***.*** - - [18/Mar/2017:23:19:03 -0400] "GET / HTTP/1.1" 200 68 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8"
```
Daydreamアプリの審査を通過してみた

以前の投稿はこちら
http://qiita.com/shmyT/items/58d5014be5dfec047641


##経緯
２０１７年6月現在、google様のVRプラットフォームであるDaydreamにアプリを公開するためには、（多分人間による）審査を通過する必要があります。Unity 5.6 beta 10のsystem barsが表示されてしまうバグで足止めを食らっておりましたが、Unity 5.6 beta 11にてバグはようやく改修されたようです。無事審査通過とアプリ公開ができました。日本語の情報がほぼ皆無だったため、追加で頂いた指摘内容と対処法を共有させて頂きます。**がんばれ日本。**


##追加の指摘内容とその対処方法
###The app does not maintain head tracking - ヘッドトラッキングができていません
ヘッドトラッキングというのは顔の角度に合わせてVR上の映像の角度が変わってくれる機能です。言うまでもなくVRの基本的な動作の一つであり、ゲーム画面も問題なく動作していたためこのコメントの真意を理解するのに大変時間がかかりました。

こちらのフォームでも話題になっているように皆様同じフィードバックに悩まされているようです。
https://forum.unity3d.com/threads/head-tracking-stops-on-splash-screen-daydream-store-rejection.459730/

問題はアプリの起動画面ででてくるUnity logoのスプラッシュスクリーンでした。スプラッシュが終了するときに首を左右に激しくふっていると一瞬画面の描画が追いつかず、画面の映像と首の角度がずれ、黒い空間が表示される現象が発生します。
https://youtu.be/fQnCpM0XUcY

動画にある通りこちらの現象はGoogle VR SDKのGVRdemoのサンプルシーンでも発生し、Unity様かgoogle様側の問題であるかと思われます。

いずれ改修されるかとは思いますが、試しに首を左右に激しくふっても画面がずれてるとユーザーにわからない方法。すなわち元々黒い背景がある画像を起動時に表示させてみることにしました。

下記のような黒背景の画像を用意し真ん中にちょこんとロゴを入れてやり、問題が発生して黒い空間が表示されても、元々背景が黒いからユーザーには区別がつかないだろうという形にしたところ、こちらの問題は指摘されなくなりました。
![black-planet-surface-1920.jpg](https://qiita-image-store.s3.amazonaws.com/0/14288/648261e7-7153-1830-45f8-3e218a9ebffe.jpeg)

VRのスプラッシュスクリーンの設定はFile->Build Settings->Player settings->Android->Splash Imageの下記で設定可能です。
<img width="295" alt="スクリーンショット 2017-03-19 11.38.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/14288/ec62ebd3-a0b2-494a-99d7-f3d73774deb6.png">
*・Unity 5.6 beta 11現在、こちらを設定するとPersonal版でも起動時のUnity logoが消えてしまいます。Unity様のこれまでのポリシーとは違った動きなので、今後変更される可能性はあるかもしれません。*
*・Unity 5.6 beta 11現在、Splash screenのPreviewはVR向けには使えないようです。*


###The app does not provide feedback while loading - 
もう一つのフィードバックはローディングに関するものです。ローディング時間が数秒に渡る場合、ユーザーにフリーズと思われないために何かしらの工夫をするようにとのことでした。審査のガイドラインであるDaydream App Quality Requirementsの該当部分を読みますと、

*ローディング中に音を鳴らすとか、画面の色が変わるとか、なんか立体的なものを表示するとか、なんでもいいからとにかくフリーズしたと思われないようにしろ(意訳)*

と書かれており、google様側も譲歩のガイドラインを定めているようです。

>・Provide audio to indicate that the game has not crashed.
>・Pulse the color or brightness of the screen to provide feedback that the app is still alive.
>・Draw a small stereoscopic loading indicator to each eye.

https://developers.google.com/vr/distribute/daydream/performance-requirements

なのでゲームのシーンとは別にLoadingのシーンを設け、簡単なオブジェクトをクルクルと回転させておきました。

シーンの非同期ロードに関してはこちら
http://qiita.com/nemak1d_sys/items/07ad538baf83ea966eca

Audio clip周りの最適化に関してはこちらを参照しました
http://www.theappguruz.com/blog/optimize-game-sounds-in-unity


##作ったアプリ
こんなアプリです。いわゆる即死系のゲームです。
自分で言うのも何ですがそれなりに楽しいので、よければお試しください。
**[VR FLIGHT DASH]**
https://play.google.com/store/apps/details?id=com.deercat.infiniteflight2sign
<img width="512" alt="スクリーンショット 2017-02-20 20.17.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/14288/29d7bbe8-0b36-7549-2391-8f941d4a2973.png">


##まとめ
・２０１７年3月現在最新のUnity5.6.0beta11 + Google VR SDK for Unity v1.30を用いて作ったアプリにはSplash screenの終了時に画面描画が一瞬止まってしまう現象が発生する事があり、発生する場合"The app does not maintain head tracking"で審査落ちする。

・Google様的な審査ポリシーは**"1瞬でもユーザーに違和感を感じさせないこと"**が重要視されている模様。違和感があれば本質的な問題でなくても審査落ちし、逆に違和感がうまく隠せれば実装はどうあれ通過する模様。

何かのお役に立ちましたら幸いです。
Cent OS 6でgithubからのgit cloneに失敗したのでメモ

昨日、とあるCent OS 6で稼働させている古いサーバーにrubyの新しいバージョンを入れようとgithubからrbenvをcloneしようとしたらえらーになったのでメモ

```text:エラーの内容
$ git clone https://github.com/rbenv/rbenv.git
Initialized empty Git repository in /home/kazu/profile-service/rbenv/.git/
error:  while accessing https://github.com/rbenv/rbenv.git/info/refs
```

まだ詳しく調べてはいないけど、どうやらこれは既知の不具合(SSLに起因する?)らしく、gitコマンドでのSSLのベリファイを無効化したらエラーはなくなった。

```shell:以下を設定
git config --global http.sslVerify false
```

あとでちゃんと調べなきゃ…

2017-03-19 追記「SSLのベリファイの無効化」でgit cloneは成功したけれど、その後のインストール作業中にやっぱりcurlを使ってのhttps:プロトコルでのファイルダウンロードなども失敗するのでちゃんと原因を調べたら、Cent OS 6でインストールされているCA証明書の情報が古くて色々なサイトでのSSLの認証でエラーが起きていたようです。

で、結局正しい解決方法は「新しいCA証明書の情報をどこからかダウンロードしてきてCent OS 6に設定する」でした。

今回はcurlのWebサイトから「CA証明書の情報」をダウンロードして置き換えを行いました。

```shell:ca-bundle.crtの更新
wget http://curl.haxx.se/ca/cacert.pem --no-check-certificate
sudo mv cacert.pem /etc/pki/tls/certs/ca-bundle.crt
```
Xcode 8でドキュメントコメントをラクチンに書く方法

Xcode 8では、関数などのドキュメントコメントのひな形を簡単に挿入できるようになっています。

ドキュメントコメントを付けたい関数をカレント行にした状態で、
［Editor］−［Structure］−［Add Documentation］
を実行するだけです。とてもラクチン！ :laughing:

![](https://qiita-image-store.s3.amazonaws.com/0/33397/a5eb444a-7b3e-262f-d32b-cb78bf723c93.png)

　↓ こうなります :100: 

![](https://qiita-image-store.s3.amazonaws.com/0/33397/3bbf745f-e1ad-b11a-b37d-677828426517.png)
pug の中から moment.js を使用する

pug を使っていて、テンプレートの中で時刻表示を操作したく、gulp + pug + moment.js の使用方法を調べた

**pug ファイルの例**

```
- var sample = moment('2017-04-22 15:30');

time(
  datetime=sample.format('Y-MM-DD HH:mm')
  aria-label=sample.format('LLLL')
) #{sample.format('Y.MM.DD.ddd.HH:mm.')}
```

こんな感じで時刻を変数にしておき、1ヶ所変えるだけで複数箇所の表示が変えられるようにしたかった

**gulpfile**

結論、gulp-pug の `locals` に moment.js のオブジェクト渡すだけでOK
(別に moment.js に限った話しではなかった)

```js
const gulp = require('gulp');
const pug = require('gulp-pug');
const moment = require('moment');

gulp.task('default', () => {
  gulp.src('pug/**/*.pug')
  .pipe(pug({
    locals: {
      moment: moment
    }
  }))
  .pipe(gulp.dest('dist'));
});
```

これだけで、pug の中で渡された moment.js が使えるようになる

**出力結果**

```html
<time datetime="2017-04-22 15:30" aria-label="Saturday, April 22, 2017 3:30 PM">2017.04.22.Sat.15:30.</time>
```

こんな感じで出力可能に。べんり。
Visual Studio 2017 で C# 7 の新しいフィーチャが有効にならない 

# Visual Studio 2017 で C# 7 の新しいフィーチャが有効にならない 

`out var` とか新しいタプルとか使いたい

## 免責事項
本書の対処が正しいこと、同じ効果が得られること、その他の問題が発生しないことを保証しません。情報は利用者の責任において使用ください。

## 情報源
[C# 7 features don't work within a web project on Visual Studio 2017 RC](http://www.fongva.com/questions/1702181215348156)

## 対処

`out var` は、パッケージ マネージャー コンソールで `Microsoft.Net.Compilers` を 2.0.0 以上に更新するか、`install-package` する。

```
[xxx] > update-package Microsoft.Net.Compilers

'.NETFramework,Version=v4.6' を対象とするプロジェクト 'xxx.Tests' に関して、複数のパッケージの依存関係情報の収集を試行しています
依存関係情報の収集に 1.95 sec かかりました
複数のパッケージの依存関係の解決を試行しています。
依存関係情報の解決に 0 ms かかりました
複数のパッケージをインストールするアクションを解決しています
解決に成功しましたが、アクションは実行されませんでした
ご利用いただける新しい更新プログラムはありません。
プロジェクト 'xxx.Tests' の現在のパッケージ ソースで利用可能なパッケージ更新はありません。

'.NETFramework,Version=v4.6' を対象とするプロジェクト 'xxx' に関して、複数のパッケージの依存関係情報の収集を試行しています
依存関係情報の収集に 2.2 sec かかりました
複数のパッケージの依存関係の解決を試行しています。
依存関係情報の解決に 0 ms かかりました
複数のパッケージをインストールするアクションを解決しています
NuGet の操作の実行に 333.16 ms かかりました
'nuget.org' からパッケージ 'Microsoft.Net.Compilers 2.0.1' を取得しています。
  GET https://api.nuget.org/v3-flatcontainer/microsoft.net.compilers/2.0.1/microsoft.net.compilers.2.0.1.nupkg
パッケージ 'Microsoft.Net.Compilers 1.3.2' を 'packages.config' から削除しました
'Microsoft.Net.Compilers 1.3.2' が xxx から正常にアンインストールされました
  OK https://api.nuget.org/v3-flatcontainer/microsoft.net.compilers/2.0.1/microsoft.net.compilers.2.0.1.nupkg 1636 ミリ秒
Microsoft.Net.Compilers 2.0.1 をインストールしています。
パッケージ 'Microsoft.Net.Compilers.2.0.1' をフォルダー 'C:\Users\yyy\Documents\Visual Studio 2017\Projects\xxx\packages' に追加しています
パッケージ 'Microsoft.Net.Compilers.2.0.1' をフォルダー 'C:\Users\yyy\Documents\Visual Studio 2017\Projects\xxx\packages' に追加しました
パッケージ 'Microsoft.Net.Compilers.2.0.1' を 'packages.config' に追加しました
'Microsoft.Net.Compilers 2.0.1' が xxx に正常にインストールされました
パッケージ 'Microsoft.Net.Compilers 1.3.2' をフォルダー 'C:\Users\yyy\Documents\Visual Studio 2017\Projects\xxx\packages' から削除しています
パッケージ 'Microsoft.Net.Compilers 1.3.2' をフォルダー 'C:\Users\yyy\Documents\Visual Studio 2017\Projects\xxx\packages' から削除しました
NuGet の操作の実行に 12.27 sec かかりました
経過した時間: 00:00:16.9998777
```

追記:
`System.ValueTuple` も、パッケージ マネージャー コンソールでインストールする。

```
[xxx] >  install-package System.ValueTuple

'.NETFramework,Version=v4.5.2' を対象とするプロジェクト 'xxx' に関して、パッケージ 'System.ValueTuple.4.3.0' の依存関係情報の収集を試行しています
依存関係情報の収集に 9.58 ms かかりました
DependencyBehavior 'Lowest' でパッケージ 'System.ValueTuple.4.3.0' の依存関係の解決を試行しています
依存関係情報の解決に 0 ms かかりました
パッケージ 'System.ValueTuple.4.3.0' をインストールするアクションを解決しています
パッケージ 'System.ValueTuple.4.3.0' をインストールするアクションが解決されました
'nuget.org' からパッケージ 'System.ValueTuple 4.3.0' を取得しています。
パッケージ 'System.ValueTuple.4.3.0' をフォルダー 'C:\Users\yyy\documents\visual studio 2017\Projects\xxx\packages' に追加しています
パッケージ 'System.ValueTuple.4.3.0' をフォルダー 'C:\Users\yyy\documents\visual studio 2017\Projects\xxx\packages' に追加しました
パッケージ 'System.ValueTuple.4.3.0' を 'packages.config' に追加しました
'System.ValueTuple 4.3.0' が xxx に正常にインストールされました
NuGet の操作の実行に 1.52 sec かかりました
経過した時間: 00:00:02.4193522
```

## 確認した環境
- 日本語 Windows 10 Home 64ビット
- Microsoft Visual Studio Community 2017 - VisualStudio/15.0.0+26228.9
- .NET Framework 4.6.2, 4.5.2
- ASP.NET MVC 5.2.3