OmniAICreator/Qiita-1.07M huggingface dataset:
199X年に書いたRuby 1.4/Perl 4のCGIを最新の環境で動かしてみた


# はじめに

ファイルを整理していたときに、昔書いたCGIが見つかりました。
せっかくなので、最新の環境で動くようにしてみました。

199X年なのは、いつ書いたかが曖昧だからです。
Rubyを使い始めたのが確か1.4で、
Ruby 1.4のリリースが1999/8なので、おそらく1999年だと思いますが・・・

# 構成

当時作ってたCGIは6本で、以下のようになっています。

- Perl 4: 2本
- Ruby 1.4: 4本→1本(減った理由はのちほど)

復活させたCGIは以下になります。

http://www.wakaba.jp/~ikemo/cgi-bin/mahjong.cgi

# 変更点(共通)

## EUC-JP → UTF-8

まずは全てのファイルのエンコーディングをUTF-8に変更しました。

## 汚染チェックを有効化

入力パラメータは「許可されたものしか使用していないこと」のチェックをしてたので
大丈夫だったのですが、念の為、汚染チェックを有効化しています。

- Perl: `-T`オプション
- Ruby: `$SAFE = 1`

## Content-Typeにcharsetを明示的に記載

記載しなくても大丈夫かと思いますがまあ念のため。

- 変更前: `Content-Type: text/html`
- 変更後: `Content-Type: text/html; charset=utf-8`

# 変更点(Perl)

## jcode.pl → Jcode.pmに変更

jcode.plを使っていたのですが、これはUTF-8に対応していません。
何かいいものがないかなといろいろ調べたところ、Jcode.pmというのを見つけました。

