OmniAICreator/Qiita-1.07M huggingface dataset:
【UE4】AnimBlueprintやAnimCurveなどで編集したアニメーションを１ループ分録画する方法

小さいネタ。しかも、知っている人は知っているはず。

以前から、Anim Blueprint や Anim Curves, Additive Layer Tracks などで編集した結果を、Anim Sequence としてベイクする方法がないかと探し回っていた。
いや、もともと録画ボタンを押せば可能なのだが、ちょうど「１ループ分」できっちり録画終了したい。その方法を見つけられないでいた。

…ということで、苦節？年、やっと見つけた。ちゃんとあった！

Window メニュー > <font color="red"><b>Recording Settings</b></font> !!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/e1ff4f3a-f522-788f-bca6-ffe0d5ef3cd4.png)

Recording Settings の画面はこんな感じ：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/8e3ed207-e36e-c297-9acf-a2a80f857eda.png)

ここの「Length」を１ループ分の長さ(秒)で指定すると、録画ボタンを押した後、自動的に録画が終了してくれる。
例えば、１ループが113フレーム分のアニメーションをベイクしたい場合は、Length に

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/90bd57f0-4096-ba16-515e-34227121d3c0.png)

と入力して Enter キーを押せばよい。

> １ループが113フレームで、アニメーションのサンプルレートが30だから、113 ÷ 30 (3.766667 秒)

ただし、焼きあがったアニメーションアセットを開くと、<font color="red"><b>必ずエディタが落ちる↓</b></font> (UE4.25.0しか調べてません)

セーブして、エディタ再起動したあとなら、ちゃんと開く。


> あとは、録画開始のタイミングも指定したいが…　無理か。
ReactでSkyWayを試す

# はじめに

