OmniAICreator/Qiita-1.07M huggingface dataset:
lambda pythonで制限時間に引っかかった時にやったこと

## はじめに
昔のLambdaは制限時間が5分で、batch系の処理なんかでは制限時間をオーバーして異常終了したりしていました
またAPI Gatewayから起動されるLambdaが「もっと速く出来ないの」って言われたりもします
その時の対応内容を紹介します

エンジニアですので、数値を持って語るべきなのですが、前職での実行内容だったり、手元に環境がなかったり、この記事のためだけに環境を作るのは諸々の事情で憚られますので割愛します

## ちょっと寄り道

レスポンスで問題が出た場合は、まずprofileを取る訳ですが、私がいつもやる方法も念の為記しておきます

#### 対象ライブラリ

```
import cProfile
import pstats
```
cProfileだけでprofileは取れますが、取得結果をソートするためにpstatsも使います

#### 測定開始
cProfileをインスタンス化して、測定の有効化

```
pr = cProfile.Profile()
pr.enable()
```

#### 測定終了と結果確認
profileを無効化してソート用objectを生成
ソートして出力

```
pr.disable()
stats = pstats.Stats(pr)
stats.sort_stats('tottime')
stats.print_stats()
```

どんな項目でソート出来るかは、[マニュアル](https://docs.python.org/ja/3/library/profile.html#pstats.Stats.sort_stats)を参照してください

profileに目立ったボトルネックが見つからない場合もあると思います
その場合はI/Oが多そうな所を改善したら良い結果に繋がるケースもありました

## 本題

### psycopg2のDictCur
listでなくdictで検索結果を参照できるのはすごく便利なのですが、dictへのマッピングコスト高いのか、大きなボトルネックになっていました
対象のテーブルがかなりのカラム数だったことも影響していそうです
DictCurを諦め、代わりにlistの添字を定数で抽象化して回避しました

参考Url: [Python psycopg2 で dict形式で結果を取得する](https://qiita.com/itoufo/items/7306122497fd4f712bff)


### logger
LambdaはprintすればCloudWatch Logsでlogを見られる訳ですが、問題となったLambdaはloggerを使っていました
loggerの設定って[闇](https://qiita.com/amedama/items/b856b2f30c2f38665701#%E4%BD%95%E6%95%85%E3%83%80%E3%83%A1%E3%81%AA%E3%81%AE%E3%81%8B-logging)が深いみたいでこちらの目的はlogを見たいだけなんですよね

loggerをprintにしただけで、処理速度が改善しました
logger的な出力レベルのコントロールもしたかったので、ログ出力をラップする簡単な関数を作ってloggerに必要な機能を損ねないようにしました

また、単純にprintを減らしただけで処理速度が改善したケースもありました
logは本番運用では必要となってきますが、開発でしか必要としないlogを出しっぱなしなケースもあると思います
本当に必要なlogのみを出力するようにしたいものです


### キャッシュ1
profileを取った時にboto3が目立っていました
だからといってSDKを使わない訳にはいきません

なので、1度生成したboto3 objectはキャッシュして2回目以降はキャッシュを使うようにしました
結構大きなLambdaで、複数ファイル、10個以上のclassで構成されていました
classのプロパティに生成したboto3 objectを保持するようにしました

```
if self.__XXXX_table_obj is None:
    self.__XXXX_table_obj = boto3.resource("dynamodb").Table(self.get_XXXX_table())`
```


また、マスターの参照結果もプロパティにキャッシュするようにしました

```
if XXXX_id in self.__XXXX_cache:
    return self.__client_cache[XXXX_id]
```

なお、頻繁にアクセスされるアプリではないため、Lambdaコンテナの再生成されるタイミングでマスタも新規に取得できます

### キャッシュ2
何をどうやっても目標の時間が達成できない場合もあるかと思います
問題となったシステムは、一定時間ごとにまとまってデータが更新されるものでした
ですので、データが更新されない間は同じ内容を返せば良いことになります

そのため、処理結果(Json)をDynamoDBに登録してその内容を返すようにしました
キーはAPI名＋パラメータとしました
API体系としてはシンプルでしたので、問題ありませんでした

データが更新された際には、SNSで通知が来るのでDynamoDBの内容を登録しなおします

1つ誤算だったのはDynamoDBに格納できる[最大値(400KB)](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes)をオーバーするJsonがあったことでした
繰り返し項目が多いJSONだったので、圧縮してバイナリで登録することで事なきを得ました


## 終わりに
小ネタばかりで恐縮ですが、この記事がPython Lambdaの処理速度に悩める方の一助になると幸いです
ADCのキャリブレーション

#キャリブレーションとは

理想的なADCはGNDを入力したときに0、Vddを入力したときに最大値になります。しかし、実際のADCには誤差があります。
0にならない誤差をオフセット誤差、最大値にならない誤差をゲイン誤差といいます。
詳細は以下のホームページをご覧ください。
https://ednjapan.com/edn/articles/1810/02/news018_4.html

これを補正するには、GNDを接続したときのADC値と、Vddを接続したときのADC値を保存して、そこが0VとVddになるように、一次関数で修正するようにします。

```math
校正後電圧 = \frac{Vdd*(ADC値 - GNDを接続したときのADC値)}{Vddを接続したときのADC値-GNDを接続したときのADC値}
```

#Nulceo-F401REでの実例

Nucleo-F401を使って実際にやってみます。

STM32CubeIDEで、PA0をGND、PA1をVdd、PA4を可変抵抗器の出力につなぎます。可変抵抗器の両端はVddとGNDにつないで、出力範囲が0から3.3Vになるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/516bd837-3fca-6d9d-01fa-8094b9022b5d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/68323c39-6ba0-7cff-1b05-630a0dfd5717.png)

コードを以下のように入力します。

```
/* USER CODE BEGIN 0 */
uint32_t OffsetAcc = 0;
uint32_t GainAcc = 0;
uint32_t ADCValue;
float V;
/* USER CODE END 0 */
```
```
  /* USER CODE BEGIN 1 */
	ADC_ChannelConfTypeDef sConfig = {0};
  /* USER CODE END 1 */
```
```
  /* USER CODE BEGIN 2 */

  // Get Offset Accuracy
  // GND connect with ADC_IN0
  // Init sConfig for ADC_IN0 is in MX_ADC1_Init
  HAL_ADC_Start(&hadc1);
  HAL_ADC_PollForConversion(&hadc1,1000);
  OffsetAcc = HAL_ADC_GetValue(&hadc1);
  HAL_ADC_Stop(&hadc1);
  hadc1.Instance->SQR1 = 0;

  // Get Gain Accuracy
  // Vdd connect with ADC_IN1
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);
  HAL_ADC_Start(&hadc1);
  HAL_ADC_PollForConversion(&hadc1,1000);
  GainAcc = HAL_ADC_GetValue(&hadc1);
  HAL_ADC_Stop(&hadc1);
  hadc1.Instance->SQR1 = 0;

  // Get ADC and convert to calibrated value
  // I connect the ADC port with ADC_IN4
  sConfig.Channel = ADC_CHANNEL_4;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);

  /* USER CODE END 2 */
```
```
    /* USER CODE BEGIN 3 */
	  // Get ADC Value
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1,1000);
	  ADCValue = HAL_ADC_GetValue(&hadc1);
	  HAL_ADC_Stop(&hadc1);

	  // Get calibrated Voltage
	  V = 3.3F*((float)ADCValue - (float)OffsetAcc)/((float)GainAcc - (float)OffsetAcc);
	  __NOP();
```

__NOP()にbreakpointを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/1e934e49-64a2-8cfc-41ff-a81f2296c4c7.png)

関係する変数をExpressionに表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/944597ca-2d73-3db6-c51a-5476e33068c7.png)

実行すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/0fcbc838-5d07-593f-2041-bdf525e08188.png)

このキャリブレーションは電源投入時に毎回行うのが望ましいですが、一度測定して、その値を使いまわしても構いません。
各ボードおよびSTM32に依存しますので、ボードごとに行ったほうがいいでしょう。

いくつかのSTM32シリーズにはオートキャリブレーションというレジスタに1bit立てるだけで、この機能を行うものもあります。STM32F401にはその機能がないので、自分で行う必要があります。

ソースコードはGitHubに置きました。
https://github.com/kotetsuy/STM32forWindowsDemos/tree/master/ADCCalibration
graphqlサーバーフレームワークを作ってみたよって報告してみたり

# Lunar.js

こっちがメインリポジトリ
https://github.com/inadati/Lunar.js

こっちがdocker-composeで超簡単にサンプルを試せるように
コンテナ化したやつ
https://github.com/inadati/Lunar.js-sample

# コンセプト
Hasuraとクライアントアプリの橋渡しをする為の
ブリッジサーバーとしての立ち位置が基本です。
なので、サーバー自体もApolloの拡張である「graphql-yoga」を利用し
クライアントも「ApolloClient」を使い
HasuraのgraphQL apiを叩いてやろうと
そういう、コンセプトになります。
サーバーとしても「Apollo」、クライアントも「Apollo」なので
「Lunar(月面)」という事です。
ちなみにフレームワークとしてのベースはparcelを利用しています。

ApolloClientを使わずORMを使って直接、DBへの読み書きをする
graphQLサーバー構築の為のフレームワークとしても利用は可能ですが
Hasuraを使って爆速開発するというのが目的なので
クライアントはApolloClientを使うのが最もオススメです。

# 2019年末、現在のgraphQL周りの状況
- オススメのプログラミング言語は？

現状、最もオススメはnode.jsです。
golangもサーバーを構築用のツールは非常に充実しています。
特にgqlgenは強力です。
というかgqlgen一強だと思います。
ただ、golangは、クライアント側が無いので
Hasuraなんかとは相性が良く無いです。

- prismaは？

Hasura以外にも、prismaも今後期待できる開発ツールですが
prismaで一度、出勤管理アプリのサンプルを作ってみようとテストしていた時の事ですが
出勤管理なので当然、cronで日付を更新する必要があり
日付が変わった際、登録されている全スタッフに紐付けされた
出勤情報を更新しなければならないわけですが
なんと、prismaは現在、preview中のprisma2も含め
createManyというmutaitionが用意されていません。
issueでも是非機能追加して欲しいという要望が盛り上がっていたので
今後、追加される可能性はあります。
MySQLやPostgreSQLでデータベース一覧やテーブル一覧を抽出する方法

MySQL,MariaDB,PostgreSQLなどで時々テーブル一覧やデータベース一覧をSQLで確認したいときの備忘録

#MySQL

- データベース一覧抽出SQL

```
show databases;
```

- テーブル一覧抽出SQL

```
show tables;
```

#PostgreSQL

- データベース一覧抽出SQL

```SQL
SELECT datname FROM pg_database;
```

- テーブル一覧抽出SQL

```SQL
SELECT
  relname as table_name 
