OmniAICreator/Qiita-1.07M huggingface dataset:
Serverless Framework v1 で --profileオプション / --regionオプションを作って AWS CLI credentialsを活用する

※
=================

https://github.com/serverless/serverless/blob/master/docs/providers/aws/guide/credentials.md



バージョン
=========

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.6
BuildVersion:	15G1004
$
```

```
$ $(npm bin)/sls -v
1.0.0-rc.2
$
```


何がしたかったか
=========

serverless.yml に profile を直接書きたくなかった。

https://serverless.com/framework/docs/providers/aws/setup/#using-aws-profiles

```

service: new-service
provider:
  name: aws
  runtime: nodejs4.3
  stage: ${opt:stage, self:custom.defaultStage}
  profile: ${self:custom.profiles.${self:provider.stage}}
custom:
  defaultStage: dev
  profiles:
    #ここ
    dev: devProfile
    #ここ
    prod: prodProfile
```

みたいにprofile名を直接書いちゃうとgit repoにのせずらいなーと思った。

なおかつ、slsコマンドが `AWS_DEFAULT_PROFILE` 環境変数を見ない感じだった。



こうした
=========


```
service: test-sls-v1
provider:
  name: aws
  runtime: python2.7
  stage: ${opt:stage, self:custom.defaultStage}
  #profileオプション追加
  profile: ${opt:profile, self:custom.defaultProfile}
  #regionオプション追加
  region: ${opt:region, self:custom.defaultRegion}
custom:
  defaultStage: dev
  #何も指定がなければ default profile
  defaultProfile: default
  #何も指定がなければ 東京リージョン
  defaultRegion: ap-northeast-1
functions:
  hello:
    handler: handler.hello
```


こんな感じでprofileオプションを指定できるので AWS CLIぽく使える。

```
$ $(npm bin)/sls deploy --profile hogehoge-user
```


参考：

> serverless/credentials.md at master · serverless/serverless
> > https://github.com/serverless/serverless/blob/master/docs/providers/aws/guide/credentials.md
riot-router経由でoptsパラメーター＆クエリを渡せない時の対処

# つらさ
optsでテンプレートがパラメーターが受け渡せると聞いていたのに、なぜか渡っていない。

## 環境
riot.js v2.5

# ルーター間でパラメーターを渡している例
```app.js
// http://localhost:3000/hoge/1?page=2&limit=20
riot.route('/hoge/*..', function(itemId) {
  var q = riot.route.query(); 
  console.info('itemId: ' + itemId); // 1
  console.log('Page: ' + q.page); // 2
  console.log('Page: ' + q.limit); // 20
  tagName = 'hoge';

  riot.mount('content', tagName, 
  {
    id: itemId,
  });
});
```

```hoge.tag
<script>
console.log(JSON.stringify(opts.__proto__.id)); // idが取れる
console.log(JSON.stringify(opts.id)); // idが取れない
</script>
```

子タグに対しての受け渡しであればoptsが利用できるが、ルーター経由での受け渡しでは__proto__が必要になるので注意。

## クエリ付きルーティングの罠
idもうまく渡せない罠があるので合わせて注意しましょう。

```
http://localhost:3001/hoge/12?page=2 // id=1。１桁しか取れていない
http://localhost:3001/hoge/12/?page=2 // id=12。正しく取れる
````

参考issueはこちら。
https://github.com/riot/riot/issues/1820
ダウンロードされたBMSのzipファイルを複数展開方法

(日本人ではないので、だれか日本語を修正して Edit Request を送ってくれたら感謝します)

