OmniAICreator/Qiita-1.07M huggingface dataset:
AGC041

AGC041に参加しました。

結果は0完。。。

## A問題
https://atcoder.jp/contests/agc041/tasks/agc041_a

方針としてはAとBの差が
偶数の時は、お互いに近づけばいいだけなので差分を2で割った商が答えで、
奇数の時はA,Bの近い方の端っこに行ってA,Bの差分を偶数に調整してからお互い近づけば良いので

公式の解答にある通り

$$ min(A-1, N-b) + 1 + \frac{b-a-1}{2} $$

が答えになります。
ここまでわかった。

が、通らなかった。

以下が通らなかったコード

```python
n, a, b = (int(i) for i in input().split())

x = b-a
if ((x % 2) == 0):
    print(int(x/2))
    exit()
else:
    print(min(a-1, n-b) + int((x+1)/2))
    exit()

```
何が悪かったか？

`int(x/2)`が問題でした。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">これよく言ってる人いるけど、int(n/2)だと、n/2が浮動小数演算になっちゃうので、nが大きい時に精度が＞＜<br>nに(10^18 - 1)とかを入れて試すとわかりやすいです！<a href="https://t.co/jSOFSgdlgO">https://t.co/jSOFSgdlgO</a></p>&mdash; chokudai(高橋 直大)🍆🍡 (@chokudai) <a href="https://twitter.com/chokudai/status/1210942147844722688?ref_src=twsrc%5Etfw">December 28, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


なるほど。
それで、数が大きいと除算演算子`/`が精度が悪くなるのはわかったけど、どこまで大きいくなると精度が落ちるのか？


> 倍精度浮動小数点では、64ビットを使って数を表現し、その内訳は次のとおりである。

>符号ビット (sign): 1 ビット
指数部 (exponent): 11 ビット
仮数部 (fraction): 52 ビット
精度を求める上で重要なのは仮数部のビット数 = 52ビットである。これに加えて、「最上位ビットは1に決まってるんだから書かなくてもいいでしょ、省略するわ」という省略された1ビット（ケチ表現）がある。合計53ビットがdouble型の精度となり、10進に直した精度は53 * log10 2 =15.95桁となる。

> つまり、float型の精度は約16桁である。これより高い精度は表現できない。
https://linus-mk.hatenablog.com/entry/2019/05/26/234642

16桁くらいまでしか精度を保てないとのことでした。

ということで、除算結果を不動小数点にしない`//`で切り捨て除算を行えばOK

以下が通ったコード

```python

n, a, b = (int(i) for i in input().split())
 
x = b-a
if ((x % 2) == 0):
    print(x//2)
    exit()
else:
    print(min(a-1, n-b) + (x+1)//2)
    exit()
```

# 感想
計算精度の話大学の授業でやったなぁ。。。
「LINE entry」とやらを試してみた

# ある日のこと...
最近LINEスタンプをダウンロードしてないな〜
イベントスタンプで何か良さそうなのないかな〜

**『LINE 「プログラミング教育 LINE entry」 配布期間2020/1/1まで』**

ナンカオモシロソウナモノアルヤン！！と余計なことに興味を持ってしまうのが連休中の学生！卒論もありますが寄り道して，コレ触ってみます．

# LINE entryって何？

