OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Pi 3 で固定IPアドレスを設定する（Wifi）

# RaspberryPi3にてWifiでネットワークに接続しているときの固定IPアドレスの設定方法

[RaspberryPi IPアドレス 設定]とかで検索してそのままコピペ的にやったけど上手く行かったので、一応メモ。

まずは、/etc/dhcpcd.confを開きます

`$ sudo nano /etc/dhcpcd.conf`

nanoのかわりにviなどでもいいですが、直感的に編集できるので。。

それで、ファイルの一番下に以下を追記

```/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.1.255/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
```

ip_address　設定したいIPアドレス
routers ルータのIPアドレス
domain_name_server こちらはDNSアドレス（8.8.8.8）などでもOKだと思う。


再起動
`$ sudo reboot`

以上です。

ifconfig などで確認いただければと思います。

## 今回の掲載した経緯
一般的にラズベリーパイのIPアドレスの設定方法を検索すると有線LANでの設定方法が出てくるのですが
RaspberryPi3だとWifiで繋げることが多いと思うので、そのままやると上手く行きません。
まあ、一番最初の行の interface のところを変更するだけなんですけどね。。
ちゃんと読めばわかるんですが、コピペでそのままやろうとして失敗してしまいました。。
コピペでやるとダメな見本ですね。
c++ builder / TMemo / TRichEdit > WantReturnsプロパティ > TMemo:改行禁止 / TRichEdit:変わらず

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

関連 http://qiita.com/7of9/items/9702f592d44d10ea1c68

TMemoとTRichEditについて調べる中、WantReturnsプロパティというのを見つけた。

