OmniAICreator/Qiita-1.07M huggingface dataset:
[Git] ファイル単位でstashする

　
〜ローカルリポジトリで作業中〜

　
**ワイ 「よ〜し作業終わったしcommitするゾ！」**



```shell

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   fuga.py
	modified:   hoge.py

no changes added to commit (use "git add" and/or "git commit -a")
```

　

**ワイ 「branch切り替えるのを忘れてmasterを変更してもうた・・・」**

**ワイ 「featureブランチに変更を移したい。。。」**

# git stash

そんな時に使えるのが```git stash```
ファイルを一時的に退避させることができる。
もちろんbranch間の移動も可能なので無理やり汚いcommitをする必要もない。

```shell
$ git stash
Saved working directory and index state WIP on master: e1c4afb [feat] hoge.py fuga.py

$ git status
On branch master
nothing to commit, working tree clean

$ git stash list
stash@{0}: WIP on master: e1c4afb [feat] hoge.py fuga.py
```

こんな感じで変更が退避されて```$ git stash list```で確認することができる
他のbranchに適用させたい時は以下のようにする

```shell
$ git checkout feature/hogefuga
Switched to branch 'feature/hogefuga'

$ git status
On branch feature/hogefuga
nothing to commit, working tree clean

$ git stash pop
On branch feature/hogefuga
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   fuga.py
	modified:   hoge.py

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (0706e9eb4284f2fcd1bb6ac6a049beb0e52ffdb6)
```

おけまる！

# ファイル単位でstashしたい
特定のファイルだけ別のbranchに移動させたいという場合もあるだろう。
```$ git stash```だけだと変更の及んだ全てのファイルがstashされてしまう。
ファイル単位でstashするには以下のようにする。

```shell
// 退避する時
$ git stash push -- <filepath>

// 戻す時（番号はstash番号）
$ git stash pop stash@{0}
```
実際にやってみたのが以下

```
$ git branch
  develop
  feature/hogefuga           // ここにfuga.pyを移動
  feature/hogehogefugafuga   
* master                     // hoge.py fuga.py
```

```shell
$ git stash push -- hoge.py
Saved working directory and index state WIP on master: e1c4afb [feat] hoge.py fuga.py

$ git stash push -- fuga.py
Saved working directory and index state WIP on master: e1c4afb [feat] hoge.py fuga.py

$ git stash list
stash@{0}: WIP on master: e1c4afb [feat] hoge.py fuga.py
stash@{1}: WIP on master: e1c4afb [feat] hoge.py fuga.py

$ git checkout feature/hogefuga
Switched to branch 'feature/hogefuga'

$ git stash pop stash@{0} # fuga.py
On branch feature/hogefuga
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   fuga.py

no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{0} (3c71ae19147fc1ef56a748df9fe849471f933956)
```

できた！

# 終わりに
stash自体まだまだ便利なオプションとかあるのでそこは各自で調べてもらえると嬉しいです。
快適なgitライフを送りましょう！
【日記】pythonでせっかくテストコードを書いたのでカバレッジも計測してみる

私が現在開発しているプロジェクトでは、かなりしっかりとテストコードを書いています。
ここまでしっかりとしたテストコードを書いたんなら、カバレッジとやらもかなりイイ感じになってんじゃね？と思い、今まで計測したことのないカバレッジを見てみることにしました。

