ひよこメモ

備忘ブログ Ruby, Rails, AWS, html5, css3, javascript, vim,

【GCP】GCPコマンド一覧

コンソールにてgoogle-cloud-sdkのインストール
curl https://sdk.cloud.google.com | bash

gcloud info
アカウントやプロジェクトなど、gcloudの情報が分かる


gcloud config set project プロジェクト名
GCPプロジェクトの切り替え

gcloud auth login
gcloudコマンドをGCPアカウントと紐づける。
ローカルのコンソールで入力したことを、googleアカウント
gcloud auth listで表示されるようになる

gcloud auth list
登録されたアカウントとACTIVEなアカウントの一覧

gcloud compute --project aaaaaproject-171606 ssh --zone asia-northeast1-a instance-1
ログインできた

gcloud config set compute/zone asia-northeast1-a
ゾーンをconfigurationに設定する

gcloud config set account アカウント名(gmail)
アカウントを設定する

MySQL キーの種類

PRIMARY

プライマリーキー制約(主キー制約)
重複する値は設定できない。
NOT NULL必須
各テーブル1つまで
PRIMARYという名前のユニークインデックスが作成されると考えて良い。
ユーザーIDなど。
AUTO_INCREMENTで自動的に数値が加算される。

UNIQUE

ユニークキー制約(一意キー制約)
重複する値は保存できない。
nullでもOK。(nullの重複もOK。)
ユニークインデックスが作成される。

MULTIPLE

プライマリーキーでもユニークキーでもないインデックス。
外部キー制約。FOREIGN KEY。
外部キーを設定すると、キー欄が「MUL」となる。
同じ名前の複数重複が許されている。
参照整合性を保つための仕組み。
(MULTIPLE = 複数)

REFERENCES table名(column名)
で、参照先を設定する。

LaravelでMySQL8を使う場合、認証方式をcaching_sha2_passwordからmysql_native_passwordに変更する必要がある。

qiita.com

SELECT user, host, plugin FROM mysql.user;
を実行した時、pluginが
caching_sha2_password
となっている。
Laravelで使うには、認証方式を
mysql_native_password
に変更する必要がある。

Laravel リソースコントローラー

CRUD(create, read, update, deleteの各アクション完備)
php artisan make:controller HiyokoController - -resource

Controller内に作成されるメソッド
index, create, store($request), show($id), edit($id), update($request, $id), destroy($id)

PUT, PATCH, DELETEを使う際は、フォームに__methodパラメータを設定する必要がある?

作成後にルートを登録する
Route::resource(‘URL’, ‘Controller名’);
これでindex, create, store, show, edit, update, destroy全てのメソッドのルート設定が完了

リソースモデルの指定
php artisan make:controller HiyokoController - -resource - -model=Hiyoko
もともとモデルが作成されている必要がある?

index, create, store, show, edit, update, destroy、指定して使わせないこともできる。
Route::resource(‘hiyokos’, ‘HiyokoController’)->only ([
‘index’,’show’,
]);

Route::resource(‘hiyokos’, ‘HiyokoController’)->except([
‘create’, ‘store’, ‘update’, ‘destroy’
]);

onlyからexceptどちらかで大丈夫だよね。

APIリソースルート
ゲーム制作で使うのは、基本的にAPIでしょう。
どうやってweb.phpではなくapi.phpを使う?ディレクトリ「/API」を作ってその下にAPI用のControllerを置いて、使いたい。

php artisan make:controller API/HiyokoController - - api
GETで表示して入力待ちのようなメソッドは必要ない。(createやeditなど。storeやupdateは必要。)

Route::apiResource(‘hiyokos’, ‘HiyokoController’);

リソースコントローラーのデフォルトルート(index, create, store, show, edit, update, destroy)以外にルートを登録したい時は、
Route::resourceよりも前にRoute::getやRoute::postで設定する。

ルートキャッシュを登録しておくと、ルート登録が100倍早くなる。
ルートキャッシュを行うためには、ルートファイルにクロージャを書かないことが条件。
php artisan route:cache

Laravel MiddleWare

HTTPミドルウェアは、HTTPカーネルのリストで最初に定義されている。
HTTPセッションの読み書き、CSRFトークンの確認など、通信の都度必要な処理が設定される。

ミドルウェア指定方法

1.ルートファイルで指定

web.phpやapi.php

Route::get(‘URL’, ‘HiyokoController@メソッド名’)->middleware(‘ミドルウェア名’);

2.ControllerのConstructerで指定
class HiyokoController extends Controller
{
	public function __construct()
	{
		$this->middleware(‘ミドルウェア名’);
	}

}

HiyokoController.php

Controllerにて、クロージャを使ったミドルウェアの登録

ミドルウェアをミドルウェアディレクトリに作成するまでもない時に便利。

$this->middleware(function ($request, $next) {
//処理
return $next($request);
});

ミドルウェアの引数$nextと$request

Modelデータの保存方法 createとfill

モデル::create
インスタンス化、fill、save全てやってくれる。
$flight = Flight::create([‘name’ => ‘飛行’]);

モデル:fill
インスタンスをnewする必要がある。
saveも自分で実行する必要がある。
$flight = new Flight();
$flight->fill([‘name’ => ‘飛行’]);
$user->save();

saveをあとで実行したい場合はfill
それ以外はcreate

Laravelのchunkとcursor DBデータを小分けにして取得

chunk/cursor
大量のデータをgetなど処理する場合に使う。
メモリの使用量を少なくする。

chunk(塊)
一定量ずつ処理

