OmniAICreator/Qiita-1.07M huggingface dataset:
ソケットプログラミング LEVEL1

***ソケットプログラミング***

clがsvに接続すると、clからsvに対して、データとpidを送る。
svは、clからデータを受信すると標準出力に受信データを表示してclとのコネクションを切断し、新しいコネクション待ちになる。

ディレクトリ構造は以下

```tree
top
├── Makefile
├── bin
│   ├── cl
│   └── sv
├── obj
│   ├── cl.o
│   └── sv.o
└── src
    ├── cl.c
    └── sv.c
```

makefileのソースコード

```Makefile
BIN_DIR=bin
SRC_DIR=src
OBJ_DIR=obj

TARGET_CL=$(BIN_DIR)/cl
TARGET_SV=$(BIN_DIR)/sv

vpath %.c $(SRC_DIR)

all:$(TARGET_CL) $(TARGET_SV)
$(TARGET_CL):$(OBJ_DIR)/cl.o
	$(CC) -o $@ $^
$(TARGET_SV):$(OBJ_DIR)/sv.o
	$(CC) -o $@ $^
$(OBJ_DIR)/%.o:%.c
	$(CC) -Wall -g -c $< -o $@
clean:
	@rm -f obj/* bin/*

```


サーバ側のソース

```sv.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#define SV_PORT (11111)
int main(){
    int sock;
    int sock_accept;
    unsigned int len;
    char buf[256]={0};
    int ret;
    struct sockaddr_in addr;
    struct sockaddr_in client;
    if((sock=socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket");
        exit(1);
    }
    addr.sin_family = AF_INET;
    addr.sin_port = htons(SV_PORT);
    addr.sin_addr.s_addr=INADDR_ANY;
    ret=bind(sock, (struct sockaddr *)&addr, sizeof(addr));
    if(ret==-1)
    {
        perror("bind");
        exit(1);
    }
    listen(sock, 5);
    while(1)
    {
        len=sizeof(client);
        sock_accept=accept(sock, (struct sockaddr *)&client, &len);
        if(sock_accept == -1)
        {
             perror("accpet");
             close(sock);
             exit(1);
        }
        recv(sock_accept, buf, sizeof(buf), 0);
        printf("recv:%s\n",buf);
        close(sock_accept);
    }
    //close(sock);
    
    return 0;
}


```

クライアント側のソース

```cl.c
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#define SV_PORT 11111
#define SV_IP "127.0.0.1"
int main(){
  int sock;
  char data[32]="cl_data_OK";
  char buf[256]={0};
  struct sockaddr_in dest;
  if((sock=socket(AF_INET, SOCK_STREAM, 0)) < 0)
  {
    perror("socket");
    return -1;
  }
  dest.sin_family = AF_INET;
  dest.sin_port = htons(SV_PORT);
  dest.sin_addr.s_addr=inet_addr(SV_IP);

  if(connect(sock, (struct sockaddr *)&dest, sizeof(dest)) == -1)
  {
    perror("connect");
  }

  sprintf(buf,"data=%s length=%lu pid=%d\n",data, strlen(data), getpid());
  send(sock, buf, strlen(buf), 0);
  printf("send:%s\n",buf);

  close(sock);
  
  return 0;
}
```
google-oauth2-installedを使ってOAuth認証を乗り切る


Googleのパスワード認証が終了したみたいで、GoogleのAPIを使った自作ツールが軒並み動かなくなりました。独自形式でGoogle Analyticsのアクセス解析結果をまとめてExcelで出力とかやってたもんだから、顔面蒼白です。どげんかせんといかん。

# Googleの認証がOAuthのみになった

OAuthのみになったようなのだけれど、固定ユーザーで認証して使いたいツールだったので、プログラム側のみで認証が終わってほしいのです。

なお、有効にするAPIは選択式なので、Google Developers Consoleから設定していきます。

