OmniAICreator/Qiita-1.07M huggingface dataset:
安いT480を買って実用マシンに仕上げた話

仕事＋自宅用ラップトップとして、再生品の安いLenovoのT480を買って使えるところまで持っていった話です。

### 本体をebayで購入
CPU以外は後で交換するつもりで、一番早くて安い再生品を選択。
![t480.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/8af59867-7afb-4954-0932-ce1fcaff5e5b.png)

### ヨドバシではなくてビックカメラでSATA 1TのSSDを購入
軽く裏蓋を開けると2.5インチのSSDを入れる場所があったので、これを買い取り付けようとしたところ。。
![sata1g.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/b5245383-41ab-5555-ea5f-fd3644049dd2.png)

マザーボードから出てきていたものはSATAではなくて、M2のアダプタだった。。

### SATA 1T SSDを返品、M2の1Tを購入
アキバに走り返品したその足でM2 2280の1Tを買う。ちなみにM2のスロットはもう一つあるが、こちらには2280は入らない。
![1t.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/15c0ee83-f22b-1032-b2aa-6bc837ee4e27.png)

### アマゾンで16GBのメモリを購入
マザーボードには8GB一枚が刺さっていて、1スロット空いていたので適当な16GBメモリを買う。
![memory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/d8f70f98-9d56-6724-4187-7c5902d64891.png)

### FDパネルに不満
この状態でしばらく使っていたが、どうもFDのパネルがはっきりしない感じで気に入らないので、WQHD化を決意。

### 互換性のあるWQHDパネルを探す
そもそもどのパネルが使えるのか調べたところ、ここで`LP140QH2-SP B1`と`AUO B140QAN02.3`というやつが使えることを知る。
https://www.reddit.com/r/thinkpad/comments/9ibptq/upgraded_my_t480_from_fhd_touch_to_wqhd/
このポストをした人はLPのパネルを買ったらしい。ただ、パネル自体はつながるものの問題はあって

- WQHDのパネルにはケースに固定するためのネジ穴がない
- WQHDの画面の方が若干横幅が狭い

なのでパネルを両面テープで画面を止めている。それで実際問題はないらしい。

### WQHDパネルと40pinディスプレイケーブルをアリババ購入
ここで上の２つのパネルを比較していた。
https://www.reddit.com/r/thinkpad/comments/9q78gm/which_current_gen_nonhdr_wqhd_panel_is_better/
正直どちらがいいのかよくわからないのと、AUOの方はもしかするとネジ穴があるんじゃないかと淡い期待もあったので`AUO B140QAN02.3`を買う。
![wqhd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/f3ea3666-e596-e847-4fe9-841c36de5bad.png)
アリババで買うと安い。同じものを$200近くで売っているところもあった。。

ディスプレイケーブルも40pinのものが必要らしいので、こちらもアリババで購入。
https://www.reddit.com/r/thinkpad/comments/ckin1x/thinkpad_t480_fhd_to_wqhd_upgrade_question/

![cable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499443/df0e5fa7-0d80-2fc9-2de5-d606d38044e8.png)


### WQHD化の作業を開始するも部品不足で中断
実際にやった手順を書いている人がいたので、参考にしつつ
https://www.chipdept.com/upgrade-t480-wqhd-screen/

Lenovoのメンテマニュアルをみながら作業を開始
https://download.lenovo.com/mobilesjp/sp40k05014_j.pdf

結構大変で、特にパネル周りのベゼル部分はのり付けされていて、剥がすのはいいけどつけるのが大変。。
完全に分解した後、パネルをケースに載せてみると確かに幅は少し狭いけど大丈夫そう。ではディスプレイケーブルも変えるかとケーブルを探してみるも見つからない。
届いていないのかもと思いアリババでみてみると。出荷されていなかった。。お店は`SHENZHEN JINTAI CO., Store`。気をつけてください。

この状態でもとに戻す気にはならないので、見えないところにそっと全てを置き、別のお店で再注文。

### 作業再開そして完成！
届いたディスプレイケーブル使ってWQHDパネルをつないだところ見事に画面が表示された！
ダイソーで買った「超強力アクリルフォーム両面テープ」でパネルをケースに貼り付けて、ベゼルもなんとか貼り直す。そして全てを組み立てなおして完成！

### 感想
めっちゃ画面きれいです。購入時に付いていたFDとは比較になりません。結構大変ですがやる価値はあると思います。興味のある人にはおすすめします。

### 蛇足
`NV140QUM-N61`というパネルで4Kにすると選択肢もあるようです。
https://www.reddit.com/r/thinkpad/comments/bp265p/t480s_4k_mod/

### バッテリーの購入について
- 内部バッテリー、外部バッテリーともに適正価格でレノボで買えるので、レノボで買いましょう。
- 特に内部バッテリーは、レノボの外で売られている純正品という形で売られているものを、深センと国内から買いましたが、どちらもまともに動きませんでした。
- レノボの商品ページにT480のバッテリーはないのですが、サポートのチャットがあって、そこでT480のバッテリーを買いたいというと売ってくれます。内部バッテリーが9000円、３セルの外部バッテリーが1万2千円でした。プラス手数料が若干かかります。(2021/1現在)。
収束しない不具合に対する防衛術

#そんなものはない
と言いたいのですが、少しだけ思うところを書いていきます。
期待してた人がもしいたらごめんなさい。

ちなみに私の立場としてはテストリード～サブリードぐらいの立ち位置です。

##不具合捌き
収束しないのにすべての不具合に対処してたら開発が死にます。
そうするともちろんテスト側も運営側も進捗が上がらないので死にます。
優先度や対応有無等をしっかり運営側で判断して対処可能な範囲を目指しましょう。

##不具合を見逃さない
「これぐらいの不具合いっか」とテスト側は思うことがあります。
でも、それが影響度小さいかどうかはテスト側だと判断できないこともありますので、
絶対に見つけたら報告するようにしましょう。
（責められるのはテストした側です）

##テストの順番
画面遷移しない、画面表示しない、といった不具合が出ているのに機能の細かいところをテストしても意味がありません。
とはいえそういう判断を各テスターで行うのは無謀なので、運営側とテストリードでしっかり順序を決めていきましょう。
場合によっては追加で粒度の粗いケースを準備する、テストの時期をずらすといったことも必要です。

##早期のアラート
どの立場でも、やばいと思ったらアラートをあげましょう。
リスクがあるぐらいでアラートをあげても、それを確かめたり、打開する術をもっている人はいるかもしれません。
私の知っている炎上案件は初期対応が悪かったことがほとんどです。

##最後に
色んな立場からの意見が聞きたいので、よければコメントお願いします！
Webシステム開発における、今だからこその「ドキュメント」の大切さ

# ドキュメントが嫌いなエンジニア、ベンチャー企業

　時々、「わかり易いコードを書けばドキュメントが不要」とかいう話を聞いたりもします。
詳細設計などについては確かに、変更も多いし、コードさえ読みやすければ、不要なドキュメントもあるかもしれません。

　情報の共有をコードにしろ、ドキュメントにしろ明確に、チームとしてここをみればいいというのがあればいいと思いますが、ただ怠惰の結果としてドキュメントがなく、後付的な「コード至上主義」は情報の共有を果たしているのか甚だ疑問です。

# 今の開発は細かく技術が分断している

　15年ぐらいまえは、サーバサイドの言語だけでいろいろ済ませることもできたかもしれません。
　翻って、2019年あたりのWeb開発はどうでしょうか？最近は、サーバサイド、フロント、インフラ、SaaSなど外部との連携など、フルスクラッチで少ない資源でシステムを作る時代ではないです。
　とにかく、いろいろな要素や職種の人が協力して一つのシステムを作り上げます。

