OmniAICreator/Qiita-1.07M huggingface dataset:
■How to execute "TensorFlow CNN for fast style transfer" which comes from GitHub by using Google Colaboratry 

# Introduction
[**GitHub:TensorFlow CNN for fast style transfer**](https://github.com/lengstrom/fast-style-transfer) instructs how to use Tensorflow, and shows example of picture style change below.

**Before**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/3f941b54-1109-936f-2c94-92f0fcc94f59.png)

**After applied wave.ckpt**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/ee045e19-e14e-b597-ea0e-93b36e9c4cbc.png)

# Setup of Google Colaboratory Environment
First, we need to mount on Google Drive, and upload files you want to use.
 - evaluate.py
 - optimize.py  <- this file is located under src folder of fast-style-transfer-master.
 - transform.py <- this file is located under src folder of fast-style-transfer-master.
 - utils.py     <- this file is located under src folder of fast-style-transfer-master.
 - vgg.py       <- this file is located under src folder of fast-style-transfer-master.
 - stata.jpg    <- picture file you want to transform. Any picture is OK. 
 - wave.ckpt    <- checkpoint file you wan to use as style.
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/52038c98-0bd7-3198-c31a-8317cc50f042.png)

# Setup Libraries
Since some files are programed by its previous version, you need to uninstall new one, and install previous version so that these files can run. 

``` python
!pip uninstall scipy # Uninstalling scipy-1.4.1:
!pip install scipy==1.1.0
```

``` python
!pip uninstall tensorflow # Uninstalling tensorflow-2.2.0rc3:
!pip install tensorflow==1.1.0
```
# Execution command
 According to [GitHub page](https://github.com/lengstrom/fast-style-transfer), it's shown how to execute these files below.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/fc201696-a930-b5d0-f387-c6a326189390.png)

``` Python 
!python evaluate.py --checkpoint ./wave.ckpt \  # The style file you want to use.
  --in-path ./stata.jpg \  # The original picture you want to transform.
  --out-path ./out.jpg     # name of output file
```

After execution this command, "out.jpg" is generated below.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/14a3f118-bae3-258a-f3db-f2a85acbcb6c.png)

# Result of Another Sample

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626074/ae0f6c32-d4ef-e35d-1061-fbf1be400ef8.png)