[Google Developers Console](https://console.developers.google.com/project)

まだプロジェクトがない場合は、適当なプロジェクトを作りましょう。

## 3つの認証方法

* ウェブ アプリケーション
* サービス アカウント
* インストールされているアプリケーション

サービス アカウントが使えるかな？と思ったのですが、どうもこれはGoogle Appsユーザーのみ利用可能なようで、残りは2つですが、ウェブアプリケーションだとユーザーが認証しないといけないので今回はインストールされているアプリケーションを選択するのがよさそう。

# 使ったライブラリ

使ったライブラリは以下の2つ。

* [goole-oauth2-installed](https://github.com/carnesmedia/google-oauth2-installed)
* [dotenv-rails](https://github.com/bkeepers/dotenv)

## google-oauth2-installed

google-oauth2-installedはインストールされているアプリケーション向けに特化したOAuth2用のgemです。環境変数にclient_idやclient_secretなどを設定して、rake taskを呼び出したらURLが表示されるのでそこにアクセスして認証を終えるとアクセストークンとかがもらえるのでそれをまた環境変数に保存しておくのです。

その際に使えるのが、dotenv(dotenv-rails)です。

## dotenv(dotenv-rails)

dotenvは、.envファイルに環境変数を書いておけるgemです。
開発環境では、.envファイルの内容を参照し、本番環境では、ファイルに保存せずに環境変数を設定しておきます。そうすることで、ソースコードに認証情報を残さなくて済みます。
.gitignoreに.envを加えることを忘れないように！！

# 認証してみる

[goole-oauth2-installed](https://github.com/carnesmedia/google-oauth2-installed)のREADMEに方法は書いてあるので、なぞるだけになりますが…。

## インストール

Gemfileに追加

```rb:Gemfile
gem 'google-oauth2-installed'
gem 'dotenv-rails', group: [:development, :test]
```

インストール

```Bash
bundle install
```

## .envファイルを作成

.envファイルを作って、Google Developers Consoleで作った認証情報を設定しておきます。OAUTH2_SCOPEは、Google APIのスコープなので、それぞれのAPIのものを入れましょう。今回は、Google AnalyticsのAPIを使ったので、`https://www.googleapis.com/auth/analytics.readonly`になります。

```
OAUTH2_CLIENT_ID="..."
OAUTH2_CLIENT_SECRET="..."
OAUTH2_SCOPE="https://www.googleapis.com/auth/analytics.readonly"
```

## アクセストークンの取得

ここまで設定できたら、アクセストークンを取得するためのrake taskを呼びます。

```Bash
bin/rake googleoauth2installed:get_access_token
```

なお、springのバージョンがものすごく古いとエラーが出たので、`bundle update spring`しておくとよいかもしれません。

これを実行すると、アクセスするべきURLが表示されるので、そのURLにアクセスして認証を済ませて、表示された文字列をコンソールに入力します。

すると、さらに環境変数に登録するべきものが出力されます。

```
OAUTH2_ACCESS_TOKEN="..."
OAUTH2_REFRESH_TOKEN="..."
OAUTH2_EXPIRES_AT="..."
```

これらを.envに追加します。
これで、OAuth認証は完了しました。

## 利用方法

あとは、OAuth認証のアクセストークンを必要としているライブラリや処理に対して、アクセストークンを渡してやるだけです。

私の場合は、Garbに渡しました。

```rb
Garb::Session.access_token = GoogleOauth2Installed.access_token
```

あとは今までと同じように使うだけです。

# まとめ

認証をプログラム側だけにおさめるのであれば、この方法が便利そうです。
あとは本番環境ではちゃんと環境変数に必要な情報を設定しましょう。
Nexus 5にAndroid M Developer Previewをインストールする Mac編


基本的にはGoogle Developersの[Factory Images for Nexus Devices](https://developers.google.com/android/nexus/images#instructions)通りにやるだけ。

Android DevelopersからSystem Imageをダウンロードしてくる。
http://developer.android.com/preview/download.html

| Device | Download / Checksumsn |
|:-----------|:------------|
| Nexus 5 (GSM/LTE)<br>"hammerhead" | [hammerhead-MPZ44Q-preview-55d76d3a.tgz](http://developer.android.com/preview/download.html)<br>MD5: 9e2631b06c6525e401ceaae3677ff320<br>SHA-1: 55d76d3a379b18f3363f2d8a462c236ab96fc36 |

*注意1*
> 基本は端末を初期化するので、イメージを保存しておきたい場合は、バックアップと取る必要があります。
> 方法は→[コチラ](https://www.google.co.jp/search?q=android%20backup)

*注意2*
> platform-toolsにPATHを通しておく必要があります
> <pre>$ export PATH=$PATH:{your sdk path}/sdk/platform-tools</pre>


## Macに端末が接続されているか確認する
> <pre>$ adb devices
List of devices attached
02cc3923215c5531	device</pre>

## 端末をリブートします
> <pre>$ adb reboot bootloader</pre>

![1.png](https://qiita-image-store.s3.amazonaws.com/0/33505/40b3c14b-18f4-ae81-1eee-9e7fde806eca.png "1.png")

### 必要に応じて、端末のブートローダーを解除します
> <pre>$ fastboot oem unlock
...
OKAY [ 34.503s]
finished. total time: 34.503s</pre>

![2.png](https://qiita-image-store.s3.amazonaws.com/0/33505/ed3b085d-a859-d06a-04f5-78cd1069fdb9.png "2.png")



## ファクトリーイメージを解凍し、flash-allシェルを実行する
> <pre>$ ./flash-all.sh
target reported max download size of 1073741824 bytes
sending 'bootloader' (3119 KB)...
:
:
writing 'cache'...
OKAY [  1.079s]
rebooting...
>
finished. total time: 137.957s</pre>

![3.png](https://qiita-image-store.s3.amazonaws.com/0/33505/68017569-a9ab-eaf1-aa0b-caa7d7898bfe.png "3.png")

ちょっと待つとドロイド君が出てくる。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/33505/b45bf375-6783-bb04-a8c3-abe488d3fe45.png "4.png")

「これはプレビュー版だよ」と表示される。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/33505/bb17cdb1-3502-d89f-6af6-329eb2508b1e.png "5.png")

「ようこそ」
![6.png](https://qiita-image-store.s3.amazonaws.com/0/33505/7419f121-81f8-1baf-73d9-7fe3c994829e.png "6.png")
これで完了ですね。
Goで楽なシリアル化

最近REST APIを作るためにGoを使っていますが、きれいにデータをJSONに変換するために少し苦労していました。

ほとんどのチュートリアルや記事では、静的な`struct`とタグを使ってJSONを返す方法について解説しています。

```go
type User struct {
    ID        int `json:"id"`
    Email     string `json:"email"`
    HideEmail bool `json:"hide_email"`
    FirstName string `json:"first_name"`
    LastName  string `json:"last_name"`
    CreatedAt time.Time `json:"created_at"`
    UpdatedAt time.Time `json:"updated_at"`
}

user := User{
    ID: 1, Email: "x@example.com", FirstName: "Foo", LastName:  "Bar",HideEmail: true
}

data, err := json.Marshal(user)
```

確かに便利ではありますが、返すデータを動的に選ぶこともかなり多いと思います。
例えばユーザがログインしているかどうか、プライバシー設定がどうなっているか、たくさん
の条件が入ってくると思います。

そういった場合は、毎回`if`文などでデータを生成していくのも少し冗長すぎると思ったので、そのためのライブラリを作ってみました。

例として、以上の例の`struct`を`snake_case`に変えて、`HideEmail`が`true`だった場合は`Email`をJSONで返したくないとしたら、次のようなコードにできます。

```go
userSerializer := structomap.New().
                             UseSnakeCase().
                             Pick("ID", "Email", "FirstName", "LastName").
                             Omit("HideEmail").
                             OmitIf(func(u interface{}) bool {
                                return u.(User).HideEmail
                            }, "Email")
```

一度これを作ったら、あとは

```
userSerializer.Transform(user)
```

で`map[string]interface{}`として欲しい結果が返ってくるので、それを`json.Encode`に渡せば終わりです。この方法を使うと、配列とスライスもそのまま使えるので、`[]User`型の変数を`userSerializer.TransformArray`に渡せば、同じロジックで変換された`[]map[string]interface{}`が返ってきます。

詳細については[プロジェクトのページ](https://github.com/tuvistavie/structomap)をご覧ください。
ゲストCentOS7で外部と通信できない場合NetworkManagerを疑うこと

OpenVZゲストにCentOS7を使うとなぜかIPが活性化しない。

## ip コマンドでもだめ

```bash:
ip addr add 192.168.1.4/24 dev venet0
ip route add default via 192.168.1.1
```

IPは付与されるが他と通信できない。


## systemctl restart network してもダメ

```bash:
# systemctl status network
network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network)
   Active: failed (Result: exit-code) since 金 2015-05-29 13:30:03 JST; 18s ago
  Process: 1028 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=1/FAILURE)

 5月 29 13:30:03 c7.vz network[1028]: RTNETLINK answers: File exists
 5月 29 13:30:03 c7.vz network[1028]: RTNETLINK answers: File exists
 5月 29 13:30:03 c7.vz network[1028]: RTNETLINK answers: File exists
 5月 29 13:30:03 c7.vz network[1028]: RTNETLINK answers: File exists
 5月 29 13:30:03 c7.vz network[1028]: RTNETLINK answers: File exists
 5月 29 13:30:03 c7.vz systemd-sysctl[1179]: Failed to write '16' to '/proc/sys/kernel/sysrq': Permission denied
 5月 29 13:30:03 c7.vz systemd-sysctl[1179]: Failed to write '1' to '/proc/sys/kernel/core_uses_pid': Permission denied
 5月 29 13:30:03 c7.vz systemd[1]: network.service: control process exited, code=exited status=1
 5月 29 13:30:03 c7.vz systemd[1]: Failed to start LSB: Bring up/down networking.
 5月 29 13:30:03 c7.vz systemd[1]: Unit network.service entered failed state.
# /etc/init.d/network restart
Restarting network (via systemctl):  Job for network.service failed. See 'systemctl status network.service' and 'journalctl -xn' for details.
                                  [失敗]
```

## 調査


```bash:
# ifup venet0
エラー: 接続 'System venet0'用のデバイスが見つかりません.
```

```bash:
# LANG=C ifup venet0
Error: no device found for connection 'System venet0'.
```

ググると出てきた。

* [проблема с network [Архив] - Форум об интернет-маркетинге](http://searchengines.guru/archive/index.php/t-801900.html)

```bash:NetworkManagerが原因
# service NetworkManager stop
# chkconfig NetworkManager off

# /etc/init.d/network restart
Restarting network (via systemctl):                        [  OK  ]
```

外部と通信できるようになった。
facebookの og: url を設定する際の注意


og:urlは、パスの最後に / を入れないと、facebook側のクローラに正しく認識してもらえない場合がある。

(スラッシュなし → スラッシュあり へサーバーでリダイレクトする仕様に対して文句を言われる)

なのでog:urlにはちゃんと最後にスラッシュを入れるようにしましょう。

逆に、facebookのObject debuggerで、以下のエラーが出た場合はog: urlを疑ったほうが良いです。

```
Using data from http://www.nhk.or.jp/po/36po/ because there was an error following the redirect path.
```
C#→C++用のDLL作成で詰まったところのメモ


## std::stringを使用するには

*#include <string*>


## TAR32.DLLを使用するには

●下準備
　１．下記URLからパッケージをダウンロード
　http://www.csdinc.co.jp/archiver/lib/tar32.html

　２．ダウンロードしたパッケージから**TAR32.DLL**からコピーして自分のcppと同列に置く

下記ソースコードを参照


●宣言部


```
typedef int (WINAPI *LPUNTAREXTRACTMEM)(const HWND, LPCSTR, LPBYTE, const DWORD, int *, LPWORD, LPDWORD);
LPUNTAREXTRACTMEM lpTarExtractMem = NULL;
HMODULE hTar32 = 0;
```

●実装部

```
std::string DllName = "TAR32.DLL";

size_t origsize = DllName.size() + 1;
const size_t newsize = 100;
size_t convertedChars = 0;
wchar_t wcstring[newsize];
mbstowcs_s(&convertedChars, wcstring, origsize, DllName.c_str(), _TRUNCATE);

lpTarExtractMem = (LPUNTAREXTRACTMEM)GetProcAddress(hTar32, "TarExtractMem");

bool testret = true;
hTar32 = LoadLibrary(wcstring);
```


## 指定URLからダウンロードするためには

下記インクルード
* #include "wininet.h"

下記ソースファイルを参照

●URLを渡すとダウンロードしてlpszSrcにデータがセットされる。

```
void HttpDownLoadAction(std::string url){

	HINTERNET hInet, hUrl;
	char szBuf[128], *lpszSrc;

	DWORD dwRead, dwTotal = 0;	// ファイルサイズ
	HGLOBAL hMem;
	char szUrl[128];
	strcpy_s(szUrl, url.c_str());
	//インターネットの開始
	hInet = InternetOpen((LPCWSTR)"test-program",
		INTERNET_OPEN_TYPE_PRECONFIG,
		NULL, NULL, 0);
	if (hInet == NULL){
		return;
	}

	size_t origsize = url.size() + 1;
	const size_t newsize = 100;
	size_t convertedChars = 0;
	wchar_t wcstring[newsize];
	mbstowcs_s(&convertedChars, wcstring, origsize, szUrl, _TRUNCATE);


	//HTTPセッションの開始、指定のURLオープン
	hUrl = InternetOpenUrl(hInet, wcstring, NULL, 0, 0, 0);
	if (hUrl == NULL){
		return;
	}
	hMem = GlobalAlloc(GHND, 1);
	lpszSrc = (char*)GlobalLock(hMem);
	while (1){
		InternetReadFile(
			hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead);
		szBuf[dwRead] = '\0';
		if (dwRead == 0)break;
		dwTotal += dwRead;
		hMem = GlobalReAlloc(hMem, dwTotal + 1, GMEM_MOVEABLE);
		if (hMem == NULL){
			return;
		}
		lpszSrc = (char*)GlobalLock(hMem);
		if (lpszSrc == NULL){
			break;
		}
		strcat_s(lpszSrc, dwTotal + 1, szBuf);
	}
	//m_edit_display.SetWindowTextA(lpszSrc);
	//メモリの解放
	GlobalUnlock(hMem);
	GlobalFree(hMem);
	//インターネットハンドルの解放
	InternetCloseHandle(hUrl);
	InternetCloseHandle(hInet);
}
```

## wininet.h を自分のDLLで使用するには

●Visual Studioのメニュー→プロジェクト→プロジェクト名のプロパティ

●図のように追加の依存ファイルに**Wininet.lib**を追加

![スクリーンショット 2015-05-29 13.29.38.png](https://qiita-image-store.s3.amazonaws.com/0/17904/8569cd8e-ac7b-e180-6480-de534b87ea0d.png)

●ソリューションをビルドしなおすとリンクエラーが消える
VR動画の見える範囲の実ピクセル数を計算する

    幅 = 視野角 / 360 * 動画の横解像度
    高さ = 幅 * ビューポートの高さ / ビューポートの幅

視野角 = 90度
動画の横解像度 = 4096
ビューポートの幅 = 960 (1920を両目で使うので半分)
ビューポートの高さ = 1080

    幅 = 90 / 360 * 4096 = 1024
    高さ = 1024 * 1080 / 960 = 1152

面積比

    元動画 = 4096 * 2048 = 8388608
    見える範囲 = 1024 * 1152 = 1179648
    見える範囲 / 元動画 = 1179648 / 8388608 = 0.140625

…ほんとかな
Ruby on Railsにおけるdatabase.ymlの設定方法


# Ruby on Railsにおけるdatabase.ymlの設定方法

## サンプルコード

```yaml:app/config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: <%= ENV['RAILS_DATABASE_USER'] %>
  password: <%= ENV['RAILS_DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

development:
  <<: *default
  database: rails-devise-ja-development
test:
  <<: *default
  database: rails-devise-ja-test
production:
  <<: *default
  database: rails-devise-ja
  username: <%= ENV['RAILS_DATABASE_USER'] %>
  password: <%= ENV['RAILS_DATABASE_PASSWORD'] %>
```

**※サンプルコードのように設定を引き継がせることも可能**

## 設定項目

>
adapter:   使用するデータベース種類
encoding:  文字コード
reconnect: 再接続するかどうか
database:  データベース名
pool:      コネクションプーリングで使用するコネクションの上限
username:  ユーザー名
password:  パスワード
host:      MySQLが動作しているホスト名
>
lift関数いいすね

### before
ちょっと例が微妙なのだけど、、、
指定されたn番目の値を返す関数。存在するかしないかわからないので戻り値はOptionに。

```scala
def foo[A](seq: Seq[A], n: Int): Option[A] = {
  if (!seq.isEmpty && n > 0 && n < seq.size) Some(seq(n))
  else None
}
```

### after

Seq#liftはIntを受け取ってOptionを返す関数。
存在しないindexが与えられればNoneを返してくれるので上記のようなチェックは不要になる。

```scala
def foo[A](seq: Seq[A], n: Int): Option[A] = seq.lift(n)
```

## PartialFunction

元はPartialFunctionのlift関数で、これを使うとPartialFunctionを親トレイトであるFunction1に持ち上げる(liftする)事ができる。

```scala
val pf: PartialFunction[Int, String] = { case n if n % 2 == 0 => "even!" }
val f: Int => Option[String] = pf.lift
```

Seqの他にも、PartialFunctionトレイトを持つMapとかStackとかでも使うことが出来る。
PayPalのsandboxで意図的にカード与信エラーを発生させる方法

カードの請求先の番地に「CCREJECT-REFUSED」といれると、カード与信エラー（エラーコード10486）が常に発生するようになります。
以下に書いてあります。
https://developer.paypal.com/webapps/developer/docs/classic/express-checkout/ht_ec_fundingfailure10486/

なんかファミコンの裏技コマンドみたいですね。

即時支払いや定期支払いで与信エラーが発生した場合のエラーハンドリングのテストに便利です。

カード番号自体が正しいかどうかはPayPalが登録時にValidationしてくれるので、逆にカードに問題がある場合の挙動のテストが難しかったりします。

なお、上記では、このエラーが即時支払い時に起きた時は、もう一度PayPalの支払い画面にリダイレクトさせることでユーザーに別のカードを入れさせるような離脱対策を推奨しています。
プロセス名でgrepした結果をkillするシェルスクリプトを作る


```bash
ps aux | grep [プロセス名] | grep -v grep | awk '{ print "kill -9", $2 }' | sh
```

対象のプロセス名を抽出し、grep -vで結果からgrep自身を除外。
最後にawkで結果のPIDを元に`kill -9 PID`という文字列を生成。

生成した結果をシェル側に渡してやり実行する。

長時間動き続けるプロセスを定期的にkillして再起動させたい時などご活用ください。
Windowsのbatファイルで古いファイルを削除するメモ

よく忘れるのでメモ。

```lang:del.bat
rem c:\log\～.log に削除処理結果を残す
set fname=c:\log\%date:~-10,4date:~-5,2date:~-2,2%.log

rem 50日経ったc:\backup\～.bakファイルを削除
forfiles /P c:\backup\～.bak /S /M *.log /C "cmd /c if @isdir==FALSE del /s @path" /D -50 1>> %fname%
```

Windowsのforfilesコマンドで条件に合うファイルを取り出して処理する
http://www.atmarkit.co.jp/ait/articles/0902/27/news132.html


バッチ・ファイル中で日付をファイル名に使用する
http://www.atmarkit.co.jp/ait/articles/0405/01/news002.html
form_forを使ってモデルを指定しない書き方

「form_for」と「form_tag」を使ってのviewの書き方。

そもそも、モデルを使うのが「form_for」、モデルを使わないのが「form_tag」という非常に理解の浅い覚え方をしていたので、改めてメモです。


★form_forの使い方
http://railsdoc.com/references/form_for

```rb
form_for(モデルオブジェクト [, オプション]) do |f|
end
```

モデルを指定しての書き方ということで。

★モデルを使用しないform_for
Ruby on Rails チュートリアルから転載しますが、セッションなどの転載です。
http://railstutorial.jp/chapters/sign-in-sign-out?version=4.0#sec-signin_failure

```rb
form_for(:session, url: sessions_path)
```

確かにセッション系などだとこっちの方がスッキリ落ち着きます。

以下も転載ですが、確かにこの方が良い場合も諸々。

> ユーザー登録フォームではform_forを使用する方が一般的であり、並列構造を強調するためにもform_forを使用しました。

勉強になります。
ぺちこん関西の歩き方

*※本記事は、明日開催のPHPカンファレンス関西2015リレーブログのエントリーです。*

昨日は `@sigesaba` の「[PHPカンファレンス関西の懇親会はこんなんやで](http://conference.kphpug.jp/2015/after-the-conference/)」でした。

さて、本日でリレーブログも最終日！カンファレンスの開催も明日に迫ってまいりました！
そんな最終日エントリーを私、たかぴーがつとめさせていただきますm(_ _)m

というわけで実行委員長のたかぴーです。
関西の偉いぺちぱーの人たちに、白メガネってずっと言われてるので当日はメガネ変えてったろかな、ってちょっと意地悪な気持ちになっています。

リレーブログでも度々書かれている通り、今回は会場が例年と違うことで戸惑ってしまうことも予想されます。
なので、「ぺちこん関西の歩き方」と題して、一日の流れをおさらいしていきます。


# ぺちこん関西の歩き方

## 準備編
ぺちぱーの朝ははやい。

* 基調講演(10:30)直前は受付が混雑する
* できれば開場の10時に到着しておきたい

ことから、休日といえどもだらだらとした朝を過ごしてはいけない。
プロぺちぱーとして、注目のPHP7の基調講演は聞き逃すことは許されないのだ。


#### アクセス

会場までのルートも確認しておきたい。
今年の会場はいつもと違い、ブリーゼプラザで行われる。
例年の堺筋本町ではなく、西梅田が最寄り駅となる。
もちろん梅田（大阪駅）からも歩くことができる。
[会場案内](http://www.breeze-plaza.com/access/)をしっかりブクマしておく必要がある。

#### 天気
続いて天気の確認も・・・
といきたいところだが、なんと、JR大阪 / 大阪市営地下鉄から一歩も外に出ずに会場まで行くことができるらしい。
ただし、雨がふった場合、密かに楽しみにしている空中庭園が使えなくなるのはスタッフとして心が痛む。
![photo_img_07.jpg](https://qiita-image-store.s3.amazonaws.com/0/73113/08bb5ff7-3e96-4bec-7476-6e93ef8e34b2.jpeg)


## 受付編

さて、準備のシミュレーションはバッチリ。
会場入りしてからの動きもしっかり頭に描いておく必要がある。

まず、7Fにあがったらまず最初に受付を済まさないといけない。
繰り返しになるが、10時30分の基調講演前はおそらくメチャ混みになるだろう。
できれば10時ジャストには到着して受付をすまし、7F-8Fの移動やトイレの位置なども目で見て確認しておきたいところである。

エスカレータあがってすぐ、「あー受付ってこんなイメージやわ」みたいな受付台が佇んでいる。
そこが受付である。

Peatixのバーコードを提示し、ネームホルダーとトートバッグを受け取れば受付完了だ。
懇親会にも参加する場合は、リストバンドも受け取る必要がある。

ちなみに、今回は初の有料化ということもあり、当日受付は__絶対にNG__だ。
厳密に言うと、当日券は10万円かかる。マジな話だ。
懇親会も当日券は10万円かかる。申し込み忘れた人は、ゴネても入れないので要注意だぞ！


## セッション編
受付を済ませたら、本題であるセッションをききにいこう。
ここでは、敢えて「オススメセッション」の紹介はしないでおこうと思う。
なぜなら__全部見たい__からだ。
[タイムテーブル](http://conference.kphpug.jp/2015/timetable/)を見て、見たいセッションをチェックしておいた方がいいぞ！

一つ注意がある。
ハンズオン系のセッションに参加される方は、使いたいソフト(または体験版)をインストールしたノートパソコンを持ってきたほうがいいぞ！もちろん、持ってない場合でも見学参加は可能だ。

#### お昼ごはん
お昼ごはんは、大都会梅田。困ることはない。
セッションの合間や1200-1300の休憩で散策してみてほしい。
ブリーゼ / ハービスに数多く飲食店も入っているので、外にでることなくお昼も食せるぞ。

例年、だいたいこのタイミングらへんで懇親会のLTの募集が始まる。
お腹ぺこぺこでも、アナウンスは聞き逃せないぞ。


## 懇親会編
さて、本編が終わると、懇親会が始まる。
懇親会会場は、7F小ホールなので、会場転換に1時間くらいかかるぞ。
その間、懇親会参加するみんなは、801/802のブース部屋にて待機していてほしい。

転換が終わり次第、入場できるが、こちらも受付が必要だ。
リストバンドを見えるようにスタッフに見せてくれ。
リストバンドをしていない人は入れないぞ。

懇親会は、本編からみたら「おまけ」的な要素で、スピーカー・参加者・スタッフ混じってわーわーお話する会だよね、うんうんそうだよね、わかるわかる、って思ってる人たち！！！！

__PHPカンファレンスはここからがおもろい！__

（なぜかはわからないが）懇親会LTは、地べたに座って鑑賞するし、内容も本編に入れ込みたいくらい深い。
ぶっちゃけ、懇親会参加だけでも十分すぎるくらい濃いのだ。
最後まで気が抜けないな！


## 懇親会終了後
懇親会が終わってPHPカンファレンス関西としてのイベントは終了である。
２次会については、スタッフが何か用意しているわけではないので、熱の冷え切らぬ同士たちで近隣のお店に駆け込んでほしい。
大都会梅田、困ることはないだろう。


# というわけで
いよいよ明日です！
白いメガネを見かけたら「たかぴー」ってよんでくださいな(･v･`)
明日みなさんとお会いできるのを楽しみにしています！
Xibなどで指定したUITextViewのfont指定が効かない時の対処


備忘メモ

下記の"Selectable"にチェックしておかないと、コードからtextをセットするとフォントの種類やサイズが元に戻ってしまうようです。なぜなのかは不明。。

![スクリーンショット 2015-05-29 11.48.49.png](https://qiita-image-store.s3.amazonaws.com/0/10532/4bb9e909-6c0f-9580-6ca5-7b652e61650d.png "スクリーンショット 2015-05-29 11.48.49.png")
IE9でimageのonloadが走らない問題を無理やり解消する


IE9ではimageを読み込んだときにonloadが走らないという問題があります。
その他のブラウザでは、imageのsrcにキャッシュバスターをつけることで解決しますが、
IE9に関してはキャッシュバスターをつけても解決しません。


そこで、onload以外のプロパティを使ってonload的役割を無理やり実装しましょう。
imageにはwidth, heightというプロパティがあります。
そしてこれらのプロパティは、imageがまだ読み込まれてない段階では0という値を持っています。
読み込まれたとき、widthとheightにその画像の幅・高さがあてられます。


この値をsetIntervalで監視することで、画像が読み込まれたタイミングをとることができるという技です。


```onload.js
var img = new Image();

setInterval(function(){
	if ( img.width > 0 ){
		alert( "image loaded." );
	}
}, 50);

img.src = "img/hoge.jpg"; 

```
iOS safariで画面下部のメニューバーが消えないようにする


iOSのsafariでは、画面下部に標準メニューバーが存在しています。

しかし、このメニューバーの挙動が厄介で、
webサイトを開いた状態ではメニューバーが表示されているものの、

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/43677/b12eae57-1724-99aa-cd47-867fce9608d6.jpeg "1.jpg")


少し画面をスクロールすると、このメニューバーがひょいっと下に隠れてしまいます。ついでに画面上部のアドレスバーも小さくなってしまいますね。

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/43677/573f81a0-c339-f9ac-d8a3-3cdbb89d789b.jpeg "2.jpg")

サイト上でスクロールに応じた演出や、
position: absolute; や position: fixed; を使って表示位置をシビアに調整しないといけない演出をやりたいとき、
この仕様がとても邪魔になってしまいます。


iOS7までは、viewportにminimal-uiなるものを指定することで、
このメニューバーを **一切表示しない**という選択肢があったのですが、
iOS8からはこのminimal-uiが廃止されてしまいました。


そこで、cssを使って **メニューバーが隠れないようにする実装方法を紹介します。**

やり方は簡単です。
まず、bodyのすぐ下に子孫に、画面全体を覆うdivを置きます。
いわゆるwrapperみたいなやつですね。


```index.html
<body>
	<div class="wrapper">
		ここにコンテンツを書く
	</div>
</body>
```

そして、以下のようにcssを指定します。

```main.css
.wrapper{
	height: 100vh;
	overflow: scroll;
	-webkit-overflow-scrolling: touch;
}
```

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/43677/3e2837a6-9f2b-d192-9581-b80dcb13f0ed.jpeg "4.jpg")

つまり、wrapperの高さは中身のコンテンツの高さによらず、常に表示領域の高さと同じ。
そして、overflow: scroll; をあてることで、中身のコンテンツをスクロールできるようにします。
body自体をスクロールするのではなく、wrapperという箱を作ってその中でスクロールさせるということです。
-webkit-overflow-scrolling: touch; は、スクロールを滑らかにするiOS専用のcssプロパティです。
これがないとoverflow: scroll; がカクカクしたスクロールになってしまうので書きましょう。

これで、メニューバーが隠れることなくサイト内コンテンツを閲覧してもらうことができます。
Excelで24時間以上の表記をする

## 方法
ユーザ定義書式で[]括りにする。

### 合計時間が 50:00 の場合
|表示形式|セル表示|備考|
|-------|------------:|----|
|hh:mm|2:00|50h % 24h = 2h|
|[hh]:mm|50:00||

## 参考（というか全て以下で済む）
[[XL2002] 24時間以上の時刻を表示する方法＠Microsoft サポート](https://support.microsoft.com/ja-jp/kb/400265/ja)
※「合計時間が 50:00 の場合」の「hh:mm」が「12:00」となっているが、間違っているように思う。
[fuelphp]さくらサーバーへの設置での忘備録 [mysql接続と500エラー回避法]

##mysql接続
ホスト名はlocalhostではNG.
host=mysql***.db.sakura.ne.jp
詳細->https://help.sakura.ad.jp/app/answers/detail/a_id/2298

##500エラー
public/.htaccess の　**Options +FollowSymLinks -Indexes**　をコメントアウトする。

```lang:.htaccess
# Multiple Environment config, set this to development, staging or production
# SetEnv FUEL_ENV production

<IfModule mod_rewrite.c>

    # Make sure directory listing is disabled
	Options +FollowSymLinks -Indexes
	RewriteEngine on
        .
        .
        .
   	RewriteCond %{HTTP:X-Requested-With}	!^XMLHttpRequest$
	RewriteCond %{THE_REQUEST}				^[^/]*/index\.php [NC]
	RewriteRule ^index\.php(.*)$			$1 [R=301,NS,L]

```

↓

```lang:.htaccess
# Multiple Environment config, set this to development, staging or production
# SetEnv FUEL_ENV production

<IfModule mod_rewrite.c>

    # Make sure directory listing is disabled
　　   # Options +FollowSymLinks -Indexes
    RewriteEngine on
        .
        .
        .
   	#RewriteCond %{HTTP:X-Requested-With}	!^XMLHttpRequest$
	#RewriteCond %{THE_REQUEST}				^[^/]*/index\.php [NC]
	#RewriteRule ^index\.php(.*)$			$1 [R=301,NS,L]

```
ffmpeg の nvenc を動かすときに苦労したことメモ

ffmpegの比較的新しい機能で、NVIDIAのGPUパワーを利用して高速にMP4に変換できるnvencというものを使ってみたが、いろいろ苦労したのでメモ。
ちなみに、今回はCentOSにインストールしています。

基本的なインストール手順はこちらを参考にさせていただきました
http://nico-lab.net/installing_cuda_with_ffmpeg/

また、NVIDIA関連のダウンロードはこちらから行いました
https://developer.nvidia.com/nvidia-video-codec-sdk

## ffmpegをコンパイルできない

CUDA ToolkitとNVIDIA Driverをインストールした上で

```
./configure --enable-nonfree --enable-nvenc
make
sudo make install
```

を実行したところ、なぜか `make` の途中でエラーになる。
エラーの起きた `libavcodec/nvenc.c` を見てみると、どうやら

```c
typedef struct NvencData
{
    union {
        int64_t timestamp;
        NvencOutputSurface *surface;
    };
} NvencData;
```

のところでシンタックスエラーになっているらしい。
C言語のコンパイラの系統とかバージョンとかに詳しくないのだが、自分の環境のコンパイラで扱えない文法なのだろうか...
とりあえず、動作に悪影響があるか不安ではあるが、上の箇所を

```c
typedef union NvencData
{
        int64_t timestamp;
        NvencOutputSurface *surface;
} NvencData;
```

のようにしてみたところ、コンパイルが通り、最終的には動いてくれた。

当時、ffmpeg 2.6.1のコードでこのエラーが起きたが、現在、ffmpeg 2.6.3でも上の箇所は変更されていないようだった。

## H.264のProfileを指定できない

H.264のMainProfileでエンコードされる必要があったので、libx264を使っていたときのオプション `-profile:v main` をそのまま指定してみたが、nvencではエラーになる。
エラーメッセージを見ると、

```
Undefined constant or missing '(' in 'main'
Unable to parse option value "main"
Error setting option profile to value main.
```

`-profile:v main` はパースできない不正な書式らしいが、適当に`-foobar:v`とか指定したときとメッセージが違うので、`-profile:v`は理解されているらしい。
ソースをがんばってたどったところ、そもそも `-profile:v` に指定する値が整数値であることがわかり、 `libavcodec/avcodec.h` に答えを見つけた。
`libavcodec/nvenc.c` のswitch文によると、使用できる値は下のようになっているらしい。

|Profile|Value|
|:--|:-:|
|Baseline|66|
|Main|77|
|High|100|

今回はMainProfileにしたかったので、 `-profile:v 77` としたらうまくいった。
サロゲートペアの文字が行頭に有るCSVファイルをExcelで開くと化ける

メモ

* Microsoft Excel バージョン14.0.7149.5000 (64ビット）
* CSVはUTF-8 BOM有り

```text:TextFile2.csv
𪛀
𪛀
𪛀𪛀
𪛀あ
"𪛀"
𪛀,うい
あ𪛀,うい
"𪛀",うい

🙀
"",🙀

か゚


```

このCSVファイルを`ダブルクリック`で開くと...
![saro.png](https://qiita-image-store.s3.amazonaws.com/0/31347/9f7ad8db-7b31-95d5-6878-d0f2f11be089.png)
  　　　　　(↑VS2010　　　  Excel↑)

というように２行目以降かつ行頭にサロゲートペアの文字が含まれると、行頭のサロゲートペアの文字だけうまく表示されません。
（ダブルクォーテーションで囲えば回避は可能）

最新のExcelでは未確認ですが、治ってるといいですね。
Atom との出会い、その必然性について

「tomoya」の頭に「A」をつけると、「**Atom**oya」になり、名前の中にAtomが現われる。

であるからにして、[WEB+DB PRESS Vol.86](http://gihyo.jp/magazine/wdpress/archive/2015/vol86)にて、Atom特集を執筆したのは、単なる偶然の気紛れではなく、明確なる必然だったということに他ならない。

Atomについて語りたいですね。
選択したセルの特定文字列を赤くするマクロ


```vbnet
Sub 選択範囲の指定の文字を赤く()
    Dim Target As String
    Dim Rng As Object
    
    '' 赤くしたい文字をユーザーに入力してもらう
    Target = Application.InputBox("変更する文字を入力")
    
    '' 何も入力されなければ終了する
    If Target = "" Then
        Exit Sub
    End If
        
    '' 選択したセルをすべて処理する
    For Each Rng In Selection
        Dim Pos As Long

        '' セルに含まれる文字を全て処理する
        Pos = InStr(1, Rng.Value, Target)
        Do Until Pos = 0
            
            '' 部分的に色を3(赤)に設定
            Rng.Characters(Pos, Len(Target)).Font.ColorIndex = 3
            
            Pos = InStr(Pos + Len(Target), Rng, Target)
        Loop
    Next
   
End Sub
```
bash > ブラウザでbashを試す

CentOSの仮想とかあるけど、ちょっとしたことで起動するのが面倒な時、ブラウザでbashを実行できる環境を試している。

~~http://www.tutorialspoint.com/execute_bash_online.php~~

main.shにコードを書いて、Executeを押せば画面の一番下に実行結果が表示される。

Fileメニューにupload/downloadもある。

### https対応
(追記 2017/09/18)

https対応して、httpのリンク（上記）では動作しなくなっていた。
以下のリンクでは動作する。

https://www.tutorialspoint.com/execute_bash_online.php
最新のLinux版のAtomやElectronの日本語表示が豆腐になる

2015/5/29現在、LinuxのAtomエディタやElectronでは日本語などの２バイト文字が
豆腐のような四角い文字で表示されてしまう。

以下のIssueが参考になる

- https://github.com/atom/atom/issues/6214

# Electronで確認する

Jsdo.itに上記を参考に文字化けが解消したかをチェックした

Devtool立ち上げて、location.hrefに以下を指定して、文字化けが
治ることを確認できた。

- http://jsdo.it/kjunichi/2nlE

# ちなみにChromeは平気

どうやらfreetype周りの問題のようで、Chromeは独自のfreetypeライブラリで対応しているらしい。

# Droidフォントがないんだけど

Ubuntu14.04だと以下で入った。本当は等幅の日本語フォントの指定を
うまいことすれば良いかもだが。

```bash
sudo apt-get install -y fonts-droid 
```

# 関連投稿

- [Macでfc-listコマンドでフォントがなにも表示されないとき - Qiita](https://qiita.com/kjunichi/items/a9b95d2ac4d57a5d6206)

# 関連記事

- [Electronで自分のIPアドレスをLAN内のiPhoneに通知するには](https://abrakatabura.hatenablog.com/entry/2015/10/24/113659)
- [Raspberry Piの温度をgRPCを使ってElectronで作ったデスクトップマスコットに表示させた](https://abrakatabura.hatenablog.com/entry/2018/06/16/070747)
- [ElectronでWebGL(three.js)使ってデスクトップマスコット作った際に分かったこと](https://abrakatabura.hatenablog.com/entry/2016/01/09/134348)
- [ElectronでmacOSのDockやWindowsのタスクバーに独自のアイコンを表示するには](https://abrakatabura.hatenablog.com/entry/2018/08/20/202928)
- [Tensorflowのclassify_image.pyにElectronでGUIを被せてみた](https://abrakatabura.hatenablog.com/entry/2017/02/05/134054)
- [lisp版ElectronのCeramicを動かした](https://abrakatabura.hatenablog.com/entry/2015/09/08/071602)
技術英語 > 利き腕を折った > broke my good arm

怪我をして利き腕を折った時に使う。
I broke my good arm. I am originally right-handed, but I have to get used to do everything left-handed.

利き腕についてalcで調べたら
better arm
dominant arm
good arm
などいくつかの訳の候補があるようだ ( [alc](http://eow.alc.co.jp/search?q=%E5%88%A9%E3%81%8D%E8%85%95) )。


google検索で調べてみた
- "broke my better arm" : 検索結果なし
- "broke my dominant arm" : 770件
- "broke my good arm" : 215,000件

とりあえずよく使われているone's good armを使うことにする。
Google IO 2015メモ

## Android M Developer Preview

### App Permissions

アプリ内で必要なときにデバイスへのアクセスを許可・拒否できるようになる。

### Web Experiments

Chrome custom Tabs
Chromeをアプリから呼び出す際に、呼び出し元のアプリっぽいUIにカスタマイズできる。
WebViewとは異なり、Chromeのパスワード記憶等にアクセスできる。

### App Links

HTTPスキームのURLをアプリがハンドリングしやすくなる

### Mobile Payments

単純・セキュア・選択
クレジットカードのように使えるAndroid pay
実店舗でも使える支払いシステム

### Fingerprint Support

Android Payの認証に可能
デバイスアンロック可能
オープン認証API
アプリに組み込み可能

### Power & Charging

同期タイミングをコントロールすることでバッテリー持ち時間を2倍に
USB Type C
高速充電
電源出力用としても利用可能

### その他

テキスト選択がしやすくなる
簡単なボリュームコントロール
ダイレクトシェア

## Android Wear

省電力モードでアプリを表示できる
スリープから復帰した時にアプリに直接復帰できる。

腕の動きで操作できる。
絵文字が描けるようになる。

## Brillo

Androidより小型デバイス向けのOS?
Q3 2015

## Weave

Brillo デバイスと電話とクラウドを繋げるクロスプラットフォームAPI
Q4 2015

## Google Now

聞いてる音楽、見ているページなどを理解できるようになる
Android M Previewで利用可能に

## Google Photo

月ごと・年ごとの表示がしやすくなる
コレクション・アルバムビュー

写真に写っている顔・場所・モノで自動的にカテゴライズする

写真の共有リンクが作成できる。シェアしやすくなる。

無制限の写真と動画のストレージ
16Mピクセルの写真
1080P動画

今日から利用可能！


## Develop

Android Studio 1.3 Preview
C/C++サポート

Polymer 1.0

iOS
COCOAPODS

Cloud Test Lab
モバイルテストの自動化クラウドサービス

Firebase
Google Cloud Platform

## Engage

App Indexing
アプリコンテンツをGoogleインデックスに追加。
検索結果からアプリに

Cloud Messaging
Android, iOS, Chrome対応
Topic Subscriptions

Mobile Web
Webサイトでもプッシュ通知

App Install Ads
アプリの広告

Google Play
デベロッパーページが作れる

## Google Cardboard

6インチ対応のCardboard
全てのデバイスで動くボタン
キーノートの後でプレゼント（いいな！！！！）

Cardboard SDK
AndroidとiOS

### Jump

GoProとコラボ
360度撮影システム
スティッチング
ビューポートの補完(3D)
プレイヤー=YouTube Cardboard対応
タスクランナー空テンプレート（Grunt・Gulp）

WEBサイト制作用タスクランナーの空テンプレートを作りました。
[GruntベースのHTML5サイト制作テンプレート 2014年11月版](http://qiita.com/nowri/items/a6c08a39dc75c9b169f5)
というのを以前作りましたが今回は具体的なコンパイル用プラグインは含めず
以下タスクランナーフローをGrunt・Gulp両方で実装しました。

![taskrunner_flow.png](https://qiita-image-store.s3.amazonaws.com/0/26777/113be444-91ce-fd25-322f-0875f865edd7.png)

| ディレクトリ| 説明         |
|:-----------|:------------|
| _release   |  納品用 |
| deploy     |  開発用 |
| libs       |  ライブラリ等置き場（ex. `libs/js/jquery-1.11.3.min.js`） |
| src        |  コンパイル前データ等置き場（ex. `src/scss/style.scss`） |

| タスク名    | 説明         |
|:-----------|:------------|
| `common:before` |  共通タスク。専用タスクの一番最初に実行させる |
| `deploy`        |  開発時専用タスク |
| `release`       |  納品時専用タスク |
| `watch`         | ファイルを監視し更新時deployタスクを実行 |

元々Grunt版としてつくってあったものをこれから入門しようと思ってGulp版も作りました。Gruntと違ってGulpは非同期処理が基本なので同期的な処理をするために[run-sequence](https://www.npmjs.com/package/run-sequence)というプラグインを導入しました。並列処理と直列処理を簡単に書き分けられて便利そうです。その他Gulpについて色々勉強しまして詳しくはGulp参考を見てください。

#テンプレート生成
##Gulp版【[gulp-basic-nw](https://github.com/nowri/gulp-basic-nw)】
1. `npm i yo -g`(まだインストールしていなければ)
2. `npm i generator-gulp-basic-nw -g`(まだインストールしていなければ)
3. 生成したいディレクトリに移動
4. `yo gulp-basic-nw`

##Grunt版【[grunt-basic-nw](https://github.com/nowri/grunt-basic-nw)】
1. `npm i yo -g`(まだインストールしていなければ)
2. `npm i generator-grunt-basic-nw -g`(まだインストールしていなければ)
3. 生成したいディレクトリに移動
4. `yo grunt-basic-nw`

#Gulp参考
ファイル削除にはgulpプラグインを使わない
http://qiita.com/shinnn/items/bd7ad79526eff37cebd0

タスクランナーgulp.js最速入門
http://blog.anatoo.jp/entry/20140420/1397995711

gulp でディレクトリ構造を維持したコピー
http://akabeko.me/blog/2015/01/gulp-copy-keep-dir-structure/

gulp入門その３―こまごま便利なこと
http://creator.aainc.co.jp/archives/6994
SugarRecord がうまく動作しない場合の解決法


以下のようなページを見て SugarRecord を使おうとしたけどうまく動作しない人へ。

[【SugarRecord】Swiftで簡単にCoreData操作！ - Qiita](http://qiita.com/yuinchirn/items/23ab1b895e25c10a9af7#%E6%9B%B4%E6%96%B0)

## うまく動作しないとは

例えば SugarRecord がサポートしている以下のようなメソッドを実行するとエラーが発生した。

```lang:swift
let bookmark = Bookmark.create() as! Bookmark
```

## なぜか

SugarRecord で扱う Data Model の CONFIGURATIONS -> Entities -> Class の設定に誤りがあった。ここは「プロジェクト名.Entity名」とするんだけど、 **プロジェクト名にハイフンを記述していた** のだ。例えば、 「Sample-App.User」という風に。

## 解決法

なにやらハイフンがあるとダメなようで、ハイフンを **アンダースコア** に置き換えてやればよい。「Sample_App.User」のように。

実際の画像。

![スクリーンショット 2015-05-29 1.46.11.png](https://qiita-image-store.s3.amazonaws.com/0/41720/6a97ad8b-e2e5-1d28-7508-d876c1495972.png "スクリーンショット 2015-05-29 1.46.11.png")

## まとめ

試しに置き換えてみたら動いてくれただけで原理は分かっていない。というかそもそも XCode のプロジェクト名にハイフンを入れるのは少数派っぽくて、だいたい「SampleApp」, 「AwesomeTwitterClient」という風にアッパーキャメルケースになってる。
document.execCommand('copy')してみる


Chrome43がきたので[ここ](http://updates.html5rocks.com/2015/04/cut-and-copy-commands)を参考に`document.execCommand`でコピーしてみる。

## とりあえずやってみる
まずはミニマムでやる。
テキストを選択した状態で`document.execCommand('copy')`を実行する。
ユーザーアクションをトリガーにしないとだめっぽい。

```Javascript:ミニマム
elm.addEventListener('click', function() {
  document.execCommand('copy');
});
```

[demo](http://keiskimu.com/Qiita/execCommand/demo1.html)

ダミーのテキストは[Blindtext-Generator](http://www.blindtextgenerator.com/)から拝借。

適当にテキストを選択してcopyボタンを押すとクリップボードにコピーされてる。

よさげ。

## 特定要素内のテキストをコピー
[Range](https://developer.mozilla.org/ja/docs/Web/API/Range)オブジェクトを作成し、コピーしたい要素を指定する。

```Javascript:特定要素内のテキストをコピー
elm.addEventListener('click', function() {
  var target = document.getElementById('target');
  var range = document.createRange();
  range.selectNode(target);
  window.getSelection().addRange(range);

  document.execCommand('copy');
});
```

[demo](http://keiskimu.com/Qiita/execCommand/demo2.html)

よいよ。


## 特定範囲内のテキストをコピー

10文字目から30文字目までをコピーする。

```Javascript:特定範囲内のテキストをコピー
elm.addEventListener('click', function() {
  // 求）TextNodeのスマートな取得方法
  var pText = document.querySelector('p').firstChild;
  var range = document.createRange();
  range.setStart(pText, 10);
  range.setEnd(pText, 30);
  window.getSelection().addRange(range);

  document.execCommand('copy');
});
```

[demo](http://keiskimu.com/Qiita/execCommand/demo3.html)

とてもよいよ。

## 画像をコピー
`selectNode`にimg要素を渡してみる。

```Javascript:画像をコピー
elm.addEventListener('click', function() {
  var image = document.querySelector('img');
  var range = document.createRange();
  range.selectNode(image);
  window.getSelection().addRange(range);

  document.execCommand('copy');
});
```

[demo](http://keiskimu.com/Qiita/execCommand/demo4.html)

trueが返ったので期待してたらalt属性がコピーされた・・・

もうちょいちゃんと調べないと使いこなせなさそう。
Windowsでプロセスのメモリダンプ・オープンファイル一覧を取得する方法

メモリダンプの方は「タスクマネージャー」＞「アプリケーション」でタスクを選択して右クリックで「ダンプファイルの作成」でできる。

cmdからやりたい場合はUser Mode Process Dumperをインストールして
`userdump.exe -p | sort /+6`
でプロセスIDを見つけて
`userdump.exe pid output.dmp`
でダンプ可能。

オープンファイル一覧は管理者権限でcmdを起動し
`openfiles /local on`
を実行した後にwindowsを再起動して、もう一度管理者権限でcmdを起動し、
`openfiles /query /v`
とする。

参考
http://d.hatena.ne.jp/language_and_engineering/20081019/1224341559
http://www.atmarkit.co.jp/fwin2k/win2ktips/306openfiles/openfiles.html
android.support.v7.widget.SearchViewで下線を消す

### 概要
android.support.v7.widget.SearchViewを使って検索ボックスを設置した際に表示される下線を消したい時があります

![f564fc371b4320be5ce822a0bc40bdf8.png](https://qiita-image-store.s3.amazonaws.com/0/61162/051499f8-ccd8-6e70-9454-a76faa7f9c04.png)

```xml:activity_main.xml
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/darker_gray">
    <android.support.v7.widget.SearchView
        android:id="@+id/search_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/white"
        android:layout_margin="16dp"/>
</RelativeLayout>
```
```java:MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SearchView searchView = (SearchView) findViewById(R.id.search_view);
        searchView.setIconified(false);
```

### 下線の消し方
- SearchViewに背景色を設定しても、下線は消えません。また、SearchView自体には下線の表示を制御するxmlの指定等存在しません。
- この線はSearchViewの内部を構成している要素の一つである`search_plate`に背景色を追加することで消すことができます。背景色はtransparentでも可です。

```java:MainActivity.java
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SearchView searchView = (SearchView) findViewById(R.id.search_view);
        searchView.setIconified(false);

        /* 以下のコードを追加 */
        searchView.findViewById(android.support.v7.appcompat.R.id.search_plate)
                .setBackgroundColor(getResources().getColor(android.R.color.transparent));
    }
```


- 下線を消すことが出来ました

![969ca14dfa3823f4401eb5b7e1ffc932.png](https://qiita-image-store.s3.amazonaws.com/0/61162/7105e919-b084-25ea-7424-1d35837aba46.png)
ファイルの末が改行 LF であるか判定する Bash スクリプト

ファイルの最後の文字が改行なら 0 で終了、それ以外なら 1 で終了する Bash スクリプト。

かなりちまちましているけど、ファイルの末尾については重要な問題だと思っている。

今回は Bash のスクリプトで書いてしまったが、できれば POSIX 原理主義的なやり方も知りたいと思う。

# The Open Group Base Specifications Issue 7

The Open Group Base Specifications Issue 7 によると

[3.397 Text File](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_397)

```text
A file that contains characters organized into one or more lines.
```

[3.206 Line](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_206)

```text
A sequence of zero or more non- <newline> characters plus a terminating <newline> character.
```

どうやらテキストファイルとは「1 つ以上の行」行は「0 個以上の改行以外の文字と末尾の改行」らしい。

このように末尾が改行で終わっているか判定し、正常なら ```0``` 、それ以外なら ```0 以外``` で終了コードを返すスクリプトが欲しくなった。

もちろん、「この仕様に基づいた上でのテキストファイルとは」という話なだけなので、
私が「この世の全てのテキストファイルとはかくあるべし」と主張しているわけではない。
いろいろな OS に、それぞれの仕様があると思う。

# 書いた

```bash:endswith_linebreak
#!/usr/bin/env bash
exec tail -c 1 | cmp -s - <(echo)
```

## 使い方

終了コードだけではコンソールからは判別つかないので、 ```echo "$?"``` をつけて例示してみる。
調べたいファイルを標準入力にする。

```console
$ ./endswith_linebreak < target_file ; echo "$?"
0
```

なお Bash 特有の機能である、コマンドを ```<()``` でリダイレクトする機能を使っている。
ので、このスクリプトは POSIX 準拠というわけではない。無念。

# これではダメだった

最初、もっとシンプルに次のようなスクリプトを考えていた。

```bash
test "$(tail -c 1 "$1")" = $'\n'
```

残念ながら、これでは意図通りの動作にならない。
コマンド置換は末尾の改行が潰されてしまうのだ。そのため常に終了コードは 1 になる。

これは普段

```console
$ echo "$(pwd)/somefile"
```

と実行したとき

```console
$ echo "$(pwd)/somefile"
/foo/bar
somefile
```

とならずに

```console
$ echo "$(pwd)/somefile"
/foo/bar/somefile
```

となることからも理解できる。

今回はそこでいろいろと苦心したものの、結局思い浮かばなかった。
Bash スクリプトで割りきって書くことにした。
また、せっかくなのでファイルを引数で指定するのではなく標準入力を使うことにした。

もし標準入力ではなく引数でファイルを指定する形式なら

```bash:endswith_linebreak
#!/usr/bin/env bash
exec cmp -s <(tail -c 1 "$1") <(echo)
```

と書けばいい。

2015-05-30 追記:

コメント欄にて ```tail -n 1 | wc -l``` すると良いとのことを教えていただいたので更新。

```bash:endswith_linebreak
#!/bin/sh
set -eu
PATH='/bin:/usr/bin'
LANG='C'
exec test "$(tail -n 1 "$1" | wc -l)" -eq 1
```
GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~

GitHubにssh接続するために鍵の登録が必要になります。
その手順をまとめてみます。

はじめての人は手順通りに進めれば接続出来ます。
久しぶりにやってうまくいかないという人の解決の糸口になるようにも書いています。

#公開鍵・秘密鍵を作成する

公開鍵暗号での認証には公開鍵と秘密鍵が必要になります。
秘密鍵は秘密というだけあって**他の人に見られてはいけません。**つまりどこかに送信してはいけません。公開鍵はオーケーです。
秘密鍵は自分で保持し、公開鍵は相手（ここではGitHub)に送ります。
まずは公開鍵と秘密鍵のペアを生成しましょう。

鍵を入れるフォルダに移動しましょう。

```
$cd ~/.ssh
```

はじめて鍵を生成するときは何も入っていないはずです。

次のコマンドで鍵を生成します。

```
$ssh-keygen -t rsa
```
オプションは付けてある記事も見ますが、このコマンドで十分です。

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
何か聞かれたら3回エンターを押せば、
id_rsaとid_rsa.pubの2つの鍵が生成されます。
なお、2回目、3回目はパラフレーズの設定（パスワード設定のようなもの）ですが、ここはなくてオーケーです。（慣れてきたらパラフレーズの設定もありですが、なくていいでしょう。）
既にid_rsaが存在する人は上書きされてしまうので注意です。

違う名前で生成したいときは

```
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):id_git_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```
一回目に聞かれたタイミングで名前(ここではid_git_rsa）を指定。
あとはエンターでid_git_rsaとid_git_rsa.pubが生成されます。

ちなみに、名前を指定しない時は勝手に~/.ssh内に鍵を生成してくれますが、上記のように名前を指定するときは~/.ssh内にいないとこの中に生成してくれないので注意です。

#公開鍵をGitHubにアップする

https://github.com/settings/ssh
で公開鍵の設定が出来ます。（GitHubに登録していることが前提条件です）

画面右上の「Add SSH key」のボタンを押します。
![スクリーンショット 2015-05-29 0.49.40.png](https://qiita-image-store.s3.amazonaws.com/0/40796/e8dedf6e-5168-aaa9-65aa-47654b3cca3d.png)

「title」に公開鍵名、「key」に公開鍵の中身を入れます。
![スクリーンショット 2015-05-29 0.48.38.png](https://qiita-image-store.s3.amazonaws.com/0/40796/a6082f2e-efbd-2528-25c2-241ecdd59a3c.png)

なお、鍵の中身のクリップボードへのコピーは
```$ pbcopy < ~/.ssh/id_rsa.pub``` (Mac)
```$ clip < ~/.ssh/id_rsa.pub``` (Windows)
*鍵の名前は自分の作成したもの。

#接続を確かめる

```
$ ssh -T git@github.com
```
で返ってきたら接続完了!
Hi (account名)! You've successfully authenticated, but GitHub does not provide shell access.

しかし…
鍵を作るときに名前を指定していれば、うまくいかないかもしれません。
それは、ssh接続の際「~/.ssh/id_rsa」、「~/.ssh/id_dsa」、「~/.ssh/identity」しかデフォルトでは見にいかないからです。
それに対応するためには
~/.ssh/configを作成しその中に

```
Host github github.com
  HostName github.com
  IdentityFile ~/.ssh/id_git_rsa #ここに自分の鍵のファイル名
  User git
```
を作成しましょう。
これで、もう一度接続をやってみるとうまくいくはずです。
以下のようにコマンドを打って確かめて見ましょう。

```
ssh -T github
```

#gitHubとやりとりする
GitHubと実際にやりとりするときにID・パスワードを聞かれるときssh接続がうまくいっていません。
レポジトリのディレクトリに入り

```
git config remote.origin.url
```
で確認し　```https://github.com/[ユーザID]/[リポジトリ] ```となっていたら

```
git remote set-url origin git@github.com:[ユーザID]/[リポジトリ].git
```
とする。
~/.ssh/configで設定している場合は

```
git remote set-url origin [Host名]:[ユーザID]/[リポジトリ].git
```
[Host名]とは```~/.ssh/config```の一行目のHostの名前（ここではgithub)のことです。

ちなみに、この設定はレポジトリのディレクトリ内の/.git/configで設定出来ます。

#[追記] 2015.5.31
上記「GitHubとやりとりする」でssh接続について設定するのは面倒で

```:~/.gitconfig
[url "github:"]
	InsteadOf = https://github.com/
	InsteadOf = git@github.com:
```
を追記してあげれば解決でした。
ちなみにpushInsteadOfを使うとpushだけに適用出来るようです。



#参考
[SSHの公開鍵を作成しGithubに登録する手順](http://monsat.hatenablog.com/entry/generating-ssh-keys-for-github)
[GithubにSSH接続できない時の対処法](http://qiita.com/nyanchu/items/32d65c4c36315b876d38)
[githubのリポジトリにアクセスするとパスワードを求められる時の対処](http://qiita.com/nysalor/items/f779898eb88c1ce7be12)
git Githubのコミットの流れ

**Githubへのコミットの流れについて**
1 ファイルをgitに追加（ステージングエリア）
*git add .*
(上記のドットは現在のディレクトリを示す)

このコマンドでコミット待ちの対象となる。このコミット待ちは以下の
コマンドで確認できる。
*git status*

2 1を保存する。
*git commit -m "コミットメッセージ"*

3 gitからGithubへ※
*git push -u origin master*

※githubに最初にpushする場合
git remote add origin https://github.com/<username>/<appname>
LumenにLaravel5のパッケージをいれてみた



Lumenいいですよねー、速くて。
LumenにLaravel5のパッケージをインストールする事があったので、方法を残しときます。

今回、追加したパッケージは[LaravelShoppingcart](https://github.com/Crinsane/LaravelShoppingcart)です。


### Composerでインストール

```composer.json
"require": {
    "laravel/lumen-framework": "5.0.*",
    "vlucas/phpdotenv": "~1.0",
    "gloudemans/shoppingcart": "dev-master"
},
```

### 設定

```bootstrap/app.php
$app->withFacades();

$app->register('Gloudemans\Shoppingcart\ShoppingcartServiceProvider');
class_alias('Gloudemans\Shoppingcart\Facades\Cart', 'Cart');
```

1. `$app->withFacades();`をコメントイン
2. `$app->register()`メソッドでパッケージのサービスプロバイダーを登録
3. Facadeで呼ぶので、`class_alias()`で登録


[IDE Helper](https://github.com/barryvdh/laravel-ide-helper)とか[Generator](https://github.com/laracasts/Laravel-5-Generators-Extended)も試みたんですが、どれでも入れられる訳ではなさそうです。
helper関数の違い等がネックみたいですが。今後に期待です。
TypeScriptでstaticなメンバを持つinterfaceみたいなものを実現する方法


ここ数日、TypeScript+Angularの書き味を試しているのですが、staticなメンバを持つinterfaceを作ったろと下記のような感じで書いてみました。

```typescript
interface Component {
	static name: string;
}
```

すると、staticキーワードに対してこんなエラーメッセージが。

`Property or signature expected.`

（確認したTypeScrptバージョンはv1.5-betaです）

対応していないんだろうなとは思いましたが諦めきれずにぐぐってみると、stackoverflowの２年前のスレッドでstaticなメンバを持つinterfaceみたいなものを実現する方法が紹介されていました。

[How to define static property in TypeScript interface](http://stackoverflow.com/questions/13955157/how-to-define-static-property-in-typescript-interface)

[この回答](http://stackoverflow.com/questions/13955157/how-to-define-static-property-in-typescript-interface/18837239#answer-18837239)

方法としてはinstanceメンバを定義したinterfaceと、staticメンバとして扱うinstanceメンバを定義したinterfaceを作り、それぞれを型チェックされる側とする側で使い分ける、といった感じです。

実際にコードを書いてみるとこんな感じになります。

コードの確認はTypeScript公式サイトでWebブラウザでリアルタイムに確認できて便利です。
参考までに。
http://www.typescriptlang.org/Playground

```typescript
// instanceメンバを定義するinterface
// 型チェックされる側のclassがimplementsする
interface Component {
	getMessage: () => string;
}

// static扱いにしたいメンバを定義するinterface
interface ComponentStatic {
	// #!! ポイント !!#
	// コンストラクタ関数の型を定義する
	// 型は型チェックされる側のinterface
	new (): Component;
	// instanceメンバだが型チェックされる側ではstaticなメンバとして定義
	name: string;
}

class Util {
	// 型をチェックする側のメソッド
	public static printNames(...components: ComponentStatic[]) {
		let names = components.map<string>((component) => component.name).join(',');
		let fooMsg = new Foo().getMessage();
		let barMsg = new Bar().getMessage();
		document.body.innerHTML = [
			`<p>${names}</p>`,
			`<p>${fooMsg}</p>`,
			`<p>${barMsg}</p>`].join('');
	}
}

// 型チェックされる側のクラス定義
class Foo implements Component {
	// #!! ポイント !!#
	// ComponentStaticのメンバを定義しなくてもこのクラス自体にはエラーは発生しない
	// 但し、Util#printNamesの呼び出しでエラーが発生する
	public static name = 'Foo';

	public getMessage() {
		return `hello ${Foo.name}!!!!`;
	}
}

class Bar implements Component {
	public static name = 'Bar';

	public getMessage() {
		return `hi ${Bar.name}????`;
	}
}

// Foo、Barにstaticなnameがされていないとここでエラーが発生
Util.printNames(Foo, Bar);

```

できったっぽい。(・∀・)

## 所感

トリッキーな方法ですがinterfaceを使って実装classに型チェックする側の観点に限定されますがstaticなメンバの定義を義務付ける事が出来ました。

TypeScriptの構造的な型付けという特徴と、コンストラクタ関数のインスタンスも型指定できるということを知る良いきっかけにもなりました。

ですがこの方法は、、

型チェックされる側の実装クラスでstaticなinterfaceの実装漏れ、誤りがあってもエラーが発生せず、型チェックする側を利用するタイミングでしかエラーが発生しないのがコードを書いていて直感的ではないないなぁと感じました。

実装コードもややトリッキーに感じますし、チーム開発で使う場合はなにかしらの説明が必要かと思います。

ちなみに私はもともとJava屋だったのですが、これを調べてる時にそういやJavaのinterfaceもstaticなメソッドとか定義できなかったよなぁとか思っていたらJava8で出来るようになったんですねー。

というこでTypeScript書いていると眠っていたJava脳が蘇ってくる感じがして、積極的にリファクタしたい衝動にかられてええ感じです。

以上。
PHPで同じ画像に一意の同じファイル名を付ける

元々はとあるページで、ユーザーが画像をアップロードし、そのページ上でユーザーが自身でアップロードした画像を利用するという要件でプログラムを書いていた時に、

「ユーザーが付けたファイル名をそのまま上げるのは嫌だけど、毎回timestampで個別のファイル名を付けていたらファイル数膨大になるしなー」

って思ったのがきっかけ。

なら**画像のバイナリのハッシュ値をファイル名にすれば、同じ画像ファイルなら同じファイル名を生成できる**じゃん、と。

```php
$img_dir = "/var/www/foo/images/"; // 画像を格納するディレクトリ

// tmpファイルのパスを取得
$tmppath = $_FILES["upload"]["tmp_name"];

// ファイルの拡張子を取得
$path_parts = pathinfo($_FILES["upload"]["name"]);
$extension = $path_parts['extension'];

// 画像のデータをSHA-1でハッシュ化してファイル名を作る
$imgfilehash = hash_file("sha1", $tmppath);

// 画像格納先のフルパスを生成
$imgfilepath = $img_dir.$imgfilehash.".".$extension;

// tmpから画像を格納
move_uploaded_file($tmppath, $imgfilepath);
```

~~もちろんMD5で変換する以上、偶然違う画像でも同じハッシュ値が出る可能性は0じゃないけど、無視できる確率ではないかと。~~<ins>(15/05/30 コメントでの指摘を元に一部コード修正。またMD5だと衝突する可能性があるそうなので、より安全なSHA-1を採用しました。)</ins>

PHPで書いたけど、他の言語でも同じ手法で使えそう。
ライブラリを使わない素のJavaScriptでDOM操作


jQueryやその他ライブラリを使わない、素のJavaScriptでのDOM操作関連をまとめてみました。

## 要素の検索

```javascript
//id指定
document.getElementById('id');

//class指定
document.getElementsByClassName('class');

//タグ指定
document.getElementsByTagName('div');

//cssセレクタで指定
document.querySelector('#main .posts h1'); //最初の一つを取得
document.querySelectorAll('a');	//すべて取得
```

## 親子兄弟要素へのアクセス

```javascript
//親要素
element.parentNode;

//子要素
element.firstElementChild; //最初の子要素
element.lastElementChild;  //最後の子要素
element.children; //子要素リスト

//１つ前の要素
element.previousElementSibling;

//１つ後の要素
element.nextElementSibling;
```

## 要素の作成・追加

```javascript
//要素の作成
var div = document.createElement('div');
div.textContent = 'hoge';

//最後の子要素として追加
element.appendChild(div);

//最初の子要素として追加
element.insertBefore(div, element.firstChild);
	 
//要素の直前に追加
element.parentNode.insertBefore(div, element); 

//要素の直後に追加
element.parentNode.insertBefore(div, element.nextSibling); 
```

## 要素の削除

```javascript
//特定の子要素削除
element.removeChild(child); 

//自分を削除
element.parentNode.removeChild(element);

//子要素を全て削除
while (element.firstChild) element.removeChild(element.firstChild);

//子要素を全て削除(part2)
element.textContent = null;
```

## 属性の操作
```javascript
//属性の存在チェック
element.hasAttribute('href');

//属性の取得 (存在しない場合はnullもしくは空文字を返す)
element.getAttribute('href');

//属性を設定
element.setAttribute('href', 'http://localhost:3000');

//属性を削除
element.removeAttribute('href');
```

## スタイル関連操作

```javascript
//class追加
element.classList.add('active');

//class削除
element.classList.remove('active');

//classをトグル
element.classList.toggle('active');

//スタイルを直接指定
element.style.backgroundColor = '#ff0000';
```