FROM
  pg_stat_user_tables;
```

以上
海外リリースにおけるQAについて

#はじめに
最近は国内でのアプリのヒットが難しく、海外展開をするプロダクトも増えていると思います。
このアプリ、海外で出したいからQAよろしく、と言われた人の参考になるように、
私の経験した海外向けQAについてまとめていきます。

#1.海外向けのQAの種類
海外向けのQAは大きく分けて二つあります

| 種類    　| テスト内容                         | 補足|
|:----------|:--------------------------------|:----------------|
| **LQA**   | 翻訳/言語回り| 外部の専門会社に委託|
| **機能QA** | 海外差分機能（課金、タイムゾーン等）| テストチームで実施|



今回はこの**機能QA**の詳細について記載していきたいと思います。

#2.海外向け機能QAの観点
上に記載しましたが、大きくは、**課金、時間**と**それ以外**です。

それぞれについて細かく説明します。

##2.1 課金テスト
観点としてはざっくりと以下になります。
**1.未成年/成年の判定**と**未成年上限**有無
**2.通貨表示**の正常性
**3.海外アカウント**での課金正常性

###1.未成年/成年の判定と未成年上限有無
国内のアプリにおいて**年齢取得/未成年上限**を導入していても、
海外では法律の差異などにより、**年齢を取得しない**ケースが多いです。
その場合に、きちんとフローが変更されているか。また、未成年の場合の**課金上限が外れているか**を検証します。

###2.通貨表示の正常性
配信国に応じて、各国の通貨が適切に表示されるかを確認する必要があります。
**$、￡、€**等の一般的な通貨だけでなく、**฿、đ**などの特殊表示の例もあります。
**フォントなどの兼ね合いで上記が表示されない**ケースがあるので、各国のアカウントを作成し、
配信国すべての通貨表示をチェックしておく必要があります。
また、円などに比べて**ベトナムドン（đ）**は、桁数が多く、**桁あふれを起こす**こともあります。
どの通貨、どの金額でもきちんと価格が表示されているかをチェックしておくようにしましょう。
**※海外のアカウントの作成方法については別日に記載します**

###3.海外アカウントでの課金正常性
海外アカウントを用いて、適切に課金フローが完結されるかを確認します。
フロント側の正常挙動確認ももちろん大切ですが、海外通貨の場合にきちんと**集計などが行われるか**等、
バックエンド側のチェックも行う必要があり、**サーバの担当者などとの連携が大切**です。

また、リリース前後の最終チェックとして、
**現地で海外アカウントを使った課金テスト**を要望されるケースもあります。

その場合は
**・現地の海外スタジオを持っているベンダに依頼して対応してもらう
・VPNサービスを契約して、自分たちで作成した海外アカウントを使い担保する**

の大きく2つの方法があります。

前者については依頼するだけなので省略します。
**後者については海外アカウント作成方法の日に併せて記載します。**

##2.2 時間に関するテスト
こちらは、実装の仕様により検証の内容が異なります。

ポイントとしては
**・ログインボーナス、ミッション等の時間が国内外で異なるかどうか**
**・イベント、ガチャ等の開始時間が国内外で異なるかどうか**

このあたりの仕様がどうなっているかを確認することが非常に大切です。

ログインボーナス、ミッション、イベント関連については、
**どのタイムゾーンで何時と設定されているか**
その場合、**お知らせ等での表示上はどうなるのか**、
（**UTC0:00~**のように書かれるか、**ローカルタイム**なのか、別のタイムゾーンか）

上記次第でテストの期待値が変わります。
**複数地域でリリースする場合、地域ごとに時間の仕様が異なる**ケースもあるので、
ここの仕様確認/検証は入念に行いましょう。
**※サマータイムに対応しているタイムゾーンの場合はその検証も必要**


##2.3 その他のテスト
上記以外のテストの内容について以下に記載します

###1.規約関連
国内と海外では法律が異なります。それどころか、国ごとに差があります。
そのため、規約はすべて国ごとに異なります。
国ごとに異なる規約を表示するために、
**・国選択の機能を入れる
・国ごとの規約すべてに飛べるようにする
・あえて国を確定させない**

等、方針により仕様は様々ですが、**日本の規約がそのまま表示されている**、
ようなことがないように確認が漏れないようにしましょう。

###2.URL関連の変更
規約についても同様ですが、国内でリリース済みの場合の注意点として
**国内版のURLがそのまま設定されている**ことが結構多いです。

具体的には、**規約、SNS、HP、お問い合わせ**等の導線

そして、**アプリをアップデートする際のストアURL**が非常に漏れやすいです。

海外のアプリのアップデート導線の飛び先が、**国内版のURLになっている**事例が良くあります。
地域ごとにアプリのダウンロードページが異なる場合はそれぞれ必要となりますので、
事前にきちんと設定を確認しておくようにしましょう。

###3.海外特有の仕様変更
**一部機能を外す、海外の法律に合わせて表現を変える。露出過多のキャラクターを修正**する、等
海外特有の仕様変更はゲーム内機能としても発生するケースが多いです。

きちんと仕様確認を行い、変更点に関する検証を行うようにしましょう。

#3.まとめ
これらはあくまで代表的な例で、**アプリの実装によって更なる検証が必要**になる可能性もあります。
ただ、**課金、時間のテスト**についてはほぼ必ず発生するものです。
他に**レイアウトの崩れや日本語が出ていないかの確認**なども含まれる場合もありますが、
そのあたりはLQAチームとの住み分け次第となります。

プロダクト、QA、翻訳、LQA、それぞれが連携しながら検証を行うことが、
海外のリリースにおいては必須となります。
また、国内とは異なり、**SNSで反応を見たり不具合を検知するのも簡単ではありません**。

そういった情報収集の方法など含めて、運用体制の構築についても、
QAから積極的に提案をしていけるようにすれば、海外リリースの成功につながると思います。

##最後に
海外リリースをいくつか経験して思ったこと。
ログボやミッションやイベントの開始時間を、
国ごとでずらすと**運用が非常に大変になる**だけでなく、
QAコストにも結構影響が出てきます。
仕様決定時に口を挟めるのなら、すべての国で同じ時間にすることを勧めましょう。

**海外関連のアカウントの作り方やVPNを使った具体的な課金テストの仕方**は、
また別のタイミングで書きますのでよろしくお願いします。
最後まで読んでいただいた方、ありがとうございました。
頂点位置取得の処理速度を上げる方法

この記事は[**Maya Advent Calender 2019**](https://qiita.com/advent-calendar/2019/Maya)の7日目の記事です。

Mayaでモデリング向けのツールを作ると、選択されてるオブジェクトの頂点位置を取得する事があります。
ただ頂点数が多いモデルで**MEL**や**cmds**で全頂点位置を取得すると遅く、モデリング作業に支障が出るレベルです。
処理速度を上げる方法としてよく**OpenMaya**が紹介されていますが、自分にとっては敷居が高く、**cmds**でもっと処理速度を上げる方法がないかと思っていました。

# 以前の書き方

私は以前はこういう書き方をしていました。

```Python
from maya import cmds

sel_obj = cmds.ls(sl=True)
verts = cmds.ls(sel_obj[0] + '.vtx[*]', fl=True)
vert_pos = [cmds.xform(vert, t=True, ws=True, q=True) for vert in verts]
```

しかしこの書き方で取得すると頂点数が多いオブジェクトだとかなり時間が掛かります。

# 処理速度を計ってみる

まずシーンに**Subdivisions Axis**、**Subdivisions Height**共に**200**のとても綺麗な球体を作成します。

![](https://dl.dropboxusercontent.com/s/iw4yp3p21ctejz2/Sphere.jpg?dl=0)

頂点数は**39802**です。

この球体を選択して、上記スクリプトをPythonのtimeモジュールを使って計ってみます。

![](https://dl.dropboxusercontent.com/s/sya7oyfogd4qp04/GetVertPos01.jpg?dl=0)

約2秒掛かりました。この速度だとモデリング作業に支障が出るレベルです。

# 新しい書き方

```Python
from maya import cmds

