OmniAICreator/Qiita-1.07M huggingface dataset:
NefryBTでLINE Thingsの自動通信機能を試す #nefrybt #linethings


[LINE Things Messageを使ってみよう #linethings #linedc](https://qiita.com/n0bisuke/items/7f3da133a2363b549e3e)の記事のSTEP4をNefryBTに置き換える感じの資料です。

## 準備

[LINE Things Messageを使ってみよう #linethings #linedc](https://qiita.com/n0bisuke/items/7f3da133a2363b549e3e)の記事を元に以下を完了させましょう。

* LINE BOTの作成
* サービスUUIDの取得

STEP3まで終わらせましょう。

## Nefry BTへの書き込み

### Arduino IDEへNefryBT向けのボード追加

Arduino IDEのメニューから環境設定を開きます。

> <img src="https://i.gyazo.com/f8be939400d8413bfbf28e370ce9b907.png" width="500px">

このアドレスを追加のURLに設定します。

```
https://nefry.studio/package_nefrybt_index.json
```

Arduino IDEのツール>ボード>ボードマネージャーを開き、Nefryと検索してボードライブラリをインストールします。

> <img src="https://i.gyazo.com/9aac1cf741c07e526736fbfa624aac07.png" width="500px">

### サンプルコードの用意

こちらのコードのサービスUUIDを書き換えてNefryBTに書き込みます。

https://gist.github.com/n0bisuke/c6239a5f4d93841be49fdddeeb139420#file-nefrylinethings-ino-L11

### プログラムの書き込み

NefryBTをPCのUSBポートに接続し、ツール>シリアルポートから`/dev/cu.usebserial-xxxxx`を選択します。(Windowsの場合はCOM1など)

また、ボードは`Nefry BT R2/R3`など各自の型番（リビジョン）にあったものを選択しましょう。
(リビジョンはNefryBTの基板の背面に書いてあります。)

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/11cc3e43-b452-843b-8f0c-f690e826842e.png" width="500px">

選択できたら`→`ボタンを押してプログラムを書き込みします。

## LINE BOTと連携してみる

[LINE Things Messageを使ってみよう #linethings #linedc](https://qiita.com/n0bisuke/items/7f3da133a2363b549e3e)のSTEP5から再開すればOKです。

ボタンを押して確認する手順では以下の写真のようにSWと書いているボタンを押しましょう。

<img src="https://i.gyazo.com/45fed2ae6cbc6608cb1bdbc64744e541.jpg" width="500px">


問題なければLINE BOTに通知が行きます。
『ディープラーニングと物理学』に出てくるキーワード集（第１章　はじめに：機械学習と物理学）

# 序　
Amazon Japanの[物理学一般関連書籍 の 売れ筋ランキング](https://www.amazon.co.jp/gp/bestsellers/books/500788/ref=zg_b_bs_500788_1)の第一位（2019年7月6日時点）となっている、
『ディープラーニングと物理学』。
ディープラーニングに興味のある皆さんには気になる存在なのではないだろうか。既に購入した皆さんも多いのではないかと。

![](https://images-na.ssl-images-amazon.com/images/I/41pHJYelvtL._SX346_BO1,204,203,200_.jpg)
※[『ディープラーニングと物理学』](https://amzn.to/2S2itMX)

私は最近の趣味が余剰次元とかを考えること（素人物理学）なこともあり、どこかで本業(データエンジニア、時々、データ解析者)に役立てばということで、Kindle版を購入して少しずつ読み進めているところ。
読みながら気づいたのが、この本は、ググりたくなるようなキーワードが盛りだくさんだということ。

どうせググりまくるならば、この本の中身が気になっている皆さん向けの参考資料として、
キーワード集を作っておこうかと思った次第。
完全に個人的セレクションですし、参考リンクは、アカデミアの皆さんのものに限らずセレクトしてますが、ご参考までに ;-)


# 第1章のキーワード集

```
書式は、『キーワード(出現ページ)　参考リンク』です。
```
- 情報エントロピー(p3) https://logics-of-blue.com/information-theory-basic/
- 多自由度系(p5) http://www.az.cs.is.nagoya-u.ac.jp/class/vib/chap_4.pdf
- ブラックホール情報喪失問題(p5) https://www.jps.or.jp/books/gakkaishi/2016/05/71-05_70fushigi07.pdf
- マクスウェルの悪魔(p6) https://news.mynavi.jp/article/20101119-a113/
- 量子情報理論(p7)
http://www.saiensu.co.jp/preview/2018-978-4-7819-9953-1/SDB44_sample.pdf
- 相対エントロピー(p7)　別名は、[カルバック・ライブラー情報量](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%83%BB%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%BC%E6%83%85%E5%A0%B1%E9%87%8F)(p10)
- サノフの定理(p7) http://www.math.tohoku.ac.jp/~kuroki/LaTeX/20160616KullbackLeibler.pdf
- 最尤推定(p8) https://mathtrain.jp/mle
- スターリングの公式(p9) https://mathtrain.jp/stirling
- ラグランジュ未定乗数法(p9) https://mathtrain.jp/mlm
- イジング模型(p13) https://www.hitachi.co.jp/rd/portal/glossary/jp_i/izingumoderu.html
- ホップフィールド模型(p13) http://www.kurims.kyoto-u.ac.jp/~kyodo/kokyuroku/contents/pdf/1706-04.pdf
- ボルツマンマシン(p13) https://postd.cc/a-beginners-guide-to-restricted-boltzmann-machines/
- ResNet(p14) https://deepage.net/deep_learning/2016/11/30/resnet.html

# 第Ⅰ部　物理から見るディープラーニングの原理
[こちら](https://qiita.com/Nimimal/items/ad371c7d7f1cb44ab00b)に置く。
# 第II部 物理学への応用と展開
【AWS】RDSインスタンスが作れないのだけれど (リクエスト失敗)

DBインスタンスを作ろうとしたときに下記のエラーが出てうまく作れませんでした。

##エラーの内容
>DB インスタンス database-1 の作成のリクエストが失敗しました。
Value (RDS マネジメントコンソールで作成) for parameter GroupDescription is invalid. Character sets beyond ASCII are not supported.

<img width="957" alt="image1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378681/e6755bb1-a2d8-3dcd-9ac0-86183d4bc68d.png">

##解決方法
どうやらこのエラーは日本語が悪さをしているようです。
表示言語を英語にして作成したところすんなり作成することができました。

言語選択はAWSのフッターのところから変更できます。
(言語を変更すると画面内の入力していた情報がリセットされてしまいます)
<img width="957" alt="image1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378681/b850f7cf-7a45-4e71-e129-6e2798664bbb.png">
[JavaScript] template literals でなんちゃって string.format()

# やりたかったこと

Enum を定義しているような場合に、共通メッセージ用のテンプレート文字列を定義しておいて、必要な時に placeholder に対して任意の値を入れて使いたい。

例えば Python だと、`string.format()` を使うことで下記のようにできます。

```python
message = "[Error] code: {code}, message: {message}"

print(message.format(code="000", message="error message text"))

# >>> [Error] code: 000, message: error message text
```

JavaScript ではこれに該当するメソッドがないので、独自の実装を作って使っている人も多いみたいです (ｼｮｼﾝｼｬｰ なのでよくわからん)。皆大好き stackoverflow では Yahoo (.com) のライブラリの例として下記のようなコードが貼られてました。

```javascript
YAHOO.Tools.printf = function() { 
  var num = arguments.length; 
  var oStr = arguments[0];   
  for (var i = 1; i < num; i++) { 
    var pattern = "\\{" + (i-1) + "\\}"; 
    var re = new RegExp(pattern, "g"); 
    oStr = oStr.replace(re, arguments[i]); 
  } 
  return oStr; 
} 

// YAHOO.Tools.printf('{0} {1} {2}', 'aaa', 'bbb', 'ccc'); 
```

# template literals 使う

もうちょっと手軽でスマートな感じにしたい、そこで思いつくのは
ES6 で入ってきたおなじみの template literals ですが、

```javascript
const templateString = `[Error] code: ${code}, message: ${message}`;
```

上記の場合の問題点は、事前に `code` / `message` 変数が定義されている必要があることです。
そこで、文字列を下記のように関数で囲ってしまいます。

```javascript

const templateString = ({code, message}) => `[Error] code: ${code}, message: ${message}`;
```

また上記の例では[分割代入](https://qiita.com/mosaxiv/items/df6af86e3145f7f9c4d8)を使っているので、呼び出し側では引数の順番を考慮する必要がなく、キーに対して値を指定するのでコードの可読性も高いと思います。

```javascript

const templateString = ({code, message}) => `[Error] code: ${code}, message: ${message}`;

// どちらも出力は同じ
console.log(templateString({code: '000', message: 'error message text'}));
console.log(templateString({message: 'error message text', code: '000'}));

// >>> [Error] code: 000, message: error message text
```

これなら楽ですね！

## 番外編

実は上記の方法を知るまでは、[Tagged template literals](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_templates) を使って同様のことをやろうとしていました。仕様はドキュメントを見てもらえればと思いますが、下記のようになります。

```javascript

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#Tagged_templates
// コードは上記からまんまなので、実際にはテンプレート文字列中で、
// `${0}` のように、整数 or `${'keyword'}` 形式で指定可能
function template(strings, ...keys) {
    return (function(...values) {
        var dict = values[values.length - 1] || {};
        var result = [strings[0]];
        keys.forEach(function(key, i) {
            var value = Number.isInteger(key) ? values[key] : dict[key];
            result.push(value, strings[i + 1]);
        });
        return result.join('');
    });
}

const templateString = template`[Error] code: ${'code'}, message: ${'message'}`;

console.log(templateString({code: '000', message: 'error message text'}));
// >>> [Error] code: 000, message: error message text
```

関数を定義しておき、テンプレート文字列を定義する時にこの関数を"タグ付け"しておくことで、呼び出し時に任意の処理を加えることができます。今回の例では単純に文字列の結合処理のみでしたが、Tagged template literals は他にも色々と応用が効きそうです。

参考: [Tagged Template literals — Its more than you think](https://codeburst.io/javascript-es6-tagged-template-literals-a45c26e54761)
RailsでリクエストがDeleteの代わりにGetで送信されエラーになった時の対処法

# 事象
個人開発でWebアプリにログアウト機能を追加したが、
本来Deleteメソッドで送信したいリクエストがGetメソッドによって送信されてしまい、エラーとなってしまっていた。
（原因わからず、数日ハマる...）

```terminal
Started GET "/logout" for ::1 at 2019-07-06 13:53:12 +0900
  
ActionController::RoutingError (No route matches [GET] "/logout"):
```
<img width="478" alt="スクリーンショット 2019-07-06 14.01.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124088/398b8ae1-e77b-86ee-2e13-a5fc942adf40.png">

ちゃんと`method: :delete`も書いてある。

```slim:application.html.slim(application.html.erb)
li.nav-item= link_to 'ログアウト', logout_path, method: :delete, class: 'nav-link'
```

# 参考記事
こちらに全く同じ事象の記事が。
[Railsでリンククリックした際に、Deleteの代わりにGetが送信されてしまう](https://qiita.com/yuskamiya/items/ee5280dfcbca9d7216ae)
[Delete link sends “Get” instead of “Delete” in Rails 3 view](https://stackoverflow.com/questions/3774925/delete-link-sends-get-instead-of-delete-in-rails-3-view)

# 原因と解決方法
どうやら、javascriptタグを誤って記載していたのが問題のよう。
（Webpackを導入しようとして結局辞めた形跡が…）

```slim:application.html.slim(application.html.erb)
= javascript_pack_tag 'application'
```

修正後

```slim:application.html.slim(application.html.erb)
= javascript_include_tag 'application'
```

このタグが誤っていたせいで、application.jsが読み込まれないことが原因のようだった。
修正後、うまくログアウトが可能になりました。
JavaScriptのイベント伝播って？（addEventListenerの第三引数についても）

#JavaScriptのイベント伝播
今日は`addEventListener`の引数について調べていたら、
イベント伝播？バブリング？キャプチャリング？？！と知らないことだらけだったので、
調べてまとめてみます！

##まず大前提：イベントは伝播するということ

```HTML
<!--HTML-->
<div id="parent">     <!--親-->
  <div id="child">    <!--子-->
  </div>
</div>
```

このように親子関係になっている二つの要素に、イベントリスナを登録します。

```JavaScript
document.getElementById('parent').addEventListener('click',()=>{
   alert('親だよ');
});
document.getElementById('child').addEventListener('click',()=>{
   alert('子だよ');
});
```
このように親子関係で同じイベントリスナを登録し子をクリックすると、親のイベントも一緒に発動します。

##イベントの伝播の道筋
イベントが発生したら、以下の道筋を辿ります。

**①キャプチャーフェーズ**
  windowからその子へ、そしてその子へ、、と順従に目的のノードに向かってイベントが走るフェーズ。
**②ターゲットフェーズ**
  イベントが発生した要素にイベントが伝わるフェーズ
**③バブリングフェーズ**
  イベント発生元から親へ向かって順々にイベントが走るフェーズ。

え！二回も走ってるの！？:robot:
と思いました。じゃあどっちでイベント伝播してるの？と。

##addEventListenerの第三引数
それを定めることができるのが`addEventListener`の第三引数らしいです。

```javascript
element.addEventListener('click',event,true/false);
```
`true`・・・キャプチャーフェーズ時に発火する。（つまり親から先に発火）
`false`・・・バブリングフェーズ時に発火する・（つまり子から先に発火）←**初期値**

これでどちらから発火させるか？をコントロールすることができます。
なんならキャプチャーフェーズ時とバブリングフェーズ時に**二回**発火も可能みたいです。

使い方によっては面白いことができそうです。

##伝播やめて！！！
`stopPropagation()`を使えばいいそうです。

```JavaScript
document.getElementById('parent').addEventListener('click',()=>{
   alert('親だよ');
});
document.getElementById('child').addEventListener('click',(e)=>{
   e.stopPropagation();
   alert('子だよ');
});
```

これで子をクリックしても、親のイベントリスナがバブリングすることがなくなります。


##おまけ：登録したイベントリスナを無効にしたい

`removeEventListener`
・・・addEventListenerで登録したイベントリスナーを削除する。
こいつを使えばおっけーです。ただし、addEventListenerの第二引数を無名関数にすると使えないので注意！

```JavaScript
function message() {
   console.log('Erase me!');
}

element.addEvenetListener('click',message) //登録

element.removeEventListener('click',message)  //削除
```
Laravelデフォルトのapp.jsをES2015以降の設定で書く

ここの部分。

```js

//resources/assets/js/app.es5.js
window.Vue = require('vue');

/**
 * Next, we will create a fresh Vue application instance and attach it to
 * the page. Then, you may begin adding components to this application
 * or customize the JavaScript scaffolding to fit your unique needs.
 */

Vue.component('example', require('./components/Example.vue'));

const app = new Vue({
    el: '#app'
});
```

こう書くとちょっとスッキリする気がする。

```js
//resources/assets/js/app.es2015.js
import Vue from 'vue'
import App from './components/Example'

new Vue({
    el: '#app',
    components: {
        app: App
    }
})
```
AmbariのHostname途中で変更した

http://mail-archives.apache.org/mod_mbox/ambari-issues/201801.mbox/%3CJIRA.13131513.1516179364000.16101.1516185840129@Atlassian.JIRA%3E


```
[root@hokuto centos]# python
Python 2.7.5 (default, Jul 13 2018, 13:06:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> print socket.getfqdn()
data-demo.work
>>>
```
サイトをいじってふざけよう！（Chromeデベロッパーツール）

最近知ったChromeのデベロッパーツールの簡単な使い方を初心者なりになんとなくまとめてみました。

いい感じのサイトを見つけて、「HTMLどうやって書いてるんだ？」「CSS読みたいな。。」「ここのコードを変えたらどんな表示になるのかな？」「自分のサイトを一時的にいじってみたいな」と思うことがあると思います。
そんな時に便利なのが、**Chromeのデベロッパーツール**です！
直感的に操作できるのでとっても便利です。

#起動方法
**Chrome**をインストールしていれば、誰でも使うことができます！
![スクリーンショット 2019-07-06 13.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/d24b9346-562e-780a-a1bd-d3cf13ab9195.png)
[私のサイト](http://google.com "Title")です。（露骨な宣伝）
（このサイトはHTMLとCSSを本で勉強して頑張って作りました。~~誰も見ないブログもあるよ~~）
これを例にして説明しようと思います。
##1.右上のボタンを押す。
右上の点が三つ並んだボタンを押します。
その他のツール⇨デベロッパーツールを選択。
![スクリーンショット 2019-07-06 13.32.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/7919a106-6a0a-283d-6f79-73c67f220077.png)
##2.はい終わり。
![スクリーンショット 2019-07-06 13.35.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/24dfb464-0219-d46e-f979-f9e306a51d8b.png)
これで開けます。とても簡単です。

#使い方
![スクリーンショット 2019-07-06 13.38.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/3192f66a-be5c-ef3e-a2ca-586ecdec95b3.png)
こんな感じに見えます。
▶️を押すとコードが展開できます。
##便利な選択ツール
コード画面の左上の矢印マーク![スクリーンショット 2019-07-06 13.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/0432ddb7-1367-5986-7487-abce1d896227.png)を押してカーソルを中が見たい部分に移動させると、
![スクリーンショット 2019-07-06 13.42.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/3113e9d0-d41f-8a7b-348a-723bb63f98bb.png)
こんな風に簡単に部分選択ができCSSが見れます。しかも右画面でそのコードの部分を青く表示してくれます。
そのままクリックするとコードのその部分にジャンプできます！
##編集してみよう
一時的にコードを編集してみることができます。**ネット上のページが本当に編集されたりはしませ〜ん。**あくまで一時的に試してみる用として使ってください！
![スクリーンショット 2019-07-06 13.52.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/54365c43-7d8b-2f45-3939-c6f1571236ed.png)
コード画面で変更したい部分を**ダブルクリック**するとそこを編集できます。
編集してからエンターキーを押すと。。
![スクリーンショット 2019-07-06 14.01.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/b075750d-2c67-70d1-6a95-f2eaebcd2947.png)
はい！適用されました！~~タブってこうやって増えるんだな。。~~
もちろんCSSも同じように編集できます。

みなさんもやってみてください！（他の人のサイトでやって見るときはあくまで自分用に楽しんでね。）

#おまけ
![スクリーンショット 2019-07-06 14.22.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289749/08b75187-d46d-4f3a-2591-84177c7753b2.png)
expoで、there was a problem loading the requested appと白い画面に表示されるエラー

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)
単純にシュミレーターの中にインストールされたexpoクライアントで、ログインをしていないだけ。

## 解決方法

Go back to Expo Homeをタップ
<img width="375" alt="Simulator Screen Shot - iPhone X - 2019-07-06 at 14.26.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/fb644e71-de8b-cd1d-2a38-082c4437ede3.png">

profileをタップ
<img width="375" alt="Simulator Screen Shot - iPhone X - 2019-07-06 at 14.26.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/86fa43fc-145c-b581-9539-4a0a2a99bd27.png">

Sign inしよう。
<img width="375" alt="Simulator Screen Shot - iPhone X - 2019-07-06 at 14.26.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/45e32924-fcbd-39bb-06d0-431e9243a585.png">

解決！

expo start -c
expo ios
を実行すると正常なアプリが表示される。

もし、これで治らなかったら、シュミレーターをリセットしよう。
#Ruby で 閏年の 2月28日を 月末の 2月29日にシフトする例

閏年の場合は 28日を29日にする

```rb
some_date = Date.new(2020, 2, 28)
some_date += 1.day if some_date.leap? && some_date.month == 2 && some_date.day == 28

some_date # => Sat, 29 Feb 2020

```

閏年でない場合はそのまま

```rb

some_date2 = Date.new(2019, 2, 28)
some_date2 += 1.day if some_date2.leap? && some_date2.month == 2 && some_date2.day == 28

some_date2 # => Thu, 28 Feb 2019
```


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Ruby or #Rails で 2月末の日付を得る ( 28日 or 29 日 ) (閏年対応 )

Ruby の場合は `gem install activesupport` しておく

```rb
require 'active_support/all'  # Rails の場合は不要

Date.new(2019,2).end_of_month # => Thu, 28 Feb 2019
Date.new(2019, 2).end_of_month.day # => 28

Date.new(2020,2).end_of_month # => Sat, 29 Feb 2020
Date.new(2020, 2).end_of_month.day # => 29
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
hamlでハッシュロケットをシンボル型に書き変える

hamlでハッシュロケットをシンボル型に置き換える方法を少し調べたが
情報を拾うのに時間がかかったためメモ。


```:変更前
 = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => 'true'
```

最初に調べた拾った情報はこちら

```:最初に拾った情報
 = stylesheet_link_tag    'application', media: 'all', data: { turbolinks: { track: true }}
```
どうやら以前はハイフンが入るとまずかったらしい。

執筆日時点はこの記述で処理ができる。

```
 = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'true'
```
#Ruby でうるう年かどうかを判定する

日は関係なく、うるう年かどうかだけを見てくれるようだ。

```rb
Date.new(2019).leap? # => false

Date.new(2019, 1, 1).leap? # => false

Date.new(2019, 2, 29).leap? # ArgumentError: invalid date
```

```rb
Date.new(2020).leap? # => true

Date.new(2020, 1, 1).leap? # => true

Date.new(2020, 2, 29).leap? # => true
```



# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
C#学習　-継承-

C#学習中のため、学習内容をメモしていく。
間違いやアドバイスがあればコメントからよろしくお願いします。

#継承
親クラスのメンバーを子クラスが引き継ぐことができる。
継承するには : をつけてクラス宣言する。

```C#
class Cat : Animal{
　// Animalを基底クラス、親クラス、スーパークラスと呼ぶ
　// Catを派生クラス、子クラス、サブクラスと呼ぶ
}
```
コード例

```C#
// 親クラス
class Animal
{
    public string Kind;
    public string Cry;

    public string Show()
    {
        return $"{this.Kind}";
    }
}

// 子クラス
class Cat : Animal
{
    public string Name;

    // 子クラス独自のメソッドを定義可能
    public string GetCry()
    {
        // 親クラスの変数が利用可能
        return $"{this.Kind}は{this.Cry}と鳴く";
    }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat
        {
            Kind = "猫",
            Cry = "にゃー",
            Name = "ルミ"
        };
        // 親クラスで定義されたShowメソッドを
        // 子クラスのメンバーであるかのように呼び出せる
        Console.WriteLine(cat.Show());
        Console.WriteLine(cat.GetCry());
    }
}

```

#メソッドの隠蔽
親クラスに存在するメンバーを子クラスに追加すると、子クラスのメンバーが優先され、親クラスのメンバーが見えなくなる。
隠蔽をするにはnewキーワードをつけて宣言する。

コード例

```C#
// 親クラスのShowメソッドを隠蔽
public new string Show()
{
    return $"{this.Kind}の{this.Name}";
}
```

#メソッドのオーバーライド
隠蔽と同じように親クラスのメンバーを再定義することができる。
親クラス側のメソッドにvirtual修飾子をつけて定義する。(仮想メソッド、仮想メンバーと呼ぶ)
子クラス側のメソッドにoverride修飾子をつけて定義する。
virtual無しのメソッドをオーバーライドすることはできない。

コード例

```C#
// 親クラス
class Animal
{
    public string Name { get;}

    public string Kind { get;}

    public Animal(string name, string kind)
    {
        Name = name;
        Kind = kind;
    }

    public virtual string Show()
        => $"{this.Kind}の{this.Name}";
}

// 子クラス
class Cat : Animal
{
    public int Age { get; }

    public Cat(string name, string kind, int age) : base(name, kind)
    {
        Age = age;
    }

    public override string Show()
    {
        if (Age < 1)
        {
            return $"{this.Kind}の赤ちゃんの{this.Name}";
        }
        else
        {
            return base.Show();
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
            var cat1 = new Cat("くろ", "マンチカン", 5);
            var cat2 = new Cat("ミケ", "三毛猫", 0);

            Console.WriteLine(cat1.Show());
            Console.WriteLine(cat2.Show());
    }
}
```
実行結果

```
マンチカンのくろ
三毛猫の赤ちゃんのミケ
```


#継承時のコンストラクターの動作
継承関係のあるクラスでは上位クラスから順にコンストラクターが呼び出される。

コード例

```C#
// 親クラス
class Animal
{
    public Animal()
    {
        Console.WriteLine("動物");
    }
}

// 子クラス
class Cat : Animal
{
    public Cat()
    {
        Console.WriteLine("猫");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat();
    }
}

```

実行結果

```
動物
猫
```

引数ありのコンストラクターを呼び出す場合は、baseキーワードを付加する。

コード例

```C#
// 親クラス
class Animal
{
    public Animal(string str)
    {
        Console.WriteLine($"動物が{str}です");
    }
}

// 子クラス
class Cat : Animal
{
    public Cat(string str) : base(str)
    {
        Console.WriteLine($"猫が{str}です");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat("好き");
    }
}

```

実行結果

```
動物が好きです
猫が好きです
```

#継承の禁止
継承をさせたくない時はsealed修飾子を付与することで、継承そのものを禁止することができる。

コード例

```C#
// 親クラス
sealed class Animal
{
}

// 子クラス
class Cat : Animal  => エラーとなる
{
}
```

#参考した本
独習C#

おわり。
BCCでeBPFに入門

eBPFは、ユーザが定義したプログラムをカーネルランドで実行するための仕組みです。計測、セキュリティ、ネットワーク処理などの利用用途があります。

[BPF Compiler Collection (BCC)](https://github.com/iovisor/bcc)という、eBPFプログラムの作成や実行を簡易的に行うためのツールセットがあります。
カーネルランドで動かすBPFプログラムはCで書く必要がありますが、BPFプログラムの読み込みや出力のフォーマットなどはPython（もしくはlua）のバインディングを利用して書くことができます。

## サンプルプログラム

ループバックインターフェイスに対するICMPパケットのみをドロップするプログラムを書いてみました。

BPFプログラムは次のとおりです。不正なメモリアクセスなどが発生しないように、データアクセスの前にそのデータ長を事前チェックするなど、堅牢なプログラムにしておかないとverifierで弾かれるので注意。

```prog.c
#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/in.h>
#include <linux/ip.h>

int prog(struct xdp_md *ctx) {
    int ipsize = 0;
    void *data = (void *)(long)ctx->data;
    void *data_end = (void *)(long)ctx->data_end;
    struct ethhdr *eth = data;
    struct iphdr *ip;

    ipsize = sizeof(*eth);
    ip = data + ipsize;
    ipsize = sizeof(struct iphdr);
    if (data + ipsize > data_end) {
        return XDP_PASS;
    }

    if ((void *)&ip[1] > data_end) {
        return XDP_PASS;
    }

    if (ip->protocol == IPPROTO_ICMP) {
        bpf_trace_printk("drop!\\n");
        return XDP_DROP;
    }

    return XDP_PASS;
}
```

ユーザランドで実行するPythonプログラムは次のとおりです。  



```example.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from bcc import BPF


def main():
    b = BPF(src_file='program.c')
    fn = b.load_func('prog', BPF.XDP)
    device = 'lo'
    b.attach_xdp(device, fn, 0)
    try:
        b.trace_print()
    finally:
        b.remove_xdp(device, 0)


if __name__ == '__main__':
    main()

```
git stashとconflict対処の実用ガイド

# TL;DR コンフリクトを解決した後は git reset
### まずはstash
`git stash`
でローカルの変更内容を退避。もしくは
`git stash push -m "message"`
で説明を付けて退避する。
`-p`オプションを使うと`git add -p`のように好きな部分を選んで退避できる。

ワーキングツリーのstashされた部分は最後のコミット直後の状態に戻るのでここで好きな作業などをする。
例えば別のコミットをしてそこから更に変更を加えたりなど。

退避した変更を戻して適用するには
`git stash pop` 直近のstashエントリーを適用して無事終わったら削除
もしくは
`git stash apply`　直近のstashエントリーを適用
`git stash drop`　直近のstashエントリーを削除

コンフリクトが発生しなかったらめでたしめでたし。

もし未コミットな変更があると以下のように言われてしまうのでその変更をコミットしたりこれもまたstash pushする(popするときはstashの名前を指定する必要が出てくるけど)などして対処する。もし未コミットな変更もpopするときに混ぜたいなら全部`git add`だけして`git stash pop --index`すると良い。

```
error: Your local changes to the following files would be overwritten by merge:
	*
Please commit your changes or stash them before you merge.
Aborting
```
### コンフリクト発生
もしコンフリクトが発生したら以下のように表示される。

```
CONFLICT (content): Merge conflict in *
```

コンフリクトしたファイル内容は以下のようになっているので`<<<`や`>>>`などで検索し手動でマージして解決する。>>>や<<<<や===などの行は削除する。手動ではなくstashの内容を全採用したいなら`git checkout --theirs`などの方法もある。

```
...
<<<<<<< Updated upstream
適用先の内容
=======
退避した内容
>>>>>>> Stashed changes
...
```

そしてこの時点でコンフリクトが発生しなかった他のファイルはステージング(git addした状態)されている。またコンフリクトを解決したファイルもgitの内部状態ではコンフリクトしたままなので`git reset`して一括でunstageしてやる。これでgit内部のコンフリクト状態も解決するし、`git diff`ですべての変更点が表示されるようになる。
`git reset`ではなくコンフリクトしていたファイルを`git add`してもgit内部のコンフリクト状態が解消されるのですぐにコミットするつもりなら`git add`でも良い。
### その他
`git stash list` stashエントリー一覧
`git stash show -p stash@{1}` 一つ前のエントリの内容を表示
`git stash list --pretty=oneline` 各stashのハッシュ値を表示

stashで退避した後に過去のコミットへ戻って作業するときは`git checkout ハッシュ`で戻れます。
作業が終わった後に最新のコミットへ帰って来るときは`git checkout master`などブランチ名で戻るようにしましょう。ハッシュ名などで戻るとdetached HEADの状態(匿名のブランチを作った状態)が継続したままなので新たなコミットを行うとツリーが分岐してしまいます。
戻ったときに`git branch`で`* (HEAD detached at ハッシュ)`となったらdetached HEADの状態です。また`git log`でも確認できます。(HEAD, master)となっていたらdetached HEADの状態になっています。(HEAD -> master)となっていればOKです。

https://stackoverflow.com/questions/7751555/how-to-resolve-git-stash-conflict-without-commit
https://git-scm.com/docs/git-stash
GASでスプレッドシートを触るときによく使うメソッド一覧

GASを使ってやってみたいことが増えてきたので、勉強していた中で、スプレッドシートを弄るときに利用するメソッドの一覧を復習も兼ねてまとめていこうかと思います。

# メソッド一覧
### getActiveSpreadsheet()
GASと連動しているアクティブなスプレッドシートを取得するためのメソッド。

### getSheetByName()
スプレッドシートの中にある、シートというオブジェクトを取り出すためのメソッドです。(下の写真の赤い丸で囲った部分です。

<img width="1190" alt="スクリーンショット 2019-06-30 18.04.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392294/c67593ed-20d7-5321-8fe8-1a5aa9f1cc83.png">

### getName()
シート名を取得するためのメソッド。

###SpreadsheetApp.getActiveSheet()
こちらのメソッドはアクティブなシートを取得するためのメソッドです。利用するシートが一枚のみであればこちらの方法は有効。シート名自体はユーザーが自分で変えることも出来るため、getSheetByNameだと、名称変更があった際にうまく動かなくなる。

### getRange()
シートの中の行数や列数を取得するためのメソッド。シートの指定の仕方は行と列を数値で指定するケースとA列○行目(E3などのように)で指定するケースがあります。

`Sheetオブジェクト.getRange(行番号, 列番号, 行数, 列数)`

行番号と列番号は、○行目の○列目という指定の仕方をする。例えば下記の写真の赤で塗りつぶした部分を取得するには、5行目の3列目なので、('5,3')として指定する。

<img width="552" alt="スクリーンショット 2019-07-01 8.15.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392294/f64d8b47-a996-4ff8-d468-cfff0410f879.png">

行数と列数に関しては、前半で指定したセルを起点とし、左右にどれだけの範囲で取得したいのかを取得します。C5のセルから、7行目E列までを取得したい場合は、行数が3行で、列数も3列なので、('3,3')と書きます。

したがって今回の場合は下のように記載します。

`Sheetオブジェクト.getRange('5, 3, 3, 3')`

2つ目の足り方としては、5行目3列目を指定する場合は、C5と入れたり、範囲を入れる際は左上と右下のアドレスを下記のように入れます。

`sheetオブジェクト.getRange('C5:E7')`

### getA1Notation()
getRangeメソッドで取得した範囲のアドレスを取得するためのメソッド。

### clear()
clearメソッドは指定したRangeオブジェクトの内容をすべて削除するメソッドです。書き方は以下です。
`Rangeオブジェクト.clear()`

ただclearメソッドを使ってしまうと、セルの範囲内のセルのすべてをクリアしてしまいます。消したい内容が、セルの中の値だけであれば、clearContentメソッドを使います。

### getValue()
セルの値を取得するメソッド。例えば5行目3列目の情報が欲しければ、`sheetオブジェクト.getValue('C5')`と書く。複数の値を範囲指定して出す場合は`sheetオブジェクト.getValues('C5:E7')と記載します。

###getLastRow()
最後の行を検知するためのメソッド。

`Sheetオブジェクト.getLastRow()`
と指定すると、シートにある最終行を獲得することが出来ます。

###setValue()
getValueメソッドがスプレッドシートから値を取得するメソッドで有ることに対し、setValueメソッドでは、スプレッドシートのセルに値を入力するメソッドです。書き方はいかになります。

`Rangeオブジェクト.setValue()`
MNCTF2019 標的攻撃Ⅳ

#問題

http://mnctf.info/mnctf2019/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d6b8cfd0-d66a-66d4-ae51-e8f60dcc704f.png)

#解いてみた

a.EXEを再度サクラエディタで開いてみます。

問題のとおりユーザ名を非表示にするレジストリが書かれているか見てみたら、書いてました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4a893a8e-81f8-7739-5eeb-a9236b89c1bb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d31aed5b-1b20-edb5-3da1-9bb935a663d9.png)
ancestryによる多階層構造の実現

プログラミングスクールのチーム開発で、
カテゴリーに**親・子・孫の関係**をもたせたいと思った時のお話です。
Railsのgem '*ancestry*'を導入することで実現することができました。

ancestryのgithub
https://github.com/stefankroes/ancestry

###開発環境
Ruby 2.5.1
Rails 5.2.3

#やりたかったこと
下記の写真のように、（一部抜粋）
・親：メンズ
・子：トップス
・孫：すべて, Tシャツ/カットソー（半袖/袖なし）, Tシャツ/カットソー（七分/長袖）...
カテゴリーの項目に対して、関係性をもたせる。
[![Image from Gyazo](https://i.gyazo.com/c7ac18a5777c0ff92d65aec4a3aadf3a.png)](https://gyazo.com/c7ac18a5777c0ff92d65aec4a3aadf3a)

#ancestry導入でできること
概略をいうと、以下のテーブルのように、レコードごとの関係性を示すパス（カラム名：ancestry。gemのREADMEにのっとり、名前を決めています）を簡単に作成することができます。
また、データの取り出しも、パスを使うことで簡単に行うことができます。

| id | name | ancestry |
|--:|:--|:--|
| 1 | メンズ | nil |
| 2 | トップス | 1 |
| 3 | すべて | 1/2 |
| 4 | Tシャツ/カットソー（半袖/袖なし） | 1/2 |
| 5 | Tシャツ/カットソー（七分/長袖） | 1/2 |

・親のパス（ancestry）は*nil*
・子のパスは、親の*id*
・孫のパスは、(親の*id*)/(子の*id*)
となります。

# 実際に上記のDBを作るまで
まずはじめに、

| id | name | 
|--:|:--|
のテーブルを作成してください。
## ancestryの下準備
下記のREADMEに従えば大丈夫です
https://github.com/stefankroes/ancestry

###Gemfile
Gemfileに記述を追加

```rb
gem 'ancestry'
```
ターミナル上で、下記のコードを実行

```console
$ bundle install
$ rails g migration add_ancestry_to_category ancestry:string:index
```
categoriesテーブルにancestryのカラムを作成

```migration.rb
class AddAncestryToCategory < ActiveRecord::Migration[5.2]
  def change
    add_column :categories, :ancestry, :string
    add_index :categories, :ancestry 
  end
end
```
categoryモデルにancestryを明示

```category.rb
class Category < ApplicationRecord
   ~省略~
   has_ancestry
end
```

これで、テーブルの準備は整いました。

##ancestryのメソッドを用いてデータ挿入
カテゴリーデータは、アプリの初期データとして欲しかったので、seedを使いました。
seedを使って、すべてのデータを作成したお話は、別の機会に。
https://qiita.com/ATORA1992/items/617088f885117532454e

今回は、例で出したテーブルの作成に絞ってお話します。
ancestryを導入すると、便利なメソッドを使うことができます。（一部抜粋）

|  method           |return value|
|-------------------|------------|
|`children`         |子供のレコードを取り出せます|

すべてのメソッドは
https://github.com/stefankroes/ancestry
の*Navigating your tree*を参照してください。

上記のメソッドは、データの取り出しだけではなく、作成時にも使うことができます。
これらを使うと、、、

```rb
mens = Category.create(:name=>"メンズ")

mens_tops = mens.children.create(:name=>"トップス")

mens_tops.children.create([{:name=>"すべて"}, {:name=>"Tシャツ/カットソー（半袖/袖なし）"},{:name=>"Tシャツ/カットソー（七分/長袖）"}])
```
とすることで、勝手にancestryにパスのデータも作成してくれます。

| id | name | ancestry |
|--:|:--|:--|
| 1 | メンズ | nil |
| 2 | トップス | 1 |
| 3 | すべて | 1/2 |
| 4 | Tシャツ/カットソー（半袖/袖なし） | 1/2 |
| 5 | Tシャツ/カットソー（七分/長袖） | 1/2 |


細かく見ていくと
親カテゴリーをまずは作成

```rb
mens = Category.create(:name=>"メンズ")
```
作成した親レコードに対して、"*.children*"メソッドで、子供であることを明示し、子カテゴリーを作成

```rb
mens_tops = mens.children.create(:name=>"トップス")
```
同様に、作成した子レコードに対して、"*.children*"メソッドで、子供の子（孫）であることを明示し、孫カテゴリーを作成

```rb
mens_tops.children.create([{:name=>"すべて"}, {:name=>"Tシャツ/カットソー（半袖/袖なし）"},{:name=>"Tシャツ/カットソー（七分/長袖）"}])
```

#まとめ
多階層構造を作るなら、*ancestry*が便利です。
一つのテーブル内で関係性をもたせることができるので、中間テーブルとか、外部キーとかもいらないですしね。
今回は、データの保存に関してのみ書きましたが、取り出しも、メソッドを使うと簡単に行うことができます。
それに関しては、別記事にまとめたいと思います。

#参考
https://github.com/stefankroes/ancestry
https://qiita.com/Sotq_17/items/120256209993fb05ebac
https://qiita.com/NAKANO_Akihito/items/d42a6ceae40933af2352
MNCTF2019 標的攻撃Ⅲ

#問題

http://mnctf.info/mnctf2019/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/91b8fafc-78a7-f629-f4e1-587ecc4cd8ee.png)

#解いてみた

一つ前の問題の答えになっているユーザ名でGoogle検索。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/1649d0db-d99f-9a1e-5b45-f7215d91cb5a.png)

マスクが多くてちょっとわかりづらいですが、これですかね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/3e3510c8-bbeb-5ff8-255d-99c33b116867.png)

正解です。
MNCTF2019 標的攻撃Ⅱ

#問題

http://mnctf.info/mnctf2019/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e7dc4ba3-8f38-ec10-ba45-fcb910fe272e.png)

#解いてみた

さっきの続きの問題です。
a.EXEをダウンロードしてサクラエディタで見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8958493e-1854-c6c5-773a-43a52cd56ef7.png)

userを作るコマンドが中に書かれていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/12bfeb1a-74d6-d70f-9e81-7a93d8b2e176.png)
ストレージの小さいマシンにSDカードを指してVisual Studioをインストールする方法

#ストレージの小さいマシンにVisual Studioをインストールする
GPD Pocketみたいな小さいマシンでユビキタスにプログラミング、みなさんしたいですよね。
しかし、この手のマシンは、ストレージが小さい上に交換も困難です。
64GBという結構かつかつなストレージはいくらやりくりしても厳しいです。

#SDカードを刺そう
でもこういうマシンはSDカードが刺せます。最近だと128GBで最安値3000円を切るくらいです。
これで、容量確保してさあ、インストール。

ところが、Visual StudioはSDカード上にインストール出来ません。
さてと。どうしましょうかね。

#仮想ハードディスクを作る
というわけで、仮想ハードディスクを作りましょう。
「コンピュータの管理」の中に[記憶域]-[ディスクの管理]という項目があります。
これを選ぶと、現在接続されているストレージの一覧が出てきます。
そこで、操作メニューからVHDの作成を選びましょう。
32GBくらい確保すれば大丈夫だと思います。

それをマウントし、インストーラーでインストール先を選べばインストールできるようになります。
MNCTF2019 標的攻撃I

#問題

http://mnctf.info/mnctf2019/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e75b538d-046a-94a6-c459-852fb21eb1db.png)

#解いてみた

問題文に書いてあるファイルをダウンロードするとvmdkファイルがダウンロードできます。
ひとまずFTK Imagerで開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a9603f3f-d2c5-c2d0-9e0e-a1c600801797.png)

a.EXEという怪しい削除済みファイルがあるのでこれを右クリックしてHashを出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c2a7b71c-d308-6a74-6cca-07fefd35fad4.png)

正解でした。
MNCTF2019 悪意部品

#問題

http://mnctf.info/mnctf2019/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/91b2a09b-06e6-5ce4-dc57-827231b5c93d.png)

#解いてみた

毎年行われるマクニカさんのCTFです。

リンク「ファイル」をクリックしてみるとlogo.pngというファイルがダウンロードできますが、画像を表示することができません。

最後に書かれているリンクを確認してみます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/76b7afc4-3dda-42a7-ae43-c77b754859c4.png)

先頭の20hがRC4のキーになってるみたいなので復号してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8ee13c63-a617-1a09-c7a4-43e11206113b.png)

Stirlingを使って先頭の20hをコピーしてから削除しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fc6181e9-8af2-85bb-c5c8-87c3f9bcc8ca.png)

できました。
なろう、クードゥー教信者。　　　　　　[連載-1]　始まりはいつも突然に。

# 序
数年前にApacheのトッププロジェクトになった[Kudu](https://kudu.apache.org/)は、 そこそこの規模までのビッグデータの蓄積役と分析役を容易に兼ねられるというデータストアである。

『[分散型データストアApache Kuduの特徴とユースケース](https://thinkit.co.jp/article/15893)』などを読んでいただくと分かるように、データ分析に使い勝手が良さそう。

だが、何かが地味である。MongodbやCassandraなどのNoSQLが騒がれたのは10年前。今更ＮOSQLなメンバーが増えても皆さんの関心がわかないのか、データ分析という分野がマイナーだからなのか。

![ff](https://d2dcan0armyq93.cloudfront.net/photo/odai/600/0b633278766783f245a494319fdad7aa_600.jpg)
(出典)　https://bokete.jp/boke/56711221

# 基幹システムをKuduで再構築することになった私。
日頃私はデータエンジニアを名乗っているのだが、先月までKuduをスルーしていた。
紹介記事は目にしたのだが、顔と名前が一致しないといった状態。

ところが7月から加わったチームでは、Hadoop(HDFS)とKuduを中心にシステムを組んでいっている模様。
しかも、私が日本側の主担当に指名されるとのこと。
案件としては、構築から５０年近くを経ているメインフレームを移行するシステム開発だ。
経緯は知らないが、移行先の主役に彼女(Kudu)が抜擢されたらしい。
出会いはいつも突然だ。私とKuduとの日々が始まった（システムの移管予定は３年後なので、少なくとも数年間は付き合うことになるだろう）

とはいえ、いかにもな事情で、私に配布されたPCにはもろもろのアプリをインストール申請中なので、当面は、kuduのサイトをちらちら眺め続けるだけ。

ぱっと見地味なKuduだが、なかなか良さそうである。

来週には『Kudu本』が届くので、sparkやpythonからのアクセスのお作法などをこれから学んでいく。
![](https://images-na.ssl-images-amazon.com/images/I/41Dp0SknsLL._SX348_BO1,204,203,200_.jpg)

# インストールしてみよう。
だが、眺めているだけではもちろん、実際のところはわからない。
せめて、週末に自宅PCにインストールしてみようかと。
お試しなので、お気軽にWindows 10のWSL（Ubuntu）に入れてみようと、公式サイトからインストールすることに。

インストールに必要なパッケージ。

```
sudo apt-get -y install autoconf automake curl flex g++ gcc gdb git \
  krb5-admin-server krb5-kdc krb5-user libkrb5-dev libsasl2-dev libsasl2-modules \
  libsasl2-modules-gssapi-mit libssl-dev libtool lsb-release make ntp \
  openjdk-8-jdk openssl patch pkg-config python rsync unzip vim-common
```
...多い(vim-commonとかほんとに必要なのか？)。
なので、[リポジトリを変更](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%A4%89%E6%9B%B4)したものの、それでも時間がかかる。

# まずはKuduの読みを知ってもらうところから。
ということで、待ち時間ができたので、どうしたら皆さんにもっとKuduを知ってもらうにはいいのかを考えることにした。
言ってはなんだが、名前が地味である。少なくとも日本人的には。
Apache Kudoだったら一発で覚えてもらえたのに、と思わないでもない。

そもそも、Kuduとはどう読むのが正しいのか。
Kuduとは、アフリカに生息している哺乳綱ウシ目ウシ科ブッシュバック属に分類される偶蹄類（↓こんなの）らしい。
![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e4/Male_greater_kudu.jpg/220px-Male_greater_kudu.jpg)
角がなかなか勇ましいではないか。

が、日本語の読みは、、、Wikipedia曰く、、、[クーズー](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%BC%E3%82%BA%E3%83%BC)だそうだ。

- アパッチクーズー
- 俺、クーズーを３年間触るんだ。
- 俺、この戦いが終わったら、クーズーと結婚するんだ。
- このクーズー！！

誰だ、Kuduの日本語読みを決めた奴は。。日経とかの取材を受けたらかっこ悪いことになりそう。

待てよ。Wikipedia曰く
> 原語発音により近いクードゥー (kudu) との表記もみられる

とのこと。発音的にはクードゥーなのだ。

けっこうな数のプランド名にも使われているVoodoo（ブードゥー）っぽい。
ということならば、Kudist（Kudu使い）を、ブードゥー教（[参考](https://natgeo.nikkeibp.co.jp/nng/article/news/14/2216/)）にちなんで、クードゥー教信者と読んでもいいのかも。

クードゥー教ならば、名前くらいは覚えてもらえそう。
皆さん、Apache Kuduは、アパッチクードゥーと読んでくださいね。
...グローバルなチームの皆さんもクードゥーと発音してます、たぶん。

# 続く
そうこうするうちに、クードゥー=Kuduのビルドは終わりそうだ。
主にC++11で書かれているらしいKuduは、以下のような感じでmakeする...ので時間がかかる。
まぁ、メモリいっぱい積んでるマシンにdockerで持ってくる、あたりが良いのだろう。

```
git clone https://github.com/apache/kudu
cd kudu
thirdparty/build-if-necessary.sh
mkdir -p build/release
cd build/release
../../thirdparty/installed/common/bin/cmake \
  -DCMAKE_BUILD_TYPE=release \
  ../..
make -j4
```


ところで、移管元となる基幹システム（メインフレーム）の方はCobolでガリガリに作り込まれているらしいのだが、こいつをどうしたものか...俺のクードゥー教徒としての戦いはここから始まる...（続く）。

俺、Cobolerたちとの戦いが終わったら、クードゥーと結婚するんだ...（違）
PythonでWebスクレイピングしてみたときのまとめ

今度はWebスクレイピングに挑戦してみます。
調べたことをメモ。

参考；https://tonari-it.com/python-html-get-text-attr/

# Webスクレイピングの基本形
```python
# requests, bs4はあらかじめインストールしてね
# pip install request
# pip install beautifulsoup4

import requests, bs4
res = requests.get('https://tonari-it.com')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
print(soup.title)
```

## テキスト、属性の取得
```python
import requests, bs4
res = requests.get('https://tonari-it.com')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "html.parser")
elems = soup.select('#list h2 a')
for elem in elems:
    print('{} ({})'.format(elem.getText(), elem.get('href')))
```

## Basic認証のあるページ
以下のようにrequests.getの後ろに追加すればよい
```python
res = requests.get('スクレイピングしたいページのURL',auth=('ID','PASS'))
```

## その他、Webスクレイピングについて
↓の記事が充実している
https://vaaaaaanquish.hatenablog.com/entry/2017/06/25/202924#requests
ウィナー・ホッフ方程式をPythonで解いてみた，その２

#ウィナーフィルタを最急降下法(LMS法[^2])で解く
[^2]: 最小二乗平均法, least-mean-square

[^1]: 詳細は[音のアレイ信号処理](https://www.amazon.co.jp/dp/4339011169)の3.3最急降下法を見て。全部書くの大変。。。

数式はこう[^1]。


```math

\begin{align}
  \xi_k &= d_k - \boldsymbol w^H_{k-1} \boldsymbol u_k \\
  \boldsymbol w_k &= \boldsymbol w_{k-1} + \Delta \boldsymbol w  \\
      &= \boldsymbol w_{k-1} + \mu(\boldsymbol r_{ud} - \boldsymbol R_u \boldsymbol w_{k-1}) \\
      &= \boldsymbol w_{k-1} + \mu\boldsymbol u_k \xi^*_k \\


\end{align}

```

Pythonのコードはこう。$\mu$の値が大きいと発散しやすいみたい。

```python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as sg
from mpl_toolkits.mplot3d import Axes3D


z  = np.arange(0, 512)
h0 = 1 / (1 + np.exp(0.0001 * (z - 128) ** 2))
#h0=1/(1+np.exp(0.03*z))

Wref  = h0 / np.sum(h0) * 2
plt.plot(Wref)
plt.title("$w_{ref}$")
plt.show()

#x  = np.linspace(0, 1, 4096)
x  = np.linspace(0, 2, 8192)
#y1 = np.sin(2 * np.pi * x) + 0.2 * np.sin(np.pi * 20 * (x + 0.1))
y1 = np.sin(2 * np.pi * x) + 0.2*np.sin(np.pi * 20 * x + 0.1 * np.pi)
y2 = sg.lfilter(Wref, [1], y1)

plt.plot(x, y1)
plt.plot(x, y2)
plt.legend(["$y1$", "$y2=y1 * w_{ref}$"])
plt.show()


μ = 0.001
#α = 0.00001

N  = np.arange(0, len(x))
yk = np.zeros(len(N))

K  = 512
wk = np.zeros((len(N), K))
ξk = np.zeros(len(N))

for n in N[1:]:
    uk = np.array([ y1[n - k] if n >= k else 0 for k in range(0, K) ])
    dk = y2[n]
    ξk[n] = dk - wk[n-1].T @ uk
    wk[n] = wk[n-1] + μ * uk * np.conj(ξk[n])
    #wk[n] = wk[n-1] + μ * uk * np.conj(ξk[n]) / (α + (np.linalg.norm(uk) ** 2))
    yk[n] = uk.T @ wk[n]


plt.plot(ξk)
plt.legend(["$ξ_k$"])
plt.show()

plt.plot(y2)
plt.plot(yk)
plt.legend(["$y2$", "$yk$"])
plt.show()


err = diff_lm = np.sum(np.abs(wk - np.ones((wk.shape[0],1)) * Wref), axis=1) / np.sum(np.abs(Wref))
plt.plot(err)
plt.legend(['$\\frac{ \| w_k-w_{ref} \| }{ \| w_{ref} \| }$'])
plt.show()


XX, YY = np.meshgrid(np.arange(wk.shape[1]), np.arange(wk.shape[0]))
plt.figure().add_subplot(111, projection='3d').plot_wireframe(XX, YY, wk)
plt.title("$wk$")
plt.show()
```
[memo]renderとredirect_toの挙動の違いによるエラー

## 概要
- 作成中のオリジナルアプリの開発中に、`render`と`redirect_to`の挙動の違いによるエラーが発生したので、両者の違いについて調べた

- [Railsガイド レイアウトとレンダリング](https://railsguides.jp/layouts_and_rendering.html#redirect-to%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)を参考に

## renderについて
- レスポンス構成時にどのビュー (または他のアセット) を使用するかを指定するためのもの
- 同じコントローラか異なるコントローラかを問わず、任意のテンプレートを表示させることができる
- 同じコントローラのアクションのテンプレートを出力する場合には、アクション名を指定するだけで良い
- 異なるコントローラのアクションのテンプレートを出力する場合には、app/viewsを起点とするフルパスを渡すことで表示できる
 
```ruby:同じコントローラのアクションのテンプレートを出力する
def update
  @hoge = Hoge.find(params[:id])
  if @hoge.update(hoge_params)
    redirect_to(@hoge)
  else
    render "edit" #シンボル(:edit)でも可
  end
end
```

```ruby:別のコントローラからアクションのテンプレートを出力する
render "foos/show"
```
Railsでは、パスにスラッシュが含まれていると異なるコントローラの配下にあると認識されるため、上記のような方法で異なるコントローラのテンプレートを表示させることができるようです。

## redirect_toについて
- 別のURLに対して改めてリクエストを再送信するよう、ブラウザに指令を出すためのもの
- アプリケーションで現在どのページが表示されていても、任意のインデックス表示ページにリダイレクトすることができる

```ruby:redirect_to
redirect_to hoge_url
```

## renderとredirect_toの違い

- `render`は指定されたテンプレートを描画するだけでアクション自体は実行されないが、`redirect_to`は実行されると現在のURLとは異なるURLに新たにリクエストがサーバーに送信され、サーバーが改めてそのリクエストを処理するためアクションまで実行される

上記の挙動の違いにより、インスタンス変数を使う場合などで問題が起こるときがあるようです。(*今回私がハマったのはここでした)

## renderとredirect_toの違いによるエラーの発生
### 前提
1. `hoges_controller.rb`と`foos_controller.rb`がある
2. `hoges_controller.rb#index`で`foos_controller.rb#create`を実行してデータ登録させる
3. `foos_controller.rb#creat`でデータの登録が成功・失敗した場合のどちらも`hoges/index`を表示させたい

*シンプルにするため実際の実装とは異なる部分あるため、変なところあるかもですがご容赦を

```ruby:hoges_controller.rb
def index 
  @foo_all = Foo.all
end
```

```ruby:foos_controller.rb

  def create
    @foo = Foo.new(foo_params)
    if @foo.save
      flash[:success] = "登録に成功しました"
      redirect_to hoges_url
    else
      flash[:danger] = "登録に失敗しました"
      render hoges_path <-ここが問題
    end
  end
```
ここでは`render hoge_path`として`hoges/index.html.erb`テンプレートを描画させようとしていますが、先にも書いたように、`render`ではアクションを実行しません。

そのため`hoges_controller.rb#index`のなか定義しているインスタンス変数`@foo_all = Foo.all`が実行されず、このインスタンス変数を使ってる部分が`NoMethodError`となってしまいました。

### 対処法その１: redirect_toを使う
- `redirect_to`を使えば、ブラウザから改めてサーバー側へリクエストが送信されるので、`hoges_controller.rb#index`に記述したコードも正常に実行される
 
```ruby:foos_controller.rb

  def create
    @foo = Foo.new(foo_params)
    if @foo.save
      flash[:success] = "登録に成功しました"
      redirect_to hoges_url
    else
      flash[:danger] = "登録に失敗しました"
      redirect_to hoges_url <-ここ
    end
  end
```

この方法が一番シンプルかもしれませんが、リクエストの送信が増えることになるため、ある程度の規模感までアプリが大きくなる場合には遅延などの問題の原因になり得ます。

### 対処法その２: renderの前でインスタンス変数を定義しておく
- `render`の前にあらかじめ必要となるインスタンス変数を定義しておくことで、アクションを実行しない`render`を使う場合でも問題なく動作させることができるようになる

```ruby:foos_controller.rb

  def create
    @foo = Foo.new(foo_params)
    if @foo.save
      flash[:success] = "登録に成功しました"
      redirect_to hoges_url
    else
      foo_all = Foo.all <- 追加
      flash[:danger] = "登録に失敗しました"
      render hoges_path
    end
  end
```
この方法を使えば`redirect_to`のようにサーバーへリクエストを送信しないので、1つ目の方法よりも遅延が発生しにくくなります。

ただし、コード量が増えてきた時にはこの部分の記述量も増えたり、複雑化しそうな気もするので、そのあたりはまた考える必要がありそう？

## 参考
- [レイアウトとレンダリング - Rails ガイド](https://railsguides.jp/layouts_and_rendering.html)
Tomcat 9.0.20のcatalina.outのメッセージを英語にする

## はじめに
[Apache Tomcatの脆弱性が公表され](https://jvn.jp/vu/JVNVU99826833/)、2019年5月13日に[アップデートが公開されました](https://tomcat.apache.org/security-9.html#Fixed_in_Apache_Tomcat_9.0.20)。

影響を受けるシステム

 - Apache Tomcat 9.0.0.M1 から 9.0.19 まで
 - Apache Tomcat 8.5.0 から 8.5.40 まで
 
さっそく9.0.20にアップデートしたところ、catalina.outのメッセージにおいていままで英語だった部分が日本語で出力されるようになりました。

```terminal
情報: プロトコルハンドラー ["http-nio-8080"] を開始しました。
```

期待している出力

```terminal
情報: Starting ProtocolHandler ["http-nio-8080"]
```

運用しているシステムでは、Fabricでサービスを起動/再起動する流れのなかで `Starting ProtocolHandler` という文字列を検知して後続の処理を行っています。
そのため、想定していたメッセージが検知されず処理が止まってしまいました。

そこで、従来どおりの検知ができるようログの言語を変更することで解決しました。

## 参考情報
 - [Tomcat 8.5: Timestamp format in logs](http://piyolian.blogspot.com/2017/05/tomcat-85-timestamp-format-in-logs.html)

## 前提条件

Tomcat の setenv.sh のLANGに ja_JP を設定しています。
いままでこの設定でログは英語で出力されていました。参考情報に挙げたサイトにも書かれていますがこの設定を en_US に変更するのは影響範囲が大きそうなので変更しませんでした。

```shell
export LANG="ja_JP.UTF-8"
```

## 変更内容
`export LC_MESSAGES=en_US.UTF-8`を追加し、Tomcatを再起動することでメッセージが英語となりました。

```diff
export LANG=ja_JP.UTF-8
+ export LC_MESSAGES=en_US.UTF-8
```

### 結果
```
情報: Starting ProtocolHandler ["http-nio-8080"]
```
TECH ~Day12~

<h2>学習内容</h2>
・Rubyタグ
・link_toメソッド
・prefix
・unless文
・before_action
・マイページの設定</h2>


<h2>・Rubyタグ</h2>
「<%= %>」で囲まれた部分をRubyタグという。
Rubyタグは拡張子が「erb」のビューファイルで使える。

<%= %>と<% %>の違いは、Rubyタグに囲まれた処理の返り値をビューに出力するかしないかという違い。因みに、出力されるのは<%= %>である。


<h2>・link_toメソッド</h2>
Rubyタグの中で使用可能。
引数を指定することで様々なリンクを生成する。


<h2>・prefix</h2>
ルーティングのパスが入る変数のこと。コントローラやビューなどで呼ぶことで、prefixに入っているパスやURL情報を取得できるようになる。


<h2>・unless文</h2>
条件式が偽（false）の場合の処理を記述するのに使われる。
（例）
　unless 条件式
　　＃条件式が偽の時に実行する処理
　end


<h2>・before_action</h2>
コントローラで「before_action:メソッド名」と記述することで、コントローラのアクションが実行される前にそのメソッドを実行することができる。


<h2>・マイページの設定</h2>
書き方
　get  /コントローラ名/:id
:idの部分には表示するユーザーページのユーザーのidが入る。
コマンドプロンプトでAWS CLIを使うときのJSONの取り扱い

意外と忘れてハマりがちなので。

コマンドプロンプトでAWS CLIを使うときにJSONをそのままコマンドラインに記述すると上手くいきません。

```bash:
$aws dynamodb  put-item --table-name Animals --item '{"id":{"S":"a"},"name":{"S":"dog"}}'
```

Linuxシェルなら上記の記述で大丈夫ですが。

```
>aws dynamodb  put-item --table-name Animals --item '{"id":{"S":"a"},"name":{"S":"dog"}}'

Error parsing parameter '--item': Expected: '=', received: ''' for input:
'{id:{S:a},name:{S:dog}}'
```

コマンドプロンプトだと引用符の扱いが異なるため、エラーになってしまいます。

```
>aws dynamodb  put-item --table-name Animals --item "{\"id\":{\"S\":\"a\"},\"name\":{\"S\":\"dog\"}}"
```

このように一番外側を二重引用符で囲って中のものはエスケープしてやると上手くいきます。

```
>type put.json
{"id":{"S":"a"},"name":{"S":"dog"}}
>aws dynamodb  put-item --table-name Animals --item file://put.json
```

外部ファイルに書いてやれば気にしなくてよいのでこちらの方がスマートですね。
post-checkout + direnvでブランチ切り変え時に新しくDBを作成して、向き先を変更する


こんにちは、ミツバです。
今回はタイトル通り、ブランチ切り変え時に新しくDBを作成して向き先を変更ようにします。

## 前提

- Rails4
- mysql

## .git/hooks/post-checkoutを作成

こちらを利用したいプロジェクトに配置します。 

```bash
#!/bin/bash

# エラーになった時点で終了
set -e

readonly PREV_HEAD=$1
readonly CURRENT_HEAD=$2
readonly CHECKOUT_TYPE=$3

# ファイルのチェックアウトの場合はここで終了
if [ ${CHECKOUT_TYPE} -eq 0 ]; then
  exit 0
fi

# 同じコミットを指しているとブランチ名はどちらも同じになる
# ブランチ名に含まれるスラッシュはハイフンに置き換え
readonly PREV_BRANCH_NAME=$(git name-rev --name-only ${PREV_HEAD} | sed "s#/#_#g")
readonly CURRENT_BRANCH_NAME=$(git name-rev --name-only ${CURRENT_HEAD} | sed "s#/#_#g")

echo "prev branch: $PREV_BRANCH_NAME"
echo "current branch: $CURRENT_BRANCH_NAME"

dump() {
  # create dir
  if [ ! -d $HOME/dump ]; then
    mkdir $HOME/dump
  fi

  # create dump file
  if [ ! -f $HOME/dump/$1.sql ]; then
    mysqldump -h 0.0.0.0 --skip-lock-tables --single-transactio --user=<user_name> --password=<password> -B $1 -r $HOME/dump/$1.sql
  fi
}

setup() {
  readonly NEW_DB_NAME=$(echo "$1_${CURRENT_BRANCH_NAME}" | sed "s#-#_#g")

  echo "exists check: $(mysql -h 0.0.0.0 --user=<user_name> --password=<password> -e 'show databases;' | grep $NEW_DB_NAME)"

  # dbの存在check
  if [ -z $(mysql -h 0.0.0.0 --user=<user_name> --password=<password> -e 'show databases;' | grep $NEW_DB_NAME) ] ;then
    mysql -h 0.0.0.0 --user=<user_name> --password=<password> < <(sed "s/$2/${NEW_DB_NAME}/g" $HOME/dump/$2.sql)

    # direnvでは変更されなかったので、直に変更する
    DB_NAME=$NEW_DB_NAME
    echo "target database: $DB_NAME"

    bundle ex rake db:seed
  fi
}

dump ${DEVELOPMENT_DB_NAME}
setup "prefix" ${DEVELOPMENT_DB_NAME}

direnv reload

exit 0
```


## direnv editで環境変数を設定

以下のように設定しておきます。

```bash
BRANCH_NAME=$(git branch | grep \* | cut -d ' ' -f2 | sed 's/-/_/g')
export DB_NAME=$(if [ $BRANCH_NAME = "develop" ]; then echo 'development_db' ;else echo $BRANCH_NAME ;fi)

export DEVELOPMENT_DB_NAME=development_db
```


あとは `chmod +x <file_name>`で実行できるようにして、 checkoutするだけ。

## 所感

使用感としては良さげなのですが、git checkout -bとかでブランチ移動した時に挙動が変になったりしてしまいます。
そこらへんを上手いこと解決できたら最高っぽいなぁと感じます。
後、よくわかっていないのですが、database nameに `-` は入れてはいけないっぽかったので全部 `_` に直すようにしました。

他にも良さそうなのがあったら教えてください🙏

## 懸念点

### database増えすぎる問題

ありすぎるので定期的にdatabase全消し祭を行なってください。

## 参考

[post-checkoutフックを使ってブランチ切り替え時にちょっとだけ自動でDB環境をセットアップできるようにした - Septeni Engineer's Blog](http://labs.septeni.co.jp/entry/2016/04/10/004330)
Pythonの環境構築@mac

https://github.com/pyenv/pyenv-virtualenv

```
$ brew install pyenv-virtualenv
```

以下をprofileへ追加する（.zshenvなど）

```
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
if which pyenv-virtualenv-init > /dev/null; then
  eval "$(pyenv virtualenv-init -)";
fi
```

# 使い方の例

バージョン3.7.3のpythonのvirtualenvを$(pyenv root)/versionsに作成する：

```
$ pyenv virtualenv 3.7.3 my-virtual-env-3.7.3
```

virtualenvの一覧を表示する

```
$ pyenv virtualenvs
```