OmniAICreator/Qiita-1.07M huggingface dataset:
Google Colaboratoryで誰でも使える簡易ベイジアンABテストツールを作成してみた

## 概要

実装例は沢山あるものの，簡単に使えるWebツール的なものが見当たらなかったため作ってみました．Google Colaboratoryで作ったので「簡単に使える」とは言えないかもしれませんが，CoLabのフォーム機能を使用しつつ使い方を記載しているので，データエンジニアでない方でも使えるかと思います．今回は作ったツールの共有とざっくりとした感想が主です．

以下がそのツール

https://colab.research.google.com/drive/1xkQ-KFfcyZXdXboOCALkDH_XCwQrsB25?usp=sharing

コード
https://github.com/o93/bayesian-ab

ベイジアンABテストについては過去記事にしています．
[難しく考えずにベイジアンABテストを試してみた](https://qiita.com/o93/items/15bfdb259580461793b5)

## 前提条件（2022/1/9追記
過去記事も含めて理論的な説明をする記事ではないため（そもそも自分の実力では現状それができない），出てくるワードの意味が間違っているかもしれません．指摘は頂けると有り難いです．最近，個人的に，「役立つなら良いじゃん」，「ちゃんと理解しないと..」という両方の思いがせめぎ合っていますが，詳細を理解せずに使っている人が居てこそ，世の中がより速く発展していけるとも感じています．

## 使い方

[ここ](https://colab.research.google.com/drive/1xkQ-KFfcyZXdXboOCALkDH_XCwQrsB25?usp=sharing)にアクセスします
右上の接続ボタンを押します
![スクリーンショット 2022-01-08 18.26.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44273/107fba6b-87b9-da31-529c-864c5ac17e8c.png)

接続ボタンがあったところに`RAM・ディスク`が表示されると，ツールが動作可能になります

`使い方`を読んだ上で，入力欄に必要な情報を入力します
初期値が入力されているので，必要に応じて差し替えてください
![スクリーンショット 2022-01-08 18.33.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44273/54a63f77-41c8-16d2-b653-1c580b2fd286.png)

フォームの左上にある再生ボタンを押します
![スクリーンショット 2022-01-08 19.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44273/a5dab49d-912b-87d2-eaee-8cc5c7891cfb.png)
確率分布のグラフやベイジアンABテストの結果が表示されるかと思います

## 前回の記事と異なる部分

### Google ColaboratoryのUI機能がめっちゃ便利！
値を入力できるフォームを利用しました．デザイン的な制限はありますが，APIやWebサービスを立ち上げなくても簡単なデータ分析機能を提供することができます！計算リソースはそれぞれ使用者のGoogleアカウントに紐づいて使用されるため，提供者がサーバー費用を負担する必要もありません．コード丸見えですけど..

フォームは以下のような記述だけで実装できます．

```python
#@markdown しきい値を入力
threshold = 0.9 #@param {type:"number", min:0.0, max:1.0}
```
![スクリーンショット 2022-01-08 19.41.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44273/1c6b8d0c-42b1-8b05-4cb2-59358ed5fd91.png)

参考: [ColabにUIをつける小技集](https://qiita.com/john-rocky/items/e5802cdd15dc2e34cb84)

今回使用していませんが，ボタンは以下のように参考記事よりシンプルに実装できます．

```python
import ipywidgets as widgets
from IPython.display import display

def on_clicked(b):
  with output:
    print('Click!')

button = widgets.Button(description='Submit')
output = widgets.Output()

button.on_click(on_clicked)
display(button, output)
```

### グラフ表示範囲を大事な箇所に絞る工夫
サンプルデータが極端に少ない場合を除いてCV率の確率分布が`0.0`〜`1.0`に広がっているとは限らないため，グラフ表示の際に表示データを以下のように絞っています．

```python
# 表示範囲を限定
plot_index = np.where((pa > 0.00001) | (pb > 0.00001))
p_pa = pa[plot_index]
p_pb = pb[plot_index]
```
極端に確率の値が低い範囲を除外した配列の`index`を`np.where`で取得して適用しています．

### 感想と今後
最初は[Streamlit](https://streamlit.io/)で`Cloud Run`にデプロイ，みたいなことを目論んでいましたが，めんどくさくなってCoLabで実装してみたところ，思っていたより汎用的に利用できることが分かりました．簡単なパラメータ調整はフォーム機能があるし，ファイルはドラッグ＆ドロップでアップロードできます．UIに拘らなければ色んな検証・分析ツールが作れそうでした！

今後は以下のようなことを考えています，，時間あるときにできたらいいな..

- PyMC3を使用したビジュアライズ
- より汎用的なベイズ推論，因果推論のツール化
【ZOOM】毎日のZOOM生活をちょっとだけ快適にしたい

# 毎日のオンライン会議・授業でちょっとだけ楽できるアプリをつくりました

こんにちは．kakekakemiyaと申します．
現在は東京大学工学部電子情報工学科というところに所属しております．

今回は，私の作ったアプリの紹介をさせていただきたく投稿させていただきました．

> なお，本記事では「オンライン会議ツール」と書けばいいところを「ZOOM」で統一させていただきますが，国内シェアの高さと，自分が普段使っているというだけの理由なので，ZOOMアプリへの宣戦布告でもなければ他競合製品では使えないアプリであるというわけでもありません．

# ZOOMへの不満

ZOOMは今やコロナ禍において欠かせないアプリの一つとなりました．

特に，オンライン授業を行なっている大学では，学生は毎日各授業のURLに接続してリモート受講をしているので大学生活に欠かせない存在となっています．

私自身もコロナ直撃大学生なので，2年生のころから毎日オンライン授業を受けているわけですが，兼ねてから生じているZOOMへの不満が，


__URL管理が面倒くさいーーー__

ということです．


メモ帳やslack等に自分の受けている授業のURLを保存しておいて，時間になったら今日は何曜日で今何時だからこのURLか！といちいち選ぶのが面倒くさがり屋の私にはなかなか鬱陶しいものでした．

この不満に共感してくださる方がどれくらいいるのかわかりませんが，世界のどこかにはいるだろうということで，今回はこのイライラを解消するアプリをつくりました．

__その名も，AUTOZOOM3!!__

![icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322113/bec72656-a12d-ab12-353c-1c0f145b2813.png)


(↑アプリアイコンです)

# AUTOZOOM3

AUTOZOOM3の機能は非常にシンプルで，「事前に登録しておいたURLの中から，今の曜日の今の時間に入らなければならないミーティングに自動で入れてくれる．」というアプリになっています．

![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322113/92bf6d30-455c-d525-93c4-0b776f9d06df.png)


## 使い方

### URLの登録



![add.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322113/c48ee373-a906-8772-80e5-914fbf89bd5f.gif)


メニューからADD URLを選び，曜日，時刻，登録名，ZOOMのURLを入力してRegisterを押せばOKです！！


**このとき，時間についてはミーティングの開始時刻ではなく，自分が参加したい時刻にしてください**
**授業開始時刻にすると冒頭遅刻します**

> 例えば，ミーティング A が 10:00，ミーティング B が 11:00 で登録されていた場合，10:00-10:59 は A に，11:00-は B に入ります．

なお，登録済みのURLを消したい場合は一覧のdeleteを押すだけで消えます．


### ZOOMへの参加


![join.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1322113/469add1a-823a-0f35-49c1-3abd7c6807f9.gif)


ZOOMに参加したい時は，アプリを起動してJoin the Meetingをクリックするだけで，その曜日その時間に入るべきZOOMに入れてくれます．
（gifがなんかもっさりしていますが，実際はもっとサクサク動きます）

> お気づきの方もいらっしゃるかとは思いますがAUTOZOOMによるJoinはURLを開くだけなので，ZOOM以外にもリンク踏む系のものなら使用できます！！

## 実装と仕様


HTML+CSS+JavsScriptで作ったものをElectronでアプリ化しています．

実装方針は非常に簡単で，現在の曜日と時刻を取得してきて，保存されたURLの中から入るべきURLに飛ばすという形になっています．

その他ポイントになりうる実装・仕様としては，

* URLは，Electron内で動いているChromium上のLocalStorageに保存している
* Join the Meetingは該当URLを直に貼っているので，実は押した時ではなく起動時に入るべきURLを選択する(これは僕自身がアプリを常駐させない派なので問題を感じなかったのですが，常駐させる派からクリック時にしてほしいとの意見があったのでアップデートかけるかもです)
* 既に登録済みの曜日時刻に登録すると上書きしてしまう

あたりだと思われます．

なお，上述の通り登録したURLのデータをローカルファイルに保存するのではなく，Electronのレンダリングに使われているChromiumのLocalStorageを利用しているので，__ファイルアクセス権限を当アプリに与えなくても良い__ というのは個人的に推しポイントです．

また，完全にアプリで完結しているため，**環境構築が不要** であることも売りです．

> https://github.com/Kakeru-Miyazaki/autozoom3/ にソースコードは置いてあります．今後適宜アップデートしていきます．

なお，このアプリ自体「こんなのあったら便利じゃない？笑」くらいのノリで __AUTOZOOMコマンド__ として実装して自分で使っていたもの(初代AUTOZOOM)を友達に配布するためにGUIをつくって(__AUTOZOOM2__)，それをさらに良い感じにしてできたのが __AUTOZOOM3__ なので構想が雑というか作り込みが甘いのはご了承ください



# アプリの配布

https://github.com/Kakeru-Miyazaki/autozoom3/releases/tag/ver2.0.0
にて，本アプリを配布しています！

dmg,exe,debを用意しているので，Mac,Windows,Ubuntu等でお使いいただけます．

拙いアプリですが，気になった方はお試しいただけると嬉しいです！

また，別記事の[【VSCode】Undo/Redoに革命を起こしたい](https://qiita.com/kakekakemiya/items/305123135d09f9e80a4d) も読んでいただけたら幸いです．

最後まで読んでいただきありがとうございました．

kakekakemiya
第15回情報オリンピック 予選 C-Russian Flag

#はじめに
こんにちは。Momijiといいます。
最近競技プログラミングにハマっており、情報オリンピックの問題を解いています。
その解説を備忘録として残していこう！というものです。

[今回の問題](https://atcoder.jp/contests/joi2016yo/tasks/joi2016yo_c)は、タイトルにもある通り、第15回情報オリンピック予選の問題です。

では行ってみましょう！

#問題
1. 古い旗を塗り替えて、上から白→青→赤となるような旗を作る。
2. 塗り替えるマスが一番少なくなる時の塗り替えるマスの数を出力。
端的にいうとこんな感じでしょうか。
例えば、入力例1の場合、

######元の状態
![スクリーンショット 2022-01-08 17.31.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934672/092046f5-f472-59c9-caa4-3244cbfeb86a.png)

######塗り直した後
![スクリーンショット 2022-01-08 17.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934672/b0a3e625-1a7f-1a3b-4dde-395993757740.png)

この時、元の状態から塗り直した後の状態にするためには、11マス塗り替えなければならないので、11を出力します。

#コード
私が提出したコードです。

```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N, M;
    cin >> N >> M;
    vector<vector<char>> s(N, vector<char>(M)); //入力される旗
    vector<vector<char>> l(N, vector<char>(M)); //ロシアの旗になっている旗
    for (int i=0; i<N; i++) {
        for (int j=0; j<M; j++) {
            cin >> s.at(i).at(j);
        }
    }
    int ans=1000000000; //答え
    int count=0; //間違っているマスの数を一時的に保存するもの

    for (int white=1; white<=N-2; white++) {
        for (int blue=1; blue+white<=N-1; blue++) {
            int red = N-white-blue; //①
            count=0;

            //ロシアの旗を作る。(ここから) ②
            for (int i=0; i<white; i++) {
                for (int j=0; j<M; j++) {
                    l.at(i).at(j) = 'W';
                }
            }
            for (int i=white; i<blue+white; i++) {
                for (int j=0; j<M; j++) {
                    l.at(i).at(j) = 'B';
                }
            }
            for (int i=white+blue; i<N; i++) {
                for (int j=0; j<M; j++) {
                    l.at(i).at(j) = 'R';
                }
            }
            //ロシアの旗を作る。(ここまで) ②

            //入力されたものとロシアの旗を比較。 ③
            for (int i=0; i<N; i++) {
                for (int j=0; j<M; j++) {
                    if (s.at(i).at(j) != l.at(i).at(j)) count++;
                }
            }
            ans = min(ans, count);
        }
    }
    cout << ans << endl;
}
```

#解説
この問題の解き方は、
1. 塗り直した後の旗を作る
2. 1と入力された旗で一致していない部分を数える
の2点です。


1. この時、塗り直した後の旗の塗り分けの方法は、
上から、白の行(white)、青の行(blue)、赤の行(N - white - blue)となります。
白に塗る行がwhite行あるとすると、
青の行はwhite+1行目からblue行、
赤の行はwhite+blue+1行目からN-white-blue行それぞれあるということになります。
これをやっているのが、コードの①までです。

次に上のwhite、blue、redの値を使用して、実際にロシアの旗のカラーリングとなる旗を作ります。
それにあたるのがコードで②と書いてあるところです。

2. 続いて、実際にロシアのカラーリングとなっている旗と入力された旗のマス目を比較して、間違っていたら、count++をします。コードでは③と書いてある部分です。
出力しなければならない数字は塗り直すマスが最小となるような数字を出力するので、最後にansとcountを比較して、countの方が小さければ、ansを書き換えます。

#まとめ
初めて競プロについて記事を書くので、至らない点や間違っている点等あると思います。
「ここはこうなんじゃないか？」などあったら、コメントしてくださると嬉しいです。
私は初心者なので、このレベル又はそれ以上がスラスラ解けるレベルになりたいです。

ここまで読んで下さりありがとうございました。
ページごとに別のスタイルシートを読み込みたい

# やりたいこと
ページごとに違うスタイルシートを読み込む。
htmlからPHPにした際に、ヘッダーはheader.phpにまとめたので、動的に読み込むスタイルシートを変更させたい。

* index.php のとき style.css
* mypage.php のとき mypage.css

を読み込むようにする。

# 変数を使ってそれぞれにシート名を代入する
PHPの変数を使って動的に読み込む。

``` header.php
<link rel="stylesheet" href="../css/<?= $css_file ?>.css">
```
``` index.php
<?php
  $css_file = 'style';
  include ('header.php');
?>
<!-- html -->
```
``` mypage.php
<?php
  $css_file = 'mypage';
  include ('header.php');
?>
<!-- html -->
```
これでページごとに違うスタイルシートを読み込むことができた。
Unity で Android の Script Debugging を有効にした際のバイナリサイズ問題について

# 発生する問題

Android でデバッグビルドをする際にバイナリ容量が大きすぎてリンク時にエラーが発生することがあります。

# 解決方法

上記のエラーが発生した場合は BuildSettings の IL2CPP Code Generation を『Faster (smaller) builds』に設定することで解消されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19224/a51a36f3-3bb0-2576-8b9f-ea30c61d4d2e.png)

https://forum.unity.com/threads/il2cpp-build-time-improvements-seeking-feedback.1064135/
空のインラインブロックのベースラインは、マージン領域辺の下端



タイトルのとおりなのですが、うっかりしそうな内容だったので記事にします。

# インラインブロックの下マージンがずれる

きっかけは teratail のこの質問でした。
「インラインブロックの下マージンがずれる」という問題で、なかなか理由がわからなかったのです。

```html
<div class="empty"></div>
<br>
<div>&nbsp;</div>
<br>
<div>&nbsp;</div>
```

```css
div {
  display: inline-block;
  width: 10em;
  height: 1em;
  box-sizing: border-box;
  border: 1px solid;
  margin-bottom: 1em;
}
.empty {
  border-color: red;
}
```

![スクリーンショット 2022-01-08 190128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65745/8f182c29-6a91-c821-2bb8-a8b0f6ee6ebd.png)
![スクリーンショット 2022-01-08 190449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65745/396ae66a-cac7-a288-3f10-2850c5ebdaff.png)

スクリーンショットのとおり、下マージンよりも大きい余白があります。
「改行の問題だろう」と当たりをつけたのですが、そうだとしても空白文字を入れるだけで解消されてしまうのは解せない感じでした。

# ベースラインの問題

改行タグを削除してみたところ、こうなりました。

![スクリーンショット 2022-01-08 190634.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65745/3149fd60-0b52-843d-3a7c-0f27366bc4c4.png)


明らかにベースラインの問題のように見えたのでググったところ、このような仕様が。

> If an atomic inline (such as an **inline-block**, inline-table, or replaced element) does not have a content-derived baseline set in the inline axis of the inline formatting context in which it participates, then the UA must synthesize its baselines as follows in order to align it.
> 
> These baselines are assumed to be at **its line-under margin edge**:
[A.3: Synthesizing Baselines for Atomic Inlines | CSS Inline Layout Module Level 3](https://www.w3.org/TR/css-inline-3/#baseline-synthesis-box)

ということで、空のインラインブロックや画像でマージンの下端に揃ってしまう現象が起きるということでした。
件の質問は`<br>`が入っていたため、そのベースラインがマージン下端に揃って下がってしまい行ボックスが大きくなったため、その分だけ下に余白ができた、ということのようです。

---

なお、画像で試したところ問題が再現したのですが、空の`<input>`では再現しませんでした。
その理由はまだわかっていないです。
NVIDIA Jetson TX2 NXの環境立ち上げ(Seeed A203 Carrier Boardと共に)

## はじめに

2020年春から、Jetson Nano開発者キットを使用して来ましたが、今回、同じくNVIDIAのJetsonシリーズで、その上位版と言えるJetson TX2 NX moduleを購入して環境を立ち上げました。

![16410367436573509646357718704067.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998321/28ec109c-8136-47f6-9907-2df025ef3262.jpeg)

使用しているキャリーボードは、[Seeed社製のA203(Version 2)](https://www.seeedstudio.com/A203-Carrier-Board-for-Jetson-Nano-Xavier-NX-V2-p-5214.html)。

使用している放熱板は[これ](https://amzn.to/3JRSz9j)。

シリアルコンソール用のUART-USBコンバータは[これ](https://amzn.to/330pyaH)。

ちなみに、microSDは、A203のSDスロットに刺してみてはいるが、まだ検知に成功していない。

## 初期セットアップ

基本的に、[「Jetson Nanoのクロスビルド環境の構築」](https://qiita.com/MakotoA67/items/7a31d45289315b66476d)にて説明している方法で、TX2 NX moduleもセットアップできた。

## 初めてのブートとセットアップ

日本語環境のセットアップに関しては、[「Jetson Xavier NXの使い始め(初期セットアップ....」](https://qiita.com/MakotoA67/items/e8643886c73459e5eb63)にて紹介しているので、何かひっかかってしまった人は参考になるかも。

また、ホストPC側でのセットアップ時に、tools/l4t_create_default_user.shを使うことで、デフォルトのユーザの登録が事前にできるが、結局、日本語環境などの初期のセットアップは必要かと思うので、デフォルトユーザだけ事前に設定できてもあまり面白くないかも。

## システムのバックアップやリカバリについて

今まで、NanoやXavier NXの開発者キットで開発作業をしている場合は、SDカードのイメージを時々フルバックアップしておくことで、不慮の事故などに対応していたが、ModuleでeMMCにシステムを構築している場合は、ホストPC経由でのバックアップやリカバリの環境を確認しておく必要がある。

バックアップを取りたい場合は以下の通り。

```
$ sudo ./flash.sh -r -k APP -G jetson_tx2nx_emmc_image.img jetson-xavier-nx-devkit-tx2-nx mmcblk0p1
```

flash.shスクリプトの-Gオプションがポイント。

不慮の事故などで、バックアップ時点からやり直したい場合は、前記の方法でバックアップしておいたシステムイメージを書き込んでリカバリする。

```
$ cp jetson_tx2nx_emmc_image.img bootloader/system.img
$ sudo ./flash.sh -r -k APP jetson-xavier-nx-devkit-tx2-nx mmcblk0p1
```

## おわりに

今回は、Jetson TX2 NX moduleをSeeed社製キャリーボードA203v2に搭載してセットアップして、システムのバックアップやリカバリの方法を確認した、というところまでの記事になりました。

長い間使用して来た[Jetson Nano開発者キット(元々は12000円ぐらいで買えていたものが、今、見たら30000円になってます)](https://amzn.to/3t7576J)と同等の動作ができることまでは確認してあり、パフォーマンス的な確認はこれからです。

おまけ情報ですが、今回、moduleをターゲットにするということで、やはり、Ubuntu PCを活用したいということで、それ用に一台、[ミニPC(Beelink-U59)](https://amzn.to/3zDgvZk)を買って使用しています。結構気に入ったのでここで紹介しておきます。
【Kotlin】BottomNavBarがせりあがってくる時の対処法【Android】

#ことの発端
卒業研究用に作成していたアプリでとある問題が発生。
別Fragmentから移行してきた後に、ソフトキーボードで入力を行うと、
何故だか知らないが、ソフトキーボードと一緒にBottomNavBarがせりあがってきてしまう・・・😭

![スクリーンショット 2022-01-08 18.54.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433454/2964d13a-cab8-0ced-a796-d06de9e72941.png)

#解決方法
調べ方が悪いのでしょうけど、自力じゃ解決できなかったのでTwitterで現役エンジニア様に相談したところ、
ものの数分で解決・・・　しゅごい🥺


Androidmanifestの該当Activityに、

```
android:windowSoftInputMode = "abjectNothing"
```
これだけ。


浮き上がらなくなったね！！　やったぁ！！！
![スクリーンショット 2022-01-08 19.03.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433454/8ee1e49b-3561-f27d-498f-03743b4449ec.png)
deoplete.nvim から ddc.vim に乗り換えてみた。

# はじめに
nvimを使い始めて一年ほど、deoplete の後継プラグインが出たということで、さっそく試してみた。

## ddc.vim とは
暗黒美夢王ことShougoさんが作成した vim, neovim の自動補完プラグイン。
deoplete.nvim の後継でneovim, vim 両対応、Python非依存、処理の高速化などの改良がされた。

>新世代の自動補完プラグイン ddc.vim (https://zenn.dev/shougo/articles/ddc-vim-beta)

## 実行環境
- Ubuntu 20.04.3 LTS (WSL2)
    - shell: zsh 5.8
- Neovim v.0.6.1
    - プラグイン管理：vim-plug

# 手順
## deopleteの無効化
便宜上コメントアウト

``` vim:init.vim
call plug#begin('~/.local/share/nvim/plugged')
  "Plug 'shougo deoplete.nvim'
call plug#end()
"let g:deoplete#enable_at_startup = 1
```
```
:PlugClean
```
## 依存関係
#### denoのインストール
ddc は[Deno](https://github.com/denoland/deno) と呼ばれるNodeJSに似た言語の環境が必要。
Ubuntu以外の環境 → [denoland/deno_install](https://github.com/denoland/deno_install)

``` 
apt install unzip -y
curl -fssL https://deno.land/install.sh | sh
```
`Error: unzip is required to install Deno`のようなエラーが出たら
`apt install unzip -y`でunzip をインストールする

```zsh:.zshrc
export DENO_INSTALL="/home/$USER/.deno"
export PATH="$DENO_INSTALL/bin:$PATH"
```
シェルがbashならbashrc

```
source ~/.zshrc
deno -V
```

#### nvim のアップデート
ddc はneovim のv0.5以上が必要。
記事執筆時点では通常の`apt install`ではそれに満たなかったため、PPTを用いた。
https://github.com/neovim/neovim/wiki/Installing-Neovim#ubuntu

```
sudo add-apt-repository ppa:neovim-ppa/stable
sudo apt update
sudo apt update neovim
nvim -v
>> NVIM v0.6.1
```

## ddcと関係するプラグインの導入
README に従って、source や filter などの設定を書き込む
これでとりあえず動く。キーバインドなどは省略。
[Shougo/ddc.vim](https://github.com/Shougo/ddc.vim)

``` vim:init.vim
call plug#begin('~/.local/share/nvim/plugged')
  Plug 'Shougo/ddc.vim'
  Plug 'vim-denops/denops.vim'
  Plug 'Shougo/ddc-around' " sources
  Plug 'Shougo/ddc-matcher_head' " filters
  Plug 'Shougo/ddc-sorter_rank' " filters
call plug#end()

" Use around source.
call ddc#custom#patch_global('sources', ['around'])

" Use matcher_head and sorter_rank.
call ddc#custom#patch_global('sourceOptions', {
      \ '_': {
      \   'matchers': ['matcher_head'],
      \   'sorters': ['sorter_rank']},
      \ })
" Use ddc
call ddc#enable()
```

## LSPの導入
neovim のv0.5 以降にはLSPクライアントが入っているのでそれを使ってみる。
ddc-nvim-lsp のREADME に従って設定を記述した。
[Shougo/ddc-nvim-lsp](https://github.com/Shougo/ddc-nvim-lsp)

```vim:init.vim
call plug#begin('~/.local/share/nvim/plugged')
  "Plug 'lighttiger2505/deoplete-vim-lsp'
  "Plug 'prabirshrestha/vim-lsp'
  "Plug 'mattn/vim-lsp-settings'
  Plug 'neovim/nvim-lspconfig'
  Plug 'Shougo/ddc-nvim-lsp'
call plug#end()
call ddc#custom#patch_global('sources', ['nvim-lsp'])
call ddc#custom#patch_global('sourceOptions', {
      \ '_': { 'matchers': ['matcher_head'] },
      \ 'nvim-lsp': {
      \   'mark': 'lsp',
      \   'forceCompletionPattern': '\.\w*|:\w*|->\w*' },
      \ })
```
以前はvim-lsp を使用していたため、適宜無効化しておく。
vim-lsp が nvim-lsp(builtin)、nvim-lspconfig が vim-lsp-settings に相当するのかな
language server を使用するには別途記述が必要。nvim-lspconfig のREADMEを参照。
[neovim/nvim-lspconfig](https://github.com/neovim/nvim-lspconfig)
# 終わりに
deoplete の時と遜色なく動く。python 非依存なので再構築の時楽になると思う。（pyenv-virtualenvとか使ってた人）
こんにちは！Quita始めました！

## 目次
1. [著者の経歴](#著者の経歴)
1. [なぜQuitaを書こうと思ったのか](#なぜquitaを書こうと思ったのか)
1. [エンジニアを初めた時のステータス](#エンジニアを初めた時のステータス)
1. [現在のステータス](#現在のステータス)
1. [何について書くか](#何について書くか)

## 著者の経歴
1. 早慶(早か慶かは伏せる)の商学部を卒業後、大手飲食チェーンの運営会社に総合職として就職。(なぜかこの自己紹介は毎回ツッコまれる。。世の中いろいろあんねん。)
1. その後、半年で退職し、熱意をもって臨める仕事を探す。しかし、本番に弱いメンタリティから、数多のお祈りメールをいただく。（学歴フィルターを帳消しにしても足りないくらいには、本番に弱いです。）
1. エンジニアをやりたいという気持ちはあったため、なんとかSESの下請け企業に就職する。
1. その後、平均して4次受けくらいの商流で、基本設計～結合テストあたりの工程で何回かプロジェクトに参画（商流を考えればかなり運がいい。ありがとう、弊社！！）。<br>
現場の都合で、15人くらいの実装リーダーを任されたもある(炎上案件だったが、奇跡的な強運！！この運のパラメータ、面接力に割り振りたいんだが。。)

## なぜQuitaを書こうと思ったのか
僕のようになんらかの理由により、就活で上手くいかなかった人のために道を作りたいと思ったのがきっかけです。（だいぶおこがましいですが）

## エンジニア始める前のステータス
- 数学力：
数ⅡＢまでならある程度できるが、ガチ文系の人でもちょっと勉強すれば追いつけるレベル。（実際、大学受験したときの数学力はこの時すでになかった。。）
- プログラミングスキル：
ド素人。
- ITについての知識：
Excelの関数の扱いが怪しいレベル。または、OSと言われて具体例が思いつかないレベル（技術職以外のサラリーマン以下）。
- コミュニケーション力(チームで仕事していく的な意味合いでの力）：
これだけは、そこそこありました。一応、大学時代とかもサークルで幹部やったりしていたので。
- 英語力：
TOEIC690とか（今はわかりませんが）
- 本番への強さ：
初期のキャタピーレベル。（ポケモン知らない人、ごめんなさい）
- どんぶりを洗う速さ：
玄人（今のところ役に立っていない）

## 現在のステータス
- 3か月ほど15人くらいの実装リーダー経験あり。
- フロントエンドとバックエンド両方の実務経験あり。
- 基本設計～結合テストくらいまでの経験あり。
- Javaの実務経験が長いが、プライベートはPythonで書いている。
- AtCoderでRate768(https://kenkoooo.com/atcoder/#/user/DoubleM?userPageTab=Achievement)
- 機械学習も多少わかる(CourseraのMachine Learningコースは終わらせたし、Kaggleも何回か提出したことがあるくらい)
- 応用情報技術者試験に合格している。
- AWSで12冠を目指している（なお、まだ0冠）

## 何について書くか
- はじめてのエンジニア、どんな企業がいいか
- エンジニアの初期キャリアでやるべき（と思っている）こと
- 競技プログラミングのすすめ
- クラウドのすすめ
【Laravel-Mix】npm run productionしたらエラーが出た時の苦し紛れの解決方法

###npm run productionしたらエラーが出た

```powershell:Terminal
npm run production
```

##前提
Laravel 8.4
webpack-cli 4.9
Laravel-mix 5.1

Laravel-uiのLaravel-mixを使いたかった。

```package.json
    "scripts": {
        "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
    }
```

#苦し紛れの解決方法
###そうだ、Laravel-mixを最新にしよう
```bash:Terminal
npm install laravel-mix@latest
```

私の環境ではうまくいきました。

```nodejs:Terminal
   npm run production

   Laravel Mix v6.0.39   
✔ Compiled Successfully in 10197ms
```

ちなみに[公式Doc](https://laravel-mix.com/docs/6.0/upgrade#update-your-npm-scripts)によるとlaravel-mixバージョン6以上の場合、

```package.json
"scripts": {
    "development": "mix",
    "watch": "mix watch",
    "watch-poll": "mix watch -- --watch-options-poll=1000",
    "hot": "mix watch --hot",
    "production": "mix --production"
}
```
scriptsがこんなに綺麗になる。エラーも出ない。すごい(小並感)

##以下、解決するまで試したこと
###エラー文1
```powershell:Terminal
[webpack-cli] Error: Unknown option '--no-progress'
[webpack-cli] Run 'webpack --help' to see available commands and options
```
⇒ package.jsonのscriptsから --no-progressを削除し、再実行

###エラー文2
```powershell:Terminal
[webpack-cli] Error: Unknown option '--hide-modules'
[webpack-cli] Run 'webpack --help' to see available commands and options
```
⇒ package.jsonのscriptsから --hide-modulesを削除し、再実行

###--no-progressと--hide-modulesを消したscripts
```package.json
    "scripts": {
        "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --config=node_modules/laravel-mix/setup/webpack.config.js"
    }
```

##エラー文3
```powershell:Terminal
[webpack-cli] Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema.
 - configuration.module.rules[10] has an unknown property 'loaders'.
```
⇒ webpack.config.jsを確認したところ、'loaders'プロパティが見当たらない。

### npm-moduleを削除し、npm installする
```powershell:Terminal
rm node_modules
```
```powershell:Terminal
npm install
```
その後も再びエラー文3が出る。


##おわり
バージョンの選択はやはり塩梅が難しい。
備忘録~詰まってしまった繰り返し処理においての疑問点


```
<?php
$scores = [];

do{
    echo '点数を入力 >';
    $score = (int)trim(fgets(STDIN));
    if ($score === -1){
        break;
    }

    $scores[] = $score;
    $sum = 0;
    for ($i = 0; $i < count($scores); $i++) {
        echo $i + 1 . ':' . $scores[$i] . PHP_EOL;

        $sum += $scores[$i];
    }
    echo '合計：' . $sum . PHP_EOL;

} while(true);

/*
80=>
点数を入力 >80
1:80
合計：80

80=>
1:80
2:80
合計：160
点数を入力 >
*/

```
上コードは入力した値とその合計を出力する。

```
<?php
$scores = [];
$sum = 0;
do{
    echo '点数を入力 >';
    $score = (int)trim(fgets(STDIN));
    if ($score === -1){
        break;
    }

    $scores[] = $score;
    for ($i = 0; $i < count($scores); $i++) {
        echo $i + 1 . ':' . $scores[$i] . PHP_EOL;

        $sum += $scores[$i];
    }
    echo '合計：' . $sum . PHP_EOL;

} while(true);

/*
80=>
点数を入力 >80
1:80
合計：80

80=>
1:80
2:80
合計：２４０
点数を入力 >
*/

```
$sum = 0;の場所を変えるとうまく動作しなくなった。
=>
scoresには今まで入力した値が格納されており、合計(sum)はscoresの配列の値を足し合わせている。
つまり、sumは繰り返し処理の際に毎回０にしないと値が重複してしまう。
※①80を入力
scores =[80];
合計：80
②80を入力
scores =[80,80];
合計：80（前に残った値）＋80+80=240

へんに詰まってしまった...
Scratchの作品をサイトに埋め込む方法

#Scratchの作品をサイトに埋め込む方法
##①作品ページに行き、「リンクをコピー」ボタンを押す
<img width="500" alt="1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2468028/70d3ccdf-5389-5de2-683b-62b92b72f9cc.png">
<img width="500" alt="2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2468028/c2fadfa7-b6f1-ef95-2da0-c269d667cf3a.png">
##②「埋め込みコードをコピー」をクリック
![Screenshot 2022-01-08 at 18-21-57 Scratch - まわる星.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2468028/563fe4d0-b383-1729-5b8c-27978d2c4d0e.png)
##③HTMLの中に書く
```html
<body>
    <iframe
      src="https://scratch.mit.edu/projects/568126788/embed"
      allowtransparency="true"
      width="485"
      height="402"
      frameborder="0"
      scrolling="no"
      allowfullscreen
    ></iframe>
  </body>
```
##④完了
こんな感じに表示されます
<img width="300" alt="2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2468028/4ce4c2de-deb9-7a1e-d96a-a8a832438fb3.png"><img width="300" alt="2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2468028/9fa0a845-5fed-c9b6-708b-53267428bfcd.png">
Scratchのマークをクリックすると、Scratchのトップページを開けます。
bcryptとbcrypt-rubyについて調べてみた

先日『暗号技術入門』を読みました。この過程で、アプリケーション開発で使用機会の多いbcryptについて気になり、調べてみました。
本記事では、bcryptを仕事で使う際に知っておいたほうが良さそうなことをまとめます。

## 環境

bcryptの挙動を説明するためにbcrypt-rubyを利用しています。
記事執筆時点で最新のv3.1.16を対象としています。

## bcryptとは

bcryptは**一方向ハッシュ関数**のアルゴリズムの1つであり、(パスワードなどの)データからハッシュ値を算出します。
bcryptの特徴として、ハッシュ値から元のデータを逆算されづらくするために、**ソルト**と**コスト**があります。
一方向ハッシュ関数とソルト、コストについては後述します。

ちなみに、「パスワードをハッシュ化する」という表現をよく見かけますが、これは「ハッシュ関数を用いてパスワードからハッシュ値を得る」と同義です。また、ハッシュ値は「ダイジェスト」と表現することもあります。[Rails Tutorial]([https://railstutorial.jp/](https://railstutorial.jp/))では、この表現でしたね。

余談が長くなりましたが、bcrypt-rubyでは、このようにハッシュ値を計算できます。

```bash
BCrypt::Password.create('password')
# => "$2a$12$0jExrhEvd3zt6Me6OOj7xu7lysiIvPgixN1zExHgN6It.W4d4y/7C"
```

## 一方向ハッシュ関数とは

一方向ハッシュ関数とは、データからハッシュ値を計算することは出来るものの、ハッシュ値からデータに逆算ことはできない関数です。この逆算できない性質を、**一方向性**と呼びます。
ハッシュ値からデータに逆算ことができないため、パスワードが正しいかを判定するには、ハッシュ値同士で比較します。

```bash
hash = BCrypt::Password.create('password')
# => "$2a$12$smCjRIHIJt4yL1ZGPx2Xg.O0zVnDVXuR05Fz54T0bYlaEIlgor15K"
hash == 'password'
# => true
```

上記では、文字列同士を比較しているように見えますが、これはStringクラスを継承したBCrypt::Passwordクラスが、`==`をオーバーライドしているためです。実装は、引数のsecretからハッシュ値を計算し、親クラスの`String#==`を呼び出しています。

```ruby
# https://github.com/bcrypt-ruby/bcrypt-ruby/blob/master/lib/bcrypt/password.rb
module BCrypt
  # something...
  class Password < String
    def ==(secret)
      super(BCrypt::Engine.hash_secret(secret, @salt))
    end
  end
end
```

## レインボーテーブル攻撃とは
ソルトについて説明する前に、ソルトの理解に欠かせないレインボーテーブル攻撃について説明します。
レインボーテーブル攻撃は、事前に、膨大な数のパスワード候補の平文とそのハッシュ値をデータベースに保存しておき、ハッシュ値からパスワードの平分を取得する攻撃のことです。

## ソルトとは

ソルトは、乱数であり、レインボーテーブル攻撃の対策のために必要です。
bcryptはソルトと平文を入力に取り、ハッシュ値を算出します。
ソルトを加えたデータのハッシュ値を計算することにより、このハッシュ値からデータを逆算するためには、ソルトのビット長だけ必要なデータ量は増えることとなり、レインボーテーブル攻撃に有効となるわけです。
bcryptでは、ハッシュ値の中にソルトが含まれていることを確認できます。

```ruby
hash = BCrypt::Password.create("password")
=> "$2a$12$9Plx9x2SgweSioLq9UInwe6mrIuGzi0QzoZyVP46WDo45ata5ITLi"
pry(main)> hash.salt
=> "$2a$12$9Plx9x2SgweSioLq9UInwe"
```

bcrypt-rubyでは、Bcrypt::Passwordクラスにsaltメソッドが定義されています。
saltはソルトに加えて、バージョンとコストを含めて返します。
(上記の場合は、バージョンが、`2a`、コストが`12`、ソルトが`UPUKgRo8aH/NfJ87TwJMJe`)

## ストレッチングとコストとは

次に、ストレッチングについて説明します。
ストレッチングは、ハッシュ値への計算を繰り返し行うことです。ハッシュ関数によって出力されたハッシュ値を再度ハッシュ関数の入力にしてハッシュ値を得る、というサイクルを繰り返すわけです。

ストレッチングによって、ハッシュ値から平文を逆算するのに必要な計算時間が増え、ハッシュ値からデータを逆算されずらくなります。

このストレッチングの回数を**コスト**と呼びます。コストを増やすほどハッシュ化が遅くなりパフォーマンスは悪くなりますが、ハッシュ値から逆算される時間も遅くなります。

bcrypt-rubyのデフォルトのコストは12です。

```ruby
BCrypt::Engine.cost
# => 12
```

## 参考

- https://github.com/bcrypt-ruby/bcrypt-ruby
- [Hashing in Action: Understanding bcrypt](https://auth0.com/blog/hashing-in-action-understanding-bcrypt/)
- [『暗号技術入門 第3版』](https://www.sbcr.jp/product/4797382228/)
（備忘録）初学者からLaravelで開発できるまでの要点まとめ

<h1>まずは軽くLaravel内でのクラス、メソッド、プロパティの書き方をおさらい</h1>

クラスが持つ「変数」を「プロパティ」と呼びます。
クラスが持つ「関数」を「メソッド」と呼びます。


プロパティはpublic、private、protected (アクセス修飾子)で定義します。


クラス内でプロパティやメソッドを参照するときは、$this という変数を使います。

このときプロパティ名に$（ダラー）はつけません。

×　$this->$number1　　　〇　$this->number1


<h2>クラス（設計図）からインスタンス（newで定義）を作成。</h2>
インスタンス内のプロパティやメソッドにアクセスするには、オブジェクトに対して -> （アロー演算子）を使用します。
$math = new Math; //クラス（Math）からインスタンスを作成。


※ 作成したインスタンス($math)は、クラスで定義したプロパティ($number1,$number2)とメソッド( add(),minus() )を持ちます。
$result1 = $math->add();　//メソッドにアクセス


<h3>静的プロパティ・メソッド</h3>
staticキーワードを指定することで静的なプロパティ、メソッドが定義できるようになります。（動的もある。新しく作られるものなどは動的。）

*静的なプロパティ、メソッドを定義するとインスタンスを生成せずに直接プロパティ、メソッドを呼び出すことができます。*
例）※）::（スコープ演算子）

class Message {
  //メソッドを定義
  static function hello() {
    return "こんにちは";
  }
  static function bye() {
    return "さようなら";
  }
} //この時点では設計図（クラスのみ）
 
//Messageクラスのメソッドを直接呼び出す。（まだインスタンス化していない。）
$message1 = Message::hello();
<br>
$message2 = Message::bye();

//スコープ演算子のみで呼び出せる。


<h2>大切なルーティングは大体route/web.phpに書いてある。</h2>

routes/web.phpファイルは、Webインターフェイス用のルートを定義する。

<a href="https://readouble.com/laravel/8.x/ja/routing.html">laravel公式ルーティング参照</a>

セッション状態やCSRF保護などの機能を提供するwebミドルウェアグループが割り当てられ、ほとんどのアプリケーションはroute/web.phpでルートを定義する所から始める。
[java]標準入力とif文で簡単なプログラムを作ってみた。

アウトプット用!!
今回は標準入力と条件式で簡単なプログラムを作ろう！とのことでさっそくやっていく。

まず今回のプログラムの流れ
①キーボードで好きな沖縄料理を入力する。
②条件式を用いて入力した文字と条件が一致したらtrueになって沖縄料理が食べられる。もし沖縄料理じゃないとfalseになり沖縄料理ではないよ!と表示される。

```okinawa.java
import java.util.Scanner;


public class Okinawa {

	public static void main(String[] args) {
		
		
		System.out.println("------------------");
        System.out.println("沖縄料理を食べよう!!");
        System.out.println("何を食べたいですか？");
        System.out.println("------------------");
        
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
      
        
        if(str.equals("沖縄そば")) {
        	System.out.println("浜家で" + str + "を食べました。");
        } else if(str.equals("タコライス")) {
        	System.out.println("キンタコで" + str + "を食べました。" );
        } else if(str.equals("ステーキ")) {
        	System.out.println("やっぱりステーキで" + str + "を食べました");
        } else {
        	System.out.println("沖縄料理ではないよ！");
        }
 

```

```コンソール.java
------------------
沖縄料理を食べよう!!
何を食べたいですか？
------------------
沖縄そば
浜家で沖縄そばを食べました。

*沖縄そばと入力した場合、濱家で沖縄そばを食べましたと表示される。
```

#①キーボードからの入力を取得するためにScannerクラスを用意する。
・import java.util.Scannerを記述する。
・Scannerクラスのインスタンスを作成。コンストラクタの引数にSystem.inを指定する。これはキーボード入力から値を取得する。next() メソッドでキーボードからの入力待ちとなります。

#②条件式で入力された値と条件を比較する
equlasメソッドは文字列の比較。
例えば沖縄そばとキーボードで入力したらはじめの条件式１と比較され、一致した場合trueを返し浜家で沖縄そばを食べました。となります

以上です。

おつかれさまでした！

これからも楽しみながらプログラミングがんばります。
Colab×SpreadSheet

##1.はじめに

はじめまして、社会人1年目のyappiです。 
以前、形態素解析について投稿しまして、データの蓄積もしたいな～と思い、今回はGoogle SpreadSheetに格納してみました。連携方法や値の格納について備忘録としてまとめおきます。

##2.連結
まずは、Colabの方でSpreadSheetとの連結をしていきます。

```python
#　必要なライブラリをインポート
from google.colab import auth
from oauth2client.client import GoogleCredenstials
import gspread

#　認証処理
auth.authenticate_user()
gc = gspread.authorize(GoogleCredentials.get_application_
```

##3.シートの作成
以前投稿したときに、スクレイピングして、形態素解析したものをcsvファイルにしたいと考えていました。改良していく中で、それよりもSpreadSheetに書き込んだ方が良くない？と思い...。
今回は、1日1回ニュースを取り込んでみようと考えました。日付ごとにシートを分け、そのシート内にデータを格納していきます。
そのため、シート名に日付をいれて新規シートを作成することで、全て自動でシートの作成とデータの格納をすることができます。

```python
#日付を取得する
import datetime
dt = datetime.date.today()

#記録するファイルに入る
sheet = gc.open_by_key(' Google SpreadSheetのID ')
#日付をシート名に指定して作成
#もちろんですが、title・rows・colsは自由にできます。
worksheet = sheet.add_worksheet(title = f'googleNews_{dt}', rows=10, cols=10)
```

これで日にちごとのシートを作成することができました。

##4.値の格納
格納の構造がいまいちイメージができませんでした。 
今回は、改良するにあたって1次元と2次元配列の格納を試してみたので、その結果を載せておきます。 
※Mapでも試してみたんですが、わかりませんでした汗

```python
#1次元配列
#datas = ['A1に追加', 'B1に追加', 'C1に追加']
#datas→複数　　　datum→単数（@shiracamus さんにご教示いただきました。）
datum = ['A1に追加', 'B1に追加', 'C1に追加']
worksheet.append_row(datas)
```

![スクリーンショット 2022-01-08 午後17.45.41 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746815/4918c6cd-bf1a-5631-340f-efe812fcf233.png)

```python
#2次元配列
datas = [['A1に追加', 'B1に追加', 'C1に追加'],
          ['A2に追加', 'B2に追加', 'C2に追加']
         ]
for temp in datas:
  worksheet.append_row(temp)
```
![スクリーンショット 2022-01-08 午後17.48.03 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/746815/c4d99094-5712-2bb4-f18e-b70b7b957509.png)

今回の改良版では、2次元配列を採用しました！

```python
#形態素解析前の単語と形態素解析後の単語を分けて格納する。
#単語羅列するとわかりにくいので、ここでは前が数字、後が英字だと思ってください
datas = [['1', '2', '3']
 ['A', 'B', 'C']]
#2次元配列を格納していきます。
for temp in datas:
  worksheet.append_row(temp)
```

これで、列ごとに格納したいデータを分けて格納することができます。 

##終わりに
次回の記事では、1週間分のGoogleNewsを取得して、どのような単語が多いのか、1週間のトレンドは何かなどを分析した記事をあげていこうと思います。
PostmanでEnvironmentsを利用して接続先機器ごとにパラメータを切り替える

最近CML2で稼働しているネットワーク機器に対してRestconfで情報取得や設定変更などを試しています。
その際にPostmanというツールを使っているのですが、複数機器に同一の処理を行う場合にEnvironmentsを使って接続先の機器ごとにパラメータを切り替える方法をご紹介します。
※EnvitonmentsはAPI実行時に環境変数を利用する機能です。

今回はネットワーク機器の設定保存を行うPOSTリクエストを例に説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449711/d880c46f-5281-3a6a-86fa-5601dcc80da8.png)

上の画像で波括弧で囲っている {{host}} などがEnvironmentsの変数を参照している箇所です。
また今回リクエスト実行時に利用されるEnvironmentsは右上の赤丸で囲っている箇所から選択します。
今回は"testRT"というEnvironmentを選択しています。

次にEnvironmentsの中身を見てみます。
Environmentsへは画面左のメニューから移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449711/4f6313b7-fc5e-e2e8-f494-f152e8580a07.png)

こんな感じで接続先の機器ごとに、

* ユーザ名
* パスワード
* ホスト名(IPアドレス)
* ポート番号

などを登録しておけば十分だと思います。

試しにPOSTリクエストを投げて、設定保存を行ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449711/395e7761-0555-f8af-b2f2-79d0acbea835.png)

"Save running-config successful"と返ってきたので、無事に実行されたようです。

知っている方からすればなんてこともない話ですが、まだ使ったことがないという方は是非試してみてください。
【Rails】ポートフォリオ制作「バイク専用SNS」KoKo-iiYo

#【Rails】ポートフォリオ制作「バイク専用SNS」KoKo-iiYo

##はじめに

DMM WEB CAMP通学中、３ヶ月目に制作したポートフォリオについて、サイト概要・実装機能などまとめます。
ruby で C extension を使用する方法を最初に調べた際のメモ

2022.1 に書いたメモが出てきたのでpublishしておく。

---

これわかりやすい。[iStasts](https://github.com/Chris911/iStats)の作者が、そのgemを例に出して説明してくれている。

http://chris911.github.io/blog/2014/08/10/writing-a-ruby-gem-with-c-extension/

> **C code and Makefile**
> As mentioned previously, the C code is located under the ext directory. Each C module should have its own subdirectory in there. Note that this directory also contains another important file named extconf.rb. The content of this file is executed when installing the gem to generate a Makefile that will be used to compile the C extension. Here’s a basic example:



https://www.rubyguides.com/2018/03/write-ruby-c-extension/

に従って、 https://github.com/kudojp/ruby-c-extension-experimental で実際にc-extensionをrubyから動かした。非常にシンプル！
PinpointのWebSphere PluginをOpenLibertyに対応する

WebSphere PluginをOpenLibertyにデプロイして、うまく動かないことが分かりました。
Githubコミュニティに見た感じに、現時点にOpenLibertyの動作にまだ対応されていないです。
本文には、対応できる方法を説明します。


１）libertyのbootstrap.propertiesに以下の設定を追加する
org.osgi.framework.bootdelegation=com.navercorp.pinpoint.bootstrap.*,com.navercorp.pinpoint.common.*,com.navercorp.pinpoint.exception.*,com.navercorp.pinpoint.profiler.*

２）WebspherePlugin.java
①#addWSWebContainer()に以下のように変更する
transformTemplate.transform("com.ibm.ws.webcontainer.WSWebContainer", WSWebContainerTransform.class);
⇒
transformTemplate.transform("com.ibm.ws.webcontainer.WebContainer", WSWebContainerTransform.class);
②WSWebContainerTransform#doInTransform()に以下のように変更
target.getDeclaredMethod("handleRequest","com.ibm.websphere.servlet.request.IRequest", "com.ibm.websphere.servlet.response.IResponse","com.ibm.ws.webcontainer.VirtualHost", "com.ibm.wsspi.webcontainer.RequestProcessor");

３）WebsphereDetector.javaの変更
DEFAULT_EXPECTED_MAIN_CLASSの定数値を以下のように変更する
private static final String DEFAULT_EXPECTED_MAIN_CLASS = "com.ibm.ws.kernel.boot.cmdline.EnvCheck";

４）java-ibmフォルダに以下のクラスを作成する
①com.ibm.websphere.servlet.response.StoredResponse.java
	public IResponse getIResponse() {
		return null;
	}
	public int getStatusCode() {
		return 0;
	}
②com.ibm.ws.webcontainer.VirtualHost.java
//dummy
③com.ibm.wsspi.webcontainer.RequestProcessor.java　※インタフェース
public void handleRequest(ServletRequest req, ServletResponse res) throws Exception;



動かしてみた結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189310/8764fd18-9847-721c-37bd-38cb6125681e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189310/761794f1-4cc9-17e3-4e15-ceb998f734b9.png)
re:Invent 2021 サーバレス関連の新サービス、アップデートまとめ

re:Invent2021で発表されたサーバレス関連サービスのアップデートをまとめてみました。

1/8 20:00 から [JAWS-UG横浜 #40 AWS re:Invent 2021 Recap Serverless](https://jawsug-yokohama.connpass.com/event/233901/) でこのあたりをキャッチアップしますので是非ご参加ください！

## AWS Amplify Studio
https://aws.amazon.com/jp/blogs/news/aws-amplify-studio-figma-to-fullstack-react-app-with-minimal-programming/

 - Amplifyの強力なバックエンドとの統合・管理機能を持ち、最小限のコーディングでUI開発を加速
 - Figmaで作成されたデザインを人間が読めるReactのコンポーネントコードに自動的に変換
 - 開発者が生成されたコンポーネントをアプリのバックエンドデータに視覚的に接続可能

## Amazon Redshift Serverless
https://aws.amazon.com/jp/blogs/news/introducing-amazon-redshift-serverless-run-analytics-at-any-scale-without-having-to-manage-infrastructure/

 - クラスターのセットアップや管理は不要
 - データのクエリやロード中など、データウェアハウスの使用中は秒単位で課金
 - データウェアハウスがアイドル状態の場合は課金なし
 - 開始時に適切なコンピューティングリソースを自動的にプロビジョニングします
 - 同時ユーザー数が増え、新しいワークロードが増えるにつれ、データウェアハウスはシームレスかつ自動的に拡張し、変化に適応します
 - オプションで、基本データウェアハウスのサイズを指定して、コストとアプリケーション固有の SLA をさらに細かく制御可能

## Amazon EMR Serverless
https://aws.amazon.com/jp/about-aws/whats-new/2021/11/amazon-emr-serverless-preview/

 - Apache Spark、Apache Hive、Presto などのオープンソース分析フレームワークを使用して構築されたアプリケーションを数回のクリックだけで実行
 - クラスターを構成、最適化、または保護する必要なし
 - アプリケーションに必要なコンピューティングリソースとメモリリソースを自動的にプロビジョニングしてスケーリング
 - 使用したリソースに対してのみ課金

## Amazon MSK Serverless
https://aws.amazon.com/jp/about-aws/whats-new/2021/11/amazon-msk-serverless-public-preview/

 - コンピューティングリソースとストレージリソースを自動的にプロビジョニングおよびスケーリング
 - AWS PrivateLink とのプライベート接続
 - AWS Identity and Access Management (IAM) による安全なクライアントアクセス
 - AWS Glue Schema Registry によるスキーマ進化制御
 - クラスターごとに 1 時間あたりの料金を支払い
 - 作成するパーティションごとに 1 時間あたりの料金を支払い
 - データスループットとストレージの GB ごとに支払い

## Amazon Kinesis Data Streams On-Demand
https://aws.amazon.com/jp/blogs/news/amazon-kinesis-data-streams-on-demand-stream-data-at-scale-without-managing-capacity/

 - ストリーミングデータ用のキャパシティーのプロビジョニングと管理が不要
 - データトラフィックの変化に応じてキャパシティーが自動的にスケーリング
 - ストリームへの書き込み、読み取り、保存を行うデータの 1 ギガバイトあたりの料金は、スループットごとに課金

## AWS Lambda support for Event Filtering for SQS, DynamoDB & Kinesis
https://aws.amazon.com/jp/about-aws/whats-new/2021/11/aws-lambda-event-filtering-amazon-sqs-dynamodb-kinesis-sources/

 - Lambda 関数へのトラフィックを減らし、コードを簡素化し、全体的なコストを削減
 - 最大 5 つのフィルター条件を指定することが可能 

## Amazon SQS が標準キューのデッドレターキュー管理エクスペリエンスを強化
https://aws.amazon.com/jp/about-aws/whats-new/2021/12/amazon-sqs-dead-letter-queue-management-experience-queues/

 - デッドレターキュー (DLQ) のソースキューへのリドライブをサポート

## Amazon EventBridgeでAmazon S3のイベント通知が利用可能に
https://aws.amazon.com/jp/blogs/news/new-use-amazon-s3-event-notifications-with-amazon-eventbridge/

 - 高度なフィルタリング
 - 複数の送信先
 - 高速で信頼性の高い呼び出し
空白投稿もエラーメッセージが表示されない（Laravel）

# ＜エラー概要＞
◉LaravelMix学習


:::note warn
Class "App\Http\Controllers\Admin\Profile" not found
:::

#＜仮説＞
・ Profileが存在するか確認
・ 名前空間とファイル名の命名規則相違
・ ファイルの階層を、Profileの名前を確認
・ namespace App; 
→ namespace App\Models;

※いずれも変化なし。

#＜解決方法＞

①複数形になっているmodel削除
②単数系で再度作成
③validation.phpで日本語表示に設定

modelは原則単数系で命名しないといけないにも関わらず、
複数形で命名していたことが原因。
冷静になって基礎から調べたら解決できました。

<br/>
MacOsで外部ストレージにAndroid Projectを置いてビルドが通らない時の対処

#Macで外部ストレージにAndroidProjectを置きBuildが出来ない時の対処
###前置き
MacにAndroidStudioをインストールしてBuildが通らない問題起きたので、
忘れないように自身のメモとして残して置きます。

###環境
Android Studio arctic fox
MacBookPro OS 12.1
外部SSD

###事象
Android Studioで外部SSDにAndroid Projectを新規で作成。
その後gradleのビルドが実行するとエラーが発生してビルドが失敗した

エラー内容↓

```
Caused by: org.gradle.internal.service.ServiceCreationException: Could not create service of type OutputFilesRepository using ExecutionGradleServices.createOutputFilesRepository().
```

###対応
[システム環境設定]> [セキュリティとプライバシー]> [プライバシー]タブを開き、
[フルディスクアクセス]の項目にAndroid Studioを追加。
これでビルドが成功するようになりました。

[gradleのヘルプサイト](https://discuss.gradle.org/t/could-not-create-service-of-type-outputfilesrepository-using-executiongradleservices-createoutputfilesrepository/32770/4)で
> 外付けHDDに基づくコードでMacOSでこの問題が発生している可能性がある場合、私にとっての解決策は、Javaフルディスクアクセスを許可するようにセキュリティとプライバシーを更新することでした。
[システム環境設定]> [セキュリティとプライバシー]> [プライバシー]タブで、リストから[フルディスクアクセス]を選択し、編集してJavaを追加します。
（＊自動翻訳済み)

と言うコメントがあり上記のように設定を行いました。

---
参考・引用元
・https://discuss.gradle.org/t/could-not-create-service-of-type-outputfilesrepository-using-executiongradleservices-createoutputfilesrepository/32770/4
よく使うショートカットキーメモ

楽ができるショートカットキーをメモしておきます。（随時更新）
環境はwindows,linux(ubuntu)

# Chrome
ここを参照:[Chromeキーボードショートカット](https://support.google.com/chrome/answer/157179?hl=en&co=GENIE.Platform%3DDesktop#zippy=%2Ctab-and-window-shortcuts)

| key | value |
|:-:|:--|
|アドレスバーへジャンプ|Ctrl+l|
|新規タブを開き、そこにジャンプ|Ctrl+t|
Raspberry Pi 3B+でSambaファイル共有

#Raspberry Pi 3B+でSambaファイル共有

##Sambaとは
Linux を中心とした UNIX 系 OS において Windows 系 OS 互換のファイルサーバー/プリント・サーバー機能を提供するフリーソフトウェアです。

https://www.samba.org/

##Sambaの使い方
Installする。 選択肢が出たら"Yes"を選択する。

```terminal:terminal
pi@raspberrypi:~ $ sudo apt-get install samba
```
ファイル共有用のディレクトリーを作る。

```
pi@raspberrypi:~ $ mkdir /mnt/nas
```
Sambaの設定ファイルを開き、共有ディレクトリーなどの設定をする。

```
pi@raspberrypi:~ $ vim sudo vim /etc/samba/smb.conf
```

```
[share]
   comment = RaspberryPi3
   path = /mnt/nas
   guest ok = yes
   read only = no
   writable = yes
   browsable = yes
   force user = pi
```
以下のコマンドで設定ファイルが正しく書かれているか確認する。

```
pi@raspberrypi:~ $ testparm
Loaded services file OK.
```
passwordを設定する。

```
pi@raspberrypi:~ $ sudo smbpasswd -a pi
New SMB password:
Retype new SMB password:
Added user pi.
```
sambaのファイル共有を開始する。

![IMG_3266.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/5777d8f0-e8de-fc2a-1362-8209ffd028fd.jpeg)

```
pi@raspberrypi:~ $ sudo systemctl restart smbd
```

別のWindows PCでエクスプローラーのアドレスに"\\192.168.*.*\share"でアクセスできる。
192.168.*.*はraspiのIP address。

![samba_v1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483556/7de08dd4-0723-2905-5f1a-8f230ebf696f.png)

##Windowsでのファイル共有方法
Windows同士だとフォルダを右クリックしてプロパティから共有をするとネットワークのフォルダに共有できる。共有の解除は右クリックからアクセスを許可するからアクセスを削除するでできる。


##まとめ
今回はSmabaによるLinuxとWindowsとのファイル共有をしてみた。
クラウドサービスを使えば自分だけならできるので、複数ユーザーでのファイル共有で役に立つと思う。
Paiza　便利ツール

#入力


```console:入力
1 2
```
###一行複数値の入力（数固定）
```python:コード
x, y = map(int, input().split())
print(x, y)
#1, 2
```

###一行複数値の入力（数不定、list型）
```python:コード
x = list(map(int, input().split()))
print(x)
#[1, 2]
```

###複数行複数値の入力（2次元list型）

```console:入力
1 2 3 4
5 6 7 8
9 10 11 12
```

```python:コード
data_list = [ list(map(int,input().split(" "))) for i in range(3)]
print(data_list)
#[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
```

#初期化

##list

###1次元
```
x = [0] * 4 
print(x)
# [0, 0, 0, 0]

```

###2次元
```
x = [[0] * 4 for i in range(3)]
print(x)
# [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
```

#行列の結合
```python
print(a1)
# [[1 1 1]
#  [1 1 1]]

print(a2)
# [[2 2 2]
#  [2 2 2]]

import numpy as np
print(np.concatenate([a1, a2], 0))
# [[1 1 1]
#  [1 1 1]
#  [2 2 2]
#  [2 2 2]]

print(np.concatenate([a1, a2], 1))
# [[1 1 1 2 2 2]
#  [1 1 1 2 2 2]]
```

#出力
##list
```python
print(x)
#[1, 2, 3, 4]

print(*x)
#1 2 3 4

print(*x, sep='')
#1234
Railsのモデル同士の関連付けについて

## 概要
Ruby on Railsにおけるモデル同士の関連付けについてアウトプットしたいと思います。

## 環境
ruby: '3.0.1'
rails: '6.1.4'

## 前提
関連付けの説明にあたって下記モデルを前提とします。

|　モデル　|　User　|
|:-:|:-:|
| id | 1 |
|name|'example_name'|

|モデル|Post|
|:-:|:-:|
|id|1|
|content|'example_content'|
|user_id|1|

|モデル|Account|
|:-:|:-:|
|id|1|
|account_number|1234|
|user_id|1|


## 関連付けとは
関連付けとは異なるモデル同士をつなげてコードを簡素化するために行うものです。
関連付けを行っていない場合と行っている場合のコードの違いを見てみましょう。
userの投稿一覧を取得するというコードを比較します。

- 関連付けを行っていない場合

```ruby
user = User.find(1)
posts = Post.find_by(user_id: user.id)
```

- 関連付けを行っている場合

```ruby
user = User.find(1)
posts = user.posts
```

### 関連付けの目的
関連付けの目的は主に２点あります。

__1. コードの簡素化__
上記の例を見ると分かる通り投稿を作成する際に`user_id`を気にしなくて良いので記載するコード量が少なくなりますし、
コードも直感的でわかりやすくなります。

__2. コード記載ミスを減らすこと__
関連付けを行っていない場合では、上記の例だと投稿を作成する際に`user_id`を気にかけないといけなくなります。
つまり投稿を作成するときは必ず`user_id`の記載が必要になるので、必然的にコード量が増え、記載ミス等が起きやすくなります。


## 関連付けの種類
関連付けの種類は３つあります。

### 1. belongs_to
#### 使い方
_*models/post.rb*_

```ruby
class Post < ApplicationRecord
  belongs_to :user # 関連名は必ず単数形
end
```

この関連付けは`User`モデルと__従属__の関係を作ります。
つまり、投稿には必ずユーザーが必要になるということです。
ユーザーのいない投稿は作成できません。
よく`has_many`を定義したモデルの相方で定義されます。
また下記のように投稿したユーザーを取得できるようにもなります。

```ruby
post = Post.find(1)
post.user #=> 投稿したユーザー情報が返ってきます。
```

### 2. has_many
#### 使い方
_*models/user.rb*_

```ruby
class User < ApplicationRecord
  has_many :posts # 関連名は必ず複数形
end
```

この関連付けは`Post`モデルと__1対多__の関係を作ります。
つまり一人のユーザーに対して投稿が複数存在するということです。
よく`belongs_to`を定義したモデルの相方で定義されます。
これによりユーザーの投稿一覧を取得できるようになります。

```ruby
user = User.find(1)
user.posts #=> ユーザーの投稿一覧が返ってくる
```

また`user_id`を気になくても下記のように投稿を作成することもできます。

```ruby
user = User.find(1)
post = user.posts.create(content: 'new_content') # 作成の際にuserから自動的にuser_idを取得してくれる
```

### 3. has_one

####使い方
_*models/user.rb*_

```ruby
class User < ApplicationRecord
  has_one :account # 関連名は必ず単数形
end
```

関連する２つのモデルでそれぞれ定義する。
この関連付けは`User`モデルと`Account`モデルで1対1の関係を作ります。
よく`belongs_to`を定義したモデルの相方で定義されます。
つまりユーザーは必ず1つのアカウントIDを持っているということになります。
下記のようにユーザーのアカウントを取得することもできるようになります。

```ruby
user = User.find(1)
user.account #=> userのアカウント情報を取得できる
```

### まとめ
その他にも関連付けの際に使えるオプションもあるので別記事にて記載したので下記をご確認ください。

https://qiita.com/soicchi/items/70df82c9b3624aa9eacd

##　参考文献
[Railsガイド](https://railsguides.jp/association_basics.html)
[【Rails】 アソシエーションを図解形式で徹底的に理解しよう！](https://pikawaka.com/rails/association)
Unity 2021 でPackageManagerに出てこなくなったパッケージを使う

[Unity2020に引き続き](https://qiita.com/ELIXIR/items/4874e491bbbbce0b88ac)わかりにくいですね・・。

１．[Previewパッケージ一覧](https://docs.unity3d.com/2019.4/Documentation/Manual/pack-preview.html)を開く
２．目的のパッケージを探してURLをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/4387f552-7095-0fa9-1864-9551886c39be.png)
３．Add package from URLを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1e33f9e9-a0db-4f01-2f8d-f8bacb969d82.png)
４．ペーストして[Add]ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/4578d22f-596f-34a4-35a9-88e7a4349b5f.png)
５．インストールされる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/d53a8117-713c-9feb-caec-2d7f32a71d25.png)

ここ数年のUnityは、
・新しいことをどんどん取り入れてプロ向けとしても使えるようにする
・むつかしい設定をどんどん隠して初心者にも使いやすくする
の２つがぶつかり合って迷走しているように感じます。
株も購入して応援しているので頑張ってほしい。。
rubyのgemが入らなくて調べたらHome-brew等々が入っていなかったから各種意味　備忘録

#目的
rubyのgemが入らなくて調べたらHome-brew等々が入っていなかったから各種意味　備忘録

#Home-brew
・マックのパッケージを一括して管理できる
・コマンドで色々動かせる
　　
#rbenv
・Rubyバージョンを管理するパッケージ
・グローバルとローカルに分けられる
　グローバル：特に指定しない限りこのバージョンを使う：デフォルト
　ローカル　：指定バージョンのrubyを設定し動かせる
　例：Sailは2.5じゃないと動かない、通常指定しないとrubyの3.0を見ちゃう
　　　　　
#Ruby gems
・rubyファイル
・rubyのgemを一括してパッケージで管理している

#bundler
・bundlerがgemを一括してパッケージで管理している
・railsとかの依存関係にあるものはbundlerで使ったほうがいい
・古いgemとかで使いたい場合はここに入れる
　これが入るとgemコマンドが使える
pandas csvファイルにある縦持ちデータを連続で読み込んで横持ちデータへ変換する。

#0. はじめに

pandasをつかって、複数のcsvファイルに入っている縦持ちデータを連続で読み込み、横持ちデータへ変換する方法についてまとめる。

- 処理の概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624736/511beb36-3ec1-4f76-4a40-0dafef7a8004.png)




Step0. ライブラリの読み込み・データフレーム作成  

Step1. データ読み込み
　　・ os.walkでメインディレクトリ内のcsvファイルを取得
　　・ pandas.read_csvで取得したcsvファイルを読み込む  
Step2. データ積み上げ
　　・ pandas.concatで読み込んだcsvファイルを積み上げる
　　　 (Step1を行いながらStep2の処理を実施)
Step3. 横持ち変換
　　・ pandas.pivot_tableで縦持ちになってるデータフレームを横持ちへ変換

#### ディレクトリ
Main_dir/
　├ file1.csv
　├ file2.csv
　└ file3.csv


#Step0 ライブラリの読み込み・データフレーム作成
```python
import pandas as pd
import os

df = pd.DataFrame()
```

#Step1と2 データ読み込み・データ積み上げ


```python
for foldername, subfolders, filenames in os.walk('/Main_dir'):
    pass
    for subfolder in subfolders:
        pass
        for filename in filenames:
            if filename.endswith('.csv'):
                read_df = pd.read_csv(filename)
                if df.empty:
                    df = read_df
                else:
                    df = pd.concat([df, read_df])
```

| # | ## | Data |
|:-:|:-:|:-:|
|A|i|1|
|A|ii|2|
|A|iii|3|
|B|i|4|
|B|ii|5|
|B|iii|6|
|C|i|7|
|C|ii|8|
|C|iii|9|

#Step3.横持ち変換

```python
pivoted_df = pd.pivot_table(df, values ='Data', index = ['##'], columns=['#'])
```

| ## | A | B | C |
|:-:|:-:|:-:|:-:|
| i |1|4|7|
| ii |2|5|8|
| iii |3|6|9|

<br>

>参考文献
Wes McKinney 著 瀬戸山雅人、小林儀匡、滝口開資 訳 (2018) Pythonによるデータ分析入門　第２版、オライリー・ジャパン、オーム社
mac 環境設定メモ

## 概要

雑なTipsを色々とまとめる奴。個人用

### 各端末(Terminal)でhistoryを共有する方法 for zsh

```.zshrc
// .zshrc
export HISTFILE=~/.zsh_history
setopt share_history
```

setoptは他に色々設定がありそう
Carrierwaveで公開されているファイルURLからデータを保存する

## やりたいこと
既に公開されている画像のURLからCarrierwaveを介してファイルを保存する。
※ 試したのは画像だけですが他のファイルでもできそう

## 結論

```rb
# CarrierWave の Uploader
class AvatarUploader < CarrierWave::Uploader::Base
  storage :file
end

# ActiveRecord
class User < ApplicationRecord
  mount_uploader :avatar, AvatarUploader
end

User.create!(remote_avatar_url: "https://example.com/***.png")
```

`remote_**_url` に値を指定することによって解決しました。


よくよくみるとgithubのreadmeにもformの例として `remote_**_url` に値をセットする方法が紹介されてました。

https://github.com/carrierwaveuploader/carrierwave#uploading-files-from-a-remote-location

ちゃんとおってないですが多分ここら辺のActiveRecordへのパッチでこのメソッドが早されているのかなという感じでした。

https://github.com/carrierwaveuploader/carrierwave/blob/6c1140bc4f7d8457573249e7f4bd9576cf1f44c5/lib/carrierwave/orm/activerecord.rb#L18-L22

## ダメなパターン

```rb
User.create!(avatar: URI.open("https://example.com/***.png"))
```

## 参考

https://github.com/carrierwaveuploader/carrierwave#uploading-files-from-a-remote-location

http://blog.applest.net/article/20140925-carrierwave-uploads-image-from-url/
課題: フィボナッチ数を出力せよ

# これは何？

https://qiita.com/3kohei2/items/5aea7aa3b5bce25886aa

を読んで、課題を思いついたので書く。
私も書いては見たものの、そんなに追い込んでない。ruby だし。

# 課題

まあ普通にフィボナッチ関数がある。引数は非負の整数のみを考えればよい。

```math
\begin{eqnarray}
f(n) &=& n & \quad if \: n≦1 \\
f(n) &=& f(n-1) + f(n-2) & \quad if \: 1<n \\
\end{eqnarray}
```

コマンドライン引数などで与えられた数 b, c に対して、1秒ぐらいで（厳密でなくて良い）出せる範囲で

```math
f(b^{0}+c),\, f(b^{1}+c),\, f(b^{2}+c),\, f(b^{3}+c), ...
```

を順に出力せよ。

ただし。全部出すと大変なので、値が 5桁までならそのまま出すけど 6桁以上の場合は途中を省略し、先頭二桁、省略した桁数、末尾の2桁　という形式で出すこと。

実行例は下記の通り。いずれも 1秒弱で実行を終えることができた。

```text:実行例
$ ruby fibo.rb 12 12
f(13)=233
f(24)=46368
f(156)=17(ommit 29 digits)92
f(1740)=19(ommit 360 digits)80
f(20748)=53(ommit 4332 digits)76
f(248844)=93(ommit 52001 digits)08
f(2985996)=80(ommit 624032 digits)72

$ ruby fibo.rb 34 25
f(26)=12(ommit 2 digits)93
f(59)=95(ommit 8 digits)41
f(1181)=29(ommit 243 digits)81
f(39329)=84(ommit 8215 digits)29
f(1336361)=38(ommit 279279 digits)61

$ ruby fibo.rb 99 99
f(100)=35(ommit 17 digits)75
f(198)=10(ommit 38 digits)24
f(9900)=42(ommit 2065 digits)00
f(970398)=68(ommit 202797 digits)24

$ ruby fibo.rb 2 0
f(1)=1
f(2)=1
f(4)=3
  ︙
 中略
  ︙
f(4194304)=22(ommit 876554 digits)03
f(8388608)=11(ommit 1753112 digits)21
```

※ 2≦b<100, 0≦c<100 で、いずれも整数。一応上限書いたけど気にしなくても。
※ 不正な入力は来ないものとしてよい。
※ 1秒の測定をどこからにするかは実装者の好みで適当に。
※ 1秒を超えたときの処理も適当で。

実装したら、コメント欄にリンクを書いてくれるとみんな探しやすくて楽しいと思う。