OmniAICreator/Qiita-1.07M huggingface dataset:
入門 StateTモナド

## 初めに
この記事は、Haskell初心者がStateTモナドに試行錯誤する記事です
生暖かい目で見守っていただければ幸いです。

## 方針
出発点である状態付き計算から、1つ1つ段階を踏んで考えていきたいと思います。

## 例題
Lisp構文チェッカを設定します。
構文チェッカといっても括弧の位置、向き、数だけで構文木の中身は一切触れません。
これを例に段階を踏んで進めていきます。


## #1 再帰による引き回し

'(' を +1 、 ')' を -1 と設定し、値が常に0以上かつ最後に0であれば括弧は正しい、という形で実装します。

```hs:checkParent1.hs
checkParent :: Int -> String -> Bool
checkParent s "" =
  if (s == 0)
    then True
    else False
checkParent s (x:xs) =
  if (s >= 0)
    then
      case x of
        '(' -> checkParent (s + 1) xs
        ')' -> checkParent (s - 1) xs
        _ -> checkParent s xs
    else False

checkParent 0 "(aaa (bbb ccc))"
-- => True
```

このように、Haskellにおいてただ状態を持ちたい、というだけなら一応はモナドなしでも可能です。
しかし、1つでも引数が増えると、引き回しではとても手に負えなくなってしまいます。
そこで出てくるのがStateモナドです。

## #2 Stateモナド
### その1

```hs:checkParentS.hs
type StateData = (String, Int)

checkParentS :: State StateData Bool
checkParentS = do
  (str, s) <- get
  if str == ""
    then
      if s == 0
        then return True
        else return False
    else do
      let (x:xs) = str
      case x of
        '(' -> put (xs, s+1)
        ')' -> put (xs, s-1)
        _ -> put (xs, s)
      checkParentS

runState checkParentS  ("(aaa (bbb ccc))", 0)
-- => (True,("",0))
```


引き回しver. から直訳しました。
ただ、これだけでは違いがわかりにくいので、文字数のカウントも加えてみます。

### その2  
```hs:checkParentS2.hs
type StateData2  = (String, Int, Int)

checkParentS2 :: State StateData2 Bool
checkParentS2 = do
  (str, s, count) <- get
  if str == ""
    then
      if s == 0
        then return True
        else return False
    else do
      let (x:xs) = str
      case x of
        '(' -> put (xs, s+1, count+1)
        ')' -> put (xs, s-1, count+1)
        _ -> put (xs, s, count+1)
      checkParentS2

runState checkParentS2 ("(aaa (bbb ccc))", 0, 0)
-- => (True,("",0,15))
```



引き回しと違って、引数を増やすこともなく簡単にパラメータを増やせました。
さらに複雑になったとしても、StateDataのデータ構造を変更するだけで、簡単に対応できるでしょう。

## #3 IO処理を加える
構文チェッカなので、ログの書き出し機能を加えます。

```hs:checkParentS3.hs
checkParentS3 :: State StateData2 IO Bool
checkParentS3 = do
-- 以下省略
```

> ‘State’ is applied to too many type arguments
> In the type signature for ‘checkParentS3’:
> checkParentS3 :: State StateData2 IO Bool


どうやらStateモナド内でIOモナドは扱えないようです。
ここで出てくるのがStateTモナドです。

## #4 StateTモナド

```hs:checkParentST.hs

checkParentST :: StateT StateData2 IO Bool
checkParentST = do
  (str, s, count) <- get
  if str == ""
    then
      do
        lift $ writeFile "log.txt" $ (show count) ++ " characters"
        if s == 0
          then return True
          else return False
    else do
      let (x:xs) = str
      case x of
        '(' -> put (xs, s+1, count+1)
        ')' -> put (xs, s-1, count+1)
        _ -> put (xs, s, count+1)
      checkParentST

runStateT checkParentST ("(aaa (bbb ccc))", 0, 0)
-- => (True,("",0,15))
```

'T'を加えてlift関数を用いるだけで、IO処理をStateモナド内に簡単に書けました。

## 結論
StateTモナドとは、Stateモナド内において、IOを行える、則ちモナドを扱えるようにしたものである。


## 最後に
Hakell初心者なので、ここが間違っているとか、何かあったらコメントしていただけると幸いです。

