OmniAICreator/Qiita-1.07M huggingface dataset:
StackOverFlowの「MVPとMVCの違い」についての回答を読んでみた

MVPとMVCとかMVVMとかの違いについて自分は、あんまりちゃんと分かっていませんでした。

StackOverFlowの「What are MVP and MVC and what is the difference?」という質問の回答が2015/09/23現在、1213人がUsefulにしていて、他の場所でも紹介されていて、読んでみようと思いました。
自信がない場所が多いので、勘違いや間違っている箇所が多々あると思いますので、優しくご指摘をお願いします。。

自分は読んでみて、なんとなく違いがわかったのと、またMVPとPresentation Model(Model-View-ViewModel)の違いについても出てくるので勉強になりました。


What are MVP and MVC and what is the difference?
http://stackoverflow.com/a/101561

# Model-View-Presenter

PresenterにはViewのためのUIのビジネスロジックを書く

 - PresenterはViewをデリゲートしてイベントを受け取る
 - PresenterはViewから分離されている。Viewをinterfaceを通して操作する
   - なのでViewをモックとしてテストしやすい

Presenterの特徴

 - View→PresenterとPresenter→Viewをたくさん持っている。
   - 例 : "Save"Buttonクリック→ViewのイベントハンドラはPresenterにデリゲートされているので、Presenterで"OnSave"が呼び出される→セーブが終わったら、PresenterからInterfaceを通してViewにセーブされたよって表示する。

## 2つのMVPのバリエーション
MVPには２つのバリエーションが有ります。

### Passive View
Viewの中のロジックはなるべくなくして、PresenterをViewとModelを仲介させるようにして、Modelがデータに変更があったなどのイベントを発行して、Presenterがそれを受けて、PresenterがViewをアップデートします。完全にModelとViewが分離されています。
Viewには様々なセッターが存在して、View自体では状態を管理せず、Presenterが状態を管理します。

良い点 ViewとModelが綺麗に分かれていてとてもテストがしやすい。
悪い点 たくさんセッターを書かなくてはいけないなど大変です。

イメージ
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/e6dec446-85c5-eaaf-e27f-1880f67e11cf.png)


### Supervising Controller
データバインディングという仕組みを利用してModelからViewへのバインドする方法です。この場合Presenterで行っていたModelからViewへデータを渡すためのコードが必要なくなります。Presenterにはボタンをおした時のロジックやどこに移動するかのロジックなどが書かれていることになります。

良い点: データバインディングの力によりコードが減らせること
悪い点: データバインディングによりテストのしやすさが減ってしまう。ModelとViewが直接つながるのでカプセル化がうまく行えていない。

![image](https://qiita-image-store.s3.amazonaws.com/0/27388/65f06862-9921-68ee-56c1-6e509553a797.png)


## Model-View-Controller
MVCにおいてControllerは全てのアクションに対して応答するViewを決定する責任があります。
このMVCのMVPとの違いは二点あります。

* **ViewからPresenter(Controller)への呼び出しの流れが違う**  
MVCではViewの中のアクションがControllerを呼び出す関係となります。  
例えば、Webにおいて、Viewの中のアクションはURLの呼び出し、それに応答するControllerが処理を行います。そして、コントローラーが処理が終わると、正しいViewを返します。
以下の様な流れとなります。

```
    Viewの中のアクション
        -> Controllerの呼び出し
        -> Controllerのロジック
        -> Viewを返す
```


* **ViewがModelに(直接)つながらない**  
MVCではViewはシンプルに表示のみです。そして完全に状態を持ちません。Viewに対してのみのロジックがない、すなわちMVCの実装は、MVPだと絶対に必要なViewからPresenterへのデリゲートが無い点です。

イメージ
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/a5846c19-c18b-09aa-8f31-57946079c1c3.png)

## Presentation Model(Model-View-ViewModel)
もう一つの見ておくべきパターンとしてPresentation Modelパターンが有ります。このパターンにおいてPresenterは存在しません。その代わりViewはPresentation Modelと直接バインドします。  
Presentation Modelは表示するViewのために作られています。これによりModelとViewが直接つがらないので、MVPのSupervising Controllerの問題点のカプセル化の問題も解消することができます。  
この場合、Presentation ModelはModelからのイベントを購読しています。ViewはPresentation Modelから来たイベントを購読して、それを受けて更新を行います。  
Presentation Modelは幾つかのコマンドを公開することができます。そのコマンドはViewのアクションを呼び出すためのものです。このアプローチのいいところはPresentation ModelがViewの振る舞いを完全にカプセル化して、コードビハインドを削除できるということです。またModel-View-ViewModelパターンとも呼ばれます。

