OmniAICreator/Qiita-1.07M huggingface dataset:
🍺RSpecでOmniAuthのFacebookログイン/サインアップのFeatureテストを書く

### はじめに
テストを書くのが嫌い/苦手な人はたくさんいると思う。
ものづくりが好きな人にとってテストはなにも生み出されている気がしなくて退屈だ。
そして、テストでエラーが出てもテストのどこが間違えているのかよくわからない。
なぜ、このテストが通らんのやァって発狂しそうになる。
全部、自分のことだ。

最近は[RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)という本を参考に自分のRailsアプリにRSpecを書きながら苦手克服を目指している。
この本はとてもわかりやすくまとめられていると思う。
Facebookログイン部分のテストは[RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)にもあまり詳しく書いていなかったのでここでまとめてみる。

### モックを作成する
helperとしてメソッドを定義する。

```ruby:/spec/support/omniauth_macros.rb
module OmniauthMacros
  def facebook_mock
    OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new(
      {
        provider: 'facebook',
        uid: '12345',
        info: {
          name: 'mockuser',
          email: 'sample@test.com'
        },
        credentials: {
          token: 'hogefuga'
        }
      }
    )
  end
end
```


### 設定する
`OmniAuth.config.test_mode = true`はOmniAuthが呼ばれたら実際の通信を行わずにテストモードに入ることを意味する。
`config.include OmniauthMacros`は先ほどのhelperをrequireする。

```ruby:spec/rails_helper.rb
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
ActiveRecord::Migration.maintain_test_schema!
RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!

  # -----------以下を追加-----------
  OmniAuth.config.test_mode = true
  config.include OmniauthMacros

end
```

### Facebookログイン/サインアップを制御するコントローラー
 
```ruby:app/controllers/sessions_controller.rb
class SessionsController < ApplicationController

  def callback
    auth = request.env["omniauth.auth"]
    user = User.find_by(provider: auth["provider"], uid: auth["uid"]) || User.create_with_facebook(auth)
    session[:user_id] = user.id
    redirect_back_or root_path
  end

end
```
別にOmniAuthでデータをとってくるコードならなんでも良い。

### Specを書く

```ruby:spec/features/users_spec.rb
require "rails_helper"

describe "UserFeature" do

  describe "facebook連携でサインアップする" do

    before do
      OmniAuth.config.mock_auth[:facebook] = nil
      Rails.application.env_config['omniauth.auth'] = facebook_mock
      visit root_path
      click_link "ログイン"
    end

    it "サインアップするとユーザーが増える" do
      expect{
        click_link "Facebookでログイン"
      }.to change(User, :count).by(1)
    end

    it "すでに連携されたユーザーがサインアップしようとするとユーザーは増えない" do
      click_link "Facebookでログイン"
      click_link "ログアウト"
      click_link "ログイン"
      expect{
        click_link "Facebookでログイン"
      }.not_to change(User, :count)
    end

  end
end
```
before節

 - `env['omniauth.auth']`に先ほどのモックをセットし、ログイン画面へのリンクをクリックする。

it節

 - 実際にログインを行うボタンをクリックするとユーザーが新しく作成されることをテストする。
 - すでに、Facebookで連携したユーザーがログインしようとするとユーザーは増えないことをテストする。
VLC で RTP over UDP をストリーミング配信

VLC で RTP over UDP を配信したかったが、結構手こずったため手順をメモしておく

## 環境
* MAC OS High Sierra
* VLC version 3.0.2

## 手順

前提：ストリーミングするのは音声のみ(mp3)

1. [ファイル] => [詳細設定でファイルを開く] を選択
2. [ファイル] タブでストリーミングしたい mp3 ファイルを開く
3. ウィンドウ画面下部の [ストリーム出力] にチェックを入れる
4. [ストリーム出力] の右側にある [設定] をクリック
5. [ストリーム] にチェックを入れ、画像のような設定にする。
<img width="567" alt="スクリーンショット 2018-04-25 13.38.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/202181/89db01ee-4dd2-a021-14ea-a2005bc400e1.png">

画像の例ではローカルホストの 50000 番ポートに出力する
6. [OK] をクリック
7. [開く] をクリック

これで完了
borderで囲むボタン

#目的
複数のボーダーで囲ったデザインのボタンを作成したい。
<img width="626" alt="スクリーンショット 2018-04-25 13.34.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/20635/aae8ad78-d265-c9f7-a3a6-1e487434bb54.png">


```slim:slim
.box.parent
  .box.children
   .box.grandson
```

```scss:scss
.box {
  border-radius: 100px;
  &.parent {
    width: 600px;
    height: 150px;
    border: 4px solid green;
  }
  &.children {
    width: 580px;
    height: 130px;
    border: 4px solid blue;
    margin: 6px;
  }
  &.grandson {
    width: 560px;
    height: 110px;
    border: 4px solid red;
    margin: 6px;
  }
}

```
nyagos で lua53.dll のかわりに GopherLua を使おう

