OmniAICreator/Qiita-1.07M huggingface dataset:
rails g でターミナルがフリーズした時の対処法

#rails コマンドが動かなくなった
ターミナル上でrails g コマンドを実行した際、突然動かなくなりました。
その際の対処法を記述していきます。
##対処法

```console
$ spring stop
```
このコマンドを実行し、再びrails g コマンドを実行すると、無事動きました。

##原因
一度作成したアプリケーションを削除し、同じ名前でrails newすると起きるようです。
【Ruby on rails】heroku コマンド実行時にbash: heroku: command not foundと表示される。【rails tutorial】

##エラー内容

herokuでのマイグレーションを実施するために以下コマンドを実行。

```
heroku run rails db:migrate
```

すると

```
bash: heroku: command not found
```

herokuコマンドが使えない・・・。

##解決方法
調べたところ、herokuを再インストールすれば直るとのこと。

以下コマンドで再インストール。

```
source <(curl -sL https://cdn.learnenough.com/heroku_install)
```

herokuコマンドでバージョン確認をしてみる。

```
heroku -v
```


```
heroku/7.39.3 linux-x64 node-v12.16.2
```

コマンドが通りました！
2回目のgit add .でエラーが出た

## 環境


|  概要  |  詳細  |
| ---- | ---- |
|  PC  |  Mac  |
|  コマンドツール  |  ターミナル  |
|  開発言語  |  React  |


## git add . としたら


```unix:title
$ git add .
```

としたら以下が出力

```unix:title
warning: adding embedded git repository: *****e_****
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint: 
hint: 	git submodule add <url> *****_*****
hint: 
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint: 
hint: 	git rm --cached ****_****
hint: 
hint: See "git help submodule" for more information.
error: '******-****-***/' does not have a commit checked out
fatal: adding files failed

```

日本語訳すると


>現在のリポジトリ内に別のgitリポジトリを追加しました。
外部リポジトリのクローンには、
埋め込まれたリポジトリとそれを取得する方法がわかりません。
サブモジュールを追加するつもりなら、以下を使用してください：
git submodule add <url> ****** _ ****
このパスを誤って追加した場合は、次のようにしてインデックスから削除できます。
git rm --cached ***** _ *****
詳細については、「git help submodule」を参照してください。

と書いてあって元々紐付けられていたリポジトリと違うリポジトリにaddしたかったのですが、元々紐付けられていたリポジトリが邪魔だっだっぽいのでrmしてみました。

```unix:title
$ rm -rf *****_***/.git
```

そして```git add .```してみると

```unix:title
$ git add .
error: '*****-****-***/' does not have a commit checked out
fatal: adding files failed
```

と出ました。

とりあえずoriginalファイルだけaddしてみる

```unix:title
$ git remote add origin https://github.com/*****/*****-***-****.git
$ 
```

でオリジナルファイルをadd

そして変更があったファイルをaddするために``` -u ```オプションを付けてみました。

```unix:title
$ git add -u
$
```

で出来ました。

プログラミング初心者なので理論が無茶苦茶ですね。しっかり勉強しようと思います。

ちなみにtigを使ってaddするファイルを管理する方法も今後使っていきたいですね
https://qiita.com/suino/items/b0dae7e00bd7165f79ea

git add オプション参考記事
https://note.nkmk.me/git-add-u-a-period/
TypeScript: テンプレート文字列のタグ関数の作り方


## テンプレート文字列とは

バッククオート`で囲った文字列のこと。変数展開が使える。

```js
const str = `foo bar`
const str2 = `hoge ${str}`
//=> "hoge foo bar"
```

## タグ関数とは

テンプレート文字列の前に書くことで、文字列を処理できる関数。この関数は受け取った文字列を処理して、文字列を返してもいいし、受け取った文字列を処理して、何らかのオブジェクトを返したりしてもいい。

```js
const str = tag`foo baar`
         // ^^^ ここで使える関数
```

## タグ関数の作り方

受け取った文字列をそのまま返す関数の実装例です:

```ts
const tag = (
  template: TemplateStringsArray,
  ...expressions: ReadonlyArray<any>
) => template.reduce((a, b, idx) => a + b + `${expressions[idx] ?? ''}`, '')
```

```ts
console.log(tag`hello world ${new Date()}`)
//=> hello world Fri May 22 2020 20:01:16 GMT+0900 (Japan Standard Time)
```
HTML PHP 特殊文字 エスケープ処理

# HTMLの特殊文字とは

HTML上、ただの文字列ではなく、特殊な意味を持つ文字。

# エスケープ処理前と処理後
エスケープすると...(例↓)

- `<` → `&lt;`
- `&` → `&amp;`

ブラウザがHTLMLをレンダリングするときに、`&lt;`が`<`に変換される。

その他の対応表は例えば以下リンク等に記載されている
https://www.benricho.org/symbol/tokusyu_07_mark.html

# エスケープ例

`<script>alert("xssの危険")</script>`
を文字列として出力したい場合。

```php:エスケープ処理
<?php

$str = '<script>alert("xssの危険")</script>';

function h($s) {
    return htmlspecialchars($s, ENT_QUOTES, "UTF-8");
}

?>

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <?php echo h($str);?>
</body>
</html>
```

ブラウザで見るとJavaScriptのAlertダイアログを動作せず、

`<script>alert("xssの危険")</script>`

と表示される。

ページのソースを見ると、

`&lt;script&gt;alert(&quot;xssの危険&quot;)&lt;/script&gt;`

となっており、**ブラウザがHTMLをレンダリングする時に、**意図した文字列に変換され、出力されることがわかる。

# 一旦全てをエスケープした後に、特定の特殊文字を復活させる

- 特殊文字は、`&#数字;`で表される。
- エスケープすることで`&amp;#数字;`になる
- 特定の特殊文字を復活させるには正規表現を使って`&amp;`を`&`にする

```php:エスケープ処理
<?php

    public static function escape_white_list($str){
        $str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

        //◆,♬をホワイトリスト化
        $str = preg_replace('/&amp;#(|9670|9836);/', '&#$1;', $str);

        return $str;
    }
?>
```

■ 正規表現の後方参照

- preg_replaceの第二引数の`$1`は、正規表現の後方参照という機能
- 第一引数の括弧「()」で括った内容が一時的に記憶され、その内容を後で使えるというもの。
- 1番目の括弧は`$1`、2番目の括弧は`$2`で参照可能となる。

さらに詳しい参考記事
https://d2b6.dg8.top/article/412400033.html
【Python3】14行でダイクストラ法

昨日は[14行で素因数分解](https://qiita.com/nontan18/items/167ab2f44340372174b7)を実装したのですが、本日はヒープを用いて14行でダイクストラ法を実装しました。上から14行で。

```dijkstra.py
from heapq import heappush, heappop

def dijkstra(vertices_num, edges, src):
  dist = [float('inf')] * vertices_num
  heap = [(0, src)]

  while len(heap):
    d, from_ = heappop(heap)
    if d < dist[from_]:
      dist[from_] = d
      for _, to, cost in filter(lambda e: e[0]==from_, edges):
        heappush(heap, (min(dist[to], dist[from_] + cost), to))
        
  return dist

if __name__ == '__main__':
  answer = dijkstra(
    8, 
  　[
      (0, 1, 5), (0, 2, 4), (0, 3, 1), (1, 4, 2), (1, 0, 5), (2, 0, 4), (2, 3, 2), (2, 4, 5), 
      (2, 5, 6), (3, 0, 1), (3, 2, 2), (4, 1, 2), (4, 2, 5), (4, 6, 1), (4, 7, 3), (5, 2, 6), 
      (5, 7, 2), (6, 4, 1), (6, 7, 4), (7, 4, 3), (7, 5, 2), (7, 6, 4)
    ], 0
  )
  print(answer) # [0, 5, 3, 1, 7, 9, 8, 10]
```
第1引数は頂点数、第2引数は(from_, to, cost)のリスト、第3引数は開始地点のインデックスになります。返り値は開始地点から各頂点への最短距離を返します。

# 参考
https://www.youtube.com/watch?v=X1AsMlJdiok
ダイクストラ法に関しては、こちらの動画の説明が非常にわかりやすかったので、そこで扱われている問題を参考にテストケースを作らせて頂きました。赤字は各頂点のインデックスです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420158/f7944b32-ba9d-f841-f9c2-2a132bb3f674.png)
(引用元:上記Youtubeページより)
WPFでBitmapImageクラスを用いた時に、読み込んだ画像ファイルをプロセスで占有しない方法

