OmniAICreator/Qiita-1.07M huggingface dataset:
[Vagrant] Warning: Authentication failure. Retrying...

vagrantのソフトウェアをアップデートしたら、ワーニングが発生するようになった。
vagrantのゲストOS自体は立ち上がっているが、SSH接続がパスワード認証が必要であったり、Webサイトの一部が見れない状態になった。

以下、原因と対処法。
### 原因
vagrant upした際に生成される秘密鍵と、ゲストOSに設定してある公開鍵がマッチしないため。
### 対処法
#### 秘密鍵を確認
```
$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/******/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

#### 公開鍵を生成
```
$ ssh-keygen -yf /Users/******/.vagrant/machines/default/virtualbox/private_key > ./public_key
```
カレントディレクトリにファイルを書き出す。

#### ゲストOSに生成した公開鍵を設定する
```
$ vagrant ssh
vagrant@127.0.0.1's password: 
Last login: Thu Sep  8 12:15:20 2016 from 10.0.2.2
[vagrant@centos ~]$ vi ./.ssh/authorized_keys 
[vagrant@centos ~]$ sudo chmod 700 ~/.ssh
[vagrant@centos ~]$ sudo chmod 600 ~/.ssh/authorized_keys
```
./public_keyの内容をコピペする。改行が入らないように注意する。

### 確認
vagrantを立ち上げ直してワーニングがは発生していないことを確認する。

```
$ vagrant halt                                                                                                                    
==> default: Attempting graceful shutdown of VM...

$ vagrant up      
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
GuestAdditions 4.3.34 running --- OK.
==> default: Checking for guest additions in VM...
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/masaakieda/Development/myproject/plusstyle
    default: /var/www/html => /Users/masaakieda/Development/myproject/plusstyle/www
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.
```
### 参考
[Package化したboxを使うときによく出るエラー](http://blog.10rane.com/2015/08/28/errors-out-when-using-to-package-the-box/)
よくわからない Permission Denied

munin のプラグインをインストールしたときに遭遇。
あるプロセスでだけ実行するとPermission Deniedエラーになる。

パーミッションやユーザの問題かと思いきや SELinux の話しだったこと。

munin-run を実行したときはOK。
でも munin-node から問い合わせるとエラーになる

```
$ nc fetch redis_connected_clients
# Bad exit
```

`/var/log/munin-node/munin-node.log` を見ると、

```
2016/09/30-10:00:00 [12345]      Could not connect to Redis server at 127.0.0.1:6379: Permission denied at /etc/munin/plugins/r...
```

もがいたあげく  `/var/log/audit/audit.log` に ` avc:  denied  { create }` を見つけて、確認したら有効になってました。

```
getenforce
Enforcing
```

`/etc/selinux/config` を編集して、OSをリブートしたらOKでした。
Postfix で MTA 間送信に TLS を利用する


## 背景

ある日 Gmail で受信したメールに赤い錠が開いた形のマークがある、と報告を受けました。確認してみると Gmail が SMTP で受信する際に TLS が使われていない場合、赤い錠マークが表示されると、[Gmail ヘルプ](https://support.google.com/mail/answer/7039474?visit_id=1-636108112307379582-3900142490&hl=ja)にはあります。

寡聞にしてそのときまで知らなかったのですが、MTA 間通信でも TLS を利用できます。社内メールサーバーに利用している Postfix では、[Thunderbird](https://www.mozilla.org/ja/thunderbird/) や [Sylpheed](http://sylpheed.sraoss.jp/ja/) 等の MUA からの接続には TLS を使うよう設定していましたが、外部の MTA への SMTP 接続はデフォルトのままでした。

この記事では、Postfix が外部への SMTP 通信時に TLS が利用できる場合に TLS 通信させる設定について説明します。

## 設定方法

大掛かりな前書きを用意しましたが、設定はシンプルで `main.cf` に以下を追加して Postfix を reload すれば完了です。

```ini
smtp_tls_CAfile = /etc/pki/tls/cert.pem
smtp_tls_security_level = may
smtp_tls_loglevel = 1
```

### 設定の意味

#### smtp_tls_security_level

一番重要な設定です。値には "may" を設定しましょう。may の場合、送信先の SMTP サーバーが STARTTLS 対応している場合に STARTTLS を使い、未対応の場合は通常の SMTP で送信します。

Gmail では赤い錠アイコンが目立ちますが、残念ながら TLS に対応していないサーバーはまだまだ残っています。この記事を記述している 2016/9/30 の時点でも、[Google のレポート](https://www.google.com/transparencyreport/saferemail/?hl=ja#region=142)によると、キャリアメールは全滅です。yahoo.co.jp も非対応ですね。

#### smtp_tls_CAfile

接続先の証明書を検証するためのルート証明書です。古いサーバーだと、ルート証明書の期限が切れていたり、不足していることがあるので、最新のものかどうか確認を忘れずに。

#### smtp_tls_loglevel
これを設定しないとログファイルに送信時の TLS 情報が出ません。設定しましょう

## 確認方法

Postfix の稼動しているサーバーで Gmail 宛に送ってみるのが簡単です。

### Gmail ヘッダ

Gmail の「メッセージのソースを表示」メニューでヘッダを表示しましょう。

```text
Received: from *.*.ne.jp (*.*.ne.jp [*.*.*.*])
        by mx.google.com with ESMTPS id qf3si568403igb.48.2016.03.10.18.18.51
        for <***@gmail.com>
        (version=TLS1 cipher=AES128-SHA bits=128/128);
        Thu, 10 Mar 2016 18:18:51 -0800 (PST)
```
TLS で送信されたことが確認できます。

### Postfix ログ

"TLS connection" で grep してみましょう。

```text
2016-03-11T11:18:50.879713+09:00        postfix/smtp[21172]:    mail    info     setting up TLS connection to gmail-smtp-in.l.google.com
2016-03-11T11:18:50.970645+09:00        postfix/smtp[21172]:    mail    info     Verified: subject_CN=mx.google.com, issuer=Google Internet Authority G2
2016-03-11T11:18:50.970691+09:00        postfix/smtp[21172]:    mail    info     TLS connection established to gmail-smtp-in.l.google.com: TLSv1 with cipher AES128-SHA (128/128 bits)
```

TLS で接続されていればこのようなログが出ていると思います。


## 環境ごとの注意点

### Amazon Linux

上記設定のみで OK です。

### CentOS

CentOS 5.x 系以前は[ルート証明書が古い](https://heartbeats.jp/hbblog/2014/01/rhel5centos5globalsign.html)です。更新されていることを確認しましょう。他の環境から最新のルート証明書を持ってくるのも手っ取り早くてよいですね。

今、新しくメール環境を独自ドメインで作成するなら [G Suite](https://gsuite.google.co.jp/intl/ja/products/gmail/)で運用するのが簡単ですが、古くからメールを自社で運用している場合は移行も大変で、メールサーバーが社内最古のサーバーになってしまっていることは少なくないように思います。

### Debian / Ubuntu

ルート証明書のパスが Red Hat 系列 (CentOS, Amazon Linux) とは異なります。`/etc/ssl/certs/ca-certificates.crt` がシステムのルート証明書になります。

諸事情でアップデートできていない場合は、他の環境から最新のルート証明書を取ってきましょう。


### まだ qmail 使ってるんだけど...

探してみたら[パッチ](http://inoa.net/qmail-tls/)がありました。それも20160918 とつい先日の更新です。頑張ってください。応援しています。
Gitで不要になったリモートブランチを削除

#ローカルブランチの削除
構文はこんな感じ

```
#git branch -d [ブランチ名]
```

ブランチ名が「test」だった場合

```
#git branch -d test
warning: deleting branch 'test' that has been merged to
         'refs/remotes/origin/test', but not yet merged to HEAD.
Deleted branch test (was 6926787).
#
```

#リモートブランチの削除
構文はこんな感じ

```
#git push origin :[ブランチ名]
```

ブランチ名が「test」だった場合は

```
#git push origin :test
To git@192.168.1.100:hoge/fuga.git
 - [deleted]         test
