OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript学習(ES6) 基礎編　~forEachメソッドとは？~

こちらではJavaScript学習の備忘録を記載しております。
プログラミング初心者、関心をお持ちの方々の参考になれば幸いです。
* * *
#### forEachメソッドとは？

**配列の中の要素を１つずつ取り出して、すべての要素に繰り返し同じ処理を行うメソッド**。


```javascript:script.js
配列 = [要素1, 要素2, 要素3];

配列.forEach((引数) => {処理});  // 配列の中の要素を１つずつ取り出し、同じ処理を行う 
``` 

#####上記メソッドの処理の流れ
①要素1が引数へ代入され、要素1に対しての処理が行われる
②要素2が引数へ代入され、要素2に対しての処理が行われる
③要素3が引数へ代入され、要素3に対しての処理が行われる

#### forEachメソッドの使い方


```javascript:script.js
const nembers = [1, 2, 3];

nembers.forEach((nember) => {console.log(nember); });

// 出力結果
1
2
3
``` 
また、上記引数に入っている関数
**(nember) => {console.log(nember);}**
を**コールバック関数**と呼ぶ。

#### 長いコードの書き方

forEachメソッドのように、引数にコールバック関数を使うメソッドはコードが長くなりやすいため、以下のように書くことが多い。
処理前の中括弧「 **{** 」から改行することで、長いコードでも見やすくなるという利点がある。

```javascript:script.js
const nembers = [1, 2, 3];

nembers.forEach((nember) => {
  console.log(nember);
});
``` 

* * *
####おわりに
本当に最初の基本的な部分であります。
ご指摘あれば、よろしくお願い致します！！
tailwindcssでPC2カラム、スマホ1カラムを実装する

# やり方

```css
<div class='flex flex-wrap'>
  <p class='w-full lg:w-1/2'>
    ここはPCだと2カラムの左側、スマホだと1カラムになります
  </p>
  <p class='w-full lg:w-1/2'>
    ここはPCだと2カラムの右側、スマホだと1カラムになります
  </p>
</div>
```

flex-wrapのドキュメントは下記

https://tailwindcss.com/docs/flex-wrap

https://developer.mozilla.org/ja/docs/Web/CSS/flex-wrap

親アイテムの中を横幅が入るだけ自動で詰めてくれる。
[React Testing Library] debugコマンドで出力が途切れる場合の対処方法

Reactのテストファイルに以下関数を埋め込んで、出力をデバックするケースがあると思います。

```js
// コンポーネントのレンダーを確認
debug()
```

しかしレンダー結果の行数が長い場合、以下のように3点ドットで、全て出力されないケースがあります。
![スクリーンショット 2021-04-27 9.51.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33632/494e1d02-eaa9-0799-950b-7c90318a731e.png)
この場合、以下のように出力サイズを上げて確認できます。

```terminal
DEBUG_PRINT_LIMIT=10000 npm test
```

[参照リンク: Debugging](https://testing-library.com/docs/dom-testing-library/api-debugging/#automatic-logging)
TGAN, CTGANの使い方メモ

# 何をするものか


GANでテーブルデータをaugmentationしてやろうというものです。

GANが学習できるぐらいデータ量があるならあんまり効かないんじゃないかという話もありますがこちらの記事によるとそこそこ効いてくれるようです。
https://qiita.com/jovyan/items/c41ab61a6b04e9a6e4df


# TGAN


github repository
https://github.com/sdv-dev/TGAN


## 1. インストール


pipで入ります


```terminal:pipでインストール
pip install tgan
```


## 2. 使い方


### 2-1. データの準備


付属しているサンプルデータでやってみます


```python:
from tgan.data import load_demo_data
data, continuous_columns = load_demo_data('census')
print(data.shape)
data.head(3)
```


### 2-2. モデルをつくる


データは連続値と離散値の2つに分けて扱われるので、どの列を連続値として扱ってほしいか指定します。


```python:
from tgan.model import TGANModel
tgan = TGANModel(continuous_columns)
```


### 2-3. 学習する


fit()すればGANモデルの学習がスタートしますが、データに欠損値やinfがあるとエラーになるので適当な前処理が必要です。このデータは1行だけ欠損値が入ったデータがあるのでdropna()して学習してみます。


```python:
tgan.fit(data.dropna(axis=0))
```


### 2-4. データを生成する


あとはいくつ生成するか指定してGANモデルにデータを作ってもらうだけです


```python:
num_samples = 1000
samples = tgan.sample(num_samples)
samples.head(3)
```


### 2-5. モデルの保存


作ったGANモデルは以下のようにして保存できます


```python:保存する
model_path = 'models/mymodel.pkl'
tgan.save(model_path)
```


```python:上書きを有効にして保存する
model_path = 'models/mymodel.pkl'
tgan.save(model_path, force=True)
```


### 2-6. モデルの読み込み


```python:
new_tgan = TGANModel.load(model_path)
new_samples = new_tgan.sample(num_samples)
new_samples.head(3)
```


# CTGAN


TGANの改良版です

github repository
https://github.com/sdv-dev/CTGAN


## 1. インストール


pipで入ります


```python
pip install ctgan
```


## 2. 使い方


### 2-1. 学習～生成


TGANとは逆で離散値列のlistを渡して指定します。


```python
from ctgan import CTGANSynthesizer
from ctgan import load_demo

data = load_demo()

# Names of the columns that are discrete
discrete_columns = [
    'workclass',
    'education',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'native-country',
    'income'
]

ctgan = CTGANSynthesizer(epochs=10)
ctgan.fit(data, discrete_columns)

# Synthetic copy
samples = ctgan.sample(1000)
```


### 2-2. モデルの保存


```python:
ctgan.save('my_model.pkl')
```


### 2-3. モデルの読み込み


```python:
ctgan2 = CTGANSynthesizer().load('my_model.pkl')
ctgan2
```
Nuxtで作ったページをIEで見た時に別ページへ飛ばす（IE対応）

## 思い

**TLDR:** IE11はレガシーってことをユーザーに気づかせてあげたほうが良いんじゃない？

EdgeもChromium版になり世界平和が近づく中、未だ一般的なサポートはまだまだ継続中のIE11は「モダンではないWebブラウザ」として国内で未だ7%程度の利用率をほこり対応が必要なケースは多いです。

ただJavaScriptの対応状況がいけてなかったりでモダンWeb開発をする上では弊害になるため、思い切って「このブラウザーは対応していないよ！」って表示してあげるケースもあります。個人的にはこういうのどんどん進めてITリテラシーが低いユーザーにも「IEはもう古いんか……」って思ってもらうことも大切な気がします。7%のためにわざわざ対応することのコスト対効果を考えて、プロダクトごとに適切な判断をしていきましょう。

## 対応方法

### 1. staticにIE11でも見れる優しいページを作る

```html:static/browser-check.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>IE11は対応していません</title>
  </head>
  <body>
    IE11は対応していません。モダンなWebブラウザを使ってください。
    <li>
      <ul>Chrome</ul>
      <ul>Firefox</ul>
      <ul>Safari</ul>
      <ul>Edge</ul>
    </li>
  </body>
</html>
```

CSSなんかも必要に応じてセットで置いておきましょう

### 2. pluginsにIEチェック用のプラグインを作成する

```js:plugins/browser-check.js
const userAgent = window.navigator.userAgent

// IEの場合、browser.htmlを開く
if (userAgent.indexOf('Trident') !== -1) {
  window.location.href = 'browser.html'
}
```

UserAgentによるこの判別方法はエンジンを元に判定しているので、IE11以外のIEに反応するかはわかりません。

### 3. nuxt.config.jsからpluginsを読み込む

```js:nuxt.config.js
// 前略

  /*
   ** Plugins to load before mounting the App
   ** https://nuxtjs.org/guide/plugins
   */
  plugins: ['~/plugins/ie-taiou.js'],

// 後略
```

プラグインはリストの順番が読み込む順番になるので、必要に応じて順番を変えてあげてください。

以上で対応は完了です。
シンプルですがブラウザごとの個別の対応なんかももしあれば同じような方法でできると思います。
ただ当然画面に影響を与えるような処理は、コンポーネント側でやった方がいいのであまり出番はなさそう。
会社のネットワークへVPN接続したPCから自宅プリンタに接続する方法

会社から支給されているWindows PCが、会社のネットワークへ強制的にVPN接続してしまうので、

**自宅プリンタに接続できない**

という弊害があった。悪戦苦闘した結果、

* 「会社のネットワークへ強制接続してしまう」メインのLANポートとは別に、もう１つLANポートを追加
* 追加したLANポートを自宅ネットワークに接続し、固定のアドレスをアサイン（デフォルトGWは設定しない）

すると、その追加したLANポートを経由して、すんなり、

**自宅プリンタに接続できる**

ようになった。めでたしめでたし。
【AWS】EC2とは(簡単に)

AWSに関してこれから少しずつqiitaにまとめていこうと思う。

## EC2とは
``Elastic Computed Cloud = EC2``
EC2とは、クラウド環境で動作する仮想マシンを提供するサービスであり、サーバーやネットワーク機器などのハードウェアはAmazonで管理されている。このEC2は、仮想マシンを起動しているだけ費用がかかるという課金方式になっているので、最初に大きな初期投資をすることは必要がない。

基本時に、EC2を設置したら、このEC2インスタンスの管理者はインターネット上でEC２にリモートアクセスをしサーバーの設定を行うことが普通らしい。

## EC2の料金
EC2には無料枠がある.勉強するときはこの無料枠を使うといい。
一定の条件を満たすと、月750時間までEC2インスタンスの利用が無料。
一定の条件とは、、、、以下
<dl>
  <dt>条件1</dt>
  <dd>AWSのアカウントを作成してから12ヶ月以内であること。</dd>
  <dt>条件2</dt>
  <dd>無料対象枠のAMIを使用すること。</dd>
  <dt>条件3</dt>
  <dd>無料対象枠のインスタンスタイプを使用すること。</dd>
</dl>
このような条件が存在する。

## 

## 参考記事
[Amazon EC2 の料金](https://aws.amazon.com/jp/ec2/pricing/)
ESXiとは？

## 勉強前イメージ

vmwareで見る感じ・・・
でもよくわかってない

## 調査

### ESXi とは

読み方はそのまま、 いーえすえっくすあい。
vmwareのソフトウェア製品で、1台のサーバに仮想サーバを構築するもの。
ベアメタル型のハイパーバイザーで複数の環境があっても外部からは別環境として動作してるように振る舞う。

元々2001年に VMware ESX が発売されており、
2008年に仕様が変更された VMware ESXi が発売。
2010年以降は VMware ESX は廃止され VMware ESXi のみになった。

### ハイパーバイザーとは

コンピュータを仮想化するためのソフトウェアで、
ホスト型 と ベアメタル型に分類される

- ホスト型

OS上でアプリケーションのソフトとして稼働する。
導入が比較的安易

- ベアメタル型

ハードウェアを直接制御するタイプ
ホスト型より処理速度の低下が少ない。

## 勉強後イメージ

よく見るから結構製品に閉じた話じゃないかな？って思ってたけどvmwareの製品のことなのか
ホスト型とベアメタル型のイメージは
ホスト型→PCで環境つくりたいとき
ベアメタル型→サーバとして動かしたいとき
のイメージ。

## 参考

- [ESXiって何だ？](https://thinkit.co.jp/article/127/1)
- [ハイパーバイザーとは？種類とメリット、デメリットを解説](https://blogs.manageengine.jp/itom_what_is_hypervisor/#:~:text=%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E4%B8%8A%E3%81%A7,%E3%83%9B%E3%82%B9%E3%83%88%E5%9E%8B%E3%81%AE%E7%89%B9%E9%95%B7%E3%81%A7%E3%81%99%E3%80%82)
初心者殺しの倒し方

# 対象読者
- プログラミングを始めたばかりの人

# なぜこの記事を書いたのか
- プログラミングには数々の初心者殺しがあり、それらをどうやったら倒せるのかを伝えたい


<!-- ******************************************************************* -->
# 共通事項
- 分からなければ一旦先に進む
    - 分からないことに囚われすぎると時間を浪費し、時間が足りなくなって殺される
    - 「これは復習が必要だ!!」と思ったら、次の通りに学習する
- 1行ずつ理解する
    - 1行ずつ (必要であればもっと細分化して) コメントを書くなどして学習する
    - 実務でやると「不要だから消して」と言われるので学習用のコードでやる。<br>
      納品用のコードでやるならレビュー前に消す。


<!-- ******************************************************************* -->
# 代入
- `=` を ← (左向きの矢印) と読み替える
    - `=` から「等しい」を連想していると `==` が出てきて殺され、`!=` や `+=` にオーバーキルされる
- 「右辺の演算結果」を「代入する」ことを理解する
    - これを理解していないと `n = n + 1` に殺される

```js:学習コメントサンプル
// (1)変数 a を宣言する
// (2)2 を生成する
// (3)a に 2 を代入する
let a = 2;

// (1)変数 b を宣言する
// (2)3 を生成する
// (3)b に 3 を代入する
let b = 3;

// 変数 c を宣言する
let c;

// (1)a+b を計算する
//    この時点で a=2, b=3 なので a+b=5
// (2)c に 5 を代入する
let c = a + b;

// (1)c+9 を計算する
//    この時点で c=5 なので c+9=14
// (2)c に 14 が代入する
c = c + 9;
```

<!-- ******************************************************************* -->
# 反復
- 「反復回数を制御すること」と「反復対象の処理を書くこと」は __別々にやる__
    - 同時にやると混乱しているうちに殺される
    - 反復回数を正しく制御できたあとに反復対象の処理を書こう
- 条件式は「__継続__条件」であることを理解する
    - 日本語だと「〇〇になるまで続ける」と言うので終了条件と勘違いして殺される
    - 「〇〇になるまで続ける」ではなく「〇〇にならないうちは続ける」と言い換えよう (終了条件を逆にすれば継続条件になる)

```js:2重ループサンプル(九九の表示)
// まずはこれだけ書いて実行してみる
for (let i = 0; i < nums.length; i++) {
  console.log(i);
}

// 次はこれで実行してみる
// 新人プログラマの多くは外側の反復をコピって内側の反復を作るが j に変えるのを忘れて殺される
// 表示結果を見ても分からないときは console.log(i + '==============') に変えて見やすくしてみよう
for (let i = 1; i <= 9; i++) {
  console.log(i);
  for (let j = 1; j <= 9; j++) {
    console.log(j);
  }
}

// 反復回数を正しく制御できていることが分かったので反復対象の処理を書く
for (let i = 1; i <= 9; i++) {
  console.log(i + '==============');
  for (let j = 1; j <= 9; j++) {
    console.log(j);
    console.log(i * j); // 反復対象の処理
  }
}

// 最後に確認用の console.log() を消す
for (let i = 1; i <= 9; i++) {
  for (let j = 1; j <= 9; j++) {
    console.log(i * j); // 反復対象の処理
  }
}
```

<!-- ******************************************************************* -->
# 関数
- 「コードは上から動く」という考えを __捨てる__
    - この考えを後生大事に持っていると、関係ないコードをすべて読むことになり殺される
- 関数の中身は必要になるまで __見ない__
    - 必要になるまではブラックボックスとして扱う
    - 中身は関数と引数の名前から予想できるようにしておく (それぐらいのIT用語力 & 英語力をつける)

```js
// 最初に関数が出てくるが一旦無視すること
// merge(arr1, arr2) だから「2つの配列を結合するんだろうなぁ」ぐらいが予想できれば良いし、
// 戻り値を console.log() or デバッグすれば確認できる。
// ここで「JavaScript ...」とか調べ始めると良さげな情報が無さすぎて殺されるし、今この瞬間に必要な知識ではない
function merge(arr1, arr2) {
  return [...arr1, ...arr2];
}

let mergedArr = merge([4, 3, 1, 2], [7, 8, 6, 9]);
```
Backlogをより便利に使うために個人開発したツールを公開しました！

ようやく完成しました！Backlogを強力にブーストするツール。その名もBacklog Boostar Tools。
![bbt_1_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32299/6c1ca4e9-46b9-e67c-9faf-c6af4d88c08c.png)
当ツールには、三つの機能がございます。それぞれの機能の概要は下記の通りです。
#期間集計ツール
backlogプロジェクト内を期間指定して工数集計ができるツールです。
SESや月額時完成保守契約などで、月ごとの工数実績を、プロジェクトごとに出したい、というようなケースがあるかと思います。そういったケースで、便利にお使いいただけるツールかと思います。CSVダウンロード機能も追加しました。
#一斉送信ツール
バックログで保守運用を管理している企業などでは、夏季休業、年末年始休業などのお知らせなどのクライアントへの各種連絡もバックログの課題でやっているケースもあるかと思います。
そうした場合、プロジェクト毎にいちいち同じ課題を作成するのは大変です。
このツールを使えば、一回の投稿でまとめて送ることができます。
#日報作成ツール
バックログ上で全ての業務上のやりとりが完結している企業で働いている人の場合、このツールを使い、毎日の日報作りを効率良く進めていただくことができます。
このツールでは、特定のユーザーが対応した課題のキーとタイトルを、プロジェクト毎に箇条書きで表示してくれます。
#メンバー登録について
メンバー登録をすると、各種設定を保存・呼び出しをすることができます。
バックログのAPIキーなどはDBに保存せず、10分間有効なクッキーとしてセッション中は各ツールを跨いで保存されます。一斉送信ツールの送信先や期間集計ツールの対象PJキーなどは、DBに保存・呼び出しができるため便利かと思います。
#URL
ツールのURLはこちらです。是非とも日頃の業務にご活用ください。
https://backlog-tools.k2hrm.org
【TwitterAPI】エラー「Read-only application cannot POST.」→「いやさっき権限変えたよ？」

Twitter APIを使用してアプリと連携したツイート投稿機能を実装しているところ、上記エラーに遭遇。
API側の設定に権限変更する箇所があったので変更してみても変わらない…という方向けの記事です。

なお、権限変更はProject & Apps→ご自身のアプリ→Settings→App permissionsのところからできます。
![Twitter_Developers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652172/27dbb6ef-e691-918d-c119-43db9cd8e62f.png)

## 結論…Access Tokenの再発行をしよう

どうやら権限変更を反映させるためにはAcces Tokenの再発行が必要らしい。
再発行したところ無事権限の変更が反映された。

### 参考

https://ysklog.net/twitterapi/3397.html

Twitter APIの準備(rails)は以下の記事を参考にしました。

https://qiita.com/ayies128/items/80e1163caa2e1448ff9d
https://qiita.com/ayies128/items/9fab1c68d747aaf96d2d
pythonでgnuradio その7

#概要

pythonでgnuradioやってみた。
AM変調を録音した、wavファイル読み込んでAM復調して、聞く。
信号は、440ｈｚのサイン波、搬送波は、5KHZ。

#サンプルコード

```
from gnuradio import gr, blocks, analog
from gnuradio import audio

class my_top_block(gr.top_block):
	def __init__(self):
		gr.top_block.__init__(self)
		samp_rate = 32000
		self.blocks_wavfile_source_0 = blocks.wavfile_source('a2.wav', True)
		self.blocks_magphase_to_complex_0 = blocks.magphase_to_complex(1)
		self.blocks_add_const_vxx_0 = blocks.add_const_vff((2, ))
		self.audio_sink_0 = audio.sink(samp_rate, '', True)
		self.analog_am_demod_cf_0 = analog.am_demod_cf(channel_rate = 32000, audio_decim = 1, audio_pass = 5000, audio_stop = 5500, )
		self.connect((self.analog_am_demod_cf_0, 0), (self.audio_sink_0, 0))
		self.connect((self.blocks_add_const_vxx_0, 0), (self.blocks_magphase_to_complex_0, 0))
		self.connect((self.blocks_add_const_vxx_0, 0), (self.blocks_magphase_to_complex_0, 1))
		self.connect((self.blocks_magphase_to_complex_0, 0), (self.analog_am_demod_cf_0, 0))
		self.connect((self.blocks_wavfile_source_0, 0), (self.blocks_add_const_vxx_0, 0))

if __name__ == '__main__':
	try:
		my_top_block().run()
	except KeyboardInterrupt:
		pass




```


以上。
DOMの操作

#概要
inputから値を受け取り、要素を生成します。

#HTML
```index.html
<input type="text">
<button>Add</button>
　
　<ul>
  </ul>
```
今回はこちらのHTTMLから情報を受け取り、ul要素を生成して行きます。

inputからの入力内容をul要素に反映していきます。

#JS

```index.js
{
    const add = document.querySelector('button');
  
    add.addEventListener('click',e => {
     const li = document.createElement('li');
     const text = document.querySelector('input');
     li.textContent = text.value;
     document.querySelector('ul').appendChild(li);
    });

  }
```

①定数addにquerySerectorでボタン要素を代入します。
②add.addEventListenerでクリックイベントが起きたときの関数を登録します。
③今回作成する定数liに要素の作成を代入します。
今回はul要素にを作成します。document.createElement(タグ名);でDOM内のツリーに追加することができます。
③input要素から値を受け取るために、document.querySelector('input');で要素を取得。定数textに代入します。
④li要素のvalue属性を取得します。
⑤appendChild(li);で要素の追加を行います。
*removeChild();でノードをとりのぞきます。


あくまで、ＪＳ側で処理しているのはDOMでありHTMLファイルが書き換えられているわけではありません。
【Npm】live-serverを使って簡単にサーバーを立ち上げる方法（※Vscodeの拡張機能live serverではありません）

# 背景
Vscodeの拡張機能でRitwick Deyが開発した「Live Server」。「Go live」ボタンを押せば簡単にローカルでサーバーを立ち上げることができる便利なツールですが、「ファイルの開き方によってはGo liveボタンが表示されない」「エラーになって反応しなくなった」など不具合が生じる場合があります。そこでVscodeの拡張機能ではないコマンドラインでエディターに依存せずサーバーを立ち上げる方法があったので記事にしてみました。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。

#live-serverの使い方
インストールの前にどんなものなのか、使い方を紹介します。手順は以下の通り。

①コマンドラインで、まずはサーバーを起動させたいフォルダーに移動します。
②「live-server」と入力してenterキーを押す

```cl
❯ cd hogehoge

~/hogehoge
❯ live-server
Serving "/Users/username/hogehoge" at http://127.0.0.1:8080
Ready for changes
```
ブラウザでウィンドウが開き、サーバーが起動してページが表示されます。
![スクリーンショット 2021-04-27 7.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/b363e94a-7e62-ed9c-30b0-220bce423db0.png)

# live-serverを使う理由
①AJAXのリクエストはサーバーが立ち上がらないとセキュリティ上の理由で正しく表示されません。 
②コードが修正されたらリアルタイムでブラウザに表示してくれます。開発が楽になりますね。

# live-serverのインストール方法
①npm
以下のコードを入力します。

```cl
npm install -g live-server
```
いくつかエラーが出ますが、問題は起こりませんので無視します。
-gオプションはgobalを意味し、どこからでも「live-server」を使えるようになります。

②github

```cl
git clone https://github.com/tapio/live-server
cd live-server
npm install # Local dependencies if you want to hack
npm install -g # Install globally
```

# オプションについて
live-serverにオプションを付けてサーバーを立ち上げる際のポート番号やアドレスなどを指定することもできます。

|オプション| 概要 |
|:----------|:----------|
|--port = NUM​​BER    |使用するポートを選択します。デフォルト：PORT env varまたは8080  |
| --host = ADDRESS    | バインドするホストアドレスを選択します。デフォルト：IP env varまたは0.0.0.0（「任意のアドレス」）    |
| --no-browser   | ブラウザの自動起動しなくなります    |
| --browser = BROWSER    | 使用するブラウザを指定します    |
|--quiet| -q  | ログを表示しない   |
| --verbose| -V   | 全てのログを表示    |
| --open = PATH   | PATHにブラウザを起動    |


# 参考サイト
https://www.npmjs.com/package/live-server
簡単にハンバーガーメニューを作成できるdrawer.js導入方法

## はじめに
動的なWEBサイト作成でjQueryプラグインをいくつか触ってみたので備忘録としてまとめます。

長いJavascriptを書いて実装していたハンバーガーメニューがこのプラグインを使用すれば簡単にできてしまいます（最初はしっかり書いて実装した方が良いとは思います）。

基本は公式に載っている通りにやっているだけなのですが、もし英語が苦手という方がいれば参考いただければ幸いです。

公式：https://git.blivesta.com/drawer/

## この記事で紹介するプラグイン
drawer.js
できること：スライドして現れるハンバーガーメニューの実装。

## 導入
まずはDrawer、jQuery、iScrollをCDNで読み込みます。
※今回は挙動を確認したいだけなのでCDNを使用します。

```index.html
<!-- drawer.css -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/drawer/3.2.2/css/drawer.min.css">
<!-- jquery & iScroll -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/iScroll/5.2.0/iscroll.min.js"></script>
<!-- drawer.js -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/drawer/3.2.2/js/drawer.min.js"></script>
```

bodyの中にメニューとjQueryを記述。
bodyのclassを指定してdrawerメソッドを使用。

```index.html
<body class="drawer drawer--left"> <!-- bodyのクラスを指定 -->
    <header role="banner">
        <button type="button" class="drawer-toggle drawer-hamburger">
            <span class="sr-only">toggle navigation</span>
            <span class="drawer-hamburger-icon"></span>
        </button>
        <nav class="drawer-nav" role="navigation">
            <ul class="drawer-menu">  <!-- ハンバーガーメニュー部分 -->
                <li><a class="drawer-brand" href="#">メニュー</a></li>
                <li><a class="drawer-menu-item" href="#">ハンバーガー</a></li>
                <li><a class="drawer-menu-item" href="#">チーズバーガー</a></li>
                <li><a class="drawer-menu-item" href="#">チキンバーガー</a></li>
            </ul>
        </nav>
    </header>
    <script>
        $(document).ready(function () {
            $('.drawer').drawer();  //drawerメソッドを使用
        });
    </script>
</body>
```

これで実装は完了です。
お疲れ様でした。

https://gyazo.com/509cafe5dc73c8835880225bb944889d
DataFrameの1番楽で美しい作成方法

今回はPandas初心者に向けて「結局どの書き方が一番美しいの??」という疑問を解消する。
〜feat.独断と偏見〜

パターン1

`import pandas as pd
 import numpy as np
 a0 = np.array([1,2,3,4,5])
 a1 = np.array(['北海道','秋田','岩手','沖縄','鹿児島'])
 IKITEE = pd.DataFrame({
 '数字':a0,
 '場所':a1,
 })
 print(IKITEE)
`
パターン2

`import pandas as pd 
 import numpy as np
 IKITEE = pd.DataFrame(
         {'数字':[1,2,3,4,5],
         '場所':['北海道','秋田','岩手','沖縄','鹿児島']},
 columns = ['数字','場所'])
 print(IKITEE)
`

こんな感じです。
GPT-3でAPI呼び出し時におけるコンテクストの総量上限を取り払う

## 概要

GPT-3でCompletionのEndPointを叩く際，トークンが2049を超えるとエラーがでます．
これを取り除く方法です．


## GPT-3のansewer APIでエラーが出る

APIのレスポンスに下記のテキストが返されるようになります．

```python
　　　 import openai
      response = openai.Completion.create(
            engine=engine,
            prompt=prompt,
            temperature=float(temperature),
            max_tokens=int(max_tokens),
            top_p=1.0,
            frequency_penalty=0.0,
            presence_penalty=0.0,
            stop=["###"]
            )
        export_text = response["choices"][0]['text']
        print(export_text)
```


```python
You requested a completion of 2076 tokens 
(you supplied a prompt of length 1576 and requested to sample 500), 
but this model's maximum context length is 2049. 
If you would like us to add a feature to auto-truncate server-side, 
let us know at support@openai.com.
```


## 対処

そのままだが，サポートにいってマニュアルで撤廃してもらいます．

### 送ったメール

Hello. My name is <my-name> and GPT-3 works great.When I use the factual answering API I got an error saying that 
'''You requested a completion of 2076 tokens (you supplied a prompt of length 1576 and requested to sample 500), but this model's maximum context length is 2049. If you would like us to add a feature to auto-truncate server-side, let us know at support@openai.com.'''
Can you please stop auto-truncate service on server side, please?
Information about my account is as follows.
- mail: <name@mail.com>
- Organization title: <name>
Best regards, <Name>


### その後

月曜日の8時に連絡したら，４時間後の12時半に連絡がきて解除されました．


Hi <Name>, we are not currently auto-truncating server-side so you should be all set. This message is asking for feedback if you would like us to add auto-truncation as a feature. I hope that helps!
ESP32（Arduino IDE）のシリアル通信でエスケープシーケンスを送信する方法

こちらの記事を参照
https://uma-shi.com/archives/7920

```test.ino
//ESC
const char ESC  = '\e';
Serial.print(ESC); 

//TAB は '\t';
//CR　は '\e';
```

シンプルだけど調べるのにとても時間がかかった・・・
任意の数値をBCDに変換する / Python / double dabbleアルゴリズムと少しインチキな方法と

```python
"""
# 普通に10進数の1桁ずつを取り出す。
def bin2bcd(_bin):
    DIGITS_BCD = len(str(_bin))
    bcd = [0] * DIGITS_BCD
    for i in range(DIGITS_BCD - 1):
        _bin, bcd[i] = divmod(_bin, 10)
    bcd[DIGITS_BCD - 1] = _bin
    return bcd
"""

# double dabbleアルゴリズム
def to_bcd_dubdab(_bin):
    DIGITS_BCD = len(str(_bin)) # BCD表現での桁数
    BITS_BCD   = DIGITS_BCD * 4 # その2進数表現での桁数
    
    bcd = 0
    for i in range(BITS_BCD - 1, 0, -1):
        bcd = bcd << 1 | (_bin >> i & 1)
        for j in range(BITS_BCD, -1, -4):
            if (bcd >> j & 0xF) > 4:
                bcd += 3 << j
    return bcd << 1 | (_bin & 1)
        
# 少しインチキな方法
def to_bcd(val):
    # 元の数値を10進数文字列に変換して、
    # それを16進数文字列であると見なして、
    # 数値に戻して返す。
    return eval("0x" + str(val))

# この値をBCDに変換してみる。
val = 9876543210

"""
# 普通に10進数の1桁ずつを取り出した結果
print(bin2bcd(val))
"""

# double dabbleアルゴリズムによる結果(を16進数文字列にして確かめる)
print(hex(to_bcd_dubdab(val)))

# 少しインチキな方法による結果(を16進数文字列にして確かめる)
print(hex(to_bcd(val)))
```

実行結果:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193936/b6107656-b43a-3b72-35c2-20e73a934a57.png)
[Rails]RuboCopの使い方を解説

今回は以下の記事を参考にさせていただきました。
[rubocopの使い方を紹介！インストール時のエラーを解決する方法も](https://qiita.com/KKDDD/items/208430f3b26b56fee9b2)
[RuboCopの基本的な使用方法と出力の見方](https://qiita.com/terufumi1122/items/ad55bf8713c0df053f58)

## はじめに
Rubyの静的コード解析ツールであるRuboCopを使用したので内容をまとめておきます。
RuboCopを使用することで Rubyのコードを解析または自動修正してくれます。

## インストール
Gemfileに下記を入力してください

```:Gemfile
gem 'rubocop', require:false
gem 'rubocop-rails', require:false
gem 'rubocop-performance', require:false
```
RuboCopはターミナル等で使用するため、require:falseをつけるようにします。
これで、bundlerによってRailsアプリ側に自動で読み込まれなくなります。

その後`bundle install`で完了です

```
$ bundle install
```

## 使い方
下記を入力するとチェックがスタートして、結果を表示します

```
$ rubocop
```
***
自動的に修正してほしい時は`-a`を使います。

```
$ rubocop -a
```

## 出力の見方

```
155 files inspected, 16 offenses detected
```
155ファイル中42個の指摘があると言う意味

## 違反レベル(5段階)
Warning以上は直しましょう

`F`Fatal　危険度5
`E`Error　危険度4
`W`Waring　危険度3

`C`Convention　危険度2
`R`Refactor　危険度1

また以下のコードで`W`以上に絞って検出することができます。

```
$ rubocop --fail-level W --display-only-fail-level-offenses
```
以上となります
マスアサインメント機能と脆弱性（Strong Parameters）

## 概要
なんとなくで終わらせないよう、しっかり`Strong Parameters`について理解できるようしっかり手を動かす。



## マスアサインメント機能とは
RailsにおけるDBの更新系処理で複数のカラムを一括で指定できる機能の事。
例えば

```rb
Person.new(name: 'nakamura', age: 29)
```
といったように複数のカラムを一気に保存できる。便利な機能。

## マスアサインメントの脆弱性とは
マスアサインメントはハッシュ形式使用する。
例えばユーザーからのリクエストは `params` 変数に `Hash` として保存されています。

この内容をそのままにマスアサインメント機能を利用して設定していた場合に、
想定していないカラムを更新されてしまう可能性があります。

例えばUserクラスに name, age, admin の3カラムがあり、
adminはユーザーの画面からは更新させない管理者権限だとします。

Userの新規登録処理で、以下のようなコードを書いていた場合、

```rb
user = User.new(params[:user])
user.save
```

悪意あるユーザーが`role`に`admin`という値を設定してリクエストを送ってきた場合(不正リクエスト)、意図せず管理者ユーザーを作られてしまう可能性がある。

それを防ぐためにストロングパラメータという機能がある。



## Strong Parameters(ストロングパラメータ)とは
マスアサイメント脆弱性を回避するためにrails4以降に提供されるようになった機能

```rb
def create
  @person = Person.new(person_params)
end


private

def person_params
  params.require(:person).permit(:name, :age)
end
```

```rb
def <Model名>_params
  params.require(:<Model名>).permit(:<カラム名1>, :<カラム名2>)
end
```
上記のように
あらかじめ設定可能な値を明示的に宣言しておくことで脆弱性を回避できます。



https://qiita.com/tbpgr/items/63028f5e19a2d1617e40
【Unity】ボタンを押している間だけ数字を増やす

#完成形
![count.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/211966e6-8912-e13d-4dd1-f9f4544fb915.gif)

#要素
・ボタンを押す、離す判定
・ボタンを押したままの状態（Hold）の処理
・スコアのテキスト変換、表示
・何秒毎に数値を増やす

#スクリプト

```C#:CountScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CountScript : MonoBehaviour
{
    public Text countText;
    private int count = 0;
    private bool buttonDownFlag = false;
    private float timeleft = 0.04f;

    void Update()
    {
        if (buttonDownFlag) //buttonDownFlagがtrueの時
        {
            Debug.Log("Hold");

            timeleft -= Time.deltaTime;
            if (timeleft <= 0.0)
            {
                timeleft = 0.04f; //1秒間に+25したい＝1/25秒毎に+1
                count++;
                countText.text = count.ToString();
            }
        }
    }

        //ボタンを押した時の処理
        public void OnButtonDown()
        {
            Debug.Log("Down");
            buttonDownFlag = true;
        }

        //ボタンを離した時の処理
        public void OnButtonUp()
        {
            Debug.Log("Up");
            buttonDownFlag = false;
        }
    }
```

#細かい手順
###1, UI設置
Unity上でTextとButtonを配置する

###2, Buttonの設定をする
スクリプトを書き、Buttonにアタッチする
アタッチしたらButtonに`EventTrigger`をつけ、
`PointerDown`　と　`PointerUp`　をつける。それぞれ関数を紐付ける
参考：https://sole-game-creater.com/unit-button-hold-it-down/

###3, カウント設定
スクリプトの最初に「using UnityEngine.UI;」が無かったら書き足す
Unity上で`Hierarchy`のTextオブジェクトをButtonに紐づいているスクリプトにアタッチしておく。（GetComponentの代わり）
あとは上記のスクリプト通り（`Update`の`if(buttonDownFlag)`の中）

ここでは1秒ごとに25足したい（4秒押し続けると100になるようにしたかった）ので、
1/25つまり0.04秒毎に+1をする処理にした。
なのでtimeleft = 1 にすると、1秒ごとに1増える普通のカウントになる。

#つまづいたこと
初めてやったときにつまづいたこと。

#####・`PointerDown`だけでHold判定になっていると思っていた

このEventTriggerで押し続けている処理になってると勘違いしてました。
実際はボタンを押した時だけの処理です。
押し続けているHold状態の処理をするためにFlagを使います
buttonDownFlagというものを用意して、ボタンを押したらtrue、離したらfalseにします。
そしてUpdateの中（＝1フレーム毎に実行）でtrueの時の処理を書くことで、「押し続けている間処理をし続ける」ことができます

#####・1秒毎に+25をそのまま書いたら思ってたのと違った
よく考えたら当たり前だけど、完成形のように数字を増やしたかったのに1秒で+25をそのままスクリプトに書いたら25、50、75・・・と段々に切り替わる感じで表示されてしまった（だから0.04秒毎に1増えるという書き方をしている）

##カウントする数値に上限を設けたい
Updateの中のif文に書き足す

```C#:CountScript.cs
 if (buttonDownFlag && count < 100)
```
草野球の出欠確認Webアプリを作ろう！　part.2

これから作っていく簡単なWebアプリの作成メモ（自分の備忘）です。
自分用なのであまり凝りすぎないように書いていきたい。

[<<前回の記事](https://qiita.com/tomodachi_uec/items/3023a1c3b8f2a8f15ac6)

##今回やったこと

わりと思い付きで管理者権限２種類をUserモデルに追加した。

```bash
$ bin/rails g migration add_admin_to_users admin:boolean
``` 

```ruby:20210426163341_add_admin_to_users.rb
class AddAdminToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :admin, :boolean, default: false
  end
end
```

```bash
$ bin/rails g migration add_sub_admin_to_users admin:boolean
``` 

```ruby:20210426163516_add_sub_admin_to_users.rb
class AddSubAdminToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :sub_admin, :boolean, default: false
  end
end
```

今回作成している出欠確認アプリでは、スーパーアドミニストレータ（=私）がチームの代表１名にアドミニストレータ権限（`admin = true`）を与え登録するところをスタートと考えています。
その後チームの代表者がメンバーを登録していく際に、サブリーダーや副代表などのチームの首脳クラスのメンバーに「疑似的に」アドミニストレータ権限を付与するときに使用する目的で、２種類のフラグを用意した。
（私がアドミニストレータ権限を付与したユーザーが失踪したケースについては、運用保守が必須となってしまうため、この点はもう少し考慮の余地がある）

###スケジュールモデルの作成

出欠の管理をするアプリなので、スケジュールを扱うモデルの作成をする。

```bash
$ bin/rails g model Schedules title:string date_of:date start_time:time end_time:time meeting_time:time
```

※モデルのジェネレートの際、変数の型を指定するのに以下のWeb記事を参考にした。
[Rails migrationで使うデータ型を考える](https://naokirin.hatenablog.com/entry/2019/05/01/235414)

マイグレーションの前に、生成されたマイグレーションファイルを編集する。
（これから使いそうな変数を考えつつ、長い１行のコマンドを作るのはしんどいので、とりあえず作ってからマイグレーションする前に整えることにした）
以下のWeb記事を参考にした。
[NOT NULLなどの制約の設定](https://www.javadrive.jp/rails/model/index9.html)

```rb:20210426172035_create_schedules.rb
class CreateSchedules < ActiveRecord::Migration[6.1]
  def change
    create_table :schedules do |t|
      t.string :title, null: false, default: ''
      
      t.date :date_of
      t.time :start_time
      t.time :end_time
      t.time :meeting_time
      
      t.string :participant_id, null: false, default: ''
      t.string :absentee_id, null: false, default: ''
      t.string :holder_id, null: false, default: ''

      t.timestamps
    end
  end
end
```

本当は日付や時間にも制約やデフォルト値を用意したかったが、日付単体や時間単体のデフォルト設定について知識不足なので、下手に設定するよりも後追いでマイグレーションを追加したほうがよくなるような気がして断念した。

```bash
$ bin/rails db:migrate
```

マイグレーションを実行して、平日だし今回はここまで。
[次回の記事>>](https://qiita.com/tomodachi_uec/items/a8438a0f027260b8578d)
【Flutter】showDialog で Navigator.of(context).pop() を実行しても閉じれない件

こんな情報をほしい人がいるのかわかりませんが、勉強として CupertinoTabScaffold を使っていた際に発生して困ったので、こんなふうにして回避したよ、という話です。

結論から言うと、大抵どこのサンプルも BuildContext 型の引数を context と表示しているので、ネストした場合も考慮して、名前を変えるなりしてちゃんと意識しましょうね、というお話です。

## そもそも何をしようとしていたのか？

iOS の UITabBar のように、タブで切り替えた画面の中でナビゲーションできないかを調査していました。

material の BottomNavigationBar だと、push したときに画面下部のタブバーの部分も覆うように画面が追加されてしまうので、タブバー部分は隠れないように実装するにはどうすればよいか、という調査です。

タブバー部分が隠れないように push できる方法として、CupertinoTabScaffold があることを知りました。

## 何に困ったのか？

タブ内で遷移後、showDialog でプログレス表示を行い、タイトルにもある Navigator.of(context).pop() でプログレスを消そうとしたところ、予想外の結果となりました。
プログレスを消すことができませんでした。
(なんとなく、すぐに理由は推測できましたが・・・)

下の画像をご覧ください。
プログレスを表示した後、数秒後に Home2 と書かれた元の画面の方が pop されてしまっています。

![flutter_cupertinoTabScaffold_dialog.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339/7d113b63-9661-826f-bc77-6b0d28c7dbe5.gif)


一方、CupertinoTabScaffold ではなく、BottomNavigationBar の場合は下のようになります。
pop でちゃんとプログレスが消されています。
なお、BottomNavigationBar なので、 Home2 の画面は画面下部のタブを隠すように push されているのもわかります。

![flutter_bottomNavigation_dialog.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339/f121a826-5821-f1f4-9992-e26bce4df164.gif)

## 解決方法

適切な context を渡してあげれば OK です。
私はまだ感覚的に理解しているだけですが、結論だけ先に書いておくと

```dart
// NG コード
showDialog(
  context: context,
  barrierDismissible: false,
  builder: (BuildContext context) {
    return Container(...);
  },
);
await Future.delayed(Duration(milliseconds: 3000));
Navigator.of(context).pop();
```

```dart
// OK コード
BuildContext innerContext; // 内部の context を保持しておくためのもの
showDialog(
  context: context,
  barrierDismissible: false,
  builder: (BuildContext context) {
    innerContext = context; // builder で使われている context を innerContext に保存しておく
    return Container(...);
  },
);
await Future.delayed(Duration(milliseconds: 3000));
Navigator.of(innerContext).pop(); // context ではなく innerContext の方を使う
```

OK コードの方に変えたことで、下のような動きになりました。

![flutter_cupertinoTabScaffold_dialog2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339/8616133a-c402-3b90-3993-51b0dfa83726.gif)

## まとめ

```dart
showDialog(
  context: context,
  builder: (BuildContext context) {
    // 外側にある context と このスコープ内の context は同じかな？
  },
);
```

今回は showDialog で困ったケースのお話でしたが、上記のように、ネストして builder が存在すると、その存在ごとに引数名を context にしてしまっていると思います。

そうなると、あるタイミングで使いたいと思ったときに、そのタイミングでアクセスできる【context 】は、果たして自分がほしい context なのか？ということを考える必要があります。

OK コードで示した例も、参照の保持の仕方、サンプルが await で 3 秒待つケースだから、ということで、簡単に対処できたケースの１つに過ぎません。


私自身も Flutter の勉強をし始めたばかりなので、こういった初歩的な躓きは全部躓いていきたいと思っています。

差し当たり、本件に関しては showDialog の返り値から context または context のようなものを取得できないのかを調べてみようと思います。

下のようにできたらわかりやすいですよね？

```dart
var dialog = showDialog(...);
await Future.delayed(Duration(milliseconds: 3000));
Navigator.of(dialog).pop();
```
LeetCodeWeekly238B: 1838. Frequency of the Most Frequent Element: 尺取り法

https://leetcode.com/contest/weekly-contest-238/problems/frequency-of-the-most-frequent-element/

# 題意
- $n$個の正の数字が与えられる。
- 「あなたは好きな要素を$+1$してよい」これを最大で$k$回行える。(すべて別の要素を選んでもよい)
- ある$x$を$y$個作りたいと思ったとき$y$の最大数はいくつか？

# こう考えた
例題の通り、$[1,4,8,13]$としよう。まず、ソートする。今回の場合、すでにソートされている。
$+1$しかできないので、ある数字にそろえるとすると、その数より大きい数は小さくできない。つまり、$4$は$+1$を4回行えば$8$になれるが、$8$は操作しても$1$にも$4$にもなれない。

ここで左から順に、それまでの要素をいくつ揃えられるかを考える。例えば、13に合わせるとしよう。kが十分に大きければ$[13,13,13,13]$にできる($k$が本当に大きければ$[14,14,14,14]$などにもできるが、これはyの最大数に意味がない)。
必要な$k$が小さい方から考えると、$[1,4,13,13]$, $[1,13,13,13]$, $[13,13,13,13]$のように、13の一つ左の要素から何個目まで$k$で足りるかを考えるのが良さそうである。また、この時に必要な数は、$(一番右の数 \times 要素の数) - (その区間の和)$ である。わかりやすく考えるなら、$[4,8,13]$を$[13,13,13]$にするのには、$(13-4) + (13-8) + (13-13)$が必要であるが、これは先ほどの式に他ならない。

さて、今回のrは連続区間を求めるものなので、ある要素$l$, $r$番目を選んだ時に$(r-l+1)$を最大と言い換えられる。ここで、$r$を増加させていくと、$l$は必ず減算方向にはいかない。
このため、$l=0$の状態から$r$を引き延ばしていき、各段階で、$l$をどこまで$r$に近づければならないかを考えればよい。

つまり、for rで、lを引き寄せる尺取りをする。

# 実装
```Python3
from typing import List, Tuple
from pprint import pprint
class Solution:
    def maxFrequency(self, nums: List[int], k: int) -> int:
        l = 0
        nums.sort()
        res = 0
        sum = 0
        for r in range(len(nums)):
            sum += nums[r]
            while True:
                targetnum = nums[r] * (r - l + 1)
                if k < (targetnum - sum):
                    sum -= nums[l]
                    l += 1
                else:
                    res = max(res, (r - l + 1))
                    break
        print(res)
        return res
```
https://leetcode.com/submissions/detail/485485346/
background-attachiment:fixed;を使わずにパララックスにする方法(iOS端末、Safari対応)


パララックス背景を実装してiPhoneで見てみたら上手く動かなかったので、調べてみたところ、`background-attachiment:fixed;`で背景を固定するやり方は、iOS端末では対応していないことがわかった。
そこで上記のCSSを使わずにパララックス背景にする方法を調べて、上手く実装できた。

## パララックス背景とは
パララックス（視差効果）は、近年のWEBサイトでよく見る「背景が固定」されているものである。
[ChatWork](https://recruit.chatwork.com/)のサイトでも実装されています。（2021年4月現在）

背景を固定することで、Webサイトに視覚の差異やスピード感・奥行きを演出できます。
おしゃれなサイトにはもってこいの表現技法です。


## 本題
まず、最初に一般的な`background-attachiment:fixed;`を使ったやり方の場合。

```HTML
<div class="example">
     <p>test</p>
</div>
```

```CSS
.example {
     background-image: url(./img/example.jpg);
     background-attachment: fixed;
}
```

`div`に付与した`example`というクラス内で、example.jpgという背景画像を指定。
そこに`background-attachment:fixed;`を置くことで、背景画像を固定していますね。
そのため、スクロールすると背景は動かず周りの要素だけが動くので、不思議な感じになります。

**しかし！！！！**

これをSafariから見ると、なぜか背景は`background-attachment:fixed;`する前の状態のままなのです。。。


調べてみると、下記の記述があるサイトを見つけました。

>iOS端末では「background-attachment: fixed」は効かないらしい
「background-attachment」は、スクロールする時に背景画像を固定したままにするか、
スクロールに合わせて移動させるかどうかを指定するためのれっきとしたcssプロパティです。
なので、このプロパティが間違った記述というわけではありません。
ですが、この「background-attachment」と一緒に「background-size: cover」というプロパティを一緒に記述すると、iPhone端末でバグが発生してしまいます。
これは公式でも確認されているiOSの不具合らしいです。


引用元：[【パララックス・iOS】background-attachment: fixedがスマホで効かない！？原因と解決法を解説](https://taku0.com/ios-parallax#background-attachment_fixed)



## 結構簡単に対応できました

記述し直さないといけないのではないか、と倒れそうになりましたが
結構すぐに対応できました！

擬似要素の`before`を使用していきます。

まず、先ほどのCSSの一個上に親divを追加。

```HTML
<div class="example">
     <div class="example-children">
          <p>test</p>
     </div>
</div>
```

追加した親divに擬似要素`before`を追加します。

```CSS
.example::before {
     content:"";
     display:block;
     position:fixed;
     top:0;
     left:0;
     z-index:-1;
     background-image: url(./img/example.jpg);
     position: fixed;
}
```

背景を`position:fixed`で背景画像固定して、
他の要素が上に重なっているみたいなイメージです。（多分）
なので他の要素より一個下に表示させるため、`z-index:-1;`をつけています。
また、他の要素も、白背景でもきちんと`background-color: #fff`ってやらないと
背景画像がずっと見えてる状態になりますのでご注意を。。。

これは一部分だけパララックス背景にする場合に使えます。
複雑にパララックスが入り組んだサイトにする場合は、JQueryとか使う方が早いかもです。
環境変数を簡単に管理することができるgem dotenv-rails　まとめ

##はじめに
環境変数を使うタイミングがあり、途中で便利なgemがあることを知り、使おうと思ったのがきっかけ。
まだ知識が浅いため細かくは解説できないけど、自分なりにまとめてみました🏄‍♂️

##dotenv-rails　　gem
環境変数を簡単に管理することができるgemのこと

**環境変数**は主に漏洩すると危険なアクセスキーなどを隠して使いたいときや、テスト環境、開発環境などの環境によって異なる値を使いたいときに使う。後者の使い道で使ったことはまだない、、、
私は今回はメールアドレスを隠すために使った。

##使い方

**1.gemインストール**
ここはgemをインストールする時と一緒、bundle installも忘れずにやって

**2.環境を指定する場合**

```gemファイル.
gem 'dotenv-rails', groups: [:development, :test]

---gemが複数ある場合は下記の記述で---

group :development, :test do # 上記と同等
    gem 'dotenv-rails', groups: [:development, :test]
end

```

**3.「.env」ファイルの作成**
.envファイルは環境変数を記述するためのファイル
アプリケーションの直下に作成する。ターミナルにてアプリケーションのディレクトリで**touch .env**と記述して作成する。

```ターミナル.
xxxxxMacBook-Pro アプリケーション名 % touch .env
```

**4.定義する**

```.env.
SECRET_KEY = YOURSECRETKEY
```
のように定義する

呼び出すときは、**ENV['環境変数名']**で呼び出せる

**5.gitで公開しないために**
ここもかなり大事なポイントで、環境変数として使えるようになっているが、このままgitに公開するとモロにみられてしまうので、**gitignoreファイル**に**.env**ファイルを追記して、gitで公開しないようにする。

```gitignore.
/.env

# 環境毎のファイルがある場合
/.env.production
/.env.local,,,
```
ここまでがセット

##参考文献
他にも、環境ごとに環境変数の値を変える方法や、実際の使用例などが乗っている🙇‍♂️
url: https://pikawaka.com/rails/dotenv-rails#Git%E7%AE%A1%E7%90%86%E4%B8%8B%E3%81%8B%E3%82%89%E5%BF%85%E3%81%9A%E9%99%A4%E5%A4%96%E3%81%99%E3%82%8B
C# の Action型の色々な書き方メモ

# これは何？
C# の定義済デリゲート型である Action型の処理を定義する際に、今のC#ならラムダ式でサクって書けてしまえるんでめちゃ便利なわけですが、いつも「これって本来どんな書き方なんやっけ」ってつい気になって寄り道してしまうことを繰り返してしまうんで、将来の自分に向けたメモ書き。

## 引数を持たない Action型

```csharp
// 「定義済のint型変数の値をインクリメントする」だけの処理をAction型変数に代入する
var num = 0;

// 1．delegateキーワードを使った古典的な書き方
Action action1 = delegate () { num++; };
            
// 2. var を使った書き方
var action2 = new Action(delegate () { num++; });

// 3. ラムダ式で書く
Action action3 = () => num++;

// 4. var を使った書き方
var action4 = new Action(() => num++);
```

まあ、3.の書き方が一番短く書けるんやけど、自分的には var って書きたいんで 4.
の書き方がいいかなー。

## 引数を1つ持つ Action<int>型

```csharp
// 例として「int型の引数の値をインクリメントする」だけの処理をAction<int>型変数に代入する

// 1．delegateキーワードを使った古典的な書き方
Action<int> action5 = delegate (int num) { num++; };

// 2. var を使った書き方
var action6 = new Action<int>(delegate (int num) { num++; });

// 3. ラムダ式で書く
Action<int> action7 = num => num++;

// 4. var を使った書き方
var action8 = new Action<int>(num => num++);
```

引数なしの時とまぁ、同じですね。
3. の書き方は引数のカッコを外せてしまうので、やっぱりちょっと違和感を感じてしまうのは僕だけでしょうか。
あとFunc型についても書こうかと思ったけど、まぁこれもほぼ同じですので省略します。
alertログの検索

####oracleDB、crs、asmのアラートログを表示する
```
[root@rac19c-node2 ~]# find /u01 -name "alert*log" | grep trace
/u01/app/grid/diag/asm/+asm/+ASM2/trace/alert_+ASM2.log
/u01/app/grid/diag/crs/rac19c-node2/crs/trace/alert.log
/u01/app/oracle/diag/rdbms/orcl/orcl2/trace/alert_orcl2.log
```
Oracle 一定条件のセッションを強制終了する

Oracle 一定条件のセッションを強制終了するためのSQLのメモです。

例：あるSQL実行しているセッションを強制終了したい場合

```
SELECT 'ALTER SYSTEM KILL SESSION '''
       || S.SID || ',' || S.SERIAL# 
       || ''' IMMEDIATE;' || CHR(13) || '/' 
  FROM V$SESSION S
 INNER JOIN V$SQLAREA A
    ON S.SQL_HASH_VALUE = A.HASH_VALUE
   AND S.SQL_ADDRESS    = A.ADDRESS
 WHERE S.SCHEMANAME = '<スキーマ名>'
   AND A.SQL_TEXT LIKE '%条件%'
```

結果例：

```
ALTER SYSTEM KILL SESSION '141,61561' IMMEDIATE;
/ 
ALTER SYSTEM KILL SESSION '132,6233' IMMEDIATE;
/ 
```

出力した結果をそのまま実行すればOKです。
※十分に注意した上で使ってください。
Dockerとvagrantを一緒に使ってVagrant upができなくなった件について

# はじめに
Dockerを普段は利用しているのですが、昔利用していたVagrantを利用したい場面が出たので、いつも通り`vagrant up`したらエラーが発生したので、その時の対処方法を調べたのでまとめます。

# 問題
vagrant upするとこのようなエラーがでました。

```
Stderr: VBoxManage.exe: error: VMMR0_DO_NEM_INIT_VM failed: VERR_NEM_MISSING_KERNEL_API_2 (VERR_NEM_MISSING_KERNEL_API_2).
```

Dockerとvagrantは一緒に使ってしまうとエラーの原因になるようです。

# 解決方法
① windowsの検索画面からWindowsの機能の有効かまたは無効化　をクリック

・Hyper-T
・Containers
のチェックを外す

② コマンドプロンプトを起動

```
bcdedit　# コマンドを実行
bcdedit /set hypervisorlaunchtype off　# コマンドを実行
```

# おわりに
これを行うと次はDockerのほうでエラーがでるので設定を戻さなければなりませんでした。
VagrantとDockerは共存ができません。
二つ利用したい場合は、Vagrantの上にDockerを載せて二つを利用するのが良いかもしれません。

※この投稿は以前使っていたアカウントにて2020年6月3日に投稿されたものです。
mglearn.plots.plot_nmf_facesで動作が止まってエラーかな?と思った件について

# はじめに
引き続き「Pythonではじめる機械学習」の勉強をしています。
本日はmglearnのデータセットを利用したときに異変がありましたので共有しておきます。

# 問題

```
mglearn.plots.plot_nmf_faces(X_train, X_test, image_shape)
plt.show()
```

でコマンドプロンプトにエラー?が表示されて調べたがなかなかみつからない。
ターミナルには

```
[Memory] Calling mglearn.plot_nmf.nmf_faces...
nmf_faces(array([[0.899346, ..., 0.146405],
...,
[0.09281 , ..., 0.639216]], dtype=float32),
array([[0.179085, ..., 0.420915],
...,
[0.317647, ..., 0.888889]], dtype=float32))
C:\Users\com.conda\envs\tensorflow\lib\site-packages\sklearn\decomposition_nmf.py:1077: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
" improve convergence." % max_iter, ConvergenceWarning)
```

と見たことのない表示があり、検索にかけてもよくわからず。
しかし、実行中から止まらない。

# 解決方法
しばらくそっとしておいたら終了していました。
プログラムは無事エラーなく動きました。
datasetを取得しているのでしょうか？なかなか動かなかったので焦りましたが無事動きました。

```
[Memory] Calling mglearn.plot_nmf.nmf_faces...
nmf_faces(array([[0.899346, ..., 0.146405],
...,
[0.09281 , ..., 0.639216]], dtype=float32),
array([[0.179085, ..., 0.420915],
...,
[0.317647, ..., 0.888889]], dtype=float32))
C:\Users\com.conda\envs\tensorflow\lib\site-packages\sklearn\decomposition_nmf.py:1077: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
" improve convergence." % max_iter, ConvergenceWarning)
C:\Users\com.conda\envs\tensorflow\lib\site-packages\sklearn\decomposition_nmf.py:1077: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
" improve convergence." % max_iter, ConvergenceWarning)
C:\Users\com.conda\envs\tensorflow\lib\site-packages\sklearn\decomposition_nmf.py:1077: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
" improve convergence." % max_iter, ConvergenceWarning)
C:\Users\com.conda\envs\tensorflow\lib\site-packages\sklearn\decomposition_nmf.py:1077: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
" improve convergence." % max_iter, ConvergenceWarning)
C:\Users\co.conda\envs\tensorflow\lib\site-packages\sklearn\decomposition_nmf.py:1077: ConvergenceWarning: Maximum number of iterations 200 reached. Increase it to improve convergence.
" improve convergence." % max_iter, ConvergenceWarning)
______________________________________________________nmf_faces - 356.4s, 5.9min
```

# おわりに
みたことのないエラーやターミナルが動かなくなると不安になり。
おかしいなと調べる初心者の方が私以外にもいると考えメモしておきます。

※この投稿は以前使っていたアカウントにて2020年6月2日に投稿されたものです
Gatsbyでロケーション情報を参照する方法

皆さんこんにちは！

最近学校やらプライベートやらで自分の時間が取れず投稿頻度が落ちたのですが、ちゃんと合間の時間を縫って勉強しております。

さて、今日は現在学習中のGatsby.jsにて現在いるパスやURLなどのロケーション情報を参照したいと思ったので備忘録として書いていきます。

結論から言うと、めちゃめちゃ簡単です！

Reactでロケーション情報を参照するときは``history``とかを使うと思うのですが、このようなプラグインのインストールや面倒な設定は一切行いません。

百聞は一見に如かずということで、例を見ていきましょう！

#locationプロパティ#

なんとGatsby.jsには**デフォルトでロケーション情報を参照することができます**

コンポーネントの引数で``location``を指定してあげましょう！

```javascript
import React from "react"

const Example = ({ location }) => {
  console.log(location)

  return (
    <></>
  )
}

export default Example
```

そうすると以下のような情報がログに出力されます。

```
hash: "###############"
host: "localhost:8000"
hostname: "localhost"
href: "http://localhost:8000/example"
key: "initial"
origin: "http://localhost:8000"
pathname: "/example"
port: "8000"
protocol: "http:"
search: ""
state: null
```

なんて楽なんだと脱帽しました。。。

逆にこんな簡単にできていいのかと不安になりますが、余計なことは考えないようにします。

以上、「Gatsbyでロケーション情報を参照する方法」でした！

Thank you for reading
Anaconda環境構築で ll load failed: 指定されたモジュールが見つかりません。(import numpyas np file....)　のエラーを解決した件について

# はじめに
新社会人になり就活前に途中まで行っていた「Pythonではじめる機械学習」を再開しました。
パソコンも変えて久しぶりのAnacondaを動かそうとしたときエラーがでました。
以前勉強していたコードが動かなくなったので解決策を初投稿します。

# 問題
import numpy as np file "c:\programdata\anaconda3\lib\site-packages\numpy_init_.py", line 140, in from . import _distributor_init file "c:\programdata\anaconda3\lib\site-packages\numpy_distributor_init.py", line 34, in from . import _mklinit importerror: dll load failed: 指定されたモジュールが見つかりません。

と表示される。
numpyなどはAnacondaに作った環境で動くはずなのにと勉強再開してすぐに躓きました。

# 原因
新しいPCにしたことでPathが通っていませんでした。
昔の自分はPathを通す作業をしていたんだと感心。てっきり環境構築の手順から忘れ去られていました。

# 解決策
windowsマークをクリック
環境変数を編集
(ユーザー名)のユーザー環境変数(U)の中にあるPATHをクリック
新規(N)をクリック

C:\Users(ユーザー名)\Anaconda3\
C:\Users(ユーザー名)\Anaconda3\Scripts\
C:\Users(ユーザー名)\Anaconda3\Library\bin
を追加する

# おわりに
これからは調べて分かったことは自分なりにまとめて投稿しようと思います。
早く会社の仕事が自由にこなせるように頑張ります。

※この投稿は以前使っていたアカウントにて2020年6月1日に投稿されたものです。
Twitterアカウントだけで始める量子コンピュータ

#　本物の量子コンピュータを使う

Twitterアカウントだけで本物の量子コンピュータが使えます。
すごい時代ですね。
やっていきましょう。

# やり方

https://quantum-computing.ibm.com/

へ行きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/b4334151-b73f-214f-d0cb-d64945552e6d.png)


Twitterの鳥マークをクリック。

Twitter上でアプリケーション認証を求められるので、承認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/dc2b0e85-2ede-8c27-6a7d-37ec71f1a059.png)

これがIBMQのマイページです。

左上の　Launch composer を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/1f18ee67-f8ba-247b-a9fb-735ad2304f53.png)

”H"という素子と、メーターのマークをドラッグアンドドロップして、置きます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/b923af48-8b0a-7b14-d194-fb396b9f7e4a.png)

デフォルトだと、余分に2量子ビットぶん(q1,q2)が表示されていると思います。
"q"と書いてあるあたりにマウスをもっていくと、ゴミ箱マークが出ますので、2量子ビットぶんは今回捨てます。
（以降で1量子ビットしかない量子コンピュータを使うためです。量子ビット数が多い量子コンピュータほど混雑してます。）


右上の　Setup and run を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/d09b78f6-fbd7-01c6-2e70-8244f27d48ae.png)

以下のようなウインドウが出ます。
ibmq_armonkを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/5ae81fac-a9de-fa92-799d-15722a05bc04.png)


Run を押します。押すと、本物の量子コンピュータに命令が飛びます。
お金がかかったりはしないので、安心してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/ed23ea2c-4c08-9631-1295-7460f387e46e.png)



画面左上の composer jobs をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/4a902cd9-8593-5fce-e5b8-999e7ac7b37b.png)

Pending　（延期）　と出ていたらうまくいっています。
量子コンピュータは世界中の人が使っていますので、順番待ちとなります。
混雑状況により、数十秒から数十分まで変動します。
日本時間では、朝（午前中）が空いています。

クリックすると色々情報が見られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/0de5cfc5-5910-0d94-8ec1-78b804a93b64.png)

最大24分待ちです。。

jobが終わったら、Result histogram を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/a2889461-3b9e-1a14-0de7-4007fd54470b.png)

以下のようなものが出るはずです。
（以下の画像はシミュレーターで3量子ビットでやったものです。上記の流れで実機を動かすと、"0"と"1"のみがヒストグラムに出ると思います。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/05808896-6b37-2aed-e307-2bd67091c67e.png)


これが、本物の量子コンピュータで実行した論理演算の結果になっています。

Runの部分でqasm simulator (シミュレーター）を指定した場合と、 ibmq_xxx (本物）　を指定した場合で
結果がどう違うか比較してみると面白いと思います。
回路を深くしたり、量子ビットを増やすと、途端にシミュレーターと実機の結果が乖離するはずです。
これが、「今の量子コンピュータは雑音が多い」と再三言われている証拠です。


# まとめ

Twitterアカウントで気軽に量子コンピュータを遊んでみよう。
PHPの基本操作⑦ 「ファイルアップロードの受信をする」

##参考書籍
よくわかるPHPの教科書 PHP7対応版

##他記事リンク
- [PHPの基本操作①<br>「簡単な出力と構文、配列、連想配列、少数、フォーマット」](https://qiita.com/kunrenyouAcount/items/7a3bb6e5769ba94a7dc5)

- [PHPの基本操作②<br>「ファイルの読み込み、ファイルの書き込み、XMLの読み込み、JSONの読み込み」](https://qiita.com/kunrenyouAcount/items/bec393cae5901e32ec70)

- [PHPの基本操作③<br>「入力欄、ラジオボタン、チェックボックス」](https://qiita.com/kunrenyouAcount/items/1c66ccee97c33f320fb2)

- [PHPの基本操作④<br>「数字かどうかの判定、正規表現、別ページにジャンプ」](https://qiita.com/kunrenyouAcount/items/5b292d8481a76386fd1e)

- [PHPの基本操作⑤<br>「クッキーとセッションの保存と取得」](https://qiita.com/kunrenyouAcount/items/7324fad1d3d1845de075)

- [PHPの基本操作⑥<br>「電子メールの送信」](https://qiita.com/kunrenyouAcount/items/2172f03af0d8d8a32cc6)

- [PHPの基本操作⑦<br>「ファイルアップロードの受信をする」](https://qiita.com/kunrenyouAcount/items/dece31f962472fb23610)


##ファイルアップロードの受信をする

###送信元のフォーム

1. 通常のフォームと違い、画像をアップロードする際には、<form>に「enctype="multipart/form-data」と記載します。
→通常のフォーム＋ファイルという意味
1. 実際にファイルを添付する<input>は「<input type="file">というタイプを選択します。

上記２点だけでファイルを送信できるフォームの完成です
※ファイルの送信時は必ず<form method="post">にするのを忘れない

```html:index.php
<form action="submit.php" method="post" enctype="multipart/form-data">
  <input type="text" name="ok" >
  <input type="file" name="picture">
  <input type="submit" value="送信">
</form>
```

###データの受け取り先

アップロードされたファイルの取得をするためには「`$_FILES`」を利用します。連想配列としてファイルが保管されているため、「`$_FILES['picture']`」とキー(name属性値)を指定して取り出します。
(通常のフォームの内容であれば、「`$_POST`」で取得可能)

取り出した値はまたそれも連想配列になっています。
この連想配列の中身は決まっていて、以下のようになっています。

- `$file['name']`    : ファイル名(name)
- `$file['type']`    : ファイルタイプ(type)
- `$file['tmp_name']`: アップロードされたファイル(tmp_name)
- `$file['error']`   : エラー内容(error)
- `$file['size']`    : サイズ(size) 

「tmp_name」はアップロードしておくファイルの保管場所のパスとファイル名です。
入力欄(input type="file")→→→(アップロード)→→→tmpフォルダ→→→???→→→目的のフォルダ
ここで「???」にあたる処理を行うのが、「move_uploaded_file関数」です。

```php:tmp→目的ファイルへのアップロード処理
成功失敗 = move_uploaded_file(コピー元, コピー先)
```

ファイルが目的の保存先に移動できれば、<img>を使って画像を表示させることが可能です。
このようにファイルのアップロードは比較的に簡単に行えますが、ファイルアップロードはセキュリティ的に危険な入り口の一つです。そのため、セキュリティの対策の一環としてファイルの拡張子によるチェックを設けます。ファイル名の最後が「gif」「jpg」「png」もののみの受付にします。
この時に使うのが、ファイル名の切り取りできる「substr関数」です

```php
substr(ファイル名, 場所指定)
```

場所の指定の仕方は下記のようにします

- 前から3文字→3
- 後ろから3文字→-3

以上の処理を組み合わせた操作が以下のプログラムになります。

```php:submit.php
<?php
  $file = $_FILES['picture'];
?>
ファイル名(name) : <?php print($file['name']); ?>
ファイルタイプ(type) : <?php print($file['type']); ?>
アップロードされたファイル(tmp_name) : <?php print($file['tmp_name']); ?>
エラー内容(error) : <?php print($file['error']); ?>
サイズ(size) <?php print($file['size']); ?>

<?php
  $ext = substr($file['name'], -4);
  
  if ($ext == '.gif' || $ext == '.jpg' || $ext == '.png') :
    $filePath = './user_img/' . $file['name'];
    $success = move_uploaded_file($file['tmp_name'], $filePath);
    
    if($success) :
?>
      <img src="<?php print($filePath); ?>">
      <?php endif; ?>
  ※拡張子が.gif, .jpg, .pngのいずれかのファイルをアップロードしてください
  <?php endif; ?>
```

※事前に移動先のパスにあたるファイルの作成をしておかなくてはならない