OmniAICreator/Qiita-1.07M huggingface dataset:
kintone 新モバイルUI画面の開発メモ

kintone 2019年モバイルリニューアルが行われ、今後モバイル利用も進んでいくと思われます。
ただし新モバイルUI に統一されるまでは、新旧モバイルUI を意識したカスタマイズが必要なケースがありますので、開発メモを残しておきます。

# 2019年モバイルリニューアルのスケジュール
[kintone HELP 2019年モバイルリニューアルのスケジュール](https://jp.cybozu.help/k/ja/user/mobile_access/preview.html)

2019/10 までは、新旧モバイルUIが選択出来ますので、移行期間中はカスタマイズに考慮が必要です。

# WEB ブラウザ表示とモバイルアプリ

通常のkintone API を使ったカスタマイズでは、ブラウザ表示とモバイルアプリを意識する必要がありません。
しかしDOM 操作を行う場合は、旧モバイルUIではヘッダ部の表示がブラウザ表示とモバイルアプリで一部異なり、表示環境を判定してカスタマイズする必要がありました。
新モバイルUIは、今のところ特に違いが無いように思われます。

## WEB ブラウザ表示とモバイルアプリの判定

window.navigator.userAgent に、'kintone_mobile'　の文字列があれば、モバイルアプリのようです。
ただし、公式に公開されている情報ではありませんので、これを使う場合、仕様変更のリスクがあります。
2019/10 に新モバイルUIに統一されれば、特に判定する必要はなくなると思います。

```.js
// WEB ブラウザ表示とモバイルアプリの判定
var kmobile = window.navigator.userAgent.indexOf('kintone_mobile') >= 0;
true: モバイルアプリ
false: ブラウザ表示
```

# 新旧モバイルUI の判定

kintone API または、関数などで新旧モバイルUI の状態は取得できないようです。
グローバル変数に、cybozu.data.SHOULD_SHOW_MOBILE_V2　が追加されており、それを見ると新旧が分かります。ただし公式に公開されている情報ではありませんので、これを使う場合、仕様変更のリスクがあります。

cybozu.data.SHOULD_SHOW_MOBILE_V2　の設定値
true: 新モバイルUI
false: 旧モバイルUI

プラグインなど複数のkintone環境で利用されるものについて、2019/10 までの移行期間中は、これをみて判定するしかなさそうです。
用途としては、日付項目の値変更イベントを使えるかどうかですね。

# 日付項目の値変更イベント

2019/7 のkintone 仕様変更で、新モバイルUIにおいて日付項目がカレンダー入力になりました。
これによって、モバイルの日付項目変更時イベントの不具合が解消されました。

旧日付項目入力時の問題

日付の年・月・日の入力項目が独立しており、日付未入力から年を入力すると、日付項目の値変更イベントが発生する。
結果、event.record の日付の値が未入力のままで、return event; すると、日付項目がクリアされる。

```.js
(function() {
  "use strict";
  kintone.events.on(["mobile.app.record.create.change.日付","mobile.app.record.edit.change.日付"], function(event) {
      return event;
  });
})();
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b3c51354-0d15-4a9f-2a84-45a43ce031fc.png)


# 日時・時刻項目の値変更イベント

日時はカレンダー入力になりましたが、時刻は相変わらず時・分が独立しており、入力途中で項目変更イベントが発生してしまう問題はそのままでした。
こちらも日付項目と同様に問題を改善してほしいですね。

```.js
(function() {
   "use strict";
   kintone.events.on(["mobile.app.record.create.change.日時","mobile.app.record.edit.change.日時"], function(event) {
       return event;
   });
})();
```


日時の日付をクリアしても、日時値変更イベントがあると、値が戻ってしまう例。
<img width="1128" alt="2019-07-17_11h19_58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3207867e-9b37-3814-5810-762019a6e8a1.png">
Gem::GemNotFoundExceptionと出てきたときの対処法

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#どういうエラーなのか
railsのリポジトリをクローンしてきてちゃんと動くか確かめようとした時に発生しました！
やったことはbundle installをしたら最後に以下のような感じのものが出てきました

```
//省略
Traceback (most recent call last):
    2: from /hoge/ruby/bin/bundle:23:in `<main>'
    1: from /hoge/ruby-2.5.3/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'
/hoge/ruby-2.5.3/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
```

###RubyGemsとBundler２のバージョンの組み合わせによって起こる問題
公式からの説明
[An update on the Bundler 2 release
](https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html)

公式から出ている説明の通り

```
$ gem install bundler -v '1.17.3'
```

と入力すれば解決！
さあ、次のエラーが待っている。
ZapierでGmailのメール受信を通知する


[Zapier  https://zapier.com](https://zapier.com)

1. Googleのアカウントでログイン
2. Dashboardで以下のように設定![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181254/13b7b826-1522-7640-a574-0ed3ccd9c24a.png)
3. 次のページで投稿先のチャネルを設定
4. Go to Advanced Mode
5. Advanced Modeで細かい設定ができる
6. 新規メール受信時(New Email) -> 新規ラベル設定時(New Labeled Email)　とか
7. Slackの送信テンプレートを設定したりできる
8. 設定したらMyZapsに保存されるので、スイッチをONにすれば有効化

※動作テストしたいときはRUNで、都度実行できる
xargsコマンド

`xargs`はあるコマンドを引数として追加のコマンドを実行できる。


[command1] で実行して得た引数を元に [command2] を実行する

```
$ [command1] | xargs [command2]
```

`xargs`を用いると複数条件検索ができるので`find`や`grep`との併用が便利。

```
#現階層におけるrtf形式のファイルで内容に2が含まれるもの
$ find . -name "*.rtf" | xargs grep 2
```

でもこれだと条件によっては一気に出てしまうので、不便。。

だから各ファイルづつ出力を待ってもらうようにする

```
#optionで -p を指定して確認を挟む
$ find . -name "*.rtf" | xargs -p  grep 2

#これらのファイル検索するよと聞かれるので 'y' or 'Y' で回答
grep 2 ./huga.rtf ./hugahuga.rtf ./hogehoge.rtf ./hogera.rtf ./piyo.rtf?...y

#応答
./hugahuga.rtf:32131
./hugahuga.rtf:bzber2
./hugahuga.rtf:4251
./hogehoge.rtf:222
./hogehoge.rtf:62
./hogehoge.rtf:462
./hogera.rtf:222
```
これだと結果変わらないので、`-L`で試行ファイル数を意図的に変更できる。

`-L`の後ろに数字を指定し、そのファイル数ごとに出力をストップさせる

```
#1ファイルごとに出力ストップ
$ find . -name "*.rtf" | xargs -L1 -p grep 2
grep 2 ./huga.rtf?...y
grep 2 ./hugahuga.rtf?...y
32131
bzber2
4251
grep 2 ./hogehoge.rtf?...y
222
62
462
grep 2 ./hogera.rtf?...y
222
grep 2 ./piyo.rtf?...y
```
```
#2ファイルごとに出力ストップ
$ find . -name "*.rtf" | xargs -L2 -p grep 2
grep 2 ./huga.rtf ./hugahuga.rtf?...y
./hugahuga.rtf:32131
./hugahuga.rtf:bzber2
./hugahuga.rtf:4251
grep 2 ./hogehoge.rtf ./hogera.rtf?...y
./hogehoge.rtf:222
./hogehoge.rtf:62
./hogehoge.rtf:462
./hogera.rtf:222
grep 2 ./piyo.rtf?...y
```
ヒットするものだけが返ってきたらベストだけど、そこまではよく分からない、、（泣
cloud9上でnumpyインストールに失敗した時の対処法

# 困ったこと
numpyを使ったプログラムを実行したら
モジュールが入ってないよと叱られた。
「しょうがないなぁ」とpipでinstallしたらエラーになった…。
なんかpython2.7以降のやつ使ってね、みたいなエラー。

```:コマンド＆実行結果
ec2-user:~/environment/deep-learning-from-scratch/ch03 (master) $ python 3.2.3.step_function.py 
Traceback (most recent call last):
  File "3.2.3.step_function.py", line 2, in <module>
    import numpy as np
ImportError: No module named numpy
ec2-user:~/environment/deep-learning-from-scratch/ch03 (master) $ pip install numpy
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting numpy
  Using cached https://files.pythonhosted.org/packages/1f/c7/198496417c9c2f6226616cff7dedf2115a4f4d0276613bab842ec8ac1e23/numpy-1.16.4-cp27-cp27mu-manylinux1_x86_64.whl
Installing collected packages: numpy
ERROR: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/lib64/python2.7/dist-packages/numpy-1.16.4.dist-info'
Consider using the `--user` option or check the permissions.
```

# やったこと
調べてみると同じ状況の人がたくさんいたようで調べたらコマンドが見つかった。
試してみたら見事に成功！

```:コマンド
$ python3 -m pip install numpy --user
```

実際の結果はコチラ

```:実行結果

ec2-user:~/environment/deep-learning-from-scratch/ch03 (master) $ python3 -m pip install numpy --user
Collecting numpy
  Cache entry deserialization failed, entry ignored
  Downloading https://files.pythonhosted.org/packages/87/2d/e4656149cbadd3a8a0369fcd1a9c7d61cc7b87b3903b85389c70c989a696/numpy-1.16.4-cp36-cp36m-manylinux1_x86_64.whl (17.3MB)
    100% |████████████████████████████████| 17.3MB 75kB/s 
Installing collected packages: numpy
Successfully installed numpy-1.16.4
You are using pip version 9.0.3, however version 19.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
ec2-user:~/environment/deep-learning-from-scratch/ch03 (master) $ 
```
# 何がよかったの？
ポイントは２つ
　１．pipだけだとpython2を使おうとするのでpython3 -m　を頭に入れてやった
　２．それだけだと権限エラーになるので「--user」を加えてやった　←ちなみにコレを使うことはは↑↑のエラーメッセージにも指摘されてた。。。

# お世話になったURL
Qiita（Python3 > pipのインストール / numpyのインストール）
　https://qiita.com/7of9/items/d2625ed24d7124c50d99

teratali（Cloud9上にpythonのモジュール(numpyなど)をインストールしようとしても、pkg_resources.VersionConflictのエラーが出る）
 https://teratail.com/questions/119338

～めでたしめでたし～
Vue CLIの練習がてらTodoリストを作った。

# はじめに
作ったとか言ってますがプロトレベルです。

ソースコードは
https://github.com/MosasoM/todo_baloon
です。

こちらで試すことができます。
https://mosasom.github.io/Todo_pages/

# 何が新しいか。

Todoリストを使うのって難しくないですか？
できるだけタスクは大小構わず突っ込んじゃうほうが楽だけど、それをやるとTodoにタスクが氾濫して何の優先順位が高いのかどうかがわからない。

カレンダーだと、予定とTodoの区別がつかない。

結局、僕がTodoリストにもとめていたのは、

1. **今直ぐやらなきゃいけない事がどのくらいあるのか**
2. **どのくらい将来のタスクが溜まってきていて、早い段階から頑張る必要があるのか**

を知ること何じゃないか？と考えてそれを満たすべくTodoを作ることに決めました。

# どんなのを作ったか。

1.基本はTodoリスト
2.優先度と期限までの時間でTodoのサイズや色が変わる。
3.優先度の順にソートされる。

スタイルは、
１.緑小サイズ
2.緑中サイズ
3.緑大サイズ
4.黄大サイズ
5.赤大サイズ

の5段階で、タスクのprority低〜高に対して初期値が1-3、それに7日前になると+1,3日まで+2されるように鳴っていて、この和によって上のスタイルが割り振られます。

このスタイルの決め方は迷っていて、最後に書きますがこの先変わるかもしれません。

こちらで試すことができます。
https://mosasom.github.io/Todo_pages/

右上の+でタスク追加、タスクのDoneはタスクをクリックするとできます。

# どうやって実現したか。
Vue.jsを使っていますが、予想の通りあまり難しいことはしていないです。

データの保存にはlocalStorageを使用しています。タスクはテキストベースでどんなに貯め込む人でも3桁行かないくらいだと思うので、容量は問題ないと思っています。

並び替えにはvueのComputed,色やサイズ変えにはv-bind:class=を利用しています。
特に面白いことも無いですね。

## 少し面倒な点
Vueタスクマネージャーを作り、しかもそれをcomputedによって自動的に並びかえる場合、問題となるのがタスクが完了したときの処理です。追加は後ろにpushして並び替えを翔るだけですが、消去の場合は、

1. Doneするのは並び替え後のタスクを選択する
2. computedは副作用防止のためにソート前に.slice()で複製している
3. つまり、タスクデータを消すのは並び替え前のデータ

ということで少々面倒です。また、コンポーネントの分割の問題もあって実装がほんの少し複雑になりました。
結局概念図がこんな感じになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244678/bf5eac96-0d0a-0d11-fffc-85c9c6bb9100.png)


ラッパーにタスクデータをもたせて、並び替え及びスタイル用の子コンポーネントに渡しています。
あと、元タスクの変更は$emitで与えたデータを元に処理することにしています。

ソース
https://github.com/MosasoM/todo_baloon

はこのようになってます。

#builｄのときに困ったこと。
どうやらVue-cliは初期設定だと絶対パスらしい。そのためbuildしたのをそのまま動かそうとするとFile not foundがでてしまう。

→http://www.o2-m.com/wordpress2/2019/04/10/vue-cli-3%E3%81%A7%E3%83%93%E3%83%AB%E3%83%89%E3%81%97%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92web%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E4%BB%BB%E6%84%8F%E3%81%AE%E3%83%91%E3%82%B9/

ここに解決方法がありました。

# これから

まずは使ってみようと思います。そのためのプロトタイプなので
その上で自分が継続して使いたいと思うようならば、以下の点が課題です。

1. 優先度及びスタイルが、最初の優先度+期日までの和になっている。和を取らずにそれぞれに基づいてそれぞれスタイルを適用したほうが、良いのか？その場合の並び替えは？
2. コンポーネントが切り分けられきってない。
3. トランジションを少し導入してUXをよく
4. 今は期日が3,7日で二つのしきいちで設定されている。個別に設定できるようにすべき？連続関数にするべき？

とまぁいろいろ荒いですが、作ってみることに意味があるということにしています。
Android開発中にGitLabをクローンしたフォルダをコピペしたらgit管理できなくなった時の対処法

#Android開発中にGitLabをクローンしたフォルダをコピペしたらだめ

AndroidStudioでAndroidを開発しているのですが、
AndroidXに移行するためにプロジェクトフォルダごとコピペしたんです。

そうしたら、コピー先のフォルダに.gitファイルがなくなってAndroidStudioに怒られました。

その対処法を書いていきます。

Qiita初投稿です。今後メモ書き程度に書いていきます。

#コピペした後にコミットしたい人向けの対処法

###登場するのは、
Android_new：コミットしたいプロジェクトフォルダ（git連携していない）
Android_old：古いプロジェクトフォルダ（git連携してる）

###やること
1. Android_newをコピペしてソースをバックアップ
2. Android_oldにAndroid_newの中身をドラッグ&ドロップして上書き
3. Android_oldの名前をプロジェクト正規の名前にする
4. Gitにコミット、プッシュ、マージなどする

以上
Elixir(iex)の出力で文字リストと出会った

iexでelixirの関数とか実行して遊んでいた時の話。

出力でIO.puts使っていたのですが、いちいち書くのも面倒だし、
返り値(という表現であっているか？)が実行文の下に表示されるんで、
必要な時以外は書いていなかった。

ある日、

```
iex(96)> values = [hoge: 1, fuga: 3]
[hoge: 1, fuga: 3]

iex(97)> for {:hoge, n} <- values, do: n * n 
[1]
```

配列を定義して、forでループさせるって処理を書いていました。
ここまでは普通だけど、

```
iex(98)> for {:fuga, n} <- values, do: n * n
'\t'
```

[9]が表示されて欲しかったんですが、なんか、こんな表示になった。

ナニコレ、、、？

色々調べた結果「\t」の10進数ASCIIコードが「9」だった。
つまり、数値がASCIIコードとして認識されて表示されてることがわかった。
http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html

なんでなん、、、？と思って調べたところ、
https://elixirschool.com/ja/lessons/basics/strings/#%E6%96%87%E5%AD%97%E3%83%AA%E3%82%B9%E3%83%88
こんな記述があった。

```
Elixir の文字列はダブルクオートで生成され、一方文字リストはシングルクオートで生成されます。
内部では Elixir の文字列は文字の配列というよりはバイトのシーケンスとして表現されており、
Elixirは(複数の文字のリストである)文字リストという型を別に持っています。
Elixir の文字列はダブルクオートで生成され、一方文字リストはシングルクオートで生成されます。
これらの違いは何でしょう？

文字リストから得られる個々の値はバイナリで表現されているコードポイントで、 UTF-8 でエンコードされています。
```

つまり、[9]はintの配列ではなく、9というコードポイントの文字リストとして認識されていたようです。
確かに出力されてる文字(\t)がシングルクォートで括られていますね。
単に数字の9だけじゃなくて、forで返り値を配列にしてしまったがために発生していた感じです。

IO.putsとかto_stringするとちゃんと文字列として出力もされますね。

```
iex(4)> values = [hoge: 1, fuga: 3]
[hoge: 1, fuga: 3]
iex(5)> for {:fuga, n} <- values, do: to_string n * n
["9"]
iex(6)> for {:fuga, n} <- values, do: IO.puts n * n  
9
[:ok]
```

注意、、、するほどでもないし特に支障ない事象だとは思うんですが、
不思議だったので書き記しておきます！

それにしても、自分がそういうシチュエーションに出会ってないだけカモですが、
文字リストって実際の業務アプリケーション作る時とかって使用することあるんだろうか？
DDR3 SDRAM Controller with UniPHYのサンプルプロジェクトで Error (174068): Output buffer atom “～ が出る

# 概要
Intel FPGAの開発でIP catalogによる、
`DDR3 SDRAM Controller with UniPHY` IP
から自動生成されたサンプルプロジェクトをコンパイルしたところ、下記のようなエラーが山ほど出ました。

![Error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450358/0d0fce11-ad40-4a0b-7e2d-6757a8ac4b24.png)

ほぼ全て、`Error (174068): Output buffer atom “`となっていました。
(当時の環境はQuartus Ver.15)

#解決法
Quartus上から下記を実行します。

1. Tools → Tcl Scripts を開く
2. <サンプルプロジェクト名>\submodules\ <プロジェクト名>_pin_assinments.tcl を実行(Run)する。
3. 再コンパイルする

これで解消すると思います。
それでもエラーが消えない場合は、Project → Clearn Project を試してみて下さい。改善する場合があります。

# 最後に
ALTERAがIntelに買収されてから、QuartusのHelp関連リンクがほぼ死滅状態にあります。頼みの綱はWeb上のハマった前人たちの足跡に頼るしかありません。こういった状況をIntelさんはどう思っているのでしょうか。今後の動向に期待したいです。
Amazon CloudFront の代替ドメイン名(CNAMEs)のセキュリティ強化 SSLが必須になった


CloudFront の代替ドメイン名（Alternate Domain Names(CNAMEs)）を設定する際、該当する SSL/TLS 証明書の登録が必須になりました。

登録してみる、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7db038a5-e9d6-c5ec-6527-f59575e3823b.png)

