OmniAICreator/Qiita-1.07M huggingface dataset:
【ReactNative】タイムゾーン無し文字列をDate()に渡した時の挙動がiOS14から異なる件

# 概要
`iOS14`の公開に伴い`react-native`で開発したアプリの挙動を確認していたら、何やら日時がずれているのを発見しました。
細かく処理を追跡していったところ、どうやら`Date(string)`の挙動が若干変わったようです。

***※個人ブログで同様の記事を書いています。今後追記があればそちらを更新していきます。***

- [ネコニキの開発雑記 | 【ReactNative】iOS14とそれ以前でタイムゾーン無し文字列のDate型コンストラクタの挙動が異なる](https://nekoniki.com/20201014_react-native_ios_date_constructor)

# 環境
- `react-native@0.63.1`
- `iOS14`
- `2020/10/14`時点の情報です(今後のアップデートで修正される可能性あり)

# コンストラクで文字列を渡している場合は注意
例えば以下のように文字列から`Date`型のコンストラクタを利用した場合です。
サンプル①は`ISO-8601`の拡張形式のタイムゾーンを指定していない形式です(この時点でオラオラ仕様なのも問題なのですが・・・)。

```javascript

// サンプル①
const sample1 = '2020-10-10T00:00:00';
// サンプル②
const sample2 = '2020/10/10 00:00:00';

// それぞれDate型にキャストする
const result1 = new Date(text1);
const result2 = new Date(text2);

// 結果を表示
console.log('result1 --> ', result1.toString());
console.log('result2 --> ', result2.toString());
```

この実行結果が`iOS14`前後で異なります。
それぞれ以下の通りです。

## 出力結果(iOS14未満)

```

result1 -->  Wed Oct 14 2020 09:00:00 GMT+0900 (JST)
result2 -->  Wed Oct 14 2020 00:00:00 GMT+0900 (JST)
```

## 出力結果(iOS14)

```

result1 -->  Wed Oct 14 2020 00:00:00 GMT+0900 (JST)
result2 -->  Wed Oct 14 2020 00:00:00 GMT+0900 (JST)
```

サンプル①の場合の結果が変わっているのが分かります。

# まとめ
そもそも渡している文字列が正しいフォーマットから少し外れたものであるのも悪いですが、`iOS14`前後でタイムゾーン無しの文字列を渡した際の解析処理が変わったのだと思います。
`react-native`固有の事象なのか、`iOS`のネイティブ部分が変わった故なのかいまいち判断がつかない(そこまで知識がない)のですが、同様の事象に遭遇される方もいるかと思うので記事にしました。
brew extract で yarn をインストールする方法

## はじめに
yarn のバージョンを変えようとして詰まったのでメモ。
`brew install formula_raw_path` で行こうと思ったら詰まりました(_ _).｡o○

追記： 普通にこれでいけるよ

```shell
$ npm install -g yarn@1.22.5
```

## brew install formula_raw_path は使えなくなっている
```shell
$ brew install https://raw.githubusercontent.com/chenrui333/homebrew-core/461e36f85942f576d25faccfed1bf0e0000773a2/Formula/yarn.rb
Error: Calling Installation of yarn from a GitHub commit URL is disabled! Use 'brew extract yarn' to stable tap on GitHub instead.
```

## brew extract yarn
「`brew extract yarn` を使ってくれ」と言われたので、いろいろ記事を漁りながら手元でやってみる。
 

### tap 用リポジトリの用意

```shell

$ brew tap-new arashida/taps
Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/arashida/homebrew-taps/.git/
[master (root-commit) f5198d4] Create arashida/taps tap
 3 files changed, 84 insertions(+)
 create mode 100644 .github/workflows/publish.yml
 create mode 100644 .github/workflows/tests.yml
 create mode 100644 README.md
==> Created arashida/taps
/usr/local/Homebrew/Library/Taps/arashida/homebrew-taps
```

### 対象の formula を展開

```shell

$ brew extract yarn arashida/taps --version 1.22.5
==> Searching repository history
==> Writing formula for yarn from revision 9591758 to:
/usr/local/Homebrew/Library/Taps/arashida/homebrew-taps/Formula/yarn@1.22.5.rb
```


### インストール

```shell

$ brew install arashida/taps/yarn@1.22.5
==> Installing yarn@1.22.5 from arashida/taps
==> Downloading https://yarnpkg.com/downloads/1.22.5/yarn-v1.22.5.tar.gz
==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/49970642/2377bf00-e81c-11ea-92ab-28a657cb6dd4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F
######################################################################## 100.0%
```

### バージョンを確認

```shell

$ yarn -v
1.22.5
```

## 終わりに
無事インストールできた…

割と詰まったので誰かのお役に立てましたら幸いですm(_ _)m
「英数６文字以内」「全角のみ使用可能」「空欄ではエラーになる」というバリデーションをかけた

### 2020/10/21更新


# 結論

以下を利用した。

####with_options
条件付きバリデーションをグループ化できる。do endで囲って使用する。
####presence: true
空でないことを確認する。
####format:
withオプションに記述した正規表現が送られた値とマッチしているか検証する。
####/\A[ぁ-んァ-ン一-龥]+\z/
Unicodeにおける範囲でひらがな、カタカナ、漢字と一致しているか調べる。これらでは不完全だが、一般的な日本人用としては十分だと思われる。

**追記**
ゔまで含めたければ、[ぁ-ゔ]
ヴまで含めたければ、[ァ-ヴ]
https://qiita.com/kokorinosoba/items/78811d7e2b6bc424b1b1

漢字の抜け漏れを無くしたい場合には[\p{Han}]
※\P{Han} は漢字以外だそうです。
日本語中国語韓国語ベトナム語の感じ全てを含めたい場合には[\p{Ideographic}]
です。
使い方は数字の[\d]と同じように[a-z\p{Han}]のように使えます。

https://techracho.bpsinc.jp/hachi8833/2013_09_13/13433

####/[a-z\d]{6,}/i
~~大文字小文字可能で、英字もしくは数字６文字以上であるか確認する。~~
これはアルファベット（大小問わず）または数字が6文字以上含まれているかチェックするもの。
英字かつ数字が必ず含まれているかチェックするには以下の表現が必要。

```
\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i
```

?=はそれ以降の文字列の中から[a-z]があるかを調べる。という意味。
これがないと先頭の文字1文字をみて判断してしまう。

理解が進んだら更新します。


{6,20}とすれば６文字以上２０字いないと指定できる。
#### message
ここにエラーの時に出るメッセージを記述する。

# 不足しているコード

```ruby:models/user.rb
  with_options presence: true, format: { with: /\A[ぁ-んァ-ン一-龥]+\z/, message: 'に全角文字を使用してください' } do
    validates :family_name
    validates :first_name
  end

  validates :password, format: { with: /[a-z\d]{6,}/i, message: "は6文字以上の英数字が使えます" }

end
```

# 十分なコード
```ruby:model/user.rb
  with_options presence: true, format: { with: /\A[ぁ-ゔァ-ヴ\p{Ideographic}ａ-ｚＡ-Ｚ０-９]+\z/, message: 'に全角文字を使用してください' } do
    validates :family_name
    validates :first_name
  end

  validates :password, format: { with: /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i, message: "は6文字以上かつ英数字をそれぞれ含めてください" }

end
```

##### 全角のバリデーション結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693815/901dcc3c-1a3f-c60f-e5d2-7104952e0882.png)

##### 英数混合必須

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693815/8347a62d-0365-d3aa-3b92-197b72ba835f.png)


# 参考文献
Railsガイドのformatヘルパーの欄をご覧ください。
https://railsguides.jp/active_record_validations.html
基本的な正規表現一覧
https://murashun.jp/blog/20190215-01.html
runyの正規表現チェッカー
https://rubular.com/
マルチスケールシミュレーション特論まとめ

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

マルチスケールシミュレーション特論の講義内容などのまとめサイトです。


# 概要