- [Jcode.pm](http://openlab.ring.gr.jp/Jcode/index-j.html)

これだけの変更で動きました。

```perl
require 'jcode.pl';
&jcode'convert(*value, 'euc');
```

変更後

```perl
use Jcode;
Jcode::convert($value, 'utf-8');
```

・・・ただそもそもjcode.plを使っていたのがフォームのデコードで、
しかもマルチバイト文字使ってないので不要っぽいと気づきました。
まあ今回の目的はベタ移植なのでそのままにしておきます。

## `@INC`からカレントディレクトリが削除

Perl 5.26より`@INC`からカレントディレクトリが削除されました。

- [第46回　Perl 5.26で変わること（1）：Perl Hackers Hub｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/perl-hackers-hub/004601)

今回はベタ移植が目的で、かつカレントディレクトリは安全だとみなせるため、
単にカレントディレクトリを追加しました。

```perl
BEGIN { push @INC, "." if $INC[-1] ne "."; }
```

# 変更点(ruby)

Rubyの方が変更点が多かったのですが、
どれもこれは今ならやらない書き方ですね。

## 環境変数を直接書き換えていた

こんなコードがありました。
[ENV](https://docs.ruby-lang.org/ja/latest/class/ENV.html)はfreezeされていたので動きませんでした。

```ruby
ENV['REQUEST_METHOD'].upcase!
```

直接書き換えないように変更しました。

## Array#filterがなかった

メソッドがなくなってました。ちょっとびっくりしました。

- 1.4: [Array](https://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/Array.html)
- 最新: [class Array (Ruby 2.5.0)](https://docs.ruby-lang.org/ja/latest/class/Array.html)

しかしそもそもそのCGIは使われていませんでした。
4本あったRubyのCGIのうち、3本が未使用でした。なので修正せず。

## 暗黙のグローバル変数に依存したコード

以下のようなコードが動きませんでした。
Perlの書き方の癖が抜けてなかったようです。

```ruby
while log.gets
  chomp!
  ...
end
```

こんな感じで書き換えています。

```ruby
while line = log.gets
  line.chomp!
  ...
end
```
初めてCloud9からGithubにソースコードを保存できたよ

こんにちは、かずまです。

初めてCloud9からGithubにソースコードを保存できました。
参考になった記事が下記です。とてもわかりやすいので、困ってる方いたらご覧ください。

https://qiita.com/NaokiIshimura/items/b318ebc2daa4ec07a31e
AndroidStudioで「Plugin Error: Kotlin threw an uncaught IllegalArgumentException」が出た時の対処法

# 事象

GradleのSyncが走った時に以下のようなエラーがASのEventLogに吐かれていました。

```
Plugin Error: Kotlin threw an uncaught IllegalArgumentException
```

# 原因

https://stackoverflow.com/questions/45717942/plugin-error-kotlin-threw-an-uncaught-noreadaccessexception

↑こちらの記事をみて、気づきました。

僕の場合Projectのbuild.gradleの`ext.kotlin_version = 1.2.10`がAndroidStudioのKotlinPluginのバージョンと違うことによってエラーが起きていた。。

# 対処法

AndroidStudioの「Preference > Plugins」からKotlinのバージョンを確認して、そのバージョンとProject配下のbuild.gradleで定義しているkotlinのバージョンを合わせればOKです。
Node のバージョンを上げたら Hexo が死んだ

## TL;DR
ndenv を入れて、 hexo のプロジェクトフォルダの node のバージョンを 6 に戻した。

## 状態
他のプロジェクトで必要だったため、 homebrew で node を upgrade した。
すると hexo の基本的なコマンドは実行されているらしいが deploy がうまくいかなくなった。
deployer には `s3-cloudfront` を利用していた。

## 試行錯誤

### deployer を変えてみた -> ダメ
普通の `s3`　にして cloudfront でのキャッシュクリアは手動にしようとした。
やってみたところ s3 へのデプロイ自体がうまくいっていないようだった。

### node のバージョンを戻したい -> ムリ
新しいプロジェクトで必要なので戻せない。

### 複数バージョンを使えるようにしよう
* nodebrew -> 毎回コマンドラインで切り替えるの面倒
* ndenv -> バージョン定義ファイルが増えるが、自動的に判定してくれて便利そう

## ndenv を採用
インストール方法は [こちらの記事](https://qiita.com/rkunihiro/items/28ba01deaf0798f05b31) を参考にしました。
記事では shell に bash だったけど、自分は zsh を利用しているため、 `~/.zshrc` に以下を追加

```.zshrc
# ndenv
export PATH=$HOME/.ndenv/bin:$PATH
eval "$(ndenv init - --no-rehash)"
```

## 無事デプロイができました
良き node ライフを！
SPAモードのNuxt開発サーバーからLaravelのAPIへアクセスする

# やりたいこと

同一サーバー上でLaravelのAPI(port:80)と、SPAモードのNuxt開発サーバー(port:3000)が共存している状態でNuxt(ブラウザ)からAPIにAjaxでアクセスしたい。

# 環境

Laravel 5.7.9
Nuxt.js 2.2.0

# 問題点

デフォルトだとCORSによりNuxt(ブラウザ)からLaravelにアクセスが出来ない。

# 対応方法

LaravelのCORS対応ライブラリを導入する。

[barryvdh/laravel-cors](https://github.com/barryvdh/laravel-cors)

導入方法は基本的にマニュアル通りだが、許可するアクセス元を念の為に下記のように制限しておく。

```php:config/cors.php
    //'allowedOrigins' => ['*'], ※こちらがデフォルト
    'allowedOrigins' => ['http://localhost:3000'],
```

以上でアクセスが出来るようになった。
"Accept interfaces, Return structs"が基本なのに、何でerrorはerrorで返すのか

表題の通り、Goのお作法に「インターフェースで受けて、実体で返せ」というものがあります。

http://idiomaticgo.com/post/best-practice/accept-interfaces-return-structs/

戻り値はなるべく具体的な型で書き、受け取る側が必要なインターフェースを定義して受け取るべき、というものです。

例えば `net/http` の `*Client` は具体的な型ですが、これを使う関数の引数をそのまま`*http.Client`とか書いちゃって、テストしづらくて詰む、なんてことはよくあります。

```go
func doSomething(c *http.Client) { // ←cを丸ごとモック化するのは不可能！！残念！！
    // ...
}
```

これを見て `net/http` が最初からインターフェースを定義しておくべきだったんじゃないか、みたいに思うかもしれませんが、そこは冒頭の作法に則っていると考えるべきです。

httpClientの場合、まあ単純なケースだと`Do`メソッドしか使わないと思います。なので、

```go
type Doer interface {
    Do(req *http.Request) (*http.Response, error)
}
```

みたいなのを **自分で** 定義して、

```go
func doSomething(c Doer) {
    // ...
}
```

こうすればいいわけですね。

最初からインターフェースで返してしまうと、実体のコードを追うのが難しくなってしまうため、こんなふうに書くわけです。


## errorの場合は？

例えばdoSomethingがMyErrorを返すことが分かっている場合、こう書けるじゃんと思うかもしれません。

```go
func doSomething() *MyError {
    // ...
        return new(MyError)
    // ...
}
```

しかし、Goのお作法的には常に `error` インターフェースを返すように書きます。これは、考えてみれば当然で、errorを作るのはこの関数だけとは限らないからです。

doSomethingに仕様追加があり、他の関数(エラーが起きるかもしれない)の呼び出しを追加したとしましょう。

```go
func doSomething() *MyError {
    // ...
        return new(MyError)
    // ...
    err := foo() // ←あっ、MyError型を返さない関数だ…
    if err != nil {
        return new(MyError) // 元のエラーを握りつぶすことになっちゃった…
    }
}
```

常にerrorインターフェースを返すように書いていれば、直接返せるようになります。

```go
func doSomething() error {
    // ...
        return new(MyError)
    // ...
    return foo()
}
```

それに、`error` ならこの戻り値がエラーであることが一目瞭然だというメリットもあります。というわけで、errorの場合はreturn structsの作法を無視して、error型で返すのだと思います。
Rubyで素数列挙

###Primeライブラリを使って実装
1~1000までの素数を列挙するとして実装すると

```ruby
require 'prime'
number = *1..1000
number.map{|n| puts n if Prime.prime?(n)}

#判定なんてしなくてもいいなら
puts Prime.each(1000).to_a
```

Primeライブラリを使えば簡単というか、あまりに溢れすぎていたRubyの模範解答になります・・。
これだと芸がないですし、素数判定のコードが組めるかどうかが大切な気もするので自作したコードが以下

###一般的な解き方
n-1までの要素で割り切れないならそれは素数だということをそのまま書いただけのコードになります。
実際にこの結論に到るまでは数時間以上要し文系の壁の高さを今一度認識しました・・。

```ruby
number = *1..100
def is_prime?(n)
    return false if n ==1
    (2..n-1).map{|i| return false if n%i==0}
end
number.map{|n| puts n if is_prime?(n)}
```

###解き方の実装がうまく出来なかった頃のコード

```ruby
for i in number
    a = number.slice(0,i-1).map(&:to_i).drop(1)
    next if i == 1
    next if i == 2
    # p a now it's i == 3 so a should be [1,2]
    a.map{|n| puts i if i%n!=0}
end
    #１で割れてしまうことを考慮したa配列の先頭排除が未実装の状態
```

作ってる最中では、n-1までの要素を`slice`メソッドで作成して要素同士の余りを求めればいいのでは〜と考えていましたが、実際にはfor文の変数を用いて配列aを作成しているために、aを`map`で回した際にiがダブって二重ループになってしまうので却下。
素数判定処理をループ外にメソッドとして作成して処理すれば解決出来ると、この結論に至ってより、メソッドを自作して処理したことがなかったので想定外に時間が掛かりました・・。

###なぜ記事を作ったのか・・。
PaizaやAOJなどの他の数多の問題ならいざ、素数判定コードは僕自身処理を複雑に考えてしまう癖があるので、就活の面談の際にどうしても二重ループ問題が解決できずにPrimeライブラリを使って実装したのですね・・。
どう考えてもこれはアウトだなーと結局ダメだったのですが、素数判定くらいの簡単なアルゴリズム？実装は出来なければまずいと思い立ち記事に残すことにしました。

素数判定の自作を含めてAOJの問題でも、頭では簡単に処理できる内容に〜・・がなかなか実装出来ずに他の方のコードを参考にすると実に簡単な処理である場合が多いので、AOJ以外にもアルゴリズムの勉強をすればサクサク書けるようになるのだろうか・・
backlog-jenkins-nginx-dockerでWebサービスを構築③

# jenkins と backlog の連携環境構築
[これ](https://qiita.com/sugimotosyo/items/21d19723f4004c31075e)の続き

[参考](https://qiita.com/foursue/items/7f5e37de8d073600cada)

# 「Publish over SSH」プラグイン

- jenkins のプラグインが有効であること jenkins の管理の利用可能タブから確認する。
- チェックをつけて再起動せずに設定

## 設定

1. 「Jenkins の管理」→「システムの設定」
2. 「Publish over SSH」→「Key」/root/.ssh/{key}の値を張り付ける。「Path to key」は空で OK
3. 「SSH Servers」→「追加」
4. 「Name」わかりやすい名前を入力
5. 「Hostname」Web サーバのローカル IP アドレス
6. 「Username」なんでもいい？もしくは deploy サーバーの ID
7. 「Test Configration」Success が表示されれば OK
8. 「保存」

# 「バックログ」プラグイン

- [プラグイン](https://plugins.jenkins.io/backlog)のアーカイブをローカルにおとして、「プラグインの管理」から「高度な設定」からアップロードする。

## 設定

1. 「新規ジョブ作成」→「ジョブ名」適当に入力
2. 「フリースタイル・プロジェクトのビルド」
3. 「OK」
4. 「backlog」を選択
5. 「URL」「ID」「PWD」を入力

# 「git」プラグイン

## 設定

1. 「認証情報」→「グローバルドメイン」→「認証情報の追加」
2. 「SSH ユーザ名と秘密鍵」を選択
3. 「秘密鍵」→「直接入力」を選択し、鍵に秘密鍵を貼り付け

- Backlog の git へアクセスできるユーザの公開鍵とペアとなっている秘密鍵
- deploy サーバーで作った秘密鍵


# ジョブを作ってデプロイする

## 設定

1. 「新規ジョブ作成」→「ジョブ名」を適当に入力
2. 「フリースタイル・プロジェクトのビルド」を選択して「OK」を押下
3. 「ソースコード管理」から「Git」を選択する。URL と追加した認証情報を設定する。URL は SSH 接続の Clone と同じ。
4. 「ビルド」→「ビルド手順の追加」→「Send files or execute commands over SSH」を選択
5. 「SSH Server」→「Name」に Web サーバの情報を選択。出てこない場合は「Publish over SSH」の設定を見なおしてください。
6. 「Transfers」→「Transfer Set」→「Source files」に「\*(すべてのファイルを指す)」を入力
7. 「Transfers」→「Transfer Set」→「Remote directory」に「/repo/プロジェクト名/リポジトリ名」を入力。deploy サーバーの/root 配下のここにソースが転送される。
8. 「Transfer Set」→「Exec command」に「./deploy.sh プロジェクト名 リポジトリ名の通り ブランチ名」を入力。Web サーバにあるデプロイスクリプトに引数をつけて指定
9. 「保存」を押下

# deployScript の作成

```
vi /root/deploy.sh
```

```
# ./deploy.sh {プロジェクト名} {リポジトリ名} {ブランチ名}

echo deploy job start

PROJECT_NAME=$1
REPO_NAME=$2
BRANCH_NAME=$3

cd /root/repo/$PROJECT_NAME/$REPO_NAME
docker build -f /root/repo/$PROJECT_NAME/$REPO_NAME/Dockerfile-$BRANCH_NAME -t localhost:5000/ci-$REPO_NAME-$BRANCH_NAME .
docker push localhost:5000/ci-$REPO_NAME-$BRANCH_NAME
cmd=`docker ps -q --filter name=ci-$REPO_NAME-$BRANCH_NAME`
name=`echo $cmd`
if [ "$name" != "" ]; then
docker rm -f ci-$REPO_NAME-$BRANCH_NAME
fi

docker run -i -d --rm --net=nginxproxy_default --name ci-$REPO_NAME-$BRANCH_NAME localhost:5000/ci-$REPO_NAME-$BRANCH_NAME
```

# WebHook の設定

[参考](https://qiita.com/foursue/items/7f5e37de8d073600cada)

```
https://{jenkinsサーバーのhost}/git/notifyCommit?url={gitリポジトリssh}
```

- 「設定」→「ビルド・トリガ」→「SCM をポーリング」にチェック
- これでプッシュすると Jenkins が動き出す。

# その他の Backlog との連携

- ビルド後の処理として、PR に通知

# 課題

- backlog と連携アカウント連携できない。
- branch などは渡すようにする
- webhook が一つしか登録できない。。。
- マージした PR 見れないし。。。
- backlog のプラグイン動かないし。。。
- 最新を持ってきちゃってるから、戻せないし。。。
久しぶりに触るとほぼ確実に忘れてるsmartyの変数代入


PHPとかばかり触ってると、つい ↓ みたいに変数に値を入れがちです。

```
$hoge="test";
```

smarty のテンプレートでこれやると

```
syntax error: unrecognized tag:
```

言われます。

一瞬、**なんでや。**

と思いますが、smarty の変数代入は↓

```
{assign var="ccnt" value=1}
```

**assign つける！！（だいたい忘れる）**
**var と value を分ける！！**

たぶんまた半年後に触ると忘れてるので、忘備録。
UNITY簡単のコードを書きます

##新しいスクリプトファイルを作る
　　Inspector画面でAddCompenentボタンをクリックする。
　　New Script を選んでファイルの名前を入力することです。そしてAssets画面に新しいスクリプトファイルに出てくる。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playerMovement : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}
```

↑には新しい自動で作るのコードです。

・void Startのコードはゲームで初めに時にこのコードは1回動きます。
・void Updateのコードは毎フレームこのコードは動きます。

## ゲームStartでコードを動きます。



```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playerMovement : MonoBehaviour {
　　//　このコードはオブジェクトのパブリック変数作る。
    public Rigidbody rb;

	// Use this for initialization
	void Start () {
　　　　　　//オブジェクトの動きを上げる（X、Y、Z）
        　 rb.AddForce(0,200,500);
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}
```

↑のコードをゲームStart時にオブジェクトを動きます。

![Screenshot_4.png](https://qiita-image-store.s3.amazonaws.com/0/286746/8f4aeca4-ad6e-6ecb-742b-40b8f9bd9199.png)

↑の画像はどんなオブジェクトが動きを与えたいを選ぶことができる。

## 毎フレームにコードを動く

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playerMovement : MonoBehaviour {
　　//　このコードはオブジェクトのパブリック変数作る。
    public Rigidbody rb;

    // Use this for initialization
    void Start () {
	}
	
    // 毎1秒はオブジェクトはz-axisで動く
    void FixedUpdate () {
        rb.AddForce(0, 0, 2000 * Time.deltaTime);
    }
}

```

↑のコードを毎1秒にオブジェクトを動きます。

ノート：なぜ「FixedUpdate」の名前を使いますか。その名前はPhysicsのRendererのためだから 。


GITHUB：https://github.com/andybit-okutama/Unity_Learn/
FILE：https://github.com/andybit-okutama/Unity_Learn/blob/master/2%20programming/Assets/playerMovement.cs
ビデオ：https://www.youtube.com/watch?v=9ZEu_I-ido4
学習画像オーグメンテーションの補助ライブラリ fusewarp を書きました

# はじめに

画像認識・物体検出などのタスクを学習させる際、しばしばデータオーグメンテーションが使われます。
画像のデータオーグメンテーション用のライブラリはいくつかあるのですが、物体検出やポーズ推定などで必要になるバウンディングボックスやキーポイントの変換を扱えるものが少ないです。[imgaug](https://github.com/aleju/imgaug)はキーポイントを扱えますが、下記の問題があります：

* 補間を繰り返し適用するため、計算効率が悪い
* 入力画像サイズが変動する場合に扱いにくい

キーポイントに関連する処理はホモグラフィ変換や画像切出しなどがありますが、これらは行列積でまとめて表すことができるため、画像補間自体は最後に評価することが可能です。この考えのもと、今回紹介するライブラリ*fusewarp* を作りました。

リポジトリはこちらです： https://github.com/stnk20/fusewarp

なお、つい先日にyu4uさんが似たような発想の[imgcrop](https://qiita.com/yu4u/items/ffcbf1d4003efae8e059)というライブラリを公開しており、こちらは関数ひとつだけのスマートな実装です。手軽に早く使いたい場合はimgcropをおすすめします。
*fusewarp* は座標変換をパイプラインとして書いていく方式なので、処理内容をひとつずつ指定したい場合には有用だと思います。

# インストール

pypiには登録していないですが、pipでインストールできます。

```
pip install git+https://github.com/stnk20/fusewarp
```

# サンプル

変換のパラメータは、imgaugと同様の方式を取っています。数値は固定数値、タプルは一様乱数、リストはランダム抽出です。
で、例えば画像10枚のサンプリングをする場合、こんな感じで書けます。
詳しくは[example](https://github.com/stnk20/fusewarp/tree/master/examples)を見てください。
パイプラインはいくら長くしても、3x3の行列積として処理していって最後に画像変換をするので、効率的に動作します（GridPerturbationは例外）。

```python:
import numpy as np
import cv2
import fusewarp as fw
from fusewarp import transform as ft

# データ準備
img0 = skimage.data.rocket()
keypoints0 = np.array([[323, 128], [202, 126], [447, 126], [198, 217], [451, 217]], dtype=np.float32)
height, width = img0.shape[:2]

# パイプライン構築
warp = fw.FuseWarp([
    ft.Scale((0.8, 1.2), resize=True),
    ft.Rotate((-10, 10)),
    ft.FlipLR(),
    ft.FrameRandom(300, 300)])

# サンプリングと変換実行
for i in range(10):
    warp.next_sample((width, height))
    transform = warp.get_transform()
    w, h = warp.get_size()

    img1 = cv2.warpPerspective(img0, matrix, (w, h))
    keypoints1 = transform(keypoints0).astype(np.int32)
```

# サポートする変換

主要な変換はサポートしています。GridPerturbationはホモグラフィ変換ではないですが実験的にサポートしています。
その他入出力の相互方向の座標変換が定義できれば、拡張することもできます。

* Translate
* Rotate
* Scale
* FlipLR
* FlipUD
* Shear
* Perspective
* ShiftBorder
* TrimBorder
* PadBorder
* Frame
* FrameRandom ("random cropping")
* FrameCenter ("center cropping")
* Resize
* GridPerturbation

ちなみに、Cropという単語は意味に揺れがある（縁を切り抜く/矩形を切り出す）ので、Frameという単語で置き換えています。

# 処理速度の比較

参考までに、Tensorflow(CPU/GPU), skimage, OpenCVで処理速度を比較した結果を貼っておきます。
数値としてはOpenCVが速いですが、モデルに直接流すならTensorflow GPUは良い選択になると思います。

```
Results in my laptop ( Core(TM) i7-7700HQ CPU @ 2.80GHz / Geforce GTX1050 GPU ) :

tensorflow-cpu
elapsed seconds per 100 images:  1.1677992343902588

tensorflow-gpu
elapsed seconds per 100 images:  0.14475488662719727

opencv
elapsed seconds per 100 images:  0.11846280097961426

skimage
elapsed seconds per 100 images:  2.898721694946289
```

# おわりに

htmlのドキュメントはまだ用意できていないですが、docstringは書いてありますので、よかったら使ってみてください。
【Veeam9.5】バックアップサーバーのホスト名を変更したらVeeamにログインできない

# 問題
Veeamバックアップサーバーのホスト名を変更すると、「Failed to connect to Veeam Backup & Replication server...」というようなエラーメッセージが表示され、Veeamのコンソールに入れなくなった。

#環境
- vCenter Server Appliance6.0.0
- ESXi6.0.0
- VMバージョン：11
- ゲストOS：Windows server 2012R2

# 原因
VeeamのSQLデータベースに登録されているバックアップサーバー名と変更後のサーバー名が一致しないため、Veeamのコンソールに入れなくなった。

#対処法
###①インストールされている[Configuration Database Setting]プログラムを開く。
ゲストOSはWindowsなので[Windowsキー]をクリックするか、[Windows+S]で探すと該当プログラムが見つかる。
###②[Veeam backup and replication]を選択し、[Next]をクリックする。
###③[Connection]-[Server name]の欄に新しいサーバー名を入力し、[Next]をクリックする。
※サーバー名のフォーマットは、**「ホスト名/SQLインスタンス名」**であるので間違えないこと。

###④データベースとの通信が完了したら[Finish]をクリックする。
しばらく時間がかかるが変更プロセスが完了すれば、コンソールを開くことができる。

#参考文献
- [Veeam Backup & Replication Console Fails to Open After a Hostname Change]
(https://www.veeam.com/kb2350)
【Swift】Optional型とアンラップの3つの方法


Swiftを始めた人が最初に出会うであろう、Optionalという謎の変数型のその取り扱い方を簡単に解説します。

##Oprional型ってなに？
Optional型を説明する前に簡単にSwiftについて知る必要があります。
Swiftの変数は基本的にnilを許容しません！

じゃあ、変数にnilが入る可能性のある時はどうすればいいの？

そんな時に使うのがOptional型です。
よくSwiftのコードサンプルに出てくる"?"はOptinal型の宣言です。
##Optional型の使い方
**変数宣言**

```optional.swift

var optionalVal: String?
```

これでStringのOptional変数の宣言が完了。
どんな変数型もOptional型として扱うことができます

Optional型の変数を使う時は、
nilが入っている場合を考慮してアンラップという処理をする必要があります。

**アンラップ①**

```optimal.swift

if let var = optionalVar { /*optionaiVarがnilでない時の処理*/ } 
```

**アンラップ②**

```optional.swift
guard let var = optionalVar else { /*optionaiVarがnilでない時の処理*/ }
```

①と②はオプショナルバインディングと言われる方法になります。

他には強制的にアンラップする方法もあります。
nilでも何でもいいから取り出しちゃえ！って方法です。
**※あまりお勧めしません**

```optional.swift
let ver = optionalVar!
```


使い慣れるととっても便利で可読性が上がります。
ぜひ、マスターして行きましょう〜！
DXFの「文字」をエディタで自作しました。行数をどこまで省略できるか調べました

(参考)DXFの「線分」をエディタで自作しました。行数をどこまで削除できるか調べました

https://qiita.com/mrrclb48z/items/5fea70462ac260756d3c

textAとtextBの2文字が表示されます。

``` dxf.dxf
  0
SECTION
  2
ENTITIES
  0
TEXT
  8
0
 10
1.0
 20
2.0
 30
0.0
 40
1.0
  1
textA
  0
TEXT
  8
0
 10
7.0
 20
6.0
 30
0.0
 40
1.0
  1
textB
  0
ENDSEC
  0
EOF
``` 


(参考)TEXT[文字記入] (DXF

https://knowledge.autodesk.com/ja/search-result/caas/CloudHelp/cloudhelp/2018/JPN/AutoCAD-DXF/files/GUID-62E5383D-8A14-47B4-BFC4-35824CAE8363-htm.html
ROMが外せるDigispark XCSOURCE TE769 

Amazonで ATtiny85がソケットに刺さった[マイクロUSB 開発ボード](https://www.amazon.co.jp/XCSOURCE-ATtiny85-20PU-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%ADUSB-%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89-IC%E3%83%81%E3%83%83%E3%83%97/dp/B074CWDLJX)なるものが売っていたので購入してみました。
![スクリーンショット 2018-10-30 21.16.59.png](https://qiita-image-store.s3.amazonaws.com/0/59911/80b9f1c8-45a6-64b5-a4c5-10c1112e6a76.png)

[DigiSparkと同じ手順](https://www.youtube.com/watch?v=MmDBvgrYGZs)で書き込み＆動作を確認できました。
焼いたロムを外してユニバーサル基板に取り付け、[ハロの目を光らせたりしています]
(https://www.slideshare.net/emesiwiysohnst/ss-116283549)。

![スクリーンショット 2018-10-30 21.27.34.png](https://qiita-image-store.s3.amazonaws.com/0/59911/b45b5741-4ff0-1ede-4d7b-c99ec6230eb9.png)


---
追記：aitendoに[同じもの](http://www.aitendo.com/product/16445)（多分）が1/3の値段で売っていました。。。
全てのリポジトリの作成日時・最終更新日時を得る


#はじめに

組織内のリポジトリの情報を俯瞰したくて GitHub を API で使ってみました。そのメモです。
まったく再利用性が無いですが、悪しからず。


#欲しかった情報

- リポジトリの一覧
- 各リポジトリの作成日時
- 各リポジトリの最終更新日時


#利用した API

省略。さーせん。
本当は API ID とか API Version とか整理されていると良いと思います。


#スニペッツ

言う必要はないと思いますが、下記はプレースホルダです。

|文字列|内容|
|:--|:--|
|hogehoge|トークン|
|nekomata|組織名|


##一覧を得る

```shell
#!/bin/sh

token=hogehoge

url='https://api.github.com/orgs/nekomata/repos?per_page=100'


curl -u ":$token" "$url&page=1" > rep-list-page-01.json
curl -u ":$token" "$url&page=2" > rep-list-page-02.json
curl -u ":$token" "$url&page=3" > rep-list-page-03.json
```

そーです、リポジトリ数の取得の方法については今回は調べていません。web page に表示されるんで。


##リポジトリのサマリを得る

```shell
#!/bin/sh

name=$1

token=hogehoge

url='https://api.github.com/repos/nekomata'


curl -u ":$token" "$url/$name" > summary-$name.json
```

#トークンについて

上記 API についてはリポジトリのアクセス権だけで十分です。
【Vue.js入門】v-on、v-forを使ってみよう！

# Vue.jsの入門で必ず出てくるv-onとv-for
**v-on**と**v-for**を使うことができれば以下のようなToDoアプリもすぐ作れました！
![Screen Capture 41.mp4.gif](https://qiita-image-store.s3.amazonaws.com/0/253605/e34b76c4-5d79-82df-801a-fce757875097.gif)

## 今回のつまづきいたところ
- addボタンを押してもページがリロードされる
- フォームに打ち込んだ文字が消えない

それではVue.jsだけで簡単なToDoアプリを作っていきましょう！

## まずは雛形をつくる
まずはJavaScript側。
[【初心者向け】Vue.jsの双方向データバインディング](https://qiita.com/watuyo_2/items/2da1a383508aeeabc047)と同じ作りをしているため、説明は簡単に書きます。


main.js

```js
(function(){
  "use strict";
  var vm = new Vue({
    el: '#app',
    data: {
      todos: [
        'task1',
        'task2',
        'task3'
      ]
    }
  });
})();
```
new Vueで新規作成したインスタンスを変数vmに与えます。
HTML側の"id=app"はCSSのセレクタ同様'#app'で呼び出します。
次にdataを用意してあげるのですが、今回は'task'を仮置きしています。
後ほど、この***'task'の下にフォームから入力された値を表示できるよう***にします！

index.html

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My Vue App</title>
  <link rel="stylesheet" href="css/styles.css">
</head>
<body>

  <div id="app" class="container">
    <h1>My Todo Lists</h1>
    <ul>
      <li v-for="todo in todos" :key="todo.id">{{ todo }}</li>
    </ul>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <script src="js/main.js"></script>

</body>
</html>
```
HTML側ではtitleを「My Vue App」とし、表題に「My ToDo Lists」としています。
ここででてくる**v-for**では先程main.jsで書いた、data内の配列todosを一つづつ画面にリストとして表示させるため、

```html
<ul>
  <li v-for="todo in todos" :key="todo.id">{{ todo }}</li>
</ul>
```
とします。
todosの中のtodoを一個づつfor文で取得しているイメージです。
尚、コメントをいただきました**v-for**にはkey指定が推奨されている件ですが、[公式ドキュメント](https://jp.vuejs.org/v2/guide/list.html)を確認し、追記いたしました。
>繰り返される DOM の内容が単純な場合や、性能向上のために標準の動作に意図的に頼る場合を除いて、可能なときはいつでも v-for に key を与えることが推奨されます。

雛形は以上です。

## ここからv-onが出てきます
まず、HTML側でリストの下に

```html
<!--　<form v-on:submit="addItem"> -->
<form @submit.prevent="addItem">
  <input type="text" v-model="newItem">
  <input type="submit" value="add">
</form>
```
を追記します。
基本はv-onですが**@**で省略も可能です。
**submit**(ボタンを押下)した時に**newItem**の値を**v-on**(**@submit**)というディレクティブを使って**todos**に追加できます。
ここで**submit**したときのメソッドを**addItem**と指定します。

## preventで無駄なページリロードを防ぐ
**@submit**のあとに出てくる**prevent**は**リロードを防いでくれます**。
これをしないと
![Screen Capture 42.mp4.gif](https://qiita-image-store.s3.amazonaws.com/0/253605/fecc6e1c-5288-3b9e-962e-454a0c825b15.gif)
リストに追加をしてもリロードしてしまって画面上に追加されません。

続いて、main.jsのdata内に**newItem: '',**を追加します。

```js
newItem: '',
```

## thisでdata内にアクセスする

**data**内には**this**を使ってアクセスできます。

```js
},
methods: {
  addItem: function(e){
  this.todos.push(this.newItem);
  this.newItem = '';
 }
}
```
**this.todos**で配列にアクセスし、**this.todos.push**とした後に**(this.newItem)**とすることでnewIemがtodosの末尾に追加され、li要素に反映されるようになります。
このままでは、**add**した後にフォームに値が残ったままになるので**this.newItem = '';**を追加し、配列に値をpushした後は**newItem**空文字にすることでフォームに値が残る心配がなくなります。

[サンプル](https://codepen.io/tsu2626/pen/GYaoNL)もありますのでお試しください！

※2020年1月更新
##MENTAでコードレビューやプログラミング勉強相談を行っています！
お気軽にメッセージを下さい！
[プラン](https://menta.work/plan/1461)はこちらになります！
米国は周辺に近づくと痛みに耐えられないレーザー兵器を研究している。

<p>レーザーは日常生活の中で広く使われています。<a href="http://www.laserscheap.com/laserpointer-green-3000mw/p-2.html">レーザーポインター</a>は主に、物体の表示、工学の建設および建設のアライメント測定、医療手術および医療美容ケアに使用される。 低出力レーザーは、表示や星の観察に最適です。 100mWを超えるレーザを燃焼試験に使用した。 高出力の第4級（IV）級レーザーは、主に試験、研究、軍事分野で使用されています。</p>
<p><a href="http://www.laserscheap.com/laserpointer-blue-60000mw/p-207.html"><img src="http://www.laserscheap.com/images/p/m/180824/HQB05600100.jpg" alt="レーザー武器"/></a></p>
<h2>レーザー武器は知っていますか。</h2>
<p>現在多くの国の軍は<strong>レーザー兵器</strong>を積極的に研究しており、米国も例外ではありません。<br />
<br />CNETの報道によると、米海兵隊は新しいレーザー兵器を開発しているが、それは強力で致命的な武器ではなく、敵の警告である。<br />
<br />具体的には、レーザー兵器システムは、半径1000メートル以内の人間に警告することができます。この警告は、この領域で痛みを耐えがたくするなど、効果的な傷害になる可能性があります。 人間の肌には強くて耐え難い感覚のような物理的なダメージは即座に止まります。<br />
<br />>米国海兵隊の目的は、敵を破壊するのではなく、致命的な力を必要としない群衆、内戦、その他の状況に対処することです。 その機能は、レーザーを使用して、持続可能で制御可能なプラズマを生成し、警告および停止するためのさまざまな非致命的な効果を生成することです。</p>
<p>現在のところ、このレーザー兵器は依然としてコンセプト段階にあります。<br />
</p>
クロージャの変数値はいつ束縛されるか

何が出力されるでしょうか[^1]。

```php:PHP
$int = 1;
function foo(){
	$int = 2;
	
	$bar = function() use($int){
		return $int;
	};
	
	$int = 3;
	return $bar();
}

$int = 4;
echo foo(); // ???
```

JavaScriptであれば、答えは`3`です。

```js:JavaScript
int = 1;
function foo(){
    int = 2;
    bar = function(){
        return int;
    }
    int = 3;
    return bar();
}

int = 4;
foo(); // 3
```

JavaScriptの場合、関数を呼び出したときの変数の値が使われます。
逆に言うと、関数定義時には変数が定義されている必要すらありません。

```js:JavaScript
function foo(a){
	return a + b;
}

foo(1); // b is not defined

b = 2;
foo(1); // 3
```

letやconstを使わないかぎり、うっかり変数名が被っただけで死にます。

PHPの場合は、useしたときに変数が定義されていなければUndefined variableになります。
ということでPHPでの答えは`2`です。

[マニュアル](http://php.net/manual/ja/functions.anonymous.php)にもしっかり書かれています。

> 引き継がれた変数の値は、関数が定義された時点のものであり、関数が呼ばれた時点のものではありません

PHPには、JavaScriptのように使用時の変数を反映させる方法はありません。

```php:PHP
$foo = function () use (&$bar) {
    return $bar;
};

$bar = 1;
echo $foo(); // 1

$bar = 2;
echo $foo(); // 2
```

ありません。


そもそもPHPでクロージャを使うメリットがわかりません。
というか、実はそれ以前に、冒頭のコードは関数ではなく実行結果を返しているのでクロージャですらありません。
何がしたかったんだこのコード。


[^1]: PHP技術者認定試験の問題集に出てきた。
package-lock.json yarn.lock をコンフリさせない方法

`yarn.lock` が意図しないときに更新されてコンフリすることありませんか？
この問題をバージョニングを固定して解決する Tips の紹介です。
環境は `yarn 1.9.4` npm でも大きくは変わらないものと思われます。

## 前提

なぜ `yarn.lock` が必要か。
より正確に依存を記述して再現性を担保するためです。
[yarn.lock](https://yarnpkg.com/lang/ja/docs/yarn-lock/)
ではなぜ `package.json` でそれが担保できないか
`^`, `~` というバージョン指定に振れ幅があるからです。
[semver](https://docs.npmjs.com/misc/semver)

この前提を知っていれば意図せず `yarn.lock` が更新されているという疑問にはならないだろうと思うので補足です。

この semver というバージョニングの手法は軽微なバグ修正によって、引き起こる変更を取り込みやすくするという意図のもので個人的にはポジティブです。一人で開発するならこれを利用して開発するだろうと思います。
一方 Git による共同開発の場面では、これによっていらぬコンフリが起こってしまうこともあります。これを防ぐために バージョニングを固定する方法を記します。

[追記 2019/2/12] 
yarn は yarn.lock のコンフリクトを解消する機能を持っています。
以下の内容ではなく、ベストなのはこの機能を使うことだと思われます。
https://code.fb.com/developer-tools/announcing-yarn-1-0/

一応内容は残しておきます。

## 作業

```
$ cd ${cwd}
$ touch ./.yarnrc`
$ echo "save-prefix """ >> ./.yarnrc`
```
あとすでに記述されている `packge.json` も当然編集が必要です。

一応公式にはこれで .yarnrc を追加できるような物言いをしているんですが、私はできませんでした。書いてはおきます。
自分はこの issue の手順通りやったまでです。
https://github.com/yarnpkg/yarn/issues/3045　

```json
$ yarn config set save-prefix false
```

また .yarnrc の内容も

```json
save-prefix false
```

と書いても良さそうだったのですが false がなぜか文字列として認識されてしまって `false1.0.0` みたいなことになってしまいます。😔


## 注意
node modules のバージョンアップを恐れない姿勢でないならば、こういう運用はオススメはできません。おそらく npm の場合 2 年程度放置するだけでバージョンアップに追いつけないものになってしまう可能性があるからです。ある程度バージョニングにバッファを持たせて細かくエラーに対処する方が気にしなくてよくて持続的でしょう。

とはいえ yarn が適宜 deprecated になった api などを警告してくれるので、きちんとそれを解決しておけば大きな問題にはならないだろうと思っています。

以上

## 追記

yarn install で 自動でコンフリクトを解消してくれる機能があります。yarn を使っている場合はそちらの機能を使ってコンフリクトを解消した方がいいでしょう。
leafletを鍛える。その15

#概要

leafletを鍛えてみた。
マーカーを次々、表示してみた。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/2/k/c/2kcc.jpg?t=1540898932)

#サンプルコード


```
var map = L.map('map').setView([35.7, 139.7], 12);

L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', {
    attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);

var k = 0;
var marker;
var train = trains[k];
marker = L.marker([train.location.lat, train.location.lon], {
    title: train.train_number
}).addTo(map);
function next() {
    k++;
    if (k > train.length) k = 0;
    map.removeLayer(marker);
    train = trains[k];
    marker = L.marker([train.location.lat, train.location.lon], {
        title: train.train_number
    }).addTo(map);
    marker.bindPopup('title: ' + train.train_number );
    marker.openPopup();
    setTimeout(next, 3000);
}
next();


```

#成果物

https://embed.plnkr.co/GCAm2gFzIc9o4obqwEqS/


以上。
【随時更新】よく使う・よく忘れるコード一覧(Python編)

ちょいちょい忘れてしまい、毎回google聞くのはしんどいなぁと思い以下にまとめておきます

----
## ファイル読み込み(numpy)
いろんなやり化があることは承知ですが、numpyでやるには以下の通り

```py

import numpy as np
data = np.loadtxt("XXXXXX.csv",delimiter=',')
```

## 読み込んだファイルをXとyに分ける方法(numpy)
上記のファイル読み込みの続きです。dataはn行3列で1行目がy値と過程すると、

```py

y = data[:,0].astype("int")
X = data[:,1:2].astype("int")
```

## グラフ描画(matplotlib)
```py

import matplotlib.pyplot as plt
%matplotlib inline
plt.set_cmap(plt.cm.Paired)
plt.scatter(X[:,0],X[:,1],c=y,s=50)
```
<img width="278" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/267688/3a6b97f4-d96f-4047-d5f0-0e2b13ace714.png">

## indexの作成方法(numpy)
```py

import numpy as np
idx = range(0,100) # 0から100までのインデクスができる
np.array(idx)      #idxの表示

# idxを用いてデータを代入
X_train = X[idx]

```
# シャッフルインデックスの作り方(sklearn)
```py

from sklearn.model_selection import ShuffleSplit
ss = ShuffleSplit(n_splits=1,
                 train_size = 0.5,
                 test_size = 0.5,
                 random_state=0)

# Xにシャッフルしたい配列が入っている
train_idx, test_idx  = next(ss.split(X))
```

---
# 分類（例えば1 or 0)の個数が何個あるかを調べる方法(numpy)
```py

# ランダムに0 1を生成します
yClass = np.random.choice([0,1],size=500)

#数えてみます
np.unique(yClass, return_counts=True)
```
>(array([0, 1]), array([264, 236], dtype=int64))

1つ目の配列がどんなユニークな分類があるかを示しています。2つ目の配列が0と1の個数を表示しています。ここで0:264個、1:236個　であることがわかります

ちなみに、2つ目の個数を取り出したい場合は、

```py

np.unique(yClass, return_counts=True)[1]
```
>array([264, 236], dtype=int64)

となります





--------
【随時更新します】
テーブルに記述するvalidationDefaultのdateには気を付ける

## はじめに
コントローラーでValidation::dateを使ってテストした時と
newEntityでバリデーションした際では渡す変数の型には違いがあった
４時間くらい悩んだ


### この値がPOST送信されてくると想定
```
$v="2018-10-31";
```
### 最初のバリデーションクラスのテスト
```
//これはちゃんとバリデーションが通る
$dateVlidation = CustomValidation::date($v);
```


### 実際のバリデーションの使用時（バリデーションエラー）
```
//Tableにバリデーション設定
public function validationDefault(Validator $validator)
{
        $validator
            ->requirePresence('entry_date')
            ->notEmpty('entry_date', __('日付を入力してください'))
            ->date('entry_date', __('正しい日付のフォーマットで入力してください'));
        return $validator;

}

//Controllerで
public function someFunction(){
$this->SomeTable= TableRegistry::get('SomeTable');

$data['entry_date'] = $v;

//(これはバリデーションが通らない)
$Some = $this->SomeTable->newEntity($data);

}

```

### 実際のバリデーションの使用時（バリデーションエラーなし）
```

//Controller
use Cake\I18n\Time;

public function someFunction(){
$this->SomeTable= TableRegistry::get('SomeTable');

//Timeでパースしてやらなきゃいけない
$data['entry_date'] = Time::parse($v);

//(これはちゃんとバリデーションが通る)
$Some = $this->SomeTable->newEntity($data);

}

```

EntityではValidateする際にTime型から値を変換してValidateしてると推測される
疲れた、、、。
Serverless FrameworkにGo言語で入門してみた備忘録


# はじめに
[serverless](https://serverless.com/)を使ってGo言語のAPIサーバを立ててみました。
簡単な動作を確認しただけですが、その時の備考録としてまとめました。

こんな人が読んで意味があるかと思います。
・とりあえず動かしてみたい
・使用するか検討している

# 構築手順
**1.GO関連の設定**
GOをインストールし、GOPATHを通しましょう。

**2.AWS関連の設定**
AWS CLIを落としてaws configureの設定を行いましょう。

**3.serverless関連のインストール**
```npm install -g serverless```

**4.serverlessでプロジェクトを生成**
```serverless create -t aws-go-dep -p <destination>```

雛形が以下のリポジトリに乗っています。
https://github.com/serverless/serverless-golang/

作成された雛形は以下のような感じです。

```
.
├── Gopkg.toml
├── Makefile
├── hello
│   └── main.go
├── serverless.yml
└── world
    └── main.go
````

**5.ビルドする**
makeファイルにビルドなどのタスクは定義されているので、
```make build```でビルドします。

**6.デプロイ**
これだけでcloudforamtionを使ったデプロイが実施されます。
```serverless deploy -v```

使い終わったら
```serverless remove -v```

**他の人が作った設定ファイルを使ってみる。**
1~6を他の人が作った設定ファイルを使って動かしてみましょう。

私が動作確認の際に活用させていただいた記事を添付します。
http://undersourcecode.hatenablog.com/entry/2018/02/07/200403

https://dev.classmethod.jp/cloud/aws/serverless-first-serverlessframework/

https://ewanvalentine.io/serverless-start-ups-in-golang-part-1/

https://yos.io/2018/02/08/getting-started-with-serverless-go/


# ローカル環境で開発するには？
ここまでで簡単に動作を確認するこは出来たかと思います。
次に毎回デプロイしてから動作を確認しては遅いので、**ローカルで開発する方法**をみていきます。

以下のライブラリを使えば出来そう。
https://github.com/dherault/serverless-offline

使用している記事を発見。
https://noop.co.jp/blog/post/4

実施してみた結果。。。。
```Serverless: Warning: found unsupported runtime 'go1.x'```

なんと**Goではサポートされていない**。。。README.mdにも書いてありました。。。
**Node.jsだけは可能**なようです。

もし使うならテストコードを書いてローカルで簡単に動作確認するか、
cloudwatch logsをみて問題を特定するなど面倒臭そうです。

# 懸念事項
・DBはMongoDBに縛られる
NoSQLを使うことになるので、どのようなデータの持ち方をするのかなど検討する必要がありそうです。

・ローカルで開発できない
これは本当に痛い。
開発速度が結構落ちてしまいそうだなという印象です。

# 感想
簡単にですが、[serverless](https://serverless.com/)を使ってみた備考録を感想を踏まえて書いてみました。
簡単にデプロイが出来、設定ファイルで管理することができるのですごくお手軽でした。
Node.jsを使って使用する場合は、かなりお勧めできると思いました。

**AWS SAMならGOでのローカル開発をサポートされている**ようなので、
次はそちらを調べてみようと思います。

# 参考資料
・設定ファイルの書き方は以下を参照
https://serverless.com/framework/docs/providers/aws/guide/serverless.yml/

・Go言語でTODOのCRUD APIを動かしてみるなら
※日本人の方の参考資料がありますが、こちらが元ネタなように感じました。
https://yos.io/2018/02/08/getting-started-with-serverless-go/

・同上（日本語）
http://undersourcecode.hatenablog.com/entry/2018/02/07/200403

・Go言語でとりあえず動くものを構築したいなら
https://ewanvalentine.io/serverless-start-ups-in-golang-part-1/

・Node.jsでローカル開発をしたいなら
https://noop.co.jp/blog/post/4
[Swift] 例外を投げるためのカスタムオペレータ

## これはなに？

例外を投げる関数を作る時、単純な条件で例外を投げるために`guard`文を書くのが煩わしいことがありませんか？
その煩わしさを軽減させるカスタムオペレータを作りました。

### 使用する場面

JSONが入っているであろう`Data`から特定の値を取り出す場面を考えましょう。
普通ならこのようになるでしょう。

### 仕様
0. `Data`を受け取る
1. JSONは `{ "identifier": "hogehoge"; }`
2. 戻り値として`"hogehoge"`を返す
3. 問題があった場合は例外を投げる

例外

```swift
enum MyError: Error {
  case couldNotParseJSON
  case jsonNotDictionay
  case jsonHasNotIdentifier
}
```

通常のコード

```swift
func getIdentifier(_ data: Data) throws -> String {

  guard let json = try? JSONSerialization.jsonObject(with: data) else {
    throw MyError.couldNotParseJSON
  }

  guard let dict = json as? [String: Any] else {
    throw MyError.jsonNotDictionay
  }

  guard let identifier = dict["identifier"] as? String else {
    throw MyError.jsonHasNotIdentifier
  }

  return identifier
}
```

やっていることは単純なのですが、すごく長いです。

### カスタムオペレータを使ってみる

上の関数をカスタムオペレータを導入して簡略化します。

```swift
func getIdentifier(_ data: Data) throws -> String {

  let json = try JSONSerialization.jsonObject(with: data) !!! MyError.couldNotParseJSON
  let dict = try json as? [String: Any] ??! MyError.jsonNotDictionay

  return try dict["identifier"] as? String ??! MyError.jsonHasNotIdentifier
}
```

3行になりました。

## カスタムオペレータ

カスタムオペレータは以下の通りです。

```swift
precedencegroup ThrowPrecedence {
    associativity: left
    higherThan: NilCoalescingPrecedence
}
infix operator !!! : ThrowPrecedence
infix operator ?!! : ThrowPrecedence
infix operator ??! : ThrowPrecedence


/// 左辺値が例外を投げた場合に右辺値の例外を投げる
///
/// - Parameters:
///   - value: 例外が発生しうる値
///   - throwsError: 投げられる例外
/// - Returns: 例外が発生しなければ左辺値
/// - Throws: 右辺値の例外が投げられる
func !!! <T, E: Error> (_ value: @autoclosure () throws -> T, _ throwsError: E) throws -> T {
    
    do {
        
        return try value()
    }
    catch {
        
        throw throwsError
    }
}


/// 左辺値がnilまたは例外を投げた場合に右辺値の例外を投げる
///
/// - Parameters:
///   - optionalValue: nilまたは例外が発生しうる値
///   - throwsError: 投げられる例外
/// - Returns: 例外が発生しなく、かつnilでなければ左辺値
/// - Throws: 右辺値の例外が投げられる
func ?!! <T, E: Error> (_ optionalValue: @autoclosure () throws -> T?, _ throwsError: E) throws -> T {
    
    guard let returnValue = try optionalValue() !!! throwsError else {
        
        throw throwsError
    }
    
    return returnValue
}


/// 左辺値がnilならば右辺値の例外を投げる
///
/// - Parameters:
///   - optionalValue: nilになりうる値
///   - throwsError: 投げられる例外
/// - Returns: nilでなければ左辺値
/// - Throws: 右辺値の例外が投げられる
func ??! <T, E: Error> (_ optionalValue: @autoclosure () -> T?, _ throwsError: E) throws -> T {
    
    return try optionalValue() ?!! throwsError
}
```

Errorをジェネリクスを使って書いてますが、今のSwiftだと意味ないです。
投げる例外の型を指定できるようになるといいですね。

### 使いどころ

Errorの型を指定する[Result](https://github.com/antitypical/Result)やErrorの型を指定する[Future](https://github.com/Thomvis/BrightFutures)と組み合わせると最強です。
*個人の感想です*

### ご注意

カスタムオペレータは諸刃の剣です。
多用すると意味不明になることがままあるので注意しましょう。
MySQL5.6 のデータベースごとやテーブルごとに使用しているデータ量を調べる

# 概要

各データベースやテーブルがそれぞれどれくらいのデータを利用しているか調べるには、
関連するメタデータを保持している **information_schema.tables**  テーブルを使用します。

[MySQL :: MySQL 5.6 リファレンスマニュアル :: 21.22 INFORMATION_SCHEMA TABLES テーブル](https://dev.mysql.com/doc/refman/5.6/ja/tables-table.html)

# 各データベースごとの使用量

以下の例は、接続しているユーザが参照権限を持つ全てのデータベースのサイズ（データ＋インデックス）を表示します。
単位はMB（メガバイト）で小数点第3位を四捨五入しています。

```sql
SELECT 
  table_schema as 'database name' 
  ,round(SUM(data_length+index_length)/1024 /1024,2) as 'size(MB)' 
FROM 
  information_schema.tables  
GROUP BY 
  table_schema 
ORDER by 
  SUM(data_length+index_length) DESC;
```

**実行例**
![](https://i.gyazo.com/281095f80e3749ab7765aaa0059d799e.png)

# 特定のデータベースのテーブルごとの使用量

WHERE句の**table_schema**に調査したいデータベース名を指定します。
**table_type**は通常テーブル(BASE_TABLE)、ビュー（VIEW）のいずれかを取ります。
下の例では通常テーブルのみ表示しています。
なおTEMPORARY テーブルは対象外です。（information_schema.tablesには含まれない）

**avg_row_length**は1レコードの平均サイズです。

**table_rows**はレコード数を意味します。MyISAMの場合は正確ですが、InnoDBの場合は概算です。
（InnoDBで正確に把握したい場合は**select count(*) from tablename;**)

> 公式マニュアルより抜粋
> InnoDB テーブルの場合、行カウントは SQL 最適化で使用される単なる概算です。

**engine**カラムにはInnoDBやMyISAMなどが表示されます。

```sql
SELECT
    table_name
    ,round((data_length + index_length) / 1024 / 1024,2) as 'total size(MB)'
    ,round((data_length) / 1024 / 1024,2) as 'data size(MB)'
    ,round((index_length) / 1024 / 1024,2) as 'index size(MB)'
    ,avg_row_length 
    ,table_rows
    ,engine
FROM
    information_schema.tables
WHERE
    table_schema = '<DATABASE NAME>'
    AND table_type = 'BASE TABLE'
ORDER BY
    (data_length + index_length) DESC
;
```
**実行結果例**

![](https://i.gyazo.com/a0a254b924392fea955c67af54d30f0e.png)
Authコンポーネントで複数カラムを参照する

いろいろ調べてなんとかできたのでメモ。
参照したいカラムは「username」と「email」で、どちらかが一致すればログインできる。

# 環境
CakePHP 3.6.12
PHP 7.2.6

必要なファイルはbakeで生成済み。

# ソース
```php:src\Controller\AppController.php
class AppController extends Controller
{
    public function initialize()
    {
        parent::initialize();

        $this->loadComponent('RequestHandler');
        $this->loadComponent('Auth', [
            'authorize'=> 'Controller',
            'authenticate' => [
                'Form' => [
                    'fields' => [
                        'username' => 'username',
                        'password' => 'password'
                    ],
                    'finder' => 'auth'
                ]
            ], 'loginAction' => [
                'controller' => 'Users',
                'action' => 'login'
            ], 'unauthorizedRedirect' => $this->referer()
        ]);
    }
}
```

```php:src\Controller\UserController.php
class UsersController extends AppController
{
    public function login()
    {
        if ($this->request->is('post')) {
            $username = $this->request->getData('username');
            if (strstr($username, '@')) {
                $this->request = $this->request->withData('email', $username);
                $this->Auth->setConfig('authenticate', [
                    'Form' => ['fields' => ['username' => 'email']]
                ]);
            }
            $user = $this->Auth->identify();
            if ($user) {
                $this->Auth->setUser($user);
                return $this->redirect($this->Auth->redirectUrl());
            }
            $this->Flash->error('ユーザー名またはパスワードが不正です。');
        }
    }
}
```

```php:src\Model\Table\UsersTable.php
class UsersTable extends Table
{
    // 以下を丸ごと追加
    public function findAuth(\Cake\ORM\Query $query, array $options)
    {
        $query->where(['Users.enabled' => 1]); // enabledが1のユーザーのみ取得
        return $query;
    }
}
```

```php:src\Template\Users\login.ctp
<?php
	echo $this->Form->create(null, ['autocomplete' => 'off']);
	echo $this->Form->control('username', [
		'label' => 'アカウントまたはメールアドレス'
	]);
	echo $this->Form->control('password', [
		'label' => 'パスワード'
	]);
	echo $this->Form->button('ログイン');
	echo $this->Form->end();
?>
```

$_POST[username]の中に@が含まれていたらメールアドレス、それ以外はユーザー名のカラムを参照しています。
AuthコンポーネントのsetConfigでusername => emailにしているのに、withDataで入れてあげないとクエリに入らないのがよくわからない。
詳しい方教えてください。
ubuntu18.04にCuda9.0を入れてtensorflow-gpuを使う

#はじめに
どうもubuntu18.04にCuda9.0を入れるのはまだ公式の対応はしていないらしい。
古いバージョンのものを使えばなんとか動かすことができたので、
その記録をする

細かいところは端折っているので、他の方が書かれている記事のおまけに読んでいただければ


#公式から以下のファイルをダウンロードする

```
・cuda-repo-ubuntu1704-9-0-local_9.0.176-1_amd64.deb
・libcudnn7_7.2.1.38-1+cuda9.0_amd64.deb
・libcudnn7-dev_7.2.1.38-1+cuda9.0_amd64.deb
・libcudnn7-doc_7.2.1.38-1+cuda9.0_amd64.deb
```

ここで注意なのが、ダウンロードするリポジトリはローカルのものを使用する

ネットのリポジトリを使うとバージョン指定ができず、
Cuda9.2が無限ループしてしまった

#Nvidiaドライバーの準備
ubuntuでNvidiaのグラボドライバをインストールできる準備だけする

```
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
```

ここで先にインストールしてしまうと、Cudaをインストールする際にも別のドライバがインストールされてしまい、
バージョンがずれておかしなことになってしまう

そのためupdateで一旦止めておく

詳しい方法はこちらへ　→→→　[kubernetesで機械学習環境を作る！](https://qiita.com/monkeydaichan/items/f1ac1ee799e460863e3e)


#Cudaのインストール
インストールは公式に則りながら実行

```
$ dpkg -i cuda-repo-ubuntu1704-9-0-local_9.0.176-1_amd64.deb
$ apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub
$ apt-get update
$ apt-get install cuda-9-0
$ nvidia-smi
$ reboot
```

これでnvidia-smiが通ればok

#libcudnnのインストール
こちらも公式に則りインストール

```
$ dpkg -i libcudnn7_7.2.1.38-1+cuda9.0_amd64.deb
$ dpkg -i libcudnn7-dev_7.2.1.38-1+cuda9.0_amd64.deb
$ dpkg -i libcudnn7-doc_7.2.1.38-1+cuda9.0_amd64.deb
```

#tensorflowのインストール
pipを入れてtensorflow-gpuをインストール

```
$ apt install python3-pip
$ pip3 install tensorflow-gpu==1.9
```

#dockerのインストール
後々必要になるdockerのインストール
今はバージョンは特に気にしない

```
$ apt-get install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ apt-get update
$ apt-get install docker-ce
$ docker -version
```

#Nvidia-dockerのインストール

```
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey |   sudo apt-key add -
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list |   sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ apt-get update
$ apt-get install nvidia-docker2=2.0.3+docker18.06.1-1 nvidia-container-runtime=2.0.0+docker18.06.1-1
$ pkill -SIGHUP dockerd
$ docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
```

#終了
一通り必要なパッケージは入れたので、ubuntu上で下記コマンドでグラフィックカードの情報がでたら終了


```
$ python3

>>>from tensorflow.python.client import device_lib
>>>device_lib.list_local_devices()
```


#参考記事
[How to install CUDA-9.0 on with cuDNN-7.1.4 on Ubuntu 18.04](https://peshmerge.io/how-to-install-cuda-9-0-on-with-cudnn-7-1-4-on-ubuntu-18-04/)
[ubuntu18.04でpipが使えない時](https://askubuntu.com/questions/1061486/unable-to-locate-package-python-pip-when-trying-to-install-from-fresh-18-04-in)
[TensorFlow on DockerでGPUを使えるようにする方法](https://www.kabuku.co.jp/developers/errors-with-tensorflow-on-gpu)
vue-cliで作ったアプリをGithub Pagesにデプロイ

#### 1. いつもどおり vueのプロジェクトをつくる

```bash
$ vue init webpack <projectname>
```

#### 2. `config/index.js` 内の buildメソッドを編集する

- dist/ を docs/ に変える (2箇所)
- assetsPublicPath を / から ./ に変える

```diff

  build: {
    // Template for index.html
-    index: path.resolve(__dirname, '../dist/index.html'),
+    index: path.resolve(__dirname, '../docs/index.html'),

    // Paths
-    assetsRoot: path.resolve(__dirname, '../dist'),
+    assetsRoot: path.resolve(__dirname, '../docs'),
    assetsSubDirectory: 'static',
-    assetsPublicPath: '/',
+    assetsPublicPath: './',

```

#### 3. ビルドする

```bash
$ mkdir docs
$ npm run build
```

#### 4. ふつうにGithubにデプロイ

```bash
$ git add -A
$ git commit -m "<commit-message>"
$ git push origin master
```

#### 5. Github側でデプロイ設定する

settingsタブの中に Github Pagesの項目がある。

<img width="799" alt="スクリーンショット 2018-10-30 20.04.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/ceb785e6-d785-2232-5147-685b10ff85f7.png">

Sourceを `master branch /docs folder` にする。

<img width="767" alt="スクリーンショット 2018-10-30 20.03.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/158680/66cfdf38-46dd-6526-9d61-935208b3bc02.png">

#### 6. 確認

https://`あなたのGithub垢`.github.io/`レポジトリの名前`/　をチェック。

>例えばこんなURL： https://msrks.github.io/boardgame-manager/
JavaScriptにセミコロンは要らない

嘘だと思うなら次のFizzBuzzに
セミコロンを足してみてください。

```js:FizzBuzz
switch((toFizzBuzz=>(
    (toFizzBuzz=(n,str)=>(
        (str = n%3===0?15..toString(16).toUpperCase()
                       + 24623..toString(36):[].join()),
        (str += n%5===0?11..toString(16).toUpperCase()
                        + 40175..toString(36):[]),
        (str.length?str:n.toString())
    )),
    [...Array(100)]
        .map((e,i)=>i+1)
        .forEach(n=>console.log(toFizzBuzz(n)))
))()){
}
```

先頭と末尾以外にセミコロンが追加できたら僕の負けです。

# 何これ？

僕はセミコロンつける派（正確にはつけるけどしばしば忘れる派）なのですが、
世の中にはセミコロンつけない派の人もいるようです。

どちらの人にも怒られないように、
セミコロンをつける余地のないスクリプトを書いてみました。

文字を書くのに`'`や`"`を使ってしまうと
その中にセミコロンが書けてしまうので
変な手法を使っています。

# 既知の問題

* `'use strict'`が使えない
* `const`が使えない
* `while`的なループが再帰でしか書けない

# それ以前の問題

* `switch`の使い方が明らかにおかしい
* 変数の定義の仕方がおかしい
* 文字列の書き方がおかしい

セミコロンつけない派の人にも
セミコロンつける派の人にも
怒られる代物になりましたとさ。
FFアドオン時代のSelenium IDEの代替ツールを探したときのメモ その2

[前回](https://qiita.com/shimomai@github/items/25d80f6c7563c77daa23)の続きです、
本記事では「Selenium IDEとは」「代替ツールを探す背景」は省略。

# 代替ツール案2：Katalon Recorder

* オープンソースではないが、Selenium IDEと同様の機能であればKatalon Recorder、
更に踏み込みたい場合はKatalon Studioと選択肢があり、共に無料
<br>※RecorderとStudioの比較は[こちら](https://www.katalon.com/resources-center/blog/katalon-automation-recorder/)
* 出力もSelenium IDE同様htmlなので、感覚としては旧Selenium IDEと同様に利用できる 

## 比較してみてた UI編

英語表記ではあるが、直感でどのボタンを押すべきかイメージしやすかった

### 旧Selenium IDE UI

<img width="960" alt="旧セレ.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/19908/e05bcb9e-908e-0784-65f0-c1149b698311.jpeg">

### Katalon Recorder UI 

<img width="960" alt="katalon.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/19908/035ccc40-b386-6509-232b-52e3cd998a15.jpeg">


## 比較してみた その他

|比較ポイント|旧Selenium IDE|Katalon Recorder|
|:-----------------:|:------------------:|:------------------:|
|利用できるブラウザ|FireFoxのみ|GoogleChrome,FireFox|
|保存形式|html|html|
|タイマー|あり|なし|
|他言語へのエクスポート|あり|あり|

## Katalon Recorderを実際に使ってみた <br>メインの機能編

### 準備

* インストールは以下から
 * GoogleChrome：https://chrome.google.com/webstore/detail/katalon-recorder-selenium/ljdobmomdgdljniojadhoplhkpialdid
 * FireFox：https://addons.mozilla.org/ja/firefox/addon/katalon-automation-record/

1. 上記からインストール後にアドレスバー横に表示されるアイコンをクリック

あとは左上の「Record」ボタンを押せば記録が始まります。
<img width="960" alt="katalon1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/19908/5fd3ccbc-3186-a018-7bbf-5d0880f5ef5b.jpeg">


### 記録

ここまで来たらSelenium IDEと同じくあとは＼(ポチポチ)／
前記事と同様にgoogle検索でQiitaまで遷移します。
値として保存(store XX)や検証系(Verify XXやAssert XX)を挟む場合は
こちらのツールも対象の要素を選択して右クリック→Katalon Recorder→該当コマンドをクリックで記録可能です。

<img width="960" alt="katalon2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/19908/f6e4c572-c801-5863-54c3-07ff3d4daaea.jpeg">


操作が終わったら左上のStopボタンを押して保存しましょう。
<img width="959" alt="katalon3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/19908/b58e5a54-a8d5-4665-433f-2411a412dd69.jpeg">


# 比較してみて

* UI、機能、出力が旧Selenium IDEとかなり近いので、直感で操作できる
* 操作性は問題ないがRecord時ちょっとだけ重いかもしれない（実行はかなりスムーズ）
FFアドオン時代のSelenium IDEの代替ツールを探したときのメモ その1

# Selenium IDEとは

* Webブラウザテストを自動化するためのツール
* Webブラウザ上での動作の記録、及びその編集、再現が可能

# 代替ツールを探す背景

* FireFoxのアドオンとして提供されていたものの、
2017年8月にFireFox 55がリリースされたと同時にサポート終了
* FireFox 54を無理やり使うという選択肢もあったがセキュリティ的によろしくない

# 代替ツール案1：Selenium IDE(新)

Selenium IDEの代替ツールがSelenium IDEというのは紛らわしいですが、
2017年8月にサポートを終了したSelenium IDEを「旧版」とすると、
2017年12月にSelenium IDEの「新版」が公開
https://github.com/SeleniumHQ/selenium-ide

## 比較してみてた UI編

しっかり旧UIに寄せてきている印象。

### 旧UI

<img width="960" alt="旧セレ.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/19908/e05bcb9e-908e-0784-65f0-c1149b698311.jpeg">

### 新UI 

<img width="960" alt="新セレ.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/19908/17e7fd25-8194-1c8d-8b89-ef78a2a0e959.jpeg">

## 比較してみた その他

|比較ポイント|旧|新|
|:-----------------:|:------------------:|:------------------:|
|利用できるブラウザ|FireFoxのみ|GoogleChrome,FireFox|
|保存形式|html|json|
|タイマー|あり|なし|
|他言語へのエクスポート|あり|なし|

## 新版を実際に使ってみた メインの機能編

### 準備

* インストールは以下から
 * GoogleChrome：https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd
 * FireFox：https://addons.mozilla.org/ja/firefox/addon/selenium-ide/

1. 上記からインストール後にアドレスバー横に表示されるアイコンをクリック
2. プロジェクト名とbase URLを設定

あとは右上の「REC」ボタンを押せば記録が始まります。
<img width="960" alt="セレ1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/19908/646286f5-c344-1e36-b3c1-6e6e6eb5d66f.jpeg">

### 記録

ここまで来たらあとは＼(ポチポチ)／
試しにgoogle検索でQiitaまで遷移します。
値として保存(store XX)や検証系(Verify XXやAssert XX)を挟む場合は
対象の要素を選択して右クリック→Selenium IDE→該当コマンドをクリック
で記録可能です。
<img width="948" alt="セレ2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/19908/191f0bc9-ef22-fb19-d139-95488cdadce4.jpeg">

操作が終わったら右上の停止ボタンを押して保存しましょう。
<img width="959" alt="セレ3.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/19908/bad22419-2085-d0c9-91b6-ce0def43d386.jpeg">

# 比較してみて

* 機能やコマンドは最低限でシンプルなので初心者が記録からの検証をする分には問題なさそう
* 保存が.side形式でしか保存できないので汎用性は低そう
MSIのデスクトップ用マザーボードでRAIDを組む方法

#はじめに

MSIやASUSのマザーボードを購入してRAID１を組んでubuntuを入れたいとなったのだが、
OSインストール時のSoftware RAIDを組むのではなく、BIOS上でマシンRAIDを組む際、設定画面に入るコマンドがわからなかった

#結論
マシン起動時、以下のキーボードを連打で入れた

```
Ctrl + i
```

いたって単純である

#こんな時
素直にRAID構成画面に入れない場合、マシン起動時に通常のBIOS画面（大体DeleteキーかF5キーかEscキー）で
入ってからadvance→SCSIあたりで起動モードをRAIDモードに選択できる項目があるはずなのでそこで変更してもらえば入れるかも
[Gcloud] pscp: unable to open /......./  permission denied　とかなった時の対処法

Google Compute Engine にローカルのファイルをアップロードしようとしたときに、エラーに悩まされたので、メモ。

[公式チュートリアル](https://cloud.google.com/compute/docs/gcloud-compute/)通りに、Gcloudをインストールして、いざ！　と思ったらこんなエラーが出た。

```
C:\Users\user\AppData\Local\Google\Cloud SDK>gcloud compute scp C:\Users\user\Desktop\test.txt instance-1:/gcs
pscp: unable to open /gcs/test.txt: permission denied
ERROR: (gcloud.compute.scp) [C:\Users\user\AppData\Local\Google\Cloud SDK\google-cloud-sdk\bin\sdk\pscp.exe] exited with return code [1].
```

#対処法
GCEのshellを開く。

##1
```
username@instance-name:~$ cd /gcs
```
今回は gcsというフォルダにtest.txtをアップロードしたかったので、まずgcsというフォルダを作る。
~~なぜフォルダ名がgcsなのかは突っ込まないで~~

##2
```
username@instance-name:/gcs$ sudo vi test.txt
```
sudoをつけてファイル作成。これをしないとどういうわけか保存できない
（自分はviコマンドで行ったが、別に中身は空でいいのでtouchでよかったかも）

##3
```
username@instance-name:/gcs$ sudo chmod 777 test.txt
```
test.txtの権限を変更

##4
コマンドプロンプトに戻ってさっきと同じやつを実行

```
C:\Users\user\AppData\Local\Google\Cloud SDK>gcloud compute scp C:\Users\user\Desktop\test.txt instance-1:/gcs
test.txt                 | 0 kB |   0.0 kB/s | ETA: 00:00:00 | 100%
```

自分はこれで成功しました。