OmniAICreator/Qiita-1.07M huggingface dataset:
Java初心者がメソッドの基礎的な部分を整理してみた

Java初心者がメソッドの基礎的な部分と、
カプセル化の特徴をあげてみました。

# メソッド

構文

```
アクセス修飾子 戻り値型 メソッド名(引数の型 引数名){
    //メソッド内の処理
}
```

## 戻り値についてメモ

* メソッド宣言で戻り値宣言は必ずする。戻り値をなにも戻さない場合には、戻り値型に void を指定する

* 戻り値型がvoidであるメソッドは、値を戻せない
* 戻り値型と、実際に戻す値の方は同じでなければいけない

* 戻り値型がvoidであるメソッドに対して、
戻り値を受け取る変数を宣言して、受け取ることはできない。
(コンパイルエラー)

* 何らかの戻り値を戻すメソッドを宣言しても、その戻り値を受け取る必要はない。戻り値を戻して、変数に代入しなければ破棄される。

* メソッドの戻り値の型と、戻り値を受け取るための変数の型は、同じか互換性のある型ではないといけない。

* 呼び出し元のメソッドの引数は、メソッドで宣言されている種類、
数を一致させなければいけない。不一致の場合はコンパイルエラー

* なにも受け取らないメソッドの宣言はカッコの中になにも記入しない
* 可変長引数を含む複数の引数を受け取るメソッドのとき、可変長引数は最後の引数としてのみ利用可能。
* 可変長引数は、「...」は、型の後ろにつけること(コンパイルエラになるよ)
* return文の後ろの処理は実行できないよ(処理を書くとコンパイルエラー)

## static領域について

* クラスファイルをロード後、staticなものと、そうでないもので分離される。それぞれ異なるメモリ空間に配置される。
staticで修飾されたメソッド、フィールドはstatic領域に配置され、
それ以外はヒープ領域に配置される。
インスタンス生成のときは、ヒープ領域にあるクラス定義にしたがって、インスタンスが生成される。

* ↑ staticなフィールドはインスタンスを作らなくても使えるという性質を持っとる。
* staticなフィールドにアクセスする際は以下
```
クラス名.フィールド名
```
インスタンス生成後であれば、
```
変数名.フィールド名
```

* static なメソッドはstaticで修飾されたものしかアクセスできない。

## オーバーロード

* 引数の数、型、順番が異なる同名のメソッドを定義すること(シグニチャが異なる)
* 戻り値型が異なるだけでは、オーバーロードとみなされない。同じメソッドが重複して存在するとして、コンパイルエラーとなる
* アクセス修飾子は含まれないので、アクセス修飾子が異なるだけではオーバーロードではない。

## コンストラクタ
* 生成されたインスタンスが他のインスタンスから使われる前に、事前準備を整える「前処理」をするためのメソッドの一種。
普通のメソッドと同じようにオーバーロードして複数定義も可能

3つのルール

1. メソッド名をクラス名と同じにすること
2. 戻り値型は記述できない。
3. new と一緒にしか使えない(インスタンス生成時しか呼び出せない)

* コンストラクタ定義の際、アクセス修飾子に制限はなく、
public,protected,デフォルト,private 4つすべて利用可能。

* 戻り値を定義できない。定義するとメソッドと認識される。ただ、クラス名と同名だとしてもコンパイルエラーにはならない。
* コンストラクタもメソッドの一種で、オーバーロードで複数定義も可能、このときすべてのコンストラクタで、一部だけ共通の処理をしたいしたいときは初期化ブロックが便利。初期化ブロックはコンストラクタよりも先に実行される
記述例
```
public class Sample {
    {
        //初期化ブロックで行う共通の前処理
    }
}
```
* コンストラクタ定義を省略した場合、引数なしのコンストラクタをコンパイラがコンパイル時に追加する。自動的に追加されるものをデフォルトコンストラクタと呼ぶ。
* コンストラクタないから、オーバーロードされた他のコンストラクタを呼び出すには、thisを使う。呼び出す前に何らかの処理を記述してはいけない。

# カプセル化の話

* カプセル化はフィールドを非公開(private)にして、アクセスするためのメソッドを提供(public)にすることで完成する
*  プリミティブ型の値をメソッドに渡す時、その値は値はコピーされた渡される。呼び出したメソッドないで値が更新されても、呼び出し元は変わらない。
*  オブジェクト型の引数では、呼び出し元から呼び出し先へ 参照値が    コピーされて渡る。そのため2つのメソッドから参照するインスタンスは同じ。
Processing / ControlP5 > uartSender (v0.5) > 送信項目ON/OFFのcheckbox追加

```txt:動作環境
Processing 3.1.1 on Windows 8.1 pro(64bit)
Library: ControlP5 v2.2.6
Library: Serial
```

http://qiita.com/7of9/items/7d380155460cd2121855
の続き。

## code

[v0.5 @ github](https://github.com/yasokada/processing_160716_uartSender/releases/tag/v0.5)

以下の実装をした

- 送信項目をON/OFFできるようCheckboxを追加した。


## 実行例

1つ目だけONにした状態。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b379452e-bed6-9d33-deb0-7109f09ef52f.png)

1つの項目だけの場合はArduino IDEのSerialPlotterにて描画できる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/bdb00f5d-4038-f678-5a80-22a0b4b37285.png)

## TODO

- uartSenderを使いつつ、N項目対応SerialPlotterを作る
- N項目対応SerrialPlotterを使いつつ、距離計のデバッグをする
- 距離計をベースに、傾斜計と組合せてハンディ3Dスキャナを作る
- 2頭のライオンをスキャンする

まだ1年くらいかかるかもしれない。
Spring関連の記事まとめ(随時更新)

自分が今まで投稿したSpring関連の記事のまとめページ。
投稿した記事を見つけづらくなってきたのでこのページでまとめる。
随時追加予定。

# Spring

