OmniAICreator/Qiita-1.07M huggingface dataset:
#Slack で #Github Pull Reminder や DM通知をサイドバーの上に固定して気づきやすくするには Start をつけるだけで OK ( Slack 通知管理はプログラマ必須の課題である )

DMにも星って付けられたんですね

![image](https://user-images.githubusercontent.com/13635059/69385559-19f87e00-0d03-11ea-89d9-458df52b6fc1.png)


![image](https://user-images.githubusercontent.com/13635059/69385563-1bc24180-0d03-11ea-8251-ef60858d52d4.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2751








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
/etc/fstabについて

##fstabとは？
###ファイルシステム情報が記載されているところ
もっと詳しく言うとディスクなどマウントした時、このファイルが参照されます。
なので、ディスクをマウントした後、自動起動するような設定をしたいときはfstabの設定をします。

##設定するには？
###viコマンドの利用

```
# vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Mon Jan 28 15:24:25 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX    /               xfs     defaults        0 0
　※数字の部分はXと表示しています
```
AWSでは上記のように表示されました。
デフォルトでは何も設定されていない状況です。

###fstabの見方
例として書いてみます。

```
# cat /etc/fstab
/dev/sda1               /                   xfs    defaults        1 1
/dev/sdb               /boot              xfs    defaults        1 2
```
1行目：デバイス名
2行目：マウントポイント
3行目：ファイルシステム
4行目：マウントポイント時のオプション
5行目：ファイルシステムをダンプする必要があるかないかの指定

今回はcdromにディスクをマウントした後、自動起動させたかったので、下記のように表記しました。

```
# cat /etc/fstab
/dev/cdrom              /mnt/cdrom      iso9660       defaults       0 0
```
設定後、再起動して反映を確かめてください。


##引用

Linux初心者の基礎知識
>http://linux-beginner.com/linux_kihon64.html

Linux Master.JP
>https://www.linuxmaster.jp/linux_skill/2013/06/etcfstab.html

以上がfstabについてです。
最後までお読みいただきありがとうございました！
Rails チュートリアル 第2章 Destroy できない (IE11)

# はじめに
「Rails チュートリアル 2.2.1 ユーザーページを探索する」でハマったので情報共有します。
https://railstutorial.jp/chapters/toy_app?version=5.1#sec-a_user_tour

# 状況
`rails new toy_app` して，scaffold でユーザーリソースを作っただけなのに，ユーザーを削除しようと[Destory]リンクをクリックしてもユーザーが削除されないことがあります。

チュートリアルには，次のように書いてあります。
> 図 2.10の [Destroy] リンクをクリックするとユーザーが削除され、indexページのユーザーは1人だけになります (もしこのとおりにならない場合は、ブラウザのJavaScriptが有効になっているかどうかを確認してください。Railsでは、ユーザーを削除するリクエストを発行するときにJavaScriptを使っています)。

GoogleChrome では削除できました。
Firefox でも削除できました。
削除しようとすると「Are you sure?」ってポップアップが出ます。

でも IE11 では削除できませんでした。
ポップアップが出てこないんです。

JavaScript が有効じゃないのかな？でも，セキュリティ設定を見ても有効になっているはず。「信頼済みサイト」に登録してもポップアップが出てこない。
「ポップアップ ブロックを有効にする」のチェックも入っていない。
なぜ？

ふと，「F12 開発者ツール」を起動して[Destroy]リンクをクリックしてみました。
すると，次のメッセージが。
> [イントラネット サイトを互換表示で表示する] がオンであるため、互換表示で実行中です。

# 解決策
「互換表示設定」で，「イントラネット サイトを互換表示で表示する」のチェックを外すと，IE11 でも削除できるようになります。
チュートリアル通りに進まなくて困っている方がいらっしゃったら，確認してみて下さい。
Python click tips

# はじめに

Pythonモジュールに[click](https://click.palletsprojects.com)というモジュールがある。
[こちら](https://blog.amedama.jp/entry/2015/10/14/232045)で分かりやすく解説されているので主要な使い方は公式ドキュメントや前述を参照すれば良いがちょっとした事をしたいときのTipsが無いので追記のようなイメージでメモを残すことにする。

## callbackを利用する際の注意点

clickには受け取った値に対し、callback処理することができる。
ただし、callback　validationをかけた後にその値を使う場合、
callbackで微妙にハマりどころがあるので記録しておく

ちなみに公式ドキュメントは[こちら](https://click.palletsprojects.com/en/8.0.x/options/#callbacks-and-eager-options)

例えばこんなコードを書いて、addrオプションが ipaddress 表記になっているかチェックする場合
した上で値を返すようなコードを書く場合はちゃんと returnで返してやらないと def cmd の方に
addr argumentが来ないので注意が必要。


```python
import click
import ipaddress

def validate_ipaddress(ctx, param, value):
    try:
        addr = ipaddress.ip_address(value)
    except ValueError:
        msg = f"addr must be ip address format as 'x.x.x.x'"
        raise click.BadParameter(msg)
    return str(addr)

@click.command()
@click.option('--addr', required=False,
              type=str, callback=validate_ipaddress,
              help='address')
def cmd(addr):
    set_loglevel(debug)
```

## clickのオプションを使い回す

いくつかプログラムを作る必要があり、共通のオプションを使いたい場合は
適当に関数などを定義して呼び出したいと思う。そんなときはこんな風にする。

- command_opt.py

```python
import functools
import click

def mode_options(func):
    @click.option('-t', '--interval', required=True, type=int, default=5,
                  help="run program every N minutes. (default: 5min)")
    @click.option('--silent/--no-silent',
                  help='Silent mode - print result or not.(default: False)')
    @click.option('--multithread/--no-multithread', help='Multithread mode (default: False)')
    @click.option('--debug/--no-debug', help='Debug mode (default: False)')
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)
    return wrapper
```

- click_program.py

```python
import click
import time
import schedule
from command_optimport inventories_options, mode_options

@click.command()
@inventories_options
@mode_options
def cli(hostname, ip, os, interval, silent, multithread, debug):
    try:
        app = Runner(hostname, ip, os, silent, multithread, debug)

        if interval == 0:
            app.run()
        else:
            schedule.every(interval).minutes.do(app.run)
            while True:
                schedule.run_pending()
                time.sleep(1)
    except Exception as e:
        msg: str = "Cannot run program: %s" % str(e)
        print(msg)
        sys.exit(1)


def main():
    cli()
    sys.exit(0)


if __name__ == "__main__":
    main()


```


## bash補完ができるようになるおまじない

基本的には[こちら](https://click.palletsprojects.com/en/7.x/bashcomplete/)
ただし、.pyのままだと実行できないのでpyinstallerを使ってバイナリ化するか
setuptoolを書くなどして、”インストール”してしまうこと。
となりのAWS

# マイグレーション

### となりのCloudEndure

エキサイトさんでオンプレからAWSにマイグレ[事例](https://exdev.exblog.jp/30862809/)

ニフティさんでクラウドからAWSマイグレ[事例](https://pages.awscloud.com/rs/112-TZM-766/images/H2-07.pdf)

# マーケティング/モバイル

### となりのPinpoint

ニフティさんのPinpointでユーザーにプッシュ通知[事例](https://blog.web.nifty.com/engineer/3059)

# サーバーレス

### となりのStepFunctions

Fringe81さんでサーバーレスなジョブフロー[事例](https://pages.awscloud.com/rs/112-TZM-766/images/C-3.pdf)

# 分析

### となりのQuickSight

エキサイトさんでのQuickSightでビジネスKPI可視化[事例](https://blog.excite.co.jp/exdev/30965350/)

AccessさんでのQS
https://www.access-company.com/news_event/archives/2020/0525-2/

# CI/CD

### 金融でのCI/CDの例

NRIさんでの金融サービスでのCI/CDの例[事例](https://speakerdeck.com/iselegant/cdwozhui-iqiu-metaohua)

# セキュリティ

### となりのアカウント管理

Finatextさんでのセキュリティのガードレールという考え方[事例](https://medium.com/finatext/finatext-aws-guardrail-2705cd1e3679)

# 運用

### となりの負荷テスト

負荷テストと改善フェーズ期間を必ず確保する
アカツキさんの、ロマサガの負荷テスト(ECS)の知見[事例動画](https://www.youtube.com/watch?v=SdtbNYP8UH4&feature=youtu.be)
[事例スライド](https://pages.awscloud.com/rs/112-TZM-766/images/I3-04.pdf)

# ハンズオン

### データレイク

Athena, Glue, Redshift, Kinesiss, QuickSightなど一通り使ってデータレイクを構築する

https://github.com/aws-samples/amazon-s3-datalake-handson/blob/master/JP/README.md
初心者がざっくり理解するためのソケット通信まとめ

勉強メモを整理します。

# ソケットとは
プログラムの世界とTCP/IPの世界を結ぶ出入口
→ プログラムとネットワークをつなげる接続口

##### ■ TCP/IP
通信プロトコル（通信時のルール）のこと
TCP：安全性重視[^1]、スピードは速くない
Transmission Control Protocol
IP：インターネット用プロトコル

#### ☆ HTTP通信もソケット通信を行っている
HTTP：TCPにルールを追加し、送受信のデータ形式やタイミングをWeb閲覧に最適化するよう定められたルール

→ ソケットはTCP/IPを利用するために必要な接続ポイント
（TCP/IP通信をソケット通信と呼ぶこともあるらしい）

# OSI参照モデルについて
Open System Interconnection
ISO（国際標準化機構：International Organization for Standardization）が策定した、コンピュータなどの通信機器の通信機能を、階層構造に分割したモデル
異なるベンダ（メーカー）間で相互に通信を行うための統一規格[^2]

第7層 アプリケーション層
第6層 プレゼンテーション層
第5層 セッション層
第4層 トランスポート層
第3層 ネットワーク層
第2層 データ層
第1層 物理層
※ この順で処理されていく

##### ■ カプセル化
規定に従ったデータを作るため、第7層 → 第1層の順に各層で送り主や宛先などの情報を梱包（処理）し、その処理した情報は**ヘッダ**としてデータの前に付加する

e.g. データが"<font color="red">0010</font>"だった場合
第7層処理後 → **1010**<font color="red">0010</font>
第6層処理後 → **0110**1010<font color="red">0010</font>
…のように元のデータの前（左側）に情報が付加されていく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430585/41f69122-0df8-5c4f-f176-8a9d98b9c8d2.png)

反対に、データ受信側にて下位層（数字が小さい層）から上位層にいくにつれて各層のヘッダを取り外していくことを**非カプセル化**という
→ 単に「データの読み取りは普通に左から右」という話

#### 以上を踏まえて
ソケット通信は**第4層・トランスポート層**にあたる（TCPがトランスポート層）
HTTP通信は**第7層・アプリケーション層**
→ ソケットはHTTPよりも下のレイヤを扱っている
また、ソケットを利用してアプリケーション層のHTTP通信などが行われている

# ソケット通信の利点
・HTTP通信のように重装備の通信（第7層・アプリケーション層）をしなくてよい
・TCP/UDP[^3]で動く第4層レベルのアプリケーションが開発可能

→ HTTPよりもコンパクトなデータ送信が可能

# おわりに
試験勉強とかで出てきたときになんとなく理解できればいいなくらいのまとめなので、間違い等ありましたらご教示願います。


# 参考
1. [知ったかぶりをしていたソケット通信の基礎を改めて学んでみる - Qiita](https://qiita.com/megadreams14/items/32a3eed4661e55419e1c)
2. [ソケット](http://research.nii.ac.jp/~ichiro/syspro98/socket.html)
3. [ソケット (socket)とは - 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word168.html)
4. [TCP/IPとは - 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1540.html)
5. [OSI参照モデルまとめ - Qiita](https://qiita.com/tatsuya4150/items/474b60beed0c04d5d999)
6. [OSI参照モデル - その1 - OSI reference model](https://www.infraexpert.com/study/networking3.html)
7. [OSI参照モデル その1](https://www.n-study.com/network/osi_1.htm)


[^1]: 送信内容が相手に届いたか確認しながらやり取りする
[^2]: OSI参照モデル策定前のネットワークは、ひとつのベンダの製品だけで構成されており、違う通信アーキテクチャを使っているコンピュータ（違うベンダのコンピュータ）同士では通信できなかった
[^3]: （User Datagram Protocol）TCPと比べてスピード重視なプロトコル。TCPのような確認処理がない
AndroidプロジェクトでGitHub Actionsのcacheを利用しようとしたが出来なかったメモ

# 追記 2020/1/7

GitHub Actionsのcacheのlimitが一気に2GBに増えた！！！すごい！！！
https://github.com/actions/cache/releases/tag/v1.1.0

# 概要
- GitHub Actionsでcacheが利用できるようになった。
    - https://qiita.com/ngmr_mo/items/0576bfcea8c4487a6b47
    - [Caching dependencies to speed up workflows](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/caching-dependencies-to-speed-up-workflows)
- cacheを利用するには[actions/cacheを使用する](https://github.com/actions/cache)

# Androidプロジェクトでどうcacheを利用するか？

- chache対象のディレクトリ/ファイルはなにか？
    - `.gradle`
- CircleCIの設定を参考にhashを計算してそれをkeyにする。

```yml
- name: cache gradle
  id: cache-gradle
  uses: actions/cache@v1
  with:
    path: ~/.gradle
    key: ${{ runner.os }}-${{ hashFiles('build.gradle') }}-${{ hashFiles('app/build.gradle') }}
```

## Cache sizeのLimit

- GitHub Actionsでの[cacheのLimitは400MB](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/caching-dependencies-to-speed-up-workflows#usage-limits-and-eviction-policy)である。
- `.gradle`をcacheしようとすると400MBを超えてしまい、cacheをsaveできなかった。

```bash
[warning]Cache size of ~602 MB (631067374 B) is over the 400MB limit, not saving cache.
```

# まとめ

- `.gradle`をそのままcacheしようとしたが出来なかった
- 現状cacheを利用するには、cache sizeのlimitが緩和されるか、cacheするファイル/ディレクトリを絞る必要があった

# 参考

- [言語ガイド：Android#設定例](https://circleci.com/docs/ja/2.0/language-android/#%E8%A8%AD%E5%AE%9A%E4%BE%8B)
パッケージシステムを意識した今時、Hello Worldを紹介してみたり

# Hello World!の次のステップHello Servant!
プログラミング学習を進める上の最初のステップ
「Hello World」
これは、今も昔も変わらずやりますよね？

でも、モダンなプログラミングというのは
パッケージ、、、パッケージ
とにかくパッケージ
パッケージシステムを制する者は
モダンプログラミングを制すると言っても過言ではありません。

ということで今回は、モダンプログラミング版「Hello World」ということで
「Hello Servant」という学習手法を提案したいと思います。


# 流行りのGo言語

まずは、普通にHello World

```go:main.go
package main

import (
	"fmt"
)

func main()  {
	fmt.Println("Hello World")
}
```

```
go run main.go
-> Hello World
```

それではパッケージシステム向け「Hello World」
「Hello Servant」をやってみます。
プロジェクトルートに「servant」というディレクトリを作って
まぁ「Hello World」と挨拶する「servant」ということなので
挨拶人という意味合いで
「Greeter」というパッケージを作ってみましょう。

```
mkdir -p servant/Greeter
touch servant/Greeter/Greeter.go
```

```go:servant/Greeter/Greeter.go
package Greeter

import (
	"fmt"
)

type Greeter struct {}


func Summon() *Greeter {
	return &Greeter{}
}

func (g *Greeter) ServeHello() {
	fmt.Println("Hello Servant!")
}
```

main.goも下記のように書き換えます。

```go:main.go
package main

import (
	"<go mod init時に付けたモジュール名>/servant/Greeter"
)

func main()  {
	//Greeterを召喚！！
	greeter := Greeter.Summon()
	//service実行！！
	greeter.ServeHello()
}
```

```
go run main.go
-> Hello Servant!
```

Go言語ではこんな感じでパッケージシステム版「Hello World」が出来ました。

# 流行りのPython

ディレクトリ構造はこんな感じ

```
.
├── main.py
└── servant
    ├── Greeter.py
    └── __init__.py
```

```python:servant/Greeter.py

class Summon:
    def __init__(self):
        self.message = "Hello Servant!"

    def serve_hello(self):
        print(self.message)

```

```python:main.py
from servant import Greeter

# Greeterを召喚！！
greeter = Greeter.Summon()
# service実行！！
greeter.serve_hello()
```

```
python main.py
-> Hello Servant!
```

# TypeScriptでもやってみる
まぁ、TypeScriptなんで一応、distディレクトリも含めてこんな感じ

```
.
├── dist
│   ├── main.js
│   └── main.js.map
└── src
    ├── main.ts
    └── servant
        └── Greeter.ts

```

```typescript:src/servant/Greeter.ts
export module Greeter {
    export class Summon {
        constructor() {}
        serveHello(): void {
            console.log('hello Servant!')
        }
    }
}

```

```typescript:src/main.ts
import { Greeter } from './servant/Greeter'

const greeter = new Greeter.Summon()

greeter.serveHello()
```

```
parcel build src/main.ts
node dist/main.js

-> Hello Servant!
```


# まとめ
結構、プログラミングの学習って
「Hello World」やった後
アプリ開発に挑戦してみるというところの間に
だいぶ、隔たりがあるので学習に苦労しているという人も多いのでは
無いでしょうか？

この「Hello Servant」は
この後、例えば

```go:main.go
greeter := Greeter.Summon("山田 太郎")
greeter.ServeHello()
-> Hello 山田 太郎！
```
というのをやってみたり
Scraperというservantを作って
例えば、スポーツ選手の一覧掲載してるサイトから
スポーツ選手名一覧を引っ張ってきて
スポーツ選手の国籍に応じてその国の言葉で挨拶するGreeterを作ってみたり

普通のHello Worldよりかなり練習の幅が広がるのでは無いでしょうか？

ちなみにこの「servant」という設計思想は
遊戯王カードとかカードゲームをやったことある人と非常に相性の良い設計思想です。
「Summon(召喚)」とか言ってるくらいですからね。
そして、スクレイピングみたいにweb上からデータを取ってくるのも
感覚的に遊戯王カードとかの「フィールド上の〇〇を」みたいな感覚と似てますよね。
プログラミングをすること自体がもうカードゲームをプレイしているような感覚で楽しくなってきます。
Laravel5.8でTraitsを利用してCSVファイルダウンロード

### 目的：
報酬のCSVファイルをアップロード後、別途経理に渡す給与明細のCSVファイルをダウンロードする処理を実装
![スクリーンショット 2019-11-22 15.11.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274686/24db1712-269e-47d3-dba7-b8b160d470ec.png)


### １. ルード設定
```
Route::any('/csv/account/download/{ym}/{kind}', 'Csv\PaymentController@account')->where('ym', '[0-9]{4}-[0-1]{1}[0-9]{1}');
```

### 2. Controllers

```
namespace App\Http\Controllers\Csv;

use App\Http\Traits\Csv;
use App\Models\CsvFile;
use App\Http\Controllers\Controller;

/**
 * Class PaymentController
 * @package App\Http\Controllers\Csv
 */
class PaymentController extends Controller
{
    use Csv;

    /**
     * CSVをダウンロード(経理用)
     *
     * @param $ym
     * @param $kind
     * @return mixed
     */
    public function account($ym, $kind) {

        // ファイル名
        $filename = $ym.TF_CSV_ACCOUNT_FILE_NAME;
        $file = Csv::createCsv($filename);

        // ヘッダー
        $header = TF_CSV_ACCOUNT_FILE_HEADER;
        Csv::write($file, $header);

        // リスト
        $rentalList = $this->twPayment->getRentalList($kind, $ym);
        foreach ($rentalList as $rental){
          $data = [
                $rental->user_id,
                $rental->l_name. $rental->f_name,
                $rental->bank_name,
                $rental->branch_name,
                $rental->branch_code,
                $rental->account_number,
                $rental->name_kana,
                $total,
            ];

            // 値を入れる
            Csv::write($file, $data);
        }

        // ファイルコンテンツ取得
        $response = file_get_contents($file);

        // ストリームに入れたら実ファイルは削除
        Csv::purge($filename);

        return response($response, 200)
            ->header('Content-Type', 'text/csv')
            ->header('Content-Disposition', 'attachment; filename='.$filename);
    }
}
```
### 3. Traits
```
namespace App\Http\Traits;

trait Csv {

    /**
     * CSVファイルを生成
     *
     * @param $filename
     * @return mixed
     */
    public static function createCsv($filename) {
        $csv_file_path = storage_path('app/'.$filename);
        $result = fopen($csv_file_path, 'w');
        if ($result === FALSE) {
            throw new Exception('CSVファイルの書き込みに失敗しました。');
        } else {
            fwrite($result, pack('C*',0xEF,0xBB,0xBF)); // BOM をつける
        }
        fclose($result);

        return $csv_file_path;
    }

    /**
     * CSVファイルに書き出す
     * @param $filepath
     * @param $records
     */
    public static function write($filepath, $records) {
        $result = fopen($filepath, 'a');

        // ファイルに書き出し
        fputcsv($result, $records);

        fclose($result);
    }


    /**
     * CSVファイルの削除
     *
     * @param $filename
     * @return mixed
     */
    public static function purge($filename) {
        return unlink(storage_path('app/'.$filename));
    }
}
```

### 4.BOM をつける

```
fwrite($result, pack('C*',0xEF,0xBB,0xBF));
```
BOMをつけることでUTF-8で出力してもExcelで読めるようになる。
golang sql debug

```
fmt.Printf(`SELECT * from  '%v'` + strings.Replace(whereQuery, "?", "'%v'", -1) + ` OFFSET %v`, param...)
```

```
		newbuf := dbr.NewBuffer()
		stmt.Build(dialect.MySQL, newbuf)
		fmt.Println(newbuf.String())
		fmt.Println(newbuf.Value())
```
光ケーブルいろいろメモ

#コネクタの形
小さいのがLC,大きいのがSC
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/830fb3f3-bee8-046a-49be-5834969df219.png)

https://www.it-ex.com/distribution/securitynetworksolution/ciscobiz/faq/2017/07/sfp-2.html


#ケーブルの種類
###MMF（マルチモード・安い）
最大550m（OM1だけは短い）
MMFにはさらに種類がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/7085449a-4848-9d9e-a0bf-0d036c3c05f9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/38910c1b-42be-e045-1a2a-65909d22ef92.png)


###SMF（シングルモード・高い）
　最大70km
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315938/af479462-1309-3402-df45-6b514a3218d9.png)


#規格
1000Base-T　Cat5EのUTPで100m
1000Base-TX Cat6のUTPで100m
1000BASE-SX　MMFで550m
1000BASE-LX　MMFで550m、SMFで5km
WebstormのFileWatcher時に出る「env: node: No such file or directory」エラー

# 概要
- JetBrains製品であるWebStormに内蔵されている「File Watcheres」という機能を使っているときに遭遇したエラーの解消方法
- おそらくPhpStormなど他の製品でも同様の事象になる可能性がある

# 対象読者
- 表題のエラーに遭遇した人
- JetBrain製品使い

## エラー事象
概要にも記載している通り、WebStormに内蔵されている「File Watcher」という機能を使おうとしたときに出たエラーです。
具体的にはファイル保存時に自動でPrettierをかけようと下記の通り設定をしようとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123578/4492140f-dfcf-72fb-1573-04489b7e27f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123578/7e880058-0ca9-024a-e7e9-068e6d79dbf2.png)

この状態で保存をして対象のファイル（今回の例ではTypescriptファイルである.tsファイル）を編集して保存し、動作を確かめます。
この際に下記のエラーに遭遇しました。

```shell

/path/to/project/root/node_modules/.bin/prettier --write index.ts
env: node: No such file or directory

Process finished with exit code 127
```

## エラー調査
見たところ、単にNodeのバイナリが見つかっていないだけに見えます。通常のターミナル、WebStorm内蔵のターミナルからバイナリが引けるか確認してみます。。。普通にひけるやん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123578/df9e5e15-d60c-0294-68ee-49e5b9705e91.png)

シェル自体（筆者の環境ではzsh）にはnodeのパスは通っているように見えます。。。

## 解決方法
File Watchersの各コマンドには環境変数が設定できるところがあります。一番下のEnvironment variablesです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123578/40608fc9-35ef-74a8-08a7-45989c8cd96b.png)

ここを見ると、システム環境変数を含むという項目にチェックが入ってますが、SHELLがbashになっていたり、PATHが通常のターミナルを立ち上げて出力される結果よりも明らかに短い事がわかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123578/ae2d9c1a-8639-9950-8e66-7ee7bf3e3436.png)

根本解決にはなっていない気がしていますが、ターミナルから下記コマンドを打ち込んで、PATHの設定内容を吐き出させます。それをコピーしてコマンドの環境変数のPATHとして登録をします。

```bash
$ echo $PATH
/Users/h・・・・・・・
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123578/cd39aaa5-41cf-6a38-98f4-3b403e81539e.png)

環境変数を登録した状態で変更を保存することで無事nodeのバイナリが読み込まれてPrettierを実行できました。
Streamの中間処理

[Streamの生成処理](https://qiita.com/key_sleep/items/758067cde4f054d61010)
で生成したStreamの対して様々処理を与える部分。

ここではまだListを生成したり、文字列として出力したりなどは行わない。
この記事では例として、すべての終端処理にListを再生成させておく

## map
ラムダ式や関数を用いて要素を変換したい場合に用いる。

```java
// ラムダ式
List<Integer> actual = list.stream().map(s->s.length()).collect(Collectors.toList());

// メソッド参照
List<Integer> actual = list.stream().map(String::length).collect(Collectors.toList());
```

## filter
条件式によってStreamの要素の絞りこみを行いたいときに用いる

```java
List<String> actual = list.stream().filter(s -> s.equals("b")).collect(Collectors.toList());
```
## distinct
要素の重複削除を行う

```java
List<String> list = Arrays.asList("a","a","b","b","c");

List<String> actual = list.stream().distinct().collect(Collectors.toList());

// a,d,c
```

## peek
Stream自体の要素に影響を与えない処理を行いたい場合に使用する

```java
List<String> actual = list.stream().peek(System.out::println).collect(Collectors.toList());
```

## Sorted
文字通りソートを行いたい場合に使用する

```java
// 昇順
List<String> actual = list.stream().sorted().collect(Collectors.toList());

// 降順
List<String> actual =list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
```

## skip
要素のn番目から取得したい場合に用いる。
それより前の要素は捨てられるので注意

```java
List<String> list = Arrays.asList("a","b","c","d","e");

list.stream().skip(2).peek(System.out::println).collect(Collectors.toList());

// c,d,e
```

## limit 
先頭からn個を取得したいときに用いる

```java
List<String> list = Arrays.asList("a","b","c","d","e");

list.stream().limit(3).peek(System.out::print).collect(Collectors.toList());

/// a,b,c

list.stream().skip(2).limit(2).peek(System.out::print).collect(Collectors.toList());

// c,d
```
make command : Makefile : commands commence before first target.

use Tab in Makefile
not spaces

in heading line of command

コマンド先頭にはスペースではなくタブを使うっぽい

![image](https://user-images.githubusercontent.com/13635059/69383703-ba4ba400-0cfd-11ea-9fed-49378665529e.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2750








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SwiftGenをCocoaPodsで入れてみたよ

SwiftGenをprojectに導入してみたので, 備忘録がてら書き残しておきます.
※SwiftGenはHomebrewを用いて導入することもできますが, 今回はCocoaPodsの場合のみです.
サンプルコードはこちら -> [SwiftGenPractice](https://github.com/tihimsm/SwiftGenPractice)
SwiftGen本家リポジトリはこちら -> SwiftGen(https://github.com/SwiftGen/SwiftGen)

# 目次
1. CocoaPodsでSwiftGenをinstall
2. swiftgen.ymlを用意
3. BuildPhasesにSwiftGenに関する記述を追加

最終的に↓の画像のような構成になる前提で読んでいただけると.
![スクリーンショット 2019-11-22 14.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142392/b1ca84af-66db-e31e-3ebb-bd451cc2fab4.png)
# CocoaPodsでSwiftGenをinstall
```Ruby:Podfile
pod 'SwiftGen'
```
とりあえずPodfileにSwiftGenを記述して, pod install.
※CocoaPods自体の準備は割愛します.

# swiftgen.ymlを用意
```swiftgen.yml
xcassets:
  inputs:
    - ../Resources/Images.xcassets
    - ../Resources/Colors.xcassets
  outputs:
    - templateName: swift4
      output: ./Generated/Assets.swift
```
このように書くと, `Image.xcassets`と`Colors.xcassets`を`Assets.swift`に吐き出してくれます.

# BuildPhasesにSwiftGenに関する記述を追加
任意のTarget(今回の場合だと`SwiftGenPractice`)のBuildPhasesの`＋`のドリルダウンから`New Run Script Phase`を選びます.

あとはShellの中身に下記のように記述してビルドしたら出来上がりです.

```Shell
$PODS_ROOT/SwiftGen/bin/swiftgen config run
--config $SRCROOT/SwiftGenPractice/SwiftGen/swiftgen.yml
```

ちなみに吐き出された`Assets.swift`内にはこんな感じで書かれています.

```Assets.swift
// MARK: - Asset Catalogs

// swiftlint:disable identifier_name line_length nesting type_body_length type_name
internal enum Asset {
  internal enum Colors {
    internal static let sampleColor = ColorAsset(name: "SampleColor")
  }
  internal enum Images {
    internal static let sampleImage = ImageAsset(name: "SampleImage")
  }
}
// swiftlint:enable identifier_name line_length nesting type_body_length type_name
```
staticな定数として宣言されているので, これらを使いたい時は`Asset.Colors.sampleColor`のようにして呼び出してやれば良いわけですね.
とても簡単ですしtypoもなくなるし最高ですね.

ダークモード対応でカラーアセットを使う機会も増えると思うので, SwiftGenも一緒に入れられると良いのではないでしょうか.
var_dump, ddの省略表示を回避する方法

デバッグ時のメモ(..)

```php:PHP
$array = ['a', 'b', 'c'];
ini_set('xdebug.var_display_max_children', -1);
ini_set('xdebug.var_display_max_data', -1);
ini_set('xdebug.var_display_max_depth', -1);
dd($array);
```

表示結果 
 
```
array:3 [▼
  0 => "a"
  1 => "b"
  2 => "c"
]
```
応用カリキュラム 06 データベース設計

ほとんどの場合、サービスはデータベースを持っている。
データを得るために派手な見た目やインターフェースを使っているので
データベースそのものがサービスのメイン。

##いつ

データベース設計は開発の最初の段階で行う。
データベース設計は基本的には現実世界の要素をデータに落としこむ作業。
客商売での顧客という概念が```エンティティ```。
顧客の情報が```属性```。
顧客と他の情報との関係性が```リレーション```。

##概念

エンティティを定めて、
定めたエンティティに属性を定めて、
エンティティ同士のリレーションを定めて
データベース定義

データベース上では、エンティティ = テーブル
テーブルは2次元表で表す。
```テーブルの行がレコード```。```テーブルの列がカラム```。
レコードがデータ。カラムが属性
テーブル同士の関係性がリレーション

##キー

テーブルにおける```キー```とはレコードを識別するための特別なカラム。レコード毎にただ一つの値を持っていて被らないようにする。
主キーと外部キーの2種類がある。

　```外部キー```は異なるテーブルのレコードと関係性（リレーション）を持つ場合に必要なカラム。異なるテーブルにおける主キー。

##制約

制約を設けて安全なデータベースにする

- NOT NULL制約 空の値を受け付けない
- 一意性制約 登録済みの値を受け付けない
- 主キー制約
- 外部キー制約

上記4件の制約をうまく使う。

##インデックス

インデックスをつけて検索スピードを上げる。度々検索する主キー、外部キーなどを登録。
検索は早くなるが、登録スピードやサーバー容量が増えてしまう。

railsにおけるマイグレーションファイルで、インデックスが適用できるが、
2つのカラムに一度にインデックスを適用した場合、
2つのカラムでの検索スピードは早くなるが、```1つのカラムだけでの検索スピードは早くならない。```
Photoshopで画像のグラデーション

#目標
複数の画像をグラデーションで滑らかに合成する
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307320/5ae4e667-a042-b00e-6edd-57be7d29d279.jpeg)

#手順
はじめに後ろに持ってきたい画像を置き、その上に重ねたい画像を置く。
<img width="1440" alt="スクリーンショット 2019-11-22 14.20.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307320/9b5b54f6-81b5-9bd8-394c-8c252e960cb1.png">

右下からグラデーションをかけたい画像にレイヤーマスクをつける。
<img width="1440" alt="スクリーンショット 2019-11-22 14.20.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307320/c994f1bc-aa64-f39f-7f1f-372071b8d1c5.png">

次に左側の塗りつぶしツールを長押しし、グラデーションツールを呼び出す。
<img width="1440" alt="スクリーンショット 2019-11-22 14.21.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307320/51f92840-2abb-aa15-c943-c01aa966b592.png">

あとは左上でグラデーションのカラーを調整し、グラデーションをかけたい角度でドラッグすることで透明度を調整する。
<img width="1440" alt="スクリーンショット 2019-11-22 14.21.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307320/53bef1da-1629-8385-33d2-96b6f8e92dcb.png">
【Mac】Node.jsインストール by Homebrew

##環境
MacOS High Sierra 10.13.3


##手順

###Homebrewインストール

・インストール

```shell_session
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

※エラーになる場合は以下を実行してから行うと良い。

```shell-session
$ sudo chown -R $(whoami) $(brew --prefix)/*
```


・インストール確認

```shell-session
$ brew help
```

###nodebrewインストール

・インストール

```shell-session
$ brew install nodebrew
```

・パスを通す

```shell-session
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile

$ source ~/.bash_profile
```

・インストール確認（バージョンが表示されればOK）

```shell-session
$ nodebrew -v
```


###Node.jsインストール

・ディレクトリを作成

```shell-session
$ mkdir -p ~/.nodebrew/src
```


・インストール可能なバージョンを確認

```shell-session
nodebrew ls-remote
```

・インストール
　- バージョン指定でインストール

```shell-session
$ nodebrew install-binary {version} 
```


　- 最新バージョンをインストール

```shell-session
$ nodebrew install-binary latest
```

・インストールしたバージョンを確認

```shell-session
$ nodebrew ls
```

・有効化

```shell-session
$ nodebrew use {version}
```

・npmバージョンを確認

```shell-session
$ npm -v
```
【Jenkins】GitのSSH接続をするための認証情報を設定する【GitHub】

# はじめに

JenkinsでGitHubのプライベートリポジトリを扱う際に必要な、SSHで認証を通すための手順を紹介します。特に、秘密鍵の「直接入力」が分からなくてハマりました。。。

内容はWin/Macでほぼ共通です。

# 手順

## (SSHをまだ作っていない場合)

```.bash
# SSHキーの作成
# 「ユーザー名」「パスワード」「パスワード(確認)」と3回入力を求められるが、
# 全て空白(そのままエンター)でもOK
$ ssh-keygen

# 公開鍵をGitHubに登録
# 公開鍵をクリップボードにコピー(Macの場合)
$ pbcopy < ~/.ssh/id_rsa.pub
# 公開鍵をクリップボードにコピー(Winの場合)
$ clip < ~/.ssh/id_rsa.pub
```

GitHubの [Settings > SSH and GPG keys](https://github.com/settings/keys) にアクセスし、「New SSH key」から先ほどクリップボードにコピーした内容を貼り付ける。名前は適当でOK。

```.bash
# 接続確認
$ ssh -T git@github.com
```

Hi!って言われたら完了

## Jenkinsで認証情報を設定

ソースコード管理でGitを選択し、「リポジトリURL」に扱いたいリポジトリのURLを入れる(`git@github:[GitHubユーザー名]/[リポジトリ名]`形式のもの)

認証情報の右側のボタンから「追加」をクリックして下記のような画面にする。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f35353336352f34313734313035622d643531312d656163612d383836342d6335346534646362383966382e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/65d3fff8-e3d7-de05-b2a4-28eca5904a82.png)

下記のように入力する。

|項目|内容|
|---|---|
|Domain|グローバルドメイン|
|種類|SSHユーザー名と秘密鍵|
|スコープ|グローバル|
|ID|区別するためのものなのでなんでもいい|
|説明|なんでもいい|
|ユーザー名|認証情報の選択画面ででる名前|
|秘密鍵|後述|
|パスフレーズ|`$ ssh-keygen`で設定したパスワード|

### 秘密鍵を直接入力する

あるバージョンから「直接入力」しか選択できなくなったようです。入力する内容は「秘密鍵の内容」です。「秘密鍵のパス」ではないので注意してください。

```.bash
# 秘密鍵をクリップボードにコピー(Macの場合)
$ pbcopy < ~/.ssh/id_rsa
# 秘密鍵をクリップボードにコピー(Winの場合)
$ clip < ~/.ssh/id_rsa
```
上記コマンドでコピーしたのち、入力欄にペーストしてください。

最後に追加ボタンを押してください。

### 認証情報を選択する

追加しただけだと認証情報が適用されていません。認証情報のプルダウンに先ほど追加した項目が追加されていると思うので、それを選択してください。Jenkinsが自動的に接続確認コマンドを叩いてくれるので、数秒待って赤いエラー表示がされなければ完了です。

# 参考

[JenkinsでCI環境構築事始め](https://qiita.com/tatsurou313/items/27afe6bd4df73224703b)
Macのターミナルで xcrun: error: ～ が出た時の対処

Mac OS を Mojave から Catalina へアップデートしたタイミングか、
もしくは更にターミナルの標準を bash から zsh に変更した後から以下が出るようになった。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

過去にも見たことあるな…と思いつつ、 [macOSアップデート後の『xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)...』の対処法](https://qiita.com/nishina555/items/e23d73067a5cac182a63) を参考に、以下のコマンドをターミナルで実行し、ポップアップで開くウィンドウから xcode をインストールするだけで対処完了！

```
xcode-select --install
```

AppStoreでXCodeをインストール(常に最新) していたとしても上記が出ます。
どうせならAppStoreからXCodeをインストール(Update含む)したタイミングで上記のコマンドも実施してくれたらいいのにな…と、前回同事象になった時にも思ったことをこの記事を書いていて思い出しました…。
ログローテのテストコマンド

# ログローテの動作確認する
テスト的にログローテを実行してくれる。実際にログローテはされない。
「-v」をつけることで詳細に実行結果を出力してくれる。

```
logrotate -dv /etc/logrotate.d/XX
```

# ログローテを実行する

logrotate.statusを編集し、日付をローテーションされる周期の日付より前に戻す

```
vi /var/lib/logrotate/logrotate.status
```

指定したログローテを実際に実行する

```
logrotate -d /etc/logrotate.d/XX
```
LinuxのNIC初期設定

# NICの確認
有効になっているNIC名とステータスを確認する。

## デバイス名確認
使用されているデバイス名(NIC)を確認する。

``` 
nmcli d 
``` 
## NICのステータス確認
設定変更するNICのステータスを確認する。
基本的には「ens」で始まるNIC名になっているはず。

```
nmcli d show ens192
```

# NIC設定
IPアドレスなどNIC必要な項目を設定していく。

## IPv4アドレスの設定

``` 
nmcli c modify ens192 ipv4.addresses ***.***.***.***/24
```

## ゲートウェイサーバの設定

```
nmcli c modify ens192 ipv4.gateway ***.***.***.***
```

## DNSサーバの設定

```
nmcli c modify ens192 ipv4.dns ***.***.***.***
```

## 静的アドレスへ変更

```
nmcli c modify ens192 ipv4.method manual
```

## NICの自動起動設定

```
nmcli c m ens192 connection.autoconnect yes
```
## NWインターフェース再起動

```
nmcli c down ens192; nmcli c up ens192
```

### IPｖ6無効
GRUB_CMDLINE_LINUXにipv6.disable=1を追記する

```
vi /etc/default/grub
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/swap crashkernel=auto rd.lvm.lv=rhel/root ipv6.disable=1"
``` 

```
grub2-mkconfig -o /boot/grub2/grub.cfg
systemctl reboot
```

#### おまけ
RHEL6の頃の設定ファイル「/etc/sysconfig/network-scripts/ifcfg-ens192」を確認すると、コマンド実行した設定が追記されていた。
LOAD DATA FROM S3でファイル分割時の性能検証

auroraに大量データを登録しようとしましたが、bulk insertだと思ったように性能が出なかったので、[LOAD DATA FROM S3](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.LoadFromS3.html) を試してみました

セットアップはいつもお世話になっている [Developers.io](https://dev.classmethod.jp/cloud/aws/aurora-mysql-integrate-with-s3/) さんの記事にお世話になりました
引っかかったのは、クラスターパラメーターグループにroleのARNを設定後、DBインスタンスの再起動をしないと反映されないところぐらいでした

対象のデータは、100万件で900Mほどのcsvファイルです

| インスタンスタイプ | 1ファイル | 4ファイル | 8ファイル | 16ファイル |
|:-----------------|:------------------:|:------------------:|:------------------:|:------------------:|
| t2.small | 5分04秒 | 4分30秒 | 4分30秒 | 4分30秒 |
| r5.large | 3分7秒 | 3分1秒 | 2分57秒 | 3分6秒 |

ファイル分割による、明確なレスポンスアップは確認できませんでした

今回の取り込みは、CSVファイルのごく一部に留まりましたので、それを無くしたらカラムマッピングのコストが無くなり、より良いレスポンスが得られるかも知れません
また検証して情報共有したいと考えています
応用カリキュラム mysql 01

仕事でこれでもか、というほどDB2触ってて良かった。復習楽チン。
但し、検索しかしてこなかった為、登録・更新・削除をしっかり覚える。

##SQL

Structured Query Language はリレーショナルデータベースの操作を行うための言語。
SQLはISO(国際標準化機構)で規格化が行われている為、どんなリレーショナルデータベースに対しても、ほぼ同じ文法で操作ができる。

###DDL

Data Definition Language データを定義するSQLの命令。
CREATE,ALTER,DROP データベースやテーブルの作成,更新,削除の3つ。

###DML

Data Manipulation Language データを操作するSQLの命令。
INSERT,UPDATE,DELETE,SELECT データの登録,更新,削除,検索の4つ。

DMLのみ確認する。

```sql
-- データの登録
insert into テーブル名 values(値1, 値2);
-- 特定のカラムのみ
insert into テーブル名(カラム名1, カラム名2) values(値1, 値2);
-- テーブルにあるデータ全て表示
select * from テーブル名
```

デフォルト値を設定していないカラムの値は、データ入力時に何も入れなかった場合、NULLが入る。

```sql
-- データの更新
update テーブル名 set 変更内容 where 条件;
-- カラム1でレコードを指定してカラム2を更新
update テーブル名 set カラム1="aaa" where カラム2="bbb";
```

```sql
-- データの削除
delete from テーブル名 where 条件;
-- カラム1でレコードを指定してレコードを削除
delete from テーブル名 where カラム1="aaa";
```

```sql
-- データの検索 基本形(テーブルにあるデータ全て表示)
select * from テーブル名 where 条件
-- (式分解) select カラム
-- (式分解) from テーブル
-- * ワイルドカード 文字の代わりにできる。全て、の意味。
-- (式分解) where 条件
```

```sql
-- =,<=などの比較演算子が使える。文字列はダブルコーテーションで囲む。
where a=1
where a<=1
-- AND,OR,NOTなどの論理演算子が使える。
where a=1 and b=1
where a=1 or b=1
where not a=1
-- 範囲検索between (下限、上限を含む)
where カラム名 between 下限 and 上限
-- 1つのカラムに2つ以上の検索条件指定 in()
where カラム名 in (値1, 値2)
```

```sql
-- 文字列連結 concat()
concat(文字列1, 文字列2)
-- 別名付与 as 名前 (as を省略して名前のみを記述する書き方もできる)
select データ as 名前
-- 上記の場合、名前がカラム名として表示される
-- 重複レコードの除外表示 distinct カラム名
select distinct カラム名
-- レコードのグループ化 指定したカラムが同じ値を持つデータを1つのグループとしてまとめる
-- 挙動がdistinctに似ているが違うもの
-- クエリの末尾に書く
group by
-- レコードの数を数える count(カラム名)
select count(カラム名) -- NULLは除外して数える
select count(*) -- NULLも含めて数える
```

```sql
-- テーブルの結合 join
from テーブル名1 join テーブル名2 on テーブル名1.カラム名1 = テーブル2.カラム名2
from テーブル名1 a join テーブル名2 b on a.カラム名1 = b.カラム名2
-- サブクエリ
-- 検索結果を検索条件として検索結果を取得する。クエリのネスト。
-- select句でも、from句でも、where句でも使える
select * from table1 where column1 in (
  select column1 from table2 where column2 = "aaa"
)
```
TD WorkflowのUIからのdigファイル名変更

UI上でのWorkFlowのの名前変更。
# 11/21ユーザー会で書くといったので
同じプロジェクトのものであれば、開いたWFと別のWFはただのdigファイルなので、ファイルの名前変えればWorkflowの名前変わります。[終わり]

# 念のためスクショ
##### 目的：hogehoge_projプロジェクトのhogehoge_1 ワークフローからhogehoge_2ワークフローの名前を変更します。

![dig01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143512/855adc47-9f4e-6296-039a-76b38b5a342e.png)

STEP1:hogehoge_1のワークフローを開いて編集
![dig02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143512/c2158be6-851e-c4bf-36c0-629206de36d1.png)

STEP2:hogehoge_2.digがあるので、そこのファイル名の所の編集クリック
![dig03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143512/eeb6a5d8-f2ad-e9db-9bee-2bfbe2d52e0d.png)

STEP3:変更して保存。[終わり]
![dig04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143512/36ab2481-13c4-c42a-a6b0-8d86cb3b5214.png)
Autodesk Inventor API Hacking (Modeless FormのZ order)

# 0. はじめに
WinFormをModelessで表示してから(具体的には`myForm.Show()`してから)、InventorのWindowをclickすると、FormがInventorの背後に隠れます。
Z orderを指定するにはどうするのか、という話しです。

# 1. Inventorより前面にくるように指定する方法
通常のWinFormのApplicationですと、`Show`の引数に親Formを指定すれば、親の背後に回ることはありません。
Inventorの場合は、親がWinFormではないので、次のようにします。

```C#
var myDialog = new MyDialog();

var owner = new System.Windows.Forms.NativeWindow();
owner.AssignHandle((System.IntPtr)InventorApplication.MainFrameHWND);

myDialog.Show(owner);
```
この場面以外でも、凝ったことをしようとするとwin32 APIを直接たたく必要に迫られることがありますが、`Application.MainFrameHWND`でWindow Handleが得られるのは知っておいて損がないです。

# 99. 親の記事に戻る
[Autodesk Inventor API Hacking (概略)](https://qiita.com/yamarah/items/cee08eb8f2b7aecbda83)
synologyのNASのファイルの復元方法



★Snapshot Replicationでスナップショットを撮っている場合に限る


Snapshot Replication
「スナップショット」で対象の共有フォルダを選択
「設定」→「詳細設定」→「スナップショットを検出できるようにする」にチェックを入れてOK


トップディレクトリに「#snapshot」というフォルダが表示されるようになるので、
そこから目的のファイルを探して、ダウンロードすればOK
コードも合ってるのに音が鳴らない( Unity ) AudioSource.Play();

#たまにやらかす奴

オブジェクトを消すときに効果音を鳴らしたい時があると思います

```C#:Audio_Play
using UnityEngine;
using UnityEngine.UI;
public class Audio_Play : MonoBehaviour
{
    AudioSource audio;
    void start()
    {
        audio = GetComponent<AudioSource>();
    }

    void OnCollisionEnter(Collision collision)
    {
        audio.Play();
        Destroy(gameObject);
    }

}
```

↑のコードでは残念ながら効果音はなりません。
((実際にはなっていますが消えています。))

なぜかというと音を鳴らした瞬間にオブジェクトごと音を破棄しているからです。

対策法をしては音を鳴らす為だけのオブジェクトをインスタンスから生成するか、別のスクリプトにアクセスして鳴らすなどがあります。

今回はインスタンスを生成する方法で解決します。
インスタンスの場合

```C#:Audio_Play
using UnityEngine;
using UnityEngine.UI;
public class Audio_Play : MonoBehaviour
{
    public GameObject Audio_Object;
       
    void OnCollisionEnter(Collision collision)
    {
        Instantiate(Audio_Object, transform.position, transform.rotation);
        Destroy(gameObject);
    }

}
```
```C#:Audio_Objectにアタッチする奴
using UnityEngine;
using UnityEngine.UI;

public class Audio_Play : MonoBehaviour
{
    private AudioSource Audio;//AudioSourceを入れる
    bool isAudioStart = false; //曲再生の判定
    void Start()
    {
        Audio = GetComponent<AudioSource>();//AudioSourceの取得
        Audio.Play();//AudioSourceを再生
        isAudioStart = true;//曲の再生を判定
    }
    void Update()
    {
        if (!Audio.isPlaying && isAudioStart)
        //曲が再生されていない、尚且つ曲の再生が開始されている時
        {
            Destroy(gameObject);//オブジェクトを消す
        }
    }
}
```
![スクリーンショット 2019-11-22 13.45.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374827/6fd672ee-ac4e-b520-4e04-1d6964fead82.png)
※ゲーム開始時に再生を一応外しておくこと
DjangoをCloud BuildでApp Engineに自動デプロイするときの、cloudbuild.yamlの例

# 概要
DjangoプロジェクトをCloud BuildでApp Engineに自動デプロイできるようにする設定。
cloudbuild.yaml設定内容の、日本語の情報がなさそうなので共有します。

# 方法

[標準的なデプロイ方法](https://cloud.google.com/source-repositories/docs/quickstart-triggering-builds-with-source-repositories)を実施+以下のcloudbuild.yamlファイルを使用します。

``` yaml:cloudbuild.yaml
steps:
# collectstatic用のdjangoを走らせるための環境を作る
- name: 'python:3'
  entrypoint: python3
  args: ['-m', 'venv', '/workspace/venv']
- name: 'python:3'
  entrypoint: "/workspace/venv/bin/pip"
  args: ['install', '-r', 'requirements.txt']
# 作ったvenvを使ってcollectstatic（テスト等を実行してもよい）
- name: 'python:3'
  entrypoint: "/workspace/venv/bin/python"
  args: ['./manage.py', 'collectstatic', '--noinput']
# App Engineにデプロイ
- name: "gcr.io/cloud-builders/gcloud"
  args: ["app", "deploy"]
timeout: "1200s"
```

デプロイのステップでvenvを作ってそこでcollectstaticなりテストなりを実行してます。
注意点としては、Cloud Buildでは"/workspace/"内の情報しか次のステップに引き継がれないことくらいです。

# まとめ
上記のcloudbuild.yamlの設定で、いい感じにデプロイできます。

[GitHubとCloud Buildを連携](https://cloud.google.com/source-repositories/docs/mirroring-a-github-repository)したりすれば、GitHubにpushするごとに自動でデプロイされるように設定できて楽しいのでお勧めです。

初投稿につき、気になる点やご質問・改善案などあればお気軽にコメントいただけると幸いです。
Symfony 4.4 LTS のプロジェクトの作り方

# はじめに

Symfony 5系がリリースされていました。
symfonyでプロジェクトを作成する場合に、デフォルトで5系で作成されましたので、4系、またはLTSで作成する場合の手順をメモ書きします。

# 作成の仕方

個人的には、開発環境にインストールをしたくないのですが、「郷に入れば郷に従え」ということで、symfonyアプリをインストールします。

https://symfony.com/download

その上、versionを指定でLTSとしてプロジェクトを作成します。

```bash
symfony new --full --version=lts <ディレクトリ>
```

symfonyのローカルサーバなど利用する場合は、「symfony」コマンドは必須ですので、ダウンロードしておく方がよいですね。

composerで入れる場合は、バージョン指定で入れると思われます。

```bash
composer create-project symfony/skeleton <ディレクトリ名> <バージョン>
```

バージョンは以下のサイトで確認をしてください。
https://packagist.org/packages/symfony/skeleton

私が確認した時点では、「v4.4.99」でした。
あとで気づきましたが、「「4.4.*」でもよいみたいです。

![2019-11-22_13h52_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/8bea7027-c8a5-dfa0-a714-e8954ddbb209.png)

こんな感じで作成します。


```bash
composer create-project symfony/skeleton project_name v4.4.99
composer create-project symfony/website-skeleton project_name  4.4.*
```


# 作成後の確認

```bash
symfony server:start
```
※dockerでalpineを使っている場合は、PHP7.3以上でないと起動しないです。
[“symfony serve” crashes with php 7.2 (docker/alpine)](https://stackoverflow.com/questions/57118529/symfony-serve-crashes-with-php-7-2-docker-alpine)


http://127.0.0.1:8000 にアクセスをすると、以下のような画面が表示されます。

![2019-11-22_13h44_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133291/31a45b15-71e9-ff0c-b123-701914097ab5.png)
失敗した時に戻る方法 Rails チュートリアルより

##「元に戻る方法」をRailsチュートリアルから一部抜粋しメモしました。

Railsはコントローラ以外にも関連ファイルを大量に生成するので、生成されたコントローラファイルを削除するだけでは元に戻りません。

自動生成されたコードを元に戻すためには、新規作成されたファイルを削除するだけではなく、既存のファイルに挿入されたコードも削除する必要があります (rails generateを実行するとルーティングのroutes.rbファイルも自動的に変更されるので、これも元に戻さなくてはなりません)。


  $ rails generate controller StaticPages home help
  $ rails destroy  controller StaticPages home help


  $ rails generate model User name:string email:string
モデルの自動生成についても、同様の方法で元に戻すことができます。

  $ rails destroy model User
(上のコマンドからわかるように、モデル名以外の引数は不要です。)。

マイグレーションの変更を元に戻す方法も用意されています。
**まずdb:migrateでデータベースのマイグレーションを変更します。**

  $ rails db:migrate
元に戻したいときは、db:rollbackで1つ前の状態に戻します。

  $ rails db:rollback
最初の状態に戻したいときは、VERSION=0オプションを使います。

  $ rails db:migrate VERSION=0
既にお気付きの方もいると思いますが、マイグレーションは逐次的に実行され、それぞれのマイグレーションに対してバージョン番号が付与されます。したがって、上記の0を別の数字に置き換えることによって、指定したバージョンの状態に戻すことができます。
【個人メモ】MACショートカットキー

#表記方法
| 記号  | 意味 |
|:--|:--|
| ^  | Ctrl |
| ⌥  | Option |
| ⇧  | Shift |
| ⌘  | Command |
| ⌫  | Delete |
| Enter  | Enter |
| Space  | Space |
| ←↑↓→  | 矢印キー |
| tab  | タブキー |
| ⌘A-B  | Command-A を押し、全てのキーを離した後で B を押す |
#Finder
||操作|
|:--|:--|
|コピー|⌥|
|フォルダの場所を入力|⌘⇧G|
|削除|⌘⌫|
|エイリアス（ショートカット）|⌘L|
|エイリアス本体を表示|⌘Y|
|エイリアスファイルがある場所に移動|⌘R|
Google Play Developer APIの旧バージョンに関する警告

問題に関する情報がなかったので苦戦しましたが、問題が本日付けで解決したので一応報告を兼ねて掲載します。

##症状##

Google Play Consoleにて以下の警告が発生。

「アプリで古いバージョンのGoogle Play Developer APIを使用していることがわかりました。2019年12月1日以降、このAPIのバージョン1および2は使用できなくなります。それまでにバージョン3にアップグレードしてください。」


##前提##

・Microsoft VisualStudio2017のXamarinにて作成したアプリ。
・GooglePlayに５本ほど公開しているが１本のアプリのみで上記警告がでている。（他のアプリでも一時期は表示されていたがしばらくすると表示されなくなった。）
・Google Play Developer APIはGoogle Play Consoleにリンクしているが使用している形跡がない。（意図的には使用していない）

##解決策##

まずGoogleに問い合わせメールを送りテンプレと思わしき以下の回答をもらいました。

>今回のアラートは、全てのアプリではなく、まだ旧バージョン 1 や 2 を使っているアプリのみに表示されることになります。
多くの場合、[Google Play API client libraries](https://developers.google.com/android-publisher/libraries) をアップデートすることで必要な対応は完了されることになります。
>今後古い API のご利用を検出された場合、再び警告が表示される可能性がございますので、お早めのご対応をお願いいたします。
>今回のアラートに関する詳細は、[こちら](https://developers-jp.googleblog.com/2019/04/changes-to-google-play-developer-api.html)の Google Developer Blog の関連記事をご参照いただけます。」

とはいえGoogle Play Developer APIを使っている形跡はありません。

具体的にやれることはほぼなかったのですが、
Xamarin界で有名な[James Montemagnoさんのgithub](https://github.com/jamesmontemagno/InAppBillingPlugin/issues/221)にこの問題の議論があって

ここに記載があった「アドホック」でapkを再作成し手動でGoogle Playに更新を行う作業を実施しました。
当日は警告がそのままだったのですが、２日後の本日に警告は表示されなくなりました。

##結論##

手動でGoogle Playに更新していないアプリでも警告が出ていないアプリもあるので、原因特定には至っていません。
原因はわかりませんがなにかしらのバグ（誤検知？）がありそうです。参考まで。
Watson SDK for Javaでサービスの呼び方を調査した

##元ネタはこれ
https://github.com/watson-developer-cloud/java-sdk

##なにがはまったのか
ぱっとみて、「はいはい、API_Keyを渡すんでしょ」っていうこのコード部分に誘導された・・

```Sample.java
// letting the SDK manage the IAM token
Authenticator authenticator = new IamAuthenticator("<iam_api_key>");
Discovery service = new Discovery("2019-04-30", authenticator);
```

##基本的な考え方
IBM CloudにDeployするなら、VCAP変数が使えるから、Authenticatorを指定せずにサービスのインスタンスを作ればいい。
（難しいことを考えた方が負け）

##単体テストをするとき
Credential Fileをとってきて読み込ませるのが楽（VCAP変数がないけど、あるのに近い感じでできる）


>Credential file (easier!)

>With a credential file, you just need to put the file in the right place and the SDK will do the work of parsing it and authenticating. You can get this file by clicking the Download button for the credentials in the Manage tab of your service instance.

ここでもはまったのが、このページ（「サービス」の「管理」）で、Credentialsのペインが表示されないときがあった・・ということ。（読み込みで失敗してたのかな・・？）
![nlc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147406/5345daa3-2798-9572-6692-3b6781421f47.png)

このDownloadで、`ibm-credentials.env`が落とせる。
書式は、`<サービス名の大文字>_<Key>=<value>`

このNLCのサービスはふとみたらあったTokyoリージョンで作ったので、URLが東京リージョン向けになっている点も注意か。
ファイルの読み込みをさせる前に試行錯誤してたとき、API-Keyは渡せたけどURLが指定できてなくて、その場合`https://gateway.watsonplatform.net/natural-language-classifier/api` が指定され、`US-South`にアクセスに行こうとして、403 Forbiddenが返ってくる。

APIを引数で指定する && US-South以外のリージョンでサービスを作った場合は、URLを設定する。

```Sample.java
NaturalLanguageClassifier nlc = new NaturalLanguageClassifier("<api_key");
//サービスのリージョンのURLを指定
nlc.setURL("https://gateway-tok.watsonplatform.net/natural-language-classifier/api");
```


##ibm-credentials.envの読み込み場所と順番
さらっとReadmeに書いているけど、ソースをみたほうがわかりやすかった。

ファイル名は、`ibm-credentials.env` で固定
読み込み順序はこの通りで、上からみていって見つかったものを読み込む（それ以降は読まない）

```CredentialUtils.java
  private static List<File> getFilesToCheck() {
    List<File> files = new ArrayList<>();

    String userSpecifiedPath = EnvironmentUtils.getenv("IBM_CREDENTIALS_FILE");
    String currentWorkingDirectory = System.getProperty("user.dir");
    String unixHomeDirectory = EnvironmentUtils.getenv("HOME");
    String windowsFirstHomeDirectory = EnvironmentUtils.getenv("HOMEDRIVE") + EnvironmentUtils.getenv("HOMEPATH");
    String windowsSecondHomeDirectory = EnvironmentUtils.getenv("USERPROFILE");
```

https://github.com/IBM/java-sdk-core/blob/master/src/main/java/com/ibm/cloud/sdk/core/util/CredentialUtils.java

## Apache Commons IO のバージョンも注意
別の用途でCommonsを使ってて、入ってたバージョンがちょっと古めだったけど、とりあえず、2.3以上じゃないとだめっぽい（Commons IOは2.6をSDK Coreのpomで指定している）
このメソッドがないぞエラー（NoSuchMethodError）になる。
https://commons.apache.org/proper/commons-io/javadocs/api-2.6/org/apache/commons/io/IOUtils.html#readLines-java.io.InputStream-java.nio.charset.Charset
Webページのチェックボックスを全て一発でチェックする方法

## 前提

WebページにJQueryが使われていること


## やり方
ブラウザでデべロッパーツールを開き、consoleタブで以下のコマンドを貼り付けてエンター押下で実施すると画面上に表示されている全てのチェックボックスにチェックが付きます。

```javascript
$('input[type="checkbox"]').prop("checked",true);
```

全てにチェックがつくので予期せぬところにチェックされている可能性があるため、実施後はよく画面を確認してください。
（操作ミスによるトラブルは責任を負いませんのでご了承ください。）

作業効率化に役立ててください。

### 参考画像
Google Chrome デベロッパーツール(ブラウザ右上にある３つの点から探せる)
![デベロッパーツール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/f728ca08-706e-4cbc-d783-6b55fc308779.png)


consoleタブでコマンド実施後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123603/b0719d76-ef8a-0f49-3415-b28d87794cb8.png "画像タイトル")
OculusLinkの動かし方現状まとめ

#OculusLinkとは
・OculusQuestをusb3.0以上でPCに繋ぐとPCVRとして動かせる機能（β版）

#OculusLinkの動かし方（2019.11.22現在）
1.PC側Oculusアプリのバージョンを1.43に。テストチャンネル12だと動かない。
2.Quest側バージョンを11に。古すぎると明示アップデート機能がないので
　ペアリングスマホと一緒に充電しながら放置
3.PC側設定で「Questを繋いでください」と出るのでAnkerのusb3.0ケーブルあたりで接続して
　緑マーク出れば成功
4.Quest側でOculusLinkの権限承認。
5.初回はPC側再起動したほうがいいかも

##その他情報
・[互換性](https://support.oculus.com/444256562873335/)
・[機能リリースのブログ記事](https://www.oculus.com/blog/play-rift-content-on-quest-with-oculus-link-available-now-in-beta/)
・[ツイッターの「#OculusLinkチャレンジ」タグ（勝手にやってる）](https://twitter.com/hashtag/OculusLink%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hashtag_click)

#ハマリポイント
・Questの設定を引き継ぐので電源ボタン押さないと画面復帰しなかった
・マイクはまだ使えないっぽい
・アプリによって音がなったりならなかったり

#情報共有
Googleスプレッドシートで環境と成功失敗まとめてます。気軽に書き込んでください
(https://t.co/pGQi2KNm1Z?amp=1)
rails 日付のvalidation

######備忘録
予約機能の開始時間のvalidationについて
過去の日付を選べないようにするために
-で囲まれた部分を追加

```rails:Reservation.rb
class Reservation < ApplicationRecord
  belongs_to :user, optional: true
  belongs_to :menu, optional: true
  validates :start_date, presence: true

--------------------------------
  validate :date_before_start


  def date_before_start
    errors.add(:start_date, "は今日以降のものを選択してください") if
    start_date < Date.today
  end
--------------------------------
end
```

参考にしたサイト
[Ruby on Railsで、日付の前後入力チェック](https://programmer-jobs.blogspot.com/2013/05/ruby-on-rails_21.html)
Visual Studio 2019 で Cmake + C++ プロジェクトを設定する CMakeSettings.json のメモ

# 背景

Visual Studio 2019 では CMake のサポートが強化されたようで, GUI からいろいろ設定できるようになっている.
CMake のパッケージのインストールは必要.
(Generator Ninja も自動で入るっぽい?)

https://docs.microsoft.com/en-us/cpp/build/cmake-projects-in-visual-studio?view=vs-2019


## cmake bootstrap

フォルダを開くか, git repo を clone すると, CMakeLists.txt があると自動で cmake bootstrap が走るようになります.
(なにかしら .sln ファイルを用意して開く必要はない)

いままでは, たとえば git for Windows の shell(mintty bash)で batch ファイル動かすなどで .sln 生成対応していましたが, この手間が減ります.

https://github.com/lighttransport/gltf-insight/blob/devel/vcsetup.bat

(`cmd //c vcsetup.bat` と mintty bash で実行すると, Windows コマンドプロンプトで batch file を動かしてくれる)


## CMakeSettings.json

https://github.com/google/swiftshader

SwiftShader でこの機能を知りました.

cmake bootstrap のための設定を, `CMakeSettings.json` で保存して利用することができます.

https://docs.microsoft.com/en-us/cpp/build/customize-cmake-settings?view=vs-2019

https://docs.microsoft.com/en-us/cpp/build/cmakesettings-reference?view=vs-2019

いろいろ頑張れば MinGW ビルドも VC2019 でできます.

`CMakeSettings.json` を VC editor で開くと, GUI で設定 or JSON editor で構文チェックしながら記述ができるので便利ですが, ただ, 出始めの機能なのか, あまり OSS で使っているサンプルが無いですね.

オフィシャルにちらりと設定サンプルはありました.

https://github.com/microsoft/CmakeSettings


## TODO

* Ninja だと, コンパイルエラー時にエラーメッセージをクリックしても GUI でソースコードの該当場所に飛んでくれない模様なので, 通常の VC Generator を試す.
Editor.jsプラグインで既に保存済みのデータを編集する

# Editor.jsプラグインで既に保存済みのデータを編集する

本家はこちら
https://editorjs.io/fill-block-with-saved-data

```js
import EditorJS from '@editorjs/editorjs'
//  各種省略

// どこかで定義したdata変数
// JSON形式で保存していたのでparseする
const savedData = this.data ? JSON.parse(this.data) : null

this.editor = new  EditorJS({
  holder: 'codex-editor',
  tools: {
    header:  Header,
  },
  data: savedData, // dataプロパティーに既存データを突っ込む!!
})

// this.editorは好きに呼び出して
```
PythonでIPアドレス，CIDR等を操作するnetaddrについて

# CIDR
Classless inter-domain routingの頭文字．
意味は，「アドレスクラスの概念を用いないでIPアドレスの割り当てや経路の選択などを可能にする仕組み」のこと．
(「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典より)
https://wa3.i-3-i.info/word11990.html
様々なIT用語について解説してくれているサイトです．素人にもとてもわかりやすい記述で，重宝しています．

# netaddr
Pythonのライブラリで，IPネットワークの操作に使います．
公式ドキュメント(https://pypi.org/project/netaddr/) の説明には，A network address manipulation library for Pythonとあります．
IPネットワーク同士を比較したり，差集合をとる，共通部分をとる，含まれるIPアドレス一覧を取得...などの操作が簡単に実現できます．

## 例). 差集合
IPSet()を使って，CIDR表記のIPブロック同士の差集合をとってみます．

```python
>>> s1 = IPSet(['0.0.0.0/0']) # 0.0.0.0/0を要素として追加
>>> s1.remove('255.255.255.255') # remove()で指定したアドレスのみ削除する
>>> s1
IPSet(['0.0.0.0/1', '128.0.0.0/2', '192.0.0.0/3', '224.0.0.0/4', '240.0.0.0/5', ... '255.255.255.254/32'])
```
こうすると，removeで指定したアドレスを差し引いた残りのIPブロックやアドレスが，一覧で返ってきます．これをライブラリなしでやろうとするとかなり面倒です．