#
```
プログラミングを始めて6カ月がたった

プログラミングを始めて6カ月がたった。同じようなことを書く人はたくさんいるけど、思ったことを書いてみる。
覚え書き。でも、何も知らないという状態を理解することは、とても重要だと思う。何かを知った後に知らなかった状態を思い出すのはとても難しいから。

## エンジニアは優しい
いろいろわからないことがあっても、周りにいらっしゃる方に丁寧に教えていただいてます。いろんなイベントに参加しても、会った人は本当に優しい人ばかりでした。
~~最初にこれくらい持ち上げておけばいいだろう~~
## みんなJSON好きすぎだ
みんなjsonが好きだ。何かとjsonを使いたがる。xmlはどこへいったのか。プログラマーに無人島に何を持っていきたいと聞いたらこう答えるだろう。JSONだって。そんなに好きなら結婚すればいいのに。。。。
ちなみに私はまあまあ好きです。
## エラーと原典はしっかり読もう
エラーと原典をしっかり読めば必ずプログラミングができるようになる


らしい。
でも、英語の原典を読むのと、エラーを読むのは本当に疲れる。頑張らなくては
## やりたいこと多すぎ
正規表現もやりたいし、Go言語もやりたいし、Unityもやりたいし、機械学習もやりたいし、ReactもNodeもscalaもなんでもかんでもやりたい。
## 環境構築はFuck
上の通りです。エラーをはかないでください。
## Vimを考えた人はすごい
こんなキーバインド考えた人は本当に天才だと思う。



## でもなんだかんだ言ってプログラミング楽しい。
これから出会う人はよろしくお願いします。まだプログラマーとは名乗れませんが、何年後かにこの文章をあざ笑う人間になりたいです。
全角カナ変換時にFirefoxがいきなりクラッシュする件について

#現象
フォームのフリガナの欄のところで、javascriptでひらがなを全角カナ変換にするよう指定したら、
firefoxのブラウザがクラッシュした。

#対処
全角カナ変換のコードの中に文字入力時に現在のフォーカス場所から1つ先に移動する記述があり、
また、入力した値をカナに変換した後、元のフォーカス場所に戻る記述があったので
そこをコメントアウトするとクラッシュしなくなった。
（※phpなど他にも色々関係してるかもなので、あくまで自分の場合についてです。）

#コード
```javascript
// 全角カナ変換
function toZenKana(f) {
	var str = $(f).val();
	var str_ = str;
	str = str.replace(/[\u3041-\u3096]/g, function(s) {
		return String.fromCharCode(s.charCodeAt(0) + 0x60);
	});
	if (str != str_) {
	var focusableElements = $(":focusable");
	var nowIndex = focusableElements.index(f);
	//focusableElements.eq(nowIndex + 1).focus();　←コメントアウトしました
	$(f).val(str);
	//focusableElements.eq(nowIndex).focus();　←コメントアウトしました
	}
}
```
むしろコメントアウトした部分はどういう働きをしていたのか、まだ調査中です。。
[Python] CGIHTTPServer で リダイレクトする

```python:動作確認
Python 2.7
Mac OS
```

## やりかた

1. metaタグでリダイレクトするようなhtmlを吐く.pyを書く
2. CGIHTTPServerを立ち上げる
3. 作った.pyにアクセスする

> $ mkdir cgi-bin
> $ vim cgi-bin/redirect.py

```python:redirect.py
#! /usr/bin/python
print "Content-type: text/html;\n\n"
print "<meta http-equiv=\"refresh\" content=\"0;URL=http://qiita.com/\">"
```

> $ chmod +x cgi-bin/redirect.py 
> $ python -m CGIHTTPServer 8000

ブラウザでlocalhost:8000/cgi-bin/redirect.pyにアクセス

## 経緯

通常Locationを使うとリダイレクトできるんですが、
[Python 2.7.12 documentation](http://docs.python.jp/2/library/cgihttpserver.html)によると、HTTPレスポンスに書く形でのリダイレクトはできないとのことで、諦めて別のWEBサーバを使いがちです。

>注釈 CGIHTTPRequestHandler クラスで実行される CGI スクリプトは HTTP コード 200 (スクリプトの出力が後に続く) を実行に先立って出力される (これがステータスコードになります) ため、リダイレクト(コード302) を行なうことができません。

しかし、今回のような方法で実現することもできます。
できるかどうかと使うかどうかは別の話ですね。

## 補足

Python 2.7の環境で確認しています。
ただ、細かいバージョンで違いがあるような技術ではないです。
3系だと、[これ](https://docs.python.org/3/library/http.server.html#http.server.CGIHTTPRequestHandler)ですが、リダイレクトということで考えることは同じです。

また、最小手順を示すために色々削って確認しています。
各々でちゃんと書いてください。
ruby instance_eval instance_exec binding

http://blog.bigbinary.com/2013/03/12/understanding-instance-exec-in-ruby.html

http://www.techscore.com/blog/2013/08/30/ruby-proc%E3%81%AB%E3%82%88%E3%82%8B%E5%A4%89%E6%95%B0%E3%81%AE%E9%9A%A0%E8%94%BD%E3%81%A8bindng/
ruby instance_eval(&block)

```rb

class A
  def b
    puts "lala"
  end

  def c(&block)
    instance_eval(&block)
  end
end

A.new.c { b }
```

```rb
class A
  def b
    puts "lala"
  end

  def c(&block)
    block.call
  end
end

