OmniAICreator/Qiita-1.07M huggingface dataset:
rails newするときによく使うオプションと、rails newした後によく行う設定

こんにちは。
ブロックチェーン企業を辞めてニートになったじゅんや([@BoNingennnN](https://twitter.com/BoNingennnN))です。
私は個人開発が好きで、よくrails newをしています。
仕事でも、時々rails newをしてゼロイチを担当しています。

あまり需要がないかもしれませんが、私がrails newをする際によく指定するオプションと、rails newをした後によく行う設定についてメモがわりに書いていきます。

## rails newする際によく使うオプション
いきなりですが、私が最近rails newをした時に使ったコマンドを紹介します。
(１つ１つのオプションの説明は下に書きます。)

```
rails _5.2.2_ new appname --database=mysql --skip-test --skip-turbolinks --skip-bundle
```

これが私がよく使うrails newのコマンドです。
ここからはそれぞれのオプションについて１つずつ説明します。

### Railsのバージョンの指定
まず最初にRailsのバージョン指定についてです。

```
rails _5.2.2_ new appname
```

このようにすることで、Rails5.2.2でnewすることができます。
5.2.2の部分に好きなバージョンを入れることで、そのバージョンでnewできます。

### データベースの指定
rails newをする際に、何も指定しないと、データベースのデフォルトはsqliteになります。
もちろんrails newした後に変更することも可能ですが、すでにどのデータベースを使うか決まっている場合は最初に指定してしまいましょう。

```
rails new appname --database=mysql
```
これはmysqlを使う場合のコマンドです。Potgresqlを使いたいときは以下のコマンドでいけます。

```
rails new appname --database=postgresql
```

### turbolinksをオフにする
turbolinksを使うことで、ページ遷移する際に通常のページ移動ではなく、ajaxで取得したhtmlでbodyを入れ変えることでページ遷移を実現してくれます。
普通のページ遷移より素早く遷移ができるのが利点です。
turbolinksを使うと(document).ready()などが発動しないといったこともあり、一部の人に煙たがられています。笑
もしturbolinksをデフォルトでオフにする場合は以下のようにrails newをしましょう。

```
rails new appname --skip-turbolinks
```

### Minitestを生成しないようにする
Railsのプロジェクトを普通に作ると、Minitestがデフォルトで入ってきます。
Minitestを使う人であればこれで問題ないですが、もしテストはRSpecだよという人がいればMinitestが生成されないようにあらかじめ設定しておきましょう。

```
rails new appname --skip-test
```

## Railsのプロジェクトを作ってからすぐ行う設定
続いて、rails newをした後によく行う作業について書いていきます。

### localeを変更する
まずデフォルトのlocaleの設定をいじります。
ここでは、デフォルトの言語を日本語とし、英語対応も想定した設定とします。
またタイムゾーンは東京をデフォルトにします。
(ちなみに注意することとしては、本番サーバーのtimezoneも変更し忘れないようにすることです。私は本番サーバが世界標準時基準になってて色々つまずきました。)

``` ruby:config/application.rb
class Application < Rails::Application
  config.i18n.default_locale = :ja
  config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
  config.i18n.available_locales = [:en, :ja]
  config.time_zone = "Tokyo"
end
```

### RSpecを導入する
minitestを使わない代わりにRSpecを使います

``` :Gemfile
group :development, :test do
  gem 'rspec-rails'
end
```
RSpecの導入については別記事で詳しく書きます。
(書きました→[RailsにRspecをいれてモデルのテストを書いてみよう[初心者向け]](https://qiita.com/jun_jun_jun/items/1f342b111d5548a4e7dc))
とりあえず一旦ここまでにします。
また時間のあるときに加筆します🙇‍♂️
mrubyでの３０日開発日記（４日目）

#今日やること
* 数学大百科で数学を学ぶ
* ヒーローを読み込む
* mrubyで実装
* Cでメモリ管理の方法を学ぶ

#今日やったこと
* 数学
  * 朝と昼の時間のある時にやった。とりあえずスキマ時間にやるのがベスト。というのも、プログラミングはまとまった時間でないとコードを書くことができないので、数学はスキマ時間にやるようにしている。そうした方が自分としては会っている
* ヒーローの読み込みとCのメモリ
  * ヒーローを読んでいてstructの構文とメモリの管理の仕方がわからなかったので、「ポインタ完全攻略」でしらべながら読んだ。ポインタの使い方がわかった。ただ、```struct RClass* vector2;```がどうやって構造体のメモリを読んでいるのかがわからないから、明日調べてみる
 
#今日のコラム
　数学大百科辞典に空間認知能力というのは才能のようなものであると書かれていた。例えば、スポーツマンとか芸術家がそれに当てはまるらしい。そういう空間をはっきりと認知させるために訓練を重ねるのは重要らしい。
　それを鍛えるのにはFPSのようなゲームが効果的だと書かれていた。ということは、スプラテゥーンも何時間もやっていいということだな！
　それだけ頭にいいのなら、朝に目覚ましにゲームをするというのもありというとだな！
　というわけで、早起きできるようになるために朝一でゲームをするとどれだけさえるかをやってみます。明日、今日のコラムで報告します。

#参考資料
ヒーロー：https://github.com/elct9620/hiro

数学大百科事典：https://www.amazon.co.jp/%E6%95%B0%E5%AD%A6%E5%A4%A7%E7%99%BE%E7%A7%91%E4%BA%8B%E5%85%B8-%E4%BB%95%E4%BA%8B%E3%81%A7%E4%BD%BF%E3%81%86%E5%85%AC%E5%BC%8F%E3%83%BB%E5%AE%9A%E7%90%86%E3%83%BB%E3%83%AB%E3%83%BC%E3%83%AB127-%E8%94%B5%E6%9C%AC-%E8%B2%B4%E6%96%87/dp/4798156264

ポインタ完全攻略：
https://www.amazon.co.jp/%E6%96%B0%E3%83%BB%E6%98%8E%E8%A7%A3C%E8%A8%80%E8%AA%9E-%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5-%E6%98%8E%E8%A7%A3%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9F%B4%E7%94%B0-%E6%9C%9B%E6%B4%8B/dp/4797388536/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5&qid=1555422930&s=books&sr=1-1-catcorr

###Ciao!
VSCodeの「新規ファイル作成(cmd + n)」をカスタマイズする

# 前提

MacでVSCodeを使ってる方向けの記事です。

# はじめに

VSCodeにおける「cmd + n」での新規ファイル作成について、デフォルトだと「新しいタブで無題のファイルを作成し、保存するときに保存先を指定する」という挙動になっており、使いづらかった。

「現在のディレクトリに新しいファイルを作成し、その場でファイル名を指定して保存する」という挙動にする。

# 方法

1. VSCodeを起動したあと 「cmd + k」、「cmd + s」と押して「keyboard Shortcuts」を開く

2. 「keybindings.json」を開く
<img width="1203" alt="スクリーンショット 2019-04-16 22.27.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324456/2e87c550-f0eb-8f98-eb85-d19e15208bed.png">
右上のところです。

3.以下のように記述。

```json
[
  { "key": "cmd+n", "command": "explorer.newFile" }
  { "key": "ctrl+cmd+n", "command": "explorer.newFolder" }
]
```

４. おわり

これで、前述したような挙動をしながら「cmd+n」でファイル作成、「ctrl+cmd+n」でディレクトリ作成ができます。
また「cmd + n」のあとに「hoge/fuga/index.html」といった様な記述をすれば、階層構造のディレクトリとファイル群も簡単に作成できます。

キーバインディングについては他にも色々設定できるので、自分流にカスタマイズしていきましょう。何かオススメの設定などあればぜひ教えて下さい。

## 参考記事

stackoverflow:
https://stackoverflow.com/questions/39599514/vs-code-add-a-new-file-under-the-selected-working-directory
[Heroku] Private Space 内で自分自身の IPアドレスを特定する方法 [heroku-18 stack]

2日間、起きている間の80%はHeroku用の`buildpack`作ったり、負荷テストツールを動かすようにしてみたり、無理やり`slug`に入れて動かしてみたり無茶なことをしていたしょっさんです、こんばんわ。

今日、これからするお話は`Private Space`限定です。

---

2019/4/17(水)　追記

`HEROKU_PRIVATE_IP` [環境変数で定義](https://devcenter.heroku.com/articles/dyno-dns-service-discovery#environment-variables)されてるって教えてもらいました...。ああん、もう Devcenter 多くて困っちゃう。以下、元のネタです。こちらの紛糾ぶりも是非どうぞ。

---

# 自分自身のIPアドレスが知りたい!

タイトルからして、なにか悪いことをしようとしているのかと思ったらおおまちがいです。ひじょーに至極まっとうな理由があります。このコンテナ時代の世の中、自分自身に定義されている `hostname` と実際に外部からアクセスされるIPアドレスがまったく異なることは、よくあることです。

「それがどうした」「別にいいじゃないか」

そんなふうに考えていた時期が、俺にもありました(画像略)

Java RMIなどでは、自分自身のIPアドレスを指定して、待ち受けて起動するような仕様になっているものがあります。何も指定しないと、デフォルトでは`hostname`で解決されたIPアドレスを指定するようです。

実はHerokuでは`hostname`で設定されているホスト名が、コンテナ内部だけで利用されているホスト名のようで、コンテナの外からアクセスされるためのIPアドレスではない、内部用のIPアドレスが返ってきてしまいます。するとどうでしょう。別のDynoからそのアドレスで起動しているコンテナに対して接続する場合「ﾋｬｯﾊｰこのIPアドレスはnestしてやがるぜ!!」と言われて接続を拒否されます。切ないです。本人は受け入れる準備万端なのに、別のなにかに拒絶されてしまうんです。こんな悲しいことがあるでしょうか。

さて、じゃぁどうするかというと、`ip`コマンドで無理やり引っ張ってきます。HerokuのDyno(Heroku-18 Stackにおいて)では、IPアドレスが 3つ定義されています。例えば `heroku run ip addr` とでも実行すると、次のような結果(Private Spaceの場合)が返ってきます。`lo`,`eth0`,`eth1`が定義されています。ここでの`eth0`が`hostname`で定義されているホスト名に対してのIPアドレスです。

```:bash
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether b2:b5:e8:d2:fb:71 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.128.2/30 scope global eth0
       valid_lft forever preferred_lft forever
8: eth1@if4: <BROADCAST,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
    link/ether 06:94:0d:8c:48:2a brd ff:ff:ff:ff:ff:ff
    inet 10.0.134.102/20 scope global eth1
       valid_lft forever preferred_lft forever
```

したがって、われわれは、この`eth1`のIPアドレスを取得して、サーバーの Listen Address に設定してあげれば良さそうです。
ということで、Heroku上で`eth1`のIPアドレスを引っ張り込んでくるコマンド(例)は次のとおりです。

```:bash
ip -f inet -o addr show eth1 |awk '{print $4}' | cut -d '/' -f 1
```

Heroku [Private Space DNS Service Discovery](https://devcenter.heroku.com/articles/dyno-dns-service-discovery)を利用して、Private Space内部で特定の通信を行うとき、Private Space内のプライベート公開IPアドレスで`LISTEN`しないとならない場合には、このような形でIPアドレスを引っ張ってみてください。幸せになれると思います。

---

例えば、Private Space内で `JMeter` で Master/Slave 構成するときに必須になります...。
[RoR][勉強メモ]Deviceのユーザ登録失敗時の遷移先をカスタマイズ

# 記事の目的

- RailsでDeviceを利用した時に、ユーザ登録(signup)に失敗時の遷移先を変更したかったがハマった
- 対応方法を忘備録として記事にする
- 結論としてはDeviceのソースコードを読むことが大事

# 実現したかったこと
- 作成中のアプリケーションではトップページ(root)にユーザ登録フォームを配置
- root_pathにregistrations_controllerのnewアクションが設定されている
- トップページにはユーザのタイムライン投稿が表示されている

## トップページのイメージ
- トップ画面の左側にはタイムラインが表示
- 右側にはユーザ登録用のフォームが表示される
![スクリーンショット 2019-04-16 22.09.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179132/ad8188b1-0742-aa0d-85e5-29bba9e31c87.png)

## 処理のイメージ
![スクリーンショット 2019-04-16 22.25.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179132/08cd70a9-b6ef-a0ff-fd4b-7eb630c063bb.png)

- バリデーションに引っかかるとかユーザ登録失敗時にトップページへリダイレクトさせたかった
- プラスの要件としてnewメソッドを中継して描画させたい(newメソッドがタイムラインを取得する処理を担当しているため)

#　実装するに当たっての課題
- Deviceのregistrations_controller.rbの処理で失敗時にどのページをレンダリングorリダイレクトさせるのか分からなかった(=ただの調査不足)

# 解決方法
- registrations_controller.rbをオーバライドして失敗時のページ遷移を書き換えるだけだった

## registrations_controller.rbのcreateメソッドの処理
- オリジナルのcreateメソッドではこんな処理のしていました
- saveした後にレコードが存在してるいか最初のif分で判定している
- つまりコメント部分の処理をオーバーライドしてあげることで実現が可能になると考えた

```ruby:registrations_controller.rb
def create
    build_resource(sign_up_params)

    resource.save
    yield resource if block_given?
    if resource.persisted?
      if resource.active_for_authentication?
        set_flash_message! :notice, :signed_up
        sign_up(resource_name, resource)
        respond_with resource, location: after_sign_up_path_for(resource)
      else
        set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
        expire_data_after_sign_in!
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
      end
    else
      #登録失敗時の処理が記述されているっぽい場所
      clean_up_passwords resource
      set_minimum_password_length
      #登録失敗時のレスポンス処理
      respond_with resource
    end
  end

```


## 書き換え後のregistrations_controller.rbのcreateメソッドの処理
- 最後の```respond_with```を```redirect_to```に置き換えただけです
- これよってnewメソッド経由でトップページが再度描画されるようになります
 
```ruby:書き換え後createメソッド　
def create
    build_resource(sign_up_params)

    resource.save
    yield resource if block_given?
    if resource.persisted?
      if resource.active_for_authentication?
        set_flash_message! :notice, :signed_up
        sign_up(resource_name, resource)
        respond_with resource, location: after_sign_up_path_for(resource)
      else
        set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
        expire_data_after_sign_in!
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      set_minimum_password_length
      #書き換えた部分
      redirect_to action: 'new', flash:{error:"ユーザ登録に失敗しました"}
    end
  end
```

# 次の課題
- 現在はバリデーションエラーのメッセージを渡せていないため、ユーザ側ではどこが間違えているのか分からない不親切な処理となっている
- ```flash:{error: resource.errors.full_message}```とかうまく処理できないか検証する

# まとめ
- deviceの処理をカスタマイズしたい場合はgithubからコードを見るのが一番早い
【Unity(C#)】便利なReorderableListをスニペット機能でより便利に

##ReorderableList

ReorderableListを教えてもらったとき感動したのを覚えています。

その名の通り**順番を自由に並びかえられるリスト**をInspector上に作ることができます。
![ReorderableList.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/4a812a6a-3537-0376-e998-65f384021075.png)
`Element ` をドラッグして他の`Element`の位置に移動させると、
リストの番号も自動で入れ替わってくれます。



##サンプル

```C#:TestReorder
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;

public class TestReorder : MonoBehaviour
{
    [SerializeField,HideInInspector]
    public GameObject[] test_Obj;

#if UNITY_EDITOR
    [CustomEditor(typeof(TestReorder))]
    public class ExampleInspector : Editor
    {
        ReorderableList reorderableList;

        void OnEnable()
        {
            SerializedProperty prop = serializedObject.FindProperty("test_Obj");

            reorderableList = new ReorderableList(serializedObject, prop);

            reorderableList.drawElementCallback = (rect, index, isActive, isFocused) =>
            {
                SerializedProperty element = prop.GetArrayElementAtIndex(index);
                rect.height -= 4;
                rect.y += 2;
                EditorGUI.PropertyField(rect, element);
            };
        }

        public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            serializedObject.Update();
            reorderableList.DoLayoutList();
            serializedObject.ApplyModifiedProperties();
        }
    }
#endif
}
```

　　
　　
`[HideInInspector]`で二重にプロパティが表示されるのを防いでます。

```C#
 [SerializeField]
 [HideInInspector]
 public GameObject[] test_Obj;
```
無いとこうなります。
![ReorderableList_miss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/c78ee19e-68bf-06f8-44e7-81c0263fbd1e.png)

---
2019/04/23 追記
##Header,Elementの文字列変更
ReorderableListの`Serialized Property(Header)` ,`Element`を
任意の文字列に変更する方法の記事があまり無かったのでメモしておきます。

```C#:SerializedProperty(Header)を変更

reorderableList.drawHeaderCallback = (rect) =>
                     EditorGUI.LabelField(rect, "リストのたいとる");
```

```C#:Elementを変更
EditorGUI.PropertyField(rect, element,new GUIContent("お好きな要素名" + index));
```


##スニペット

とても便利なReorderableListですが、愚直に思い出して書くには少々長いです。
なので[**Visual Stadioのスニペット機能**](https://qiita.com/crasae/items/a5fcbb52ceaf89d3af33)を利用してその欠点を補いましょう。

![rol.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/a1d73e6f-dba1-f3d6-00a4-84b2a76826c2.png)

たった4文字で呼び出せました。最高。

---
2019/10/23 追記
[Snippet Designer](https://marketplace.visualstudio.com/items?itemName=vs-publisher-2795.SnippetDesigner)を使用した場合、
`$ $`で囲んだ箇所がスニペット呼び出し時に自動でフォーカスされ、呼び出し後の編集が楽ちんになります。

既存のスニペットを編集する際は、VSの左上の`ファイル`→`開く`→`ファイル`で編集したいスニペットを開けばOKです。

---
2019/05/12 追記

ReorderableListとPropertyDrawerを組み合わせると便利だよ～という記事を書きました。
→[ReorderableListでパラメータをひとまとめに](https://qiita.com/OKsaiyowa/items/4a0c8c92271b6ad128c7)
【Unity】イージングをかけながらフェードイン

**・DOTweenを使用する**

##フェードイン
```C#
gameObj.GetComponent<Graphic>().DOColor(new Color(1f, 1f, 1f, 1f), 1.0f)
.SetEase(Ease.OutExpo);
```

##フェードアウト
```C#
gameObj.GetComponent<Graphic>().DOColor(new Color(1f, 1f, 1f, 0f), 1.0f)
.SetEase(Ease.OutExpo);
```

##フェードアウトが完了したら要素を非表示に
```C#
gameObj.GetComponent<Graphic>().DOColor(new Color(1f, 1f, 1f, 0f), 1.0f)
.SetEase(Ease.OutExpo)
.OnComplete(HideComplete);

private void HideComplete()
{
   gameObj.SetActive(false);
}
```
カスタムcss？

# 字下げ
- 小説を読もう（https://yomou.syosetu.com/） の字下げなし小説をどうにかして字下げしたい。

# カスタムCSS
```css
p{
  text-indent: 1em;
  margin-top: 10px;
}
br {
  display: none;
}
```
zipimport.ZipImportError: can't decompress data; zlib not availableのエラー対応

pyenvでpython3.7.1を入れようとしたらエラー。

# 解決策

```bash
xcode-select --install
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```

# 環境
- MacOS Mojave
- pyenv 1.2.2-1911-gabd44699

# エラー内容

```bash
python-build: use readline from homebrew

BUILD FAILED (OS X 10.14.3 using python-build 1.2.2-1911-gabd44699)

Inspect or clean up the working tree at /var/folders/mm/4xnvp8jx50g2dqypgw71zftc0000gn/T/python-build.20190416220909.73004
Results logged to /var/folders/mm/4xnvp8jx50g2dqypgw71zftc0000gn/T/python-build.20190416220909.73004.log

Last 10 log lines:
  File "/private/var/folders/mm/4xnvp8jx50g2dqypgw71zftc0000gn/T/python-build.20190416220909.73004/Python-3.7.1/Lib/ensurepip/__main__.py", line 5, in <module>
    sys.exit(ensurepip._main())
  File "/private/var/folders/mm/4xnvp8jx50g2dqypgw71zftc0000gn/T/python-build.20190416220909.73004/Python-3.7.1/Lib/ensurepip/__init__.py", line 204, in _main
    default_pip=args.default_pip,
  File "/private/var/folders/mm/4xnvp8jx50g2dqypgw71zftc0000gn/T/python-build.20190416220909.73004/Python-3.7.1/Lib/ensurepip/__init__.py", line 117, in _bootstrap
    return _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/mm/4xnvp8jx50g2dqypgw71zftc0000gn/T/python-build.20190416220909.73004/Python-3.7.1/Lib/ensurepip/__init__.py", line 27, in _run_pip
    import pip._internal
zipimport.ZipImportError: can't decompress data; zlib not available
```

# 参考
- https://qiita.com/zreactor/items/c3fd04417e0d61af0afe
- https://qiita.com/fuppi/items/8af4f301527ca2402384
Atomでのvue開発時、ESLint & Prettierで自動lint + 整形を行う

## この記事の目的
AtomでVueを使う開発をする時、ファイル保存時にlintとコード整形を走らせる為の設定を行ったので、メモしておきます。
最終的な成果物は[このように](https://github.com/linkqotto/auto-lint-format-template)なります

## PrettierとESLint
[Prettier](https://github.com/prettier/prettier)はフォーマッティングツールで、コードの整形を行うツールです。行うのはあくまで整形のみなので、
エラーやバグになるであろう箇所を教えてくれるEslintと共に使います。
[ESLint](https://github.com/eslint/eslint)はJavaScriptで使われるlintツールで、設定したルールに基づきコードを静的解析し、ルールに違反した箇所を教えてくれるツールです。
また--fixオプションを付ける事で、可能な部分については自動修正してくれます。
今回はprettierのコード整形とEslintの静的解析を、Atomでのファイル保存時に自動で行ってくれるような環境を構築します。

## vue-cliでVueプロジェクトの作成
 まずvue-cliでVueプロジェクトを作成する所から始めます。作成した時点でeslintが一緒にインストールされるので、以下のコマンドでprettierをインストールします。
`yarn add prettier`

## eslint-plugin-prettierとeslint-config-prettierのインストール
 次に、[eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier)と[eslint-config-prettier](https://github.com/prettier/eslint-config-prettier)をインストールします。それぞれ何をするパッケージなのか説明します。
#### eslint-plugin-prettier
 prettierをeslintのruleとして実行するプラグインです。このプラグインをインストールしてeslintを実行すると、コードの形が崩れている所をissueとして教えてくれます。--fixオプションを指定して実行すると自動修正してくれるので、結果的にコードが整形されます。
#### eslint-config-prettier
 上記のようにしてeslintとprettierを同時に実行するとそれぞれが持っているフォーマットに関するルールが被ってしまう事があります。それを避ける為のプラグインがeslint-config-prettierです。これはprettierとルールが被ったり必要なかったりするeslintのルールを単純にオフにします。
#### インストール
それぞれ以下のようにしてインストールします。
`yarn add eslint-plugin-prettier`
`yarn add eslint-config-prettier`

#### .eslintrc.js
 これらのプラグインを使う為の設定を.eslintrc.jsに書きます。.eslintrc.jsはeslintで使うルールやプラグインを記述するファイルです。

```javascript:.eslintrc.js
module.exports = {
  root: true,
  env: {
    browser: true
  },
  extends: [
    // eslintが用意したjsに関するルール
    "eslint:recommended",
    // vueのtemplate部分に関するルール。これはeslint-plugin-vueというプラグインで、vue-cliでプロジェクトを作るとデフォルトでインストールされる
    "plugin:vue/recommended",
    // eslint-plugin-prettier
    "plugin:prettier/recommended",
    // eslint-config-prettier
    "prettier",
  ],
  rules: {
    "no-console": "off",
    "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off",
    // 要素に指定した属性の数が設定値を超えると複数行に分けて書けというルールをオフにする
    "vue/max-attributes-per-line": "off",
  },
  parserOptions: {
    parser: "babel-eslint"
  }
}
```

extendsに使用するプラグイン等を列挙します。eslint-config-prettierはルールをオーバライドする必要があるので最後に書きます。
rulesは各ルールに関する詳細なオプションを記述します。`"vue/max-attributes-per-line"`は「要素に設定された属性の数が設定値を超えると、複数行に分割して書く」というルールです。これがprettierの設定と衝突しているようなのでオフにします。eslint-config-prettierには、eslint-plugin-vueと被るルールをオフにする`"vue/prettier"`が含まれていますが、vue/max-attributes-per-lineをオフにするだけで十分だと思います。
ここまで設定すると、以下のコマンドを叩く事でlintとコードの整形を行うことが出来ます
`./node_modules/.bin/eslint --fix <パス>`

## Atomでファイル保存時にeslintを走らせる
 linter-eslintというAtomのプラグインをインストールします。このプラグインの設定画面に行くと、上部にeslintを走らせる対象となるファイルの拡張子一覧があるので、そこに`text.html.vue`を追加します。
 次に、「Automatic Fixes」の「Fix errors on Save」にチェックを入れます。
 最後に「Global ESlint」の「.eslintrc Path」に.eslintrc.jsのパスを入力します。
 これで.vueファイル保存時にlintと整形が行われます

## 参考にしたページ
* [Atom & Vue.js & ESLint で自動整形環境構築](https://qiita.com/taiju59/items/326bb25814f60ecf9c3c#comment-cb290903c35d740ac155)
* [Formatting Vue.js Code with ESLint & Prettier ← Alligator.io](https://alligator.io/vuejs/vue-eslint-prettier)
* [linter とフォーマッター - HackMD](https://hackmd.io/s/ryo9NvYSV)
Unity Inputのポインティングディバイス座標系

## 画面左下原点シリーズ

* CanvasのGlobal座標（`rectTranform.postion`）
* `Input.mousePosition`
* `Input.GetTouch(num).postion`
* `Mouse.currnt.postion.ReadValue()`
* ` Touchscreen.current.primalyTouch.postion.ReadValue()`

## 画面左上原点

* ` Touchscreen.current.postion.ReadValue()`

# 検証MEMO

因みに、PCではTouchscreenが、スマンホホではMouseがnullが返ってくる。
押していないときにはnullになるとかない（`if(Input.touchCount>0)`とか要らない）

```cs
using System.Text;
using UnityEngine;
using UnityEngine.Experimental.Input;


public class InputTest : MonoBehaviour
{
    void Update()
    {
        var mouse = Mouse.current;
        var mPhase = mouse?.phase?.ReadValue();
        var mButton = mouse?.leftButton?.isPressed;
        var mPos = mouse?.position?.ReadValue();
        var touch = Touchscreen.current;
        var tPhase = touch?.phase?.ReadValue();
        var tPos = touch?.position?.ReadValue();
        var touchP = Touchscreen.current?.primaryTouch;
        var tpPhase = touchP?.phase?.ReadValue();
        var tpPos = touchP?.position?.ReadValue();
        Debug.Log($"{mouse} {mPhase} {mButton} {mPos} / {touch} {tPhase} {tPos} / {touchP} {tpPhase} {tpPos}");
    }
}
```


# 実用MEMO

MouseもPhaseが取れればいいだが…一応メンバはある（`Mouse.current.phase`）が常にNoneなので注意。

```cs
PointerPhase phase;
Vector2 pos;
// #if ~ #endif はOmnSharpがたまにバグるのであまり好きじゃない
if(Application.platform == RuntimePlatform.Android
    || Application.platform == RuntimePlatform.IPhonePlayer)
{
    phase = Touchscreen.current.primaryTouch.phase.ReadValue();
    pos = Touchscreen.current.primaryTouch.position.ReadValue();
}
else
{   
    phase = 
        Mouse.current.leftButton.wasPressedThisFrame ? PointerPhase.Began :
        Mouse.current.leftButton.isPressed ? PointerPhase.Stationary :
        Mouse.current.leftButton.wasReleasedThisFrame ? PointerPhase.Ended :
        PointerPhase.None;
    pos = Mouse.current.position.ReadValue();
}

if(phase == PointerPhase.Began)
{
     // 押された瞬間
}
else if(phase == PointerPhase.Stationary || phase == PointerPhase.Moved)
{
     // 押してる間（押された瞬間を除く）
}
else if(phase == PointerPhase.Ended)
{
     // 離した瞬間
}
else // Cancelled || None
{
     // 離されているあいだ（話した瞬間を除く）
}
```

# 参考
[Namespace UnityEngine.Experimental.Input](https://docs.unity3d.com/Packages/com.unity.inputsystem@0.1/api/UnityEngine.Experimental.Input.html)
ベイズの定理を図で考えてみる

#ベイズの定理を図で考えてみる

ベイズの定理は以下のようになりますが、私が読んだ本では単なる式変形で導いていたので、それを図で考えてみる。

```math
P(A | B)=\frac{P(B | A) P(A)}{P(B)}
```

A,Bが以下の図の関係にあるとします。
![A&B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/9d428dad-ff54-21b9-c9d0-0cacd845d701.png)
この時、P(A),P(B),P(A|B),P(B|A)は次のように表せる。
![AB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/3ac00520-bdcc-21af-fe85-31fbd7addf60.png)
これらをベイズの定理に代入してみる。
![answer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/e0dae486-b2e3-d836-801e-8d83761cd710.png)

訳わからなくなったら、図で考えてみるのもいいかもね。
VueでCANVASを動的にリサイズするとコンテンツ全消えしてムカつく

#VueでCanvasを使う
Vueファイルの中でCanvasを使っている場合、てゆーかVueじゃなくてもCanvasを使う場合は実際のコンテンツはmount()なり任意のタイミングで動的に描画さていると思います。たとえば以下のような感じ。

```vue:描画される例
<template>
    <canvas id="canv" height="100" width="100"></canvas>
</template>

<script>
export default Vue.extend({
    data: () => ({
    }),
    mounted(): void {
        var ctx = document.getElementById("canv").getContext("2d");
        ctx.fillText('hoge', 10, 10);
    }
});
</script>
```

結果、狙ったとおりに「hoge」とテキストが描画される。ここまでは問題ない。


#モデルをバインドしたらCanvasのコンテンツ消えた
さて、ではCanvasのサイズを動的に変えたくなっちゃったらどうしよう。width、heightプロパティをVueオブジェクトのdataのメンバにバインドするのが良さそうだと思いついた。こんな感じ。＊random()は任意の数値を返す関数だとする

```vue:モデルを経由すると描画されない例
<template>
    <canvas id="canv" :height="h" :width="w"></canvas>
</template>

<script>
export default Vue.extend({
    data: () => ({
        h: 100,
        w: 100,
    }),
    mounted(): void {
        this.h = 100 * random();
        this.w = 100 * random();
        var ctx = document.getElementById("canv").getContext("2d");
        ctx.fillText('hoge', 10, 10);
    }
});
</script>
```

実行してみると、なんと「hoge」が描画されないのだ・・！



#別描画スレッドにするべし
結論、VueのDOMがマウントされる本流のスレッドと、fillText()の描画スレッドとを別にしてあげると無事描画された。いろんな方法はありそうだけどとりあえずsetTimeout()で10ms遅延でasyncに描画。めちゃくちゃハマったので思わず投稿！

```vue:モデルを経由し描画される例
<template>
    <canvas id="canv" :height="h" :width="w"></canvas>
</template>

<script>
export default Vue.extend({
    data: () => ({
        h: 100,
        w: 100,
    }),
    mounted(): void {
        this.h = 100 * random();
        this.w = 100 * random();
        setTimeout(() => {
            var ctx = document.getElementById("canv").getContext("2d");
            ctx.fillText('hoge', 10, 10);
        }, 10);
    }
});
</script>
```

一見落着！



＊ちなみにサンプルコードは説明用にデフォルメしておりそのままでは動きません。
C言語の規定されていない動作

## はじめに

C言語の規定されていない動作について調べたことを覚書として残しておく。



## 調べた結果

[ISO/IEC 9899:1999（原文）](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf)、[（和文）](<https://kikakurui.com/x3/X3010-2003-01.html>)にて定義されていることを知る。

恥ずかしながら初めて見ました。(Ｃ言語を使って10年ぐらいしますが、、、)



##### ◇ 処理系定義の動作

- 定義：「3.4.1 implementation-defined behavior」章
- 動作一覧：「Annex J」 J.3 章
- コンパイルができて、その動作に再現性がある。



##### ◇ 文化圏固有動作

- 定義：「3.4.2 locale-specific behavior」章
- 動作一覧：「Annex J」 J.4 章
- コンパイルができて、その動作に再現性がある。



##### ◇ 未定義の動作

- 定義：「3.4.3 undefined behavior」章
- 動作一覧：「Annex J」 J.2 章
- コンパイルはできないかもしれないし、その動作に再現性がないかもしれない。（何の保証もない）



##### ◇ 未規定の動作

- 定義：「3.4.4 unspecified behavior」章
- 動作一覧：「Annex J」 J.1 章
- コンパイルはできるが、その動作に再現性はないかもしれない。



## まとめ

上記のコードは環境依存のため移植性が低くなるため注意が必要。

特に「未定義の動作」と「未規定の動作」はバグのもとになるため避けたほうが良い。

開発する前にコンパイルのユーザーマニュアルを見る習慣をつける。



### 参考

[C言語 デバッグ完全解説](<https://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E-%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E5%AE%8C%E5%85%A8%E8%A7%A3%E8%AA%AC-Gihyo-Technology-%E5%9D%82%E4%BA%95/dp/4774133620>)

[付録 C 処理系定義の動作について - IPA](https://www.ipa.go.jp/files/000045165.pdf)
Raspberry Pi3にmjpg-streamerを入れる

#はじめに
 書きつくされている内容だと思うが自分用に書き残す．
#mjpg-streamerとは
 mjpg-streamerはカメラの映像をストリーミング配信するために使う．今回はローカル環境での設定を紹介する．
#環境
* Raspberry Pi3 model B
* OS : raspbian 9.6

#インストール
```
$ cd ~
$ sudo apt-get install -y cmake libv4l-dev libjpeg-dev imagemagick
$ git clone https://github.com/jacksonliam/mjpg-streamer.git
$ cd mjpg-streamer/mjpg-streamer-experimental
$ sudo make
$ sudo make install
$ sudo cp -r www /var/www
```
#実行
適当にスクリプトを組んで実行する．640x480のところで解像度を指定する．

```bash:run.sh
sudo ./mjpg_streamer -i "./input_uvc.so -f 10 -r 640x480 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080 -c admin:password"
```
```
sudo bash run.sh
```
#最後に
640×480の画質でfpsはおよそ10くらいだった．簡単なのが何よりもありがたい．
#参考
[RasPi:MJPG-streamer動画配信で遊んでみた♬](https://qiita.com/MuAuan/items/b3abd4cff2f39aa1f2d0)
laravel メール認証(EmailVerification)で認証ボタンを押すと403エラー 本番環境のhttpsでのみ発生

#この記事について
今回、初めてのwebアプリケーション作成にあたって、デプロイ後、最後の最後にメール認証で大ハマりしたので備忘録として残しておきます。
このエラーは皆はなぜおきないのだろう？と不思議になるくらい情報が少なかったり、自分にとっては有益でないものばかりでした。
ちなみに最終的に解決に繋がったのはこちらの記事です。
↓
https://laracasts.com/discuss/channels/laravel/hitting-403-page-when-clicking-verify-link-in-email-using-new-laravel-verification-57?page=1


#メール認証が本番環境(https)でのみ403エラーになる
題名の通りです。新規ユーザー登録等を行った際に”全ての機能を利用するためにはメール認証が必要”というwebサービスでよくある機能を"EmailVerification"というlaravel標準のパッケージを利用して実装しました。
開発環境では届いたメールの認証ボタンを押すと、問題なく認証される(localhost:8000)のですが、本番環境のherokuでは認証されず403エラー。ちなみにお名前.comにて独自ドメインを取得しており、heroku内でGUIにてSSL証明書も発行済みです。
![スクリーンショット 2019-04-16 20.49.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367959/5ca6d1f9-eb1e-461b-1816-7b069993c049.png)


#さっさと結論
とりあえず結論としては私の場合は下記のようにMiddlewareのTrustProxies.phpで２点変更する事で解決しました。

TrustProxies.php

    protected $proxies = '*';

    protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB;
※ laravelのバージョンによっては $proxies='**'; とする必要があるみたいです。
　IPを指定する方法もあるみたいです。
　後、未確認ですが $headers の方は変更しなくても大丈夫かもしれません。

#考察
改めてheroku logs等で403エラー部分を確認してみると、httpsではなくhttpに変換されています。信用できるプロキシを自分で追記してやる必要があるみたいですね。
ロードバランサが関係していそうです(定かではありません)。herokuアプリへのリクエストをロードバランスしながら降りけるとかなんとか...
そもそもSSL証明をheroku上ではなく、ドメイン取得時にSSL証明書を取得していれば上記コードの変更は不要だったということも考えられます。
ちなみに下記はlaravelの公式ドキュメントです。

> TLS／SSL証明を行うロードバランサの裏でアプリケーションが実行されている場合、アプリケーションが時々HTTPSリンクを生成しないことに、気づくでしょう。典型的な理由は、トラフィックがロードバランサにより８０番ポートへフォワーディングされるため、セキュアなリンクを生成すべきだと判断できないからです。
>
>これを解決するには、Laravelアプリケーションに含まれている、App\Http\Middleware\TrustProxiesミドルウェアを使用します。これでアプリケーションにとって信用できるロードバランサやプロキシを簡単にカスタマイズできます。信用できるプロキシをこのミドルウェアの$proxiesプロパティへ配列としてリストしてください。信用するプロキシの設定に加え、オリジナルリクエストに関する情報を含む、プロキシから送られて来るヘッダも設定できます。

引用： https://readouble.com/laravel/5.5/ja/requests.html#configuring-trusted-proxies

#おまけ
①httpsが関係していると気付いたのはherokuの環境変数設定で”developement”を指定してみた際に、問題なく認証されたことがきっかけでした。

コマンド

    $ heroku config:set APP_ENV="development"

元に戻す時

    $ heroku config:set APP_ENV="production"


<hr>


②こちらはルーティングの設定ですが、お忘れなく。

web.php

    Auth::routes(['verify' => true]);
GitHub - 関連するツール・サービス #6

### hubコマンド
gitコマンドをラップする形で、GitHubをコマンドラインから簡単に利用することができます。

### Travis CI
CI(継続的インテグレーション)・・・開発者がコミットする度に自動化されたビルドとテストを実行し、品質を保ちます。

### Coveralls
継続的インテグレーションで、実行された自動テストのテストカバー率をリポートする。

### Gemnasium
ソフトウェアが使用しているライブラリなどのバージョンが最新かを教えてくれる。

### Jenkins
継続的インテグレーションサーバ。
Pull Requestをトリガーとして、自動的にテストを実行し、テスト結果をGitHubに通知できる。
seabone

# インストール（windowsの場合）
```pip install seaborn```

# せっかくなので　インストールログ（windows7 64bit）
```none

>pip install seaborn
Collecting seaborn
  Downloading https://files.pythonhosted.org/packages/a8/76/220ba4420459d9c4c9c9587c6ce607bf56c25b3d3d2de62056efe482dadc/seaborn-0.9.0-py3-none-any.whl (208kB)
    100% |████████████████████████████████| 215kB 1.6MB/s
Requirement already satisfied: matplotlib>=1.4.3 in c:\users\ap\appdata\local\programs\python\python37\lib\site-packages (from seaborn) (3.0.3)
Collecting scipy>=0.14.0 (from seaborn)
  Downloading https://files.pythonhosted.org/packages/58/f0/d00c0e01e077da883f030af3ff5ce653a0e9e4786f83faa89a6e18c98612/scipy-1.2.1-cp37-cp37m-win_amd64.whl (30.0MB)
    100% |████████████████████████████████| 30.0MB 226kB/s
Requirement already satisfied: pandas>=0.15.2 in c:\users\ap\appdata\local\programs\python\python37\lib\site-packages (from seaborn) (0.24.2)
Requirement already satisfied: numpy>=1.9.3 in c:\users\ap\appdata\local\programs\python\python37\lib\site-packages (from seaborn) (1.16.2)
Requirement already satisfied: kiwisolver>=1.0.1 in c:\users\ap\appdata\local\programs\python\python37\lib\site-packages (from matplotlib>=1.4.3->seaborn) (1.0.1)
Requirement already satisfied: python-dateutil>=2.1 in c:\users\ap\appdata\local\programs\python\python37\lib\site-packages (from matplotlib>=1.4.3->seaborn) (2.8.0)
Requirement already satisfied: cycler>=0.10 in c:\users\ap\appdata\local\programs\python\python37\lib\site-packages (from matplotlib>=1.4.3->seaborn) (0.10.0)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in c:\users\ap\appdata\local\programs\python\python37\lib\site-packages (from matplotlib>=1.4.3->seaborn) (2.4.0)
Requirement already satisfied: pytz>=2011k in c:\users\ap\appdata\local\programs\python\python37\lib\site-packages (from pandas>=0.15.2->seaborn) (2019.1)
Requirement already satisfied: setuptools in c:\users\ap\appdata\local\programs\python\python37\lib\site-packages (from kiwisolver>=1.0.1->matplotlib>=1.4.3->seaborn) (40.8.0)
Requirement already satisfied: six>=1.5 in c:\users\ap\appdata\local\programs\python\python37\lib\site-packages (from python-dateutil>=2.1->matplotlib>=1.4.3->seaborn) (1.12.0)
Installing collected packages: scipy, seaborn
Successfully installed scipy-1.2.1 seaborn-0.9.0
```

# 書いたグラフ
![graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222636/4f01f737-c84b-c9c0-8793-4d5643b15be1.png)

# 参考
http://nopnop2002.webcrow.jp/flask_python/flask_python-5.html
The Buildroot user manual Chapter 16. Adding support for a particular board 日本語訳

原文: https://buildroot.org/downloads/manual/manual.html#adding-board-support

# Chapter 16. Adding support for a particular board - 特定のボードに対するサポートを追加する

> Buildroot contains basic configurations for several publicly available hardware boards, so that users of such a board can easily build a system that is known to work. You are welcome to add support for other boards to Buildroot too.

Buildrootにはいくつかのポピュラーなハードウェアボードの基本的な設定が含まれているので、そのようなボードのユーザーはシステムを簡単に構築することができます。Buildrootにも他のボードのサポートを追加することも歓迎です。

> To do so, you need to create a normal Buildroot configuration that builds a basic system for the hardware: toolchain, kernel, bootloader, filesystem and a simple BusyBox-only userspace. No specific package should be selected: the configuration should be as minimal as possible, and should only build a working basic BusyBox system for the target platform. You can of course use more complicated configurations for your internal projects, but the Buildroot project will only integrate basic board configurations. This is because package selections are highly application-specific.

そのためには、当該のハードウェア向けの基本システムを構築する、通常のBuildroot設定を作成する必要があります。ツールチェーン、カーネル、ブートローダー、ファイルシステム、そして単純なBusyBoxのみのユーザースペースです。特定のパッケージを選択する必要はありません。構成はできるだけ最小限に抑え、ターゲットプラットフォーム用の実用的な基本的なBusyBoxシステムのみを構築する必要があります。もちろん、あなた自身のプロジェクト向けにもっと複雑な設定を使うことができます。しかしBuildrootプロジェクトは基本的なボード設定だけを統合するでしょう。これは、パッケージの選択がアプリケーション固有のものであるためです。

> Once you have a known working configuration, run `make savedefconfig`. This will generate a minimal defconfig file at the root of the Buildroot source tree. Move this file into the `configs/` directory, and rename it `<boardname>_defconfig`.

設定が固まったら、`make savedefconfig`を実行してください。これにより、Buildrootソースツリーのルートに最小限のdefconfigファイルが生成されます。このファイルを `configs/`ディレクトリに移動し、名前を `<boardname> _defconfig`に変更してください。

> It is recommended to use as much as possible upstream versions of the Linux kernel and bootloaders, and to use as much as possible default kernel and bootloader configurations. If they are incorrect for your board, or no default exists, we encourage you to send fixes to the corresponding upstream projects.

Linuxカーネルとブートローダーのできるだけ上流のバージョンを使用し、デフォルトのカーネルとブートローダーの設定をできるだけ使用することをお勧めします。 それらがあなたのボードにとって正しくないか、デフォルトが存在しない場合は、対応するアップストリームプロジェクトに修正を送ることをお勧めします。

> However, in the mean time, you may want to store kernel or bootloader configuration or patches specific to your target platform. To do so, create a directory `board/<manufacturer>` and a subdirectory `board/<manufacturer>/<boardname>`. You can then store your patches and configurations in these directories, and reference them from the main Buildroot configuration. Refer to Chapter 9, Project-specific customization for more details.

ただし、あなたの修正がアップストリームに取り込まれるまでは、ターゲットプラットフォームに固有のカーネルまたはブートローダの設定またはパッチを保存することをお勧めします。そのためには、ディレクトリ `board/<manufacturer>`とサブディレクトリ `board/<manufacturer>/<boardname>`を作成してください。その後、パッチと設定をこれらのディレクトリに保存し、メインのBuildroot設定からそれらを参照できます。詳細は9章プロジェクト固有のカスタマイズを参照してください。
DynamoDBのバックアップ・リストアを試す

##はじめに

バックアップ・リストアを実施してみます。

##やってみた
テーブルを作ってアイテムを作成する。

###バックアップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/1c544b57-c790-427a-ab8c-c16da20a5c05.png)

バックアップを作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/10cb354f-0f15-5fd8-043f-c4721182c3fd.png)

作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/75167a63-ecc7-7616-148c-12392dbb3986.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/ec288724-b7be-37f5-a9bb-614d3710ff5a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/a45f2f3f-f7eb-a0e6-6489-87badc26a326.png)

###リストア
バックアップの復元をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/dfc8c6d2-073c-af71-96b5-95b70d45e60e.png)

テーブルの復元をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/a31b36e4-87af-adb3-52d7-7c31d3bdf966.png)

(復元中)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/2d65f3da-dbd4-3a9a-5820-c1361e8c1c2b.png)

復元完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/69fb3d2f-e242-9637-eef2-1a9c145eb87f.png)

##お約束
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
悩んで学べるGitクイズ

## 第1問：オフラインでのgit commit
あるファイルの修正を反映させるために、git commit しようとすると
突然ネットの接続が切れてしまった。git commitできる？できない？


<pre>
//想定
$ mkdir testgit
$ cd testgit
$ git init
Initialized empty Git repository in /Users/john/testgit/.git/
$ echo "aaa" > test1.txt
$ git add .

（ここでオフラインになる）

$ git commit -m "first"
</pre>

## 第2問：GitとGitHubでの設定項目
gitの初期設定で、下記のように名前とメールアドレスを設定した。ところがその後、GitHubの鍵の設定をしていると、「<b>GitとGitHubで登録しているメールアドレスが異なる</b>」ことに気づいた。果たしてこの状態でGitHubに、git pushできる？


・git上のメールアドレス設定：johndoe@gmail.com

```shell
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@gmail.com
```

・GitHub上のメールアドレス設定：johndoe@yahoo.co.jp
![スクリーンショット 2019-04-16 20.21.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247390/0194edad-49cf-bc88-c11d-cf625b2e7edb.png)




## 第3問：Gitの原理
あるファイルをコミットした後に、修正を加えてまたコミットした。このときGitは「最初のファイルの内容とその差分を記録している」正しい？間違い？

・想定
<pre>
$ mkdir testgit
$ cd testgit
$ git init
Initialized empty Git repository in /Users/john/testgit/.git/
$ echo "aaa" > test1.txt
$ git add .
$ git commit -m "first"
[master (root-commit) 9d84b43] first
 1 file changed, 1 insertion(+)
 create mode 100644 test1.txt
$ echo "ccc" >> test1.txt
$ cat test1.txt
aaa
ccc
$ git add .
$ git commit -m "second"
[master 9bc7d83] second
 1 file changed, 1 insertion(+)
</pre>

## 第4問：画像のバージョン管理
ある画像ファイルをコミットした後に、修正を加えてもう一度コミットした。git checkoutで前のバージョンに戻った場合、修正前のファイルに戻っている？戻っていない？

```shell
$ mkdir image_test
$ cd image_test
$ git init
Initialized empty Git repository in /Users/john/image_test/.git/
$ curl -O http://cdn.keyakizaka46.com/images/14/a2c/e88af999620f2821c130062584f87/400_320_102400.jpg
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 15898  100 15898    0     0   322k      0 --:--:-- --:--:-- --:--:--  323k
$ ls
400_320_102400.jpg
$ open 400_320_102400.jpg 
$ git add .
$ git commit -m "first"
[master (root-commit) 68188ea] first
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 400_320_102400.jpg
$ sips -f horizontal 400_320_102400.jpg 
/Users/user/image_test/400_320_102400.jpg
<CGColor 0x7ff0937040c0> [<CGColorSpace 0x7ff093503340> (kCGColorSpaceDeviceRGB)] ( 0 0 0 1 )
  /Users/john/image_test/400_320_102400.jpg
$ open 400_320_102400.jpg 
$ git add .
$ git commit -m "second"
[master 9d5ca29] second
 1 file changed, 0 insertions(+), 0 deletions(-)
 rewrite 400_320_102400.jpg (95%)
$ git log
commit 9d5ca29d65ac1dc549a8341ac8dfb5ff25d2fa9d (HEAD -> master)
Author: johndoe <johndoe@gmail.com>
Date:   Wed Apr 17 14:01:08 2019 +0900

    second

commit 68188ea3265e0b4a6cfb7f5e5d2954cc7b35291a
Author: johndoe <johndoe@gmail.com>
Date:   Wed Apr 17 14:00:03 2019 +0900

    first
$ git checkout 68188ea3265e0b4a6cfb7f5e5d2954cc7b35291a

(前のバージョンの画像に戻る？)
```
変更前
![スクリーンショット 2019-04-17 14.12.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247390/5fd9319b-40a7-a7c4-5ded-ac64f8b1115f.png)
変更後
![スクリーンショット 2019-04-17 14.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247390/8b3575fb-e7e2-7f90-0549-9ec3b3680271.png)
JestのbeforeEachの実行順について

JestのbeforeEachの実行順についてです。

```js

describe('beforeEachの実行順確認1', () => {
  beforeEach(() => {
    console.log('aaa')
  });
  describe('グループ1', () => {
    beforeEach(() => {
      console.log('bbb')
    });
    it('テスト1', () => {
      console.log('ccc')
    });
    it('テスト2', () => {
      console.log('ddd')
    });
  });
  describe('グループ2', () => {
    it('テスト3', () => {
      console.log('eee')
    });
  });
});
describe('beforeEachの実行順確認2', () => {
  beforeEach(() => {
    console.log('fff')
  });
  it('テスト4', () => {
    console.log('ggg')
  });
});
```

下記、結果です。親のdescribeから実行されます。

```
beforeEachの実行順確認1
  グループ1
    ✓ テスト1 (44ms)
    ✓ テスト2 (17ms)
  グループ2
    ✓ テスト3 (6ms)
beforeEachの実行順確認2
  ✓ テスト4 (3ms)

console.log index.test.js:22
  aaa #テスト1
console.log index.test.js:26
  bbb #テスト1
console.log index.test.js:29
  ccc #テスト1
console.log index.test.js:22
  aaa #テスト2
console.log index.test.js:26
  bbb #テスト2
console.log index.test.js:32
  ddd #テスト2
console.log index.test.js:22
  aaa #テスト3
console.log index.test.js:37
  eee #テスト3
console.log index.test.js:43
  fff #テスト4
console.log index.test.js:46
  ggg #テスト4
```
メモ：grepによる正規表現のキャプチャ出力

- アクセスログファイルなどから、正規表現でマッチした文字列のみ取り出したい場合、perlやらawkなどを使ったりするが、grepでも文字列のキャプチャであればオプションで可能だ。

```
egrep -o 'token=[0-9a-zA-Z]*' access.csv
```
Jupyter Notebookで綺麗なDataFrameを簡単に表示する(複数可)

こちらの記事を参考にさせていただきました。
[Jupyter notebookでpandasのDataFrameを綺麗に表示させる方法 \- Qiita](https://qiita.com/hrsma2i/items/3970410d289542c5386c)

この記事の

>なお、 jupyte_notebook_config.py に、デフォルトで設定する方法があるらしく、 この記述すら、毎回書かなくて済むらしい。

とある部分です。その具体的なやり方を説明します。

# （１） IPython profileを生成する
まず、こちらにもあるようにterminalで
[Python Tips：IPython の起動時に特定の処理を走らせたい \- Life with Python](https://www.lifewithpython.com/2015/02/python-run-specific-process-when-IPython-starts.html)

```
ipython profile create
```
を入力。JupyterNotebookはIPythonを元に作られているので、普通にこちらのコマンドが使えます。

# （２） 生成されたファイルに設定を書き込む
次にホームディレクトリ以下に生成された.ipython/profile_defaultの中にあるipython_config.pyファイルを編集します。

その中に、

```python
c.InteractiveShell.ast_node_interactivity = "last_expr" #defaultの設定
```
と書いてある部分があるのでこちらを

```python
c.InteractiveShell.ast_node_interactivity = "all"
```

これで変数名を記述するだけで複数のDataFrameを綺麗に表示できます。

```
(略)
df1
df2
```
みたいな感じで。

お疲れさまでしたー
401 => Net::HTTPUnauthorized for https　スクレイピングで認証拒否された時

スクレイピングで見たことがないエラーが出て、調べてみたら日本語の記事が多くなかったので書いておきます。

#エラー:japanese_ogre:

concole

```
$ ruby scraping.rb
```

↓

エラー文

```
response_authenticate': 401 => Net::HTTPUnauthorized for https:　URL名 -- no credentials found, provide some with #add_auth -- available realms: Application (Mechanize::UnauthorizedError)
```

#原因:smiling_imp:

認証エラーっぽいです。。

Basic認証が使用されている場合、ユーザ名とパスワードの組み繋ぎ、
Base64で暗号化されて、サーバーに送信されるようです。

認証が必要なページにアクセスしようとした場合に、サーバ側は「Authorization」と言うヘッダーが
ブラウザからのリクエストに付いているかどうかを確認します。
最初にアクセスした時には「Authorization」ヘッダーがありませんのでブラウザに対して認証が必要になるみたいです

なので、上記の問題が発生した場合に対処できるのは、Authorizationヘッダーを自分で渡せばいいようです！

要はアクセスするためには認証用の暗号が必要ですよ！って言われているようです。
（間違っていればご指摘ください）

#解決:hugging:

```rb
require 'mechanize'

username = 'ユーザー名'
password = 'パスワード'　#この辺は管理者に聞くしかないかと思われます、、

agent = Mechanize.new do |agent|
  agent.pre_connect_hooks << lambda { |agent, request| request["Authorization"] = "Basic #{Base64.strict_encode64(username + ':' + password)}" }
end

page = agent.get("URL")
  elements = page.search('a div') # a要素の下のdiv要素を検索
    elements.each do |ele|
    puts ele.inner_text # inner_textメソッドでテキストを取得
end

```

これでスクレイピング可能かと思います:thinking:


#参考

https://stackoverflow.com/questions/55144216/getting-mechanizeunauthorizederror-401-nethttpunauthorized-when-accessin

https://www.adminweb.jp/apache/allow/index5.html
【Python2to3アップデート方法】目次

## 概要
Python2系が2020年1月1日でサポート終了となる。
この記事では、**Python2系から3系にアップデートするための方法**について紹介する。
2.6以降を利用していることを前提とする。

終了日までのカウンター：https://pythonclock.org/

## Python2系と3系の違い
まずは2系と3系の違いから。

- [【Python2to3アップデート方法】Python2系と3系の違い](https://qiita.com/Esfahan/items/85a89e4dbda7181af663)

## Python2系のコードをPython3系用に自動変換するツール
Python2系のコードから、3系では互換性のない部分を自動で検知し、書き換えてくれるツールが存在する。

### 2to3とfuturizeの違いについて
コード変換ツールはいくつかあるが、ここでは**2to3**と**futurize**の2種類を紹介する。
それぞれメリット・デメリットがあるため、まずはどのような違いがあるのかから説明する。

- [【Python2to3アップデート方法】2to3 vs futurize どちらでPythonコード変換をすればよいのか](https://qiita.com/Esfahan/items/b9fd1e1ff2d599a651e7)

### 使い方
コード変換ツールの実際の使い方。

- [【Python2to3アップデート方法】2to3でPython2系コードを3系用に自動変換](https://qiita.com/Esfahan/items/22d38bce43277db31972)
- [【Python2to3アップデート方法】futurizeで安全にPython2系コードを3系用に自動変換](https://qiita.com/Esfahan/items/6c239a759fd0bd07b107)

## Python3系非対応のpipモジュールをチェック
利用しているpipモジュールがPython3系で利用できるのかをチェックするツール。

- [【Python2to3アップデート方法】caniusepython3でPython3系非対応のpipモジュールをチェック](https://qiita.com/Esfahan/items/1caab1c2e713e59968d7)


## Python3系のインストール手順
実際にPython3系をインストールする手順です。

- [【Python2to3アップデート方法】Python3系のインストール](https://qiita.com/Esfahan/items/913fdf27ee4a564b1936)
【Python2to3アップデート方法】2to3 vs futurize どちらでPythonコード変換をすればよいのか

## 目次
- [【Python2to3アップデート方法】目次](https://qiita.com/Esfahan/items/067484ee0cb3dd374992)

## 概要
Pythonを2系から3系にアップデートする際に、2系と3系は互換性のない部分が多いので、コードの修正が必要な場合もある。
これは大きな障壁となり得るが、コードを自動で変換してくれる便利なツールがいくつか提供されている。

ここではその中でも使いやすそうな、**2to3** と **futurize**を比較してみる。

## 2to3とfuturizeの違い
この2つはそれぞれ大きく異なる部分があるため、この記事ではその違いについてのみ説明する。
この記事を読んで、自分の環境ではどちらが合うのかの判断材料となることを目的とする。

それぞれの詳細な使い方については以下で書いているので、よければ参考にしてください。

- [【Python2to3アップデート方法】2to3でソースコード自動変換](https://qiita.com/Esfahan/items/22d38bce43277db31972)
- [【Python2to3アップデート方法】futurizeで安全にソースコード自動変換](https://qiita.com/Esfahan/items/6c239a759fd0bd07b107)

## 2to3とは
Pythonに標準で同梱されているモジュール。
2系のソースを3系用に自動で書き換えてくれる。
自分で変換プログラムを書くこともできる。

こちらは、futurizeと比べるとシンプルなツールとなっている。

参考：[2to3 - docs.python.org](https://docs.python.org/ja/3/library/2to3.html)


## futurize
2to3をベースとして作られており、2系のソースを3系用に自動で書き換えてくれるモジュール。
2to3との違いは、こちらはソースコードをPython2系3系のどちらでも動くように、futureモジュールを組み込むため、2to3を使った場合とは異なる実装となる。

参考：[Automatic conversion to Py2/3](http://python-future.org/automatic_conversion.html)

## 2to3とfuturizeの具体的な違い
では、2to3とfuturizeで、実装される内容が具体的にどのように異なるのかを検証する。

### サンプルコード
以下のコードを使い、2to3とfuturizeそれぞれで変換し、実行結果を検証してみる。
Python2系と3系では以下の割り算の結果が異なるため、以下のコードを実行すると、2系では`0`、3系では`0.5`が返る。

参考：[Python2系と3系の違い - 割り算の少数点以下の扱いについて](https://qiita.com/Esfahan/items/85a89e4dbda7181af663#3-割り算の少数点以下の扱いについて)

```py:sample.py
# -*- coding:utf-8 -*-
print(1/2)
```

### 2to3で変換をした場合
2to3で変換した場合、以下の用に変換される。（ほぼ差分はなし）

```py:sample.py
# -*- coding:utf-8 -*-
print((1/2))
```

#### 変換後のコードを2系で実行

```
$ python sample.py
0
```

#### 変換後のコードを3系で実行

```
$ python sample.py
0.5
```

当然、2系と3系での実行結果は異なるものとなった。

### futurizeで変換した場合
futurizeのstage2でのコード変換をした場合は、以下の実装に変換される。

```py:sample.py
# -*- coding:utf-8 -*-
from __future__ import print_function
from __future__ import division
from past.utils import old_div
print(old_div(1,2))
```

#### 変換後のコードを2系で実行

```shell-session
$ python sample.py
0
```

#### 変換後のコードを3系で実行

```shell-session
$ python sample.py
0
```

変換後のコードを、2系、3系のどちらで実行しても同じ結果が返るように実装された。

## その他の違い
futurizeではstageという概念があり、2段階でコードを2系から3系へアップデートすることを理想としている。一気に変更するより、2段階で行う事でリスクを回避することを目的としている。
それに対して、2to3では段階を踏むという概念はない。2to3のほうがシンプルとも言える。

futurizeのstageの詳細は以下を参照。
参考：[futurizeのstageについて](https://qiita.com/Esfahan/items/6c239a759fd0bd07b107#stageについて)

## まとめ
このようにfuturizeと2to3では、実装内容だけでなく実行結果、またコード変換の方法や概念も異なる。
環境によってどちらを利用すべきか判断は異なると思うので、それぞれのツールの違いを把握した上で決めることが望ましい。

## 関連記事
- [【Python2to3アップデート方法】2to3でソースコード自動変換](https://qiita.com/Esfahan/items/22d38bce43277db31972)
- [【Python2to3アップデート方法】futurizeで安全にソースコード自動変換](https://qiita.com/Esfahan/items/6c239a759fd0bd07b107)
TeX LiveとVS Codeで快適pLaTeX

# 更新履歴
2019.5.25 - latexmkを使う方法に変更．大幅に書き換えました．
2019.4.16 - 初版公開

# 筆者の環境
 - Windows 10 Home
 - TeX Live 2018
 - Visual Studio Code（以下，VS Codeと略す場合あり）
   - LaTeX Workshop (Plugin)

# [1] TeX Liveをインストール

TeX Live の ISOダウンロードはこちら<br>
[Acquiring TeX Live as an ISO image - TeX Users Group](https://www.tug.org/texlive/acquire-iso.html)

# [2] pLaTeX 動作確認
適当なTeXファイルを作成し，コマンドで動作を確認．正常にPDF化されてればOK．

※ファイル名は拡張子なしで．

```
platex filename
dvipdfmx filename
```

# [3] Visual Studio Code をインストール
[Visual Studio Code – コード エディター | Microsoft Azure](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)

# [4] LaTeX Workshopをインストール
[LaTeX Workshop - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)

# [5] Latexmkの初期設定

Latexmkは，複数回のコンパイル～PDF作成までを全て自動でやってくれるツールです．（自分で何回もコンパイルする必要がない．）今回はこれを使います．

コマンドプロンプトを起動し下記のコマンドを実行．

```
cd %USERPROFILE%
copy nul .latexmkrc
code .latexmkrc
```

下記をコピペして，保存する．

```
#!/usr/bin/env perl
$latex            = 'platex %B -halt-on-error';
$latex_silent     = 'platex %B -halt-on-error -interaction=batchmode';
$bibtex           = 'pbibtex';
$biber            = 'biber --bblencoding=utf8 -u -U --output_safechars';
$dvipdf           = 'dvipdfmx %B';
$makeindex        = 'mendex %O -o %D %S';
$max_repeat       = 5;
$pdf_mode         = 3;
$pvc_view_file_via_temporary = 0;
```

# [6] LaTeX Workshopの初期設定

1. VS Codeを起動し，`Ctrl+,`で設定を開く．
2. 画面右上の`{}`のアイコンをクリックし，「settings.json」を開く．

setting.jsonは，VS Codeの設定が書かれたファイルです．LaTeX workshopでは，最初からLatexmkに対応した設定が書かれていますが，このままだとplatexでは使えないので，下を書き加えます．
   
```settings.json
"latex-workshop.latex.tools": [
    {
            "name": "latexmk",
            "command": "latexmk",
            "args": [
                "%DOCFILE%"
            ],
            "env": {}
        },
],
"latex-workshop.latex.recipes": [
    {
            "name": "latexmk 🔃",
            "tools": [
                "latexmk"
            ]
        }
],
"latex-workshop.view.pdf.viewer": "browser"
```

# [7] 実際にTeXを書いてみる

VS Codeで適当なTeXファイルを開いて編集．

1. `Ctrl+Shift+P`でコマンド パレットを開く．
2. `LaTeX Workshop:Build with recipe`を選択．
3. `latexmk 🔃`を選択．
4. 処理が完了したら再びコマンド パレットを開き，<br>`LaTeX Workshop:View LaTeX PDF file in VSCode tab`でPDFを確認できる．

また，一回手動でコンパイル処理を行うと，TeX ファイルをリアルタイムで監視・自動コンパイルしてくれるため，リアルタイムでのプレビューが可能．
（settings.jsonに複数のrecipeがある場合，一番上が優先されます）

# [8]LaTeX Workshop の調子が悪いとき
しかし（僕の設定の仕方が悪いのかもしれないが），LaTeX Workshopで，コンパイルが処理中のまま進まなくなってしまうことがある．その場合は

1. `Ctrl+Shift+P`でコマンド パレットを開く．
2. `LaTeX Workshop:Kill LaTeX compiler process`を選択．
3. 処理が止まったら，再度コンパイルを試みる．

<img width="787" alt="2019-04-16 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230846/8c56b405-e00c-a91b-7e01-bee02a392940.png">