私はテストコードを書くために`unittest`を使用しています。
[unittest --- ユニットテストフレームワーク](https://docs.python.org/ja/3/library/unittest.html)

しかし、これだけではカバレッジを計測することはできません。
カバレッジを計測するためには別のパッケージが必要です。
今回はその名もずばり`coverage`というパッケージを使いました。
[Coverage.py](https://coverage.readthedocs.io/en/v4.5.x/index.html)

こちらは、私が理解できた範囲では、**`python3 hoge.py`のように`coverage hoge.py`と実行すると、そのとき通ったコードの割合を記録してくれる**という使い方をするカバレッジ測定ツールのようです。

開発しているプロジェクトを普通に`py main.py`と実行しただけでは当然全てのコードを通ることはありません。
従って、ユニットテストを実行するときにこのcoverageを利用してみましょう。
すなわち、いつもはこんな感じでテストをしていたところを↓

```ターミナル.
> py -m unittest discover code.unit_tests
```

次のように変更するのです↓

```ターミナル.
> coverage run -m unittest discover code.unit_tests
```

このようにして実行し、記録して、そのあともう一度コマンドを実行して結果を表示します。

```ターミナル.
> coverage report -m
```

実際に下記のようにカバレッジを測定することができました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">やった～！カバレッジの計測できたよ～！ <a href="https://t.co/L2Tz6n03Hj">pic.twitter.com/L2Tz6n03Hj</a></p>&mdash; ヒト🏃‍♀️速バラ撒きおじさん/あつし (@Anaakikutsushit) <a href="https://twitter.com/Anaakikutsushit/status/1149201750982742021?ref_src=twsrc%5Etfw">July 11, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

割と注意深くテストを書いていたつもりだったんですが、一か所だけカバレッジが6割弱のモジュールがありますね。発見出来てよかった。

その後、コードの見直しを行って見事オール100を達成。
小さなプロジェクトとは言え、やはり「100」が出ると気持ちがいいものですね。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ああ～オール100出て気持ちいいっす～ <a href="https://t.co/jrJZuuyQjR">pic.twitter.com/jrJZuuyQjR</a></p>&mdash; ヒト🏃‍♀️速バラ撒きおじさん/あつし (@Anaakikutsushit) <a href="https://twitter.com/Anaakikutsushit/status/1149475790452510722?ref_src=twsrc%5Etfw">July 12, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
今日はこんなところで。
【JS】ES6から出来るようになったClass構文書き方などについて

es6からのJavaScriptでは`class構文`が導入されているらしいです！
知らなかった...ので、学習したことをまとめてみます。

```javascript
class Animal {
    constructor(type){      //コンストラクター
       this.type = type;
    }

    intro(){          //メソッド
        console.log(`${this.type}です。`);
    }
}
 
 let neko = new Animal('猫');
 neko.intro();    //猫です。
```
constructorでインスタンスの際の処理を、
そしてクラスの中にメソッドやプロパティが定義できます。
ただし、C#などと違って`アクセス修飾子`は使えません。（全てがどこからでもアクセスできる）

**注意！**
あくまでクラスと同じ書き方ができるようになった、というもので、内部の処理的には関数。
ただし、今までのFunctionオブジェクトで定義したクラス = class命令で定義したクラス**ではない！**

##FunctionのクラスとClass構文のクラスの違い
①関数としての呼び出しは不可！
function命令の方では、それができないようにthisの性質によって条件分岐させたり...と面倒([ここの最後のところ](https://qiita.com/irico/items/3a1f11bc62a6a33e764a))でしたが、これが不必要になりました！

②定義前のクラスは呼び出し不可！
functionでは呼び出し可能です。


##【おまけ】プロトタイプチェーンについて学習しました。
これは私がまとめるよりも、リンク先をみてもらった方がわかりやすいです。
リンク教えてくれた＠htsignさんありがとうございます。
https://qiita.com/howdy39/items/35729490b024ca295d6c

##プロトタイプのよみやすい定義
```javascript
ver Animal = function(){};
Animal.prototype.aa = function(){...},
Animal.prototype.bb = function(){...}
};
```
これでプロトタイプにメンバーを追加できますが、正直プロトタイププロタイプくどいです。
これをオブジェクトリテラルでスッキリさせることができます。

```javascript
var Animal = function(){...};
Animal.prototype = {
   aa: function(){...},   //スッキリ！
   bb: function(){...}
};
```
CSSでボタンに影をつけ、クリック時に消す方法

#CSSでボタンに影をつけ、クリック時に消す

```css:sample.css
.btn {
  /*水平方向の影の長さ、垂直方向の長さ、影の色を指定*/
  box-shadow: 0px 7px #1a7940;
}

/*クリック時のイベントを指定*/
.btn:active {
  /*影をけす*/
  box-shadow: none;
  /*ボタンを下に移動させる＝ボタンがクリックされたように見える*/
  position: relative;
  top: 7px;
}
```
nexe Tips

Node.jsアプリを実行ファイルにビルドするツール[nexe](https://github.com/nexe/nexe)のTips

### 複数のパターンのアセットをバンドルする

nexeではドキュメントに記載のとおり、以下のようにresourceに指定したファイルをバンドルできる。

```
nexe server.js --resource "public/**/*.html"
```

[nextは内部でglobbyを使用している](https://github.com/nexe/nexe/blob/master/src/steps/resource.ts#L2)のでglobbyで対応しているフォーマットは使える。

以下のようにすると複数パターンを指定できる

```
nexe server.js --resource "{config/*.json, *.jpg}"
```

### プラットフォーム指定

targetを指定する

[ドキュメント](https://github.com/nexe/nexe#target-string--object)に従う

```
nexe server.js --target linux-x64
```
PWAのホーム画面に追加を任意のタイミングで出したい

# 背景

[MDNのホーム画面に追加のドキュメント](https://developer.mozilla.org/ja/docs/Web/Progressive_web_apps/Add_to_home_screen)通りにやっても、ホーム画面に追加が全然出せずにハマったので、備忘録として。

## 前提条件

[MDNのホーム画面に追加のドキュメント](https://developer.mozilla.org/ja/docs/Web/Progressive_web_apps/Add_to_home_screen)通りに進めていること

## 発生するエラー

```js
window.addEventListener('beforeinstallprompt', (e) => {
```

このコードでbeforeinstallpromptが全く発火しない。


## 解決方法

[【3ステップではじめる】PWAによる「ホーム画面に追加」バナーの実装](https://amymd.hatenablog.com/entry/2017/10/12/001612)によると「空でも良いので、fetchイベントを追加する」が必要とのこと。


```js
self.addEventListener('fetch', function(event) {

});
```

これでホーム画面に追加が動くのだが、なぜそのような仕組みになっているのか...。

なおfetchイベントを追加せずに`キャッシュの指定`をしても動きます。

[Workbox](https://developers.google.com/web/tools/workbox/)で`precache`を使用してもホーム画面に追加が任意のタイミングでだせましが、仕組みがよくわかりません...

## 参考

[MDNのホーム画面に追加のドキュメント](https://developer.mozilla.org/ja/docs/Web/Progressive_web_apps/Add_to_home_screen)
[【3ステップではじめる】PWAによる「ホーム画面に追加」バナーの実装](https://amymd.hatenablog.com/entry/2017/10/12/001612)
[Laravel]単体テストでログインできない！

LoginControllerでオーバーライドした`authenticated()`のテストをしていました。

```php:Controllers/Auth/LoginController.php
/**
 * @param \Illuminate\Http\Request $request
 * @param mixed $user
 * @return \Illuminate\Http\Response
 */
protected function authenticated(Request $request, $user)
{
    return redirect('users/' . $user->id)->with('my_status', __('You logged in.'));
}
```

ログインに成功するとユーザーページにリダイレクトして
You logged in.というフラッシュメッセージを表示します。

テストのコード

```php:/tests/Unit/LoginControllerTest.php
/**
 * A basic unit test example.
 *
 * @return void
 */
public function testAuthenticated()
{
    $user = factory(User::class)->create([
        'password' => '1234'
    ]);

    $response = $this->post('login', [
        '_token' => csrf_token(),
        'email' => $user->email,
        'password' => '1234',
        'remember' => 'on'
    ]);

    $response->assertRedirect('users/' . $user->id);
    $this->assertAuthenticatedAs($user);
}
```

テストを実行

```
$ vendor/bin/phpunit --filter='LoginControllerTest'
PHPUnit 7.5.13 by Sebastian Bergmann and contributors.

F.                                                                  2 / 2 (100%)

Time: 2.85 seconds, Memory: 26.00 MB

There was 1 failure:

1) Tests\Unit\LoginControllerTest::testAuthenticated
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'http://localhost/users/1'
+'http://localhost'

/home/user/php/app/lara58/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:224
/home/user/php/app/lara58/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:169
/home/user/php/app/lara58/tests/Unit/LoginControllerTest.php:32

FAILURES!
Tests: 2, Assertions: 4, Failures: 1.
```

`http://localhost/users/1`にリダイレクトしていないのでログイン失敗です。

### 解決方法

```php:/tests/Unit/LoginControllerTest.php
$user = factory(User::class)->create([
    'password' => bcrypt('1234')
]);
```

```
$ vendor/bin/phpunit --filter='LoginControllerTest'
PHPUnit 7.5.13 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 2.68 seconds, Memory: 26.00 MB

OK (2 tests, 7 assertions)
```

成功しました。

他のテストで`actingAs()`メソッドを使った時は`bcrypt()`を使わなくてもできたのですが、ログインする時は`bcrypt()`が必要なようです。
flutter開発時によく出るエラー

###Flutterでアプリを開発する時に以下のエラーがでました。

- ソースコード

```dart
Expanded(child: GestureDetector(child: HamburgeMenu(),onTap:onSideMenuSelect(),), flex: 10)

onSideMenuSelect(){
    this.setState((){
      sideMenuShow = false;
    });
}

```

- エラーメッセージ

```
flutter: ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
flutter: The following assertion was thrown building TopNavigation(dirty, state: TopNavigationState#fef9e):
flutter: setState() or markNeedsBuild() called during build.
flutter: This HomeStatePage widget cannot be marked as needing to build because the framework is already in
flutter: the process of building widgets.  A widget can be marked as needing to be built during the build
flutter: phase only if one of its ancestors is currently building. This exception is allowed because the
flutter: framework builds parent widgets before children, which means a dirty descendant will always be
flutter: built. Otherwise, the framework might not visit this widget during this build phase.
flutter: The widget on which setState() or markNeedsBuild() was called was:
flutter:   HomeStatePage
flutter: The widget which was currently being built when the offending call was made was:
flutter:   TopNavigation
flutter:
```

- 原因

本来的には
onTap:メソッド名、これにより、Widgetを作る時にメソッド体を登録する
ここでは
onTap:メソッド名()、これにより、Widgetを作る時にメソッドが実行された。メソッドの中にStateを変えようとした。でも、この時はWidgetを作る時(ビルド時)だった。ビルド時にはStateを変えてはいけないから、エラーが出てきたわけだ。


- 解決方法1 
　引数がない場合は

　そのままメソッド名を渡せばいい 

```dart
Expanded(child: GestureDetector(child: HamburgeMenu(),onTap:onSideMenuSelect,), flex: 10)
```

- 解決方法2 
　引数がある場合は

 　onTap:(){ run(parameters) }の書き方でいい



```dart
Expanded(child: GestureDetector(child: HamburgeMenu(),onTap:(){ onSideMenuSelect(true); },), flex: 10)

onSideMenuSelect(res){
    this.setState((){
      sideMenuShow = res;
    });
}

```

ありがとうございます。
Ruby on Railsを初めて触ってハマった所

# Ruby on Railsを初めて触ってハマった所
### 筆者について
Webプログラミングは経験あり。（ＰＨＰ）
クラウドソーシングの案件でもいくつか見られるので、覚えてみようと思った。
RailsどころかRubyも初めて。

## インストール
- mysql2が正しくインストールされない。
 - 2019/07/11現在の最新のRuby（2.6.3）に対応しているmysql2のモジュールが無い。
 - Rubyのバージョンを下げて対応。（2.4.6をインストール。）
- dotenv-railsを使ってMySQLへのログイン情報を外部（.env）に書くようにしたが、rails db:create時にログイン情報が反映されない。（ＰＣにログインしてるユーザ名でMySQLにログインしようとする。）
 - .envの配置場所に問題があった。
 - configディレクトリ（database.ymlと同じディレクトリ）に置いていたが、正しくはプロジェクトのルートディレクトリ。

## Rubyの構文
- メソッド内で変数に何か代入しようとしたら「Dynamic constant assiginment」と怒られた。
 - 最初の１文字目が大文字だったのが問題。
 - Rubyではこの命名規則は定数として扱われる上、メソッド内では定数を定義する事が出来ない。
 - 例：× HogeData  ○ hogeData
- for文
 - Rubyのfor文はforと言うよりforeach。（配列とかから値を順次取り出していくもの。）
 - [参考資料](https://www.task-notes.com/entry/20141117/1416153598)
 - C言語とかのfor文のように扱いたい場合は以下のように記述する。

```ruby
count = 5
count.times do |i|
    # iはゼロスタートなので注意。
    # for(int i = 0; i < count; i++) と同義。
    print("i:#{i}\n")
end
# --- 出力結果 ---
# 0
# 1
# 2
# 3
# 4
```
- インクリメント演算子が使えない
 - i++ とか。
 - 試してないけど恐らくデクリメント演算子（i--とか）も駄目。


## POSTで呼び出されるメソッド（アクション）
- redirect_toでflashに文字列をブチ込んでリダイレクト→リダイレクト先でflashの内容が消失。
- sessionが正しく機能しない。
 - ViewにフォームをHTMLでベタ書き（formタグ）してたのが原因。
 - form_withに置き換える事でどちらも解決。

## ＤＢから取り出したレコードのeach
 - Viewの中でＤＢから取り出したレコードをeachで回したら、最後に何かクエリ結果（？）らしき物が表示された。
 - ループの中身を消して、空回ししても同じものが表示される。
  - ```<%= @users.each do |user| %>``` と記述していたのが原因。
  - 正しくは ```<% @users.each do |user| %>```

## 大文字・小文字の区別
- Railsと言うよりはSQLの知識。
- 大文字・小文字を区別させるにはBINARY属性を付ける必要があるが、Rails標準のやり方ではその術が無い。
 - 仕方ないので、migrateディレクトリにブチ込まれるＤＢ構成スクリプトに追記する。
 - [参考資料](https://qiita.com/tobita0000/items/a6b09565f63b86b6dc41)
- 認証（ユーザ登録、ログイン）処理を実装するなら対応必須。
- 以下、サンプル

```ruby
class CreateUsers < ActiveRecord::Migration
  def change
    # ==== ここから自動生成 ====
    create_table :users do |t|
      t.string :user_id
      t.string :password
      t.string :name
      t.integer :age
      t.string :detail

      t.timestamps null: false
    end
    # ==== ここまで自動生成 ====

    # ==== ここから手動で追加 ====
    # user_idとpasswordは大文字・小文字を区別させる必要がある。
    execute("alter table users modify user_id varchar(255) binary")
    execute("alter table users modify password varchar(255) binary")
    # ==========================
  end
end
```

## 別のページに飛んでソースを表示してみたら前のページのソースになってる
- ハッキリ言うと「ＩＥのバグ」
 - Chromeだと正しく表示される。
 - 気にする必要は無い。

## リンクの書き方
 - \<a href="/page">別ページに飛ぶ\</a> のように、パスを文字列でベタ書きするのはＮＧ。
  - ローカルでテストする分には問題ないが、サーバにデプロイした時に問題が起こる。
   - パスが"/"で始まっているのだから当然ではあるが・・・。
   - ルートディレクトリに配置するなら問題はないが、そのようなケースは殆ど無いと思われる。
 - link_toメソッドを使おう。
  - ここでも文字列ベタ書きはＮＧ。
  - 例えば/pageに飛びたいのであれば、page_pathと言うメソッドが定義されるのでそれを利用する。
  - また、GETパラメータを渡したいのであれば、page_path(:hoge => "hoge")のようにする。 
  - 以下、サンプル。
 
```
# <a href="/page?param=value">別ページに飛ぶ</a> が出力される。
<%= link_to "別ページに飛ぶ", page_path(:param => "value") %>
```
mrubyでMachinist

IIJが[Machinist](https://machinist.iij.jp/)という[ThingSpeak](https://thingspeak.com)に似たサービスをやっているようなので、mruby on YABM(蟹さん)でちょっと試してみた。

https://github.com/yamori813/rtlbm-mruby/blob/master/samples/machinist.rb

10秒おきにアクセスしてますが1分単位でしかデータは保存されないようなので、6つおきにデータが保存されるようです。

こんなグラフができました。

![スクリーンショット 2019-07-11 15.10.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/30d6101d-b100-abb2-e78c-0ca29bc6847e.png)

ThingSpeakが調子が悪いってずっと困っていたのですが、これを試してみてバグが見つかりました。人を疑う前に自分を疑えですね。

tlsのセッションの切り方が、ThingSpeakと違っていてちょっと調整しました。MacninistはBearSSLの実装と違う切り方になっていてエラーログが出ます。

異常検知を試してみました。

![スクリーンショット 2019-07-13 9.01.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7d36a6e6-2b7d-c38f-d270-f1c930a50c75.png)

学習が100%になっていれば上記のようにリブートによる異常値は捕まえられました。この後異常検知が正常に効くようになるまでには1時間40分くらいかかりました。

![スクリーンショット 2019-07-13 10.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/88bf6b38-7cf3-6b1a-8ca6-7e2cd79761df.png)

しばらく動かしていたら、下方値がマイナスになり、検知できなくなってました。なんだかよくわかりません。
apk (alpine package keeper) のイースターエッグでコーヒーを淹れてもらう

# apkとは？
Dockerコンテナのベースイメージとして頻繁に使われている[Alpine Linux](https://alpinelinux.org/)用のパッケージマネージャが `apk` です。 `apt` や `dnf` 同様に、パッケージの追加や削除、アップグレードなどの操作を一通り行うことが可能です。

[Alpine Linux package management - Alpine Linux](https://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management)

# apkはコーヒーを淹れられることをご存知ですか？
`apk` のヘルプを参照してみましょう。 `docker run --rm -it alpine apk --help` で、直接確認することができます。結果が以下の通り：

```:結果
apk-tools 2.10.4, compiled for x86_64.

Installing and removing packages:
  add       Add PACKAGEs to 'world' and install
            (or upgrade) them, while ensuring
            that all dependencies are met
  del       Remove PACKAGEs from 'world' and
            uninstall them

System maintenance:
  fix       Repair package or upgrade it without
            modifying main dependencies
  update    Update repository indexes from all
            remote repositories
  upgrade   Upgrade currently installed packages
            to match repositories
  cache     Download missing PACKAGEs to cache
            and/or delete unneeded files from
            cache

Querying information about packages:
  info      Give detailed information about
            PACKAGEs or repositories
  list      List packages by PATTERN and other
            criteria
  dot       Generate graphviz graphs
  policy    Show repository policy for packages

Repository maintenance:
  index     Create repository index file from
            FILEs
  fetch     Download PACKAGEs from global
            repositories to a local directory
  verify    Verify package integrity and
            signature
  manifest  Show checksums of package contents

Use apk <command> --help for command-specific help.
Use apk --help --verbose for a full command listing.

This apk has coffee making abilities.
```

このうち、最後の行を確認すると、

> This apk has coffee making abilities.

ということで、 `apk` はコーヒーを淹れる能力があるようです。

# コーヒーを淹れさせるには？
ドキュメントを一通り読んだものの、イースターエッグなのでこれ以上の説明はありませんでした。そこで、 `apk` のcli部分のソースコードリポジトリで[検索した結果](https://github.com/alpinelinux/apk-tools/search?q=coffee&unscoped_q=coffee)、 `fetch` というサブコマンドで `coffee` という引数を受け取ると特別な動作をしているようです。

# やってみる
`docker run --rm -it alpine apk fetch coffee`

```:結果
Go and fetch your own coffee.
```

自分で淹れろ、と言われてしまいました。残念……。
MSYS2 で esptool するまでの最短距離っぽいもの

# はじめに

esp-idf は Docker で動かしています。Docker Host な Linux は Hyper-V の上に居ます。
esptool だけベアメタルの Windows で実行したいです。


# 手順

概略は下記です。

1. MSYS2 をインストール
2. python2-pip をインストール
3. esptool をインストール
4. pyserial にパッチ

pip 便利やばい信者になりそう。

### MSYS2 をインストール

省略。
ちなみに以降は **MinGW じゃなくて MSYS** を起動します。

### python2-pip をインストール

```
$ pacman -S python2-pip
```

### esptool をインストール

```
$ pip2 install --user esptool
```

### pyserial にパッチ

```
$ find ~/.local/lib -type f -name list_ports_posix.py -exec sed -i -e "s/'cygwin':/'cygwin' or plat == 'msys':/g" {} \;
```


# 注意

### COM Port 名は /dev/ttyS[0-9]+

Espressif Systems が配布している超デカい全部入り MSYS2 だと COM Port は `COM[0-9]+` ですが、本方式では Linux チックに `/dev/ttyS[0-9]+` になります。普通に `ls /dev/ttyS*` して見つかるヤツのどれかが ESP32 に繋がってます。

### CP21xx ドライバは純正でＯＫ

USB to UART デバイス CP21xx のドライバは Silicon Labs 純正でいけます。


# オマケ

### ampy は python3 依存？

`pip2 install --user adafruit-ampy` しても `~/.local/bin/ampy` は作成されませんでした。python3-pip だと作成されました。
気が向いたら深追いします。
FedoraにCUDAをインストールする際の注意事項

# はじめに
私はPyTorchユーザで、もちろんGPUも使っていますが、OSはいつもFedoraです。
Ubuntuは使ったことがありません。

そこで、FedoraにCUDAをインストールする際に注意すべき事項をメモとして書いておきます。
（おそらく、CentOSについても、以下のようにすれば大丈夫だと思います。）

# Fedoraをインストールしたらランレベルを3にしておく
こうしなくても大丈夫かもしれませんが、安全のためです。

```console
# ln -fs /lib/systemd/system/runlevel3.target /etc/systemd/system/default.target
```
として、ランレベルを3にし、OSが起動したら、rootでログインして

```console
# startx
```
でGUIに移りましょう。無事に作業が終わった後で、元に戻せばいいだけです。

# マザーボードのBIOS設定でSecure Bootをオフにする
これをしないと、NVIDIAのドライバのインストールが途中で止まります。必ずオフにしましょう。

厄介なのは、マザーボードによっては、Windows関連メニューの下にこの設定が配置されていて、
非常に分かりくいことです。BIOSの画面を探しまわって、Secure Bootの項目を見つけ出しましょう。

# 作業するディスプレイはマザーボードにつなぐ
こうするのがややこしくなくていいです。（nouveau関係が面倒です。）

マザーボードのBIOS設定で、使用するディスプレイ端子をオンボードのほうに変えておきます。

そして、マザーボードにディスプレイをつないだ状態で、作業しましょう。

# kernel-headersとkernel-develをインストールしておく
とりあえず

```console
# dnf install kernel-headers kernel-devel
```
として、kernel-headersとkernel-develをインストールしておきましょう。

# 順番はcudaのインストール→再起動→ドライバのインストール
最初にcudaをインストールします。私は、[CUDA Toolkit](https://developer.nvidia.com/cuda-downloads)のページから、
Linux→x86_64→Fedoraと移り、「rpm (local)」をいつも使っています。

そして、まず

```console
# rpm -ivh cuda-repo-fedoraXX-XX-X-local-XX.X.XXX-XXX.XX-X.X-X.x86_64.rpm
```
とし、次に

```console
# dnf install cuda
```
とします。

その後、

```console
# reboot
```
と、リブートします。

そして、 [DOWNLOAD DRIVERS](https://www.nvidia.com/Download/index.aspx)のページで、
NVIDIA-Linux-x86_64-XXX.XX.run というファイルをダウンロードし、実行します。

```console
# chmod 755 NVIDIA-Linux-x86_64-XXX.XX.run
# ./NVIDIA-Linux-x86_64-XXX.XX.run
```

途中はそのままEnterキーを押していればいいはずです。
（最後の X configuration file のところは、Enterキーを押せばNoになるはずです。）

# おわりに
以上の手順を踏めば、neauvouのmodesetがどうのこうのという話には、関わらなくて済むと思います。

もし、やっぱりnouveau関係で引っかかったという場合は、[ここにある指示](https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-nouveau)に従いましょう。

深層学習フレームワークをGPU上で使うのは、Fedoraでも全く問題ないです。

# 追記

(2019/07/18 追記、2019/07/22 修正) 
深層学習フレームワークを使う場合、CUDAのバージョンは10.1ではなく10.0でないとダメかもしれません。
CUDAをダウングレードする際は、

```console
# rpm -qa | grep cuda
```
と，消したいCUDAのリポジトリを探し，例えば

```console
# rpm -e cuda-repo-fedora29-10-1-local-10.1.168-418.67-1.0-1.x86_64
```
と、そのリポジトリを消します。そして古いCUDAをインストールするとき、例えば、

```console
# dnf erase cuda
# rpm -ivh cuda-repo-fedora27-10-0-local-10.0.130-410.48-1.0-1.x86_64.rpm
# dnf --allowerasing  install cuda
```
と、再インストール時には`--allowerasing`オプションを指定する必要があると思います。

(2019/07/23 追記)
不要だった部分（dkmsはなくてもよかった）を削除して、構成も少し変更しました。

(2019/07/24 追記)
Fedora 29インストール時にいつもと違うパッケージを選んだら、
ドライバのインストール中にエラーが出ました。
その理由は、kernel-develがインストールされていなかったことでした。
kernel-develが必要だと分かりましたので、記事を修正しました。
jQueryでイベントハンドラも含めてDOMを複製する

jQueryをバンバン使用している案件において、
`clickイベント登録されたボタンを別の場所にも配置したい`
`でもCMS改修はしたくないから、フロントで何とかしてほしい`
という要件でちょっとググったら出てきました。

今の今まで存在を知らなかっただけですが、自分用のメモとして…

## clone(true)を使う

`clone()`はある要素のコピーを作成してDOMの他の場所に配置する関数です。
`jQuery("#A").clone().insertBefore("#B")`のように使います。

`clone(true)`とtrueをセットすることでイベントハンドラも含めてDOMをコピーできます。

## 例

```JavaScript
jQuery("#clone-sitai-el").clone(true).insertBefore("#kono-el-no-ueni-insert");
```

## おまけ：jQueryを使用しない場合

結論から言うとイベント含めたDOM複製はバニラJSでは不可です。
`cloneNode(true)`で`clone()`と同等の複製はできますが、`on()`や`addEventListener()`で登録したイベントは引き継がれないです。
（HTMLのonclick属性は引き継げます）
ちなみに`cloneNode(false)`にすると対象ノードだけ複製してきて子要素は無視します。

<br><br>
とりあえず、この分野に関してはまだjQueryに軍配が上がるようで・・・
長いページにおいて、ライブラリを使って簡単に実装したモーダル表示ボタンとかをいろんば場所に置いておきたい、等の場面で便利だなぁ
intra-martリンク集 公式編 初心者向け

## 対象
intra-mart Accel Platform

## はじめに
初心者向けリンクを多く記載しました。
目に付きにくいのですが有用なものを集めました。
intra-mart公式ドキュメントは有用ものが多くあります。
埋もれてしまっていて初学者に届かないのがもったいないので発掘します。

## デモンストレーションサイト
https://www.intra-mart.jp/demosite/demo_iap.html

intra-martのデモンストレーションサイトです。
申込が必要ですが、環境構築より100倍簡単ですのでまずお試しはこちらで。
手持ち環境がないときに簡単な検証にも使えます。

## intra-mart Sales Library [デモンストレーション]
https://sales.intra-mart.jp/library/?product=iap&topic=tutorial

営業向け資料集です。intra-martを知らない人向けの資料のため初心者向け。
上記提示のデモンストレーションはデモンストレーションサイトを使ってハンズオンです。
intra-martアプリケーションを試したい方には最適です。

## intra-mart Accel シリーズ オートデモ
https://www.intra-mart.jp/demosite/demo_auto.html

動画によるデモです。文章や口頭ではわかりにくいUI操作が分かりやすくお勧めです。
IM-Workflow、IM-FormaDesigner、IM-BISのハンズオン動画が多くあるので使えます。

## intra-mart e-learning
https://www.intra-mart.jp/products/training/e-learning.html

環境構築入門、スクリプト開発入門、JavaEE開発入門は無料なのでやってみましょう

## intra-mart Accel Series 用語集
https://document.intra-mart.jp/library/common/public/im_glossary/index.html

聞いたことのないintra-mart独自用語に殴られる確率が減ります。
用語の概念が簡単に一覧でき、おすすめです。

## IM-FormaDesigner 用語集
https://document.intra-mart.jp/library/forma/public/forma_appli_maker_guide/glossary.html

## IM-LogicDesigner仕様書 用語
https://document.intra-mart.jp/library/iap/public/im_logic/im_logic_specification/texts/summary/index.html#summary-glossary

## intra-mart Accel Series ドキュメントライブラリ
https://document.intra-mart.jp/library/

公式ドキュメントの大半は上記URLからリンクされています。
資料数が膨大なので探すのは大変ですが、これだけの資料が用意されているのは素晴らしいです。
DTNシミュレータのThe OneをEclipseで実行できるようにしたときの手順メモ

# the one シミュレータ入れてみた話
## あらまし
DTNを研究することにした自分。当然実際のものを作る前にシミュレートしないといけないのでそのためのシミュレータを使えるようにならないといけない。

どうも聞いた話だとThe Oneシミュレータというものがあって、それを使うといろいろできるらしいけど、そもそもまっさらなパソコンを渡されてどうすんべ、というところから。readmeや、ダウンロードサイト https://www.netlab.tkk.fi/tutkimus/dtn/theone/ についているビギナーサイトだけだと微妙にうまくいかなかったので覚書として書きます。
参考:https://www.youtube.com/watch?v=6ywQQx7-UKM
##まず初めに
JDKを入れましょう() 
アンチウイルスソフトすら入ってない状態のまっさらパソコンを渡されたので仕方ないね。このシミュレータはJavaで動くので1も2もなくとにかくインストールしてください。Javaプログラムを動かすのに必要最低限な環境はほかのだれかの記事を読んで実装してくれればと思います。
![java version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442188/2eafa104-b1fa-51b9-628b-71a9030c3b89.png)
##JDK動くかのテスト
JDKさえ入ればシミュレータは動きます。編集をメモ帳でできる猛者、もしくは自分の好きなこだわりのテキストエディタをお持ちの方はターミナル、もしくはコマンドプロンプトでテストして気の向くままに腕をお振るいください。ダウンロードした　the oneシミュレータのあるディレクトリについているcompile.bat(Unixならcompile.sh)を実行してコンパイル、のちに下にあるone.bat(Unixならone.sh)を実行すれば動き出すはず。コンパイル時にエラーが出ているけれどひとまず無視で大丈夫です。
![java version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442188/db5d492e-dc60-b5ea-7d29-873fb5f1a508.png)
![java version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442188/448c3842-0958-8dc3-1461-2a5816efbd51.png)

結果は自動的にreportsのディレクトリに入るので確認してみるとよいと思います。
##次に
Eclipseを入れましょう。すでに入れてる人はスキップ。別にUnixならvimとかemacsとか強力なエディタがあるのでいらないとは思いますが、windowsでするときはEclipseと統合してシミュレータ動かすほうがエディタ的にいろいろ楽そう。(Eclipse起動があんまり早くないのであんまり好きではないのですが)
PCへのEclipseの実装も今回の趣旨ではないので他の方の記事をご参考くださいませ。自分はOxygenのwindows64bit版を使っております。(最新版で問題ないと思います)

##Eclipseとの統合
Eclipseとoneシミュレータを合体させます、要はEclipseでoneシミュレータを動かします。beginer'sサイトhttp://one-simuator-for-beginners.blogspot.com/2013/08/how-to-integrate-one-with-eclipse.html に書いてある通りにやるとファイルの依存関係が崩れるのでお勧めしません。
まず、
ファイル→新規→Javaプロジェクト
を選択します。
デフォルトロケーションを使用のチェックボックスを外し、ロケーションをoneシミュレーターの入っているディレクトリにします。あとは完了を押しておけば8割がたお仕事は終了。
##赤いバッテン残ってるよ？
Oneシミュレータは作者が作ったJARを用いて動いているため、外部JARとしてそれを入れる必要があります。すべてlibディレクトリに入っているのでビルドパスから茶々っと入れちゃいましょう。具体的には
右クリック→ビルドパス→ビルドパスの構成→外部JARの追加
からlibの中の2つのJARどちらも入れてしまいましょう。
![java version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442188/7de88ab2-2432-b072-dd5a-d1941cad083d.png)
##それでもやっぱり赤いバッテン。。。
testディレクトリに残ってますね。。。これはどうもあんまり実行には関係ないものらしいですが、JARにJunitを入れれば止まるようです。Eclipseにもともと入っているのでビルドパス構成のライブラリーから追加しちゃってください。もしくはtestディレクトリごと削除しても大丈夫です。
##お疲れさまでした！
ここまでくれば後は実行するだけ。パッケージ・エクスプローラからcoreディレクトリ内のDTNsim.javaを右クリックして実行すれば動きます！
基本的にdefault_settings.txtに書かれている内容が実行されてシミュレーターが動きます。この内容を書き換えてノードの数を変えたり通信範囲変えたりデータの複製方式を変えたりデータの残存時間を変えたりメッセージの大きさを変えたりして色々することになります。結果はreportsディレクトリの中に保存されるので、一旦リフレッシュをして確認してみてください。ちなみにグラフ作成用のツールキットが用意されているようですが、全くの謎(というか僕がperlを読めない)なので、使わず普通にcellソフトでまとめるのがよいと思います。
##オプション使いたいならば
ターミナル上で使うときはGUIを出さずに実行したり試行回数を増やしたりできます。同様のことをeclipseで行うには実行→外部ツールの構成から、コマンドプロンプト等を作業ディレクトリで動かせるようにしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442188/7be8f218-8342-4185-a261-ad6e8261127c.png)
##終わりに
現在the oneシミュレータにはだれでも見られる日本語サイトが無いようで、英文ビギナーサイトを見るだけではうまくいかなかったためあきらめムードでyoutubeの検索窓に間違えて書き込んだら非常にわかりやすい動画があって参考に書きました。つたない文章でしたが後に続く人がこんなつまらないことでつまらないようになれば幸いです。
【Laravel】updated_atカラムがないテーブルをEloquentモデルを用いて更新するときの注意点

備忘録として残します。

Eloquentモデルを用いて更新をかけるとき下記のような記述をすると思います。
` HogeTable::find($id)->fill($input)->save();`
このときLaravelはEloquentモデルで更新しようとしたとき、暗黙的にupdated_atというカラムも同時に更新しようとします。

しかし、updated_atというカラムがない場合は、エラーをはくので、この暗黙的にタイムスタンプをする機能をオフにする方法が下記になります。

#■やり方

```php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class HogeTable extends Model
{
    public $timestamps = false; //　この行をEloquentモデルに追記
    protected $table = 'hoge';
}
```
ターミナル周りの設定備忘録

# はじめに
つい最近、新しいMacBookの環境を整える機会があった時に

「あれ、いつもどんな設定で使ってたっけ...」

となったのでその備忘録です。

# 入れるもの
* [iTerm2](https://www.iterm2.com/)

# iTerm2 設定
ターミナルの画面を縦横に分割できたり、
ショートカットでデスクトップにフルスクリーンで表示したり非表示ができるターミナル

### ショートカットで表示・非表示ができるようにする
まず、iTerm起動時にiTerm用のデスクトップを開かないために
Native full screen windowsを無効にする。

`iTerm2 > Preferences > General > Window > Native full screen windowsのチェックを外す`
<img width="795" alt="スクリーンショット 2019-06-29 12.28.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156274/0635cf9f-a3a6-d665-aeb5-0c34a6ece61f.png">

次に、フルスクリーンでカーソルがあるデスクトップでターミナルを表示するために
・`Style`>`Fullscreen`
・`Screen`>`Screen with Cursor`
・`Space`>`All Space`
に設定する。

`iTerm2 > Preferences > Profiles > Window > Settings for New Windows > Style, Screen, Space`
<img width="919" alt="スクリーンショット 2019-06-29 12.45.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156274/42fdbc67-62ed-24fb-48a6-b7feb7dbe85c.png">

最後にショートカットで表示を切り替えれるように設定。
デフォルトでは`Option+Space`になっている。

iTerm2 > Preferences > Keys > HotKey > Show/hide iTerm2 with a system-wide hotkeyにチェック
<img width="959" alt="スクリーンショット 2019-06-29 12.53.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156274/f8f4e2c1-e404-0a82-a7bc-11f43bc47f60.png">

### お好みで設定するもの

**・ターミナル画面の透過度**
ブラウザ等を見ながら作業する際にターミナルを少し透過させておくと便利なので、画面の透過度を少しいじる。

`iTerm2 > Preferences > Profiles > Window > Window Appearance > Transpaency`
<img width="915" alt="スクリーンショット 2019-06-29 12.46.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156274/a61154df-8750-71e0-3314-7b014b504b2e.png">

**・メニューバーの非表示化**
フルスクリーン時にメニューバーが隠れないようにしたい場合は、
`iTerm2 > Preferences > Appearance > System > Auto-hide menu bar in non-native fullscreen`
のチェックを外すことでフルスクリーンでもメニューバーが表示される。

**・作業中ディレクトリの新規ウィンドウを開く**
新規タブや新規ウィンドウを開いた時に作業していたディレクトリで開きたい場合は、
`iTerm2 > Preferences > Profiles > General > Working Directory`
のチェックを`Reuse previous session's directory`に設定する

# おしまい
これで準備完了。
シェル等の設定はそのうち追記する
気象庁のサイトで見れる過去の天気のスクレイピング的なやつ

ミクロ経済学や環境経済学の記事を書こうかと思ってサボり続けています。
そろそろ国内誌に投稿した論文の査読結果（という名のボロカスな批評、別にリジェクトはされないと思うが痛いこと書かれている気がする…）が返ってくる予感がするので、その修正作業のためにそっちの記事は当面書けないと思いますが…

今回は私が京大の総人にいた頃（3年くらい前の2016年）に授業でつくったjavaアプリ（jarファイルなので使うためにはjavaのインストールが必要）を紹介します。
当時から今の研究室にはちょくちょくお邪魔していて、環境経済学の研究に使えそうな小ネタ的アプリの開発をしていたんですが、ちょうどそのときとっていたjavaの授業が「何でもいいからアプリつくって発表せよ」ってものでしたので、どうせなら研究で使えるものをと思い気象庁の[過去の気象データ検索](http://www.data.jma.go.jp/obd/stats/etrn/index.php)をスクレイピングするプログラムを作りました。以下、そのリンク。

[zipファイルのリンク（DropBox）](https://www.dropbox.com/s/xlc5rif1mbeg8yh/weather%20data%20getter.zip?dl=0)


環境経済学の研究では気象データを使うことは頻繁にあるので、今でもこのプログラムは度々使っています。以下、アプリの画像。


![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387783/39f667bc-5ed8-3475-ad68-8da900dfcb78.jpeg)


まず都道府県のプルダウンメニューで、気象データを取得したい場所の都道府県を選択。
すると市区町村（役場名）に、その都道府県の市区町村役場の名称が出ます。
気象データを取得したい市区町村の役場名を選択して、あとは取得したいデータの期間を年月日で指定してダウンロードするだけ。csvファイル形式（UTF8 BOM付）で出力されます。

取得する情報は、環境経済学的によく使うデータである降水量、最低・最高・平均気温、日照時間と年月日だけです。

なお、全ての市区町村に気象観測所が設置されているわけではありません。ですから、このプログラムは指定した市区町村（の役場の緯度・経度）から最短距離にある同じ都道府県内の観測所を内部で自動的に特定し、そこの観測所が保持している記録をダウンロードします。どこの観測所が指定した市区町村役場の最寄観測所なのかは、このプログラムのテキストエリア内を見れば分かります。

市区町村役場の緯度・経度は、GIS関係のデータを提供している国土地理院の[国土数値情報ダウンロードサービス](http://nlftp.mlit.go.jp/ksj/index.html)で、市区町村役場の施設情報（住所や緯度・経度など）が記されたXMLファイルから取得しています。このXMLファイルはプログラムに同梱されています。（役所の移転やらで緯度・経度が変わったらその都度XMLファイルをダウンロードして更新すればいいのですが、自分は一度もやってませんので、デフォルトでは2016年のままです）

~~ちなみに、特に田舎の市区町村によってはダウンロードデータがなかったりします（！）~~
すみません、これはどうやらアップロードしたjarファイルが、バグを治していない古いソースのプロジェクトをエクスポートしたやつのまま放置していたせいでした。最新版のやつからエクスポートしたら直ってました。上記DropBox内のファイルは新しいバージョンに更新してあります。

上述のように、もともと降水量・気温・日照時間のデータをとるために作ったプログラムですが、全国の気象観測所はこれらを全て記録しているわけではありません。たとえば、日照時間を記録しない小規模な自動観測所などもあります。こうした必要なデータを記録しない観測所は除き、「降水量・気温・日照時間」の3点を最低限観測する観測所の中で、指定した市区町村役場から最も近いところが選ばれるプログラムです。

あと大学の演習室だの計算機室だのはそうだと思いますが、こういうプログラムからネット接続する際にプロクシ設定を要求するような環境で作業する人のために、プロクシ設定機能を設けてあります。

今回は以上です。

#ソースコード

ソースは長いので個別説明は諦めました。なので以下、ソースコードの全部を公開。
[ソース(Dropbox)](https://www.dropbox.com/s/3cwnfurun8vcmnv/WeatherDataGetter.zip)

基本eclipseで作業してたので、それに準じたディレクトリ構造です。srcディレクトリ内にソースが入ってます。GIS_XMLディレクトリ内には国土地理院からDLした47都道府県分の公的施設（役場など）の位置情報等に関するXMLファイルが入っています。HTMLパーサとしてjsoupを使っているのでそれが同梱されています。そこら辺は適宜最新版に変えるといいかもしれません。
Cloudfront -> API Gateway  -> Lambdaの構成でアクセス元のHostをLambdaで取得する

## なぜ必要？

`XXX.example.com` の `XXX` 部分によって挙動を変える、つまりサブドメインをパラメータにしたかった。

普通にCloudfront + API GatewayにしてしまうとHostヘッダはAPI Gatewayのもの（xxxxxxx.execute-api.ap-northeast-1.amazonaws.com）になってしまいます。

これに対し、Cloudfrontに来たHOSTをAPI Gatewayに横流ししてみました。
作業的にはCloudfrontのWhitelist HeadersにHOSTを入れれば解決か？と思ったのですが、これだとAPI Gateway側で証明書検証できず500番台エラーが返ってきてしまいます。。。

ちょっと手こずったので解決方法を残しておきます。

## 解決の大まかな流れ

1. Cloudfrontに来たHOSTをAPI Gateway側に流す
2. HOSTそのままではAPI Gatewayに受け入れてもらえないのでHOSTはAPI Gatewayの値に書き換えつつX-FORWARDED-HOSTにアクセス元のHOSTを載せる

### 1. Cloudfrontに来たHOSTをAPI Gateway側に流す

CloudfrontのWhitelist Headersに値設定するだけです。
以下の2つを設定してください。

* `HOST`
* `X-FORWARDED-HOST`（下記スクリプトと矛盾なければヘッダ名は自由です）

### 2. HOSTそのままではAPI Gatewayに受け入れてもらえないのでHOSTはAPI Gatewayの値に書き換えつつX-FORWARDED-HOSTにアクセス元のHOSTを載せる

Lambda@Edgeを使ってオリジンへのアクセス時にヘッダを書き換えます。

```js
exports.handler = async (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;
    
    // Hostの値をX-Forwarded-Hostに写す
    headers['x-forwarded-host'] = [{ 
        key: 'X-Forwarded-Host', 
        value: headers.host[0].value 
    }];
    
    // API GatewayのHOSTに書き換え
    headers['host'] = [{ 
        key: 'Host',
        value: 'pcwldf375g.execute-api.ap-northeast-1.amazonaws.com'
    }];
    
    callback(null, request);
};
```

このLambdaをCloudfrontのOrigin Request（否Viewer Request！）に設定します。

ここまでできれば受け取り側のLambdaで普通にX-FORWARDED-HOSTヘッダを見ればOKです。めでたしめでたし。
Ansible：vsphere_guestモジュールでテンプレートを利用したVM作成

## Ansibleでvsphere_guestモジュールを使ったVM作成方法
試験実施時の環境リセットを毎回VM作り直すことで実現したい！

## やりたいこと
- CentOS7の自動インストール
- Windows Server2016の自動インストール
- 上２つのアンインストール

## 環境
- Esxi6.5
- vCenter
- Ansible2.9

## vsphere_guestについて
- 非推奨となっているが実証実験中で諸々のライセンスが評価版の為、vsphere_guestを使用
- 正式採用ではvmware_guestを使用する予定

## ISOとテンプレートどちらからインストールするか
- CentOSのISOイメージをkicakstartを使って自動インストールする方法もあるが、WindowsServerでそれができるか分からなかったのでテンプレートから復元する方法を採用した。
- ISOからのインストールよりテンプレートから復元したほうが所要時間かなり短くなることも決め手となった。

## Esxi上でテンプレートの作成
- テンプレート化したいVMは予めインストール済みの前提です。  
- vCenterにログインして、ホスト及びクラスタからテンプレートにしたいVMを右クリックする、テンプレート->テンプレートに変換を選択することでテンプレートに出来ます。この際テンプレートにしたVMは消えるので気をつけます。

## OSインストールのplaybook

```YAML:install.yml
- hosts: all
  gather_facts: false
  connection: local
  user: root
  sudo: true

  tasks:
    - vsphere_guest:
        vcenter_hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_user }}"
        password: "{{ vcenter_pass }}"
        guest: "{{ guest_name }}"
        validate_certs: False
        power_on_after_clone: yes
        from_template: yes
        template_src: "{{ template_src }}"
        vm_extra_config:
          notes: "{{ notes }}"
        esxi:
          datacenter: "{{ datacenter }}"
          hostname: "{{ esxi_host }}"
```

## OSアンインストールのplaybook

```YAML:uninstall.yml
- hosts: all
  gather_facts: false
  connection: local
  user: root
  sudo: true

  tasks:
    - vsphere_guest:
        vcenter_hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_user }}"
        password: "{{ vcenter_pass }}"
        guest: "{{ guest_name }}"
        validate_certs: False
        force: yes
        state: absent
```

## Ansibleの変数ファイル
```INI:vars
[vms]
TEST_Server   #ここは消しても動く？未検証
[vms:vars]
vcenter_hostname='vCenterのホスト又はIP'
vcenter_user='administrator@vsphere.local'
vcenter_pass='vCenterのパスワード'
datacenter='データセンター名'
esxi_host='Esxiのホスト又はIP'
notes='注意書き、いろんなサンプルで「Created by Ansible」が書かれている'
template_src='保存したテンプレートの名前'
guest_name='VMの名前'
```

## インストール実行
```
ansible-playbook -i vars install.yml
```
## アンインストール実行
```
ansible-playbook -i vars uninstall.yml
```
gulp4でタスク分割

`require-dir`を使わなくても分割できるらしいのでやってみた。

https://gulpjs.com/docs/en/getting-started/javascript-and-gulpfiles#splitting-a-gulpfile

#gulpfile.jsと言う**フォルダ**を作る
トランスパイラーを使用している場合はそれに応じた名前。


```text:tree
gulpfile.babel.js
├── browsersync.js
├── config.js
├── css.js
├── index.js
├── javascript.js
└── watch.js
```

#index.jsがgulpfile.jsの代わりになる

```js:gulpfile.babel.js/index.js
import {series, parallel} from "gulp"

import {bs} from "./browsersync.js"
import {javascript} from "./javascript.js"
import {css} from "./css.js"
import {watch} from "./watch.js"

const build = parallel(javascript, css);
const develop = series(build, parallel(bs, watch));

export {
	bs,
	javascript,
	css,
	watch,
	build,
	develop as default
}
```

#分割したファイルからexportsする

```javascript:gulpfile.babel.js/browsersync.js
import {series} from "gulp"
import browserSync from "browser-sync"
import bsconfig from "../bs-config"
import { browserSync as config } from "./config"

Object.assign(bsconfig, config);

// browser-sync
const webserver = () => {
	browserSync.init(bsconfig);
}

export const bs = series(webserver);
```

とりあえず動いた。

#できなかった事

- buildやdevelopのタスクも分割したい
- buildやdevelopのタスク内容をconfigに入れたい


#他のやり方

registry()でもできるらしいのだけどうまくできなかった

https://gulpjs.com/docs/en/api/registry
Qiita への記事更新を API 経由で行ってみる


Hugo の記事の一部を Qiita へも投稿してみる。

ポイント

* [API v2 Document](https://qiita.com/api/v2/docs#投稿)
* 新規記事は `POST`、既存記事の更新は `PATCH`。
* `title`, `body`, `tags` ヘッダが無いと、400 Bad Request が返ってくる。
* 「下書き」に関する項目は見つけられていない。
  ヘッダ `private` は限定公開に関するものの様子。

### サンプルコード

* API Token は、環境変数 `QIITA_TOKEN` に保管してとってくる。

* cryogen だとカスタムヘッダを追加できない・・

```python

# -*- coding: utf-8 -*-
#
# Update an article via Qiita API
#
import sys
import os
import logging
import json
import requests

QIITA_URL = 'https://qiita.com/api/v2/items'

TAGS = ["qiita_id", "title", "tags"]

def parse(filepath, max_header_lines=10):
    u'''Parse original article (Cryogen format)'''
    title = None
    qiita_id = None
    tags = [{"name": "update_via_api", "version": []}]
    body = ''
    line_count = 0
    with open(filepath) as f:
        for line in f:
            line_count += 1
            if line.find(':qiita_id ') > 0:
                try:
                    qiita_id = line.strip().split()[1]
                except IndexError:
                    qiita_id = ''
            if line.find(':title ') > 0:
                title = line.strip().split(' ', 1)[1]
            if line.find(':tags ') > 0:
                keys = line.strip().split(' ', 1)[1]
                for k in json.loads(keys):
                    tags.append({"name": k, "version": []})
            if line.rstrip().endswith('}') or line_count > max_header_lines:
                break
        if qiita_id is None:
            return None
        for line in f:
            body += line
    return {
        'title': title,
        'qiita_id': qiita_id,
        'tags': tags,
        'body': body,
        'tweet': False,
        'private': False,
    }

def submit(item, token, url=QIITA_URL, article_id=None):
    u'''Submit to Qiita v2 API'''
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer {}'.format(token)
    }

    if article_id is None or article_id == '':
        res = requests.post(url, headers=headers, json=item)
    else:
        url = "{}/{}".format(url, article_id)
        res = requests.patch(url, headers=headers, json=item)
    if res.status_code >= 400:
        logging.error(res.json())
    res.raise_for_status()

    logging.info(json.dumps(res.json(), indent=2))

    return res

def execute(filepath, token):
    item = parse(filepath)
    if item is None:
        logging.warning("SKIP. No qiita_id tag found.")
        return
    logging.debug(json.dumps(item, indent=2))

    res = submit(item, token=token, article_id=item['qiita_id'])

if __name__ == "__main__":
    token = os.environ['QIITA_TOKEN']
    for arg in sys.argv[1:]:
        execute(arg, token)
```
Mac に rbenv で Ruby 1.9.3-p327 インストール



```sh
$ CONFIGURE_OPTS="--without-tcl --without-tk" rbenv install 1.9.3-p327
```

上でダメなら下

```sh
$ curl -fsSL "https://github.com/ruby/ruby/commit/0d58bb55985e787364b0235e5e69278d0f0ad4b0.patch" | \
filterdiff -x a/ChangeLog | rbenv install --patch 1.9.3-p327
```

上でダメ下

```sh
$ xcode-select --install
$ brew install readline openssl
$ CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 1.9.3-p327
```
M5Stackシリーズの仕様一覧

どれがどれだかわからなくなってきたけど、違いについてまとまっているところが無さそうなのでメモしておきます。

個人的な理由でStickシリーズとM5Cameraについても並べてみました。

# 個別仕様

|| Basic | Gray | Fire | Go |StickC|StickV|M5Camera|
|:--|:--|:--|:--|:--|:--|:--|:--|
|CPU| ESP32|ESP32|ESP32|ESP32|ESP32|K210|ESP32-WROVER|
|Flash|4M|16M(旧4M)|16M|16M|4M|16M|4M|
|PSRAM|-|-|4M|-|-|-|4M|
|ボタン|3|3|3|3|2|2|-|
|カメラ|-|-|-|-|-|○|○|
|マイク|-|-|○|○|○|○|-|
|IR|-|-|-|-|○|-|-|
|センサー|-|9軸|9軸|9軸|6軸|MPU6886|-|
|バッテリー|150mA|150mA|550mA|550mA|80mA|200mA|-|
|Grove|1(I2C)|1(I2C)|3(I2C/UART/IO)|3(I2C/UART/IO)|1|1|1|
|ポゴピン|-|-|○|○|-|-|-|
|LED|-|-|RGBx10|RGBx10|赤色x1|RGBWx1|-|
|液晶|320x240|320x240|320x240|320x240|80x160|135x240|-|
|タッチ|-|-|-|-|○|○|-|
|サイズ|54x54x17|54x54x17|54x54x21|54x54x21|48x24x18|40x49x13|48x24|
|重さ|120g|120g|56g|56g|||5g|

# TODO

- 重さが正しいか確認
- バッテリー容量が公式とSWで少し違う
- センサーの種別の書き方をどうするか
- StickのGroveコネクターはI2C?
- IRはStickCだけ?

# ぶつぶつ

とりあえずまとめてみました。間違い等あればコメントください。
CloudBuildでimageタグ名を$(cat FILE)してつける

CloudBuildでは$TAG_NAMEなど予め用意された環境変数が使えるが，それでは足りないときがある．コマンドの実行結果を使いたいときは`entrypoint`をshellにしてあげればよい．substitutionの仕組みもあるが，毎回コマンドでsubstitutionの値を指定して実行する必要があり，CloudBuild Trigger経由では静的な値しか使えず使い勝手が悪い．

Docker image builderとしてkaniko/executorの例を挙げる． VERSIONというファイルをプロジェクトルートディレクトリに用意して． `$(cat /workspace/VERSION)`にてタグ名を指定している．

```text:VERSION
1.0.0
```

```yaml:cloudbuild.yaml
steps:
  - name: gcr.io/kaniko-project/executor:debug
    entrypoint: sh
    args:
      - -c
      - |
        /kaniko/executor \
          --destination=gcr.io/$PROJECT_ID/example:$(cat /workspace/VERSION)
```

なお，kaniko/executorはscratchベースのため`sh`が使えない．公式で`sh`が使えるdebug版が用意されていたのでdebug版を使用した．

## 参考
[Building images with kaniko and GitLab CI/CD](https://docs.gitlab.com/ee/ci/docker/using_kaniko.html)
この夏プログラミングはじめました

未来電子テクノロジーでインターンをしている mrm1027 です。

今回は、初めてQiitaで記事を投稿するので、書き方がいまいち分からず緊張しております。。

プログラミングを始めて、２週感経ちました。
進捗としては、ProgateのHTML＆CSSの上級編まで修了しました。
これまでは基本的な部分を学びながら、それぞれのステージで簡単な成果物を作りあげるような学習でした。
しかし、まだどうしたらどうなって、なぜそれが必要でといった根本をまだまだ理解できていないので、
今後は、これまでに学習した範囲の復習を小まめに入れつつ、次の自由課題に向けて取り組んでいこうと思います。

次回からは、ちゃんとした専門的な内容の記事を書けるようにプログラミングの学習を引き続き頑張りたいと思います！！

【プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし誤りがある場合は、すぐさま修正しますのでどんどん指摘してください。】

誤りからもたくさん学んで吸収していきたいです！よろしくお願いします！
Bitrise で並列ビルド (iOS/Android)

# 概要

- React Native のビルドとデプロイに Bitrise を利用している
- iOS のビルド時間が長いせいで、 Android が完了する前に45分超えてしまう
- そのため、 iOS/Android でビルドするワークフローを並列実行したい
    - 使っている技術が別物だから、並列実行しても問題ないのではないか

# 結論

並列実行は GUI ではサポートされていないが、 Bitrise CLI を使うと、超単純に並列ビルドが可能。

- ローカルに下記のような `bitrise.yml` を入れてGitリポジトリに入れる

```yml:bitrise.yml
---
format_version: '6'
default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
project_type: react-native
workflows:
  common:
    steps:
    - yarn@0.0.8:
        inputs:
          - command: install

  ios:
    steps:
      - certificate-and-profile-installer@1.10.1: {}
      - # 色々

  android:
    steps:
      - install-missing-android-tools@2.3.5: {}
      - # 色々

```

- Bitrise にて、ワークフローエディタを開き、下記を入力

```sh
#!/bin/bash
set -ex

pids=()

bitrise run common --config bitrise.yml
bitrise run ios -c bitrise.yml &
pids+=($!)
bitrise run android -c bitrise.yml &
pids+=($!)

for pid in "${pids[@]}"; do
  wait "$pid"
done
```

全体としてはこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103885/93bdaa13-73f1-e8ef-0f02-9ddf34e71b45.png)

これで、ビルド時間が3分の2くらいになった。
5000円以下でAI, IoT, RISC-Vが全部試せるガジェット

今回は、最近の技術要素がお手軽なコスト（※1）で凝縮されているシングルボードコンピュータ（SBC）キットである、「Sipeed Maixduino Kit」を紹介します。

※1: 2019年7月11現在、国内では3,500〜3,888円で販売されています。

# 主な国内販売店

* [スイッチサイエンス](https://www.switch-science.com/catalog/5707/)
* [Shigezone](http://shigezone.com/)

※ なお、[M5StickV](https://www.switch-science.com/catalog/5700/)という超小型な無線なしのバッテリー内蔵のものもあります。

# キットの構成

まず、キットの構成は次の通りです。

* SBC(Maixduino)本体
    * サイズ：Arduino UNOとほぼ同じピン配置、ボード形状
    * USBコネクタ：Type-C
* カメラ
    * 最大解像度：1600x1200
* 液晶
    * 画面サイズ：2.4インチ
    * 解像度：QVGA(320x240)

# ボード本体の機能

* メインMPUモジュール
    * [Sipeed M1 module w/o WiFi](https://www.mouser.jp/ProductDetail/Seeed-Studio/114991695?qs=sGAEpiMZZMu3sxpa5v1qrv9%252Bz890pMquhpgBTp19ehAI%3D)(SOM)
        * [Kendryte K210](https://kendryte.com/#products)(SoC)
            * [RISC-V](https://ja.wikipedia.org/wiki/RISC-V)（64bit/デュアルコア/FPU付）
            * 各種ハードウェアアクセラレータ
                * KPU（汎用ニューラルネットワーク処理）
                * APU（音声）
                * FFT（周波数）
                * AES/SHA256（セキュリティ）
* 無線モジュール（サブMPU）
    * ESP32(ESP-WROOM-32)
        * Wi-Fi(2.4GHz, 802.11.b/g/n)
        * Bluetooth 4.2(BLE/Classic)
* マイク
    * モノラル
* スピーカーアンプ（3W）
    * スピーカー自体はついてないので外付けする必要有
* microSD（TF）スロット
    * microSDをさすことができる
* Arduino互換ピン


# なにができるのか？

このキットとPCを使ってできることは次のようなことです。

* プログラミング
    * Python
        * MicroPythonベースのMaixPyがプレインストール済
        * PCとUSBでシリアル通信でPythonコードを書き込める
    * Arduino
        * Arduino IDE上で開発可能
* 深層学習
    * 動画・静止画
    * 音声
* IoT
* ロボットカー
jQueryを使った新規作成モーダル

```index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Progate</title>
  <link rel="stylesheet" type="text/css" href="stylesheet.css">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>
 

  <!-- モーダル部分 -->
  <div id="signup-modal" class="signup-modal-wrapper" >
    <div class="modal">
      <div>
        <i id="close-modal" class="fa fa-2x fa-times" ></i>
      </div>
      <div id="signup-form">
        <h2>Emailで新規登録</h2>
        <form action="#">
          <input class="form-control" type="text" placeholder="メールアドレス">
          <input class="form-control" type="password" placeholder="パスワード">
          <div id="submit-btn">新規登録</div>
        </form>
      </div>
    </div>
  </div>
  <!-- モーダルここまで -->


      <!-- 新規登録ボタン -->
      <div class="btn signup signup-show">新規登録はこちら</div>
      
    
   
 
  
      <!-- 新規登録ボタン -->
      <span class="btn message signup-show">さっそく開発する</span>
    
  
  <script src="script.js"></script>
</body>
</html>
```

```style.css
/*モーダル*/
.signup-modal-wrapper {
  position: fixed; /*画面転換*/
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: rgba(0, 0, 0, 0.6);
  z-index: 100;
  display:none;
}

.modal {
  position: absolute;/*画面を中央に寄せる*/
  top: 20%;
  left: 34%;
  background-color: #e6ecf0;
  padding: 20px 0 40px;
  border-radius: 10px;
  width: 450px;
  height: auto;
  text-align: center;
  
}
```

```main.js
$(function(){
$('#close-modal').click(function(){
    $('#signup-modal').fadeOut();
  });
  
  $('.signup-show').click(function(){
    $('#signup-modal').fadeIn();
  });
  
  
  });
```
カスタマイズ用
APIの3つの作り方

APIの3つの作り方について解説する。

#APIとは？
APIとは、JavaScriptやjQueryを用いたAjax通信を行う際、必要なデータのみをJSON形式で返すサーバの仕組みのことをいう(JSON API)。

#APIの3つの作り方

##1.既存のコントローラを共用してAPIとして使えるようにする方法
respond_to メソッドを使い、コントローラーでHTMLとJSONを返すための処理を条件分岐させる。

```ruby

respond_to do |format|
  format.html 
  format.json 
end
```

##2.新たに、API専用のコントローラーを作成する方法
コントローラ以下のディレクトリにAPIのファイルを作成する。

```
controllers/api/コントローラ名_controller.rb
```
もしも、APIのコントーローラと同じ名前のコントローラがすでに存在している場合は、名前空間(namespace,::)をつけることにより、それらを区別することができる。


```ruby

class Api::コントローラ名Controller < ApplicationController
 
end
```

ちなみに、この場合、ルーティングの設定方法が通常と異なる。

```ruby

namespace :api do
 resources :messages, only: :index, defaults: { format: 'json' }
end
```

##3.APIを作成するためのgemを利用する方法
rails-apiなどのgemをインストールするとできるようである(gemを利用したAPI作成ををまだ行なったことがない。)

詳しくは、以下の記事を参照ください。
https://www.sejuku.net/blog/10906#RailsAPI-2
【メモ】RedHatのproxy設定

qiita初投稿です

VirtualboxにRedHatを入れて

```yum
yum install
```

をしようとしたけど社内proxy設定が出来ていなくてコケまくったので備忘録

# 前提
 - VirtualBoxのプロキシ設定が完了している事
    - https://qiita.com/bori_so1/items/6c77404a5fb85bba9886
 - VMからプロキシサーバーにpingが通る事

# RedHat proxy設定
Redhatのconfも弄る必要があった

```yum
vi /etc/yum.conf
```

中身に以下を記述

```yum
proxy = http://proxy.com:port
proxy_username = user
proxy_password = password
```


いや当たり前だろ、とは思いつつ。
立派なインフラエンジニアになる為の小さな一歩を踏み出したという事でok（ポジティブ
JuliaGPU で乱数を生成する

# 環境

最新の `CuArrays` を用いる。
`curand` は deprecated なので使わない。

Julia Version 1.1.1
CuArrays v2.0.0 #master

`]add CuArrays#master`

# 配列の形で乱数を生成する

cuRAND を呼び出す

## Out of place

```julia
using CuArrays

rnd = CuArrays.rand(10)
```

https://github.com/JuliaGPU/CuArrays.jl/blob/master/src/rand/CURAND.jl

## In-place

```julia
using Random: rand!
using CuArrays

rnd = CuArray{Float32}(undef, 10)
rand!(rnd)
```

https://github.com/JuliaGPU/CuArrays.jl/blob/master/src/rand/highlevel.jl

# カーネル内で乱数を生成する

Combining the LCG (Linear Congruential Generator) and Tausworthe into an Improved Generator

```julia
using GPUArrays, CuArrays

function kernel(state, u, randstates)
    i = @linearidx u state
    r = GPUArrays.gpu_rand(eltype(u), state, randstates)
    @inbounds u[i] = 1.0f0 + r
    return
end

u = CuArray{Float32}(undef, 10)
rng = GPUArrays.global_rng(u)

gpu_call(kernel, u, (u, rng.state))
```

https://github.com/JuliaGPU/GPUArrays.jl/blob/master/src/random.jl
https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch37.html