OmniAICreator/Qiita-1.07M huggingface dataset:
Android StudioでAndroid AnnotaionsとFabricを一緒に設定する

```groovy:build.gradle
buildscript {
    repositories {
        jcenter()
        maven { url 'https://maven.fabric.io/repo' }
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.13.3'
        classpath 'io.fabric.tools:gradle:1.+'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.+'
    }
}

repositories {
    jcenter()
    maven { url 'https://maven.fabric.io/repo' }
    mavenCentral()
    mavenLocal()
}

apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
apply plugin: 'android-apt'

dependencies {
    apt 'org.androidannotations:androidannotations:3.1'
    compile 'org.androidannotations:androidannotations-api:3.1'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile('com.twitter.sdk.android:twitter:1.0.0@aar') {
        transitive = true;
    }
}

apt {
    arguments {
        androidManifestFile variant.processResources.manifestFile
        resourcePackageName android.defaultConfig.applicationId
    }
}

android {
    ...
}
```

```java:MainActivity.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

import com.twitter.sdk.android.Twitter;
import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.TwitterAuthConfig;
import com.twitter.sdk.android.core.TwitterException;
import com.twitter.sdk.android.core.TwitterSession;
import com.twitter.sdk.android.core.identity.TwitterLoginButton;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;

import io.fabric.sdk.android.Fabric;

@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {
    private static final String TWITTER_KEY = "PUT YOUR KEY";
    private static final String TWITTER_SECRET = "PUT YOUR KEY";

    @ViewById
    TwitterLoginButton loginButton;

    @AfterViews
    void init() {
        final TwitterAuthConfig authConfig = new TwitterAuthConfig(TWITTER_KEY, TWITTER_SECRET);
        Fabric.with(this, new Twitter(authConfig));

        loginButton.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {
                String name = result.data.getUserName();
                System.out.println(name);
            }

            @Override
            public void failure(TwitterException exception) {
                exception.printStackTrace();
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        loginButton.onActivityResult(requestCode, resultCode, data);
    }
}
```
RedmineのREST APIをWrapしてくれるJavaライブラリの調査

# これは何？

* Jenkins から　Redmineのチケット操作したいなーと考えて、REST APIを使って叩くことにした。
* でも、REST APIをベタで作るのは馬鹿らしいのでLibraryを探した。
* その結果、GETはできても、POST（UPDATE系）がダメっぽい事実。

# JavaからRedmineを操作できるLibraryは？

※　自分で作るきはさらさらない。
※　一旦ライセンスとか気にしない。

