OmniAICreator/Qiita-1.07M huggingface dataset:
Transmit と Coda を使うとモチベーションが上がる話


### 前置き

スタッフの一人が、プログラミング、サーバーを学んで仕事にしたいと言い出したので、全面的に支援するために、僕も Qiita に参加してます。

あまり、良い記事が書けるとは思わない（もう、随分、プログラミングの世界からは離れている）けど、何か役立つことはないか？と思って投稿していきます。


## はじめに

プログラミングに興味があったり、プログラマと言われる人たちは、「道具にこだわる人が多い」。職業的なプロフェッショナルは、ほぼみんな道具にこだわる。

例えば、「弘法筆を択ばず」とは、 **能力の高い人は、道具がダメでも、まぁまぁな仕事ができるよ** という意味であって、弘法大師は、かなり筆にこだわったらしいです。

プログラミングを始める前のスタッフの身に起こったことを具体例を出して説明します。


## FTPソフトひとつでも、こんなに違う

プログラミング、サーバーに関わる仕事として、種々の作業をしてもらうために、FTPソフトを使ってもらった。

最初は、FileZilla という無料のアプリを使ってもらうことにした。そして、一緒に探求しながら、学ぶことで、素早くFTPの仕組み、FTPアプリの使い方を学んでもらった。

ところが「FileZilla 使いづらい」と僕は感じてしまった。しかも、モチベーションが上がらない・・・・。

そこで、**Transmit** というアプリを使うことにした。

FTPソフトが無料で手にはいる時代に、 4800円も出して購入した。ちなみに、僕は、Transmit4 を持っている。今のバージョンは、Transmit5 だ。

見た目が随分違う。