[Springで例外ハンドリング](http://qiita.com/NagaokaKenichi/items/2f199134a881a776b717)

[SpringでAOP](http://qiita.com/NagaokaKenichi/items/386af61b6866d60964e8)

[Springでトランザクション管理](http://qiita.com/NagaokaKenichi/items/a279857cc2d22a35d0dd)

[Spring Security 4を使ったらハマった](http://qiita.com/NagaokaKenichi/items/292729e9c75a01554ff4)

[Springで複数のsubmitボタン対応](http://qiita.com/NagaokaKenichi/items/3a4486cb6f32a3c9d69f)

[Springで画面の入力値を受け取る](http://qiita.com/NagaokaKenichi/items/ea61420b01d37189d997)

[SpringのDIはSingleton(シングルトン)](http://qiita.com/NagaokaKenichi/items/34bc62e572256c5710e1)

# Spring Boot

[Spring Bootでjavaクラスやテンプレートエンジンのホットデプロイ(オートリロード)](http://qiita.com/NagaokaKenichi/items/9b19665f131f1a8017be)

[Spring BootでJettyを使う&Jettyの設定を変更してみる](http://qiita.com/NagaokaKenichi/items/9299211fb6cb5e42d855)

[Spring BootでFilterを実装する - その1](http://qiita.com/NagaokaKenichi/items/630ce51bbe2b15589dd2)

[Spring BootでNo qualifying bean of typeが出た時の原因と対応](http://qiita.com/NagaokaKenichi/items/058a7243bd2948de7553)

[Spring Boot + Doma2で2WaySQLを使うまで](http://qiita.com/NagaokaKenichi/items/4c680ec9b31725687e04)

[Spring BootでWARを作成して別のTomcatにデプロイする](http://qiita.com/NagaokaKenichi/items/3f191aeb6f161101d5f6)

[Spring BootのTomcatのバージョンを調べてみる](http://qiita.com/NagaokaKenichi/items/0229ad4777876bc3011c)

[Spring Bootのログ出力(How-toガイド)](http://qiita.com/NagaokaKenichi/items/34356c72e8ac0279e1a0)

[Spring Bootのログ出力(概要)](http://qiita.com/NagaokaKenichi/items/7cf2f427d88dfd4f56a8)

[Spring BootのSpring SecurityでBasic認証のID・パスワードを変更する](http://qiita.com/NagaokaKenichi/items/02028ea75eb3d8bf5d2c)

[Spring BootでWARに含めるapplication.propertiesを環境ごとにビルド時に切り替える](http://qiita.com/NagaokaKenichi/items/b6c42547abbf3c0aecf5)

[Spring Bootでバリデーションエラー時のメッセージリソースをValidationMessages.propertiesからmessages.propertiesにする](http://qiita.com/NagaokaKenichi/items/65d0e07151292968d67f)

[Spring Bootでapplication.properties(yml)に独自の設定値を定義する](http://qiita.com/NagaokaKenichi/items/4579849157cbe793c3d0)

[Spring Bootの組み込みTomcatのSession Persistenceを有効にする](http://qiita.com/NagaokaKenichi/items/e35547fde089e0a53599)

[Spring Boot + Spring Securityでパスワードをハッシュ化(ソルト付、ストレッチングあり)](http://qiita.com/NagaokaKenichi/items/2742749a93df15b55d24)

[Spring Boot起動時に環境毎にapplication.propertiesを切り替える色々](http://qiita.com/NagaokaKenichi/items/fd9b5e698776fe9b9cc4)

[Spring Boot + SpringFoxでSwaggerを利用してソースからAPIキュメントを生成する](https://qiita.com/NagaokaKenichi/items/b6d4d55a202e6a93d047)

[Spring Boot + Swaggerで生成したドキュメントのリクエストパラメータDescriptionを指定する](https://qiita.com/NagaokaKenichi/items/b84f2e4333dcf4201262)

[Thymeleafチートシート](http://qiita.com/NagaokaKenichi/items/c6d1b76090ef5ef39482)

[STS（Eclipse） + Thymeleafでコンテンツアシスタントを有効にする](https://qiita.com/NagaokaKenichi/items/c848ee8760a994ec3308)

[Spring Boot + SpockでRestControllerのテストをサクッと書く]
(https://qiita.com/NagaokaKenichi/items/7236a68e0cdb77a97479)

[Spring Boot + Mybatisのmapper-locations]
(https://qiita.com/NagaokaKenichi/items/380c1316383b2020a1e7)

[Spring Boot DefaultErrorViewResolverを拡張してエラー画面を動的カスタマイズする]
(https://qiita.com/NagaokaKenichi/items/99a7bd3f95df7a36802e)
processing / ControlP5 > checkboxのサンプル > 使用関数が古い name() > getName()

```txt:動作環境
Processing 3.3.1 on Windows 8.1 pro(64bit)
ControlP5 v2.2.6
```

以下にあるCheckBoxのサンプルコード。
http://www.sojamo.de/libraries/controlP5/examples/controllers/ControlP5checkBox/ControlP5checkBox.pde

そのまま実行しようとすると

```
        println("toggle "+checkbox.getItem(i).name());
```
の部分で以下のエラーが出る。

```
The function "name()" does not exist.
```

name()という関数はgetName()に切り替わっているが、サンプルコードは古いままのようだ。以下で動いた。

```
        println("toggle "+checkbox.getItem(i).getName());
```
技術英語 > abstraction won't be far behind / few and far between

@ Code Complete (No. 5198 / 36077)

> once encapsulation starts to break down, abstraction <font color=red>won't be far behind</font>.

http://eow.alc.co.jp/search?q=far+behind
> かなり遅れて、～に数段水をあけられて

won't be far behindなので
意訳 「一旦encapsulationが壊れだすと、abstractionもすぐに壊れだす」

<hr>
far関連で思い出したもの

> http://ejje.weblio.jp/content/few+and+far+between
> few and far between
> ごくまれで、ごく少ない

何故この語彙の組合せで「ごくまれで」という意味になるか不明だが、その分、記憶に残りやすい。
あなたのWebサービスでLDAPユーザ認証を実現するgo-ldapc

[go-ldapc](https://github.com/sonatard/go-ldapc) はLDAPによるユーザ認証を実現するモジュールです。
===============================



[![GoDoc](https://godoc.org/github.com/sonatard/go-ldapc?status.svg)](https://godoc.org/github.com/sonatard/go-ldapc)

`go-ldapc` ただ1つのAPIを提供しています。

## 実装例

LDAPによるユーザログインをかんたんに実装することができます。

- Code:

```go
import (
    "github.com/sonatard/ldapc"
)

func main() {
	ldapclient := &ldapc.Client{
		Protocol:  ldapc.LDAP,
		Host:      "localhost",
		Port:      389,
		TLSConfig: nil,
		Bind: &ldapc.AuthBind{
			BindDN:       "uid=user1,ou=People,dc=test,dc=com",
			BindPassword: "admin",
			BaseDN:       "dc=test,dc=com",
			Filter:       "(&(objectClass=posixAccount)(uid=%s))",
		},
	}

	username := "user2"
	password := "user2"

	entry, err := ldapclient.Authenticate(username, password)
	if err != nil {
		fmt.Printf("LDAP Authenticate failed: %v\n", err)
	}

	// Print all entry
	fmt.Printf("%+v\n", entry)

	// username and mail
	fmt.Printf("username: %v\n", entry.GetAttributeValue("uid"))
	fmt.Printf("mail: %v\n", entry.GetAttributeValue("mail"))
}
```

- Output:

```text
username: user2
mail: user2@test.com
```

匿名Bind、DirectBind、サーバがActiveDirectoryの場合などのその他の実装例はこちら [ldapc_test.go](https://github.com/sonatard/go-ldapc/blob/master/ldapc_test.go).


## デモ

- OpenLDAP Serverを立てる
 -  [docker-ldapc](https://github.com/sonatard/docker-ldapc)

- クライアント環境を実行

```shell
$ go get -v github.com/sonatard/go-ldapc
$ cd ${GOPATH}/src/github.com/sonatard/go-ldapc/example
$ go run main.go
username: user2
mail: user2@test.com
```

## 作った経緯
LDAPはディレクトリ検索サービスでありユーザ認証プロトコルではありません。そのためLDAPの`Bind`,`Search`などのオペレーションを組み合わせてユーザ認証を実装する必要があります。

Go言語向けのLDAPライブラリの[go-ldap](https://github.com/go-ldap/ldap)も`Bind`や`Search`を実行するAPIであり、WebサービスにLDAPユーザ認証を提供しようと思うと、かんたんに利用できるものではありませんでした。

そこでLDAPの勉強を兼ねて誰でも容易にLDAPユーザ認証を実現できるGo言語のモジュールを作りました。

また私は、社内では自由にPublicなWebサービスを使える環境ではないので、類似のOSS Webサービスを使うことが多いのですが、この時にLDAP認証がないとユーザ管理が辛いので、是非皆さんGo言語でWebサービスをOSSで作る際にはLDAP認証の提供をよろしくお願いします! :smiley: 

## 参考
- gogs/gogs - /gogs/modules/auth/ldapの実装を参考にしました。 gogs開発者の皆さんありがとうございます。
Gulpを用いてサクッとS3に静的Webサイトをデプロイする

S3管理サイトで更新頻度の高いサイトが出てきた(といっても自分のサイト)ので、Gulp経由でS3に諸々をデプロイすることに。
そこまで時間はかからないだろうと思いやってみると、すぐに終わったのでなんか大仰な記事ばかりだったので、これだけしたい人のための記事としてまとめました。

# 前提条件

* AWSのアカウントを持っていること
* S3バケットがあること
* IAMの設定が完了していること
* Node.jsの環境が入ってること

### 動作確認環境
* Node.js 6.2.1
* gulp 3.9.1

### やること
Gulpに設定を諸々書いてアップロードするまで

### やらないこと
アップロードされているファイルを色々触ること

# 手順

### インストール

まずはGulpが入っていない場合は導入。

```bash:terminal
$ npm i -D gulp
```

その後、プロジェクトに`gulp-s3-upload`を導入。

```bash:terminal
$ npm i -D gulp-s3-upload
```

### Gulpfileの記述

gulpfileは以下のように記述する。
requireした`gulp-s3-upload`をIAMキー,対象バケット, ACL設定を記述した上で走らせてやると、後は自動でアップロードしてくれる。

```js:gulpfile.js

var s3 = require("gulp-s3-upload")(require("./iam.json"));
var 

gulp.task("deploy2s3", function(){
	return gulp.src([]) // デプロイ時にアップロードしたいファイル群
		.pipe(s3({
			Bucket: "バケット名",
			ACL: "public-read"
		}))
});
```

```json:iam.json
{
	"accessKeyId"    : "********",
	"secretAccessKey": "********"
}
```

### 実行

設定ファイルが記述できたら `gulp deploy2s3`もしくて適当に`npm run deploy`でもして実行。  
実行すると以下のような出力となる。

```bash:terminal
$ gulp deploy2s3

[04:49:52] Uploading .....  index.html
[04:49:52] No Change .....  images/favicon.png
[04:49:52] No Change .....  js/bundle.js
[04:49:52] No Change .....  css/style.css
[04:49:52] Updated .......  index.html
```

### ポイントと課題

#### IAM関連が書かれたファイルは外に出るとまずいため外部ファイルにした

今回は個人サイトのユースケースだったため、別にIAMのキーが共有できなくても困らないので`.gitignore`にignore対象として追記することにした。

チームでやる時も、そうそう本番環境にコロコロデプロイすることはないと思うので、別途管理しておいてそこに責任を持つ人が走らせるのがベターな運用となりそう。

#### ファイルが消せない

これだけのコードでの利用は初期アップロードやソースコードのみの更新、既存の画像の更新の場面では役に立つが、今まで利用していたファイルが必要でなくなったという場合にはゴミファイルが残ってしまう。

どうやら`gulp-s3-upload`だけでは作成(Upload)/更新(Update)しか操作不可能な様子なので、削除までする場合は別途コードの追記が必要となる。
EpgTimer(abt8WG版)の右クリックメニューに「予約：無効(直接)」を追加する

本来、予約←→無効のトグルしか無い右クリックメニューに、録画モードを直接指定する項目を追加する。
![imgTemp-2016-07-25-04-40-31.png](https://qiita-image-store.s3.amazonaws.com/0/5825/9bebde88-b6df-2ea5-c003-7352d54c6534.png)

いちいち変更からサブメニューなんか開いてらんないので、ルートに追加。
トグルだと、予約一覧で「ここからここまで全部無し」と項目選択をする時、既に無効になってる項目は選択しないように気をつけないいけない。つらい。

対象バージョンはこちら。多分ほかのバージョンでも使えると思う。
[EDCB/EpgTimer/EpgTimer at 54137f00d0ee78135f6487027f9cf9040c93e244 · abt8WG/EDCB](https://github.com/abt8WG/EDCB/tree/54137f00d0ee78135f6487027f9cf9040c93e244/EpgTimer/EpgTimer)



```cs:EpgTimer\EpgTimer\Menu\MenuManager.cs#160行目付近～
            //メニューアイテム:予約一覧
            ctmd = DefCtxmData[CtxmCode.ReserveView];
            ctmd.Items.Add(new CtxmItemData("予約←→無効", EpgCmds.ChgOnOff));
            ctmd.Items.Add(new CtxmItemData("変更(_C)", cm_ChangeMenu));
+           for (int i = 0; i <= 5; i++) {
+               ctmd.Items.Add(new CtxmItemData($"録画モード:{CommonManager.Instance.ConvertRecModeText((byte)i)} (_{i})", EpgCmds.ChgRecmode, i));
+           }
            ctmd.Items.Add(new CtxmItemData("削除", EpgCmds.Delete));
            ctmd.Items.Add(new CtxmItemData("新規プログラム予約...", EpgCmds.ShowAddDialog));
            ctmd.Items.Add(new CtxmItemData("チューナ画面へジャンプ", EpgCmds.JumpTuner));
            ctmd.Items.Add(new CtxmItemData("番組表へジャンプ", EpgCmds.JumpTable));
            ctmd.Items.Add(new CtxmItemData("自動予約登録変更", EpgCmdsEx.ShowAutoAddDialogMenu));
            ctmd.Items.Add(new CtxmItemData("番組名でキーワード予約作成...", EpgCmds.ToAutoadd));
            ctmd.Items.Add(new CtxmItemData("追っかけ再生", EpgCmds.Play));
            ctmd.Items.Add(new CtxmItemData("録画フォルダを開く", EpgCmdsEx.OpenFolderMenu));
            ctmd.Items.AddRange(AddAppendMenus.Clone());
            ctmd.Items.AddRange(AddMenuSetting.Clone());

            //メニューアイテム:使用予定チューナー
            ctmd = DefCtxmData[CtxmCode.TunerReserveView];
            ctmd.Items.Add(new CtxmItemData("予約←→無効", EpgCmds.ChgOnOff));
            ctmd.Items.Add(new CtxmItemData("変更(_C)", cm_ChangeMenu));
+           for (int i = 0; i <= 5; i++) {
+               ctmd.Items.Add(new CtxmItemData($"録画モード:{CommonManager.Instance.ConvertRecModeText((byte)i)} (_{i})", EpgCmds.ChgRecmode, i));
+           }
            ctmd.Items.Add(new CtxmItemData("削除", EpgCmds.Delete));

```

以上、超ニッチな自分仕様でした。これをプルリクエストする勇気はないし、説得力のあるメッセージが書ける気がしない。
Jenkins Pluginに頼らずシェルだけでJobを構築する（ios単体テスト編）


# 概要

Jenkins Pluginを使うとJenkinsのバージョンを上げた時に動作しなくなったり、そもそもGUI設定が面倒だったりで、実はシェルで書いた方が楽じゃん。と思っているのでそうします。
（全く使わないわけではなく、Jenkins2でのお勧めPluginをそのまま入れとくぐらいはやります）
いまどきはfastlaneでビルドしたり、Webサービス使ったりと思います。が、Jenkins + シェルでやります。

シェルで書いておくメリットは、コマンドレベルで何をしているのかが理解できることでしょう。

# インストール

## jenkins

homebrewで入れてます。

```
$ brew update
$ brew cask install java
$ brew install jenkins
```

設定はネットで探せばすぐ出てくるので割愛。

## xctool or xcpretty

```xcodebuild test``` に機能を追加したツールです。
homebrewでインストールしておきます。

```
$ brew install xctool
```

xctoolを使わない場合は、xcprettyを入れる(logを整形してくれる)

```
$ brew install xcpretty
```

# 想定運用

gitにpushされたらこのJobが動作する想定です。[こちらの記事を参照](http://qiita.com/ko2ic/items/e6c9cd69690aba683e6f)
テストが始まった場合とテストの成否をgithub apiでステータスを更新することでgithub上で状況がわかるようにします。
また、チャット（今回の場合はchatwork）にも配信します。


#Job

## JenkinsのGUI設定

* ビルドのパラメーター化でbranchを設定できるようにします。
* ソースコード管理でgit設定をします。branchはパラメーター名の```$branch```にします。
* ビルド環境で、滞留した場合にビルドを中止します。   
 タイムアウトの判定　->　一定の経過時間で6分　-> 失敗扱いにする
* シェルの実行で以下を書きます。

```
#!/bin/bash -l

set -eux

BUILD_URL=${BUILD_URL:-"http://<userid>:<password>@<ホスト名>:8080/job/<Job名>"}

githubToken=XXXXXXXXXXXXXXXXXXXX
chatworkToken=XXXXXXXXXXXXXXXXXXXXXXXX

export WORKSPACE
export BUILD_URL
sh ${WORKSPACE}/jenkins/unitTest.sh $githubToken $chatworkToken $branch
```

```BUILD_URL``` はテストが失敗した場合にgithub上の失敗リンクの遷移先です。入らない場合があったのでデフォルト値を入れています。
また今回はchatworkで結果を通知するのでchatworkのtokenを渡します。

## Jenkins外のシェル

```
#!/bin/bash -l

set -ux
: usage
: $1=githubToken $2=chatworkToken $3=branch

: $1 $2

githubToken=$1
chatworkToken=$2
branch=$3

shellFilePath="${WORKSPACE}/jenkins"

curl -X POST -H "Authorization: token ${githubToken}" https://api.github.com/repos/<ユーザ名>/<レポジトリ名>/statuses/$(git rev-parse HEAD) -d \
"{ \
  \"state\": \"pending\", \
  \"target_url\": \"${BUILD_URL}\", \
  \"description\": \"テスト中です\", \
  \"context\": \"Jenkins\" \
}"

rm -rf Library/Developer/CoreSimulator/Devices


# クリーン処理 
. ${shellFilePath}/clean.sh
clean
install

# 一時的に落ちたことを検知させるため
set +e

xctool -workspace ${WORKSPACE}/<プロジェクト名>.xcworkspace \
-scheme <プロダクト名> \
-configuration Debug-Mock \
-sdk iphonesimulator9.3 \
test  -only <プロダクト名>Tests

# xctoolを使わない場合
# set -o pipefail && xcodebuild -scheme "<プロダクト名>" -workspace "<ワークスペース>.xcworkspace" -configuration "Debug-Mock" -destination "name=iPhone 6s Plus,OS=9.3" -destination-timeout "240" build test | xcpretty --color --test

if [ $? -ne 0 ]; then

    curl -X POST -H "Authorization: token ${githubToken}" https://api.github.com/repos/<ユーザ名>/<レポジトリ名>/statuses/$(git rev-parse HEAD) -d \
"{ \
  \"state\": \"failure\", \
  \"target_url\": \"${BUILD_URL}\", \
  \"description\": \"テスト失敗してます\", \
  \"context\": \"Jenkins\" \
}"

    curl -X POST -H "X-ChatWorkToken: ${chatworkToken}" \
    -d "body=${branch}にPushしてテストが落ちてます" "https://api.chatwork.com/v1/rooms/<ルームID>/messages"

    exit 1

else 

    curl -X POST -H "Authorization: token ${githubToken}" https://api.github.com/repos/<ユーザ名>/<レポジトリ名>/statuses/$(git rev-parse HEAD) -d \
"{ \
  \"state\": \"success\", \
  \"target_url\": \"${BUILD_URL}\", \
  \"description\": \"テスト成功！！\", \
  \"context\": \"Jenkins\" \
}"

fi
```
ProMicroメモ

aliexpressやBangoodで3ドル程度で買えるProMicroは、物によってはArduino Leonardとして認識されます…

以下はちょっとした勉強用資料の下書きです。

![image](https://qiita-image-store.s3.amazonaws.com/0/40627/2b9967d7-6d4f-7c6a-2dd0-223cabad3a29.png)


最初にmicroUSBポートでパソコンにつないだ状態で右列の上から2番目にLEDの負極（足が短い方）を刺して、右列の上から4番目にLEDの正極を刺して、LEDが点灯することを確認します。


Blinkする場合は例えば左列の上から4番目にLEDの負極を刺して、（1kΩの抵抗を噛まして）
左列の上から5番目にLEDの正極を刺して

```cpp

int LedPin=2;
// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(LedPin, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LedPin, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(LedPin, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}
```
とやってアップロードすれば良いです。
同じように9番まで動く事を確認します。


次はアナログ（HIGH LOWだけではなく0から255とか）を出力できるかを調べます。

左列の最下段(9)にLEDの正極、左列の上から4番目（GND）に負極を繋げて以下のスケッチを書き込みます。徐々に明るくなって徐々に暗くなります。

```cpp

int LedPin=9;
// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(LedPin, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  int i;
 
  for (i=0; i<256; i++){
   analogWrite(LedPin, i);
   delay(10);
  }
 
  for (i=255; i>=0; i--){
   analogWrite(LedPin, i);
   delay(10);
  }
  
}
```

これを 4とかに変えると徐々にではなく一気に明るくなったり消えたりしてうまくいきません。
他の数字とピンで試してみると、
「3,5,6,9」では徐々に暗くなったり明るくなったりというのがちゃんと動きます。

ここまでで、

- 「ピン配置図の内、Arduinoのスケッチ指定のピンNOは水色のところの数字」
- 「PWMチェックがついているピンはHIGHかLOWだけでなく256段階の値を出力できる」

ことが分かるかと思います。


# スイッチの取得
```
int switchNo=2;
int ledPin=5;

void setup() {
  //start serial connection
  Serial.begin(9600);
  //configure pin2 as an input and enable the internal pull-up resistor
  pinMode(switchNo, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);

}

void loop() {
  //read the pushbutton value into a variable
  int sensorVal = digitalRead(switchNo);
  //print out the value of the pushbutton
  Serial.println(sensorVal);

  // Keep in mind the pullup means the pushbutton's
  // logic is inverted. It goes HIGH when it's open,
  // and LOW when it's pressed. Turn on pin 13 when the
  // button's pressed, and off when it's not:
  if (sensorVal == HIGH) {
    digitalWrite(ledPin, LOW);
  } else {
    digitalWrite(ledPin, HIGH);
  }
}
```
AWS　ELBを中継するときにapache2.4ログのIPアドレスがELBのIPになる問題

apacheのログのIPがELBのIPになってしまう問題を解決します。

httpd.confに```RemoteIPHeader X-Forwarded-For```を記述
ログのフォーマットの%hになっているところを%aに変える。

`/etc/init.d/httpd {start|reload|restart}`
文字コードエラーから問題のある文字を特定する。

#### この記事で取り扱う問題

文字コード変換を起こった時の、下記のようなエラーが発生することがある。

```
"\x87@" from Shift_JIS to UTF-8
```

この時、実際に問題を起こしている文字を特定する手法について記載している。



---
#### 実際の手順

エラー文から、今回はShift-JISからUTF-8への変換を行おうとしたことが分かる。

`"\x87@"` を分解すると
`"\x87"` と `"@"` の二文字として解釈できる。


`"@"` という文字はUTF8で `\x40` の位置にある文字なので、これを `\x40` と解釈する。

`"@"` を読み変えることで、エラーを起こした文字はShift-JISにおける `"\x87\x40"` であることが分かる。
上記の情報を元にShift-JISのコード表を探す。
この文字はSJISの機種依存文字の①だとわかる。

参考)http://www.shurey.com/js/labo/character2.html
Editorconfigのサンプル


サイト http://editorconfig.org/

```.editorconfig
root = true

[*]
charset = utf-8
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space

[*.{java,xml}]
indent_size = 4

[*.{rb,erb}]
indent_size = 2

[*.{html,js,css}]
indent_size = 2

[*.json]
indent_size = 2

[*.{yml,yaml}]
indent_size = 2
trim_trailing_whitespace = false

[Makefile]
indent_style = tab

[*.md]
trim_trailing_whitespace = false
```
iOS & OS X で zip ファイルをオンメモリで解凍する 

## zip をオンメモリで解凍

`iOS` や `OS X` のアプリでサーバーよりコンテンツをダウンロードしてデバイスで利用する場合など、やはり zip した内容を解凍して利用するケースは少ないくないと思います。パフォーマンスを上げるためにオンメモリで解凍したい場合もあるかと思います。今回は、そんな場合の為にオンメモリで解凍可能な `ZUnzip` を紹介いたします。

## ZUnzip

`ZUnzip` は [https://github.com/codelynx/ZUnzip](https://github.com/codelynx/ZUnzip/) から取得できます。

## ZUnzip の初期化

`ZUnzip` はzipファイルのパスを渡すもしくは、zipファイルのデータを渡して初期化します。

```.swift
let path = ...
let unzip = ZUnzip(path: path)
```

```.swift
let data = ...
let unzip = ZUnzip(data: data)
```

## ファイルの一覧

```.swift
let files = unzip.files
```

`files` メソッド（プロパティ）でzip内のファイル名の一覧を `String` の `Array` で戻します。サブディレクトリー(フォルダー)は`/`で区切られたファイル名となります。

## ファイルの解凍

解凍するファイルの名前を指定して`dataForFile()`を呼び出します。ファイルが存在しなければ、もしくは解凍に失敗した場合は `nil` が戻ります。

```.swift
if let imageData = unzip.dataForFile("sample/sample.jpg") {
	// ...
}
```

## 用例

zipのバイナリデータからメモリ上に直接JPEG画像を解凍する場合。

```.swift
import ZUnzip

let data = ...
if let unzip = ZUnzip(data: data) {
    if let imageData = unzip.dataForFile("sample/sample.jpg") {
        if let image = UIImage(data: imageData) {
            // ...
        }
    }
}
```

zipファイルからメモリ上に直接JPEG画像を解凍する場合。

```.swift
import ZUnzip

let path = ...
if let unzip = ZUnzip(path: path) {
    if let imageData = unzip.dataForFile("sample/sample.jpg") {
        if let image = UIImage(data: imageData) {
            // ...
        }
    }
}
```

## License

`libzip` のライセンスは [https://nih.at/libzip/LICENSE.html](https://nih.at/libzip/LICENSE.html) をごらんください。`ZUnzip`のライセンスは [MIT](https://github.com/codelynx/ZUnzip/blob/master/LICENSE.md)となっております。

## 最後に

なんとか Swift だけで zip を解凍できるソルーションを探していましたが、見つかりませんでした。`libzip`をなんとか、Swift から呼び出して使えるようにモジュール化したかったのですが、数行ではうまく説明できませんが、結果的にはできませんでした。

もしどなたか、`libzip` をうまく swift でモジュール化、もしくは、そもそも`libzip`を Swift に移植できたら是非教えてください。よろしくお願いいたします。

執筆時の環境は以下の通りになります。

```.txt
Xcode Version 7.3.1 (7D1014)
Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.31)
```
Rails Application Templatesでは、3回コミットすると便利

以下の段階それぞれで `git commit` しておくと、Application Templates でどのような変更を行ったのか追いやすくなるので、何かと便利です。

* `rails new`で作られるデフォルトのファイル
* 自分でカスタマイズした設定
* `bundle install` が終わって、spring binstub が作られた後

``` ruby:template.rb
# 最初のコミット
git :init
git add: '.'
git commit: '-m "first commit"'

# template で色々設定する
# args = self.instance_eval { @_initializer[0, 2] }.flatten
# create_file 'memo.txt',  <<END.strip_heredoc
#   rails new #{args.join ' '}
# END
#
# %w[
#   README.rdoc
#   public/favicon.ico
# ].each { |file| remove_file file }
#
# append_file 'Gemfile', <<-'END'.strip_heredoc
# END
#
# initializer 'generators.rb', <<'END'.strip_heredoc
# END

# template 適用直後
git add: '-A .'
git commit: '-m "apply template.rb"'

# bundle install 後。これがないと Gemfile.lock などを自分で commit しないといけなくなる
after_bundle do
  git add: '-A .'
  git commit: '-m "initialized"'
end
```

## 参考リンク
* [Rails Application Templates — Ruby on Rails Guides](http://guides.rubyonrails.org/rails_application_templates.html)
* [rails new したときのオプションを自動的に保存する](http://qiita.com/beyond/items/9a41e488cdae33cd4fce)
TCPDF + FPDIで既存PDFに日本語文章を追加


## 概要

既存PDFを修正するっていう案件が来て、phpからpdfを操作するライブラリを調べてましたが、 `TCPDF` + `FPDI` がいいかなという結論になったので、早速使ってみました。

調べるといろいろ記事があったので楽勝かなと思ったんですが、古い情報が多くて結構手こずりました。

以下、手順を備忘録的に残しておきます。

## 手順

### (1) composerインストール

TCPDFもFPDIもpackagistにありますので、落としてきまます。

* [tecnickcom/tcpdf](https://packagist.org/packages/tecnickcom/tcpdf)
* [setasign/fpdi](https://packagist.org/packages/setasign/fpdi)

fpdiからtcpdfを使用するための `fpdi-tcpdf` なるものも一緒に落とします。

* [setasign/fpdi-tcpdf](https://packagist.org/packages/setasign/fpdi-tcpdf)

### (2) 実装コード

```
$pdf = new FPDI();
$pdf->setSourceFile("test.pdf");
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->addPage();
$importPage = $pdf->importPage(1);
$pdf->useTemplate($importPage, 0, 0);
$pdf->SetFont("kozminproregular", "", 12);
$pdf->Text(50, 100, "ポケモンゲットだぜ！！");
$pdf->Output("/tmp/output.pdf", "F");
```

#### 実装コードの説明


```
$pdf->setSourceFile("test.pdf");
```

編集したいpdfファイルを指定してます。

```
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
```

pdfのheader部分、fotter部分を表示しないように指定しています。
特に `$pdf->setPrintHeader(false);` に関しては、これを指定していないと、outputで出力したpdfの上の方に横線が入ってしまっていました。

特別な理由がない限りfalseで指定してしまっていいと思います。

```
$importPage = $pdf->importPage(1);
$pdf->addPage();
$pdf->useTemplate($importPage, 0, 0);
```

PDFテンプレートの指定ページを設定しています。

1. `$pdf->importPage(1);` で読み込んだpdfの1ページ目の情報を取得します。
2. `$pdf->addPage();` で新ページを作成します。
3. `$pdf->useTemplate($importPage, 0, 0);` で読み込んだpdfの情報をテンプレートに指定します。


```
$pdf->SetFont("kozminproregular", "", 12);
```

フォントを設定します。
kozminproregularはtcpdfがサポートしている日本語フォントのようです。

```
$pdf->Text(50, 100, "ポケモンゲットだぜ！！");
```

x=50, y=100のところに、"ポケモンゲットだぜ！！という文字を書き込みます。

```
$pdf->Output("/tmp/output.pdf", "F");
```

指定パスに、pdfを出力します。第二引数の `F` はローカルファイルとして出力するモードの指定になります。


## 最後に

今回 `TCPDF` + `FPDI` で実行しましたが、「こっちのライブラリのほうがいいよ」みたいな情報お待ちしております。
bowerのパッケージを1つのjsに結合する



以下の理由によりbowerのパッケージを1つのjsにまとめたかった

* htmlからjsロード時のhttpリクエストを減らしたい
* bower_componentsをpublicに置きたくない
* パッケージ追加時にhtmlにロードを追加するのが面倒くさい

こんな感じのディレクトリ構成にしたい

```bash
├── bower.json
└── public
    ├── index.html
    └── js
        └── lib.js
```

index.htmlからはlib.jsのみロード

```index.html
<script type="text/javascript" src="js/lib.js"></script>
```

bower.jsonは例えばこんな感じ

```bower.json
{
  "name": "hoge",
  "dependencies": {
    "firebase": "^v3.1.0",
    "jQuery": "^3.0.0",
    "js-yaml": "^3.6.1"
  }
}
```

## 前提

* nodejsとnpmはインストール済みとする

## 実装

packge.jsonを作っておく

```package.json
{
}
```

必要パッケージをインストール

```bash
$ npm install --save-dev gulp gulp-filter main-bower-files gulp-concat
```

gulpfile.jsを作成

```gulpfile.js
gulp = require('gulp');
bower = require('main-bower-files');
concat = require('gulp-concat');
filter = require('gulp-filter');

gulp.task('bowerJS', function() {
  jsFilter = filter('**/*.js');
    gulp
      .src(bower())
      .pipe(jsFilter)
      .pipe(concat('lib.js'))
      .pipe(gulp.dest('public/js/'));
});
```

gulpfileを実行
public/js/lib.jsが作成される

```bash
$ ./node_modules/gulp/bin/gulp.js bowerJS
```

最終的なディレクトリ構成
（npmとbowerのinstallで作成されるファイルは省く）

```bash
├── bower.json
├── packge.json
├── gulpfile.js
└── public
    ├── index.html
    └── js
        └── lib.js
```

## 補足

こんなパターンが発生

* bowerのパッケージのディレクトリ構成が独自
* min.jsをlib.jsに結合したい

bower.jsonに明示的にjsファイル名を指定する

```bower.json
{
  "name": "hoge",
  "dependencies": {
    "firebase": "^v3.1.0",
    "jQuery": "^3.0.0",
    "js-yaml": "^3.6.1"
  },
  "overrides": {
    "firebase": {
      "main": "firebase.js"
    },
    "jQuery": {
      "main": "jquery.min.js"
    },
    "js-yaml": {
      "main": "js-yaml.min.js"
    }
  }
}
```
ソフトウェア開発　見積もりの基礎知識①

# はじめに
見積もりを依頼されることがあると思います。

これは、私が初めて見積もりを依頼するときに説明している内容です。

※ 見積もりには、工数見積もり、期間見積もり、金額の見積もりなど、
いろいろありますが、ここでは、工数見積もりを見積もりとします。




# 見積もりの種類

見積もり・・・と、一口に言っても、企画段階、要件定義直前、要件定義後など、前提となる情報の精度が異なります。

そこで、見積もりの段階は、超概算、概算、正式と、分けて考えます。


### 超概算見積もり
プロジェクトの初期段階で、費用を大まかに把握するために使う。
見積もり額の精度は－50％から＋100％

### 概算見積もり（相見積もり）
実際に制作依頼を行う会社が決まったときや相見積もり時に使う。
見積もり額の精度は-25％から+50％

### 正式見積もり（確定見積もり）
見積もり額の精度は-5％から+10％
作業内容や工程、単価、数量、ページ数など、できる限り正確に盛り込んだもの。実行予算として使う。

※ 見積もり精度の数字は、PMBOK（Project Management Body of Knowledge)の定義。
PMBOKとは、国際的なプロジェクトマネジメント標準として、プロジェクトマネジメントの知識が体系的にまとめられているものです。


# ブレ幅は？

### 見積もり結果を　100とした場合のブレ幅
![image](https://qiita-image-store.s3.amazonaws.com/0/119021/8fbcd138-1529-10fb-3623-6fee3d33ba31.png)

これは、それぞれのフェーズで100 だった場合の結果です。

ふつうは、段階(超概算、概算、正式)と進むにつれて、要件が追加されてくるので、見積もり結果は徐々に増えていきますので、次のようになります。



### 見積もり結果を100、110、120と 10ずつ増やした場合
![image](https://qiita-image-store.s3.amazonaws.com/0/119021/4e0fccea-5214-e2b2-a3c5-dd58bbc57e9f.png)

なんとなく、上下均等に振れる感じにみえると思います。

# どう使うか？

たとえば、

- 企画段階など、インプットがほとんどなく、経験から類推する段階を、超概算見積り。
- 要件定義前など、要求が固まっている段階を、概算見積り。
- 要件定義後など、やることが確定した段階を、正式見積もり。

など、見積もりを利用する関係者間で合意して、振れ幅があることを合意しておくと、

- 発注者側は、MAXの振れ幅を見ながら予算どりする。下振れしたら、その分やることを増やせる。
- 受注側は、MAXまで振れても、追加予算でどうにかなる。下振れしたら、より良いものを作る工数が確保できる。

ということが可能になったりします。
(契約条件にもよります。)


# さいごに

少しでも使ってみたいと思いましたら、LGTMお願いします。
また、弊社では、SEからプロマネにキャリアアップしたい人材を募集中です。

ご興味がある方は、こちらまでご連絡ください。
info@pro-effect.jp
CentOS7にdockerとdocker-composeの最新版をインストールする

dockerとdocker-composeの最新版をインストールする手順。
関連記事はたくさんあるけど調べるのに少し手間がかかったのでまとめておく。

# docker
次の 1 行で Docker 社のリポジトリから最新版の Docker Engine をインストールする。 

```
$ curl -sSL https://get.docker.com/ | sh
$ doceker version
```

# docker-compose
最新版のバージョンを下記リンクで確認する。
[https://github.com/docker/compose/blob/master/CHANGELOG.md](https://github.com/docker/compose/blob/master/CHANGELOG.md) 
 
Latest release は2016/08/13現在なら1.8.0.

**注！ 08/13現在、1.8.0 では下記はエラーになります。1.7.1 ならOKでした。**

```
$ VERSION_NUM=1.8.0
$ curl -L https://github.com/docker/compose/releases/download/VERSION_NUM/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ docker-compose version
```

docker-compose のバージョンアップは rm & curl のやり直しになるみたい。
古い compose で up したコンテナと不整合しないか少し気になる。
Postfix の luser_relay に複数のドメインを設定する方法

# 概要

`Postfix` に `example.com` と `example.net` など複数のドメインで共通の `luser_relay` を使いたい場合の簡単な設定方法を整理します。

## もう少し具体的に状況を書くと

1. 既にドメイン `example.com` を `Postfix` で運用していて `luser_relay` 機能を利用し、何らかの理由により `some_1@example.com`, `some_2@example.com` などを `luser_relay = target` として `Postfix` の動作している `example.com` サーバー自身の `target` ユーザーへ配送している状況で、
2. `example.net` の管理が追加される事となったが `example.com` も `example.net` も同じ `luser_relay` で、 `some_1@example.com` `some_2@example.com` や `some_1@example.net` `some_2@example.net` などの何れのドメインへの不特定ユーザー宛の配送も同一の `target` ユーザーへ配送したい状況。

# Postfix の設定方法

編集対象: `main.cf`

## 既にある example.com の luser_relay 関連設定の例

```
luser_relay = target
local_recipient_maps = 
```

## 新たに example.net の為に追加する設定の例

```
default_transport = local
relay_domains = example.net .example.net
relayhost = [127.0.0.1]
```

# 結果、この設定で得られる効果

- `some_1@example.com` -> `target` へ配送される。（既存設定により有効だった配送）
- `some_2@example.com` -> `target` へ配送される。（既存設定により有効だった配送）
- `some_x@example.com` -> `target` へ配送される。（既存設定により有効だった配送）
- `some_1@example.net` -> `target` へ配送される。（新たな設定により追加される配送）
- `some_2@example.net` -> `target` へ配送される。（新たな設定により追加される配送）
- `some_x@example.net` -> `target` へ配送される。（新たな設定により追加される配送）

# 参考

- [全てのドメイン宛のメールを受信する](http://ngyuki.hatenablog.com/entry/20110725/p1)

# だそく

しばらく前に `WonderRabbitProject.net` のみに所有ドメインを集約していましたが、近年取得していたけど放置していた `usagi.network` で何か楽しい事でも始めたいなと思い、いろいろと設定を施しているところで、「`Postfix`の`luser_relay`って複数ドメイン対応してない？virtualのmap書くのめんどくさいよー何かいい方法ないのかなー」と思って調査したところ参考記事のおかげ様でこんな程度の簡単設定だけで済んだのでした。`luser_relay`については単純な使い方程度しか情報が出回っていないため、複数ドメインをちょろっと使いたいユーザー向けに参考情報として整理されると嬉しいかと思い Qiita 記事にしたのでした。

Qiita に遊びに来るような方は、ドメイン、たいてい何個かずつ持っとるじゃろヽ(´ー｀)ノ
Gitlab/Githubを使ってLPを公開してドメインを付与する

GitLab / GitHub Pagesを使ってWebページを公開してなおかつお名前のドメインも付与しちゃって節約しましょうって内容です。
自分はGitLabユーザーですので、GitHubでやってないですが多分大丈夫じゃないかなと。確信はないですが。。。

1. とりあえずGitLab PagesでWebページを公開。.gitlab-ci.ymlを使うやつっすね。
2. そーすると、`https://hogehoge.gitlab.io/project/`でURLがデプロイされます。
3. Pagesよりドメインを登録します。
4. hogehoge.gitlab.ioのnslookupとかでIPを調べます
5. お名前のドメイン設定 > DNS関連機能の設定 > DNSレコードの設定からAレコードを登録

これで少し時間たてばドメインでpageがみれます。
Unixコマンドメモ

結構忘れることが多いのでメモ程度に。忘れた時にチートしてもらえると。

###テキストファイル中身表示

そのまま表示
`$cat -n`

先頭部分表示
`$head -n`

最後部分表示
`$tail -n`

上記2つとも`-n`オプションなしでは10件表示。

ex) 41行目から50行目まで表示

`$cat -n ファイル名 | head -n 50 | tail -n 10`

ページ単位で表示
`$less`

### マニュアル

マニュアル
`$man コマンド名`

キーワードで検索
`$apropos キーワード`

簡単な説明
`$whatis コマンド名`

コマンドがどこにあるか
`$type コマンド名`

### ファイルの場所

ファイル名で探す
`$find ディレクトリ -name ファイル名`

タイプで探す
`$find Pictures -type l`

```
d: ディレクトリ
f: 通常ファイル
l: シンボリックリンク
```

ex) 空のディレクトリ探す
`$find . -type d -empty`

`-o`オプションでOR検索ができる。


### フィルタコマンド

```
cat: ファイルの内容表示
head: 入力の最初の部分
tail: 入力の最後の部分
sort: 並び替え
tr: 文字の置換
uniq: 重複行を削除
wc: 文字数、単語数、行数を数える
```

### ファイルのアクセス権

`$ls -l`

`rwxrwxr-x`
こんなのが出てくる。

r -> 読み出し
w -> 書き換え
x -> 実行


`$chmod`でアクセス権の変更

3桁の8進数を使用して権限を指定することもできる。左から順に所有者，グループ，その他のユーザーの権限を表す。

0	---
1	--x
2	-w-
3	-wx
4	r--
5	r-x
6	rw-
7	rwx

所有者の変更

`$chown ユーザ名 ファイルのパス`

-R オプションの指定でディレクトリ以下をまとめて変更可能。


### ファイルやシステムの情報

サイズの大きい順
`$ls -shS`

ディレクトリのサイズ
`$du -h ディレクトリ`

ex) ホームディレクトリでサイズの大きな順10件

`$du -k ~ | sort -nr | head`

システムの稼働時間
`$uptime`

メモリの使用状況
`$free`

メモでした。参考になれば幸いです。
こんな便利コマンドもあるよ〜っていうのがあれば教えて下さい!!
Hemesh チュートリアル その3

#何を書くか
http://freeartbureau.org/fab_activity/hemesh-part-2/
あたりを追いながら、Hemeshのチュートリアルをprocessing3を使って続けます。

#B_CP5_interface_02
processing3を使った自分の環境に対応するには

- CW系の処理をコメントアウトする
- stl書き出し
    - 最後の引数を1.0から"(任意の文字列)"とする
    - stl書き出しの直前にMESH.triangulate();を入れる
- CAM.beginHUD();とCAM.endHUD();の間にINTERFACES.draw();を入れる
- あと、OPENGL -> P3D

でした。
で、実行すると…？

できた！
<img width="579" alt="スクリーンショット 2016-08-13 21.48.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/108483/675de456-9ac7-7665-f14d-e4c80e4fc364.png">

<img width="575" alt="スクリーンショット 2016-08-13 21.48.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/108483/b662de7e-d3e5-5cea-0523-2eb75f4f86ae.png">

<img width="559" alt="スクリーンショット 2016-08-13 21.49.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/108483/a48b171c-541c-0320-9cf4-125f12ccd27b.png">

しかし、骨組みだけのものはstlに書き出しても、メッシュが閉じていな不備のあるデータになってしまって3Dプリントはできず。
smoothingとかする必要があるのかなぁ。そういうライブラリないんだろうか。
RENDER.drawFacesSmooth( MESH );はNullPointerExceptionで動かなかったんだよなぁ…

#Tutorial Part 3
いくつか新しいGUIオブジェクトを使います。
花瓶のようなものを作ることができ、以下の写真の作品もHemeshを用いたそうです。
![Filippo_Losi_Lamps.jpg](https://qiita-image-store.s3.amazonaws.com/0/108483/5b69bd71-a58f-84d3-d70a-10bbac83cf5d.jpeg)

##Cone & Bend
最初のサンプルコードを実行すると、
<img width="528" alt="スクリーンショット 2016-08-13 22.23.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/108483/f11109a1-b78b-45dc-8b9d-a07ffb52af5b.png">
こういうものができました。

ここで、MESH.triangulate();を使ったものと使わなかったものを比較。
左がtriangulate();なし。右があり。
<img width="400" alt="スクリーンショット 2016-08-13 22.28.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/108483/2b86f073-88f1-685b-25f2-63086085d01d.png">
変わりませんね。
そしてどちらも3Dプリントは不可。

##Tutorial最後のサンプル
読み飛ばして気づかなかったんですが、そういえばzzz_PROCESSING_V2という名前のフォルダにProcessing2に対応したversionのスケッチが入ってたんですね。
その中のものはほとんど編集なしに使うことができました。

C_cylinder_twistExtrude_P5V2_interfaceの実行結果
<img width="415" alt="スクリーンショット 2016-08-13 22.42.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/108483/9559740e-3eba-863e-2ef1-644a4b5dec49.png">
しかし、こちらも3Dプリントできるオブジェクトは書き出せず。
シンプルなものしかだめなのかなぁ。

#D_MultiSlicer_P5V2_02
このサンプルはかなり面白いですね。
これをもとに何か作ってみたい。

<img width="544" alt="スクリーンショット 2016-08-13 22.58.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/108483/56072955-781a-2bb7-4c9e-c8b8c9ae936c.png">

<img width="672" alt="スクリーンショット 2016-08-13 22.58.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/108483/f7e1026a-cf2a-6469-9aa4-64778386ac94.png">


<img width="552" alt="スクリーンショット 2016-08-13 22.59.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/108483/d65a693b-6f46-84c5-11db-634b1e26ddca.png">
RubyInstaller 2.3.1 に標準で含まれているライブラリ gem リスト

開発の計画をたてる際に、使用環境にDevKitを入れるかどうかを検討する際に、
標準で含まれているライブラリを把握する必要があったため、確認しました。

インストールは RubyInstaller 2.3.1 64bit版を使用

## ライブラリリスト
```
bigdecimal (1.2.8)
did_you_mean (1.0.0)
io-console (0.4.5)
json (1.8.3)
minitest (5.8.3)
net-telnet (0.1.1)
power_assert (0.2.6)
psych (2.0.17)
rake (10.4.2)
rdoc (4.2.1)
test-unit (3.1.5)
```

以上、これだけの内容ですが公式ドックがないので公開いたします。
暗号技術 その１

#暗号
平文で通信していると、メッセージを途中で盗聴されてしまうかもしれない。
そこで、送信者はメッセージを暗号化し途中で盗聴されないようにする。
受信者は、暗号化されたメッセージを受け取ると複合しメッセージを読む。

####暗号は**機密性**を守る

暗号化と複合化をする手順を合わせて暗号アルゴリズムという

暗号アルゴリズムには鍵が必要

#対称暗号と公開鍵暗号
**対称暗号**
暗号化と復号を同じ鍵で行う
鍵配送問題がある(鍵配送センターやDiffie-Hellman鍵交換などで解決できる)
DESや3DES、AESがある

**公開鍵暗号**
暗号化と復号で異なる鍵を使う
man-in-the-middle攻撃や選択暗号文攻撃に弱い(認証)
RSAやElGamal、楕円曲線暗号などがある

**ハイブリット暗号システム**
公開鍵暗号は暗号化、復号の処理速度が対称暗号に比べて遅い
その為、メッセージは擬似乱数でセッション鍵を生成し、その対称暗号で暗号化する。
その後、セッション鍵を公開鍵で暗号化する。
暗号化したセッション鍵と暗号化したメッセージを結合し送信する。
逆の手順で復号する。

#一方向ハッシュ関数
正真性、完全性を調べることができる

正真性、完全性とは対象のものが正しいかどうか

1bitでも改ざんされているとハッシュ値が違ってくるので正真性がわかる

ハッシュ値はハッシュ値をとる対象の長さがどんな長さでも固定のサイズになる

サイズはハッシュ関数によって変わる

###弱衝突耐性と強衝突耐性
あるメッセージと同じハッシュ値を持つメッセージを見つけ出すことが困難であることを弱衝突耐性
ハッシュ値が同じになるような、異なる２つのメッセージを見つけ出すことが困難であることを強衝突耐性という
弱衝突耐性は強衝突耐性に対比して使われる用語のため衝突耐性がなくて弱いという意味ではない

###一方向性
ハッシュ値から元のメッセージを逆算できない性質

MD4やMD5は安全ではない
SHA-2とSHA-3を使うべし

ブルートフォースアタックや誕生日攻撃に弱い

//その２
http://qiita.com/sizukutamago/items/e7157a3e1fe8a7726c1c

ご指摘ありがとうございます(8/28)
「cordova build android」で「Error occurred during initialization of VM」というエラーが出た場合の対応方法

## 原因
- メモリが足りてるときはエラーが出なかったので理由が分からなかったがgradleのdeamon processのメモリが足りてなくてエラーが起こっている

## 対処方法
- プロジェクトフォルダ（platformsとかpluginsとか入ってるフォルダ）に下記を記載した「gradle.properties」を作成  
※公式にはuser homeに「gradle.properties」を作成すれば認識すると書いていたが、windows10環境では認識しなかった

```text
org.gradle.jvmargs=-Xmx1024m
```

## 参考
- [20.1. Configuring the build environment via gradle.properties](https://docs.gradle.org/2.2.1/userguide/build_environment.html#sec:gradle_configuration_properties)
[ VSCode-UIFlow ] uiflowのvscodeプラグインを作ってみました 

# はじめに
[もう保守されない画面遷移図は嫌なので、UI Flow図を簡単にマークダウンぽく書くエディタ作った](http://qiita.com/hirokidaichi/items/ff54a968bdd7bcc50d42)に感銘を受けて、Visual Studio Codeのプラグインを作ってみました。 :smile: 
* [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=kexi.vscode-uiflow)
* [GitHub](https://github.com/kexi/vscode-uiflow)



# 使い方
vscodeを立ち上げて拡張機能から`VSCode-UIFlow`を探して、インストールしてください。インストール後はvscodeを再起動して、右下の言語選択から`uiflow`を選択します。
エディタタブの右側にある`Open Preview to The Side`をクリックします。
以下のようなソースを打つと右側にダイアグラムのプレビューが表示されます。

```text:サンプルソース
[Home]
welcome
news
--
click signin
==> SignIn

[SignIn]
--
submit
==> Dashboard

[Dashboard]
inbox
--
click signout
==> Home
```

# 主な機能

## プレビュー
エディタタブの右側の`Open Preview to the Side`をクリックするとプレビューが開きます。
![preview.png](https://qiita-image-store.s3.amazonaws.com/0/73698/7f0a5e44-4954-af2a-6dae-697821f7c5eb.png)

## SVG・PNGのエクスポート
ダイアグラムをSVGまたはPNGにエクスポートできます。
※ v0.1.0からPNGエクスポートを強化し、いままで動かなかった環境でも動作するようになりました。

## JSON・DOTのエクスポート
JSONまたはDOTをエクスポートできます。

## オートコンプリート
`==>`の後ろは`Ctrl+Space`でオートコンプリートできます。
![autocompletion.png](https://qiita-image-store.s3.amazonaws.com/0/73698/1d8d097b-3a4e-6de2-9095-428c17bcdcb3.png)

## ページ名のリネーム
`[ ]`の中や `==>`の後のページ名は簡単にリネームできます。
ページ名の上で右クリックして`Rename Symbol`するだけです。
### Before
![before-rename2.png](https://qiita-image-store.s3.amazonaws.com/0/73698/95fb5bba-2a74-fef9-4024-30860ced56de.png)
### After
![after-rename.png](https://qiita-image-store.s3.amazonaws.com/0/73698/44e51a09-0318-8536-6c7b-04ffc30098b0.png)


## 参照元のコード検索
`[ページ名]`の上で右クリックし、`Find All References`をクリックすると参照元を検索でき、該当するソースコードが表示されます。
![find-all-references.png](https://qiita-image-store.s3.amazonaws.com/0/73698/f11e7949-2417-265f-37bb-910a82158d01.png)

## ソースコードの折りたたみ
ページごとにソースコードを折りたためます。
![folding-feature.png](https://qiita-image-store.s3.amazonaws.com/0/73698/1c67da31-062a-dcf1-540b-228ec1bc816b.png)


# ToDo
* ~~プレビューとソースコードとの連携機能を実装する。~~v0.8.0で対応しました。
* vscode-uiflow独自の機能の説明を記述する。

# 謝辞
いろいろと参考にさせていただいております。この場を借りて御礼申し上げます。
[uiflow](https://github.com/hirokidaichi/uiflow),[guiflow](http://qiita.com/hirokidaichi/items/ff54a968bdd7bcc50d42)の作者 @hirokidaichi さん
[SVG Viewer](http://qiita.com/shoooo/items/6c34427965a4ba6639fb)の作者 @shoooo さん


# 3年ぶりリリース秘話公開しました。
https://qiita.com/kexi/items/093b6cbfce2244ed09b0
Dockar swarm mode クラスタの構築



# 主なコマンド

## クラスタの起動

クラスタ起動の際にはdocker swarm initを実行する。
なお、コマンド実行時にはクラスタにノードを追加する際の
トークン情報の表示も行われる。
(別にここで記録しなくともコマンド実行で改めてトークンを取得することもできる。)

```bash:クラスタの起動
docker swarm init --advertise-addr="192.168.100.19" --listen-addr=0.0.0.0:2377
```

|コマンド|意味|備考|
|---|---|---|
|docker swarm init|クラスタの起動|特になし|
|--advertise-addr="192.168.100.19"|他ノードと通信する際の送信元アドレス?|複数インタフェースをノードが持っている場合に必要|
|--listen-addr=0.0.0.0:2377|他のノードとの通信に用いるリッスンアドレスとポートの指定|全インタフェースの2377番ポートでリッスン|

## クラスタへのノードの参加

```bash:swarmクラスタへのノード参加
docker swarm join 192.168.100.19 --advertise-addr="192.168.100.20" --listen-addr=0.0.0.0:2377 --token="SWMTKN-1-5ttd4rei5x2ltr5xa4balwu607lhg8cpggznhx22vxqwireuyj-dikln7ne6okdxu30ycrevdpwz"
```

|コマンド|意味|備考|
|---|---|---|
|docker swarm join|クラスタに参加する|利用するトークンによってマネージャまたはワーカノードになる|
|--advertise-addr="192.168.100.20"|アドバタイズに使用するIPアドレスを指定する|複数インタフェースを持つ場合は指定必須|
|--listen-addr=0.0.0.0:2377|他のノードとの通信に用いるリッスンアドレスとポートの指定|この場合は全インタフェースのTCP2377番ポートでリッスンする|
|--token="～～～"|クラスタへの参加用トークン|マネージャノードとして参加する場合とワーカノードとして参加する場合でトークンが異なる|

### トークンの取得

swarmクラスタの中に含まれるマネージャノードで
docker swarm join-tokenのコマンドを実行することでトークンをクラスタ参加用のトークンを取得することができる。

コマンド実行時はマネージャノード用トークンまたは
ワーカノード用トークンの取得を行わなければならない。

#### マネージャノード用トークンの取得

```bash:マネージャノード用トークンの取得
docker swarm join-token manager
To add a manager to this swarm, run the following command:
    docker swarm join \
    --token SWMTKN-1-5ttd4rei5x2ltr5xa4balwu607lhg8cpggznhx22vxqwireuyj-dikln7ne6okdxu30ycrevdpwz
```

#### ワーカノード用トークンの取得

```bash:ワーカノード用トークンの取得
docker swarm join-token worker
To add a worker to this swarm, run the following command:
    docker swarm join \
    --token SWMTKN-1-5ttd4rei5x2ltr5xa4balwu607lhg8cpggznhx22vxqwireuyj-1c6c7kfkfbvn0pim5tb89bgug
```

# 状態確認

## クラスタの状態確認

```bash:クラスタの状態確認
docker node list
ID                           HOSTNAME    STATUS  AVAILABILITY  MANAGER STATUS
74ir4572w3n9155wl2jgala4o    ubuntu-001  Ready   Active        Leader
8gag9kyuf6azs4ylojkyrui4s    ubuntu-002  Ready   Active        Reachable
a7kyx0ut9xn9mct2ersixuesz *  ubuntu-003  Ready   Active        Reachable
```

## 個別のノードの状態確認

```bash:個別ノードの状態確認
docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
 ～～～～中略～～～～
Swarm: active
 NodeID: a7kyx0ut9xn9mct2ersixuesz
 Is Manager: true
 ClusterID: 1m4lxrlz5u1obrptp0n8zw60t
 Managers: 3
 Nodes: 3
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot interval: 10000
  Heartbeat tick: 1
  Election tick: 3
 Dispatcher:
  Heartbeat period: 5 seconds
 CA configuration:
  Expiry duration: 3 months
 Node Address: 192.168.100.21
～～～～中略～～～～
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
Insecure Registries:
 127.0.0.0/8
```

Swarmがactiveとなっており、クラスタは動作している。
Python3から直接YQLのAPIにアクセスしてみる

```py3
import json
import urllib.parse
import urllib.request

def send(query, fmt='json'):
    """send query to yahoo api"""
    response = urllib.request.urlopen(__urlbuilder(query, fmt))
    data = json.loads(response.read().decode('utf-8'))
    return data

def __urlbuilder(yql_query, fmt):
    """urlencode yql query"""
    base_url = 'https://query.yahooapis.com/v1/public/yql?'
    query = {
        'q': yql_query,
        'format': fmt,
        'env': 'store://datatables.org/alltableswithkeys'
        }
    url = base_url + urllib.parse.urlencode(query)
    return url

if __name__ == '__main__':
    data = send(query = 'select * from yahoo.finance.historicaldata where symbol in ("EUR=X") and startDate = "2014-01-01" and endDate = "2014-12-31"')
    quotes = data['query']['results']['quote']
    print(quotes)
```
Lispboxでinit.elを手っ取り早く読み込ませる方法

[Lispbox](https://common-lisp.net/project/lispbox/)を導入したはいいもののEmacsの設定ができなかったのでいろいろ試してみた
とりあえずC-hをバックスペースに割り当てることと、カラースキームを割り当てることができたのでメモ
もっと良いやり方があればぜひ教えてください

参考：http://stackoverflow.com/questions/5839829/how-to-load-emacs-configuration-file-in-lispbox

OS: Windows10

---
結論から言うと以下のフォルダに`init.el`などをぶち込んで`lispbox.bat`を書き換える

```
[Lispboxを解凍したディレクトリ]\lispbox-0.7\emacs-23.2\site-lisp
```

フォルダには`init.el`とカラースキームの定義ファイル`gnupack-dark-theme.el`を配置

---

###`lispbox.bat`の編集
19行目に

```bat
set TO_EVAL="(progn (load \"lispbox\") (slime))"`
```
以下のように追記する

```bat
set TO_EVAL="(progn (load \"lispbox\") (load \"init\") (load\"gnupack-dark-theme\") (slime))"
```

該当箇所は以下のようになる

```bat
set EMACS=%LISPBOX_HOME%/emacs-23.2/bin/runemacs.exe
set TO_EVAL="(progn (load \"lispbox\") (load \"init\") (load\"gnupack-dark-theme\") (slime))"

%EMACS% --no-init-file --no-site-file --eval=%TO_EVAL%
```

###`init.el`には以下のように記述

```cl
;; C-hをバックスペースに変更
(keyboard-translate ?\C-h ?\C-?)
;; 別のキーバインドにヘルプを割り当てる
(define-key global-map (kbd "C-x ?") 'help-command)
```
構成管理したサーバーにSSHした不届き者に警告メッセージを出してみる

本当にちょっとしたサーバーも手動は嫌でChefか何かで構成管理しないと済まない性分なので、手動でいじられないようにSSHした人に警告メッセージを出してみる方法を調べてみた。

## 例えばAmazon Linuxでやるとこんなかんじ

```
$ ssh somehost
Last login: Sat Aug 13 16:56:53 2016 from 0.0.0.0

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
#######################################################
## WARNING: THIS SERVER IS CONFIGURED WITH ANSIBLE!! ##
#######################################################
！このサーバーはItamaeで構成管理されています。　　　 ！
！緊急時を除き、Itamaeを使わない手動での設定変更等は！
！絶対に行わないでください　　　　　　　　　　　　　 ！
#######################################################
$ 
```

## Motdを使う

Linuxでmotd（message of the day）を使うとこれが実現できます。

`/etc/update-motd.d/` というディレクトリにスクリプトを入れると、sshした時にそのコマンドを実行してくれる。シェルスクリプトでもPerlスクリプトでもなんでもいい。

複数ファイルが有った場合は辞書順で実行されるので、頭に数字などをつけて順番をコントロールする場合が多いのかな。スクリプトを配置したら`sudo update-motd`で反映できます。

Amazon Linuxだと例えば以下のようになっていました。EC2である旨を表示するものと、アップデートできるyumパッケージがいくつかるかを表示しているみたい。

```
$ ls /etc/update-motd.d/
30-banner  70-available-updates  75-system-update
```

今回は以下の様なメッセージを表示させたいので、以下の様なファイルを作ってこれを適切な名前で配置することで実現しようと思います。

```motd.txt
cat << EOF
#######################################################
## WARNING: THIS SERVER IS CONFIGURED WITH ANSIBLE!! ##
#######################################################
！このサーバーはItamaeで構成管理されています。　　　 ！
！緊急時を除き、Itamaeを使わない手動での設定変更等は！
！絶対に行わないでください　　　　　　　　　　　　　 ！
#######################################################
EOF
```


## Ansibleで書いた例

```
tasks:
  - name: Add login message
    copy: src=motd.txt dest=/etc/update-motd.d/99-ansible-warning mode=0744
    notify: Reflect motd changes
handlers:
  - name: Reflect motd changes
    shell: "update-motd"
```


## Itamaeで書いた例

```
remote_file "/etc/update-motd.d/99-itamae-warning" do
    source "files/motd.txt"
    mode "0744"
    notifies :run, "execute[update-motd]"
end

execute "update-motd" do
    command "update-motd"
    action :nothing
end
```

## おわりに

これを自分ツールとして毎回使うと便利？？
そもそも勝手にサーバー作るなっていう話ですが、どうしてもどうしてもさっさと作んなきゃとか特別な事情があって勝手に作る時もこういう配慮はしておきたいものです。
Django:マルチバイトファイル名でダウンロードさせる方法

# 目的
リクエストに対してマルチバイトファイル名でファイルダウンロードさせる。

# httpでファイルダウンロード
httpの決まり事として、ファイルをダウンロードさせたいときは、レスポンスに Content-Dispositionヘッダを含めれば良いことになっています。

```
Content-Disposition: attachment; filename="filename.txt"
```

# Djangoの記述
下記で期待通り動きます。ただし、ファイル名がascii文字の場合です。

```py3
from django.http import HttpResponse
def index(request):
    content = 'body1'
    response = HttpResponse(content, content_type='text/plain')
    response['Content-Disposition'] = 'attachment; filename="filename.txt"'
    return response
```

# マルチバイト文字の場合

単純に記述してみます。

```py3
response['Content-Disposition'] = 'attachment; filename="ファイル.txt"'
```

ヘッダは下記のようになります。UTF8-MIME-Base64のようにみえます。
実際、email.header.Headerを使ってエンコードしているようです。

```
Content-Disposition: =?utf-8?b?YXR0YWNobWVudDsgZmlsZW5hbWU9IuODleOCoeOCpOODqy50eHQi?=
```

- これが正しい挙動なのか調べていませんが、とりあえず手元のWebブラウザではファイルをダウンロードするように解釈してくれないようです。

# 対応方法

ファイル名部分だけをURLエンコードしてセットします。

```py3
import urllib.parse
response['Content-Disposition'] = 'attachment; filename="{fn}"'.format(fn=urllib.parse.quote("ファイル.txt"))
```

* ヘッダは下記のようになり、Webブラウザも期待通り、ファイルダウンロードレスポンスとして動作してくれます。

```
 Content-Disposition: attachment; filename="%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB.txt"
```
Builder.pm を書き換えて、Carton で prompt オプションを使う

Mac に Carton で `CSS::Sass` をインストールしようとしたら、
`ld: unknown option: --no-as-needed`
というエラーが出た。

`cpanm` で `--prompt` を使って処理を止め、
`Makefile.PL` から、該当のオプション群を削除したら通った。

しかし、`carton` で `--prompt`を使う方法が分からなかった。

仕方ないので、直接ファイルを書き換えた。

`vi ~/.plenv/versions/5.25.3/lib/perl5/site_perl/5.25.3/Carton/Builder.pm`

Carton の Builder.pm の install に、`--prompt` を付けると、止まってくれる。 

```
 47 sub install {
 48     my($self, $path) = @_;
 49
 50     $self->run_cpanm(
 51         "-L", $path,
 52         (map { ("--mirror", $_->url) } $self->effective_mirrors),
 53         ( $self->index ? ("--mirror-index", $self->index) : () ),
 54         ( $self->cascade ? "--cascade-search" : () ),
 55         ( $self->custom_mirror ? "--mirror-only" : () ),
 56         "--save-dists", "$path/cache",
 57         $self->groups,
 58         "--cpanfile", $self->cpanfile,
 59         "--installdeps", $self->cpanfile->dirname,
 60         "--prompt"
 61     ) or die "Installing modules failed\n";
 62 }
```

どうするのが正道なのだろうか。