OmniAICreator/Qiita-1.07M huggingface dataset:
iPad miniの写真をパソコンに取り込む

iPad miniの写真が多くなりましたが削除すると惜しくなるのでパソコンに転送したいですか？iPad miniの写真を直接パソコン上で使うためにパソコンに移すのですか？これらのことはiTunesを利用しても無理ですが、この文章の手順に従えば、たった３歩でiPad miniからパソコンに写真を取り込めます。

必要なツール：AnyTrans

AnyTransは専門のiOSデバイスのデータを転送＆バックアップ＆管理するツールで、iPad miniの写真をパソコンに取り込むのは高効率的に実現できます。AnyTransを使えば、さらに次のメリットがあります。

1.手順が簡単。たった３歩でiPad miniの写真をパソコンに移す
2.スピードが速い。20枚の写真を１秒で転送完了
3.直感的なインタフェース。初心者にも気楽に転送できる
4.柔軟な操作。希望通りの写真だけを転送でき、一括転送もできる
5.画像のサイズと画質が変わらない
6.パソコン以外、iPad miniの写真を他のiOSデバイスへの転送もでき、各逆方向の転送もできる
7.より多くの機能。写真以外、また音楽・ビデオ・連絡先・メッセージ・APP・メモ・カレンダー・ブック・Safari・ファイルシステム・iTunes U・Podcastを転送できる


iPad miniの写真をパソコンに取り込む手順

Step1. AnyTransをダウンロード＆インストール＞iPad miniを繋ぎ＞AnyTransを立ち上げます。

Step2.「カテゴリ」画面で「写真」を開いて、目標写真までクリックします。

Step3.取り出したい写真を選択して、「PCへ転送」ボタンをクリックします。（複数の写真を選択する場合は、「Ctrl」キーを押しながらクリックします。）

注：ボタンをクリックする前に、ボタンをクリックすれば、出力先も設定できます。

最後に

上記の手順を従うと、iPad mini/iPad Pro/iPad Airの写真をパソコンに転送することは気楽にできます。それに、写真を個別に転送できますから、他のデータの上書き等の問題は決して出ません。また、AnyTransは購入前に無料試用でき、しかも60日間全額返金保証が付いていますので、安心してご利用ください。

ここではiPadの写真をパソコンに転送する2つの方法も付きますが、参考してください。
https://www.imobie.jp/support/can-i-transfer-photos-from-pc-to-my-ipad.htm
Yarn (yarnpkg) インストール覚書

社内向けに **Yarn** のインストール方法をメモ書きします。

