OmniAICreator/Qiita-1.07M huggingface dataset:
特定ディレクトリ以下のプログラムの行数を調べたい

# 結論
```
find . -name "*.php" | xargs wc -l | awk '{a+=$1} END{print a;}'
```
行数を調べたいディレクトリに移動して上記コマンド実行すれば指定した拡張子の行数の合計を調べることができる。

# find
```
find . -name "*.php"
```
指定ディレクトリ以下の指定拡張子を全部取得できる

# xargs
説明する必要もあまりないかと思うが、別のコマンドの結果を引数として渡して実行できる。
この場合、findの結果をwcの引数として使っている。

# wc
ファイルのバイト数や行数などを取得できる。
-l で行数
-c でバイト数
-m で文字数

# awk
空白などで区切られたテキストを処理するコマンド。
一行ずつ処理されていくので、行数を変数に加算していくことですべての行数の総和を出力している。

# 使用例
```
$ find . -name "*.php" | xargs wc -l | awk '{a+=$1} END{print a;}'
418588
```
なるほど、40万行あったんですね。
Curlでの文字列の代入と結合


#経緯
circle ciからファイル名＋拡張子の文字列を送らねばならなくなり、"Curl　文字列　結合"とか調べてたのですがなかなかいい感じのものが見つからないという問題がありました。

#何がしたいか
`NAME=${"abcd"}`
とあった時に、この文字列の後ろに`".txt"`とつけて

`"abcd.txt"`という文字列にしたい。

#環境
Mac OS High Sierra
デフォルトのターミナル

#文字列を変数に代入する
変数NAMEに"abcd"という文字列を代入する。

```
$ NAME=$"abcd"
```

echoで

```
$ echo ${NAME}
abcd
```

と代入されていることを確認。

**代入時に=の左右にスペースを入れられない。スペースを入れるとコマンドと解釈されるっぽい。**

#文字列を結合する 拡張子の.txtをつける
```
$ NAME=$"abcd"
$ FILENAME=$"${NAME}.txt"
```

```
$ echo ${FILENAME}
abcd.txt
```