chunk(10, function ($people){
    foreach($people as $person) {
        //処理の実行
    }
}

10件ずつ取得して処理を実行。
10件終わったら次の10件を取得して処理の実行。

Laravel Eloquentで大量のデータを取得する場合 - Qiita


cursor(カーソル)
1クエリずつ処理。

Laravel(Eloquent): chunk() vs cursor() - Qiita

大量のデータを扱う場合、allよりはマシだがメモリの使用量は大きい。

Laravel Modelクラスでよく設定されるフィールド変数 $tableオーバーライドはよく使う

$table:DBのテーブル名。
通常デフォルトではテーブル名はモデル名の複数形だが、
$tableをオーバーライドすることで別名を付けることができる。
$connection:外部DBへの接続。データベース名を指定。
[Laravel]Laravelで別々のDB(MySQL)に接続させる方法 - Qiita
$fillable:必ず埋める必要のある項目。埋めることのできる項目。
$guarded:更新してはいけない項目

UnityでBluetooth LE通信を実現したい1

UnityでBluetooth LE通信を実現したい。
Unity用にjavaプラグインの自作は避けられないらしい。
まずはAndroid Studio(Java)を使う。(javaほとんど分からないけど)
Android Studioのバージョンが2と古かったので更新。
Android Studio バージョン3.1.1(2018年4月20日現在最新)
Android Studio 2.0の設定は~/Library/Preferences/AndroidStudio2.0に残るらしい。
JavaSE Development Kit(javaを使うためのパッケージ)インストールが必要。
1.8が最新だがMacは1.6以前が安定しているらしい。
「HAXM installationが変更を加えようとしています。」と聞かれた。
Intel Hardware Accelerated Execution Manager (Intel® HAXM) Android用エミュレータを高速化するものらしい。ハクスム・ハクセム。
インストールが終わったら「Start a Android Studio project」
include Kotlin support?Kotlin:開発工数が削減できて安全でInperoperability(相互運用性)が高い。JetBrains(IntelliJ IDEAを開発する会社)が後ろ盾。AndroidStudio用のプラグインをKotlinが用意してくれてるらしい。
Gradleについて理解が足りない。Gradleはビルドシステム。必要なモジュールをまとめて記述しておける感じ?AndroidSDKのインストールやビルドシステムantのセットアップを自動でやってくれる。Gradle自身のダウンロードもやってくれる。GUIで操作可能。Rubyで使ったMakefileのようなもの。依存関係の管理。taskという仕事のかたまりを作り、それを実行させる。他の人が作った便利なタスクを借りて実行が基本らしい。
(ToolBarのAVD Managerというボタンを押すとエミュレータを実行できる。)
Activity選択は「Empty Activity」を選択。
app>java>com.company.test.myapplication>MainActivity(FinderだとMainActivity.java)選択

package com.company.test.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

エミュレータを起動した状態で再生ボタンを押すと、無事HelloWorldが表示された。
Hello World自体はapp>java>res(Resource)>layout>activity_main.xmlに保存されているText。

Android Studio下部にあるConsoleにて「.gradlew -1 hello」の実行
その前にGradle Scripts>build.gradleに

task hello {
    doLast {
        println 'こんにちは'
    }
}

を追記。
するとConsole実行時にprintlnが表示される。
.gradlewとは?MyApplicationフォルダ直下にあった。gradleをgradleをインストールすることなしに実行できる。

Bluetooth LE通信までの道のりは遠い。
Kotlinが便利そう。
ひとまず最新版AndroidStudioインストールとエミュレータでのHelloworld実行。
ビルドシステムGradle(consoleではgradlew)

golang ユニークなID生成 xid

xid(https://github.com/rs/xid
Go製のUnique ID Generator「xid」について - Qiita
スケールする:対象を拡大・縮小する
UUID:Universally Unique Identifier。ユニークなID。128ビット(16Byte)。16進法が多い。UUIDがかぶる確率は230京回らしい。(https://qiita.com/ta_ta_ta_miya/items/1f8f71db3c1bf2dfb7ea)
Snowflake:Twitter社が作ったユニークなID生成のWebサービス。
全体で12Byte。UUID>xid>Snowflake。20文字のlower caseの英数字。

package main

import (
	"fmt"

	"github.com/rs/xid"
)

func main() {
	// idを生成
	guid := xid.New() //:=は何?
	fmt.Println(guid.String())

	// binaryの各partの情報
	machine := guid.Machine()
	pid := guid.Pid()
	time := guid.Time()
	counter := guid.Counter()
	fmt.Printf("machine: %v, pid: %v, time: %v, counter: %v\n", machine, pid, time, counter)
}

xidtest.go

$ go run xidtest.go
ba0h6ajjcl7tb9gdr440
machine: [115 101 79], pid: 54694, time: 2018-02-12 13:08:10 +0900 JST, counter: 907528

このような結果になる。

GCPコマンド一覧

ログイン
gcloud init
gcloud auth login

接続
gcloud compute --project "プロジェクト名" ssh --zone "ゾーン名" "ユーザー名"

確認
インスタンスの確認
gcloud compute instances list
アカウントの確認
gcloud auth list
設定の確認
gcloud config list
configurationファイルの場所 ~/.config/gcloud/configurations/
configurationファイルの切り替え
gcloud config configurations activate config名


SDKの更新
gcloud components update

GCPのキーについて

・GCPプロジェクトの下にインスタンスがある。

Compute Engine >> VMインスタンス >> 編集でインスタンスの編集 >> SSH認証鍵欄に公開鍵を登録する。(ssh-rsaからはじまる一行の暗号)

秘密鍵と公開鍵のぱっと見の見分け方
秘密鍵
拡張子なし。
公開鍵
公開鍵はpublic keyなので、拡張子は「.pub」となる。