OmniAICreator/Qiita-1.07M huggingface dataset:
aws上でオートスケールするインスタンスのどれか一つにアクセスする

# ec2インスタンスすぐ死ぬ

aws上でしばしばauto scalingするアプリケーションを開発していると、先ほどまでsshしていたインスタンスがいつの間にか死んでいたりします。
設定をちょくちょく変えながら試行錯誤している場合などは開発環境ですらそうで、ロードバランサーの口のほうでは22番を開けていないので、いちいち手と脳でリバースプロキシするのが結構面倒でした。
そこで、その環境内のどのインスタンスでもいいから繋ぎたいというときのため、タグで探して一番上にでてくるインスタンスにsshするシェルを書きました。

# 動作環境

yosemite
ansible 1.9.4
ansible ec2

# 中身

```
TAG_NAME=$1

HOSTNAME=$(ec2.py --list | grep -A 1 \"tag_Name_$TAG_NAME\" | grep ec2)

IP_PART=$(echo $HOSTNAME | sed 's/^.*_\([0-9]\{1,3\}_[0-9]\{1,3\}_[0-9]\{1,3\}_[0-9]\{1,3\}\).*$/\1/' | sed 's/_/-/g')

ssh ec2-user@ec2-$IP_PART.ap-northeast-1.compute.amazonaws.com ${@:2}
```

リージョンは割り切りました。

# 使い方

bash_profileなど普段使うものの設定ファイルに下記を追加

```
function essh() { ~/path/to/this/script.sh "$@" ;}
PATH="$PATH:~/path/to/ansible/inventory"
```

そして

```
 essh tag_fuga_piyo {-i 必要なら}
```
OrchestrationDesignerのtimestampを消す方法


コールフローを作成するOrchestration Designer(以下OD)で
プロジェクト差分管理を行う際に、generate時のTimestampがJavaファイルに書き込まれて、困ったことはありませんか？

下記方法でタイムスタンプの記述のON,OFFが選べます。
チェックを外すことで、Timestampが記述されなくなります。