## 参考文献
- [Haskell モナド変換子 超入門](http://qiita.com/7shi/items/4408b76624067c17e933)
Unityで各種定数を定義して使う

# はじめに
こちらは[Unity Advent Calendar 2015](http://qiita.com/advent-calendar/2015/unity)の13日目の記事です。
[その2](http://qiita.com/advent-calendar/2015/unity2)もあるので合わせて見てみるといいでしょう。

# 概要
次のコードを見てください。

```csharp
Application.LoadLevel("Title");
```

この`Title`という文字列。
シーンファイル(.unity)に紐付いているのですが、いかにもtypoしそうですよね。
こちらについて定数で管理できればtypoしてしまってもコンパイル時にわかりますし、コードの補完も効きます。
また、変更があっても検出が楽にできますし、いいことずくめです！
更に今回は、手動での管理ではなく自動でコードの生成を行うことにより、ミスをできるかぎり少なくしたいと思います。

## 何番煎じだよ
[コガネブログ](http://baba-s.hatenablog.com/)さんがぶっちゃけ全て書いていますのでそちらも合わせてご参考にしていただけたらと思います。
(リンク貼って紹介することがまずければご一報ください)
* [【Unity】シーン名を定数で管理するクラスを生成する拡張機能](http://baba-s.hatenablog.com/entry/2014/02/24/000000_1)
* [【Unity】タグ名を定数で管理するクラスを生成する拡張機能](http://baba-s.hatenablog.com/entry/2014/02/25/000000)
* [【Unity】レイヤー名を定数で管理するクラスを生成する拡張機能](http://baba-s.hatenablog.com/entry/2014/02/26/000000)

## ということで
それを実現する手順を早速見ていきましょう。

# 手順
## 概要
* [シーン名等々の定数について取得する方法を調べる](#シーン名等々の定数について取得する方法を調べる)
* [定数定義をするクラスを記述するファイルを自動生成するクラスを書く](#定数定義をするクラスを記述するファイルを自動生成するクラスを書く)
* [実際のコードで使用する](#実際のコードで使用する)

## シーン名等々の定数について取得する方法を調べる
例：シーン名
* [Unityのシーン一覧を取得する](http://qiita.com/satanabe1@github/items/e913275d0122b0bc2796)

## 定数定義をするクラスを記述するファイルを自動生成するクラスを書く
各種定数の取得方法のほとんど全てが`using UnityEditor`環境が必要になると思います。
であるため、このクラスは`Editor`ディレクトリ以下に配置すると良いでしょう。(理由は割愛)

* `MenuItem`属性を付けたメソッドを定義する
    * このタイミングで、`PostProcessBuild`や`DidReloadScripts`属性を付けると  
      出力ファイルに問題があった場合にややこしいことになる印象があるので(私だけ？)、  
      最後につけるのがいいと思います。

    ```csharp
[MenuItem(my_tool/generate/scene)]
GenerateScene()
```

* 先に調べた方法で定数を取得し、定数定義をするクラスをファイルとして出力
    * ただのテキスト出力なので割愛
    * ただし、定数名として使用できない文字の扱いについて対応する必要があります。
* メニューから上記メソッドを実行し、ファイルを出力、出力内容のチェックを行う
    * コンパイルエラーになる場合は出力されたファイルの内容を全消去し、  
    自動生成クラスを修正して再度ファイルの出力をしましょう。
* `PostProcessBuild`や`DidReloadScripts`属性を付ける
    * これにより、定数の定義が変わった場合にビルドが2回走りますが  
    (古い状態の定義ファイルでのビルド -> 定義ファイル出力 -> 新しい定義ファイルでのビルド)  
    毎回そうなるというわけではない(ファイルの内容に変更がなければビルドされない)ので問題ないと思います。

## 実際のコードで使用する
割愛

# まとめ
これでUnityによくある定数が文字列(or数値)という問題に対応できます！

# 巻末付録
主要な定数系のデータの取得方法をメモしておきます。
コメントをいただければ追加します。

## シーン名
```csharp
EditorBuildSettings.scenes
```

## タグ名
```csharp
InternalEditorUtility.tags
```

## レイヤー名
```csharp
InternalEditorUtility.layers
```

## ソーティングレイヤー名
```csharp
var tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
var sortingLayer = tagManager.FindProperty("m_SortingLayers");
for (int i = 0; i < sortingLayer.arraySize; ++i)
{
    string tag = sortingLayer.GetArrayElementAtIndex(i).displayName;
    ...
}
```
Mac で始める Dvorak


Windows だと設定するのに色々と面倒な Dvorak。でも Mac なら **OS標準** で、しかも **GUI** で設定できちゃいます。ということで、Mac を使っている人は今すぐ Dvorak を使おう！ってことで設定方法を紹介したいと思います。

環境: OS X EL Capitan
キーボード: US (JISキーボードでもいけるんじゃね？)

## 準備編

まずは設定画面を出さないとどうしようもありません。

Finder → アプリケーション → システム環境設定

で「システム環境設定」を開きましょう。二段目の右から三番目の「キーボード」を選択します。「キーボード」設定画面で上部タブの「入力ソース」を選びます。これで、キーボードの入力について色々設定する準備ができました。

## 直接入力

まずは直接入力です。「入力ソース」の画面で「＋」を押します。入力ソースの一覧が出てきます。右側で「英語」を選んで左側「Dvorak」を選んで「追加」をクリックです。「Dvorak」が追加されるのを確認しましょう。

おめでとう！これで直接入力で Dvorak が使えるようになりました。不要な「U.S.」は削除しちゃってかまいません。

## 日本語入力

Dvorak は日本語のローマ字入力でこそその威力を発揮します。Windows だとレジストリいじってゴニョゴニョする必要がありますが、Mac ではそんなことは不要です。「入力ソース」で「日本語」を選択すると右側に設定が現れます。設定の所を下にスクロールしていくと「英字のレイアウト」というのがあります。デフォルトでは「U.S.」になっていると思いますがこれを「Dvorak」に変えます。

おめでとう！これで日本語入力で Dvorak が使えるようになりました。直接入力も日本語入力もこれで全部 Dvorak です。

## ATOK 2015

ATOK を使っているなんてなかなか通ですね。ATOK でも GUI から簡単に設定できちゃいます。なぜなら、Mac だからです。同じく「入力ソース」で「ATOK 2015」を選んで設定画面を出しましょう。「環境設定ツール」をクリックして「ATOK 環境設定」の画面を出しましょう。「設定項目」の「入力補助」→「キーボード配列」を選びます。右側に現れた「英字入力時のキーボード配列」を「Dvorak」に変えて「OK」をクリックします。

おめでとう！これで ATOK 2015 で Dvorak が使えるようになりました。Dvorak でも徳島生まれの優れた日本語変換で高速入力が可能になります！

## まとめ

設定箇所さえわかればどれも簡単に設定できたと思います。Mac なら、面倒なソフトのインストールもレジストリ設定も必要ありません。Mac をお使いの方は今すぐ Dvorak に変更です！Windows をお使いの方は今すぐ Mac を購入です！Linux をお使いの方はインストールするときにキーボード配列で Dvorak を選んでいるはずです！

え、ログイン画面が QWERTY のままだって？ログイン画面での変更はバグがあったりするし、アップデートで勝手に初期化されたりするし、ちょっと面倒なので、今回はパスさせてください・・・。
為什麼已經加了 UITableViewDelegate/UICollectionViewDelegate 就可以不用加上 UIScrollViewDelegate ？

這其實是很早之前（大概從一開始寫 iOS 的時候）就知道不用特別 conforming ，就可以直接實作 `UIScrollViewDelegate` 的 methods 了，例如：

``` objc
// Objective-C
@interface MyViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
```

或是

``` swift
// Swift
class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate
```

而不用寫成：

``` objc
// Objective-C
@interface MyViewController : UIViewController <UIScrollViewDelegate, UITableViewDataSource, UITableViewDelegate>
```

或是

``` swift
// Swift
class MyViewController: UIViewController, UIScrollViewDelegate, UITableViewDataSource, UITableViewDelegate
```

以前認為得非常理所當然，所以都沒有去看到底是為什麼。瞭解了之後，就來一篇說明的文章。

# 這些 protocols 有繼承 UIScrollViewDelegate

> Objective-C 和 Swift 的 protocol 可以繼承另外一個 protocol

一般的 protocols ，如 `UITableViewDataSource` ，都是直接繼承 NSObject 這個 protocol （在 Swift 的話就是繼承 NSObjectProtocol），以下是他們的宣告方式：

``` objc
// Objective-C
@protocol UITableViewDataSource<NSObject>
```

或是

``` swift
// Swift
public protocol UITableViewDataSource : NSObjectProtocol
```

而以 `UITableViewDelegate` 和 `UICollectionViewDelegate` 來說，他們有繼承 `UIScrollViewDelegate` ，以下則是他們的宣告方式：

``` objc
// Objective-C
// UITableViewDelegate
@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>
// UICollectionViewDelegate
@protocol UICollectionViewDelegate<NSObject, UIScrollViewDelegate>
```

或是

``` swift
// Swift
// UITableViewDelegate
public protocol UITableViewDelegate : UIScrollViewDelegate
// UICollectionViewDelegate
public protocol UICollectionViewDelegate : UIScrollViewDelegate
```

因此這一類的 protocols 和 `UIScrollViewDelegate` 有繼承的關係，就可以使用 `UIScrollViewDelegate` 的所有 methods 了

如果對於本篇有什麼問題和討論，歡迎在下面提出來，謝謝 :smile: 

# 參考資料

- [Protocols Inherit from Other Protocols](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithProtocols/WorkingwithProtocols.html#//apple_ref/doc/uid/TP40011210-CH11-SW9)
- [UITableViewDelegate](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/)
- [UICollectionViewDelegate](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UICollectionViewDelegate_Protocol/)
NFC まわりの規格を整理する

この記事は [慶應義塾大学SFC村井&徳田研 Advent Calendar 2015](http://www.adventar.org/calendars/1053) 12日目の記事です。

------

私は「NFC が好きです」とよく言います。
が、規格について調べてみると様々存在し、各個人ごとに NFC に関する知識(コンテキスト)が異なるため、単に「NFC」という単語で会話をしていると話が噛み合わないということが起こります。
いい機会なので自分なりに整理します。
間違っていたり不適切だったら教えてくださいm(_ _)m

# ISO/IEC 18092
NFCIP-1 とも呼び、国際規格上で「NFC」を指すものはこれです。「近距離型」と呼びます。
FeliCa と ISO/IEC 14443 (Type A) のそれぞれの「非接触無線通信技術をまとめる」ものとして定められました。

* FeliCa
ソニーが開発。日本では電子マネーのカードでおなじみ。
日本では JISX6319-4 として規格化。

* ISO/IEC 14443 (Type A)
NXP セミコンダクターズ社が開発。日本では taspo で使われています。

# ISO/IEC 21481
NFCIP-2 とも呼び、NFCIP-1 と ISO/IEC 14443 (Type B) と ISO/IEC 15693 を含みます。

* ISO/IEC 14443 (Type B)
モトローラが開発。日本では運転免許証、住基カードやパスポートなど行政なもので使われている。「近接型」と呼びます。

* ISO/IEC 15693
通信距離が70cm程度で想定されています。「近傍型」と呼びます。

----

NFC に関する国際規格では、通信規格のみが記述されています。つまり、これまでのタグとリーダ/ライタで一対になっていた利用方法にとどまらず、端末同士の通信に利用できるのではないか−−ここに目をつけたのが NFC フォーラムです。

# NFC フォーラム  
上記の各規格に基づいた通信技術の普及などを目的とした各国企業などによる団体です。

# NFC フォーラム仕様
Android 端末などで「NFC 対応」を謳うには、この NFC フォーラムの仕様に従う必要があります。
### 3つのモードに対応しなければならない
* カードエミュレーションモード
* P2Pモード
* リーダ/ライタモード

### 4つのタグが読み書きできなければならない
* Type 1 - TOPAZ
* Type 2 - MIFARE Ultralight
* Type 3 - FeliCa
* Type 4 - DESFire

----

以上 NFC まわりの規格について改めて整理しましたが、やっぱりわかりづらいですね。
1つわかったことがあります。私は「NFC が好き」というよりは「FeliCa が好き」です。
Check! IoT ができるようになるまで ～ ESP-WROOM-02 にシリアル通信で接続する

こんばんは、[cloudpack][] の @dz_ こと[大平かづみ][]です。

Prologue - はじめに
====
IoT を目指すからには、インターネットへの接続が肝です。

ですが、私が使いたい Arduino で利用できそうな通信モジュールは高価で手を出しにくかったのでした。

そこで見つけたのは `ESP-WROOM-02`。安価(1000円前後)で技適も通っている利用しやすいWiFiモジュールなんです！

さっそく[スイッチサイエンス](https://www.switch-science.com/ "スイッチサイエンス")さんで購入し、ピンをはんだ付けしました。

今回は、この `ESP-WROOM-02` にシリアル通信して動作確認をしてみます！

基本の配線
====
`ESP-WROOM-02` とシリアル通信するための構成を、ブレッドボード上で配線してみます。

いろいろなブログを参考にしつつ、このドキュメント「[ESP to Serial | Supported Hardware · ESP8266 Arduino Core](http://esp8266.github.io/Arduino/versions/2.0.0/doc/boards.html#esp-to-serial "ESP to Serial | Supported Hardware · ESP8266 Arduino Core")」を見本に配線しました。

なお、私はスイッチサイエンスさんの [ESP-WROOM-02ピッチ変換済みモジュール《フル版》](https://www.switch-science.com/catalog/2347/ "ESP-WROOM-02ピッチ変換済みモジュール《フル版》 - スイッチサイエンス") を使ったので、これのピン配置をもとに説明します。(私も試行錯誤で配線しており、これで動作しているものの、もし間違っていたらすみません…)

ブレッドボードにプチプチ挿していきましょう～

|ピン|配線|
|---|----|
|3V3|3.3V|
|EN|10KΩ抵抗を経由して 3.3V|
|IO14|未接続|
|IO12|未接続|
|IO13|未接続|
|IO15|10KΩ抵抗を経由して GND|
|IO2|10KΩ抵抗を経由して 3.3V|
|IO0|10KΩ抵抗を経由して 3.3V|
|GND|GND|
|IO16|未接続|
|TOUT|未接続|
|RST|10KΩ抵抗を経由して3.3V|
|IO5|未接続|
|TXD|(シリアル送信用)|
|RXD|(シリアル受信用)|
|IO4|未接続|

シリアル通信するための配線
----
上記の配線ができたら、前回「[Check! IoT ができるようになるまで ～ まずはシリアル通信を使えるようになる](http://qiita.com/dz_/items/277eba8cb760b81a2688 "Check! IoT ができるようになるまで ～ まずはシリアル通信を使えるようになる")」を参考に、シリアルアダプタと接続してみてください。

私の場合は、このようになりました。

![20151212_arduino_007.png](https://qiita-image-store.s3.amazonaws.com/0/3812/cdd261d0-a5b0-7837-8ef5-06032f985e36.png)
(この写真の配線は、右の配線を基盤の裏で通していたり、他の線もあるのであくまで参考程度にご覧下さい。)

ATコマンドで動作確認
====
配線ができたら、さっそくシリアル通信で動作確認をしてみましょう！

ATコマンドは、こちら「[ESP8266 （ESP-WROOM-02）を使う](http://www.mkbtm.jp/?p=618 "ESP8266 （ESP-WROOM-02）を使う - mkbtm")」を参考に入力しました。

まず、 `AT` と入力すると、 `OK` と返ってきて、シリアルの送受信ができてることが確認できます。そのほか、 `AT+` の組み合わせで `ESP-WROOM-02` と通信ができます。

`AT`: 通信確立の確認

```
AT

OK
```

`AT+GMR`: ATコマンドのバージョン、および ESP SDKのバージョン

```
AT+GMR

AT version:0.25.0.0(Jun  5 2015 16:27:16)
SDK version:1.1.1
compile time:Jun  5 2015 21:03:10

OK
```

`AT+CWMODE_CUR=1`: アクセスポイントへ接続するモードへ移行

```
AT+CWMODE_CUR=1

OK
```

`AT+CWJAP="<Wifiアクセスポイント名>,<パスワード>"`: Wifiアクセスポイントへ接続

```
AT+CWJAP="XXX,XXX"

WIFI CONNECTED
WIFI GOT IP

OK
```

`AT+CIFSR`: IPアドレスやMACアドレス

```
AT+CIFSR

+CIFSR:STAIP,"192.168.0.1"
+CIFSR:STAMAC,"xx:xx:xx:xx:xx:xx"

OK
```

![20151117_serial-arduino_002.png](https://qiita-image-store.s3.amazonaws.com/0/3812/77f1f900-b0eb-340f-d8d8-d0823f7e8c8d.png)

ということで、シリアル接続の動作確認もでき、ATコマンドでWiFiへの接続ができました！

Epilogue - おわりに
====
IoTができるようになるまで、あともう少し！？

次回は `ESP-WROOM-02` にプログラムを書き込んで、IoT プラットフォームに接続する準備を行います。どんどん進みますよー！

[cloudpack]:https://cloudpack.jp/ "cloudpack（クラウドパック） 400社を超える導入実績! EC2などAWSクラウドの導入設計、構築、運用保守サービス"
[cloudpack-blog]:http://blog.cloudpack.jp/ "cloudpack技術情報サイト"
[大平かづみ]:http://blog.cloudpack.jp/author/oohira/ "大平かづみの記事一覧"
ファジィクラスタリングについて

# ファジィクラスタリング
今回は、クラスタリングの一手法であるファジィc-平均法(Fuzzy c-means)を紹介します。

# クラスタリング
データ解析の分野で広く用いられる、データの集合を部分集合(クラスタ)に分割する手法です。
教師なし学習の一種でもあります。

## 階層的クラスタリング
* 重心法
* 群平均法
* ウォード法

などなど。
出力がデンドログラムによって表示されるのが特徴

## 非階層的クラスタリング
計算の高速なことなどから、ビジネスの場で用いられることが多い手法です。
k-meansが非常に有名ですが、他にもbayonで用いられているRepeated Bisectionが有名です。

[機械学習の過程をD3.jsで可視化する]
(http://qiita.com/dr_paradi/items/dfd4442bd4122fb955a6)

# ファジィ理論 (Fuzzy Logic)
深くは語ると長くなるので触れませんが、1990年くらいに流行した理論で、洗濯機やクーラーなどの制御に使われています(今はどうだか知りません)。
ファジィ集合論においては、をメンバーシップ値という値を用いることで、集合への帰属度を柔軟に表現することが可能です。
> たまにファジーと表記する人がいますが、間違いです。

# ファジィクラスタリング
ファジィクラスタリングにもいくつか種類がありますが、今回は最も有名であるFuzzy c-meansを紹介します。ファジィの世界ではk-meansなどの非階層クラスタリングのことをハードクラスタリングと呼んだりします。
個体のクラスタへの帰属が0か1かで判断されますが、ファジィクラスタリングでは[0,1]の範囲で記述することができます。そのため、[サッカー: 0.5, 野球: 0.4, マラソン: 0.1]のようなまさに曖昧で柔軟な表現が可能です。
また、多くのクラスタリング手法では境界線線上のデータに困ることが多い(いずれかのクラスタに属さなければいけない)のですが、ファジィクラスタリングでは複数のクラスタに所属することが可能です。
![qiita20151212.001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/17505/0b70d1be-5677-4d6e-9db4-7ec9c8b75ece.jpeg)

> また帰属度を持つことでその他のファジィ理論に応用することも可能になります。

私が所属するチームではキノコ、タケノコ論争がよく起こるのですが、Fuzzy c-meansであれば境界線上の人も安心です。(参考: [Mahout で fuzzy k-means やってみた](http://tech.albert2005.co.jp/blog/2013/12/29/fuzzy-kmeans-by-mahout/))

# Pythonでの利用
最近はJupyter環境で分析を行っていますが、Pythonで実行するライブラリが提供されています。
https://github.com/scikit-fuzzy/scikit-fuzzy

``` bash
$ pip install -U scikit-fuzzy
```
で利用可能になります。

# 応用
個体のクラスタへの複数所属を許すことでより個体を柔軟に表現することができます。

# 参考
https://github.com/scikit-fuzzy/scikit-fuzzy
[ファジィクラスタリングの有用性について 宮本 定明](https://www.jstage.jst.go.jp/article/jsoft/21/6/21_6_1008/_article/-char/ja/)
SIerのR&Dって何をやっているの？

この記事は[TIS Engineer Advent Calendar 2015](http://qiita.com/advent-calendar/2015/tis)の12日目の記事です。

---

## はじめに

私はいわゆるR&D部門に所属しているのですが、産学連携やリクルート活動で学生と話す際に、よく「大学の研究活動との違い」について質問されます。そこで、学生からよく聞かれる質問を元に、SIerのR&D部門ではどんなことをやっているのか紹介しようと思います。

※「大学の研究」については情報系の大学の研究を想定して書いています。

※この記事の内容は、あくまで私個人の意見であり、所属する組織を代表するものではありません。また、同業他社一般に当てはまることを保証するものではありません。

## Q. 大学の研究とはどう違うの？

研究とは一般的に以下のように分類されます（[wikipediaより引用](https://ja.wikipedia.org/wiki/%E7%A0%94%E7%A9%B6)）。

>研究の分類は多種多様であり、厳密に区分することはできないが、大まかな分類には以下のようなものがある。

>- 基礎研究
>    - 特別な応用や用途を考慮せず、新たな法則や定理などの「発見」を目的にして行われる研究。純粋研究とも呼ばれ、応用研究の核となる。
>- 応用研究
>    - 基礎研究の成果を応用し、特定の目標を定め、実用化の可能性を確認する研究。すでに実用化されている方法に関して、新たな応用方法を探索する研究も含む。
>- 開発研究
>    - 基礎研究および応用研究の成果を利用し、科学技術（装置、製品、システム、工程など）の創出を目指す研究。既存の科学技術の改良を目的とする研究も指す。

この中で、大学の研究で取り組むのは主に基礎研究と応用研究でしょう。それに対して、R&Dで対象となるのは応用研究から開発研究の範囲になります（下図参照）。

![対象とする研究範囲](https://qiita-image-store.s3.amazonaws.com/0/38978/a3b272ac-7415-ca9f-bf59-cce056af4c1c.png)

研究の範囲に加えて、R&Dと大学の研究では大きく違うことがあります。

#### 師事する先生がいない
大学の研究室とは違って、その分野に精通した先生がいるわけではありません。
そのため、研究対象の理論や手法は、自分たちで勉強して自分たちで決定していきます。
そもそも、社内の誰も扱ったことがない技術を研究することになるので、たとえ若手エンジニアであろうと、その技術について社内で一番詳しい人であることが求められます。

もちろん、社外の有識者からアドバイスをもらうこともあります。
産学連携では、大学で研究中のツールを試させてもらったり、要素技術の検証をお願いしたりします。また、論文を紹介してもらったり先生からアドバイスをいただいたりすることもあります。

#### 5年後のビジネスを考える
企業活動ですので、当然最終的には自社のビジネスに繋げなくてはなりません。そのため、研究の初期段階では、自社の中長期的な未来（5年後とか10年後とか）を予想して、その時に必要となるであろう技術を選択します。

研究対象についてツール化や体系化が進むと研究は後半戦です。
研究の後半では、お客様と実際に付き合いのある事業部と連携して、足りない機能をツールに追加したり、実証実験を行って効果を確認したりして、ビジネス利用に向けて動いていきます。

## Q. 研究対象はどうやって決めるの？
前述した通り、研究は最終的に自社のビジネスに繋げる必要があります。そのため、研究の方向性は自社のビジネスや技術戦略を念頭に置いて決定します。そのうえで、以下のような過程で研究対象を決めています。

まずは未来を想像して1つの大きな仮説を立てます。

- 例えば、ウェアラブルデバイスを身につけるのが当たり前になるとか

その後、その仮説に基づいて研究テーマを決めていきます。

- 例えば、デバイスのデータを収集・分析するプラットフォームとか
- 例えば、デバイスの通信量を削減する技術とか

テーマを決めたら、実際に研究対象の技術を決定します。

- 例えば、莫大な量のデータを高速に分析するツールを開発するとか
- 例えば、新しい通信プロトコルを検証するとか

もちろん、業界動向や自社の状況によって、当初想定していた仮説が変わってくることがあります。その場合、新しい仮説に対して、今の研究で足りないものを追加検証したり、別の研究テーマに乗り換えたりしていきます。

※仮説やテーマは例示であり、実際の内容とは関係ありません。

## Q. 研究成果は利用されているの？
私の知る限りでも、R&Dで開発したツールなどが利用されるようになり、事業部に管理を移管したり、開発チームがR&D部門から独立したりしている例があります。反対に、開発したものの利用されていないツールや、途中で止めてしまった研究テーマなども、もちろん存在します。

全ての研究成果が活用されることは難しいです。しかし、できる限り無駄にならないよう、以下のようなことにも力を入れています。

#### 社内外に味方を作る
ただ待っているだけでは、仮説が実現する未来が本当にくるかどうかはわかりません。そこで、本当にその未来が実現されるように、周囲を巻き込み、同じ仮説に賛同する味方を増やしていきます。

具体的には、勉強会やセミナーで講演したり、Webに記事を投稿したりしています。また、コミュニティ活動に参加して、課題を共有したり、他の会社と協力して開発や検証を行ったりしています。

#### 成果をオープンにする
前述の部分と重複しますが、社外に対して情報をオープンにすることにより、認知度が高まり、志を同じにする仲間を得られ、有益なフィードバックをもらうことができます。

また、「貢献の競争」という言葉があります。これは、技術を無償で提供してその分野に最も貢献した企業が、その分野において最も優位な立場を獲得できるというものです。最近では、Google、MicroSoft、Appleなど、次々にオープンソースのツールを公開しています。その分野におけるデファクトスタンダードを獲得することが、いかに重要視されているかが感じられます。

デファクトスタンダードを獲得するとまでいかなくとも、「この技術といえばあの会社が詳しい」というイメージを獲得するためにも、積極的に情報公開を行っています。

## まとめ

あまり具体的な内容は言えませんでしたが、SIerのR&Dについて少しは知ってもらえたでしょうか。

研究の過程で検証した成果などは、[勉強会](http://techcircle.connpass.com/)や[技術ブログ](http://tech-sketch.jp/)でオープンにしていますので、興味上がれば覗いてみていただけると幸いです。

これを読んだ学生が興味を持ってR&Dを志してくれたら良いなと思います（笑）
また、より詳しく知りたい方は、[wantedly](https://www.wantedly.com/companies/tis)のページもご覧ください！


---

TIS Engineer Advent Calendar 2015、次回は[rina0521](http://qiita.com/rina0521)さんによる記事です。
underscoreコードリーディング（some）


underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##someとは


###[underscorejs.orgのsome](http://underscorejs.org/#some)

こんな説明。
>####_.some(list, [predicate], [context]) Alias: any 
>Returns true if any of the values in the list pass the predicate truth test.
>Short-circuits and stops traversing the list if a true element is found.

```javascript
_.some([null, 0, 'yes', false]);
=> true
```

------------- 
_.anyもエイリアスが張られている

predicateのテストにすべての値がパスしなくてもtrueを返す（つまり1つでもtrueがあったらtrueを返す）
listのelementにtrueが見つかった時点でlistの中を走査するのをやめる。

つまり


```javascript
_.some( [1, 2, 3, 4, 5], function( num ){
  console.log( num );
  return num > 3 ? true : false;
});
=> 1 2 3 4
```

となる


###[underscore.some](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L250)

コード的にはこのあたり。

```javascript
  // Determine if at least one element in the object matches a truth test.
  // Aliased as `any`.
  _.some = _.any = function(obj, predicate, context) {
    predicate = cb(predicate, context);
    var keys = !isArrayLike(obj) && _.keys(obj),
        length = (keys || obj).length;
    for (var index = 0; index < length; index++) {
      var currentKey = keys ? keys[index] : index;
      if (predicate(obj[currentKey], currentKey, obj)) return true;
    }
    return false;
  };

```


contextがない場合、cb(predicate)ではそのままpredicateが返ってくる

keysにはobjがArrayならfalse,objがobjectの場合にはkeysが入り、lengthはkeysかobj.lengthが入る。

それらを元にfor文で回して、predicateでtrueがreturnされた場合にはtrueが返され、そこで終了する。

for文内で条件が一致しなかった場合にはfalseが返される。
Cloudera Managerでデプロイメントのノード名を取得する

# はじめに
[Cloudera Manager Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cm)の12日目です。
Cloudera Managerは色々できますがなんでもできるわけではなく、場合によってはOSコマンドを直接実行したかったり、しないといけなかったりということがあります。

各ノードに一つ一つログインして実行するのは面倒なので、一括して実行できると良いと思いますが、sshするにも環境の作り方によってはノード名がランダムで作られていたりして取得も面倒なことがあると思います。

今回はCloudera Managerが持っているノード情報をAPIを使って持ってくることを考えます。


# 前提
- Cloudera Manager起動ノードでの実行を想定しています。
- コマンド実行ノードから各ノードに鍵交換しておくと便利です。
必須ではありませんが各ノードにひとつひとつログイン処理していくのはつらいです。


# スクリプト
やってることは単純でノードのリストを持ってきてそれに対してfor文を実行しているだけです
必要に応じてUSERNAME/USERPASSを変更してください。変更したら~/bin/distなどに置いて実行権限を付与してください。

````
#!/bin/bash
BASE=http://localhost:7180/api/v8
USERNAME="admin"
USERPASS="admin"

nodes=$(curl -X GET -s -u "$USERNAME:$USERPASS" $BASE/hosts | grep '"hostname" :' | awk -F'"' '{print $4}' | sort)

for node in $nodes; do ssh $node 'echo -n "## "; hostname;'"$*;"'echo'; done
````

# 実行例

どういうことに使えるかという例とその実行結果を下記に示します。
awkで実行している変数の$など、bashに解釈されてしまうものもあるので注意してください。

## クラスタ削除後に、再度のインストールに備えて以前のHDFSのデータを削除する(デフォルトでNN/DNどちらも/dfs)
````
dist "rm -rf /dfs; test -d /dfs || echo '/dfs' is cleard"
````

結果

````
## n1.lab.cloudera.com
/dfs is cleard

## n2.lab.cloudera.com
/dfs is cleard

## n3.lab.cloudera.com
/dfs is cleard

## n4.lab.cloudera.com
/dfs is cleard
````

## HiveServer2の起動ノードを探す
````
dist "ps -ef | grep HiveServer2 | grep -v grep | awk '{print \$2}'"
````

結果

````
## n1.lab.cloudera.com
27157

## n2.lab.cloudera.com

## n3.lab.cloudera.com

## n4.lab.cloudera.com
````

## ZooKeeperへの接続数を確認する(2181ポートはZooKeeperのClient接続ポート)
````
dist "netstat --ip -nap | awk '{print \$5}' | grep 2181 | wc -l"
````

結果

````
## n1.lab.cloudera.com
7

## n2.lab.cloudera.com
3

## n3.lab.cloudera.com
3

## n4.lab.cloudera.com
3
````

## 各ノードのパッケージのインストール状況を確認する
````
dist "rpm -qa | grep lzo"
````

結果

````
## n1.lab.cloudera.com
lzo-2.03-3.1.el6_5.1.x86_64
lzop-1.02-0.9.rc1.el6.x86_64
lzo-devel-2.03-3.1.el6_5.1.x86_64
lzo-minilzo-2.03-3.1.el6_5.1.x86_64

## n2.lab.cloudera.com
lzo-2.03-3.1.el6_5.1.x86_64

## n3.lab.cloudera.com
lzo-2.03-3.1.el6_5.1.x86_64

## n4.lab.cloudera.com
lzo-2.03-3.1.el6_5.1.x86_64
````

# おわりに

いかがだったでしょうか。
リスト自体は環境の作り方によっては他の方法で作ったのが簡単だったりするかと思いますが、Cloudera Managerがあれば同じ方法で取得できる、というのは悪くないと思います。

ちなみに、複数クラスタを構築していて操作をクラスタに限定したい場合は[クラスタに所属しているノードのhostId](http://cloudera.github.io/cm_api/apidocs/v11/path__clusters_-clusterName-_hosts.html)を取得して全体からの絞り込みが必要だったりします。ちょっと面倒ですね。

こういうコマンドをノード全体に実行できると運用や調査で便利、というものがあれば教えてもらえると嬉しいです。
[RxSwift] 次のmapに任意のオブジェクトを渡す方法

RxSwiftにて、複数の処理を連結して、特定の結果を得たい場合に
mapを複数連結させ、次のmapに任意のオブジェクトも付与して渡したい、というケースも多いと思います。
例えば、複数の非同期処理があって、それぞれ順番に実行し、必要な情報が全部揃ったら、最後の処理を実行する。というイメージです。

このような場合は、mapを利用することで実現出来ます。

```swift
create
    { (observer: AnyObserver<Int>) in

        observer.onNext(1)
        observer.onCompleted()
        return NopDisposable.instance
    }
    .flatMap { value in

        return create { (observer: AnyObserver<Int>) in

            observer.onNext(value)
            observer.onCompleted()
            return NopDisposable.instance
            }
            .map { ($0, 2) }
    }
    .map { value, value2 in

        return (value, value2, 3)
    }
    .subscribe { event in

        switch event {
        case .Next(let value1, let value2, let value3):
            print(value1, value2, value3)
        case .Error(let error):
            print(error)
        case .Completed:
            print("completed")
        }
}
```

出力

```
1 2 3
```

mapは **Transforming Observables** と定義されており、
イベントの流れの形状を変更する事に使えます。

Swiftではタプルが使えるため、このような記述が実現出来ています。
RxSwiftのmapはかなり便利なので、使用頻度は高くなりそうですね！
ScratchからMQTT publishする


MITメディアラボが開発したプログラミング言語学習環境である[Scratch](https://scratch.mit.edu/)から、他サービスと連携できるか調べてみました。

すると、そのものずばりの記事がありました。
[スクラッチからツイートするよ - Scratch（スクラッチ）を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する（その5）](http://blog.champierre.com/1051)

@jishihaの記事でした。
たしか[scratch2romo](http://tsukurusha.com/2015/02/1117/)では、iPhone上でwebサーバを起動して、scartchから呼び出しているはずなので、「ソースコード読めばヒントあるかな」と思っていた所でした。
そんな時に、解説を見つけたので感謝です。

# Scratchから外部プログラムを呼び出す

Scratchはwebサービスの[Scratch2](https://scratch.mit.edu/)と、local PCで動かす[Scratch1.4](https://scratch.mit.edu/scratch_1.4/)があるのですが、今回はScratch1.4を使う必要があります。
Scratch1.4からlocal PC内の外部プログラムを呼び出す方法は、上記記事をご参照ください。

# MQTT publishしてみた

遠隔センサー接続実施後、下記ブロックを用意し、「Hello from Scratch」部分をMQTTでpublishさえてみました
![scratch.png](https://qiita-image-store.s3.amazonaws.com/0/4779/5d2c2ab7-e61c-696c-7c17-1c294706afea.png "scratch.png")

rubyスクリプトは下記

```mqtt.rb
require 'rubygems'
require 'mqtt'
require "socket"

host = <FQDN>
topic = <topic>
token = <token>

# localhost の TTCPを42001に接続
socket = TCPSocket.open("localhost", 42001)

# MQTT
client = MQTT::Client.connect(:host => host, :username => topic, :password => token)


loop do
  # 十分な長さのメッセージを読み取る
  message = socket.recv(100)

  # バイトで表示
  str = message.unpack("H*")[0]
  puts message.unpack("H*")[0]

  # 最初の4バイトを削除
  newStr = str[8, str.length]
  convertStr = ""

  # 123456を12 34 56形式に変換
  newStr.each_char.with_index(1) do |s,i|
    if i.even? then
      print(s + " ")
      convertStr << "#{s} "
    else
      print(s)
      convertStr << "#{s}"
    end
  end
  convertStr.chop!

  # ascii codeを文字列に変換
  ascii = convertStr.split.collect {|c| c.hex}.pack("C*")
  p ascii

  # MQTT publish
  if ascii =~ /\"(.+)\"/ then
    client.publish('message', '{"devices": ["' + topic + '"], "payload":"' + $1 + '"}')
  end
end
```


MQTT subscribe側は下記のようになります。
data.payloadにScratch側で設定した文字列を受信することができました。

```
% mosquitto_sub -h <FQDN> -p 1883 -t <topic> -u <topic> -P <token> -d
Client mosqsub/1078-*** sending CONNECT
Client mosqsub/1078-*** received CONNACK
Client mosqsub/1078-*** sending SUBSCRIBE (Mid: 1, Topic: ***, QoS: 0)
Client mosqsub/1078-*** received SUBACK
Subscribed (mid: 1): 0

Client mosqsub/14959-*** received PUBLISH (d0, q0, r0, m0, '***', ... (160 bytes))
{"topic":"message","data":{"devices":["***"],"payload":"Hello from scratch","fromUuid":"***"}}

```

本当は、このままmyThingsやIFTTTと連携して、Twitter等の他サービス連携までやりたかったのですが、うまく連携まで確認できなかったので、今日はここまで。
自作GUIライブラリawebviewでD言語くんかわいい

# D言語くんかわいい

![dkawaii.gif](https://qiita-image-store.s3.amazonaws.com/0/12248/84b4e76b-8d09-ef14-fd32-f6b47beb5608.gif)

namachanさんの[DlangUI de Dlang-man](http://qiita.com/namachan10777/items/87197400db785a6b92ce)をパクr…、いや、インスパイアされました。

自作のD言語用のGUIライブラリ[awebview](https://github.com/k3kaimu/awebview)を使って作りました。悲しいことに、未だにWindowsでしか使えません。そのうちLinuxとMacでも使えるようにします。


## コード

awebviewでは、HTMLを使ってUI部分を書きます。

````html
<!doctype html>
<html lang="jp">
<head>
    <title>Hello</title>
</head>
<body>
<img src="views/dman.png">
%[elements["b_kawaii"].html%]
</body>
</html>
````````

あとは、UIの制御部分。

````````d
import awebview.gui.application;
import awebview.gui.activity;
import awebview.gui.html;
import awebview.gui.widgets.text;
import awebview.gui.widgets.button;
import awebview.wrapper;

import carbon.functional : passTo;

import std.random;
import std.datetime;

void main()
{
    auto app = SDLApplication.instance;
    auto pref = WebPreferences.recommended;

    with(app.newFactoryOf!SDLActivity(pref)){
        id = "MainActivity";
        width = 600;
        height = 400;
        title = "aaa";

        // ページの作成とか
        app.addActivity(newInstance.passTo!((a){
            a.load(new DManPage("dmanPage"));
        }));
    }

    app.run();
}


// ページ
class DManPage : TemplateHTMLPage!(import(`dman.html`))
{
    this(string id)
    {
        super(id, null);

        // ボタンの作成
        this ~= _kawaii = new InputButton!()("b_kawaii");
        _kawaii.staticProps["value"] = "D言語くん可愛い!!!";
        _kawaii.onClick.connect!"onClickKawaii"(this);  // クリック時のイベント
    }


    void onClickKawaii()
    {
        // <p>タグの作成
        auto dmanText = new Paragraph!()(format("dmanText%d", ++_count));
        this ~= dmanText;   // このページに登録
        this.activity[$("body")].append(dmanText.html); // このページのbodyの末尾に追加

        dmanText.text = "D言語くん可愛い";     // <p>タグの内部にテキスト

        // 以下3行で, ランダムに位置を表示する
        dmanText.staticProps["style.position"] = "absolute";
        dmanText.staticProps["style.top"] = format("%dpx", uniform(0, 300));
        dmanText.staticProps["style.left"] = format("%dpx", uniform(0, 500));
    }


  private:
    InputButton!() _kawaii;
    size_t _count;
}
````````

## awebviewの使い方とか

D言語AdventCalendarの24日目の記事の方に書く予定です。卒論ツライ。
【VSTO】Word文章のヘッダーにページ数を入れる

過去にWordVBAを使ってヘッダーに日付とページ数を入れました。
[【WordVBA】Wordマクロで文章に、日付とページのヘッダーを付ける](http://qiita.com/kuzira_mood/items/71b71350690a119d5603)

しかし世間にはVSTO（Visual Studio Tools for the Microsoft Office ）というものがあるようで、そちらの方が一般的のようです。また、.docや.docm、.docx　など拡張子を気にする必要もないので素敵ですね

そこで調べて作ってみました。

###アクティブなワードの部分を指定します。

```csharp
Word.Document ADocument = (Word.Document)Globals.ThisAddIn.Application.ActiveDocument;
```

###ヘッダーの部分を指定します

```csharp
Word.Range HeaderRange =　sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
```

###このHeaderRangeに（現在ページ／全ページ数）みたいな感じにします。

```csharp
HeaderRange.InsertAfter("（");

//SetRangeを書かないと上書きされてしまいます。
HeaderRange.SetRange(HeaderRange.End + 1, HeaderRange.End + 1);

//この辺りのパラメータはWordVBAと同じです。
HeaderRange.Fields.Add(HeaderRange, Word.WdFieldType.wdFieldPage);

//Fields.Addで入れた後はヘッダーを入れなおします。
HeaderRange = sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
HeaderRange.InsertAfter("／");
HeaderRange.SetRange(HeaderRange.End + 1, HeaderRange.End + 1);

HeaderRange.Fields.Add(HeaderRange, Word.WdFieldType.wdFieldNumPages);
HeaderRange = sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;

HeaderRange.InsertAfter("）");
```

###全てまとめるとこんな感じになります。

```csharp
       public void dayPageSet() {
            DateTime date = DateTime.Now;
            string user = Environment.UserName;
            Word.Document ADocument = (Word.Document)Globals.ThisAddIn.Application.ActiveDocument;

            try {
                foreach (Word.Section sectin in ADocument.Sections) {
                    Word.Range HeaderRange = sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;

                    HeaderRange.Text = "";

                    HeaderRange.InsertAfter("（");
                    HeaderRange.SetRange(HeaderRange.End + 1, HeaderRange.End + 1);
                    HeaderRange.Fields.Add(HeaderRange, Word.WdFieldType.wdFieldPage);

                    HeaderRange = sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
                    HeaderRange.InsertAfter("／");

                    HeaderRange.SetRange(HeaderRange.End + 1, HeaderRange.End + 1);

                    HeaderRange.Fields.Add(HeaderRange, Word.WdFieldType.wdFieldNumPages);
                    HeaderRange = sectin.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;

                    HeaderRange.InsertAfter("）");
                 
                }
            }
            catch(Exception ex) {
                MessageBox.Show(ex.Message);
            }

```

もっと良い方法があるのかもしれません・・・
Rubyと向き合わない

この記事は[Sansanアドベントカレンダー](http://qiita.com/advent-calendar/2015/sansan)、ネタ枠のHaiToがお送りしています。

# Introduction
モンハンでリオレウスに蹂躙されながら考えていたりした。カレンダー登録したは良いけどネタがないなぁと。
Rubyの事を書こうとおもっても、最近fogの実装を細かく見る機会があって、fogが唐突にExcon::Errorを返してくるファッキンな部分とかと書いても、あんまり~~タメになる話っぽくておもしろくない~~上手く書ける気がしない。

大剣のストライカーは楽だなぁとか思いつつやっぱりエアリアルも捨てがたいけど、まぁブシドーいいよねとか思いつつ、
ここ二年くらいRubyばっかり触っていて、たまには他の言語を触りたくなるし、より高速な処理をしたいときは以前書いていたC++とかDlangのような感じでコンパイルをしてでも処理をしたかったりするときもある。

そんなことを常々思っていたりいなかったりした。

ふと、最近触りだした`Go`言語が偶然にもコンパイルが必要な言語で、もちろん早いし、それに加えて
弊社随一の[OSS ~~コミッター~~ オーナーの `shimat`](https://github.com/shimat/opencvsharp) さんが以前社内で `ffi` なるライブラリを紹介していたのを思い出した。

この辺で遊んでみるか。
そう決めて一落ちした。

![http://blog-imgs-21.fc2.com/m/p/o/mpomtbs/snap017_20080809144500.png](http://blog-imgs-21.fc2.com/m/p/o/mpomtbs/snap017_20080809144500.png)

# main
## ffi ?
何も考えずにWikipediaを引用してみる。

> Foreign function interface (FFI)とは、あるプログラミング言語から他のプログラミング言語で定義された関数などを利用するための機構。主に高水準言語からC/C++などの関数やメソッドを呼び出し、OS固有の機能などを利用するために使用されることが多い。
> wikipedia 

この時に「高水準言語」が今回はRubyで、C/C++は今回はGoだ。
えっ、 [C は高水準言語言語だ](http://kccn.konan-u.ac.jp/information/cs/cyber09/cy9_hcla.htm)って！？ ちょっとごめんなさい何を言っているのかわからないです＞＜；

ffi/ffi がその実装だ。
https://github.com/ffi/ffi

Wikiも充実している。
> 英語である点だけを除けば

つまりライブラリとして用意しておき、それを呼び出せばよい。
> この辺を参考にした。　http://yamaimo.hatenablog.jp/entry/2015/05/21/200000

Go をライブラリとしてBuildするのはこういう感じ。

```
$ cat sum.go
package main

import "C"

//export add
func add(a, b int) int {
	return a + b
}

func main() {}

$ go build -buildmode=c-shared -o libsum.so sum.go
```

こうすると libsum.go というライブラリが爆誕するので、これを使えば良い。

```
require 'ffi'

module Sum
  extend FFI::Library
  ffi_lib './libsum.so'
	
	# attach_function :method_name, [:args_type, :args_type], :return_type
  attach_function :add, [:int, :int], :int
end

p Sum.add(1, 2) #=> 3
```

引数に使える型（int64とかstringとか以外）を増やすこともできるんですが（Struct）、CとかC++とかで増やし方はわかるんですが、Goではわかりませんでした :cry:

# まとめ

とか思って、RubyKaigiで捕まらないWi-fiネットワーク越しにこの記事を投稿しようとしていたら、[Ruby meets Go](http://rubykaigi.org/2015/presentations/mmasaki)のセッションでこれ以上にためになる話をしてくれていたので、きっとすぐそちらの記事がでます！！！！！！！！！！！！！！ありがとうございます！！！！！！！！！！！！！！！！！
tse - Text Stream Editor in Python の紹介


## はじめに
この記事は[Shell Script Advent Calendar 2015](http://qiita.com/advent-calendar/2015/shell-script) 12日目の記事です。

ここでは、石本さん[@atsuoishimoto](https://twitter.com/atsuoishimoto)が作成された、Pythonによるテキスト整形ツール「[tse](https://pypi.python.org/pypi/tse)」を紹介しようと思います。

## 実行環境
+ Mac OSX 10.11.1
+ Python 3.5.0

## tseとは？
詳しくは今年のPyCon JP 2015で発表されたスライドを見れば、理解できるかと思います。
[tse - Pythonによるテキスト整形ユーティリティ](http://www.slideshare.net/atsuoishimoto/tse-python)

超簡単に言えば、
tseとは、
「ワンライナーに向かないと言われるPythonだけど、やっぱりテキスト処理とかPythonでやりたいよー」
という要望に応えた
「Pythonで **sed** や **awk** のような処理を実行するためのCLIツール」
です。

pipでインストールできます。

```
pip install tse
```

### tseの良いところ
+ **sys**, **re**, **os**, **os.path** は自動インポート
+ 必要なモジュールは指定すれば、実行前にインポート
+ 入出力エンコーディングの指定


あとは実際の処理を見た方がはやいと思うので、幾つか取り上げていこうと思います。
※[シェル芸勉強会の過去問](https://blog.ueda.asia/?page_id=684)を使わせて頂きました。

## シェル芸勉強会問題にチャレンジ
### 第17回ジュンク堂はシェル芸が乗っ取った勉強会
https://blog.ueda.asia/?p=6454

#### Q1

次のようなデータを

<pre>
$ cat data1
a 1
b 4
a 2
a 3
b 5
</pre>
次のように変換してみましょう。
<pre>
a 1 2 3
b 4 5
</pre>
<p>余力のある人は次のようなJSON形式にしてみましょう。</p>
<pre>
{a:[1,2,3],b:[4,5]}
</pre>

#### 解答

+ `--begin`オプションで、ディクショナリを初期化
+ `--end`オプションで、ディクショナリのkey, valueをそれぞれ出力すればOK


``` Bash
$cat data1 | tse -b 'd={"a": "", "b": ""}' -s '' 'd[L1] = d[L1] + " " + L2' -e 'for k, v in sorted(d.items()):print(k + v)'
a 1 2 3
b 4 5
```

+ json形式は、最後にディクショナリを`json.dumps()`してやればOK
+ `-module`オプションで、`json`をインポート

```Bash
$cat data1 | tse -m json -b 'd={"a": [], "b": []}' -s '' 'd[L1].append(int(L2))' -e 'print(json.dumps(sorted(d.items())))'
[["a", [1, 2, 3]], ["b", [4, 5]]]
```

### 第18回ニンニク入れますかシェル芸勉強会
https://blog.ueda.asia/?p=6877

#### Q1
次のファイルは1列目がキー、2列目が値ですが、「オトン」と「オカン」の両方の値があるキーを探してください。

<pre>
$ cat text 
001 オトン
001 オトン
001 アカン
002 オカン
003 オトン
003 ヤカン
003 オカン
004 オカン
005 オトン
005 ミカン
005 アカン
</pre>


#### 解答

+ `-s`オプションで、「オトン」または「オカン」を含むという正規表現を指定すればOK

```Bash
$uniq text | tse -s 'オトン|オカン' 'print L1' | uniq -d
003
```

### 第19回シェル芸3周年記念勉強会
https://blog.ueda.asia/?p=7146

#### Q2
二つの自然数を

<pre>
$ echo 1 4
</pre>

というようにechoで出力したあと、

<pre>
4
3
2
1
2
3
4
</pre>

というように間の数を埋めてみてください。

#### 解答

+ ちょっと冗長だが、単純に`for`文で繰り返せばOK

```Bash
$echo 1 4 | tse -s '' 'for s in range(int(L1), int(L2)+1)[::-1]: print(s)' 'for s in range(int(L1)+1, int(L2)+1): print(s)'
```

## おわりに
ざっとtseを活用してみましたが、普段慣れているPythonのsyntaxでワンライナーが書けてお手軽になりました！
怖くて避けていたワンライナーという分野に、少し馴染めることができたような気がします^^

明日の出番は[@zayarwinttun](http://qiita.com/zayarwinttun)さんです！
KPI監視bot用に、数値自動取得bot作った

# 数字大事
数値集計botとKPI監視botがいて、毎日チームチャットに重要数値を投げてくれます。
KPIと数字は大事ですからね！

ところが問題があります。
数値はどこから拾ってくればいいのか、という話です。

# 数字を拾う
社内から拾う場合は何も問題ありません。自動で数値を知らせてくれるシステムがあればよいです。
また社外サービスでもWebAPIがあって、そこを叩けば数字を返してくれるgoogle analytics のようなサービスでも叩くAPIがあれば問題ありません。
(まさか画面から目視で数字拾って打ち込んでませんよね？)

# 問題発生
ところが問題があります。
社外サービスで、かつAPIを公開しておらず
「数値が知りたい？ログインして自分で管理画面を見ればいいだろ？」
というサービスです。
よくあります。困ったものです。
さっきも言ったように私は面倒臭がりなので、画面を目視でみて、数値を拾って、エクセルに手で打ち込む、という作業が大嫌いです。
そんな時間とエネルギーがあったら企画書かプログラムを書いてます。

# ん？いま、(プログラムなら)なんでも書くっていったよね？
プログラムなら書くわけですよ。
そこで、Webブラウザを自動で動かすseleniumの出番です。

こんな感じのプログラムを書きました。
ブラウザ立ち上げて、ログインして、管理画面に行って数値拾ってそれをパースしてCSVに書き込むだけです。
人力でやるのと同じ画面遷移しかしない良心的botです。
今回のbotはDL販売サイトの、売上管理画面にとんで数字を拾っています。

<img width="553" alt="selenium.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/9648/0404367e-5760-b81a-2f7b-e1cb6603eec3.jpeg">

あとは書き込んだ結果を集計botに食べさせるだけですね。便利ですね。

コギトエラムス方式で「ローカルのPCを立ち上げるとタイマーで自動で起動して自動でとってくる」をしています。
こういうbotをAWSやHerokuにおいてアカウントBANされると怖いというのもあります。
Ruby on Rails でプログラミングを勉強している人へ


# Ruby の基本を理解すると楽になる
Rails を使わずに、Ruby だけでプログラムを作ったことがありますか？
Ruby の基本を理解すると、Rails をより短時間で、楽しく学習できます。

# 楽になるワケ

### エラーを短時間で解決できます

Rails の開発をしていると、様々な種類のエラーに悩まされます。
そのなかでは、Ruby のエラーは比較的簡単に解決できます。
かつ、Ruby のエラーは頻繁に発生します。
Ruby の基本を理解すると、これらを短時間で解決できるようになります。

### 書籍やブログの解説が理解しやすくなります

様々な場所で Rails の技術情報を読むことができますが、
それらは、Ruby を理解している人向けに書かれていることもあります。
Ruby を理解すれば、「調べたけどよくわからなかった」ということが減ります。

### 質問しやすくなります

Rubyを学習するうちに「どこがわからないのか」が判断できるようになってきます。
すると、周囲の人に不明点を質問しやすくなります。相手も回答しやすくなります。

# 基本を勉強するのがめんどくさいあなたへ

### 基本の勉強も楽しいですよ

Rails の学習に比べると、Ruby の学習は理解しやすいです。
勉強ってのは理解できると楽しいです。自信もつきます。心が前向きになります。
エンジニアには心の健康が何よりも大切なんです。

### そもそも基本ってどこからどこまでなの？

これらを理解するところからはじめるのをオススメします。

* メソッドの引数と戻り値
* クラスの定義とインスタンスの生成
* インスタンスメソッド、クラスメソッド、関数的メソッドの違い
* インスタンス変数、クラス変数、ローカル変数の違い)

この他にも学ぶと有用なことはたくさんあるのですが、あえて絞りこみました。
課題が多すぎると面食らってしまう方もいると思いますので。
エンジニアには心の健康が（ｒｙ

# おわりに

初学者の方が、確実な知識を、短時間で、楽しく身につけるきっかけになれば幸いです。
地方エンジニアのための、オススメアプリ&サービスまとめ【思考整理/情報収集】

#背景
地方のエンジニアでも自発的に行動している人は多いです！
さらにアプリやサービスを活用して、情報を入手・取捨選択して行動しましょう！


#対象読者
・地方でエンジニアを志している学生
・地方で頑張ってるエンジニア

#思考整理

## [iThoughts](http://toketaware.com/ithoughts-osx/)
【Mac/iOS】使用頻度★★★
ここ最近1番満足度が高いアプリです。
アイデアや考えがデータとして保存されるため、例えばpdfに書き出して友人に送信したり、そのままdropbox上にバックアップを取ったりできます。
さらに、アイデア・意見ごとに写真の挿入や色を変えれるので、長期記憶にも役立ちます。
ちなみにiOS版は、画面が小さくて見直す気がしないのでオススメしません。


## [DayOne](http://www.lifehacker.jp/2015/03/150314day_one_memo.html)
【Mac/iOS】使用頻度★★☆
メモりたいなっ...！と思った時に、パッと開いてメモを取れるアプリです。
このアプリの良い所は、日ごとにメモを保存するので、後で時系列に見直すことが出来るところです。
見返して深掘りしたいなと思ったところは、そこからiThoughtsを使います。

#情報収集

## [Twitter](https://twitter.com/?lang=ja)
【Mac/iOS/Web】使用頻度★✕500
最強の情報収集ツールです。
各分野の最先端の知識・技術を持っている人の考えを知ることができます。
分野ごとにリスト分けして見ると効率が良いです。

## [Gitter](https://gitter.im/)
【Mac/iOS】使用頻度★★☆
フレームワークごとにグループが作られており、その中で自由に意見交換ができるアプリです。
主に海外のエンジニアが盛んに意見を交換しています。
これを見ると、例えばvoltってあるけどこれなんだ？と思って、調べてみるとフロントもサーバーもrubyで書くフレームワークであることが分かりました。
これからのフレームワークを作っている人が多く意見を交わしているので、
フレームワークに対する熱い考えを持っている人は、発言してみると良いでしょう。

## [StackShare](http://stackshare.io/)
【Web】使用頻度★☆☆
この開発技術は、このような会社で使われていますよというのがひと目で分かります。
例えば、[RailsはTwitterやKickStarterに使われている](http://stackshare.io/frameworks)などが分かり、
その中でもそれをどんな理由で使っているのかも分かるので面白いです。
サービスを作る上で、使用する技術に悩んでいる人は、参考になると思います。



## 最後に
随時追記していきます。
完全版は[コチラ]()
Three.jsでテクスチャペイントをしよう

<h2>Three.jsでテクスチャペイントをしよう！</h2>
テクスチャペイントを実装できれば何かのスペシャルサイトを作ったときに
手書きでイラストを描いて投稿できたり、メッセージを投稿できたり、オリジナルデザインの車を作れたり・・・いろいろな可能性が膨らみます。


<h3>■Version1 簡易版 UVテクスチャーペイント</h3>
![terrain.jpg](https://qiita-image-store.s3.amazonaws.com/0/59095/d32198d5-2764-8e1b-7334-528c51ec6974.jpeg)
<!-- http://skizi.jp/html5/webgl/three/terrain/ -->
（上記のURLはこの簡易版の実装方法でテクスチャペイントを実装し、地形生成を行ったデモです。色が明るいほど地面が盛り上がります。）

これはもう単純なものです。
①canvasをテクスチャとして反映したマテリアルを用意
②一時的にuvをそのままピクセルシェーダーに表示させuv値を読み取る
③読み取ったuv値をcanvas内の座標に変換してペイントする
④ペイントされたcanvasをマテリアルに再度割り当てる。


<h4>▼！簡易版の問題点</h4>
uvの位置にペイントするという性質上、以下の画像のようにuvの島をまたぐ場合ペイントが途切れてしまう。
![pic1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59095/743e7d48-1f92-ab8c-4e1e-99baec0d8e6c.jpeg)





<h3>■Version2 改良版　プロジェクションテクスチャーペイント</h3>
![pic2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59095/0b915ec3-3089-98b0-ccd5-6d05a7e2d224.jpeg)


<!-- http://skizi.jp/html5/webgl/three/paint0/ -->
（左ドラッグでペイント、Alt+左ドラッグでカメラ回転。真ん中に柱状のものがあるのでそこにペイントします）

これは東大・五十嵐健夫教授の製作したchameleonを参考に実装したものです。
（http://www-ui.is.s.u-tokyo.ac.jp/~takeo/chameleon/chameleon-j.htm ）

ただこちらの方法をそのまま行うと、
たとえば、以下の画像のように同一メッシュ内でカメラの方向を向いていて　なおかつ重なった部分があるとおかしな結果になってしまいます。
![pic3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59095/34d63979-5c24-97c9-1272-eab4572a9c24.jpeg)

おかしな結果というのは本来他のfaceにさえぎられていてペイントされるはずのない部分にペイントされてしまうことです。

以下の方法はそういったおかしな結果にならないように
頂点カラーなどを使用して実装したものです。

▽Step1
①カメラとメッシュの内積を計算してカメラ側を向いているfaceを取得し、それらのfaceをペイント対象とする
②　①で取得したfaceにペイントしたいが　カメラ側を向いているもののface同士が重なって本来はカメラからは見えないfaceもある。隠れている部分にはペイントしたくない。それを回避するための仕込みをする。faceそれぞれに違う色の頂点カラーを持たせる。
③頂点カラーを表示した状態で画面をキャプチャしてそれを一時的に保存する。この画像を画像Aとする。

▽Step2
①画面をマウスムーブ・タッチムーブした座標を取得。その座標をそのままcanvasにペイントする座標として使用する。canvasにペイントする。
②Step1の①で取得したfaceのuv座標を、カメラから見たfaceの頂点座標と同じ位置に調整する。
![pic4.gif](https://qiita-image-store.s3.amazonaws.com/0/59095/241da036-5c04-6825-36e4-8a771afe4a8c.gif)


③　②のfaceの頂点の座標それぞれをuvの座標に移動させる。
![paint0.png](https://qiita-image-store.s3.amazonaws.com/0/59095/41fe940e-bc4d-866d-6889-118a028eb6c6.png)


④　③の状態で画面キャプチャーして保存する。
⑤　③で移動させたfaceの状態で頂点カラーを表示させ画面キャプチャする。この画像を画像Bとする。
⑥Step1の③で保存した画像Aと⑤で保存した画像Bを比べて　色が一致しているピクセルはカメラ側を向いていてなおかつカメラから隠れていることなく見えているピクセルということになる。
⑦　⑥のピクセルのみに①でペイントしたものを有効化する。

<h4>▼！プロジェクションテクスチャーペイントの問題点</h4>
ポリゴン数が増えてくると精度が落ちてくる
精度を上げるには画像の解像度を上げる必要がある。


<h3>■まとめ</h3>
どちらのやり方も一長一短なのですが、
正直まだしっかりとしたテクスチャペイントを実装できていないなと思う次第です・・・。
デプスバッファを使えばもっとマトモな実装になるのでは・・・？
と思ったりもしましたができませんでした (^q^)
なので、なにか良い正統派な実装方法がないか常に探している状態です。
どなたかご教授お願いします
<!-- 
![pic5.jpg](https://qiita-image-store.s3.amazonaws.com/0/59095/899064f0-2c7b-eca4-d30f-c006a7e3cd7d.jpeg)
-->
全天球で擬似ポジトラ

#全天球で擬似ポジトラ

##この記事は[RICOH THETA Advent Calendar 2015](http://qiita.com/advent-calendar/2015/theta)の12日目です。
会社の引越し作業後の最強に寝たい状況で書いてます。

Thetaの写真、OculusDK2で見てますか？
そんなニッチ層向けの記事です。

#Thetaの写真、ポジトラHMDで見ると酔うんだけど？
Thetaの写真をOculusRiftDK2で見ると、まぁ見やすいんだけどポジトラには対応してません。
いつものように顔を前後に動かすと
『あれ？景色が顔にくっついてくるんだけど？？？』
という状態になります。それもそのはず、Thetaは写場ですので、そもそもポジトラには対応していません。
これが、意外と酔います。

#じゃあ、Theta写真をでかくすればいいんだろ？
残念ながら、そのまま大きくしても、Theta写真を貼り付けてる円も大きく距離も離れるため
意味がなくなります。試しに円の内側にTheta写真を貼り付けてスケール変えてみてください。
見え方は何も変わりません。

#じゃあ、どうすればいい。Fovを変えましょう。
Fov（Field of view）を変えてあげましょう。
oculusランタイム0.44の頃は、fovが自由に変えられました。
そこからしばらくはfovが固定される不遇の時代でしたがunity5.3から再び変更できるようになっています。

#なんでFovを変えるの？
全天球視聴の場合はFovがズームの役割を担います。
それを利用して、HMDのポジトラから
・近づいたらちょっとズームアップ
・遠ざかったらちょっとズームダウン
してあたかもその写場に対して移動できているような錯覚を与えます。
このアイデアはVR師匠の桜花さんとoculusアプリ開発者のゆーじさんから教えて頂きました。

#Q.効果は？
A.抜群。
全天球写真/動画を2年以上作り続けていますが、この仕組みを取り入れてから酔が格段に減りました。
ただし、この効果が自然すぎて”気付かれない”事が多いです。正直”デフォルト機能”として入れられることを期待しています。

#計算式はよ
```lang:fovcontroller.cs
camera_Vec = cam.transform.forward;
pos_Vec = cam.transform.position;
dot = - Vector3.Dot (camera_Vec, pos_Vec);//前後方向成分のみ抜き出し
cam.fieldOfView = fov + (dot * level);//levelで変動値調整
```
縄文時代からの単語丸暗記途方なさすぎ…　日本史、じゃなくて、プログラミングの海図(きほんのき)

#便利なものは使っていこう#


こんにちは。

今回も引き続き**"Webプログラミングとは"**の基本部分と"知っておこう"の部分をおさらいしていこうと思います。

タイトルはもちろん、プログラミングのことに関してなのですが、語弊が生まれないように説明しておくと、**丸暗記**ではなく、**仕組みの理解**と**使い方**から入った方が効率的ですよ。ってことです。

もちろん、それぞれの単語の意味や背景も大事ですが、**アウトプット前提でインプットした方が"質"も"定着"も段違い**なので、おさらいしていきます。


##ライブラリ##

とは、簡単に言うと、**"誰かが作った関数集"**です。

実用的なプログラムを作る時に1から全てコーディングしようと思うと、大変な労力ですし、見合わず正確性も欠いていきます。

そこで、あらかじめ用意されている**関数集**をインストールして、組み込んで使用し、作っていくことが当たり前になっています。

これによって労力を削減しながら、自分の作りたい部分に集中でき、質も高まります。

＊注　なかにはライセンスによって、ソースを公開しなければならないものや、商用だと有料のものもあります。


##フレームワークとAPI##

ライブラリのうち、前提とするような基本的な機能を提供するものを
**フレームワーク**といい、

OSや、他のソフトウェアが提供している機能を呼び出すものを、
**API**(Application Programming Interface )といいます。

どちらも大変よく使います。


###インストール方法###

大きく3つあります。

1.単純にコピーする
・・・インストールしなくても、自分の作ったプログラムと同じ場所にコピーするだけで動くものも数多くあります。

2.言語の機能を使ってインストールする
・・・追加のライブラリをインターネットからインストールする**コマンド**を備えるものがあります。
例) PHP　なら　pear(ペア)
　　Perl なら　cpan(シーパン)
　　Ruby なら　gem(ジェム)

3.独自にインストールする
・・・ソースコードをダウンロードしてビルドしてインストールする方法です。
ただし、代表的なものはOSのパッケージとして提供されているので、そういったものは、OSコマンドを使うだけでインストールできます。


##出力のテンプレート化##

Webプログラムでは、デザインも重要です。
しかし凝りすぎると、タグが複雑になり、プログラムが読みにくくなってしまうため、その際は**テンプレートエンジン**(テンプレートを処理できるライブラリ)を使います。

テンプレートには**値が入る場所**を特別なタグで埋め込んでおき、プログラムからは、そこに値を差し込んで出力します。

この方法のメリットとしては、

・出力が見易い

・出力の変更も簡単

・デザイナとプログラマとの共同作業がしやすい

などが挙げられ、好まれています。


##CSSとJavaScriptで装飾する##

CSSを使って装飾したり、JavaScriptを使って動きをつけたりすると、
見やすく使い易いUIをつくれます。
この二つを組み合わせて使ったりするのですが、厄介な部分もあります。
それは、**Webブラウザやバージョンによって挙動が異なる**という点です。

全ブラウザに対応しようとするなら、動作確認をとらなければいけなく、現実的ではありません。

そこで、

##jQuery##

JavaScriptのフレームワークなのですが、jQueryは**ブラウザごとの差異を吸収する**ことができるため、ブラウザの違いをプログラマが意識する必要がなくなります。

その中でも、**jQuery UI** (ユーザーインターフェイスのライブラリ)などを使うと、スピンロールや、カレンダー表示などが容易にできます。


##Cookieとセッション、データベース##

Webプログラムは複数のページから構成されることがほとんどです。
その場合、**ベージ間でのデータの共有**が必要になります。
そこで使われるのが、**Cookie**と**セッション**です。

Cookie
・・・**クライアント側**に保存される

例）　ショッピンングサイトの「カートに入れる」など

セッション
・・・**サーバ側**に保存される

例）　アプリゲーム内で所持しているアイテムやお金など


###データベースとは###

データを保存したり、取り出したりする機能を提供するソフトウェアのこと。
汎用的なソフトウェアなので、**さまざまなプログラミング言語からデータを呼び出せるように作られています。**

プログラムとデータベースとは、データベースライブラリを使ってやりとりをします。
それ自体が独立していて、言語や各種ツールに依存しないので、例えば、
PHPから書き込んだデータを、Perlなどの他の言語で読み書きできます。

いくつか種類があるのですが、現在もっとも多く使われているデータベースは、
**リレーショナルデータベース管理システム(RDBMS : Relational Datebese Management System)**と呼ばれるもので、単純にデータベースといったときは、ほとんどこれを指します。

RDBMSではデータを**表**として管理するのですが、
この表のことを、**テーブル**、中身の項目のことを**カラム**、データのことを**レコード**と呼びます。


###操作方法###

は、**SQL**という構文でやりとりします。
覚えておきたい構文としては、

1.CREATE TABLE / DROP TABLE
・・・テーブルの作成や削除をします

2.INSERT
・・・テーブルにレコードを追加します

3.SELECT
・・・テーブルからレコードを取り出します

4.UPDATE
・・・レコードを新しいデータで更新します

5.DELETE
・・・レコードを削除します


***

といったところになります。

細かいところはその都度調べながらやるものなので、**なんとなーくでも理解**できればいいと思います。

それでは今回はこのあたりで。
Safari 9.0 の JS で「同じ関数を繰り返し実行しただけで返り値が変わる」という強烈なバグが発見されてる

Webkit の Bugzilla で強烈なバグが報告されていると、同僚に教えて頂いた。
あまり話題になっていないものの、単純ゆえに強烈なバグだと思ったので Qiita にも公開しておく。

https://bugs.webkit.org/show_bug.cgi?id=151354 にそのバグ報告が上がっている。

最初に [Google+ でやりとり](https://plus.google.com/102150456883548896445/posts/VXN996nhVoY) があった模様。
URL のクエリ文字列から値を取り出す関数が正常に動作していないことから発覚したようだ。

その後は、簡単なテストケースに落とし込まれ jsfiddle というサイトにテストケースが公開されている。
Safari でこのページを開くと、実際に JavaScript を実行して確認できるようになっている。

http://jsfiddle.net/60ygm4uk/15/

# 続報 (2015.12.14)

この記事を上げてすぐに Bugzilla の方で進展があった。

[Yusuke SUZUKI](https://constellation.github.io/) さんが原因を特定し、パッチを投稿なさっている。 (本当にありがとうございます。)

今のところのチェンジセットは http://trac.webkit.org/changeset/194021 で確認することができる。
どうしてこのような挙動になるのかも詳細に記載されている。

2015 年 12 月 14 日現在、 [Webkit Nightly](http://nightly.webkit.org/) ではこの時の修正も取り込まれている [r194029](http://nightly.webkit.org/builds/trunk/mac/1) のビルドが公開されている。

私もダウンロードして試してみたところ、 r194029 では再現しなかった。めでたい。
Safari でも未来のアップデートのいずれかのタイミングで再現しなくなるのだろう。

# 実際の動作

```js:オブジェクトのキー"1"に対応する値を取り出す超シンプルな関数
function getOne(a) { return a['1']; }
```

この関数に対して

```js
getOne({1: true})
```

普通に考えれば true を返却する。
しかし、実際には ```getOne({2: true})``` のような (これは undefined を返す) 無関係の引数で 36 回以上呼び出すと、
なぜか ```getOne({1: true})``` までも undefined を返却するように、挙動が変わってしまう。

↓ は私の Mac OS X 上の Safari で確認したもの。なるほど確かに 36 回 ```getOne({2: true})``` を実行した以降、 undefined が返るようになってしまっている。

![実際の動作.png](https://qiita-image-store.s3.amazonaws.com/0/25886/9136eda5-623a-5170-874f-6f3906debd5a.png)

# 影響範囲

これだけ単純なバグなので、 Safari 上で動作する様々な JavaScript で発生する虞がある。
上記の Google+ でのやりとりによれば Google Tag Manager 上で、この問題により不具合が発生していたようだ。
現在はワークアラウンドで回避してあるとのこと。

つい先日公開されたアップデートである Safari Version 9.0.2 でも未だ修正されていないようだ。
該当バージョンについては、現行の最新バージョン El Capitan だけが挙げられているが、私の試した限りでは少なくとも Yosemite の最新バージョンでも同様に発生する。

なお、私の手持ちの iPhone 6S にインストールされている Mobile Safari Version/9.0 では今のところ再現していない。
(しかし iPhone 5S で再現したとの報告を Twitter 上で見つけている。)

Twitter 上やはてなブックマークなどで「Google Chrome/Chromium にも影響があるのでは」という意見もあったが、今回のバグは Webkit に付属の JavaScriptCore で起きている問題であり、 V8 を搭載している Chromium 系では発生しない（と思われる）。
そして Chromium は少し前に Blink に分岐してしまっているので、今回のバグは凡そ関係ないと思われる。

## 2016-02-07 追記

OS X 搭載 Safari の最新版である Version 9.0.3 (11601.4.4) でも、未だ修正されていない。

## 2017-04-09 追記

2016 年のどこかのタイミングで修正されたようだ。
現在のバージョンでは再現しない。
teraterm > macro > 10秒おきにファイルを送信する

```txt:動作確認
Tera Term v4.88
```

10秒おきにファイル送信をするマクロ

```sendfile.ttl
while 1
sendfile 'C:\0WORK\151212linemonitor\151212crlf\2txCRLFrxCRLF.txt' 0
pause 10
endwhile
```

<font color=red>sendfileの行最後の 0 を忘れないこと</font>

参考
http://teraterm.feasible-lab.com/6-2-tera-term-while-endwhile/
http://www.macrosh.com/tera-termmakuronitsuite/komando-yi-lan