[Using GopherLua instead of lua53.dll · Issue #300 · zetamatta/nyagos](https://github.com/zetamatta/nyagos/issues/300)

lua53.dll にはいくつか問題があります。

- MinGW gcc 6 でビルドされた lua53.dll は `LIBGCC_S_DW2-1.DLL` を必要とします。
   - [luaBinaries](http://luabinaries.sourceforge.net/index.html) でダウンロードできる lua53.dll は MinGW gcc 4 や Visual C++ でビルドされているようです。
   - GCC のstatic-linkオプションは、EXEファイルのビルドにおいて働くもので、DLL のビルドには効きません。
- appveyor での自動ビルド時、luaBinaries から lua53.dll をダウンロードしていますが、度々失敗しています。

また、nyagos で lua53.dll を用いたサードパーティライブラリも滅多に必要とされないようです。

ならば、lua53.dll のかわりに [GopherLua](https://github.com/yuin/gopher-lua) を使うべきではないでしょうか。
計画は始まっています。

---

ということで [NYAGOS](https://github.com/zetamatta/nyagos) は今、Lua エンジンを lua53.dll から GopherLua へ切り替え中です。（完成したら NYAGOS 4.3 になるでしょう）

仕掛中のソースは develop ブランチの https://github.com/zetamatta/nyagos/tree/develop/gopherSh 以下にぶら下がっています。エンジン自体は既に GopherLua に変わっていますが、幾つかの機能（補完のフックと、OLE呼び出し）の移植が済んでいません。進捗的には 2018年5月の連休までにα版がリリースできたらいいなというところです。

ご期待ください
（また、別途、lua53.dll と GopherLua の使い勝手の違いもリポートします）
下線を波状にする

#目的
指定した文字の下線を波状にしたい。

![Precondition Failed]()


```slim:slim
p
  | ほげほげほげ
  span wave
  | ほげほげほげ
```

```scss:scss
p {
  span {
    background-image: url("nami.png");
    background-position: bottom;
    background-repeat: repeat-x;
    background-size: 20px;
    margin: 0 20px;
    font-size: 30px;
  }
}
```
text_field_tagの書き方

text_field_tagを書くときに、ちょっとつまずいた部分をメモします。
※以下slimで書いています。

# valueにidやclassの値が入ってしまう場合

## 起こったこと
```slim:sample.html.slim
= text_field_tag 'datetime_interview[start_time]', class: 'time start', placeholder: "開始時間"
```
と書くと、
<img width="619" alt="text_field_tagスクリーンショット.png" src="https://qiita-image-store.s3.amazonaws.com/0/248775/2a71af9c-f9d4-b65e-8e88-92e5f236b046.png">
とinputのvalueにソースコードが入ってしまいます。

## 原因
ここで[Railsのリファレンス](http://railsdoc.com/references/text_field)を確認すると、
>　text_field_tag(要素名 [, 値, オプション])

text_field_tagは２つ目の引数は、値（value）となるので、*class: 'time start', placeholder: "開始時間"*がvalueに入ってしまいます。
※なぜ*placeholder: "開始時間"*までvalueに含まれるのか分かる方がいらっしゃればご教授願います。

## 対策
```slim:sample.html.slim
= text_field_tag 'datetime_interview[start_time2]', '', class: 'time start', placeholder: "開始時間"
```
２つ目の引数に、空を入れることで解決します。

# 「data-hogehoge」などの属性を追加したい場合
## 起こったこと
```slim:sample.html.slim
= text_field_tag 'datetime_interview[start_time2]', '', class: 'time start', placeholder: "開始時間", data-time-format: "H:i"
```
「data-time-format」（timepickerにおける時刻のフォーマットを定義する属性）を追加したいのですが、syntaxエラーとなります。

## 原因
キーにハイフンやスペースなどが含まれていたり、数字で始まる場合はsyntaxエラーとなるようです。（コメントありがとうございます）

## 対策
```slim:sample.html.slim
= text_field_tag 'datetime_interview[start_time2]', '', class: 'time start', placeholder: "開始時間", 'data-time-format': "H:i"
```
「data-time-format」をコーテーションで囲むとうまくいきます。




text_field_tagについて、ちょっとでもあれ？と思ったところがあれば、随時追記したいと思います。
ActiveStorageを利用してファイルをアップロードする際に「undefined method `upload' for nil:NilClass」エラーが発生する

![activestorage.png](https://qiita-image-store.s3.amazonaws.com/0/141934/bf72f1fa-5a1f-7184-23bb-1a6ade420fb3.png)

# 問題点

ActiveStorageを利用してファイルをアップロードする際に「undefined method `upload' for nil:NilClass」エラーが発生する

# 再現手順

1. アプリを**Rails 5.0**から**5.2**へバージョンアップ
2. `rails active_storage:install`と`rails db:migrate`を実行してActiveStorageをインストール
3. Mode, Controller, Viewにファイルアップロードに必要な設定を追記
4. ブラウザからファイルアップロード操作を行うと**問題点**に記載したエラーが発生

# 原因

- ActiveStorageを利用するために必要な設定が不足していた

# 解決方法

## environments/*.rb にコンフィグを追記

```ruby:config/environments/development.rb
# Store uploaded files on the local file system (see config/storage.yml for options)
config.active_storage.service = :local
```

```ruby:config/environments/test.rb
# Store uploaded files on the local file system (see config/storage.yml for options)
config.active_storage.service = :test
```

```ruby:config/environments/production.rb
# Store uploaded files on the local file system (see config/storage.yml for options)
config.active_storage.service = :local
```

## storage.ymlを追加

```yaml:config/storage.yml
test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
# amazon:
#   service: S3
#   access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
#   secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
#   region: us-east-1
#   bucket: your_own_bucket

# Remember not to checkin your GCS keyfile to a repository
# google:
#   service: GCS
#   project: your_project
#   credentials: <%= Rails.root.join("path/to/gcs.keyfile") %>
#   bucket: your_own_bucket

# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key)
# microsoft:
#   service: AzureStorage
#   storage_account_name: your_account_name
#   storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %>
#   container: your_container_name

# mirror:
#   service: Mirror
#   primary: local
#   mirrors: [ amazon, google, microsoft ]
```

# 補足

追記した設定、作成したyamlについてはRails 5.2でアプリを新規作成した時にデフォルトで作成される設定ファイルを参考にした
Lambdaにデフォルトで設定されている環境変数

よく調べるのでメモ。
以下はランタイムがPython3.6の場合。

| 変数名 | 値 |
| :-- | :-- |
| **PATH** | /var/lang/bin:/usr/local/bin:/usr/bin/:/bin |
| **LANG** | en_US.UTF-8 |
| **TZ** | :UTC |
| **LD_LIBRARY_PATH** | /var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib |
| **LAMBDA_TASK_ROOT** | /var/task |
| **LAMBDA_RUNTIME_DIR** | /var/runtime |
| **AWS_REGION** | ap-northeast-1 |
| **AWS_DEFAULT_REGION** | ap-northeast-1 |
| **AWS_LAMBDA_LOG_GROUP_NAME** | /aws/lambda/test-dev-hello |
| **AWS_LAMBDA_LOG_STREAM_NAME** | 2018/04/25/[$LATEST]f00914837a68411fb0b4706da14d9c13 |
| **AWS_LAMBDA_FUNCTION_NAME** | test-dev-hello |
| **AWS_LAMBDA_FUNCTION_MEMORY_SIZE** | 1024 |
| **AWS_LAMBDA_FUNCTION_VERSION** | $LATEST |
| **_AWS_XRAY_DAEMON_ADDRESS** | 169.254.79.2 |
| **_AWS_XRAY_DAEMON_PORT** | 2000 |
| **AWS_XRAY_DAEMON_ADDRESS** | 169.254.79.2:2000 |
| **AWS_XRAY_CONTEXT_MISSING** | LOG_ERROR |
| **_X_AMZN_TRACE_ID** | Root=1-5adffa5a-fff4d301c626fcc26d6336b5;Parent=0bba66737cd163b4;Sampled=0 |
| **AWS_EXECUTION_ENV** | AWS_Lambda_python3.6 |
| **_HANDLER** | handler.hello |
| **PYTHONPATH** | /var/runtime |
| **AWS_ACCESS_KEY_ID** | ASIxxxxxxxxxxxsxxxxx |
| **AWS_SECRET_ACCESS_KEY** | 7HTxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| **AWS_SESSION_TOKEN** | FQoDYxxxxxxxxxxxxxxxxx以下略 |
| **AWS_SECURITY_TOKEN** | FQoDYxxxxxxxxxxxxxxxxx以下略 |

[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html#lambda-environment-variables)
保育園落ちたアラフォーがプログラミングを学び、2か月でWebサービスを作った話

#自己紹介
はじめまして、aocoryといいます。
普段はサラリーマンをしています。
妻、子供の3人で奈良県に住んでいます。
アラフォーです。

もともとは大阪に住んでいたのですが、妻が育児で体調を崩してしまい両親のサポートをうけやすい奈良県に引っ越し生活しています。その甲斐と子供の成長による生活リズムの安定など様々な要因があると思いますが、妻の体調は回復し穏やかな日常を送っています。

#1作ったサービス
保活広場
https://www.hokatsupark.com/

##作ろうと思ったきっかけ
###妻が働きたいと言い出した。
子供が1歳半になる頃、「妻の職場復帰をどうするか？」が家族の議題になりました。仕事をすることで気持ちの切り替えができて、以前のような妻に会えるのではないか？そう期待していた私は、二つ返事で妻の職場復帰をOKしました。
子供は保育園にあずけることにしました。

###保育園におちました。
しかし、保育園におちました。当面は、週一回両親に子供を預かってもらい復帰することになりました。しかし、「親も高齢です。」頼り続けるわけにもいかず、一時預かりのある保育園を探すことになりました。
しかし、奈良市の保育園情報は、**スマホでは読みにくいCSV**で提供されており、**お役所仕事とはこのことか**と思うと同時に**この問題を解決したい。**そう思うようになりました。

なぜかはわかりませんが
**「日本、〇ね！」**
という気持ちは一切湧かず、
「きっと同じように困っている人がいるに違いない。」
「その人たちが平和に過ごすためにストレスを減らすサービスを作りたい。」
そう思いました。

以前、エクセルで保活の記録をつけるという記事を読んだことがあり、気になる保育園をブックマークできる機能をつけたサイトを作ろうと思いました。類似サービスはありましたが、私が住んでいる奈良市はなかったのでGOを出しました。

###TechAcademyに入会した。
しかし、プログラミングもしたことがなく、ワードプレスでサイトを作るのが精いっぱいの私にとって情報をまとめてすっきり表示させるは非常に難しい課題でした。色々、調べたところカスタムフォームで実現できそうでしたがPHPの知識がなく挫折。普段なら、おそらくそれであきらめたと思います。しかし、**育児で体験した恨みを少しでもプラスに変換して世に貢献したいという感情**からくるエネルギーは不思議なもので、気が付けばオンラインブートキャンプのTechAcademyに入会していました。
寝かしつけは妻でダメなので、寝た後にごみ捨てや洗濯などの家事をした後の数時間を学習に充てました。

そして、2か月開発を行い、**このサービス需要あるのか？不安になった**
ので一部ですができている部分を公開しました。


#使用した技術
##Laravel5.5
テックアカデミーではLaravel5.1LTSベースのカリキュラムを受けていたのですがMultiAuthの対応のハードルが高く感じてしまったのでLaravel5.5を選択しました。開発環境はAWS Cloud9で開発を行い、Herokuにデプロイしました。

##Bootstrap　Studio
HTMLやCSSの知識も皆無でしたのでQiitaの記事に書いてあったBootstrap　Studioを購入し見た目を（少し）強化しました。HTMLとCSSの基礎知識は、ほとんどないのでこれからの課題です。
https://qiita.com/Yuta_Fujiwara/items/10df62b820d056a92e86

#サービスを作ってみて感じたこと
##プログラミングはアラフォーでも学べる
はっきりいって、「40歳前に新しいことを学ぶ」なんて思っていませんでした。しかし、プログラミングが想像以上に面白い。
自分が書いたコードが動くことがこんなに楽しいなんて！
本当に勉強してよかった。

##これから
一応、雑ですが2か月でプログラミング初心者でもリリースすることができました。まだまだ改良の余地はあることは承知しています。要望があれば市町村の追加などのデータの補強などもしていきたい。もっとJavascriptとかフロントエンドの勉強もしてユーザービリティを勉強したいとも思います。
40歳からでもプログラミングは楽しいし、もっとやりたいことが出てきました。

ただ、
**妻から「ええやん。」**
そう言われたい一心で作りましたが、皆さんの意見をいただいてもっと良いサイトにしようと思っております。
ご意見いただければ幸いです。


#謝辞
このサイトを作るにあたって助けて頂いた@suinさん本当にありがとうございました。

#追記
要望がありましたので勉強の記録書きました。
https://corylog.com/2018/05/09/%E5%88%9D%E5%BF%83%E8%80%85%E3%81%8C%E3%83%86%E3%83%83%E3%82%AF%E3%82%A2%E3%82%AB%E3%83%87%E3%83%9F%E3%83%BC%E3%81%A7%E7%8B%AC%E8%87%AA%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E5%85%AC%E9%96%8B%E3%81%BE/
javascriptのLambdaの失敗あるある

javascriptで何らかの配列に対する処理を書いて、

```javascript
filttered = [];
[1,2,3,4].forEach((i) => {
  //1,3以外を取得
  if ([1,3].indexOf(i) < 0) {
    filttered.push(i);
  }
});
console.log(filttered); //[2,4]
```

で、これはfilterで行けると思い修正

```javascript
filttered =
  [1,2,3,4].filter((i) => {
   //1,3以外を取得
   return [1,3].indexOf(i) < 0;
  });
console.log(filttered); //[2,4]
```

さらに、１行で済むよねと思い修正

```javascript
//1,3以外を取得
filttered =
  [1,2,3,4].filter((i) => {[1,3].indexOf(i) < 0　});
console.log(filttered); //[] ????
```

突然値が返らなくなり焦ることがあります。

**理由は単純でブロック `{}` を残してるのに `return` が無いから**
**lambdaでreturnを省略する時は{}を外すのを忘れずに！**

```javascript
//1,3以外を取得
filttered =
  [1,2,3,4].filter((i) => [1,3].indexOf(i) < 0);
console.log(filttered); //[2,4]
```
Gitbook-Plugin-Plantumlをgit cloneから利用できるようにする

# Abstract

wordで仕様書であったり設計書を書いてたけど，
とってもいいツール([gitbook](https://www.gitbook.com/))を見つけてしまったのでそちらへ移行した際にプラグインの一つが上手く動かなかったのでそのお話．

開発環境はMacです．

## Background

gitbookを使うことでmarkdown形式でドキュメントが書けるようになりました．
しかも，HTML,PDFなどに簡単にエキスポートできます．素晴らしい．

ですが，設計書を書く上で図表作成は避けれぬ道．

そこで，gitbookに図表生成ツールがあるのか探していたところ，ツールがありました．

- [lyhcode/gitbook-plugin-plantuml](https://github.com/lyhcode/gitbook-plugin-plantuml)
- [vowstar/gitbook-plugin-uml](https://github.com/vowstar/gitbook-plugin-uml)

二つあります．どちらでもいいと思います．
今回は，__vowstar/gitbook-plugin-uml__で作業を進めます．（~~私の環境では__lyhcode/gitbook-plugin-plantuml__が動かなかった~~）

### npm installが進まない...

# How to

graphvizとplantuml本体をインストール

```bash
# もしかしたらこの作業はいらないかもしれない
$ brew install graphviz
$ brew install plantuml
```

npmで__vowstar/gitbook-plugin-uml__をインストール

```bash
$ npm i -D gitbook-plugin-uml
⸨░░░░░░░░░░░░░░░░░░⸩ ⠋ fetchMetadata: sill resolveWithNewModule gitbook-plugin-uml@1.0.0 checking installable status
```

止まった．動かない．

---

しょうがないのでgitから直接インストールする．

```bash
$ git clone https://github.com/vowstar/gitbook-plugin-uml.git
```

gitbookの`node_modules`の中にcloneした`vowstar/gitbook-plugin-uml`を配置
vowstar/gitbook-plugin-umlは`node-plantuml`を用いているのでそれもインストール

```bash
$ npm i -D node-plantuml
```

gitbookの`book.json`のpluginsへ以下を記述

```json
{
    "plugins": ["uml"],
}
```

gitbook への適用

```bash
$ gitbook install
info: installing 1 plugins using npm@3.9.2 
info:  
info: installing plugin "uml" 
info: install plugin "uml" (*) from NPM with version 1.0.0 
info: >> plugin "uml" installed with success 
```

確認

[ここ](https://github.com/vowstar/gitbook-plugin-uml)のサンプルコードをmdファイルに書く

```bash
$ gitbook serve
```

http://localhost:4000/ へアクセス，表示できていれば終了

# Conclusion

結構時間かかったので，苦戦している方は是非お試しあれ．

## References

- [PlantUMLをMac OS Xで使う](https://qiita.com/kohashi/items/1d2c6e859eeac72ed926)
🍺Gitでcommitメッセージを間違えた時の変更方法

# commitメッセージを後から変更したいとき
微妙なメッセージをつけてしまうときがたまにある。

## 一つ前のcommitのメッセージを変更
```Bash
$ git commit -m "miss message"
$ git commit --amend -m "correct message"
```
簡単！

## 二つ以上前のcommitメッセージを変更

commitメッセージをミスった時はだいたいすぐ気づくので二つ以上前のcommitメッセージを変更することは少ないと思う。

```Bash
$ git add -A
$ git commit -m "Update view"

$ git add -A
$ git commit -m "Update controller"

$ git add-A
$ git commit -m "Update test"

$ git add -A 
$ git commit -m "Update Model"

$ git log --oneline          
                   
b71d547 (HEAD -> master) Update Model
b834757 Update test
11767d4 Update controller
2d5471e Update view

```

### 二番目にcommitした時のメッセージを変更したい

"Update controller"から"Update users_controller"に変えたい

```Bash
$ git rebase -i HEAD~3
```
3つ前のcommitなので~3をつける

こうすると

```
pick fc58c59 Update users_controller
pick eab1c1d Update test
pick 3d766c0 Update Model

# Rebase 2d5471e..3d766c0 onto 2d5471e (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
```

変更したいcommitのところをpickからeditに変更する。(一行目)

```
edit fc58c59 Update users_controller
pick eab1c1d Update test
pick 3d766c0 Update Model

# Rebase 2d5471e..3d766c0 onto 2d5471e (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
```

保存してエディタを閉じる。

一つ前のcommitメッセージを変更するのと同様に以下のようにする。

```Bash
$ git commit --amend -m "Update users_controller" 
```

いい感じに設定を元にもどしてくれる。

```Bash
$ git rebase --continue
```

```Bash
$ git log --oneline  
3d766c0 (HEAD -> master) Update Model
eab1c1d Update test
fc58c59 Update users_controller
2d5471e Update view
```

ちゃんと変更されている！
bootstrapを学んだら便利だということがわかった話

セミナーでbootstrapを学んだので共有します。
また、グリッドシステムについて記述します

##bootstrapのメリット
1.時間をかけずにレスポンシブルになる 
2.CSSの知識が浅くてもOK
3.JSが一部使える

特に1は素晴らしいと感じました。今どきスマホでサイト閲覧するのは当たり前なので、サクッとレスポンシブルにできるのはありがたいですね。
ポートフォリオ作成時にはぜひ活用したいところです。

##bootstrapのデメリット
1.グリッドシステムがやや難しい
2.いろんな部品があって把握できない

2はいろんなことができるというメリットにもあるのですが、どんな部品があるのかをある程度把握しておかないと使いこなせないというハードルはあると感じました。

##グリッドシステムについて
グリッドシステムとは、横幅いっぱいを12カラムとしたときに何カラム分の横幅を割り当てるかを指定するだけで要素を配置していくものです。HTMLタグに以下のように記述します。

書式：col-[画面サイズ]-[カラム数]
```html
col-md-3
```
mdがブラウザのサイズです。mdの場合は992〜1199pxです。
3はカラム数です。



##codepenでbootstrapを使う方法
http://www.fran-shushoku.com/entry/2017/09/04/091149
codepenは変更するとすぐに画面に反映されるのでフロントエンドを学ぶ方にはおすすめです。
Python > ||| が続ている時に2行目に|:-:|:-:|を入れる

### 関連

- [はてなダイアリー to Markdown > v0.1:sub list対応, v0.2-v0.3: スーパーpre記法対応](https://qiita.com/7of9/items/4e5c586431871e24ad33)


### 処理概要

はてな記法のテーブル表記をMarkdown記法にする。

```stdin
| 1 | 2 |
|   |   |
|   |   |
テスト
| 1 | 2 |
|   |   |
|   |   |
```

```stdout
| 1 | 2 |
|:-:|:-:|
|   |   |
|   |   |
テスト
| 1 | 2 |
|:-:|:-:|
|   |   |
|   |   |
```

### code v0.1

https://ideone.com/Qo8XKb

```py
import sys

# on Python 3.5

# read from stdin
lines = sys.stdin.readlines()

def getTableFormat(numVertical):
    wrk = "|"
    for loop in range(numVertical - 1):   # -1: except for first
       wrk += ":-:|"
    return wrk

count = 0
for elem in lines:
    wrk = elem
    if "|" in wrk:
       count += 1
       if count == 2:
           num = wrk.count('|')
           fmt = getTableFormat(num)
           print(fmt)
    else:
       count = 0
    print(elem, end='')

```

### code v0.2

https://ideone.com/nspR18

```py
import sys

# on Python 3.5

'''
v0.1 Apr. 24, 2018
   - sub list is converted to Markdown style
'''

# read from stdin
lines = sys.stdin.readlines()


def getTableFormat(numVertical):
    wrk = "|"
    for loop in range(numVertical - 1):   # -1: except for first
       wrk += ":-:|"
    return wrk
    
    
def conv_tableFormat(astr):
    global countTbl
    if "|" in astr:
        countTbl += 1
        if countTbl == 2:
            num = astr.count('|')
            fmt = getTableFormat(num)
            return fmt + "\r\n" + astr
    else:
        countTbl = 0
    return astr

countTbl = 0  # Table format counter
for elem in lines:
    wrk = conv_tableFormat(elem)
    print(wrk, end='')

```
OracleDBとPostgreSQLの相違点

DBを移行する際などに気を付けるべき点を記述する。

##データ型
<table>
  <tr>
    <th></th><th>OracleDatabase</th><th>PostgreSQL</th>
  </tr>
  <tr>
    <td>数値型</td><td>NUMBER</td><td>Integer, Numeric</td>
  </tr>
  <tr>
    <td>文字型</td><td>CHAR, VARCHAR</td><td>CHAR, VARCHAR</td>
  </tr>
  <tr>
    <td>日付型</td><td>DATE, TIMESTAMP</td><td>DATE, TIMESTAMP</td>
  </tr>
  <tr>
    <td>バイナリ列データ型</td><td>RAW</td><td>bytea</td>
  </tr>
</table>

##空文字列("")の扱い
OracleDatabase &nbsp;  空文字列("")をNULLとして扱う。
PostgreSQL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;空文字列("")とNULLを違うものとして扱う。

##SQL
###varchar型のデータをWHERE句に指定する際

**OracleDatabaseは条件をシングルクォートで囲んでも囲まなくてもOK**

```SQL
SELECT * FROM hoge WHERE  column = '条件' ;
もしくは
SELECT * FROM hoge WHERE  column = 条件;
```

**PostgreSQLではシングルクォートで必ず囲む必要がある**

```SQL
SELECT * FROM hoge WHERE  column = '条件' ;
```

###外部結合
OracleDatabaseは結合演算子(+)が利用できる
PostgreSQLは結合演算子(+)が利用できず、JOIN句を利用する必要がある。


###システム日付の取得
OracleではCURRENT_DATE, SYSDATEで取得可能
PostgreSQLではCURRENT_DATE, now()を利用する。
TypeError: 'NoneType' object is not callableとエラーが発生した場合


Kerasの学習後に以下のエラーが発生しました。

```
Exception ignored in: <bound method BaseSession.__del__ of <tensorflow.python.client.session.Session object at 0x7fa1662e5d30>>
Traceback (most recent call last):
  File "/home/Users/.virtualenvs/Pythonの環境名/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 712, in __del__
  File "/home/Users/.virtualenvs/Pythonの環境名/lib/python3.5/site-packages/tensorflow/python/framework/c_api_util.py", line 31, in __init__
TypeError: 'NoneType' object is not callable
```


学習させるスクリプトにバックエンドの追加と

```python
from keras.backend import tensorflow_backend as backend
```

処理の終了時に以下を呼び出して対応しましたー

```python
backend.clear_session()
```
Error in `python': free(): invalid pointerとエラーが発生した場合

Kerasで学習させたあと、下記のエラーが発生しました

```
*** Error in `python': free(): invalid pointer: 0x00000000026cd780 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fc02629d7e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7fc0262a637a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7fc0262aa53c]
/usr/lib/x86_64-linux-gnu/libprotobuf.so.9(_ZN6google8protobuf8internal28DestroyDefaultRepeatedFieldsEv+0x1f)[0x7fbfa59be8af]
/usr/lib/x86_64-linux-gnu/libprotobuf.so.9(_ZN6google8protobuf23ShutdownProtobufLibraryEv+0x8b)[0x7fbfa59bdb3b]
/usr/lib/x86_64-linux-gnu/libmirprotobuf.so.3(+0x233b9)[0x7fbf9551c3b9]
/lib64/ld-linux-x86-64.so.2(+0x10de7)[0x7fc02681dde7]
/lib/x86_64-linux-gnu/libc.so.6(+0x39ff8)[0x7fc02625fff8]
/lib/x86_64-linux-gnu/libc.so.6(+0x3a045)[0x7fc026260045]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf7)[0x7fc026246837]
python(_start+0x29)[0x5d6049]
======= Memory map: ========
00400000-007a9000 r-xp 00000000 08:04 23335675
```


libtcmalloc-minimal4をインストール

```
sudo apt-get install libtcmalloc-minimal4
```

bashrcを編集

```
vim ~/.bashrc
```

追加

```
export LD_PRELOAD="/usr/lib/libtcmalloc_minimal.so.4"
```

更新

```
source ~/.bashrc
```

再度学習すると上記のエラーは発生しなくなりましたー



※その後、`TypeError: 'NoneType' object is not callable`と別のエラーが発生した場合はこちらの[記事](https://qiita.com/1O1/items/d56f80379229005343ee)をm(__)m

```
Exception ignored in: <bound method BaseSession.__del__ of <tensorflow.python.client.session.Session object at 0x7fa1662e5d30>>
Traceback (most recent call last):
  File "/home/Users/.virtualenvs/Pythonの環境名/lib/python3.5/site-packages/tensorflow/python/client/session.py", line 712, in __del__
  File "/home/Users/.virtualenvs/Pythonの環境名/lib/python3.5/site-packages/tensorflow/python/framework/c_api_util.py", line 31, in __init__
TypeError: 'NoneType' object is not callable
```
Javascriptのclassについて

##classについて
・ECMAScript2015から採用。
・classは設計図。
・classにより、Javascriptでもオブジェクト指向プログラミングが簡潔に書けるようになった。

```js
class Person {
  constructor(name) {
    this.name = name;
  }
  shokai() {
    console.log("初めまして" + this.name + "です。");
  }
}
var ayana = new Person("ayana");
ayana.shokai();


//=> 初めましてayanaです。
```

上記のコードを例にみていくと、
①classキーワードでPersonというクラスを定義。
②次にconstructorメソッドとshokaiというメソッドを定義。(constructorメソッドはclassをnewして作ったインスタンス生成時に呼ばれる。)
※this.nameのthisは生成するオブジェクト(Personインスタンス)を参照している。
リモートサーバー上のMySQLコンテナのDBにDBツールで繋ぐ方法

# 何がしたいの？
リモートサーバーにMySQL用のDockerコンテナを作成した。
ローカルのDBツールからその中身が見たい！

# 結論
**MySQLホストにdockerコンテナのIPアドレスを指定したらいける。**

# 手順
## DBツールを用意してSSH接続を選ぶ
今回はSequel Proを利用します。
https://www.sequelpro.com/
<img width="484" alt="スクリーンショット 2018-04-24 13.07.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/e8957964-aae6-3c9b-3ffb-95f06d06aa61.png">


<font color="red">ちなみに弊社ではこいつをパンスペ（パンケーキスペシャル）と呼んでいる。</font>

## MySQLのホストを取得する
**ここが一番のキモです。**
DockerコンテナのIPアドレスを指定する必要があります。
以下のコマンドで取得できます。
``docker inspect --format '{{ .NetworkSettings.IPAddress }}' [コンテナIDまたはコンテナ名]``

## 入力

|項目||
|:--|:--|
|MySQLホスト|dockerコンテナのIPアドレス|
|ユーザ名|MySQLのユーザ名|
|パスワード|MySQLのパスワード|
|SSHホスト|SSH先のホスト|
|SSHユーザー|SSH先のユーザー名|
|SSHパスワード|SSH先のパスワード|

普通かよ。

# 所感
やっぱGUIで情報みれると助かりますね。
ナイスパンスペ

ブログで見たい方はこちら
[リモートサーバー上のMySQLコンテナのDBにDBツールで繋ぐ方法](http://nabesys.com/article/2018/04/25511/)
macへのnodebrewを使ったnode.jsの５分間インストール

### 5分間インストール

- nodebrew を入れるため homebrew をインストールする
- 公式サイト:https://brew.sh/index_ja.html

```bash
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

- nodebrew をインストールする

```bash
brew install nodebrew
# インストールされたことを確認する
nodebrew -v
```

- nodebrew をセットアップする

```bash
nodebrew setup
```

- インストールできる node.js のバージョンを確認する

```bash
nodebrew ls-remote
```

- node.js の最新版をインストールする

```bash
nodebrew install-binary latest
# インストールされたバージョンを確認する
nodebrew list
```

- node.js をバージョンを指定してインストールする

```bash
nodebrew install-binary 10.0.0
# インストールされたことを確認する
nodebrew list
```

- 使用する node.js のバージョンを設定する

```bash
nodebrew use v10.0.0
# 設定されたことを確認する
nodebrew list
```

- コマンドへのPathを通す

```bash
# .bash_profile に exportを追記する
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
# 設定を反映する
source ~/.bash_profile
# 設定を確認する
printenv PATH
```

- コマンドが使えることを確認する

```bash
node -v
npm -v
```

バージョンが確認できればインストール完了です。


### 補足 : 異なるバージョンをインストールしてバージョンを変更する

- インストールできる node.js のバージョンを確認する

```bash
nodebrew ls-remote
```
- node.js をバージョンを指定してインストールする

```bash
nodebrew install-binary 6.0.0
# インストールされたことを確認する
nodebrew list
```

- 使用する node.js のバージョンを設定する

```bash
nodebrew use v10.0.0
# 設定されたことを確認する
nodebrew list
```

- コマンドが使えることを確認する

```bash
node -v
npm -v
```
Django rest framework serializerのForeignKey紐づく方法

## models
```python:models.py
class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)

class Track(models.Model):
    album = models.ForeignKey(Album, related_name='tracks', on_delete=models.CASCADE)
    order = models.IntegerField()
    title = models.CharField(max_length=100)
    duration = models.IntegerField()

    class Meta:
        unique_together = ('album', 'order')
        ordering = ['order']

    def __unicode__(self):
        return '%d: %s' % (self.order, self.title)
```

## serializers
```python:serializers.py
class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.StringRelatedField(many=True)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')
```


## views
```python:views.py

def retrieve(self, request, *args, **kwargs):
    album_serializer = AlbumSerializer(
        Album.objects.get(id=kwargs['id'])
    )
    
    return Response(album_serializer.data, status=status.HTTP_200_OK)

```


## 結果
```json
{
    'album_name': 'Things We Lost In The Fire',
    'artist': 'Low',
    'tracks': [
        '1: Sunflower',
        '2: Whitetail',
        '3: Dinosaur Act',
        ...
    ]
}
```
Armのunaligned accessについて

[How does the ARM Compiler support unaligned accesses?](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka15414.html)のメモ。

# unaligned accessとは
ロード・ストア命令において、データサイズでアラインメントされていないアドレスにアクセスすること。
e.g. アドレス0x0002からのロングワード(4バイト)アクセス(LDR/STR)など。
C言語でpackedの構造体メンバにアクセスする場合などに起こりうる。

# unaligned accessを行うとどうなるか
## ARMv5以前
データアボート例外発生。
## ARMv6以降
ハードウェアでunalinged accessをサポート(設定でON/OFF)。
### ハードウェアではどう扱っているか
unalinged accessが発生した場合、インタフェースのバス幅(64bit or 128bit)分まとめて読み込み、必要な部分のみ処理することにより対応。処理が増える分、当然aligned accessより遅くなる。
また、Device memoryに設定されているバス(通常、ペリフェラルが繋がる(FPGA含む))には当てはまらない(例外発生)。
railsでコード書いてる時に思い出す用のメモ

rails書いててあーなんだっけってよくググったり、レビューしててこんな感じでってリンクをコピペする時に使う自分用のメモ

- decoratorとか共通化できるやつはconcernにして欲しいとき
  - [ActiveDecoratorでビューからロジックを切り離せ - コンユウメモ](http://konyu.hatenablog.com/entry/2015/05/26/184153)
- クラス継承する時に継承先でメソッド定義して欲しいとき
  - [Ruby Patterns - ✘╹◡╹✘](http://r7kamura.hatenablog.com/entry/2014/01/22/223346)
- created_atでorder byしてるのを見つけた時
  - [好きな子のことかslow query logのことばかり考えてほかのことがおろそかになる性格なおしたい #isucon](http://blog.kamipo.net/entry/2013/10/07/112728)
- enumの数字で取りたい時とか比較したい時

```ruby
user.role_before_type_cast
> 1

[User.roles[:general], User.roles[:special]].exclude?(@user.role_before_type_cast)

```

- sortしたい場合

```ruby
k.sort { | a, b | a.updated_at <=> b.updated_at } 

# 指定したid順にsortしたいとき
key = ['333','1000','1','11']
k = Keyword.where(id: [333,1000,1,11]) 
k = Keyword.where(id: key).order(['field(id, ?)', key]) # 333,1000,1,11の順番で出力したい
```

- specでchangeをつなげるとき

```
+      it do
+        expect { subject }.to change { User.all.size }.from(1).to(0)
+                         .and change { UserProfile.all.size }.from(1).to(0)
+      end
```

- modelの差分を取り出す時

```
Model.previous_changes
(Model.change?だとsaveが走ったらもう取れない)
```



開発してる時にあったらいいgem

- https://github.com/MiniProfiler/rack-mini-profiler
- https://github.com/josevalim/rails-footnotes

```rb
🍣  cat config/initializers/rails_footnotes.rb
defined?(Footnotes) && Footnotes.setup do |f|
  f.enabled = Rails.env.development?
  f.lock_top_right = true
end
```

ちょいちょい見るスライド

- [Railsアプリの育て方 - Google スライド](https://docs.google.com/presentation/d/e/2PACX-1vTfNoMXWk12xlW9x_ScHJ4owjvevjKey2UL7Zx3bsCJgPLJDlfiFd7f2odIg9dWSrVWCgGNFJH0knST/embed?start=false&loop=false&delayms=3000&slide=id.p)
- [ふつうのRails開発を続けるために // Speaker Deck](https://speakerdeck.com/mstshiwasaki/hutuufalserailskai-fa-wosok-kerutameni)
- [ふつうのRailsアプリケーション開発](https://www.slideshare.net/takafumionaka/rails-77195340)
- [Rails高速化戦略 / Speeding Up Rails // Speaker Deck](https://speakerdeck.com/toshimaru/speeding-up-rails)
- [1年間で取り組んだProttのパフォーマンスチューニング - console.blog(self);](http://sadah.hatenablog.com/entry/prott-performance-tuning-2015)
- [Form Object実装メモ](https://qiita.com/quattro_4/items/6636efbf58cca13db02a)
  - i18nがactivemodelにするところとか
特定の条件(複数)の場合のみvalidateを実行させる

## 単体の場合
```ruby
# def_valid_a?がtrueの場合validate実行
validates_presence_of :title, if: :def_valid_a?
```

## 複数の場合
```ruby
# def_valid_a? または def_valid_b? がtrueの場合validate実行
validates_presence_of :title, if: -> {def_valid_a? || def_valid_b?}
```

※validates_presence_of
値が空でないか
Level 11. Elevator（The Ethernaut）

「The Ethernaut by Zeppelin Level 11. Elevator」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions
11. Elevatorをクリック
## 11. Elevator
難易度 4/6
このエレベーターでは、建物の最上階には到達しないぞ。右に移動？
（このレベルのクリア条件は「top」にtrueを代入（すなわち最上階に到達）することだ）
##### **回答の助けになるヒント**
- 場合によっては、Solidityは約束（すなわち文法）を守ならいぞ。
- この Elevatorコントラクトは、Buildingインターフェースから使用されることを想定しているぞ。

## **ソースコード**

```javascript:
pragma solidity ^0.4.18;


interface Building {
  function isLastFloor(uint) view public returns (bool);
}


contract Elevator {
  bool public top;
  uint public floor;

  function goTo(uint _floor) public {
    Building building = Building(msg.sender);

    if (! building.isLastFloor(_floor)) {
      floor = _floor;
      top = building.isLastFloor(floor);
    }
  }
}
```
Level 10. Re-entrancy（The Ethernaut）

「The Ethernaut by Zeppelin Level 10. Re-entrancy」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions
10. Re-entrancyをクリック
## **10. Re-entrancy**
難易度 6/6
コントラクトからすべての資金を盗むことがこのレベルのクリア条件だ。
##### **回答の助けになるヒント**
- 信頼されていないコントラクトでは、期待される動作以上にコードが実行されてしまうぞ。
- フォールバックメソッドについて
- バブルを投げ返す/戻す
- 場合によっては、コントラクトを攻撃する最適な方法は別のコントラクトからの場合もありうるぞ。
- 上記の「Help」ページから「Beyond the console」部分を参照せよ。

## **ソースコード**

```javascript:
pragma solidity ^0.4.18;

contract Reentrance {

  mapping(address => uint) public balances;

  function donate(address _to) public payable {
    balances[_to] += msg.value;
  }

  function balanceOf(address _who) public view returns (uint balance) {
    return balances[_who];
  }

  function withdraw(uint _amount) public {
    if(balances[msg.sender] >= _amount) {
      if(msg.sender.call.value(_amount)()) {
        _amount;
      }
      balances[msg.sender] -= _amount;
    }
  }

  function() public payable {}
}
```
Level 9. King（The Ethernaut）

「The Ethernaut by Zeppelin Level 9. King」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions
9. Kingをクリック
## **9. King**
難易度 6/6
下記のコントラクトは非常にシンプルなゲームのコードである。
そのゲームとは、
現時点での最大価格よりも多額のETHを送った全てのゲーム参加者は新しい王になるぞ。
そして、先代の王は新しい王に賞金を払い、少しのETHを生成する。
まあ、ネズミ講みたいなものだな（(ﾉ∀`笑))
さて、この楽しい（？）ゲームを破壊することがお主への依頼内容となる。
インスタンスレベルに話を戻すと、（依頼内容は）王様権限を自分自身（のアドレス）に取り戻すことになる。
そのような王様宣言を拒絶することがこのレベルのクリア条件だ。
（すなわち、誰も王にはなれないようにすることだ）

## **ソースコード**

```javascript:
pragma solidity ^0.4.18;

import 'zeppelin-solidity/contracts/ownership/Ownable.sol';

contract King is Ownable {

  address public king;
  uint public prize;

  function King() public payable {
    king = msg.sender;
    prize = msg.value;
  }

  function() external payable {
    require(msg.value >= prize || msg.sender == owner);
    king.transfer(msg.value);
    king = msg.sender;
    prize = msg.value;
  }
}
```
Laravel5.6でuseDailyFiles(),useFiles()が使えずに困った話（ログの出力先を切り替える）

### 背景

イケているかといわれるとかなりイケてないからほかにやり方あるんだろうなと思いつつ、
Laravelのログ周りはいまいちよくわかってない中で、そんなに激しくは使わないので、
5.4ではファイルの場所を変えるのにバッチごとに

```php
use Illuminate\Support\Facades\Log;

Log::useDailyFiles('FILE_PATH');
```

と記載してごまかしていましたが、5.6で同じようなことをしようとしたら

```
 Call to undefined method Monolog\Logger::useDailyFiles()
```

そんなものねーよ、と怒られる。
config/logging.phpというのが新しくできて、チャンネルをどうこうするようになったらしいが、
カスタムチャンネルの作り方とか、envでチャンネル切り替えらえるよとかはあるけど、途中でのチャンネルの切り替え方がわからない
さすがにログを吐き出すごとに

```php
Log::channel('channnel_name')->info('log comment');
```

みたいに書くのはないっす、という気持ち。
https://qiita.com/hrdaya/items/b01d5621937a0710ca64


### 切替方法

結局イケてないままではあるが、同じようなことができた。
まず普通にチャンネルを作る
カスタムチャンネルとか作ればもっといろいろできそう。

```php:config/logging.php

'channels' => [


    'hogehoge' => [
        'driver' => 'daily', // ここはよしなに。
        'path' => storage_path('logs/hogehoge.log'), // ここでパスを切り替える
        'level' => 'debug',
        'days' => 30,
    ]
]
```

そして、LogManagerのコードとか読んでテキトーに以下にしたら実施したところ動いた。


```
        Log::setDefaultDriver('hogehoge');
```

defaultか？とも思ったが、指定しない場合のものと思えば、確かにそうである。
channelじゃん、driverじゃないじゃんとも思うけどそこはよくわからない。

```php
        Log::info('test1'); // config/logging.php の default channel
        Log::setDefaultDriver('hogehoge');
        Log::info('test2'); // hogehoge channel
        Log::setDefaultDriver('daily');
        Log::info('test3'); // daily channel
        Log::setDefaultDriver('single');
        Log::info('test4'); // single channel
```

ちなみにConsole/Commandsで使ってますが、__construct()内で行うと、artisan起動時にとりあえず呼び出すようなので、一番最後の？が採用されそう。
Level 8. Vault（The Ethernaut）

「The Ethernaut by Zeppelin Level 8. Vault」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions
8. Vaultをクリック
## **8. Vault**
難易度 3/6
Vaultコントラクトに設定されているロックを解除(falseに)することこのレベルのクリア条件だ。
## **ソースコード**
```javascript:
pragma solidity ^0.4.18;

contract Vault {
  bool public locked;
  bytes32 private password;

  function Vault(bytes32 _password) public {
    locked = true;
    password = _password;
  }

  function unlock(bytes32 _password) public {
    if (password == _password) {
      locked = false;
    }
  }
*/}
```
Amazon Product Advertising API を Google Apps Scriptで使う

scratchpadにはphpのCode snippetsがあったのですがgasはないので書いてみました。
isbnから商品情報を取得しています。

```javascript
function myFunction(isbn) {

  var associate_tag_id = "[アソシエイトタグ]";
  var access_key_id = "[アクセスキー]";
  var secret_key = "[シークレットキー]";

  var endpoint = "webservices.amazon.co.jp";
  var uri = "/onca/xml";

  var params = {
    Service: "AWSECommerceService",
    Version: "2013-08-01",
    Operation: "ItemSearch",
    AWSAccessKeyId: access_key_id,
    AssociateTag: associate_tag_id,
    SearchIndex: "All",
    Timestamp: new Date().toISOString(),
    Keywords: "isbn= " + isbn,
    ResponseGroup: "ItemAttributes"
  };

  // ソートが必要
  var sort_params = Object.keys(params).sort();
  sort_params = sort_params.map(function(key) {
    return key + "=" + encodeURIComponent(params[key]);
  });

  var canonical_query_string = sort_params.join("&");

  var string_to_sign = "GET\n" + endpoint + "\n" + uri + "\n" + canonical_query_string;

  // 署名が必要
  var signature = Utilities.base64Encode(Utilities.computeHmacSha256Signature(string_to_sign, secret_key));

  // リクエストのURL
  var request_url = 'http://' + endpoint + uri + '?' + canonical_query_string + '&Signature=' + encodeURIComponent(signature);

  // レスポンス取得
　// 503エラーでもレスポンスを受け取れるようにmuteHttpExceptionsをtrueにする
  var response = UrlFetchApp.fetch(request_url, {muteHttpExceptions: true});
  var responseCode = response.getResponseCode();
  var responseBody = response.getContentText();
  var document = XmlService.parse(responseBody);
  var asin = '';
  var ns = XmlService.getNamespace('http://webservices.amazon.com/AWSECommerceService/2013-08-01');
  var root = document.getRootElement();

  if (responseCode === 200) {
    var items = root.getChild('Items', name).getChildren('Item', name);
    for(var i = 0; i < items.length; i++) {
      // xmlからitemの情報を取得
      asin = items[i].getChild('ASIN', name).getText();
    }
  } else {
    // エラー時はxmlのnamespaceが異なる
    ns = XmlService.getNamespace('http://ecs.amazonaws.com/doc/2013-08-01/');
    var message = root.getChild('Error', name).getChild('Message', name);
    return message.getText();
  }

}
nodebrewでnodeのバージョンを切り替える方法


## nodeのバージョンを下げなければならなくなった経緯
laravelのwebpackを使ったコンパイルを実行する為`npm run dev`を実行したら以下の様なエラー出てきました。

```
Module build failed: Error: Missing binding /your/path/hogehoge/node_modules/node-sass/vendor/darwin-x64-59/binding.node
Node Sass could not find a binding for your current environment: OS X 64-bit with Node.js 9.x

Found bindings for the following environments:
  - OS X 64-bit with Node.js 8.x
```
のnodeのバージョンを確認したところ`v9`だったので多分v8に変更しろってことなんだろうなと思いました。

## nodebrewの設定
homebrewがインストールされている前提で話をすすめます。homebrewがインストールされてない方はインストールして下さい。

### 今まで使っていたnodeをアンインストール
homebrewでnodeをインストールして使っていた場合
homebrewでインストールしたnodeを削除

```
brew uninstall --force node
```
### nodebrewをインストール
homebrewでnodebrewをインストール

```
brew install nodebrew
```
### nodebrewをインストールされたか確認

```
nodebrew
```
nodebrewで使えるコマンドが出てくればOK

## nodebrewでインストール可能なnodeのバージョンを確認
```
nodebrew ls-remote
```

## nodebrewで使いたいバージョンのnodeをインストール
```
nodebrew install-binary v8.11.1
```
今回はv8の一番最新のバージョンを選んだ。
他にも最新の安定版をインストールしたかった`stable`とする。

```
nodebrew install-binary stable
```

###　 nodeのインストール先のディレクトリを作る 
インストールコマンドを実行したところエラーが出た。

```
Fetching: https://nodejs.org/dist/v8.11.1/node-v8.11.1-darwin-x64.tar.gz
Warning: Failed to create the file 
Warning: /your/path/.nodebrew/src/v8.11.1/node-v8.11.1-darwin-x64.tar.gz: 
Warning: No such file or directory
                                                                           0.0%
curl: (23) Failed writing body (0 != 847)
download failed: https://nodejs.org/dist/v8.11.1/node-v8.11.1-darwin-x64.tar.gz
```
`No such file or directory`と言っているのでディレクトリを作った。

```
$ mkdir ~/.nodebrew
$ mkdir ~/.nodebrew/src
```
　そして再度nodeのインストールコマンドを実行したところうまくいった。
参考
https://blog.yug1224.com/archives/5693a5e0fef2539c7d5b149d

しかしよく調べたら以下のコマンドを実行することで自動でディレクトリを作ってくれるらしい。

```
nodebrew setup
```
なのでこちらで対応した方が良いと思います。
参考
http://ngzm.hateblo.jp/entry/2016/09/22/172500

### nodebrewでインストールされたnodeのバージョンを確認

```
nodebrew ls
```
インストールしたバージョンのリストが表示されていればOK

```
v8.11.1
v9.11.1

current: none
```
currentのところには、使用するバージョンが表示されます。

### 使いたいnodeのバージョンをインストールしたバージョンのリストから選ぶ。
今回は`v8.11.1`を選ぶ。

```
nodebrew use v8.11.1
```

これで`v8.11.1`のnodeが使えると思って`node -v`を実行してみたが..

```
bash: /usr/local/bin/node: No such file or directory
```
### パスの設定
`~/.bashrc`のファイルに以下パスを追加します。

```

export PATH=$HOME/.nodebrew/current/bin:$PATH
```
~~そしてパスを反映させるために以下のコマンドを実行~~
~~`source ~/.bashrc`~~

`source ~/.bashrc`の一文を`~/.bash_profile`に追加する

`nodebrew setup`を実行したら、パスが表示される。

```
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```


## 参考サイト
* [nodebrewを使ってMac OSX環境のNode.jsを管理する](https://mae.chab.in/archives/2880)
* [nodebrewで任意のバージョンのNode.jsをインストールして、そのバージョンを指定して使う](https://dev.classmethod.jp/server-side/node-js-server-side/nodebrew-install-node-js-and-specify-using-version/)

## 補足
nodebrewと似たような機能を持つ[nvm](https://github.com/creationix/nvm)というのもある。
Level 7. Force（The Ethernaut）

「The Ethernaut by Zeppelin Level 7. Force」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions
7. Forceをクリック
## **7. Force**
難易度 5/6
いくつかのコントラクトは、お金を取らないものもあるぞ ?_(ツ)_/?
コントラクトの残高をゼロより大きくすることがこのレベルのクリア条件だ。
##### **回答の助けになるヒント**
- フォールバックメソッド
- 場合によっては、コントラクトを攻撃する最適な方法は別のコントラクトからの場合もありうるぞ。
- 上記の「Help」ページから「Beyond the console」部分を参照せよ。

## **ソースコード**

```javascript:
pragma solidity ^0.4.18;

contract Force {/*

                   MEOW ?
         /\_/\   /
    ____/ o o \
  /~____  =?= /
 (______)__m_m)

*/}
```
XAMPPのPHP7でXdebugを使う

**XAMPPのPHP7でXdebugを使う場合**

1. XdebugのDLLをダウンロード
XAMPPのバージョンによっては環境が異なりXdebugのDLLが適用できないものもある。
 1. まずは、XAMPPでApacheを起動させる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142882/f601c3f4-16d6-0c1a-8960-adcccba00367.png)

 2. phpinfo()でPHPの情報を表示
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142882/4c9d9a2f-8931-f184-ad8b-6c77564b37e6.png)

 3. 環境にあったXdebug.dllをダウンロード
phpinfo()で出力されたソースコード(html)を全部コピー
https://xdebug.org/wizard.php のサイトのテキストボックスにコピーしたソースコードを貼り付ける
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142882/2d8e7267-ac47-842f-e274-88f101050e9c.png)
[Analyse my phpinfo() output]ボタンを押す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142882/77fbe4bc-b6f2-ac76-36c8-4a7bfbd98a02.png)
現在の環境に合ったDLLのファイルがダウンロードできるのでこれをダウンロードする

 4. C:\xampp\php\ext にダウンロードしたDLLを入れる

2. php.iniを編集 下記を末尾に追記
ただしphp_xdebug-2.6.0-7.2-vc15.dllはダウンロードしてきたファイル名に変更すること

``` php.ini
[XDebug]
zend_extension = "C:\xampp\php\ext\php_xdebug-2.6.0-7.2-vc15.dll"
xdebug.remote_autostart = 1
xdebug.profiler_append = 0
xdebug.profiler_enable = 0
xdebug.profiler_enable_trigger = 0
xdebug.profiler_output_dir = "c:\xampp\tmp"
xdebug.remote_enable = 1
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "127.0.0.1"
xdebug.remote_log="c:\xampp\tmp\xdebug.txt"
xdebug.remote_port = 9000
xdebug.trace_output_dir = "c:\xampp\tmp"
xdebug.remote_cookie_expire_time = 36000
```
Level 6. Delegation（The Ethernaut）

「The Ethernaut by Zeppelin Level 6. Delegation」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions
6. Delegationをクリック
## **6. Delegation**
下記コードのインスタンス（コントラクト）のオーナーを自分自身のアドレスに変更することがこのレベルのクリア
##### **回答の助けになるヒント**
- デリゲートコールにおける低レベル関数がどのように動作するか、デリゲートする為にはどのように使用するか、Solidityのドキュメントを参照せよ。
- フォールバックメソッドについての理解
- メソッドid(s)についての理解


## **ソースコード**

```javascript:
pragma solidity ^0.4.18;

contract Delegate {

  address public owner;

  function Delegate(address _owner) public {
    owner = _owner;
  }

  function pwn() public {
    owner = msg.sender;
  }
}

contract Delegation {

  address public owner;
  Delegate delegate;

  function Delegation(address _delegateAddress) public {
    delegate = Delegate(_delegateAddress);
    owner = msg.sender;
  }

  function() public {
    if(delegate.delegatecall(msg.data)) {
      this;
    }
  }
}
```
Level 5. Token（The Ethernaut）

「The Ethernaut by Zeppelin Level 5. Token」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions
5. Tokenをクリック
## **5. Token**
難易度 3/6
下記の基本的なトークンコントラクトをハッキングすることがこのレベルのクリア条件だ。
始めに20のトークン量が与えられ、何らかの方法で追加トークンが手に入れば（トークンが20以上になれば）このレベルはクリアとなる。できれば一度大量のトークンを手に入れるのだ。
##### **回答の助けになるヒント**
-「距離計」とはどのようなものか考えよ。

## **ソースコード**

```javascript:
pragma solidity ^0.4.18;

contract Token {

  mapping(address => uint) balances;
  uint public totalSupply;

  function Token(uint _initialSupply) public {
    balances[msg.sender] = totalSupply = _initialSupply;
  }

  function transfer(address _to, uint _value) public returns (bool) {
    require(balances[msg.sender] - _value >= 0);
    balances[msg.sender] -= _value;
    balances[_to] += _value;
    return true;
  }

  function balanceOf(address _owner) public view returns (uint balance) {
    return balances[_owner];
  }
}
```
Level 4. Telephone（The Ethernaut）

「The Ethernaut by Zeppelin Level 4. Telephone」を翻訳してみました（[CryptoZombies](https://cryptozombies.io/)のように？）
## **原文はこちら**
https://ethernaut.zeppelin.solutions
4. Telephoneをクリック
## **4. Telephone**
難易度 1/6
下記のスマートコントラクトのオーナーを自分自身のアドレスに変更することがこのレベルのクリア条件だ。
##### **回答の助けになるヒント**
- 上記の「Help」ページから「Beyond the console」部分を参照せよ。

## **ソースコード**

```javascript:
pragma solidity ^0.4.18;

contract Telephone {

  address public owner;

  function Telephone() public {
    owner = msg.sender;
  }

  function changeOwner(address _owner) public {
    if (tx.origin != msg.sender) {
      owner = _owner;
    }
  }
}
```
putty関連の覚書

#概要
Qiitaになくてスタックできない記事まとめた定期

#画面が突然固まった！！
[参考元](http://d.hatena.ne.jp/xyk/20130408/1365402112)
ctrl+sを入力すると画面が固まる仕様だそうです。
ctrl+qを入力することで復帰できます。
Visual Studio Codeでmsys2のzshを使う方法

## こっちの方を参考にしてください

- [Visual Studio Code 15.1の統合シェルをMSYS2のbashにする](https://qiita.com/yumetodo/items/42132a1e8435504448aa)
- 参考までに今の自分の設定

~~~json
    "terminal.integrated.shell.windows": "zsh.exeまでのパス",
    "terminal.integrated.env.windows": {
        "MSYSTEM": "MSYS",
        "CHERE_INVOKING": "1",
        "MSYS": "winsymlinks:nativestrict",
        "MSYS2_PATH_TYPE": "inherit"
    },
    "terminal.integrated.shellArgs.windows": [
        "--login",
        "-i"
    ],
~~~

## 元ネタ

- [Visual Studio Code で msys2 の bash を使う方法](https://gist.github.com/mattn/000735084394601b225a861af4afd35e)

## Visual Studio Codeでmsys2のzshを使う方法

なんかうまいことやれた結果。

### ビルド方法

~~~shell:shell
$ go build zsh-login.go
~~~

### vscode内の設定

~~~
"terminal.integrated.shell.windows": "zsh-login.exeまでのパス"
~~~

### code

~~~go:zsh-login.go
package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	os.Setenv("CHERE_INVOKING", "1")
	os.Setenv("MSYSTEM", "MSYS")
	os.Setenv("MSYS", "winsymlinks:nativestrict")
	cmd := exec.Command(`zsh.exeまでのパス`, `--login`, `-i`)
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr
	if err := cmd.Run(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
}
~~~
MagnetとBetterSnapTool比較


## 概要

似た機能を持つMagnetとBetterSnapToolを比較してみる。

### どんなもの？

- [Magnet](https://itunes.apple.com/jp/app/magnet-%E3%83%9E%E3%82%B0%E3%83%8D%E3%83%83%E3%83%88/id441258766?mt=12)
- [BetterSnapTool](https://itunes.apple.com/jp/app/bettersnaptool/id417375580?mt=12)

アプリ画面を右半分にしたり、左半分にしたり、全画面にしたり、という指定をコマンドやドラッグ操作で簡単にできるアプリケーション。

## 結論

インストールしてすぐ使いたい、設定とか面倒ならMagnet、
既定アニメーションは嫌だ！色も変えたい!など、多少手間でも拡張性を求めるならBetterSnapTool。

今Magnet安くなってるので、必要十分でコスパいいのはMagnetだと思う。（2018/04/25時点）


## 詳細

### Magnet

- 日本語
- 120円（セール中。2018/04/25時点）
- 初期設定でショートカットキー&ドラッグ操作あり
- 設定でショートカットキー変更できる
- 設定変更できるのはショートカットキーのみ

[![https://gyazo.com/f9d69fca31a558f43bb7664b47ac70ad](https://i.gyazo.com/f9d69fca31a558f43bb7664b47ac70ad.png =200x)](https://gyazo.com/f9d69fca31a558f43bb7664b47ac70ad)

### BetterSnapTool


- 英語
- 480円
- 初期設定はドラッグ操作のみ
- 設定でショートカットキーも追加できる
- 設定項目が豊富
	- アニメーション変えたり
	- 色変えたり
	- 指定したキー押してる時は機能しないようにしたり

[![https://gyazo.com/6e6c07b4877ba8d44dc39c3740949d5b](https://i.gyazo.com/6e6c07b4877ba8d44dc39c3740949d5b.png =300x)](https://gyazo.com/6e6c07b4877ba8d44dc39c3740949d5b)
gitコマンドTipsあれこれ（随時更新）

# アクティビティ

## 今月のユーザ別commit数ランキング

mergeコミットを除いたcommit数を多い順に並べます

```
git shortlog -sn --no-merges --after='date +%Y/%m/01' --before='date +%Y/%m/%d' | cat -n
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60056/15ef76d4-e9da-ef4a-dde9-f79f05575978.png)