OmniAICreator/Qiita-1.07M huggingface dataset:
週刊クラウドリンク集

このページは週刊クラウドの投稿リンクをまとめるために作成します。

週刊クラウドは[リコーITソリューションズ](http://qiita.com/organizations/jrits)で行なっているクラウド利用を広めるための活動の一つです。

毎週火曜に更新していますが、特定の情報が含まれる際には社内向けのみに発信しているため、ココには乗らない可能性があります。
社内向けの情報もご覧になりたい方は、是非[仲間になってください](http://www.jrits.co.jp/recruit/)。

- [Product for Google IoT Solutions - 5分でFirebaseの認証がわかる](http://qiita.com/alingogo/items/a24bea82cc15602a74ed)
- [node.jsでLambdaを実装した時のトラブル&解決策集](http://qiita.com/kazuqqfp/items/ac8d93918d0030b31aad)
- [AWS Lambdaを使うときに注意する４つのこと -> ３つになりました](http://qiita.com/imafuku/items/55844535dcc8e3861bd0)
- [AWSでバルスウォッチ。 -別題：twitter投稿監視の参考に-](http://qiita.com/ukiuni@github/items/2f19e166e1c912cd28b6)
- [Product for Google IoT Solutions - Firebaseとraspberry piをリアルタイムで通信してみる](http://qiita.com/alingogo/items/545e5244323afb4469ae)
- [【AWS】ログの可視化してますか？ElasticsearchServiceを使ってログを可視化する（2015/12/17時点ではElasticsearchServiceにバグがあるので要注意！回避策あり）](http://qiita.com/kazuqqfp/items/119144074ab684f6049b)
- [安いと噂のGCP、どれくらい安いのか！そして、それでもAWSを使う理由](http://qiita.com/imafuku/items/615174dc84b422795922)
- [CloudWatch LogsでSSHへの不正アクセスを検知し、通知を受ける。](http://qiita.com/ukiuni@github/items/8f0c45037e3a28238290)
- [【AWS】ElasticBeanstalk + Docker のサービスがダウンするパターンと、自動復旧の仕組みの構築方法](http://qiita.com/kazuqqfp/items/e9cc9fc8b803dc8e2463)
- [Javaな人がAzureSDKを触るためのながーい道のり](http://qiita.com/imafuku/items/aa2f5d5d9eb246a424de)
- [対決！Amazon Web Services vs Google Cloud Platform - ストレージにアップロードした公開URLのデータ取得スピード編](http://qiita.com/saber_chica/items/0fc151a4bb3a7022b05a)
- [Amazon Web Servicesを使ってみたいSIer系エンジニアに捧ぐ口実「月末、期末だけに使うサーバに毎日お金払うのはもったいないです！だから！」](http://qiita.com/ukiuni@github/items/f5e50643eade67325fb7)
- [コマンドラインでGoogleのインフラを操作する - Google Cloud SDKのインストールからインスタンス起動・停止まで](http://qiita.com/saber_chica/items/6d3a413ce73aae0f6607)
- [Azure Storageを使ってみる](http://qiita.com/alingogo/items/a1a235c4e9457fc36df9)

新しい物順、随時更新してきます。
SoftLayerベアメタル上に Nutanix Community Editionをインストールしようとした話

Nutanix試してみたいけど、ハードないしなー。
仮想上のネスト環境でもいいけど、やっぱSSD+HDDのリアルな環境で動かしてみたいな－…ハード落ちてないかな－
って考えてたら。あるじゃないか！SoftLayerが！って事で試してみました。

結果的には、正しく動かせませんでした！＼(^o^)／

【構成】
・ベアメタルサーバ　1台
　・SSD 960GB x1本
　・SATA 2TB  x1本
　・SATA 1TB x1本　Nutanix USBメモリ書き込みイメージをHDDに書き込むために利用
　　（USBメモリを不要とさせるための措置）


【やってみた事のおさらい】
1.USBメモリに対してNutanix Community Editionを書き込み
・USBメモリにNutanix Community Editionを書き込み、ベアメタルサーバKVMのUSBマウントを実施
　時間はかかるが、インストーラが正しく起動。インストールも完了
・再起動後、Nutanix Community Editionが起動するが、NEXTのユーザ認証が行えず断念
　→インターネットに接続できない（ベアメタルが正しくアドレス設定されていない）
・手動にてPublicアドレスを設定したがNG
　→private側からプロキシ経由で接続を試みたがNG

結論：インストールが正しく行えたとしても、USBメモリの接続問題が残る上、NEXTのユーザ認証が行えない問題が解決しないかぎり設定が進まない…

2.USBメモリの代わりに1TBのSATAディスクにNutanix Community Editionを書き込み
・2TB SATAに対してWindows、Linuxをインストール
・DDにてNutanix Community Editionのイメージを1TB SATAに書き込み
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/82be1f36-a946-fffc-e3db-49e60e82b88c.png)

・1TB SATAのブートシーケンスを最上位として起動
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/600c3787-3d6c-2150-a37a-b67b85b31bca.png)

・インストーラが起動するため、2TBに対してNutanix Community Editionをインストール
・2TB SATAのブートシーケンスを最上位として起動
・Nutanixが起動できない！ dracutプロンプトで停止
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/fa6267be-51c6-0df9-9d52-10a7f2873251.png)

RAIDの構成をNO RAIDで試したり。色々試行錯誤してみたけど結局正しく起動できなかった。
![image](https://qiita-image-store.s3.amazonaws.com/0/101027/ba9b4f61-dfc4-b1a7-7160-495be04aa333.png)


と、言うことで。残念ながらNutanix Community EditionをSoftLayer上にインストールする事はできませんでした(´･ω･`) 

動いたよって方いらっしゃれば。教えて下さい^^;

では。
Play Framework 2.4 java ネストしたformのvalidate

子クラスのリストを持ったformのバリデーションのやり方があまりweb上に出てなかったのでメモ。

結論としては子クラスのリストに`@Valid`アノテーション付けるだけだった。

```Parent.java

public class Parent {
    public int id;
    @Valid
    public List<Child> child;
}
```

```Child.java

public class Child{
    @Required(message = "名前を入力してください。")
    public String name;
    @MaxLength(value = 10, message = "10文字まで")
    public String memo;
}
```

```HogeController.java
public Result hoge() {
    Form<Parent> parent_form = form(Parent.class).bindFromRequest();
    if (parent_form.hasErrors()) {
        // 子クラスのバリデーションも入ってる。
        return badRequest(views.html.hoge.create.render(parent_form));
    }

    return redirect("url");
}
```

多分、素直に作成してれば問題なかったんだけどCMSみたいなシステムを作ってたので表示制御用のプロパティをformのクラスに持ってたのがいけなかった。

注意点としてはformのプロパティは全て送信して受け取れるようにしておくこと。

if文で使うためだけのプロパティとかを送信してなかったので`badRequest`時の再描画でエラーになってた。

とりあえず全てのプロパティをhiddenで持つようにしたら問題なく動きました。
HttpClient でクライアント証明書を設定する方法

## 概要
クライアント証明書が必要なWebAPIを叩く場合は、リクエスト送信時にクライアント証明書を設定する必要がある。

以下、HttpClientクラスを用いたクライアント証明書の設定方法を説明する。

* 参照設定に System.net.Http.WebRequest を追加する
* WebRequestHandler にクライアント証明書を設定した X509Certificate2 を追加する
* HttpClient 生成時に WebRequestHandler を設定する
* HttpClient を用いてサーバへ要求を行う


## ソース
```csharp
using System.IO;
using System.Net.Http;
using System.Security.Cryptography.X509Certificates;

                // :

        public void MainProc(string[] args)
        {
            var url = @"http://hogefuga.com/";
            var certPath = @"C:\certFileName.p12"; // クライアント証明書ファイルへのパス
            var certPassword = "password";         // クライアント証明書ファイルのパスワード

            // クライアント証明書付きのハンドラを生成
            WebRequestHandler handler = this.CreateRequestHandler(certPath, certPassword);

            using (HttpClient client = new HttpClient(handler))
            {
                HttpResponseMessage response = client.GetAsync(url).Result;
                // :
            }
        }

        private WebRequestHandler CreateRequestHandler(string certPath, string certPassword)
        {
            // クライアント証明書読み込み
            X509Certificate2 x509 = new X509Certificate2(this.ReadFileAsBytes(certPath),
                                                         certPassword,
                                                         X509KeyStorageFlags.MachineKeySet);

            WebRequestHandler handler = new WebRequestHandler();
            handler.ClientCertificates.Add(x509);

            return handler;
        }

        private byte[] ReadFileAsBytes(string fileName)
        {
            using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                byte[] rowData = new byte[(int)stream.Length];
                stream.Read(rowData, 0, rowData.Length);
                return rowData;
            }
        }

```

## 備考
* X509Certificate2 生成時に X509KeyStorageFlags.PersistKeySet を使うとIIS経由のWebService から叩いた時にエラーとなったので X509KeyStorageFlags.MachineKeySet を用いた。PersistKeySet でもデバッグ実行時や exeを直接叩いた場合は問題なく動作していたので、呼び出すユーザによって使わける必要があるのかもしれない。
Sidekiq.❨╯°□°❩╯︵┻━┻

Sidekiqのソース見てたら[なんか変なメソッド](https://github.com/mperham/sidekiq/blob/v4.0.1/lib/sidekiq.rb#L40)があったので呼んでみた

```
# bundle exec rails c
Loading development environment (Rails 4.2.4)
2.2.3 :001 > Sidekiq.❨╯°□°❩╯︵┻━┻
Calm down, yo.
 => nil
```

なにこれ
特定の文字列を含む行でファイルを分割する（連結されたCA証明書を分離する）

/etc/ssl/certs/ca-bundle.crt のように複数のCA証明書が連結されたファイルがありますが、どんな証明書が入っているのかなと、opensslに食わせても、どうも先頭の証明書しか情報が見えません。

```
# openssl x509 -in /etc/ssl/certs/ca-bundle.crt -noout -text
```

2番目以降の証明書の情報も見れるようなオプションがあればいいのですが、どうにも探しきれないので、諦めて証明書毎にファイルを分割します。

各証明書は
```
-----BEGIN CERTIFICATE-----
```
で必ず始まっているので、この行を検出したら別ファイルに書き出すようなawkを書いてみました。

```awk:separate-ca-certificate.awk
{
  if(/BEGIN CERTIFICATE/){
    filename=sprintf("prefix_%03d.crt",suffix);
    suffix+=1;
  }
  print >> filename;
}
```

「BEGIN CERTIFICATE」の文字が含まれる行に出会うたびに、ファイル名のサフィックスをインクリメントして、吐き出しております。

実行コマンドは下記です
```bash
awk -f separate-ca-certificate.awk /etc/ssl/certs/ca-bundle.crt
```

シェルのワンライナーなら下記になります。
```bash
awk '{if(/BEGIN CERTIFICATE/){filename=sprintf("prefix_%03d.crt",suffix);suffix+=1};print >> filename}' /etc/ssl/certs/ca-bundle.crt
```

if文の文字列を変えれば、証明書以外のケースにも応用できますね！
WebStormでTypeScript 1.8を使う方法

先日[TypeScriptの最新バージョンである1.8](https://blogs.msdn.microsoft.com/typescript/2016/02/22/announcing-typescript-1-8-2/)がリリースされました。

[WebStorm](https://www.jetbrains.com/webstorm/)ではTypeScriptのコンパイラーが内蔵されているため、WebStormさえインストールすればTypeScriptが使えるようになります。ですが、WebStorm 11におけるデフォルトのコンパイラーはTypeScript 1.7です。**このコンパイラーを切り替え、TypeScript 1.8を使う方法を紹介します**。

#必要ファイルをダウンロード
https://github.com/Microsoft/TypeScript/tree/master/lib より、typescriptServices.js、lib.d.ts、lib.es6.d.tsをダウンロードして任意の場所にフォルダを作成し、保存しておきます。

#WebStorm側の設定
[WebStorm]→[Preferences]→[Languages & Frameworks]→[TypeScript]を選択し、TypeScriptの設定画面を開きます。[Enable TypeSCript Compiler]にチェックを入れ、TypeScriptのコードが自動でコンパイルされるようにしておきます。

![TypeScriptのコンパイラー設定画面](https://qiita-image-store.s3.amazonaws.com/0/67884/df217ee5-11c3-4cd6-23c1-ae0a23a0d7ab.png)


[Compiler version]の箇所で、[Edit]を選択し、コンパイラーの設定画面から[Custom directory]にチェックを入れ、先ほどダウンロードしたファイルが含まれるフォルダを指定します。

![コンパイラーを切り替え](https://qiita-image-store.s3.amazonaws.com/0/67884/773cdec1-8e73-a628-88dc-ecd0c2373b6d.png)

[OK]を押して設定画面に戻り、[apply]を押すと設定終了です。

#TypeScript 1.8を早速使ってみよう

実際にTypeScript 1.8が使えるか試してみましょう。下記は @vvakame さんの記事「[TypeScript 1.8.0-beta 変更点 - Qiita](http://qiita.com/vvakame/items/31f5c45ff49de67d5634)」で紹介されているTypeScript 1.8の「String literal types」という型を使ったコードです。

```ts:TypeScript1.8確認用のコード
type Season = "winter" | "spring" | "summer" | "autumn";

function seasonToJapaneseString(s: Season): string {
	switch (s) {
		case "winter":
			return "冬";
		case "spring":
			return "春";
		case "summer":
			return "夏";
		case "autumn":
			return "秋";
	}

	return "???";
}

seasonToJapaneseString("winter");
// ☆下記は型エラー
seasonToJapaneseString("winert");
```

前述の設定によりTypeScript 1.8が使えるようになったWebStormでは、このコードが自動でコンパイルされ、☆の部分で型エラーを検出してくれるのが分かります。

> 参考: [Transpiling TypeScript to JavaScript](https://www.jetbrains.com/webstorm/help/transpiling-typescript-to-javascript.html)
指定したサイズのダミーファイルを作成するには（Linux編）

## 実現したいこと

指定したサイズのダミーファイルの作成したい

## 実現方法および解決方法

ddコマンドを利用して指定したサイズのファイルを作成する

## 実行コマンド

```
dd if=/dev/zero of=1G.dummy bs=1M count=1000
```

## 情報源

dd man


## 補足

GNU fileutilsのddコマンドだとbsで単位を指定できる
bsで単位を指定できることについて（man ddより)
> 乗数
>        数 値の後には、倍数を指定するサイズ指定文字と、通常のバイトを意味する B または 10 進の「商業用」バイトを意味する D を
>        続けて置くことができる。たとえば ‘1KB’ は ‘1024’ と等しく、‘1KD’ は ‘1000’
>        と等しい。この例外は b (512 バイト)、c (1 バイト)、 w (使うべきでない - System V では 2 を意味し、 4.2BSD では 4 を意味する) の 3 つで、これらの後に B や D をおくことはできない。
> 
>        k      キロ: 通常バイト指定なら 2^10 = 1024、10 進バイト指定なら 10^3 = 1000
> 
>        M      メガ: 2^20 = 1,048,576 または 10^6 = 1,000,000
> 
>        G      ギガ: 2^30 = 1,073,741,824 または 10^9 = 1,000,000,000
> 
>        T      テラ: 2^40 = 1,099,511,627,776 または 10^12 = 1,000,000,000,000
> 
>        P      ペタ: 2^50 = 1,125,899,906,842,624 または 10^15 = 1,000,000,000,000,000
> 
>        E      エクサ: 2^60 = 1,152,921,504,606,846,976 または 10^18 = 1,000,000,000,000,000,000
> 
>        Z      ゼタ: 2^70 = 1,180,591,620,717,411,303,424 または 10^21 = 1,000,000,000,000,000,000,000
> 
>        Y      ヨタ: 2^80 = 1,208,925,819,614,629,174,706,176 または 10^24 = 1,000,000,000,000,000,000,000,000
rubyのTime.nowでiso8601をしたらNoMethodErrorになるとき

# 概要

```rb
Time.now.iso8601
```

としたら、

```
: NoMethodError: undefined method `iso8601' for 2016-02-25 04:16:12 +0000:Time
```
こんあかんじのエラーがでた。

# 結論

以下をスクリプトに加える。

```
require 'time'
```
openFrameworks - 新規プロジェクトの作成

※ [openFrameworks公式サイト](http://openframeworks.cc/ja/learning/01_basics/create_a_new_project/)より転載 

ほとんどのプラットフォーム (OS X、Windows、Linux) では、新しいProject Generatorを使用できます。

![newGui](http://openframeworks.cc/ja/learning/01_basics/create_a_new_project/newGui.png)

プロジェクトは、openFramewroksのフォルダ内の「apps」フォルダ内に作成することをお薦めします。例えば、simpleSketch というプロジェクトを作成し apps/myApps 内に置くとします、つまりopenFrameworksのルートからのフルパスは apps/myApps/simpleSketch になります。例えばいろいろなプロジェクトに取り組んでいる場合などに、「apps」内に新規にフォルダを作成することも可能です。

openFrameworksをハードディスクのどこに配置したかによって、設定を調整する必要があるかもしません。

![newGuiSettings](http://openframeworks.cc/ja/learning/01_basics/create_a_new_project/newGuiSettings.png)

重要なポイントは、openFramewroksのプロジェクトは相対的に機能するというところです。つまり、プロジェクトはopenFrameworksのライブラリのフォルダを、相対的に参照しています (例 : ../../../libs) 。もし、プロジェクトを作成したら、openFrameworksのルートフォルダからの階層構造を保持したままにしておく必要があります。あるいは、もしフォルダの階層を変えたいのであれば、Project Generatorを使用してアップデートすることも可能です。
Genericの元型を取得する（Class転記）

Classから他のClassに値を転記するときに作ったもの。
「decimal?」は「GetProperties」で回して「PropertyType」を参照すると「Nullable」で返ってくるらしく、めちゃくちゃハマった記憶があるｗ

```lang:メソッド
public Type GetTypeEx(Type value)
{
    Type result = value;
    if (result.IsGenericType)
    {
        if (result.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            // Nullableの場合、元の型を取得
            // Nullable<int> → int
            result = Nullable.GetUnderlyingType(value);
        }
        else
        {
            // System.TypeがGenericの場合、値のSystem.Typeを取得
            // List<int> → int
            result = result.GetGenericArguments()[0];
        }
    }
    return result;
}
```

```lang:サンプル
public class Hoge
{
    private decimal? _piyo = 0;
    public decimal? Piyo
    {
        get { return this._piyo; }
        set { this._piyo = value; }
    }
}

private void sample()
{
    decimal? target1 = 0;
    var result1 = this.GetTypeEx(target1.GetType());
    // result1	{Name = "Decimal" FullName = "System.Decimal"}	System.Type {System.RuntimeType}

    var target2 = new List<int>();
    var result2 = this.GetTypeEx(target2.GetType());
    // result2	{Name = "Int32" FullName = "System.Int32"}	System.Type {System.RuntimeType}

    var target3 = new List<int?>();
    var result3 = this.GetTypeEx(target3.GetType());
    result3 = result3.GetTypeEx();
    // result3	{Name = "Int32" FullName = "System.Int32"}	System.Type {System.RuntimeType}

    var target4 = new Hoge();
    var result4 = this.GetTypeEx(target4.Piyo.GetType());
    // result4	{Name = "Decimal" FullName = "System.Decimal"}	System.Type {System.RuntimeType}

    System.Reflection.PropertyInfo[] targetProperties = target4.GetType().GetProperties();
    foreach (System.Reflection.PropertyInfo target in targetProperties)
    {
        var p = typeof(Hoge).GetProperty(target.Name);
        var result5 = this.GetTypeEx(p.PropertyType);
        // result5	{Name = "Decimal" FullName = "System.Decimal"}	System.Type {System.RuntimeType}
    }
}
```
renderとパーシャルの関係

```lang:users/show.html.erb

  <% @posts.each do |note| %>
    <%= render 'notes/note', note: note %>
  <% end %>

```



```lang:notes/_note.html.erb

<li>
    <%= note.user.name %>

    <%= link_to note.title, note_path(note.id) %>
 
</li>

```

上の`show.html.erb`では、renderのところで、`notes/note`と、userフォルダ内にnotesフォルダ内のパーシャルを呼び出している。

`note: note`は`パーシャルで用いられている変数：パーシャルに渡したいオブジェクト`で、

show.html.erbで指定したnoteインスタンス変数をパーシャルで使うために、パーシャルにこのオブジェクトをnote変数に渡している。
つまり、`note`オブジェクトを`note:`変数に渡している。


だから、パーシャルで`note`変数を使って、`note.user.name``note.title``note.id`が使えるようになっている。




renderにはオブジェクトを指定することもできる。

```lang:users/show.html.erb

  <% @notes.each do |note| %>
    <%= render note %>
  <% end %>

```

とオブジェクトを指定しただけで、
`<%= render 'notes/note', note: note %>`というコードが生成され、
自動的に`notes/note`が呼び出される。
オブジェクトも自動的にパーシャルに渡される。



renderの引数には配列も指定できる。
オブジェクトの配列を指定したら、

```lang:users/show.html.erb


    <%= render @notes %>


```
以下のコードが生成される。

```lang:users/show.html.erb

  <% @notes.each do |note| %>
    <%= render note %>
  <% end %>

```

eachによる処理が行われるようになる。
オブジェクトの数だけパーシャルファイルが呼び出されるようになる。
考察 > ESP8266 > 日時情報の保持

ESP8266のソフトにおいて、データに「日時情報」(メッセージのポスト日時)を追加しようと検討中。

Timeというライブラリがあるようだ。
http://playground.arduino.cc/Code/time

ESP8266が時計を持つとすると以下が必要だ

- 時計合わせ
  - コマンド
- Timeライブラリのimport
- ヘッダファイルに Timeライブラリを inlcude
  - ヘッダが肥大化する
- RTC : Real Time Clock
  - 電源OFF/ONしても時計を保持したい場合

やめた。

String型で保持する。

相手がRaspberry Pi2なので、Pi2で時刻をどうにかして、String型でUART経由で渡す。
http://qiita.com/7of9/items/94f123851df5d5e35bea

<hr>
本当にESP8266に時計情報がほしいときは今後来るだろう。

その時にはまじめに対応を考える。
Bashで echo "$(＜file)" が何で動くのか気になったので確認してみたら意外なオチだった

今まで `prog "$(cat file)"` ってよく書くことあったけど `prog "$(<file)"` ってすれば同じことを`cat`無しで出来ることに気が付いた。後者の書き方だと cat を起動するコストが無い分高速。

# 何でコレが動くのか？
でも `$(command)` って`command`の実行によって行われた標準出力を展開して使うっていう文法だよなぁ…、`<file` って特にコマンドの実行をしてるわけじゃないのにどういう理屈でコレが動作するんだろう…？

こんな時はとりあえず`man`を見てみよう。そして発見。

> **Command Substitution**
> Command substitution allows the output of a command to replace the command name.
> (…中略) The command substitution **\$(cat file) can be replaced by the equivalent but faster $(< file)**.

答え：単に一番よくある利用シチュだからこう書いたら高速化出来るようにしようぜっていうハードコーディングな追加文法でしたｗ

なおソース追ってみたらバージョン `bash-2.05-beta1` で導入されてる模様。
bash-2.05b なんて CentOS2は無理だけど、CentOS3 の最新アップデート辺りではもう使えるので今時はもうどこで使っても問題ない文法と思ってよさそうだな。
開発時にエンジニアが知りたい、相談者の視点

相談者(特に非エンジニア)はエンジニアとは違う視点を持っています。それは経験、性格、環境、見通してるものの違いから来るものであったり様々です。エンジニアはそういった相談者の視点を知りたいと考えています。今日はそんなエンジニアが知りたい、相談者の方の視点についてまとめてみました。

## 今北産業

* 同じ単語でも、違う意味でとらえる事がよくあります
* エンジニアの考える簡単と相談者の考える簡単は同じとは限りません
* エンジニアが知りたいは相談者の考えた「手段」ではなくて、何に困っているのか、何を解決したいのかの根源部分です

## よくある風景1

A「Bさん、業務ツールいっぱいあって大変なんだけどひとまとめにできない？」
B「(業務ツールってウェブツールばっかりだしほげほげでふがふがすれば) まぁ技術的には可能ですかねぇ。ちょっとお時間もらいますよ。」
A「業務ツール開発しなおすのは大変だけど、組み合わせるだけならそんな大変じゃないでしょ？」
B「あー、(ほげほげはクセあるし)、ちょっと調査時間かかる可能性もありますけど、なんとかやってみます。」

--\> 業務ツールをまとめてタブ切り替えできるようなのを作成

B「こういう感じでどうですか？」
A「おー、いいねぇ。いいけど、これって導入しやすいウェブ系ツールから対応してみたパイロット版？」
B「あれ？業務ツールってとりあえずこれ一通りぶち込めばよかったのでは？」
A「skypeとかExcelとかアプリの方も考えてたんだけどさぁ」
B「…。」

### ここでのポイント

1. 相談者の考える簡単とエンジニアの考える簡単は違う事がよくあります
2. 「業務ツール」と一言で言ったものの、現場で業務ツールを使ってる人達にとっての業務ツールの示す範囲と、エンジニアが聞いたときにどこまでを業務ツールと認識するかは違う可能性が多々あります

## よくある風景2

B「あー、skypeとかExcelを制御してひとまとめにするのは、hackというか結構面倒になってきますね。特にクロスプラットフォームだと。」
A「でも全ぶっこみで欲しいんだよね」
B「えとそこらへんのアプリに関してはどこまでの事ができればいいですか？」
A「バックグラウンドでアプリ起動しててもいいんだけど、このツールの窓から見られる感じかな」
B「oh」

それはつらいので必死で考える --\> とりあえず背景を知りたい

B「あー、欲しい機能とかじゃなくて、もっと背景的な事知りたいですね」
A「えと、今のこのツールだと、業務ブラウザじゃない？でもブラウザで見てたりすると、Skypeの画面がかぶって見えない時があるから邪魔にならないところに欲しいんだよね」
B「？？？？？」
B「あー、もしかして僕4kディスプレイ二枚使ってるから、不便のポイントが想像できてないのかもしれません」
A「あー、こっちはノートPCだからなぁ。ブラウザとかウインドウを切り替えて見てるんだけど、通話中のskypeの小さなポップアップ画面がウザいんだよね」
B「おや？と、なると問題なのはそのポップアップ画面さえなんとかできればいいかんじですか？」
A「とにかく切り替えが面倒なんだよね」
B「ウィンドウが増える事が嫌な感じですか？状態がわからなくなる事が嫌？」
A「すでに、ブラウザでウィンドウ開きまくってて、探すのが手間なんだよね。さらに増えてアイコンすらみえなくなるとさらにわからなくなる」
B「アイコンが見えなくなるっていうのは、タスクバーのトレイアイコンが多すぎてってことですか？」
A「いやブラウザのタブのアイコン。でさー、初心者とかだとブラウザ複数起動すら思いもよらないしね」
B「とすると、ウィンドウがいっぱいの状態でも、自分のアクセスしたいツールにすぐアクセスする機能さえあればいい感じですかね？」

--\> さっきのツールにタスクトレイで必要なツールに一発でアクセスできる機能を追加

A「あー、これこれ、これでいいわ」

### ここでのポイント

1. 環境の違いやコンピュータスキルによって、全く違う視点が出てくる
2. そういった視点の違いは共有しようとしないと伝わらない
3. 相談者の考える手段は、必ずしも最適な手段とは限らない。そこはエンジニアが考えたい領域なので一緒に考えましょう

## まとめ

お互いに視点は違いがあります。相談者は手段を考えるのではなく、困ってる事をそのままエンジニアに伝えた方が、お互い幸せになります。特に手段だけ伝えて実装してもらうと、本来求めているモノとは全く違うものが出来ることがあります。

お互い幸せになれる開発ができるといいですね！それではごきげんよう
wheneverで環境変数を定義したい	


vi config/schedule.rb

```shell 
env :SHELL, "/bin/bash"
env :PATH, "/usr/local/bin"
```


生成されるcronの設定のイメージ

```
# Begin Whenever generated tasks for: FooProduction
SHELL=/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin:/opt/aws/bin
# End Whenever generated tasks for: FooProduction

```
Proxmox4.1のLXCコンテナにUSBパススルー

## 参考

* [ただのメモ: [memo] LXC ゲストから USB デバイスへアクセス](http://blog.at-dk.info/2010/08/memo-lxc-usb.html)
* [passthrough usb from host to lxc? | Proxmox Support Forum](https://forum.proxmox.com/threads/passthrough-usb-from-host-to-lxc.23856/)

## 設定

```bash:デバイスノード番号を確認
$ ls -l /dev/bus/usb/001/
合計 0
crw-rw-r-- 1 root root 189, 0  2月 25 11:39 001
```

* c, 189であることがわかる。

```diff:/etc/pve/lxc/106.conf
  arch: amd64
  cpulimit: 1
  cpuunits: 1024
  hostname: lxc6
  memory: 1000
  net0: bridge=vmbr0,gw=192.168.0.1,hwaddr=62:39:35:35:62:31,ip=192.168.0.6/24,name=eth0,type=veth
  ostype: ubuntu
  rootfs: local:106/vm-106-disk-1.raw,size=8G
  swap: 512
+ lxc.cgroup.devices.allow = c 189:* rwm
```

## LXCコンテナ内で作業

```bash:
mkdir -p /dev/bus/usb/001
mknod /dev/bus/usb/001/001 c 189 0
```

```bash:確認
lsusb
```
[GAS] スプレッドシートでも串刺し演算がしたい

# 串刺し演算とは？
同じ書式・同じ形の複数のシートのデータを、１つのシートに集計したり加減乗除したりする事です。
Excel 2002からずっと使える機能のようです。

(例)
1つのファイル内に、以下のようなシートがあったとします。
AAAAA, BBBBB, CCCCC, DDDDD, EEEEE, FFFFF, GGGGG, HHHHH
````
=SUM(CCCCC:FFFFF!B4)
````
こんな感じで数式を書くと、CCCCC〜FFFFFまでの4枚のシートのセルB4が合算された結果を表示することができます。


# Google スプレッドシートでの実現方法
標準機能では、搭載されていないので、GoogleAppsScriptを使って実現します。

````
function skewersum(cell_no, start_name, end_name) {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var sum = 0;
  var add_flag = false;
  
  for(var i = 0; i < sheets.length;i++) {
    if(sheets[i].getName() == start_name){add_flag = true;}
    if(add_flag){sum += sheets[i].getRange(cell_no).getValue();}
    if(sheets[i].getName() == end_name){break;}
  }
  return sum;
}
````
````
=skewersum("B4","CCCCC","FFFFF")
````

シンプルな実装ですが、動くようにはなりました。

重いですが。。

Tipsとしてどなたかの参考になれば幸いです。
Qiita > 編集リクエストできなくなった? > 別のメニューがある

本日興味深い記事があり、その中でタグ付けをリクエストしたかったが、タイトルのすぐ下にあった「編集リクエスト」のリンクが見当たらなくなっていた。

~~システム更新中なのだろうか。~~

<hr>

## メニュー1

自己解決した。

投稿するメニューにあった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/bc3edfe6-fb80-0a73-8c62-7222b1d1411d.png)


## メニュー2

@jTakasuRyuji さんからのコメントで気づいたのは以下の方でした。


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/93516dc4-2893-62b5-dda3-2a30931c20d1.png)


上記画像の左上に「編集リクエストを作成する」とあります。
記事のページフッタに確かにありますね。
rails+mysql2+migrationで[t.references]を使い、 "Cannot add foreign key constraint: ALTER TABLE " が出る時の対処法

# こういうマイグレーションで

```rb
create_table :order_todos do |t|
  t.references :テーブルクラス名
  ...
```

# こういうエラー

```bash
Mysql2::Error: Cannot add foreign key constraint: ALTER TABLE `作ろうとしてるテーブル名` ADD CONSTRAINT `fk_rails_000d747b3d`
FOREIGN KEY (`外部キー名`)
  REFERENCES `テーブル名` (`id`)
/path/to/rails_app/db/migrate/2016xxxxxxxx_create_作ろうとしてるテーブル名.rb:3:in `change'
```

# 対処法

`rails_app_path/db/migrate`内をよく見てみる。
外部キーを当てたい参照先のテーブルファイルがタイムスタンプ的に後に来ている可能性がある。タイムスタンプを変えて今作ろうとしているテーブルより前に来るようにすればすんなり通る。
電子工作 > 交差 > φ50H7 > +30, 0 > 50mm +30ミクロン -0ミクロン の寸法許容差

電子工作ではないかもしれない。

とある資料を見ていて「φ50H7」というのに出くわした。
「φ50±7」の記載ミスか、と思って聞いたら公差の書き方ということだった。

参考 http://www.toishi.info/faq/question-seven/hameai-jis.html

「穴の公差域クラス G6～H10」というのがあるが、まだ読み方はわからない。

φ50H7の場合は

- を超えて : 40
- 以下 : 50
- H7 : +30, 0

~~50mmに対して+30mmも許容するということなのか? 大きすぎる気がする。~~

3Dプリントの時に公差は気にするのかどうか。

## v0.2

@ozwk さんのコメントを元に以下を見つけた。

>寸法許容差を示す数字の単位はミクロンです。

再度、「φ50H7」は

- を超えて : 40
- 以下 : 50
- H7 : +30, 0

は 「50mm +30ミクロン -0ミクロン の寸法許容差」ということのようです。
【Android】GooglePlay申請作業メモ 

# 【Android】GooglePlay申請作業メモ
Googleアカウントだけ渡されてAndroidアプリのバージョンアップの申請をお願いされたのでメモ。

## KeyStoreファイルが必要
・apkファイルを作成するために必要
・アプリを新規登録した時のKeyStoreファイルがないと作成できない。
・KeyStoreファイルのパスワード
・エイリアス名
・エイリアス名のパスワード

## バージョン番号が異なっていた
・AndroidManifest.xml
　android:versionCodeとandroid:versionNameを変更
・build.gradle(app)のandroid→defaultConfig
　versionCodeとversionNameを変更

## apkアップロードで失敗する
・jp.co.xxx.appnameのパスが前バージョンと異なっていた。
　以前書いた記事でapkを作り直して解決
　[【AndroidStudio】パッケージ名を変更する方法](http://qiita.com/nusa/items/413c8a131ebc451e80f8)

## 公開できない
・アップロード後にドラフト保存したら、色々警告が出ていて公開できない
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/48625/dce7cb5a-b470-ce64-5418-98fca6a6f053.png)
　→前のバージョンを無効にしたら新しいバージョンが公開できた。

## 画像素材が足りない
・iOSアプリにはない宣伝用画像を用意していなかった。
CentOS7のMariaDB5.5を10.3にアップグレードする

※10.3 stable リリースされてるので更新してみた。

MySql5.6+からマイグレーションする場合など、MariaDB5.5では動作しないケースが多々ありそうなので~~10.1~~「10.3」にしてみました。


##公式yumリポジトリ追加
公式の[CentOS7x64のMariaDB10.3 Stableのリポジトリ情報](
https://downloads.mariadb.org/mariadb/repositories/#mirror=yamagata-university&distro=CentOS&distro_release=centos7-amd64--centos7&version=10.3)
を追加します。

```bash:
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
```
##version5.5のサーバー停止
```bash:
$ sudo systemctl stop mariadb
```
##Update

```bash
$ sudo yum update mariadb-server -y
～～略～～

base                                                     | 3.6 kB     00:00     
epel                                                     | 3.2 kB     00:00     
extras                                                   | 3.4 kB     00:00     
mariadb-main                                             | 2.9 kB     00:00     
mariadb-maxscale                                         | 2.4 kB     00:00     
mariadb-tools                                            | 2.9 kB     00:00    
updates                                                  | 3.4 kB     00:00
(1/6): epel/x86_64/group_gz                                |  88 kB   00:00     
(2/6): epel/x86_64/updateinfo                              | 949 kB   00:00     
(3/6): mariadb-tools/7/x86_64/primary_db                   |  11 kB   00:02     
(4/6): mariadb-maxscale/7/x86_64/primary_db                | 6.4 kB   00:02     
(5/6): mariadb-main/7/x86_64/primary_db                    |  50 kB   00:02     

↑３つのmariadb関係リポジトリをロードしている


～～中略～～

(1/7): MariaDB-10.3.10-centos73-x86_64-common.rpm          | 157 kB   00:10     
(2/7): MariaDB-10.3.10-centos73-x86_64-compat.rpm          | 2.8 MB   00:07     
(3/7): boost-program-options-1.53.0-27.el7.x86_64.rpm      | 156 kB   00:00     
(4/7): MariaDB-10.3.10-centos73-x86_64-client.rpm          |  53 MB   00:42     
(5/7): lsof-4.87-5.el7.x86_64.rpm                          | 331 kB   00:00     
(6/7): galera-25.3.24-1.rhel7.el7.centos.x86_64.rpm        | 8.1 MB   00:06     
(7/7): MariaDB-10.3.10-centos73-x86_64-server.rpm          | 123 MB   01:02     
--------------------------------------------------------------------------------
合計                                               2.4 MB/s | 188 MB  01:20     

～～中略～～

置換:
  mariadb.x86_64 1:5.5.44-1.el7_1       mariadb-devel.x86_64 1:5.5.44-1.el7_1
  mariadb-libs.x86_64 1:5.5.44-1.el7_1  mariadb-server.x86_64 1:5.5.44-1.el7_1

完了しました!
```

##起動


```bash:
$ sudo systemctl start mariadb
```
※ 私の場合は、update時に正しくMariaDB5.5が停止していなかったせいなのか、サービス名称が`mariadb`ではなく、`mysqld`でした。

```bash:
$ ss -ltn | grep 3306
LISTEN     0      80                       :::3306                    :::*
```
port3306がlistenしています。

```bash:
$ mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.10-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 
```

バージョン10.3になっています。
Mac mini 2010にdebian8をインストール

macmini 2010, 2011にて確認。

## ISOダウンロード

* http://cdimage.debian.org/debian-cd/8.3.0/amd64/iso-cd/debian-8.3.0-amd64-netinst.iso

## Grub

http://purestblue.com/2011/01/13/installing-debian-on-an-intel-mac-mini/

```diff:/etc/defaults/grub
- GRUB_CMDLINE_LINUX=""
+ GRUB_CMDLINE_LINUX="reboot=p nouveau.modeset=0"
```

```bash:
update-grub
```

* [JessieにPromox4をインストール、NAT設定 - Qiita](http://qiita.com/tukiyo3/items/71e3222b817e1188bc40)
Googleスプレッドシートのようなjqueryプラグイン

## はじめに
Googleスプレッドシートのようなjqueryプラグインを探していたのでそのメモになります。

## 詳細
----
#### Handsontable
https://handsontable.com/

参考）
[ExcelのようにTableが編集できちゃう「Handsontable」](http://webkaru.net/jquery-plugin/handsontable/)

----
#### ParamQuery grid
http://paramquery.com/
※IE6等にも対応しているらしい。

参考）
[[JS]エクセルやスプレッドシートのように美しく機能的な表を作成するスクリプト -ParamQuery grid](http://coliss.com/articles/build-websites/operation/javascript/jquery-plugin-paramquery-grid.html)

----
#### jTable
http://www.jtable.org/

参考）
[データベース連動型のAjaxを使ったテーブル実装jQueryプラグイン「jTable」](http://phpspot.org/blog/archives/2012/03/ajaxjqueryjtabl.html)

----
#### csv2table
http://jsgt.org/lib/jquery/plugin/csv2table/v002/test.htm
※CSVから表を生成

参考）
[これは便利だ！Excel→Table化するjQueryプラグイン](http://ascii.jp/elem/000/000/197/197664/)

#### jqGrid
http://www.trirand.com/blog/

参考）
[jQueryの表プラグインにjqGrid](http://mechsys.tec.u-ryukyu.ac.jp/~oshiro/SiteList/2011/10/16/2214)

## その他
まとめもありました。

[テーブルを使ったいろいろなjQueryプラグイン26個まとめ](http://blog.verygoodtown.com/2011/05/jquery-table-plugins/)

## 履歴
ElixirでもRubyのguardみたいにファイル変更時に自動でテストが走らせたい！そんな時は、mix-test.watchを使ってみよう！

tmuxとvimを使いながら、Elixirで開発をしている時に毎度毎度、ファイル変更のたびに`mix test`を実施するのが、ちょっと面倒かも。。

ということで、Rubyの[guard](https://github.com/guard/guard)みたいに`on file changed`でテストを走らせることができないかなー、と探してみたところ下記を見つけました。

* [mix-test.watch](https://github.com/lpil/mix-test.watch)

```
Automatically run your Elixir project's tests each time you save a file. Because TDD is awesome.
```

これは！、と期待感を持って、触ってみました。

## 実際に使ってみたリポジトリ

* https://github.com/letusfly85/github_stalking

## 設定手順

すでに、`mix new ${application_name}`は実施済みの前提で記載します。

### 1. mix.exsにdepsを追加する

```ex
  defp deps do
    [{:mix_test_watch, "~> 0.2", only: :dev},
     {:tentacat, "~> 0.2"},
     {:riak, "~> 1.0"},
     {:poison, "~> 2.0"},
     {:factory_girl_elixir, "~> 0.1.1"}]
  end
```

### 2. mix deps.getを実施する

### 3. mix test.watchを実施する

```ex
mix test.watch
```

すると、コンソールに以下のようなメッセージが出てtestが自動で走り出します。

```ex
Running tests...

```

便利！

あとは、ファイル変更のたびにテストが走るようになるので、コンソールをtmux等で別paneにして開きっぱにしておけば良い感じでした。

### 4. test以外のタスクも実行させたい

Mix.Configを利用することで、test以外のタスクも追加できるようです。ここはまだ試していないです。

```ex
use Mix.Config

config :mix_test_watch,
  tasks: [
    "test",
    "dogma",
  ]
```

README.mdでは、[dogma](https://github.com/lpil/dogma)を指定していますが、これは、lintツールで、rubyで言う所の[rubocup](https://github.com/bbatsov/rubocop)みたいですね。

lintツールについては、[credo](https://github.com/rrrene/credo)を別の機会に見てみようと思います＾＾

---

### 参考

* [[Elixir]Lint with dogma](https://kazucocoa.wordpress.com/2016/01/31/elixirlint-with-dogma/)

本日はここまでとなります。
一時的にproxyを有効/無効にしてgit cloneする方法


proxy通してgit clone

```
git clone <repository-url> -c http.proxy="http://xxxxx" -c https.proxy="http://xxxxx"
```

proxy外してgit clone

```
git clone <repository-url> -c http.proxy="" -c https.proxy=""
```

普段proxy通してないけど一時的にproxy環境下でgit cloneしなければいけなくなった時など用
CloudWatch-LogsにLogが出力されない！そんな時にまずやること【cloudpack大阪】

小ネタです。

**CloudWatch-Logsにデータ出てへんやんけ！**


まままっまま、まままだあわわ、あわ、あわてるようなじじじ時間じゃない


## たぶんこれで解決する
LambdaﾎﾟﾁｰしてLogﾁﾗｯすると、出てへんやんけ！(ﾊﾞﾝｯってなるんですが、弊社でも相次いで死者多数な状態です。
でもInvocationCountは増えとるしな？みたいなことがあったときはほぼ間違いなく、CloudWatch-LogsのUIが原因です。

何言ってんだこいつ、って僕自身も思うんですが、

![CloudWatch_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/73113/4c0bb5c7-ecc2-d7cc-5c2a-ef022a2b71d5.png)

ここ押すと出てきたりします。
`|<` か `>|` 押してみると意外と出てきます。
ちょっとわかりづらいUIで、僕も理解しきれてませんが「はやくみたいよ！」って方はこちらをお試しあれ。


## 解決せぇへんねんけど！
どーしてもLogがみたい！どーしても！！って方。
CloudWatch-Logsの「ロググループ」まで戻って、取得したいロググループのチェックボックスにチェックを入れた後に「アクション」をクリックしてください。

![CloudWatch_Management_Console 3.png](https://qiita-image-store.s3.amazonaws.com/0/73113/25d1bcd3-5db3-b15e-df9b-587079148937.png)


こんな画面がでてきて、S3に全データをエクスポートすることができます！やったね！


![CloudWatch_Management_Console 4.png](https://qiita-image-store.s3.amazonaws.com/0/73113/d3d29fb0-b3b8-9113-c89a-05e7c50494a2.png)

余談ですが、S3には圧縮済データがエクスポートされるので、画面でポチポチするよりCLIでゴソッと落としてゴソッとgrepしたほうがはやいです。
Google StreetViewにあるパノラマ画像を取得する

# やったこと
[CAPTURING SPHERICAL SCENES FROM GOOGLE STREETVIEW](http://www.newtonscannon.com/2014/01/26/capturing-spherical-scenes-from-google-streetview/)でやっている作業を、pythonスクリプトで一発生成させるようにした。

# 注意
Google StreetViewのライセンスをしっかりと読んだ上で、本スクリプトを使用してください。

# 環境
python 2.7.10

# スクリプト

```append.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import shutil
import re
import sys

class Panorama:

  def __init__(self, url):
    self.path = "./tmp/"
    self.panoid = self.parseID(url)

    #panorama size = 12*25
    self.x = 12
    self.y = 25

  def parseID(self,url):
    dna = "!1s"
    m = url.find(dna)
    if m != -1:
      return url[m+3:m+25]
    else:
      return ""

  def mkdirTmp(self):
    if os.path.exists(self.path):
      pass
    else:
      os.mkdir(self.path)

  def clean(self):
    shutil.rmtree(self.path)

  def downloadImage(self):
    cmd = 'curl http://cbk0.google.com/cbk?output=tile\&panoid=' + self.panoid + '\&zoom=5\&x=[0-25]\&y=[0-12] -o ' + self.path + '"tile_#1-#2.jpg"'
    os.system(cmd)

  def appendImage(self):

    #横に繋げる
    for x in range(0, self.x+1):
      cmd = "convert +append "
      for y in range(0, self.y+1):
        # 入力ファイル
        inFile = self.path + "tile_%d-%d.jpg"% (y,x)
        # コマンド文字列に連結
        cmd += inFile + " "

      # 出力ファイル名を設定
      cmd += self.path + "%d.jpg"%x
      #print cmd

      # 実行
      os.system(cmd)

    # 縦に繋げる
    cmd = "convert -append "
    for x in range(0,self.x):
      cmd += self.path + "%d.jpg"%x + " "

    cmd += "append.jpg"
    #print cmd

    os.system(cmd)


if __name__ == "__main__":
  url = "https://www.google.co.jp/maps/@34.7020532,135.5020237,3a,75y,285h,99t/data=!3m7!1e1!3m5!1sBLX3E8R5JxUJnuHlPGg5kw!2e0!6s%2F%2Fgeo3.ggpht.com%2Fcbk%3Fpanoid%3DBLX3E8R5JxUJnuHlPGg5kw%26output%3Dthumbnail%26cb_client%3Dmaps_sv.tactile.gps%26thumb%3D2%26w%3D203%26h%3D100%26yaw%3D285.21%26pitch%3D9.21!7i13312!8i6656?hl=ja&hl=ja"

  pano = Panorama(url)
  if  len(pano.panoid) > 0:
    pano.mkdirTmp()
    pano.downloadImage()
    pano.appendImage()
    pano.clean()
```
slideToggleを使ったナビゲーション

#仕様
よくあるslideToggle(今回はslideUpとslideDown)を利用したナビゲーション。
triggerにhoverした場合にtargetを表示、hoverが外れると非表示。
アニメーション中にイベントが複数回起こった場合は途中で処理を止めて、キューの回数分アニメーションが実行されないようにする。

##HTML
イベントのトリガーとなるDOMの子要素にslideToggleさせたいDOMを配置。それぞれデータ属性を付ける。
CSSは適当につければおk。

```html:HTML
<ul>
	<li data-trigger-nav="nav">
		<span>kuma</span>
		<ul data-target-nav="nav">
			<li>kuma</li>
			<li>tama</li>
			<li>kiso</li>
		</ul>
	</li>
		<li>
		<span>akashi</span>
	</li>
	<li data-trigger-nav="nav">
		<span>kongo</span>
		<ul data-target-nav="nav">
			<li>kongo</li>
			<li>hiei</li>
			<li>haruna</li>
			<li>kirishima</li>
		</ul>
	</li>
	<li data-trigger-nav="nav">
		<span>akagi</span>
		<ul data-target-nav="nav">
			<li>akagi</li>
			<li>kaga</li>
		</ul>
	</li>
	<li>
		<span>oyodo</span>
	</li>
</ul>
```
##JS
mouseoverとmouseleaveに分けてイベントを設定。
.stop()でアニメーションの複数回実行を止める。
引数でslideUpとslideDownの速さを設定するように変数定義。

```javascript:javascript
var Toggle = function(speed){
	var $trigger = $('[data-trigger-nav]');
	var $target = $('[data-target-nav]');
	$trigger.on('mouseover',function(){
		if(!$(this).hasClass('is_Open')) {
			$(this).addClass('is_Open');
			$(this).find($target).stop(true).slideDown(speed);
		}
	});
	$trigger.on('mouseleave',function(){
		if($(this).hasClass('is_Open')) {
			$(this).removeClass('is_Open');
			$(this).find($target).stop(true).slideUp(speed);
		}
	});
};

$(function(){
    Toggle(300);
});
```
##まとめ
泥臭いやり方のような気もしますが、わざわざプラグイン入れるよりはマシなような、そうでもないような。
CakePHP3で単数形、複数形を間違えないようにする方法

# CakePHP3で単数形、複数形を間違えないようにする方法

### CakePHPで開発でよくある流れ

   1. テーブル作ってー
   2. bakeしてー
   3. いざコーディング！

が大まかな流れかと思いますが、1をCakePHPのルールに適さない名前で作ってしまった場合、Bakeが本人の想定していない名前で出力されてしまい恥かしく（？）なることがあります。(/ω＼)

```
例）person（単数形）→ people（複数形）
```

※ググったら`persons`もあるのだが、あるから大丈夫だろうと思って進めるとBakeで失敗する。

こうなると、生成されたコードを削除したりDBのスキーマだったりと修正作業が発生してとてつもなく萎える。


### というわけで、単数/複数形を調べる確実な方法をご紹介

CakePHP3の場合ですが適当なコントローラーを用意して

```
use Cake\Utility\Inflector;
```

```
単数形 → 複数形
Inflector::pluralize('user') → users
```

```
複数形 → 単数形
Inflector::singularize('users') → user
```

ってやれば変換してくれます。

因みに、`Cake\Utility\Inflector`には他にも便利なメソッドが用意されているので見ておくといいです。


### 補足

CakePHP 規約ワードメーカー

http://www.cpa-lab.com/tech2/inflects/

便利だネ！
git clone時にcheckoutしないようにする

#git cloneのno-checkoutオプション
`man git-clone`

```
       --no-checkout, -n
           No checkout of HEAD is performed after the clone is complete.
```

-nオプションを使うとclone後にcheckoutしなくなります。
例えば、こんなふうに。

```
Yamauchi:test yamauchi$ git clone -n https://github.com/torvalds/linux.git
Cloning into 'linux'...
remote: Counting objects: 4579986, done.
remote: Compressing objects: 100% (507/507), done.
remote: Total 4579986 (delta 473), reused 189 (delta 189), pack-reused 4579289
Receiving objects: 100% (4579986/4579986), 1.40 GiB | 2.01 MiB/s, done.
Resolving deltas: 100% (3776917/3776917), done.
Checking connectivity... done.
Yamauchi:test yamauchi$ ls -la
total 0
drwxr-xr-x  3 yamauchi  staff  102  2 25 09:28 .
drwxr-xr-x  7 yamauchi  staff  238  2 25 09:27 ..
drwxr-xr-x  3 yamauchi  staff  102  2 25 09:28 linux
Yamauchi:test yamauchi$ cd linux/
Yamauchi:linux yamauchi$ ls -la
total 0
drwxr-xr-x   3 yamauchi  staff  102  2 25 09:28 .
drwxr-xr-x   3 yamauchi  staff  102  2 25 09:28 ..
drwxr-xr-x  12 yamauchi  staff  408  2 25 09:48 .git
```

clone後、branchやtagを切り替えることが明確に分かる場合は、ちょっとだけ時間短縮に・・・。
Linuxプロセスに、偽のシステム時間を使わせる

## 問題
（テストのために）Linuxプロセスに偽のシステム時間を使わせたい。

## 解決
[libfaketime](https://github.com/wolfcw/libfaketime)を使って、時間関係のシステムコールをハイジャックする。

#### ビルド
    $ git clone https://github.com/wolfcw/libfaketime && cd libfaketime && make

    $ find "$PWD" -name libfaketime.so.1
    /XXX/YYY/libfaketime/src/libfaketime.so.1                        # ライブラリファイルの絶対パス

#### 使用

※ここで例として`rails s`を実行する

    $ LD_PRELOAD=/XXX/YYY/libfaketime/src/libfaketime.so.1 FAKETIME="+0d" rails s
                                                           ^ # オフセット=0 (現在)
    ....
    [2016-02-24 07:01:41] INFO  WEBrick 1.3.1
    (Ctrl-C)

    $ LD_PRELOAD=/XXX/YYY/libfaketime/src/libfaketime.so.1 FAKETIME="+30d" rails s
                                                           ^ # オフセット=30日後
    ...
    [2016-03-25 07:02:08] INFO  WEBrick 1.3.1

#### オフセット以外の方法で偽時間を指定する
オフセット(`+30d`)以外も指定方法があります、詳細は[ホームページ](https://github.com/wolfcw/libfaketime)に。
Java SE7 Gold 取得を目指して (3)

Java SE7 Gold をとりたい…!
===

本日は第3回目です。

## 今日のこぼれ話
そういえばなぜこの時期にGold勉強を始めたのかといいますと、今リテイク無料キャンペーン中なのです! (2016/1/22～2016/5/31)
http://www.oracle.com/jp/education/campaign-1898205-ja.html#20160122
つまり、5月31日までに対象の試験を受けて、**万が一**落ちてしまっても、同一の試験をもう一度無料で受けられるのです。(再受験は2016/7/31まで)
僕はOracleの回し者ではないですが(なれるものならなってみたいですが)、もし試験を受けてみたいと考えている方がいらっしゃいましたらいい機会なのではと思います。

## 本日知ったこと(3章)

* ネストクラス

  * 非staticなネストクラスをインナークラスと呼ぶ
  * ネストクラスはアウタークラスのメンバの一部(特にアクセス修飾子を考えるときにこれを念頭におくと良さそう)
  * なのでこんなアクセスも可能

    ```java
    class Outer
    {
      private int num1 = 10;

      class Inner {
        private int num2 = num1 + 1;
      }
 
      public static void main (String[] args) throws java.lang.Exception
      {
        System.out.print(new Outer().new Inner().num2);
      }
    }
    ```

  * staticなインナークラスをstaticクラスとか呼ぶらしいが、C#とは違うので new して使う。
   `Outer.StaticInner obj = new Outer().StaticInner()`
  * this キーワードでの参照は内外クラスのスコープ通りで直感的。ネストクラスから外側クラスのthisに触りたい場合は `Outer.this.val`

* ローカルクラス・匿名クラス

  * メソッド内で定義されたクラス
  * 外側クラスのメンバへのアクセスはJava8でLambda使うときと同じ
  *  

    | ルール |ローカルクラス | 匿名クラス |
    | :--- | :---: | :--: |
    | abstract, final 修飾子 | ○ | × |
    | コンストラクタ | ○ | × |

  * 匿名クラスのインスタンス化は、`Anony obj = new Annoy() { ... };` 最後のセミコロン必須。
  * インスタンス化後すぐメソッド使うなら `new Anony() { ... }.method();`

あまり見かけない構文を、なんでわざわざ章立てたんだろうと思いましたが(ページ数も少なめ)、Java8でのLambdaと結びついてくるからですかね。それとも見かけないのは僕の周りだけなんですかね。
EP 10 Prefer `enumerate` Over `range`

> - enumerate provides concise syntax for looping over an iterator and getting the index of each item from the iterator as you go.
- Prefer enumerate instead of looping over a range and indexing into a sequence.
- You can supply a second parameter to enumerate to specify the numger from which begin conunting (zero is the default)

Not Pythonic

```python
>>> for i in range(len(a)):
...     print(i, a[i])
...
0 foo
1 bar
2 baz
```

You can do this way. This is not pythonic, either.

```python
>>> for idx, val  in zip(range(len(a)), a):
...    print(idx, val)
...
0 foo
1 bar
2 baz
```

Pyhthonic way!

```python
>>> for idx, val in enumerate(a):
...     print(idx, val)
...
0 foo
1 bar
2 baz
```
ASP.NETのルートフォルダの物理パスの取得について。Request.PhysicalApplicationPathはApplication_Start内で使用できないのでMapPathを使う

ASP.NETのルートの物理パスを取得するには

```csharp
private void MyMethod1()
{
    String rootPath = context.Request.PhysicalApplicationPath;
}
```
しかしアプリケーションの開始時に取得しようとするとエラーになります。（※IIS7 Integrated modeの場合）
これはApplication_Startの時点ではRequestオブジェクトがまだセットアップされていないのが理由です。

```csharp
void Application_Start(object sender, EventArgs e)
{
    HttpContext context = HttpContext.Current;
    String appPath = context.Request.ApplicationPath;//RequestプロパティがNullで例外発生
}
```
アプリケーションの初期化時にルートフォルダのパスがほしい場合などには困ります。
例）GoogleBigQueryを使用する場合は認証用のMyCert.p12ファイルが必要。アプリケーションの開始時に読み込んでおきたい。

ということでそういう場合はHttpContext.Current.Server.MapPath("~/")を使用しましょう。これでルートフォルダの物理パスが取得できます。

```csharp
void Application_Start(object sender, EventArgs e)
{
    var certificateFilePath = Path.Combine(HttpContext.Current.Server.MapPath("~/"), "MyCert1.p12");
}
```

以上Tipsでした。
EP 9 Consider Generator Expressions for Large Comprehensions


> - LIst comprehensions can cause problems for large inputs by using too much memory.
- Generator expressions avoid memory issues by producing outputs one at a time as an iterator.
- Generator expressions can be composed by passing the iterator from one generator expression into the for subexpression of another.
- Generator expressions execute very quickly when chained together.

> Effective python



# Generator is lazy evaluation and comprehension is eager evaluation.

```python
>>> comprehension = [x ** x for x in range(10)]
>>> comprehension
[1, 1, 4, 27, 256, 3125, 46656, 823543, 16777216, 387420489]
```

```python
>>> generator = (x ** x for x in range(10))
>>> generator
<generator object <genexpr> at 0x10afeea98>
>>> next(generator)
1
>>> next(generator)
1
>>> next(generator)
4
>>> next(generator)
27
>>> next(generator)
256
>>> next(generator)
3125
>>> next(generator)
46656
>>> next(generator)
823543
>>> next(generator)
16777216
>>> next(generator)
387420489
>>> next(generator)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

```

## yakshaving
### Different type of evaluation strategy
- Eager evaluation or greedy evaluation
 - eager evaluation, an expression is evaluated as soon as it is bound to a variable.  
- Lazy evaluation
 -  delays the evaluation of an expression until its value is needed (non-strict evaluation) and which also avoids repeated evaluations (sharing). 
- Partial evaluation
- Remote evaluation
 -  a general term for any technology that involves the transmission of executable software code from a client computer to a server computer for subsequent execution at the server.
 -  e.g. RPC
- Short-circuit evaluation
 - the semantics of some Boolean operators in some programming languages in which the second argument is executed or evaluated only if the first argument does not suffice to determine the value of the expression
##### Benefit of lazy evaluation

- Performance increases by avoiding needless calculations, and error conditions in evaluating compound expressions
- The ability to construct potentially infinite data structures
- The ability to define control flow (structures) as abstractions instead of primitives



# Generator can make a chian of iterator but be careful when you execute it more than once


```python
>>> it = (x * x for x in range(10))
>>> roots = ((x, x ** 0.5) for x in it)
>>> next(it)
0
>>> next(it)
1
>>> next(it)
4
>>> next(it)
9
>>> next(roots)
(16, 4.0)
>>> next(roots)
(25, 5.0)
>>> next(roots)
(36, 6.0)
>>> next(roots)
(49, 7.0)
>>> next(it)
64
>>> next(roots)
(81, 9.0)
```


Copy iter: `itertools.tee`
EP 8 Avoid More Than Two Expression in List Comprehensions


> - List comprehensions support multiple levels of loops and multiple conditions per loop level
- List comprehensions with more than two expressions are very difficlut to read.

> Effective Python


``` python
>>> matrix = [[1,2,3], [4,5,6], [7,8, 9]]
>>> flat = [ x for row in matrix for x in row]
>>> flat
[1, 2, 3, 4, 5, 6, 7, 8, 9]
```

multiple condition

```python
>>> filtered = [[x for x in row if x % 3 == 0] for row in matrix if sum(row) >= 10]
>>> filtered
[[6], [9]]
```
EP 7 Use List Comprehensions Instead of map and filter

> - List comprehensions are clearer than the map and filter built-in functions because they don't require extra lambda expressions.
- List comprehensions allow you to easliy skip items from the input list a behavior map doesn't support without help from filter
- Dictionaries and sets also support comprehension expressions.

> Effective Python

```python
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> squres = [x ** 2 for x in a]
>>> squres
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

>>> squres_map = map(lambda x: x ** 2, a)
>>> list(squres_map)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
```

map requies creating a lambda function for the computation, which is visually noisy.



```python
>>> even_squares = [x ** 2 for x in a if x % 2 == 0]
>>> even_squares
[4, 16, 36, 64, 100]


>>> even_squares_fp = map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, a))
>>> list(even_squares_fp)
[4, 16, 36, 64, 100]
```

Dicts and sets comprehensions

```python
>>> chile_ranks = dict(ghost=1, habanero=2, cayenne=3)
>>> rank_dict = {rank:name for name, rank in chile_ranks.items()}
>>> rank_dict
{1: 'ghost', 2: 'habanero', 3: 'cayenne'}
>>> chile_len_set = {len(name) for name in rank_dict.values()}
>>> chile_len_set
{8, 5, 7}
```
[golang]newしてほしくない構造体について

golangで構造体を定義するときに外部から`new`してほしくないときがあると思います。

```go:hoge.go
package hoge

type Fuga struct {
	name string
}

func (f *Fuga) Name() string {
	return f.name
}

type Hoge struct {
	fuga *Fuga
}

func (h *Hoge) Name() string {
	return h.fuga.Name()
}

func NewHoge() *Hoge {
	return &Hoge{&Fuga{}}
}
```

上記のようなコードにおいて`Hoge`を`new`されると`Name()`を呼び出すときに`panic`になってしまいます。

```go:main.go
func main() {
	h := new(hoge.Hoge)
	log.Println(h.Name()) // panic: runtime error: invalid memory address or nil pointer dereference
}
```
## 解1
golangではエクスポートしていない構造体でも関数の戻り値として使用することができます。
構造対自体をエクスポートせず、コンストラクタの戻り値とすることで`new`できない構造体を作ることができます。

```hoge.go
package hoge

type fuga struct {
	name string
}

func (f *fuga) Name() string {
	return f.name
}

type hoge struct {
	fuga *fuga
}

func (h *hoge) Name() string {
	return h.fuga.Name()
}

func NewHoge() *hoge {
	return &hoge{&fuga{}}
}
```

```go:main.go
func main() {
	// h := new(hoge.hoge) // コンパイルエラー
	h := hoge.NewHoge()
	log.Println(f.Name())
}
```

ただしこの方法では不都合なことがあります。それは`slice`や`chan`が外部から作成できないことです。
構造体自体がエクスポートされていないため`make`の引数として渡すことができないからです。

```go:main.go
func main() {
	s := make([]hoge.hoge, 0) // コンパイルエラー
}
```

## 解2
構造体を直接エクスポートせずにインターフェースをエクスポートすることで解1の問題を解決できます。

```hoge.go
package hoge

type Namer interface {
	Name() string
}

type fuga struct {
	name string
}

func (f *fuga) Name() string {
	return f.name
}

type hoge struct {
	fuga *fuga
}

func (h *hoge) Name() string {
	return h.fuga.Name()
}

func NewHoge() Namer {
	return &hoge{&fuga{}}
}
```

```main.go
func main() {
	s := make([]hoge.Namer, 0)
	for i := 0; i <= 10; i++ {
		s = append(s, hoge.NewHoge())
	}

	for _, h := range s {
		log.Println(h.Name())
	}
}
```

この方法ではインターフェースを戻り値として使用しているため、メンバ変数に直接アクセスすることができません。

## 結論
解1,2を書きましたがどちらにもある程度のデメリットがあります。
どちらを採用していもいいのですが、そもそも`new`を許容するという選択もあります。
コンストラクタとなる関数名をわかりやすいものにしておけば直接`new`を呼び出して`panic`になるというケースもほとんどないでしょう。
golangのデフォルトパッケージの実装にもそうなっているものがあります。(`File`など)
[実践Go言語 - データ](http://golang.jp/effective_go#data)
AD2 > Link > Analog Discovery 2 > reference manual

Analog Discovery 2 の reference manual [wiki]
https://reference.digilentinc.com/analog_discovery_2:refmanual

昨日(2016/02/24)に上記サイトにアクセスしたらつながらなかった。
サイトが落ちていたのか。違うPCの環境だからなのか不明。
AD2 > Link > WaveForms 2015 > reference manual 

WaveForms 2015のWiki
https://reference.digilentinc.com/waveforms3:refmanual

昨日(2016/02/24)に上記サイトにアクセスしたらつながらなかった。
サイトが落ちていたのか。違うPCの環境だからなのか不明。
配列の途中に配列を挿入する

配列の途中に別の配列値を挿入するメソッド。
以外にありそうでなかったので書いておく。
（実はある！とかもっといい書き方、面白い書き方あったらコメントください。）

```js
"use strict";

// destArrayのindexの位置にsrcArrayの内容を挿入
function insertArray(destArray,index,srcArray)
{
       srcArray.forEach((d,i)=>{
         destArray.splice(index + i,0,d);
       });
}

let dest = [0,3,4,5];
let src = [1,2];

insertArray(dest,1,src);
console.log(dest);
// [ 0, 1, 2, 3, 4, 5 ]

```
技術英語 > For me, the models are [stepping stones] to the finale. / establish a bridgehead

@ AXIS Feb. 2016 > Cover interview: Frank Gehry

> For me, the models are stepping stones to the finale.

http://eow.alc.co.jp/search?q=stepping+stone
> ～への足掛かり

<hr>
関連して思い出したのは

> 橋頭堡（きょうとうほ）を築く
http://dictionary.goo.ne.jp/jn/56868/meaning/m0u/

> establish a bridgehead
http://ejje.weblio.jp/content/%E6%A9%8B%E9%A0%AD%E5%A0%A1%E3%82%92%E7%AF%89%E3%81%8F
concrete5にPSR-4 autoloader形式でコード追加した時に、追加したclassが見つかりませんエラーで毎度ハマるのでメモ


# Fatal error: Class 'Application\Controllers\xxx' not found
オートローダーがロードしてくんねーよー！！

これ、ちょいちょいハマります。

## 複数形と単数系のワナ
concrete5の5.7系では、コントローラのディレクトリはこうなってます。

```
application
-controllers
--controller.php
```

で、ネームスペースは

```
Application\Controller\Controller
```
なんですね。
ポイントというか罠は**ココ**。
/controllers に対して\Controller
ディレクトリ名は複数形に対して、namespaceは単数系。
英語じゃコレが普通なんですかね？

ディレクトリ名が複数形だから〜って複数形でnamespace書くとnot foundになりケアレスミス探しのあり地獄に落ちます。
コードを一晩寝かせるパターンですね。

cakePHPがテーブル名が複数系になってるかどうかのチェックしてた悪夢を思い出しますわ。