OmniAICreator/Qiita-1.07M huggingface dataset:
RubyでHashie::Mashを使ってyamlをロードした時に遭遇したエラー

コードの不具合を解決した時のメモ書き。
rubyでgem 'hashie'を利用してyamlをロードした際に警告が出て、処理も期待通りにならなかった。

```rb:code.rb
@sites = Hashie::Mash.new YAML.load_file File.join(ROOT_PATH, './target_site.yml')
puts @sites.neko.first.index
```

```yaml:target_site.yml
neko:
  -
    url: 'https://catfood/product/1.html'
    selector: 'div.top_box .zaiko'
    index: 0
```

```:実行時のwarnning
WARN -- : You are setting a key that conflicts with a built-in method Hashie::Mash#index defined in Hash. This can cause unexpected behavior when accessing the key via as a property. You can still access the key via the #[] method.
```

これは警告文から分かる通りyamlの項目名に **index** が含まれていることが原因。
Hashie::Mashのインスタンスが元々indexメソッドを持っているため、これをyamlで項目名として使うとメソッド名が衝突するため警告が出る。

実際の処理では、@sites.neko.first.indexを実行しようとすると元々Hashie::Mashが持つindexメソッドが呼ばれ引数不足でエラーが発生する。また、警告文の末尾にもある通り、以下のような呼び出し方によってyamlのindex項目を呼び出すことは出来る。

```rb
@sites.neko.first[:index]
```

実際のコーディングではyamlでindexという項目名をindex_numと差し替えて実装を進めた。
現場から以上です。╭( ･ㅂ･)و
要件定義と基本設計で決めなきゃいけないこと

#要件定義と基本設計で決めなきゃいけないこと
突然要件定義と基本設計で決めなきゃいけないこと洗い出してーと言われて困ってしまった。
僕はその工程の経験ないんだけど・・・とも言えずに付け焼刃的に勉強した内容をまとめてみる。

個人的に今後ブラッシュアップできればいいなあと思う記事。
必要なドキュメントの洗い出しや自分の作業漏れのチェックに使っていきたい。

##要件定義
####システム化の背景
    システム化する業務の背景や現状などなど。
    例えば、ニーズも高まっているし、経営戦略の一つとして、なんちゃら管理システムを刷新したいみたいな。
    いわゆる導入部分。でもここがちゃんとしていると途中からプロジェクト入ってきた人でも話が頭に入ってきやすい。
####課題
    システム化対象の業務が抱える課題
    例えば、この業務自動化すると楽になって、別の業務に集中できるようになる。発注管理を楽にして接客に集中とか、
    画面の文字ちっちゃくておじさんには読みにくいんだけどとか
####目的・方針
    システム化する目的や解決方針、こんなシステムを導入して、日頃の業務を楽にしちゃいたい！とか、
    おじさんにもわかりやすい画面にしたい
####概要
    システムの概要や特徴、こんなふうに自動化するよとか、センサーや機器導入してこうなるよとか
####機能
    システムが持つ機能の概要のこと。教科書的な表現をするなら機能要求と非機能要求も決めておく。
    例えば、アマゾンのレコメンド機能つくるぜとか、レスポンスはこれくらいのスピードでとか。
####システム化する範囲
    システム化する業務や機能の範囲、こっから先はコンピュータよりおじさんの方が効率的だからシステム化しないよとか
    なんかここは明らかに揉めそうなので、しっかり決めておこう。
####UIのざっくりしたイメージ
    システムで用いるユーザーインターフェースのイメージ
    デザインはこんな基準で作るよ
####システム構成のもろもろ
    システムの色々な構成、ハードウェア、ソフトウェア、ネットワークなどなど
    フレームワークこんなん使うよとかサーバー構成こんなんだよとか残さないと開発メンバーが消え失せたあとが地獄。
####導入・移行計画
    システムの導入時期や既存システムの移行方法、いつごろまでにシステムリリースするよとか決めておくとよい。
####運用・保守
    システムの運用や保守の体制や方法など、何時くらいまでにこの機能を停止するよ動かすよとか、障害発生した時はどうするよとか
####スケジュール
    使用策定、設計、開発、テスト、導入などの主要な作業の完了時期。
    これも、いつごろまでに何を終わらせるよ系統の話だね。この時点ではもちろんあんまり細かく引けないだろうけど
####人員の体制
    開発をすすめる際の人的体制や作業環境などをどこの誰がやるか
####成果物
    顧客に納入する文書やプログラムの一覧を決めておくといいんじゃないかと、設計書やソースはもちろん、
    マニュアルとか作る作らない決めておこう。

###その他開発に向けて決めておくもの
####作業標準
    開発フローやルールなど、作業が標準化されているのは個人的に心地よいので、
    この時点ですでに詳しく決まっているといいなぁと思う。
####品質管理
    テスト方法やバグ発生の収束を判断する基準など

##基本設計

####業務フロー
    業務の流れとシステム化範囲を見極める、アクティビティ図のイメージなのだろうかね
####分割した機能一覧
    分割した機能の一覧、このシステムにざっくりどんな機能があるのかな？とかわかるようにする
    サブシステム分割して分担して設計開発するためにも必要かも
####画面レイアウト
    画面が果たす業務内容、UIのざっくりしたイメージじゃなくもう少し細かい見た目
####画面遷移図
    画面同士の移り変わりを見るために必要だよね
####帳票レイアウト
    帳票もお客さんに見てもらう必要はあるよね。個人的には帳票設計は結構好き
####コード一覧
    コードや区分の意味などを整理する。この一覧は保守でよく使うから絶対作って欲しいんだがね。
    一覧作らない場合はしっかり共通化したりソース設計しておいてほしいところ。
####ER図
    テーブルのリレーションを整理する。最近ER図がないプロジェクトにアサインされ驚愕している。
    一体これ作らないでどうやってシステム作ったんだよ・・・
####CRUD図
    このテーブルはいつどんな感じで使われるかを整理する、あとあとの影響調査のインプットにも使えるよね
    あとはサブシステム分割とかに使えるらしいけど、イメージわかないなぁ。
####システムインターフェース
    外部システムと連携するためのファイルとか
    他のシステムにも迷惑かかるから早めに決めておきたい

##最後に
詳細設計については特に記載していない。多分使う技術によって違うだろうからね。
あとはドキュメントで詳細設計資料管理するか、ソースをきれいに書いて設計書のメンテをしないかなど
方針も結構別れるような気がするので、標準化は難しそうだ。
人工知能の歴史

人工知能=深層学習のような空気さえ流れている昨今ですが，何ができて何ができないのかを理解するために人工知能の歴史をまとめました．
間違いがあれば指摘お願いします．


|             年 | 人工知能 　　　　　　　　　　　　　|
|:-----------|------------:|
| 1947       | サバネティクス提唱       |
| 1956   | ダートマス会議で人工知能の提唱     |
| 1960       | 人工知能言語LISPの発表        |
| 1965|ファジィの概念の提唱|
| 1966|　進化的プログラミング | 
| 1967|　遺伝的アルゴリズムの最初の概念発表|
| 1968        | 意味ネットワークの提案         | 
| 1969 | パーセプトロン限界説(第１次ニューラルネットワークブームの終焉)|
| 1977       | 知識工学の提唱(エキスパートシステム)       | 
| 1982    | 第5世代コンピュータブロジェクト開始（日本）     | 
| 1990 |遺伝的プログラミング|
| 1992　　|　実世界コンピューティング計画開始（日本）|
|2005|技術的特異点(シンギュラリティ)を発表|
|2010|質問応答システム，ワトソンがクイズ番組ジェバディによって人間に勝利|
|2011|新井紀子らによって[東ロボ](https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%83%AD%E3%83%9C%E3%81%8F%E3%82%93)くんプロジェクトの開始|
|2016/03|米グーグルの子会社DeepMindが作成した囲碁対戦用AI「AlphaGo」が人間のプロ囲碁棋士に勝利|
|2016/11|東ロボくんの東京大学合格を断念．|

<br><br><br>

|             年  |ニューラルネットの歴史       　　　　　　　　　　　　　　　　  |
|:--------------|-------------:|
|1943|ウォーレン・マカロックとウォルター・ピッツがパーセプトロンの原型形式ニューロンを発表|
|1957|フランク・ローゼンブラットがパーセプトロンを考案|
|1969|マービンミンスキーによってパーセプトロンだと線形分離可能な問題しか分類できないことを指摘され，<br>意図せずニューラルネットのブームが終わる|
|1979|福島邦彦氏が畳み込みニューラルネット(CNN)の原型のネオコグニトロンの発表|
|1982|ジョン・ホップフィールドによってホップフィールド・ネットワーク(再帰型ニューラルネットワーク, RNNともいう)が提案された|
|1986|デビッド・ラメルハートらにより誤差逆伝搬法が提案|
|1988|ジェフリー・ヒントンらによりボルツマンマシンを発表|
|1997|HochreiterとSchmidhuberによってLSTMが考案される|
|2006|ジェフリー・ヒントンらによりオートエンコーダおよびディプビリーフネットワークが提案され，深層学習の原型となった．|
|2014|Goodfellow et al.らによりGenarative Adversarial Networksという手法が提案される|

<br><br>




