OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby】ハッシュの生成

ハッシュの記述方法がよくわからなくなってしまうので、復習を兼ねて記事にしました。

#ハッシュとは
データ」とそれに対応する「名前」のセットを要素として持つ値。
ハッシュにおいては、データをバリュー、それに対応する名前をキーと呼ぶ。

#ハッシュの生成方法
**文字列**をキーにする場合と**シンボル**をキーにする場合がある。
シンボルをキーにすると、キーを数値として扱ってくれるので処理速度が早い。
##文字列をキーにした書き方
```ruby
height1 = { "Taro" => 175 , "Jiro" => 170 , "Kohei" => 165}
```

##シンボルをキーにした書き方
以下どちらの記述でもOK

```ruby
height2 = { :Taro => 175 , :Jiro => 170 , :Kohei => 165}
height3 = { Taro: 175 , Jiro: 170 , Kohei: 165}
```

#ハッシュを編集するとき（値の追加、変更）
##ハッシュに値を追加する場合
ハッシュに値を追加したいときは以下のように記述する。

```ruby
height3[:Hiro] = 183
puts height3
#{:Taro=>1175, :Jiro=>170, :Kohei=>165, :Hiro=>183}
```

##ハッシュの値を変更する
ハッシュの値を変更したいときは以下のように記述する。

```ruby
height3[:Taro] = 185
puts height3
#{:Taro=>185, :Jiro=>170, :Kohei=>165, :Hiro=>183}
```

#ハッシュの中身を取り出す
##キーを取り出す
キーを取り出すときは**keysメソッド**を使用する。
keysメソッドを使用すると、ハッシュ内のキーを配列として取り出すことができる。

###全てのキーを取り出すとき
```ruby
#height3 = {:Taro=>185, :Jiro=>170, :Kohei=>165, :Hiro=>183}
puts height3.keys
```

```terminal
Taro
Jiro
Kohei
Hiro
```

###一つのキーを取り出すとき
```ruby
#height3 = {:Taro=>185, :Jiro=>170, :Kohei=>165, :Hiro=>183}
puts height3.keys[0]
```

```terminal
Taro
```

##バリューを取り出す
バリューを取り出すときは**valuesメソッド**を使用する。
valuesメソッドを使用すると、ハッシュ内のキーを配列として取り出すことができる。

###全てのバリューを取り出すとき
```ruby
#height3 = {:Taro=>185, :Jiro=>170, :Kohei=>165, :Hiro=>183}
puts height3.values
```

```terminal
185
170
165
183
```

###一つのバリューを取り出すとき
```ruby
#height3 = {:Taro=>185, :Jiro=>170, :Kohei=>165, :Hiro=>183}
puts height3.values[0]
```

```terminal
185
```
Rspecでテストを作成する時、各ファイル毎に require 'rails_helper' と書くのを省略する

## 環境
Mac OS X
Ruby:　2.7.1
Rails:　6.0.3.4

## 課題
RSpecでテストを作成する時、何も設定しないと以下のように記述すると思う

```ruby:model_spec.rb
require 'rails_helper'
Rspec.describe Model, type: :model do

~以下テスト~
```
しかしrequire 'rails_helper'と毎回記述するのは面倒くさいので省略できないか調査した

## 解決法
.rspecに以下のコードを追加する

```ruby:.rspec
--require rails_helper
```

## 結果
以下のようにしてもテストが動き、コードを削減することができた

```ruby:model_spec.rb
Rspec.describe Model, type: :model do

~以下テスト~
```

## 参考記事
https://qiita.com/yuta-ushijima/items/ffb34823b8bba2180c94


## 最後に

お読みいただきありがとうございました。
【React custom hooks】文字を順番に表示するカスタムフック

# 概要
本当はcssでやったほうがパフォーマンスはいいと思いますが、ちょっと面倒だったのでカスタムフックを用意してちゃちゃっと実装してみました。

# 完成形
![qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160041/256b27e1-03d8-ad47-2be6-d8c5500b25ff.gif)


# コード

```jsx
// カスタムフック
const useDelayText = (delay, time, text) => {
  const [resultText, setResultText] = useState('');
  
  // 無限ループに入っちゃうので、useEffectで制御
  useEffect(() => {
    // １文字ずつの表示時間を計算
    const showIntervalTime = time / text.length;

    for (let index = 0; index < text.length; index++) {
      // 表示したい文字をスライス
      const t = text.slice(0, index + 1);

      // delayさせたいので、外側でsetTimeoutを入れる
      setTimeout(() => {
        // それぞれの文字数ごとにsetTimeoutでスライスした結果をsetしていく
        setTimeout(() => setResultText(t), showIntervalTime * (index + 1));
      }, [delay])
    }
  }, []);

  return resultText;
}

// 使い方
const First = memo(() => {
  const yusou = useDelayText(0, 1000, '車の輸送');
  const tax = useDelayText(1000, 1000, '税込価格');
  const sijou = useDelayText(2000, 1000, '市場最安値');
  return (
    <div className={styles.fv}>
      <p>{yusou}</p>
      <p className={styles.fv_yellow}>{tax}</p>
      <p className={styles.fv_red}>{sijou}</p>
    </div>
  )
});
```

# 工夫点
はじめはdelayさせる予定はなかったんだけど、delayさせないと同時に文字出てくるわーってなりました。
そこで、delay用の引数をまずは用意して、そこからどうしようかなーって10秒ぐらい眺めていたら、
「もう１個外側に大きくsetTimeoutで囲えばよくね？」ってなってやってみたらうまく動きました。

# 感想
汎用的に使えるかわかりませんし、cssで実装したほうがパフォーマンスはいいと思います。
そんなにパフォーマンスも意識せず、少ない文字数であればこっちでもいいかなーって気がしているので、
使ってみよう！って思って暗たらうれしいです！（LGTMおまちしてます）
エンジニア未経験がWordPressでWEBアプリを制作する際につまずいたこと

# まず初めにどのようなWEBアプリを作ったのか

