OmniAICreator/Qiita-1.07M huggingface dataset:
目的から考えるDocker Composeのvolume3種

## はじめに

以下のような経験、勝手な思い込みを解消するために
このように考えると理解しやすかったかなという観点で書きました

- `.:`ってなんだよ！ていう当初の困惑
- volumeはすべて、host側をマウントするためにある
- anonymous volumeって劣化named volume？ 

## Dockerでvolumeが必要な理由

Dockerの以下のような仕組みがあり、それぞれを解決するための仕組みがvolumeだと考えています
- 通常はコンテナを停止させると、コンテナ内のデータは保持されない
- ホスト-コンテナ間が独立した環境として扱われ、ファイルの共有ができない
- コンテナ-コンテナ間は独立した環境として扱われ、データの共有はできない

## 3種類のvolume
- host volume?(ちょっと正確な呼び方がわかりません)
- anonymous volume (匿名volume?anonymous volumeという記述をよく見かけます)
- named volume（名前付きボリューム）

それぞれが必要となるケースから見ていきます

## 目的から考えるDockerのvolume

### コンテナ内のデータを永続化する　=> すべてのvolumeで可能
通常はコンテナを停止させると、コンテナ内のデータは保持されない(=永続化されていない)
これを永続化する仕組みがvolume
例) DBのデータをはじめ、都度消失しては困るものすべてが対象

### ホスト(ローカル側)とコンテナ間で同期を図る　=> host volumeで可能
Dockerでホスト-コンテナ間が独立した環境として扱われるのに対し、ホスト側の特定のディレクトリをマウントして、ホスト-コンテナ間でデータの同期を図ることが可能
例) 開発環境など、ホストで編集したファイルをコンテナ内に随時反映させてい場合など

### volumeを複数のコンテナで共有する => named volumeで可能
通常、コンテナ-コンテナ間は独立した環境として扱われ、ファイルの共有は行われない
named volumeを使用することで容易にコンテナ-コンテナ間でファイルの共有が可能になる
例) Web server(コンテナ)とアプリケーションserver（コンテナ）間で静的コンテンツと共有する場合など

### あれ？anonymous volumeは？？
永続性のみ確保したい、ホストとの同期が必要ない、他のコンテナとの共有が必要ないケースではこれで十分かと思います
また、永続化、共有化されたvolumeの一部で、
敢えてコンテナ間の独立性を維持したいというケースで有効な気がします
例えばホストをマウントしたvolume配下の一部ディレクトリを、anonymous volumeでとして切り離すことが可能、anonymous volumeで指定したpathはコンテナ間の独立性を確保できる

## 設定例 - Dockerのvolume3種類

### host mount: \<host_path>:\<container_path>
ホストのディレクトリをマウントし、コンテナ内のpathと同期する

```
volumes:
  - .:/myapp # .(カレントディレクトリ)をマウントし、コンテナ内の/myappと同期
```
### named volume: \<volume_name>:\<container_path>
コンテナ内のpathをvolumeとして扱い永続化する、namedであることで他のコンテナとの共有が容易
**hostマウントされたpathの配下であっても、named volumeは別のvolumeとして扱われhost側と切り離される**

```
volumes:
  - node_modules:/myapp/node_modules # コンテナ内のpathをvolumeとして永続化し、node_modulesという名前をつけて管理
```

### anonymous volume: \<container_path>
named volumeとの違いはanonymousである点、名前がない（が、乱数ハッシュが割り当てられている）、他のコンテナと共有することを想定せず永続化だけしたい場合はこれでいいはず

```
volumes:
  - /myapp/node_modules　# コンテナ内のpathのみ記述、これをvolumeとして永続化する
```


(随時更新予定)