>参照書籍
>[ウィキベディア:ニューラルネット](https://ja.wikipedia.org/wiki/%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF)
>[ウィキペディア：人工知能](https://ja.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD)
><a href="https://www.amazon.co.jp/gp/product/4782855397/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=noriaki0213-22&camp=247&creative=1211&linkCode=as2&creativeASIN=4782855397&linkId=d823ca3840c0ec3ee6f5e4e405b7556a">ニューロ・ファジィ・遺伝的アルゴリズム (エレクトロニクス実践シリーズ)</a>
rubyにおける配列

# 配列とは

一つの変数に複数の値を入れるオブジェクト。順番が自動でつき、その順番を指定することで任意の値を取り出すことができる。

# 配列の書き方

```ruby:test

colors = ["red","white"]
colors[1]

```

左から順に0から数字を振られる。


# 添字（そえじ）について

```ruby:test

colors = ["red","white"]
colors[-1]
# 後ろから指定される
colors[1..3]
# 1から3
colors[1...3]
# 1から3の直前
colors[4]
# nilが返される

```

# 配列の要素を書き換えたい時

```ruby:test

colors[1] = "green"

```
JSでUNIXのタイムスタンプを取得する


```js
const timeStamp = Math.round((new Date()).getTime() / 1000);
```


`getTime（）`はUNIXエポックからミリ秒を返します。1000で割って秒表現を取得し、 Math.round（）で値を整数に変換します。

日時（Tokyo）＝2017/07/27 23:28:17
↓
タイムスタンプ＝1501165697


こちらのサイトでタイムスタンプを日付と時刻に変換できる。
http://url-c.com/tc/
Android＆iOS＆Win＆Macが同じコードで動く！超マルチアプリを作ろう[Monaca × Electron]


# 背景
[Electron](https://electron.atom.io/)によって、WindowsとMacのマルチプラットフォームアプリが作成出来ます。

  * 参照：[[Electron] 5分でWin&Macのクロスプラットフォームアプリを作ろう](http://qiita.com/youwht/items/bc0d45ec5634a98c9b02)


[Monaca](https://ja.monaca.io/) によって、AndroidとiOSのマルチプラットフォームアプリが作成出来ます。

  * 参照：[[Monaca] ２分で出来るAndroid×iOSマルチプラットフォーム開発環境](http://qiita.com/youwht/items/ad8d751bc91e35c00257)


この二つの組み合わせによって、全く同じコードで、
Windows,Mac,Android,iOSの超マルチプラットフォームアプリが作れるという話をします。

また、今回Monacaのアプリケーションは、
[OnsenUI](https://ja.onsen.io/) というUIコンポーネントを使った例で示しますので、
Electron上でOnsenUIを使う方法、を示すことになります。


# 本投稿の内容

 本投稿では、 ElectronとMonacaを、
同じコード（同じプロジェクトフォルダ）から同時に動かせる状態を
チュートリアル的に示します。

# ① Monaca/OnsenUIのテンプレートアプリの準備

下記を参照して、同様にOnsenUIV2のテンプレートアプリを作成します。
参照：[[Electron] 5分でWin&Macのクロスプラットフォームアプリを作ろう](http://qiita.com/youwht/items/bc0d45ec5634a98c9b02)


 * カテゴリを選択　　： Onsen UI
 * テンプレートを選択： Onsen UI V2 JS Navigation


# ② Electron実行用ファイルの準備

下記を参照して、app.js と、package.json を作成します。
内容は参照に記載のものとと全く同じで問題ありません。
参照：[[Electron] 5分でWin&Macのクロスプラットフォームアプリを作ろう](http://qiita.com/youwht/items/bc0d45ec5634a98c9b02)

# ③ ファイルの配置

①で作成したMonaca/OnsenUIのテンプレートアプリのフォルダに、
②で作成した app.js と package.jsonを配置します。
wwwフォルダ配下、index.htmlがある場所です。

```
YourAPP
├─.monaca
├─platforms
├─res
└─www
    ├─components
    ├─css
    ├─lib
    ├─★ここに配置★ app.js
    ├─★ここに配置★ package.json 
    ├─index.html
    └─README.md
```

# ④ 実行

monacaの実行は、参照先の手順と同様です。

electronの実行も、参照先の手順と同様です。
プロジェクトフォルダの代わりに、「www」フォルダを
実行対象のフォルダ（GUIにドラッグ＆ドロップするフォルダ）としてください。

これで、OnsenUIをデスクトップアプリにも適用することが出来ました！

# おつかれさまでした。

今回作成した形のテンプレートによって、
Android、iOS、Windows、Mac、全てに環境で
同一のコードで動くアプリになりました。
Windowsのファイルシステムを使う場合などや、
Macクセのあるコピー＆ペーストを使う場合などは、
Node.jsを使った実装をしなければならず、Monacaとは異なるのですが、
各OSに依存しないような、JavaScriptのフロント系のアプリならば、
超マルチ環境を維持したまま開発を進めることが出来ます。



# エラーが発生する場合の解決策

Monaca×OnsenUIv1 系を、Electronの0.3系に移行した際に、
以下のエラーになって動作しない場合があります。


```
ReferenceError: Hammer is not defined
```


少し古い記事になるのですが、Monacaの開発元の人が書いた以下の記事でも、
Hammerスクリプト関連で相性の問題がある、といった趣旨の記載があります。

http://blog.asial.co.jp/1437

この問題が発生した場合は、
app.jsに、以下のように１行書き加えてください。
（※ new BrowserWindowの中のカンマ区切りを間違えないように書いてください。）

```js:app.js
app.on('ready', function() {
  mainWindow = new BrowserWindow(
    {
      width: 800, 
      height: 580,
      //★ここを追加★
      webPreferences: {nodeIntegration: false}
    }
  );  
  //以下～略～
});
```


以上。

----
この系統の投稿を拡充させてほしいかたは「いいね」をお願いします。
（反応の多いニーズのある話から記載するため）
CentOS7を触る時に最低限覚えておいた方がいいもの

#最初に
Linuxに触れたことのない人とWEBアプリケーションを立ち上げるまでを一緒にすることになったのでそのメモ書きをしたいと思います。
独断と偏見で書くので足りなければコメントをいただければと思います。

##環境
これからの時代CentOS7でしょう。

え？CentOS6もまだ動いてるって？
そのうちになるなるよ。

##基本
cd
ls
systemctl
cp
mv
rm
useradd
passwd

書いていて思ったけどコマンドライン初心者だと絶対パス相対パスみたなところから説明しないといけないですね。

##ネットワークの設定
nmcli
nmtui
ip
ping

この辺を使えたら通信は大丈夫

##セキュリティ
selinux
firewalld
ssh

ここの説明が曲者だから多分後回しになる

##その他
yum
tar

このくらいかな？ソースからインストールする可能性はとりあえず除外
yumのパッケージ管理についても少し細く説明した方が良さそう。

#最後に
この程度のコマンドを課題形式に自分で調べて見つけ当ててもらって
そこからhttpdを動かすところらへんは宿題としてググって来てもらおうと思います。

実際にやってみて漏れがあったら追記編集します。
以上
Ruby 引数の渡し方

# Ruby 引数の渡し方

## 用語
- 仮引数(parameter)
メソッド定義の時に使用される引数。
```
def hoge(x, y); end
```
の`x`, `y`が仮引数
- 実引数(argument)
メソッド使用時に引き渡す引数。
```
hoge(1, 'arg')
```
の`1`, `arg`が実引数。

## 基本

実引数と仮引数は前から順番に結び付けられていく。それぞれ数が一致していないとエラーになる。
```
> def basic(arg1, arg2)
>   p arg1
>   p arg2
> end

# 実引数と仮引数の数が一致
> basic('1', '2')
"1"
"2"

# 実引数が足りないとエラー
> basic('1')
ArgumentError: wrong number of arguments (1 for 2)

# 実引数が多すぎるとエラー
> basic('1', '2', '3')
ArgumentError: wrong number of arguments (3 for 2)
```

## デフォルト値

引数にはデフォルト値をセットすることができる。デフォルト値のついていない引数については基本の場合と同様に、前から順番に実引数と仮引数が結び付けられていく。
実引数の数が仮引数より足りないとき、残りの仮引数に対してデフォルト値がセットされていればその値が使われる。
デフォルト値のない仮引数に対応する実引数がなかった場合は基本の場合と同様にエラーが発生する。

```
> def default(arg1, arg2, arg3='default')
>   p arg1
>   p arg2
>   p arg3
> end

# 実引数の数と仮引数の数が一致
> default('1', '2', '3')
"1"
"2"
"3"

# 実引数の数が足りないときは、デフォルト値が使われる
> default('1', '2')
"1"
"2"
"default"

# デフォルト値の無い仮引数に実引数が与えられないときはエラー
> default('1')
ArgumentError: wrong number of arguments (1 for 2..3)
```
最後の例からわかるように、`default`メソッドは2から3個の引数を受けるメソッドになる。

## キーワード引数
メソッドが必要とする引数の数が増えてくると、使用側でその順番を間違えてしまうこともある。なので、順番ではなく名前で実引数と仮引数の対応をつけることができる。
```
> def keyword(arg1:, arg2:)
>   p arg1
>   p arg2
> end

# キーワードつきで呼び出し
> keyword(arg1: '1', arg2: '2')
"1"
"2"

# 順番

# 実引数の数が足りない
> keyword(arg1: 1)
ArgumentError: missing keyword: arg2

# キーワードなしだと、解決できない
> keyword(1, 2)
ArgumentError: wrong number of arguments (2 for 0)
```

# デフォルト値つきキーワード引数
キーワード引数にもデフォルト値をつけることができる。
```
> def keyword_and_default(arg1: 'default1', arg2: 'default2')
>   p arg1
>   p arg2
> end

# ↑２つの挙動がミックスされる
> keyword_and_default(arg1: '1')
"1"
"default"
```
Active Record を学ぶ

# Active Record を学ぶ

## Active Recordにおける規約

### 命名ルール

- モデルのクラス名は大文字から始まる単数形、データベースのテーブル名は小文字の単数形

| モデル/クラス | テーブル/スキーマ |
|:--:|:--:|
| Post | posts |
| MicroPost | micro_posts |

- 外部キーはテーブル名の単数形_id

- 名前が予約された？カラム

| 名前 | 役割 |
|:--:|:---|
| id | 主キーであり、自動的に作成される。 |
| created_at | レコード作成日時を格納する。自動的に作成される。 |
| updated_at | レコードの最終更新日時を格納する。自動的に作成される。 |
| lock_version | 楽観的ロックを利用するときに使う |
| type | 単一継承テーブルを行うときに使う |
|関連付け名_type | ポリモーフィックアソシエーションを行うときに使う |
| テーブル名_count | 関連付けられている所有オブジェクトの数をキャッシュ |

- テーブル名、主キー名はオーバーライド可能

## 関連付け

### 関連付けの種類

- belongs_to
- has_one
- has_many
- has_many :through
    結合モデルを介して多対多関係を表す
- has_one :through
- has_and_belongs_to_many

belongするほうが持ち主のidを外部キーとして持つ

### ポリモーフィック関連付け

ある一つのモデルを、「そのモデルと関連付け可能なモデル」たちに対して関連付けることができる

```
class Picture < ActiveRecord::Base
  belongs_to :imageable, polymorphic: true
end
 
class Employee < ActiveRecord::Base
  has_many :pictures, as: :imageable
end
 
class Product < ActiveRecord::Base
  has_many :pictures, as: :imageable
end
```

## 参考

[Active Record の基礎](http://railsguides.jp/active_record_basics.html)
[Active Record の関連付け (アソシエーション)](http://railsguides.jp/association_basics.html)
rustupのハマりところ

### 結論
以下のようなエラーがあれば直接 `rustup-init`をダウンロードし，直接実行すればいいって話

```bash
wget https://static.rust-lang.org/rustup/dist/x86_64-apple-darwin/rustup-init
```
`rustup.rs`もcURLでダウンロードした後実行するだけなので

### 確認方法

```bash
❯ rustc --version
rustc 1.19.0 (0ade33941 2017-07-17)
```
### エラーの説明
Rust言語をmacにインストールする際にOfficalのrustupを使ってやってみた．

```bash
curl https://sh.rustup.rs -sSf | sh
```
が，次のようなエラーがあった

```bash
*   Trying {IP}...
* TCP_NODELAY set
* Connected to static.rust-lang.org ({IP}) port 443 (#0)
* WARNING: disabling hostname validation also disables SNI.
* SSL peer handshake failed, the server most likely requires a client certificate to connect
* Closing connection 0
curl: (35) SSL peer handshake failed, the server most likely requires a client certificate to connect
rustup: command failed: curl -sSfL https://static.rust-lang.org/rustup/dist/x86_64-apple-darwin/rustup-init -o /var/folders/gl/_qfnzk2n7jg0/T/tmp.dfCf1BEA/rustup-init
```
cURLは最新版にしたが，解決できなかった

```bash
❯ curl -V
curl 7.54.1 (x86_64-apple-darwin16.6.0) libcurl/7.54.1 SecureTransport zlib/1.2.8
Release-Date: 2017-06-14
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets
```
certificate系のIssueは[github](https://github.com/rust-lang-nursery/rustup.rs/issues/179)にあるが，`SSL_CERT_FILE`はこの場合関係ないように思う
node(electron)で配信ツールつくってみました。その２ youtubeデータを配信

# 概要

http://blog.nicovideo.jp/niconews/34167.html
なんかここみてたら・・・
実装日未定ですが、動画引用機能が・・・
ほぅ・・・

よし、つくってみようということで
http://qiita.com/taktod/items/04d7c7865bef2570f53e
こちらで書いたtakcastに実装してみました。
実際に使ってみる場合は

```
$ git clone git@github.com:taktod/takcast
$ cd takcast
$ npm install
$ npm install --save taktod/takcast.source.youtube
$ npm run setup
$ npm test
```

でいけると思います。

実際の画面はこうなりました。
<img width="624" alt="スクリーンショット 2017-07-27 22.38.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/6246/0c76ff49-36e7-756a-b844-11cf98956afe.png">
選択にyoutubeが増えている

<img width="627" alt="スクリーンショット 2017-07-27 22.38.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/6246/6b60113d-4a95-3190-f358-5058c8bc3987.png">
放送したい動画のIDをいれて右のボタンをクリックして取り込み

<img width="643" alt="スクリーンショット 2017-07-27 22.38.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/6246/6fd136b7-be90-8018-a99e-2c0a41af31ab.png">
動画がちゃんと取り込めたら、右下の[+]ボタンで実際にアイテムとして取り込めます。

![スクリーンショット 2017-07-27 22.39.11.png](https://qiita-image-store.s3.amazonaws.com/0/6246/1d577ced-9e14-4fdc-4676-62de5c9265ed.png)
こんな感じで再生できます。

![スクリーンショット 2017-07-27 22.39.23.png](https://qiita-image-store.s3.amazonaws.com/0/6246/513514bf-c0e5-9c83-099e-e40f8fb79a4a.png)
もちろん任意の場所で回転したり拡大縮小したりできます。

まぁ、シークがないし、リロードができないし等、いろいろ問題ありますが、とりあえずiframeでvideoタグによる再生できるソースならなんでも同じ方法で配信できそうです。

# 感想いろいろ

## iframe

iframeの中身のデータは基本cross domainの問題でアクセスできないんですが、electronで母体のhtmlがfile://でアクセスしている場合はその制限の外にいけるみたいですね。

```
iframe.contentWindow.document.getElementsByTagName("video")
```
で中身の要素にアクセスできるので、いけるな・・・となりました。

## iframeのリロードのわな
iframeの要素をreactでコントロールしている左側のパレット部に配置すると、reactの再描画が走るたびにreloadが走ってしまい、youtubeの動画が最初からやり直しになるという、状況に陥りました。
これはiframeの特徴みたいです。

回避するいい方法がみつからなかったので別の見えないところでyoutubeの外部プレーヤーを配置し、内容をミラーリングしたvideoタグを配置するという方法で対策してみました。

## コンポーネントの取り扱い調整

もともと横のアイテムの部分はHTMLMediaElementのみ配置可能にしていたのですが、今回の調整テストしているときにHTMLElementの配置を可能にしてみました。
まぁ、結局youtube -> canvas -> videoということでHTMLVideoElementを配置してるわけですが・・・

２つ目のリロードの問題があるため、みえないところに外部プレーヤーを設置して動作させてるわけですが、仮にニコ動のデータを引っ張りたい場合は、youtubeのように「javascriptのみで見えないプレーヤーの再生を実行する」
ということができなさそうなので、ちょっとめんどくさそうですね。

# というわけで

とりあえずyoutubeの外部プレーヤー(iframeつかって動作してて、内部的にvideoタグをつかっている)を取り込むことに成功しました。

もっと使い勝手をよくするなら、検索APIをつかって簡単にほしい動画を表示できるようにしたり
ちゃんとリロードやシークできるように改良すべきですが、突貫でつくるなら、こんなものかなというのになりました。
[Monaca] ２分で出来るAndroid×iOSマルチプラットフォーム開発環境


# 背景
[Monaca](https://ja.monaca.io/) (HTMLハイブリッドアプリエンジン)を使えば、
AndroidとiOSの両方に対応したアプリがHTML5+JavaScriptで簡単に作れます。


[Electron](https://electron.atom.io/)を利用することによって、
そのアプリをWIndows&Macに移植することも容易です。
  参照：[[Electron] 5分でWin&Macのクロスプラットフォームアプリを作ろう](http://qiita.com/youwht/items/bc0d45ec5634a98c9b02)


# 本投稿の内容

 本投稿では、Monacaでの開発の準備フェーズとして、
 AndroidとiOSの両方に対応したテンプレートアプリを動かせるように、
 環境構築＆アプリ実行までをチュートリアル形式で示します。
 
 > Monaca/OnsenUI開発ノウハウ投稿の際の環境構築部分の参照用として投稿。
 > 本投稿自体は、準備のみの簡単なものです。
 > Monacaはクラウド開発環境としてブラウザ上での利用が有名ですが、
 > 複数人でGit等を利用して開発する場合、Localkitの方が開発しやすいと思われます。（私見）
 

# ① Monacaユーザ登録と開発環境のダウンロード
### 1. ユーザ登録

下記のURLからMonacaのユーザ登録を行います。

https://ja.monaca.io/

### 2. Monaca Localkitのダウンロード

下記のURLから、環境に合わせたMonaca Localkitをダウンロードします。
（執筆時点のバージョンは2.2.2です。）

https://ja.monaca.io/localkit.html

# ② OnsenUIのテンプレートプロジェクトの作成

MonacaLocalkitにログイン後、
画面左上「プロジェクト一覧」の横の「＋」を押下します。

新しいプロジェクトのダイアログボックスで、
以下のようにテンプレートを選択して作成します。
カテゴリを選択　　： Onsen UI
テンプレートを選択： Onsen UI V2 JS Navigation


# ③ 実行

MonacaLocatki上で、作成したプロジェクトを選択し、
「プレビュー」ボタンを押下してください。

アプリを変更する場合は、作業ディレクトリ下に置かれている、
www/index.html
を修正してください。

### OnsenUIを使ったスマートフォンアプリの実行環境が整いました！

今回作成したテンプレートアプリを、実はElectronでも動かすことが出来る
（OnsenUI使ったデスクトップアプリが作れる、windowsやmacで動かせる）ので、
ぜひ下記の記事も継続して試してみてください。

参照：[Android＆iOS＆Win＆Macが同じコードで動く！超マルチアプリを作ろう[Monaca × Electron]](http://qiita.com/youwht/items/cac4c6a0f725d7689f96)

  参照：[[Electron] 5分でWin&Macのクロスプラットフォームアプリを作ろう](http://qiita.com/youwht/items/bc0d45ec5634a98c9b02)

以上

----
この系統の投稿を拡充させてほしいかたは「いいね」をお願いします。
（反応の多いニーズのある話から記載するため）
JMeterを使ってでかい(large)ファイルを下載しよう

俺です。

# 解決したい課題

JMeterで ファイル 下載 したい。

# 背景

ある日JMeterを使ってHTTPリクエストでファイルをGETしたくなり、
HTTP Samplerで試していたところ、HTTP SamplerではJVM HeapにGETしたファイルを溜め込んでしまいます。
実行スレッド数を上昇させるとFull GC地獄に陥ることがわかったので、回避策を考えました。
というか@h-imaoka先生に聞いてなんかねーか教えてもらいました。

# 解決方法

HTTP Request SamplerではなくBeanShell Samplerを使います。
以下curlを使った一例です。

```
          <BeanShellSampler guiclass="BeanShellSamplerGui" testclass="BeanShellSampler" testname="fairu gesai" enabled="true">
            <stringProp name="BeanShellSampler.query">exec(&quot;/usr/bin/curl -sS -o /dev/null &quot; + vars.get(&quot;URL${count}&quot;)); </stringProp>
            <stringProp name="BeanShellSampler.filename"></stringProp>
            <stringProp name="BeanShellSampler.parameters"></stringProp>
            <boolProp name="BeanShellSampler.resetInterpreter">false</boolProp>
          </BeanShellSampler>
```

# 注意点

- JMeterで発行したスレッド数分curlコマンドがバックグラウンドで起動されます。同時スレッド数を高める時はlimitsの修正など忘れないようにしましょう。
- 転送料金に注意しましょう。

よいJMeterライフを!
TensorFlow > 2つの学習のloss経過比較 > Red成分とBlue成分での比較 

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

hidden unit: 30x100x100
の計算を繰り返している。

理由は不明だが、lossの経過が実行ごとに異なる。

loss 経過の比較をしてみた。

### 準備

Jupyterでloss経過の表示をする。

以下の手順でgnome-screenshotでブラウザごとの画像を取得する。

1. gnome-screenshot -i
    - ダイアログが開く
2. 「現在のウィンドウ」を選択
3. ブラウザを選択
4. 「スクリーンショットの取得」を選択
    - ブラウザの画像が保存される

もうひとつの比較対象結果に対して、同じ手順を踏む。

### Red,Blue比較

[ImageMagick > link > 画像の違いを ImageMagick でビジュアル化](http://qiita.com/7of9/items/b59f6d2fb7ab72d53b1c)

上記の方法でa_red.pngとb_blue.pngからdiff.pngを作成。
ブラウザの上部などの画像は色合成後に`gnome-screenshot --area`にて切り取った。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f1d32a17-492c-494e-3cc6-5f4a3bc94576.png)

400,000あたりの経過が異なるが、こういうものだろうか。
FlutterでAndroidエミュレータ使うときの注意点

Flutterをいじり始めました。

iOSはすんなりエミュレーターで起動できたのですが、Androidのエミュレータがさっぱり動かなかったのでそれを解決したメモです。

# 結論
x86イメージは未サポート

このgithub issueにてトラックされていますが、flutterはx86のandroidをサポートしていません。
[Provide x86 Android Release binaries](https://github.com/flutter/flutter/issues/9253)

なので、armのエミュレータを使う必要があります。

が、android AVDのarmといえばかの有名な爆遅エミュレーターです。そんなときはGenyMotionを使うと快適にarmのエミュレーターでflutterを動かすことができます。Genymotionは個人利用であれば無料で使えます。
https://www.genymotion.com/

Android 7.0 pixcelのイメージを使った感じはこちら。
<img width="1680" alt="スクリーンショット 2017-07-27 21.59.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/60457/66ff1e5f-8a82-6426-1606-9676e3605708.png">

Android端末もってないのでこれでようやくflutterをじっくりいじれる環境が整いました。
Rails 多言語化対応 Model編

# はじめに
今後のサービス化していくシステムは多言語化対応が必須となってきます。
なので、多言語化の方針と記述方法を簡単にまとめたので目を通してください。
View編を先に一読ください↓
[Rails 多言語化対応 View編](http://qiita.com/ss_watanabe/items/64bbf8ed878daafcd4f1)

# 参考サイト
以下のサイトを参考にしました。
記事を読む前に一読お願いします。
[モデル名やモデルの属性名の多言語化](
http://morizyun.github.io/ruby/rails-function-i18n-internationalization.html#モデル名やモデルの属性名の多言語化)

# 実装

## dictionary
1つのファイルに全文言をかくと意味不明状態になるので、
参考サイトに倣って然るべき場所に然るべきファイルを作成し文言を記述していきます。
今回はbrandのvalidationで使いたかったので

- config/locales/models/brands/ja.yml
- config/locales/models/brands/en.yml

を作成しています。

```yaml:config/locales/models/brands/ja.yml
ja:
  activerecord:
    models:
      brand: ブランド
    attributes:
      brand:
        id: ブランドID
        name: ブランド名
        name_en: ブランド名（英語）
        sellable_jp: Sellable JP
        sellable_us: Sellable US
        brand_category_id: ブランドカテゴリー
```

```yaml:config/locales/models/brands/en.yml
en:
  activerecord:
    models:
      brand: Brand
    attributes:
      brand:
        id: Brand ID
        name: Brand Name
        name_en: Brand Name（English）
        sellable_jp: Sellable JP
        sellable_us: Sellable US
        brand_category_id: Brand Category
```

これ以外にも階層を持った書き方もできたりします。
詳しくは調べてください。


# 結果
locale = :jaの場合
<img width="1415" alt="スクリーンショット 2017-07-27 21.45.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/a1dc6a27-1c6e-4836-b324-d4fff45033df.png">




locale = :enの場合
<img width="1405" alt="スクリーンショット 2017-07-27 21.45.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/03223b05-3c95-b4bb-8ea3-bf2f3d33984a.png">


# 補足
「を入力してください」の部分はvalidatesを使えば自動で変換されます。
Rails(ActiveRecord)の名前変換規則をちょい確認

#こんなコマンドを書いておくと便利

```ruby:word.rb
#!ruby
require 'active_record'

table={
'-s'=> :singularize,
'-p'=> :pluralize,
'-c'=> :classify,
'-t'=> :tableize,
'-C'=> :camelcase,
'-F'=> :underscore,
}

method=table[ARGV[0]]
ARGV.shift if method
method||=:pluralize
ARGV.each do |v|
  puts v.send(method)
end
```

これで`word tomato banana`とすれば良い感じ。

```
$ word tomato banana
tomatoes
bananas
```
`config/initializers/inflections.rb`による修正は取り込んでいないので注意。

##オプション

|オプション|効用|
|---|---|
| (なし) | 単数形から複数形にする(pluralize)                |
| -p | 単数形から複数形にする(pluralize)                |
| -s | 複数形から単数形にする(singularize)              |
| -F | クラス名からファイル名へ変換する(underscore)     |
| -C | ファイル名からクラス名へ変換する(camelcase)      |
| -t | モデルクラス名からテーブル名へ変換する(tableize) |
| -c | テーブル名からモデルクラス名へ変換する(classify) |

#参考文献

Rails4でクラス名、DB名、ファイル名の変換　http://ruby-rails.hatenadiary.com/entry/20141216/1418729961
あなたの生産性を一時間で二倍にする方法（キーボード設定）

仕事が速いイケてるエンジニアになりたくないですか？
この記事は簡単にできるが、生産性を爆上げする設定についてのまとめです。
初心者向けの内容です。

他にいい方法があればコメントしてくださると嬉しいです。

ちなみにlinuxでキーボードの配置をいじるには
https://github.com/k0kubun/xremap
が簡単でおすすめです。

###SandS
スペースを押しながら他のキーを押すとシフトを押しながら他のキーを押しているのと同じになる機能。導入は簡単だが効果は劇的。
###エンターキー、デリートキーのキーバインドの変更
例えばrubyを書いていると;はほとんど使わない。そこでこの場所にエンターキーを割り当てることでホームポジションが崩れなくなり、生産性が上がる。
###ウェブブラウザをキーボードのみで操作する。
Firefoxだとvimpereterなどのプラグインで実現できる。
以下vimpereterのプラグイン
https://addons.mozilla.org/en-US/firefox/addon/vimperator/
###マウスを左手で操作する
数字キーがある分左に置いた方が手の移動時間が少ない。
###Programmer Dvorak配列、かな入力を使う
Programmer Dvorakはプログラミング用に開発された配列で一般的に普及しているQWARTY配列より英語を入力する際の指の移動が少なく高速でタイピングが出来る。
タイピング速度は体感１．１倍ほどしか上がらないが、疲れた時のタイピングミスは減る。
デメリットとして、ショートカットの位置が変わることと習得がとんでもなく大変。
###エルゴノミクスキーボード
注意しないと当たり外れがある。
以下の「Ergo Dox」などが評価が高い。
http://hamamuratakuo.hatenablog.com/entry/2016/03/26/090502
また、値段を安く済ませたい人は左手用キーボードと通常キーボードの二枚使いという裏ワザもある。
以上で「キーボードの生産性」は二倍になるお話でした。

参考
疲れにくいセパレート型キーボード「Ergo Dox」
http://hamamuratakuo.hatenablog.com/entry/2016/03/26/090502
PHP(Laravel)で実装を始めるまでにした事[1]

最近、仕事でPHPを使うことになったので、家でも勉強をしようと思い
PHPの実行環境作りを始めていこうと思います。

まず、うちのパソコンにはeclipse(Neon)が元々入っているため、その導入は割愛。

#環境作りのお品書き

1. xamppのインストール
2. composerのインストール
3. Laravelプロジェクト作成
4. PHP(Laravel)にて実装開始

#1.xamppのインストール

xamppのインストールを始める前に

皆様が気になっているであろうことを説明します。
そもそもxamppとは何者で、私たちにどんな恩恵を与えてくれるのか？

◎xamppとは何者...?
xamppは、
1. 多種OSに対応するクロスプラットフォームのX
2. ApacheのA
3. MySQLのM
4. PHPのP
5. PerlのP
の、5つから頭文字を取ってxampp。
Apacheディストリビューションと呼ばれるものらしいです。
と、wikiさんやxampp公式サイトさんには書かれていましたが
自分にはピンと来ませんでした、ただ恩恵をみると良く分かります。

◎どんな恩恵がある...?
xamppをインストールすると、PHPやApache、MySQLが一緒に付いてくるため、これだけでPHPの動作環境が完成します！！
(サーバはApache、データベースはMySQLでカバー)
本当に便利なやつです。他の言語で環境構築をした時の辛さを思い出すと、理不尽に感じるレベルです。

さて、xamppが何をしてくれるかわかった所で、インストールを始めましょう！

インストールする場所：[xampp公式サイト](https://www.apachefriends.org/jp/index.html)

xampp公式サイトにアクセス後、自分のOSの所をクリック
<img width="379" alt="SnapCrab_NoName_2017-7-27_21-1-19_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/194164/283c5e7c-d2c8-8001-e6da-1396845009da.png">

私のPCのOSはwindows10のため、windows向けの所をクリック。
すると、自動的にxamppのexeファイルがダウンロードされます。

ダウンロードされたファイルをそのまま開くと...
インストール画面が現れますので、流れでYes！はい！next！を押していきます。
途中でチェックボックスがいっぱい付いた画面が出てきますが、それもそのままnext！
パソコンの容量が気になる方は、要らないもののチェックは外したほうが良いと思いますが、良く分からない方はnextで！！

そうすると、色んなものがインストールされ始めるので、待ちます。
インストール待ち中に、１つ白状。何故インストール中の画像が無いかといいますとxamppのインストールが始まった途端、スクリーンショットソフトが動かなくなってしまって、泣く泣く画像なしでお送りしています...

そしてインストール完了後、Finishボタンが出ますので、そのままクリック！
すると、xamppのコントロール画面が自動で出てきます。

<img width="631" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/194164/21bd9db7-148b-9bfd-be83-ae49b33652a9.png">

この画面で、ApacheやMySQLの起動や設定ができるという、使いやすいUIとなっております。
Apacheを起動しての、PHPの実行などはまた追々書いていきたいと思います。

さて、導入手順を文字に起こすと、意外に時間がかかってしまいました...
本当は全部の導入手順を書く予定でしたが、諦めて後日続きを書こうと思います。
それではまた。

参考サイト
[xampp_wikipedia](https://ja.wikipedia.org/wiki/XAMPP)
[angular] RxJS BehaviorSubject の読み込みエラーの対処法について（疑問）

**RxJS BehaviorSubject** の実装について

```
ERROR Error: Uncaught (in promise): TypeError: 
BehaviorSubject_1.BehaviorSubject is not a constructor
TypeError: BehaviorSubject_1.BehaviorSubject is not a constructor
```
という実行時エラーがどうしても取れなくて
さんざん調べて試したあげく回避できたが、これが正しい実装方法なのかどうか、わからない。。。


**実行時エラーが出る**

```ts
import { Component } from "@angular/core";
import { BehaviorSubject } from "rxjs/BehaviorSubject";

@Component({
  selector : "my-app",
  template : `<h1>Hello World</h1>`,
})
export class MyAppComponent
{
  private _isOpen: BehaviorSubject<boolean> = new BehaviorSubject(false);

  constructor()
  {
    console.log(this._isOpen);
  }
}
```



**実行時エラーが出ない**

```ts
import { Component } from "@angular/core";
import * as Rx from "rxjs";

@Component({
  selector : "my-app",
  template : "<h1>Hello World</h1>",
})
export class MyAppComponent
{
  private _isOpen: Rx.BehaviorSubject<boolean> = new Rx.BehaviorSubject(false);

  constructor()
  {
    console.log(this._isOpen);
  }
}
```


**system.config.js**

```ts
（中略）
  const map = {
    rxjs : "node_modules/rxjs",
  } as {[key: string]: string};
（中略）

  const packages = {
    rxjs : { defaultExtension : "js", main : "bundles/Rx.js" },
  } as {[key: string]: any};
（中略）
```


**vaersion**

```json:package.json
{
    "dependencies": {
        "@angular/animations": "^4.3.1",
        "@angular/common": "^4.3.1",
        "@angular/compiler": "^4.3.1",
        "@angular/compiler-cli": "^4.3.1",
        "@angular/core": "^4.3.1",
        "@angular/forms": "^4.3.1",
        "@angular/http": "^4.3.1",
        "@angular/platform-browser": "^4.3.1",
        "@angular/platform-browser-dynamic": "^4.3.1",
        "@angular/platform-server": "^4.3.1",
        "@angular/router": "^4.3.1",
        "reflect-metadata": "^0.1.10",
        "rxjs": "^5.4.2",
        "systemjs": "^0.20.16",
        "zone.js": "^0.8.14"
    }
}

```
備忘録：「オブジェクト指向でなぜつくるのか」 4章後半

後半戦です。
次にまとめるのは

- パッケージ
- 例外
- ガベージコレクション

です。こちらはそんなに長くないです。
さっそくいきましょう。

##パッケージ
すごく簡単に言うと、「クラスをまとめるもの」です。
クラスはメソッドや変数をまとめる「本」、パッケージはそれをさらにまとめる「棚」みたいなイメージでした。

変数、クラス名の衝突を避けるために
「国名」.「組織の種類」.「組織名」とするのが基本的な決まりごとだとか。

##例外
ただのエラーコードではなく、特別なエラーを示す仕組みですね。
そもそもこれはサブルーチンを再利用する際に必要になったものです。
例えば、
サブルーチンA→サブルーチンB→サブルーチンCの関係で参照をしているとします。
もしサブルーチンCでエラーが起こったとき、例外を使わない場合は何らかのエラーコードをサブルーチンBに返すことになります。
そしてサブルーチンBはエラーが返ってきたので、また別のエラーコードをサブルーチンAに返します。
この連鎖はエラーの後処理をする根元のサブルーチンにたどりつくまで続きます。
さらに根元に処理を書き忘れていると**デバッグが非常に面倒なことになります。**

こうした冗長性を解決するのが例外になります。

例外処理と聞いて真っ先に思いつくのはtry-catchでしょうか。

```csharp
public static string ReadAllText(string filePath)
{
    System.IO.StreamReader sr;

    try
    {
        //ファイルを開く
        sr = System.IO.File.OpenText(filePath);
    }
    catch (System.IO.FileNotFoundException ex)
    {
        //FileNotFoundExceptionをキャッチした時
        System.Console.WriteLine("ファイルが見つかりませんでした。");
        System.Console.WriteLine(ex.Message);
        return null;
    }

    //内容をすべて読み込む
    string s = sr.ReadToEnd();
    //ファイルを閉じる
    sr.Close();

    //結果を返す
    return s;
}
```

引用：https://dobon.net/vb/dotnet/beginner/exceptionhandling.html

こちらは`FileNotFoundException`という例外を発見した時、`catch{}`の中に書いてある処理を行います。
これにより、例外処理の連鎖を最小限に抑えることができます。
ためしにページアプリケーションを作り、ブレークポイントでエラーを追って見ると、どこかで例外に当たると思います。
でもあまり処理を意識して書いてませんよね？
そう言う具合にプログラマに楽をさせる仕組みが例外です。
`NullPointerException`を嫌わないであげてください。

##ガベージコレクション
「いらなくなったオブジェクトを捨てる」仕組みです。
C言語などでは「メモリの確保」、「メモリの解放」を明示的にコードでやる必要がありました。
その手間を排除するのがガベージコレクションです。
詳しい説明は次の章で行います。

#まとめ
制約がふえることで大変なイメージを持つかと思いますが、
これらの便利な仕組みを使いこなせるかはプログラマの腕にかかっています。
僕も頑張ります、、、
[Visual Studio Code] Javascriptが保存時に自動で整形される場合の確認箇所(拡張機能にも注意)

最近、エディタは個人的にVisual Studio Code(VSCode)を使っているのですが、保存時のコード自動整形で少し躓いたので設定メモ。

# 起きたこと

ある日突然、VSCodeがJavascript(今回はExpress.js)のコードを自動整形するようになり、ブランチ間で大量の差分が出るようになってしまいました。

整形で削除されたスペースによる大量の差分・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/94ba0631-a05c-2ee1-98b6-6a209ddb9e5c.png)

VSCodeには自動整形機能があり、「先日のアップデートからデフォルト有効になっちゃったのかな？」と思い確認してみましたが、有効にはなっていませんでした。念のため関係ありそうな設定を個人設定に「全て無効」で上書きしてみましたが、挙動は変わりません。

- [設定 | VS Code Docs](https://vscode-doc-jp.github.io/docs/getstarted/settings.html) : __``%APPDATA%\Code\User\settings.json``__ に設定を上書きしていく

- [Visual Studio Code September 2016 1.6](https://code.visualstudio.com/updates/v1_6#_format-on-save) : Ver. 1.6から「保存時の整形」が追加されていた(デフォルトはfalse)

- [Visual Studio Code で「保存時に自動整形」「タイプ時に自動整形」を有効にする](http://devadjust.exblog.jp/23791887/)

# 原因は拡張機能の追加

色々調べた結果、"JS-CSS-HTML Formatter"という拡張機能が原因でした。この拡張機能では整形内容の細かい設定はできないので、整形しないためには拡張機能自体を無効にするしかありませんでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172826/db77915c-e444-2481-de72-040b21f5d501.png)

VSCodeは常に最新版を使うよう更新してきましたが、今回は思わぬ時間をとられました。
本来はこのあたりのFormatterも開発者全員で合わせた方がいいので、VSCodeならsettings.jsonを共有すればうまく運用できるかもしれません。
Learn Git Branchingの回答(ネタバレ注意！)

# はじめに

Gitのイメージをつかむ勉強用として[Learn Git Branching](http://k.swd.cc/learnGitBranching-ja/)
というサイトがあるのですが。。。

デザインはいいのだが初心者である自分が個人的にわかりにくかったため
回答及び解説（というかほぼメモ）として投稿しました！

参考までにどうぞ。文章だけだとわかりにくいので
実際にサイトを見ながら進めると勉強になると思います！

（必然的にネタバレになるため注意してくださいねー。）


# 1. まずはここから - gitの基本的なコマンド群をほどよいペースで学ぶ

## 1-1. commit
### 1-1-1. Tutoreal
`git commit` ⇒ コミットする

### 1-1-2. 演習
Q. コミットを2回してください

A.
1. `git commit`

* `git commit`

[END]

## 1-2. branch
### 1-2-1. Tutoreal
`git branch newImage` ⇒ 新しいブランチを作成する

…ここで新しいブランチに変更を加えてしまうと
`master`ブランチを対象としてしまうため、一度作業場所を変える必要があります。

よって、


`git checkout [ブランチ名]` ⇒ 作業したいブランチ名を指定します。



実際のコマンドとしては、`git checkout newImage`
を実行することで作業場所を変更。そして

`git commit`

を実行することで当初の目的通り変更箇所をnewImageブランチにすることができます。

### 1-2-2. 演習
Q. 新規ブランチbugFixを作成し、bugFixブランチへ作業場所を移動してください。

A.

1. `git branch bugFix`

* `git checkout bugFix`

[END]

## 1-3. merge
### 1-3-1. Tutoreal
本項目は前回の復習から行なっています。

bugFixブランチをmasterブランチにマージ

`git merge bugFix`

masterブランチをbugFixブランチにマージ

`git checkout bugFix`

`git merge master`


### 1-3-2. 演習

1. `git branch bugFix` ("bugFix"という名前で新しいブランチを切る)

* `git checkout bugFix` (bugFixブランチをチェックアウトする)

* `git commit`(一回だけコミットする要はbugFixを更新)

* `git checkout master`(masterで更新を行うため移動)

* `git commit`(もう1回コミットする)

* `git merge bugFix`(git mergeコマンドを使って、bugFixブランチをmasterブランチへとマージ)

[END]

## 1-4. rebase
### 1-4-1. Tutoreal
実際には並行して開発された2つの別々のブランチ上のフィーチャを、あたかも1本のブランチ上でシーケンシャルに開発されていたかのように見せることができます。
`git rebase`

### 1-4-2. 演習

1. `git branch bugFix` ("bugFix"という名前の新しいブランチを作成)

* `git checkout bugFix` (チェックアウトする)

* `git commit` (一回だけコミットする)

* `git checkout master` (masterブランチに戻る)

* `git commit`(もう1回コミット)

* `git checkout bugFix` (bugFixをもう1回チェックアウト)

* `git rebase master` (master上にリベース、masterの下にbugFixを持ってくる)

[END]


## 用語
ちょいちょいよくわかんない単語出てくるので読み替えてみるとわかりやすいかもしれないですね。

読み替え方等気が向いたら追記します(笑)

## おわりに
最後までお読みいただきありがとうございました！

PV伸びたら2章も同様にまとめたいと思いますー(笑)

本記事は[当サイト](tegend.net)にも
記載しているのでよかったら見てくださいね！
jsでダウンロードを実装した話

こういうコードを書くたび忘れそうと思うので備忘録。

コードの方で作成したjsonオブジェクトをファイルに書き込み、ダウンロードするボタンを作りました。
ボタンクリックすると遷移なしでダウンロードが始まる感じです。
ちなみに下記ではAndular使ってますので、使ってない場合は適宜修正してください

#さっそく実装
HTML5では`download`属性にファイル名、`href`にファイルパスを指定することでファイルをダウンロードできます。

```html
<a href="download/acme-doc-2.0.1.txt" download="Acme Documentation (ver. 2.0.1).txt">Download Text</a>
```

しかしこれで僕がやりたいことをやるには

 - ファイルを適当な場所に作成、保存
 - その保存場所をhrefに指定してダウンロード

と二度手間になってしまう。
ボタンを押すだけで、コードの別の部分で作ったjsonをそのままファイルに書き込み、保存し、ダウンロードしたかったんです。
探したらありました。下記を参考に書いてみます。
http://kuroeveryday.blogspot.jp/2015/07/javascript-upload-download.html
https://elearn.jp/jmemo/javascript/memo-325.html

```html:html側
<button type="button" ng-click="downloadJson();">ダウンロード</button>
```

```js:js側
$scope.downloadJson = function () {
		  //ファイルを作ってダウンロードします。
		  var resultJson = JSON.stringify($scope.jsonObj);
	      var downLoadLink = document.createElement("a");
	      downLoadLink.download = $scope.fileName;
	      downLoadLink.href = URL.createObjectURL(new Blob([resultJson], {type: "text.plain"}));
	      downLoadLink.dataset.downloadurl = ["text/plain", downLoadLink.download, downLoadLink.href].join(":");
	      downLoadLink.click();
	  }
```

上記の`download`属性をhtmlで設定する代わりにjsで`createElement`を使って設定しています。
気になる（というかぱっと見でよくわからなかった）のは

```javascript
URL.createObjectURL(new Blob([resultJson], {type: "text.plain"}))
```
と

```javascript
downLoadLink.dataset.downloadurl = ["text/plain", downLoadLink.download, downLoadLink.href].join(":");
```
の部分。

##URL.createObjectURLについて
こちらにいろいろ書いてありました。
http://hakuhin.jp/js/blob_url_scheme.html

**Blob URL Scheme**というものを生成するメソッドだそうです。
要するにオブジェクトを指定するとそこから**ランダムな文字列**を**動的に**生成してURLに使うもので、
URLにディレクトリ名が入らないので機密性が保証されると。
具体的な生成法は不明です。ていうかわかったらまずいですよね…
ちなみに大容量のデータでも重くならないらしいです。この辺はよくわからないので要調査。

##dataset.downloadurlについて
https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/dataset
こちらのサイトによると、

>カスタムdata属性 (data-*)のセットされたすべての要素に対して、読み取り専用のプロパティを提供するためのものです。

とのこと。
これ以外の説明はちょっと見当たらなかったのでこれも要調査
Chromeで二本指でスワイプすると戻る機能を無効にしたい

# 課題
chromeで作業中に２本指でスワイプをして前のページに戻ってしまい、入力が初期化されてしまう問題を解決したい。

# 変更方法１：Chromeだけ無効にする

ターミナルで以下のコマンドを実行し、Chromeを再起動する

```
$ defaults write com.google.Chrome AppleEnableSwipeNavigateWithScrolls -bool FALSE
```

# 変更方法2：全てのアプリで無効にする
システム環境設定 > トラックパッド > その他のジェスチャ

<img width="670" alt="貼り付けた画像_2017_07_27_19_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/2432/09a2bd59-621d-afe7-59cc-72334984b3e9.png">


# その他
英語では、`two-finger back/forward navigation`というらしい

# 参考
https://apple.stackexchange.com/questions/21236/how-do-i-disable-chromes-two-finger-back-forward-navigation
非機能要求グレードの項目だけ抜き出し

##非機能要求グレード
http://www.ipa.go.jp/sec/softwareengineering/reports/20100416.html

##大項目と中項目を書き出しただけ
可用性
　継続性
　耐障害性
　災害対策
　回復性
性能・拡張性
　業務処理量
　性能目標値
　リソース拡張性
　性能品質保証
運用・保守性
　通常運用
　保守運用
　障害時運用
　運用環境
　サポート体制
移行性
　移行時期
　移行方式
　移行計画
セキュリティ
　セキュリティリスク分析
　セキュリティ診断
　セキュリティリスク管理
　アクセス/利用制限
　データの秘匿
　不正追跡/監視
　ネットワーク対策
　マルウェア対策
　web対策
システム環境・エコロジー
　システム制約/前提条件
　システム特性
　適合規格
　機材設置環境条件
　環境マネジメント
ShareLaTeXからOverLeafへの移行

論文の共同執筆ツールのShareLatexを使っていたが、OverLeafと合併したという連絡を受けた。PNASやFrontier系の雑誌でも投稿時に推奨しているとのことで、使用感を比較してみた。

** ShareLaTexの方が優れている点

* 共同作業時の追従スピードが早い
相手の入力しているカーソルが表示されてほぼリアルタイムで動く。同じ場所で作業をしているととても便利

** OverLeafの方が優れている点

* テンプレートが豊富

論文に関しても様々なジャーナルのテンプレートがすでに用意されている。そのほかポスターやプレゼンテーションファイル、履歴書など、よく使われる文書についてはすぐ使えるテンプレートが豊富に存在する

* Rich Textモードで数式がリアルタイムで表示できる

TeXのコマンドがほぼその場で変換されるので、間違いを見つけやすい
C++ Builder XE4, 10.2 Tokyo > TODOリスト > .cppファイルのみ表示される | .hファイルと.cファイルはエディタ上で開いている時のみ表示される

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

IDE上で表示されるTODOリストに関して。

- .cppファイルのTODO記載は表示される
- .hファイルのTODO記載は表示されない
- .cファイルのTODO記載は表示されない
    - ただし、.hファイル、.cファイルをIDEのエディタで開いている時はTODO記載が表示される

この振る舞いを知らずにTODOを消化していて、途中で気づいた。
気づかずに処理忘れをするところだった。

TODOを.hファイルや.cファイルに記載した場合は、外部エディタで逐次確認した方が良さそう。

### 10.2 Tokyo
(追記 2017/12/28)

10.2 TokyoではTODOリストに項目が表示されない場合がある。
再現条件は不明であるが、プロジェクトを開きなおすと解消する場合がある。
.htaccessリダイレクト　ディレクトリを1つ持たせたい時 例

調べても、意外とピンポイントでやり方が載っている記事がなかったのでメモ。

# やりたい事
/index.html　→　/hoge/index.html
/aaa/index.html　→　/hoge/aaa/index.html
↑こんな感じで全てのファイルに1つディレクトリを挟むようにする転送。

[こちら](http://konboi.hatenablog.com/entry/2013/03/11/172544)の記事を参考に作ってみた結果、
hoge/aaa/等も全てhoge/に転送されてしまいダメでした。。。

```
RewriteEngine On
RewriteCond %{REQUEST_URI} !/hoge
RewriteRule ^(.*)$ /hoge/ [R,L]

```

# 解決策
**$1を転送するディレクトリの後ろに付ける。**
$1で(.*)部分を渡す。除外したファイル以外の全てのファイルをhoge/の配下にリダイレクトしてくれます。

```
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !/hoge
RewriteRule ^(.*)$ /hoge/$1 [R=301,L]

```
MacbookPro所感（2ヶ月）

MacbookProに買い換えてから２ヶ月経ちましたので所感を改めて
**随時更新予定**

# スペック

* Macbook Pro 2016
* 15inch
* 2.7 GHz Intel Core i7 (Quad core)
* 16GB Memory
* 512GB SSD
* Intel HD Graphics 530 1536 MB
* USキーボード

整備済みを選んだので選択肢はあまりなく、グラボもCPUも上の下くらいのスペックです
海外で働く予定があったので、慣れのためにUSキーボードにしています


# 利用用途
Android/iOSアプリ開発

# 比較元
* Macbook Pro 2015 Early 13inch
* 2.7 GHz Intel Core i5 (Dual core)
* 8GB Memory
* 256GB SSD

# 感想
## 総評

**とにかく速い。** これに尽きる。

あらゆる作業がストレスフリーかつ効率良く行えるようになりました。
これは、買い替え前からCPUのスコア２倍、メモリも２倍になっているのが大きいと思う。

しかし、 **お高い！！**
本体価格もさながら、USB-typeCになったことで周辺機器も買い揃える必要があります
私は結局１万円ほどプラスになりました

デザイナーさんやプログラマのように、
PCスペックに左右される仕事をされており、作業効率をあげたい！
という方には買いなさいと断言できるが、一般利用はさすがにお勧めできません。
（ネットサーフィン、Excel、Word、PowerPointなどのツールを主に使用するなど）

どうしてもMacを使いたいという方は
Macbook、あるいはMacbookAirで十分かと思います

**ただ、仕事で使う場合はメモリはアップグレードして積むべき！！**

## とにかく速い
仕事がプログラマなんですが、
ソースコミットすんのにどんだけかかんねん！
というのがなくなりました、激ハッピーです

複数のアプリを立ち上げていてもスピードが変わらず、
何より、ビルド中にもかかわらず他の作業が快適にできるのにはびっくりしました

ビルドスピードも上がったし、何をするにも処理落ちしないので
想像されているよりかなり作業効率が上がるかと思います

## 画面が大きい
13inchも大きいと思っていたんですが、
15inchに買えかえると、もう戻れません

13inchのときはサブディスプレイがないと仕事やってられませんでしたが
15inchだと割と広く使えるので、出先でもあまり不自由さを感じたことはありません

## 物理的に軽いし薄い
これは嬉しい誤算で、
買い替え前よりでかいくせに、軽い気がします

**しかも薄い**

## USB type-C は意外と便利
思っていたよりも便利に思う場合が多かった
**特に、電源！！**

電源もUSB type-Cになったことで、
家の机、学校の机、または移動中の新幹線の中や飛行機の中など、
場面場面で電源の場所が右、左と変わる場合に超便利です

自分のlaptopを持ち運ぶフリーランスの方からすると、
非常に便利になったと言わざるを得ないのではないでしょうか

15inchの場合は左右に２つずつあるので、
左右からコードが出て煩わしくなることもないです

## でも USB type-A も欲しい
とはいえ、お客さんや友達からデータを移す場合などは、
USBメモリやSDカードが主流だと思うので、やはり不便です

ひとつあるだけでだいぶ違うと思うんですけどね・・・
なぜすべてtype-Cにしたのか

**まぁ変換アダプタ持っていれば問題ないんですけどね**

## SDカードスロットは欲しかった
デジカメからデータ移すときめっちゃ不便
USB使うにしても変換がいるので、あればよかったなと思う

**まぁ変換アダプタ持っていれば問題ないんですけどね**

## 指紋認証が楽
ログイン時に指紋認証が地味に便利
買い物もこれでできたりするので、非常に便利です

## タッチバー は微妙
YoutubeやiTunesの再生箇所が調整できるところや
場面場面によって必要なキーが並ぶ、かつ視覚的にわかりやすいのはGood

しかし、タッチバー上のキーを押した感覚がないのが非常に辛い
え、押せたの？　押せなかったの？　というのが、ままあり、ストレス
せめて音ほしい

## バタフライキーボードが良い
わりと賛否両論ありますが、私は好きです

薄いくせにタイプ感をこれだけ出せるのは素晴らしい。
かつ、そのタイプ音も不快ではない。
外から聞いていても不快なカチャカチャターン！みたいな音にならないのもGood

いやほんと、体験してみて。

## USキーボード Good
特に不便を感じずに導入することができました
むしろ **プログラマはUSキーボードの方がいいのではと思った**
それはキー配置（`:``\``'`あたりの使い勝手）がすごくいいと感じたからです

でも日本で働く場合はJISでいいと思います
久しぶりにJIS使うと非常に使いづらくてストレスだったので、
会社に所属されており会社支給のキーボード使う場合は迷わずJISでしょう

# おすすめツール

## [⌘英かな](https://ei-kana.appspot.com/)
USキーボードを利用する日本人には神ツール
`⌘`だけを入力すると英かなを切り替えてくれます

**無料です**

## [Jasper](https://jasperapp.io/)
Githubリポジトリの更新を監視するツールです
PR/issueの更新や編集までを監視して通知してくれます

また、通知はメールのような形で確認できるので、
確認漏れも起きにくいような仕組みになっています

自分にアサインされていたり、メンションされているものは
`Me`という通知ボックスに入っており、ぶっちゃけこれ確認するだけで事足りるのも嬉しい

**1ヶ月無料、それ以降は買い切りで$12です（安い！！）**

# Macの設定

## 日本語自動変換OFF

Macって、なぜか日本語のローマ字を自動変換してくれます
余計なお節介であり、これウザいですよね

OFFしましょう

## Fnキー対応アプリ設定

例えばテキストエディターなど、
タッチバーを利用することがないアプリは
Fnキーをデフォルトに設定することができます

私の場合、Chrome、AndroidStudio、Kobitoなどはこれを設定しています
codeigniter　foreachの中でsql発行したくない。。where_in使ってみる

foreachの中でforeachしちゃうサンプルが下記。

foreachの中で更にforeach使ってしかもsql文も発行してる。
重さ的にもよろしくないです。

```php
	$where = [
			'user_id' => $user_id,
			'delete_flag' => 1,
		];
		$this->db->where($where);

		/* リストが無かった時の処理 */
		$template_list = $this->db->get('template')->result_array();

		$template_ids = array_column($template_list, 'id');

		$trigger_con = 0;
		foreach ($template_ids as $value) {
			$where = [
				'template_id' => $value,
				'delete_flag' => 1,
			];
			$this->db->where($where);
			$template_message = $this->db->get('template_message')->result_array();
			foreach ($template_message as $key => $val) {
				
				if($val['trigger']){
					$trigger_con++;
				}
			}
		}

		$field = [
			'message_count' => $count
		];
		$where = [
			'id' => $user_id
		];

		$this->db->where($where);
		return $this->db->update('user', $field);
```
これを綺麗にしてみると下記になります。
チェックするべき箇所は下記になります。

##  array_column();
第一引数の中から、第二引数で指定したカラムを添え字にいれてくれる。
わざわざ`foreach`しなくて済みます。

## where_in
`where IN()`文を生成してくれる。
第一引数のカラムを第二引数で絞ります。
第二引数は配列可。

##IS NOT NULL
NULLだった場合は数えない処理の為に入れた。
第三引数にfalseを指定する事でsql文をエスケープしなくなります。

## num_rows
配列の数を返却してくれます。


綺麗さっぱりになったコードはこちら。↓

```php:model
		$where = [
			'user_id' => $user_id,
			'flag' => 1,
		];
		$this->db->where($where);

		$template_list = $this->db->get('template')->result_array();
		$template_ids = array_column($template_list, 'id');

		$this->db->where_in('template_id', $template_ids);
		$this->db->where('flag', 1);
		$this->db->where('`trigger` IS NOT NULL', null, false);
		$template_message = $this->db->get('sample_table')->num_rows();


		$field = [
			'con' => $count
		];
		$where = [
			'id' => $user_id
		];

		$this->db->where($where);
		return $this->db->update('user', $field);>num_rows();
```
IntelliJ IDEA初期設定 開発環境構築・設定メモ




# 概要
IntelliJ IDEAをインストールしたら最初に行う設定。

# 環境
- IntelliJ IDEA Ultimate
- Version: 2017.2
- Build: 172.3317.76

# 参考
[IntelliJ IDEA初期設定（主にエディタ）](http://qiita.com/keita-nishimoto/items/5968b9eee4177c302481#%E6%A6%82%E8%A6%81)

# ダウンロード＆インストール
[IntelliJ IDEA :: Download Latest Version of IntelliJ IDEA](https://www.jetbrains.com/idea/download/)からインストーラーをダウンロードしてインストールします。

# 初回起動時の設定
![2017-07-27 (51).png](https://qiita-image-store.s3.amazonaws.com/0/128244/abd80f26-7bb9-f325-ff0e-8ddbeb3e0cde.png)
既存の設定がない場合は下を選択することになります。

![2017-07-27 (52).png](https://qiita-image-store.s3.amazonaws.com/0/128244/52f77464-dfd4-c4ad-ede2-8a48c9a4b886.png)
ライセンス同意画面。

![2017-07-26-1.png](https://qiita-image-store.s3.amazonaws.com/0/128244/6cabad69-90a8-c302-d9f9-e9c31cc02ae8.png)
私は背景黒が好きなのでDarculaを選択します。

![2017-07-26-2.png](https://qiita-image-store.s3.amazonaws.com/0/128244/9ee83c40-7778-a650-5a9c-db66402878a5.png)
● Java Frameworks - Disable All
● Version Contorols - GitとGitHub以外チェック外す


次画面のFeatured pluginsはなにも変更せずに次に行きました（キャプチャ撮り忘れ）

# 設定
![2017-07-27 (68).png](https://qiita-image-store.s3.amazonaws.com/0/128244/d1d07dfb-c246-8c2a-7a45-46be956bea65.png)
起動すると上画像の画面が表示されます。
右下のConfigure-settingsから設定画面を表示します。


![2017-07-27 (69).png](https://qiita-image-store.s3.amazonaws.com/0/128244/e88a69ce-e9da-c9ba-ed93-521084aef389.png)

##　設定した項目
- Appearance & Behavior 
    - System Settings 
        - Reopen last project on startup - オフ
            - （起動時に前回開いてたプロジェクトを開く）
        - Open project in new window - 選択
            - （新しいプロジェクトは新しいウィンドウで開く）
- Editor
    - General
        - Change font size (Zoom) with... - オン
            - （ctrl + マウスホイールで拡大縮小）
        - Ensure line feed at file end on Save - オン
            - （行末の不要なスペースやタブを保存時に削除する）
    - General - Appearance 
        - Show method separators - オン
            - （メソッドの区切り線）
        - Show whitespaces - オン
            - （空白の表示）
    - General - Code Completion 
        - Case sensitive completion - None
            - （大文字小文字を区別しないで補完）
    - Font
        - Size: - 15
        - Line spacing: - 1.2
    - Color Scheme
        - Language Defaults
            - Inline parameter hint 黒系テーマだと見づらいので適当に明るくする
    - Code Style
        - Line separator (for new files): - Unix and OS X (\n)
    - File Encodings 
        - Project Encoding: UTF-8
        - Default encoding for properties files: UTF-8
        - Transparent native-to-ascii conversion - オン
            - （native2asciiの有効化）
- Plugins
    - Browse Repositories
        - プラグインのインストール
            - Ruby
            - Python
            - PHP
            - NodeJS
            - Vagrant
            - BashSupport
            - YAML/Ansible Support
            - Markdown Navigator
            - .ignore
            - WordPress Support
            - nginx Support
            - Apache config (.htaccess) support
            - ini4Idea

# おわりに
もう手放せないよっていうIntelliJ IDEAの設定内容をまとめてみました。
年1万程度のライセンス料は高いと思うかもしれませんが（思ってる）、すごく使いやすいIDEなのでおすすめです！
脳内プログラミングをしよう

#science fictionの話ではないです
頭の中でプログラムを組んでみようという話

#理由　プログラミングがダルくなってきたので
プログラムを100ファイルアップするまで毎日qiita更新しようかと思ってたけど、プログラミングに対して若干ダルさを感じてきたので原因を分析

#プログラミングがダルい原因
プログラミングという行為を解体すると、
##何を作るか決める
##だいたいどんな感じで作れば良いかパーツを考える
##コーディング
##テスト
###動かない場所をデバグ
####動かない箇所を修正
という感じでダルく感じるのはコーディングと動かない場所の修正の部分
さらにその原因を解体すると
1.関数と関数の使い方を思い出せない
2.文法を思い出せない
3.一度書いたコードのブロックを思い出せない
4.正規表現を思い出せない
5.前に書いたコードを全体的に思い出せない
6.データ構造を把握できていない
という有様で、要はほとんどの原因がその都度リファレンスや過去に書いたコードや読んだコードを思い出すのに労力を取られてることが分かった。
これは当然ダルい。
6については事前にこまめにpp(他の言語のメソッドは知らん)しとけば問題なし。
要は覚えておけば解決っていうロジックの世界から多少離れた体育会系的な解決策で解決できる。

#プログラミングはぷよぷよと同じ
書きたいプログラムを思いついたが目の前にPCが無いし、すぐプログラムできない。
そういった場合あなたはどうするか。
以前ぷよぷよにハマった時は頭の中でぷよを動かして連鎖のパターンをいくつも作って練習していた。
で、実際だいぶ上手くなって子供の頃にぷよぷよを持っていた相手に2週間くらいで勝てるようになった。俺の頭がおかしくて偏執的にずっとぷよぷよのことを考え続けたから、というわけもないはずだ。
ぷよぷよは色の種類とパターンがある程度決まっているからできる。
さて、プログラミングでは。

#つまりなぜプログラミングがダルくなってるか
プログラミングのダルいところはデバッグではなくて、実装でいちいち何かリファレンスを見なきゃいけないところだと思う。
短いコードのブロックからデータ構造をきちんと把握して、大きくしていけばtypo以外でバグは比較的小さなプログラム(100行以下などで最大でも多重ネストを避けて、既知のクラスやメソッドのみを利用するなら)ならバグも出づらい。

#脳内でやろう
そういったわけで、少しの間メソッドやコードを頭の中に詰めていちいち書いてる途中に調べるという動作を避けてプログラミングをするということをする。
しかもそれを脳内だけで作って、PCに向かう時は頭にあるものを書くだけ、という状態にする。
そうすれば一日のうち14時間くらいはプログラミングをし続けることができる。はず。

#今後
上手くいったら儲けものくらいで考えておく。ある程度までは成功すると思うけど、完全では無い、というのが自分の予想
[macOS] 外部NASを起動時に自動的にマウントする [Sierra]


ぎっくり腰からのリハビリで記事を一つ書きます。

私はずっと悩んでいました。`automount` を使って、外部のNASドライブをSMBでマウントしていると、どんなにがんばっても７日間で切断される減少が発生します。運がいいとそのまま継続して利用できますが、にっちもさっちもいかない場合は、再認証させつつ、`umount` & `mount` の繰り返しを余儀なくされる上、次、いつマウントが外れるかも謎です。(参考→ [Mac Sierra がブートしなくなった原因と対処方法](http://oshiire.to/archives/4955))

こんなにアホらしいことはないので、解決策を別の視点から探し、ついにたどり着きました。結論から行くと、フツーに `mount` せよです。

# launchctl で、home directory 配下に NASドライブを mount する

とは言え、`/etc/fstab` などはないので、`launchctl` を利用して、shell を書いて、それを実行させます。ポイントは２つあります。

1. home directory 配下にマウントさせる場合、login ユーザの権限で mount させること
2. `mkdir -p` しておくこと

## mount shell の作成

まずは、login user で実行可能な場所に、mount するための shell script を配置します。例えば、`iTunes` のディレクトリを外部NAS で共有しているケースでは次のような書き方になります。

```bash:mount.sh
#!/bin/sh

mkdir -p /Users/<username>/Music/iTunes

mount_smbfs '//<domain name>;<smb user>:<smb password>@<hostname>/<shared directory name>/<folder>' /Users/<username>/Music/iTunes
```

`< >` 内は適宜おきかえて読んで・書き換えてください。ふつーの `mount_smbfs` を実行しているだけです。

先にも書いたように `mkdir -p` は埋めておいてください。mount すると、起動時に勝手に消してるケースが少なくないです。

## launchctl の書き方

次に、この shell script を自動実行させるために、`launchctl` を使います。これは (1)起動時 (2)ログイン時、の二通りで記載するファイルが変わりますが、今回は「起動時」で行きます。作り方は

1. /Library/LaunchDaemons/ 配下に、起動用の `plist` を作成する
2. 作成したファイルの所有権を `root:wheel` にする

だけです。サンプルはコチラ。ファイル名の規則はよくわかっていませんが、`com.<vendor>.<function>.plist` あたりになってれば問題なさげです。

```bash:com.oshiire.mount.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.<vendor>.<function></string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <dict>
        <key>SuccessfulExit</key>
        <false/>
    </dict>
    <key>ProgramArguments</key>
    <array>
        <string><実行ファイル名></string>
    </array>
    <key>UserName</key>
    <string><ログインユーザ名></string>
</dict>
</plist>

```

これで、7日以上経過しても mountしたままでいけます。実行する shell script 内で `chmod` や `chown` をうまく使いながらやれば、`/Volume/` 配下に起動時マウントさせる方法もできるようです。

### 参考

- [Launchd script to mount volume on boot](https://apple.stackexchange.com/questions/229209/launchd-script-to-mount-volume-on-boot)
- [Launchdとりあえず使ってみるまとめ](http://komaken.me/blog/2016/02/29/macosxlaunchd%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%81%BE%E3%81%A8%E3%82%81/)
SmartGit > Logウィンドウ > Filesペインで選択中に開いた場合の失敗

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

Logウィンドウを表示時に行ってしまう間違い。

### Filesペインのファイルを選択中にLogウィンドウを開く

この場合、全部のファイルのLogが見えるのではなく、選択中のファイルに関してのみのLogが見えるようになる。

ここでAdd Tagをすると、本来付加したいTagでなく、古いコミットにTagを付加してしまう間違いをしてしまう。

### Journalペイン選択中にLogウィンドウを開く

この場合、全部のコミットのログが表示される。

Tagを付加する場合はこちらが良さそう。