OmniAICreator/Qiita-1.07M huggingface dataset:
脱出ゲームの作り方　７　特定の条件でアイテムを使用

取得した電球を使うと電気が点灯する処理が作成されたが、
LightstandPanel以外の場所でも使えてしまうので、LightstandPanelの場面で電気を使うようにする

###各パネルを表示するときに、現在のパネルが何かをチェックする

GameManagerで下記を追加する

◇変数currentPanelを列挙型で作成し、ROOMパネルで初期化する

```csharp

public enum PANEL
{
    ROOM,
    LIGHT_STAND,
    DRAWER,
    PC
}

    // 現在表示しているパネル
    public PANEL currentPanel = PANEL.ROOM;

```

◇ボタンを押したら、現在のパネルをcurrentPanelに取得し、該当するパネルを表示する

バックボタンが押されたら、currentPanelをROOMに戻し、他のパネルを非表示にする

```csharp

    // ボタンを押したら該当するパネルを表示
    public void OnClickLightStandTrigger()
    {
        currentPanel = PANEL.LIGHT_STAND;
        lightStandPanel.SetActive(true);
    }
    public void OnClickDrawerTrigger()
    {
        currentPanel = PANEL.DRAWER;
        drawerPanel.SetActive(true);
    }
    public void OnClickPCTrigger()
    {
        currentPanel = PANEL.PC;
        pcPanel.SetActive(true);
    }

    // ボタンを押したらパネルを全て非表示
    public void OnClickBackTrigger()
    {
        currentPanel = PANEL.ROOM;
        lightStandPanel.SetActive(false);
        drawerPanel.SetActive(false);
        pcPanel.SetActive(false);
    }


```

###アイテムを電気スタンドが表示されている時だけ使用する

◇現在のパネルが電気スタンドのときに、アイテムを使う
ItemBoxManagerでGameManagerを取得し、UseItem()を書き換える

```csharp

    [SerializeField] GameManager gameManager;   


 // アイテムの使用
    public void UseItem(int index)
    {
        if ( gameManager.currentPanel == PANEL.LIGHT_STAND
          && itemList[index] == ITEM.LIGHT_BULB)   //現在のパネルが電気スタンドで、かつ使用するアイテムが電球だったら
        {
            lightStandManager.LightSwitch(true);            //電気をつける
            itemList[index] = ITEM.NONE; // アイテムを使用したので空にする;
            itemBoxImages[index].sprite = null;
        }
    }
```


InspecterでItemBoxPnelオブジェクトのItemBoxManagerスクリプトにGameManagerが出ているので、GameManagerを設定する

:point_up:
関数名はUseItem()で、Inspecterの「OnClick()」で設定しているので、
クリックしたときに実行される。
![OnClickImg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144922/838ee356-420e-a295-3c7e-2edd838a9995.png)



##教材
**Unityゲームスタジオ スタジオしまづ**
**【Unity】初心者からの脱出！？　脱出ゲームの作り方　その７　特定の条件でアイテムを使用**
https://youtu.be/ualq_a3rnQc
ENOENT とは Error NO ENTry の略でファイルやディレクトリが存在しないという意味のエラーメッセージらしい。

よく見るあいつ。No such file or directory と同じ感じかな。

