OmniAICreator/Qiita-1.07M huggingface dataset:
BDDにおいてどういう風にテストをかけばBehaviour(外部機能仕様)を書いたことになるのか。

BDDにおいてどういう風にテストをかけばBehaviour(外部機能仕様)を書いたことになるのか。

# 背景

BDDの"Behaviour(振る舞い)"を記述する、というのが意味わからなかったので
どういうふうにかけば振る舞いを記述したことになるのか、自分なりに調べてみました。
間違ってたら、ご指摘ください。

# 答え：

Given X When Y Then Z
(XであるときYするとZになる。)
という表現にする。

# なぜそれが、ふるまい(外部仕様機能)を記載することになるのか
* アプリケーションの全体像は有限オートマトンとして記述できる。
* 有限オートマトンは状態遷移の組み合わせで記載される。
* したがって、状態遷移をすべて記載すればアプリケーションの仕様は記載されることになる。
* 状態遷移を言語化すると「XであるときにYすればZになる」という形で表現できる。


# 例：
## 各項目が複数ある場合(and)
Given X1
and   X2
When  Y1
and   Y2
Then  Z1
and   Z2

X1かつX2であるときに
Y1かつY2すると
Z1かつZ2になる。

## 各項目が複数ある場合(or)
Given X1
or    X2
When  Y1
or   Y2
Then  Z1
or   Z2

X1またはX2であるときに
Y1またはY2すると
Z1またはZ2になる。

## 各項目が複数ある場合(and orがいりまじり)
Given X1
or    X2
When  Y1
and   Y2
Then  Z1
or   Z2

X1またはX2であるときに
Y1かつY2すると
Z1またはZ2になる。
crontabで奇数分や偶数分などに実行する指定を簡単に書く方法

# */2
cron で2分毎にコマンド実行をしたいときって `*/2` とかって書くことよくありますよね。5分毎なら `*/5` とか。

# 1,3,5,7,...
で、よくあるパターンですが2台のサーバがあって、片方は `0,2,4,6,..` のタイミングで実行して、もう一方では `1,3,5,7,...` のタイミングで実行したいこともよくありますよね？こういうとき前者は `*/2` でいいんだけど、後者はカンマで列挙するのが辛い…みたいな思いをすることもしばしば。

# 1-59/2
実はこれ `1-59/2` って書けば奇数分に実行するっていう意味にになるんですって。20年近く cron 使ってて初めて知りました！

# 割り算じゃなくてステップ数
`1-59/2` の 2 って割り算をして余りがゼロになるかどうかをチェックしてるんだとずっと思ってたんですが、実はこれ範囲値に対する**ステップ数**なんですね。

# 3n + m
なので、`0-59/3` と `1-59/3` と `2-59/3` みたいに書けば `3n + m` 分に実行するなんてことも簡単に出来ちゃいます。

# man 5 crontab
実は `man 5 crontab` をちゃんと読むと最後の方の拡張ってとこにちゃんとサンプル付きで説明が書いてあるんですね。悩む前に man くらいちゃんと読めって事ですね…、反省。

ちなみに `man crontab` だと `crontab` コマンドのマニュアルが出てきてしまうので、crontab の書式についてのマニュアルは `man 5 crontab` ってする必要がありますので注意してください。

ところで `man 5` って日本語だとなんだか口に出して読みにくいですよね。脳内で読むだけでもなんかソワソワしちゃうのは僕だけだろうか…。


# お
# わ
# り
[OpenWF] OpenWFに関する情報まとめ

OpenWFに関するメモ

: 2017/02/10段階
一部採用されている例は見かけるけれども、正直あんまり流行っている用には見えない。