1.  [README.orgの雛形](https://qiita.com/cyoukou/private/86d7bc308ef1c934c690)


# メニュー

・[Commandまとめ](https://qiita.com/cyoukou/items/27ae8fe873157d31252b)
・[Assert&rubular](https://qiita.com/cyoukou/items/ab6162ae521ac9fa2500) 
・[rake](https://qiita.com/cyoukou/items/67555d7b622e3b476d03)
・[Rubyのif,case](https://qiita.com/cyoukou/items/ee00bc4379ce664d56b0)
・[Rubyの変数とMethod](https://qiita.com/cyoukou/items/abbf8a64f9f99fa3e05c)
・[Rubyの入出力](https://qiita.com/cyoukou/items/08c70cce32ceaf92d8c5)


# 最終課題


## Google Recruit

[google recruit](https://qiita.com/cyoukou/items/4c62b72d9724771d4060)


## Roman Numerals

[roman numerals](https://qiita.com/cyoukou/items/c2a5df256b2769222e83)



------
 - **source** ~/grad_members_20f/members/wjswnsrud12/README.org
パスの種類

#パス

パスとはディレクトリやファイルの場所を示す文字列のことです。
ディレクトリは階層ごとに/(スラッシュ)で区切ります。パスの指定方法は、
 **絶対パス** と **相対パス** の2つがあります。

![パス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762918/00fd108a-5267-b77c-578f-a85285d692f8.png)

FinderなどのGUIとパスで示すことの違いは、
地図を元に場所を指差すのか、その場所の住所を伝えるのか、という違いと似ていますね。

次は、 **絶対パス** と **相対パス** について説明します。

#絶対パス

**絶対パスは ルートディレクトリから指定するパス です。**
Macの全ディレクトリにおけるルートディレクトリは /(スラッシュ)です。
全てのディレクトリやファイルはここから辿っていきます。
そのため、絶対パスで指定するときにはパスの一番最初に/（スラッシュ）を指定します。

```例:例：絶対パス
/Users/ユーザ名/Desktop
```

**ここで、一番始めの<font color="Red">/（スラッシュ）</font>はルートディレクトリを指し、2番目以降の/は階層の区切りを表している点を混同しないように注意して下さい。**

また、<font color="Red">/Users/ユーザ名</font>はホームディレクトリであり、**<font color="Red">~</font>**と表すことができるため、ホームディレクトリより下層にあるディレクトリのパスは以下のような絶対パスで示すこともできます。


```例:例：絶対パス
~/Desktop
```

![絶対.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762918/ad10a23d-6d13-2eac-7ab8-424daf3c36a0.png)

絶対パスは、どのディレクトリで作業していても指定した場所に移動できます。しかし、パスをルートディレクトリからたどって指定する必要があるため、記述が長くなってしまう場合もあります。

#相対パス
**相対パスは カレントディレクトリから指定するパス です。
ルートディレクトリから指定しないため、パスの始めに/(スラッシュ)をつけてはいけません。**

カレントディレクトリ直下のディレクトリやファイルであれば、どのようなディレクトリ階層にあるのか指定することなく簡単にパスの指定ができます。

```例:相対パス
# カレントディレクトリがホームディレクトリの場合にデスクトップの場所を指定する
Desktop

# カレントディレクトリがホームディレクトリの場合にデスクトップにあるファイルの場所を指定する
Desktop/メモ.txt
```

![相対.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762918/71f1ad7e-017d-2387-2783-6b6bf76c51b2.png)

相対パスは、記述をシンプルにパスの指定が可能となるメリットがあります。しかし、カレントディレクトリがどこにあるのかによって、指定するパスを変更する必要があります。

これらのパスは、階層を示す方法として必要な知識ですが、ターミナルでは
パスのみだと何も処理を命令することができません。
パスはPCへの命令と合わせることで使用します。

#まとめ

**絶対パスは、ルートディレクトリから指定するパスのこと。
相対パスは 、カレントディレクトリから指定するパスのこと。**

例えるなら、誰かに道案内をするときに「東京都〇〇区△△市...」と直接住所を伝えるのが絶対パス。相手の居る現在地から考え「そこからまっすぐ進んで2つ先の角を左に...」のように伝えるのが相対パスであるといえます。

####以上。
カジュアルにWSLを切り替える（WSL1⇔WSL2）

## 前提
 - 既にPCでWSL2が使えている状態。
 - WSL2を使っていたけど、特定のLinuxをWSL1にしたり、元に戻したりというニッチな用途を想定。

## やり方
PowerShellを管理者権限で起動（ショートカット：Winキー+Aなど）

#### 現状のバージョンを確認する
```
wsl -l -v
```

##### 実際の画面
インストールしたディストリビューションが表示される。

```
PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2
```

#### 切り替えコマンド（ダウングレード）
例では`Ubuntu-20.04`をWSL2からWSL1に切り替える。
※アップグレードの場合は末尾の数字を1から2に変える

```
wsl --set-version Ubuntu-20.04 1
```

##### 実際の画面
```
PS C:\WINDOWS\system32> wsl --set-version Ubuntu-20.04 1
変換中です。この処理には数分かかることがあります...
変換が完了しました。
```

## その他
インストールしたばかりの環境であれば数十秒で切り替わりました。
README.org

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# qiita\_links<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-14 水&gt;</span></span>

[README.org](https://qiita.com/djj31370/items/752f240c2d5cbb68b997)


# Ruby

1.  [puts](http://qiita.com/djj31370/items/2568387a2b8ab64a838c) <span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-21 水&gt;</span></span>
2.  [variable and method](https://qiita.com/djj31370/items/9aa303762a4974ff9be7) <span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-28 水&gt;</span></span>
3.  [条件分岐 (if, case), Array.each](https://qiita.com/djj31370/items/3aea247c86870bc9d6e7) <span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-04 水&gt;</span></span>
4.  [assert\_equal](https://qiita.com/djj31370/items/ed369a27168c23a37a3d) <span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-18 水&gt;</span></span>
5.  [Recursive Fibonacci:フィボナッチ数列](https://qiita.com/djj31370/items/67b6d5f6d51cb252f06c) <span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-25 水&gt;</span></span>
6.  [hello class](https://qiita.com/djj31370/items/79f926a341997fb796f4) <span class="timestamp-wrapper"><span class="timestamp">&lt;2020-12-02 水&gt;</span></span>


# 環境構築

1.  [emacs](https://qiita.com/djj31370/items/3a887b51d6c5ef33ab98)
2.  [github, qiita](https://qiita.com/djj31370/items/cbd0ffc23a06d320a35f)
3.  [rake](https://qiita.com/djj31370/items/1b13bec3516332af14ed)


# 課題

1.  [roman numerals](https://qiita.com/djj31370/items/d8da16c57afd289705a7)


# ショートカットキー

[基本操作一覧](https://qiita.com/djj31370/items/d843495c0536b60f6403)


# equation<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-28 水&gt;</span></span>

$$\frac{1}{4}$$



------
 - **source** ~/grad_members_20f/members/djj31370/README.org
PCI Expressの省電力にやられたはなし

#はじめに
いや、直接PG関係ないんですけどね
でもでも実際に通信するPG開発するってなると間接的には関係あるので書いてみます

##現象：232C通信でWindows10がフリーズ
PCI Expressボードを挿して通信すると
通信中にも関わらず無作為なタイミングでWindows10がフリーズする
OSごとフリーズってあんまりやで・・

##発生環境
全てのPCで同じことが起こるかは不明です
今回は某メーカの同機種PC2台で共にPCI Expressに某メーカの232cボード挿した環境で発生しました
ボード挿すとか結構やってる人には常識なのかもですけど、同じことで悩むひとがいたらいけないので書いときます

##解決
BIOSでPCI Expressの省電力設定切ったら解決しました
昔同じことしたときにはこんなことした覚えないのですが、ボード挿すことなんて稀だし
省電力デフォにしとこうというメーカーさんの親心なんですかねー
当然ボードの相性とかもあるとは思いますけど
通信中に省電力で切れてフリーズってそんな無茶なという気がしなくもない

誰かのお役に立てれば幸いです
【Udemy Python3入門+応用】　 68. Import文とAS

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■import文とas
####◆import
こんな風にディレクトリとファイルを用意する。

```
lesson_package
 ├ __init__.py
 └ utils.py
lesson.py
```

```python:utils.py
def say_twice(word):
    return (word + '!') * 2
```

```python:lesson.py
import lesson_package.utils

r = lesson_package.utils.say_twice('hello')
print(r)
```

```:result
hello!hello!
```

`import lesson_package.utils` のようにフルパスで書いてあげることで、他のファイルにある関数を読み込むことができる。
<br>

####◆fromとimport

```python
import lesson_package.utils
```
は、

```python
from lesson_package import utils
```
という風に書いてもOK。その際は、

```python:lesson.py
from lesson_package import utils

r = utils.say_twice('hello')
print(r)
```
という風に使うことができる。
<br>

####◆as

```python:lesson.py
from lesson_package import utils as ut

r = ut.say_twice('hello')
print(r)
```
asで文字列を指定してあげることで、好きな文字列で呼び出すことができる。
README.orgの雛形

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# equation<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-28 Wed&gt;</span></span>

$$\frac{1}{4}$$


# qiita\_links<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-14 Wed&gt;</span></span>

1.  [README.org](https://qiita.com/yuhsuzu/items/a373b8f980a3b974456b)
2.  [第五回：入出力](https://qiita.com/yuhsuzu/items/7a325b08e04e0adbe5b4)
3.  [第六回：変数とメソッド](https://qiita.com/yuhsuzu/items/e062b819ddcdef1ddc2d)
4.  [第七回：条件分岐・配列](https://qiita.com/yuhsuzu/items/5cc50f368248fbea860d)
5.  [第八・九回：イコール判別の関数の作成](https://qiita.com/yuhsuzu/items/962c0ce4d63da8ea5745)
6.  [第十回：再帰](https://qiita.com/yuhsuzu/items/fa456a56eed96b8c8b09)
7.  [第十一回：クラス](https://qiita.com/yuhsuzu/items/3ae81513b5808c8dc359)



------
 - **source** ~/grad_members_20f/members/yuhsuzu/README.org
taiseiyoのREADME.org

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# qiita\_links

以下の<strong><font color="red">リンクから qiita の好きな記事</strong>に飛べます!!


## 授業編

-   [taiseiyo の README](https://qiita.com/taiseiyo11/items/c826c82eb89a6e99aa07)
-   [第 2回目の授業](https://qiita.com/taiseiyo11/items/a8ce226a30b618d760fa)
-   [第 5 回目の授業](https://qiita.com/taiseiyo11/items/64274e7b6823b23dc2df)
-   [第 7 回目の授業](https://qiita.com/taiseiyo11/items/eb990ec6a5bff4395c76)
-   [第 8 回目の授業](https://qiita.com/taiseiyo11/items/9ab6ec22d7e850a0b34a)
-   [第 9 回目の授業](https://qiita.com/taiseiyo11/items/c64d9c4f7446971137e4/)
-   [第 10 回目の授業](https://qiita.com/taiseiyo11/items/4b3d050a7d8805019b9a)
-   [第 11 回目の授業](https://qiita.com/taiseiyo11/items/1e4d677b300f5b22c8d0)
-   [第 12 回目の授業](https://qiita.com/taiseiyo11/items/18004b1fbf2604ba603f)
-   [roman numerals](https://qiita.com/taiseiyo11/items/2c0032899aea2d666e08)
-   [google recruit](https://qiita.com/taiseiyo11/items/83f81e05bd2bd6d0b28b)


## 番外編

-   [今日から使える Linux command(基礎編)](https://qiita.com/taiseiyo11/items/995d0591e69915a4b374)
-   [qiita post を楽にしてみた](https://qiita.com/taiseiyo11/items/3a580bbae2a6412e50a3)



------
 - **source** ~/Downloads/git/grad_members_20f/members/taiseiyo/README.org
Android: Wifiで開発、デバッグのメモ

- Android Studio 4.0.1
- Windows 10

Androidアプリの開発にて、Android端末と別の機器をUSBで接続して使う仕様でしたので、WiFi経由で実行、デバッグ、ログ出力をしました。

手順だけのメモとなります。

詳細は、参考にさせて頂いたこちらの記事をご参照ください。
[AndroidアプリをWiFi経由でデバッグ](https://qiita.com/fukasawah/items/3f5b24819fac24c6686a)
[[Android]adbコマンドでunauthorizedが表示される](https://blog.integrityworks.co.jp/2015/10/18/android-adb-command-return-unauthorized/)


## Android-PCをUSBケーブルで接続
## [PC] Android Studioは立ち上げておく

## [Android]開発者向けオプションをON, USBデバッグをON

## [PC] AndroidのIPアドレスを調べる

```powershell
powershell -Command $env:USERPROFILE\AppData\Local\Android\sdk\platform-tools\adb.exe shell ip addr
```
```powershell:実行結果
5: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 34:97:f6:7a:83:a8 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.124/24 brd 192.168.1.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::3697:f6ff:fe7a:83a8/64 scope link
       valid_lft forever preferred_lft forever
```

## [PC] TCP/IPデバッグに切り替え

```powershell
powershell -Command $env:USERPROFILE\AppData\Local\Android\sdk\platform-tools\adb.exe tcpip 5555
```

## ケーブルを抜く

## [PC] TCP/IPで接続する

```powershell
powershell -Command $env:USERPROFILE\AppData\Local\Android\sdk\platform-tools\adb.exe connect 192.168.1.124:5555
```

## [PC] 確認

```powershell
powershell -Command $env:USERPROFILE\AppData\Local\Android\sdk\platform-tools\adb.exe devices
```

```powershell:実行結果
192.168.1.124:5555      device
```

## うまくいかない場合
[Android]開発者向けオプションをOFF→ON, USBデバッグをOFF→ON

## [PC] 終わるときは、USBデバッグに戻しておく

```powershell
powershell -Command $env:USERPROFILE\AppData\Local\Android\sdk\platform-tools\adb.exe usb
```
【Rails】ImageMagick（RMajick）を導入する方法


#ImageMajickとは
ImageMagick（イメージマジック）は画像を操作したり表示したりするためのソフトウェア。
GIF、JPEG、PNG、PDF、TIFFなど100種類以上の画像ファイルフォーマットに対応しており、プログラム上からの画像の変換・編集などに必要な多数の機能を備えている。
「画像のアップロード → サムネイル生成 」など、画像を加工・変形するWEBサービスを組みたい場合に使う。

[Imagemagickの使い方日本語マニュアル](https://imagemagick.biz/)

#導入
諸々の画像処理をするため、ImageMajickを使いたい。

ただこれはRubyのものではなく、
Rubyだと`RMagick`というgemで使えるようになるらしいのでこちらを入れる。

```Gemfile
# 追加
gem 'rmagick'

# => bundle install
```

ただ、以下のようなエラーが起きる。

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/uenoyuuki/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/rmagick-4.0.0/ext/RMagick
/Users/uenoyuuki/.rbenv/versions/2.5.0/bin/ruby -r ./siteconf20190916-2480-i0d2pg.rb extconf.rb
checking for brew... yes
checking for clang... yes
checking for pkg-config... yes


ERROR: Can't install RMagick 4.0.0. Can't find ImageMagick with pkg-config


*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/Users/uenoyuuki/.rbenv/versions/2.5.0/bin/$(RUBY_BASE_NAME)

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/uenoyuuki/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/extensions/x86_64-darwin-18/2.5.0-static/rmagick-4.0.0/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/uenoyuuki/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/rmagick-4.0.0 for inspection.
Results logged to /Users/uenoyuuki/.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/extensions/x86_64-darwin-18/2.5.0-static/rmagick-4.0.0/gem_make.out

An error occurred while installing rmagick (4.0.0), and Bundler cannot continue.
Make sure that `gem install rmagick -v '4.0.0' --source 'https://rubygems.org/'` succeeds before bundling.
```

先にImagaMajick自体のインストールが必要らしい。

OSが`Amazon-Linux`なので、`yum`を使ってインストールする。

```
$ sudo yum -y install ImageMagick ImageMagick-devel
```

```Gemfile
# 再度追加
gem 'rmagick'

# => bundle install
```

成功…！

#失敗談
ImageMagickを入れるまでの失敗として、
今までパッケージマネージャをノリで使っていたため、
それぞれの違いをわかっておらず、変に時間がかかった。

```
# Amazon-Linuxでは使えない

# Mac OS
$ brew install imagemagick@6

# Ubunts
$ sudo apt-get install imagemagick libmagick++-dev
```

なんのOSか分からない！なんてことはないはずだが、
最悪これでもOSを確認できる。

```
$ cat /etc/*-release
```

#参考
[Active StorageのVariantの指定方法いろいろ](https://qiita.com/kazuomatz/items/3cdbd2c40576c2e9d89b)
[RailsでRMagickを使う](https://qiita.com/yukiweaver/items/52c45f442b9d9d59367e)
[[Gem] RMagick をCentOSでインストール](https://qiita.com/hkengo/items/ff75f66a3f576b541bfd)
[Cloud9でrmagickを使おうとしたらエラーって解決した話](http://tsubuyakibio.com/web%E5%88%B6%E4%BD%9C/3406/)
[aptコマンドのインストールができない](https://teratail.com/questions/137588)
【Udemy Python3入門+応用】　 67. コマンドライン引数

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**

##■コマンドライン引数
```:terminal
python3 test.py arg1 arg2
```
```python
import sys

print(sys.argv)
```
```:result
['test.py', 'arg1', 'arg2']
```
ターミナルからPythonファイルを実行する際、Pythonファイル名の後ろに引数を渡すことができる。
これらの引数は `sys.argv` にリストとして格納される。従って、
<br>

```python
import sys

for i in sys.argv:
    print(i)
```
```:result
test.py
arg1
arg2
```
こういった使い方が可能。
使おうぜ php 画像加工 Intervention\Image\Facades\Image;

とりあえず、表題の通り、phpを使って画像を加工したい。
しかし、できることが多すぎるので、よく使う機能だけをピックアップしていく。

# 下準備

インストール方法は、省く

```HogeController.php

use Intervention\Image\Facades\Image;

```

# 背景に画像を重ねる

コロまるアイコンを背景画像に重ねる。
背景画像は whitebg.png (600x381) として保存しておく。

```HogeController.php

//コロまる アイコン
$icon = 'https://pbs.twimg.com/profile_images/378800000552767745/fb8f309e621d078cfe46250d73d38047_normal.png';

//600 x 381 pixels
//https://twi.ski/img/whitebg.png
$bg = Image::make(public_path('/img/whitebg.png'));
$icon = Image::make($icon);

//bg に 対し真ん中に 重ねる
$bg->insert($icon,'center');

//nakayoshi.png として保存
$bg
->save(public_path('/tmp/nakayoshi.png'));

echo '<img src="/tmp/nakayoshi.png?'.time().'">';

```

![nakayoshi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/08b17234-093c-c5e4-12eb-8425bdcfe6ff.png)

うーん♪キュート。

# 丸く切り抜き (マスク)

```HogeContoller.php

$bg = Image::make(public_path('/img/blackbg.png'));

//コロまる アイコン 200 x 200 のサイズ
$icon = 'https://pbs.twimg.com/profile_images/378800000552767745/fb8f309e621d078cfe46250d73d38047_200x200.png';
$icon = Image::make($icon);
//背景は透過、真っ黒の円を 200 x 200 で作成
$mask = Image::make(public_path('img/mask200.png'));
$icon->mask($mask,true);
$bg->insert($icon, 'center');
//       nakayoshi.png として保存
$bg
->save(public_path('/tmp/nakayoshi.png'));

echo '<img src="/tmp/nakayoshi.png?'.time().'">';


```

![nakayoshi (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/d853fe5d-5aa4-9cec-2066-4c4a8e560f77.png)

うーん！セクシー！

# テキストを重ねよう

日本語ファイルを用意する必要がある。
今回は uzura フォント を使う
http://azukifont.com/font/uzura.html

```HogeContoller.php

$x = 300;
$y = 190;

$font_size = 30;

$bg->text($key, $x, $y, function($font) use ($font_size) {

    $font->file(public_path('font/uzura.ttf')); // フォントファイル
    $font->size($font_size);        // 文字サイズ
    $font->color('#000');   // 文字の色
    $font->align('center'); // 横の揃え方（left, center, right）
    $font->valign('top');   // 縦の揃え方（top, middle, bottom）
    $font->angle(30);       // 回転（フォントが指定されていないと無視されます。）

});

```
README.orgの雛形

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# DONE equation<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-28 Wed&gt;</span></span>

$$\frac{1}{4}$$


# qiita\_links<span class="timestamp-wrapper"><span class="timestamp">&lt;2020-10-14 Wed&gt;</span></span>

1.  [README.org](https://qiita.com/adchello/private/7f7bcf8255ea4dbe2803)



------
 - **source** ~/grad_members_20f/members/adchello/README.org
README.org

\![Ubuntu-20.04.1](<https://img.shields.io/badge/Ubuntu-20.04.1-brightgreen>) \![ruby-2.6.6p146](<https://img.shields.io/badge/ruby-2.6.6p146-brightgreen>) 


# リンク集

-   [README.org](https://qiita.com/gagagagazelle/items/4e95abd578bb0127413a)
-   [ruby 演習メモ I (puts)](https://qiita.com/gagagagazelle/items/f2c2ff6383c161cd74c5)
-   [ruby 演習メモ II (variable and method)](https://qiita.com/gagagagazelle/items/a09eeb60c9e7913ea860)
-   [ruby 演習メモ III (if, case, array, each by leap year)](https://qiita.com/gagagagazelle/items/1a9ccd1a543a3d726bce)
-   [ruby 演習メモ IV (assert\_equal)](https://qiita.com/gagagagazelle/items/dbad0d4a8847d428f8f3)
-   [ruby 演習メモ V (Recursive Fibonacci)](https://qiita.com/gagagagazelle/items/525e5432685b049e7e53)
-   [ruby 演習メモ VI (hello class)](https://qiita.com/gagagagazelle/items/2a84bd4a118c8905127b)


## roman numerals, google recruit

-   [roman numerals](https://qiita.com/gagagagazelle/items/3df78906f7f652d86344)
-   [google recruit](https://qiita.com/gagagagazelle/items/7253c70636c0d8caf96d)


## Refactoring Ruby

-   [Refactoring Ruby](https://qiita.com/gagagagazelle/items/bb2b04f104b730738c53)



------
 - **source** ~/Lecture/multiscale_simulation/grad_members_20f/members/gagagagazelle/README.org
README.org

# qiita\_links

-   [README.org](https://qiita.com/ryuta-kikuchi/private/024e0a7d6a781a3a2144)
-   [マルチスケールシミュレーション特論：第7回](https://qiita.com/ryuta-kikuchi/private/98f88096beaeb9df5014)
-   [マルチスケールシミュレーション特論：第8回(assert)](https://qiita.com/ryuta-kikuchi/private/f5d4b83a6be39663b991)
-   [マルチスケールシミュレーション特論：第10回(Recursive)](https://qiita.com/ryuta-kikuchi/private/fd6f229b1a8a0c21a205)
-   [マルチスケールシミュレーション特論：第11回(class)](https://qiita.com/ryuta-kikuchi/private/7d61bb9da5cabb5c7685)
-   [Google Recruit](https://qiita.com/ryuta-kikuchi/private/e1e17ba10eabca569c93)
-   [roman numerals](https://qiita.com/ryuta-kikuchi/items/5e001132a165c4e7121f)

------
 - **source** ~/grad_members_20f/members/ryuta-kikuchi/README.org
マルチシミュレーション特論まとめ

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

これは講義用のまとめサイトです。見た人は是非LGTMを押しといてください。


# メニュー

-   [トップページ](https://qiita.com/MO_data/private/f220fb1bee0273a0aa7c)
-   [第5回](https://qiita.com/MO_data/private/75d064949c9554f9e3db) 11/25更新
-   [第6回](https://qiita.com/MO_data/items/d4a88e7aede000da3ab2) 12/4更新
-   [第7回](<https://qiita.com/MO_data/items/0038276011628185feb4>) 12/4更新
-   [第8回](<https://qiita.com/MO_data/items/37fc2e7bab34490507f6>) 12/16追記
-   [第9回](<https://qiita.com/MO_data/items/a5b7fe6a56f101e42112>) 12/16更新
-   [第10回](<https://qiita.com/MO_data/items/daa2eeb52d99e509589a>) 12/17追記
-   [第11回](<https://qiita.com/MO_data/items/b8d06a7f4210873784c8>) 12/18更新


## 最終課題

-   [roman numerals](<https://qiita.com/MO_data/items/04cce2eb232a490e8e18>) 12/23更新
-   [google recruit](<https://qiita.com/MO_data/items/5cfc0615c1d254b069f2>) 12/27更新


# Tips

emacsやqiitaの使い方などで自分が詰まったことなど<br>自分用ですが誰かの役に立ちますように．そして役に立った人にLGTMを押してもらえますように&#x2026;


### qiitaの新しい記事を書きたい

まず記事のテンプレを取得しましょう

```ruby
> qiita template
```

ubuntuのバージョン書くか？とかrubyのバージョン書くか？とかいろいろ聞かれるので全部yesで答えておくとテンプレートがコピーされる<br>そのままだとファイル名が「template.org」でよく分からなくなるので名前を変えましょう

```ruby
> mv template.org hogehoge.org
```

最初普通にrenでできると思ったらmvらしい<br>&#x2026;という感じで今(12/9)までやってきたわけですが、@creativeIKEP氏の発案で

```ruby
> qiita template hogehoge.org
```

で一発で任意の名前のテンプレートを作ることができるようになりました。


### qiitaに黒背景でコードを乗せたい

```ruby
#+begin_src ruby
puts "Hello World."
#+ end_src            #本来+の後のスペースは不要
```


### qiitaに記事をアップロードしたい

```ruby
> qiita post hogehoge.org
```


### gitにアップロードしたい

```ruby
> git pull origin main
> git add -A
> git commit -m 'コメント'
> git push origin main
```

これで最低限アップロードできる。git commitのコメントはなくても良いらしい(あった方が後から見たとき分かりやすいだろうが&#x2026;)


### emacsの忘れがちなコマンドシリーズ

-   undo

    ```ruby
    > C-/
    ```

-   コピペ

    ```ruby
    > C-k
    ```
    
    でカットして
    
    ```ruby
    > C-y
    ```
    
    でヤンク(ペースト)


# 自分用メモ(残課題など)


### htmlに出力 <span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-11 Wed&gt;</span></span>

htmlizeのインストールが必要らしい(どうやって？今は時間がないので後日調べましょう)


### undoなどのコマンド <span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-25 Wed&gt;</span></span>

コマンドのまとめを書く


# 参考にした記事

-   [チャート式ruby](https://qiita.com/daddygongon/items/6f38d9a04e127a7952a7)
-   [org-modeのテキストをqiitaに投稿するgemを作ってみた](https://qiita.com/yamatoken/items/858692178d288c40714d)



------
 - **source** ~/MasahiroOba/grad_members_20f/members/MasahiroOba/codes/../README.org
Rubyのキーワード引数についてメモる

## 基本

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/7b209154-0dc1-5347-e33e-41b547369fe9.png)


- 呼び出し側は、指定されたキーワードのシンボルをkeyとするハッシュを引数に与える
- 複数のキーワードを指定することも可能


## デフォルト値も設定できる

```rb

def b(test:, test2: 't2')
   puts test1, test2
end
```
jestで関数をモックにして複数回テストしたときに、expectが意図しない結果になるパターン

#まずはコードの部分
以下のコードはjestのテストをしていて、モックされた関数を呼んで1回目の関数呼び出しの場合は400をリターンさせて、2回目の呼び出しのときは200をリターンさせる・・・
という感じのことをしています。

で、テストケースが一つだけならこれでうまくいくが、2回以上同じように以下のコードの塊をコピーして書くとexpectの結果が意図しないものになる。

ちなみに、監視している関数に使われた引数を見るには「mockFn.mock.calls」を使うが、この引数も、関数が呼ばれるたびに引数が積み重なっていく感じになってしまう(例えば一回目の引数が配列の[1,2]だとして次の呼び出しの引数が[3]だとしたら、2回目のテストでmockFn.mock.callsして引数を見ると「1,2,3」になって蓄積されてしまう)

**以下の塊を、テストケースの数だけ複数書くことを想定**

```typescript:anime-suko.ts
const testCase1 = test('正常系1：hogehoge', async () => {

  const testFailedExpectResponse = {
    statusCode: 200,
  }

  //ここでモックして、レスポンス内容を指定
  jest
    .spyOn(hogeLambdaModule, 'hogeLambda')
    .mockResolvedValueOnce(Promise.resolve({ statusCode: 400 }))
    .mockResolvedValueOnce(Promise.resolve({ statusCode: 200 }))
    .mockResolvedValueOnce(Promise.resolve({ statusCode: 200 }))
    .mockResolvedValueOnce(Promise.resolve({ statusCode: 200 }))

  //Exercise
  const actual = await getPrivateMethodsInTestModule.lambdaFunction()

  //verify
  //ステータスコードが400で返ってくること
  expect(actual).toStrictEqual(testFailedExpectResponse)
})


```

## 解決方法
原因は、spyOnによるモック化を何回も繰り返してしまっていたから。
このままだと同じ設定を繰り返す感じになって不具合の原因になる。
気持ちとしては、テストのたびにモックをクリーンな状態にするのが一般的。
なので、  jestのrestoreAllMocks()を使って元の状態に復元する必要がある。

restoreAllMocks()の詳細については以下にドキュメントがあります
https://jestjs.io/docs/ja/jest-object

●以下のように、テストを4つのフェーズで考えるやつで、そのうちのteardown(後処理)にあたることをします
以下の処理を、全てのtest()の中に追記したら解決しました

```typescript:anime-suko.ts
  //teardown
  jest.restoreAllMocks()
```





## まとめ
Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (LoadError) の対応

## rubocopが使えない
rubocopを使おうとしたらopenssl のエラーが発生したので誰かの助けになればと思い記事を書いておきます。

```sh
$RBENV_VERSION=2.2.10 rubocop hoge_controller.rb
>Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib (LoadError)
```

どうやらopensslのエラーみたいで、先日`brew update`したらopensslが1.1にupdateされた感じです。
自分のRubyのバージョンだと1.1は使えないので上記のエラーが発生したみたいです。

## 解決方法
下記のコマンドでバージョンを切り替えることで解決することができました。

```sh
brew switch openssl 1.0.2t
```

以上です。
eslint-plugin-prettier って generally not recommended だったのか

# 背景

手元のアプリで `npm audit` したら万単位で脆弱性がレポートされてきたので、そろそろ package-lock.json を再作成しようか…とやってみたところ、 prettier のルール違反が消えなくなってしまった。正確には、 prettier の警告にしたがって修正したら eslint(prettier/prettier) のエラーが出て、そちらを直したら元の prettier エラーになってしまうという conflict 状態。なんでかいな、とググったら…

# 「eslint で prettier 実行」はお勧めではない(generally not recommended)

見つけたのが [この記事](https://knote.dev/post/2020-08-29/duprecated-eslint-plugin-prettier/)。 Prettier 公式が

- prettier と eslint を組み合わせて使うなら、 prettier はコード・フォーマッターに、 eslint は静的解析に各々専念させたほうがよい
- eslint-plugin-prettier などのような「eslint から prettier を実行するような連携方法」はお勧めではない

という趣旨のことを明言しちゃってるんですよね。 eslint-plugin-prettier を使うやり方しか知らなかったのでびっくりしました。

# 実践

- eslint-plugin-prettier 使うのやめます。 prettier-eslint-cli もやめます。
- prettier そのものは VSCode のプラグインとして常に裏で動くようにしておきます(いちいち意識しなくても済むように)。
- lint-staged で実行されるコマンドに `prettier --write --ignore-unknown` を加えます。
- .prettierignore ファイルを作ります。中身は .gitignore と同じでよいです。
- CI 環境があるときは、 `npm test` の前に `prettier --check .` するようにします。

# 参考

- [いつのまにかeslint-plugin-prettierが推奨されないものになってた](https://knote.dev/post/2020-08-29/duprecated-eslint-plugin-prettier/)
- [Integrating with Linters](https://prettier.io/docs/en/integrating-with-linters.html)
環境変数 $PATHの優先順位

##はじめに 
普段何気に使用していた
各コマンドが探しに行く設定パスには優先順位があることを知ったのでメモ

##環境変数 $PATH
自分のPCのホームディレクトで（~/）

```terminal
shiga1@MacBookPro ~ % echo $PATH　←を実行すると
/opt/local/bin:/opt/local/sbin:/Applications/XAMPP/xamppfiles/bin:/usr/local/opt/php@7.2/sbin:/usr/local/opt/php@7.2/bin:/usr/local/opt/mysql-client/bin:/usr/local/opt/mysql@5.7/bin:/usr/local/sbin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin
```

コマンドを実行した時にどこを参照にしているのかが分かる。
ここまでは、以前から理解していたが優先順位があるのは、知らなかった。

調べたところ、優先順位は左から順と分かった。（パスは「：」区切り）


##これを調べた経緯
諸事情あって、which php コマンドをよく使っていた時、
ホームディレクトと、XAMPP内で実行した時の結果が違うことに違和感を感じたから。
deviseを使ったログインユーザーと未ログインユーザーの遷移分け

#何をしたいか
ログインをした後に見せたい**ホーム画面的**なものをroot_pathに設定していたので
ログインしていないユーザーは**アプリの紹介ページ**に飛ぶように設定をします


#記述
このページに書いてある通り**devise**を使ったものになります。
まだdeviseを入れてない方は入れてからこのページに戻ってきてください。
さて本題に入ります
まずコントローラーの記述を変えます。


```photos_controller.rb
class PhotosController < ApplicationController
  before_action :move_to_index #ここを追加で記述
  
  def index    
  end
#ここから下を追加で記述
  private

  def move_to_index
    unless user_signed_in?
      redirect_to controller: :homes, action: :index
    end
  end

end
```

何をしているか上から解説します
###before_action :move_to_index
before_actionはコントローラーの全てのアクションが実行される前に何らかの処理を行う時に使用するものです
そのbefore_actionにmove_to_indexというメソッドを指定しています。
メソッドなのでここは皆さんで記述が違います
じゃぁそのメソッドはどこで定義してあるの？？それは後ほど解説します。

###private
クラス外から呼び出すことのできないメソッドのことです。
Rubyでは、privateと記述した以下のコードがプライベートメソッドになります。
僕の解釈はこのコントローラー内でしか使用できないメソッドと解釈しています。違ったらすみません…

###def move_to_index
ここでmove_to_indexを定義しています。
先ほどのbefore_action :move_to_indexに繋がるわけです
ではそのmove_to_indexではどのようなことをしているのか見てきます

###unless user_signed_in?
user_signed_in?はdeviseを入れることで使えるヘルパーメソッドです
**ユーザーがログイン済みかどうか判断します**
そこにunless　〜がないならのような意味です
この単語がくると、ログインしていなければ〜で次の行に進みます

###redirect_to controller: :homes, action: :index
少し文が長いので
**redirect_to**にまず注目ですこれは、**指定したURLに遷移させることができるメソッド**です
なので

```controller.rb
redirect_to "http://www.○○○○.com"
```
でもできるし

```controller.rb
redirect_to root_path
```
のようにPrefix名も指定できます

```controller.rb
redirect_to controller: :homes, action: :index
```
最後に指定したコントローラーのアクションを指定することもできます

他にもまだできるので是非検索してみてください

これで流れとしては
**indexが読み込まれる前にbefore_actionで先にmobe_to_indexメソッドを読みます。その中にはユーザーがログインしていなければ、ここに遷移すると設定ができました。**

#ルーティング
コントローラーにて

```
redirect_to controller: :homes, action: :index
```
と最後記述しているの
homesコントローラーのindexアクションが呼ばれます

```routes.rb
get '/homes/home', to:'homes#index'
```
を記述します
**/homes/homeはURL名の指定です**
![スクリーンショット 2020-10-14 15.13.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694122/c498bd0b-a693-9f96-6f3b-9218a645b9aa.png)
こんな感じになっています。
そして**homes#index**
homesコントローラーのindexアクションを指定します
これで終わりです
Swift cornerRadiusのあれこれ

#指定の角を丸くしたい#
###今回はUIImageについて触れる###

任意のファイルに記載(わたしはUIパーツのextensionファイルを作成してそこに記載している)

```swift 
///指定の角を指定の半径で丸くするメソッド
///- Parameters: 
///   - 半径
///   - 指定の角
 public func setCornerRadius(_ radius: CGFloat,_ corners: CACornerMask) {
    layer.cornerRadius = radius
    layer.masksToBounds = true
    layer.maskedCorners = corners
 }
```

###使い方###

```swift 
///今回は全ての角に対して丸くする処理を行う。
let corners = [.layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMinXMinYCorner, .layerMaxXMaxYCorner ]
view.setCornerRadius(15, corners)
```

以上。参考にしていただけると幸いです。
vue ui (vue cli 3~) で作ったプロジェクトで eslint を無効化する

vue ui でのプロジェクト作成時に入れた eslint を無効化したくなったが、出来るようになるまで時間がかかったのでメモ。 

環境
@vue/cli 4.5.7

#### プロジェクト内でwebpackの設定を記述している箇所が見当たらない

-> 初期状態では vue-cli の内部的な設定を利用している(?)ためファイルが存在しない
下は設定の中身を確認するコマンド

```
vue inspect
vue inspect > output.js  // ファイルに出力する
``` 

参考 https://cli.vuejs.org/guide/webpack.html#inspecting-the-project-s-webpack-config

#### eslint を無効化したい

-> vue.config.js に記載した内容がデフォルトのwebpack設定にマージされる
下の内容のファイルをプロジェクトルートに作成する

``` vue.config.js
module.exports = {
    chainWebpack: config => {
        config.module.rules.delete('eslint');
    }
}
```
参考 https://stackoverflow.com/questions/49121110/how-to-disable-eslint-on-vue-cli-3
クラスとインスタンス　初心者向け　Java

環境
・MacBookpro
・IntelliJ IDEA CE

Java学習中アウトプットのため投稿します。

<h1>クラスとインスタンスについて

クラス・・・設計書、骨組み
インスタンス・・・クラスを元に作られた実体

あなたは上司から大量生産猫型ロボット工場から、人間界世話型ロボットとその妹ロボットを１体ずつ作るよう指示を受けました。

上司から詳細データが渡されました。

```
人間界世話型ロボットについて
名前：ドラ絵もん
色：青
性別：男

ドラ絵もんの妹ロボットについて
名前：ドラ美ちゃん
色：ピンク
性別：女

以上２体を作成するように。
```

詳細データを見ると３要素が必要です。
・名前(name)
・色(color)
・性別(sex)

それではまず上司の指示通りのクラスを完成させます。

```ruby:Robot.java

class Dora {
    String name;
    String color;
    String sex;

    Robot(String name, String color , String sex){
        this.name = name;
        this.color = color;
        this.sex = sex;
    }

    String sayBox(){
        return name +"です。色は、"+color+"です。性別は"+sex+"です。";
    }
}

```

これでクラスが作れました。


次はインスタンス(詳細）を作ります。

```RobotFactory.java

public class RobotFactory {
    public static void main(String[] args){
        Dora robota = new Dora("ドラ絵もん","青","男");
        System.out.println(robota.sayBox());

        Dora roboco = new Dora("ドラ実ちゃん","ピンク","女");
        System.out.println(roboco.sayBox());
    }
}


```
出力してみます。
![スクリーンショット 2020-10-14 14.57.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677104/2d8add77-2dc6-5e6e-6ae6-26a7b4eee195.png)


成功です。:relaxed:
Raisアクションコントローラーにおけるnewとcreateの違い

初投稿です。

復習でnewとcreateの違いがごちゃごちゃになったときがあったので
備忘録として投稿させて頂きます。


# コントローラーアクションnewとcreateの違い
どちらも作成という意味です。
ですが大きな違いは2つあります。


1つ目は```idを与えるかどうか``` 

newアクションには**IDを与えません。**
また、newアクション専用のページに遷移する事が多いです。
例えばTweetの新規投稿、メルカリなら出品ページとして理解するのが良いと思います。


逆にcreateアクションには**その投稿に対してIDを与える**
例えばTweetで投稿したらその時の投稿者や投稿した時間などが記載されていると思います。
これは投稿した瞬間にIDが与えられモデルからDBに保存される様になっています。
ここから、編集したり削除する事もできますがこれらはIDがあるからこそできるのです。

```ruby:sample.rb

アクションコントローラーの基本的な使い方


newアクション
  
  def new
    @tweet = Tweet.new
  end


createアクション

  def create
    Tweet.create(tweet_params)
  end

```

2つ目は``` HTTPメソッドが違う```。
ターミナルでrake routes(rails routesでも可)で確認したら出てきます。

```
createアクション
tweets POST   /tweets(.:format)                                                                        tweets#create

newアクション
new_tweet GET    /tweets/new(.:format)                                                                    tweets#new
```

HTTPメソッドは4種類あります。以下を参照して下さい。

```
HTTPメソッド どのような時に用いられるリクエストか

GET	    ページを表示する操作のみを行う時
POST	データを登録する操作をする時
PUT	    データを変更する操作をする時
DELETE	データを削除する操作を行う時
```

以上となります。
シェルスクリプトで配列同士を結合する

# なにこれ
- ２つの配列を結合する方法を確認する

# 実行するコード

```shell
a=(1 2)
b=(3 4)
a+=(${b[@]})

for number in ${a[@]}
do
    echo $number
done
```

# 念のため解説
### 配列の作成

- 変数への代入の際は、イコールの前後にスペースを入れない
- 配列はカッコで囲う
- 要素はスペースで区切る

```shell
a=(1 2)
```

### 配列の結合

- 結合は+=で行う
- 配列の要素を展開するには[@]をつける
- すべての要素を再度配列にするためにカッコで囲う

```shell
a+=(${b[@]})
```
torchvision.utils.make_gridの結合の順番を確認する

# なにこれ
- torchvision.utils.make_gridで結合したテンソルが、縦横どちらに向かって結合されていくかを確認する
- 結論：Zの字の方向に結合する。

# 実行するコード

- save_imageはmake_gridを呼ぶ仕様なので、save_imageに直接tensorを渡す
- 少しずつ濃くなるタイルを生成して、順番に並べる

```python
import torch
from torchvision.utils import save_image
imgs = list()
for i in range(9):
    imgs.append(torch.ones([1, 64, 64])*i/10)
imgs = torch.stack(imgs)
save_image(imgs, "grid.png", 3)
```

# 出力

![grid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207596/bc7ae15a-3035-741d-d874-81cac3d3c27a.png)


# 結論

- 左上から、行方向に進む
- Zの字の方向に結合する。
FileMakerとFTPサーバー

とある日、FTPサーバーとFileMakerの連携するという案件がありました。

初めての試みだったので、色々最初調べたのですが、情報が少なかったので、
備忘録としてまとめておく。

---

調べていると、Powershellとかどーとか一杯出てきたのだが...
FileMaker16からは[URLから挿入]があるので、これだけでできないのか。

https://qiita.com/manabuuuuun/items/051cacb9d72da213ae5b

https://qiita.com/manabuuuuun

様　ありがとうございました。

ただ、自分の頭が悪すぎて全然できんかった。

---

https://totech.hateblo.jp/entry/2015/04/16/231035

めちゃくちゃ参考になりました。
cURLオプションで何とかできるようになりました。

シンプルに嬉しかったです。

---

FTPの細かいところは省きます。


ファイルのダウンロード
変数を設定[＄ftp;"ftp://" & ＄Host & ＄Directory & ＄File]
変数を設定[＄cURL;"-u " & ＄UserPass　& " --FM-return-container-variable"]

URL から挿入[選択;ダイアログあり:オフ;ターゲット:＄Response;
＄ftp;cURL オプション:＄cURL; URL を自動的にエンコードしない]

フィールド設定[オブジェクトフィールド; ＄Response ]

これで、オブジェクトフィールドへ格納できました。
ちなみに、
--FM-return-container-variable
[URL から挿入] が変数をターゲットとする場合、このオプションを使用して、返されるデータをオブジェクトデータとして強制的に保存します。
https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/curl-options.html

---

ファイルのアップロード
変数を設定[＄ftp;"ftp://" & ＄Host & ＄Directory & ＄File]
変数を設定[＄filename;オブジェクトフィールド]
変数を設定[＄cURL;"-T ＄filename " & "-u " & ＄UserPass]

URL から挿入[選択;ダイアログあり:オフ;ターゲット:＄Response;
＄ftp;cURL オプション:＄cURL; URL を自動的にエンコードしない]

これでインポートできました。
ちなみに、
どこのサイトで見ても、-Tオプションにはダブルクォーテーションの中に変数を入れるのが普通らしい。
なんでなんでしょう。
そういった疑問は残っていますが、何とか形に出来たし良かった。


---

お恥ずかしながら、FTPって最初は何ってなってました。
https://ja.wikipedia.org/wiki/File_Transfer_Protocol

けど、こういうの出来たら素敵やん。

これからも頑張っていこうと思います。
Ubuntuで使えるテキストエディタを再評価

#自己アップデート
認識が誤っていた部分があるので大幅に内容をアップデート。
#VMのUbuntuで使えるやつ
コードを打つのに軽くて使いやすいエディタを探していた。理想は秀丸で、百歩譲ってサクラエディタのクローンもしくはそれらに近い使い勝手と軽さのエディタがほしかった。だが高速・軽量文化のUnix界隈にしては重くてダサいエディタが多い。そこで使ってみたものをレビューしてみる。ちなみに環境は

Core i7 4770/SSD 1TB/RAM32GB

というちょっと古めのハードウェアという縛りつきである。
OracleVM VirtualBoxで使用する。
#Ubuntuで使えるエディタと自分の評価
- VSCode

環境を整備してインストールしてみたらそんなに重くなかった。なかなか良い。現状の選択肢の中ではベストだ。秀丸やサクラエディタ的な使い勝手の再現には至っていないのが残念だが、軽さとプラグインの多さは良い。キーボードショートカットがもう少し使いやすければ文句はない。

- gedit

標準インストールのエディタ。ほぼ使わなくなったが殴り書き用には悪くない。若干重いのと、巨大なファイルを開いた時に開き終わるまで戻ってこないことは欠点である。設定画面からのカスタマイズは必須だと思う。

- ATOM

リポジトリを追加しないとaptでインストールできない。
あとUIデザインがなんかユニーク（変態的）なのであきらめた。

- vi系

必要に迫られなければ（TeraTermの接続先で編集するとか）使わない。モード切替系の、というよりもvi系の操作はどんなに使い込んでも生理的に受け付けない。

- emacs

vi系とは対極のUnix変態文化の集大成っぽいエディタというか環境。
aptで一発インストールできるのだが、ダウンロード元のサーバが重い。
.pyとか.cppを開くと、言語に応じたサポートメニューが現れる。
動作は軽いがVS Codeが思ったより良かったのでuninstall。

- geany

軽さは申し分ない。エディタにIDEっぽい機能を追加した環境を作ろうとしているようだ。悪くはない。起動中のアプリアイコンが魔法のランプなのは何か理由があるのだろうか。

- notepadqq

Windows用テキストエディタnotepad++のクローン。QtのGUIフレームワークで実装されているらしい。ターミナルから notepadqq と入力すると、インストールされていなければaptかsnapで入れろと教えてくれる。プログラミング言語サポートが充実している。動作は軽いがターミナルから起動するとごちゃごちゃログが出る。uninstall。

- leafpad

ウィンドウエディタでは死ぬほど軽い。ほかのどのエディタよりも軽い。だがそれだけである。プログラミングをサポートする機能は一切ない。メモ書きの殴り書き用である。uninstall。

#とりあえずはVSCodeだが
grepとタグジャンプの環境をどう構築したらいいのかわからない。調べるのがめんどくさいので、気が向いたら調べて何とかしたい。プラグインが死ぬほどあるのと納得できる軽さなので、あとは慣れとWeb検索で何とかしよう。

レジストしている秀丸は32bit版をおすすめしますとか公式ページに書いてあるのだが、いい加減に32bitワールドとは決別してほしいものである。
PHP8 に文字列判定を改善する関数が導入されます！

こんにちは。やまゆです。

PHP8 の RC 版がリリースされ、そろそろ触っても良い感じになってきました。

色々楽しく触ってみていますが、今回は **「文字列関連の新規関数」** を紹介したいと思います。

## str_contains

[RFC はこちら](https://wiki.php.net/rfc/str_contains)

[Laravel](https://github.com/laravel/framework/blob/576dd3d3cfbd4ef5239eb277c4d6bd315d7503bd/src/Illuminate/Support/Str.php#L180) などで既に実装されているこの `str_contains` ですが、コア関数として実装されることになりました。

```php
str_contains(string $haystack, string $needle): bool
```

`$haystack` `$needle` の引数名はほかの str_ 関連関数でも使われますね。

```php
false !== strpos($haystack, $needle)
```

という直感的でないやり方で現在の関数でも実現出来ますが、より簡単に文字列が中に含まれているかどうかを判定できるようになりました。

```php
if (str_contains($request->getHeaderLine('Content-Type'), 'json')) {
  $request = $request->withParsedBody(json_decode((string)$request->getBody(), true));
}
```

雑実装ですがこういうロジックが分かりやすくなります。

```php
<?php

// 実装例
var_dump(str_contains('Hello', 'He')); // bool(true)
var_dump(str_contains('Hello', '')); // bool(true)
var_dump(str_contains('➡⇦', '➡')); // bool(true)
```

※空文字は「全ての文字列にヒットする」という判定が一般的なため、 `$needle` が空文字列の場合は常に true が返ります。

## str_starts_with, str_ends_with

[RFC はこちら](https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions)

`str_contains` より厳しい判定として、指定された `$needle` から始まった文字列かどうかを判定する `str_starts_with` と、指定された `$needle` で終わる文字列かどうかを判定する `str_ends_with` も追加されました。

```php
<?php

// 実装例
var_dump(str_starts_with('Hello', 'He')); // bool(true)
var_dump(str_ends_with('Hello', '')); // bool(true)
var_dump(str_starts_with('➡⇦', '➡')); // bool(true)
```

文字列チェックが直感的に出来るようになりましたね。
Raspberry Piセットアップ ～Raspberry Pi Imager版～

Raspberry Piのセットアップについてのメモ書き
Windowsでのやり方メモ

今回はRaspberry Pi Imagerを使ったやり方

[Etcher版](https://qiita.com/bobrock/items/e5512c49ad17d14ddcfa)

###準備する物
microSDカード(64GB以上推奨)
SDカードアダプタ
カードリーダー(使用PCにSDカードスロットあればいらない)

基本的には全く変わりません。

###手順
①[Raspberry Pi Imager](https://www.raspberrypi.org/)のダウンロード及びインストール
![2020-10-14 (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/e5889253-0ef2-3246-5775-76f5f1fd7045.png) ![2020-10-14 (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/7c6640c0-dad9-1c64-8f60-82e421290728.png)
ホーム上部の『Downloads』→『Raspberry Pi Imager』を選択してダウンロードする。

ダウンロードしたファイルを開いて、インストールする。

②Raspberry Pi Imagerを起動する
スタートメニューから立ち上げる。
![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/7c077370-d6c6-6b66-470c-9115b58c4ba8.png) ![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/44105d2c-00a7-5786-d161-b12f5834f790.png)
Operating SystemからインストールするOSを選択する。
通常版で問題なければ一番上の物を選択する。

![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/6a982082-4896-e8a3-e3cc-3da04da21021.png)
もし別でダウンロードしたVer違いの物を入れたいのであればUse customから入れたい物を選択する。

![スクリーンショット (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/92b8ec98-b7de-e3f8-98cb-76583236982e.png)
書き込みを行うメディアを選択する。

![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/3746d7a3-f218-6aa3-ec28-e783ef2105cf.png) ![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607764/295a8f36-e4b6-2aa3-c68f-b1d3f1a3b396.png)
writeを押すと書き込んでもえぇか？と聞いてくるので問題なければ『YES』を選択する。(左図)

暫く放置していると、書き込み終わったからカード外してと表示されるのでカードを外す。(右図)

###まとめ
公式が書き込みImagerを公開した事で、結構簡単にOSディスクを作成する事が可能になりました。
Etcherでのやり方に慣れているのでどうしてもEtcherの方が楽と思ってしまうが
どちらともにRaspberry Piを立ち上げるのには問題なかったです。

以上です。
IBM Watsonを使用して映画コンシェルジュを自作してみた [概要編]

# はじめに
ある日、僕の好きな**映画**を広めるために**映画コンシェルジュ**的なものを作ってしまってはどうだろうかと思いつきました。笑

→ そこで、Bluemixを使用し、映画コンシェルジュをチャットボットで再現してみたという内容です。

# IBM Watsonとは
今回使用するサービスは、IBM Cloudの**Watson Assistant**になります。
[参考 : Watson Assistant](https://cloud.ibm.com/docs/assistant?topic=assistant-index)

↓ 公式ドキュメントより抜粋
>独自のブランドのライブ・チャットボットを任意のデバイス、アプリケーション、またはチャネルに組み込むことができます。アシスタント とも呼ばれるチャットボットは、既に使用しているカスタマー・エンゲージメント・リソースに接続して、統合された魅力的な問題解決エクスペリエンスをお客様に提供します。

まとめると

**・ チャットボットを作成することができます。**

**・ インターフェースとしては、ソーシャル・メディア・メッセージング・プラットフォーム (Slack や Facebook Messenger など) に直接公開したり、アプリケーションに組み込むことができます。**

**・ 対話を通して、質問と回答の結びつきを学習でき、かつ学習させることで対話の品質が高まります。**

![スクリーンショット 2020-10-14 12.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/9021a0ec-e697-3cfe-7f27-56886ec00c21.png)


# 実装内容
## 環境
・ 料金プランはライト(無料)を使用します。

## 新規作成手順
1. Watson Assistantをライトプランでサービスを開始します。
2. ダッシュボードより、Servicesを選択し、Watson Assistantを選択します。その後、下記画面に行くので、
Watson Assistantを起動を押します。
![スクリーンショット 2020-10-14 13.05.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/f415f1b5-ddec-17f2-1add-763a5212f134.png)

3. create assistantでチャットボットを作成します。 今回は既に[ChatBot_PoC]というものを作成しているので、ここからは[ChatBot_PoC]内の設定内容についてお話ししていきます。
![スクリーンショット 2020-10-14 13.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/a749903d-f9a3-07ef-1c53-4ab5268acd05.png)

---
## ChatBot_PoCの実装内容
### Intent
![スクリーンショット 2020-10-14 13.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/7ca841d6-8664-34fa-44f9-aa2eb0a407ae.png)


**Intentとは、質問に対する回答を結びつける役割をしています。**
例えば、下記だと、[#C_映画紹介]をヒットさせるためにユーザから入力されるであろう言葉をexampleに記入していくと、例えば[映画紹介して]とユーザから打たれれば、[#C_映画紹介]がヒットする感じです。
![スクリーンショット 2020-10-14 13.19.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/fa86e9c2-3073-9dd7-7b86-76394bca267a.png)

### Entities
![スクリーンショット 2020-10-14 13.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/87b632af-dae9-bca1-5a5c-da3135a3da23.png)

**Entitiesとは、ユーザーの目的に関連した、ユーザー入力の情報を表しています。**
もう少し詳しく説明すると、ユーザが質問した際にその質問に関連するものを１つのエンティティとしてまとめる感じです。

下記の例だと、アクション映画の映画のタイトルをまとめる為に、[@アクション]を作成し、[アクアマン][ジョン・ウィック][デッドプール]のようになっていることがわかります。
![スクリーンショット 2020-10-14 13.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/7da22c80-314e-a515-0703-08e854e65981.png)

### Dialog
![スクリーンショット 2020-10-14 13.26.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/c016c4c4-3ff1-13d9-421e-b3a080b1651d.png)

**Dialogとは、ユーザー入力から検出されたインテントに加えて、アプリケーションのコンテキストを使用してユーザーと対話し、最終的な応答を返します。**

なので、ここがChatBotのロジックとなる部分になります。
**参考 :**
![スクリーンショット 2020-10-14 13.29.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/fb340f7a-9f91-e6f7-f500-438fc1992da4.png)

**この会話ロジックについては、今回説明は割愛し、別の記事として書いていこうと思います**


# 動作
今回は、[Preview link]を使用し、動作を確認してみました。
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/80035405-3a77-010b-95ae-97111468d828.gif)

# まとめ
・ 手軽にChatBotを作成できたので、僕的にはWatson Assistantよかったです！
・ 次回は、Dialog内に仕込んだロジックについて説明していこうと思います。
【django】環境構築手順の忘備録

## TL;DR
python + djangoを使用した開発のための環境構築手順の忘備録

## 手順
### フォルダ作成
```bash
> cd work
> mkdir sample
> cd sample
```

### 仮想環境作成
```bash
> python -m venv develop
```

### 仮想環境の有効化
```bash
> source develop/bin/activate
```

### 必要なライブラリのインストール
```bash
> pip install django
```

### djangoプロジェクトの作成
```bash
> django-admin startproject myporject
```

### 作成したdjangoプロジェクトへ移動
```bash
> cd myproject
```

### マイグレーション実施
```bash
> python manage.py makemigrations
> python manage.py migrate
```

### スーパユーザーの作成
コマンドを打ち込んだあとに、ユーザ名やメールアドレス、パスワードを設定する。

```bash
> python manage.py createsuperuser
```

### サーバーを起動
```bash
> python manage.py runserver
```