この記事は[とあるハッカソン](https://hmcn.connpass.com/event/173233/)のために事前勉強したものが特に使われることがなかったのでその供養のために書きます。
今回は[skyway-js](https://webrtc.ecl.ntt.com/documents/javascript-sdk.html)を[React](https://ja.reactjs.org/)で試してみたという内容です。実装した内容は本当にチュートリアル程度のものなのですが、意外とReact（nativeじゃない方）の記事がなかったので書いてみようと思いました。

# つくったもの

[こちら](https://skyway-test.now.sh/)で公開しています。単純にお互いのIDを交換しあって１対１のビデオチャットができるというものです。**SkyWay**を用いることで簡単にビデオチャットをアプリに実装することができます。

# 開発環境

デプロイ環境として[Vercel](https://vercel.com/)を使ってみました。理由は、もともとこのSkyWayを[Next.js](https://nextjs.org/)でやろうと思っていてその際に公式から推奨されるものであったのがこれだったからです。しかしNext.jsはskyway-jsのインポートがうまく行かなかったので途中で断念しました。
なので今回も`create-react-app`を使ってReactの環境を構築しました。

# 実装内容

実装したのはこれだけです。

```javascript
import React from 'react'
import { useState, useRef } from 'react'
import './App.css'
import Peer from 'skyway-js'
const peer = new Peer({ key: process.env.REACT_APP_SKYWAY_KEY })

const App = () => {
  const [myId, setMyId] = useState('')
  const [callId, setCallId] = useState('')
  const localVideo = useRef(null)
  const remoteVideo = useRef(null)
  peer.on('open', () => {
    setMyId(peer.id)
    navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then(localStream => {
      localVideo.current.srcObject = localStream
    })
  })

  peer.on('call', mediaConnection => {
    mediaConnection.answer(localVideo.current.srcObject)

    mediaConnection.on('stream', async stream => {
      remoteVideo.current.srcObject = stream
    })
  })

  const makeCall = () => {
    const mediaConnection = peer.call(callId, localVideo.current.srcObject)
    mediaConnection.on('stream', async stream => {
      remoteVideo.current.srcObject = stream
      await remoteVideo.current.play().catch(console.error)
    })
  }
  return (
    <div>
      <div>skyway test</div>
      <div><video width="400px" autoPlay muted playsInline ref={localVideo}></video></div>
      <div>{myId}</div>
      <div>
        <input value={callId} onChange={e => setCallId(e.target.value)}></input>
        <button onClick={makeCall}>発信</button>
      </div>
      <div><video width="400px" autoPlay muted playsInline ref={remoteVideo}></video></div>
    </div>
  )
}

export default App
```

`navigator.mediaDevices.getUserMedia({ video: true, audio: true })`を使って、内蔵カメラ・マイクから取り込んだストリームを`<video>`の`srcObject`に取り込むReactでの良い方法がわからなかったので`useRef`を使って無理くりやりました。
コード全体は[こちら](https://github.com/ufoo68/skyway-test)で共有してますのでもう少し良い方法をご存知でしたらPRいただきたいです。

# さいごに

いやー、**SkyWayめちゃ簡単ですね！**少し前に書いた[この記事](https://qiita.com/ufoo68/items/89304dd12b5ae466b49c)のやつとかと組み合わせて何かやれたら面白そうだなと思いました。
とりあえず今回のハッカソンで使うことはなかったのですが、そのうちどこかで使おうかなと思います。
[Python]クラス継承、オーバーライド

#あるクラスを元にして新しいクラスを作る
**class 新しいクラス名(元のクラス名):**

```python
from menu_item import MenuItem

class Food(MenuItem):
      pass
```

#オーバーライド
**説明**
親クラスと同名のメソッドを子クラスで定義すると中身を上書きできる。
メソッドの呼び出しをした時は上書きされたメソッドが呼び出される。

**例文**
メソッドの部分だけ一部抜粋(infoメソッドをオーバーライド)
親クラス(すでにメソッドがある)

```python:menu_item.py
class MenuItem:
   def info(self):
       return self.name + ': ¥' + str(self.price)
```
子クラスでオーバーライドする

```python:food.py
from menu_item import MenuItem
class Food(MenuItem):
   def info(self):
       return self.name + ': ¥' + str(self.price) + ' (' + str(self.calorie) + 'kcal)'
```
express-generatorで開発の雛形をサクッと作ってみたときのメモ

きょうぷろぐらみんぐをはじめたました！(大嘘)

webpackあたりまだ良くわかっていない人です。

今回、express-generarotを使って環境？を作ったときに知ったこととかをメモしていく。
メモだよ。
必要があればコメントでメモ修正していただけるとありがたき幸せ。

# express-generatorの巻
expressで環境を構築するときに`express-generator`というものを使うと構造をぱぱっと作ってくれる。
そのために

```
npm install express-generator -g
```
をする。`-g`でいれるよ。グローバルインストールするのが重要。たぶん。

あとは

```
express hoge
```
でサクッと構造を作る。

色々オプションつけられるよ。

```
express --view pug --css sass hoge
```
みたな。
`--view pug`とかは`express -h`に書いてあるから見てね。


# (ちょっと脱線)package.jsonの巻
これまでテキトーに
`npm install`みたいなのをしていたが、ESlintとかそういうのを導入しているときに`npm install -D`みたいなことを書いているサイトがあったから気になって調べてみた。

そしたら、実は開発用のパッケージとアプリの動作用のパッケージで記述される場所が違ったらしい。ほぇ〜。

下のを読んだ。
参考：https://qiita.com/chihiro/items/ca1529f9b3d016af53ec

アプリの動作に必要なものは`dependencies`

```
npm install --save hoge
```

開発に必要なものは`devDependencies`

```
npm install --save-dev hoge
```
としていれるんだと。


で実際に`package.json`を使ってパッケージ入れるときは

`package.json`に書かれているすべてのパッケージをインストールする

```
npm install
```

`package.json`の`dependencies`に書かれているパッケージのみインストールする

```
npm install --production
```

だから、開発に必要なパッケージは

```
npm install --save-dev eslint
```
で書かなくちゃいけないんだな。
ESlintとかはそうだね。

ちなみに`npm 5.0.0`以降は`--save`はつけなくてOK。
#### npm v5以降↓↓
参考：https://docs.npmjs.com/cli/install

アプリの動作に必要なものは`dependencies`

```
npm install hoge
```

開発に必要なものは`devDependencies`

```
npm install -D hoge
```
# ESLintの巻
ESLintってのを入れると、書いているコードを既存のルールに当てはめて勝手にきれいにしてくれるのでめちゃくちゃおすすめ。
当然入れる。

ESLintのは開発でしか使わないので

```
npm install -D eslint
```

これでESLintを使える。
初期設定は
`eslint --init`なんだけど、グローバルインストールしていないから

```
 ./node_modules/.bin/eslint --init       
```
でESlintの初期設定を行う。
いろいろ選べば勝手に`.eslintrc.json`みたいなのを作ってくれる。

```
? How would you like to use ESLint? (Use arrow keys)
  To check syntax only 
❯ To check syntax and find problems 
  To check syntax, find problems, and enforce code style 
```

上みたい感じなのが出てくるからいい感じに選んでくれ。

# nodemonの巻
コードを更新するたびに`Ctrl + c`するのがだるいのでnodemonを使う。
これは開発するときだけ使うので

```
npm install -D nodemon
```
だね。

さて、`package.json`のscriptを変更する必要があります。

```
  "scripts": {
    "start": "node ./bin/www"
  },
```
こうなっていると思うから

```
  "scripts": {
    "start": "nodemon ./bin/www"
  },
```
とします。

これでコード編集されると自動で監視してくれるようになるよ。わーい。

# 以上？
やったのはこんだけ。
あとは普通にexpress通りに作った。

調べてたらES6を使うためにbabelを入れようみたいな記事があったが、上の設定だけでアロー関数使えたよ。よくわからん。
だれか教えてTT

以上です。
【Python3】ファイル操作の基礎を理解する

## はじめに

Pythonでファイル操作するための基礎知識についてまとめます。

対象：Pythonの学習を始めた方向け
動作環境：Python3.8.3（OSはMacOS）

## ファイルを読み書きする

#### ファイルを開く
##### openメソッド

- 開く対象ファイルと、開き方(読込/書込)を指定します。
- ファイルオブジェクトが返却されます。
- ファイルを操作した後は、closeメソッドの実行が必要です(メモリから解放するため)。

```python
f = open("filename", "mode")
```

- "mode"の種類

|mode     |説明                                                     |
|:--------|:-------------------------------------------------------|
|r        |読込モード。　                             　　　　         |
|w        |上書きモード。既存の内容は破棄する。　                         |
|a        |追記モード。ファイルの末尾へ追記する。　                        |
|x        |ファイル新規作成専用の書込モード。ファイルが存在する場合はエラーを返却し、書込は行われない。                                     　           |
|r+        |読み書き両用モード。　                      　　　　         |

省略すると、"r"として処理されます。

- ファイルの種類を扱う"mode"

前掲の"mode"と組み合わせて指定できます。

|mode     |説明                                                     |
|:--------|:-------------------------------------------------------|
|t        |テキストモード。openメソッドのデフォルトモード。改行コードをプラットフォーム固有の記号から「\n」に変換する。　                    |
|b        |バイナリモード。テキストファイル以外はバイナリモードの利用を推奨。　                         |

##### withキーワード

withキーワードを使うと必ずファイルオブジェクトはcloseされるので、try〜finallyで実装するより簡潔に書くことができます。

```python
with open("filename") as f:
  f.read()
```

#### ファイルオブジェクトのメソッド

##### f.read(size)

- sizeに指定した値だけ、文字列 (テキストモードの場合) か bytes オブジェクト (バイナリーモードの場合) として返却します。 
- sizeは省略されたり負の数を指定された場合、ファイルの全内容を返却します。
- ファイルの終端に達している場合、空の文字列 ('') を返却します。

```python
>>>f.read(10)
'Hello Pyth'
```

##### f.readline()

- ファイルから1行のみ読み取り、返却します。
- 終端に改行文字(\n)を含みます（改行文字を含まない最終行を除く）。

```python
>>> f.readline()
'Hello Python\n'
```
##### 複数行の読込

- ループ処理に効率的にファイルの読み込みを実行できます。
- ファイルの全ての行をリスト形式で扱いたい場合は、list(f)やf.readlines()を使います。

```python
>>> for line in f:
...     print(line, end='')
... 
Hello Python
Hello Java
Hello Ruby
```

##### f.write(string)

- stringの内容をファイルに書き込み、書き込まれた文字数を返却します。
- ファイルを閉じるまで、witeメソッドを呼び出すごとに追記されます。

```python

>>> with open("sample.txt", "w") as f:
...     f.write("Japan\n")
...     f.write("USA\n")
...     f.write("China\n")
... 
6
4
6
>>> with open("sample.txt", "r") as f:
...     f.read()
... 
'Japan\nUSA\nChina\n'
```

##### f.tell() 

- ファイルの開いている現在の位置を示す整数を返却します。

- 現在の位置が先頭の場合は「0」を返却

```python
>>> with open("sample.txt", "r") as f:
...     f.tell()
... 
0
```
- 5バイト分読み込むと現在位置も移動

```python
>>> with open("sample.txt", "r") as f:
...     f.read(5)
...     f.tell()
... 
'Japan'
5
```

##### f.seek(offset, whence)

- ファイル位置を、基準点（whence）にオフセット値（offset）を加算して計算します。
- whenceには0:先頭、1:現在の位置、2:終端を指定します。省略した場合は0:先頭として振る舞います。

```python
>>> with open("sample.txt", "rb+") as f:
...     f.write(b"0123456789abcdef")
...     f.seek(3)       #先頭から3バイト分
...     f.read(1)
...     f.seek(-1,2)    #終端から1バイト分
...     f.read(1)
... 
16
3
b'3'
15
b'f'
```

## おわりに

今回は基礎の基礎な内容でした。
次はCSVやjsonなどの扱いについて、理解を深めていきたいと思います(ライブラリが提供されているとのこと)。
console.logからの脱却 - node.jsでデバッグするには(Chrome DevTools編)

## あらすじ
若き開発者ヒロロはJavascriptのデバッグで`console.log`をコード内に埋め込んで、一つのバグの調査で何十回もコードを実行するという不毛な行為をしていた。しかしChromeの開発者用ツールの存在を知りBreakpointを使いこなせるようになった彼はコードを追いながら値を確認できるようになり効率的に開発するようになった。
ある日、彼はNode.jsでの開発に携わることに。持ち前のJavascriptのスキルを生かしてサーバーサイドでも活躍するはずだったが、Node.jsでデバッグする方法を知らず苦戦を強いられることに。
フロントエンドと同じ方法でデバッグすることができず、このままではヒロロはまたあの日の`console.log`によるデバッグ地獄をNode.jsでも味わうことになる。

果たして`console.log`を使わずに効率的にデバッグすることはできるのか⁇

## Node.jsではGoogle Developer Toolが使えない？
...とまぁ少し昔の話をはじめにさせてもらいました。

通常、Node.jsでプログラムを動かす場合、ターミナル上で

```
node index.js
```
と入力してプログラムを実行します。フロントエンドの開発ではChromeの開発者用ツールからSourceを開き、ブレークポイントを打つことができましたが、Node.jsはサーバーサイド言語のため、同様の手順でデバッグすることはできません。
知らない人は`console.log`をコードに埋め込んでちまちまデバッグするハメになります。

## Node.jsでデバッグする方法
あれから長い月日（3回くらいの現場での開発経験）を経てようやく脱却しました。
最初のほうはコード量が少なくできなくてもそんなに困らなかったのでスルーしてましたが、
コードの量が増えてくるとさすがに苦しくなり、開発効率が下がってきたので本腰入れて対応することにしました。

調べてみると、Node.jsでもブレークポイントをうちながらデバッグすることは可能です。ただ手順が異なります。
とりあえずChrome DevToolを使ってデバッグする方法を試してみました。[公式ドキュメント](https://nodejs.org/ja/docs/guides/debugging-getting-started/)にも記載されています（みんなちゃんと読もうね）。

### 1. inspectスイッチを使う
まずターミナルでnodeプログラムを実行する際に`inspect`スイッチを入力します。

```
node --inspect index.js
```
デフォルトは`9229`ポートが開かれますが、

```
node --inspect=【port】 index.js
```
とすれば他のポートを使うことも可能です。

### 2. ブラウザを開く
次にChromeを開いて`Chrome://inspect`と入力します。
すると以下のような画面が出てくるので、`configure...`ボタンを押します。

<img width="727" alt="スクリーンショット 2020-05-22 22.17.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412663/8ccb9d57-849a-e825-7bfc-09ae889073aa.png">

ここに`localhost:【port】`を入力し、`Done`を押します。

<img width="306" alt="スクリーンショット 2020-05-22 22.21.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412663/0519345e-7bc6-97b7-bae1-cba29af19c7d.png">

その後前画面内に記載の`Open dedicated DevTools for Node`をクリックするとNode.jsの開発者ツール画面が現れます。
あとはSourceを開き、ファイルが存在していなかったら赤枠部分から`Open file`をクリックしてデバッグ対象のファイルを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412663/1dd5a824-9ab4-aff8-4fc5-df3981f7eab8.png)

これでファイルが開かれ、Breakpointを打つとそこで処理が止まるようになります。

## 小休止
ひとまずこれでコードを追いながらデバッグできるようになり、`Console.log`地獄から逃れることができました。
しかし毎度DevToolsにアクセスするのが手間に感じてしまうようになりました。
・愛用のvsCodeを使ってデバッグできないか？
・`electron`や`Lambda`関数のデバッグをもう少し効率よくできないか？
まだまだ改善点はありそうです。

続く
Flutter入門メモー開発環境設定Windows/Mac

Flutterの環境を作りました。
若干つまづいたところを除いて簡単にできたのでメモ。

#Flutter環境設定

⇨[開発環境手順](https://flutter.dev/docs/get-started/install)
インストールからセットアップ手順まで載っています。

MacでもWindowsでも簡単にセットアップができました。
私はVSCodeを利用しています。
その他のエディタに関しては、すみませんがわかりません。

##①インストールします
ファイルダウンロードして、
Zipを展開します。
##②flutterファイルを展開して、プログラム系のどこかのフォルダ内に[flutter]のフォルダを置きます。
WindowsならProgram Filesなどに展開した[flutter]のフォルダを置きます。

Windowsなら環境変数のPATHに[flutter]フォルダの[bin]フォルダまでのパスを設定します。

Macもコマンドで
```export PATH="$PATH:`pwd`/flutter/bin"```
を入れるか
```export PATH="$PATH:[ルートから~/flutter/bin]```
binファイルまでのパスを入れます。
すると環境変数が設定されます。

##③VSCodeに拡張機能追加
FlutterプラグインとDartプラグインを追加します。
拡張機能検索窓に入れるとすぐ出てくるのでインストール。

インストール後、Control + Shift + P　(MacはControlじゃなくてCommand)でコマンドパレットを開き、
```[Flutter: Run Flutter Doctor]```と入れます。
他にもAndroidのlicenseが〜と言われます。

今までやったプラグインなどで怒られている場合は確認してください。

##④flutter doctorを入れるとターミナルに結果が表示されます。
そこで[×]とか[✔︎][!]が表示されるので、準備ができていない物を確認します。

[×][!]だと準備ができていません。[×]は必須項目です。
多分Android Studioが準備できてないよなどと怒られます。

他、インストールプラグインなどは◯であればとりあえずスルーで。

##⑤Android Studio、iPhoneでの確認準備
Androidの動きをデバックで確認したい場合は以下を設定してください。
iPhoneだけなら少し下にスクロール。

■　Android Studioのインストールは手順通りにやればOKです。
インストール後、起動すると設定マーク（Configure）とあるので、それをクリックで編集。
SDK Managerを選択して設定を変更します。
[参照リンク](https://flutter.dev/docs/get-started/install/macos#android-setup)

リンクページの下半分に設定の変更について書かれています。
[Android SDK Tools (Obsolete)]の項目にチェックを入れます。
そして設定のAVD ManagerからAndroidのエミュレーターを選びます。

ここで選択したAndroidでデバック時に確認ができます。
　

　
■　iPhoneで実機確認するためにはXcodeのダウンロードが必要です。
デフォルトのプロジェクトから一般[general]の設定に関して編集します。

※iPhoneの実機がないと確認ができないので注意。
[参考リンク](https://flutter.dev/docs/get-started/install/macos#ios-setup)

##⑥flutter doctorで再度確認
VSCodeのコマンドパレット、ターミナルで
```flutter doctor```を入力して再度結果を確認します。

開発環境に足りない物を教えてくれるので、
[×]になったままの物を確認しましょう。

```✗ Android licenses not accepted.```というのが出てくると思います。

その場合は、ターミナルに
```flutter doctor --android-licenses```と入力して実行します。

そのあとに Y/Nでlicensesに同意するかどうかを聞かれるのでY＝Yesで応答します。
すると、licensesに同意したことになり、再度確認すると✔︎マークになっていると思います。


##最終確認
もう一度```[flutter doctor]```で最終確認してください。
すべて✔︎が入ればOKです。

※Androidを確認しない場合は[!]が残っていてもOK。


もともとFlutterはサンプルファイルがダウンロードされているので、
実行できるか試しましょう。

VSCodeでまずは右下のフレームにAndroidエミュレーターなど、確認できるデバイスがあるか確認しましょう。
何も選択できる物が無ければ[No Device]となっています。

Androidなら、[⑤](#android-studioiphoneでの確認準備)でAVD Managerの設定をし、エミュレーターを起動すると使えます。
iPhoneは接続して、デバイス標示をクリックして選んでおきましょう。

　

F5を押すと実行できます。
エミュレーターか実機に表示ができたら開発環境の設定が成功しました。


##詰まったところ

私が設定時に詰まったところは特に
・Androidのエミュレーター設定
・Android licensesのチェックが付かない　ことでした。

エミュレーターはデバイスを選択して、設定をダウンロードする必要があります。
デバイス名横に青文字のリンクがあると思うので、それを押して設定をダウンロードします。

Android licenseは[上記記載](#flutter-doctorで再度確認)の通りです。
ダウンロードからの設定時に設定できるのかはよくわかりませんが、ターミナルで実行すればできました。
SourcetrailでROSパッケージを読む

# 1.ビルド情報のデータベースを生成
以下のオプションをつけてビルドする。

```bash
roscd <ros_package_of_interest>
catkin build --this --force-cmake --start-with-this -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
```

すると、以下の場所に`compile_commands.json`が生成される。

```bash
ls /path/to/catkin_ws/build/<ros_package_of_interest>/compile_commands.json
```
# 2. Sourcetrail側でデータベースを読むように設定
プロジェクト名称とプロジェクトの保存場所を設定し、`Add Source Group`をクリックすると、SOURCE GROUP Typeの選択画面になるので、`C/C++ from Compilation Database`を選択して`Next`を押下する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108813/3accbee9-20fc-e859-71ea-833a3c4e39cb.png)

1. `Compilation Database`として先ほど生成した`compile_commands.json`を設定する。
2. `Header files & Directories to Index`でソースコードのディレクトリを指定する。

あとは`Create`して、読み込む。
例えば、`ros-navigation`パッケージを一通り追加して可視化してみる。
以下の例では、`MoveBase`クラスが、抽象クラスである`BaseGlobalPlanner`の`makePlan`を呼び出しており、`makePlan`の具体的な処理は`NavfnROS`の中で実現されていることがソースコードを読まずに理解できる。すごい！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108813/17f9cbbe-e8a8-3d7c-8a1b-1fec2f547d28.png)
※上の図は、`BaseGlobalPlanner`の`makePlan`メソッドを選択するだけで表示される。
Javacript　Dateメソッド わかりやすく日時を表示する

## Dateオブジェクト

１現在の日時を取得する
２過去や未来の日時を指定する
３日時の計算をする

①Dateオブジェクトを使う際は初期化をする

```
const now = new Date();
```
newはオブジェクトを初期化するためのキーワード。


```Markdown:現在日時を記憶した状態でDateオブジェクトを初期化する
new Date();
```


②年、月、日などを個別に取得する

```
const now = new Date();
    const year = now.getFullYear();
    const month = now.getMonth();
    const date = now.getDate();
    const hour = now.getHours();
    const min = now.getMinutes();


```


③取得したらあとは出力するだけ

```

const output = `${year}/${month + 1}/${date} ${hour}:${min}`;
document.getElementById('time').textContent = output;
```
 ＊now.getMonth・・・実際の月-1になるため＋１しないといけない


## １２時間時計にしてみよう
① ampmを定義し、空の文字列（文字列が０個の文字列）を代入して準備する

```
let ampm　= '';
```


②午前中、午後に場合わけ

```
 let ampm ='';
    if(hour < 12){
        ampm ='a.m.';
    } else{
        ampm = 'p.m.'
    }
```

③２４時間→１２時間に変える

```
 const output = `${year}/${month + 1}/${date} ${hour%12}:${min}${ampm}`;
```
変数参照の遅延

#解決
グローバルスコープでも以下のように修正して解決しました。
"/3[0-9]/g" → "/3[0-9]/"で解決しました。
#問題

変数regをグローバルスコープに設定


```sample.js

 let reg = /3[0-9]/g;
    

for(let i = 1; i < 101; i++) {


  
    if(reg.test(i)) {

        console.log(i + "は10の位が30の数字だよ！！");

    } else if(i % 3 == 0 ) {

       console.log(i + "は三で割り切れるよ！！");

    }else {

        console.log(i);
    }

}
```



#結果

```

30は10の位が30の数字だよ！！
31
32は10の位が30の数字だよ！！
33は三で割り切れるよ！！
34は10の位が30の数字だよ！！
35
36は10の位が30の数字だよ！！
37
38は10の位が30の数字だよ！！
39は三で割り切れるよ！！
```
ローカル変数iの10の位が30の時に所々、期待した出力値が出ない。
例( i = 31の時"31は10の位が30の数字だよ！！"と出力されて欲しいが"31"と出力される。)

原因はforループの処理速度にによるグローバル変数regを参照する速度が追いついていないのか？
と考えたので変数regをブロックスコープに設定。
※javascriptには"スコープチェーン"と言う概念がある。
この概念によると、javascriptは狭いスコープに位置する変数を優先して参照するらしい。

```sample.js

 
    

for(let i = 1; i < 101; i++) {

　　let reg = /3[0-9]/g;
  
    if(reg.test(i)) {

        console.log(i + "は10の位が30の数字だよ！！");

    } else if(i % 3 == 0 ) {

       console.log(i + "は三で割り切れるよ！！");

    }else {

        console.log(i);
    }

}
```

#結果

```
30は10の位が30の数字だよ！！
31は10の位が30の数字だよ！！
32は10の位が30の数字だよ！！
33は10の位が30の数字だよ！！
34は10の位が30の数字だよ！！
35は10の位が30の数字だよ！！
36は10の位が30の数字だよ！！
37は10の位が30の数字だよ！！
38は10の位が30の数字だよ！！
39は10の位が30の数字だよ！！
```

#PS
やはり変数の参照速度の遅延が原因なのか？？
わかる方、是非ご教授ください。
再入門 Red Hat OpenShift4 （リンク集）

OpenShift についての情報を整理するために作成したリンク集です。

## Red Hat の OpenShift情報のサイト

* [Product Documentation](https://access.redhat.com/documentation/en-us/)
* [OpenShift日本語ドキュメント](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/)
* [赤帽エンジニアブログ](https://rheb.hatenablog.com/)
* [OKD](https://www.okd.io/)
* [OpenShift Online](https://manage.openshift.com/register/plan)
* [OpenShift Cloud Manager](https://cloud.redhat.com/openshift/)


## OpenShift4 の本や雑誌

* [ソフトウェアデザイン 2020年3月号 (日本語) 雑誌 – 2020/2/18](https://www.amazon.co.jp/ソフトウェアデザイン-2020年3月号-北山-晋吾/dp/B083TM3VRZ/ref=tmm_other_meta_binding_swatch_0?_encoding=UTF8&qid=1590311864&sr=8-7)
* [O'REILLY OpenShift for Developers](https://assets.openshift.com/hubfs/pdfs/OpenShift_for_Developers_Red_Hat.pdf?hsLang=en-us)


# これまでQiitaに投稿したOpenShift関連の記事

## OpenShift と Kubernetes の違いに関するもの

* [Kubernetes と OpenShift の違いを確かめてみた](https://qiita.com/MahoTakara/items/394bb7518d86ea0dd2c7)
* [コンテナ開発のセキュリティとOpenShift特有のガイド](https://qiita.com/MahoTakara/items/c2970f463c0f71c0fee7)
* [YouTube動画 OpenShift 4.3 on IBM Cloud を起動してみた](https://www.youtube.com/watch?v=qoM8QcLhJ-Q&t=1s)


## OpenShift 学習環境に関するもの

* [Red Hat CodeReady Containers (OpenShift4) のインストールのメモ](https://qiita.com/MahoTakara/items/83ea38e32987457ebbf4)
* [MiniShiftに関する疑問の整理、「 Dockerから入るKubernetes」執筆打明け話とか、OKDやCRCとの整理など](https://qiita.com/MahoTakara/items/3c1c208640518e832660)


## IBM Cloud と OpenShift に関するもの

* [OpenShiftのポッド からPrivate Service Endpoint経由のRedisアクセス](https://qiita.com/MahoTakara/items/6b14864ca8b4c887a2b5)
* [IKS K8s/OpenShift マスターの api-server をプライベート専用に変更する方法](https://qiita.com/MahoTakara/items/97aab7fc88e6f27fba7e)
* [OpenShift on IBM Cloud でCI/CDのツールチェーンを動かしてみた](https://qiita.com/MahoTakara/items/e217d5b53e6465050429)
* [Redisクラスタ を OpenShift on IBM Cloud にデプロイした結果](https://qiita.com/MahoTakara/items/37a9f73509b993034f5d)
* [OpenShift on IBM Cloud から Red Hat Container Catalog のイメージを利用する方法](https://qiita.com/MahoTakara/items/69778908381fab6e5bd2)


## OpenShift 関連の OSS に関するもの

* [Dockerの置き換えを目指す ルートレス&デーモンレスの Podman 入門](https://qiita.com/MahoTakara/items/65ff8c2810ca820bc0b3)
* [あまり良く知られていない Kubernetes Operator とは？](https://qiita.com/MahoTakara/items/af4ad8ab69c24102bd72)
* [Go言語で Kubernetes Operator を書いてみた](https://qiita.com/MahoTakara/items/9ce62e8f2226f7b677eb)
Cloudfront+S3で最近話題のSPAを構築する(設定項目の解説有)

# AWSでSPAの構築

久々にSPAの構築を実施しました。すんなりできると思っていたのですが、結構忘れていることが多かったのと、困ったところがたくさんあったので備忘録として記述しておきます。

なお、解説文を付け加えていますが、設定できれば良い人は画像を参照していけばできると思います。

## S3バケット作成

まずはweb用のS3のバケットを準備します。

![screenshot_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165191/212d2e68-89c3-e894-8b72-e19c4759272d.png)

「パブリックアクセスをブロック」にチェックを入れるのを忘れないでください。
ここのチェックを外すように書いてある記事が多いです。しかし、チェックを入れるとこのバケットに直接アクセスできてしまいます。
そうではなく、**Cloudfront経由のみ**でアクセスしてほしいのでチェックを入れないでください。

## Cloudfrontの作成

英語で厳しいですが、順番にゆっくり設定していけば怖いことはありません。

まずはCreate Distributionをクリック

![screenshot_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165191/52a29a24-4639-6722-22b7-bb8db6fdb06a.png)

Get Startedの方を選択します。

![screenshot_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165191/f1129f91-a6cc-a641-55b4-fba8d13325ac.png)

### Origin Settings

![screenshot_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165191/bc66d49e-b5d5-ecf9-74d6-e54d2f393d4b.png)

##### Origin Domain Name

カーソールを合わせると選択肢が出てきます。先ほど作成したS3のバケットを選択してください。

##### Restrict Bucket Access

`Yes`を選択してください。説明の直訳です。

> ユーザーが常にAmazon S3のコンテンツにアクセスする際に、Amazon S3のURLではなく、CloudFrontのURLを使用してアクセスすることを要求したい場合は、「はい」をクリックします。これは、署名付きURLや署名付きCookieを使用してコンテンツへのアクセスを制限する場合に便利です。ヘルプでは、「プライベートコンテンツをCloudFrontでサーブする」を参照してください。

##### Origin Access Identity

`Create a New Identity`を選択してください。S3にアクセスするためのOriginIDを新規で作成します。

##### Grant Read Permissions on Bucket: Yes, Update Bucket Policy

`Yes, Update Bucket Policy`を選択してください。S3バケットにアクセスするためのPolicyを自動で設定してくれます。


### Default Cache Behavior Settings

![screenshot_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165191/4580525d-1eb6-edef-124a-15f402aafcfd.png)

##### Viewer Protocol Policy

任意設定ではあるのですが、`Redirect HTTP to HTTPS`に変更しています。これはHTTPのアクセスに関する項目です。
`Redirect HTTP to HTTPS`にするとHTTPでリクエストが来た際にHTTPSにリダイレクトしてくれます。セキュリティ的にHTTPSの方が強固なのでリダイレクトするようにしました。

### Distribution Settings

![screenshot_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165191/056a11a9-2d39-6849-8a8c-e799ebbfa869.png)

##### Default Root Object

ルートパスでアクセスした際にデフォルトで表示するファイル名です。`index.html`を設定しました。


### 24時間(くらい)待つ

ここが一番重要です。Create Distributionをクリックしたら24時間ほど待ちます。
これは、S3のバケット名がAWS内で共有されるのに最大で24時間かかるからです。そのためすぐにアクセスしてもエラーになる場合があります。
都度、確認してみましょう。

## S3の設定を確認

### バケットポリシーの確認

`Grant Read Permissions on Bucket`の項目で`Yes, Update Bucket Policy`を選択しました。
バケットポリシーを追加する項目なので、一応ちゃんと設定されているか確認してみます。

![screenshot_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165191/c9333b36-c66f-844b-a22a-69fa97eba5a3.png)

### ファイルのアップロード

実際にS3にファイルをアップロードしてください。

## WEBページにアクセス

WEBページにアクセスして動作を確認して見ます。ドメイン名は`CloudFront`の`Distributions`内、`Domain Name`列に記載されています。

![screenshot_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165191/38c42ee2-2652-2ec5-f889-bc3ac2e9b99c.png)

![screenshot_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165191/3b099c5d-34d7-a783-7ab4-7fb19264f50a.png)

WEBページが表示されれば設定完了です。

## 参考

https://dev.classmethod.jp/articles/s3-cloudfront-redirect/
MacでValhallaの開発環境を整えるまでのメモ

ルート探索エンジンのValhallaのビルド環境を作るたびに、詰まりどころが多くて悩んでいました。
ビルドできるようになるまでの環境セットアップ手順をメモします。(2020/05時点)

## 環境情報
macOS :  Catalina(10.15.4)
XCode : 11.5
valhalla : 3.0.9
CLion : 2020.1.1

## 前提
基本的に公式の [README.md](https://github.com/valhalla/valhalla/blob/master/README.md) の `Building from Source` に沿って作業します。


## [Homebrew](https://brew.sh/), [anyenv](https://github.com/anyenv/anyenv)の準備
```
# Homebrewインストール
$ bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

# anyenvセットアップ
$ brew install anyenv
$ anyenv init
$ echo 'eval "$(anyenv init -)"' >> ~/.zshrc
```


## 8.0以上のnodejsのインストール
README上ではnvmで記載していますが、ビルド済みのパッケージ利用で問題ないため今回はnodenvを利用します。

```
# anyenvからnodenvをインストール
$ anyenv install nodenv
$ nodenv -v

# 任意のバージョンをインストール
$ nodenv install -l
$ nodenv install 14.3.0
$ nodenv global 14.3.0

# インストールされていることを確認
$ which node
$ node -v

# vallharaに必要なパスを通す(こちらはnvmでも必要そう)
$ sudo ln -s $HOME/.anyenv/envs/nodenv/versions/14.3.0/include/node/v8.h /usr/include/v8.h
$ sudo ln -s $HOME/.anyenv/envs/nodenv/versions/14.3.0/include/node/uv.h /usr/local/include
$ sudo ln -s $HOME/.anyenv/envs/nodenv/versions/14.3.0/include/node/node.h /usr/local/include

# CLion上で見つけられないと怒られるので環境変数に追加
echo 'export NODEJS_INCLUDE_DIRS=$HOME/.anyenv/envs/nodenv/versions/14.3.0/include' >> ~/.zshrc

# npmかyarnか聞かれてエラーになるので空ファイル作成(npmを指定)
$ touch $(nodenv root)/default-packages
```
※参照 : [Ubuntu_Bionic_Install.sh#L34-L37](https://github.com/valhalla/valhalla/blob/d70b8ff7fb185b5c768ec0be7be5a4590d9a5e27/scripts/Ubuntu_Bionic_Install.sh#L34-L37)

## README記載の必要パッケージをインストール(nvm, boost-pythonを除く)
```
$ brew install automake cmake libtool protobuf-c libspatialite pkg-config sqlite3 jq curl wget czmq lz4 spatialite-tools unzip
$ brew install bash coreutils binutils
$ brew install valhalla/valhalla/prime_server
```


## boostのビルド
gitか [boost.org](https://www.boost.org/users/download/) からソースコードをダウンロードして導入。
macOSのシステムのpython2.7を利用するboost-pythonをインストールするが、brew上からだと認識してくれないのでビルドをする。

```
# ソースコードをダウンロード(tgzファイルをダウンロードしても良い)
$ git clone --recursive https://github.com/boostorg/boost.git
$ cd boost
$ git checkout develop

# pythonバインディング情報をインストール時に指定したいため確認
$ python --version
$ ./bootstrap.sh --with-python-version=2.7.16

# 配置ディレクトリを準備してインストール (jオプションはCPUのコア数）
$ mkdir /usr/local/Cellar/boost
$ ./b2 install -j4 --prefix=/usr/local/Cellar/boost

# cmakeに見つけてもらえるようシンボリックリンクを貼る
$ ln -s /usr/local/Cellar/boost /usr/local/opt/
$ ln -s /usr/local/Cellar/boost/include/boost /usr/local/include/
$ ln -s /usr/local/Cellar/boost/lib/*boost* /usr/local/lib/
```
※参考 : https://boostjp.github.io/howtobuild.html


## 最新のvalhalla本体をダウンロード
```
$ git clone --recurse-submodules https://github.com/valhalla/valhalla.git
```

## CLion上でCMake実行
上記をcloneしたディレクトリを読み込めば勝手にcmakeされ、ビルド可能になるはずです。
<img width="1312" alt="スクリーンショット 2020-05-24 18.17.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1830/8b3426b5-704e-bbe5-fbdc-bd50ef49a82a.png">


おつかれさまでした。
deviseを使ってUX改善 - アカウント変更の完了メールを変更確定後に送る -

先日、自社サービスのUX向上のために実施した内容を共有します。

# やったこと
アカウントのemailアドレス変更完了メールを**変更確定後に送るようにしました**。

具体的には、設定画面で変更してから変更後のemailアドレスに送られる確定メールのリンクをクリックしたときに初めて、変更確定メールを変更前後のemailアドレスに送るようにしました。

# やる理由
アカウント変更の前後で、変更前と変更後のアドレスにそれぞれメールを送れるようになると、アカウント変更の誤認識を防ぐことができます。

たとえば、全社員のアカウント管理を1人でやるというのは良く聞く話です。ITに詳しくない方がアカウント変更に戸惑ったりするのを防ぐために、専任の担当者にお任せするケースが多いです。

しかし、**専任の方もITの専門家ではないことが多く、しかも他に業務を抱えていて多忙**です。そんな中で手作業のメールアドレス変更は、**作業の失敗リスクを高めます**。

そういった状況に対応するため、**アカウントが変更されたことを変更前と変更後のアドレスにそれぞれ送付して、チェックしやすくしました**。

# どうやるのか？

email変更はdeviseを使ってすでに実装しているので、こちらをカスタマイズして対応しました。

※ email認証機能の詳細は[公式を参照ください。](https://github.com/heartcombo/devise#getting-started)

## 変更1 deviseの設定を変更
emailの変更が発生したタイミング(内部的にはモデルクラスにupdateメソッドが実施されたタイミング)でemailを送信させないようにします。

```rb:config/initializers/devise.rb
config.send_email_changed_notification = false
```

## 変更2 モデルクラスを変更
deviseを実装したモデルクラスへ下記のメソッドを実装します。

```rb:app/models/user.rb
 protected

  def send_email_changed_notification_to_new
    send_devise_notification(:email_changed, to: email)
  end

  def after_confirmation
    return unless saved_changes[:email].present? && saved_changes[:email][0] != saved_changes[:email][1]

    self.unconfirmed_email = saved_changes[:email][0]
    send_email_changed_notification
    send_email_changed_notification_to_new
  end
```

### 変更後のメールへ通知を送るメソッドを定義
変更確定(confirmメソッド発行)後にメールを送付する`send_email_changed_notification`は変更前のemailに送付するよう定義されています。こちらを参考にしながら、変更後のemailに送付する`send_email_changed_notification_to_new`を定義しました。

https://github.com/heartcombo/devise/blob/098345aace53d4ddf88e04f1eb2680e2676e8c28/lib/devise/models/database_authenticatable.rb#L182

### 変更確定後のフックに、メール送信処理を定義

deviseのconfirmメソッドには、`after_confirmation`というメソッドが定義されており、こちらに正常に変更が確定した後の処理を定義することができます。

https://github.com/heartcombo/devise/blob/098345aace53d4ddf88e04f1eb2680e2676e8c28/lib/devise/models/confirmable.rb#L319-L330

このフックを利用して、`ActiveRecord::AttributeMethods::Dirty#saved_changes`から変更前後のemailを取得して**メールが変更されたかを判定しています**。`unconfirmed_email`はconfirmメソッドが正常に完了したタイミングでnilになるので、`saved_changes`から変更前のemailを取得し、`send_devise_notification`の処理に乗せてあげると変更前後のemailがメール本文に表示されるようになります。取得した`unconfirmed_email`はDBに保存されないので、データが汚染されることはありません。

https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Dirty.html#method-i-saved_changes

## 変更3 メール本文を変更
デフォルトでは変更前、変更後でメッセージが異なる設定になっています。こちらの条件分岐を外し、`@resource`（deviseを実装したモデルクラスのインスタンス）から変更前後のemailを取得し、メール本文に表示します。

```erb:app/views/devise/mailer/email_changed.html.erb
<p>ご要望の通り、アカウントに登録されているメールアドレスを変更しました。</p>
<p>ご登録のメールアドレスは <%= @resource.unconfirmed_email %> から <%= @resource.email %> に変更されました。</p> 
```

以上で設定完了となります。

# まとめ
小さい改善かとは思いますが、UX改善はコツコツやっていくのが大事だと思います。

# その他
deviseでemailを送付したことをRSpecでテストしたいのですが、良い方法があれば教えてほしいです。
注目物体検出のU^2-Netやーる（Windows10、Python3.6）

# はじめに
注目物体検出のU^2-Net (U square net)をやってみました。CPUで動くよ。

# システム環境
- Windows10（RTX2080 Max-Q、i7-8750H、RAM16GB）
- Anaconda 2020.02
- Python 3.6
 
# 導入
[U^2-Net](https://github.com/NathanUA/U-2-Net)をクローンします。

U^2-Net用の環境を作成します。

~~~
conda create -n u2net python=3.6
conda activate u2net
cd U-2-Net-master
pip install numpy==1.15.2
pip install scikit-image==0.14.0
pip install Pillow==5.2.0
pip install scipy
pip install torch==1.0.0 torchvision==0.2.1 -f https://download.pytorch.org/whl/torch_stable.html
pip install matplotlib
~~~

[u2net.pth](https://drive.google.com/file/d/1ao1ovG1Qtx4b7EoskHXmi2E9rp5CHLcZ/view?usp=sharing)をsaved_models/u2net/に、[u2netp.pth](https://drive.google.com/file/d/1rbSTGKAE-MTxBYHd-51l2hMOQPT_7EPy/view?usp=sharing)をsaved_models/u2netp/に置きます。

86行目でCPUを指定します。

~~~
net.load_state_dict(torch.load(model_dir, map_location={'cuda:0': 'cpu'}))
~~~

test_data\test_imagesフォルダに入力画像を置きます。
test_data\u2net_results\にtest_imagesフォルダを作成します。出力画像がここに保存されます。

下記を実行します。

~~~
python u2net_test.py
~~~

## before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/6a61ae03-81ad-fc48-6ff1-ae1ca81c0946.png)

## after 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/c2c23b74-7783-1c22-15fd-a7deff95f881.png)

お疲れ様でした。

# おまけ
Background-Mattingとの比較

|U^2-Net|Background-Matting|
|:--|:--|
|![0001_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/4cda9b57-59fd-73a6-82f5-5934d77aaa93.png)|![0001_out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/2cef17fd-253b-6016-9908-8027f8365d51.png)|
|![0500_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/17a52719-54a6-2779-9e6e-da14f53eab36.png)|![0500_out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/ff5c0090-54ea-43f2-e1ae-1f93767c1633.png)|
|![1000_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/0077f06d-833b-216e-6925-62ce96a40a54.png)|![1000_out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/c2a9c874-c83f-332c-d5f0-a67d43af19de.png)|
|![1500_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/be96318b-3601-ca5c-6caf-ad47bc5db571.png)|![1500_out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/c4c72c57-e5de-9ced-95c3-fe7faf106af4.png)|

グリーンバックはもういらない！？Background-Mattingでどこでも合成（Windows10、Python 3.6）
https://qiita.com/SatoshiGachiFujimoto/items/f5583a89f751f88fbac4
窮地にいるエンジニアはズルい処世術で困難を突破するを読んだので感想とか要約書きます

# 窮地にいるエンジニアはズルい処世術で困難を突破するを読んだので感想とか要約書きます


タイトルにはズルいと書かれてあるがIT業界でやっていくには至ってまともな、
内容だったので、要約とか感想を書いてみる。


------------------------------------------------------------------------------
## 処世術 １ 　「できて当然」 を 真に 受ける な 


できて当然は言葉の比喩、出来て当然のことの中から、
以下に一部取り出して、仕事の目的に使っていくか考えよう。


## 処世術 ２ 　「相対評価」 を 利用 しろ 


同じ能力でも、参画する案件・人が違うと、まったく違う評価を受ける、これが相対評価。
参画したらメンバーが自分より圧倒的にハイスキルであった場合は、
ハイスキルの人が、やらながちな、エクセルなどのドキュメント作成、
その他、雑務などをやって、組織に貢献して生き残ろう。


## 処世術 ３ 　 モーツァルト の メリハリ に 学べ 


複数のタスクを振られて無茶ぶりされたとしても、強弱をつけて対応しよう。
つまり、本質的に大事なタスクだけ集中し、無駄になりそうな雑務は切り捨ててしまおう。


## 処世術 ４ 　「パラメータ」 を 書き換えろ 


まず、短所を長所に書き換える思考をしよう。

「すぐに諦めがち」→「新しいことに興味持つ、好奇心旺盛」
「敬語が苦手」→「親しみやすい」
「大事な所で勝負に弱い」→「克服しようとしている」


## 処世術 ５ 　 厄介 な 仕事 は「 定型 文」 で 片づけろ 


よく来そうな、来ると予測できるクレームは対応するセンテンスを
あらかじめ作っておいてそれを使おう。
謝罪メールで時間を使うのはムダである。


## 処世術 ６ 　「わからない」 と 言わ ず に 切り抜けろ 


わからない、とだけ言うのはいけない。
「再度確認してから報告します。」
などと言って、良い流れを作るまで調べて引き伸ばそう。


## 処世術 ７ 　 所詮 この世 は「 好き嫌い」 


仮にどんなに仕事を完璧にしていても、嫌われたらおしまい。
相手からのヘイトをコントロールしていこう。


## 処世術 ８ 　 責任 問題 は 急所 を 仕留めろ 


責任追及大好きおじさんがIT業界には残念ながら多い。
責任問題を解決するには、問題の急所を解決しよう。

お客さんの目前で速やかに問題を解決して上司に以下のように言って事なきを得よう。
「問題は解決し、原因の説明も終わりました、先方は笑顔で帰られました」


## 処世術 ９ 　「仲間」 を 探せ 


技術でわからないことを上司に聞けない場合は迷わず、組織外の人に頼ろう。
頼り方は、友達にメッセや、QアンドAサイトとか、なんでもいい。


## 処世術 １０ 　「思考 コスト」 を 抑えろ


エンジニアだと考える時間が常で、疲れることが多い。
意図的に、考えない時間を作って、休めば効率が上がる。

------------------------------------------------------------------------------


要約はこんな感じです。

この人はSIer業界でやってたのは、経歴を見ずにも想像できる内容でした。
web系では通じない手段も多そうですが、使える内容はあるので、
処世術として持っておくべき考え方だとは思った、以上。
DockerでMySQLなどのテスト環境を作っていたら(errno: 150 "Foreign key constraint is incorrectly formed")が出た話

# 背景
mariadbをdocker環境に移してテストしようとしたところ、30分くらい詰まってしまったのでここに供養します。

# 現象
外部参照用のテーブルを新規に作成しようとすると下記のエラーが出る。

```log
ERROR 1005 (HY000): Can't create table `{dbname}`.`{tablename}` (errno: 150 "Foreign key constraint is incorrectly formed")
```

# 原因(1)
参照しようとしている行がユニークでないためエラーになっていた。
下記のようなSQLで、重複データを削除し プレマリキーとした。

```sql
CREATE TEMPORARY TABLE {table name}_tmp AS SELECT id,MIN(uid),MIN(name) FROM tweets GROUP BY id;
DELETE FROM {table name};
INSERT INTO {table name} SELECT * FROM {table name}_tmp;
DROP TABLE {table name}_tmp;
ALTER TABLE {table name} ADD PRIMARY KEY (id);
```

# 原因(2)
参照先と参照元の型が異なる場合に発生する。
同一の方であることを確認した。

# 原因(3)
テーブルのcharsetが異なる場合に発生する。
下記のコマンドで確認する。

```sql
SHOW CREATE TABLE {table name};
```

とりあえず、対象テーブルを同一なcharsetに修正する。
※データが入っていると色々面倒ですが、私は何も入っていないのですんなり行きました。

```sql
ALTER TABLE {table name} CONVERT TO CHARACTER SET {char set};
```

あと、外部参照がある、テーブルにも設定させる

```sql
create table{table name}(
   {col} varchar(23) not NULL,
    ...
)ENGINE=InnoDB DEFAULT CHARSET={char set};
```

# 最後に
私は１と3で発生していました。
備忘録です、忘れぬように ここに刻む
まあまあ使うtextareaテクニック

# 概要

個人的なtextareaタグの備忘録を、Qiita記事にまとめてみました。
外部プラグインを使わずカスタマイズする時のちょっとしたテクニック集です。

# 言語

- html5
- css3
- javascript ( 最後にちょっとだけ使います )

# テクニック

### textareaタグ

textareaのタグです。これタグをベースに説明していきます。
htmlにタグを記述するとテキストエリアを表示できます。

```html:html
<textarea></textarea>
```

以下のようにテキストエリアが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/7751b28e-8f7b-3d74-1b0b-66d143058360.png)


### 入力禁止にする(readonlyを指定)

textareaタグにreadonlyを指定します。
ユーザに操作させたくないときに使用します。

```html:html
<textarea readonly></textarea>
```

### タブ遷移でフォーカスを当てないようにする

tabindexは、タブ遷移の順番を決めるときに使用します。
`-1`を指定すると、tabキーでのフォーカスが当たらないようになります。

```html:html
<textarea tabindex="-1"></textarea>
```

### 右下のリサイズのつまみを表示しない

下記画像の赤矢印部分の所です。アプリのUI/UXによっては非表示にしたくなる時もあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/2e295b2b-6b55-d3e6-25b1-a6fe1f9112a4.png)
スタイルシートで`resize: none`を指定すると表示を消すことができます。

```css:css
textarea {
    resize: none;
}
```

```html:html
<textarea></textarea>
```

以下のように表示が消えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/a8862117-cab0-91dc-fe4a-6514156021c8.png)

### placeholderを指定する

入力された情報が、なにも無いときに表示するテキストです。

```html:html
<textarea placeholder="ここに入力してください"></textarea>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/346599bc-c218-f375-847c-6b07413a3631.png)

### placeholderのスタイルを変更する

placeholderのスタイルもこだわりたいときに使用します。

```css:css
textarea::placeholder {
    color: red;
    opacity: .5;
    font-family: sans-serif;
    font-weight: bold;
}
```
```html:html
<textarea placeholder="ここに入力してください"></textarea>
```

以下のようにスタイルが適用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473097/7ac14904-99fa-da68-8d38-2c38b1106df7.png)


### 文字数制限をする

maxlengthを指定することで入力する文字数を制御できます。

```html:html
<textarea maxlength="80"></textarea>
```

### 入力内容のチェックをする

javascriptを使って入力情報のチェックをします。
正しいテキスト「こんにちは」が入力された場合に、枠を緑色にします。

```scss:css
textarea.success {
  border: solid 2px green;
}
```

```html:html
<textarea id="hello_textarea"></textarea>
```

```javascript:javascript
var textarea = document.getElementById("hello_textarea");
textarea.addEventListener("input", function() {
    // textareaに入力されたときの処理内容
    if (!textarea.value.match(/こんにちは/)) {
        textarea.classList.remove("success");
    } else {
        textarea.classList.add("success");        
    }
});
```

こちらはコードと結果画像だけでは分かりにくいので、実際に動くものを用意してみました。


<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="ishi720" data-slug-hash="QWjJyLM" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="textarea data check">
  <span>See the Pen <a href="https://codepen.io/ishi720/pen/QWjJyLM">
  textarea data check</a> by ishi720 (<a href="https://codepen.io/ishi720">@ishi720</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 終わり
Javascript -イベント　フォームに内容を送る-　自分用ノート

## 読み取りたいフォームの内容を読み取る方法

```
取得した要素<form>.読みたいりたいフォームのname属性 .value
    処理内容
}
```
①定数を定義する

```
const search =
```
②入力内容を読み取るため<form>要素を取得（getElementByIdメソッド）

```
const search =　document.getElementById('form')
```

③★結構重要。**フォームにname属性指定をする**


```
<input type="text" name="word">
```

④Javasctiptのプログラムが読み取る。word(ネーム属性)指定。

```
const search =　document.getElementById('form').word
```

⑤valueプロパティに入れて保存させる

```
const search =　document.getElementById('form').word.value
```

## 基本動作をキャンセルさせる方法
### イベントオブジェクトをファンクションで受け取る

```
document.getElementById('form') = funcion(event)
```
渡されたのはイベント"オブジェクト"
→プロパティやメソッドを持っている

タグの基本動作をキャンセルする働きを持つ.
functionの{〜に追加}

```
event.preventDefalt();
```
Pandasデータ操作 列の結合、列入れ替え、列名変更

#はじめに
どこにでもありそうなネタだが、すぐ忘れてしまうのでメモ


#サンプルデータ
```data1.csv
ID,data1
1,data1-1
2,data1-2
3,data1-3
```

```data2.csv
ID,data2
1,data2-1
2,data2-2
3,data2-3
```

#列の結合(inner join)
```python
import pandas as pd

#読み込み
df1 = pd.read_csv("sample/data1.csv", index_col=0)
df2 = pd.read_csv("sample/data2.csv", index_col=0)

#列の結合
df = pd.concat([df1, df2], axis=1)
print(df)
```

結果

```
      data1    data2
ID
1   data1-1  data2-1
2   data1-2  data2-2
3   data1-3  data2-3

```

#列の入れ替え

```python
df = df.loc[:, ['data2', 'data1']]
print(df)
```

結果

```
      data2    data1
ID
1   data2-1  data1-1
2   data2-2  data1-2
3   data2-3  data1-3
```


#列名の変更
```python
df = df.rename(columns={'data1':'d1', 'data2':'d2'})
print(df)
```

結果

```
         d2       d1
ID
1   data2-1  data1-1
2   data2-2  data1-2
3   data2-3  data1-3
```
LightsailでIP接続元制限が管理コンソールからできるようになっていた

タイトルのとおりです。
元々Lightsailでは、EC2のセキュリティグループみたいに管理コンソールからポートごとにIP制限をかけておく機能がありませんでしたが、最近設定を開くといつのまにかその機能が追加されていました。
これまでは仕方なくhosts.allow, hosts.denyに書いて制限かけたりしてましたが、地味に便利。

# 設定方法
各インスタンスの　管理＞ネットワーキングタブ＞ファイアウォール
<img width="765" alt="スクリーンショット 2020-05-24 17.28.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257806/99ac6001-7a5f-9345-77e5-c1e12330755f.png">

編集アイコンを押して「IPアドレスに制限する」にチェックを入れると設定欄が出現。
IP単体指定でもCIDR表記でもいけるようです。ただし、セキュリティグループみたいにエイリアス指定はできません。元々hosts.allowやhosts.denyの設定がある場合は先にそちらの設定を削除しておきましょう。
<img width="767" alt="スクリーンショット 2020-05-24 17.30.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257806/76b9a458-ff52-4d23-22e1-2be45ee990b8.png">

詳しくは[公式ドキュメント](https://lightsail.aws.amazon.com/ls/docs/en_us/articles/amazon-lightsail-editing-firewall-rules)参照
[Test] GoogleMaps Api , Realm アプリ#２テスト

Kotlin ＋　Google Maps Api + Realm でアプリを作成し、
テストする際に下記のOpenStreetMapの公開GPSトレースを利用しました。

# OpenStreetMap
[OpenStreetMap(OSM)](https://www.openstreetmap.org/about)は、誰でも自由に地図を使えるよう、みんなでオープンデータの地理情報を作るプロジェクトです。
 __誰でも自由に参加して、誰でも自由に地図を編集して、誰でも自由に地図を利用することが出来ます。数多くのウェブ サイト、モバイル アプリ、ハードウェア機器で利用されています。__

## 公開GPSトレース
[https://www.openstreetmap.org/traces/](https://www.openstreetmap.org/traces/page/1)
下記のような公開GPSトレース一覧から適切なファイルをダウンロードできます。
・点数が確認できる。（1,000点以下くらいが良い）
・拡張子が確認できる。（GPX ファイルであれば良い）
・地図で確認できる。（国、地方が確認できるかも）
<img width="500" alt="openStreetMap-Tracer2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101832/cbf8b378-1fae-fec9-ff39-c0a63c74e4e3.png">

#[Android]シミュレーターでGPS data point設定
①SEND: 任意のGPS情報を入力し、送信
②LOAD GPX/KML:公開GPSトレースファイルなどを読み込む
③▶︎ボタン：　選択速度でGPS情報を送信
<img width="932" alt="android-gps-simulor.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101832/adf9a81e-2ef3-5e15-e1af-f3cad10fd1ec.png">

#おまけ
[iPhone]Simulation Location 設定
①アプリ起動中、Debug -> Simulate Location -> Add GPX file to Project
<img width="500" alt="debug-location-iphone.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101832/32e978e6-f2a3-8fd1-2bb9-8f0c48befc0b.png">
<img width="500" alt="load-gpx-iPhone.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101832/720437a3-884e-a488-cf29-69cdb6206dfb.png">

以上です。

#Index
≪ [kotlin,GoogleMaps Apiアプリ#1 作成](https://qiita.com/mario7/items/788d0cdaa59ecd0aacac)
pythonでif文の条件を短くしたい

プログラムを書いていると分岐させたい条件が細かくなって、愚直に書くとどうしても長くなってしまうことがあると思います。

例えば入力した文字がaかどうかを確認する、というのであれば、、

```python
input_str = input()
if input_str != "a":
    print("入力された文字はaではありません。")
```


とこれだけで済みますが、aでもbでもcでもない、というのを判定する場合、

```python
if input_str != "a" and input_str != "b" and input_str != "c":
```
と、こんな感じに愚直にコードを書くと!=の条件式をandでつなげただけ長くなってしまいますね。
なので、今回はリストを使って以下のようにまとめました。

```python
　word = ["a", "b", "c"]
  if input_str not in word:
```

これで判定したい文字が増えてもリストに追加するだけでif文をいじる必要がなくなりました。
横に長くなるよりは見栄えはいいけど、リスト使わずに済ます方法ないかな。。。
【RSpec】ArgumentError: wrong number of argumentsエラーが出たら、変数の命名を気にした方がいいかもしれないのですね

##はじめに
```Controller specs```に関する記事です。
共通化を行うために変数定義を行った際、命名を適当に行ったら沼ったので備忘録として残しておくことにします！

##環境
ruby 2.6.5
rails 5.2.4.2
rspec 3.7
capybara 2.15
factory_bot_rails 4.11

##エラー内容

####エラー修正前のコード

```ruby:spec/controllers/posts_controller_spec.rb
require 'rails_helper'

RSpec.describe PostsController, type: :controller do
  
  context "ログインを必要としないアクション" do
  .
  .
  .
  end

  context "ログインを必要とするアクション" do

    let(:user) { FactoryBot.create(:user) }
    let(:login_user) { login(user) }
    let(:post) { FactoryBot.create(:post) }
    let(:post_params) { FactoryBot.attributes_for(:post) }

    describe "createアクション" do

      context "ログイン済みユーザーの場合" do
        it "投稿を作成する" do
          login user
          expect {
            post :create, params: { post: post_params }
          }.to change(user.posts, :count).by(1)
        end
      end

      context "ログインしていないユーザーの場合" do
      .
      .
      .
      end

    end
  end
end
```

　前提
　　➡︎テスト用データ作成のためにFactoryBotを使用してます。(postは関連付け済み)
　　➡︎ログイン用にrails_helper.rbファイルに、login(user)メソッドを定義してます。

####エラー内容

```
Failures:
  1) PostsController ログインを必要とするアクション createアクション ログイン済みユーザーの場合 投稿を作成する
    Failure/Error: post :create, { post: post_params }
    
    ArgumentError:
      wrong number of arguments (given 2, expected 0)
　　　# ./spec/controllers/posts_controller_spec.rb:85:in `block (5 levels) in <main>'
```

呼び出し側(give)の引数の数が2、メソッド側(expected)の引数の数が0となっています。

つまり「引数が2つ呼び出されているのに、それに当たるメソッド側の引数が存在しない」ということで怒られています。

####エラー地点

```
post :create, params: { post: post_params }
```
何故この記述がエラーになるかというと、私が勝手に```パラメータのキー```として渡しているつもりになっていた上記の「```post:```」部分が、実はキーとしてではなく投稿の共通化をするために定義した```post変数だと見なされていた```ことが原因でした。

2つのgivenは「```post:```」と「```post_params```」のことを指していたんですね…。

なので、「post:」部分をキーとして認識してもらえるように共通化の方の```post変数の命名を変えてあげます。```

##解決策

####コード修正後
```ruby:spec/controllers/posts_controller_spec.rb
require 'rails_helper'

RSpec.describe PostsController, type: :controller do

  context "ログインを必要とするアクション" do

    let(:user) { FactoryBot.create(:user) }
    let(:login_user) { login(user) }
    - let(:post) { FactoryBot.create(:post) } #削除
    + let(:new_post) { FactoryBot.create(:post) } #変数名変更
    let(:post_params) { FactoryBot.attributes_for(:post) }

    describe "createアクション" do
      context "ログイン済みユーザーの場合" do
        it "投稿を作成する" do
          login user
          expect {
            post :create, params: { post: post_params }
          }.to change(user.posts, :count).by(1)
        end
      end
    end
  end
end
```

post変数をnew_post変数へ書き換え。


####spec実行

```
$ bin/rspec spec/controllers

1 examples, 0 failures
```

通りました！

今回のエラーで、変数の命名には気をつけようと改めて感じさせられました…笑

##参考
　https://qiita.com/yikegaya/items/98f0c12f5c25ee4731a1
備忘：Monaca (Onsen UI V2) + React + ncmb

# 前提
- MonacaでReactフレームワークを使ったプロジェクトがある状態
    - テンプレートはOnsen UI V2 Tabbar
- ニフクラMobile Backendでアプリがある状態
    - アプリのapiKeyとclientKeyが必要

# ncmbのインストール

ターミナルからインストールすると`/node_modules/ncmb`が追加される．

```console
npm install ncmb -S
```

参考：https://www.npmjs.com/package/ncmb

# ncmb APIを使うコードを追加

手っ取り早く試すために，`/src/HomePage.jsx`に以下を追加．
（まだReact勉強中だけど，本当は`var`じゃなくて`const`とか`let`を使うべき？）

```diff
 export default class HomePage extends React.Component {
   render() {
+    var apiKey    = "your_ncmb_apiKey";
+    var clientKey = "your_ncmb_clientKey";
+    var NCMB = require('ncmb');
+    var ncmb = new NCMB(apiKey, clientKey);
+    if (!ncmb) {
+      console.log("ncmb is null.");
+    } else {
+      console.log("ncmb is loaded.");
+    }
     return (
       <Page renderToolbar={() =>
```

# fsの解決

このままだと

```console
ERROR in ./node_modules/node-localstorage/LocalStorage.js
Module not found: Error: Can't resolve 'fs' in '...\node_modules\node-localstorage'
```

というエラーがでるので，`/webpack.config.js`に以下を追加．

```diff
   performance: {
     hints: false
-  }
+  },
+
+  node: {
+    fs: 'empty'
   }
 };
```

参考：
https://github.com/lmaccherone/node-localstorage/issues/45
https://github.com/lmaccherone/node-localstorage/issues/35
https://qiita.com/Hoshito/items/f7acb1b2082f8c2d0bd3

# apikey and clientkey requredの解決

コンパイル（トランスパイル？）は解決するけど，実行結果を見るとエラーが出る．

```console
vendors~app.js:40 Error: apikey and clientkey required
    at Object.e (vendors~app.js:48)
    at Object.<anonymous> (vendors~app.js:48)
    at l (runtime~app.js:1)
    at t.value (app.js:1)
    at Ba (vendors~app.js:40)
    at Da (vendors~app.js:40)
    at vs (vendors~app.js:40)
    at lu (vendors~app.js:40)
    at su (vendors~app.js:40)
    at Qs (vendors~app.js:40)
```

これは新しいWebpackのDefineの使い方に問題があるっぽい？
とりあえず，`/node_modules/ncmb/lib/ncmb.js`を編集して，問題箇所をコメントアウト．

```diff
     return NCMB;
   })();
+  /*
   if (typeof define === 'function' && define.amd) {
    define([], NCMB);
   }
+  */
   if(typeof window !== "undefined"){
     window.NCMB = NCMB;
   }
```

参考：
https://github.com/NIFCloud-mbaas/UserCommunity/issues/456
https://github.com/for-GET/know-your-http-well/issues/60
https://github.com/webpack/webpack/issues/5316#issuecomment-395778081
https://www.npmjs.com/package/amdefine#amdefineintercept-usage

# 結果

とりあえず，以上のステップで，ncmb APIが使えるようになった．
（確認したのは，`login()`だけ）

```console
ncmb is loaded.
```