OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon CloudWatchのオンラインセミナー受けてみた

「[AWS Black Belt Online Seminar Amazon CloudWatch](https://www.slideshare.net/AmazonWebServicesJapan/20190326-aws-black-belt-online-seminar-amazon-cloudwatch)」の自分向けメモ
CloudWatchはなんとなく触れる......レベルの人向け


## CloudWatch概要
 - ログの監視、運用ができるサービス
 - いくつかのサービスから成り立つ（CloudWatch 〇〇）
 - 他AWSサービスとの容易な連携
 - AWS Management Toolsの内の1つ（モニタリング）
 - モニタリングに関するさまざまな機能を提供
    - AWSサービスだけでなく、オンプレサービスのログやメトリクスを収集、可視化、分析が可能

## CloudWatch Metrics
 - 各AWSサービスからメトリクスを収集できる
 - 構成要素は以下
    - 名前空間（サービス名）
    - メトリクス（統計情報の種類）
    - ディメンション（収集対象の固有値）
 - メトリクスのデータ使用可能期間は取得間隔に依存
    - 1秒ごとのデータ　⇒　3時間前まで保持
    - 1時間ごとのデータ　⇒　15か月前まで保持
 - Metric Math
    - メトリクスを計算して、新たなメトリクスを作成、表示が可能
 - スナップショットグラフ
    - グラフをキャプチャして異常通知に添付可能

## CloudWatch Alarms
 - メトリクスをモニタリングして通知が可能
 - 通知以外にもLambda実行やEC2再起動の設定が可能
 - アラームの状態は以下
    - OK
        - 定義された閾値内の状態
    - ALARM
        - 定義された閾値を超えた状態
        - 短期間で数回超えたら、通知を1回だけ発行といった設定も可能
    - INSUFFICIENT_DATA
        - データ不足で判断できない状態
        - データ不足の場合、どう評価するかを別途指定可能（正常とみなす、異常状態とみなす等）
 - クラウドならではの監視対象として、課金状況の監視も可能

## CloudWatch Logs
 - ログの監視、保存、アクセスが可能
 - S3へのエクスポートが可能
 - ディレクトリ階層は以下
    - ロググループ（サービスごと）
        - ログストリーム（ソース、バージョンごと）
            - ログイベント（日時ごと）
 - コンソール上でロググループ配下の検索が可能
    - サブスクリプションフィルタ：検索結果に含まれる特定の文字列をカウントし、LambdaやKinesisに連携可能

## CloudWatch Logs Insights
 - CloudWatch Logsの可視化が可能
 - Visualization：時間軸に沿って、トレンドやパターンの分析が可能

## CloudWatch Dashboards
 - 異なるリージョンでも1つのダッシュボートでモニタリング可能

## CloudWatch Events
 - トリガーとなるイベントソース（AWSサービスなど）を指定して、  
   イベントを処理するターゲット（AWSサービス）を定義する
 - 時間をトリガーとすることも可能
 - イベントバス：異なるAWSアカウント間でイベントの送受信が可能
 - マルチアカウントでのリソース管理が可能

## 料金
 - 従量課金

## まとめ
 - CloudWatchは、AWSリソース、アプリケーション、オンプレミスのモニタリングツール
Herokuのセットアップ

Railsチュートリアル
https://railstutorial.jp/chapters/beginning?version=5.1#sec-heroku_commands
1.5.1
に従って、herokuの設定をした記録

#本番環境のデータベースをPostgreSQLに設定
Gemfileを見ると　下記のように開発環境では mysqlを使用しているが、

```Gemfile
group :development, :test do
    # Call 'byebug' anywhere in the code to stop execution and get a debugger console
    gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
    # Use mysql as the database for Active Record
    gem 'mysql2', '>= 0.4.4', '< 0.6.0'
end
```

本番環境ではPostgreSQLを仕様するので本番 (production) 環境にpg gemをインストール

```Gemfile
group :production do
    gem 'fog'
    gem 'pg'
end
```

#ターミナルでherokuがあるか確認

```
$ heroku —version
-bash: heroku: command not found
```

もちろん使用経験がないので、無いとの返事

#herokuのインストール
https://devcenter.heroku.com/articles/heroku-cli#download-and-install

```
$ brew tap heroku/brew && brew install heroku
```

ターミナルにズラズラ〜〜 と表示　時間がかかる

#herokuユーザー登録
インストールの間に　https://signup.heroku.com/　で　
herokuユーザー登録
メール認証を経て↓が表示されれば、ユーザー登録は終了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204239/12d729d3-bdbc-780d-5a6b-386b7c6f38d7.png)

ターミナルのズラズラ〜〜が終了したので、

```
$ heroku --version
heroku/7.22.7 darwin-x64 node-v11.10.1
```
無事herokuがインストールされていた！

#herokuへログイン

```
$ heroku login
heroku: Press any key to open up the browser to login or q to exit:
```

どこかキーを押すと
ブラウザーの方でherokuのログイン画面が出てきくるので、ログインボタンを押すと
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204239/431dd64d-18ea-f82b-b4e2-81406d95b05a.png)

無事ログインできた。
ターミナルでも↓のように表示されていた

```
Logging in... done
Logged in as “登録メールアドレス”
```

#SSHキーを追加

```
$ heroku keys:add
…
? Would you like to upload it to Heroku? Yes
…SSH key... done
```
SSHキーの転送が完了した

#アプリの作成（この時点では、まだ空）

```
$ heroku create
Creating app... done,
```

#接続先の確認

```
$ git remote -v
heroku    https://git.heroku.com/****** (fetch)
heroku    https://git.heroku.com/****** (push)
origin    git@github.com:****** (fetch)
origin    git@github.com:****** (push)
```

確かにherokuを確認できた！
デプロイ編はまた今度。
UnityでDaydreamコントローラーのGesture C APIを使う

# はじめに