![Yarn](https://yarnpkg.com/assets/og_image.png)

## Homebrew をインストール

下記をターミナルにコピペして実行してください。
たったそれだけでインストールが完了します。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## Yarn をインストール

先ほどの Homebrew を使用して Yarn をインストールします。
下記をコピペして実行してください。

```
brew update && brew install yarn
```

## npm でもインストール可能

Homebrew がうまくインストールされないよ！という方は、npm でもインストール可能です。

```
npm install --global yarn
```

## pathを通す

`/Users/ユーザー名/` にある、`.bash_profile` ファイルに下記を追記します。
※なければ新規作成してください。

```
export PATH="$PATH:`yarn global bin`"
```

追記できたら、上書き保存しましょう。

## Yarn の動作確認

下記のコマンドを実行して、バージョンが表示されれば Yarn のインストール完了です。

```
yarn -v
```

## Yarn の基本的な使い方

下記のコマンドで `package.json` に記述されているモジュールを一括インストール可能です。

```
yarn install
```

または

```
yarn
```

感覚的には `npm` コマンドと変わらないのですが、一部変更があるので注意が必要です。

### モジュールの個別インストール

```:npmの場合
npm install モジュール名
```

```:yarnの場合
yarn add モジュール名
```

### モジュールの個別アンインストール

```:npmの場合
npm uninstall モジュール名
```

```:yarnの場合
yarn remove モジュール名
```

### モジュールの個別アップデート

```:npmの場合
npm update モジュール名
```

```:yarnの場合
yarn upgrade モジュール名
```

## その他のオプション

詳しくは `yarn help` コマンドで確認してください。

## 参考サイト

- [Yarn(本家)](https://yarnpkg.com/en/)
- [npm互換のJavaScriptパッケージマネージャーYarn入門](https://ics.media/entry/13838)
- [yarnがnpmと何が違うのか試してみた](http://qiita.com/0829/items/ec5271c06f8ff0633dd3)
Tableau_カテゴリ別売上を特定の年の売上順で並べ替える

# 概要
地域別 × サブカテゴリの売上を特定の年で降順で表示したい場合、
単純に並べ替えしようとしてもうまくいきません…。

![qiita01.JPG](https://qiita-image-store.s3.amazonaws.com/0/128864/c8544bad-292c-41fe-7b63-27cac081ddc3.jpeg)


これを2015年の売上順に並べ替えようとすると…

![qiita02.JPG](https://qiita-image-store.s3.amazonaws.com/0/128864/72494b2c-211d-1c4e-63e6-83015ba6f73e.jpeg)


このように、きれいに並べ替えができません。


今回は、このようなケースで売上順に並べ替えるTableau Tipsを紹介します。


# 環境
OS: Windows7
Tableauのバージョン: 10.1
データソース：サンプル - スーパーストア


# 手順
## **結論：結合フィールドを使って並べ替え**
今回のケースは、「地域別」「サブカテゴリー別」の売上なので、
「地域」と「サブカテゴリー」の結合フィールドを作成します。

### ⅰ.「地域」と「サブカテゴリ」のディメンションを選択
　　![qiita03.JPG](https://qiita-image-store.s3.amazonaws.com/0/128864/2c61b5b5-35f6-a23a-19c7-e23c70c51578.jpeg)

### ⅱ.右クリック → 「作成」 → 「結合済みフィールド」を選択
このようなフィールドが生成されます。
　　![qiita04.JPG](https://qiita-image-store.s3.amazonaws.com/0/128864/baa1f6f3-7667-bb55-deac-89caae17470d.jpeg)

### ⅲ.作成した結合済みフィールドを、行の「地域」と「サブカテゴリ」の間にドラッグ
![qiita05.JPG](https://qiita-image-store.s3.amazonaws.com/0/128864/43124d0d-a99d-e091-cefa-9125ff041fca.jpeg)

### ⅳ.結合済みフィールドのプルダウンメニューから「並べ替え」を選択し、下記のように設定
![qiita06.JPG](https://qiita-image-store.s3.amazonaws.com/0/128864/cdc61561-b659-4af8-d7a0-6253360b51c4.jpeg)

### ⅴ.結合済みフィールドを非表示にする。結合済みフィールドのプルダウンメニューから「ヘッダーの表示」を選択
このような状態になります。
![qiita07.JPG](https://qiita-image-store.s3.amazonaws.com/0/128864/8ba3d42c-f018-c73e-4ba7-ad313243cf64.jpeg)

### ⅵ.この状態で2015年の並べ替えを行うと…
![qiita08.JPG](https://qiita-image-store.s3.amazonaws.com/0/128864/21c213eb-b2c0-4794-f497-ed10976440fe.jpeg)

**2015年の売上順（降順）できれいに並べ替えができました！**


もちろん、2016年も同様に並べ替えが可能。

![qiita09.JPG](https://qiita-image-store.s3.amazonaws.com/0/128864/127ccf45-7afb-7ed3-26f2-3966794db055.jpeg)


# まとめ
今回は、結合フィールドを使って並べ替える方法を紹介しました。
この他にもランク関数を使った並べ替え方法もあります。

ランク関数については別記事で紹介しようと思います。
テスト分析とテスト設計勉強会に参加してきました

# テスト分析とテスト設計勉強会

テスト分析とテスト設計勉強会に参加してきました  

イベント概要は以下です 
[https://connpass.com/event/47938](https://connpass.com/event/47938)  

## JSTQBのテストプロセスについて

JSTQBって...ISTQB 国際的なテスト技術者資格の日本版 
一応持っているけども、10年近く前に取ったので、だいぶ忘れている...

### JSTQBのテストプロセスの概要

#### プロセスって？ JSTQBのテストプロセス

- なにかしらの入力があって、なにかしらの活動があって、なにかしらの出力 → プロセス
    - 煮るというプロセスなら、乾麺及びお湯が入力で、お湯に乾麺を入れるという活動、柔らかいパスタができあがる＝出力
- テスト計画〜テスト終了作業までがJSTQBのプロセス

### テストレベルやテストフェーズとの関係

アジャイル開発では、TDDがいいんだと思う

### テスト分析とテスト設計

プロセスは活動の連鎖

#### テスト分析

- テストベース...テストのもとになるもの(要件定義だったり、設計書だったり)
    - APIならI/F
- テスト条件
    - 画面、画面の部品
    - それに対しての目的は「消費税が反映されている」とか
- テスト設計
    - テストカバレッジ...どこまで網羅するか考える
    - 事前条件、入力、期待結果、事後条件を考える
    - カバレッジをどこまでやるか(テストの網羅性)は、テスト対象への要求によって、決める

### 構造化分析と構造化設計

分析と設計は違う 
分析とは、行動をとる前に実施するもの

## テスト分析と設計について、釈然としないところ

SIerの品質保証部の方

- 分析と設計を分ける必要性を感じない
    - 分析のアウトプットが曖昧と感じている
    - テスト要求分析や、テスト対象分析という言葉ならまだわかりやすい
    - 仕様書だけを分析対象にしておくと、テストケースの漏れが生じることがあるので、仕様以外の元ネタも必要
    - どこまでが分析で、どこまでが設計かわかりにくい
    - テスト分析とテスト設計はセットなのではないか
    - 「テスト分析」は何をもって終了なのか
- テスト分析...仕様の中身を抜き出して、整理して、仕様を読み解くということなのではないか
    - 理解できる様に分けること、理解できるように小さい単位に分けることなのではないか
    - 仕様を分析して、仕様A,B,Cに整理する
- テスト設計...必要なテストを洗い出す、必要なテストを絞り込む
- テスト設計をしておくと、カバレッジの説明もできる (テスト設計とは、テストの観点と同義か）

## ゆもつよメソッドにおけるテスト分析とテスト設計

豆蔵に在籍していた人、テストコンサルタント 
「テスト分析と設計について、釈然としないところ」を踏まえた発表

### テスト分析

(ソフトウェアの開発に関わらず)分析とは対象をよく理解すること 
「食品分析」で「体にいいものかどうか」という観点なら、
食品に体にいいものがどのくらい含まれているか調査する 
→ 観点によって、分析の仕方は変わる

### テスト設計

仕様をもとに対象物の骨組みを決めること　
対象物を作成する上での問題を解決すること

## テスト分析とテスト設計はなぜ分けるか

- 求められるスキルが異なる
    - テストの分析はドメインへの知識が必要
    - テスト設計は、テスト設計スキル
        - テストスイート ケース1,2,3...
        - 直交法とか
    - ざっくり言うと、テスト分析も、テスト設計の一工程
        - 分業が進んだため、２つに別れていった
- テスト分析の成果物は、各プロジェクトにおいて適宜決めればよい

### ゆもつよメソッドって

JSTQBだと曖昧なものを具体化したもの 
テスト計画、テスト分析、テスト設計、詳細設計、テスト実装、それぞれの工程ででやることを明確にしたもの 
※ 雑誌「ソフトウェアテスト」参照のこと

## テスコン優勝事例におけるテスト分析・設計の解説

分析は世界の整理、設計は課題解決 
分析は材料集め、設計は料理、くらい違う

### 家を建てるときの分析(注文住宅の場合)

- 分析の登場人物は、住む人、営業、設計士
- 設計は、設計士、現場監督、大工、営業
     - 住む人も登場するが、設計図面で要求が満たされているか確認するだけ
- 分析と設計を理解しようと思ったら、まずはテストで考えない方がいい
- テスト分析
  - どういうテストをするか
  - テストの範囲をどこまでやるか

## 大学祭の模擬店でデザインの力と感じた話


諸事情でメモ取れず... 
発表者の方がかわいかった！
フィルターギャラリーを使おうとすると「仮想タイルはこれ以上割り当てられません」とゆうエラーがでるときは仮想ディスクが割り当てられてない可能性をうたがうべき

# タイトルで全て言った

![mem-error.png](https://qiita-image-store.s3.amazonaws.com/0/34041/3c8391fb-9f8b-82fa-dca5-e9a1a1a21747.png)
撮影地: Photoshop CC 2017.0.1リリース(Windows版)


- 仮想タイルってなんやねん
- 今どれぐらい割り当てられてんねん
- 結局どうしたらえぇねん

# Photoshopで仮想とゆわれたら仮想ディスクしかおもいつかん

編集 > 環境設定 > 仮想記憶ディスク をみたら、いっこもチェック入ってなかったので、チェック入れて再起動したら直った。

![panel.png](https://qiita-image-store.s3.amazonaws.com/0/34041/5ea4f874-e969-6248-7ed6-c4729cad569b.png)

# 関連リンク

- [世界のタイル博物館](http://www1.lixil.co.jp/museum/) - 古今東西のタイルが見られるが、仮想タイルは展示してなかったと思う。
reflect はどの程度遅いのか、あるいは generate はどの程度速いのか

# はじめに

* [前回](http://qiita.com/nirasan/items/d9399394b57a72e6a90f) go generate について調べたので自分でもなにか作ってみたくなった。
* 構造体フィールドのタグでバリデーションやデフォルト値の設定ができるものがあると便利だと思ったので作ってみる。
* 有名なもので [validator](https://github.com/go-playground/validator) とかあるがデフォルト値を指定できないし、遅いとよく聞く reflect を使っているので generate でバリデータを生成するものを作っても多少は有用そう。
* ただ本当に reflect が遅いかどうかを実際に計測したことがないので確認してみる。

# 比較のためにつくるもの

* Go では他の言語の名前付き引数のようなことをしたい場合に `type MyArg struct { Arg1, Arg2 int }` のような小さい構造体を作って `MyFunc(MyArg{ Arg1: 1, Arg2: 2 })` のように使うパターンが有る。
* このとき引数用の構造体のフィールドのタグで引数のバリデーションやデフォルト値の設定ができるようなものをつくってみる。
* とりあえず比較のための仮実装なので `int` 型だけ対応する。

```go
type MyArg struct {
  // タグの arg キーでオプションを指定できる
  Arg1 int `arg:"default=5"`
  // オプションはカンマ区切りで複数指定できる
  // `name=val` という形式で、最小値チェックの `min`、最大値チェックの `max`、デフォルト値設定の `default` だけ実装する
  Arg2 int `arg:"min=0,max=10,default=5"`
}
```

# 実装

* 本体の実装は [こちら](https://gist.github.com/nirasan/4482b05ef6e2e273b606dc7a81acacdf)
* ベンチマークは [こちら](https://gist.github.com/nirasan/3d6ad5e08dbe950a112a892a54f303d0)

# 比較結果

* 話に聞く通り reflect は generate (で生成される予定のコードの) 約 60 倍程度遅い
* とはいえ激遅というわけでもないが GAE/Go とかで数十 ns でレスポンス返してる！すごい！とか楽しみたい場合は 180ns が 3ns になるのは嬉しいのでこのまま実装進めてみる。

```
BenchmarkValidReflect-4         10000000               188 ns/op
BenchmarkValidGenerate-4        500000000                3.33 ns/op
```
Mailgun を使って Node.js からメールを送信する

## TL; DR
- [Mailgun](http://www.mailgun.com/) を使うと、SMTP サーバー不要で容易ににメールを送信することができる
- [mailgun-js](https://www.npmjs.com/package/mailgun-js) が最もメンテされ、公式も推奨しているライブラリ
- callback スタイルと Promise スタイルのどちらでも使えて便利
- 日本語は UTF-8 で送られるので、一部のレガシー環境にも送る場合は注意が必要

## Mailgun とは ?
Mailgun はメール配信・受信を請け負うクラウドサービス (SaaS) です。

類似サービスでは、Amazon SES や SendGrid が日本では有名です。

## Mailgun を使ったメール送信の方法
以下の二種類の方法が用意されています [^1]。

1. Mailgun が用意した REST API を使う方法
  - メリット: 速い (公式曰く SMTP に比べ x3)、スケールし易い
2. SMTP を使う方法
  - メリット: 既存のアプリに適応し易い、プロトコルがオープン

この記事では、前者の専用の API を叩く方法を説明します。

## mailgun-js モジュールを使ってメールを送る方法
[mailgun-js](https://www.npmjs.com/package/mailgun-js) というライブラリが公式のチュートリアルで紹介されているため [^2]、これを使うのがおそらくベストだと考えられます。

メールを送信するには API キーが必要であるため、事前に [Mailgun](http://www.mailgun.com/) のアカウントを作成しドメインを登録しておきます。登録するドメインは、自らが所有しているドメインである必要があります [^3]。

はじめに、現在のプロジェクトにライブラリをインストールします。

```
$ npm i -S mailgun-js
```

もしくは、

```
$ yarn add mailgun-js
```

続いて、メールを送るコードを記述します [^4]。


```js
'use strict'

const apiKey = 'key-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
const domain = 'mydomain.com'

const mailgun = require('mailgun-js')({ apiKey, domain })

const data = {
  from: 'Renge Miyauchi <postmaster@mydomain.com>',
  to: 'Chitose Karasuma <chitose@kanzenshori.com>',
  subject: 'nyanpass',
  text: 'にゃんぱす〜',
}

mailgun.messages().send(data)
  .then(body => console.log(body))
  .catch(err => console.error(err)
```

正常に送信された場合、以下のように標準出力に表示されます。

```js
{ id: '<2017020800000.12345.12345.XXXXXXXX@mydomain.com>',
  message: 'Queued. Thank you.' }
```

コールバック形式として記述することもできます。その場合は、以下のように記述します。

```js
mailgun.messages().send(data, (err, body) => {
  if (err) { return console.error(err) }
  console.log(body)
})
```

件名や本文として日本語を指定した場合は、UTF-8 として送信されます。

以下は実際に Mailgun から送信したメールのヘッダの抜粋です。件名は UTF-8 + Base64 の MIME ヘッダとして、本文は UTF-8 の quoted-printable として送られているようです。

```
Subject: =?utf-8?b?44Gr44KD44KT44Gx44GZ?=
Content-Type: text/plain; charset="utf-8"
Mime-Version: 1.0
Content-Transfer-Encoding: quoted-printable

=E3=81=AB=E3=82=83=E3=82=93=E3=81=B1=E3=81=99
```

UTF-8 が処理できない一部のレガシー環境にも届ける必要がある場合は、注意が必要そうです。

## まとめ
Mailgun を使うと気軽にメールを送信することもできます。

メールの受信やフィルタを使った転送もできたりと意外に高機能なので、機会があれば使ってみて下さい。


[^1]: https://documentation.mailgun.com/quickstart-sending.html#how-to-start-sending-email
[^2]: http://blog.mailgun.com/how-to-send-transactional-emails-in-a-nodejs-app-using-the-mailgun-api/
[^3]: ドメインを登録しなくても、制限付きのサンドボックス用アカウントから送ることもできます
[^4]: 記事を書いた時点の最新の LTS である Node v6.9.4 で動作確認を行っています
ul li で・をなくして左詰めにしたい

お世話になっております。

未だにidとclassの指定方法が曖昧かも知れませんが

```html
<div id="categories">
<ul>
<li><a href="soft1.html">soft1</a></li>
<li><a href="soft2.html">soft2</a></li>
<li><a href="soft3.html">soft3</a></li>
<li><a href="soft4.html">soft4</a></li>
</ul>
</div>

```

```css
div#categories ul{
	list-style-type: none;
	text-align: left;
}
```
で上手く動作するはずですよね？？？

((+_+))私の勘違いなのだろうか……
聚會感想 - RxSwift 的相依性


昨天去了京橋和秋葉原兩邊 Swift 聚會合辦的 "[Kyobashi.swift x AKIBA.swift 合同勉強会](https://kyobashi-swift.connpass.com/event/48794/)" 、這篇是其中一篇感想

[日本語のバージョンこちらへ](http://qiita.com/vc7/items/182c13f244a85f64b39a)

==

昨天晚上聽了 Takeshi Ihara 發表的 「想了一下 RxSwift 的相依性」 （原文：RxSwiftへの依存を考えてみる）　，有了一些感想，就寫了這篇。分享用的簡報在 [這裡](https://speakerdeck.com/nonchalant/rxswifthefalseyi-cun-wokao-etemiru) 。

關於使用 RxSwift 產生的相依性問題，這點也是我一直在思考的問題

其實在這個充斥著「來用 RxSwift 唄」的環境之下，有了身為對 RxSwift 經驗的開發者分享這樣的心得、內容應該也算滿有價值的，總之各種原因之下，聽到的時候還滿開心的。

就像 Ihara さん在分享的內容提到的，
如果程式碼本身想要跟其他的專案共用（甚至是非 RxSwift 專案），
又或者是想要進行模組化、公開成 library 給其他人用這點來思考看看的話，
的確在使用 RxSwift 、產生相依性的情形之下，
可能就會比較難達成。

不可否認的， RxSwift 的確有他方便好用的地方，功能似乎也非常強大，
不過如果再程式碼重用等角度來考慮的話，
例如重用頻率很高的 UI 元件等等，
去除 RxSwift 的相依性之後，
說不定會有比較好成果出來～ :smile:
IntelliJ キーマップカスタムメモ

Main menu | Edit | Find | Add Selection for Next Occurrence
→Ctrl-g

Main menu | Edit | Find | Select All Occurrences
→Ctrl-Cmd-g

Editor Actions | Duplicate Line or Selection
→Cmd-d

Editor Actions | Clone Caret Below
→Option-Return

Editor Actions | Delete
→Ctrl-d

Editor Actions | Extend Selection
→Cmd-w

Main menu | Edit | Paste
→Ctrl-y

Main menu | Window | Editor Tabs | Close
→Ctrl-q

※Emacs移動は検討中
勉強会感想 - RxSwiftへの依存

昨日、 "[Kyobashi.swift x AKIBA.swift 合同勉強会](https://kyobashi-swift.connpass.com/event/48794/)" に行きました。この文は感想文の一つです。

[繁體中文的版本可以到這邊看](http://qiita.com/vc7/items/50927dbf59c38a46a784)

台湾人の vc7 です
日本語で書きてみました、もし不明や間違い所があったら、教えていただければ、幸いです :smile: 

==

昨夜　Takeshi Ihara さん発表した　「RxSwiftへの依存を考えてみる」　について、感想文を書きてみます。 Slide は　[こちら](https://speakerdeck.com/nonchalant/rxswifthefalseyi-cun-wokao-etemiru)　へ。

RxSwift との依存はこれを使うかとうか、僕ずっと考えています。

そして、 RxSwift 使ってみましょうの声がいっぱいの環境で、このようなトークがあって、発表者も RxSwift も経験者なので内容の価値があって、などなどの理由で、すごく嬉しかった。

Ihara さんの話通り、もしも、あるコードベースを他のプロジェクトと共有したい、
あるいは、ライブラリー化できるなどのもとに考えみて、
確かに RxSwift を使ったら、ちょっとし辛いかもしれませんね。

RxSwift 確かにパワーが持って、
しかし、
使う理由とコードの再利用の上にちゃんと考えて、
UI 部品など RxSwift を抜けて、
いい感じになるかもしれませんね。
手順書の作り方についての個人的まとめ

#この記事を書いた理由#
ITとはちょっと外れてしまいますが、自分の仕事のやり方を固めていくために教えられたこと、考えたことを記載していきます。

#何が書かれていればいいのか・・・#

手順書を作るために欲しいもの

| 事項       |       説明|
|:-----------------|:------------------|
|作業目的・概要|目的・概要が分からないと、実施することも分からないため。背景知識、用語も書かれているとよりグッド|
|各手順の概要・目的|個別の手順が分かっていても、抽象化しないと何をやっているか掴みずらいため 例 実作業のための準備等|
|詳細手順|具体的な手順のこと。具体的じゃないと誰でも実施できないため。誰でもできるレベルに落とし込むこと。 例 コマンドを発行するなら、コマンド文まで書く|
|工数|どれくらいで終えられるか分からないと実施時間を報告できないため|
|検証(手順)|insert,update,deleteなどのSQLを手順内で発行するなら、結果が正しいか検証すること|
|事前確認点|作業をきちんと始められるかを確認するチェックリストのこと|
|事後確認点|作業がきちんと終わっているかを確認するチェックリストのこと|
|問題対応表|問題が起こったときの対処法を記録するもの。次回、問題が起こっても安心|
|QA表|作業の疑問点を洗い出す。また作業者から質問されたときに答えるために使う|
|レビュー|手順に抜け漏れ無駄があるか、誰でもできるレベルか、検証は成立しているか、を見てもらう|

詰まるようなら、何が問題なのか


| 現象       |       原因 |    対応策    |
|:-----------------|:------------------|:------------------|
| 作成に時間がかかる|無駄な作業がある |すべての手順に画面エビデンスを使っていないか|
| 検証する手順が分からない  |検証の実現方法が分からない |どうやって検証すればいいかを聞く       |
技術英語 > the items (that follow it) move back (to take the deleted item's space) / move over a little / make room for 

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

> When you delete an item by its position in the list, the items that follow it move back to take the deleted item's space,

3つに分けてみる

- the items that follow it
- the items move back
- to take the deleted item's space

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

> Could you move over a little to make room for other ...

http://eow.alc.co.jp/search?q=move+over+a+little
http://ejje.weblio.jp/content/make+room
Vagrant + chef-zero 入門以前

開発環境を Vagrant + chef-zero で作成しようと思ったが、
chef-solo の時よりつまづきポイントが多かったので
"入門以前" ということで手順を作成しました。

# 前提
* Mac で行う
* Vagrant がインストールされている

# 事前準備
* ChefDK をインストール

```
$ curl -L https://www.chef.io/chef/install.sh | sudo bash -s -- -P chefdk
```

* knife-zero をインストール

```
$ sudo chef gem install knife-zero chef-zero --no-ri --no-rdoc
```

* 環境変数 EDITOR を設定しておく

```
$ vi ~/.zshrc            # 使っているシェルに合わせて適宜変更

export "EDITOR=emacs"    # 好きなエディタで設定
```

# Vagrant設定

* 任意の作業ディレクトリに移動

```
$ cd ~/Vagrant
```

* プロジェクト名とVagrant Box名を変数に入れておきます

```
$ PROJECT_NAME=development
$ BOX_NAME=centos/7
```

* 今回の作業ディレクトリを作成してそこに移動しておく

```
$ mkdir ${PROJECT_NAME}
$ cd ${PROJECT_NAME}
```

* Vagrantfile作成

```
$ vagrant init ${BOX_NAME}

$ vi Vagrantfile
```

* network設定をコメントアウト

```text:Vagrantfile
# config.vm.network "private_network", ip: "xxx.xxx.xxx.xxx"
↓
config.vm.network "private_network", ip: "xxx.xxx.xxx.xxx"
```

* Vagrantを起動

```
$ vagrant up --provider virtualbox
```

* SSH設定を .ssh/config に記載しておく

```
$ vagrant ssh-config --host ${BOX_NAME} >> ~/.ssh/config
```

# knife-zero で chef を設定

* knife.rb を作成

```
$ mkdir chef-repo
$ cd chef-repo
$ vi knife.rb
```

```rb:knife.rb
local_mode true
chef_repo_path File.expand_path('../', __FILE__)

knife[:use_sudo] = true

knife[:automatic_attribute_whitelist] = %w[
  os
  os_version
  hostname
  ipaddress
  roles
  recipes
  platform
  platform_version
  cloud
  cloud_v2
  chef_packages
]
```

* ノードを登録

```
$ chef exec knife zero bootstrap ${BOX_NAME} --node-name ${PROJECT_NAME}
```

* ノードリストを表示

```
$ chef exec knife node list
```

* ノードの詳細を確認

```
$ chef exec knife node show ${PROJECT_NAME}
```

* ノード設定ファイルを作成

```
$ vi nodes/${PROJECT_NAME}.json
```

* normal 配下に FQDN設定 を付け足す

```json:${PROJECT_NAME}.json
# 変更前
"normal": {
    "knife_zero": {
      "host": "{ホスト名}"
    },

# 変更後
"normal": {
    "knife_zero": {
      "host": "{ホスト名}"
    },
    "fqdn": "{ホスト名}",  # <<<<< {ホスト名}は ${BOX_NAME} と同じ
```

* 共通cookbookを作成（今回は common という名称で作成）

```
$ chef exec knife cookbook create common
```

* レシピに net-tools を設定

```
$ vi cookbooks/common/recipes/default.rb
```

```rb:cookbooks/common/recipes/default.rb
package "net-tools" do
    action :install
end
```

* ノードに対する run_list に common を設定

```
$ chef exec knife node run_list add ${PROJECT_NAME} common
```

* knife zero converge を実行

```
$ chef exec knife zero converge "name:${PROJECT_NAME}"
```

# 動作確認

* VagrantにSSHログイン

```
$ ssh ${BOX_NAME}

# または
$ vagrant ssh
```

* ifconfig を実行

```
$ sudo ifconfig
```

* ifconfig が実行できれば net-tools がインストールされている

これで、あとは開発環境用にレシピをもりもり書いて行けば大丈夫そうです。
MATLABで2つy軸があるグラフの画像をちゃんと保存するには

## モチベーション
MATLABで両側に異なるy軸をもったグラフをプロットするには、最新のバージョンでは[yyaxis](https://jp.mathworks.com/help/matlab/ref/yyaxis.html)、古いバージョンでは[plotyy](https://jp.mathworks.com/help/matlab/ref/plotyy.html)を使うようです。

しかし、少なくともバージョンR2015bでの`plotyy`では、図の大きさや、軸の値ラベルのフォントサイズを調整しようとすると、うまく表示できません。
例 : 

```matlab
xs = linspace(0, 100);
ys1 = xs.^2;
ys2 = 2 * xs + 50;
[hAx,hLine1,hLine2] = plotyy(xs, ys1, xs, ys2);
set(hAx(2), 'FontSize', 30);
```

![スクリーンショット 2017-02-09 0.59.59.jpg](https://qiita-image-store.s3.amazonaws.com/0/35175/3e5c4557-1109-27ab-7fcb-26bb422d3523.jpeg)

任意の図の大きさ、フォントサイズでちゃんとプロットしたものすべてが収まるようにするにはどうしたらいいのか、というのが本記事の内容です。

## どうするか

次のようにします

```matlab
xs = linspace(0, 100);
ys1 = xs.^2;
ys2 = 2 * xs + 50;

ax1 = gca;
axesPosition = get(ax1,'Position'); % いまの座標軸の位置を取得
ax2 = axes('Position',axesPosition,... % 新たに座標軸を作成
    'Color','none',...           
    'YLim',[0 400],... 
    'YAxisLocation','right',...  % y軸は右側
    'XTick',[],... % 新たな座標軸のx軸には何も表示しない
    'Box','off');

h_1 = plot(ax1, xs, ys1); % 左側の座標軸にプロット

hold(ax2, 'on'); % 前のプロット上書きしないようにする
colorOrder = get(gca, 'ColorOrder'); % プロットの色を取得
h_2 = plot(ax2, xs, ys2, 'Color', colorOrder(mod(length(get(gca, 'Children')), size(colorOrder, 1))+2, :)); % 次の色で右側の座標軸にプロット

% 各軸のラベルを線の色と同じ色で追加
ylabel(ax1, 'Axis 1', 'Color',get(h_1, 'color'));
ylabel(ax2,'Axis 2','Color' ,get(h_2, 'color'));

% ラベルのフォントサイズを変更
set(ax1,'FontSize',30);
set(ax2,'FontSize',30);

%% ポイント %%
% まず、右側の座標軸のサイズをリサイズします。
% 第３引数の配列は、グラフの[左座標 下座標 横幅 縦幅]を表します。
% 今回は左右がはみ出てしまうことが問題だったので、左座標、横幅をそれぞれ適当な大きさ分小さくします。
set(ax2,'OuterPosition',[0.15 0 1-0.15 1]);
% 次に、左側の座標軸を右側の座標軸と一致するようにします。
% これで1つのサイズのグラフの中にふたつの座標軸ができます。
ax1.Position = ax2.Position;
```

![スクリーンショット 2017-02-09 1.31.20.jpg](https://qiita-image-store.s3.amazonaws.com/0/35175/d3e4193b-3070-c3bf-6048-6d2dd82f8ee5.jpeg)

## 補足と参考資料
MATLABの描画については、FigureとAxis、Position、OuterPositionという用語を理解しておくとよいです。Figureは描画ウィンドウ全体、Axisはプロットする座標系、PositionはAxisの座標軸の中、OuterPositionはAxisの軸ラベルやタイトルも含めた領域を指します([参考](https://jp.mathworks.com/help/matlab/creating_plots/automatic-axes-resize.html?s_tid=gn_loc_drop))。

上のコードでは、ふたつのAxisのOuterPositionのサイズをFigureのなかに収まるようにリサイズしています。これは主に[このstackoverflowの質問](http://stackoverflow.com/questions/28255102/how-to-adjust-figure-size-when-using-plotyy)を参考にしました。この質問の回答者によると、`plotyy`は思った通りに動かないので使わないほうがよさそうです。
Elixirでローカルの現在時刻を得る

需要があるかは分からないが、私は困ったのでメモ。

ElixirのDateTimeやNaiveDateTimeにはutc_now()があり、UTCでの現在時刻については簡単に取れるが、ローカルについては一筋縄ではいかないようだ（もっとも、既存のライブラリを使えばよいだけの話ではあるが・・・）

一応、Erlangのcalendarを使って、次のようにしてローカルでの現在時刻を取得できた。

```ex
iex(1)> {erl_date, erl_time} = :calendar.local_time()
{{2017, 2, 9}, {1, 19, 28}}
iex(2)> NaiveDateTime.new( Date.from_erl!(erl_date), Time.from_erl!(erl_time) )
{:ok, ~N[2017-02-09 01:19:28]}
```

ちなみに、この方法ではタイムゾーンは取得できない。あくまで日付と時刻のみであることに注意。
Ubuntu16.04にaptでMySQL5.7を入れる時にrootを空パスワードにするとどうなるか

確認した日は 2017/02/08 , MySQLのバージョンは MySQL 5.7.17, ubuntuはVirtualBox上のvm。

ubuntu16.04で以下のコマンドを打ってaptでMySQL5.7をインストールすると、途中でrootユーザーのパスワードを聞かれる。ただのお試しで面倒なので空のままエンターを押し、インストールを完了した。

```bash
$ sudo apt install mysql-server
```

よしよし `mysql -uroot` でログインできるだろう、と思ったが以下のようなエラーがでる。ちなみにlinuxにはubuntuという名前のユーザーでログインしている。（ubuntuにubuntuというユーザー名でログインしてて分かりにくいけど勘弁してください）

```
ERROR 1045 (28000): Access denied for user 'ubuntu'@'localhost' (using password: NO)
```

なにやら、インストールでrootのパスワードを空にすると、rootの認証にはauth_socket pluginを使うように設定されるらしい。

> it is configured with the auth_socket plugin

> https://www.percona.com/blog/2016/05/18/where-is-the-mysql-5-7-root-password/

Access denied のエラーメッセージからも推測できるように、auth_socket pluginは、MySQLクライアントを実行したlinuxユーザーを、MySQLのユーザーとして認証しようとするらしい。

>The auth_socket authentication plugin authenticates clients that connect from the local host through the Unix socket file. The plugin uses the SO_PEERCRED socket option to obtain information about the user running the client program. Thus, the plugin can be built only on systems that support the SO_PEERCRED option, such as Linux.

>https://dev.mysql.com/doc/refman/5.7/en/socket-authentication-plugin.html

ということで、アクセスしたい場合は、sudoでlinuxのrootとしてMySQLにアクセスすれば良さそう。(想像通り、-urootを指定する必要はない)

```bash
$ sudo mysql
```

この状態で、rootにMySQLのパスワードを設定するには、通常のパスワード変更操作に加え、認証用のpluginを変更する必要がある。試しに空パスワードを指定してみた。

```mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';
```

結果、以下のコマンドでアクセスできるようになる。

```bash
$ mysql -uroot
```

空パスワードを受け入れるかどうかはMySQL Serverの設定次第だと思うけど、このインストール方法でのデフォルトだと受け入れるみたい。validate_password pluginがインストールされてないから、きっとそういうものなんだろう。

```mysql
# https://dev.mysql.com/doc/refman/5.7/en/validate-password-plugin-installation.html

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS  WHERE PLUGIN_NAME LIKE 'validate%';
Empty set (0.00 sec)
```
uGUIで禁則処理する の続き

## 前回
[uGUIで禁則処理する - Qiita](http://qiita.com/ma_sh/items/8029bc3a51ccc3e8d2f8)

実際には、前回の続きというより補足、提案です。

## 今回 uGUIのTextクラスを継承するのはいかがでしょうか…？
uGUIのTextクラスは継承可能となっていますので、禁則処理するメソッドを追加する形で作ってみました。

```csharp:HyphenationJpn.cs
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.UI;
using System.Text.RegularExpressions;
using System.Text;
using System;

[ExecuteInEditMode]
public class HyphenationJpn : Text
{
	// http://answers.unity3d.com/questions/424874/showing-a-textarea-field-for-a-string-variable-in.html
	public new string text
	{
		get { return m_Text; }
	}

	private RectTransform _RectTransform
	{
		get
		{
			if (_rectTransform == null)
				_rectTransform = GetComponent<RectTransform>();
			return _rectTransform;
		}
	}
	private RectTransform _rectTransform;

	protected override void OnRectTransformDimensionsChange()
	{
		base.OnRectTransformDimensionsChange();
		UpdateText(text);
	}

	protected override void OnValidate()
	{
		base.OnValidate();
		UpdateText(text);
	}

	public void UpdateText(string str)
	{
		m_Text = GetFormatedText(str);
	}

	// 以下省略。
}
```

Setでも、Getでもなく、```UpdateText(string str)```に。
textのsetterを使われると、ちゃんと動かないので、overrideせずにプロパティを定義して、setterを使えなくしてます。

Textのかわりにこちら1つをアタッチする形で使います。

いかがでしょう…？

ソース全文は以下に。
[ShunMc/HyphenationJpn_uGUI: uGUIでの禁則処理](https://github.com/ShunMc/HyphenationJpn_uGUI)
kotlinで、butterknife → dataBinding移行時の@BindViewの一括置換



全部書き換えるのが大変なのだが、下記のようにsublime textとかで正規表現で一発変換すると少し楽だった。

####前提条件
* 変数名がidと同じようになっている時


####置換

```検索/置換文字
検索文字：@BindView.+\n.+var (.+): (.+\?) = null
置換文字：val $1: $2 by lazy{ binding?.$1 }
```

<br/>

```kotlin:変更前
        @BindView(R.id.itemImage)
        var itemImage: ImageView? = null
        @BindView(R.id.itemName)
        var itemName: TextView? = null
```

　　  ↓

```kotlin:変更後
        val itemImage: ImageView? by lazy{ binding?.itemImage }
        val itemName: TextView? by lazy{ binding?.itemName }
```
「公開鍵暗号方式」と「共通鍵暗号方式」について

#「共通鍵暗号方式」とは
##概要
- 暗号化と復号に、同一/共通の鍵を用いる暗号方式
- 元々、**暗号方式**といえば共通鍵暗号方式を指していた( 公開鍵が出てくるまでは )
- 共通の鍵を用いるため、計算ロジックが簡単で、計算負荷は低い
- 鍵の受け渡しを工夫しないと、共通鍵が傍受され悪用される可能性がある( = **鍵配送問題**。この問題の解決として公開鍵が誕生した )

##種類
###RC4
- Rivest Cipher 4 = **リベスト氏が作った暗号**( 何で4なのかは知らん )
- ストリーム暗号
- 2015年時点では既に解読法が開示されており、非推奨となっている。
- ちなみにリベスト氏は暗号研究の凄い人で、**RSA**や**MD5**の作者でもある。

###DES
- Data Encryption Standard ＝ **データ暗号化標準**。
- ブロック暗号
- ブロック長は64ビット
- 鍵長は56ビット
    - 鍵長が短いために安全ではないと言われ、線形解読法や総当り攻撃によって実用的な時間で解読可能

###トリプルDES
- DESを3回行う事によって、総当り攻撃への耐性を高くする
- 鍵長は168ビット。( but 中間一致攻撃により安全性は112ビット相当 )
- **安全性が実質112ビットまでとなる事**や、**計算負荷も3倍となる事**から、現在はより安全で高速なAESに置き換わりつつある

###AES
- Advanced Encryption Standard ＝ **高度な暗号化標準**。
- 「高度な」と付いているだけあって、DESと比べると高速で安全性が高い。
- ブロック暗号
- ブロック長は128bit
- 鍵長は128ビット・192ビット・256ビットから選択可能。
    - 鍵長が長ければ安全だが処理時間はかかる。按配が大事。128bitでも十分らしい。

<br>
ここで一息( -ω- )
<br>

#「公開鍵暗号方式」とは
##概要
- 暗号化と復号に別個の鍵を用いて、暗号化のための鍵を公開できるようにした暗号方式
- 公開鍵暗号方式でも記載の通り、共通鍵暗号方式の鍵配送問題を解決すべく開発された手法

##必須要件
- **正当性**
    - 正当な受信者は、正当な方法で、作成された暗号文を復号できる
- **秘匿性**
    - 正当な方法で作成された暗号文を復号できるのは、正当な受信者のみ

##アルゴリズム
「鍵生成アルゴリズム」「暗号化アルゴリズム」「復号アルゴリズム」の3つからなる

###「鍵生成アルゴリズム」
- **セキュリティパラメータ×乱数**をアルゴリズムに投げると、ユーザごとに異なる鍵ペア( 公開鍵:秘密鍵 )が取得できる

###「暗号化アルゴリズム」
- **メッセージ×公開鍵**をアルゴリズムに投げると、暗号文を取得できる
- 公開鍵は全ユーザが所持できるため、誰でも暗号化できる

###「復号アルゴリズム」
- **暗号文×秘密鍵**をアルゴリズムに投げると、メッセージが取得できる
- 暗号文は 秘密鍵 でしか復号できないため、盗聴されても問題なし


##種類
###DH
- Diffie-Hellman key exchange = **ディフィー氏/ヘルマン氏**にとって開発された手法
- 認証手段を提供するものではないため、単独では中間者攻撃に対して脆弱
- 処理負荷がかかり、RSAと比べてサーバのスループットが6分の1程度まで落ち込む研究結果もある

###RSA
- Rivest Shamir Adleman = **リベスト氏/シャミア氏/エーデルマン氏**によって開発された手法
- 安全性の根拠は、桁数が大きい合成数の素因数分解問題が困難であること
-  暗号とデジタル署名を実現できる方式として最初に公開されたもの

###ECC
- Elliptic Curve Cryptography = **楕円曲線暗号**の意
- 具体的な暗号方式の名前ではなく、楕円曲線を利用した暗号方式の総称
    - 楕円曲線DSA
    - 楕円曲線ディフィー・ヘルマン鍵共有　などがこれに含まれる
- 安全性の根拠は、EC-DLPを解く準指数関数時間アルゴリズムがまだ見つかっていない事
    - RSAなどに比べ、同レベルの安全性をより短い鍵で実現でき、処理速度も速い！
    - but 
        - P=NPが成立した場合、EC-DLPを多項式時間で解くアルゴリズムが存在する
        - 送信者が暗号化時に適当な乱数を使うため、鍵が同じでも平文と暗号文の関係が1対1でない

<br>
最後に余談があるよ( -ω- )
<br>

#余談
##暗号化に用いられる理論について
まともに数学をやってこなかったツケなんですけど、全く理解できなかった。
けど、とりあえずまとめておく！！！

###離散対数
>素数pと定数gが与えられたとき、y=g^x mod pをxから計算することは容易だが、
>**yからxを求めることは困難である**
>[Wikipedia](https://ja.wikipedia.org/wiki/%E5%85%AC%E9%96%8B%E9%8D%B5%E6%9A%97%E5%8F%B7)

###素因数分解
>大きな素数 p, q が与えられたとき、その積 n = pq を計算することは容易である。
>しかし逆に、2つの大きな素数の積であるような自然数 n が与えられたとき、**n = pq と素因数分解することは難しい。**
>[コトバンク](https://kotobank.jp/word/離散対数問題-12693)

###楕円曲線暗号
>楕円曲線上の離散対数問題 (EC-DLP) の困難性を安全性の根拠とする
>[Wikipedia](https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A%E6%9A%97%E5%8F%B7)

<br />
<br />
結局分からんかった((
【メモ】jqueryで切り替え

今日の学び

2パターンある時にjqueryを使って切り替える方法


```
$(function(){
	var type = 2;
	
	if ( type === 1 ){
		//ここにパターン1の指示
	}
	if ( type === 2 ){
		//ここにパターン2の指示
	}	
});
```
conohaのVPS上からgitlab.comのssh key登録がPermission denied (publickey)される

#ユースケース
gitlab.comからconohaサーバーの方にリポジトリをcloneしたい時．（プロジェクトのデプロイ時など）
cloneするためにサーバーの公開鍵をgitlab.comに登録して、basic認証をしなくて良くしたい時．

#これでだめだった．
リモートで以下のコマンドを実行
`$ssh-keygen -t rsa`
`$cat ~/.ssh/xxx.pub`
この公開鍵をSSH　KEYとして登録した後、
`ssh -T git@gitlab.com`
で登録した公開鍵でgitlabにアクセスしようとした時にPermission denied (publickey)される件です．

#解決策

(https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#generating-a-new-ssh-key)
これに従う

#結果
`$eval "$(ssh-agent -s)"`
`$ssh-add ~/.ssh/xxx`
注意していただきたいのが、２つめのコマンドで秘密鍵を自身のリストに登録しているところです．

そして
`$ssh -T git@gitlab.com`
でwelcomeと表示されると完了です．

#原因

```
$ssh -vT git@gitlab.com
OpenSSH_7.2p2 Ubuntu-4ubuntu2.1, OpenSSL 1.0.2g  1 Mar 2016
debug1: Reading configuration data /etc/ssh/ssh_config
:
:
debug1: Next authentication method: publickey
debug1: Trying private key: /home/user/.ssh/id_rsa
debug1: Trying private key: /home/user/.ssh/id_dsa
debug1: Trying private key: /home/user/.ssh/id_ecdsa
debug1: Trying private key: /home/user/.ssh/id_ed25519
debug1: No more authentication methods to try.
Permission denied (publickey).
```

conohaのubuntuイメージでは`~/.ssh/`フォルダ内にデフォルトでid_rsaのファイルが生成されないため、デフォルト値を読みに行ってもファイルが無いためdenyされます．


#追記
2017/2/20

`$cp ~/.ssh/xxx ~/.ssh/id_rsa`

でコピーして作っちゃえばすべて解決します．
vbs split()

jkの取り出し
2行目777の追加

```vb
sub myTest
Input ="abc,def" & vbcrlf & "ghli,jk" & vbcrlf & "lm" & vbcrlf
Output=SplitToridasi(Input,vbcrlf,",",1,1)
msg Output
Output=SplitGyomatuTuika(Input,vbcrlf,",",1,"777")
msg Output
end sub
'取り出し------------------------------------------------------------
function SplitToridasi(dataN,RS,FS,i,j)
aryStrings  = Split(dataN,RS)
aryStrings2 = Split(aryStrings(i),FS)
SplitToridasi = aryStrings2(j)
end function
'行末追加------------------------------------------------------------
function SplitGyomatuTuika(dataN,RS,FS,i,Tuika)
aryStrings  = Split(dataN,RS)
aryStrings(i)=aryStrings(i) & FS & Tuika
SplitGyomatuTuika=""
for i = 0 to UBound(aryStrings)-1
SplitGyomatuTuika=SplitGyomatuTuika & aryStrings(i) & RS
next
end function
```
(参考)

http://www.kanaya440.com/contents/script/vbs/function/string/split.html

https://qiita.com/icelandnono/items/9c4f8d7b7c85e49d50b6


(注意)i,j入力のチェックは行っていません。
①「取り出し」「行末追加」は,英語で何といいますか？
②同じ機能のpython関数を探しています。
EC2へのSSH接続でPermission denied (publickey). が出たとき

AWS認定のために勉強をしています。

ガイドに従ってEC2を立ち上げたまではいいのですが、

```
ssh -i /path/EC2.pem 12345.ap-northeast-1.compute.amazonaws.com
```

SSHが全然つながらず以下のようにエラーが出ます。

```
Permission denied (publickey). 
```


EC2へのSSH接続でPermission denied (publickey). が出たとき解決方法なんかは
あちこちでいろいろなところで解決策が確認ができます。


鍵ファイルのパーミッション変えたりやってましたが
全然接続できなくて困っていました。

こういうときはやはり公式で確認しようと
[インスタンスへの接続に関するトラブルシューティング](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/TroubleshootingInstancesConnecting.html)も上から順番に確認しましたが解決できず。

結論

```
ssh -i /path/EC2.pem ec2-user@2001:db8:1234:1a00:9691:9503:25ad:1761
```

[SSH を使用した Linux インスタンスへの接続](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)
ここに載ってました。

「ec2-user@」という部分が抜けてるよ！
という話でした。
特定条件を満たす場合にHierarchy上に画像を表示する

# 機能
ヒエラルキー上に画像を表示するためのUnityエディタ拡張です。

# サンプル
![icon.png](https://qiita-image-store.s3.amazonaws.com/0/164066/86061f54-fcc0-8611-6c17-7e1854f9a134.png)

# 使用用途
特定の条件を満たす場合（◯◯のフォントが設定されている時、特定のスクリプトがアタッチされている時など）に、Hierarchy上に画像を表示するための拡張機能です。

# サンプルソースコード
```csharp:ExampleEditorClass.cs
#region

using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

#endregion

/// <summary>
/// 特定の条件を満たす場合にHierarchy上に画像を表示する
/// </summary>
public static class ExampleEditorClass
{
    private const int IconSizeWidth = 16;

    private static Texture2D buttonImage;

    // Awakeよりも先に呼ばれる
    // https://anchan828.github.io/editor-manual/web/callbacks.html
    [InitializeOnLoadMethod]
    private static void Example()
    {
        EditorApplication.hierarchyWindowItemOnGUI += ExampleEditorClass.OnGui;
    }

    private static void OnGui(int instanceId, Rect selectionRect)
    {
        // Project全体からデータをロードできる(対象の画像がなければエラー)
        // http://kan-kikuchi.hatenablog.com/entry/AssetDatabase_LoadAsset
        ExampleEditorClass.buttonImage = AssetDatabase.LoadAssetAtPath("Assets/Image/img.png", typeof(Texture2D)) as Texture2D;

        // InstanceIDをオブジェクトに変換
        var gameObject = EditorUtility.InstanceIDToObject(instanceId) as GameObject;

        if (gameObject == null)
        {
            return;
        }

        // 探したい対象の処理(ex:イメージのRaycast)
        var imageObject = gameObject.GetComponent<Image>();

        if (!imageObject)
        {
            return;
        }

        var searchTarget = gameObject.GetComponent<Image>().raycastTarget;

        if (!searchTarget)
        {
            return;
        }

        // 画像の表示位置
        var imagePos = selectionRect;
        imagePos.x = imagePos.xMax - ExampleEditorClass.IconSizeWidth;
        imagePos.width = ExampleEditorClass.IconSizeWidth;

        // Inspector上に画像を表示する
        GUI.DrawTexture(imagePos, ExampleEditorClass.buttonImage);
    }
}
```

# 参考サイト、その他情報
[コドモのころの夢](http://childhooddream.sakura.ne.jp/)
[コガネブログ](http://baba-s.hatenablog.com/entry/2015/05/04/171926)
[エディタ拡張入門](https://anchan828.github.io/editor-manual/web/callbacks.html)
[kanのメモ帳](http://kan-kikuchi.hatenablog.com/entry/AssetDatabase_LoadAsset)
Ruby lambda　入れ子の場合のスコープについて


##はじめに
Rubyのスコープについて考えていた時におもいついたメモ書きです。
よく考えると当たり前ですが、lambdaの入れ子でも外側の変数が束縛されたので、おお！となりました。

##環境
Ruby 2.3.0

##コード

```Ruby.rb
x = 10
y = -> do
  z = -> do
    x = 1
  end
  z.call
end
p x #=>10

y.call
p x #=>1

```

どういったケースで有効活用できるのでしょうか・・？
Flowで型を指定しながらHOCを書く

注意: この記事はかなり昔の Flow をもとに書かれました。当時と比べ Flow は特に React まわりで大きな変更が入っており、おそらくこの記事の賞味期限は切れていると思います。

---

React で大きなソフトウェアを書いている時に、複数のコンポーネントに共通する処理を抽象化するためのプラクティスに [Higher-Order Components](https://facebook.github.io/react/docs/higher-order-components.html) （HOC）というものがあります。HOCについて一言で言うなら「React コンポーネントを受け取って、それをラップした新しい React コンポーネントを返す関数」です。

HOC では引数に受け取るコンポーネントに特定のインタフェースを期待することが多いと思います。こう言う時こそ flow を使って引数の型を強制したくなりますね。

期待するのは例えば「`Promise<*>` を返す `update` メソッドを持っていること」などですが、その一方でその引数はコンポーネントでもなければなりません。このような型は次のように書くことができます。

```js
// @flow
interface Updatable {
  update(): Promise<*>;
}

type UpdatableComponent = Class<Updatable> & ReactClass<*>;
```

なぜ `Class<Updatable>` などとしているかと言うと、マウントした後にそのインスタンスを扱うことを意図しているからです。

全体を合わせると HOC の型はこんな感じで書くことができます。

この HOC はコンポーネントを `componentDidMount` の度に `update()` を実行するものに変更します。ただし、 underscore の `throttle` を使って interval に 1 度しか更新しません。また [isMounted is an Antipattern - React Blog](https://facebook.github.io/react/blog/2015/12/16/ismounted-antipattern.html) で紹介されている `makeCancelable` 関数を使ってアンマウント時に自動的にリクエストを停止し、メモリリークを防ぎます。

```js
// @flow
import {Component} from "react";
import {throttle} from "underscore";

import {makeCancelable} from "./pat/to/file";

interface Updatable {
  update(): Promise<*>;
}

export default function withThrottledUpdate(
  WrappedComponent: Class<Updatable> & ReactClass<*>
): ReactClass<*> {
  return class extends Component {
    instance: ?Updatable;
    throttledUpdate: ?Function;

    request: ?{
      promise: Promise<*>;
      cancel: Function;
    }

    props: {
      interval: number;
      leading: boolean;
    }

    update(): Promise<*> {
      if (this.instance) {
        this.request = this.instance.update();
      }
    }

    proc(wrappedComponentInstance: Updatable) {
      this.instance = wrappedComponentInstance;

      this.throttledUpdate = throttle(
        this.update.bind(this),
        this.props.interval,
        { leading: this.props.leading }
      );
    }

    componentDidMount() {
      this.update();
    }

    componentDidUpdate() {
      if (this.throttledUpdate) {
        this.throttledUpdate();
      }
    }

    componentWillUnmount() {
      if (this.request) {
        this.request.cancel();
      }
    }

    render() {
      const { interval, leading, ...ThroughProps } = this.props;
      return <WrappedComponent ref={this.proc.bind(this)} {...passThroughProps} />;
    }
  }
}
```
Gitlab: The project you were looking for could not be found

#はじめに
先日ちょっぴりエンジニア界隈を[にぎわせた](https://togetter.com/li/1076845)Gitlabさんですが、私物で使ってるGitlabさんでちょっぴりおかしなことになって、その対処をしたメモ。
たぶん世の中のまっとうなエンジニアの方はこんなことしないだろうけど、ググってもこの答えはでなかったのでインターネットの海にしょーもない豆知識を一つ放流ぐらいのキモチで。

#やりたかったこと
自前のGitlabのデータディレクトリを、外部ディスクに移したい。
まぁ単体で移動させるのもめんどうなので、まとめてGitlabを別ディスクに持っていきたかった。

#やるべきだったこと
[公式ドキュメント](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md)をちゃんと読んで調べる。
ていうか、[これ](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/configuration.md#storing-git-data-in-an-alternative-directory)

#やったこと
上の読むのめんどうだったので（コラ！）とりあえずヤマカンで適当にやってみる。
※今回実施したのはあくまで私物でぶっこわれても自分以外誰も困らないGitlabです。

で、

```
[root@moritest0002 opt]# pwd
/var/opt
[root@moritest0002 opt]# ll
total 4
drwxr-xr-x 13 root root 4096 Feb  7 21:07 gitlab
```

↑コレを、↓こうしてみた

```
[root@moritest0002 opt]# ll
total 0
lrwxrwxrwx 1 root root 21 Feb  8 21:48 gitlab -> /extDISK2/gitlab
```


まぁ、ものはためしにね。ぐらいのキモチで。
/var/opt/gitlabを/extDISK2(外部ディスク）にmvして、そこにシムリンク張っただけ。※/extDISK2は権限777
作業前にgitlab-ctl stopして、作業後に念のため、gitlab-ctl reconfigureしてから（とまってるからポスグレとかが変な出力するけど）、
再度gitlab-ctl startしたら、ちゃんと動いたので、お、これこのままいけんじゃね？といった感じでした。

で、一応それっぽく起動。ブラウザGUIでログイン、既存のプロジェクト、リポジトリもちゃんと見えてる状態だったのでやったー楽にできたーと思っていた矢先。
cliからてきとうにgit pushを試みたところ、以下のようなエラーが

```
remote: GitLab: The project you were looking for could not be found.
To http://hoge/gitlab/myproject/test.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'http://hoge/gitlab/myproject/test.git'
```

お？ could not be found？いやあるけど？
なんと、pullやcloneはできるのに、同じリポジトリに向かってpushはできないという事態に。
ちなみに、ブラウザGUIからファイルを作成してみようとすると、こちらもこんな感じに。

![gitlaberror.png](https://qiita-image-store.s3.amazonaws.com/0/51774/1f713c77-43b9-3351-c9b9-3bf07fc7bf79.png)

ちょっと字が小さくて見にくいカモですが、タイトルのエラーがでてこちらも失敗する状態でした。
じゃあ今みてるこのprojectはなんなんだｗっていうのはおいておいて。

#結論
ちゃんと公式ドキュメント読みましょう。

#参考
###環境
OS：CentOS Linux release 7.2.1511 (Core)
Gitlab：gitlab-ce-8.16.4-ce.0.el7.x86_64

###このエラー文字列でぐぐると
[issue#1716](https://gitlab.com/gitlab-org/gitlab-ce/issues/1716)
[issue#26710](https://gitlab.com/gitlab-org/gitlab-ce/issues/26710)
[issue#638](https://gitlab.com/gitlab-com/support-forum/issues/638)
ここらへんが過去あったみたいですが、今回の自分のケースはどれとも異なる（というかこんなことするやついないだろ・・・）ってことで、ここにメモしておきます。
Chart.js (ver 2) で値の後ろに単位（％など）を表示する方法

# 概要

JavaScript で綺麗なチャートが描ける「 [Chart.js](http://www.chartjs.org/) 」
パイやドーナッツ形式でも表現できて便利なのですが
単位（％）を付けるのに手間取ったので、対応方法を残しておきます。

執筆時点の Chart.js の Version は 2.4.0 です。
1.x とは書き方が異なるので注意してください。
（1.x だと簡単に書く方法があります。逆にそれが今回ハマった原因だったり。。）


# 困った事

[本家 Documentation](http://www.chartjs.org/docs/#doughnut-pie-chart) も、その他の解説サイトも左図のパターンで、
私がほしかった右図のパターンがなぜか載っていませんでした。

![chart_sample.png](https://qiita-image-store.s3.amazonaws.com/0/40622/fdd4777e-f35f-d339-474a-2547f18aac4a.png)

バージョン 1.x の場合は簡単にやる方法があるので、2.x も同様の方法があるだろうと
オプション（afterLabel等）をずっと探していました。

が、結局要件を満たすものはありませんでした。
ちなみに afterLabel はこうなります。なんでや！
![afterLabel.png](https://qiita-image-store.s3.amazonaws.com/0/40622/b140724e-c2a8-43a0-1514-555a9fc2a2ab.png)


# バージョン 2.x で単位を付けるにはどうすれば良いのか

そのうちもっと良い方法が実装されそうですが、
現状では callbacks を使うことで単位（％）を付けることができます。
（[ソース](https://github.com/chartjs/Chart.js/blob/master/src/controllers/controller.doughnut.js) を見たら現状機能が無いことは一目瞭然でした）

値を割合（合計100）で表記するのも、自動でやってくれる機能は無いので
割合に計算しなおした値を使います。

```右側の単位が付いたチャート.html
<canvas id="myChart" width="400" height="400"></canvas>
<script>
  var chart = new Chart(document.getElementById("myChart"),
  {
    type: "doughnut",
    data: {
      labels: ["Red", "Blue", "Yellow"],
      datasets: [
        {
          label: "Favorite color",
          data: [70, 10, 20], //データ自体を調整して合計100になるようにする
          backgroundColor: [
            'rgba(255, 99, 132, 0.8)',
            'rgba(54, 162, 235, 0.8)',
            'rgba(255, 206, 86, 0.8)'
          ]
        }
      ]
    },
    options: {
      tooltips: {
        callbacks: {
          label: function (tooltipItem, data) {
            return data.labels[tooltipItem.index]
              + ": "
              + data.datasets[0].data[tooltipItem.index]
              + " %"; //ここで単位を付けます
          }
        }
      }
    }
  });
</script>
```
Raspberry Pi - 2 - テレビに何も映らない

<font color="#0000ff"><b>トラブル：HDMI接続したテレビに何も映らない</b></font>
<font color="#ff0000"><b>解決：テレビを変えたら映った。</b></font>
<font color="#00ff00"><b>参考：`/boot/config.txt`のhdmiの設定を変えることで映せる可能性が高い</b></font>


前回(『[Raspberry Pi - 1 - はじめのいっぽ（温度センサーを繋げて温度を表示してみる）](http://qiita.com/rrryutaro/items/b3b6b61bdf7129a4d9c8)』)、SSH接続でセンサーの情報を見ることは出来ましたし、やはりGUIでも動かしてみたいので、NOOBSを入れてセットアップしようと思った矢先です。

Raspberry PiとHDMIとで繋げたテレビに何も映りません。
テレビ側には無信号が表示されるという症状に出くわしました。

まだド素人ですから、大混乱です。

初回に起こる問題としてよくあがっているのがSDカードについてですが、落ち着いて確認すると、ACTは光っているし、そもそも前回できているし、NOOBSを入れてラズパイを起動した後、SDカードを見ると容量が変わってボリュームラベルがRECOVERYとなっていることから、起動はちゃんとしているため、SDカードの問題ではないはずです。

となると、まさかHDMIの初期不良かと思いましたが、別のモニターに繋げたらあっさり映りました。

最初につなげていたのが安物のテレビだったせいでしょうか、かなり焦りました。
まさかこんなことでつまづくとは思いもしませんでした。

ともかくも、参考にした記事の通りに進めて問題なく使えるようになりました。
今は本当に情報が一杯あるので助かりますが、さすがにテレビがダメで映らないという情報はみつからなかったので、折角ですから記事にしました。

# [2017/02/09 追記]：`/boot/config.txt`の設定で映るかもしれない
コメントをいただき、次のように設定することで、ダメだったテレビでも映るようになりました。

```
hdmi_group=1
hdmi_mode=5
```

設定の詳細は『[config.txt - Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/configuration/config-txt.md)』の`HDMI_GROUP`と`HDMI_MODE`を参照。



以上

# 参考サイト
- [ラズパイを買ったらそのあとは？地獄の初期設定をしよう【OSインストール・日本語設定編】 | かとえみのRaspberryPiロボット入門](https://liginc.co.jp/261317)
railsアプリからSlackで個人宛にメッセージを送信してみた


グループトークにメッセージを送信する記事は沢山あったのですが個人あてにメッセージを送信する記事がないので書いてみました

## Gem

```
gem 'slack-api'
```
上記を追記後、`bundle install`

アクセストークンの取得
下記から取得
https://api.slack.com/web

![スクリーンショット 2017-02-07 20.14.44.png](https://qiita-image-store.s3.amazonaws.com/0/136533/ab764010-efc6-d3a3-b5fb-dc7874e3ec70.png "スクリーンショット 2017-02-07 20.14.44.png")

## 設定ファイル

```config/initializers/slack_api.rb
require "slack"

Slack.configure do |config|
  config.token = "取得したトークン"
end
```

## 実装
メッセージを贈りたい処理で

```
Slack.chat_postMessage(text: 'テキスト', username: '任意の名前', channel: "@ユーザ名")
```

以上です！たったこれだけ！
Lua言語を触ってみた

普段は、Pythonを書いたり、JavaScriptを書いたりしています。が、とある業務でLuaという言語を触ることになったので、勉強してみました。

# 取り扱う内容

- Lua言語とはどういうものか？
- サンプルコード（ランダム文字列の生成）

# どういう言語か？

手続き型のプログラミング言語でスクリプト言語です。

Lua（ルア）と読みます。



# 作者
リオデジャネイロ・カトリカ大学の情報工学科の方々です。


# どういう目的のために作られたのか？


*Luaは、C言語のホストプログラムに組み込まれることを目的に設計されており、高速な動作と、高い移植性、組み込みの容易さが特徴である。*

[参考wiki](https://ja.wikipedia.org/wiki/Lua)

# どういう使われ方をしているのか？
nginxの拡張モジュールで[ngx_lua](https://github.com/openresty/lua-nginx-module)というのがあります。これを使うとnginxのモジュールをLuaで記述できるようになります。。

# どういう特徴を持つか？
- 実行速度が速い（ネイティブコードにコンパイルする処理系にはかなわないが（cとかVMを持たない言語）、バイトコードにコンパイルする）
- coroutineがある


# 実行環境は？
Luaはバイトコードにコンパイルされ、実行されます。
コンパイラとしては本家のLuaインタプリタとLuaJITというのがあります。

LuaJITというのはJITを搭載したもので、実行速度が劇的に速くなるようです。
これは、プログラム実行時に機械語へのコンパイルを行っているためです。

# REPLはあるか？
あります。

```
$ lua
```
というコマンドを実行することでREPLが始まります。

# 試しに書いてみた

## 今回作るもの

任意の文字数の文字列をランダムに生成する関数を作ります。
生成させる文字列としては、半角英字の大文字と小文字、数字を含むものとします。

以下に関数となるコードを示します。

```lua
function CreateRandStr(length)
  local length = length or 0
  if length <= 0 then
    return nil
  end

  local random_strs = {}
  if length > 0 then
    math.randomseed(os.time())
    for i= 1, length do 
      local a = math.random(97,122) -- a~zのどれかを指定する数字
      local c = math.random(65,90)  -- A~Zのどれかを指定する数字
      local i = math.random(48,57)  -- 0~9のどれかを指定する数字
      local w = math.random(1,3)    -- 大文字、小文字、数字を決めるランダム値
      if w == 1 then table.insert(random_strs, string.char(a)) end
      if w == 2 then table.insert(random_strs, string.char(c)) end
      if w == 3 then table.insert(random_strs, string.char(i)) end
    end
  end
  -- 文字列に変換して、戻り値とする。
  return table.concat(random_strs, "")

end

```

実行

```lua
CreateRandStr(10) -- => 10文字のランダム文字列が生成されます。
```


## コードの解説

### 関数の定義
まず関数の定義は以下のように行います。hogehogeという関数ができます。

```lua
function hogehoge()
 -- 処理
end
```

### 変数の初期化

変数は、定義時にデフォルト値を設定することができます。
下のコードでは、lengthという引数に値があれば、それを関数内のローカル変数として利用し、なければ、０をデフォルト値として利用します。

```lua
function CreateRandStr(length)
  local length = length or 0
  -- 以下処理
end
```

### ランダムに数値を返す書き方

以下のように記述することで、1~100までの数値がランダムに取得できます。

```lua
math.randomseed(os.time())
math.random(1,100)
```

### ランダムに英数字を返す書き方
[こちらのページ](http://www.computercraft.info/forums2/index.php?/topic/12894-how-to-easly-make-random-strings-of-any-length/)を利用しました。Luaでは文字列の内部コードはASCIIとなっているようです。

文字を生成するには、

```lua
string.char( <ASCIIの番号> )
```

というライブラリ関数を利用します。[参考](http://www.rtpro.yamaha.co.jp/RT/docs/lua/tutorial/library.html#string.char)

上記の「ランダムに数値を返す書き方」を利用すると

#### 半角英字（大文字）

```lua
string.char(math.random(65,90))
```

#### 半角英字（小文字）

```lua
string.char(math.random(97,122))
```

#### 半角数字

```lua
string.char(math.random(48,57))
```

と書くことできます。（実際のサンプルコードでは、変数を介してます。）


### 配列の利用

ランダムで1文字ずつ作った文字を、一度配列に格納してます。
Luaでは配列のようなコレクションオブジェクトを「テーブル」と呼びます。

```lua
random_strs = {}
table.insert(random_strs, "a") -- random_strsに"a"という文字を格納。
table.insert(random_strs, "3") -- random_strsに"3"という文字を格納。
-- random_strsは{"a", "3"}という結果になる
```

### 配列を文字列化する

```lua
random_strs = {"a", "3"}
table.concat(random_strs, "") -- => "a3"という文字列になる。
```

# おまけ
以下のサイトで、WebブラウザからLuaを実行できます。

https://www.lua.org/cgi-bin/demo
go+gin+xormでDBに接続する

goのFWやORM情報を探そうとしても、これといったものが見つからなかったので一通り利用しました。今回はタイトル通り以下の構成で確認します。やりたいことは、登録更新削除のAPIを作成します。APIにおけるデータのやり取りは、リクエストではformを、レスポンスではJSONを利用します。

**バージョン**

```go
go version go1.6.3 linux/amd64
gin 1.1.4
xorm v0.5.6
```

インストール手順は省略。

**DB**

```mysql:create.sql
CREATE DATABASE note;
CREATE TABLE user (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
password varchar(100) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
```

**プログラム**

```go:main.go
package main

import (
    "strconv"
    "github.com/gin-gonic/gin"
    "github.com/go-xorm/xorm"
  _ "github.com/go-sql-driver/mysql"
)
type User struct {
    Id       int64  `json:"id"　　　　　　　　 　　　xorm:"'id'"`
    Name     string `json:"name" 　　　　　　　xorm:"'name'"`
    Password string `json:"password"　xorm:"'password'"`
}
func main() {
    router := gin.Default()
    /* userテーブルから複数レコード取得 */
    router.GET("/user/select", func(c *gin.Context) {
        engine, _ := xorm.NewEngine("mysql","ユーザ名:パスワード@/note")
        users := make([]User, 0)
        engine.Find(&users)
        c.JSON(200, users)
    })
    /* userテーブルから1レコード取得 */
    router.GET("/user/select/:id", func(c *gin.Context) {
        n := c.Param("id")
        id, _ := strconv.Atoi(n)
        engine, _ := xorm.NewEngine("mysql","ユーザ名:パスワード@/note")
        user := User{Id: id}
        engine.Get(&user)
        c.JSON(200, user)
    })
    /* userテーブルに1レコード登録 */
    router.POST("/user/insert", func(c *gin.Context) {
        user := new(User)
        user.Name = c.PostForm("name")
        user.Password = c.PostForm("password")
        engine, _ := xorm.NewEngine("mysql","ユーザ名:パスワード@/note")
        engine.Insert(user)
        c.JSON(200, user)
    })
    /* userテーブルの1レコード更新 */
    router.PUT("/user/update/:id", func(c *gin.Context) {
        n := c.Param("id")
        id, _ := strconv.Atoi(n)
        engine, _ := xorm.NewEngine("mysql","ユーザ名:パスワード@/note")
        user := User{Id: id}
        engine.Update(&user, &User{Id:id})
        c.JSON(200, users)
    })
    /* userテーブルの1レコード削除 */
    router.DELETE("/user/delete/:id", func(c *gin.Context) {
        n := c.Param("id")
        id, _ := strconv.Atoi(n)
        engine, _ := xorm.NewEngine("mysql","ユーザ名:パスワード@/note")
        user := User{Id: id}
        engine.Id(id).Delete(&user)
        c.JSON(200, "")
    })
    router.Run(":8080")
}
```

この構成で動きを確認して構築していましたが、今回の要件に合わなくなったためお蔵入りとなりました。goの基礎文法など勉強になりました。
ローカルディレクトリにあるcarton経由のモジュールが読み込めないとき

作業用ディレクトリでcpanfileを書いてcarton installをして、作業用ディレクトリにモジュールが入ったにもかかわらず、実行時にそのモジュールが読み込めない理由がわからなかった。しばらくcpanmに逃げていたのだが、今日ようやくわかったのでメモ。

作業用ディレクトリで

```
$ carton exec ...
```
を実行すれば良い。例えば、

```
$ carton exec perl hoge.pl

$ carton exec plackup -r app.psgi
```

これで現在居るディレクトリにある、carton経由のモジュールを利用することができる。

perldocはちゃんと読め、ということですね。
sys.path.append()の話

書籍：[ゼロから作るDeepLearning(オライリー・ジャパン)](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_x_5GXMybAKYE0VF )内の73ページのmnistデータの読み込みで少しつまずいたが、解決したので解決方法を書いておく。

####つまずいた部分
***
最初の*mnist.py*のあるフォルダの一つ上のフォルダ内をインポートする*sys.path.append(os.pardir)*で*mnist.py*がimportできない。

####解決方法
***
※既にgithubから[リポジトリファイル](https://github.com/oreilly-japan/deep-learning-from-scratch)をダウンロードし、解凍してあることを前提とする。
カレントディレクトリはどこでもよくて、*sys.path.append(os.pardir)*の部分を*sys.path.append(絶対パス)*にする。

例：*sys.path.append(D:\File\deep-learning-from-scratch-master)*


多分これでいけるはずです。