OmniAICreator/Qiita-1.07M huggingface dataset:
[Mac] Vagrant 2.2.6 と Virtualbox 6.1でうまくvagrant up ができなかった時の対処法

## Vagrant 2.2.6 と Virtualbox 6.1でうまくvagrant up ができなかった

vagrant2.2.6がVirtualbox 6.1(最新版）を認識してくれません。

Virtualboxはインストール済みですが下記のエラーが出てしまいます。

```shell
No usable default provider could be found for your system.

Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.

The easiest solution to this message is to install VirtualBox, which
is available for free on all major platforms.

If you believe you already have a provider available, make sure it
is properly installed and configured. You can see more details about
why a particular provider isn't working by forcing usage with
`vagrant up --provider=PROVIDER`, which should give you a more specific
error message for that particular provider.

```

何故だろうと調べていると英語の記事を発見
```https://blogs.oracle.com/scoter/getting-vagrant-226-working-with-virtualbox-61-ga
```
なにやらvagrantがvirtualboxの最新版を認識してくれないとのこと。
設定ファイルを書き換えてvirtualbox6.1を認識してくれるようにする必要があります。


## さて、ここからぽちぽちいじっていきます。

・編集するファイル
```/opt/vagrant/embedded/gems/2.2.6/gems/vagrant-2.2.6/plugins/providers/virtualbox/driver/meta.rb```

version6.1の記述をdriver map listにしてあげる必要があります。


---

```shell

 driver_map   = {

  "4.0" => Version_4_0,

  "4.1" => Version_4_1,

  "4.2" => Version_4_2,

  "4.3" => Version_4_3,

  "5.0" => Version_5_0,

  "5.1" => Version_5_1,

  "5.2" => Version_5_2,

  "6.0" => Version_6_0,

  "6.1" => Version_6_1, //ここを追記

 }
```

## version_6_1.rbファイルを作成
```
/opt/vagrant/embedded/gems/2.2.6/gems/vagrant-2.2.6/plugins/providers/virtualbox/driver/version_6_1.rb
```
ファイルの中身はここのサイトにあります。
```http://www.coter.net/upload/version_6_1.rb```



次にplugin.rbを編集します。

```
opt/vagrant/embedded/gems/2.2.6/gems/vagrant-2.2.6/plugins/providers/virtualbox/plugin.rb
```

```shell

    module Driver

      autoload :Meta, File.expand_path("../driver/meta", __FILE__)

      autoload :Version_4_0, File.expand_path("../driver/version_4_0", __FILE__)

      autoload :Version_4_1, File.expand_path("../driver/version_4_1", __FILE__)

      autoload :Version_4_2, File.expand_path("../driver/version_4_2", __FILE__)

      autoload :Version_4_3, File.expand_path("../driver/version_4_3", __FILE__)

      autoload :Version_5_0, File.expand_path("../driver/version_5_0", __FILE__)

      autoload :Version_5_1, File.expand_path("../driver/version_5_1", __FILE__)

      autoload :Version_5_2, File.expand_path("../driver/version_5_2", __FILE__)

      autoload :Version_6_0, File.expand_path("../driver/version_6_0", __FILE__)

      autoload :Version_6_1, File.expand_path("../driver/version_6_1", __FILE__)　//ここを追記

    end
```

これでvagrant up するとうまく起動するはずです。
すばらしい！


参考文献：
Getting Vagrant 2.2.6 working with VirtualBox 6.1 GA
Simon Coter 
https://blogs.oracle.com/scoter/getting-vagrant-226-working-with-virtualbox-61-ga
Vim勉強はじめました

# はじめに

こちらは、「Media Do Advent Calendar 2019」21日の記事となります。

直前までは、Goのerrorsに1.13で追加された内容について記載しようかなと思いましたが、つい最近、コーディング速度をあげるために、「やっぱキーボードから手が離れないのはメリット大きいし、私もvim勉強してみようかなぁ。。。」と思っていたので、オンラインでvimの勉強が出来そうなサイトをまとめます。
※私自身はまだまだvimを扱えないので、もっと適したサイトなどあるかと思いますが。

## Open Vim

[Open Vim](https://www.openvim.com/index.html)

vimのモードや操作について、説明を受けながら進めることが出来る。vimを覚えるのであれば、これから始めるのがよさそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132609/0f473813-46da-9374-2887-4ba38d783203.png)

## VIMGENIUS

[VIMGENIUS](http://www.vimgenius.com/)

お題にそった操作を入力し、問題を解く。ヒント表示もあるので、何もわからず始めても操作を覚えるのに使えそう。パパっとテンポよくできるので、繰り返し練習して覚えていく感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132609/6b2998b6-75b9-817c-4c5c-92035b714c8f.png)

## VIM adventures

[VIM adventures](https://vim-adventures.com/)

ゲーム感覚でvimの操作を学べるみたいです。調べた限りだと3章までは無料でできるみたい。私は実際にはやってないですが。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132609/b0b5c865-e9ff-f877-11eb-e4e46378f794.png)


## おわりに

普段エディタはVSCodeを使用しているので、とりあえずVimの拡張を入れました。Vimでしか編集できない環境下で仕事していればそのうち使えるようになるはず(希望的観測)
vimmerになるための道はまだまだ遠そうですが、「vimmerに殺されるその前に」早く十字キーから手を離せるようになりたいと思います。
WindowsでRuby　分かりづらいファイル管理をスッキリ

#Rubyでまず戸惑うファイル管理<br>プログラムは書けて保存できたけどファイルが取り込めない、そんな時に

##1.プログラミングの保存
今回は例として、Hello Rubyとメッセージを返すプログラムを考える。
以下のプログラムをTeraPadで入力し、
```kensyuu15.rb```
というファイル名で保存

~~~
print("Hello, Ruby.\n")
~~~

この時、どこに保存したのかを的確に把握しておく。
作ったファイルまでの道を、パソコンに道案内するイメージだ。

自分は、デスクトップのFolder1っていうファイルの中の20191219っていうファイルの中に保存した。

##2.保存したファイルへの道を、PCに教える

Rubyを起動する。
PCに目的のファイルを案内する。

案内方法は、場所を順番に書き、/で区切る。
その冒頭にその場所に行ってという意味のcdを付ける

~~~
cd /mnt/c/Users/aiko/Desktop/Folder1/20191219
~~~

上記は、aikoさんというユーザーがデスクトップのFolder1っていうファイルの中の20191219っていうファイルの中に保存した場合。

そしたら、中身を見るという意味のlsを実行

~~~
ls
~~~

これで、20191219の中身が表示されればOK

##3.実行

~~~
Ruby kensyuu15.rb
~~~

↓結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551646/ef0aab17-0947-21f3-d1d8-f7e99f051b26.png)
単一コンポーネントライブラリ内のscoped cssの話

## 何

私は本当にscoped cssが好きである。
cssのmodule設計は幾多あるが、だいたいがmoduleのネストで親子間の影響がネックになってmodule粒度が大きくなる傾向があった。
おそらくそういう文脈もあって、そこと向き合ったBEMはみんなに愛されているんだろうと思う。

ブラウザがネイティブでcssにscopeを与えようとした仕様は残念ながら消えてしまったがvue-loaderとかで変換される.vueファイルのようにcssにscopeを与えながら、単一コンポーネントをwebで実現する手段はいくつかある

```vue:vueファイルの例
<template>
  <div>
    <p class="heading">piyo</p>
  </div>
</template>

<style scoped>
  p {
    font-weight: bold;
  }
</style>
```

ここで定義されたpのスタイルは上述の.heading要素にしか当たらないようにコンパイルされる

## compile後のコード

変換後のコードを見てみる

```html
<style>
p[data-v-12345] {
  font-weight: bold;
}
</style>

<div data-v-12345>
  <p class="heading" data-v-12345>piyo</p>
</div>
```

するとhtml側にもstyle側にもそれぞれの要素・セレクタの末尾にdata属性が指定されている
セレクタの末尾にコンポーネントごとにユニークな[data-v-xxxx]を付与することでそれだけに効くスタイルができあがるというロジックらしい


## 簡易loader

踏まえてザルな簡易ローダーを作ってみるとこんな感じ

```js
loader({
  template: `
    <div>
      <p class="heading">piyo</p>
    </div>
  `,
  style: `
    p {
      font-weight: bold;
    }
  `
});

function loader(component) {
  let hash = String(Date.now()); // 大雑把なuuid替わり

  return `
    <style>
      ${transformCSS(component.style, hash)}
    </style>
    ${transformHTML(component.template, hash)}
  `;
}
function transformHTML(html, hash) {
  let dataAttr = `data-${hash}`;
  return html.replace(/<([^/]+?)>/mg, (body, $1) => {
    return `<${$1} ${dataAttr}>`
  })
}
function transformCSS(style, hash) {
  let dataAttr = `[data-${hash}]`;

  return style.replace(/([^{])\s*\{\s*([^}]*?)\s*}/mg,(body, $1, $2) => {
    let selector = $1.split(',').map(v => {
      return `${v.trim()}${dataAttr}`;
    }).join(',');

    return `${selector} {
      ${$2}
    }`;
  })
}
```

出力

```html
<style>      
p[data-1576831975938] {
  font-weight: bold;
}
</style>
    
<div data-1576831975938>
  <p class="heading" data-1576831975938>piyo</p>
</div>
```

selectorには@rule系とかあったり、擬似セレクタもあって末尾に必ずつけていいわけでもないのでcssのちゃんとしたparser使ってtransformした方がいいがおおよそ原理はこんな風になっているらしい。
Auth0イベントに参加して実際に機能を試してみた所感

