OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Elasticsearch Service用の認証プロキシを作った


Amazon Elasticsearch Serviceを使うときに、グローバルに大公開というのもイヤだし、でも認証かけるとブラウザやらcurlからやらその他認証未対応のツールから使いたいときとかに困るので、認証部分を代理で行ってくれるプロキシサーバーを作りました。

実は[aws-auth-proxy](https://github.com/coreos/aws-auth-proxy)というのがあって使おうかと思ったのですが、自分の欲しい機能が足りないこと、またせっかくなのでgoでAWSSDKを使った何かを作りたいということもあり、ゼロから作ってます。

https://github.com/ikeisuke/amzn-es-proxy

## インストール

[amzn-es-proxy:release](https://github.com/ikeisuke/amzn-es-proxy/releases)から対応のバイナリをダウンロードするかビルドして利用してください。
ビルドする際は依存管理に[dep](https://github.com/golang/dep)を使っているのでご注意ください。

## 使い方

EC2のIAMロール、aws configureで作成できる認証情報ファイルのどちらにも対応しています。

### Amazon Elasticsearch Serviceの設定

以下のようなアクセスポリシーが必要なので設定してください。
※[]で囲んである部分は書き換えて利用

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::[account id]:role/[rolename]",
          "arn:aws:iam::[account id]:user/[username]",
        ]
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:ap-northeast-1:[account id:domain/[domain]/*"
    }
  ]
}
```

### IAMユーザー/ロールの設定

サーバー起動時に--domainオプション(後述)を利用する場合のみ以下の指定が必要です。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1487408882000",
            "Effect": "Allow",
            "Action": [
                "es:DescribeElasticsearchDomain"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

### サーバーの起動

オプション

- --domain ESのドメイン、ESを作成するときにDomain Nameとして指定するもの(--endpointとどちらか必須)
- --endpoint ESの接続先ホスト名、起動後自動的に付与される値(--domainとどちらか必須)
- --region 接続先のESの起動しているリージョン
	- 環境変数 AWS_REGIONでも指定可能
- --profile 利用するプロファイル、EC2のIAMロールもしくはデフォルトの場合は指定不要
	- 環境変数 AWS_PROFILEでも指定可能
- --listen LISTENするホスト/ポートの指定。デフォルトではローカルからのみ
 
```bash
$ nohup amzn-es-proxy --region=ap-northeast-1 --profile=[profile] --domain=[domain] &
Using endpoint search-[domain]-xxxxxxxxxxxxxxx-northeast-1.es.amazonaws.com
Listen 127.0.0.1:9200
```

### ESへのアクセス

直接の場合、以下のように認証エラーになってしまうような認証必須のエンドポイントでも

```bash
$ curl search-[domain]-xxxxxxxxxxxx-northeast-1.es.amazonaws.com
{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: test"}
```

プロキシを通すとアクセスできるようになります。

```bash
$ curl localhost:9200
{
  "name" : "rSKb5Pf",
  "cluster_name" : "247280120152:test",
  "cluster_uuid" : "xMoECUJ2SNux0MILlPBRRw",
  "version" : {
    "number" : "5.1.1",
    "build_hash" : "5395e21",
    "build_date" : "2016-12-15T22:47:19.049Z",
    "build_snapshot" : false,
    "lucene_version" : "6.3.0"
  },
  "tagline" : "You Know, for Search"
}
```

kibanaもここまでは表示できた(POSTしてる場所もある)のでおそらく一通りは大丈夫ではないかと思います。

![Kibana.png](https://qiita-image-store.s3.amazonaws.com/0/45645/3dbac282-8939-07f8-a324-ad5cbbb79252.png "Kibana.png")


大容量データの通信を試していないので、そこがとても不安です。
[ios]react-nativeでfacebookログインボタンを出すときにハマったこと

めちゃくちゃはまったのでメモ。

動作確認は
react-native@0.39.2

## 問題

react-nativeの公式設定手順に従って一通り設定したはずが
ビルドに失敗する。

https://developers.facebook.com/docs/react-native/getting-started

```
fatal error: 'FBSDKCoreKit/FBSDKCoreKit.h' file not found
#import "FBSDKCoreKit/FBSDKCoreKit.h"
```

なんかfacebookSDKの読み込みに失敗しているぽい

## 原因

### やはりパスの指定が悪かった。

このクイックスタートにて一番最初の手順でもう間違っていた。

https://developers.facebook.com/quickstarts/?platform=ios

![クイックスタート   開発者向けFacebook.png](https://qiita-image-store.s3.amazonaws.com/0/47896/091f12aa-4120-ab8c-9fec-b749e1aafcc1.png)

私は生意気にも公式で指示されている下記のパスではなく

```
 ~/Documents/FacebookSDK
```

自分のプロジェクトフォルダー(ex. ~/Mobile)にダウンロードしたFacebookSDKを置いていた。
これが悪かった。

クイックスタートより前の手順で

```
react-native install react-native-fbsdk
react-native link react-native-fbsdk
```

とインストールと設定のコマンドを打ったのだが

```
react-native link react-native-fbsdk
```

このコマンドでreact-native-fbsdkのパッケージがダウンロードした
FacebookSDKのパスを読み込む時のパスを

```
 ~/Documents/FacebookSDK
```

にしているようだった。

確かめ方は、react-nativeプロジェクトのnode_modulesから
react-native-fbsdkのiosフォルダ、RCTFBSDK.xcodeprojをXCodeで開く

下記画像のようにFramework Searchパスを確認

![react-native-fb.png](https://qiita-image-store.s3.amazonaws.com/0/47896/6d82eae5-b279-af66-f994-093d86a9d949.png)

公式に従わず、独自のディレクトリにダウンロードしたSDKを置く場合は
FacebookSDKs-iOSの方のパス設定を削除し
読み込ませたいsdkフォルダをドラッグ&ドロップしてパスを変更する

そりゃ、読み込ませたいファイルのパス違うんだからエラーになるわという話だけど
インストールしたnpm packageの方をいじらないといけなかったのは盲点でした。

## 反省

とりあえず公式には絶対従う。
自分で何か設定をいじくるのはまず動いてから。
当たり前のことを痛感した作業だった、辛かった。。

ちなみにreact-nativeでfacebookのsdkを追加する時は
xcodeprojectを開いて追加設定する必要がある。
xcodeを触ったことのない自分にはなれなくて大変でした汗

新しいことやるとデバッグの方法がうまくないので
大変ですね。。
PythonでTwitterのデータを取得する

## はじめに
今回はPythonで 
Python Twitter Tools (https://github.com/sixohsix/twitter)
というものを使って、TwitterAPIにアクセスしてみたものを載せておきます。

## Twitter Developerへの登録
>https://syncer.jp/Web/API/Twitter/REST_API/
が参考になります。
というか普通にAPIを叩く場合はここを見ればいけそう

## Python Twitter Tools
https://github.com/sixohsix/twitter
でダウンロードします。

```bash
python setup.py install
```
でインストールできます。

## Twitterクラス
```python
from twitter import Twitter, OAuth
```
でインポートした後に、

```python
t = Twitter(auth=OAuth(
        <access token>,
        <access token secret>,
        <consumer key>,
        <consumer secret>
    ))
```
でTwitterクラスを作ります。
このクラスを使って色々とTwitterのデータを取ることができるようになります。

例えば

```python
searchTweets = t.search.tweets(q = "Qiita")
```
で「Qiita」についてのTweetを取得することができます。

```python
friends = t.friends.ids()
```
で「自分のアカウント」がフォローしてるユーザのID群を取得できます。

なお出力結果は大変長いため載せませんが
https://dev.twitter.com/rest/public/rate-limits
に全て書いてあります。

## サンプル：自分のフォローしてる人の情報を取得
```python
remain = True
next_cursor = 0
while remain:
    friendsInfo = t.friends.list(cursor=next_cursor)
    for user in friendsInfo['users']:
        friendsNameList.append({
                'NumberID':user['id'],
                'userID':user['screen_name'],
                'userName':user['name']
            })
    next_cursor = friendsInfo['next_cursor']
    if(next_cursor == 0):
        remain = False
        print('Finish search')
```
 TwitterAPIは一度に大量のデータにアクセスできず、代わりにcursorという方法をとっています。これは端的に言えば、各々のアクセスの時に「どこからデータを取り始めるか」ということを示すものです。

 つまりfriends.listのcursor引数は、データを取り始める場所を指定していることになります。各ユーザデータにはnext_cursorというデータが入っており、それを次の引き数に持ってくれば、次々と新しいデータを取り込んでくれます。


## サンプル２　あるユーザのTweetを取ってくる
```python
remain = True #ループ判定
userTweets = [] #tweetの格納先
max_id = <一番新しいtweetID>
remainNum = 0
numberOfTweets = 500 #取ってくるtweetの数
count = 200 #一度のアクセスで何件取ってくるか
while remain:
    aTimeLine = t.statuses.user_timeline(user_id = <誰かのTwitterID番号>, count=count, max_id=max_id)
    for tweet in aTimeLine:
        userTweets.append(tweet['text'])
    max_id = aTimeLine[-1]['id']-1
    remainNum = numberOfTweets - len(userTweets)
    count = remainNum
    if len(userTweets)+1 > numberOfTweets:
        print('finish search')
        remain = False
```
max_id というのは先程のcursorと同じような使い方です。一度の全部取ってこれないので、TweetのIDを参照して取る場所を指定します。ちなみにこのコードは500件キレイに取るための初心者コード丸出しです・・・。　あと500件以下しかtweetしてないアカウントの場合アウトですね。
一応勉強の経過として載せておきます。

## 終わりに
色々なデータがあるTwitterですが、APIの制限は結構きつかったりします。けど、そのやり方さえ覚えてしまえば、後はドキュメントを参照すればほしいデータは取れる気がします。

[Python Twitter Tools Github](https://github.com/sixohsix/twitter)
[Twitter Developer ドキュメント](https://dev.twitter.com/rest/public/rate-limits)
[cursorの説明](https://dev.twitter.com/overview/api/cursoring)
Substance 設定変更

# Substance 設定変更

## UI系

### 3D/2D表示
Viewports
https://support.allegorithmic.com/documentation/display/SPDOC/Viewports

3D,2D表示の切り替え

- 3D/2D   (F1)
- 3D Only (F2)
- 2D Only (F3)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/28858f1a-50f2-acb9-8061-db4029527b0f.png)


## Substance Designer
### プリファレンス
編集 -> プリファレンス
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/b81ffe2c-9599-e7d9-6a72-422a05741cbb.png)

色々な設定をすることが出来る
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/ce002ad3-f3e9-f73f-7958-6f95820efda9.png)

### 言語設定

General -> Languageから言語を選択することが出来る
アプリケーションを再起動しないと言語の変更は行われない
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/f2e090b5-8f7b-b40e-0ab5-4b1bca088f48.png)

### Unity or UE4
Tangent Space Pluginの設定

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/78bbbb9a-522e-c066-d2c6-a53b90147306.png)

## Substance Painter

### Settings
編集 -> Settings
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/814f5393-c0aa-ef89-26c0-07cd272fae4c.png)


### 言語設定
Languageの項目を変更
Designerと同じで、アプリケーションの再起動が必要
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/55246d5d-7739-3075-82d5-c1d2f9926972.png)
MacでクロスコンパイラGCCをビルドする 

#動機
自作OSの独自の実行形式をサポートするためにリンカスクリプトを作成する必要があったが、MacのデフォルトのGCC(clang)・ldは、リンカスクリプト指定オプション`-T`を受け付けていなかった。そこで、リンカスクリプトを受け付けてくれるクロスコンパイラのGCCをビルドしてみることにした。

#環境
Max OS X El Capitan(10.11.2)
macOS Sierra(10.12.3)

#手順

```bash
# GMP、MPFR、MPC をインストール
brew install gmp
brew install mpfr
brew install libmpc

# MacデフォルトのGCC(clang)によるビルドはサポートされてないらしいので、非LLVMなGCCをインストールする
brew install gcc

# 環境変数の設定
export CC=/usr/local/bin/gcc-5 # ↑の手順でinstallしたGCCのパス
export LD=/usr/local/bin/gcc-5

export PREFIX="/usr/local/i386elfgcc"
export TARGET=i386-elf
export PATH="$PREFIX/bin:$PATH"

# binutilsのインストール
mkdir /tmp/src
cd /tmp/src
curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.28.tar.gz
tar xf binutils-2.28.tar.gz
mkdir binutils-build
cd binutils-build
../binutils-2.28/configure --target=$TARGET --enable-interwork --enable-multilib --disable-nls --disable-werror --prefix=$PREFIX 2>&1 | tee configure.log
sudo make all install 2>&1 | tee make.log

# OSXデフォルトのlibiconvは古すぎてGCCのビルドでこけたので、最新版をインストールする
cd /tmp/src
curl -O https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
tar xf libiconv-1.15.tar.gz
cd libiconv-1.15
./configure -prefix=/usr/local
make
make install

# クロスコンパイラなGCCをビルド
# バージョンは特にこだわりがなかったので、homebrewで入れたGCCのバージョンに合わせた
cd /tmp/src
curl -O https://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.bz2
tar xf gcc-5.3.0.tar.bz2
mkdir gcc-build
cd gcc-build
../gcc-5.3.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-libssp --enable-languages=c --without-headers --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpfr=/usr/local --with-libiconv-prefix=/usr/local
make all-gcc 
make all-target-libgcc 
sudo make install-gcc 
sudo make install-target-libgcc

# /usr/local/i386elfgcc/bin配下にGCCがインストールされている
# 念のためバージョン確認
/usr/local/i386elfgcc/bin/i386-elf-gcc -v
```
これでGCCに`-T`オプションを渡せるようになった。

#参考
http://stackoverflow.com/questions/25634708/gnu-linker-equivalent-command-in-os-x
http://wiki.osdev.org/GCC_Cross-Compiler#OS_X_Users
http://lv4.hateblo.jp/entry/20130704/1372943744
Raspberry PI 3で遊ぶ環境を用意する(2:OSインストール)

Raspberry-PIの初期設定を行う。

まずは、OSのインストールだがいきなりハマった。
↓でNOOBSのZIPをダウンロードしてきて(1Gくらいあって2時間以上かかった…)
https://www.raspberrypi.org/downloads/noobs/
ZIP解凍したものをSDカードに放り込み、
Raspberry-PIに入れて電源ONした所…

**POWERのLEDは点灯するが、ACTのLEDが点灯しないじゃないか！**

本には、電源コード抜き差しで起動するというコメントがあったので
やってみたが起動しなかった…。

一瞬ハード不良かと思ったが、よく調べてみるとRaspberry-PI3 では、残念なことにexFATが読めないらしい。
Raspberry-PIの公式サイトにかかれていた↓を読み、
https://www.raspberrypi.org/documentation/installation/sdxc_formatting.md
guiformat.exeをダウンロードして、SDカードをFAT32に変更してから
NOOBSのファイルをダウンロードしてきたものを、もう一度SDにコピーし、
挿してみたところ起動した。

OSのバージョン
　・Version:2.3.0
　・Release date:2017-03-03

Rasbianを選択してインストールを開始。
その後、無事に起動する事ができた。
次回は、日本語入力できるようにしよう。
TensorFlowで１次関数を予測(2)

前回に引き続き、チュートリアルの１次関数の予測をネタとしていろいろ試してみます。

前回と同様、下記の直線を予測します。

```math
y = 0.5x + 10
```

ただし今回はノイズとなる無駄な入力データを増やしてみます。

##ソース

```py
import tensorflow as tf
import numpy as np

## 学習データ作成（x座標をランダムに作成(0.0〜1.0を100個)
x_data = np.random.rand(100).astype(np.float32)
dummy_data = np.random.rand(100).astype(np.float32) # dummy_data
# y座標を生成 (y = 0.5x + 10)
y_data = 0.5 * x_data + 10

## モデルを作成（y_data = W * x_data + b となる W と b の適正値を見つけます。
W = tf.Variable(tf.zeros([1]))
dummy_W = tf.Variable(tf.zeros([1])) # dummy_dataに反応する重み
b = tf.Variable(tf.zeros([1]))
y = (W * x_data) + (dummy_W * dummy_data) + b

## 損失関数を作成（最小二乗法を使用
loss = tf.reduce_mean(tf.square(y - y_data))

## 最適化アルゴリズムを指定（Adam
optimizer = tf.train.AdamOptimizer(0.5)
train = optimizer.minimize(loss)

## パラメータを初期化（Variableを使用する場合必要らしい
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

## 学習する
print("step", "W", "b", "dummy_W")
for step in range(400):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(W), sess.run(b), sess.run(dummy_W))
```

dummy_dataがノイズになります。
正解である式 `y_data = 0.5 * x_data + 10` に対して
予測する式を `y = (W * x_data) + (dummy_W * dummy_data) + b`
としたため、dummy_dataに対する重み`dummy_W`が0になると思われます。

###実行結果

```
step W b dummy_W
0 [ 0.5] [ 0.5] [ 0.5]
20 [ 6.13914204] [ 6.74274445] [ 5.92936945]
40 [ 3.59152985] [ 5.90364838] [ 2.95387197]
60 [ 3.43220615] [ 7.4752655] [ 2.59850717]
80 [ 2.43747616] [ 8.12540054] [ 1.60063362]
100 [ 1.76493311] [ 8.78937626] [ 1.02400625]
120 [ 1.27992237] [ 9.28328037] [ 0.63793355]
140 [ 0.93464583] [ 9.59188747] [ 0.35878712]
160 [ 0.7261712] [ 9.78458595] [ 0.18729714]
180 [ 0.60986388] [ 9.89598274] [ 0.09076192]
200 [ 0.54876852] [ 9.95421219] [ 0.0401581]
220 [ 0.51931208] [ 9.98190594] [ 0.0159098]
240 [ 0.50659311] [ 9.99380493] [ 0.00544986]
260 [ 0.50179613] [ 9.99830627] [ 0.00148612]
280 [ 0.50029016] [ 9.99972534] [ 0.00023838]
```

うまく予測できたようです。
Raspberry PI 3で遊ぶ環境を用意する(1:機材調達)

最近、仕事でコーディングする機会がなくなってきたので、
Raspberry PI 3で遊ぶ環境を構築することにした。
現在進行形の作業をありのまま(失敗含めて)記載しようと思う。



１：Raspberry Pi3と電源と本をamazonで購入
----
カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)
金丸 隆志
￥ 1,296

【公式】Raspberry Pi 3 model B 専用電源　ACアダプタ（ブラック) 5.1V/2.5A
￥ 1,680
 送信
再度購入
 
Raspberry Pi 3 MODEL B 【RS正規流通品】
￥ 5,807

----


２：1の本を読んで、周辺機器を購入
----
・マイクロSD ￥ 2,980
・SDカードリーダー ￥ 791
・USBキーボード￥ 1,629
・USBマウス　→　持ってたものを使う。
・Raspberry-piケース￥ 829
・HDMIコード￥ 449
---------(↑までamazon)-------------
・Ｒａｓｐｂｅｒｒｙ　Ｐｉで学ぶ電子工作　パーツセット
　http://akizukidenshi.com/catalog/g/gK-10852/
　→　3500円
---------(↑まで秋月)-------------


これで、一通り必要な機材はそろった。
次回は、OSのインストールやろう！
virtualenv 基本的なコマンド使い方メモ

## この記事の概要・目的
pythonにおける仮想環境作成ツール、virtualenvの基本コマンドメモになります。


## 対象者
* たまにしかvirtualenvを使わず、コマンドを忘れてしまった人の備忘録用。
* (python開発経験があり、virtualenvを触ったことがある人が対象です。)


## virtualenvとは?
* python開発で使う、仮想環境作成ツール。
* プロジェクト毎に、クリーンな仮想環境を作成することができるツールです。
* virtualenvを導入することにより、以下のようなメリットを享受できます。
  * プロジェクト毎に開発環境を作成するため、開発中に他のプロジェクトや、マシン中のグローバルなpython環境を汚さずに済む。
  * プロジェクト中の開発環境が万一壊れても、作り直しが簡単。


## virtualenvのインストール
他のpythonパッケージと同じく、pipコマンドでinstallできます。
```
$ pip install virtualenv
```


## 仮想環境の作成
仮想環境を作りたいプロジェクトにcdし、以下のようなコマンドを叩くと、仮想環境が作成されます。
仮想環境名は任意の名称で構いません。以降ではmy_envという名称の仮想環境を使用します。

```
# 特定プロジェクトに、仮想環境my_envを作成する。
$ cd (仮想環境を作りたいプロジェクト)
$ virtualenv my_env

```


## 仮想環境の有効化
仮想環境は作成しただけでは有効にならず、
以下のようにして有効にする必要があります。

```
# 仮想環境myenvを有効化する
$ source myenv/bin/activate

# コンソール上に、以下のように表示されれば成功です!
(myenv) $ 

# 作成したばかりの時点では、仮想環境はクリーンな状態です。
# 試しにpip freezeすると、最低限のパッケージしかインストールされていないことがわかります。
(myenv) $ pip freeze
appdirs==1.4.3
packaging==16.8
pyparsing==2.2.0
six==1.10.0
```


## 仮想環境の無効化・削除
それぞれ、以下のようにします。

```
# 仮想環境の無効化
(myenv) $ deactivate

# 仮想環境の削除
# (プロジェクト直下に生成されたフォルダを、まるごと削除でOKです。)
$ rm -rf myenv/
```
初心者向け　Vimでクリップボード連携(コピー&ペースト)する方法


## 概要
- Macに標準でインストールされているVimではクリップボード連携が出来ません。ヤンク(y)でコピーしても、メモ帳など他の場所にペーストが出来ないということです。
- クリップボード連携ができれば、ヤンクでコピーした内容を他の場所にもペーストすることができます。

## 手順
### クリップボード連携の確認
- 以下のコマンドをターミナルで実行してください。

```
$ vim --version | grep clipboard 
```

- 以下のように表示されます。

![スクリーンショット 2017-03-11 22.15.03.png](https://qiita-image-store.s3.amazonaws.com/0/142810/3782c44d-8ab7-de32-ac4e-0f7bb8cc3c2d.png "スクリーンショット 2017-03-11 22.15.03.png")

- `-clipboard` と表示されている場合は、クリップボードが無効となっている状態です。

### Homebrewを使って最新のVimをインストール
- Homebrewを使ってインストールしますが、Homebrew自体をインストールしていない方は、以下を参考にしてください。
  - 参考:[初心者向け Homebrewをインストールする方法](http://qiita.com/iwaseasahi/items/6713631f9bc9c4f74097)

- 以下のコマンドをターミナルで実行してください。

```
$ brew update
$ brew install vim
```

- 終わりの方に以下のように表示されたらVimがインストールされました。

![スクリーンショット 2017-03-11 22.21.26.png](https://qiita-image-store.s3.amazonaws.com/0/142810/96167a7e-a36d-f793-b129-d4f6bb773d97.png "スクリーンショット 2017-03-11 22.21.26.png")


### インストールしたVimの確認
- インストールしたVimのバージョンを確認します。

```
$ brew list vim
```

- 赤丸の部分がバージョンになります。

![スクリーンショット 2017-03-11 22.24.59.png](https://qiita-image-store.s3.amazonaws.com/0/142810/ef0927d3-3941-3ba9-a00c-9f7e0ad4c73a.png "スクリーンショット 2017-03-11 22.24.59.png")

- このバージョンのVimがクリップボード連携ができるか確認します。

```
$ /usr/local/Cellar/vim/8.0.0442/bin/vim --version | grep clipboard
```

- 赤丸のように `+clipboard` と表示されればクリップボード連携ができます。

![スクリーンショット 2017-03-11 22.28.17.png](https://qiita-image-store.s3.amazonaws.com/0/142810/40f94cf4-cdd5-d29e-37d6-2db1bb589819.png "スクリーンショット 2017-03-11 22.28.17.png")

### Vimの置き換え
- 既存のVimからHomebrewでインストールしたVimに置き換えます。
- 以下のコマンドを実行します。

```
$ sudo mv /usr/bin/vim /usr/bin/old_vim
```

- ここで以下のエラーが表示されたら、設定を変更する必要があります。以下の記事の通りに設定を変更してください。
  - 参考:[初心者向け MacでOperation not permittedの解決方法](http://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d)

```
mv: rename /usr/bin/vim to /usr/bin/old_vim: Operation not permitted
```

- コマンドが通ったら、以下のコマンドを実行します。
- 数字の部分については上記で確認したバージョンを入力してください。

```
$ sudo ln /usr/local/Cellar/vim/8.0.0442/bin/vim /usr/bin/
```

- これでバージョンが変更されました。

### クリップボード連携の確認
- 以下のコマンドをターミナルで実行してください。

```
$ vim --version | grep clipboard 
```

- 以下のように表示されれば、クリップボードが使えるようになります。

![スクリーンショット 2017-03-11 23.20.05.png](https://qiita-image-store.s3.amazonaws.com/0/142810/aff8de55-c290-960c-88a9-71ee42e9bef7.png "スクリーンショット 2017-03-11 23.20.05.png")

### vimrcの設定
- vimrcに開きます。

```
$ vim ~/.vimrc
```

- 以下の設定が記載されていなければ、追加します。

```
set clipboard+=unnamed
```

- 以上で設定が完了しました。
- これでヤンクがクリップボードに保持されます。
chrome拡張機能:ダウンロード時にシェルフを表示させない

`manifest.json`の`permissions`に`downloads.shelf`を追加した上で、`chrome.downloads.setShelfEnabled(false)`を実行する。(`downloads`とは別なので注意。)

```manifest.json
{
  "permissions": [
    "downloads",
    "downloads.shelf"
  ]
}
```

```background.js
chrome.downloads.setShelfEnabled(false);
```

- この設定は Chrome 全体におよぶので、他の拡張はおろかユーザーの個別ダウンロードでもシェルフが表示されなくなる。
- 他の拡張が無効にしたシェルフを有効に変更しようとすると、エラーが発生する。
- シェルフが表示されている状態で無効にすると、シェルフが引っ込む。
- set はあるが get はないので、現在の状態を確認する方法はない。
- ダウンロード後に戻す場合、戻すのが早すぎるとシェルフが表示されてしまう。ダウンロード開始前に無効にし、ダウンロード完了後に有効に戻すといった細かい制御は難しい模様。
Scratchで子供にプログラミング

# 子供にプログラミング！
　自分の子供にプログラミングする環境を与えてみたいという思いからいろいろ考えていました。
　自分自身は小学校2年くらいにMSXがなぜか与えられてBASICでプログラム書かないとゲームもできないという状態から見よう見まねでプログラミングしていました。そのあとはPC-9801だったような。
　当時よかったな思うのは月刊誌（マイコンBasic懐かしい。。。）などでBasicのゲームプログラムが当たり前にあって題材に困らなかったこと。ゲームとして動くので「ゲームするため」というモチベーションだけでかなりの量コーディングしていた気がします。
　最初はただひたすら真似て遊んでいたものも自分なりに改変したりとかしているうちにプログラミングの基本的なことは理解していっていたなと。

　で、最近はどうなのかというと、そういう気軽に楽しく子供がコーディングできるネタというが
あまりない気がします（探し方が下手なだけかもですが）。
道具だけは揃ってるので、環境は良くなってると思うのですが。。。
　いろいろ見ていると子供が遊びやすそうなものとしてはScratchが候補にあるんですが、エディターを子供用にひらがな表記にすることはできても、題材が子供がわかる形のものがあまりないです。
　ないのでじゃぁ自分で作ろうと思い、子供がわかるような簡単な手順のものを作っていきたいと思います。子供なのでハードなものはつらいだろうということで最初は動くということをみれるものにしています。

## 環境
子供に遊ばせるという点でいろいろ考慮しオフライン版のScratch 2.0を使用します。
Scratch自体はどのバージョンでもいいと思います。
あと、対象は小学生低学年くらいを意識しているのでひらがな、カタカナベースで書きます。
以降は少しずつ命令を増やして行くことでなにか作っていけるようにしていきたいと思ってます。

## 初めてのプログラミング - おしゃべりさせよう
キャラクターに「Hello!」としゃべらせよう。
![k01.png](https://qiita-image-store.s3.amazonaws.com/0/152548/eb321517-4819-d366-9942-ce1a5f1759a3.png)をおすと「Hello!」としゃべるよ。
![s3.png](https://qiita-image-store.s3.amazonaws.com/0/152548/cd1b175c-d8d0-240c-fe91-8399d461246d.png)


### 1. ![e02.png](https://qiita-image-store.s3.amazonaws.com/0/152548/4ac4f1d8-a4b2-a49f-b1c1-7bc7a3d8b21a.png)をついかしよう。
![e01.png](https://qiita-image-store.s3.amazonaws.com/0/152548/a8fcf052-8890-7b28-38b7-e2d8a98f1806.png)をおします。つぎに、![e02.png](https://qiita-image-store.s3.amazonaws.com/0/152548/4ac4f1d8-a4b2-a49f-b1c1-7bc7a3d8b21a.png)をどらっぐしてはりつけてね。
どらっぐ：うごかしたいものを、マウスでおしたままうごかしてみてね。


![s1.png](https://qiita-image-store.s3.amazonaws.com/0/152548/000dbd31-3e83-666a-b0c7-79277505fcb0.png)
### 2. ![m02.png](https://qiita-image-store.s3.amazonaws.com/0/152548/b2178b22-9c86-179d-b62c-f592e0840576.png)をついかしよう。
![m01.png](https://qiita-image-store.s3.amazonaws.com/0/152548/4924bfac-997a-0985-df98-098c4f3970bf.png)をおします。つぎに、![m02.png](https://qiita-image-store.s3.amazonaws.com/0/152548/b2178b22-9c86-179d-b62c-f592e0840576.png)を、![e02.png](https://qiita-image-store.s3.amazonaws.com/0/152548/4ac4f1d8-a4b2-a49f-b1c1-7bc7a3d8b21a.png)のしたにつなげてね。
![s2.png](https://qiita-image-store.s3.amazonaws.com/0/152548/d9991535-7e54-7e3e-de9f-10056754d801.png)
### 3. かんせい！
![k01.png](https://qiita-image-store.s3.amazonaws.com/0/152548/eb321517-4819-d366-9942-ce1a5f1759a3.png)をおしてしゃべることをみてね。
### ほかにもためしてみよう
- [ ] キャラクターに「Hello!」とはちがうことばをしゃべらせてみよう。
しゃべることばをかえるときは、「Hello!」のところをマウスでおしてかえてみよう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/9f20bdbe-dc0f-18e8-2069-c196032f28dd.png)
→おはようにかえてみたよ→
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152548/75c1fdcc-e81a-0260-c71d-68c45aa719e9.png)
SQLcl 4.2（あるいは12.2バンドルのSQLcl）でエラー


# エラーの内容

## SQLcl: Release 4.2.0

起動時に「Unsupported major.minor version 51.0」が発生する。

```
$ sql
Exception in thread "main" java.lang.UnsupportedClassVersionError: oracle/dbtools/raptor/scriptrunner/cmdline/SqlCli : Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
        a'''
        
        java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: oracle.dbtools.raptor.scriptrunner.cmdline.SqlCli.  Program will exit.
```

## Oracle Database 12.2にバンドルされてるSQLcl（Release 12.2.0.1.0 RC）

接続時に「Error Message = No suitable driver found for jdbc:oracle:oci8:@」が発生する。

```
$ sql

SQLcl: Release 12.2.0.1.0 RC on Sat Mar 11 11:16:16 2017

Copyright (c) 1982, 2017, Oracle.  All rights reserved.

Username? (''?) system
Password? (**********?) *********
  USER          = system
  URL           = jdbc:oracle:oci8:@
  Error Message = No suitable driver found for jdbc:oracle:oci8:@
  USER          = system
  URL           = jdbc:oracle:thin:@127.0.0.1:1521:ORCL
  Error Message = No suitable driver found for jdbc:oracle:thin:@127.0.0.1:1521:ORCL
  USER          = system
  URL           = jdbc:oracle:thin:@localhost:1521/orcl
  Error Message = No suitable driver found for jdbc:oracle:thin:@localhost:1521/orcl
Username? (RETRYING) ('system/*********'?)
Warning: You are no longer connected to ORACLE.
```

# なんでか

SQLcl 4.2ではJRE8以上が必要です。


http://www.oracle.com/technetwork/jp/developer-tools/sqlcl/downloads/sqlcl-faq-3014678-ja.html

```
SQLclの入手方法を教えてください。
OTNから.ZIPファイルをダウンロードして、展開します。ターミナル/コマンド・セッションを起動して、\binディレクトリの‘SQL’プログラムを実行します。Java Runtime Engine（JRE）8以上がマシンにインストールされている場合は、これで使用できます。
```


# どうするか

JAVA_HOMEにJRE8が含まれるディレクトリを指定して、SQLclを起動する。
Oracle Database12.2ではORACLE_HOME以下のJavaはJRE8なのでこれを指定します。

```
export JAVA_HOME=/u01/app/oracle/product/java/jdk1.8.0_74
```
12.2の場合以下でもOKです。

```
export JAVA_HOME=$ORACLE_HOME/jdk
```

# 参考

"No suitable driver found" for sqlcl on Oracle Public Cloud 12.2
https://community.oracle.com/thread/3989815

"Oracle SQLcl"を使ってみる
http://qiita.com/mon_tu/items/da3333590847fdfb1672

Oracle SQL Developerコマンドライン（SQLcl）
http://www.oracle.com/technetwork/jp/developer-tools/sqlcl/downloads/sqlcl-faq-3014678-ja.html
初心者向け　MacでOperation not permittedの解決方法


## 概要
- OS X 10.11 El Capitanより追加されたセキュリティ機能、SIP（System Integrity Protection）によって以下の領域がガードされています。
- `/bin`
- `/sbin`
- `/System`
- この配下では，rootユーザでも書き込みできません。

## 事例
例えば以下のコマンドを実行するとエラーが表示されます。

```console
$ sudo mv /usr/bin/vim /usr/bin/old_vim
mv: rename /usr/bin/vim to /usr/bin/old_vim: Operation not permitted
```

## 解決手順
- Macを一度シャットダウンします。
- 立ち上げる時に、`command + R` を押し続けてマークが表示されたら離します。
- しばらくするとリカバリーモードが起動します。
- リカバリーモードになったら、「主に日本語を使用する」を選択して、次にいきます。

![20170311_224933.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/5434ac6e-d399-af78-b444-63d685aa58bf.jpeg "20170311_224933.jpg")

- ユーティリティからターミナルを起動します。

![20170311_225011.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/803f1f1c-3990-4e67-b6f7-2b9fd7b3cd0b.jpeg "20170311_225011.jpg")

![20170311_225857.jpg](https://qiita-image-store.s3.amazonaws.com/0/142810/795cc596-341c-6db7-2b48-becb23000035.jpeg "20170311_225857.jpg")

- ターミナルから以下のコマンドを実行します。

```console
$ csrutil status
```

- その結果、以下が表示されます。
- `enabled` というのが、エラーの原因です。

```
System Integrity Protection status: enabled.
```

- 以下のコマンドで設定を変更します。

```console
$ csrutil disable
```

- その結果、以下が表示されます。

```
Successfully disabled System Integrity Protection. Please resart the machine for the changes to take effect.
```

- 再起動するために以下のコマンドを実行します。

```console
$ reboot
```

- これで再起動されれば、設定が変更され、エラーが解決できます。
chrome拡張機能:ダウンロードしたファイルの存在を確認する

当初は`exists`を使っていたが、ファイルが存在しないのに`true`を返してくるので(ネットワークエラーでダウンロードに失敗した時?)、`fileSize`を見るようにした。

```background.js
chrome.downloads.search({id:downloadId}, DownloadItem => {
	//console.log(DownloadItem[0].exists);
	console.log(DownloadItem[0].fileSize > 0);
});
```
Unity ～Assetからフォルダごとデータを読み込み～ 

#使いみち
コレクションリスト作って画像読み込ませるときとか？



#実装
Assetの階層作成
Asset/Resources/hogehoge
/hogehogeの中に画像データが入っているイメージを想定
/hogehoge/image1
みたいな

今回はUI＞Panelから画像を表示させます。

##コード
C#

```csharp
Sprite[] image;

image = Resources.LoadAll<Sprite>("hogehoge");

panel = GameObject.Find("Panel").GetComponent<Image>();

//こんな感じで呼び出し
panel.sprite = image[0];
```

image1とかで番号管理している場合はこんなので擬似的にイメージ名から参照も可能

```csharp

image[int.Parse(imageName.Substring(5)) - 1];

```

処理的にはimageName="image1"だったら6文字目以降を参照し、数値化する
結構無理やり出しバグあったらごめんね★

-1してるのは配列が0スタートで番号を1スタートシてたらそれを補正するためです。

##ファイル総数

```csharp

image.Length

```
でファイル総数がわかります。

コレクションリストとかを動的に作ってるなら参照エラーが怒らないように総数と合わせとくと良いんじゃないかなと



※追記
##名前参照出来ました（）
 poseImage.sprite = Resources.Load("PoseImage/" + pose, typeof(Sprite)) as Sprite;

##ガチャ的に
箱用意して
Sprite[] normalPose;

変数用意して
int normalPoseNum;

フォルダの中身箱に入れて
normalPose = Resources.LoadAll<Sprite>("PoseModel/Normal");

箱の中身の総数読み出して
normalPoseNum = normalPose.Length;

総数の中からランダムで一つ取り出して名前を参照
setPoseName(normalPose[Random.Range(0, normalPoseNum)].name);

例えば箱を2つ用意しとけばどちらの箱を選ぶかの2択
その後中身抽選って感じの簡易的ガチャが作れるね★
docker コマンドメモ

# コマンド
### 1.イメージのダウンロード(docker pull)

```
docker pull [オプション] [イメージ名] [:タグ名]
例
docker pull centos:7
```

### 2.取得したイメージ一覧の表示(docker images)

```
docker images [オプション] [リポジトリ名]
```
**主なオプション**

|オプション          |説明                    |
|:----------------|:---------------------:|
|-a, --all=false  |全てのイメージ表示         |
|--digests=false  |ダイジェストを表示          |
|--no-trunc=false |結果を全て表示            |
|-q, --quiet=false|DockerイメージIDのみ表示   |


### 3.イメージの削除(docker rmi)

```
docker rmi [オプション] [イメージ名] 
```

### 4.コンテナ生成(docker create)
イメージからコンテナを生成します。
※コンテナの起動はしません。

```
docker create
```


### 5.コンテナ生成/起動(docker run)
イメージからコンテナを生成し、コンテナ上でプロセスを起動します。

```
docker run [オプション] [イメージ名] [：タグ名] [引数]
例
docker run -it --name "exampleimage" centos /bin/bash
```

- ```docker run```: コンテナを生成し、実行
- ```--it```: コンソールに結果を出すオプション
- ```--name "exampleimage"```: コンテナ名
- ```centos```: イメージ名
- ```/bin/bash```: コンテナで実行するコマンド


|オプション                 |説明                    |
|:-----------------------|:---------------------:|
|-a                      |標準入力(STDIN)、標準出力(STDOUT)、標準エラー出力(STDERR)にアタッチする。|
|--cidfile="ファイル名"     |コンテナIDをファイルに出力する。 |
|-i, --interactive=false |コンテナの標準出力を開く。     |
|-t, tty=false           |tty(端末デバイス)を使う。     |
|--name                  |コンテナ名                 |

### 6.コンテナ起動(docker start)
停止中のコンテナを起動します。
コンテナ識別子を指定して、コンテナを起動します。

```
docker start [コンテナ識別子]
```


### 7.コンテナ停止(docker stop)
起動しているコンテナを停止します。
コンテナ識別子を指定して、コンテナを停止します。

```
docker stop [コンテナ識別子]
```


### 8.コンテナ削除(docker rm)
コンテナを削除します。
削除対象のコンテナが停止している必要があります。

```
docker rm [コンテナ識別子]
```


### 9.稼働コンテナの一覧表示(docker ps)

```
docker ps [オプション]
```

**コマンド結果**

|項目          |説明                     |
|:------------|:-----------------------:|
|CONTAINER ID |コンテナID                 |
|IMAGE        |コンテナ元のイメージ          |
|COMMAND      |コンテナで実行されているコマンド |
|CREATED      |コンテナの作成からの経過      |
|STATUS       |コンテナの状態              |
|PORTS        |割り当てられたポート          |
|NAMES        |コンテナの名前              |


### 10.稼働コンテナへの接続(docker attach)

```
docker attach [コンテナ名]
```


### 11.稼働コンテナでプロセス実行(docker exec)
バックグランドで実行しているコンテナにアクセスしたい時に、```docker attach```コマンドをしても、シェルが動作していないときは、コマンドを受け付けません。そんな時に、使用するコマンドです。

```
docker exec [オプション] [コンテナ識別子] [実行するコマンド] [引数]
```
chrome拡張機能:オプションページの様な自作ページをタブで開く

拡張内にファイルを配置し、`chrome.tabs.create()`でurlにファイル名を指定するだけ。`manifest.json`への記載も不要。

```background.js
chrome.tabs.create({url: 'custom_page.html'}, tab => {});
```

自作ページでスクリプトを読み込むには、オプションページ同様`script`要素で読み込めばいい。

```custom_page.html
<script src="custom_page.js"></script>
```

ただし、`chrome.tabs.create()`のコールバック関数内で`chrome.tabs.sendMessage()`を実行しても、まだタブ側のスクリプトが読み込まれていないのでメッセージは受信できない。なので、必要な情報はタブを開く前に`localStorage`に保存しておき、自作ページでそれを読み込む形にした。

```background.js
localStorage.aaa = 'aaa';
chrome.tabs.create({url: 'custom_page.html'}, tab => {});
```

```custom_page.js
let aaa = localStorage.aaa;
```
spritekitで作ったゲームをリリースするまで

#はじめに
これを書いてる人はiOS開発を仕事でやりだして１年くらいです。
今回SpriteKitを使った簡単なゲームアプリを作って初めてリリースしました。
開発期間中に見て参考にしてたサイトとかをまとめておこうと思います。

# SpriteKit
今まで個人でアプリ開発しようと何度かチャレンジしましたが、途中で飽きてしまうことが多く、なかなかリリースまで至りませんでした。
今回は全く触ったことのないものを使おう、ということでSpriteKitを触り始めましたが、referenceとか読んでたら1日くらいで遊べるものができて、SpriteKitめっちゃおもしれーーーーー！ってなりました。
（初めてアプリやる人ってUITableViewControllerとか覚えるよりも、SpriteKitでNode動かして物理演算使ってみる方が感動がでかいと思う。）

Unityは触ったことないんで知らないですが、SpriteKitに関していえば少しでもiOS開発やったことある人だとかなり扱いやすいと思います。学習コストが全然かからなかったのもリリースまでちゃんとできた大きな要因かも。だいたいプロパティ設定するだけで適当に動くし。
あとNodeの速度計算のために久しぶりに数学使って、脳の退化ぶりに絶望したりもしました。

参考:
Appleのドキュメント。
https://developer.apple.com/reference/spritekit
SpriteKitの使い方をかなり丁寧にまとめてくれてるサイト
http://hajihaji-lemon.com/smartphone/ios-swift/

# ゲームの方向性
とにかくシンプルにすることを考えました。
キャラクターとか使うとデザインに時間かかるし、Nodeが増えすぎて処理重くなるのも嫌だったので。
あとはシンプルな図形でフラットデザインぽい色つけとけばそれっぽく見えるんじゃね、っていう安易な発想。

参考:
その名の通りフラットデザインに合う色をまとめてくれてるサイト。非デザイナーなのでこういうサイトはすごく助かる。
https://flatuicolors.com/

# GameCenter対応
ほぼゲームとして形になったので、GameCenter対応しよう！と思ったら有料アカウントじゃないと使えないらしい。ここでついにApple様にお布施。
スコアを送るだけの実装なら結構お手軽でした。アチーブメントは考え出すと時間取られるので一旦スルー。

参考:
Swiftサラリーマンさんの記事（AppDelegateに書くところが非常に参考になった）
http://swift-salaryman.com/gklocalplayerutil.php

# Firebase
広告(Admob)入れたり、解析したりもしたかったので、先輩に相談したらとりあえずFirebase入れとけって話だったので導入。公式のガイドに沿って進めるだけで簡単に導入できます。

公式:
https://firebase.google.com/


# アイコンとスクリーンショットの作成
とりあえずKeynoteでスライドサイズを指定して作ったのでかなり手抜き。
アップデートの時にでもちゃんとデザインできる人にお願いする予定。

参考:
画像を投げると各種アイコンサイズにしてくれる便利なサイト。iOSとandroid両方に対応。
https://resizeappicon.com/

# 申請作業
申請は初めてだったのでとにかく先人の知恵を頼りにしました。
参考リンクがなければ絶対に申請できなかった。ありがとうございましたmm

Developer programへの登録からリリースまでを、サルでもできるくらい丁寧に書いてくれてるサイト。
http://examination-03.hatenablog.com/
Appストア公開までの手順のスクショが豊富で（しかも新しい）めちゃくちゃ助かったサイト。
http://unitynightowlgames.hatenablog.com/entry/2016/10/06/230911

# 番外編（ハマったところ）
## validate
申請準備の段階でvalidateでハマった。

```
iTunes Store operation failed.
Missing required icon file. The bundle does not contain an app icon for iPad of exactly '152x152' pixels, in .png format for iOS versions >= 10.0.
```

アプリのアイコンを設定するときにローカルから画像を設定してしまっていて、Assets.xcassetsに画像ファイルを入れてなかったのが原因だったようです。

## upload
validate通ったぜー！と思ってuploadしたらまたもエラー。。

```
This action could not be completed. Try again. (-22421)
```

これはAppleのサーバが原因みたいで、再度実行したら通りました。心臓に悪い。。


# おわりに
今回のアプリは、開発〜申請までだいたい２週間くらいでした。
最初の１週間くらいでSpriteKit触りまくって、３日くらいでゲームに必要な画面とか作って、GameCenter対応とFirebase導入とアイコン作成と申請作業は１日で終わりました。

今後やりたいこととしては、
* UIやプレイアビリティの向上
* テストとリファクタ
あたりですかね。

それではSpriteKitを使って、良いアプリ開発ライフを！
編集距離についての説明及びPythonでの実装

###アルゴリズムの説明###
編集距離(レーベンシュタイン距離)はつまりある文字列をもう一つの文字列に変えるためかかるステップ数
そのステップは、
・一文字を削除する
・任意の一文字を挿入する
・文字一文字を他の文字と置き換える
のいずれかである

まずレーベンシュタイン距離のアルゴリズムを理解しよう

例えば文字列`cafe`と`coffee`の場合だと
`cafe→caffe→coffe→coffee`
こんな感じですね

最初はまず表を作りましょう


|   |   | c | o | f | f | e | e |
|:--|---|---|---|---|---|---|---|
|   |   |   |   |   |   |   |   |
| **c** |   |   |   |   |   |   |   |
| **a** |   |   |   |   |   |   |   |
| **f** |   |   |   |   |   |   |   |
| **e** |   |   |   |   |   |   |   |

初期値を入れましょう
対象文字列が空の時（対象文字列はこれからちょっとづつ増やす）、もちろんレーベンシュタイン距離は文字列の長さと等しい
なので

|   |   | c | o | f | f | e | e |
|:--|---|---|---|---|---|---|---|
|   | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|**c**| 1 | * |   |   |   |   |   |
|**a** | 2 |   |   |   |   |   |   |
| **f** | 3 |   |   |   |   |   |   |
| **e** | 4 |   |   |   |   |   |   |
(3,3)の「**＊**」から本番のアルゴリズム始まります
これから残ったセルは、すべてこの下の**最小値**になります
・もしこのセルにある列の一番上の文字と、このセルにある行の一番左の文字が同じであれば、このセルの値は**左上のセルの値**と等しい、そうじゃなければ**左上のセルの値＋１**になる
・左のセルの値＋１
・上のセルの値＋１

ここでは、(3,3)の場合だと
・(3,3)にある列の一番上の文字"c"と行の一番左の文字"c"が同じなので0になる
・(2,3)になるため1になる
・(3,2)になるため1になる
この上の三つの値の最小値を取るため、(3,3）が0になる

|   |   | c | o | f | f | e | e |
|:--|---|---|---|---|---|---|---|
|   | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|**c**| 1 | 0 |   |   |   |   |   |
| **a** | 2 |   |   |   |   |   |   |
| **f** | 3 |   |   |   |   |   |   |
| **e** | 4 |   |   |   |   |   |   |
このように、すべてのセルを埋めよう

|   |   | c | o | f | f | e | e |
|:--|---|---|---|---|---|---|---|
|   | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
| **c** | 1 | 0 | 1 | 2 | 3 | 4 | 5 |
| **a** | 2 | 1 | 1 | 2 | 3 | 4 | 5 |
| **f** | 3 | 2 | 2 | 1 | 2 | 3 | 4 |
| **e** | 4 | 3 | 3 | 2 | 2 | 2 | 3 |
この表を得る。この表の一番右下の値がレーベンシュタイン距離になる

###Python 3.5.2による実装###
このアルゴリズムをプログラムにまとめると

```levenshtein.py
class Levenshtein:
#ここで配列を立ち上げて、初期値を入れる
    def initArray(self,str1,str2):
        distance = []
        for i in range(len(str1)+1):
            distance.append([0]*(len(str2)+1))
            distance[i][0] = i
        for j in range(len(str2)+1):
            distance[0][j] = j
        return distance
#セルに値を入れる
    def editDist(self,str1,str2,distance):
        dist = [0]*3
        for i in range(1,len(str1)+1):
            for j in range(1,len(str2)+1):
                dist[0] = distance[i-1][j-1] if str1[i-1]==str2[j-1] else distance[i-1][j-1]+1
                dist[1] = distance[i][j-1]+1
                dist[2] = distance[i-1][j]+1
                distance[i][j]=min(dist)
        return distance[i][j]

    def __init__(self,str1,str2):
        self.str1 = str1
        self.str2 = str2
        Levenshtein.distance = self.initArray(str1,str2)
        Levenshtein.dist = self.editDist(str1,str2,Levenshtein.distance)

if __name__ == '__main__':
    str1 = 'coffee'
    str2 = 'cafe'
    leven = Levenshtein(str1,str2)
    print(leven.dist)
```
wordpress開発環境の手動設定備忘録

#環境
- vagrant+virtualboxにcentosをインストール
- PHP,MySQL,Apache,NodeJS,等もインストール
- アプリケーションを自動起動する設定を各自行う
- apacheのバーチャルホストを設定し本番と同じURLで確認できるようにする

#作業まとめ
1.サイトごとのディレクトリを作成
2.apacheのバーチャルホスト設定
3.MySQLの設定-ユーザー作成、データベース作成
4.wordpressのインストール
5.gulpインストール
6.sassディレクトリ作成
7.git設定
巨大なGitリポジトリでのGitコマンドを速くする

最近ワケあってブラウザのソースコードをいくつか読んでいたのだけど、いかんせんどれもファイル数が多いため、ターミナル上で実行する操作1つ1つが遅くて非常にストレスフルだった。ディスクのI/Oがボトルネックになっているようで、ファイルシステムのvnode数を上げることでチューニングが出来るらしい。kern.maxvodeというカーネルパラメータがこの設定にあたる。

```bash
$ sudo sysctl kern.maxvnodes=$((512*1024))
```

でmaxvodeを変更し、`$ git status`の実行時間を比較してみる。なお、kern.maxvodeの現在の値は

```bash
$ sysctl -a | egrep kern.maxvnodes
```

で確認できる。筆者が利用しているのはmacOSだが、BSD系の環境だとkern.maxvnodeのデフォルトは`263168`のようだ。

**BEFORE**

kern.maxvnodes = 263168

- 0.86s user 4.71s system 222% cpu 2.504 total
- 0.88s user 3.91s system 208% cpu 2.305 total
- 0.85s user 5.35s system 241% cpu 2.569 total

=> AVG: 2.45s

**AFTER**

kern.maxvnodes = 524288

- 0.87s user 2.92s system 184% cpu 2.053 total
- 0.84s user 1.39s system 152% cpu 1.463 total
- 0.87s user 1.37s system 155% cpu 1.435 total

=> AVG: 1.64s

平均で1秒ほど速くなった。1回目の実行が他と比べて遅いのは、ディスクI/O系のカーネルパラメータの変更が実際に効果が現れるまでには多少時間がかかるということだろうか。ちなみに、kern.maxvnodesをこれ以上あげても特に変化は見られなかった。またほかのコマンドでも改善は見られるようだが、特に差が顕著だったのが`$ git status`だった。

## 参考

- [Tuning Kernel Limits](https://www.freebsd.org/doc/handbook/configtuning-kernel-limits.html)
- [Tuning maxvnodes for better system peformance](http://hints.macworld.com/article.php?story=20030712130414339)
- [Improving performance of git status](https://chromium.googlesource.com/chromium/src/+/master/docs/mac_build_instructions.md#Improving-performance-of)
ライントレーサーをChainerRLで実装

黒いラインを追従して進む移動ロボットのシミュレーション（ライントレーサー）をChainerRL(DQN)を用いて実装しました。

学習結果を可視化したものが以下になります。

![linetrace.gif](https://qiita-image-store.s3.amazonaws.com/0/72509/fdc67257-ed8d-b937-6174-c91bd156244a.gif)

こんな感じで、エージェント（緑色の玉）が黒い線を追従しているのがわかると思います。
カクカクと動いている青い線はエージェントの進もうとしている方法（速度）を表しています。

コードはこちらにてアップしてあります。
https://github.com/slowsingle/LineTrace

描画はすべてcv2モジュールを使っています。画像処理じゃなくて画像描画のためにcv2をメインで使うのは久しぶりというか、あまり見ないような気がします。
本当はPyQtとかwxPythonを使うのが正攻法かもしれません。（ま、今回はcv2だけで事足りる程度のタスクだっただけです）

# エージェントの設計

```Python:lineTrace.py
    def update(self, act_num):
        # act num に応じて方向転換する
        act_list = (np.pi / 3.0, np.pi/ 4.0, np.pi/ 6.0, 0.0, -np.pi / 6.0, -np.pi/ 4.0, -np.pi / 3.0)
        #  :
        # <略>
```

行動は左方向へ進むのが3段階、右方向へ進むのが3段階、直進と合計7つ用意しました。
したがって、DQNにおけるニューラルネットワークの出力ユニットは7個になります。

# 環境の読み込み

```Python:lineTrace.py
        # フィールド画像の読み込み
        # フィールド画像には白の中に黒線があるものを想定する
        self.field = cv2.imread("field/field.png")
        #  :
        # <略>
```

環境はpng画像として用意し、それを読み込みました。
githubにもフィールド画像をアップしています。このように、画像さえ作ってしまえば色々な領域でエージェントを走らせることができます。

# 状態の取得

lineTrace.pyのAgentクラスのget_state()メソッドに実装してあります。
エージェントが取得できる状態はエージェントの前方においたセンサアレイから取得される、各センサの値(0 or 1)のリストになります。

ライントレーサーについては以下のサイトなどを参考にしてください。
http://www.cct.ac.jp/mech/yume2/yume2.htm

上記のサイトですと、センサが2つあって、どのセンサが黒い線上にいるかを検知して、次の行動を決定しています。
私のプログラムではセンサは9つ用意してあります。
センサの数はlineTrace.pyのLineTraceクラスの__init__()メソッドのobs_space変数にて設定できます。

# 学習とテスト方法

学習はdqn.pyに実装されています。
中身は、以下のサイトに書いてあるコードをコピー＆ペーストし、ちょいちょいと書き換えただけです。
https://github.com/pfnet/chainerrl/blob/master/examples/quickstart/quickstart.ipynb

テストはdqn-test.pyでできます。
githubには学習済みのモデルも上げていますので、すぐに実行できると思います。
Bootstrapのダイアログの位置が微妙で毎度イライラする問題

## これこれ。
[bootstrap](https://v4-alpha.getbootstrap.com/components/modal/)のドキュメントより。

![Kobito.UBHnwk.png](https://qiita-image-store.s3.amazonaws.com/0/127115/977fdf13-4847-370a-dc87-423bed72c5b3.png "Kobito.UBHnwk.png")

## おれはど真ん中派なんだ！

`.modal-dialog` で `margin: 30px auto;`しかしてくれていないのでがっつり上書きしちゃう。

```app.sass
// bootstrap.sass or bootstrap.css 読み込み後に↓を定義

.modal-dialog
  display: flex
  flex-direction: column
  justify-content: center
  min-height: 100%
  margin: auto
  pointer-events: none

  .modal-content
    pointer-events: all
```
## そうそうこれよこれ。

![Kobito.Fbsofz.png](https://qiita-image-store.s3.amazonaws.com/0/127115/a111a96e-bad4-8f86-816f-ff7b3d7689a3.png "Kobito.Fbsofz.png")



もう一度言おう、おれはど真ん中派なんだ！
ターミナルで日本語を入力できない

ターミナルで日本語入力できるのに、vagrant上で、あるいはサーバー上でvimで日本語打ったらコードが出る
或いはMysql開いたら、コマンド行に日本語を写ったらリターン押すと消える

それはおそらく**Macの言語と地域設定**がちょっと間違っている
それを解決するには、まず自分のMacの言語と地域設定をチェックしましょう

まずターミナルに

```$ locale```
に入力し、おそらくこうなっています

```terminal
LANG=
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
```

これを解決するには、ターミナルに

```
$ vi ~/.bash_profile
```

で、`.bash_profile`に

```~/.bash_profile
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
```
を追加しましょう
そして、

```
$ source ~/.bash_profile
```
でさっきの変更を反映します。

そうしたら、またターミナルに`locale`を打つと

```bash
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
```
になるはずです
「TODOマークを使って実装忘れ防止」のPerl部分をBashスクリプトにしたバージョン

いい記事発見しました。
[TODOマークを使って実装忘れ防止](http://qiita.com/mss634/items/0495101b980e5f652d96)

が、Perlが苦手なのでBashを使うバージョンを作りました。

次のPerlスクリプト

```perl
perl -p -e "s/($TAGS)/ warning: \$1/"
```

をBashにして、

```bash
while read s; do [[ $s =~ (.*)($TAGS)(.*) ]] && echo ${BASH_REMATCH[1]} warning: ${BASH_REMATCH[2]}${BASH_REMATCH[3]}; done
```

完成したスクリプト：

```bash
TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | while read s; do [[ $s =~ (.*)($TAGS)(.*) ]] && echo ${BASH_REMATCH[1]} warning: ${BASH_REMATCH[2]}${BASH_REMATCH[3]}; done
```
【備忘録】WordPressをローカル環境で立ち上げる【Mac XAMPP】

【編集&追記】2017.7.17（月）
数ヶ月前に備忘録のつもりで書いたのですが今の僕にとって意味不明でしたので、
当時の目的や内容をよく考えて書き直すことにしました（笑）
【対象】
・Macのローカル環境でWordPressを立ち上げたい
【環境】
・PC：macOS Sierra(ver10.12.5)
・XAMPP：ver5.6.30
・WordPress：ver4.7.3
【所要時間】
・15~20分
<h4>【ポイント】
　phpMyAdminで作成したDBを操作できるアカウント（特権）を追加して、
　WordPressのwp-config.phpの中身との情報を揃えよう！！<h4>



<h4>【準備編】</h4>
　： XAMPP
　　入手：https://www.apachefriends.org/jp/index.html
　　参考：http://www.miraidenshi-tech.jp/blog/11840/
　： WordPress
　　入手:https://ja.wordpress.org/

<h4>【構築編】</h4>
　： XAMPPでApatchとMySQL起動
![スクリーンショット 2017-03-11 21.05.49.png](https://qiita-image-store.s3.amazonaws.com/0/162197/66bd92cf-2799-8212-ae5b-58f544c80e17.png)

　： アドレスに"localhost"と入力する
　： 右上の"phpMyAdmin"タブをクリック
![スクリーンショット 2017-03-11 21.10.26.png](https://qiita-image-store.s3.amazonaws.com/0/162197/c5a20533-f682-dca1-3eb9-bbd05ed6bf41.png)
　： 左サイドバーのNewをクリックし、DBを新たに作成する
　![スクリーンショット 2017-03-11 21.11.42.png](https://qiita-image-store.s3.amazonaws.com/0/162197/11273f28-277e-044e-4591-16a2b5e9211d.png)
　：<strong>作成したDBの特権にて、アカウントを追加する（超重要）</strong>
![スクリーンショット 2017-03-11 21.13.38.png](https://qiita-image-store.s3.amazonaws.com/0/162197/a06c4dd1-abe3-c562-7223-8382aa1ea73c.png)
↓
![スクリーンショット 2017-03-11 21.14.02.png](https://qiita-image-store.s3.amazonaws.com/0/162197/9b19613e-2c43-69fa-4e07-a705548c5080.png)
↓
![スクリーンショット 2017-03-11 21.16.03.png](https://qiita-image-store.s3.amazonaws.com/0/162197/8ef482d7-a8f1-1712-d8f4-eb81b1dd69e5.png)
　

　：設定したユーザー名、パスワード、などをダウンロードしたwpディレクトリの、
　　"wp-config-smaple.php"をコピーした"wp-config.php"に書き込む<br>
![スクリーンショット 2017-03-11 21.25.29.png](https://qiita-image-store.s3.amazonaws.com/0/162197/10e972db-3cc1-6fc5-48a1-dd77ab934506.png)

 ： アドレスに"localhost/wordpress(ダウンロードしたWordPressのディレクトリ名)"と入力
 : 上記で設定したユーザ名、パスワードなどを入力し、ログイン。
 ： 完了。

※ Qiita初投稿ということもあり、分かりづらい文章になってしまいすみません。笑
　もしご質問いただけたらお答えできるようにします。（2017/03/11）
luaの基本

rubyやpythonなどのスクリプト言語を知ってる人はわかりやすい。

大文字小文字を区別する言語。

#予約語

```
and       break     do        else      elseif
end       false     for       function  if
in        local     nil       not       or
repeat    return    then      true      until     while
```


#コメント

```
-- コメント部分

--[[
コメント部分
]]
```

#変数
##数値型

```
x = 10
x = 1.0
x = 10e-1
```

##文字型

```
s = "aaa"
s = 'aaa'
```

##論理型

```
b = true
b = false
```

##テーブル型（配列）

```
table = {}
table["str"] = "Lua"
table["no"] = 1
table["bool"] = true
for i, ver in pairs(table) do
	print(ver)
```

#演算子
##算術演算子

```
 a % b == a - math.floor(a/b)*b
```

##関係演算子
演算子 ~= は正確に等価 (==) の否定

```
==    ~=    <     >     <=    >=
```

##論理演算子

```
 and   or    not

       10 or 20            --> 10
       10 or error()       --> 10
       nil or "a"          --> "a"
       nil and 10          --> nil
       false and error()   --> false
       false and nil       --> false
       false or nil        --> nil
       10 and 20           --> 20
```




##連結演算子

```
str = "hoge" .. "hoge"
```

#制御構造
##if文
switch文はない。

```
if 式 then 
    処理1
elseif 式2 then
    処理2
else
    処理2
end
```

##for文

```
for i=0, 4, 1 do  --1は増加量
    print(i)
end
```

##while文

```
while 式 do 
    処理
end
```

##repeat文

```
repeat 
    処理 
until 式
```

##break文

```
do
    break
end
```

#関数

```
function 関数名(引数1, 引数2, ..)
    関数の処理
    return 戻り値1, 戻り値2, 戻り値3
end
ver1, ver2, ver3 = func(n)
```

##可変引数
... (コロン三つ)を指定して複数の可変にできる。

```
function 関数名(...)
  t = { ... }
end
```

##無名関数

```
変数 = function(引数)
    処理
end
```

##require

```
-- test.lua
function hoge()
  print("hoge")
end
-- main.lua
require("test")
hoge()
```

#オブジェクト

```
-- オブジェクトを作成
Dog = {
  name = "Jiro",
  age  = 3,
  showProfile = function(self)
    prof = string.format("name=%s,age=%d", self.name, self.age)
    print(prof)
  end
}
-- showProfile メソッドを呼ぶ
Dog:showProfile()
```

##継承
setmetatableの__indexにAnimalを指定して継承。

```
-- 基本となる Animal クラスを定義
Animal = {}
Animal.name = "unknown"
Animal.showProfile = function(self)
  print("*** profile")
  print("name="..self.name)
end
-- Animal を継承して Dog クラスを作る
Dog = {}
Dog.new = function (name)
  local obj = {}
  obj.name = name
  setmetatable(obj,{__index=Animal})
  return obj
end
-- インスタンスを生成する
jiro = Dog.new("jiro")
jiro:showProfile()
```

#時間を計測する
仮想マシンの場合あまりよくない結果になった。
osのcpuクロック時間から求めるためおかしくなってる可能性がある。

```
local t1 = os.clock();

処理

local e1 = os.clock() - t1;
print("elapsedTime1 : ", e1);
```

#時間を計測する（仮装マシン）
時間を引き算する。

```
local socket=require'socket'
print( socket.gettime() )
処理
print( socket.gettime() )

```


#参考

http://starcode.web.fc2.com/
http://hyperpolyglot.org/scripting
http://www.hakkaku.net/articles/20081118-286
Omniauthの連携で`Authentication failure! csrf_detected`が出た場合

Railsで以下のようなエラーがOmniauth認証で出た場合は、`config/session_store.rb`の`key`オプションを変更することで解消する。

```
2017-03-11T10:57:11.171104+00:00 app[web.1]: I, [2017-03-11T10:57:11.171046 #4]  INFO -- omniauth: (google_oauth2) Callback phase initiated.
2017-03-11T10:57:11.171483+00:00 app[web.1]: E, [2017-03-11T10:57:11.171438 #4] ERROR -- omniauth: (google_oauth2) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
```


-----

**[Created with NOOTO](http://www.nooto.xyz/public/notes/2UXzu8iZ39O32NZoWO19fB7DY2BU1oK6oxxWR0b3w04sDwJhVkzZYwjNWz85Mimae1U)**
ORM Benchmark

AndroidのORMライブラリのパフォーマンステストの結果です

 - [Github](https://github.com/HoNKoT/Database-Performance)
 - [Google Play](https://play.google.com/store/apps/details?id=jp.honkot.checkdbperformance)

お仕事で最近あった実装面でのパフォーマンス向上対策前後も載せてます。
そのうち、Realmにも対応予定ですが、とりあえず[Orma（v4.2.0）](https://github.com/gfx/Android-Orma)だけやってます。

## 結論

Ormaちゃん爆速。
ただリスト化や複数テーブルに渡るColumnの値を見て
リストや合計値などを作るときは、ひと工夫が必要。

また、その手段もきちんと用意されてる。

## 計測結果

### INSERT
Columnが15個くらいのものを10000件INSERT

|Library |Total |Average|
|:--|--:|--:|
|(PureAndroid)|139273ms|13.93ms|
|Orma|34072ms|3.41ms|

### UPDATE
10000件をUPDATE (外部キーにしてるIDをランダムに変更)

|Library |Total |Average|
|:--|--:|--:|
|(PureAndroid)|105389ms|10.54ms|
|Orma|32892ms|3.28ms|

お、これは意外だった。
ContentValuesに必要最低限しか渡していないPureAndroidが勝つとおもいきやOrmaの圧勝。

### DELETE（10000件）
10000件をひとつずつDELETE

|Library |Total |Average|
|:--|--:|--:|
|(PureAndroid)|108290ms|10.83ms|
|Orma|26672|2.67ms|

Ormaはどうやってるか知らないけど、PureAndroidはTable消して再作成してます。

### DELETE
60000件をDELETE

|Library |Total |
|:--|--:|
|(PureAndroid)|66ms|
|Orma|563ms|

Ormaはどうやってるか知らないけど、PureAndroidはTable消して再作成してます。

### 外部Table参照SUM
Eventテーブルが外部キーのProductを持っているときに
ProductのPriceが500円以上のEventがもつQuantityの合計をだした。
それぞれのDBが異なり、試験環境が異なるので、この表は横に見てください。

|Library |SIMPLE |FASTER|
|:--|--:|--:|
|(PureAndroid)|1421ms|18ms|
|Orma|712ms|41ms|

これは単純にやり方で速くなるよ、というのを見せたかった。
Query発行回数を少なくする、Dataクラスのオブジェクト化をしない、
をすると基本的に早くなります。

SIMPLE: Dataクラスのオブジェクト化してる。読みやすいがおっそい！！
FASTER： 読みづらいがパフォーマンスはすこぶる良い

## GooglePlay QRコード

アプリ動かして確認したい人はこちらから。

![qr20170311030251150.png](https://qiita-image-store.s3.amazonaws.com/0/85214/e6d86ccf-892e-005c-7ed1-e2133fd8559f.png)

## リンク

 - [Github](https://github.com/HoNKoT/Database-Performance)
 - [Google Play](https://play.google.com/store/apps/details?id=jp.honkot.checkdbperformance)
 - [Orma ORM ライブラリ](https://github.com/gfx/Android-Orma)
キミはOSC2017 Tokyo/Springに参加したフレンズなんだね！

タイトルに意味は無い！

# 目次
1. はじめに！
2. 展示！
3. セミナー！
4. LT大会！
5. まとめ！

# 1.はじめに！
2016年秋に引き続き、行って参りました明星大学。
写真撮るのに夢中で案内見てなかったから早速迷子になったよね。
（優しいOSC参加者の方に着いて行きました）
![IMG_3323.JPG](https://qiita-image-store.s3.amazonaws.com/0/96286/4d24141b-9dfb-4bc1-06b5-07c5728b2f46.jpeg)


OSCが何かというと、オープンソース関連ソフトウェアの文化祭です。
OSSごとの展示と、大学の講義みたいなセミナーから構成されてます。
興味のあるセミナーに足を運びつつ、空き時間に展示を回るスタイルを推奨。

他にもこんな点が嬉しかった！
- 暇な時間に技術書の立ち読みができる
- PCで作業できるスペースがそこら中にある、Wi-Fiも使える
- みんなTwitterへの投稿に優しい

# 2.展示！
IoTブースが趣味全開で、私みたいなハード無縁のエンジニアでも楽しめました！

こんなものがあった。
- CDドライブの開閉を利用した自走ロボ
- ラズパイ経由でiPhoneから操作するロボットアーム
- シンクライアントを使って20年前のPCで動くWindows10
- LEGOで作った動くウォシュレットの模型

![IMG_3367.PNG](https://qiita-image-store.s3.amazonaws.com/0/96286/3085c72f-864f-7c2b-7d69-d44b469076ad.png)

![FullSizeRender.jpg](https://qiita-image-store.s3.amazonaws.com/0/96286/3deb6131-2c86-e526-bda0-09976b290f45.jpeg)

![IMG_3339.JPG](https://qiita-image-store.s3.amazonaws.com/0/96286/c2ffe362-4b66-1efd-bb66-664fa46bb47e.jpeg)

![IMG_3330.JPG](https://qiita-image-store.s3.amazonaws.com/0/96286/4b9bfbe2-8624-bb08-2df2-55194a228e2b.jpeg)


あと、個人的に応援してるのが#aozorahack の皆様。青空文庫を影で支えてくださってます！
![IMG_3327.JPG](https://qiita-image-store.s3.amazonaws.com/0/96286/05961d63-6032-5bbc-0f9b-6166536a5dee.jpeg)

# 3.セミナー！
たくさんジャンルがあるから、自分の興味のあるのに行くと充実します！

私が参加したのは以下の二つ。
- HTML5 最先端Webアプリケーション開発 - DevOps as a Service for HTML5 -
- 手軽に買える機器をハックして、メーカが提供している以上の機能、性能を引き出そう！！

業務で関わるWebアプリは枯れた技術を使っているので、新しいWebアプリの構成を教えてもらえたのが嬉しかった！

# 4.LT大会！
Twitterを開きながら参加すると倍楽しめます！

LTって初めて参加したんだけど、要はQiitaとかによくある「○○を××した話」みたいなのをTED形式で話す、みたいなものと理解しました。
技術がすごい人の話は聞いててそれだけで面白かったし、キャラが濃い人はそれはそれで楽しかったし、笑わなかったLTは一つもなかった！
TLでワイワイ騒ぎながら参加できたのも良かったです。

あと、小学生の女の子が発表していたのは驚きました。

![IMG_3360.JPG](https://qiita-image-store.s3.amazonaws.com/0/96286/ffebfb7e-85d1-1a87-6234-03013306e223.jpeg)

# 5.まとめ！
せっかくエンジニアになったなら、こういう文化があるのを知らないのは勿体ないと思います。
東京での次回は秋にあるから、これまで未参加の人は参加を検討してみるのがいいんじゃないかな！