A.new.c { puts "lala" }
A.new.c { b }
```

rails use a lot
JSP カスタムタグの作成

# はじめに

JSPでは、自分でタグを作成できる。これにより、JSP中に極力Javaコードを書かずに済む。

## 作成して利用するまでに必要なこと

カスタムタグを利用するまでには、以下のことを行う必要がある。

- タグハンドラクラスを作成する
- タグ設定を記述する
- 利用側で利用宣言する

上記の他に、タグファイルを作成し、利用宣言をすることでそのタグも利用できる。

# カスタムタグを作成する手順
## タグハンドラクラスの作成

タグハンドラクラスは、(Tag|IterationTag|BodyTag)インターフェースの実装が必要だが、各タグには共通して記述する部分が多いため、それらを実装した以下のいずれかのクラスを継承すると楽に作成できる。

- `javax.servlet.jsp.tagext.TagSupport`クラス: bodyなしのタグ、bodyに作用しないタグ、bodyを繰り返すタグ
- `javax.servlet.jsp.tagext.TagSupport`: bodyの内容を変更するタグ
- `javax.servlet.jsp.texext.SimpleTagSupport`: Servlet2.4以上でbodyなしのタグ

以下に、`TagSupport`クラスを継承し、bodyなしのタグを作成する場合を掲載する。

```java:bodyなしハンドラ(SampleTagHandler.java)
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class SampleTagHandler extends TagSupport {

    private String name;

    @Override
    public int doEndTag() throws JspException {
        try {
            // 出力
            pageContext.getOut().print("あなたが入力した名前は「" + name + "」です。");
        } catch (IOException ex) {
            Logger.getLogger(SampleTagHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
        // 残りのページを評価する値を返して終了
        return EVAL_PAGE;
    }

    // name属性をセットするためのセッタ
    public void setName(String name) {
        this.name = name;
    }
    
}

```

タグ記述毎に最低限変更が必要になるであろう関数は以下。

| 作成するタグの種類 | 継承するクラス | `doStartTag()` | `doAfterBody()` | `doEndTag()` |
|:-----------------|:-------------|:---------------|:----------------|:-------------|
| bodyなし         | TagSupport    |                |                 | 変更する      |
| bodyあり         | TagSupport    | 変更する        |                 | 変更する      |
| bodyを繰り返す    | TagSupport    | 変更する        | 変更する         | 変更する      |

また、属性を持たせる場合、単純セッタ(name属性 -> `setName()`)が必要。


## タグ設定を記述する

タグ設定を記述するフォーマットは、XMLもしくはTLDである。
以下では、TLDによる記述を紹介する。
以下に掲載するのは、NetBeansIDE8.1で生成したものである。

```xml:/WEB-INF/tlds/mytaglib.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
  <tlib-version>1.0</tlib-version>
  <short-name>mytaglib</short-name>
  <uri>/WEB-INF/tlds/mytaglib</uri>

  <!-- タグの定義 -->
  <tag>
    <!-- タグの名前 -->
    <name>SampleTag</name>
    <!-- タグハンドラクラス -->
    <tag-class>SampleTagHandler</tag-class>
    <!-- bodyを持つかどうか -->
    <body-content>empty</body-content>
    <!-- 属性の定義。attributeを複数並べられる。 -->
    <attribute>
      <!-- 属性名 -->
      <name>name</name>
      <!-- 必須属性かどうか -->
      <required>true</required>
      <!-- 実行時評価属性かどうか -->
      <rtexprvalue>true</rtexprvalue>
      <!-- 属性の型 -->
      <type>java.lang.String</type>
    </attribute>
  </tag>
</taglib>
```

`<tag>`タグの中に1つのタグを記述する。
タグに付与したい属性は、`<attribute>`タグで指定する。

## 利用宣言する

作成したタグを利用したいJSPで、以下の記述をする。

```jsp
<!%-- TLDファイルの取り込み -->
<%@taglib prefix="my" uri="/WEB-INF/tlds/mytaglib" %>

<!%-- カスタムタグの利用 -->
<my:SampleTag name="Foo" /><!%-- あなたが入力した名前は「Foo」です。 -->
```
[Linux][OpenGL/EGL] apitraceの使い方まとめ

OpenGL / EGL の解析ツールである [apitrace](http://apitrace.github.io/) の基本的な使い方のまとめ

検証環境はVirtualBox上のUbuntu16.04になります。
(最新のapitraceだとGCC4.9やcmake2.8.11以上が要求されるため注意)

# インストール方法
## 1. 本家からソースコードをダウンロード
[apitrace/apitrace: Tools for tracing OpenGL, Direct3D, and other graphics APIs](https://github.com/apitrace/apitrace)

```console:クローン
$ git clone https://github.com/apitrace/apitrace.git
```

## 2. ビルドとインストール
Ubuntu16.04 64bit向けのビルド方法になります。
その他の環境のビルド方法については公式の以下のドキュメントを参照して下さい。
[apitrace/INSTALL.markdown at master · apitrace/apitrace](https://github.com/apitrace/apitrace/blob/master/docs/INSTALL.markdown)

```console:必要なパッケージのインストール(Ubuntu16.04の場合)
$ sudo apt-get install cmake libx11-dev qt5-default
```

```console:ソースからのビルド
$ cd apitrace
$ cmake -H. -Bbuild -DENABLE_GUI=TRUE -DCMAKE_BUILD_TYPE=RelWithDebInfo
$ make -C build
$ sudo make install -C build/
```

# トレースの取得
使い方は以下のページを参照
[apitrace/USAGE.markdown at master · apitrace/apitrace](https://github.com/apitrace/apitrace/blob/master/docs/USAGE.markdown)

とりあえず、aptで取ってこれる適当なサンプルがこれぐらいしかなかったのでglmark2というOSSのベンチマークツールで試してみます。

```console:glを使用するアプリケーションのインストール
$ sudo apt-get install glmark2-es2
```

![glmark.jpg](https://qiita-image-store.s3.amazonaws.com/0/37721/203bf18d-c803-51aa-f7b0-c3b9ce07eb16.jpeg)

```console:apitraceの実行例
$ apitrace trace --api=egl --output=/tmp/dump.trace glmark2-es2
```

# トレースの再生
## コマンドラインの場合
### ログの出力

まずはダンプですが、APIの実行のトレース結果を表示できます。

```console:ダンプ
$ apitrace dump dump.trace 
```

![apitrace_dump.jpg](https://qiita-image-store.s3.amazonaws.com/0/37721/f90ea85e-acff-48de-31e4-b5e7678ccc0b.jpeg)

トレース結果が取得できていることがわかります。

## リプレイ

リプレイというのもありますが、これはダンプ結果から再生ということなんでしょうか

```console:リプレイ
$ apitrace replay dump.trace
```

## GUIアプリの場合

Qt製のGUI上でトレース結果の参照や解析ができます。

```
$ qapitrace dump.trace
```

実行結果は以下のようになります。

![qapitrace.jpg](https://qiita-image-store.s3.amazonaws.com/0/37721/e1da6fa5-163b-44f7-fddc-55bd90bd3552.jpeg)

内容としては

・[Events    ] API呼び出しのトレース結果
・[Parameters] そのタイミングでのパラメータの表示
・[Shaders   ] 描画しているバーテックスシェーダ、フラグメントシェーダの表示
・[Surfaces  ] フレームごとのサーフェースの描画結果
・[Uniforms  ] Uniform変数の値

などがあるようです

・Buffers
・SSBBs

ってのはちょっとわからないです・・・（要調査）

## その他の使い方

多機能すぎてよくわかってない範囲が多いですが・・・、その他の使い方、詳細は以下のusageページを参照して下さい。
[apitrace/USAGE.markdown at master · apitrace/apitrace](https://github.com/apitrace/apitrace/blob/master/docs/USAGE.markdown)

# まとめ
apitraceすごい

# 参考
[apitrace](https://apitrace.github.io/)
[apitraceを使ってみる(まだよくわかっていない) - Qiita](http://qiita.com/satoruhiga/items/f3162d376b1f61e54328)
PGAdminでExportされたCSVファイルの文字化け、macからの対処方法

※もっと良い解決方法があるかもしれませんが、対応方法を説明しておきます。

##**概要**
PGAdminのクエリー結果をCSVのファイルでExportしてExcelで開いたら
日本語の文字が**文字化け**される。

##**原因**
・PGAdmin3で出力するとき、 文字コードがUTF-8で出力する
・Excelは開くとき、文字コードがShift-JISで開こうとする
　▶︎　結果文字コードが違うので文字が化が起こってしまう。

####**ということで、文字コードをShift-JISに変換してあげれば良いのですが、Macで文字コード変換ができるエディタが無いかチームに聞いてみました。**

「テキストエディッタ」には保存するタイミングで文字コードを変換する設定が
ありますがcsvファイルの場合、保存するときの拡張子選択項目にtxtがありませんでした。

![image](https://qiita-image-store.s3.amazonaws.com/0/108364/19ca4224-5086-ead7-f882-ebd7f5e4f49b.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/108364/2b4d4c00-8e41-9ed3-9cff-77867081d820.png)

ということで、チームの素敵な先輩たちに聞いてみました。
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/51b65756-16f1-7689-107b-dfbb9b7a0b40.png)

ということで、ご参考してください。
ログインシェルは bash のまま fish を利用する


## 背景

いちいち設定しなくても色々うまいことやってくれるということで、zsh から [fish](http://qiita.com/tags/fish) に乗り換えて快適なシェル環境で満足していたところ、当該マシンへの rsync でエラーに遭遇しました。

```bash
> rsync -av -e ssh src remote-host:dst
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(174) [sender=3.1.0]
```

この問題はログインシェルを一時的に bash に戻すことで解決できました。

ですが、rsync に限らず、何らかの形でシェルに依存しているプログラムは、そのシェルが POSIX 互換であることを前提としています。fish は POSIX 非互換なので、いつまた同じような問題に遭遇するかわかりません。


## 解決策

ログインシェルは bash のままで、インタラクティブシェルのときだけ `exec fish` することで、普段使いのシェルには fish を利用できます。`.bashrc` の冒頭に以下の `case` ブロックを足すだけです。

```bash
# If not running interactively, don't do anything
case $- in
    *i*) exec fish;;
      *) return;;
esac
```

## 条件分岐は必要？

これで問題は解決しました。
ですが、ここまで読んできて気付いた人もいるかと思います。

そもそも、なぜ `.bashrc` で条件分岐が必要なのでしょうか。`sudo` はじめ bash を非インタラクティブモードで起動する場合は `.bashrc` がロードされることはありません。シンプルに `.bashrc` でいきなり `exec fish` でいいように思います。

```bash
$ head -n1 .bashrc
echo "I am .bashrc"
$ bash -c 'echo hello'
hello
```

実際に試してみても `.bashrc` はロードされていないことが確認できます。


## ssh 時の bash 不思議仕様

ところが  ssh に限っては、`ssh <remote-host> <command>` の形式で非インタラクティブに実行しても `.bashrc` がロードされるという不思議仕様となっています。

確認してみましょう。

```bash
$ ssh localhost 'echo $-'
hBc
```

`-` 変数の値を確認すると、ssh でコマンドを実行した場合は確かに非インタラクティブモードになっています。では、先ほど設定した `.bashrc` の冒頭でメッセージを出力する状態で ssh を実行してみましょう。

```bash
$ ssh localhost 'echo $-'
I am .bashrc
hBc
```

確かに `.bashrc` がロードされていることが確認できました。

ssh で非インタラクティブにコマンドを実行するときに限り bash は特別に `.bashrc` をロードするようになっています。このあたりの挙動については、[bash の設定ファイル読み込み仕様](http://d.hatena.ne.jp/flying-foozy/20140130/1391096196)が詳しいので参照してみてください。
nvarcharの項目にvarcharでの長さで制限かける

システム連携とかやっているとこんな状況があるかと思います。
1. テーブル設計をしている際、「文字列はnvarchar型で！」
2. 項目Aは別システムと連携する項目。連携先と同じ長さに。
3. 連携先の項目Aの型はvarchar型。
4. nvarchar型とvarchar型では、長さの数え方が違うから全角が混在したデータが入った場合、桁あふれ！？

というわけでこれの対応策。
CHECK制約を利用することで、nvarchar型でありながら、varchar型の文字数しか入らないようにDB側で制限かけるが可能です。

例：nvarchar(7)にて、varchar(7)で入る分しかいれないようにする。

```sql:CheckLengthVarchar.sql
ALTER TABLE [TABLE_AA] --テーブル名
 ADD CONSTRAINT [CK_TABLE_AA] --Check制約名
  CHECK (
    DATALENGTH( CONVERT(varchar(8), [TABLE_ID])) <= 7 --varchar型に変換し長さを比較
/* varcharはデフォルトで30桁になるので、必ず長さを記述する。
   その際は、制限したい長さよりも大きくすること */
  );