[メモとリッチ テキスト編集コントロール](http://docwiki.embarcadero.com/RADStudio/Seattle/ja/%E3%83%A1%E3%83%A2%E3%81%A8%E3%83%AA%E3%83%83%E3%83%81_%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%B7%A8%E9%9B%86%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB)
> WantReturns ではユーザーがテキストにハード リターンを挿入できるかどうかを判別します。

実際にWantReturns をfalseにして動作を見たところ、以下の結果となった。

- TMemo: 改行が入力されなくなった
- TRichEdit: 改行は入力できるまま

関連
http://docwiki.embarcadero.com/Libraries/Seattle/ja/Vcl.StdCtrls.TCustomMemo.WantReturns
FontAwesome をサーバーにUPして使う

## v 4.7.0

* https://github.com/FortAwesome/Font-Awesome/releases/tag/v4.7.0

```sh:以下のみ必要
./font-awesome/4.7.0/css/font-awesome.min.css
./font-awesome/4.7.0/fonts/FontAwesome.otf
./font-awesome/4.7.0/fonts/fontawesome-webfont.eot
./font-awesome/4.7.0/fonts/fontawesome-webfont.svg
./font-awesome/4.7.0/fonts/fontawesome-webfont.ttf
./font-awesome/4.7.0/fonts/fontawesome-webfont.woff
./font-awesome/4.7.0/fonts/fontawesome-webfont.woff2
```

## htmlで使う例

* [指定できるアイコン一覧](https://fontawesome.com/cheatsheet?from=io)

```html
<head>
<link rel="stylesheet" type="text/css" href="./font-awesome/4.7.0/css/font-awesome.css">
</head>

<i class="fa fa-deskotp"></i>
```

## phpで使う例

```php
<?php
class FontAwesome {
        // 古すぎるブラウザでは有効にならないように
        private function is_allow() {
                if(!strpos($_SERVER["HTTP_USER_AGENT"], "Gecko")) {
                        return false;
                }
                return true;
        }
        function css() {
                if($this->is_allow()) {
                        return '<link rel="stylesheet" type="text/css" href="./css/font-awesome.css">';
                }
        }
        function i($icon_name) {
                if($this->is_allow()) {
                        return sprintf('<i class="fa fa-%s"></i>', $icon_name);
                }
        }
        function p($icon_name) {
                if($this->is_allow()) {
                        print $this->i($icon_name);
                }
        }
}

$icon = new FontAwesome();
print $icon->css();

print $icon->("desktop");
// もしくは
$icon->p("desktop");
```

----

## トラブル

> header('X-UA-Compatible: IE=EmulateIE8');

* IE11をIE8互換モードで動かす場合、FontAwesomeは使えない

> PHP Parse error:  syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}'

* php4では`private`を書くと上記エラーになる。


## ttf -> png化して使う

* 自分でpng化ツールを使う場合 [jasonhinkle/font-awesome-to-png](https://github.com/jasonhinkle/font-awesome-to-png)
    * [fontawesome-webfont.ttf](https://github.com/FortAwesome/Font-Awesome/blob/master/fonts/fontawesome-webfont.ttf)をダウンロード

```sh
pip install pillow
pip install Pillow-PIL
```

```sh
python font-awesome-to-png.py --color white ALL
python font-awesome-to-png.py --size 9 --color \#4a4a4a pencil
```

* `--size `指定しなければ`16`が初期値。

```sh:
git clone https://github.com/FortAwesome/Font-Awesome
git clone https://github.com/jasonhinkle/font-awesome-to-png

cd font-awesome-to-png
cp -a ../Font-Awesome/webfonts/*ttf .

for ttf in *.ttf
do
  python font-awesome-to-png.py --size 12 --color white ALL --font $ttf
done
```
jQuery animation が Promise を使って究極的にひゃっほいできて嬉しい


## 概要

es6 の `async/await` を使えば 最近 Promise を返すようになった jQuery に animation と何かと都合がよくかける

周知の事実かもしれないが嬉しいので書く

## 今まで

```
 $('.promise').animate({'width': '200px'}, 1000, function(){
 	$('.promise').animate({'width': '100px'}, 1000).promise();
 });
```

とかネストしたり then とったり。



## これから

```
function wide() {
  return $('.promise').animate({'width': '200px'}, 1000).promise();
}

function short() {
  return $('.promise').animate({'width': '100px'}, 1000).promise();
}

async function animate() {
  for(var i=0; i<10; i++) {
    await wide();
    await short();
  }
  console.log('all done')
}
animate();
```

ウヒョヒョー

ネストもしないし最高。しかも 3.0系からは requestAnimation ベース。
なんて楽な時代になったんだろうか。。。

## CodePen すぐ見るよう
http://codepen.io/anon/pen/mENrrm
プロセッシングで音を読み取り丸いオブジェクトのサイズを変更する


minimのライブラリーをインストールして曲の強弱に合わせ、丸のオブジェクトの大きさを変更させます。

また、プロセシングでライブラリーをインストールするのはメニューから「スケッチ」＞「ライブラリーをインポート」＞「ライブラリーを追加」を選択します。
追加画面から、minimを検索しインストールができます。

ちなみに、minim自体のライブラリーは次のサイトからダウンロードできます。
>minimライブラリーダウンロード
>http://code.compartmental.net/minim/

サンプルのMP3は下記のサイトからお借りしました。
>サウンドの基本（minimライブラリの使用）
>http://r-dimension.xsrv.jp/classes_j/minim/

音源をダウンロードして、processingのファイルと同じ階層に設置します。
そして、下記がソースになります。

````processing 3
import ddf.minim.*;  //minimのインポート

Minim minim;
AudioPlayer Player;

void setup(){
  size(400, 400);  //画面のサイズ
  
  //minimのセッティング
  minim = new Minim(this);
  Player = minim.loadFile("groove.mp3");
  Player.play();
  
  background(255);
}

void draw(){
	//音源の左からの音を取り込み。
  float num = Player.left.get(1)*1000;
background(255);
  noFill();
  
  //左の音を丸の大きさにセットし、ランダムに丸オブジェクトを生成します。
  for(int i = 0; i< width/2; i++){
  stroke(150, 150, 150);
  ellipse(random(width), random(width), num, num);
  }
}

````
音の取り込みが非常に楽だらか、取り込む音を工夫すると他のこともできるかもしれない。
ど文系の方面から機械学習を習っている

やったことないことやりたくなって機械学習を選んだんですが、迫り来る数式や見たことのない記号、しかもそれらが英語で解説されるというワンダーランドにいます。ど文系なりに「機械学習って何」を少しずつまとめられそうなのでちょっとメモがてら書いてみます。

## 書かないこと

理論と実践

## まず、パターンありき

ツバメが低空飛行すると雨が降るというのは有名な観天望気ですが、要は機械学習ってこういうことだよね、というのが一つ目の理解です。

おわり

うそ

で、人間の目線でやるとデータの量とかも荒いし客観性もないから、もうちょとつきつめようよ、もっというと「こういう条件でこういう結果を予測できる」まで持ってこようよ、という話ですね。

## 次にデータ

で、データです。ツバメが高いところを飛んだって雨が降ることもあるし、低いところをどんだけど晴れることもあるでしょう。でも、ツバメが飛んだ高さと降水量のデータをたくさん集めるのです。で、プロットすると、なんだか相関がありそうに見えます。

「ツバメの飛行高度と降水量が反比例している」

ように見えるかもしれません。

つまり、降水量＝何か係数＊ツバメの飛行高度＋何か基準値

みたいな式が期待できます。で、この何か係数、とか何か基準値を自動的に探しましょう、というのが機械学習です。

## どうやって探す？

探し方は、「過去のデータをひたすら分析して、係数や基準値を変えていって、どうやらこれが一番データを表しているぞ！っていう値のセットが出るまで頑張る」

という感じですね。なんか泥臭そうですが、ここにいろんなアルゴリズムやベストプラクティスが絡んできますし、機械学習を学ぶ上での重要なポイントだと思っています。

## 式ができたら

例えば、「ツバメが高度80cmを飛んだ時の降水確率」が予想できます。だって、何か係数と何か基準値のそれっぽいのが出てくるから。

## 誤解していたこと

機械学習で過去の市場データを分析すると、明日のストップ高銘柄を予想できる！と思っていましたが、そんなんできたら、市場がクソゲーになるし、今では「こういう条件を式に当てはめたらどういう株価が予想できるか」ということだと理解しています。この辺に文系の真骨頂がありますね。

## 気をつける点

まず、学習用のデータの質が大事ですね。一見するとツバメの飛行高度と降水量に何か関係があるように見えるかもしれませんが、たまたまそう見えただけで実は無関係だったら予想した値もあてになりません。そんなことより季節とか気圧配置とか気温湿度とか、そういったものを集めた方がいいような気がします。でもツバメ・・・きになるなあ・・・

## 機械学習の弱点

これまでにないケースに弱い。AlphaGoでも人間がこれまでにない手を打ったら総崩れしたそうですし、確かに、これまでにないケースに対する予想はうまくできなそうです。多分、火の鳥未来編のマザーコンピュータも機械学習で動いているでしょうから、いつか人類は機械学習で発達したコンピュータに支配され、滅ぼされるんです。怖いですね。せめてマザーコンピュータに核兵器は搭載しないようにしておきたいところです。
Link > IBL > Using Image Based Lighting (IBL)

関連 http://qiita.com/7of9/items/c04b08c5e719dc6f8593

Weta DigitalのSpherical Harmonicsの文章で出てきたIBLというもの。

説明は以下が分かりやすかった。
http://geeks.ms/waveengineteam/2016/03/11/using-image-based-lighting-ibl/
Kawaの型推論

[Kawa](https://www.gnu.org/software/kawa/index.html)はJavaで実装したSchemeです。
Schemeでは部分文字列を取って大文字に変換する処理は以下のように書けます。

```scm
> (string-upcase (substring "abcdefg" 1 4))
BCD
```

Kawaは文字列として`java.lang.String`をそのまま使用しているのでJavaのメソッドを使って以下のように書くこともできます。

```scm
> (invoke (invoke "abcdefg" 'substring 1 4) 'toUpperCase)
BCD
```

これはJavaでこう書いたのと同じです。

```java
"abcdefg".substring(1, 4).toUpperCase()
```

一見Javaのメソッド呼び出しによく似ていますが、後ろにメソッド呼び出しを追加するたびに先頭に`(invoke `を追加しないといけないのでストレスが溜まります。
Kawaにはもう一つのメソッド呼び出しの方法があります。

```scm
> (("abcdefg":substring 1 4):toUpperCase)
BCD
```

少し簡単になりましたが前述の例と同様に先頭に`(`を追加する必要があるので煩雑です。
しかしSchemeなのでマクロを使って新しい文法を定義することができます。

```scm
(define-syntax ->
  (syntax-rules ()
     ((_ o)
      o)
     ((_ o (m a ...) r ...)
      (-> (invoke o 'm a ...) r ...))
     ((_ o f r ...)
      (-> (field o 'f) r ...))))
```

3番目のルールはオブジェクトのフィールドを参照するためのものです。
これで次のように書けるようになります。

```scm
> (-> "abcdefg" (substring 1 4) (toUpperCase))
BCD
```

Java8のストリームAPIを使うコードは以下のように書けます。

```scm
> (-> #(1 2 3 4 5)
       (stream)
       (filter (lambda (x) (< x 4)))
       (map (lambda (x) (* x x)))
       (toArray)  )
[1 4 9]
```

ここに現れる`stream`, `filter`, `map`, `toArray`はすべてJavaのメソッドです。
`filter`の引数は単なるラムダ式ですが、このコードが正しく動作するためには`Predicate`インタフェースを実装している必要があります。
Kawaにおけるラムダ式の実体は`gnu.expr.ModuleMethod`クラスです。

```scm
> ((lambda x x):getClass)
class gnu.expr.ModuleMethod
```
このクラスは`Predicate`も`Function`も実装していません。
ということはKawaはリフレクションで`filter`メソッドの引数が`Predicate`インターフェースであることを調べて、ラムダ式をそのインスタンスに変換しているということになります。Javaのコンパイラと同じように型推論しているものと考えられます。
コンパイルしてラムダ式の部分を逆コンパイルすると以下のようになっています。

```java
public class call$0 implements java.util.function.Predicate {
  public boolean test(java.lang.Object);
    Code:
       0: aload_1
       1: getstatic     #10                 // Field call.Lit3:Lgnu/math/IntNum;
       4: invokestatic  #16                 // Method gnu/kawa/functions/NumberCompare.$Ls:(Ljava/lang/Object;Ljava/lang/Object;)Z
       7: ireturn

  public call$0();
    Code:
       0: aload_0
       1: invokespecial #20                 // Method java/lang/Object."<init>":()V
       4: return
}
```

確かに`Predicate`インタフェースを実装しているのがわかります。
この点に関してKawaはClojureよりもよくできていると思います。
gccでCのソースコードからセクションのアドレスを参照する。

gccでCのソースコードから、リンカスクリプトで定義するセクションのアドレスを参照する手順を調べました。

gccでBSS領域のクリアをするコードを書く場合に、セクションの開始アドレスと終了アドレスを参照する必要があります。

# gccでセクションのアドレスを参照する

リンカスクリプトの例
BSSの最初と最後にラベルを配置します。　.はカレント位置のアドレスを示します。

```
MEMORY
{
  ROM(rxai) : ORIGIN = 0, LENGTH = 64k
  RAM(wxai) : ORIGIN = 0x00ffe000, LENGTH = 4k
}

SECTIONS
{
  .text : {} > ROM
  .rodata : {} > ROM

  .data : {} > RAM
  . = ALIGN(4);	
  __bss_start = .;
  .bss : {} > RAM
  __bss_end = .;
}
```

Cのソースコードから、上記の__bss_start と __bss_endのアドレスを参照したい場合はこのように書きます。

```c
extern const void * __bss_start;
extern const void * __bss_end;

void clear_bss(void)
{
    /* clear BSS */
    memset( &__bss_start, 0x00, (size_t) (&__bss_end - &__bss_start));
}
```

コンパイル時にリンカスクリプトを指定します

```
arm-eabi-none-gcc -o target.elf -Ttarget.ld  main.c
```

* リンカスクリプトにある名前でextern const のポインタ変数を定義する
* ポインタ変数のアドレスを参照するコードを書く。
* リンカがリンク時にポインタ変数の名前からアドレスを解決してくれる。


# 参考
* How do you get the start and end addresses of a custom ELF section in C (gcc)?
 * http://stackoverflow.com/questions/16552710/how-do-you-get-the-start-and-end-addresses-of-a-custom-elf-section-in-c-gcc
 * この質問の回答のコードではexternが不足しているので注意
PHPでTCPDFを使ってHTMLをPDF化する


[この記事](http://qiita.com/noratmt/items/4d58a6f4baa8051e6817)の続きです。

#環境
Mac OS X El Capitan 10.11.4
PHP 5.6.24
CodeIgniter 2.2.0（古い。が、他のFWでも参考になるかと思います）

# ライブラリのインストール
```composer require tecnickcom/tcpdf```
`require`を付けて`composer.json`にも追加。

# 実装

```
// composerでインストールしたライブラリを参照する
require_once('./vendor/tecnickcom/tcpdf/tcpdf.php');

// 用紙の方向、用紙サイズを指定する
$tcpdf = new TCPDF('L', "mm",'A4');
$tcpdf->setPrintHeader(false);
$tcpdf->setPrintFooter(false);
$tcpdf->AddPage();

// CodeIgniterのviewの第三引数をtrueにしてhtml文字列として扱う
$html = $this->load->view('open_position', $this->data, true);

$tcpdf->WriteHTML($html, true, 0, false, true, 'L');
// 出力用バッファの内容を消去
ob_end_clean();
$tcpdf->Output($file_name, "D");
```

CodeIgniterらしく`application/libraries`にクラス化しておくと良い感じ。
Swiftを使ったMac OS Xアプリの開発【Data Road編】

Swiftに関する日本語の情報もかなり増えてきているように感じますが、殆どがiOSアプリ開発に関するものです。そこで、趣味でMac OS Xアプリ開発を行いましたので、数回に分けて記事にしていこうと思います。
ちなみに、Macの利用比率が世界的に低いため、利益などを考慮する場合は、WebアプリやJavaアプリとして開発したほうがいいかもしれません。また、Swiftで開発を行うと、昔のMac OSで対応できないものが出てくるようです。

## 前提条件
iOSアプリの開発歴があるものとして解説を行いますので、共通な作業は省略している箇所があります。また、アプリに実装する機能などによっては、追加で必要なことや、今回の作業に不要なことが含まれている可能性があります。  

## 開発環境
Mac OS X 10.11.6
Xcode 7.3.1

## 完成作品
<div align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/128344/eeca22e3-2ebe-5e93-4f8d-2629de52bcb1.gif" alt="完成作品" title="完成作品" with="300" height="260" />
</div>

アプリに読み込ませたいリソース（今回はPNG）がある場所を指定して読み込ませるというものです。指定した名前のファイルが見つからなかった場合はエラー表示をします。 
ソースを[GitHub](https://github.com/AkkeyLab/MacOSAppTraining02)に置いていますので、よければご利用ください。

## 1.ディレクトリの指定
<div align="center">
<img src="https://qiita-image-store.s3.amazonaws.com/0/128344/bdae811a-65d1-3a72-3a4b-29f4a3fc2b6e.png" alt="完成作品" title="完成作品" with="300" height="250" />
</div>
レイアウトはこのように作成しました。Storyboardの使い方に関しても記事にしていますので、参考にしてみてください。
Read Buttonは **Action** としてリンクさせ、以下のように記述します。

> ViewController.swift  

~~~swift
@IBAction func savePush(sender: AnyObject) {
    // ファイルを開く・ファイルを開く場合はNSOpenPanelを使用
    let panel = NSOpenPanel()
    // ファイル選択を許可させるか
    panel.canChooseFiles = false
    // ディレクトリ選択を許可させるか
    panel.canChooseDirectories = true
    // 複数選択を許可させるか
    panel.allowsMultipleSelection = false

    panel.beginWithCompletionHandler({ (num) -> Void in
        if num == NSModalResponseOK {

            // パスを渡す
            self.readItem((panel.directoryURL?.path)! + "/sample.png")
        }
    })
}
~~~

ポイントとしては、非同期処理部分でしょうか。実行するとわかりますが、ディレクトリ選択Windowが表示されるまで多少時間がかかります。
なので、パスを渡す処理を非同期処理内で記述しないとnilで怒られます。

## 2.画像データの取得
先ほどパスを渡した先を記述していきます。　　

~~~swift
@IBOutlet weak var outPutImage: NSImageView!
private let alert = NSAlert()

func readItem(url: String) {
    // 画像データが存在するか
    if (NSImage(contentsOfFile: url) != nil) {
        let image: NSImage = NSImage(contentsOfFile: url)!
        // 画像をセット
        outPutImage.image = image
    } else {
        // エラーダイアログ
        alert.messageText = "Error"
        alert.informativeText = "Not find sample.png"
        alert.runModal()
    }
}
~~~
Storyboardに設置したNSImageViewから **Outlet** としてリンクさせます。readItemメソッドでは、初めに画像データが存在するかを確かめてから、NSImageViewに反映させています。
また、存在しない場合はエラーダイアログを表示しています。実際のアプリに導入する場合は「No Image」などの初期画像を反映させるようにするといいと思います。
もっとカッコいい方法があるような気がしますが、これでもクラッシュするようなことはないと思います。

## 3.なぜアプリ側がデータを保管しないのか
実はこの方法、私がやりたかった方法とちょっと違うんです。
ユーザに画像などを選択させ、そのファイルをアプリの管理下にコピーして利用したかったんです。
NSUserDefaultsで保存するという方法もありますが、mp4ファイルも保存させたいこともあり、明らかに無理そうだったので採用しませんでした。あと、NSUserDefaultsで保存させるとappファイル外で管理させるため、保管場所として不適切な気もします。

## 4.宣伝
初めて作成したOS Xアプリです！
>[KeiSignal](https://itunes.apple.com/jp/app/keisignal/id1144071713?mt=12)
>プロ生ちゃんが時間を知らせてくれるMac専用の時報アプリケーションです。
>ミュート機能など、複数の設定が可能。
>課金・広告などは一切ございません。
OpsWorks Chef12でRailsのレイヤーを作成する

OpsWorksのChef 11ではRailsやPHPなどのビルトインレイヤーがあり、プロビジョニング、デプロイのレシピが全部準備されていて便利だったのだが、Chef 12ではそれがなくなってしまった。

Chef 11のビルトインレイヤー相当のものを全部自分で作るのは大変なので、探したところStackOverflowのこの記事が見つかった。
http://stackoverflow.com/questions/36319906/opsworks-chef-12-recipes

どうやらこちらにOpsWorks Chef 12用のRailsのクックブックがあるらしい。
https://supermarket.chef.io/cookbooks/opsworks_ruby

読んでみると下記の通りライフサイクルに対してレシピをセットアップすればChef 11と同等のことができるとのこと。

```
opsworks_ruby::setup - attach to Setup
opsworks_ruby::configure - attach to Configure
opsworks_ruby::deploy - attach to Deploy
opsworks_ruby::undeploy - attach to Undeploy
opsworks_ruby::shutdown - attach to Shutdown
```

サポートしているサーバはnginx + unicorn。
DBは

- MariaDB
- MySQL
- PostgreSQL
- Sqlite3

ドキュメントがちゃんと書いてあるので、これを見れば大体分かりそう。
https://supermarket.chef.io/cookbooks/opsworks_ruby
プログラマとかじゃないけどC#でパケットを覗いてみた

普段の仕事ではプログラムとか書いてないけど、2か月ほどテストの手伝いをしたことがあったのを思い出して、久々にVSを動かしてみた。
ついでに、普段遊んでる某ブラウザゲームのデータを拾って表示するツールみたいなのが作れないかと思って試してみた。

#### ・何はともあれ、どういうデータが流れてるのかを見る
ということで、久々にWiresharkを立ち上げて、ずらずらとパケットキャプチャをしてみる。
色々と機能を実装してみたいという妄想は膨らむけど、最初から全部やろうとするとつまづくのは目に見えてるし、モチベ維持の意味も込めて、何かゲーム上のパラメータ一つだけをピックアップしてみようと思った。
で、ゲーム内のボスキャラクターのHPが数字で表示されないことと、データ上ではきちんと数字で管理されてるのを見て、HPの具体的な数値を表示するのはどうだろうかと思いつく。
とりあえず、Wiresharkがデータ拾えてるってことは、何とかすればC#でもそういうアプリが作れるはずだな、ということで調べてみる。

#### ・通信系プログラムとかを色々と参考にして調べてみた
結論から言うと、プログラムの書き方よりも、そういうライブラリを追加して機能を増やすって概念がすっぽ抜けていた。
というわけで、WinPcapとSharpPcapを導入することにした。
WinPcapはインストールすればおｋなのだが、SharpPcapはzipを展開するだけだったのでちょっと不安だったが、まぁこの後また別の問題が発生するのは確定的に明らか。
サンプル読みながら自分でコメントを書き直せばすぐに理解できた。

#### ・とりあえずデバイスを表示する
仮想とか含めてNICとか複数あることも珍しくないので、とりあえずデバイスを決めるプログラムを書くためにフォームのボタンを押したらリストボックスに表示するみたいなのを書いた。
もちろんこの後に問題が(ry

#### ・とりあえずパケットを表示する
サンプルのおかげでパケットを表示できた。
が、プロミスキャスモードで拾うのでもちろん死ぬほどデータが流れてくるのでフィルターでなんとか。
ip and tcpとかで何とかなる。

#### ・データの型が意味不明
パケットデータの型がいまいち理解できなくて、仕方がないのでデータの配列をforループで一つの変数にコンマ付きでstringとしてぶち込んでいくことにしてみた。
//object型とかいうのがあるみたいですね、と後で知ることになりました。
意外とすんなり上手くいったのだが、今度はそのデータが何なのかということに疑問を持つ。
文字データの31なのか、数字データの31なのか、みたいな。
まぁでも別に動けばいいや、という後のことを考えないソースを書き上げる思考が止まらなくなる。
その場しのぎで解決したのが、「該当箇所のデータだけをフィルターとして設定してやれば、ほかに引っかかったとしてもそこまで大した問題じゃない」ということだった。
例えば、「HPは1000です」みたいに書いてある場所があるとして、「HPは」だけでフィルターをしてやれば拾ってこれるのでは？と考えた。
もちろんこれは上手くいったのだが、さらに問題が発生した。

#### ・HP、ようは数字データは何の文字コード？
文字データとエンコード方式を組み合わせたものが文字コードだけど、じゃあこれ何のエンコードなの？という所にたどり着くのはごく普通だと思うが、それで2時間ぐらい悩んだ後に
「ここ以外で使わないからいいじゃねえか、10個しかないんだし手動エンコードしようか」
となった。0~9の数字はコードが隣り合ってるのが普通なので、そこから逆算すれば0~9のデータがわかるので、手動エンコードした。

#### ・ようやく完成！
ひとまず完成した。問題は山積みだけども、完成までこぎ着けたのはえらいと思う。
そういう精神はモノづくりの世界では必須だ。
かかった時間は、8/22～2/25の20時～深夜1時ぐらいまででした。
ものすごい集中してたから、慣れない分野でもなんとかなった……。

#### ・浮き彫りになった問題点
以下に、プログラマーではないが故に理解してなかった問題を書き出してみる。
・オブジェクト型とか、まだまだ知らない型がたくさんあった。メールアドレスとか、IPとか……。
・フォームアプリで作りたかったのだが、途中でパケットのログをどうやって待ち受けて出力すればいいのかわからなくなった。
・NIC選択をフォーム、ログ出力をコンソールにするというアプリとしては最悪の出来だと思うが、自分が気にしてなさすぎるのでそれでいいやと思った。
・フィルターに設定した「HPは」という部分がデータの一致をすべて拾うので、HPが回復したりしても変なデータを拾ってくる。
・ある程度サンプルが揃ったのでフィルターの例外処理をやってみたら別の問題が(ry
・スレッド処理とか全然知らなかった
・JSONとか全然知らなかった
こんなもんかな。
っていうか、プログラム的な部分は何も書いてないですねこれ……。

ちなみに、前段として一番最初に「通信系PGだしpingでも飛ばすアプリ作るか！」と思って作り始めたので、そもそもWinPcapすら入れてなくてもっとめんどくさいことしてました。

#### ・最後に
JSONを知らなかったんですが、これめっちゃ便利そうですね。
他の分野でも活用されてるみたいなんですが、C#でJSONってあんましメジャーではないのかな？
もうちょっと勉強した方が良さそうですね。

#### ・C#とJSONで参考になりそうなやつ

C#でJSONを読み込むメモ・
http://www2.hatenadiary.jp/entry/2013/12/14/030112

C#でJSONを扱うライブラリ「Json.NET」を使ってみました
http://qiita.com/ta-yamaoka/items/a7ff1d9651310ade4e76

ぐぬぬ……仕事でまだまだインフラ系と基本情報の勉強しなきゃならんのに覚えることがたくさん／(^o^)＼
FirebaseのlogEventWithNameで累積値を記録する


Firebaseにおいて、イベント事に累積していくような値の記録方法にについて記載する。

例えば、一度のイベントの中で何回操作を行ったかを別に記録したい時や、
購入のアクションと、その購入金額などを紐付けたい時などに使用できる。


```swift
FIRAnalytics.logEventWithName(
    "ＥｖｅｎｔＮａｍｅ",
    parameters: [
        kFIRParameterValue:NSNumber(integer:selects.count),
    ]
)
```

参考
https://firebase.google.com/docs/analytics/ios/events
自前のDelegateを実装する！！

##はじめに
iOS開発を学びはじめた頃に、TableView使うときにtableView.delegate = selfってやってるけど、
やらないと使えないのはわかるけど一体どうなってるんだ？と思いませんでしたか？(僕は思ってました。。。)
自分で実装してみるのが一番だ！まずは手を動かそう！な僕は実装してみて初めて少しだけ理解が深まった気がしたので、備忘録とiOS開発を始めたばかりの人への手助けを兼ねて筆をとりました。

##Delegateって？
デリゲートパターン(処理の委譲)
あるクラス(A)の処理をあるクラス(B)に任せるという事になります。
TableViewCellに配置したボタンが押されたらViewControllerで画面遷移を行う実装をしたい時などに使います。(いい例が思い浮かびませんでした。。。)
では上記の実装を仮定として進めていきたい思います！


#１.プロトコルの定義

```objc
CustomTableViewCell.h
#import <UIKit/UIKit.h>;

@protocol CustomCellDeleagete <NSObject>

@end
```

#2.デリゲートメソッドの定義

```objc
CustomTableViewCell.h
#import <UIKit/UIKit.h>;

@protocol CustomCellDeleagete <NSObject>

@optional
/**
* ボタンがタップされた時に呼び出されるデリゲートメソッド
*/
- (void) buttonTapped;
@end
```
デリゲートメソッドにはrequiredとoptional修飾子があり、
requiredは実装必須のメソッド
optionalは任意で実装のメソッドとなります。
設定しない場合はデフォルトでoptionalとなります。
#3.デリゲートインスタンスを定義

```objc
CustomTableViewCell.h
#import <UIKit/UIKit.h>;

@protocol CustomCellDeleagete <NSObject>

@optional
/**
* ボタンがタップされた時に呼び出されるデリゲートメソッド
*/
- (void) buttonTapped;
@end

/**
* CustomCellDelegateインスタンス
*/
@property (nonatomic, weak) id<CustomCellDelegate> delegate;
```
weak参照とid型のプロパティとして保持します。

#4.デリゲートの呼び出しを実装

```objc
CustomTableViewCell.m
@implementation CustomTableViewCell
// 処理諸々は省略

#pragma mark - IBAction

// ボタン押下で呼び出し
- (IBAction) didTapBtn:(id)Sender {
    // デリゲートインスタンスがメソッドを実装しているかチェック
    if ([self.delegate respondsToSelector:@selector(buttonTapped)]) {
        // 実装されていれば、デリゲートインスタンスへ処理を委譲
        [self.delegate buttonTapped];
    }
}

@end
```
buttonTappedの処理は委譲先のクラスで実装します。

#5.プロトコルを準拠する

```objc
ViewController.m
#import ViewController.h

@interface ViewController () <CustomCellDelegate>

@end
```

#6.デリゲートインスンタンスにselfをセット

```objc
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // cellIdentifierは仮
    static NSString *cellIdentifier = @"Cell";
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    // delegateインスタンスにselfをセット
    cell.delegate = self;
    return cell
}
```
#7.デリゲートメソッドの処理実装
```objc
ViewController.m
@implementation ViewController
// 省略
- (Void) buttonTapped {
    // 画面遷移処理
    [self.navigationController pushViewController:nextView animated:YES];
}
```
##終わりに
Delegateの実装は以上になります。
実装の過程を見ることで、TableView等のdelegateの仕組みの理解の手助けになれば幸いです。
iOS開発をしていると、Delegateを使って処理を委譲させたいシーンは必ず出てくるので、Delegateの実装は必須の知識になると思います。
コピーアンドペーストではなく、理解した上で実装を行えるようになりたいですね！
Dockerでマウントしたディレクトリにユーザ権限でファイル作りたい話。

# 端書き

最近Jenkinsとかでテスト書く上でDockerのお世話になっている。
プロジェクトごとの依存関係とかCI環境にいれなくていいのがとても素敵なのだけど、一つだけ不便な点がある。
そのままだとテストがrootで走ってしまう問題。

とくにテスト結果や生成物を保存したくてワークスペースを -v でコンテナにマウントしていると、root権限で書かれてしまってワークスペースを削除したりが失敗する。
というかテスト自体、root権限で動かせないケースもあったりなかったりなので、一般ユーザ権限で動かしたい。

Jenkinsの [Docker Pipeline Plugin](https://wiki.jenkins-ci.org/display/JENKINS/CloudBees+Docker+Pipeline+Plugin) なんかだと -u オプションでユーザ権限で走らせていて、一見これで一件落着に見えるのだけど、地味に問題がある。
一つは存在しないユーザの可能性があること。そしてもう一つがroot権限を失うこと。
最初はこれでいいじゃないか、と思っていたけど結構地味にやっかい。

# なんで問題なの？

ユーザがいなくてもuidがプロセスに設定されていれば問題ないじゃないか、root権限でファイル書きたくないって言ってるのになんてroot権限欲しいのさ。
ということなのだけど、理由はいくつか。

まずはホームディレクトリが欲しい。
rpmbuildとか素で叩くと `~/rpmbuild` を使おうとするのだけど、HOMEが設定されないので `/rpmbuild` を使おうとしちゃう。
オプションで `_topdir` 設定すればいい話ではあるのだけど、別にBUILDとか保存したくないし、そも作業ユーザで書き込みできるディレクトリが他に欲しいという要望。(/tmpは書けるけど)

無ければ作ればいいじゃない、と思うのだけど、もう一つの問題、-uを付けた時点でコンテナ内ではroot権限を失っているので作ることも出来ない。
コンテナを作る時点であらかじめ作っておけば、と思っても作業ユーザのuidが何番になるのかの情報はその時点では無い。
Jenkins用と割り切って、あらかじめjenkinsユーザのuidを決め打ちしておくのも手なんだけど、なんか嫌。
というか開発中にも叩きたいことあるし。

あと、uidが非実在ユーザだったり、コンテナの中の別のユーザとかぶることがあって、それも結構問題になる。
sudoとか、あとmockなんかもそうだけど、起動時にgetentとかでユーザの情報取得してグループをチェックするようなコマンドが軒並み使えなくなる。
gidだけじゃなくてグループ名を付与したいのさ。という話。

結構ニッチな要望なのかもだけど地味にやっかいな問題で、ここ最近色々試行錯誤してなんとなく形が見えてきたので備忘録がてらメモ

# 私的ソリューション

CMDに複雑な指定はしたくない、汎用的に使いたい、ということでentrypointで頑張ってみることにした。

```bash:entrypoint.sh
#!/usr/bin/env sh

set -e

# uid/gidは-uで指定せずに、-vでマウントされるであろうカレントディレクトリから取得する。
uid="`stat -c %u .`"
gid="`stat -c %g .`"

# 作業用ユーザ(user:staff)の作成。
# uid/gidがコンテナ内のユーザ/グループと衝突したときにuser:staffを優先にするためにファイルの先頭に追加。
# 普通にuseraddすると、uidがコンテナ内の既存ユーザと衝突したとき、getentが既存ユーザを優先してしまう。
# ちなみに 1i はsedのコマンドで、1行目の前の行(つまり先頭行)に行を追加するコマンド。
sed "1iuser:x:$uid:$gid:user:/home/user:/bin/sh" -i /etc/passwd
sed "1istaff:x:$gid:" -i /etc/group

# ホームディレクトリを作成
# ホームディレクトリの雛形 /etc/skel の中身を転送しておく
mkdir -p /home/user
find /etc/skel/ -mindepth 1 -maxdepth 1 -exec cp -r '{}' /home/user \;
chown user: -R /home/user

# 作ったユーザに何かしら特権権限で作業したいときのためのスクリプト類を /etc/provision.d/ に配置しておく
# 主な用途は作業用ユーザにグループをを追加したりなどか。 `usermod -a -G mock user`
# あらかじめコンテナにsudoerの設定しておいて、userにwheel渡しておくだけでも十分かも。というかそっちのほうが小回り効きそう。
for s in /etc/provision.d/*.sh; do
  [ -e "$s" ] || continue;
  ${s}
done

# CMDの実行
# ログイン処理を走らせるために一回bash -lを挟む
command="$@"
su -c "cd '${PWD}'; bash -l -c '${command}'" user
```

こんなスクリプトをあらかじめ用意。
作業ディレクトリをコンテナにマウントしつつ、entrypointに上記のスクリプトを指定して実行する。

```console
$ docker run -v ${PWD}:${PWD} -w ${PWD} --entrypoint=entrypoint.sh some_image ...
```

これで、CMDでは特に意識することなく、普通のユーザで普通にコマンドを叩く想定で書けばok。

あまり需要がない要望かもだし、私の使い方/想定がそもズレいているのかもだけど、現状これで満足。
DockerでBitbucket Serverを動かす

DockerでBitbucket Serverを動かすときに詰まったのでメモ

# 環境
* CentOS Linux release 7.2.1511
* Docker version 1.10.3
* Bitbucket Server 4.8.5

# データディレクトリのパーミッションでこける
Docker Hubに[Atlassian公式っぽいBitbucket Seerverのページ](https://hub.docker.com/r/atlassian/bitbucket-server/)があったので、そこに書いてある手順に従ってインストール。最初はデータディレクトリのボリュームのパーミッションの変更を行う。

> Set permissions for the data directory so that the runuser can write to it:

> ```
$> docker run -u root -v /data/bitbucket:/var/atlassian/application-data/bitbucket atlassian/bitbucket-server chown -R daemon  /var/atlassian/application-data/bitbucket
```

実行したところ、以下の様なエラーが出た。

```sh
chown: changing ownership of ‘/var/atlassian/application-data/bitbucket’: Permission denied`
```
Dockerではホストのディレクトリをコンテナにマウントするとコンテナ上で[所有者が1000:1000になる](http://qiita.com/suin/items/3a0361102af83d0b69aa)らしいので元のDockerfileをいじったりしてみたが、どうにもうまくいかなかった。ちなみにマウントしたディレクトリの所有者はコンテナ上でbin:bin（uid=2、gid=2）だった。。。

# SELinuxのせいだった
いろいろ調べてたら[SELinuxが原因](http://www.projectatomic.io/blog/2015/06/using-volumes-with-docker-can-cause-problems-with-selinux/)ということが判明。SELinuxには何度も手こずらされている。。。
`-v`オプションの最後に`:z`をつけて、以下にようなコマンドにしたら動作した。

```sh
docker run -u root -v /data/bitbucket:/var/atlassian/application-data/bitbucket atlassian/bitbucket-server:z chown -R daemon  /var/atlassian/application-data/bitbucket
```
続けてコンテナを起動。
> Start Atlassian Bitbucket Server:

> ```
$> docker run -v /data/bitbucket:/var/atlassian/application-data/bitbucket --name="bitbucket" -d -p 7990:7990 -p 7999:7999 atlassian/bitbucket-server
```

http\://localhost:7990にアクセスすると無事動作しているのを確認。
status barをカスタマイズする

以下をxibにナビゲーションバーを追加した後にAppDlegateに追記すればまとめてデザインを変更できます。

##navigation bar
###navigation barの背景色の変更

```
UINavigationBar.appearance().barTintColor = UIColor(red:0.20,green:0.60,blue:0.86,alpha:1.0)
```

###navigation barの文字色の変更

```
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
```

###navigation barのタイトルのフォントを変更

```     UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Hiragino Sans", size: 17.0)!], forState: UIControlState.Normal)
```

##Status bar
###status barの色を変更
(status barはnavigation controllerを使うのでいらない気もしますが)

```
let statusBar = UIView(frame:CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0))
statusBar.backgroundColor = UIColor(red:0.20,green:0.60,blue:0.86,alpha:1.0)
view.addSubview(statusBar)
```
MicrosoftBotFrameworkのRestAPIを使ったTimerBot

業務のチャットツールとしてSkypeを使っているため、MicrosoftBotFrameworkには興味はあったのですが、node.jsとC#でしか使えないという認識でしたが、どうやらRESTAPIというインターフェースもあるようです。

下記の記事参照。
[BUILD BOT with Microsoft Bot Framework Rest Api](https://blogs.msdn.microsoft.com/tsmatsuz/2016/08/19/build-skype-bot-with-microsoft-bot-framework-oauth-and-rest-api/)

pythonでtimer botを作ったので、試行錯誤した点も含めてまとめておきます

### Botアカウントの作成

まずは https://dev.botframework.com/ にアクセスして、bot用アカウントを作成します。
※[SkypeBotFramework](https://developer.microsoft.com/en-us/skype/bots)というものもあるのですが、これはMicrosoftBotFrameworkに統合されるようです。

1. 「Register a bot」メニューを選択
1. IconとNameがほかの人から見えるものになるのでBotのキャラにあったものにする
1. MicrosoftAppIdとPasswordを生成する（これは後で使うので重要）
1. Publisher profileは公開しない前提で適当に
1. その他もエラーが出ないように適当に記入して登録　（**登録しても公開しなければ他の人からは見えない**）
1. MyBotの登録が完了したら、ChannelsのSkypeのEditで「Group messaging」をONにしておく
1. ChannelsのSkypeの「Add to Skype」でBotとつながる
1. 通知したいチャットルームにBotを招待する
1. 通知したいチャットルームで「/get name」というコマンドをたたき、conversationIDを取得しておく

### Skypeへのメッセージ投稿

Skypeへのメッセージ投稿を行うためには、

1. OAuthの認証APIを叩き、access_tokenを取得する
2. access_tokenを用いて、メッセージ投稿APIを叩く

といった流れとなります。

#### 認証部分のpythonコードサンプル

```py
import requests
import json

def __auth(self):
	""" MicrosoftBotFrameworkのOAuthClient認証を行いaccess_tokenを取得する """
	
	headers = { 'Content-Type' : 'application/x-www-form-urlencoded' }
	data = {
		'grant_type' : 'client_credentials',
		'client_id' : '** YOUR CLIENT_ID **',
		'client_secret' : '** YOUR CLIENT_SECRET **',
		'scope' : 'https://graph.microsoft.com/.default'
	}
	 
	access_token_response = requests.post( 'https://login.microsoftonline.com/common/oauth2/v2.0/token', headers=headers, data=data )

	if access_token_response.status_code != 200 :
		print access_token_response.headers
		print access_token_response.text
		raise StandardError('Skype OAuth Failed')
	 
	tokens = json.loads(access_token_response.text)
	return tokens['access_token']
```

#### メッセージ投稿部分のpythonコードサンプル

```py
import requests
import json

TARGET_CHAT = '** TARGET CONVERSATION ID **'

def __post(self, token, message):
	""" MicrosoftBotFrameworkのチャット投稿用RESTAPIを叩く """
	
	headers = { 
		'Authorization' : 'Bearer ' + token,
		'Content-Type' : 'application/json'
	}
		
	data = {
		'type' : 'message/text',
		'text' : message
	}

	response = requests.post( 'https://api.skype.net/v3/conversations/' + TARGET_CHAT + '/activities/', headers=headers, json=data)
		
	if response.status_code != 201 :
		print response.status_code
		print response.headers
		print response.text
		raise StandardError('Skype Post Failed')
		
	return
```

これで投稿はできますが、以下の制限があることを確認済です。「まあいいか」と思って考えていないだけなのですが、対策などご存じの方がいればコメントいただけるとうれしいです。

1. **で文字列を囲むことでSkype上では太字になるはずがならない
2. &を含む文字列を投稿しようとするとエラーになる

**2016/11/17追記**
nohi様より解決策を教えていただきましたので追記しておきます
1.について
>  ```& ⇒ &amp;```に変換したところうまくいきました。

2.について
> sqliteに格納されているデータに合わせて送ったところ、
太字でメッセージを送ることができました。
```<b raw_pre="*" raw_post="*">太字</b>```



### まとめ

アカウント作成をどうやるのかで少しはまりましたが、RESTAPIの部分は比較的簡単に動き、メッセージ投稿することができました。pythonにできたことでAWS lambdaを使って定期実行を仕込んでつかっています（Azureではないですが・・ｗ

次は、話しかけると何らかの返事をする形式のbotにも挑戦してみようと思います。
エンジニア　リーダー　マネージャー　目指す時に必要な考え方

<h1>マネージメントで必要なこと、学びのシェア</h1>
・部下との関わり方、考え方から自らの必要となる考えた方、捉え方を学ぶ
・エンジニアリーダー、マネージャーとして他のメンバーとの関わり方を学んだ事をメモ

<h2>
1枚目
</h2>
・マネージャーに必要なこと
・失敗を問題とせず、成長に必要なことと思うこと
・社員の成長、部下の成長を信じる
・部下の最高の理解者であろうと思い、関わっている
・前提の違いが成果を分ける
・メンバーと信頼を得ることが大事
　・信頼されていない段階で何を話しても伝わらない
・まごころ、思いやり、をベースに作る
・愛とは、他の方に対して思うこと。
・その人の考え方が、その人の人生そのものを作り上げている
・君はできる。君なら必ずできると思うこと
・利益は目的ではなく結果である
・人造りが先
・お客様が喜ぶ商品の提供が先
　・それが売り上げにつながる


<h2>
no2</h2>

<h2>
no3</h2>

<h2>
no4</h2>

<h2>
no5</h2>

<h2>
no6</h2>

<h2>
no7</h2>

<h2>
no8</h2>
pythonでファイルの存在を確認する


```
import os
path = "./sample"

os.path.exists(path)
```

これでsampleと言う名前のファイル、またはディレクトリの存在を確認できる。

ちなみに、ディレクトリを含まず、ファイルだけを確認したい場合は、

```
os.path.isfile(path)
```

ファイルを含まず、ディレクトリだけを確認したい場合は

```
os.path.isdir(path)
```

でできる
Travis CIのLinuxとOSXにTeXLive 2016をインストールするスクリプト

# はじめに

[Travis CI](https://travis-ci.org/)で[TeXLive](https://www.tug.org/texlive/)をインストールしたい場合、OSXとLinuxではやり方が全く異なるため、方法に熟知していなければやや難しいと思われる。そこでTravis CIでTeXLiveをインストールするためのスクリプトを作った。この成果は次のリポジトリに置かれている。

https://github.com/y-yu/install-tex-travis

# 使い方

次のような`.travis.yml`を用意する。

```yaml:.travis.yml
os:
  - osx
  - linux
dist: trusty
sudo: false
before_install:
  - wget https://raw.githubusercontent.com/y-yu/install-tex-travis/master/install-tex.sh
  - chmod +x install-tex.sh
install:
  - . ./install-tex.sh
script:
  # something
```

このように次のような手順を実行すればよい。

1. `install-tex.sh`をダウンロード
2. 実行する権限を付与
3. `. ./install-tex.sh`を実行
appengine for javaで、デプロイしたアプリケーションのバージョン名を変更する

「デプロイされていてユーザにも周知済みの、特定のバージョンを今後使わせたくない（周知しても使っちゃう人がいる）。ただし、そのバージョンのアプリケーション自体は後々使えるよう、残しておきたい」といった状況に遭遇しました。正しい道としては、該当のバージョンを削除し、後々必要になった際にリポジトリを対応時点まで戻して、その状態でデプロイする、ですが。でもそのバージョンに対応するリポジトリのリビジョンを探すのが面倒という状況だったりするときもありますよね…？

そこで思いついたのが **バージョン名だけ変えてしまえば良いのでは？** だったのですが、`appcfg`コマンドにはそんな機能は存在しません。そこで、既存アプリケーションをダウンロード→別名でデプロイとしてしのぎました。が、途中で一手間挟む必要があったので、メモ書きとして残します。

```
appcfg.sh -A $APPID -V $VERSION_ORIGIN download_app $BACKUP_FOLDER
cp $APPENGINE_SDK/lib/user/appengine-api-1.0-sdk-1.9.42.jar $BACKUP_FOLDER/WEB-INF/lib/
appcfg.sh -A $APPID -V $VERSION_RENAMED update $BACKUP_FOLDER
```

`download_app`コマンドでは、`appengine-api-1.0-sdk-1.9.42.jar` が足りないようなので、それだけコピーしておけば、`download_app` した構造をそのまま別バージョンとして簡単にデプロイできました。もちろん、sdkのjarのコピーを忘れるとアプリケーションは動作しません。
AndroidStudio(IntelliJ)とBitbucketを連携させるプラグイン「Bitbucket Linky」

AndroidStudio(IntelliJ)とBitbucketを連携させるプラグイン[「Bitbucket Linky」](https://plugins.jetbrains.com/plugin/8015?pr=idea)を紹介します。

AndroidStudioではデフォルトでGitHubと連携する機能がありますが、
gitのホスティングはGitHubでなくBitbucketでやっているという方にはおすすめです。

※バージョン2.3を元にしています
※私はAndroidStudioでしか使ってませんがIntelliJでも同様に使えるはずです
※私が作ったわけではありません

# 機能
<img width="271" alt="linky.png" src="https://qiita-image-store.s3.amazonaws.com/0/35511/c26f42fd-5d1d-0fa2-5b3c-74dcd3ca85cb.png">

IDEのファイル上やエディタ内で右クリックを押したときのダイアログに、上記の項目が追加されます。

* **Copy Bitbucket link (Ctrl+Shift+X,C on Windows / Cmd+Shift+X,C on Mac)**
最新のコミットの該当ファイルへのリンクがコピーされます。
エディタ内で行った場合は、カーソル位置の行数まで指定されます。
※カーソル位置が行頭か行末の場合は行数指定されません

* **Open in Bitbucket (Ctrl+Shift+X,B on Windows / Cmd+Shift+X,B on Mac)**
Copy Bitbucket linkしたときのリンクがブラウザで起動します。クリップボードには残りません。

* **Bitbucket Pull Request (Ctrl+Shift+X,P on Windows / Cmd+Shift+X,P on Mac)**
現在のブランチからPull Requestを作成するページがブラウザで開きます。

# インストール
1. 設定画面から[Plugins]を選択
2. 検索フォームに"Bitbucket linky"と入れて[Browse repositories...]をクリック
3. installしてIDE再起動
4. Bitbucketからcloneしたプロジェクトを開く

これで前で上げた図の項目が増えているはずです。

新規でプロジェクトを作成した場合でも、git remoteの接続先がBitbucketならそれだけで使えるようになります。
リモート先がGitHubの場合やリモートされてない場合はこの項目は出て来ません。

# おわりに
Bitbucket Linkyは更新頻度も高めで、現状AndroidStudio2.2 Betaでも動いており安定して使えています。
([atlassian謹製のpluginもあります](https://plugins.jetbrains.com/plugin/6207?pr=idea)が、あまりこちらはメンテされていません。)

Bitbucketを使ってAndroid開発をしている方は是非お試しを。

現場からは以上です。
Windows 7, Windows Server 2008 R2のロールアップについて

# はじめに
Windows 7, Windows Server 2008 R2の環境を構築することがあったのですが、その時にロールアップを使って比較的短時間で最新のパッチまで当てることができました。
方法にはとても丁寧な説明がすでにあるのですが、具体的にどれくらいかかったかを、備忘録もかねてこちらに残します。

# 前提条件
OSが以下のバージョンであること
- Windows 7 SP1
- Windows Server 2008 R2 SP1

# 実施方法
## ①準備からロールアップ適応まで
[@ITの記事](http://www.atmarkit.co.jp/ait/articles/1605/20/news041.html)を参考にして進めます（図解付きで丁寧でとても分かりやすいです）。

## ②ロールアップの適用
1. KB3020369をダブルクリックして実行...再起動なし。1～2分程度とすぐ終わる
2. KB3125574をダブルクリックして実行...再起動あり。30分程度かかる

## ③プロキシの設定（必要に応じて）
[「WindowsUpdate時のプロキシ設定」](http://qiita.com/hashi156/items/001d404b358d58c5736d)をご参照のこと

## ④Windows Updateを実施
ロールアップで適応されない残りのパッチを適用します
（ロールアップ後でも60個程度のPacthが未適用）

### ※※注意！！※※
- プログレスバーの画面が検索中のところから変わらなくても、強制的にリセットしないこと！そのまま待っておくこと（ダウンロードの画面に変わるまで、2時間以上かかったPCもありました）
- １回目のWindows UpdateではいくつかのPatch適用が失敗するので、すべてのPatchが適用されるまで、2～3回Windows Updateを実施する

# 結果
環境にもよると思いますが、私の場合最新パッチの適用完了まで2～3時間かかりました。
聞いた話ではロールアップを使わずに、すべてWindowsUpdateでパッチを当てた場合、場合は丸１日以上かかったそうですが、この方法だと半分以下の時間でした。

# 参考資料
http://www.atmarkit.co.jp/ait/articles/1605/20/news041.html
（図解付きの詳しい説明が載っています）

# 備考
ちなみに、10月以降 WindowsUpdateは「ロールアップモデル」に移行するらしいので、このようなまどろっこしい作業をしなくてよくなるかもしれません…
http://cloud.watch.impress.co.jp/docs/news/1015360.html
プロキシを利用する環境で、Windows Updateを使用する場合について

# はじめに
プロキシを利用している環境でWindows Updateを使用する場合、IEのプロキシ設定のみではWindows Updateの通信がうまくいかない場合があります。
特に、プロキシ認証を使う場合の設定情報（「③認証情報の設定」の項目）がネット上でも少ないので、備忘録を兼ねてその設定方法をまとめました。

# 前提条件
OSがWindows 7以降であること

# 設定方法
## ①IEのプロキシを設定
[コントロールパネル]⇒[すべてのコントロールパネル項目]⇒[インターネットオプション]で設定する
※詳細は[日経トレンディネットさんの記事](http://trendy.nikkeibp.co.jp/article/qa/internet/20030902/105779/)をご参照ください

## ②winhttp(Windows Updateで使用するもの)の設定
管理者権限でコマンドプロンプト(cmd)を起動し、以下のコマンドを入力
`netsh winhttp import proxy source=ie`

## ③認証情報の設定（必要な場合）
認証情報(ID/PW)が必要な場合、資格情報マネージャで設定する
1. [コントロールパネル]⇒[すべてのコントロールパネル項目]⇒[資格情報マネージャ]
    もしくは、ファイル名を指定して実行(Windowsキー + Rキーで起動可)で、以下のコマンドを入力
    `control userpasswords2`
2. [詳細設定]タブの[パスワードの管理]ボタンをクリック
3. [汎用資格情報]にプロキシへの認証情報を追加(Windows 10では[Windows資格情報]配下にある)
![shikaku-01-e.png](https://qiita-image-store.s3.amazonaws.com/0/55302/bbeec816-1e89-64f3-d69e-be9948761a69.png)

# 参考資料
[WinHTTPプロキシの設定方法](http://www.maruko2.com/mw/WinHTTP%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95)
(OMEGATさんの2009/10/5の投稿あたり)
swift Protocolを型宣言して使う場合は、ご用心を


# 書いたこと
* swiftのProtocolには以下の２種類があること
 * 型宣言が出来るProtocol
 * 型宣言が出来ないProtocol
* Protocolを型として使う場合の注意

# Swiftの２種類のProtocol

##1. 型宣言が出来るProtocol
  
  Self、関連型を持たないProtocolは型宣言として使えます。
  
  
  ```swift:a.swift
  protocol A {}
  
  // 型としてプロトコルAを宣言することができます
  func f(a: A) { ... }
  ```
   

  
##2. 型宣言が出来ないProtocol

Self、関連型を持つProtocolは型宣言として使えません。

```swift:b.swift
protocol B {
    associatedtype Element
}

// コンパイルエラーが発生します。
// protocol 'B' can only be used as a generic constraint because it has Self or associated type requirements
func f(b: B) { }
```

エラー内容からもSelf,関連型をもつプロトコルは型制約でしか使えないよと出力されています。

# Protocolで型宣言した場合は、実行コストが発生する

Protocolを型として宣言する場合は、以下の注意が必要です。

* コンパイラの型推測による型変換が行われるわけではない
* 実行時にコストが発生します (Protocolインスタンスの生成、値へのアクセス）

以下は上記の検証コードです。
[Advanced Swift](https://www.objc.io/books/advanced-swift/)から拝借しております。

使うProtocol

```swift:test.swift
// 関連型、Selfを持たないProtocolを定義
protocol NumberGeneratorType {
    mutating func generateNumber() -> Int
}

// 呼び出されるたびに値をインクリメントするGenerator
struct IncrementingGnerator: NumberGeneratorType {
    var n: Int
    init(start: Int) {
        self.n = start
    }
    mutating func generateNumber() -> Int {
        self.n += 1
        return n
    }
}
```

次にProtocolを型宣言として引数に受け取る関数と、Genericsを利用して具体型を引数に受け取る関数を実装し、処理速度を比較します。

```swift:test.swift
// Protocolでの計算
func generateUsingProtocol(g: NumberGeneratorType, count: Int) -> Int {
    var generator = g
    return 0.stride(to: count, by: 1).reduce(0) { total, _ in 
        return total &+ generator.generateNumber()
    }
}

// Genericでの計算
func generateUsingGeneric<T: NumberGeneratorType>(g: T, count: Int) -> Int {
    var generator = g
    return 0.stride(to: count, by: 1).reduce(0) { total, _ in 
        total &+ generator.generateNumber()
    }
}
```

Generics vs Protocol型宣言

```swift:test.swift
// swift -O test.swift で最適化して実行します

time("Generic incr") {
    // 0s
    generateUsingGeneric(IncrementingGnerator(start: 1), count: 922337203)
}

time("Protocol incr") {
    // 4s かかる ※ MacBook Air (11-inch, Mid 2013)
    generateUsingProtocol(IncrementingGnerator(start: 1), count: 922337203)
}
```

上記は最適化して実行した場合、Protocolを型として宣言している関数では *4秒* かかっているのに対して、Genericsの方は、*0秒* です。

Advanced Swiftの調査によると、Protocolを型として宣言した場合は、内部の処理において、Protocolは具体型として振る舞うようです。
(暗黙的に、引数に渡された値へのポインタを持ったProtocolインスタンスが生成される。）

※ ただしSwift v2.2において、公式ドキュメントに記載されているわけではありません。

# 終わり
関連型、Selfを持たないProtocolは変数の型宣言に用いられるだけでなく、
返り値の型としても宣言することができます。

またProtocolから値へのアクセスは、さほど大したコストではありませんが、
繰り返し処理が行われる場合はご用心です。

# 参考書

* objc↑↓ Advanced Swift By Chris Eidhof and Airspeed Velocity  
  https://www.objc.io/books/advanced-swift/
Apache Sparkでバイナリファイルのデータを16進数文字列に変換し、レコード分割する方法


# 環境

- mac上のdocker(コンテナイメージはcloudera/quickstart)
- CDH 5.7
- spark 1.6

# 準備
1.hdfs上の`/tmp/in`配下に適当なデータを配置する
2.spark-shellを起動する
(spark-shellはrootで実行すると、permissionエラーがでて面倒なため、hdfsユーザで起動する)


# 実行するsparkプログラム
```scala
//binaryからHexStrにConvert機能を使用するためにimport(Javaのライブラリ)
import javax.xml.bind.DatatypeConverter

//1レコード当たりのカラム区切り位置
//この場合1レコードは2+4+6+4=16バイトとなる
var record_split_arr = Array(2,4,6,4)

//SparkのbinaryRecordsメソッドを使用して、引数1のパス配下のバイナリファイルを読み込み、
//引数2のレコード長でバイナリデータを分割する。
//第1引数はHDFS上のバイナリファイルが保存されたパスで、
//パス配下に1つ以上のバイナリファイルが存在すること
var binary_rdd = sc.binaryRecords("/tmp/in/",record_split_arr.sum/2)

//読み込んだバイナリデータを16進数文字列に変換する
var hex_string_rdd = binary_rdd.map{case(bytes) => DatatypeConverter.printHexBinary(bytes)}

//とりあえずキャッシュしたがさほど意味があるか分かっていない
var hex_string_rdd_cache = hex_string_rdd.cache

//16進数文字列のレコードに分割したrddを、カンマ区切りのカラム単位に分割する
var hex_string_records_rdd = hex_string_rdd_cache.map{str =>
  var record_str_arr = new Array[String](record_split_arr.size)
  var length_postion = 0
  for (i <- 0 until record_split_arr.length){
     record_str_arr(i) = str.substring(length_postion, length_postion +record_split_arr(i))
     length_postion += record_split_arr(i)
  }
  record_str_arr.mkString(",")
}

//先頭3レコードの中身を確認
hex_string_records_rdd.collect.take(3).foreach(println)

//カンマ区切りcsvのテキストファイルとして保存する
hex_string_records_rdd.saveAsTextFile("/tmp/out")

```

```sql
--テキストファイル用テーブル
--impala等でテーブル作成すれば、データを検索する可能
create table sample_table
(
a1 string ,
a2 string ,
a3 string ,
a4 string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
LOCATION '/tmp/out';
```
備忘録_Git超個人的メモ

#push前までの処理

##ワーキングディレクトリでの変更

###一部のみaddする

```
git add -p
```


###ファイル名の変更

```
git mv <現在のファイル名> <変更したいファイル名>
```

###ワーキングディレクトリの追跡対象外のファイルを元に戻す

```
git clean -n //-nオプションを使用して対象となるファイルを確認する

git clean -f //-fオプションで実際にファイルの削除を実施する

//ディレクトリも削除したいときは-dのオプションを使用する

git clean -nd //-ndを使用して対象となるファイル / ディレクトリを確認

git clean -fd //-ndで実際にディレクトリの削除を実施
```

###ファイルの削除

```
git rm <ファイル名>
```

###ステージングエリアからファイルを削除
ステージングエリアからファイルを削除するが変更はワーキングディレクトリに残る

```
git rm --cached <ファイル名>
```

###修正した部分を確認

```
git diff
```


##ステージング

###addしたファイルを取り消す

```
git reset HEAD <ファイル名>
```

###更新したファイルの更新内容を取り消す(コミットをする前限定。)

```
git checkout <ファイル名>
```


##コミット関係

### diffの内容を確認しながらコミットメッセージを記述できる

```
git commit -v
```


###コミットを修正したいときに・・・(リモートにpushする前に限る)

```
git commit --amend
```

###コミットを取り消して、指定の位置に戻りたい(リモートにpushする前に限る)
※コミットを取り消すのではなく、そこまで戻るって意味
ファイルを変更した内容は消えないのでコミットの単位を変更したいときなどにしようする

```
git reset <コミットID>
```

###すべてなかったことにしたい(リモートにpushする前に限る)
完全に指定したコミットの時と同じ状態に変更される(そこまで修正したデータは破棄される)

####直前のコミットの場合は<コミットID>の部分は「HEAD」でOK

```
git reset --hard <コミットID>
```

###上のコマンドで地獄を見た場合の対処
※ここに、logが残っているのでそこで確認する

```
git reflog
```

###直前のコミットを削除(修正したデータをそのまま残しておきたいときはこれを使用)

####直前のコミットの場合は<コミットID>の部分は「HEAD」でOK

```
git resset --soft <コミットID>
```

##マージさせるまでのフロー

###マージの流れ

1.マージ先のブランチに`git checkout <ブランチ名>`で移動
2.`git merge <ブランチ名(マージしたいブランチ)>`を指定
3.mergeした情報をgitにpushしてしらせる
4.merge作業終了

###fetch=>mergeの流れ

```
git fetch 

git merge ***/***(追跡ブランチ)
```

##コンフリクトの対処

###checkout --ours / checkout --theirs

```
//２つのブランチ間でコンフリクトしているファイル fileA.txt と fileB.txt があるとする

//fileA.txt を現在チェックアウトしているブランチ側の対応に合わせる場合
git checkout --ours fileA.txt
git add fileA.txt    # add を忘れずに

//fileB.txt をマージさせたブランチ側に合わせる場合
git checkout --theirs fileB.txt
git add fileB.txt

git commit
```

###さっきのマージをなかったことに・・・
コンフリクト嵐に遭遇しらら・・・

```
git reset --hard ORIG_HEAD
```

##作業中にブランチを切り替えたい(コミットしていない編集がある状態)

一時的にstashに変更データを置いておく

```
git stash  //これで「stash」にファイル/ディレクトリの変更差分をおく

//名前をつけてstashに保存しておきたいときは↓
git stash save "保存するコメント"

git stash list //保存されているスタックのリスト表示

git stash pop //「stash」に置いておいたファイル/ディレクトリの変更差分を取得

git stash drop //「stash」に置いておいたファイル/ディレクトリを破棄
```

####注意点

`git stash pop`は変更をstashにおいた時のブランチ以外でも実行できてしまう。。。


##番外編

###他のブランチの特定のコミットをマージする

```
git cherry-pick <コミットID>
```

###他のブランチからファイルを取得したいとき※cherry-pickだとコミット的に厳しい場合

```
git checkout <取得したファイルがあるブランチ> -- <取得したいファイル>
```

###ローカルブランチの削除~リモートブランチの削除まで

```
//ブランチの確認
git branch -a

//ローカルブランチの削除
git branch -d <削除したいローカルブランチ(ブランチ名のみでOK※originはつけない)>

//リモートブランチの削除
git push origin :<ローカルで削除したブランチ名>
```

なぜ`push`コマンドなのか？※下記のサイトで勉強させていただいた。
http://shoma2da.hatenablog.com/entry/2014/03/08/234523


###リモートで削除されたブランチの状態をローカルに反映させる

```
git fetch --prune

//上記もしくは下記を使用

git pull --prune

//もしくは下記を使用

git remote prune
```

###追跡ブランチの確認

```
git branch -vv

//上記実行後に帰ってくる表示の [] の中がそれ
```
Windows 10 Homeへのリモートデスクトップ

# 始めに

ずいぶん前に書きかけていて、そのまま忘れていたものを見つけたので、投稿します。

マウスコンピュータのスティックPC(MS-NH1-AMZN)のOSは元々、Windows 8.1 with Bingでした。
で、これをWin 10にアップデートしたらHomeエディションになります。

Windows 10のHomeエディションはリモートでアクセス非対応で、対象方法があるのですが、決行はまったりしたので、その方法を備忘録として残しておきます。

![P_20160227_225726.jpg](https://qiita-image-store.s3.amazonaws.com/0/55302/248c870f-fb45-c510-4383-cdb4078e643b.jpeg)


# 使うソフト

[RDP Wrapper Library](https://github.com/stascorp/rdpwrap)
(2016年8月現在 Version 1.6.1が最新のようです)

# インストール

## 1. githubよりDL、install.batを実行

インストール直後は、Listener stateが"Not listening[not supported]"の表示です。
![2016-03-06.png](https://qiita-image-store.s3.amazonaws.com/0/55302/2cee3509-b670-2f65-2d33-764d4ea4f219.png)

## 2. update.batを実行

アップデートすると、私の環境ではListener stateが"Not listening"のままでしたが[not supported]→[fully supported]に変わりました。
![2016-03-06 (1).png](https://qiita-image-store.s3.amazonaws.com/0/55302/8775d6f8-7683-4529-2563-555d74d8ac7f.png)

## 備考

アップデート後もListener stateが"Not listening"の場合は、ホスト(Win 10 Home)側を再起動するとよいようです。
Listener stateが"Listening"に変われば準備OKです。
![2016-03-08.png](https://qiita-image-store.s3.amazonaws.com/0/55302/63d822f7-3799-720b-b748-e12f9293bab9.png)

# 設定

※あくまでも私の設定例ですので、環境に合わせて変更してください

## Security Mode
アクセス元はWin 8.1の端末なので、"Default Authentication"にしています。

## Session Shadowing Mode
シャドウモードを特に使用しないので、"Disable Shadowing"を選択しました。

# うまく動かない？
途中で固まる場合は、ホスト(Win 10 Home)側を再起動することでうまく動くようになりました。

# 参考
- [Windows10 homeをリモートデスクトップのホストにする方法](http://sakura86.seesaa.net/article/431918971.html)
- [Windows 8.1 with Bing で リモートデスクトップを使う方法　-　ジャンカーな日々](http://dorodorodoroid.hatenablog.com/entry/2015/07/17/214543)

# 終わりに
先人の方々の資料に感謝…
cocoapods インストール


cocoapods をサクッとインストールしようと思ったら、
なんだかんだと設定が必要だったので備忘録


```
$ sudo -E gem install cocoapods
ERROR:  Could not find a valid gem 'cocoapods' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - Errno::ETIMEDOUT: Operation timed out - connect(2) (https://rubygems.org/latest_specs.4.8.gz)
```
sudoすると元のユーザの環境変数が引き継がれず、Proxyの設定が無になっているそうです。Proxyの環境変数を引き継ぐようにしてみた

```
$sudo visudo
```

最終行に以下を追記してみた

```
Default   env_keep += "http_proxy https_proxy"
```
タイムアウトはしなくなったんだが。。。

```
$ sudo gem install cocoapods
Password:
ERROR:  Error installing cocoapods:
	activesupport requires Ruby version >= 2.2.2.
```

これは、gemのactivesupportがRubyは2.2.2を要求しているってことか。。

```
$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 2.0.14.1
  - RUBY VERSION: 2.0.0 (2015-12-16 patchlevel 648) [universal.x86_64-darwin15]
  - INSTALLATION DIRECTORY: /Library/Ruby/Gems/2.0.0
  - RUBY EXECUTABLE: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
  - EXECUTABLE DIRECTORY: /usr/local/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - universal-darwin-15
  - GEM PATHS:
     - /Library/Ruby/Gems/2.0.0
     - /Users/hijiri/.gem/ruby/2.0.0
     - /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
```

今はRUBY VERSIONが2.0.0か。。
どうやらactivesupport をインストールすれば良いらしい

```
 sudo gem install activesupport -v 4.2.6
Password:
Fetching: activesupport-4.2.6.gem (100%)
Successfully installed activesupport-4.2.6
Parsing documentation for activesupport-4.2.6
unable to convert "\x84" from ASCII-8BIT to UTF-8 for lib/active_support/values/unicode_tables.dat, skipping
Installing ri documentation for activesupport-4.2.6
1 gem installed
```

これでOKか？！

```
sudo gem install cocoapods
```

いけた！
ひとまず備忘録ってことで。
alternativesを使ってAmazon LinuxのRubyのバージョンを切り替える

- Amazon LinuxにRubyをインストールしたい
- デフォルトの2.0じゃ古すぎるので、新しいバージョンを入れたい
- rbenvでインストールするのは面倒くさい

という場合に本記事の方法が使えます。
Amazon Linuxのyumリポジトリには複数バージョンのRubyが入っているので、それでインストールして`update-alternatives`で切り替える方法です。

全部rootで実行

```bash
# 切替可能なバージョンのリストを表示
update-alternatives --display ruby

# インストール
yum install -y ruby23 ruby23-devel
# 切り替え
update-alternatives --set ruby /usr/bin/ruby2.3
# bundlerインストール
gem install bundler

# 確認
update-alternatives --display ruby
ruby --version
gem --version
```
Visual Studio 15 Preview 4 でtypescript2.0を試す。

[「The Visual Studio Blog」の8月22日の記事](https://blogs.msdn.microsoft.com/visualstudio/2016/08/22/visual-studio-15-preview-4/)に、 Visual Studio 15 Preview 4 で、typescript2.0(β)が試せるよと書いてあったのでお試ししてみた。

上記事から直リンクはられているVisual Studio 15 Preview 4のインストーラー(vs bootstrapper)をダウンロードして実行すると、以下のような画面が立ち上がる。![VS15.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/15875973-9df5-c894-c441-e28317a34b51.png)

いろいろ書いているけれど、typescript2.0をお試しするには、node.jsのところだけを選んでおけば良い(ついでに興味があるものを入れてみても良い。自分の場合はpythonも入れてみる)。

![VS151.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/a1f39f77-896f-d9f5-8fc6-b58868b4d942.png)

インストール後、起動してみて、nodeJSの基本プロジェクトを立ちあげ、typescript2.0で導入される、option型を書いて実行してみる。
なにか、言われるが、、


![VS152.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/e73083a6-1bbe-6ca1-dd93-11dd5a3f9ebb.png)*


そのまま実行すると、option型を含むコードが動作した。
*＃typescript2.0そのものの紹介記事は[こちら](https://www.infoq.com/jp/news/2016/08/typescript-20-beta-announced)

![VS153.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/a5e44599-e5fb-f5aa-aa97-3479984d9321.png)

逆に、[こちら](http://qiita.com/vvakame/items/ae239f3d6f6f08f7c719)にあるように、初期化していない配列にアクサスしてみると、ちゃんとエラーが出る。
![VS154.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/95d73282-9525-79b0-1f7c-6af789798f1e.png)

ということで、型あり言語として一歩進んだtypescript2.0、 Visual Studio 15 Preview 4 で今すぐ試せるよと、ということでした。
テキスト整形ツール作成用メモ

かじっただけのPythonで便利ツールを作るためのメモ。Pythonは簡単でいいなー。
NCプログラムの編集を想定。

- ファイルの中身を全て読み込んでリストに放り込む

```py
def readAll(fileName):
    with open(fileName, "r") as f
        ls = f.read().split("\n")
        return ls
#	f = open(fileName, "r")
#	ls = f.read().split("\n")
#	f.close()
	return ls
```

- 正規表現でコメント（かっこで囲まれた文字）を削除

```py
# 'O1000(SAMPLE)'
# → 'O1000'

import re

cmtptn = re.compile(r"\(.*?\)")
def removeComment(str):
	return cmtptn.sub("", str)
```

- 正規表現でいい感じにパース

```py
# 'G01X50.Y-50.Z-10.F500'
# → ['G01', 'X50.', 'Y-50.', 'Z-10.', 'F500']
ptr = re.compile(r"([A-Z#][^A-Z]+)")
def parse(str):
	p = ptr.findall(str)
	# print p
	return p
```

- 引数で受け取ったファイルの中身を読む

```py
import sys

if __name__ == "__main__":
	prm = sys.argv
	f1 = readAll(prm[1])

	for line in f1:
		print line
		# line = removeComment(line)
		# p = parse(line)

```

- ファイルに書き込み

```py
# printされたやつをリダイレクトしたほうが簡単そう
# open/writeするならwithを使う（readAll参照）
f = open(fname, "w")
f.write("foo")
f.close
```

- 辞書

```py
# coding: UTF-8

gcode = {
	"G00": u"位置決め"
	, "G01": u"直線補間"
}

# printするとき
print str(gcode).decode("unicode-escape")
```

- パース結果を辞書に含まれるやつのみにする

```py
filtered = filter( lambda cd:gcode.has_key(cd) , parsed)
```

- 辞書から表示名取得

```py
dsp = map( lambda cd:gcode[cd], filtered)
print str(dsp).decode("unicode-escape")
```

- 待ち合わせ判定

```py
# 判定条件が合っているかは微妙
wptn = re.compile(r"M\d{3,}P\d{2,}")
def isWaitCode(str):
	return wptn.match(str)
```

- 改行なしで標準出力

```py
def sysout(v):
	sys.stdout.write(str(v))

# 改行
def newline():
	sysout("\n")
```