## 参考
[”Docker Compose、チョットわかる”になるために知っておきたい頻出オプション - Compose file version 3(3.8) reference - - Qiita](https://qiita.com/naokit-dev/items/26b6a542571639e975ee)
CakePHP3.9をMacにインストールする（MAMP使用）

## 環境

バージョンは下記

- OS：MacOS Catalina 10.15.4

- PHP：7.3.22

- Composer：1.10.13

今回はデータベースについては触れません

データベース入れました→ [CakePHP3.9にMySQLを接続する（Homebrew使用）](https://qiita.com/motoshi_cocoa/items/0e2489bfe4ae9cf9d5a9)

## MAMPのダウンロード

- MAMP参考→ https://qiita.com/kuro-wassan/items/1cb32995acc07a4b4cc6

- MAMPのサイト https://www.mamp.info/en/downloads/ からMac用のMAMPをダウンロードする。

- ApplicationsフォルダのなかにMAMPがダウンロードされる。

## CakePHPのアプリの作成

- CakePHP3.9 公式→ https://book.cakephp.org/3/ja/installation.html

- MAMPが落ちたところへ行く

```
$ cd Applications
$ ls
$ cd MAMP
```
↑MAMPが複数ある場合は名前が違うことがあるので注意


- htdocsに入る（この中にCakePHPアプリをおきたい）

```
$ cd htdocs
```


- CakePHPアプリの作成

```
$ php composer.phar create-project --prefer-dist cakephp/app:^3.8 app_name
```
または

```
$ composer self-update && composer create-project --prefer-dist cakephp/app:^3.8 app_name
```

でCakePHPのアプリが作られる（`app_name`のところには任意のアプリ名を入れる）



```
Updating to version 1.10.13 (stable channel).
   Downloading (100%)         
Use composer self-update --rollback to return to version 1.10.5
Creating a "cakephp/app:^3.8" project at "./app_name"
Installing cakephp/app (3.9.0)
.
.
. 省略
.
.
> App\Console\Installer::postInstall
Created `config/app_local.php` file
Created `/Applications/MAMP/htdocs/app_name/tmp/cache/views` directory
Set Folder Permissions ? (Default to Y) [Y,n]?
```

↑ファイルの権限を設定していいかcomposerに聞かれるけどYと答えてEnter。

- アプリが作成されているか確認してアプリフォルダに入る

```
$ ls 
app_name
$ cd app_name
```

- 起動！！！

```
$ bin/cake server
```

```
Welcome to CakePHP v3.9.2 Console
---------------------------------------------------------------
App : src
Path: /Applications/MAMP/htdocs/app_name/src/
DocumentRoot: /Applications/MAMP/htdocs/app_name/webroot
Ini Path:
---------------------------------------------------------------
built-in server is running in http://localhost:8765/
You can exit with `CTRL-C`
```

- 上記のような表示が出たら成功

- ブラウザで `http://localhost:8765/` にアクセスしてみる

![スクリーンショット 2020-10-02 0.29.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594194/247bd690-37dd-fd2a-bb64-e5fff6e7d92f.png)


ここまで。
fastlane spacesipでSandBoxアカウントを作成する

`fastlane spacesip`を使うとApple Store Connectでのいろんな操作がコマンドで簡単にできるようになります。
今回はfastlaneの導入からSandBoxアカウントの作成方法を紹介します。

## fastlaneの導入
### インストール
#### RubyGems
```console
$ sudo gem install fastlane -NV
```

#### Homebrew
```console
$ brew install fastlane
```
### 

### セットアップ
```console
$ fastlane init
```
セットアップが終わると、`fastlane`ディレクトリが作成される。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305854/fa519cd3-55bc-f3a8-1a9d-ce1f928eac80.png" width=70%>
その中の`Fastfile`色々記述していくのですが、この`Fastfile`をSwiftで記述する方法も公式で用意されています。

```console
$ fastlane init swift
```
今回はSwiftで記述するこの後の簡単なセットアップは割愛します。
[Fastlane.swift docs](https://docs.fastlane.tools/getting-started/ios/fastlane-swift/)

## fastlaneでSandBoxアカウントを作成する
`Fastfile`に以下を記述します。

```shell
platform :ios do
  desc "Create Sandbox Account"
  lane :create_tester do
    require 'pp'
    require 'spaceship'

    Spaceship::Tunes.login("メールアドレス", "パスワード")
    desc "アカウントに複数チームがある場合はチームIDを選択する"
    desc "チームIDが分からない場合 Spaceship::Tunes.select_team だけ書いておくとあとで候補から選択できる"
    Spaceship::Tunes.select_team(team_id: "チームID")

    tester = Spaceship::ConnectAPI::SandboxTester.create(
      first_name: "test",
      last_name: "name",
      email: "test.email@test.jp",
      password: "Test1234",
      confirm_password: "Test1234",
      secret_question: "Question",
      secret_answer: "Answer",
      birth_date: "1993-03-01",
      app_store_territory: "USA"
    )
    pp tester
  end
end
```
`tester`の情報は任意に変更してください。

コンソールでコマンドを実行すると、SandBoxアカウントが作成されます！

```console
fastlane create_tester
```

参考：[fastlane doc](https://docs.fastlane.tools/)
Jupyterの拡張機能Autopep8の折り返し文字数を変更する

#はじめに

jupyter上で実行可能な[Autopep8](https://qiita.com/simonritchie/items/88161c806197a0b84174#autopep8)の折り返しが早すぎて、地味にイライラしていたので、修正してみました。

#結果

１行の最大文字数=79 -> 150に変更することができました（ちゃんちゃん）

#方法

1. site-packages/autopep8.pyを修正します
1. ファイル内を`79`で検索し、お好きな文字数に置換する（3箇所）

#おわりに

最初、最大文字数が`80`文字だと思っていて、検索してもヒットせず、若干苦戦。
jupyter上から設定できそうな気もするけど、気が向いたらね。（コメントお待ちしております）
ブランクのみ弾くカスタムバリデーション(null許容)

# TL；DR
springの組み込みバリデーションで`@NotNull` `@NotEmpty` `@NotBlank`はあるけどnull許容だが空文字は非許容というカスタムバリデーションを作った

既存の組み合わせで実現できそうなので`@Constraint(validatedBy = [])`に詳しい人いたらご教授をお願いしたいです

# 作成したコード

まずはアノテーション

```kotlin
@Target(AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.FIELD)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@ReportAsSingleViolation
@Constraint(validatedBy = [NotBlankAllowNullValidator::class])
annotation class NotBlankAllowNull(
    val message: String = "空文字とスペース以外の入力のみ許容",
    val groups: Array<KClass<out Any>> = [],
    val payload: Array<KClass<out Payload>> = []
)
```

続いてバリデーター

```kotlin
class NotBlankAllowNullValidator : ConstraintValidator<NotBlankAllowNull, Any> {
    override fun initialize(constraintAnnotation: NotBlankAllowNull) {}

    override fun isValid(value: Any?, context: ConstraintValidatorContext?): Boolean {
        value ?: return true
        return value.toString().isNotBlank()
    }
}
```

# もやもや
Q.これでダメなんですか
A.ダメなわけではない

でも既存のバリデーターの組み合わせで行けそうな気がするやん？
というか集合で考えればもちろんいける

ただ、入社して日が浅いせいで半ば写経的にコードを書いているのでカスタムアノテーションについてなにもわかっていない
どうやら`@Constraint(validatedBy = [])`のところをいじったらいけそうな気はするけどどのドキュメントを読めばいいのかわかっていない状態
そもそもアノテーションってandで条件付与されていくけどorで付け足したりできないのかな？
notとかできるならもっと柔軟に対応できそうだけど可読性は下がりそう。
`@NotNull` `@Null`で別々に作られているから厳しい気はしているけど

# 終わりに
冒頭にも書いたけどカスタムアノテーション詳しいマンいたら駆け出しエンジニアに救いの手をどうぞよろしくお願いします
Apple WatchでコンプリケーションからWEBブラウザを起動する方法

# 概要
watchOS 7 からApple Watch でもショートカット アプリ を使うことができ、任意のショートカットをフェイスにコンプリケーションとして登録できるようになりました。
これを利用して、コンプリケーションからWEBブラウザを起動する方法を記載します。

**(2021/09/23) 手順2の内容をiOS15 + WatchOS 8 で動作したものに修正しました。**

# メリット
* Siriに話しかけなくてもWEBブラウザを起動できる
* バックグランドにWEBブラウザがまわっても、ブラウザを維持できる
（ショートカットアプリの中で起動しているため、状態を維持できている模様）

# 手順
1. iPhone と Apple Watch にショートカットアプリをインストールする

1. iPhoneのショートカットアプリで下記のショートカットを作成する
下記のURLを変えると、そのサイトに接続できます。
![IMG_7845.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759601/14836328-fdba-a289-e487-579785093961.jpeg)

1. ショートカットアプリの設定でApple Watchに表示できるように設定する
※ 画面の構成はiOSやショートカット アプリのバージョンにより異なります。
![9DCE879B-D695-41BF-A789-A6EAA2F111A2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759601/774e66e6-027b-767f-b34f-1588a1226d8e.jpeg)

1. Apple Watchで作成したショートカットをコンプリケーションに登録する
![807930EE-1B49-4BAB-9DE5-2B95EBAD5D09.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759601/f7738195-2987-4457-4e97-c319479686b4.jpeg)

1. コンプリケーションからショートカットを起動する
![74D0B01A-9C3D-4DD6-8654-DD0971447EAF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759601/a19d7a48-b8e5-f917-4a14-0ea61accbc66.png)
![2BCCFB18-307F-4DA0-BA05-333BBEC6453E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759601/26b8e18d-1464-88e4-f2ec-d91de299885c.png)
![D069D3B5-15F1-471A-BD90-B0BF8BA8C2CF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759601/8567b981-6589-a65f-0dd6-970334d50816.png)

1. バックグラウンドに回っても、ショートカットアプリとしてWEBブラウザが維持されている
![363FD2DC-CC09-4470-A733-2D9C39AC2630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/759601/3a5376dd-7270-3900-f468-8ab237a90b5c.png)
[Laravel] CRUD 投稿機能

## 概要

よくあるCRUDの個人メモ。
投稿画面から新規にデータを追加する過程をまとめたもの。

## 前提条件

以下記事を参考に一覧画面を作成していること。
https://qiita.com/Hiroto10/items/4723b96b491b1ce88278

## Controller

`create`と`store`を編集することで投稿機能を実現することが可能。
createは投稿画面を表示し、storeはDBにデータを格納する役割を持つ。

storeでは入力を必須と最大255文字のチェックをかけている。
データ投稿後はトップページへリダイレクトをかける。

```app/Http/Controller/TasksController.php
    public function create()
    {
        $task = new Task;

        return view('task.create', [
            'task' => $task
        ]);
    }

    public function store(Request $request)
    {
        $request->validate([
            'task' => 'required|max:255'
        ]);
        $task = new Task;
        $task->task = $request->task;
        $task->save();

        return redirect('/');
```

## View

投稿画面の作成を行う。
htmlを生成する`laravelcollective/html`を使用するためインストールする。

```
$ composer require laravelcollective/html:^6.0
```

```resources/views/tasks/create.blade.php
@extends('layouts.app')

@section('content')
  @if (count($errors) > 0)
    <ul class="alert alert-danger" role="alert">
      @foreach ($errors->all() as $error)
      <li class="ml-2">{{ $error }}</li>
      @endforeach
    </ul>
  @endif

  <h1>新規タスク投稿</h1>
  <div class="row">
    <div class="col-6">
      {!! Form::model($task, ['route' => 'tasks.store']) !!}
        <div class="form-group">
          {!! Form::label('task', 'タスク') !!}
          {!! Form::text('task', null, ['class' => 'form-control']) !!}
        </div>
        {!! Form::submit('投稿', ['class' => 'btn btn-primary']) !!}
      {!! Form::close() !!}
      </div>
  </div>
@endsection
```

![スクリーンショット 2020-10-02 0.26.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/401e9c3e-77ce-0e63-c840-05760f01a907.png)


一覧画面に投稿画面へ遷移するボタンを作成する。

```resources/views/tasks/index.blade.php
{!! link_to_route('tasks.create', '新規タスクを投稿', [], ['class' => 'btn btn-primary']) !!}
```

![スクリーンショット 2020-10-02 0.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497547/31c26308-fd95-836d-5bc2-b1ca71a09411.png)

dbへの格納が成功し、一覧画面にデータが表示されたらok。

---
以上
【Vue.js】エラー内容がHtml Webpack Plugin:やhtmlparser.js の類が出てきた

#ターミナルやホスティングしたあとのページに
 htmlparser.jsや
Html Webpack Plugin:〇〇
とか出てきて、エラーコピペしてググっても全然出てこなかったため、備忘録に

```

> vue-pwa-tutorial@0.1.0 build /Users/〇〇/Desktop/vue-pwa-tutorial
> vue-cli-service build


⠏  Building for production...

 ERROR  Failed to compile with 1 errors                                                                                             0:10:39

  Error: Parse Error: <html lang="en" background: rgb(245, 246, 248);"
  
  - htmlparser.js:240 new HTMLParser
    [vue-pwa-tutorial]/[html-minifier]/src/htmlparser.js:240:13
  
  - htmlminifier.js:966 minify
    [vue-pwa-tutorial]/[html-minifier]/src/htmlminifier.js:966:3
  
  - htmlminifier.js:1326 exports.minify
    [vue-pwa-tutorial]/[html-minifier]/src/htmlminifier.js:1326:16
  
  - index.js:316 
    [vue-pwa-tutorial]/[html-webpack-plugin]/index.js:316:18
  
  - task_queues.js:93 processTicksAndRejections
    internal/process/task_queues.js:93:5

```

#原因
ターミナルで見れば一目瞭然なのですが、
htmlタグの中に、謎のコードが打ち込まれてました。
つまり、凡ミス。
タイポや、どこかエラーがあるのに見逃している可能性が高いです。

```
 <html lang="en" background: rgb(245, 246, 248);" //こんなのが紛れてた。
```
Firebase Hostingにデプロイした際に、バグり
しかも、なぜかローカルでは普通に動いていて、
原因見つけるまで時間かかったため記録しておきます。
【ブックマークレット】カウントアップタイマーを右下に常に表示する


正直需要はほぼ無いと思いますが、
「閲覧しているページの右下にカウントアップタイマーを
表示する」ブックマークレットです。1秒ずつ増えていきます。

![count.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570700/7746a135-aaf8-fde4-2756-45663fb8a2a5.gif)

javascriptコードの簡単な解説も一番下に記載しています。
カウントアップ、ダウンの参考にして頂けたら幸いです。

「Webページ上で何かを行う際の時間を計測する」
時に使用します。自分で制作したコンテンツを読む時間を
実際に計ってみる、Web上でのテストを解く時間を計測するなど。

【利用方法】
Chrome等のブックマークのURLとして下記のコードをコピペして
そのブックマークボタンを押す事で起動します。
STOPボタンで停止、restartボタンで再開、×ボタンで閉じます。

## ブックマークレット用コード

```
javascript:
document.body.insertAdjacentHTML('afterbegin', '<div id="outbox" style="font-size:12px;position:fixed;right:10px;bottom:10px;width:190px;height:60px;padding:8px;border:1px solid #cccccc;background-color:#000000;color:#ffffff;border-radius:10px;z-index:15000;">Count:<span id="incontent"></span><br><input type="button" style="width:50px;height:22px;font-size:12px;background-color:#ffffff;color:#000000;" onclick="stopmotion();" value="stop">&nbsp;<input type="button" style="width:50px;height:22px;font-size:12px;background-color:#ffffff;color:#000000;" value="restart" onclick="starts()">&nbsp;<input type="button" style="width:25px;height:22px;font-size:12px;background-color:#ffffff;color:#000000;" value="×" onclick="countclose()"></div>');

var pswitch = "";
var tzcount = 0;
var inc;
var ctimer;
oya = document.getElementById("outbox");
inc = document.getElementById("incontent");
ctimer = setInterval("countup()",1000);

function countup() {
tzcount += 1;inc.innerText = tzcount;
if(pswitch == "end") {clearInterval(ctimer);}}

function stopmotion(){pswitch="end";}
function starts(){pswitch="start"; ctimer = setInterval("countup()",1000);}
function countclose(){oya.style.display='none';pswitch="end";}
```

## 簡易解説

setIntervalで定期的に関数を実行します。例では1秒毎。
`ctimer = setInterval("countup()",1000);`

その該当の関数では、変数+=1;で実行の度に数を増やします。
停止出来るように、if文で変数が特定の文字だったら
停止するようにしておきます。
`clearInterval(ctimer);`


```
function countup() {
tzcount += 1;inc.innerText = tzcount;
if(pswitch == "end") {clearInterval(ctimer);}}
```

##補足
表示しているページにコンテンツを差し込んでいますので
セキュリティポリシーによっては動作しない事もあります。
Chromeで検証しています。
今回作成したbotについて

## 前書き
どうも。お世話になっております。

この度、新規で約三年ぶりにTwitterのbotを立ち上げました。
以前はMakebotで作成したりしておりましたが、
Makebotのサービスが終了していたこともあり、
今回新規作成にあたっては新しくサービスを検索しなければなりませんでした。
（当方前回作成したbot以降サーバー関連の知識もつけたこともあり立ち上げようかなと思いましたが挫折しました、いつか立ち上げます）
そのため、今回は[botbird](https://metabirds.net/admin/login.php?lh=&language=ja&service_type=meta&lid=&emsg=)さんで作成しております。

とこんな能書きはともかく、botの説明に移ります。

## 松田好花さんとは？

https://www.hinatazaka46.com/s/official/artist/18?ima=0000

松田好花さんは京都府出身、1999年4月27日生まれの21歳。
日向坂46の二期生（加入当時はひらがなけやきの二期生でした）として活動中です。

~~ですが、今現在はご療養のため活動を休止しております。~~

~~本人は活動を休止するまで、ブログの更新やメッセージアプリのメッセージ送信を毎日ほぼ欠かしたことがありませんでした。~~

~~本人からのメッセージが少ない中、
何かないかな〜と思いつつ何となしで作成したのがこの
「いろいろなことを教えてくれるの松田好花bot」
です。~~

2020年12月24日、ついにご本人がひなくり2020にて活動を再開する事を発表されました。


## できること

今現在このbotができることは、
    
- 時報（１時間ごと）

- リプライで任意の文字を送信すると天気予報や時刻が返信されてくる 

以上です。

- 時報（１時間ごと）

読んで字のごとく、１時間ごとに日付と時間をツイートしてくれます。
最初は秒数までツイートさせていましたが、
現在使用しているクライアントの仕様で約40〜50秒遅れてツイートされるため、
秒数は今の所ツイートさせてません。

- リプライで任意の文字を送信すると天気予報や時刻が返信されてくる

これも読んで字のごとくです。
今現在対応している文字列はこちらです。

### 時間

- 「時」

これをリプライするとその時の時刻が返ってきます。
この返信に関しては秒数まで表示させています。

### 天気（ヤホス天気予報）

天気は

- 天気
- 最高・最低気温
- 降水確率

を表示させています。

- 「札幌の天気」、「札幌の明日の天気」
       
返信した当日・翌日の札幌の天気予報が返ってきます。
なぜ札幌なのかというと、中の人の出身地だからです（生々しい）

- 「東京の天気」、「東京の明日の天気」

返信した当日・翌日の東京の天気が返ってきます。

- 「京都の天気」「京都の明日の天気」

ご本人の出身地である京都府の天気もツイートできるようにしています。
他にも岩見沢、名古屋、横浜、土浦、さいたま市、広島、山口の天気予報も返してくれます。

以上が主な機能です。

### お遊び

#### 完全ランダムで競馬予想をしてくれる

「競馬の予想」とリプライすると、
完全ランダムで予想をしてくれます。
ロジックは特になく、

> {random:1,2,3,4,5}番、{random:6,7,8,9,10}番、{random:11,12,13,14,15}番、{random:16,17,18}番、{random:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18}番


のように適当に組んでます（）
この中から適当に５頭選んでくれます
（ミリオネアで鉛筆を転がして1000万円を取った新庄剛志のような予想です）
どうしても選びきれないであろう今年の秋天にでも使用してみてください（責任は負いません）
また、「複勝」とリプライすると一頭だけ選んでくれます。

#### 今日のご飯を決めてくれる

「今日のご飯」とリプライすると、
ランダムで今日のご飯を決めてくれます（外食多め）
決まらない方は是非。

#### 最新ブログ情報取得

「最新ブログ」とリプライすると、
今現在の松田好花さんのブログのタイトルとURLを出してくれます。
最新のものしか出せないです（今後改良はしたい）

#### SHOWROOMの予定を出してくれる

「SHOWROOM」もしくは「showroom」とリプライすると、
本人とランダムなメンバー１人の配信予定が返ってきます。
今後、クロールもしくはスクレイピングして自動取得・ツイートさせる予定です。
ちなみに「TBD」と返ってくる場合は
「To Be Determined（未定・未確定の意）」の略なのでこのちゃんがサボっているわけではありません。

## 今後追加したい機能

追加したい機能としては、

- 競馬の出馬表・結果を取得できるようにしたい（GIレースのみでもできるように）
- 個人的にサーバーを立てて管理できるようにしたい（鋭意作業中）

今の所はこんな感じです。
ただ、正直何を追加したらいいのかよくわかっていないところもありますので模索しつつやっていこうと思っております。
何かあれば、 Twitter:[@bergtwin_](https://twitter.com/bergtwin_) まで。

## 今後

本人紹介の欄にも記載しましたが、先日ご本人が活動を再開される旨を発表されました。
それに伴って、このbotに鍵をかけるか閉鎖するかのどちらかをするか正直迷ってます。

ご本人が帰ってくるまでの間のみで作ろうと思ってました（経験からして半年以上は帰ってこられないと思ってましたので・・・）から。
私としては早く帰ってきてくれるのは何事にも代えがたいほど嬉しい事でした。

この嬉しい気持ちのまま、botを終わらせるか、いろいろこれからも作成していくか迷い中です。
10月時点でのVue2からVue3への更新方法(私見)

# Vue3 への更新

Vue3 がリリースされてそろそろ 1 ヶ月ほど経ち、個人プロジェクトを Vue2 から Vue3 へ更新したのを機に、
現状での Vue3 への更新方法を確認しておきましょう。

## vue-cli-plugin-vue-next

`vue-cli-plugin-vue-next`を使い環境を更新する方法です。
このプラグインは Vue3 のベータ版が配信された時期にリリースされました。

### 使用方法

更新したい Vue CLI のプロジェクトにて、以下のコマンドを入力します。

```js
vue add vue-next
```

Vue2 の環境が Vue3 へ置き換えられます。
しかし、`Vue`本体や、`Vuex`、`Vue-router`などが Vue3 ベータ版やアルファ版のに置き換えられるため、
現状のリリースされている最新版の`Vuex`、`Vue-router`を使用したい場合には、別途手動で更新が必要となります。
なお、`Vue`本体は`vue upgrade`でも更新できなかったため、現状ベータ版からの更新はプラグインの更新待ちだと思われます。

## Vue CLI で上書き更新する

最新版の`Vue CLI`を使い、Vue2 のプロジェクトを上書きして更新する方法です。
環境と同時に`package.json`などの環境を書いたファイル、`main.js`など、重要なファイルも上書きしてしまうので、かなり破壊的な方法になります。

前提として`Vue CLI`を最新のに更新しなくてはなりません。
コマンドプロントで`Vue -V`をした時に、

```
@vue/cli 4.5.X
```

以上になっていれば、Vue3 を扱うことができます。
もしそうでなければ、`npm`や`yarn`を用いて`Vue CLI`を最新のものにしましょう。

### やり方

手法としては、更新したいプロジェクトと同じ名称のプロジェクトを新規に作成すると言った方法です。

```js
vue create hogehoge
```

あとは、必要機能などをなるべく更新したいプロジェクトと同じに指定していくだけです。
ただし、無事更新が終わっても、上記で述べたとおり、`package.json`や`main.js`の内容も書き換えられてしまうので、
Vue2 で整えた環境を大きく崩してしまう手法でもあるため、小規模ぐらいのでしか使えない手法となります。
(環境の再構築をやってしまうという覚悟があれば取れる手法ではありますが、現状ではおすすめできない…？)

### 11/05 追記
Jestで単体テストを行おうとしたら`vue-template-compiler`のバージョンと`Vue`のバージョンが合わないぞということで、
単体テストでエラーが発生してしまいました。
やはり単純に上書きした程度では、色んな依存関係がぐちゃぐちゃになるので、やらないほうがいいなと言う結論に。


# 終わりに

私の観測範囲内で以上の 2 つが主なやり方かな？と思います。

`vue-cli-plugin-vue-next`のやり方は破壊的でもなく、必要な箇所だけを Vue3 へ更新をしてくれますが、
プラグインだったり Vue3 が Beta 版だったりで、現状プラグインの開発が止まっています。

対して、Vue3 のプロジェクトを作る手法での上書き更新も、開発環境を破壊しての更新となってしまいます。
ただし、正規公開版の Vue3 を使用できるため、今後は`vue upgrade`を使えば最新の Vue3 を使うことができます。

どちらの手法も現状ではメリットデメリットが強く、まだまだ既存プロジェクトをVue3へするには時期が早いかなと言うのが個人の判断です。
(といいつつ、私の個人プロジェクトはVue3へ更新しちゃいましたが！)
恐らく年末年始から3月にかけて、安定してVue3へ更新できるプラグインができると思うので、現状ではそれ待ちかなと思います。
新規プロジェクトはがっつりVue3でやっちゃっていけるので、そっちでVue3とはを慣れていきましょう！
【TexturePacker】パブリッシュ時にCannot open device for writing: Operation not permittedとエラーになった時の対処法

僕はTexturePackerという有名なパッキングツールをよく使っています。
複数のテクスチャを一枚のテクスチャにまとめてくれて、描画処理のドローコール数を下げる目的などに使用します。

そんな便利なTexturePackerのトラブル対応です。


## 環境

- macOS Catalina 10.15.5
- TexturePacker 5.4.0

## Cannot open device for writing: Operation not permitted

パブリッシュ(複数テクスチャを一枚にまとめるて書き出す事)すると、以下のようなエラーが出る事案が発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/d4499ede-dd50-ff6f-004f-62847f2ed246.png)

エラー内容的には、書き出そうとしているファイルの書き込み権限が無いということです。


## TexturePackerの書き込み権限の確認
`システム環境設定 > セキュリティとポリシー > ファイルとフォルダ`からTexturePackerを探してアクセス許可状態を確認します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/44859a3b-b018-d07b-dcaa-7370f55ba320.png" width=450 />



ここにチェックが入っていない場合はアクセス許可がされないため、先程のエラーが出力されてしまいます。チェックを付ければ正常に書き出しができるようになると思います。



## 参考サイト

[ターミナルでコマンド実行時に「Operation not permitted」と表示される場合の対処法 | ゴリミー](https://gori.me/mac/mac-tips/112082)
Jiraのチャートが使いづらいから自作のバーンダウンチャートに切り替える。

## JiraやRedmineのバーンダウンチャートは使いづらい

JiraやRedmineのバーンダウンチャートの理想線は基本一直線です。
スプリント開始時点の合計時間がスプリント最終時点で0hになるよう一直線に引かれます。

今までのスクラム開発ではこの理想線は役に立ちませんでした...
当然、スプリント内で有給休暇を取得するメンバーやアジャイルのイベントに参加するメンバーがいます。
そうなると、チームとしての1日当たりの消化できるタスクの量は日々変動します。

この状況では一直線の理想線と実績線を比較しても順調に進んでいるのか上手く把握できません....

## メンバーの稼働可能時間を元にした理想線があるBDCがほしい...

ということで作成しました！

[バーンダウンチャート](https://github.com/shira-shun/bdc/blob/main/%E3%83%8F%E3%82%99%E3%83%BC%E3%83%B3%E3%82%BF%E3%82%99%E3%82%A6%E3%83%B3%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88.xlsx)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/8ff00143-a5c1-99e0-2902-2e685f01bdd4.png)
			
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/f1dffdf6-0356-9831-1c50-ef6db2e87200.png)
	


## 使い方

- メンバーの日付欄にはその日タスク消化に当てることができる時間を入力
- スプリント開始時タスク合計時間にはスプリントバッグログの合計時間を入力
- 残り時間にはその日時点のスプリントバッグログの残り合計時間を入力
- 実績時間にはその日時点でのスプリントバックログに当てた合計時間を入力
- 追加時間にはその日追加したスプリントバックログの合計時間を入力

## 使ってみて
- バーンダウンチャートを参考にしながらレトロスペクティブを行うようになった
  - 実績時間が少なかったら、スプリントバックログに時間を入力していないメンバーがいるとわかる
  - 追加時間が多かったら、プランニング時のタスク漏れが多いとわかる
  - いつの日がタスクの消化率が悪かったか一目でわかる
  - (何回かスプリントを回すといつも似たような形になる)

毎日入力するのは面倒ですが、よりリアルなチームの状況を可視化することができるので個人的にはメリットの方が多くあった。
これからも継続してつかってみます。
[day: 4]JSONとはなんぞや

# JSONとはなんぞや

## はじめに

2020/4/1にWEB系エンジニアになりました。
`scala/Play`　`TypeScript/Angular`
投稿は学習のアウトプットが目的です。
毎日投稿という遊びを密かにやっております。

## ことの発端

会社で`JSONとはなんですか？`という哲学的な質問をされたのですが
うまく答えられなかったので改めてJSONとは何なのかを調べてみました。

## JSONの5W1H

### いつ作られたの?

作られた年代は詳しくはわかっていません。
1996年にデータの交換用として使用されているのを観測し、普及しきました。
そのため1996年にJSONが発見された。という表現がされています。

### どこで使われているの？

アプリケーション間のデータのやりとりなどで使用されます。
主なケースとしてはAPIへのリクエスト受けて値を返す際にJSONで返しています。

### 誰が作ったの？

Douglas Crockfordさんが開発されたそうです。偉大ですね。
[Douglas Crockford](https://en.wikipedia.org/wiki/Douglas_Crockford)
現在では国際的な標準仕様が統一されており`ECMA-404 2nd edition`が規定となっています。
 
### JSONとは何？

`JavaScript Object Notation`の略からJSONと呼ばれています。
JavaScript のデータ定義文をベースとした、簡易的なデータ定義言語です。

下記のリンクをクリックすると郵便番号から住所情報を返すAPIにリクエストすることができます。
百聞は一見にしかず、まずはクリックして見ましょう。
[郵便番号で住所を検索するAPI](https://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060)
構造化されたデータが表示されましたか？
これがJSONになります。

### なぜJSONを使用するの？

JSONは構造も単純で、各言語やライブラリでも扱いが簡単なためよく利用されています。
他にもXMLというデータ構造もありましたが、現在では簡易的なJSONが利用されるケースが増えています。
子要素が一つの場合にXMLではそれが配列なのか識別することはできないが、JSONでは配列かどうかを識別できるという利便性もあります。

### どのように使うの？
基本形は以下のように`Key`と`Value`のオブジェクトになります。

```json
{ "animal": "Dog" }
```

`,(カンマ)`で区切ることで複数のオブジェクトを扱うことができます。

```json
{ "animal": "Dog", "name": "Hachi" }
```

以下のように改行とインデントで形を整えることもできます。

```json
{
  "animal": "Dog"
}
```

各言語やフレームワークにはJsonを扱うためのライブラリが提供されているので、それを利用してJsonの値を取得して表示したり加工したりすることができます。

## 参考資料
[とほほのWWW入門](http://www.tohoho-web.com/ex/json.html)
[JSON データの操作](https://developer.mozilla.org/ja/docs/Learn/JavaScript/Objects/JSON#:~:text=JSON%20%E3%81%AF%20JavaScript%20%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE,%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E6%99%AE%E5%8F%8A%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82)
[Wiki](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation)
10分くらいでできるRakefile入門

# 対象
Makefile書ける
Rubyがインストールされてる

# Rakefileとは？
Rubyで書けるMakefile

# 環境
ruby 2.7.1p83

# Hello Rakefile!
まずは適当な作業用フォルダを作る。
ここでは`rakefile-sample`というフォルダ名で作る。

そこにRakefileを作成し、以下のように記述

```.ruby:Rakefile
task :first_task do
  puts 'Hello Rakefile!'
end
```

実行

```
rakefile-sample $ rake first_task
Hello Rakefile!
```

# unixコマンドの実行

```.ruby:Rakefile
task :run_sh do
  sh %{echo Hello Rakefile sh!}
end
```

実行

```
rakefile-sample $ rake run_sh
echo Hello Rakefile sh!
Hello Rakefile sh!
```

[instance method FileUtils#sh](https://docs.ruby-lang.org/ja/latest/method/FileUtils/i/sh.html)

# 複数のタスクを順番に実行

```.rb:Rakefile
task :task1 do 
  puts 'task1'
end

task :task2 do 
  puts 'task2'
end

# task1, task2の後にtask3を実行
task :task3 => [:task1, :task2] do 
  puts 'task3'
end
```

実行

```
rakefile-sample $ rake task3
task1
task2
task3
```

# ファイルを作る

taskではなくfileにすると、対象のfile(ここではGemfile)がないときだけ実行する

```.rb:Rakefile
file 'Gemfile' do
  f = File.open('Gemfile', 'w')
  f.puts("source 'https://rubygems.org'")
  f.puts("gem 'rails', '~>5'")

  puts 'Gemfile created'
end
```

実行 (2回目は実行されないのが正)

```
rakefile-sample $ rake Gemfile
Gemfile created
rakefile-sample $ rake Gemfile
rakefile-sample $ 
```


# 参考
[library rake](https://docs.ruby-lang.org/ja/latest/library/rake.html)
[Rakeの基本的な使い方まとめ](http://unageanu.hatenablog.com/entry/20100829/1283069269)
[RubyでFile(ファイル)を書き込む方法【初心者向け】](https://techacademy.jp/magazine/7800)
JOI本選の問題を解いてみる

#[第13回日本情報オリンピック本選 C](https://atcoder.jp/contests/joi2014ho/tasks/joi2014ho3)

JOI本選の問題
予選の問題はいくつか解いたことがあるが，本選の問題で解けそうなのないかな〜と思い色々探していたら，この問題を見つけた．
結論からいうと定石の解法の組み合わせで特にすごい発想の転換とかはせずに解くことができた．(クソザコなので時間はめちゃくちゃかかったが)
#問題
>JOI 君は妹の JOI 子ちゃんと JOI 美ちゃんと一緒におやつを食べようとしている．今日のおやつは3人の大好物のバームクーヘンだ．バームクーヘンは下図のような円筒形のお菓子である．3人に分けるために，JOI 君は半径向に刃を3回入れて，これを3つのピースに切り分けなければならない．ただしこのバームクーヘンは本物の木材のように固いので，刃を入れるのは簡単ではない．そのためこのバームクーヘンにはあらかじめN個の切れ込みが入っており，JOI 君は切れ込みのある位置でのみ切ることができる．切れ込みに$1$から$N$まで時計回りに番号をふったとき，$1≦i≦N−1$に対し，$i$番目の切れ込みと$i+1$番目の切れ込みの間の部分の大きさは$A_i$である．また$N$番目の切れ込みと$1$番目の切れ込みの間の部分の大きさは$A_N$である．
![2014-ho-t3-fig01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/785205/22691afa-bf73-694e-b3fc-53faca01fbae.png)
図 1: バームクーヘンの例 $N=6,A_1=1,A_2=5,A_3=4,A_4=5,A_5=2,A_6=4$

>妹思いの JOI 君は，バームクーヘンを3つのピースに切り分けたあと，自分は最も小さいピースを選び，残りの2つのピースを2人の妹にあげることにした．一方で，JOI 君はバームクーヘンが大好物なので，できるだけたくさん食べたいと思っている．最も小さいピースの大きさが最大になるように切ったとき，JOI 君が食べることになるピースの大きさはいくらになるだろうか．


#思考

とりあえず最小値の最大値を求める問題なので，
条件$C(x)$:各ピースの大きさがx以上にできる
としたときに，あるところから右側で$C(x)$がtrue，左側でfalse
となるように二分探索すればいいということは想像できる．
問題はこの$C(x)$の部分をどう書くかだと思うが，全探索は間に合わないし，累積和でいけるかな？と思ったがちょっと詰まってしまった．
しかし
ある数列の部分列で総和が〜以上となる区間を求めよ
という問題の常套手段としてしゃくとり法が使えることを思い出すと，
最初の切り込みを入れる位置をN通り試す${\mathcal O}(N)$でいけそうだ．

#実装

```C++
#include <iostream>
#include <vector>
using namespace std;

int main(){
    int N;
    cin >> N;
    vector<long long> a(2*N);
    long long tot = 0 ;
    for(int i=0; i< N; i++){
        cin >>  a[i] , a[i+N] = a[i] , tot +=a[i];
    }

    long long lb = 0, ub = 1ll<<60 ;
    while (ub -lb > 1){
        long long mid = lb + (ub - lb)/2;


       /*しゃくとり法の実装*/
       vector<int> nextcut(N,-1) ;  /*nextcut[i]にiで切ったときに総和がmid以上になる次の切り込み位置を収納*/
        vector<long long> Size(N,-1) ;
        int right = 0;
        long long sum = 0;
        for(int left = 0; left < N; left++){
            while(right < 2*N && sum < mid){
                sum += a[right] ;
                right++ ;
            }

            if (sum >= mid){
                nextcut[left] = right ;
                Size[left] =sum;
            }
            if (right == left){
                right ++ ;
            }
            else sum -= a[left]; 
        }
        bool check = false;   /*条件判定部分*/
        for(int i=0; i < N; i++){
            int second_cut = nextcut[i];
            if (second_cut == -1) continue ;
            if (Size[i] >= tot) continue ;

            second_cut %=N ;
            int third_cut = nextcut[second_cut];
            if (third_cut == -1) continue;
            if (tot - Size[i] -Size[second_cut] >= mid) check = true;
        }
        if (!check) ub = mid;
        else lb = mid;
    }
    cout << lb << endl;
}
```

#感想
細かいところで色々と間違ってWAを連発してしまった．このレベルの問題を時間内にポンポン解いていくランカー達にはほんと尊敬しかない．
自分にも弟妹がいるので，木材のように硬くて切れ込みが入ったバームクーヘンを分けることがあったらこの通りにしようと思う．
【保存版】Mac開発でよく使うコマンド２

## GCP

### gcloud
* gcloud コマンドラインツール：   
https://cloud.google.com/sdk/gcloud/   
* Google Cloud SDKのインストール：   
https://cloud.google.com/sdk/docs/quickstart-macos

##### Cloud SDKを更新
`$ gcloud components update`

##### ローカルに保存されているアカウントを表示
`$ gcloud auth list`

##### Cloud SDKの情報を表示
`$ gcloud info`

##### SDKのプロパティを表示
`$ gcloud config list`

##### デフォルトプロジェクトを設定
`$ gcloud config set project ＜GCPプロジェクト名＞`

##### デフォルトタイムゾーンを設定
`$ gcloud config set compute/zone ＜タイムゾーン＞`


#### gcloud compute
##### プロジェクトのインスタンス一覧を表示
`$ gcloud compute instances list`


##### Compute Engineにログイン
`$ gcloud compute ssh --zone "＜タイムゾーン＞" "＜VMインスタンス名＞" --project "＜GCPプロジェクト名＞"`

##### Compute Engineからファイルをダウンロード
`$ gcloud compute scp --zone="＜タイムゾーン＞" --recurse ＜認証アカウト名＞@＜VMインスタンス名＞:＜ダウンロードファイル＞` ＜ローカルのパス＞

##### Compute Engineにファイルをアップロード
`$ gcloud compute scp --zone="＜タイムゾーン＞" --recurse ＜ローカルファイルのパス＞ ＜認証アカウト名＞@＜VMインスタンス名＞:＜アップロード先のパス＞`


#### Cloud DNS
##### Cloud DNS 一覧を表示
`$ gcloud dns record-sets list --zone="＜Cloud DNSゾーン名＞" --project "＜GCPプロジェクト名＞"`

#### Cloud Storage
gsutil：GCSを操作するためのコマンドラインツール。

##### help
`$ gsutil help`

##### ファイル一覧を表示
`$ gsutil ls gs://バケット名/フォルダ名/`

##### ファイルをコピー
`$ gsutil cp gs://コピー元のバケット名/フォルダ名/ファイル名 コピー先のバケット名/フォルダ名/`

## 参考
https://cloud.google.com/sdk/docs/quickstart-macos
https://cloud.google.com/sdk/docs/cheatsheet
Pythonってどんなプログラミング言語？ 

###はじめに
どうも現在44歳の最近スケボーを始めたジジイです。
世間一般的には、まぁーいい歳、いいジジイです。

**興味を持ったものは実際に自分で経験してやってみる。行動する！！**
という信念を掲げまして、
去年の終わり頃からプログラミングに興味を持ち、仕事をしながら現在某プログラミングスクールに通っています。こちらはもう終盤に入っている状況。
こちらではRubyやらjQueryやらRailsなどを学びWebアプリケーションをいくつか作ってきました。
また現在進行形で個人アプリを制作中でもあります。

と、ここまでいろいろと勉強してきたんですが、**無性にPythonというプログラミング言語が気になってしょうがない今日この頃！！**
なぜか惹かれるこのPython...
Pythonってなんなんだ...
パ・イ・ソ・ン......？

どうでもいい前置きが長くなりましたが、
こちらではプログラミング言語 **Python**について学習した内容を備忘録として記載していきたいと思います。

Pythonに興味を持った方々の参考になれば幸いでございます。
また、記載内容に間違いなどございましたら遠慮なくご指摘願います。
宜しくお願い致します。
* * *
### Pythonの特徴

- Pythonは1990年にグイド・ヴァンロッサムというオランダ人に開発されたプログラミング言語

- 文法がシンプルでわかりやすい、可読性が高い

- 汎用性の高いプログラミング言語なのでさまざまな開発が可能

- オブジェクト指向言語である

- 専門的なライブラリが豊富にある

Pythonのライブラリは、数万個以上のライブラリが公開されています。
大きく分けると以下の様なライブラリがあるとのこと。　

- 数値計算・信号処理・統計処理
- 画像処理・音声処理・動画処理
- ウェブ開発・サーバー・フレームワーク
- ネットワーク
- データベース
- ドライバ
- 自然言語処理

この様に多くのライブラリがありますので、効率的な開発をすることができる。

そして一例として、下記の様なサービスの構築に使われている模様。

- Youtube
- Instagram
- DropBox
- Reddit
- Blender

* * *
###どんなことが出来るのか？

- 分別の自動化
- ルート最適化の自動化
- 自動応答
- 支払いの自動化
- データ収集の自動化
- データ記録の自動化
- 株の自動売買
- 仮想通貨の自動売買
- 支払いの自動化
- Webアプリケーション
- デスクトップアプリの開発
- 人工知能/機械学習の開発
- 植物やペットの監視システム
- おもちゃのAI戦車
- ドローンの自動操縦


と、詳しい内容は今回は省きますが、いろいろな事が出来るようですね。

そして、最後に、

『既存のパターン化された仕事は、これからどんどんロボットや人工知能搭載のソフトウェアに置き換わっていき、代わりに人工知能分野の開発者が必要とされています。

その結果、人工知能開発によく使われるPythonに人々が集まっているという状況があります。 その他にも、増え続けるビッグデータの経営資源化、スマホやウェアラブルによってより複雑になる個人の消費行動、セキュリティや自動運転のための画像解析技術、このようなことから今まさに時代はPythonを求めているのですね。』

とのことです。

これからどの様な時代が来るのか楽しみでありますね。
時代に乗り遅れない様に常に好奇心を持って新しいことにチャレンジして行こうと思います。

* * *
###まとめ
検索していろいろ調べて見ましたが、まだまだ浅い部分しか触れてないので、これからいろいろと学習していきます。
だが、どうやって学習して行こうか考察中。
何かおすすめあればご教授のほど、よろしくお願い致します！！

* * *
##### 参考記事
[最近話題の言語【Python】でできる15のこと(2020年版)](https://blog.codecamp.jp/programming-python-10)
[【初心者向け】Pythonの特徴8選](https://eng-entrance.com/python-feature)
[Pythonとは？特徴やメリット・勉強法を解説【初心者向け】](https://www.sejuku.net/blog/7720)

上記サイトを参考に書かせていただきました。ありがとうございましたm(_ _)m
書字方向を分離するbdiタグについて

HTMLの`<bdi>`タグは、書字方向（文字が表示される方向）を周囲から切り離したいときに使います。<bdi>の中に右から左へと進む言語が入っていたとしても、周囲のテキストの方向には影響を与えません。

### 使いどころ：どんな言語が入るか分からないテキストに
`<bdi>`は、アラビア語やヘブライ語のように、右から左へと表示される言語がふくまれる可能性がある部分に使います。たとえば、投稿サービスの「名前」欄には、もしかするとアラビア語が入力されるかもしれません。

アラビア語のような書字方向が逆の言語が含まれると、その周囲の書字方向まで変わってしまいます。


### bdi内のテキストは、周囲に影響を与えない＆受けない
`<bdi>`内のテキストの書字方向は、周りのテキストに影響を与えないだけでなく、周りからの影響も受けません。

ブラウザは<bdi>内のテキストから自動的に表示する書字方向を決めます。`<bdi>アラビア語</bdi>`なら、自動でアラビア語の書字方向（右から左）に表示してくれます。
ユーザー認証の導入

#ユーザー認証の導入
##Basic認証
HTTP通信の規格に備え付けられている、ユーザー認証の仕組みのこと
![d5d42271f315066cae86af0e91d3b5cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/b2ff3f33-0b51-06bb-4f98-ca52bf49a361.png)
#RailsアプリケーションにBasic認証を導入
```java:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :basic_auth
  (省略)

  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == 'admin' && password == '1111'
    end
  end
end
```
##開発環境の環境変数に、ユーザー名とパスワードを設定
###macOSがCatalina以降
```java:ターミナル
% vim ~/.zshrc

# .zshrcを開いたら、「i」とタイプしてインサートモードに移行

# .zshrcの内部に次の記述を追加
export BASIC_AUTH_USER='admin'
export BASIC_AUTH_PASSWORD='2222'
# 記述を追加したら、escキーを押してインサートモードを抜け、 「:wq」と入力して保存して終了する

# .zshrcを再読み込みし、定義した環境変数を有効にする
% source ~/.zshrc
```
###macOSがMojave以前の方

```java:ターミナル
$ vim ~/.bash_profile

# .bash_profileを開いたら、「i」とタイプしてインサートモードに移行

# .bash_profileの内部に次の記述を追加
export BASIC_AUTH_USER='admin'
export BASIC_AUTH_PASSWORD='2222'
# 記述を追加したら、escキーを押してインサートモードを抜け、 「:wq」と入力して保存して終了する

# .bash_profileを再読み込みし、定義した環境変数を有効にする
$ source ~/.bash_profile
```
postgresql  relation does not exist

どうもチャンクノです。

今回はpostgresqlのエラーでつまずいたお話です。
各都道府県のデータが入っているデータベースがあるのですがそれを最新のものに更新するという事故ったら死ぬタスクを任されました。
その際ローカルのDBで以下のようなSQLを叩いた時

```
UPDATE hoges SET hoges.area_name = 'foo', hoges.area_kana = 'bar', hoges.detail_name = NULL, hoges.detail_kana = NULL, hoges.updated_at = NOW() WHERE hoges.code = '^_^' AND hoges.area_name = 'Foo' AND hoges.detail_name IS NULL
```
こんなエラーが出てしまいました。

```
Query 1 ERROR: ERROR:  column "hoges" of relation "hoges" does not exist
```
何これ😇
調べると「DBのスキーマ名とユーザー名が違う」、「テーブル名に大文字を含む時に出る」など出てきましたが、社の先輩に聞いたらシンプルにカラム名の前のテーブル名が不要だったみたいです。
つまり

```
UPDATE hoges SET area_name = 'foo', area_kana = 'bar', detail_name = NULL, detail_kana = NULL, updated_at = NOW() WHERE code = '^_^' AND area_name = 'Foo' AND detail_name IS NULL
```
これで良いということですね。
UPDATEの際はテーブル名を指定したらその後はテーブル名の指定が不要みたいです。
今回のタスクで確認の手順とか色々勉強になりました。
いやー、beyond beyond
heroku + laravel queue -- laravelキューをherokuで動かす

# TL;DR

```sh
heroku ps:scale worker=1
```
```sh:Procfile
web: vendor/bin/heroku-php-nginx -C nginx_app.conf public/
worker: php artisan queue:restart && php artisan queue:work database --tries=3
```
[最強な良記事](https://stackoverflow.com/questions/28762336/laravel-queue-worker-on-heroku)

# 実装

## laravel側
```php:routes/api.php
Route::post('queue-data',function(){
    $accessAt=now();
    $data=Str::random(10);
    \App\Jobs\StoreQueueData::dispatch($accessAt,$data)->delay(now()->addSeconds(3));
    return response()->json(['data' => $data,'access_at'=>$accessAt]);
});
```
```php:app/Jobs/StoreQueueData.php
    public function handle()
    {
        $queue=QueueData::create([
            'data'=>$this->data,
            'access_at'=>$this->accessAt,
            'handle_at'=>now(),
        ]);
        Log::info('handle',['queue'=>$queue]);
    }
```
## heroku設定
```sh
heroku ps:scale worker=1
```
```sh:Procfile
web: vendor/bin/heroku-php-nginx -C nginx_app.conf public/
worker: php artisan queue:restart && php artisan queue:work database --tries=3
```
# 動作確認
![heroku-queue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174000/986f6d83-40a7-d689-88c8-8bb50d8b8d10.png)
VBAのシートの快速描写

###・要件
データロードのCSVはVBAでExcelに読み込み、セル毎に値をセットする場合、遅くなります。
###・対応案
配列はうまく使えば、性能が改善できます。
Rangeと配列間に快速描写
###・例
#####背景
テーブル定義シートから、横のデータシートに定義を移す

```
      Dim mArr As Variant
      mArr = frmSht.Range("A7:D" & jj).Value 'Valueが必須
      wkSht.Cells(ii + 1, 2).Resize(4, jj + 1).Value = WorksheetFunction.Transpose(mArr) 'Transposeは縦配列は横になる

```
環境構築, Buildまで -C++(Visual studio CLIのみ)編-

# 方針
基本的にVisual studio大きいので使いたくない、
基本的にCLIだけで行きたい。

>cl 
windowsのc++コンパイル
g++
GNU C++ Compilerの意味

```
//Windows
//コンパイルし、demo.obj, demo.exeが生成する。
cl /EHsc demo.cpp

//Linux
```

# １．Windows


## 1. 行った結論

色々パス通さんとあかんのやね。
とりあえずコンパイルまでうまくいったので、以下を追加。

```
//コンパイルのためのcl.exeへのパスを通す
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\Hostx64\x64

//システム環境変数にそれぞれ追加する。
INCLUDE
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt\

LIB
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\lib\x64\
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64\
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\ucrt\x64
```

```
//コンパイルし、demo.obj, demo.exeが生成する。
cl /EHsc demo.cpp
```
無事コンパイルできました。

/EHsc は、標準の C++ 例外処理動作を有効にするようコンパイラに指示するコマンド ライン オプションです。 これを行わないと、スローされた例外によって、破棄されないオブジェクトやリソースのリークが発生する可能性があります。 


## 2. 詳細
#### 行った流れ

```
//以下のようなものが参照できず順次パスに追加した。
//基本的に参照できなかったもののパスを通すだけ。

"libucrt.lib" → Windows Kitsにある
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\ucrt\x64

'uuid.lib' → Windows Kitsにある
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64

"crtdbg.h" → Windows Kitsにある
C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt
```

## コメント
基本的にx64, x86などでフォルダが分岐していて、どのパスを通すか迷うが、おそらく全パスがVisual Studio導入した際には自動で通されるんでしょう。今回はMSVC-x64系統のみを通した。エラーが生じたら随時追加しようと思います。

```
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools
Llvm
MSVC
の分岐

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin
Hostx64
Hostx86
の分岐など
```

# ２．Linux

インストール

```
$ sudo apt install g++
```

## １．コマンド実行

```
//オブジェクトファイル生成
> g++ -c main.cpp hello.cpp   
//オブジェクトファイルをリンクしてa.outという実行ファイルを生成
> g++ -o a.out main.o hello.o 

//オブジェクトファイルは生成されず、直接実行ファイル作成。
> g++ main.cpp hello.cpp
```

１．静的ライブラリを作成

```
> g++ -c hello.cpp good_morning.cpp             

//静的ライブラリ(.a)の作成
> ar rvs libgreetings.a hello.o good_morning.o  

> g++ main.cpp libgreetings.a  
```

２．共有ライブラリを作成

```
//オブジェクトファイル(.o)の作成
> g++ -fPIC -c hello.cpp good_morning.cpp                 

//共有ライブラリ（.so）の作成
> g++ -shared hello.o good_morning.o -o libgreetings.so   

//main.cppをコンパイルして.soとリンクし実行ファイル.outを作成
> g++ main.cpp -L. -lgreetings -Xlinker -rpath -Xlinker . 
```
【Unity】Fungusでゲーム制作(7) 会話ウィンドウ・選択肢のUIを作り変える

Fungusの基本的な使い方に関しては[第1回](https://qiita.com/Kirikabu_ueda/items/bfc6e086d408b1cba34b)の記事で解説しておりますので、まだの方はそちらからお読み下さい。

[前回](https://qiita.com/Kirikabu_ueda/items/fbd941ee6271f0552d6d)はセーブ・ロード機能を作りました。
今回は、Fungusの会話ウィンドウや選択肢のUIを作り変える方法について解説したいと思います。
#会話ウィンドウのUIを作り変える
Fungusメニューの**「Create」→「Say Dialog」**を選択すると**Say Dialog**というものが追加されます。これが新しい会話ウィンドウのUIになります。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/6d9e2743-e54f-8b29-52ae-8822fe130134.png)
HierarchyビューでこのSay Dialogの中身を確認してみましょう。以下のようになっています。

* **Panel**: 背景部
* **NameText**: キャラの名前表記
* **Image**: キャラのPortraitが表示される場所
* **StoryText**：文章表記
    * **Continue**：改ページ表記（右下の三角）

これらの中身を変更すればそのままゲームに反映されます。
色々いじって試してみるのもいいと思いますが、ここではとりあえず一例として、サウンドノベル風の画面いっぱいに文章が表示されるようなUIを作ってみたいと思います。

まずはPanelを画面いっぱいに広げます。Panelを選択し、**Rect Transformコンポーネントの左上の四角**をクリックすると以下のような表が出てくると思います。これはuGUIの部品の座標やサイズの設定の仕方を決めるためのものです。一番右下の上下に矢印が伸びているものを選択してみてください。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/ba75c8eb-71ae-3b4b-4be5-e49ff70c0f8f.png)
その状態で、**Left, Top, Right, Bottom**の各欄を全て0にすれば、画面全体をカバーするようになります。![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/748462a6-e5f7-a8cb-8b91-bae007eb988b.png)
次に下にスクロールして**Imageコンポーネント**の**Source Image欄**でNoneを選択、**Color欄**は黒にしつつA（アルファ値）をある程度小さくします。これで半透明のスクリーンができます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/7a3f8e17-68f5-0f3e-5b72-c5f3227a008d.png)
同じ要領で**StoryText**の位置・サイズもいい感じに調節してみましょう。またStoryTextの**Textコンポーネント**からフォントを変更したりもできるので色々試してみてください。
以下のような物が作れると思います。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/19e64c96-4c7a-717a-1a3e-fb147b75800a.png)
さて、地の文を描写するシーンではこれでいいでしょうが、会話シーンだと元のUIの方がよさそうですね。こんなときのために、任意にUIを切り替えることができるようになっていますので試してみましょう。

もう一つSay Dialogを作ります。中身はデフォルトのままでOKです。最初に使わない方は非Active化しておきましょう。
そしてUIを切り替えたいところに**Set Say Dialogコマンド**を追加します。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/3c161733-67d6-87ac-9054-12f13a463a86.png)
**Say Dialog欄**に変更したいSay Dialogを指定するだけでOKです。切り替わるのを確認してみましょう。
#選択肢のUIを作り変える
Fungusメニューの**「Create」→「Menu Dialog」**を選択すると**Menu Dialog**が出てきます。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/f9365e4f-a638-0190-152e-63c108a42951.png)
これもHierarchyビューから中身を確認してみましょう。

* **OptionButton(0〜5)**: 選択肢のボタンになります。
    * これらを内包している**ButtonGroup**には**Vertical Layout Group**というコンポーネントがついていますが、これは子のGameObjectを縦に並べるためのものです。Layout Groupは他にも種類はありますがここでは詳しく解説しないので必要なら調べてみてください。
* **TimeoutSlider**: 時間制限付き選択肢（詳しくは次回解説の予定）で使う時間制限ゲージです。

いじり方についてはSay Dialogと同じで、並んでいるものの配置を変えたりImageを入れ替えたりすればゲームに反映されます。
他のMenu Dialogとの切り替えももちろん可能です。**Set Menu Dialogコマンド**を使います。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63319/c204d766-f967-1db2-5a19-7ce698d91878.png)
こちらも**Menu Dialog欄**に切り替えたいMenu Dialogを指定すればOKです。

今回はFungusにおける会話ウィンドウ、選択肢のUIを作り変える方法について解説いたしました。
次回はリアルタイム性のあるイベント、具体的には時間制限のある選択肢やQTE的なものの作り方について取り扱いたいと思います。

[第8回に進む](https://qiita.com/Kirikabu_ueda/items/d168a012bfab0036da36)
ブラウザのログイン情報を使ってAPIのリクエストを投げる

## 概要
APIをフロントエンドと分けて開発する場合、Postmanなどのツールを使ってリクエストをバックエンドのサーバに直接投げると思います。特にログインなど不要なAPIの場合は、ツールから簡単に投げれるのですがログインが必要となると、ツールからログインのAPIを別途叩く必要があります。さらに、認証に外部のサービスなど使ってると、ツールからログイン状態にするのがかなり面倒になってきます。
ということで、画面からログイン処理を行った状態で、APIリクエスト投げる方法がないかということで、今回一つ方法を紹介します。

## 方法
Firefoxのアドオンで[RESTClient, a debugger for RESTful web services.](https://addons.mozilla.org/ja/firefox/addon/restclient/)というものがあります。これは他のスタンドアローンのツールと違って、Firefoxのブラウザのタブから実行できます。ということは、同じウィンドウなら別タブでログインした認証情報を、共有できるんじゃないかと思って試してみました。

## 試してみた
テスト用のアプリケーションは、RailsのCookie認証を使用したAPIです。
APIのうち認証を必要とするパスワード変更のAPIを、Firefoxの画面から認証した状態で、リクエストを投げられるか確認してみました。

**【ログイン前】**
画面上では未ログインの状態です。
![スクリーンショット 2020-10-21 22.49.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/4c416b4d-4d00-aa29-5015-63ed18ea27a3.png)
別タブで開いているツールで投げたAPIも、認証エラーになります。
![スクリーンショット 2020-10-21 22.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/d6a34c8e-159f-4eec-c7c6-e8b0ab971f4a.png)

**【ログイン後】**
画面上ログインしました。
![スクリーンショット 2020-10-21 22.51.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/70cfca18-e856-4bfb-f8ad-a262cc710c01.png)
別タブで開いているツールで投げたAPIは通ります。
![スクリーンショット 2020-10-21 22.52.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32098/aabc1d4d-4380-fcbc-05f5-9f9c6607d97a.png)
Go Modules(vgo)について

##Go Modulesとは
Goの依存関係管理ツールです。一昔前まではdepが多く使われていましたが、Go1.11から導入され、多く使われているそうです。

ちなみに、Go1.13から本格的に導入で、Go1.11~1.12は移行期ということなので該当している場合は、バージョンアップします。また、下記のコマンドで環境変数の確認をし、**GO111MODULE**を**on**にすることでも使えるようになるようです。

```
$ go env
GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
.
.
.  //下に続く
```

##Go Modulesの使い方
実際にプロジェクトを作るところから一連の流れに沿っていきます。まず、任意のディレクトリで任意のディレクトリで新規にプロジェクトを作成します。

また、Go Modulesを使う場合、GOPATH外でも置くことは出来ますが、保存先はGOPATH下になるそうです。→[参考記事](https://qiita.com/propella/items/e49bccc88f3cc2407745#go-modules-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9 "Qiita")
※推奨は$GOPATH/src/github.com/username/任意プロジェクト

（自分の場合: $GOPATH/src/github.com/username/**testproject**）

```
mkdir $GOPATH/src/github.com/username/testproject
```

作成したプロジェクトに移動し```go mod init```を実行します。

```
go mod init github.com/username/testproject
```

testprojectと同じ階層に```go.mod```というファイルが生成されると思います。

```go.mod
module github.com/username/testproject

go 1.**  //各々のバージョン
```

ここにパッケージなどの```go get```によるインストールが記させていきます。試しに**Goのフレームワークである、Gin**をインストールしてみます。

```
go get github.com/gin-gonic/gin
```

go.modファイルに追記があるはずです。適宜、他ファイルでインポートして使用します。また、新しく```go.sum```というファイルも生成されます。ここに依存関係が記録されていきます。

```go.mod
module github.com/username/testproject

go 1.**  //各々のバージョン

require github.com/gin-gonic/gin v1.6.3
```

```go.sum
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.6.3 h1:ahKqKTFpO5KTPHxWZjEdPScmYaGtLo8Y4DMHoEsnp14=
.
.
.  //下に続く
```

##パッケージの削除
使用されていないパッケージは下記のコマンドで削除できます。また、そういった場合はエラーで教えてくれます。

```
go mod tidy github.com/gin-gonic/gin  //例
```

##最後に
今回はGo Modulesについて最低限目ものして残しておきました〜。次はGoの基本型について何回かに分けて更新していこうと思います！ちょくちょく別の内容でもメモ残していくと思いますが！！
非同期のパターン(プロミスって？？)

# はじめに
非同期パターンのプロミスについて、自分なりにまとめてみることにしました。

## プロミスとは
プロミスを簡単に説明するなら、「**非同期処理の結果の値(失敗も含む)を表現するオブジェクト**」です。

## プロミスの動作
1. 非同期処理をする、ある関数(Function A)があった時、このFunction Aを呼び出すとPromiseを返します。
2. このPromiseは、非同期処理が完了(**fulfilled**) or 非同期処理が失敗(**rejected**)のどっちかが起きることは保証されています。
3. このPromiseがfulfilled/rejectedが起きていない場合は、非同期処理が完了していない(**pending**)の状態となります。

## プロミスの状態まとめ
つまり、プロミスは３つの状態があります。

1. 非同期処理が完了(**fulfilled**)
2. 非同期処理が失敗(**rejected**)
3. 非同期処理が完了していない(**pending**)

## プロミス使用パターン
**Promise.then([ハンドラ関数A],[ハンドラ関数B])**

・ パターンとして、成功の場合に呼び出す関数を**ハンドラ関数A**、失敗したときに呼び出す関数を**ハンドラ関数B**を呼ぶようにすると、非同期処理が完了し、プロミスが成功した時は**ハンドラ関数A**が実行され、失敗したときは**ハンドラ関数B**が実行されます。

**.then() は処理結果を受け取り、新しいプロミスオブジェクトを作成して戻り値として返却するメソッドです。**

・　図は、はじめの**Promise X**が解決された後、ハンドラ関数の戻り値により**Promise Y**が解決される流れをイメージしています。[結構この図、力作ですw]

![Promise説明図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/b622ff63-77e8-a263-380d-4040a3206eea.png)




# 参考文献
[Mozilla - Promise](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)
測量のためのGPS、RTK知識まとめ

# １）GPSとGNSS
* GPSはアメリカのGlobal Positioning System
* 一方GNSSは、QZSS(日、QZS)、GPS（米）、GLONASS(露、GLO)、GALILEO（欧、GAL）、BEIDOU(中、BDS)などが含まれる。
* 本文はGPSという言葉を使うが、デバイスによって他のGNSSの衛星信号を使う場合もある。

# ２）GPSの信号（SIGNAL）に含まれるもの
### ２.１）COARSE/ACQUISITION CODE (C/A code)
* このコードは、PSEUDO RANDOM NUMBER(PRN)であり、各衛星の独自の物、1023bits。
* このコードを持つと、GPS受信機は、どのGNSSのどの衛星から受信しているかはわかる。（ACQUISITION）
* このコードがわかると、次に来るPRECISION CODEがわかる。（例：１２３４５６７８９０）
* このコードは順番継続的に流れてくるので、特定な期間中に、例えば「1234567|8901234567|890123」が受信され、うち|8901234567|がその特定の機関で受信したものとし、期待している「１２３４５６７８９０」とのシフト（３桁）が確認できると、その３桁を送信する時間がわかるので、その時間と光速で、受信機から衛星までの距離はこれでわかる。(この測量方法はやや古くて、今はCarrier Phase Positioningでやっている。)

### ２.２）NAVIGATION MESSAGE
* GPS DATE/TIME　STATUS（エラーになっていないかなど）  
  （この送信時間と光速でも大まかに距離が測れる、が衛星の時間が完全に正しいわけじゃない。1nano秒は数メートルの誤差をもたらす。）
* EPHEMERIS（天体暦） DATA　（これで衛星の場所がわかる）
* ALMANAC(現在上空に、同じGNSSシステムの他の衛星の情報が乗っている、それで他の衛星を使えるまでの時間短縮できる。)

# ３）GPSのCARRIER FREQ（L1、L2）
* L1（1575.42MHz）
* L2（1227.60MHz）
* L5（1176.45MHz）
* L1も、L2も、上記紹介したCOARSE/ACQUISITION CODE、PRECISION CODE、NAVIGATION MESSAGEが含まれる。
* 携帯など、測量級じゃない受信機だと、L1しか受信できない。（SINGLE FREQUENCY RECEIVER）/(DUO FREQ REC)
* L1とL2のFREQが違うので、受信したときに時間差が発生するので、その差はその時点の大気の影響（Ionosphere Error、真上のほど小さく、衛星が地平線になるほど大きくなる、その角度はMasking Angle）が含まれる。それを知ると、位置情報の精度がさらに上がる。
* L1はmレベルの精度を獲得できる。L2も含めるとRTKの補正によりcmレベルの精度が得られる。
* 衛星の本数が多いほど精度が上がる。三枚の場合は水平（Lat,Lon）が得られる、四枚の場合加えて垂直の高度も得られるが、3~5mずれる。（Dilution Of Positionによる物,衛星に発信した時間の誤差や大気にもたらされた誤差で、複数衛星からそのDilutionを徐々に減らしていく。各衛星のと受信機の間の角度が様々であるほど、このDilutionが減る。）
* RTKで衛星の信号を受信する時、L2の相位を使ってさらに精度向上を行っている。

# ４）GPSとの距離の測量（Carrier Phase Positioning）　Static
* 衛星が発送する電磁波の相位と、同じ時間点で受信機が受信した相位との差（PHASE FIGGERENCE）がある。
* その相位（電磁波の波長の小数部分）は確実にわかるが、整数部分（何ウェイブ分、Integer Ambiguity）はわからない。
* それをわかるようにするためには、時間と共に複数回受信して、しかもL1,L2複数波長を使って計算する必要がある。（この辺の数式は省略する）
* 長い時間動かないのでStatic測量という。Static=>2時間以上。Rapid-Static=>１５分以上かかる。

# ５）RTK（REAL TIME KINEMATIC）測量の特性
* RTKで受信機の位置を矯正するには、BASE STATION（基地局）が必要。
* 基地局の、TRUE POSITION（本当の位置）がわかって、基地局が受信している衛星からの推定位置（Satelite POSITION）がわかると、ズレがわかる、そのズレを補正する信号を周囲の受信機（ROVER）ににBroadcastする。
* 受信機は自分自身のSatelite POSITIONを獲得して、補正情報も獲得すると、正しい補正後の位置情報が獲得する。
* 大気の状態が変わるので、基地局と受信機が10kmごとに離れると、2cmの誤差が発生する。
* 基地局は、物理の基地局（D-RTK）と、NETWORK RTK（VIRTUAL REF STATIONS VRS）がある。
* D-RTKの基地局の精度の高い座標を獲得するには、長い間を待つStatic方式で得るのと、直接既知座標を入力する方式などが挙げられる。
* NETWORK RTKでは、受信機のGPS座標のもとに、周囲の基地局(C.O.R.S Continuously Operating Ref Station)の補正情報を送ったり、周囲の基地局のもとに受信機の一番近いところに仮想基地局を算出してその補正情報を送ったりすることができる。（N-TRIP）

# ６）RTKの受信状態（測量時のGPSのMODE）
### ６.１）AUTONOMOUS
* 衛星からのみ受信している（L1,L2両方受信だが、衛星以外の基地局など修正がない）
* ３〜５Mの誤差

### ６.２）FLOAT
* 基地局の修正が入っているのだが、受信機と基地局が見ている衛星の内、同じ衛星の数が少ない。
* １Mの誤差

### ６.３）FIXED
* 正しく基地局に修正を受けれる状態。
* 0.02Mの誤差

# ７）RTKの受信している時の高度の基準は、[この記事](https://qiita.com/ericofjp/items/1dbb69bf4b92b6d120bc)を参照