>LINE entryとは？
>だれでも いますぐ プログラミング
>子どもたちは楽しく、先生たちは使いやすく。
>LINE entryの中で、作品を見せあったり、コメントしあったり。
>活発な学習を応援します。
>先生たちの意見がぎゅっと詰まった、
>無料で学べるプログラミング学習環境。
>いつものクラスルームがここにあります。
([公式サイト](https://entry.line.me/)より抜粋)

要は，これからの小学生でもプログラミングに触れていく時代に向けての教材です．

[Scratch](https://scratch.mit.edu/)を参考にしているだけあり見た目はほぼ同じで，初めて使うのにどこか見覚えのあるブロックタイプのビジュアルプログラミング言語といった印象です．
ただ，[Scratch](https://scratch.mit.edu/)と違い日本の教育現場向けに開発されているだけあり，日本の学習指導要領に準じた教材を提供していたり，エディタを含めたサイト全体が日本語のみであるなど，プログラムに慣れていない小学生たちが使うことを思うと，ハードルをかなり下げてくれてる教材のように感じます．

# 何ができるの？
どうやらまだまだ開発中のようで，機能の充実はこれからといった感じではありますが，大きく分けて2つのモード(サイト内ではステップ)があるようです．

1つ目は「学習」で，その学年までに習った内容でプログラミングに触れていく教科書のような役割のモードです．少し複雑と思われる処理は全て「関数」として提供されており，引数として与える数字を変えて，正しい順序でつなげていけば完成するといった極々シンプルなものでした．逆に「関数」とforの処理などをさす「制御」の項目以外はなく，関数に頼らないプログラミングはできませんでした．

2つ目は「ワークスペース」で，提供されているブロックの範囲内で自由にプログラミングできるモードです．こちらでは関数は最初から作られていることはなく，今までは関数を構成するだけに使われていたブロックたちも自由に扱うことができます．背景やキャラクター・乗り物・食べ物などのイラストはある程度提供されており，お馴染みのLINEのキャラクターたちもいるので，結構楽しくプログラミングできそうでした．

# お遊び程度でしょ？
もちろんビジュアルプログラミングではない，文字で書くプログラミング(以降，文字プログラミング)からすればお遊びみたいなものかもしれませんが，やり込めばなかなかのものが作れる予感がしています．

試しにシューティングゲームにおける自分の機体と発射される弾について考えてみました．

# シューティングゲームの機体を考えてみる

まずは自分の機体がなければ始まりません．シューティングゲームにおける機体の特徴は

- 画面下部にいる
- 左右にしか動かない
- 弾を発射する
- (敵の攻撃を受けると壊れる)

といったところだと思います．今回は敵については実装しないので，上3つを考えます．

そもそも，このプログラミングは，ロケット・弾それぞれにプログラムを行う必要があります．1つのファイルで複数のオブジェクトを操作するといったことはできません．ただし，他のオブジェクトの一部の情報だけは取得できるのと，共通変数は作れるので，それらをうまく使っていきます．

まず画面下部にいるに関しては，最初からそこに機体を設置しておけばOK．素材の中から適当なロケットでも選び，中央下部に配置完了

次に左右にのみ動くようにする作業ですが，かなり簡単に実装できます．ロケットに対して

```
[左矢印 キーが押された時]
->[もし 左の壁 に着いた? ではない なら]
-->[x: -10 移動]

[右矢印 キーが押された時]
->[もし 右の壁 に着いた? ではない なら]
-->[x: 10 移動]
```

これだけです．

最後に弾を発射する作業ですが，適当な弾の画像がないので，とりあえずLEDライト(を小さくしたもの)で代用します．発射キーは上矢印にしようと思います．あとはLEDに対して

```
[スタートボタンをクリックした時]
->[(共通変数)発射中 を 0 にする]
->[y:140の位置に移動する]

[上矢印 キーが押された時]
->[もし 発射中 = 0 なら]
-->[発射中 を 1 にする]
-->[ロケット の位置に移動する]

-->[LED の y座標 > 140 になるまで(以下を)繰り返す]
--->[y方向に5移動する]

-->[発射中 を 0 にする]
```

スタートボタンを押したときに変数の初期化と弾を隠すために画面外に設置する作業を行い，
矢印が押されれば，何度も弾を発射しないように変数で発射中であることを記憶．その後弾がロケットの位置からy軸140を超えるまで直進させる処理を行う．
これで弾も打てるようになりました．

![shooting.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340665/c435a2b8-6ede-136b-8482-714d62d52c49.gif)

# さいごに
ものが動くっていいですね，コンソール上で動くものを作らされるより，よっぽど楽しく学べます．ただ，誰もが思いつきそうなシューティングゲームの，弾の部分が小学生からしてみたら複雑な気もするので，ワークスペースを活用して作品を作り上げさせるのは厳しいのかもしれませんね．あと，「学習」は関数オンパレードなので，関数の中身を触らせてあげるようにならないと，本当に大切な部分はわからないままなのも気がかりです．
QRコードを使った入場システムを自作する。

#経緯
家でディズニーリゾートで使われてそうな設備とかシステムとかを作りたいなあと思いつき一番簡単にシステムを妄想できた***"入場システムを作ろう！"***ってなり作ることにしました。(2020年1月現在未完成)
![UNADJUSTEDNONRAW_thumb_1b29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/416a47ca-5b98-da3a-35d3-698c5693e9b1.jpeg)
※画像は工事中の東京ディズニーランドエントランス


##思いついたシステム
発券機でQRコードを発行
↓
発行日と時間を生成した情報をQRコード(ID)と一緒に専用dbに登録
↓
読み取り時にdbへアクセス->発券機で発行されてdbに登録されてるQRコードかを照合
↓
True:  入場管理dbに読み取った時刻とQRコード(ID)を登録
False: エラー表示を出す。

~~非常に安易である。~~

##前提
- 基本的には***Python***で開発する。
    - 場合によっては他の言語を使うのもあり。
- あまりお金をかけずどこからでもdbにアクセスできるようにラズパイでMySQL鯖を立てる。(構築の方法などは省く。)
- 趣味程度なので大規模な実行環境は想定していない
- 発券機はラズパイで作る。
- 今回製作する読み取り機はハンディースキャナーのようなものでありiOS端末で動作すること。(Pythonista3縛り)
    - 気が向けばゲートも作る？？？
- 完成は2020年6~8月を目処に。

#次回予告
[***[1] 独自のフォーマットに基づいてQRコードを発行する***](https://qiita.com/inchoXD/items/a8164c54ba8ae5bae74f)
...こうご期待!()

#更新情報
- 2019/12/29 どの言語で開発するかなどが抜けていたので追伸。
Common Data Service のリレーションシップとつながりロールの違い

Common Data Service (CDS) ではエンティティ間の関係として、リレーションシップ(関連)とつながりロール(接続)を使えます。この記事ではその違いを紹介します。

# リレーションシップ (関連)

リレーションシップを使うことで、エンティティ間に 1:N (一対多)、N:N (多対多) の関連を作成できます。伝播やマッピングを作成できます。

## 1:N (一対多) の関連

親レコードから見て複数の子レコードを関連として持つことができます。フォーム上では子エンティティはサブグリッドで表現され、紐づく子エンティティのレコードを複数表示できます。

[取引先企業と活動の例]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/dcf6f7da-a5ce-26a8-51ce-ea929dd7f884.png)

## N:1 (多対一) の関連

子エンティティから見た場合に親エンティティは特定レコードとなります。フォーム上では親エンティティは参照(ルックアップ)として表現されます。

[取引先企業と取引先担当者(取引先責任者)の例]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/697228f5-5709-3c42-4de8-4ff8ad95f991.png)

## 多対多の関連

医師と患者のようにお互いに複数のレコードに関連する場合、多対多の関連が利用でき、フォーム上ではどちらのエンティティからもサブグリッドとして表現されます。

## 伝播

親レコードに対する操作が子レコードにどう影響するかを設定できます。
例えば親レコードが削除された場合の動作として以下のものを選択できます。

- カスケード: 子レコードも削除する
- リンクの削除: 子レコードは削除せず、参照をクリアする
- 制限: 子レコードがある場合、親レコードの削除を許可しない
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a491e7c1-489c-7678-2797-0dfa0e66b310.png"/>

削除以外にも、上図にある通り複数の操作に対する伝播を管理できます。

## マッピング

現時点ではクラシックエディターのみですが、N:1 の関連でマッピングを追加できます。これは親レコードから子レコードを作成した場合に、フィールドの値をコピーする設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/df84087f-feb3-10bd-7aa4-984fb0ea20fe.png)

# つながりロール (接続)

リレーションシップと異なり、つながりロールはレコード間の関係を表現します。これにより、より柔軟にレコード間の性質をとらえることができます。

例えば以下のようなパターンが考えられます。

- 以前勤めていた会社という繋がり
- ある会社の CEO であるという繋がり
- 親戚であるという繋がり
- 阪神ファンという繋がり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/31797b8c-b328-3366-0baf-243442950c34.png)

# リレーションシップとつながりロールの使い分け

リレーションシップはそのエンティティのすべてのレコードに設定すべき値であり、かつ伝播などの制約をつけたい場合に有効ですが、情報として残しておきたい場合はつながりロールを使います。

# まとめ

関連はよりシステマチックに、つながりロールはより柔軟にかつカジュアルに使える機能です。色々試してみてくください。

# 参照

[エンティティの関連付けの概要](https://docs.microsoft.com/ja-jp/powerapps/maker/common-data-service/relationships-overview)
[つながりロールの構成](https://docs.microsoft.com/ja-jp/powerapps/maker/common-data-service/configure-connection-roles)
OutSystemsでzipファイルを扱う

環境に標準で付属するAPIを用いたzipファイル展開・圧縮方法を確認します。
公式ドキュメントが見つからなかったので、Action インターフェースと説明を元に、動作確認した結果を以下にまとめます。

# サンプル
Forgeコンポーネント：https://www.outsystems.com/forge/Component_Overview.aspx?ProjectId=7086
Zip Screenを参照してください。

# 環境
Personal Environment(Version 11.0.606.0)
Service Studio(Version 11.6.17)
Zip Extension(For version 11.0.606.0)

以下の通り、Manage Dependenciesダイアログで、Zip Extension要素への参照を追加しておきます。
組み込みのExtensionなのでインストールは不要。
![qZip1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/aa187ea1-aedf-a670-f93d-1baf0999791d.png)


# zipファイルの作成(圧縮)
処理手順
1. CreateZipでメモリ上にzipファイルを用意する(このCreateZipのOutput Parameter ZipHandleを、後続処理のInput Parameterに指定します)
2. メモリ上にファイルを用意し、1ファイルずつAddFileにBinaryを渡していく
3. メモリ上でZipファイルの変更(ファイルの追加)を確定する(CommitChanges)
4. メモリ上のZipファイルから、Binary Dataを取り出す(GetZipBinary)

実装例(Excelファイルを2つ追加したZipファイルを作成する例)
![qZip_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/020aa650-ff76-344c-dd3e-2bc438a341a0.png)

AddFileのParameter設定の例
ZipHandle：CreateZipのOutput Parameter
FileName：追加するファイルのファイル名(例："Products1.xlsx")
DateTime：追加するファイルの作成日(例：CurrDateTime())
FileContent：追加するファイルの実体(Binary Data型)

# zipファイルの展開
処理手順
1. LoadZipでZipファイルのバイナリ(Binary Data型。Upload Widgetなどから取得する)を読み込む
2. GetFilesでFile StructureのListとしてデータを取り出す

実装例
![qZip_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e1fb8be9-bbc2-967a-7f03-59735c0ed4e4.png)
New-PSSession : [outlook.office365.com] リモート サーバー outlook.office365.com からのデータの処理に失敗し、次のエラー メッセージが返されました

Exchange Online に接続してどうのこうのするスクリプトを書いていたらエラーがでました

> <font color="red">New-PSSession : [outlook.office365.com] リモート サーバー outlook.office365.com からのデータの処理に失敗し、次のエラー メッセージが返されました: [AuthZRequestId=3e09a5e1-8d97-40d7-b26a-b78755c48356]
[FailureCategory=AuthZ-AuthorizationException] ポリシー パーティ MaxConcurrency に対して許可されている最大接続数 3 を超過したため、実行空間の作成に失敗しました。既存の実行空間を閉じて終了してからやり直してください。
</font>

## 原因
テストで書いたコードが混じっていて、PSSession を複数回張ってしまって、破棄する数とあっていなかったことです

## 解消方法

実際に張られている PSSession を取得します

```powershell
PS > Get-PSSession

 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  1 WinRM1          outlook.offi... RemoteMachine   Broken        Microsoft.Exchange            None
  3 WinRM3          outlook.offi... RemoteMachine   Opened        Microsoft.Exchange       Available
  4 WinRM4          outlook.offi... RemoteMachine   Opened        Microsoft.Exchange       Available
  5 WinRM5          outlook.offi... RemoteMachine   Opened        Microsoft.Exchange       Available
  6 WinRM6          outlook.offi... RemoteMachine   Opened        Microsoft.Exchange       Available
  7 WinRM7          outlook.offi... RemoteMachine   Opened        Microsoft.Exchange       Available
  8 WinRM8          outlook.offi... RemoteMachine   Opened        Microsoft.Exchange       Available
 10 WinRM10         outlook.offi... RemoteMachine   Opened        Microsoft.Exchange       Available
```

消していいやつを消していきます

```powershell
PS > Remove-PSSession -Id 1
PS > Remove-PSSession -Id 3
PS > Remove-PSSession -Id 4
PS > Remove-PSSession -Id 5
PS > Remove-PSSession -Id 6
PS > Remove-PSSession -Id 7
PS > Remove-PSSession -Id 8
PS > Remove-PSSession -Id 10
```
一気に消してもいいんでしょうが、今回始めてだったので実際には消して Get-PSSession で確認してを繰り返してました
GitKrakenの日本語化（v6.4.1）

[GitKrakenの日本語ファイル](https://github.com/megos/gitkraken-i18n)を見つけたのですが、最新のやつがv6.3.0だったので、最新バージョンと比較して翻訳しました。
（当記事執筆時の最新バージョンはv6.4.1です。）
翻訳したやつです。
https://gist.github.com/kazukazuprogram/5701ccb11fdb7572c6e811c977287171


2020/08/10 追記
コメントより、未翻訳箇所を修正しました。
@k_bobchinさん、ありがとうございました！
【Laravel】自画面遷移時にセレクトボックスの選択値を保持させる

検索画面など、自画面遷移時にセレクトボックスの選択値を保持させる方法です。

## やりたいこと
自画面遷移時にセレクトボックスの選択値を保持させる

* 処理実行→自画面遷移時
* バリデーションエラー時

の2パターンに対応させる

## 環境
* PHP：バージョン7.3.7
* Laravel：バージョン5.8
* OS：Windows10

## 書き方

typesテーブルから取り出した値（ID、NAME）をもとにセレクトボックスを作成する場合の記述は以下の通り。

``` php

<select name = "type_id">
	<option value = "" selected>選択してください</option>
    @foreach($types as $type)
    @if((!empty($request->type_id) && $request->type_id == $type->ID) || old('type_id') == $online_type->ID )
    <option value = "{{ $type->ID }}" selected>{{ $type->NAME }}</option>
    @else
    <option value = "{{ $type->ID }}">{{ $type->NAME }}</option>
    @endif
    @endforeach
</select>
           
```

処理実行→自画面遷移に対応しているのが、

`!empty($request->type_id) && $request->type_id == $type->ID
`
バリデーションエラーに対応しているのが、
`old('type_id') == $online_type->ID`
となっています。

## 参考
* [Laravelで前回の入力値を表示する方法 | Qiita](https://qiita.com/shima0218/items/99ef9aca073b42a7fe15)
* [Laravelのセレクトボックスでバリデーション戻ってきたとき前入力した内容をold()メソッドで表示したい | 鶏口牛後な日々](http://tacosvilledge.hatenablog.com/entry/2018/05/23/180729)
リスト, タプルで各要素を取得 scala 

# はじめに


Scalaでタプルの各要素をリストっぽく `(要素番号)` で取り出そうとした時にエラーでたので少し調べた内容まとめます。

勉強したことを自分の備忘録として残してます。
まだまだ勉強中なので、誤りありましたらご指摘いただければと思います。

# リストとタプルの違い

- リスト
    - 全て同じ型の要素でなければならな
    - `(要素番号)` で要素を取得
    - 要素番号が `0` 始まり
- タプル
    - 異なった型の要素を持つことができる
    - `._要素番号` で要素を取得
    - 要素番号が `1` 始まり

## リストで取得

```scala
scala> val hoge:List[String] = List("Hello", "World")
hoge: List[String] = List(Hello, World)
scala> println(hoge(0))
Hello
``` 

ちなみに、異なる型の要素を持とうとすると **Int** はあかんと怒られる。
(型を　`Any` ってすれば一応怒られないけど、各要素の型情報が失われるのでダメです！)


```scala
scala> val hoge:List[String] = List("Hello", "World", 1)
<console>:11: error: type mismatch;
 found   : Int(1)
 required: String
       val hoge:List[String] = List("Hello", "World", 1)
```

## タプルで取得

```scala
scala> val hoge = ("Hello", "World", 1)
hoge: (String, String, Int) = (Hello,World,1)

scala> println(hoge._1)
Hello

scala> println(hoge._3)
1
```

# なぜ？
リストのapplyメソッドが常に同じ型の値を返すのに対して、タプルの各要素は異なる型になっている。
そのため、タプルはメンバにアクセスして取得するのでリストみたいに `(要素番号)` で取得できない。

ちなみに、タプルの要素番号が `1` 始まりなのはHaskellやMLなどの他の言語にからの伝統らしい。

# 参考
https://www.amazon.co.jp/dp/B01LYPRFI7/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
bundlerで非推奨になった --path  --binstubs

### 環境(2019/12/29時点)
ruby:2.6.5
bundler:2.1.2
# bundleで `--path` と `--binstubs` が非推奨[DEPRECATED]になったよ
railsアプリを作る際、bundle initした後にやるおまじないがあります。

```sh:
$ bundle install --path vendor/bundle --binstubs=vendor/bin
```

- ローカルにgemをインストールするため --pathオプションでvendor/bundleを指定
- bundle execを打ちたくないので --binstubsオプションでvendor/binを指定

いつものように上記のコマンドを打つと、以前は出なかった以下のメッセージが出るようになりました。

```sh:
[DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set path 'vendor/bundle'`, and stop using this flag
[DEPRECATED] The --binstubs option will be removed in favor of `bundle binstubs`
```
--pathも--binstubsも非推奨[DEPRECATED]となり、今後のバージョンからremovedされる可能性があるだと…。

### vendor/bundleについては以下のようなQiitaもありますが
[bundle install時に--path vendor/bundleを付ける必要性は本当にあるのか、もう一度よく考えてみよう](https://qiita.com/jnchito/items/99b1dbea1767a5095d85)
ここではそれについては議論しませんよ。

## どうすりゃいいのさ[vendor/bundle]
メッセージに書いてある通りに

```sh:
bundle config set path 'vendor/bundle'
```
を一回やっとけばOKです。
bundle configコマンドで確認できます。

```sh:
$ bundle config
path
Set for the current user (/Users/hoge/.bundle/config): "vendor/bundle"
```
これをやっとけば、bundle insallで毎回vendor/bundleにインストールされます。

## どうすりゃいいのさ[binstubs=vendor/bin]
[bundle binstubs docs](https://bundler.io/v1.10/bundle_binstubs.html)
bundle installの前に以下のコマンドでvendor/bin以下にstubさせます。
"`bundle binstubs` needs at least one gem to run."と出ますが気にしない。

```sh:
$ bundle binstubs --path=vendor/bin
`bundle binstubs` needs at least one gem to run.
```
アプリ直下に.bundle/configファイルが作成され、BUNDLE_BINのパスがここに書かれます。

```sh:.bundle/config
---
BUNDLE_BIN: "vendor/bin"
```
bundle configで確認。

```sh:
$ bundle config
Settings are listed in order of priority. The top value will be used.
path
Set for the current user (/Users/hoge/.bundle/config): "vendor/bundle"
bin
Set for your local app (/Users/hoge/fuga/hege/.bundle/config): "vendor/bin"
```

ここまでやって初めてbundle installです。

```sh:
$ bundle install
```
binstubを設定したので、vendor/binにもrailsやらrakeができます。
これはvendor/bundle/ruby/2.6.0/binにあるものとは違います。
この状態で、bundle execとはおさらばです。

### 晴れてrails newできます。
```sh:
$ rails new .
```
やったね！

### まとめ(順番）
1. bundle config set path 'vendor/bundle'
2. bundle init
3. bundle binstubs --path=vendor/bin
4. bundle install
5. rails new .
[java] charの扱い方まとめ

javaで競技プログラミングをする時に、char型の扱い方がややこしいと感じたので、まとめようと思った。

### char型はint型にキャストできる
char型には16進数のUnicode文字が格納されている。
このとき、char型はそのUnicode文字を10進数に直した際の数値を持つ。
例えば、int型の変数にchar型の'1'を代入すれば、49という数値としてとして扱うことができる。

```java
int c = 'a';
System.out.println(c);
//49が出力される
```

### 対応する数値からcharに変換する
(char)(数値)でその数値に対応するcharになる。

```java
char c = (char)97;
System.out.println(c);
//'a'が出力される
```

### char型の数字をint型に変換する
数字を羅列した文字列からString.charAt(index)で数字をchar型として取得した時など、char型の数字をint型に変換したい場合がある。
前述のように、char型をそのままint型として使おうとすると別の数値になってしまう。
この場合は、Character.getNumericValue(char c)を用いる。

```java
char c = '1';
int value = Character.getNumericValue(c);
//value == 1
```

逆に、int型の数字をchar型に変換する場合は、'0'に足せば良い。

```java
int a = 1;
char c = (char)('0'+a);
//c == '1'
```

### char型のアルファベットを扱う
char型の'a'は97、'b'は98というように、char型のアルファベットの持つ数値は連続している。
そのため、以下のようにしてfor文で一つ一つのアルファベットを扱うことができる。

```java
char c = 'a';
for(int i = 0; i < 26; i++){
	System.out.print(c);
	c++;
}
//abc...が出力される
```

文字列に各アルファベットがいくつずつ含まれているかを配列に保存することを考える。

```java
String S = "abbcccdefg";
int[] a = new int[26];
for(int i = 0; i < S.length(); i++)
	a[S.charAt(i)-'a']++;
```

'a'の数値を覚えていなくても、'a'が数値として扱えるので問題ない。
さくらのVPSにTomcatをインストール

#前提
筆者自身よくわからないまま２日粘ってやっと動いただけのレベル。難しい。
レンタルサーバーでphpを動かせる程度のLinuxとvimの操作ができる。
さくらでVPSの契約は完了している。
さくらのwebコンソールでCentOS7をインストール済み
apacheをインストール済み
ここまでがまだの場合、
[ネコでもわかる！さくらのVPS講座 ～第二回「サーバーをさわってみよう！](https://knowledge.sakura.ad.jp/8218/)
を読んでその通りにする。ここまでは簡単。

そのあとは主に
[Apache Tomcat 9 を CentOS 7 にインストールする手順](https://weblabo.oscasierra.net/installing-tomcat9-centos7-1/)
を参考に進めていく
ここでは筆者が詰まったことしか追記しないので上記できなかった場合のみ戻ってきてください。

#大きくやること（依存関係があるので上から順番にやらないと失敗するかも）
Javaをインストール
TomCatをインストール
ターミナルからfirewallを設定
さくらのコンソールからポートを解放する。

#java
jdkをインストールする。
**(上位互換性はないので自分が使いたいフレームワークの対応バージョンにする。新しければOKというわけではない。）**
yum install するだけ。

#TomCat
まず何らかの形でサーバーにダウンロードする。(これもjavaのバージョンに合わせたものを選ぶ。新しければいいというものではない。）

ググると人によって色々なやり方を教えてくれるが色々あるので知らないとかえって迷う。
サーバーにログインしてcurl か wget コマンド使うか、一旦ローカルでGUIのブラウザからダウンロードしてftpとかでサーバーにコピーするか、などのやり方がある。
どれもやっていることは同じなので自分が分かる方法をコピペしてバージョンのところだけ書き換えると行ける。
バージョンについてはtomcatの公式ページで現在使える番号を確認して打ち替える。

ダウンロードできたら所定のディレクトリに移動して解凍する。
これも色々なやり方が書かれているが
/opt/ 以下ならどこでも良さそう？
/opt/tomcat か
/opt/apache-8.0.5-tomcat-M24/ みたいなディレクトリで書かれている記事があった。
**※このあと登場する設定ファイルでここで決めたパス名に書き換える必要があるのでTomCatを起動できなかったらここでインストールしたパスなどを確認する。**

サービスを登録する。（ここは筆者自身めちゃくちゃあやふやです。ちゃんと知りたい人は他の人のもみてください。）
良く分からないが、とにかくこれを正しく作って起動に成功させないとTomCatが立ち上がりません。
めちゃくちゃハマったので参考ページのコピペのコツを書きます。

/etc/systemd/system/tomcat.service 

```
[Unit]
Description=Apache Tomcat 9
After=network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/opt/apache-tomcat-9.0.0.M21/tomcat.pid
RemainAfterExit=yes

ExecStart=/opt/apache-tomcat-9.0.0.M21/bin/startup.sh
ExecStop=/opt/apache-tomcat-9.0.0.M21/bin/shutdown.sh
ExecReStart=/opt/apache-tomcat-9.0.0.M21/bin/shutdown.sh;/opt/apache-tomcat-9.0.0.M21/bin/startup.sh

[Install]
WantedBy=multi-user.target
```

結論としては
/opt/apache-tomcat-9.0.0.M21/
の部分をさっきtomcatを解凍したディレクトリの名前に合わせます。
ダウンロードしたバージョン名を変えるだけとは限らないので注意してください。
私はそれでハマりました。
私の場合は /opt/tomcat/bin/startup.sh とかになっていましたので。
自分がどういう名前にしたか、cd /opt/ で ls して確認します。
ここを間違うと あとで確認コマンド打った時にエラーまみれになります。

あとはchmod して systemctl enable tomcatしたあと 
systemctl start tomcat する。

上のコードの意味を一部ですがこのページが解説してくれています。↓
[systemdの*.serviceファイルの書き方](https://qiita.com/masami256/items/ef0f23125cf8255e4857)

このページを読むまで何の設定か意味不明だったのですが、どうもスタートアップに登録したアプリの起動する順番AfterやBeforeで指定して、Exec〜　の行で指定したスクリプトファイルを起動するってのが主な機能みたいです。(.shはシェルスクリプトね)
JavaとかPHPでいうところのAntとかGradeleとかMarvenとか、そういう系だと思います。（たぶん）

#firewalldの設定
このページの一番上らへんに記載の参考ページのコードを丸ごとコピーしてコマンドを丸ごとコピーすれば動くので割愛。
あえて書くと、tomcat.xmlにバージョン名があるけど<description>タグはただの説明(printとかecho命令みたいなもの)なので適当にバージョン名を分かるように書き換えるだけでOK

#さくらのコンソールからポートを解放する。
これは何故か解説してくれているサイトが見当たらないのですが、さくらVPSの場合、デフォルトでWEBのコンソールからポートを制限されているので、停止するか必要なポートだけ解放しないと8080ポートに接続できません。
コンソールのアドレスはさくらのVPSに加入した時にメールで来ているのでそこのリンクから入ってください。

#動作確認
正しく設定できたら、サーバーに管理者で入って
/opt/tomcat/webapps/
以下に好きなフォルダを作ると、それがプロジェクトルートになります。
tomcatの動作確認テスト用にexamplesというアプリが初めから入っているので（なかったら適当に作ってindex.html作って）
ブラウザで
xxx.xxx.xx.xx:8080/example 
と打ち込んでください（xは自分がもらったipアドレスに書き換えて)

サンプルが表示されたら成功です。

また
xxx.xxx.xx.xx:8080
とだけ打つとTomCatのデフォルトページが出るはずです。
試しにManager Appボタン押したら弾かれました。
管理画面に入るためにはまた設定がいるようです。
大変・・
Unityエンジニアがサーバーエンジニアに転生した結果、Unityエンジニアとしての実力が向上した話

# 本記事の目的
サーバーエンジニアになってから、今の自分なら今までよりもUnityエンジニアとして活躍できそうだと感じています。

そこでUnityエンジニアがサーバーサイドを学ぶことによって得られるメリットを共有することで、独学等でサーバーに挑戦する人が増えたらいいなと思います。

# 自己紹介
新卒3年目
今までずっとUnityエンジニア
サーバーエンジニア歴約半年
今使用してる言語はGo

サーバーエンジニアになってからはインフラとかもいろいろやってはいましたが、本記事では主に「クライアントから叩かれるAPIを実装した経験」をもとに書いていきます。

# テストコードが書けるようになった。
Unityの開発では、コードが書けた後は再生を押して実際にゲーム画面で正常動作をするかを確認することができます。
しかし、サーバーの開発では再生ボタンはないためテストコードを書くことで品質を担保します。

具体的には
「Aという入力に対してBが帰ってきたら成功」
「このリクエストがきてDBにxxが保存されてたら成功」
といったふうなテストを書きます。

そしてこのテストは実はUnity側でもやることができます。

やり方は以下です。
Editorフォルダ以下にC# Test Scriptを作成
<img width="467" alt="スクリーンショット 2019-12-28 23.06.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/4414b1ab-91fc-6de3-1ffa-e4fa63f6770c.png">

```csharp
using System.Collections;
using System.Collections.Generic;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;

namespace Tests
{
    public class NewTestScript
    {
        [Test]
        public void NewTestScriptSimplePasses()
        {
            Assert.AreEqual(2, 1 + 1);
        }
    }
}

```
サンプルとして上記のように記述

<img width="353" alt="スクリーンショット 2019-12-28 23.08.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/755e5fd5-d013-e4cc-c57b-3bb89cbae95d.png">

Test RunnerのWindowを開く。PlayMode ではなく EditMode。
<img width="351" alt="スクリーンショット 2019-12-28 23.08.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/bed380b8-cc5f-d4a0-2730-876e6629762e.png">

対象の関数をダブルクリックするとテストが実行される。緑のチェックがついたら成功

で、このテストをUnity側でやることで以下のメリットが得られると思っています。

- テストが書けるようにコードを書くようになる(綺麗なコードじゃないとテスト書けない)
- ドキュメントの代わりになる
- 品質が担保できる

サーバーサイドの開発をやることで、「テストを書く癖」と「テストが書けるようなコードを書く癖」がついたので以前よりもいわゆるテスタビリティ高めのコードが書けるようになりました。

複数人で作業するときに自分の書いたコードのテストを書いておくと、他の人が見たときに理解がしやすいんじゃないかと思います！

# 疎結合な設計のノウハウが得られた。
私は綺麗な実装をするために「クリーンアーキテクチャ」や「DDD」を学習し、それをUnityでの開発に落としこもうとしていました。しかし、私にはゲーム開発においてオニオンアーキテクチャのように「一番上位となるレイヤがEntityとなるように設計する」というのが具体的にどう書けばいいのかが全然わかりませんでした。

サーバーのAPIはクライアントの開発よりもシンプルでした。そのため、ビューとロジック、そしてインフラを明確に分けることができ、ビューとインフラに依存しないドメイン層を実装することができました。

<img width="1004" alt="スクリーンショット 2019-12-28 23.55.43.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113504/20f64501-dc93-14ad-603d-a8aa1cd9ed21.jpeg">


サーバー側で設計の成功体験を積むことができたおかげで自信がつきました。今はUnityエンジニアではないため実際にどうなるかはわかりませんが今までよりもドメインの分離がうまくできると思います。

# ツール作りの選択肢が増える
以前はツール作るときはほぼUnityEditor一択でした。しかし、サーバーエンジニアになってターミナルに触れる機会が増えシェルやライブラリを以前より使うことができるようになりました。

以前コード生成のツールをEditorWindowで作ったことがありましたが、最近また別のコード生成機能を今度はコマンドで叩いて生成するように作っています。
黒い画面は怖くない！

# まとめ
こういう記事は技術系の記事より書くの難しいですね…。
上記の書いたこと以外にも当然ながらサーバーまわりの知識を得ることができたりとか、新しい開発を行うときの全体の工数が分かるようになる、サーバーエンジニアのタスク管理ができるようになる等Unityエンジニアがサーバーを学ぶメリットは多くあります。機会があればぜひ挑戦してみてください！
【Rails】ActiveRecordの同一オブジェクトの判定

```ruby:app/model/user.rb
class User < ApplicationRecord
  def current_user?
    id == current_user.id
  end
end
```

ではなく

```ruby:app/model/user.rb
class User < ApplicationRecord
  def current_user?
    self == current_user
  end
end
```

としましょう。

[`type`なども見てくれて、安全です](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/core.rb#L437-L443)。
年末まで毎日webサイトを作り続ける大学生 〜71日目 オブジェクト指向と円とリリース〜

##はじめに
こんにちは！@70days_jsです。
マウスの位置に円を起き、リリースボタンを押したら円が動き出すものを作りました。
デリートボタンで円が消えます。(gif)↓

![test3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/bfc6a8a4-6b60-95ca-1ccb-96ab6b054735.gif)


今日は71日目。(2019/12/28)
よろしくお願いします。

##サイトURL
https://sin2cos21.github.io/day71.html

##やったこと
マウスの位置に円を起き、リリースボタンを押したら円が動き出し、デリートボタンで円が消えるものを作りました。

html↓

```html
  <body>
    <input type="button" value="delete" id="delete" />
    <input type="button" value="release" id="release" />
    <canvas id="canvas"></canvas>
  </body>
```

htmlはボタンとcanvasだけです。

css↓

```css
body {
  margin: 0;
  background-color: black;
}

#delete {
  position: absolute;
  left: 10px;
  top: 10px;
}

#release {
  position: absolute;
  left: 100px;
  top: 10px;
}
```

cssはボタンの位置を変えたぐらいです。

JavaScript↓

```javascript
let canvas = document.getElementById("canvas"),
  myDelete = document.getElementById("delete"),
  myRelease = document.getElementById("release"),
  ctx = canvas.getContext("2d"),
  twidth = (canvas.width = window.innerWidth),
  theight = (canvas.height = window.innerHeight),
  chars = [],
  mode;

function Circle(ctx, x, y) {
  this.size = 10;
  this.ctx = ctx;
  this.x = x;
  this.y = y;
  this.r = Math.floor(Math.random() * 256);
  this.g = Math.floor(Math.random() * 256);
  this.b = Math.floor(Math.random() * 256);
  this.a = Math.ceil(Math.random() * 10);
  this.v = Math.ceil(Math.random() * 10);
}

Circle.prototype.potision = function() {
  this.x += this.v;
  this.y += this.v;

  if (this.x < 0 + this.size) this.v *= -1;
  if (this.x > twidth - this.size) this.v *= -1;
  if (this.y < 0 + this.size) this.v2 *= -1;
  if (this.y > theight - this.size) this.v2 *= -1;
};

Circle.prototype.render = function() {
  this.draw();
  if (mode === true) this.potision();
};

Circle.prototype.draw = function() {
  let ctx = this.ctx,
    color = this.r + "," + this.g + "," + this.b + "," + this.a;

  ctx.beginPath();
  ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
  ctx.fillStyle = "rgba(" + color + ")";
  ctx.fill();
  ctx.closePath();
};

document.body.addEventListener("mousemove", returnMousePosition);
function returnMousePosition(e) {
  let char = new Circle(ctx, e.pageX, e.pageY);
  chars.push(char);
}

function render() {
  ctx.clearRect(0, 0, twidth, theight);
  ctx.fill();
  for (var i = 0; chars.length > i; i++) {
    let char = chars[i];
    char.render();
  }

  requestAnimationFrame(render);
}
myRelease.addEventListener("click", function() {
  mode = true;
});

myDelete.addEventListener("click", function() {
  chars.length = 0;
});

render();
```

リリースに関しては、ボタンを押したらイベントで検知して、modeという変数の値をtrueに変えることで動き出すように設定しています。↓

>myRelease.addEventListener("click", function() {
  mode = true;
});

メソッドの部分で、modeを判定しています。↓

>Circle.prototype.render = function() {
  this.draw();
  if (mode === true) this.potision();//←ここ。falseなら動かない。
};

デリートはオブジェクトを入れている配列の値を0にするだけです。↓

>myDelete.addEventListener("click", function() {
  chars.length = 0;
});


##感想
リリース時に動き出す方向に法則があるのでなんとかしたいですね。
どうすればいいんだろう。

最後まで読んでいただきありがとうございます。明日も投稿しますのでよろしくお願いします。
【Laravel】Eloquentモデルで使用カラムをカスタマイズする

Eloquentモデルで、使用カラムをカスタマイズする（=デフォルト以外のカラムを使用する）方法です。

## 環境
* PHP：バージョン7.3.7
* Laravel：バージョン5.8
* OS：Windows10

## Eloquentモデルのキホン
データベーステーブルと紐づくモデル。
対応は以下の通り。

* データベーステーブル：小文字複数形（例：flights）

* Eloquentモデル：頭文字のみ大文字（パスカルケース）単数形（例：Flight）

デフォルトでは、

* idを主キーと想定
* 作成時間 created_at、更新時間 updated_atを自動的に更新

しています。

## 使用カラムのカスタマイズ

### 1. id以外を主キーにする
Member.phpに紐づく、membersテーブルの主キーがmember_noの場合は以下のように記述します。

```php:Member.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Member extends Model
{   
    protected $primaryKey = 'member_no';
}

```

### 2. 作成時間 created_at、更新時間 updated_atを自動的に更新しないようにする

membersテーブル更新時に、作成時間 created_at、更新時間 updated_atが更新されないようにするためには以下のように記述します。

```php:Member.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Member extends Model
{   
    protected $timestamps = false;
}

```

### 3. 作成時間、更新時間にcreated_at、updated_at以外

membersテーブルにおいて、作成時間のカラムcreated_timeが、更新時間のカラムがupdated_timeの場合は以下のように記述します。

```php:Member.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Member extends Model
{   
    const CREATED_AT = 'created_time';
    const UPDATED_AT = 'updated_time';
}

```

## 参考
* [Laravel 5.7 Eloquent：利用の開始 | Readouble](https://readouble.com/laravel/5.7/ja/eloquent.html)
* [LaravelのEloquentモデルでupdated_atがないテーブルを使う | KayaMemo](http://kayakuguri.github.io/blog/2017/12/13/eloquent-updated-at-null/)
* [Laravel で updateOrCreate を使う際に Unknown column 'id' in 'where clause' でハマった | Qiita](https://qiita.com/a-tsu/items/02f4c00b69556b7b4589)
PyCharmでAnacondaのインタープリタを使用する方法

モチベーション:pyCharmで実装をした際にpandasをインポートすることができなかった。
pip installするという方法もネット上の記事で紹介されていたが、プロジェクト現場ではネット上からインストールすることができないため、既存のAnaconda環境にあるパッケージ群を使用する方針とする。


1.該当のプロジェクトを開く。
2.「Ctrl + Alt + S」を押し、Settingの画面を開く。
3.左側のペインから「Project:XXXXXXX > Project Interpreter」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/5ca44b7c-769c-e583-2ea3-e968b972a784.png)
4.Project Interpreterの画面中の「歯車のマーク >  Show All」を選択する。
5.表示された画面の右側に表示されている「＋マーク」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/a750a8b8-1ec7-2719-508c-a9961181e650.png)
6.Add Python Interpreterの画面が表示されたら、「Existing environment」にチェックを入れ、右側の「…」のボタンを選択する。
次に表示される画面からAnacondaが格納されているパスを指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/9fcbfe22-dab8-155b-a6a6-79bc8a460362.png)
7.「Settings」の画面移ったら、Activateした「Apply」ボタンを選択する。
これで当該プロジェクトで使用するインタープリタ及びパッケージがAnacondaと同様のものを使用する設定に変更される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/50dcd923-1cc3-7a90-63b0-70afe529ac69.png)
SwiftUIでUICollectionViewのような表示をする

## SwiftUIではUICollectionViewの代わりになるものがない??
どうやらSwiftUIではUICollectionViewの完全に代わりになるものはないそうだ...

| UIKit | SwiftUI |
| ----------- | ----------- |
| UILabel | Text |
| UIImageView | Image |
| UITextField | TextField |
| UITextView | No equivalent (use Text/TextField |
| UISwitch | Toggle|
| UISlider | Slider |
| UIButton | Button |
| UITableView | List |
| UICollectionView | No equivalent (can be implemented by List) |
| UINavigationController | NavigationView |
| UITabBarController | TabbedView |
| UIAlertController with style .alert | Alert |
| UIAlertController with style .actionSheet | ActionSheet |
| UIStackView with horizontal axis| HStack |
| UIStackView with vertical axis| VStack |
| UISegmentedControl | SegmentedControl |
| UIStepper | Stepper |
| UIDatePicker | DatePicker |
| NSAttributedString | No equivalent (use Text) |
- 引用
  - [SwiftUI Cheat Sheet](https://github.com/SimpleBoilerplates/SwiftUI-Cheat-Sheet/blob/master/README.md)


## Listで表現できると書いてあるが、HStackとVStackでUICollectionViewを表現してみた！

### ソースコード

```swift
import SwiftUI

struct TopView: View {

  let fibonacci = [
    ["0", "0.5", "1", "2"],
    ["3", "5", "8", "13"],
    ["21", "34", "55", "89"]
  ]

  var body: some View {
    HStack {
      NavigationView {
        VStack(alignment: .center, spacing: 30.0) {
          ForEach(0 ..< self.fibonacci.count) { section in
            HStack(alignment: .center, spacing: 50.0) {
              ForEach(0 ..< self.fibonacci[section].count) { row in
                Text("\(self.fibonacci[section][row])")
                  .font(.largeTitle)
                  .fontWeight(.heavy)
                  .multilineTextAlignment(.center)
              }
            }
            .padding(.all)
          }
        }
        .navigationBarTitle("Fibonacci")
      }
      .padding(.all)
    }
  }

}

struct TopView_Previews: PreviewProvider {
  static var previews: some View {
    TopView()
  }
}

```

###　実行結果
- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/a5263d26-a9d2-b734-45a6-28d3aa1079f5.png)

- ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/886e2685-3751-5920-961e-379e82aab241.png)

###　結論
- HStackとVStackでViewを横と縦に繰り返し表示できれば、UICollectionViewのUIを表現することができそう...
- QGridというSwiftUIのライブラリを使えばもっと楽に表現できそう...
  - QGridについては後日追記します！

### 追記
#### 2019-12-31
- QgridやStackをつかった構成で作成してみたが、UIKitのTableViewのようにCellを使いまわしてないので、1000件以上の表示になると重くなって全然ダメダメでした...
- やっぱりListをうまく利用してUICollectionViewを再現できないか試していきます！
素人が勢いだけでデルタ型３Dプリンタを作ってみる【２】組み立て編

####今回は前回の設計からの続きになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/9059be6a-6ea3-fa70-fa90-04687c40cef6.png" width=70%>

2週間くらい待ってアルミフレームがやっと全て届いたので、やっと組み立てることができました。

現在の予算状況はこちら。すでに予算オーバーが近づいています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/4913450e-5249-2b5a-f25e-39addcbe29b8.png" width=100%>

##組み立て。
アルミフレームをデルタ型に組み付けるブラケットがないので、
ホームセンターで金具を買い万力で120度に曲げていきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/81ecfeea-3549-f4e7-e175-2bb7315991f9.jpeg" width=70%>

アルミフレームに組み付けた後がこちら。
少し心配でしたが問題なく固定されました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/6e1ea1d5-8012-5b02-e1a6-74af4e8083b9.jpeg" width=70%>


今回必要になるのは、プリントする上で一番大事なホットエンドのマウント部分です。
部屋に転がっていた6mm厚のアクリル板の破材があったので利用します。
設計（適当）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/5336bebd-c103-d257-f1f8-99aefe4b3fcf.png" width=70%>

CADでスーパーマンのマークを書いて印刷。アクリル板に貼ってカットします。
グラインダでバリを取った後、組付けてみます。
金具類は全て近所のホームセンターで購入しました。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/c0c0a759-fcf6-755a-15b3-3799cace9a6f.jpeg" width=70%>

なかなか良いんじゃないですか？


ただこのホットエンドの構造を見る限り台座に固定する所がなく、先端部分にアクリル板を直接組付けると
ヒーターが入った時にアクリルが溶けてしまいそうです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/70d61c29-a773-52bd-42b4-43b061f8bbf5.jpeg" width=70%>


ホットエンドを避けるようにアクリル板に穴をあけ、ホットエンドの上部分だけ別の治具で固定することにします。

まだ固定していませんが、アクリル板とボルトナットで組み付けて行きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/63f31e28-e4f7-05f3-c186-0df29cad6583.jpeg" width=70%>

今回はこんなところで終了です。
次回はタイミングベルト組付け、マイコンで実際にモーターを動かすところまで行きたいと思います。

全体の進捗はこんな感じ。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/361605/2a2a27f5-d5e3-84d2-92d4-9c7567adcf42.jpeg" width=70%>
dplyr備忘録


# はじめに
dplyr、大好きです。
dplyrと素晴らしい解説記事には大変お世話になっていますが、まだまだdplyrの実力の1割程度も引き出せてあげられていない気がしています。

この記事は、個人的に「便利そうだが咄嗟に出てこない」dplyr関数の使い方を書き留めておき、慣れるまでの参照先にするために書きます。
そして遠い未来、dplyrを使いこなした自分がこの記事を見返したとき、成長した感を味わいたいなァと思ってます。

間違ってること書いてたらご指摘いただけると嬉しいです。

## dplyr::rename()
列の改名をしてくれる関数。

```R
iris %>% dplyr::rename(sp = Species) %>% head(2)
# Sepal.Length Sepal.Width Petal.Length Petal.Width     sp
# 1          5.1         3.5          1.4         0.2 setosa
# 2          4.9         3.0          1.4         0.2 setosa

#　これだと長い
cname <- colnames(iris)
cname[length(cname)] <- "sp"
colnames(iris) <- cname

```

## dplyr::pull()
data.frameの一列を指定してvectorとして返してくれる関数。
vectorを引数として受け取る関数に渡す際にすっきり書けそう。

```R
iris %>% head(10) %>% dplyr::pull(Sepal.Length)
# [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9

# これだとちょっとかっこ悪い
sl <- iris %>% head(10) %>% select(Sepal.Length)
sl[, 1]

```

## dplyr::summarise_all()
すべての列に関数を適用し、それらの結果を1行のdata.frameとしてくれる関数。
group_byされてたらグループごとに結果を返す。
summarise_at, summarise_if で関数を適用する列を指定できるのでこれが便利そう。

```R
iris %>% select(1:4) %>% 
  dplyr::summarise_all(funs(min, max))
# Sepal.Length_min Sepal.Width_min Petal.Length_min Petal.Width_min Sepal.Length_max
# 1              4.3               2                1             0.1              7.9
# Sepal.Width_max Petal.Length_max Petal.Width_max
# 1             4.4              6.9             2.5

# これだとかっこ悪い
for (i in seq(ncol(iris))) {
  for (fun in c(min, max)) {
    ...
  }
}

```


## dplyr::case_when()
Cのswitch-caseのような関数。
if {} else if {} else if {}...をすっきり書けるとのことなので、mutate等の中で便利そう。

```R
iris_ <- iris %>% 
  mutate(
    BigPet = case_when(
      (Petal.Length > 5.0 & Petal.Width > 2.0) ~ TRUE,
      TRUE ~ FALSE
    )
  )
```

随時書き足していく予定。


## 参考文献
https://heavywatal.github.io/rstats/plyr.html
https://kazutan.github.io/kazutanR/hands_on_170730/mutate.html
AtCoder Grand Contest 041 参戦記

# AtCoder Grand Contest 041 参戦記

## [AGC041A - Table Tennis Training](https://atcoder.jp/contests/agc041/tasks/agc041_a)

28分半で突破. WA5. 何だ簡単じゃんと思って提出したらやっぱり簡単ではなかったw

以下のうち一番早いものが解答

1. まっすぐ近寄る(ただし距離が偶数でないとすれ違うので偶数の場合のみ)
2. 1 で待ち合わせをする.
3. N で待ち合わせをする.
4. 2人で1に向かい、先に着くAにいた選手が1ターン1に留まり(これで距離が偶数になる)、折り返してBを迎えに行く
5. 2人でNに向かい、先に着くBにいた選手が1ターンNに留まり(これで距離が偶数になる)、折り返してAを迎えに行く

```python
N, A, B = map(int, input().split())

t = float('inf')
if abs(A - B) % 2 == 0:
    t = min(abs(A - B) // 2, t)
t = min(B - 1, t)
t = min(N - A, t)
t = min((A - 1 + 1) + (B - A - 1) // 2, t)
t = min((N - B + 1) + (N - (A + (N - B + 1))) // 2, t)
print(t)
```

追記: 改めて考えてみると、2と3は要らないし、偶数の場合は端に行くパターンを考える必要はなかった.

```python
N, A, B = map(int, input().split())

if (B - A) % 2 == 0:
    print((B - A) // 2)
else:
    print(min(A, N - B + 1) + (B - A - 1) // 2)
```

## [AGC041B - Voting Judges](https://atcoder.jp/contests/agc041/tasks/agc041_b)

113分で突破. WA5. Python で TLE 食らって、PyPy にしても TLE 食らって、Go で書き直しても TLE 食らって、一箇所無駄なスライスのコピーを消したら AC と、一つだけ重たいテストケースが入っててボコボコにされた.

とはいえ、1900番台でレーティングフルボッコになりそうで涙目だった状態から、華麗な900番台への転生で歓喜の舞.

一つの問題が受け取れる投票はM個がマックスなので、現在スコア+MがP番目のスコア以上になれば基本的には候補になる.
が、投票数が多すぎる場合はP番目のスコアにも投票をまぶさざるえなく、その処理がとても大変だった.
というか、適当に書いたのによく通ったなあというのが正直なところ.
厳密にはどっかに穴がありそう…….

```Go
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
)

func min(x, y int) int {
	if x < y {
		return x
	}
	return y
}

func main() {
	N := readInt()
	M := readInt()
	V := readInt()
	P := readInt()

	A := make([]int, N)
	for i := 0; i < N; i++ {
		A[i] = readInt()
	}
	sort.Sort(sort.Reverse(sort.IntSlice(A)))
	p := A[P-1]
	V -= P - 1
	b := A[P-1:]
	for {
		mv := M * V
		for i := 0; i < len(b); i++ {
			t := min(p-b[i], M)
			mv -= t
		}
		if mv > 0 {
			p += (mv + len(b) - 1) / len(b)
		} else {
			break
		}
	}

	result := 0
	for i := 0; i < N; i++ {
		if A[i]+M >= p {
			result++
		}
	}
	fmt.Println(result)
}

const (
	ioBufferSize = 1 * 1024 * 1024 // 1 MB
)

var stdinScanner = func() *bufio.Scanner {
	result := bufio.NewScanner(os.Stdin)
	result.Buffer(make([]byte, ioBufferSize), ioBufferSize)
	result.Split(bufio.ScanWords)
	return result
}()

func readString() string {
	stdinScanner.Scan()
	return stdinScanner.Text()
}

func readInt() int {
	result, err := strconv.Atoi(readString())
	if err != nil {
		panic(err)
	}
	return result
}
```
overflow の罠。 overflow-x か overflow-y が効かないのは仕様らしい。


# 概要

同じ要素に対して、overflow-x, overflow-yのどちらも指定するといったことを実現したかったが、効かなかったので、調べてみました。

CSS Overflow Module Level 3の仕様書によると、「overflow-xとoverflow-yのどちらかがvisible以外に指定されていると、もう片方はvisibleを指定しても、内部ではautoとして扱う」ということになっています。

つまりは、思っていることをそのまま実現することは不可能そうです。

# だがしかし解決策はある

良いかどうかは別として、以下のような解決方法がある模様です。

1. 要素を適当なタグでラッピングして親要素、子要素にそれぞれ overflow-x, overflow-y を片方ずつ指定する

そのほかにもありそう？後々困ったら調べることにします。

# 参考

https://triple-underscore.github.io/css-overflow3-ja.html#overflow-properties
https://teratail.com/questions/138138
Common Data Service のプライマリフィールドとキーについて

今回は Common Data Service (CDS) でカスタムエンティティを作成した際に設定するプライマリーフィールドと、一意識別子、およびキーについて紹介します。

# プライマリーフィールドとは

カスタムエンティティ作成時には、表示名や名前と合わせて、プライマリーフィールドを指定します。

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/edaceea6-9c32-bfc4-7060-c4d5d68940e4.png">

プライマリーフィールドはレコードの特徴を表すためのフィールドであり、データベースにおける「キー」とは異なります。
以下に代表的な既定のエンティティのプライマリーフィールドと値を見てみましょう。

|エンティティ<br/>(プライマリーフィールド)|値|
|:--|:--|
|取引先企業(取引先企業名)|アドベンチャー ワークス|
||アルパイン スキー ハウス|
||コントソ製薬|
|取引先担当者(氏名)|越安 辰夫|
||加須 紀夫|
|タスク(件名)|顧客との予定をスケジュールすること|
||評価計画の合意済み|

プライマリフィールドは通常の文字列フィールドであるため、値の重複もできます。

# 一意識別子

システムフィールドである GUID 型の一意識別子は、通常「エンティティの論理名+id」で作成され、データベースのキーとなります。一度アサインされたら変更は不可で、エンティティのみでなくシステムで一意です。

他のレコードから参照される場合など、こちらの GUID が使われます。また SDK や Web API でデータを一意に特定する際にも利用できます。

# キー

キーは 2 つの役目を果たします。

- 値の一意を保証
- SDK や Web API でレコードを指定して取得することが可能

複数のフィールドを含めることができますが、システムとして一意性が重要である場合にのみ利用してください。重複を避けたい場合は「重複データ検出」を使うことができます。

## 開発者観点でのキー

SDK や Web API でレコードを取得する際、一意識別子が分からない場合は、たとえ電子メールアドレスなどエンティティで一意である値を使ってレコードを取得する時でも複数レコードの検索が行われ、戻り値もリストになります。

しかしシステム連携などでは CDS 側のレコード GUID を別途保持していないため、通常は電子メールアドレスなどを使ってレコードを**検索**することになります。電子メールアドレスをキーにすることで、以下のようにクエリを書け、戻り値として単体レコードを取得することができます。

```
[Organization URI]/api/data/v9.0/contacts(emailaddress1='abc@example.com')
```

# まとめ

プライマリーフィールドはキーではないため、レコードの特性を表すものを設定し、キーが必要な場合は別途作成してください。また各レコードで重複を避けたいが柔軟に処理したい場合は、重複検出を使ってください。

動作についての考察は、[CDSのエンティティのキーを設定する](https://www.d3654.be/cds-entity-key-setting/?fbclid=IwAR1tMqvTY757CZwJMFbwtfXHniiehPouQs5M8dqpMLras77H9VXe-nMeAm4) が良くまとまっていますので、是非ご覧ください。

# 参照

[Web API を使用してエンティティ レコードを取得する](https://docs.microsoft.com/ja-jp/powerapps/developer/common-data-service/webapi/retrieve-entity-using-web-api)
[Web API を使用したクエリ データ](https://docs.microsoft.com/ja-jp/powerapps/developer/common-data-service/webapi/query-data-web-api)
[重複データの検出](https://docs.microsoft.com/ja-jp/power-platform/admin/detect-duplicate-data)
MySQL select 節の基本

select 節は select 文クエリの最初に書かれているものの SQLサーバーによって、最後に判断される節になる。
つまり何をするかよりも、どのデータを使うのかが先に判断されていることになる。
※結果セットに含まれる列を先に判断しているとも言える

##### あるテーブルの全ての列を表示する
列名を * で指定することで、全ての列が表示対象となる。

```bash
mysql> select * from student;
+---------+----------------+
|      id | name           |
+---------+----------------+
|       1 | Aya            |
|       2 | Bob            |
|       3 | Chris          |
+---------+----------------+
3 rows in set (0.00 sec)
```

##### あるテーブルの一部の列を表示する
列名を明示すると、その明示した列だけが表示される。

```bash
mysql> select name from student;
+----------------+
| name           |
+----------------+
| Aya            |
| Bob            |
| Chris          |
+----------------+
3 rows in set (0.00 sec)
```

##### 結果にリテラル（数字や文字列）を追加する
数字や文字列の固定値を指定することで、全てのレコードに対して元のテーブルには存在しない列を追加することができる。
以下の例では score 列で "90"、result 列で "PASS" を追加している。

```bash
mysql> select *, 90 score, 'PASS' result from student;
+---------+----------------+-------+--------+
| id      | name           | score | result |
+---------+----------------+-------+--------+
|       1 | Aya            |    90 | PASS   |
|       2 | Bob            |    90 | PASS   |
|       3 | Chris          |    90 | PASS   |
+---------+----------------+-------+--------+
3 rows in set (0.00 sec)
```

##### 結果に計算結果を追加する
計算式を指定することで、計算結果を値に取る列を追加することが可能。
以下の例では、"dept_id * 10" の結果を格納する "10times_id" を追加している。

```bash
mysql> select *, dept_id * 10 10times_id from student;
+---------+----------------+------------+
| id      | name           | 10times_id |
+---------+----------------+------------+
|       1 | Aya            |         10 |
|       2 | Bob            |         20 |
|       3 | Chris          |         30 |
+---------+----------------+------------+
3 rows in set (0.00 sec)
```

##### 結果にビルトイン関数の結果を追加する
ビルトイン関数を使うことで、その関数の結果を値に取る列を追加することが可能。
使用可能なビルトイン関数は以下を参照。
[Chapter 12 Functions and Operators](https://dev.mysql.com/doc/refman/8.0/en/functions.html)

```bash
mysql> select *, LENGTH(name) name_length from student;
+---------+----------------+-------------+
| id      | name           | name_length |
+---------+----------------+-------------+
|       1 | Aya            |           3 |
|       2 | Bob            |           3 |
|       3 | Chris          |           5 |
+---------+----------------+-------------+
3 rows in set (0.00 sec)
```

##### 結果から重複を排除する
distinct を指定することで、結果セットから重複行を排除することができる。

```bash
# 以下のような重複データがあった場合
mysql> select name from student;
+----------------+
| name           |
+----------------+
| Aya            |
| Bob            |
| Chris          |
| Aya            |
+----------------+
4 rows in set (0.00 sec)

# distinct を指定することで、重複行を排除して結果セットが返る
mysql> select distinct name from student;
+----------------+
| name           |
+----------------+
| Aya            |
| Bob            |
| Chris          |
+----------------+
3 rows in set (0.00 sec)
```
重複データを排除するには、データの並び替えが発生している。
しかしながら、データ量が多いほど並び替えのコストは高くなるため、重複データが無いことが分かっている、あるいは重複データが返ってきても問題ない場合に、”とりあえず distinct する"ようなことはしない方がいい。
firebaseのエラーメッセージに気をつけろ

# firestoreを試していた時

[公式のリファレンス](https://firebase.google.com/docs/firestore/quickstart?authuser=0)見ながらfirestoreを試していた。

```
db.collection("users").add({
    first: "Ada",
    last: "Lovelace",
    born: 1815
})
.then(function(docRef) {
    console.log("Document written with ID: ", docRef.id);
})
.catch(function(error) {
    console.error("Error adding document: ", error);
});

```

リファレンス通りこれを実行すると、DBにしっかり入っている。すごい！
しかしもう一度実行したらエラーが出た。

```
Function CollectionReference.add() requires its first argument to be of type object, but it was: a custom Object object
```

１時間くらい色々やったが直らない。

# 結局なんだったのか

まず、firebase関連のコードを一度コメントアウトして実行。
その後、コメントアウトを外して実行すると直った。
一体なんだったのか。
ちなみにNuxtでやっていたのでそれもあるかもしれない。

つまり、エラーメッセージのFunctionがどうのは全く関係ない。
firebaseのSDKのエラーメッセージはかなり適当らしくて、ちょっとググると「DBを作り忘れていた」、「Ruleが違った」などの時もこのエラーが出てくるという話が出てきた。
みんなも気をつけよう。
VSCode上のWSLからCargoでビルドするとError finalizing incremental compilation session directoryと出るやつの解決策

本日Rustを[完全に理解した](https://ja.wikipedia.org/wiki/%E3%83%80%E3%83%8B%E3%83%B3%E3%82%B0%EF%BC%9D%E3%82%AF%E3%83%AB%E3%83%BC%E3%82%AC%E3%83%BC%E5%8A%B9%E6%9E%9C)勢のもみにすです。
VSCode+WSLで悠々自適なRust生活を送ろうと思っていたところ、`cargo run`が

```
warning: Error finalizing incremental compilation session directory `/mnt/c/Users/JosephJoestar/rust-test/target/debug/incremental/tuto-10gfyla9jwt3t/s-fj6wf8ds1g-11v4hjj-working`: Permission denied (os error 13)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411269/1cdefc9b-3783-bff9-e806-d66c613e6a47.png)


こいつを吐きました。

[rust-lang/rust #62031 Warning Message of `cargo build` when using vscode-remote of wsl](https://github.com/rust-lang/rust/issues/62031)というissueがGitHubのRustに上がっていますが、これは__Rustの問題ではない__ようです。

[I see EACCESS: permission denied error trying to rename a folder in the open workspace](https://code.visualstudio.com/docs/remote/wsl#_i-see-eaccess-permission-denied-error-trying-to-rename-a-folder-in-the-open-workspace)

> That's a known problem with the WSL file system implementation (Microsoft/WSL#3395, Microsoft/WSL#1956) caused by the file watcher active by VSCode. The issue will only be fixed in WSL 2.

> To avoid the issue, set remote.WSL.fileWatcher.polling to true. However, polling based has a performance impact for large workspaces.

> For large workspace you want to increase the polling interval: remote.WSL.fileWatcher.pollingInterval and control the folders that are watched: files.watcherExclude.

> WSL 2 does not have that file watcher problem is also not affected by the new setting.

要約すると、

> VSCodeのファイル監視に起因するWSLのファイルシステム周りの問題で、WSL2では起きない

> VSCodeの設定から`remote.WSL.fileWatcher.polling`を`true`にすればいいんだが、ワークスペースがでかくなったときにパフォーマンスに悪影響が出る

> `remote.WSL.fileWatcher.pollingInterval`から`polling`の間隔を開けたり、`files.watcherExclude`で監視対象のフォルダーを制御したりするといい

ではVSCodeの`settings.json`を開いて、以下の設定を追加してみます。

```json:settings.json
{
    "files.watcherExclude": {
        "**/target/**": true
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411269/65bbeeaf-ab33-74df-2a35-4f24c031b899.png)
出なくなった。これですっきり。
MacBook Pro TouchbarモデルにUbuntu 18.04をインストールしてWIFIにつなぐ

### はじめに
別の場所で40の文系おじさんがPythonに挑戦するというブログを書いてるんですが、転職したせいで本業の方が超忙しくなってしまったのでそっちは全然なんですが、タイトルの通り、MacBook ProのTouchbarモデルにUbuntuをぶち込んだのでその報告がてら書いていきます。ここではどうやったらとにかくLinuxをMBPにぶち込んで動かしたか、しか書きません。細かい背景の技術情報には全然疎いのでそもそも書けません。ちなみに、これも今まさにUbuntu 18.04 LTS on MBP Late 2016で書いてます。

### 前提
おじさんでも、Touchbarモデルへのlinuxのインストールが絶望的に困難になったという話は各方面の記事で読んでいました。が、最近おじさんMBPの16インチモデルを買ってしまい、Late 2016が1台余ることになってしまったので、これLinux入れられないかなと思いながらウェブの海に飛び出したところ、状況はかなり変化しており、イケるんじゃないかなという感触を得ました。その背景としては
- インストールの段階からキーボード、タッチパッドが使えるようなインストールISOイメージを用意してくれている人がいる
- WiFiがついに使えるような道が発見された

ただ、それでもまだどうにもなってないのがオーディオ関連ということですが、WiFiや入力デバイスが使えないことに比べると取るに足らないことという感じです。おじさんは16インチマシン持ってるし。

### 環境
おじさんの環境はMacBook Pro 13,3です。Late 2016の15インチモデルです。

WIFIの設定が完了するまではWIFIがもちろん使えないのですが、それではあまりにも不便なのでUSB Type-Cのイーサネットアダプタを利用することでインターネットへの接続を確保しました。おじさんが使ったイーサネットアダプタはこれです。特になんの設定の必要もなく使えました。
https://www.sanwa.co.jp/product/syohin.asp?code=LAN-ADURCM

### 参考にしたサイト
Linux on mid-2017 MacBookPro
https://nixaid.com/linux-on-macbookpro/

Ubuntu 18.04 image release for MacBook Pro 2017/6 with Touch Bar
https://foolcontrol.org/?p=2928

### ステップ1
上記のfoolcontrol.orgのエントリにUbuntu 18.04のISOイメージが転がっているのでこれを落としてきてType-C USBフラッシュメモリに焼きます。foolcontrol.orgの新しいエントリーには18.10のISOイメージも転がっているのですが、自分の環境ではインストールに失敗したので、18.04でやりました。
MacでのISOイメージの書き込みソフトはbalenaEtcherを使いました。
https://www.balena.io/etcher/

### ステップ2
フラッシュメモリにISOイメージを書き込めたら、そのままMacBookをoptionキーを押しながら再起動して、フラッシュメモリからUbuntuのインストーラーを起動します。あとはインストーラに淡々と従うだけでした。ちなみにおじさんは、ディスクを削除し、MBP13,3からmacOSを消してUbuntuだけのマシンになりました。macOSの残し方は特に気にもしてなかったのでよくわかりません。

### ステップ3
さて次はWiFiの設定です。ここではnixaid.comの上記のエントリーのUpdate 6と書かれてあるところの記述に従います。
https://bugzilla.kernel.org/show_bug.cgi?id=193121#c52
上記サイトのComment 52のattachmentのテキストファイルをダウンロードし、`/lib/firmware/brcm/`に`brcmfmac43602-pcie.txt`として保存します。

### ステップ4
上記txtファイルは修正する必要があります。8行目に
```macaddr=xx:xx:xx:xx:xx:xx```
となっている箇所があり、この`xx:xx:xx:xx:xx:xx`に自分のMBPのMACアドレスで置き換える必要があります。MACアドレスの調べ方は各自おぐぐりください。

### ステップ5
brcmfmacドライバーをリロードすれば、WIFIが使えるようになるとこのことなんですが、おじさんはドライバのリロードのやり方がわからなかったので、Ubuntuごと再起動しました。

### ステップ6
そして、自分のWIFIに接続し、イーサネットアダプタを引っこ抜くと、**イーサネット無しでもインターネットへの接続が維持できました！ MBPのTouchbarモデルでもLinuxでWIFI使えてる！**


ということでQiita初投稿でした！