[c - Why does ENOENT mean "No such file or directory"? - Stack Overflow](https://stackoverflow.com/questions/19902828/why-does-enoent-mean-no-such-file-or-directory/19902880)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2632









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
CRL証明書が発行できない

#1.Error内容
秘密鍵、証明書作成はスムーズに進み、CRLを作るぞっと思ったら以下のErrorで作成出来ない。

```
[daikon@CentOS7 ~]$openssl ca -gencrl -out CA.crl

/etc/pki/CA/crlnumber: No such file or directory
error while loading CRL number
140699256829584:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/home/holly/CA/crlnumber','r')
140699256829584:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
```

#2.解決方法

内容を見てみると、どうも「/etc/pki/CA/crlnumber」が存在せずErrorが出ているみたい。

ということで、以下のコマンドでcrlnumberファイルを作成して解決。

```
echo '00' > /etc/pki/CA/crlnumber
```
【GraphQL, lighthouse】メモ,エラー対処など ⑴

## 概要
lighthouseを使っていて出てきたエラー対処などの備忘録です。

## 環境
laravel 6.0.4
lighthouse 4.5

## 複数ファイルに分けてGraphQLを記述する
- ファイルの指定方法

```
* ディレクトリ構造
graphql/
|-- schema.graphql
|-- user.graphql
```

```graphql:graphql/schema.graphql
#import user.graphql
```

- 複数ファイルの指定方法

```
* ディレクトリ構造
graphql/
  |-- schema.graphql
  |-- user/
    |-- 1.graphql
    |-- 2.graphql
```

```graphql:graphql/schema.graphql
#import user/*.graphql
```

ドキュメントで確認した時はコメントかと思って見流していました。
ワイルドカードを使用できるのは便利ですが不思議な記述ですね。
## 使用するモデルの設定
app/lighthouse.phpのnamespacesで変更出来ます。

```php:app/lighthouse.php
    'namespaces' => [
        'models' => ['App', 'App\\Models'],
        'queries' => 'App\\GraphQL\\Queries',
        'mutations' => 'App\\GraphQL\\Mutations',
        'subscriptions' => 'App\\GraphQL\\Subscriptions',
        'interfaces' => 'App\\GraphQL\\Interfaces',
        'unions' => 'App\\GraphQL\\Unions',
        'scalars' => 'App\\GraphQL\\Scalars',
        'directives' => ['App\\GraphQL\\Directives'],
    ],
```

## スキーマキャッシュについて

```bash=
$ php artisan lighthouse:clear-cache
```
これでキャッシュクリア出来ますが、頻繁に打つことになってしまうのでローカルの開発では`LIGHTHOUSE_CACHE_ENABLE`をfalseにしてキャッシュを無効にするほうが良いです。

```php:app/lighthouse.php
    'cache' => [
        'enable' => env('LIGHTHOUSE_CACHE_ENABLE', true),
        'key' => env('LIGHTHOUSE_CACHE_KEY', 'lighthouse-schema'),
        'ttl' => env('LIGHTHOUSE_CACHE_TTL', null),
    ],
```

```.env:.env
LIGHTHOUSE_CACHE_ENABLE=false
```

## graphql-playgroundがブラウザ上で立ち上がらなくなった時
localStorageの容量を食いつぶすクエリを実行すると、その後ブラウザ上で立ち上がらなくなることがあるようです。
デベロッパーツール等からlocalStorageをクリアすると解決しますが、クエリを実行したまま終了していてクリアしても立ち上げる度に実行されてしまう場合は以下の方法が参考になるようです。
参考: https://gfx.hatenablog.com/entry/2017/09/27/002334

## 特定のブラウザで「Server cannot be reached」が表示され続ける
そのままでも動作に問題は無いようですが、こちらもlocalStorageのクリアで解決します。
Laravel で flatpickr を使ってカレンダーでの月選択

普通にflatpickrをインストールして、日付を選択するだけなら容易なのですが、
flatpickrの公式から月のみ表示して、月を選択できるようになったのでやってみます。

ミスがありましたらご指摘お願いいたします。

#動作
公式より
[こちら](https://jsfiddle.net/8640edj5/)から確認できます

#インストール
##CDN版
```HTML
//flatpickrのCDN
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
//flatpickrの月選択プラグイン
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr@latest/dist/plugins/monthSelect/style.css">
<script src="https://cdn.jsdelivr.net/npm/flatpickr@latest/dist/plugins/monthSelect/index.js"></script>
```
##npm
```npm:npm
npm i flatpickr --save
```

```js:resources/js/app.js
import flatpickr from "flatpickr";
import monthSelectPlugin from 'flatpickr/dist/plugins/monthSelect/index';

```

```js:resources/sass/app.js
@import "../../node_modules/flatpickr/dist/themes/airbnb.css";

@import "../../node_modules/flatpickr/dist/plugins/monthSelect/style.css";

```

#使用
インストールしたら使用できるようになるので、使ってみます

```js:resources/js/app.js

flatpickr(".js-calendar", {
        plugins: [
            new monthSelectPlugin({})
        ],
      })
```
コンパイルして表示を確認します

```
npm run dev
```

日本語化しているとこのような表示になります。
![SC000006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/748ca9f1-1934-1f43-b330-2a8371938c24.jpeg)

#参考にしたサイト
https://github.com/flatpickr/flatpickr/issues/269
AndroidでiOSのDispatchGroupと同じことをしたい。



複数の非同期処理を同時に流して、全部が完了したタイミングで次の処理を開始したいとき、iOSではDispatchGroupを使って手軽にできるが、同じことをAndroidで実現する方法を調べてこれを見つけた↓
元ネタ: [Android how to group async tasks together like in iOS](https://stackoverflow.com/questions/34871580/android-how-to-group-async-tasks-together-like-in-ios)

それを微妙に改変した↓


```
class DispatchGroup {
    private var count = 0
    private var runnable: (() -> Unit)? = null

    init {
        count = 0
    }

    @Synchronized
    fun enter() {
        count++
    }

    @Synchronized
    fun leave() {
        count--
        notifyGroup()
    }

    fun notify(r: () -> Unit) {
        runnable = r
        notifyGroup()
    }

    private fun notifyGroup() {
        if (count <= 0) {
            runnable?.invoke()
        }
    }
}
```

使うときは

```
        val dispatchGroup = DispatchGroup()

        dispatchGroup.enter()
        functionA(completion = {
            print("functionAが完了")
            dispatchGroup.leave()
        })

        dispatchGroup.enter()        
        functionB(completion = {
            print("functionBが完了")
            dispatchGroup.leave()
        })

        dispatchGroup.enter()
        functionC(completion = {
            print("functionCが完了")
            dispatchGroup.leave()
        })
        
        dispatchGroup.notify {
            print("全部の処理が完了")
        }
```
Could not update RVM　rvmのバージョンアップの対処法

# rvmのアップデートができない
WSLの環境でRVMのバージョンアップを行おうとした所、
以下のように表示がされ、アップデートができませんでした。

```
Could not update RVM, please report to https://github.com/rvm/rvm/issues
```

#解決方法

以下のコマンドを入力することで、
無事に最新版にアップデートできるようになりました。

```
$ rvmsudo rvm cleanup all
```

以下のissueを参考にしました

https://github.com/rvm/rvm/issues/4345
TeraTermでttlファイルを実行すると「無効なホスト」と表示される場合の対処方法


#事象
TeraTerm用のマクロファイルを実行した際、「無効なホスト」と表示され
少しハマったので対処方法についてメモ

#原因
・ttlファイルに紐付いている実行ファイルへ
　TeraTerm起動用の「ttermpro.exe」が指定されている。

#対処法
・ttlファイル用の実行ファイルを「ttpmacro.exe」へ変更します。

１実行したいttlを右クリックして
　「プログラムから開く」⇒「既定のプラグラムを選択」を選択。
２「参照」ボタンを選択してTeraTermのインストールフォルダ内にある
　「ttpmacro.exe」を選択し「OK」をクリック
３「ttpmacro.exe」でttlファイルが実行されるようになる。
Go言語の構造体の基本

Go言語にはJavaなどの言語でいうクラスやというものがなく、構造体というデータをひとまとめにして扱うための仕組みを使ってクラスのような機能を提供します。

この構造体を使うことで、オブジェクト指向の継承のような実装を実現することが出来、Go言語の一つの大きな特徴になっています。

この記事では構造体の宣言の仕方から、実際にどのように扱われるのかまで見ていきます。

#構造体の基本
##構造体の宣言
Go言語の構造体は以下のように変数として宣言して使用できます。

```Go
var japanese struct {
	name string
	age int
}
japanese.name = "hanako"
japanese.age = 23
fmt.Println(japanese)
```

構造体は変数だけではなく、型として宣言することもでき、こちらの方がより広く使われています。

```Go
type person struct {
	name string
	age int
}

studentA := person{
	name: "Taro",
	age: 20,
}

fmt.Println(studentA)
```
構造体の型がクラスで、定義した構造体の型で変数を宣言するのがインスタンス変数を宣言するのに似ています。

また、構造体に構造体を埋め込むことが可能で、これにより継承を実現しています。継承したい構造体（親クラスに当たるもの）を構造体の中に定義します。

オブジェクト指向言語と同じように、親クラスに当たる構造体のフィールドには子クラスに当たる構造体からアクセスすることが可能です。

```Go
func main() {
	studentA := person{
		name: "Taro",
		age:  20,
	}
	taro := japanese{
		language: "Japanese",
		country:  "Japan",
		person:   studentA,
	}

	fmt.Println(taro)
        fmt.Println(taro.person.name) //埋め込まれている構造体の要素にアクセスできる
}

type person struct {
	name string
	age  int
}

type japanese struct {
	language string
	country  string
	person   person
}
```

構造体はクラスに相当する役割を果たすため、当然メソッドも定義できます。構造体にどうメソッドを定義すればいいのか見ていきましょう。

##構造体にメソッドを定義する
構造体にメソッドを定義するには、定義先の構造体をレシーバに持つ関数を定義する必要があります。

実際に見てみましょう。これが構造体にメソッドを定義する例です。

```Go
type person struct {
	name string
	age  int
}

func (p person) selfIntro() {
	fmt.Printf("My name is %v. I'm %v years old.", p.name, p.age)
}
```
ご覧のように、personをレシーバに持つselfIntroというメソッドを定義しています。selfIntro()メソッド内部では、レシーバとして受け取った構造体が持つ変数にアクセスし、その変数の値を出力しています。

```Go
func main() {
	studentA := person{
		name: "Taro",
		age:  20,
	}
	fmt.Println(studentA)
	studentA.selfIntro() //出力結果: My name is Taro. I'm 20 years old.
}
```
これが実際に使用する場合の使用例です。

##構造体の使用例
ここまでで構造体の基本について見てきました。ここからは構造体を使用することでコードをより読みやすくできる例をご紹介します。

以下の構造体は、天気予報の情報を定義している構造体の型です。現時点では最高気温と最低気温、緯度経度による位置情報が入っています。

```Go
type wheatherReport struct {
	high, low float64
	latitude, longitude float64
}
```
現時点では、この二つだけなのでまだ分かりやすいでしょう。しかし、この構造体に最高湿度と最低湿度、降水確率など新しい情報を入れようとすると、ややこしくなってしまいます。

```Go
type wheatherReport struct {
	highTemperature, lowTemperature float64
	highHumidity, lowHumidity float64
	latitude, longitude float64
}
```
新たに構造体を定義し、構造体を埋め込むことでこの問題を解決することが出来ます。

```Go
func main() {
        nara := wheatherReport{
		temperature: temperature{high: 21.2, low: 11.0},
		humidity: humidity{high: 55, low: 33},
	}
	fmt.Println(nara.humidity.high)
	fmt.Println(nara.temperature.high)

}

type temperature struct {
	high, low float64
}

type humidity struct {
	high, low float64
}

type location struct {
	latitude, longitude float64
}

type wheatherReport struct {
	temperature temperature
	humidity humidity
	location location
}
```
どうでしょう、一気に読みやすくなったかと思います。Go言語のコードを読んでいると、至る所で構造体が使われているので、しっかりと理解しておきましょう。

#おまけ：構造体を初期化するコンストラクタ関数
オブジェクト指向の言語には、インスタンスをNewで作成した時に呼び出される機能があります。Pythonでは_init_、Rubyではinitialize、PHPでは__construct()です。

しかし、そのような仕組みがGoにはありません。その代わりとなるものがコンストラクタ関数です。

コンストラクタ関数は名前の先頭にnewという名前をつけて宣言するという慣習があります。

```Go
func newTemperature(high, low float64) temperature {
	return temperature{high, low}
}
```
このようにして、コンストラクタ関数で構造体を初期化するというやり方があるので覚えておくとよいでしょう。

それでは、最後までお読みいただきありがとうございました。
#npm で package.json と package-lock.json を一瞬で作成するコマンドの例

# 空っぽの package.json ファイルを作っておく

- そもそもファイルがないとコマンドでも上書きしてくれないっぽい。
- 中身は空のjsonにしておく。完全に空のファイルだとjsonとして認識してくれなくて動かないっぽい。

```
$ echo '{}' > package.json
```

# インストール

`--save` オプションを指定して好きな package をインストールする

```
$ npm install --save co
+ co@4.6.0
updated 1 package and audited 1 package in 0.535s
found 0 vulnerabilities
````

# package.json が上書きされている

```json
$ cat package.json
{
  "dependencies": {
    "co": "^4.6.0"
  }
}
```

# package-lock.json が生成されている

```json
$ cat package-lock.json
{
  "requires": true,
  "lockfileVersion": 1,
  "dependencies": {
    "co": {
      "version": "4.6.0",
      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
    }
  }
}
```

# 参考

[package.jsonの中身を理解する - Qiita](https://qiita.com/dondoko-susumu/items/cf252bd6494412ed7847)

# 組み合わせ自由！

パッケージ管理って素晴らしいですね。

健康的な食事とパッケージ管理をどうぞ。

![image](https://user-images.githubusercontent.com/13635059/67654173-02420a00-f990-11e9-88bd-c6e8b8161e76.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2631








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WindowsでJavaを複数インストールしたらビルドできなくなった話

# はじめに

kotlinの勉強をしようとして、java11をインストールしたところ、今まで通ってたjavaのbuildが通らなくなって焦った話

## JAVAの使い分け

環境変数のJAVA_HOMEによって使い分けることができます。

## VSCODEで環境変数の使い分け

プロジェクトの.vscodeフォルダに以下のファイルを置きましょう。

```:settings.json
{
        "terminal.integrated.env.windows": {
            "JAVA_HOME": "C:\\Program Files\\Java\\jdk1.8.0_211"
        }
}
```

これで、このプロジェクトはjava8専用になります。

タスクでも有効です。

Windows以外の場合には、末尾のwindowsをそれ以外にしましょう。

環境変数でうまくいかない場合は、dockerにしちゃうほうがいいかもしれません。
基本情報技術者試験の勉強計画10月

# 基本情報技術者試験の勉強計画10月

##目標と結果

###目標
・8項目までの参考書の演習問題を完璧にする。
・Qiita、Teamsを使いこなせるようにする。

###結果
・8項目までは完璧までには至らなかったが、ある程度にはできるようになった。
・指摘されたところを気を付け、探りながらではあるがだんだんと慣れてきた。


##振り返り
### keep
・１日１度でもテキストを開くこと。
### probem
・独習ゼミの勉強時間のボタンを押し忘れることが多いので気を付ける。
・バイトを入れすぎて勉強時間が少なくなるので考えて勉強時間を取る。
### try
・テキストの中の試験問題に目を通しておく。

##週次計画
###[1週目(10/21週)](https://qiita.com/poohsan/items/18b5418c8f78ad0dbe70)
###[2週目(10/28週)](https://qiita.com/poohsan/private/d616404132153cb76f2b)
基本技術者試験の勉強計画　第1週（10/21週）

#基本情報技術者試験の勉強計画1週目（10/21週）
##目標と結果
###目標
・４項まで参考書の演習問題を完璧にする。
・書き方に慣れる。
### 結果
・学習があまりできずに、2日間しか時間を取れなかった。
（独習ゼミFE-5までやった。)
## 振り返り
### keep（続けること）
・特になし
### problem（やめること）
・計画性のない勉強時間。
・難しい計画は立てない。
・何日も勉強しないこと。
### try（挑戦すること）
・大学の授業の空き時間でも勉強する。
・早めに勉強目標がやり終えたら復習を行う。
EJS触ってみた

# EJS触ってみた
今回たまたま参加した案件で使っていたので、色々と調べつつ書いてみた。
## EJSとは？
>
What is the "E" for? "Embedded?" Could be. How about "Effective," "Elegant," or just "Easy"? EJS is a simple templating language that lets you generate HTML markup with plain JavaScript. No religiousness about how to organize things. No reinvention of iteration and control-flow. It's just plain JavaScript.
>

google翻訳で見ると
>
「E」とは何ですか？"埋め込み？" になり得る。「効果的」、「エレガント」、または「簡単」はどうですか？EJSは単純なテンプレート言語であり、プレーンJavaScriptを使用してHTMLマークアップを生成できます。物事を整理する方法についての宗教性はありません。反復および制御フローの再発明はありません。それは単なるJavaScriptです。
>

おそらく
EJSとはテンプレート言語でJavaScriptを使ってhtmlを生成できるらしい。



## 実際に書いてみた例
### ページごとに変数を入れ、固定パーツを作成
配列を変数metadataに入れそれを各パーツに渡して行く。
例）大本のテンプレート

```
<% var metadata = {days:'2019/xx/xx', category:'カテゴリー', title:'タイトル'}; %>
<%- include('days', {data:metadata}); %>
<%- include('category', {data:metadata}); %>
<%- include('title', {data:metadata}); %>
```
例）呼び出しているパーツの中身

```
<h1><%- data.title %></h1>
```
それで出力されるのが

```
<h1>タイトル</h1>
```
 こんな感じで、変数を渡しパーツを生成することができる、しかも配列にできるので一気に値を設定でき楽ちん！

### forとifで階層があるリストを作成
- リスト
  - リスト
  - リスト
  - リスト
- リスト
- リスト

上記リストをejsパーツ化してみた。

まず変数定義

```
<% var list = ['リスト1','リスト2','リスト3','リスト4']; %>
<!-- 何個目に下層リストを入れるか（index番号） -->
<% var child = ['0','2']; %>
<% var childarr = [['リスト1の小リスト1','リスト1の小リスト2','リスト1の小リスト3'],['リスト3の小リスト1','リスト3の小リスト2']]; %>
```
パーツを呼び出し

```
<%- include('list', {li:list, child:child, childarr:childarr}); %>
```
パーツで変数を展開

```
<ul>
  <% for (var i = 0; i < li.length; i++) { %>
    <li><%- li[i] %>
    <% if ( child !=='') { %>
      <% for (var j = 0; j < child.length; j++) { %>
        <% if ( child[j] == i) { %>
          <ul>
            <% for (var q = 0; q < childarr[j].length; q++) { %>
              <li><%- childarr[j][q] %>
            <% } %>
          </ul>
        <% } %>
      <% } %>
    <% } %>
    </li>
  <% } %>
</ul>
```
すると

```
<ul>
  <li>リスト1
    <ul>
      <li>リスト1の小リスト1</li>
      <li>リスト1の小リスト2</li>
      <li>リスト1の小リスト3</li>
    </ul>
  </li>
  <li>リスト2</li>
  <li>リスト3
    <ul>
      <li>リスト3の小リスト1</li>
      <li>リスト3の小リスト2</li>
    </ul>
  </li>
  <li>リスト4</li>
</ul>
```
と出力されます。

## 触ってみて
パーツベースの中から大規模案件でものすごい力を発揮しそう書くのが楽、設計段階をきっちりしなくてもある程度修正は聞くと思われる（変数の渡し方でどうにかなりそう）
逆にそのパーツ一回しか使わないもの、LPや個性的なページの案件ではpugとか使って書いたほうが早い。


もっと有用な使い方はあると思うので色々発見していきたいです。
Adobe XDでスライド作ってみた

# Adobe XDでスライド作ってみた
オフィス系が全然使えないサラリーマン（毎日pc使って仕事してるのにダメなやつ）がパワポ苦手と同僚に相談したらxdでスライド作ればいいじゃんと言われたのでやってみた。

## Adobe XDとは？

>
XDに使用することで、デザイナーはより早く、正確に、高い品質で作業できます。インタラクティブなプロトタイプをシームレスに反映し、Windows、Mac、iOS、Androidなどの様々なデバイスやプラットフォーム上でチームのメンバーやレビュー担当者と共有できるようになります。
>

主にデザインソフトで使われていてワイヤーフレームの提案やそもそものwebデザインの用途で多く使われているイメージです。

## なぜデザインソフトでスライド作成
### 普段photoshopとか使ってるのでAdobe系の操作のほうが慣れている（オフィスが使えない言い訳）
完全なる言い訳XDの方がパワポより使いやすい（個人差大いにあり）
### アニメーションとかこだわれる
簡単にパーツごとにアニメーションつけれてセレクトボックスで選んでできる
### プロトタイプのリンク機能がとても見やすい
どの順番で進むかまるわかりで、矢印をつなげて順番変えられてとても直感的
### スライドの共有がめっちゃ楽
共有リンクを作成しコメントなど書き込むことが可能
基本全世界に公開なのでパスワードは必須でつけたほうがいいかも
## 作ってみて
直感的に操作できカラーやパーツ、書体などを保存できクリックで呼び出し可能なので、作業が早い。
デメリットはハイパーリンク（外部リンク）が使えないこと、アップデートでいつか使えるようになりますように。
Maya で選択した複数ノードを .obj にバッチで出力する MEL メモ 

以下のような MEL スクリプトで行けます.
ノード名 + .obj でファイル名を作っています.

```
$objs = `ls -selection`;

for( $name in $objs )
{
    select -r $name;
    // Modify export path
    string $pad = "C:/Users/syoyo/obj/" + $name + ".obj";
    file -force -options "groups=1;ptgroups=1;materials=0;smoothing=1;normals=1"-typ "OBJexport" -pr -es $pad;
}
```

## TODO

Python 版を作成する.
【分散学習】 TensorflowにおけるCPU/GPU使い分け

TensorflowにおけるプロセスごとのCPU/GPU使い分けについて記述します。


# 背景
[Ape-x,DISTRIBUTEDPRIORITIZEDEXPERIENCEREPLAY](https://arxiv.org/pdf/1803.00933.pdf)
[R2D2,Recurrent Experience Replay in Distributed Reinforcement Learning](https://openreview.net/pdf?id=r1lyTjAqYX)

強化学習において、Ape-x、R2D2のように経験の獲得はCPUを用いて並列化し、その経験を中央のGPUが学習する手法が提案されています。
CPUは並列化しやすいため、学習効率の改善が期待できます。

# 環境
Ubuntu18.04
Python 3.6.8
Tensorflow 1.12.0
CUDA 10.1

# CPU/GPU使い分け

## 解決策
Ape-x,R2D2ではマルチプロセスを用い、GPU計算をするLearnerと、CPU計算をするActorを生成します。
このとき、プロセス間のCPUとGPUの使い分けは下記コードで実現出来ます。

```python
import os,multiprocessing

def hoge_cpu():
    #CPU計算をしたい
    os.environ["CUDA_VISIBLE_DEVICES"] = "" #""には何も書かない
    ...

def hoge_gpu():
    #GPU計算をしたい
    ...

multiprocessing.Process(target=hoge)
multiprocessing.Process(target=hoge_gpu)
```

os.environ["CUDA_VISIBLE_DEVICES"]がポイントです。これを書くだけです。

## 別の実装
他の方の実装では下記のコードがありました。

```python
import tensorflow as tf
with tf.device("/gpu:0"):
    multiprocessing.Process(target=hoge_gpu)
with tf.device("/cpu:0"):
    multiprocessing.Process(target=hoge_cpu)

```

しかしこの実装ではCPU側の実行にGPUのメモリ領域が確保されていました。プロセス数に余裕があってもGPUのメモリサイズが限界となり、並列化の数が小さくなってしまいます。
基本技術者試験の勉強計画　第2週（10/28週）

## 目標と結果
### 目標
・独習ゼミFE-20までの学習を進める。
・毎日参考書に触れる。
### 結果
・FE-20までなんとかできた。
・毎日時間ない時でもテキストに目を通すようにした。
## 振り返り
### keep(続けること)
・時間ない時でもテキストを見る。
・先週のようにここまでやると計画の詳細を書く。
### problem(やめること)
・時間ない時が多すぎて詰め詰めになってしまうので、予定に余裕を持たせる。

### try(挑戦すること)
時間が余ったら復習。
画像名を文字列で指定してImageViewに貼り付けるコード(android)

___
追記：kotlinで見通しよく書き換えました
[文字列（リソース名）で画像を取得してImageViewに貼り付ける(kotiln)](https://qiita.com/marienplatz/items/ce5614a6334161e865c6)
___


swiftだと画像名で画像を指定して貼り付けられるのですが、そういえばandroidではなかったなと（あるんですかね）

見つからなかった、というか大して探してないのですが何となく作りました。

手順は
①画像名からリソースIDを取得
②リソースIDを使って画像をセット
これだけです。



```java:Util.java

public void setBackgroundResourceByString(Context context, String imgName, View view){
    int resourceId = context.getResources().getIdentifier(imgName, "drawable", context.getPackageName());
    view.setBackgroundResource(resourceId);
}
```

第一引数にgetContext()などで得たcontextを代入、
第二引数はdrawableに入れられた画像名をストリング型で代入、
第三引数はその画像を貼り付けたimageViewやViewを代入してください
※Viewを継承したクラスなら使えます

ちょっと気持ちが悪いので

```java:Util.java

public int getResourceIdByString(Context context, String imgName){
    return context.getResources().getIdentifier(imgName, "drawable", context.getPackageName());
}
```

このくらいのメソッドが無難かもですね

ちなみに多分ですが、drawableはcolorやstringとして登録されている色や文字のリソースIDを取得することもできるかと
[ TomCat ] [ Android ] サーバクライアント通信4 ランダムな整数を返す

今回はサーバ（TomCat）からランダムな整数を取得する方法について記す。
TomCatのインストールとサンプル表示は
[インストール]
・https://eng-entrance.com/java-servlet-tomcat-install
[サンプル表示]
・https://searchman.info/java_eclipse/1040.html
を参考にして頂きたい。

**上記のサンプル表示ができている前提で話を進める。**

##Random
サーバ側のプログラムはjavaで書かれている。
javaでは乱数を扱うためにRandomクラスを用いる。
まずRandomクラスをインポートする。

~~~
    import java.util.Random;
~~~

乱数を扱うためには以下のように書く。

~~~
    Random random = new Random();
    int randomNumber = random.nextInt(9);
~~~

このようにしてrandomNumberは0以上9未満の乱数を受け取ることができる。

さらに以下のようにコードを追加し、
これをクライアントに取得させる。

~~~
    PrintWriter out = response.getWriter();
    out.println(RandomNumber);
    out.close();
~~~

クライアントがサーバからHTTP通信により値を取得する方法は
前回の記事
・https://qiita.com/QiitaD/items/79228417a68c51090a4e
を参考にして頂きたい。

##サンプルコード
以下がサンプルコードである。

~~~
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.Random;

 public class HelloWorld extends HttpServlet {
        public void doGet(HttpServletRequest request,
                          HttpServletResponse response)
                          throws IOException, ServletException {

    Random random = new Random();
    int randomNumber = random.nextInt(9);


    PrintWriter out = response.getWriter();
    out.println(RandomNumber);
    out.close();
    }
}
~~~

##まとめ
サーバクライアント通信の当初の目的であった
「サーバから乱数を取得するプログラム」を完成させることができた。
4回に渡って綴ってきたので、
興味のある方はぜひ参考にして頂きたい。
以上。
AndroidViewの表示・非表示を切り替えるView.INVISIBLEとView.GONEの違い

#Viewの表示・非表示を切り替える方法
Viewの表示・非表示を切り替えるには、view#setVisibility(int visibility)メソッドを使用します。
visibility引数には可視状態を表す定数を指定します。

```
TextView exampleView = (TextView) findViewById(R.id.example_view);
exampleView.setVisibility(View.INVISIBLE);
```
上記のように書くことができます。

#INVISIBLEとGONEの違い
- View.INVISIBLE   
 非表示にする。非表示にした領域は詰めない。viewが見えないだけで、領域は占める。
- View.GONE		   
 非表示にする。
非表示にした領域を詰める。
viewがそもそもなかったように振舞う。

※初期値はView.VISIBLE（表示する）に設定されている。
【Xamarin】C#でAndroidアプリを作ってみる 4 (画面作成2)

#概要
前回：[C#でAndroidアプリを作ってみる 3 (画面作成1)](https://qiita.com/plusM/items/45ade15a6c9df6471aa4)
今回は、選択した日付の干支×星座算出部分を作ります。

# 干支を算出する
[干支の求め方](https://ja.wikipedia.org/wiki/干支#干支の求め方)を参考に計算します。
MainActivity.csに以下のコードを追加します。

```cs:MainActivity.cs

        // 十二支
        private const string ETO = "申酉戌亥子丑寅卯辰巳午未";

        /// <summary>
        /// 干支の算出
        /// </summary>
        /// <param name="year"></param>
        /// <returns></returns>
        private string GetEto(int year)
        {
            return ETO[year % 12].ToString();
        }
```

# 星座を算出する
星占いの星座です。
MainActivity.csに以下のコードを追加します。

```cs:MainActivity.cs
using System.Linq;

        // 星座
        private static Tuple<string, int, int>[] SEIZA = {
            Tuple.Create("牡羊座", 321, 419),
            Tuple.Create("牡牛座", 420, 520),
            Tuple.Create("双子座", 521, 621),
            Tuple.Create("蟹座", 622, 722),
            Tuple.Create("獅子座", 723, 822),
            Tuple.Create("乙女座", 823, 922),
            Tuple.Create("天秤座", 923, 1023),
            Tuple.Create("蠍座", 1024, 1122),
            Tuple.Create("射手座", 1123, 1221),
            Tuple.Create("山羊座", 1222, 1231),
            Tuple.Create("山羊座", 101, 120),
            Tuple.Create("水瓶座",121, 218),
            Tuple.Create("魚座", 219, 320)
        };

        /// <summary>
        /// 星座の算出
        /// </summary>
        /// <param name="month"></param>
        /// <param name="day"></param>
        /// <returns></returns>
        private static string GetSeiza(int month, int day)
        {
            var target = int.Parse($"{month}{day.ToString("00")}");

            var seiza = SEIZA.FirstOrDefault(s => s.Item2 <= target && target <= s.Item3);
            return seiza.Item1;
        }
```

計算の都合上、山羊座は2期間に分けています。

# 干支と星座の算出結果を表示する
日付を選択した後、干支と星座を画面に表示するようにします。
MainActivity.csのDateSelectButton_Clickを以下のように変更します。

```cs:MainActivity.cs
        /// <summary>
        /// SELECT DATEボタン押下時の処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DateSelectButton_Click(object sender, System.EventArgs e)
        {
            var frag = DatePickerFragment.NewInstance(delegate (DateTime time)
            {
                selectedDateLabel.Text = time.ToString("yyyy年MM月dd日") 
                    + $"あなたは、{GetEto(time.Year)}年 {GetSeiza(time.Month, time.Day)}です。";
            });
            frag.Show(FragmentManager, DatePickerFragment.TAG);
        }
```

# 実行してみる
実機でデバッグ実行します。
SELECT DATEボタンをタップして日付を選択し、OKをタップします。
![算出結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520699/c3ee83f9-d84d-e299-66fa-5d21940b34dc.png)
日付の選択、干支と星座の算出結果が表示されました。

# まとめ
今回は、選択した日付の干支×星座を算出し、画面に算出結果を表示するところまでを行いました。
次回は、もう少し見栄えを良くしようと思います。
次回分はこちら⇒[C#でAndroidアプリを作ってみる 5 (見栄えの調整)](https://qiita.com/plusM/items/167db1a10dfce1c1ef52)
Pipenvのscriptsで複数のコマンドを実行させる



## きっかけ
Djangoではmigrateファイル生成とマイクレートの実行は別々のコマンドのためマイグレーション時には次の2つを打つ必要性が有ります。

```bash

$ pipenv run python manage.py makemigrations
$ pipenv run python manage.py migrate
```

そこでPipenvにあるオプションであるscriptsを使って一つにまとめようと次の内容を記述しました。

```pipenv
(前略)
[scripts]
dev = "python manage.py runserver"
migrate = "python manage.py makemigrations && python manage.py migrate"

```

実行すると次のようなエラーが出ます。

```bash
% (*'-')<3 pipenv run migrate   

No installed app with label 'python'.
No installed app with label 'manage.py'.
No installed app with label 'migrate'.
```

## 解決策

bashのCオプションをつかってコマンドを流し込みます。cオプションは引数の文字列からコマンドを実行してくれるというものになっています。今回書いたものは次にのものになります。

```pipfile
(前略)

[scripts]
dev = "python manage.py runserver"
migrate = "bash -c 'python manage.py makemigrations && python manage.py migrate'"

```

これで実行してみます。

```bash

% (*'-')<3 pipenv run migrate                                                                                                                 [~/dev/socPlProject/yebisu][add/yebsu]
No changes detected
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.
```
問題なく実行されました。
【SQLite3】テーブルの操作

## テーブル作成
```sql

CREATE TABLE personal001(id, name);
```
この構文をCREATE文といいますが、これでテーブルを作成できます。

---

## データベース内に作成されたテーブルを確認する
### .tables
データベースに格納されたテーブルの名前を確認したいときは、このSQLiteコマンドを使うと確認することができます。

```shell
.tables
```
```shell:実行結果
personal001  personal002
```

### .schema
SQLiteコマンドの.schemaを使うと、データベースに格納されたテーブルの構造を確認することができます。

```shell
.schema
```
```sql
:実行結果
CREATE TABLE personal001(id, name);
CREATE TABLE personal002(id INTEGER PRIMARY KEY, name TEXT NOT NULL);
```
---

## テーブル名の変更

```sql
ALTER TABLE 現在のテーブル名 RENAME TO 新しいテーブル名;
```
テーブルの名前を変更するには、上記のように行います。

```sql:テーブル名を"personal002"から"myfriends"に変更
ALTER TABLE personal002 RENAME TO myfriends;
```

実際にテーブル名が変更されたかを.tablesコマンドで確認してみます。

```shell:.tablesコマンドの実行結果
.tables
myfriends    personal001
```

---

## カラムの追加
一度作成したテーブルに後からカラムを追加することも可能です。
カラムを追加するには ALTER TABLE 文を使います。書式は次の通りです。

```sql
ALTER TABLE テーブル名 ADD COLUMN カラム名 [データ型];
```

追加したカラムはテーブルの最後に追加されます。またカラムを追加する場合は次の条件を満たしていなければなりません。

- PRIMARY KEY や UNIQUE 制約は設定できない
- DEFAULT 制約を設定する時は、CURRENT_TIME/CURRENT_DATE/CURRENT_TIMESTAMP は指定できない
- NOT NULL 制約を設定する時は、NULL以外のデフォルト値の設定が必要

現在のテーブルを確認してみます。

```shell
.schema
```
```sql
CREATE TABLE personal001(id, name);
CREATE TABLE myfriends(id INTEGER PRIMARY KEY, name TEXT NOT NULL);
```

テーブル"myfriends"に新しいカラム"address"を追加してみます。

```sql
ALTER TABLE myfriends ADD COLUMN address text;
```

.schemaで確認すると、カラムが追加されたことがわかります。

```sql
.schema
CREATE TABLE personal001(id, name);
CREATE TABLE myfriends(id INTEGER PRIMARY KEY, name TEXT NOT NULL, address text);
```

---

## カラムの削除
SQLite3では、カラムの削除のコマンドがないようです。
なので、カラムを削除したいときは以下の手順を行う必要があります。

1. 元テーブル(削除対象のカラムが入っているもの)を用意する。
2. 元テーブルのコピーを削除対象のカラムを除いて作成する。(必然的にテーブル名が元テーブルとは違ったものになる。)
3. 元テーブルを削除する。
4. コピーしたテーブルの名前を元テーブルのものにする。

---

## テーブルの削除

テーブルを削除するには、DROP TABLE文を使います。
まず、.tableコマンドで現在作成済みのテーブルを確認します。

```shell
.tables
myfriends    personal001
```

テーブル"myfriends"を削除します。

```sql
DROP TABLE myfriends;
```

.tablesコマンドで、格納されているテーブルを確認します。

```shell
.tables
personal001
```

---

### 本記事目次ページ
[【データベース】SQLite3・JDBCまとめ](https://qiita.com/tsweblabo/items/8fa21f3e9e30885be034)

### 参考サイト
- [DBOnline 初心者でもわかりやすいサイトSQLite入門](https://www.dbonline.jp/sqlite/)
【初心者】JavaScript　変数・定数／振り返り【備忘録７】

##10/25～27で勉強したこと 

###JavaScript入門！
- 基本的に【console.log("文字列");】で出力をする。
- //コメント　で出力しない文章を書くこともできる。
- + - * /で四則計算。%で割り算の余りを出力できる。

###変数
- 同じ文章を出力する際や、同じ値を繰り返し使用する際に使う。
　変更にも対応しやすく、値の意味もわかりやすくなるため変数は使用される。
- 変数は上書き(ex)や追加(ex2)などができる。上書きする際は【let】は不要<br>
　【ex:let number=2;  number=3;】【ex2:let number=2; number +=2;】

###定数
- const number=〇;で定数をして出力が可能。
- 長いコードになればなるほど途中で代入の数字が変わってしまっているなどの心配が出てくる。<br>
そこで定数のconstを使用していると、途中の数値上書きが不可なので定数を使ったほうが安心。
- 定数の場合文章連結に+を使うのではなくて別の連結方法がある。
　console.log(`　私の名前は${name}です　`);

##振り返り・気を付けること
- console[ .]log ドットを忘れてしまうことがあったので気を付ける。
- 数字を代入する際は""は必要ない！気を付けること。
- number +=2; の+と=の間にスペースを入れるとエラーが出たので気を付けること！
- 定数での${}で連結する際は `` を文頭文末に入れ忘れないように気を付ける。
Androidアプリ開発から収益化までの道のり

Android用のスマホアプリ開発から収益化までの奮闘記です。
スマホアプリで儲けよう！って方の参考になれば幸いです。

# スマホアプリ作成のきっかけ①　新しいことへのチャレンジ

スマホアプリ開発は前から興味があったので、まずは作ってみよう！ってことがきっかけ。単純に新しいことってワクワクしますよね。

# スマホアプリ作成のきっかけ②　収益の多角化

で、もう一つのきっかけが収益源を増やそうと考えたことです。今まで収益源として2つの仕組みをつくりました。

## ブログ

当ブログですね。主にGoogle Adsenseを中心とした広告が収入源です。

## webアプリ

スケジュール調整アプリ。こちらもAdsenseが収入源。と言いたいところですが、まだ審査を通ってません。
立ち上げ時の奮闘記はコチラ。

[Webサービス(Webアプリ)立ち上げから収益化までの道のり](https://qiita.com/teckback/items/3faafffb2ac408e3fb42)
[TECH BACK](https://techback.info/web-service-monetization/)

もっと利用者を増やさないと審査が通らないので、いろいろと試行錯誤中です。

## スマホアプリ

で、今回は新たな収益の柱としてスマホアプリを作ってみようかと。全くの未経験なので、開発のやり方を調べるところからスタートです。

# 開発環境

開発環境はこんな感じです。

|項目      |内容        | 
|:-----------------|:------------------|
|開発環境|Android Studio|
|言語|Kotlin|
|データベース|Realm|


開発環境の構築模様はブログで紹介していますのでこちらもどうぞ

[Androidアプリ開発環境を構築](hhttps://techback.info/androidapp-dev-env/)

# アプリ紹介

作ったアプリはこれです。

[habiting! - 無理なく習慣化しよう](https://play.google.com/store/apps/details?id=com.techback.habiting)


## 目的

アプリの目的は「日々のタスク管理」と「タスクの習慣化」。

行動の習慣化ってなかなか難しいものです。このアプリは習慣化を後押しすることができます。

## アプリ名の決め方

分かり易い＆シンプルなアプリ名がベスト。アプリの目的をストレートに表そうってことで、習慣化を英語にした「habiting!」にしました。

ちなみにアプリストアでの表示名は**「habiting! - 無理なく習慣化しよう」**。アプリ名＋キャッチコピーにしています。

これは他のアプリがどんな名づけしているかを調べたところ、結構キャッチコピーを付けてるんですね。確かにこの方がストア内でアプリの内容が分かりやすくなりユーザーへの訴求効果もあるので、短くまとめたキャッチコピーを考えました。

## アイコン作成のコンセプト

アプリの機能をストレートに表すものを考えました。あまりひねったものだと何のアプリか分からなくなりますしね。

日々実行したタスクをチェックするアプリなので、カレンダーにチェックマークを付けたデザインにしました。

## 特徴

カンタン＆シンプル。習慣化を促すアプリなので操作が面倒だと本末転倒です。アプリデザインに当たっては直感的に使えることを重視しました。できるだけ簡単にタスク実施が記録できるようにしています。スマホアプリっていちいちマニュアル見ながら使ったりしませんからね。

ちなみに以下はストアページで最初に表示される画像です。ユーザーに訴求するため、アプリの特徴をギュッと詰め込んでみました。

![habiting-header-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450952/d2e21d2c-810f-ffdd-de52-b96bc87d2cc6.png)


どうでしょう？気になったら是非使ってみてください！

# 収益化

Googleの広告サービス「AdMob」を使います。

[AdMob](https://www.google.com/intl/ja_jp/admob/index.html)

審査は一応通り、実装もOK。なのですがしばらくしたら広告表示されなくなってしまいました。。。

原因は調査中です。

# 今後

というわけでまだまだ収益化までは至っていません。。。

まずは利用者を増やさないと！てことで次はアプリを世にアピールしていきます。

Google  Playに登録されているスマホアプリは膨大な数でしかも日々増えているので、ストアに登録しただけでは全くダウンロードされずにお終いです。ブログ・SNSなどなど、使えるものは何でも使ってアピールしていかないと！当記事もある意味宣伝活動の一環です。

あと、アプリのアイデアは色々あるので、どんどん形にしていきたいですね。
CKA受験記

#はじめに

すでに多くの方が投稿されていますが、Certified Kubernetes Administrator (CKA)に合格したので、学習内容などを記載します。

#学習前の状態
クラウド環境で、若干K8sを触ったことがあり、概要レベルは知っている状態でした。

なお、本試験はLinuxの基盤的なスキルも要求されるため、自分のようにスキルがアプリ開発メインのかたは、意識して補強されることをお勧めします。「systemdって何やねん」みたいな人は、若干苦しいかと思います。

#学習内容
自分は、以下のStepで学習しました。
下記の2から4をやれば、ほぼ合格できると思います。
１.のトレーニングは、2および３のstepで代替できます。
集中的に学習したい人は、受けても良いでしょう。
ただ、4日間なのでそれなり時間は拘束されます＆高額。

1. [クリエーションライン社のk8sトレーニング](https://www.creationline.com/kubernetes-training)
1. [Kubernetes完全ガイド](https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E9%9D%92%E5%B1%B1-ebook/dp/B07HFS7TDT/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=k8s+%E9%9D%92%E5%B1%B1&qid=1572241998&sr=8-1)の読み込み
1. [Udemy CKAトレーニングコース](https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/) 
1. [kubernetes-the-hard-way](https://github.com/kelseyhightower/kubernetes-the-hard-way)


##クリエーションライン社のk8sトレーニング
LinuxFoundationの公式認定されたトレーニングらしいです。
テキストもLinuxFoundation作成の日本語訳です。

k8sの多少の知識あり、本格的に勉強したい人向けかなと思います。
全くの初学者は消化しきれない可能性もあり、事前に多少の知識を仕入れておくことをおすすめします。

演習 + ハンズオン形式ですが、ハンズオンが大部分を占めます(自分が受講した時は)。

## Kubernetes完全ガイド

k8sの日本語の書籍といえばコレ。

##Udemy CKAトレーニングコース
前述の学習内容で、もっとも有用だったのは、Udemy CKAトレーニングコースです。

特に、Mock Examsは重要で、本試験の雰囲気を体験できます。
回答方法なども、本試験と近い形で出題されるので、ぜひやっておきましょう。
Mock Examsを受けるだけでも、金を払う価値があります。

Mock Examを受ける際は、分からない内容は[kubernetes.io/docs](https://kubernetes.io/docs)を1タブのみで、調べるようにしましょう。本試験と極力同じ状態を作り出すためです(本試験時は参照可能なURLは限られる)

さらに、コース内には[Katacoda](https://www.katacoda.com/)で、実機で確認できるコンテンツもあります。k8sの環境を手元に用意できない人にとってはお勧めです。

なお、定価で購入すると24,000円と高額なのですが、Udemyは頻繁に割引しているので、そのタイミングで購入しましょう。
2000円ぐらいで購入した記憶があります。


## kubernetes-the-hard-way

これも、是非やっておきましょう。集中すれば1日で完了できます。
これをやっていないと、解けなかったであろう問題も出題されました。

昔から存在するコンテンツですが、k8sのバージョンアップに合わせて更新されており、今でも有用な内容です。

#試験の感想

受験場所は、自宅。
会社の会議室での受験も考えましたが、ガラス張りの部屋が大半で、受験できるか不安だったので自宅に。

試験管にカメラ越しにパスポート見せたり、部屋を見せたりといった、お約束をこなした上で試験開始。

本試験は3時間ありますが、ある問題で詰まったこともあり、時間はギリギリでした。
また、ちょーめんどくさそうな問題が1問あり、時間内に解けそうもなかったので、捨てました。

問題難易度は、それほど難しくなく、普通に学習していれば解けるレベルです。
が、やはり時間が足りないので、以下のテクニックがボディーブローのように効いてきます。
 ・kubectl runで定義のひな形を作る
 ・alias k=kubectlでコマンドを短縮する
 ・api resourceは短縮名で打つ(k get deployment <=> k get deploy)

また、試験は英語で申し込んだのですが(日本語も選択可)、試験問題の言語は、試験中に切り替え可能でした。試験官とのChatに使う言語に影響があるようです。


#試験結果

スコアは、88％でした(合格ライン74%)。
捨てた問題の配分が8%だったので、それ以外に1問ミスしたことなります(全24問)。
 
また、結果は試験終了後36時間以内に通知されるのですが、自分の場合は31時間後に連絡が来ました。

今回、初めて実機での試験を受けましたが、自分には合ってるなと印象。
これまでの選択式のペーパーテストより、学習過程も含めて、やりがいがある試験でした。
Python3のmap/filterがiteratorを返してることの意味

Python3でmap/filterがイテレータを返すことは知っていたが、トラップにはまってしまったのでメモ

```python
lst = [1,2,3,4,5]

flist = filter(lambda i: i%2==0, lst)
print(flist)

for i in flist:
    print(i)

for i in flist:
    print(i)
```

python2系で実行すると

```
[2, 4]
2
4
2
4
```

python3系で実行すると

```
<filter object at 0x7f1d6636e518>
2
4
```

イテレータを一度ループさせて終端まで行ってるのでもう一度適用しても何も残ってないですよ、というお話

```python
flist = list(filter(lambda i: i%2==0, lst))
```
と書かないといけない
機械学習の概要（教師あり学習・教師なし学習）

こんにちは

今日から機械学習の勉強を始めようと思います。勉強したことを後から見返せるようにまとめたいと思います。
#機械学習とは
機械学習という言葉にはいくつかの定義があります。アーサー・サミュエルが1959年に一般紙に対するインタビューとして「明示的にプログラミングすることなく、コンピュータに学ぶ能力を与えようとする研究分野」と定義しました。また、トム・M・ミッチェルは、さらに厳格な定義として「コンピュータプログラムが、ある種のタスクTと評価尺度Pにおいて、経験Eから学習するとは、タスクTにおけるその性能をPによって評価した際に、経験Eによってそれが改善されている場合である」としました。

例えば、あなたが天気予報をしたいとします。このとき「ある種のタスクT」とは「天気を予測する」ということであり、「評価尺度P」とは「その天気予報がどれほど正確であったかを評価する基準」、「経験E」とは、実際の気象データとなるでしょう。

つまり、機械学習とは「ある課題を達成するための具体的な指示がなくても、推論やパターンを使ってコンピュータがその課題を解決してくれるアルゴリズム」であると言えるでしょう。

#教師あり学習
教師あり学習とは「正しい答え」があり、アルゴリズムにそのような答えを予測させるような学習のことを言います。教師あり学習には次の２種類があります。

###分類問題
ある情報が与えられた時に、それがAなのかBなのかCなのかを分類したい時があります。このような問題を「分類問題」といいます。まずは具体的に見ていきましょう。

例えば次の図はX君のテストの成績と、その次の日に学校に来たかどうかを表しています。

![separation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/e801b454-a515-e055-3f0a-3c59e9399232.png)

この時、X君が次の日学校に来るかどうかを前日のテストの点数を使って予想しようというものです。20点くらいであれば次の日にX君が来るとは考えづらく、逆に80点くらいであれば恐らく来るだろうと推測することが出来ます。

この図は次のように書くこともできます。

![separation1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/cab38df4-2537-fbca-6b14-9d89aaddcf5c.png)

赤色のXが欠席、青色のXが出席を表しています。あるいは、
![separation2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/03162d50-8885-0041-0377-c751f58de707.png)

このように点数と降水量のように2つ以上のデータを用いることがあります。
![separation3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/c62f6df7-961a-0075-3294-d43af3849fe6.png)

このように線を引けば、次の日にX君が学校に来るかどうかを推測することが出来ます。ここでは２つの特徴を用いましたが、３つ、４つ・・・無限個の特徴量を使うことが出来ます。

このように分類問題は離散的な（とびとびな）問題を扱います。

###回帰問題
一方回帰問題は連続的な値を扱います。例えば家の値段です。次の図はY駅からその家までの距離と家の値段を調べたデータです。

![separation4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/77cf4a55-8e68-a760-3672-b05f7b7a8dc9.png)


このデータからある家の値段を推測する手段の一つに次のようなものがあります。

![separation5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/c700fbec-41c8-2bb5-a1dc-621618435f7f.png)


このように直線を引けば駅からの距離と家の値段のおおよその関係が分かります。あるいは、

![separation6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/479327f5-3a6f-d45c-ab84-3f86802fe757.png)


このように２次関数で近似することもできます。このように、先程の分類問題とは違い連続的であるということが分かると思います。

ここまで、教師あり学習について見てきました。次は正解のデータを与えない教師なし学習についてみていきましょう。

#教師なし学習
教師あり学習は「正しい答え」がある学習の方法であると言いました。では、教師なし学習には「正しい答え」がないのか？というと、そうです。正しい答えは与えません。ではどのようなことをすることが出来るのでしょうか？主に次の２つがあります。

###クラスタリング
教師なし学習でできることの代表例に「クラスタリング」と呼ばれるものがあります。

![クレスタリング１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/b3351354-4cdc-783a-5084-138aeec0f5af.png)

このように何かの分布のデータが与えられたときに

![クレスタリング2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/cc2f43b3-0d50-b65f-69c6-f39f357f0522.png)

このように分布が集中している所を判別することが出来ます。


###データセット変換（教師なし変換）
例えば、Y君の特徴を教えてーと誰かに聞いたときに、↓のように言われたとします。

![変換.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520906/3f961d88-56e3-793d-a7a6-2506beacfdb7.png)


こういった場合、あなたはたぶん「要はY君って賢くて仕事がデキル人なんだ」と思うでしょう。このように、多数の特徴量で構成されるデータをより少ないデータで表せるように要約することを「次元削減」といいます。この場合、「努力家」「物知り」「語学堪能」などのY君の特徴が、多数の特徴量で構成されるデータであり、「賢くて仕事がデキル人」が要約された後のデータを表すものです。この次元削減はデータセット変換の中の最も一般的な手法です。

ということで、今回は機械学習とはいったいどういったものなのか？という全体的な概念について書きました。
Microsoft Wordのdocxの編集制限を解除する

#初めに
日本語の解説記事がなかったので備忘録的に書く。
内容はまんま下記の記事の通りです。
https://superuser.com/questions/486844/how-can-i-unlock-a-microsoft-docx-document/486883#486883

#法律的なお話
パスワードによる制限を無効化した場合、法律や条例に違反する可能性があります。
自ら設定した保護を解除する場合等に使用してください。

#手順
1. 拡張子をdocxからzipに書き換える
2. zipを展開し、中にあるwordフォルダ内の`settings.xml`を開く
3. `<w:documentProtection　~　/>`の行を削除して上書き
4. 再度zip化し、拡張子をdocxに書き換える

以上

#ちなみに
「編集の制限」ではなく「パスワードを使用して暗号化」されると、こんな雑な小ワザでは太刀打ち出来ません。
総当たりで無理矢理解くソフトもあるようですが、マルウェアの可能性もあるのでオススメしません。
yarn install時に"Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime"というエラーが出る

## エラー内容 

```

Error: Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (72)
For more information on which environments are supported please see:
https://github.com/sass/node-sass/releases/tag/v4.11.0
    at module.exports (/Users/hayashi-ay/Project/monaca-app-codmon2-vuejs/node_modules/node-sass/lib/binding.js:13:13)
    at Object.<anonymous> (/Users/hayashi-ay/Project/monaca-app-codmon2-vuejs/node_modules/node-sass/lib/index.js:14:35)
    at Generator.next (<anonymous>)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:947:10)

```


## エラー詳細
エラーにあるリンクを見に行きます。
https://github.com/sass/node-sass/releases/tag/v4.11.0

サポート環境（Supported Environments)を見ると以下みたいでした。

| OS | Architecture | Node |
|:--|:--|:--|
| Windows | x86 & x64 | 0.10, 0.12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 |
| OSX | x64 | 0.10, 0.12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 |
| Linux* | x86 & x64 | 0.10, 0.12, 1, 2, 3, 4, 5, 6, 7, 8**, 9**, 10**^, 11** |
| Alpine Linux | x64 | 6, 8, 10, 11 |

自端末に入っているNodeのバージョンが12でpackage.jsonにかかれている`node-sass`のバージョンでは未対応のためエラーになってたことが分かりました。

```shell
$ node --version
v12.10.0
```

## 解決方法
 1. package.jsonにある`node-sass`のバージョンを新しくする<br>
 １番まっとうな解決策かなと思います。<br>
`node-sass`の4.12.0バージョンではNodeのバージョン12に対応しているのでpackage.jsonにある`node-sass`のバージョンを新しくすると良いです。<br>
 https://github.com/sass/node-sass/releases/tag/v4.12.0
 2. Nodeのバージョンを11以下にする<br>
 なにか特別な事情がある場合のみ。
ENV[HOGEHOGE]でenvファイルの環境変数にアクセスできない！

#結論
springを再起動したら通りました。

```
$spring stop
```

springについては以下を参考。
https://ruby-rails.hatenadiary.com/entry/20141026/1414289421

超ざっくり説明すると、毎回全システム起動してたら時間かかるからよく使うやつロードしたままにするね！みたいな感じ

#経緯
外部APIのtokenを隠しておこうと、dotenv-railsを導入。
.envファイルを作成して環境変数を定義。
いざENV[HOGEHOGE]で値を取りに行くとnilが帰ってきてしまった。
変数名、定義法もあっていたのでもしやと思いつつspringを止めてみると案の定でした。
環境変数の読み込みもspringでストックさるんですね。めでたしめでたし。
awaitできるsetTimeoutを1行で書く方法

`await`することができる`setTimeout`を1行で書くイディオムです。

```typescript
await new Promise(resolve => setTimeout(resolve, 3000)) // 3秒待つ

// ... 3秒後の処理 ...
```

## Node.jsならもっと短く書ける

Node.jsでは`await`に対応した`setTimeout`がモジュールとして提供されているので、さらにシンプルに書けます。

```typescript
import { setTimeout } from "node:timers/promises";

await setTimeout(3000); // 3秒待つ
```

- Node.js互換のBunやDenoでもこの書き方が使えます。
- ブラウザでは動作しないので注意です。

## Bunならもっと宣言的

Bunなら`import`なしに`Bun.sleep`関数を呼び出すだけです。また、関数名も`sleep`となり、より宣言的です。

```typescript
await Bun.sleep(3000); // 3秒待つ
```

Bun専用になっちゃいますので、そこは注意点です。

## おまけ: よくある長めの実装からの変形手順

```typescript
// よくある長めの実装
const sleep = () => new Promise(resolve => {
  setTimeout(() => {
    resolve()
  }, 3000)
})
await sleep()

// ステップ1: () => { resolve() } は resolve に短縮する
const sleep = () => new Promise(resolve => {
  setTimeout(resolve, 3000)
})
await sleep()

// ステップ2: resolve => {} は resolve => に短縮する
const sleep = () => new Promise(resolve => setTimeout(resolve, 3000))
const promise = sleep()
await promise

// ステップ3: sleep()は関数でなくていいので値にする
const promise = new Promise(resolve => setTimeout(resolve, 3000))
await promise

// ステップ4: 完成
await new Promise(resolve => setTimeout(resolve, 3000))
```
NativeScriptを用いたVue.jsモバイルアプリ開発の環境構築

## 概要

NativeScriptを用いてVue.jsモバイルアプリを作る際の環境構築の手順をまとめました．

- NativeScript・・・本物のモバイルネイティブアプリをJavaScriptで開発するためのオープンソースフレームワーク
- NativeScript-Vue・・・Vue.jsを使ってモバイルアプリを作成するためのNativeScriptのプラグイン

## 環境

- Mac OS X 10.14.6
- Node.js v12.12.0
- NativeScript 6.1.2
- NativeScript-Vue 2.4.0

## 手順

### NativeScriptのシステム要件のセットアップする

下記ページに従い，macOSでNativeScriptアプリをビルドして実行するために必要なすべてのシステム要件をセットアップします．
最後の手順で`tns doctor`コマンドを実行して問題が検出されなければ次のページに進む前に本記事に戻り，次の手順に進んでください．

[NativeScript Advanced Setup — macOS - Native
Script Docs](https://docs.nativescript.org/start/ns-setup-os-x)

「結局英語で書かれた公式ドキュメントかよ，読むの面倒だからQiita記事探してるんだよ」と思った方もいるかもしれません．しかし私の経験上，今回のような導入手順や環境構築に関しては最初から公式サイトを読みにいくのが最も時間を無駄にせずに済みます．

また，Androidエミュレータ（AVD）のセットアップ手順において，いくつか選択肢が示されていますが，もしAndroid Studioを使う場合は，以下の手順で日本語化できます．

[MacでAndroid Studioを日本語化する - ソフラボの技術ブログ](http://shinsuke789.hatenablog.jp/entry/2018/08/27/130714)

### NativeScript-Vueをインストールし開発を開始する

下記ページに従い，NativeScript-Vueのインストール，プロジェクト作成，ビルドを行います．幸いこちらは日本語ですね．

[クイックスタート - NativeScript-Vue](https://nativescript-vue.org/ja/docs/getting-started/quick-start/)

`tns run android --bundle`コマンドでAVDが立ち上がれば成功です．
ちなみにこれはPixel 2のAVDを使用した場合です．

<img width="429" alt="スクリーンショット 2019-10-22 15.41.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207053/1747cd39-d675-05f9-c2e3-0aee7909628b.png">

## 動作確認

app/components/App.vueに`msg: "Hello!"`と書かれた箇所があるので，それを編集してみてください．

![スクリーンショット 2019-10-28 10.20.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207053/8e4cbb24-afb1-e9af-8495-390185ad5168.png)

画面に表示されているメッセージが自動で変わると思います．以上で環境構築は終わりです．
Sharepointのワークフロー動作後に特定のURLへ移動させる

SharepointDesignerのユーザー設定のアクションで
「ワークフローの開始」の代わりに、「URLへ移動」を使う
<img width="410" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511848/ff5458ca-958d-38c9-342e-59e8fa1f73e8.png">

「URLへの移動」の記述例
/sites/example/_layouts/IniWrkflIP.aspx?List={ListId}&ID={ItemId}&TemplateID={templateID of workflow}&Source=url

* List={ListID}・・・リストのIDを入力
* ID={ItemId}・・・そのまま
* TemplateID={templateID of workflow}・・・ワークフロー実行時に確認できる
* * Source=url・・・移動するURLを入力

ワークフロー開始するとListIDやTemplateIDを確認できる
<img width="649" alt="workflow.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511848/7070b7b7-74d4-5e5f-7da0-b179def9e6c1.jpeg">
Perlのワンライナーで税込価格8%をまとめて税込価格10%に変更

#税込価格、税抜価格が大量に併記されたWebサイトの、税込価格を消費税増税に伴い税率を8％から10%に一括で修正した時のメモ。
```
<td>¥税込価格</td>
<td>(¥税抜価格)</td>
<td>¥税込価格</td>
<td>(¥税抜価格)</td>
<td>¥税込価格</td>
<td>(¥税抜価格)</td>
<td>¥税込価格</td>
<td>(¥税抜価格)</td>
<td>¥税込価格</td>
<td>(¥税抜価格)</td>

の形でズラッと並ぶ。

```

##perlのワンライナー
税込価格を10%にするには、8%の税込価格を一旦税抜価格に直して（税込価格÷ 1.08）、それを税率10%（税抜価格x1.1）に直せばいい。
**（税率8%の税込価格 ÷ 1.08) x 1.1 = 税率10%の税込価格**


```
cat hoge.html | perl -pe ‘s/(?<!(?:\x28))([0-9]{1,3}),([0-9]{3})(?!(?:\x29))/(($1 . $2)\/1.08)*1.1/eg’ > replaced.html
```


##以下解説
###正規表現で税込価格のみ抽出
####```(?<!(?:\x28))([0-9]{1,3}),([0-9]{3})(?!(?:\x29))```の解説
`(?<! )` 　キャプチャしたい対象の数値の**直前**に任意の文字が**ない**
`(?: )`　カッコの中の文字はキャプチャしない
`\x28`　前カッコ
`(?<!(?:\x28))`の意味は、キャプチャしたい数字の直前に、前カッコ「(」がない場合のみキャプチャする。 

`(?! )`　キャプチャしたい対象の数値の**直後**に任意の文字が**ない**
`\x29`　後ろカッコ
`(?!(?:\x29))` の意味は、キャプチャしたい数字の直後に、後ろカッコ「)」がない場合のみキャプチャする。
これで前後にカッコを含まない数値だけキャプチャされる = （）内の税抜価格は無視され、税込価格のみ抽出される。

`([0-9]{1,3})` 1〜3桁の数値
`([0-9]{3})` 3桁の数値
`([0-9]{1,3}),([0-9]{3})` は0,000~999,999 のいずれかの数値


###抽出した税込価格を一旦税抜価格に直す
####`($1 . $2)\/1.08`の解説
`$1`　カンマの前の1〜3ケタ
`$2`　カンマの後の2ケタ
`($1 . $2)` 結合した数値
`\/`　÷
`($1 . $2)\/1.08` は税込価格を1.08で割った数値＝税抜価格


`(($1 . $2)\/1.08)*1.1`
税込価格を1.08で割った数値に1.1をかける
すると税込価格が8%から10%に変わる！




##このままだと¥00,000のカンマが消えてしまうので、正規表現の検索置換でカンマを追加
coteditorなどの正規表現で検索置換ができるエディターで、htmlファイルを編集
`(?<=(?:\¥))([0-9]{1,3})([0-9]{3})`を`$1,$2`で検索置換すると、先頭に¥を含む数字4〜6桁の数字3桁目にカンマを追加

`(?<= )` キャプチャしたい数値の**直前**に任意の文字が**ある**
`(?: )` カッコの中の文字はキャプチャしない
`\¥` ¥
これで先頭に¥を**伴わない**、4桁〜6桁の数字列は排除される。
これをやらないと、価格ではない型番の数字の列なども検索置換されてしまいます。

`([0-9]{1,3})` 1〜3桁の数値
`([0-9]{3})` 3桁の数値
`$1`=`([0-9]{1,3})`
`$2`=`([0-9]{3})`
`$1,$2`で`000,000`の形式になる


以上です。



計算のやり方はこちらの記事から引用し、やりたかったことに合わせて自分なりにアレンジさせていただいたものです。
perlワンライナーでの計算自体の解説はこちらから。
[数値計算を含む置換をperlのワンライナーでやってみた]
(https://qiita.com/ryooku/items/cbb00897f9d2b0ac5c80)
エンジニアがWordPressでWebサイト作ってみる

# はじめに
Webデザインの知識はからっきしなエンジニアだけど知り合いに飲食店のHP作成を頼まれたからWordPressで作ってみる。

# 準備
## どのように習熟していけば良いかを知る
以下のサイトを参考にした。
[WordPress未経験から1ヶ月でテーマを作成するまでの学習法](https://shimotsu.me/web-design/wordpress/wordpress-inexperience/)

## dockerでwordpressとMySQLコンテナをインストール
以下のQiitaを参考にした。
[docker-composeでwordpress環境をサクッと構築する](https://qiita.com/mom0tomo/items/7e611ac829863d4c5c82)

## wordpressに入門する
以下のサイトを参考にした。
[WordPress入門](https://dotinstall.com/lessons/basic_wordpress)
ドットインストールという動画でプログラミングを学べるサイト。dockerを使っていれば「#02 WordPressをインストールしよう」のDB作成などはスキップできる。docker最高。

### 動画で参考になった情報
- resestCSS
    - ブラウザ間の表示差異をなくしてくれるcss
    - [2019年版！おすすめのリセットCSSまとめ](https://webdesign-trends.net/entry/8137)


## WEBサイト制作
別ページに今度まとめます。
⇒（追記）まとめるほどではなかったので作りませんでした。

## ローカルから本番サーバへ移行
ローカルWordPressで作成して本番サーバに移行予定。
以下が参考になりそう？

- [バックアップやサイト移管に最適！All-in-One WP migrationの使い方](https://restinpeace.jp/allinone-wp-migration/)
    - 移行ツールを使って移行
- [【完全解説】wordpressをローカル環境から本番環境に移行する方法](https://mayubou.net/local-server-wordpress/)
    - 移行ツールが無理そうだったら手動で移行
- [Dockerコンテナを移行してみる【成功編】](https://qiita.com/Osbrewery/items/57feacd9d1f84f8813aa)
    - コンテナ移行で済んだら一番楽だけど開発環境Windowsだし本番サーバがどうなってるか全くわからないから無理かな。。
よく使うadbコマンドメモ

# はじめに
タイトル通り、私がよく使うadbコマンドをメモしておきます。

# 使用ツール

- コマンドプロンプトまたはAndroid Studio
- お好きなAndroid端末
- Android端末とPCをつなぐケーブル

# よく使うadbコマンド
PCとAndroid端末をケーブルでつないで、
コマンドプロンプトまたはAndroid Studioで実行してみましょう。
Android Studioは下方でBuildとかLogcatが表示されるところにTerminalタブがあり、
そこで実行できます。
## adbから画面の設定を出す

```
adb shell am start -a android.settings.DISPLAY_SETTINGS
```

## adbからホーム画面呼び出し

```
adb shell input keyevent KEYCODE_HOME
```

## アプリのパスを探す

```
adb shell pm list packages -f | findstr アプリに含まれる文字列
```

## アプリのアンインストール

```
adb uninstall アプリのパス
```

## PCとAndroid端末間のファイルのやり取り
### Android→PCへファイルを送る
```
adb pull /sdcard/Download/ファイル名.txt .\
```

### PC→Androidへファイルを送る

```
adb push ファイル名.txt /sdcard/Download/
```

## logcatをPCに保存する
logcatを保存するファイル名の拡張子は.txtとか好きなのでよいみたいです。

```
adb logcat > ファイル名.log
```

# 参考サイト
[ADB Shellコマンドを使って、特殊キーイベントを発火させる方法](https://tips.priart.net/186/)
RubyのCSV.tableはヘッダーを小文字に変換するので注意

注意というか自分が多少ハマったのでメモしておきます。

次のようなカラムのテーブルデータのcsvを読み込もうとして、 `CSV.table` を使って読み込もうとしました。

```csv
CampaignId,CampaignName
1000,example1
1001,example2
```

すると以下のように自動で小文字に変換されてしまっていました。これによって一部のキャンペーン情報が読み取れずにエラーが発生してしまっていました。

```ruby
require 'csv'

table = CSV.table("report.csv")
p row[0][:CampaignId]
# => nil

p row[0][:campaignid]
# => 1000
```

実際に[ドキュメントを読む](https://docs.ruby-lang.org/ja/latest/class/CSV.html)と、 `header_converters: :symbol`が設定されており、

```ruby
CSV.read( path, { headers:           true,
                  converters:        :numeric,
                  header_converters: :symbol }.merge(options) )
```

[HeaderConvertsの挙動は以下のようなもの](https://docs.ruby-lang.org/ja/latest/method/CSV/c/HeaderConverters.html)らしいです。


> ヘッダの文字列を小文字に変換してから、空白文字列 (\s) をアンダースコアに 置換し、非英数字 (\W) を削除します。最後に String#to_sym を呼び出します。