Daydreamは[Gesture C API](https://developers.google.com/vr/reference/android-ndk/group/gesture)がありタッチパッドについて以下のような機能を使えます。
このAPIはAndroid NDKのみに提供されていているのでUnityから扱えるようにしました。

* スワイプ判定 (開始、スワイプ中、終了、スワイプ)
* スワイプ方向の判定(上下左右)
* スワイプ速度(X軸とY軸)
* スワイプ移動量(X軸とY軸)
* 長押し判定

# 使い方

**ソース**

https://gist.github.com/shiena/d2cbd2bd100cc9ed7db4b4dfd608feca から2つのソースをコピーしてUnityプロジェクトに入れます。

**使い方**

```cs
using UnityEngine;

public class GestureTest
{
	[SerializeField] private GvrGesture gvrGesture;

	void Update()
	{
		var gestures = gvrGesture.GetGesture();
		if (gestures.Count > 0)
		{
			foreach (var g in gestures)
			{
				Debug.Log($"{g.GestureType}, {g.GestureDirection}, {g.Displacement.x}, {g.Displacement.y}, {g.Velocity.x}, {g.Velocity.y}");
			}
		}

		if (gvrGesture.LongPressed())
		{
			Debug.Log("Long pressed");
		}
	}
}
```

| 機能 | メソッド |
|----|----|
| スワイプ判定 | GvrGesture::GetGesture() |
| 長押し判定 | GvrGesture::LongPressed() |

このAPIがなくてもUnityで同じ事を実現できるのですがあったらあったで便利です。
せっかくなのでUnity Package Managerに対応しようとしたのですが依存先にGoogle VR SDK for Unityを指定できないので断念しました。残念。


# リンク

* [Gesture C API](https://developers.google.com/vr/reference/android-ndk/group/gesture)
* https://gist.github.com/shiena/d2cbd2bd100cc9ed7db4b4dfd608feca
HoloLens MRTK v2 開発環境の準備 2019年4月


# HoloLens：開発環境の準備 2019年4月


## 開発環境の準備

[本家Github](https://github.com/Microsoft/MixedRealityToolkit-Unity/)を参照し、執筆時点(2019/04/04)での推奨環境を確認

![SnapCrab_NoName_2019-4-4_20-46-20_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/62413/c049164f-addd-ddaa-9310-583d2030fe79.png)


- Unity 2018.3.x or later
- Microsoft Visual Studio 2017
- Windows SDK 10.0.17134 or later
- Windows 10 1803 or later

## 環境のインストール
詳細は他の記事に任せますが、インストーラ先だけリンクを張ります

1. [Windows 10 FCU](https://www.microsoft.com/software-download/windows10)
- [Visual Studio 2017](https://developer.microsoft.com/ja-jp/windows/downloads) (C#, UWP, Unity)
- [Unity 2018.3.11f1](https://store.unity.com/download?ref=personal)
- [Mixed Reality Toolkit v2.0.0 Beta 2](https://github.com/Microsoft/MixedRealityToolkit-Unity/releases/tag/v2.0.0-Beta2) (Unity 2018.3.x or later)
- [Hololens Simulator (optional)](https://go.microsoft.com/fwlink/?linkid=852626)

(注意点) UnityとMRTK(Mixed Reality Toolkit)とのヴァージョンをしっかり合わせましょう。
(コツ) アプリ毎に依存があるので、インストールは上からやるのがおすすめです。


## インストール結果

### Windows10
![SnapCrab_システム_2019-4-4_22-7-1_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/62413/144b1f35-8c60-88fb-aa40-cc74c0b0738b.png)

### Unity

![SnapCrab_NoName_2019-4-4_22-8-13_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/62413/abc1a385-75e9-8239-621f-b282f9eeed30.png)

![SnapCrab_NoName_2019-4-4_22-13-18_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/62413/be2083fe-bb1a-fde2-72c7-cd2c55b3c732.png)

Hololens Simulatorがちゃんとインストールされていれば、
メニューにMixed Reality Toolkitがつかされます。

#### Visual Studio 2017
SDK バージョン	10.0.17763 ビルド 17763

![SnapCrab_NoName_2019-4-4_22-10-19_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/62413/268a3a90-f594-3b17-9c4a-63b80b8c6ed3.png)

## 初めに試すチュートリアル
Qiitaの新しい記事からよさそうなものをピックアップしましたが
以下の二つはUnity 2017版らしく、手順が異なりました。。

[HoloLensでUnityちゃんを出してみよう！ - Qiita](https://qiita.com/tetrapod117/items/efdbdf157bfa093a6eb0)

[HoloLens：開発環境の準備から3Dオブジェクトを表示するまで - Qiita](https://qiita.com/hitaragx/items/0346affd15e9ddcaab1f)

Unity 2018版は次に書きます
以上!
FreeBSDでconfigureを半自動生成してみた

# やりたいこと
こんなソースをconfigureしてmakeできるようにしたい。

~~~hello.c
#include <stdio.h>

int main(int argc, const char *argv[]) {
    printf("Hello World!!\n");
    return 0;
}
~~~

# やったこと
## 環境準備
ツールがないと始まらない。
必要なパッケージをインストールする。

~~~
$ sudo pkg install autoconf automake
~~~

##修行
自動生成の恩恵を得るにも修行が必要なようです。

~~~hello.c
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#if HAVE_STDIO_H
#include <stdio.h>
#else
int printf(const char *format, ...);
#endif

int main(int argc, const char *argv[]) {
    printf("Hello World!!\n");
    return 0;
}
~~~

こんなファイルも用意しておく。

~~~Makefile.am
bin_PROGRAMS=hello
hello_SOURCES=hello.c
~~~

autoscanするとconfigure.scanというファイルが生成されるのでリネームして編集。

~~~
$ autoscan
$ mv configure.scan configure.ac
~~~

~~~configure.ac
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT(hello, 1.0, hello@example.com)
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT
~~~

##自動生成
修行の成果を見せる時！！
automakeの前に幾つかファイルを生成しておくのを忘れないように。

~~~
$ aclocal
$ autoheader
$ touch NEWS README AUTHORS ChangeLog
$ automake -a -c
$ autoconf
~~~
【随時更新予定】AWS 利用を促進する各種サポートページの紹介

タダです。

日常的に AWS サービスごとの情報を公式のドキュメントや Q&A を確認することが多いです。その他にも AWS を使うにあたって様々なサポートページが提供されているのですが、今回は目的別で AWS の様々なサポートページをまとめていきます。なお、随時アップデートがあれば記事自体を更新していければと考えています。

# 目的
## サービス毎の概要を解説した資料を知りたい
まずは、基本的な[ドキュメント](https://docs.aws.amazon.com/) や 各種サービスのよくある質問を確認することから始まると思います。ただ、非常に幅広いサービスラインナップを誇る AWS で、利用を検討しているサービスの概要を知るために図解の資料があると理解もしやすいかと思います。そんな時には下記のページを参照ください。
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/

また、目的や業種別の資料もありますので、知りたい情報があるかは下記ページから探すことをオススメします。
https://aws.amazon.com/jp/aws-jp-introduction/

定期的に Web のセミナーもあるので都合つく方は、セミナーに参加しリアルタイムで情報をキャッチアップするのが良いです。
https://aws.amazon.com/jp/about-aws/events/webinars/

## チュートリアルの情報が欲しい
AWS サービスをチュートリアルに沿って触って理解したい場合は、10分間チュートリアルがおすすめです。

https://aws.amazon.com/jp/getting-started/tutorials/

また、アプリケーションの開発においては特化したページがあるのでこちらも参考になればと。

https://aws.amazon.com/jp/campaigns/modern-application-development/

## サービス毎にナレッジを知りたい
AWS ではナレッジセンターという、よくある質問、要望をまとめたページがあります。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/

また、日本語字幕付きの動画ナレッジページがサービス毎にまとめられたページもあります。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/jp-videos/

## サーバーレスの構成例を知りたい
サーバーレスアーキテクチャ構成を採用される事例も増えてきました。サポートページでは、「<b>プロジェクト責任者向け</b>」、「<b>アーキテクト向け</b>」、「<b>開発者向け</b>」それぞれのサポートページが設けられています。

### プロジェクト責任者向けサーバーレスの効果について
サーバーレスアーキテクチャを採用している事例は増えているが、その効果や実例が紹介されています。
https://aws.amazon.com/jp/serverless/patterns/serverless-benefit/

### アーキテクト向けサーバーレス構成例
サーバーレスアーキテクチャをパターン別にまとめたページです。目的別でまとまっているので参考にするのに最適かと思います。
https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/

### 開発者向けサーバーレス開発のステップアップガイド
サーバーレスアーキテクチャでの開発を行うのが初めての方向けにサンプルアプリを作ったり、メリット、他のサービスと組み合わせ方などを紹介されています。
https://aws.amazon.com/jp/serverless/patterns/start-serverless/

## AWS サポートを利用したい
AWS のドキュメントや実際に試してみたわからない事象の解決には、AWS サポートの手を借りたくなります。なお、契約プランによって受けられるサポートが違うので利用しているアカウント毎にご確認ください。
https://aws.amazon.com/jp/premiumsupport/

また、問い合わせを行う際の心構えのページが下記ページになります。初めて問い合わせされる方は予め確認されることをオススメします。
https://aws.amazon.com/jp/premiumsupport/tech-support-guidelines/

## 負荷試験や侵入試験を行いたい
システムのリリース前に、各種試験がありますが AWS では試験を行う際にルールがあります。

### 負荷試験のルール
負荷試験をやるためには予め AWS へ申請を通過する必要があります。予め申請を行う理由は DDoS のような意図的な負荷をかけた攻撃と判断されないため必要な申請になります。
https://aws.amazon.com/jp/ec2/testing/

### 侵入試験(ペネトレーションテスト)のルール
ペネトレーションテストのルールはこちらに記載されています。
https://aws.amazon.com/jp/security/penetration-testing/

# まとめ
AWS サービスは常日頃から機能追加や新規サービスが増えているので、そのキャッチアップは必然になっていきます。公式サイトでも様々なサポートページを用意してくださっているのですが、こちらも随時更新されているような状況なので、この記事が参考サイトに到達するためのインデックスになれば嬉しいです。
これからの勉強方法。自分の指針。

# 参考にする本

[<img width="200" alt="代替テキスト" src="https://images-na.ssl-images-amazon.com/images/I/71dEH9dqYDL.jpg">](https://www.amazon.co.jp/dp/4774188832/ref=cm_sw_em_r_mt_dp_U_OsjPCb5V8XXXY)
# なぜこの本を選んだのか
**例えば、カリキュラムで勉強していた時、**
**<font color="#005CAF">redirect_toメソッド</font>も、**

```ruby:app/controllers/tweets_controller.rb
    private
    def move_to_index
      redirect_to action: :index
      # indexアクションを強制的に実行する
    end
```

**<font color="#005CAF">before_actionメソッド</font>も、**

```ruby:app/controllers/tweets_controller.rb
   before_action :hoge, except: :index
```

**同じcontrollerの知識として分類していた。**
**というよりcontrollerの知識としてしか認識していなかった。**
**もっというと、controllerに紐づく知識との認識もなかったかもしれない。**

# そこでこの本に出会う

**この本を読んで、
本当にありがたいと思ったのは、
カリキュラムで出てくる知識、出てくる知識を、
<font color="red">MVCの何に属する知識</font>か、
そしてMVCのその中でも、<font color="red">何のどんな機能に関する知識なのか</font>を整理して分類しているからだった。**

**それを果たしてくれているのが、中見出しだった。**
**大見出し(章タイトル)に続いて、<font color="red">機能毎に中見出し</font>を構成してくれていた。**
**そこに痺れた。**


# このように

<img width="700" alt="代替テキスト" src="https://qiita-image-store.s3.amazonaws.com/0/391067/c6d99bc5-7749-9668-2f0f-cc1e1f67c642.jpeg">


**例えば、第6章を見て頂きたい!!**
**controllerに関する知識を、以下の様に、機能毎に6つの章に分類してくれている!!**

    第6章
    6.1 リクエスト情報
    6.2 レスポンスの操作
    6.4 状態管理
    6.5 フィルター
    6.6 アプリ共通の挙動を定義する

<br>
**この中見出しに基づけば、
前述の```redirect_toメソッド```も、```before_actionメソッド```も、
以下の様に分類して頭の中に整理出来る。**


      redirect_toメソッド
      6.2.controllerのレスポンス操作機能に関する知識

      before_actionメソッド
      6.4.controllerのフィルター機能に関する知識

<br>
**この本のお陰で、**
**<font color="red">出会う知識</font>を、只の機能的な意味合いだけを知っている知識ではなく、
(あくまでもRailsアプリケーションの中だけでだが)、
<font color="red">Railsの全体像のどの辺に位置する知識</font>なのか、<br>逆から言えば、<font color="red">このような機能的概念をRailsって言う奴は持つ</font>のだな、と、<br>確認しながら勉強出来た。**
**INDEXを張ることで、<font color="red">知識の全体像</font>を視覚的に確認しながら勉強することが出来た。**
<img width="300" alt="代替テキスト" src="https://qiita-image-store.s3.amazonaws.com/0/391067/341e1a4b-ecd9-d995-ee61-ebef7ee8d22a.jpeg">

    上から
    大見出し
    中見出し
    ルーティング
    コントローラー
    ビュー
    モデル
**同じ知識を違う角度で再確認することにより、知識を少しだけだが多面的に理解出来たように思います!!<br>ありがとうございます!!
ぺこ〜**


# 以後、自分が行っていくこと

-  **一度勉強したカリキュラムをこの本と照らし合わせながら、知識の差異を意識して手を動かしながら学ぶ。**
-  **だから、あくまで自分にとっての基本的な知識との違いに注目してアウトプットしていく。**
-  **知識と知識の差異を確認していくことで、Railsの原理的な理解を目指す。**
  

**そもそも原理なんてものは、明確な形なぞなく、知識と知識の差異の許容の中にしか姿を表さないと信じています。**
**では!!**
[Unity] Windows/Mac/Linux共通で（たぶん）XBOXコントローラが使えるスクリプトのスケルトン

Unity2018.3以降向けにWindows/Mac/Linux共通で（たぶん）XBOXコントローラが使えるスクリプトのスケルトンを書きました。
車輪の再発明的な気がしますが、使える部分があったら使ってやってください。
[[GitHub] XBOXInputController for Unity 2018.3 or later](http://bit.ly/2G04vXA)

最初にMainScene.Unityを開いてください。
TestScript.cs が起動スクリプトだと仮定して、inputController に XBOXInputController.Instance を取得して、実際はそこを通して操作するイメージです。

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

public class TestScript : MonoBehaviour
{
    [SerializeField]
    private XBOXInputController inputController;

    // Start is called before the first frame update
    IEnumerator Start()
    {
        // Wait for initialization of InputController
        do
        {
            yield return null;
        }
        while (inputController.IsReady == false);

        yield break;
    }

    // Update is called once per frame
    void Update()
    {
        // Check: Be sure to call in this order
        uint pad = inputController.Poll();              // パッド入力
        uint pad_trg = inputController.Trigger();       // パッドトリガ入力

        // Check pad operation with pad and pad_trg values

        
    }
}
```
NullチェックのいらないLiveData

### 下記のようなクラスを作成するだけ
``` kotlin：MutableSafeLiveData.kt
class MutableSafeLiveData<T : Any>(private val default: T) : MutableLiveData<T>() {

	init {
		value = default
	}

	override fun getValue() = super.getValue() ?: default

	fun observe(owner: LifecycleOwner, observer: (T) -> Unit) =
		Observer<T>(observer::invoke).also { observe(owner, it) }

	fun observeForever(observer: (T) -> Unit) =
		Observer<T>(observer::invoke).also(::observeForever)

	fun observeWhen(owner: LifecycleOwner, value: T, observer: (T) -> Unit) =
		Observer<T> { if (it == value) observer(it) }.also { observe(owner, it) }
}
```

### 使い方
``` kotlin：Main.kt
fun Fragment.main() {
	val data: MutableSafeLiveData<String> = MutableSafeLiveData("abc")
	val getData: String = data.value
	data.value = null // ← error
	data.observe(this) { it: String ->
		Log.d("main", "data=$it")
	}
	data.observeWhen(this, "abc") { it: String ->
		// dataが abc のときだけ
		Log.d("main", "data=$it")
	}
}
```
Railsの実行環境(modelなど)でconsoleのメソッドが使えるようにするための黒魔術

# TL;DR
## 其之壱

```ruby
app = ActionDispatch::Integration::Session.new(Rails.application)
app.get root_path
app.body
```

## 其之弐

```sh
echo 'app.get app.root_path; puts app.body' | bundle exec rails c
# または
echo 'app.get app.root_path; puts app.body' | spring rails c
```

# 本文
## Rails Consoleのメソッドについて
主は `Rails::ConsoleMethods#app` というメソッドが生成した**[app](https://github.com/rails/rails/blob/b9ca94caea2ca6a6cc09abaffaad67b447134079/railties/lib/rails/console/app.rb)**という汎用モジュールのことを指します。他のConsoleのみ使えるメソッドについてはまだ研究中です。

## 不特定Moduleで使う
rakeタスクやmodel、moduleで使うには、下記の構文で consoleしか存在しない `app` というインスタンスを作れます。
Classの中で**[Url Helper](https://railsguides.jp/routing.html#%E3%83%91%E3%82%B9%E3%81%A8url%E7%94%A8%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC)**を使う方法は**[こちらの記事](https://qiita.com/jerrywdlee/items/f91c9ea01055cb74083c)**を参考してください

```ruby
class Foo
  include Rails.application.routes.url_helpers

  def magic_method
    app = ActionDispatch::Integration::Session.new(Rails.application)
    app.get root_path
    app.body
  end
end
```

## Shellから呼び出す

```sh
echo 'app.get app.root_path; puts app.body' | bundle exec rails c
# または
echo 'app.get app.root_path; puts app.body' | spring rails c
```

## :warning:注意:warning:
黒魔術ゆえ、無闇に使うと、保守性が劇的に下がる上、事故に根源にもなりえます！

# 参考
https://stackoverflow.com/a/28599867
https://stackoverflow.com/a/25128213
https://qiita.com/mt2/items/072cce9be652cf2dd743
https://qiita.com/jerrywdlee/items/f91c9ea01055cb74083c
Nuxt.js + Tone.jsで画面を撫でると音が出るやつ作った

# 概要

画面を撫でる（ドラッグ, スワイプ）で画面のXY軸に対応した音が出るWebアプリを作りました。

[NadeNadeSynth ( https://nadenadesynth.herokuapp.com/ )](https://nadenadesynth.herokuapp.com/)

![nadesynthdemo.gif](https://qiita-image-store.s3.amazonaws.com/0/92027/420cf722-f72f-a5fd-3282-d420610efcd0.gif)

X軸(左右)が音程、Y軸(上下)が音量に対応しています。

(本当は上下はフィルターに対応させたかったんだけど、うまく行かなかった)

適当に画面を触ると適当な音が出るというオモチャ的アプリです。

Mac, iOS, Androidでは確認しました（肝心のWinがまだという…）

本記事はその開発記になります。

# 開発記

実のところ、このアプリは過去に一度作ったもののドメイン引っ越しの際に消えたアプリのリベンジ版です。

(だからバージョン番号が0.0.2)

前に作ったものはスマホスワイプに対応していなかったので、そこをやりたかったのと、

今風な開発にしたかったので再挑戦しました。

## 要件定義

再挑戦なので機能を決めるところはすんなりできました。

X軸音程、Y軸がフィルターで、その部分はグラデーション背景になっている、というものです。

ライブラリなどの選定は

- Tone.js : Web Audio APIを扱いやすくしたもの。使うのはほぼ前提
- Nuxt.js : ペライチなので機能的に多すぎるのではないかとちょっと迷ったが、使い慣れているのでこれにした
- heroku : firebaseappと迷ったが、firebaseappは一旦 `nuxt generate` をかまさないと行けない（あるいはCircleCI?）ので開発時のストレスの無さで選定

こんな感じで、ここまではすんなり来ました。

## コーディング

### new Tone.Monosynth()

コーディング時に気を使ったのは、 `new Tone.MonoSynth()` する タイミングです。

`Tone.MonoSynth` はその名の通りシンセサイザーのクラスです。

使い回すのでnuxtの `mounted()` に入れられたらいいのですが、

Web Audio APIはユーザーの動作を起点に発動しなければならないという（妥当な）制限があるようで、

`mounted()` ではまずいのでちょっと苦労しました。

最終的には **nadeZone** (撫でるゾーン)の`@click`で呼ばれるイベントに置きましたが、

そこまでせずともよかったかもしれません。

（画面読み込み時に出るボタンを押したタイミングでよかったかも）

### 音の出る出ない

触っているときだけ音を出すというアプリなのですが、

マウスイベントから常に周波数を送っているという関係上、

シンセクラスを作ったり捨てたりするのは現実的ではないなと思い、使いまわしています。

しかしそれでは音が出っぱなしになるので、

音量を、

- 触っているとき: Y軸に合わせた値
- 触っていないとき: -96DB固定

にしました。

つまり結局音は出っぱなしということです…。

### スマホ対応

撫でるというコンセプト上、やはりスマホ対応はしたかったのです。

そこでたぶん知っている人は知っているけれど自分は知らなかったスマホ独特のイベントオブジェクトについて書いておきます。

PCブラウザの場合、`mousemove`に渡される`event`は直にclientX, clientYを持っているけれど、

スマホは複数タッチが可能な関係上、XY軸の情報は`@touchmove`の`event`直下にはありません。

`event.touches` という配列の下に格納されています。

``` javascript
{
  event: {
    // 略
    touches: [ // ここに配列として含まれる
      { // 最初の指がtouches[0]
        // 略
        clientX: 100,
        clientY: 100
      },
      {
        // 略
        clientX: 50,
        clientY: 50
      }
    ]
  }
}
```

だいたいこんな感じです。
なので `event.touches` が `undefined` ではなく、なおかつ `event.touches.length` が1個以上のときという条件分岐を組みました。

### Tone.js の読み込み方

単純に読み込んだだけではうまく使えません。

(おそらく、参照しているWeb Audio APIが別のものになっている)

[@sKawashimaさんの記事](https://qiita.com/sKawashima/items/59153278e73ea28fe157)を参考に、

- `import`ではなく`require`を使う
- nuxtjsにある`no-ssr`を使う（サーバーサイドレンダリングしない）

という対処をすれば読み込めました。

# まとめ

- Web Audio API は気難しい
- スマホとPCでは座標のとり方が少し違う

それでは、 Let's NadeNade!
自動更新機能の実装

メッセージの自動更新は、あるブラウザで投稿された最新の投稿に対し、それよりも新しいメッセージがDBにあればその分を取ってきて自動で更新するといった仕組みである。

そのためにポイントとなることは、非同期通信でappendされたHTMLおよび同期通信時に使用されるHTMLのなかで、メッセージが個々のIDを持っていること

```
class Api::MessagesController < ApplicationController
  def index
  	respond_to do |format|
  		format.html
  		format.json{@messages = Message.where('id > ?',params[:id]) }
  	end
  end
end
```

のようにコントローラーで記述。（コントローラーはAPIように別ディレクトリを作成した方がベター）
grayscale filter to orginal color 

###画像をホバーした時だけ、原色にする。
- https://codepen.io/gnjo/pen/pBgBBM

```css
img {
  width:500px;
  height:auto;
  transition: 1.5s;
  filter: grayscale(200%);  
}
img.foff:hover {
  filter: initial;
} 

```
```html
<img class="foff" src="//into-the-program.com/demo/images/sample010.jpg">
```
モデル名とモデル属性名の日本語化

Railsのモデルとモデル属性名を日本語化します！
早速、始めます。
とても、簡単です。

#Gemfileへ追加
以下のgemを追記します。

```Ruby:Gemfile
gem 'rails-i18n'
```

そして、いつも通り、ターミナルで、

```Ruby:
bundle install
```

します。



#config/localesに...
ja.ymlファイルを作りましょう。
マウスの右クリックで作ってもOK。

```Ruby:config/locales/ja.yml

ja:
  activerecord:
    models:
      user: ユーザー
    attributes:
      user:
        name: 名前
        email: メールアドレス
        created_at: 登録日時
        updated_at: 更新日時
```

のような形で記述します。
インデントに気をつけてください。
基本、Tabキーを使うことをお勧めします。



#config/application.rbへ追記

以下の一文を追記してください。

```Ruby:config/application.rb
config.i18n.default_locale = :ja
```

そして、最後に忘れずに、一度「Command＋C」でmサーバーダウンさせてから、ターミナルにて

```Ruby
rails s
```

してください。



#出力方法
それでは、実際に日本語でモデルを出力するのですが、次のメソッドを利用します。

```Ruby:index.html.erb
<%= User.human_attribute_name(:name) %>
```

Userモデルがあったとして、モデルオブジェクトを指定のメソッドで作り出します。
今回の例は、「name」カラムです。

当然、この出力結果が"名前"となるのは、もうお分かりかと思います。

おそらく、モデルのカラムを出力するとすれば、viewでテーブル表記をするindexファイルで利用することになるでしょう。



#おまけ
実は、私が上記の方法を試した際に、なぜかモデル名の上部にUserテーブルのレコードがテキスト表記されてしまうエラーが出て、悩まされました。

結局、eachメソッドを利用する際に<%= %>としていたことが原因でした。
細かいようですが、eachやifのような条件文の時は「=」を外しましょう。



以下の方の記事を参考にしました！
[@Ushinjiさん](https://qiita.com/Ushinji/items/242bfba84df7a5a67d5b)
[@tmiyamonさん](https://qiita.com/tmiyamon/items/2ddb9182a225cd4f2758)
ローカルでCI/CD（TeamCity）をやってみた

会社で微妙に時間があったので、ローカルでどのくらいできるか試してみました。
自宅での再現なので、gitのプロキシ設定とかは書いてません。

##前提
あくまでもお試しなので、ちゃんとやりたい場合は、設定等調べてやってみてください。
Tomcat、Maven、Gitクライアントのインストールは省きます。

##環境

OS　Windows10
サーバ　Tomcat9.0.17
リポジトリ　GitBucket4.31.1
CI　TeamCity-2018.2.3

##GitBucket

GitBucketのwarファイルをダウンロードして、Tomcatのwebappsに配置。
https://github.com/gitbucket/gitbucket/releases

これだけでGitのサーバが準備できます。
http://localhost:8080/gitbucket/にアクセスすれば、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/c193f4f6-a3a0-2560-174e-3f236fb8686b.png)

デフォルトのユーザー、パスワードはroot/rootです。

##TeamCity
続いて、TeamCityのtar.gzをダウンロード。
https://www.jetbrains.com/teamcity/download/
解凍して、
binフォルダ内で、下記を実行。

```
runAll.sh start
```

少し時間がかかります。
http://localhost:8111/にアクセスすると。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/7c8849db-e445-5bb4-f0be-934bd045c3bf.png)
多少初期設定がありますが、特に問題ないと思います。

##リポジトリ作成
右上の＋ボタンから作成できます。
gitignoreは気が向いたら作ります・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/87ae8388-9cec-4641-d1fa-dc04f30c1f60.png)

リポジトリ名を決めた後は画面の通りにプッシュ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/02806771-7aeb-eb7f-e354-3b5e58036f5e.png)

##CI設定
CIは右上のAdministrationから。
Create Project。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/9dc0dc4f-1cc7-dbd6-d24a-b8df98923bec.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/2ffe5ebb-263b-53d4-4cff-b1657eb494a1.png)

リポジトリURLはここから。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/311e4b21-0d47-4553-0f2a-79a82f9705f1.png)

あとは自動で判断してくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/918184f4-cdc9-63d5-23cb-e3710cf69d7a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/461cbeb0-c651-6aa7-d871-d12aa8fa3c65.png)

早速ビルドを実行（Runをクリック）。以降はプッシュすると自動で実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/a66dedf2-7e27-2bd9-7d55-56abaa40ac76.png)

##デプロイ

続いてデプロイ。
右上のAdministration→下の方のプロジェクト名をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/9761f013-b4a5-ff83-ac0e-00886b0f6fac.png)

Create Build Configuration
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/25dead31-8ab3-5b91-b5d9-0205c6adad32.png)

mavenでのwar作成コマンドはpackage。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/c218b15f-c2ee-5626-0ac0-23540de80485.png)

デプロイは一旦手元のTomcatへ。

```
copy target\web-app.war C:\develop\java\apache-tomcat-9.0.17\webapps\neko.war
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/51e39ac9-42d9-af78-362c-baccfc877a89.png)

同じようにRun。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/87a43e14-d5e0-46c8-d0d3-e7219b3aba8a.png)

デプロイできてます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/388624/de860598-4b63-7e59-f764-d6196b207c74.png)

明日はちゃんとサーバーでできるはず・・・
C#におけるインクリメント／デクリメント演算子の扱い

#概要
インクリメント演算子とは **++** の事です。
デクリメント演算子とは **--** の事です。
例えば下記の様な場面で目にするのではないでしょうか。

```ruby:インクリメント／デクリメントの使用例
Int32 i = 0, j = 10;
while(/* ループ条件 */)
{
    /* ループ内処理 */
    i++; /* インクリメント */
    j--; /* デクリメント */
}
```

それぞれカウントアップ、カウントダウンによく用いられます。
しかし、初心者の方だと何気なく使っている事が多いのではないでしょうか？
この記事では、**「どのような動きをするか」**について書いていきます。
<details><summary>テスト環境</summary>
プロセッサ　　　：Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz 3.41 GHz
実装メモリ(RAM)：32.0GB
システム　　　　：64ビットオペレーティングシステム
言語　　　　　　：C# 7.3 .NET Framework 3.5
ツール　　　　　：Microsoft Visual Studio 2017
#演算子の位置の違い
インクリメント／デクリメント演算子は、上記のように変数の後方に置くだけではなく、変数の前方に置くことも出来ます。
変数の後方に置くことを**後置（こうち）**、変数の前方に置くことを**前置（ぜんち）**と言います。

```ruby:後置と前置
Int32 i = 0, j = 0;
i++; /* 後置 */
++i; /* 前置 */
```

インクリメント／デクリメントはこの後置と前置によって、少しだけ動きが変わります。
その違いについて記述していきます。
##後置の場合
まずは下記コードを見てください。

```ruby:後置
Int32 i = 0;
/* 注目 */
if (i++ == 0)
{
    System.Console.WriteLine("変数 i は 0 です");
}
else
{
    System.Console.WriteLine("変数 i は 0 ではありません");
}
System.Console.WriteLine("変数 i は " + i + " でした");
```

if条件の中で後置インクリメント演算子を利用しています。
この場合、出力結果は下記の通りになります。

>変数 i は 0 です
>変数 i は 1 でした

このように、**i == 0** の条件に一致したにも関わらず、変数 **i** の中身は **1** になっています。
これはつまり、**i == 0** のチェックを行った後に、インクリメント演算子によって加算されているという事です。
##前置の場合
まずは下記コードを見てください。

```ruby:前置
Int32 i = 0;
/* 注目 */
if (++i == 0)
{
    System.Console.WriteLine("変数 i は 0 です");
}
else
{
    System.Console.WriteLine("変数 i は 0 ではありません");
}
System.Console.WriteLine("変数 i は " + i + " でした");
```

if条件の中で前置インクリメント演算子を利用しています。
この場合、出力結果は下記の通りになります。

>変数 i は 0 ではありません
>変数 i は 1 でした

このように、if条件に一致しません。
後置インクリメントとは違って、**i == 0** のチェックを行うよりも先に加算がされています。
もしもACKパケットがドロップして届かなかったら【3ウェイハンドシェイク】

3ウェイハンドシェイク中、SYN または SYN+ACK パケットがドロップしたときは気づけるけど、ACK パケットがドロップしても気づけ無い・・・？
ふと気になったので調べてみました。

結論から言うと、後続のデータ送信用のパケットに付与されているacknowledgment numbers(確認応答番号)により、ACKパケット**だけ**が途中でドロップしたことを確認できます。
ACKパケットのドロップを確認した宛先側は暗黙的なACKパケットを受け取った状態になり、SYN_RECEIVED状態からESTABLISHED状態に遷移、コネクションを確立します。

解説します。
#3ウェイハンドシェイクとは

>名前の通り以下の3つの要求と許可の確認をし、通信できる状態を作り出している。
　
1．送信元が通信路を確保するため、相手にデータ転送の許可要求を出す。（SYN）
2．宛先側が許可を送信元に知らせると同時に受信側も許可要求を出す。（ACK + SYN）
3.最初にSYNを送った送信元も宛先側に許可を出す。（ACK）

>以上の手順で送信元と宛先側の双方が許可依頼、許可受領を済ますとコンピュータ上ではESTABLISHEDという状態になる。この状態をコネクションの確立と呼ぶ。

>![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3133303330322f66333861373033322d343066652d623762392d333565622d6666336439626663623961622e6a706567.jpg](https://qiita-image-store.s3.amazonaws.com/0/85205/317981c3-e5a7-c43e-5004-ec3aae060787.jpeg)


引用元 : [【TCP】コネクションの確立までの道のり - Qiita](https://qiita.com/tatsuya4150/items/ae4d5e95e43ce0670bc0)


上記の3つの手順でパケットがドロップした場合どのような動作になるのか、トレースします。

#1. SYNパケットがドロップしたら
もしもSYNパケットが宛先側に届かなかったらどうなるでしょうか。

送信元はSYNパケットを送信しているので、SYN+ACKパケットを待機している状態です(SYN_SENT)。

宛先側は何のパケットも受け取っていないのでLISTEN状態のままです。

タイムアウトまでにSYN+ACKパケットが帰ってこなければ送信元はSYNパケットを再送信します。

#2. SYN+ACKパケットがドロップしたら

宛先側がSYNパケットを受信し、SYN+ACKパケットを返送した後SYN_RECEIVED状態に遷移します。

送信元からしてみれば、往路と復路のどちらでパケットがドロップしたとしても「SYN+ACKパケットが帰ってこない」という状態に変わりは無いので、タイムアウトを迎え次第パケットを再送信します。

#3. ACKパケットがドロップしたら

ここからがいよいよ本題です。
送信元はESTABLISHED状態に遷移し、ACKパケットを送信します。
ここでACKパケットがドロップした場合どうなるでしょうか。

送信元はESTABLISHED状態。つまりコネクションが確立した状態になり、対する宛先側はコネクションが確立されていない待機状態です。

送信元ではコネクションが確立されたと思っているので、手順1, 2のようにタイムアウトを迎えることはありません。
では宛先側でタイムアウトが有るのかというとそうではありません。

送信元はコネクションが確立された状態に遷移したため、**宛先側の状態にかかわらず**データ送受信用のパケットを宛先側に送信します。

ここで正常にパケットが受信された場合、パケットに付与されたacknowledgment numbers(確認応答番号)という情報を元に、途中のパケットが消失していないかの計算が行われます。

確認応答番号はとある一定の規則に従い増加していくため、この数値が飛んでいたらパケットの消失に気づける仕組みになっています。

確認応答番号を計算することで、ACK パケット**だけ**が途中でドロップしたことを確認できます。

ACKパケットのドロップを確認した宛先側は暗黙的な ACK パケットを受け取った状態になり、SYN_RECEIVED 状態から ESTABLISHED 状態に遷移、コネクションを確立、データの送受信を開始します。

#まとめ
ACK パケットが正常に伝送できなくても後続のパケットが正常に伝送できれば問題ない。

ちなみに、
後続のパケットもドロップし、その後のパケットが正常に伝送され場合は確認応答番号が急激に増えるため、異常を検知し、コネクションは強制的にリセットされます。

#参考
確認応答番号について詳しく知りたい方はこのサイトをおすすめします。
https://www.infraexpert.com/study/tcpip9.html

TCPのRFC
https://tools.ietf.org/html/rfc793

#蛇足
高度にブラックボックス化されているおかげで普段気にしなくて良いような知識をどれだけ知っているか。
そこに価値を見出していきたい。
CGIが動かない場合の確認点

CentOS7で`journal -f`してアクセスしてSuexecだと気がついた。

[suEXECを無効化する \- 揮発性のメモ２](https://iww.hateblo.jp/entry/20170221/suEXEC)

[suEXEC サポート \- Apache HTTP サーバ バージョン 2\.4](https://httpd.apache.org/docs/2.4/ja/suexec.html)


```conf:httpd.conf
Suexec Off
```

無効化はよくはないけど、試しで動かすときは邪魔なだけだから。
暗号理論2-3

# 初等整数論

### 2.6 最大公約数

#### Def 2.6.1
>
$ \exists d \in \mathbb{Z} \ s.t. \ , d|a,d|b \ (a , b \in \mathbb{Z}) $ であるとき, $ 
d $ を $ a $ と $ b $ の**公約数**という.

#### Theorem 2.6.2
>
少なくとも一方が $ 0 $ でない整数 $ a,b $ の公約数の中にはただ一つ最大のものが存在する.これを $ a $ と $ b $ の**最大公約数**といい $ \mathrm{gcd}(a,b) $ で表す.また $ \mathrm{gcd}(0,0) = 0 $ と定める.

今後よく用いることになる記号を定義する. $ a\_1,\dots,a\_k \in \mathbb{R} $ に対し
$$ a\_1\mathbb{Z} + \cdots + a\_k\mathbb{Z} = \\{ a\_1 z\_1 + \cdots + a\_k z\_k | z\_i \in \mathbb{Z} , 1 \leq i \leq k \\} $$ と定める.これは $ a\_1,\dots,a\_k $ のすべての**整数値線形結合**の集合である.

#### Theorem 2.6.3
>
$ a $ と $ b $ のすべての整数値の線形結合の集合は $\mathrm{gcd}(a,b)$ の倍数の集合に一致する.つまり
$$ a \mathbb{Z} + b \mathbb{Z} = \mathrm{gcd}(a,b) \mathbb{Z} $$
C言語始める人向けガイド pre令和版

こんにちは。3Kanαというものです。普段は日曜数学者だったりプログラマだったりしています。音ゲーもするしMMDerでもありますが……。なんかこう見ると自分の肩書き大分面白いですね。

まあそんなことはどうでもよくて、「C言語を始めてみたい」という人向けに少しチュートリアルを自分なりに書きたいと思います。最近はプログラミング言語も種類豊富になって、C言語からやりたいっていう人は稀なのかなという気がしますが、少しは需要があることでしょう。 
個人的には今でも初めてプログラミング言語に触れる人にはC言語がいいと思っています。C言語ができるようになれば他のC#とかJavaとか、あるいはPythonとかもすぐ理解できると思うんですよね。ただもちろん必ず昔からある言語からやる必要は無いし、RubyやらPythonから始めても全然いいわけですけど……。~~実際私もすぐにC言語やめてC++に乗り換えましたから（）~~

というわけで、チュートリアルを初めていきましょう。基本的なパソコンの操作はできる前提で話をします。

## 1. 専用のテキストエディタを用意しよう
これは必須というわけではないのですが、やっぱり何かプログラミングに特化した機能が備わっているエディタがあると作業効率も上がります。本当に最初のうちはWindows付属のメモ帳とかでも全然いいと思いますが、多数のクラス、ソースファイルを管理する必要があるレベルになるとそれでは難しいですよね。私はJavaにはEclipse、それ以外だとVS Codeを使っています。

## 2. コンパイラをインストールしよう（MinGW）
プログラミング言語によっては、ソースを書いてそれを機械に読ませるために変換する必要があるものがあります。この作業が「コンパイル」というやつです。そして、この作業をしてくれるのがコンパイラですね。
C言語のコンパイラというといくつかあるのですが、ここではgccというのを紹介します。

参考:
https://webkaru.net/clang/mingw-gcc-install/

MinGWのインストーラーをダウンロードするために、以下の公式サイトへアクセスします。
http://www.mingw.org/download/installer

そうしたらmingw-get-setup.exeというファイルがダウンロードされると思いますので、ダウンロードが終わったら実行してください。
起動したら、「Install」をクリック。
次の画面でインストール先を決めることができます。設定が終わったら「Continue」。
クリックすると、インストールが始まります。プログレスバーが100%になったら、また「Continue」を押してください。以上でMinGWのインストールは終了です。

さて、次に「MinGW Installation Manager」というのが起動するかと思います。
右上のPackageというところに、「mingw32-base」と「mingw32-gcc-g++」というものがあるはずです。
それぞれクリックして、「Mark for Installation」を選択して項目にマークをつけた状態にします。
マークが付いた状態になったら、上部のメニューから「Installtion」をクリック、中から「Apply Changes」を選択します。開いたウィンドウで「Apply」をクリックするとパッケージのインストールが始まるので、終わったら「Close」で閉じましょう。
これでgccのインストールが完了しました。

### パスを通す

あとは、コマンドプロンプトから簡単に呼べるようにパスを通しておきましょう。
Windowsの「コントロールパネル」から、「システム」を開きます。
「システムの詳細設定」から、プロパティを開いて「環境変数」をクリック。
「システム環境変数」から「Path」を選んで「編集」します。
「新規」を押して、次のパスを追加してください。（先程インストール先を変えた場合はそれに沿ってください）

```
C:¥MinGW¥bin
```

追加できたら、「OK」を押して閉じましょう。
コマンドプロンプトを立ち上げて、以下のように入力してgccの情報がずらっと出てきたら成功です。

```
gcc --version
```

お疲れ様でした。
[.Net Core] クロスプラットホーム開発の注意点 - TimeZoneInfo

# TO;DR

* TimeZone IDはプラットホームにより異なります。
* `TimeZoneConverter`パッケージを使いましょう。

# 問題

`TimeZoneInfo.FindSystemTimeZoneById`(https://docs.microsoft.com/ja-jp/dotnet/api/system.timezoneinfo.findsystemtimezonebyid?view=netcore-2.2) に渡す引数は、プラットホームにより異なります。

* macOSやLinux → IANAで決められた文字列
* Windows → 独自(?)文字列

# 回避策

`TimeZoneConverter` https://www.nuget.org/packages/TimeZoneConverter/ パッケージを使います。

```c#
var tz = TZConvert.GetTimeZoneInfo("Tokyo Standard Time");
```

# 詳細

* [Cross-platform Time Zones with .NET Core](https://devblogs.microsoft.com/dotnet/cross-platform-time-zones-with-net-core/)
キャッシュクリア方法

# 概要

各種パッケージマネージャのキャッシュクリアコマンドをまとめる。

# Git

```bash
git gc --aggressive --prune=now
```

# Docker

DockerはDockerイメージ、コンテナ、ボリューム、ネットワークのそれぞれでキャッシュが生成される。

![コンテナ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/498b55df-1cc7-9d66-0a31-ec0996860f8e.png)

各キャッシュをまとめて削除する`system prune`サブコマンドと、各キャッシュを個別に削除する`XXXX prune`サブコマンドの2種類のキャッシュクリアのコマンドが用意されている。

## 全部削除

```bash
$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] 
```

なお、`-a`オプションを付けると未使用イメージと全てのビルドキャッシュも削除される。

```bash
$ docker system prune -a
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all images without at least one container associated to them
  - all build cache

Are you sure you want to continue? [y/N] 
```

## コンテナのみ削除

```bash
docker container prune
```

## イメージのみ削除

### danglingイメージ(タグ付けされていないイメージ)削除

```bash
docker image prune
```

### 未使用イメージ削除

```bash
docker image prune -a
```

## 未使用ネットワークのみ削除

```bash
docker network prune
```

## 未使用ボリュームのみ削除

```bash
docker volume prune
```

# Linux

## apt

```bash
apt-get clean
```

## yum

```bash
yum clean all
```

# JavaScript

## bower

```bash
bower cache clean
```

## npm

```bash
npm cache clean
```

## yarn

```bash
yarn cache clean
```

# Java

## maven

mavenはキャッシュクリア用のコマンドがない。ディレクトリを丸ごと削除する。

```bash
rm -rf ~/.m2/repository/
```

# Python

## pip

pipはキャッシュクリア用のコマンドがない。ディレクトリを丸ごと削除する。

```bash
rm -rf XXX
```

`XXX`はOSに依存するディレクトリ。OS別のディレクトリは以下の通り。

- Unix `~/.cache/pip`
- macOS `~/Library/Caches/pip`
- Windows `<CSIDL_LOCAL_APPDATA>\pip\Cache`

出典：https://stackoverflow.com/questions/34578168/where-is-pip-cache-folder
AWS Route53 resolverの設定方法と料金　〜陸と空をつなぐ案内人〜




#Route53resolverとは


**オンプレとAWS、双方向でDNSの名前解決ができる機能。**
***
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/2fe9fd72-f929-76f4-b859-bacc30573a08.png)


オンプレとAWS間をDXやVPNで接続していると、**相互にDNS名前解決したい場面がよくある。**


以前はDNSのフォワーダーサーバーを構築してこれを実現してたが、**環境が拡張していくと辛い。**


一度構築したDNSの仕組みは更改するのに障壁が高い。**構築当初から視野にいれるべき。**


**そんなハイブリッド環境のDNSクエリ問題を解決する為の機能がRoute53resolverです。**


主に機能は2つで構成。
　・Route 53 resolverエンドポイント　※(VPCに向けての)インバウンドクエリ向け

　・Conditional forwarding Rules　　※(VPCから発信する)アウトバウンドクエリ向け

##料金など


Route 53 Resolverは、VPC内のDNSクエリ処理においては無料です。


エンドポイントはENIsを使用します。ENIは1時間当たり$0.125です。


最初の10億クエリまでは100万クエリあたり$0.20で、それ以上は100万クエリあたり$0.40です。
（これはConditional Forwarding Ruleで処理されるDNSクエリか、もしくはエンドポイントで処理されるクエリについてです）


その前に…


##.2 DNS resolverとは

・**デフォルトで**VPC内でDNS機能を提供するもの
・EC2インスタンスはDNSクエリをここに送信する
・無料である。


・通称「.2 DNS resolver」　「ドットツー」※例 10.0.0.2 , 172.168.0.2 ...
・処理量によってスケールする
・内向き、外向き双方の名前解決をする。（実はインターネットゲートウェイが無くとも外向きアドレスも解決してくれる）


今回のRoute 53 Resolverはこの**.2 DNS Resolver に新機能が2つリリースされた、と言えるだろう。**


##Route 53 resolverエンドポイント


　**オンプレミスからのDNSクエリをAWS所属の内部ドメインに変換する機能。**

　要は「(VPCに向けての)インバウンドクエリの機能」

　使用するにはオンプレのDNSサーバーからDXやVPNを通してAWSへ接続することが必要。

　エンドポイントはIPアドレスを持つ。

　これを任意のVPCサブネットに配置する。

##Conditional forwarding Rules


　(VPCから発信する)アウトバウンドDNSクエリはこのRoute 53 resolverのルールが適用される

　オンプレのドメインを設定する

　これらのオンプレドメインへの通信（クエリ）が発生した際、このルールが適用され、設定したDNSサーバー（オンプレのDNSサーバー）へリクエストを転送する。

　DXやVPNの経路を通過するプライベートな接続。

この2つを組み合わせると、再帰的なDNS lookupがオンプレ&クラウドのハイブリッドな業務処理で使える。

オンプレ、クラウド双方にかかる余分なマネージコスト、オペレーションコスト、メンテナンスコストを節約できる。


##設定してみよう


1.Route 53 resolverはリージョン固有サービスなので、まずはリージョンを選ぼう。

リージョンを選んだら、インバウンド向き or アウドバウンド向き or 両方かの通信方向を選ぼう。


2.インバウンド & アウトバウンド　両方の通信方向を選択した。

　まずはインバウンド向けの設定。
　
　名前を入力し、VPCを選択する。

　VPC内の1つ以上のサブネットを割り当てる。（今回、AZを2つ選択しました。）

　エンドポイントのIPアドレスを決定する。

　（選択したサブネットのIPアドレスによります。また、自動選択もできます。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/4baa7aaa-51f1-15a3-4823-734bc7c75a49.png)


3.VPCの通信がDNSクエリをオンプレのDNS基盤へルーティングする為、オンプレドメインのルールを作成します。

　オンプレのDNSサーバーのIPアドレスを1つ以上入力し、ルールを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/ec76f04f-f7a1-76a6-a111-03e3e9aeea08.png)


4.完成！

　VPCはインバウンドとアウトバウンドルールに関連付けられて、ルーティングが開始されます。
　Conditional forwarding RulesはAWS Resource Access Manager(RAM)を使用して**複数アカウントで共有できます。**

VPCの数がどんどん拡張してもバッチリですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/276897/035c3b9b-15c9-2cf7-ac9f-a29670b2db8e.png)

参考：https://aws.amazon.com/jp/blogs/aws/new-amazon-route-53-resolver-for-hybrid-clouds/

##所感
3年前にはドヤ顔でAWS公式ブログに投稿された「自前DNSフォワーダーソリューション構想」が
**今回のサービスリソースによって一瞬で「レガシー」になってしまった。**


https://aws.amazon.com/jp/blogs/security/how-to-set-up-dns-resolution-between-on-premises-networks-and-aws-using-aws-directory-service-and-amazon-route-53/


クラスメソッドさんも、いつもご苦労様です。
https://dev.classmethod.jp/cloud/aws-hybrid-cloud-dns-designs/


この構想を採用した担当者は今頃、Route 53 Resolverへの移行コストを見積もっているのだろうか。

クラウドに慣れている人にとっては日常茶飯事なのだろうか。


**クラウドサービスは小さく始める、という教訓が少し分かった。**


ありがとうございました。
少しでもお役にたちましたら「いいね」をよろしくお願いします。
シングルクォート’’とダブルクォート””の違いは囲まれた変数の扱い


エラーにはまってしまったので
自戒を込めて。



<h2>シングルクォートの場合、変数は文字列扱いに</h2>

シングルクォートの場合は、囲まれた変数は文字列扱いになってしまいます。

```php5
<?php
$getId = 3;
echo '$getId'
?>

```
この場合出力は

```
$getId
```

となってしまいます。

<h2>ダブルクォートの場合、変数は変数として扱われる</h2>

```php5
<?php
$getId = 3;
echo "$getId"
?>

```

ダブルクォートで、囲むことで

```
3
```

と表示させることができます。
Sierの新人がN予備校Webプログラミング入門コースを受けてみた

# Who?
Sier 2年目の新人プログラマー。

以下の基本的なプログラミングはできる程度です。
講座で出てくる概念や単語はおおよそ知っていましたが、実際に利用するのは初めてのものが多かったです。

- Python 
- Java
- JavaScript

他に使える技術

- Djangoを少しだけ...  
- Unixコマンド, Git
- Dockerの知識が少し

# 学んだ内容
- Node.jsでのWebプログラミング
- Scala基礎を少し

# 良いところ  
- Webプログラミングについて網羅的に学習できる  
- 環境構築もイマドキなので実践を意識した知識を身に着けられる  
- 講座は毎年推敲しているためか、非常に平易な文章でまとめられている
- 月額1000円。安い！

N予備校の講座内容については以下に詳しく説明されています。

https://www.nnn.ed.nico/pages/programming/
https://anond.hatelabo.jp/20170911110731

プログラミング自体よりも、Webプログラミングに必要な知識を実際に物を作りながら学べるので初級者->中級者のステップアップに良いと思います。

初学者に特に人気のprogateはその敷居の低さのために、環境構築は学ばないようになっています。
しかしこの部分は回避できない、かつ複雑化しつつある分野ですのでここをしっかりサポートしているのは良いところでしょう。
本講座ではWindows,Macどちらでも開発できるようにVagrantを使います。  
仮想環境を扱えることは今ではWebエンジニアにとって、常識といって過言ではないので必須スキルでしょう。
ScalaコースではDockerを使います。
環境構築・セキュリティ・ソースコード管理・テストなど、
非常にモダンなWeb開発を学ぶことができるのではないかと思います。


# 少し困る or 困ったところ
###### Node.jsは学びやすいが、RubyやPHPほどの投資対効果は見込めない(と思う）

Node.jsをサーバーサイドの言語として選択しているおかげで、フロントとサーバー両方を１つの言語で書けるのですが、**Web系企業でこれを採用している会社はそれほど多くありません**。

こういった初学者向けの講座を受ける方の多くは転職や未経験からのエンジニア就職を視野に入れている方が多いと思うのですが、そういった方に門口を開けている会社さんはやはりRubyかPHPの募集が多めです。

そういった意味でNode.jsの経験はそれほど評価されないかもしれません。
ポートフォリオ作成のためにRubyかPHPを学ぶとしたら、初めからRailsチュートリアルを受けたほうが良いのかもしれません（あちらも難易度が高めですが）。

### Scalaコースはあまり親切ではない&やはり難易度が高い
もともとこのScalaコース自体、こちらのドワンゴさんの新人研修資料をN予備校生向けに改良したもののようですが、入門コースほど平易な文章ではありません。
関数型とオブジェクト指向両方とも学ぶことになるので仕方ないかとは思います。

https://dwango.github.io/scala_text/
（しかしこの教材は体系的にまとまっていて素晴らしいと思います。）


###### オブジェクト指向を初めて教えるはずだが、通常のクラス、抽象クラス、継承を行うサンプルコードから始まる。

1つのソースコードに全て盛り込まれ、１つずつ解説していく形なのですが,
正直情報量が多すぎるかなと...。
ソースコードや情報量は増えるのに、解説の量はあまり変わらないので結果的に説明不足になっているところが多いように感じました。  

###### 関数型プログラミングを学ぶのと同時にアルゴリズムの勉強もセット

関数型言語は再帰関数など、どうしてもアルゴリズム的な考えや実装が求められるので仕方がない部分ではあります。

例をあげると

- 再帰関数でビット列による全探索で部分和問題を解く
- ケースクラスを使って最短経路問題を解く

といった具合で初めて知る概念+アルゴリズムで**なにがわからないのかわからない**という状態に見事にはまりました。
N予備校では課題提出にGithubでプルリクエストを行うようにされていますが、このあたりから一気に数が減ります。10人以下だったと記憶しています。


###### 誤字が多い

文章量が多いので仕方ないかなとは思うのですが、入門コースに比べて**非常に**多い。
"てにをはが"のミスが目立ちました。

###### 一か所、解説の通りに環境構築しても進めない箇所があった

2019年3月の時点でScala基礎コースにて、動画プレイヤーの作成を進めていたのですが、テキストの通りに進めてもJavaFxが動作しない、といった状況に遭遇しました。  
N予備校では環境構築などについて質問フォーラムが設けられていますが、私のほかに3人ほど全く同じ状況で止まってしまっているようでした。
とある回答者さんのおかげで解決しましたが、このあたりがアップデートされていないのは非常に困りました。

###### ScalaはNode.jsと同じ理由で初学者向けとは言いにくい

先ほども述べたように、こういった講座を利用している方は初学者の人が多いと思うのですが、Node.jsと同じ理由でポートフォリオ作成には向かない可能性が高いと思います。

また単純にScalaはほかの言語と比べても難易度が高めなので、**何がわからないのかわからない** -> 挫折 というルートにはまるのかなと思います。

# 個人的な感想

Web入門コースは完了、Scalaコースは応用コースで挫折して一旦止めています。
現在は自作プロダクト作成のためにrailsチュートリアルを進めているのですが、N予備校で学んだ知識のおかげですいすい進められているので、結果としては非常に良かったかなと思います。  

Scalaは余裕のあるときにまたリベンジしようかと思います...。
新人エンジニアが1年働いて失敗から学んだ3つのこと


事業会社でデータアナリストをしているsouと申します。
今の会社に未経験の立場から雇っていただき、約1年が経過しました。

1年間働いてみて、この会社のことは大好きになりました。
しかし、私はあまり期待された成果を出すことができませんでした。

自分への戒めと、今後未経験でエンジニアとして働く方々に私の失敗を見て頂いて
同じ失敗をしないで済むようにすごしてほしいと思い書きました。

また、あくまで私の失敗と自分がこうした方がいいんじゃないかと思っていることを書いているので
自分で考えて、ここに記載している方法と違う手法を行うというのも有りだと思います。


## <a id="index" href="#index">失敗から学んだ3つのこと</a>
* [コミュニケーションを恐れない](#section1)
* [自分のことを真剣に考える](#section2)
* [自分を責めない](#section3)


# <a id="section1" href="#section1">コミュニケーションを恐れない</a> 


人の目が気になる人は多いと思います。
私も「こんなこと聞いても大丈夫かな」「slackでこの発言すると変なやつだと思われるんじゃないか」といった考えをずっと持っていました。
そのため積極的に発言を行わず、受動的な行動ばかりとっていました。
その結果、後から入ってきた積極的に発言する人達に立場的にも評価的にも追い抜かれていきました。

そういったこともあり最近その考えを捨て、積極的に発言するようになりました。
何かをslackに投げると、誰かしらリアクションを返してくれます。
私が恐れていた、皆から無視されることは1度もありませんでした。

思っているよりもあなたの周囲の人は優しいです。
分からないことは聞いたら教えてくれますし、悩みをぶつけたら真剣に考えてくれます。
特に新人は自分から積極的に周囲とコミュニケーションをとるべきです。
例えば、話してみたい人をランチに誘うのはとても良いことだと思います。
周囲を怖がらず、積極的にコミュニケーションを行いましょう。

# <a id="section2" href="#section2">自分のことを真剣に考える</a> 

今まで20年以上、『なんとなく』で生きてきました。
必死に努力した体験もなく、 『なんとなく』その場を切り抜けるの連続でした。
しかし、その『なんとなく』はもう通用しなくなってきました。

自分の将来を良くするためには、自分が動くしかありません。
自分の特性を理解して、自分のことを真剣に考えて、それを行動に移してほしいです。

よく上司から当事者意識が不足しているというフィードバックを受けていました。
未経験という立場でも、あなたはプロとして雇われています。
その道のプロとして活躍していくため、自分に対しても業務に対しても当事者意識を持って取り組んでほしいです。



# <a id="section3" href="#section3">自分を責めない</a> 

これはメンタリストのDaigoさんが書かれていて、なるほどと思ったことです。
https://daigoblog.jp/notprocrastinate-myself/


失敗して怒られると、いつも「なんて自分はダメなやつなんだろう」と思っていました。
自分はダメなやつだからできないんだ、もう無理だ、といった感じにですね。
ただ、ブログにもあるように自分を責めることでその原因を考えなくなってしまいます。

そのため、まずは失敗した自分を許しましょう。
失敗した自分を肯定して、失敗を活かしてどのように自分を変えていくかが大事です。

失敗は直視しましょう。辛いけどね。私も失敗したことは考えたくありません。
でも、その原因を考えなければまた同じ失敗をしてしまいます。

#<a>最後に
>何度でも何度でも立ち上がれ 諦めなければ終わりは始まりへ変わる

という歌詞がとても好きです。(ゾンビランドサガを見てね！)

辛いことも嫌なことも沢山ありますが、本当に努力した人だけが生き残れる世界です。
一緒に頑張りましょう。
Maya Bifrost 似非ウェットマップ

<p class="youtube"><iframe width="560" height="315" src="https://www.youtube.com/embed/7cI5qJce0ag" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>


Maya Bifrost いろいろ。


<!--more-->


Droplet の概念があるのに本体と水滴でプロパティを変化させられない。残念。


Houdini の FLIP と比べても計算は速いと思う。


Bifrost の直接レンダリングは重いし暗くなる部分がある。


メッシュにしたほうがレンダリングは軽いが、メッシュ作成が重いからキャッシュを取っておかないと、かなりきつい。
キャッシュを取る時はレガシービューポートにしておかないと、Bifrost メッシュが更新されずに空の Alembic キャッシュが作成されたりする。


プレビューのみならずディスクキャッシュ作成もバックグラウンド処理になっているので、レンダリング設定等キャッシュを取りつつ別の事が出来る。
mayabatch.exe のプライオリティを下げておけば、寝る前にキャッシュを作成しながら追っかけでレンダリングさせる事が出来る。


ひとつの Bifrost だと色を混ぜられない。
オブジェクト単位でしか色付けできない。
別の Bifrost とは衝突しない。
Wet Map は無い。
衝突・コリジョンでパーティクルを発生させる機能はなさそう。


触った感じ、液体のシミュレーションというよりは、水のシミュレーション機能。
Naiad を買収したけど、Bifrost は Naiad ではない。
Bifrost では Naiad で出来たあれが出来ない！ という事は多そう。
PowerAnimator と Maya みたい。


慣れた Maya で水が扱えるのはすごくいい。



----
※ 旧ブログから移転した投稿です。
> [Maya Bifrost 似非ウェットマップ](https://www.sator-imaging.com/2014/12/maya-bifrost.html)
<iframe
    class="embed-card embed-webcard"
    scrolling="no"  frameborder="0"
    style="
        display: block;  border: none;
        margin: 10px 0px;
        width: 100%; height: 155px;
        max-width: 500px;
    "
    src="https://hatenablog-parts.com/embed?url=https://www.sator-imaging.com/2014/12/maya-bifrost.html">
</iframe>
Python デバッグ/最適化事始め

主に競技プログラミングの際に、Pythonプログラムがバグった/やたら遅いが、何が原因かイマイチ把握できない時、いつも行き当たりばったりでやっていたので自分用のメモ。
# 1. デバッグ
# 1.1. print()
簡単なデバッグならこれが一番早い。1つの変数の状態なら十分把握できる。ただし複数変数を同時に更新していくときや、関数の挙動を見る時には出力結果が読みにくいので不向き。また、文字列と整数型を間違えているときに気づけない。

# 1.2. repr()
repr()は、「オブジェクトの印字可能な表現を含む文字列」([公式ドキュメント](https://docs.python.org/ja/3/library/functions.html#repr))を返す。整数型と文字列を変換するプログラムを書くときはprint()ではなくrepr()の方が良さそう。

```py
>>> print(5)
5
>>> print('5')
5
>>> repr(5)
'5'
>>> repr('5')
"'5'"

>>> type(print(5))
5
<class'NoneType'>

>>> type(repr(5))
<class'str'>
```

# 1.3. Pycharmのデバッガ:beetle:を使う
これでデバッグのほとんど全てが解決する。pdbも正直これがあれば不要。新たにprint()とかrepr()とか書かなくていいしもう最初からこれ使えばいいかも。ただし有能すぎて一つの変数の変遷だけ追いたいときは逆に見にくいときもある。

# 2. テスト
テストでバグの箇所を特定し、デバッグでバグを除去する。classを定義していないとpycharmのテストは起動しないし、そもそもテストする必要がない。
unittestよりpytestの方が直感的で使いやすいという印象。時間もメモリも管理できる。Pycharmで使える。

# 3. 最適化
## 3.1. numpyを使う
要素が数値型なら、リストよりnumpyの方がメモリの少なく、計算も速い。累積和とか使うときは特に。
ただし呼び出しコストと、numpyの要素にアクセスするのは遅いことに注意。

## 3.2. 自己代入する
メモリ節約になる。時間は不明。

## 3.3. 文字列結合
joinを積極利用すると吉。

## 3.4. 内包表記と破壊的代入
内包表記の方が当然速いが、自己代入を内包表記でやるよりも、破壊的代入の方がメモリ使用量は少ない
プログラミング学習記録47〜なぜかいいね！欄が見れなくなる…〜

##今日やったこと
- ブログ執筆
- Railsで作ったオリジナルアプリに機能追加（投稿詳細ページから投稿一覧ページに戻る、ユーザー詳細ページの投稿の順番を変える、ユーザーが退会できるようにする）


ユーザー退会機能をなんとか付けることができました。

ですが、その替わりにいいね！欄の投稿が表示できなくなりました。

いろいろいじっているうちに。いいね！関係の部分も間違っていじってしまったのかもしれません。
完成目前で思わぬ障害が現れました。

これもプログラミングの世界では当たり前のことなんでしょうけど、ちょっとショックです。

どこが原因かわかりませんが、とりあえず今日のところは作業を終わらせたいと思います。

明日１つずついいね！欄が表示されていなものと見比べて、原因を特定したいと思います。

<br>
ブログは初めてプログラミングのソースコードを書いた記事を投稿してみました。

プログラミングを勉強しててわからないことがあった時に、正解っぽいのにたどり着けても、なかなか痒いところに手が届かないページしかないことってあると思います。

僕もそんなのばっかりで、それをちょっとでも解消したいな〜と思っていました。

今日書いた記事と同じような記事はすでに書いている方もいらっしゃいますが、僕と同じ状態の問題をピンポイントで解決する記事がなかったので、書いてみました。

多少は需要があるのではないかと思います。

あることを願って、アクセスを待ちます笑

ということで、明日からも引き続きプログラミング学習頑張ります。

おわり
【WordPress】記事ごとに設定されたアイキャッチ画像をOGPとして設定する（Twitter＆Facebook）

# TL;DR
WordPressでプラグインを使わずに記事ごとに設定されたアイキャッチ画像をOGPとして設定します

# ソース

まず以下の関数を`functions.php`へ追加

```functions.php
// URLからドメイン部分を削除したURLを返す
function delete_domain_from_url( $url ) {
    if ( preg_match( '/^http(s)?:\/\/[^\/\s]+(.*)$/', $url, $match ) ) {
        $url = $match[2];
    }
    return $url;
}
```

この関数が返すURLの例として正規表現チェッカーの結果を貼っておきます↓
（https://qiita.com/sola-msr を引数としてセットした場合、**$m[2]**の値が取得できます）
![FireShot Capture 338 - 正規表現チェッカー PHP_ preg_match() _ JavaScript_ match() - okumocchi.jp.png](https://qiita-image-store.s3.amazonaws.com/0/85815/0cc8e288-94d3-781e-c455-1191b28c841d.png)

各環境によってドメインが異なるのでWPの関数で取得したのち、アイキャッチ画像のURL（ドメインを削った相対パス）をくっつけるという感じです。

# OGP設定

`header.php`へ以下のメタタグを書きます

```header.php
<?php if ( is_single() && has_post_thumbnail() ) : ?>
    <!-- 記事に設定されているアイキャッチ画像のOGP -->
    <meta property="og:image" content="<?php echo home_url() . delete_domain_from_url(wp_get_attachment_image_src( get_post_thumbnail_id(), 'full' )[0]); ?>">
<?php else : ?>
    <!-- デフォルトOGP -->
    <meta property="og:image" content="<?php echo home_url() ?>/image/ogp.png">
<?php endif; ?>
```

**Twitter用OGP**

```header.php
<?php if ( is_single() && has_post_thumbnail() ) : ?>
    <!-- 記事に設定されているアイキャッチ画像のOGP -->
    <meta name="twitter:image" content="<?php echo home_url() . delete_domain_from_url(wp_get_attachment_image_src( get_post_thumbnail_id(), 'full' )[0]); ?>">
<?php else : ?>
    <meta name="twitter:image" content="<?php echo home_url() ?>/image/ogp.png">
<?php endif; ?>
```

# 確認方法

## Facebook
**デバッガー - 開発者向けFacebook**
https://developers.facebook.com/tools/debug

「シェアデバッガー」を選択して確認したいURLを張り付けて「デバッグ」をするとシェアした際の状態を確認できる

## Twitter

**Card Validator | Twitter Developers**
https://cards-dev.twitter.com/validator

「Card URL」に確認したいURLを張り付けて「preview card」を押すとシェアした際のTLに表示される状態を確認できる

# おわり

- **プラグイン「All in One SEO」の設定とかでog:imageの設定をしてるとうまく反映されないので注意（マジで）**

# 参考URL

- [OGPタグ設定したのに、画像が表示されないよ！って人の応急処置 - Qiita](https://qiita.com/Hosh0801ict/items/86bd0810fe57a4620f9e)
Go言語からGoogleDriveAPI V3のUpdateを使おうとしたらfieldNotWritableエラーでつまづいて解決した

# 結論

FilesService.Updateの第二引数で指定するdrive.File構造体のIdフィールドは空文字列 `""` にする必要がある。

# エラー内容と発生箇所のコード

```
googleapi: Error 403: The resource body includes fields which are not directly writable., fieldNotWritable
```

```golang
srv.Files.Update(fileId, file).Media(localFile).Do()
```

# やりたかったこと

- ローカルにあるファイルをGoogleドライブ上にコピーする。
    - Googleドライブ上の指定フォルダに同名のファイルが存在する場合は上書き、そうでなければ新規作成する。

# つまづいたきっかけ

- 上書き時に指定するfileIdを取得するため、Files.Listを使ってdrive.File構造体を取得した。
- 取得した構造体を以下のように流用しようとした。

    ```golang
    srv.Files.Update(file.Id, file).Media(localFile).Do()
    ```

# 私が誤解したところ

- [Fileのリファレンス](https://developers.google.com/drive/api/v3/reference/files#resource)にIdはwritableと書いてあり、エラー原因がここではないと勘違いした。
- `file.Id == fileId` なら（≒実質的に変更が無ければ）エラーにはならないと勘違いした。

# 対象バージョンのAPI

- https://developers.google.com/drive/api/v3/reference/files/update
- https://godoc.org/google.golang.org/api/drive/v3#FilesService.Update