OmniAICreator/Qiita-1.07M huggingface dataset:
Visual StudioのXAMLデザイナー活用。ダミーデータを利用して見た目を確認しながら画面を組み立てる。

##はじめに
みなさんVisual StudioのXAMLデザイナーを使って画面の構築を行っていますか？
Blendを使うというゴリゴリの方もいらっしゃると思いますが、実行して確認しながら調整を繰り返している方も多いと思います。
Blendの操作覚えるのも面倒ですしXAMLデザイナーは、動的なデータを利用した画面を作成すると途端にエラーになったり崩れたりします。
XAMLデザイナーでエラーになってもアプリケーションの実行には支障がない事を知ってしまうとXAMLデザイナー自体を信用しなくなってしまう人も多いでしょう。
ですが、実行と確認を繰り返すのは、効率的な開発フローとは言えません。
ギリギリまで、XAMLデザイナー上で画面を確認しながら実装するのが、最も効率的です。（まあ、みなさんそう思ってると思いますが）
XAMLデザイナーを活用する鍵は、XAMLデザイナー専用のデータを用意することです。
##XAMLデザイナー専用のViewModel
ViewModelは、アプリケーション実行時に、動的データをViewへ提供する訳ですが、当然ながら実行前ですからデータは用意できません。
本番用のViewModelをそのままDataContextへ設定していると最悪例外が発生して、デザイナーがエラー表示になってしまいます。
ちょっと面倒ですが、XAMLデザイナー専用のViewModelを作成して、ダミーデータをViewへ渡してやることで、安心して画面を構築できます。
下のソースのように、<d:DesignProperties.DataContext>タグを使用して、デザイナー専用のViewModelを設定します。

```xml:Test.xaml
<Window x:Class="Sample.Demo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:Zephyros.Framework.Demo"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:vm="clr-namespace:Sample.Demo.ViewModels"
        Title="MainWindow"
        Width="525"
        Height="350"
        mc:Ignorable="d">

    <d:DesignProperties.DataContext>
        <vm:MainWindowDesignViewModel />
    </d:DesignProperties.DataContext>

    <Grid />
</Window>
```

##デザイナー実行時なのか判定する
XAMLデザイナーは、コードをある程度実行した結果を表示します。
そのため実行時でないとエラーになってしまうコードが、ViewModelに記述されていると例外が発生して正しく画面をプレビューできないわけです。
それなら実行時に、デザイナーが実行しているのかを判定すれば、エラーになるのを回避できますよね。
もちろん.Netでは、判定機能が用意されています。

```csharp:MainWindowViewModel.cs
    public class MainWindowViewModel : ViewModel
    {
        public MainWindowViewModel()
        {
            if(this.IsInDesignMode())
            {
                // テストデータを設定
            }
        }

        public bool IsInDesignMode()
        {
            bool result = true;
            var window = System.Windows.Application.Current.MainWindow;

            if (window != null)
            {
                if (!IsInDesignMode(window))
                {
                    result = false;
                }
            }
            return result;
        }

        public bool IsInDesignMode(System.Windows.DependencyObject element)
        {
            return System.ComponentModel.DesignerProperties.GetIsInDesignMode(element);
        }
    }
```
任意のコマンドをWebサーバー化する


タイトルの通り、任意のコマンドをWebサーバー化するコマンドを作ってみました。
Go言語で作っているのでクロスプラットフォームで使えます。