![Transmit5](https://qiita-image-store.s3.amazonaws.com/0/193970/2692a9c3-a758-18e9-5e34-991eefc6f051.png)
Transmit5 の様子



![Transmit 4](https://qiita-image-store.s3.amazonaws.com/0/193970/3af71d2b-54fb-b619-ebce-97d1dc242d11.png)
Transmit4 の様子



結果、どうなったか？

- 仕事楽しい！
- 使いやすい！
- 気持ちい！
- モチベーション上がる！

さらに、こんなことを言っていました。

- FileZilla

たかだか、4,800円でモリモリ仕事をしてくれるようになるなら、有料ソフトの甲斐がある。しかも、使いやすく、作業ミスしづらくなっていい感じ。


## ついでにエディタも、有料アプリに

この Transmit をリリースしている Panic という会社が出しているプログラミングエディタも導入することにした。こちらは、 Coda。

<img width="700" alt="Coda" src="https://qiita-image-store.s3.amazonaws.com/0/193970/ebd818b0-97c1-7aec-cdc4-8bfdb74894d9.png">

これも、やっぱり綺麗だし、使いやすい。
モチベーションが上がる。

ということで、


## 結論

- 道具にはこだわろう
- 有料アプリのデザイン性の優れたものを選ぼう
- スタッフには、アプリで投資しよう
- きっと、大きなリターンが得られるはず、しかも早い段階で


## コメントでいただいたおすすめアプリ一覧

以下のアプリは、体験版があるので実際に使うのが一番。いろんなネットの評判より触ってみましょう。機能は十分あります。

- [Coda (自薦）](https://panic.com/jp/coda/)プログラミングエディタ
- [Transmit](https://panic.com/jp/transmit/) FTPソフト
- [Espresso](https://espressoapp.com) CSSエディタ(HTMLも、もちろん)
- [BBEdit](https://www.barebones.com/products/bbedit/) プログラミングエディタ


## あとがき

Qiita 初めて使いました。なかなか、Markdown でシンプルに書くので楽しい。あまり書くネタがないけれども、そして、プログラマの方々には、ほとんど貢献することはないだろうけど、何か書こう。
rails sしたら dyld: lazy symbol binding failed: Symbol not found:

今までみたことのないエラーがでた。

```
$ rails s
dyld: lazy symbol binding failed: Symbol not found: _rb_data_typed_object_alloc
  Referenced from: /Users/UserName/.rvm/gems/ruby-2.3.1/gems/debug_inspector-0.0.2/lib/debug_inspector.bundle
  Expected in: flat namespace

dyld: Symbol not found: _rb_data_typed_object_alloc
  Referenced from: /Users/UserName/.rvm/gems/ruby-2.3.1/gems/debug_inspector-0.0.2/lib/debug_inspector.bundle
  Expected in: flat namespace
```

なんだこれ。
前日に新しいrailsのバージョンとかいれたからかな。。と思い、とりあえず

```
bundle install --path vendor/bundler
```

長い。。

終わった。

```
$ rails s
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2017-07-26 19:01:23] INFO  WEBrick 1.3.1
[2017-07-26 19:01:23] INFO  ruby 2.3.1 (2016-04-26) [x86_64-darwin14]
[2017-07-26 19:01:23] INFO  WEBrick::HTTPServer#start: pid=26637 port=3000
```
できた。
AWSアカウントを2段階認証にしてみた（MFA&Google Authenticator）

#はじめに
僕の周りで、AWSのアカウントが盗まれて150万円の請求がきました。。。。。
自分もAWSアカウントを持つ身として、何か対策をせねばと思い、
第一弾として2段階認証を導入します。


#やること
AWSアカウントへのログインを2段階認証にします。
⇒普段の認証に加えて、iPhoneのアプリ（Google Authenticator）が発行するワンタイムパスワードを使ってログインを行います。


#前提
- iPhoneにGoogle Authenticatorがインストールされていること。


#MFA（2段階認証）設定手順
1.AWSコンソールにログインし、IAMの画面に行きます。
>[サービス]⇒[IAM]
![01.png](https://qiita-image-store.s3.amazonaws.com/0/168635/106b7641-772b-09e1-d97c-86f26042bd05.png)

2.セキュリティステータスを確認します。
>MFAが有効化されていない！
>他にも警告マークがでていますが、本稿ではMFAの手順のみ扱います。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/168635/5648fc07-f684-351e-36d2-011f8a8eb5b7.png)

3.[MFAの管理]を押下する。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/168635/bc107222-6424-8785-c846-b33f5993d860.png)

4.[仮想デMFAバイス]にチェックをし、[次のステップ]を押下する。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/168635/ecddae98-2d93-31ac-48c4-7f23eb1eea05.png)

5.[次のステップ]を押下する。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/168635/0048fd18-c57c-6ce6-789e-35c2a52b3ae5.png)

6.Google Authenticatorを立ち上げ、表示されたQRコードを読み取ります。(iPhone上の操作)
アプリ起動⇒右上の[＋]⇒[バーコードをスキャン]
![IMG_2303.PNG](https://qiita-image-store.s3.amazonaws.com/0/168635/2c5a7cb8-0a19-4427-305a-4baf97e18e07.png)

7.表示された6桁の番号を入力して、[仮想MFAの有効化]を押下する。
>Google Authenticator内に表示される6桁の数字は、時間が経過する新しいものが表示されます。
>[認証コード1]と[認証コード2]は、連続して表示された数字を記入して下さい。
>**「2つの連続した6桁の数字」を各認証コードに入れることで認証が可能になります。**
![IMG_2304.PNG](https://qiita-image-store.s3.amazonaws.com/0/168635/7cb979bf-2b4d-65bb-4d3f-8291818d9d33.png)

![06.png](https://qiita-image-store.s3.amazonaws.com/0/168635/b7847a23-814a-50c2-0055-5253ed3e101e.png)
これで設定は完了です。

8.実際にログインしてみましょう。
>まずはいつも通りにログインする。
>すると、2段階目の認証画面が表示されました。
>Google Authenticatorを起動して、表示される6桁の数字を入力して[サインイン]してください。
![07.png](https://qiita-image-store.s3.amazonaws.com/0/168635/58ce6098-03c9-f087-4279-bef0910d443e.png)



以上です。
アカウントの乗っ取りには気を付けましょう。
2段階認証だけではなく、「IAMパスワードポリシー」の適用などほかにも対策するのがベストです。
React Stateless Functional Componentを使うといい９つのポイント！（Class Based との違い）

それではいきます。

## 1 Classが必要ない
constructorをつかわなくてもいいし、コードがシンプルになる。

## 2 thisが必要ない
class based componentではTHISが必要だけど、functional componentではthisがいらない。thisって混乱しやすいから使わなくてもいいのはとっても楽！

```.js
// With THIS
<a onClick = {this.sayHi.bind(this)}>Say Hi</a>

// Without This
<a onClick = {sayHi}>Say Hi</a>

```

ちなみに、bindはstatelessのコンポーネントの場合は必要ない。

## 3 UIに特化できる
Stateless function componentはpresentational componentsにとって都合がいい。presentational componentというのはふるまいよりもUIに特化したコンポーネント。presentational componentでは状態を保持しない。そのため、このコンポーネント内では状態を気にする必要はない。そのかわり、親のコンポーネントで状態を保持し管理する必要がある。

## 4 短文ですむ
stateless functional componentにすると通常よりも最大２０％コードが減る。

```statefulComponent.js
import React from 'react';

default export class helloWorld extends React.Component {
  render() {
    return (
      <div>{`Hi ${name}`}</div>
    )
  };
};

```

```statelessComponent.js
import React from 'react';

default const HelloWorld = ({name}) => (
  <div>{`Hi ${name}`}</div>
);
```

## 5 コードがより完結する
stateless functional componentを使うと、その時点で使用するデータはシンプルなargumentsに限定されるため、シンプルでより完結したコードになる。

## 6 バグの修正がらくだしバグを防げる
class based componentは複雑になりやすく、どこを参照しているのかわからなくなったり、どのコンポーネントからデータを持ってきているのか混乱を起こしやすい。一方、stateless componentだと明らかにどのfunctional componentとargumentsと伝達されたのかがわかりやすい。バグを防げるし、バグが起こった時も修正をしやすい。

## 7 高い解読性
stateless functional componentはシンプルなので理解しやすい。たとえfunctionがネストされていてもその中はシンプル。

## 8 テストのしやすさ
functionはシンプルでテストの宣言もとてもストレート。独立してテストができ、モックも必要がなく、トリッキーなテストの技術も必要ない。

## 9 パフォーマンス性
パフォーマンスが高く、ライフサクルについて心配する必要もない。

## まとめ
上記の理由から、可能な時はstateless functional componentsを使うよう努力するのが賢明といえる。


## 個人の感想
functional componentsをできるだけ使うべきという意見もあるが、大は小をかねるの考えでいくなら、１ファイル１つ、class based componentを作り、そこにfunctionを加えたい場合はstateless functional componentを作るという考えもあるのでは。functional componentを作ってからstateを使用する必要性に迫られて書き直すのも手間かかりそう。
個人的には、１ファイル１class based component、stateが不必要なことが明確な場合はstateless functional componentを使いたい。

> 引用
> https://hackernoon.com/react-stateless-functional-components-nine-wins-you-might-have-overlooked-997b0d933dbc
[Pythonによる科学・技術計算] 2次元ランダムウォーク(酔歩問題), 数値計算

乱数を利用した2次元[ランダムウォーク](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%AF)のシミュレーションを行う。

1ステップを1とし， 原点(0,0)からスタートして二次元平面上をランダムウォークする。



```py3

import numpy as np
from random import random
import matplotlib.pyplot as plt
from math import *
"""
2次元ランダムウォーク
"""

N_calc_list = [10]
x, y, r = 0, 0, 0
R_list=[]

N=100000

x_list=[0]
y_list=[0]
for n in range(N):
    theta=2.0*pi*random()#角度θ(2pi単位)をランダムにするため，random()を使って[0,1]の一様乱数を発生させる。
    x = x+cos(theta) # x方向への移動。cos(θ)。
    y = y+sin(theta) # y方向への移動。sin(θ)
    x_list.append (x) # xの値をx_listに格納していく
    y_list.append(y) # yの値をx_listに格納していく
   
# for plot
plt.plot( x_list,y_list) # (x,y)のプロット
plt.xlabel('X ') # ｘ軸のラベル
plt.ylabel('Y') # y軸のラベル
plt.xlim([-120,120])  # x軸の範囲
plt.ylim([-120,120]) # y軸の範囲
plt.show()

```

##結果



![t.png](https://qiita-image-store.s3.amazonaws.com/0/192457/a65ee5c6-922a-7295-1848-43451ffa1f55.png)

(0,0)をスタート位置とし，100000歩移動の軌跡




![t2.png](https://qiita-image-store.s3.amazonaws.com/0/192457/3ba0e294-03e5-bb63-d827-33c5a292d9ef.png)
原点(0,0)からの距離Rと移動ステップ数Nの関係。x軸を$N^{1/2}$でプロットしている。オレンジ線は$N^{1/2}->∞$でえられる理論値。
SQL Severでxml列のデータを扱う時用メモ


SQL Serverでxmlを扱いたいときにはxqueryを使う必要がある。
変数ではなく、xml列にデータが入っている際の扱いに関して、たまに使うときにわすれてしまうのでメモ

■Bulk InsertするときのCSVの中身
※当たり前だけど、xml列に対してxqueryを投げるために、Bulk Insertするときはxml列のデータ形式は「xml」を指定する必要がある（vacharとかじゃだめ）


```CSV
id,xml
2,<root><item id="1">1</item><item id="3">2</item><item id="2">3</item><item id="5">4</item></root>
3,<root><item id="1">1</item><item id="4">2</item><item id="2">3</item><item id="6">4</item></root>
```

■Bulk Insterのためのクエリ

```sql
CREATE TABLE src (
  id varchar(33),
  xml xml NULL
);

BULK INSERT src
FROM 'ファイルパス'
WITH
(
   DATAFILETYPE='char',
   FIRSTROW=2,
   FIELDTERMINATOR = ',',
   ROWTERMINATOR = '0x0a'
);

```

■テーブルの中身

![Kobito.0Kkk2c.png](https://qiita-image-store.s3.amazonaws.com/0/41877/d57a7b5a-96d8-d9d1-7222-26e16e69fbe4.png "Kobito.0Kkk2c.png")


■xml列の中身

```xml
<root>
  <item id="1">1</item>
  <item id="3">2</item>
  <item id="2">3</item>
  <item id="5">4</item>
</root>

```

■取得するためのクエリ

```SQL
select
	id,
    t.item.query('.') as Item,
    t.item.value('@id','char(50)') as id,
    t.item.value('.','char(50)') as content
from src
cross apply xml.nodes('/root/item') as t(item);

```

■取得内容

![Kobito.uBbUUz.png](https://qiita-image-store.s3.amazonaws.com/0/41877/b766f467-9385-ba9d-4b88-16990ebde83a.png "Kobito.uBbUUz.png")
SQL Server(T-SQL)まわりのクエリメモ


■データベース作成

```sql
CREATE DATABASE データベース名;
```

■データベース指定

```sql
use データベース名;
```

■テーブル作成
※下記の例では、主キーに複合キーを指定
※データ型一覧は[ここ](https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-types-transact-sql)を参照

```sql
/*通常の作成方法*/
CREATE TABLE テーブル名 (
  column_a varchar(33),
  column_b int NULL,
  column_c int NULL
  PRIMARY KEY (column_a,column_b)
);

/*Select結果から作成する方法*/
select * into 作成するテーブル名
from 参照元のテーブル名
;
```

■テーブル削除

```sql
DROP TABLE テーブル名;
```


■データのインサート（BULK INSERT)
※下記の例では、2行目からのINSERTを想定

```sql
/*SJIS LFかつTSVファイルの場合*/
BULK INSERT テーブル名
FROM 'ファイルパス'
WITH
(
   DATAFILETYPE='char',
   FIRSTROW=2,
   FIELDTERMINATOR = '\t',
   ROWTERMINATOR = '0x0a'
);

/*SJIS LFかつCSVファイルの場合*/
BULK INSERT テーブル名
FROM 'ファイルパス'
WITH
(
   DATAFILETYPE='char',
   FIRSTROW=2,
   FIELDTERMINATOR = ',',
   ROWTERMINATOR = '0x0a'
);

/*その他の文字コードの場合はROWTERMINATORを下記に変更*/
   ROWTERMINATOR = '\n'
   
/*下記のように書くと、Insertに失敗した場合に、エラー要因と行を特定することができる*/
BEGIN TRY
BULK INSERT テーブル名 FROM 'ファイルパス'
WITH (ファイル構造情報)
END TRY
BEGIN CATCH
SELECT
        ERROR_NUMBER()    AS ErrorNumber,
        ERROR_SEVERITY()  AS ErrorSeverity,
        ERROR_STATE()     AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE()      AS ErrorLine,
        ERROR_MESSAGE()   AS ErrorMessage;
END CATCH

```

■カラム名の変更

```
USE データベース名
Go
EXEC sp_rename 'テーブル名.カラム名', '変更後のカラム名', 'COLUMN';
Go
```
Unity3D: Application.LoadLevel フリーズ

Application.LoadLevel("Hello");を使うと、時々ゲームがフリーズする。
下記のように修正すれば問題を解決する。

```csharp
　　//Application.LoadLevel("Hello"); // Appがフリーズするぞ～～～ 
　　StartCoroutine (ReloadLevel("Hello")); 
　　private IEnumerator ReloadLevel(string name) 
　　{ 
　　　　yield return Resources.UnloadUnusedAssets(); 
　　　　Application.LoadLevel(name); 
　　}
```
長らく放置していたVisual Studio Codeのインテリセンスが出なくなったときの対処法(備忘録)

# Windwos版の場合
- vscodeの拡張機能を全部アンインストール。
- vscode自体をアンインストール。
- 全部入れ直す。

# 2019/01/15 Windows版の場合 追記分
- 実は上記の通りだけだとインテリセンスが中途半端に直ってしまっている場合がWindows版でも起きていた。
- Windows版でもC:\Users\ (UserName) \AppData\Roaming\Code以下にあるファイルをすべて削除することで一旦VScodeをまっさらな状態にすることが出来る。
- これでWindows版でもインテリセンスが効かなくなってしまったときに対処できます。

# Mac OS X版の場合
- Windows版での対処法だと中途半端に直ってしまう(intとかstringはインテリセンスが効かなくて他のスニペットは効くとか)。
- 各拡張機能の削除とApplicationフォルダからvscodeを削除するだけでなく、/Users/(Finderの内包しているフォルダを選択した時に出るやつ)/Library/Application SupportのCodeフォルダも削除する。
- 再度全部入れ直す。

これで自分はインテリセンスが効かないのは今のところ無くなった。もしかしたらまだ問題は残ってるかも・・・
PHPExcel の使い方。よく使うエクセル操作

## 準備

```:セル取得
$cell = $sheet->getCellByColumnAndRow(列, 行)->getCoordinate();
```

## ここから

```:セルに入力
$sheet->setCellValueByColumnAndRow(列, 行, "文言");
```

```:横書き
$sheet->getStyle($cell)->getAlignment()->setTextRotation(0);
```

```:太字
$sheet->getStyle($cell)->getFont()->setBold(FALSE);
```

```:フォントサイズ
$cell = $sheet->getCellByColumnAndRow(列, 行)->getCoordinate(); // セル取得
$sheet->getStyle($cell)->getFont()->setSize(8); // サイズ 8 に
```

```:文字を水平方向に中央寄せにする
$sheet->getStyleByColumnAndRow(列, 行)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
```

```:文字を垂直方向に中央寄せにする
$sheet->getStyleByColumnAndRow(列, 行)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
```

```:セルボーダー枠をつける
$sheet->getStyle($cell)->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN);
```

```:セルに色付け
$sheet->getStyle($cell)->getFill()->getStartColor()->setRGB('ff0000'); // 赤
```

```:取り消し線
$sheet->getStyleByColumnAndRow(列, 行)->getFont()->setStrikethrough(TRUE);
```

```:高さ調整
$sheet->getRowDimension(行)->setRowHeight(20);
```

```:幅調整
$char = "AA";
$sheet->getColumnDimension($char)->setWidth(30);
```
apt-get updateで404

#発端

Ubuntu 14.04 LTSを16.04LTSにアップグレードしようと思ったが，

`sudo apt-get update`

で404エラー続出．
無視して以下を実行しようとするものの

```
sudo apt-get upgrade
sudo do-release-upgrade
sudo reboot
sudo do-release-upgrade -d
sudo reboot
```

404エラーのせいで`sudo do-release-upgrade`が止まる．

#ネット上で見かける解

http://qiita.com/ytyng/items/76784390a538bbb5117e
によると404エラーは古いバージョンのUbuntuを使っていると置きるらしく，

`/etc/apt/source.list`

に含まれるsecurity.ubuntu.comとarchive.ubuntu.comをold-release.ubuntu.comに置換すればいいとされる．
それは以下のコードで一発．

`sudo sed -i -e 's/archive.ubuntu.com\|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list`

しかし，やはり404エラーが出る．

Ubuntu 14.04 LTSの通称はtrustyだが，

http://old-releases.ubuntu.com/ubuntu/dists/

を見ると，trustyが含まれていない．
つまり，trustyはまだold-releaseではないらしいのだ．

#結局どうするか

source.listを初期化してみたところうまくいった．

```
sudo rm /etc/apt/sources.list
sudo -i software-properties-gtk
```

を実行した後，適宜レポジトリを選択し直す．
今回は
https://askubuntu.com/questions/124017/how-do-i-restore-the-default-repositories
を見ながらGUIで行った．

これで


```
sudo apt-get update
sudo apt-get upgrade
sudo do-release-upgrade
sudo reboot
sudo do-release-upgrade -d
sudo reboot
```

すれば無事更新されるはずだ．

#おまけ: \bootの空き容量が足りない!

無事に行くと思ったらまた`sudo do-release-upgrade`で躓いた．
今度は`\boot`の空き領域が足りないらしい．
これは古いバージョンのカーネルを削除すればOK

`dpkg -l linux-image-\* | grep ^ii`

でインストールされているカーネルの一覧を出し，古いものを削除する

`apt-get purge linux-image-hogehoge`
Qiita タスクリスト動作確認

チェックリストに使えるか等の確認用になります。
履歴にいつ何をチェックしたというのが取れるんでしょうか？

- [x] サーバ側に更新用のAPIを用意する
- [x] Markdownを変換するとinput要素が出力されるようにする
- [ ] チェックボックスをクリックしたときにtextareaの中身を書き換える
- [ ] textareaが変更されたときにAPIと通信する
私が本当に使っているZshの設定一覧

# はじめに
- Zshの補完機能が便利と聞いたので最近導入しました。
- どこかで広める機会や再設定する場合などに備えて残しておきます。
- bashと比べるともう少しヒストリについてはカスタマイズする必要あるかもしれません。（見た目やhistoryみたいときに出てこないので）

# プロンプトカラーの設定
``` zsh:~/.zsh.d/setting.zsh
autoload -Uz colors
colors

PROMPT="%{$fg[green]%}%m%(!.#.$) %{$reset_color%}"
PROMPT2="%{$fg[green]%}%_> %{$reset_color%}"
SPROMPT="%{$fg[red]%}correct: %R -> %r [nyae]? %{$reset_color%}"
RPROMPT="%{$fg[cyan]%}[%~]%{$reset_color%}"

export CLICOLOR=true
export LSCOLORS='exfxcxdxbxGxDxabagacad'
export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=36;01:cd=33;01:su=31;40;07:sg=36;40;07:tw=32;40;07:ow=33;40;07:'

# Vim
bindkey -v

# 履歴ファイルの保存先
HISTFILE=~/.zsh_history

# メモリに保存される履歴の件数
export HISTSIZE=1000

# 履歴ファイルに保存される履歴の件数
export SAVEHIST=100000

# 重複を記録しない
setopt hist_ignore_dups

# 開始と終了を記録
setopt EXTENDED_HISTORY

# historyを共有
setopt share_history

# ヒストリに追加されるコマンド行が古いものと同じなら古いものを削除
setopt hist_ignore_all_dups

# スペースで始まるコマンド行はヒストリリストから削除
setopt hist_ignore_space

# ヒストリを呼び出してから実行する間に一旦編集可能
setopt hist_verify

# 余分な空白は詰めて記録
setopt hist_reduce_blanks

# 古いコマンドと同じものは無視
setopt hist_save_no_dups

# historyコマンドは履歴に登録しない
setopt hist_no_store

# 補完時にヒストリを自動的に展開
setopt hist_expand

# 履歴をインクリメンタルに追加
setopt inc_append_history

# 全履歴を一覧表示
function history-all { history -E 1 }

# インクリメンタルからの検索
bindkey "^R" history-incremental-search-backward%
```
# zplugの設定 
```zsj:~/.zsh.d/zplug.zsh
export ZPLUG_HOME=/usr/local/opt/zplug
source $ZPLUG_HOME/init.zsh

cache_dir=$HOME/.zplug/cache

if [ -d $cache_dir ]; then
  plugins=$HOME/.zsh.d/zplug_plugin.zsh
  cache=$cache_dir/interface

  plugin_date=$(date -r $plugins +%s)
  cache_date=$(date -r $cache +%s)

  # echo $package_date $cache_date
  if [ ! -d $cache_dir -o $plugin_date -gt $cache_date ]; then
    . $HOME/.zsh.d/zplug_plugin.zsh
  fi
else
  . $HOME/.zsh.d/zplug_plugin.zsh
fi

if ! zplug check --verbose; then
  printf "Install? [y/N]: "
  if read -q; then
    echo; zplug install
  fi
fi

zplug load
```

# zshの基本設定を集約
```zsh:~/.zshrc
export LANG=ja_JP.UTF-8

export PATH=$HOME/bin:$PATH
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH

# setting
source ~/.zsh.d/setting.zsh

# zplug
source ~/.zsh.d/zplug.zsh

typeset -U path cdpath fpath manpath
```
【メモ】Laravelで画像アップロードしようとしたらフォームの記述が足りなくてアップ出来なかったのでメモ

普通に以下のようにフォーム記述したが、
何故かファイル名しか送信出来ていなかった。
(送信先で$_FILESでvar_dumpするとemptyになった)

```html
<form class="form-group" method="post" action="{{ url('/users/'.$user->id) }}">
   {{ csrf_field() }}                
   {{ method_field('PATCH') }}                     
   <input type="file" name="img_path">
   <input type="submit" value="変更">
</form>
```

フォームを以下のように変更するとうまく行った。

```html
<form class="form-group" method="post" action="{{ url('/users/'.$user->id) }}" enctype="multipart/form-data" files='true'>
   {{ csrf_field() }}                
   {{ method_field('PATCH') }}                     
   <input type="file" name="img_path">
   <input type="submit" value="変更">
</form>
```

【参考】
http://laraweb.net/tutorial/1283/
【Python】argparse で -h オプションを使いたい

## argparse で `-h` オプション使うとエラーが出る問題
Pythonの `argparse` を使ってオプションの管理を行うときに、例えば高さの指定に`-h`オプションを付けたいときありますよね。

```Python:example.py
parser = argparse.ArgumentParser(description = "hogehoge")
parser.add_argument("-h", type=int, help = "Height is necessary.", required=True)
```

しかし、`-h` オプションを追加するとエラーとなります。

```
argparse.ArgumentError: argument -h: conflicting option string: -h
```

この `-h` オプションは `argparse` の方で予めHelp用のオプションとして管理されているため、オプションが競合してしまいます。

## `-h` オプションを使うには
Helpオプションが必要ないプログラムだと、parser生成部分で`add_help=False` を指定して、`argparse` 側のHelpオプションを無効にすると使えるようになります。

```Python:example.py
parser = argparse.ArgumentParser(description = "hogehoge", add_help=False)
```

### 参考文献
https://stackoverflow.com/questions/14950964/overriding-default-argparse-h-behaviour
codeigniterで独自のバリデーションルールを作成する。4バイト（絵文字）文字を禁止にする。

APIにエラーを送る時の方法

通常のcodeigniterでのバリデーションルールと独自に作成したバリデーションルールの設定方法。

```php:controller
function get_bpass() {
　　$form = $this->input->post();


　　//codeigniterのバリデーションルールを走らせる。
　　$this->form_validation->set_rules($this->Backup_model->rules[__FUNCTION__]);
　　if (!$this->form_validation->run()) {

			$this->form_validation->set_error_delimiters('', '');
			$error = [
				'error' => trim(validation_errors()),
			];
			$this->json_library->_echo(201, $form, $error, validation_errors());
		}

　　　//独自バリデーション（_is_valid_text）を走らせる。
		$this->form_validation->set_rules($this->Backup_model->rules['search_is_valid_string']);
		if (!$this->form_validation->run()) {
			$this->form_validation->set_error_delimiters('', '');
			$error = [
				'error' => trim(validation_errors()),
			];
			$this->json_library->_echo(201, $form, $error, validation_errors());
		}


//独自のバリデーションルール。
//ここでは4バイト文字（絵文字とか）を弾く処理
//アンダーバー（_）を先頭に付けないとURLが生成されちゃうので注意。付けること。
public function _is_valid_text($text) {
		if (preg_match('/[\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF]/', $text)) {

　　　　　　　//第一引数に＿付けるのを忘れずに。
			$this->form_validation->set_message('_is_valid_text', '使用できない文字が含まれています。');
			return false;
		}
		return true;
	}

//　　以下処理省略

}
```

```php:model
	public function __construct() {
		parent::__construct();


		$this->rules['is_valid_string'] = [
			array(
				'field' => 'B_PASS',
				'label'=>'名前',
　　　　　　　　　　　　　　　　　　//ここでcallbackする事で独自のバリデーションルールを呼び出せる。
				'rules' => 'trim|callback__is_valid_text',
			),
			
		];
		$this->rules['get_bpass'] = [
			[
				'field' => 'UUID',
				'rules' => 'required',
			],
			[
				'field' => 'B_PASS',
				'label' => 'パスワード',
				'rules' => 'required|min_length[6]|max_length[16]|alpha_numeric|trim',
			],
		];
	}

```
AWS Rekognitionを使ってみた（実行編）

<a href="http://qiita.com/nanamae/items/469a67cd9d2e37edb0e5">コチラの記事</a>で設定した**AWS Rekognition**をAWS CLIで実行してみました。
ここでは、実行した結果を記載しています。

##Rekognitionを実行してみた

初めに、使いたい画像をCloud9にアップします。
使用可能な画像の形式は、**JPEG / PNG** だそうです。
次に、**AWS S3**に`nana-test-bucket`というバケットを作成しました。
そして、S3に使用する画像のアップ。

```
$ aws s3 cp ./ImageName s3://BucketName/
```

###1. detect-labels（画像内のラベルを検出）
最初に私が使用したのは、`detect-labels `です。
以下で実行ができます。


```
$ aws rekognition detect-labels --image "S3Object={Bucket=BucketName,Name=ImageName}" --region RegionName

```
実行してみたところ。。

![labels-error.png](https://qiita-image-store.s3.amazonaws.com/0/193729/9230518b-cb20-de04-300b-e9b401844ef5.png)

エラーった。。
そこで、コマンドの最後に`--no-verify-ssl`を追加して再度実行してみたところ。。

![labels-done.png](https://qiita-image-store.s3.amazonaws.com/0/193729/451da4df-2809-80b4-f2d8-8241f3ba4f4d.png)

![labels-result.png](https://qiita-image-store.s3.amazonaws.com/0/193729/6828348f-c960-143c-7003-cb0cb1684caf.png)

できたー！こんな感じの結果が帰ってきました。

###2. detect-faces（顔の検出）
次に使用してみたAPIは、`detect-faces`です。
以下で実行できます。

```
$ aws rekognition detect-faces --image "S3Object={Bucket=BucketName,Name=ImageName}" --attributes "ALL" 

```
実行結果はこちら↓↓
![detectfaces-result.png](https://qiita-image-store.s3.amazonaws.com/0/193729/e74e1b0c-471e-2896-380d-32a62dcf9b4a.png)

**attributesを"ALL"にする**と、こんな風にいっぱい結果が帰ってきます。
**attributesをつけずに実行した場合**は、顔の位置やポーズなどの結果だけ帰ってきました。

###3. compare-faces（顔の比較）
`compare-faces` APIを使用してみました。
Cloud9に比較させたい画像をアップし、S3の自分のバケットにもアップします。

実行するためのコードは、以下です。

```
$ aws rekognition compare-faces --source-image "S3Object={Bucket=BucketName,Name=ImageName}" --target-image "S3Object={Bucket=BucketName,Name=ImageName}" --region RegionName

```
 
実行結果はこちら↓↓
![compare-result.png](https://qiita-image-store.s3.amazonaws.com/0/193729/6932ede2-f17a-886f-e7d5-d15e10b2f44f.png)

今回は、顔がマッチしたので、`Similarity`や`Face`などの分析結果が帰ってきました。
ちなみに、ジョニーデップの通常の顔写真とウィリー・ウォンカ（チャーリーとチョコレート工場）の顔写真を比較したところ、さすがにマッチしませんでした。残念。。


###4. detect-moderation-labels（画像の節度検出）
最後に使用したのが、`detect-moderation-labels`です。
実行するためのコードは、以下です。

```
$ aws rekognition detect-moderation-labels --image "S3Object={Bucket=BucketName,Name=ImageName}" --region RegionName

```

今回これで私が検出した画像は、銃の画像と水着姿の女性の画像です。
銃の画像で実行した結果がこちら↓↓

![moderation-result01.png](https://qiita-image-store.s3.amazonaws.com/0/193729/f388ec06-6de5-cd47-ab1c-8847b58530d0.png)
とくに何も不適切なものはなさそうです。

次に、水着姿の画像で実行した結果↓↓
![moderation-result02.png](https://qiita-image-store.s3.amazonaws.com/0/193729/5782f447-fd4b-6c8a-9a11-d656d6830196.png)
なんか不適切っぽい（？）肌の露出が多いからですかね。。
分析した結果に、`Swimwear or Underwear`と書いてあるので
しっかり分析されていることが分かりました。感動！！


以上が、AWS Rekognitionを使ってみた結果でした。
次は、SDKで実行してみることにします。
ありがとうございました！

API使用に関しての参考＆詳細はコチラ。
>http://docs.aws.amazon.com/ja_jp/rekognition/latest/dg/get-started-exercise.html
AWS Rekognitionを使ってみた（設定編）

こんにちは〜〜！
AWSの人工知能サービスの**Rekognition**を
Cloud9（ブラウザ上の統合開発環境）上で使ってみました。
この記事では、私が行なった**環境設定**を記録していきます。

##Rekognitionとは
**Rekognition**とは、画像の分析をアプリケーションに追加できるサービスです。
このサービスでは、画像内の物体やシーン、顔の検出が行えます。
また、顔の比較なども実行可能です。

##Rekognitionの実行環境を設定してみた
Rekognitionの利用開始には、次の２つが必要です！

**1. AWS CLI(Command Line Interface)の設定**
**2. AWS SDKの設定**

まず、Webブラウザ上でCloud9を開きます。
次に、_Create a new workspace_でWorkspaceを作成します。
今回、私は、以下のようにWorkspaceを作成しました。
![workspaceImage.png](https://qiita-image-store.s3.amazonaws.com/0/193729/f0855016-c494-849c-f34c-0d736c3d842c.png)
Workspace nameは _aws_rekognition_ 、Templateは _Python_ を選択しました。

###1. AWS CLI(Command Line Interface)の設定

Cloud9にAWS CLIをインストールするのに参考にした記事はコチラです。
>http://yuki-dev.hatenablog.com/entry/20170206/1486375678

ここに記載してあった通りにコマンドを打ったらいけました！
Cloud9のbashに打ったコマンドは以下です。

```
$ sudo apt-get update　//apt-getのアップデート
$ sudo apt-get install python2.7-dev　//python2.7-devのインストール
$ sudo pip install awscli　//CLIのインストール
```

AWS CLIのインストールが完了したら、`$ aws --version`で確認できるようなのですが、、
私の場合はコマンドを叩いても表示されませんでした。。。
なので、`$ aws`と打ち込んでみたところ。。

![botocore-error.png](https://qiita-image-store.s3.amazonaws.com/0/193729/057b3e9e-ea91-22c0-a6ea-56742a98c72a.png)

`botocore`っていうモジュールがないよと言われました（泣）
そこで、`$ sudo pip install botocore`でbotocoreをインストール。

![botocore-error2.png](https://qiita-image-store.s3.amazonaws.com/0/193729/3c1d56c9-c740-c1bd-0c8e-11330b160241.png)
なんかもうすでにあるっぽい、、？
ので、`$ sudo pip install awscli --force-reinstall --upgrade`でCLIを再インストール。

`$ aws`で確認してみたところ。

![reinstall.png](https://qiita-image-store.s3.amazonaws.com/0/193729/b368b47a-df8b-463c-04bd-c2c95f3bc052.png)
`ImportError`は消えてました！なんかいけたっぽい（？）わーい！

ということで、次へ。

###2. AWS SDKの設定

AWS SDKは、Amazon Rekognition APIを呼び出すのに必要みたいです。
そこで、今回はAWS SDK for Pythonのインストール。
打ち込むコマンドは、以下です。

```
$ sudo pip install boto3
```

インストールが完了したら、設定に移ります。
設定をするためには、`$ aws configure`を打ちます。

![aws-configure.png](https://qiita-image-store.s3.amazonaws.com/0/193729/c2a4791e-46ea-651b-a269-aaa84f96d32e.png)
こんな感じのが出てくるので、自分の **[credentials.csv]** に記載されてある
`Access Key ID`,`Secret Access Key`と`region`,`output format`を設定します。

あとは、設定されているか確認できたら実行環境の設定は完了です！
AWS SDK for Python インストールの参考HPはコチラ。
> https://aws.amazon.com/jp/sdk-for-python/


実行してみた記事は<a href="http://qiita.com/nanamae/items/682a400cb4aaa8f36f81">コチラ</a>です。
VScodeのMarkdownからPDF変換時に改ページを挿入

# 概要
- VScode で書いた記事をPDFへエクスポートする際に任意の行で改ページしたい

# 前提
- Markdown PDF( https://github.com/yzane/vscode-markdown-pdf/ )を利用

# 方法
- CSSの改ページコードを挿入する( 参考: http://www.tagindex.com/stylesheet/page/page_break.html )

# コード
- MarkDown文書の改ページしたい行に下記のcssコードを挿入して PDFへエクスポートすると改ページされる。

```
<div style="page-break-before:always"></div>
```
Bluemix の Cloudant に python3 で画像ファイルをアップロード

次の操作の逆です。
requests でなく、pycurl を使っています。

[Bluemix の Cloudant から、python3 で画像ファイルをダウンロード](http://qiita.com/ekzemplaro/items/5fcc8643a8a7711bca5b)

DSCF0001.jpg DSCF0002.jpg の２つの画像ファイルをアップロードする例です。

```py3:to_cloudant_pycurl.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	to_cloudant_pycurl.py
#
#						Jul/26/2017
#
import sys
import pycurl
# --------------------------------------------------------------------
# [2]:
def curl_delete_proc(url_delete):
	cc = pycurl.Curl()
	cc.setopt(cc.PROXY,'')
	cc.setopt(pycurl.URL,url_delete)
	cc.setopt(pycurl.CUSTOMREQUEST,'DELETE')
	cc.perform()
	cc.close()
#
# --------------------------------------------------------------------
# [4]:
def curl_put_proc (url,data):
	cc = pycurl.Curl()
	cc.setopt(cc.PROXY,'')
	cc.setopt(pycurl.URL,url)
	cc.setopt(pycurl.CUSTOMREQUEST,"PUT")
	cc.setopt(pycurl.POST,1)
	cc.setopt(pycurl.POSTFIELDS,data)
#
	cc.perform ()
	cc.close ()
#
# --------------------------------------------------------------------
# [8]:
def file_upload_proc(url,key):
	print(key)
	jpg_in = key + ".jpg"
	url_jpg_file = url + "/jpg/" + key + "/" + jpg_in
#
	fp_in=open(jpg_in,'rb')
	image=fp_in.read()
	fp_in.close()
#
	curl_put_proc(url_jpg_file,image)
#
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
url="https://44b508dd-f332-4f91-81f2-78369c7d29d9-bluemix:9dacdfdee666c2a5c16596fc371012e08a61e7132d3b21ecaaf1f63a835f3356@efc189dc-f332-4f91-81f2-78369c7d29d9-bluemix.cloudant.com"
#
#
url_jpg = url + "/jpg"
curl_delete_proc(url_jpg)
#
curl_put_proc(url_jpg,"")
#
for key in ["DSCF0001","DSCF0002"]:
	file_upload_proc(url,key)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
ブレンダー　クロス（cloth）のメモ

わたしが無知なんでしょうが、
物理演算のクロスについて編集の仕方に関するいい記事が見つからなかったので
自分なりにメモしてみました。

人によっては演算結果だけが欲しい人もいるかと思います。
要するに必要な状態が手に入れば編集しづらいアニメは破棄したい。

それで演算結果のオブジェクトを編集したり移動できたりすれば良いのですが、
それはどうすればいいか。

■まず、ベイクをします。
これでミスをして移動してしまったり編集モードに入ってしまってアニメ演算をまたやり直しというケースは避けられます。
![111 86.png](https://qiita-image-store.s3.amazonaws.com/0/193429/718192ca-8c10-4b74-acca-25b3fc406d46.png)

①ですが、アニメ結果のキャッシュをそれぞれ保存出来たりします。
②演算をどれだけのフレームでやるかどうかですね。
よっぽどの長い動きではない限りは１００フレーフぐらいでいいかと思います。
③アニメ結果の保存です。これでなにか表紙でまた再演算しないといけない状況は回避できます。



■アニメ結果はキーボードの右左でコマ送りできます。自分の一番お気に入りの結果をフレームを選びます。（おそらく布などのシミュレーションは最後のフレームが一番落ち着いた状態なのでベストでしょうが）
選びましたモディファイアーで適応ボタンを押しましょう。
これで演算はこれ以上行われませんが、目的のフレームの状態でオブジェクトは動かなくなり、頂点の編集などもできるようになります。
![10.gif](https://qiita-image-store.s3.amazonaws.com/0/193429/7d6e4e3f-40ce-7ed4-c77a-0b506a1de344.gif)


参考
https://www.youtube.com/watch?v=PEpsN1-W-Qw
twitterで画像を一括ダウンロードするrubyプログラム

#Qiitaとrubyとtwitterネトスト初心者です！！

8行目で指定したユーザー名の画像を20枚まで一括ダウンロードするrubyプログラムです！
20枚はtwitterの仕様だからそれ以前の画像はDL不可。迂回できるかもだけど不明。

少し前に書いたコードだから、28〜36行目が何してるのか最初自分でもちゃんと読み解けなくて困った。もっと短く書けるはず。

12〜15行目と18〜24行目は、分けずに書いて一緒に処理した方がいいっぽい。

元々複数ユーザー分取得できるように作っていたけど、さっきmkdirのコード付け足した時にもっと違う書き方した方がいいと思ってやめた。


```ruby:twitter_image_dl.rb
#twitter_image_dl.rb

require 'open-uri'
require 'fileutils'
require 'pp'


name = "Qiita" #適宜ここをユーザー名に書き換えて使ってくれ
target_url = "https://twitter.com/" + name + "/media"
pp target_url

ary = []
open(target_url) {|f|  
  f.each_line {|line| ary << line}
}
#pp ary

url = []
match = %r|https://pbs.twimg.com/media/\S*.jpg|
ary.each do |file|
	if file =~ match
		url << file[/https\S*.jpg/]
	end
end

FileUtils.mkdir("./"+name) unless url == []

url.each do |path|
	@path = path
	fileName = File.basename(@path)
	open("./"+name+"/"+fileName, 'wb') do |output| 
		open(@path) do |data|
	    	output.write(data.read) 
	  	end
	end
end
```
シェルスクリプトでbashrcが読み込めない

 cronからシェルスクリプトを起動するのに、bashrcのPATHの設定を使いたくて、

```bash
source ~/.bashrc
```

と書いたのに、設定が読み込まれない。
なぜかと首をひねっていたら、bashrcの冒頭に以下の記述がありました。

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

`man bash`によると、

>対話的なシェルとは、 オプションでない引き数がなく、 標準入力と標準エラー出力がいずれも端末に接続されていて (これは isatty(3) で調べられます)、 -c オプションが指定されていない状態で起動されたシェル、または -i オプション付きで起動されたシェルのことです。 bash が対話的に動作している場合には、 PS1 が設定され、 $- に i が含まれます。 これを利用すると、対話的動作の状態であるかどうかを、 シェルスクリプトや起動ファイルの内部で調べられます。 

つまり、シェルスクリプトから`source ~/.bashrc`としても、対話的シェルではないので`$-`に`i`が含まれず、returnしてしまうわけです。
Ubuntu14.04のデフォルトの.bashrcをそのまま使ってたので気づきませんでした……

.bash_profileはshebangを`#!/bin/bash -l`とすれば自動で読み込まれるので、PATHはそちらに書いたほうが良さそうです
docker -v と case-sensitive (大文字・小文字比較)

# 前提
- 開発PC 
    - Mac
- 開発動作環境
    - docker上のコンテナ
- ソースの同期方法
    - hostのソースがあるディレクトリをdockerにmountして同期していた。

# 発生した問題
- docker上で動いたphpファイルがサーバー(amazon linux)にデプロイした際にその読み込んでいるファイルがないと言うエラーが出て動かなくなってしまった。

# 原因
- ファイルの大文字小文字をtypoしていたため、そんな名前のファイルはないと怒られた。

## コード例 
- 同じディレクトリに `index.php` と `Test.php`と言うファイルがある想定
- index.php  正しいやつ 

```php 


require_once 'Test.php';


echo 'hogehoge';
```

- index.php typo

```php 

//ここのファイル名をtypo
require_once 'test.php';


echo 'hogehoge';
```

- Test.phpの内容

```php
echo "test ";
```

#### 出力結果
- docker
    - 動く。

```
test hogehoge
```

- サーバーでの出力
    - サーバーではそんなファイルは読めないと怒られる。

```
Warning: require_once(Test.php): failed to open stream: No such file or directory in /home/www-data/public/index.php on line 4

Fatal error: require_once(): Failed opening required '.Test.php' (include_path='.:/usr/local/lib/php') in /home/www-data/public/index.php on line 4
```

## 原因追求
- 原因がわかったのは良いけど、ローカルで大文字小文字区別しない状態でのエラーは怖いなーと原因調査

## 結論
- macからhostからmountしたディスクが `case-insensitive`だった。

## 調査
- dockerのコンテナに入って `df -T` を実行してファイルシステムを確認したら、mountした`/var/www/app`
 が`osxfs`になっていてmacの標準が大文字・小文字を区別しないのが原因だった。
- コマンド結果
![df.png](https://qiita-image-store.s3.amazonaws.com/0/149835/21c5eebe-b448-08f5-12eb-9892ce58ff8e.png)


## 解決方法
- case-sensitiveなボリュームを新たに切って、ソースをそこからmountするように変更すれば良いのかもしない(未実施)
- でももっといい方法ありそうだなー誰か教えてください。

### 余談
- mountしているだけなら当たり前といえば当たり前なんだけどもdockerだから大丈夫やろーと思ってので盲点だった。
- ただadobe製品とかはcase-sensitiveだと動かないとか、逆にcase-insensitiveじゃないと動かないものもたくさんあるらしい・・・怖い。

## 参考URL
- File system sharing (osxfs)
    - https://docs.docker.com/docker-for-mac/osxfs/
- 大文字小文字区別ファイルシステムから区別しないファイルシステムへ
    - http://qiita.com/sakisakira/items/759a311aded30dbcc4af 
- Mac OS X ファイルシステムの確認方法と大文字と小文字を区別するファイルシステムについて
    - https://helpx.adobe.com/jp/x-productkb/global/cpsid_83180.html
HTTPリクエストで417エラーが出たときの対処

##HTTPエラーコード417ってなんだ？
ってかんじでしばらくハマった。
Expectation failed(417)は、拡張ステータスコードが使えない時にサーバーが返すらしい。（拡張ステータスコード？って場合は参考リンク先へ）
C#でHTTPリクエストを書くと自動でヘッダにExpect: 100-Continueがついてしまい、サーバーに断られてしまったということだ。サーバーはIISなのだが、関係ないのでしょうか・・・

それで、コードに以下を追加することで解消する。

```csharp:sample.cs
using System.Net;
using System.Net.Http;

ServicePointManager.Expect100Continue = false; // HTTPエラー(417)対応

var req = new HttpRequestMessage(HttpMethod.Post, TARGET_URL);
req.Content = new StringContent(msg, Encoding.UTF8, "text/xml");
HttpClient client = new HttpClient();
var res = await client.SendAsync(req);

```

##参考リンク
WebRequestのExpectにデフォルトで100-continueがつく件
http://d.hatena.ne.jp/tkuro/20110208/1297181393
【エラーコード】HTTPステータスコードの原因一覧
https://liginc.co.jp/web/programming/164003
ソフトウェア変更の失敗 > v1からv2への変更 (何を主に変更するのか)

自分がよく使っていたソフトウェアがv1からv2にアップデートされてしばらくたつ。

問題はいくつかある。

- UIが使いづらくなった
- 基本機能にバグが入るようになった
    - データが消える
    - データの変更をソフトが把握できない
    - エラーで処理が止まる
- 細かい部分でバグが入るようになった
    - 延々と処理を繰り返す
    - 動作が重くなる

### メジャーバージョンアップの問題点

「今回のメジャーバージョンアップは何を主に変更するのか」をきちんと選択しないままバージョンアップしたように感じる。

少なくとも以下の変更がバージョンアップに含まれるようだ (フォーラム記載の内容からの推測も含む)

- UIの変更
    - 「前のUIは良くないね」（根拠ない)
- 開発環境の変更
    - 「マルチプラットフォーム対応しとこうか」
- ライブラリの変更
    - 「ついでに新しいライブラリ使っとこうか」
    - 開発環境の変更にもよるかもしれない
    
### 現状

フォーラムを見ると以下のようなコメントがある

- XXXの機能が使えません
- 5分おきにログインを要求されます (仕事にならない)
- 他のソフトウェアを使うことにしました (さよなら)
- 今日一日作業したデータが消えました
- v1に戻して欲しい（切実に）
- オープンソース化しようぜ (君らの解決は時間がかかりすぎる)

現状の各種問題が修正されるまでに1-2年はかかるのではないだろうか。

### 小さなチーム

「我々は小さなチームだ。(だから、たくさんの不具合に対応できない)」というコメントをフォーラムで見かけた。

そもそも「小さなチーム」としてのバージョンアップをすれば良かったのではないか、と思う。

どういうバージョンアップかというと、上記の場合、

- 「ライブラリだけ変更」してきちんとテストをして、安定版にする
- 次に「開発環境を変更」してきちんとテストをして、安定版にする
- （本当に必要なら）UIを変更して、きちんとテストをして、安定版にする

これらを順次きちんとこなすことで、v1から使用を続けるユーザに大きな問題を生じずにスムーズにv2に移行してもらえる。

by Linus Torvalds @ ソフトウェアの世界でキャリアを築く by Sam Lightstone
> たった一回のジャンプで、高層ビルの上まで跳ね上がることはできません。一つひとつ階段のステップを歩んで行くものです。何か面白いところに辿り着くまでに１００階以上登りつづけたとしても、決してそれは苦になることはないでしょう。遥かかなたの目標だけに目を向けていたら、足下の階段ですら気づかず一歩すら踏み出すことができないのです。

@ アップルを創った怪物 (Computer Geek to Cult Icon) by スティーブ・ウォズニアック
> 結果をあまり気にせず、今していることに集中し、それをできるだけ完璧に仕上げることが大事だということを学んだんだ。...途中のやるべきことをすっとばして最終段階だけをなんとかしようとする人をたくさん見た。そんなの、うまくいくはずがないんだ。絶対に無理なんだ。

オープンソース化の提案は良くなるかどうか分からない。
開発チームのメンバーがオープンソースで長年活動してきたのであれば良いが、そうでない場合、さらなる不確定要素が加わり、混迷が深くなるように思う。

現状のメンバできちんとバグを取りきることで信頼を回復するのが良いように思われる。一度離れたユーザが戻ってくるには強いインセンティブが必要になるだろう。

開発環境変更などの大きな変更が予想される場合は、安定版とベータ版の２つに分けて、両者をアップデートしていく方法もあったかと思う。ベータ版が安定化するまでは数年かかるかもしれないが、本当にそれが必要であれば、それだけの時間をかける意味はあるだろう。
Gitでローカルにあるフォルダやファイルは削除しないでリモートにあるフォルダやファイルを削除する方法

`.gitignore`の条件に当てはまるファイルやフォルダを削除したい場合。

```bash:terminal
git rm --cached `git ls-files -i --exclude-from=.gitignore`
git commit -m ".gitignoreの条件に当てはまるリモートのファイルやフォルダを削除"
git push origin master
```

その他の場合。

```bash:terminal
git rm -r --cached myFolder myFile
git commit -m "指定したリモートのファイルやフォルダを削除"
git push origin master
```


##参考
https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-from-git-repository
https://stackoverflow.com/questions/13541615/how-to-remove-files-that-are-listed-in-the-gitignore-but-still-on-the-repositor
http://qiita.com/Potof_/items/c75eba9cfa72819506de
[PHP][Silex][Doctrine] Silex 2へDoctrine ORMを導入する

Silex 2には[Doctrine DBAL](http://www.doctrine-project.org/projects/dbal.html)が同梱されていますが、やっぱりORMでプログラム書きたいので、Doctrine ORMを導入します。

# 導入手順

## ステップ 1 - Doctrine ORMの導入

まずDoctrine ORMをcomposerで入れます。

```shell-session:
% php composer.phar require doctrine/orm symfony/yaml
```

## ステップ 2 - サービスプロバイダの導入

ありがたいことにDoctrine ORMをSilexのDIコンテナに載せてくれるサービスプロバイダが公開されていますので、それを導入します。

Doctrine ORM Service Provider → https://github.com/dflydev/dflydev-doctrine-orm-service-provider

```shell-session:
% php composer.phar require dflydev/doctrine-orm-service-provider
```

## ステップ 3 - 設定ファイルの作成

### doctrineコマンドラインツールを使うための設定ファイル

`vendor/bin/doctrine` コマンドを使うための設定ファイルを作成します。
設定ファル内でDoctrineのEntity Managerを生成します。

```php:config/cli-config.php
use Doctrine\ORM\Tools\Console\ConsoleRunner;

// replace with file to your own project bootstrap
require_once dirname(__DIR__).'/src/app.php';
require_once 'dev.php';

// replace with mechanism to retrieve EntityManager in your app
$entityManager = $app['orm.em'];

```

Doctrine ORM Service Providerのおかげで、`$app['orm.em']`を参照するだけです。


### データベース接続用の設定

Silexでも使う`prod.php`と`dev.php`を編集します。

```php:config\prod.php
// DBへの接続情報です。本番環境用です。
$app['db.options'] = array(
    'driver' => 'pdo_mysql',
    'dbname' => 'mm',
    'host'   => 'localhost',
    'user'   => 'mm_user',
    'password' => 'mm_pass'
);

// Doctrine ORMの設定です。
// マッピングの定義方法（ここでは「annotation」を選んでます）
// エンティティのネームスペース
// エンティティクラスファイルのあるパス
$app['orm.em.options'] = array(
    'mappings' => array(
        array(
            'type' => 'annotation',
            'namespace' => 'ML\Entity',
            'path' => dirname(__DIR__).'/src/MM/Entity'
        )
    )
);

// 生成するプロキシクラスファイルの置き場
$app['orm.proxies_dir'] = dirname(__DIR__).'/src/MM/Proxy';
```

```php:config/dev.php
// 開発環境での接続設定です。
$app['db.options'] = array(
    'driver' => 'pdo_mysql',
    'dbname' => 'mm_dev',
    'host'   => 'localhost',
    'user'   => 'mm_user',
    'password' => 'mm_pass'
);

```

## （休憩）

ここまでくれば、`vendor/bin/doctrine`コマンドが動くはずです。
試してみてください。


# 使い方

## 使い方 1 - エンティティクラスの作成

エンティティクラスを作成します。

例えば以下のような内容です。

```php:src/MM/Entity/User.php
namespace MM\Entity;

/**
 * User Entity
 *
 * @Entity(repositoryClass="MM\Repository\UserRepository")
 * @Table(name="users")
 */
class User
{
    /**
     * ID
     *
     * @Id
     * @Column(type="guid")
     * @GeneratedValue(strategy="UUID")
     */
    private $uuid;

    /**
     * email
     *
     * @Column(type="string",length=512)
     */
    private $email;

    // （略）
}
```

setter/getterも必要に応じて定義します。


## 使い方 2 - レポジトリクラスの生成

doctrineコマンドを使います。

```shell-session:
% ./vendor/bin/doctrine orm:generate-repositories src
```

レポジトリクラスが生成されます。
中身空っぽなので、使わなければ要らないです。


## 使い方 3 - テーブルの作成

データベースにテーブルを作成します。

```shell-session:
% ./vendor/bin/doctrine orm:schema-tool:create
```

エンティティクラスを修正し、テーブルを更新するときはこのようにします。

```shell-session:
% ./vendor/bin/doctrine orm:schema-tool:update --force
```
ひとりgit備忘録

### push
ローカルからリモートに反映させるとき（初回）。

- git環境用意： `git init`
- リモートリポジトリの場所登録： `git remote add 任意リポジトリ名（たいていはorigin） リモートリポジトリアドレス`
- git管理対象のadd： `git add .`
- commit： `git commit -m "コミットメッセージ"`
- リモートに反映： `git push リポジトリ名 ブランチ名`

### fetch
リモートの状態をローカルに反映させるとき

- git fetch
- git merge リポジトリ名/ブランチ名

### branch
- ブランチの一覧： `git branch -a`
- ブランチを作る： `git branch ブランチ名`
- ブランチの変更： `git checkout ブランチ名`

### log
ローカルにあるgitのコミット履歴をみる
git log --oneline
IDとコミットメッセージがでてくる。

### clone
ふつうに
git clone リモートリポジトリアドレス

### 作業巻き戻し
なんかのファイルいじってる最中に別アカでファイルいじってpushしてしまったのでpullできないみたいな。いったん前のコミットの状態に戻す。

- 自分の作業履歴取り消し： `git checkout HEAD ファイル名`
- 自分の作業履歴取り消し（全体的に）： `git reset --hard HEAD`

### いじってたらpullできなくなった
pullしようとしたらローカルに変化が起きてるから無理みたいになって、↑みたいに作業の巻き戻しはしたくないとき。

- 一時退避コマンド： `git stash [save "comment"]`
- 退避したのでpullできる： `git pull`
- 退避リスト参照： `git stash list` -> `stash@{N}:` みたいなかんじで退避したもののラベルが出てくる。Nは数字で0からインクリ
- 退避リストのうち反映させたいやつを反映させる： `git stash pop stash@{N}`

### 履歴削除
秘密鍵とかおいてしまった(rmしても履歴上は残る）ときのコミットを消して歴史改変する
まず対象のコミットがどれかを特定する
git log [--name-status]
このオプションつけるとそのコミットで何がaddされたとかが見れる。めっちゃあって邪魔で、GitHubとかのサービスでどのコミットなのか特定できるならオプションなくてよし。で、やると、

```
commit 1234abcd1234abcf1234abcd
Author: name <hoge@hoge.com>
Date:   Wed Aug 23 14:00:00 2017 +0900
　　commit message
```
みたいなもののリストが返ってくるので、下記コマンドで消したいコミットよりも昔のコミットのIDを指定する
git rebase 1234abcd1234abcf1234abcd
なんかエディタ開くので消したいコミットのIDの行を消して保存する。そのあとgit logしてみると消えてる～！
→でもgithubのcommitの履歴に残ってるんだけどどうしたらいいんだ・・

---
以下特殊なケース対応

#### git addで怒られるとき
```
C:\Users\username\PATH>git add .
warning: LF will be replaced by CRLF in fileName.fileExtension.
The file will have its original line endings in your working directory.
```
なんかwinでgitのバージョン適当に上げたりしてちゃんと項目に目を通していなくてこうなることが（参考：[気をつけて！Git for Windowsにおける改行コード](http://qiita.com/uggds/items/00a1974ec4f115616580)）。単体で都度治すならgit config core.autocrlf trueでよいが、全体で設定したほうがよい
git config --global core.autocrlf input

---
### ファイルの中の変更の一部だけをgit addしたいんじゃよ
あるファイルに対して複数の編集を加えているときで、例えば「いやこれはローカルのメモやでｗ」とか「一気に変更してしまったがコミットの単位分けたいやで」みたいなときに使う。

- `git add -p [file]`
- これすると、変更箇所の塊と共に入力を求められるので、その変更箇所をadd対象にしたければ `y` でリターン、したくなければ `n` でリターン
- 提示された変更箇所の塊の中をもっと細かく制御したいときは `e` リターンするとviが立ち上がるので、add対象にしたくない行を消す
- `git status` したり `git diff [file] [--cached]` とかして差分を確認する
- あとは普通にcommit -> pushで大丈夫

---
### githubでプルリク周り
#### forkする
- WEBUIで触りたい他所のリポジトリをフォーク
- フォークしてきたリポジトリをローカルにclone
- fork元リポジトリの更新に追従したいので下記設定
    - `git remote add [任意ブランチ名（例：fork）] [fork元リポジトリアドレス]`
    - `git fetch fork` して、ローカルで任意ブランチにcheckoutした状態で `git merge origin fork/master`  でfork元の更新をローカルのforkリポジトリに反映、リモートのforkリポジトリに反映させるために　`git push origin [反映させたいブランチ名]`

#### プルリクする
- forkしてきたローカルのリポジトリで作業、リモートに反映
- WEBUIでforkリポジトリの画面から「New Pull Request」的なボタンを選択、修正メッセージ等を書いてリクエスト送ってマージ承認されるの待ち。
memolist.vimのgrepをDeniteのgrepにする


[memolist.vim](https://github.com/glidenote/memolist.vim)という便利なmemo取りpluginがあります。
軽量で使いやすくオススメなのですが、ここがなーと思っている箇所がありました。
MemoGrepというcommandがありますが、この実装はVimGrepをしているのです。

```
function! memolist#grep(word)
  let word = a:word
  if word == ''
    let word = input("MemoGrep word: ")
  endif
  if word == ''
    return
  endif

  try
    if get(g:, 'memolist_qfixgrep', 0) != 0
      exe "Vimgrep -r" s:escarg(word) s:escarg(g:memolist_path . "/*")
    else
      exe "vimgrep" s:escarg(word) s:escarg(g:memolist_path . "/*")
    endif
  catch
    redraw | echohl ErrorMsg | echo v:exception | echohl None
  endtry
endfunction
```

あれ？オプション`let g:memolist_denite = 1`でDenite grepしてくれると思ってたのに…(´・ω・`)
ゆるふわ系VimmerとしてはVimGrepはハードボイルド過ぎるのでDenite grepをするようにしてみました。

```
" 適当にvimrcにでも書いて下さい

function! s:memoGrepDenite()
    let l:option = '-path=' . expand('$HOME/path/to/memolist')
    exe 'Denite' 'grep' l:option '-highlight-mode-insert=Search'
endfunction

command! MemoGrepDenite call s:memoGrepDenite()<CR>
```

これで:MemoGrepDeniteコマンドができて、ホクホク(・∀・)
イカリング2をPCブラウザで見れる方法があるらしいのでやってみた

# はじめに

みんなスプラってますか？スプラ2のAPIだったり面白い記事ないかなと色々と探していたらこんな記事を見つけました。

[【スプラトゥーン2】イカリング2の戦績データをPCブラウザで無理矢理閲覧する](http://s2terminal.hatenablog.com/entry/2017/07/23/203831)
（今回記事を書くにあたって、やり方や方法など色々と参考にさせていただきました。ありがとうございます。）

といってもmitmproxyなにそれ状態の初心者だったので上記の記事を参考に、勉強がてらPCブラウザで開くまでの手順を記載していきたいと思います。


# やること、流れはこんな感じ
[1.`pip`をインストール](# 1.pipをインストール)
[2.`mitmproxy`をインストール](# 2.mitmproxyをインストール)
[3.端末の設定（iOS）](# 3.端末の設定（iOS）)
[4.証明書をインストール](# 4.証明書をインストール)
[5.セッションを書き換えて、PCブラウザ上でイカリング2を見る](# 5.セッションを書き換えて、PCブラウザ上でイカリング2を見る)

mitproxyとはクライアントとサーバー間の通信内容を表示できたりするプロキシツールだそうで、端末の通信内容からセッションのキーを取得したあと、PCブラウザ上のセッションを書き換えてイカリング2を見れるようにする。と、流れはこんな感じです。1からやってみましょう。


# 1.pipをインストール
```
$sudo easy_install pip
```

# 2.mitmproxyをインストール
```
$pip install mitmproxy
```

もしsiｘのエラーが出てしまった場合は下記コマンドを試してみて下さい
既にsiｘがインストールされてることが原因なようです

```
$pip install mitmproxy --upgrade --ignore-installed six
```

# 3.端末の設定（iOS）
- PCのIPを調べる
- PCとiPhoneを同じネットワークに接続
- iPhoneの「設定」 → 「Wi-Fi」 →「いま接続しているネットワークの設定を開く（iボタン）
- HTTPプロキシの設定を下記のように設定

|メニュー|設定方法|
|:---|---:|
|サーバー|先ほど調べたIP|
|ポート|8080|
|認証|OFF|

# 4.証明書をインストール
- mitmproxyを起動

```
$ mitmproxy -p 8080
```

- iOS端末から http://mitm.it にアクセス
- 🍎マークを押して証明書をインストール

# 5.セッションを書き換えて、PCブラウザ上でイカリング2を見る
- NintendoSwitchOnlineのsplatoon2メニューを開く
- mitmproxy上に `GET https://app.splatoon2.nintendo.net/...` というリクエストが表示されるので選択して詳細を表示
- 詳細の中に、`Cookie: iksm_session=....`というキーがあるのでこの値を控える
- [EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg/related?hl=ja)をインストール
- https://app.splatoon2.nintendo.net/home にアクセス
- インストールしたEditThisCookieを開き、iksm_sessionに先ほど控えた値に書き換えればブラウザで開くことができます

# NintendoSwitchOnlineが起動しない場合（iOS）
コメントにてNintendoSwitchOnlineが起動しない場合があることを教えていただきました
https://github.com/frozenpandaman/splatnet2statink/issues/39

解決方法としては、設定 > 一般 > 情報 > 証明書信頼設定を開き、mitmproxyの設定をONにしてください

# おわりに
久々に知らないことを色々と覚えて楽しかったです。他にも色々と捗りそうです。
疑問点やあやしい点があればFBいただけると幸いです。すてきなイカライフを(ﾉ 'ω')ﾉ

![splatoon-illust_7.jpg](https://qiita-image-store.s3.amazonaws.com/0/193865/5e41d7ab-b99a-e151-26aa-bc944f11a8b9.jpeg)

# 参考文献
- [【スプラトゥーン2】イカリング2の戦績データをPCブラウザで無理矢理閲覧する]
(http://s2terminal.hatenablog.com/entry/2017/07/23/203831)
- [iOS実機のSSL通信をプロキシによって傍受したり改ざんする方法](http://qiita.com/yimajo/items/c67cb711851f747c35e5)
- [pip installでエラー](http://qiita.com/fujitora/items/66370e6a347c32901cea)
Github for Unity（α版）ができたみたい

#Github for Unity
Github for Unityというものができたみたいです。

ーーリンクは以下より

本家URL　https://unity.github.com/
GithubリポジトリURL　https://github.com/github-for-unity/Unity

<img width="1280" alt="スクリーンショット 2017-07-26 14.20.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/110418/b48ca936-b6c5-9722-864e-7c85c51747c5.png">

GitLFSにも対応していていい感じ！

インストール
---
下記リンクより最新のreleaseをみて.unitypackageをダウンロード

https://github.com/github-for-unity/Unity/releases

<img width="1068" alt="スクリーンショット 2017-07-26 13.22.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/110418/3987b609-c457-84bd-1753-eb2c764bd623.png">

結構なサイズありますね。
で、インストールするにはUnityを開いたまんま、
.unitypackageのファイルをダブルクリック。
そうするとUnityの方でimportが開始されます。

あとはGithubのREADMEを読むだけ！

```Window -> GitHub -> Account -> Sign in```

Unityの上部メニューから上記のように遷移して、Githubアカウントで入れば、、

<img width="408" alt="スクリーンショット 2017-07-26 13.30.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/110418/6706e3af-409e-1e23-ef65-5228a42e204d.png">

みたいにタブが表示されて使えるようになるみたいですね！
（Githubより画像を引用）

まだα版の様ですが、ソース管理で若干苦しかったUnityが楽になるといいですね！
Redmine - チケットページの長くなりすぎたコメント履歴を省略する

## はじめに
Redmineのチケットのコメント履歴が長すぎて困っていたので、
ページ表示時点では最新10件だけを表示するようなjsを書きました。

適用後のイメージ
<img src="https://qiita-image-store.s3.amazonaws.com/0/171831/dacce2c5-6613-f6fe-096c-c022e37fa026.png" width=80% />


## 設定

### 使用したプラグイン
[view_customize(github)](https://github.com/onozaty/redmine-view-customize)

このプラグインを使うとRedmineのsourceを変更せずに、動的にjavascriptを埋め込めるので使いました。
入ってない場合は、ページに直接埋め込むなどでもOK。

### code

```js
/// Path: `/issues/[^\/]+`
/// Redmine - チケットページの長くなりすぎたコメント履歴を省略する v2017.08.25
;$(function() {
  var journals = $('.journal');

  var do_hide = function (start, end) {
    var current_journals = journals.slice(start, end);
    var div = $('<div />', {
      css: {
        'overflow': 'auto',
        'padding-right': '5px',
      }
    });

    var on_style = function(hide) {
      div.empty();

      if (hide) {
        current_journals.hide();
        div.append(
          $('<div />', {
            css: {
              '-webkit-border-radius': '10px',
              'border': 'solid 2px #41719c',
              'background-color': '#dae3f3',
              'margin-bottom': '10px',
              'width': '100%',
              'text-align': 'center',
            }
          }).append(
            $('<p />', {
              text: '省略された履歴(#' + (start+1) + '〜#' + end + ')を表示する',
              css: {
                'color': '#717171',
                'cursor': 'pointer',
                'display': 'inline-block',
                'font-weight': 'bold',
              }
            }).on('click', function () {
              on_style(current_journals.first().is(':visible'));
            })
          )
        );
      }
      else {
        current_journals.show();

        div.append(
          $('<div />', {
            css: {
              'width': '100%',
              'text-align': 'center',
            }
          }).append(
            $('<p />', {
              text: 'ここまでの履歴を非表示にする',
              css: {
                'color': '#bbb',
                'cursor': 'pointer',
                'display': 'inline-block',
                'font-style': 'italic',
              }
            }).on('click', function () {
              on_style(current_journals.first().is(':visible'));
            })
          )
        );
      }
    }

    div.insertAfter(current_journals.last());
    on_style(true)
  };

  {
    var not_hidden_length  = 10;
    var all_hidden_length = journals.length - not_hidden_length;
    var block_length = 30;

    for (var i = 0 ; i < all_hidden_length ; i += block_length)
      do_hide(i, (all_hidden_length < i + block_length ? all_hidden_length : i + block_length));
  }
});
```

## 追記

2017.08.25 codeを修正：
- 再表示された箇所がぱっと見で分かり難かったので、フッターを付け、どこまで再表示されたか分かるようにした。
- ついでに表示On/Offをトグルできるようにした。
- あまりにも履歴が多い場合に備えて、（30件ごとに）小分けするようにした。