そのままのとおり、 SSL/TLS 証明書の登録する必要があるよーとおこられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/37905130-e696-8322-0194-f070ecba14b3.png)

そのため、HTTPS は不要、HTTP のみで CloudFront を使いたいという場合でも SSL 証明書が必要・・・。

なお、既存のものは今のところそのまま動くらしいです。

---
参考記事
[Amazon CloudFront がディストリビューションに代替ドメイン名を追加する際のセキュリティを強化](https://aws.amazon.com/jp/about-aws/whats-new/2019/04/amazon-cloudfront-enhances-the-security-for-adding-alternate-domain-names-to-a-distribution/)
[Continually Enhancing Domain Security on Amazon CloudFront](https://aws.amazon.com/jp/blogs/networking-and-content-delivery/continually-enhancing-domain-security-on-amazon-cloudfront/)
[Amazon CloudFront の代替ドメイン名(CNAMEs)設定に SSL 証明書が必須になりました](https://dev.classmethod.jp/cloud/aws/201904_enhancing-domain-security-on-cloudfront/)
3ステップで作るchrome拡張機能

# 必須ファイルを作る
manifest.json,html,jsで構成されているので、各ファイルを用意する。

```json:manifest.json
{
    "manifest_version": 2,
    "name" : "helloworld",
    "version": "1.0",
    "browser_action": {
        "default_popup": "helloworld.html"
    }
}
```
```html:helloworld.html
<script src="./helloworld.js"></script>
<p id="sample"></p>
```
```javascript:helloworld.js
window.onload = function () {
    var element = document.getElementById('sample');
    element.innerText = 'hello world';
}
```
# chrome://extensions/にアップロード
デベロッパーモードをonにして「パッケージ化されていない拡張機能を読み込む」でOK
<img width="452" alt="スクリーンショット 2019-07-17 11.00.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229696/3968693b-9240-3f63-969b-25f69c527189.png">


# 完成
<img width="105" alt="スクリーンショット 2019-07-17 11.00.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229696/b21c8c27-4bbe-a765-1a1b-38a983db571a.png">

これを足がかりにして色々作っていきたい
【JavaScript】deleteあれこれ(non-configurable)

世の中には消せるものと消せないものがあるみたいです。

##non-configurableって何さ
この単語がリファレンスで出てきてわかんなかったのが始まり。
[Object.defineProperty():MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)
このメソッドのプロパティに`configurable`発見。

説明を見ると、
>true である場合のみ、この種の記述子を変更することや、対応するオブジェクトからプロパティを削除することができます。
既定値は false です。

とおっしゃってます。
`non-configurable`はさしずめ**削除できません**ってとこでしょうか。


https://uhyohyo.net/javascript/11_4.html
こちらのプロパティスクリプタの説明では、`Object.getOwnPropertyDescriptor`を使って
プロパティの`configurable`の属性がどうなっているかチェックできるようです。

##deleteできるもの・できないもの

まず忘れてはいけないこと。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Errors/Delete_in_strict_mode
>JavaScript では、通常の変数を delete 演算子で削除できません。strict モードで、変数を削除しようとするとエラーがスローされ、削除できません。
delete 演算子は、オブジェクトのプロパティのみ削除できます。オブジェクトプロパティは、設定可能な場合は "修飾" されます

変数、strictモードだと消せないんですね。
そして`configurable`のみがdelete可能なようです。

##deleteの戻り値
消せたら`true`,消せなかったら`false`が戻ります。

##deleteと配列（lengthについて)

```javascript:lengthとdelete
let animals =['cat','chicken','hen'];
delete animals[0];       
console.log(animals);           //[empty,'chicken','hen']
console.log(animals.length);   //3
```

このように、配列を`delete`しても`length`は変わらないので要注意！ですね。

##deleteとプロトタイプ

```javascript:プロトタイプから継承されたものは消えない
function Foo(){};
Foo.prototype.bar = 1;
let foo = new Foo();

delete foo.bar;       //戻り値はtrueだが、消えない
console.log(foo.bar);  //1と表示されてしまう。
```

プロトタイプから継承されているプロパティを削除するには、以下のように削除します。

```javascript:継承されたプロパティのdelete
delete foo.prototype.bar;
console.log(foo.bar);     // TypeError
```
Cloud9でworkspace作った時のルートディレクトリはどこになるのかを確認する

# やりたいこと
　cloud9で左ペインのディレクトリツリーがどういう配置になっているのか今のうちに確認

# さっそく確認

/home/ec2-user/environment/
がワークスペースのルートディレクトリになるっぽい。
よく見たら左ペインにenvironmentって書いてるからそういうことなのね。
　![コメント 2019-07-17 104724.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/d81cfff7-f11b-2172-2537-22e82a29ed46.png)

試しにch01配下のhungry.pyを実行してみたらうまいこと動いた。
よかったよかった。

～おしまい～
Cloud9上でgithubで公開されているソースコードを取得する

# 実行環境
　IDE：cloud9（事前にAWSのアカウント取得済み）
　git：github（事前にgithubアカウント取得済み）


# やりたいこと
　書籍でソースコードをgithubで公開しているケースが多いので
　いつでもgithubからソースコードをとってこれるようにお決まりのコマンドをメモで残しておく
　Cloud9はgithubと連携することができるということで早速試してみた。

# やってみた

今回とってくるソースコードはコチラ
URL：https://github.com/oreilly-japan/deep-learning-from-scratch
clone先のディレクトリ名：deep-learning-from-scratch

```:実行コマンド&出力結果

ec2-user:~/environment (master) $ git clone https://github.com/oreilly-japan/deep-learning-from-scratch deep-learning-from-scratch                                                                                                                   
Cloning into 'deep-learning-from-scratch'...
remote: Enumerating objects: 400, done.
remote: Total 400 (delta 0), reused 0 (delta 0), pack-reused 400
Receiving objects: 100% (400/400), 5.25 MiB | 4.41 MiB/s, done.
Resolving deltas: 100% (206/206), done.
ec2-user:~/environment (master) $ 
```

コマンド実行後、↓↓な感じで新しくディレクトリとファイルが現れた。
![コメント 2019-07-17 104155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/875436b8-08fd-64aa-b05d-679e1314159d.png)

gitは賢いのでカレントディレクトリに同名のディレクトリがなければ、自動的に作ってくれるのはイイね。

～おしまい～
Cognos Analytics データセットの自由度を広げる裏技

#データセットで自由度を広げる裏技
元ネタはこちらです。
へ～と思いましたので紹介しておきます。
**Using Custom Queries in a Data Set (Cognos Analytics 11.1 R1)**
https://www.youtube.com/watch?v=jwFr0sEhIWQ

データセットとは、Framework Managerで作成したパッケージの一部を集めて、キャッシュとしてコンテントストアに持たせる機能です。
<img width="450" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/2d322d15-dc4b-b537-061f-eeafb0c9b244.png">

こんな感じで、パッケージからクエリーアイテムをドラッグ&ドロップして、必要なアイテムを集めて、1つのデータセットとします。
基本これだけで、ここで新たに計算式を追加したり、複雑なクエリーを組んだり、というのはできません。
<img width="591" alt="002.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/f6fd3bcc-179e-0a3a-1bc4-cfacd9395f4a.png">

しかしながら、この裏技であれば、好き勝手に計算式追加したりクエリー組んだりできるよ、という話です。

試しに、ここで「差分」=「収益」-「計画収入」という計算式を追加してみます。

一旦データセットは離れ、ポータルから新規に「レポート」を開きます。
<img width="134" alt="003.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/2393c058-a6d6-fc29-3b21-727f49fe1830.png">

先ほどデータセットを作成しようとした際のパッケージをデータソースとして使用し、普通の手順で「差分」を作成します。
<img width="718" alt="004.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/e443b6e3-ef18-457a-2707-70b715c2733b.png">

リストにデータアイテムを配置し、「クリップボードにレポートをコピー」でレポートXMLを抽出。メモ帳などに貼り付けておきます。
<img width="796" alt="005.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/a1f5d2c5-ada9-6be5-6195-f8b70baeafb8.png">

先ほどのデータセットに戻り（新規でも良いです）、Ctrl + Alt + M ボタンを同時に押します。
<img width="636" alt="006.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/1c01ca5d-33f7-79b7-8f7a-64ca8a1269f0.png">

上の方にメニューが表示されました。まるでレポートの機能のようですね。
「クリップボードからレポートを開く」で、先ほどのレポートXMLを取り込みます。
<img width="801" alt="007.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/69f986da-4290-ead5-926b-3bd035039d71.png">

来た～、という感じですね。「差異」がデータセットに存在しています。
<img width="666" alt="008.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/f6597ad7-b283-8cb7-4d0e-e8738543c3ff.png">

「ページ1」だけでなく、この様にクエリーも見れますので、ここで計算式を変更する事も可能です。
<img width="848" alt="009.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/f94784fa-62e9-04fa-4517-83ec7d48e177.png">

データセットを保存して、「更新」後、試しにダッシュボードで見てみると、ばっちり「差分」アイテムが見れています。
<img width="845" alt="010.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/e13e746d-54eb-6dfd-0ce3-f08c27e3f406.png">

この様に、「レポート」の機能で作った複雑な処理での結果セットを、レポートXMLを介してそのままデータセットに持たせるという事ができる、覚えておくとちょっと可能性が広がる裏技ですね。
ご活用ください～
他の人が書いたreactのソースを起動したり書き換えたりして学ぶ時の手順メモ

## 概要
他の人が書いたreactのソースを起動したり書き換えたりして学ぶ時の手順メモ

## 前提条件
githubに公開されている事

## 手順
該当のファイルをcloneする

```aspectj
$ git clone https://github.com/ogom/react-comment-box-example.git
$ cd react-comment-box-example

# パッケージの更新の確認は npm-check-updates を利用する
$ npm install -g npm-check-updates

# 更新パッケージの確認
$ ncu
Checking react-comment-box-example/package.json
[====================] 22/22 100%
 babel-core                  ^6.18.2  →  ^6.26.3
 babel-jest                  ^17.0.2  →  ^24.8.0
 babel-loader                 ^6.2.8  →   ^8.0.6
 babel-preset-es2015         ^6.18.0  →  ^6.24.1
 babel-preset-react          ^6.16.0  →  ^6.24.1
 css-loader                  ^0.26.0  →   ^3.0.0
 enzyme                       ^2.6.0  →  ^3.10.0
 jest                        ^17.0.3  →  ^24.8.0
 jquery                       ^3.1.1  →   ^3.4.1
 postcss-loader               ^1.1.1  →   ^3.0.0
 react                       ^15.4.1  →  ^16.8.6
 react-addons-test-utils     ^15.4.1  →  ^15.6.2
 react-dom                   ^15.4.1  →  ^16.8.6
 react-hot-loader             ^1.3.1  →  ^4.12.7
 react-redux              5.0.0-rc.1  →    7.1.0
 redux                        ^3.6.0  →   ^4.0.4
 redux-actions                ^1.1.0  →   ^2.6.5
 style-loader                ^0.13.1  →  ^0.23.1

# 下記コマンドでpackage.jsonを更新
$ ncu -u

$ npm install
$ npm start
```

## 参考
[React Tutorial Example (Package)](https://qiita.com/ogomr/items/224a1355078ea1a809a5)
BitbucketのPiplinesを使ってCD(継続的デリバリー)を実装する

友人との開発で、[Owntime](https://owntime.io/signup)を作っています。
このサービスは、時間の使い方を管理して、生活の振り返りをするきっかけを作ってくれます⏰「最近、生活の振り返りができていないな〜」っていう方は、ぜひ、一度使ってみてください！！

さて、今回は、[Owntime](https://owntime.io/signup)の開発業務効率化のために実装した、CD(継続的デリバリー)についてまとめました。
リリース作業は、単純操作が多くて、面倒になることが多いので、自動化したいと思う方が多いと思います。そのような方々に向けた記事になっています。

参考記事: [Bitbucket Pipelinesで継続的デプロイ](https://qiita.com/uitspitss/items/4668a964dbedfb2af67e)

## Bitbucketの設定

まず、Bitbucket上で設定を進めます。

- Piplinesを有効化する
    - サイドバーの「設定」->「Settings」->「Enable Pipelines」を有効化する
- 新しいSSH Keyを登録する
    - サイドバーの「設定」->「SSH Keys」->「generate keys」を押下する
    - 生成された `Public key`を仮想サーバーの `~/.ssh/authorized_keys` に追記する
    - 「Known hosts」の「Host address」に仮想サーバーのIPを入力して「Fetch」を押下する
    - Fetchが成功したら、 **Figerprint** ができるので、「add host」を押下する

## bitbucket-piplines.ymlを作成

サイドバーにある「Piplines」を押下すると下記の画面になります。

さらに「Python」を選択すると、 `bitbucket-piplines.yml` のテンプレートが表示されます。

[![Image from Gyazo](https://i.gyazo.com/c1f534375a622d9664ff39bd0f56b573.gif)](https://gyazo.com/c1f534375a622d9664ff39bd0f56b573)

`bitbucket-piplines.yml` は、下記のように編集します。

```bitbucket-pipelines.yml
image: python:3.7.3

pipelines:
  branches:
    master:
      - step:
          name: Release to live server
          script:
            - ssh -p $DEPLOY_SERVER_PORT $BITBUCKET_BRANCH@$DEPLOY_SERVER_IP bash < deploy.sh
```

さらに、仮想サーバー内で実行するコマンドは、 `deploy.sh` に記入します。

(deploy.shを用意するのは、イマドキではないと言われることがあるので、時間に余裕ができたら、改修する予定です。)

```deploy.sh
#!/bin/bash

cd /path/to/project

export VENV_HOME_DIR=$(pipenv --venv)
source $VENV_HOME_DIR/bin/activate

git pull origin master

pip install -r requirements.txt

pkill gunicorn
gunicorn owntime.wsgi -D

echo "Deployed! Thank you!!"
```

これで、実装が完了です。

masterブランチにマージしてみてください。
「Piplines」を押下すると、成功しているのか失敗してしまったのか、が表示されています！

## 今後の修正点
`deploy.sh` の途中の処理に失敗しても、最後のコマンドまで実行されて、Bitbucket上では、 **Successful** になってしまいます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185039/a637d86f-6b33-0b47-b7e1-0ec09ec0ec91.png" width=75% />

なので、処理が失敗したら、Bitbucket上で、 **Failed** にするような変更をしていきたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185039/dc473148-4c78-780a-9cd6-52a28c5d24de.png)


## おまけ
今回紹介したTipsを使って、友人と[Owntime](https://owntime.io/signup)を開発しています。
毎日の時間の使い方を記録して、分析して、理想な時間の使い方に近づけるサポートをするサービスです。

ぜひ、一度使ってみてください！
Git管理下で更新されたファイルを楽々add

## 概要

Git管理下のプロジェクトで、ファイルを書き換えた場合にいちいちgit addし直すのがめんどくさい。
なんで一発で登録するコマンドを書いてみた。

## コマンド

まずはこれだけ。

```sh
git status | grep modified: | awk '{print $3}' | xargs git add
```

でも、

```sh
git add -u
```

というオプションがあって、普段はこっち使った方が早い。
じゃあなんでこんな記事を書いてるかというと、更新したファイル全てではなく絞りたい場合あるじゃん。
例えばpngファイルだけaddしたい場合は

```sh
git status | grep modified: | awk '{print $3}' | grep -E "*\.png" | xargs git add
```

ってすればOK！
ニューロコンピューティングの数学的基礎　上坂吉則

ニューロコンピューティングの数学的基礎　上坂吉則
![515LQkGsviL._SX346_BO1,204,203,200_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/41073dd9-3c98-c7c3-3727-034dc6a2a930.jpeg)
https://www.amazon.co.jpdp/4844372971/

ニューロコンピューティングの書籍の分かりにくさは、
生物的知識を前提として記述していること
物理的知識を前提として記述していること
数学的知識を前提として記述していること
あるいはそれらの二つまたは全部
かもしれない。


まえがき
>1. パーセプトロン型の層状認識機械の学習法が誤差逆伝搬法として再認識された
2. ニューラルネットにエネルギーの概念を持ち込むことによって、計算量の観点からこれまで解くことが難しいといわれていた組み合わせ最適化問題を扱えるようになった
3. ボルツマンマシンと呼ばれる確率的ニューラルネットによる新しい最小値探索機械がシミュレーティッドアニーリングとともに登場してきた
4. 初期資格や画像復元の問題にマルコフ確率場を道具としたアプローチが提案され、その並列計算性がニューラルネットにマッチしている

第１章　ニューロンの数学的モデル


ニューラルネット（神経回路網）
脳
知的情報システム
細胞体
ニューロン（神経細胞）
・樹状突起
・軸索
・シナプス
多入力１出力
物理学
生理学
電位差
・膜電位・内部電位
閾（しきい）値
ぱるす
入力信号
パルス
インパルス
空間的加算性
時間的加算性
遅延
重み係数
非線形性
２値性
ニューロンモデル
ニューロコンピューティング
静的デジタルモデル
ステップ関数

#参考文献
#第１章
神経回路網の数理, 脳の情報処理様式-システム・サイエンス・シリーズ, 甘利俊一, 産業図書, 1978
https://www.amazon.co.jp/dp/478285255X/

神経回路と自己組織化　自己組織化のモデル-情報科学講座-・18・1, 福島邦彦, 共立出版, 1979
https://www.amazon.co.jp/dp/4320020383/


#第２章
学習識別の理論,  甘利俊一, 電子通信学会誌, 50, 1272,1279, 1967



#第３章
上坂吉則, 2値変数の実数値関すからみちびかれるエネルギーを持つニューロン回路網の安定性について, 電子情報通信学会技術報告, PRU 88-6, 7-14, 1988 

#第４章

有限マルコフ連鎖, 羽鳥 裕久, 森 俊夫,  培風館, 1982
https://www.amazon.co.jp/dp/4563008400/

#第５章
ビジョン　視覚の計算理論と脳内表現, デビッド マー,産業図書, 1987
https://www.amazon.co.jp/dp/4782851235/

#解説と図書

分散システム論　熱力学的システム論, 深尾毅, 昭晃堂, 1987
https://www.amazon.co.jp/dp/4785690259/
LaravelでS3にファイルを送る際にIAMロールを使う場合の設定

ファイルの保存先をローカルからS3にする時にとてもハマったので備忘メモ
検索の仕方が悪いのかもしれないけどACCESS_KEY_IDとSECRET_ACCESS_KEYを指定する方法しか出てこなかった

# 結論
filesystems.php

        's3' => [
            'driver' => 's3',
            'key'    => null,
            'secret' => null,
            'region' => env('AWS_REGION'),
            'bucket' => env('AWS_BUCKET'),
        ],


IAMロールをEC2のインスタンスに付与してアクセスを行う際はnullを設定する
項目自体をコメントアウトするとFWでエラーが出るので注意
写真を送ると文字起こしして返信してくれる LINE WORKS Bot

ユーザーから送信された画像ファイルを解析して、OCR 処理した結果をトークで返信してくれる LINE WORKS Bot です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/30f42b64-f1d0-3292-7ddd-a82a7cb96817.png)


画像解析は Microsoft Azure Cognitive Services の Computer Vision を使います。
https://azure.microsoft.com/ja-jp/services/cognitive-services/computer-vision/

次のような操作のながれを想定します。
1. LINE WORKS で Bot に画像ファイルを送信する
2. Bot が画像を読み取って文字起こしした結果を返信してくる

LINE WORKS の トーク Bot API を利用します。
具体的には以下の API を実行しています。

TITLE: メッセージ受信 - Callback 形式 (message)
URL: https://developers.worksmobile.com/jp/document/100500901?lang=ja
ユーザーから送信される画像ファイルを受信します。

TITLE: コンテンツダウンロード
URL: https://developers.worksmobile.com/jp/document/1005026?lang=ja
受信した画像ファイルを取り出します。

TITLE: メッセージ送信 (text)
URL: https://developers.worksmobile.com/jp/document/100500801?lang=ja
解析結果のメッセージをユーザーに返信します。

Microsoft Flow を用いて、ほぼコーディングなしでサクっと作ってみましょう。

## Microsoft Flow のフロー作成

トリガーに "HTTP 要求の受信時" を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/bdf9e462-8e3c-ca77-fabf-4f072c4b5560.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/9acbb3e8-9775-0fc2-2870-241088b1487e.png)

要求本文の JSON スキーマを "サンプルのペイロードを使用してスキーマを生成する" で生成します。
ペイロードのサンプルは、こちらのページの記載を用います。
TITLE: メッセージ受信 - Callback 形式 (message)
URL: https://developers.worksmobile.com/jp/document/100500901?lang=ja

-> Request Example - type "image" の箇所

```
{
  "type": "message",
  "source": {
    "accountId": "admin@example.com",
    "roomId": "12345"
  },
  "createdTime": 1508062056427,
  "content": {
    "type": "image",
    "resourceId": "WAAAQPwBexX2HnseNvvM9Zyhvp2kIRF3Ul7L7/aMVti8="
  }
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/c09872b4-6d5d-0f06-38d3-d353f8f5e4bf.png)

次に送信された画像を取得するために、"HTTP" をアクションに指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/56766715-b6ca-cdd8-4b17-5d3d5a6ab503.png)

コンテンツ ダウンロード API 実行用の設定を行います。
TITLE: コンテンツダウンロード
URL: https://developers.worksmobile.com/jp/document/1005026?lang=ja
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/b9e95f9f-2b9f-b58d-651b-16a01df9aa87.png)

OCR 処理のアクションを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/0f3dfe9a-d20c-ea45-2800-0101b46535f2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/029dd8c7-544f-d04d-1eb6-072a95725cba.png)

最後に解析結果をユーザーにメッセージ送信するため Azure Automation のジョブを追加します。
詳細はこちらも参照してください。

TITLE: LINE WORKS + Azure Automation + Microsoft Flow で LINE WORKS Bot からトークメッセージ送信
URL: https://qiita.com/iwaohig/items/3056b95597772061d17b

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/4f0cb55a-760c-84a0-df02-a274a54af904.png)

## 動作確認
LINE WORKS で Bot に画像を送信します。しばらく待つと文字起こしされたテキストが Bot から返信されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/8d57dcf4-30eb-45d2-0426-7d3c9851ae58.png)
Opening and ending tag mismatch: env line〜とかいうエラー

## 環境
Mac OS
Laravel Framework 5.6.26
 
## 状況
PHPunitでユニットテストしようとしたら、xmlファイルミスってるんだよなぁって言われました。
エラー内容

```
Opening and ending tag mismatch: env line 32 and php

expected '>'

Premature end of data in tag phpunit line 2
```

xmlファイル、閉じ忘れとかないはずなんだが、、、って思って5分間ぐらい戦ってたら、見つけました。
スラッシュ忘れてました。

エラーのでるxml

```xml:phpunit.xml
<env name="DB_DATABASE" value="database/database_test.sqlite">
```

成功したxml

```xml:phpunit.xml
<env name="DB_DATABASE" value="database/database_test.sqlite" />
```



##感想
隅から隅までにらめっこしましょう。
CircleCIのWorkflowsでfiltersが効かないと思ったら微妙な?重要な?インデントの問題だった

はじめに
======

先日CircleCIにようやく入門して、いろいろ設定を書いていたのですが、どうにも `filters` で branch指定がうまくいかない。なんでかなぁ、と思っていたらYAMLの書き方が悪かった(CircleCIのValidationエラーにもならない)という話でした。
なかなか不毛で気が付きにくい感じがあるので、ちょっと書き残しておきます。

本題
=======
以下の２つの `filters` の位置をよく見てもらえれば全てです。

```yaml
workflows:
  version: 2
  my-awesome-task:
    jobs:
      - hello-wrong:
        filters:
          branches:
            only: master

      - hello-correct:
          filters:
            branches:
              only: development
```

上記をYAMLパーサーがどういう解釈をするかというと、以下のようなJSONになります。

```json
{
	"workflows": {
		"version": 2,
		"my-awesome-task": {
			"jobs": [
				{
					"hello-wrong": null,
					"filters": {
						"branches": {
							"only": "master"
						}
					}
				},
				{
					"hello-correct": {
						"filters": {
							"branches": {
								"only": "development"
							}
						}
					}
				}
			]
		}
	}
}
```

１つめの `filters` は `hello-wrong` の子要素にならないんですね。
`hello-wrong`の兄弟の要素になって、`hello-wrong` Keyの Valueは `null`になってます。
確かに、こういう意味を表したいときはあって、それならこう書くことになるのは自然で、言われてみれば納得なんですが、「私はそんなつもりで書いたんじゃない（涙）」という気分でした。

さいごに
=======
CircleCIは間違ったKeyを指定するとValidatorが教えてくれることが多かったので、書式はあっているものと思い込んでいました(書いている内容が悪いと思っていた)。

JSONは設定を書くには野暮ったいですが、こういう間違いは起こりにくいですね。
Ruby の lambda に proc オブジェクトを渡した場合、lambda オブジェクトは返ってこない

[ブログ記事](http://secret-garden.hatenablog.com/entry/2019/07/12/190314)からの転載です。

[某所](https://bugs.ruby-lang.org/issues/15973)で話題になっているやつです。
Ruby では `Kernel.#lambda` で `proc` オブジェクトを生成した場合 `lambda` として生成されます。

```ruby
# Kernel.#proc だと lambda でないオブジェクトを生成する
proc_obj = lambda { |a, b| "#{a}:#{b}" }
pp proc_obj.lambda?
# => false

# 引数は厳密にチェックしないので OK
proc_obj.call 1

# Kernel.#lambda だと lambda なオブジェクトを生成する
lambda_obj = lambda { |a, b| "#{a}:#{b}" }
pp lambda_obj.lambda?
# => true

# 引数を厳密にチェックするのでエラーになる
# in `block in <main>': wrong number of arguments (given 1, expected 2) (ArgumentError)
lambda_obj.call 1
```


### `Kernel.#lambda` に `proc` なオブジェクトを渡した場合

次のように `Kernel.#lambda` に `proc` なオブジェクトを渡した場合、`lambda` なオブジェクトではなくて `proc` なオブジェクトのままになります。

```ruby
proc_obj = proc { |a, b| "#{a}:#{b}" }
lambda_obj = lambda &proc_obj
pp lambda_obj.lambda?          # => false
pp lambda_obj.call 42          # => "42:"
```

意図としては `lambda` なオブジェクトになってほしいところではあるんですが、うーん。
`lambda` と `proc` は `next` や `return` の挙動も異なるので単純に `lambda` 化する、っていう対応をしても難しい気がする。
しかし、少なくとも現状の挙動はコードの意図する動作ではないので何かしらの対応が入ってほしい気持ち。
個人的には変換されないなら例外を吐いてほしいなー。
Pagesで画像にリンクを設定する

# 目的
- macOSのPages文書で、画像にリンクを張りたい。

# 問題点
- Pagesでは、リンクを設定できるのはテキストだけで、画像にはリンクを設定できない。

# 解決法
- 画像オブジェクトに、テキストボックスを重ねて、テキストボックスにリンクを張る。

# 手順
1. Pages文書上に画像オブジェクトを配置する。インラインにはしない。
2. 画像オブジェクトの縦横の大きさをメモる。
3. テキストボックスを作成し、画像オブジェクトと同じ大きさに設定する。
4. テキストボックス内に、適当なテキストを配置する。ボックスがいっぱいになるようにフォントサイズなどを工夫する。
5. テキストにリンクを設定する。
6. テキストボックスと画像オブジェクトをぴったり重ねる。
7. テキストボックス内のテキストを透明にする。テキストの色を選び、不透明度を０％にすれば透明になる。
8. テキストボックスと画像オブジェクトをグループ化する。
9. 必要に応じてインラインなどに設定し、文書中の任意の場所に配置する。

## 補足
- グループ化してインラインになっていても、クリックすればリンクを編集できます。

- おしまい
ザックリまとめ　Sparse Networks from Scratch論文

##Sparse Networks from Scratch論文まとめ
- 2019年７月にsubmitされた論文で、再学習を必要としないSparseなネットワークの構築手法を提案・考察しています。
- [arXivはこちら](https://arxiv.org/abs/1907.04840)
- Sparseは「疎」を意味し、Denseと対になる概念です。

##この記事で説明すること
- この論文で提案されている**Sparse Learning**という学習手法
- 実験結果の概要

##この記事で説明しないこと
- Momentumについての説明
- 実験で用いられたモデル構造の詳細

ザックリとまとめていきます。サクッと見ていきましょう。

## Sparse Learningとは
この方法の一番の特徴は、論文名にもあるように**「Scratchから疎なネットワークを学習する」**という点にあります。
従来の疎なネットワークの学習手法としては、まずはじめに密なネットワークを学習・構築してから、重要な部分だけを残すという手法がほとんどでした。
つまり、従来の手法では**密なモデルの学習が必須**であり、学習にかかる時間がネックでした。


では、以下で具体的にはどのようにして学習を行うかを見ていきたいと思います。

Sparse Learningは大きく分けて以下の三つの手順に分解されます。
1. モデル全体に対する各レイヤの貢献度を計算する
2. 貢献度の低いweightsを取り除く(Prune)
3. 2で取り除いた分を再分配する(Redistribution)
これらの計算・操作は**各Epochの最後**に行われます。

![スクリーンショット 2019-07-17 8.53.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391968/bd326604-58fd-981e-f20a-e4684627f63e.png)
上図は本論文内で示されている図を引用しました。

では各手順についてもう少し詳しく見ていきます。
###1.モデル全体に対する各レイヤの貢献度を計算する
まずこの「貢献度」とは何か、という部分ですが、これは**「Error(損失)をWeigths(重み)で偏微分したもの」**ということになります。

この偏微分は**「その重みの変化によって生じる損失の変化」**なので、これの絶対値が大きいほどその重みの貢献度は大きい、という事ができます。(例　貢献度１００の重みは、重みの１の変化で損失を100変化させる影響力があるが、貢献度１の重みは、重みの１の変化で損失を１しか変化させる事ができません。)

しかし、この偏微分をそのまま貢献度に使うことは危うい手法です。
なぜなら確率的勾配降下法(SGD)では各ミニバッチにおいて偏微分の値が大小・正負で振動してしまうからです。

そこで、ある時点の偏微分をそのまま使うのではなく、時間方向で平均をとったものを利用します。
更に、近い過去の結果を遠い過去の結果よりも優先するために、下記の式で重み付けを行います。
![スクリーンショット 2019-07-17 9.04.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391968/e0ba51e1-298b-fb7b-aad7-d532734c0daf.png)

上式がまさに**Momentum**であり、論文内では**Sparse Momentum**と呼ばれています。
また、αはsmoothing factorと呼ばれ、過去の影響の大きさを決定する値(ハイパーパラメータ)になっています。

Sparse Learningの最初のステップは上記のSparse Momentumを各レイヤごとに求める、ということになります。

###2. 貢献度の低いweightsを取り除く(Prune)

次のステップでは、貢献度の低い重みを各レイヤから取り除いていきます。

１で計算した各レイヤの貢献度を利用して、そのレイヤから幾つの重みを取り除くかを決定します。
更にそのレイヤの中で絶対値が小さい重みから取り除いていきます。(モデル全体における各レイヤの貢献度→各レイヤ内での重みの絶対値の順で見ます)

この時にモデル全体から幾つの重みを取り除くかを決める割合を**pruning rate**と呼び、論文内の図では50%を例にしています。このpruning rateは学習率のように次第に減少させていくことが良い結果をもたらすと述べられています。


###3. 2で取り除いた分を再分配する(Redistribution)

最後に、２で取り除いた重みの中から、大事な重みを復活(Regrowth)させます。
具体的には、２と同じようにして復活させる重みの数を計算し、２で取り除かれた重みの中から絶対値の大きいもの順で復活させます。

####Sparse Learning操作方法まとめ
ここで一度まとめておきます。
1. 各レイヤのモデル全体に対する貢献度(Sparse Momentum)を計算する
2. 貢献度に基づいて各レイヤから取り除く重みの数を決定し、絶対値の小さい重みから順に取り除く
3. 貢献度に基づいて各レイヤで復活させる重みの数を決定し、絶対値の大きい重みから順に復活させる

２、３の手法は同じような計算をしている事がわかると思います。


##実験結果概要
この論文内ではMNIST,CIFAR-10,ImageNetでの精度、CIFAR-10での実行速度についての結果が示されています。

MNISTではベースモデル・他のSparse Networkよりも精度が高い事が示されており、CIFAR-１０でもほぼ同様な結果になっています。

しかし、ImageNetでは他のSparse Networkよりも同じWeights数で高い精度を出しましたが、ベースモデルの精度には到達しませんでした。(pruning rateを下げれば対応可能？)

CIFAR-10でのSpeedに関しては、従来のモデルよりも数倍早くなった事が示されています。


###補足・所感
- MNIST,CIFAR-10に関して、Sparse Learnigはモデルの表現力が下がる方法だと思っていたので、ベースモデルよりも高い精度が出るのは不思議でした。しかし、一つ一つの重みがタスクに対してより適切な表現を獲得した、と考えると単純に表現力を下げる操作ではないなと思い腑に落ちました。(自己解決)
- 上記に関連してですが、Sparse LearningはDropoutと近い方法な気がします。(Weightsの総数、つまりモデルの潜在的な表現力は下がっても、それぞれの重みが"優秀"になり、実際の表現力は高くなる)
- 本記事ではRegrowthを個人的なイメージから「復活」と表現しましたが、「再生」とかの方が本来の英語の意味には近いと思います。

最後までお読みいただきありがとうございました！
ご質問等あればお気軽にコメントください！
Armv8-MのTrustZoneを試してみました (第一回)

# はじめに
IoT機器が増える中、IoT機器への不正操作が問題となっています。
IoT機器へのセキュリティ対策の１つとして有効な最新ArmアーキテクチャArmv8-Mのセキュリティ機能「TrustZone」を実際に使ったデモを作成したときの記録を備忘録を兼ねてまとめてみました。
デモでは外部との通信を行う部分（下図の非セキュア空間）がバッファオーバフローなどで不正プログラムが実行されても、カメラなどのデバイスを制御する部分（下図のセキュア空間）は守られるという使い方を想定しています。
![デモ想定図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384597/5888230a-a81c-3162-2fef-1199b1d6372f.jpeg)
Armv8-MのTrustZoneを実際に使ってみたい方のお役に立てればと思い公開しました。
Armv8-MやTrustZoneなどの説明は割愛します。

記事は数回に分けて連載する予定です。第一回は、動作環境とデモ構成について記述します。

# 動作環境

Armv8-MアーキテクチャのMCUとして、Cortex-M23をコアするNuvotonのM2351を使用しました。
以下の環境でデモを構築し動作させました。

| 項目 | 使用した環境 |
|:-:|:-:|
| MCU | Nuvoton M2351 (Cortex-M23)
| 評価ボード | Nuvoton NuMicro M2351 v1.3
| RTOS | 富士通コンピュータテクノロジーズ μT－Kernel
| IDE | IAR EWARM 8.40.1
| ホストマシン | Microsoft Windows8.1


# デモ構成

M2351内をセキュア空間と非セキュア空間に分け、セキュア空間にセキュア用カーネルを、非セキュア空間に非セキュア用カーネルをそれぞれ配置します。

以下の図がデモ構成のイメージです。
![デモ構成図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384597/fd0fe356-161a-d32f-3f3e-5de5a4b77507.jpeg)
M2351では各デバイス毎に、セキュアモードで使用するのか、非セキュアモードで使用するのかを設定できます。
デモではセキュア空間に配置するカメラなどに相当するデバイスとしてLEDを使用し、非セキュア空間に配置する外部との通信デバイスとしてUSBを使用します。
LEDを制御するタスクとしてセキュア用カーネル内にLED制御タスクを設け、LED制御タスクは1秒毎にLEDの点滅を繰り返します。
USBを制御して通信を行うタスクとして非セキュア用カーネル内にUSB通信/制御タスクを設け、USB通信/制御タスクはパソコンからのコマンド受信およびその結果の送信を行います。

### デモ構成のメモリマップ
セキュア用カーネルが内蔵FlashからXIPで起動し、SRAM上に非セキュア空間を割当て、その非セキュア空間に非セキュア用カーネルを内蔵Flashからロードする仕組みにしています。
M2351には512Kbytesの内蔵Flash, 96KbytesのSRAMが搭載されており、デモでは以下のようなメモリマップで構成します。

| アドレス | 用途 |
|:---------|:-----------------:|
| 0x00000000-0x0000ffff | セキュアカーネルROM実行空間 |
| 0x00010000-0x0001ffff | 非セキュアカーネルのロードモジュール置場 |
| 0x20000000-0x20007fff | セキュアカーネルRAM空間 |
| 0x30008000-0x3000ffff | 非セキュアカーネルROM実行空間 |
| 0x30010000-0x300177ff | 非セキュアカーネルRAM空間 |
| 0x30017800-0x30017fff | 共有メモリ空間 |

[次回(第二回)](https://qiita.com/v1471/items/0ac021b1d982ba9b0b88)はセキュアカーネルの作成について記述します。

『各種製品名は、各社の製品名称、商標または登録商標です。本記事に記載されているシステム名、製品名には、必ずしも商標表示（(R)、TM）を付記していません。』
Webエンジニアとして転職してフルリモートワークを始めた簡単な感想 (箇条書き) #リモートワーク

Simple impression (bullet) # that started a full remote work by changing job as a Web engineer # remote work


-  リモートワーク2ヶ月目。
- 最初は「リモートでも自律できるかどうか」というのがものすごく不安だったので、アルバイトで開発に参加させてもらっていたが、どうやら行けそうな気がしたので、社員として働いている。
- チーム開発では全員がリモート、もしくはほぼリモートの環境。
- Slackでのやりとり。濃い会話、相談が必要な場合はZoomなどで音声チャットもする。全員特に顔は出さず、音声だけのことが多い。
- 基本はリモートだが、1回、キックオフとして開発合宿でのチームビルディング、顔合わせもあった。 
- リモートワークだと対面での濃い情報交換ができなくなるのでは？というのがもう一つ、大きな心配だった。僕の前職はリアル現場での仕事だったが、割と連絡は全てSlack経由だったりしたし、席が近くてもSlackで話していたりしたし、案外、リアル現場で働くのと、フルリモートでも、違いは少ないのでは？と思ったりした。
- 今、リモートでも自律を持って働けていると思う。時間の単位がどうこうというよりは、成果を出すことにコミットすれば良い。いやコミットするというよりは、コミットしなければそもそも成り立たない。PullRequestを出さなければ何もしていないのと同じだし、逆にコードをちゃんと書く、開発に加わる、プロダクトの改善に寄与するなど、当たり前のことをこなしていけば良い。
- リモートでの勤怠はどうするんだろう？と思っていたけど、完全に自己申告で、信頼の世界。カメラをつけたりはしない。そもそも構造として、リアル現場でも、物理的にその場所に居ながらにして、サボろうと思えばいくらでもサボれるわけだし、リアルワークでもリモートワークでも、根本的な部分に信頼関係があるし、なければ成り立たないというのは同じだと思った。特にエンジニアという仕事は。


# 関連

[リモートワークについて - Qiita](https://qiita.com/YuichiroMinato/items/a67d0fa8323649ddd9d0)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2265








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
xcodebuildでerror: unable to attach DB: error: accessing build database への対処法

`
error: unable to attach DB: error: accessing build database "/Users/username/Library/Developer/Xcode/DerivedData/app-xxxxxxx/Build/Intermediates.noindex/XCBuildData/build.db": database is locked Possibly there are two concurrent builds running in the same filesystem location.
`

## 原因
Xcode10以前に作られたプロジェクトでは新しいビルドシステムに適合しないらしいので、`Legacy Build System`を採用する必要がある。以下のどちらかで解消できる

## 対処法1: Xcodeから
- Xcodeをひらく
- File -> Project SettingsまたはWorkspace Settings
- Build Systemを`Legacy Build System`に変更する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24308/95ecde4f-0440-09ea-f79e-8b6ebb20ce7b.png)


## 対処法2: コマンドから

オプションに以下を追加する

```
-UseModernBuildSystem=NO
```

https://qiita.com/matsuyoro/items/16fa4552f20ea8b1e3a5
MacにVirtualBoxでUbuntuを立ててAnacondaをインストールするメモ

# はじめに
Windows Subsystem for Linux (WSL)のUbuntuにて動作することが確認されているJupyter NotebookからPythonスクリプトを起こしてリファクタリングする必要があったが、筆者の作業端末はMacのためVirtualBoxを用いてUbuntu環境を構築した。その際のメモを残す。

# 環境
- MacOS Mojave 10.14.5 (18F132)
- VirtualBox 6.0.8 r130520 (Qt5.6.3)
- Ubuntu 19.04
- Anaconda3 19.03

# 手順
## VirtualBoxのインストール
[このQiita記事](https://qiita.com/komakomako/items/1f1fa0e2279895006598)に沿って、インストーラーを[開発元のOracleのページ](https://www.oracle.com/technetwork/server-storage/virtualbox/downloads/)からダウンロードしてきて実行したが、いきなりインストールに失敗した。あれこれ検索した挙句、[このページ](https://forums.developer.apple.com/thread/116604)の手順（下記）に沿って作業し、インストールに成功した（ちなみに[homebrewでVirtualBoxをインストールすることもできる](https://qiita.com/kinako3/items/b4433918931fd790a8b8)らしい）。その手順に書かれているが、MojaveのアップデートによってOracleの開発者IDが認証されていない状態になったため、VirtualBoxのインストールに失敗していたらしい。

> 1. Restart your mac in Recovery mode (cmd + R)
> 2. Then open a Terminal and enter : spctl kext-consent add VB5E2TV963
> 3. Restart your mac

この後は、前述のQiita記事に沿ってインストールした。

## Ubuntuのインストール
[このQiita記事](https://qiita.com/komakomako/items/1f1fa0e2279895006598)に沿って、インストールした。Ubuntuは19.04のイメージをダウンロードした。

## 使いやすくする設定
このままではOS間のファイル共有やUbuntuの画面のリサイズができない。

### ゲスト・ホスト間のファイル共有
（後日追加）

### 画面のリサイズ
[この記事](https://pc-karuma.net/mac-virtualbox-fullscreen-mode/)に沿って、VirtualBoxにGuest Addtionsをインストールした。記事の環境はWindowsだが、筆者のMac環境でも同じ手順でインストールに成功した。

## Anacondaのインストール
元のWindows環境のJupyter Notebookにて環境構築用に引用されていた[このQiita記事](https://qiita.com/Hidekazu-Karino/items/8718c2210c0b3e447017#python)の以下の部分を参考にUbuntuにpyenvとAnacondaをインストールした。WSLとVirtualBoxでは当然同じ動作は保証されていないが、今のところ問題はない。

- [pyenvのインストールとbashrcの設定](https://qiita.com/Hidekazu-Karino/items/8718c2210c0b3e447017#pyenv%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8bashrc%E3%81%AE%E8%A8%AD%E5%AE%9A)
- [Anacondaのインストール](https://qiita.com/Hidekazu-Karino/items/8718c2210c0b3e447017#anaconda%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

なお、仮想環境の構築は```conda env create```を使用した。

# まとめ
VirtualBoxのインストールに時間を取られたが、その後はスムーズだった。MacOSの次のバージョンかアップデートではOracleの開発者IDが認証されていない問題が解決されることを期待したい。
【Ruby / Rails】validationで成功・失敗の時の画面遷移を条件分岐で書く

おはようございます！
validationを使う時に少しハマったので備忘録です。

## validation
valiationとはmodelの検証を定義する（rails公式ドキュメントより）
今回使うのはpresenceで空の値ではない事を検証します。

```ruby:基本型
validates :カラム名, presence: 検証パラメーター
```

##まずはvalidatesを設定

```ruby:models/post.rb
class Post < ApplicationRecord
 belongs_to :user
 validates :content, :title, presence: true
 //content,titleもしくは両方の値が空の場合はデータベースには保存されない
end
```

##ハマったポイント
modelにvalidatesを設定したので確かにベータベースに空の値は保存されていないんだけど、ビューは成功時も失敗時も同じ遷移をしていて「なぜ？」と初学者丸出しのミスをしました。
##ビューを成功時と失敗時に分ける処理
modelは問題なく処理ができているのでビューの処理を分けたいのでcontrollerを設定する必要がる

```ruby:posts_controller.rb
class PostsController < ApplicationController
　~省略〜
 def new
 end

 def create
  //今回のvalidationは新規投稿する時に検証したいのでcreateアクション内
　 @post = Post.create(content: post_params[:content], title: post_params[:title], user_id: current_user.id)
  //createアクションが動いて入力された値は@postにセットされる
  if @post.save
   redirect_to :root
  //validationで成功した場合はrootパスへリダイレクトする
  else
   render 'new'
  //失敗した時はそのまま投稿画面がrenderで回される
  end
  
  def post_params
    params.require(:post).permit(:content, :title)
  end
 end
```
このif文の処理で画面遷移の行き先を分岐できた。しかしこのままだと失敗した時にエラーの通知が画面に表示されずに不便なので新規投稿が失敗した事を通知させる。
##エラー通知
```ruby:new.html.erb
<div "contents row">
  <% if @post.errors.any? %>
    <p>タイトルか本文が未入力です</p>
  //.errors.any?によってvalidationが失敗した時にエラー文を画面に表示
  <% end %>
~省略~
</div>
```

##まとめ
<dl>
<dt>model</dt>
<dd>何をvalidationするか設定する<dd>
<dt>controller</dt>
<dd>処理の成功・失敗を動かしたいアクション内で条件分岐させる</dd>
<dt>view</dt>
<dd>.error.any?を使って失敗した時のエラー文を表示させる</dd>
**以上でvalidationが設定できました！**

---
####筆者について
TEXH::EXPERT渋谷校の夜間クラスで4月からRuby・Railsの学習をしています。
記載内容に不備・不足があればご指摘いただけると幸いです。
至らぬ点ばかりですので、改善点がありましたらどんどんご指摘下さい！
【Linux】コピペ1分でMacの自作コマンドを作る

# コマンド用のディレクトリを作成
```terminal:ターミナル
$ cd ~/
$ mkdir bin
```

# コマンドになる実行ファイルを作成
```terminal:ターミナル
$ cd bin
$ vi jisaku
```

念のため権限もふっておきましょう。

```terminal:ターミナル
sudo chmod 755 jisaku
```

中の記述は以下の内容にして保存。

```shell:jisaku
#!/bin/sh
echo '自作コマンドだよ！'
```

# パスを通す

```terminal:ターミナル
vi ~/.bash_profile
```
これで開いて、以下を追記して保存。

```shell:.bash_profile
PATH="$PATH:~/bin"
```

.bash_profileの内容を即座に反映させるために以下を実行。

```terminal:ターミナル
source ~/.bash_profile
```

# 実行してみる
![2019-07-17 09.13.31.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431639/9a9400d1-7b37-6e95-f47c-16ce5797e60c.gif)

# 完成
実行できれば完成です。
ターミナルから実行できるものであれば、実行ファイルを同じように作成すればできますので効率化に利用されては？
最初は取っつきにくかったですが、初心者のうちからこういう事を理解してできた方が、考える力もつくので良いかもです。

# 後日追記
まあ普通にエイリアス貼った方がいいと思う。
HTML の a タグで POST する

小ネタ。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">具体例を挙げると、削除処理やログアウト処理は副作用があるのでPOSTにすべきですが、GETになっているケースをよく見かけます。PHPの教科書とか、特にね <a href="https://t.co/6B7wOXJhNp">https://t.co/6B7wOXJhNp</a></p>&mdash; 徳丸 浩 (@ockeghem) <a href="https://twitter.com/ockeghem/status/1151261400905334784?ref_src=twsrc%5Etfw">July 16, 2019</a></blockquote>

このツイートを見て、「その通りなんだけど、(ログアウトのリンクを作るときなどに) a 要素だけで POST が送れないから面倒くさいんだよなぁ」と思うなどした。

素朴な解決策としては「[a を form で囲んで onclick で submit する](https://qiita.com/horikeso/items/cceb42be04e2b6d1d5a6)」だけど、これだと DOM 構造が変化してしまうので CSS などもまとめて修正する必要が生じたりして面倒くさい。

で、思いついた方法がこれ。

``` javascript
function sendPost(event) {
  event.preventDefault();
  var form = document.createElement('form');
  form.action = event.target.href;
  form.method = 'post';
  document.body.appendChild(form);
  form.submit();
}
```

``` html
<a href="/logout" onclick="sendPost(event)">Logout</a>
```

JavaScript の関数をどこかで定義しておけば、あとは POST で送りたい a 要素に onclick 属性を追加するだけで POST で送信できるようになる。

これなら DOM 構造も変化しないので手軽。

CSRF トークンを送りたいとか FormData を送りたいとかというニーズもあると思うが、ちょっと改造するだけでできるはずなので各位よしなにやっていってほしい。
SwiftでRealmを動かしてみる

#はじめに

公式らしきページを参考にしました。
https://realm.io/docs/swift/latest

プロジェクトにRealmを導入する方法として3種類提示されています。
「Dynamic framework」「CocoaPods」「Carthage」の三種類です。

よく説明などに出てきがちなCocoaPodsを今回も使おうと思って試しましたが、いざプロジェクトを作ってRealmをimportしようとすると「No such module」のエラーが出て前に進めなくなったので今回は「Dynamic framework」に記載されている内容で進めて見ました。
私のやり方が悪いのか毎回CocoaPodsは何かしら問題が発生してしまった気持ちが落ち込みます。


#前提
先に適当にプロジェクトを作っている状態からの手順となります。

#プロジェクトの準備

まずはRealmのホームページから最新版をダウンロードして解凍します。

「ios」「watchos」「tvos」などのフォルダが並んでいます。
今回はiOS向けとして作るので「iOS」フォルダを開きます。

するとバージョンごとのswiftフォルダがあります。
このバージョンはswiftのバージョンではなくxcodeのバージョンのようです。
xcodeでバージョンを確認し、当てはまるバージョンのswiftフォルダを開きます。

「Realm.framework」「RealmSwift.framework」の２つのファイルがあります。

![スクリーンショット 2019-07-13 17.36.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/1b0d61ff-6e9a-51bc-0c70-25b29608bc65.png)


上記の２つのファイルをプロジェクトの設定のGeneralの中にあるEmbedded Binariesの赤枠部分にドラッグします。


![スクリーンショット 2019-07-13 17.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/2df3b8db-2957-3993-1164-9f9a180792da.png)

すると下のような画面が開くのでそのままFinishをクリックします。

![スクリーンショット 2019-07-13 17.43.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/013347a6-e056-54dc-87f0-e37de1677ef7.png)


#データを追加して読み込んで見る

上記の手順ですでにRealmが使える状態になっています。

よくあるRDBMSしか使ったことがないと考え方が理解し辛いですが、まずテーブル定義の代わりとなるクラスをswiftで作成します。

名前と年齢を持ってるメンバークラスの例です。

```Member.swift
import RealmSwift
import Foundation
class Member : Object {
    @objc dynamic var name = ""
    @objc dynamic var age = 0
}

```

次にViewController.swiftにデータの追加と読み込み処理を書いてみます。

```ViewController.swift
import UIKit
import RealmSwift
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        //Memberクラスに名前と年齢を突っ込む
        let MyMembers = Member()
        MyMembers.name = "Taro"
        MyMembers.age = 30
        
        //追加処理をしてみる
        let realm = try! Realm()
        try! realm.write {
            realm.add(MyMembers)
        }
        
        //今回は1データしか追加してませんが一応Memberの全データを読み出してみる
        let Members = realm.objects(Member.self)
        for member in Members {
            print("name:" + member.name)
            print("age:" + String(member.age))
        }
    }
}
```

太郎と次郎と突っ込んだりして遊んでたらいっぱい出てきました。
![スクリーンショット 2019-07-13 18.05.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/c6b88ca3-e686-4ed1-eacc-d551277bd0bc.png)

#最後に
SQLiteやRealmなど使い勝手のよいデータベースが存在することは知っていましたが難しそうだと思ってデータベースには手を出さず、今までのアプリは配列をそのまま保存して凌いでいました。しかし、とうとうデータベースがないと作れないアプリを作りたくなってしまったので挑戦してみました。自分で何度でも再現できるようにここに手順を書き残して置きたいと思います。

他にも主キーの設定やインデックスを作るなどいろんなことができるようですが、シンプルにデータを管理するためだけであれば本当に簡単に使えそうでこれからのアプリ開発が楽になりそうです。