OmniAICreator/Qiita-1.07M huggingface dataset:
three.jsで2Dゲームを作るときのアイデア

## はじめに

「[スカッシュゲームを作る（１） - S.F. Page](http://sfpgmr.hatenablog.jp/entry/2015/07/18/070043)」でレトロな２Ｄゲームを作ろうとしていて、描画をcanvasベースで作ろうか、WebGLベース（three.js）ベースで作ろうかと考えた。今作ろうとしてるゲームは極力凝ったグラフィックを排して、昔の質素なものにしようとしているので、canvasでも十分作れると思うのだが、将来的なことも見越してね。
描画は極力高速化したい。その場合は`canvas`ではなくWebGLを使ったほうがいいような気がする。おそらく今は`canvas`でもアクセラレートされるのかもしれないけども、3D的なエフェクトとか、ブレンド描画の豊富さとかを考えるとWebGL(three.js)ベースで作ろうかなと。

## three.jsで2Dゲームを作る時のアイデア

スクリーン座標は仮想的なものする。実画面サイズに座標を合わせるのではなくて、幅および高さは固定サイズとして、それを実画面に拡大縮小して投影するのである。例えば幅192ピクセル・高さ256ピクセルのゲーム画面を設定し、これを実画面サイズに合わせて拡大・縮小し表示するようにする。

座標は以下のように考える。

* X,Y座標は仮想スクリーン座標
* Z座標は拡大縮小や優先順位コントロール

となる。Z座標が0の時、仮想スクリーン座標に一致するように作ると、2D的な考えでゲームを作ることができる。

そうなるようにするためにはカメラのパラメータを以下のようにすればよい。

```js:
var WIDTH = 192;
var HEIGHT = 256;
var camera = new THREE.PerspectiveCamera(90 /* 視野角 */, WIDTH / HEIGHT /*アスペクト比*/, 0.1, 1000);
camera.position.z = HEIGHT / 2;
```

こうすると、z座標が0の時、仮想スクリーン座標に一致するようになる。透視投影になっているので、z座標を変えると拡大・縮小される。あと描画優先順位がコントロールできるようになる。ただz座標をいじると仮想スクリーン座標と一致しなくなるので、それなりの配慮は必要になるけれども。

次に実画面に合わせてこの仮想画面をフィットする方法だが、これは簡単である。アスペクト比を考慮し、実画面サイズにフィットする幅・高さを求め、それをWebGLレンダラの`setSize()`で設定するだけである。
実際の画面サイズがどうであれ、仮想スクリーン座標は維持される。実画面サイズに合わせて拡大縮小描画をしたりとかする必要もない。

```js:

const WIDTH = 192;
const HEIGHT = 256;
var screen_width;
var screen_height;

// アスペクト比を考慮し実画面サイズにフィットさせる幅と高さを求める
function calcScreenSize() {
    screen_width = window.innerWidth;
    screen_height = window.innerHeight;
    if (screen_width >= screen_height) {
        screen_width = screen_height * WIDTH / HEIGHT;
    } else {
        screen_height = screen_width * HEIGHT / WIDTH;
    }
}

calcScreenSize();

var renderer = new THREE.WebGLRenderer({ antialias: false /*, sortObjects: true */ });
renderer.setSize(screen_width, screen_height);

```

これを使ったサンプルは以下である。

http://bl.ocks.org/sfpgmr/affd4145baae4c32b76c
unix > int getopt(int argc, char **argv, char *opt) > 引数のどこまでを解析したのかを憶えており

引用: プログラミングテクニック UNIXコマンドのソースコードにみる実践プログラミング手法 by 多治見寿和さん

```
int getopt(int argc, char **argv, char *opt)
```
> ...また、引数のどこまでを解析したのかを憶えており、次に同じ引数で呼び出したときには前回解析した次の場所から解析を続けます。
OPアンプ > 反転増幅回路 > R3 = (R1とR2の並列抵抗値)

参考: オペアンプ基礎回路再入門 by 岡山努さん > 2.4

![schemeit-project.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b85fb84f-4ee7-6723-88af-0da924ea5641.png)

> (3)バイアス電流の補償法
> オペアンプA1の+入力端子と-入力端子に流れるバイアス電流が完全に等しければ、R3 = (R1とR2の並列抵抗値）とすることでバイアス電流の影響を消去できます。

R3の値についてはいくつかの本や雑誌で「R1とR2の並列抵抗値がいい」と書いてあった。

しかしながら「何故」なのか回路の計算からはまだ理解できていない。
注文APIにおける、SellerId is not specified px-04001について

Yahoo APIの注文検索APIへリクエストを行ったところ、
「 "SellerId" is not specified px-04001」
というエラーが返却されております。

注文ステータス別件数参照APIでは、GETですが同一セラーIDで問題なく件数を取得できていますので
セラーIDは間違っていないと思います。

以下にソースとレスポンスを記しますが、何か別の設定等を行わなければいけないのでしょうか？

よろしくお願いいたします。
***
\$url = "https://test.circus.shopping.yahooapis.jp/ShoppingWebService/V1/orderList";
\$data = http_build_query(
array(
    '/Req/SellerId' => 'セラーID', 
    '/Req/Search/Field' => 'OrderId',
    '/Req/Search/Condition/OrderTimeFrom' => '20150701000000',
     )
);
\$header = array(
    'Content-Type: application/x-www-form-urlencoded', 
    'Content-Length: ' . strlen(\$data),
    'Authorization: Bearer ' . \$access_token, 
\);
\$options =array(
    'http' =>array(
        'method' => 'POST',
        'content' => \$data, 
        'header' => implode("\r\n", \$header),
        'ignore_errors' => true ,
    )
);
\$result=file_get_contents(\$url, false, stream_context_create(\$options));
print_r( array(\$result, \$header, \$options));
***
Array
(
    [0] => <?xml version='1.0' encoding='UTF-8' ?>
\<Error>
\<Message>"SellerId" is not specified</Message>
\<Code>px-04001</Code>
\</Error>
    [1] => Array
        (
            [0] => Content-Type: application/x-www-form-urlencoded
            [1] => Content-Length: 123
            [2] => Authorization: Bearer 
アクセストークン
        )
    [2] => Array
        (
            [http] => Array
                (
                    [method] => POST
                    [content] => %2FReq%2FSellerId=セラーID&%2FReq%2FSearch%2FField=OrderId&%2FReq%2FSearch%2FCondition%2FOrderTimeFrom=20150701000000
                   [header] => Content-Type: application/x-www-form-urlencoded
Content-Length: 123
Authorization: Bearer 
アクセストークン
                    [ignore_errors] => 1
                )
        )
電子回路 > GBP / ゲイン帯域幅積 > カスケード接続

参考: オペアンプ基礎回路再入門 by 岡山 努さん

この本を読んでいて、GBP (ゲイン帯域幅積 / 利得帯域幅積)をどういう時に使うのかなんとなくのメモ。

ゲインを1000倍などにしたい場合、OPアンプを一段でなくカスケード接続で二段にする。一段にした場合、「周波数 vs 電圧利得」のグラフで見た時に高い周波数でゲインが下がっていくのが分かる。つまりGBPに制限がある。

カスケード接続にした場合は、ゲインが下がる周波数を高くすることができる(GBPを大きくできる？）。そういう理由から 1000倍のゲインでは 33 * 33 として二段で増幅するようだ。
クラス > トレイト > ロール@Perl / トレイト@PHP / mixメソッド@Ruby

引用: コーディングを支える技術 by 西尾泰和さん

> トレイトはSqueakで最初に導入されました。また、Scalaもトレイトを持っています。...Perl6にはトレイトに似た機能がロールという名前で導入されています。PHPでも5.4から導入されます。Rubyにも2.0でモジュールをトレイト風に扱うためのmixメソッドが導入されます。
クラス > トレイト (メソッドの束) / いくつかの機能をまとめるためだけのもの

@ コーディングを支える技術 @ 西尾泰和さん > 12.3 多重継承の問題点

> 解決策4: トレイト
> クラスには２つの相反する役割があります。１つ目は「インスタントを作るためのもの」という役割で...2つ目は「再利用の単位」...
> クラスが「インスタント作るためのもの」として使われているときには、再利用の単位として大きすぎるのです。それならば、再利用の単位という役割に特化した、もっと小さい構造（<font color=red>トレイト=メソッドの束</font>）を作ればよいのではないか？

<hr>
http://php.net/manual/ja/language.oop5.traits.php
> トレイトは、単一継承の制約を減らすために作られたもので、 いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用できるようにします。
>...
> トレイトはクラスと似ていますが、トレイトは単にいくつかの機能をまとめるためだけのものです。 トレイト自身のインスタンスを作成することはできません。
技術英語 > expected to work only on arrays or tables [of a certain size]

引用: Code Complete > Commenting Routines

> If the routine is expected to work only on arrays or tables <font color=red>of a certain size</font>, indicate that.

確かに、実装時にあるサイズの上限で実装していて、そのコードを後々メンテする時にその上限がわからずに変更すると困ったことになる。

<hr>
https://github.com/Havodion/PredictDatabaseSize

> Calculate the projected size of a table <font color=red>with a certain amount of</font> records.

<hr>
https://github.com/xianc/Warble

> A microblogging web application that allows users to upload files <font color=red>of a certain size</font>
体験して学ぶJavaScript Webアプリ編１

「体験して学ぶJavaScript Webアプリ編」の第１回です。
このシリーズでは、初めてWebアプリを作る方向けにJavaScriptの解説を致します。
プログラミング言語としてのJavaScriptというよりは、「アプリを作れるようになる」というところに主眼を置いています。

# 準備

必要なもの

* Google Chrome([こちら](https://www.google.co.jp/chrome/browser/desktop/))
* テキストエディタ([Sublime Text](http://www.sublimetext.com/)がおすすめ)

## Chromeのキャッシュを無効にする。
![スクリーンショット 2015-07-21 5.37.21.png](https://qiita-image-store.s3.amazonaws.com/0/20848/e5dd23e5-60e5-725e-21ec-999824e6acec.png)

option+command+iを押し「developer console」を開きます。
画像のように、Disable cacheにチェックを入れます。

# 開発をはじめます

## コンソールに文字を表示する
テキストエディタでindex.htmlという名前のファイルを作成し、以下の内容を書いてください。以下をコピーしても構いません。
そしてGoogle Chromeでindex.htmlを開いてください。


```html
<script>
console.log('Hello');
</script>
```

Developer Consoleに"Hello"と表示されます。

![スクリーンショット 2015-07-21 5.34.44.png](https://qiita-image-store.s3.amazonaws.com/0/20848/2865879a-ff91-d4c2-4827-512e7624bf06.png)

## 画面に文字を表示する

HTML要素をJavaScriptで操作して、画面に文字を表示します。

```html
<p id="content"></p>
<script>
var elem = document.getElementById('content');
elem.textContent = "Hello"
</script>
```

![スクリーンショット 2015-07-21 5.37.41.png](https://qiita-image-store.s3.amazonaws.com/0/20848/29635a17-b656-7209-2a1f-1cb4e6cd4557.png)

HTMLのpタグを下に書く場合は、以下のようにwindow.addEventListenerでブラウザの'load'イベントに関数を登録し、その中で要素を取得しなければ行けません。この関数はブラウザの読み込みが完了すると実行されます。

```html
<script>
window.addEventListener('load', function() {
	var elem = document.getElementById('content');
	elem.textContent = "Hello"	
}, false);
</script>
<p id="content"></p>
```

次は「ボタン」を使ってみましょう。
「白」が押されると"白が押されました。"と表示され、「黒」が押されると"黒が押されました。"と表示されます。


```html
<script>
window.addEventListener('load', function() {
	var content = document.getElementById('content');
	var white = document.getElementById('white');
	var black = document.getElementById('black');
	white.addEventListener('click', function(e) {
		content.textContent = "白が押されました。";
	});
	black.addEventListener('click', function(e) {
		content.textContent = "黒が押されました。";
	});
}, false);
</script>
<button id="white">白</button>
<button id="black">黒</button>
<p id="content"></p>
```



次回に続きます。
Ruby - Lotusチュートリアル(1)


# Lotusとは

Ruby製のWEBアプリケーション用MVCフレームワークです。
最小限のDSLで構成されており、Rubyを書けるのであればそれほど学習コストが高くありません。
また、デフォルトでドメイン層をEntityとRepositoryで実装できるのが特徴です。
詳しくは公式のドキュメントを読むとよいでしょう。
http://lotusrb.org/guides/

# プロジェクトの作成

さて、早速アプリケーションを作っていきます。
今回はスレッドフロート型掲示板を作ろうと思います。(2chみたいなやつ)

まずはgemをインストールしてアプリケーションを初期化します。

```shell-session
gem install lotusrb
lotus new lotus_bbs --database=postgres --test=rspec
cd lotus_bbs
bundle install --path .bundle
```

ディレクトリ構造はこんな感じ

```shell-session

tree -L 1
.
├── apps
├── config
├── config.ru
├── db
├── Gemfile
├── Gemfile.lock
├── lib
├── Rakefile
└── spec
```

準備が整ったので、サーバを起動して動作確認をします。
`bundle exec lotus server`
とコマンドを打ち下記urlにアクセスできればOKです。
http://localhost:2300

# TOPページ作成
次に画面に表示されているコマンドを打ってみます。
`bundle exec lotus generate action web home#index --url=/`
いくつかのファイルが生成され、もう一度先ほどのurlにアクセスすると真っ白なページが表示されます。
これだと味気ないので`apps/web/templates/home/index.html.erb`を下記のように編集します。

```erb
<h1>掲示板TOP</h1>
```

これでTOPページができました。
生成されたファイルについては後ほど説明していきます。
xbindkeys + xdotoolを使い無変換キーを押すとAlt+Tabを実行

## 参考

* [unity - Is there a way to send the switch windows signal without "Alt-Tab"? - Ask Ubuntu](http://askubuntu.com/questions/302626/is-there-a-way-to-send-the-switch-windows-signal-without-alt-tab)
* [xbindkeysで捗るお話 - ぺんぎんさんのめもちょう](http://d.hatena.ne.jp/penguin2716/20140114/1389725926)

## インストール

```bash:インストール
sudo apt-get install -y xdotool xbindkeys
```

## xdotoolで実行させたいことを記述

```bash:~/bin/alttab.sh
xdotool keydown alt
sleep .1
xdotool key Tab key alt
```

```bash:
chmod +x ~/bin/alttab.sh
~/bin/alttab.sh
```

期待通りの動きをすることを確認。

## xbindkeysでxdotoolを割り当て

### キーマップ確認

```bash:割り当てたいキーのキーマップ確認
$ xbindkeys -k
Press combination of keys or/and click under the window.
You can use one of the two lines after "NoCommand"
in $HOME/.xbindkeysrc to bind a key.
"(Scheme function)"
    m:0x0 + c:102
    Muhenkan
```

### 割り当て

```bash:~/.xbindkeysrc
"~/bin/alttab.sh"
    m:0x0 + c:102
    Muhenkan
```

## 起動

```bash:xbindkeysを再起動
killall xbindkeys
xbindkeys
```
Faker@PHPでダミーデータを作る


ダミーデータを作らないといけないことはよくあります。[Faker](https://github.com/fzaninotto/Faker)を使ってダミーデータを作ってみます。

##インストール

compoerを使う。

```bash
composer require fzaninotto/faker
```

何も指定しなければ、最新版が入る（2015/7/20現在では1.5）。
testディレクトリを作ってそこで作業する。

```bash
mkdir test
cd test
composer require fzaninotto/faker
```

そうするとvendorフォルダができるので、autoload.phpを読み込んで利用する。

##生成してみる（素のPHP）

個人的に利用するものだと、こんな感じ。

```php
<?php

	require_once './vendor/autoload.php';

	$faker = Faker\Factory::create('ja_JP');

	$gender = ['男','女'];

	for($i=0; $i<10; $i++)
	{
		echo $faker->name."<br>";
		echo $faker->address."<br>";
		echo $faker->userName."<br>";
		echo $faker->password."<br>";
		echo $faker->email."<br>";
		echo $faker->phoneNumber."<br>";
		echo $faker->date($format='Y-m-d',$max='now')."<br>";
		echo $faker->creditCardNumber."<br>";
		echo $faker->randomElement($gender)."<br>";
		echo $faker->regexify('[1-9]{3}-[0-9]{4}')."<br>";
		echo "<hr>";
	}
```

で、こんな出力。

```
山田 篤司
2179693 青森県山岸市東区原田町大垣7-2-1 コーポ中島102号
uno.taro
75D
uno.momoko@yahoo.co.jp
090-1186-9018
1975-09-03
5540806828245734
男
735-4103
----------
松本 七夏
2743930 鹿児島県鈴木市西区大垣町江古田7-10-6
akira69
Rv_~@)cdr!y!
qtanabe@nagisa.jp
080-8725-8522
2012-11-11
4707240418342598
男
115-3280
```

###便利な点

通常のコマンドはもちろんですが、

* randomElement(array)でこちらで用意した配列から生成可能。社内独自コードなどを利用する際に便利。
* regexify('')で正規表現が使えるのでほぼ何でもあり。

###気づいた点

先人様のお陰で大変便利なのですが、いくつか注意？も。

* addressは頭に郵便番号？が入るので、住所だけ欲しい場合はスペースでsplitとかする必要がある。
* 誕生日などを得たい場合、date()を使いたいがunixtimeより前の年は得られない？みたい。
* 当然ですが、氏名とIDとかemailとかが一致するわけではない（名前 山田太郎、email suzuki@yahoo.co.jpとか）。

まあ、randomや正規表現（regexify())が使えるのでおこのみでなんとでもなりますが。

##Laravelの中で使う

laravelにはFakerがはじめから組み込まれています。なので、Seederの中で使うことでダミーデータが簡単につくれます。Seederの使い方はlaravelのドキュメントをどうぞ。5.1からartisanでseederのテンプレートも作れるようになったみたいです。

こんな感じ。

```php
<?php

use Illuminate\Database\Seeder;
use App\User;

class UserTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        //一旦削除
        DB::table('users')->delete();
			
		 //faker使う。普通に使う場合と同じ。
        $faker = Faker\Factory::create('ja_JP');

        for($i=0; $i<10; $i++)
        {
        	User::create([
        		'username'=>$faker->userName(),
        		'password'=>$faker->password(),
        	]);
        }
    }
}
```

##その他

他に使えそうなプロバイダ（コマンド）としては、

###文字系

* sentence($nbWords = 3)。
* paragraph($nbSentences = 3)。
* text($maxNbChars = 100)。

###バーコード系

* ean13
* isbn13


など。
残念ながら日本語には対応していないようですが、テキストエリアを埋めるには何もないよりいいです。
その他、数多くのプロバイダがありますので、是非[本家サイト](https://github.com/fzaninotto/Faker)を確認してみてください。
bondingのpolicyを変更する

# ああああああああ＼(^o^)／ｵﾜﾀ

trafficの偏りを避けるために事前にbondingの設定を変更しておこうと思ったら、
サーバが帰らぬ人となったので一応メモ

# 注意点

途中でbonding moduleをアンロードするタイミングでnetworkの疎通がﾊﾞﾁｺｰﾝってとれなくなるので、Script組んで実行しましょうってだけ。

# 実行command

```bash
$ cat << EOF >> bonding.sh
echo "alias bond0 bonding" > /etc/modprobe.d/bonding.conf
echo "options bond0 mode=4 lacp_rate=0 miimon=200 xmit_hash_policy=layer2+3" >> /etc/modprobe.d/bonding.conf
modprobe -r bonding
service network restart
EOF
$ sudo sh bonding.sh
```

それだけ、アタリマエのことだけど注意深くオペレーションしないとね、、、
特にリモートでやってたりするとね、、、

おしまい
Jenkins Mavenでのビルドジョブ実行時にエラーが出てはまった時の対処

#エラー内容（コンソール出力）
[ERROR] COMPILATION ERROR : 
[ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
･
･
･
→とりあえずJDKの設定内容を見直す。

#結果手っ取り早くJDKを再インストール
既存のJDKをアンインストール

```
sudo rpm -e jdk[バージョンナンバー]
```

#最新rpmファイルをダウンロードする。
http://www.oracle.com/technetwork/java/javase/downloads/

/usr/java上でrpm install を実行するも失敗･･･

```
#rpm -ivh jdk-xxx-linux-i586.rpm
```
Error: unpack could not create JAR file:等のメッセージが･･･

#一旦アンインストール

```
# rpm -qa | grep jdk
# rpm -e jdk1.8.0_51-1.8.0_51-fcs.i586
```

#必要パッケージのインストールからのjdk再インストール

```
#yum install ld-linux.so.2
#yum install libgcc_s.so.1
#rpm -ivh jdk-xxx-linux-i586.rpm
```
インストール成功

#パス設定
```
# vi /etc/profile ※ユーザー全体で設定の際
$ vi ~/.bash\profile ※特定ユーザーで設定の際
JAVA_HOME=/usr/java/default
MAVEN_HOME=/usr/local/apache-maven-3.3.3
export JAVA_HOME MAVEN_HOME
export PATH=/usr/java/default/bin:${MAVEN_HOME}/bin:$PATH
export CLASSPATH=.:/usr/local/default
```

#Jenkinsの管理→システムの設定でMave,JDKの環境変数パス等の再確認。

#Jenkins上でジョブ実行
エラー解消された。
Braincrash by QPython

```py:braincrash.py
from __future__ import print_function
from sys import stdin,stdout
from brainfuck import Brainfuck
from brainfuck import op
class Braincrash(Brainfuck):
    def __init__(s,OPs="><+-.,[]|&~^",size=30000):
        Brainfuck.__init__(s,OPs,size)
    def const(s,OPs):
        Brainfuck.const(s,OPs)
        s.opDic[OPs[8]]=opOr # op |
        s.opDic[OPs[9]]=opAnd # op &
        s.opDic[OPs[10]]=opNot # op ~
        s.opDic[OPs[11]]=opXor # op ^
    def run(s,limit=1000,out=stdout):
        Brainfuck.run(s,"Hello, world!",limit,out)
        while s.pt<len(s.mem) and s.mem[s.pt] != 0:
            out.write(chr(s.mem[s.pt]))
            s.pt+=1
#end class
class opOr(op):
    def do(s,bf):
        bf.mem[bf.pt]|=bf.mem[bf.pt+1]
        bf.pt+=1
        bf.pc+=1
#end class
class opAnd(op):
    def do(s,bf):
        bf.mem[bf.pt]&=bf.mem[bf.pt+1]
        bf.pt+=1
        bf.pc+=1
#end class
class opNot(op):
    offset = int("1"*8,2)
    def do(s,bf):
        bf.mem[bf.pt]^=s.offset
        bf.pc+=1
#end class
class opXor(op):
    def do(s,bf):
        bf.mem[bf.pt]^=bf.mem[bf.pt+1]
        bf.pt+=1
        bf.pc+=1
#end class
```
Brainfu*kでHello World! by QPython

```py:brainfuck_run.py
from brainfuck import Brainfuck
bf = Brainfuck(size=10)
bf.compile(">+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.>>>++++++++[<++++>-]<.>>>++++++++++[<+++++++++>-]<---.<<<<.+++.------.--------.>>+.")
#bf.run(limit=1000)
from cStringIO import StringIO
sio = StringIO()
bf.run(limit=1000,out=sio)
p = sio.getvalue()
sio.close()
print p
```
Brainfu*k by QPython

brainfuck.py

```py
from __future__ import print_function
from sys import stdin,stdout
class Brainfuck:
    def __init__(s,OPs="><+-.,[]",size=30000):
        s.clear(size)
        s.const(OPs)
        #return super().__new__(self)
    def compile(s,code):
        s.prgs = []
        tmps = []
        for op in code:
            if not op in s.opDic:
                continue
            prg = s.opDic[op]()
            prg.idx = len(s.prgs)
            if prg.block1:
                tmps += [prg]
            elif prg.block2:
                prg1 = tmps.pop()
                prg.op1 = prg1
                prg1.op2 = prg
            #end if
            s.prgs += [prg]
    def run(s,defmem=None,limit=1000,out=stdout):
        s.pc = 0
        s.out = out
        if not defmem is None:
            s.write(defmem)
        step = 0
        while s.pc<len(s.prgs):
            s.prgs[s.pc].do(s)
            step+=1
            if step > limit:
                raise RuntimeWarning("step limit(%s) over!"%(limit))
                break
    def clear(s,size=None):
        if size is None:
            size = len(s.mem)
            print("size:%d"%size)
        s.mem = bytearray(size)
        s.pt = 0
    def write(s,datam):
        for idx,data in zip(range(len(datam)),datam):
            s.mem[s.pt+idx] = data
    def const(s,OPs):
        s.opDic = {}
        s.opDic[OPs[0]]=opNxt # op >
        s.opDic[OPs[1]]=opPrv # op <
        s.opDic[OPs[2]]=opInc # op +
        s.opDic[OPs[3]]=opDec # op -
        s.opDic[OPs[4]]=opOut # op .
        s.opDic[OPs[5]]=opInp # op ,
        s.opDic[OPs[6]]=opJp1 # op [
        s.opDic[OPs[7]]=opJp2 # op ]
#end class
class op:
    block1 = False
    block2 = False
#end class
class opNxt(op):
    def do(s,bf):
        bf.pt+=1
        bf.pc+=1
#end class
class opPrv(op):
    def do(s,bf):
        bf.pt-=1
        bf.pc+=1
#end class
class opInc(op):
    def do(s,bf):
        bf.mem[bf.pt]+=1
        bf.pc+=1
#end class
class opDec(op):
    def do(s,bf):
        bf.mem[bf.pt]-=1
        bf.pc+=1
#end class
class opInp(op):
    def do(s,bf):
        bf.mem[bf.pt] = stdin.readline()
        bf.pc+=1
#end class
class opOut(op):
    def do(s,bf):
        #print(chr(bf.mem[bf.pt]),end="")
        bf.out.write(chr(bf.mem[bf.pt]))
        bf.pc+=1
#end class
class opJp1(op):
    block1=True
    def do(s,bf):
        if bf.mem[bf.pt]==0:
            bf.pc = s.op2.idx
        bf.pc+=1
#end class
class opJp2(op):
    block2=True
    def do(s,bf):
        if bf.mem[bf.pt]!=0:
            bf.pc = s.op1.idx
        bf.pc+=1
#end class      
```
環境変数PATHが長すぎて、追加したパスが有効にならないぜ！

ならば削ればよかろうなのだッ。

グローバルな %PATH% から削ると問題でそうなので、コマンドラインから呼び出しそうにないパスだけ、.nyagos で削ればよいのだ。

```lua:%USERPRFILE%\.nyagos
-- Remove %PATH%
do
    local paths = {}
    for dir in string.gmatch(nyagos.env.path,"[^;]+") do
        if not string.find(dir,"Intel") and 
            not string.find(dir,"Lenovo",1,true) and
            not string.find(dir,"Skype",1,true) and
            not string.find(dir,"SQL Server",1,true) and
            not string.find(dir,"TypeScript",1,true) and
            not string.find(dir,"Performance",1,true) and
            not string.find(dir,"Windows Kits",1,true) then
            paths[#paths+1] = dir
        end
    end
    nyagos.env.path = table.concat(paths,";")
end
```

- 4.0.9 の nyagos では環境変数を nyagos.env.xxxxx といった形で「読書き」できる（大文字・小文字も区別しない）
- nyagos限定の記事でも、タグを「nyagos」だけに限れば、関心ない人のタイムライン汚さないよね（まぁ、ストック数はゼロだろうけど、気にしないようにしよう。それよりも「情報がない」とか言われる方がアレだから）
VirtualBoxでストレージサイズを拡張する(Linux Mintの場合)

# VirtualBoxでストレージサイズを拡張する(Linux Mintの場合)

VirtualBoxでLinux Mintを可変ストレージでセットアップしていたが、
いろいろインストールしたらデフォルトの8GBに達してしまい、
拡張が必要になったため、その手順をメモ

## ストレージサイズを拡張する
ストレージサイズの拡張はコマンドラインでしかできないみたい
resizeオプションにて拡張後のサイズ(MB)を指定する

```
C:\>"c:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyhd <vdiファイルのパス> --resize 20480
```

## ゲストOSのパーティションを変更する
### 起動CDをマウントする
* VirtalBoxマネージャからVMイメージを選択して[設定] > [ストレージ] > コントローラ:IDE の "空" を選択し、
CD/DVDドライブの右側にあるCDアイコンで起動ディスクのisoファイルを指定する　　
今回はインストールにも使用した`linuxmint-17.1-xfce-64bit.iso`を使用

* Welcome to Linux Mint ～ というメニューが表示されたら `Start Linux Mint` を選択してEnter

### gpartedを起動する  
terminalを起動して下記のように実行する

``` shell
$ sudo gparted
```

### スワップパーティションを削除する
今回システムパーティションである/dev/sda1を拡張したいのだが、
後ろに/dev/sda2が存在しているため、拡張ができない。
/dev/sda2はスワップパーティションだけなので、一旦削除して、拡張後にスワップパーティションを追加し直す。

1. /dev/sda2(extended)とその配下の/dev/sda5(linux-swap)を削除する
1. /dev/sda5(linux-swap)を右クリックしてswap offを選択する
1. /dev/sda5を右クリックしてdeleteを選択する
1. /dev/sda2を右クリックしてdeleteを選択する

### パーティションのサイズを増やす
1. 拡張したいパーティション（今回は/dev/sda1）を選択しResize/Moveを選ぶ
1. New size (MiB) に拡張後のサイズを入力する
1. Resize/Moveをクリックする

### スワップパーティションを追加する
1. extendedパーティションを追加
    1. unallocatedを右クリックしNewを選択する
    1. New size(MiB) に swap パーティションのサイズを入力 4096
    1. Create as : でExtended Partitionを選択する
    1. Add をクリックする
    1. New Partition #1ができる

1. スワップパーティションを追加
    1. New Partition #1 の配下のunallocatedを右クリックしNewを選択する
    1. FIle system: でlinux-swapを選択する
    1. Add をクリックする  

1. Applyをクリックして、これまでの作業を確定させる

ここで/dev/sda2の配下にスワップパーティション以外に1MiBのみunallocatedが余ってしまった。 
再度インストールCDから起動してスワップパーティションをリサイズしたら、
unallocatedが消えて、スワップパーティションだけになってすっきりした。
なんだったんだろう。。。

おわり
よいAWSエンジニアが行なっている仕事を進めるためのテクニック


# はじめに

AWS関連の仕事について2年になります(エンジニアとしてはもうすぐ1年です)。この業界急成長中だけあってよいエンジニアがたくさんはいってきます。いろいろなタイプのエンジニアがいるのですが、共通点みたいなものもあるように見えました。
というわけで、気づいた範囲でまとめてみました。ちなみに戒めとして書いているので自分には出来ていないことが多いです。自分の無能さにだんだん書いていて悲しくなってきました。
また、主観で抜け漏れもあるとおもいます。コメントもらえれば、他の方の参考にもなるとおもいますので是非おねがいします。

# よいAWSエンジニアが行なっている仕事を進めるためのテクニック

## ゴールを明確にする

何のためのそれを行なうのか? というのを常に意識しています。ゴールに向わないと思う作業であれば、調整して修正します。何のために行なうのか? というのは常に頭の中にあるようです。

自分は目の前の問題に注目して、目的を忘れることが多いので最初にこれをもってきました。

これAWSと関係ないという人もいるかもしれませんが、AWSでのシステム開発はとにかく期間が短いので余計なことしている時間が少ないです。昔ならハードウェアの調達待ちとかで数ヶ月というスケジュールだったものが「3日で」というような話もあります。ということで、何をゴールにするかというのを意識するのは超重要です。ほんとうに3日の納期なのか? だとすれば何を優先するか? とかですね。

## 話を良く聞く

相手の言っていることを良く聞いています。AWSの提供するサービスは範囲が非常に広く、それに伴ない話をする人のレベルも要求もばらばらです。そこを解きほぐしてゴールを目指す必要があるので、優秀な人は相手の意図を的確によみとります。心まで読まれているようで恐ろしいなと思うこともあるわけですが。。。

また、話をしっかり聞いてくれる人は信頼感もあがりますよね。短かい期間で信頼度をあげるのも重要なテクニックです。

話している人がわかってない部分についてもおしえてくれたりもします。言い方きつい時がありますが。。。

## 短かいレイテンシ

なんらかの質問やリクエストに、すぐに応答がかえってきます。すぐに終わらない仕事の場合は仕事の方向にブレがないことを確認するため、短かい期間でチェックを入れる等を好みます。多少のオーバーヘッドがあったとしても、最終的には目的に最短で辿りつく方法です。
一緒に仕事しているといつもボールはこちら側という事態になって困ることもあります。

## 3手先を考える

自分がこういう事をいったとして、相手がこう言うだろう、それに対して自分はこう答える、ということが徹底しています。
データを元に話すのを好む人であればデータを。結論から先に入るのが好きな人であれば、結論を先に。人によって話し方もかわってます。

## なぜなぜ5回

なぜ、それを行なう必要があるのか? 深く考えています。そういう積み重ねをしていって美しいアーキテクチャを持つシステムをつくっているようです。おなじAWSのシステムでも深く考える人がつくるとトラブルが少ないと感じます。

## すぐ試す

上と矛盾しているかもしれませんが、AWS上で試せることはすぐ試します。考えより実証のほうが信頼できます。

## 段取り力

ゴールがはっきりしたら、そこへ向かうのに必要な段取りを組みます。一人で出来ないことであれば、周りにゴールとその理由を共有して、その段取りも共有します。不明なところがあれば、その意図も説明します。状況がかわったら、その部分の影響を判断し組み換えます。

これはトラブルプロジェクトで上司にいわれた言葉です

「うまくいった話はいいから、問題だけ教えてくれ」

言われると辛いのですが、段取りに影響のある部分を常に意識しているからの台詞だとおもいます。

## コード力

優秀なエンジニアでコード書けないというのはありえないと感じます。本職のプログラマではないので美しいコードを書くというわけではないのですが、論理は明確なコードです。最近のリリースサービスはソフトウェア側にどんどん寄っているので、コード力は今後さらに重要になるとおもいます。

javascript勉強しなくちゃ。

## 英語力

AWSは日本語情報が豊富だとおもいますが、新しい機能は英語のみのことがほとんどです。というわけで、英語能力(ドキュメント理解力)高い人がおおいです。話せる人も多いですが、優秀な人の条件に必須というほどではない気もしています。USの人とはなしたいときというのはAWS関連のサービスなのですが、ADSJの人がうまく通訳してくれるのでというのが理由です。ADSJの人最高です。

## 技術は深く広く

なんでそんなにいろいろ知ってんだ? というくらい幅広い人がおおいです。さらに得意分野の深さも半端ないです。でも全てに深いというわけではないです。幾つかの得意分野は超絶深く、それ以外は話ができる程度にという感じです。

また、学習能力が高い人がおおいです。そのサービスについて知らなかったはずなのにわずか数週間でおそろしく詳しくなります。うらやましいです。

## 話/ブログがおもしろい

なんでなんですかね? みなさん話がおもしろいです。うらやましい。ブログ書いている人はブログおもしろいですね。
最近の弊社メンバーのおすすめは[ロードバランスすだちくん](http://elasticneko.tumblr.com/)です。ちなみに「すだち」は猫の名前だそうです。

# おわりに

この2年ほどにあった20人くらいの優秀な人を思いうかべて書いてみました。仕事のテクニックとかいていましたが、だんだん脱線してしまった気がします。思いうかべた人に共通しているのは、

- (口では嫌といってても)仕事が好き
- 死にそうなほど働いている(もしくはときがある)。
- 楽しそうにしている

です。まとめると『Work Hard, Have Fun, Make History』 を体現しているのがよいAWSエンジニアってことで。
Meteor + Electronでブラウザアプリを作った

#Syng
![Compass_with_white_needles_512.png](https://qiita-image-store.s3.amazonaws.com/0/36652/35c5960b-cc75-929d-0719-2c45c404f49e.png)

Twitterの友達と一緒にネットサーフィンを楽しめるアプリを作りました。MeteorとElectronで。
![スクリーンショット 2015-07-15 16.42.25.png](https://qiita-image-store.s3.amazonaws.com/0/36652/238f74c6-5cab-5971-c0cb-020ba7ef8189.png)

作ったものはここからDLできます
https://dl.dropboxusercontent.com/u/89640477/syng/Syng.dmg

ここでは、作っていて気づいたことを書いていきます。

##自動更新は諦めました
Electronには自動更新機能がついており、サクッと実装できるみたいに書いてありましたが、ドキュメントがよくわからなかったので結局自動更新は諦めました。
読んだ感じ、更新があったら204を返して、更新がないなら201みたいな感じらしいです。次作るときは実装します！

##jsコードは、わりとどっからでも取ってこれる
electronのサンプルだと、コードはローカルからが一般的ですが、```<webview/>```に```nodeintegration```オプションをつけたり、<script />に```node.js```のコードを書いても実行してくれます。

##それっぽいインストーラが簡単に作れる
![スクリーンショット 2015-07-20 23.19.10.png](https://qiita-image-store.s3.amazonaws.com/0/36652/3c8cf7e2-3941-b682-2380-0c91a975ef98.png)

配布するときは、```.dmg```にして、おしゃれに配布したいなーと思っていたのですが、```electron-builder```を使って、簡単にできました。やってはいませんが、```wine```をインストールすればWindowsインストーラをMacで作ることも可能っぽいです。

#さいごに
プログラミングの相互フォロワー募集中です
[@endows_takashi](https://twitter.com/endows_takashi)
IE11でGoogleMapのマーカが表示されなくなった場合の対処


## http://chart.apis.google.com/chart? はセキュリティ証明書の問題により表示されない。

![スクリーンショット_072115_123655_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/11476/0109f31b-da88-0ecd-c578-ca1faf15dcc8.jpeg "スクリーンショット_072115_123655_AM.jpg")


## URLを変更することで表示されるようになる

```
http://chart.apis.google.com/chart?chst=d_bubble_text_small_withshadow&chld=bb|100|2AE|fff
```
↓

```
http://chart.googleapis.com/chart?chst=d_bubble_text_small_withshadow&chld=bb|100|2AE|fff
```
実質的にSPなVisual Studio 2013 Update5がリリース

#ダウンロード場所
- [Visual Studio 2013 Update 5](http://go.microsoft.com/fwlink/?LinkId=519378)
- [詳細説明](https://support.microsoft.com/en-us/kb/3021976)

#サポート情報

SPと考えているので、Update5がリリースされた2015/7/20から1年後に、Visual Studio 2013 RTMのサポートが終了。

>Support for Visual Studio 2013 is only provided on this current update, which is considered the Visual Studio 2013 Service Pack. The Visual Studio 2013 RTM version, released in November of 2013, will only be supported for one year after the release of this current update. 

#特徴
バグフィックスがメインぽいけど、次の2つの機能が搭載。

- [Azure使った負荷テスト](http://blogs.msdn.com/b/visualstudioalm/archive/2015/04/30/load-test-enhancements-in-release-candidate-of-visual-studio-2015-enterprise-edition.aspx):VS2015向けにリリースされていたのがVS2013でも可能に。
- [カンバン開発の何か](https://www.visualstudio.com/en-us/news/2015-mar-10-vso.aspx)
誰でも出来るおーぷんそーすこんとりびゅーと

オープンソースソフトウェアのちょっとしたお話
[OSS Hack 4 Beginners](http://www.seplus.jp/sezemi/4beginners/)に参加して学んだことをふんわり書いてみました
シリーズ全体の感想は[こちら](http://qiita.com/yu1ro/items/019e1436c215a12b94cb)

# こんな時どうしますか？
- インストールしようとしたら失敗した
- ドキュメントが意味わかんない
- 使っていてちょっと詰まった
- バグがある

# 普通の人なら(この前までの私)
- 文句言う
- ググる
- あんなことや
- こんなことしてみる
- お！使える！？

おしまい

**でもこれって次の人も同じ所でつまづきますよね？**

# ここでコントリビュートするのです
- 作者に聞いてみよう！
- 作者に提案してみよう！

## 一番簡単なコントリビュート方法
1. 使ってみる
2. 詰まった所をメモる
2. Issueで作者に聞いてみる
3. 作者とやりとりする

**おしまい！**
簡単ですよね！？

他にも簡単なのあるのでやって見てください。

### コントリビュート一覧
- Issueを投げる
- ドキュメント修正をお願いする（非公開部分）
- ドキュメント修正プルリクエストを投げる(公開部分)
- バグ修正のパッチを投げる
Windows 10(64bit版)での開発環境構築[再挑戦]

# 経緯
- 低予算（５万円以下）で、そこそこ快適な開発環境を構築するには、今ならば、中古windowsマシンを安く買い、windows 10に速攻アップデートすることではないかと思い立ち、週末作業として挑戦。
- ここ数年、windowsをあまりいじくっておらず、windowsに未だに32bit版と64bit版の別があることを忘れ、windows7版のwindows 7を購入してしまっていた。そのため、環境構築が長期戦に　*(64bit win7-> 64bit win10の場合は、、概ね[失敗編](http://qiita.com/kmry@github/items/06e9040403e183591b58)の手順で３時間程度でそこそこの環境を構築できるはずです。。)*

# 用意したもの:中古の32bit版Windows 7マシン(Core i5, 8GB)。約3.3万円。明細(Be-Stockから購入):
- ThinkPad T520 = 28,512円(本体価格 26,400円)　#音割れ不都合特価
- PC3-10600 4GB (増設RAM) = 5,400円(本体価格 5,000円)

付記.（32bit版の方が安く買える可能性が高いのだが、、）開発用途ならば、64bit版windows7/8が入ったマシンを購入した方が、無駄な作業が少ない。

# OSのインストール (win7 32bit -> win10 32bit -> win10 64bit)
数日前に同様のことをやってくれていた人がいてくれて助かった、、
[Windows7 Home 32bitから Windows10 Home 64bitへアップグレードしてみた。](http://nagamitsu1976.hatenadiary.jp/entry/2015/08/05/170133)

=>　上記事にもあるように、64bit版win10のインストールディスク作成や２度のインストールなど、無駄に時間がかかる(プロダクトキーの再入力は、上記事同様必要なかった)。 重要な点としては、インストールする２回のwin10は、いずれもエディション(Home、Proなど)を一致させ、win7のとの対応関係を注意すること。 

[参考:"＊Windows10 Home、Mobile、Pro は無料アップデート対象"](http://microsoftnews.hatenablog.jp/entry/windows10.edition)

(感想)　DVDからのwin10 64bitのクリーンインストールがだるい[特に、再起動後の"準備"というプロセスが遅い]。。"win7 32bit -> win10 32bit"はアップデート。"win10 32bit -> win10 64bit"はクリーンインストール。ゆえに設定は一切引き継がれない上に、デバイスドライバーが大丈夫か、などの不安もある*（本インストールでは、**サウンド関係が全滅**。ビデオ・skype等は潔くあきらめる）*。

# その後は機械的に、必要なものをインストールしていく。
- 64bit版Windowsだからといって、動作がおかしくなるアプリは少ないはずといいきかせながら、[失敗編](http://qiita.com/kmry@github/items/06e9040403e183591b58)と同様の作業を行っていく。
- 64bit版Windowsであることが必須となるboot2docker等はこんどこそきちんと動くはず。
スクリプトを検索してインストールする「spitiko」

**※当初はシェルスクリプト用でしたが、CLIで動作するスクリプトならなんでも使えるようにしました。**

# スクリプトをパッケージとして扱う

最近、シェルスクリプトをいくつか書いて、それを複数台のLinuxBox/Macで使っているが、ひとつひとつをgithubで管理して、それぞれのサーバーでpullして使っているのがめんどくさくなってきました。
なので、アルファ版的な完成度ではあるがパッケージ化したスクリプトを検索して、インストールする仕組みを自前のサーバーで構築してみました。
登録されているスクリプトは最下段に列挙してあります。
この仕組みを実現するのは、PHPスクリプトの「**spitiko**」です。
githubにあげてあるのですぐ使えます。

**https://github.com/digitarhythm/spitiko.git**

cloneすると**spitiko**スクリプトと設定ファイルがダウンロードされます。
Debian系Linuxの場合は下記のような感じで使えるようになると思います。
（**[バージョン番号]**は、7.2とかに置き換えてください）

###ここからroot作業

* 必要なAPTパッケージをインストール

```bash
# apt-get install php[バージョン番号]-dev
# apt-get install php[バージョン番号]-sqlite3
# apt-get install libgpgme11-dev
# apt-get install php-pear
```
* PHPのGnuPGライブラリをmake

```bash
# pecl install gnupg
```

* PHPの設定ファイルにライブラリ読み込み設定を記述

```text
CLIのphp.ini（Ubuntuだと「/etc/php/[バージョン番号]/cli/php.ini」）に、
extension=gnupg.so
を適切な場所（950行目あたり）に追記。
```
###root作業ここまで

* spitikoを使うユーザーにGPGの公開鍵をインストール

```bash
$ gpg --keyserver pgp.nic.ad.jp --recv AF8C0606
```

これでspitikoは使えるようになると思います。
以下、githubの「**README.md**」そのままです。

##スクリプトをインストールするためのスクリプト

**spitiko**を使うためには、  

0. PHP
0. GnuPG
0. SQLite3

が必要です。
GnuPGと、SQLite3をPHPから使えるようになっている必要があります。
事前準備として、私のGnuPG公開鍵「AF8C0606」をインストールする必要があります。

**\# gpg --keyserver pgp.nic.ad.jp --recv AF8C0606**

で、インストール出来ます。
とりあえずは、GnuPGのセットアップが必要です。

今のところ、バージョンチェックなどはしていないので、すでにインストールしてあるスクリプトを再インストールすると、上書きされます。

##「spitiko」コマンドのインストール

コマンドの初回実行時に、

**~/.spitiko**
**~/.spitiko/script.d**

のディレクトリと、

**~/.spitiko/spitikopackage.db**

が作成されます。 SQLite3を使って、このDBファイルにインストールすることが出来るスクリプトの情報を保存します。

「**~/.spitiko/script.d**」にパスを通しておくと、インストールしたスクリプトをすぐに使うことが出来ます。

##使い方

**$ spitiko update**
インストールする事が出来るスクリプトのデータベースを更新します。

**$ spitiko search [string]**
指定した文字列で、スクリプト名と説明を検索して、ヒットしたものを表示します。
環境変数「SPITIKO_SH」に、検索対象のシェルの名前を入れておくと、そのシェル用のスクリプトがフィルタリングされます。
例）export SPITIKO_SH="zsh"
なにも指定が無い場合は「bash」が使用されます。

**$ spitiko install [script name]**
指定したスクリプトをインストールします。

**$ spitiko info [script name]**
指定したスクリプトの情報を表示する。

##現在登録されているスクリプト
0. **trash**: ファイルを「~/.Trash」に移動するスクリプト
0. **apt-install**: テキストファイルに列挙したパッケージを「apt-get」で一気にインストールするスクリプト
0. **gh**: 「git add -A」→「git push」を連続して行うスクリプト
0. **git-sync**: gitで作業をする時に便利なツール
CentOSをVMware Playerにミニマル(最小構成)インストール Cygwinでインストールしたknife soloを使って遊ぶ(ための準備)

1年以上経過しましたが何事もなかったかのように前回の続きを書きます
※VagrantやVirtualBoxを使って似たようなことできるよ。と言われそうですが、まぁ確かにできます。でも書きたいので書きます。

# CentOSをVMware Playerにミニマル(最小構成)インストール

VMware Playerをインストールしましょう。
https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/7_0
次に、CentOSのMinimal ISOを用意しましょう。
http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1503-01.iso

インストーラディスクイメージファイルでダウンロードしたisoを指定します。
![簡易インストール.png](https://qiita-image-store.s3.amazonaws.com/0/24415/f12dbb03-518a-b9bc-5b39-e7fbf03f51bd.png)
そのあとは言われるがままに操作を進めればCentOS7をインストールが開始されます。

インストールが始まると、途中で下記のように「パッケージがないよ」と何回か言われるかも知れませんがyesを連打してとりえあえず進みましょう。
![does_not_exist..png](https://qiita-image-store.s3.amazonaws.com/0/24415/e1f9d804-c329-7c43-1210-50029b776d54.png)

# 起動時に自動的にDHCPに割り当てるようにする

CentOS7が無事起動できたでしょうか。ただ、この段階では起動時に自動的にDHCPに割り当てるようになっていません。
ここに結構ハマる方が多いらしく、「インターネットにつながらない！」「ip aしてもeth0がない！」という記事がぐぐると出てきます。
解決方法はこちらにあります。http://wiki.centos.org/FAQ/CentOS7#ethernet
`/etc/sysconfig/network-scripts/ `に移動し、`ifcfg-*`(*の部分はip aで確かめてね)のONBOOTをyesに書き換えて起動時に割り当てられるようにしましょう。
再起動して`ip a`でIPが割り当てられているのが確認できれば成功です。手始めに`yum update -y`でもしておきましょう。

# Cygwinでログインしてみる

IPが割り当てられているのが確認できたら、sshログインしてみます。Cygwinを使うのが手っ取り早いのでお勧めです。「Cygwinがない」という方にはこちらの記事がお勧めです。[Cygwinのターミナルエミュレータminttyの導入](http://qiita.com/d9magai@github/items/b988f4c881cfa1261512)(さりげない宣伝)

とりあえず起動している仮想マシンにsshログインします。といってもCygwin上でsshコマンドでユーザ名とIPを指定しするだけでいけるはずです。`ssh d9magai@192.168.33.132`こんなかんじです。

# パスワード入力なしでsudoコマンドを実行できるようにする

簡易インストールした場合はroot権限を持っているのはrootユーザのみのはず。sudoをパス無しで入力できたほうが便利なので、その設定をします。`su`でrootになって`visudo`を実行します。
最終行あたりに以下を追加すればおｋです(ユーザ名は自分の名前でね)。

```
d9magai ALL=(ALL)       NOPASSWD: ALL
```

# パスワード認証ではなく鍵認証できるようにする

パスワード認証ではなく、鍵認証でログインできるようにします。認証用の鍵が必要なので、無い場合は`ssh-keygen`コマンドをCygwin上で実行し、鍵を生成しておきましょう。上手くいけたらデフォルトでは`~/.ssh/id_rsa.pub`に作られると思います。これがあなたのホストの公開鍵です。
今度はCentOS7にログインし、以下のコマンドで鍵認証でログインするための設定をします。まずは鍵を設置します。

```bash:鍵の設置
mkdir ~/.ssh 
chmod 700 ~/.ssh 
echo 'ホストの公開鍵' > ~/.ssh/authorized_keys 
chmod 600 ~/.ssh/authorized_keys
```

ディレクトリやファイルのパーミッションに注意です。
次は、sshdの設定を変えます。書き換えるのは以下のファイルです。

```
sudo vi /etc/ssh/sshd_config
```

以下がコメントアウトされているはずなので、解除して有効化します。

```
RSAAuthentication yes
PubkeyAuthentication yes
```

設定ファイルを再読み込みします。

```
sudo systemctl reload sshd
```

ログアウトして、もう一度ログインしてみましょう。パスワードの入力を求められなければ成功です。

# rsyncとchefのインストール

`knife solo`で遊ぶためには`rsync`と`chef`が必要にです。なのでインストールします。
`rsync`は普通に`yum`でインストールすれば問題ないです。

```
sudo yum -y install rsync
```

`chef`は以下のワンライナーをゲスト上で実行すれば入ります。

```
curl -L https://www.opscode.com/chef/install.sh | sudo bash
```

ですが、せっかくなので`knife solo prepare`コマンドを使ってインストールしてみてもいいかもしれません。

```
knife solo prepare d9magai@192.168.33.132
```

`knife solo`がない、という方にはこの記事がお勧めです。[cyg-fastの紹介とknife soloの実行環境の作り方](http://qiita.com/d9magai@github/items/ff867393b7c257135e70)(さりげない宣伝)
`knife solo prepare`だと一緒に`rsync`も入りますね。
これで準備完了です。あとはひたすら遊ぶだけです。
Surface 3に開発環境をつくる - Part1: Microsoft EdgeにPocketのブックマークレット

Surface 3をWindows 10にアップグレードして開発環境をつくってみようと思います。私の場合開発はクラウド上のサーバーでEmacsを使うか、Cloud9をブラウザから使っているのでクライアント端末の要件は少ないです。キーボードさえ気に入ればChromebookなど安価なノートPCで快適な開発環境がつくれる時代になりました。最初にどこでも[Pocket](https://getpocket.com)に積んどくしているので、Windows 10で使えるMicrosoft EdgeでもPocketが使えるようにしてみます。


## Microsoft Edgeのブックマークレット


他のブラウザの場合、Firefoxではブラウザに統合され、Chromeではエクステンションの[Save to Pocket](https://chrome.google.com/webstore/detail/save-to-pocket/niloccemoadcdkdjlinkgdfekeahmflj?hl=ja)が使えます。しかしMicrosoft Edgeでは現状ブックマークレットを登録する必要があります。困ったことにInternet Explolerにあった「お気に入りの管理」がEdgeには存在しません。[このボタンをブックマークバーにドラッグ。](https://getpocket.com/add/)をした後にURLの変更が画面から行えません。


## Microsoft Edgeのお気に入りの編集

Microsoft Edgeでもお気に入りの管理ができる方法を探していると、ちょうどよいガイドを見つけました。

* [How to manually install bookmarklets in Microsoft Edge ](http://www.itworld.com/article/2954526/personal-technology/how-to-manually-install-bookmarklets-in-microsoft-edge.html)


## Pocketのブックマークレットの作り方

Pocketの[保存方法](https://getpocket.com/add/)を表示します。「またはブックマークレットをインストール ›」をクリックします。「+ Pocket」ボタンを右クリックして「リンクをコピー」してクリップボードに保存しておきます。次に☆マークをクリックしてお気に入りを「お気に入りバー」に作成します。

* 名前: `+ Pocket`
* 作成先: お気に入りバー

お気に入りのURLをブックマークレットのJavaScriptに変更したいのですが、Edgeには編集する画面が見当たりません。[How to manually install bookmarklets in Microsoft Edge ](http://www.itworld.com/article/2954526/personal-technology/how-to-manually-install-bookmarklets-in-microsoft-edge.html)にお気に入りのファイルがどこに保存されているか説明があります。

```
C:\Users\{username}\AppData\Local\Packages\Microsoft.MicrosoftEdge_{random strring}\AC\MicrosoftEdge\User\Default\Favorites\Links
```

エクスプローラーの表示メニューから「隠しファイル」にチェックを入れておきます。{username}と{randam}は環境にあわせて上記のフォルダを開きます。

このフォルダに「+ Pocket」のファイルがあるのでエディタで開きます。URLキーの値をクリップボードにコピーした長いブックマークレットのJavaScriptを貼り付けます。

```txt
URL=javascript:(function(){var e=function(t,n,r,i,s...
```

### お気に入りバー

Edgeの右上にある`three dots menu`から設定を選び、「お気に入りバーを表示する」をオンにします。適当なページを開き、「+ Pocke」のブックマークレットをクリックするとPocketに保存できます。また[マイリスト](https://getpocket.com/a/queue/)もお気に入りバーに追加しておくと便利です。

![pocket.png](https://qiita-image-store.s3.amazonaws.com/0/43745/eed031f6-bc75-cfc1-723a-3c08183f9219.png)
wispで文字列中の変数展開

wispは文字列中の変数展開を標準でサポートしてないようなのでマクロ書きました。

## マクロ

```clj
(defmacro $
  [value]
  (if (string? value)
    (let [reg #"([\s\S]*?)(\\*)(\${([a-zA-Z\-*\$][\w.\-*\$]*)})([\s\S]*)"]
      (loop [v (str value)
             f `(+)]
        (if (or (nil? v) (= 0 v.length))
          f
          ;else
          (let [m (.match v reg)]
            (if (nil? m)
              (concat f `(~(String. v)))
              ;else
              (if (= 1 (mod (.-length (aget m 2)) 2))
                (recur (aget m 5) (concat f `(~(String. (+ (aget m 1) (aget m 2) (aget m 3))))))
                ;else
                (recur (aget m 5) (concat f `(~(String. (+ (aget m 1) (aget m 2))) ~(symbol (aget m 4)))))
                )))))))))
```


## 使い方

```clj
(let [foo "FOO"]
  (print ($ "bar${foo}baz${foo}barbaz")))
```

------

完成してみれば大したことないコードだけど、文字列をどうunquoteしたらいいかでかなり時間食いました…


リポジトリは[こちら](https://github.com/atomita/wisp.macros/blob/master/string/variable-parsing.wisp)
PolymerのDataBinding、CurlyとSquare


Polymer1.0からBinding annotationが二種類に変わったようです。
(0.5のドキュメントでは、Curly brackets ({{}}) しかない)

追加されたのは一方向BindingのSquare brackets ([[]])です。

簡単にまとめると

* Curly brackets ({{}}) は、Propertiesの設定によって、一方向だったり、双方向になります。
* Square brackets ([[]]) が一方向Bindingになります。

Propertiesの設定とは、notifyとreadonlyです。

また、```<input>``` のようなnon-Polymer elementsの場合は、```ホストのプロパティ名::イベント名``` のような記述する必要があります。
例えば、```<input type="text" value="{{binding::input}}">``` の場合、inputイベントを捕捉して、inputタグのvalue属性値をhostのプロパティ名bindingに設定します。 
この場合、notifyやreadonlyの値とは関係なさそうです。

それらをまとめると以下のようになります。

| curly or square   |nofify |readonly|   result        |
|---                |---    |---     |---              |
|{{curly}}          | false | false  | host --> child  |
|{{curly}}          | true  | false  | host <--> child |
|{{curly}}          | true  | true   | host <-- child  |
|{{curly}}          | false | true   | no binding      |
|[[square]]         | false | false  | host --> child  |
|[[square]]         | true  | false  | host --> child  |
|[[square]]         | true  | true   | no binding      |
|[[square]]         | false | true   | no binding      |

non-Polymer elementsの場合

| curly or square   |nofify |readonly|   result        |
|---                |---    |---     |---              |
|{{curly}}          | Either| Either | host <--> child |
|[[square]]         | Either| Either | no binding  |

[{{curly}}の場合のサンプル](http://plnkr.co/cvvPDV)
[[[square]]の場合のサンプル](http://plnkr.co/hRaxJx)

ここでいうhostとchildとは、以下の部分です。

```html
<dom-module id="host-element">　← host
    <template>
      <child-element name="{{myName}}"></child-element> ← child  
    </template>

  <script>
    Polymer({ ←　つまりここもhost
      is: "host-element", 
      properties: {
        myName: {
          type: String,
          value: "Daniel"
        }
      }
    });
  </script>
</dom-module>
```

この例でいうと、```<child-element>``` の ```name``` 値が、 ```host-element``` のプロパティ ```myName``` に対応します。

# 所感

プロジェクトで以下の二つの方法のどちらかを決めておいたほうが良さそう。

* {{curly}} だけで一方向、両方向ともに対応できるので、愚直にそれだけを使う。

* 一方向の場合は[[[square]]を利用したほうが、Javascriptの実装部分のpropertiesを見なくてもhost --> childと方向が確定できるので、必ず使う。(現在のPolymer自体はこちらの方針っぽい)
OMRON HVC-CにLinuxから接続する方法


Bluezの使い方は[私のエントリ](http://qiita.com/yujimny/items/7e92f240f48550585500)を参考に。
Bluez-5.29を使用。

UUIDやhandleの検索はHVC-CのAndroidサンプルソースとコマンド仕様書を参考にする。
[SDKダウンロード](http://plus-sensing.omron.co.jp/product/sdk-download.html)
gatttoolを起動。tは三つ。

```
$ ./attrib/gatttool -b XX:XX:XX:XX:XX:XX -t random -I
[XX:XX:XX:XX:XX:XX][LE]>
```

connectする。

```
[XX:XX:XX:XX:XX:XX][LE]> connect
Attempting to connect to [XX:XX:XX:XX:XX:XX]
Connection successful
```

handleを探す。

```
[XX:XX:XX:XX:XX:XX][LE]> primary
attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0008, end grp handle: 0x000b uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x000c, end grp handle: 0xffff uuid: 35100001-d13a-4f39-8ab3-bf64d4fbb4b4
```

0x000cを使う。

```
[XX:XX:XX:XX:XX:XX][LE]> char-desc 0x000c
handle: 0x000c, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x000d, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x000e, uuid: 35100003-d13a-4f39-8ab3-bf64d4fbb4b4
handle: 0x000f, uuid: 00002902-0000-1000-8000-00805f9b34fb
handle: 0x0010, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0011, uuid: 35100002-d13a-4f39-8ab3-bf64d4fbb4b4
handle: 0x0012, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0013, uuid: 35100004-d13a-4f39-8ab3-bf64d4fbb4b4
```

サンプルソースからHVC-Cから受信するには
00002902-0000-1000-8000-00805f9b34fb
のhandle 0x000fに0100を書き込めば良いことがわかる。
送信するには
35100002-d13a-4f39-8ab3-bf64d4fbb4b4
のhandle 0x0011を使用する。

```
[XX:XX:XX:XX:XX:XX][LE]> char-write-req 0x000f 0100
Characteristic value was written successfully
```

コマンド仕様書の4-1付近を読み込むと、送受信ヘッダには0xFEが付くことがわかる。4-3-1に書いてあるバージョン情報を取得するコマンドを叩いてみる。
同期コードにFE, コマンドNo.00, データ長0000を並べる。
送信にはhandle 0x0011を使用する。

```
[XX:XX:XX:XX:XX:XX][LE]> char-write-req 0x0011 FE000000
Characteristic value was written successfully
Notification handle = 0x000e value: fe 00 13 00 00 00 48 56 43 2d 43 31 42 20 20 20 20 20 01 01
Notification handle = 0x000e value: 00 96 09 00 00
```

それっぽい値が取れた。
受信時のデータ
同期コード：fe
レスポンスコード：00
データ長（4バイト）：13 00 00 00
レスポンスコードに00（正常）データ長に0x13が帰ってきていて、返却バイト数も19bytesなので正常であることがわかる。
型式文字12文字：
48 56 43 2d 43 31 42 20 20 20 20 20 = "HVC-C1B     "
メジャーバージョン：01 = 1
マイナーバージョン：01 = 1
リリースバージョン：00 = 0
リビジョン番号：96 09 00 00 = 0x00000996

これであとはどんなコマンドでもいけそう。
kivyでデータベース（sqlite3）を使うのを試した

#__kivyでデータベース（sqlite3）を使うのを試した__

初めてsqlite3というのを使ってみたのでメモっておく。

* pythonだと``import sqlite3``で使えて楽。
* アプリにしたとき、DB作成する権限がどうなるのかよく分からない。
* SQL文に変数入れるのは、``self.cur.execute('''INSERT INTO times VALUES(:time, :count)''',{'time':self.now,'count':self.countnum})``みたいにするとできる。
* ついでに``kivy.storage.jsonstore``も試してみた。

簡易サンプルは以下。
基本的に新しいもの（フレームワーク）を覚える時は、機能別にmy***.pyとかファイル一つで作ってみることにしている。

```python:mystorage.py



from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.storage.jsonstore import JsonStore

from datetime import datetime
import sqlite3



class MyStorageApp(App):

    conn = sqlite3.connect("./data.db")
    cur = conn.cursor()

    mydata = JsonStore('./mydata.json')

    countnum = 0
    now="now"

    def gettime(self):
        return str(datetime.now())

    def getData(self):
        self.entry = self.mydata.get('data')

        print(self.entry)


# layout
    def build(self):

        layout = BoxLayout(padding=10, orientation='vertical')
        btn1 = Button(text="PUSH")
        btn1.bind(on_press=self.buttonClicked)

        self.lbl1 = Label(text = "count is "+str(self.countnum))
        self.lbl2 = Label(text = self.now)

        layout.add_widget(btn1)
        layout.add_widget(self.lbl1)
        layout.add_widget(self.lbl2)

        return layout

# button click function
# "bind" need "instance" arg (this case is "btn" arg)
#http://stackoverflow.com/questions/23127203/bind-function-to-kivy-button
    def buttonClicked(self,btn):
        self.countnum += 1
        self.lbl1.text = "count is " +str(self.countnum)

        self.now= self.gettime()

        self.lbl2.text = self.now

        try:
            self.cur.execute("""CREATE TABLE times(time text, count int);""")
        except:
            pass

        self.cur.execute('''INSERT INTO times VALUES(:time, :count)''',{'time':self.now,'count':self.countnum})
        self.conn.commit()

        self.cur.execute("select * from times")
        for row in self.cur:
            print row[0],row[1]
            self.mydata.put('data', mytime=row[0],mycount=row[1])

        self.getData()

        print("done")

# run app
if __name__ == "__main__":
    MyStorageApp().run()



```
MacOSXでFirefoxのタブを閉じるボタンを消す

MacOSXでFirefoxのタブの閉じるボタンを隠すには、以下の場所に
以下の様なuserChrome.cssファイルを作れば良い

**場所:**
~/Library/Application Support/Firefox/Profiles/*****.default/chrome/userChrome.css

**内容:**

```css
.tab-close-button{visibility:collapse !important}
```

あとはFirefoxを再起動。
NSStringFromClassを使ってnibNameを取得して、タイポミスを防ぐ

# ProjectName.XibName.xib
まず、xibファイルの名前の先頭に「プロジェクト名.」を足します。

```
SampleProject.SampleViewController.xib
```
# NSStringFromClass

NSStringFromClassを使って以下のようにnibNameを取得します。:tangerine:
 
```swift
let sampleVCNibName = NSStringFromClass(SampleViewController.self)
let sampleViewController = SampleViewController(nibName: sampleVCNibName, bundle: nil)
```
テストケースを書いてみよう

## はじめに

『テスタブルJavaScript』を少し読み、テストケースを書いてみました。ES6も触ってみたいということで babel + gulp + mocha + power assert という組み合わせを試してみました。

参考にした記事を紹介します。

- [ぼくのかんがえたさいきょうのES6プロジェクトテンプレート](http://qiita.com/mohayonao/items/9b0655b8b4979bffda31)
- [5分ぐらいでわかるpower assert](http://azu.github.io/slide/sakurajs/power-assert.html#/)
- [テスト用ライブラリpower-assert](http://www.slideshare.net/t_wada/power-assert-jsojisan2?next_slideshow=1)
- [NODE.JS MODULE PATTERNS](http://darrenderidder.github.io/talks/ModulePatterns/#/)
- [通常の数値かどうかはisNaN関数じゃなくてisFinite関数](http://d.hatena.ne.jp/sandai/touch/20100206/p1)
- [Exploring ES6 13. Arrow functions](http://exploringjs.com/es6/ch_arrow-functions.html)

この記事では、使用したディレクトリ構造と使用したファイルを紹介します。(もし、気づいたことがありましたら、ご指摘いただければ幸いです。)

## ディレクトリ構造

使用したディレクトリ構造は下記のディレクトリ構造になります。

```
.
├── gulpfile.js
├── package.json
├── src
│   └── sum.js
└── test
    ├── mocha.opts
    └── test_sum.js
```

テストの実行方法は下記のコマンドラインになります。

```
$ npm install
$ gulp
$ npm test
```

## ファイル

まずは、package.jsonを見てみます。

```package.json
{
  "name": "sandbox",
  "version": "1.0.0",
  "description": "babel + gulp + mocha + power assert",
  "dependencies": {
    "babel": "^5.8.21"
  },
  "devDependencies": {
    "babel": "^5.8.21",
    "espower-babel": "^3.2.0",
    "gulp": "^3.9.0",
    "gulp-babel": "^5.2.0",
    "mocha": "^2.2.5",
    "power-assert": "^0.11.0"
  },
  "scripts": {
    "test": "mocha"
  }
}
```

次にgulpfile.jsを見てみます。

```gulpfile.js
var gulp = require("gulp");
var babel = require("gulp-babel");

gulp.task("default", function () {
  return gulp.src("src/*.js")
    .pipe(babel())
    .pipe(gulp.dest("dist"));
});
```

mocha.optsを見てみます。

```mocha.opts
--compilers js:espower-babel/guess
```

test_sum.jsを見てみます。

```test_sum.js
import assert from 'power-assert'
import sum from '../src/sum'

describe('sum', () => {
  it('12 + 23', () => {
    assert(sum(12, 23) === 35)
  })
  it('234', () => {
    assert(sum(234) === null)
  })
  it('abc + def', () => {
    assert(sum('abc', 'def') === null)
  })
  it('1 + NaN', () => {
    assert(sum(1, NaN) === null)
  })
  it('NaN + 2', () => {
    assert(sum(NaN, 2) === null)
  })
  it('1 + Infinity', () => {
    assert(sum(1, Infinity) === null)
  })
  it('Infinity + 2', () => {
    assert(sum(Infinity, 2) === null)
  })
  it('1 + false', () => {
    assert(sum(1, false) === null)
  })
  it('true + 2', () => {
    assert(sum(true, 2) === null)
  })
})
```

つまらないかもしれませんが、これらを用いれば、sum.jsを実装できます。なので、sum.jsの紹介はまた今度にしましょう。

## 振り返り

mocha.optsの--require espower-babel/guessを忘れると、mochaと同じ出力になってしまいます。ここはちょっとハマりました。

本当はBrowserifyも使ってみたかったのですが、間に合いませんでした。機会があれば、試してみたいと思います。

requireの使い方が少し不安です。実践では、どのように使っているのか気になるところです。

Babelはアロー関数やセミコロンがないところが良いですね。

最後に、sum.jsを見てみましょう。

```sum.js
/**
 * @param {Number} x
 * @param {Number} y
 * @return {Number} Sum of x and y
 */
module.exports = function sum(x, y) {
  if (arguments.length != 2) return null
  if (typeof x != 'number' || typeof y != 'number') return null
  if (x.toString() === 'NaN' || y.toString() === 'NaN') return null
  if (x.toString() === 'Infinity' || y.toString() === 'Infinity') return null
  return x + y
}
```