# はじめに
WPF で BitmapImageクラスを用いた時に、ヘルプページなどのよくある実装例をそのまま利用すると、読み込んだ画像ファイルを対象アプリケーションのプロセスが占有してしまい、アプリケーションを終了するまで、その画像ファイルを変更・削除できなくなります。
その回避策の紹介です。

[BitmapImage クラスのヘルプはこちら](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.media.imaging.bitmapimage?view=netcore-3.1)

# 回避策
BitmapImage クラスには、BitmapImage.CacheOption プロパティというものがあり、これを変更することで、メモリ上に画像ファイルを保持する期間が変更できます。
[BitmapImage.CacheOption プロパティ](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.media.imaging.bitmapimage.cacheoption?view=netcore-3.1)

上記プロパティを OnLoad に設定することで、読み込み後に画像ファイルを占有しなくなります。

具体的には、以下のコードになります。

```c#

BitmapImage bmpImage = new BitmapImage();
using (FileStream stream = File.OpenRead(filePath))
{
	bmpImage.BeginInit();
	bmpImage.CacheOption = BitmapCacheOption.OnLoad;  // ここが重要
	bmpImage.StreamSource = stream;
	bmpImage.EndInit();
	stream.Close();
}
```

以下にも同様のことが書かれていました。
[How to free the memory after the BitmapImage is no longer needed?](https://stackoverflow.com/questions/8352787/how-to-free-the-memory-after-the-bitmapimage-is-no-longer-needed?noredirect=1&lq=1)
[ファイルから解放可能なBitmapImageを読み込む](http://neareal.net/index.php?Programming%2F.NetFramework%2FWPF%2FWriteableBitmap%2FLoadReleaseableBitmapImage)

# まとめ
私はWPFを用いて [こちらのツール](https://www.lightning-review.com/) を作っています。

Twitterでも開発に役立つ情報を発信しています → [@kojimadev](https://twitter.com/kojimadev)
Oculus Linkをインストール中にエラーが出る

# はじめに

メモ記事です。
この記事で救われる人が結構いそうなので書き残しておきます。
また、とりあえず解決した報告記事のつもりで書きます。

# 発生した問題

発生した問題の状況です。
先日Oculus Questを買いました。
なのでOculus Linkを試そうと思い、以下のリンクから`OculusSetup.exe`をダウンロードしました。

- https://www.oculus.com/setup/

その後、ダウンロードした`OculusSetup.exe`を実行しポチポチやっていきました。
すると以下のような画面が表示され失敗してしまいました。

![コメント 2020-05-22 191406.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390881/6c1f2431-c3df-5180-aadd-42e37881f87f.png)

このとき、とりあえず右クリックからの**管理者として実行**をしても同様の画面で失敗しました。
そこでインストールのログを見に行くと`パス 'DaybreakNative.dll' へのアクセスが拒否されました。`との一文を見つけました。
管理者権限でもアクセスできないのか...

# 解決した方法

調べている中で様々な方法が出てきましたが、以下の手順でインストールに成功しました。

1. `Cドライブ`直下に`OculusSetup.exe`を置く
2. **管理者として実行**をする

![コメント 2020-05-22 192210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390881/130cbd12-16ef-a9d5-7f06-1832665d4ada.png)

これでSteamのアプリを実行できる...！

# 参考にしたサイト
- https://atelier-hinata.hatenablog.com/entry/2019/11/20/175236
- https://poipoipoip.hatenablog.com/entry/2019/12/25/181151
- https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10168679085
- https://forums.oculusvr.com/community/discussion/60933/oculus-setup
ゼロから始めるLeetCode Day33「1. Two Sum」

#概要
海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

せっかくだし人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

[Leetcode](https://leetcode.com/)

[ゼロから始めるLeetCode 目次](https://qiita.com/KueharX/items/6ee2502c3b620c795b70)

前回
[ゼロから始めるLeetCode Day32「437. Path Sum III」](https://qiita.com/KueharX/items/de5f70a64667cfb04442)

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

[Twitter](https://twitter.com/kueharx)やってます。

# 問題
[1. Two Sum](https://leetcode.com/problems/two-sum/)

LeetCodeに登録した際に一番最初に解くであろう問題について書いてなかったので、今更ながら書きます。

難易度はEasy。
Top 100 Liked Questionsからの抜粋です。

問題としては、整数の入った配列と特定の値が格納された変数`target`が与えられます。配列の中から二つの整数を選び、`target`と一致する組み合わせを見つけ、配列のインデックスを返すような関数を実装してください。
なお、その組み合わせは一つしか存在せず、かつ同じ値を二度使うことは許されません。

>Given nums = [2, 7, 11, 15], target = 9,

>Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

# 解法

例えば全探索で書いてみるとこうなります。

全探索とはいわゆるしらみつぶしに調べるようにする書き方で、全てのパターンを調べようとする代わりに致命的なパフォーマンスとなってしまうことがほとんどです。

```Python
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            for j in range(i+1,len(nums)):
                ans =  nums[i] + nums[j]
                if target == ans:
                    return [i,j]
# Runtime: 6848 ms, faster than 5.01% of Python3 online submissions for Two Sum.
# Memory Usage: 14.6 MB, less than 18.14% of Python3 online submissions for Two Sum.
```

遅いですね。
では代わりにハッシュマップを使って書いてみましょう。

```Python
class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        hashmap = {}
        
        for i in range(len(nums)):
            num = nums[i]
            complement = target - num
            if num in hashmap:
                return [hashmap[num],i]
            else:
                hashmap[complement] = i
# Runtime: 52 ms, faster than 60.15% of Python3 online submissions for Two Sum.
# Memory Usage: 15.3 MB, less than 5.11% of Python3 online submissions for Two Sum.
```

かなり速度が改善されましたね。

言語の書き方について学んで短く書いたりするのも大切ですが、それだけではなく、書き方一つで速度を大幅に変えることができるというのがデータ構造とアルゴリズムを学ぶ大きな理由の一つと言えるでしょう。

自分への戒めのためにもここで書いておきます。

こっちの書き方の方が良いよ！とかこの言語で書いてみたよ！とかがあれば是非コメントしてみてください。
プロセス確認コマンドpsのオプション忘備録

超基本だけどプロセス確認コマンドpsのオプション忘備録。

# ps
オプションなし。
自分のユーザのプロセスが省略された形で出てくる。

```
$ ps

  PID TTY           TIME CMD
24863 ttys000    0:00.10 /bin/bash -l
32161 ttys004    0:00.05 -bash
```

#ps -f
fオプション。
UID、PPID、C、STIMEのカラムを追加で確認できる。

```
$ ps -f

  UID   PID  PPID   C STIME   TTY           TIME CMD
  501 24863 24861   0  7:32PM ttys000    0:00.10 /bin/bash -l
  501 32161 32160   0  6:45PM ttys004    0:00.05 -bash
```


#ps -ef

```
$ ps -ef

  UID   PID  PPID   C STIME   TTY           TIME CMD
    0     1     0   0 木10AM ??         3:30.67 /sbin/launchd
    0   102     1   0 木10AM ??         0:07.61 /usr/sbin/syslogd
    0   103     1   0 木10AM ??         0:17.05 /usr/libexec/UserEventAgent (System)
...
```
全ユーザの実行中プロセスが省略されずに表示される。

|カラム  |意味  |
|---|---|
|UID  |ユーザID  |
|PID  |プロセス番号  |
|PPID  |親プロセスID  |
|C  |プロセスのCPU使用状況  |
|STIME  |プロセスの開始時刻  |
|TTY  |端末名  |
|TIME  |プロセスの総実行時間  |
|CMD  |実行コマンド名  |

#ps -ef | grep xxxx
プロセスを探したいときは基本的にこれを使う。

```
$ ps -ef | grep xxxx
```

#### 例

```bash
$ ps -ef | grep httpd

    0   141     1   0 木10AM ??         0:02.34 /usr/sbin/httpd -D FOREGROUND
   70   320   141   0 木10AM ??         0:00.00 /usr/sbin/httpd -D FOREGROUND
  501 32954 32161   0  7:31PM ttys004    0:00.00 grep httpd
```

# 参考
[【Linux】ps実行時に-efオプションを付ける理由 | 金融エンジニア](https://lanchesters.site/linux-ps-ef/)
【Flutter】拡大と縮小を繰り返すアニメーションを実装する

# はじめに

Flutterでこのような拡大縮小を繰り返すアニメーションを実装してみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147934/d601bf4b-5e2a-5f46-6b15-68e9ee1689c7.gif" width="40%"></img>

# 実装方法

今回はAnimationControllerとScaleTransitionを使って実装します。

## 1. AnimationControllerを定義する

StatefulWidgetを定義し、最初に`initState()`内でAnimationControllerの初期化をします。
ここで、アニメーションのDurationを設定し、初期化しています。また、ついでにcascade記法を使って、`repeat()`関数の実行もしています。`repeat()`を呼び出すとアニメーションの繰り返しを自動で行ってくれます。

また、`repeat()`メソッドで`reverse: true`をセットしている理由としては、デフォルトだと「start->end,start->end」といった感じで単方向のアニメーションが繰り返される感じになってしまい、end->startに戻る時のアニメーションが実行されないためです。

```main.dart
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  AnimationController _animationController;

  @override
  void initState() {
    super.initState();
    _animationController = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 500),
    )..repeat(reverse: true);
  }

  @override
  Widget build(BuildContext context) {
    ...
  }
}
```

## 2. ScaleTransitionを定義して、AnimationControllerをセットする

ScaleTransitionはウィジェットのスケールをアニメーションさせるための便利ウィジェットです。
アニメーションさせたいウィジェットをラップし、`scale`プロパティにて、先ほど定義したAnimationControllerをセットします。
ここでは、AnimationControllerの`drive()`を呼び出す必要があります。

また、Tweenを`drive()`の引数に含めることで、アニメーション開始時と終了時でどれくらい大きくするかの倍率を指定することができます。今回は、開始時はx1,終了時はx1.2で指定しています。

```main.dart
  @override
  void initState() {
    super.initState();
    _animationController = AnimationController(
      vsync: this,
      duration: const Duration(milliseconds: 500),
    )..repeat(reverse: true);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: ScaleTransition(
          scale: _animationController.drive(
            Tween<double>(
              begin: 1,
              end: 1.2,
            ),
          ),
          child: Image.asset(
            'images/sample.jpg',
            width: 200,
            height: 150,
            fit: BoxFit.cover,
          ),
        ),
      ),
    );
  }
```

あと補足ですが、これにプラスして、別のTweenを指定するには、`chain()`メソッドを使って、複数のTweenを指定することができます。

```main.dart
// 上記抜粋
Center(
  child: ScaleTransition(
    scale: _animationController.drive(
      Tween<double>(
        begin: 1,
        end: 1.2,
      ).chain(  // chainを使って、Tweenを追加する
        CurveTween(
          curve: Curves.easeInOutSine,
        ),
      ),
    ),
    child: Image.asset(
      'images/sample.jpg',
      width: 200,
      height: 150,
      fit: BoxFit.cover,
    ),
  ),
),
```

# まとめ

小ネタですが、紹介させていただきました。コードはこちらにあげております。

https://github.com/youmitsu/repeat_animation_test_app

ご覧いただきありがとうございました。
新社会人エンジニアとして働いて一ヶ月弱経って感じた大事なこと

# はじめに
私は20新卒エンジニアとして働いています
一ヶ月半ちょい働き、感じたことなどを備忘録的にまとめてみました

## 一応バックボーン
- 大学は私大文系
- Web制作会社で非エンジニアとして2年ほど働いていた
- なので実際に実装などの経験はない未経験エンジニア

## 社会人は時間との戦い
いきなり最初からエンジニアと関係のない話になります
これは自分が社会人となってまず感じたことです
大学生時代にも私は非エンジニアとしてWeb製作会社で働いた経験から、ある程度時間の重要性、どのように時間を使っていったらいいかなどわかっていたつもりでしたが、学生->社会人と変わるだけでこんなにも時間が大事になるか・・・と感じました（と、同時にWeb制作会社で働いていた時はとても周りが優しかったことも気付きました）
タスクを振られてその仕事を行うわけですが、そのタスクに対する時間の切り方（要は期日）がかなりシビアです
〇〇/〇〇が期日であれば、それを達成するために時間配分、**1日1日をどのように使っていくかをしっかり自分で組み立てないと100%期限は守れません**

## タスク見積もりの重要性
これは以前Web製作会社のときもやっていましたが、ここに関しても重要度が全然違うなと思いました
以前はとりあえずこれとこれとこれ、みたいに簡単な見積もりをしていましたが、エンジニアとして仕事をするなら、かなり**しっかりと組み立てないと後々やばくなる印象です**
というのも、コードを書いていく中で、**自分の持っているタスクについて100%の知識を持っていることはない**と思うからです
私自身の例でいうと、ほぼ知識ゼロのタスクにアサインされたので、とんでもないことになりました
見積もりの際に必ず知らないことが出てくるので、**見積もりをする際にある程度余裕を持たせる**（もちろん許される範囲で）ことで解決をしました

## 自走力
基本チームでの開発でものを作っていくため、変に自分一人で走ることは避けたいですが、**分からなこといに対して向かっていける自走力**はとても大事な気がします
自走せずに先輩などに聞くばかりでは、先輩のタスク遅れにもつながりかねないので重要な気がします

## 質問
自走力が大事とは書きましたが、**質問も同じように重要**と感じています
ずっと一人で考えても解決できない問題は、永久に解決しません（個人的感想）
とはいえ、先ほども書いたように、人の時間をもらうので、**質問の質をよくする必要がある**と思っています
**理解度0%の質問と、30%で聞く質問は相手の答えるための時間のボリュームが変わる**ので、大事だな、と思っています
ちなみち私は0%で質問をして、すごく怒られました（怒られて当然ですね）

## パニックに対する対処をしる
これは結構大切な気がします
私はタスクを振られ、あまりにも分からないことが多すぎて何回かパニックになりました
個人的には新卒の未経験エンジニアさんは同じような状態になりそうかなと思っています
自分は下のnoteを読んでどうにか解決しましたので、もしパニックになったらぜひ一読してみてほしいです
[新人エンジニアに贈るパニクらない術](https://note.com/heavenosk/n/ne10a0d37228b)

## 人の信用を得る
これはちょっと外れた話かもしれませんが、結構大事だなと思っています
信用を得ていると、相手が優しくなります
そうすると、質問などがしやすかったり、相手からいろいろとアドバイスなどを受けれます
これをするには、とにかく**恥を捨てて素直になることが重要**かなと思っています
分からない、不安なことは隠さず聞く、失敗は伝えるなど、結構初歩的なことですが、意外と恥などが邪魔しがちな気がします

# 終わりに
すごく初歩的なことが全部のようになってしましましたが、自分で大事だと思うことなので残しておきます
エンジニアとしての今のところの所感としては、**スキルセットは大事だけれども、それと同じくらいにマインド面が大事になるな**という印象です
これからもしっかり戦力になれるように頑張っていきたいなと思います
（全然関係ないですが、切羽詰まって技術を使えるようにしなくなると人はコードを書き、Githubにも芝が生えることも気付きです、、、）
TensorFlow v2 でattribute 'app'が無いと怒られるときの解決方法

##0.概要
Tensor Flow v2のサンプルコードを実行した際に，以下のError文が出たときの解決方法についてまとめます．
(Tensor Flow v1へのバックデートは行いません．)

##1.背景
Tensor Flowの勉強をするにあたり，以下のURL先よりサンプルコード(classify_image.py)をダウンロードしました．
<https://github.com/atong01/Imagenet-Tensorflow/blob/master/classify_image.py>


##2.環境
OS:Windows10 Enterprise 1809 64bit
Python:3.7.6
TensorFlow_gpu:v2.1.0

##3.困ったこと
サンプルコードなので，問題なく実行できるかと思いきや，なぜか以下のErrorが出てきてしまいます．

```python:Error文
Traceback (most recent call last):
  File "classify_image.py", line 49, in <module>
    FLAGS = tf.app.flags.FLAGS
AttributeError: module 'tensorflow' has no attribute 'app'
```

なんでやねーん．

で，調べてみたところ
　　「TensorFlow v2ではtf.appがすでに削除されているので，
　　　『TensorFlow v1にバックデートする』か
　　　『TensorFlow v2のAPI用にコードを書き換える』
　　　のどちらかで対応してね」とのこと．

なんやねーん．せっかく苦労して環境構築したんやから，こっから環境をいじりたくないわー．

##4.解決方法
で，さらに調べたところ，以下のimport文をコードに書き込んだら問題解決可能との情報を発見．

```python:解決方法
import tensorflow.compat.v1 as tf
```

実際，サンプルコードに追記して実行してみたら，問題なく動きました．
よかったー！

　
参考URL<https://stackoverflow.com/questions/58258003/attributeerror-module-tensorflow-has-no-attribute-app>
【Vue.js】 ライフサイクルフック

# はじめに
ライフサイクルフックはVueのオプションオブジェクトの１つ。Vueインスタンスの生成から破棄までの間の特定のタイミングで実行されるメソッド（関数）を```ライフサイクルフック```という。ライフサイクルフックはコンポーネントごとに存在する。

## ライフサイクルフック一覧

dataオプションやmethodsオプションは自由に定義できるが、ライフサイクルフックは使用できるメソッドがあらかじめ決まっており、以下のようなタイミングでメソッドが実行される。

| ライフサイクルフック   | タイミング | 
|:----------------:|:------------------|
| beforeCreate     | インスタンス生成時。リアクティブデータが作成される前。|
| created          | インスタンス生成後。リアクティブデータが作成された後。|
| beforeMount      | インスタンスがDOM（HTML）にマウントされる前。DOMの操作はできない。 |
| mounted          | インスタンスがDOM（HTML）にマウントされた後。DOMの操作ができる。 |
| beforeUpdate     | データが更新され、DOMが更新される前。 |
| updated           | データが更新され、DOMが更新された後。 |
| beforeDestroy    | インスタンスが破棄される前。 |
| destroyed        | インスタンスが破棄された後。 |
| errorCaptured    | 任意の子孫コンポーネントからエラーが捕捉された時。 |

※リアクティブデータ・・・オプションで定義されているデータ。定義しているデータが更新されるとHTML側も自動的に更新される。変更が瞬時に反映されるデータ。

## 基本的な書き方
```sample.js
new Vue({
  el: 'app',
  ライフサイクルのメソッド名: function() {
    ここに処理をかく
  } 
})
```

### beforeCreate
```sample.js
new Vue({
  el: 'app',
  data: {
    message: 'Hello',
  },
  // インスタンスが生成され、処理が実行される
  beforeCreate: function() {
    // リアクティブデータはまだ生成されていないのでmessageは参照できない
    // コンソールには何も出力されない
    console.log(this.message)
  }
})
```

### created

```sample.js
new Vue({
  el: 'app',
  data: {
    message: 'Hello',
  },
  // インスタンスが生成された後、処理が実行される
  created: function() {
    // コンソールにHelloと出力される
    console.log(this.message)
  }
})
```

### beforeMount

```sample.vue
<template>
  <!-- まだマウントされていないのでmessageの中は空のまま -->
  <div id="app">{{ message }}</div>
</template>
<script>
new Vue({
  el: 'app',
  data: {
    message: '',
  },
  // マウントされる前に処理が実行される
  beforeMount: function() {
    // messageにHelloを代入
    this.message = 'Hello'
  }
})
</script>
```
### mounted

```sample.vue
<template>
  <!-- Helloが表示される -->
  <div id="app">{{ message }}</div>
</template>
<script>
new Vue({
  el: 'app',
  data: {
    message: '',
  },
  // マウントされた後に処理が実行される
  mounted: function() {
    // messageにHelloを代入
    this.message = 'Hello'
  }
})
</script>
```

**ライフサイクルの流れとメソッド実行のタイミングを表した図↓**
![alt](https://jp.vuejs.org/images/lifecycle.png)
Node.jsでHTMLから画像を生成する方法

どうもこんにちは、[@y_temp4](https://twitter.com/y_temp4)です。

最近、趣味で個人開発している Web サービスの [AnyMake](https://anymake.app) にて、画像を動的に生成するプログラムを書く機会があったのでその方法についてまとめてみます。

関連記事：[埋め込みコンテンツを追加しました！｜ AnyMake ｜ note](https://note.com/anymake/n/n2dbf8001c172)

## [node-html-to-image](https://github.com/frinyvonnick/node-html-to-image) を使う

自分は画像生成周りは全然詳しくないのですが、普段フロントエンドのコードを書くことが多いので

「**HTML から画像生成できたら便利だな〜**」

と思いました。

そこで少し調べると、[node-html-to-image](https://github.com/frinyvonnick/node-html-to-image)というライブラリが見つかり、これを使うと割と簡単にやりたいことが実現できそうでした。

## 使い方

以下のコードは README からの引用ですが、このように HTML を引数として渡してやると、その HTML の表示結果が画像として出力されます。

```js
const nodeHtmlToImage = require("node-html-to-image");

nodeHtmlToImage({
  output: "./image.png",
  html: "<html><body>Hello world!</body></html>"
}).then(() => console.log("The image was created successfully!"));
```

上記の例だと、「Hello World!」と書かれたシンプルな画像ファイルが生成されます。

今回自分は画像を返す API を作りたかったので、README にある以下のコードを参考に作成しました。

```js
const express = require("express");
const router = express.Router();
const nodeHtmlToImage = require("node-html-to-image");

router.get(`/api/tweet/render`, async function(req, res) {
  const image = await nodeHtmlToImage({
    html:
      "<html><body><div>Check out what I just did! #cool</div></body></html>"
  });
  res.writeHead(200, { "Content-Type": "image/png" });
  res.end(image, "binary");
});
```

非常にシンプルですがこれで最低限やりたいことは実現できたので、お手軽に画像生成したい場合はこれが良さそうです。

---

ちなみにですが、このライブラリの内部処理としては [Puppeteer](https://github.com/puppeteer/puppeteer) で HTML を描画してスクリーンショットを撮っているだけです。

言われてみれば確かにこれでいけるな...と README や内部の処理を読んでいて思いましたが、やっている事的にあんまり軽くはなさそうなので、もしこれより良さそうな方法で簡単に HTML から画像を生成する方法をご存知の方がいらっしゃればぜひコメント欄にて教えていただけますと嬉しいです 🙏
java(オーバーライド)

##オーバーライドを活用する

```java:Hero.java
public class Hero {
  String name = "勇者";
  int hp = 100;
  //逃げる
  public void run() {
    System.out.println(this.name + "は逃げ出した！");
  }
}
```

###SuperHeroクラスにrun()を再定義する

```java:SuperHero.java
public class SuperHero extends Hero{
  boolean flying;
  //撤退する
  public void run() {      //Heroクラスにも定義してあるが、再定義（上書き）できる
    System.out.println(this.name + "撤退した！");
 }
}
```

###HeroとSuperHeroのrun()を呼び出す

```java:Main.java
public class Main {
  public static void main(String[] args) {
    Hero h = new Hero();
    h.run();
    SuperHero sh = new SuperHero();
    sh.run();
  }
}
```

**実行結果**
勇者は逃げ出した！
勇者は撤退した！


##継承の禁止

####Stringクラスと宣言時にfinalがついてるクラスは継承できない

```java:Main.java
public class Main extends String{
```

Stringクラス禁止は、javaのAPIリファレンスでも確認できる

```java:Main.java
public final class Main {
```


##オーバーライドの禁止

####宣言時にfinalが付けられたメソッドは、子クラスでオーバーライドできない


```java:Hero.java
public class Hero {
  String name = "勇者";
  int hp = 100;
  //逃げる
  public final void run() {     //run()はオーバーライドできない
    System.out.println(this.name + "は逃げ出した！");
  }
}
```

`public final void run()`先ほどの、SuperHeroクラスのrun()メソッドは無効になる
Visual Studio Codeでterminal が何も表示しなくなったの回

# 状況
Visual Studio Codeでterminal が何も表示しなくなりました。何も出来ません困りました。

![Screenshot_2020-05-22_18-26-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593429/f8993ffc-df90-73bb-0024-b89a19bda4e0.png)

またハマっちゃうので自分用メモ

# 環境
Ubuntu 18.04 LTS

# 解決策

File -> Preference -> Setting -> Features -> terminal -> Integraged: Ingerit Env

Integraged: Ingerit Env

の歯車マークを押してReset Setting をおす

# 参照
神投稿
https://stackoverflow.com/questions/54092486/visual-studio-code-terminal-blank-screen
CMake + C++ プロジェクトで lld(or custom linker) を使うメモ

lld: gnu の既存リンカ bfd より, より高速にリンクができたりする. また, いくらかへんてこなリンケージが使われているときでも, いい感じに処理してくれたりする. 
(bfd の後続で gold linker もあったが, 現状は lld に統合?)

bfd でうまくリンクできなかったり, bfd でリンクが遅くなってきたら lld 利用を考えてみましょう.
リンクが遅いとは, それなりにいい CPU(e.g. Ryzen9 3950X as of 22th May, 2020) でリンクに 4~5 秒以上かかるようなときです. lld にすると 1 秒くらいに短縮されます.

Ubuntu とかですと apt で別途インストールが必要です.
(コマンドラインで `ld.lld` という感じで利用できるか確認しておきましょう)

clang/clang++ でリンクする場合, `-fuse-ld=lld` と指定します.
(gcc も最新だと対応しているはず?)

cmake では,

`add_executable` したターゲットに, `LINK_FLAGS` で `-fuse-ld=` でリンカ指定します.

```
set_property(TARGET ${BUILD_TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -fuse-ld=${MY_LD}")
```

## 他の方法

CMAKE_C_LINK_EXECUTABLE でもいけるかも.

https://stackoverflow.com/questions/1867745/cmake-use-a-custom-linker

ただ, こちらで試して限りでは, うまく linker を呼んでくれませんでした.
lto などとのからみもあり, LD 別呼び出しではなく, cc/c++ 経由で呼べたほうが理想そうです.

## 参考文献

llvm では `LLVM_ENABLE_LLD` では, `-fuse-ld=lld` 指定で実現しています.

https://llvm.org/docs/CMake.html#llvm-specific-variables

`CMAKE_EXE_LINKER_FLAGS`, `CMAKE_MODULE_LINKER_FLAGS` `CMAKE_SHARED_LINKER_FLAGS` に append しているようです.
csrfが対策されているのに419エラーが出る

フォームに@csrfはついているので、419エラーが出る意味がわからない。
<img width="429" alt="スクリーンショット 2020-05-22 16.14.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127226/ae296016-2202-56cd-5b51-3fe0923e26d2.png">

そういえば、少し前に.envに'SESSION_SECURE_COOKIE=true'を入れた気がしたので、
`SESSION_SECURE_COOKIE=false`
に変更して試したところ419エラーが出ないことがわかった

https://buffturn.net/archives/17889

上記記事によると
SESSION_SECURE_COOKIEは、CookieをSecureにするもので、開発環境がSSL化対応していない場合（HTTPの場合）、Cookieを扱うことができない

以下のように`secure`がついている場合は、Secureになったcookieなので注意（セッションIDは適当）

```
Set-Cookie: laravel_session=xxxx ... xxxx; expires=Fri, 22-May-2020 11:28:05 GMT; Max-Age=7200; path=/; secure; httponly
```

入れたものを忘れてしまい結構な時間を取られてしまう愚かなミス
サッカーチームの監督名のリストをpythonでスクレイピングする

#概要
[Jリーグの監督一覧のページ](https://data.j-league.or.jp/SFIX06/)から監督の名前一覧を取得する方法を説明します。
上記のページでは読みに関してはアルファベットの表記しか載っていませんが、名前の読み方や姓、名も同時に取得したかったので、それらについては後で目視で修正することを前提に、自動で変換します。
その方法についても合わせて説明します。
#注意
スクレイピングは法律的な問題に抵触する可能性がある行為ですので、利用については各自の判断／責任でお願いします。（参考：[スクレイピングは違法？3つの法律問題と対応策を弁護士が5分で解説](https://topcourt-law.com/internet_security/scraping-illegal)）

#環境
Google Colaboratory (2020年4月3日）

#コード
Pythonの`requests`で取得したソースファイルを`BeatifulSoup`で解析して取得します。
インデックスページから各頭文字の監督リストページのURLを一括取得し、各URLのアクセス先から、具体的な名前とアルファベット表記を抽出しています。

```Python
!pip install romkan#GoogleColaboratoryで動かすときは必要

from bs4 import BeautifulSoup
import requests
import time
import romkan

#Jリーグページのurl
base_url = "https://data.j-league.or.jp/"
index_page_id = "SFIX06/"

#htmlソースの取得とパース
html_text = requests.get(base_url+index_page_id).text
soup = BeautifulSoup(html_text,"lxml")

#ソースコードを見ながら情報を抽出するコードを考えて書く
#id=player-indexの要素内のthタグ要素をリストで取得する
link_elems = soup.find(id='player-index').find_all('th')

#名前、アルファベット表記を格納するリストを宣言
directors = []
for link_elem in link_elems:
  atag = link_elem.find('a')
  if atag != None:
    #特定の頭文字で始まる監督一覧ページへのリンク
    link = atag.get('href')
    html_text2 = requests.get(base_url+link).text
    soup2 = BeautifulSoup(html_text2,"lxml")
    #id=eventViewのtr要素に選手名が入っている
    footballers = soup2.find(id='eventView').find_all('tr')
    for footballer in footballers:
      atag2 = footballer.find('a')
      if atag2 == None: continue
      name = atag2.string
      #名前を表示している要素の次の兄弟要素がアルファベット表記
      alpha = atag2.find_parent().find_next_sibling().string
      #リストに追加
      directors.append([name,alpha])
      #進捗確認のための出力
      print(name,alpha)
    #サーバに負荷を与えないように1秒待機する
    time.sleep(1)

katakana = "・ ーァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴ"
def is_kata(text):
  return all([v in katakana for v in text.replace(' ','')])#スペースはあってもよい

directors_yomi = []
for v in directors:
  name, alpha = v[0], v[1]
  name_f = name.replace('\u3000',' ').replace(' ',' ').replace('・',' ')
  if is_kata(name_f):
    fullname = name_f
    if '\u3000' in name:
      first = name.split('\u3000')[0]
      last = name.split('\u3000')[1]
    #elif '　' in name 
    else:
      first = ''
      last = fullname
  else:
    fullname = romkan.to_katakana(alpha)
    if ' ' in fullname:
      first = fullname.split(' ')[0]
      last = fullname.split(' ')[1]
      fullname = last+' '+ first
    else:
      first = ''
      last = fullname
  if is_kata(fullname) == False:
    name = "#####"+name
  directors_yomi.append([name,alpha,fullname,last,first])
print('\n'.join(['\t'.join(v) for v in directors_yomi]))
```
PostgreSQL7.4での項目長変更クエリ

今更Postgre7です。ALTER TABLEのTYPE指定が存在せずダメでした。オーノー。
しかしpgAdminでは長さの変更を受け付ける。望みはある。できるできる絶対できる。やれる、気持ちの問題だ。

pgAdminはpg_attributeのatttypmodを変更クエリを吐いていた。
自前でここを書き換えるとpostgresさんも枠の大きさが変わったのを認識しました。

##### atttypmodの指定について
33を指定するとcharacter varying(29)になる。
4を引いた数で良いのかは不明だ。4以下の数は試していない。

##### テーブルとフィールドを指定しての参考更新クエリ
character varying(atttypid=1043)の場合。
>update pg_attribute
set atttypmod=33
from pg_stat_all_tables tbls
where tbls.relid = pg_attribute.attrelid
and tbls.relname='target_table'
and pg_attribute.attname='target_field'
and pg_attribute.atttypid=1043
and pg_attribute.atttypmod=32;
Sharepoint DesignerにてSharepoin Onlineに接続した際の403 FORBIDDENエラーへの対応方法について


## 概要

SharePoint Designerを、下記のエラーが表示がされたのですが、後述のリンク記事を参考に"Microsoft SharePoint Designer 2013 (KB2817441) 32 ビット版 Service Pack 1"を適応したところ解決したことを共有します。



>403 FORBIDDEN403 FORBIDDEN403 FORBIDDEN403 FORBIDDEN403 FORBIDDEN

![image-20200522173125115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/81598934-e39a-4bca-e7b9-3c75cbc7096c.png)






Microsoft 365の"ツールおよびアドイン"からインストールした場合、同様のエラーになってしまうため注意が必要です。



Microsoft 365の"ツールおよびアドイン"からインストールした場合、同様のエラーになってしまうため注意が必要です。

![image-20200522174648142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e30ad89d-ca58-6d39-5780-18581bc7d76b.png)





## 手順

1.  [リンク](https://www.microsoft.com/ja-jp/download/details.aspx?id=42015)から、"Microsoft SharePoint Designer 2013 (KB2817441) 32 ビット版 Service Pack 1"をダウンロードし、既存のSharePoint Designerを更新

![image-20200522173351772.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e1f423fd-d7da-d49e-57d1-6bb0e829faff.png)






2.  SharePointのサイトに接続したことを確認。

![image-20200522174049060.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/0c562abc-3d42-a4b7-e40b-6326781c8487.png)




## 参考リンク

-   [SharePoint Designerの開く権限がありませんエラーについて](http://sptakesato.blog.fc2.com/blog-entry-15.html)
音声ファイルをスクレイピングで一括ダウンロードする【Python】【urllib】

#概要
[こちらのページ](http://games255.512.jp/pokewav_DL/index.html)からポケモンの鳴き声のwavファイルをプログラミングでダウンロード（スクレイピング）するコードの紹介です。音声ファイルのダウンロードに`urllib.request.urlretrieve`という関数を使うのがポイントです。

スクレイピングはマナー、法律を守って自己責任で実行してください。
#環境
macOS Catalina 10.15.4
python 3.8.0
#ライブラリのインストール

```
pip install beautifulsoup4
pip install requests
pip install urllib
```

#コード

```Python
from bs4 import BeautifulSoup
import requests
import urllib
import time

base_url = 'http://games255.512.jp/'
index_page_url = base_url+'pokewav_DL/index.html'
html_text = requests.get(index_page_url).content #文字化け対策に.textではなく.contentを使う
soup = BeautifulSoup(html_text,"html.parser")

a_tags = soup.find_all('a')
for a in a_tags:
    path = a.get('href')
    if 'pokewav' not in path: continue
    abs_path = base_url + '/'.join(path.split('/')[1:])
    wav_file_name = a.text.replace(':','_')+'.wav'
    urllib.request.urlretrieve(abs_path,wav_file_name)
    print(wav_file_name,'is downloaded')
    time.sleep(1)
```
競プロのライブラリ整理~modint~

modintのライブラリを作成しました。
このライブラリの作成では、[noshi91さんのブログ](https://noshi91.hatenablog.com/entry/2019/03/31/174006)と[けんちょんさんの記事](https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a#3-%E5%89%B2%E3%82%8A%E7%AE%97-a--b)を参考にさせていただきました。


また、使用する際には[こちらのテンプレート](https://qiita.com/DaikiSuyama/items/9dba963ba74396b9b7fd)と一緒にお使いください。

#friend関数について

本来valはpublicにするべきではないですが、競プロをする際の利便性のためにpublicにしています。もし、privateやprotectedにしたいかつクラス外からアクセスしたい場合はfriend関数を用いることでアクセス可能になります。

#入力でmodが与えられる場合
対応していません。


#C++のコード

```c++:modint.cc
template<ll mod> class modint{
public:
    ll val=0;
    //コンストラクタ
    modint(ll x=0){while(x<0)x+=mod;val=x%mod;}
    //コピーコンストラクタ
    modint(const modint &r){val=r.val;}
    //算術演算子
    modint operator -(){return modint(-val);} //単項
    modint operator +(const modint &r){return modint(*this)+=r;}
    modint operator -(const modint &r){return modint(*this)-=r;}
    modint operator *(const modint &r){return modint(*this)*=r;}
    modint operator /(const modint &r){return modint(*this)/=r;}
    //代入演算子
    modint &operator +=(const modint &r){
        val+=r.val;
        if(val>=mod)val-=mod;
        return *this;
    }
    modint &operator -=(const modint &r){
        if(val<r.val)val+=mod;
        val-=r.val;
        return *this;
    }
    modint &operator *=(const modint &r){
        val=val*r.val%mod;
        return *this;
    }
    modint &operator /=(const modint &r){
        ll a=r.val,b=mod,u=1,v=0;
        while(b){
            ll t=a/b;
            a-=t*b;swap(a,b);
            u-=t*v;swap(u,v);
        }
        val=val*u%mod;
        if(val<0)val+=mod;
        return *this;
    }
    //等価比較演算子
    bool operator ==(const modint& r){return this->val==r.val;}
    bool operator <(const modint& r){return this->val<r.val;}
    bool operator !=(const modint& r){return this->val!=r.val;}
};

using mint = modint<MOD>;

//入出力ストリーム
istream &operator >>(istream &is,mint& x){//xにconst付けない
    ll t;is >> t;
    x=t;
    return (is);
}
ostream &operator <<(ostream &os,const mint& x){
    return os<<x.val;
}

//累乗
mint modpow(const mint &a,ll n){
    if(n==0)return 1;
    mint t=modpow(a,n/2);
    t=t*t;
    if(n&1)t=t*a;
    return t;
}

//二項係数
vector<mint> fac,finv,inv;

//二項係数の前計算
//n:=二項係数xCyを求める時の最大のx
void COMinit(ll n) {
    fac.resize(n+1);
    finv.resize(n+1);
    inv.resize(n+1);
    fac[0]=fac[1]=1;
    finv[0]=finv[1]=1;
    inv[1]=1;
    FOR(i,2,n){
        fac[i]=fac[i-1]*mint(i);
        inv[i]=-inv[MOD%i]*mint(MOD/i);
        finv[i]=finv[i-1]*inv[i];
    }
}

//二項係数の演算
mint COM(ll n,ll k){
    if(n<k)return 0;
    if(n<0 || k<0)return 0;
    return fac[n]*finv[k]*finv[n-k];
}
```
Artilleryを使い入力値を変えて負荷テストする方法

## 概要
Artilleryという負荷ツールを使って、シーケンシャルな入力値をPostする負荷テストを実現する設定を説明する

## Artilleryとは
簡易的な負荷テストはApache benchが有名だが、ちょっと複雑なテストするツールとして[artillery](https://artillery.io/)が便利だ。古くからあるjMaterよりも軽量でモダンな感じもする。


## 動作環境

```sh
» artillery --version

        ___         __  _ ____                  _
  _____/   |  _____/ /_(_) / /__  _______  __  (_)___  _____
 /____/ /| | / ___/ __/ / / / _ \/ ___/ / / / / / __ \/____/
/____/ ___ |/ /  / /_/ / / /  __/ /  / /_/ / / / /_/ /____/
    /_/  |_/_/   \__/_/_/_/\___/_/   \__, (_)_/\____/
                                    /____/

------------ Version Info ------------
Artillery: 1.6.0
Artillery Pro: not installed (https://artillery.io/pro)
Node.js: v13.7.0
OS: darwin/x64
--------------------------------------
```

### 入力データ用のCSV
入力値を定義したCSVファイをを用意する
この例では、連続的なIDと日付の文字列をそれぞれid, dateとした

```keywords.csv
id,date
1,2020/1/1
2,2020/1/2
3,2020/1/3
4,2020/1/4
5,2020/1/5
6,2020/1/6
7,2020/1/7
8,2020/1/8
9,2020/1/9
10,2020/1/10
11,2020/1/11
```

### 負荷テスト定義ファイル

```script.yml
config:
    target: "https://テスト先のURL"
    phases:
      - duration: 5
        arrivalRate: 2
    # CSVを読み込ませる場合はpayload要素を追加する 
    payload:
      # 対処のファイルと読み込むフィールドの定義
      path: "keywords.csv"
      fields:
        - "id"
        - "date"
      # csvの頭から順番に実行したい場合はシーケンシャルを指定する 
      order: sequence
      # csvの1行目を無視する
      skipHeader: true
scenarios:
    - name: "シナリオ名"
      flow:
        - post:
            url: "/"
            # Postする際にパラメタを{{xxx}}で定義する
            json:
                id: "{{id}}"
                date: "{{date}}"
```

## テストの実行

artilleryのパスが通っている場合はこのようにrunとテスト定義ファイルを引数につけてやる

```sh
artillery run script.yml
```

結果の例

```sh
All virtual users finished
Summary report @ 17:31:08(+0900) 2020-05-22
  Scenarios launched:  10
  Scenarios completed: 10
  Requests completed:  10
  Mean response/sec: 1.67
  Response time (msec):
    min: 994.1
    max: 2057.4
    median: 1074.3
    p95: 2057.4
    p99: 2057.4
  Scenario counts:
    Search and buy: 10 (100%)
  Codes:
    200: 10
```
wsl2でwhileループに.exeのコマンドを含めると表示が崩れる問題の解決策


# 問題
wsl2のwhileループの中でWindowsのコマンド(`.exe`)を実行すると表示が崩れる。

```
$ seq 10 | while read i; do ipconfig.exe &>/dev/null; echo $i; done
1
```

期待した結果が得られない。
`ipconfig.exe`以外の`.exe`のコマンドでも同様。
wsl1ではこの問題は発生しない。

# 原因
(恐らく)`.exe`が標準入力を拾っている。

# 解決策
`.exe` に`</dev/null`を付ける。

```
ipconfig.exe </dev/null
```

```
$ seq 10 | while read i; do ipconfig.exe </dev/null &>/dev/null; echo $i; done
1
2
3
4
5
6
7
8
9
10
```
[PHP] ereg() から preg_match() への変更でチョットした留意点

PHP7ではereg()が廃止となりpreg_match()を利用することになりました。
古いコードの書き換えをされている方もいると思います。

ereg()をpreg_match()に変更し
マッチングパターンをPOSIXからPCREに書き換えると各所で紹介されていますね。

ちょっと見落としがちかなと思うのは戻り値の違いです。
自分は望む結果が得られずに？となりましたので記事に残しておきます。

ereg()もpreg_match()もint型の戻り値を返しますが

```
ereg()
 マッチした場合にはマッチした文字列の長さを返し、
 マッチしなかった場合 またはエラーとなった場合は FALSE を返します。
````

````
preg_match()
 マッチした場合に 1 を返します。 マッチしなかった場合は 0、エラーが発生した場合は FALSE を返します。
````

という違いがあります。
マッチング結果を使用して何か処理を行う場合、結果に違いが生じるかもしれません。


````
<?php
$string = 'ab123cdefg@abcd678efg@a456bcdeg';        // 評価文字列
$pattern = '([a-z]+@)';                             // @とその前のアルファベット(不定長)を検出
while($Ret = ereg($pattern, $string, $matches)){    // $Ret マッチした文字列の長さ
    $pos = strpos($string, $matches[0]);            // $pos マッチした文字列が最初に現れた場所
    $string = substr($string, $pos + $Ret);         // $pos + $Ret を切り捨て評価文字列を再作成
    $result[] = $string;
}
var_dump($result);
?>

-- 結果 ------------------------------------------
array (size=2)
  0 => string 'abcd678efg@a456bcdeg' (length=20)
  1 => string 'a456bcdeg' (length=9)
````

このようなコードのereg()をpreg_match()に置き換えるだけだと

````
<?php
$string = 'ab123cdefg@abcd678efg@a456bcdeg';
$pattern = '/([a-z]+@)/';                                // PCREパターンに書き換え
while($Ret = preg_match($pattern, $string, $matches)){   // preg_match に変更、$Retに真偽値 1 が入る
    $pos = strpos($string, $matches[0]);
    $string = substr($string, $pos + $Ret);　　　　　     // $Retが真偽値の為 $pos + 1 しか切り捨てない
    $result[] = $string;
}
var_dump($result);
?>

-- 結果 ------------------------------------------------
array (size=8)
  0 => string 'defg@abcd678efg@a456bcdeg' (length=25)
  1 => string 'efg@abcd678efg@a456bcdeg' (length=24)
  2 => string 'fg@abcd678efg@a456bcdeg' (length=23)
  3 => string 'g@abcd678efg@a456bcdeg' (length=22)
  4 => string '@abcd678efg@a456bcdeg' (length=21)
  5 => string 'fg@a456bcdeg' (length=12)
  6 => string 'g@a456bcdeg' (length=11)
  7 => string '@a456bcdeg' (length=10)
````

という具合に結果が変わってしまいます。
マッチした文字列長を後で取得することにします。

````
<?php
$string = 'ab123cdefg@abcd678efg@a456bcdeg';
$pattern = '/([a-z]+@)/';
while(preg_match($pattern, $string, $matches)){   // 戻り値は格納しない
    $pos = strpos($string, $matches[0]);
    $pos += strlen($matches[0]);                  // strlenでマッチした文字列長を取得
    $string = substr($string, $pos);
    $result[] = $string;
}
var_dump($result);
?>

-- 結果 -------------------------------------------
array (size=2)
  0 => string 'abcd678efg@a456bcdeg' (length=20)
  1 => string 'a456bcdeg' (length=9)
````

これで変更前と同じ結果が得られました。
Laravelでなぜか二回アクセスしてしまう問題

Laravel 5.8

Flash Sessionに値を持たせてリダイレクトしようとしたが、なぜかFlash Sesionが消えてしまっていた。デバッグすると二回アクセスしている模様（リダイレクトだけでなく、他のページも二回アクセスしていることが判明）

自身でカスタマイズしたMiddlewareが悪さをしていた。

```php5:middleware.php
$next($request);
```

を実施している箇所が一つのミドルウェアで複数ある場合に発生する。
例えば、フレームワークのミドルウェアのhandleメソッドをオーバーライドして親クラスに渡す場合と独自で処理をするなどの分岐をする際は、下記のようにして二回リクエストを飛ばさないようにしてあげましょう。
私の場合はparent::handleにreturnをつけ忘れていた。

```php5:middleware.php
     public function handle($request, Closure $next)
      {
          if (/*何かしらの分岐*/) {  
              return parent::handle($request, $next);
          }  
          return $next($request);
      }
```

参考
https://stackoverflow.com/questions/59377912/laravel-why-every-route-is-executed-twice
Firebase: Cloud Function の Trigger にてconfigではなくprocess.envの環境変数を設定する

### tl;dr

- `firebase deploy`コマンドを使いたいなら、config 機能に環境変数の情報を詰め込んで、CloudFunction の関数内で環境変数への set をする。
- gcloud コマンドを使うなら、option に渡せば OK なだけぽい（実機確認してない）

### 前提：注意点

- 基本的には必要ない限りは環境変数を使わないで、firebase の config 機能を使ってください。
- 3rd party 製のライブラリなどが、環境変数しか見に行かないケースなどのときはこの記事の方法を参考にすると良いかと思います。

### 説明

`firebase deploy`コマンドでは、CloudFunction 上の環境設定を渡してあげることが出来ないようです。その代わり、環境設定に関する情報は config 系の機能で設定させる方針みたいだからです。

- [Firebase における環境変数の設定方法 - Qiita](https://qiita.com/nerdyboy_cool/items/695c8af7ca8d22761927)

一応、`gcloud`コマンドを見る限りだと、option 指定すればこれで環境変数を指定してデプロイすることもできるようですが、できる限り firebase から抜けたくないです。

- [環境変数の使用 | Google Cloud Functions に関するドキュメント](https://cloud.google.com/functions/docs/env-var?hl=ja)

なので、「デプロイ時に Firebase の config 機能で環境変数にセットしたい情報を渡して、プログラム上で無理やり環境変数にセットする」という流れで実現できます。

### コード

デプロイコマンド

```zsh
$ firebase functions:config:set api.key=abcdefg && \
  firebase deploy --only functions
```

実際のコード例

```ts
import * as functions from "firebase-functions";

const bootstrap = () => {
  process.env["API_KEY"] =
    proccess.env["API_KEY"] || functions.config().api?.key;
};

const onCreateSomething = () => {
  // ...
  bootstrap();
  // ...
};
```

ちなみに、予約後となっている env への上書きは基本的に禁止されているので注意です。上書きすると、CloudFunction 自体が正常に動作しない、または実行されないなどの可能性があります。

- [Using Environment Variables | Cloud Functions Documentation](https://cloud.google.com/functions/docs/env-var#environment_variables_set_automatically)

### 参考：デプロイするときのコマンド例

デプロイするときのコマンドは下記のissueにいろいろな方法を書かれてるので、良さそうなのをピックアップするのが良いかと。

- [Accept JSON file for functions:config:set · Issue #406 · firebase/firebase-tools · GitHub](https://github.com/firebase/firebase-tools/issues/406)

### REF

- [Firebase functions に環境変数を設定してみる - google-cloud-jp - Medium](https://medium.com/google-cloud-jp/firebase-functions-%E3%81%AB%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B-50ce701b2f3f)
Python で環境変数を取得するときは os.getenv を使おう

今まで Python で環境変数を取得するときと言えば、こうしていた。

``` python
import os

dsn = os.environ.get('DATABASE_URL')
```

しかし最近になって、 `os.getenv` という方法があることを知った。

参考： [Pythonのos.getenvとos.environ.getの違い - Qiita](https://qiita.com/1ntegrale9/items/94ec4437f763aa623965)

`os.getenv` は `os.environ.get` と等価なので、上のコードは以下のように書き換えられる。

``` python
from os import getenv

dsn = getenv('DATABASE_URL')
```

公式としてはどちらかが推奨というわけではないらしいが、個人的には `os.getenv` の方が「**なんのために os を import するのかが明確**」という理由で良いと思う。

os モジュールは用途がいくつかあるため `import os` とだけ書いてあっても「これ何のためにいるんだっけ」というのがパッとわかりづらいが、 `from os import getenv` であれば「環境変数のために import しているのだな」とすぐわかって良い。

※ `from os import environ` してもいいが、 callable じゃないオブジェクトを import するのは気持ち悪い (気持ちの問題なのでこのあたりは気にしなければ別に良いのかもしれない)
Visual Studio Code & WSLでpython環境作ってみる

# 動機
今まで直でWSLからpythonコードを実行してきたけど、window上でコード書く、ubuntuで実行っていうのがめんどくさくなってきたので（あと、vimが使えない人なので、、、）、vscodeで一本化してみた。
# 前提環境
- windows 10 home
- WSLはubuntu18.04.4 LTS (Bionic Beaver)
- ubuntu上にはanacondaインストール済み

# 拡張機能
とりあえず、pythonの拡張機能を入れてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638341/24ef44c8-a08f-2061-b1d7-12ab23f86a86.png)
インストールしたら再起動ボタンも押しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638341/6040fae0-3f3f-c12c-5c5f-304a4c6eec3f.png)
こんな警告が。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638341/fea08ab6-f018-cc78-f4e1-211d39eb5bd2.png)
anacondaの中のpythonを選択しておくと、警告が消えて実行できた。

# Jupyter Notebokも試してみる
特に設定せずに、コマンドパレットで、

```
Python: Create Blank New Jupyter Notebook
```
で簡単にできた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638341/792e3afb-73bd-9a44-eb6d-f00c31b094d4.png)

# 補足
WSL2がすでに出ているけど、まだ様子見。
# 参考
[VS CodeでPythonするために必要なこと](https://www.atmarkit.co.jp/ait/articles/1805/22/news043.html)
[Visual Studio CodeでJupyter Notebookを動かしてみた](https://dev.classmethod.jp/articles/visual-studio-code-jupyter-notebook/)
【弊社新人に向けて】isXXX系メソッドについて

# isXXX系メソッドって例えば？
`File`クラスの`isFile`や`isDirectory`メソッドなどがあります。
[Fileクラス公式ドキュメント](https://docs.oracle.com/javase/jp/8/docs/api/java/io/File.html)

# 特徴は？
シンプルに`boolean`を返します。
`boolean`とは`true`や`false`といった真偽値を表すデータ型です。
`if文`の分岐条件や`while文`の継続条件として用いることができます。

# isXXX系メソッドのコード例
例として`isBlank`メソッドを作成してみます。

```java:isBlank
// 指定された値が空文字かを判定する。
// 空文字であれば true。
// そうでなければ false を返す。
public boolean isBlank(String value) {
  if (value.isEmpty()) {
    return true;
  }

  return false;
}
```

# 使い方は？
先程作成した`isBlank`を例にコードを示します。

まず`if文`です。

```java:分岐条件として使用する
if (isBlank(value)) {
  // 文字が入力されていない場合の処理
  System.out.println("文字が入力されていません。");
} else {
  // 文字が入力されている場合の処理
  System.out.println("入力された文字は「" + value + "」です。");
}
```
`if(isBlank(value))`この様に記述することで、
「値が入力されていなければ」という意図を、読み手に対して明確に伝えることができます。


続いて`while文`です。
`!isBlank`とすることで`true`と`false`を反転させています。

```java:継続条件として使用する
while (!isBlank(value)) {
  // 文字が入力されている場合の処理
  System.out.println("入力された文字は「" + value + "」です。");
}
```
`while(!isBlank(value))`としています。
`if文`同様、「値が入力されていれば」という意図が明確です。

# value.isEmpty()でいいじゃん
間違いではありません。
しかし、時として`blank`の定義は変更されることがあります。
先程の`isBlank`は、単に空文字であるかどうかのみ判定しています。

もし、引数が`null`だったら？
`null`に対してメソッド呼び出しを行うと例外が発生してしまいます。

```java
// value の中身が null だと java.lang.NullPointerException が発生
value.isEmpty()
```

# null に対応する
空文字の判定処理をメソッド化しておくことで、`null`対応も容易に行うことができます。
では、実際に`isBlank`を`null`に対応させてみます。

```java:isBlank
// 指定された値が null または空文字かを判定する。
// null または空文字であれば true。
// そうでなければ false を返す。
public boolean isBlank(String value) {
  if(value == null) {
    return true;
  }

  if(value.isEmpty()) {
    return true;
  }

  return false;

  // 以下の様に書くことも出来ますが、新人向けということで。
  // return value == null || value.isEmpty();
}
```

`isBlank`に以下のロジックを追加しただけです。

```java:追加された行
  if(value == null) {
    return true;
  }
```
この様に、1箇所に修正を加えるだけで、`isBlank`を呼び出している箇所全てに変更を適用することができます。
コードを書き終え、いざテストをしようとした段階で`blank`には`null`も含まれるよ、なんて言われても問題ありません。

# まとめ
他の誰かが、明日の、1週間後の、1年後の自分がそのコードの面倒を見ることになるかもしれません。
こんな感じで処理をまとめてしまえば後々楽になります。
Python3でファイルの関連操作(Read, Write, Exists)

Python3のファイルの操作方法を紹介します。

## やりたいこと

- ファイルの書き込みと読み取り
- フォルダ内のファイル一覧
- ファイル名の変更
- ファイルが存在しているかの確認

## ファイルの書き込みと読み取り

`open`関数でファイルの書き込みと読み取りを実現できます。

```
open("file_name", "mode")
```
上記の記述で、ファイルにアクセスします。

`mode`の部分、

'**r**' : read。閲覧モード。
'**w**' : write。編集モード。
'**a**' : append。ファイルの末尾に内容を追加するモード。
'**r+**' : read ＋ write。閲覧と編集モード。

### Write
```
file = open('/path_to_file/file_name', 'r')

file.write("新規のファイルです。")
file.write("新しい内容を追加します。")
file.write("ここは三行目です。")

file.close()
```

`with`を利用する場合、処理終了後に自動的にファイルを閉じるので、手動でclose()の必要はなくなります。

```
with open('/path_to_file/file_name', 'w') as file:
    file.write("新規のファイルです。")
    file.write("新しい内容を追加します。")
    file.write("ここは三行目です。")
```

### Read

```
file = open('/path_to_file/file_name', 'r')

# ファイルの内容を出力する
print(file.read())

# ファイルの5番目文字までの内容を出力する
print(file.read(5))

# ファイルの1行目までの内容を出力する
print(file.readline())

# ファイルの1行目の3番目文字まで内容を出力する
print(file.readline(3))

# ファイルの一行ずつの内容を配列で出力する
print(file.readlines())
# > ['新規のファイルです。', '新しい内容を追加します。', 'ここは三行目です。']
```

## ファイル一覧
`os`や`glob`のモジュールを使えば、ファイル一覧の取得はできます。

### osモジュール
```
import os

list = os.listdir("path")
print(list)
```

### globモジュール
```
import glob

files = glob.glob('path/*.txt')
print(files)
```
glob では、ファイルの形式の指定はできます。

## ファイル名の変更
`os`モジュールでファイル名の変更はできます。

```
import os

# os.rename('/path/original_file_name.type', '/path/new_file_name.type')
os.rename('/tmp/user.txt', '/tmp/customer.txt')
```

## ファイルが存在しているかの確認
`open`関数や`os`モジュール、どちらでも確認できます。

### open関数
```
try:
    with open('file_name') as f:
        print(f.readlines())
except IOError
    print("ファイルにアクセスできません")
```

### osモジュール
os.pathでパスが存在しているか、ファイルか、フォルダーかの確認ができます。

- **os.path.exists(path)** : true/falseの結果を返す
- **os.path.isfile(path)** : true/falseの結果を返す
- **os.path.isdir(path)** : true/falseの結果を返す

```
import os

os.path.exist('/path/of/file')
```

ファイル関連の紹介は以上です。
[Firebase]アプリをアンインストールしてもFirebase AuthのcurrentUserがnullにならない問題

アプリをアンインストールしてもFirebase AuthのgetCurrentUser()の戻り値がnullにならなくて困ったので解決方法をここに記録します。

#解決した方法
調べたところ、この問題はandroidの自動バックアップ機能によるものらしいです。
マニフェストからこの機能のオフにしたら解決しました。
具体的には、manifest.xmlに以下のコードを追加しました。

```xml:manifest.xml
 <application
  android:allowBackup="false"
  android:fullBackupContent="false"
  ...
```
#参考
- [firebase-auth-signout-not-working-on-uninstall](https://stackoverflow.com/questions/50259911/firebase-auth-signout-not-working-on-uninstall?noredirect=1&lq=1)
- [自動バックアップでユーザーデータをバックアップする](https://developer.android.com/guide/topics/data/autobackup#ImplementingBackupAgent)