「[AboutMyself](https://www.aboutmyself.net/)」という、プロフィール専門SNSを製作しました。
※内容については、[こちらの記事](https://qiita.com/sakurasoudai/items/c6c7f55a74532e8fb75e "こちら")を参照。

# 「[AboutMyself](https://www.aboutmyself.net/)」を製作する上でつまずいたこと

1. **SNSを製作する上でのプラグインの選択について困った**  
→日本語の説明ブログなどもかなり投稿されていますので、これに関しては「[BuddyPress](https://ja.wordpress.org/plugins/buddypress/)」一択で大丈夫だと思います。

2. **ログイン・登録画面で自分のサイトのUIではなく、WordPressのログイン画面に遷移してしまう。**  
→これもプラグインがおすすめです。「[Theme My Login](https://ja.wordpress.org/plugins/theme-my-login/)」を入れることで、自分のサイトのUIにあったログイン・登録画面に遷移されます。

3. **ログアウト後の画面にログインをしないと見れないメニューが表示される**  
→以下のスクショのようにログアウト後の画面に、ログインをしなければ見れない画面が出てきてしまいました。(本来「グループ作成」メニューはログアウト後には必要ない)
こちらもプラグインを導入しました。「[If Menu](https://ja.wordpress.org/plugins/if-menu/)」というログイン後とログアウト後のメニュー画面の表示を分けられる優れものです！

![スクリーンショット 2021-01-24 12.18.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402394/1e53c333-0d58-5b39-6854-16dd5c05095e.png)

# 今回WordPressを使ってわかったこと

WordPressを使用することで、プログラミング未経験者でも簡単にWEBアプリが作成できます！プラグインというのは本当に便利な機能ですよね。適宜、欲しい機能にあったプラグインを調べて導入することである程度自由なサイトを構築できます！

最後に「[AboutMyself](https://www.aboutmyself.net/)」のご利用もお願いいたします！
MacのAndroid Studioでフルスクリーンで起動したときのボタンが押せない問題への対処

## 事象
Android Studioをインストールしたあと、フルスクリーンで起動させたのち、Debug Configurationなどのモーダルっぽいアクションを起動させると、ボタンが押せなくなる。

## 発生した環境
- Mac(MacBook Air (M1, 2020), B), BigSur
- Mac Mini, BigSur

## Solution
Android Studioを閉じたあと、

```
defaults write com.google.android.studio AppleWindowTabbingMode manual
```
お洒落に数式っぽく競技プログラミングをしたい

#きっかけ
[真っ白いRubyプログラム](https://qiita.com/jkr_2255/items/bdb72dfd4ceff6612c8b)をみて、Pythonでも似たようなことができないかな、と思ってこの記事を書きました。

#注意
この記事は真面目に競技プログラミングをしたい人には役に立ちません。AtCoder Problemsなどで、暇な時に簡単な問題を面白く解きたい人向けです。

#説明
ギリシャ文字とアルファベットを使い、Pythonで数式にしか見えないコードを書きます。数学好きにはたまらないと思います。残念なことに、**∫**は関数名として使えませんでした......。方針：組込関数を全て置き換えてます。

##テンプレート
```Python
def sin(x):
    print(x)
    
    
def cos(x):
    return int(x)

def tan(x):
    return str(x)

#型変換・表示

def π(x):
    return sorted(x)

def Δ(x):
    return list(x)

def Σ(x):
    return tuple(x)

def Π(x):
    return set(x)

def μ(x):
    return len(x)

def Φ(x,y):
    return x+[y]

#list,tuple,set

def dx(x):#階乗
    if x <= 1:
        return 1
    else:
        return dx(x-1)

def dy():
    return input()
    
def lim(x):
    return x.split()

def log(s,x,y):
    return s.replace(x,y)

def λ(x,y):
    return x in y

def arcsin(x):
    return max(x)

def arccos(x):
    return min(x)

def arctan(x,y):
    return x[y]
```
まず、この関数を書いてください。（一応、三角関数・逆三角関数よく使うギリシャ文字などを入れました。）

##AtCoderの問題を解く
まずは、簡単な問題から解きましょう。[ABC133 A - T or T](https://atcoder.jp/contests/abc133/tasks/abc133_a)を解きます。

```Python
α = lim(dy())
sin(arccos([cos(arctan(α,1))*cos(arctan(α,0)),cos(arctan(α,2))]))
```
なぜか数学っぽく見えます！

次に、この問題を解きます。[ABC040 C - 柱柱柱柱柱](https://atcoder.jp/contests/abc040/tasks/abc040_c)

この問題は簡単なDPで解けます。
**この問題は、この数学っぽいプログラムではTLEします。（小さいテストケースではACます）**

```Python
N = cos(dy())
a = lim(dy())
l = [0,abs(cos(arctan(a,0))-cos(arctan(a,1)))]
for i in range(2,N):
    l = Φ(l,arccos([arctan(l,-1)+abs(cos(arctan(a,i-1))-cos(arctan(a,i))),
                arctan(l,-2)+abs(cos(arctan(a,i-2))-cos(arctan(a,i)))]))

sin(arctan(l,-1))
```
数式らしくていいですね。他にも、色々な問題が（一応）解けます。是非使ってみてください！
応用情報技術者試験の勉強方法

2020年10月に実施された応用情報技術者試験に無事合格したので、勉強方法についてまとめてみました。
これから受験される方の参考になれば幸いです。

# 筆者の経歴
- 大学卒(理系学部)
- 2019年春、IT企業入社
(受験当初、入社2年目)
- 2019年秋に基本情報技術者試験に合格

# 学習期間・学習時間
- 学習期間:11か月間
- 学習時間:
平日　1h
休日　1h

春に受験予定でしたが延期になったので、
上記の時間は学習期間中の平均になります。

夏頃に中だるみして多少さぼったりもしました。

# 使用教材
- 応用情報技術者試験ドットコム
https://www.ap-siken.com/

- 応用情報技術者　午後問題の重点対策
- (応用情報技術者　合格教本)
※合格教本は一応買いましたが、ほぼ使っていません。

# 勉強方法
### 午前対策

午前の対策としては、過去問を解きまくりました。
少なくとも3回ずつくらいは解きました。
1年分解いた後に間違えた問題は解き直していたので、苦手な問題は5回くらい解いています。

「応用情報技術者試験ドットコム」では過去問が解説付きで載っているので、
大変便利でした。

試験対策として、まずは午前の過去問演習のみを行いました。
すべての過去問を3周した後は、試験直前に1周しました。

ちなみに、私は基本情報の時に午前の得点がギリギリすぎたので、応用情報では午前の演習にかなり力を入れています。

基本情報の過去問が応用情報の問題として出題されているケースもあるくらいなので、基本情報でしっかりと勉強されていた方は、ここまでしなくてもいいかもしれません。

### 午後対策

午後の対策には「応用情報技術者　午後問題の重点対策」を使用しました。
この教材では、選択問題の13の分野について、各分野5、6問ずつ演習ができます。

私の場合は下記の分野の演習問題を全て解きました。
- 情報セキュリティ
- データベース
- 情報システム開発
- マネジメント系の問題
- ストラテジ系の問題(経営戦略・情報戦略・戦略立案とコンサルティング技法)

午後問題に関しては2回づつ解いています。
といっても1回問題を解いた後、解説をよく読んでからすぐに解き直しただけです。
正解をほぼ覚えていたので、2回目は意味なかったかも、、、

試験直前には解説の部分だけ、少し目を通しました。

# 試験結果
午前:70.00点
午後:69.00点

ストラテジー系:21.25点(85.0%)
マネジメント系:8.75点(70.0%)
テクノロジ系:40.00点(64.0%)

午後問題選択分野:
- 情報セキュリティ
- システムアーキテクチャ
- データベース
- 情報システム開発
- プロジェクトマネジメント


結構点数ギリギリでしたが、合格しました!

午後問題、勉強していなかったシステムアーキテクチャを選択している謎。
なんで選んだのかはよく覚えていませんが、簡単そうだったのかなぁ。

あと、一応開発の人間なんですが、テクノロジ系の得点率が低い。
基本情報の時もそうだったので、もう少し頑張ろう、自分。

# 最後に
これから資格試験を受けられる方々、仕事と勉強の両立は大変だと思います。
お体にはくれぐれもお気を付けください。

無事合格されることを祈っています！
attr_accessor（アクセサ）の使い方(Ruby初心者)

#アクセサとは
定義：インスタンス変数にアクセスするために必要なもの。

前提：Rubyではそのままだとインスタンス変数にアクセスできない。
　→外部からの変数書き換え、呼び出しができない。

```ruby
class User
    @name = ""
end
 
user = User.new
user.name = "taro"
p user.name
 
#=>rb:6:in `': undefined method `name=' for # (NoMethodError)
 
```
<br>

→インスタンス変数からの呼び出しを可能にするのがattr_reader(ゲッター)

```ruby
class Human
  attr_reader :name #（ゲッター）
  def initialize(name)
    @name = name
  end
end
 
human = Human.new("taro")
puts human.name
```
実行結果

```
taro
```

<br>

→インスタンス変数を外部から書き換え可能にするのがattr_writer(セッター)

```ruby
class Human
  attr_writer :name #(セッター)
  attr_reader :name
  def initialize(name)
    @name = name
  end
end
 
human = Human.new("taro")
puts human.name
human.name = "siro"
puts human.name
```
実行結果

```ruby
taro
siro
```
<br>


→attr_reader(ゲッター)とattr_writer(セッター)の機能を足したのがattr_accessor（アクセサ）

```ruby
class Human
  attr_accessor :name #アクセサ
  def initialize(name)
    @name = name
  end
end
 
human = Human.new("taro")
puts human.name
human.name = "siro"
puts human.name
```

実行結果

```ruby
taro
siro
```

---
参照サイト
https://www.sejuku.net/blog/14168
ScratchでもVimがしたい！

どうも @RiniaOk_yama です。

ScratchでもVimがしたいと思い、実装してみました！

これをVimと呼ぶのは浅はかすぎるという意見もあると思いますが許してください。


#### 基本操作
* hjklで移動
* i でinsertモード
* r で置換
* x で消す

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551034/20f99091-bacd-edc8-2777-0d9ea82f556a.gif" data-canonical-src="https://gyazo.com/eb5c5741b6a9a16c692170a41a49c858.png" width="600" height="400" />
(typo多すぎやねん)



## vimにはない素晴らしい機能

矢印キーが押されたときの処理。命を削りながら実装しました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551034/a88d8842-e8d3-9adb-6088-c3e049c954e0.png" data-canonical-src="https://gyazo.com/eb5c5741b6a9a16c692170a41a49c858.png" width="600" height="400" />

## 残課題
* コスチュームの複製が有限なため、文字に制限がある。
* シンタックスハイライト。
* テーマ
* ビジュアルモード
* その他諸々


## さいごに

公開ました。

※ターボブースト推奨です。(shift押しながらplay)

https://scratch.mit.edu/projects/477868613
[Python]ループ実行時間の目安

# 条件
以下の二重ループを [AtCoder](https://atcoder.jp) のコードテストで各条件 3 回ずつ実行し、実行時間 (ms) の中央値を記録した。
試行した時間帯は日曜 AM 9 時ごろ。

```python
count = 0
for i in range(n):
  for j in range(m):
	  count += 1
print(count)
```

# 実行結果
ネストに関わらず、実行時間はほぼループ回数に依存するとみて良い。

## Python 3.8.2
|m \ n |$10^0$|$10^1$|$10^2$|$10^3$|$10^4$|$10^5$|$10^6$|$10^7$|$10^8$|
|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|$10^0$|| | ||||107|801|7613|
|$10^1$|| | |||110|768|7605|TLE|
|$10^2$|||||108|829|7599|TLE||
|$10^3$||||102|785|7858|TLE|||
|$10^4$|||99|793|7715|TLE||||
|$10^5$||118|758|7597|TLE|||||
|$10^6$|301|947|6967|TLE||||||
|$10^7$|791|7601|TLE|||||||
|$10^8$|7603|TLE||||||||

## PyPy3 7.3.0

|m \ n |$10^0$|$10^1$|$10^2$|$10^3$|$10^4$|$10^5$|$10^6$|$10^7$|$10^8$|$10^9$|
|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|--:|
|$10^0$|| | ||||||277|2135|
|$10^1$|| | |||||280|**7384**|TLE|
|$10^2$|||||||214|1494|TLE||
|$10^3$||||||205|1366|TLE|||
|$10^4$|||||189|1273|TLE||||
|$10^5$||||190|1288|TLE|||||
|$10^6$|||211|1352|TLE||||||
|$10^7$||216|1426|TLE|||||||
|$10^8$|207|1445|TLE||||||||
|$10^9$|1386|TLE|||||||||

**太字**の外れ値は再現性があった。
備忘録（Promise, async/await）

- 実行環境：paizaio
- MacbookPro


#Promiseサンプルコード

```js:Main.js
const promise = new Promise((resolve) => {
    resolve("success");
});
promise.then((value) => {
    console.log(value);
}).catch((error) => {
    console.error(error);
});
```

#async/awaitサンプルコード

```js:Main.js

async function doAsync() {
    return "値";
}
// doAsync関数はPromiseを返す
doAsync().then((value) => {
    console.log(value); // => "値"
});
```

##書き換え

#Promise
##そもそもPromiseとは？

- Promiseは非同期処理を抽象化したオブジェクトとそれを操作する仕組みのこと

#async/await
##そもそもAsync Functionとは？

- Async Functionとは非同期処理を行う関数を定義する構文
- Async Functionは通常の関数とは異なり、必ずPromiseインスタンスを返す関数を定義する構文です


###使い方
- Async Functionは関数の前にasyncをつけることで定義できます。 
- 下記doAsync関数は常にPromiseインスタンスを返す。

```js:Main.js

async function doAsync() {
    return "値";
}
// doAsync関数はPromiseを返す
doAsync().then((value) => {
    console.log(value); // => "値"
});
```



参考資料（いつもありがとうございます）
---

- [【JavaScript】ちゃんと理解しておきたいPromiseの勘所など](https://kde.hateblo.jp/entry/2018/11/01/042432)
- [JavaScript Promiseの本](https://azu.github.io/promises-book/#chapter5-async-function)
- [Promise, async, await がやっていること (Promise と async は書き換え可能？)](https://qiita.com/kerupani129/items/2619316d6ba0ccd7be6a)
- [もっと簡単に async, await, Promise](https://qiita.com/kerupani129/items/cf4048a7d4e3aad75881)
S3のオブジェクトバージョンID=nullとは、"null"で取得できるという事か？の確認

# 何?
S3でバージョニングを有効化した時、有効化する前から置いてあったオブジェクトのバージョンIDはnullとなる。[公式](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/ObjectVersioning.html)
「この値により、同じキーの他のバージョンと区別されます。」とある。

それは、バージョンIDを指定してダウンロードする時、"null"を指定したら取得できるという意味か？という確認
nullと"null"ってPGだと違うから気になってしまう

# 結論
取れる

# 以下確認

バケットを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/9f813c1d-cb2b-41de-c1c2-bcef43c297d5.png)

バージョニングはOFF

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/53b6f58b-ca8a-e65d-0b59-7f60f0378318.png)

k.txtをアップロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/f37577e2-6f9c-0e0e-c072-efd57844b636.png)

k.txtの中身

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/3349a89c-83bc-30ad-fa37-9f5694d6318d.png)

バージョンIDの確認（null）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/2e803a28-d6f5-6944-b902-1dcf511820b0.png)



バージョニングを有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/013b527f-3532-0ce5-dbd3-19df60fc0a69.png)

バージョンIDの確認（やっぱりnull）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/eecbd1f8-bd1f-e8e8-053b-6d0b0b14b361.png)

(ETagって何？と思ったが、ファイル内容のMD5ハッシュ値とのこと[https://qiita.com/hiroyky/items/216077c86fa4b627d7c6])

k.txtを変更してアップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/0ef58f01-db73-702c-71a4-ec9a77080562.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/f0c0159c-480b-a9fa-a0b4-677af5092356.png)

更にもう一回k.txtを変更してアップロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/696f7d7f-315f-66cf-96f0-1fa0d0fc6b46.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/11bf9180-5d3f-fcc9-219f-5ddb76e04650.png)


バージョンIDの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/7dac2b85-5f3b-8bb1-8d29-8a60900d59fa.png)

ID指定なしでダウンロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/4af543aa-4b6a-b080-3d37-3cf9164f6b63.png)

最新が取れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/b130e44b-3a6a-4ab1-ec94-79d92a5f9a12.png)

2番目のバージョンIDを指定してダウンロードする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/f027b833-786e-85d6-a1a2-8e254767e3fb.png)

2番目のが取れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/6819d63e-ea5d-2166-e598-3db6baeb36c1.png)

nullを指定してダウンロードする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/992b4b1b-efb6-5863-740e-6bc5c56c5600.png)

一番初めのが取れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/e371422c-096f-90e6-b4d5-25c063e192dd.png)
LaravelでURLによってDBを切り替える

#URLと.envファイルを紐づける
以下のように追記するとURLごとにDBが切り替わる。

```bootstrap/app.php
// URLを取得する
$requested_url = $_SERVER["REQUEST_URI"];

// URL中に特定の文字列が含まれていた場合に.envファイルを指定のファイルへ変更する。
if(strpos($requested_url,'sample1') !== false){
    $app->loadEnvironmentFrom('.env.sample1');
}
if(strpos($requested_url,'sample2') !== false){
    $app->loadEnvironmentFrom('.env.sample2');
}
```

これに合わせて、
.env.sample1
.env.sample2
を.envをコピーして同階層に作成する。

DB_CONNECTIONだけ共通にしておく。

```.env.sample1/.env.sample2で共通
DB_CONNECTION=samples
```

database.phpに.envをロードする記述を追記

```database.php
        'samples' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
```

.envファイルを認識させるのにコマンドを叩く。
[Laravelで.envファイルが反映されない時](https://qiita.com/tetsu-upstr/items/fa8c7f3aa8ae3195e459)より

>php artisan cache:clear
>php artisan config:cache



#ルーティングの修正
Auth認証など、name属性があるとforeachに失敗するので外しておく。

```web.php

$group_id_list = [
    'sample1'
    ,'sample2'
];

foreach($group_id_list as $group_id) {
    Route::group(['prefix' => $group_id],function(){
      Route::get('/','IndexController@index');

        // AuthRouteMethods.phpのルートを手動で記述
        Route::get('login', 'Auth\LoginController@showLoginForm');
        Route::post('login', 'Auth\LoginController@login');
        Route::post('logout', 'Auth\LoginController@logout');

        Route::get('register', 'Auth\RegisterController@showRegistrationForm');
        Route::post('register', 'Auth\RegisterController@register');
});

```

#マイグレーションとシーダーファイルの修正
foreachするなりして複数化する。
シーダーはDBに合わせて変えた方がいい。

#Auth認証のルートを上書きする
app/Handlerに以下を追記する
予めセッションにURLの一部を入れている前提で書いていますが、自分のソースに合わせて変えてください。
web.phpでnameを外しているので、route()関数は使えません。

```app/Handler.php
    protected function unauthenticated($request, AuthenticationException $exception)
    {
        // セッションからグループURLを取り出す。
        $group_url = request()->session()->get('samples_url');

        return $request->expectsJson()
                    ? response()->json(['message' => $exception->getMessage()], 401)
                    : redirect()->guest($samples_url.'/login');
    }
```
【Rails】js.erb で文字列の途中で改行する方法

# 背景
JSにRubyを埋め込みしていたのですが、長ったらしくなってしまったので、途中で改行したくなりました。

# 方法
行の最後に「\」をつける。

```javascript
document.getElementById('messages').insertAdjacentHTML('afterbegin',
'<p id="<%= @message.id %>">\
    <span><%= @message.content %></span>\
    <span><%= @message.user.name %></span>\
    <span><%= @message.created_at %></span>\
 </p>');
```

「\」の入力方法は、macなら「option」+ 「¥」
[Rails + jQuery]初学者向けAjaxを取り敢えず飛ばしてみたい

#課題
初学者が感覚掴むために取り敢えずAjax飛ばしてみたい。

例として以下フォームで入力された文字をサーバに送ってみる。

```erb:form.erb
<%= text_field_tag :myname %>
```
```html:output
<input type="text" name="myname" id="myname">
```

![スクリーンショット 2021-01-24 11.18.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239796/d2176686-3110-7b82-179c-2612146cd13a.png)


#結論
以下コードで取り敢えず飛ぶ。

```javascript:ajax.js
$("#myname").change(function(){
  let name = $(this).val();
  $.ajax({
    type: 'GET',
    url: "/api/v1/users",
    data: { name: name },
    dataType: 'json'
    })
  .done(function (response) {
    console.log(response)
  }
  .fail(function (){
  });
})
```

受け口のRouteやControllerは一般的なRailsの範囲なので割愛します。

#参考情報
Ruby on RailsのAjax処理のおさらい
https://qiita.com/ka215/items/dfa602f1ccc652cf2888
Python Tweepyを使っていいねを自動化

# Python Tweepyを使っていいねを自動化

## 注意事項

いいねには回数制限があります
噂だと以下の回数なのでAPI実行には注意してください

1分間に30回いいね→3日間規制
1時間に200回いいね→1時間規制
1日に400回いいね→24時間規制

2021/01/24 更新
1日に400回以上いいねした場合、３日間制限と表示された
24時間規制じゃないかもしれない
Tweepyのエラーでは以下のようなメッセージが表示された

```
[{'code': 283, 'message': "This request looks like it might be automated. To protect our users from spam and other malicious activity, we can't complete this action right now. Please try again later."}]
```

やっちゃいました、ごめんなさいTwitter

## いいねの処理

検索のPythonスクリプトは[こちら](https://qiita.com/morita-toyscreation/items/2abc084f73a9593db26c)を参照

[キーワード検索](https://qiita.com/morita-toyscreation/items/2abc084f73a9593db26c#%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E6%A4%9C%E7%B4%A2)した結果をループしてTweetIDを指定して`create_favorite`を実行することでいいねが実行される

```Python
api.create_favorite(id=row.tweet_id)
```

**ポイント**
継続的にいいねを行う場合は、どのツイートまでいいねしたか管理する必要がある
[キーワード検索](https://qiita.com/morita-toyscreation/items/2abc084f73a9593db26c#%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E6%A4%9C%E7%B4%A2)の最終TweetID（since_id）を取得しておきDB、ファイルなどに保存

```Python
since_id = search[0:1]["tweet_id"]
```

例： BigQueryに保存
![スクリーンショット 2021-01-24 2.39.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59264/b609bc92-f7cf-1b6f-7747-4369047c36b2.png)

検索でsince_idを指定することで前回いいねしたツイート以降を検索でき最新Tweetのみいいねをすることができる

```Python
tweets = api.search(
    q=q,
    count=count,
    tweet_mode="extended",
    locale="ja",
    lang="ja",
    include_entities=False,
    max_id=str(last_id - 1),
    since_id=str(since_id),
)
```
InfluxDBを利用して1日の環境データを集計する

InfluxDBを利用して
1日の環境データを集計しましたので
手順をまとめておきます。

今まで家庭菜園で環境モニタリングとして
外気温度、相対湿度、土壌水分、土壌温度を取得していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/c9b21330-9200-bd4b-39f2-3476f95536b4.png)

取得したデータをInfluxDBに保存したものをGrfanaを利用して時系列にグラフ化することは行っていたのですが、それ以上のことは行っていませんでした。

これだけではあまり意味があるとは思えませんが安定して動いているようです。
せっかくデータが取得できていますので、これから分析に利用していこうと考えています。

その手始めとして、今回は前日の最高温度、最低温度、平均温度を表示させてみます。

今回はIndluxDBからデータを呼び出す条件でデータの選択、集計を行っていきます。
InfluxDBではクエリを行う際にはinfluxQLというものを利用します。
[InfluxDB](https://qiita.com/shinfrom/items/7a122c13b437e692d79e)について基礎的なことはこちらにまとめてありますので興味があれば見てください。

まずは昨日分のデータの呼び出しから試してみます。
InfluxDBは時系列データベースなので、呼び出し条件を時間にすることは簡単です。

```
SELECT key FROM Measurement WHERE time > now() -1d
```
で呼び出すことが出来ます。


今回は1日の中での最高温度を呼び出したいわけですが、
InfluxDBにはMAX関数という最大値を呼び出す関数が用意されていますので、この関数を使用します。

```
SELECT max("Wtemp") AS "max_temp_c" FROM "SunnyLettus" WHERE time > now() -1d
```
wtempの部分がカラム、max_temp_cの部分が呼び出した後につけるkey、SunnyLettusno部分がmeasurementになっています。
これで、24時間スパンでの最高温度が呼び出されました。

同様に
最小値選択 MIN()
平均値集計　MEAN()
等も用意されていますので、状況に応じて使い分けます。

ねっ　簡単でしょう。

参考情報
[InfluxDBについて最初に知るべき10のこと](https://qiita.com/nmrmsys/items/cdeb4afa76c591acfd3f)
[公式ドキュメント](https://docs.influxdata.com/influxdb/v1.8/query_language/functions/)
[FAQ](https://community.influxdata.com/t/query-max-min-value-in-influxdb-between-now-and-the-start-of-day/11674)
GraphQLクライアントAltairでBearerTokenによる認証を動的に行う方法

需要どの程度あるかわからんけど、日本語情報あんまなかったので、とりあえずメモをあげとく。

## やり方

ヘッダが環境変数を参照できるようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38323/f0390bd4-0adc-bc4b-08e5-4e3d4dfc51d7.png)

以下をPRE-REQUEST EDITORで設定する
(altair.helpers.requestのurl,パラメータ等は適宜合わせること)

```javascript
const res = await altair.helpers.request(
  'POST',
  'http://test.api.site/auth/sign_in',
  { 
    params: {email: 'hoge@hoge.com', password: 'hogehoge' },
    observe: 'response'
  }
);
altair.helpers.setEnvironment('client', res.headers.get('client'));
altair.helpers.setEnvironment('uid', res.headers.get('uid'));
altair.helpers.setEnvironment('accessToken', res.headers.get('access-token'));
```


## 参考

* [GraphiQL で Header が指定できない対応策](https://qiita.com/acro5piano/items/201ee9362506dc3b6246)
* [Pre request scripts](https://altair.sirmuel.design/docs/features/prerequest-scripts.html)
* [Altair becomes environment friendly](https://sirmuel.design/altair-becomes-environment-friendly-%EF%B8%8F-f9b4e9ef887c)
[linux]duコマンドで「xxxにアクセスできません: そのようなファイルやディレクトリはありません」メッセージを出力しない方法

# やりたいこと

du実行したときのこんなメッセージを消したい．（cronのエラー通知が届いてしまうので）

```
$ du /
du: `/proc/14537/task/14537/fd/3' にアクセスできません: そのようなファイルやディレクトリはありません
du: `/proc/14537/task/14537/fdinfo/3' にアクセスできません: そのようなファイルやディレクトリはありません
du: `/proc/14537/fd/4' にアクセスできません: そのようなファイルやディレクトリはありません
du: `/proc/14537/fdinfo/4' にアクセスできません: そのようなファイルやディレクトリはありません
```

# ソリューション

grepでフィルタリングする。

```bash
du <option> <path> 2> >(grep -v '^du:.*アクセスできません' >&2)
```

# 英語メッセージ版

- [disk usage - du -- ignore file not found errors - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/66894/du-ignore-file-not-found-errors)

```
du 2> >(grep -v '^du: cannot \(access\|read\)' >&2)
```
Javascript関数の引数について

当たり前のように使っている"関数"

JavaScriptを学び始めて2ヶ月ですが、
あたらめて理解ができているのか？

アウトプットしながら整理したいと思います。


```javascript
function fn(a,b,c){
  console.log(a,b,c);
}

fn(0,1,2); //0 1 2
 ```

関数についてですが、結果については言わずもがなこのような結果になります。ここから少し深堀します。

###引数について

####・引数は順番を意識する
引数について考えてみます。
もし引数で c を表示したい場合にはどうすれば良いか？

a,bの入力を省略することができるかと言うと出来ません。

```javascript
例1:
fn(2);  // cに２を渡したい
// 結果: 2 undefind undefind
例2:
fn(2,3)  // bに２をcに３を渡したい
// 結果： 2 3 undefind
```

という感じで a から順番に値を渡している形になります。
つまり、JavaScriptの場合には引数は<font color="OrangeRed">順番が重要</font>と言うことになります。

つまり、cに値を渡したい場合には、

 ```Javascript
    a    b     c
fn(null, null, 1)  
//結果：　null null 1
```

と言うような形で渡すことでcに問題なく値を渡すことが可能です。
余談ですが、空の設定する際は"nulll"を使用したほうがベターです。
"undefind"は、JavaScript側で自動で設定するものだから..と言うことです。

####・引数は全部渡す必要はない

ここで一点気になることがあります。

```javascript
fn(2);  // cに２を渡したい
// 結果: 2 undefind undefind
```

引数が1つでも関数が実行されていることです。
そうなんです。JavaScriptは関数宣言で<font color="OrangeRed">引数を２つ定義していても実行する際は引数が一つで実行することが可能</font>になります。

細かく言うと

```JavaScript
fn(1)  =  fn(1,undefind,undedfind)
```

と言うような形で実行されます。
ただ、計算処理などを入れている場合は,

```JavaScript
function abc(a, b, c) {
  console.log(a, b, c)  //1 undefind undefind
  const d = a * b + c;
  console.log(d);       // NaN: Not a Number 数値じゃないですよエラー
}

abc(1);   
```

と言うような結果になりますのでご注意ください。

####引数の数で違う関数とはならない

コードを書く上で注意したいことの1つが、"重複"

```JavaScript
function abc(a, b, c){
  const d = a * b * c 
  console.log(d);
}
function abc(a, b){
  const d=a / b ;
  console.log(d);
}

avc(4, 2)  // 2
```

このような場合には後から定義した関数abc(a, b)が実行されます。
言語によっては引数の数が違うことで違う関数に見られるケースもありますが、JavaScriptの場合は引数の数によって違う関数とは判断されません。

また、重複をエラーとして検出できるようにしたい場合は、

```JavaScript
const abc = function(a, b, c){
  const d = a * b * c 
  console.log(d);
}
```

このように定義することでエラーを拾ってくれます。
少し意識を変えるだけでバグを減らすこともできるので意識してみましょう。

####引数が複数ある場合

関数の引数が多い、または、数が変動的な場合には
関数コンテキストで用意されている"arguments"を利用することが出来ます。

```JavaScript
function abc() {
  console.log(arguments[0])  //1
  console.log(arguments[1])  //2
  console.log(arguments[2])  //3
  console.log(arguments[3])  //4
}

abc(1,2,3,4);
```

 のように関数に入力された実引数は"arguments"へ格納されます。
もしくは

```JavaScript
function abc(...args) {
  console.log(args)   //[1, 2, 3, 4]
}

abc(1,2,3,4);
```

と"args"と言う実引数が格納された配列を関数の引数に ...args と入力することで実引数を渡すことが可能です。

###まとめ
今回は関数の引数についてまとめました。
引数の扱い方について理解することで、関数のバグを減らすことができるので、しっかり押さえておきたいところです。。。
[自分用メモ]TypeScriptとは?

#JavaScriptにコンパイルされる
ブラウザ上やNode.js上でtypeScriptを実行するときはJavaScriptにコンパイルされてから実行される。

#静的型システム
JavaScriptに変換される時に型検査をしてコンパイルされる。
TypeScriptには型をつける必要がある

#JavaScriptの上位集合
JavaScriptのコードが使える

#なぜTypeScriptを使うのか

- 型を明示的に示せる

```typescript

function add(a: number b: number): number {
  return a + b;
}
```

このようにして引数には数字が入り、数字として返すという風に型が明確に分かるので、どこにどんな型が入るか分かり、他の人が見ても分かりやすいコードになる。
引数の型がstringになると戻り値がnumberなのでエラーがでます。


- 型検査
typescriptからjavascriptにコンパイルされる際に実行される前にエラーを判別してくれるのでコードを正しく検証してくれる

- ES5へのコンパイラ
ブラウザはESのバージョンに追いつかず、最新バージョンに対応したとしてもユーザーがアップデートしないと無意味なので、ブラウザはES5まで対応している。typescriptを使うことで任意のjavascriptのバージョンにコンパイルすることができる。
javascriptはjavascriptエンジン(ブラウザに搭載)によって機械が分かるコードに変換されて実行される。

#typescriptの型

- typescriptとjavascriptの型は一致しているものもあるが、typescriptの型はtscが使うもので、javascriptを使ってる人が使いやすいように敢えて同じ名前にしているだけ。

※javascriptの型はjavascriptエンジンがjavascriptから機械語へのコンパイルに使う型で、typescriptnの型はtscがtypescriptからjavascriptへのコンパイラに使う型

- 型推論
型を加えない状態を言う。typescriptは型を注釈しなくても型を推測してくれる。
型注釈は推論できない時に使う。

- オブジェクトの型
typescriptではオブジェクトを型を明示的に表します。

```typescript
const person: {
  name: string;//オブジェクトの型
  age: number;
} = {
  name: 'Jack',//オブジェクトの値
  age: 21
}
```

下記のように型推論に任せる方法もあります

```typescript
const person = {
  name: 'Jack',//オブジェクトの値
  age: 21
}
```
【Ruby】小数点以下を表示する方法　.to_f

# 背景
平均値を小数以下まで表示させたいシュチュエーションがあったので、調べてみました。

# 例

10÷3を小数点第3位まで出したい時

```ruby
a = 10
b = 3
c = a.to_f / b.to_f

puts c.round(3)

=> 3.333
```

# .to_f
文字列を10進数と解釈して、浮動小数点数Floatに変換するメソッドです。

# .round()
引数に少数点の桁数を指定することができ、四捨五入して表示されます。
DeepL翻訳をはじめとしたテキストコピペ系Webサービスは機密情報の扱いに注意しよう

インターネットには便利なWebサービスがたくさんあります。たとえば英語が苦手な人はGoogle翻訳や[DeepL翻訳](https://www.deepl.com/translator)が手放せなくなってる人もいるんじゃないでしょうか？

![Screen Shot 2021-01-24 at 10.44.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/67f248d9-ed2c-10da-a32b-b3c9bf60f23a.png)

他にも正規表現の実行結果をインタラクティブにチェックできる[Rubular](https://rubular.com/)や、テキストのDiffをオンライン上で確認できる[Diffchecker](https://www.diffchecker.com/)など、手元のテキストを貼り付けて実行結果を確認するタイプのWebサービスはたくさんあります。

![Screen Shot 2021-01-24 at 10.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/c2820a34-898b-30d9-8e1f-9c4851df410d.png)
![Screen Shot 2021-01-24 at 10.47.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/d804471c-bb1a-a779-2e85-21fb2ad3b94b.png)

しかし、こうしたサービスを利用する場合は業務上の機密情報や個人情報をうかつに貼り付けないように注意してください。
**なぜなら、送信したテキストがWebサーバーのデータベースやログに保存され、悪用されるケースが100%ないとは言い切れないからです。**

もちろん、ちゃんとしたWebサービスであれば利用規約やプライバシーポリシーが規定され、安心して利用できるかもしれません。
ですが、そういった規約を確認せず、考えなしにありとあらゆるテキストを送信するのは非常に危険です。

たとえば以下のような情報はWebサービスに送信すべきでないデータです。

- ユーザーのIDとパスワード
- ユーザーの氏名やメールアドレスといった個人情報
- クレジットカードの番号や有効期限
- 外部APIやAWSを利用するためのキーやシークレット
- 社外秘のテキストデータやソースコード

例）暗証番号を含むテキストを翻訳するのはダメ！ゼッタイ！！🙅🏻‍♂️
![Screen Shot 2021-01-24 at 10.54.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/ed235ee0-4d93-73f5-e388-a810f12cd81a.png)

逆に以下のようなデータなら送信しても問題ないかもしれません。（英日翻訳を想定した場合）

- OSSのREADMEファイル
- OSSのissue上のやりとり
- プログラム実行中に発生したエラーメッセージ（メッセージの一部に個人情報や機密情報が含まれないもの）
- 一般に公開されているAPIドキュメントの説明文
- 海外のWebサービスから送られてきた通知メール（メンテナンス通知等）

テキストコピペ系Webサービスを利用する際は、第三者に見せてはいけない情報が含まれていないか、テキストエリアにテキストをコピペする前によく考えてから利用するようにしましょう😉
CentOS7 Composerをインストールする

# 目的

- CentOS7のPCにComposerをインストールする方法をまとめる

# 条件

- CentOS7のPCにPHPが入っていること

# 情報

- 筆者は下記の方法でCentOS7のPCにPHPを入れた。
    - [CentOS7 Laravel環境構築のためにPHP7.4をインストールする](https://qiita.com/miriwo/items/04326679e95420be0670)

# 方法

1. 下記にアクセスする。
    - [https://getcomposer.org/download/](https://getcomposer.org/download/)
1. 表示されたページの下記画像の赤枠部分に注目する。

    ![Composer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/02e6d9cb-b6fc-c136-f815-33312665532c.png)

1. 上記赤枠のコマンドを順番に実行してゆく（下記は2021/01/22現在の内容であり、コマンドが変化する可能性がある。）

    ```terminal
    $ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    $ php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
    $ php composer-setup.php
    $ php -r "unlink('composer-setup.php');"
    ```

1. 下記コマンドを実行してcomposerの実行ファイルを移動する。

    ```terminal
    $ sudo mv composer.phar /usr/local/bin/composer
    ```

1. 下記コマンドを実行してcomposerの実行ファイルを実行する。

    ```terminal
    $ php /usr/local/bin/composer
    ```

1. 下記コマンドを実行して.bashrcを開く。

    ```terminal
    $ vi ~/.bashrc
    ```

1. 下記の内容を開いたファイルに追記して保存する。

    ```.bashrc
    export PATH="$PATH:$HOME/.config/composer/vendor/bin"
    ```

1. 下記コマンドを実行して.bashrcを読み込む。

    ```terinal
    $ source ~/.bashrc
    ```

1. 下記コマンドを実行してcomposerコマンドを実行する。

    ```terminal
    $ composer
    ```

1. `command not found`にならなければ導入が完了している。

# 参考文献

- [https://stackoverflow.com/questions/49352115/cannot-find-composer-folder-after-installing-composer](https://stackoverflow.com/questions/49352115/cannot-find-composer-folder-after-installing-composer)
自然言語処理の概要解説

#自然言語処理アルゴリズム
会話の受け答えを学習させるアルゴリズムの概要を記述します。
本来大量の会話データを学習させる必要がありますが、今回は一つの会話文のみを例に上げています。

##自然言語処理に使用する技術解説
__①：Word2vec__
単語をベクトルに変換する技術

例）「This is a pen」と入力した場合の変換の例
(Word2vecの出力データとして使用されている数字は、全体像をつかむための数字であり、実際の出力結果ではありません。)

入力データ：This is a pen
Word2vec
出力データ：
('This',0.987)
('is',0.8744)
('a',0.688)
('pen',0.2837)

__②：再帰型ニューラルネットワーク(RNN)__
系列データ(時系列データ)を扱う深層学習の手法です。

##自然言語処理の学習アルゴリズム
①：学習データに対して、Word2vecを使用し学習データの単語をベクトルに変換します。

②：会話の単語のベクトルを入力データと出力データとした再帰型ニューラルネットワークを学習させます。

##会話の例「This is a pen.I think so」を学習する時の例
「This is a pen」と入力された場合、「I think so」と出力するRNNの学習器構築例

①：学習データ「This is a pen.I think so.」

■入力データ：This is a pen.I think so.
■Word2vec
■出力データ：
('This',0.987)
('is',0.8744)
('a',0.688)
('pen',0.2837)

(I,0.768)
(think,0.243)
(so,0.6865)

②RNNの学習を行います。
学習は、入力データ、出力データの数字部分のみで行われます。
■入力データ：('This',0.987),('is',0.8744),('a',0.688),('pen',0.2837)
■RNN
■出力データ：(I,0.768),(think,0.243),(so,0.6865)

##自然言語処理の実装結果
会話の一文を入力すると会話の受け答えが出力されます。
例)「This is a pen.」と入力すると「I think so.」と出力されます。

#参考文献
[1]岡谷貴之，深層学習，2015 講談社サイエンティフィク， 講談社．

[2]Word2Vecを理解する - Qiita
Rubyにおける「クラス」と「オブジェクト」の関係について分かりやすく解説してみる

Rubyの勉強を始めて、すぐに出てくる重要キーワード。それは<b>「クラス」</b>と<b>「オブジェクト」</b>です。

Rubyにおいて重要な概念だと分かってるけど、<b>なんとなくの理解</b>で学習が進んでいってしまうことも多いのではないでしょうか。
<br><br>


* クラスはよく使うけど理解が浅い

* 「クラス」と「オブジェクト」の関係がいまいち掴めない

* どうやって「オブジェクト」を作れば良いかわからない

<br>
今日はこのような方に向けて、記事を書いていこうと思います。


## 「クラス」と「オブジェクト」の関係について


<b>クラス</b>とは「もの」を作るときの<b>「設計図」</b>です。

<b>オブジェクト</b>とは設計図をもとに作られる<b>「もの」</b>です。
<br>

クラスとオブジェクトの関係を図に表すと以下になります。

[![Image from Gyazo](https://i.gyazo.com/d014fca9c576993e1750ef74e597c4bd.png)](https://gyazo.com/d014fca9c576993e1750ef74e597c4bd)

<b>クラス</b>が「人間」
<b>オブジェクト</b>が「たろう」「花子」「Michael」です。
<br>

クラスである「人間」には<b>(名前,出身)</b>という設計図が描かれています。

この設計図を使って、「名前:たろう,出身:東京」のオブジェクトを作っています。
<br><br>



つまり、
<b>設計図である「クラス」をもとに、ものである「オブジェクト」を作ることができます。</b>これが「クラス」と「オブジェクト」の関係です。
<br>

ここで、たろうに性別や年齢を加えたい場合は、人間クラスを<b>(名前,出身,性別,年齢)</b>という設計図にすればいいわけです。

## クラスの作り方

ここからは、実際にコード書いてクラスとオブジェクトの理解をさらに深めていきましょう。
<br><br>

まず<b>クラスの作り方</b>についてです。試しにUserクラスを作ってみましょう。<b>user.rb</b>というファイルを作成して、以下のように記述します。

```
class User 
end
```

これだけでUserクラスの完成です。簡単！
<br>


## オブジェクトの作り方

irb(書いたプログラムを実行できるコマンド)を開いて、先ほどのUserクラスを使って、オブジェクトを作っていきます。

```
> require './user.rb' #user.rbのコードを読み込むコマンド
>Michael = User.new
```

User.newを使って、Michaelというオブジェクトを作ることができました。これまた簡単！
<br>


##オブジェクトから、原型となるクラスを確認する方法

<b>全てのオブジェクトはその元となるクラスを持っています。</b>つまりMichaelはUserクラスを持っているはず。それが本当かどうか確認します。

```
>Michael.class
=>User
```

classというメソッドを使って、<b>オブジェクトが持つクラスを確認する</b>ことができます。エラーが出たとき「このオブジェクト、何のクラスを持ってるんだっけ？」となりがちなので覚えておきましょう。
<br>

(補足)いまはUserクラスに設計図(名前,出身など)が何も書かれていません。今回の記事は「クラス」と「オブジェクト」の関係について理解する記事なので、設計図の書き方は省略です。また記事にしたいと思います。
<br>



### まとめ

「クラス」と「オブジェクト」の関係について理解が深まったでしょうか。なんとなくの理解でプログラミング学習を進めてしまいがちですが、少しずつ理解を深めながら、Ruby勉強を進めていきましょう。
<br>

この記事の説明がわかりやすかった！ここ間違ってるよ！次こんな記事を書いて欲しい！などあればコメント、DMよろしくお願いします。LGTMもぜひ。
<br>
Twitterもやってますので、フォローしていただけたらうれしいです。
卓球、心理学、哲学、Webサービス、好きな音楽、カメラ、登山、ランニング、読んだ本などなんでもつぶやいてます。

[https://twitter.com/atsushi101011]
Ruby on Railsでアプリを作ってみよう④

##ビュー
MVCの役割の一つでブラウザにレスポンスとして見た目を返す役割を持っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/3f2d10cb-a51d-c41f-ebd9-cd174e5a7427.png)

ブラウザに表示するのはHTMLで書かれた物ですが、Rubyの記述も使って表現したい物です。
しかしそのままHTMLの文法で書いてしまうと問題があるので特別な書き方をします。

##ERB(Embedded Ruby)
テンプレートエンジンと呼ばれる仕組みを持った物で
HTMLの中にRubyを埋め込むことができます。
ERBファイルは

```
ファイル名.html.erb
```
とhtmlの拡張子に追加してerbを記入することで作れます。

中身の記述をする時に
<%= %>というタグでRubyのコードを挟むことで埋め込んで表示することができます。
埋め込んだコードをブラウザに表示する必要のない場合(条件式など)は<% %> のタグを使います。

コントローラーにインスタンス変数を定義することで
アクションに対応するビューファイルでその値を使うことができます。

```

#コントローラーのファイル
class PostsController < ApplicationController 
  def index
    @post = "こんにちは" #インスタンス変数@postを定義
  end
end
```

ビュー入るでアクションに定義したインスタンス変数を使ってみましょう。

```
#ビューファイル
<%= @post %>  #こんにちは　と表示される
```

```
#ビューファイル
<% @post %>  #何も表示されない
```
![view.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/c6684a07-4c11-5774-dd5e-30fd7528076b.gif)


以上です。
Kotlin Multiplatform Mobileで作ったプロジェクトで実機ビルドができない場合の対応

# 概要
プラグイン`Kotlin Multiplatform Mobile`を利用してプロジェクトを作った際、実機ビルドができないとなった時の対応。

- [Kotlin Multiplatform Mobile](https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform-mobile)

エラー内容としては下記。

```
${Path}/iosApp.xcodeproj Building for iOS Simulator, but the linked and embedded framework 'shared.framework' was built for iOS.
```


# 原因
AndroidとiOS側で共有されている'shared.framework'がiOS Simulator用にビルドされていて、実機では使えないという話。

FWは以下のような処理を経て生成される。
具体的にはConfigurationを基に各ターゲット向けに生成されたFWをコピーし、`xcode-frameworks`という名前にしている。

```shared/build.gradle.kts
val packForXcode by tasks.creating(Sync::class) {
    group = "build"
    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
    val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
    val framework = kotlin.targets.getByName<KotlinNativeTarget>(targetName).binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn(framework.linkTask)
    val targetDir = File(buildDir, "xcode-frameworks")
    from({ framework.outputDirectory })
    into(targetDir)
}
```

Gradleタスクを呼び出しは、iOSのBuild Phaseで行われている。
問題があるのはここ。

```
cd "$SRCROOT/.."
./gradlew :shared:packForXCode -PXCODE_CONFIGURATION=${CONFIGURATION}
```

Xcode10で最適化のため新しいbuild systemに移行された。
その際build phaseでの設定方法やその処理内容に変更が入り、ファイルに変更がなければbuild phaseのスクリプトも実行されなくなった。

詳しい変更内容は下記で確認。

- [Build System Release Notes for Xcode 10](https://developer.apple.com/documentation/xcode-release-notes/build-system-release-notes-for-xcode-10)
- [Behind the Scenes of the Xcode Build Process](https://developer.apple.com/videos/play/wwdc2018/415/)


そのため、`shared:packForXCode`においても一度Simlulator向けにビルドすると、FWは存在しているので実行されなくなる。
`xcode-frameworks`を削除すれば、実機向けにもビルドできるが逆も然りで、この場合Simlulator向けにビルドできなくなる

```
${Path}/iosApp.xcodeproj Building for iOS Simulator, but the linked and embedded framework 'shared.framework' was built for iOS.
```


# 対応
Build Phaseではなく、SchemaのPre-Actionsで`packForXCode`を実行する。
注意が必要なのは `Provided build settings from`も変更しておくこと。

![Screen Shot 2021-01-24 at 9.48.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57963/28db9f7a-75d4-1a08-f551-0da973973c1d.png)
refileを使って複数画像アップロード

某プログラミングスクールにてポートフォリオ作成中。
忘れないようこちらに記載しておきます。
![画面収録 2021-01-24 9.12.06.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942060/389a4936-9cae-885b-b88a-91e1af3e06af.gif)
field（会場）はdeviseで作成しています。
https://qiita.com/japwork/items/dcca7ead2d3c334b124c
この記事だけではうまくできなかったため、メンターに質問してやっと解決できました。
4日ほどここでつまづいてました。。。

```ruby:schema.rb
 create_table "pictures", force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "image_id"
    t.integer "post_id"
  end

  create_table "posts", force: :cascade do |t|
    t.integer "field_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```
名前がややこしいですが。。
field（会場）がたくさんのpost（投稿）をできて、
postにはたくさんのpicture（写真）が入ってます。

```ruby:routes．rb
Rails.application.routes.draw do
  devise_for :fields, controllers: {
    sessions:      'fields/sessions',
    passwords:     'fields/passwords',
    registrations: 'fields/registrations'
  }
  resources :fields
  resources :posts, only: [:new, :create, :show] do
    resources :pictures
  end
end
```
```ruby:post.rb
class Post < ApplicationRecord
  has_many :pictures
  belongs_to :filed, optional: true
  accepts_attachments_for :pictures, attachment: :image
end
```

```ruby:picture.rb
class Picture < ApplicationRecord
  belongs_to :post
  attachment :image
end
```

```ruby:posts_conttoller.rb
class PostsController < ApplicationController
  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)
    @post.field_id = current_field.id
    @post.save
    redirect_to post_path(current_field)
    @posts = Post.all
  end

  def show
    @posts = Post.where(field_id: current_field.id)
  end

  private
  def post_params
    params.require(:post).permit(pictures_images: [])
  end
end

```

```html:posts/new.html.erb
<h2>Posts#new</h2>

<%= form_with model: @post, local: true do |f| %>
  <%= f.hidden_field :field_id, :value => current_field.id %>
  <%= f.attachment_field  :pictures_images, multiple: true %>
  <%= f.submit "投稿する" %>
<% end %>
```

```html:posts/show.html.erb
<%= link_to "写真追加", new_post_path %><br>

<% if current_field.posts.present? %>
  <% @posts.each do |post| %>
    <% post.pictures.each do |picture| %>
      <%= attachment_image_tag picture, :image, :fill, 100, 100, class: "mb-1" %>
    <% end %>
  <% end %>
<% else %>
  投稿写真はありません。
<% end %>
```



コントローラーの途中で

```:
 puts "---"
 pp @posts
 puts "---"
```

と入力するとターミナルで中身の確認ができます。
Unityを始める - Unityの画面構成 -

# はじめに
以前、Unityで開発を始める場合に必要な事をまとめました。

* [Unityを始める - Unityインストールからプロジェクト作成 -](https://qiita.com/nekoharuyuki/items/cd845d58ecbac9ea4768)
* [Unityを始める - Unityちゃんライブステージの構造理解 -](https://qiita.com/nekoharuyuki/items/46cddd94eff01f53d7aa)

Unityでゲーム開発を進める中で、知っておく必要がある**Unityの画面構成**についてまとめます。
また、一般的な基本操作もまとめます。

## 参考になる本
* [Unityの教科書 Unity 2020完全対応版　2D＆3Dスマートフォンゲーム入門講座](https://amzn.to/3owf0Fq)
* [UnityではじめるC#　基礎編](https://amzn.to/36Qfe4p)
* [作って学べる Unity本格入門](https://amzn.to/3mSD19t)

## 参考になるサイト
* [Unity User Manual 2020.2](https://docs.unity3d.com/ja/2020.2/Manual/UnityManual.html)

## 準備
### Unityのプロジェクトの作成

* UnityHubの起動
* 新しいプロジェクトの作成

詳細は「[Unityを始める - Unityインストールからプロジェクト作成 -](https://qiita.com/nekoharuyuki/items/cd845d58ecbac9ea4768)」にまとめました。

# Unityの各画面説明
![スクリーンショット 2021-01-22 16.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/9afaf21f-fddc-d5dd-b349-1fc329d7fc83.png)

## Sceneビュー
Sceneビュー は、作成しているゲーム世界に相互作用できるビューです。シーンビューを使って風景、キャラクター、カメラ、ライト、その他のすべての種類の ゲームオブジェクト を選択し配置します。

## Gameビュー
Gameビュー はゲーム内のカメラから見た絵をレンダリングしています。それは最終的にパブリッシュしようとしているゲーム画面です。プレイヤーがゲームをしている時に、実際に見ていものを制御するには 1つ以上の Camera (カメラ) を使う必要があります。

## Hierarchyビュー
Hierarchy (ヒエラルキー) ウィンドウには現在のシーンにおける各ゲームオブジェクトのリストが表示されます。これらのいくつかは Asset ファイル (3D モデルなど) のインスタンスそのもので、その他は、プレハブのインスタンスで、ゲームのほとんどを構成するカスタムオブジェクトです。オブジェクトはシーンの中で加えたり、削除したりするので、Hierarchy ウィンドウでも、表われたり、消えたりします。

デフォルトでは、オブジェクトは作成された順に Hierarchy ウィンドウにリストされます。オブジェクトをドラッグして上下に順番を替えたり、「子」や「親」のオブジェクトにしたりできます。

## Inspectorビュー
Inspector を使用して、ゲームオブジェクト、アセット、マテリアルなどの物理的なゲームアイテムや、Unity エディター内の設定や環境設定など、ほぼすべてのプロパティーと設定を確認および編集できます。

# Unityエディタ画面の構成
各ビューのタブをドラッグして、好きなところに持っていくことで、レイアウトを変更できます。

## 構成のカスタマイズと保存
画面上部の「Window⇒Layouts」にて始めから登録されているレイアウトを使用する事ができます。

# まとめ
今回はUnityの画面構成についてまとめました。

これらの使い方を知っておく事で、今後のUnityによるゲーム開発のスピードや精度を一気に高める事ができます。また、他の人が作成したUnityのプロジェクトの内容も理解しやすくなります。
【VSCode】ターミナル操作のショートカットコマンド。簡単にターミナルを増やしたり消す方法。

個人用メモです

macでVSCodeでターミナルを追加したり消したい場合に使えるショートカットコマンド。


| コマンド | 内容 |
|:-:|:--|
| cmd + j  | ターミナルの表示/非表示切り替え  |
| ctrl + shift + 5  | ターミナルを追加  |
| $exit  | 現在のターミナルを終了  |
| cmd + option + →  | 右のターミナルに移動  |
| cmd + option + ←  | 左のターミナルに移動  | 

`ctrl + shift + 5`と`$exit`が何かと便利。


<br>
##（補足）よく使うコマンド

| コマンド | 内容 |
|:-:|:--|
| cmd + p  | ファイル検索 |
| cmd + f | ファイル内のテキスト検索  |
| ctrl + b  | サイドバーの表示/非表示切り替え  |
| cmd + shift + p  | コマンドパレットの表示  |
| cmd + /  | コメントアウト  |
| ctrl + tab  | 開いているファイル一覧表示。ファイル切り替え  |
| cmd + , | 設定を開く |
| cmd + w | タブを閉じる |
| cmd + w + k | タブを全て閉じる |

>・cmd + w + k
cmdを押したまま、w、その後にkをクリックする。



<br>
##（補足）コマンドパレットでよく使う検索

| 機能名 | 内容 |
|:-:|:-:|
| zoom  | テキストサイズの拡大・縮小  |
| theme  | カラーテーマ変更  |
checkboxを一括で全てチェックするjQueryコード

## checkboxを一括で全てチェックする

一括選択用のチェックボックスを設置しておいて、複数のチェックボックスをまとめてcheckedにしたい場合


### HTML
```html
<input type="checkbox" name="all_check" id="all">

<input type="checkbox" name="check[]" class="check" value="">
<input type="checkbox" name="check[]" class="check" value="">
<input type="checkbox" name="check[]" class="check" value="">
<input type="checkbox" name="check[]" class="check" value="">
<input type="checkbox" name="check[]" class="check" value="">
<input type="checkbox" name="check[]" class="check" value="">

```


### jQuery

```javascript
$('#all').on('click',function() {
  $('input[name="check[]"]').prop('checked',this.checked);
});

$('input[name="check[]"]').on('click',function(){
  if($('.check :checked').length == $('.check input').length ) {
    $('#all').prop('checked',true);
  } else {
    $('#all').prop('checked',false);
  }
});


```
slick画面読み込み時に一瞬縦並びになるバグ対応

## ロード時に一瞬縦並びになるのをCSSで解決する

### JSを使用せずに解決する

```javascript
  $(".main-slide").slick({
    adaptiveHeight: false,
    autoplay: true,
    dots: false,
    infinite: true,
    speed: 2000,
    slidesToShow: 1,
    arrows: true,
    prevArrow: '<p class="arrow-prev" href="#"></p>',
    nextArrow: '<p class="arrow-next" href="#"></p>'
  });
```
 
 
```html
<div class="main-slide">
  <div><img src="https://placehold.jp/1000x250.png" alt="slide1"></div>
  <div><img src="https://placehold.jp/1000x250.png" alt="slide2"></div>
  <div><img src="https://placehold.jp/1000x250.png" alt="slide3"></div>
</div>
```
 
 
## このソースから出力されたhtml

```html
<div class="slider slick-initialized slick-slider">
```
`slick-initialized`とは、スライダーが初期化（読み込み完了）した時点で付与されるclass。
これを利用して、`slider`と一緒に`slick-initialized`が付与されているか否かでスタイルを分けることで、一瞬縦並びになってしまう状態を防ぐ



### CSSでクラスが付与された時に表示させるようにする

```css
.slider{
  display: none;
}
.slider.slick-initialized{
  display: block; /*slick-initializedが付与されたら表示*/
}
```
 
 
```css
.slider{
  opacity: 0;
  transition: opacity .3s linear;
}
.slider.slick-initialized{
  opacity: 1;
}
```
Homestead vagrant up時に起きたエラー

## vagrant upした時のエラー

```
$ vagrant up
// 略
The name of your virtual machine couldn't be set because VirtualBox
is reporting another VM with that name already exists. Most of the
time, this is because of an error with VirtualBox not cleaning up
properly. To fix this, verify that no VMs with that name do exist
(by opening the VirtualBox GUI). If they don't, then look at the
folder in the error message from VirtualBox below and remove it
if there isn't any information you need in there.

VirtualBox error:

VBoxManage: error: Could not rename the directory '/Users/ユーザー名/VirtualBox VMs/ubuntu-20.04-amd64_1611444899357_74376' to '/Users/dachenghaidou/VirtualBox VMs/homestead' to save the settings file (VERR_ALREADY_EXISTS)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component SessionMachine, interface IMachine, callee nsISupports
VBoxManage: error: Context: "SaveSettings()" at line 3249 of file VBoxManageModifyVM.cpp
```
vagrant upした時にこのようなエラーが起きました。

## 原因
VirtualBoxで直接操作した際に、除去ボタンを押した際に、全部削除しなかったことが原因で、残っているというエラーでした。
![スクリーンショット 2021-01-24 8.59.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/cd63605d-6cda-506e-9484-b1f541db06ba.png)

## 解決策
フォルダから消去する。

```
Users/ユーザ名/VirtualBox/ここ
```
ここという場所で該当(今回はHomesteadというフォルダ)フォルダを消去。

そうすると解決しました。
【競プロ日記/Swift】深さ優先探索(部分和問題)

##部分和問題
###問題
配列A[A1、A2………An]が与えられる。その配列内からいくつか選択肢、その和がkと等しいか判定せよ。
※制約
・1 <= n <= 20
・-10⁸ <= a(i乗) <= 10⁸
・-10⁸ <= k <= 10⁸

###解答
```swift
//以下入力値例
let array = [2,3,8]
let sumValue = 18

func equalToSumValue(count: Int, sum: Int) -> Bool
{
    // 選択管理
    if count == array.count {
        print("count:\(count),sum:\(sum)")
        return sum == sumValue
    }
    
    // 値未選択時
    if equalToSumValue(count: count + 1, sum: sum) {
        return true;
    }
    
    // 値選択時
    if equalToSumValue(count: count + 1, sum: sum + array[count]) {
        return true;
    }
    return false
}

func solve()
{
    if equalToSumValue(count: 0, sum: 0) {
        print("correct")
    } else {
        print("incorrect")
    }
}
solve()

//出力結果
//count:3,sum:0
//count:3,sum:8
//count:3,sum:3
//count:3,sum:11
//count:3,sum:2
//count:3,sum:10
//count:3,sum:5
//count:3,sum:13
//incorrect
```
###解説
上記はbit全検索を再帰関数を用いて行う処理になります。
図で表すと下記のような流れで、全検索していきます。処理の流れとしては配列の後ろの値から選択していくので、図の一番下から上に向かって処理が行われていきます。
![20200105170127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/4118773d-a6c2-6425-ba0c-7145bd203296.png)

#参考
https://drken1215.hatenablog.com/entry/2020/01/05/185000
https://qiita.com/drken/items/e77685614f3c6bf86f44
Ryzen CPUとWestern Digital製SSDの組み合わせでSSDが読み込めなくなる不具合を回避する

Ryzen CPUとWestern Digital製SSDの組み合わせでSSDが読み込めなくなることがある不具合があります。
ThinkPad T14 Gen1 (AMD) + WD SN550 1TBでの発生を確認しました。

下記のようなログが出力されます。

```
EXT4-fs error (device nvme0n1p1): ext4_find_entry:1463: inode #123456: comm Foobar: reading directory iblock 0
```

NVMeデバイスの省電力を制御するAPST（Autonomous Power State Transition）に起因する不具合のようです。

## APSTを無効にする

管理者権限で `/etc/default/grub` をテキストエディタで開きます。

```
sudo nano /etc/default/grub
```

```GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"```
を
```GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nvme_core.default_ps_max_latency_us=5500"```
に書き換え、保存します。

管理者権限で `update-grub` コマンドを実行します。

```
sudo update-grub
```

Ubuntuを再起動します。
再起動後はSSDが読み込めなくなることがなくなります。

### References

* [208123 – Kernel crashes due to NVMe disk: WD Blue SN550 (WDC WDS100T2B0C)](https://bugzilla.kernel.org/show_bug.cgi?id=208123)
* [Investigating kernel crashes due to NVMe disk - Discussions in English / on using Fedora - Ask Fedora](https://ask.fedoraproject.org/t/investigating-kernel-crashes-due-to-nvme-disk/7620)
* [Ubuntu 17.04 その66 - 一部のSSDでボリュームが読み込み専用になってしまう現象 - kledgeb](https://kledgeb.blogspot.com/2017/05/ubuntu-1704-66-ssd.html)