[Java での REST API の使用法](http://www.r-labs.org/projects/r-labs/wiki/Rest_api_with_java)　を参考に３つの選択肢があることを知る。

|Library名|コメント|
|:------------:|:------------:|
|Jredmine|×　：　よくわからない。Javaのライブラリではない？|
|redmine-jconnector|×　：　redmine1.4 対象なのできつい。2.5.2 or 2.6 で動作させたい|
|[Redmine Java API library from taskadapter](https://github.com/taskadapter/redmine-java-api)|○　：　動いた。|

# [Redmine Java API library from taskadapter](https://github.com/taskadapter/redmine-java-api)　の感想

[Redmine Java API library from taskadapter](https://github.com/taskadapter/redmine-java-api) の　version : 2.0.0

## GET系は動く模様。サンプルソース

```java
RedmineManager mgr = RedmineManagerFactory.createWithApiKey(uri, apiAccessKey);

IssueManager issueManager = mgr.getIssueManager();
List<Issue> issues = issueManager.getIssues(projectKey, queryId);
  
for (Issue issue : issues) {
 System.out.println(issue.toString());
 System.out.println(issue.getDescription());
}

```

## POST系（UPDATE系）が動かない模様

※　しかもExceptionも何もなく、無反応。プログラムは正常に終了するがRedmine側に反映されない模様。
※　Redmine2.5.2　でも　2.6.0でも両方試したが。ダメだった。
※　APIの呼び方が悪いのか・・・？悪いなら指摘いただきたき。

```java
Issue i = issues.get(0);
i.setSubject("CHANGED");
i.setAssignee(currentUser);
i.setNotes("FUGA");
mgr.getIssueManager().update(i);
```

ただし、Deleteは動く模様。

```java
mgr.getIssueManager().deleteIssue(0); #動いた
```

# コメント

* JenkinsだからJavaでやるみたいな短絡的発想。じゃなくて、Rubyとかで書けばいいのにって言うことなのかな。だって、Java好きなんだもん。
Xcode6.1で作成したadhoc用ipaをTestFlightにアップロードしたら失敗した。


# 現象

Xcode5.1では問題なくipaファイルをTestFlightへアップロードできていたが、Xcode6.1に更新したところ、TestFlightへのアップロード時に

>  Invalid IPA: the .app must be in a "Payload" (case-sensitive) folder.

というエラーが表示され、アップロードできなくなってしまった。

# 原因

不明。

ipaファイルを展開して、確認したところ
- Xcode5.1の場合はPayload/xxx.appというディレクトリ構成
- Xcode6.1の場合はApplication/xxx.appというディレクトリ構成
となった。

# 対処

[このサイト](http://www.cocoachimp.com/2014/10/03/xcode-6-woes/)にあるように、info.plistに以下を追加する。

Key: LSRequiresIPhoneOS
Value: YES
UnityでFlatBuffers


# 概要
お試しでUnityにFlatBuffers入れてみた
[c#用のコード]
(https://github.com/google/flatbuffers/tree/master/net/FlatBuffers)はここにある。Assets以下にフォルダ取り込むとよい。

# Unityに取り込んだらなんかエラーでる

```
Assets/FlatBuffers/Table.cs(35,32): error CS0172: Can not compute type of conditional expression as `short' and `int' convert implicitly to each other
```

```
// 一行修正したら直った
return vtableOffset < bb.GetShort(vtable) ? bb.GetShort(vtable + vtableOffset) : 0;
-> return vtableOffset < bb.GetShort(vtable) ? (int)bb.GetShort(vtable + vtableOffset) : 0;
```

# サンプルコード
```fbs:test.fbs
namespace Api.Test;

union Any { Test }

table Test {
	name: string;
}

root_type Test
```

c#用に変換 `$ flatc -n test.fbs`

```csharp:test.cs
void Start () {
	var fbb = new FlatBufferBuilder(1);
	var str = fbb.CreateString("hogehoge");

	Test.StartTest(fbb);
	Test.AddName(fbb, str);
	Debug.Log(fbb.DataBuffer());
	var mon = Test.EndTest(fbb);
	fbb.Finish(mon);
	TestBuffer(fbb.DataBuffer());
	
}

private void TestBuffer(ByteBuffer bb)
{
	var test = Test.GetRootAsTest(bb);
	Debug.Log(test.Name());
}
```

# 結果

簡単な評価だけど動くぽい
Aipo7.0.2のイメージ作った (905.1 MB)

参考: [グループウェア - Aipo(7.0.2)のインストール方法 - Qiita](http://qiita.com/nouphet/items/f08afb9d197a2948aa09)

* [DockerHub](https://registry.hub.docker.com/u/tukiyo3/centos6-aipo7/)
* [パッチプログラム - オープンソース｜無料グループウェア「アイポ」](http://free.aipo.com/patch.html#7020PatchRev1)適用済み

## 起動方法

```bash:起動方法
docker run -it -d -p 8080:80 --name aipo tukiyo3/centos6-aipo7
```

* http://docker-ip:8080/aipo/

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ae8e4675-9f0c-5e97-c5a2-1be76f673997.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/03e586bb-eee9-752a-ab71-bcc47674d43e.png)
コマンド実行後もコンテナを起動させ続けるにはtail -f を使うと良い

## 参考

* [Kim's Tech Blog](http://kimh.github.io/blog/jp/docker/gothas-in-writing-dockerfile-jp/#treat_your_container_like_a_binary_with_cmd)
* CMDやENTRYPOINTについては @hnakamur さんの記事が詳しい。
  * [dockerのENTRYPOINTとCMDの書き方と使い分け、さらに併用 - Qiita](http://qiita.com/hnakamur/items/afddaa3dbe48ad2b8b5c)

以下の様なDockerfileがある場合、最後に`tail -f /dev/null`をつけるとコンテナが起動し続ける。

```bash:Dockerfile
FROM centos:centos6

RUN  yum install -y tar sudo
RUN  sed -i -e "s/^Defaults    requiretty/#Defaults    requiretty/" /etc/sudoers
RUN  yum install -y make gcc readline-devel zlib-devel nmap wget
WORKDIR /usr/local/src
RUN  wget -q https://aipo.googlecode.com/files/aipo7020ja_linux64.tar.gz
RUN  tar xzf aipo7020ja_linux64.tar.gz
RUN  tar xzf aipo7020ja_linux/aipo7020.tar.gz
RUN  rm -rf aipo7020ja_linux*
WORKDIR /usr/local/src/aipo/bin
RUN  sh installer.sh > /dev/null
RUN  yum clean all
ENTRYPOINT ./startup.sh && tail -f /dev/null
```
Chrome console で急に XHR finished loading: GET ... が出るようになった・・

# JavaScriptのデバッグをしてたら急にconsoleがにぎやかになった

こんなん。

![chrome_console.png](https://qiita-image-store.s3.amazonaws.com/0/5691/b16c7c80-057e-6cff-7354-2fe744836b4b.png)

エラーでもないのに急にぽこぽこ出てくるようになった・・

# 回答

↓さすがのStackOverflow　ビンゴでした。

[google chrome - XHR finished loading [...] log message - Stack Overflow](http://stackoverflow.com/questions/12840024/xhr-finished-loading-log-message)

コンソールの隅っこの方にある、歯車マークをクリックして、
```Log XMLHttpRequests```のチェックをOFFにすると消える。

・・こんな深いトコにある設定間違って触った覚えないんだけど・・
なんでだろ。。
Herokuに公開する方法

PCの準備
　Mac
　Windows

Command Line Toolのインストール
　iTerm2
　Xcode

Herokuの準備
Herokuのアカウント作成
Heroku Toolbeltのインストール

Herokuにコマンドラインでログインし、SSHキーを設定
　heroku login
　　Email：
　　Password：
MACアドレスを取得する(Windows/Linux/BSD(OSX))


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

#if defined(WIN32) || (!defined(__GNUC__) && !defined(__clang__))
	#include <winsock2.h>
	#include <iphlpapi.h>
	#include <stdlib.h>
	#pragma comment(lib, "IPHLPAPI.lib")
#elif defined(__linux__)
	#include <string.h> //strncpy
	#include <sys/ioctl.h>
	#include <sys/socket.h>
	#include <net/if.h>
#else
	//bsd
	#include <sys/types.h> //FreeBSD u_int
	#include <ifaddrs.h>
	#include <net/if.h>
	#include <net/if_dl.h>
	#include <net/if_types.h>
#endif

void getmacaddress(char *mac_address){
#if defined(WIN32) || (!defined(__GNUC__) && !defined(__clang__))
	//MSDNのサンプルコード
	PIP_ADAPTER_INFO pAdapterInfo;
	PIP_ADAPTER_INFO pAdapter;
	ULONG ulOutBufLen = sizeof(IP_ADAPTER_INFO);
	unsigned char *addr;

	mac_address[0]=0;
	pAdapterInfo = (IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
	if(!pAdapterInfo)return;
	if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW){
		free(pAdapterInfo);
		pAdapterInfo = (IP_ADAPTER_INFO*)malloc(ulOutBufLen);
		if(!pAdapterInfo)return;
	}

	if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == NO_ERROR){
		pAdapter = pAdapterInfo;
		if(pAdapter){
			addr = pAdapter->Address;
			sprintf(mac_address,"%02x:%02x:%02x:%02x:%02x:%02x",
				addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
		}
	}
	free(pAdapterInfo);
#elif defined(__linux__)
	//http://field-notes.hatenablog.jp/entry/20101216/1292467817
	mac_address[0]=0;
	struct ifreq *ifr, *ifend;
	struct ifreq ifreq;
	struct ifconf ifc;
	struct ifreq ifs[16];
	int fd;
	unsigned char *addr;

	fd = socket(AF_INET, SOCK_DGRAM, 0);
	ifc.ifc_len = sizeof(ifs);
	ifc.ifc_req = ifs;
	if(ioctl(fd, SIOCGIFCONF, &ifc)<0){close(fd);return;}

	ifend = ifs + (ifc.ifc_len / sizeof(struct ifreq));
	for(ifr = ifc.ifc_req;ifr < ifend;ifr++){
		if(ifr->ifr_addr.sa_family == AF_INET){
			strncpy(ifreq.ifr_name, ifr->ifr_name, sizeof(ifreq.ifr_name));
			if(ioctl(fd, SIOCGIFHWADDR, &ifreq)<0)continue;
			addr = ifreq.ifr_hwaddr.sa_data;
			sprintf(mac_address,"%02x:%02x:%02x:%02x:%02x:%02x",
					addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
		}
	}
	close(fd);
#else
	//bsd
	mac_address[0]=0;
	struct ifaddrs *ifa_list, *ifa; 
	struct sockaddr_dl *dl; 
	unsigned char *addr;
	if(getifaddrs(&ifa_list)<0)return;
	for(ifa = ifa_list;ifa;ifa = ifa->ifa_next){ 
		dl = (struct sockaddr_dl*)ifa->ifa_addr; 
		if (dl->sdl_family == AF_LINK && dl->sdl_type == IFT_ETHER) {
			addr = (unsigned char*)LLADDR(dl);
			sprintf(mac_address,"%02x:%02x:%02x:%02x:%02x:%02x",
				addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
			return;
		}
	} 
	freeifaddrs(ifa_list); 
#endif
}
```
巨大なファイルをシェルスクリプトで読む時

# 巨大なファイルをシェルスクリプトで読む時

ちょっと2000万行くらいのcsvを読む機会があって、その時の小ネタ。

注釈追記)
コメントでも書いたんですけど、コマンド置換で `cat` でファイル開いて `for` に食わせるよりも、
１行ずつ処理するのは `while read` の方が一般的みたいです。

なんか注釈追記したら非常に実の無い記事になってしまったｗ

## 中身は

こんな感じのが2000万行くらいずらずら続いてる感じ。

```items.txt
"item_id","title","description","price","url","image_url"
"11111","たいとる","でぃすくりぷしょん","1000","http://example.com/item/11111","http://example.com/11111.jpg"
"22222","たいとる2","でぃすくりぷしょん2","2000","http://example.com/item/22222","http://example.com/22222.jpg"
```

## 1行ずつ処理するとき

### 駄目なやつ

コマンド置換

* `｀cat items.txt｀`
* `$(cat items.txt)`

だと、いったん全部ファイルの中身展開してから処理に流れるので、ちょっとまずい事になる。
これはコマンド置換のせいなので `cat` に限らず `head` とか `tail` とかでも同じ。

```bash:駄目
for x in `cat items.txt`; do
    echo $x
done;
```

### 大丈夫なやつ

`read` で1行ずつ読むのが正解。

```bash:おｋ
while read x; do
    echo $x
done < items.txt
```

これでもおｋ。

```bash:おｋ2
cat items.txt | while read x; do
    echo $x
done
```

## 余談

コレを

* ダブルクォートを消して
* tsvに変換

したので、自分用メモも兼ねてついでにそれも。

```bash:bash
#!/bin/bash

# とりあえずヘッダはstderrに吐いておこうかな
head -n 1 items.txt >&2

while read x; do
    echo $x | awk '
BEGIN {
    FS = ","      # 入力フィールドセパレータ
    OFS = "\t"    # 出力フィールドセパレータ
}
{
    # 各フィールドを囲ってる前後のダブルクォートを除去
    for(i=1; i<=NF; ++i) {
        sub("^\"", "", $i);
        sub("\"$", "", $i);
    }

    print $0    # OFS に ¥t 指定してるのでコレでおｋ
}'
done < <(tail -n +2 items.txt)    # 1行目はヘッダなので除外
```
location.hashが遷移しない？

WEBアプリというのかわかりませんが、とある社内向けのWEBシステムを作成中の事

まぁ一画面でいろいろ表示させたい顧客要望で、狭い（とはいえ1920x1080ですが）画面をDIVで区切ってありそれぞれに必要な情報を同時に表示させてる訳です。

リストAをクリックしたときにAJAXで取得してきて遷移せずにリストBが更新されるようになってるよくある話です。
リストBは量が多い為スクロールするので、表示されている先頭数件分より下の方にある対象の部分をあらかじめウィンドウ内に見えるように表示しておきたかった訳です。

aタグだと```<a href="index.php#target">```みたいな感じで書くとクリックするとそこが表示されている感じですかね？
Javascriptだと```location.hash = "target";```みたいに書くのが割と普通では無いかと思ってます。

が、何かおかしいなと思ってよく見てみたら初期表示時に一回遷移すると、リストが更新されてまたhashを指定しても遷移しない事が判明。

結論から言うと、一度空にしてからもう一度セットするとOKな事がわかりました。

```
location.hash = "";
location.hash = "新しい飛び先";
```

一応GoogleChromeはこれで飛びます。

ですが正直なんか腑に落ちません。
何か私の勘違いなのでしょうか？
意外としらないサイトマップの設定方法

#はじめに
Googleの検索エンジンにひっかかりやすくするために、
サイトマップを登録するととても良いです。

ここでは、サイトマップの作成から登録までの流れを書きます。
なんでこんなことを書くのかというと、自分がよく忘れるからです。。。

そんなわけで、手順を書きます。

#サイトマップの作成
お手軽なのは、
[サイトマップを作成-自動生成ツール「sitemap.xml Editor」](http://www.sitemapxml.jp/)
を使うことです。このサイトで、サイトマップを作成します。
自分のサイトのURLを入力して、「サイトマップ作成」ボタンをクリックするだけ。
あとは、出来上がった、sitemap.xmlファイルをクリックして、保存。
自サイトの直下にsitemap.xmlファイルをアップロードします。

#サイトマップの登録
[Googleのサイト](https://www.google.com/webmasters/tools/home?hl=ja)
にアクセスします。
※事前にウェブマスターツールに自サイトを登録しておく必要があります。

自サイトをクリックして、
![qiita01.png](https://qiita-image-store.s3.amazonaws.com/0/57930/ae6b8014-fb28-964c-de41-a0a94c4dbaf6.png)

「クロール」-「サイトマップ」をクリックします。


#サイトマップのテストと追加
「サイトマップの追加/テスト」ボタンを押して、
sitemap.xmlと入力して、まずはテスト！

再度、「サイトマップの追加/テスト」ボタンを押して、
sitemap.xmlと入力して、「サイトマップを送信」します。

#終わりに
たったこれだけのことですが、よく忘れます。

自分の備忘録がお役にたてば幸いです。
AWS Elastic BeanstalkにGrailsアプリをデプロイするときの注意点

# AWS Elastic Beanstalk http://aws.amazon.com/jp/elasticbeanstalk/

AWSアカウント作成時の12ヶ月無料枠で、t2.microのBeanstalkも使えるので触ってみまして。

## 要点

* Beanstalkのメモリ設定(heap/permgen)に注意
  * Grails動かすには heap 512MB permgen 128MB くらい必須
![beanstalk-1.png](https://qiita-image-store.s3.amazonaws.com/0/24453/3327327e-06ef-c8be-637b-d2436a308fba.png)
  * デフォルト設定は heap 256MB permgen 64MB なので動かない
* 初期リージョンがオレゴンだから初めての人は気を付けよう
* デプロイ後のURL構造は appName が付かない形だから development 環境もそうなるようにしとくと幸せ

## `DataSource.groovy` 設定例

```groovy
environments {
    development {
        grails.serverURL = "http://localhost:8080/"
        dataSource {
            // development環境のDB設定
        }
    }
    test {
            // test環境のDB設定
    }
    production {
        dataSource {
            driverClassName = "org.postgresql.Driver"
            username = "{username}"
            password = "{password}"
            dbCreate = "update"
            url = "jdbc:postgresql://{endpoint}:{port}/ebdb?user={username}&password={password}"
    }
```

RDS は PostgreSQL で、今回はバックアップ無し(0day)マルチAZ無しで作成した{endpoint}:{port}を設定しました。JDBC URLに **ebdb** をお忘れなく。

run-app でも appName が付かないURLの設定は `application.properties` にこれ。

```properties
app.context=/
```

あとは `BuildConfig.groovy` に

```groovy
    runtime 'org.postgresql:postgresql:9.3-1102-jdbc41'
```

とかしますね。最後に

```shell-session
$ grails war
```

で作成したwarをBeanstalkにアップロードすればok。

参考資料： http://www.inoneo.com/en/blog/5/amazon-aws/deploy-a-grails-application-on-aws-elastic-beanstalk
【質問】salesforceのルックアップ検索条件について

お世話になっております。

参照項目を入力するときにフォームの右隣にある虫眼鏡アイコンを押すと表示される、ルックアップ検索ウィンドウについての質問です。

こちらの項目は標準のオブジェクトの設定画面から、絞り込みのための条件を設定することができますが
今回、それよりも高度な条件を設定したいと考えています（SOQLのコード的には簡単なものですが）。

visualforceページやapexクラスを用いて、この条件をより高度なものにし、
apex:inputField で表示されるルックアップ検索ウィンドウに反映させることは可能なのでしょうか。

十分なソースが見つからずに困っています。
よろしくお願い致します。
WordPressの投稿記事からユーザー名が流出してしまう問題を解決！

WordPressって、便利ですよね。
ただ、便利すぎて困ることもあります。
それは、ユーザー名の流出です。
WordPressにログインできるユーザー名がばれることがあります。
それは、投稿記事を使っている場合に起こります。

なにもしなければ、

http://xxxx.com/wordpress/author/<ユーザー名>

というアドレスが作成されています。

sitemap.xmlを作成すると簡単にわかります。
[サイトマップを作成-自動生成ツール「sitemap.xml Editor」](http://www.sitemapxml.jp/)

これだと、ユーザー名がわかりますから、リスト型攻撃などの
標的になってしまいます。

解決するには、簡単です。以下のコードを、
http://xxxx.com/wordpress/wp-content/themes/<テーマ名>/functions.php
に追加するだけです。

`function theme_slug_redirect_author_archive() {
    if (is_author() ) {
        wp_redirect( home_url());
        exit;
    }
}
add_action( 'template_redirect', 'theme_slug_redirect_author_archive' );`

ねっ、簡単にセキュアな環境になりました。
didRegisterForRemoteNotificationsWithDeviceTokenこねえなあと思ったらプロビジョニング作りなおしてみるといいかもしれない。


adhocではdevicetoken取れるのにsubmitしてtestflightではだめ。

- Save for iOS AppStore Development
- Save for AdHoc Development

for iOS AppStoreのProvisioning ProfileにXCとか入ってる。

http://qiita.com/nofrmm/items/20afb47a6e1f966ea802
http://stackoverflow.com/questions/25056144/xcode-6-how-to-pick-signing-certificate-provisioning-profile-for-ad-hoc-distri
http://stackoverflow.com/questions/25999847/xcode-6-and-ad-hoc-distribution-without-xc-provisioning

なんかあったっぽいのでAppStore用のプロビジョニング作りなおしたらXC出なくなった。
CentOS6(by Vagrant&amp;Chef-solo)

# ホストPCに必要なもの
- [virtualbox](https://www.virtualbox.org/)
- [vagrant](https://www.vagrantup.com/)
- chef-solo/knife-solo
- berkshelf
- [vagrant-omnibus plugin](https://github.com/opscode/vagrant-omnibus)

# Vagrantfile
[https://github.com/okisanjp/Vagrantfiles-centos6](https://github.com/okisanjp/Vagrantfiles-centos6)

# chef-recipes
[https://github.com/okisanjp/chef-recipes](https://github.com/okisanjp/chef-recipes)


# メモ
- Berksfile,Vagrantfileは環境に合わせて適宜書き換えてご利用ください
- ほぼ自分用のメモなので変なところがあったらすみません
Windows 7 に XML Notepad 2007 をインストール

Windows 7 はサポート対象外ですが、互換モードでインストールすれば動作するようです。

### 1. マイクロソフトのサイトからダウンロード

http://www.microsoft.com/en-us/download/details.aspx?id=7973

### 2. 互換モードを設定

ダウンロードした XmlNotepad.msi を右クリックし、[プロパティ]→[互換性]から、チェックボックス[互換モードでこのプログラムを実行]をオンにして、「Windows の以前のバージョン」を選択し、[OK]を押下する。

### 3. インストール実施

その後、XmlNotepad.msi をインストールする。
テストに重要な”観点”。そのアプリ、数多のユーザーをカバーできてますか？ - リリース前の最後のテストにユーザーテストの勧め -

みなさん、テストしてますかー！

ソフトウェアのテストって大変ですよね。いくら時間を掛けて綿密にテスト設計してもバグはなかなか無くなりません。。。

# バグはあって当たり前？

いくらテストをやってもバグはなくならないし、なかには「ソフトウェアにバグはあって当たり前」なんていう開き直りの考え方も認知されつつあるあり様です。

特にスマホアプリに関してはアジャイル開発が当たり前になっていて、品質よりもリリース優先、「リリースしてからバグフィックスすればいい」なんていう姿勢の開発者もちらほら見受けられます。だからといって、重大なバグを残したままリリースしてはユーザーが離れて行ってしまうのも事実です。

# テストに重要なのは「観点」

ボクはバグが残ってしまう要因の中で最も重大なものは**「観点の欠如」**だと考えます。
いくら開発者が机上で頭を絞ってテストパターンを考えても、その根本となる観点が抜けていたら元も子もありません。

では、どうすれば観点の漏れを防げるでしょうか。
Androidに関してはGoogleから下記のようなガイドラインが公開されていて、テストにおいて押さえておくべき観点が挙げられてはいますが、多岐に渡るためリリース毎にその全てを行うことは現実的ではありません。

[Android アプリ品質ガイドライン](http://googledevjp.blogspot.jp/2013/01/core.html)

また、実際にアプリを使うユーザーのリテラシーは様々で、開発者が思いもよらぬ使い方をすることも多々あり、そんなユーザーの観点全てをカバーしきれるものではありません。

# アプリユーザー自身にテストをしてもらおう

そんな課題の解決策として、実際にアプリを使う一般のスマホユーザーにテストをしてもらってはどうでしょう？
実際の**リアルな通信環境、シビアな端末メモリ、思いもよらない使い方、見知らぬ端末、初めてアプリを目にした際の認知**。
そのどれもが開発者、開発環境では得難いテストになります。

## 自分達のアプリをテストしてみた結果

効果を確認するために自分達のアプリをユーザーテストしてみました。該当のアプリは自分達でテスト設計をして十分テストを行ったアプリなので、まぁさほど問題はないだろうと思っていたのですが。。。
結果、**25件の問題報告**をいただき、そのうち**4件をバグ対応、2件をUXの問題**として処理しました。

また、報告にはボクらのテストにはなかった以下観点がありました。

1. 機内モードでの利用
- 絵文字入力での表示
- 端末を上下逆さまにしてPush通知から起動
- Push受信から起動後のAndroidホームボタンの振る舞い

とくに 4. については自分たちでは当然と思っていた振る舞いだったため、気にも留めていませんでしたが、言われてみるとアプリケーションとして確かに使いにくい挙動だったと目からうろこで、ユーザテストならではでした。

## おしまい

今回の僕らの体験を生かしてできたのが次のサービスです。現在評価ユーザー募集中ですので興味のある方は利用を検討してみてください！

[ファイナルアイズ](http://finaleyes.flexfirm.jp/?qi_prf)
\- ユーザー視点のアプリテストを簡単に \-
MySQLのdatetimeに対して空白を挿入する方法

今まで動いていたアプリケーションがサーバー移行後に動かなくなった。
データベース側でdatetimeに対して空白を挿入する際にエラーが出ている模様。

# 対処方法

sql_modeの設定が異なる事が原因でした。
sql_modeのSTRICT_TRANS_TABLESをはずせば、SQLが通ります。

古いサーバ

```
mysql> SELECT @@GLOBAL.sql_mode;
+-------------------+
| @@GLOBAL.sql_mode |
+-------------------+
|                   |
+-------------------+
1 row in set (0.00 sec)
```

新しいサーバ

```
mysql> SELECT @@GLOBAL.sql_mode;
+--------------------------------------------+
| @@GLOBAL.sql_mode                          |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
```

my.cnfを修正します。

```
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
↓
sql_mode=''
```

以上

# 参考

[MySQL5.6にしていくつかのSQLでエラーが出るようになった](http://www.seeds-std.co.jp/seedsblog/1035.html)
HTML5のcanvas入門

今回は、HTML5で追加されたcanvasタグについて書きます。
簡単に言うと、お絵かきできます。

#始めてみるタグ編

`<canvas width="幅" height="高さ" id="canvasBase"></canvas>`

たったこれだけです。簡単です。
ただ、このままでは、なにも表示されません。
そこで、図形を描いてみます。
idは、なんでも構いません。この記事では、id="canvasBase"で統一します。

#図形 - 四角
JavaScriptを使用して描きます。

` var canvas = $('#canvasBase').get(0);
 var context = canvas.getContext("2d");
 context.beginPath();
 context.fillRect(座標X, 座標Y, 幅, 高さ);
 context.closePath();`

fillRect()　を rect()に変更すると枠だけ描かれます。

#図形 - 丸

JavaScriptを使用して描きます。

` var canvas = $('#canvasBase').get(0);
 var context = canvas.getContext("2d");
 context.beginPath();
 context.arc(座標X, 座標Y, 半径, 0, 360);
 context.fill();
 context.closePath();`

fill()は、塗りつぶすときに使います。
枠だけのときは、不要です。

#図形 - 線

JavaScriptを使用して描きます。

` var canvas = $('#canvasBase').get(0);
 var context = canvas.getContext("2d");
 context.beginPath();
 context.moveTo(座標X, 座標Y);
 context.lineTo(座標X, 座標Y);
 context.stroke();
 context.closePath();`

stroke()が実行されるまで、描かれます。
三角の場合は、
`    :
 context.moveTo(座標X, 座標Y);
 context.lineTo(座標X, 座標Y);
 context.lineTo(座標X, 座標Y);
 context.stroke();
     :`
とします。

#テキスト

JavaScriptを使用して描きます。

` var canvas = $('#canvasBase').get(0);
 var context = canvas.getContext("2d");
 context.beginPath();
 context.fillText(テキスト, 座標X, 座標Y);
 context.closePath();`

簡単に描けます。

#色を変えましょう！

'context.strokeStyle = "black"; // 枠の色
 context.fillStyle = "black";   // 塗りつぶす色`

#最後に

お分かりの通り、とっても簡単です。
これらを少し使っただけで、簡単にお絵かきができます。

よければ、こちらで遊んでください。

[Village Factory - Whiteboard](Whiteboardhttp://village-factory.com/whiteboard.php)
XcodeのIBとコードでの書き方の違い

初歩的な事だけど、
Interface Builderで書く場合とコードだけで書く場合の決定的な違いがよくわからず、
コピペするもどこまでが必要なのかよくわからなかった。

例えば画像を作り出す。

```objc:UIImageViewの初期化
    CGRect rect = CGRectMake(10, 10, 250, 250);
    UIImageView *imageView = [[UIImageView alloc]initWithFrame:rect];
```
 
これに等しい行為がSB上にimageViewを貼って名前を付ける（outlet）すること…だと思う。
こっからは一緒。imageViewが名前。


```objc:画像の読み込み
    imageView.image = [UIImage imageNamed:@"lena.png”];
```
ただし、コードで作り出した場合だけビューに表示の指示を書かねばならない。
IBの場合はもう出てるよ

```objc:UIImageViewのインスタンスをビューに追加
    [self.view addSubview:imageView];
```
Unityを使ってアプリを作る人がMP3を使う場合のライセンスの話

# 結論

アプリを作るだけならライセンス料は払わなくても良さそう。
どうしても気になるならAppleとかGoogleとかWindowsにだすならMicrosoftに聞いて！

## なんで？

MP3のライセンス料はMP3を再生できるデバイスを作成した側が払うものだから

### 過去の議論
https://www.facebook.com/groups/unityuserj/permalink/379456672114279/
https://www.facebook.com/groups/unityuserj/permalink/338520062874607/






 間違いあったらおしえてください。。。
[Git]直前のコミットを作業ツリーに戻したい時

コミットしちゃったけど、作業ツリーに戻したい！っていうとき

```
% git reset HEAD~1
```

でコミットが消えて、
直前コミットの変更内容が作業ツリーにもどってくれる☆

(この変あまりやらないので、いざというときよく忘れるのでメモ）
【CakePHP】saveField

単一フィールドの保存に使用。

```php
//対象のidを指定
$this->id = 15;

//saveField(カラム名,値)
$this->saveField('status',1);
```

指定するカラム名は、モデル名+カラム名ではなく、カラム名のみを指定する。
Elastic Beanstalkにカスタムドメインを割り当てる。


### １．Route53でHosted Zoneを新規作成する

Domain Name欄に自分が持っているドメイン(example.com)を入力する。

### ２．お名前.comで外部DNSを設定

作成したHosted Zoneを選択すると、Delegation Set欄にDNS名がいくつか表示されるので、それをお名前.com等で、取得したドメインの外部ネームサーバーを登録する画面で全部登録しておく。

### ３．Route53でHosted Zoneを選択し、"Go to Recored Sets”ボタンを押す

### ４．"Create Record Set"ボタンを押してRecord Setを新規作成する

>Name欄が空のものと、wwwと２つ作っておくと良いかもしれない。

AliasラジオボタンでYesを選択し、Alias Target欄をクリックすると、"-- Elastic Load Balancers --"のところにBeanstalkで使われているロードバランサーが表示されるので、それを選択し"Create"
Ubuntuで開いてるディレクトリからターミナルを呼び出したい

[ここに書いてあった](http://askubuntu.com/questions/207442/how-to-add-open-terminal-here-to-nautilus-context-menu)
下記2行のコマンドを実行するだけでできました。

```bash
sudo apt-get install nautilus-open-terminal
nautilus -q
```

ディレクトリを開いている間に右クリックすると「端末の中に開く」が現れます。クリックするとそのディレクトリでターミナルが開きます。

（しかし「端末」ってわかりにくい和訳だよな…）
CakePHPでデバッグ0以外ではブラウザアクセスを許可する場合

## 利用したとき
debug時はajaxリクエストをブラウザから確認したかった。

## コード
```
        // デバッグモード以外ではajax以外も許可
        if (Configure::read('debug') == 0 && !$this->request->is('ajax')) {
            throw new BadRequestException("NO_SUPPORT");
        }
```
Jenkinsマシンを立ててみてわかったこと


> Qiitaで技術ネタを一元管理したいのでブログから移っただけ。相当古いネタなのでご注意ください。

Jenkinsのslave nodeを作ってみたのでメモ。設定方法を書いた記事は多いので省略。

###前提

- masterが存在していて、git-scm等のプラグインがすでにインストールされてる
- slave nodeとして追加するマシンはmacosx

###やりたいこと

- Jenkins自体のインストール・設定・メンテはしない（他のプロジェクトと一元で管理）
- ビルドをスレーブノード上で実行、成果物履歴をスレーブに残す。
- 他のプロジェクトのジョブと競合したくない、マスターのディスク容量が限られているから食わない
- できればビルド結果をわかりやすくチームメンバに知らせる

###Slave Node用マシンの用意

- macって本当にいいかをまじめに検討すべき
 - jenkinsのmasterがjenkinsユーザとしてslaveノードにコマンドを送るので、jenkinsユーザでslaveにログインする
 - 開発マシンがlinuxでログ等は/home以下のどっかにアクセスする場合（例として/home以下をmkdirする）、macマシンにもjenkinsユーザに/home以下のmkdir権限を与えたい。しかしデフォルトではmacの/home以下にmkdirしちゃいけない（sudo権限も）
 - 解決策：http://stackoverflow.com/questions/1362703/how-can-i-use-the-home-directory-on-mac-os-x
 - 特別な事情がなければjenkins serverもdev serverと同じosでいい気がする
- slave nodeマシンに入れるもの以外と多い
 - 基本的にdevマシンと揃えるべき（ソフトのバージョンまで）
- たまーにsleepしてslave-agentが落ちる
 - 対策はよくわからない。sleepさせないようにcaffineを入れている。

###ビルド失敗した場合メンバに伝える方法

- もちろんemail飛んできます
 - が、メールだと緊急感を伝えられないみんないちいちメール見ない
- 物理的になんか見えるものがあるといいなーと思ったのでこんなの作った（チームの島においてある{と言っても僕のディスプレーの上}）

###Jenkins Visualizer

![](http://tech.nerocrux.org/wp-content/uploads/2013/11/1456669_10152047308109686_1672537728_n-300x200.jpg)

- どういうもの
 - 写真左上のLED電球が最新ビルドの状態を示す
 - 写真右下のLEDバー（10灯）が最近10ビルドの履歴を示す
 - それぞれ4色がある

> 赤：FAIL
> 緑：RUNNING
> 青：SUCCESS
> 黄：UNSTABLE

- コードはこちら

> https://github.com/nerocrux/maid-mayuyu/tree/master/jenkins-status

- 使ったもの
 - 数年前に買った Arduino Duemilanove

> http://arduino.cc/en/Main/ArduinoBoardDuemilanove

 - 評価ボードだけのってるシールド

> http://akizukidenshi.com/catalog/g/gM-07033/

 - フルカラーLEDとLEDバー

> http://akizukidenshi.com/catalog/g/gI-00729/
> http://akizukidenshi.com/catalog/g/gI-04761/

- 事前準備
 - 配線。ものすごく簡単なので省略。基本的にスケッチを書いてLEDを赤・黄・青・緑の4色に点灯できるだけでOK。
 - 更にスケッチをもっとまじめに書いて、シリアル通信で、特定のコマンドが送られて来たら、特定の色に切り替えられるようにする
- 運用
 - トリガーで使うプログラムを用意（write-jenkins-status-serial.rb）
 - Jenkinsのビルド開始時の完了時にwrite-jenkins-status-serial.rbを実行する
 - そのスクリプトがjenkinsのAPIをアクセスし、ビルド結果を取得して整形し、シリアル通信でarduinoに送る
 - Arduinoのシリアルポートにコマンド（基本的に文字列）が入ってきたらLEDの色を切り替える
- 感想
 - LEDが明るく過ぎて眩しい
 - 履歴は多分見ない
vyosにmoshを入れてサーバ群管理用窓口にする

自宅サーバやクラウド環境のサーバー群を操作するときにルーターマシンを窓口にしてsshしたい。
ついでにスマホでやるとき回線不安定でも平気なmoshにしておこうとその作業メモ。

##Debianレポジトリの追加
[公式FAQ](http://vyos.net/wiki/FAQ#How_do_I_install_debian_packages.3F)より引用

```
# set system package repository squeeze components 'main contrib non-free'
# set system package repository squeeze distribution 'squeeze'
# set system package repository squeeze url 'http://mirrors.kernel.org/debian'
```
moshはbackportsに入っているのでこちらも入れる

```
# set system package repository squeeze-backports components main
# set system package repository squeeze-backports distribution squeeze-backports
# set system package repository squeeze-backports url 'http://backports.debian.org/debian-backports'
```
##moshのインストール

```
$ sudo aptitude update
$ sudo aptitude install mosh
```
##ロケールの設定

moshは"en_US.UTF-8"のロケールを要求するがvyosデフォルトでこちらのロケールは入っていないので追加する

```
$ sudo dpkg-reconfigure locales
```
これを実行すると選択画面が表示されるのでその中から"en_US.UTF-8"を選択する。
[Windows] バッチファイルからputtyとWinSCPを一度に起動して自動ログインもする

（すみません、誤って消しました。。）


@lazynick さまの記事
[puttyをキーボードからショートカットで自動ログイン](http://qiita.com/lazynick/items/9c81253bcc2cf91562be)
を参考に、puttyとWinSCPを同時に起動させることにした。

```bat:sample.bat
@echo off
set PUTTY=C:\path\to\puttyjp.exe
set WINSCP=C:\path\to\WinSCP.exe
set SESSION=session
set PASSWD=passwd

start %PUTTY% -load %SESSION% -pw %PASSWD%
start %WINSCP% %SESSION%
exit
```

2回バッチを起動すると
ターミナルも増えるし、WinSCPにはセッションタブが追加されるし
嬉しいことだらけ。

ありがとうございます

**パスワード管理にはお気をつけ下さい！**
PHPのarray_columnが便利

PHP5.5で入った`array_column()`がとても便利だと言うことを@edvakf@githubに教えてもらった。

DBから取得したデータとか下のような形式になってることがよくある。

```php
<?php

$rows = [
    0 => [ 'id' => 40, 'title' => 'dave', 'comment' => 'Hello, world!'],
    1 => [ 'id' => 10, 'title' => 'alice', 'comment' => '你好，世界！'],
    2 => [ 'id' => 30, 'title' => 'charlie', 'comment' => 'こんにちは、世界！' ],
    3 => [ 'id' => 20, 'title' => 'bob', 'comment' => 'Salve , per omnia saecula !' ],
];
```

こういう風に行毎にフィールドをキーにした連想配列になってるやつだ。DBから値を取得するとだいたいこんなかんじでとれる。こういうデータを`array_column()`を使うと簡単に構造を変換できる。PHPすごい。

## ある要素だけ取り出す

第1引数に配列、第2引数に取り出す要素のキー名を指定する。

```php
<?php

$rows = [
    0 => [ 'id' => 40, 'title' => 'dave', 'comment' => 'Hello, world!'],
    1 => [ 'id' => 10, 'title' => 'alice', 'comment' => '你好，世界！'],
    2 => [ 'id' => 30, 'title' => 'charlie', 'comment' => 'こんにちは、世界！' ],
    3 => [ 'id' => 20, 'title' => 'bob', 'comment' => 'Salve , per omnia saecula !' ],
];

var_export(array_column($rows, 'id'));
// =>
// array (
//   0 => 40,
//   1 => 10,
//   2 => 30,
//   3 => 20,
// )
```

IDだけの配列が簡単に作れて便利。

## あるフィールドをキー、あるフィールドを値にした連想配列にする

第3引数を指定にすると、その要素を結果の連想配列のキーにできる。

```php
<?php

$rows = [
    0 => [ 'id' => 40, 'title' => 'dave', 'comment' => 'Hello, world!'],
    1 => [ 'id' => 10, 'title' => 'alice', 'comment' => '你好，世界！'],
    2 => [ 'id' => 30, 'title' => 'charlie', 'comment' => 'こんにちは、世界！' ],
    3 => [ 'id' => 20, 'title' => 'bob', 'comment' => 'Salve , per omnia saecula !' ],
];

var_export(array_column($rows, 'title', 'id'));
// =>
// array (
//   40 => 'dave',
//   10 => 'alice',
//   30 => 'charlie',
//   20 => 'bob',
// )
```

## 行を値にした連想配列にする

第2引数をnullにすると、行がそのままフィールドになる。

```php
<?php

$rows = [
    0 => [ 'id' => 40, 'title' => 'dave', 'comment' => 'Hello, world!'],
    1 => [ 'id' => 10, 'title' => 'alice', 'comment' => '你好，世界！'],
    2 => [ 'id' => 30, 'title' => 'charlie', 'comment' => 'こんにちは、世界！' ],
    3 => [ 'id' => 20, 'title' => 'bob', 'comment' => 'Salve , per omnia saecula !' ],
];

var_export(array_column($rows, null, 'id'));
// =>
// array (
//   40 =>
//   array (
//     'id' => 40,
//     'title' => 'dave',
//     'comment' => 'Hello, world!',
//   ),
//   10 =>
//   array (
//     'id' => 10,
//     'title' => 'alice',
//     'comment' => '你好，世界！',
//   ),
//   30 =>
//   array (
//     'id' => 30,
//     'title' => 'charlie',
//     'comment' => 'こんにちは、世界！',
//   ),
//   20 =>
//   array (
//     'id' => 20,
//     'title' => 'bob',
//     'comment' => 'Salve , per omnia saecula !',
//   ),
// )
```

## まだPHP5.5使ってないよ！

もうPHP5.6出てるんだから、はやく対応しろよ、っと言いつつ、Pure PHPの実装がある。

- [array_column/array_column.php at master · ramsey/array_column](https://github.com/ramsey/array_column/blob/master/src/array_column.php)
UIWrapContentの罠


## 問題

タブの切り替えでGameObjectをDestroy()して再作成したら、以下のようなエラーが出てしまった。

```
MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it.
UnityEngine.Transform.get_localPosition ()
UIWrapContent.WrapContent () (at Assets/NGUI/Scripts/Interaction/UIWrapContent.cs:157)
```
## 同じ現象

- http://www.tasharen.com/forum/index.php?topic=9800.0

## 解消法

Destroy()するたびにそのGameObjectをSetActive(false)にし、GameObjectを作られた後にWrapContentをStart()する

### 仮コード（適当）

```
bool destroyed = false;
foreach (Transform child in Grid.gameObject.transform)
{
	if (xxx) // Destroy()が走ったら
	{
		child.gameObject.SetActive(false); // まず無効にする
		destroyed = true;
		Destroy(child.gameObject);
	}
}

...

UIWrapContent wrapContent = UIGrid.GetComponent<UIWrapContent>();
int maxVisibleCount = wrapContent.maxVisibleCount;
wrapContent.maxCount = targetDataModel.Length;
wrapContent.onInitializeItem = this.OnInitializeScrollItem;

...

foreach (TargetDataModel data in targetDataModel)
{
	...
	GameObject go = CreateScrollItem();
	...
	go.SetActive(true);
}

if (destroyed) 
{
	wrapContent.Start(); // ここでWrapContentを再起動
}
```
JenkinsとGitLabの連携


# 実現すること

- GitLabのGitにはhttpsでアクセス
- GitLabにはssh公開鍵は登録しない

# 手順

Jenkins機で作業する前に、ローカルのvagrantにて実施。
まず普通にやろうとすると、以下のようにRuntimeExceptionが出る。

![runtimeex.png](https://qiita-image-store.s3.amazonaws.com/0/51910/84bde0f2-e4da-2679-e02f-316df101ccaf.png "runtimeex.png")

Jenkinsが動いているJavaにGitLabの証明書を登録する。
まず、Jenkinsが動いているJavaを確認。

```
[root@localhost ~]# ps auxw|grep jenkins
jenkins   6051 13.6 27.3 2001624 278948 ?      Ssl  00:44   1:29 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -Dhudson.util.ProcessTree.disable=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8080 --ajp13Port=8009 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20 --prefix=/jenkins
root      6141  0.0  0.0 107460   940 pts/0    S+   00:55   0:00 grep jenkins
```

keytoolを使ってGitLabの証明書を登録する。尚、cerでもpemでもどちらでも良い。

```
[root@localhost ~]# ll /etc/alternatives/java
lrwxrwxrwx 1 root root 46 10月 29 04:05 2014 /etc/alternatives/java -> /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
[root@localhost ~]# cd /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/
[root@localhost bin]# keytool -importcert -v -trustcacerts -file /vagrant/Downloads/gitlabkey/cacert.cer -keystore ../lib/security/jssecacerts -alias gitlab
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
.
.
証明書がキーストアに追加されました
```

この時点で試してみると、エラーが以下のように変化した。
![caerror.png](https://qiita-image-store.s3.amazonaws.com/0/51910/aa1b2ddd-2c07-7707-8f61-1c339ba41dc7.png "caerror.png")


JENKINS_HOME(/var/lib/jenkins)に.gitconfigを作成する。
尚、GitLabのpemもここに置いた。

```.gitconfig
[http]
  sslcainfo=/var/lib/jenkins/gitlab.pem
```

この時点でエラーは401 Unauthorizedだけになるので、Credentialsを追加する。
![401err.png](https://qiita-image-store.s3.amazonaws.com/0/51910/938ee4b9-82f9-de16-4428-b5e4f34b3d0b.png "401err.png")

![スクリーンショット 2014-10-30 11.28.50.png](https://qiita-image-store.s3.amazonaws.com/0/51910/e810911e-79d8-d30d-e06a-b7f5bdecfed3.png "スクリーンショット 2014-10-30 11.28.50.png")

これでエラーは解消し、リポジトリからclone出来るようになった。
![ok.png](https://qiita-image-store.s3.amazonaws.com/0/51910/1965f006-eecd-8877-9e65-bf69fa3d51f7.png "ok.png")

# 参考

- http://treeapps.hatenablog.com/entry/2014/06/11/233027
- http://docs.oracle.com/cd/E19528-01/820-0846/gbnjn/index.html
jpegoptim のインストール



## インストール


準備: libjpeg のインストール

```
$ sudo yum -y install libjpeg
$ sudo yum install libjpeg-turbo-devel
```

インストール

```
$ cd /tmp
$ mkdir jpegoptim
$ cd jpegoptim
$ wget http://www.kokkonen.net/tjko/src/jpegoptim-1.4.1.tar.gz
$ tar zxvf jpegoptim-1.4.1.tar.gz
$ cd jpegoptim-1.4.1
$ ./configure
$ make
$ sudo make install
```

確認

```
$ jpegoptim --version
jpegoptim v1.4.1  x86_64-unknown-linux-gnu

 :

```

## 簡単な使い方

```
$ jpegoptim --max=80 IMG_7210-2.jpg
IMG_7210-2.jpg 500x375 24bit N Exif IPTC ICC JFIF  [OK] 84845 --> 45126 bytes (46.81%), optimized.
```

46.81% 削減されました。

元画像 (84,845 bytes)

![IMG_7210-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/18743/75cfe3c7-4e1a-c008-05f1-fbd42f8601f6.jpeg "IMG_7210-1.jpg")

圧縮後画像 (45,126 bytes)

![IMG_7210-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/18743/6daad7ef-1879-df0c-6a2f-44be2cb174c5.jpeg "IMG_7210-2.jpg")




## 参考

1. 作者サイト
	* http://www.kokkonen.net/tjko/projects.html

1. Manual Page
	* http://www.kokkonen.net/tjko/src/man/jpegoptim.txt

1. Install JpegOptim in CentOS
	* http://kwatog.com/blog/jpeg-optimizer-jpegoptim-centos/

1. Cannot install jpegoptim on Centos 6
	* http://stackoverflow.com/questions/18515433/cannot-install-jpegoptim-on-centos-6
const修飾されたインスタンスはコンパイラが生成したデフォルトコンストラクタで初期化することはできない

<cite>N4140, § 8.5.7</cite> によるとconst修飾されたインスタンスは、コンパイラが生成したデフォルトコンストラクタで初期化することはできないらしい。

> If a program calls for the default initialization of an object of a const-qualified type T, T shall be a class type with a user-provided default constructor.
> \- <cite>N4140, § 8.5.7</cite>

```cpp:main.cpp
struct Data {
    Data() = default;
    Data(int) {}
};

int main() {
    Data d1(1); // OK
    Data d2; // OK
    Data const d3(1); // OK
    Data const d4; // Error
    return 0;
}
```

```bash
$ clang++ -std=gnu++14 -stdlib=libc++ -Wall -Wextra main.cpp
main.cpp:10:16: error: default initialization of an object of const type
'const Data' requires a user-provided default constructor
    Data const d4; // Error
               ^
1 error generated.
```
[話題]Tポイントの他社への個人情報提供を停止してみた


##若干、煽り気味なネットの反応
技術的な話しでは無いが、Tポイントが[個人情報の提供で話題](http://internet.watch.impress.co.jp/docs/news/20141029_673496.html)になっているので、オプトアウトをやってみた。

と、その前に、今回の真相を軽く調べてみた。

そもそも、CCCやファミマなどはTポイントの個人情報などを`共同利用`という形で使っていたらしい。なので、ユーザに対して、企業毎のオプトアウト機能などは持ってなかった。今回は、そのような曖昧な扱い(法的には曖昧じゃないんだけど、実態として)をやめて、第三者提供という形にして、各企業ごとにオプトアウトできるようにした、どちらかと言うとユーザフレンドリーな変更だったようだ。

という好意的な受け止め方もできるし、

 **共同利用だとちょっと面倒なので、がんがん提供先足していきますよ。** とも受け取れる。

参考) [Tカードは個人情報保護法違反に該当するのか？](http://ch.nicovideo.jp/tsuda/blomaga/ar6354)

##火種が無いわけではない
ただし、物議を醸す物が無いわけでな無い。というのは、CCCが新たな提携先を追加した場合、デフォルトが`提供許可`となる。つまり情報提供したく無いユーザは定期的にCCCのページをチェックしてオプトアウトしないといけない。以下の画像は[Tポイントの書類によるオプトアウトページ](http://www.ccc.co.jp/customer_management/download/index.html#optout)にあるPDFからの抜粋。
![利用の停止または消去の請求・第三者への提供停止の請求](https://www.evernote.com/shard/s12/sh/44b698a7-c741-4d8c-8a80-859717853ec3/865fe9683e544cb7abfa273071cd4ad2/res/1615370c-f49c-41dd-8978-d16c1fcb9bfc/skitch.png "利用の停止または消去の請求・第三者への提供停止の請求")

##さて、実際にオプトアウトしてみる
やってみて思ったのが、何故オプトアウトするのに`Yahoo IDへの連携`を強制させられるのだろう。一応、Yahooもオプトアウトできるらしいので、問題ないか。。。（※ Yahoo ID無しでもオプトアウトできるらしい）

### とりあえず Yahoo IDとの連携
[Tポイントのオプトアウト説明](http://tsite.jp/r/ccc/customer/optout.html)へ移動して、ページの下の方にあるリンクをクリック。僕はT会員ネットサービス未登録だったので、下の箇所からログイン。

![利用停止](https://www.evernote.com/shard/s12/sh/b9808d0c-1dd5-425c-b519-682c2549da07/3645f99ed1b5fab9d0f40e548daa1f87/res/8191587c-7b5f-40b3-9dd9-d573a45a50f7/skitch.png)

`Yahoo ID`との連携を求められる。

![Yahoo IDが必要です](https://www.evernote.com/shard/s12/sh/65749228-386a-44e4-a02d-341ecb9e9c55/0f37cc40dbe6cbd510442595eb064284/deep/0/TポイントとTカードの総合サイト-T-SITE-.png)

`Tカード`番号登録

![Tカード番号登録](https://www.evernote.com/shard/s12/sh/a42ec684-2626-4e26-b107-3cfd8ef26dd6/07c75aaa0d000fe11648cf8df31cdfd8/deep/0/Ｔポイント利用手続き---Yahoo!-JAPAN.png)

これで一応、連携は完了。

### オプトアウトページに移動

[Tポイントのオプトアウトページ](https://tsite.jp/accounts/optout/)へ移動する。提携企業が一杯あるので、自分の個人情報を提供したくない企業をチェックくら外す。

![オプトアウト](https://www.evernote.com/shard/s12/sh/c6a68778-2f81-45aa-b8ee-f1a0e1367816/7a8110f5aa092d7f1a892e6c89fa43cd/deep/0/提携先への個人情報提供の停止---Tサイト-Tポイント-Tカード-.png)

ページ下部の`設定を変更する`を押して完了!

## Yahoo IDと連携せずにオプトアウト
一応 `Tカード番号`と`Tパスワード`だけで解約できるようだ。
▶[TポイントのオプトアウトをYahoo! JAPAN IDなしで行う方法](http://d.hatena.ne.jp/klim0824/20141030/Tpont)
Macターミナルのopenコマンドの使用例


##アプリを指定してファイルを開く
`$ open -a Atom README.md`
README.mdをAtomで開く

##アプリを起動
`$ open /Applications/Arduino.app`

##URLからWebページ開く
`$ open http://github.com`

##ディレクトリ指定してFinder起動
`$ open ~/Downloads/`

##今いるディレクトリをFinderで表示
`$ open ./`
Twitter DevelopersがFablic色になってて、過去に作成したアプリへのリンクがわからない件

モバイルアプリ開発者向けSDK「Fabric」がリリースされて、昔作成してたtwitterアプリへのリンクがわからず５分悩んだのでメモ。

Developers => Documentation => Manage My Apps

![イメージ.jpg](https://qiita-image-store.s3.amazonaws.com/0/24113/5981babf-a127-b8e6-d67a-0f14ac997b71.jpeg)

ここでした。
frisby + jasmine-nodeでWebAPIをテストする。

---
Mac(Yosemite)上でfrisbyとjasmine-nodeを使ったWebAPIテスト環境を作る。
レスポンスがJSONであれば、[frisby](http://frisbyjs.com/)は便利。

###インストール

・node.jsが入ってない場合はbrewかダウンロードしてインストール。
・続いて、frisbyとjasmine-nodeをインストール。今回はどちらも-gとする

```
sudo npm install -g frisby
```

```
sudo npm install -g jasmine-node
```


ちなみに、frisbyは/usr/local/lib/node_modules/frisbyに入る。

###テスト用のAPI準備
今回はPHPで用意。xとyを受けっとって足すAPI。

```add.php
<?php

	$x = 1;
	$y = 2;

	if(isset($_POST['x'])) $x = $_POST['x'];
	if(isset($_POST['y'])) $y = $_POST['y'];

	$ans = $x + $y;

	$response = array();
	$response['api_status'] = "OK";
	$response['ans'] = (string)$ans;

	header("Content-Type: application/json");
	echo json_encode($response);

```

###テストを書く

で、テストの方。

どこかにspecというディレクトリを作って、*.spec.jsで保存しておくと、jasmine-nodeがテスト対象としてくれる。
toEqual()をどう使っていのか？？？と思っていたが、afterJSON()に書けばいいらしい。受け取ったjsonは引数に渡されるようだ。

```test01.spec.js
var frisby = require('/usr/local/lib/node_modules/frisby');

frisby.create("サンプル")
	.post('http://localhost/add.php',{
		x:3,
		y:4
	})
	.expectStatus(200)
	.expectHeader('Content-Type','application/json')
	.expectJSONTypes({
		api_status: String,
		ans: String
	})
	.afterJSON(function(data){

		var ans = data.ans;
		expect(ans).toEqual('7');
	})
.toss();

```
なぜかfrisbyのpathをフルパスで書かないと動かなかった。。。？？？


###テストを実行する

specフォルダで、

```
jasmine-node .
```

とすると、そこに置いてある*.spec.jsを実行してくれる。
Windows に NLTK をセットアップ

基本的には NLTK のサイト( http://www.nltk.org/install.html )に従ってインストールしているだけだが、UnicodeDecodeError エラーが出たのでその対応方法をメモ。

### 1. Python のインストール 
64bitバージョンは避けて、32bit をインストールする。
http://www.python.org/download/releases/3.4.1/
https://www.python.org/ftp/python/3.4.1/python-3.4.1.msi


### 2. Numpy のインストール (推奨) 
http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/numpy-1.8.1-win32-superpack-python3.4.exe


### 3. NLTK のインストール
http://pypi.python.org/pypi/nltk で良いはずだが、UnicodeDecodeError が出たので、http://www.nltk.org/nltk3-alpha/ から http://www.nltk.org/nltk3-alpha/nltk-3.0a4.win32.exe をインストールした。

参考にしたページ : http://stackoverflow.com/questions/25493720/python-nltk-unicodedecodeerror-ascii-codec-cant-decode-byte
Bootstrapサイトの説明欄のCSSについて

<a href="http://getbootstrap.com/css/">bootstrapサイトのCSS</a>ページなどで表示されている、divタグのスタイルシートについて、書きます。

何のことかというと、赤枠の<br/>
![bootstrap01.png](https://qiita-image-store.s3.amazonaws.com/0/57930/9a4661b4-1bde-e5e8-4358-d7f66bdf7460.png)
<br/>
のことです。

以下のコードをスタイルシートに記述します。<br/>

```
.bs-callout {
    padding: 20px;
    margin: 20px 0;
    border: 1px solid #eee;
    border-left-width: 5px;
    border-radius: 3px;
}
.bs-callout h4 {
    margin-top: 0;
    margin-bottom: 5px;
}
.bs-callout p:last-child {
    margin-bottom: 0;
}
.bs-callout code {
    border-radius: 3px;
}
.bs-callout+.bs-callout {
    margin-top: -5px;
}
.bs-callout-default {
    border-left-color: #777;
}
.bs-callout-default h4 {
    color: #777;
}
.bs-callout-primary {
    border-left-color: #428bca;
}
.bs-callout-primary h4 {
    color: #428bca;
}
.bs-callout-success {
    border-left-color: #5cb85c;
}
.bs-callout-success h4 {
    color: #5cb85c;
}
.bs-callout-danger {
    border-left-color: #d9534f;
}
.bs-callout-danger h4 {
    color: #d9534f;
}
.bs-callout-warning {
    border-left-color: #f0ad4e;
}
.bs-callout-warning h4 {
    color: #f0ad4e;
}
.bs-callout-info {
    border-left-color: #5bc0de;
}
.bs-callout-info h4 {
    color: #5bc0de;
}
```

見栄えのいいサイト作成できます。
[Swift] 自分のアプリをObjCからSwiftに移植して分かったこと


iOS8が発表され、Swiftが解禁されてからしばらく経ちました。
iOSをやり始めて勉強用に作った[マイQiita](https://itunes.apple.com/jp/app/maiqiita/id815520982?mt=8)をまるっとSwiftに移植してみました。

Swiftが発表されてすぐに色々いじっていましたが、実際にアプリとして書き始めてみると気づく点もたくさんありました。
今回は色々ハマったり気づいた点をまとめていこうと思います。

## `ProductName-Swift.h`は、ObjC側では`.m`に`import`する

これ、少しハマりました。どうやらヘッダファイルでimportするとダメなようです。


## Swiftで定義したenumはObjC側で使えない

Swiftで[enum](http://qiita.com/edo_m18/items/d65cf1d9135cab78ba6e)が大幅に強化されました。
それもあって、Swift側で定義したenumはObjCでは使えないようです。


## Optionalをしっかり意識する

Swiftの重要な概念である「[Optional](http://qiita.com/edo_m18/items/ca8c9c21049c280d3328)」ですが、しっかりと意識していないと細かいところでハマりました。
というのも、なにがしかのメソッドの戻り値だったり、あるいはFrameworkのプロパティをローカル変数に代入しようとしてエラーになることがあります。

これは単純にOptionalな型なのに、Optionalな型ではない変数に入れようとするためです。
が、ObjCを移植したりしているとついコードをコピペしてSwiftの見た目に整える、みたいなことをやるので忘れがちです。
さらにXcodeの成熟度の問題か、指摘されているのが適切ではかったりするのでさらに混乱しました。


## ビルドエラーになると`ProductName-Swift.h`が消える

SwiftのクラスをObjC側で利用する仕組みとして[ブリッジファイルの存在](http://qiita.com/edo_m18/items/861d090a5471f4f0eeae)があります。

Swift → ObjCの場合はXcodeが自動生成してくれるので特に意識する必要はありません。
が、Swift内でビルドエラーがあるとファイルが消されてしまうようで、ObjC側でそれをimportしている部分でさらにエラーが発生します。（消えずにいるが、ビルド時に一度消えてる？　あるのにnot foundになるケースも）

問題はSwift側なのでObjC側をいくらいじっても解決しません。
なので、まずはSwift側を修正してから再度試してみると普通にビルドできたりします。


## `self` と `self.class` と `self.dynamicType`

ObjCでは、インスタンスメソッド内からクラス・メソッドを呼ぶ場合に、`[self.class someMethod]`と記述していました。
Swiftの場合は以下のように`dynamicType`を使うことで同様のことが出来ます。

```swift:dynamicType
class Hoge {
	var name: String?
	class func classMethod() {
		print("hoge")
	}
	func instanceMethod() {
		self.dynamicType.classMethod()
	}
}
```


## NSOrderedAscendingなどのenum値でハマる

結論から言うと、以下のようにしました。

```swift
var result: NSComparisonResult = hoge.compare(comparedNumber)
if result == .OrderedAscending {
	// do something.
}
```

名称が微妙に推測しづらいものだったので一瞬悩みました。


## CoreDataのcontext.executeFetchRequestでハマる

最初、以下のよう記述しました。

```swift
var results: [Hoge] = context.executeFetchRequest(request, error:&error)! as [Hoge]
```

見る限り普通のコードですね。
が、しかし。

```console
fatal error: NSArray element failed to match the Swift Array Element type
```

とエラーが。castしてるしなんだよーと思っていたら、まったく同じ質問を[Stackoverflow](http://stackoverflow.com/questions/25897122/executefetchrequest-throw-fatal-error-nsarray-element-failed-to-match-the-swift)でしている人がいました。

そこで記載されている画像を引用させてもらうと以下の感じです。
![example.png](https://qiita-image-store.s3.amazonaws.com/0/5616/0a632327-cf85-3aa5-b795-7fee948b0e29.png "example.png")

要は、CoreDataのモデルの設定を上記のようにすることで正常に動くようになります。
Swiftはnamespaceがあるので、情報としてそれらを含めた正確な情報を指定しないとならないようです。
"status" vs "state"

どちらも和訳すると「状態」ですし、一般的な英語としてもほぼ同義語扱いされていますが厳密には…
<DL>
<DT>status</DT>
<DD>取り得る状態の【集合】です。<BR>例：スレッドの状態</DD>
<DT>state</DT>
<DD>取り得る状態のどれかです。<BR>例：（スレッドの）実行中状態</DD>
</DL>

http://oshiete.goo.ne.jp/qa/3909263.html
こちらの回答3番、『後ろに「～である状態」を付けて意味が通る場合は、state』という判断基準がとてもクリアカットで秀逸ですね。
Swiftのapplication openURLでハマるの巻



## 問題


へい、Xcodeで補完したコードだぜ。

```swift
func application(application: UIApplication!, openURL url: NSURL, sourceApplication: String, annotation: AnyObject?) -> Bool {
    return true
}
```


これが書かれたアプリをToday Extensionから呼び出すと


```swift
@IBAction func openButton(sender: AnyObject) {
    let strUrl = "test://"
    let url = NSURL(string: strUrl)
    self.extensionContext?.openURL(url, completionHandler: nil)
}
```


「EXC_BAD_ACCESS」

## 解決

sourceApplicationにnilが来ているのが原因ぽいと想像

```swift
func application(application: UIApplication!, openURL url: NSURL, sourceApplication: String!, annotation: AnyObject?) -> Bool {
    println(sourceApplication)  // nil
    return true
}
```

動いた。
【まとめ】SVGを扱ってみた

#SVG画像を手入力で作る場合

- [svg要素の基本的な使い方まとめ](http://www.h2.dion.ne.jp/~defghi/svgMemo/svgMemo_01.htm)
- [svg要素の基本的な使い方まとめ・目的別リンク](http://www.h2.dion.ne.jp/~defghi/svgMemo/svgMemo_how2.htm)

#SVG画像をJSでいじりたくなった場合

選択肢として「Snap.js」「Rapahel.js」「D3.js」などがあるようです。Raphael.js→Snap.svgというように流行が映っているらしいです。

- [D3.js - 日本語ドキュメント](http://ja.d3js.node.ws)
- [svg要素の基本的な使い方まとめ D3.js](http://www.h2.dion.ne.jp/~defghi/svgMemo/svgMemo_20.htm)
- [Snap.svg（英語）](http://snapsvg.io)…DEMO,DOCSあります。
- [Snap.svg 使い方まとめ](http://www.h2.dion.ne.jp/~defghi/snapsvg/snapsvg.xhtml)
- [Raphaël—JavaScript Library（英語）](http://raphaeljs.com)…DEMO,DOCSあります。
- [Raphaëlを用いたベクタグラフィック](http://www.h2.dion.ne.jp/~defghi/svgMemo/svgMemo_19.htm)