sel_obj = cmds.ls(sl=True)
verts = cmds.ls(sel_obj[0] + '.vtx[*]')
vert_pos = cmds.xform(verts, t=True, ws=True, q=True)
```

**ls**コマンドの**fl**フラグを外し、取得した頂点のリストをまとめて**xform**の引数に与えています。
これで改めて処理速度を計ってみます。

![](https://dl.dropboxusercontent.com/s/7qucf2e4lmm3fzv/GetVertPos02.jpg?dl=0)

**約0.06秒！およそ33倍高速化しました。**

# XYZごとのリストに置き換える
ただ返ってくる値を見ると1次元配列になっているので、forで処理した時と同じ値を返すには下記コードを加えてXYZごとの2次元配列に置き換えてあげる必要があります。

```Python
vert_pos = [vert_pos[i:i + 3] for i in range(0, len(vert_pos), 3)]
```

# まとめ
以上、頂点位置取得の処理速度を上げる方法を上げる方法でした。

物凄く小粒な記事ですが、自分にとっては発見だったのでメモがてら書かせていただきました。
Mayaはこういったリストを引数に取れる関数があり、forで処理するよりもかなり速くなったり、リストを与える時も重複を省く事で速くなる事があります。

自分が見る限り、公式ドキュメントでその引数がリスト可能かどうかを確認出来ないので、テストしてみるしかないのが面倒です…

もし記事内で間違いや不明点等あれば書き込んでいただけると幸いです。
最後までお読みいただき、ありがとうございました。
TestFlight経由でモバイルにアプリをインストール（メール招待版）

TestFlight経由でモバイルにインストールする方法を記録しておきます。

# TestFlightとは
AppをApp Storeでリリースする前にユーザーをテストに招待し、有益なフィードバックを容易に受けることができるAppleのサービスです。期間限定で最大10,000人の外部テスターを招待できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/6c830041-e5ed-71ad-8b14-dd2b7f16bbb7.png)


# 前提
- アプリ管理者にAppleIDとなるメールアドレスを伝え、招待メールが届いている
- アプリ管理者に伝えたAppleIDでログインしているiOSデバイスでの操作
- [TestFlightアプリ](https://apps.apple.com/jp/app/testflight/id899247664)をStoreからインストールしている
- モバイルアプリのテスト目的である

# 手順
以下の招待メールが届くので、[View in TestFlight]をタップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/3f39c557-31af-0a63-577f-f2fc260775c8.png)

TestFlightが反応し、以下のようなアプリインストール画面が表示されますので、[インストール]をタップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/f18aa77f-96ca-7e06-1a05-94020e365f69.png)

あとは[開く]をタップするだけです。テストが終わったらテスト用アプリもTestFlightアプリも削除してしまえば大丈夫です。

メール招待型以外に、リンク招待型やコード入力型もあるのですが、その場合には誰がアプリを使っているのかがわからないので私はメール招待型でテストしてます。

<メール招待型>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/ed288d69-6080-7e6f-7de9-82b34f0fe380.png)
<リンク招待型>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/0bcee6d2-758a-dd67-47ee-a758d4441b40.png)

# 参考URL
https://developer.apple.com/jp/testflight/
golangでk8sクラスタのDeployment一覧を取得


golangでk8sクラスタのDeployment一覧APiを叩いて取得したjsonのレスポンスを標準出力に表示します。(SAのトークンを利用します)


依存関係です。

```
package main
import (
        "fmt"
        "net/http"
        "io/ioutil"
        "log"
        "crypto/x509"
        "crypto/tls"
        "encoding/json"
)
```

リクエスト送付とレスポンス受領するrequest関数です。

```
func request (endpoint,method,crtpath,token string) int {

        //証明書の設定
        caCert, _ := ioutil.ReadFile(crtpath)
        caCertPool := x509.NewCertPool()
        caCertPool.AppendCertsFromPEM(caCert)

        //リクエストの構成
        req, _ := http.NewRequest(method, endpoint, nil)

        req.Header.Set("Accept","application/json")
        req.Header.Set("Content-Type","application/json")
        req.Header.Set("Authorization","Bearer "+token)

        tr := &http.Transport{
                TLSClientConfig: &tls.Config{RootCAs: caCertPool,},
        }

        client := &http.Client{
                Transport: tr,
        }

        //レスポンスの処理
        resp, err := client.Do(req)
        defer resp.Body.Close()

        body, _ := ioutil.ReadAll(resp.Body)
        json.Unmarshal([]byte(body),&val)
        r,_ := json.MarshalIndent(val,"","  ")
        //fmt.Println(resp.StatusCode) <-ステータスコード
        return string(r)
```

最後にrequest関数を呼び出すメイン関数です。
(以下コード中のAPIサーバーのエンドポイントの変数`apiserver`、証明書パスの変数`crtpath`、トークンの変数`token`については[こちら](https://qiita.com/sota0113/items/42b8d2cd53190c9c5bb7#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%BC%E6%83%85%E5%A0%B1%E5%8F%96%E5%BE%97)を参照してください。リンク先で、それぞれ`APISERVER`、`CRTFILE`、`TOKEN`変数で格納しています)

```
func main () {
        apiserver := "https://192.168.99.100:8443" //k8sエンドポイント
        path := "/apis/apps/v1/namespaces/default/deployments"
        endpoint := apiserver+path
        method := "GET"
        crtpath := "/Users/sota-n/.minikube/ca.crt" //<-証明書
        token := xxx...  //SAトークンの値
        result := request(endpoint,method,crtpath,token)
        fmt.Println(result)
```

あとはビルドしてバイナリを実行するか`go run <以上のコード>.go`を実行します。
Xamarinで動的に機能追加できるか試してみた

以前、Silverlight の Out of Browser で動くアプリ作っていたのですが、xapファイルをWEBサーバー上に置いて動的に機能の追加をしたりしてました。

そういったことが Xamarin でも可能なのか試してみました。
調べたらだいぶ前に既に試された方いるようですけど、せっかく試したので投稿します → https://forums.xamarin.com/discussion/2294/assembly-load-is-it-possible

# 結論

最初に結論です。

**iOSは無理です**

**Androidは条件により可能です**

とりあえず、業務で利用されるのはお勧めはしません。

# 作ってみる

こんなコードになりました。

````C#

        public MainPage()
        {
            InitializeComponent();
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();

            Device.BeginInvokeOnMainThread(async () =>
            {
                try
                {
                    await Task.Delay(1000);
                    var file = await LoadDLL("https://dllを置いてるサーバー/SampeClassLibrary.dll");
                    var assembly = Assembly.LoadFrom(file.FullPath);
                    // 読み込みたいクラスを読み込む
                    dynamic instance = assembly.CreateInstance("SampeClassLibrary.Flash");
                    // 今回のサンプルクラスはShowというメソッドを持っている
                    instance.Show(1000, Root);
                }
                catch (Exception e)
                {
                    await DisplayAlert("Error", e.ToString(), "OK");
                }
            });
        }

        public static async Task<IFile> LoadDLL(string url)
        {
            // NetStandardStorageを使ってdllをローカルに１回保存
            var folder = CrossStorage.FileSystem.LocalStorage;
            var file = folder.CreateFile("dynamictest.dll", Plugin.NetStandardStorage.Abstractions.Types.CreationCollisionOption.ReplaceExisting);
            HttpClient client = new HttpClient();
            var response = await client.GetAsync(url);
            byte[] body = new byte[1024 * 1024];
            using (var stream = await response.Content.ReadAsStreamAsync())
            using (MemoryStream ms = new MemoryStream())
            {
                while (true)
                {
                    var length = stream.Read(body, 0, body.Length);
                    if (length > 0)
                    {
                        ms.Write(body, 0, length);
                    }
                    else
                    {
                        break;
                    }
                }
                file.WriteAllBytes(ms.ToArray());
            }
            return file;
        }
````


# 検証してみる

実際に動かしてみます

## iOS
iOSはシミュレーターでは動きましたが実機では無理でした。
理由は iOS は AOT(Ahead-Of-Time) のためです。
中途半端な知識で書くと嘘になるかもしれないので、ここでは AOT については説明しません。
詳しくは検索してみてください。

## Android
私の環境のシミュレーターが起動できなかったのでシミュレーターでは試していませんが、実機で動くことを確認しました。
ストア経由で配布した場合でも動くかどうかは不明です。

最初に「条件により」と書いたのは、Android でも AOT コンパイルのオプションがあるので AOT の場合は無理なんじゃないかと予想してます。
Visual Studio がエンタープライズ版じゃないと試せないので今回は確認していません。

諸々バージョンや依存関係等考えると、実際にこれを運用するのは大変そうだなと思います。


# まとめ

動的に機能追加/修正したい場合は、おとなしく WebView 使うとか、ReactNative+Expo 使うとかを検討した方が良いかと思いました。
Mac用パラレルズのWindows10にSourceTreeをインストールしたいのですが。

macOSは10.15.1。
パラレルズのバージョンは15Proです。

ここにWindows10Homeをインストールしており無事に動いています。
ここにBitbucketのSourcetreeをインストールしたいのですがつまづきました。

1.SourceTreeSetup-3.1.2.exeをダウンロードしてインストール
　「.net4.7.1以上が必要」というダイアログが出て中断

2．Microsoftからndp48-devpack-enu.exeをダウンロードして
　インストール。「OSが対応していない」ということで中断。

3.パラレルズのサポートで「管理者権限で実行」するよう指示されるが同様のダイアログが出て中断。

4．再度パラレルズのサポートに問い合わせると以下の返事。
「Framework4.8正常にインストールするには、
以下の三つ削除が必要となります。
"Microsoft.NETFramework4Extended"
“Microsoft.NETFramework4ClientProfile”
“Microsoft.NETFramework4Multi-TargetingPack”
　削除とインストール方法について、Microsoftへ問い合わせが必要となります。」
という返事をもらうも、これらをどこからどのようにして削除するのかが分からないで困惑中。＜＝今ここ

どなたか教えて頂けるとたすかります。
よろしくお願いします。
データサイズが巨大なキーをRedisには作ってはいけない

# はじめに
多様なデータの持ち方が可能でRead/Writeも高速。
キャッシュDBとして優秀且つ便利なRedisですが、しっかりデータ設計をしないと痛い目をるという体験談を自害の念も込めて書きます。

# アプリケーション速度が激しく遅くなった
![ea271988-d908-b222-151d-97125254d404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/22376f6f-7bbc-87cc-4adf-3087c3f3112c.png)
アプリケーションの速度が劣化しているときのnewrelicによるパフォーマンス結果です。
通常であれば100～500msでおさまっていたパフォーマンスが、図の通りアクセスのピーク時に大体3000ms、ひどい時だと4000msを超え、しばしばサービス自体も落ちたりする、とても精神がすり減るような状況に陥ってしまいました。
原因としては、サービス自体がスケールし単純にアクセス量が増えたことによるものでそれ自体は想定内のことだったのですが、今までのインフラ構成でも耐えられると高をくくりチューニングを検討しなかったことがあだとなり、結果、自分の首を絞めてしまいました。

# なにをしたか
実際にアプリケーションのどの処理でボトルネックになっているのかをまず調査することにしました。
PHP製のアプリケーションだったのでblackfireを用いて検証したところ、この時点では予想外の箇所、Redisのgetが処理の大半の時間を使っていることがわかりました。

# アプリケーションのパフォーマンスが悪くなった原因と対応
理由は単純でした。
実際にRedisのKeyを確認したところ1つのキーに割りあてているデータが1GBを超えているものが多数あり、getで取得する時間が重くなっていたことが原因でした。
ちなみに、Redisはシングルスレッドで動くので1つのプロセスが詰まれば他のプロセスが詰まり渋滞してしまいます。
つまり、アクセス量が増えたことによりプロセスがたまりパフォーマンス速度が悪くなっていたことになります。

そこで、肥大化したKeyを細分化し1つのKeyに割りあてるデータ量を減らしパフォーマンスがどれだけ改善するかを試すことにしました。

# 結果
![16c10f24-5512-404b-b3af-116f7ebf1292.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296574/5cc83aa9-a3e1-b59b-f9bd-1aec3e82273c.png)

ピーク時で3000～4000msだったパフォーマンスが50～75ms、平常時では30ms前後まで下がるという驚異的な改善につながりました。

# まとめ
便利なミドルウェアは沢山あります。
ただ、何を使うにしても利用する際には将来を見据えてのデータ設計をちゃんとしようということが痛いほど身に沁みました。。
運用をする上で肥大化する可能性のあるデータなどは、最初の設計時に考慮するか、定期的な見直しやチューニングなどを行うことをお勧めします。
Gitの設定メモ

# はじめに
なんかGitの設定で苦しそうな子がいたので書き起こします。
・macOS mojave 10.14.6

# git config
Gitの設定をするには **git config**コマンドを利用するか、設定ファイルを直接作成、編集します。

**git config**コマンドを実行すると自動的に設定するファイルが作成されます。すでに設定ファイルが存在している場合には、指定した項目で上書き保存されます。設定ファイル自体も以下のようにini形式のファイルとなっており、編集自体も難しくありません。

```terminal
$ cat ~/.gitconfig
[user]
 name  = fugafuga
 email = hogehoge@hoge.com
[filter "lfs"]
 ...以下略
```
また設定ファイルを設置する場所、コマンドのオプションで影響範囲が変わりますので、複数人で開発する際にはGitの設定をどうやって管理するかは事前に話し合う必要があると思います

| 影響範囲       　　|    ファイル          |   コマンド　　　　　　|
|:-----------------|:------------------|:------------------|
| システム全体        |/etc/gitconfig    |git config --system (設定内容)    |
| 各ユーザー          | ~/.gitconfig または<br> ~/.config/git/config |       git config --global (設定内容)      |
| リポジトリ             | リポジトリの .git/config | git config --local (設定内容) |
と、このようになっています。（初めてQiitaのテーブル使ったんですけど12inchのMacBookじゃきつい。）
同じ設定項目があった場合、リポジトリ内にある設定が最優先されます。
この記事では、 **git config --global**を前提として説明させてもらいます。

# 初期設定
### ユーザー名とメールアドレス
**git log**などで表示されるユーザー名やメールアドレスを登録します。これをしておかないと初回commit時に怒られます

```terminal
$ git config --global user.name 'fugafuga'
$ git config --global user.email 'hogehoge@hoge.com'
```

# 使い勝手を向上させる。
### 文字色
gitでは**git status**や**git diff**時などにTerminalの文字色をいい感じにしてくれる機能が備わってるらしい。
ONにしよう！

```terminal
$ git config --global color.ui true
```
機能によってON/OFFにすることも可能です。
以下のキーワード毎に**true**や**false**を指定してやればいいだけです。

- color.branch
- color.diff
- color.interactive
- color.status

#設定内容の確認
**git config**に**--list**オプションを指定することで現在の設定を確認することができます。

```terminal
$ git config --list
今まで設定したやつがなんかすごい出てくると思います。
```
もしくは・・・

```terminal
$ cat ~/.gitconfig
以下略
```
で確認できます。
#設定内容を削除する
すでに設定した項目を削除するには、**--unset**オプションを利用します。
例えば、**user.name**を削除したい時は・・・

```terminal
$ git config --global --unset user.name
```

実際に試してみましょう

``` terminal
$ git config user.name
fugafuga

$ git config --global --unset user.name

$ git config user.name
```

#まとめ
gitの設定は割とめんどくさそうですが、慣れたら楽だと思います。
ここで紹介した以外にもエイリアスの設定やプロキシの設定などもあるので興味があれば調べてみてください。
ばいばい
ちょっと躓いた時の対処法

この記事は　[Houdini Apprentice Advent Calendar 2019](https://qiita.com/advent-calendar/2019/happrentice)　8日目の記事です。
#はじめに
何を書こうか迷ったのですが、無難にTipsのようなものを書くことにしました。
Houdiniには[公式のフォーラム](https://www.sidefx.com/ja/forum/71/)やTwitterのハッシュタグ(#Houdini/#HFXJP)、有志による勉強会などで頻繁に交流が行われており、初学者にとっても学習しやすい環境が整っていると感じます。特に質問をTwitterでちょっと呟くだけで優しい有識者の方や公式がリプをくれることもありますよね。
Houdiniで躓いたとき、私はまず検索にかけて前例を探すのですが、今回の記事はそうやって見つけた躓きと対処法を備忘録も兼ねていくつかまとめたものになります。

とはいえこれはApprentice向けの記事ですので、基礎の基礎部分を取り上げたいと思います。
思いついたものから書いていくため順不同、気づいたときに増えていくスタイルです。


##躓きと対処法
####①Shelfから作ったSimが既存DOPの中で作られる（新規DOPが作れない）
複数のSimをShelfから作る場合によくあります。
AはSource particle emitterでBはFlamesを適用して……あれ？1つのAutoDopNetworkに作られてるっていう。![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536955/add668e0-6e77-5e43-963f-00ab6bdf2d9f.png)
対処法は簡単です。
2つ以上のSimをShelfから作る場合は、1つ作った後に右下にある脳みそのマークを右クリック⇒Create New Simlationを選択。
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536955/4f7764ec-6577-5659-0952-cd8aec38bc8a.png)
すると空のDopNetworkが作成されるので、そのあとにShelfからSimを作成してください。


####②Persp Viewに戻れない！
SceneViewでモデルをあちこちから見ているとたまーにカメラがOrthoになっていて、Perspに戻れないとき。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536955/ffdcfa31-002d-6c6e-6e3e-ddc78bd819f4.png)
一度ViewをTopなどにしてからPerspを選択すると戻れます。


####③SceneViewのNearやFarを変更する
SceneView上でDキーを押すとDisplay Optionsが開きます。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536955/75902a0b-0cd7-91ef-4e97-cd984c76752e.png)
Viewタブの右側にClippingという項目があるので、ここを任意の値に変更すればOK！
Display Optionsで他にも　![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536955/d972f3ae-9b1f-f989-6bc1-e53a11db500f.png)　を消したりといろいろできるので、ドキュメントを一度読むことをオススメします。


####④うっかりObjレベルでTransformを弄ってしまった
objレベルとは　
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536955/6deb3845-86e0-810e-dc9e-743889fe909b.png)
のことです。ここで空のGeometryだったりBoxなどを皆さん作成しますよね？
そのあと、各階層に入ってからTransformNodeでScaleやTranslateをするかと思いますが……。
たま～に　![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536955/d883fcfa-bc4a-7167-2a8a-50072d030313.png)　のTransformを弄ってるときはありませんか？
基本的には気づいた時点で修正するのですが、Simも終わっていざAlembicで出力しよう！って時だと修正がめんどう！しかもそういう時に限ってCameraの動きが複雑だったりetc…
なので修正はあきらめて新しく空のGeometryを作ります。
Object_mergeNodeを呼び出し、Object1にやらかしたノードを指定。TransformをInto This Objectに変更。
これで出力するときに泣かなくて済みます。
ちなみにこれ、他のやり方があればぜひ知りたいので知っている方は教えて下さい。
大会支援用ツール制作の話

##はじめに
この記事はカルネージハートポータブルの大会支援用ツールを作った時の話です。
かなり昔に作ったものであんまり覚えていないですが記憶を頼りに書いてます。

##使用ソフト
セーブデータの解析には[Stirling](https://www.vector.co.jp/soft/win95/util/se079072.html)というバイナリエディタを使用しました。
Stirlingの下記3つの機能を使っています。

- 2つのファイルの差分を比較する機能
- struct.defファイルを編集して構造体を定義する機能
- 選択範囲のデータの合計をステータスバーに表示する機能(設定で追加)

##セーブデータの解析
１、カルネージハートのセーブデータは固定長なので同じサイズの構造体をstruct.defに追記します。
書式はstruct.defに書かれている内容を参考にすればわかると思います。
たしか、こんな感じからスタートしていたと思います。

```struct.def
struct SAVEDATA
{
    BYTE data[ファイルサイズ];
};
```

２、まずは何も変更しない同じ状態のセーブデータを2つ作成してStirlingで差分を比較しました。
同じデータになると思うのですが、実は二か所違っている範囲のアドレスが出てきます。
そのアドレスに合わせてstruct.defの構造体を修正しました。
最初は何のデータかわからなかったのですが、後になって保存した時間とチェックサムだったことがわかりました。
※チェックサムを間違えているとPSPでは壊れたファイルとして扱われます。
※チェックサムが合っていてデータがおかしい場合は読み込めるのでPSPがフリーズします。

３、次に２と同様の手順ですが、何か1つの要素だけ変更してほぼ同じ内容のセーブデータを２つ作成していきました。
たとえば、機体を1つだけのセーブデータとその機体を2にコピーしたセーブデータを作ります。
Stirlingでその2つのファイルの差分を比較して、機体のデータが繰り返しになっているアドレスを見つけてstruct.defを修正します。
ここからは修正時の構造体の変数名は後でわかりやすい名前を付けるようにします。
他にも必要と思われる情報の機体名、チーム名等、かなり地味な作業を繰り返してデータのアドレスを確認していきます。

４、チェックサムについては調べるのは大変そうと思っていたのですが、
時間が増えたときにチェックサムも同じ分が増えていたので運良くおおよその検討がつきました。
Stirlingでステータスバーに選択範囲のByteの合計だったかな？を表示させて一致するものを探しました。

##プログラムの作成
１、struct.defファイルの構造体の内容をVC++の書式に書き換えて、ファイルをバイナリ形式で開いてデータをそのまま構造体に渡しています。
この時ファイルサイズやチェックサムでファイルが壊れてないか等の確認処理も一緒にしています。

２、データの編集はすでに構造体が定義されているのでプログラムで扱いやすい状態になっています。
内部処理は扱いやすい構造体を別に定義して、入力用の配列と出力用の配列2つを移動させて位置を入れ替えできるようにしています。
あとは使いやすいUIをどうするかを考えて実装していきました。

３、最後にチェックサムを計算してファイルに保存すれば完成です。
保存前に最大チーム数と機体数の確認もしています。
データを解析していない所や触らない部分は読み込んだファイルのデータを再利用しています。
初期バージョンでは初級演習場で固定でしたが、後のバージョンでは一番最後に読み込んだファイルの対戦環境のデータをそのまま保存時に使用するように変更しました。

##最後に
現在の環境ではわかりませんがプログラミングの勉強の題材としては良かったです。
ツールを作り始めるとゲームに帰ってこなくなることがあるので注意かもです。

最近はプログラム教育とか流行ってそうですし、Nintendo Switchと相性もいいと思いますので、カルネージハートの新作発売されないかなーと思ってます。

最後まで読んで頂きありがとうございました。
ジョジョ3部から6部までの勝敗をNeo4に投入してみた

急に明日のAdvent Calendar記事頼まれたみたいので、
適当にくだらないことをやってみた。

## データ準備
このページからキャラ―とスタンドの情報を引っ張り出した。
https://dic.pixiv.net/a/%E3%82%B8%E3%83%A7%E3%82%B8%E3%83%A7%E3%81%AE%E5%A5%87%E5%A6%99%E3%81%AA%E5%86%92%E9%99%BA%E3%83%BB%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7

勝敗は、、、残念ながら収集するサイトが見つかれなかったので、自分の記憶にを遡るしかない。

## Cypher作成＆投入
ExcelでCypher文を組み立てる
![QS_20191206-170641.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322119/93df2b91-3e84-4b57-e820-6be4b09b9298.png)

Neo4jに投入する!
![QS_20191206-171238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322119/b77341b9-7513-3b1c-715a-4451d0e25839.png)


## Neo4j画面から確認
### 全貌
![graph (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322119/c92d345f-e284-cd23-6e99-09ecd18c96c8.png)
### クエリを走ってみる
・一番勝っている人
![QS_20191206-165505.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322119/6e6af072-8f62-1213-66c5-3385b0f5106f.png)
やはり誰でも予想できる答えが出たね。DBが正しく動いているようだ。

・死人が出るランキング
![QS_20191206-170427.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322119/b999a173-b5f7-e89f-08e4-c6bd050a2f21.png)
流石ギャング、手加減なし。
JSTQBを受けるか迷っている方へ

#はじめに
JSTQBとは「 Japan Software Testing Qualifications Board」の略称であり、日本におけるソフトウェアテスト技術者資格の運営組織です。JSTQB 認定テスト技術者資格は、JSTQB が運営している認定資格のことを指しています。
要は、ソフトウェアテストに関する知識を認定する資格の事です。
今回は私がJSTQB FLを受けてみて思ったことを記事にすることにしました。
いま受けようか迷っている方の参考になればと思っています。

#そもそも、なぜ受けようと思ったのか
私は普段モバイルゲームのQA業務を行っているのですが、今の会社に入社する前、QAという業種すら知りませんでした。

入社して半年ぐらいが経ったときに上記の試験があることを知りましたが、はじめは「そんな試験あるんだ。。しかも受験料たかい！」くらいの感じであまり興味はなかったです。
そもそもQAという業務がまだいまいちわかっていなく、試験受けても受からないと思っていたのでそういう点から当時も受ける気はなかったと思います。
ちなみに受験料は2万円+税（※）となります。
※2019/12/6時に試験開催の詳細ページで確認
http://jstqb.jp/attribute.html

入社2年目ぐらいの時、私の周りでJSTQBを受けるという人が何人かいるという話を耳にしたので、
私もそれに便乗してとりあえずJSTQBのシラバスに目を通してみることにしました。
シラバスでは聞いたことないような言葉や考え方が多かったものの、自分が普段の業務で意識している考え方や取り組み方もシラバスに載っていたので「案外いけるかも！」と思い、少し興味が湧いたのを覚えています。

また、QAという業務を通して**もっと奥深く知りたい！**という思いや、
同僚には**テスト知識で負けたくない！**という思いもあったので受験しようと決意しました。

#試験勉強
私は試験勉強になるべくお金をかけたくなかった、FLならシラバスを読めば大丈夫と聞いていたので、とりあえずJSTQBのサイトに載っているシラバスを読むことから始めました。
正直、最初は分からないことが多すぎてつらかったです。
わからない単語が多かったので、とにかく調べてなんとなく理解できるよう自分なりに翻訳して覚えていくようにしました。
また、シラバスだけでは不安だったので、インターネットで過去問を漁ったりしてなるべく問題を多く解くよう工夫しながら試験勉強を行いました。

#受けてみて
実際に受けてみて最初に思ったことはもっとシラバス読んでおけばよかったと思いました。
シラバスに載っている細かい部分からも出題されていたので、試験終わってからもずっと後悔していました。

それと時間が足りなかったです。（40問60分）
なるべくケアレスミスしないように慎重に問題を解いていたためか、1問1問にかける時間が多くなってしまい、見直しの時間があまりとれませんでした。

試験受験するにあたって、シラバスをきちんと読めば問題が解けるということ、一つの問題に時間をかけすぎずペース良く解いていった方がいいということも感じることができました。
これから受ける人は上記を意識して取り組むといい結果につながりやすいのかもしれません。




#実際に受けたほうがいいの？
私の**個人的な経験**に基づきますが、QA業界にいる方は受けて損はないと思います。
勉強したことによってソフトウェアテストの基本的なことが学ぶことができ、テストやテスト管理、テスト設計をする上で自分の引き出しが増え、テストの現場で何が必要なのか？を全体的に意識できるようになってきます。（まだまだですが...）


また、上記の資格はキャリアパスにもつながります。
QA業界の求人サイトで望ましい経験/能力に「JSTQB相当の知識」と書かれていることを一度は目にされたことがあると思います。
転職する際も一つの目安として基準を定める会社も増えてきているので、需要はあると私は考えています。

資格を取ることができれば社内の評価も上がります。
勉強するだけでも普段の業務において行動が変わると思います。
テストについてもっと学びたい方や、上昇志向がある方は一度受けてみることをお勧めします。


#さいごに
普段の実業務でこなしているテストやテスト管理、テスト設計が漏れなく効率的に行えているのか、経験ではなく明確な方針や手法として学ぶことができるいい機会だと思います。
時間とお金がある方は勉強して受験してみては！
作業メモの活用法

### 前置き

Qiita初投稿となります。Web系メインの時短勤務エンジニアです。

### 本題：作業メモについて

我流です。テキストエディタでメモっています。
Windowsの環境ではサクラエディタを使っています。
一昔前では、秀丸やWindows付属のメモ帳を使っていました。

### メモの取り方

~~~
{リンクブロック}
{定型文ブロック}
{予定ブロック}
{日付ブロック}
~~~

* リンクブロック
   * よく使うリンクやNASのパスをメモっておく
* 定型文ブロック
   * 定型文をメモっておく
   * よく使うshellコマンドをメモっておく
   * 重要な連携内容をメモっておく
* 予定ブロック
   * 夏季休暇、年末年始などの休みの予定をメモっておく
   * リリース日など重要な予定をメモっておく
* 日付ブロック
   * 日付降順で本日の作業内容をメモっておく
   * 日付の隣に勤務時間を併記する
   * ソースの下書き、バックアップ
   * 思考垂れ流し

上記を踏まえて作業メモを書いていくと、こんな感じになるでしょう。
※作業内容については適当です。

```
■作業フォルダ
C:\Users\Watashi\work
D:\workspace\Repository

■設計書
\\NAS-001\なんとか会社\設計書

■QA
https://docs.google.com/spreadsheets/QAQAQAQA
=============================================================
■Teratermコマンド
プロセス確認
ps aux | grep php
kill プロセスID（２列目） // kill 4753

ファイルの中身を見る
lessコマンド　「G」最終行　「/文字列」パターンマッチ　「n」直前のコマンドを実行

viエディタ「vi ファイル名」
入力モード「i」、抜ける「Escキー」
保存「:w」、終了「:q」、強制終了「:q!」

■Excel
=VLOOKUP(C3, Sheet1!$A$3:$B$2000, 2, false)
=============================================================
夏季休暇：8月13日(月)、14日(火)、15日(水)
11/04（月）　健康診断
=============================================================

2019/12/05　9:30 - 17:00
Spring Bootがようやく起動できた。
・プロジェクトを右クリック→Gradle→Gradleプロジェクトのリフレッシュ
・プロジェクトを右クリック→実行→Spring Bootアプリケーション

2019/12/04　10:00 - 17:00　電車遅延
以下エラー発生
スーパークラス "javax.servlet.http.HttpServlet" が Java 
ビルド・パスで見つかりませんでした
-プロジェクトを右クリック > ビルド・パス > ビルド・パスの構成 >javaのビルド・パス 
 > ライブラリ >
　「外部jar 追加」からインストールしたTomcatの /Tomcat/lib/servlet-api.jar 
ファイルを追加

2019/12/03　9:30 - 17:00
jvm.dllのエラー　→DドライブにEclipseを解凍したら、うまくいった？

Eclipse を起動すると　「Failed to load the JNI shared 
library」というエラーが発生！！　→jvm.dll
eclipse.iniに↓を追加　→だめだった

-vm
C:\Program Files (x86)\Java\jre1.8.0_66\bin


2019/12/02　9:30 - 17:00
本案件に火がついてることはよくわかった。
とりあえず、環境構築手順のWikiがあるらしいので、その場所を聞き出そう。
→redmineというので管理しているらしい

障害回収作業をする　３月末END
使用フレームワーク：Spring Boot
テンプレートエンジン：Thymeleaf

```

### 活用法

日付ブロックが特に重要で、なんでもいいので垂れ流します。
「これってどうやったっけ？」と忘れたときに、振り返ることができるのです。
Ctrl+Fでワード検索すると、今までやってきたことがヒットします。
F4キーで窓を二分割して、過去ノウハウと今日の作業内容を見比べることもできますね。

作業メモの書き方に困っていたら、こんなやり方を参考にしてみてください。
自分用ですから、使いやすいように書くのがベストです。

### 最後に

Qiita初投稿、緊張しました。
分かりやすく伝えられるように努力しては見たものの、まだまだ精進が必要です。
エンジニアとしての成長を目指せるように頑張ります。
エンジニアと愉快な仲間達(キーボード・マウス編)

諸君　私はキーボードが好きだ
諸君　私はトラックボールが好きだ
諸君　私はエルゴノミクス機器が大好きだ
(以下略)

皆さん！皆さんは、普段どのようなキーボードを利用していますか？
私はキーボードが大好きで、多くはありませんが様々なキーボードを試してきました。
また、同じようにマウスも好みのものを利用しています。

そんな今まで触れてきた仲間達を紹介していこうと思います。

## キーボード編
### Realforce
僕の初めての相棒です。
http://www.realforce.co.jp/products/91UBK-S_NG01B0/

私は小学生の頃からPCに触れていたのですが、この相棒に出会うまでキーボードには無頓着でした。
大学に入り、研究室に配属された頃のこと。
メンバーの1人がHHKBを利用していました。この時、マイキーボードという概念を知りました。

研究室で本格的に開発する事になった頃、研究室のハイスペックなPCを割り当てられました。
なんと、そのパソコンには標準でRealforceのキーボードが割り当てられていました。
実際に良いキーボードに触れることによって、その打ち心地に魅了されてしまいました。
打ち心地もそうですが、なんとも快適だったのはテンキーレスモデルだったことです。

普段からプログラムや文章をゴリゴリ記入される各位も同じ思いだと思うのですが、
テンキーがあると、マウスとの距離が離れるから凄い不便なんですよね。

そんなこんなで、良いキーボードに魅了された僕はあれよあれよと言う間に、
静電容量無接点方式の更に静音モデルのRealforceを購入したのでした。

### HHKB BT
社会人になってから、勉強会に出かけるようになりました。
ハンズオンとかもくもく会みたいな手を動かす勉強会というよりは、
セミナーや発表会の様な場所へ出かけることが多かったので、でかけた際にメモを取るのが便利な環境を欲していました。
そこで、冬のボーナスに購入したのがiPad Proです。
元々、スクフェスやデレステといったリズムゲームを大画面でやりたかったから、欲しいとは思っていたんですよね。

残るはiPadに接続するキーボード。
簡単に持ち運べて、自宅でも、職場でも、出先でも使えるモデルが欲しいと思って選ばれたのがHHKB BTモデルでした。
なんとなくカッコイイので、無刻印で英字キーボードにしました。
https://www.pfu.fujitsu.com/hhkeyboard/bt/

実際触ってみて分かったのは、十字キーが Fnキー ＋ なんかに割り当てられているので、
手を動かさなければいけない頻度が非常に少なくなって快適だということでした。
やはりというか、打ち心地も良く、プログラミングと英字キーボードの相性も抜群で最高でしたね。
軽いのも良き。

### Kinesis FreeStyle2
新たな世界を見せてくれたのが、このFreeStyle2です。
https://www.edikun.co.jp/kinesis/freestyle.htm

当時の現場の先輩からお借りして、そのまま譲り受けたのがこれです。
キーボードが真っ二つに割れているのが特徴的なキーボードなのですが、
これが非常に良い……。

YキーやBキーが、いつも押している手と違う場所にあって少し戸惑うことはあったのですが、
キーボードが離れるだけで体の負担は少なくなるし、自然な指運びでタイプ出来るおかげで
ミスタイプが減りました！！！

これは最高だぁ……。
今は、職場ではこれのお世話になっています。

## マウス編
### Kensington Slimblade
最初で最後の相棒。
Kensington Slimbladeです。
https://www.kensington.com/ja-jp/p/products/ergonomics/ergonomic-input-devices/slimblade-trackball/

本製品はトラックボールなのですが、マウスのど真ん中にドンと置かれた
大玉のボールが特徴的です。

少しスペースは取りますが、自然な手の形で様々な操作が出来るので、
非常に手への負担が少なくなります。

トラックボールといえば、親指や人差し指で操作するものがありますが、
指の動きが少し無理になる状態が嫌で、この製品にしたんですよね。
結果大正解でした。

標準で５年保証しているので、普通に使っているといずれチャタリング等が起きると思うのですが、
この製品ならチャタリングが起きるくらいの時期に交換することができます！

なんて偉大な企業なんだ……。

### Logicook M585
地味ながら非常に便利で助かったのがこれ。
スクロールボタンの下にデバイス切り替えボタンがついていて、
これを押すと2端末を行き来できるのです！！！
凄いぜLogicool。

今はLogicool flowとかいうアプリで、デバイス間のコピー貼付けまで出来るらしく、
この取組みは本当に凄いなぁと思いました。

## まとめ
以上が僕の肉体の一部達でした。
マウスについては Slimblade から離れるつもりはないのですが、
キーボードについては、Ergodox を購入しようかと検討しています。
ただし、4万円ほどのお値段がするので、すこし余裕が出てきてからかな…。
それまでは、FreeStyle2と仲良くしようと思います。
新しくローンチされたAWSのGPU搭載EC2インスタンス G4 のパフォーマンスを比較する

# はじめに
経路探索エンジンの研究開発をしているM.Yです。

ナビタイムジャパンでは、2019/07/30、[自転車NAVITIME](http://products.navitime.co.jp/service/bicycle/android_sp.html)へ向けてGPUによる探索エンジンを[リリース](http://corporate.navitime.co.jp/topics/pr/201907/30_4855.html)しました。リリース時点でP2インスタンスを利用していましたが、2019/09/20に、NDIVIA GPUの最新アーキテクチャであるTuringを採用したAWS EC2インスタンスG4が[ローンチ](https://aws.amazon.com/jp/blogs/news/now-available-ec2-instances-g4-with-nvidia-t4-tensor-core-gpus/)されました。

そこで早速パフォーマンスを調べたのですが、他のGPU搭載EC2インスタンスに比べて圧倒的にコスパが良かったため、すぐにG4インスタンスへ切り替えました。その際に行った他のGPUインスタンスとの性能とコストの比較結果を紹介します。

# G4インスタンスについて

NVIDIAの最新アーキテクチャであるTuringを採用したGPU、[Tesla T4](https://www.nvidia.com/ja-jp/data-center/tesla-t4/)を搭載したEC2インスタンスです。2019年3月に開催されたGTC 2019[^gtc_2019]にて、AWSからインスタンスの提供が発表され、2019年9月に利用可能になりました。

[^gtc_2019]: サンノゼで毎年開催されているNVIDIAのテクノロジーカンファレンス

スペックと各インスタンスのオンデマンド料金は以下の表のとおりです。最新アーキテクチャにも関わらず、G4インスタンスのコストの安さが際立っています。

|             | アーキテクチャ | CUDAコア数 | デバイスメモリ | オンデマンド料金 |
| ----------- | -------------- | ---------- | -------------- | ---------------- |
| p2.xlarge   | Kepler         | 2496       | 12GB           | 1.542 $/hr       |
| p3.2xlarge  | Volta          | 5120       | 16GB           | 4.194 $/hr       |
| g4dn.xlarge | Turing         | 2560       | 16GB           | 0.71 $/hr        |

# ベンチマーク

## 測定条件
GPUを利用した自転車ネットワーク探索エンジンで探索距離毎(6～1400km)にアーキテクチャの比較を行いました。
比較したのは上述した各アーキテクチャのインスタンスです。

## 測定結果

![graph1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/e6a60ce1-cfff-cc93-dd0d-ebd39974af8b.png)


こちらが絶対値での比較です。

![graph2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315364/eb7efbc2-ea8d-805c-02b8-142b921426a1.png)


こちらがP2の探索時間を100としたときの各アーキテクチャの処理時間の比率です。

P3のパフォーマンスは凄まじく、P2と比較して平均3.17倍の高速化となりました。しかしコストがP2と比較すると2.71倍と相応のコストがかかります。

G4もP2とCUDAコア自体の数はほとんど変わらないにも関わらず、P2と比較して平均1.81倍の高速化ができています。しかもコストが0.46倍となります。

つまり、P3はコストをかけて速くしているのと等価ですが、G4はコストが安くなるのに速くなりました。

|             | アーキテクチャ | P2との速度差 | P2とのコスト差 | P2とのコストパフォーマンス |
| ----------- | -------------- | ------------ | -------------- | -------------------------- |
| p3.2xlarge  | Volta          | 3.17         | 2.71           | 1.17                       |
| g4dn.xlarge | Turing         | 1.81         | 0.46           | 3.93                       |

# まとめ

**P2インスタンス使っている方はG4インスタンスの利用を積極的に検討しましょう。**

今回の比較はGPGPUでのパフォーマンス比較でしたが、G4インスタンスでは前述したとおりTuringアーキテクチャであるTesla T4を利用しており、このGPUには機械学習計算に特化したプロセッサであるTensor Coreも搭載されているため、P2インスタンスと比較すると機械学習でのパフォーマンスも確実に上がっていると思いますので利用を検討する価値があると思います。
Visual Studio 2019 C++ 条件つきプリプロセッサ debugとreleaseの切り替え

## 背景
C++でコードを書くとき、
debugモードとreleaseモードをcoolに使い分けたかった。
ロボットを動かすときなどは、使い分けると楽。
どうやら、c++の条件付きプリプロセッサがヒントらしい。

Visual Studio 2019などはプロジェクトの細かい設定などができる分、
多少の使いずらさはある。（けど、僕は好きです。）

## 実装環境
・C++
・Visual Studio 2019
※2019以降でも対応すると思います。

## 手順
1.新しいプロジェクト（C++）を作成する。
2.プロジェクトを右クリックし、[プロパティ]を選択
![無題sad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503403/3080e806-ebfa-84f1-52a7-a27fe7d03082.png)
3.構成を[Debug]にし、[C++]→[プリプロセッサ]を選択
4.プリプロセッサの定義に[_DEBUG]の記載を確認し、コピーする
![無題saca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503403/c8d8cd0b-a7a1-d074-b76f-f6d402795018.png)
5.同様に構成を[Release]にし、プリプロセッサの定義に[_DEBUG]がないことを確認
6.[_DEBUG]がないことを確認 (協調表現をしたかったんですが、反映されないため2度記入)

## サンプルコード
あらかじめdebugモード用にプリプロセッサを定義付けしておくと、
releasモードに変えた場合にはdebugモード用のプリプロセッサは反映されない。
種明かし。

```c++:debug_release.cpp
#include <iostream>
int main()
{
	std::cout << "Current mode is ";
#if _DEBUG //debug時 _DEBUG はプロパティで定義　
	std::cout << "DEBUG" << std::endl;
#else      //release時
	std::cout << "RELEASE" << std::endl;
#endif
	return 0;
}
```

## 実行結果
・debugのとき
![無題sdfsa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503403/d77f9d71-31f9-1465-8edd-b07ae67d8b7f.png)

・releaseのとき
![無題aefdasdc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503403/0c9a2d13-c129-5e0b-ec29-e1e76062c4de.png)

## Github
ご参考にどうぞ。
https://github.com/yusa0827/191206_change_to_debug_or_release


## 反省
プリプロセッサの具体的なコードの意味などに触れられなかったことが残念。
できればさらに深い使い方まで勉強して、教えられるレベルに行きたいですね。
ニフクラオブジェクトストレージに大容量のファイルを送り付ける方法

みなさん、こんにちは。
[富士通クラウドテクノロジーズ Advent Calendar 2019](https://qiita.com/advent-calendar/2019/fjct)の9日目の記事です。

## 概要

[オブジェクトストレージ](https://pfs.nifcloud.com/service/obj_storage.htm)にファイルをアップロードしたい場合、2GBまでのファイルしかアップロードできない制限となっております。  
それ以上のサイズのファイルをアップロードしたい場合マルチパートアップロード機能を利用することになりますが、[コントロールパネル](https://pfs.nifcloud.com/service/cp.htm)にはマルチパートアップロード機能が無いため(2019年12月時点) 、今回はそれを実装してみようかと思います。

## 説明

[マルチパートアップロードのAPI](https://pfs.nifcloud.com/api/obj_storage/Uploadpart.htm)をブラウザからリクエストすることになりますが、以下2点が問題になります。

* **CORS(Cross-Origin Resource Sharing)によるクロスドメイン通信**  
* **APIアクセスキーのクレデンシャル情報管理**

CORSについては、オブジェクトストレージの機能で[CORSの設定](https://pfs.nifcloud.com/api/obj_storage/PutBucketcors.htm)があるので、これをAPI経由で利用することでブラウザ(自ドメインのサイト)からオブジェクトストレージへ直接アクセスできるようになります。  

クレデンシャル情報については、クライアント側JavascriptにAPIキーを書いてしまうと誰でも見れてしまい悪用されると大変なことになるので、クレデンシャル情報はサーバー側で管理し、Presinged URLを発行することで一時的にファイルのアップロードを許可できるようにします。

まとめると以下の様なシーケンスになります。
![diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63169/68db9f03-753a-94ae-8156-a2f496a65740.png)

## ポイント

* まずマルチパートアップロードを開始するために「CreateMultipartUpload」というAPIをリクエストし、UploadIDを取得します
* 次にサーバー側で管理しているアクセスキー/シークレットキーからPresinged URLを発行し、ブラウザ側にそれを返します、このURLはpartの数だけ発行します
* 取得した Presinged URLに対して分割したファイルを順次Putリクエストをすることでマルチパートアップロードを実行していきます
* 最後に「CompleteMultipartUpload」というAPIをリクエストし、アップロードを完了させます

## まとめ

簡単に大容量のファイルがアップロードができることがわかりました🎉

やはり異常系などを考えるともう少し複雑になりますが、
めんどうなので今回はこれでヨシとします
マルチパートアップロードがコントロールパネルからもできるようになると嬉しいですね😇
宣伝しておくと、去年は@Ken-Moriizumiさんが[ゴミ掃除の話](https://qiita.com/Ken-Moriizumi/items/5aef960fd617e9c8e46d)をしてくれてたのでこちらも参考にしてみてください

## 参考文献

https://github.com/fuku2014/nifcloud-storage-multipart-presigned-upload

## 次回予告

@ConHumi氏が`ニフクラに登録したSSHキーと手元のキーが一致しているか確認する`をしてくれるらしいのでお楽しみに✊
『ディープラーニング G検定（ジェネラリスト）公式テキスト』読書メモ：02

## 探索・推論 

### 探索木

起点からスタートして，分岐点で場合分けしていき，目的の条件までたどり着くまで探索するアルゴリズム，木のような構造（ツリー構造）になることから探索木と呼ばれている．

![tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147064/a730c1db-0aa5-697b-bef9-8c384afaee0d.png)


探索にかかる時間は探索する方法によって変わる．
基本的な方法として，幅優先探索と深さ優先探索がある．

・幅優先探索

同じ層のとなりのノードを探索したあとに，下の層に進む．（横を探索）
最短距離でゴールにたどり着く経路（解）を見つけることはできるが，全てのノードに立ち寄るため，複雑になるとメモリ不足で処理できなくなる．

![幅優先.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147064/825e6758-66b4-2d9f-f804-27dc31deecdb.png)


・深さ優先探索

行き止まりのノードにたどり着くまで下の層に進む．（縦を探索）
行き止まりにたどり着いたら1つ手前のノードに戻って次の行き止まりまで探索．というのを繰り返す．
1つ手前のノードに戻って探索し直せばよため，メモリ不足は心配しなくても良いが，ゴールへの経路が最短距離であるとは限らない．
また，場合によっては解を見つけるのに時間がかかってしまう．

![深さ優先.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147064/428eba5c-331f-b982-b563-f3171c4bde62.png)



### ロボットの行動計画

ロボットの行動計画も探索を利用して作成でき，これを<font color="Lime">プランニング</font>と呼ぶ．

例）

＜前提条件＞ロボットはRoom1にいる状態
![step1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147064/d387e033-b8b9-72d3-c6df-5695a0892f54.png)

＜行動＞右に移動
![step2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147064/5eb1092c-fe7e-5985-af93-89d6c061db68.png)

＜結果＞ロボットはRoom2にいる状態
![step3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147064/ba982cc0-81fc-1b3a-cec7-6d2cf6016e49.png)

ロボットの状態<font color="Lime">＜前提条件＞</font>，ロボットが行う行動<font color="Lime">＜行動＞</font>，ロボットが行動を起こした結果生じるロボットの状態<font color="Lime">＜結果＞</font>の3つの組み合わせで記述する<font color="Lime">STRIPS</font>（Stanford Research Institute Problem Solver）が有名．

このプランニングを利用したもので，1970年にスタンフォード大学の<font color="Lime">テリー・ウィノグラード</font>によって開発された<font color="Lime">SHRDLU</font>というシステムが有名．

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/bo4RvYJYOzI/0.jpg)](http://www.youtube.com/watch?v=bo4RvYJYOzI)

※画像をクリックするとyoutubeにupされている動画を見ることができます．

### ボードゲーム

2016年3月9日にDeepMind社が開発したAlphaGoが囲碁の世界でトップレベルの韓国のプロ棋士に4勝1敗で勝ち越したのは歴史的なニュース．

・コスト

効率よく探索するためにコストの概念が重要．
例えば，ある目的地へ移動する際にどの経路でどの交通手段を使うかによって，時間や費用といったコストが変わってくる．
このような場合において，あらかじめ知っている知識や経験を利用して計算すれば，少ないコストで目的を達成できる．
このような経験的知識を<font color="Lime">ヒューリスティックな知識</font>と呼ぶ．
ヒューリスティックには経験的なという意味があるが，ここでは，単に経験的という意味だけでなく，探索を効率化するのに有効なという意味を含んでいる．
人工知能で扱う問題は組み合わせの数が大きすぎえて網羅的な探索では話にならないことが多いため，ヒューリスティックな知識の利用が重要．
また，ヒューリスティックな知識を利用することで，不完全な情報でも探索や推論を進めることができる．

### Mini-Max法

自分が指す時にスコアが最大（有利）になり，相手が指す時にスコアが最小になるように戦略を立てる手法．

・$αβ$法

Mini-Max法による探索を少なくする手法
最大のスコアを選択する過程でスコアが小さいノードが出現したら，そのノードを探索対象から除外することを$β$カット，最小のスコアを選択する過程ですでに出現したスコアより大きいノードが出現したら，そのノードを探索対象から除外することを$α$カットと呼ぶ．

### モンテカルロ法

モンテカルロ法は僕の理解としては，乱数を発生させて確率やある数値（円周率など）を近似する手法です．

ここでは，ゲームがある局面まで進むと，スコア評価を放棄し，プレイアウト（ゲームを終局させること）までランダムにゲームを進めるシミュレーションを複数回実行し，どの方法が一番勝率が高いかを計算する手法．

つまり，勝率が一番高い手を探索的に探すのではなく，乱数での近似により決定する，ということを行うわけですね．

![monte.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147064/500b4033-74dc-2ad4-9dc5-33df5b61adbe.png)

pythonでモンテカルロ法を使って円周率を近似してみました:relaxed:
Goのnew()とmake()の違い

new()とmake()の違いが分からなかったので調べてみた

## 比較
|        |new(T)   | make()       |
|:------|:--------|:-----------|
| 対象 |任意の型  |       slice,map,channelのみ        |
| 初期化           |初期化しない（ゼロ値になる）  |初期化する       |
| 返り値             |*T  |   T|

## makeとnewを使い分ける理由
### makeについて
- slice,map,channelが隠蔽されたデータ構造への参照であり、このデータ構造が使用前に初期化されている必要がある
- slice,map,channelの内部データ構造を初期化し、使用可能となるよう値を準備する


### newについて
- 他言語におけるnew()と基本的に同じ
- 型Tの新しいアイテム用にゼロ化した領域を割り当てそのアドレスである*T型の値を返す
- 新しく割り当てられた型Tのゼロ値ポインタを返す

## 参考
http://golang.jp/tag/effective-go/page/2
https://cipepser.hatenablog.com/entry/go-new-make
Linux標準教科書メモ3

## コマンド
コンピュータの基本的な作業はデータを処理することです。このデータをコンピュータ内で保存しておく方法としてファイルという形式がとられています。また複数のファイルの内容や用途ごとで分けてまとめる方法としてディレクトリ(フォルダともいう)を作成します。コマンドはこのファイルを操作するためのものです。

コマンドの実態はプログラムで、プログラムもファイルの一種であり、/binや/sbinといったプログラム用のディレクトリが配置されています。
通常コマンドを実行するとき、そのコマンドのプログラムがどのディレクトリに配置されているかを意識する必要はありません。それはPATHという環境変数にプログラムのディレクトリが設定されているからです。下記を見てみましょう。

```
$ pwd
$ /bin/pwd

$ ls
$ /bin/ls
```

両方実行結果は同じです。`$ pwd`でも実行されるのはPATHに`$ pwd`が実行されたら`$ /bin/pwd`を実行するようにと設定がされているからです。この設定することを**PATHを通す**といいます。

## 環境変数
ターミナル内で共有しておきたいデータを入れておく箱です。なのでPATHも環境変数のうちの一つです。

```
which コマンド名
```

whichコマンドを使うとPATHに含まれるディレクトリ配下に配置されているコマンドのパスを表示することができます。
UnityをバージョンアップするとNDK not foundになり、Androidビルドに失敗する

#問題
-Unityのバージョンを2019.2.13f1から2019.2.15f1にアップデート
-2.13fでは行えていたAndroidビルドに失敗するようになった(NDK not found)

[解決方法](#解決方法)

#試してみたこと
- Unity 2.13fから2.15fにUnity Hub経由でAndroidモジュール込みで、バージョンアップ
 - NDK not foundでAndroidビルドに失敗する
- 外部ツールの設定でNDKの場所を"NDK\android-ndk-r16b"に設定
 - 参考のようにエラーが出てAndroidビルドに失敗する
- 外部ツールの設定でNDKの場所を2.13f(ビルドできていたバージョン）のものにする
 - Androidビルド成功
- 2.13の"NDK"と2.15の"NDK\android-ndk-r16b"の中身を比較
 - 一致する

以上の結果からNDKの場所が悪いっぽい気がしたので変更してみたら、ビルドできた

#解決方法
NDKのフォルダの直下にNDKの中身を配置するように変更
"NDK\android-ndk-r16b"から中身を取り出してNDK直下に配置する

前
C:\Program Files\Unity\Hub\Editor\2019.2.15f1\Editor\Data\PlaybackEngines\AndroidPlayer\NDK\android-ndk-r16b\NDKの中身
↓
後
C:\Program Files\Unity\Hub\Editor\2019.2.15f1\Editor\Data\PlaybackEngines\AndroidPlayer\NDK\NDKの中身

#環境
- Windows 10 pro
- Unity 2019.2.13f
 - Android Build Supportモジュール込み
 - Unity Hub経由でインストール
- Unity 2019.2.15f
 - Android Build Supportモジュール込み
 - Unity Hub経由でインストール

#参考
https://forum.unity.com/threads/solved-android-ndk-missing.689122/
TechTrainMissionについて


みなさん、初めまして!!
愛知で学生をしているだいちゃんです(初めていいました笑)
7日目のアドベントカレンダーの担当をさせていただきます!
初めてのQiitaの投稿なので拙い文章かもしれませんがよろしくお願いします!🙇‍♂️

##この記事のターゲット
・Missionというものについて知っているがやろうか悩んでいる方
・開発初心者だけど開発してみたい方

##Missionについて
そもそも、Missionとはなにかということについて
Missionとは、TechTrain内のサービスである、オンライン完結型のインターンです！
![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_317034_6eb22833-bf92-e6b0-09a0-9f2616a39ad9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539384/5b0b9a17-f1ef-1c69-3d4c-849a1e0fed02.jpeg)
現在(2019年12月５日)では４つのミッションが展開されており、WebアプリやAndroidアプリ、iPhoneアプリの作成、他にもゲーム開発をしたい人といったように、やりたい分野によって分けられています！
TechTrainについてやMissionについての詳細を知りたい方は[TechTrain Advent Calendar 2019 1日目](https://qiita.com/TakumaKurosawa/items/8db598b9c0fcb6b9c2bb)をご覧ください

##開発の流れ
1.やってみたいMissionを選ぶ
2.流れを確認する
例として下記が[MLKitでかざして検索してみよう](https://techbowl.co.jp/techtrain/missions/6)(ログインしてないと見れないです)の流れとなっています<img width="907" alt="スクリーンショット 2019-12-06 16.04.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539384/ed97bf7a-abe8-ba35-89f5-9f62fe1121ce.png">
ここで書かれている開発の流れはざっとしたものとなっており、実際にどう開発するかは人それぞれなのとなっています!
3.これを踏まえて開発していく
できない人はSTEPの流れに沿って、できる人は自分なりに設計をして、開発していきましょう
また、わからないところはメンターさんに相談できるので相談しながら開発を進めて行きましょう！


##こんな人にオススメ
・何か個人的に開発はしたいけど具体的に何を作ろうか悩んでいる人
・企業が出しているものなので、その企業が行なっている事業について学んで見たい人
・あまり開発したことはないけど、やってみようという意思がある人←特にオススメ

あまり開発をしていない人でも特にオススメだというのは自分もこれであったからです!
上記のMLKitでかざして検索してみようを例にとってみると、カメラの映像を画面にプレビューとして表示するといっても具体的にどんな言語を使えば良いのかや、どう進めていったらいいか右も左も分からない人もいると思います。
そんな時は、メンターさんに、「どの言語使ったらいいですか!」といった、初心者すぎて質問しにくいことや、「こんなことに詰まっているのですが」といったことを相談すれば、「この記事を参考にしてみて」といった具体的なアドバイスをしてくれるのでとてもオススメです!

##自分が使ってみての感想
Web系のことをやってみたいと思っていた時期に自分はこのサービスに出会うことができました!
そんな中、どの言語を使うかや、サンプルアプリとしてある記事通りに作ってみるといったことをやることにより、スムーズに開発に移行することができました！
このように、メンターさんと相談しながら家で開発を進めていけるサービスはとても有難いと感じました!
完全無料なので多くの人に使っていって欲しいです！！！！！！

##まとめ
今回はMissionについてまとめてみました!
自分は、今まで開発とか自分で何かをしようといったことをやってこなかったのでそういった人でも、この機会に開発をしてみようという意思がある人向けに書かせていただきました!
TechTrainはプログラマにとって、「使わないと損!」くらいのサービスなのでこの記事を見て使ってみようと思たら嬉しいです☺️
私がコーディングできるようになった理由　その１（右脳・左脳の使い分け）

# いきさつ
今でこそ、現場でのプログラミング歴も6～7年を超え、駆け出しを抜けたレベルのプログラマーであると自負していますが、そんな私も新入社員の当時は「コーディングができない」という悩みを抱えていました。

専門学校で3年学んだ後、新卒で入社してからプログラマとして働きました。3年間オフショア開発による設計書作成や、プログラムの受け入れテストを主体に、コーディングは不具合改修と小規模な機能追加を担当していました。

合計6年もの間プログラミングに関わっていましたが、この「コーディングができない」という悩みは日に日に大きくなり、解消することはありませんでした。
この悩みが解決しないということは、プログラマに向いていないのだと思い、入社3年目で一度自分に見切りをつけ、会社を退社しました。


# 右脳・左脳の違いを知る
会社を退社し、失意の中、次の動画に出会いました。

[ジル・ボルト・テイラーのパワフルな洞察の発作](https://www.ted.com/talks/jill_bolte_taylor_s_powerful_stroke_of_insight/transcript?language=ja)



（紹介サイトより抜粋）
>右脳にとっては“現在”がすべてです “この場所 この瞬間”がすべてです 右脳は 映像で考え 自分の体の動きから 運動感覚で学びます 情報は エネルギーの形をとって すべての感覚システムから 同時に一気に流れ込み この現在の瞬間が どのように見え どのように臭い どういう味がし どんな感触がし どう聞こえるかが 巨大なコラージュになって現れるのです 右脳の意識を通して見ると 私という存在は 自分を取り巻くすべてのエネルギーとつながった存在なのです 右脳の意識を通して見た私たちという存在は １つの家族として互いにつながっている エネルギー的存在です 今 この場所 この瞬間 私たちはこの地球上で 共に世界をより良くしようとしている兄弟姉妹です この瞬間に 私たちは完璧であり 完全あり 美しいのです。


>私たちの左脳はまったく異なった存在です 私たちの左脳は直線的 系統的に 考えます 左脳にとっては 過去と未来がすべてです 左脳は 現在の瞬間を表す 巨大なコラージュから 詳細を拾い出し その詳細の中から さらに 詳細についての詳細を拾い出すようにできています そして それらを分類し 全ての情報を整理し これまで覚えてきた 過去の全てと結びつけて 将来の全ての可能性へと 投影します そして左脳は 言語で考えます 継続的な脳のしゃべり声が 内面の世界と外の世界とを つないでいます その小さな声が 私に囁きます“帰る途中で―” “バナナを買うのを忘れないで” “明日の朝いるから”

- - -
動画の要点としては以下のような内容です。
**・「右脳は 並列プロセッサのように機能し 左脳は 単一プロセッサのように機能する。」**
**・「右脳にとっては“現在”がすべて　左脳にとっては 過去と未来がすべて。」**

脳科学者であるジル・ボルト・テイラー氏の話に信憑性があると感じたのは、「物理的に脳が破損して気づいた」という点です。

この右脳・左脳の違いを意識した結果、「コーディングができない」問題が解決しました。

[[その2](https://qiita.com/komugirice/items/01750af4c7a59558e04f)]へ続く

※ブログを開設しました。こちらもぜひ閲覧してください。
<a href="https://kangae.jp">考え研究所</a>
<a href="https://eigoken.jp">英語研究所</a>