# 概要
そもそもAuth0とはなんぞや？
>Auth0は認証・認可をクラウドサービスとして提供するID管理プラットフォーム。
Webやモバイル、IoTなど様々なアプリケーションへのログインを、シームレスかつセキュアに認証する拡張可能なプラットフォームを開発者に向けて提供している。シングルサインオン、ソーシャルログイン、パスワードレスログイン、他要素認証といった機能を開発レスで実現できる。

認証サービスなんて他にもごまんとある世の中だがNTTドコモやパーソルキャリアが採用するのはなぜか？
> - セキュリティ認証機能の制作は非常に大変。コストも労力も甚大
→高度なセキュリティと導入の容易さ。
ex) NTTドコモで2年かけたログイン基盤制作が1週間で完了する。
- 各言語に対応したカスタム性の容易さ。
→新しい機能を追加しやすい拡張性と柔軟性が高い。

開発の高速化、ID管理の効率化、セキュリティ強化
これらの観点から弊社でも自社サービスにAuth0を利用したいというので大阪で開かれた「Auth0 Day 2019 Recap in Osaka」に参加してきました。
# イベントに参加して
**なにこれ便利すぎない？**
導入もカスタムも容易で各言語に沿ったテンプレートも準備されているのでとことん開発者に寄り添ったサービス。
UX(ユーザーエクスペリエンス)とDX(デベロッパーエクスペリエンス)の高さ
イベントではこの先導入しようとしている新たな機能やAuth0の展望もうかがい知ることができた。
Auth0のまわし者ではないがこれは試してみるほかない。

# 早速アカウント作って触ってみる

この記事は私的備忘録なので導入のノウハウ詳細は以下の参考記事を御覧ください。

参照記事

[初めてのAuth0ハンズオン](https://qiita.com/hisashiyamaguchi/items/2d0bcae052077f6ae4a4)
![install_flash_player_osx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517245/aaadbf1b-cfb1-3ea5-3950-68cb3d491e18.png)

無事にローカルページを立ち上げ
![Login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517245/62f7b884-1b8f-d1c8-00ab-126d52c91b52.png)

ログイン画面へ
![Sign In with Auth0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517245/1ed98f40-3adb-7dab-7284-e449191355fe.png)
ユーザーを作成しサインアップするとAuth0のダッシュボード・左ペインの"Users"にユーザーが表示されたので成功です。
![Users.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517245/4665cf01-6256-16ee-e62f-398fbfa927b5.png)

2019年12月現在ログイン可能なアプリケーションは以下の通り40種類以上に対応しています。このアプリケーションの豊富さもAuth0の魅力の一つでしょう。
![Social Connections.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517245/285b395f-eee9-791d-d502-ac6f62e75b9d.png)
SMSやEメールを使った2重認証の設定も容易
![Rules.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517245/05bc56e5-d455-44b1-7152-92c8be56d3fa.png)

その他APIの登録やテンプレートを利用した柔軟なカスタマイズなど開発者のかゆいところに手が届きやすく、開発者の時間や労働のコストを大幅に削減できる手応えを感じた。
# Auth0の展望
開発コストを抑えてシンプルかつパワフルな機能を提供するIDaasであり、今後もユーザーとデベロッパーにとって便利な機能が拡張されていくAuth0は認証機能を必要とする現代では非常に重宝されるサービスと言える。
# 個人的課題
今後のサービスでぜひ使用したい。
そのために
**Auth0について更に学習する**
→自由自在に拡張するには知識が必要。シンプル構造かつテンプレートも豊富で便利ではあるが自身で望むような柔軟な拡張を施すことができるよう学習していきたい。
おすすめのAuth0学習書などありましたらご教授いただけると幸いです。
シビックテックとリベラルアーツ

Code for AICHIの南谷真です。某所の情報システム課で働くかたわら、シビックテックの活動をしてきました。Code for AICHIは2019年12月で設立から2年を迎えました。来し方を振り返りつつ、行く末を考えてみました。
##  Code for AICHIの振り返り(2019年）
2019年のイベントの総回数は84回(前年は68件)。2月のTV局の視聴データアイデアソン、3月のIODD、4月のIm@s hackathon、6月のJWLI Bootcamp@名古屋、受賞だと9月のIBM CALL FOR CODE(セミファイナル、イベント登壇)、11月のHERO'S REAGUE(Civictech部門 審査員特別賞）がありました。
また月1回で開催しているシニアもくもく会、スキルシェアを目的としたナイトサロンがあり、ざっと週1,2回程度はどこかで何かをしていることになります。ナイトサロンのタイトルは以下です。

- Kintoneを使ってデータをWEBへ登録しよう！
- Vtuberになろうー！
- Chainer Cafe」~Chainer入門#0（環境構築〜CNNを使った画像処理編）~
- RPAを体験しようー！
- 3d cadを体験しようー！
- 勝手にワトソンカフェ
- micro:bitでセンサーを扱ってみよう！

ちょっとやり過ぎかもしれないと時折感じます。Code for AICHIの目的である「高齢福祉」「ジェンダー」「教育」と運営しているメンバーができること、やれることを進めていった結果ですね。生きにくい、コマッタことはHackしよう、便利なことはshareしようと言ったところです。

## 社会課題の「解決」とリベラルアーツ
カタカナの「シビックテック」はわりと世の中で見るようになったのではないでしょうか。Civic techには適切な日本語の訳がほしいと思うのですけれど。
シビックテックとは「市民が(情報通信の)テクノロジーを使って、社会の課題を解決すること」と説明されることが多く、Code for AICHIもこの文脈に依拠しています。
以前からぼんやり感じていたのですが、課題をどう「解決」するか、「解決」とは何かを追求しだすと(企業や組織だと当然考えされられますが)、壁に突き当たります。
### 社会課題の「解決」
課題の解決を「現在、未来の不都合な状態を減らす、なくすこと」とすると、こうしたことは世の中の組織や企業によって行われています。
シビックテックを行う意味を模索することや、多様な課題にどう向き合うかは現場の知見だけでは難しく、「考えることを考える」ようなフレームワークが必要だと感じています。多様な課題に対して、自分たち自身が何者かを問われるとは逆説的ですが。
### リベラルアーツ
大学のリベラルアーツはこれにあてはまりそうです。大学で学ぶ研究の手法なのですが、文系、理系を問わず、学問には分野を超える共通の要素、例えば論理・分析・批判的思考・行動倫理などがあります。
共通する部分をベースに、個別の学問分野の壁を越え、多様な知識と広い視野で物事を判断することがリベラルアーツの理想です。これは答えのない課題へのアプローチの方法でもあります。大学の学知を活かして、大学の外でもやってみるのも面白そうです。文理を問わず、研究者や学生さんと共同研究ができたらとも考えています。

## Re:DESIGNで行こう
2020年はCode for AICHIの代表の手法をまねて、巻き込むコミュニケーション**「マキコミ」**と踏み込むコミュニケーション**「フミコミ」**で行こうと思います。あとはやり切る意志でしょうか。**「やりきりましょう！」**とよく言われます。そんなに簡単に言うなよ…と苦笑しつつ、やり切ろうと思います。
### Code for Japan summit 2020
**Code for Japan Summit 2020** は愛知県で開催いたします。テーマは**Re:DESIGN**です。大文字のDESIGNは考えや行動の枠組み、フレームを意味しています。世の中やcode for 界隈のあり方について、design with ○○でフレームをとらえ直し、変えたいみたいものです。
Gitのタグ付けを長い間忘れていたことに気づいた時のメモ

Gitのタグ付けとリリース、ちゃんとしていますか？

僕はよく忘れます。
もちろんリリース毎に忘れずにしているに越したことはないのですが、バタバタしていると数ヶ月分のタグとリリースが抜け落ちていることに気づくことが稀によくあります。

よく同じことを調べるので、未来の自分と同じような開発者の方のために、方法を備忘録として残しておきます。

## タグ付けをする必要のあるコミットを探す
まずはタグ付けをする必要があるコミットを探します。

```
$ git log --grep 検索したい文字列
```

にするとタグ付けを行いたいコミットの一覧を表示できます。
今のプロジェクトではリリースの際のブランチ名が `release/xxx` という名前になっているので、 `検索したい文字列` の部分を `release` にしてそのブランチがマージされた際のコミットを探しました。

## タグ付けをする
該当のコミットの一覧が表示できたら、

```
$ git tag タグ名 コミットハッシュ
```

でタグ付けをしていきます。
先ほどのコミット一覧とは別の画面を開いて、一覧を見ながら作業すると楽です。

## ローカルのタグをリモートにpushする
ローカルでつけたタグは明示的にpushしてやる必要があります。

```
$ git push origin --tags
```
のようにすると、先ほど設定したタグをリモートに一気に反映できます。
rbenv (自分用チートシート)

*以下、CentOS7で実施*

### rbenv のインストール（最初だけ）

下記コマンドをひたすら打つ

<pre>
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ cd ~/.rbenv && src/configure && make -C src
$ echo 'export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH"' >> ~/.bash_profile
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
</pre>


### インストールできるrubyのバージョンのリスト

<pre>
$ rbenv install -l
</pre>

### 指定バージョンのrubyインストール
（これはソースからコンパイルとかやるんで、時間かかる）

<pre>
$ rbenv install 2.6.2
</pre>


### 指定バージョンのrubyを使うとき

<pre>
$ rbenv global 2.6.2
$ ruby -v #=> 現在有効なruby
</pre>


### インストール済みのバージョンを列挙

<pre>
$ rbenv versions
</pre>


### インストール対象リストの更新
（※新バージョンがリリースされたときなどに、たまにやる）

<pre>
$ cd "$(rbenv root)"/plugins/ruby-build && sudo git pull
</pre>
配列から直接文字列を並べると正しく動かない場合がある

この記事はPowerShell Advent Calendar 2019 の 22 日目です。

野暮用でスクリプトを作っている時にハマった内容です。
小ネタレベルではありますし、普通に作ればハマらない内容ではあると思うのですが、ちょっとした小ネタとして記事を書いておきます。
# 環境
PSVersion5と6の両方でこの現象は発生するようです。
※PSVersion6はWSL上のPowerShellで確認しています。

# 経緯
`Get-ChildItem $HashTable.Path\*.log`のように、__ハッシュテーブルに入れたファイルパス__と__ファイルを指定するワイルドカード__を並べてをGet-ChildItemを実行すると、`Get-ChildItem : 2 番目のパス フラグメントを ドライブ名または UNC 名にすることはできません。`とエラーを吐きました。

```PowerShell:実行ログ1
PS C:\> $HashTable = @{} #ハッシュテーブルの定義
PS C:\> $HashTable.Add("Path","C:\log") #ハッシュテーブルへ追加
PS C:\> Get-ChildItem $HashTable.Path\*.log #ハッシュテーブル内のパスと[\*.log]を並べてGet-ChildItemを実行
Get-ChildItem : 2 番目のパス フラグメントを ドライブ名または UNC 名にすることはできません。
パラメーター名:path2
発生場所 行:1 文字:1
+ Get-ChildItem $HashTable.Path\*.log
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\log:String) [Get-ChildItem]、ArgumentException
    + FullyQualifiedErrorId : DirArgumentError,Microsoft.PowerShell.Commands.GetChildItemCommand
```


ハッシュテーブルが悪さをしているのかな？と思い、適当な変数に入れて実行すると、問題なく通ります。

```PowerShell:実行結果2
PS C:\> $NonHashTable = $HashTable.Path
PS C:\>
PS C:\> Get-ChildItem $NonHashTable\*.log
    ディレクトリ: C:\log
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019/12/20     13:08              0 1.log
```


変な文字列とかが入っちゃっている？と思って文字列長を調べましたが、結果は同じ文字列長。

```PowerShell:実行結果3
PS C:\> $HashTable.Path.Length
6
PS C:\> $NonHashTable.Length
6
```

ハッシュテーブルが悪いのか？と思い、普通の配列で試してみるも、同じエラーが発生。

```PowerShell:実行結果4
PS C:\> $Table = @("C:\log") #テーブルの定義と値の代入
PS C:\> Get-ChildItem $Table[0]\*.log
Get-ChildItem : 2 番目のパス フラグメントを ドライブ名または UNC 名にすることはできません。
パラメーター名:path2
発生場所 行:1 文字:1
+ Get-ChildItem $Table[0]\*.log
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\log:String) [Get-ChildItem]、ArgumentException
    + FullyQualifiedErrorId : DirArgumentError,Microsoft.PowerShell.Commands.GetChildItemCommand
```

何故…？

# 原因
Get-ChildItemの引数と指定したパスをWrite-Hostで表示させてみたところ、
ハッシュテーブル/配列問わず、文字列の後に__謎の空白__が入っていることを確認しました。
そのため、Get-ChildItemに二つのパスが渡されている状態となり、エラーが発生していたようです。

```PowerShell:実行結果6
PS C:\> Write-Host $NonHashTable\*.log
C:\log\*.log #正しく繋がっている
PS C:\> Write-Host $HashTable.Path\*.log
C:\log \*.log #間に空白がある…！
PS C:\> Write-Host $Table[0]\*.log
C:\log \*.log #間に空白がある…！
```

# 対策
そもそも、`$HashTable.Path\*.log`という書き方は美しくないよね、ということもあり、`($HashTable.Path + "\*.log")`と文字列を結合するように書き換えることで回避しました。

```PowerShell:実行結果5
PS C:\> Get-ChildItem ($HashTable.Path + "\*.log")
    ディレクトリ: C:\log
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2019/12/20     13:08              0 1.log
```

# 余談
- `$HashTable.Path\*.log`を__文字列を結合__と称するのは何か違う気がしたので、__文字列を並べる__としました。
- 特にファイルパスを変数で取り扱うとき、「\」で変数名が丁度よく区切れるので並べて書いてしまう傾向があるのですが、それが良くなかったように思えます。

```PowerShell:余談の例
###良くない書き方($date部分が通常の変数では問題ないけど、配列になるとエラーになる)
Get-ChildItem C:\log\$date\*.log
###少し気を付けた書き方
Get-ChildItem ("C:\log\" + $date + "\*.log")
```
信号処理とか音楽の分析に大活躍しそうなlibrosa

振動センサーとかマイクとかを使って取得した振動や音、信号をPythonで処理するときに便利なツール見つけたので、自分の備忘録としてもQiitaに投稿します。
音響信号だったり、センサの信号だったりをディープラーニングや、機械学習になげるときに使えそうです。

LibROSA
https://librosa.github.io/librosa/

ドキュメントを見ると、音楽や音の分析につかうパッケージのようです。
音楽分析の機能が豊富ですが、信号処理の必要なものはあるていどそろっている気がします。

2019年12月現在では、`v0.7.1`が最新のようです。

## インストール方法
pip もしくは、Anacondaでインストールできます。

pipの場合

```bash
pip install librosa
```

condaの場合

```bash
conda install -c conda-forge librosa
```

公式のドキュメントには、ソースからインストールする方法も記載されてます。
Pythonのバージョンやインストール環境(Linux, OSX, Windowsなど)ごとに注意点もあるようなのでチェックが必要。

## Wavの読み込み
音楽用のファイル形式は色々ありますが、wavやmp3が使えるそうです。
あとで書きますが、読みだした信号は配列に数字がならんでいるだけなので他のライブラリを組み合わせれば、さまざまな音源に対応できそう。


ライブラリの確認のために、[ESC-50](https://github.com/karolpiczak/ESC-50)の音源を使います。
環境は、Jupyter Lab上でPython3.6を使ってます。

ESC-50のエンジン音を読み込んでみます。
`librosa.load`を使用します。
引数には、ファイル名とサンプリング周波数を指定します。

```python
import librosa

file_name = '/home/sound_process/data/sound/engine/1-18527-A-44.wav'
wav, sr = librosa.load(file_name, sr=44100)
```

注意しないといけないのが、`sr`の値です。
srの値がデフォルトで22,050Hzになっています。
なので、返ってくる値が22,050Hzになってしまいます。
読み込みに直接影響はないですが、周波数計算する時とかグラフの横軸に影響がでます。

波形の表示も簡単にできました。
内部でmatplotlibを使っているので、画像サイズや線の色もmatplotlibの書き方で変更できます。

```python
import librosa.display
import matplotlib.pyplot as plt

plt.figure()
plt.figure(figsize=(15, 5))
librosa.display.waveplot(wav, sr)
plt.show()
```
実行するとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/82cb564a-a7a1-ea4b-8c52-352dfa1eceb8.png)

## 信号の形式

loadで読み込まれた信号は1次元の配列に格納されています。
こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/29addc49-1fe4-a954-2df7-abdc429d0439.png)
もし、信号のデータがcsvであってもPythonで読み込んで配列にしてしまえば、wavを読み込んだ時と同じようにlibrosaで扱えます。