# References
**LINK**
  -> [GitHub:TensorFlow CNN for fast style transfer ](https://github.com/lengstrom/fast-style-transfer)
  -> [Pythonチートシート(for C++経験者)](https://qiita.com/ymd_/items/7348bd61205925ef5083)
  -> [Neural Style Transfer: Prismaの背景技術を解説する](https://elix-tech.github.io/ja/2016/08/22/art.html) 
  -> [Pythonでの数値計算ライブラリNumPy徹底入門](https://deepage.net/features/numpy/)
  -> [Python Basic - Pandas, Numpy](https://qiita.com/O-Mik/items/fc9e20e15cf1baa8a1ff)
Gitの最終コミット日時を任意のフォーマットで自動で取得、表示する

##やりたいこと
サイトトップに「最終更新日時：2020/05/01 12:23:00」と
Gitでの最終コミット時間を自動で表示。

##やったこと
サイトに最終更新日時を表示するだけなら方法は色々あると思いますが
今回は、本番反映を行えば自動で表示されるようにしたかったので
Gitフックを利用してマージ時に自動で日時をファイル出力しておき
サイト表示時に値を取得、表示という流れにしました。

###1.まずは最終更新日時の確認
下記コマンドで最終コミット日時を任意のフォーマットで取得できました。

```
git log --date=iso --date=format:"%Y/%m/%d %H:%M:%S" --pretty=format:"%ad" -1
```

###2.自動でファイル出力
post-mergeという名前で下記の内容を保存、プロジェクトの.git/hooks以下に配置。
これで、本番環境でmasterブランチをpull(fetch+merge)した際に自動で最終コミット日時がファイル出力されます。

```
#!/bin/sh
git log --date=iso --date=format:"%Y/%m/%d %H:%M:%S" --pretty=format:"%ad" -1 > last_commited_time.txt
```

###3.表示
あとは、プログラムから「last_commited_time.txt」を読み込んで表示。
表示方法は割愛。
CPU内蔵グラフィックスでブラウザが真っ黒になったら，一旦グラフィックスボードを入れてクセをつけるといいかもしれない。

プログラミング知識ではないけど。
AMD A10機をいじっていたら，ブラウザVivaldiが真っ黒になった。OSはWindows 10。やはり内蔵グラフィックスではダメか，とグラフィックスボードを入れたらちゃんと動いた。
その後，「ブラウザ　真っ黒」で検索すると，けっこうある事例のようだ。ブラウザのキャッシュが何とか，と書いてあるサイトがあったので，ひょっとして，とグラフィックスボードを抜いて内蔵グラフィックスに戻したらちゃんと動いた。
CPU内蔵グラフィックスでブラウザが真っ黒になったら，一旦グラフィックスボードを入れて動くんだ，とクセをつけるといいかもしれない。デスクトップ機でグラフィックスボードがあるという条件だけど。
Dockerを知らない社会人2年目の素人がDockerコンテナをRunしたことをちょっと深堀メモ（docker runとDockerHubとdocker image）

# docker run hello-worldの動作
```docker run hello-world```

- dockerはdockerコマンド
- runはサブコマンド
- hello-worldはイメージの指定

dockerクライアントからdockerデーモンが働き、ローカルで指定されたimageを検索しなければ、**①Docker Hubからhello-worldのimage検索、ダウンロード**する。その後**②dockerデーモンはimageを基にdocker containerを作成**、**③起動する**。docker containerが起動した際のメッセージがdockerクライアントに送られ、ターミナルに表示される。

こうした①～③処理自体にコマンドがある
1. imageの取得...```docker pull ```
2. containerの作成...```docker create ```
3. containerの起動...```docker start ```

丸ごとひっくるめて```docker run ```となっている

# Docker Hubとは？
**imageがたくさん保存されている外部サイト**
個人でも保存できるし、公開もできる。https://hub.docker.com/

<img width="944" alt="docker image official.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542515/98d379b9-d4b4-d168-ac8a-914c7e4b0141.png">
↑hello-worlrdを検索した図。とりあえず使う場合はOFFICIAL IMAGEと入っているものを使うとよい(Docker社による審査がされているらしい)

ページ詳細を確認すると使い方がわかる。

タグ指定などでversion名を管理することもある```image名:タグ```
↓一番新しい更新のhello-world（最新とか限らないので注意）
```docker run hello-world:latest```
↓python3.6のimage
```docker run python:3.6``` 
などがある。

# そもそもdocker imageとは？
**コンテナ実行に必要なファイルをまとめたファイルシステム**

- imageとなったデータは読みとり専用
- 複数のレイヤが積み重なっている
- imageがcontainerになるときに読みとり可能なレイヤーが追加される

**レイヤーの組み合わせが自在**

- レイヤーは組み合わせて使えるLinux imageにpython3.7 image載せたり。
- ただし、imageとしてのレイヤーは残ったままなので、定期的に見直しが必要。
- 軽量が売りのcontainerでもレガシーの遺産が積み重なると身動き取れなくなってしまう
GCPのBigQueryへテーブルデータを書きこむ

datastoreへデータを書きこむと同時に、書きこんだ内容を分析用にBigQueryにも書きこみたかったのですが、
一行ずつ書きこんだり、はすぐに見つかったものの、やりたいことどんぴしゃな情報をみつけるまで時間がかかったので、ちょこっとメモ。

ローカルのpandas.DataFrameをBigQueryへ書きこむ方法になります
# clientの取得
本記事の対象外です。

```
from google.cloud import bigquery

bq_client = bigquery.Client() # 必要に応じてproject_id等渡して下さい
```

# 書き込み

[insert_rows_from_dataframe](https://googleapis.dev/python/bigquery/latest/generated/google.cloud.bigquery.client.Client.html#google.cloud.bigquery.client.Client.insert_rows_from_dataframe)を使います。

```
write_table_data = pd.DataFrame({"x": [1,2,3]})
target_table_id = "example_project.example_dataset.example_table"
bq_client.insert_rows_from_dataframe(
    bq_client.get_table(target_table_id ), 
    write_table_data )
```
こんな感じです。
書き込み先テーブルについてget_tableを使うか、selected_fields 引数でスキーマの指定を行わないとエラーを吐きます。

#参考
公式：https://googleapis.dev/python/bigquery/latest/generated/google.cloud.bigquery.client.Client.html#google.cloud.bigquery.client.Client.insert_rows_from_dataframe
GPS-RTK基地局関係のFAQ

##GPS−RTK基地局関係のFAQ

参考資料
中部大学海老沼先生のNTRIP解説記事
https://blog.goo.ne.jp/osqzss/e/a43cd4c7b9a763db9bc25853e09b31c0

##補足説明
以下は私個人の認識です。

##rtk2goが不安定 or 繋がらないんだけど
http://www.rtk2go.com:2101/SNIP::STATUS
中間よりちょっとしたぐらいに、IP BANNEDってのがあるので、BANされてないかチェック。

##SNIPとかntripcaster以外のソフトないの？
A.RTKLIBにあるstrsvrとstr2strとか。
あと使ったことないけど、こんなのもあります。
https://github.com/eringerli/RpiNtripBase

##RTCM3とRTCM3.3の違いって何？
A.RTCM3とか3.2はTrimbleとか測量界隈の標準規格。
RTCM3.3は私が知る限りU-Blox社のオリジナル規格で、RTCM1008が定義されてないらしい。
RTCM3.2の機材ではRTCM1008が定義されてないと、計算結果がバグってFIXしないらしい。

##なんでそんなややこしい事になってるの？
A.大人の都合かな？いちユーザとしては良くわからない。

##RTCM 1008が入ってないってわかってるなら、何とかゴニョゴニョすれば同じじゃね？
A.実際にゴニョゴニョするプログラムが海外フォーラムにあります。最初の投稿ではRaspberryPiでPython使った実装、Arduinoとかの実装もあります。
Trimble等にゴニョゴニョしたデータを流したら、FIXしました。
あとぐぐったら、こんなのもありました。
https://github.com/eringerli/RpiNtripBase

##それってFIXは信用できるの？
A.検証ヒトバシラーよろしくおねがいします。

##逆にRTCM3.2とか3.0をu-bloxの機材に流したらFIXするの？
ホクレンRTCMはRTCM3だったと思いますが、農業情報設計社のGminiRでFIXしているようなので、使えるんだと思います。

##安定しないんだけど？
だいたいはLTEとか３G回線、WiFiが不安定なのが原因。パケ詰まりしやすい機種は何をどうやってもダメなので諦めましょう。
稀にタブレット本体の熱暴走とか、セキュリティ関係のアプリの誤動作とか。
セキュリティグループとネットワークACLのステートフル・レスの勘違い

#はじめに
ステートフル・レスはアプリケーション層とネットワーク層で異なっており、掲題の2種はネットワーク層の意味合いで認識する必要がある。

#アプリケーション層とネットワーク層での認識の違い
【アプリケーション層】
ステートレス：前回通信のデータを保持しており、状況に応じてリクエストに対するレスポンスが変化する。
ステートフル：前回通信のデータを保持しておらず、どんな状況でもリクエストに対するレスポンスが一定である。

【ネットワーク層】
ステートフル：パケット情報に基づいて、戻り通信の可否を動的に実施する。
ステートレス：戻り通信の可否を設定する必要がある。

セキュリティグループ、ネットワークACLでは【ネットワーク層】の意味合いとなる

#セキュリティグループとネットワークACLについて
AWSサービスのネットワーク通信を制御する機能
※下記はざっくりした違い

|比較項目      |セキュリティグループ  |ネットワークACL  |
|-------------|---------------------|-----------------|
|設定単位  |インスタンス|サブネット|
|通信許可設定|許可のみ(ホワイトリスト型)|許可または拒否（ブラックリスト型）|
|ステートフル/レス|**ステートフル**|**ステートレス**|

セキュリティグループはステートフルのため、戻り通信の設定が不要ということになる。
#最後に
用語だけ調べて理解しようとすると、何となくわかった気になって先に進んでしまう。今後は本質を理解するために、具体例等を参考に学習しようと思う。
#参考
https://it-trend.jp/firewall/article/60-0009
#Ruby  warning: The called method `xxx' is defined here ( Ruby 2.7 )

This warning tell you line troubled method 

メソッド実行でwarningが出た時に、元のメソッドの行数を教えてくれているだけっぽい

```rb
def foo(x:, y:) # Troubled method
end

foo({x: "x", y: "y"}) # Troubled execute
```

```
example.rb:4: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
example.rb:1: warning: The called method `foo' is defined here
```

# Original by Github issue

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Ruby 2.7 でキーワード引数とハッシュの自動変換が非推奨になった ( deprecated hash and keyword args automatic converting )

[Ruby 2.7.0 リリース](https://www.ruby-lang.org/ja/news/2019/12/25/ruby-2-7-0-released/)

# 概要

- キーワード引数を受け取るメソッドなのに、ハッシュを渡していても、今までは特に何も怒られなかった
- キーワード引数を受け取るメソッドには、キーワード引数を渡すようにすること
- 二つの違いが、Rubyの古いバージョンでは曖昧だった (なんか曖昧だなとは思っていた)

# キーワード引数を受け取るメソッド

```rb
def foo(x:, y:)
end
```

# キーワード引数での呼び出しの例

メソッド実行の引数に直接 key / value を書く

```rb
foo(x: "x", y: "y")
```

# ハッシュでの呼び出しの例

メソッド実行の引数をブレースで囲って key / value を書く
(ブレースで囲うものが、そもそも Hash なので)

この書き方はNGとなる

```rb
foo({x: "x", y: "y"})
```

# ハッシュをキーワード引数として渡したい場合

ダブルアスタリスクを付けると、ハッシュをキーワード引数に変換してメソッドに渡せる

```rb
foo(**{x: "x", y: "y"})
```

この例だと全く意味はないが、ハッシュが変数の場合は有用

```
hash = {x: "x", y: "y"}
foo(**hash)
```

# 逆パターン

ハッシュを受け取るメソッドでは

```rb
def bar(h = {})
end
```

ハッシュを引数にできる

```rb
bar({ x: "x", y: "y" })
```

キーワードも引数にできる

```rb
bar(x: "x", y: "y")
```

曖昧さが残ったままだが、このパターンはRuby3 になっても使い続けられるらしい

# 他の例

公式を参照

[Ruby 2.7.0 リリース](https://www.ruby-lang.org/ja/news/2019/12/25/ruby-2-7-0-released/)

要するに曖昧さがなくなればOK


# Code

```rb
# receive keyword args method
def foo(x:, y:)
  p x
  p y
end

# OK
# Pass keyword args
foo(x: "x", y: "y")

# OK
# Pass hash but convert as keyword args explicity
foo(**{x: "x", y: "y"})

# OK
# Pass hash but convert as keyword args explicity
hash = {x: "x", y: "y"}
foo(**hash)

# NG
# Pass Hash Args
# warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
foo({x: "x", y: "y"})



# Receive hash method
def bar(h = {})
  p h[:x]
  p h[:y]
end

# OK
bar({ x: "x", y: "y" })

# OK
# Call with keyword argus but NO ERROR!
bar(x: "x", y: "y")


```



# Original by Github issue

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











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【SQL】JOINの使い方・テンプレに当てはめればキーがわかる・自分用



JOINを一言で表すと、

###外部キーを持つテーブルと主キーを持つテーブルを結合させるよ！


という意味になります。


##使うタイミング、条件
・テーブルが2つある。
・2つのテーブルに外部キー、主キーが存在する。
・2つのテーブルはそれぞれ親、子の関係である。


##例題

playersテーブルにcountriesテーブルを結合させたい。

テーブルは以下の2つが存在します。

・playersテーブルにcountry.idというカラムがある。
・countriesテーブルにcountries.idがある。

##考え方

###参照する、されるという考え方

例題が「playersテーブルにcountriesテーブルを結合させたい」ということなので、例題を言い換えると

#####playersテーブルがcountriesテーブルを参照する
#####countriesテーブルはplayersテーブルに参照される

と言う関係になります。

###どっちが主キーでどっちが外部キー？

ということは、

#####playersテーブルのカラムが外部キーになり

#####countriesテーブルのカラムが主キー

になります。

###つまり言い換えると

#####参照される側（countriesテーブル）が親になり、主キーを持つ。

#####参照する側（playersテーブル）が子になり、外部キーを持つ。

になります。

したがって、テーブルの親と子の関係は

#####playersテーブルが子供、countriesテーブルが親になります。


では問題に移ります。

問題を日本語に直すと下記のようになります。

```
SELECT カラム名
FROM 外部キーを持つ子テーブル    が     #参照するので子テーブル
JOIN 主キーを持つ親テーブル      を     #参照されるので親テーブル
ON 外部キーを持つ子テーブル.外部キーであるカラム名 = 主キーを持つ親テーブル.主キーであるカラム名;   #結合する

```


そして、SQLに直すと

```
SELECT *
FROM players
JOIN countries
ON players.country_id = countries.id ;
```

こうなります。

結合条件ON ~の部分は逆でも動くようですが、

セオリー通り
```ON 外部キーを持つ子テーブル.カラム名 = 主キーを持つ親テーブル.カラム名;```
にしましょう。
Fastlaneだけで証明書の作成から, TestFlightのアップロードまでやってみる

# はじめに

Fastlaneで証明書の作成からTestFlightへのアップロードまでやる記事です。
gymはいろんな記事転がっているから好きなようにしてもらうとして, その前後もいろいろやる話です。

※ この記事のコードはすべて経験をもとにしてでっち上げたコードになります。
一切動くかもわかりません。

# アプリの作成

アプリの作成は[produce](https://docs.fastlane.tools/actions/produce/)でできます。

こんな感じ

```sh
export FASTLANE_PASSWORD="itunesのパスワード"
fastlane produce  -a app_identifier --language Japanese --app_name アプリ名
```

さらにここにpush通知つけたいとかになるとFastfileを書く必要が出てきてこんな感じ


```ruby:Fastfile
default_platform :ios

platform :ios do
    
    lane :produce_push do |options|
        team_id = options[:team_id]
        app_name = options[:app_name]
        app_identifier = options[:app_identifier]
        itc_team_name = options[:itc_team_name]
        
        produce(
          app_identifier: app_identifier,
          app_name: app_name,
          language: 'Japanese',
          team_name: itc_team_name,
          team_id: team_id,
          skip_itc: true,
          username: "ユーザー名",
          
          enable_services: {
            push_notification: "on"
          }
        )
    end
end
```

# 証明書の作成

[match](https://docs.fastlane.tools/actions/match/)で作成します。
[fastlane matchの簡易使い方](https://qiita.com/Marimoiro/items/40325da6f85a06b2d51c)こんな記事も描いているので詳しいことはそちらで見ていただくとして。

```sh
fastlane match init
fastlane match appstore

export MATCH_PASSWORD="matchのパスワード"

fastlane match appstore --git_full_name gitのユーザー名 --username itunesのユーザー名 --app_identifier ${app_identifier} --git_url 管理用のgitのurl 
```

# ビルド

matchで証明書作ったのでmatchで登録する必要あり。（頑張れば手動もできるけどおすすめしない！）
[gym](https://docs.fastlane.tools/actions/gym/)とかいろいろ組み合わせてビルドする。

例えばこんな感じ

```ruby:Fastfile
        ENV["MATCH_PASSWORD"] = "matchで設定したPW"
        match(git_url: git_url, # matchの初期化で設定したurl
              type: "app-store",
              git_branch: master,
              app_identifier: [app_identifier],　
              username: "ユーザー名",
              readonly:true, # itunesのPWを入れたくないならこれ
              keychain_name: "fastlane", # keystoreデフォルトでいいならいらない
              keychain_password: "fastlane"
              )

        gym(workspace:XWORKSPACE,
            clean:true,
            scheme: "Scheme名", # Unityの場合は"Unity-iPhone",
            output_directory: "ipa出力先",
            export_method: app-store,
            xcargs: "PROVISIONING_PROFILE_SPECIFIER='#{provisioningプロファイル名}'"
        )
```

# アップロード

[deliver](https://docs.fastlane.tools/actions/deliver/)を使用してアップロードすればOKです。

例えば…こんな感じになります

```ruby:Fastfile
default_platform :ios

platform :ios do
    
    lane :deliver do |options|

    deliver(ipa:"ipa",
        skip_metadata: true,
        skip_screenshots: true,
        skip_binary_upload: true)
    end
end

```
ColaboratoryからGoogleDriveをマウントする

#始めに
備忘用にまとめます。
本記事は2020/5/1 時点ので筆者が調べた中で一番手間の少ない「ColaboratoryからGoogleDriveをマウントする」方法です。
他に最善の方法があればコメント願います。

# 問題：Colaboratoryにアップロードしたファイルが消えた。
Colaboratoryに生データファイルをアップロードして作業していたが、早速で問題が発生した。

検索してみると驚きの事実が判明した。
「Colaboratoryにアップロードしたファイルはランタイムがリサイクルされる毎に削除される」

# 解決策を探してみる
まずランタイムのリサイクルについて調べてみると以下の条件で実行されるらしい。

- ノートブックのセッションが切れてから90分経過する。
- インスタンス起動から12時間経過する。
- （手動でリサイクルする。）

毎回作業するたびにファイルをアップロードし直すのは面倒すぎる。

解決策を調べてみると「GoogleDriveにアップロードし、Colboratoryから参照する方法」があるらしい。

その方法を説明していた記事が複数あったが、最新は以下の記事の追記分。
[ColaboratoryでのGoogle Driveへのマウントが簡単になっていたお話](https://qiita.com/k_uekado/items/45b76f9a6f920bf0f786)

上記を試した結果、
「ファイルをアップロードし直す」作業については解消できた。
しかし、作業前に「ドライブをマウント」ボタンを押下する作業がある。

いろいろ試してみたがボタン押下を省略できなかった。。。（無念）

#対処方法まとめ

###GoogleDrive 側の操作
対象ファイルをGoogleDriveにアップロードしておく。（詳細は割愛）
https://drive.google.com/drive/my-drive

<img width="1005" alt="スクリーンショット 2020-05-01 11.41.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557349/d71734e3-ff0b-7962-1d47-0efa123e046a.png">


###Colaboratory 側の操作

Colaboratoryのノートを開き「フォルダ」ボタンを押下
<img width="445" alt="スクリーンショット 2020-05-01 11.33.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557349/91951898-9fc2-e466-f5fc-2a390774206a.png">

「ドライブをマウント」を押下
<img width="336" alt="スクリーンショット 2020-05-01 11.30.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557349/92ba369c-a59c-536f-d60a-ed9b5ce5996c.png">

「GOOGLEドライブに接続」を押下
<img width="871" alt="スクリーンショット 2020-05-01 11.31.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557349/b50acdb3-9612-2964-a872-d562b90112aa.png">

「drive」フォルダが表示されたらマウント完了
<img width="289" alt="スクリーンショット 2020-05-01 11.31.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557349/2b3de32d-6d1b-7010-4c0d-98f5034d780e.png">

**`以降、ランタイムがリサイクルされる毎に「ドライブをマウント」を押下すれば復帰できる。`**

### 補足
「My Drive」フォルダからアップロードしたファイルを参照できる。
<img width="277" alt="スクリーンショット 2020-05-01 11.31.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557349/74dcb6ff-d1f0-7822-e0fa-2a12944983a2.png">

対象ファイルを右クリック→パスをコピー　することも可能。
コピーしたパス：　/content/drive/My Drive/Colab_Data/titanic/raw/train.csv
<img width="552" alt="スクリーンショット 2020-05-01 11.31.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557349/213225aa-8389-4a0c-78f8-d73acc712a08.png">


以上です。
英語のいいテックニュースサイトの TOP4 Good Tech News Sites in English

ナマステ皆さん！！

今日は英語でいいテックニュースのサイトが紹介したいと思います。
英語はＩＴ世界のリンガフランカので、Qiitaを読むの内容は昨日のニュースかもしれません！

##「英語ができないもん　:(」と思っているお友達へ

今日の一番ニュースは、君でも英語ができます！
俺の前の記事で書いてある指示の通り[「Bokura Jisho(LINK!)」](https://qiita.com/pineappledreams/items/d3c36b769bb1a995832a#%E5%A7%8B%E3%81%BE%E3%82%8B%E5%89%8D%E3%81%AB)というアプリエクステンションをインストールして、英語の読むことは楽勝になります。
ぜひ、お試してください！！

それでは、お紹介に行きましょう！！

## [#4 Ars Technica](https://arstechnica.com/)

![arstecg.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393501/93086704-015a-8969-c82c-97f6d26537f8.png)


面白さ：★★
英語の難しさ：★★★★

[「Ars Technica」](https://arstechnica.com/)は1998年から発行されています。
内容は幅広いです。プロダクトレビュー、アメリカの政治の展開、株の値段などなどが書いてあります。すごくドライな書き方ので、あんまりおもしろくないかもしれません。
開発者向けのニュースがあんまりないが、一般的なテックニュースに興味ある方へ向いてると思います。

## [#3 Wired](https://wired.com/)

![WIRED.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393501/6db55f03-6492-776a-4b27-627e70e9b88b.png)


面白さ：★★★★
英語の難しさ：★★★

[「Wired」](https://wired.com/)はレジェンダリーの
Wiredの日本語版のサイトから：

```html:www.wired.jp
『WIRED』はテクノロジーによって、生活や社会、
カルチャーまでを包括したわたしたち自身の
「未来がどうなるのか」についてのメディアです
```

レジェンダリー出版です。ArsTechnicaと比べると、ずっとテクノロジーや株の話ではなく、人間と技術はどの風に一緒に住めるのアングルで見ています。　そしてサイバーパンクの名人「William Gibson」はシンガポールの問題について記事を書きました。
[「シンガポールは死刑ありディズニーランドだ」と書きましたので、29年後でもシンガポールで好ましからざる人物に指定されています。](https://www.wired.com/1993/04/gibson-2/)
もしハードな技術の話が読みたくないなら、これはおススメができます！

[「Wired」](https://wired.jp/)日本語版もありますが、もう、カンニングしないでね！！

## [#2 Hacker News](https://news.ycombinator.com/)

![hackernews.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393501/46a10bca-12ca-0994-bc85-b0d5372cab95.png)


面白さ：　ランダム！
英語の難しさ：　ランダム！

[Hacker News](https://news.ycombinator.com/)はニュースサイトではなく、ニュースアグレゲーターです。世界中のナードたちはニュースサイトを読んで、面白い記事を見つけたら、HackerNewsに投稿します。そして他のギークはいいね！か悪いね！の投票します。結構いいシステムので、面白い記事を探す時間がない時、このサイトはおススメができます!

ちなみに、Hacker Newsをやっている会社[「Y Combinator」](https://ja.wikipedia.org/wiki/Y%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8D%E3%83%BC%E3%82%BF_(%E4%BC%81%E6%A5%AD))はサンフランシスコで一番有名のシードアクセラレーターです。必ず、覚えておいてくださいね！

## [#1 Hacker Noon](https://hackernoon.com/)

![HackerNoon.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393501/2ed15cb9-cba3-d92d-7d05-2826aa093035.png)

面白さ：　★★★★★
英語の難しさ：　★★★

最後でいちばんおもしろいサイトを紹介したいと思います！
[「Hacker Noon」](https://hackernoon.com/)です！！
見た目はちょっと90年代っぽいけど、このサイトとの面白いポイントは三つです：

- 記事を書いてる人は記者ではなく、ギガオタクです。アフィリエイトコンテンツはほぼないです！
- 開発者向けの新しい技術の紹介記事、開発やり方、ポストモーテムなどなど、開発者向け記事がはいっぱい！
- 君もHacker Noonで投稿ができます！

え、俺も投稿ができるって？　そうだ、英語で面白い記事を書いたら、このサイトで右上の「Start Writing」をい押すと、自分の記事が発行ができます！　

**どのどれがつまらない、ニュースサイトが一番好きですか、かならず下のコメントに書いてください！　お待ちにしています！**
ブロック構文がいつまでたってもわからない

泣きそう……。合ってんのかわからない。

<h1>具体例１</h1>
>```objective-c
>void (^myFunction)(int) = ^(int i){ printf("%d\n",i); };
>```
>このブロックを呼び出すときはこのように書きます。

>```objective-c
>myFunction(3); // 3
>```

(＊1より引用)

<h1>具体例１を読む</h1>
引かせていただきました……。ともかく具体例を読めるようになりたい。

まず、上のコードの左辺が意味しているのは、
・myFunctionはブロックだよ
・voidを返すよ
・Intを引数に取るよ
ということ。並び順はメソッドの宣言と変わらないので、それほど難しくないはずなのだが、メソッド名にもカッコがついているのが個人的には読みづらい。

右辺が意味しているのは、
・iはintの仮引数だよ
・具体的な処理は{}の中だよ
ということ。なんにせよカッコが多くてわかりづらいが、読めないではないかも。

実際に使ってみた下のコードは特に読みづらい点はない。

<h1>具体例２</h1>
>```objective-c
// 引数にブロックオブジェクト
- (void)setBlock:(BOOL (^)(int i, int j))block;
// 戻り値の型 (^)(引数リスト)ブロック名
>```
>```objective-c

>// hogeメソッドの戻り値として"BOOLを戻り値とするブロックオブジェクト"を返す
>- (BOOL (^)(int, int)) hoge;
>- // 戻り値の型 (^)(引数リスト)
>```

(＊１より引用)

<h1>具体例２を読む</h1>
再び引用。上のコードが意味しているのは、
・setblockというメソッドの引数にブロックを取るよ
・そのブロックはBOOLを返し、２つの引数をとり、blockという名前で扱うよ
ということ。大きく分けると、（ブロックの情報）ブロック名、という作りになっているが、^がカッコの中に入っているのが不可解。
……と思っていたが、こう並べてみるとうまいこと解釈できなくもない？

```objective_c
// 通常の宣言方法
void (^myFunction)(int)

// ブロックを引数に取る場合
(BOOL (^)(int i, int j))myFunction;
```
ブロックを引数に取る場合は、ブロック名（この場合ではmyFunction）が後ろに来てしまう。それを念頭に見比べてみると、引数に取る場合の記法は、通常の記法から、ちょうどブロック名だけを後ろに追いやった形に見える！！つまり、(^)の解釈は、後ろに書いてあるブロック名が省かれたもの、ということでよいのかな……？

下の例では、そもそもブロック名が省略されているので、この書き方になる、と考えるとよいのだろうか？？


＊１:<a href="https://qiita.com/motokiee/items/03a4225e613d640027ea">Objective-Cのブロックの書き方一覧 - Qiita</a>
GCP アップデート (5/1-5/7 2020)


### Data Catalog: [Apr 30, 2020](https://cloud.google.com/data-catalog/docs/release-notes#April_30_2020)
- データカタログがGAに！！
  - v1 API、gcloud、UIが利用できるようになったよ。
  - メタデータがリージョンごとに管理されるようになったよ。
  - 課金も開始(なので試したけど使わない場合は止めたほうが良さそう。)

### Config Connector: [Apr 30, 2020](https://cloud.google.com/config-connector/docs/release-notes#April_30_2020)
- Examplesを修正したよ。
- いくつかの処理のメモリ使用量やCPU使用率を減らしたよ。
  - manager controllerのCPU要件は100mから200mに上がった。
- webhookがHTTP受けられるようになってから、シグナルを送るように改善。

### Dialogflow: [Apr 30, 2020](https://cloud.google.com/dialogflow/docs/release-notes#April_30_2020)
- [Avaya](https://cloud.google.com/dialogflow/docs/integrations/avaya)とのワンクリック連携がベータに。

### BigQuery DTS: [Apr 30, 2020](https://cloud.google.com/bigquery-transfer/docs/release-notes#April_30_2020)
- 台湾(asia-east1)で使えるようになったよ！

### Operations (monitoring): [Apr 28, 2020](https://cloud.google.com/stackdriver/docs/release-notes#April_28_2020)
- Linux向けの5.x版のモニタリングエージェントがdeprecatedになったよ。
- stack-install.shとinstall-monitoring-agent.shを使ってインストールするのがdeprecatedになったよ。

### Dataproc: [May 1, 2020](https://cloud.google.com/dataproc/docs/release-notes#May_01_2020)
- webのエンドポイントにセキュアにアクセスできるようにする、Dataproc Component Gatewayがベータになったよ！

### BigQuery: [May 1, 2020](https://cloud.google.com/bigquery/docs/release-notes#May_01_2020)
- JSONの中身をstringのarrayとして抜き出せる、[JSON_EXTRACT_ARRAY](https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_extract_array)が使えるようになったよ！
- ``ORDER BY``が新しく``NULLS FIRST``と``NULLS LAST``を使えるようになったよ！

### CDN: [May 1, 2020](https://cloud.google.com/cdn/docs/release-notes#May_01_2020)
- 新しく[機能をまとめたページ](https://cloud.google.com/cdn/docs/features)が追加されたよ。

### Cloud SQL (MySQL): [May 4, 2020](https://cloud.google.com/sql/docs/release-notes#May_04_2020)
- 1st Genのインスタンスが全て2nd Genにマイグレされたよ。

### Dialogflow: [May 4, 2020](https://cloud.google.com/dialogflow/docs/release-notes#May_04_2020)
- 7つのインテグレーションのシャットダウンが6/6まで延長さたよ。
  - 対象は[ここ](https://cloud.google.com/dialogflow/docs/release-notes#January_06_2020)チェック

### DLP: [May 4, 2020](https://cloud.google.com/dlp/docs/release-notes#May_04_2020)
- 名前検知の品質とパフォーマンス向上が今後数日でロールアウトされるよ。

### Dialogflow: [May 5, 2020](https://cloud.google.com/dialogflow/docs/release-notes#May_05_2020)
- エージェントのエンティティやトレーニングで利用した文言、会話の状態等に応じて自動で検知効率を上げてくれるauto speech adaptationがGAになったよ！

### Traffic Director: [May 6, 2020](https://cloud.google.com/traffic-director/docs/release-notes#May_06_2020)
- 外からメッシュ内へのingressに関する[ドキュメント](https://cloud.google.com/traffic-director/docs/traffic-director-ingress-traffic)が新しく追加されたよ。

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
Photoshopで動画をGIFにする

### やりたいこと
6秒ほどの動画をphotoshopでGIFに変換したい！

### 手順
1. スマートオブジェクトとして動画をphotoshop上で開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409130/2d78c524-1c12-8412-a513-a89aebdb3d94.png)

2. 画面下に出てくる、動画のプレビュー欄で、`ビデオタイムラインを作成`する

3. 書き出しで、「web用に保存」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409130/2e8f2d34-d439-4c76-9aca-240f6ba9fba2.png)

4. 保存形式が`GIF`になっている事と、ループオプションが`無限`になっている事を確認し、保存

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409130/3a0b7b05-ae9a-534e-06c7-bd5c99114de7.png)


おわり
Git 変更を一時的に退避する $ git stash

# 目的

- 毎回調べて実行しているので、`$ git stash`コマンドの基礎的な使い方をまとめる


# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| Git バージョン | 2.25.1 | Homwbrewを用いて導入 |

# 変更箇所を一時的に退避する

- 下記コマンドをGit管理されているディレクトリで実行する。

    ```terminal
    $ git stash
    ```
- 新規作成ファイル意外の修正が一時的に退避される。

# 退避している変更を確認する

- 下記コマンドを実行して退避している変更の一覧を出力する。

    ```terminal
    $ git stash list
    >スタッシュ識別子: WIP on ブランチ名: 直前コミットのコミットID 直前コミットのコミットメッセージ
    ```

# 退避している変更を現ブランチに反映する

- 下記コマンドを実行して退避している変更を反映する。※退避した際のブランチと現ブランチが別でも反映できてしまうため注意する。
- xには一覧を出力した際の`{}`の中の数字が入る。(「stash@{0}」の退避を反映させたい場合は`$ git stash apply stash@{0}`となる)

    ```terminal
    $ git stash apply スタッシュ識別子
    ```
Vueで整数値をv-forするときに、整数値をtextboxから変更するとおかしくなる問題を解決する

# 概要
`v-for`を使って動的に変化する整数値ぶんDOMを作成したいさいに少しハマったのでメモです

こんなコードを書きました

HTML

```html
<div id = "vue">
    <input type="button" @click="add" value="add">
    <input type="number" v-model="count">
    <div v-for="n in count">{{count}}</div>
</div>
```

JS

```js
let app= new Vue({
    el : "#vue",
    data : {
        count : 2
    }
    methods : {
        add : function(){
            this.count++;
        }
    }
})
```
期待する内容としては、`count`の数に応じて`div`を複数生成していくだけのシンプルなものです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148084/9a909954-719e-0855-c849-aebe261c6be9.png)
# 問題
`add`で`count`を増やしていく場合は問題なくdivも増えていったのですが、`textbox`から直接値を修正すると以下のような問題が起きました

`5`と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148084/2a35a109-570d-563e-60b1-cfb5c4ddc18a.png)
`10`と入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148084/21305995-34f7-03d3-e774-2d2cefe50d76.png)

# 原因と解決方法
これは、`textbox`から`v-model`で値が渡る際にstring型になってしまっていることが原因です。なので、10,100,1000とcharが増えるごとに`v-for`でループされていくことが確認できます。

回避するには以下のように書き換えます
HTML

```html
<div cd = "vue">
    <input type="button" @click="add" value="add">
    <input type="number" v-model="count">
    <div v-for="n in parseInt(count,10)">{{count}}</div>
</div>
```

JS

```js
let app= new Vue({
    el : "#vue",
    data : {
        count : 2
    }
    methods : {
        add : function(){
            this.count++;
        }
    }
})
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148084/f86f9b23-0391-9396-29e6-117f20521000.png)

これで問題なくループしました
`SyntaxError: Cannot use import statement outside a module` JSでimportの箇所でエラー起きる

### エラー
```
(node:211) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
~/getMessageOnSlack.js:1
import axios from 'axios';
^^^^^^

SyntaxError: Cannot use import statement outside a module
```

### 解決法
エラーが言っているように、package.jsonに`type:module` を追加するだけ

```package.json
{
  "name": "",
   .
   .
   .
  "type": "module",
}

```
fastlaneで管理している場合にSign In with Appleの権限を追加する

# 結論
fastlane側にコマンドを追記して実行かと思っていたが、Developer Centerで権限を操作してprovisioning profileを再取得するだけだった。。。

# 手順

### 環境
Xcode: 11.1.0
fastlane: 2.145.0

### Xcodeで権限追加
Signing & Capabilitiesで権限を追加

<img width="967" alt="スクリーンショット 2020-05-01 11.38.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9186/cf85c51a-9299-94db-7e40-979837f362a6.png">

### Developer Centerで権限追加
Identifiers > 変更したいものを選択 > Sign In with Appleにチェック

<img width="1053" alt="スクリーンショット 2020-05-01 11.40.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9186/0cf4dd60-e2bb-9974-aa3e-0f42a1fb5aca.png">

保存する際に以下のダイアログが出るのでconfirm
（ここで再生成されるって言ってますね。。。

<img width="496" alt="スクリーンショット 2020-05-01 11.42.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9186/7c2ebf3c-4438-c368-6145-7daca18bcee0.png">

### fastlane
provisioning profileを取得し直す

```
    desc "Renew develop provisioning profile."
    lane :force_develop do
        match(
            type: "development",
            app_identifier: app_identifier,
            force: true
        )
    end
```

コマンドを定義しておき実行するだけ。
エンジニアなるまでの道のり　転職活動

##IT業界の調査
IT業界について調べましょう
ITの中でもどこの業界に行きたいのか、何か作りたサービスがあるのか
インフラ業界、ネットワーク業界、ソフトウェア業界、ハードウエア業界、web業界、ゲーム業界など

##プログラミング言語の調査
各プログラミング言語の特徴、どう言う所（会社や現場など）で使われるかの調査


- Java　
 - システム　大規模プロジェクト　スーツ割合多
- JavaScript　
 - webフロントエンド　私服割合多
- PHP　
 - webバックエンド　HP　システム　スーツ、私服
- Ruby　
 - webバックエンド　私服割合多
- C系
 - 情報系　スーツ割合多
- Python　
 - 機械学習　webバックエンド　

みたいな感じで
やりたい事の確認にも繋がります。

## プログラミング学習
ある程度のアプリ制作して
自分のコード理解、人に説明できるようになれるくらいまで
自分は300時間くらいかかった

##面談・面接で重要な事
 - 自分のストーリー、キャラクターを起承転結で伝えられる具体的エピソードの用意

 - 相手に想像させれるかどうかを知識を織り混ぜながら伝える
 
 - 浅い知識でもは武器にできるように深い話になった時の逃げ道、逃げ方を考え用意しておく

 - 1番重要なのが、質問をしまくる事
質問することで、興味心をアピール、相手の好みを確認できる時間つくり

##まとめ
興味が出たなら、一つの意見、考えを追うのではなく
広い目で全体像をみた方が良いのではと言う事
後は決めたなら進むのみ
【SQL】GROUP BYの使い方自分用


GROUP BYを一言で言うと、

**カラム名ごとにカラムを計算などをした結果を表示するよ！**

と言うことです。

##使用するタイミング
主にカラム名ごとに数字（得点など）を合計、平均したい際にgroup byが使われます。


##例題
出身国ごとの合計得点数を取得したい。

テーブルは以下の通り。
レコードは省略します。

| id               |       name        |    goals           | height  |   country_id     |
|:-----------------|------------------:|:------------------:|:-:|:-:|
|              |               |                |   |   |
|            |             |              |   |   |
|              |               |                |   |   |
|                |                 |                  |   |   |
|              |              |              |   |   |
|         |            |             |   |   |


とりあえず例題を日本語に直すと、以下のようになります。

```
SELECT カラム名1、カラム名2  #複数指定する
FROM players
group by カラム名2;
```
そして、

```
SELECT sum(goals),country_id
FROM players
group by country_id ;
```

こうなります。

country_idごとにgoalsを足した値を表示するよ！ということになります。

使用するタイミングだけ覚えておけばそこまで難しくない？
カラムごとに数字を計算して、データを抜き出したいタイミングで使用します。
Vueのwatchで自分自身の状態を変更したときに変な動き

Vue 2.6.11 で確認

v-modelでバインドした変数を監視したとき、
つまり

```html
<div id="app">
  <div>
    <input type="checkbox" v-model="check" />オンにならないはず
  </div>
  <div>{{ getString(check) }}</div>
</div>
```

こんなんがあって、

```javascript
new Vue({
  el: "#app",
  data: {
    check: false,
  },
  methods: {
    getString: function(target) {
      return JSON.stringify(target);
    },
  },
  watch: {
    check: function(){
      if (this.check) {
        this.check = false;
      }
    }
  }
});
```

チェックボックスオンにするけど、watchで監視して、trueになったらfalseにするようにしているので、想定では、このチェックボックスはオンになることはない

が、

変数checkはfalseにはなるが、画面上の表示はチェックボックスがオンとなる

困った

のでこうした

```javascript
  watch: {
    check: function(){
      if (this.check) {
        setTimeout(() => {this.check = false}, 0);
      }
    }
  }
```

この動き、Vue 2.2.1では、setTimeoutかまさなくても、チェックボックスオフとなった。
Modeler Flowでバージョンを保存する

Watson StudioのModeler Flowはフローが自動保存されます。
途中で落ちたり、ネットワークが途切れてしまっても、作業を失わないということで便利なのですが、一方で元に戻したいというときに戻したいという要望もあったりします。

この要望をかなえる機能としてバージョン保存の機能があります。

View outputand versionsというタブの中にあります。Save Versionボタンをクリックするとバージョンが追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7b8300f8-19c7-9b2d-2139-13f2f5deb9d9.png)

鉛筆ボタンをクリックすると名前も変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f05177c0-9124-245d-9cf0-3277bd1fa099.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/17819c5b-162b-1cc0-6e9a-5f8d27a24e6a.png)

集計ノードを追加して、さらにバージョンを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c7712c06-476b-df27-7d5e-37aef8346724.png)

Version2ができたので、追加前のVersion1に戻します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/730ca068-5b62-3901-7499-c156b060caa3.png)

警告が出ますがRevertします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d0407196-61a5-0a9b-5f6b-f7c070a82bb8.png)