イメージ
![image](https://qiita-image-store.s3.amazonaws.com/0/27388/b7db2e31-6f41-67a4-39ca-6809c8414bd7.png)
circleci(Ubuntu 12.04)にimagemagickをパッケージからインストールする


## はじめに
circleci(Ubuntu 12.04)にimagemagickが必要になって、簡単にパッケージからインストールできないかなと思って、トライしたら意外とハマってしまったのと、決定的な記事がなかったので、備忘録として書き残しておきます。

## 成功した手順
最終的に`circle.yml`は下記のようになりました。

```yml
# circle.yml
dependencies:
  override:
    - sudo apt-get --reinstall install libept1.4.12
    - sudo apt-get install aptitude
    - DEBIAN_FRONTEND=noninteractive sudo aptitude -y install imagemagick libimagemagick libmagickcore libmagickcore-dev libmagickwand-dev
```

## 経緯
ここからは経緯なので、興味のある方はどうぞ。

### aptitudeからimagemagickをインストール
はじめ、`apt-get install imagemagick`でいけるだろうと思っていたら、エラーになってしまったので、下記の記事を見て、`aptitude`からのインストールを試みました。
[Ubuntu12.04でimage-magickとrmagickを入れる](http://qiita.com/yuiseki/items/55bded2e32d07aef23ab)

### libept1.4.12の再インストール
次に、`libept.so.1.aptpkg4.12`の読み込みに失敗します。

```bash
$ sudo apt-get install aptitude
$ sudo aptitude -y install imagemagick libimagemagick libmagickcore libmagickcore-dev libmagickwand-dev

aptitude: error while loading shared libraries: libept.so.1.aptpkg4.12: cannot open shared object file: No such file or directory sudo aptitude install imagemagick libimagemagick libmagickcore libmagickcore-dev libmagickwand-dev returned exit code 127
```

下記の記事を参考に、libept1.4.12の再インストールを試みます。
[synaptic: error while loading shared libraries: libept.so.1.aptpkg4.12](http://askubuntu.com/questions/339998/synaptic-error-while-loading-shared-libraries-libept-so-1-aptpkg4-12)

### コマンド中の対話を省略（noninteractive）
そして、今度は、コマンド中に対話を求められて、止まってしまいます。
`-y`オプション付けているのに、ダメっぽいです。

```bash
$ sudo apt-get --reinstall install libept1.4.12
$ sudo apt-get install aptitude
$ sudo aptitude -y install imagemagick libimagemagick libmagickcore libmagickcore-dev libmagickwand-dev

Couldn't find any package whose name or description matched "libimagemagick"
Couldn't find package "libmagickcore".  However, the following
packages contain "libmagickcore" in their name:
  libmagickcore-dev libmagickcore-dev:i386 libmagickcore-extra 
  libmagickcore-extra:i386 libmagickcore4-extra libmagickcore4-extra:i386 
  libmagickcore5-extra libmagickcore5-extra:i386 libmagickcore4 
  libmagickcore4:i386 libmagickcore5 libmagickcore5:i386 
  
（中略）

      Leave the following dependencies unresolved:
26)     pfstools recommends pfstmo                
27)     pfstools recommends octave3.2             
28)     pfstools recommends octave-signal         
29)     pfstools recommends octave-pfstools       



Accept this solution? [Y/n/q/?]  <-ここでビルドが止まる
```

下記の記事をみて、`DEBIAN_FRONTEND=noninteractive`を付け加えてようやくインストールできました。
[Disable pop-ups for an unattended/non-interactive apt-get install in Ubuntu/Debian](http://languor.us/disable-pop-ups-unattended-non-interactive-apt-get-install-ubuntu-debian)

## おわりに
本家サイト（imagemagic.org）には、ubuntuのbinaryパッケージはないので、やっぱりソースからビルドするのが正しいんでしょうね。

http://imagemagick.org/script/binary-releases.php
例外を握りつぶす

基本的に「例外を握りつぶす」のは禁じ手に近いですが、まれに必要となる場面があります。

# 「例外を握りつぶす」≠「例外に何もしない」
まず、「例外を握りつぶす」というのはどういうことなのか、例として書いておきます。

```java:握りつぶし
void someMethod()
{
    try
    {
        //何か例外が発生する処理
    }
    catch(SomeException e){}
}
```

このように、「例外を`catch`するけどその中では何もしない」ことを指して「握りつぶす」と呼びます。これは、そもそも`try`-`catch`を書かないのとは**全く違う行為**です。

そもそも例外を`catch`しなければ例外は呼び出し元に渡り、さらに処理できるところへと向かっていきます。上位層で処理できればもちろんそれで一件落着ですし、最終的に何もなければ処理系側で異常終了の処理となります。一方、握りつぶした場合は例外が闇に葬られ、何事もなかったことにして処理は続行してしまいます。

必要がなければ例外処理を書かずに上位層へ任せればいいだけです（特に、本当に「例外的」であって対応不能なもの、あるいはプログラムミスでなければ起き得ないものはどこでもキャッチせずに異常終了あるいはデバッガに渡したほうがいいでしょう）。

# 握りつぶす「意味」
それでは例外を握りつぶすと何が起きるのでしょうか。

* 例外が発生したことを、ユーザー・プログラマ含め、誰も知ることができません[^1]。
* プログラムはそのまま実行され続けます。

つまり、握りつぶしてもいい例外というのは、「例外が起きたとしても、誰にも知らせる必要もないし、何もせずにそのままプログラムを流していい」、そんな例外に限られます。RubyやPythonには、`StopIteration`という、イテレータが終了したことを知らせる例外がありますが[^2]、こういうのはむしろ「握りつぶす」ためにある[^3]、異質な（例外的状況を示すのではない）例外です。

そういう状況以外で握りつぶして問題ない例外は、「環境によって呼べる呼べないが変わるけど、呼べなくても別に誰かへ知らせるほどでないメソッドの呼び出しに失敗した場合」とか「入力ファイルのクローズに失敗した場合」、「ファイナライザの後片付けに失敗した場合」[^4]など、ごく限られたものです。

# Java特有の事情…検査例外
ここで1つややこしいのが、Javaには「検査例外」と呼ばれる種類の例外があって、これらはメソッドが投げる場合にはその旨を宣言しなければならないということです。つまり、検査例外を投げるメソッドを呼び出した場合、「呼んだメソッド自身が同じ例外を投げると宣言する」あるいは「内部で`catch`してその例外は外に投げない」の2つの選択肢しかなく、正しく対処しなければコンパイルが通りません。

ただし、起きると宣言されていても「これは絶対に起きない」と確信を持って言える場面もあるかと思います。たとえば、あるクラスについて、どうしても外部から、ドキュメント化もされている`protected`メソッドを呼ばないといけなくなったとします。ここでメソッドを取得するために`getDeclaredMethod()`を呼べば、検査例外として`NoSuchMethodException`が宣言されています。しかし、ドキュメント化もされているメソッドである以上、これに失敗するケースというのは考えられない…となって、例外を握りつぶしたくなるかもしれません。

ここでさらに考えを進めてみると、この呼び出しで`NoSuchMethodException`となるケースは、「呼ぶメソッド名やシグネチャを間違えていた」という凡ミスを別とすれば、「互換性が崩れるほどの改変がクラスライブラリに入った」「間違ったライブラリをロードしてしまった、あるいは攻撃者が不適切なライブラリに差し替えた」など、どう考えてもプログラムの実行を続けるべきでない、**かなり致命的な事態**であることがわかります。このような場合はちょうどいい**エラー**として`NoSuchMethodError`がありますので、それを投げましょう。**`Error`**は検査例外ではない（そもそも例外ですらない）のでどこからでも投げられますし、一般に例外処理の過程で`Error`はキャッチしませんので、ちゃんとそこでプログラムを終わらせてしまうことができます。


[^1]: もっとも、変数値などで伝わる、ということはありえます。
[^2]: Rubyの`enumerator`では`hasNext`のようなメソッドがなく、（数を数えるという原始的な方法を除けば）この例外でしか終了を知ることができません。
[^3]: Rubyでは、`loop{}`のブロック内で`StopIteration`が起きると、その例外は`loop`が握りつぶしてしまって、平然とループを終了します。
[^4]: Javaの場合は、何もしなくてもファイナライザが投げた例外は闇へと消えていってしまいます。
MySQL Native Driver を調べてみた

# MySQL Native Driver とはなんだ？

PHPマニュアルの「Mysqlndの概要」 (http://php.net/manual/ja/mysqlnd.overview.php )には、以下の様に説明されていた。

> MySQL データベースに接続するための API を提供するのは、 MySQL 拡張モジュールや mysqli そして PDO MYSQL です。これらの拡張モジュールが、MySQL Native Driver を使って MySQL サーバーと通信できるようになったということです。

とすると、mysqli や PDO MYSQL のMySQLドライバーは、なんだったんだ？ 
∑(￣[]￣；)!ﾎｴｰ!!

この疑問に対して、PHPマニュアルの「インストール手順」( http://php.net/manual/ja/mysql.installation.php )では、PHP 5.3以降では、デフォルトで mysqlndなんだそうだ。
自分の使っているPHPのバージョンを調べると、以下のとおりなので、間違いなく Native Driver を使っているはずだ。

```
root@vagrant-ubuntu-trusty:/etc/php5/fpm# php -v
PHP 5.5.9-1ubuntu4.11 (cli) (built: Jul  2 2015 15:23:08) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
```

コマンドラインから、phpinfo()関数をコールして確認してみると、次のとおり有効(enabled)になっている。

```
root@vagrant-ubuntu-trusty:/etc/php5/fpm# php -r 'phpinfo();' |grep mysqlnd
/etc/php5/cli/conf.d/10-mysqlnd.ini,
Client API version => mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $
Client API library version => mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $
mysqlnd
mysqlnd => enabled
Version => mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $
Loaded plugins => mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_sha256_password
mysqlnd statistics =>  
Client API version => mysqlnd 5.0.11-dev - 20120503 - $Id: bf9ad53b11c9a57efdb1057292d73b928b8c5c77 $
```

以上、知らないうちに、Native Driver を使っていたわけだ。(ﾟ-ﾟ;)ｳｰﾝ 


# Native Driver のプラグインが便利そう！

PHPマニュアル 「MySQL Native Driver プラグインAPI」(http://php.net/manual/ja/mysqlnd.plugin.php )によると、ネイティブ・ドライバーのプラグインには沢山の種類がある。

 既にたくさんの mysqlnd プラグインが利用可能になっています。以下が含まれます。

    PECL/mysqlnd_mc - 複数接続ができるプラグイン
    PECL/mysqlnd_ms - マスタースレーブ構成用のプラグイン
    PECL/mysqlnd_qc - クエリキャッシュプラグイン
    PECL/mysqlnd_pscache - プリペアドステートメントハンドルをキャッシュするプラグイン
    PECL/mysqlnd_sip - SQLインジェクションから防御するためのプラグイン
    PECL/mysqlnd_uh - ユーザーハンドラープラグイン

これは試してみなければ、なるまい！
PowerShellで例外をキャッチしてエラーメッセージをイベントログに出力する


PowerShellで例外をキャッチしてエラーメッセージをイベントログに出力しておくと、なんかあとあとデバッグが捗る。

PowerShellで汎用的に例外をキャッチするには、なんか処理のあとに `trap[Exception]` でキャッチすれば、なんでも拾える。なんか処理の部分を特にtryとかで囲う必要はないです。
このとき `$error[0].exception` にエラーメッセージが入ってるので、これをイベンログに出力しておけばOK。イベントログを書くのは `Write-EventLog` で書く。

```ps1
# なんか処理
...

# 例外をイベントログに出力
trap [Exception] {
    Write-EventLog -LogName Application -Source MyApp -EventId 1 -EntryType Error -Message $error[0].exception
}
```

`Write-EventLog` で使うイベントソース（この例だとMyApp）は予めイベントログに登録しておく必要がある。（登録されていないものを指定するとエラーになる）

イベントソースの登録はPowerShellからやるには `New-EventLog` というのがあるのだけど、これは既に登録されてる場合にはエラーになるので、登録されていない場合だけ実行というハンドリングをしないといけなくて若干面倒くさいです。

簡単なのは、ツールのインストール処理とかに 複数回実行しても問題ない`eventcreate` コマンドでイベントログ出力をコマンドラインから1回実行しておくとソースが登録されるので、これが一番簡単かもです。

```bat
C:¥> eventcreate /l Application /so MyApp /t information /id 1 /d "create eventlog" > nul
```
PhpStormでgit使おうとしたらエラー


もう半月以上前だけどもPhpStormで認証通したと思ったらエラーが起きた。fetchできない。

```
Push failed Failed with error: fatal: Could not read from remote repository.
```

どうやらIntelliJ系列でgitを使おうとすると起きることらしい。
[Android Studio - Push failed: fatal: Could not read from remote repository](http://stackoverflow.com/questions/24688700/android-studio-push-failed-fatal-could-not-read-from-remote-repository)

設定の`SSH executable`を`Build-In`から`Native`に変更することで使えるようになります。

![Kobito.kOxhdB.png](https://qiita-image-store.s3.amazonaws.com/0/58800/c3ced4ba-66ce-4072-0681-9700326bf781.png "Kobito.kOxhdB.png")

今まで使えてたものがなんで急に使えなくなったのかの原因はわかりませんが、周りであたらしくインストールした人がみんな発生したので短いですが記事にしました。MacでもUbuntuでも発生しました。

あとMacユーザーの中にはXcodeのインストールがうまくいっていなかっただけっぽい人もいました。


前記事 - [ラクして環境構築するためのScotch-Boxが2.0になってかなり進化してた。](http://qiita.com/naru0504/items/560a150943d2251e1ae8/?next)

PHPerに送りたい記事 - [インドでのPHP事情 - 日本以外にもPHPが人気な国があるんです。](http://qiita.com/naru0504/items/9bd56998a187d101a777?psgit)
PowerShellでWindowsPCの端末情報(OSバージョン/モデル型番/シリアル番号など)を取得する


WindowsPC端末の情報(OSバージョン/モデル型番/シリアル番号など)を取得する処理をPowerShellで書いたので貼っておく。
情報源は WMI経由で取得できる `Win32_OperatingSystem`/`Win32_ComputerSystem`/`Win32_BIOS` あたり。
他にも足りないものあるかもだけど、とりあえずPC端末管理目的ならこれぐらい取っておけば十分かなと。

```ps1
function Check-SystemInfo{
    $systemInfo = @{}
    # Date
    # チェック実行日時
    $systemInfo["CheckDateTime"] = Get-Date -Format "yyyyMMdd_HHmmss"

    # Environment
    # ホスト名
    $systemInfo["EnvComputername"] = $env:computername
    # ユーザ名
    $systemInfo["EnvUsername"] = $env:username

    # OS
    $os = Get-WMIObject -Namespace "root/CIMV2" -Query "SELECT * FROM Win32_OperatingSystem"
    # OS名称
    $systemInfo["OsCaption"] = $os.Caption
    # OSバージョン
    $systemInfo["OsVersion"] = $os.Version
    # OSアーキテクチャ（ビット数）
    $systemInfo["OsArchitecture"] = $os.OSArchitecture
    # OSインストール日
    $systemInfo["OsInstallDate"] = $os.InstallDate
    # 最終起動日時
    $systemInfo["OsLastBootUpTime"] = $os.LastBootUpTime

    # Computer
    $computer = Get-WMIObject -Namespace "root/CIMV2" -Query "SELECT * FROM Win32_ComputerSystem"
    # メーカー
    $systemInfo["ComputerManufacturer"] = $computer.Manufacturer
    # モデル
    $systemInfo["ComputerModel"] = $computer.Model
    # Windowsドメイン（ワークグループ）
    $systemInfo["ComputerDomain"] = $computer.Domain
    # 所有者（通常PCを初期セットアップ時に作成したアカウント名が表示される）
    $systemInfo["PrimaryOwnerName"] = $computer.PrimaryOwnerName

    # BIOS
    $bios = Get-WMIObject -Namespace "root/CIMV2" -Query "SELECT * FROM Win32_BIOS"
    # シリアル番号（ユーザ名とコンピュータ名は利用者が指定できるので端末の一意性を特定する情報）
    # VirtualBoxだと0が出力されてる
    $systemInfo["BiosSerialNumber"] = $bios.SerialNumber

    return $systemInfo
}
```
EasyTouchをuGUIの上では動作させないようにする方法

![20150923222656.png](https://qiita-image-store.s3.amazonaws.com/0/67575/949edf9a-6801-833d-c10e-318de098f082.png)
こういう風にやるだけ
Unity UI compatibiltyにチェックするだけでok
DjangoでPostgreSQLを使えるようにしたときのメモ

環境：Debian8.2, Python3.4(virtualenv上に構築)

**1, Djangoのインストール・新規プロジェクト作成**
` pip install Django` 
` django-admin startproject hoge`

**2, PostgreSQLのインストール**
` apt-get install postgresql` 

**3, libpq-devのインストール**
（libpqは、C言語でつくられたPostgreSQL用インターフェイス。
各種アプリケーションインターフェイスのためのエンジンで、これがないと
PythonからPostgreSQLを使うことができない）

`apt-get install libpq-dev`

**4, psycopg2のインストール**
（psycopg2は、Python用のPostgreSQLアダプタ。これがないと以下略）

`apt-get install python-psycopg2`
`pip install psycopg2`

**5, PostgreSQLに新しいユーザ、パスワードを作成**
（PostgreSQLにスーパーユーザでログインし、
Djangoプロジェクトで利用するデータベース、ユーザを作成する）

`su - postgres`
`psql`（PostgreSQL対話モードにスーパーユーザでログイン）
`CREATE ROLE testuser WITH PASSWORD 'testpasswd';`（ユーザの作成）
`CREATE DATABASE fuga OWNER testuser ENCODING 'UTF8';`（データベースの作成）

PostgreSQLのコマンド詳細については
https://www.postgresql.jp/document/9.4/html/sql-commands.html

**6, Django設定ファイルにデータベースの設定を書き込む**
1で作成したhogeプロジェクト内のsettings.pyで、
以下のようにデータベース設定を変更

```python:settings.py
DATABASES = {
    'default': {
         'ENGINE': 'django.db.backends.postgresql_psycopg2',
         'NAME': 'fuga',
         'USER': 'testuser',
         'PASSWORD' : 'testpasswd',
         'HOST' : '127.0.0.1',
         'PORT' : 5432,
     }
 }
```

**7, マイグレーションの実行**
`python manage.py migrate`
を実行し、エラーが出なければOK。
PowerShellでスクリーンセーバーが有効になってるか確認する


スクリーンセーバーの設定が有効になってるか、復帰時にパスワード入力が必須になってるかチェックする処理をPowerShellで書いたので貼っておきます。

スクリーンセーバーの設定はWMI経由で `root/CIMV2` の `Win32_Desktop` から取得できます。
ポイントとしてデスクトップの設定はユーザごとにプロファイルが分かれてるので、現在ログイン中のユーザ設定を取得して絞込をします。

```ps1
function SubCheck-ScreenSaver($sleepThresholdSec){
    # スクリーンセーバーの設定はユーザプロファイル単位に存在するので、現在ログイン中のユーザの設定を取得する
    $computername = $env:computername
    $username =  $env:username
    $desktop = Get-WmiObject -Namespace "root/CIMV2" -Query "SELECT * FROM Win32_Desktop WHERE Name = ""$computername\\$username"""
    # スクリーンセーバのプログラム
    # （なし）= 
    # 3Dテキスト = C:\Windows\system32\ssText3d.scr
    # バブル = C:\Windows\system32\Bubbles.scr
    # ブランク = C:\Windows\system32\scrnsave.scr
    # ラインアート = C:\Windows\system32\Mystify.scr
    # リボン = C:\Windows\system32\Ribbons.scr
    # 写真 = C:\Windows\system32\PhotoScreensaver.scr
    $screenSaver = @{}
    $screenSaver["ScreenSaverExecutable"] = $desktop.ScreenSaverExecutable
    # 待ち時間（秒）
    $screenSaver["ScreenSaverTimeout"] = $desktop.ScreenSaverTimeout
    # 再開時にログオン画面に戻る（＝復帰時のパスワード入力を必須にする）
    $screenSaver["ScreenSaverSecure"] = $desktop.ScreenSaverSecure

    # チェック判定
    if (($screenSaver["ScreenSaverExecutable"] -ne $null) -and
        ($screenSaver["ScreenSaverTimeout"] -le $sleepThresholdSec) -and
        ($screenSaver["ScreenSaverSecure"] -eq $True)) {
        $screenSaver["ScreenSaverCheckStatus"] = "OK"
    } else {
        $screenSaver["ScreenSaverCheckStatus"] = "NG"
    }
    return $screenSaver
}
```
ガード節(ガード, Guard）

# ガード節(ガード, Guard）

## はじめに

ある特定の言語にはガードと呼ばれる仕組みがあります。

[ガード (プログラミング) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%BC%E3%83%89_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0))

### プログラム言語Haskellの例

Before

```haskell
describeLetter :: Char -> String
describeLetter c =
    if c >= 'a' && c <= 'z'
        then "Lower case"
        else if c >= 'A' && c <= 'Z'
            then "Upper case"
            else "Not an ASCII letter"
```

After

```haskell
describeLetter :: Char -> String
describeLetter c
   | c >= 'a' && c <= 'z' = "Lower case"
   | c >= 'A' && c <= 'Z' = "Upper case"
   | otherwise            = "Not an ASCII letter"
```

https://en.wikibooks.org/wiki/Haskell/Control_structures

if, caseなどの構文でも記述できるのですが、関数呼び出しをガードするための構文のため、目的を明確化することができます。

## ガードの仕組みが存在しない言語でも意識する

前述のとおり、if, caseなど他の構文で代用できるため、最近の言語には仕組みが導入されていません。

ただし、外部からの呼び出しを関数内部でブロックする目的の制御は有効なため、コード記述時には意識してみましょう。

Before（大げさに）

```php
function isAdult($age){
    if(!empty($age)){
        if(is_numeric($age)){
            if($age > 0 && $age < 100){
                return ($age > 19);
            }
        }
    }

    return false;
}
```

After

```php
function isAdult($age){
    if(empty($age)){
        return false;
    }

    if(!is_numeric($age)){
        return false;
    }

    if($age < 1 || $age > 100 || ){
        return false;
    }

    return ($age > 19);
}
```

ネストが浅くなりました。

ただし、行数が多くなったため、一概に良いとはいえません。また、呼び出し元と関数内部の両方でエラーチェックした場合、コードが冗長になります。

システムに求められる重要度やバランスを見て、方針を統一してコーディングするのが良さそうです。
Vagrantを使ってCentOS6.7上でPHPビルトインサーバーを動かす

Vagrant上でPHPの簡単な動作確認をするためのローカル開発環境構築手順をまとめています。

*前提：VirtualBoxとVagrantのインストールが終わっていること。*

#CentOS6.7サーバーの作成
phptestという名前でcentos6.7環境をつくります。

```bash:ターミナル
cd myVagrant   //Vagrantをインストールしたディレクトリ
mkdir phptest
cd phptest
vagrant init bento/centos-6.7
vi Vagrantfile   //IPアドレス行のコメントアウトをxキーで外して:wqで保存。
vagrant up
vagrant ssh
```
CentOSにログインできたと思うので、PHPをインストールします。この時`sudo yum -y install php`でインストールしてしまうとPHP5.3となってビルトインサーバーを使えないので、既存のPHPモジュールを削除してから新しくPHP5.6をインストールします。

```bash:vagrant上
sudo yum remove php*
sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo yum install php --enablerepo=remi-php55   //約8MBのダウンロード
php -v
```
PHP5.6のインストールが終わったら、PHPビルトインサーバーをたちあげてテストファイルをアップロードし、ブラウザで表示してみます。

```bash:vagrant上
ifconfig   //eth1に割り当てられたIPアドレスは192.168.33.10
pwd    //今いるディレクトリがドキュメントルートになる
php -S 192.168.33.10:8000
```
sftpでindex.htmlなどをアップロードしたら、ブラウザで`http://192.168.33.10:8000/`にアクセスして表示を確認します。

以上です。
RSpecで`while line = gets`をテストする方法


RSpecで`while line = gets`のような標準入力のループをテストするには以下のコードを書く。
`gets`はEOFが入力された時には（EOFに到達した時には）`nil`を返すので、`["line1", "line2", nil]`のような配列を使う。


テストしたいコード：

```ruby
def foo
  ary = []
  while line = gets
    ary << line.chomp
  end
  ary
end
```

テストコード：

```ruby
it "標準入力を行ごとに配列にして返す" do
  inputs = ["line1", "line2", nil].to_enum
  allow(ARGF).to receive(:gets) { inputs.next }
  expect(foo).to contain_exactly("line1", "line2")
end
```


同様に、`while line = Readline.readline`などの場合にもこの方法は使える。


テストしたいコード：

```ruby
def bar
  ary = []
  while line = Readline.readline
    ary << line.chomp
  end
  ary
end
```

テストコード：

```ruby
it "標準入力を行ごとに配列にして返す" do
  inputs = ["line1", "line2", nil].to_enum
  allow(Readline).to receive(:readline) { inputs.next }
  expect(bar).to contain_exactly("line1", "line2")
end
```
ユーザースタック

### ユーザースタック
mainの前はスタートアッププログラム

#### スタートアッププログラムのユーザースタック領域
どんなもので構成されているのか
---------------------------[スタートアップスタックフレーム]
環境変数文字列
コマンドライン引数
・
・
envp[0]~envp[n]
それぞれ環境変数文字列さしている
argv[o]~argv[n]
コマンドライン引数をさしている
argc
戻りアドレス？
---------------------------[mainスタックフレーム]
元のebp
calee-saveレジスタ
ローカル変数
・
・
・

んー間違っていそう。今度実際に値をみてみようと思います。
Vagrant環境構築

# Vagrant環境構築

## 環境
* OSX Yosemite (10.10.5)
* VirtualBox 5.0.4
* Vagrant 1.7.4

## セットアップ
1. VirtualBoxをインストールする
https://www.virtualbox.org/

2. Vagrantをインストールする
https://www.vagrantup.com/

## Vagrantの使い方

### 仮想マシンを作成してSSH接続する

1. Vagrantfileの作成  
Vagrantプロジェクトのルートディレクトリに、Vagrantfileを作成する。
使用するboxをBOXNAMEで指定する。boxについては後述。

```
$ mkdir PROJECTNAME
$ cd PROJECTNAME
$ vagrant init BOXNAME
```

2. 仮想マシンの開始
```
$ vagrant up
```

3. 仮想マシンへのSSH接続
```
$ vagrant ssh
```

### 仮想マシンのシャットダウン
仮想マシンのシャットダウン
```
$ vagrant halt
```

### 仮想マシンの削除
仮想マシンの削除
```
$ vagrant destroy
```

## boxの使い方
boxとは、仮想マシンの雛形のこと。この雛形がクローンされて、仮想マシンがセットアップされる。

|目的    |コマンド |説明     |
|--------|-------|--------|
|box追加|`$ vagrant box add NAME URL`| *URL*のboxを、*NAME*という名前でVagrantに追加する<br><br>以下のサイトには、利用可能なboxがたくさん登録されている<br>http://www.vagrantbox.es/
|box削除|`$ vagrant box remove NAME`|Vagrantから*NAME*のboxを削除する|
|box一覧|`$ vagrant box list`|Vagrantにインストールされている、全てのboxを一覧表示する|
|古くなったbox確認|`$ vagrant box outdated`|現在利用しているVagrant環境で、古くなっているboxがあるかどうか表示する|
|box再パッケージ|`$ vagrant box repackage NAME PROVIDER VERSION`|指定されたboxを再パッケージし、再配布できるようにする|
|boxアップデート|`$ vagrant box update`|アップデート可能なboxがある場合は、アップデートする|
gojiを使ってUNIXドメインソケットとかで起動したい


この前GoのWebアプリケーションフレームワークのgojiのソースコードを見ていてなるほど！と思ったので紹介します。

GoでtcpやUNIXドメインソケットやファイルディスクリプタをbindしたサーバーを立てたくなることはよくあります。そういう時は標準ライブラリの`net/http`の`net.Lister`を作るところだけ分岐すれば後は共通的に扱えます。
なので適当に`flag`で指定して、tcpなら`-tcp`で、UNIXドメインソケットなら`-sock`でみたいな感じで指定するのが普通だと思いますが、gojiはちょっと違います。

gojiではtcpでもUNIXドメインソケットでも`-bind`でbind先を指定します。そのときの判定処理が以下のようになっています。

[goji/bind.go at master · zenazn/goji](https://github.com/zenazn/goji/blob/master/bind/bind.go#L89-L113)

```go
func listenTo(bind string) (net.Listener, error) {
	if strings.Contains(bind, ":") {
		return net.Listen("tcp", bind)
	} else if strings.HasPrefix(bind, ".") || strings.HasPrefix(bind, "/") {
		return net.Listen("unix", bind)
	} else if strings.HasPrefix(bind, "fd@") {
		fd, err := strconv.Atoi(bind[3:])
		if err != nil {
			return nil, fmt.Errorf("error while parsing fd %v: %v",
				bind, err)
		}
		f := os.NewFile(uintptr(fd), bind)
		defer f.Close()
		return net.FileListener(f)
	} else if strings.HasPrefix(bind, "einhorn@") {
		fd, err := strconv.Atoi(bind[8:])
		if err != nil {
			return nil, fmt.Errorf(
				"error while parsing einhorn %v: %v", bind, err)
		}
		return einhornBind(fd)
	}

	return nil, fmt.Errorf("error while parsing bind arg %v", bind)
}
```

  * `:`が含まれていたらtcp
    * `:8080`とか`127.0.0.1:8080`とか
  * 先頭が`.`か`/`ならUNIXドメインソケット
    * `./tmp/server.sock`とか`/tmp/server.sock`とか
  * `fd@`から始まっていたらファイルディスクリプタで4文字目にファイルディスクリプタを続ける
    * `fd@8`みたいな指定でファイルディスクリプタを使える
  * `einhorn@`から始まっていたらEinhorn
    * こういうのもあるらしい

他にもやられている手法なのか知らないのですが、うまい指定方法だなーと思ったので参考になれば
PowerShellでBitLockerのHDD暗号化が有効かどうかを確認する


Windows標準で使えるHDD暗号化機能BitLockerの暗号化状態を取得してチェックする処理をPowerShellで書いたので貼っておく。

BitLockerの暗号化状態はWMI経由で `root/CIMV2/Security/MicrosoftVolumeEncryption` の `ProtectionStatus` から取得できる。
以下のサンプルではCドライブに絞り込んでるけど、WHEREを付けなければ全部のドライブが取得できる。

```ps1
function Check-VolumeEnc{
    $volumeEnc = @{}
    # Cドライブ以外のドライブが存在する場合もあるが、環境依存のためCドライブの暗号化状態のみチェックする
    $volume = Get-WMIObject -Namespace "root/CIMV2/Security/MicrosoftVolumeEncryption" -Query "SELECT * FROM Win32_EncryptableVolume WHERE DriveLetter='C:'"
    # BitLockerの暗号化状態
    $volumeEnc["ProtectionStatus"] = $volume.ProtectionStatus
    $statusMsg = ""
    switch ($volume.ProtectionStatus) {
        0 { $statusMsg = 'decrypted' }
        1 { $statusMsg = 'encrypted' }
        default { $statusMsg = "unknown status($($volume.ProtectionStatus))" }
    }
    $volumeEnc["ProtectionStatusMsg"] = $statusMsg

    # チェック判定
    if ($volume.ProtectionStatus -eq 1) {
        $volumeEnc["CheckStatus"] = "OK"
    } else {
        $volumeEnc["CheckStatus"] = "NG"
    }

    return $volumeEnc
}
```
PowerShellでウィルス対策ソフト(Windows Defender / Microsoft Security Essentials)のリアルタイム保護状態とウィルス定義ファイル状態が最新かどうか確認する


Windowsのウィルス対策ソフト（Windows Defender / Microsoft Security Essentials）の状態が最新になってるかチェックする処理をPowerShellで書いたので貼っておく。

Windows DefenderはWindows 8以降では標準で入ってます。Windows 7だとMicrosoft Security EssentialsがMicrosoft純正で無料で使えますが、明示的にインストールしないと使えないです。

Windowsのセキュリティセンターで認識されているウィルス対策ソフトの状態は、WMI経由で `root/SecurityCenter2` の `AntiVirusProduct` というところから取得できます。状態は `productState` という変数から取得できるのですが、16進数の6桁でビットに意味があるので、これをデコードします。Microsoft製品以外のベンダーのウィルス対策ソフトでは、このビットの意味が違う可能性が高いですが、そこまで調べられてません。


```ps1
function Check-AntiVirus{
    $antiVirus = @{}
    $antiVirusProduct = Get-WmiObject -Namespace "root/SecurityCenter2" -Query "SELECT * FROM AntiVirusProduct"
    # ウィルス対策ソフト
    # Windows Defender (Windows8標準）
    # Microsoft Security Essentials (Windows7標準)
    $antiVirus["AntiVirusDisplayName"] = $antiVirusProduct.displayName

    # ウィルス対策ソフトのタイムスタンプ
    # システムとセキュリティ＞アクションセンターで対策状況が問題ないかの判定日時
    # Windows Defenderだと設定されるが、Microsoft Security Essentialsだと値が設定されないので参考値
    $antiVirus["AntiVirusTimestamp"] = $antiVirusProduct.timestamp

    # ウィルス対策ソフトの状態
    $antiVirus["AntiVirusProductState"] = $antiVirusProduct.productState
    # productStateは16進数で6桁でビットに意味がある
    # 0-1桁目が製品区分
    # 2-3桁目がリアルタイム保護の状態
    # 4-5桁目がウィルス定義の状態
    # Windows Defender (Windows8標準の例）
    # 397568 (0x061100) = enabled and up to date
    # Microsoft Security Essentials (Windows7標準の例)
    # 397312 (0x061000) = enabled and up to date
    $antiVirusProductStateBit = ""
    if ($antiVirusProduct.productState) {
        $antiVirusProductStateBit = "{0:X6}" -f $antiVirusProduct.productState
        $antiVirus["AntiVirusProductStateBit"] = $antiVirusProductStateBit

        # リアルタイム保護の状態
        $stateRealTimeMsg = ""
        switch ($antiVirusProductStateBit.Substring(2,2)) {
            # Windows Defender (Windows8標準）
            "01" { $stateRealTimeMsg = 'disabled' }
            "11" { $stateRealTimeMsg = 'enabled' }
            # Microsoft Security Essentials (Windows7標準)
            "00" { $stateRealTimeMsg = 'disabled' }
            "10" { $stateRealTimeMsg = 'enabled' }

            default { $stateRealTimeMsg = "unkown state($antiVirusProductStateBit)" }
        }
        $antiVirus["AntiVirusProductStateRealTimeMsg"] = $stateRealTimeMsg

        # ウィルスおよびスパイウェア定義の状態
        $stateDefMsg = ""
        switch ($antiVirusProductStateBit.Substring(4,2)) {
            "00" { $stateDefMsg = 'up_to_date' }
            "10" { $stateDefMsg = 'out_of_date' }
            default { $stateDefMsg = "unkown state($antiVirusProductStateBit)" }
        }
        $antiVirus["AntiVirusProductStateDefMsg"] = $stateDefMsg
    } else {
        # productStateが未定義の場合はnillを埋める
        $antiVirus["AntiVirusProductStateBit"] = $null
        $antiVirus["AntiVirusProductStateRealTimeMsg"] = $null
        $antiVirus["AntiVirusProductStateDefMsg"] = $null
    }

    # チェック判定
    if (($stateRealTimeMsg -eq 'enabled') -and ($stateDefMsg -eq 'up_to_date')) {
        $antiVirus["CheckStatus"] = "OK"
    } else {
        $antiVirus["CheckStatus"] = "NG"
    }

    return $antiVirus 
}

```
RDFコンセプト ＆ シンタックス 抜粋


[RDF 1.1 Concepts and Abstract Syntax](http://www.w3.org/TR/rdf11-concepts/)
[RDF 1.1概念および抽象構文](http://www.asahi-net.or.jp/~ax2s-kmtn/internet/rdf/REC-rdf11-concepts-20140225.html)

## リソース関係

### Resource リソース
IRIまたはリテラル

	世の中("universe of discourse 議論領域")のすべての物事を示すことができる

### Refernt 指示対象
IRIによって識別される資源

以下IRIの指示対象を決定するためのガイドライン

+ IRIの範囲はグローバル
	+ 異なる2つのIRIは、同じ資源を表わすこともある（非唯唯一名仮説）
	+ この原理に反すると、IRIの衝突が発生する
+ 社会的な慣例により、IRIの所有者は、IRIの意図する指示対象が何かを述る
	+ アプリケーションやユーザは、この意図されている指示を順守する必要はない
	+ そうしない場合には、他のアプリケーションやユーザとの相互運用性が得られない可能性がある
+ IRIの所有者は、何を示すのかを説明した仕様やドキュメントにより、意図する指示対象を定める
	+ 意図する指示対象を伝えるよい方法は、そのドキュメントを逆参照できるようにIRIを設定すること
+ ドキュメントは、示される資源をRDFステートメントで記述したRDFドキュメントであるかもしれない
	+ （意味定義にRDFドキュメントも有り）

### リテラル値
リテラルで示される資源

### RDF statement RDFステートメント
RDFトリプルの言明

	述語によって示される関係が、主語と目的語により示される資源の間で成立するということを述べる
	述語自体はIRIであり、プロパティー、つまり、2項関係と見ることができる資源を表わします。

### RDF vocabulary RDF語彙
RDFグラフでの使用を目的としたIRIの集合

### RDF source RDF情報源
永続的ではあるが変更可能なRDFグラフの情報源やコンテナ

### RDF Document RDF文書

RDFドキュメントは、Turtle、RDFa、JSON-LDやTriGなどの具象RDF構文のRDFグラフまたはRDFデータセットをエンコードしたドキュメント

RDFドキュメントにより、システム間でRDFグラフとRDFデータセットとの交換が可能となる

## RDFグラフ
### IRI
Unicode文字列
絶対IRIでければならない

### URI と IRI の違いについて
#### URI

+ 広範囲のUnicodeを許可
+ すべてのIRIがURIだとは限らない
+ パーセントエンコーディング（URLエンコーディング）が必要

#### IRI
+ URIを一般化したもの
+ すべての絶対URIとIRLはIRI

### リテラル

基本構造は 字句形式(Unicode) + [データ型IRI] + [言語タグ]

	データ型無し 言語タグ有り → longString型
	データ型無し 言語タグ無し → string型

### RDF Dataset RDFデータセット

RDFデータセットは、RDFグラフの集合

+ RDFグラフである、きっかり1つのデフォルト・グラフ。デフォルト・グラフは、名前がなく、空でありえます（may）。
+ 0以上の名前付きグラフ。個々の名前付きグラフは、IRIまたは空白ノード（グラフ名）とRDFグラフで構成される対です。グラフ名は、RDFデータセット内で一意です。

空白ノードは、RDFデータセットのグラフ間で共有できます。
PowerShellでWindows Updateが有効かどうかと最終インストール日時を確認する


Windows UpdateがちゃんとされてるのかチェックしたくてPowerShellでチェック処理を書いたので貼っておく。

以下のスクリプトでは判定条件として「更新プログラムを自動的にインストールする」に設定されてる、もしくは「更新プログラムをチェックし、ダウンロードとインストールを行うかは自分で選ぶ」かつ「最終インストール日からの経過日時が31日以内」の場合にOKになるようになってるけど、情報が取れたら判定処理は好みで微調整して下さい。

ポイントは `Microsoft.Update.AutoUpdate` のCOMオブジェクトを生成して、そこからWindows Update関連のデータを拾ってくる。

```ps1
function Check-OsUpdate{
    $osUpdate = @{}
    $windowsUpdate = New-Object -ComObject "Microsoft.Update.AutoUpdate"
    # サービスの状態（常駐しているかの設定を確認してるだけなので自動更新する設定になっているかはNotificationLevelを見ないと分からない）
    $osUpdate["ServiceEnabled"] = $windowsUpdate.ServiceEnabled
    # 更新の設定
    $osUpdate["NotificationLevel"] = $windowsUpdate.Settings.NotificationLevel
    $NotificationLevelMsg =""
    switch ($windowsUpdate.Settings.NotificationLevel) {
        # 未設定
        0 { $notificationLevelMsg = 'not_configured' }
        # 更新プログラムをチェックしない（推奨されません）
        1 { $notificationLevelMsg = 'disabled' }
        # 更新プログラムをチェックし、ダウンロードとインストールを行うかは自分で選ぶ
        2 { $notificationLevelMsg = 'prompts_before_download' }
        # 更新プログラムをダウンロードし、インストールを行うかは自分で選ぶ
        3 { $notificationLevelMsg = 'prompts_before_installation' }
        # 更新プログラムを自動的にインストールする（推奨）
        4 { $notificationLevelMsg = 'automatically_installed' }
        # 不明
        default { $notificationLevelMsg = "unknown level($($windowsUpdate.Settings.NotificationLevel))" }
    }
    $osUpdate["NotificationLevelMsg"] = $notificationLevelMsg
    # 更新プログラムの最終チェック日時（GMTなので9時間ずれてる）
    $osUpdate["LastSearchSuccessDate"] = $windowsUpdate.Results.LastSearchSuccessDate
    # 更新プログラムのインストール日時（GMTなので9時間ずれてる）
    $osUpdate["LastInstallationSuccessDate"] = $windowsUpdate.Results.LastInstallationSuccessDate
    # 最終インストール日からの経過日時
    $osUpdate["LastInstallationElapsedDays"] = ((Get-Date) - $windowsUpdate.Results.LastInstallationSuccessDate).Days

    # チェック処理
    if (($windowsUpdate.Settings.NotificationLevel -eq 4) -or
        (($windowsUpdate.Settings.NotificationLevel -gt 1) -and ($osUpdate["LastInstallationElapsedDays"] -lt 31))) {
        $osUpdate["CheckStatus"] = "OK"
    } else {
        $osUpdate["CheckStatus"] = "NG"
    }
    return $osUpdate
}
```
リストとデータベース　基本

##ListViewにデータを表示するには


#### 非同期処理を行う

 **CursorLoaderを使う。**

 つまり、Activityと同期せず処理をする。
 
####同期処理の場合
データベースに問い合わせている間にAcitivtyが固まってしまう。

そしてCursorLoaderを使う場合、アダプタはCursorAdapterを用いる。


###ContentProvider

CursorLoaderはデータベースに直接アクセスできないため、
ContentProviderを使う
Androidデータベース基本


##まず

データベースを使うには **contract**

と

データベースの操作をするための **openHelper** 

必要

##Contract

インスタンスされることはないので
クラスのアクセス修飾子を **final**にする。

どうようにコンストラクターが使わないので空のコンストラクターを作る。


```
public class MyMemoContract {
    public MyMemoContract() {}

    public static abstract class Memos implements BaseColumns {
        public static final String TABLE_NAME = "memos";
        public static final String COLUMN_ID = "_id";
        public static final String COLUMN_TITLE = "title";
        public static final String COLUMN_BODY = "body";
        
```


##openhelper

SQLOpenHelperを継承して,
*　データベースの名前
* データベースのバージョン
* Tableの削除、初期化、作成


##ContentProvider



###URI
コンテントプロバイダーを使う際にどのContentProviderの、どのテーブルのどのデータを使うかを
CONTENT_URIという変数で識別する。


###URIMather

コンテントプロバイダーにアクセスするときに、
CONTENT_URIを確認したり、CONTENT_URIに応じて処理を分岐させるための仕組み。
cardboardSDK for Android のライセンス表記

Androidアプリでオープンソースのライブラリなどを利用するときはライセンスを明記する必要がある。しかし、書くべきことを明記してあるものもあるが、記述方法が書いてなかったり、記述方法がわかりにくいもののがある。よくわからないから、ライセンス表記を省略してしまうと違反になってしまうので注意が必要である。

最近、私が調査したライセンスで分かりづらいものがあったので、この場で共有しようと思う。

### **「cardboardSDK for Android」**
- Googleが提供しているcardboardのためのビューを簡単に作るためのライブラリを提供してくれる
- cardboard.jarとlibprotobuf-java-2.6-nano.jarからなる
- 次のURLにてサンプルコードと共に入手することができる　
    - [cardboard ダウンロードとサンプル](https://developers.google.com/cardboard/android/download?hl=ja)

### cardboardSDKのライセンスを調査する上で困ったこと
- cardboardのHPでサンプルコードのライセンスしか見つからない
- Googleのあらゆるサービスを提供しているGoogle Developers(親サイト)にも明記されていない
- Googleのあらゆるフォーラム(ユーザに質問したり、アドバイスあいたりできる場)でも質問されていない
- (↑で似たような質問を発見したが、明確な答えがなく、直接問い合わせたほうがよいとアドバイスされていた...)
- Googleのサイトのどこにも直接問い合わせるようなフォームが見当たらない


### Google+の「Cardboard & VR Developers」コミュニティ
そこで...cardboardのコミュニティに質問を投げてみたところ、Googleの人から返信をいただけた。名前の横に"管理メンバー"とあることから、このコミュニティを管理している人のよう。
メンションをつけて返信すると**4**分で返事が返ってきた。とてもやさしい、感動。

### 「cardboardSDK for Android」のライセンス
- cardboard.jar : Apache2.0
- libprotobuf-java-2.6-nano.jar : カスタムライセンスであり、以下のページで確認可能とのこと　https://github.com/google/protobuf/blob/master/LICENSE﻿

### まとめ
- Googleのサービスを利用するときにライセンスが明記されていないことがある。そんなときはそのサービスのコミュニティで思い切って聞いてしまうと手っ取り早い。
- 実際に書き込んでいる人が外国の人ばかりだったので、"NEED HELP"とか言って、使い慣れない英語で会話してたけれども、日本語でも良かったのではないかと今は思っている。
- 拙い英語に丁寧に回答してくれたGoogleの方に感謝。

＊cardboardSDKを利用する方のお役に立てれば、とてもうれしい＊
browserify(coffeeify)からUglifyJS2を経由してbundle.min.js.mapを作るレシピ

bowerでリリースする場合`.js`, `.min.js`, `.min.js.map`の３種類をアップロードする形式を時々見ますが、`browserify`したコードを圧縮、かつソースマップ付きでリリースする方法が中々見つからなかったので、以下、解決方法です。

```
.
├── bundle.js
├── bundle.js.map
├── bundle.min.js
├── bundle.min.js.map
└── index.coffee
```

手順としては

* `browserify`の`--debug`オプションでインラインソースマップを生成
* `bundle.js.map` < `exorcist`で生成したインラインソースマップをファイルに変換
* `bundle.js` < 普通に`browserify`する
* `bundle.min.js` < `uglifyjs`で`bundle.js`を圧縮。そのさい、`--in-source-map`オプションで`bundle.js.map`を食わす
* `bundle.min.js.map` < ソースマップの再出力先を`--source-map`で定義

# 動作確認方法

```json
{
  "name": "uglify-with-map",
  "scripts": {
    "start": "browserify index.coffee --transform coffeeify --debug | exorcist bundle.js.map -b . > bundle.js",
    "poststart": "uglifyjs bundle.js --in-source-map bundle.js.map --mangle --compress --output bundle.min.js --source-map bundle.min.js.map"
  },
  "dependencies": {
    "browserify": "^11.1.0",
    "coffeeify": "^1.1.0",
    "exorcist": "^0.4.0",
    "uglify-js": "^2.4.24"
  }
}

```

以下のようにコマンドを実効するだけです。

```bash
echo 'this is coffee script' > index.coffee
tree .
# .
# ├── index.coffee
# └── package.json

npm install
# ...
npm start
# browserify index.coffee --transform coffeeify --debug | exorcist bundle.js.map -b . > bundle.js
# uglifyjs bundle.js --in-source-map bundle.js.map --mangle --compress --output bundle.min.js --source-map bundle.min.js.map

tree . -L 1
# .
# ├── bundle.js
# ├── bundle.js.map
# ├── bundle.min.js
# ├── bundle.min.js.map
# ├── index.coffee
# ├── node_modules
# └── package.json
```

生成した`bundle.min.js`を適当に`index.html`で読み込むと

```html:index.html
<script src="bundle.min.js"></script>
```

![スクリーンショット 2015-09-23 18.31.26.png](https://qiita-image-store.s3.amazonaws.com/0/28576/2e0b4313-ab63-513f-bdff-633ca54b576c.png "スクリーンショット 2015-09-23 18.31.26.png")

上記のように、コンパイル元の行数が表示されて、ソースマップが移植できたことが確認できます。

> `npm install`した`browserify`などのコマンドは、`npm scripts`経由でないと動作しないことに注意してください。

# プログラム経由でやる場合

上記コマンドと同等の処理をプログラムで行う場合は、下記のようになります。

```bash
tree . -L 1
# .
# ├── index.coffee
# ├── node_modules
# ├── package.json
# └── task.js

node task.js
```

```javascript:task.js
// Dependencies
var browserify= require('browserify');
var exorcist= require('exorcist');
var uglifyjs= require('uglify-js');

var fs= require('fs');

// Environment
var bundle= {
  js: 'bundle.js',
  min: 'bundle.min.js',
};

// Main
browserify('index.coffee',{
  transform: 'coffeeify',
  debug: true,
})
.bundle()
.pipe(exorcist(bundle.js+'.map',null,null,'.'))
.pipe(fs.createWriteStream(bundle.js),'utf8')
.on('close',function(){
  var minified= uglifyjs.minify(bundle.js,{
    mangle: true,
    inSourceMap: bundle.js+'.map',
    outSourceMap: bundle.min+'.map',
  });

  fs.writeFileSync(bundle.min,minified.code);
  fs.writeFileSync(bundle.min+'.map',minified.map);
})
```

> 参考:  [The simple way - mishoo/UglifyJS2(github)](https://github.com/mishoo/UglifyJS2#the-simple-way)
ArduinOSC - Arduinoの信号をOSCに変換するツール作った

## 経緯

ハッカソンとかで、複数人で開発を進めようとして、ハードとソフトのつなぎがある場合、

- ハードウェア
- インターフェース
- ソフトウェア

とおおまかに分けられると思う。

で、こういう分け方をした時は、私がハードウェアとインターフェースを担当して、誰かがソフトウェアをやるという分け方が多い。

私がインターフェース部分で使うのはいつもopenFrameworksだったり、Processingだったりするが、ソフトウェアを組む人もこれらを使っているとは限らないので、「とりあえず、OSC[^1]で送るから受け取ってね」という風にしたら、完全に疎結合になって役割分担もはっきりして気分がいい。

よくよく考えると同じことを何回も何回も書いている気がするので、いっそ、汎用的なアプリケーション書いてやろうと思ったのが、今回。

ArduinOSCという如何にもな名前をつけてみた。

[https://github.com/nmbakfm/arduinosc](https://github.com/nmbakfm/arduinosc)

今回作ったのはArduinoからの信号をOSCに変換するところだけ。

## 前提


自分がRubyistということもあって、今回Rubyでやった。

前提としては以下。

- Ruby 2.2.3がインストールされている
- BundlerをRuby 2.2.3で利用できる環境である
- ArduinoにはFirmata Libraryがアップデートされている

## ダウンロード

以下のコマンドを実行して、ソースコードをcloneしてくればOK

```
cd your/app/path
git clone git@github.com:nmbakfm/arduinosc.git
cd arduinosc
bundler install --path=vendor/bundle
```

## 使い方

以下のコマンドを実行するだけ。

```
ruby arduinosc.rb
```

## 設定の記述方法

設定は中に入っている`setting.json.template`をコピーして`setting.json`を作成します。

例えばこんな感じ。

```js
{
  "osc":{
    "host": "localhost",
    "port": "3333"
  },
  "arduino":{
    "modem": "/dev/cu.usbmodem1d1131",
    "available_pins":{
      "analog": [0,1],
      "digital": [13]
    }
  }
}
```

意味は大体、分かると思うけど、こんな感じ。

|名前|意味|
|:--:|:--:|
|host|oscの送り先のホスト|
|port|oscの送り先のポート|
|modem|arduinoが接続されているUSBポート[^2]|
|analog|値を取得するアナログピンの番号|
|digital|値を取得するデジタルピンの番号|

つまり、上の設定ファイルだと、

> "/dev/cu.usbmodem1d1131"に接続されたArduinoの
> アナログピンA0,A1とデジタルピン13のデータを
> OSCとして"localhost"の3333番ポートにおくる

という感じです。

## 送られるOSC

```plain
┣ /analog
┃  ┣ /pin0
┃  ┗ /pin1
┃
┗ /digital
    ┗ /pin13
```

デジタルのHIGHかLOWかは1か0かで送られます。
アナログの値は0-1023の1024段階の値が送られます。

## まとめ

インストールは面倒くさいけど、思いのほか、便利なので、お試しあれ。

## 参考記事

http://shokai.org/blog/archives/6631
http://qiita.com/5t111111/items/f8504e382e348df430d0

私の個人ブログから転載
[ArduinOSC – Arduinoの信号をOSCに変換するツール作った](http://inter-arteq.com/arduinosc-arduino%E3%81%AE%E4%BF%A1%E5%8F%B7%E3%82%92osc%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E3%83%84%E3%83%BC%E3%83%AB%E4%BD%9C%E3%81%A3%E3%81%9F/)
* * *


[^1]: OpenSound Control ([http://opensoundcontrol.org/introduction-osc](http://opensoundcontrol.org/introduction-osc))
[^2]: USBポートはArduino IDEの[ツール]-[ポート]を見ればわかります。
tmux下でElectronがうまく動作しない

## 問題

tmux環境で起動したElectronアプリでフォーム入力ができませんでした。
atom shell時代から知られているtmuxの仕様ないしバグのようで、フォーム入力できないだけでなく色々問題があるようです。
[atom shell doesn't work in tmux](https://github.com/atom/electron/issues/733)

## 解決法

[reattach-to-user-namespace](https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard#quick-summary)を入れると治ります。

以下、インストール・設定方法

1. homebrewで`reattach-to-user-namespace`をインストールします

    ```sh:console
    $ brew install reattach-to-user-namespace
    ```

1. `.tmux.conf`に以下の設定を追加します

    ```~/.tmux.conf
    set-option -g default-command "reattach-to-user-namespace -l zsh"
    ```

あとはtmuxを再起動すれば治るはずですが、摩訶不思議な動作に悩まされる可能性を残したくない人は、Electronの起動はtmux環境とは別に行った方が賢明かもしれません。
unity > unix timeをSystem.DateTimeに変換する関数

```txt:動作確認
Unity 5.1.3-f1 on MacOS X 10.8.5
```

` "dt": 1442973600, `
というunix timeをSystem.DateTimeに変換したい。

参考: [SO](http://stackoverflow.com/questions/249760/how-to-convert-a-unix-timestamp-to-datetime-and-vice-versa)


```csharp
using UnityEngine;
using System.Collections;

using System; // for DateTime;

public class MainScript : MonoBehaviour {

	public static DateTime UnixTimeToDateTime(double unixTime){
		DateTime dt = 
			new DateTime (1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc);
		dt = dt.AddSeconds (unixTime);
		return dt;
	}

	void Start () {
		DateTime dt = UnixTimeToDateTime (1442973600);
		Debug.Log (dt.ToString ());
	}	
}
```

結果

```
09/23/2015 02:00:00
UnityEngine.Debug:Log(Object)
MainScript:Start() (at Assets/MainScript.cs:17)
```

AddSeconds()はミリ秒の処理に注意が必要と参考ページに記載があるが、日時取得なら問題ないと思われる。
2015-09-23 datetime > Unix time > 1442922360 > ISO 8601:2015-09-22T11:46:00Z (2020-05-11更新: Zの意味 > Zulu time)

http://qiita.com/techys/items/6a865e670b44bb2e6e1d
を参考にOpenWeatherMapのデータを読もうとしていた。

しかし、`"dt": 1442973600,`で表示される日時をSystem.DateTime型に変換する方法がよくわからなかった。

そもそもこの表示(dt)が何かわからなかった。

Unix timeというものらしい。
https://en.wikipedia.org/wiki/Unix_time

Linuxを随分長い間使っていながら、Unix timeを知らなかった。


### 追記 2020-05-11 > Zの意味

Zの意味

>  also known as "Zulu time" (UTC)

https://stackoverflow.com/questions/8405087/what-is-this-date-format-2011-08-12t201746-384z
認証情報などをGitHubにはpushせず、環境変数からファイルを生成する

## やりたいこと

GitHubには、認証情報などの秘密の情報をpushしたくない。（個人プロジェクトはPublicだし）
だけど、CircleCIから自動デプロイを行いたい。

具体的には、[noboru-i/backlog-to-chatwork](https://github.com/noboru-i/backlog-to-chatwork)を作った時に、CircleCIからデプロイしたくなったけど、ChatworkのAPI keyとか、Backlogのドメインとかをpushしたくなかった。
CircleCIなら、環境変数は簡単に設定できるので、そこから取得、ファイルの置換えをしたい。

## 作ったもの

[env2file](https://github.com/noboru-i/backlog-to-chatwork/blob/master/bin/env2file)

## 何が出来るか

指定されたファイルから、特定の文字列を検出し、環境変数の値と置き換えます。

例えば、環境変数に下記を設定しておき、

- CHATWORK_API_KEY : "999999"
- CHATWORK_ROOM_ID : "1234"

下記のようなファイルがあった場合、

```json:default.json
{
  "chatwork": {
    "apiKey": "INPUT_YOUR_CHATWORK_API_KEY",
    "roomId": "INPUT_YOUR_CHATWORK_ROOM_ID"
  }
}
```

```
env2file default.json
```

と実行すると、入力したファイルが下記のように変換されます。

```json:default.json
{
  "chatwork": {
    "apiKey": "999999",
    "roomId": "1234"
  }
}
```
FlashAir の Lua で Basic 認証 POST リクエスト

```lua
boundary = "--61141483716826"
contenttype = "multipart/form-data; boundary=" .. boundary
filepath = "/cat.jpg"
mes = "--".. boundary .. "\r\n"
 .."Content-Disposition: form-data; name=\"image\"; filename=\"cat.jpg\"\r\n"
 .."Content-Type: image/jpeg\r\n"
 .."\r\n"
 .."<!--WLANSDFILE-->\r\n"
 .."--" .. boundary .. "--\r\n"

blen = lfs.attributes(filepath, "size") + string.len(mes) - 17
b, c, h = fa.request{url = "http://example.com",
  method = "POST",
  headers = {["Authorization"] = "Basic user:passwordをBase64した値",
  ["Content-Length"] = tostring(blen),
  ["Content-Type"] = contenttype},
  file = filepath,
  body = mes
}

print(b)
print("\n")
```

## リンク

- [FlashAirのLua関数リファレンス](https://flashair-developers.com/ja/documents/api/lua/reference/)
    - ここに上記 POST の、Basic認証ではないサンプルがあります
Zabbix で Fluentd の切り離し／接続復旧を監視する


## はじめに
Fluentd は、応答が遅い場合やハートビートを返さない場合に、転送先サーバを自動で切り離す機能があります。

切り離す事自体はいいのですが、こちらの知らない内に切り離されてそのままになっていては困るので、Fluentd プロセスが転送先サーバを切り離し／接続復旧を通知します。

## Zabbix でログを監視する
Zabbix には、[ログファイルの監視](https://www.zabbix.com/documentation/2.2/jp/manual/config/items/itemtypes/log_items)機能があるのでこれを利用することで、アプリケーションやシステムの状態を監視、通知することができます。

今回の場合は、以下のように Zabbix のアイテムを設定することで Fluentd の切り離し／接続復旧を監視することができます。具体的には、以下の設定でアイテムを作成すると、Zabbix は、`/path/to/fluentd.log` ファイルの中から`(detached|recovered|adding) forwarding server 'hoge'` を含む行をヒストリーとして保存します。`hoge` はサーバの名前です。

 - タイプ: Zabbix エージェント (アクティブ)
 - キー: log[/path/to/fluentd.log,(detached|recovered|adding) forwarding server 'hoge']
 - データ型: ログ
 - ログの時間形式: yyyy-MM-dd hh:mm:ss +0900

上記のアイテムを作成した上で、当該アイテムにひも付けたトリガーを作成します。トリガーの条件式は、以下の通りです。この条件式は、`detached forwarding server` が出た時に異常、`(recovered|adding) forwarding server` が出た時に正常になります。[phi_threshold](http://docs.fluentd.org/articles/out_forward#phithreshold) による detached の場合、recovered が出るまでは異常扱いになり、[hard_timeout](http://docs.fluentd.org/articles/out_forward#hardtimeout) による detached の場合、Fluentd プロセスを再起動し adding されるまで異常扱いになるということです。

```txt:切り離しと接続復旧を監視する条件式
{Fuga:log[/path/to/fluentd.log,(detached|recovered|adding) forwarding server 'hoge'].regexp(detached forwarding server)}<>0
```

`phi_threshold` による detached は、転送先サーバの Fluentd プロセスが忙しい状態だと逐一通知されてしまう面倒はありますが、そもそも `phi_threshold` が常に高い状態で対策もしていないということは問題であることに間違いないので、そこは許容しています。

## まとめ
Fluentd を運用している人からすれば、もっといい方法を知っていたり、当たり前の事なのかもしれませんが、Fluentd の運用について書いた記事は余りないと感じたので、基本的なことでも紹介してみました。

この記事が、Fluentd に興味を持ったけど、運用が面倒だという人に少しでも役立てば幸いです。
Gruntfile.js作成

[compassでsassのコンパイル・スプライト画像生成](http://qiita.com/kohei789/items/f76b9c57072a060cbfdb)の続きです。

# 目次
1. [Grunt+Compassでフロント環境構築【導入編】](http://qiita.com/kohei789/items/4d9d4e94e174b60fe0d4)
2. [compassでsassのコンパイル・スプライト画像生成](http://qiita.com/kohei789/items/f76b9c57072a060cbfdb)
3. [Gruntfile.js作成](http://qiita.com/kohei789/items/11480613cc67dd30f6aa) 

## 環境構築

前述の1を実行時点でgruntコマンド、package.jsonが作成されている。

・**gruntインストール**
``npm install -g grunt-cli``
・**package.json生成。選択は全てエンターで大丈夫です。**
``npm init``
・**グラントファイルを使用するプロジェクトのルート上で下記を実行**
``npm install grunt --save-dev``

・**使用するnode-moduleをインストール**

Gruntfileで使用するnode-moduleをプロジェクトルートディレクトリ上でインストール
下記moduleを使用してconcat,uglify等を行う。
前回記載したcompassもこのモジュールを使用し管理する。
```
npm install grunt-contrib-jshint grunt-contrib-sass grunt-contrib-uglify grunt-contrib-watch grunt-contrib-concat grunt-contrib-cssmin grunt-contrib-compass grunt-contrib-handlebars --save-dev
```
# Gruntfile作成

ルートディレクトリ上でGruntfile.jsを作成
`vim Gruntfile.js`

### モジュールの設定
下記はインストールしたモジュールの設定例
Gruntfile.jsのinigConfig内で設定
必要に応じてconcat(結合), uglify(jsの圧縮),copy,rename,cleanなどを設定追加する。

```lang:Gruntfile.js
module.exports = function(grunt){
  grunt.initConfig({
    root_dir: './src/main/webapp',
    pkg:grunt.file.readJSON("package.json"),
    
    compass: {
      dev: {
        options : {
          config : 'config.rb',
          environment : 'development',
        }
      },
      prod: {
        options : {
          config : 'config.rb',
          environment : 'production'
        }
      }
    },
　  cssmin:{//ミニファイ
      minify:{
        src:[
             '<%= root_dir %>/css/component/*.css',
             '<%= root_dir %>/css/utility/*.css',
             '<%= root_dir %>/css/project/*.css'
             ],
        dest: '<%= root_dir %>/css/all.min.css'     
      }
    },
    //省略 concat(結合), uglify(jsの圧縮)も同様に作成する
    
  });
}
```

### watchタスク追加

**watchタスクとは**
上記で設定したモジュールの動きを制御する。
ローカル環境等でファイル変更時(保存時)に自動で設定したタスクを実行する。
Gruntfile.jsのinigConfig内で設定
階層は他のcssmin等と同様

```Gruntfile.js
module.exports = function(grunt){
  grunt.initConfig({
   
    //*************compass,cssmin等モジュール設定略************

    watch:{
      js: {
        files: [
                '<%= root_dir %>/js/**/*.js',
                '<%= root_dir %>/js/**/*.setting'
                ],
        tasks: ['concat', 'uglify'] // 実行させるタスク
      },
      scss:{
        files: [
                '<%= root_dir %>/scss/**/*.scss',
                ],
        tasks: [
                'compass:dev'
                ]
      },
      css : {
        files: [
                '<%= root_dir %>/css/**/*.css'
                ],
        tasks: [
                'cssmin'
                ] // 実行させるタスク
      }
    }
  });

}
```

## タスク設定

各環境(local,dev,本番等)で実行したいタスクを設定する。
下記はdevではconcat,uglifyなどは行わずdevでのみ実行している。

jenkins等デプロイ時にタスクを実行することも可能です。
Gruntfile.jsのinigConfig外で設定

```Gruntfile.js
module.exports = function(grunt){
  grunt.initConfig({

   //cssmin,watch等モジュール設定略

  });

  grunt.registerTask('dev_watch', ['compass:dev', 'watch']);
  
  grunt.registerTask('prd', ['compass:prd', 'concat', 'cssmin', 'uglify']);
}
```