![aaod.PNG](https://qiita-image-store.s3.amazonaws.com/0/91271/4b562f38-34dd-97f5-1155-b98a4e12370f.png "aaod.PNG")

https://www.devconnectprogram.com/site/global/products_resources/avaya_aura_orchestration_designer/support/faqs/call_flow.gsp#190


タイムスタンプの代わりに
timestamp gereration disabled
の文言が入り、再generateしても、
文言が変わらない事を確認できました。

クラスの上部にもtimestampのコメントがありますが、
こちらは、Javaファイルと直接関係するノード内容に変更があった際に、timestampが書きかわるので、
Javaファイルの処理変更と同時に更新されます。

GitやSVNなどでのバージョン管理が容易になります。ご参考ください。
brewでFailed to connect to localhost port 8181: Connection refused

```
fatal: unable to access 'https://github.com/Homebrew/homebrew/': Failed to connect to localhost port 8181: Connection refused
```

こんなエラーが出ました・・・


解決策は調べてもわからず＞＜


解決をしたのは、一度homebrewをuninstall
再度入れなおしたら直った（そりゃそうだ。


消す前に
```
brew list
```
入っているものを確認しておくことを忘れずに！


※自己責任で！
paiza.ioを使ってみた＜基本的な操作の説明＞


「paiza.io」というものを見つけました。

Web上でコーディングができます。画期的です。

イントラなどの制限されたNW環境や、シンクライアントなどの自由がきかない環境で役立ちますよ。



![スクリーンショット 2016-04-11 21.33.55.png](https://qiita-image-store.s3.amazonaws.com/0/117147/4871e2a1-9900-cc19-6bc5-f57e90405189.png)


***

早速使い方です。
まずは、基本的なものだけです。


![pz1.png](https://qiita-image-store.s3.amazonaws.com/0/117147/d384dfed-1db3-d0a5-f5ff-9c37dd8ebad6.png)

上記はPerlをかいてみたサンプルです。

１つずつ説明しますね。

***
###基本的なコードの実行

まず左上の緑色のボタンで、言語を選択します。

次に普通にコードを書きます。
左下の実行ボタンを押せば、コードが実行され、下の出力欄に結果が出ます。

```pl:main.pl
print("testMessage\n");
```

***
###入力データをつかう

下の出力欄のタブで、「入力」を選択します。

![pz3.png](https://qiita-image-store.s3.amazonaws.com/0/117147/a9b08cce-e90a-ae93-54f1-5c557e97feac.png)

そこに入力データをかいて、STDINで受け取ると、
入力データも使うことができます。

```pl:main.pl
my $line = <STDIN>;
print "$line\n";
```


***
###ファイルからデータを取得する

ファイル連携もできます。
上部、言語選択の下で「＋」をおして、新規ファイルを作ります。


![pz2.png](https://qiita-image-store.s3.amazonaws.com/0/117147/689e2278-0dc7-2303-cf32-168b59e6fd22.png)

```pl:main.pl
open(DATAFILE, "< File1") or die("error :$!");
while (my $line1 = <DATAFILE>){
  chomp($line1);
  print "$line1\n";
}
```
openでファイルを指定して、データを取り出すこともできます。

***

ここでは基本的な３種類の使い方を説明しました。



まだBeta版ですが、以下の言語が使えるようです。

- Swift
- C
- C++
- Objective-C
- Java
- PHP
- Ruby
- Python2
- Python3
- Perl
- Scala
- Go
- C#
- Haskell
- Clojure
- D
- Erlang
- R
- JavaScript
- CoffeeScript
- Cobol
- VB
- F#
- Bash
- MySQL


今後、こういった開発環境も仮想化して実態を持たないようになっていくと思います。
状況によってはかなり便利ですね。今後に期待です。
XamarinでiOSの実機デバッグをする方法

昨日、業務系システム開発勉強会に参加し、Xamarin iOS を触ってみました。
で、Xamarin Studio で iOS の実機デバッグを行おうとしたところ、はまったのでメモしておきます。

以下の田淵さんの記事を参考にしました。

[Xcode 7 と Xamarin Studio Starter で１円も払わずに自作 iOS アプリを実機確認する (ｲﾝｽﾊﾟｲｱ記事)](http://ytabuchi.hatenablog.com/entry/2015/09/18/191258)

Xamarinで実機デバッグをする場合は、Xamarinでプロファイルの生成ができないので、Xcodeで生成されたプロファイルを拝借するために、プロジェクト名をXcodeと揃えるというものです。

しかし、Xcodeのプロジェクト名では、アンダースコアをハイフンに置き換えてしまいます。
しかも、Xcodeのプロジェクト名をコピーして、Xamarinに貼り付けたら、ハイフンがアンダースコアに戻ってしまう。。。ここ、気づきにくい！！

このままデバッグするとエラーになります。

`Error: No installed provisioning profiles match the installed iOS code signing keys.`

この場合、info.plist の Bundle Identifier を修正する必要があります。

![image](https://qiita-image-store.s3.amazonaws.com/0/4633/1e584ee6-04ef-686b-bdd2-c74b716908e7.png)
Android の Parcelable なオブジェクトの保存と復元のユニットテスト

[`Parcelable` インターフェイス](http://developer.android.com/reference/android/os/Parcelable.html)を実装したクラスについて、[`Bundle`](http://developer.android.com/reference/android/os/Bundle.html) などへの保存とそこからの復元の機能をテストしたい。

ちょっと調べると、[`Parcel`](http://developer.android.com/reference/android/os/Parcel.html) に直接 `Parcelable` なオブジェクトを保存して復元する方法を使ってユニットテストするという方法がいくつか見つかる。

* [Stuff I keep Forgetting How to Do: Unit Test Your Custom Parcelable](http://stuffikeepforgettinghowtodo.blogspot.jp/2009/02/unit-test-your-custom-parcelable.html)
* [Parcelableなクラスの単体テスト - _development,](http://d.hatena.ne.jp/esmasui/20121010/1349888023)

これらの方法だと、復元時に `YourParcelableClass.CREATOR.createFromParcel(parcel)` という感じでテスト対象のクラスの `CREATOR` を明示的に指定する必要がある。 もうちょっといい方法にしたいなー、と思って、いったん `Bundle` に追加した後、その `Bundle` を `Parcel` に保存して復元する方法を使うことにした。

```java
// 必要な import 文。
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;

/**
 * {@link Parcelable} を {@link Parcel} に保存したあと復元して返す。 テスト用。
 * @param value 保存して復元する対象。
 * @param <T> 対象の型。
 * @return 復元した後の値。
 */
private static <T extends Parcelable> T saveToAndRestoreFromParcel(T value) {
    String key = "key";
    Parcel p = Parcel.obtain();
    try {
        Bundle bundle = new Bundle();
        bundle.putParcelable(key, value);
        p.writeBundle(bundle);

        p.setDataPosition(0);
        Bundle restoredBundle = p.readBundle(value.getClass().getClassLoader());
        return restoredBundle.getParcelable(key);
    } finally {
        p.recycle();
    }
}
```

こういうメソッドを 1 個用意しておけば、あとは任意の `Parcelable` なオブジェクトをこのメソッドに渡すことで、保存して復元した後のオブジェクトを取得できる。

```java
YourParcelableClass restoredObj = saveToAndRestoreFromParcel(obj);
```

って書いたところで、ほぼ同じことを Stack Overflow に書いてる人がいることに気付いた。

* [Android Unit Testing: Bundle/Parcelable - Stack Overflow](http://stackoverflow.com/a/13507191/3191716)
netrwでset numberが無効になってしまう

## はじめに

MacOS XではターミナルでVimが使えますが、バージョンが7.3だったりします。

7.3でも問題ないですが、たまに7.4以上が必要になります。

スニペットか何かのプラグインを試すために、私も7.4に上げてみたのですが、なぜかnetrwで設定が無効になってしまい長いこと困っていました。

長らく放置していたのですが、先ほど解決したのでそのことを紹介したいと思います。

## 設定してみよう

解決策は簡単です。

`~/.vimrc`に下記を追加するだけです。

```.vimrc
let g:netrw_bufsettings = 'noma nomod number nobl nowrap ro'
```

私はrelativenumberを使っているので、下記を追加しました。

```.vimrc
let g:netrw_bufsettings = 'noma nomod relativenumber nobl nowrap ro'
```

ちょっと補足すると、実行時にautoload/netrw.vimからs:NetrwInitが呼ばれるようです。

s:NetrwInitは、もしg:netrw_bufsettingsが定義されていなかったら、その変数を"noma nomod nonu nobl nowrap ro"で上書きする関数のようです。

なので、g:netrw_bufsettingsを定義しておけば上書きされないようです。

## あとがき

私はプロジェクトのルートディレクトリで`vi .`と打って、Vimを起動しています。

CtrlPを使っているので、あまりnetrwは使いません。

ですが、ファイルをタブで開いたり、リネームしたりするのに使っています。

ちょっとしたことですが、これでnetrwでのカーソル移動が楽になります :smile: 

## 参照URL

[How do I configure .vimrc so that line numbers display in netrw in Vim? - Stack Overflow](http://stackoverflow.com/questions/8730702/how-do-i-configure-vimrc-so-that-line-numbers-display-in-netrw-in-vim)
[kintone]和暦の生年月日から満年齢を算出したい

こんな感じにフィールドを配置して、和暦の誕生日や年月日諸々を入力、保存/編集時に満年齢が計算されると便利という事でさくっと作ってみました。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/76660/ae78ac3c-aa48-b07b-40b1-e3235c535f18.png)

##フィールド定義

|フィールド名|フィールドコード|型|
|:-----------|:------------|:------------|
|誕生日（年号）|和暦誕生日年号|ドロップダウン |
|誕生日（年）|和暦誕生年|数値型 |
|誕生日（月）|和暦誕生月|数値型 |
|誕生日（日）|和暦誕生日|数値型 |
|満年齢|満年齢|数値型|

##動作

- 和暦の誕生日に該当する項目[誕生日（年号）,誕生日（年）,誕生日（月）,誕生日（日）]に値をセットし、保存を行うと項目[満年齢]に年齢がセットされる。
- 内部的には和暦の誕生日→西暦の誕生日に変換、西暦の誕生日から現時点での年齢を算出する。

##ソースコード

```lang:javascript
    kintone.events.on(['app.record.create.submit','app.record.edit.submit'], function (event) 
    {
        var western_calendar_year=0;
        
        if ((event.record['和暦誕生日年号'].value == "平成") && (event.record['和暦誕生日年'].value > 0)) 
        {
            western_calendar_year = parseInt(event.record['和暦誕生日年'].value)+1988;
        }
        else if
         ((event.record['和暦誕生日年号'].value == "昭和") && (event.record['和暦誕生日年'].value > 0) && (event.record['和暦誕生日年'].value <= 64)) 
        {
            western_calendar_year = parseInt(event.record['和暦誕生日年'].value)+1925;
        }
        else if ((event.record['和暦誕生日年号'].value == "大正") && (event.record['和暦誕生日年'].value > 0) && (event.record['和暦誕生日年'].value <= 15)) 
        {
            western_calendar_year = parseInt(event.record['和暦誕生日年'].value)+1911;
        }
         else if ((event.record['和暦誕生日年号'].value == "明治") && (event.record['和暦誕生日年'].value > 0) && (event.record['和暦誕生日年'].value <= 45)) 
         {
            western_calendar_year = parseInt(event.record['和暦誕生日年'].value)+1867;
        }
         else 
         {
            event.error ="不正な年号と年の組み合わせです。";
    }
       
       //西暦を算出→満年齢を計算
       event.record['満年齢'].value = getYearMonth(western_calendar_year+"-"+event.record['和暦誕生日月'].value+"-"+event.record['和暦誕生日日'].value,'yy');
    
        return event;
       
   });

 function getYearMonth(dtDate, typeDate) {
        var dtToday = new Date();
        var dtFrom = new Date(dtDate);
 
        switch (typeDate) {
            case 'yy':
 
                var intDays = (dtToday - Date.parse(dtDate)) / 1000 / 60 / 60 / 24; // シリアル値の単位はミリ秒
                return Math.floor(intDays / 365);
 
            case 'yymm':
 
                var intYear = dtToday.getFullYear() - dtFrom.getFullYear();
                var intMonth = dtToday.getMonth() - dtFrom.getMonth();
 
                if (intMonth < 0) {
                    intYear--;
                    intMonth += 12;
                }
                return intYear + "- " + intMonth;
 
            default:
                return null;
        }
    }
```

## 参考サイト

http://www.openreference.org/articles/view/190
ｃｈａｒ型とunsigned Char型の違い

どちらもサイズは1バイトですが
大きな違いは
char型　保存できる値は-127～127 
unsigned char型　保存できる値は　0-255です

因みにですが

```c
#include <stdio.h>
void main()
{
	unsigned char num;
	num = 256;
	printf("変数numの値は%dです。", num);
}
```

このソースコードを実行すると変数の値は０です。
と表示されるはずです。
是非、参考にして下さい
xdebug インストールコマンと

```
git clone git://github.com/xdebug/xdebug.git
cd xdebug
/usr/local/php7/bin/phpize
./configure --enable-xdebug --with-php-config=/usr/local/php7/bin/php-config
make
make install
```

add
`# Zend OPcache`
`zend_extension=xdebug.so`
to /usr/local/php7/etc/conf.d/modules.ini
Data PipelineでEMR Clusterが起動しない問題

# 概要

DynamoDBのデータをData PipelineでS3にエクスポートしようとしたら失敗した話。

<img width="1449" alt="data-pipeline.png" src="https://qiita-image-store.s3.amazonaws.com/0/27454/14d420c6-be73-5594-9b3d-ca42729736f9.png">

何故か `TableBackupActivity` コンポーネントの実行でコケる。ログを残すよう設定しているにも関わらず `Logs not available` が出る。

# 原因

AWSのデフォルトVPCを削除するとこの現象が起こるらしい。
対策としては、EMR Clusterのオプション (`Edit Pipeline` から変更可能) で **インターネットゲートウェイが設定されたパブリックサブネット** を指定してあげれば良い。

<img width="1151" alt="スクリーンショット_2016-04-11_20_09_18.png" src="https://qiita-image-store.s3.amazonaws.com/0/27454/a330b0e1-ebe1-831f-ab91-d08c05dbeeb7.png">

ちなみにデフォルト以外のVPCでEMRクラスタを利用する場合、VPCの `DNS Resolution` 、`DNS Hostnames` オプションをそれぞれ有効化しておかないといつまでたってもクラスタが起動しないので注意が必要。
【VBS】乱数を発生させるサンプル


1〜10の間で乱数を生成するコード
簡単ですが、汎用性があります。


```vbnet
Option Explicit

WScript.Echo "乱数 = " & Int(Rnd() * 10) + 1
```

##解説

Rnd()：これは、0以上1未満の数を返します。

Rnd() * 10　：これで、0以上10未満になります。

Int(Rnd() * 10) + 1　：+1することで、1以上11未満（1 <= n < 11）になります。

##アレンジ
「10」と「+1」　のところをかえると、自由な値を発生させることができます。
おすすめ！
[Python] iterableを複数条件でソート

# 組み込み関数:sorted
>sorted(iterable[, key][, reverse])


- 第一引数`iterable`の要素をソートしたリストを返り値として返す関数．
- キーワード引数`key`はiterableの要素がタプル等であれば
`key = lambda x: x[1]`
などで，何個目の要素を基準とするかを指定できる．（デフォルトはNoneでそのまま比較）
- キーワード引数`reverse`にはbool値を与えます．Trueの場合は降順，Falseの場合は昇順（デフォルトはFalse[昇順]）

参考サイト：[2. 組み込み関数ーPython3.5.1　ドキュメント](http://docs.python.jp/3.5/library/functions.html#sorted)

#複数条件のソート
###なぜ複数条件のソートをしたかったか
glob等でファイル名リストを獲得してから，
ファイル名が(test_file_1.txt, test_file_2.txt, … test_file_19.txt, test_file_20.txt)のものを数字でソートしたい．
単純にソートしようとすると，

```sort_test_1.py
>>> import random
>>> file_names = ["test_file_{}.txt".format(num) for num in range(1, 21)]
>>> random.shuffle(file_names)
>>> sorted(file_names)
['test_file_1.txt', 'test_file_10.txt', 'test_file_11.txt', 
 'test_file_12.txt', 'test_file_13.txt', 'test_file_14.txt',
 'test_file_15.txt', 'test_file_16.txt', 'test_file_17.txt',
 'test_file_18.txt', 'test_file_19.txt', 'test_file_2.txt',
 'test_file_20.txt', 'test_file_3.txt', 'test_file_4.txt',
 'test_file_5.txt', 'test_file_6.txt', 'test_file_7.txt',
 'test_file_8.txt', 'test_file_9.txt']
```

先頭から見ていくので，`1` の次が`2`になってほしいが，`10`になる．
(この場合はファイル名変えれば解決する問題だけど）
ここでは，タプルを使ってこの問題を解決する．

#タプルの比較
Pythonでのタプルの比較は，最初の要素から順に見ていく．
e.g. (a, b, c)  (d, e, f)の二つがあった場合, aとb，bとe，cとfの順に比較．

なので，keyを(x, y)，xには数字が一桁だとわかるようなものを，yにはファイル名として設定するとうまくソートできる．

今回は，xにファイル名の長さを入れてソートする．

```sort_test_2.py
>>> file_names = ["test_file_{}.txt".format(num) for num in range(1, 21)]
>>> random.shuffle(file_names)
>>> sorted(file_names, key=lambda x: (len(x), x))
['test_file_1.txt', 'test_file_2.txt', 'test_file_3.txt',
 'test_file_4.txt', 'test_file_5.txt', 'test_file_6.txt',
 'test_file_7.txt', 'test_file_8.txt', 'test_file_9.txt',
 'test_file_10.txt', 'test_file_11.txt', 'test_file_12.txt',
 'test_file_13.txt', 'test_file_14.txt', 'test_file_15.txt',
 'test_file_16.txt', 'test_file_17.txt', 'test_file_18.txt',
 'test_file_19.txt', 'test_file_20.txt']
```

#まとめ
- 組み込み関数にあるsortedの簡単な使い方
- タプル使うと簡単に複数条件でソートができる
pecoでニコ動ランキングから選んでvufineで見る

タイトルは半分釣りです。vufineネタを真っ先に書きたかったんや…。

# はじめに
## vufineって何？
簡単に言えばメガネにつけるモニタです。HDMI出力する何かに繋いで視界の一部に小画面を作るような感じ。公式サイトは[こちら](http://vufine.com/ "vufine")

## 何に使えるの？
HDMI出力するようなデバイスにはたいてい繋がります。ただ、音が出ないのでその辺りは要工夫。

# で、やったこと
本命のネタはあるんだけどまだできてないんでとりあえず今できてることからご紹介

## とりあえずノートPC(Linux機)に繋げてみた
今持ち歩いてるノートPCはAntergos(archLinuxの派生ディストリ)が入っているのです。繋げてみたらあっさりマルチモニタとあっさり認識しました。

## 読める…読めるぞ！(常用できるとは言ってない)
結構解像度があるので意外とアプリの文字は読めます。が、コレでコーディングなんかした日には右目が大変な事になりそうなぐらい集中しなければつらいです。あ、あとウインク必須ｗ

# では本編です
そもそもvufineで文字を読むものではないのでとりあえず動画見てみます。それも垂れ流す感じのを。なのでニコ動のランキング動画でも見てみましょうか。ここで[percol (peco)でニコニコ動画を選択して再生する](http://qiita.com/tigberd/items/9530714391340472ad96)を参考にさせていただきました。感謝。nicovideo-dumpはそのままでちょっとこちらの環境に合わせてみます。

```zsh
ruby -r rss -e 'RSS::Parser.parse("http://www.nicovideo.jp/ranking/fav/daily/all?rss=2.0").channel.items.each {|item| puts item.link + "\t" + item.title}' | peco | awk '{print $1}'| ~/nicovideo-dump| mpv --no-border --screen=1 -
```

うちの環境ではmpvを動画プレイヤーとして使ってます。そして"--screen=1"のオプションでサブ画面すなわちvufineに表示している訳です。

# この後は？
raspberry piにつなげてやりたい事があるのですが、それがうまくいったら記事にします。それでは。
iPadでUIAlertControllerが落ちる場合は


こんな感じでUIAlerControllerを表示した場合

	-(void)pushButton:(id)sender {
	
    	UIAlertController *alertController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Title",@"") message:NSLocalizedString(@"Message",@"") preferredStyle:UIAlertControllerStyleActionSheet];
	
    	[alertController addAction:[UIAlertAction actionWithTitle:@"Action1" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        //ボタンが押された時の処理
    	}]];
	

        [self presentViewController:alertController animated:YES completion:nil];
    }

だとiPadだとクラッシュするので、

    alertController.popoverPresentationController.sourceView = self.view;
    alertController.popoverPresentationController.sourceRect = ((UIButton *)sender).frame;

という感じで、presentViewControllerの前に呼んで上げる必要があります。
nVidiaのGPU搭載PCにUbuntuを入れようとしてハマった

深層学習用にGTX Titan X搭載のGTuneのPCを購入したのですが、元から入っているWindowsを削除してUbuntu 14.04をインストールしようとしてすごくハマったので、手順を書いておきます。
nVidia GPUを搭載したPCだと、ドライバの関係上、Ubuntuのロゴの表示ができずに起動しない場合が報告されているようです。

[GALLERIA ZIにUbuntuを入れる時にハマったところ](http://qiita.com/kunihikot/items/588f39b4b11024ae0c41)


[nomodesetとLinuxにおけるGPUドライバーの問題](http://cpplover.blogspot.jp/2012/03/nomodesetlinuxgpu.html)

## Ubuntuのインストール

### 準備
[こちら](http://chee-s.net/ubuntu%E3%82%92usb%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%8B%E3%82%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参考にしました。  

* ubuntu 14.04 LTSのイメージをダウンロード
* [Unetbootin](http://unetbootin.sourceforge.net/)をダウンロード
* ISOイメージをUSBメモリに焼く

### マシンにインストール
* 起動時にF2を押し、BIOS上でブートの優先順位をUSBをトップにする。
* 設定変更し、再起動
* そのまま起動しようとしても、以下のメッセージが出る

```
Ignoring BGRT: invalid status 0 (expected 1)
```


* インストールオプションが出たら、Try install Ubuntuにカーソルをあわせ、eキーを押す
* 以下のように変更 [参考](http://qiita.com/kunihikot/items/588f39b4b11024ae0c41)

```
quiet splash　を　nomodeset　に書き換える
```

こんな画面です。

![2016-04-11 09.48.37.jpg](https://qiita-image-store.s3.amazonaws.com/0/50474/91581f3b-d2a6-0db4-c2d1-b64daac82c85.jpeg)


* Windowsを削除してインストールを選択、インストールする
* 再起動が促されるので、再起動
* 再起動後は、ブートの優先順位が、PCにインストールされたUbuntuに変わっているので、そのまま起動

ここまでやったところで、紫の画面になってしまい、先に進みません。
[同じ現象に遭遇した方](http://qiita.com/kunihikot/items/588f39b4b11024ae0c41)は、

> ただ再起動後、今度は紫の画面のままうんともすんとも言わなくなる。
やっぱりこれも起動パラメータの
quiet splash
を
nomodeset
に変更すると動くようになるらしく、変更したら動いた。
  
と簡単に解決されてますが、ここからがすごくハマりました。

### 解決までに試みたこと
#### Ubuntuの起動オプションを変更して起動
先ほどと同じように、起動オプション選択画面でeを押して起動オプションを変更したいが、その画面に行くためにShiftを押しっぱなしにするが、なぜかその画面に行かない。

こんな画面に行きたい・・・
![2016-04-11 09.46.53.jpg](https://qiita-image-store.s3.amazonaws.com/0/50474/e47ede95-8ff2-edb4-69e6-bf3459b472f1.jpeg)



#### GRUBモードで起動し、/etc/default/grubを書き換える
* [こちら](http://www.terakin.com/ja/blog/archives/81)を参考に、先ほどと同じように、nomodesetに書き換えることを試みる
* 起動時にESCを押すと、GNU GRUBのBASHっぽい画面に行ける
* しかし、vimはおろかvi,gedit,emacsなどのテキストを編集できるコマンドがない。

こんな画面。
![2016-04-11 09.29.58.jpg](https://qiita-image-store.s3.amazonaws.com/0/50474/6a1d7267-3a80-b6f7-af5d-410a0631f333.jpeg)

  

#### USB内のUbuntuから本体ディスクをマウントし書き換える
* インストールに使用したUbuntu入りのUSBからUbuntuを起動する
* 本体にインストールされたディスクをマウントする (diskからマウント、もしくはディスク名を調べてmountコマンドでマウント)
* /media/ubuntu/hogehogeあたりにマウントされるので、etc/default/grubを書き換える
* 変更の適用には、
```sudo update-grub```　が必要だが、ここで打っても、本体のUbuntuのほうは適用されない。失敗

### 解決できた方法
方針としては、Ubuntuをもう一つインストールして、選択が必要な状況を無理矢理作り、なぜか出てこない起動オプション画面を出現させる！

* USBから起動、インストールを選ぶ.
* インストールオプションで、Ubuntu 14.04とUbuntuを両立させるものを選ぶ
* 元のUbuntuのパーティションを限界まで小さくする
* インストール
* 再起動後、無事に起動時の選択画面が出る
* ubuntuのところにカーソルを合わせ、eを押す
![2016-04-11 09.46.55.jpg](https://qiita-image-store.s3.amazonaws.com/0/50474/e60ae916-6c97-d450-2983-5d7b8846671b.jpeg)


* quiet splashのところを、nomodesetに変更

![2016-04-11 09.48.37.jpg](https://qiita-image-store.s3.amazonaws.com/0/50474/91581f3b-d2a6-0db4-c2d1-b64daac82c85.jpeg)

* F10を押して起動
* 起動後、[こちら](http://www.terakin.com/ja/blog/archives/81)を参考に/etc/default/grubを書き換え、```sudo update-grub```を実行
* これで無事にubuntuが本体から起動するようになった。
WordpressのPHPMailerのアドレス形式チェックをはずす

Wordpressのメール送信関数 `wp_mail()` は
PHPMailerを使っている。

docomoとauは

- @の前に「.」
- 「.」の連続

という気持ち悪い形式のアドレスが作れてしまい、
かつ、割とユーザーがこの形を使いたがるため、
PHPMailer内の形式チェックをはずさなければならない。

> [PHPMailerでドットが連続しているアドレスにメール送信できない](http://taramonera.net/2.5/?p=794)

上記記事の通り、
/wp-includes/class-phpmailer.php
の986行目あたりの
`public static function validateAddress($address, $patternselect = 'auto')`
を
`public static function validateAddress($address, $patternselect = 'noregex')`
とすることで無事送信することができた。

また、`wp_mail()`を使う際、
[WP Mail SMTP](https://wordpress.org/plugins/wp-mail-smtp/)
がSMTP使えて、テストもできるのでおすすめ。
Ubuntu16.04にphoenixを入れてみた

## はじめに

[前回のelixirインストール](http://qiita.com/dynamitecoolguy/items/24088128bfa45785bfa1)に続いてPhoenixをインストールします。

## Phoenixインストール

[エーフィーのアトリエ-アランビックの錬金術師](http://hayabusa333.tumblr.com/)や、[本家Phoenix](http://www.phoenixframework.org/docs/installation)などを参考に、Ubuntu16.04にPhoenixをインストールしてみます。

erlang、elixirはインストール済みとします。

### brunch.io

Phoenixでは、静的なアセットの取り回しに[brunch.io](http://brunch.io/)をデフォルトで使用します。
`--no-brunch`オプションを使用することで、brunch.ioを使用しないようにすることもできるようですが、今回は素直に使用することにします。

brunch.ioには[Node.js](https://nodejs.org/en/)が必要です。
一点注意が必要なのは、Phoenixのドキュメント見ると5.0.0以上のバージョンが必要とされています。

`apt-get install nodejs-legacy`など入力してしまうと、LTS版の4系がインストールされてしまいます。
したがって、手動でインストールします。

5系をPPAかインストールする方法もありますが、今回のUbuntu16.04(これを書いている時点ではまだβ版)には対応していません。
本家サイトからバイナリでインストールすることにします。

[Node.jsのStable版のダウンロードサイト](https://nodejs.org/en/download/stable/)から、Linux版のバイナリをダウンロードしてきて、```/usr/local/```下に展開することにします。

```shell-session
# wget https://nodejs.org/dist/v5.10.1/node-v5.10.1-linux-x64.tar.xz
# tar xvJf node-v5.10.1-linux-x64.tar.xz
# cd node-v5.10.1-linux-x64
# sudo chown root:root bin etc include lib share
# sudo cp -r bin etc include lib share /usr/local/
```

Proxyのある環境で使用する場合は、npmのproxyをセットしておきます。

```shell-session
# sudo npm -g config set proxy http://.....
# sudo npm -g config set https-proxy http://.....
```

### Postgresql

Phoenixでは、標準のRDBは`postgresql`です。**postgresqlです**。
別のRDBも使用できるらしいのですが、今回はそこは主題では無いので、postgresqlをそのまま使用することにします。

Ubuntu16.04では、この時点では9.5.2が入るようなのでそのままリポジトリから入れちゃいます。

```shell-session
# sudo apt-get install postgresql
# sudo su - postgres
$ psql --version
psql (PostgreSQL) 9.5.2
```

なお、PostgreSQLの第一人者である石井さんに、昔、「エヴァンゲリオンはいいぞ」とTV初回放送時に言われたことがあったのですが、その時は完全にスルーしてしまいました。以上、どうでもいい話でした。

### inotify-tools

まだよく分かっていませんが、inotify-toolsが必要ということなので、リポジトリから入れてみます。

```shell-session
# sudo apt-get install inotify-tools
```

### Phoenix

いよいよ、Phoenixご本尊のインストールです。

```shell-session
# mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
```

### Hex

そういえば[Hex](https://hex.pm/docs/usage)をインストールしていませんでした。
インストールしておきます。

```shell-session
# mix local.hex
```

次回は、Phoenixの最初のプロジェクト作りです。
使えば便利なSwiftライブラリたち

使ったことがあるものを適当に並べます。
有名ドコロは省いております。

# [AttributedLabel](https://github.com/KyoheiG3/AttributedLabel)
 - Labelを多く使うViewがあればおすすめです。
 - UILabelの機能そのままに、より軽く・ついでに使いやすくしたUIView

# [Cheetah](https://github.com/suguru/Cheetah)
 - UIViewにアニメーションプロパティを付加できる。
 - UIViewAnimationはキャンセルしにくかったり、扱いづらい点が多いけど、これがあればUIViewアニメいらず。
 - popと似ているが書き方がより新しい
 - こんなかんじ`view.cheetah.duration(0.2).alpha(0).run()`でViewごとにanimation管理できるのが良い

# [Kingfisher](https://github.com/onevcat/Kingfisher)
 - 非同期画像取得。書き方古いですが便利です

# [ColorAdjuster](https://github.com/ikemai/ColorAdjuster)
 - 色の調整。明度や彩度・色相、などを簡単にいじれる
 - あとグラデーションの生成もある

# [SpringIndicator](https://github.com/KyoheiG3/SpringIndicator)
 - よくあるぐるぐるインジゲーターです
 - デザインの調整がしやすい。

# [NavigationNotice](https://github.com/KyoheiG3/NavigationNotice)
 - 上に出てくるNotice。UIView

# [Siren](https://github.com/ArtSabintsev/Siren)
 - 強制アップデート用。
 - バージョンによって出すpopup,textを３パターンに出し分けできる
 - その設定も使いやすい

# [Swifter](https://github.com/mattdonnelly/Swifter)
 - Twitter周りをほぼ自作で作っていたが、アクセストークンの取得を作るのが面倒で面倒で・・・という時に見つけた。最初から取り入れてればよかった。
 - ただしライブラリしか置いていないので、勝手にpod化するなどして使ってました
 - 書き方はObjeC寄りぽい

# [PagingView](https://github.com/KyoheiG3/PagingView)
 - 無限スクロールを実現してくれる。
 - 感覚的には`collectionView`を使っているようで使いやすい

# [Device](https://github.com/Ekhoo/Device)
 - `iPhone5s`とか`iPhone6s`とかが取得できる
 - 普段サイズで判断してたりするのであれば入れたほうがいいです

# [Cartography](https://github.com/robb/Cartography)
 - オートレイアウトならこれが好きです

# [SwiftDate](https://github.com/malcommac/SwiftDate)
 - NSDateで`+1 hour`的に書くと１時間後の値取れたり普通に便利。

かなり適当な説明ですみません。
実際に使っていていいのがあったら随時更新する予定です。
レイアウト基礎講座(1日目)

# 全体ガイダンス
## バランス
+ どれほどまとまった内容でも、フォント等にこだわっても、最後はバランスが全ての印象を決めてしまうと言っても過言ではないほどバランスをとることは大事
+ 各要素の端が整っているとバランスも整って見えやすい
+ たての並びは必ず合わせる。
## 様式と8要素と造形の8原則
様式とは、一瞬で見る人のイメージを決めるデザインの「型」のこと。
様式を決める要素は8つあるとしている。

#様式の8要素
## 1.視覚度
+ 見る者に与える印象の強さ
+ 視覚度が大きいとより強い印象を与える
+ 視覚度が小さいと高潔な印象を与える
+ 写真の選び方によって変わる(人の顔>風景・静物)
+ 画像の種類によって変わる(イラスト>写真)

## 2.図版率
+ 文字と図の面積の比率を指し、文字ばかりだと0%、図面ばかりだと100%となる。
+ 計算式=図の面積/全体の面積(文字+図)
+ 図版率が高い方がより親しみやすく、読みたい気分になる。(見るものに読ませようという)
+ 図版率が高いと参加しやすい。(=ものが買いやすい、興味を持って見やすい)
+ 図版率が高すぎてもコミュニケーションが妨げられる原因となり得るので、程よく文字を加えることも必要。
【SQL】複数の条件のcountを1回のクエリでおこなう

参考：[【SQL】複数の条件のcountを1回のクエリでおこなう](https://www.softel.co.jp/blogs/tech/archives/3267)


### hogeテーブル

| id | status|
|:--------|------:|
| 1       |      1 |    
| 2       |      0 |
| 3       |      1 |
| 4       |      2 |
| 5       |      0 |
| 6       |      2 |
| 7       |      0 |
| 8       |      1 |

statusが0の件数、statusが1か2の件数。
これをひとつのSQLでcountする。

```
select
count(status = 0 or null), --statusが0の件数
count(status in(1,2) or null) --statusが1か2の件数
from
hoge
```

これでできてしまう。すごい！

##解説

count(*)は全件、count(*以外)はnull以外をcountする。
ゆえに条件に合致するものをtrue,合致しないものをnullで返す。

true or null ->true -> countされる。
false or null ->null -> countされない。

ゆえに、count(条件 or null)で条件でcountできる。
関数のバッククオート実行と変数のスコープ

# バッククオート便利

変数にコマンドの実行結果を代入するには、以下のようにバッククオート (もしくは `$()`) を使う。

```lang:hello.sh
#! /bin/sh

function hello() {
  echo 'こんにちは'
}

reply=`hello`
echo $reply
```

# 危険な香り

多用したくなりがちなバッククオートだが、グローバル変数の操作に関しては注意が必要。

```lang:global_variable_test.sh
#! /bin/sh

# グローバル変数
C=""

# グローバル変数を変更する関数
function changeC() {
  C='変更しました'
}

C="変更してません"
changeC # 普通に呼び出す。
echo 'changeC 実行'
echo "C=$C" # 変わるはず

echo '--------------------------------'

C="変更してません"
TEMP=`changeC` # バッククオートで呼び出す。
echo 'changeC バッククオート実行'
echo "C=$C" # 変わるはず
```

なんとなく結果が予想できそうな気もするが、後者の方法ではCが変更されない。

```lang:text
$ ./test.sh
changeC 実行
C=変更しました
--------------------------------
changeC バッククオート実行
C=変更してません
```

サブシェルとして実行されて、別アドレスの`C`を参照しちゃうんでしょうか?
BOT界隈の動きについてまとめてみた


最近BOTあたりの技術が騒がしいです。Linebot とか facebook Bot Storeとか。
エンジニアからしてみたら、一体何十年前の話だよ、って感じですが、確かに概念は同じかもしれませんが、役割や必要な技術が異なっているようにも見えます。
本エントリでは、

* BOTとはなにか
* なぜ最近BOTが流行っているのか
* BOT実装の種類
* BOTの構成要素

の整理が自分なりにできればと思います。
反論ご意見あればコメントへお願いします。

#BOTとはなにか

BOTとは"Robot"の略で、「人の介在なしに、何かを命令すると、その命令を遂行してくれるもの」という概念のことです。
それだけです。
よく「自動化」や「chatops」などの話をすると、一緒にBOTの話が出てきますが、それは当然のことといえます。なぜならBOTの有効な適用先として上記の者があるからです。 
また、"hubot"などの話が出てきますが、それはBOTを実現しやすいようにする実装であり、BOTそのものではないと考えています。 
BOTはただの概念です。

#なぜ最近BOTが流行っているのか

エンジニアたちはBOTの概念をかなり前から使用していました。
僕が知っている中では、IRCの時代からbotがあったし、そもそもエンジニアは自動化が大好きで、人と付き合うことが大嫌いです。（要出典）
しかし、エンジニア以外にはあまりこの文化や概念が浸透しませんでした。なぜなら、BOTの実装の大半はエンジニアが主に使うツール上にあったからです。
さらに、BOTを実装するにはマンパワーがかかります。 そんな労力をかけるくらいなら自分でするわ、と思う人が大半だったのでしょう。
しかしここ最近、その状況が変わってきました。
 HTTPによるPCウェブページ、ガラケーのページ、スマートフォンアプリに続く、サービスの、第4のユーザ接点になる可能性が見えてきたからです。
 Facebook、Lineなどのメッセンジャーアプリを開発するプラットフォーマーが、ユーザ数、アクティブユーザを増やすため、次々とBOTを容易に実装できるWebAPIを作成し、開放しようという動きが強まっています。
また、Google DeepMindの囲碁勝負や、IBMのWatsonなど、AIが人間のように考えられるかもしれない、という夢も見えてきました。
これらを総合すると、コンシェルジュに話しかけるように、レストランの予約をしたり、買い物をしたり、
もしくは単純に必要なものの名前と個数を指定したら買い物ができる、といったものを開発すれば、サービスにおいてユーザの主な接点になりうる可能性が見えてきたわけです。

#BOT実装の種類

ひとくくりにBOTと言っても、沢山の種類が存在すると考えています。

###推薦型
  * コンシェルジュのように、ユーザ個人の過去のデータなどを用いて最適化された情報を推薦し情報を提示する
  * 例：「週末に箱根に行きたい」→（過去の購買データ、家族データ、閲覧履歴などを処理し最適な宿を選定）→「○○旅館はいかがでしょう？家族3人で○○円になります」

###命令形
  * 命令を入力し、決められた情報を提示する
  * 例：「2016/4/16-2016/4/17 箱根」→「検索結果を表示します　○○旅館、xxホテル、△△旅館　もっと見る」

####派生：自然言語での命令系

  * 例：「カスタマーサポートは何時から開いてるの？」「カスサポって9時にはあいてんの？」→「（サービス名）のカスタマーサポートは平日午前○時から○時になります」


#BOTの構成要素

BOTは3つの要素から構成されると考えています。

###入力理解
ユーザの入力、命令を理解して、アルゴリズムに命令を出す

###アルゴリズム
ユーザが求めている情報を選出する

###情報提示
アルゴリズムによって選出された情報をユーザに提示する

リッチなBOTを作るためには、

* 入力理解
定められたコマンドではなく、自然な文を理解して求めている情報を判断する

* アルゴリズム
パターンマッチではなく、ユーザの嗜好、サービスのKPI/KGIを加味した情報の選出

* 情報提示
プラットフォームが定めた方法を熟知して魅力的に情報の提示

などを考える必要があります

#まとめ
BOTとはただの概念であり、「BOTを作るぞ！」と言っても、様々なパターンがあります。
実現するものの定義や、機能分解を行って、何を、どのように作るか、を考えることが非常に大切だなと思いました。


次はLinebotで作ったものでも書ければいいな
閲覧しているサイトのServiceWorkerの登録削除とCache APIのキャッシュを全て削除するJSコード


# この記事の内容

* ServiceWorker・Cache APIとは

ServiceWorkerとCache APIを使ってオフラインでも動くWebアプリを作る
http://qiita.com/horo/items/175c8fd7513138308930

JavaScriptの処理で自在にキャッシュ削除とかが行えたら良いなということでメモとして記載します。

# コード

下記をブラウザの開発ツールのコンソールより実行することで
ServiceWorkerの登録削除とCache APIのキャッシュを全て削除されます。

```JavaScript
navigator.serviceWorker.getRegistrations().then(function(registrations) {
    // 登録されているworkerを全て削除する
    for(let registration of registrations) {
        registration.unregister();
    }
});
caches.keys().then(function(keys) {
    var promises = [];
    // キャッシュストレージを全て削除する
    keys.forEach(function(cacheName) {
        if (cacheName) {
            promises.push(caches.delete(cacheName));
        }
    });
});
```
秒指定ができるgo-cron

## 参考

* [go-cron](https://github.com/odise/go-cron/releases)
    * [docker-go-cron/Dockerfile at master · webwurst/docker-go-cron · GitHub](https://github.com/webwurst/docker-go-cron/blob/master/Dockerfile)

## 使い方

* anacronは`分 時 日 月 週`の指定だが、go-cronは`秒 分 時 日 月`の指定となる。

```bash:毎秒実行
./go-cron -s "* * * * *" -p 8080 -- /bin/bash -c "echo 1"
```

今日の23時12分22秒に実行したい場合

```bash:4月11日23時12分22秒に実行
./go-cron -s "22 12 23 11 4" -p 8080 -- /bin/bash -c "echo 1"
```

## status確認

* `-p 8080`で8080ポートで待ち受ける。

```bash:2秒ごとに実行
./go-cron -s "*/2 * * * *" -p 8080 -- /bin/bash -c "echo 1"
```

![Screen Shot 2016-04-11 at 5.22.08 PM.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a38d4870-60ff-d0ca-875c-5c43387ccd8b.png)

```json:
{
  "Running": {},
  "Last": {
    "Exit_status": 0,
    "Stdout": "1\n",
    "Stderr": "",
    "ExitTime": "2016-04-11T16:56:54+09:00",
    "Pid": 2718,
    "StartingTime": "2016-04-11T16:56:54+09:00"
  },
  "Schedule": "*/2 * * * *"
}
```
docker上で起動するRevelのHot-reloadを効かせる工夫

# 問題
最近GoのRevelフレームワークを使って開発をしています。
がしかし、dockerコンテナでRevelを立ち上げると、Macのホストマシンの方でコンテナの`$GOPATH`にマウントしたディレクトリ内のファイルを変更してもHot-reloadが効かずに困っていました orz
 (dockerコンテナ上でファイル変更したら当然検知してくれます)

どうやら原因はRevel自体の既知の問題でマウントしたディレクトリに対してはファイル変更を検知してくれないっぽいです
https://github.com/revel/revel/issues/1026

# 解決方法
gulpのwatchを使った以下の方法でHot-reloadを効かせます

`docker run`でコンテナ作成時に`$GOPATH`とは違うディレクトリにローカルのrevelプロジェクトをマウント

```bash
docker run --privileged -d \
-p 9000:9000 \
-v ~/go/src/revel_sample:/usr/local/src/revel_sample \
--name test_go \
--hostname test_go \
-t go:centos7 \
/sbin/init
```

dockerコンテナ上でマウントしたディレクトリを`gulp-watch`で監視してファイル変更があった場合は`$GOPATH/src`下にコピーします。

```gulpfile.js
var gulp     = require('gulp');
var changed  = require('gulp-changed');
var watch = require("gulp-watch");

var srcDir = '/usr/local/src/revel_sample/**';
var dstDir = '/usr/local/go/src/revel_sample/';

gulp.task("watch", function () {
  watch(srcDir, function(event){
        gulp.start("copy");
    });
});
gulp.task("copy", function () {
     gulp.src(srcDir)
    .pipe(changed(dstDir))
    .pipe(gulp.dest(dstDir))
});
gulp.task('default', ['watch']);
```

あとはコンテナ上でgulpを動かした上でrevelを起動します。

```bash
cd (gulpfile.jsが置いてあるディレクトリ)
gulp
```

```bash
revel run revel_sample
```


若干面倒くさいですが、こうするとホストマシンでファイル変更してもHot-reloadが効くようになります。
(もうGinやEchoに乗り換えようかな・・ :expressionless: )
【イベントレポート】API Meetup Tokyo #13で感じたこと

API Meetup運営チームの@tomigarashです。

[API Meetup Tokyo#13](https://api-meetup.doorkeeper.jp/events/41135)を2016/04/08に開催しました。テーマは「企業間連携を加速させるAPI、そしてそこに必要な認可フレームワークOAuth！」で、まとめ情報は下記にあります。

##まとめ情報

[Togetterまとめ](http://togetter.com/li/961264)
[セッション資料1-スタートアップと大企業のAPI連携 By トレタ増井さん]
(https://speakerdeck.com/masuidrive/sutatoatuputo-da-qi-ye-falseapilian-xi)
[セッション資料2-API提供におけるOAuthの役割 By NRIセキュア工藤さん](http://www.slideshare.net/tkudo/api-meetup-oauth)

セッション内容自体は公開資料で確認ください。今回両セッションでひとつの共通項があったと感じましたので、そのあたりを纏めます。

##4th Party
工藤さんセッションより「OAuthは認可、OpenIDは認証を担う。認証サービスの利用ユーザー視点で考えた場合に、誰かに権限を移譲するようなユースケースにOAuthは対応できない。これをカバーするのが OAuth2.0をベースに策定されたUMA(User Managed Access)であり、4th Partyからのアクセス認可を可能にする。」との事。個人的に4th Partyを前提としたアーキテクチャ設計の話をプロトコルでなくフレームワークで担保するモデルの話には初めて出会った。

そもそもAPIとはサービス提供者が公開し、そのサービスの利用者がAPIを利用して自由にアプリケーションを構築するものであるが、多くの場合そのユーザーが提供するのもまた別のサービスとなる。さらにそのユーザーのサービス自体を他者（他社）に移譲するモデルは多分にあると考えられ、むしろ今後は増えていくと思われる。APIを使ったMashupモデルがより具現化されていけば尚更。

##企業連携とAPI
トレタのサービスは、予約関連の共通データーベースをWebサービス運営企業向けにAPI形式で提供。今回のテーマで言えばその各社とは大手企業にあたり、API連携する大手企業側からすればトレタ以外にも複数企業と連携する（したい）のは自然な事業戦略であり、その仕様は横展開を考慮して限りなくオープンスタンダードにすべきというのが増井さんの意見。Webサービスの場合、特に連携先企業がそのユーザーに様々なサービスを提供するモデルが当てはまるので、とても納得のいくストーリー。

##ビジネスと開発が近くなるワケ
トレタの場合には予約情報を各社に提供するわけだが、その連携先企業がどういうサービスをエンドユーザーに提供するか、さらにエンドユーザーが今後どういうサービスを連携先企業に求めるか、業界を俯瞰したニーズ把握とそれに基づいたサービスデザインが重要だという示唆があった。セッション途中にも、システム実装前に想定できていなかったユースケースの具体例もあった。これは最近のWebサービスが従来からの共通化を前提に考えられてきたシステムアーキテクチャに当てはまらないものであり、新サービスが既存のシステムモデルから遠ざかっている大きな要因だと考えられる。


認証認可と企業連携、視点は全く違えど捉え方がリンクしていてとても興味深いMeetupとなりました。
JavaScriptで配列をシャッフル

思いついてから正しいものが出来るまでの流れ

**最初**

```
var num = [
    1,2,3,4,5,6,7,8,9,10,11,12
];
var num2 = Math.floor(Math.random() * num.length);
for(var i = 0; i < num.length; i++){
     console.log(num[num2]);    
}
```
結果：失敗　　同じ数字が１２個出てきた

**次**

```
var num = [
    1,2,3,4,5,6,7,8,9,10,11,12
];
for(var i = 0; i < num.length; i++){
     var num2 = Math.floor(Math.random() * num.length);
     console.log(num[num2]);    
}
```
結果：失敗　　まだ被る数字が出てくる



この辺りで調べ始めたら結構いろんな方法があることを知る
参考：[Fisher-Yates Shuffle](https://bost.ocks.org/mike/shuffle/)

その中でのベストが次のもの

**ベスト**

```
var num = [
    1,2,3,4,5,6,7,8,9,10,11,12
];
var m = num.length;
while(m){
    var i = Math.floor(Math.random() * m--);
    var t = num[m];
    num[m] = num[i];
    num[i] = t;
    console.log(num[m]);
  }
```

１２個からランダムで選んで最後と交換
↓
残り１１個からランダムで選んで２番目の後ろと交換
↓
これを繰り返す

以上


var t = num[m];の部分はなくてもいいんじゃないかと思ったが最後の数字を保管しなければいけないから必要
Twilioを使って、二者間の通話に別の音声を挿入する

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# 要約

Twilioを使った二者間通話をしているときに、例えば「あと1分で通話が終了します」のような音声をプログラムから流すことができます。
意外と問い合わせの多い機能で、本日実現方法を見つけたので、記事にしておきます。

# 前提

- Twilioアカウントを保有していること
- PHPやNodeなど、Twilioヘルパーライブラリを使って簡単なプログラムがかけること
- 050番号を2つ以上持っていること
- TwiMLを返すことができるサーバーを持っていること（Twimlbinでも構いません）

# 手順（概要）

1. Twilioのカンファレンス機能を使って、まずは二者間で通話を実現します。
2. 音声を挿入したいタイミングでRestAPIを使って、050番号にダイヤルします。
3. 050番号の着信後、TwiMLでカンファレンスにリダイヤルします。
4. カンファレンスに参加したタイミングを見計らって、2の発信呼でSay動詞のTwiMLを呼びます。
5. Sayが終了した時点で、050番号は切断されます。

# Let's TRY

## カンファレンスを用意する

050番号を2つ用意します。
そのうち1つ（以後、カンファレンス番号）に、以下のTwiMLを返すURLを設定します。

```lang:TwiML
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Dial callerId='+815XXXXXXXXX'> ←カンファレンス番号を指定します
    <Conference beep="false" waitUrl="" startConferenceOnEnter="true" endConferenceOnExit="true">
      test
    </Conference>
  </Dial>
</Response>
```

カンファレンス番号に着信すると、testというカンファレンスに参加するTwiMLです。
beep="false"にしているので、カンファレンスに参加したり抜けたりする先に音がなりません。また、カンファレンスに参加した時点で相手との通話が始まり、どちらからが通話を切った時点で、お互いの通話が切れるように設定してあります。

## 挿入したい音声を再生するTwiMLを用意する

例えば、以下のようなTwiMLを用意して、これを返すURLを別途控えておきます。

```lang:TwiML
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Pause length="2"/>
  <Say language='ja-jp'>あと３分で終了です。</Say>
</Response>
```

ポイントは、Say動詞の前にPauseを入れている点です。この後説明する、カンファレンスへの参加作業に少しだけ時間がかかるので、ポーズをいれないと最初の方の音声がうまく再生されません。今回は2秒待ってから発声するようにしています。

## RestAPIから発信した際に、最初に返すTwiMLを用意する

もう一つの050番号（以下、音声挿入番号）に対して、以下のTwiMLを返すようにしておきます。

```lang:TwiML
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Dial callerId="+815XXXXXXXXX"> ←音声挿入番号を指定します
    <Conference beep="false">test</Conference>
  </Dial>
</Response>
```

カンファレンス参加用のTwiMLとほぼ同じですが、会話を抜けてもカンファレンスが終わらないようにしています。

## RestAPIを使って、発信するプログラムを作成する

PHPやNode.jsなど、RestAPIをコールできる言語を使って、次のようなプログラムをコーディングします。今回はNode.jsで書きました。

```lang:Node.js
var accountSid = 'ACXXXXXXXXXXXXXXX';　←ご自分のAccount SIDに変更してください
var authToken = "XXXXXXXXXXXXXXX";　←ご自分のAuth Tokenに変更してください
var client = require('twilio')(accountSid, authToken);

client.calls.create({
    url: "http://xxxxxxxxxxx", ←先ほど作成した音声再生用のURLを指定します
    to: "+8150XXXXXXXX",　←音声挿入番号を指定します
    from: "+8150XXXXXXXX" ←カンファレンス番号を指定します
}, function(err, call) {
    process.stdout.write(call.sid);
});
```

RestAPIでコールをかけるプログラムになっています。発信先番号が音声挿入番号になっているので、着信後にカンファレンスに参加するようになっています。
それと同時に、着信した際にurlで指定した音声再生用TwiMLも実行されるので、結果として、カンファレンスに参加して音声が流れます。音声再生が終わると、TwiMLがすべて終了するので、RestAPIで発信したコールは自動的に終了します。

# まとめ

今回のポイントは以下のとおりです。

- RestAPIから直接カンファレンスに参加することはできません。
- そのため、一度050番号に発信してTwiMLを呼び出し、そこからカンファレンスに参加します。
- RestAPIでかけた際に、着信したときに実行されるurlで音声を流しますが、この時点ではカンファレンスへの接続が完了していない可能性があり、音声を少し遅らせてから再生しています。
Swift Study 1  类型

Swift 的类型是在 C 和 Objective-C 的基础上提出的，Int是整型；Double和Float是浮点型；Bool是布尔型；String是字符串。Swift 还有两个有用的集合类型，Array和Dictionary，请参考集合类型。
Swift 还增加了 Objective-C 中没有的类型比如元组（Tuple）。元组可以让你创建或者传递一组数据，比如作为函数的返回值时，你可以用一个元组可以返回多个值。
Swift 还增加了可选（Optional）类型，用于处理值缺失的情况。可选表示“那儿有一个值，并且它等于 x ”或者“那儿没有值”。可选有点像在 Objective-C 中使用nil，但是它可以用在任何类型上，不仅仅是类。可选类型比 Objective-C 中的nil指针更加安全也更具表现力，它是 Swift 许多强大特性的重要组成部分。、
Swift 是一个类型安全的语言，可选就是一个很好的例子。Swift 可以让你清楚地知道值的类型。如果你的代码期望得到一个String，类型安全会阻止你不小心传入一个Int。你可以在开发阶段尽早发现并修正错误。

明常量和变量
常量和变量必须在使用前声明，用let来声明常量，用var来声明变量。下面的例子展示了如何用常量和变量来记录用户尝试登录的次数：
let maximumNumberOfLoginAttempts = 10 
var currentLoginAttempt = 0 

你可以在一行中声明多个常量或者多个变量，用逗号隔开：
var x = 0.0, y = 0.0, z = 0.0

这个例子给welcomeMessage变量添加了类型标注，表示这个变量可以存储String类型的值：
var welcomeMessage: String  
声明中的冒号代表着“是...类型”，所以这行代码可以被理解为：
“声明一个类型为String，名字为welcomeMessage的变量。”
“类型为String”的意思是“可以存储任意String类型的值。”
welcomeMessage变量现在可以被设置成任意字符串：
welcomeMessage = "Hello" 

分号
与其他大部分编程语言不同，Swift 并不强制要求你在每条语句的结尾处使用分号（;），当然，你也可以按照你自己的习惯添加分号。有一种情况下必须要用分号，即你打算在同一行内写多条独立的语句：
let cat = "????"; println(cat) 
// 输出 "????" 

let i = 1 
if i { 
    // 这个例子不会通过编译，会报错 
} 
然而，下面的例子是合法的：
let i = 1 
if i == 1 { 
    // 这个例子会编译成功 
}
FirefoxのWeb Audio Editorを使ったデバッグ可視化


WebAudio関連の開発は目に見えないものを相手にするという性質上、
ノードが意図した通りに接続されているか把握するためには、
可視化の手段を用意しないと厳しいものがあります。

D3等を使って自前で実装する方法もありですが、
Firefoxの開発ツールに便利機能があるので、それを使うのが手っ取り早そう。

[Web Audio Editor - 開発ツール | MDN](https://developer.mozilla.org/ja/docs/Tools/Web_Audio_Editor)

## 有効化

Web Audio Editorは標準では有効になっていません。
開発ツールのオプションから下記の手順で有効化する必要があります。

![Kobito.mWhaoF.png](https://qiita-image-store.s3.amazonaws.com/0/82948/9babced1-9e45-eab7-bc11-f03b656dfa73.png "Kobito.mWhaoF.png")


## 主な機能

### ノードの接続を可視化する

### 任意のノードのパラメータを確認・変更する

![Kobito.CemgQ8.png](https://qiita-image-store.s3.amazonaws.com/0/82948/3813fea3-0fd9-1fe5-df50-9103ff0f5476.png "Kobito.CemgQ8.png")

### 任意のノードをバイパスさせる

![Kobito.qzrbyD.png](https://qiita-image-store.s3.amazonaws.com/0/82948/4d309869-d8d5-5312-478a-aadef90a4f7c.png "Kobito.qzrbyD.png")


## おまけ：Chromeで同じことをするには？

ChromeのExtensionを公開してる方がいたものの、メンテナンスされておらずうまく動作せず…

[spite/WebAudioExtension](https://github.com/spite/WebAudioExtension)
ServerSpecを使って、作成したサーバのdisk容量を確認する


下記を参照しましたが、2つめの記事の一部マッチャの書き方が古くなっていて、ハマりました。

* [「Serverspec」を使ってサーバー環境を自動テストしよう](http://knowledge.sakura.ad.jp/tech/2596/)
* [Serverspecでディスクサイズをテストする方法](http://recipe.kc-cloud.jp/archives/7118)


こんな感じでいけました。

```sample_spec.rb抜粋
describe command("size=`df -k |grep /dev/sda1 | awk '{printf (\"%4.0f\", $2/102\
4/1024)}'`; test $size -gt 7 ; echo $?") do
  its(:stdout) { should match /0/ }
end
```
windowsでopenGL環境を構築するための手順

# windowsでopenGL環境を構築するための手順


## 概要
windowsにはデフォルトでopenGL自体はインストールされています．
openGLを扱いやすくするためのライブラリとしてGLUTが有名でしたが，現在は開発が止まっています．
そこで後続のfreeglutをインストールしてopenGLを便利に使う環境を構築しましょう．

## 推奨環境
- windows7
- Visual Studio 2012

## 方法
### freeglutのインストール
#### ダウンロード
http://freeglut.sourceforge.net/ から適当なバージョンを選んでダウンロード
2016/04/11で最新は3.0.0ですが，私はドキュメントが手に入れやすい2.8.1にしました．
### 解凍
適当な解凍ソフトを用いてダウンロードしたファイルを解凍
私は，Lhaplus( http://www.vector.co.jp/soft/win95/util/se169348.html )を使っています．

### dll, libファイルの設置
解凍してできたファイルの中から自分のVisual Studioのバージョンを選んで
~/VisualStudio/2012/freeglut.sln
を選択

Releaseモードにして，freeglutのビルドを行う

~/lib ができているはずなので，~/lib/x86(あるいは Release)/freeglut.dllと~/lib/x86(あるいは Release)/freeglut.libを適切な場所にコピーする．

- dllファイル
C:\Windows\SysWOW64

- libファイル
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0 (VisualStudioのバージョンによってはv6.0Aなど)

### .hファイルの設置
C:\Users\<user name>\Desktop\freeglut-2.8.1\include\GL下のfreeglut.h, freeglut_ext.h, freeglut_std.h, glut.hを
C:\Program Files (x86)\Windows Kits\8.0\Include\um\glに設置する
(これも/8.0/ の部分はVisualStudioのバージョンに依存します．)

## 確認
先ほど開いたslnファイルで適当なプロジェクトをスタートアッププロジェクトに設定して，デバックなしで開始(Ctrl+F5)をしてそれぞれのプロジェクトを動かしてみてください．
GitのHEADをつかったコミットの指定方法

```
この記事では以下の環境について書いています。
Mac OS X(10.11.3)
git version 2.3.1
```
##HEADの指定

```
git show HEAD
```
HEADは現在のブランチの最新のコミットですが、HEAD~やHEAD^のようにすることでHEADの先祖を遡って指定することができます。
コミットには直系の親だけがいる場合と第二、第三の親(継父母?)などもいる場合があります。

コミットグラフが一本線の場合、遡りたい数だけ ~ をつければ指定したいコミットまでたどり着けます。また、HEAD\~\~\~\~\~\~\~\~\~\~\~などとすると冗長になるのでHEAD~12という風に省略できます。
マージなどで履歴が枝分かれしている場合はHEAD^(1番目の親)、HEAD^2(2番目の親)という風に指定します。
はじめのうち混乱しやすいのは、HEAD~~(親の親)のようにHEAD^^としても1番目の親の1番目の親つまり、親の親なのでHEAD~~と結果が同じになるところでしょうか。一般的に4番目の親、5番目の親というようなものが出来ることは稀だと思うので必要なことは少なそうですが、そういう場合はHEAD^4、HEAD^5という風に記述します。(HEAD^^^^やHEAD^^^^^は別の意味)


| 指定方法 |説明|つまり...|
|:-----------|:------------|------------:|
| HEAD~       | HEADの親 |親|
| HEAD~1       | HEADの親 |親|
| HEAD^       | HEADの親 |親|
| HEAD~~       | HEADの親の親 |祖父母|
| HEAD~2       | HEADの2代前の親 |祖父母|
| HEAD^^      | HEADの1番目の親の1番目の親 |祖父母|
| HEAD^2       | HEADの二番目の親 |2番目の親|
| HEAD^2~~      | HEADの二番目の親の親 |2番目の親の親|

##まとめ
HEAD~2とHEAD^2は違うコミットをさすが、HEAD~~とHEAD^^は同じコミットを指す。
spring を 1.7.0 にアップデートしたら rails c が応答しなくなった話

こんな問題が起きるのは自分の環境だけな気がしますが、最終的に以下の環境変数を指定したら応答してくれる様になりました。

```
export SPRING_SERVER_COMMAND="spring server --background"
```

`spring server` は 1.7.0 から追加されたサブコマンドです。デフォルトでは以下の様にバージョン番号を引数に与えますが、自分の環境ではこのバージョン番号付きで実行する事ができませんでした。

```ruby:spring-1.7.0/lib/spring/env.rb
    def server_command
      ENV["SPRING_SERVER_COMMAND"] || "spring _#{Spring::VERSION}_ server --background"
    end
```

```
$ bundle exec spring _1.7.0_ server
Version: 1.7.0

Usage: spring COMMAND [ARGS]

Commands for spring itself:

  binstub         Generate spring based binstubs. Use --all to generate a binstub for all known commands. Use --remove to revert.
  help            Print available commands.
  server          Explicitly start a Spring server in the foreground
  status          Show current status.
  stop            Stop all spring processes for this project.

Commands for your application:

  rails           Run a rails command. The following sub commands will use spring: console, runner, generate, destroy, test.
  rake            Runs the rake command
  rspec           Runs the rspec command
```

CircleCI では問題なく実行出来ていたので、自分の環境が悪いと思っているのですが、理由はよく分かっていません。

追記：はやくも v1.7.1 がリリースされていた件
----

- [Comparing v1.7.0...v1.7.1 · rails/spring](https://github.com/rails/spring/compare/v1.7.0...v1.7.1)

特に、自分の環境で問題になっていたバージョン指定引数が取り下げられている点が注目どころ。

```ruby:lib/spring/env.rb
    def server_command
      ENV["SPRING_SERVER_COMMAND"] || "#{File.expand_path("../../../bin/spring", __FILE__)} server --background"
    end
```

おかげさまで、環境変数を設定せずとも問題なく起動する様になりました。
PHP extensionのmake testに関するTIPS

PHP extensionを書いていると`make test`することが多いと思うんですが、デフォルトの挙動のままだとテスト完了時に下記のように「PHP QAチームにレポートするかい？」と言われて困惑したりします。

```
$ make test
（略）
This report can be automatically sent to the PHP QA team at
http://qa.php.net/reports and http://news.php.net/php.qa.reports
This gives us a better understanding of PHP's behavior.
If you don't want to send the report immediately you can choose
option "s" to save it.	You can then email it to qa-reports@lists.php.net later.
```

実は、make変数でこの挙動を変えることができます。

# NO_INTERACTION=1

上記のレポートを送る機能を無効化します。

# TEST_PHP_DETAILED=1

各テストの詳細を表示します。下記のような情報が得られますが、イマイチ役に立たない気がします。

```
=================
TEST /Users/hnw/src/github.com/hnw/php-timecop/tests/002.phpt
TEST 1/1 [tests/002.phpt]
CONTENT_LENGTH  =
CONTENT_TYPE    =
PATH_TRANSLATED = /Users/hnw/src/github.com/hnw/php-timecop/tests/002.php
QUERY_STRING    =
REDIRECT_STATUS = 1
REQUEST_METHOD  = GET
SCRIPT_FILENAME = /Users/hnw/src/github.com/hnw/php-timecop/tests/002.php
HTTP_COOKIE     =
COMMAND /Users/hnw/.phpenv/versions/7.0.5-debug/bin/php  -n -c '/Users/hnw/src/github.com/hnw/php-timecop/tmp-php.ini'  -d "output_handler=" -d "open_basedir=" -d "safe_mode=0" -d "disable_functions=" -d "output_buffering=Off" -d "error_reporting=32767" -d "display_errors=1" -d "display_startup_errors=1" -d "log_errors=0" -d "html_errors=0" -d "track_errors=1" -d "report_memleaks=1" -d "report_zend_debug=0" -d "docref_root=" -d "docref_ext=.html" -d "error_prepend_string=" -d "error_append_string=" -d "auto_prepend_file=" -d "auto_append_file=" -d "ignore_repeated_errors=0" -d "precision=14" -d "memory_limit=128M" -d "log_errors_max_len=0" -d "opcache.fast_shutdown=0" -d "opcache.file_update_protection=0" -d "extension_dir=/Users/hnw/src/github.com/hnw/php-timecop/modules/" -d "extension=timecop.so" -d "session.auto_start=0" -d "tidy.clean_output=0" -d "zlib.output_compression=Off" -d "mbstring.func_overload=0" -f "/Users/hnw/src/github.com/hnw/php-timecop/tests/002.php"  2>&1
PASS Check for timecop_freeze [tests/002.phpt]
=====================================================================
```

# TESTS=--show-diff

TESTS変数経由で、実際のテストランナーである`run-tests.php`のコマンドラインオプションを指定できます。`--show-diff`を指定すると、次のように失敗したテストについてdiffが表示されて便利です。

```
TEST 1/1 [tests/002.phpt]
========DIFF========
001+ int(123)
001- int(246)
========DONE========
FAIL Check for timecop_freeze [tests/002.phpt]
```

他にどんなオプションがあるかは`run-tests.php --help`から調べられます。

# TESTS=tests/002.phpt

TESTSの内容はすべてテストランナーのコマンドライン引数として渡されます。このように、実施したいテストを明示的に指定することもできます。

# まとめ

そんなわけで、こんな感じでテストを実施するとextension開発時に便利かと思います。

```
$ make test NO_INTERACTION=1 TESTS=--show-diff
```

特定のテストが稀に落ちるので繰り返し確認したい、という場合は次のようにすれば良いでしょう。

```
$ make test NO_INTERACTION=1 TESTS='--show-diff tests/002.phpt tests/004.phpt'
```
【Git】「SSL certificate problem: self signed certificate」と表示された時の対処法

#【原因】
SSLの証明書に問題がある場合(このWebサイトのセキュリティ証明書には問題がありますと表示されると思います。)、「SSL certificate problem: self signed certificate」といったメッセージが表示され、リモートリポジトリからcloneできません。


#【対処法】
対処法として以下のように入力します。

```
git config --global http.sslVerify false
```

これで.git/configに証明書をチェックしないように設定されるので、git cloneなどした際にエラーメッセージが表示されなくなり、通常のようにできるようになります。
【Spring】MyBatisフレームワークの導入

#MyBatisフレームワークをSpringに導入する方法

##pom.xmlにdependencyを追加する
```pom.xml
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.3.0</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.2</version>
		</dependency>
```

##mybatis-config.xmlファイルを作成する
```mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<settings>
		<!-- アンダースコア区切り (スネークケース) のカラム名をキャメルケースにマップする設定 -->
		<setting name="mapUnderscoreToCamelCase" value="true" />
		<!-- SQL 内で AS によって設定された列名をマップする設定 -->
		<setting name="useColumnLabel" value="true" />
		<setting name="jdbcTypeForNull" value="NULL" />
	</settings> 
	<typeAliases>
		<typeAlias alias="Item" type="package.domain.Item" />
	</typeAliases>
</configuration>
```

##Mapper.xmlファイルを「src/main/resources」以下に作成する
```Mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="package.mapper.ItemMapper">
  	<!-- 名前空間 + ID でプロジェクト全体で一意になるように名前を設定 -->
	<!-- ParameterType は SqlSessionTemplate で渡すパラメタの型 -->
	<!-- ResultType は SqlSessionTemplate で返ってくるデータの型 -->
	<select id="findAll" resultType="Item">
		SELECT * FROM items ORDER BY id
	</select>
	
	<select id="findAllItemNames" resultType="String">
		SELECT name FROM items
	</select>
	
	<select id="findFirstToTenth" parameterType="int" resultType="Item">
		SELECT * FROM items ORDER BY id ASC LIMIT 10 OFFSET #{index}
	</select>
	
	<select id="findOneById" parameterType="long" resultType="Item">
		SELECT * FROM items WHERE id=#{id}
	</select>
</mapper>
```
##Mapper.javaのインターフェースを「src/main/java」以下に作成する
```Mapper.java
package package.ECsite.mapper;

public interface ItemMapper {
	
}

```
##Repositoryでメソッドを設置する
```ItemRepository.java
@Repository
public class ItemRepository {
@Autowired
	private SqlSessionTemplate sqlSessionTemplate;

	// 商品一覧を取得する
	public List<Item> getItemList() {
		List<Item> items = sqlSessionTemplate.selectList("package.ECsite.mapper.ItemMapper.findAll");
		return items;
	}

	// 商品一覧の名前のみを取得する
	public List<String> getItemNames() {
		List<String> itemNames = sqlSessionTemplate.selectList("package.ECsite.mapper.ItemMapper.findAllItemNames");
		return itemNames;
	}

	// 10件表示用
	public List<Item> getItemList(int index) {
		List<Item> items = sqlSessionTemplate.selectList("package.ECsite.mapper.ItemMapper.findFirstToTenth");
		return items;
	}

	// 商品個別表示メソッド
	public Item findItemById(long id) {
		Item item = sqlSessionTemplate.selectOne("package.ECsite.mapper.ItemMapper.findOneById", id);
		return item;
	}

}
```