OmniAICreator/Qiita-1.07M huggingface dataset:
JenkinsのHTML Publisher pluginで `Blocked script execution in <URL>. because the document's frame is sandboxed and the 'allow-scripts' permission is not set`となって、画面の一部が表示されない場合の対応方法

Jenkinsをアップデートしたら、HTML Publisher plugin で表示した doxygen の生成ページのクラス図等の SVG が以下のエラーで表示されなくなった。

```
Blocked script execution in <URL>. because the document's frame is sandboxed and the 'allow-scripts' permission is not set
```

原因としては、Jenkins 1.625 以降からセキュリティポリシーが変更になったとのこと (当然 2.x 以降も同様)

[Configuring Content Security Policy - Jenkins - Jenkins Wiki](https://wiki.jenkins-ci.org/display/JENKINS/Configuring+Content+Security+Policy)

HTML5のsandbox属性については以下などを参照

[sandbox 属性 | HTML5 タグリファレンス | W3 Watch Reference](https://reference.hyper-text.org/html5/attribute/sandbox/)

# とりあえずの回避策

`Jenkinsの管理 => スクリプトコンソール` から以下を実行する。

```groovy:
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
```

これで、上記のsandbox由来のエラーは消えるはず。(おそらくJenkinsを再起動したりするとこの設定は無効化されるので注意)

# 正式な回避策
Jenkinsの起動オプションから上記の設定を追加しても、同様の効果は得られるはずだが、わざわざ追加されたセキュリティの無効化をしても大丈夫なのかの検討は必要かと思われる。

## Jenkinsの起動オプションによる対応

以下のように、 `-Dhudson.model.DirectoryBrowserSupport.CSP=""` オプションを付けて起動する。

```bash
java -Dhudson.model.DirectoryBrowserSupport.CSP="" -jar jenkins.war
```

TODO: プラグインまたはHTML側の設定でなんとかできないかの検討

# 参考
[javascript - Blocked script execution in <URL>. because the document's frame is sandboxed and the 'allow-scripts' permission is not set - Stack Overflow](http://stackoverflow.com/questions/34315723/blocked-script-execution-in-url-because-the-documents-frame-is-sandboxed-and)
include Enumerable

http://stackoverflow.com/questions/7220634/how-do-i-use-the-enumerable-mixin-in-my-class

```rb
require 'pry'

class ATeam
	include Enumerable

	def initialize(*members)
		@members = members
	end

	def each(&block)
		@members.each do |member|
			block.call(member)
		end
	end

	def each_member(&block)
		return enum_for(:each_member) unless block_given?
		@members.each do |member|
			yield member
		end
	end

	def members
		each_member.to_a
	end
end

ateam = ATeam.new("Face", "B.A. Barracus", "Murdoch", "Hannibal")

ateam.map(&:downcase)

binding.pry

puts "lalala"
```
webdriver用のテストシナリオをJavaScript(nashorn)で書いてみる　その２

# はじめに
　[webdriver用のテストシナリオをJavascript(Nashorm）で書いてみる](http://qiita.com/gluelan2013/items/717ff6fe5d9bdd8ccac1)のつづきです。

# アサーション

実際にテストシナリオを作るには　アサーションが必要です。選択肢でいえば　JavaのJunit,TestNGなどを使うことも可能なはずですね（言語が混じって解りにくくなるかもですが）

## Junit
Junitをダウンロードしてきます。また、あわせてhamcrestも必要です
[Junit4.12](https://github.com/junit-team/junit4/wiki/Download-and-Install)
[hamcrest-core-1.3.jar ](https://code.google.com/archive/p/hamcrest/downloads)

テストスクリプトを作成して動作確認。

```js
load("nashorn:mozilla_compat.js");

importPackage(org.junit);
importPackage(org.hamcrest.core);

print("Start!");

Assert.assertThat("Test",Is.is("Test"));
Assert.assertThat("Test1",Is.is("Test"));

print("End!");
```
Javaで　Junitを使用する場合　import static を使うので、クラス指定はしないと思いますが、nashornから呼び出すには指定しないとだめなようです（ほかに方法があるかも）

### ちなみに
Junitを使用するに当たり　hamcrestを別途　組み込んでいます。今回Junitは最新の 4.12を使用しているのですが、4.11からこれが取り除かれており、この手間が必要のようです（ 4.10までは　hamcrestが組み込まれていた junit-4.xx.jar と、組み込まれていない　junit-dep-4.xx.jar　というのがあったが　4.11から組み込まれないものに統一された模様）

## 組み合わせて

webdriverとJunit両方を組み合わせたもの

```js
load("nashorn:mozilla_compat.js");

importPackage(org.junit);
importPackage(org.hamcrest.core);


print("Start!");
  var wd = JavaImporter(org.openqa.selenium.firefox);
  var driver = new wd.FirefoxDriver();

  driver.get("http://www.google.com");

  var element = driver.findElementsByName("q");
  element.get(0).sendKeys("selenium");
  element.get(0).submit();

  Assert.assertThat(driver.getTitle(), Is.is("Google"));

  driver.quit();

print("End!");
```


# 考察

JunitはJavaのテストツールですが、テストシナリオをJavaScriptで記述しているのにJavaのツールを使うのは、混乱しそうです。

が、JavaScript用のテストツールを使うとなると、どれもインストールに　 npm を使用していて簡単に環境を作るところにたどりつけなさそうです。[chai-webdriver](http://chaijs.com/plugins/chai-webdriver/)とかが使えるとよさげなのですが、

アサーションは出来ましたが、実行に際してはテストランナーに相当するものもほしいところ
（Junitにある　アノテーションなどはさすがに使えないですから）

また、実行することができましたが、実使用するには　いわゆる　エコシステム的なものがほしいですね。



## あった

とおもったら Nashorn + Maven + .js 的な　ものがあるそうです。

[Nashorn Maven: Easy Library Classpath Setup](https://blogs.oracle.com/brunoborges/entry/nashorn_maven_easy_library_classpath)
typings を 0.x から 1.x にアップデートしたときにハマったこと 

TypeScriptをはじめたらtypingsというものを使わずに居られないカラダにされ、typingsパッケージも`0.x→1.x`でいろいろ変わって定義ファイルがinstallできなくなって焦ったけど解決できたという話です。

# 環境

```shell-session
>typings -v
1.0.4
```

今後のアップデートで下記の情報も古くなることを念頭に。
<a href="https://libraries.io/npm/typings" target="_blank">typings on npm - Libraries</a> 


# （その他いくつかあるけど自分的）おもな変更点

1. `--ambient`が`--global`に変更
2. `--ambient`指定でinstallしていた定義は`--source`指定が必要

ハマったのは 2. で、下のコマンドの例、`旧`を実行するとERR!が出まくってあれれ？となった。ただしくは`新`。

```shell-session
旧：　typings i react --save --ambient
新：　typings i dt~react --save --global
```

デフォルトのレジストリは<a href="https://github.com/typings/registry" target="_blank">public registry</a>で、それ以外のレジストリからinstallする場合は`dt~XXX`、`env~XXX`の指定が必要となっているもよう。

installコマンドのサンプルで使用されている
`typings i debug --save`
が通るのは、public registry に置かれているから。

# 定義ファイルの名前はわかる。レジストリが分からない、時

```shell-session:debugの定義ファイルをしらべる例
> typings search debug

Viewing 6 of 6

NAME             SOURCE HOMEPAGE                                       DESCRIPTION VERSIONS UPDATED
debug            npm    https://www.npmjs.com/package/debug                        1        2016-05-11T15:13:34.000Z
debug            dt     https://github.com/visionmedia/debug                       1        2016-03-17T12:06:54.000Z
express-debug    dt     https://github.com/devoidfury/express-debug                1        2016-03-16T15:55:26.000Z
gulp-debug       dt     https://github.com/sindresorhus/gulp-debug                 1        2016-03-16T15:55:26.000Z
gulp-strip-debug dt     https://www.npmjs.com/package/gulp-strip-debug             1        2016-01-25T18:42:27.000Z
_debugger        dt     http://nodejs.org/                                         1        2016-03-17T12:06:54.000Z
```

この`SOURCE`カラムに表示されているのがレジストリ名となる。
コマンドヘルプは`typings search -h`でみれるから詳しくはそっちで。他のコマンドの詳細もとりあえず`-h`する。

# public registry に登録されている定義ファイルの情報を取得しているAPIエンドポイント

- npm レジストリの debug の情報
    - https://api.typings.org/entries/npm/debug/versions
- dt レジストリの react の情報
    - https://api.typings.org/entries/dt/react/versions


## どのタイミングでpublicに登録されるの？

<a href="https://github.com/typings/registry/labels/typings%20request" target="_blank">Issues · typings/registry</a>

`typings request`ラベルをつけた`Issues`があった。これが承認されたら？と推測している。そもそも定義ファイルがいろんなレジストリに散らばっているということを今回の件で知ったくらいなので、いろいろわかっていない。

# デフォルトのレジストリを変更できる（らしい）

`.typingsrc`というファイルで指定できるらしい。まあでもpublic registry を育てていくのであれば、変える必要ナイネ。
Gitで特定のファイルを特定のどこかから取ってきてステージングさせる

## 元ネタ参照元
- http://qiita.com/oret/items/b646fcada9d89ed308c4
- http://konbu13.hatenablog.com/entry/2014/12/01/070255

## 例
### ブランチを指定して持ってくる
`git checkout <ブランチ名> -- <相対ファイルパス>`
### 特定のコミットから持ってくる
`git checkout <コミットのハッシュ値> <相対ファイルパス>`
Unity: UDPを送る

# UDP Event -> BrightSign
動画プレイヤーとしてそれなりに有名だと思われる[BrightSign](https://www.brightsign.biz/)。
[BrightAuthor](https://www.brightsign.biz/digital-signage-products/brightauthor)を使って動画再生のプログラムを作ることもできる。あるイベントによって、動画再生を開始したり、違う動画を再生するといったものだ。イベントタイプの一つにUDPが用意されている。展示用に画像のようなシステムをつくった。
![canon_wireless.png](https://qiita-image-store.s3.amazonaws.com/0/53282/e31f0832-ed94-e006-f42d-b99b4d686a7f.png)

UnityでUDP送信するiOSアプリの通信部分を以下で簡単に説明。


# UDP Sender

UnityでUDPを受けるのは確か大変だった気がするが、送るのは簡単。このフォーラムの[投稿](http://forum.unity3d.com/threads/sending-data-using-udp.316834/)のコードをほぼそのまま使うとできる。UDPを送るメソッドにはmodifier publicを付与すればinspector上でOnClickイベントで実行設定できる。

```csharp
using UnityEngine;
using System.Collections;
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

public class UDPSender : MonoBehaviour {
	// UDP sender based on the code from the following url..http://forum.unity3d.com/threads/sending-data-using-udp.316834/
	public string IP = "255.255.255.255"; // default is local
	public int port = 5000;
	IPEndPoint remoteEndPoint;
	UdpClient client;

	// variables for timer
	public bool isTimerOn = false;
	float timerCounter = 180.0f;
	// Use this for initialization
	void Start () {

	}
	
	// Update is called once per frame
	void Update () {

	}

	public void GoBack() {
		IP = "255.255.255.255";
		port = 5000; // port number
		remoteEndPoint = new IPEndPoint (IPAddress.Parse (IP), port);

		client = new UdpClient ();
		byte[] data = Encoding.UTF8.GetBytes("Back"); // string message must be matched with the label name of the bright sign project.
		client.Send (data, data.Length, remoteEndPoint);
	}

	public void Projection(string targetScene) {
		IP = "255.255.255.255";
		port = 5000;
		remoteEndPoint = new IPEndPoint (IPAddress.Parse (IP), port);
		client = new UdpClient ();
		byte[] data = Encoding.UTF8.GetBytes (targetScene);
		client.Send (data, data.Length, remoteEndPoint);

	}
}
```
Androidのビルド時にビルドに関する情報を付加したい

## 背景
- CIでビルドしたものを開発メンバーに自動的に配布するようにしたいけど、どれがどのバージョンか区別できないと困る
- 開発中にどのブランチのいつの次点でビルドされたものかわからなくて困ることがある

## やりたいこと
- CIでビルドした場合、VERSION_NAMEの末尾にビルド番号を入れる
- ローカルでDebugビルドした場合、VERSION_NAMEの末尾に諸々の情報が入って欲しい

## やったこと

次のような記述をbuild.graldeに追加した。

```groovy
android {
  buildTypes {
    release {
      def buildNumber = System.env.BUILD_NUMBER
      def versionDetail = ((buildNumber != null && !buildNumber.isEmpty()) ? sprintf('(%s)', [buildNumber]) : "")
      resValue "string", "app_version_name_detail", defaultConfig.versionName + versionDetail
    }
    debug {
      def buildNumber = System.env.BUILD_NUMBER
      def versionDetail = ((buildNumber != null && !buildNumber.isEmpty()) ? sprintf('(%s)', [buildNumber]) : sprintf("(develop,%s,%s,g%s)", getDate(), gitBranch(), gitHash()))
      resValue "string", "app_version_name_detail", defaultConfig.versionName + versionDetail
    }
  }
  def gitBranch() {
    def result = ""
    def proc = "git rev-parse --abbrev-ref HEAD".execute()
    proc.in.eachLine { line -> result = line }
    proc.err.eachLine { line -> println line }
    proc.waitFor()
    result
  }

  def gitHash() {
    def result = ""
    def proc = "git rev-parse HEAD".execute()
    proc.in.eachLine { line -> result = line }
    proc.err.eachLine { line -> println line }
    proc.waitFor()
    result
  }

  def getDate() {
    new Date().format('yyyyMMddHHmmss')
  }
}
```

こうすると、R.string.app_version_name_detailを使うと取得できるようになる。

## 余談
versionNameSuffixを使う手もあるけど、それをするとBuildConfig.VERSION_NAMEにも付加されてしまい、
運用的にログに乗っかってしまうとマズイのでR.string.app_version_name_detailに分けて定義するようにした。
【iOS】他アプリで音楽が再生中か知りたい　重ねて再生させたい

　ユーザーがMusicアプリで音楽再生やsafariで音声ストーリミング再生などをしていた場合、他アプリを開いた際にはその音楽がそのまま再生されることを期待している

　しかし、標準の設定では元々再生していた音楽は止まるようになっているので、その回避方法メモ


## 1. 他アプリで音楽が再生中かのチェック方法
#### Objective-C
```objc
if ([[AVAudioSession sharedInstance] isOtherAudioPlaying]) {
    // 再生中!!
}
```

#### Swift
```swift
if AVAudioSession.sharedInstance().otherAudioPlaying {
    // 再生中!!
}
```

　これであとは、再生中であれば自アプリのBGMなどを止めたり、再生させないような処理を記述すればok

## 2. 他アプリの音楽と重ねて再生させたい
　もし他アプリで音楽が再生中であれば、止めずに自アプリのBGMやSE、ボイスなどと重ねて再生させたいといった場合もある
その場合はAVAudioSessionのCategoryに`AVAudioSessionCategoryAmbient`を設定すれば良い

#### Objective-C
```objc
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
```

#### Swift
```swift
try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
````

　Categoryにはデフォルトでは他アプリの再生を停止する`AVAudioSessionCategorySoloAmbient`が設定されている
nginx の設定ファイルで正規表現を使って www. なしのドメイン名にリダイレクトさせる

一つのサーバーに複数のドメイン名のウェブページを同居させることはよくある話だと思います。負荷のことを思えばドメイン名単位でサーバーを分けたほうが良いのでしょうが、さしたアクセスが見込めないウェブページを集約しても問題は起きないでしょう。

ただ `www.` つきでアクセスされた際に、`www.` なしのドメイン名へのリダイレクトをさせる処理をドメイン名単位で一つ一つ書いていくのは無駄です。

nginx の `server_name` ディレクティブでは正規表現を使えます。nginx が正規表現エンジンとして使っている PCRE では名前付きキャプチャに対応しているので次のように書けます。

```nginx:/etc/nginx/sites-avalable/www.example.com.conf
server {
  listen 80;
  server_name "~^www\.(?<naked_domain>.*)$";

  set $proto $scheme;
  if ($http_x_forwarded_proto = "https") {
    set $proto $http_x_forwarded_proto;
  }
  if ($http_cloudfront_forwarded_proto = "https") {
    set $proto $http_cloudfront_forwarded_proto;
  }

  rewrite . $proto://$naked_domain$uri permanent;
}
```

上位に CloudFront や CloudFlare といった CDN が存在しない場合は、`$proto` 周りの小細工が不要になり、もう少し単純になります。nginx の設定ファイルは簡単に書けて良いですね。

ぜひご活用くださいませ。
Admin UI: モデルに別のビューを定義する


- 同じAdminサイトではモデルに複数のAdminを定義できない

~~~py
from django.contrib.auth.models import User

class UserAdmin(admin.ModelAdmin):
    list_display = ['id', 'username']

admin.site.register(User, UserAdmin)
~~~

~~~
django.contrib.admin.sites.AlreadyRegistered: The model User is already registered
~~~

# Proxyモデル

- proxy = True で既存モデルのサブクラスを用意し、それにAdminを定義

~~~py
class Superuser(User):
    class Meta:
        proxy = True


class SuperuserAdmin(admin.ModelAdmin):
    list_display = ['id', 'username']

admin.site.register(Superuser, SuperuserAdmin)
~~~

# get_queryset

- 条件を絞るなど

~~~py
class SuperuserAdmin(admin.ModelAdmin):
    list_display = ['id', 'username']

    def get_queryset(self, request):
        return super(SuperuserAdmin, self).get_queryset(request).filter(
            is_superuser=True)
~~~
IDCFクラウドからTCPWrapperで制限しているサーバーにアクセスする

# IDCFクラウド → TCPWrapper制限済みサーバー
IDCFクラウドのIPをTCPWrapper制限済みサーバー/etc/hosts.allowに記述しても入れない場合があります。

## 対処方法
IDCFクラウドの仮想マシンから本当の接続先を調べて/etc/hosts.allowに追記する。

## 行ったこと
結構無理やりですが、TCPWrapper制限済みサーバーの制限を外しIDCFからSSHで２回アクセスしてHOST情報を取得しました。
１回アクセスしただけだと、前回アクセスしたHOSTが表示されるので２回アクセスしHOST情報を取得しました。

``` shell
ssh hogehoge.com
Last login: Wed May 18 10:16:09 2016 from xxx-xxx-xxx-xxx.{region}.compute.idcfcloud.com
```
xxx-xxx-xxx-xxxの部分がIPになるのでxxx.xxx.xxx.xxx形式に置き換えて/etc/hosts.allowに記述します


## 最後に
ほぼ自分用に書いているので日本語がぐちゃぐちゃですが、役に立てれば嬉しいです。
他、IP確認できる方法があれば募集中です。
wsimportコマンドでSAXPareseException（外部DTDアクセスが許可されない）の解決方法

JDK8の環境でwsimportコマンドでSEIソースを生成する際に、以下のエラーが発生してしまったため、それを解決するために、いろいろ調べてみました。

```
C:\ProductInfo>wsimport ProductInfo.wsdl

[ERROR] org.xml.sax.SAXParseException; systemId: file:/C:/ProductInfo/xmldsig-co
re-schema.xsd; lineNumber: 10; columnNumber: 5; 外部DTD: accessExternalDTDプロパ
ティで設定された制限により'file'アクセスが許可されていないため、外部DTD 'XMLSche
ma.dtd'の読取りに失敗しました。
  行8/file:/C:/ProductInfo/ProductInfo.wsdl
  
  WSDLの解析に失敗しました。
```

#解決方法１
wsimportコマンドを実行する際に、`-J-Djavax.xml.accessExternalDTD=all`又は`-J-Djavax.xml.accessExternalSchema=all`のオプションを付けること。

```
C:\ProductInfo>wsimport -J-Djavax.xml.accessExternalDTD=all ProductInfo.wsdl

WSDLを解析しています...

コードを生成しています...

コードをコンパイルしています...
```

#解決方法２
１．ファイル`jaxp.properties`を新規作成し、以下の内容を記載する。

```
javax.xml.accessExternalDTD = all
javax.xml.accessExternalSchema = all
```
２．上記のファイルを`%JAVA_HOME%\jre\lib`配下にコピーする。

```
C:\ProductInfo>wsimport ProductInfo.wsdl

WSDLを解析しています...

コードを生成しています...

コードをコンパイルしています...
```

[参照先]
http://stackoverflow.com/questions/23011547/webservice-client-generation-error-with-jdk8
GASを使ってSpreadSheetの変更履歴をシートに出力する多分一番簡単そうなコード

Logというシートを追加して、スクリプトエディタに以下をコピペする。
また必ず一度実行して承認などは済ませておく。

```js
/// 編集検知
function onEdit(e) {
  if (e.source.getSheetName() === 'Log') {return;}

  SpreadsheetApp.getActive().getSheetByName('Log').appendRow([
    new Date(),                // 日時
    e.source.getSheetName(),   // シートネーム
    e.user.getEmail(),         // ユーザーのメールアドレス
    e.value,                   // 変更後の値
    e.range.getRow(),          // 行番号
    e.range.getColumnIndex()   // 列番号
  ]);
}
```

編集されるとonEdit()が呼ばれるので、そのときにLogというシートに変更内容を出力している。
結構頻繁に修正しても全部Logとして出てくる。

便利。
Watson IoT Platform - 温湿度計シミュレーターを用意します

#温湿度計シミュレーターを用意します
Watson IoTではIoTで使用される様々なデバイスの「レシピ」を用意しています。これらのレシピを使用することで、各種IoTデバイスを簡単に接続して「IoTする」ことが可能です。
これらのレシピのうち、実デバイスを持っていないかたでもIoTを試せるように「デバイス・シミュレーター」も提供されています。
1. [Watson IoTのシミュレーターのレシピ](https://developer.ibm.com/recipes/tutorials/use-the-simulated-device-to-experience-the-iot-foundation/)を開きます。
![スクリーンショット 2016-05-18 10.57.58.png](https://qiita-image-store.s3.amazonaws.com/0/125842/0ea0069b-8c3a-9211-dabc-dae8680c0c8e.png)

2. 画面をスクロールし、"Connecting"段落に掲示されているデバイス・シミュレーターのURL [https://quickstart.internetofthings.ibmcloud.com/iotsensor/](https://quickstart.internetofthings.ibmcloud.com/iotsensor/) をクリックします。
![スクリーンショット 2016-05-18 10.58.15.png](https://qiita-image-store.s3.amazonaws.com/0/125842/178fbb1a-796c-8d4e-aa8d-1aa6bc3bfeba.png)

3. クラウド上で温湿度計シミュレーターのインスタンスが一つ起動します。
![スクリーンショット 2016-05-18 11.01.45.png](https://qiita-image-store.s3.amazonaws.com/0/125842/9eebef10-b7e2-2f76-d0dd-ea1988464a28.png)

4. 画面下部の上下の矢印で温度が増加・減少することを確認します。また画面左右の矢印で温度計（"Temperature"、濃い青の画面）以外に、湿度計（"Humidity"、うすい緑の画面）と物体表面温度("Object Temperature"、オレンジ色の画面）が提供されている事を確認します。
5. 画面右上の１２桁の英数字がアサインされたMACアドレス（疑似）になります。この値をクリックするとQuickstart画面で温度などが表示される画面へ切り替わります。
![スクリーンショット 2016-05-18 11.09.29.png](https://qiita-image-store.s3.amazonaws.com/0/125842/13023594-baaf-897b-367c-dacb420f1f72.png)

6. Quickstart画面を下へスクロールし、Temperature, Humidity, Object Temperatureの値が表示されていることを確認します。それぞれの項目を選択すると、画面上部のグラフへ表示されます。
7. 前タブの温湿度計シミュレーターの画面へ戻り、温度などを上下させることでQuickstart画面のグラフへ反映される事を確認します。
NSWindow のフルスクリーンを無効にしたかった

<img src="https://qiita-image-store.s3.amazonaws.com/0/3603/41001298-ab3f-43ab-4264-6607684fa339.png">

Windows ユーザーじゃあるまいし、ウインドウのフルスクリーンなんてそう使わないんですよ。optionキーを押したら＋に切り替わりますけどそれも面倒ですね。（ウインドウのダブルクリックでズームする設定はありますが）

# ズームボタンをデフォルトにしたい

自分のアプリでウインドウのフルスクリーンを無効化するにはどうすれば良いか探ったら、Interface Builder で簡単に設定することができました。Full Screen: `Auxiliary Window` としてあげるだけです。
![](https://qiita-image-store.s3.amazonaws.com/0/3603/c8b49a96-8a6b-748d-81da-e644171bc5d7.png)

できました。
![](https://qiita-image-store.s3.amazonaws.com/0/3603/d389cf5b-4b73-b756-5bd1-96d5c121ef7e.png)

# コードでやる

コードだとこんな感じです。`NSWindowCollectionBehavior` でウインドウの振る舞いを指定できますが、ズームボタンが標準のビヘイビアが用意されています。

```swift
let win: NSWindow = …
win.collectionBehavior = .FullScreenAuxiliary
```

なお、NSWindowCollectionBehavior では Exposé や Mission Control の振る舞いも制御できます。
[Exposé, Mission ControlでのNSWindowの振る舞いを指定する](http://qiita.com/usagimaru/items/e77ac0426f070e357811)
Mac で追加したユーザでログインできなかった話

# TL; DR

FileVault を設定する場合、解除可能なユーザに追加したユーザを入れておかないと再起動のたびに管理者アカウントでしかログインできなくなるよというお話

# 情シスあるある

- 社員の端末に管理者アカウントと社員用アカウントを入れて管理する
- 端末には暗号化を実施する
- それは管理者でしか変更できなくする

なーんてこと、よくしますよね。
してなかったらせめて暗号化はしてくださいね。
CSR 大事ですからね。

# 本題

さて、Mac でそういったことを設定しようと思うと FileVault が鉄板ですよね。
こいつはログイン時に HDD 内容を復号するのですが、復号できるユーザを個別に設定できます。
しかも FileVault 設定を変更する画面じゃないと出てこないので気付きづらいです。
ここでうっかり復号できるユーザを設定し忘れると、管理者アカウントでしか HDD を復号できなくなりますね。

その状態で再起動するとどうなるか。
どうやらログイン時に **復号可能なユーザのみを表示する** という挙動になるようです。

そうなると **一度管理者アカウントでログイン→管理者アカウントをログアウトすると追加したユーザが表示される** という状態になります。
しかし当然追加したアカウントには復号権限が無いままなので再起動するたびに管理者アカウントだけが表示されて問い合わせが来てログインしてログアウトして…といった感じで **円環の理に導かれる** ことになります。
大変ですね。

# 解決編

たったひとつのシンプルな答えです。
追加したユーザに復号権限を与える、これだけです。

システム環境設定＞セキュリティとプライバシー＞FileVault＞鍵アイコンクリック＞ユーザを有効にする
から追加したユーザを有効にしてあげてください[（参考）](https://support.apple.com/kb/PH18647?viewlocale=ja_JP&locale=ja_JP)。
こうすれば誰も魔女化することなく幸せな世界が生まれます。

ところでまどマギって新作出るんですかね…
普通の人のためのデータ分析（１）　大切なこと５項目

普通の人のためのデータ分析で思うことを書いていきます。

国産のデータ分析（前処理ツール）
1. [nysol](http://www.nysol.jp)(オープンソース） 
2. [zap-in](http://www.turbo-data.co.jp)(商用）
を応援しています。

データ分析で大切なこと　５項目

１　データが存在すること
２　データが入手可能なこと
３　データ処理が可能なこと
４　データが間違っていないこと
５　データには価値があること

実際にデータ分析をしているときに感じた５項目です。
Django学習用Memo

# 背景
pythonの学習とwebアプリケーションの学習のため、Djangoの学習を始める。その際によく利用するコマンドや開発の進める際に気付いたことをメモする

# 参考ページ
http://docs.djangoproject.jp/en/latest/intro/tutorial01.html

# 環境準備

## 環境
CentOS : 6.5
python : 2.6.6
django : 1.6 (最新の1.9をインストールしたところエラーがでた。pythonのバージョンとの互換性かもしれない？フレームワークの概要理解のためなので、2.6で動いた古いバージョンを利用)

## インストール
``` $ pip install django==1.6 ```
下記コマンドでエラーが出ない場合はインストール成功
``` $ python ```
``` >>> import django ```
``` >>> quit() ```

# 開発プロジェクト作成
## プロジェクトの開始
作業用ディレクトリに移動した後、下記コマンドで開発用のディレクトリが作成される。
``` $ django-admin.py startproject test 
$ ll test ```

## データベースの設定
test/settings.pyの中身を編集して、下記コマンドを実行。
 主な編集点
  - ENGINE : 利用するDBMS(django.db.backends.sqlite3他)
  - INSTALLED_APPS : インストールするアプリケーション

``` $ python manage.py syncdb ```
INSTALLED_APPSに必要なDBを作成する。

## サーバの起動
IPとポートを指定してサーバを起動可能
``` $ python manage.py runserver 0.0.0.0:8000 ```

指定しない場合のデフォルトは、127.0.0.1:8000

#アプリケーション開発
## 開発開始
作業ディレクトリで下記コマンドを実施。
``` $ python manage.py startapp polls ```
下記ファイル群が作成される
    __init__.py
    admin.py
    models.py
    tests.py
    views.py

## モデルの設計
- models.pyを編集して、アプリケーションに必要なテーブル設計を行う。
- 設計したアプリケーションを、setting.pyのINATALLED_APPSに登録
- python manage.py sql pollsで登録SQLを確認
- DBに反映

## Adminページでよく利用する項目
File : Application_Dir/admin.py
- admin.site.register(Poll,PollAdmin) : Admin画面から編集できるように登録、細かい設定を別クラス(Ex : PollAdmin)で定義

File : Project_Dir/setting.py
- TEMPLATE_DIRS : Look & Feelを設定するテンプレート置き場を指定。Defaultはdjango/contrib/admin/templates/admin配下にある
Mautic AMIでバーチャルホストを追加する

<a href="https://aws.amazon.com/marketplace/pp/B00YAY9OX6" >Mautic Powered by AMIAGE on AWS Marketplace</a>

そもそもMauticでバーチャルホストをガンガン追加する必要があるのかという疑問には答えない。
##ファイルのコピー
```
$ sudo su -

#ファイルコピー
# mkdir /var/www/vhosts
# cp -R /var/www/html/ /var/www/vhosts/YOUR.DOMAIN


#コピー元の設定情報削除
# rm -f app/config/local.php
# rm -f app/bundles/InstallBundle/InstallFixtures/ORM/LoadUserData.php

#オブジェクトキャッシュ削除
# rm -rf app/cache/prod/*

```


##Apache設定
```
# vim /etc/httpd/conf.d/YOUR.DOMAIN.conf
<VirtualHost *:443>
DocumentRoot /var/www/vhosts/YOUR.DOMAIN/
ServerName YOUR.DOMAIN
CustomLog logs/YOUR.DOMAIN.log combined

include conf.d/ssl.include

<Directory "/var/www/vhosts/YOUR.DOMAIN/">
  include conf.d/mautic.include
</Directory>

include conf.d/letsenc.include
</VirtualHost>

# vim conf.d/mautic.include
Require all granted
AllowOverride All
Order allow,deny
Allow from all

```


##SSLを設定
```
# /opt/letsencrypt/bin/letsencrypt certonly -t \
  -d YOUR.DOMAIN \
  -a webroot --webroot-path=/var/www/vhosts/YOUR.DOMAIN --rsa-key-size 2048 --server https://acme-v01.api.letsencrypt.org/directory
  
# crontab -e
0 4 1 * * root /opt/letsencrypt/bin/letsencrypt renew`
```

ここまでやってYOUR.DOMAINにアクセスすると、Mauticのセットアップウィザードが起動する。

##cronjobの設定
```
# crontab -u apache -e
# Updating Lead Lists
1-59/5 * * * * /usr/bin/php /var/www/vhosts/hogehoge.com/app/console mautic:campaigns:trigger

# Update Campaigns
1-59/5 * * * * /usr/bin/php /var/www/vhosts/hogehoge.com/app/console mautic:campaigns:update

# Execute Campaign Actions
1-59/5 * * * * /usr/bin/php /var/www/vhosts/hogehoge.com/app/console mautic:leadlists:update
```

#付記：Apacheの設定ファイルをまとめて作るスクリプトなど
```
# cd /etc/httpd/conf.d/
# vim vhost.template 
<VirtualHost *:443>
DocumentRoot /var/www/vhosts/_HOSTNAME_/
ServerName _HOSTNAME_
CustomLog logs/_HOSTNAME_.log combined

include conf.d/ssl.include

<Directory "/var/www/vhosts/_HOSTNAME_/">
  include conf.d/mautic.include
</Directory>

include conf.d/letsenc.include
</VirtualHost>

# ls m0* -1 | sed s/\.conf// | xargs --replace bash -c "cat vhost.template | sed s/_HOSTNAME_/{}/ > {}.conf"
```
Bitnamiを使わずにWindowsへRedmineをインストールする

Windows環境へのRedmineインストールはBitnamiが一般的で、Linuxのように個別にミドルウェアとかをインストールする手順はあまり見かけない。
理由は、おそらくLinuxのインストール手順使われているAPサーバのPassengerがWindowsにインストールできないからだと思ってる。

色々探すと、Passengerではなく、thinをAPサーバに使っている例がある。ただ、ちょっと古かったりするので、現時点での方法を書いておく。

## Rubyインストール
* Ruby installer for Windowsを使ってインストール
* 合わせて、RubyのDevelopment Kitもインストール

## MySQLインストール
* MySQLのWindows版をインストーラーからインストール
* Setup typeをServer onlyにするのが最小限？
* 同時にユーザも管理者として作っておく

## Redmineインストール
* Redmineのtarボールなりzipをダウンロードして解凍
* config/database.ymlを以下のように記述

  ```yaml:database.yml
  production:
    adapter: mysql2
    database: redmine
    host: localhost
    username: redmine
    password: Password1
    encoding: utf8
```

* MySQL Command Line ClientでredmineとしてDBを作成
* ここから、Rubyコマンドプロンプトを管理者として実行

  * Proxy環境の場合、まずはProxyをセット
    
    ```batch
    > set http_proxy=http://proxyID:proxyPASS@ProxyURL:ProxyPort/
    > set https_proxy=http://proxyID:proxyPASS@ProxyURL:ProxyPort/
    ```

  * bundlerをインストール
  
    ```batch
    > gem install bundler
    ```

  * thinをインストールするため、Gemfile.localを作成、thinをWindowsサービス化するためのthin_serviceも追加


    ```Gemfile.local
    gem "thin"
    gem "thin_service"
    ```

  * bundle installを実行

    ```batch
    > bundle install --without development test # 32bitの場合
    > bundle install --without development test rmagick # 64bitの場合
    ```

  * rakeでDBとかの初期セットアップ

    ```batch
    > rake generate_secret_token
    > set RAILS_ENV=production
    > rake db:migrate
    > rake redmine:load_default_data
    ```

  * 一旦、動作確認

    ```batch
    > bundle exec rails server webrick -e production
    ```

  * 問題なければ、一旦止めて、Windowsサービスとして登録

    ```batch
    > thin_service install -N "Redmine" -c "C:\redmine" -p 3000 -e production
    ```

  * Windowsの管理ツールから サービス を選択し、 Redmine のプロパティを開いて、スタートアップの種類を **自動** に変更
C#で外部から取得したXMLをモデルクラスにマッピングする方法

[メモ書き]

たとえば下記のようなXMLが取得できる場合を想定

```xml
<report>
  <head>
    <title>Title</title>
    <type>Type</type>
  </head>
  <body>
    <item>
      <name>A</name>
      <age>20</age>
    </item>
    <item>
      <name>B</name>
      <age>22</age>
    </item>
  </body>
</report>
```

下記クラスを定義する

```csharp:model.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Serialization;

namespace Test
{
	[XmlRoot("report")]
	public class Report
	{
		[XmlElement("head")]
		public Head head;

		[XmlElement("body")]
		public Body body;
	}

	public class Head
	{
		[XmlElement("title")]
		public string title;

		[XmlElement("type")]
		public string type;
	}

	public class Body
	{
		[XmlElement("item")]
		public List<Item> items;
	}

	public class Item
	{
		[XmlElement("name")]
		public string name;

		[XmlElement("age")]
		public int age;
	}
}
```

```csharp:main.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml.Serialization;

namespace Test
{
	public void main() 
	{
		var url = "{url}";
		HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
		HttpWebResponse response = request.GetResponse() as HttpWebResponse;
		var stream = response.GetResponseStream();
		XmlSerializer serializer = new XmlSerializer(typeof(Report));
		var report = serializer.Deserialize(stream) as Report;
	}
}
```
Watson IoT Platform - Node-RED - ファンクションの使い方

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
この項目ではFirefoxを使用することをお薦めします。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。

#functionノードの使い方
Node-RED画面左側のパレットの「function」欄にはNode-REDで使用可能なさまざまな機能（ファンクション）が用意されています。
![スクリーンショット 2016-05-18 9.28.07.png](https://qiita-image-store.s3.amazonaws.com/0/125842/59233d14-05c9-db46-1d69-1172adb8364e.png)

1. [Watson IoT Platform - Node-RED - 入力・出力の使い方](http://qiita.com/egplnt/items/8beb2d4f382ad39c93cd)で用意したフローを使用します。
2. Node-RED画面左側のパレットの「function」欄の先頭にある「function」ノードをドラッグ＆ドロップでワークスペースに移動します。
3. 移動するとデフォルトではファンクション名は空欄になります。
4. ダブルクリックで開くと、デフォルトで"return msg;"がセットされていることがわかります。
5. 下記を入力します。この項目で、functionノードの編集はFirefoxで行う事で日本語環境でも問題なく操作可能です。またNode-REDはその名の通りnode.jsをベースに稼働しているので、このfunctionノードには好きなjavascriptのコードを書く事が可能です。

```:function
msg.payload = msg.payload + "ございます";
return msg;
```


functionウィンドウ下部の「OK」を押して保存します。
![スクリーンショット 2016-05-18 10.02.31.png](https://qiita-image-store.s3.amazonaws.com/0/125842/286f6adc-df69-aac0-cb8c-6551bc0662d5.png)

#フローの作成
1. [Watson IoT Platform - Node-RED - 入力・出力の使い方](http://qiita.com/egplnt/items/8beb2d4f382ad39c93cd)で用意したinjectノードをダブルクリックし、Stringを選択し、入力文字列として「おはよう」と指定します。
![スクリーンショット 2016-05-18 10.00.01.png](https://qiita-image-store.s3.amazonaws.com/0/125842/c1ee80e9-adf4-a767-4b28-ba7910c68f6f.png)

2. injectノードの右端の白い四角から線を引き出してfunctionノードの左側の白い四角へ接続し、同様にfunctionノードとdebugノードを接続し、画面右上の赤いDeployボタンを押してクラウド上のIoTアプリへ反映します。
3. Deployが成功したら、injectノード左側のボタンを押し、debugタブに「おはようございます」と結果が表示されるのを確認します。
 ![スクリーンショット 2016-05-18 10.08.45.png](https://qiita-image-store.s3.amazonaws.com/0/125842/f8c494b8-4819-220d-d576-f8dce0b7b17f.png)
4. functionノードではもちろん文字列以外のデータも扱う事が可能なので、他の機能も試してみてください。
5. またfunctionパレット（画面左側）には、functionノード以外にも「delay」や「switch」など様々な機能が用意されています。それぞれのノードをドラッグ＆ドロップでワークプレースに置き、画面右側の「info」タブを選択することで、それぞれのノードの使い方についての情報が表示されます。試してみてください。
Watson IoT Platform - Node-RED - 入力・出力の使い方

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。
#入力の使い方
Node-RED画面左側のパレットの「input」欄にNode-REDで使用可能なさまざまな入力が用意されています。

![スクリーンショット 2016-05-18 8.45.42.png](https://qiita-image-store.s3.amazonaws.com/0/125842/cd32983b-e884-1e92-8fb0-1b0819b618b0.png)

1. 一番上にある「inject」ノードをドラッグ＆ドロップで画面右側のワークスペースに移動します。
2. 移動するとデフォルトで「timestamp」になります。ダブルクリックで開くと使用可能な入力のオプションが表示されます。![スクリーンショット 2016-05-18 8.56.21.png](https://qiita-image-store.s3.amazonaws.com/0/125842/712b379c-eb94-30e7-daaf-a25d7124f774.png)
3. 他にもInput欄には様々な入力ノードが用意されているので確認してみてください。

#出力の使い方
前項と同様に、「output」欄にはNode-REDで使用可能なさまざまな出力が用意されています。

![スクリーンショット 2016-05-18 9.04.00.png](https://qiita-image-store.s3.amazonaws.com/0/125842/88afc7a3-84f3-2478-4d5c-a4ccc9e6bd88.png)

1. 先頭にある「debug」ノードをドラッグ＆ドロップでワークスペースへ移動します。
2. 移動するとデフォルトで「msg.payload」になります。ダブルクリックで開くと使用可能な出力のオプションが表示されます。

#入力と出力を接続して画面へ表示
1. 前項で用意したinjectノードの右端の小さい白い四角からドラッグして線を引き出し、debugノードの左端の小さい白い四角へ繋ぎます。
![スクリーンショット 2016-05-18 9.08.58.png](https://qiita-image-store.s3.amazonaws.com/0/125842/a67a8e03-921b-33f3-22e8-4b45c4b7eb51.png)

2. 画面右上の赤い「Deploy」ボタンを押して前項までのブラウザでの定義をクラウド上のIoTアプリへ反映します。Deployが成功すると「Successfull deployed」のメッセージが表示されます。![スクリーンショット 2016-05-18 9.11.12.png](https://qiita-image-store.s3.amazonaws.com/0/125842/0ee972ff-7b5f-75bc-280b-3fe44b8ec543.png)

3. 画面左側の「debug」タブを選択し、デバッグ出力を見られるようにします。
4. injectノードの左側のボタンを押して、debug出力へタイムスタンプが表示される事を確認します。
![スクリーンショット 2016-05-18 9.15.58.png](https://qiita-image-store.s3.amazonaws.com/0/125842/a34a22a5-737f-8d25-453d-f4e9ef183745.png)

5. injectノードには他にも文字列を送付するString等のオプションもあるので確認してみてください。
NuAns Neoを手に入れたのでWindows 10 Mobile向けのアプリケーション開発にチャレンジしたい。

前回の投稿からかなりの日が経ってしまった:sweat:。
少しづつ自分の時間が取れるようになったため、活動を再開しよう。

NuAns Neoを入手して一か月ほど経過した。
Windows 10 Mobileを搭載したスマートフォンです。

https://neo.nuans.jp/

昨年夏よりWindows Phoneが日本に再上陸したわけだが、上位機種にのみ対応したContiniuumに惹かれて、上位機種の発売を待ったうえで購入しました:bowtie:。

VAIO Phone Bizとの比較もあったが、NuAns Neoの方が発売が早く、バッテリー容量が多くお財布携帯には対応してないがNFCの読み取りも可能ということもあり、開発するなら野心的な端末をと選択しました。

いまだにOSのバージョンアップがうまくいかないとか、地震速報に対応していない？など、小さな問題はあるが当初の期待通りに使えているので、今のところ満足しています。

待望のContinuum機能は、接続して感動したもののマウスもキーボードもないタイミングだったため、詳しくは使えていない。もう少しネタが溜まったら改めて投稿したいと思います。

日々の本業が激務だったため、アプリケーション開発の時間が取れなかったが、定時くらいに帰ることができるプロジェクトに配置されたので、これからは色々と触っていきたいと思います。
CakePHP 2.xでビヘイビアをモック化する


ああ、今更Cake2の書くのはちょっと・・・と思わないでもないのですが、Kobitoの肥やしにしておくだけっていうのも悲しみがあるので下書き放出ポスト。

掲題のとおりです。  
「モデルは難儀すること無くモック化できた、しかしビヘイビアはどうするのじゃ〜」と少し考えさせられた機会があったので。試し見てたらできた、というメモ。

## Behaviorがどう読み込まれるか
[soruce](http://api.cakephp.org/2.6/source-class-BehaviorCollection.html#83)

```php
ClassRegistry::getObject($class);
```
みたいな処理をしていますね。
ここの返り値を制御できれば勝てそう
## ClassRegistryは、どうやってクラスを出し入れしているの？
[source](http://api.cakephp.org/2.6/source-class-ClassRegistry.html#251)

1. そのキーに対応するオブジェクトが登録されていれば、それを返す
  * 二重読み込みとかをいい感じに避けるアレ
2. 未ロードだったら、対応するクラスを探してきて返す

つまり「予めモックを登録」しておけば良い・・？

### ClassRegistry::addObject()の存在
「キーに対応するオブジェクト」とさらっと書きましたが、実際に「登録」を行っているメソッドがこちらです。   
[hiromi2424さんの記事](http://d.hatena.ne.jp/hiromi2424/20100410/1270889150)

実例で言えば、フレームワーク中のコードModelにおいて、「自身(=モデルクラス)自身のコンストラクタ内で、自身を登録する」という処理が行われています。 

```php
ClassRegistry::addObject($this->alias, $this);
# http://api.cakephp.org/2.6/source-class-Model.html#727
```
これによって、「Userモデルがインスタンス化された時に、key:Userに対して$Userを紐付ける」が実現するわけですね。
ビヘイビアについても同様なので、つまり「`HogeBehevior`が読み込まれようとした時に、何を返すか」はアプリケーション側から制御可能というわけです。


## 実際にビヘイビアをモック化してみる
モデルの単体テストにおいて、`HogeBehavior`はテストスコープ外なんだぜ・・・！という時。  
testのSetUp()中でやってみる例。  

```php
    public function setUp() {
        parent::setUp();
        // 最初に「実際のクラスを扱えるように登録」して、
        App::import('Model/Behavior', 'HogeBehavior');
        // 読み込めるようになったクラスからモックを作成し
         $HogeBehavior = $this->getMock('HogeBehavior', ['someMethod']);
        // `HogeBehavior`として、実際のビヘイビアではなくモックを登録する
        ClassRegistry::addObject('HogeBehavior', $HogeBehavior);
    }

```

これで行けるようになります。
IngressのスキャナのVer.upを誰よりも速く知る方法

#はじめに
2016/05/18の日本時間の5時頃、Android版、iOS版ともに、Ingressのスキャナ 1.100.0 がリリースされました。
隠していたわけではありませんが、常日頃から私はどうやってスキャナのVer.upを把握していたのか、その方法を紹介します。

#していたこと

・cronで15分毎に以下のWebページをチェックしていました
　・Android版
　　　https://play.google.com/store/apps/details?id=com.nianticproject.ingress&hl=ja
　・iOS版
　　　https://itunes.apple.com/jp/app/ingress/id576505181?mt=8

つまり、
```0,15,30,45 * * * * /home/nuwaa/scanner_chk/go
```ってことです。

で、goの中身はというと、

```
cd /home/nuwaa/scanner_chk

wget -q -O ANDROID "https://play.google.com/store/apps/details?id=com.nianticproject.ingress&hl=ja"
AV=`cat ANDROID | sed "s/</\n</g" | grep "softwareVersion" | sed -e "s/<[^>]*>//g"`
echo `date +"%Y/%m/%d %H:%M:%S "`$AV >> android
OLD=`tail -n 2 android | head -n 1 | awk '{print $3}'`
NOW=`tail -n 1 android | awk '{print $3}'`
if [ $OLD != $NOW ]; then
  echo "Android" | mail -s "Scanner Update" **自分のメールアドレス**
fi

wget -q -O IOS "https://itunes.apple.com/jp/app/ingress/id576505181?mt=8"
IV=`cat IOS | awk '$0 ~ /<li><span class="label">バージョン: <\/span>.*<\/li>/' | sed "s/li>/li>\n/g" | grep "バージョン" | sed -e "s/<[^>]*>//g" | awk '{print $2}'`
echo `date +"%Y/%m/%d %H:%M:%S "`$IV >> ios
OLD=`tail -n 2 ios | head -n 1 | awk '{print $3}'`
NOW=`tail -n 1 ios | awk '{print $3}'`
if [ $OLD != $NOW ]; then
  echo "iOS" | mail -s "Scanner Update" **自分のメールアドレス**
fi

rm ANDROID IOS
```
って内容で、バージョンの数値を引っ張り出してチェックしていました。
汚い記述ですけれど、実際に数年間これを稼働してきました。

このスクリプトは、15分毎のチェックの際にログも残してくれます。
一部抜粋しますと、

```text:android
2016/05/18 04:15:02 1.99.1
2016/05/18 04:30:02 1.99.1
2016/05/18 04:45:01 1.99.1
2016/05/18 05:00:01 1.100.0
2016/05/18 05:15:02 1.100.0
2016/05/18 05:30:01 1.100.0
```
```test:ios
2016/05/18 04:15:02 1.99.1
2016/05/18 04:30:02 1.99.1
2016/05/18 04:45:02 1.99.1
2016/05/18 05:00:02 1.100.0
2016/05/18 05:15:02 1.100.0
2016/05/18 05:30:02 1.100.0
```
という具合です。
なので、いつ頃にどのバージョンがリリースされたのかを振り返ることが可能となっております。

#もちろん。。。

たとえば、こういう書き方でも同じようなことはできます。

```py3:ingress-ios-chk.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.PhantomJS()
driver.get("https://itunes.apple.com/jp/app/ingress/id576505181?mt=8")

data = driver.page_source.encode('utf-8')
soup = BeautifulSoup(data, "html.parser")

a = soup.find_all("li", class_="release-date")
b = a[0].find_next_sibling("li")
b.span.decompose()
itunes_ver = b.text.strip()
print (itunes_ver)

driver.close()
```

ですけれど、動作の軽快さとかからすると、シェルで組んでしまったほうが手っ取り早かったりします。

#というわけで、
緑でも青でも、イングレスやっていなくても、スクレイピングの方法だとか、シェルでの自動化とかに興味を持っていただけると、これまた、違う側面から

**The world around you is not what it seems.**
（あなたの周りの世界は、見たままのものとは限らない）

ってことになりますよ。

#参考
　・http://osanai.org/50/
　　　ingress-ios-chk.pyを組むに当たって、参考にさせていただきました。
arduinoでインスツルメント　パネル　テスター

#概要
ベネリ　アディバと言う、屋根付きスクーターのインスツルメント　パネルをarduino　unoでテストしてみた。
パルスは、一回転６発。
タイヤは、120/70-13なので、円周1.56ｍなのだが、ずれる。
１．６６ｍの様だ。
#動画
https://www.youtube.com/watch?v=IXA_nwyYKro
#写真
![MVC-002S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/b0bab6bb-eb5a-4e4b-2262-c81dd8c140b3.jpeg)

#回路図
![simu3.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/cceccfbf-0462-40fc-fb37-27731da2bcf7.jpeg)

#回路図
![test3.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/8e19f0da-7067-ecb0-d3a5-e9abf4ff091d.jpeg)

#サンプルコード
```
#include <Lcd4567.h>
#include <TimerOne.h>

Lcd4567 lcd;
volatile int rpm = 20;
volatile int span = 100;
void fire()
{
	digitalWrite(9, LOW);
	digitalWrite(8, LOW);
	delayMicroseconds(span);
	digitalWrite(9, HIGH);
	digitalWrite(8, HIGH);
}
void setrev(int rpm)
{
	long us = 990000 / rpm;
	span = us / 4;
	Timer1.initialize(us);
	Timer1.start();
}
void setup()
{
	pinMode(9, OUTPUT);
	digitalWrite(9, HIGH);
	pinMode(8, OUTPUT);
	digitalWrite(8, HIGH);
	lcd = Lcd4567();
	lcd.begin(20, 4);
	lcd.setCursor(0, 0);
	lcd.print("benelli simu3");
	lcd.setCursor(0, 1);
	lcd.print("set km/h");
	lcd.setCursor(0, 2);
	lcd.print("read vol");
	lcd.setCursor(0, 3);
	lcd.print("ok");
	Timer1.initialize(100);
	Timer1.attachInterrupt(fire);
}
void loop()
{
	int val;
	lcd.setCursor(15, 1);
	lcd.print("    ");
	lcd.setCursor(15, 2);
	lcd.print("    ");
	delay(100);
	val = analogRead(A0);
	rpm = map(val, 0, 1023, 0, 120);
	setrev(rpm);
	lcd.setCursor(15, 1);
	lcd.print(rpm);
	lcd.setCursor(15, 2);
	lcd.print(val);
	delay(500);
}

```
YAML の `---`（ハイフン 3 つ）は何か？


ハイフン 3 個の行は、本来は「YAML 文書の分割」の意味である。 ∥ [YAML - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/YAML)

一つのファイル内に複数の YAML 文書を入れるために用いられるのだが、一文書しかない場合に「YAML 文書が始まること」を明示するために使われるそうだが…。？？ 何かどうも。

もちろん無くてもよいのだが、文書s であることを明示するには付けた方が良いのかも知れない。

* 読み始めで `---` が出てきた → 1 つ以上の文書からなることが分かる
* 読み始めで `---` 以外が出てきた → 1 つの文書があることが分かる

といった感じか。

なお、`...` で、一連のストリームの終わりを意味する。
LuxRenderをUbuntu / NVIDIA Proprietary Driverで使う際のOpenCLエラーの対処法

OpenCL周りで、ちょっとハマったので書いておきます。

## インストールするパッケージ
* nvidia-opencl-icd-XXX (NVIDIA GPU)
* beignet-opencl-icd (Intel統合GPU)

NVIDIAのプロプラドライバを使用している環境で、後者のパッケージを入れていると、OpenCLを使うときに「dri2 connection failed!」という警告が出ます。これはNVIDIAのプロプラドライバがdri2を使用しないためとのこと。警告が出る場合でも、Intel統合GPU側のOpenCLも特に問題無く動作するように見えます。

## アンインストールするパッケージ
* mesa-opencl-icd (AMD GPU)

これが入っていると、「RuntimeError: clGetDeviceIDs」というエラーが出て、LuxRenderが動かなくなります。対応するデバイスが無いのが原因な気がします。
mesa-opencl-icdは、まだllvmpipeに対応していないため、AMDのGPUが入ってない場合はこれをアンインストールしましょう。

## 環境検証用
* clinfo
* python-pyopencl

入れておくと環境検証に便利でしょう。
Swiftを英語ビデオで学ぶサイトまとめ

Swift3に更新しました。

## スタンフォード大学のポール教授の授業
stanford swift でググれば出てくる。
英語も分かりやすい。
https://www.youtube.com/watch?v=_lRx1zoriPo&list=PLsJq-VuSo2k26duIWzNjXztkZ7VrbppkT

Objective-Cバージョンもある。

## ChrisさんのYouTubeビデオ
初心者向け。最近のビデオなので、Xcode8, Swift3, iOS10ベース。アジア系の英語で聞き取りやすい。
https://www.youtube.com/watch?annotation_id=annotation_223156613&feature=iv&index=1&list=PLMRqhzcHGw1ZkH8RuznGMS0NZs0jWQQ5a&src_vid=ojbb6nGvIi8&v=mncFy1H7OUM

## Lets Build That App
Firebase, Facebook, Twitterとか幅広いチュートリアル
https://www.youtube.com/channel/UCuP2vJ6kRutQBfRmdcI92mA

## JaredさんのYouTubeビデオ
７０本以上のビデオがある。一本一本がコンパクトにまとまってる。英語が少し早口だが、聞き取りやすく、ノリが良い。
https://www.youtube.com/playlist?list=PL3MWPU0RhJzFehC7lvSD6Q43GrK96GSLi

## BrianさんのYouTubeビデオ
穏やかな語り口。わかりやすい英語。
https://www.youtube.com/watch?v=vijjJRwrfmI&list=PLY1P2_piiWEbWAmILtGHnFde7nVLZxcN0

## Apple WWDC で使用したビデオ
定番の本家のサイト。Safariで開きましょう。
https://developer.apple.com/swift/resources/

## WWDC2016 YouTubeまとめ
https://www.youtube.com/playlist?list=PLxwBNxx9j4PXxNeuu3_XWpd-iSnVOoFqf

## udemy の有料のチュートリアルビデオ (2500円)
初心者向け。言語レベルから幅ひろく網羅している。英語も聞き取りやすい。
https://www.udemy.com/courses/search/?q=swift%203%20ios%2010&src=sac&kw=swift%203
CakePhp3のComponentの使い方まとめ

#コンポーネントとは
CakePhp3でコンポーネントとは、各コントローラ間で共通の処理をまとめたもの。
[コンポーネント - 3.7](https://book.cakephp.org/3.0/ja/controllers/components.html)

#用意されているコンポーネント
よく使われるようなコンポーネントは用意されている。
以下のようなものがある。

- 認証(AuthComponent)
- クッキー(CookieComponent)
- クロスサイトリクエストフォージェリ(CsrfComponent)
- フラッシュ(FlashComponent)
- セキュリティ(SecurityComponent)
- ページ制御(PaginatorComponent)
- リクエストハンドリング(RequestHandlerComponent)

()内はそれぞれのクラス名だが、実際に使用する場合はコンポーネントより前の部分(AuthComponentであれば、Auth)を使うため、これを**コンポーネント名**として、以下の説明をしていく。

#使い方
##コンポーネントを読み込む
コンポーネントを読み込む方法には、フィールドで宣言する方法とloadComponentを使う方法、自分でインスタンス化する方法があるが、Controller、Component、Shellのどこから使うかによって、使える方法が異なる。

|方法        | Controller　| Component | Shell |
|:-----------|:---------:|:---------:|:-----:|
| loadComponent | OK     | **NG**    | **NG**     |
| フィールド宣言 | OK     | OK         | **NG**      |
| インスタンス化 | OK     | OK         | OK     |

###フィールドで宣言する
使いたいクラスのpublicフィールドとして、配列$componentsを宣言し、その中にコンポーネント名を書いていく。

```php:AuthComponentとCookieComponentの読み込み
 public $components = ["Auth", "Cookie"];
```

各コンポーネントに引数(配列)を渡す場合、コンポーネント名をキー、引数を配列として$componentsを宣言する。

```php:AuthComponentとCookieComponentの読み込み
 public $components = ["Auth" => [/*AuthComponentの引数*/],
                       "Cookie" => [/*CookieComponentの引数*/]];
```
この方法の場合、宣言したクラスのすべてのメソッドで、指定したコンポーネントのインスタンスに`$this->コンポーネント名`でアクセスすることができる。


###loadComponentを使う
loadComponentメソッドで、第1引数にコンポーネント名を指定すると、そのコンポーネントのインスタンスが返ってくる。
第2引数は省略可能だが、配列を渡すとコンポーネントの引数として渡される。

```php:AuthComponentの読み込み
$this->Auth = $this->loadComponent('Auth',[/*引数*/]);
```

###自分でインスタンス化する
自分でインスタンス化することもできる。
まずは、以下の3つのクラスを読み込む。

```php:クラス読み込み
use Cake\Controller\Component;
use Cake\Controller\ComponentRegistry;
use App\Controller\Component\使うコンポーネントのクラス名;
```
複数のコンポーネントを読み込む場合は、その分だけ使うコンポーネントのクラスをuseしておく。

コンポーネントをインスタンス化する場合には、第1引数にComponentRegistry、第2引数にコンポーネントの引数(省略可能)を渡してインスタンス化する。

```php:AuthComponentの読み込み
$this->Auth = new AuthComponent(new ComponentRegistry(), [/*引数*/]);
```

##コンポーネントを使う
各種の方法でインスタンス化されたコンポーネントのメソッドを呼び出せばいいだけ。
loadComponentや自分でインスタンス化する場合も、$this->コンポーネント名のフィールドにインスタンスを格納しておくと使いやすいと思う。

```php:AuthComponentの使用例
$this->Auth = $this->loadComponent('Auth');
$this->Auth->user('username');//AuthComponentのuserメソッドの呼び出し
```


作り方についても近いうちにまとめます。
→まとめました
[CakePhp3のComponentの作り方まとめ](http://qiita.com/frost_star/items/f652a798a211d606d60d)
Zybo > Chronicles blog 15 > timer reigsters > Private Timer Load Register / Private Timer Counter Register / Private Timer Control Register / Private Timer Interrupt Status Register 

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Implementing-the-Zynq-SoC-s-Private-Timer-Adam-Taylor-s-MicroZed/ba-p/402203

> The timer itself is controlled via four registers in the Zynq All Programmable SoC:

> - Private Timer Load Register – used in auto reload mode. This register contains the value to be reloaded into the Private Timer Counter Register when auto reload is enabled.
- Private Timer Counter Register – This register is the actual counter itself. When the value in this register reaches zero, an interrupt event flag is set (when enabled).
- Private Timer Control Register – This control register enables or disables the timer, auto reload mode, and interrupt generation. It also contains the timer pre-scaler.
- Private Timer Interrupt Status Register – This register contains the Private timer interrupt status event flag


Private Timer Load Register に値を設定して、Private Timer Control Register でTimerの有効、無効を切替え、auto reload modeを設定、Private Timer Interrupt Status Registerでinterruptの状態を見る、という感じだろうか。

実際に使ってみるのが理解につながるだろう。
Zybo > Chronicles blog 15 > xscutimer.h > timer関連の各種マクロが定義されている

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Implementing-the-Zynq-SoC-s-Private-Timer-Adam-Taylor-s-MicroZed/ba-p/402203

> Xscutimer.h contains functions (macros) that:

- Initialize the timer
- Run a timer self test
- Start and stop the timer
- Manage the timer (restart, check if expired, load the timer, enable/disable auto loading)
- Set the pre-scaler
- Get the pre-scaler value
- Setup, enable, disable, clear, and manage timer interrupts
Zybo > Chronicles blog 14 > ARM  PLL > clocks setting > CPU_6x4x / CPU_3x2x / CPU_2x / CPU_1x

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/MicroZed-Timers-Clocks-and-Watchdogs-Adam-Taylor-s-MicroZed/ba-p/399219

> he PLL output are used in combination with programmable dividers and clock-ratio dividers to generate the clocks used within the PS.
The CPU clock domain as generated by the ARM PLL and used by the timers has four possible clocks:

- CPU_6x4x
- CPU_3x2x
- CPU_2x
- CPU_1x

> There are two clocking schemes for the Zynq SoC that define the division factors and hence output frequencies of these clocks: 6:3:2:1 and 4:2:2:1. 

上記の4つを縦に読むと以下になり、文面の定義(6:3:2:1 and 4:2:2:1)と合致する。4つの数値がそれぞれ何に対応するのかは未消化。

- 6,3,2,1
- 4,2,2,1

> Note: For more detailed information about the Zynq SoC’s timers, see Chapter 8 in the Zynq-7000 All Programmable SoC Technical Reference Manual.
技術英語 > hit the wet layer, [bounce back], hit the air on top of the dune, [bounce back] / contact bounce / to debounce the switch

http://www.scientificamerican.com/podcast/episode/what-makes-sand-dunes-sing/
> When sand avalanches, it shoots off sound waves of various frequencies. Those waves travel through the dry sand, hit the wet layer, <font color=red>bounce back</font>, hit the air on top of the dune, <font color=red>bounce back</font>, and so on.

<hr>

bouncingというのは、Zynq関連のAdam TaylorによるMicroZed Chronicle Kindle Editionにおいて、回路のチャタリング説明において出てきた。

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]
No. 603/2129

> contact bounce

…


> to employ either hardware or software to <font color=red>debounce</font> the switch.
CroutonでUSBストレージ/SDカード上のファイルシステムをマウントする際のコツ

# 課題

ディスク容量の少ない Chromebook で Crouton を使っていると、外部のストレージにデータやコマンドを置きたいと思うようになります。
その際、下記の問題が出る場合があります。

* ChromeOS は、/media/removable にマウントするストレージに noexec オプションを付ける
 * executable bit がついたバイナリ/スクリプトを実行できない
* スリープ時に /media/removable に接続されたディスクのアンマウントを試み、給電を中止する Chromebook がある
 * アンマウント対象のファイルシステムを握っているプロセスがあると、アンマウントされないまま給電が止まる　

後者は DELL Chromebook11 でのみ確認していますが、おそらく他機種でも該当するのではと思っています。
前者は単に実行できないだけなのですが、後者はファイルシステム破損に直結しますので看過できません。

# 解法

上記2点を解決するスクリプトは、下記のとおりです。

```
#!/bin/bash

dev=$(/sbin/blkid -L "Ext3")
echo $dev
path_raw=$(udevadm info --query=path $dev)  
path_trunc=`echo "$path_raw" | perl -pe 's|(.*usb[0-9]\/(.*?\/)).*|\1|'`
path="/sys$path_trunc/power/persist"
echo 1 | sudo tee "$path"
sudo mount -oremount,exec $dev
```

"Ext3" は、スリープ時でも電源を落としたくないファイルシステムのディスクラベルを指定します。"UNTITLED" などお手持ちの環境に合わせて変更してください。
スクリプト内部で sudo を呼んでいるので、パスワードを問われます。

# 注意事項

私は Crouton に入ってから上記スクリプトを実行しています。ChromeOS/ChromiumOS 単体で動作するかの確認はしていません。
Dockerコンテナ起動時の初期化されるファイル一覧

docker start を行うとコンテナはDockerイメージから起動します。
ところがApache をインストールしたWEBコンテナにて、/etc/httpd/conf.d 配下のファイルを編集後、docker stop して、再度docker start してもコンテナ上の設定は残っています。

■ 仮説
結局、Dockerイメージを利用して起動する部分は局所的なんでしょ？！
と仮設を立てて、いろいろなファイルをいじってみました。（まだ検証途中ですが、分かってる範囲で追記していきます。切りがないと言えば切りがないですが、みなさんの何かの助けになれば・・・）

--------
＜イメージから起動されて、設定が残らないファイル＞
/etc/hosts
/etc/hostname
/etc/resolv.conf
systemctl disable mysql  → インストール方法によるものなのかな。。。。


--------
＜docker stop / docker start を実行しても設定が残るファイル＞
（おそらく上記設定が残らないファイルに記載されているもの以外）
/etc/httpd 配下
/etc/hosts.allow
/etc/hosts.deny
/etc/ssh/sshd_config
systemctl enable / disable の情報
ActiveRecord クラス


後日、少しづつまとめるためのメモ


SQL文
```$this->db->last_query();```

総件数
```$this->db->?```


```php
    //ヘッダ情報追加
    foreach(['total','count','offset','debug'] as $entry){
      switch ($entry){
      case 'total':
      //if(empty($$entry)){break;}          ==>汎用的な書き方だけどわからなくなりそうな
      //$result['head'][$entry] = $$entry;
        if(empty($total)){break;}
        $result['head'][$entry] = $total;
        break;
      case 'count':
        if(empty($limit)){break;}
        $result['head'][$entry] = $limit;
        break;
      case 'offset':
        if(empty($offset)){break;}
        $result['head'][$entry] = $offset;
        break;
      case 'debug':
        //$result['head'][$entry]['source']  = $sources;
        $result['head'][$entry]['SQL']  = $this->db->last_query();
        $result['head'][$entry]['args'] = json_encode($ary_args);
        break;
      }
    }
```
Carrierwaveでlocaleファイルを追加してもTranslation missingになる


本家のREADME見ながらやってて、あれ、なんで？となったので、備忘録。

結果から言うと、現状安定版の0.11-stableと最新版(master)では、localeのkeyが変わっている。

```yaml:最新版(master)のja.yml
ja:
  errors:
    messages:
      carrierwave_processing_error: 処理できませんでした
      carrierwave_integrity_error: は許可されていないファイルタイプです
      carrierwave_download_error: はダウンロードできません
      extension_whitelist_error: "%{extension}ファイルのアップロードは許可されていません。アップロードできるファイルタイプ: %{allowed_types}"
      extension_blacklist_error: "%{extension}ファイルのアップロードは許可されていません。アップロードできないファイルタイプ: %{prohibited_types}"
      content_type_whitelist_error: "%{content_type}ファイルのアップロードは許可されていません"
      content_type_blacklist_error: "%{content_type}ファイルのアップロードは許可されていません"
      rmagick_processing_error: "rmagickがファイルを処理できませんでした。画像を確認してください。エラーメッセージ: %{e}"
      mini_magick_processing_error: "MiniMagickがファイルを処理できませんでした。画像を確認してください。エラーメッセージ: %{e}"
      min_size_error: "ファイルを%{min_size}バイト以上のサイズにしてください"
      max_size_error: "ファイルを%{max_size}バイト以下のサイズにしてください"
```

```yaml:安定版(0.11-stable)のja.yml
ja:
  errors:
    messages:
      carrierwave_processing_error: 処理できませんでした
      carrierwave_integrity_error: は許可されていないファイルタイプです
      carrierwave_download_error: はダウンロードできません
      extension_white_list_error: "%{extension}ファイルのアップロードは許可されていません。アップロードできるファイルタイプ: %{allowed_types}"
      extension_black_list_error: "%{extension}ファイルのアップロードは許可されていません。アップロードできないファイルタイプ: %{prohibited_types}"
      rmagick_processing_error: "rmagickがファイルを処理できませんでした。画像を確認してください。エラーメッセージ: %{e}"
      mime_types_processing_error: "MIME::Typesのファイルを処理できませんでした。Content-Typeを確認してください。エラーメッセージ: %{e}"
      mini_magick_processing_error: "MiniMagickがファイルを処理できませんでした。画像を確認してください。エラーメッセージ: %{e}"
```

具体的には、extension_white_listでハマった。white_listからwhitelistに変わったのは、理由があるのだろうか...。
こんな些細なミスで時間を浪費してしまう人が他にいませんように。