[viewb -Github](https://github.com/kurehajime/viewb)

使い方は簡単。

こんな感じで viewb の後にWebサーバー化したいコマンドを続けると・・・

```sh:実行例
$viewb ls -l /

```

このように結果をブラウザで確認できるようになります。
アクセスするたびにコマンドが実行されるので、最新の結果が常に返ってきます。
コマンドの代わりにスクリプトを指定すればスクリプトも実行できます。

![viewb_ss.png](https://qiita-image-store.s3.amazonaws.com/0/33890/c8f28503-0c58-f45f-0841-115829560aac.png "viewb_ss.png")


外部ネットワークとの導通確認してみたり

```sh:Ping
$viewb ping -c 1 8.8.8.8

```

プログラムのテストを実行して結果を確認したり

```sh:GoTest
$viewb go test

```

意味もなくサーバーを立ててみたり

```sh:ItWorks
$viewb echo It works!

```




使い方は無限大。

BASIC認証で鍵をかけることも出来ます。※認証が通るまでコマンドは実行されません。

```sh:balse
$viewb -user laputa -pass balse echo booomb!
```



## 中身

以下がviewbコマンドのソースです。Go言語で作ってます。
やってることが単純なだけあって、中身も単純です。
スタンドアロンのWebサーバーを簡単に組み込んで配布できるのはGo言語の大きな魅力ですね。

```go:viewb.go
package main

import (
	"flag"
	"fmt"
	"net/http"
	"os"
	"os/exec"
	"runtime"
	"strconv"
	"strings"
)

var (
	port int
	user string
	pass string
	com  string
)

func main() {
	//parse args
	flag.IntVar(&port, "p", 8080, "port /default:8080")
	flag.StringVar(&user, "user", "", "user (BASIC AUTH)")
	flag.StringVar(&pass, "pass", "", "pass (BASIC AUTH)")
	flag.Parse()
	com = strings.Join(flag.Args(), " ")
	//start server
	fmt.Println("http://localhost" + ":" + strconv.Itoa(port))
	fmt.Println("Stop: Ctrl+C")
	http.HandleFunc("/", handler)
	err := http.ListenAndServe(":"+strconv.Itoa(port), nil)
	if err != nil {
		fmt.Fprintln(os.Stderr, err.Error())
		os.Exit(1)
	}
}

//handler: command result
func handler(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "text/plain; charset=UTF-8")
	if auth(r) == false {
		w.Header().Set("WWW-Authenticate", `Basic realm="MY REALM"`)
		w.WriteHeader(401)
		w.Write([]byte("401 Unauthorized\n"))
		return
	}
	fmt.Fprint(w, cmd(com))
}

//exec command
func cmd(commandString string) string {
	var command string
	var op string
	if runtime.GOOS == "windows" {
		command = "cmd"
		op = "/c"
	} else {
		command = "/bin/sh"
		op = "-c"
	}
	out, err := exec.Command(command, op, commandString).Output()
	if err != nil {
		return string(err.Error())
	}
	return string(out)
}

//basic auth
func auth(r *http.Request) bool {
	if user == "" || pass == "" {
		return true
	}
	_user, _pass, ok := r.BasicAuth()
	if ok == false {
		return false
	}
	return _user == user && _pass == pass
}

```

## まとめ

実行ファイルは[ここ](https://github.com/kurehajime/viewb/releases)から落とせます。
viewbでviewbを実行すると厄介なことになるのでやめましょう。
[Swift][Spritekit]上下左右方向のスワイプを検出する

swift * spritekit でスワイプ方向を検出するコードを書いてみました。
※あんまりspritekitは関係ないかも・・・

### コード

```swift:GameScene.swift
import SpriteKit

class GameScene: SKScene {
    
    var beganPos:CGPoint!
    
    override func didMoveToView(view: SKView) {
       //略
    }
    
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        var touch: AnyObject! = touches.anyObject()
        beganPos = touch.locationInNode(self)
        
    }
    
    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        var touch: AnyObject! = touches.anyObject()
        var endedPos:CGPoint = touch.locationInNode(self)
        
        var diffPos:CGPoint = CGPointMake(
            endedPos.x - beganPos.x,
            endedPos.y - beganPos.y
        )
        
        println(diffPos)
        println("Direction = \(detectSwipeDirection(diffPos))")
        
    }
    
    func detectSwipeDirection(diffPos:CGPoint) -> Direction{
        
        var degree:Int
        
        if(diffPos.x != 0){
            let radian = atan(diffPos.y/fabs(diffPos.x)) //arctan からラジアンを求める
            degree = Int(radian * CGFloat(180 * M_1_PI)) //ラジアンから角度に変換
        }else{
            // x方向の変化がなかった場合(=垂直方向にスワイプされた場合)
            degree = diffPos.y < 0 ? -90:90;
        }
        println(degree)
        
        switch degree {
            case -90 ..< -45:
                return Direction.DOWN
            case -45 ..< 45:
                if(diffPos.x >= 0){
                    return Direction.RIGHT
                }else{
                    return Direction.LEFT
                }
            case 45 ... 90:
                return Direction.UP
            default:
                return Direction.UP
        }

    }
}


enum Direction: Int, Printable {
    case UP = 0, DOWN, RIGHT, LEFT
    
    var direction: String{
        switch self {
        case .UP:
            return "UP"
        case .DOWN:
            return "DOWN"
        case .RIGHT:
            return "RIGHT"
        case .LEFT:
            return "LEFT"
        }
    }
    
    var description: String {
        return self.direction
    }
}
```

x方向とy方向の距離の差分の+-で方向を検出しているやり方しか見つからなかったので、
角度で方向を検出するようにしてみました。

atanでラジアンを求める際にx方向の絶対値を用いることによって、
上下方向の区別をつきやすくしています。

今回は4方向の実装ですが、このやり方なら8方向に増やしたいときとかも楽にできるんではないかなって思ってます。

拙いコーディングだと自覚していますので、ご指摘等いただけると喜びます(｀・ω・´)
unity > 画面を画像ファイルに落とす > Application.CaptureScreenshot("Capture.jpg");

```txt:動作確認
Unity 5.1.1-f on MacOS X 10.8.5
```

画面を画像ファイルに落とすには`Application.CaptureScreenshot("Capture.jpg");`を使う

#準備
http://qiita.com/7of9/items/8d9741a8cbcc1eca9e0d
を参照

Main CameraのCameraRotation.csは以下のものにする。

```csharp:CameraRotation.cs
using UnityEngine;
using System.Collections;

public class CameraRotation : MonoBehaviour {

	public Transform myTransform;

	private float s_phi_ang = 0.0f;
	private const float s_dist = 10.0f;
	private const float kYPos = 6.0f;

	[Range(-5.0f, 5.0f)]
	public float rotationSpeed = 0.5f; // degree
		
	float ToRadian(float deg)
	{
		return deg * Mathf.PI / 180.0f;
	}

 	void SetPosition()
	{
		float xpos = s_dist * Mathf.Sin (ToRadian (s_phi_ang));
		float zpos = s_dist * Mathf.Cos (ToRadian (s_phi_ang));
		Vector3 vec = new Vector3 (xpos, kYPos, zpos);
		transform.position = vec;

		transform.LookAt (myTransform);
	}

	void AddPhiAngle()
	{
		s_phi_ang += rotationSpeed;
	}

	void Start () {
		SetPosition ();
	}
	
	void Update () {
		AddPhiAngle ();
		SetPosition ();
	}

	void OnGUI() {
		if (GUI.Button (new Rect (10, 10, 100, 40), "Capture")) {
			Application.CaptureScreenshot("Capture.jpg");
		}
	}
}
```

Captureボタンを押した時にCapture.jpgファイルに吐出される。
unity > Main Cameraをぐるぐる回す

```txt:動作確認
Unity 5.1.1-f on MacOS X 10.8.5
```

原点(0, 0, 0)にある物体に対して、カメラの方位を色々変えながら物体を映したい。

#準備
1. CubeをCreate (Scale: Z=2) : 回転がわかるようにZを２倍に
2. Main CameraにCameraRotation.cs(以下）を関連付ける
3. Main CameraのMy TransformにCubeを関連付ける

#code
```csharp:CameraRotation.cs
using UnityEngine;
using System.Collections;

public class CameraRotation : MonoBehaviour {

	public Transform myTransform;

	private float s_phi_ang = 0.0f;
	private const float s_dist = 10.0f;
	private const float kYPos = 6.0f;

	[Range(-2.0f, 2.0f)]
	public float rotationSpeed = 0.5f; // degree
		
	float ToRadian(float deg)
	{
		return deg * Mathf.PI / 180.0f;
	}

 	void SetPosition()
	{
		float xpos = s_dist * Mathf.Sin (ToRadian (s_phi_ang));
		float zpos = s_dist * Mathf.Cos (ToRadian (s_phi_ang));
		Vector3 vec = new Vector3 (xpos, kYPos, zpos);
		transform.position = vec;

		transform.LookAt (myTransform);
	}

	void AddPhiAngle()
	{
		s_phi_ang += rotationSpeed;
	}

	void Start () {
		SetPosition ();
	}
	
	void Update () {
		AddPhiAngle ();
		SetPosition ();
	}
}
```

rotationSpeed[-2.0,2.0]にて回転の速度と方向を変更できる。

#画像
![Untitled_-_150808_cameraRotation_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/89cdbde1-b31a-3a54-8384-55da5b169b74.jpeg)

![Untitled_-_150808_cameraRotation_-_PC__Mac___Linux_Standalone__Personal_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/c74f775d-608b-4c3d-fa70-3d372195cc15.jpeg)

![Untitled_-_150808_cameraRotation_-_PC__Mac___Linux_Standalone__Personal_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/d5b3c4eb-4ade-d278-27aa-d6d86e1ec232.jpeg)


https://gist.github.com/keijiro/3330732
を参考にアニメーションGIFを作ってみた。1MB以内で以下のようになった。

![out.gif](https://qiita-image-store.s3.amazonaws.com/0/32870/c02fad7c-0fe2-b768-92ed-d8aa04d5bca5.gif)
Cassandraを使ってみる

## CassandraをWindowsで使ってみる

### コマンドの確認
cassandra-cliで
`help;`
と入力


このあと
1 keyspaceの作成　　　　　　（RDBでいうところのdatabaseの作成）
2 colum familyの作成　　　　（RDBでいうところのtableの作成）
3 データの挿入　　　　　　　　（RDBでいうところのinsert）
を行う

## 1 keyspaceの作成（RDBでいうところのdatabaseの作成）
Testという名前のkeyspaceの作成を行います。
（RDBでいうところのdatabaseの作成）
`create keyspace Test;`
（RDBだったらcreate database Test;）

作成したkeyspaceの選択を行います。
`use Test;`

## 2 colum familyの作成（RDBでいうところのtableの作成）
Userという名前のcolumn familyの作成を行います。
（RDBでいうところのtableの作成）
`create column family User with comparator=UTF8Type and default_validation_class=UTF8Type and key_validation_class=UTF8Type;`
（column family をutf-8にするために
「with comparator=UTF8Type and default_validation_class=UTF8Type and key_validation_class=UTF8Type;」をつけています。

（RDBだったらcreate database User;）

Test（keyspace）にUser（column family）が作成されているか確認します
`describe Test;`

## 3 データの挿入（RDBでいうところのinsert）
User（column family）にデータを挿入してみます。
`set User['yamada']['email']='tanaka@tanaka.com';
set User['yamada']['tel']='08011112222';`

データを取得してみます。
`get Uesr['yamada'];`
クラスに [], {} を実装する

iOS6 から使えます。

## []
下記のメソッドを定義します。

```objc:CustomClass.h
// id obj = custom[1]
- (id)objectAtIndexedSubscript:(NSUInteger)idx;
// custom[0] = @10
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
```

```objc:CustomClass.m
- (id)objectAtIndexedSubscript:(NSUInteger)idx
{
  return object;
}
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx
{
  ...
}
```

使うとき

```objc:Test.m
CustomClass *custom = [CustomClass new];
id obj    = custom[1];
custom[0] = @10;
```

## {}
下記のメソッドを定義します。

```objc:CustomClass.h
// id obj     = custom[@1];
- (id)objectForKeyedSubscript:(id)key;
// custom[@1] = @0;
- (void)setObject:(id)anObject forKeyedSubscript:(id <NSCopying>)aKey;
```

```objc:CustomClass.m
- (id)objectForKeyedSubscript:(id)key
{
    return @"10";
}

- (void)setObject:(id)anObject forKeyedSubscript:(id <NSCopying>)aKey
{
    ...
}
```

使うとき

```objc:Test.m
CustomClass *custom = [CustomClass new];
id obj     = custom[@1];
custom[@1] = @0;
```

## [], {}
上記二つを実装することで両方使えます。

```objc:Test.m
CustomClass *custom = [CustomClass new];

id arrayObj = custom[1];
custom[0]   = @10;

id dictObj = custom[@1];
custom[@1] = @0;
```
Ruby の SSLSocket で SNI する

Ruby でバーチャルホスト対応の HTTPS サーバーを書こうとしていたのですが、Ruby から TLS 拡張の SNI を利用する方法が分からなかったので簡単に調べました。

# SNI とは？
SNI (Server Name Indication) とは、RFC 6066 で定義されている TLS の拡張で、Client hello の中にサーバーのホスト名を埋めこむことができる拡張です。
これを利用することにより、例えばサーバーは要求されたホスト名によって使用するサーバー証明書を変えることができます。

例えば nginx の設定ファイルでは

```nginx.conf
http {
  server {
    listen server_a:443 ssl;
    ssl_certificate server_a.crt;
  }
  server {
    listen server_b:443 ssl;
    ssl_certificate server_b.crt;
  }
}
```
と書くと、ブラウザから https\://server_a/ でアクセスした場合には server_a.crt が使用され、https\://server_b/ でアクセスした場合には server_b.crt が使用されますね。

## Ruby では？
Ruby の openssl 標準添付ライブラリでは、サーバー側は `OpenSSL::SSL::SSLContext#servername_cb=`、クライアント側では `OpenSSL::SSL::SSLSocket#hostname=` を使用することで実現できます。


### サーバー
```ruby:server.rb
require "openssl"
require "socket"

ctx = OpenSSL::SSL::SSLContext.new
ctx.servername_cb = proc {|sslsock, hostname|
  puts hostname

  new_ctx = OpenSSL::SSL::SSLContext.new
  case hostname
  when "0.example.com"
    new_ctx.cert = OpenSSL::X509::Certificate.new(File.read("0.example.com.crt"))
    new_ctx.key = OpenSSL::PKey::RSA.new(File.read("0.example.com.key"))
  else
    new_ctx.cert = OpenSSL::X509::Certificate.new(File.read("1.example.com.crt"))
    new_ctx.key = OpenSSL::PKey::RSA.new(File.read("1.example.com.key"))
  end
  new_ctx
}
tcp_server = TCPServer.new("127.0.0.1", 40443)
ssl_server = OpenSSL::SSL::SSLServer.new(tcp_server, ctx)

loop do
  sock = ssl_server.accept
  sock.close
end
```
### クライアント
```ruby:client.rb
require "openssl"
require "socket"

tcp_socket = TCPSocket.new("127.0.0.1", 40443)
ssl_socket = OpenSSL::SSL::SSLSocket.new(tcp_socket)
ssl_socket.hostname = ARGV[0]

ssl_socket.connect

puts ssl_socket.peer_cert.subject
```

### 実行結果
```sh:サーバー
% ruby server.rb
0.example.com
example.org
```


```sh:クライアント
% ruby client.rb 0.example.com
/C=JP/CN=0.example.com/emailAddress=postmaster@0.example.com
% ruby client.rb example.org
/C=JP/CN=1.example.com/emailAddress=postmaster@1.example.com
```
Cassandraをインストールしてみる

## CassandraをWindowsにインストールしてみる

### Cassandraのインストール
http://cassandra.apache.org/download/
から
apache-cassandra-2.0.16-bin.tar.gz
をインストール
※最新版ではcassandra-cli.batがなぜか入っていなかった
※JDKの設定も必要だが省略
※java1.7以上が必要

### Cassandraの解凍
7-ZipとかLhaplusとかを使って解凍
http://sevenzip.osdn.jp/
http://www.xucker.jpn.org/pc/7zip_use.html
http://www.forest.impress.co.jp/library/software/lhaplus/

### Cassandraサーバーの起動
C:\cassandra\apache-cassandra-2.0.16\bin\cassandra.bat
をダブルクリック

Starting Cassandra Server
 INFO 18:08:59,720 Logging initialized
 INFO 18:08:59,808 Loading settings from file:/C:/cassandra/apache-cassandra-2.0
.16/conf/cassandra.yaml
 INFO 18:09:00,110 Data files directories: [/var/lib/cassandra/data/dtl]
・・・（省略）

INFO 18:02:11,940 Binding thrift service to localhost/127.0.0.1:9160
 INFO 18:02:11,947 Using synchronous/threadpool thrift server on localhost : 916
0
 INFO 18:02:11,948 Listening for thrift clients...

### cassandra-cliからCassandraにつなぐ
cassandraを起動したまま
C:\cassandra\apache-cassandra-2.0.16\bin\cassandra-cli.bat
をダブルクリック

Starting Cassandra Client
Connected to: "Test Cluster" on 127.0.0.1/9160
Welcome to Cassandra CLI version 2.0.16

The CLI is deprecated and will be removed in Cassandra 2.2.  Consider migrating
to cqlsh.
CQL is fully backwards compatible with Thrift data; see http://www.datastax.com/
dev/blog/thrift-to-cql3

Type 'help;' or '?' for help.
Type 'quit;' or 'exit;' to quit.

[default@unknown]




ここまででインストール、利用準備は完了っぽい
s3cmdでバケットのサイズをhuman readbleな形式で表示する

-Hオプションをつける事でhuman readableな形式でバケットのサイズを表示できる。

```
% s3cmd du s3://hoge
934445070 s3://hoge/
% s3cmd du -H s3://hoge
891M     s3://hoge/
```
kcovでラインカバレッジを収集する

# kcov 概要

kcov(http://simonkagstrom.github.io/kcov/) はELF形式の実行可能バイナリファイル、Pythonプログラム、シェルスクリプト(sh/bash)のラインカバレッジを収集、表示するプログラムである。

以下では、kcovのインストールと、kcovを用いてELF形式のバイナリファイルを実行してカバレッジデータを収集するステップを説明する。

kcovが出力する html ファイルのサンプルが http://simonkagstrom.github.io/kcov/kcov-example-output/index.html で閲覧できる。

## 利点
- コンパイル時に `-fprofile-arcs -ftest-coverage` のオプションを付与しなくてもカバレッジデータを収集できる。（ただし `-g` は必要）
- 収集したカバレッジデータを表示するHTMLファイルを生成する
- covertura.xml を出力するため、JenkinsなどのCIサービスと連携できる
- HTMLやXMLの出力に、追加のコマンド入力を必要としない。プログラムの実行、カバレッジデータの収集、HTMLやXMLの出力はワンストップで実施される。

## 欠点
- ラインカバレッジのみをサポートする（つまり、ブランチカバレッジをサポートしない https://github.com/SimonKagstrom/kcov/issues/27）
- 関数の末尾などが実行行として扱われる

# インストール

## インストール前準備 (CentOS 6.6)
```shell-session
# yum install cmake
# yum install elfutils-libelf-devel elfutils-libs elfutils-devel
# yum install libcurl-devel
# yum install binutils-devel
```
## kcov のインストール

1. http://simonkagstrom.github.io/kcov/ のページ末尾のダウンロードリンクからソースコード一式をダウンロードする。

2. ダウンロードしたアーカイブファイルを展開して、 ``cmake`` でビルドする。

```shell-session
$ cd kcov-28
$ mkdir build
$ cd cmake ..
$ make
$ sudo make install
```

## カバレッジ収集対象プログラムのコンパイル

コンパイル時には `-g` を付与するだけでよい。

以下、サンプルを挙げるが、すでに手元にカバレッジ収集対象としたいソースファイルがあるなら、読み飛ばしてかまわない。

### プログラムの作成
サンプルプログラムには単純なフィボナッチ数列の第n項を出力するプログラムを用います。

```c:fib.c
#include <stdio.h>

int fib(int n)
{
    if (n <= 1) {
        return 1;
    }
    return fib(n - 1) + fib(n - 2);
}

int main(int argc, char **argv)
{
    int n;
    if (argc == 1) {
        fprintf(stderr, "Usage\nfib n\n");
        exit(EXIT_FAILURE);
    }
    n = atoi(argv[1]);
    printf("%d\n", fib(n));
    exit(EXIT_SUCCESS);
}
```

カバレッジデータを収集するプログラムをコンパイルする際には `-g` オプションを付与してデバッグデータを埋め込む必要があります。

```
$ gcc -g fib.c
```

# kcov を用いたカバレッジ収集

## コマンド書式
```
kcov out-dir in-file [args...]

out-dir: カバレッジデータを出力するディレクトリ
in-file: カバレッジデータを収集する実行可能ファイル
args:    in-fileのプログラム引数
```

## カバレッジ収集

以下のコマンドを実行すると、`fib` プログラムに引数 `10` を与えて実行し、カバレッジデータを収集する。
収集したカバレッジデータはfib.out ディレクトリに出力される。

```
$ kcov fib.out fib 10
89
```

カバレッジデータを可視化したhtmlファイルが指定した出力ディレクトリに出力される。

```
$ ls kcov.out/index.html
kcov.out/index.html
```

htmlだけではなく、cobertura.xmlも出力される。

```
$ find . -name "*.xml"
./kcov.out/fib/cobertura.xml
```

なお、出力ディレクトリに同じディレクトリを指定すれば、複数回のプログラム実行で収集したカバレッジデータを統合して出力できる。
blessed動かしてみた

## 参考

* [chjj/blessed · GitHub](https://github.com/chjj/blessed)
* [blessed·CUIながらリッチなインタフェースを実現しよう MOONGIFT](http://www.moongift.jp/2015/08/blessed-cui%E3%81%AA%E3%81%8C%E3%82%89%E3%83%AA%E3%83%83%E3%83%81%E3%81%AA%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%97%E3%82%88%E3%81%86/)

## 環境準備

```bash:
sudo apt-get install -y node npm
npm install blessed
```

## サンプルコード

```bash:hello.js
var blessed = require('blessed');
// Create a screen object.
var screen = blessed.screen({
  autoPadding: true,
  smartCSR: true
});
screen.title = '初めてのWindow Title';
// Create a box perfectly centered horizontally and vertically.
var box = blessed.box({
  top: 'center',
  left: 'center',
  width: '50%',
  height: '50%',
  //日本語????になります。残念
  content: 'Hello {bold}world{/bold}!',
  tags: true,
  border: {
    type: 'line'
  },  
  style: {
    fg: 'white',
    bg: 'magenta',
    border: {
      fg: '#f0f0f0'
    },  
    hover: {
      bg: 'green'
    }   
  }
});

// 終了させるキーの設定。Escape, q, or Control-C.
screen.key(['escape', 'q', 'C-c'], function(ch, key) {
  //タイトルが残ってしまうのでクリア
  screen.title = ''; 
  return process.exit(0);
});

// Append our box to the screen.
screen.append(box);
screen.render();
```

## 動かし方

```bash:
nodejs a.js
```

![upload.png](https://qiita-image-store.s3.amazonaws.com/0/25728/43e2c8d9-4bbf-ae32-7420-5041dc94d192.png)

Escape, q, or Control-Cで終了します。
MacBookでパスワード付きZIPファイルを作成する方法


みなさん、こんにちは。

私は、仕事でもプライベートでもMacBookAir（MBA）を使用しています。
特に仕事で多いのですが、資料をZIP化してメールに添付して送って欲しいといわれることが多いんですよね…
皆さんはどうでしょうか・・・？

WindowsOSであれば、右クリックして、暗号化して圧縮というように簡単に作成できます。
ただ、MacBookではただ圧縮という項目しかないので、どうしたらいいか困っちゃいます…
 #実際、私は困ってました(´・ω・｀)ｗ

ちょっと調べたところ、ターミナルで簡単な操作をすることで暗号化ZIPファイルが作成できると
知ったので、皆さんにご紹介したいと思います。
※なお、今回の方法は *Mac OS X 10.5以降*のみになりますのでご注意を！！


## <やり方>
1. 普通にZIPファイルを作成する
	GUIからでもターミナル操作でCUIでも構いませんのでZIPファイルを作成します。
	※今回、私はGUI操作にてZIPファイルを作成します。
	
	① 「sample.txt」というファイル選択します
	![kobito.1439020080.701363.png](https://qiita-image-store.s3.amazonaws.com/0/33479/b1c48098-3948-c8ba-f68f-90d332467cb3.png "kobito.1439020080.701363.png")

　　② ファイルを選択し、右クリックして「"Sample.txt"を圧縮」を押下します。
　　![kobito.1439020274.350829.png](https://qiita-image-store.s3.amazonaws.com/0/33479/4b4f1971-b186-84e0-2e2c-9bf667aa7d32.png "kobito.1439020274.350829.png")

　　③ ZIPファイルが作成されたことを確認します。
　　　※この段階では暗号化されていません。
　　　![kobito.1439020345.121432.png](https://qiita-image-store.s3.amazonaws.com/0/33479/104673aa-3ced-0f51-3aab-4c556a1ae934.png "kobito.1439020345.121432.png")
2. ターミナルを起動する
　　① アプリケーションを起動します。
　　![kobito.1439020447.275332.png](https://qiita-image-store.s3.amazonaws.com/0/33479/5c8b9dcb-0c4f-2187-bdf4-ea0fe0f2201f.png "kobito.1439020447.275332.png")
　　
　　② ターミナルが起動したことを確認します。
　　![kobito.1439020513.260131.png](https://qiita-image-store.s3.amazonaws.com/0/33479/1d5baa97-b488-b8dc-6954-f7d3495c4334.png "kobito.1439020513.260131.png")
3. ファイルの圧縮化する
　　① 下記のコマンドを実行し、圧縮化する。
　　　　````$ zipcloak <圧縮したファイル>````
　　　　
　　　　コマンドを実行すると下記のように画面出力がされますので、表示に従い、パスワードを指定します。
　　　　![kobito.1439020939.834246.png](https://qiita-image-store.s3.amazonaws.com/0/33479/8d99c011-e16c-6597-ec6d-0773b176c6b4.png "kobito.1439020939.834246.png")
4. 圧縮確認してみる
　　① 手順3で作成した暗号化ZIPファイルが正しく暗号化されているか確認します。
　　![kobito.1439021078.169340.png](https://qiita-image-store.s3.amazonaws.com/0/33479/8f179e25-80c7-b15f-159d-399f5d9defee.png "kobito.1439021078.169340.png")
　　きちんとパスワードを求められました！！
　　
是非、皆さんも試してみてくださいね(・ω<)ｂ
では！！
【俺メモ】centos6系にpostgres9.4をインストール

## 1.ベースリポジトリからのpostgres参照を排除
/etc/yum.repos.d/CentOS-Base.repoの [base] と [updates] にexcludeを追記

``` linux
sudo vi /etc/yum.repos.d/CentOS-Base.repo
exclude=postgresql*
```

## 2.postgresql 9.4リポジトリをyumに追加
	
``` linux
sudo yum localinstall http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm
```

## 3.postgresql 9.4のインストール

``` linux
sudo yum install postgresql94-server
```

## 4.初期化

``` linux
sudo service postgresql-9.4 initdb
```

## 5.起動

``` linux
sudo service postgresql-9.4 start
```


いじょー
CentOSのパッケージをアップデートしたときにやったこと


しばらくアップデートしていなかったCensOSのパッケージをアップデートしたときのメモ


## カーネルの更新を除外する
カーネルは更新したくなかったので、以下のURLを参考に更新対象から除外
[yumでシステムのアップデート](http://www.8wave.net/yum.html)


## リポジトリのキャッシュをクリア
ずっとアップデートしてなかったのでリポジトリが古かったらしい。
以下のコマンドで、キャッシュをクリアした。

```
$ yum clean all
```

そうしたら、以下のエラーが出て、yumが実行できなくなってしまった。

```
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again 
```

CentOS 6.1, 6.2, 6.3はデフォルトでSSL3.0使ってアクセスに行くらしくこけるらしい。
以下のURL参考に、HTTPでアクセスしにいくよう修正。
[Cent6.3でepelに取りにいけない](http://qiita.com/verno3632/items/21731b3f7674bcdfd74c)

```
$ sed -i 's/\(mirrorlist=http\)s/\1/' /etc/yum.repos.d/epel.repo
```

```
# --skip-brokenで依存関係の問題のあるパッケージのアップデートをスキップ
$ yum update --skip-broken
```
これでupdateできた。
[skip-brokenとは・・・](http://kajuhome.com/yum_skip_broken.shtml)

## おまけ(yumとrpmの違い)
[初心者の頃に知っておきたかった rpm と yum の違いと使い分け](http://blog.inouetakuya.info/entry/20111006/1317900802)

yumはrpmの上に乗っかっていて、rpmより高機能(依存性とか解決してくれたりする。)
ディレクトリ移動をちょっと便利(ido)に、

###シェルで移動をちょっと便利にしたいなと思いませんか
で、ログインディレクトリの bin にこんなのつくりました。
.profile に、ユーザの　bin 以下にもパスを通す設定が
あるみたいなので、置くだけでオッケーです。（多分）
ubuntu の bash でしかつかっていませんが、他のＯＳ、shell でもいけるでしょう。

```shell:ido
#!/bin/sh
case "$1" in
  "ssh" ) cd ~/.ssh ;ls;;
  "config" ) vi  ~/.ssh/config ;;
  "me" ) vi  ~/bin/ido ;;
esac
```

使い方は、. ido ssh (最初にピリオド）で、~/.ssh のディレクトリに移動して、ls します。シェルの使い方としては、邪道だと思いますが、凡人としては、便利だなと思っています。. ido me で自分自身を簡単に編集できます。

### powershell 用（とりあえず）です。

ido.ps1 でつくりました。PATH(私は、~/Documents/bin) を通すと、ido で動きます。
ido me で編集できます。お好きなように編集してください。

```
Param($Arg)
$u = $env:USERPROFILE
switch ($Arg) {
    "tools" {"";Set-Location $u/Documents/tools ; dir ~/Documents/tools}
    "me" {notepad $u\Documents\bin\ido.ps1 }
    default {"Not matched."}
}
```
Node.jsでファイルをコピーする

Node.jsで複数のファイルをコピーしたい。

linuxなら

```bash
$ cp src/*.html dest
```

でできるやつだ。

これをNode.jsでやりたい。

なんかライブラリあるだろ、と思ってnpmレポジトリを2分ほど探したが良いのが見つからず。

いや多分よく探せば絶対あるんだけど探すのめんどくさい。

作るか。


### ファイルコピーを実装する

まずは一つのファイルをコピーする関数を作る。

`fs`モジュールの`.createReadStream()`と`.createWriteStream()`を使えば一瞬だ。


```javascript
var r = fs.createReadStream(src),
    w = fs.createWriteStream(dest);
r.pip(w);
```

だけどこれだけだとエラーハンドリングとか足らない。

もう少し丁寧にかくとあれだ。

```js
function _copySingle(src, dest, callback) {
    var aborted = false;

    var r = fs.createReadStream(src),
        w = fs.createWriteStream(dest);
    r.on("error", function (err) {
        done(err);
    });
    w.on("error", function (err) {
        done(err);
    });
    w.on("close", function (ex) {
        done();
    });
    r.pipe(w);

    function done(err) {
        if (aborted) {
            return;
        }
        callback(err);
        aborted = true;
    }
}

```


次にワイルドカードをまとめて処理できるようにする。
こういう時は`async`と`glob`モジュールを使うに限る。限らないけど。


```js

var argx = require('argx'),
    async = require('async'),
    path = require('path'),
    glob = require('glob'),
    mkdirp = require('mkdirp'),
    fs = require('fs');
async.waterfall([
    function (callback) {
        async.concatSeries([].concat(src), glob, callback);
    },
    function (src, callback) {
        _isExistingDir(dest, function (destIsDir) {
            async.each(src, function (src, callback) {
                var srcFilename = path.resolve(src),
                    destFilename = destIsDir ? path.join(dest, path.basename(src)) : path.resolve(dest);
                async.series([
                    function (callback) {
                        if (options.mkdirp) {
                            mkdirp(path.dirname(destFilename), callback);
                        } else {
                            callback(null);
                        }
                    },
                    function (callback) {
                        _copySingle(srcFilename, destFilename, callback);
                    }
                ], callback);
            }, callback);
        });
    }
], callback);

function _isExistingDir(filename, callback) {
    fs.exists(filename, function (exists) {
        if (exists) {
            fs.stat(filename, function (err, stat) {
                callback(!err && stat.isDirectory());
            });
        } else {
            callback(false);
        }
    });
}
```

### npmパッケージにまとめる

あとはパパッとまとめてテスト書いていつも通りnpmパッケージとして公表。
似たようなのいっぱいありそうだけどとりあえず気にしない。

+ [filecopy](https://www.npmjs.com/package/filecopy)

できた。
unity > 物体が別の物体にぶつかったらくっつくようにする (反発しないようにする)

```txt:動作確認
Unity 5.1.1-f on Mac OSX 10.8.5
```

物体が別の物体にぶつかった時、massやAddForceされた力により反発をしてしまう。
反発ではなく、その物体にくっつくようにするには、ぶつかる物体に以下のスクリプトをつける。

ぶつかった時点でisKinematicをセットしている。

```csharp:SphereControl.cs
using UnityEngine;
using System.Collections;

public class SphereControl : MonoBehaviour {
	
	void Update () {
	}

	void OnCollisionEnter(Collision col)
	{
		Rigidbody rb = gameObject.GetComponent<Rigidbody> ();
		rb.isKinematic = true;
	}
}
```
unity > 物体がある範囲外に移動した時に消えるようにする > Destroy(gameObject);

```txt:動作確認
Unity 5.1.1-f on MacOS X 10.8.5
```

消したい物体に以下のスクリプトを関連づけると、その物体が原点から10以上の距離に行った時に消えるようになる。

```SphereControl.cs
using UnityEngine;
using System.Collections;

public class SphereControl : MonoBehaviour {
	
	void Update () {
		float dist = Vector3.Distance (new Vector3 (0, 0, 0), transform.position);
		if (dist > 10.0f) {
			Destroy(gameObject);
		}
	}
}
```

### 追記
(2018/01/22)

時間で消す方法は下記で紹介されています。

- [指定した時間経過したらGameObjectを消すスクリプト](https://qiita.com/mfmf_ruminaru/items/268220d63636059c6da7)
__js__で出力するコードにHaxeの変数を埋め込む

以下のように書くと、

```hx:haxe
var file = './foo.js';
untyped __js__("require({0})", file);
```

以下のように出力される。

```js:javascript
var file = './foo.js';
require(file);
```

以下のように書くと、出力がおかしくなるので注意されたし。

```hx:haxe
var file = './foo.js';
untyped __js__('require($file)');
```

```js:javascript
var file = './foo.js';
__js__('require(' + file + ')'); // !?
```
package.jsonのdependenciesを自動更新するスクリプトを書く

### dependencyを最新にしたい

`npm install`コマンドに'--save`や`--save-dev`オプションをつけると自動的にpackage.jsonに依存関係を追加してくれる。

さらに` npm outdated`コマンドを使うと、最新じゃない依存関係の一覧を出してくれる。

でも最新にするには一個ずつ追加しなきゃならない。

めんどくさい。

細かい話はいーからまとめて依存関係のバージョンを最新化してほしい。


### dependencyを最新化するスクリプトを設計する

バージョン番号のところに"*"や"latest"を使うと、常に最新のをとってきてくれるようにはなる。

```
"dependencies":{
    "async":"*",
    "glob":"latest"
}
```

だけどこれは配布先で`npm install`を走らせたときに、その瞬間の最新をとってくるということになる。
それは微妙だ。テストして配布する前の時点で固定はさせたい。


なので、何かしらスクプトを叩いた瞬間、すべて依存関係を最新化してpackage.jsonに記述された書きかわる、という形にしたい。

`"async":"1.2.0",` -> `"async":"1.5.0",`


`npm install`いろいろ試してみたところ、バージョン番号が`*`になっている状態で`--save-dev`オプションを使うと
バージョン番号が記述される仕様のようだ。
これを使おう。

動きとして、

1. package.jsonのバージョン番号を全て"*"印に書き換える
2. package.jsonのdependenciesの名称を全て取得する
3. `npm install <取得したパッケージ名> --save`を実行する。

ということをすればよい。

### dependencyを最新化するスクリプトを実装する

まずはpackage.jsonを書き換えてdependenciesとdevDependenciesのバージョンをすべて"*"にする

```js

var fs = require('fs'),
    pkgPath = require.resolve('./package.json'),
    pkg = require(pkgPath);

function _setAllProperty(obj, val) {
    obj = obj || {};
    Object.keys(obj).forEach(function (key) {
        obj[key] = val;
    });
    return obj;
}
pkg['dependencies'] = _setAllProperty(pkg['dependencies'], '*');
pkg['devDependencies'] = _setAllProperty(pkg['devDependencies'], '*');
fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2), function(err) {
    /**...**/
});
```

次に、`npm install`コマンドの`--save`,`--save-dev`を使ってpackage.jsonのバージョンを書き直す。

```js

var execcli = require('execcli'),
    async = require('async');
async.series([
    function (callback) {
        var dependencyNames = Object.keys(pkg['dependencies']).sort();
        var args = ['install'].concat(dependencyNames).concat(['--save']);
        execcli('npm', args, {
            cwd: path.dirname(pkgPath)
        }, callback);
    },
    function (callback) {
        var devDependencyNames = Object.keys(pkg['devDependencies']).sort();
        var args = ['install'].concat(devDependencyNames).concat(['--save-dev']);
        execcli('npm', args, {
            cwd: path.dirname(pkgPath)
        }, callback);
    }
], function (err) {
    callback(err);
});
```

無事できた。


### npmパッケージとしてまとめる

あとはログを足したりテスト書いたりなんだりしてnpmパッケージにまとめて公開。

+ [ape-updating](https://www.npmjs.com/package/ape-updating)


```bash
$ npm install ape-updating --save-dev
```

でインストールした後、

```js
#!/usr/bin/env node

var apeUpdating = require('ape-updating');
 
// Update all dependencies 
apeUpdating(function (err) {
    /*...*/
});
```


で使える。



Links
-------

+ [npm](https://www.npmjs.com/package/npm)
+ [ape-updating](https://www.npmjs.com/package/ape-updating)
homebrewでmariadbをインストール

すでにmysqlをhomebrewでインストールしている場合は、mariadbと競合してしまうので、mysqlを削除します

~~~
$ brew unlink mysql
~~~

mariadbインストール

~~~
$ brew update
$ brew install mariadb
~~~

mariadb起動

~~~
$ mysql.server start
Starting MySQL
. SUCCESS! 
~~~

mariadbに接続

~~~
$ mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
...
MariaDB [(none)]>
~~~

mariadb停止

~~~
$ mysql.server stop
Shutting down MySQL
... SUCCESS! 
~~~
unity > InstantiateしたGameObjectにAddForceする

```txt:動作確認
Unity 5.1.1-f on MacOS X 10.8.5
```

#準備
1. SphereをCreateしSpherePrefabという名前にする
2. SphereにRigidBodyを追加する
3. SpherePrefabをPrefabにする
4. Main Cameraに以下のButtonPushed.csを関連付ける
5. Main CameraのPrefabにSpherePrefabを関連付ける

実行後、Generateを押すと球が2つ生成され、AddForceされる。


```csharp:ButtonPushed.cs
using UnityEngine;
using System.Collections;

public class ButtonPushed : MonoBehaviour {

	public GameObject prefab;
	private GameObject player1,player2;
	private Rigidbody rig1, rig2;
	
	void Start () {
	
	}
	
	void Update () {
	
	}

	void OnGUI() {
		if (GUI.Button (new Rect (10, 10, 100, 40), "Generate")) {
			float xpos = Random.Range(-2.0f, 2.0f);
			xpos = 2.0f;

			Vector3 pos1 = new Vector3(xpos, 5.0f, 0.0f);
			Vector3 pos2 = new Vector3(-xpos, 5.0f, 0.0f);
			player1 = Instantiate(prefab, pos1, Quaternion.identity) as GameObject;
			player2 = Instantiate(prefab, pos2, Quaternion.identity) as GameObject;

			rig1 = player1.GetComponent<Rigidbody>();
			rig2 = player2.GetComponent<Rigidbody>();

			rig1.mass = 0.003f;
			rig2.mass = 0.003f;

			rig1.AddForce(Vector3.left);
			rig2.AddForce(Vector3.right);
		}
	}
}
```
コマンドプロンプトの文字化けが鬱陶しいのでCHCPラッパー書いた

タイトルの通りです。[GitHub](https://github.com/tottokotkd/Code)にあります。

# ?p?X???[?h:

　今ちょっとPostgreSQLが使いたいです。起動します。

> ![Capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/17957/3d2e7069-651e-9b5c-42cf-d5bf1bda5b08.png)

　**おっと会話が成り立たないアホがひとり登場～**

## 使い方

　質問文が文字化けしたら全員テスト0点なの知ってたか？マヌケ

> ![Capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/17957/132178ea-d2bd-b683-35ee-4127f9de2fd1.png)


（事前にパスを通す必要があります）

# CHCP

　なんでこうなるの？という部分はGoogle先生に任せますが、これを解決するにはCHCPコマンドを叩けばOKです。
　こんなやつです。

```
chcp 65001
```

　で、戻すときはこうです。

```
chcp 932
```

　分かりますか？　分かんないですよね。
　僕もコピペしていて意味わからないですし、そもそもこんなのいちいち覚えてられませんので、ラッパーを書きます。

## PowerShellスクリプト

　.batで十分書けそうな内容ですが、XML活用してオサレ感をアピールしたいのでPowerShellスクリプトで書きます。
　管理者権限とか煩いやつですが、幸いにして穴だらけなので気にしなくていいです。

　コアな部分はこんな感じ。

``` code.ps1
# 検索キーワード
$arg = $args[0]

# スクリプトと同じ場所にあるXMLファイル読み込み
$path = $MyInvocation.MyCommand.Path | Split-Path -Parent | %{ Join-Path $_ list.xml }
$list = ([xml](Get-Content $path)).chcp.entity

# XMLを検索してchcp実行
$code =  $list | ?{ $_.key -eq $arg } | %{$_.value} 
chcp @($code)[0]
```

（超簡単なので解説とかは特に）ないです。

# 関係あるかもしれない記事
* [コマンドプロンプトの文字コードを変更する（SJIJ→UTF-8など](http://kuroeveryday.blogspot.jp/2013/09/sjijutf-8.html)
* [コマンドプロンプトでのUTF-8文字化け問題](http://d.hatena.ne.jp/ty-zero/20091110/1257826284)
* [chcpコマンドで文字コードを変更して戻せなくなった時の対応](http://qiita.com/abeichi/items/2d97bea751a2230e0d3f) (@abeichi)
Go・Revelのセットアップ


## 0. はじめに

最近、Go言語を使って開発を始めたので、インストールなどの方法をまとめてみました。WEBフレームワークとしてRevelを選んでみました。

### 内容

* Go言語のインストールと動作確認
* GoのWEBフレームワークであるRevelのインストールと動作確認
* vimの設定(おまけ)

### 想定読者

* Go言語初心者
* 他の言語、フレームワークでの開発経験あり



## 1. Goのインストールと動作確認

### インストール

Homebrewを使っている場合、コマンドラインで、

```bash
$ brew install go
```

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

### 動作確認

インストールし終わったらホームディレクトリ等で `hello.go` というファイルを作成し以下のように記述。

```go:hello.go
package main

import "fmt"

func main(){
    fmt.Printf("Hello, world\n")
}
```

コマンドラインで以下のように打って`Hello, world`が表示されればOK。

```bash
$ go run hello.go
# Hello, world
```

### 参考になる記事

http://qiita.com/megu_ma/items/7208be8de52b712955a0



## 2. GOPATHを指定

### GOPATHとは

Goのソースコードや実行可能ファイルなどを保存するためのディレクトリを`GOPATH`という環境変数として指定する必要がある。
僕はとりあえずホームディレクトリ配下に置いていて、現在のところ問題は起きてないです。

### 設定

zshを仕様している場合`~/.zshrc`に以下のように記述する。

```bash
$ export GOPATH=$HOME/.go
$ export PATH="$PATH:$GOPATH/bin"
```

とした後にコマンドラインで、

```bash
$ source ~/.zshrc
```

でこの設定を読み込む。

### 参考になるQiitaの記事

http://qiita.com/yuku_t/items/c7ab1b1519825cc2c06f



## 3. Revelのインストールと動作確認

ここからは実際にGo言語でアプリケーションを作る準備をしていきます。RevelはGo言語のWEBフレームワークです。

### Revelのインストール

コマンドラインで、

```bash
$ go get github.com/revel/revel
```

と打つと、Revelをインストールできます。インストールし終わったらコマンドラインで、

```bash
$ revel
```

と打って、以下のように表示されたら成功。

```bash
~
~ revel! http://revel.github.io
~

# ...
```

### サンプルアプリの作成

アプリを以下のコマンドで作る。

```bash
$ revel new test_app
```

### ディレクトリ設定

上記のコマンドをどこで打っても、作成されたアプリは`GOPATH`以下の`src`ディレクトリ配下に作られる。

自分の好きなディレクトリで操作したいのであれば、以下のコマンドで好きなディレクトリにソフトリンクする。
http://www.zontheworld.com/linux/ln.html

```bash
$ ln -s GOPATH/src/test_app your_dir
```

### サーバーの立ち上げ

設定したディレクトリで、

```bash
$ revel run tes_app
```

としてサーバーを立ち上げ、

`localhost:9000`

にアクセス。

`It works!`と出ていれば成功。



## 4. エディタ(vim)の設定

Go言語では、インデントはスペースではなくタブを使うことを推奨しており、エディタの設定が必須です。
僕は業務ではエディタとしてvimを使っているので、vimの設定について書きます。

### NeoBundle

vimの設定は色々と方法がありますが、僕は結局、NeoBundleを使って'vim-go'をインストールして使いました。
NeoBundleの導入としては以下の記事が参考になります。

http://qiita.com/himinato/items/caf5a0b19ce893a75363

### 設定

vimに以下のように記述しました。NeoBundleに関するコードは割愛。

```.vimrc
NeoBundle 'fatih/vim-go'

# NeoBundleに関するコード

exe "set rtp+=".globpath($GOPATH, "src/github.com/nsf/gocode/vim")

let g:go_highlight_functions = 1
let g:go_highlight_methods = 1
let g:go_highlight_structs = 1
let g:go_highlight_operators = 1
let g:go_highlight_build_constraints = 1
```

以上です。おつかれさまでしたー。
Ruby製CMSをしらべる

Ruby製CMSについて調べる機会があったので雑に感想まとめ
思いついたらまた追加するかも

|なまえ|雑感|
|---|---|
|LocomotiveCMS|Ruby2.x系対応の[αバージョンがある](https://github.com/locomotivecms/engine/releases/tag/v3.0.0.pre.alpha.3)<br>インストールがうまくいかなくて頓挫中|
|Lokka|gemとして使うよりも、丸ごと改造する方向っぽい|
|radiant|リリースバージョンは[Ruby2.x系に未対応](https://groups.google.com/forum/#!topic/radiantcms/l6QRNnTDV38)<br>[がんばれば使えそう](https://github.com/radiant/radiant/#installation-of-a-prerelease)|
|skyline|どっかのgemで依存してるrcovが[Ruby2.x系未対応](https://github.com/relevance/rcov/issues/99)|
TIPS std::forward

std::forward<T>(a)は単なるキャストである
#使い方
```
template<class T>
void f(T&&a)
{
    g(std::forward<T>(a));
}
```

これでf(???)はg(???)と同じように動く
ラムダ式なら

```
[](auto&&a){
    g(std::forward<decltype(a)>(a));
}
```



#なぜ必要か
```
template<class T>
void f(T&&a)
{
    g(???);
}
```
fはgに対しaをどのように渡すべきであろうか

##  `g(a)`
`f(std::move(x))`のように渡した時gに左辺値として渡されるのでよくない
例えばxがunique_ptrであったならばこの動作はmoveを期待するが、`g(a)`のように渡してしまうとgから見てそれはmoveを許可されない値に見えるので期待通りにならない
##`g(std::move(a))`
上と逆の理由でよくない
つまりmoveしてほしくない時にmoveされるとaが消失してしまうのでよくない

このナイーブな問題を解決するためにforwardは存在する

#どのように動くか

f(???)はg(???)と同じように動く


##`f(x)`のようなとき
fにxが左辺値として渡されたとき
g(x)と同等に扱われる
`T&& = A&`
`T == A&`となる
`forward<T>(a)`はaをT&に変換し、T&であるので左辺値として扱われる
つまりg(x)と同等に扱われる

##`f(std::move(x))` `f(make_value())`のようなとき

`T&& == A&&`
`T == A`として扱われ
`forward<T>(a)`はaをA&&に変換する。関数の戻り値なのでコレは右辺値として扱われる
つまり`g(std::move(x))` `g(make_value())`と同等に扱われる


よってf(???)はg(???)と同じように動く



#forwardをつけるのをいつサボってよいか
最終的にgに渡すタイミングで参照と型が残っていればどうにかなるので自己管理の範疇でならサボっても悪くはない

#decltype(a)はTではなくT&&であり`forward<decltype(a)>`は大丈夫なのか
大丈夫なことになっている
T&& && == T&&だ
qiita > 欲しい機能 > コードのコピー機能

自分が今後使うであろう処理をQiitaに投稿している。
その際、コードのコピー機能がQiitaのシステムに欲しい。

例えば、

```c:hello.c
int main()
{
    printf("Hello World\r\n");
}
```

上記のコードがある時、2015/08/08現在のシステムではマウスでコードを選択してからCtrl+cなどしないといけない。
hello.cの横にコピーボタンがあり、ボタンを押したらクリップボードに取り込めたら、長いコード辺(およびその投稿記事)の再利用性が高まると思う。

このあたりはgistなどの外部サービスを使う手もあるかもしれないが、せっかくコードを綺麗に投稿できるQiitaのシステムがあるので、Qiita自身にコピー機能があればいいなぁと思う。
Windows10のパッケージ管理を試した（仮）

Windows10にあげてパッケージ管理ができるようになった。

Chocolateyが簡単に使えるようになった！

らしいので、試して使えそうなところまでできたので手順をメモ


1. 管理者権限でPowerShellを起動

2. PowerShell上で「<font color=red>Find-Package</font>」を叩く
    * NuGetを入れろ？的な英語のメッセージが出るので「Yes（はい）」を選択
    * 何事もなければNuGetが入る。

3. 再びPowerShell上で「<font color=red>Find-Package</font>」を叩くと管理上のパッケージ一覧が出てくる。

このままだとどうもChocolateyのリポジトリは登録されていないようなので
4. PowerShell上で「<font color=red>Get-PackageProvider</font>」を叩くと現在のリポジトリ一覧が出てくる
![getpackage.JPG](https://qiita-image-store.s3.amazonaws.com/0/59288/027bf634-4292-ccbc-b963-6ce9bacf4b56.jpeg)

5. Chocolateyのリポジトリを追加するために「<font color=red>Get-PackageProvider -name chocolatey</font>」を叩く

6. 再びPowerShell上で「<font color=red>Get-PackageProvider</font>」を叩くとリポジトリにChocolateyが追加されているのを確認
![chocoinstall.JPG](https://qiita-image-store.s3.amazonaws.com/0/59288/eafdf9d0-5425-e42b-1536-88720ac6f741.jpeg)

7. 適用に「<font color=red>Find-Package -name putty</font>」とか叩くとChocolatey上のputtyが出てくる模様
![putty.JPG](https://qiita-image-store.s3.amazonaws.com/0/59288/4e74e311-62ed-de4d-4e68-0a37207e9008.jpeg)


###あとは、お好きなように「install-package -name putty」とかするよろし。

<font color=red>※なお当方はまだ「install-package」は試していないので自己責任でおなしゃす。</font>

~~なんか失敗したぞ。~~

 パッケージバージョン一覧の確認方法
`Find-Package <パッケージ名> -Allversions`

ここがコマンドの参考かな？

* https://docs.nuget.org/consume/package-manager-console-powershell-reference

[参考サイト]

* http://www.hanselman.com/blog/AptGetForWindowsOneGetAndChocolateyOnWindows10.aspx
* http://blogs.msdn.com/b/garretts/archive/2015/01/27/oneget-and-the-windows-10-preview.aspx
うっかりFirefoxのリフレッシュをしてしまった場合の対処方法

## 中身
うっかりFirefoxのリフレッシュをしてしまった場合の戻し方とか
Firefoxでのバックアップについてのポエムとか
使ってて便利なアドオンとか

## 経緯
windows10のアプデで盛り上がるのでそういうやFirefoxは対応ちゃんとしてるよね?
と公式を開いたら「遅いと感じたらFirefoxを更新!」とかあるので、
ぽちぽちしてたら、うっかりアドオン設定が消える...
(何故ちゃんと警告文は読まなかったんだと後悔...)
![fx-top.png](https://qiita-image-store.s3.amazonaws.com/0/26677/3e4999fd-8b37-602b-5320-2761eba4495f.png)

## 戻し方
この時まっさらなfirefoxが起動するが、実はデスクトップに"Old Firefox Data"なるフォルダができている。
その中に"xxxxxx.default"な感じでプロファイルデータが残っている。
参考:[Firefox をリフレッシュする - アドオンや設定のリセット | Firefox ヘルプ](https://support.mozilla.org/ja/kb/refresh-firefox-reset-add-ons-and-settings)

そこで[プロファイルマネージャを使用して、Firefox のプロファイルを作成または削除する | Firefox ヘルプ](https://support.mozilla.org/ja/kb/profile-manager-create-and-remove-firefox-profiles)辺りを参考にしてプロファイルを復旧する。

1． Firefoxを起動してたら終了
2． Win-Rでファイル名を指定して実行を起動
3． "firefox.exe -P"でプロファイルマネージャを起動
4． プロファイルの作成を選ぶ
5． ウィザードにしたがってデスクトップにある旧プロファイルデータを指定してぽちぽち

## Firefoxでのバックアップについて
正直最初にデータが飛んだと気づいた時にFirefox syncあるからすぐ戻せるっしょ?
と思ったがぱぱっと調べた限りだとそもそもこいつはバックアップ用途じゃなかったんだなと...

参照:[ブックマークの保存と復元 | Firefox ヘルプ](https://support.mozilla.org/ja/kb/restore-bookmarks-from-backup-or-move-them)

```
注意: Firefox Sync はブックマークの変更に応じて継続的に更新を行うものであり、真のバックアップ機能を提供するものではありません。また、バックアップとして使用されることを意図してもいません。

```

なんて文言もあるし...

ブックマークはブックマークマネージャから何日ぶんかバックアップとってるのは知ってたので、アドオンも同じ感じでFirefox syncでやってると思ったら違うのだなと。

なので結局、アドオンの設定込みでブラウザ設定守るなら、以下あたりのプロファイルを定期的にする仕組みが必要そう。
(実はfirefox syncで複数PCなりのブラウザ同期してたらなんとかなったのかもしれないけど。chromeはそんな感じだし。)

```
C:\Users\hoge\AppData\Roaming\Mozilla\Firefox\Profiles

```

タスクスケジューラにrobocopyのタスク仕込むなりで定期的にバックアップしないと怖いなと思った所存。

## 2015年8月現在使ってるアドオン
プロファイルデータとか程よくバラしてクラウドにもバックアップしてるけど、いざどのアドオン使ってたっけ?なりそうなので。
なので見やすさのために備忘録として今使ってるアドオンをまとめてみる。
(他にも幾つか使ってるのもあるけど。)

| アドオン名 | 概要 |
|:-----------|:-----------|
|All in one gestures                  |ジェスチャー設定|
|All in one sidebar                    |サイドバーにブックマークとかアドオン管理とかまとめる|
|Contest Menu Image Saver      |画像を右クリで特定フォルダに保存|
|Download Box                        |ダウンロードの進捗表示アイコン|
|Launch Clipboard                   |クリップボード内のURLをまとめてタブに開く|
|Make Link                             |開いてるページのURLとかタイトルとかを整形してコピー|
|Menu Editor                          |右クリのメニュー偏執|
|newsstatuspanel                     |リンクマウスオーバー時の表示を見やすく|
|NoScript                               |jsの実行制限|
|Omnibar                               |アドレスバーと検索バーをつなげる|
|Open In Chrome                     |開いてるタブをchromeで開く|
|Page Title in URL Bar             |アドレスバーにタイトルを表示|
|Tab Mix Plux                          |タブ詳細設定|
|Tab Stacking                         |多タブ時に左右にオーバーフローしない|
|uBlock                                  |広告ブロック|
|url-addon-bar                        |アドレスバーにアドオンアイコン置けるように|
|Vaccuum Places Improved       |placesファイルの最適化|

以上。
Xcode7(iOS 9SDK)のATSでの謎

2015.10.13 追記
本文中の mobile.twitter.com の接続を確認しました。
どうもFirefoxなどで確認するとTwitter側のサーバ側の暗号化方式が
>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
になっているよう？です。

結局暗号化方式が問題だったのかわかっていないので、SSL/TLS周りをもう少し勉強しときます。
詳しく書けずに申し訳(・ω・｀)

何にせよ、ATS対応は必要なので、アプリで対応するかサーバで対応するか
プロジェクト毎に適切な対応をしていくことが大事ですね(´・ω・｀)

---

雑な文章＆内容がない記事でごめんなさい(＞人＜;)
誤りあったらコメントで指摘ください！！！

---

# ATS(App Transport Security)ってなに？
ざっくりいうと、
　Xcode7(iOS9 SDK)でビルドするとHTTPS通信以外は禁止だよ！凄いね！安全だね！
って機能。
※詳しくは[iOS9 ATS問題](http://qiita.com/yanayanalte/items/e6d83c12af77fa238a58)の記事でまとめてくれてるのでみてね！

通信を全く使わないアプリはあまりないと思うし、WebAPIとのやりとりを行うことは多いはず。
特に個人開発では自前のWebAPIにHTTPS自体やっているケースは少ないと思うので結構な人が対象になるのかなと思う。

# HTTPSっていっても・・・

[App Transport Security Technote](https://developer.apple.com/library/prerelease/mac/technotes/App-Transport-Security-Technote/index.html)を読むと・・・

* TLSは1.2じゃないとダメだよ！
* 暗号方式はこの中にあるものにしなきゃダメだよ！
>TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
>TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
>TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
>TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
>TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
>TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
>TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA


* 2048bit以上のRSA鍵 or 256bit以上のECC鍵 の SHA256の拇印が必要だよ！

* 無効な証明書では接続できないよ！

・・・って条件があるみたい。

# じゃあ、やってみよう！

検証のためにHTTPS化されている&上記の条件に合致しているサイトで実際にWebViewで試してみたところ・・・

**[Google](https://google.com/)に接続すると・・・・HTTPSでちゃんと表示される!OK！**

![Google](https://qiita-image-store.s3.amazonaws.com/0/80840/8e41cfe9-a325-cb19-eda2-6a64b0836c24.png)


**[Twitter](https://mobile.twitter.com/SAMUKEI)に接続すると、あれエラー！？**

![Twitter](https://qiita-image-store.s3.amazonaws.com/0/80840/63e9b3d9-ae10-f878-dc1c-7ab711f112de.png)

**・・・えっ！なんで！？**

で、原因を探ってみたところ

>NSExceptionRequiresForwardSecrecy
>A Boolean value for overriding the requirement that the domain support forward secrecy using ciphers.
>
>YES is the default value and limits the ciphers to those shown in Default Behavior.
>
>Setting the value to NO adds the following the list of accepted ciphers:
>
>>TLS_RSA_WITH_AES_256_GCM_SHA384
>>TLS_RSA_WITH_AES_128_GCM_SHA256
>>TLS_RSA_WITH_AES_256_CBC_SHA256
>>TLS_RSA_WITH_AES_256_CBC_SHA
>>TLS_RSA_WITH_AES_128_CBC_SHA256
>>TLS_RSA_WITH_AES_128_CBC_SHA

の例外指定を"NO"とするといける！

mobile.twitter.com の暗号化方式は

>TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

なので"YES"のままでも問題ないはずなんだけど・・・。

# 深まる謎、そしてどうするか・・・
記載している通り、[まとめ](http://qiita.com/yanayanalte/items/e6d83c12af77fa238a58#ats%E8%A8%AD%E5%AE%9A%E3%81%AE%E8%A8%98%E8%BF%B0infoplist)の例外指定を追加すると動作する。・・・だけど、結局は暫定対応なので今後Rejectされる可能性がある。
理由がわからないと、ドキュメント通りに対応しても実際にやってみなきゃわからないって最悪な状態に・・・誰か助けて´д` ;

---

# つぶやき・・・

* [App Transport Security Technote](https://developer.apple.com/library/prerelease/mac/technotes/App-Transport-Security-Technote/index.html)にApple公式の情報がちゃんと書いてあるのでよく読んでね！
* 単純にHTTPSにすれば良いってものじゃないので、外部サービスを複数使っているとそれぞれに対応依頼しなきゃダメだよ！
* WebViewではリンク先などもATS対象となるので、TOPページだけの対応はNGだから気をつけてね！
* PaaSでWebAPI作っている人はPaasが対応するだろうから関係ないかも！
* これがきっかけでHTTP2も一気に広まるといいね！
ROS-Androidでミクちゃんをカメラ小僧できるアプリケーション作ってみた


# 概要 
## 動画  
[![](http://img.youtube.com/vi/oaqdm8a71Nw/0.jpg)](https://www.youtube.com/watch?v=oaqdm8a71Nw)
簡易版．（ちゃんと編集してニコニコにでもうｐしたい）
5秒ぐらいにピピッてなったのはスマホのビデオ撮影開始の音で，そこからスマホで撮影した動画に切り替わっている．
右下のワイプは撮影している僕の姿です．

## ソース
https://github.com/mu-777/ros_miku_viewing

## 作った理由
研究でROSを使っていて感じたROSのメリットは，

- 基本的なパッケージがレポジトリにあって，apt-getで簡単に入れられる
- 強力なビジュアライズツール（Rviz, rqt）
- Pub/Subでのノード間通信が簡単で，複数PCなどでも関係なく通信してくれる

だなぁ，ロボットで面倒なところ全部引き受けてくれてるなぁと思ってた．
でもふと，てかよく見たら下２つってロボットあんまかんけーなくね？ロボット以外でも便利なんじゃね？と気付いてしまった．
なんで，前々から温めてたネタを使い慣れてるROSでさくっと作ってみた．
まぁドヤ顔して言うと，ROSの可能性を広げたかった．

# しくみ
Android側でスマホの姿勢をPCに投げ続け，その姿勢に応じてrvizのカメラ位置を変えてるだけです．
ちょっとシンプル過ぎて他に言うことが無いです．

# 使い方
※ githubのreadmeの日本語詳細版です．
## 準備
1. ROSのインストール
まぁこれは各自やってください．

1. パッケージのクローン→ビルド

    ```
    $ mkdir ~/catkin_ws
    $ cd ~/catkin_ws
    $ git clone https://github.com/mu-777/ros_miku_viewing.git src
    $ cd ~/catkin_ws
    $ catkin_make
    ```

1. MMDのdaeファイルを置く

    ```
    $ mkdir -p ~/catkin_ws/src/ros_miku_viewing/miku_rviz/robot/mmd_dae
    ```
で，この中にMMDをdaeに変換したファイルを置いてください．daeへの変換はいろいろあるので各自おねがいします．
自分はとあるPGの研究記録Ⅱさんの[PMDEditor Collada(.dae)エクスポーター](http://nullorempry.jimdo.com/work-list/mmd/pmdeditor/)を使いました．いつもお世話になっています．
置いたら，``common/launch/parameter.launch``の``<property name="modelDataFileName" value="Tda-style_miku.dae"/>``のvalueを自分の表示したいdaeファイルの名前を置き換えてください．

1. Androidアプリを入れる  
``android_imu_publisher/imu_publisher/imu_publisher-release.apk``を使ってご自分のスマホに入れてください．
一応Xperia SOL22(Android 4.2.2)では確認してますが，それ以外はわかりません．


## 動かす
1. スマホとPCを同じネットワークに入れる
各自ネットワークを作ってスマホとPCをつなげてください．自分のスマホでは，テザリングでPCを接続しても，このアプリが動くことは確認できてます．（ただしスマホのモバイルネットワークは切る必要があります）

1. PCでROSのノードを動かす．
ターミナル立ち上げて，

    ```
    $ export ROS_IP=<PCのIPアドレス>
    $ roscore
    ```
    別のターミナルで，

    ```
    $ export ROS_IP=<PCのIPアドレス>
    $ cd ~/catkin_ws
    $ source devel/setup.bash
    $ roslaunch roslaunch common main_tda_miku.launch
    ```

1. Androidアプリを起動する
起動して，Master URIの``http://localhost:11311``を``http://<PCのIPアドレス>:11311`` にして，Connectボタンを押します．
あとは自分のカメラアプリを起動して，PCの画面のミクちゃんをカメラ小僧してください．


# 作ってみて
正直，ROSでやる必要なかったですが，こんなこともできるんだよと．
でも，MMDをdaeに変換してしまってるので，ミクちゃんを動かすこととかできないんですよね...
MMDをパーツごと（頭・上腕・前腕...）に分割できれば，urdf作ってjointstateやれば動かせるんですけど，分割ってどうやるの？とか，ジョイントの継ぎ目どうなるの？とか，ボーンあるのに遠回りしてねとか，てかそもそもそこまでやりたいんだったら大人しくUnity使えよってことになるんでね．
今回のネタについては，ROSで組むのは帯に短したすきに長しというか，この程度のクオリティになっちゃうなと．まぁまずROSでこういうアプリケーション組むってことがおかしいんですが．
でも，情報系の人も結構ROSご存知の方いますし，Qiitaみたいなプログラマ御用達のところにもちょっとずつROSの記事出始めてるんで，だれかなんか面白いことやってくれませんかね？
  
あと，Qiitaでこういう作ってみた系の記事ってよろしくないんですかね...？
自分の認識ではプログラミング関係の情報Tips集のイメージなので，ここでやるべきではないのかなとは思いましたし， http://b4b4r07.hatenadiary.com/entry/2015/07/22/110317 とか見てても，やめときゃよかったかなとは思ったのですが...
ブログとか持ってないですし，かといってブログ作るほどいろいろ情報発信するレベルではないので，とりあえず自分のメモ込みで書いてみたのですが...
なんかちょうどいいサービスはないんですかね...？