OmniAICreator/Qiita-1.07M huggingface dataset:
2D Rope Systemでロープアクション

###<a href="https://www.assetstore.unity3d.com/jp/#!/content/17722" target="_blank">2D Rope System</a>
 <a href="https://www.assetstore.unity3d.com/jp/#!/content/17722" target="_blank">![スクリーンショット-2015-08-30-01.05.07.png](https://qiita-image-store.s3.amazonaws.com/0/46444/6e5e29f7-aa0c-28a4-4919-1ed44cfe1bff.png)</a>

###何ができるか
ロープが作れます。ゆらゆらゆれて、つかんだり、切ったり。
HingeJointで1から作成する必要がありません。
スパイダーマン！みたいなものとかも作れそう・・・と思ったので・・・作ってみました

##アセットをインポート
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/1e5fe8d0-ad17-81e3-0ecb-c1c6495b086a.png" width="250px">

サンプルのシーンが３つと、Script、ドキュメントなどが入っています
固定でロープなどをシーン上に配置する場合は
Window->2D RopeSystemのメニューから出るウィンドウから作成できます
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/b5a9e946-549e-5546-8308-d6c88a187274.png" width="200px"><img src="https://qiita-image-store.s3.amazonaws.com/0/46444/318bf1d8-2818-90f8-cbb2-e58fc38daa0c.png" width="300px">

今回はScriptでロープを作成するのでウィンドウでの作成方法は割愛

##こんなの作ってみました
![Play.gif](https://qiita-image-store.s3.amazonaws.com/0/46444/3798765f-6220-5fbe-f83e-5e8000c0e6ba.gif)

Rope Test3のSceneが動的にロープを作成するサンプルです。
これを参考に・・・
RuntimeRope.csのソースの必要な所をコピーして修正していきました。
クリックした位置にオブジェクトがあればそこにロープをつなぎ、既につないでいればロープを離すという処理にしています。
3Dの空間を飛び回りたかったのでカメラをPerspectiveに、しかしながら建物などのコリダーは2Dでやっております。

###クリック判定部分
ここが一番苦労したところ。奥行きのあるカメラに2Dのコリダーのあたり判定をとるのに苦労しました。
DummyPointObjはクリックした位置においているCubeのオブジェクトです
その位置に向かってロープを作成します。
もう少しうまい書き方があるかも知れませんが・・・。

```csharp


				Ray ray = mainCameraTran.GetComponent<Camera>().ScreenPointToRay( Input.mousePosition ); 
				RaycastHit2D hit2d = Physics2D.GetRayIntersection(ray);
				if(hit2d.collider != null && hit2d.collider.gameObject.tag == "Object")
				{
					Vector3 mousePos = Input.mousePosition; 
					mousePos.z = distance; 
					dummyPointObj.position = mainCameraTran.GetComponent<Camera>().ScreenToWorldPoint( mousePos ); 
					pointB = dummyPointObj.transform;
```

###ロープの切り離し
ロープを切り離すときはPlayerとつながった先のオブジェクトに作成されたDistanceJoint2Dを削除することで切り離せます
あとは一定時間たったあとにロープを削除しています

```csharp

				Destroy(transform.GetComponent<DistanceJoint2D>());
				Destroy (dummyPointObj.GetComponent<DistanceJoint2D>());
				Destroy(chainsHolder, 3f);
```

###ロープで加速
前方向にスィングしているときは加速するようにしました
簡単ではありますがロープの一番下のRigidbody2DのVelocityがプラスの時は値をふやしてあげることで思ったようなうごきになりました。

```csharp

		if(chainsHolder != null)
		{
			Rigidbody2D ropeRigid = chainsHolder.transform.FindChild("chain 1").GetComponent<Rigidbody2D>();
			float dx = ropeRigid.velocity.x;
			if(dx > 0)
			{
				dx *= 1.8f;
				if(dx > 60f)
				{
					dx = 60f;
				}
				ropeRigid.AddForce(new Vector2(dx, 0));
			}
			else
			{
				dx *= 0.95f;
				if(dx < 0f)
				{
					dx = 0f;
				}
				ropeRigid.AddForce(new Vector2(dx, 0));
			}
			
		}
```

###ロープのprefabの設定
ロープの動きはロープのprefabの主にHinge Joint 2Dのところで変更できます
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/c73539bf-5d41-59d6-af67-ea5fdeb8d529.png" width="300px">

###あたり判定の設定
ロープとキャラクターやキャラクーと建物などにあたり判定が発生しないようにLayer Collision Matrixで設定してあげました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/a15e2bb2-da34-8455-4deb-1a6c216e10f0.png" width="300px">


あとはキャラクターもラグドールとかジョイントでつくればいい感じのものができそうです。
Dashboardにお引取り願う


DashboardはMac OSXが標準で提供する機能のひとつ。[ここ](https://support.apple.com/ja-jp/HT201738)で紹介されているように、ウィジェットを配置してそれらに簡単にアクセスできるようになっている。時計、電卓、天気予報などを貼り付けているが、正直、全然使っていない。Windowsでもガジェットという名前でデスクトップやサイドバーに置けるようになっていたけど、ついぞ使わなかった。ガジェットの方は[重大な脆弱性があるとのことで廃止](http://windows.microsoft.com/ja-jp/windows/gadgets)になったらしいが、OSXのDashboardとWidgetはいつまで提供され続けるのかな。

と思いつつ、少ないとはいえ使っていないものにリソースを割き続けるのもなんだし、いつからか、Dashboardは仮想デスクトップのSpacesと統合され、一番左に現れるようになり、左に行きすぎて表示されてうざったいということもある。ということで、この機能を無効化してみた。

まず、Spacesから見えなくするには、「システム環境設定」ー＞「Mission Control」で "Dashboard"を「操作スペースとして表示」から「切」にすればよい。オプションとして「オーバーレイ表示」というのもあって、これを選ぶと今のスペースが暗くなりその上にオーバーレイされて表示される。「切」にしてもDashboard機能は生きていて、Dashboardのアイコンをクリックすれば表示される。ただし(隠れていた)スペースとして表示されるので元のスペースに戻るにはスペースの右移動が必要になる。したがって、Spacesには表示させたくないが、Dashboardの機能は使いたいという人にはこの「オーバーレイ表示」は便利かもしれない。

逆に、「Dashboardの機能は金輪際使うつもりはない」という潔い人は機能自体を無効化できる。それにはコマンドラインでの操作が必要になるが、コマンド一発。

```
$ defaults write com.apple.dashboard mcx-disabled -bool YES
```

そして

```
$ killall Dock
```

でDockを再起動。簡単だ。
画像のアップロード

phpで画像をアップする場合の方法

htmlで画像を選択させて、
それをpostメソッドでphpに送信するというもの。

まずは、htmlを作成する。

```html:form.html
<body>
<form action="update.php" method="post" enctype="multipart/form-data">

	ファイル：<br />
	<input type="file" name="upfile" size="30" value=""/><br/>
	<input type="submit" value="送信"/>

</form>
</body>
```

`enctype="multipart/form-data"`
これをformタグの中に書くことによって、ファイルをアップすることができるようになる。


inputタグのtypeにfileと書くと、ファイル参照フォームを表示することができる。


次に、phpを作成する。

```php:update.php
//画像の保存先のパスを指定
$filedir = "C:×××/×××/";

//$filesdirで指定したファイルに画像を保存する。
if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
	if (move_uploaded_file($_FILES["upfile"]["tmp_name"], $filedir.$_FILES["upfile"]["name"])) {
		echo $_FILES["upfile"]["name"] . "をアップロードしました。";
	}
	else {
		echo "ファイルをアップロードできません。";
	}
}
else {
	echo "ファイルが選択されていません。";
}
```

if文の中の`["　"]`の中は特に宣言はしていないけど大丈夫。
画像が持っている情報を持ってきているみたい。

これで指定したパスのフォルダに画像が保存されている。
SDWebImage のデフォルトのキャッシュディレクトリがいつの間にか変わっていた (v3.7.3〜)

iOS でよく使われる画像ダウンロード & キャッシュライブラリに [SDWebImage](https://github.com/rs/SDWebImage) というのがあります。

そのライブラリが生成するデフォルトのキャッシュディレクトリのパスが変わっていて、以前にのバージョンでキャッシュされたファイルがよしなに削除されないという問題が発生しました。

具体的には `SDImageCache` というクラスがデフォルトで生成する `diskCachePath` が `v3.7.2` だと

`/<アプリのディレクトリ>/Library/Caches/com.hackemist.SDWebImageCache.default`

となっていますが、 `v3.7.3` だと

`/<アプリのディレクトリ>/Library/Caches/default/com.hackemist.SDWebImageCache.default`

となっています。

`/default/` というディレクトリが勝手に切られています。

`SDWebImage` は勝手に古いキャッシュを削除してくれたり、手動で `clearDiskOnCompletion:` を呼ぶとキャッシュを削除できるのですが、 `diskCachePath` がしれっと変わっているため以前キャッシュされたものがそのまま残り続けてしまうというわけです。

問題となるバージョンは `v3.7.3` からです。

僕は `v3.7.2` から `v3.7.3` にアップデートして使ってたので問題にぶち当たりました。

古いディレクトリを削除する対応をしないとダメなのかな...
arduinoでwifi

オークションで手に入れた、esp8266をarduino unoにつないで見ました。
##写真
![MVC-008S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/e386a6de-0c4f-61ff-53e5-b7ef956d5be1.jpeg)
##回路図
![espk.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/5818e2ff-74d2-98ce-8158-219fc54d679c.png)
##ハイパーターミナル
![esp.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/367226db-a645-299d-2f41-7dd1edeb9155.png)
##サンプルコード
```
#include "ESP8266wifi.h"
#include <SoftwareSerial.h>

#define RST_pin 			7
SoftwareSerial swSerial(10, 11);
int ledPin = 13;
String returnData;
ESP8266wifi wifi(Serial, Serial, RST_pin, swSerial);
void setup()
{
	pinMode(ledPin, OUTPUT);
	swSerial.begin(115200);
	Serial.begin(115200);
	wifi.setTransportToTCP();
	wifi.endSendWithNewline(true);
	wifi.begin();
	wifi.connectToAP("free-spot", "");
}
void loop()
{
	boolean isConnected = wifi.connectToServer("210.169.132.188", "80");
	if (wifi.isConnectedToServer())
	{
		wifi.send(SERVER, "GET / HTTP/1.0\r\n\r\n");
		WifiMessage in = wifi.listenForIncomingMessage(1000);
		if (in.hasData)
		{
			returnData = in.message;
		}
		Serial.println("Return is: " + returnData);
	}
	delay(9000);
}

```
Github API が予想以上にいい感じな件

いまとあるアプリケーションの Web API を設計しているのだが、思った以上にいろいろたいへん。
当たり前だが、APIをただ使うのに比べると10倍以上考えなければならないことがある。

そこである勉強会で教えてもらったのは、「Github API を真似すればいいんじゃね？」という話。調べてみると、すごくシンプルで使いやすい印象。リンクがふんだんにつかわれていて、ハイパーメディアっぽいし。

[GitHub API v3](https://developer.github.com/v3/)

GitHub API が数ある Web API のなかでどのようなポジションにあるのかは寡聞にして知らない。だけど、かなりイケテル部類なのではないか？なにせ、天下の GitHub である。世界のあらゆる優秀なITエンジニアたちの目に毎日触れているのである。おかしな設計の API なんて怖くて晒せないはずだ。ということは、GitHub API を~~パクって~~参考にして、Web API を作れば相当いいものが作れるのではないか、という推測が成り立つ。

学習のため rest-client を使って、GitHub API をテストする spec を書いてみた。といっても、まだごく一部だけど(すでに動いている他所様の API を rspec でテストするっていうのはどうよ？という話もあるが。時間当たりのAPIコール数にも制限があるし）。

[github-api-test](https://github.com/mdew150/github-api-test)

できれば GitHub API を頭に叩きこんで、「そもそも Web API はどうあるべきであるか」ということを学びたい。Web API が本格化してまだ10年経っていないであろうということもあり、まだこの分野は確立されたベストプラクティスがないように感じる。理論的な書籍や机上のウェブ標準はいろいろあるのだが、GitHub API にはすでに大きな実績がある。こういう実績のある API にこそ学ぶべきなんじゃないかと思う。
Install Deis on AWS

# AWSにDeisをインストールしてみる

Open PaaSのdeisをAWSに入れてみます。

## 前提
- deisctlのインストール
- deisのインストール
- awsコマンドツールのインストール
- go get github.com/deis/deis しておく or git clone git://github.com/deis/deis

## AWS にprivate keyを登録する

```
$ssh-keygen
$aws ec2 import-key-pair --key-name $NAME --public-key-material file://~/{path/to/public/key}
```

すでに登録してある場合は、`$GOPATH/src/github.com/deis/deis/contrib/aws/cloudformation.json` の`ParameterValue` を登録済みのkeyの名前にする。

### etcdのdiscovery-url を設定する

```
$cd $GOPATH/src/github.com/deis/deis
$make discovery-url 
```

### Cloudformationを使って、boot

```
$cd contrib/aws
$./provision-aws-cluster.sh 
{
    "StackId": "arn:aws:cloudformation:us-east-1:574592877137:stack/deis/xxx"
}
Waitin
....
Instances are available:
i-075476ac      52.22.54.xxx    m3.large        us-east-1b      running
i-f0878b22      52.6.38.xxx     m3.large        us-east-1c      running
i-f7878b25      52.21.95.xxx    m3.large        us-east-1c      running
Using ELB deis-DeisWebELB-xxx at deis-DeisWebELB-xxx-xxx.us-east-1.elb.amazonaws.com
Your Deis cluster has been successfully deployed to AWS CloudFormation and is started.
```


### deisctlにて、plaltformをインストール


```
$export DEISCTL_TUNNEL=52.22.54.xxx
$deisctl list
UNIT                            MACHINE                 LOAD    ACTIVE  SUB
# エラーがなければOK
$deisctl config platform set domain=example.org
$deisctl config platform set sshPrivateKey=~/.ssh/id_rsa
$deisctl install platform
$deisctl start platform
```


### DNSの設定

provision-aws-cluster.shにて返ってきたELBのアドレスをRoute53を使って登録。*.example.comを登録するか、 registry.example.com, deis.example.com, app1.example.com（使いたいアプリ名）を登録する。
Rspecでinitializeでのインスタンス変数テストではまったこと

例えばこんなクラスがあったとして、

```rb:sample01.rb
class Sample01

  def initialize
    @data = {name: "tanaka", age: 30}
    @name = _get_name
    @age = _get_age
  end

  def run
    puts "私の名前は#{@name}(#{@age}歳)です"
  end

  private

  def _get_name
    @data[:name]
  end

  def _get_age
    @data[:age]
  end
end
```

以下のようにインスタンス変数 data に test_data を設定し、

```rb:sample01_spec.rb
require './sample01'

describe Sample01 do
  let(:instance) { described_class.new }

  let(:test_data) { {name:'test', age: 99} }

  before :each do
    # インスタンス変数 data に test_data を設定
    instance.instance_variable_set(:@data, test_data)
  end

  describe '.initialize' do
    subject { instance.send('initialize') }

    it 'インスタンス変数が正しく設定されていること' do
      expect(instance.instance_variable_get(:@name)).to eq 'test'
      expect(instance.instance_variable_get(:@age)).to eq 99
   end
  end
end
```

インスタンス変数 name と age に任意の値が設定されているかをテストしても、値はうまく設定されずテスト失敗となる。

```
$ bundle exec rspec sample01_spec.rb 
F

Failures:

  1) Sample01.initialize インスタンス変数が正しく設定されていること
     Failure/Error: expect(instance.instance_variable_get(:@name)).to eq 'test'
       
       expected: "test"
            got: "tanaka"
       
       (compared using ==)
     # ./sample01_spec.rb:17:in `block (3 levels) in <top (required)>'

Finished in 0.02069 seconds (files took 0.15206 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./sample01_spec.rb:15 # Sample01.initialize インスタンス変数が正しく設定されていること
```

実行される処理順として、

- `instance.instance_variable_set(:@data, test_data)` の箇所でまず Sample01 の initializeが呼ばれ、

- `instance.instance_variable_set(:@data, test_data)` の箇所で実際にインスタンス変数 data に test_data が設定され、

- `expect(instance.instance_variable_get(:@name)).to eq 'test'` で 設定された値がイコールとなる

想定のはずが、`@name` の値は `tanaka` のままとなっている。。。


代替案として、initialize で設定していたインスタンス変数 name と age を runメソッドに移動し、

```rb:sample01.rb
class Sample01

  def initialize
    @data = {name: "tanaka", age: 30}
    # run に移動
    # @name = _get_name
    # @age = _get_age
  end

  def run
    @name = _get_name
    @age = _get_age
    puts "私の名前は#{@name}(#{@age}歳)です"
  end

  private

  def _get_name
    @data[:name]
  end

  def _get_age
    @data[:age]
  end
end
```

同様のテストを run メソッドに対し行うことでとりあえず解決した。

```rb:sample01_spec.rb
require './sample01'

describe Sample01 do
  let(:instance) { described_class.new }

  let(:data) { {name:'test', age: 99} }

  before :each do
    instance.instance_variable_set(:@data, data)
  end

  describe '#run' do
    subject { instance.run }

    it 'インスタンス変数が正しく設定されていること' do
      subject
      expect(instance.instance_variable_get(:@name)).to eq 'test'
      expect(instance.instance_variable_get(:@age)).to eq 99
   end
  end
end
```

テスト結果

```
$ bundle exec rspec sample01_spec.rb 
私の名前はtest(99歳)です
.

Finished in 0.00546 seconds (files took 0.15378 seconds to load)
1 example, 0 failures
```
Objective-C で Swift の let 宣言

# ネタです


```objc
#define Let(x) const x const
#define Var(x) x
```


![AppDelegate_m.png](https://qiita-image-store.s3.amazonaws.com/0/8508/6e1b4b66-da2d-15fa-eddd-2300c12e5d66.png)
branch名にuser storyのidを入れてコミットメッセージにuser storyのURLを自動で貼る

追記: 実際使ってみたら上手く動作しなかったため、調べ直して使用するhookを変更しました。Qiitaでも既出のネタでしたね :sweat:

ここにPivotal Trackerのstoryがあるじゃろ？

https://www.pivotaltracker.com/n/projects/1234567/stories/123456789

これの末尾の「stories/123456789」の部分だけ抜き出すと、

```shell-session
$ git checkout -b stories/123456789
```

user storyに対応したbranchができるじゃろ？

これを↓の `.git/hooks/prepare-commit-msg`と組み合わせて

```sh:.git/hooks/prepare-commit-msg
#!/bin/bash

story_id=$(git rev-parse --abbrev-ref HEAD | sed -n 's#.*stories/\([0-9]\+\).*#\1#p')
story_url=https://www.pivotaltracker.com/story/show/$story_id

if [ -n "$story_id" ] && ! grep --quiet -e $story_url $1 ; then
  echo >> $1
  echo user story: $story_url >> $1
fi
```

```shell-session
$ chmod +x .git/hooks/prepare-commit-msg
```

いつもどおり`git commit`すれば、

![2015-08-commit-message-with-url.png](https://qiita-image-store.s3.amazonaws.com/0/12688/e34138a1-9fac-0a51-3ba6-8125a5cc15ba.png)

user storyへのURL付きコミットメッセージの出来上がりじゃ。

# 参考

[【Github時代のgit hook】issue番号を勝手にcommit commentに入れてくれるやつ - Qiita](http://qiita.com/jumbOS5/items/9e63f4835b9335cbaf22)
[How to get current branch name in Git? - Stack Overflow](http://stackoverflow.com/questions/6245570/how-to-get-current-branch-name-in-git)
[リファクタリング]　for文のネスト２ （個人用）

深いネストのリファクタリング。
returnできるところでさっさとreturnする。

<BR>
・よくある深いネストのケース
改善前

```java:Java
public int func1(int a, int b)
{
    int result;
    if (a > 10)
    {
        if (a > 20)
        {
            if (a > 30)
                result = b;
            else
                result = 3;
        }
        else
            result = 2;
    }
    else
        result = 1;

    return result;
}
```

↓

改善後

```java:Java
public int func1(int a, int b)
{
    if (a < 10)
        return 1;

    if (a < 20)
        return 2;

    if (a < 30)
        return 3;

    return b;
}
```

<BR>
・意図したデータが与えられたかどうかのチェックを行うたびにネストさせるケース
改善前

```java:Java
public bool isValid(Data a)
{
    if(a != null)
    {
        if(a.Count > 0)
        {
            if(a.Error == null)
            {
                if (a.Result != null)
                    return true;
            }
        }
    }
    return false;
}
```

↓

改善後

```java:Java
public bool isValid(Data a)
{
    if (a == null)
        return false;

    if (a.Count > 0)
        return false;

    if (a.Error == null)
        return false;

    if (a.Result != null)
        return true;
    else
        return false;
}
```


<br><br><br>
参照
http://anopara.matrix.jp/2014/06/27/do-not-write-deep-nested-code/
VirtualBoxをインストールするplaybook(Debian)

ansibleの勉強がてら、Debian系のLinuxでVirtualBoxをインストールするplaybookを作ってみた。
試した環境はLinux Mintだけど、Debian系のLinuxなら使えるはず。

```yml:virtualbox.yml
---
- hosts: 127.0.0.1
  user: USER
  sudo: yes
  tasks:
    - name: add key
      apt_key: url='https://www.virtualbox.org/download/oracle_vbox.asc'
    
    - name: add repository
      apt_repository: repo='deb http://download.virtualbox.org/virtualbox/debian vivid contrib'

    - name: install package
      apt: name='virtualbox-5.0' state=latest
```

参考：
https://www.virtualbox.org/wiki/Linux_Downloads
http://docs.ansible.com/ansible/apt_key_module.html
http://docs.ansible.com/ansible/apt_repository_module.html
http://docs.ansible.com/ansible/apt_module.html
[リファクタリング]　for文のネスト  （個人用）

深いネスト。
だいたい三階層ぐらいが限度。
<br>
改善前

```java:Java
if (!errorFlag) {
    for (int i = 0; i < 100; i++) {
        if (valueList[i] != null) {
            if (hogehoge) {
                （略１）
            } else {
                （略２）
            }
        }
    }
}

```
<br>
　　　　↓
<br>

改善後１
最初にエラーだった時点でreturnしてしまう。

```java:Java
if (errorFlag) {
    return;
}
for (int i = 0; i < 100; i++) {
    if (valueList[i] != null) {
        if (hogehoge) {
            （略１）
        } else {
            （略２）
        }
    }
}
```
<br>
　　　　↓
<br>
改善後２
ループの中で何もしなくていい場合はcontinueし、
余分なelse文を取ればこのメソッドは完成。

```java:Java
if (errorFlag) {
    return;
}
for (int i = 0; i < 100; i++) {
    if (valueList[i] == null) {
        continue;
    }
    if (hogehoge) {
        （略１）
        continue;
    }
    （略２）
}
```
<br>
<br>

参照
http://refactoring-brique.info/logic/nest/
メモ！Finderで隠しファイル・フォルダを表示 - Mac

# 隠しファイル・フォルダを表示

- ターミナルを起動するとプロンプト（$）が表示されるので、隠しファイル・フォルダを表示するように以下のdefaultsコマンドを実行します。

```
$ defaults write com.apple.finder AppleShowAllFiles TRUE
```

-設定を反映するために「Finder」プロセスを終了します。

```
$ killall Finder
```

# 隠しファイル・フォルダを非表示

- 隠しファイル・フォルダを非表示（デフォルトの設定）に戻す場合は、ターミナルに以下のコマンドを実行します。

```
$ defaults write com.apple.finder AppleShowAllFiles FALSE
$ killall Finder
```
タワーディフェンスの作り方ではまってしまったのでメモ

尾関俊介氏の「タワーディフェンスのつくりかた」を読みながら実際に手順通りコーディングをしています。

レビューではネガティブな意見も見られましたが、650円という低価格でこの内容は本当に素晴らしいと思います。

ただJAVAやC#など、オブジェクト指向のプログラミング言語を知らないとついていくのは苦しいかもしれません…

さて、タワーディフェンスの作り方ではまってしまったのでメモです。

「2.22 タワーのアップグレードを実装する」の最後の方に、「ゲーム開始時にタワー情報テキストが表示されてしまっていますね。」とあります。

それを回避するためにGameMgr.csのStartメソッドの最後でChangeSelMode(eSelMode.None)を呼んでいるのですが、そのあたりで下記のエラーが出てしまい先に進めなくなりました…

--エラー内容--
NullReferenceException: Object reference not set to an instance of an object
MyCanvas.SetActive (System.String name, Boolean b) (at Assets/Scripts/Unity/MyCanvas.cs:20)
GameMgr.ChangeSelMode (eSelMode mode) (at Assets/Scripts/GameMgr.cs:199)
GameMgr.Start () (at Assets/Scripts/GameMgr.cs:102)
--ここまで--

原因はMonoBehaviourを継承している、MyCanvasクラスとGameMgrクラスにありそうです。

想定ではMyCanvasのStartメソッドが先に呼ばれて、メンバ変数の\_canvasを設定し、GameMgrのStartメソッドでその_canvasを使った処理をする。

なのですが、GameMgrのStartメソッド中のMyCanbas.ChangeSelMode(eSelMode.None)実行時には、MyCanvasのStartメソッドはまだ実行されておらず、_canvasがnullになっていたためNullReferenceExceptionが発生していたようです。

MyCanvasのStart処理をGameMgrのStartメソッドより先に行うために、下記のようにMyCanvasを変更してみました。

     void Awake () {
          // Canvasコンポーネントを保持
          _canvas = GetComponent<Canvas>();
     }

CanvasコンポーネントをStartメソッドではなく、Awakeメソッドで取得するように変更しました。

これで自分の環境ではうまく動くようになりました。

著者が提供してくださったソースに手を加えるのには抵抗がありましたが…

Awake, Startの呼び出しについてunityのドキュメント
http://docs.unity3d.com/ja/current/Manual/ExecutionOrder.html
SQL Server AlwaysOn 構築メモ（その６）


前編ではフェールオーバーの簡単なテストを行ないました。
ここでは、その他、日常の運用で発生する作業などをまとめてみます。

##全体構成

* その１：[前提知識の整理と基礎環境構築編](http://qiita.com/zaburo/private/5ca86becda6023b90f7e)
* その２：[WSFC(Window Server Failover Clustering)構築編](http://qiita.com/zaburo/private/cb8f82ebbe553ccbb6fe)
* その３：[AlwaysOn構築編](http://qiita.com/zaburo/private/3468af8cd7d89b4c8bd5)
* その４：[接続確認編](http://qiita.com/zaburo/private/055542f1f1b36668b87f)
* その５：[テストしてみる](http://qiita.com/zaburo/private/b25794fa2b05bcf331e7)
* その６：[その他（可用性グループへのDB追加など）](http://qiita.com/zaburo/private/3c3d17051bb612828fda)

##本編での主な内容

* 可用性グループにDBとユーザーを追加する
* 可用性グループからDBを削除する

##可用性グループにDBとユーザーを追加する

AlwaysOn稼働後、個人的に一番多く発生するのは可用性グループへのDBの追加とユーザーの追加です。
なので、その流れだけを改めておさらいしておきます。

###DBの追加

DBを作成します。データファイルとログファイルの位置に注意して下さい。

![ao](http://www.bluecode.jp/qiita/ao065.png)

一応テーブル作っておきます。

![ao](http://www.bluecode.jp/qiita/ao066.png)

一応データも挿入しておきます。

![ao](http://www.bluecode.jp/qiita/ao067.png)

包含データベースが有効になっている前提で、DBのプロパティのオプションにて、「コンテインメントの種類」を「部分」に変更します。
なお、ここでエラーが出た場合、DBのデザインエディタやクエリエディタを閉じて再実行してみてください。

![ao](http://www.bluecode.jp/qiita/ao068.png)

対象DBのセキュリティ、ユーザーにて、ユーザーを追加します。
通常のデータベースのログインユーザーを作成する方法とはことなりますので注意して下さい。

![ao](http://www.bluecode.jp/qiita/ao069.png)

ユーザー作成後、作成したユーザーのプロパティを開き、適切なメンバーシップを設定します。

![ao](http://www.bluecode.jp/qiita/ao070.png)

ユーザーの作成が完了したら、一度、バックアップを取得しておきます（可用性グループへの追加条件となります）。
復旧モデル、種類ともに「完全」でなくてはなりません。また、保存場所はSQL1,SQL2から見える共有フォルダを指定します。

![ao](http://www.bluecode.jp/qiita/ao071.png)

一連の準備作業が完了したら、可用性グループにデータベースを追加します。
可用性データベース項目を右クリックし、データベースの追加を選択し、ウイザードをスタートさせます。

![ao](http://www.bluecode.jp/qiita/ao072.png)

次へ進めます。

![ao](http://www.bluecode.jp/qiita/ao073.png)

追加したDBを選択します。何か、前処理を忘れていたらここで警告され、次へ進めません。

![ao](http://www.bluecode.jp/qiita/ao074.png)

バックアップファイルの保存場所を設定します。

![ao](http://www.bluecode.jp/qiita/ao075.png)

セカンダリへ接続し、接続情報を登録します。

![ao](http://www.bluecode.jp/qiita/ao076.png)

検証が行われます。正しく終了したら次へ進みます。

![ao](http://www.bluecode.jp/qiita/ao077.png)

作業内容を確認し、次へ進みます。

![ao](http://www.bluecode.jp/qiita/ao078.png)

追加処理が行われます。

![ao](http://www.bluecode.jp/qiita/ao079.png)

SQL1のManagement Studioで追加されたことを確認します。

![ao](http://www.bluecode.jp/qiita/ao080.png)

またSQL2でも、念のため確認しておきましょう。

![ao](http://www.bluecode.jp/qiita/ao081.png)

##可用性グループからDBを削除する

可用性グループからDBを削除するステップも確認しておきましょう。
手順としては、

* 可用性グループからDBを削除する
* DB本体を削除する（必要ならば）

となります。

可用性グループから対象のデータベースを右クリックし「可用性グループからデータベースを削除」を選択します。

![ao](http://www.bluecode.jp/qiita/ao082.png)

問題なければOKをクリックします。

![ao](http://www.bluecode.jp/qiita/ao083.png)


SQL2でも同期が停止します。なお、同期が停止してもDBは削除されず、「復元しています」のステータスでずっと残るようです。
再度同じDBを可用性グループに追加する場合には、同じ名前のDBがあると追加できませんので、手動で残骸を削除する必要があるようです。

![ao](http://www.bluecode.jp/qiita/ao085.png)
SQL Server AlwaysOn 構築メモ（その５）


前編では外部からAlwaysOn構成のDBに接続することができました。
ここでは、実際にサーバをダウンさせて、動作のテストを行ってみたいと思います。

##全体構成

* その１：[前提知識の整理と基礎環境構築編](http://qiita.com/zaburo/private/5ca86becda6023b90f7e)
* その２：[WSFC(Window Server Failover Clustering)構築編](http://qiita.com/zaburo/private/cb8f82ebbe553ccbb6fe)
* その３：[AlwaysOn構築編](http://qiita.com/zaburo/private/3468af8cd7d89b4c8bd5)
* その４：[接続確認編](http://qiita.com/zaburo/private/055542f1f1b36668b87f)
* その５：[テストしてみる](http://qiita.com/zaburo/private/b25794fa2b05bcf331e7)
* その６：[その他（可用性グループへのDB追加など）](http://qiita.com/zaburo/private/3c3d17051bb612828fda)

##本編での主な内容

* フェールオーバーさせてみる
* 復旧？させてみる

##フェールオーバーさせてみる

では、実際に現在プライマリとして稼働しているSQL1をダウンさせて動作を確認してみます。
現在、SQL1がプライマリになっていることをいちおう確認します。

![ao](http://www.bluecode.jp/qiita/ao057.png)

アクセスしてデータも確認しておきます。今は3件です。

![ao](http://www.bluecode.jp/qiita/ao058.png)

では、実際にダウンさせてみましょう。Windows Updateが溜まっていたので「更新してシャットダウン」してみました。実運用でも、パッチを当てるという作業はあるかと思います。

![ao](http://www.bluecode.jp/qiita/ao059.png)

SQL1が更新処理をしているときに、再度データをを参照してみます。データが参照できます。
フェールオーバーしているようです。

![ao](http://www.bluecode.jp/qiita/ao060.png)

では、SQL1はダウン中なので、SQL2のManagement Studioで状態を確認してみます。
SQL1がダウン状態で、SQL2がプライマリになっていることが確認できます。

![ao](http://www.bluecode.jp/qiita/ao061.png)

では、この状態で、SQL2に対して更新処理を行っておきましょう。1件データを追加しておきます。

>なぜかオートインクリメントがいきなり1000とかにカウントアップされていまね。フェールオーバーがかかるとオートインクリメントは一気に1000位が上がるようです。仕様でしょうか。仕様だとしたら実装では注意が必要ですね。

![ao](http://www.bluecode.jp/qiita/ao062.png)

SQL1を起動させてみます。セカンダリとして起動し、かつ、SQL2で更新したデータが取得できています。

![ao](http://www.bluecode.jp/qiita/ao063.png)

自動フェールオーバーでは、本当に何もしなくても、簡単に冗長化することができることが分かりました。
Windows Azure等では、Azure自体のメンテナンスのために、VMがリスタートされることがあるので、そういうシーンでは自動フェールオーバーは有用かもしれません。

##復旧？させてみる

正直、AlwaysOnでは、可用性グループのどれかが動いていればOKなので、例えばSQL1が復活したからといって、無理にプライマリをSQL1に戻したりする必要は無いかなと思いますし、どれがプライマリになっているかを意識しない運用の方がいいと思います。が、なんらかの理由でSQL1をプライマリに戻したい場合は、単純に、SQL2をダウンさせるのが一番手っ取り早いです。

##余談

フェールオーバーさせると、オートインクリメントが1000カウントアップするようです。再度、SQL1をプライマリに戻すと、桁が2000番台になりました。そのご後は、1つずつカウントアップするようです。
[軽く調べた範囲](https://social.msdn.microsoft.com/Forums/sqlserver/en-US/3d256650-0e94-4d0f-8b52-0ba6e1903215/primary-key-auto-incrementing-by-1000-instead-of-1?forum=transactsql)では、AlwaysOnはあまり関係なく、ある条件下でSQLが再起動すると、このような現象が起こるようです。。。

![ao](http://www.bluecode.jp/qiita/ao064.png)

カウントアップの件は、引き続き調査をしてみますが、ひとまずフェールオーバー自体はうまく動きました。
その他、網羅できなかった点を[その6](http://qiita.com/zaburo/private/3c3d17051bb612828fda)で書いてみたいと思います。
スマートフォンのWi-Fiや3G通信はCPUよりも電力を消費するというグラフ

スマートフォンの構成要素ごとの消費電力データ探していて、以下の論文を発見。

G.P. Perrucci, F.H.P Fitzek, J. Widmer, "Survey on Energy Consumption Entities on the Smartphone Platform“, Vehicular Technology Conference (VTC Spring), 2011 IEEE 73rd, 2011-03, http://www.researchgate.net/profile/Frank_Fitzek/publication/224248235_Survey_on_Energy_Consumption_Entities_on_the_Smartphone_Platform/links/0deec51a4e140ccd35000000.pdf

2011年の論文で、しかもNokia N95という2007年発売の日本ではかなりマニアックなスマートフォンのデータだが、結構面白いのでかいつまんでグラフ化してみた。

![NokiaN95_chart.png](https://qiita-image-store.s3.amazonaws.com/0/37648/6cce6ac3-66c1-8be6-d445-4dc4a026986e.png)

Nokia N95のCPUは332MHzのARM1ということも要因だとは思うが、CPUを100%でフル稼働させるよりもWi-Fiや3G通信の方が消費電力が圧倒的に大きい。

さらにWi-FiをAd-hocモードで利用すると、アイドルしていてもCPU100%より電力を喰らうらしい。

![nokian95_table.PNG](https://qiita-image-store.s3.amazonaws.com/0/37648/047f29b0-3dec-427d-92fa-481c0b2e48c8.png)

iPhone6やNexsus6など最新のスマートフォンでの研究論文をもし知っている人がいらっしゃれば、教えて下さい！
技術英語 > but other than that, there's nothing I can do

@ Star Trek Voyager > CATHEXIS

負傷したチャコティに対する治療についてドクターが言った言葉

> but other than that, there's nothing I can do
(しかし、それ以外、できることが何もない)

<hr>
関連して

[weblio](http://ejje.weblio.jp/content/%E5%8C%99%E3%82%92%E6%8A%95%E3%81%92%E3%82%8B)
> 匙を投げる <匙>
> give something up as hopeless; throw in the towel [sponge]; despair of something
Substance Designer 5からUnity 5へPBRマテリアルをもっていくワークフロー


Substance Designerでプロシージャルなテクスチャを作ってパラメータを設定すれば、Unityでランタイムでそのパラメータをいじってテクスチャを生成できると聞いて、そのワークフローを確認してみた。

##１．新規PBR用テクスチャ
![Screen Shot 2015-08-30 at 05.21.56.png](https://qiita-image-store.s3.amazonaws.com/0/42909/3fe39534-e5ce-e7ee-ef6a-4677380ad1be.png "Screen Shot 2015-08-30 at 05.21.56.png")
まずは新規作成でPhysically Based (Metallic/Roughness)を選択。その下のPhysically Based (Specular/Glossiness）でもいいらしいけど、Metallic/Roughnessの方がテクスチャの意味がわかりやすいらしい。

##２．Unityで使うアウトプット
![Screen Shot 2015-08-30 at 05.55.45.png](https://qiita-image-store.s3.amazonaws.com/0/42909/66781ecc-7c28-7de3-c1b7-bcb4663ca3dd.png "Screen Shot 2015-08-30 at 05.55.45.png")

Physically Based(Metallic/Roughness)を選ぶと、４つのアウトプットが現れる。このうちUnityで使われるのはBase ColorとNormalとMetallic。Roughnessは、UnityではMetallicマップのアルファチャンネルで設定する。またUnityではRoughnessではなくSmoothnessと言われる。なので、Substanceで扱われるRoughnessマップをInverseしてMetallicのアルファチャンネルにつなげる。

##３．マテリアル作成
![Screen Shot 2015-08-30 at 05.26.16.png](https://qiita-image-store.s3.amazonaws.com/0/42909/225761bc-2626-5485-eeac-02fd5621ebc1.png "Screen Shot 2015-08-30 at 05.26.16.png")
適当にノードをつないでマテリアルを作る（図はLynda.comのUp and Running Substance Designerのサンプルマテリアル）

##４．マテリアルのエクスポート
Explorerのなかにある.sbsを右クリックしてPublishを選択しsbsarファイルをエクスポートする。Publishオプションはデフォルトのままで。

##５．Unityにエクスポートしたsbsarファイルをインポート
![Screen Shot 2015-08-30 at 06.01.10.png](https://qiita-image-store.s3.amazonaws.com/0/42909/d4b528b3-4f56-a85d-73fd-9a6550d70a4c.png "Screen Shot 2015-08-30 at 06.01.10.png")

sbsarファイルをUnityにドラッグ＆ドロップでインポート。無事各アウトプットがUnityのStandardシェーダーの各スロットに適用されている。

Occulusionマップなどを追加したい場合は、Substance DesignerでOutputを追加して、Usageにそのマップに応じたアイテムを追加する（OcculusionであればambientOcclusion）
Elixirを試してみた。HirofumiTamori さんのElixirチュートリアルをやってみる

[[翻訳] Elixir - 次に来る大物Web言語](http://qiita.com/HirofumiTamori/items/0dfdbada30c7d8f183fd)を見て、Elixirに興味を持った。

HirofumiTamoriさんが、その後、

- [Elixirで試しに何か書いてみる(その1)](http://qiita.com/HirofumiTamori/items/602d9b326cb4816c2fe6)
- [Elixirで試しに何か書いてみる(その2)](http://qiita.com/HirofumiTamori/items/7936ed9c6f73f4c9b475)
- [Elixirで試しに何か書いてみる(その3) - Elixirのアプリケーション](http://qiita.com/HirofumiTamori/items/06ab8e85c25f118f8e72)
- [Elixirで試しに何か書いてみる(その4) - Taskを使って簡単にする)](http://qiita.com/HirofumiTamori/items/ed131104494f4bd2f695)

という記事を挙げられていたので、それをそのまま真似て作ってみた。

## Elixirで試しに何か書いてみる(その1)

上のままでは上手く動かっなかったので、ちょっと修正した。

https://gist.github.com/shibacow/cf9b51839fbf25632b18

HirofumiTamoriさんに報告したので、[Elixirで試しに何か書いてみる(その1)](http://qiita.com/HirofumiTamori/items/602d9b326cb4816c2fe6)も治っている。

## [Elixirで試しに何か書いてみる(その2)

その２を真似て書いた。動かない部分は修正している2015-08-29時点。

https://gist.github.com/shibacow/91b6e9a93621af8472f0

特にはまった所は無いように思う。

## [Elixirで試しに何か書いてみる(その3) 

コマンドラインの実行ファイルを作る。

どこまで改編するか分からなかったので、 vercheckex2という別フォルダーを作って試した。

主要はソースはこちら。

https://gist.github.com/shibacow/18c0006d54038f4e27d3

```$mix escript.build``` で、vercheckex2 という実行ファイルが出来上がる。このファイルだけ、別のフォルダーに移して実行したら、これ単体で動いた。

![実行ファイル生成](https://i.gyazo.com/a7ff68192c5eb8421b8f54b41977511c.png)

##  [Elixirで試しに何か書いてみる(その4) - Taskを使って簡単にする)

主要なファイルはこちら。

https://gist.github.com/shibacow/4188df3d48747c7efbbc

確かにタスクを使うと凄まじく簡単になる。

Elixir確かにすごく便利かもと感じた。
専門学校を選ぶポイント#1


###記述する動機
私、とある専門学校でPGを教えています。はや９年。
いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩める高校生、悩める教育関係者にも何かのヒントにはなると思い、公開していきたいと思います。全て実例です。学校名は秘密！！

###認可校、不認可校
認可校の方が、金銭面で若干有利です。
資格も一応はもらえます。履歴書にも学歴として記載できる。
不認可校は色々と不利な点が多いです。
教育内容は運用してる人によりけり。
認可校でも、グダグダだったり、不認可校でも素晴らしい内容だったり。

###教育内容の確認
オープンキャンパスに行くことです。保護者同伴が望ましい。
以下、良く言われる大嘘を列挙しておきます。
就職率１００％ー＞あり得ません。統計上進路をきめたことになれば「就職あつかい」
夢が叶うー＞学校に入っただけではなんにもなれません。
最新設備ー＞全部がそうなのかを質問しましょう。
著名人ー＞名前を貸してるだけのところが殆どです。

###何故そうなのか？
緩くすればするほど学生数が見込めるので、学費で儲かるからです。
学費は先払い。奨学金で払ってねなんです。
学校としての理念があるのかどうなのかを見極める必要があります。

###とにかく下調べ
業界の平均収入、就業上の実体をしらべましょう。
そのうえで質問してみて下さい。
明確な答えがあれば、検討してもいい学校です。
【Promise】JSONPの読み込みをThenableにする

# 関数定義

JavaScript初心者なので改善点あればマサカリください。

```js:jsonp_loader.js
function loadJSONP(url, params, timeout, callbackParamName) {
    params = params || {};
    timeout = timeout || 0;
    callbackParamName = callbackParamName || 'callback';
    var callbackName = 'jsonpCallback' + Math.random().toString(16).slice(2);
    params[callbackParamName] = callbackName;
    url += '?' + Object.keys(params).map(function (key) {
        return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
    }).join('&');
    var script = document.createElement('script');
    script.src = url;
    document.body.appendChild(script);
    return new Promise(function (resolve, reject) {
        window[callbackName] = resolve;
        script.addEventListener('error', reject);
        if (timeout > 0) {
            setTimeout(reject, timeout);
        }
    }).then(function (response) {
        delete window[callbackName];
        document.body.removeChild(script);
        return Promise.resolve(response);
    }, function (e) {
        var msg = e ? 'Execution Failed' : 'Request Timeout';
        delete window[callbackName];
        document.body.removeChild(script);
        return Promise.reject('JSONP ' + msg + ': ' + url);
    });
}
```

最初エラーハンドリングの方法に悩んでいたのですが、`onerror`属性で何とかなりました。[@gaogao_9](http://twitter.com/gaogao_9)さん助言ありがとうございました。
↓
@chitokuさんによりよい方法を教えていただいたので採用しました。
↓
@Raggさんに`delete`の提案をいただきました。
↓
ついでにタイムアウトでエラーにする機能も付けました。
↓
@think49さんに`Object.keys`の提案をいただきました。

# 使用例

面倒なのでHTML5の最省略形で書いてます。

```html:index.html
<!DOCTYPE html>
<title>example</title>
<script src="jsonp_loader.js"></script>
<script>
    // はてなブックマークの総数を並列に取得してきて
    // 全部終わったらコンソールに表示するだけのコード
    window.onload = function () {
        var hatebuUrl = 'http://api.b.st-hatena.com/entry.counts';
        var list = [
            'http://www.google.com/',
            'http://yahoo.co.jp/',
            'http://twitter.com/',
            'http://qiita.com/'
        ];
        Promise.all(list.map(function (url) {
            return loadJSONP(hatebuUrl, {url: url});
        })).then(function (results) {
            console.log(results); // レスポンスの配列になってます
        }, function (message) {
            console.error(message); // 最初の1件のエラーのみ取り扱われます
        });
    };
</script>
```

実際には、はてブAPIは50件まで一気にまとめてリクエスト出来るようなので、出来る限りそれに従った実装を採り、サーバに負荷をかけないようにしましょう。
MacでGLUT+OGL＃5


記述の動機
GLUT+OGLがMacではサクッと環境構築できることを知りました。
使わない手はないので、少しづつまとめていきます。
今回はkeyの判定です。
参考はこちら。http://wisdom.sakura.ne.jp/system/opengl/gl10.html
Macなのでインクルードは２行で良いです。


``` keytest.cpp
#include <stdio.h>
#include <GLUT/glut.h>

void disp( void ) {
	glClear(GL_COLOR_BUFFER_BIT);
}

void key(unsigned char key , int x , int y) {
	printf("Key = %c\n" , key);
}

int main(int argc , char ** argv) {
	glutInit(&argc , argv);
	glutInitWindowPosition(100 , 50);
	glutInitWindowSize(400 , 300);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);

	glutCreateWindow("Kitty on your lap");
	glutDisplayFunc(disp);
	glutKeyboardFunc(key);

	glutMainLoop();
	return 0;
}
```


```コンパイルコマンド
g++ -o keytest.out keytest.cpp -framework GLUT -framework OpenGL
```
keyの判定。簡単ですね。
![スクリーンショット 2015-07-12 21.15.33.png](https://qiita-image-store.s3.amazonaws.com/0/33317/085f9876-a30a-6871-7731-b0598b166e14.png "スクリーンショット 2015-07-12 21.15.33.png")
Xcode6でiOS9をデバッグする方法


# はじめに
ATSなどそれなりに影響あるので、Xcode7にすぐに移行出来ない人向けのトピックスです。
みんな知ってるかもしれないけど、知らない人がいるかもしれないので・・・。

# 準備するもの
- Xcode 6.x
- Xcode 7.x
- iOS 9.x

# 手順
1. Xcode6を開いている場合には終了します
2. Xcode7で任意のプロジェクトを開きます
3. iOS9のデバイス(画像ではiPod Touch 5th)を接続して、認識されたことを確認します
![スクリーンショット 2015-08-30 00.36.07.png](https://qiita-image-store.s3.amazonaws.com/0/80840/ef8d2436-4b0d-39dc-6b6e-b8070716b789.png)
4. Xcode6を立ち上げると、iOS9のデバイスが認識されデバッグが可能になります
![スクリーンショット 2015-08-30 00.43.09.png](https://qiita-image-store.s3.amazonaws.com/0/80840/0cc29a02-c588-deac-d226-1d48bebc2c8e.png)


以上！
ThinkPad X250のバッテリ充電閾値を設定する方法

![battery.png](https://qiita-image-store.s3.amazonaws.com/0/59839/7c5fe67e-db01-592a-d726-c6c54f50f685.png)
*100%未満であるにも関わらず「充電完了」と表示されていることに注目*

# 概要
ThinkPadで普段ACアダプタを刺しっ放し運用をしている方は、バッテリ延命のため、**バッテリ残量が45%未満になると充電を開始し、65%で充電を停止する**ような設定があると、精神衛生上良いと思ったことはありませんか。当記事は、それを設定する方法を説明しています。

# 環境
- ThinkPad X250[^1]
- Windows 10 (64bit)

[^1]: ThinkPad X250は、ご存じの通りバッテリを2つ搭載しています。このregファイルは、両方のバッテリに対して充電閾値を設定する内容です。

どのソフトウェアと依存しているか判らないので、関係ありそうなものを列挙します。

- Lenovo Settings 3.0.29.0 (ユニバーサルアプリの設定画面で表示されるバージョン)
- Lenovo Power Management Driver 1.67.10.15 (プログラムと機能で表示されるバージョン)

# regファイル

- バッテリ残量が45%未満になると充電を開始し、65%で充電を停止する設定です。
- `1ZS7XXXXXXX`または`1ZS7YYYYYYY`の部分は、ご自身の`HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Lenovo\PWRMGRV\ConfKeys\Data`を参照し、適宜変更をお願いします。
- 私の環境ではキーが2つあったのですが、本来は1つで良いのかもしれません。

```registry:Set45to65_ChargeStartStopPercentage.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Lenovo\PWRMGRV\Data]
"ChargeStartControl"=dword:00000001
"ChargeStopControl"=dword:00000001
"ChargeStartPercentage"=dword:0000002d
"ChargeStopPercentage"=dword:00000041

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Lenovo\PWRMGRV\ConfKeys\Data\1ZS7XXXXXXX]
"ChargeStopControl"=dword:00000001
"ChargeStartControl"=dword:00000001
"ChargeStartPercentage"=dword:0000002d
"ChargeStopPercentage"=dword:00000041

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Lenovo\PWRMGRV\ConfKeys\Data\1ZS7YYYYYYY]
"ChargeStopControl"=dword:00000001
"ChargeStartControl"=dword:00000001
"ChargeStartPercentage"=dword:0000002d
"ChargeStopPercentage"=dword:00000041
```

# 使い方

1. スタートメニューを開き`regedit`と入力して、レジストリエディタを開きます。
2. `HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Lenovo\PWRMGRV\ConfKeys\Data`に移動し、キー名を確認します。
3. regファイルに含まれるキー名を編集して保存します。
4. regファイルをダブルクリックして適用します。
5. Windowsを再起動します。

# 免責

記載誤り等がありましたら、ご指摘ください。
**レジストリの編集は各位の自己責任に於いて実施してください。**不具合が発生した場合に復旧する自信の無い方は実施しないでください。当記事の手順を実施したことによる不利益の責任は負いかねます。

以上
コマンドラインでWebSocketクライアント

[Mojolicious - 5年前の動かなくなっていたWebSocketコードをなんとかする - Qiita](http://qiita.com/ymko/items/03780e066ba3bf34d8e5)
の続き。

curlコマンドみたいなhttpアクセスできるものを想像すると近い。
Webブラウザ使わなくてもデバッグできるので負荷試験だとかにも役立つ。

# 送信して切断

```pl:agent.pl
use strict;
use warnings;
use Mojo::UserAgent;

my $ua = Mojo::UserAgent->new;
$ua->websocket('ws://localhost/echo' => sub {
  my ($ua, $tx) = @_;
  print "WebSocket handshake failed!\n" and return unless $tx->is_websocket;

  $tx->on(finish => sub {
    my ($tx, $code, $reason) = @_;
    print "WebSocket closed with status $code.\n";
  });

  $tx->on(message => sub {
    my ($tx, $msg) = @_;
    print "WebSocket message: $msg\n";
    $tx->finish;
  });

  $tx->send('Hi!');
});
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
```

```bash
$ perl agent.pl
WebSocket message: {"hms":"23:58:05","text":"Hi!"}
WebSocket closed with status 1005.
```

# 待ち続けて受信する

```pl:loop.pl
use strict;
use warnings;
use Mojo::UserAgent;

my $ua = Mojo::UserAgent->new;
$ua->websocket('ws://localhost/echo' => sub {
  my ($ua, $tx) = @_;
  print "WebSocket handshake failed!\n" and return unless $tx->is_websocket;

  Mojo::IOLoop->stream($tx->connection)->timeout(0);

  $tx->on(finish => sub {
    my ($tx, $code, $reason) = @_;
    print "WebSocket closed with status $code.\n";
  });

  $tx->on(message => sub {
    my ($tx, $msg) = @_;
    print "WebSocket message: $msg\n";
    #$tx->finish;
  });

  $tx->send('Hi!');
});
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
```


```bash
$ perl loop.pl
WebSocket message: {"hms":"23:59:31","text":"Hi!"}
WebSocket message: {"hms":"23:59:34","text":"aaa"}
WebSocket message: {"hms":"23:59:36","text":"bbb"}
WebSocket message: {"hms":"23:59:37","text":"ccc"}
WebSocket message: {"hms":"23:59:42","text":"test"}
```

ブラウザから送信すると受信したメッセージが標準出力に出る

# 参考

Mojo::UserAgent · yuki-kimoto/mojolicious-guides-japanese Wiki
https://github.com/yuki-kimoto/mojolicious-guides-japanese/wiki/Mojo::UserAgent

Mojo::UserAgent - Non-blocking I/O HTTP and WebSocket user agent
http://mojolicio.us/perldoc/Mojo/UserAgent
Goでビルドバージョン情報を参照できるようにする(Go1.5)

## 課題

Goはビルドしてバイナリファイルのみを配布するので、それがどのバージョンであるか、いつビルドされたかの情報は重要です。バグの調査や、リリース時にそれが確認できないと、適切な対処ができないためです。

PHP,Python,Rubyなどはそのままコードが読めるので、そこに情報があれば見ることができますが、Goの場合、自分で準備します。

## 実装方法

Goでは、ビルドの引数-ldflagsを使って外から値を埋め込むことができます。

```
go build -ldflags "-X パッケージ名.変数=値"
```

これを使って、ビルドスクリプトから埋め込みます。簡単なコードとビルドスクリプトは以下のようなものです。

``` golang:inject_vars.go
package main

import (
	"fmt"
)

var (
	version   string
	hash      string
	builddate string
	goversion string
)

func main() {
	fmt.Printf("version: %s (%s)\n", version, hash)
	fmt.Printf("build at %s with %s\n", builddate, goversion)
}
```

``` bash:build.sh(Macで確認しているので、コマンドオプション等は異なる可能性があります)
#!/bin/bash

VERSION=0.1.0
HASH=$(git rev-parse --verify HEAD)
BUILDDATE=$(date '+%Y/%m/%d %H:%M:%S %Z')
GOVERSION=$(go version)

go build -ldflags "-X main.version=$VERSION -X main.hash=$HASH -X \"main.builddate=$BUILDDATE\" -X \"main.goversion=$GOVERSION\""
```

gitで管理している場合、`git rev-parse --verify HEAD`で現在のコミットハッシュが取れるので、それを渡して埋め込みます。

### オプションの書式が変わりました

以前のgoでは、変数と値の間はスペースでしたが、Go1.5では、書式が変更されて今後動かなくなる旨の警告がでます。`-X`の変数名と値の間は`=`にする必要があります。ビルドは通りますが、変えておいたほうがいいです。

```
# github.com/reiki4040/go-memo/inject_vars
link: warning: option -X main.version 0.1.0 may not work in future releases; use -X main.version=0.1.0
link: warning: option -X main.hash 73ce517b5b17ec2a1a0cd44fdce1a72712ce0a03 may not work in future releases; use -X main.hash=73ce517b5b17ec2a1a0cd44fdce1a72712ce0a03
link: warning: option -X main.builddate 2015/08/29 22:27:40 JST may not work in future releases; use -X main.builddate=2015/08/29 22:27:40 JST
link: warning: option -X main.goversion go version go1.5 darwin/amd64 may not work in future releases; use -X main.goversion=go version go1.5 darwin/amd64
```

埋め込む値がスペースを含む場合は、参考のリンクにあるように`-X main.hoge="foo var"`ではなく、`-X "main.hoge=foo var"`といった形になります。

## 結果
```
$ bash build.sh
$ ./inject_vars
version: 0.1.0 (73ce517b5b17ec2a1a0cd44fdce1a72712ce0a03)
build at 2015/08/29 22:27:40 JST with go version go1.5 darwin/amd64
```

これでビルド時に情報が埋め込めるので、実行オプション等で出力処理を作る必要はありますが、このバイナリいつのどのバージョン？といったことがなくなります。

## 参考

- [Go言語: ビルド時にバージョン情報を埋め込みたい](http://qiita.com/suin/items/d643a0ccb6270e8e3734)
- [v1.5 -ldflags -X change breaks when string has a space](https://groups.google.com/forum/#!topic/golang-nuts/aNDB4FrmEiA)
- [サンプルコード](https://github.com/reiki4040/go-memo/tree/master/inject_vars)
Azure Machine Learning で使用できるエンコーディング

だいたい機械学習で使う、データってCSVファイルなのですが
オープンデータやファイナンス系のデータってSJISなんですよね。。

AzureMLなら対応しているに違いない！と思ってアップロードしてみましたが

![スクリーンショット 2015-09-18 23.21.18.png](https://qiita-image-store.s3.amazonaws.com/0/36931/b99ac9e9-fb14-1571-1229-0566ca2eab74.png)



おもいっきり文字化けしていました。。。
・・なので必ずutf8にして上げましょう。


```
nkf -Lu hogehoge.csv > hogehoge_utf8.csv
```
Alfred WorkflowでEscapeキーの代替

## 動機
* Escapeキー押しづらい問題
* Karabinerでいい感じにリマップしていた
* でもKarabiner超重い
  * 初代MacBook Airには荷が勝ちすぎる
* なんとかEscapeキーだけでもリマップする方法はないか

## AppleScript
* Escapeキーコードを送ること自体はAppleScriptを使えば可能だ

```AppleScript
tell application "System Events" to key code 53 -- Escapeキーのキーコード
```

## ホットキーに割り当てる
* いずれの場合も、実行するアプリケーションにGUIスクリプティングの許可が必要である
* 「システム環境設定＞セキュリティとプライバシー＞プライバシー」で該当アプリを追加しよう

### AutoMator
* 当初はAutomatorでサービス作成してやろうとした
* しかし、ショートカットで実行するとなぜか働かない
* 'process'を指定したりすれば可能かもしれないが、めどい
* 複数のショートカット指定もできないし

### Alfred Workflow
* できた
* Karabinerに比べると、ちと反応は鈍い
* `simultaneouskeypresses`したいけど、贅沢は言えない

![スクリーンショット](https://i.imgur.com/tYWRC5D.png)
Javaで絶対パスを取得するgetAbsolutePath()の罠と解決方法

## やりたいこと
Javaで相対パス（絶対パスでもOK）から絶対パスを取得したい
File#getAbsolutePath()を使うと期待通りの結果になりませんでした。

最終的には、以下のコードで期待通りの結果になりました。
（relativePathの型はString）

```java
Paths.get(relativePath).toRealPath(LinkOption.NOFOLLOW_LINKS).toString()
```

どういう場合がうまくいかないのか、そしてその解決方法を書きたいと思います

## カレントディレクトリ
以下のディレクトリがカレントディレクトリです

```
/Users/nwtgck/IdeaProjects/getCanonicalPath test/
```

## getAbsolutePathでもOKな場合
以下のような相対パス（"out/production"）であれば、File#getAbsolutePath()でも期待通りの結果になります

```java
relativePath = "out/production";
System.out.println(new File(relativePath).getAbsolutePath());
```


```txt:出力
/Users/nwtgck/IdeaProjects/getCanonicalPath test/out/production
```

## getAbsolutePathの予想外[^1]の結果 

```java
relativePath = "..";
System.out.println(new File(relativePath).getAbsolutePath());

```

```txt:出力
/Users/nwtgck/IdeaProjects/getCanonicalPath test/..
```

相対パスが「..」なので、出力が親ディレクトリの"/Users/nwtgck/IdeaProjects"になることを期待しましたが、なりません。


## 「..」で親ディレクトリの絶対パスを取得する

File#getgetCanonicalPath()を使うと期待通りに取得できます

```java
relativePath = "..";
System.out.println(new File(relativePath).getCanonicalPath());
```

```txt:出力
/Users/nwtgck/IdeaProjects
```

基本的にはgetCanonicalPath()でOKですが、```relativePath```がシンボリックリンクの時はリンク先のパスになってしまいます。


## シンボリックリンクでも絶対パスを取得する
```java
relativePath = "/Users/nwtgck/Desktop/link";
System.out.println(Paths.get(relativePath).toRealPath(LinkOption.NOFOLLOW_LINKS));
```

```txt:出力
/Users/nwtgck/Desktop/link
```

シンボリックリンクでもそのファイル自体のパスになりました




[^1]: 仕様ですが、個人的には予想外でした
GitLabからGitHubへの引越し手順

GitLabからGithubへのブランチの引越しをやったので手順をメモしておきます。
作業内容としては、GitLabからソースをチェックアウトして、そのままGitHubにPushしただけです。

## 1)移行したいリポジトリをClone
```
git clone <URL>
git checkout <BRANCH>
```

## 2)リモートリポジトリを変更("git remote -v"で状態確認)
```
git remote -v
git remote remove origin
git remote -v
git remote add origin <URL>
git remote -v
```

## 3)Push
```
git push origin <NEW_BRANCH>
```

これで完了です。簡単 :hatching_chick:

#**※ただし大きいファイルがあるとNG(下記の手順を実施する必要があります)**
◆上述の手順3)を実施後、下記のようなエラーが出た場合は追加手順が必要です。

```
this is larger than GitHub's recommended maximum file size of 50.00 MB
this exceeds GitHub's file size limit of 100.00 MB
```

GitHubには単一ファイルは100Mまでしか扱えないという制限があるようなので、
そういった場合には下記の手順が追加で必要になります。

https://help.github.com/articles/working-with-large-files/
※参考

## 1)BFG Repo-Cleanerをダウンロード

BFG Repo-Cleaner というrepositoryを一括できれいにする為のツールがあるので、
http://rtyley.github.io/bfg-repo-cleaner/
の右からjarをダウンロード。 ※今回は「bfg-1.12.5.jar」を使いました。

## 2)実行
```
# java -jar bfg-1.12.5.jar --strip-blobs-bigger-than 50M
```
→こんなメッセージが出ます。
```BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive```

## 3)下記を実行しろと言われているので実行
```
git reflog expire --expire=now --all
git gc --prune=now --aggressive
```

## 4)Push
```
git push origin <NEW_BRANCH>
```

これで完了 :chicken:
PowershellでExcel操作

##既存のExcel操作方法について備忘録

```posh:excel.ps1
try{
        # Excelオブジェクト作成
        $excel = New-Object -ComObject Excel.Application
        $excel.Visible = $false
        
        # 既存のExcel
        $book = $excel.Workbooks.Open("Excelが置いてあるpath")

        # シート取り出し
        $sheet = $excel.Worksheets.Item(1)
        $sheet = $excel.Worksheets.Item("シート名")

        # セルのテキストを取得（設定は逆)
        $text1 = $sheet.Cells.Item(2,3).Text
        # セルの値（数字）を取得（設定は逆)
        $text1 = $sheet.Cells.Item(2,3).Value()


        # その他やりたい処理


        # 上書き保存
        $book.Save()
         
        # 閉じる
        $excel.Quit()
        
} finally {

        # null破棄
        $excel,$book,$sheet | foreach{$_ = $null}

}
```
##NULL破棄について
[PowerShellでNull破棄する際に最も適したやり方を探る]
(http://tech.guitarrapc.com/entry/2013/03/12/080349)
非エンジニアにSQLを覚えてもらうまで


## 最初に

* 非エンジニアはエンジニアがやっていることを怖がります。
* いくら「怖くないよ」、「難しくないよ」って言っても怖がります。
* なので、とりあえず、やらせてみましょう。

## 準備
* チャットにて、host、user、passwordを投げつける
* 相手に対して、DBを見れることによるメリット、SQLを覚えることによるメリットを
教えてあげる。

※スレーブのもの

## 非エンジニアがSQLを覚えるメリット
* データを直接見ることができる
* データ構造を知ることにより、エンジニアと話がしやすくなる
* テストをしている際にデータがおかしいのか、表示がおかしいのかの判定が可能になる。
* データ解析ができるようになる。（BigQuery等…）

## 非エンジニアがSQLを覚えた際の感想
* 難しくない。むしろ簡単
* 覚えたら運用が楽になった。
* 生データ見れるの嬉しい

## 非エンジニアがSQLを覚えてよかったこと
* やりたいことを言ってくる時にもSQL送ってくれることが結構あるので、話が早い
* データ構造に対して理解してくれるので、余計な説明がいらなくなる。
* 運用業務の量や、開発しなくてはならない画面の数が格段に減る <- 重要!!!
* エンジニアリングのことをわかってもらえる感じがする。
* 仲良くなれる。

## 最後に
* 非エンジニアもSQLぐらい覚えたら楽になるよってこと。
* エンジニアも非エンジニアがSQL覚えるの難しいんじゃないかって思っちゃうけど、
とりあえず、やってもらったら案外いける。
OSX上のVirtualBoxを使う時だけKarabinerを無効にする

# はじめに

[Karabiner](https://pqrs.org/osx/karabiner/index.html.ja) は OSX の様々なキーバインドを変更できる便利なアプリケーションです

私は、Macbook の英字キーボードで、右/左の Command キーを単体で押すとで「かな」/「英数」を切り替えられるようにしています。こうすると英字キーボードのレイアウトを使いつつも、IMEの切り替えが日本語配列のようになるため非常に有用です。


# 不便なところ

しかし、設定によってはVirtualBoxのゲストマシンだと設定が競合してしまうことがあります。
たとえば、Karabinerで `左右のコマンドキー（⌘）を「英数/かな」としても使う` を有効にしていると、ゲストマシンでコマンドキーを叩いた時にSuperキーとしても機能するのですが、バッククォート( ` ) が入力されてしまいます。

そのため、Virtualboxのウィンドウがアクティブになっている時だけは Karabiner を無効にしたいと思っていたのですが、以下の方法で可能でした。

# Karabiner の設定を特定のアプリケーションで無効にする方法

## 1. 設定ファイルを開く

Karabiner のウィンドウの 'Misc & Uninstall' タブにある `Open private.xml` ボタンを押すと Finder が開くので private.xml を開きます。

## 2. private.xml の編集

以下のようにします。

```xml
<?xml version="1.0"?>
<root>
  <appdef>
    <appname>VirtualBox</appname>
    <equal>org.virtualbox.app.VirtualBoxVM</equal>
  </appdef>
  <item>
    <name>Disable all settings while using VirtualBox</name>
    <identifier>private.ignore_virtualbox</identifier>
    <only>VirtualBox</only>
    <autogen>__PassThrough__</autogen>
  </item>
</root>
```

## 3. 設定を反映

再度 Karabiner の設定画面を開き、 `Change Key` タブにある `Reload XML` ボタンを押して設定を反映させます（このときエラーが起きる場合は、XMLが正しく編集できたか確認してください）。

次に、 `Search` テキストボックスに 「virtualbox」 と入力するとXMLで設定した `Disable all settings while using VirtualBox` という項目が出てくるはずなので、このチェックボックスを ON にします。

## 4. できているか確認

これで VirutalBox を使っている間は、Karabiner のすべての設定が無効になっているはずです。

# おわりに

Karabiner の private.xml を編集することで、特定のアプリに対して特定の設定を有効にすることができるため、大変便利です。

その他の詳細な設定については、  [private.xml Reference Manual](https://pqrs.org/osx/karabiner/xml.html.ja) を御覧ください。
GitLabで設定が変えられない！「Creater can't be blank」

GitLab(社内/個人用クローズのGit)です。GitHubでは無いです。

# GitLabのプロジェクトの設定が変えられない

プロジェクトの設定を変更しようとする
↓
「Creater can't be blank」
と言われて変更できない。
↓
…思い当たる原因を考えてみる。
↓
そういえばこのプロジェクトを作った人は辞めてるんだった
↓
「プロジェクト作成者不在」
ということか。。。
↓
さてどうしよう。。

GitLubの入ってるサーバーに接続

```
mysql -uroot

use gitlabhq_production

select * from projects where name="【プロジェクト名】";
-- creator_id の値をチェック！

select * users;
-- creator_idにいたuser_idがいないことを確認
-- 変更先の user_id（users） を選ぶ

update projects set creator_id="【変更user_id】" where name="【プロジェクト名】";
```

これでGitLabのプロジェクト変更が可能になります。

以上
sublime text > コメント行内の変数は "[" "]"で囲むとよい > ダブルクリック時に変数だけ選択できる

```txt:動作確認
Sublime text2 on Windows 7 Pro
```

Sublime Text2を使っていて気づいた点。

cppのソースファイルなどでコメントを用意する時、下記のcase 1とcase 2の書き方だとcase 2の方がいい。

```cpp
// case 1
// ...に関係なく実行できるように　m_forceExecute を用意した
// case 2
// ...に関係なく実行できるように　[ m_forceExecute ] を用意した
```

case 1で`m_forceExecute`でダブルクリックすると
`に関係なく実行できるように　m_forceExecute`
が選択される。

case 2で`m_forceExecute`でダブルクリックすると
`m_forceExecute`
だけが選択される。こうなると、あとはCtrl+D連打で、m_forceExecute関連の部分をざっと閲覧・編集することができる。


なお、case 1の場合、前の日本語文字によって変数だけ選択できることもあるが、前の日本語文字も合わせて選択されることもあるようだ。上の例では日本語文字も選択されることを確認した。