ダウンロードされたまたは [Resilio Syncで獲得された](https://bemuse.ninja/sync/bofu2016.html)BMSのzipファイルは2種類がある

- タイプ 1 : 中にもう一つのフォルダーがある
 <img width="1177" alt="type1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/108844/8ac48acc-d008-d712-0277-602f91a3954f.png">

- タイプ 2 : 中に全てのBMS関係ファイル
<img width="1181" alt="type2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/108844/26917822-d207-4197-5ab6-867e575ab4d1.png">

# 普通で展開すると

ダブルフォルダーまたはダバァしてしまった可能性がある　大変になった

<img width="452" alt="roku.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/108844/6c7689f8-d4cf-fc03-daab-ee2408921d9f.png">

# 解決

1. 7-Zip を[インストールする](http://www.7-zip.org/download.html)
2. Shift を押し続けながら含まれるフォルダーを右クリックしてこれを選択する
![aaa.jpg](https://qiita-image-store.s3.amazonaws.com/0/108844/64499b71-66ca-f08f-e2ef-c768622f2ddc.jpeg)

3. コマンドプロンプトで unzip しましょう

<img width="511" alt="cmd.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/108844/394f607d-9d0e-2ab4-5c86-d157ff01b992.png">

```"c:¥Program Files¥7-Zip¥7z.exe" e *.zip -o* -y```
^^コピーペーストの時に " が他の " 文字になっちゃうを注意!

**"c:¥Program Files¥7-Zip¥7z.exe"** - 7-Zip をインストールされた所
**e** - 中にフォルダーを**無視して**Extractする (これだけを使うと全てのzipファイルの案内がダバァされた ご注意ください)
**\*.zip** - 全ての zip ファイル
**-o*** - (重要!) 各zipファイルに新しいフォルダーを制作する フォルダー名はzipファイルと同じ (\*)
**-y** - 問題があれば YES

<img width="733" alt="2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/108844/a724d93d-cf46-efc4-e176-ee6598190160.png">

<img width="390" alt="kansei.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/108844/9fb381a1-5aa4-6856-7b80-603fba28406b.png">

無事に完成した (?)

**.rar BMS もあるから、もう一度これをやってください**
```"c:¥Program Files¥7-Zip¥7z.exe" e *.rar -o* -y```

そして .7z を使っている人もいるんだ..


(おまけ) macOS で展開するなら、
```7z e "*.zip" -o* -y```
```*.zip``` じゃなく ```"*.zip"``` の理由は、そうじゃないからスペースあるのファイル名は展開できないです。
```which 7z``` で 7-Zip の存在を確認できます。
[WordPress] エディタに挿入されるメディアファイルの URL を相対URLにする

ステージングから本番にDB移行するときとかに wp_posts.post_content に格納さてるデータの img タグにサーバ名が入ってると色々と都合が悪いです。
wp-cli の [search-replce](http://wp-cli.org/commands/search-replace/) コマンド使って置換すればいいんですが、何回も発生する場合はそれも面倒です。
そんな時は upload_dir flter hook を使えばいいと思うよ。

```php:upload_dir_filter.php
<?php
// upload dir -> relative path 
add_filter( 'upload_dir', function($uploads) {
	if ( isset( $uploads['url'] ) )
		$uploads['url'] = preg_replace( '#^(https?://|//)[^/]+/#', '/', $uploads['url'] );
	if ( isset( $uploads['baseurl'] ) )
		$uploads['baseurl'] = preg_replace( '#^(https?://|//)[^/]+/#', '/', $uploads['baseurl'] );
	return $uploads;
});
```

これ、設定後のメディア挿入時に適用されるので、すでに何本か記事書いてる場合は wp-cli の search-replace とかで相対URLに置換してね。

```
$ wp search-replace \
  http://example.com/wp-content/uploads/ /wp-content/uploads/ \
  wp_posts \
  --include-columns=post_content
```
Arduinoで使えるライブラリ

（自分用メモ）（編集中…）

# 赤外線通信
http://deviceplus.jp/hobby/entry023/

* AM変調…と思いきやそうではない？

# 静電容量
http://www.musashinodenpa.com/arduino/ref/index.php?f=1&pos=2165

* RC回路の過渡応答の時間からキャパシタンスを測定する。

# LCDに文字を表示
Arduino標準はLiquitCrystal。
* http://arms22.blog91.fc2.com/blog-entry-504.html

拡張してスクロール・記号などをサポートしたライブラリ
* http://ore-kb.net/archives/195
ネストされたenumを扱う

ネストされた`enum`の使い方のサンプルです。
`.tokyo(.ebisu)`こんな感じで使用することができるので直感的ですね。
他にも良い書き方があれば気軽にコメントお願いします。


```swift
enum Japan {
    enum Tokyo: String {
        case shibuya, shinagawa, ebisu
    }
    enum Kanagawa: String {
        case yokohama, kawasaki, sagamihara
    }
    case tokyo(Tokyo)
    case kanagawa(Kanagawa)
}

func sayPlace(_ placeType: Japan) {
    let place: String = {
        switch placeType {
        case .tokyo(let place):    return place.rawValue
        case .kanagawa(let place): return place.rawValue
        }
    }()
    print("\(place)!!!")
}

sayPlace(.tokyo(.ebisu)) // ebisu!!!
sayPlace(.kanagawa(.yokohama)) // yokohama!!!
sayPlace(.kanagawa(.sagamihara)) // sagamihara!!!
```
macOS の Storyboard 上で autosaveName を指定しても意味がない

2回もハマって腹が立ち、こんな悲しい思いを他の人にもして欲しくないために書いておきます。

Storyboard 上にある Window の Autosave 欄は巧妙な罠です。

![Screen Shot 2016-10-06 at 19.00.03 1.png](https://qiita-image-store.s3.amazonaws.com/0/6520/1d2b530e-45c2-824a-097b-a45672ab8a2b.png)



xib と違い、Storyboard ではここに identifier を指定しても無視されます。
NSWindowController（サブクラス）の `windowDidLoad()` で書くのが正解。

```swift
override func windowDidLoad() {
        
    super.windowDidLoad()
        
    self.windowFrameAutosaveName = "Document Window"  // correct!
}
```

しかも、「念のため」などと Storyboard 上に `windowDidLoad()` で指定したのと同じ文字列が入れてると `windowDidLoad()` で指定したのごと無効になります。空欄（またはダミー文字列）にしておきましょう。

![Screen Shot 2016-10-06 at 19.02.40.png](https://qiita-image-store.s3.amazonaws.com/0/6520/7e60cb8f-7dfc-a10e-f6dc-a5ecf5e81b4d.png)


二重の罠！

cf. [NSWindowController Autosave using Storyboard](http://stackoverflow.com/questions/25150223/nswindowcontroller-autosave-using-storyboard)
Unityで磁力をシミュレートする。

#はじめに

Unityでは、標準機能で重力や光などの物理現象はシミュレートできますが、磁力のシミュレートは出来ません。それを可能にする無料アセットが[Magnetodynamics](https://www.assetstore.unity3d.com/en/#!/content/3673)です。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/b38befb4-6eeb-8764-a8cc-3c4eebd8c754.png)

作者の方は物理がご専門のようで、[マニュアル](http://coffeeshopphysics.com/magnetodynamics/Magnetodynamics_v1_0_Documentation.pdf)にもかなり本格的な説明があります。ただ、残念ながら大分古いアセットなので、現行のUnityで使おうとすると一部のシーンでは修正が必要ですが、そのままでも遊べるシーンもあるので、簡単に紹介します。

# BallMagnetsTutorialで遊んでみる

とりあえず、一番シンプルなボール型磁石のチュートリアルを見てみましょう。アセットをインポートして(その際、API Updateをするよう指示が出るので、それに従ってください）、BallMagnetsTutorialシーンを開いてください。

そうすると、下のようなNS極のあるボール型磁石が出てきて、それをマウスで移動できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/e6f34642-6fd5-2752-0b51-318fd2c2a34e.png)

これに対して、マニュアルの指示に従ってプレハブを追加します。まず、Assets\MagnetodynamicsにあるMagneticDipoleプレハブをBallMagnet-1の下に配置してください。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/2ad7d8fa-6882-1444-9152-232b2da713df.png)

次に、位置合わせのため、BallMagnet-1、MagneticDipoleの双方のTransformのPosition, Rotationを（0,0,0）にしてください。そうすると、二つのオブジェクトの軸がそろうはずです。それができたら、BallMagnet-1を少し上に移動させて、机にめり込んでない位置に置いてください。

次に、ElectromagneticFieldControllerプレハブをシーンに配置してください。これは、BallMagnet-1の下である必要はありません。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/24ae8fd2-2e1b-48a4-7486-176d65bfa62f.png)

次に、BallMagnet-1のコピーをたくさん作って、シーンに適当に配置してください。そしてシーンを実行すると、お互いが引っ付くようになります。

![Magnet1.gif](https://qiita-image-store.s3.amazonaws.com/0/58503/53b81fbe-4a1a-5033-4af1-adb7b87241a0.gif)

#おわりに

今回は、簡単にBall magnetについて説明しました。ほかにも、磁力線を表示するチュートリアルなど色々面白いのがありますので、機会があればまた紹介します。
UnityでAndroidのVRをGoogleのCardboardでやる2016版

VR向けのAndroidビルドをしようとしたら、やり方が変わっていたのでググった情報が使えなかったので、非常に簡単なのですがおいておきます。

#CardboardでVRをやる

AndroidではDaydreamがリリースされ、それに合わせたタイミングで少し前からVRへのビルド方法が変わってました。その方法を解説します。
大元の解説はコチラが本家です、これでわかる人は必要ありません。iOS向けの解説もあります。

https://developers.google.com/vr/

##Google VR SDK for Unity on Androidを使う手順

基本的に、unitypackageを入れるだけの話です。説明は以下にあります。

https://developers.google.com/vr/unity/get-started-android

ここに書いてある記述の抜粋の意訳ですので、読んで分かる人は本家のを参照ください、それが確実です。

で、ちょっと手っ取り早くやりたい人向けに解説します。

###必要なもの

ビルドに必要なものです、現時点の記述なので今後、変わる可能性はあります。

#### AndroidSDKとJava(JDK)
  - Androidのビルドをすでにしている人は、あるはずですから以下は不要ですのでスキップして下さい。
  - こちらかAndroidSDKがDLできます、SDKだけで良いので、ページ後半のところからDLをお勧めします。
     - https://developer.android.com/studio/index.html
     - 「ベーシックな Android コマンドライン ツール」と書いてあるところから選ぶと余計なIDEは入らない
     - [![https://gyazo.com/6647065344fe760cd3e4be8442020127](https://i.gyazo.com/6647065344fe760cd3e4be8442020127.png)](https://gyazo.com/6647065344fe760cd3e4be8442020127)
  - SDKマネージャーを起動（初回は勝手に起動されると思います）、 API level 9 以上をインストール
  - Javaも用意していない人は必要です、勝手に案内されますが、ここからDL可能です。
    - http://www.oracle.com/technetwork/java/javase/downloads/index.html
    - 「JDK」をクリックして使用しているOSに合わせてください
    - [![https://gyazo.com/09868ded34cf804d8de1a2af24ce293f](https://i.gyazo.com/09868ded34cf804d8de1a2af24ce293f.png)](https://gyazo.com/09868ded34cf804d8de1a2af24ce293f)

#### Unity
 - 5.2.1以降が必要です
 - 適宜、DLして下さい

#### Google VR SDK for Unity

 - 説明は以下のページにあります。これが分かる場合はそれに従ってください。
   - https://developers.google.com/vr/unity/download
 - パッケージをDLします。以下のgitのページを開きます。
    - https://github.com/googlevr/gvr-unity-sdk/
    - 「GoogleVRForUnity.unitypackage」とあるリンクからDLしてください
 　 - [![https://gyazo.com/887d7a36aad32b05b05b1bc7dcb26efb](https://i.gyazo.com/887d7a36aad32b05b05b1bc7dcb26efb.png)](https://gyazo.com/887d7a36aad32b05b05b1bc7dcb26efb)


### unityでデモを確認

 - Unityを起動して、適宜、プロジェクトを作ってください
 - [Assets] > [Import Package] > [Custom Package]から、先ほどのGoogleVRForUnity.unitypackageを選んでUnityに読み込ませます。読み込む☑は全部付いている状態で、[import]をクリックして下さい。
 - Assetにフォルダが出ます、その中のGoogleVR/DemoScenes/HeadsetDemoからサンプルSceneを選んで開いて下さい
 - [![https://gyazo.com/2b313e34624371671afb05f88473e487](https://i.gyazo.com/2b313e34624371671afb05f88473e487.png)](https://gyazo.com/2b313e34624371671afb05f88473e487)
 - 実行すると、ステレオカメラで画面がレンダリングされると思います。
 - [![https://gyazo.com/8be7588418e09e651097952bf3e543dd](https://i.gyazo.com/8be7588418e09e651097952bf3e543dd.gif)](https://gyazo.com/8be7588418e09e651097952bf3e543dd)
 - これを[File]>[Build Setteings]からAndroidの設定をしてapkファイルをビルドし、スマホにインストールすれば完成です。

### オリジナルのシーンをVR化

自分のオリジナルのシーンにこれをはめたい場合は、上記のpackageをインポート後、シーンにGvrViewerMainのprefabを入れるだけでできます、すごく簡単です！
[![https://gyazo.com/a64a8da1be540c1dacdd3a73038880b5](https://i.gyazo.com/a64a8da1be540c1dacdd3a73038880b5.png)](https://gyazo.com/a64a8da1be540c1dacdd3a73038880b5)

## まとめ
簡単にいうとpackageを入れて、その中のprefabをシーンに入れるだけです。
って簡単すぎるんですが古い情報ばかりヒットして迷いました。
お役に立てれば幸いです。
2つの年月日の間の日数を取得する方法の速さ比較

2つの年月日、2000年1月1日と2016年12月31日の日数の差を取得する方法について、以下の2つの速さを比較してみました。

+ Calendarクラスを使う。
+ Durationクラスを使う。(java8)

実行環境は以下の通りです。

+ DELL VOSTRO 1540
+ Windows 10 Pro 32bit
+ Intel Celelron 2.00 GHZ
+ メモリ 2.0GB
+ HDは約300GB

#ソースと実行結果

上記の方法を30000回繰り返した結果を出力しました。以下、ソースと実験結果です。

```java:ソース
package test;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.function.LongSupplier;

public class Test {

    // --計測用--
    private void printProcessingTime(LongSupplier f) {
        int count = 30000;
        long start, end;
        start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            f.getAsLong();
        }
        end = System.currentTimeMillis();
        System.out.printf("出力確認:%s, 計測 %3d: ", f.getAsLong(), end - start);
        System.out.println();
    }

    // --計測--
    private static int DIV_FOR_CAL = 1000 * 60 * 60 * 24;
    private static int DIV_FOR_DUR =        60 * 60 * 24;

    public static void main(String[] args) {
        new Test().test();
    }

    private void test() {
        // Calendar
        printProcessingTime(() -> {
            Calendar c1 = Calendar.getInstance();
            c1.set(2000, 0, 1, 0, 0, 0);
            Calendar c2 = Calendar.getInstance();
            c2.set(2016, 11, 31, 0, 0, 0);
            return (c2.getTimeInMillis() - c1.getTimeInMillis())/ DIV_FOR_CAL;
        });

        // Duration
        printProcessingTime(() -> {
            Duration duration = Duration.between(
                    LocalDateTime.of(2000, 1, 1, 0, 0),
                    LocalDateTime.of(2016, 12, 31, 0, 0));
            return duration.getSeconds() / DIV_FOR_DUR;
        });
    }
}
```


```DOS:結果
出力確認:6209, 計測 255: 
出力確認:6209, 計測  47: 
```

Durationの方が速いという結果になりました。

#修正履歴

+ @sipadan2003 さんの指摘対応。ソースを修正し、java.util.functionに用意されているインターフェースを使用。
Swiftで後置if/unlessを行うカスタム演算子

Swift3で後置if/unlessを行うカスタム演算子を定義してみます。

<?がif、<!?がunlessです。

```swift
precedencegroup PostPositionCondition {
    associativity: left
    higherThan: AssignmentPrecedence
    lowerThan: TernaryPrecedence
}

infix operator <?: PostPositionCondition
infix operator <!?: PostPositionCondition

func <?<T>(_ statement: @autoclosure () -> T, _ condition: @autoclosure () -> Bool) -> T? {
    return condition() ? statement() : .none
}

func <!?<T>(_ statement: @autoclosure () -> T, _ condition: @autoclosure () -> Bool) -> T? {
    return condition() ? .none : statement()
}
```

使ってみましょう。

```swift
func cond(_ flag: Bool) -> Bool {
    return flag
}

let result_if = 1 + 1 <? cond(true)			// 2
let result_unless1 = 1 + 1 <!? cond(true)	// nil
let result_unless2 = 1 + 1 <!? false		// 2

print("if") <? cond(true)					// "if"が出力される
print("unless") <!? cond(true)				// 何も出力されない

print("if_if") <? true <? false				// 何も出力されない
```

以上のようになります。autoclosureにより、条件に当てはまらない場合は前項は実行されていません。
ただし、throwと一緒には利用できません。<!?がthrowと一緒に使えると良かったのですが。
Linuxにおける最強ランチャアプリ「dmenu」

Arch Linux ＋ Openboxという環境で作業していると、シンプルで気持ち良いのだが、ランチャアプリで良いのが無くて困っていた。

gmrunというアプリを使っていたのだが、インクリメンタルサーチが有効にならないので使いにくかった。

それっぽいオプション「TabTimeout = 1」があるが、こちらは文字を入力したらその瞬間にタブを押すという挙動で使いにくかった。

そんな折、[Arch BBSのスレッド](https://bbs.archlinux.org/viewtopic.php?id=44580)で、「dmenu > *」という書き込みがあったので、試してみた。

# インストール

Arch Linuxならpacmanで一発です。

`sudo pacman -S dmenu`

Ubuntu

`sudo apt-get install dmenu`


# 使い方

試しにターミナルから`dmenu_run`と打ちます。スクリーンショットはこちら

![Screenshot_2016-10-06_18-17-37.png](https://qiita-image-store.s3.amazonaws.com/0/103885/5ae4cdd8-bf07-db0c-efa5-51869da7b491.png)

やや見づらいですが、上部に表示されているのがdmenuです。

長所は

- インクリメンタルサーチ。入力する度に絞られていく。
- 複数単語検索。`peco`のように、スペースを開けて単語を打てば、それぞれの単語に対して絞り込みがされる。
- 豊富なキーバインド。Emacs風のC-d, C-h, C-a, C-e, C-kに対応しており、コマンド候補はC-f, C-bで選択できる。ESCで消える。

ぜひお試し下さい。
config.eager_load = false の環境で1ファイル内に複数classを定義した際、ファイル名と異なるclassのautoloadが機能しない

# 現象

`config.eager_load = false` の環境で1ファイル内に複数classを定義した際、ファイル名と異なるclassのautoloadが機能しない

# 環境

Ruby: 2.3.1
Rails: 4.2.7.1

# 1ファイル内に複数のclass

### source

```rb
# app/models/samples/foo.rb

class Samples::SampleError < StandardError; end

module Samples
  class Foo
  end
end
```

### rails console

- `config.eager_load = false`

```sh
> defined? Samples::SampleError
#=> nil

> Samples::SampleError
#=> NameError: uninitialized constant Samples::SampleError
```

- `config.eager_load = true`

```sh
> defined? Samples::SampleError
#=> "constant"

> Samples::SampleError
#=> Samples::SampleError 
```

# 1ファイル1class

### source

```rb
# app/models/samples/sample_error.rb

class Samples::SampleError < StandardError; end

# app/models/samples/foo.rb

module Samples
  class Foo
  end
end
```

### rails console

- `config.eager_load = false`

```sh
> defined? Samples::SampleError
#=> nil

> Samples::SampleError
#=> Samples::SampleError
```

- `config.eager_load = true`

```sh
> defined? Samples::SampleError
#=> "constant"

> Samples::SampleError
#=> Samples::SampleError
```

# 何が困るか

例えば下記のように、抽象クラスから `Samples::Foo` を呼び出すような実装をした際

```rb
# app/models/samples/abstract.rb

module Samples
  class Abstract
    def self.exec
      Foo.new.exec
    end
  end
end

# app/models/samples/foo.rb

class Samples::SampleError < StandardError; end

module Samples
  class Foo
    def exec
      raise SampleError
    end
  end
end

# spec/models/samples/abstract_spec.rb

require 'rails_helper'

describe Samples::Abstract, type: :model do
  describe ".exec" do
    it "Samples::SampleErrorが発生する" do
      expect { Sample::Abstract.exec }.to raise_error Samples::SampleError
    end
  end
end
```

単一ファイルのテストを実行した際、 `uninitialized constant Samples::SampleError` が発生する

```sh
$ rspec spec/models/samples/abstract_spec.rb

# Randomized with seed 965
# 
# Samples::Abstract
#   .exec
#     Samples::SampleErrorが発生する (FAILED - 1)
# 
# Failures:
# 
#   1) Samples::Abstract.exec Samples::SampleErrorが発生する
#      Failure/Error: expect { Sample::Abstract.exec }.to raise_error Samples::SampleError
# 
#      NameError:
#        uninitialized constant Samples::SampleError
#      # ./spec/models/samples/abstract_spec.rb:6:in `block (3 levels) in <top (required)>'
# 
# Finished in 0.01472 seconds (files took 3.95 seconds to load)
# 1 example, 1 failure
# 
# Failed examples:
# 
# rspec ./spec/models/samples/abstract_spec.rb:5 # Samples::Abstract.exec Samples::SampleErrorが発生する
# 
# Randomized with seed 965
```
openFrameworksでちゃんと文字を書く

以下、ちゃんとフォントや色やサイズを指定して文字を書きたいと思ったときのメモです。

## 1. フォントを入れる
プロジェクトの`./bin/data`に使いたいフォントのデータを入れる

本記事では`verdana`というフォントを使用する。
また、フォントの拡張子は`.ttf`とする。

## 2. `ofApp.h`でフォントのインスタンスを作成
`ofApp.h`のofAppクラスの最後とかに以下を追加する。

```ofApp.h
ofTrueTypeFont verdana
```

## 3. `ofApp.cpp`でフォントを使って文字を書く

setup内で諸々基本的な設定をして、draw内で描画します。

```ofApp.cpp
void ofApp::setup(){
    // Background
    ofBackground(0, 0, 0);
    
    // Fonts
    ofTrueTypeFont::setGlobalDpi(72);
    
    verdana.load("verdana.ttf", 18); // フォントのデータを指定する
    verdana.setLineHeight(24);       // 行間を指定する
    verdana.setLetterSpacing(1.0);   // 文字間を指定する
}

void ofApp::draw(){
    ofSetColor(30, 200, 200); // 文字色を指定
    verdana.drawString("Hello World!!", 100, 100); // 文字とポジションを指定して描画
}
```

## 4. ビルド&amp;ラン
![スクリーンショット 2016-10-06 18.03.47.png](https://qiita-image-store.s3.amazonaws.com/0/32100/4ab9b1b2-ba67-238a-0e60-e7ba2623a4b0.png)

やったね😇

## 参考
- [ofTrueTypeFont | openFrameworks](http://openframeworks.cc/documentation/graphics/ofTrueTypeFont/)
- [openframeworks 文字表示について](http://kcpjunky.hatenablog.com/entry/2012/12/13/050229)
RabbitMQマネージャとWebAPIの簡単なまとめ (随時更新)

# RabbitMQは管理コンソール以外にもWebAPIが提供されている

RabbitMQは、ブラウザで操作できる管理コンソールが提供されています。
この管理コンソールでも最低限の操作（Queue、Exchange、vhostの参照・追加・変更・削除）と、プロファイル変更もできるのですが、これらの機能はWebサービスも提供されています。

機能一覧は管理コンソールの最下部にある「HTTP API」にあり、いつでも参照できます。
例えば /api/overview をGETで問い合わせれば、RabbitMQの全システム簡易情報が出ますし、/api/extensions ならRabbitMQに追加したプラグインが一覧で表示されます。

## 見ておきたいAPIと内容

ここでもよく使っているAPIの一覧と概要を紹介します。

### 定義一覧
/api/definitions(/vhost)

現在定義されているユーザアカウント名とアクセス範囲, Exchange, Queueの定義情報の全一覧が表示されます。
vhostを指定する(※)と、そのvhost内に閉じた Exchange, Queueの定義情報を表示します。

設定変更した後や接続試験時などにも参考にできるでしょう。

### 接続一覧
/api/connections
/api/vhosts/vhost名/connections

/api/connectionsは現在RabbitMQへ接続している接続の詳細情報を返します。
vhostを指定した場合は、vhost内での接続の詳細情報を返します。
接続情報にはホスト名やGC(ガベージコレクト)数や、送受信したメッセージの数を示す値、具体的には

```text:
  channels: 18,
  state": "running",
  send_pend: 0,
  send_cnt: 1408,
  recv_cnt: 2745,
```
のように、接続チャネル数、稼働ステータス、送信を見送っている数、送信回数、受信回数も検出できます。

### 接続チャネル一覧
/api/channels
/api/vhosts/vhost名/channels

各ホストからRabbitMQへの接続の数を接続チャネルとして接続チャネル情報の一覧を返します。vhostとチャネル名を指定した場合は、そのチャネルのみの情報を返します。チャネル名は `接続ホストIPアドレス -> RabbitMQのIPアドレス(番号)` など複雑な名前になる場合があります。

### Consumer数
/api/consumers
/api/consumers/vhost名

現在有効なConsumer(メッセージを受け取った後に実行するプロセス)の数です。vhostで抽出も可能です。

### Exchange数
/api/exchanges
/api/exchanges/vhost名
/api/exchanges/vhost名/exchange名

メッセージを送受信する際の窓口となるExchangeの一覧を返します。
exchange名まで指定すると、現在のメッセージ送受信の状況も表示されます。

```text
{
  incoming: [ ],
  outgoing: [ ],
  message_stats: {
    publish: 0,
    publish_details: {
      rate: 0
    },
    publish_in: 119,
    publish_in_details: {
      rate: 0
    },
    publish_out: 119,
    publish_out_details: {
      rate: 0
    },
    ack: 0,
      ack_details: {
    rate: 0
    },
    deliver_get: 0,
      deliver_get_details: {
    rate: 0
    },
    confirm: 0,
    confirm_details: {
      rate: 0
    },
    return_unroutable: 0,
    return_unroutable_details: {
      rate: 0
    },
    redeliver: 0,
    redeliver_details: {
      rate: 0
    }
  },
  name: "sample.exchange",
  vhost: "/sample",
  type: "direct",
  durable: true,
  auto_delete: false,
  internal: false,
  arguments: { }
}
```

### メッセージの送信
/api/exchanges/vhost名/exchange名/publish (POST)

指定したExchange経由でメッセージを送信します。

### Queue一覧
/api/queues
/api/queues/vhost名
/api/queues/vhost名/queue名

現在有効なQueue情報を返します。処理が終わっていないメッセージの数や、処理中、エラーが発生して蓄積している数も情報として返されます。

### 死活監視
/api/aliveness-test/vhost名

指定したvhostのノードが生きているかをチェックできます。モニタリング用です。

## vhost指定する(※)ときの注意
RabbitMQは vhostの単位で、アクセスするユーザが利用できる権限を管理しています。このvhostを指定するときの注意点として、/（スラッシュ)から始まるvhost名を指定したときには、%2f に置換しなければなりません。(デフォルトの / の場合は記載しなくても良い )

例えば vhost名が /sample の場合は、%2fsample です

## よく使うもの

以下は監視用に使っています。

|用途|URL例|備考|
|:---|:---|:---|
|死活監視|/api/aliveness-test/%2fsample-vhost|RabbitMQが息をしているかの確認|
|送信失敗キュー(※※)の有無確認|/api/queues/%2fsample-vhost/error.queue|RabbitMQ経由で送信したメッセージから、処理失敗したものをエラーキューとして退避した数|
※※送信失敗キューは、[RabbitMQ : Dead Letter Exchanges](https://www.rabbitmq.com/dlx.html)で扱う設定の前提
Spring-AMQPを使うとConsumerでメッセージを受けたあとに例外が発生するとリトライやエラー退避が簡単にできる。
Scala初心者の基本まとめ

# Scala

## 変数
` var variableVal = 1 `
` var intVar: Int = 1 //型指定変数`


## 定数
` val constVal = 1 `
` val intVal: Int = 1 //型指定定数`

## コレクション  
代表的な型  
* Seq  
* Set  
* Map  

### Seq
順番を保持する  
` val seq = Seq(1, 2, 3) `

#### Seqの1種であるList
    val list = List(1, 2, 3)
    val list = 1 :: 2 :: 3 ::Nil //"::"で結合
    val list2 = list :+ 4 //末尾に追加
    val list3 = list ++ list2 //listの結合

#### Listの操作
    val list = List(1, 2, 3, 4, 5)
    list.head //先頭要素を返す
    list.tail //先頭要素を除いた残りの要素を返す
    list.isEmpty //空かどうか
    list.contains(1) //1を含むか
    list.reverse //逆転
    list.distinct //ユニークな要素を抽出
    list.groupBy(x => x % 2) =>Map((1, List(1, 3, 5))(0, List(2, 4))) //偶数と奇数にわける
    list.sum //リストの合計
    list.reduceLeft((x, y) => x + y) //左から順に加算
    list.map(_ * 2) //リストを2倍したリストを作成(ワイルドカード使用可能)
    list.mkString(",") //リストの中身を","で区切った文字列を作成
    list.count(_ < 3) //3より小さいものをカウント
    list.sortWith((s, t) => s < t) //小さい順にソート

### Set
重複を許さない  
` val numbers = Set(1, 2, 3) `

### Map
キーと値がセット  

    val map = Map(1 -> "red", 2 -> "blue", 3 -> "yellow")
    val red = map(1) =>red  

## 条件分岐
### if文
    if (条件) {
      処理1
    } else if (条件) {
      処理2
    } else {
      処理3
    }

    //式にすることもできる
    val result = if (条件) {
      処理1
    } else if (条件) {
      処理2
    } else {
      処理3
    }

### case文
javaなどと違い、breakを書かなくてもcaseに入ればストップする  

    変数 match {
      case 条件 =>
        処理1
      case _ =>
        処理2
    }

    //式にすることもできる
    val result = 変数 match {
      case 条件 =>
        処理1
      case _ =>
        処理2
    }

## ループ処理
### for文
10回繰り返す  

    for (i <- 0 to 10(リスト)){
      処理
    }

    //ネストしたfor文(九九の結果を表示)
    for (i <- 1 to 9; j <- 1 to 9){
      println(i * j)
    }

    //for文に条件を指定(偶数の時のみ表示)
    for (i <- 1 to 9; j <- 1 to 9 if i % 2 == 0 || j % 2 == 0){
      println(i * j)
    }

    //for文でlistを返す
    val list = for (i <- 1 to 9; j <- 1 to 9){
      yield i * j //yieldを使用することで値を返すことができる
    }

### while文
10回繰り返す  

    var i = 0
    while(i < 10){
      処理
    }

### foreach文
    val list = List(1, 2, 3, 4)
    list.foreach{ e =>
      処理
    }

## メソッド定義
戻り値の型は省略可能(場合によっては"{}"と"()"も)  

    def メソッド名(引数) : 戻り値の型 = {
      処理
    }

    //省略例
    def sum(i, i2) = i + i2

## クラス定義
・クラスの後ろがコンストラクタ引数  
・getter、setterは自動的に定義される(引数がvalで定義されていた場合はgetterのみ、privateならどちらも作成されない)  


    class Car(val carName){
      def displayName = carName
    }

    val car = new Car("car")
    println(car.displayName)

## Option
Option型で定義した変数にnullが入った場合、Noneを返し、それ以外はSomeを返す  
Nullが入っていてもNullPointerExceptionで落ちない    

    val none = null
    val optNone: Option[String] = Option(none)

    optNone match{
      case Some(h) => h
      case None => 0
    }


## タプル
複数の値をまとまりとして表す    

    def sample(a: Int, b: Int) = {
      val sum = a + b
      val sub = a - b
      (sum, sub)
    }

    val tuple = sample(10, 20)
    println(tuple._1) =>30
    println(tuple._2) =>-10
go-aws-authでS3バケット一覧を取得

メモ程度で　Golangの `smartystreets/go-aws-auth` 軽量認証パッケージを使ってS3のバケット一覧リストをとってくる.　

```
package main

import (
  "fmt"
  "github.com/smartystreets/go-aws-auth"
  "net/http"
  "io/ioutil"
)

func main() {

  client := new(http.Client)

  req, err := http.NewRequest("GET", "https://s3.amazonaws.com/", nil)

  awsauth.Sign(req, awsauth.Credentials{
    AccessKeyID: "*******************",
    SecretAccessKey: "*******************",
  })

  resp, err := client.Do(req)
  if err != nil {
    panic(err)
  }
  defer resp.Body.Close()
  resp_body, _ := ioutil.ReadAll(resp.Body)
  fmt.Println(resp.Status)
  fmt.Println(string(resp_body))
}
```
Ubuntu Xenial Xerus 16.04 で tigervnc server(stable:1.7.0) を使う方法

Ubuntu Xenial Xerus 16.04 で tigervnc server(nightly-build:1.6.8) を使う方法 - Qiita
http://qiita.com/ynott/items/950b12d23d76c10a3c9e

というのを投稿しまして、

```
Tigervnc Server は、1.7.0 Beta てのが出てます。今回はこちらは利用しません。
1.6.8 をインストールします
```
と書いたのですが、Ubuntu Xenial Xerus 16.04 を再インストールするにあたり、
1.7.0のバイナリがあったのでこちらを使ってみます。

バイナリ置き場は以下になります。
https://dl.bintray.com/tigervnc/stable/

Ubuntu Xenial Xerus 16.04 用はこちらです。
https://dl.bintray.com/tigervnc/stable/ubuntu-16.04LTS/amd64/

EL7用にもあるのでなかなか良いのではないでしょうか。
https://dl.bintray.com/tigervnc/stable/el7/RPMS/x86_64/

必要なものをダウンロードします。

```
$ wget https://dl.bintray.com/tigervnc/stable/ubuntu-16.04LTS/amd64/tigervncserver_1.7.0-1ubuntu1_amd64.deb
```

あとは、
Ubuntu Xenial Xerus 16.04 で tigervnc server(nightly-build:1.6.8) を使う方法 - Qiita
http://qiita.com/ynott/items/950b12d23d76c10a3c9e
と同じです。
pgpool-II-pg93 を AmazonLinuxにインストール

2016年10月時点

```
sudo yum install ftp://rpmfind.net/linux/centos/6.8/os/x86_64/Packages/libmemcached-0.31-1.1.el6.x86_64.rpm
sudo yum install http://www.pgpool.net/yum/rpms/3.5/redhat/rhel-6-x86_64/pgpool-II-pg93-3.5.4-1pgdg.rhel6.x86_64.rpm
```

バージョンが表示できればインストール完了。

```
pgpool -v
```

pgpool-II-pg94, 95 なども同じようにインストールできるかもしれませんが、未検証です。
Cloud9でPhoenixプロジェクト作成

# 動機
Cloud9のシンタックスハイライトに`elixir`があったので入門がてらやってみた。
一つ一つのコマンドに関しては、あんまり詳しく書かないけど勘弁して下さい。

# asdf導入
nvmとかrvmみたいなバージョンマネージャー。
elixir導入も簡単。

```bash
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf
$ echo '. $HOME/.asdf/asdf.sh' >> ~/.bashrc
$ echo '. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc
$ exec $SHELL -l
```

# Elixirインストール
以下のコマンドをTerminalに入力する。[^1]

```bash
$ asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
$ asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git

$ asdf install erlang 18.3
$ asdf global erlang 18.3

$ asdf install elixir 1.2.5
$ asdf global elixir 1.2.5
```

最後にelixirがインストールされたか確認

```bash
$ elixir -v
```

# PostgreSQLセットアップ
Phoenixは、デフォルトでPostgreSQLを使用する。
便利なことにCloud9にはデフォルトでPostgreSQLがインストールされている。

以下のコマンドを入力する。

```bash
$ sudo service postgresql start
$ sudo sudo -u postgres psql 

postgres-# \password postgres
Enter new password: (passwordを入力)
```

終わったら`Ctrl + d`でコンソールを抜ける。

# Phoenixインストール
パッケージマネージャーとPhoenix本体をインストール

```bash
# [Yn]みたいに聞かれたらYを入力する

$ mix local.hex
$ mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
```

# Phoenixプロジェクト作成
とりあえずハローワールド

```bash
$ mix phoenix.new hello_phoenix
$ cd hello_phoenix
```

このままだと起動できないので設定ファイルを編集する


```hello_phoenix/config/dev.exs
...

config :hello_phoenix, HelloPhoenix.Endpoint,
  http: [port: {:system, "PORT"}], # 起動するPORTを環境変数から取得するように変更

...

config :hello_phoenix, HelloPhoenix.Repo,
  adapter: Ecto.Adapters.Postgres,
  username: "postgres",
  password: "password" # PostgreSQLに設定したpassword入れる,
  database: "hello_phoenix_dev",
  template: "template0", # この行を追加しないと、起動時にDBを作成できない
  hostname: "localhost",
  pool_size: 10
```

# Phoenix起動

```bash
# 初期セットアップ
$ mix ecto.create

# 起動
$ mix phoenix.server
```

起動したらTerminalの`http://localhost:8080/`をクリック -> `Open`をクリック。
ブラウザの新規タブでPhoenixの初期画面が表示される。

# 感想
結構まだ面倒くさい。
Cloud9標準で対応される日が早く来ることを願う。

注釈
[^1]: http://qiita.com/ymtszw/items/28cc7a000236510b71c2
rails tutorial(rails4.0) rbenvでの環境構築

###rails tutorialのためのrbenv設定
rails tutorial4.0版を進めるためにruby2.0.0をインストールしようと思ったがうまくいかなかったのでメモ。システムのrubyのバージョンは2.2.3だった。

```
$rbenv install 2.0.0
```

でエラーが出る。どうやら2.0.0というバージョンはないらしい。
ruby 2.0.0-p648をインストールすることにした。


```
$rbenv install 2.0.0-p648
```

作業ディレクトリでのrubyのバージョンを指定する

```
$rbenv local 2.0.0-p648
```

ここで、`bundle update`すると
```
rbenv: bundle: command not found
```

と言われてしまう。bundlerはrubyのバージョンごとに存在するため、ruby2.0.0-p648のためのbundlerをインストールする必要があるようだ。
　
```
$gem install bundler
$bundle install
```

今度はうまくいった。

###補足

Gemfileのrubyのバージョンは変な気を利かせて
`ruby '2.0.0-p648'`とかしなくていい。

正しくは以下の通り

```rb
#Gemfile
ruby '2.0.0'
#ruby-gemset=railstutorial_rails_4_0

gem 'rails', '4.0.5'

group :development do
  gem 'sqlite3', '1.3.8'
end

gem 'sass-rails', '4.0.5'
gem 'uglifier', '2.1.1'
gem 'coffee-rails', '4.0.1'
gem 'jquery-rails', '3.0.4'
gem 'turbolinks', '1.1.1'
gem 'jbuilder', '1.0.2'

group :doc do
  gem 'sdoc', '0.3.20', require: false
end
```


###参考にしたもの
http://qiita.com/narikei/items/cd029911597cdc71c516
http://qiita.com/Zambiker/items/f24144a1a8e0e2e2b8bf
c++ builder > 計算時間が短い関数の計算時間確認用関数を実装

```txt:動作環境
C++ Builder XE4
```

```
void Test_CalcA();
void Test_CalcB();
void Test_CalcC();
void Test_CalcD();
void Test_CalcE();
```

- 上記のような関数がC実装されている
   - マイコンと共通利用
- それぞれの計算時間は1msec以下
- マイコンでは処理時間が100msecなどかかる
- XE4側で計算速度を測定しながらコードの最適化をしたい

以下を行うデバッグ用関数を作った。

- 多数回の実行を行う
- 実行時間の計測を行う
- 異なる関数で共通利用できるようにする
   - 関数ポインタ使用

```Unit1.cpp
void __fastcall TForm1::debug_loopCheck(void (*func)(void), String name)
{
	DWORD start = GetTickCount();

	for(int loop = 0; loop < 1000; loop++) {
		func();
	}

	start = GetTickCount() - start;

	int nop = 1;
}
```

使用例

```
debug_loopCheck( Test_CalcA, L"Test_CalcA");
debug_loopCheck( Test_CalcB, L"Test_CalcB");
debug_loopCheck( Test_CalcC, L"Test_CalcC");
debug_loopCheck( Test_CalcD, L"Test_CalcD");
debug_loopCheck( Test_CalcE, L"Test_CalcE");
```

右側の文字列リテラル `L"Test_CalcA"`は`debug_loopCheck()`内のブレークポイントで停止した時に「どの関数を処理しているか」を表示するため。

これで処理時間を計測しながら最適化できる。

Cの関数だから上記のようにできた。
C++実装の場合はclosure関連を使うことになりそう。
http://qiita.com/7of9/items/1208c7161e384b7b9547
OracleDB ディスク容量が不足したときの対処方法

ここでは開発環境をターゲットにした対処方法を書いています。つまり、最悪データ喪失したり、DBが壊れても良い環境に対するお手軽な対処方法です。
実際にサービスを運用している環境では、REDO等に影響が出ると思うので以下の方法を安易に実施するのはオススメしません。

# アラートログを削除する
アラートログはORACLE_HOMEの以下のディレクトリにあるので、ディレクトリ配下のファイルをすべて物理削除してよい。DB稼働中でもOK。ログファイルは自動的に再作成される。

インスタンス名：xe の場合
%ORACLE_HOME%/diag/rdbms/xe/xe/alert/

# トレースログを削除する
アラートログはORACLE_HOMEの以下のディレクトリにあるので、ディレクトリ配下のファイルをすべて物理削除してよい。DB稼働中でもOK。ログファイルは自動的に再作成される。

インスタンス名：xe の場合
%ORACLE_HOME%/diag/rdbms/xe/xe/trace/

# 表領域を削除する
以下を参考にすると良い。
http://replication.hatenablog.com/entry/2015/02/17/093000
AndroidでListenerを書かないイベントハンドリング

# イベントハンドリングのためのRxBusとは？
今までリスナーでイベントをハンドリングしていたものを、どこからでも、どこでもハンドリングできるようにする方法。

# 下ごしらえ
RxBusProviderというものを作成しておきます。
http://qiita.com/yyaammaa/items/57d8baa1e80346e67e47

# 使い方
イベント作成：空で大丈夫です。引数もOK。わかりやすいようにクリックイベントにしてみます。

```java
public class OnClickEvent{
  View v;
  public OnClickEvent(View v){ this.v = v; }
}
```

イベント送信：これを書いた場所どこからでも送れるみたいです。

```java
RxBusProvider.getInstance().send(new OnClickEvent(v))
```

イベント受信：これを書いた場所全部で拾ってしまいます。

```java
RxBusProvider.getInstance().toObservable()
.subscribe(o -> {
  if(o instanceof OnClickEvent ){
    // ここでハンドリング
    v.setText("おされた");
  }
})
```

# 補足
Fragmentを使いまわすような構造にしていると、全部でハンドリングされてしまいます。全部で拾わないためにはC#風にsenderとthisと比較すればいいのかな...
初心者による初心者に向けたクラス講座

初投稿です。
今回は初心者に向けたクラスの説明を、初心者の僕から教えたいと思います。
至らぬ点があると思いますが、コメント等でご指摘いただけると嬉しいです。

#クラス
##クラスってなんだ

クラスは設計図みたいなものです
車がよく例にあげられますが、車にはパーツがたくさんありますよね。そして車は走ることが出来ます。
それらが変数と関数みたいな認識で大丈夫です！

```
車で例えると...

クラス　->　設計図
変数　　->　エンジン、ハンドルなどのパーツ
関数　　->　走る、止まるなどの機能
```

##インスタンスってなんだ

クラスは設計図ならインスタンスは設計図から作った実体、つまり車そのものって事ですね！

```
インスタンス　->　車そのもの
```

##コンストラクタってなんだ

車には色々な車種がありますね！ノートとかヴェルファイアとか。
その車はそれぞれ規格が違うから同じように作ってはいけませんね。
ということで、それぞれの車を作るときに情報を入力してあげなくちゃいけません！
車だったら大きさとか何人乗りだとか、そんな感じです。
そしてそれらの情報を元に車を作るときに必要なのがコンストラクタって訳です！
初期条件っていうか設定っていうかそんな感じです。

```
コンストラクタ　->　情報を元に要望の車を作ってくれる
```

##書き方がわからない

言葉の意味はわかったけど書き方がわからない人へ、テキトーに書くから理解してください笑。
(ここからはprocessingで書きます。別言語を勉強している方は雰囲気でも感じていだだければ、と思います。)
###まずはクラスの書き方！

```java
// 車の設計図(クラス)
class Car{
	// 高さと横幅と長さ、何人乗りかを変数にする
	float hight, width, length;
	int   seat_num;
	
	// 車をデータを元に作ってくれるやつ(コンストラクタ)
	Car(float _h, float _w, float _l, int _s){    // 引数にデータを入力しよう
		hight    = _h;
		width    = _w;
		length   = _l;
		seat_num = _s;
	}
	
	void run(){
		// 車が走る処理
	}
	void stop(){
		// 車が止まる処理
	}
}

```
クラスの書き方はこんな感じです！

###次はインスタンスの作り方だ！

```java
// ノート(高さ100, 横幅100, 長さ200, 8人乗り)を作る
Car note = new Car(100, 100, 200, 8);
```

`クラスの名前` `インスタンスの名前` = new `クラスの名前`(`コンストラクタに入れたい引数`);

もっと簡単に言うと、

`設計図の名前` `車の名前` = new `設計図の名前`(`高さとか横幅とかの情報`);

みたいな感じです！

###最後にインスタンスの使い方だ！

```java
// ノートを作る
Car note = new Car(100, 100, 200, 8);

// 高さが知りたい！
println(note.hight);
// 結果：100

// 車を走らせたい！
note.run();
```

クラスの中の変数は`インスタンス名`.`変数名`　で、

クラスの中の関数は`インスタンス名`.`関数名`(`引数`)　のように書きます。

わかってもらえたでしょうか？

##まとめ

以上、クラスの大まかな説明でした。具体例を多めにして、初心者にもわかりやすいように説明したつもりでしたが、どうでしたか？皆さんの勉強への手助けとなれていれば嬉しいです。
AWS Lambdaで現在時間が変わらない

Lambdaを初めて触って、変なところでハマったのでメモ。

環境は `Node.js 4.3`

## コード

```js
var date = +(new Date());

exports.handler = (event, context, callback) => {
    console.log(date);
    context.succeed();
};
```

で、テスト2回実行。

```
2016-10-06T07:16:27.747Z  xxxxxxxx-yyyy-zzzz-XXXX-YYYYZZZZxxxx  1475738187736
2016-10-06T07:21:15.799Z  xxxxxxxx-yyyy-zzzz-XXXX-YYYYZZZZxxxx  1475738187736
                                                                ^^^^^^^^^^^^^
```

おお？

## 原因

```js
// ↓こいつが悪いやつです
var date = +(new Date());

exports.handler = (event, context, callback) => {
    console.log(date);
    context.succeed();
};
```

以下のように修正。

```js
exports.handler = (event, context, callback) => {
    var date = +(new Date());
    console.log(date);
    context.succeed();
};
```

テスト実行

```
2016-10-06T07:25:47.651Z  xxxxxxxx-yyyy-zzzz-XXXX-YYYYZZZZxxxx  1475738747651
2016-10-06T07:26:19.101Z  xxxxxxxx-yyyy-zzzz-XXXX-YYYYZZZZxxxx  1475738779101
```

でめたしでめたし。

## その他

逆に `const` 的に扱えるのでそういう場合はいいかも？

……いや、ないか。
S3の期間限定URLを手動で取得するのはCyberDuckが超便利

# 大容量ファイルの送信のベストプラクティスがない

宅ふぁいる便やデータ便などのサービスがありますが、いずれも広告収入で成り立っているため、必ずしもUIが、使いやすいとは限りません。またサードパーティのサービスをつかうことに抵抗のある会社もあるかと思います。

# Amazon S3 をストレージ代わりにしたい

大容量のストレージと言えば、Amazon S3です。アクセスコントロールもきめ細やかにできます。自社サーバではないものの、S3上のファイルを暗号化できるオプションもあり、セキュリティに関してはほぼ問題ないと言っていいでしょう。

特に便利なのは署名付きURLを発行できるところですね。有効期限も設定できて便利です。SDKを使えばプログラムからも操作可能です。しかしいちいちコマンドを叩くのは面倒。非エンジニア層に優しくない。

# CyberDuck が、S3クライアントとして優秀

CyberDuckは、FTP（S）クライアントとして有名ですが、S3のクライアントとしても使えます。アクセスキーとシークレットアクセスキーがあれば、接続できます。

![SS 2016-10-06 16.00.26.png](https://qiita-image-store.s3.amazonaws.com/0/53489/6ce316ea-7688-0907-5d53-bcb5a1e683ac.png)

ログインすれば、普通のFTPクライアントと同様に使えます。

そしてS3にログインしている時に、ファイルを選択してコンテキストメニューを出すと、「URLをコピー」というメニューがありますので、そこを更に掘ると、なんと、各期限つきのSigned URLがつらつらと出てきます。

![SS 2016-10-06 16.08.59.png](https://qiita-image-store.s3.amazonaws.com/0/53489/bf6a43af-ebfc-51cc-3579-3f41f37ac463.png)

　優しいことに、

* 一時間限定のURL
* 一日限定のURL
* 一週間限定のURL

とビジネス用途にあった期間があらかじめセットされています。これをメールなどに貼り付ければ、超簡単にセキュアにファイルを転送できますね。

CyberDuckはバージョン 5.0.11 (20753)のMac版で検証しました。
CSSだけで○番目以降の要素にだけ擬似クラス、疑似要素を適用する

既出な上にあんまり使う機会はないかもしれないけど一応メモ。


```CSS
li:nth-child(n + 3):last-child {
    color: #FF0000;
}
```

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/134806/14d05c8d-0c90-85a6-5fe2-7d3bb6115625.png)


こんな感じになります。
nth-child(-n + 3)とかにすると3個以下の場合に適用させることが出来ます。
`::after`とかの疑似要素や、他の擬似クラスもどんどん追加できるのでCSSだけで割と多くのことが出来ますね。
DatabaseCleanerでApartmentの共有テーブルも掃除する

## 注意

この方法では共有テーブルが多くなるほどトランザクションが増えるので遅いです 
共有テーブルの数には注意すべきかもしれません（本当に共有テーブルの必要があるのか否か）

## 前提
1. gem [database_cleaner](https://github.com/DatabaseCleaner/database_cleaner)
2. gem [apartment](https://github.com/influitive/apartment)

## 共有テーブルを設定していたら
```ruby:config/initializers/apartment.rb
# Apartment Configuration
Apartment.configure do |config|
  config.excluded_models = %w{Tenant}
end
```

## そのテーブルも掃除対象にする必要がある

共通テーブルはpublicに存在するため通常の設定ではロールバックされない

```ruby:spec/rspec_helper.rb
RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation)
    DatabaseCleaner.strategy = :transaction

    # ！！共通テーブルは接続が異なるので個別の定義が必要！！
    Apartment.excluded_models.each do |name|
      model = Rails.const_get(name)
      DatabaseCleaner[:active_record, model: model].strategy = :transaction
    end
  end

  config.around(:each) do |example|
    # テストするDBに切り替える
    Apartment::Tenant.switch!('sample')

    DatabaseCleaner.cleaning do
      example.run
    end

    # public なテナントに戻る
    Apartment::Tenant.reset
  end
end
```

## 参考

[Railsで複数データベース使用時のDatabaseCleanerの設定](http://kawahiro.hatenablog.jp/entry/2014/06/09/011954)
[CakePHP 2.x]CakePHPプラグインの作り方

#なぜプラグインを作るのか
そこに共通機能があるから！

Controllerの共通機能をComponentにするのと同じように、
プロジェクトの共通機能はプラグインにしましょう。

-------------------------

#環境
- PHP 5.6
- CakePHP 2.x

-------------------------
#プラグインに必須のファイル
composer.json

以上

-------------------------
#プラグイン側のcomposer.json
```json:composer.json
{
    "name": "パッケージ名",
    "type": "cakephp-plugin",
    "description": "説明",
    "repositories": [
        { "packagist": false },
        {
            "type": "composer",
            "url": "https://packagist.jp/"
        }
    ],
    "require": {
        "composer/installers": "*"
    },
    "extra": {
        "installer-name": "プラグインのインストール名"
    }
}
```

##必須項目
- name：パッケージ名。小文字。プラグインをインストールするときに指定する名前。
- type：プラグインの種別を指定できます。これはcomposer/installersライブラリの機能。CakePHPの場合はcakephp-pluginとします。
- require：typeを指定するためにcomposer/installersをインストールするようにします。

##任意の項目
- extra：composer/installersライブラリの機能。installer-nameを指定すると、パッケージ名ではなく、ここで指定されたディレクトリにインストールされるようになる。

-------------------------
#プラグインを利用する側のcomposer.json

以下が、プラグインを利用する側のcomposer.jsonの例です。
手で書いても良いですが、composerコマンドで指定するほうが良いです。
注：以下では、非公開のプライベートリポジトリを使用するため、リポジトリURLを指定しています。

```json:composer.json
{
    "repositories": [
        {
            "type": "git",
            "url": "git@github.com:リポジトリ名"
        }
    ],
    "require": {
        "パッケージ名": "バージョン"
    }
}
```

```bash:composerコマンド
composer require 'パッケージ名:バージョン'
```

-------------------------
#プラグイン内のファイル構成

必要な機能だけ用意することができます。

```:例
プラグインroot
+---Lib
+---Model
+---Test
|   \---Case
|       \---Model
\---composer.json
```

-------------------------
#プラグインのテスト

プラグインを利用する側から、通常のテストと同様に実行することができます。

公式ドキュメントにも記載されています。

```bash:例
# プラグインのテストを実行する
./Console/cake test プラグイン名 Controller/コントローラ名
```
[コマンドラインからのテスト実行](http://book.cakephp.org/2.0/ja/development/testing.html#run-tests-from-command-line)
[brew] Error: /usr/local must be writable!

First if you want to update the homebrew to the recent version you can use this command:

```
brew update
```

But recently I got a error message when I run this command:

```
Error: /usr/local must be writable!
```

It seems like I do not have the permission to access this directory. Indeed I do not have the permission of this directory, because this directory belongs to **wheel** group. 

After google some solutions, I solved this by the following method:

Change the group and give a write permission of this directory and all the sub files or directory with this two command.

```
sudo chgrp -R admin /usr/local
sudo chmod -R g+x /usr/local
```

Then run the brew update.

That's all.
用語解説：オラクル攻撃

パディングオラクル攻撃のオラクルって何だっけという話。

本当は、ちゃんとした数学的な理論があるのですが、そういう正確さは脇へ置いて、分かりやすさを優先した説明を試みたいと思います。というわけで、以下の説明は間違っているかもしれませんが、そこは自己責任ということでひとつ。。。

#これがオラクルだ！

攻撃者は、攻撃の標的（例えば認証サーバ）が持っている秘密情報（例えばパスワード）を知りたいとします。攻撃者は何らかの「答案」を標的へと送信し、被害者の応答（例えばログオン成功・失敗）によって、さきほどの「答案」が「正解」だったか「不正解」だったかを知ることができます。

よくある構図ですよね。

このとき、標的サーバの実装は「答案が正解なら正解、答案が不正解なら不正解という応答だけを返し、それ以外の情報を渡さない」という対応に徹するのが基本です。この基本がきちんとできていれば、攻撃者は「オンライン総当たり攻撃」を仕掛けるしかありません。これならいいのです。オラクル攻撃は成立しません。

しかし、この標的が「正解か不正解かの1ビット情報だけでなく、攻撃者にヒントを与えるような何らかのデータを返してしまう」とか「本当は不正解なのに正解という誤った応答を返してしまう場合がある」ような実装だったらどうなるかということです。攻撃者は、このようなヒント情報をうまく利用すれば、「オンライン総当たり攻撃」よりもはるかに少ない手数で、正解に辿り着いてしまう可能性がありますね！

これがオラクル攻撃です。標的サーバが攻撃者に与えてしまうヒントのことを神託（オラクル）と呼びます。ヒントを与えてしまうサーバのことを預言者（オラクル）と呼ぶ場合もあるようです。

そんなわけで、オラクル攻撃は一般的に、オンライン総当たり攻撃ほどではありませんが、かなり大量のアクセスを伴います。

#POODLE

POODLEは、標的クライアントと標的サーバの間に介在して、クライアントからサーバへ送られる暗号通信の一部を改変する中間者攻撃の一種です。暗号通信の改変ですから、本来ならば受信したサーバ側で矛盾を検知してエラーを出さなければおかしいのですが、SSL3.0のCBCのパディングの仕様にあいまいな部分があり、その影響で、本来エラーを出すべきタイミングでエラーが出ない場合があるのです。それを探していくことで、256分の1の確率で、暗号文中の1文字を解読できてしまいます。1文字目を解読すれば、同じ手口で256分の1の確率で2文字目も解読できます。2文字目を解読すれば、同じ手口で256分の1の確率で3文字目。。。というわけで、オンライン総当たり攻撃よりはるかに少ない手数で暗号文の解読ができてしまいます。

この攻撃を実用的に行うには、標的クライアントから標的サーバへ、一定の条件を満たす（攻撃者にとって都合がいい）データを何度も繰り返し送信させ、さらに個々の通信を改ざんし、サーバの応答を観察しなければなりません。しかし、上手いことバレないようにやれば出来なくはないかも知れない程度には非現実的と言い切れない（汗）攻撃方法と言えます。

TLS1.0以降では、SSL3.0で未定義だったCBCのパディング部分の内容を厳密に定義するという対策が施されました。

#DROWN

これは、以下の__両方__の条件を満たす場合に成立する攻撃です。

1. TLS鍵交換にRSAを使っている。
2. そのTLSサーバと同じRSAキーペアを利用するSSL2.0サーバが、世界のどこかに存在する。

弊社のTLSサーバはSSL2.0を無効にしてあるから安全！と思っても、同じRSAキーペアを利用するSSL2.0サーバが__世界のどこか__にあれば、攻撃者はそれを暗号解読支援装置として利用してしまいます。したがってDROWN攻撃への対策は、該当するSSL2.0サーバを全部停止することです。また、別解として、TLSサーバでRSA鍵交換を止めてしまい、代わりにDHEやECDHEを使うという方法もあります。

攻撃手順としては、攻撃者はまずTLS通信をキャプチャし、そこに出てくるpre_master_secretの解読を試みます。このときにSSL2.0サーバを支援装置として使います。もっとも常に解読できるわけではなく、暗号文1,000件につき解読成功1件ぐらい出ればまあ上々とか、その程度です。pre_master_secretが手に入れば、あとはmaster_secret、key_block、暗号文本体と解読を進めていくのは容易なことです。

で、SSL2.0サーバをどうやって利用するかですが、SSL2.0ハンドシェイク中のCLIENT-MASTER-KEYメッセージ（SSL3.0以降のClientKeyExchangeに相当する）に含まれるENCRYPTED-KEY（SSL3.0以降のpre_master_secretに相当する）に細工し、手持ちの暗号化されたpre_master_secretに一種の改変を施して送信します。SSL2.0サーバはこれを自分のRSA秘密鍵で復号化し、PKCS#1v1.5のパディング形式に合っていれば合格、合っていなければ不合格と判定します。攻撃者はこれをヒントとして利用し、改変の中身を変えて不正なメッセージを何度も送信することで「正解」の範囲を少しずつ絞り込んで行きます（Bleichenbacher攻撃と呼ばれる）。これを繰り返して、最終的に「正解」に辿り着けば、見事pre_master_secret解読成功というわけです。

これに対するサーバ側の対抗策は、合格・不合格の判定結果をクライアントに教えないことです。しかし、SSL2.0では通常、鍵交換終了後の最初の暗号化メッセージは__サーバ側__から送出するCHALLENGEです。クライアントがこれを解読すれば、さっきの改変暗号文が合格だったか不合格だったか分かってしまいますので、結局、ご神託が攻撃者に届いてしまいます。

一方、SSL3.0以降では、鍵交換終了後最初の暗号化メッセージは__クライアント側__から送信するFinishedです。pre_master_secretの中身を知らない攻撃者はこのメッセージを正しく送信できませんので、サーバからご神託を引き出す段階まで辿り着くことはできません。あくまで、SSL2.0サーバの存在がDROWN攻撃成功の条件です。

以上！世の中まだまだどこに地雷が埋まっているか分かりません。幸運を祈る。

#リファレンス

##POODLE

This POODLE Bites: Exploiting The SSL 3.0 Fallback
https://www.openssl.org/~bodo/ssl-poodle.pdf

JVNDB-2014-004670
OpenSSL およびその他の製品で使用される SSL プロトコルにおける平文データを取得される脆弱性
http://jvndb.jvn.jp/ja/contents/2014/JVNDB-2014-004670.html

##DROWN

The DROWN Attack
https://drownattack.com/

JVNDB-2016-001554
SSLv2 の暗号通信を解読可能な脆弱性 (DROWN 攻撃)
http://jvndb.jvn.jp/ja/contents/2016/JVNDB-2016-001554.html
pre,post,preun,postunの$1の値

## pre,post,preun,postunの$1の値

|command|pre|post|preun|postun|
|---|:---:|:---:|:---:|:---:|
|rpm -i|1|1|-|-|
|rpm -e|-|-|0|0|
|rpm -U|2|2|1|1|

## rpm -Uの実行順序
1. rpm -i 新しいrpmパッケージ
2. rpm -e 古いrpmパッケージ

## 参考
https://vinelinux.org/docs/vine6/making-rpm/mr-symlink.html

## SPECファイルの分岐処理
<pre>
# 以下rpmのインストール、アンインストール時の処理を指定する。
# rpmパッケージの中身を配置する前に処理される内容。
%pre

if [ $1 = 1 ]; then
    # rpm -iのときに処理される内容
    :
    echo "rpm -i pre"
elif [ $1 = 2 ]; then
    # rpm -Uのときに処理される内容
    :
    echo "rpm -U pre"
fi

# rpmパッケージの中身を配置した後に処理される内容。
%post

if [ $1 = 1 ]; then
    # rpm -iのときに処理される内容
    :
    echo "rpm -i post"
elif [ $1 = 2 ]; then
    # rpm -Uのときに処理される内容
    :
    echo "rpm -U post"
fi

# インストールしたファイルを削除する前に処理される内容。
%preun

if [ $1 = 0 ]; then
    # rpm -eのときに処理される内容
    :
    echo "rpm -e preun"
elif [ $1 = 1 ]; then
    # rpm -Uのときに処理される内容
    :
    echo "rpm -U preun"
fi

# インストールしたファイルを削除した後に処理される内容。
%postun

if [ $1 = 0 ]; then
    # rpm -eのときに処理される内容
    :
    echo "rpm -e postun"
elif [ $1 = 1 ]; then
    # rpm -Uのときに処理される内容
    :
    echo "rpm -U postun"
fi


</pre>

## 上記内容をSPECファイルに書いて、rpmコマンドを実行
<pre>
[root@todanano ~]# rpm --prefix=/root/mytest -ivh MyPakcage-01.00-00.el6.x86_64.rpm
Preparing...                ########################################### [100%]
rpm -i pre
   1:MyPakcage              ########################################### [100%]
rpm -i post
[root@todanano ~]# rpm -e MyPakcage
rpm -e preun
rpm -e postun
[root@todanano ~]# rpm --prefix=/root/mytest -ivh MyPakcage-01.00-00.el6.x86_64.rpm
Preparing...                ########################################### [100%]
rpm -i pre
   1:MyPakcage              ########################################### [100%]
rpm -i post
[root@todanano ~]# rpm --prefix=/root/mytest -Uvh MyPakcage-01.00-01.el6.x86_64.rpm
Preparing...                ########################################### [100%]
rpm -U pre
   1:MyPakcage              ########################################### [100%]
rpm -U post
rpm -U preun
rpm -U postun
[root@todanano ~]#
[root@todanano ~]#
[root@todanano ~]# rpm -e MyPakcage
rpm -e preun
rpm -e postun
[root@todanano ~]#
[root@todanano ~]#
[root@todanano ~]#

ちなみに、インストールされていない状態で-Uでインストールすると

[root@todanano ~]# rpm -e MyPackage
rpm -e preun
rpm -e postun
[root@todanano ~]#
[root@todanano ~]# rpm --prefix=/root/g3test -Uvh MyPackage.rpm
Preparing...                ########################################### [100%]
rpm -i pre
   1:MyPackage              ########################################### [100%]
rpm -i post
[root@todanano ~]#

というように、-Uだけど、-iとしてインストール処理が走る。

純粋なインストールのタイミングだけ何かする処理があるが、
いきなり-Uでインストールしてくることを考慮して、、、、
というようなことを考える必要は無さそう（・ω・

</pre>
TensorFlow + CUDA > 実行環境の検討 / PCIパススルー対応かどうか

現在、自分が持っているリソースとしては

- GeForce GTX 750 Ti
- ASRock Z170M Pro4S [Intel Z170chipset]
- Windows 8.1 pro (64bit)
- Visual Studio Community 2013 (以下、VS)
- CUDA 7.5

上記環境は主にFPGA開発用としてOSは8.1のままで使おうと考えている。

一方で、CUDAを使ったTensorFlowでのConvolutional Neural Networkを試そうとしたときに、MacOS XかLinuxでの実行となる。
http://qiita.com/Yuichi801/items/de6d36fc9bc9a108725f
> Googleがオープンソース化した機械学習のツール「TensorFlow」はMac OSとLinuxにしか対応していないのですが、

Ubuntuを使うことになるだろうか。

そうなると以下のいずれかが必要となるだろう。

- OS切替え
- VirtualBoxなどの仮想環境使用


FPGA開発日記さんのブログ
Hyper-V上のUbuntuにTensorFlowのインストール
http://msyksphinz.hatenablog.com/entry/2016/03/16/024623
> Hyper-Vを利用する利点としては、VirtualBoxではGPGPUを使えないが、Hyper-Vでは使えることだ。

VirtualBoxではCUDAもだめだろうか。

<hr>(追記 2016/10/06)

@it__ssei さんに情報をいただきました。
感謝です。
Windows10 に Ruby2.3.1 をインストールしたら gem の install/update で SSL エラーが出た


## 症状
[ここ](http://rubyinstaller.org/downloads/)から最新版(2.3.1 x64)インストーラをダウンロードしてインストールした。
その後 `gem update --system` をしたら以下のエラーが出た。
`gem install sass` でも同様のエラーが出た。

```
ERROR: While executing gem .. (Gem::RemoteFetcher::FetchError)
SSL_connect returned=1 errono=0 state=SSLv3 read server certificate verify faild ( https://api.rubygems.org/specs.4.8.gz)
```

## スマートな解決方法 (コメントを元に実践してみました)
1. [ルート証明書](http://curl.haxx.se/ca/cacert.pem)をダウンロードしてくる。
1. コマンドラインで次のコマンドを発行する。 `set SSL_CERT_FILE=C:¥Users¥myname¥Desktop¥cacert.pem`
	* このとき `=` の前後にはスペースを入れないこと。
	* 今回は myname というユーザのデスクトップに置いています。
1. 再度 install/update コマンドを試してみる。

## (旧) 解決方法
1. [ルート証明書](http://curl.haxx.se/ca/cacert.pem)をダウンロードしてくる。
1. 次のコマンドでデフォルトの証明書の位置を調べる。
`ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE"`
1. 指定されたフォルダをせっせと作る！
自分の場合は `C:/Users/Justin/Projects/knap-build/var/knapsack/software/x64-windows/openssl/1.0.1l/ssl/cert.pem` と表示された。
1. 作ったフォルダに1でダウンロードしたファイルを `cert.pem` というファイル名で設置する。
1. 再度 install/update コマンドを試してみる。

## いろいろ調べてみたけど
「gem のインストールフォルダに新しい証明書を置けば直る」とか、「 source を http 指定にすればいい」とか、「証明書を持っている gem をインストールすればいい」とか(そもそもインストールコマンドが動かない)、いろいろ出てきたので、片っ端から試してみたけど全てダメ。
最終的にたどり着いたのがデフォルトで参照する証明書の場所を探して、そのフォルダやファイルを用意するという、なんともやるせない解決方法だった。

## 参考文献
[WindowsのRubyでHTTPSのアクセスが落ちるのを回避する](http://todanosuke.com/ruby-windows-ssl-problem.html)
Angular2チュートリアル「Tour of Heroes」で”the server responded with a status of 404”のエラーで先に進めない対処法方法

WebIDEの「Cloud9」を使用してAngular2の公式チュートリアルを進めていますが、「Routing」の章で引っかかってしまいました。
実行しても"the server responded with a status of 404(Not Found)"のエラーで止まってしまいます。

色々調べた結果、Baseタグをrootではなくサブディレクトリにするだけでした。
index.hemlが
```<html>
    <head>
        <base href="/angular-tour-of-heroes/">
```

公式チュートリアルでは、サブディレクトリの記述が無かったので非常に苦労しました。