- [参考：一人でフリーランスとしてWebプログラマーをする限界](https://qiita.com/SFITB/items/7931e33a1b28dbb307ac)
- [参考:2000年～2019年にかけてWebのフロント開発は進歩しているのか？](https://qiita.com/SFITB/items/4310fd64011bf4793cc4)
- [参考:5G、IoT、SaaS、AIに備えて高速・並行処理に有利なWeb開発用プログラミン言語の習得を](https://qiita.com/SFITB/items/e1290eb4d0bd00843384)

　
# 技術や職種が分断しているときの「共通情報」としてのドキュメント

　コードをみればいいやというのは、リソースが少なければそれでいいかもしれません。
　ですが、現在のようにプログラム言語に関しても、いろいろ分断していたり、外部のAPIなどを使うようになると、ソースコードだけみていたらシステムの情報が分かるわけではありません。
　
　いろいろな要素や職種が連携すればこそ、母語や社内の共通の言語でかかれたドキュメントが必要になるのだと思います。

# 基本設計、外部設計などユーザー視点や共通情報は最低限ドキュメントにして共有する

　プログラムの中身についての詳細設計は変更しやすくドキュメントとして残すのがいいのかは疑問があります。
　ですが、基本設計、外部設計などユーザーさんの視点での機能仕様・画面仕様やシステム構成など全般に関係する情報はドキュメントとして決まったフォーマットで作成して、ユーザーさんやチームなどで共有すべきです。

　小さい会社とかフリーランスの人はこのあたりの整備ができておらず、「炎上」することもあるように見られます。

# 今いちどドキュメントの大切さを見直す

　本当は、時代を問わず、仕様書・設計書などのドキュメントは必要なのだけれど、今のWeb開発は今まで以上にその大切さがあると思っています。

　また、時代に即した設計書の内容も必要になってくると思います（APIとかSaaSの運用設計とか）。
テスト専門を一旦離れるので考えたことをまとめてみた

#はじめに
私「品質やテストに関する活動どう続けるか悩んでます！」
上司「advent calanderとか書いてみたら？」
私「(advent calenderって何や？)あ、枠ちょっとだけ空いてる」
というわけでだいたい５秒ぐらいで書くことが決まった記事です。

テストの技術というよりは私自身のテストのとらえ方や大事だと思ったマインド的なところを徒然と書きます。

Qiita初投稿なのでコメントいただけると嬉しいです！

#目次
1. これまでの経験と自己紹介
2. テスト設計について
3. テスト実施について
4. テスト管理について
5. テスト全般について
6. おわりに

##これまでの経験と自己紹介
初投稿なので自己紹介から入らせてください。

すみすと申します。

大学院修了後、第三者検証の某社に３年半勤務の後、決済系のシステム開発の会社に最近転職しました。
３年半はもちろんQAとして、そして今はPMOとして働いています。

好奇心旺盛なほうなので、前職では主にウェブ系の請負業務（数週間でテスト設計→実施とか）を主に行っていました。

入社半年したぐらいからテスト管理やテスト自動化に関りはじめ、
最後は自身もPLをしながらPL/設計者の育成や社内展開のための自動化マニュアルの作成等にも関わっていました。

JSTQBのFoundationLevelを取得しており、社内勉強会の講師も１年間務めました。
↑ALTAに更新予定

###得意だと思っていること
・アドホックテストで意地悪な不具合を出すこと
・仕様に乗っていない箇所をテストケースに落とし込むこと
・不具合の起票

###苦手だと思っていること
・長いプロジェクト
・テストケース通りにテストを実施すること
・人に任せること

##テスト設計について

###スタンダードとオリジナル
テスト設計はスタンダードとオリジナルだと思っています。
で、個人的には観点レベルでのオリジナルと詳細レベルでのスタンダードが重要かな、と考えています。
これはどう評価されるかという話になりますが、詳細レベルでは普通のものを作れるかどうかが評価される（逆にいうと絶対必要なものを漏らしてはいけない）、
観点レベルではもう少し上を目指せて、普通のものを作った上で「なるほど」と思わせるものを提示するぐらいの余裕があるものと思います。
私のレベルでの話かもしれませんが。
最初から詳細レベルでオリジナルを目指すのはあまり良くないかなあ、と。


###仕様書を読まない
もちろん、最初は、の話です。
どうしても仕様書があると読んでしまって、その通りにテストケースを作りたくなるんですが、
大事なことは仕様書にはだいたい書いていません。
なので、最初は仕様書を読まずに妄想（こういうテスト必要だよな、こういう機能あるよなというのを考える）が必要だと思います。
大枠でとらえた後に詳細を書き出すのがあくまでテスト設計の作業だと思います。


###設計する意味
私もですが、たぶん誰もがどこかで「設計しなくても仕様書とか見ながら実施したらよいんじゃない？」という思想に行き着くと思います。
私が感じる「設計する意味」は２点で、
１点目は何をテストしたかの証跡としての意味。
そして２点目のほうが大事だと思うのですが、実施が始まる前の時間の有効活用です。
実施できる状態からテスト設計するならそれは確かに優秀な人がアドホック込みで実施からしたほうがいい可能性もあると思いますが、
それまでの時間で設計しておくほうがはるかに良いでしょう。と思います。

##テスト実施について

###not テスター but ユーザー
テスターとして思想が固まってきちゃうと、特にユーザビリティの面が見えなくなってしまいます。
なので、実施の際は（もちろんテストケースを消化するという意味ではテスターとしてふるまわないといけないのですが）
いまのテスト対象が本当に良いかはユーザー目線で見ることを習慣としないといけないと思います。


###気になったら止まる
テスト実施＝テストケース消化、ではありません。
（テスト設計の質云々は置いておいて）テストケースから外れたところに不具合はよく潜んでいます。
例えば「これ不具合ではないけどちょっと嫌だな」と思ったらちょっとその周辺で影響ありそうなところをたたいてみるとか、
自分の感覚を信じて立ち止まることもときには大切になります。


###自分の担当範囲に収まらない
大きなプロジェクトだと、自分の担当機能が決まっていたりすると思います。
担当機能といった時点でわかると思うのですが、それでシステム全体にかかわる不具合は見つけられません。
でもそっちのほうが重要で、だいたいSTやUATの終盤になってとやかく言われることになります。
そのため、まずはテスト対象の全体を理解して、アンテナを常に張るようにしましょう。

##テスト管理について

###数字と感覚
テスト管理は基本的には数値で測るものです。
ただ、数値を正確にとるのは難しいため、感覚も必要です。
例えば、「少し触った結果この機能は不具合が多いと思うから先に実施しているので」進捗が遅れている」といった
数値と感覚を織り交ぜた報告は必ず必要になってきます。
数値だけを追っていたらみえない数値にやられます。

###進捗より不具合
テストの目的は消化することではなく不具合を出して品質を担保することです。
進捗が良いからと安心するのではなく、進捗が良いのであれば幸運にも時間があるはずなので、
他に不具合の潜んでいる場所はないか、品質をあげるために他にできることはないか、
といったことを考えるのに時間を充てましょう。
バグゼロの落とし穴は自分から回避しにいくものです。

###過ぎたるは及ばざるが如し
テストやりすぎ、進捗良すぎ、そんなプロジェクトには必ず落とし穴が待っています。
それは殺虫剤のパラドックス的な話だったり、テストは条件次第的な話だったりします。
何かが良すぎるときは何かリスクが潜んでないか考えましょう。

##テスト全般について

###テスト≠品質
テストは品質を向上させる手段の１つでしかなく、テストをすれば品質が良くなるわけではありません。
品質をあげるためのアプローチは様々なので、QA担当として生きるのであればそこも考えないといけません。
テストをしていると品質に貢献しているという実感は出てくると思いますが、そこに満足しないほうが良いと個人的には思います
※とはいえ、テストをしっかりやることは大切なので、そこを極めるキャリアもありだと思います。

###最後の砦として
特に品質の悪いプロジェクトで、テストは最後の障害とみなされることが多くあります。
ただ、実際には最後の砦で、ここで止めないとどうやってもリリースは止まらない場所でもあります。
本当にリリースしてもよいのか、その条件は何なのか、そういうことが言えるのがテストです。


###体のケア
テストをしていると体に来ることが多いです。
私は目と腰～背中が特にきつかったのですが、整体には通うようにしました。
職業柄体が固まりやすくなると思いますので、体のケアは欠かさないようにしましょう。

##おわりに
精神論的な話が多くなってしまいましたが、いずれは技術の話もかけたらいいなと。

コメントいただけると嬉しいです。
[RSpec] FactoryBot 省略の仕方


FactoryBotでユーザーを生成する際、
`FactoryBot.create(:user)`や`FactoryBot.build(:user)`のように書くと思いますが
この「FactoryBot」部分を省略する方法があるので、メモです。


specフォルダの中にある`rails_helper.rb`に追記します。

```ruby
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods ##こちらを追記
end
```

これで、`create(:user)`や`build(:user)`と書くだけでユーザーの生成ができるようになります！

以上です！
RailsでChartkickを使ったグラフの実装(簡単だけど、かゆい所に手が届かない)

Railsで折れ線グラフを実装したいと思い、Chartkickを使用しました。
他の方の記事も参考にさせていただきましたが、うまくできないところもあったので参考までに載せておきます。
[Chartkick 公式](https://chartkick.com/#chart-js)

## 環境
Rails 5.2.3

## 構築手順

### 1. gemのインストール
```ruby:Gemfile
gem "chartkick"
```

ターミナル

```
$ bundle install
```

### 2. JavaScriptのライブラリを読み込む
app/assets/javascripts/application.js　に下記を追記する

```application.js
//= require chartkick
//= require Chart.bundle
```

この時点でアプリケーションが立ち上がっている状態だと`Sprockets::FileNotFound` のエラーが出るかもなので(私は出ました)、一度サーバーを落として、`rails s`をやり直した方が良いかもしれません。

### 3. グラフ用のデータを用意
#### 簡単だと思っていましたがここが曲者でした。
- できれば判断の基準となる基準線を設けたグラフを作りたかったが、公式ドキュメントにそんなの無くね？と悩んだ
- teratailで質問して、いただいたアドバイスが「公式ドキュメントのMultiple seriesを使って無理やり作っちゃえば？」
- その手があったか・・・

#### コントローラー
```ruby:records_controller
def index
    @graph = Record.where(user_id: current_user.id).limit(3).order(donation_day: "ASC")

    # グラフの基準線作成用の配列
    @donation_days = []
    @graph.each do |rec|
      @donation_days << rec.donation_day
    end
  end
```
`@graph`がグラフ用の配列、`@donation_days`が`@graph`からdonation_dayカラムの値のみを抽出した基準線用の配列になります。
あとはビュー側でグラフ表示のために加工します。


### 4. ビューに表示
```haml:index.html.haml
= line_chart [ { name: "記録", data: @graph.map { |record| record.slice(:donation_day, :ALT).values }}, { name: "基準値下", data: @donation_days.map{|day| [day, 8]} }, { name: "基準値上", data: @donation_days.map{|day| [day, 49]} } ], min: 0, max: 60
```
- `line_chart[]`
  - 線グラフ(今回は複数の線グラフを表示する書き方)
  - 円グラフ等他のグラフは[Chartkick 公式](https://chartkick.com/#chart-js)参照
- `{ name: "記録", data: @graph.map { |record| record.slice(:donation_day, :ALT).values }}`
  - レコードのグラフ用
  - `name`が凡例の名前、`data`が実際にグラフとして表示するデータ
  - `@graph`を元に、横軸を日付、縦軸をALTカラムの値とした配列を作成
- `{ name: "基準値下", data: @donation_days.map{|day| [day, 8]} }`
  - `@donation_days`を元に、横軸を日付、縦軸を基準値の8とした配列を作成
- `{ name: "基準値上", data: @donation_days.map{|day| [day, 49]} }`
  - `@donation_days`を元に、横軸を日付、縦軸を基準値の49とした配列を作成
- `min: 0, max: 60, legend: false`
  - オプション(最大値、最小値の設定や凡例の表示・非表示など)

**@graph.map { |record| record.slice(:donation_day, :ALT).values }の中身**
![](https://gyazo.com/fde94d9f1ccb71fcc7d76845067fe4cd.png)

## 実行結果
![](https://gyazo.com/f1beac355ef8fbf9b82f0dae987458aa.png)
ただし、欠点として、この基準線は、レコード数が２件以上無いとただの点(点と点を結んで線にできないため)になってしまいます。

## 全てのグラフに共通のオプションを設定したいとき
config/intializers　下に chartkick.rbを作成

```ruby:chartkick.rb
Chartkick.options = {
  height: "200px",
  legend: false,
  curve: false,
  colors: ["#4242ff", "#ffd1a3", "#ffd1a3"]
}
```
今回の共通設定は

- `height: "200px"` : 高さを200px
- `legend: false` : 凡例を非表示
- `curve: false` : 線のつなぎ方を曲線ではなく直線に変更
- `colors: ["#4242ff", "#ffd1a3", "#ffd1a3"]` : １つ目、２つ目、３つ目のグラフの色をそれぞれ設定

変更後にサーバーを立ち上げたままで更新をしても反映されないので、`rails s`し直してください。
Flutterアプリのアーキテクチャについて1

# はじめに
Flutter界隈盛り上がってますね。公式ドキュメントも充実して、Chromeの翻訳機能を使えば、感覚を掴んでどんどん開発できていくと思います。アーキテクチャについて詳解はあってもカジュアルな記事が少ないなあと思ったので、**私見**ではありますが、まとめたいと思います

# 結論: Providerを使おう
2019年のGoogle I/Oで発表された、Provider(https://pub.dev/packages/provider) を使って開発するのがお手軽で良いと思います。Providerは**InheritedWidget**をラップして、データのBuildContextへの埋め込み、BuildContextからのデータの取り出しをカンタンに行えるようにするライブラリーです


# Flutter開発あるある
iOS開発では、StoryBoardで画面を作成し、UIViewControllerとStoryBoardをIBOutletで紐付けることで、UIViewController上のSwiftコードから、データの表示などUIを操作することができました。

Flutterでは、Widgetと呼ばれるUI部品で組合せて画面を作成します。このWidgetは階層構造になるため、階層の深いWidgetに対してデータをどのように受け渡していくかが問題になります。

Providerを使わない場合、コンストラクターでひたすら引き回すようなコードを良く見かけます

# Providerを使うと
`Provider.value`を使ってBuildContextに埋め込んだデータを、下位のWidgetで`Provider.of<String>(context)`を使って、簡単に取り出すことができます。


<img width="765" alt="スクリーンショット 2019-12-08 10.46.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32586/ec910c74-32b9-10de-f14e-f96fc273a3de.png">

データの注入の方法にはProviderの種類に応じて複数種類ありますので解説していきます。

## ChangeNotifierProvider
例えばフォームのように画面からの入力を受け付け、リアルタイムに変更を保持したい場合は、`ChangeNotifierProvider`を使うとお手軽です。下記のような`ViewModel`クラスを作成します。


### モデルクラス

```dart
class HogeHogeViewModel  with ChageNotifier {
  String name;

  setName(String name) {
     this.name = name
     notifyListeners();
  }
  
}
```

ポイントは、`ChageNotifier`をmixinすること、セッターで`notifyListeners()`を呼び出すことです。

### 注入するコード
```dart

ChangeNotifierProvider<HogeHogeViewModel>(
  create: (_) => HogeHogeViewModel(),
  child: HogeWidget()
)
```
`HogeWidget`はデータを注入する対象のWidgetです。

### 利用する側
```dart
Provider.of<HogeHogeViewModel>(context)
```
注入したWidgetより下位のWidgetではBuildContextから簡単に`HogeHogeViewModel `を取り出すことができます。

また、このViewModelを画面単位に用意し、画面を返すWidgetに下記のメソッドを用意、呼び出し元で呼び出すことで、自動的にモデルクラスが画面全体に注入され、画面に関する全てのデータ・ロジックをモデルクラスに集約できます。

### 画面のWidget
```dart
class HogeScreen extends StatelessWidget {
  static Widget withDependencies() => ChangeNotifierProvider<HogeHogeViewModel>(
    create: (_) => HogeHogeViewModel(),
    child: HogeScreen()
  );
}
```

### InheritedWidgetとの関係
Flutterには、`InheritedWidget`という、上位のWidgetに対して、ツリーをたどるのではなくハッシュマップを使って、計算量O1でアクセスでき、`InheritedWidget`の下位のWidgetのみbuildを行う仕組みがあります。Providerは`InheritedWidget`を便利に使えるようにされたラッパーでです。

### まとめ
Flutterは、まだまだ発展途中ですが2019年12月の時点では、`Provider`と`ViewModel`を使うとサクッとコードを実装できて良さそうです。次は、FirestoreとStreamについてまとめてみます。

### 追記
アーキテクチャ2を書きました
https://qiita.com/sarukun99/items/4057ae3c0801a3bfcfd7
備忘録　position absoluteが効かない時に確認すること

配置が思った通りにならない時に、混乱してしまうので
備忘録として残しておきます。

書くにあたり、参考にさせていただいたサイト。
[【CSS】positionプロパティを使いこなす！relative・abosolute・fixedの使い方
](https://creive.me/archives/13521/)



> absolute使いこなせるまで、1つずつチェック確認する必要あるの忘れないためにも、上記サイトから文章引用します
>> ポイントをまとめると、「absolute」の使用は必ず挙動を確認し、それを経験としてまとめておかないと理解できない挙動が発生する可能性があるということです。「margin」や「padding」の設定、ブロック要素とインライン要素での挙動の違いには特に注意しておいてください。


以下、実際にやった手順を記載。
これどおりにやり、修正必要なら逐次修正。

1 最も近いrelativeのセレクタがどこにあるか検索する

2 その基準から動かしたいという理解であっているか確認。
   
　　あっていなかったら、relativeのセレクタを変更する、それでもうまく行かない場合は、3に

3  widthとheightの範囲が、イメージしたとおりかデベロッパーツールで確認。
　　
　　違っていたら直す。

4   paddingやmarginが効いていないかを確認する

5　　うまくいかなったから、再度、上記のサイトをみて確認する。
Golang strconvについて調べてみる

[Link-1]:http://golang.jp/pkg/strconv
[Link-2]:https://golang.org/pkg/strconv/
[Code-1]:https://www.codewars.com/
[play-1]:https://play.golang.org/p/sQRJlh62vbz

#きっかけ
[codewars][Code-1]で出題される問題に`文字列->数値`の変換を求められる問題があるので調べてみると、`strconv`が見つかるが途中で文字列が入った場合などのエラー集が見つからなかったので自分で調べてみた。

##`文字列<->数値`するライブラリ`strconv`
調べると、日本語で翻訳された以下のサイトが出てくる
[golang.jp][Link-1]
こちらはサイトにも書いてある通り、古い翻訳になっている為`strconv`から削除されているものも載っている
例えば、`文字列->float`を行う`Atof`関数などは[現在の公式のドキュメント][Link-2]では記載されていない為、コンパイルしても通らないので、注意が必要です。

##試した事
文字列内に数字以外の文字が入った場合の返り値はどうなっているか
[プレイグラウンドはこちらから][play-1]
<details><summary>試したコードはこちら</summary><div>

```Golang

package main

import (
	"fmt"
	"strconv"
)

func main() {
	//先頭文字列はエラーと0
	var a = "as123445"
	b, b_err := strconv.Atoi(a)
	fmt.Println(a, b, b_err)

	//文字列の途中挿入はエラーと0
	a = "1234as45"
	b, b_err = strconv.Atoi(a)
	fmt.Println(a, b, b_err)

	//最後が文字列はエラーと0
	a = "123445as"
	b, b_err = strconv.Atoi(a)
	fmt.Println(a, b, b_err)

	//int型なので小数点はエラーと0
	a = "1.2345"
	b, b_err = strconv.Atoi(a)
	fmt.Println(a, b, b_err)

	//空白もエラーと0
	a = "- 123"
	b, b_err = strconv.Atoi(a)
	fmt.Println(a, b, b_err)	

	//空白もエラーと0
	a = " -123"
	b, b_err = strconv.Atoi(a)
	fmt.Println(a, b, b_err)

	//正しい
	a = "-123"
	b, b_err = strconv.Atoi(a)
	fmt.Println(a, b, b_err)

	//正しい
	a = "123"
	b, b_err = strconv.Atoi(a)
	fmt.Println(a, b, b_err)

	//rune型はできない
	//c := '1'
	//b, b_err = strconv.Atoi(c)
	//fmt.Println(a, b, b_err)

	//無くなってる
	//float_value := "1.2345"
	//float_value,_ := strconv.Atof(floatstring)
}

```
</div></details>

##結論
文字列や空白があると問答無用出エラーにする
言語によっては文字列までの数字を返すなどがあるがここまで潔いと処理は考えやすいかと感じた。

##残念なこと
残念ながら[現在の公式のドキュメント][Link-2]を見る限り、`float`にはもう対応していない様子である
文字列中で小数点を見つけて分割するという必要があるかもしれない・・・

#最後に
[golang.jp][Link-1]は日本語訳で基本的には変わらずに使えるのでかなり助かります
しかし、うまくいかなかった場合はちゃんと公式のドキュメントを読みましょう
Node-REDからAWS SDKを使ってみる

この記事は[Node-RED Advent Calendar 2019](https://qiita.com/advent-calendar/2019/node-red) 9日目の記事です。

本記事では[node-red-contrib-aws-sdk](https://flows.nodered.org/node/node-red-contrib-aws-sdk)ノードを利用して、Node-REDからAWS SDKを利用する方法を説明します。

## 事前準備
Node-REDからAWS SDKを利用するには、ACCESS_KEY_ID, SECRET_ACCESS_KEYが必要になります。

事前準備として、[AWSアクセスキー作成](https://qiita.com/miwato/items/291c7a8c557908de5833)などの記事を参考に,ACCESS_KEY_ID, SECRET_ACCESS_KEYの作成をお願いします。

## S3バケットを作成してみる。

### node-red-contrib-aws-sdkのインストール
まずはnode-red-contrib-aws-sdkをインストールします。

```
npm install node-red-contrib-aws-sdk
```

### ACCESS_KEY_ID, SECRET_ACCESS_KEYの設定
aws sdkノードに事前準備で取得したACCESS_KEY_ID, SECRET_ACCESS_KEYを設定します。

![Node-RED (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332012/c163e7f7-86c2-98c8-a9b1-ec2e0a708c1a.png)

![Node-RED (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332012/9cb39d34-73d6-4611-b7fa-c1937b2c2ff3.png)
※Use Base IAM Role Settingのチェックは外しておいてください。

### S3バケットの作成



```javascript:function
const s3 = new AWS.S3();

const params = {
    Bucket: "noderedbucket"
}

s3.createBucket(params, (err,data) => {
    if(err) {
        msg.payload = err;
    }else {
        msg.payload = data;
    }
    node.send(msg);
})

```


![Node-RED (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332012/2d021512-15bb-c8eb-2004-2ae45c3f47bc.png)

無事バケットが作成できたようです。

![S3 Management Console (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332012/7ee2e44d-c6cb-7eca-49ab-208b4f560a60.png)

## まとめ
他にもAWS SDKを操作するノードはあったのですが、個人的にはnode-red-contrib-aws-sdkが一番扱いやすかったです。Node-REDからAWS SDKを操作する際にはぜひお使いください。
Rails 開発/実行用の Docke-compose と Dockefile （2019 Dec 最新）

# はじめに
rails 開発用の Dockerfile, Docker-compose が毎回互換性問題で動かなくなるので現時点で動作するモノを覚え書きしておく。

細かい解説は
https://qiita.com/saitoeku3/items/b1aa2ae143624e551aea
https://qiita.com/azul915/items/5b7063cbc80192343fc0
あたりを参照

このページではこれら読んだ人が利用可能であろう、 Dockerfile と Docker-composeを提供する

# デフォルトでとりあえず動くモノ

## dockerfile
```
FROM ruby:2.6

ENV LANG C.UTF-8

RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       libpq-dev
# yarnパッケージ管理ツールをインストール
RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
    apt-get update && apt-get install -y yarn
# Node.jsをインストール
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - && \
    apt-get install -y nodejs

# 作業ディレクトリの設定
RUN mkdir /app
ENV APP_ROOT /app
WORKDIR $APP_ROOT

# gemfileを追加する
ADD ./src/Gemfile $APP_ROOT/Gemfile
ADD ./src/Gemfile.lock $APP_ROOT/Gemfile.lock

# gemfileのinstall
RUN bundle install
ADD ./src/ $APP_ROOT
```

## docker-compose
```
version: '3'

services:
  db:
    image: mysql:5.7
    volumes:
      - mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: root
    ports:
      - "3306:3306"

  web:
    build: .
    command: rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ./src:/app
      - bundle:/usr/local/bundle
    ports:
      - "3000:3000"
    links:
      - db
volumes:
  bundle:
  mysql_data:
```

## 利用手順
```
mkdir src
# make Gemfile
cat <<'EOF' > src/Gemfile
source 'https://rubygems.org'
gem 'rails'
EOF
touch src/Gemfile.lock

docker-compose build
docker-compose run web bundle exec rails new . --force --database=mysql

# BSD sed の場合(Macなど) GNU sed なら '.bak'を消す
sed -i '.bak' 's/password:$/password: root/' src/config/database.yml
sed -i '.bak' 's/host: localhost/host: db/'  src/config/database.yml

docker-compose run web rake db:create
# webpackのinstall
docker-compose run web rails webpacker:install

docker-compose up
```

# webpack不要の場合
今回作りたいのが純粋なAPIサーバで、フロントエンドを作る必要が無かったので、webpack周りを全部無くしてみた。

## Dockerfile
```
FROM ruby:2.6

ENV LANG C.UTF-8

RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       libpq-dev

# 作業ディレクトリの設定
RUN mkdir /app
ENV APP_ROOT /app
WORKDIR $APP_ROOT

# gemfileを追加する
ADD ./src/Gemfile $APP_ROOT/Gemfile
ADD ./src/Gemfile.lock $APP_ROOT/Gemfile.lock

# gemfileのinstall
RUN bundle install
ADD ./src/ $APP_ROOT
```

## docker-compose
変更なし

## 利用手順

```
mkdir src
# make Gemfile
cat <<'EOF' > src/Gemfile
source 'https://rubygems.org'
gem 'rails'
EOF
touch src/Gemfile.lock

docker-compose build
# --api を追加。 apiモードにしたくなければ、 --skip-javascript
docker-compose run web bundle exec rails new . --force --database=mysql --api

# BSD sed の場合(Macなど) GNU sed なら '.bak'を消す
sed -i '.bak' 's/password:$/password: root/' src/config/database.yml
sed -i '.bak' 's/host: localhost/host: db/'  src/config/database.yml

docker-compose run web rake db:create

docker-compose up
```
rails new ~すべてのはじまり~ ❏Rails❏

初心に戻ろうシリーズ。
すべての生みの親。
ゼウス・アマテラス・rails new

```:ターミナル
$ rails new manbow
```

このコマンドだけでアプリ開発の土台となるファイルを自動で一括生成してくれます。

#データベース指定
デフォルトでは`sqlite`

```:ターミナル
$ rails new manbow -d mysql
```

#バージョン指定
デフォルトでは`最新バージョン`

```:ターミナル
$ rails _5.2.1_ new manbow
```

#rails new ~その後~

・基本の流れは以下です。

1.rails newコマンドで新規railsアプリを作成
2.作成されるGemfileを編集
3.bundle installコマンドを実行
4.rails db:createコマンドでデータベースを作成
5.routes.rbファイルにルーティングを定義
6.その他必要なファイルの作成 ...

---

思い立ったらrails new
天気が良いからrails new
彼女に振られたらrails new

減るもんじゃないので気軽にガンガンrails newしちゃっていいと思います！

<br>
参考
>https://www.pikawaka.com/rails/create_app

<br>
ではまた！
自然言語処理：備忘録

# はじめに

普段画像ばかり触っていて、今後のキャリアを考えた時、自然言語処理がマストかなと考えたので勉強したことをまとめていきます。間違いがあった際は、ご指摘お願いします。

# 自然言語処理が使われているもの

まず、自然言語処理がどのようなところで使われているか見てみましょう。

1. **機械翻訳**
2. **検索エンジン**
3. **対話システム**
4. **質問応答**


(1) 機械翻訳

日本語から英語に変換するのを機械翻訳と言います。
`Google翻訳`をイメージすれば良いと思います。


(2) 検索エンジン

日常生活に欠かせない存在の検索エンジンにも、自然言語処理の技術が使われています。
**クエリ**を入力して、クエリに適合する何らかのものをデータベースから取り出す検索は、大量の情報を処理する上で最も基本的な技術です。

(3) 対話システム

音声認識 → 形態素分析 → 意味解析 → 対話処理 → 応答生成 → 音声合成

(4) 質問応答

質問解析 → 情報検索 → 情報抽出 → 回答選択

# 基礎知識

<font color='red'>コーパス</font> : 言語の使用方法を記録・蓄積した文書集合のこと
<font color='red'>均衡コーパス</font> : ある言語の使用実態をなるべく忠実に反映するようにバランスよく設計・抽出されたコーパス

<font color='red'>辞書</font> : 語句とその意味を記述したもの

<font color='red'>知識獲得</font> : 文字列を処理をすることで、コンピュータにとって有益な知識の状態にすること。

<font color='red'>分布類似度</font> : 意味の類似している語は、使われる文脈も類似しているという仮説(<font color='red'>分布仮説</font>)に基づいて、文脈が似ている単語は意味も類似しているとし、同義語や類義語を獲得する考え方

<font color='red'>シソーラス</font> : 同義語、類義語、上位・下位関係など、単語の意味的な関係を記述した言語資源。
<font color='red'>オントロジー</font> : 概念やものなどを意味に従って構造化して整理したデータベース。

<font color='red'>情報抽出</font> : 自然言語から構造化された情報を抽出する技術。
ex) 固有表現抽出、関係抽出、イベント情報抽出

<font color='red'>テキストマイニング</font> : 確率・統計的な手法を用いて大量のテキストから有用な情報を引き出す技術の情報

# 自然言語処理の処理の流れ
1. 形態素分析（N-gram）
2. 構文解析
3. 意味解析
4. 文脈解析




##1. 形態素分析

- 　言語を構成する最小単位である単語を切り出す技術
- 　単語分割に加えて品詞付与などの処理も同時に行う
- 　英語テキストならスペースを利用して区切れるが日本語はそうもいかない
- 　有名な形態素分析ソフトウェア「MeCab」
- 　他には、


#### <font color='blue'>MeCabの問題点</font>
新しい言葉や人名などの「未知語」は辞書に登録されていないため、MeCabが正しく認識できない。


##2. 構文解析

構造的な曖昧性を解消

1. <font color='red'>係り受け解析</font> - 単語と単語の繋がりを重視 
    - shift-reduce法：文を少しずつ解析していく手法
    - 最小全域木に基づく係り受け解析：shift-reduceより精度が良いが処理時間長い 

2. <font color='red'>句構造解析</font> - 句とその再帰的な構造を重視
    - 英文解析ではよく使われる
    - 日本語のような語順が比較的自由な言語ではあまり使われない
   
 
##3. 意味解析

文はある出来事や状況を記述している。文の意味はそのぶんが記述している出来事や状況の構造を表現したものと考えることができる。同じ出来事が記述されているのであれば、その文の統語的な構造が異なっていても同じ意味、同じ構造でなければならない。

意味処理は、以下の過程から成り立つ
- 文の構成要素である語の意味を明らかにする
- それらを統語構造を参照しながら構造化していく
- その際に、それらの間の統語的な関係を意味関係に置き換えていく

##4. 文脈解析

<font color='red'>照応解決</font> : 文の意味の構成要素のうち、代名詞のようにその文の中だけではその意味が明らかにならないものを、それが置かれたテキストに照らして明らかにする。

<font color='red'>共参照解決</font> : 代名詞等を含めてテキスト中の様々な表現のうちどれとどれとが同じ事物を指し示しているか明らかにする。

<font color='red'>修辞構造解析</font> : テキスト全体の目的とそれへの各文の関係を理解していく

これらの処理を広く<font color='red'>文脈処理</font>という。

   
# 現在の日本語入力の課題

### 周辺文脈の欠如
例えば、「せんだい」と入力された時「仙台」かもしれないし「千台」かもしれません。
誰が入力したかという周辺文脈は、現在のかな漢字変換でもいわゆる学習機能によって部分的に考慮される。


#### 周辺文脈を考慮した日本語入力がなかなかうまくいかない理由
➡︎文脈に該当するデータの不足
➡︎データが手に入ってもメモリに乗らない



# 終わりに

自分のメモとして残しました。
ご指摘がありましたらよろしくお願いします！
filter()とfind()の違い

# find()
jQueryオブジェクトの各要素の子孫要素を対象として要素を絞り込む

例

```html
<div class='parent'>
  <div class='child'></div>
</div>
<div class='parent'>
  <div class='child'></div>
</div>
```
```js
$('.parent').find('.child');
```

この場合の対象の要素は⬇️

```html
<div class='child'></div>
<div class='child'></div>
```

# filter()
jQueryオブジェクトの各要素を対象として要素を絞り込む

例

```html
<div class='parent'>
  <div class='child'></div>
</div>
<div class='parent'>
  <div class='child'></div>
</div>
```
```js
$('.parent').filter('.child');
```

この場合の対象の要素は⬇️

```html
<div class='parent'>
  <div class='child'></div>
</div>
<div class='parent'>
  <div class='child'></div>
</div>
```
Swift初心者が初心者なりに思うモチベーションの保ち方

#モチベーションを保ちたい
今後手に職をつけるという意味で、Swiftを勉強する事になった。
元々Unityを勉強していたが、挫折。
そう、僕は全くゲームを買ってくれない家庭だったが故、どんなゲームが面白くて、どんなゲームなら面白いを思いつかなかったのだ。

で、知り合いのエンジニアの方がSwiftをしている事もあり、自分も就職という道から脱線し、「これでは死ぬ」という事で始めた訳。

学習を開始して、約１ヶ月が経過した。
正直な進歩を書けば、全くコードがかけるなんてレベルではない。

むしろ、「は？意味わかんな」だ。

今回はそんな中でも僕なりに最近やっと見つけたモチベーションの保ち方を書いていこうと思う。

##君はエンジニア
僕らはおそらく、コードを書き始めている時点でエンジニアなのであろう。（本職の方すみません）

最近はなるべく、電車でもお風呂でも本を見るようにしているんだけど気がついた。

で、電車に乗るとほとんどの人がスマホを見ているこの時代。

僕は思った。
「もしかして、将来ほとんどの人が俺の作ったアプリを入れているのかも！」と。

そうすると少しワクワクする。

Unityはゲームという、ある意味「コアな人」をターゲットにしている。
僕みたいにゲームをしない人には分からないものがある。

でも、アプリは不特定多数の人に使われる可能性がある。
もちろんゲームもそれは言える事だが、LINEやTwitterなどのSNSは、「誰もが」をターゲットになっている。

もはや生活の一部だ。

「それ」を生み出せると思うとワクワクしないか。
eclipse × AmaterasUML 選択された操作は現在使用できません

以下の環境で java ソースコードから UML を自動生成しようとすると、「選択された操作は現在使用できません」のダイアログが表示され、自動生成できなかった。

### 環境

* Windows 10
* [eclipse (Pleiades All in One 2019-09)](https://mergedoc.osdn.jp/)
* [AmaterasUML] (http://amateras.osdn.jp/cgi-bin/fswiki/wiki.cgi?page=AmaterasUML) ※ 上記 eclipse にプリインストールされているもの

### 現象

* AmaterasUMLの機能で新規作成した cld ファイルにソースコードをドラッグ＆ドロップしても、クラス図が描画されない。（ソースコードが別タブで開くだけ）
* cld ファイルの任意の場所を右クリック > [Java] > [インポート] を実行すると、「選択された操作は現在使用できません」のダイアログが表示される。

### 原因

eclipse にプリインストールされている version で発生するようです。
なぜこの version でうまくいかないかは不明。  

### 解決方法
#### 方法1
1. [AmaterasUML] (http://amateras.osdn.jp/cgi-bin/fswiki/wiki.cgi?page=AmaterasUML) 
 から "AmaterasUML_1.3.4.zip" をダウンロード。
2. eclipse/dropins/AmaterasModeler/eclipse/plugin にダウンロードした jar を配置し、元々配置されていた 1.3.5 の jar を削除する。

#### 方法2 （← 2020/4/15 追記：情報提供していただきました）
eclipse.ini の -vm に別のパスを指定する。
以下の指定で動作した。
```＜eclipse展開したフォルダ＞\pleiades\java\8\jre\bin\server```

どのバージョンで動作するかは未調査。
BitriseのAutoProvisionと戦った話

この記事は豊田高専コンピュータ部アドベントカレンダー8日目の記事です

## iOSアプリを自動でデプロイしたい
BitriseでiOSアプリのCI/CDを回そうとしたとき、iOSアプリ特有のProvisioningをBitriseが自動で行ってくれるAutoProvisionで躓いたのでその備忘録にしたいと思います。

## 前提条件
- すでにBitriseにiOSアプリを設定している
    - あとはProvisioning通してBuildするだけ
- Apple Developer Programに登録済みである

## やったこと
これは初心者が試行錯誤の末動いたやり方なので足りなかったり多かったりした場合はコメントで指摘してもらえると助かります。

### BitriseのアカウントにApple Developerアカウントを紐付ける
これ、割と忘れがちな気がするのですが（自分がそうだった）あまり他の記事ではちゃんと書かれていなかった気がするので忘れずにやっておきましょう。

右上のアイコンからAccount settingsを選んで左側のConnected AccountsからApple Developer Accountを選択し、サインインしてください。

あとは回したいプロジェクトのTeamのConnected Apple Developer Portal Accountに先程追加したアカウントを設定します。
設定としてはこれで完了です。

### Code Signingの設定
これはどの記事でも書いてありましたが割とここでも躓いたので書いておきます

projectのWorkflowからCode Signingのタブに飛びます。ここにcertification fileを投げるわけですが、certification fileを作る部分は他記事を参照してください。

作ったCertificationを投げてもパスワードが打てなかったのですが、パスワードを可視状態にすると打てるようになります（これに気づかず結構時間を消費したので気をつけてください。っていうかこれはセキュリティ的に大丈夫なのか？）
ちなみにここで設定するCertification fileはadhocにしてないと他の人に使ってもらえないので注意が必要です。
また、Adhocでビルドする場合はWorkflow EditorのAuto ProvisionのところとArchive & Exportの部分でもAdhocを設定しなければならないので気をつけてください。
Code Signingの設定はこれで終了です。

以上の設定を忘れずにやればビルドが通るようになるはずです。試してみてください。

## まとめ
他記事では全部が書いてなかったり公式ドキュメントではかなり端折った説明になっているので少し分かりづらいかもしれませんが慣れればすぐにiOSアプリのCI/CDが組めるようになるのでBitriseとてもおすすめです。ぜひ使ってみてください

## あとがき
Workflowはprimaryとdeployに分けて作ったほうがいいです。Workflowを一本しか作ってなくてpushするたびにdeployされるとちょっと鬱陶しいです。
スクロールする時に伸縮するヘッダーをStoryboardだけでお手軽に作成する

#はじめに
こちらは [tecotec Advent Calendar 2019](https://qiita.com/advent-calendar/2019/tecotec) の8日目の記事です。

ピンポイントでデザインを再現できるOSSが意外と見つからないことってありますよね。
ここでは __スクロールする時に伸縮するヘッダーをStoryBoardのみでお手軽に作成する__ 手順を紹介いたします。

※Twitterとかのプロフィール画面とかで良く見かける、こんな動きのするヘッダーです。
![scroll_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535428/d44e5f0c-1b93-ee85-5db0-ee482e295c1c.jpeg)


#まず調べてみた
ちなみにまずはGithub等でOSSを調べました。
当然、それっぽいものは誰かが作ってくれています。

 - https://github.com/romansorochak/ParallaxHeader
 - https://github.com/BenjaminPrieur/IOStickyHeader

簡単に見つけることはできたのですが、TableViewやCollectionViewで使用される前提だったり、今回の様に手前の要素の背景に回り込む様な動きにするにはちょっと工夫が必要そうです。

#ひらめいた！
あれ？もしかしてこれ __StoryboardのConstraintの設定だけで__ 簡単にできるんじゃない？
と思いちょっとStoryboardだけで作ってみました。

#いざ実践
###手順１
スクロールビューの背面にImageViewを配置して、上と左右のConstraintsをSuperViewから0に設定します。
<img width="1089" alt="スクリーンショット 2019-12-08 9.21.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535428/4e9005ff-0b1a-b89b-d986-52d1b60b7701.png">

###手順２
次にImageViewのBottomのConstraintをScrollView内にあるコンテンツのTopと紐付けます。
<img width="1089" alt="スクリーンショット 2019-12-08 9.20.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535428/b7bcc33d-96eb-6b9b-5541-4ad32d9fd9f8.png">

###手順３
ここで一度動作を確認してみましょう。
![screen_ng.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535428/f613f5d6-d653-aa6f-e9b1-6755c16b26f5.gif)

かなりおしい！！！
上へのスクロールは想定通りの動きだけど、下へのスクロールがおかしい！

###手順４
下にスクロールした時に別のConstraintと衝突してる（というかこいつのせいでスクロールできなくなってる）風だったのでPriorityを修正します。
<img width="1089" alt="スクリーンショット 2019-12-08 9.21.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535428/c149ea6f-0797-c361-8377-a085f780c87c.png">


#結果！
できた〜〜！
![screen_ok.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535428/de564c9a-a192-fee8-d576-8f7f57e37435.gif)
この設定だと、下へのスクロールもちゃんと出来ました。

#結論！
StoryBoardをちゃんと使えれば意外とOSSを使わなくてもやりたいことができますね！

※この記事を書くにあたって色々調べ直したところ、同じことやってる人いました。
[Stretchable Header view in Scrollview — Swift 5, iOS by @Ananth_krish_KG](https://link.medium.com/uPCQOBoN81)
[小ネタ] プロキシ等の関係でpipが使えない場合のモジュールインストール方法

会社のセキュリティの関係でpipが通らないときのメモ。
いちいち申請するのも面倒くさいし、直接インストールしようと思って調べてみました。

### やりかた
1. https://pypi.org/ でインストールしたいモジュールを検索
2. 左ペインのDownload filesからwhlファイルをダウンロードする

wheelファイルがなければtar.gzでもいける（はず。。。）

### whlファイル名のcp27とかcp36ってなに？
Python Verisonです。何に対応しているかは以下のプログラムで調べることができます。

```python
from pip._internal.pep425tags import get_supported
print(get_supported())

>>>
[('cp35', 'cp35m', 'win_amd64'), ('cp35', 'none', 'win_amd64'), ('py3', 'none', 'win_amd64'), ('cp35', 'none', 'any'), ('cp3', 'none', 'any'), ('py35', 'none', 'any'), ('py3', 'none', 'any'), ('py34', 'none', 'any'), ('py33', 'none', 'any'), ('py32', 'none', 'any'), ('py31', 'none', 'any'), ('py30', 'none', 'any')]
```

### インストール方法（Windowsの場合）
1. コマンドプロンプトを起動
2. ダウンロードしてきた.whlファイルのあるフォルダに移動
3. pip install "ファイル名.whl" を実行
selenium-webdriverがWebpack環境下で動かない問題

## 現象
Vue Cli 3 + Vue CLI Plugin Electron Builder環境でselenium-webdriverを使用した場合、次のようなエラーがでる。
```Uncaught Error: Failed to import atoms module ./atoms/get-attribute.js. If running in dev mode, you need to run `bazel build //javascript/node/selenium-webdriver/lib/atoms:get-attribute.js` from the projectroot: Error: Cannot find module './atoms/get-attribute.js'```

## 結論
`node_modules/selenium-webdriver/lib/http.js`を次のように修正する。

- requireAtomを実行している部分の第一引数をファイル名だけにする
- requireAtom関数内でrequireしている部分にpathを追加する

### 修正前
```
const getAttribute = requireAtom(
    './atoms/get-attribute.js',
    '//javascript/node/selenium-webdriver/lib/atoms:get-attribute.js');
const isDisplayed = requireAtom(
    './atoms/is-displayed.js',
    '//javascript/node/selenium-webdriver/lib/atoms:is-displayed.js');
```
```
/**
 * @param {string} module
 * @param {string} bazelTarget
 * @return {!Function}
 */
function requireAtom(module, bazelTarget) {
  try {
    return require(module);
  } catch (ex) {
    ...
  }
}
```

### 修正後
```
const getAttribute = requireAtom(
    'get-attribute.js',
    '//javascript/node/selenium-webdriver/lib/atoms:get-attribute.js');
const isDisplayed = requireAtom(
    'is-displayed.js',
    '//javascript/node/selenium-webdriver/lib/atoms:is-displayed.js');
```
```
/**
 * @param {string} module
 * @param {string} bazelTarget
 * @return {!Function}
 */
function requireAtom(module, bazelTarget) {
  try {
    return require('./atoms/' + module);
  } catch (ex) {
    ...
  }
}
```

このように修正すると無事requireされて実行できます。

## 余談
ワクワクしてプルリクだそうとしたら先客がいました。くやしいぃ・・・
https://github.com/SeleniumHQ/selenium/pull/7726
Perlの正規表現を空(m//)にすると何が起こるのか。

# 任意の文字列にマッチするわけじゃないんです…

この現象について言及してるのが[この記事](http://d.hatena.ne.jp/debug-ito/20121202/1354419254)ぐらいしか見つからなかった…
【Rails】bundle installでbundlerが無いエラーが出る


CircleCIおよび、Dockerイメージ作成時、`bundle install`をすると、以下のエラーが出てしまいました。

```
/usr/local/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.0.2) required by your /home/circleci/repo/Gemfile.lock. (Gem::GemNotFoundException)
```

ローカル環境では、`gem install bundler`をしていたので、circleCIのconfig.ymlとDockerfileそれぞれに、`gem install bundler`を書いてあげれば解決しました。

```config.yml(circleCI)
- run:
          name: bundler install
          command: |
            gem install bundler
```

```Dockerfile.
RUN gem install bundler
```

これらを`bundle install`の前に記述すれば解決です。
EWI x HALION 

仮メモ

32bitで詰んだ + 本家がMojaveで動作が怪しいので、普通のHALIONで動かせるようにしたい。

EWIxHALION環境を
https://t5blog.waveformlab.com/2019/06/macOS-32bitapp-AKAI-EWI-USB.html
Rubyシルバー取得前 initializeメソッドまとめ

##　initializeメソッドをまとめてみました

- initializeメソッドはnewをするごとに呼び出されるメソッド
- 引数によりclassのデータを初期化する

```ruby:book.rb
class Book               #クラスメソッドBookを定義
  def initialize(title)  #newするごとに呼び出されるインスタンスメソッド
    @title = title       #@nameはインスタンス変数
  end
  def review             #インスタンスメソッドreviewを定義
    "#{@title}は面白い"   #"#{}"で変数を展開
  end
end

 read = Book.new("Hoge")
 read.review
```
実行結果

```
Hogeは面白い
```
ただし
変数readの中身を変更することはできない。

```ruby:book.rb
read.title =  "Fuga"
NoMethodError: undefined method `title=' for #<Book:0xxxxxxxxx @title="Hoge">
```
attar_accessorを定義すると、変数の中身を変更できるようになる

```ruby:book.rb
class Book  
  attr_accessor :title             
  def initialize(title)  
    @title = title       
  end
  def review             
    "#{@title}は面白い"   
  end
end

 read = Book.new("Hoge")
 read.review
 read.title = "Fuga"
 read.review
```
実行結果

```
Hogeは面白い
Fugaは面白い
```

initializeメソッドを使わずに変数の中身を変更できるように書くには

```ruby:book.rb
class Book
  def title=(title)
    @title = title
  end
  def review
    "#{@title}は面白い"
  end
end

reading = Book.new
reading.title = "HogeFuga"
reading.review
 ```
実行結果

 ```
HogeFugaはは面白い
```

ただし、newするさいに引数は持てない

```ruby:book.rb
reading = Book.new("HOGEHUGA")
ArgumentError: wrong number of arguments (given 1, expected 0)
```
Unity ヘッドレスビルド

仮メモ

### UnityのヘッドレスビルドでGameServer

- minimal な UbunteDockerにLinuxビルドしたUnityServerを組み込んで実行でよいはず
   - https://blog.manabusakai.com/2018/08/minimal-ubuntu-dockerfile/

### Unityのサンプル

- https://github.com/whisper0077/AgonesUnityServerSample/tree/master/Assets/Scripts
- https://github.com/googleforgames/agones/tree/master/examples/unity-simple
- https://qiita.com/Manjiii/items/88699c52f5ade2bf4b6f
Git Book メモ

仮メモ

- 表紙の挿入の仕方
    - https://1000ch.net/posts/2018/gitbook.html
- 自動化用コンテナ
    - https://qiita.com/HeRo/items/f9ef391fa005b5fa100c
- PDFにするときの話
    - https://dev.classmethod.jp/devenv/install-gitbook/
LaravelでシンプルなWebスクレイピング

#まえおき
RPA（ロボティック・プロセス・オートメーション）って流行ってますよね。
色んな所でお客さんから「RPAを使って業務の自動化をしたい」と言われてるかと思います。

最近、同じようなことをお客さんから言われていましたが
内容を聞いてみると「特定のWebサイトを開いて一部の内容を取得する」みたいな
Httpリクエストを投げてDOMを検索するだけで十分な作業だったりしました。

という訳で今回は以下の作業内容をWebスクレイピングでやってみようと思います。

①Qiitaで特定のキーワードで記事検索
②検索結果の一番上の記事を開く
③開いた記事の本文を取得

使用するのはLaravel v5.8です。

#前準備

HTTPクライアントのライブラリの**Guzzle**を使いたいので
Composerを使ってインストールします
（通信さえできれば**cURL**でもいいです）

```
composer require guzzlehttp/guzzle
```

#コード

```routes/web.php
Route::get('/', function () {
    $client = new \GuzzleHttp\Client([
        'base_uri' => 'https://qiita.com/'
    ]);
    $dom = new DOMDocument();

    // Qiitaで特定のキーワードで記事検索（今回は「RPA」でやります）
    $res = $client->request('GET', 'search?q=RPA');

    // 開いたページから一番上の記事のリンクを取得
    @$dom->loadHTML($res->getBody()->getContents());
    foreach( $dom->getElementsByTagName("h1") as $searchNode ){
        if( "searchResult_itemTitle" ==  $searchNode->getAttribute('class') ){
            $firstArticlelink = $searchNode->getElementsByTagName("a")->item(0)->getAttribute('href');
            break;
        }
    }

    // 記事を開いて本文を取得
    $res = $client->request('GET', $firstArticlelink);
    @$dom->loadHTML($res->getBody()->getContents());
    foreach( $dom->getElementsByTagName("div") as $searchNode ){
        if( "p-items_article" ==  $searchNode->getAttribute('class') ){
            $articleBody = $searchNode->nodeValue;
            break;
        }
    }
    return $articleBody;
});
```
#DOMXPathを使ったやり方

要素の検索あたりは **DOMXPath** を使うと
もう少しスッキリ書けます（使い方が若干クセがあるかも）

```routes/web.php
Route::get('/', function () {
    $client = new \GuzzleHttp\Client([
        'base_uri' => 'https://qiita.com/'
    ]);
    $dom = new DOMDocument();

    // Qiitaで特定のキーワードで記事検索（今回は「RPA」でやります）
    $res = $client->request('GET', 'search?q=RPA');

    // 開いたページから一番上の記事のリンクを取得
    @$dom->loadHTML($res->getBody()->getContents());
    $xpath = new DOMXPath($dom);
    $firstArticlelink = $xpath->query('//*[@class="searchResult_itemTitle"][1]/a')->item(0)->getAttribute('href');

    // 記事を開いて本文を取得
    $res = $client->request('GET', $firstArticlelink);
    @$dom->loadHTML($res->getBody()->getContents());
    $xpath = new DOMXPath($dom);
    $articleBody = $xpath->query('//*[@class="p-items_article"]')->item(0)->nodeValue;
    return $articleBody;
});
```

#まとめ
意外と簡単に取得できました。

RPAツールを使うまでもない簡単な情報収集系の作業は
こういう感じでも実現できそうです。
製薬企業研究者がRにおける関数についてまとめてみた

# はじめに

ここでは、R初心者向けに「関数」の基本について解説していきます。


# 関数の作成

関数を作成するときは、`function`を使います。
返り値は`return`で書きます。

```r:function_1.R
hello <- function(){
  return ("Hello, R!")
}

average <- function(a, b){
  return ((a + b) / length(c(a, b)))
}
```


# 関数の利用

関数を作成したら、実行したい箇所で関数名を呼び出します。
関数を作成しただけで実行されるわけではありません。

```r:function_2.R
print(hello())

print(average(1, 3))
```


# 変数のスコープ

関数内で定義した変数（ローカル変数）は、関数外では同じオブジェクトとして使うことはできません。
関数外で定義した変数（グローバル変数）は、関数内で使うことはできますが、関数内での変更を反映させたい場合は、グローバル変数であることを関数の定義時に明示する必要があります。

```r:function_3.R
addone <- function(n){
  a <- 1
  return (n + a)
}

print(addone(2))
print(a) # エラーになる。
```


```r:function_4.R
a <- 1

addone <- function(n){
  return (n + a)
}

print(addone(2))
print(a) # エラーにならない。
```

```r:function_5.R
a <- 5

addone <- function(n){
  a <- 1
  return (n + a)
}

print(addone(2))
print(a)
```

```r:function_6.R
a <- 5

addone <- function(n){
  a <<- 1
  return (n + a)
}

print(addone(2))
print(a)
```

```r:function_7.R
a <- 5

addone <- function(n){
  a <- 1
  a <<- 7
  return (n + a)
}

print(addone(2))
print(a)
```


# まとめ

ここでは、Rにおける「関数」の基本について解説しました。
特に、変数のスコープについては注意が必要です。


# 参考資料・リンク

[プログラミング言語Rとは？統計分析に強い？](https://pharma-engineer.com/basic-programming/r-summary/)
【Unity】Update/FixedUpdateとTimeの関係

## UpdateとFixedUpdateの違い
### Update
・可変フレームレートで実行される。すなわち各フレーム間の時間間隔が異なる。
　処理落ちが発生すると、呼ばれる頻度が少なくなる。

### FixedUpdate
・固定フレームレートで実行される。すわなち各フレーム間の時間間隔が同じ。 
  多少の？処理落ちであっても呼ばれる回数は同じ。

## Updateを停止させる
・ポーズ画面のように画面のオブジェクトを止めるにはTime.timeScaleを使う。
### Time.timeScale
・時間の経過速度を設定できる。
・0にすると停止するのでポーズさせたいときは0にする。
### Update関数の挙動
|関数名| Update | FixedUpdate | 
|:--|:--|:--|
|関数の呼び出し回数(scale=2)| 変化なし  | 2倍  |
|関数の呼び出し回数(scale=0) | 変化なし | 0(呼ばれない)  |
|(fixed)deltaTime(scale=2)   | 2倍  | 変化なし|
|(fixed)deltaTime(scale=0)   | 0  | 変化なし|

### 結論
・ポーズ画面に備える場合、以下の対応をする。
　- Updateで時間がからむ処理の場合、Time.deltaTimeを設定する。
　- FixedUpdateの場合、特に対応不要。(timeScale=0で止まるので。)

# 参考サイト
[Unityの一時停止で止まるもの、止まらないもの【Time.timeScale】](https://tech.pjin.jp/blog/2016/12/20/unity_skill_7/)
[タイムとフレームレートの管理](https://docs.unity3d.com/ja/2017.4/Manual/TimeFrameManagement.html)
Splunkでいろんな地図を利用したい

#Splunkでいろんな地図を利用したい

Splunk上で地図にデータをプロットしてる方もしてない方も、いろんな地図が使えたほうが何かとモチベーションが上がるのでは、とうことで、自分のモチベーションを上げるためにメモを残しておきます。

Splunkで利用可能な地図はopenlayers(https://openlayers.org/ )のxyzが使える感じがするので、xyzに対応するタイルを探してみました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45702/68fb3209-b2ec-5fc5-48bd-5a761e50b9c6.png)

デフォルトだと、↑のようなSplunkタイルが利用できますが、対応しているZoomlevelも7くらいまでなので、世界全体、国地域くらいの表示で使うものだと理解しています。

上のスクリーンショット中の<b>URLに他の地図のタイルURLを入れることで利用する地図を切り替える</b>ことができます。

地図の切り替えを行う前に、プロットするデータを準備します。（特に無くても切り替えられるけど、プロットするものがあったほうがいいなーという個人的な気の持ち様です）

今回サンプルで使うデータは以下のcsvです。むかーしむかしのSplunkが日本にあるのかないのか位の頃から、いま(2019年12月）のSplunkの事務所の場所の緯度経度情報です。

```
loc,lat,lon
1,35.261218, 139.161547
2,35.258399, 139.167231
3,35.678657, 139.770860
4,35.682865, 139.764265
5,35.681177, 139.764129
6,35.686936, 139.762776
```

これをlookupファイル(ファイル名は'splunkjp.csv')としてlookupへアップロードして以下のサーチを実行して、地図表示にしたら準備OKです。

```
| inputlookup splunkjp.csv 
| geostats maxzoomlevel=18 count
```

その他、ご自身がお持ちの位置情報でも大丈夫ですので、やってみてください。
geostats コマンドの詳細は以下を参照してください。

https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Geostats

では以下、いくつかタイルをみてみましょ。

---

###1. OpenStreetMap

```
http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45702/579552e9-dc4f-e373-9c88-6a9a025d64f6.png) 

これは、すでにタイルのプリセット設定としてはいっているので迷わず設定できるかと思います。

---

###2. 国土地理院

```
https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45702/7c808ce2-99e5-7aef-b1b8-f5f5f6d7f6ff.png)

以下の国土地理院のタイル一覧から、淡色地図をピックアップしてみました。
https://maps.gsi.go.jp/development/ichiran.html

---

###3. エコリス地図タイル

```
https://map.ecoris.info/tiles/vege/{z}/{x}/{y}.png
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45702/0ebd35a0-6494-d858-228f-d0e974d5b6f3.png)

https://map.ecoris.info/
> 「エコリス地図タイル」は、自然環境に関するさまざまなデータを地図タイル形式で配信するサービスです。地図タイルは、広域かつ詳細なデータをブラウザなどで簡単に見ることができます。

---
###4.Google Map

```
http://mt3.google.com/vt/lyrs=m@114&z={z}&x={x}&y={y}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45702/63340f30-29db-a1a0-5fdd-14cdba631f0e.png)

おなじみGoogleMapです。

```
http://mt3.google.com/vt/lyrs=s,h&z={z}&x={x}&y={y}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45702/d62cdaa6-0f6a-062c-0c9b-b025be71205c.png)

こちらもGoogle Mapからです。

---

###5. タイルサーバがあればいいのか？

そうなんです、もし自分のタイルサーバがあれば、そのURLを指定すれば地図をSplunkに埋め込むことができます。特に、タイルデータを取得する際には、サーバへの通信が必要になりますが、ネットワーク通信範囲に制限があるような環境で、どうしてもSplunkで地図を使いたい場合には、タイルサーバを構築することになると思います。

---

###まとめ

- Openlayersのxyzタイルを使ってSplunkで利用する地図を切り替えることができる。
- 独自タイルサーバがあれば、ネットワークの内側から地図を利用することはできる。

###最後に

地図を使ったダッシュボードにはXML内に出典情報も記載しておきましょう。

```html
<map>
...
<option name="mapping.tileLayer.attribution">Map data (c) マップのソースを記載</option>
...
</map>
```

Happy Splunking ♪
【Git】基本的な使い方の流れ（centos7インストール〜）



#基本的な流れ

1.gitのインストール
2.初期設定
3.gitを使用してバージョン管理する。

#インストール方法

コチラを参照
[【Git】Gitインストール手順（vagrant&virtualbox&centos7](https://qiita.com/JUM22676603/items/dae0afe7fe1d67a6e37b)



##設定

git はデータを保存するときに必ず保存した人の名前と E メールを記載することになっています。なので、それを設定する。

```git
$ git config --global user.name "(your name)"
$ git config --global user.email "(your email)"

色の設定
$ git config --global color.ui true

Configの確認
$ git config -l
$ git config --help
$ git help config
```

#基本的な流れ

##Git一連の流れ（開発環境）

```
これは最初だけ、一番上層のディレクトリで行う
git init

ステージングエリアに登録
git add -A

履歴に登録
git commit -m "変更のコメント"

※addとcommitを同時する
git commit -am “変更名”

```

##Git一連の流れ（共有リポジトリ）

```git
共有リポジトリの登録
$ git remote add origin リポジトリのURL

masterの内容をoriginに登録する
$ git push origin master

```

originはなんでも良い、リポジトリの登録名。
masterとはローカルで作成している、ファイルのマスター



#log,履歴

```git
commitの履歴
git log

履歴を1行で確認できる。
git log—oneline

履歴を詳細に確認できる。
git log -p

どのファイルが何箇所変わったか確認
git log —stat

変更を元に戻す。
git checkout — ファイル名

addしていないものの変更履歴を確認できる。
git diff

commitしていないものの変更履歴を確認できる。
git diff —cashed

logを増やさず、変更が出来る。ちょっとした変更等で活用。
git commit —amend
```

#Git管理下のファイル削除、移動

```
削除するときは。
$ git rm ファイル名

移動する時
$ git mv ファイル名　移動先

vim .gitignoreでファイルを作成し、
*.logとすると、logファイルはバージョン管理されない。
サブディレクトリの中のファイルに適用させる場合は、そのサブディレクトリの中に.gitignoreを作る。
```

#前のコミットに戻したりするとき

```git
直前のcommitに戻す。
git reset —hard HEAD

任意のlog履歴に戻す。
git reset —hard (ログナンバー)

元々のcommitに戻す。
git reset —hard ORIG_HEAD
```

#ブランチ


```git
どのブランチにいるか確認する。
git branch

新しいブランチを作成する。
git branch (ブランチ名)

指定のブランチに移動する。
git checkout (ブランチ名)

ブランチの変更を取り込む
git merge (ブランチ名)

ブランチの削除
git branch -d (ブランチ名) 
```

#マージの衝突
違うブランチで同じ箇所を変更し、mergeしようとするとエラーが出る。


#タグ

git logの暗号のような番号を名前付けできる

```git

１個前のcommitにタグ（名前）をつける
git tag (変更名)

指定のcommitにタグ名を付ける
git tag (変更名) (commit暗号)

タグの削除
git tag -d (タグ名）
```

#エイリアス
よく使うgitコマンドの短縮を作成できる

```git
使い方
git config —global alias. (短縮名)　(コマンド)

(例
git config —global alias.co checkout  
```

#共有リポジトリ

```git

共有リポジトリにする宣言。フォルダにて実施
git init —bare

共有リポジトリのパスを登録
git remote add (登録名） (パス)

共有リポジトリの削除
git remote rm (登録名)

masterを共有リポジトリに送る
git push (登録名） master

パスの共有内容を保存ディレクトリにコピーする
git clone (パス)　(保存ディレクトリ名)

共有リポジトリの内容をmasterに持ってくる
git pull （共有リポジトリ名） master

登録されているリモートリポジトリの確認
git remote -v

リモートリポジトリURLの編集
git remote set-url [repository name] [repository url]

リモートリポジトリの削除
git remote rm [repository name]
```

以上です。
機械学習勉強方針

# はじめに
最近、機械学習の勉強を始めたが、散発的ではなく、体系的に勉強したく、方針を記しておくことにしました。

## 学習範囲
1. 回帰解析
2. 決定木
3. ニューラルネットワーク

## 学習方針
- 数式による理論の理解
- pythonによる実装方法の習得
- 関連論文の掲載（時間があれば、読む）

## 回帰分析


## 決定木
- 基本理論
https://qiita.com/Seiji555/items/e2bdd5f18eadffd56215


- python実装

### アンサンブル学習
- バギング(ブートストラップ集約)
- バンピング
- ランダムフォレスト
- AdaBoost(アダブースト)
- 勾配ブースティング（もう少し、具体例を元に学習する予定。）

https://qiita.com/Seiji555/items/4370551f37d522d17976

## ニューラルネットワーク
- 物体検知

# その他勉強したいこと
### リモートセンシング
　tellusを入力ソースとした、物体検知。
### ブロックチェーン

# 最後に
この記事で、学習の進捗を見て行きたい
#Stripe のダッシュボードから webhook のエンドポイントURLを追加してテスト送信してみる ( e.g subscription invoice.payment_succeeded )


https://dashboard.stripe.com/test/webhooks

開発者 > Webhook からエンドポイントを追加する

デフォルトで全てのイベント に webhook が追加されるというわけではなく、イベントタイプに対してエンドポイントを設定するみたいだ
(当たり前か？)

一個のイベントを選ぶ、イベントのグループを選ぶ、複数のイベントを選ぶことができる

![image](https://user-images.githubusercontent.com/13635059/70361444-eef65880-18c4-11ea-81d7-462a5abdb64d.png)

![image](https://user-images.githubusercontent.com/13635059/70361551-4bf20e80-18c5-11ea-81db-5e615469c967.png)

![image](https://user-images.githubusercontent.com/13635059/70361468-02a1bf00-18c5-11ea-9a77-127dbd905712.png)

# テスト送信

簡単にテスト送信ができて、リクエストを確認できるみたいだ。

![image](https://user-images.githubusercontent.com/13635059/70361626-878cd880-18c5-11ea-91e6-0f1553e23dcc.png)
![image](https://user-images.githubusercontent.com/13635059/70361627-88be0580-18c5-11ea-80e4-95d2cd7f31aa.png)

# webhookのリアルな動作確認

テスト送信ではなく本当のイベントを発生させる場合

例えば Subscription 定期支払いの 請求の支払い成功 invoice.payment_succeeded であれば、
実際に Stripe API や Stripe CLI を使って 「支払い成功」というイベントが発生するような処理を実行すれば良い

するとダッシュボードにもwebhookの履歴が記録されているのがわかる


```
customer=$(stripe customers create --email="alice@example.com")
echo "$customer" | jq

customer_id=$(echo "$customer" | jq -r '.id')
echo "$customer_id"

# Create Plan and Product in both time
# https://stripe.com/docs/api/plans/create?lang=curl
# https://stripe.com/docs/billing/subscriptions/products-and-plans
plan=$(stripe plans create --interval='day' --currency='jpy' --amount='1000' --data="product[name]"="Gold special")
echo "$plan" | jq

plan_id=$(echo "$plan" | jq -r .id)

# Create payment method as credit card
# https://stripe.com/docs/api/payment_methods/create
payment_method=$(stripe payment_methods create --type="card" --data "card[number]"=4242424242424242 --data "card[exp_month]"=12 --data "card[exp_year]"=2020 --data "card[cvc]"=314)
echo "$payment_method" | jq
payment_method_id=$(echo "$payment_method" | jq -r .id)

# Attach payment method to customer
# https://stripe.com/docs/api/payment_methods/attach
stripe payment_methods attach "$payment_method_id" --data "customer=$customer_id"

# Set default payment method to customer
# https://stripe.com/docs/api/customers/update#update_customer-invoice_settings-default_payment_method

# Create subscription for customer
# https://stripe.com/docs/api/subscriptions/create
stripe subscriptions create --customer="$customer_id" --default-payment-method="$payment_method_id" --data="items[0][plan]"="$plan_id"

# open https://dashboard.stripe.com/test/customers/"$customer_id"

```

![image](https://user-images.githubusercontent.com/13635059/70361770-0124c680-18c6-11ea-9448-8eeb07e6be43.png)





# webhookを受け取るエンドポイントをまだ作っていない場合

webhook のテストをローカルでやるには Stripe CLI をインストールするのが良いだろう


そちらはダッシュボードのテスト送信機能とは繋がっていないかもしれないが？

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->