# Khronos公式
[OpenWF - The Standard for building composited windowing systems](https://www.khronos.org/openwf/)

# OpenWFとは
> 　OpenWFはローレベルのハードウェア抽出インタフェースで、モバイル端末や組み込み機器向けのウィンドウ処理およびコントロール機能向けAPI。土台レベルのルーティングとして機能を提供し、「OpenGL ES」「OpenMAX」「OpenVG」などのKhronosのAPIと統合することで機能を追加できる。モバイル端末のリッチメディアやグラフィック強化につながると期待されている。
>　仕様は、ディスプレイコントロールハードウェアへのアクセス部分を担う「OpenWF Display」と、コンテンツの描画などを行う部分の「OpenWF Composition」の2種類がある。
>　OpenWF Displayはウィンドウシステムレベルのインタフェイスを定義するもので、HDMI、DVI、S-Video、組み込みLCDパネル、レガシーのディスプレイアダプタなどをサポートする。OpenWF Compositionは、システム全体レベルでコンテンツ作成を可能にするもので、アルファブレンド、マスキング、リサイズ、回転などの機能を提供する。2つのAPIは、合わせて使うことも、別々に使うこともできる。
>　OpenWF仕様はロイヤリティフリーで公開されており、Khronos GroupのWebサイトで入手できる。

引用: [Khronos Group、モバイル向けウィンドウシステム「OpenWF 1.0」を公開 | OSDN Magazine](https://mag.osdn.jp/09/11/10/0854210)

# API
## リファレンスカード
[OpenWF 1.0 Composition Reference Card](http://www.slideshare.net/Khronos_Group/openwf-10-composition-reference-card)
[OpenWF 1.0 Display Reference Card](http://www.slideshare.net/Khronos_Group/openwf-10-reference-card)

# 関連情報
## Wayland
Waylandでは一度採用された後に、OpenWF Back-End が削除されたらしい。
[Wayland Losing OpenWF Display Back-End - Phoronix](http://www.phoronix.com/scan.php?page=news_item&px=MTE1MjE)

## Screen
QNXではScreenのベースにOpenWFが使用されているとのこと
[車載ソフトウェア：QNXが組み込みソフト基盤を刷新、ディスプレイオーディオに最適な開発キットも - MONOist（モノイスト）](http://monoist.atmarkit.co.jp/mn/articles/1403/10/news105.html)

ドキュメント
[Help - QNX SDP 6.6 Documentation](http://www.qnx.com/developers/docs/660/index.jsp?topic=%2Fcom.qnx.doc.screen.wfdcfg%2Ftopic%2Fmanual%2Fcwfdcfg_about.html)

# 参考
[OpenWF - The Standard for building composited windowing systems](https://www.khronos.org/openwf/)
[Khronos Group、モバイル向けウィンドウシステム「OpenWF 1.0」を公開 | OSDN Magazine](https://mag.osdn.jp/09/11/10/0854210)
[OpenWF - Wikipedia](https://en.wikipedia.org/wiki/OpenWF)
Netlify で hugo を使う場合はバージョンに注意

【追記ここから】

Netlify の設定画面から環境変数を足すだけで、Hugo のバージョンを変更できるとのこと。詳細はこちら

- [Netlifyで使うHugoのバージョンを設定する - Qiita](http://qiita.com/httpd443/items/36291b286c72fccea47c)
- [Netlify 上で使う Hugo のバージョンを指定する | monaural](https://monaural.net/post/201707/set-hugo-version-on-netlify/)
- [Netlify Plus Hugo 0.20 and Beyond | Netlify](https://www.netlify.com/blog/2017/04/11/netlify-plus-hugo-0.20-and-beyond/)

【追記ここまで】

---

どうも Netlify の hugo は、バージョンが現在最新の v0.18 ではないっぽい(2017年2月時点)。

こんな感じで Netlify の設定のビルドコマンド指定部分に `hugo version` を足しておくと、

![hugo-netlify-001.png](https://qiita-image-store.s3.amazonaws.com/0/45034/dbd893bd-88a2-a7cd-9962-4a1d53d27765.png "hugo-netlify-001.png")

デプロイ時のログでバージョン情報を確認できます。

![hugo-netlify-002.png](https://qiita-image-store.s3.amazonaws.com/0/45034/d5f48cdc-a78f-ab6b-1ddc-33acd85e2f5b.png "hugo-netlify-002.png")

v0.17 と表示されていました。

hugo のサイトにあるテンプレート集には v0.18 以降でないと動かないものもあるので、それを使っていると「ローカルでは見えるのに！ デプロイすると表示されない！」となってハマるというわけです。ハマりました。

> Hugo Themes Site  
> http://themes.gohugo.io/

ということで、いらんトラブルを避けるため、私はいったんローカルの hugo も v0.17 に落としておきます。

---

以上、自分のブログに書いたものの転載です。

[netlify と hugo の組合せでハマったところ | monaural](https://monaural.net/post/201702/netlify-and-hugo-version/)
サーバー開発を一切せずに自動ログイン機能を実現してみた

# はじめに
サーバーエンジニアレスを実現するためにここでは、[ニフクラ mobile backend  (以下mBaaS)](http://mb.cloud.nifty.com/about.htm)を使用しています。本来は[「ユーザー名/パスワード」をユーザーに入力させ、ログインを行う機能](http://mb.cloud.nifty.com/doc/current/user/basic_usage_ios.html)として提供されていますが、これを応用することで、せっかくなので__今流行の「自動ログイン」を実現できないかな？__と考えてみたのが始まりです。作ってみたら思ったより簡単に作ることが出来ましたので、ご紹介します。

# 自動ログインの実現方法

## 端末のUDIDを取得
* もともとmBaaSが備えている会員の認証機能としては「ユーザー名/パスワード」をユーザーに決めさせ（新規登録）、入力させる（ログイン）を行うものです。なので、この「ユーザー名/パスワード」として、端末固有のUDID（ユニークデバイスID）を取得し裏側で処理を行う方法を考えました。

* ちなみに、Swiftだと次のコードでUDIDを取得できます。UDIDはユニーク値なので、UUIDと表記しています。

```Swift:Swift
// UUID取得
let uuid = UIDevice.current.identifierForVendor?.uuidString
```

## ユーザーにログインしたことを意識させずにログインさせる

* アプリを起動して画面が表示されるときに次のような処理を行います。（初回表示画面のviewDidLoad()内）


```swift:viewDidLoad()
NCMBUser.logInWithUsername(inBackground: uuid, password: uuid) { (user, login_error) in //★1
        if login_error != nil {
            // ログイン失敗時の処理

            // 初回利用（ユーザー未登録）の場合
            if login_err.code == 401002 { // 401002：ID/Pass認証エラー ★2
                /* ★3 */
            }

        } else {
            // ログイン成功時の処理
            
        }
    }
}
```

* 先ほど取得したUDID（uuid）を使って「ユーザー名/パスワード」としてログイン処理を行っています(★1)
* ただ初回利用時はエラーになります。ユーザーとしてがまだ登録されていないためです。その場合のエラーは「E401002：ID/Pass認証エラー」となります。このエラーが出たときは、ユーザー登録処理を行います。(★2)ここでもUDID（uuid）を使用すればOKですね。
* ★3に入るユーザー登録処理は以下のように書けます。

```swift:★3
/* mBaaSユーザー登録 */
let new_user = NCMBUser()
new_user.userName = uuid
new_user.password = uuid
new_user.signUpInBackground({ (signUp_error) in
    if signUp_error != nil {
        // ユーザー登録失敗時の処理

    } else {
        // ユーザー登録成功時の処理

    }
})
```

これで実装完了ですね！

# おわりに
## ポイントは「401002：ID/Pass認証エラー」で場合分けけすること
ポイントは「ユーザーにログインしたことを意識させずにログインさせる」ことです。なので、新規登録なのか、ログインなのか、判断を裏側で行うように書くことでした。ただ、「401002：ID/Pass認証エラー」で場合分けして後はログインなのか新規登録なのかドキュメント通りにコードを書くだけ！サーバーの知識なんて一切必要ありませんでした。簡単でしたね。ぜひアプリに実装してみてはいかがでしょうか。


## 実装済みのサンプルアプリあります
上記で説明した内容を実装した簡単なサンプルを用意していますので、よろしければご利用ください

|GitHub|動作環境|
|:-----------------|:------------------|
|[__SwiftAutoLoginApp__](https://github.com/natsumo/SwiftAutoLoginApp)|Xcode ver. 8.2.1<br>iOS SDK Ver. 2.3.4|

※動作環境は、こちらで動作確認したもですので、上記以外の環境でも動作します。
※使用方法はREADMEをご確認ください
わーい、すごーい

こんにちは。ぱいそんが好きなフレンズのみなさん。

Python 3 エンジニア認定基礎試験の勉強をしてて覚えた辞書のアンパックでやってみました。

```friends.py
friendsSyntax = {'wai':'わーい！！','animal':'ニシキヘビ','sugoi':'すごーい！！','skill':'ぱいそん'}

print('{wai}君は{animal}のフレンズなんだね！！'.format(**friendsSyntax))
print('{sugoi}{skill}ができるフレンズなんだー！！'.format(**friendsSyntax))
```

```
わーい！！君はニシキヘビのフレンズなんだね！！
すごーい！！ぱいそんができるフレンズなんだー！！
```

元ネタを投稿しているフレンズ
Bash: http://qiita.com/fk_2000/items/afd5f4ca8f5bb25011c7
PHP: http://qiita.com/t_ishida/items/bae7e62950d81f427f13
Scala: http://qiita.com/YukiAsu/items/d75b5e16f641c9d4bbf2
Golang: http://qiita.com/sakajunquality/items/5c4a2dc6967e584193ad
Swift3 表示画像を最適化してUITableViewのスクロールをさくさくさせる

# モチベーション

UITableViewを使ってニュースアプリのテーブルを作っていました。以下はニュースアプリのGunosyの一部ですが、こんな感じのやつです。

![gunosy.jpg](https://qiita-image-store.s3.amazonaws.com/0/40796/fc5eb90b-8fe6-4576-6cbd-bffda95acd72.jpeg)

作ってみて実機で動かす段階で、記事をスクロールするとカクカク動いてスクロールが気持ち悪くなってしまいました。
なので、それを解消したいと思いました。

結論としてはライブラリを入れてちょこっと書き換えれば出来ました。

# 原因

[【swift】uitableviewが重いときに対処すべき2つのこと](http://kimagureneet.hatenablog.com/entry/2015/09/02/021925)

というのを見て、

1. セルの高さ
2. セルの画像

をキャッシュする必要があることが分かりました。

セルの高さは指定していたので、原因がセルの画像にあるのだろうと推測出来ました。

# 画像の最適化

画像のキャッシュ系で使えるライブラリは以下のどれかなのかなーっというのが軽く検索した印象でした。

1. AlmofireImage
2. SDWebImage
3. KingFisher


以下の記事が参考になりました。
[B2B2Cなヘルスケアサービスの作り方](http://www.slideshare.net/tmitsu/b2b2c-57714438)

> Q. なんでSDWebImageを使ってないのか？ 
>
> A. 
> Pure Swiftで書かれたライブラリで統一したかったから 
> 画像fetchするベンチマーク結果はほぼ変わらなかった
> Kingﬁsherも候補だったがAlamoﬁreを導入済だったのでこちらに

定番なのはどうやらSDWebImageみたいなのですがswiftでは書かれていないのがネックで、AlmofireImageだとswiftで書かれてるみたいです。Alamofireを既に使っていたのでKingfisherを使うくらいならAlmofireなのかなと思ってKingfisherは選択肢から外しました。
そして、Pure Swiftにこだわってないので定番のSDWebImageでいいかなと思って結局SDWebImageを選択しました。

# 実装

## pod install

まず、SDWebImageをインストールします。
以下のようにコードを`Podfile`に入れて`pod install`

```
pod 'SDWebImage'
```

## ブリッジヘッダファイル

そして、`SDWebImage`はObjective-Cのコードなのでブリッジヘッダファイル(Swiftで使えるようにしてくれるやつ）に以下を挿入します。

```
#import "SDWebImage/UIImageView+WebCache.h"
```

ブリッジヘッダファイルがない場合（デフォルトではない）は作らないといけません。
僕は[iOS初心者がSwiftでグノシーみたいなタブ型RSSリーダーを作ってみた](http://x1.inkenkun.com/archives/909)を参考にブリッジヘッダファイルを作成しました。

## コード

以下のように画像を呼び出している箇所を変更するだけ(`sd_setImage`を使うだけ）で終わりです。

```swift
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath) as! CustomTopViewCell
      cell.title.text = self.entries[indexPath.row]["title"].string
      cell.site.text = self.entries[indexPath.row]["supported_site"]["name"].string

      // 以下3行部分
      let url = NSURL(string: self.entries[indexPath.row]["main_image_url"].string!)
      let imageData :Data = try! Data(contentsOf: url! as URL)
      cell.thumbnail.image = UIImage(data:imageData as Data)!

      return cell
    }
```

```swift
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
      let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath) as! CustomTopViewCell
      cell.title.text = self.entries[indexPath.row]["title"].string
      cell.site.text = self.entries[indexPath.row]["supported_site"]["name"].string

      // 以下2行に変更
      let url = NSURL(string: self.entries[indexPath.row]["main_image_url"].string!)
      cell.thumbnail.sd_setImage(with: url as URL?)
  
      return cell
    }
```


以上で、さくさくの動きになりました！
Dictionaryの代わりにEnumを使って文字の装飾などの設定を楽に書く方法

```swift

var str = "Hello, playground"

// a)
NSAttributedString(string: str, attributes: [
    NSForegroundColorAttributeName: UIColor.red,
    NSFontAttributeName: UIFont.systemFont(ofSize: 13.0)
    ])

// b)
NSAttributedString(string: str, attributes: Style([
    .color(.red),
    .font(.systemFont(ofSize: 23.0)),
    // ...
    ]).style)
```

b方は、設定する時DictionaryよりXcodeの補完は利用できるようになります。
ただし、bにする前提として、↓は必要。（フレームワークにした方が良いかも）

```swift
struct Style {
    var color: UIColor = .black
    var font: UIFont = .systemFont(ofSize: 14.0)
    // ... 
}

enum StyleItem {
    case color(UIColor)
    case font(UIFont)
    // ...
}
extension Style {
    init(_ enums: [StyleItem]) {
        for item in enums {
            switch item {
            case .color(let e): self.color = e
            case .font(let e): self.font = e
            // ...
            }
        }
    }
    
    var style: [String: Any] {
        return [
            NSForegroundColorAttributeName: color,
            NSFontAttributeName: font,
            // ...
        ]
    }
}
```
Webロールでもlog4net使いたい

#はじめに

[Webロールで出力したトレースログをWADLogsTableに転送する - Qiita](http://qiita.com/m-otoguro/items/04d88dcc0ded9c77ed8e)

でトレースログが転送されるようになりましたが、出来ればlog4netで例外の情報なども含めて出力できた方が便利です。

log4netでトレースログを出力するには独自でアペンダを実装する必要がありますが、この記事ではそこはパスして、Webロールでlog4netを使う場合の問題について触れます。

前述の記事でも書きましたが、WebロールからはWeb.configが読めません。デフォルトではlog4netの設定も構成ファイルに書いているので、このままだとlog4netの初期化が行えません。

# log4netの構成ファイルを独立させる

Web.configにlog4設定を書く場合、諸々省略するとこんな感じな書き方になると思います。
（TraceLogAppenderが独自実装したアペンダです。）

```xml:Web.config
<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type=" log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
  </configSections>
  <log4net>
    <appender name="TraceLogAppender" type="Azure.Core.Log.TraceLogAppender, Azure.Core">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %5p - %m (%C:%M:%L)" />
      </layout>
    </appender>
    <root>
      <level value="INFO" />
      <appender-ref ref="TraceLogAppender" />
    </root>
  </log4net>
</configuration>
```

まずは、log4netの設定をlog4net.configとしてWeb.configから独立させます。

```xml:log4net.config
<?xml version="1.0"?>
<configuration>
  <log4net>
    <appender name="TraceLogAppender" type="Azure.Core.Log.TraceLogAppender, Azure.Core">
      <layout type="log4net.Layout.PatternLayout,log4net">
        <param name="ConversionPattern" value="%d [%t] %5p - %m (%C:%M:%L)" />
      </layout>
    </appender>
    <root>
      <level value="INFO" />
      <appender-ref ref="TraceLogAppender" />
    </root>
  </log4net>
</configuration>
```

次に、log4net.configをファイルのプロパティから「出力ディレクトリにコピー」の項目を「新しい場合はコピーする」または「常にコピーする」にしておきます。
これでWebロールのベースディレクトリにlog4net.configが存在する状態になります。

そして、あとはlog4の初期化のときにこんな感じで、構成ファイルを明示的に指定することで、log4netの設定を読み込ませることができます。

```csharp:log4net.configの読み込み
log4net.Config.XmlConfigurator.Configure(new FileInfo(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config")));
```

この方式にすればIIS側でもWebロール側でもlog4net.configを共通の設定として使うことができます。
Ansible で、接続情報をすべてコマンドラインで与える


playbook の記述とは、対象のホスト(群)に対する操作方法を記述するもので、「対象のホスト群が何か」情報はあとから提供される想定。inventory という仕組みで統一的に記述できるようにはなっているけれども、ちょっとした ansible 実行でいちいちこれを指定するのは手間。コマンドラインでもろもろの情報を与えて playbook を実行したい、イメージは ssh でコマンドを発行する感じで。

説明は省いて、これを行う方法だけを書くと次。

```shell-session

ansible-playbook -v -u ubuntu --private-key ~/.ssh/thekey.pem -i '192.168.33.33,' the-playbook.yml
```
Raw Text "" must be wrapped in an explicit Text component


![スクリーンショット 2017-02-10 13.39.29.png](https://qiita-image-store.s3.amazonaws.com/0/49022/42738f15-381a-1320-2ec9-5ee4473a4413.png "スクリーンショット 2017-02-10 13.39.29.png")

React Native開発中に出くわしたエラー。
JSXでStringをそのまま`{}`と`&&`で判定して、真であればコンポーネントを表示しようとしている箇所で起きている。

```jsx
{this.state.showText &&
  <Text>{this.state.showText}</Text>
}
```

this.state.showTextが`""`(空文字列)の場合、そのまま評価されてしまって上記のエラーとなっている。

## 対処
`!!`で文字列の真偽を判定する。

```jsx
{!!this.state.showText &&
  <Text>{this.state.showText}</Text>
}
```
MacでVirtualBoxを使ったIEの表示確認環境を構築する

MacでIEの表示を確認をすることになったのでメモ
※2018/04/20時点では問題なし

#　前提
Homebrewとhomebrew-cask、それとVirtualBoxを使うので入れておくこと。
簡単なインストール手順は以下の通り。

## Homebrewのインストール
　`/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
でインストールできます。[Homebrew公式サイト](http://brew.sh/index_ja.html)より

## homebrew-caskのインストール
 `brew install caskroom/cask/brew-cask`
でインストール。[みんなhomebrew-caskって知ってるか？](http://www.task-notes.com/entry/20150129/1422459342)

# Virtual Boxのインストールとセットアップ
Homebrewを使って
`brew cask install virtualbox`
実行するとインストール完了。

## VB用のイメージをダウンロード
[modern.IE](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/)　 からイメージをダウンロードしておく。

Virtual machineから好きなイメージを選び、`Select　Platform` はもちろん` VirtualBox` を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/14160/dc78701d-4b2f-2537-418c-5857e409c368.png)

ダウンロードが完了したらterminalで

```
$ tar zxf <さっき落としたファイル名>
```

で展開する。普通にFinderからアーカイブユーティリティを使うと展開されすぎるみたい。

## イメージをVBにインポート
先ほどダウンロードして展開した `.ova` ファイルをVBで開く
![image](https://qiita-image-store.s3.amazonaws.com/0/14160/a18dfc4c-1415-af15-57ae-df77423d8600.png)

初期設定だとRAMが512MBになっている。
![image](https://qiita-image-store.s3.amazonaws.com/0/14160/7e6c577a-0b71-fb35-b656-5fea557d2361.png)

公式の[Modern.IE VM Notes(PDF)](https://az792536.vo.msecnd.net/vms/release_notes_license_terms_8_1_15.pdf)を確認すると
> - Windows XP images: 256 – 512MB
> - Windows Vista images: 512 – 1024MB
> - Windows 7 images: 1024 – 2048MB
> - Windows 8 images: 1024 – 2048MB
> - Windows 10 images: 1024 – 2048MB

が推奨メモリとのこと。
なので、7以降のOSを選択している場合には1024MB以上に設定しておく。
他は初期値でおk

![image](https://qiita-image-store.s3.amazonaws.com/0/14160/e7c81d99-ddc8-207d-d5d6-8d23c326e5ca.png)

インポートが終わったら仮想マシンが登録されているはずだ。
![image](https://qiita-image-store.s3.amazonaws.com/0/14160/819d6e78-88b1-c032-f784-3cc6f7999d6d.png)

起動できた。
![image](https://qiita-image-store.s3.amazonaws.com/0/14160/a682f766-fc55-a149-85c2-1ab2faec8bbf.png)

# その他
ユーザ名 : IEUser
パスワード : Passw0rd!
Gitでの名前を使いわけたい人向けメモ

会社でのアカウントと個人でのアカウントなど、GitHubやBitbucketにおいて複数アカウントを持っているケースはあると思います。いや、あるんです（言い切る）。

でも誤って個人の名前で会社のリポジトリにプッシュとかしたときには…。
そんな方向けのメモ。何番煎じだよって感じだが。


# マシン共通の設定 (global)
これは ~/.gitconfig に保存されるので、デフォルトになるって感じ。

```
git config --global user.name "KirimaSharo"
git config --global user.email "sharokirima@pfcolle.com"
```

# 各ディレクトリでの設定
これは Directory/.git/config に保存されるので、それぞれのディレクトリごとでなんとかなります。

（既にそのディレクトリにいる前提で）

```
git config user.name "Sharo_Police"
git config user.email "sharo_police@pfcolle.com"
```

これでミスも減るね！（自戒）
ESP32のプログラム書込みを安定させる 

## 背景

<a href="http://www.smartarduino.com/view.php?id=95103">doit のESP32モジュール</a>で arduino-esp32を試しているのですが、プログラムの書き込みが失敗することが多くストレスが溜まっていました。数回試してやっとプログラムを書き込める感じです。プログラム書込みモードへの遷移に失敗します。遷移せず、普通のリセットになってしまいます。

最初は、電源等の環境を疑っていたのですが、回路に問題があるように思えてきました。

## プログラム書込みモードへの遷移

ESP32はリセット時 GPIO0,GPIO2の状態を見て動作モードを決定します。
下の図で、SPI Flash Boot とあるのが書込み済プログラムを実行するモードでDownload Bootというのがプログラム書込みモードです。

| Pin  | SPI Flash Boot  | Download Boot  |
|:-:|:-:|:-:|
|  GPIO0 |  1 | 0  |
|  GPIO2 |  X | 0  |

ESP32内部でGPIO0はプルアップ、GPIO02はプルダウンされていますので、GPIO0をLowにした状態でResetを解除、ENをHighに戻せばプログラム書込みモードに入ることができます。

## GPIO0, EN制御回路

下の回路図は ESP32 Hardware Design Guidelinesに記載されているESP32-DevKitCの回路図の一部です。DTR/RTSはUSB-UARTインターフェースIC,CP2102に接続されています。RTSをLowにすることでEN(Reset)がLowになり、DTRをLowにすることでIO0(GPIO0)がLowになります。但しRTS,DTR両方をLowにするとEN,IO0ともにHiになります。多くのESP32/ESP8266のモジュールで、この回路が使用されていると思われます。

![sc170210a1.png](https://qiita-image-store.s3.amazonaws.com/0/144308/e575f613-c7bc-5323-bd31-928ad0a2e0ac.png)

## 問題点

問題は USB経由だとUARTの制御線(RTSやDTR)をあまり高速に変化させることができないということです。制御線を変化させるには、USBにパケットを送出する必要があるので、高速にはできないのです。RTSがENに、DTRがIO0に直結されていれば、時間がかかってもDTRをLowにしたあとRTSをHiにすればいいのですが、上の回路を介しているためDTR=RTS=Lowの期間はEN=IO0=Hiになってしまいます。

プログラム書き込み時のEN, IO0信号をオシロで観測したところ、下のような波形になっていました。

![fig170210a1.png](https://qiita-image-store.s3.amazonaws.com/0/144308/887dcdcb-5eb2-8c83-b7f0-5e75f34fcc9c.png)

こんな波形だと、プログラム書込みモードに入れることの方が不思議ですが、ENの立ち上がりでIO0の状態を見ているわけではなく、ENの立ち上がり、つまりリセットの解除で動き始めたプログラムが、あるタイミングでIO0の状態を取り込んでいるのではないかと想像しています。ESP8266で問題が起きなかった回路がESP32になり、処理が高速になり問題が発生したのかもしれません。

# 対策

EN-GND間に0.1uFのコンデンサを追加しました。これでプログラムの書き込みに失敗することは無くなりました。

![170210a1.jpg](https://qiita-image-store.s3.amazonaws.com/0/144308/ca13d7bb-e654-e834-d027-1fa18ed3d25f.jpeg)
わーい、すごーい

クソだとはわかってる。でも速度が大事だから。ファーストペンギン。

```scala
case class Friends(message: String = "") {

  def wai() = {
    new Friends(this + "わーい")
  }
  def sugoi() = {
    new Friends(this + "すごーい")
  }
  def tanoshii() = {
    new Friends(this + "たのしー")
  }
  def friends(skill: String) = {
    new Friends(this + s"君は${skill}がとくいな、フレンズなんだね！！")
  }

  override def toString: String = message + "\n"
}

println(Friends() wai() sugoi() tanoshii() friends("scala"))
```

# 元ネタ
http://qiita.com/t_ishida/items/bae7e62950d81f427f13

# 兄弟たち
Golang: http://qiita.com/sakajunquality/items/5c4a2dc6967e584193ad
Ruby: http://qiita.com/844196/items/debc0cd1d39a6c3e32c7
Python: http://qiita.com/Nao-Y/items/f544a96cbd09b135c7e7
Java: http://qiita.com/hanakayui0628/items/97242465693bda8cacd2
ジャパリパーク: http://qiita.com/enzirion/items/cd97ee3667756b18f006
Swift: http://qiita.com/fromkk/items/0797bdf3923622073a4f
C++: http://qiita.com/ur_kinsk/items/533d3780eb4f87fa6770
Lua: http://qiita.com/ken_ton/items/f8aeed7779476ece6198
C#: http://qiita.com/Temarin/items/7bcdb9f42b0d209a53cc
Pony: http://qiita.com/kubo39/items/318090ea206288fc1f08
Google VR SDKを使って、Daydreamコントローラーで操作可能なボタンを作成する

## 準備

UnityでDaydream用アプリをビルドするために必要な設定です。すでに設定済みなら読み飛ばしてください。

1. File→Build SettingsからAndroidを選択
2. Switch Platform
3. Player Settingsを選択
4. Other SettingsのVirtual Reality Supportedにチェックを入れる
5. すぐ下の+アイコンを選択してDaydreamを追加
6. Package Nameは適当に設定しておく
7. Minimum API LevelをAndroid 7.0 'Nougat' (API level 24)にする (していなくても実行には問題はないが、Daydream未対応端末にうっかりインストールされることを防げる。ストアにアップロードする際には必須の設定)


## ボタンを作成する

Create→UI→Buttonを選択して、シーンにButtonを追加する。
すると以下のオブジェクトが一緒に作成されます。

* Canvasオブジェクト。Buttonはこの下に内包されます。
* EventSystemオブジェクト。ボタンのクリックイベントを受け取るために作成されます。

Canvasを選択して、Render ModeをWorld Spaceにします。これで3D空間上にボタンが表示されます。
追加しただけの状態では表示領域がとても大きすぎるので、Canvasのサイズを変更したりButtonのサイズを変更したりしてちょうどよい大きさにします。

この状態でエディタ内でゲームを実行すると、マウスでボタンをクリックすることができます。クリックしても何も起きませんが。


## Daydreamコントローラーでボタンを押せるようにする

ボタンはマウスのクリックで押すことができますが、Daydreamコントローラーでは押せません。というかまだコントローラーの入力を受け取ってすらいません。

まずはコントローラーとその指す先を示すレーザーポインター的なモノを表示するために以下のPrefabを追加します。

* GvrControllerPointer
* GvrControllerMain

いずれも追加した後に位置を`0,0,0`にしておきます。

この状態でDaydream対応スマートフォンでゲームを実行すると、コントローラーが表示されます。しかしボタンをポイントしても何も起きません。

DaydreamコントローラーをUIの入力として使用するために、以下のコンポーネントをオブジェクトに追加していきます。

* Canvasオブジェクトに`GvrPointerGraphicRaycaster`コンポーネントを追加する。
* EventSystemオブジェクトに`GvrPointerInputModule`コンポーネントを追加する。
* EventSystemオブジェクトに`GvrPointerManager`コンポーネントを追加する。

これでもう一度Daydream対応スマートフォンでゲームを実行すると、今度はコントローラーでボタンをクリックすることができるようになります。
docker コンテナの s3cmd をホスト側からいい感じに使う

[sekka1/docker\-s3cmd: s3cmd in a Docker container](https://github.com/sekka1/docker-s3cmd) はいちいちコンテナにログインして、`/opt/main.sh` を叩かなければならないのがだるかったので、ホスト側からあまりコンテナを意識せずに使えるようなやり方を考えてみた。

なお、下記ではアクセス先が[ニフティクラウド オブジェクトストレージ](http://cloud.nifty.com/service/obj_storage.htm)になっていますが、少しいじれば他の S3 互換 API でも利用可能だと思います。

## 準備

まず Dockerfile 作成。
[jwilder/dockerize](https://github.com/jwilder/dockerize) を使って、s3cmd が読み込む設定ファイル `~/.s3cfg` を生成しています。

```
$ vi Dockerfile
```

```
FROM ubuntu
RUN apt-get update && apt-get install -y wget s3cmd

ENV DOCKERIZE_VERSION v0.3.0
RUN wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
    && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz

ADD dot.s3cfg.tmpl /root/.s3cfg.tmpl
ENTRYPOINT ["dockerize", "-template", "/root/.s3cfg.tmpl:/root/.s3cfg", "s3cmd"]

WORKDIR /work
```

設定ファイルのテンプレ作成。

```
$ vi dot.s3cfg.tmpl
```

```
[default]
access_key = {{ .Env.ACCESS_KEY }}
secret_key = {{ .Env.SECRET_KEY }}
host_base = jp-east-2.os.cloud.nifty.com
host_bucket = %(bucket)s.jp-east-2.os.cloud.nifty.com
```

docker イメージをビルドしておく。

```
$ docker build -t s3cmd .
(略)
Successfully built d128c83ccaeb
```

あとは、s3cmd にエイリアスを設定しておく。
(定常的に使う場合には `~/.bashrc` 等に書いておくといいかも。)

```
$ alias s3cmd="docker run \
  -ti --rm -v $(pwd):/work \
  -e ACCESS_KEY=${YOUR_ACCESS_KEY} \
  -e SECRET_KEY=${YOUR_SECRET_KEY} \
  s3cmd"
```

## 動作確認

ここまでやると、ホストに s3cmd をインストールしてなくてもコンテナ経由で s3cmd が使えるようになっている。

バケットの作成。

```
$ s3cmd mb s3://tily
Bucket 's3://tily/' created
2017/02/10 04:09:15 Command finished successfully.
```

バケットの一覧。

```
$ s3cmd ls
2017-02-10 03:52  s3://tily
2017/02/10 04:09:33 Command finished successfully.
```

s3cmd コンテナは `-v $(pwd):/work` で起動するので、カレントディレクトリだったらファイルのアップロード・ダウンロードもできる。

ファイルのアップロード。(微妙に変なエラーが出たけどなんだろう。)

```
$ echo hello world > test.txt
$ s3cmd put test.txt s3://tily/test.txt
WARNING: test.txt: Owner username not known. Storing UID=500 instead.
WARNING: test.txt: Owner groupname not known. Storing GID=500 instead.
upload: 'test.txt' -> 's3://tily/test.txt'  [1 of 1]
 12 of 12   100% in    0s   354.82 B/s  done
upload: 'test.txt' -> 's3://tily/test.txt'  [1 of 1]
 12 of 12   100% in    0s   228.68 B/s  done
2017/02/10 04:11:38 Command finished successfully.
```

ファイルのダウンロード。

```
$ s3cmd get s3://tily/test.txt test2.txt
download: 's3://tily/test.txt' -> 'test2.txt'  [1 of 1]
download: 's3://tily/test.txt' -> 'test2.txt'  [1 of 1]
 12 of 12   100% in    0s   528.98 B/s  done
2017/02/10 04:12:35 Command finished successfully.
$ cat test2.txt 
hello world
```

## まとめ

あまりコンテナを意識せずにホスト側から s3cmd が使えるようになって便利になった。あとあまり関係ないけど、dockerize はテンプレ機能だけでなく、[別のコンテナの TCP ポートが LISTEN するまで待ってくれる機能](https://github.com/jwilder/dockerize#waiting-for-other-dependencies) もあるようなので、こちらも今度試してみたい。
Trelloで進捗ステータスを見える化

# Trelloで進捗ステータスを見える化する

## 1.ラベルを準備

緑5つ 黒5つを用意します。 

![スクリーンショット 2017-02-10 13.47.10.png](https://qiita-image-store.s3.amazonaws.com/0/101531/aba68d38-df27-fe1f-f7da-15a255c67863.png)

## 2.ラベルをセットします。

緑一つにつき２０%進捗です。

![スクリーンショット 2017-02-10 13.53.07.png](https://qiita-image-store.s3.amazonaws.com/0/101531/7a34e808-cc3c-aa60-a34a-ff3ce219751c.png)

## 3.進捗が見えました。
![スクリーンショット 2017-02-10 13.46.47.png](https://qiita-image-store.s3.amazonaws.com/0/101531/2d69eb7e-cfb3-7b09-4686-30e0409dafcc.png)

## 応用.10%単位でやりたい。

黄色ラベルを一つ追加します。

![スクリーンショット 2017-02-10 13.54.33.png](https://qiita-image-store.s3.amazonaws.com/0/101531/fc106d9b-7cff-102b-e874-481fa0c42dbd.png)

進捗30%が表現できました。

![スクリーンショット 2017-02-10 13.54.44.png](https://qiita-image-store.s3.amazonaws.com/0/101531/5996a742-f2c7-eec3-9fb2-02a1110ae963.png)

## まとめ
入力は案外楽に出来る。
思いついただけなので、実際にやってみて面倒だったらやめる。

## 悔しかったところ
タスクの重要度を抵抗のカラーコードで表したら直感的かと考えたが、茶色のラベルがなかったので諦めた。
今のところJava10に入りそうな機能


***本記事の情報は最新でない可能性があります。***

Java10に入る可能性のある仕様をまとめました。
随時まとめていきます。

コメントや編集リクエストによる間違いの指摘があれば、
随時反映していくので、ご指摘のほどお願いします。

- [enumに型引数をつけられる](https://www.infoq.com/news/2017/01/java-enhanced-enums)
    - [JEP301](http://openjdk.java.net/jeps/301)
- [ラムダ式内での仮引数を_で宣言できる](https://www.infoq.com/jp/news/2017/01/java10-lambda-leftovers)
    - [JEP302](http://openjdk.java.net/jeps/302)
- [ローカル変数のvar宣言](https://www.infoq.com/news/2016/12/java-type-inference-mutability)
    - [JEP286](http://openjdk.java.net/jeps/286)
- [ジェネリック型の宣言時にデフォルトの変位を定義する](https://www.infoq.com/jp/news/2017/02/java-default-type-variance)
   -  [JEP300](http://openjdk.java.net/jeps/300)
Eloquentでデフォルト値を設定する

Eloquentでレコード `insert` 時にデフォルト値を設定してほしいことがあります。
IDを連番じゃなくて、自動生成した文字列（トークンIDなど）を設定したい場合とかありますよね。

登録日時、更新日時であれば `$timestamps = true` で自動実行してくれますが、その他のカラムについてはイベントを利用する必要があります。

```php
class Token extends Model
{
    public static function boot()
    {
        // 親を呼び出すのを忘れずに！
        parent::boot();

        // insert前に実行されるイベントハンドラを設定
        self::creating(function(Token $token){
            // IDにランダムな文字列を設定
            $token->id = base64_encode(random_bytes(48));
        });
    }
}
```

`boot()` というstaticメソッドはモデルのロード時に自動的に呼ばれるメソッドです。
これをオーバーライドして自分自身に対するイベントハンドラを設定します。

今回設定するべきは `creating` イベントハンドラで、これは `insert` の実行前に発火されるイベントです。
ここで値を設定することによってデフォルト値が設定できます。
CentOS7 で scp したら「警告: setlocale: LC_CTYPE: ロケールを変更できません…」

VirtualBox 上の CentOS7 (ゲストOS)に，ホストの Mac から scp を試みたら，以下のメッセージが出た（ファイルは存在する）

>/etc/profile.d/lang.sh: 行 19: 警告: setlocale: LC_CTYPE: ロケールを変更できません (UTF-8): そのようなファイルやディレクトリはありません

【環境】
- CentOS Linux release 7.2.1511 (Core) 

lang.sh には以下の記述．

```ruby:lang.sh
if [ "$sourced" = 1 ]; then
    [ -n "$LANG" ] && export LANG || unset LANG
    [ -n "$LC_ADDRESS" ] && export LC_ADDRESS || unset LC_ADDRESS
    [ -n "$LC_CTYPE" ] && export LC_CTYPE || unset LC_CTYPE　# 19行め
```

現在のロケールを確認する．

```
# localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp
      X11 Layout: jp
```

ここが LANG でなく LC_TYPE でないといけないようだ．
そのように設定する．

```
# localectl set-locale LC_CTYPE=ja_JP.utf8
```

確認．

```
# localectl status
   System Locale: LC_CTYPE=ja_JP.utf8
       VC Keymap: jp
      X11 Layout: jp
```

scp を試みたら無事成功した．
Python > tuple > tuple unpacking

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1466 / 12833)

> This is sometimes called tuple unpacking.

例

```py
>>> marx_tuple = ( 'Groucho', 'Chico', 'Harpo' )
>>> a, b, c = marx_tuple
>>> a
'Groucho'
>>> b
'Chico'
>>> c
'Harpo'
```

tupleのN番目の項目チェックなどに便利なのだろうか。

http://ideone.com/vuW96Q

```py
marx_tuple = ( 'Groucho', 'Chico', 'Harpo' )
print(marx_tuple)

_, item2nd, _ = marx_tuple
print(item2nd)

if 'co' in item2nd:
	print('co inside')
```

```txt:結果
Success	time: 0 memory: 23304 signal:0
('Groucho', 'Chico', 'Harpo')
Chico
co inside
```
C#:abstract interface

何为抽象类？
    在面向对象的概念中，所有的对象都可以用类来表示，但是并不是所有的类都有具体的对象可以对其实例化，所以这样的类就叫做抽象类。例如Animal类，说new Animal（）；实例一个动物，但是一个动物长什么样？不知道，动物就是一个抽象类，不能描述一个具体的对象与之对应。
C#允许把类和方法声明为abstract，即抽象类和抽象方法。抽象类应该拥有尽可能的共同的代码，拥有尽可能少的数据。

 ```csharp
abstract class Animal     //加abstract关键字，表明是抽象类
    {
        protected abstract string getShoutSound();
        //在方法的返回值前加abstract表明此方法是抽象方法，抽象方法没有方法体，直接在括号后加“；”
        
    }
 ```

C#中抽象的特点
1、抽象类不能被实例化
2、抽象方法是必须被子类重写的方法
3、如果类中包含抽象方法，那么类就必须定义为抽象类，不论是否还包含一般方法。
抽象类是提供一个抽象的概念，他提供一个继承的出发点，新的抽象类的建立，一定是用来继承的。在一个以继承关系形成的等级结构里面，树叶节点就是具体类，而树枝节均为抽象类。（这个相当在一棵树上，树叶继承树枝）
具体的内容请见下图：
             

何为接口？
    接口是把隐式公共方法和属性组合起来，以封装特定功能的一个集合。一旦类实现了接口，类就可以支持接口所特定的所有属性和成员。声明接口在语法上于与声明抽象类完全相同，但不允许提供接口中任何成员的执行方式。

 ```csharp
interface IChange
    {
        string ChangeThing(string thing);
        //声明一个Ichangething接口，此接口有一个方法Changthing，参数是一个字符串变量，返回一字符串。
    }
```

举个例子：抽象类——人；具体类——男人，女人；超人继承男人的所有方法和属性，但是超人有一个特殊技能：飞！如何实现？这个时候就用到的是接口。
              

抽象VS接口
    接口和抽象类的概念不一样。接口是对动作的抽象，抽象类是对根源的抽象。
    抽象类表示的是，这个对象是什么。接口表示的是，这个对象能做什么。比如，男人，女人，这两个类（如果是类的话……），他们的抽象类是人。说明，他们都是人。人可以吃东西，狗也可以吃东西，你可以把“吃东西”定义成一个接口，然后让这些类去实现它.所以，在高级语言上，一个类只能继承一个类（抽象类）(正如人不可能同时是生物和非生物)，但是可以实现多个接口(吃饭接口、走路接口)。
概念上的比较
第一：类是对对象的抽象，抽象类是对类的抽象；接口是对行为的抽象。
第二：如果行为跨越不同类的对象，可使用接口；对于一些相似的类对象，用继承抽象类。
第三：从设计角度讲，抽象类是从子类中发现了公共的东西，泛化出父类，然后子类继承父类，而接口根本不知道子类的存在，方法实现还不能确认，预先定义。
这些内容都是从书本上提出的具体概念，有些其他的内容，其实更重要的是有我们自己的认识。
理解两者不同之处
1、接口是抽象类的变体，接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
2、接口可以多继承，抽象类不行
3、接口定义方法，不能实现，而抽象类可以实现部分方法。
4、接口中基本数据类型为static 而抽类象不是的。

【总结】
    当我们关注一个事物的本质的时候，用抽象类；关注一个操作的时候，用接口。抽象类的功能要远超过接口，但是定义抽象类的代价高，每个类只能继承一个类，在这个抽象类中必须写出其所有子类的所有共性。虽然接口的功能上会弱化很多，但是它只是针对一个动作的描述，而且我们可以在一个类中同时实现多个接口。
Elasticsearchをメモリの足りない環境で動かしているとDisk Fullになる。

## 原因

Elasticsearchのデフォルト起動JVM引数には、<code>-XX:+HeapDumpOnOutOfMemoryError</code>がついています。

メモリが少ない環境で動かし続けていると、Elasticsearchのインストールディレクトリに数ギガクラスの<code>java_pidXXXX.hprof</code>が量産されてDisk Fullになります。

## 対処

メモリが少ないのでたまに無理が出る。とか仕方ないなぁという場合は、特にダンプを調査したりしないと思うので起動引数から抜くか、ある程度古いダンプを定期的に消すCronとか入れとくといいと思います。
Railsでi18nの値からキーを取得する方法

i18nに指定した値からモデルだったり属性物理名を取りたかったので書いてみた。

```
ja:
  activerecord:
    models:
      users: "ユーザ"
    attributes:
      users:
        id:    "ユーザID"
        email: "メールアドレス"
```

```
def translated
  @translate ||= begin
    translate = {}
    I18n.config.load_path.grep(/#{I18n.locale}\.yml$/).each do |file|
      yaml = YAML.load_file(file)[I18n.locale.to_s]
      next unless yaml.key?('activerecord')
      translate.update(yaml['activerecord'])
    end
    translate
  rescue => e
    raise e
  end
end

def get_model(model_name)
  translated['models'].invert[model_name].camelize.constantize
rescue => e
  raise "Cannot found model name '#{model_name}' at #{I18n.config.load_path.grep(/#{I18n.locale}\.yml$/)}."
end

def get_attribute_for(model, attribute_name)
  translated['attributes'][model.name.underscore].invert[attribute_name]
rescue => e
  raise "Cannot found attribute '#{attribute_name}' for '#{model.name}' at #{I18n.config.load_path.grep(/#{I18n.locale}\.yml$/)}."
end


p model = get_model('ユーザ')
#=> User(id: integer, email: string)

p get_attribute_for(model, 'メールアドレス')
#=> "email"
```

`ActiveRecord::Base.subclasses`から引くことも考えたが、タイミングによってはrequireされていないことがあるので半ば強引に定数化してみた。
Androidアプリ開発「外部ストレージアクセスのパーミッション」

API Level 23（6.0:Marshmallow）から、マニフェストに外部ストレージアクセスのパーミッションを記述した”だけ”では、有効にならなくなりました。

# マニフェストでの記述例

```xml:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

ちなみに、「WRITE_EXTERNAL_STORAGE」は、「READ_EXTERNAL_STORAGE」を内包しています。

Javaのコード中にて、以下のように、外部ストレージアクセスのパーミッションの”許可（リクエスト）”の記述もしないと、有効になりません。

# Activityでの記述例

```java:
public class MainActivity extends Activity {

    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            // We don't have permission so prompt the user
            ActivityCompat.requestPermissions(
                    this,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }

        // 以下略
    }
// 以下略
```

以上です。
Androidアプリ開発「SQLiteのJOIN句」

AndroidのSQLiteでサポートしているJOIN句（のあるSELECT文）についてです。
結論から言ってしまうと、
①SQLiteそのものが右外部結合と完全外部結合はサポートしておらず、
②標準APIのSQLiteDatabaseでは面倒くさいので、O/Rマッピングライブラリを使うといいですよ。
です。

## アジェンダ

<ol>
<li>そもそもSQLiteのJOINのサポートの可否</li>
<li>SQLiteDatabase#rawQueryメソッドでJOIN句のあるSELECT実行</li>
<li>非サポートのJOIN句のあるSELECT実行時の例外</li>
<li>SQLiteDatabase#rawQuery使いたくないなぁ</li>
</ol>

# まず前提として、そもそもJOINのサポートの可否

Android Developersサイトの「Using Databases」の項の冒頭に、「Android provides full support for SQLite databases.」と記載があります。

[Android Developers: Using Databases](http://developer.android.com/guide/topics/data/data-storage.html#db)

SQLiteでは、「LEFT OUTER JOIN is implemented, but not RIGHT OUTER JOIN or FULL OUTER JOIN.」と記載があります。

[SQLite:SQL Features That SQLite Does Not Implement](http://www.sqlite.org/omitted.html)

すなわち、各JOINの可否は以下のとおりです。

<dl>
<dt>サポート</dt>
<dd>INNER JOIN（内部結合）</dd>
<dd>LEFT OUTER JOIN（左外部結合）</dd>
<dd>CROSS JOIN（交差結合）</dd>
<dt>非サポート</dt>
<dd>RIGHT OUTER JOIN（右外部結合）</dd>
<dd>FULL OUTER JOIN（完全外部結合）</dd>

# JOIN句のあるSELECT文の実行

SQLiteDatabase#queryメソッドではJOIN句のあるSELECT文を実行することができません。
なので、rawQueryメソッドを用いることになります。

```java:
String sql = "SELECT * FROM foo INNER JOIN bar ON foo.a = bar.a";
Cursor cursor = database.rawQuery(sql, null);

if (cursor.moveToFirst()) {
  do {
    int foo_a = cursor.getInt(0);
    String foo_b = cursor.getString(1);
    int bar_a = cursor.getInt(2);
    String bar_b = cursor.getString(3);
    Log.v("内部結合", "" + foo_a + ":" + foo_b + ":" + bar_a + ":" + bar_b);
  } while (cursor.moveToNext());
}
```

結合するフィールド名が同じであれば、USING句を使用するのも可です。

# 非サポートのJOIN句のあるSELECT文の実行

非サポートのJOIN句のあるSELECT文を実行すると、以下のように例外SQLiteExceptionがスローされます。

```
E/AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {【パッケージ/実行クラス】: android.database.sqlite.SQLiteException:
 RIGHT and FULL OUTER JOINs are not currently supported: , while compiling: SELECT * FROM foo FULL OUTER JOIN bar ON foo.a = bar.a
```

# でも、SQLiteDatabase#rawQueryは使用を避けたい人もいる

SQLiteDatabase#rawQueryメソッドは、結局、SQL文を文字列で記述する羽目になるので、半角スペースやシングルコーテーションの書き忘れを頻繁にしてしまう人には、使用は回避できるものなら、回避したいですよね。

当「JOIN句について」の件だけでなく、SQLiteDatabase#queryメソッドを使用することですら、引数の多さに困惑している人もいると思います。

そこで、DBアクセスのライブラリを探してみますと、サードパーティ製のO/Rマッピング(Object Relational Mapping)ライブラリの一つである[OrmLite](http://ormlite.com/)の導入を検討してみてはいかがでしょうか？という提案になります。

OrmLiteには「@JoinColumn」というアノテーションがありますので。

# 最後に

では、OrmLiteの詳しい説明は…せずじまいでこの投稿は終わっちゃいますすすすみません。
要は、当記事は「**JOINには気を付けろ！**」という注意喚起をしたかったのでした。

以上です。
IAMロールをインスタンス起動後に追加できるようになりました！

AWSユーザ待望の新機能。インスタンス起動後にIAMロールを後から付けられるようになりました！
https://aws.amazon.com/jp/blogs/security/new-attach-an-aws-iam-role-to-an-existing-amazon-ec2-instance-by-using-the-aws-cli/

※aws-cliのバージョンは以下にあげる必要があります。

```
aws-cli/1.11.46 Python/2.7.10 Darwin/15.6.0 botocore/1.5.9
```
# やってみた

1.事前にコンソールなりCLIでIAMロールを作成しておきます。

2.以下を実行！

```
$aws ec2 associate-iam-instance-profile --instance-id インスタンスID --iam-instance-profile Name=インスタンスプロファイル名
```

3.以下で確認。

```
$aws ec2 describe-iam-instance-profile-associations
```

# 置き換えもできる
追加だけでなくIAMロールの置き換えもできてしまいます。
1.以下で``Association-id``を確認します。

```
$aws ec2 describe-iam-instance-profile-associations
```
2.得られた``Association-id``を元に以下を実行します。

```
$aws ec2 replace-iam-instance-profile-association --association-id 現在のAssociation-id --iam-instance-profile Name=置き換え先のインスタンスプロファイル名
```


ね、簡単でしょ？
AWSユーザにずっと待ち望まれていた機能なので嬉しい方も多いのではないでしょうか。
Laravelで認証済の人だけが閲覧可能なPDF出力


認証がいらないなら`public`におけばよいが、必要な場合は`storage/app/pdf/`なんかに置いたりして、認証チェックしてから出力したい。

## Controller

```php:app/Http/Controllers/PdfController.php
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;

class PdfController extends Controller
{
  protected static $pdfPath = 'pdf/';
  
  public function __construct()
  {
    $this->middleware('auth');
  }
  
  public function show($fileName)
  {
    $filePath = self::$pdfPath . $fileName;
    
    abort_if(!Storage::exists($filePath), 404);
    
    return response()->make(Storage::get($filePath), 200, [
      'Content-Type'        => 'application/pdf',
      'Content-Disposition' => 'inline; filename="' . $fileName . '"'
    ]);
  }
}
```

## Routing
```php:routes/web.php
Route::get('pdf/{fileName}', 'PdfController@show')->name('pdf.show');
```

## View
```php
<a href="{{ route('pdf.show', ['fileName' => 'hoge.pdf']) }}" target="_blank">PDF</a>

```
NavigationControllerで何回かpushしたあとのViewControllerで2つ以上ViewControllerをpopして戻る

2回戻る例。

```swift:ViewController.swift
guard let navigationController = navigationController else {
	return
}
let viewControllers: [UIViewController] = navigationController.viewControllers as [UIViewController]
navigationController.popToViewController(viewControllers[viewControllers.count - 3], animated: true)
```

...1回だけ戻る例も載せておきます。

```swift:ViewController.swift
guard let switchViewController = navigationController?.viewControllers[1] else {
	return
}
navigationController?.popToViewController(switchViewController, animated: true)
```

参考

Pop 2 view controllers in Nav Controller in Swift
http://stackoverflow.com/questions/26132658/pop-2-view-controllers-in-nav-controller-in-swift

Swift popToViewController
http://stackoverflow.com/questions/28190070/swift-poptoviewcontroller
MariaDB10.2 でサポートされる「window関数」について

MariaDB10.2で実装予定の「window関数」について、現時点でサポートされている関数をまとめました。

【現時点でサポートされている関数】

ROW_NUMBER, RANK, DENSE_RANK, PERCENT_RANK, CUME_DIST, NTILE
FIRST_VALUE, LAST_VALUE, NTH_VALUE, LEAD, LAG
および、全ての主要な集計関数（SUM とか MIN とか）

MariaDB 10.2の環境で以下のクエリを実行すれば、各関数が使用できることを確認できます。

========================

create table t1 (i int);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

select i, min(i) OVER ( partition by null order by i ) from t1;

select i, first_value(i) OVER ( partition by null order by i rows between current row and current row ) from t1;

select i, lag(i) OVER ( partition by null order by i ) from t1;

========================

※ なお、first_value()関数にはバグがあることが報告されています。
　 こちらは、10.2.4で修正されます。
　 https://jira.mariadb.org/browse/MDEV-11746

MariaDB 10.2 のwindow関数に関しては、以下のマニュアルおよび記事に記載があります。

https://mariadb.com/kb/en/mariadb/window-functions/
https://www.fromdual.com/mariadb-10-2-window-function-examples

なお、window関数および関連マニュアルについては、現在「開発中」のステータスのため、
今後内容が変更される可能性があります。
わーい、すごーい

なんか気付いたら書いていたので、ここに供養します。

```php
<?php
class Friends
{
    private $message = null;
    public function __construct()
    {
        $this->message = '';
    }

    public function wai()
    {
        $this->message .= "わーい\n";
        return $this;
    }

    public function sugoi()
    {
        $this->message .= "すごーい\n";
        return $this;
    }

    public function tanoshii()
    {
        $this->message .= "たのしー\n";
        return $this;
    }

    public function friends($skill)
    {
        $this->message .= '君は' . $skill . 'がとくいな、フレンズなんだね!!' . "\n";
        return $this;

    }

    public function __toString()
    {
        $message = $this->message;
        $this->message = '';
        return $message;
    }
}

echo (new Friends())
    ->wai()
    ->sugoi()
    ->tanoshii()
    ->friends('クソリプ');
```
ひとりWikiかってに補足情報

# ひとりWikiとは

- ローカルWiki
- 対応OS：WIndows
- フリーソフト

# 誰向け？

ひとりでWikiを更新したいひと。

# 補足情報

基本的な情報は[作者様のサイト](http://www2u.biglobe.ne.jp/~MAS/soft.html)を御覧ください。

## MenuBarはどこで編集できるの？

タイトル名「MenuBar」で新しいページを作ってください。

## それぞれのプラグインの説明が見たい

[ひとりWikiプラグイン集](http://www2u.biglobe.ne.jp/~MAS/soft.html#htwikiplugin)からファイルをダウンロードして、「plugin」フォルダにコピーしてください。そのあと、ソフトを実行して、[ヘルプ]>[プラグイン]を開いて、該当のプラグインをクリックすると解説欄にプラグインの振る舞いが説明されてます。選択しているWiki記法によってプラグインの記法が若干変わる点に注意してください。
VMware


# VMWare Tools

事前にapt-get しておく。

```
gcc, binutils, make
kernel sources
build-essential
linux-headers-$(uname -r)
```

VMWareToolsのバグがあり、shareフォルダのところでエラーになる。
パッチが公開されているので当てる。
https://github.com/rasa/vmware-tools-patches

参考：
http://qiita.com/maccotsan/items/fafdc01deac71c20bd60
C/C++プログラマがPythonにチャレンジしてみる（はじめの一歩編）

今までに何度かPythonを覚えようとチャレンジしてきたが、ことごとく失敗していました。
いよいよ本気で覚えないとまずい感じになってきたので、気合を入れてお勉強してみます。

で、その過程を公開すると、もしかしたら他の人の役にも立つのではないかと。

#教科書

『[パーフェクトPython](https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88Python-PERFECT-5-Python%E3%82%B5%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%BA/dp/477415539X)』を参考に進めていきます。
※私が使用したのは初版第4刷

#Pythonのインストール

「Appendix A」に従い、WindowsにPythonをインストールしていきます。
ダウンロードサイトは[こちら](https://www.python.org/downloads/release/python-360/)。
※現時点の最新は「Python 3.6.0」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/5b8dcd5f-f324-4544-cf49-ecb81ac67297.png)

参考書によると、他のライブラリが32bitでビルドされていることが多いので32bit版をインストールしたほうがよいよ、とのことなので、
```
Windows x86 executable installer
```
をダウンロードすることにしました。
「python-3.6.0.exe」がダウンロードできますので、これを実行してインストールしします。
「pathに追加します」のチェックボックスはONにしておいた方がいいです。
（デフォルトだと、すごく深くにインストールされてしまいますので）

#Tipsメモ

「2章」「3章」「4章」「5章」から、違和感たっぷりで、これは覚えておかないとダメだなというポイントを、なるべくわかりやすくメモ。
（知らなくてもよさそうなのは、混乱するだけなので、飛ばします）

##はじめのはじめ（環境的なこと）

- python.exe実行で専用Window（以下、Python窓）が開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/53c9bd8f-fe59-4821-56bb-0c10e904327c.png)
- Python窓を閉じるには「quit()」（または「Ctrl-Z」）
- DOS窓等から「python.exe ファイル名」でも実行可能
    - ファイルを実行したいときはこっち
- プロンプトは「>>>」
- 基本は1行単位に指定
- 関数だと連続入力モードになる
- 空行を入れちゃうと、連続入力モードが終わってしまう
- 日本語はUNICODE（UTF-8）で
- Python窓で、既に設定されている変数とか関数とか、知りたくなったら「locals()」

なお、お勉強はDOS窓（ファイル実行用）とPython窓（入力即実行用）の2ウィンドウ体制で進めていきました。

##違和感たっぷりなところ（C/C++プログラマ視点）

- 「()」とか「{}」とか、基本的にはない
    - 「()」は関数の引数指定で使うけど
    - 「{}」も使うみたいだけど、知らなくても大丈夫
- インデントでブロック指定
- インデントはスペースだと訳わからなくなるからタブがいい
    - でも推奨はスペースとのこと
- 行の最後に「;」とかつけない
- コメントは「#」から開始、複数行コメントは「'''」で囲む
- 型宣言なし
- 定数（define）はない

ちゃんと[PEP8](https://pep8-ja.readthedocs.io/ja/latest/#)を読んでおいた方がいいかも。

##型関連

- 数値型変数は「整数」「実数」「複素数」のみ
- 文字列型変数は文字列を突っ込めばそうなる
- 配列は「リスト」ってやつみたい（異なる型でも突っ込める）
    - 空状態での宣言は「x = []」
    - 挿入が「list.insert(pos,value)」で削除が「del list(pos)」なのが分かりにくい
        - 「list.pop(pos)」という手があるらしい
    - バイト配列もあるみたい
- map型（key-value型）は「辞書型」という名前で存在している
    - 実はこいつで「{}」を使う
- 「NULL」は「None」

##関数

- 関数の最初に「def」
- 関数名の後には「:」
    - これが「{」的な意味合いかな（閉じないけど）
- 戻り値は「return hoge」
    - 関数を返すことも可能

##覚えておいた方がいいこと

- モジュール（ライブラリみたいなもの）の読み込みは「import」
- 計算で使えそうなモジュールは「math」

##おまけ（文法的なもの）

- if文は「if True:」「elif True:」「else:」
- for文は「for item in x:」（イテレーションです）
    - xの要素が順番にitemに入る
    - x[n]でも取得可能
    - range()も覚えておこう
- while文は「while True:」「else:」
- 例外処理もある

#まとめ

まだこの程度で何かできるわけではありませんが、今まであきらめていたところは超えられたような気がします。
Atomでvim

# Atom+VIM+ショートカット

### 経緯
- Python
    - 基本はPycharm使ってる
    - 機械学習/データ解析だとJupyter使ってる
    - Jupyterの不満
        - セル移動が面倒くさい。
        - VIM使えない。
            - alisueさんのJupyter+vimは最高！
            - でも、頭悪いのでモード切り替えと、セル移動で軽くパニックになる。
        - RodeoのVIMモードも良かったけど、だったらJupyter使うわ！感が半端ない。
        - Pycharm+Jupyter?デバッグ出来るようにしてから出直してこい。
    - ATOM+Hydrogenとの出会い
        - Pythonプログラムがかなり気持ちいい。
        - セルを意識しないで良い気持ちよさがやばい。まじ昇天。
        - 出力結果をそのままメモ帳にダンプやばい。まじやばい。
        - dfとか一行書かずに、変数見れちゃう。
        - Atomにvim-mode-plusを入れれば、VIMエミュレートはホボできる。
            - 若干の違和感はある
            - Atomに入らばAtomに従え
            - でもやっぱり・・・VIMも使いたい

### VIMっぽいバインド設定を試してみる
- setting→設定フォルダを開く
- キーマップはtekkocさんのVimバインドと、spacevimをイメージ。
 - sのタイムラグでの誤爆が痛いのでp(パネル)に変更 

```keymap.cson
'.editor.vim-mode-plus:not(.insert-mode)':
  'space space': 'command-palette:toggle'
  'space ,': 'application:show-settings'
  'space down': 'jumpy:toggle'
  'space 0': 'window:toggle-full-screen'
  'space 1': 'maximize-panes:maximize'
  'space 2': 'vim-mode-plus:maximize-pane'
  'space ¥': 'tree-view:toggle'
  'space /': 'fuzzy-finder:toggle-file-finder'
  'space w': 'core:save'
  'space q': 'core:close'
  'space c': 'pane:close'
  'space r': 'script:run'
  'space p n': 'application:new-file'
  'space p o': 'application:open-file'
  'space p c': 'pane:close'
  'space p [': 'pane:show-previous-recently-used-item'
  'space p ]': 'pane:show-next-recently-used-item'
  'space p s': 'pane:split-left-and-copy-active-item'
  'space p v': 'pane:split-up-and-copy-active-item'
  'space p h': 'window:focus-pane-on-left'
  'space p l': 'window:focus-pane-on-right'
  'space p j': 'window:focus-pane-below'
  'space p k': 'window:focus-pane-above'
  'space p p': 'project-manager:list-projects'
  'space p m': 'project-manager:alt-confirm'
  'space z c': 'editor:fold-current-row'
  'space z f': 'editor:unfold-current-row'
  'space b b': 'bookmarks:toggle-bookmark'
  'space b l': 'bookmarks:view-all'
  'space b j': 'bookmarks:jump-to-next-bookmark'
  'space b c': 'bookmarks:clear-bookmarks'
  'space g g': 'go-to-line:toggle'
  'space g j': 'tabler:go-to-line'
  'space e =': 'editor:auto-indent'
  'space e u': 'editor:upper-case'
  'space e l': 'editor:lower-case'
  'space e b': 'atom-beautify:beautify-editor'
  'space o p': 'markdown-preview:toggle'
  'space o d': 'split-diff:toggle'
  'space o t': 'todo-show:find-in-workspace'
  'space o r': 'rest-client:show'
```

### macでHydrogenを使う場合(２/12)
- mac+Hydrogenだとcmd-enterが潰されるので(Insert-Modeなら使える)

```keymap.cson
# 上記設定に、以下を追加(For MAC)
  'space 2': 'vim-mode-plus:maximize-pane'
'atom-text-editor.vim-mode-plus:not(.insert-mode)':
  'cmd-enter': 'hydrogen:run'
```
Win10ユーザーのパスワード変更出来ない

http://blog.livedoor.jp/winandios/archives/983108.html

の通りやろうとしているのですが
パスワードのポリシー変更する所が灰色で変更出来なく
ドメインに従っているようなので
ドメインサーバーをみたのですが該当するユーザーがいないので途方にくれています……

((+_+))
Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する

## はじめに

古い備忘録だが、いまだに定期的にアクセスがあるので全面的に加筆修正した。
PHPやLaravelは新しいバージョンに追従していても、MySQLのバージョンはいまだ5.5～5.6、という環境も多いのだろう。

※2023年追記：すでにLaravel5系、MySQL5.6系ともにサポートの切れたかなり古いバージョンとなっているので、なるべくバージョンアップにて解決することを推奨する。

## 前提

+ Laravel5.4以上
+ MySQL5.7.7未満

## 現象

上記環境のもとで、`$ php artisan make:auth`で自動作成されるマイグレーションファイルに対し、
`$ php artisan migrate` を実行すると、以下のエラーが発生する。

  > [Illuminate\Database\QueryException]
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was t
  oo long; max key length is 767 bytes (SQL: alter table `users` add unique `
  users_email_unique`(`email`))

 > [PDOException]
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was t
  oo long; max key length is 767 bytes

## 原因

### 1. Laravel5.4から標準charasetがutf8mb4に変わった
標準charasetがutf8mb4となったことで1文字あたりの最大byte数が4bytesに増えた。

### 2. MySQL5.7.7未満ではユニーク制約を付けたカラムは最大767bytes
マイグレーションファイルにvarcharカラムの大きさを指定しなかった場合、`varchar(255)` のカラムが作成される。

```php
 $table->string('email')->unique();
```

一方、MySQL5.7.7以前のバージョンでは、PRIMARY_KEYおよびUNIQUE_KEYを付けたカラムには最大767bytesまでしか入らない。  
4bytes,255文字では767bytesを超えてしまう。これがエラーの原因。

## 対策

対策としては以下の3つが考えられる。

1. MySQLのバージョンを最新にする
2. 使用するcharasetをutf8mb4から変更する
3. カラムの最大長を変更し、767bytes以上の文字列が入らないようにする


### 対策1：MySQLのバージョンを最新にする

特段の事情がなければベストの対応。[MySQL5.6系のPremier Support期限は2018年2月に終了している。](https://qiita.com/shogomuranushi/items/10df42a3c7037d588efc)

### 対策2：使用するcharasetをutf8mb4から変更する

Laravel5.3まではcharsetの標準設定はUTF-8だった。
`config/database.php` よりcharsetを以下のように変更すれば、Laravel5.3以前と同じ挙動で使用することができる。
ただし、絵文字 :sushi: など、4バイトで表現される文字は使えなくなる。

```php
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
```

### 対策3：カラムの最大長を変更し、767bytes以上の文字列が入らないようにする

`varchar(191)` のカラムを作成すれば、191 * 4 = 764bytesのため、エラーが発生しない。  

```php
//個別で指定する例
 $table->string('email', 191)->unique();
```

上記のようにカラムごと個別に最大長を指定してもよいが、 
`app\Providers\AppServiceProvider.php` に以下の記載を追加することで、最大長未指定時のdefault値を変更することが可能である。

```php
use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}
```

これでマイグレーションを実行すれば、正常に動作する。

## 参考URL
1. https://laravel-news.com/laravel-5-4-key-too-long-error
2. http://d.hatena.ne.jp/tanamon/20090930/1254332746