## フーリエ変換

信号処理といえば？フーリエ変換ですね。
`stft` というフーリエ変換の関数が用意されています。
Short-time Fourier transform (短時間フーリエ変換) ができます。

```python
import numpy as np

stft_result = librosa.stft(wav)
abs_result = np.abs(stft_result)
power_spec = librosa.amplitude_to_db(abs_result, ref=np.max)

plt.figure(figsize=(25,5))
librosa.display.specshow(power_spec, y_axis='log', x_axis='time', sr = sr)
plt.title('Power Spectrogram')
plt.colorbar(format='%+2.0f dB')
 
plt.tight_layout()
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/30659810-fe05-fd4d-cc63-1fd17cad14c0.png)

他にも、信号分析系で言えばメル周波数ケプストラム係数(MFCC)が計算できたり、逆フーリエ変換も簡単にできます。
ピッチシフトができたり、クロマグラムも取得できるので音程に変換したりできるのも面白そうです。
UIButtonのtitlelabelのテキストを全て表示する方法[Swift]

## 動機
`UIButton`のテキストを設定していて幅の制約は横いっぱいに広げていて
余白はめちゃめちゃあるはずなのにテキストが見切れるのに苦戦したのでメモ。

## 概要
- これだと見切れる
->`titleLabel`のテキスト(つまり中身)を指定しただけなので、大きさはxcodeで指定した文字列によって決まってしまう
(Xcode側で適当に長い文字列をあらかじめ入れておいてもうまくいくのがこのため)

```swift
hugaButton.titleLabel?.text = "hogehoge"
```

- これも見切れる
->`adjustsFontSizeToFitWidth`も`titleLabel`の大きさに合わせて
全ての文字が入るよう**フォントを調節する**ので`titleLabel`の**大きさを調節してくれるわけではない**

```swift
hugaButton.titleLabel?.text = "hogehoge"
hugaButton.titleLabel?.adjustsFontSizeToFitWidth = true
```

- これだとOK
->`setTitle`はテキストに合わせて`titleLabel`の大きさを調節し、テキストを入れてくれるので**全てのテキストが表示される**(フォントはデフォはXcode側の設定に準拠するので変更したい場合は別途コードで設定が必要)

```swift
hugaButton.setTitle("hogehoge", for: UIControl.State.normal)
```

## 備考
フォント変更はこうやるらしい
`setTitle`で`titleLabel`に文字が入るのが納得って感じです

```swift
let updateBtn: UIButton = UIButton()
//ボタンタイトル //titleLabelに更新を入れる
updateBtn.setTitle("更新", forState: UIControlState.Normal)
//ボタンタイトルのフォントサイズ
updateBtn.titleLabel?.font = UIFont.systemFontOfSize(25)
```

## 参考
http://daifuku-p.org/w/?p=767
http://mob-wasao.hatenablog.jp/entry/2017/03/10/152149
Laravelでアンダースコアを名前に含むヘッダを扱う

# 問題

社内のシステムが独自ヘッダをつけてリクエストを投げてくるのですが、名前にアンダースコアが含まれている(仮に`foo_bar`とします)のでLaravelの普通のやり方`$request->headers->get('foo_bar')`では取得できませんでした。

# 調査

最初は「_」が問題とはわかってなくて、まず切り分けということでいろいろ調べたらこんな感じでした。

| 対象 | foo_barヘッダの有無 |
|:-------|:--------|
| WireSharkでパケットダンプ | ある |
| `$_SERVER` | ない |
| `getallheaders()` | ある |
| `$request->headers` | ない |

Laravelはヘッダの取得はSymfonyの`\Symfony\Component\HttpFoundation\ServerBag`クラスの`getHeaders()`で行っていて、これは`$_SERVER`から取得するようになっていたので、`$_SERVER`に含まれていないのが問題のようです。

また試しに別の名前のヘッダを追加したりしてみたらどうやら「_」が含まれてるとダメらしいとわかってきました。

そこで「ヘッダ名」「アンダースコア」で検索してみると、[HTTPヘッダ名にアンダースコアはダメよ。](https://saikyoline.jp/weblog/2014/07/03/211811.html)が見つかりました。apacheがやっているということのようです。(確かにapache+mod_php環境でした)

とはいえ、いまさら社内システム側を変えてくれという訳にもいかず、`getallheaders()`ではとれるからそれでなんとかする方針にしました。

# 対策

`$request->headers->get()`しているところを`getallheaders()`を使うように書き換えればとりあえず動きはするのですが、phpunitでのテストがやりにくいのでひねり出したのが以下のミドルウェアを使う方法です。

`getallheaders()`で`foo_bar`ヘッダがみつかったら、追加してやるという仕組みです。これをグローバルミドルウェアとして登録しました。

```php
class FooBarHeader
{
    private const HEADER_NAME = 'foo_bar';