Version1に戻り、集計ノードがなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3981c0f4-787b-95e2-7ac0-148a1d11390b.png)

Version2に進めることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/70757113-b86a-b62e-33d4-ff1969bf595e.png)

集計ノードが復活しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f45cfa67-a39b-0fd3-6e56-784511bf4b2c.png)

保存できるバージョンは10個までなので、不要になったバージョンは削除もできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/adbc5d7b-4367-b937-5bf3-6f653f5eb7f4.png)

警告がでます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b33dfa52-68f9-041d-5e9c-9e5b5490d5d9.png)

Version1は削除ができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/173580d4-8650-de36-8ca4-1b14714188e6.png)
HDD消去ソフトについて

#はじめに
データ消去ソフトについて、考えさせられることがあったのでメモ代わりに書いてみます

ちょっとまえ、神奈川県情報おもらし事故が発生したしちゃんと消去しましょうね

#消去方法
はい。wikipediaに詳細に書いてありましたね
[データの完全消去](https://ja.wikipedia.org/wiki/データの完全消去)
親切です

NISTとか米空軍方式の資料を読むと10％くらいサンプリングして検証しろよでしょうか
ディスクダンプでも取ればいいのかな？

https://cryptome.org/afssi5020.htm#Chapter
https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-88r1.pdf

#ほんとに消えてんの？

DDコマンドだったり、DBAN使うなり好きに消去すればいいと思うし１回でも全書き込みすれば復元できないと思うけど
ちゃんと消えていることを証明できるの？といわれると回答に困ることがあります
※フリーソフト使って消しましただと、客から突っ込まれる場面が(実際言われた)
　説明しても納得しねーんだよな


で、なにかないかなと探していたら”一般社団法人 情報機器リユース・リサイクル協会(RITEA)”という団体がソフトウェアの認証をしていた


[一般社団法人情報機器リユース･リサイクル協会(RITEA)](http://www.ritea.or.jp/index.html)

[情報機器の売却・譲渡時におけるハードディスクのデータ消去に関するガイドライン](http://www.ritea.or.jp/eh_guide.html)
[RITEA認定パーソナルコンピュータ内蔵ハードディスクドライブデータ消去ソフトウェア資格](http://www.ritea.or.jp/eh_shikaku.html)




*2020/05/01時点でHP上に記載された情報をそのまま転載

パーソナルコンピュータ内蔵ハードディスクドライブデータ消去ソフトウェア
[UEFI仕様対応版]
（1）ターミネータ10plusデータ完全抹消
　　（AOSデータ株式会社）
（2）DataSweeper Ver 1.9x
　　（アドバンスデザイン株式会社）
（3）FlashErase UEFI v1.0x
　　（株式会社ウルトラエックス）
（4）Blancco Version5.x
　　（開発元：Blancco oy ltd．
　　国内総販売代理店：株式会社ブランコ・ジャパン）
パーソナルコンピュータ内蔵ハードディスクドライブデータ消去ソフトウェア
[BIOS仕様対応版]
（1）ターミネータ10plusデータ完全抹消（Windows PE版）
　　（AOSデータ株式会社）
（2）DataSweeper Ver 1.9x
　　（アドバンスデザイン株式会社）
（3）FlashErase v2.0x
　　（株式会社ウルトラエックス）
（4）Blancco Server Edition Version4.1x
　　（開発元：Blancco oy ltd．
　　国内総販売代理店：株式会社ブランコ・ジャパン）



決して回し者ではありません


第三者が認証したソフトウェアを使っていますよーで、納得してもらう
もしやマッチポンプ？
バカっぽいけど、こんな手段が手っ取り早いか
【Unity】特定のシーンに移ったタイミングでBGMを変更する方法

#環境
Unity 2019.3.7f1

#はじめに
図のように特定のシーンでだけBGMを変更する方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/0bb73d95-4e64-02aa-117e-cb231656c8c7.png)

次の知識の組み合わせで設定できます。
・シングルトン設定
・音楽再生
音の基本：https://qiita.com/Maru60014236/items/94a017ae59306929dbfb
・デリゲート
参考記事：http://nn-hokuson.hatenablog.com/entry/2017/05/29/204702
・関数
関数の基本：https://qiita.com/Maru60014236/items/412925cdefd7a462caf8
・シーン遷移
・if文の複数条件



#コード
空のオブジェクトにこのコードを割り当てて使用する。

```CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; //追加！！

public class test5 : MonoBehaviour
{
   //シングルトン設定ここから
    static public test5 instance;

    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(this.gameObject);
        }
        else
        {
            Destroy(this.gameObject);
        }

    }
    //シングルトン設定ここまで




    public AudioSource A_BGM;//AudioSource型の変数A_BGMを宣言　対応するAudioSourceコンポーネントをアタッチ
    public AudioSource B_BGM;//AudioSource型の変数B_BGMを宣言　対応するAudioSourceコンポーネントをアタッチ

    private string beforeScene;//string型の変数beforeSceneを宣言 
        
    void Start()
    {
        beforeScene = "Scene1";//起動時のシーン名 を代入しておく
        A_BGM.Play();//A_BGMのAudioSourceコンポーネントに割り当てたAudioClipを再生

        //シーンが切り替わった時に呼ばれるメソッドを登録
        SceneManager.activeSceneChanged += OnActiveSceneChanged;
    }

    
    

    //シーンが切り替わった時に呼ばれるメソッド　
    void OnActiveSceneChanged(Scene prevScene, Scene nextScene)
    {      
            //シーンがどう変わったかで判定
            //Scene1からScene2へ
            if (beforeScene == "Scene1" && nextScene.name == "Scene2")
            {
              A_BGM.Stop();
              B_BGM.Play();
            }

            // Scene1からScene2へ
             if (beforeScene == "Scene2" && nextScene.name == "Scene1")
             {
              A_BGM.Play();
              B_BGM.Stop();
             }         


        //遷移後のシーン名を「１つ前のシーン名」として保持
        beforeScene = nextScene.name;
    }
}
```

**ポイント**
・シングルトンのオブジェクトにする。
・現在のシーンと遷移先のシーンが一致したタイミングで音声を切換え　

#おわりに
void OnActiveSceneChanged(Scene prevScene, Scene nextScene)
のprevSceneの引数の情報はうまく扱えなかったので使用していません。
【Swift】プロジェクト作成時に生成されるMain.storyboardを削除する

# はじめに
**Main.storyboard** を使わずに、
自分で作成した Storyboard から ViewController を生成してルートに設定したい時などで
最初に躓くのが **Main.storyboard** の削除とその後の設定だと思います。

その辺りの情報が少なかったので、自分がいつもやっていることをまとめます。

# 環境
Xcode 11.4
Swift5
iOS 13.4

# Main.storyboard を削除する
まずは早速 **Main.storyboard** を削除します。
それに加えて **ViewController.swift** も使用しないので削除します。

次に新しくルートに設定したい Storyboard と ViewController を作成します。
自分は RootViewController という Storyboard と ViewController を作成しました。

ではこのままの状態でビルドして実行してみます。
すると実行はできますが、こんな感じのエラーがでてクラッシュします。

```
 Terminating app due to uncaught exception 'NSInvalidArgumentException',
 reason: 'Could not find a storyboard named 'Main' in bundle NSBundle
```

**Main** という名前の Storyboard を探しにいったけど、見つからなかったというエラーです。
先ほど **Main.storyboard** は削除したので、見つからないと言われるのは当然ですね。

このエラーはアプリ実行時に起動する Storyboard が **Main.storyboard** に設定されているため発生しています。
なので、起動する Storyboard の設定を変更します。

## 起動する Storyboard の設定を変更する
起動する Storyboard は Xcode の **Main Interface** と Info.plist の **UISceneStoryboardFile** という項目で設定されています。

ここを新しく作った RootViewController に設定する方法でもルートを指定することができますが、
アプリ起動時の初期画面を条件に応じて切り替えたい時など、初回起動時に何かしたい場合はその方法では対応できないので、`SceneDelegate` でルートを指定するやり方で進めていきます。

`SceneDelegate` 上でルートを設定する場合は、**Main Interface** の設定は使用しないので、
デフォルトで設定されている **Main** を削除して空白にします。
<img width="760" alt="スクリーンショット 2020-05-01 9.55.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202306/75571cae-7dfc-b157-3a7a-7caa72f665d5.png">

info.plist の **UISceneStoryboardFile** も使用しないので項目ごと削除してしまいます。
![Frame.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202306/e86181c8-d4cf-ff97-1683-c086c7453a8f.png)

## SceneDelegate でルートを指定する
最後に `SceneDelegate` でルートになる ViewController を指定します。
Storyboard を使用する場合は ViewController を Storyboard から初期化するようにしてください。

```Swift
// SceneDelegate.swift

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        
        // UIWindow のインスタンスを作成
        window = UIWindow(windowScene: windowScene)
        // rootViewController にルートにしたい ViewController を指定
        // UIStoryboard の instantiateInitialViewController() を使用して
        // Storyboard から ViewController を生成
        window?.rootViewController = UIStoryboard(name: "RootViewController", bundle: nil).instantiateInitialViewController()
        window?.makeKeyAndVisible()
    }
}
```

これで実行すると指定した ViewController が表示されると思います。
Excel スタイル 一括削除 VBA

```vb
Sub delstyle()
  Dim s
  Dim count As Long
  Dim styeles As Long
  count = 0
  styleCount = ActiveWorkbook.Styles.count
  For Each s In ActiveWorkbook.Styles
    If Not s.BuiltIn Then
      s.Delete
      count = count + 1
      If count Mod 100 = 0 Then
        Application.ScreenUpdating = True
        Application.StatusBar = count & "/" & styleCount & "個目の処理中"
        Application.ScreenUpdating = False
      End If
    End If
  Next
  Application.ScreenUpdating = True
  Application.StatusBar = "完了"
End Sub
```
WSLでホットリロード効かない or コンパイル遅すぎ問題


# TL; DR

ホットリロード (Hot Module Replacement) を伴う開発をWSL(WSL2)上でするときは `/mnt/c/Users/username` と `/home/username` にまたがってやりとりしてはいけない．WSL側で実行しているパッケージマネージャー (`npm`, `yarn`, `webpack` など)がマウント先のWindowsシステム側を見に行くとそれがボトルネックになってつらい．


# 何が起きた

Windows 10 Home で WSL2が使えるし色々機運もあってvueを始めるかということになった．Ubuntu 20.04も入れてWindows Terminal を開き，`n` => `node` => `yarn` =>  `@vue/cli` とインスコした．`$ vue create hello-world` からの `$ cd hello-world && yarn serve` で開発サーバを立ち上げてみるものの，いっこうに立ち上がらない．まぁ最初はこんなもんかとチュートリアルを見つつ `App.vue` をいじってみるも一向にページが反映されない（ホットリロードってやつがデフォルトで機能しているのではないのか？）．
`vue.config.js` のwebpack側の設定をいじることで強制的にホットリロードできるように再設定したものの，今度もクソほど遅い．フロントエンドの開発ってこんなにもストレスフルな中で頑張っているのか……（勘違い）

![slow_yarn_serve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219661/9eebf781-5713-357e-4181-84596c7acd19.png)

いや1分以上暗い画面眺めさせられる気持ちを考えてくれよ…


# 試したこと

コンパイルやら変換（bundle？）ってやつが遅いのではないかと思案し，webpack側がおかしいことを疑う． `worker` `memory limit` という表示を見かけて，そちらが逼迫しているのかもしれないと思い，どうにか調整する．が，変化なし……．

webpackを高速にする小手先テクニックを探るもほぼ変化なし．

`ESLint` やら `Prettier` が悪さをしているのかもしれないと考えた．整形機能は正常に動くし，サクサクなのだが……そもそも雛形のHello-Worldの時点で問題が起きてるのだから，悪さをしているとも考えにくい．う～ん．

# 原因

WSL側に実行パスがあるのにわざわざマウント先のCドライブ内までファイルを見に来ていたことが原因だった．

Windows TerminalでWSLを開くとデフォルトのディレクトリがwindows側のユーザーホームディレクトリになっている．GUIエディタではwsl上のファイルを編集するのは骨が折れる場面もあるかとおもい ①実行はWSL上 ②ファイル実体はWindowsのCドライブ上　で行なう構成にしていた．

# 解決

実行環境とファイル実体を同一環境にすればいい．

コマンドプロンプトやPowerShellにnode環境を用意するのは億劫に感じたので，wsl上で実行しwsl上にファイル実体がある構成にすることを考えた．

![fast_yarn_serve.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219661/1ff106e2-0e76-79b6-aa13-0a58d2a5f87b.png)

- 改善前：  83384 ms
- 改善後：　  346 ms

正直ここまで速度に違いがあるとアホらしくなってしまう．ばかなのか？

# 新たな問題と解決策

wsl上ですべて行えば問題は生じないということがわかったが，このままではかの有名な emacsやらvimやらで涙を流しながらプログラムを書くことになる．ただでさえ慣れない言語に挑戦しようというのにエディタの使い方まで同時に学ぶのは流石に苦痛過ぎる．

というわけで Vscode (insiders) の [Remote - WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl) を使うことにした．これがあれば，wsl上のファイルをストレスなく編集できる．emacsやvimに魂を売り渡す必要はなくなる．

- [【Remote - WSL】VScodeの新機能でWSL上にローカル開発環境を構築する - Qiita](https://qiita.com/_masa_u/items/d3c1fa7898b0783bc3ed)



# 参考文献

- [Hot Module Replacementの設定と仕組みを理解する - Qiita](https://qiita.com/haradakunihiko/items/40486ec2b6b9aea119bb) 
- [Ubuntuに最新のNode.jsを難なくインストールする - Qiita](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)
- [【メモ】Vue CLI でホットリロードが効かない - Qiita](https://qiita.com/ntm718/items/6023b0063f78d53192a1)
- [続・VSCode上でvueファイルに対してESLintとPrettierが快適に動作する設定 - Qiita](https://qiita.com/fukasawah/items/03fa205353ac03b06b7e)
- [Remote - WSL - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl)
- [【Remote - WSL】VScodeの新機能でWSL上にローカル開発環境を構築する - Qiita](https://qiita.com/_masa_u/items/d3c1fa7898b0783bc3ed)
【rails】deviceを使ったとき　configure_permitted_parameters　について

##目的
deviceを使ったときApplicationControllerに必要な記述として下記のものがある。
ちんぷんかんぷんだったので、自分なりにまとめた。


```application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters , if: :devise_controller?

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :avatar])
  end
end
```

##1.before_action
これはコントローラーのフィルターだ。
application_controller.rbに記述することで、全てのコントローラーの実行前にアクションさせるので、ビフォーアクション。

    before_action :configure_permitted_parameters , if: :devise_controller?

:devise_contoller?とはdeviseを生成した際にできるヘルパーメソッドの一つで、deviseにまつわる画面に行った時に、という意味がある。こうすることで全ての画面でconfigure_permitted_parametersが起動する。

つまりもしそれがdeviseのコントローラーだったら（devise_controller?というメソッドの返り値がtrueだったら）configure_permitted_parametersを呼ぶ。

##2.configure_permitted_parameters

```application_controller.rb
def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :avatar])
  end
```

ここの記述ではデバイス版のストロングパラメーターだ。
デバイスでは初期設定でメールアドレスとパスワードしか許されていない。
ここを編集することでユーザーネームなどを入れることができる。
今回の例だとnicknameとavatarカラムへの保存を許可する。
##捕捉
デバイスには３っのアクションしかありません。それらの名前とデフォルトで許可されるパラメーターは次のとおりです。

・sign_in（Devise::SessionsController#create）-認証キーのみを許可します（などemail）
・sign_up（Devise::RegistrationsController#create）-認証キーに加えてpasswordおよびpassword_confirmation
・account_update（Devise::RegistrationsController#update） -認証キーを許可し、プラスpassword、password_confirmationおよびcurrent_password

これらに追加するためにapplication_controller.rbへのbefore_actionの記述が必要になってきます。

##参考文献
https://github.com/heartcombo/devise
https://qiita.com/okamoto_ryo/items/52e3506e06c27631395e
https://qiita.com/yoshimitsu41/items/ba5487e18278822828a3
zsh に tmux を導入

# `zsh` に `tmux` を導入する

`tmux`をインストールする。

```zsh
$ brew install tmux
```

`.tmux.conf`を作成し、以下を設定する。
今回は、必要最低限の設定のみ。カラーはターミナル設定を引き継ぐ。

```zsh
#
# キー
#

# prefixキーを[C-b]を解除して、[C-t]に変更
unbind-key C-b
set -g prefix C-q

# [|] でペインを縦分割する
bind-key | split-window -h

# [/] でペインを縦分割する
bind-key / split-window -v

# 設定ファイル再読み込み
bind-key r source-file ~/.tmux.conf \; display ".tmux.conf Reloaded!"

#
# ステータス
#

# ステータスバーを上部に配置する
set -g status-position top

# Windowのindexを1から始める
set -g base-index 1

# Paneのindexを1から始める
setw -g pane-base-index 1

#
# マウス
#

# マウス操作を有効にする
set -g mouse on
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
bind -n WheelDownPane select-pane -t= \; send-keys -M

#
# カラー
#

# 256色端末を使用する
set -g default-terminal "xterm-256color"
set -g terminal-overrides "term:colors=256"
```
【SQL】サブクエリの使い方（where、不等号）自分用

題材はプロゲートを参考にしました。


例題
平均得点数より得点数が多い選手名を調べたい。

テーブルは以下の通り。

| id            |       name |    goals    |         height          |
|:--------------|------------------:|:------------------:|:------------------:
|  〜レコードは各種省略〜             | 〜レコードは各種省略〜              | 〜レコードは各種省略〜               |                  〜レコードは各種省略〜 |
|            |   
|              |               |                |                   |
|                |                 |                  |                   |
|              |              |             |                   |
|       |            |          |                   |

上記のようなテーブルがあった際、例題通りのデータを取り出したい場合、

```
SELECT 選手、得点数
FROM playerテーブル
where 得点数が > (
select 平均得点 from playerテーブル
);
```

日本語を散りばめると以下のようになります。そして、

```
SELECT カラム名
FROM テーブル名
where カラム名 > (
select カラム名 from テーブル名
);
```



こうなります。最終的には、

```
SELECT name,goals
FROM players
where goals > (
select avg(goals) from players 
);
```

こうなります。


###例題
グレーパーカーより値段が高い商品の名前と値段を取得する。

テーブルは以下の通り。

| Left align       |       Right align |    Center align    |
|:-----------------|------------------:|:------------------:|
| This             |              This |        This        |
| column           |            column |       column       |
| will             |              will |        will        |
| be               |                be |         be         |
| left             |             right |       center       |
| aligned          |           aligned |      aligned       |


```
select name, price
from items
where price > (
select price from items
where name = "グレーパーカー"
);
```

###例題

7000円以下の商品で、グレーパーカーより利益が高い商品


####考え方
・7000円以下の商品かつ、利益が高い商品をまずselect文で取得。
・サブクエリ内で名前がグレーパーカーである利益を取得する。


```
SELECT name, price - cost            
FROM items            
WHERE price <= 7000 AND price - cost > (            
SELECT price - cost            
FROM items            
WHERE name = "グレーパーカー"            
);
```


###例題

平均以上の所持金を持っている人を取得する。

テーブルは以下の通り。

| userID    |       name |    gold    |
|:-----------------|------------------:|:------------------:|
|              |              |            |
|            |             |           |
|              |             |             |
|                |             |           |
|              |             |         |
|           |            |           |


```
-- 平均以上の所持金を持つユーザー数を表示する
SELECT userID, name, gold
FROM users
where gold >= (
select avg(gold) from users
);
```



##ポイント
where の後のカラム名とサブクエリ内のselectの後のカラムは同じ。平均とか合計とかは使える。


##注意

・サブクエリ内のテーブル名を忘れがちなので忘れないように指定する。

・日本語に置き換えて、SQL文にしてあげるのが理解しやすいと思います。
SQL文は英語と文法が似ているので英語を読むイメージで学習するようにしましょう。