#Slackに送信して試す
先達がいっぱいいらっしゃいましたが、基本的には
[[10分で出来る]シェルスクリプトの結果をslackに投稿
](https://qiita.com/tt2004d/items/50d79d1569c0ace118d6)
の記事等を参考に。

    NAME=$"abcd"
    FILENAME=$"${NAME}.txt"
    echo ${FILENAME}
    curl -X POST --data-urlencode "payload={\"channel\": \"#チャンネル名\", \"username\": \"UserName\", \"text\": \"${FILENAME}\" }" https://hooks.slack.com/services/XXXXXXX/XXXXXXX/xxxxxxxxxxxxxxxxxxx


<img width="490" alt="スクリーンショット 2018-03-15 21.55.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/242744/be930257-2acc-0f10-66e5-0c583b2e0969.png">
送れた。

#最後に
Circle Ci上からでも無事に似たようなスクリプトで送ることができました。
間違っているところ等があったらご指摘お願いします。

https://qiita.com/takayukioda/items/edf371b3566bea64d046
も参考にしました。感謝。
findで直近に更新されたファイルを探す方法

### こんな時に

開発や調査などで「この処理で結果(やログ)があのディレクトリ配下の何処かに出てたはずだけど………、ど　こ　だ　っ　け　?」な場合

### コマンド例

```bash
$ find [あのディレクトリ] -type f -mmin [直近n分なのでマイナス指定]
```

- 直近3分以内にカレンドディレクトリ配下で更新されたファイルを探して表示

```bash
$ find ./ -type f -mmin -3
```

### 雑記

たまに使おうとするとオプションをど忘れしている事があるのでメモ
AndroidStudioでエミュレーター起動時に「Error while waiting for device: Timed out after 300seconds waiting for emulator to come online.」が出たときの対処法 

Android Studioでエミュレーターを起動しようとしたところ、waiting for target device to come online が終わらず、

```
Error while waiting for device: Timed out after 300seconds waiting for emulator to come online.
```
というエラーが出てエミュレーターが起動しなくなってしまいました。

# 環境
- macOS 10.13.3
- Android Studio 3.0.1

# 対処法

Android Studioの右上にあるアイコンの中からAVD Managerのアイコンを選択します。

![スクリーンショット 2018-03-15 21.35.49.png](https://qiita-image-store.s3.amazonaws.com/0/154305/b5c63cb1-ae39-4663-30c1-24e4788ed8f4.png)

AVDManagerウィンドウが出てきたら、使用しているエミュレーターの一番右にある▽を押してWipe Dataを選択し、Yesを押します。

![スクリーンショット 2018-03-15 21.39.01.png](https://qiita-image-store.s3.amazonaws.com/0/154305/572b8f5f-43d2-5f29-db3e-6bc020ad4381.png)

その後、再度エミュレーターを起動すれば、正常に起動するはずです。

# 参考
https://stackoverflow.com/questions/42816127/waiting-for-target-device-to-come-online
Dart abstract(and iterator)

##abstract class
- 抽象的なクラスである
- 抽象的なメソッドを持つことができる
- new クラス名() はできない
- ↑により直接propartyをいじることはできない

直接いじること、変更することができないから継承し、その継承したクラスからproparty,methodを実行して、呼び出し、追加、削除などをする

```dart:abstract
abstract class Describable {
  void describe();
  void describeWithEmphasis() {
    print('========');
    describe();
    print('========');
  }
}

class MyTitle extends Describable {
  void describe() => {print('mytitle')};
}

class MySubtitle implements Describable {
  void describe() => print("Development Division");
  void describeWithEmphasis() {
    print('********');
    describe();
    print('********');
  }
}

main() {
  new MyTitle().describeWithEmphasis();
  new MySubtitle().describeWithEmphasis();
}
```
Describable...抽象的なクラス
describe()...抽象的なメソッド
MyTitle,MySubtitile...Describableを継承している(継承のしかたは違う)
##extends
継承する抽象クラスの未実装メソッドを実装すること
この場合 describe()(未実装のメソッド)を実装する
##implements
実装する抽象クラスのメンバの総てを実装すること
全てのメソッドなのでDescribableで実装されているdescribeWithEmphasisも実装し直さないといけない

##イテレーター
イテレーターの理解時にabstractも理解したのでiteratorも説明する


```dart:iterator
main() {
  List fruits1 = ['apple', 'pears', 'bananas'];
  Set fruits2 = new Set();
  fruits2.add('grapes');
  fruits2.add('apple');
  fruits2.add('pine');

  Iterator iterator1 = fruits1.iterator;
  Iterator iterator2 = fruits2.iterator;
  while (iterator1.moveNext()) {
    var fruit = iterator.current;
    print('${fruit} is tasty');
  }

  while (iterator2.moveNext()) {
    var fruit = iterator.current;
    print('${fruit} is tasty');
  }
}
```
###イテレーターとは
iterableなオブジェクト(List,Set,dart:collectionでimportするほとんど)の要素一つ一つをloop処理する時によく使われる
fruits1.iterator は fruits1 は Listであり Listはiterableクラスを継承しているクラスであるのでiterableクラスのプロパティであるiteratorを使用可能
ちなみにfruits1.iteratorはgetで返り値はiteratorオブジェクトである。(iteratorもクラス)

###自分なりにこのiteratorがどのように動いているか想像しコードにした

```dart:iteratorSimulation
abstract class Iterable {
  String iteratorString;
  void setItr(setIterator);

  String get iterator;
  void set iterator(String a);
}

class List extends Iterable {
  setItr(setIterator) {
    iteratorString = setIterator;
  }

  String get iterator => iteratorString;
  void set iterator(String setIterator) {
    setItr(setIterator);
  }
}

main() {
  var newList = new List();
  newList.iterator = 'setting iteratorString';
  print(newList.iterator);
}
```
iterableという抽象クラスをListクラスが継承しpropartyであるget,set iteratorの抽象メソッドを継承し実装している(直接get,setはabstractだからできないため)
その実装してものをnew List()した後setしてiteratorStringを変更し、getしている

##バグ修正
@shinriyo３修正リクエストありがとうございます。おくれてすみませんでした。
next.js で lighthouse 満点を目指した

## なぜやるか

- 普通にやってても満点は難しい。まずは無で100点を目指す。
- Google が Mobile First Index やりだしたら多分 lighthouse のスコアも使うだろうという予想
- next.js というある程度現実的なフレームワークを使うことで適度に YakShaving もこなせるだろうという予想

## 使ったもの

- next.js: export mode
- workbox

## 結果

コード
https://github.com/mizchi/next-pwa-boilerplate

デプロイ先(netlify)
https://eloquent-spence-e8f2bb.netlify.com/

![](https://camo.githubusercontent.com/1d9406a2bd6987d2eee8babf27cdd167b82d813e/68747470733a2f2f6779617a6f2e636f6d2f66363930306631343130313336383339643863376138383334396335643139322e706e67)

PWA 91点は、 netlify 使っている制限で、HTTP to HTTPS のリダイレクトを設定するにはカスタムドメインを設定する必要があり、金を払いたくないので諦めた。設定すれば 98 点ぐらいになるとは思う。

## 制約

next.js の静的ファイル書き出しモードで実行してるので、動的なURLはクエリパラメータで受け取るか、事前にexport設定を指定してビルドする必要があり、URLの自由度がちょっと低くなってしまった。ただ、これは他の静的PWAでも事前に `<pathname>/index.html` を吐き出す必要があるので、静的サイトの制約。

完全に自由なURL表現をしたい場合、 next.js を node としてデプロイすることで実現可能だが、 そうなると自然に pm2 とか付いてくるんで面倒。


個人の意見としては、日本のWebはユニコードの言語制約で英語のリーダブルなURLを使わない(使えない)傾向があるので、 一旦は
 `/pages?id=1111` みたいなクエリパラメータでやっておいて、どうしてもかっこいいURLが必要ならやる、という感じでいいと思う。

[URLパラメータを用いる際のSEO上の注意点 | SEO研究所サクラサクラボ](https://www.sakurasaku-labo.jp/blogs/url-parameters)

## コード
自分しかできない病〜エンジニアの進化と成功を阻む5年目病とその予防法②

こんばんは。10分で生産的なミーティングができるWebサービス「[minmeeting](https://minmeeting.jp/)」を開発している伊勢川です。

<a title="minmeeting - 10分で生産的なミーティングができる会議ツール" href="https://minmeeting.jp/" target="_blank"><img width="100px" src="https://qiita-image-store.s3.amazonaws.com/0/199506/32e65577-a5bb-2c3b-4d30-4690c3c5ce0f.png" /></a>

年度の切り替わりの時期ということで、余計なお世話ですが、<B>業界5年目くらいでなりやすい症状とその予防法</B>を連載で紹介しています。

本日は、<B>仕事ができて働き者な人がなりやすい</B>症状についてです。

# 自分しかできない病
ソフトウェアの開発は未だに属人性が高い仕事で、<B>何年かやっていると自分しかできない仕事がたくさん</B>出てきます。それでもって<B>自分が優秀だと勘違い</B>して、自分しかできない仕事をどんどん増やす方向に動いてしまう人がいます。そんな症状を「自分しかできない病」と呼ぶことにします。

## 症例
自分しかできない仕事が増えてきたことで、自分が優秀になったと勘違いする。

自分しかできない仕事なので、全部自分で抱え込んでしまい、後輩の教育も疎かになっている。

常に自分しかできない仕事で忙しいので、本当に優先度や重要度の高い仕事に取り組めない状態が慢性的に続いている。

## 予防法
<B>5年もエンジニアをやっていれば、自分しかできない仕事、自分がいちばん詳しい仕事が出てくるのは普通</B>のことです。それは自分が優秀だからではなく、単に日常的にその業務を担当させてもらっているからに過ぎません。

それほど出来がよくない人でも、分野を絞って丹念に訓練をすれば、その分野についてはだいたいできるようになります。よって、適切に分野を絞って、自分と同じレベルの知識や経験を持っていなくてもできるように<B>噛み砕いて後輩を教育</B>しましょう。

教育するほどの価値がないものであれば<B>自動化</B>して、誰でも再現できるようにしておきましょう。

分割・教育・自動化により、<B>自分しかできない仕事をなるべく減らし</B>ておいて、今本当にやるべき優先度・重要度の高い仕事に集中しましょう。<B>普段から身軽な状態にしておけば、すぐに行動が起こせる</B>珍しいタイプのエンジニアになることができます。

# バックナンバー
1. [エンジニアの進化と成功を阻む5年目病とその予防法①　似非プロフェッショナリズム病](https://qiita.com/Akira-Isegawa/items/fe5fac9f65833a8a2676)
Helmを運用した知見

実際にhelmを使ってみて得た知見です。

# ひとつのmanifestファイルにつき1リソース書く

serviceaccountのtemplate作成を下記のようにloopで作成していた。yamlファイルは `---` で分割することにより複数の記述を行うことができる。

いざ `helm upgrade --install` してみると


# 生manifest管理からの移行時は名前が衝突しないようにする

rbac系のmanifestを生で管理していたが、chart化することにした。とりあえずyamlをそのまま移動してreleaseしようとしたら既存のリソースと名前が衝突してreleaseに失敗した。

下記のようにrelease名をprefixにつけるなどして衝突を回避する。serviceaccount tokenによるAPI認証を行っている場合tokenが変わってしまうので、こういったものは既存のものはchartに移行しないという選択するのも手です。

```
metadata:
  name: {{ .Release.Name }}-clusterrole
```

# リリースは小さくする

infraというchartのrequirements.yamlに依存を書いてまとめてリリースしていた。後述する `helm upgrade --install` の仕様で `helm delete --purge` をせざるを得なくなり、その際にprometheusやgrafana、namerdのデータが飛んでしまった。

```
dependencies:
  - name: l5d
    version: 0.7.0-dev
    condition: l5d.enabled
  - name: prometheus
    version: 4.6.12
    condition: prometheus.enabled
  - name: grafana
    version: 0.4.4-b.0
    condition: grafana.enabled
  - name: nginx-ingress
    version: 0.11.1-b.0
    condition: nginx-ingress.enabled
  - name: mysql
    version: 0.3.0-b.1
    alias: grafana-mysql
    condition: grafana.enabled
  - name: stackdriver-trace
    version: 0.1.1
    condition: stackdriver-trace.enabled
  - name: fluentd-gcp
    version: 0.3.0-dev
    condition: fluentd-gcp.enabled
```

**適切な単位**でリリースしよう。上記のchartは下記のようにリリースを分割できるでしょう。

- namerd
- prometheus
- linkerd
- grafana
- stackdriver-trace
- fluentd-gcp

そしてこのようなリリースを行うときは[Helmfile](https://github.com/roboll/helmfile)という便利なツールがあるので、それを使って管理するのがいいと思います。

# `TILLER_HISTORY_MAX` は大きく

(helm v2.8.2時点です。将来は修正されるかもしれません)

helm v2.6.2からv2.8.2に移行した。その際historyのconfigmapが大量にあることが気になった。helmはリリースの履歴をconfigmapとしてkube-systemに格納している。2.6では恐らく無制限になっている。

2.7か2.8から `tiller init --max-history` でこの履歴をどの程度保持するか指定可能になった。移行の際は `tiller init --upgrade` でtillerのバージョンを上げるが、 `--max-history` は併用できないので手動で `tiller-deploy` configmapにenvを注入するといい。

とりあえず5世代くらい管理でいいよね。と思って設定したところ、下記のissueの通りreleaseのfailがこの数を上回ると全てのreleaseがfailになる。すると、 `helm upgrade --install` が使えなくなってしまう。この状態を解除するには `helm delete --purge {release}` するしかなくなる。

https://github.com/kubernetes/helm/issues/3275

一つのreleaseにたくさんのchartを詰め込んでいたので致命的な結果となった。`TILLER_HISTORY_MAX` は十分大きく取ろう。

# エラーがでたときは `helm template` で出力されるyamlを確認しよう

wip

# Kubernetes API Versionの切り分けには `gt` ではなく `semverCompare` を使おう

異なるKubernetes Versionをサポートするために、 `_helper.yaml` に下記の定義をして切り分けていました。Kubernetes `v1.10.0` で実行したとき、なんと `batch/v2alpha1` に設定され、デプロイできないという事象が発生しました。

```
{{/*
Return the appropriate apiVersion for Curactor cron job.
*/}}
{{- define "curator.cronJob.apiVersion" -}}
{{- if ge .Capabilities.KubeVersion.Minor "8" -}}
"batch/v1beta1"
{{- else -}}
"batch/v2alpha1"
{{- end -}}
{{- end -}}
```

[Issue](https://github.com/kubernetes/charts/issues/3002)にあるとおり、 `.Capabilities.KuberVersion.Minor` で取れる値はString型で、このような挙動をしました。

バージョン（semver）の比較するときは下記のように `semverCompare` functionを使うのが適切なようです。

```
{{/*
Return the appropriate apiVersion for Curactor cron job.
*/}}
{{- define "curator.cronJob.apiVersion" -}}
{{- if semverCompare ">=1.8.0" .Capabilities.KubeVersion.GitVersion -}}
"batch/v1beta1"
{{- else -}}
"batch/v2alpha1"
{{- end -}}
{{- end -}}
```
HTC VIVEコントローラのトラックパッドがクリック感なくなったときの修理方法

**※日本においてコントローラを自分で分解すると、技適マークが無効になり、その後電源を入れると電波法違反なります**


VIVEコントローラを久々に触ったところ、トラックパッドの右上部分のクリック感が無くなっていた。
床から落とすなどしたせいかもしれない。
本記事では、この問題に対する自力での修理方法をまとめる。

## 修理手順
1. **コントローラの分解**
    * [本動画](https://youtu.be/0mi3KWG5mic)などを参照する
    * T5のトルクスドライバーが必要
        * かつ、先端部の長いもの（細くて深い穴の中にネジが埋まっているので）
        * 筆者は[こちら](https://www.amazon.co.jp/gp/product/B077XNTX5K/)を購入した
    * この状態まで持っていく
        * ![diassembled.jpg](https://qiita-image-store.s3.amazonaws.com/0/127392/c75e5ac0-e678-8523-23a1-c1f4c7df7d5c.jpeg)
    * 自身の爪などを使うとおそらく流血に至るので、適切な道具を用いよう……（戒め）
2. **原因の特定**
    * クリック感がない原因として、下記が考えられると思われる
        1. タクトスイッチに接する部分のゴムがズレている
        2. 上記ゴムが凹んでしまっている？（少なくとも、位置はずれてない場合）
    * 1 の場合は、ゴムの位置を直せば良いらしい
    * 2 の場合は、ゴムの上に適当な大きさのプラスチック板を被せる方法が[知られている](https://youtu.be/Meb11POVS9o)
    * 本記事では、2の修理方法を解説する
    * 1が原因の場合でも、ただ位置を戻しただけでは再発の可能性がある
        * 本記事で紹介する方法は、この問題に対する恒久的な解決策であるらしい
3. **プラスチック板の加工**
    * 厚さは0.1~0.3mm程度
        * 厚すぎると、組み立て後に常にボタンが押されている状態になる
        * 適当な商品のパッケージに使われているようなもので良い
    * 大きさは、直径5mmの円
    * 筆者は家に落ちていたパッケージをはさみで切り抜いた
        * ![plastic.jpg](https://qiita-image-store.s3.amazonaws.com/0/127392/c3d8360e-a79a-588f-c943-c98d324a3d60.jpeg)
4. **プラスチック板の設置**
    * ゴムの上面に、糊で先のプラスチック板を貼り付ける
    * (**追記**) スティック糊で貼っていたが、Beat Saberをやっている最中に剥げ落ちてしまったようだ
        * こうなると、またクリック感がなくなるので分かる
        * このため、次は両面テープで固定した 
            * いまのところ、これでBeat Saberに耐えている
    * ![placement.jpg](https://qiita-image-store.s3.amazonaws.com/0/127392/fbff4a57-f699-031d-0c33-92e0884db2b6.jpeg)
5. 再組み上げ
    * 分解と逆の手順をたどる
    * 分解よりは、怪我のリスクなどもなく楽に組み上がる
6. 完成
    * 戻ってきたクリック感を楽しもう！


## 保証で修理を行う場合
もう一方のコントローラも同様の症状が発生したので、今度はHTCに問い合わせてみた。
返答は下記のとおりであった：

* 症状の判断のため、問題のある製品を工場に送付する必要がある
    * 初期不良(購入から2週間以内)交換でなければ、工場までの**送料は客が負担**
* 自然故障と判断された場合は、修理費自体は無償
* 客の責任と判断された場合は、修理費の見積もりが発行される
    * 客は見積もりを見て、GOかキャンセルかを判断する
        * キャンセルの場合は、客は**キャンセル手数料約3600円**を支払う
* 修理期間は**2週間程度**要する
    * **代替機サービスは存在しない**
エクセルで作成した図をスプレッドシートに貼り付ける

以前エクセルで作成した図形をスプレッドシートに貼り付けようとした際に、`Ctrl v`や`貼り付け`、`特殊貼り付け`などでで貼り付けられなかったので、やり方をメモする。

## 方法
スプレッドシートの「挿入」タグをクリックして、下の方にある「図形描写」をクリックすると、図形描写画面が表示される。ここに、以前エクセルで作成した図を貼り付けることができるので、`Ctrl v`で貼り付けて「保存して閉じる」を押してやれば、無事スプレッドシートの方に図形を貼り付けることができる。
mocha 4がsequelize使ってるときに終了しないとき

# 解決

```--exit``` を付ける。

```
npx mocha --exit test/**/*.js
```

## 追記
解決したと思ったが、MySQL側のログで ```Aborted connection``` が発生してしまう問題がある。
ぐぬぬ。

# 問題

以下のようなテストを書いて

```js
describe('User Test', function () {
  it('create', async function () {
    const takashi = await User.create({ name: 'Takashi', email: 'takashi@example.com' })
  })
})
```

```
npx mocha test/models/user_test.js
```

とするとテストが成功してもプロセスが終了しないままハングする。
sequelizeのConnection Poolingの影響っぽい。

以下のIssueでは

```js
after(() => { sequelize.close() })
```

すると解決する的なことが書いてあるが、

https://github.com/sequelize/sequelize/issues/8388
https://github.com/sequelize/sequelize/issues/6758

```
npx mocha test/**/*.js
```

など複数のテストを実行しようとすると途中で接続が切れてエラーになる。

あんまりちゃんと呼んでないけど以下のIssueで ```--exit``` オプションを付けるという解決策があって、その通りにすると期待通り終了する。

https://github.com/mochajs/mocha/issues/3044
CentOS 6.8でOPENSSLのバージョンを1.0.2nにできずに困っています

### 前提・実現したいこと
CentOS 6.8でOPENSSLのバージョンを1.0.2nにしたいのですが
バージョンアップできずに困っています

現在のバージョン       ：openssl-1.0.1e-48.el6_8.1.x86_64
これからのバージョン ：openssl-1.0.2n

yumで最新のもがインストールできなかったので
下記サイトに従いソースからコンパイルしてリンクを張り直しました。
https://www40.atwiki.jp/sanosoft/sp/pages/85.html

### 発生している問題・エラーメッセージ

「openssl　-version」を打つと以下のように最新バージョンが表示されますが
********************************
[root@test openssl-1.0.2n]# openssl version
OpenSSL 1.0.2n  7 Dec 2017
***

「rpm -qa | grep openssl」と打つと以下のように古いバージョンが表示されます
***
openssl-1.0.1e-48.el6_8.1.x86_64
***

また「rpm -e openssl-1.0.1e-48.el6_8.1.x86_64 --test」と打つと以下のように古いバージョンが依存関係にあると言われ、

バージョンアップができていないように思います。

***
error: Failed dependencies:
        libcrypto.so.10()(64bit) is needed by (installed) libssh2-1.4.2-2.el6_7.1.x86_64
        libcrypto.so.10()(64bit) is needed by (installed) mysql-libs-5.1.73-7.el6.x86_64
        libcrypto.so.10()(64bit) is needed by (installed) fipscheck-1.2.0-7.el6.x86_64
        libcrypto.so.10()(64bit) is needed by (installed) python-libs-2.6.6-66.el6_8.x86_64
        libcrypto.so.10()(64bit) is needed by (installed) openssh-5.3p1-118.1.el6_8.x86_64
　　　　　 ～～～中略～～～
***
### 該当のソースコード

```ここに言語名を入力
ソースコード
```

### 試したこと

サイトに従い打ったコマンドです
<https://www40.atwiki.jp/sanosoft/sp/pages/85.html>

 wget https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz
 tar xvfz openssl-1.0.2-latest.tar.gz
 cd openssl-1.0.2x
 ./config
 make
 make install
 mv /usr/bin/openssl /usr/bin/openssl.bak
 ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
 echo /usr/local/lib >> /etc/ld.so.conf.d/usrlocal.conf
 ldconfig

### 補足情報（FW/ツールのバージョンなど）

ここにより詳細な情報を記載してください。
Ubuntu17.10でGenymotionが落ちる

GenymotionとVirtualBoxをインストールしたところまでは問題はなく、エミュレータを起動すると端末が落ちる、もしくはOSごとフリーズする現象が起きた

調べてみると古い記事でNVIDIAのドライバーが原因とある
http://www.devlog.alt-area.org/?p=3072

試してみたら解決したので備忘として残す


## 1. 対応しているGPUのドライバーバージョンを調べる

以下に条件を入力して検索すると最新のドライバーのバージョンを知ることができる

http://www.nvidia.co.jp/Download/index.aspx?lang=jp


## 2. ドライバーのインストール

私の場合、上記で調べた最新のドライバーは391であったが、以下の手順で存在しなかったため、384をインストールしたところ問題なく動作した

```
$ sudo add-apt-repository ppa:xorg-edgers/ppa
$ sudo apt-get update
$ apt-cache search 'nvidia-[0-9]+$'
nvidia-304 - NVIDIA legacy binary driver - version 304.137
nvidia-331 - Transitional package for nvidia-331
nvidia-340 - NVIDIA binary driver - version 340.104
nvidia-346 - Transitional package for nvidia-346
nvidia-352 - Transitional package for nvidia-361
nvidia-361 - Transitional package for nvidia-367
nvidia-367 - Transitional package for nvidia-375
nvidia-375 - Transitional package for nvidia-384
nvidia-384 - NVIDIA binary driver - version 384.111
$ sudo apt-get install nvidia-384
```

## 3. 再起動

インストールしただけでは動作しない

```
$ sudo reboot

...

$ nvidia-smi
Thu Mar 15 20:00:07 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.111                Driver Version: 384.111                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 980     Off  | 00000000:01:00.0  On |                  N/A |
| 33%   38C    P8    12W / 210W |    351MiB /  4036MiB |      1%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0       951      G   /usr/lib/xorg/Xorg                            16MiB |
|    0      1005      G   /usr/bin/gnome-shell                          50MiB |
|    0      1293      G   /usr/lib/xorg/Xorg                           101MiB |
|    0      1420      G   /usr/bin/gnome-shell                          75MiB |
|    0      1821      G   ...-token=102C8F3B873A53AFFDF97039DB8EEA6E   104MiB |
+-----------------------------------------------------------------------------+
```
2台目のモニタにフォームを表示する

PCに接続した2台目のモニタにWindowsフォームを表示する。

PCに2台のモニタを接続してある。1台は通常のPCモニタで、2台目は大型のモニタで天井に吊るしてある。今回はWindowsフォームアプリで工場の生産状態を大型モニタに表示する（俗に言うあんどん）。
表示を2台目に固定することにより、1台目のモニタを使って、並行で他の作業ができるようになる。PCを有効に活用できるため、工場の人はうれしいわけです。

```Form1.cs
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            // あんどん表示を第2モニタに表示し、このフォームは閉じる
            var andon = new Form2();
            foreach (var scr in System.Windows.Forms.Screen.AllScreens)
            {
                if (!scr.Primary)
                {
                    andon.TopMost = true;
                    andon.Left = scr.Bounds.Left;
                    andon.Top = scr.Bounds.Top;
                    andon.Show();
                }
            }
            this.Close();
        }
    }
```

接続されているすべてのディスプレイを取得する。Primaryのものは第1モニタなので、除外する。Primaryでないものが第2モニタなので、こちらにあんどんのフォームを開いて表示する。呼び出した元のフォームは閉じる。
これで1台目には何も表示せず、2台目にはフォームを閉じない限り表示しっぱなしにできた。
xamlでも同じことができる。

```Window1.xaml.cs

    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            // あんどん表示を第2モニタに表示し、このフォームは閉じる
            var andon = new Window2();
            foreach (var scr in System.Windows.Forms.Screen.AllScreens)
            {
                if (!scr.Primary)
                {
                    andon.Topmost = true;
                    andon.Left = scr.Bounds.Left;
                    andon.Top = scr.Bounds.Top;
                    andon.Show();
                    andon.WindowState = System.Windows.WindowState.Maximized;
                }
            }
            this.Close();
        }
    }
```

###追記

WPFアプリで上記の内容をやろうとしたところ、うまくいかず常に一方のモニタへウィンドウが表示されてしまった。デバッグすると、andon.Leftには1300等がちゃんと入っているのに、Left = 0として表示されている。原因は、XamlでWindowState="Maximized"を指定していたこと。Xamlでは書かずに、Xaml.csでShow()した後に、ウィンドウ最大化を指定しなければならない。

```Window2.xaml
<Window x:Class="OperationManager.Window2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="1024" Width="1280" ShowInTaskbar="True" ResizeMode="CanResizeWithGrip" WindowState="Maximized"
        >
```
上記のようになっていてはダメ。WindowState="Maximized"を消すこと！
ManjaroLinuxでRails環境を構築するまで

# ManjaroLinuxでRails環境を構築する

arch系であるmanjaroで環境構築をする際の手順

環境構築するにあたって、バージョンなどは次の通り
-  ruby:2.3.1
-  rails:4.2.6

## mysqlのインストール
archwikiを参考にして、mysqlをインストールする

```terminal:terminal
$ sudo pacman -S mariadb  # mariadbのインストール

$ sudo su -  # root権限にて行う

# mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

# systemctl start mariadb.service

# mysql_secure_installation
```

## rubyのインストール
すこし古いバージョンの場合、rbenvで管理しているとエラーが起きる。
openssl-1.0とgcc6をpacmanで入れた後、rbenvにてインストールを行う

```terminal:terminal
$ sudo pacman -S openssl-1.0 gcc6

$ CC=/usr/bin/gcc-6 PKG_CONFIG_PATH=/usr/lib/openssl-1.0/pkgconfig rbenv install 2.3.1

$ rbenv local 2.3.1

$ ruby -v # バージョンが指定したものであるかを確認

$ which ruby # rbenvにてインストールされたPATHを示しているか確認
```

## railsのインストール
gemでrailsをインストールする

```terminal:terminal
$ gem install bundler

$ gem install mysql # arch wikiよりgemでmysqlをインストールしなければならないっぽい

$ gem install rails --version="4.2.6"

$ rails -v # バージョンが指定したものであるか確認
```

## アプリケーションの作成
実際にrails newをしていく

```terminal:terminal
$ rails _4.2.6_ new app-name -d mysql
```

## Gemfileの変更

```ruby:Gemfile
source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.6'
# Use mysql as the database for Active Record
gem 'mysql2', '0.3.18' # <- バージョン変更
# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.2' # <- バージョン変更 
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.1.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
gem 'therubyracer', platforms: :ruby # <- コメントアウトを外す

# 以下省略
```

```terminal:terminal
$ bundle update

$ bundle install
```

## データベースの作成
データベースが正しく作成されているか確認する

```terminal:terminal
$ rake db:create

$ mysql -u root # mysqlにログイン

MariaDB [(none)]> show databases; # データベースが作成されているか確認
```

## Railsサーバーが立ち上がるか確認する

```terminal:terminal
$ rails server
```

ブラウザでlocalhost:3000にアクセスしてみて正しく表示されればOK

## 終わりに
困ったらarch wiki!
Swiftに慣れた人がTypeScriptをうまく書くコツ

Swiftに慣れるとどうしても __Generics__ でclassの定義をしたくなりませんか？
Firebase Cloud Functionsを初めてからとことんTypeScriptを書くことが多くなってきたのでちょっとしたTipsを紹介します。
> この文章はあくまでもSwiftに慣れた人がTypeScriptを書く場合のコツです。TypeScript本家の方でもっといい方法を知っている方がいればぜひご教示下さい。

# ProtocolとInterface

SwiftのProtocolに相当するTypeScriptの構文はInterfaceです。
TypescriptのInterfaceはSwiftの`Protocol Extension`ができないなど物足りなさも感じますが、Classに必要なプロパティやファンクションを定義する意味では充分に機能します。

```swift
protocol AProtocol {

}
```
```typescript
interface AProtocol {

}
```

ここまでは非常に似ているが。。

# Genericsをつけると途端にわかりにくい

さぁこれにGenericsを加えていきましょう。

### Swift

```swift
protocol AProtocol {
    init()
}

protocol BProtocol {
    associatedtype A: AProtocol
}

class Fuga: AProtocol {
    required init() {}
}

class Hoge<T: AProtocol>: BProtocol {
    typealias A = T
    func fuga() -> A {
        let a: A = A()
        return a
    }
}

let hoge: Hoge<Fuga> = Hoge()
let a: Fuga = hoge.fuga()
```

### TypeScript
```typescript
interface AProtocol {

}

interface BProtocol<A extends AProtocol> {

}

class Fuga implements AProtocol {

}

class Hoge <A extends AProtocol> implements BProtocol<A> {

    private _A: { new(): A }

    fuga(): A {
        const a: A = new this._A()
        return a
    }
}

const hoge: Hoge<Fuga> = new Hoge()
const a: Fuga = hoge.fuga()
```

## 考え方を整理するポイントは2つ

- `associatedtype`
- `{ new(): A }`

### TypeScriptで`associatedtype`っぽいことをする
Swiftの`associatedtype`は、TypeScriptでは `BProtocol<A extends AProtocol>`のように依存するプロトコルを宣言します。


### Genericsの型を初期化
TypeScriptでGenericsの型を初期化するには`{ new(): A }`が必要です。Swiftの`associatedtype`の代わりに

```typescript
private _A: { new(): A }
```
を宣言しています。こうすることでclass内ではどこでも`A`を初期化することが可能になります。
Swift4でAlamofireとCryptoSwiftとSSZipArchiveを使ってファイルダウンロードしたらMD5チェックしたりZip解凍したり

[2018/05/11 下部追記]
一個にまとまっとけよ！！

ってことでとりあえずソース
※CryptoSwiftだけLicenseが独自なので注意。他はMIT

おもむろにimport追加しつつ

```
import Alamofire
import CryptoSwift
import SSZipArchive
```

```
// 対象ファイルをダウンロード
let url = "なんかほしいファイルのURL"
let fileName = "保存するファイル名"
// ダウンロード後解凍して元データは要らなくなるのでcache配下に置くように設定している
let downloadPath = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0] + "/" + fileName
let downloadUrl = URL(fileURLWithPath: downloadPath)

// 以下のリクエスト処理が終わるのを待つための変数
let semaphore = DispatchSemaphore(value: 0)
// メインメソッド上でWaitするとデッドロックする問題の回避用
let queue = DispatchQueue.global(qos: .utility)
// MD5値は保存前のデータでやると楽だったので保存用のパラメータ
var md5:Data? = nil

/*
 * 進行状況表示用のプログレスバー
 */
let progressView:UIProgressView = UIProgressView(frame: CGRect(x:controller.view.frame.width / 2 - 100, y:controller.view.frame.height / 2 - 5, width:200, height:10))
// ゲージ色の設定
progressView.progressTintColor = UIColor.blue
// ゲージの背景色の設定
progressView.trackTintColor = UIColor.gray
// ゲージの初期値を設定
progressView.progress = 0.0
// ViewにprogressViewをSubViewとして追加
self.view.addSubview(progressView)

// ダウンロード処理
Alamofire.download(url)
    .downloadProgress(queue: queue) { progress in
        DispatchQueue.main.async(execute: {
            progressView.progress = Float(progress.fractionCompleted)
        })
    }
    .responseData(queue: queue) { response in
        if let data = response.result.value {
            do {
                md5 = data.md5()
                try data.write(to: downloadUrl)
            } catch {
                // なんかエラー処理
            }
        }
        // 処理終了を通知
        semaphore.signal()
}
// 処理終了まで待機
semaphore.wait()

// MD5確認
if md5 == nil {
    // なんかエラー処理
}
if "正しいMD5値" != md5!.toHexString() {
    // なんかエラー処理
}

// 解凍してフォルダに配置
if !SSZipArchive.unzipFile(atPath: downloadPath, toDestination: "解凍先のフォルダPath") {
    // なんかエラー処理
}

// 終わったらプログレスバーを消す
progressView.removeFromSuperview()
```
ダウンロードに関してはプログレスバー出してますが
まぁ出すよねっていうあれです。

CocoaPodsの設定は以下

```
pod "Alamofire", '~> 4.5'
pod 'SwiftyStoreKit'
pod 'CryptoSwift'
pod 'SSZipArchive'
```
各LibraryのGithubの記述のままだと思います。

いろんなサイトを参考にしましたが、もう全然覚えてない。。。
まぁ基本はLibraryそれぞれのGitHubの記述参考にしてると思います。

--
そこまで大きくないファイルでは非常に有効だったのですが
ファイルサイズが数十MBになったときにCryptoSwiftのMD5取得処理が
非常に時間がかかるようになったので諦めて以下の方法に変更しました。

Object-Cで書くためブリッジヘッダーを作成して
https://gist.github.com/bleft/364d64b36974097f6f8f62001676e108
上記URLの処理を使いました。
このGitには書いてないですが
ブリッジヘッダーに

```
#import <CommonCrypto/CommonCrypto.h>
```
を忘れずに追記してください。
[PHP]Amazon SNS を使い、iOS・AndroidへPUSH通知 - SNS設定編 -

一般的なPUSH配信ASPはセグメント検索が弱かったり、使いにくかったりします。
自サーバーで配信部分まで構築するのは現実的ではないため、配信部分は外部サービスを使った方が開発工数も抑えられ、安定感も向上します。
API対応しているASPもありますが、APIが利用できるプランを選択すると料金が高額になったりします。

そこでオススメししたのがAmazon SNSです！
他のASPにある開封率集計、A/Bテストなどはありません（自前でやる必要があります）が、圧倒的なのは低コストであることです。
100万通配信しても$0.5となっており、他のASPサービスと比べても雲泥の差となっています。
PUSH配信するのに特化したサービスなので、基本はすべてAPIで実装するため、自社システムとの相性は抜群だと思います。
信頼性や配信速度なども他のASPと遜色はありません。
アプリ側にSDKの導入も不要です。

今回はCMSでユーザー管理をしていて、PUSH配信予約を使いやすいようにカスタマイズして使いたい、ASPでは実現不可能なセグメント検索をやりたい、ついでにコストも抑えたい、という場合の構築方法を解説します。


### **前提条件など**
DBによるユーザー管理をしていて、iOS・Androidに全配信やセグメント配信でPUSH通知を送る場合のPHPでのやり方です。
ほとんどサーバー側の説明です。
アプリ側にはSDKは使用せず、直接SNSにエンドポイントは登録しません。
代わりにPUSH通知トークン登録用APIを用意します。
アプリ側の処理はトークンを付与してAPIにリクエストするだけで、
サーバーからSNSにエンドポイントを登録します。

### **事前準備**
APNsの証明書とGCMのAPI KEYを準備してください。
また、SNS のAPIを利用するため、アクセスキーIDとシークレットアクセスキーをAWSから取得しておいてください。
取得方法がわからなければググってくださいｗ

# **Amazon SNSでの設定**

### **プラットフォームアプリケーションの作成**
iOS、Androidそれぞれで作成します。
開発用と本番用も別々のアプリケーションになります。
#### **iOS**
![sns_ios2.png](https://qiita-image-store.s3.amazonaws.com/0/243891/ba28f36a-586f-a2bb-0e3e-341e15277a4f.png)

・アプリケーション名
　アプリ名やiOSや開発か本番など、わかりやすい名前を付けます。
・プッシュ通知プラットフォーム
　今回は開発環境なので、"Apple Development"を選択します。
　本番環境の場合は、"Apple Production"を選択してください。
・プッシュ通知タイプ
　デフォルトの"iOS プッシュ証明書"のままでOKです！
・*p12 ファイルの選択
　用意してあるAPNsのp12ファイルを選択します。
・パスワードの入力
　パスワードを入力して、"認証情報をファイルから読み込み"ボタンをクリックします。
　下にある証明書とプライベートキーに自動入力されればOKです。

#### **Android**
![sns_android.png](https://qiita-image-store.s3.amazonaws.com/0/243891/d00acacc-605a-cc78-b789-b7d818c6de6b.png)

・アプリケーション名
　アプリ名やAndroidや開発か本番など、わかりやすい名前を付けます。
・プッシュ通知プラットフォーム
　"Google Gloud Messaging(GCM)"を選択します。
　iOSのように開発と本番で分かれていません。
・APIキー
　事前に取得したAPIキーを入れます。

![sns_app.png](https://qiita-image-store.s3.amazonaws.com/0/243891/d399baa5-1b57-aa8e-18ed-80bb29d5323e.png)


作成が完了すると"アプリケーション ARN"が発行され、エンドポイントの追加やエンドポイント一覧取得に必要となります。
### **トピックの作成**
iOS、Androidそれぞれの全配信用のトピックを作成します。
![sns_topic.png](https://qiita-image-store.s3.amazonaws.com/0/243891/5eafc8e3-5691-b0bf-6ef2-d8c90e08f2b6.png)

・アプリケーション名
　アプリ名やOSや全配信用のALLや開発か本番など、わかりやすい名前を付けます。
・プッシュ通知プラットフォーム
　未入力のままでOK!

![sns_topic_list.png](https://qiita-image-store.s3.amazonaws.com/0/243891/9b97bdda-6ac9-e770-dc55-a6a52d12c7fd.png)

アプリケーションと同様に今度は"トピック ARN"が発行されます。
トピックにエンドポイントをサブスクライブしたり、トピックに登録されているエンドポイントに一斉PUSH配信するために必要となります。
フロント未経験者が、JSの勉強を始めちゃった系ナレッジベース

**注意　正しい情報とは限りません**
**個人的メモとして使っているので、責任は取りません悪しからず**

JS、始めました。

##目的

・基礎的なことからとにかく忘れないようにアウトプットする為
・後に見直して間違えているところや認識ミスなどを発見するため
・自分が分かればいいスタンスで記入
・後に余裕があれば編集予定

**↓それでは開始↓**

-----------------------------------------------------------------------------------
<dl>
<dt>JSの特色的なもの</dt>
<dd>jsファイルは強烈にキャッシュされてしまうので、ハード読み込み、キャッシュ削除を必要とする。</dd>
<br>
<dt>HTML内に書く場合</dt>
<dd>&lt;script&gt;&lt;/script&gt;内に記入</dd>
<br>
<dt>外部ファイルに書いて読み込む場合</dt>
<dd>&lt;script src="なんたら.js"&gt;&lt;/script&gt;で表記</dd>
<br>
</dl>
-----------------------------------------------------------------------------------
<dl>
<dt>簡単なダイアログボックスを出力する構文</dt>
<dd>alert("ここに文字が入るんだよぉ！");</dd>
<br>
<dt>単純な文字出力の構文</dt>
<dd>document.write("ここに文字が入るんry");</dd>
<br>
<dt>イベントハンドラ（クリックされたとき）</dt>
<dd>onclick="JSのコード"</dd>
<br>
</dl>
-----------------------------------------------------------------------------------
個人的なまとめ
ソースのルール部分はJavaとほぼ一緒だった。
（オブジェクトプロパティメソッドもニュアンスは同じ）
注意すべき点は、タグ内にダブルクオーテーションは2つかけないこと
必要な場合はシングルを使う

今日はここまで
2018/3/16

-----------------------------------------------------------------------------------
##jqueryについて
jqueryとは、Javascriptのライブラリである。
一般的にとてもよくつかわれている。

書かなければいけない基本形がこちら↓
$(function(){
  // ここにプログラムを記述
});

使用するときは、jquery CDNで検索してそのページの使いたいバージョンをHTMLファイルに貼るだけ

関数？Javaでいうメソッド？いまいちよくわかってない

ライブラリの種類

非同期通信を提供している
prototype.js
サーバーサイドでjsを動かせる（これも非同期処理ができる？）
Node.js

-----------------------------------------------------------------------------------

#デバック方法(超大事)
開発者ツールを利用してエラーを発見する。（ブラウザ搭載機能。たいていはある。）

↓作業レベルでの操作↓
検証を行い、Sourcesクリック。　ブレイクポイントを設定して、実行ツール（右側）を押してデバッグを行う
【機能】
・関数に入る　
・関数から出る　
・次の行に進む　
・通しで進む

-----------------------------------------------------------------------------------
今気になっていること

変数のデータ型が全部varで解決していること。
　→これはvar以外はあまり使われないのか？

【配列】
・文字列における「length」は、文字数を取得できる！

・配列における「length」は、要素数の合計値を取得できる！

・関数における「length」は、引数の合計値を取得できる！

-----------------------------------------------------------------------------------
##時刻（dateオブジェクト）

めっちゃ使うと思うので大きく
例）ローカルユーザーのPC時刻を取得する
&lt;script&gt;
now = new date();
 ↑変数　　　↑dateオブジェクト

console.log(now);
&lt;/script&gt;
【標準時間】
http://www.nict.go.jp/JST/JST5.html


-----------------------------------------------------------------------------------
##
要素の制御
イベントハンドラ（制御・発動）
ajaxの呼び出し（非同期通信）
→非同期通信てなによ
　→サーバーとのやり取りなしで動的要素が配置できる。
　→再リロードなしでも動的にページが動かせる

要素を取得する場合は、基本的にCSSを当てる時と同じ法則
classの要素を取得したい場合
　$('.class名').

idの要素なら
　$('#id名).

タグ（オブジェクト）の要素なら
　$('')

イベントハンドラ
<pre>$(要素).event(function()){動作});</pre>
swiftにデータベースのRealmSwiftをくっつけるのを１からやる

# 流れ
1. CocoaPodsというiOS向けのライブラリー管理のgemをインストールする
2. ライブラリを追加したいディレクトリまでターミナルで移動する
3. Podfileという設定用のファイルを作って使いたいライブラリを記述する
4. ライブラリをインストールする
5. xcodeで使えるようにする

## 1. CocoaPodsというiOS向けのライブラリー管理のgemをインストールする
1.　CocoaPodsをインストールする

```:Terminal
gem install cocoapods
```
2.　CocoaPodsを使えるようにする

```:Terminal
pod setup
```

##2. ライブラリを追加したいディレクトリまでターミナルで移動する

```
cd .../yourProjectDirectory
```

## 3. Podfileという設定用のファイルを作って使いたいライブラリを記述する
1.　Podfileを作る

```:Terminal
pod init
```

2.　Podfileの中身を見る

```:atomの部分はお好みのエディタで
atom Podfile
```

```ruby:Podfile
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'yourProduct' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for yourProduct

  target 'yourProductTest' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'yourProductUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end
```

3.　Podfileに使いたいライブラリである'RealmSwift'を書き加える

```ruby:Podfile
# Uncomment the next line to define a global platform for your project
platform :ios, '10.0' #使いたいiOSのver.に変えてここのコメントを外す!!!!!!

target 'yourProduct' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for yourProduct
  pod 'RealmSwift' #ここに書く！！！！！！！！！！！！！

  target 'yourProductTest' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'yourProductUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end
```

4.　Podfileを保存する

## 4. ライブラリをインストールする
1.　まずはインストール

```:Terminal
pod install
```

2.　一応アップデート

```:Terminal
pod update 
```

## 5. xcodeで使えるようにする

1.　ビルドスキームを追加する<img width="804" alt="スクリーンショット 2018-03-15 19.26.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/211192/8f8d7227-4f52-77ce-a22d-299e965df41b.png">
上の画像のところを押してManage Schemesを押す
Manage Schemesを押すとRealm とRealmSwiftがあるので、それをチェックする。

2.　スキームをRealmSwiftにして一度ビルドする。
3.　import RealmSwiftとどこかのスクリプトに書いてエラーが出なかったら完了！お疲れさま！
mocha における describe it before beforeEach after afterEach の実行順序

# はじめに

## この記事について
Javascript のテストフレームワーク [mocha](https://mochajs.org/) における describe it before beforeEach after afterEach の実行順序について調べてみました。

## 環境
- Windows 7 Professional x86
- mocha 5.0.1

# 結果

## 5行で
- describe は上から順番に実行される
- it は上から順番に実行される
- beforeEach, afterEach は **各 it の前後** で実行される
- before は **describe の最初に一度だけ** 実行される
- after は **describe の最後に一度だけ** 実行される

## 実行結果
```
$ mocha test.js
describe(1)-top
describe(1)-bottom
describe(2)-top
describe(2)-bottom

  DESCRIBE-1
describe(1)-before
describe(1)-beforeEach
describe(1)-it(1)
    √ テスト1
describe(1)-afterEach
describe(1)-beforeEach
describe(1)-it(2)
    √ テスト2
describe(1)-afterEach
describe(1)-after

  DESCRIBE-2
describe(2)-before
describe(2)-beforeEach
describe(2)-it(1)
    √ テスト1
describe(2)-afterEach
describe(2)-beforeEach
describe(2)-it(2)
    √ テスト2
describe(2)-afterEach
describe(2)-after
```

## 実験で書いたテストコード

```js
describe('DESCRIBE-1', function () {
    console.log('describe(1)-top');

    before(function(){
        console.log('describe(1)-before');
    });

    beforeEach(function(){
        console.log('describe(1)-beforeEach');
    });

    after(function(){
        console.log('describe(1)-after');
    });

    afterEach(function(){
        console.log('describe(1)-afterEach');
    });

    it('テスト1', function(){
        console.log('describe(1)-it(1)');
    });

    it('テスト2', function(){
        console.log('describe(1)-it(2)');
    });

    console.log('describe(1)-bottom');
});

describe('DESCRIBE-2', function () {
    console.log('describe(2)-top');

    before(function(){
        console.log('describe(2)-before');
    });

    beforeEach(function(){
        console.log('describe(2)-beforeEach');
    });

    after(function(){
        console.log('describe(2)-after');
    });

    afterEach(function(){
        console.log('describe(2)-afterEach');
    });

    it('テスト1', function(){
        console.log('describe(2)-it(1)');
    });

    it('テスト2', function(){
        console.log('describe(2)-it(2)');
    });

    console.log('describe(2)-bottom');
});
```
JavaScriptでGoogle Calendar APIを利用して予定一覧表示

## プロジェクトの登録
## Google Calendar APIの有効化
## APIキー，クライアントIDの取得
## サンプルHTMLファイルを準備する
## 実行環境の整備
## さらに作りこむ
### カレンダーIDの取得
### イベント一覧の取得
## 参考
- [Google Developers: Calendar API: Browser Quickstart](https://developers.google.com/calendar/quickstart/js?hl=ja)
- [Google Developers: Calendar API: Events: list](https://developers.google.com/calendar/v3/reference/events/list?hl=ja)
【Android】ファイル作成時にファイルヘッダーに自動挿入されるコメントを変更する

AndroidStudioでファイル作成時にファイルヘッダー自動挿入されるコメントを変更する方法です。

## 変更方法

`Preferences > Editor > File and Code Templates` の `Includes`タブの `File Header` から変更できます。
![](https://qiita-image-store.s3.amazonaws.com/0/123122/c611a348-f411-e1d8-b239-460f16769df2.png)

## デフォルト

```
/**
 * Created by ${USER} on ${DATE}.
 */
```

## 変数一覧

Variable|Description
:---|:---
${PACKAGE_NAME}|name of the package in which the new file is created
${USER}|current user system login name
${DATE}|current system date
${TIME}|current system time
${YEAR}|current year
${MONTH}|current month
${MONTH_NAME_SHORT}|first 3 letters of the current month name. Example: Jan, Feb, etc.
${MONTH_NAME_FULL}|full name of the current month. Example: January, February, etc.
${DAY}|current day of the month
${DAY_NAME_SHORT}|first 3 letters of the current day name. Example: Mon, Tue, etc.
${DAY_NAME_FULL}|full name of the current day. Example: Monday, Tuesday, etc.
${HOUR}|current hour
${MINUTE}|current minute
${PROJECT_NAME}|the name of the current project

## 補足
ちなみに一般的には消すことが多いです。
フォルダ内のwavファイルを一括でmp3に変更

やりたかったことは

- コマンドライン上でwavをmp3に変換
- フォルダ内の全ファイルに一括でコマンド適用（シェルのお勉強）

# wav to mp3

ffmpegをインストール

```
$brew install ffmpeg
```

変換

```
ffmpeg -i "hoge.wav" -vn -ac 2 -ar 44100 -ab 256k -acodec libmp3lame -f mp3 "hoge.mp3"
```

`-ab`でビットレートを指定します。


# 一括処理

```
for i in $(ls)
do
ffmpeg -i $i -vn -ac 2 -ar 44100 -ab 256k -acodec libmp3lame -f mp3 ${i%.*}.mp3
done
```
FileMakerでリレーションによるレコードの自動作成

#FileMakerでリレーションの設定によってレコードを自動的に作成する

FileMakerでリレーションシップの設定時に「このリレーションシップによるレコードの作成を許可する」機能を利用して、テーブルに新規レコードを作成する方法を説明します。

下記公式サイトに記載があります。
FileMaker13ヘルプ
http://www.filemaker.com/help/13/fmp/ja/html/relational.11.13.html
FileMaker16ヘルプ
https://fmhelp.filemaker.com/help/16/fmp/ja/index.html#page/FMP_Help%2Fcreating-relationships.html%23

今回は、「日記」をイメージして作成を進めます。

##メインのテーブルとレイアウト
メインのテーブルとレイアウトを用意します。
![q002-01.png](https://qiita-image-store.s3.amazonaws.com/0/235280/788eba41-7a8a-60f2-1419-9d480ef98094.png)
テーブル名とレイアウト名は、「test002」
フィールド名は、「day」
タイプは「日付」

入力画面となるので、レコードを1つ作っておきます。

##日記用のテーブル
次に日記用のテーブルを用意します。
![q002-02.png](https://qiita-image-store.s3.amazonaws.com/0/235280/7decae8d-60ed-9775-efaa-d98725350ef1.png)
![q002-03.png](https://qiita-image-store.s3.amazonaws.com/0/235280/262438b1-8007-fc38-67cb-864c4b6188f9.png)
テーブル名とレイアウト名は、「diary」
フィールド名は、「day」「diary」
タイプは「日付」「テキスト」

##リレーションの設定
次にリレーションの設定を行います。
![q002-06.png](https://qiita-image-store.s3.amazonaws.com/0/235280/1176e074-0498-7018-a05e-eada1f5f8170.png)
まず、オカレンス（テーブルオカレンス）「test002」の「day」とオカレンス「diary」の「day」に「＝」でリレーションを設定。
設定したリレーションをダブルクリックして、リレーションシップ編集を開き、「このリレーションシップによるレコードの作成を許可する」にチェックを入れ、「OK」を押下。

##入力用レイアウトを編集
続いて、入力用のレイアウトに入力欄を設定して行きましょう。
![q002-07.png](https://qiita-image-store.s3.amazonaws.com/0/235280/2cde5bf5-73d7-6e35-c2d8-f4c23d3367d0.png)
レイアウト「test002」へ、関連テーブル「diary」から「diary」フィールドを配置します。

次に、
![q002-08.png](https://qiita-image-store.s3.amazonaws.com/0/235280/edc59b01-0519-2547-6c07-9eb775a2adc9.png)
「day」フィールドにインスペクタから「ドロップダウンカレンダー」と「カレンダーの表示切替アイコンを表示」を設定

最後に、
![q002-09.png](https://qiita-image-store.s3.amazonaws.com/0/235280/2454d98e-fd8c-b72d-4ec3-ddd07a67d8b2.png)
レイアウト「test002」へ配置した、関連テーブルの「diary」のサイズを調整し、インスペクタから、次の場合にオブジェクトを隠すに「IsEmpty(test002::day)」と設定します。
この設定は、dayが空の時にdiary欄を非表示にする設定です。

以上で完成です。

##完成レイアウト
![q002-10.png](https://qiita-image-store.s3.amazonaws.com/0/235280/97e18ad5-587d-767c-c40e-072435013721.png)

実際に、日付をドロップダウンカレンダーから選択し、diary欄に何か入力してみてください。
diaryに何か入力されていれば、日付を変更すると、対応した日のdiaryが表示されるハズです。

###diaryテーブルを確認
![q002-11.png](https://qiita-image-store.s3.amazonaws.com/0/235280/d879caff-a4f5-39bf-96e6-0495cc74fb4c.png)
「diary」テーブルにレコードが作成され、日付毎に保存されているのが確認できると思います。




##最後に
今回は、リレーションシップを活用し、関連テーブルに、自動的にレコードを作成する方法を紹介致しました。
dayを空にした状態で、diaryを入力して、レコードを確定すると、エラーになりますので、今回は、dayが空の場合に入力欄を非表示に致しました。
※エラー内容は、「day」に有効な値が入力されていないため、このフィールドを修正することができません

以上です。
Elecom製の激安NAS[NSB-3NR series]のopkgパッケージをバックアップした

# はじめに
昨年の１１月、NTT-Xストアでセールで売られていたNASがHDD付のLinuxとして運用できるのでないかと書かれた記事を見てほしいとおもいポチった。買った当初は普通にNASとして運用していたが、そろそろ普通の使い方に飽きたのでハックしようとggった結果rootでsshログイン方法を見つけた。

# SSHとLuCIログイン
WEBの情報を漁っていく内にこのNASはOpenwrtと呼ばれるオープンソースのルータOSを搭載してることがわかった。普通のNASのWEB管理ページとは別にOS用のWEB管理ページがあることがわかった。これは市販のルータのWEB管理ページと似たものだがより高度な設定が可能となっている。ここのログインもSSHログインと同じパスワードをつかう。

# 拡張パッケージの管理
さて、このOpenwrtと呼ばれるOSはLinuxベースだが機能を拡張できるルータ用OSとして開発された。NASなのになぜこのOSが載っているか、LANポートがいくつか余っているのとネットワーク関連であることからルータ用のボードを流用してストレージをつけてNASとして開発されたのではないかと推察する。
本題だが、Openwrtはパッケージシステムで機能を追加・削除を行えるが動く機能はそのシステム用のものでなくてはならない。このNASは一般的なPCのCPUではなく携帯にも載っているARMと呼ばれるCPUで動いている、当然このARM用のプログラムしか動かせない。

# パッケージのダウンロードURLの喪失とバックアップ
このNASはARMv7のデュアルコアでg2とよばれるアーキテクチャで動いているようである。
そしてパッケージをダウンロードできるURLがすでに設定されているが、すでに喪失しているようである。つまりこのg2用のパッケージが二度と手に入らないのである。
しかし、パッケージは一般的なdpkgと似たopkgと呼ばれるパッケージシステムで管理されていてパッケージであるipkファイルはdebファイルと同じファイル形式である。
パッケージの中身は展開されてインストールされているが、逆にこれを集めることにより元のパッケージをサルベージできるのではないかと考えた。幸い、debファイルのcontrolファイルやpostinst,prermスクリプトをシステム内より探しだすことができたのでほぼ完全な状態のパッケージを復元できた。

# バックアップスクリプト
## /usr/local/bin/mkPkg
```shell:mkPkg
#!/bin/sh
# start script use busybox.
# set env
#PKGINFO=/var/lib/dpkg/info
PKGINFO=/usr/lib/opkg/info
PKGNAME=$1.pkg
PKGVER=_$3
[ $PKGVER != _ ] && PKGNAME=$1$PKGVER.pkg
WORK=/tmp/$1.work
# mkdir work dir
mkdir -p $WORK/control.d
mkdir -p $WORK/data.d
# copy control and script
for file in $(ls $PKGINFO/$1.*) ; do
cp $file $WORK/control.d/${file##*.}
done
# copy files from list
while read line ; do
[ -d $line ] && continue
[ ! -d $WORK/data.d${line%/*} ] && mkdir -p $WORK/data.d${line%/*}
cp $line $WORK/data.d$line
done < $WORK/control.d/list
# pack data.tar.gz
tar -C $WORK/data.d -czf $WORK/data.tar.gz .
rm -rf $WORK/data.d
# pack control.tar.gz
rm $WORK/control.d/list
tar -C $WORK/control.d -czf $WORK/control.tar.gz .
rm -rf $WORK/control.d
# make package
echo '2.0' > $WORK/debian-binary
cd $WORK && ar -r $PKGNAME debian-binary control.tar.gz data.tar.gz && cd $OLDPD
# copy package to current
cp $WORK/$PKGNAME $PWD/
# delete work dir
rm -rf $WORK
# end script
exit 0
```
## Howtouse
```shell:stdout
root@NAS:~# which sh
/usr/local/xbin/sh
root@NAS:~# sh --help
BusyBox v1.28.1 (2018-02-15 14:34:02 CET) multi-call binary.

Usage: sh [-/+OPTIONS] [-/+o OPT]... [-c 'SCRIPT' [ARG0 [ARGS]] / FILE [ARGS]]

Unix shell interpreter
root@NAS:~# opkg list-installed | xargs -n 3 mkPkg
    (省略)
root@NAS:~# ls nasmiru*
nasmiruagentD_1.0-1.pkg
root@NAS:~# 
```
【Mac】virtualBox+vagrantでLinux仮想環境をつくる


# TL;DR

- virtualBox
- vagrant


を使ってubuntu64ベースの仮想環境を作ります。
ハードはmacです。

※アプリのバージョンが違うと動かない場合があるので、
こちらで指定したバージョン以外を使ってエラー出た場合は、
自力解決していただけると幸いです。


# 手順

## 1. virtualBox

[Download VirtualBox (Old Builds): VirtualBox 5.1](Download VirtualBox (Old Builds): VirtualBox 5.1)にいき、「OS X hotst → Intel Macs」のリンクをクリックしてダウンロード。そしてインストールしましょう。時間けっこうかかります。


## 2. vagrantインストール

[https://releases.hashicorp.com/vagrant/2.0.0/vagrant_2.0.0_x86_64.dmg](https://releases.hashicorp.com/vagrant/2.0.0/vagrant_2.0.0_x86_64.dmg)からダウンロードしてインストールしましょう。時間けっこうかかります。

## 3. 作業フォルダを作る

ここからターミナルでの作業です。
どこでも良いので、作業フォルダを作りましょう。

例

```
$ mkdir username/vagrant/ubuntu64
```

## 5. 作業フォルダにubuntu64をインストールする

まずは作業フォルダに移動

```
$ cd username/vagrant/ubuntu64
```

そして以下のコマンドでインストールしましょう。

```
$ vagrant box add ubuntu/xenial64 https://vagrantcloud.com/ubuntu/boxes/xenial64/versions/20170929.0.0/providers/virtualbox.box
```

インストールできたら、vagrantの設定ファイルを作るためのコマンドを実行。

```
$ vagrant init ubuntu/xenia164
```

## 6. ubuntu 起動！

ubuntu起動！

```
$ vagrant up
```

↑のコマンドを実行するとwarningやら何やらでてきますが、
最終的に

```
Machine booted and ready!
```

が出れば起動完了です。


## 7. ubuntuに接続する

起動しただけでは使えないので、ubuntuに接続します。
※場所は変わらず作業フォルダ（username/vagrant/ubuntu64）です。


```
$ vagrant ssh
```

セキュリティの問題で何か聞かれますが、Yesと答えましょう。

以下の情報が出れば接続完了です。

```
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-64-generic x86_64)
// 以下Documentation等が列挙されてる
```

接続すると、ターミナルのuser名が変わります。

[![https://gyazo.com/639b074eb8aea0c221b73d8b6ed1b0aa](https://i.gyazo.com/639b074eb8aea0c221b73d8b6ed1b0aa.png)](https://gyazo.com/639b074eb8aea0c221b73d8b6ed1b0aa)

これで仮想環境が出来ました。

ただ、現状だとvagrantにアクセスしないとvagrant上のファイルにはアクセスできません。
それだとファイルを編集する時にvagrant上でしかできないし、ローカルでやるには、ダウンロードして編集して再up、と面倒になります。

なので、ローカルで編集したファイルが即時vagrantに反映されるよう、vagrantとOS間の共有フォルダを作りましょう。

## 8. vagrantとの共有フォルダを作る

まずはローカルの作業フォルダ内に、適当なフォルダを作ります。

```
$ mkdir tmp
```

これが共有フォルダの元になります。

次にVagrantfileの設定をいじります。

まずは、`vagrant ssh`した時のパスを確認。
環境によって、`/home/vagrant`と表示される場合もあります。

```
ubuntu@ubuntu-xenial:~$ pwd
/home/ubuntu
```

次にVagrantfileを開いて

```
/Users/username/vagrant/ubuntu64_16/Vagrantfile
```

41行目の空白行に

```
config.vm.synced_folder "./tmp", "/home/ubuntu/tmp"
```

を追記します。

ただし、`vagrant ssh`した時のパスが`/home/vagrant`だった場合は、

```
config.vm.synced_folder "./tmp", "/home/vagrant/tmp"
```

と追記してください。

---

これで仮想環境の設定は完了です。

ローカルの`/Users/username/vagrant/ubuntu64_16/tmp`でファイル操作をすると、vagrant上のtmpにも変更が反映されてると思います。
某音楽サービスのcmの間PCをミュートにするアプリを作る（macOSのみ）

# 作り方
* Script Editor.appを起動して下記コードをコピペする。20のところはいつも使っているボリュームにする（0 - 100）。45のところはミュートしたい秒数にする。

```
set volume input volume 0
delay 45
set volume input volume 20
quit
```

* File FormatのところをApplicationとして保存する。名前はなんでもok。
* command spaceでSpotlightから起動かDockに追加しておくのがオススメです。

# 参考
https://stackoverflow.com/questions/4220582/increase-volume-on-mac-using-applescript
https://alvinalexander.com/blog/post/mac-os-x/applescript-delay-command
http://mtlab.ecn.fpu.ac.jp/WSM_2002/020131143847.html
ansible-vault view を知っているか？？？


タイトルはつりっぽいですね。すいません。自分は知らなかったので勢い余って書きました。

### ansible-vault veiw を使うと何が嬉しいの？？？

僕みたいに、毎回decryptして中身を確認しなくて済みます。

```bash
ansible-vault view {path/to/encryptされたファイル名}
```

### 言い訳
Optionsには書いてないので見落としてました…。Usageにはきちんと書いてあるのにね…。

```bash
❯ ansible-vault                                                                                                                           ansible-192abc.com/git/add-slack-notify-key !
Usage: ansible-vault [create|decrypt|edit|encrypt|rekey|view] [--help] [options] vaultfile.yml

Options:
  --ask-vault-pass      ask for vault password
  -h, --help            show this help message and exit
  --new-vault-password-file=NEW_VAULT_PASSWORD_FILE
                        new vault password file for rekey
  --output=OUTPUT_FILE  output file name for encrypt or decrypt; use - for
                        stdout
  --vault-password-file=VAULT_PASSWORD_FILE
                        vault password file
  -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                        connection debugging)
  --version             show program's version number and exit
```
Dockerを使用したRedmineの導入手順

# 概要
Dockerを使用したRedmineの導入手順を記載する。

# 前提
- Linux端末にRedmineを導入する。
- Dockerがインストール済みであること。
- Redmine、およびRedmineが使用するDB(PostgreSQL)をDockerコンテナとして動作させる。

# 参考情報
[Redmineの公式Dockerリポジトリ](https://hub.docker.com/_/redmine/)

# Redmineの導入手順

## PostgreSQLコンテナの起動
`$ docker run -d --name some-postgres -e POSTGRES_PASSWORD=secret -e POSTGRES_USER=redmine postgres`

## Redmineコンテナの起動
`$ docker run -p 3000:3000 -d --name some-redmine --link some-postgres:postgres redmine`

# 動作確認
1. ブラウザで http://XXX.XXX.XXX.XXX:3000 にアクセスする。
2. 以下の画面が表示されることを確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187256/3844ab6b-8284-4fe4-824b-4c309d06c0fb.png)

デフォルトユーザー情報は以下のとおり。

|ログインID|パスワード|
|:--|:--|
|admin|admin|
SmartGit > ファイルのblameを表示する手順 > Highlight:Age By Time

```txt:動作環境
C++ Builder XE4
Windows 7 Pro (32bit)
SmartGit Version 17.1.5 #11217, installed: #11182
C++ builder XE4
```

.cppファイル、.hファイルの変更がどのタイミングで行われたかを知るためblameを使う。

SmartGitではどのようにすればblameの情報を表示できるか?

### Manual

http://www.syntevo.com/doc/display/SG/Blame

### 手順

以下の手順で確認できそうだ。

1. Filesペイン右上のアイコン「If selected, unchanged files will be shown.」をONにして、変更していないファイルも表示するようにする。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/451b41cb-b930-75db-721a-6515b683c9f8.png)

`2. Filesペイン内にてBlameを見たいファイル上で右クリックし、「Blame」を選択

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/375f508c-fa90-2e71-9354-860eb65af84e.png)

`3 「Blame for」ウィンドウにおいてHightlight:Age、By Timeを選択する

変更された日時により色分けされ、どのタイミングで変更されたか識別しやすくなる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8a591339-382f-bd1e-eeda-d8da8a3d86f3.png)