```

- 定義が少々複雑になる。
- Insert/Update時の性能が落ちる。

CHECK制約をつけることになるため、上記のデメリットもありますので、それを了承したうえで使用しましょう。
FuelPHP1.8でredisにコマンド発行すると時々無限ループする件

# FuelPHP1.8でredisにコマンド発行すると時々無限ループする件

## 起きる条件

* oilで作ったタスクをデーモン化して常時起動させている場合
* redisとの接続が常時接続である場合

上記条件のときにredisの接続しているソケット接続が何らかの原因によって閉じられた場合に、fwriteの戻り値$fwriteに０が返り無限ループになります

```:fuel/core/classes/redis/db.php
	public function execute()
	{
		// open a Redis connection and execute the queued commands
		foreach ($this->queue as $command)
		{
			for ($written = 0; $written < strlen($command); $written += $fwrite)
			{
				$fwrite = fwrite($this->connection, substr($command, $written));
				if ($fwrite === false )
				{
					throw new \RedisException('Failed to write entire command to stream');
				}
			}
		}
```

※ このコードは昔からある(1.3から存在)みたいで、おそらく通常のmod_phpからの実行ではmax_execution_timeで強制終了されるのでそれほど問題無いのだとおもいます。

## ログ

以下のログが永遠に出ます。

```
fwrite(): send of 58 bytes failed with errno=32 Broken pipe in fuel/core/classes/redis/db.php on line 148
```

## 修正箇所

```
	public function execute()
	{
		// open a Redis connection and execute the queued commands
		foreach ($this->queue as $command)
		{
			for ($written = 0; $written < strlen($command); $written += $fwrite)
			{
				$fwrite = fwrite($this->connection, substr($command, $written));
				if ($fwrite === false || $fwrite <= 0)
				{
					throw new \RedisException('Failed to write entire command to stream');
				}
			}
		}
```

https://github.com/fuel/core/pull/2024/commits/15dc2b1a9a30ab551779cb14efd84fcafc6c16d3

1.9の開発リポジトリにパッチ送って取り込んでもらえたので次期バージョンでは直ると思います。
[PHP]薄くて簡単なORMを導入する場合、おすすめライブラリー「Idiorm」

##**概要**
新たなシステム及び既存のシステムで
フレームワークではなく、薄いORMだけを適用する場合、
薄くて簡単な「Idiorm」というライブラリー をおすすめします。

##**メリット**
　① : 使いやすい
　② : いろんなQuery道具のメソッド提供
　③ : minimalistのORMなので速度に安心
　④ : Parisを使ったらActiverecordの形式で接近可能
　などなど

##**使い方法**

① 設置

```json:composer.json
"require": {
    "j4mie/idiorm": "1.5.1"
}
```

② ライブラリーをrequire & DB連動及び運用設定

```php:idiorm_test.php
require_once './vendor/autoload.php';

# データベース連携設定
ORM::configure('mysql:host='.parent::HOSTNAME.';dbname='.parent::DBNAME);
ORM::configure('username', parent::USERNAME);
ORM::configure('password', parent::PASSWORD);

# ターミナルに日本語が正しく出力されるように設定
ORM::configure('driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
```
④ PDO使う
ORMから提供しているメソッドたちを利用して面白くクエリーしてくれます。
ドキュメントに説明がよくされているので、ご参照してください。
🔗http://idiorm.readthedocs.org/en/latest/index.html

##**参考LINK**
・github
🔗https://github.com/j4mie/idiorm

・公式サイトの例
🔗http://j4mie.github.io/idiormandparis/

・ドキュメント
🔗http://idiorm.readthedocs.org/en/latest/index.html
似たようなAndroidアプリを同一端末にインストール出来るようにする


![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/0/25250/940799a1-e350-d6bb-bca7-b4f6e03165f2.png "名称未設定.png")

## :pencil2: 追記

Android Studio 3からの設定方法を反映させました。

## 🔰 はじめに

機能はほぼ同じで、向き先のURLが違ったりするapkを作りたいと思います。
Android（Studio）の対応が分からなかったので今回調べてみました🤔

## 🖥 環境

- Android Studio 2.1.3
- Kotlin 1.0.1-2
- Gradle 2.14.1

## 🛠 設定

対応方法としては、Flavorの機能を利用してpackageNameを変更するという方針をとっていきます。

### productFlavorsの設定

```app/build.gradle
android{
    productFlavors {
        www {

        }
        dev {
            applicationIdSuffix = '.dev'
        }
        stg {
            applicationIdSuffix = '.stg'
        }
    }
}
```

---

追記ここから :arrow_down_small: 

### Android Studio 3から

```app/build.gradle
android{

    flavorDimensions "Production", "staging", "develop"
	
    productFlavors {
        www {
		     dimension "Production"
        }
        dev {
            applicationIdSuffix = '.dev'
            dimension "staging"
        }
        stg {
            applicationIdSuffix = '.stg'
            dimension "develop"
        }
    }
}
```
バージョン３からは、すべてのフレーバが名前付きフレーバディメンションに属している必要があります。 
そうしないと、ビルドエラーが発生します。

追記ここまで :arrow_up_small: 

--- 


例えばこんな感じに設定します。

あとはFlavor毎にアプリの表示名を明示的に変更してあげればいいと思います。

```serc/dev/res/string.xml
<resources>
    <string name="app_name">[dev]application</string>
</resources>
```

ビルドをするときは ```build Valiants``` で切り替えてあげればOKです。
```build Valiants``` はIDEの左下にあって目立たないですね😰

## 🔗 Refs

- [Android StudioのBuild Type／Flavor - Intelligent Technology's Technical Blog](http://iti.hatenablog.jp/entry/2015/06/22/084303)
- [gradle？ナニそれ美味しいの？ -gradleを知らなくても出来るAndroidStudioで簡単ビルド構成- - Qiita](http://qiita.com/teao26/items/44138c0d8dca46bb84e5)
- [Build Variants によって別バージョンの Android アプリを同じプロジェクトからビルドする (Gradle 使用) - ひだまりソケットは壊れない](http://vividcode.hatenablog.com/entry/android-app/build-variants)
- [buildType/productFlavorsでアプリ名を分ける方法](http://qiita.com/le_skamba/items/a95fc0ef12239a165dc7)
- [Android StudioでProduct Flavorを使う](http://qiita.com/hisanaka/items/595266a5d43eea8883a6)
- [【Android】僕の考えた最強で平凡なbuild.gradle](https://wasabeef.jp/android-gradle/)
- [Android Studio でお手軽パッケージ名変更 - Qiita](http://qiita.com/makietan/items/5da377d3b8ec71048f02)
[ssh]ポートフォワーディング

##**概要**
多くのITの従事者たちは会社のセキュリティのために特定のサーバにポットを
もっぱらSSHとサービスのためのポルトマンを開いておいた場合が多いです。
ところでサーバーを管理してみると特定サービスチェックのため、マネージング・サービスに
アクセスをしなければならない場合が発生します。 
この場合、社内セキュリティチームにマネージング・サービスへの
アクセスのためにポートを開放してくれることを要求するのができますが、
こんな時にSSHのポートフォワーディング(Port Forwarding)を利用すれば、
簡単に解決するのができます。

##**実習**

####**環境**

・VirtualBoxでか仮想サーバに接続するPCがある
・仮想サーバ(CentOS)がある
・仮想サーバの中でPostgreSQLのサービスがある(port:5432)

####**方法**
1.`~$ ssh -L 8081:localhost:5432 root@10.?.?.?`
2.pgAdminとかのDBMSに以下の情報で接続してみる
ホスト：10.?.?.?
ポート：8081
![image](https://qiita-image-store.s3.amazonaws.com/0/108364/6f03c62e-b6b7-9f1e-52b4-e13866ed4ae3.png)

※8081の部分は未使用のポートであれば自由に設定できます
※SSHの接続が切れると、ポートフォワーディングしたサービスとの接続も切れます
住所と緯度経度の対応表

## 動機
住所から緯度経度を出すAPIは存在しますが、何度もAPIを叩くよりはスタンドアロンで組み込んでしまいたい時に、住所と緯度経度の対応表があると便利です。

そこで、日本郵政のWebサイトからスクレイピングして対応表を作りました。

名前の揺れなどある場合のマッチングとしては[編集距離](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%BC%E3%83%99%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E8%B7%9D%E9%9B%A2)を使えば良いかと思います。

## ダウンロード
[こちら](https://drive.google.com/file/d/0B-J_zu-0qXhBWVVTdHhXTlQ5ems/view?usp=sharing) からダウンロードできます（zipで約4MB）。 ご自由にお使いください。

## データ形式
yubin_jusho.zip というファイルをzip展開するとTSV形式ファイル（yubin_jusho.tsv）があり、以下の形式で並んでいます。

都道府県市区町村名[TAB]町名以下地名[TAB]緯度[TAB]経度[改行]

```
$ head yubin_jusho.tsv
北海道上川郡愛別町	愛山	43.85138888	142.69883888
北海道上川郡愛別町	愛別	43.89240277	142.58649721
北海道上川郡愛別町	旭山	43.95829166	142.71089166
北海道上川郡愛別町	金富	43.89784721	142.54726388
北海道上川郡愛別町	北町	43.90838055	142.5783861
北海道上川郡愛別町	協和	43.94636944	142.60218888
北海道上川郡愛別町	厚生	43.915375	142.57301388
北海道上川郡愛別町	中央	43.89594444	142.64852777
北海道上川郡愛別町	徳星	43.98964999	142.66410833
北海道上川郡愛別町	豊里	43.9049	142.63143332
```

```
$ tail yubin_jusho.tsv
沖縄県中頭郡読谷村	渡具知	26.36156944	127.74467221
沖縄県中頭郡読谷村	渡慶次	26.41491388	127.72868888
沖縄県中頭郡読谷村	都屋	26.38748888	127.72795277
沖縄県中頭郡読谷村	長田	26.38397777	127.77109721
沖縄県中頭郡読谷村	長浜	26.40941666	127.73346666
沖縄県中頭郡読谷村	波平	26.400675	127.73294999
沖縄県中頭郡読谷村	比謝	26.37123054	127.75553333
沖縄県中頭郡読谷村	比謝矼	26.36799443	127.75701388
沖縄県中頭郡読谷村	古堅	26.36357777	127.75205555
沖縄県中頭郡読谷村	牧原	26.36753054	127.76240833
```
colorboxで画面サイズに合わせて高さを指定

jquery.colorbox.jsでモーダルウィンドウの高さを100%に指定するオプションの書き方が
ググっても見つからなかったのでメモ。

#コード

```javascript:jQuery
$(".iframe").colorbox({
    open:true,
    iframe:true,
    innerWidth: 1000,//ColorBoxの幅
    innerHeight: 3300,//ColorBoxの高さ
    maxWidth:"100%",
    maxHeight:"100%"
  });
```

innerとmaxの両方を指定しないと自分の場合ダメでした。
これでモーダルウィンドウの高さが100%になって、右端にスクロールバーがでました。
Angular Loading Barでdisabledにしてボタンとかを押せなくさせる方法

# Angular Loading Barでdisabledにしてボタンとかを押せなくさせる方法

```javascript:xxx.js
angular.module('myApp', ['angular-loading-bar']);
```

```css:xxx.css
#loading-bar {
  width: 100%;
  height: 100%;
  position: fixed;
  z-index: 99999;
  top: 0px;
  left: 0px;
  pointer-events: all;
  border: none;
  margin: 0px;
  padding: 0px;
  cursor: wait;
  background: rgba(0, 0, 0, 0.7);
}
```

リファレンス通りなんだけど
https://github.com/chieffancypants/angular-loading-bar/blob/master/README.md
さくらのレンタルサーバー＋concrete5で常時SSL接続＆URL正規化を行う方法

## 前提と目標
- concrete5 5.7.5.9（検証用にElementalをインストール）
- さくらのレンタルサーバー　スタンダードプラン
- ラピッドSSL（SNI SSL）
- .htaccessは「使わないドメイン」の方だけに設定
- 使いたいURLを https://example.com として説明しています。  

- 下記全てのリダイレクトを行いURL正規化を目標とします。
    http://example.com/ → https://example.com/
    http://www.example.com/ → https://example.com/
    https://www.example.com/ → https://example.com/

## さくら コントロールパネル ドメイン設定
### ドメイン登録
* 「example.com」と「www.example.com」を別々のドメインとして設定します。
両方とも**「wwwを付与せずマルチドメインとして使用する（上級者向け）」**の設定にします。

* フォルダもそれぞれ別の物を指定します。

### SSL証明書の登録とSSL設定

1. まずはexample.comにSSL証明書を登録します。
    [参照：【ラピッドSSL】サーバコントロールパネルからの申込み・導入手順](https://help.sakura.ad.jp/hc/ja/articles/206056822--%E3%83%A9%E3%83%94%E3%83%83%E3%83%89SSL-%E3%82%B5%E3%83%BC%E3%83%90%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%91%E3%83%8D%E3%83%AB%E3%81%8B%E3%82%89%E3%81%AE%E7%94%B3%E8%BE%BC%E3%81%BF-%E5%B0%8E%E5%85%A5%E6%89%8B%E9%A0%86)
2. example.comの「SSL証明書＞更新」から**「秘密鍵のバックアップ」**をクリックして秘密鍵をダウンロードします。
3. 会員メニュー＞契約情報 から**「サーバー証明書」**をダウンロードします
4. もう片方のドメイン（例：www.example.com）に上記**「秘密鍵のバックアップ」「サーバー証明書」**を使ってSSL証明書を登録します。
*www.example.comにSSL証明書を登録する際、「秘密鍵のアップロード」が画面に出てこない場合（既に登録されたCSRキーが表示される場合）は、「秘密鍵を含む全設定の削除」をクリックして一度設定をクリアしてください*

5. 両方のドメイン設定を**「SNI SSLを利用する」**に変更します。

## concrete5の設定
### concrete5のインストール
example.comで指定したフォルダにconcrete5をインストールします。
[concrete5：ホスティング会社別インストールガイド](http://concrete5-japan.org/help/5-7/developer/installation/hosting/sakura/)
### リダイレクト設定
[SSL Redirect Configuration](https://www.concrete5.org/marketplace/addons/ssl-redirect-configuration)をインストールします。
　　URLルール（パス）に「*」を設定します。

### プリティーURL
「管理画面＞システムと設定＞URLとリダイレクト」でプリティーURLを設定します。
「URLからindex.phpを除く」にチェックを入れて「保存」をクリックすると自動的に.htaccessファイルがサーバー上に生成されます。

### ヘッダー情報変更
**application/bootstrap/app.php**へ下記を追記します。

```php:app.php
 $request = Request::getInstance();
  if ($request->headers->has('X-Sakura-Forwarded-For')) {
      $request->server->set('HTTPS', 'on');
  } 
```

### カノニカルURL設定変更
下記内容で **application/config/** に **concrete.php**というファイルを作成します。
※通常canonical_url は　http://~ ですが、今回は **https://~** に設定します。

``` php:concrete.php
<?php
return array(
    'seo' => array(
        'canonical_url' => 'https://example.com/',
        'canonical_ssl_url' => 'https://example.com/',
    ),
); 
```

[参照：サクラインターネットで concrete5 を常時 SSL にするための方法](https://gist.github.com/katzueno/38eeecb606c7ea5661953cd6368ef972)

### 301リダイレクト設置
www.example.com のフォルダに下記内容で**.htaccess**ファイルを作成し、301リダイレクトを設定します。

```.htacess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
</IfModule>
```
  
以上となります。
お疲れさまでした！
https://www.example.com を有効とする事も可能です。
その場合は example.comとwww.example.comを読み替えて設定してください。

2016.11.22追記
秘密鍵のアップロードが出来ない場合について補足しました。
Adobe XDのUserVoiceからピックアップ(2016年9月)

個人的に気になるUserVoiceをざっくりまとめ。
Photoshop PSD書き出しなどのように世にでるまでは応援したいものは毎回、現在の人気を選んで紹介しています。

* [7月のピックアップ](http://qiita.com/risay/items/a6548e07e8502e2011e1)
* [8月のピックアップ](http://qiita.com/risay/items/c003be0bf97cf6fd9ed3)

# 組織票したいオススメ要望
## [PSD書き出し](https://adobexd.uservoice.com/forums/353007-adobe-xd-feature-requests/suggestions/12928719-psd-export-and-multiple-formats-using-extract)
国内で受託仕事するならばまず必須要件じゃないかと思ってます。組織票お願いします！

## [共有中のプロトタイプにコメント＆注目点つける機能ほしい](https://adobexd.uservoice.com/forums/353007/suggestions/12928284-commenting-and-annotations-on-shared-prototype)
現況はやはり開発中。プロトタイピング機能でライバル視されるInVisionやProttにはあるので使う側もほしい、提供側も提供したいという感じ？英語ですが[アンケート](https://adobe.typeform.com/to/WYUMXA)も行われています。ただ、アンケートは1月前にスタートしているのでもうある程度集計されてしまっているかも。

# 開発がアクティブらしい要望
これはベータ募集のときにこんなの先行してつかえるかもよ？と書いてある機能。TwitterやFacebookでも人気のある要望はこちらに回りやすい印象。実際、レイヤーとシンボルはTwitterを利用したアンケートに1位と2位だったり。

* [Windows版を熱烈に期待](https://adobexd.uservoice.com/forums/353007-adobe-xd-feature-requests/suggestions/14130957-windows-version-of-adobe-xd) 
今年内にというのは相変わらず変わってないようです。日本語版製品ページの一番下の右側のリンクから事前登録ができます。[タッチとInkに対応したWindows10 UWPでの提供が予定](https://blogs.adobe.com/creativecloud/adobe-xd-windows-update/)されています。Windowsユーザは社内の根回しを忘れずにー。

* [レイヤーパネル](https://adobexd.uservoice.com/forums/353007-adobe-xd-feature-requests/suggestions/12924597-layers-panel)

* [再利用可能なシンボルやマスターオブジェクト](https://adobexd.uservoice.com/forums/353007-adobe-xd-feature-requests/suggestions/12931467-reusable-symbols-master-objects)

プレリリースには毎月50人ずつ招待しているそうなので[興味のある方はアンケートに答えて](https://twitter.com/demianborba/status/778474311484973056)みては。

# デザインビュー
* [ラベルテキストの長さに合わせたボタンサイズの変更ができるようなボタンツール](https://adobexd.uservoice.com/forums/353007/suggestions/13571298)

# プロトタイプビュー
* [グローバル/マスターテンプレート](https://adobexd.uservoice.com/forums/353007-adobe-xd-feature-requests/suggestions/12922758-global-master-artboard-templates-pin-objects-acro)
* [インタラクティブなフォーム要素](https://adobexd.uservoice.com/forums/353007/suggestions/13833198) ラジオボタンのオン/オフなど

# その他
* [各種メジャーとスタイルガイド書き出し](https://adobexd.uservoice.com/forums/353007-adobe-xd-feature-requests/suggestions/12951915-generate-specs-measurements-style-guide-for-de)  
[メジャー単体の要望](https://adobexd.uservoice.com/forums/353007-adobe-xd-feature-requests/suggestions/15061407-export-measurements-for-developers)はすでにあるのでそちらもVoteすると良さそう
* [サードパーティ製プラグイン](https://adobexd.uservoice.com/forums/353007-adobe-xd-feature-requests/suggestions/12945705-allow-adobe-xd-to-have-third-party-plugins)  
先日とあるUI/UX系の勉強会でAdobeはこんなことやらないから(ry と言われていたものですが、以前から要望も多くFBでも拡張のためのフレームワーク作ってますよ−とコメント出てたので確実に来るかと。期待してる方はぜひ、voteを！
kintone 市区町村の選択

#市区町村の選択方法

kintone の標準機能では、都道府県から市区町村を絞り込むような選択方法がありません。
プラグインとカスタマイズでのアプリ作成例をご紹介します。

- [ルックアップ選択条件プラグイン](http://qiita.com/rex0220/items/6d40f02069e2d386f336)による市区町村選択
- google map 上で、市区町村を選択


#ルックアップ選択条件プラグインによる市区町村選択
市区町村アプリを用意して、ルックアップ機能とルックアップ選択条件プラグインを使った例です。
ルックアップを使っていますので、ユニークキーとしてエリア番号を使っています。

- 都道府県を選択して、市区町村アプリのルックアップを取得

![市区町村検索1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/84ca83ef-fb44-38d0-7e95-a86e89595899.png)


- ルックアップ選択条件プラグインで、指定された市区町村が表示されますので、選択します。

![市区町村検索2.png](https://qiita-image-store.s3.amazonaws.com/0/100572/760778c4-362f-533e-9057-dadf45548380.png)

選択した市区町村が表示されます。

![市区町村検索3.png](https://qiita-image-store.s3.amazonaws.com/0/100572/d7a486aa-30ef-2e29-df1e-057695ffb20f.png)


#google map 上で、市区町村を選択

- 市区町村をポリゴンで表示
- ポリゴンのclickイベントで、選択・非選択を制御

google map を表示して、エリアをクリックして市区町村を選択することもカスタマイズで可能です。

![市区町村マップ1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/65bc6fd7-fa61-06c8-5a6e-e12b0543ac25.png)

- マップ上で市区町村を選択して、選択したエリア内の施設を検索する例

![市区町村マップ2.png](https://qiita-image-store.s3.amazonaws.com/0/100572/723e6612-c737-7c57-8547-82a5ac897315.png)
EC2(AmazonLinux)起動時にgoofysでaws configureせずS3をマウントする

# EC2(AmazonLinux)起動時にgoofysでaws configureせずS3をマウントする
goofysでS3をマウントする際にaws configureしている投稿が多くあるが、EC2インスタンスに紐付けられたロールを使用してS3をマウントしたい。
前提としてS3には特定のアカウントのみオブジェクトへのアクセスを許可している。

goofysのインストール等についてはこちらが詳しい
http://qiita.com/kooohei/items/a14f22cb0381342d1861


諸事情により再作成しました。
ストック・コメントいただいていた方申し訳ありません。

## /etc/rc.localに記述する。
結論からしたらrc.localに設定すれば良いが、これではrootからしか見えない
<pre>
/path/to/goofys/goofys --region ap-northeast-1 test-bucket /path/to/mount
</pre>
allow_otherをつけて他のユーザからも見えるようにしたが、これではマウントされていなかった。
<pre>
/path/to/goofys/goofys --region ap-northeast-1 -o allow_other test-bucket /path/to/mount
</pre>
直接コマンドを叩いたところ下記のエラーが出た
<pre>
$ /path/to/goofys/goofys --region ap-northeast-1 -o allow_other test-bucket /path/to/mount
2016/09/29 16:41:36.507801 main.FATAL Mounting file system: Mount: mount: running fusermount: exit status 1
stderr:
fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf
</pre>
/etc/fuse.confにuser_allow_otherを記述しろとのことなのでコメントアウトを解除
<pre>
\# diff fuse.conf fuse.conf.20160929
2c2
< user_allow_other
\-\-\-
\> # user_allow_other
</pre>
reboot後dfコマンドで確認したところ無事マウントされていた。

## /etc/fstabに記述する
こちらはうまくいかなかった
マウント自体は成功したのだが、EC2に設定されたロールがうまくS3に伝わっていないようで、lsコマンドは打てるが、catコマンドでファイルの中を見ても権限エラーで表示されなかった。
<pre>
\# diff /etc/fstab /etc/fstab.20160928
7d6
< /home/ec2-user/go/bin/goofys#bucketname /path/to/mnt fuse _netdev,allow_other    0       0
</pre>
<pre>
$ cat /path/to/file/test.txt
/path/to/file/test.txt: 許可がありません
</pre>
_netdevオプションを付与しているため、ネットワークの設定後にマウント処理が行われるはず。
ネットワークの設定後にロールの設定が行われ、その後rc.localが読み込まれている？
Error: Could not insert new action connection が出てstory boardと ViewController.swift間でUIの結合できなくなった

Tap Gesture RecognizerをUIからcontrol + ViewController.swifでコネクトできない

謎のエラー


```sh 
'Could not insert new action connection: Could not find any information for the class and not showing any class named "yourClassName"'

```


調べてみるとクラスの情報がないということだったのでまず疑ったのは

 ```
Main story board 
``` 

の 

```custom Class ```

で結合させたい 

```

ViewController.swif

```

が設定されてるか。


![スクリーンショット 2016-09-30 12.37.10.png](https://qiita-image-store.s3.amazonaws.com/0/135794/5b1cacb5-e7fc-7d37-3957-e99aba9c8bdd.png)






されている。次、二つ目に実施したことはxcodeの再起動、やってみるも効果なし。絶望的な状況に陥った。

しかしこの記事が私を救ってくれた

http://qiita.com/nagahori/items/71c1940319d35fa886f5


```sh 

$ rm -rf ~/Library/Caches/com.apple.dt.Xcode

```

```sh 
$ defaults delete com.apple.dt.Xcode IDEIndexDisable  
```

```sh 
$ defaults write com.apple.dt.Xcode IDEIndexEnable 1

```

をすると治るらしいがちょっと待て待て。

```sh

'rm -rf'

```

なんてやりたくない。

やりたくないし、軽く流し目で一知半解だったにで一旦このサイトから離脱した。

しかし、他のサイトにも同じようなことが書いてあってどうやらこのコマンドで行けるらしい。

```shell-session
/Library/Caches/
```

ライブラリ？のキャッシュ？の？？中でどういう動きをして得るのかよくわかってない。

とにかくこのコマンドはキャッシュを消してなんとか治してくれるみたい


まずは

```shell-session

~/Library/Caches/com.apple.dt.Xcode

```

だけコマンド打って確認してみた。やはりいろいろあった。消してもいいのかな。こええ。まあ、いいや。消しちまえ

恐る恐る　

```sh

$ rm -rf ~/Library/Caches/com.apple.dt.Xcode 
$ defaults delete com.apple.dt.Xcode IDEIndexDisable  
$ defaults write com.apple.dt.Xcode IDEIndexEnable 1

```

実行、治った！！
JavaScript周りの技術についてのメモ


今年に入ってから触ったJS周りの技術について超簡単にまとめる。

#ライブラリ

##jQuery

- 簡単なコードでJSを実行できるライブラリ
- 基本なんでもできる（ような気がする）

###問題点

自由度高すぎてめちゃくちゃなコードになりやすい。
（意図しないイベント発火、DOMが消えたっきりでてこない、エラー大量）

###解決策

- Webpackを使ってファイルを分割する
- 関数を上手に作れるようになる

#フレームワーク

##Angular JS

- Google謹製のフレームワーク
- 誰が書いても似たようなコードになる（らしい）
- 管理画面・SPAを作るときに良い（らしい）
- 学習コストがかかる

##Vue.js

- AngularJSのように双方向データバインディングに特化したフレームワーク
- AngularJSよりとっつきやすい

#用語

##Ajax

非同期通信を利用してデータを取得したり、動的にWebページの内容を書き換える技術。

###メリット

- 足りないところだけデータを取りに行くので早い
- リクエスト中もページ操作が可能

###デメリット

- 目で見えないところなので、開発ツールを上手く使うことが必須
- 原則、クロスオリジン制約がある

####解決策

- phpなどのサーバーサイド言語でAPIを実装
- JSONなどのファイルを設置
- クロスオリジン制約のないAPIを使う

##SPA（シングルページアプリケーション）

HTML全体を書き換えるのではなく、変更が必要な部分だけJSで動的に書き換えていくようなWebアプリケーションのつくり。

##双方向データバインディング

モデルが変わったときにビューも自動的に変わるし逆もしかり、みたいな仕組み。
ruby instance_eval vs instance_exec

```rb
def lala(a)
  puts a
end

instance_eval("gaga") {|b| lala b } rescue puts "raise error"
instance_exec("gaga") {|b| lala b }
```

```rb
instance_exec do
  puts "lalalala"
end

instance_exec "puts 'lalalala'" rescue puts "raise error"

instance_eval do
  puts "lalalala"
end

instance_eval "puts 'lalalalala'"
```
Linuxのdateコマンドで日付変更

* コマンド
  
```
date MMDDhhmm[CC][YY][.ss]

MM（月）
DD（日）
ｈｈ（時）
mm（分）
CC（年、西暦の上 2桁）
YY（年、西暦の上 2桁）
.ss（秒）
```

```
[vagrant@localhost ~]$ date
2016年  9月 30日 金曜日 05:38:04 CEST
[vagrant@localhost ~]$ sudo date 10011500
2016年 10月  1日 土曜日 15:00:00 CEST
[vagrant@localhost ~]$ date
2016年 10月  1日 土曜日 15:00:03 CEST 
```

* vagrantで構築した環境の場合、ホストOSの時刻にすぐ同期されるので解除しておく
  * 
  ```
  sudo service vboxadd-service stop
  ```
* 同期を再開する場合はstopをstartに変更すれば再開される
  *  
  ```
  sudo service vboxadd-service start
  ```
Unity IAP実装方法まとめ

# はじめに

Unity IAP を使った課金処理の実装を行うことになった人向けて
課金処理の仕組みを理解していない状態から課金処理の仕組みを理解し、実装に至るまでの手順を残しておきます。

# 実装までの手順
1. まずUnity IAPの仕組みについて理解する
2. デモ用に実装された`Purchaser.cs`のスクリプトを利用，拡張して実装する

# この記事を通じてできるようになること
- Unity IAPを使ったローカル環境での課金処理の実装
- Unity IAPを使ったクライアント端末でのレシート検証 
- サーバでのレシート検証の導入概要（Python)

## 1. 公式ドキュメントの手順に従う
[Unity - マニュアル: Unity IAPセットアップ](https://docs.unity3d.com/ja/current/Manual/UnityIAPSettingUp.html)
IAPのテスト 項目は，テストアカウントが作成済みなら飛ばす

## 2. 公式ドキュメントのクロスプラットフォームの章を読む 
[Unity - マニュアル: Unity IAP クロスプラットフォーム](https://docs.unity3d.com/ja/current/Manual/UnityIAPDefiningProducts.html)

ここで課金処理を実装するために、知識として知っておくべきことをまとめると

* 課金処理を行いたいSceneで、`IStoreListener`を実装したクラスのスクリプトをオブジェクトにアタッチし配置する
* 上記のオブジェクトのが配置されたSceneに遷移すると`IStoreListener.OnInitialized`が呼ばれる
* `IStoreListener`は下記を実装する必要がある
  * `OnInitialized`
  * `OnInitializeFailed` 
  * `PurchaseProcessingResult`
  * `OnPurchaseFailed`
* `ConfigurationBuilder`を利用して、Google Developer Console または iTunes Connectで登録した課金アイテムのプロダクトIDをUnity IAPに認識させる

（※ 複数の課金アイテムがある場合は，複数認識させるためのスクリプトを自前で組む必要がある）

* サーバでレシート検証を行う場合は，ローカルでの課金アイテム購入時に`ProcessPurchase`で`Pending`を返し，サーバでのレシート検証後に`ConfirmPendingPurchase` を呼び出す．

* ローカルでもレシートチェックができる

## 3. 公式ドキュメントのレシート検証の章を読んでおく
レシート情報をサーバサイドで検証をするために必須知識なので目を通しておく
[Unity - マニュアル: Unity IAP 購入レシート](https://docs.unity3d.com/ja/current/Manual/UnityIAPPurchaseReceipts.html)

## 4. Unite2016Tokyoの資料を参考に実装をする
[Unity IAP の使い方 - SlideShare](http://www.slideshare.net/MakotoIto2/unity-in-app-purchase-iap)
[Unite2016TokyoWS01 - Github](https://github.com/unity3d-jp/Unite2016TokyoWS01)
このGithubリポジトリの中の [Purchaser.cs](https://github.com/unity3d-jp/Unite2016TokyoWS01/blob/master/Assets/Example/Scripts/Workshop/Purchaser.cs) が実装する上で非常に参考になったので，1, 2で得た知識を元にソースコードを**熟読**する．

## 5. サーバでのレシート検証
[Android編]
[Androidのアイテム課金でレシート検証をサーバ側で行う](http://qiita.com/yukatou/items/1809853f9af97288ac9a)
[GolangでGooglePlayの課金レシートの署名検証](http://christina04.hatenablog.com/entry/2016/04/01/111457)
AndroidでのUnity IAPの購入レシート内のjsonには
`json`と`signature`の2つキーがGoogle Playから送られてきたレシートデータになる．
Google Developer Console内に定義されている公開鍵とsignatureの検証 = レシートの検証になる．

Pythonでは`M2Crypto`を使いました．

[iOS編]
`receipt-data`をキー，レシートデータ（Unity IAPならpayloadキーで取れる値)をバリューにして以下のURLにPOST
https://buy.itunes.apple.com/verifyReceipt
レスポンスが21007ならサンドボックス用のURLにもう一回送って検証
https://sandbox.itunes.apple.com/verifyReceipt

Pythonでは`urllib2`を使いました．


## 参考文献
[Unity IAPを使ってて思ったこと](http://qiita.com/Mr_Y/items/4cc947bdb0d42d9ed65a)



Unity2016Tokyoのカンファレンス関係者の方々にこの場を借りて感謝致します．
es2015のclassでmixinしてみる

## JSでclassかけるのいいですよね

```js
class Person {
  constructor(name) {
    this.name = name;
  }
}
```

簡潔に書けるようになってホントに良かった進化は素晴らしい
継承も楽だし

## mixinしたくなってきた

railsのconcern的なことしたいなぁと思ったのでやってみました。

こちらの記事で文法を拡張する感じのことやっててすげぇ！ってなったんだけど実用はキツイかなと思った
[JavaScriptのES2015クラスでmixinを実装する世界一美しい方法](http://qiita.com/gaogao_9/items/97eab8808b4304fa2073)

調べたところシンプルに `Object.assign` 使えばできました。

```js
const Walkable = {
  walk() {
    console.log(`${this.name}は歩いているよ`);
  }
}

class Person {
  constructor(name) {
    this.name = name;
    Object.assign(this, Walkable);
  }
}

const person = new Person("ほげほげ");
person.walk(); // => ほげほげは歩いているよ
```

ちなみに `Object.assign` は少し前のSafariで実装されてなかったりするのでlodashを使えば安全です。
AmazonLinuxに作った環境をそのままRHEL7に移植しようとしたらハマったよ


テスト環境は`AmazonLinux`で本番環境は`RHEL7`のときにテスト環境で[やったこと](http://qiita.com/master-of-sugar/items/dc1fec7790f0fc90779b)をそのままやろうとしたらうまくいかなかったのでメモ。
[これ](http://qiita.com/master-of-sugar/items/dc1fec7790f0fc90779b)の差分のみかいていきます。


SELinuxを無効にする
-----

PHP-FPMでパーミッションエラーになるので必ずやる。

```SELinuxの確認
getenforce
```

`Enforcing`となったら有効状態なので以下をやる

`sudo vi /etc/selinux/config`

```/etc/selinux/config
SELINUX=disabled
```

```再起動
reboot
```

```無効確認
getenforce
```

`Disabled`で成功。

PHP56をいれる
-----

そのままだと`yum`でとれないのでレポジトリを登録する

```
sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
```

PHPとエクステンションを入れる。`PHP56`のあとに`w`がつく。

```
sudo yum install -y nginx php56w php56w-fpm php56w-mbstring php56w-mysqlnd php56w-gd php56w-pdo

```



[これ](http://qiita.com/master-of-sugar/items/18fd684fa3938cdfe930)をやる


MySQLをいれる
-----
そのままだと`yum`でとれないのでレポジトリを登録する

```
yum install wget
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
```

```
yum install mysql-server
```

nginxをいれる
-----

そのままだと`yum`でとれないのでレポジトリを登録する

```
sudo rpm -ivh http://nginx.org/packages/rhel/7/noarch/RPMS/nginx-release-rhel-7-0.el7.ngx.noarch.rpm
```

```
yum install nginx
```

こんな感じ。
あとは地味にパスとか変わるので気をつける。
AmazonLinuxのほうが簡単だよねえ。。。
angular2のtemplate tagも使ってあげてほしいなーという話

## template tag

`*`使って書くtemplateよりもtemplate tagを使ったほうが良い場合があります。

こういうのよくありますよね。

```html
<span *ngIf="isRequired">必須</span>
```

以下のように書き換えるといらないspanが消えます。template tagは実体を持たないためです。

```html
<template [ngIf]="isRequired">必須</template>
```

angular1時代のng-repeat-start,end消えて困ってる方、ngForをtemplate tagを使って書きましょう。

```html
<template ngFor let-item [ngForOf]="items">
  <div>{{item.name}}</div>
  <div>{{item.value}}</div>
</template>
```

便利だ!

なんだ、この書き方って思ったら以下を参照してください。

## ng-container

[Angular 2アンチパターン集のいくつかのタグをまとめて*ngForしたいとき<template>でまとめる](http://qiita.com/armorik83/items/90b60fae2622f7c1f1a2#%E3%81%84%E3%81%8F%E3%81%A4%E3%81%8B%E3%81%AE%E3%82%BF%E3%82%B0%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6ngfor%E3%81%97%E3%81%9F%E3%81%84%E3%81%A8%E3%81%8Dtemplate%E3%81%A7%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B)によるとtemplateを直接書くのは古いやりかたで、`ng-container`を使いましょうということです([わりと前からあったようですね](https://github.com/angular/angular/pull/9197))。

```html
<ng-container *ngIf="isRequired">必須</ng-container>

<ng-container *ngFor="let item of items">
  <div>{{item.name}}</div>
  <div>{{item.value}}</div>
</ng-container>
```

読みやすい。`ng-container`使いましょう。


## 参考

* https://angular.io/docs/ts/latest/guide/template-syntax.html#!#star-template
* http://qiita.com/armorik83/items/90b60fae2622f7c1f1a2
* https://github.com/angular/angular/pull/9197
CentOS7 のSSHでとりあえずセキュリティ

## ログイン確認
良からぬログイン試行されてない？

```bash:
$ sudo lastb
username ssh:notty    hogehogehogeho.a Sun Sep 18 19:44 - 09:44  (00:00)
username ssh:notty    hogehogehogeho.a Sun Sep 18 19:39 - 09:39  (00:00)
```

某大陸あたりから手当たり次第に大量のログイン試行されてて鬱陶しいことがあります。
どうやらとりあえずストレートにport22を狙ってきてる様子。

## Port変更とroot無効化
とりあえず手取り早い対策としてrootでのログイン無効化とSSHのPortを換えてしまいましょう。

```bash
$ sudo vi /etc/ssh/sshd_config
```

```text:/etc/ssh/sshd_config
#ポート2222に変更する場合
Port 2222

...中略...

PermitRootLogin no

```
## SE Linux対策

必要な人のみ。

```
$ getenforce
Enforcing
```

となってる場合は以下の実施が必要。でないと設定したポート番号でdaemonがlistenできず、起動しなくなります。

semanageコマンドが使えない場合は予めインストールしておきます。

```bash:
 sudo yum install -y policycoreutils-python
```

TCPポート2222をオブジェクトタイプssh_port_tに

```
 sudo semanage port -a -t ssh_port_t -p tcp 2222
```

## Deaemon再起動

daemon再起動して、2222/tcpがListenしていることを確認します。

```bash
$ sudo systemctl restart sshd
$ ss -ltn
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port     
LISTEN     0      100    127.0.0.1:25                       *:*                 
LISTEN     0      128          *:2222                     *:*
LISTEN     0      100        ::1:25                      :::*
LISTEN     0      128         :::2222                    :::*
```

## firewall
```bash
$ sudo firewall-cmd --add-port=2222/tcp --permanent
$ sudo firewall-cmd --remove-service=ssh --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client
  ports: 2222/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
```

## sshdのポート変更せずにfirewalldでポート転送する（お手軽）
2016/11/23追記

sshdのポートは22のままで、2222/tcpなどのアクセスを22/tcpに転送します。
外からみれば22は塞がれているので、ポート変更と同じ効果がありますが、sshdがlistenするポートは変わらないので、SELinux対策も不要。

また、publicでないzoneからはそのまま22/tcpを利用することも可能で、柔軟に対応できるのでこっちのほうがオススメかも。

firewalldを設定

```bash:
$ sudo firewall-cmd --add-forward-port=port=2222:proto=tcp:toport=22 --permanent
$ sudo firewall-cmd --remove-service=ssh --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
public (default, active)
  interfaces: eth0
  sources:
  services: dhcpv6-client
  ports:
  masquerade: no
  forward-ports: port=2222:proto=tcp:toport=22:toaddr=
  icmp-blocks:
  rich rules:
```
これで多少は。。。　なにもしないよりだいぶいいです。
(パッケージした)vagrant環境構築課題メモ--初心者

PC入れ替えのため、新PCで諸々開発環境を再構築している。

半年前、vagrantの環境が問題なく構築できましたが、今回はうまくいけなかった。
幸い、助けてもらって解決できました。問題と原因をメモしとく。

##gitの改行コード設定

ソースをダウンロードしたとき、改行コードが crlf に変更され、
ファイル(hosts.sh)の内容は認識されなく、ファイル存在しないエラーが出た。

**対策**
最初から、（git bashで）gitの改行コードを設定する。
``` git config --global core.autocrlf false ```

##GuestAdditionsを無効にしてしまう

>より新しいkernelが公開されているタイミングでGuestAdditions(以下GA)の再ビルドをすると、インストール済みGAが無効になる(削除されてから再ビルドに失敗する)。

**対策** 
kernelをアップデートする。
詳細参考：[vagrant-vbguestプラグインがGuestAdditionsを無効にしてしまう](http://qiita.com/hapicky/items/a7f9d56588f96d005fad)

アップデートしたら、``` vagrant reload ``` で、vagrantfile再起動する。
※[vagrant コマンド](http://qiita.com/htk_jp/items/929875eaa5afc71c25ed)



##port 80が複数のアプリが使われている
vagrant httpd起動したが、アプリをアクセスするとき（http://local.....) 404エラーが発生。
エラーメッセージ：

>[warn] default VirtualHost overlap on port 80, the first has precedence

**対策**
/etc/httpd/conf/httpd.conf に下記を追記する
``` NameVirtualHost *:80 ```
SVNのコンフリクトしたのでメモ((φ(･д･｡)


TreeConflictが起きたら、とりあえずこのコマンド打っとけばおｋ
という解決方をかげている人がいる中、検索のトップに引っかかったのは、↓


[マージでの Tree conflict 解消方法メモ](http://qiita.com/snaka/items/3b914db2e6b861629fd1)

非常に参考になりました！

ここに載っていないエラーについて、調べながら自分用にメモ
branch A から branch Bにマージする際に起きた例なので、頻度低めかも
。

上記のリンクがとても見やすかったので、似たような記述で書きます。

## local missing, incoming edit upon merge
### ステータス表示

```bash:表示例
!     C proj/Assets/Resources/Window/Prefab/DataLink.prefab
      >   local missing, incoming edit upon merge
```

### 理由
ローカルに存在せず、マージ元で編集がある。

### 解消方法(暫定)
マージ元で新規作成されたファイルがローカルに存在しないので、このような状態になっている。

マージ元からこのファイルをダウンロードしてくればいいので、その対応を行う。

```bash:コマンド例
bash-3.2$ svn resolve --accept working proj/Assets/Resources/Window/Prefab/DataLink.prefab
'proj/Assets/Resources/Window/Prefab/DataLink.prefab' の競合状態を解消しました

bash-3.2$ svn export ${URL}/proj/Assets/Resources/Window/Prefab/DataLink.prefab proj/Assets/Resources/Window/Prefab/
A    proj/Assets/Resources/Window/Prefab/DataLink.prefab

bash-3.2$ svn add proj/Assets/Resources/Window/Prefab/DataLink.prefab
A         proj/Assets/Resources/Window/Prefab/DataLink.prefab
```

## local delete, incoming edit upon merge

### ステータス表示

```bash:表示例
!     C proj/Assets/Scene/DataLink
      >   local delete, incoming edit upon merge
```

### 理由
ローカルで削除されたファイルだが、マージ元で更新がある。

### 解消方法(暫定)

```bash:コマンド例
bash-3.2$ svn resolve --accept working proj/Assets/Scene/DataLink
'proj/Assets/Scene/DataLink' の競合状態を解消しました

bash-3.2$ svn export ${URL}/proj/Assets/Scene/DataLink proj/Assets/Scene/DataLink
A    proj/Assets/Scene/DataLink

bash-3.2$ svn add proj/Assets/Scene/DataLink
A         proj/Assets/Scene/DataLink
A         proj/Assets/Scene/DataLink/DataLink.unity
```