    public function handle(Request $request, \Closure $next)
    {
        if (function_exists('getallheaders')) {
            $headers = \getallheaders();
            if (isset($headers[self::HEADER_NAME])) {
                $request->headers->add([self::HEADER_NAME => $headers[self::HEADER_NAME]]);
            }
        }

        return $next($request);
    }
}
```

いったん追加してしまえば通常のやり方で取得できるようになるし、通常のやり方で書いてあればテストのときに`$this->withHeaders()`が使えます。

# おわりに

ヘッダ名には英数字と「-」以外の文字は使わないようにしましょう。
SPAでブラウザバックを使う

# SPAはブラウザバックが使えない

SPAは1つのHTML内で画面遷移する特性上、SPA内で画面遷移してもブラウザバックで1つ前の画面に戻ることができない。
しかし、ユーザーはそのサイトがSPAなのかなど知るよしもなく、画面遷移してるのにブラウザバックできないのは不便だ。

そこで、どうにかしてブラウザバックを効かせる方法を考えた。

# 想定する画面遷移ケース

SPA外のページからリンクでSPAに遷移して、その後SPA内で画面遷移することを想定する。

```
0. SPA外のページ
↓
1. SPAルートページ
↓
2. SPA第2階層ページ
↓
3. SPA第3階層ページ
```

3まで進んだあと、アプリ内の戻るボタンはもちろん、ブラウザバックでも 3 → 2 → 1 → 0 とSPAの前の画面に戻れるようにしたい。

# SPAでブラウザバックを使うコードサンプル

```javascript
var viewStack = [];

window.addEventListener('popstate', (e) => {
    this.popView();
});

// 画面を追加する
function push(view) {
    if (0 < this.viewStack.length) {
        history.pushState(null, null, view.location);
    }

    this.viewStack.push(view);

    // TODO viewを画面に表示する
}

// 前の画面に戻る
function pop() {
    history.back();
}

function popView() {
    if (this.viewStack.length === 1) {
        return;
    }

    this.viewStack.pop();

    // TODO 一つ前のviewを画面に表示する
}

```

`push` の引数のviewは画面を表すインスタンスで、HTMLのelementとURLになる`location`を持っている想定。
画面の表示を切り替える処理などは省略して TODO にしている。

# ポイントと解説

### window.addEventListener

```javascript
window.addEventListener('popstate', (e) => {
    this.popView();
});
```

`addEventListener` の最初の引数を`'popstate'` にすると、ブラウザバックのイベントをフックすることができる。
このコードによりブラウザバックが押されたら `popView()` が呼ばれ、SPA内で一つ前の画面に戻ることができる。

ブラウザバックした画面がSPAのルートページなら、ブラウザが勝手に前画面に戻してくれるのでSPA側で何もする必要はない。
ルート画面でない場合はブラウザバックしてもURLが変わるだけで、ブラウザは画面を切り替えないので、`popView()` 関数でSPA内のページバックを行う。

### history.pushState

```javascript
if (0 < this.viewStack.length) {
    history.pushState(null, null, view.location);
}
```

`history.pushState`で履歴を追加できるので、SPAで画面を追加するときに`pushState`を呼び出してやる。
3つ目の引数はURLのパスで、指定した値はブラウザのアドレスバーに反映される。

ここでのポイントは `if (0 < this.viewStack.length)` で、ルート画面を表示するときは `pushState`を呼ばないことだ。
外部ページからSPAのルート画面に遷移するときは既にブラウザによって履歴が追加されているので `pushState` を実行すると履歴が2重に追加されてしまう。

### history.back

```javascript
// 前の画面に戻る
function pop() {
    history.back();
}
```

SPA内の「戻る」ボタンで前の画面に戻る場合、`history.back()` を呼び出せば `addEventListener` で登録したコールバックが実行され、前の画面に戻ることができる。

# おわりに

Chrome、Safariで思ったとおりに動くことは確認したが、本番プロダクトで試したことのない実装なので、何か問題があれば教えて欲しい。
Wiresharkを一般ユーザで実行(ラズパイ編)

#1. 一般ユーザでパケットキャプチャしたい！
ラズパイで、Wiresharkをrootで実行すると、パケットキャプチャ実行やキャプチャファイルの移動&共有できない...:disappointed_relieved:
そこで今回は、ラズパイでWiresharkの権限変更をしました。
(RaspberryPi 3B, Raspbian Strech使用)
#2. 初期状態
一般ユーザでwiresharkをターミナル実行すると、無線LANなどInterfaceが表示されませんでした。
![Screenshot from 2019-12-20 15-51-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279324/efb60606-9db6-f7f7-0756-d52af6331ed1.png)

#3.解決方法
###3.1 dumpcapのケーパビリティの設定
```bash:terminal
pi@raspberrypi:~ $ sudo setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap
```
<<コマンドの意味>>
(1)setcap
「set file capabilities」の略で、ファイル機能の設定ができるコマンド

>setcap [-q] [-v] (capabilities|-|-r) filename [ ... capabilitiesN fileN ]
[引用元](https://linux.die.net/man/8/setcap) : die.net「setcap(8) - Linux man page」

(2)CAP_NET_RAW
>RAWソケットとPACKETソケットの使用を許可する
[引用元](https://www.atmarkit.co.jp/fsecurity/rensai/lids03/lids01.html)：atmarkIT 第3回 権限を最小化するLinuxカーネルケーパビリティ

(3)CAP_NET_ADMIN
>さまざまなネットワークに関係する操作（ルーティングテーブルの変更など）を許可する
[引用元](https://www.atmarkit.co.jp/fsecurity/rensai/lids03/lids01.html)：atmarkIT 第3回 権限を最小化するLinuxカーネルケーパビリティ


###3.2 setcapで設定したケーパビリティを確認
```bash:terminal
pi@raspberrypi:~ $ sudo getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip
```
###3.3 一般ユーザをWireshark実行グループに追加
私の場合は、ラズパイにwiresharkをインストールした時点で、
「wireshark」というWiresharkの実行権限を持つグループがあったので、
新規でグループは作りませんでした。



```bash:terminal
pi@raspberrypi:~ $ sudo adduser pi wireshark
```
###3.4 ラズパイ再起動
```bash:terminal
pi@raspberrypi:~ $ reboot
```
###3.5 wireshark起動
```bash:terminal
pi@raspberrypi:~ $ wireshark
```

#4.実行結果
Interfaceが表示・認識されるようになりました！
![Screenshot from 2019-12-20 16-08-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279324/76a60713-b00c-ecef-f3fe-1590ae9f1d4e.png)
Objectのプロパティ名に変数を設定する方法

#Objectのプロパティ名に変数を設定する方法

プロパティ名を[]で括ります。

```js:object.js
const propertyName = {
  a: 'あ',
  b: 'い',
  c: 'う'
}
const body = {
  [propertyName['a']]: 'あ is selected'
}

console.log(body)
> Object { あ: "あ is selected" }
```
Postgresの型とA5M2で生成したテーブル定義の型との対応（メモ）

腹立つけど、これで運用されているから仕方ない・・（愚痴

######実際の型　→　A5M2生成後

--真偽型
bool　→　boolean

--日付型
date　→　そのまま
datetime　→　そのまま
timestamp　→　timestamp without time zone(←このままでも使える)

--数値型
int2　→　smallint
int4　→　integer
int8　→　bigint

--文字列型
char　→　そのまま
varchar　→　character varying
Lambda Functionの一覧をランタイムバージョンと共に表示する

古いランタイムバージョンのLambda Functionが残ってると、使ってなくてもAWSからEOL通知のメールが来るので、一覧を表示するスクリプトを書いた。備忘録代わりに投稿します。

``` bash
#!/bin/bash
regions=$(aws ec2 describe-regions | jq -r '.Regions[].RegionName')
for region in $regions
do
    aws --region $region lambda list-functions --function-version ALL | jq -r '.Functions[] | [.Runtime, .FunctionArn] | @csv' | sort -V
done
```

あとは、消したいものをgrepして、```aws lambda delete-function --function-name ARN```するだけ。Regionごとに消さないといけないので、ちょっと面倒くさいけど。
git の基本コマンド

## リポジトリとは
バージョン管理の対象となるディレクトリやファイルの総称です。

リポジトリは２種類あります。

- ローカルリポジトリ
  - 手元のパソコン内にあるユーザー１人が持っているもの
- リモートリポジトリ
  - 複数人で共有するためのもの

複数人で開発する場合、各自のローカルリポジトリで作業し、必要に応じてリモートリポジトリに作業の内容を反映させます。

## gitのコマンド
### git init
リポジトリを新規に作成するとき、または再初期化のコマンドです。

```
 $ git init
 ```
    
### git add
新しいファイルの追跡開始に使うコマンドです。
追跡対象となり、コミットする準備ができます。

```
$ git add ファイル名 
```

### git remote
リモートとやりとり（push、pullなど）をするときに、毎回URLを指定しなくて済むよう、あらかじめリモートリポジトリの名前をつけるコマンドです。（この場合は origin）

```
$ git remote add origin URL
```

### git commit
ステージにあげたファイルをローカルリポジトリに反映するコマンドです。

```
$ git commit
```
or

```
$ git commit　-m "コメント"
```

### git push
ローカルブランチのコミットをリモートブランチに反映させるコマンドです。

```
$ git push origin master
```

### git pull
リモートブランチの内容をローカルブランチに反映させるコマンドです。

```
$ git pull origin master
```

## 最後に
詳しいgitの説明はPro GitのPDFに載っているので、そちらをご参照ください。
https://git-scm.com/book/ja/v2
[TouchDesigner]Parent Shortcutを活用して強固なシステムを作る


# はじめに
TouchDesignerアドカレに代打投稿させていただきます。
現在は[UT-Virtual](http://utvirtual.tech/)というVRサークルにて活動しつつ、個人で[作品制作](http://kotaisobe.com)を行ったりしている[@theruleisobeyed](https://twitter.com/theruleisobeyed)です。


先日の[MUTEK.JP Digi Lab / Derivative TouchDesigner Workshop](https://www.eventbrite.com/e/mutekjp-digi-lab-derivative-touchdesigner-workshop-tickets-83582650959#)に参加してきましたので、そこで得た知見を共有させていただきます。
本ワークショップはオーディオ関連のTips紹介、SceneChangerの紹介及びAbletonLiveとの連携(TDAbleton)の紹介を踏まえて、実際にチームで個々のPC上で作ったTDAbletonを利用したオーディオリアクティブな表現を一台のPCのTouchDesigner上でSceneChangerを利用してマージすることを試すといった流れでした。

ワークショップでの取り組みとSceneChangerの詳細についてはこちらの記事をご覧ください。
[[TouchDesigner]SceneChangerで複数人開発やシーン管理を行う[MUTEK.JP Digi Lab WS]](https://qiita.com/ktkt40208/items/5c65e643328a398cf968)

# Parent Shortcutについて
ワークショップ内でBenさんの方からTouchDesignerの設計理論で非常に重要な概念として絶対に覚えて帰ってね！と紹介があった概念、[Parent_Shortcut](https://docs.derivative.ca/Parent_Shortcut)について紹介します。



サンプルファイルとしては[この](https://forum.derivative.ca/t/bare-bones-scene-change-show-system/12152)記事内からダウンロード可能なSceneChanger.toeを利用しています(2019版以降の新機能であるBindを利用して簡単に参照が外れない強固なシステムにしている関係で、古いTouchDesignerでは動かないようですのでご注意ください)。

解像度など多数参照される数値の階層によらない参照はParent Shortcutを利用することで、変更による簡単に参照抜けが起きない強固なシステムを組むことが可能です。親となる自身を含んだ上位階層のCOMPに対してComponent Editor上で設定したパラメータを、任意の下位階層のコンポーネントから全く同じ参照テキストで参照することができます。絶対パスと異なり、親が別階層に移動されたとしても参照が抜けません。

以下のように、Component Editorでパラメータの設定を行うことで異なる階層のコンポーネントから同一参照テキスト(parent.Name)で参照が可能です。
![2019-12-20_16h37_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151752/ea2c1b55-e42d-e838-8485-37682036f047.png)

このような決まりを設けておくことは、複数人で各シーンを担当して開発を行う場合にもプロジェクトの統合時の参照抜けリスクが減らせるため有効な手法ですね。
[Rails]コントローラ名、アクション名、URLなどを取得する

ページにアクセスした際にRails側で

- コントローラ名
- アクション名
- URL

などを取得します。

# 想定する状況
マイページ（http://localhost:3000/mypage）
から
記事投稿画面（http://localhost:3000/articles/new）
に移動したときにコントローラで`binding.pry`を使って処理を止めてみます。

## コントローラ名

`controller_name`

```
[1] pry(#<ArticlesController>)> controller_name
=> “articles”
```

## アクション名

`action_name`

```
[2] pry(#<ArticlesController>)> action_name
=> “new”
```

## HTTPメソッド名

`request.method` または `request.request_method`

```
[3] pry(#<ArticlesController>)> request.method
=> “GET”
[4] pry(#<ArticlesController>)> request.request_method
=> “GET”
```

## アクセスするURL

`request.original_url`

```
[5] pry(#<ArticlesController>)> request.original_url
=> “http://localhost:3000/articles/new”
```

## アクセスするURL（ドメイン省略）

`request.fullpath`

```
[6] pry(#<ArticlesController>)> request.fullpath
=> “/articles/new”
```

## 直前のページ

`request.referer`

```
[7] pry(#<ArticlesController>)> request.referer
=> “http://localhost:3000/mypage”
```
**`referer`**だよ。`referrer`じゃないよ。
>本来、参照元という意味の英単語は「referrer」であるが、HTTPリファラの場合は意図的に「referer」と綴る場合がある。これは、HTTPが策定された時にヘッダ名を間違ったスペルで書いてしまい、それが今でも使われている、という歴史的経緯のためである。

　[HTTPリファラ - Wikipedia](https://ja.wikipedia.org/wiki/HTTP%E3%83%AA%E3%83%95%E3%82%A1%E3%83%A9#%E7%B6%B4%E3%82%8A)より

# まとめ
```
[1] pry(#<ArticlesController>)> controller_name
=> “articles”
[2] pry(#<ArticlesController>)> action_name
=> “new”
[3] pry(#<ArticlesController>)> request.method
=> “GET”
[4] pry(#<ArticlesController>)> request.request_method
=> “GET”
[5] pry(#<ArticlesController>)> request.original_url
=> “http://localhost:3000/articles/new”
[6] pry(#<ArticlesController>)> request.fullpath
=> “/articles/new”
[7] pry(#<ArticlesController>)> request.referer
=> “http://localhost:3000/mypage”
PS1変数について小ネタ

#はじめに
この方の[記事](https://qiita.com/ttt_okamoto/items/a1efa279df8f9ce3965d)を読んで、シェルについて投稿しようと思いました。

#プロンプトのカスタマイズはどうやってますか？
以下のように、一般ユーザなら「$」、ルートなら「#」を明示的に書く人が多いのではないでしょうか。

```bash:~/.bash_profile
　：
export PS1='$ '
　：
```

このやり方の欠点は、各ユーザの環境設定ファイルを編集する必要があります。

そこで以下のように実行してはいかがでしょうか。

```bash:/etc/profile
　：
export PS1='\$ '
　：
```

/etc/profileの1ファイルに記述をするだけで、***ルートユーザなら「#」、一般ユーザなら「$」のプロンプトに自動的に変わる***ので、各ユーザの環境設定ファイルを編集しなくて済みます。

'\$'の前には、ホスト名(\h)やユーザ名(\u)など設定することもできますよ。
他にもいっぱいできるけど、現実的なものはホスト名、ユーザ名くらいかと

#まとめ
/etc/profileにPS1='\$ 'を書こう！
commit failed - exit code 1 received with output: git: 'secrets' is not a git command. See 'git --help'.の対処法

このエラーを調べても中々対処法が書いてないので、記述しときます。
このエラーが何かというとコミットする際にgit-secrets利用するファイルがあるけど、git-secrets無いからコミットできないですよーと言ってます。自分なりの解釈ですが笑

このエラーが出た際に対処する方法は主に２つあります。

１つ目は
リポジトリ内にある.git/hooksにある「commit-msg, pre-commit, prepare-commit-msg」という実行ファイルを削除する方法です。こちらで解決します。
これは隠しファイルなのでmacの場合ショートカットキーで

```
[command] + [shift] + [.(ドット)]
```
で表示できます。
ですが、これだと毎回同じ作業をする事なるので少し気が進みません。

2つ目は
Homebrewにgit-secretsをインストールする事で解決します。

```
$ brew install git-secrets
```
こちらのコマンドを入力すればOKです。
これでコミット出来る様になったと思います！
スタートアップのあれこれ、RUNTEQのあれこれ


みなさん、こんにちは！
RUNTEQの運営・広報・開発を担当しているおおしろたかこです！
IT業界に飛び込んで、入社して半年、これまでのことを振り返りつつ、RUNTEQで学んだことをみなさんにお伝えできればと思います！

## 対象
スタートアップに興味がある
未経験で実務に入るとどんな感じなのか知りたい


## 1.Ruby・Railsの習得・そして開発！
私は未経験、しかも習得状況がまだまだの状況だったので、まずはRUNTEQの課題に0期として取り組んでいました。
驚くほどわからないこと、わからないこと…
本当に０から学習していました。上司の方にどれほどお世話になっているのやら…

11月に初めて開発にジョインさせていただいたのですが、RUNTEQの課題をやってたからこそなんとか少しは開発できたのかなと思っています。
個人的に役に立ったことをポイントを絞って幾つか紹介します。

###コードリーディング
今回認証の部分でポリモーフィックの概念を使ったのですが、意外と参考記事が少なく理解するのに本当に苦しみました。
その少ない記事のコードを理解してなんとかしないといけない時に、コードリーディングの力が必要でした。

RUNTEQの応用編では、既存のプロジェクトに途中参画する前提なので、必然的にコードを読む必要があります。また、ポリモーフィックや、たくさんのバグが仕込まれているコードを読み解いて実装することは独学で学習しているときには学べないことだと思います！
私は、今回ゼロから開発することができましたが、通常就職するとすでにプロジェクトがあって入社することが当たり前だと思うので、既存のコードがどうなっているのか、その会社のルールがある場合がほとんどだと思うのでそこに少しでも慣れるにはいい課題だと思います！

###設定関連
i18nやヘッダー・フッターの設定、初期化の設定などなど、当たり前のことが個人や独学でやっていると気づけないので細かく指摘をいただけるのは本当にありがたいです。
意外と見逃していがちな設定ですが、開発が進んでいく上で必須の知識だと思いました。

### 画面遷移作成やテーブル設計の経験
RUNTEQではポートフォリオを作る際に、画面遷移作成、テーブル設計などを指導・レビューしています。開発に入るということはゴールがある程度見えてないと間違った方向に進んでしまいます。また、テーブル設計は開発をする上で最も大事とも言えることではないかと私は今回の開発を通して思いました。
実は今回、データの保存に関する認識が間違っており、リリース3日前に気づいて絶望しました…
最初の時点と開発をすすめる中で少し方向性が変わったことが原因ではありますが、方向性が変わったときに設計や画面遷移の修正ができていなかったことが最大の原因です。
期限が迫ってきているときこそしっかり設計を整えて開発をしていくべきだとものすごく勉強になりました。仕様を隅々まで確認することはものすごく重要だと思いました！！


##2.コミュニティの運営
現在、RUNTEQのもくもく会や受講生とのやりとりを全般的にしていて、それぞれプログラミングを学ぶ背景が違っていたり、家庭の事情がちがったり、本当に色んな方がいます。
そんな中で、コミュニティの運営は本当にめちゃくちゃ難しい仕事だなと思います。
また、全くコミュニティの運営ということをしたことがなかったのですべてが手探りな状況です。社長や上司の方には、たくさん助けていただいてます。
まだ、コミュニティとしては小さいのですが、今後もっと拡大していきたいのでブランディングや活動に参加してもらうことも考えないといけないなと感じています。
今、RUNTEQのことを、積極的に発信してくれている受講生には感謝しかありません。
今後もRUNTEQを盛り上げていきたいので、ご意見・ご要望お待ちしております！！！！


##3.広報活動
全くやったことがなかったのですが、RUNTEQの記事を書いたり、SNSアカウントの運用をしたり、イベントを開催したり、とにかくやれることはやってみる！といった感じでやっていました。笑
一番苦戦したのはブログの記事でした。
おわかりの通り、日本語がめちゃくちゃ下手くそです。笑
小綺麗なセンスのいい文章は全く書けません。笑
最初に書いた記事は、本当に小学生が書いたみたいな記事でした。笑
元々広報として活動されている社内の方にたくさん指導していただき、多少は見られる記事になってきたかなと思っています！
また、最近YouTubeに動画を定期的にアップしていくこともはじめました！
元々動画や写真はやってきた分野なのでまた、新たなやりがいができて本当に楽しいです！
今後も、広報活動ももっと精力的に継続していきたいです。


##4.スタートアップのやりがい
私は、RUNTEQ事業に共感してサービスを作っていきたいと思ってジョインさせていただきました。
とにかくサービスをよりよいものにしたいと一丸となってやっていく事業部の雰囲気が大好きです！スタートアップたのしい！となっています！笑
社会人になってもこんなに熱く真剣にサービスと向き合って一喜一憂しながら仕事をさせていただくことが本当にありがたい環境だなと思っています。
もちろん、辛いこともたくさんありますが、最終的にはサービスに貢献できているのであれば、割と何でもチャレンジしてがんばれます！笑
**スタートアップ最高！！！**


##おわりに
IT業界未経験、開発もまともにできない私を拾ってくれて、たくさん学ぶ機会を与えてくれる会社には本当に感謝しかないです。
よく、エンジニアなの？広報？営業？動画マン？など言われることが多いのですが、すべてはサービス貢献につながればと思って何でもやっています！笑
もちろん、エンジニアとしてのスキル向上も目標です。
来年の目標もいろいろ掲げてちょっとずつ動いています。
今後も学習を続けてサービスをよりよいものにしていきつつ、スキル向上していけるよう精進致します！
Qiskitのインストール


この記事は[静大情報LT大会 Advent Calendar 2019](https://adventar.org/calendars/4733) 21日目の記事です。

#はじめに
Qiskitのインストールで苦労したので、環境構築も含め、その手順を書きます。

#Qiskitとは
IBMが提供する、クラウド上で利用可能な量子コンピュータ「IBM Q Experience」をローカルで利用するために必要なPythonのライブラリです。

#環境

- Windwos10

#アカウント作成
[IBM Q Experience](https://quantumexperience.ng.bluemix.net/qx/experience?_ga=2.112651264.560271821.1575446446-1806712598.1572994574)にアクセスしアカウントを作成します

#Anacondaのインストール
以下のページにアクセスして、Anacondaのインストーラをダウンロードします。

- https://www.anaconda.com/distribution

Anacondaのインストールについては、[こちらの記事](https://qiita.com/t2y/items/2a3eb58103e85d8064b6)を参考にしました。

#Anaconda内に仮想環境を作成する
Anacondaをインストールした後、Anaconda Promptを起動し、作業したいディレクトリに移動し、以下のコマンドを入力して仮想環境を作成します。

```:Anaconda&nbsp;Prompt
$ conda create -n 環境名 python=3
```
仮想環境を作成するのは、CondaパッケージのQiskitが無く、Anaconda上でpipを使用してQiskitをインストールする必要があるためです。そして、以下のコマンドを入力して作成した仮想環境を起動します。

```:Anaconda&nbsp;Prompt
$ activate 仮想環境名
```

#Qiskitと依存関係のあるパッケージのインストール
一度pipでQiskitのインストールを試みます。

```:Anaconda&nbsp;Prompt
$ pip install qiskit
```
これで何のエラーが出力されなければよいのですが、自分の場合はCVXOPTというライブラリが無いと怒られてしまったので、以下のようにインストールしました。

```:Anaconda&nbsp;Prompt
$ conda install cvxopt
```
ちなみに、ここでpipを使用するとエラーが出力されました。これにより、pipとcondaコマンドを併用しなけらばならず、Anacondaの環境が壊れる可能性があるということです。これも仮想環境を作成した理由の一つです。必要なライブラリのインストールが終わったら、もう一度前述のQiskitのインストールをするコマンドを実行します。その後、Qiskitで使用可能な表示機能を使う上で必要となるオプションの依存関係のインストールのために以下のコマンドを実行します。

```:Anaconda&nbsp;Prompt
pip install qiskit-terra[visualization]
```
これについてもエラーメッセージが表示された場合には、依存関係のあるライブラリ等をインストールした後、再実行してください。

#Qiskitの環境のセットアップ
1.で作成したアカウントにログインし、My Accountのページに移動します。
![my_account_circle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441972/b268999b-4d2c-eded-5b64-fb7450f075de.png)


以下の画像にあるCopy tokenを選択します。
<img width="279" alt="token.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441972/9405853e-8929-b7bb-7ed5-aa0e7a6bb5c7.png">

そして、Pythonの対話モードを起動し以下のコマンドを入力します。
`MY API TOKEN`と書かれた箇所を、先ほどコピーしたトークンで置き換えてください。

```
>>> from qiskit import IBMQ
>>> IBMQ.save_account('MY API TOKEN')
```
もしくは、上記の内容を例えば`token.py`などのようにファイルとして保存して、実行してください。

以上でQiskitのインストールと環境構築は終わりです。お疲れさまでした。
[ Android ] NoMachingViewException

AndroidTestをするうえでNoMachingViewExceptionというエラーが発生した。

例えば以下のようなコードでテストしたときである。

~~~java
onView(withText("test")).check(matches(not(isDisplayed())));
~~~

このコードはダイアログが表示されていないことを確認するために、ダイアログ上の文字列"text"が画面にないということを確認するプログラムであった。しかしNoMachingViewExceptionというエラーが発生した。

このエラーはつまり、"text"という文字列を持ったViewが存在しないことを示している。

私は以下のようにコードを追加することで、エラーを解消できた。

~~~java
new Thread (new Runnable(){
    @Override
        public void run() {
             //エラーが発生したテストコードを記述
        }
}
~~~

もしNoMachingViewExceptionが発生したら試していただきたい。
ただしなぜ通るのかは検討の余地があるので自己責任で…
Javascriptレシピ③

Javascriptの簡単なメモです。
アプリ制作に応用できる基本レシピですので、参考にされたい方はどうぞ。

###parseIntメソッド


グローバル関数で文字列を整数に変換してくれます。

```js

parseInt('100',2);
```
２進数で１００と表示されたものを１０進数に変換しています。

parseFloatは浮動小数点リテラルを使用することが出来るので、２．０のように小数点表記したければ使いましょう。

numberメソッドは浮動小数点を扱うことが出来るのですが、文字列に対応できません。


###innerHTMLメソッド

html要素の中身を変更することが出来ます。

```js

element.innerHTML = '';
```
こうするとelement要素の内容が空になります。



###joinメソッド

配列の文字列を連結することが出来ます。

```js

const wanko =['toy','poo'];
const result = wanko.join('');
//デバッグするとtoypoo

const wanko =['toy','poo'];
const result = wanko.join();
//デバッグでtoy,poo

const wanko =['toy','poo'];
const result = wanko.join(':');
//デバッグでtoy:poo
```

###concat


concatメソッドも文字列の連結をすることが出来ます。

```js

const arr1 = [1,2,3,4,5,6];
const arr2 = [];

arr2 = arr1.concat();
arr.push(7);



console.log(arr2);
//[1,2,3,4,5,6,7]

//ここで重要なのはconcat()が新しい配列を返してくれるということです。
```

###match

matchメソッドは正規表現で指定した値があるかどうかを返してくれます。
該当する文字列がない場合はnullが返ってきます。

```js

var str2 = "123-4567, 000-1111";
console.log( str2.match( /\d{3}-\d{4}/g ) );
```

正規表現は呪文のようですが使えると便利そうで楽しかと思います。


###locationオブジェクト


locationオブジェクトにはURLに関する情報が格納されています。
UPLからパラメータを取得したり、指定したアドレスに移動したりする時に使います。

```js

console.log(location);
//いろいろな情報が沢山デバッグされます。

const url = location.href;
console.log(url);
//urlが戻り値として変数にかくのうされています。

location.href = 'http://wankowankowanko';
//該当したページに遷移出来ます。

```

###真偽値・三項演算子

真偽値とはtrueとfalseのことです。
値なので''で囲う必要はありません。

三項演算子はif文の代用になるものです。
かなりの頻度で使うかと思います。

```js

const wanko = 'toypoo';
const dog = wanko === toypoo ?1 :2
```

trueの時は?の１
falseの時は:の２
が変数に格納されます。


###alertメソッド
```js

alert('wanko');
```
警告ウィンドウが表示されます。


###confrimメソッド

```js

const wanko = confirm('toypooですか？');
document.write(answer);
```
確認のダイアログが表示されます。
yesの時はtrue,noの時はfalseを返します。

###prompeメソッド

promptメソッドは入力ダイアログボックスを表示させます。

```js

const wanko = prompt('名前は？');
document.write(wanko);

//第二引数を指定すると初期値がセットされます。

const wanko = prompt('名前は？','わん');
document.write(wanko);

```

###serIntervalメソッドとsetTimeoutメソッド

setIntervalメソッドは一定時間ごとに特定の処理を繰り返します。
setTimeoutは一定時間後に特定の処理を一度だけ行います。

```js

const count = 0;
const countUp = () => {
    console.log(count++);
}
setInterval(countup,1000);

//これを
setInterval(()=>{
    console.log(countUp++);
});

//とも書けます。

//処理を止める時はclearIntervalを使います。
//その場合はidを決めてあげましょう。

const count = 0;
const countUp = () => {
    console.log(count++);
}
const id = setInterval(()=>{
    countUp();
    if(count > 100){
        claerInterval(id);
    }},1000);

```

###if文

上から順に処理されるので各順番に気をつけましょう。

###switch文

ifよりスマートに書けます。

```js

const dog = 'toypoo';
switch(dog){
    case'toypoo':
        document.write('write');
        break;
    case'pome':
        document.write('');
    case'siba':
        document.write('');
        break;
    default:
        document.write('dog');
}


//caseからbreakまでがひとかたまりです。
```
Rails6.0.2のActiveRecordに関する変更点まとめ

[Ateam Finergy Inc. Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ateam-finergy)の21日目です。

今回は、前回10日目に投稿した[Rails6.0.2の変更点まとめ](https://qiita.com/taiteam/items/6eaf765323f70dc05ff8)の続きになります。
前回は`Active Support`,`Active Job`,`Action Pack`,`Railties`について記述しました。
今回は`ActiveRecord`についてです。

- 参照
  - [Rails 6.0.2 released](https://weblog.rubyonrails.org/2019/12/13/Rails-6-0-2-has-been-released/)
     - [rails/CHANGELOG.md at v6.0.2 · rails/rails](https://github.com/rails/rails/blob/v6.0.2/activerecord/CHANGELOG.md#rails-602-december-13-2019)

# 1. マルチDBのトランザクションテストの修正
マルチDBのトランザクションテストの際、プライマリーとレプリカで同じコネクションプールを共有するようになっています。
プライマリーで作成したレコードをレプリカから参照できない、というバグの修正になります。

- 参照
  - [Fix connection pools not shared between writer -> replica during tests](https://github.com/rails/rails/pull/37774)

# 2. associationの`throw :abort`時の処理を修正
`ActiveRecord::Associations`で`throw :abort`した場合に、コールバックチェーンが停止しないバグがあったのを修正しています。

- 参照
  - [Fix collection callbacks not terminating when abort is thrown](https://github.com/rails/rails/pull/37658)

# 3. `where.not`の非推奨メッセージの表示条件を修正
Rails6.0.0から、`where.not`が否定論理和(NOR)として動作することが非推奨となりました。
その非推奨のメッセージを表示する条件に一部不具合があったため、修正しています。

- 参照
  - [Deprecate `where.not` working as NOR and will be changed to NAND in Rails 6.1](https://github.com/rails/rails/pull/36029)
  - [Correctly deprecate where.not working as NOR for relations](https://github.com/rails/rails/pull/37598)

# 4. `db:migrate`実行後のDBコネクションを修正
`db:migrate`タスクを実行した後、タスク実行前に接続していたDBコネクションに再び接続するように修正しています。

- 参照
  - [Reestablish connection to previous database after migrating:](https://github.com/rails/rails/pull/37601)

# 5. `AcceptanceValidator`のマルチスレッド処理のための修正
`AcceptanceValidator`は、フォーム上のチェックボックスがオンになっているかどうかの検証を行なっています。
今回の修正では`Mutex`という排他制御のためのクラスを使って、マルチスレッドでも正しく動作するようにしてます。

- 参照
  - [Fix multi-threaded issue for `AcceptanceValidator`](https://github.com/rails/rails/commit/98754de1412870d7dae9eba1c7bac944b9b90093) 

# 6. 最後に
`ActiveRecord`についての変更もバグ修正ばかりでしたね。
引き続き、Rails6の品質がより向上していくことを期待しています。
FuelPHPでarray_merge(): Argument #2 is not an arrayと出た時の対処法

FuelPHPで友人から`array_merge(): Argument #2 is not an array`とエラーが出て対処法がわからないと言われて、直すまでめっちゃ苦労したのでメモとして残しておきます。
# 原因
めっちゃ単純だった。
コントローラの記述は本来であればこうあるべき。というかこうでなきゃいけない。

```php
<?php
# 以下略
```
それがこうなっていた。

```php
<? php
# 以下略
```

`<?`と`php`の間にスペースが入っていただけだった。
このエラーに気づくまで1時間以上かかった。
これに気づいた瞬間**「あああクソッタレがあああああああ」**ってなりました。

# 最後に
単純なエラーほど気づかないよね。意外と。
コミュニティ対抗戦で使用したクイズゲームのお話

この記事は、[MAヒーローズ・リーグ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/heroesleague)の20日目の記事になります。

#はじめに
Festaで実施されたコミュニティ対抗戦のクイズゲームのお話です。

もともと昨年実施した結婚式の余興用のアイテムでした。
当時はクイズゲームではなく、アンケート方式（多数決）のみ。

今年の3月に大阪であった[LineThingsハッカソン](https://code4osaka.connpass.com/event/116814/)で、LineThingsに対応させ、画面もLIFF化すると実施が簡単になり、今年で７回くらいクイズ実施してます。
たぶん自分が作った作品の中でも最多に近い利用回数。
MAリーグ用にいろいろ改良したけど発表の機会がなかったので
ここでがっつり説明書書きます。

#仕組みについて
親子１台と、子機４台の構成
親機は、LineThingsデバイスとWiFiのAPとして機能し、子機はWiFiで親機に繋がり通信する感じ
ESP8266をAPとして使うと、繋がるのは４台までなので同時に参加人数は4人です。

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/3fdbe148-f894-d839-39ad-d1b71d5dc087.jpeg"/>

ボタンはこんな感じ
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/00b4fabd-4145-24d9-cad1-84e3aa12e22e.jpeg">

ブレッドボードだと持ち運びに弱いのでホットボンドでガチガチに固めてます。
来年はもう少しかっこよくしてみたい。

あと、 エンジニアさんは基本蓋を開けたがるので
「中身を見るのは、クイズが終わってからお願いします」と最初にお話するが定番化してきました。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/5acdb8ea-3691-beec-fc3e-b7f16b2e3ffa.jpeg" />

そしてグダグダ親機
BLEとWiFiの同時使用でFlash足らなくESP8266との二台構成
この辺りがバグの温床に・・
※NoOTA設定で、１台構成にできることをあとで知りました。。

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/fe956417-2d36-cb72-bd44-edbfcac946c4.jpeg" />

クイズはすべてLIFFで作成可能です！
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/dab1db00-dcf4-9aa0-e301-6dd319923f58.jpeg" /><img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/1300d010-52b7-7a4b-c2ba-77bdd98ba2ec.jpeg" />

対抗戦用に用意したのが、表示名を変更できる機能と、クイズをネットから追加する機能
この機能のおかげで対抗戦の２回戦が実施できました。
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/26abdc2d-c0b9-702f-72b2-202882f71077.jpeg" /> <img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/63ba745a-b8fc-eba1-b921-a707b9527e49.jpeg"/>


#クイズについて
クイズはスマホを横表示にして使います
※LINEって横画面対応なんですよ？知ってました？

問題から始まり・・
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/d2eab9b6-687d-a06d-73c9-ec18405f8c72.png"/>

四択が表示し・・
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/7fe2ebc0-3189-d11d-04a8-ee7922bffecb.png"/>

回答状況が表示され・・
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/8a5c823a-f733-e4ba-2b03-1d3479e3cfe6.png"/>

早押しの一覧が表示される
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/c9462f39-dc18-4455-31b7-59edf9dd01b1.png"/>

ここまでが一連の流れ

ちなみに、こんな感じで画像問題にも対応してます。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/264b06e0-b113-3dad-3a96-c37cdce09fb4.jpeg"/>

#対抗戦

こんなゆるい感じで実施
各コミュニティに用意いただいた珠玉のクイズを出したり
某番組風に事前に撮影した動画クイズがあったりと
・・いろいろ変な動作があったり・・

少しでは楽しんでいただけたのではないかなと思ってます。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/755a1579-efd2-3b6b-34ed-0ed14ce6c392.jpeg" />

#最後に
問題の１枚
４人しか参加できないのに、プレイヤーが２人増えた。
なぜだろう。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189829/c6047d2b-1917-0ca8-ce5f-f6f2904dfb58.jpeg"/>
Rustで巨大な整数を扱う

# 0. はじめに
この記事は, [Rustその2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/rust2)の21日目の記事です。
最近CTFにハマっていて, 巨大な整数を扱う機会がありました。そこで, Rustで用いることができる[num-bigintクレート](https://docs.rs/num-bigint/0.2.3/num_bigint/index.html)の中にある「BigInt」の使い方（基本的なところ）をまとめたいと思います。

# 1. 実行環境
- OS : Windows10 Home
- rustc 1.39.0 (4560ea788 2019-11-04)
- num-bigint = "0.2.3"

# 2. ディレクトリ構成
今回の実行環境は, 「cargo new bigint --bin」で生成し, 以下のようなディレクトリ構成となります。

```
bigint/
　┠ src/
　┃  ┗ main.rs
　┗ Cargo.toml
```

# 3. 事前準備
## 3-1. Cargo.tomlの設定
Cargo.toml の[dependencies]に以下を追記します。今回は執筆時の最新バージョンである"0.2.3"を設定していますが, 使用したいバージョンがある場合は適宜変えてください。

```Cargo.toml
num-bigint = "0.2.3"
```

## 3-2. main.rsの設定
ソースコードに以下を追記します。

```rs:main.rs
use num_bigint::BigInt;
```

# 4. 基本的な使い方
ここから本題です。

## 4-1. 定義
基本的に, BigIntは, ある変数に数値の文字列（例："3248238549023850492380"）を入れ, その文字列をパースすることで定義することができます。

```rs:main.rs
use num_bigint::BigInt;

fn main() {
    let s = "3248238549023850492380";
    let n: BigInt = s.parse().unwrap();

    println!("{}", n);    // 3248238549023850492380
}
```

## 4-2. 四則演算と剰余
BigIntは普通の数値（int32やusizeなど）と同じ感覚で四則演算ができます。また, %を用いて余りを出すこともできます。ただ, BigIntはCopyトレイトを実装していないため, sum = n + n2 のようにやってしまうと, nとn2がmoveしてしまいます。よって, &をつけて計算します。

```rs:main.rs
use num_bigint::BigInt;

fn main() {
    let s = "3248238549023850492380";
    let s2 = "3248238549023850492379";
    let n: BigInt = s.parse().unwrap();
    let n2: BigInt = s2.parse().unwrap();

    let add = &n + &n2;
    let suv = &n - &n2;
    let mul = &n * &n2;
    let div = &n / &n2;
    let rem = &n % &n2;

    println!("add: {}", add);  // 6496477098047700984759
    println!("sub: {}", sub);  // 1
    println!("mul: {}", mul);  // 10551053671364569578520014120677744587572020
    println!("div: {}", div);  // 1
    println!("rem: {}", rem);  // 1
}
```

## 4-3. 比較
比較も普通の数値と同じ感覚で可能となっています。s1とs2を変えて挙動を確認してみてください。

```rs:main.rs
use num_bigint::BigInt;

fn main() {
    let s1 = "100000000000000000000";
    let s2 = "-100000000000000000000";

    let n1: BigInt = s1.parse().unwrap();
    let n2: BigInt = s2.parse().unwrap();

    // n1 > n2 と表示される
    if n1 > n2 {
        println!("n1 > n2");
    } else if n1 < n2 {
        println!("n1 < n2");
    } else if n1 == n2 {
        println!("n1 == n2");
    }
}
```

# 5. 使えそうなメソッド
使えそうなメソッドを紹介します。

## 5.1 sqrt
sqrt()で, 平方根を求めることができます。

```rs:main.rs
use num_bigint::BigInt;

fn main() {
    let s = "100000000000000000000";
    let n: BigInt = s.parse().unwrap();

    let n_sqrt = n.sqrt();
    println!("n_sqrt: {}", n_sqrt);  // 10000000000
}
```

## 5.2 sign
sign()で, その数値の正負の符号を得ることができます。

```rs:main.rs
use num_bigint::BigInt;

fn main() {
    let s1 = "100000000000000000000";
    let s2 = "-100000000000000000000";
    let s3 = "0";

    let n1: BigInt = s1.parse().unwrap();
    let n2: BigInt = s2.parse().unwrap();
    let n3: BigInt = s3.parse().unwrap();

    let n1_sign = n1.sign();
    let n2_sign = n2.sign();
    let n3_sign = n3.sign();

    println!("n1_sign: {:?}", n1_sign);  // Plus
    println!("n2_sign: {:?}", n2_sign);  // Minus
    println!("n3_sign: {:?}", n3_sign);  // NoSign
}
```
【Rails】子テーブルの集合から親テーブルのインスタンスを重複を除いて取得する方法

##はじめに 
初学者がポートフォリオ作成でハマったことをメモします。
魚の食味投稿サービスを作成中。
##環境
Ruby 2.6.3 ,Rails 5.2.4

##やりたいことと結果
・やりたいこと
子テーブルの集合から親テーブルのインスタンスを重複なく取得したい。
・結果
`Fish.joins(:reviews).distinct`

##前提
親テーブル　fishes
子テーブル　reviews

Fishインスタンスに複数のReviewインスタンスが紐づいている。

```
class Fish < ApplicationRecord
  has_many :reviews

class Review < ApplicationRecord
  belongs_to :fish
```

##やりたいこと(詳細)
投稿(review)を魚(fish)の種類で検索する為に、複数の投稿に含まれる魚の名前をselectの選択肢に表示したい。
その為に、Reviewインスタンスの集合に紐づいているFishインスタンスを重複なく取得したい。
つまり、reviewsレコードのfish_idがfishesレコードのidと一致する、fishesレコードを重複なく取得したい。



##コード

joinsメソッドを使ってreviewsテーブルとfishesテーブルを内部結合することが出来る。

```
Fish.joins(:reviews)
```


このままレコードを取得すると同じfish.idを持つレコードが重複してしまう、そこで
<br>

```
Fish.joins(:reviews).distinct
```

`distinct`を使うと重複をのぞくことができる。　
<br>

発行されるSQL

```
SELECT DISTINCT "fishes".* FROM "fishes" INNER JOIN "reviews" ON "reviews"."fish_id" = "fishes"."id"
```
<br>
検索部分のコード

```
= f.select :fish_id_eq, options_for_select(Fish.joins(:reviews).distinct.map{|fish| [fish.name , fish.id]}) ,{include_blank: "指定なし"},class: "js-selectable"
```