OmniAICreator/Qiita-1.07M huggingface dataset:
[自分用メモ]gameObjectとGameObject、thisについて

#自分用メモ

・gameObjectの場合
　このスクリプトがアタッチされているゲームオブジェクトを参照する

・GameObjectの場合
　GameObjectという型宣言？になるため、アタッチされているゲームオブジェクトは参照しない

・this
　スクリプトのインスタンスを指している
ゲームオブジェクトにアタッチされている自分自身のスクリプトのクラスを見ていることになる
インスタンスを指しているので、静的(static)なものには使用できない

・this.gameObject
　このスクリプトがアタッチされているゲームオブジェクトを参照する
「gameObject」と同じ

・this.Getcomponent< Transform >()

　このスクリプトこのインスタンス化された自分自身のクラスを参照しているけど
MonoBehaviourを継承している場合はGetComponentを使用できる

ゲームオブジェクトにコンポーネントされているtransformなどを取得する場合は
this.gameObject.Getcomponent< Transform >();
として使用する必要がある

this.GetComponent< Transform >();
とすると、MonoBehaviourを継承している場合は使用できるが
MonoBehaviourを継承していない場合は、
this（このクラス）が継承しているMonoBehaviourのGetComponentを参照しようとするので
エラーになる

参考にしたサイト
https://qiita.com/megane42/items/9709d696e8f2561dbb1d
http://pafu-of-duck.hatenablog.com/entry/2017/05/17/213751
ツイートから感情分析をしてSpotifyから感情にあった楽曲を選曲する

この記事は個人開発 Advent Calendar 2018の9日目です。

タイトルのとおりなのですが、Twitterのツイートから感情を分析してSpotifyからその感情に合った楽曲を選曲してみる仕組みを作ってみました。

##使い方
[このアカウント](https://twitter.com/AnalyzeTone)に対して@をつけてメンションを送ると、楽曲名とSpotifyのトラックリンクを付けてリプライを飛ばします。

*更新間隔が10分なので少し時間がかかります。
*現在日本語と英語のツイートのみ対応しています。

例えば以下のテキストを送ってみると

```
I hate these new features On #ThisPhone after the update.
I hate #ThisPhoneCompany products, you'd have to torture me to get me to use #ThisPhone.
The emojis in #ThisPhone are stupid.
#ThisPhone is a useless, stupid waste of money.
```

こんな感じでリプライが送られてきます。
![e110ccff6ceba650b1c71eaea0d5d5d8.png](https://qiita-image-store.s3.amazonaws.com/0/100132/157c0ac4-2ed2-3c1a-7c8f-10fe8d2171bc.png)


##構成
###IBM Watson Tone Analyzer
感情分析にWatson Tone Analyzerを使用しました。
今回は怒り、不安、喜び、悲しみの４つの感情分析のスコアに対して選曲を行うようにしました。

またAPIドキュメントが日本語版が古く更新されていないため、Tone Analyzerで開発をする場合は英語版のドキュメントを参照したほうが良いかもしれません。

###Spotify API
Tone Analyzerで出力されたスコアに対して選曲を行うために使用しました。
"Get Recommendations Based on Seeds"というAPIからトラックの様々な属性(楽曲のジャンル、テンポ、曲の明るさ、メジャー・マイナー等)を指定して出力することができるので、この属性を感情に当てはめて選曲を行いました。
https://developer.spotify.com/documentation/web-api/reference/browse/get-recommendations/

###Twitter API
Spotify APIから選曲した内容をツイートをするために使用しました。
[メンションを取得するAPI](https://syncer.jp/Web/API/Twitter/REST_API/GET/statuses/mentions_timeline/)と[ツイートの投稿を行うAPI](https://syncer.jp/Web/API/Twitter/REST_API/POST/statuses/update/)を使用しています。

###Wordpress
ロジック部分は私が普段使い慣れているWordpress(4.9.8)を使用しました。

###Google Apps Script
IBM Tone Analyzerが英語しか対応していないため、日本語のツイートを翻訳するAPIをGoogle Apps Scriptで作り、英語化してから感情分析をするようにしました。
Cloud Translation APIは有料なので、無料で使えるこの方法でやってみました。

以下の記事を参考にしました。
https://qiita.com/tanabee/items/c79c5c28ba0537112922

###000Webhost
https://www.000webhost.com/
ホスティングサービスに無料で使える000Webhostというのを使いました。
Wordpressも000Webhostの管理画面上でできるので、煩わしい操作も必要ありませんでした。
また、cronジョブも無料ユーザーは1個であれば使えるため、今回Twitterのメンションのチェックをこれでやりました。

##今後の改善点
一番の改善点はその楽曲が本当にその感情を表すのに最適なのか、という点です。
Tone Analyzerから取得できる感情のスコアの内、喜びが80％の曲と喜びが50%の曲でどのように違いをつけるのかといったことや、怒りの感情が強く出ている場合はメタルをジャンルとして出すという形にしているのですが、そもそもメタルが怒りの感情を表すジャンルなのか、等です。

また、同じツイートでもSpotify APIから返ってくる楽曲の結果がバラバラであったり(仕様？)ということもあり、その点もどのように最適化すべきかということが今後の課題です。
[1行で環境構築] LEMP環境を作る

# 夢よふたたび、環境構築
環境構築は難しい。特にサーバ環境の構築は次々と新しいソフトが出てきて難しくなる一方です。
もはや初心者が容易に環境が作れる時代は遠く過ぎてしまいましたが、もしコマンド１行実行するだけで環境が出来てしまえば、初心者でもまた新たな夢がみられ、輝かしい未来が開けてくるのではないでしょうか？

コマンド1行を実行するだけで環境構築ができるか？


構成管理ツールのAnsibleをリモートではなく自分自身に対して実行すれば**スタンドアロン**で環境が作れてしまうのではないかと思いトライしてみました。

# 目標はLEMP環境
環境構築の題材としてLEMP環境を選びました。WebサーバがApache(A)ではなくてNginx(E)の方です。
LAMPは関連ソフトも少なく手作業で出来てしまうので、関連ソフトが多くより難易度の高いLEMP環境を作ります。

# スタンドアロン起動

他のマシンを必要としないスタンドアロン型の環境構築を行うので、SSH接続やら面倒な設定は必要ありません。
必要なのはサーバにrootログインできることだけです。

# いざ実行せん
対応はいまのところCentOS7のみ対応しています。
新しくOSがインストールされたサーバを入手したら、rootでログイン。
そして以下のコマンドをコピペで実行、３分間待つ。やることはこれだけです。

```
$ curl https://raw.githubusercontent.com/czbone/oneliner-env/master/script/build_lemp.sh | sh
```

無事作業が完了したら、一旦サーバを再起動します。

# 応用編
基本的な仕組みはシェルスクリプトでAnsibleを動かしているだけです。
これからの応用としては、

- 各ソフトウェアの設定を可変にして動的に外部からパラメータを取り込む
- このレポジトリをフォークしてオリジナルのサーバ環境に変更する

ようなこともできますね。

# プロジェクトはここに
新たな環境も追加していく予定です。

https://github.com/czbone/oneliner-env
Unityで ログごとにスタックトレースの有無を切り替える

この記事は [Unity #2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/unity2) 9日目の記事です。

# ログごとにスタックトレースの有無を切り替える
Unityに限らずバグ調査でスタックトレースは大変重宝しますが、 `UnityEngine.Debug` クラスが出力するスタックトレースは冗長です。そのため logcat 等では実機ログがものすごい速度で流れてしまい……。
ログによってはスタックトレースは不要なので、切り替えられるようにします。

## Application.SetStackTraceLogType
[UnityEngine.Application.SetStackTraceLogType](https://docs.unity3d.com/ja/current/ScriptReference/Application.SetStackTraceLogType.html) 関数で、以降のログ出力のスタックトレース情報を変更することができます。

## サンプルコード

```csharp:Debug.cs
public static class Debug
{
    public static void LogError(object message, UnityEngine.StackTraceLogType stackTraceType = UnityEngine.StackTraceLogType.ScriptOnly)
    {
        LogInternal(UnityEngine.LogType.Error, message, stackTraceType);
    }

    public static void LogWarning(object message, UnityEngine.StackTraceLogType stackTraceType = UnityEngine.StackTraceLogType.ScriptOnly)
    {
        LogInternal(UnityEngine.LogType.Warning, message, stackTraceType);
    }

    public static void Log(object message, UnityEngine.StackTraceLogType stackTraceType = UnityEngine.StackTraceLogType.ScriptOnly)
    {
        LogInternal(UnityEngine.LogType.Log, message, stackTraceType);
    }

    private static void LogInternal(UnityEngine.LogType logType, object message, UnityEngine.StackTraceLogType stackTraceType)
    {
        var currentStackTraceType = UnityEngine.Application.GetStackTraceLogType(logType);
        if (currentStackTraceType != stackTraceType)
        {
            UnityEngine.Application.SetStackTraceLogType(logType, stackTraceType);
        }

        switch (logType)
        {
            case UnityEngine.LogType.Error:
                UnityEngine.Debug.LogError(message);
                break;

            case UnityEngine.LogType.Warning:
                UnityEngine.Debug.LogWarning(message);
                break;

            case UnityEngine.LogType.Log:
                UnityEngine.Debug.Log(message);
                break;
        }

        if (currentStackTraceType != stackTraceType)
        {
            UnityEngine.Application.SetStackTraceLogType(logType, currentStackTraceType);
        }
    }
}
```

```csharp:Main.cs
using UnityEngine;

public class Main : MonoBehaviour
{
    void Start()
    {
        Debug.Log("スタックトレースあり");
        Debug.Log("スタックトレースなし", StackTraceLogType.None);
    }
}
```

### 実行結果
`StackTraceLogType.None` を指定した方は、スタックトレースがないことが確認できます。
<img width="361" alt="ログごとにスタックトレースの有無を切り替える スクリーンショット" src="https://qiita-image-store.s3.amazonaws.com/0/60718/f8f8024e-37e2-b306-4036-96c0321ee2c4.png">
<img width="328" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/60718/32b750fd-66c8-02b8-cd5f-0a568de191ba.png">
blenderから吐いたファイルでusdzファイルを作る

# Blender

Export > WaveFront(obj)
でobjファイルを吐く

# CLI


```
xcrun usdz_converter input.obj output.usdz
```

でusdzへ変換できる

テクスチャも貼る場合は

```
xcrun usdz_converter input.obj output.usdz -color_map texture.png
```
vimrcの設定

備忘録的に

```
set number                                                                                                                         
syntax on
set tabstop=4
set expandtab
set smartindent
set ruler
set virtualedit=onemore "カーソルを行末の一つ先まで移動可能にする
set autoindent "自動インデント
" 行を強調表示
set cursorline
 
" 列を強調表示
set cursorcolumn
~                
```
GitHub + Code Climate で Pull request の度に保守性を自動チェックする

この記事は、 [OIT Advent Calendar 2018](http://adventar.org/calendars/2962)の9日目の記事です。

# はじめに

[Quality by Code Climate](https://codeclimate.com/quality/) を [GitHub](https://github.com/) と連携させることで、ソースコードの保守性やテストカバレッジを自動コードレビューでチェックすることができます。また、 [GitHub](https://github.com/) 上の Public repository であれば無料で利用できます。
今回は、保守性を自動チェックする方法を紹介します。

# Code Climate の設定

1. [Quality by Code Climate](https://codeclimate.com/quality/) にアクセス
2. Login を選択
3. Open source を選択
4. Add a repository を選択
5. 任意の repository で Add Repo を選択
6. Repo Settings を選択
7. GitHub を選択 (下図参照)
    1. Summary comments を ON に設定
    2. Inline issue comments を ON に設定 
    3. Save を選択
    4. Edit を選択
    5. Active? を ON に設定
    6. Save を選択
    7. Install を選択

これで準備 OK です。

![Code Climate](https://qiita-image-store.s3.amazonaws.com/0/40619/7a155efe-fdf8-8e1e-63a6-e153f2be415e.png)

# 保守性 (maintainability) を自動チェック

GitHub で master ブランチ宛に Pull request を送信するだけで、自動コードレビューが実行されます。
数秒後、 Pull request に Code Climate からコメントが届きます。 (下図参照)

![Pull request](https://qiita-image-store.s3.amazonaws.com/0/40619/66c26741-2f0e-a4a2-6828-0b04cbedb38a.png)

# repository のレーティングを表示

repository の保守性 (Maintainability) は A 〜 F の 6 段階でレーティングされます。 Repo Settings の Badges で Maintainability Badge の画像 URL を取得し、 README.md などに貼り付けてレーティングを表示できます。

表示例) [![Maintainability](https://api.codeclimate.com/v1/badges/fa464814de8f55e9a62a/maintainability)](https://codeclimate.com/github/mizo0203/nature-remo-sample/maintainability)

# さいごに

[Quality by Code Climate](https://codeclimate.com/quality/) との連携でソースコードの保守性を簡単にチェックすることができます。リファクタリングによってレーティングが上がるとモチベーションも上がるのでおすすめです。
素敵なコーディングライフを送ってください。
未成熟な開発組織の開発/進捗/課題管理ツールを変更する(その2 導入途中)

# 2週間ほど経って...
結論、あんまり使われてない。。。
と、言うのもプロジェクトも佳境となり皆忙しい＆カード化するようなタスクも無くなってきたためである。

# どういう機能が欲しい？
これを上司に聞いた。
主に以下

- ガントチャート
- プルリクの進行状況とカードをリンクさせて欲しい

ガントチャートはeleganttで賄えるものの、メンバーごとにグルーピングできないのがちょっと不便。
ラベルをメンバーの名前にするなどしてグルーピングすればなんとかなるけど、それじゃあなあといった感じ。
PRとカードの進捗をリンクさせるのは、trelloのPower-Upsと[これ](https://github.com/mzp/prpr-trello)を使えばなんとかなりそう。

# 今後
ひとまずこれらを導入＆運用ルールを策定する。
続きは年内に書きます。
侍エンジニアを受講してからウェブカツを選択するまで

はじめまして、タクと申します。
30歳、中小企業で営業を担当しております。

わたしがプログラミングを志した理由は、単純に今より豊かな暮らしがしたかったからです。私は幸いにして現状の仕事には不満をもっていないのであくまで副業で稼げる仕事を探していたところ「プログラミングってなんか稼げそうだな」という安易な思いからプログラミングを勉強することにしました。

勉強するといってもパソコンの知識など皆無だったので「独学は厳しい、どこかスクールに入ろう」と思い、いつかのプログラミングスクールを候補にあげました。

結論として侍エンジニア塾に入りました。
理由は対面の面談があって安心したから。
ほかのスクールはオンラインの面談が主でした。
３か月コースか６か月コースか迷ったのですがほとんどの人が６か月コースだということと、６か月やれば絶対稼げるとの思いから６か月コースを選択しました。
60万以上なので今思うとかなりの痛い出費です…。

侍エンジニアは週一回のレッスンで、私のメンターは一からプログラミングを教えるというよりかはクラウドソーシングの稼ぎ方を教えてくれる人でした。
とはいってもはじめはなんのスキルもないので、「できるやつ（仕事）を探してください」と言われるのですが、スキル不要のアンケートや商品登録が主となります。
「正直この仕事ならスクールに通わなくてもできるのに」という思いがありましたが、はじめは誰しもこういう仕事からやるんだろうと思い、必死に取り組みました。

その結果、クラウドソーシングで安い案件をこなすスキルだけが残りました。

侍エンジニア塾の反省から、一括で入金するのではなく、月単位で自分と合わないと思ったらすぐ辞められるスクールを探していたところ、SNSでウェブカツを発見。

動画形式の学習はドットインストールでやりやすさを感じていたので期待が高かったです。

正直コードの見にくさは多少ありますが、その分何度も何度も確認して見たので知識の定着はありました。

まだ一か月しかウェブカツを体験していませんが私はこれに賭けてみたいと思います。
一か月ごとにウェブカツのメリットデメリットを発信しますので期待していてください。

ひとつだけ確かなことはすぐに辞められるサービスを選ぶことが大前提ということですね。
シクシク素数列 (Kuin)


|シクシク素数列|https://qiita.com/advent-calendar/2018/4949prime-series|
|:--|:--|
|Crystal|https://qiita.com/cielavenir/items/4c95fdf14b7a247e51e0|
|Kuin|https://qiita.com/cielavenir/items/60993a2b2885690a3a4a|
|Swift|https://qiita.com/cielavenir/items/db4c93532a53bfa33ac2|
|Kotlin|https://qiita.com/cielavenir/items/f3ccdd5ebf245aba417c|
|Pascal|https://qiita.com/cielavenir/items/4c962db6825d9a5eb511|

```kn:4949.kn
func isqrt(n: int): int
	if(n <= 0)
		ret 0
	end if
	if(n < 4)
		ret 1
	end if
	var x: int :: 0
	var y: int :: n
	while(x <> y & x + 1 <> y)
		do x :: y
		do y :: (n / y + y) / 2
	end while
	ret x
end func

func isPrime(i: int): bool
	if(i < 2)
		ret false
	end if
	for j(2, @isqrt(i))
		if(i % j < 1)
			ret false
		end if
	end for
	ret true
end func

func is4949(i: int): bool
	if(i <= 0)
		ret false
	end if
	if(i % 10 = 4 | i % 10 = 9)
		ret true
	end if
	ret @is4949(i / 10)
end func

func main()
	var n: int :: 0
	var _: bool
	do n :: cui@input().toInt(&_)
	var i: int :: 2
	var cnt: int :: 0
	while(cnt < n)
		if(@is4949(i) & @isPrime(i))
			do cui@print(i.toStr())
			if(cnt < n - 1)
				do cui@print(",")
			else
				do cui@print("\n")
			end if
			do cnt :: cnt + 1
		end if
		do i :: i + 1
	end while
end func
```
ReactNativeで半透過なViewをつくる



<img src='https://qiita-image-store.s3.amazonaws.com/0/2164/98af5d42-3a9f-2fc6-eb78-eb2f1537f346.jpeg' width=300px>


opacityをいじっていてよくあるやつ。モーダル画面をつくる時、親要素でオーバーレイ用の半透明なViewを作り、その子要素にモーダルの内容出したい時なんかあると思う。そういう場合、親要素にopacityを設定したら、それが子要素にもそのまま適用されて子要素もスケスケになってしまう（画像の上半分）。これは困る。


# 解決法
`rgba`を使う。画像の再現ソースは以下のような感じ。半透明にしたいんだからopacityつかうだろ！！と思うと、こういうケースではうまくいかないみたい。

```jsx

const styles = StyleSheet.create({
  container: {
    flex: 1
  },
  overlay: {
    flex: 1
  },
  inside: {
    margin: 50,
    padding: 50,
    backgroundColor: 'white'
  }
})


<View style={styles.container}>
  <View style={[styles.overlay, { opacity: 0.3, backgroundColor: 'black' }]}>
    <View style={styles.inside}>
      <Text>これはやだ！！</Text>
    </View>
  </View>
  <View style={[styles.overlay, { backgroundColor: 'rgba(0,0,0,0.3)' }]}>
    <View style={styles.inside}>
      <Text>こうがいい！！</Text>
    </View>
  </View>
</View>
```
[cocoa][swift]Think AppleScript 2018.9 に参加してきた

<p>このイベントは、Cocoa.swiftで何度か発表して盛り上げていただいた ぴよまるソフトウェア（AppleScriptの穴） さんのイベントということもありますし、ぴよまるソフトウェア（AppleScriptの穴） さんは、任意団体MOSAの準備チームに参加していただいているのもありますし、任意団体MOSAのイベントということもあり参加してきました。</p>

<p>また、自分自身もAppleScript自体にも興味がありますが、どんな方々がどんな話題で盛り上がっているのかも、気になっていました。</p>

<p>ただ、イベントの内容は、その場で、各人が事例を紹介するなどの形式のため、申し訳ございませんが、上手くメモれていません。申し込みページの内容をそのまま掲載となってしまいました。</p>

# Think AppleScript 2018.9
<p>AppleScriptについて語ろう！　最新情報紹介や自慢・質問なんでも！</p>

# MOSA＋Piyomaru Software共催

# AppleScriptイベント「Think AppleScript」
<ul>
<li>開催日：2018年９月26日（水）　19:00〜21:30</li>
<li>開催場所：池袋Open Office FOREST<br />東京都豊島区東池袋3-7-9 AS ONE 東池袋ビル3階</li>
<li>会場費：1,000円（3F受付で「ナイトドロップイン」料金1,000円をお支払いください）</li>
</ul>
<p>AppleScriptについてのイベントです。情報共有、質疑応答などを目的とします</p>
<ul>
<li>AppleScriptの歴史と位置づけ、拡大する利用範囲についてのご紹介</li>
<li>海外の動向などのご紹介</li>
<li>事例紹介など</li>
<li>来場者からの質問をみんなで考える「Q&A」</li>
<li>AppleScriptに関するものであれば、著作、Blog、製品、導入事例などどんどん紹介してください！　大歓迎です！ →　ただし、出席者からの内容についての質問は可能なかぎりお答えください</li>
</ul>

# Piyomaru Software Blog「AppleScriptの穴」
<ul>
<li>http://piyocast.com/as/</li>
</ul>

【関連情報】
<a href="https://qiita.com/advent-calendar/2018/cocoa">Cocoa Advent Calendar 2018</a><br />
<a href="https://ashole.connpass.com/event/100082/">Think AppleScript 2018.9</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
GAS Spreadsheetの getRange(row, column, numRows, numColumns)を勘違いしていた

# きっかけ

GASでスプレッドシートを扱うときに `getRange` をよく使います。

普段は、

```js:
const sheet = SpreadsheetApp.getActiveSheet();
const data  = sheet.getDataRange().getValues();
```

のように書いて、シート全部のデータを取っちゃいますが、今回範囲を指定して値を取得するケースがありました。

こんなときは `getRange(row, column, numRows, numColumns)` ですね。

公式リファレンスはこちら↓
[Class Sheet  \|  Apps Script  \|  Google Developers](https://developers.google.com/apps-script/reference/spreadsheet/sheet#getrangerow-column-numrows-numcolumns)


# 勘違いしてた内容

ちゃんとリファレンスを読んでなかった私は、例えば　`A2:C4` を指定する際に

```
A2 → 2行目1列目
C4 → 4行目3列目
```

て思って、

```js:
const data = sheet.getRange(2, 1, 4, 3)
```

と書いてしまいました。

実際のシートでいうと、

![sheet.png](https://qiita-image-store.s3.amazonaws.com/0/8612/91c42fb8-8a35-90c4-d70e-e30d8c20de64.png)

のシートに対して、

```js
function myFunction() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const range = sheet.getRange(2, 1, 4, 3);
  const values = range.getValues();
  Logger.log(values);
}
```

```:実行結果
[[A2, B2, C2], [A3, B3, C3], [A4, B4, C4], [, , ]]
```

(゜A゜ノ)ノ え？


# リファレンスをよく読んだよ

`getRange(row, column, numRows, numColumns)` の項には

>Returns the range with the top left cell at the given coordinates with the given number of rows and columns.

って書いてあります。

英語苦手だけど、

『与えられた `the top left cell` ～ `the given number of rows and columns` の範囲を返すよ』

的なことが書かれてる。

さらに

**Parameters**

| Name	       |       Type	 |    Description    |
|:-----------------|------------------|------------------|
| row	|              Integer	|        The starting row of the range.|
|column	|Integer	|The starting column of the range.|
|numRows	|Integer	|The number of rows to return.|
|numColumns		|Integer|The number of columns to return.|


って書いてあります。

`row` の `The starting row of the range.` は `開始行` かなと。
問題は `numRows` の `The number of rows to return.` で、直訳すれば「戻す行数」なのですが、 `The number of rows` ってことは **行の個数** ってことですね。

# 結論

```
getRange(row, column, numRows, numColumns)
```

は

```
getRange(開始行, 開始列, 何行選択するか, 何列選択するか)
```

ということなので、

```js
const range = sheet.getRange(2, 1, 4, 3);
```

って書くと


`2, 1 = 2行目1列目(つまりA2セル)` のセルを起点として `4, 3 = 4行 x 3列分`

ってことなので、下記の黄色い部分が取得される。

![sheet2.png](https://qiita-image-store.s3.amazonaws.com/0/8612/ad5f582a-4b70-5451-eff6-d2046d70d853.png)


`A2:C4` を指定したければ、


```js
const range = sheet.getRange(2, 1, 3, 3);
```

にする、と。

きっと他のサイトで解説してくれているところがありそうですが、自分の言葉で残しておきました
AWS Lambda が VB.NET をサポート

# はじめに
これは[Visual Basic Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vb)の9日目の記事となります。

「[AWS Lambda の Custom Runtimes を利用してVB.NETを実行してみる](https://dev.classmethod.jp/cloud/aws/lambda-custom-runtimes-vbdotnet/)」という記事を拝見しました。
これは紹介しておくべきでしょう。


# AWS Lambdaとは
AWSはAmazonのサーバーサービスで、LambdaはAWSでは「サーバレスコンピューティングとアプリケーション」で言われる機能です。
つまり、Lambdaはサーバレスを実現するためのサービスということ。

## サーバレスとは
では、サーバレスとはなんでしょう。

AWS上でWebアプリケーションを稼働させる場合、まずEC2インスタンスを立ち上げ、WindowsやLinuxの環境を構築した上でWebサーバーが必要となります。
さらに、動的なシステムにするとしたらC#やJavaなどのプログラムを実行するためのWebアプリケーションサーバーも構築する必要があります。
で、このWebアプリケーションサーバー上で動かすためのプログラムを開発するわけです。

ところがLambdaなら、Webサーバーもアプリケーションサーバーもなしでプログラムだけを開発すれば、その実行環境が用意されているから動かせるということです。
だからサーバーがいらない、サーバレスということなんですね。

## Custom Runtimesとは
AWS Lambdaで利用できる言語は、最近までは C#、Node.js(JavaScript)、Java、Python でした。

しかし、Amazon Web Servicesのラスベガスで行った年次イベント「AWS re:Invent 2018」(2018年11月25日〜11月30日)にて、自由にどんなプログラミング言語でも使える新機能「Custom Runtimes for Lambda」が発表されました。
先日(11/30)、COBOLがTwitterトレンド入りし話題に上がりましたが、これのことだったんですね。
[プログラミング言語「COBOL」がTwitterトレンド入り　AWS Lambdaのサポート言語に追加、技術者がざわつく](http://www.itmedia.co.jp/news/articles/1811/30/news102.html)

**そして、Custom Runtimes に VB.NET も無事に採用されたということです。**
.NET Core 2.0の環境であれば、VB.NETが動かせるのは自明の理ってやつですよ。

動作方法は下記の記事が参考になります。
「[AWS Lambda の Custom Runtimes を利用してVB.NETを実行してみる](https://dev.classmethod.jp/cloud/aws/lambda-custom-runtimes-vbdotnet/)」

# 最後に
昨年の「re:Invent2017」にてLambdaの.NET Core対応が発表されたのですが、この時の対応言語が C# のみだったんですね。
今回により、VB.NET、F# も可能となったわけです。もう見捨てないでね。
[*Docker*] Dockerを触り始めた

# 🐳 はじめに
[Docker Advent Calendar 2018](https://qiita.com/advent-calendar/2018/docker)の9日目です。

Dockerは気になってたもののなかなかやる時間が取れてなくて、やっとちょっと触ってみている途中です。
とはいえ思ったよりやる時間が取れなかったので現状やってみたとこまでのまとめです。

# 🐳 Dockerとは
Dockerとはコンテナ型のアプリケーション実行環境です。

普段私は`vagrant`を使うことがままありますが、
`vagrant`はVirtualBoxのVM作成などの操作が簡単にできるような形になっています。
少ないコマンドで任意のOSの環境が簡単に作れます。
これはこれで作った環境を他の人に渡すこともできるし便利ではあるのですが、
OS自体も入っているのでVMを作れば作るだけどんどん容量も圧迫していきますし、
環境配布時のイメージファイルもサイズが大きいです。

`Docker`はもっとプロセスの実行に特化しているイメージです。
nginxを動かしたいとか、PostgreSQLを動かしたいとか、そういう単位で実行イメージをコンテナ化している感じです。
なので起動とかも高速です。
`vagrant`だとVMを起動するまでちょっと時間がかかります。
OSを上げるのは１プロセスを実行することに比べたらどうしても時間がかかってしまいます。

...というような理屈は置いておいて、多くの人が使っているので私も使ってみたい！なんか便利らしい！
と思っているのが現状です。


# 🐳 やってみたこと
今の所やってみたことです。

## Udemy
[ゼロからはじめる Dockerによるアプリケーション実行環境構築](https://www.udemy.com/docker-k/)
Udemyの学習動画でセールをしていて1,400円で買えたので買って、動画を見ながらやってみました。
わかりやすくてよかったです。
最近Kubernetesという単語をよく聞きますが、この動画にはそれは出てこない感じです。
Udemyは常に閉店セールなのか？というくらいよくセールをやっている感じがします。
この記事を書いている間にセールが始まって今なら1,300円で買えるようなのでオススメです。

## 本
[Docker/Kubernetes実践コンテナ開発入門](https://www.amazon.co.jp/Docker-Kubernetes-%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E6%98%8E%E6%86%B2/dp/4297100339/ref=sr_1_1?ie=UTF8&qid=1544229014&sr=8-1&keywords=Docker)
まだほんとうの最初の方を読んでる途中なのでなんとも言えません。
`Kubernetes`というのをよくツイッター上などで見かけて気になるので勉強しようと思っています。

# 🐳 おわりに
Dockerは当たり前のようにみんな使っている感じになっているので、
みなさんのアドベントカレンダーの記事も読みつつ勉強していこうかなと思っています。
【もげぞうβ】trivial-gamekitを触ってみる

# PeerCast プログラミング配信 Advent Calendar 2018 12/9
えーっとですね、common lispでシンプルな2dゲーム作成できるらしい  
[trivial-gamekit](https://borodust.org/projects/trivial-gamekit) というものを触ってみました。  
[チュートリアル的なもの](https://borodust.github.io/projects/trivial-gamekit/getting-started/) をやってみたが、bind-cursor関数でエラー出て詰んだ。  

common lispでのゲーム作成には、xelfという物もあるらしいので次はそれのチュートリアルやってみたい。 おしまい
Raspberry Pi 3の電源ランプ、アクセスランプでLチカをする

この記事は [SLP KBIT Advent Calendar 2018](https://qiita.com/advent-calendar/2018/slp_kbit) の10日目の記事です。

# はじめに

ラズパイ3の基板上にあるLEDは、設定を変えるとGPIOと連動させることができるらしいので
それを使ってLチカをしたいと思います。
つまりLEDを買わなくてもできるLチカをします。

# 使ったもの

- Raspberry Pi 3 Model B

# LEDの設定を変更する

### 現在の設定を確認する

Raspberry Pi 3 の基板上にはLEDが2つ存在します。
それらが、どのような設定で動いているか確認します。

```
cat /sys/class/leds/led0/trigger
none rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock timer oneshot heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on input panic mmc1 [mmc0] rfkill-any rfkill0 rfkill1
```

led0(緑)は、"mmc0"(SDカードへのアクセス)

```
cat /sys/class/leds/led1/trigger
none rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock timer oneshot heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on [input] panic mmc1 mmc0 rfkill-any rfkill0 rfkill1
```
led1(赤)は、"input"(電源)となっています。

この設定をGPIOに変更します。

### GPIOと連動するように変更する

今回は、GPIO20とGPIO22を使用します。

```
sudo su
echo gpio > /sys/class/leds/led0/trigger
echo 20 > /sys/class/leds/led0/gpio
echo gpio > /sys/class/leds/led1/trigger
echo 22 > /sys/class/leds/led1/gpio
exit
```

# Lチカのプログラム

普通のLチカと同様にプログラムを作成します。
LEDを0.5秒ごとに交互に点滅させる処理を10回繰り返すようにします。

```lchika.py
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(20,GPIO.OUT)
GPIO.setup(22,GPIO.OUT)

for x in range(10):
    GPIO.output(20,0)
    GPIO.output(22,1)
    time.sleep(0.5)
    GPIO.output(20,1)
    GPIO.output(22,0)
    time.sleep(0.5)
GPIO.cleanup()

```

# 実行する

```
sudo python3 lchika.py
```
LEDが点滅したら成功です。

# LEDの設定を元に戻す

以下のコマンドで設定を元に戻せますが、
ラズパイを再起動、シャットダウンさせても元に戻るようです。

```
sudo su
echo input > /sys/class/leds/led1/trigger
echo mmc0 > /sys/class/leds/led0/trigger
exit
```

# 感想

自分が思っていたよりも、簡単にLチカができた。
基板上のLEDは、GPIO以外にも設定を変更できるということが分かったので
いろいろ試してみたい。

# 参考

[【 第27回 】Raspberry PiでもLED不要のLチカ！]
(https://www.fabshop.jp/%E3%80%90-%E7%AC%AC27%E5%9B%9E-%E3%80%91raspberry-pi%E3%81%A7%E3%82%82led%E4%B8%8D%E8%A6%81%E3%81%AEl%E3%83%81%E3%82%AB%EF%BC%81/)
[RaspberryPi3でPythonを使ってLチカさせる](https://qiita.com/westvirginia/items/4e75b5220f6bfddf21d1)
[[コラム] Raspberry Pi 2のオンボードLEDを自由に光らせよう](http://blog.livedoor.jp/victory7com/archives/43512294.html)
Python で `*.aa.*.bb.*` のようなパスを使って dict から値のリストを取り出す方法

# 概要

`*.aa.*.bb.*` のようなパスを書いて複雑な dict から値のリストを取り出す方法を紹介します。


# 準備

下記を定義します。

```python
def extract_all(data, keys_str, values=None):
    if values is None:
        values = []
    if keys_str == '':
        values.append(data)
    else:
        keys_list = keys_str.split('.')
        key = keys_list.pop(0)
        if key == '*':
            if type(data) == dict:
                data = data.values()
            for v in data:
                extract_all(v, '.'.join(keys_list), values)
        elif key in data:
            v = data[key]
            extract_all(v, '.'.join(keys_list), values)
    return values
```

これだけです。


# 使い方

```python
# 複雑な dict
data = dict(
    a=dict(aa=[
        dict(bb=[111, 112]),
        dict(bb=[121, 122]),
    ]),
    b=dict(aa=[
        dict(bb=[211, 212]),
        dict(bb=[221, 222]),
    ]),
    c=dict(),
)

print(extract_all(data, '*'))
# 出力:
#  [{'aa': [{'bb': [111, 112]}, {'bb': [121, 122]}]},
#   {'aa': [{'bb': [211, 212]}, {'bb': [221, 222]}]},
#   {}]

print(extract_all(data, '*.aa'))
# 出力:
#   [[{'bb': [111, 112]}, {'bb': [121, 122]}],
#    [{'bb': [211, 212]}, {'bb': [221, 222]}]]

print(extract_all(data, '*.aa.*'))
# 出力:
#   [{'bb': [111, 112]},
#    {'bb': [121, 122]},
#    {'bb': [211, 212]},
#    {'bb': [221, 222]}]

print(extract_all(data, '*.aa.*.bb'))
# 出力:
#   [[111, 112], [121, 122], [211, 212], [221, 222]]

print(extract_all(data, '*.aa.*.bb.*'))
# 出力:
#   [111, 112, 121, 122, 211, 212, 221, 222]
```

- 該当のパスが存在しない場合エラーにはらず、単純にリストから除外されます。


# まとめ

不安定かつ複雑なデータをあつかう際に上記があれば、個々にエラーハンドリング書く必要なくなるのでソースの可読性をあげられます。

また、 [Python で複雑な構造の dict オブジェクトをセレクタ的にアクセスできるようにする](https://qiita.com/waterada/items/4e45279b90ec3ca72ab5) という記事で、パスの途中が無い場合にフルパスでエラー出してくれるクラスを紹介してますので、よろしければそちらもご覧ください。
KeyboardAvoidingViewがキーボードを避けてくれないとき


これを
<img src="https://qiita-image-store.s3.amazonaws.com/0/2164/3b0de85b-b7cc-bd6c-a7c2-154de2894318.jpeg" width=400px>




こうしたい
<img src="https://qiita-image-store.s3.amazonaws.com/0/2164/1a3ab978-0785-a905-f860-7784ca85d5fb.jpeg" width=400px>


が、TextInputがソフトキーボードに隠れてしまう時がある。

# 前提
react-navigationなどを使ってヘッダーとStatusBarを表示している

# 解決法
ヘッダーとStatusBar分のサイズをKeyboardAvoidngViewのkeyboardVerticalOffsetというプロパティで指定する。


```jsx
import { Header } from 'react-navigation'
import { StatusBar } from 'react-native'

<KeyboardAvoidingView
  style={styles.textInputView}
  behavior='padding'
  keyboardVerticalOffset={Header.HEIGHT + StatusBar.currentHeight}
>
```

## iOSの場合の対応
iOSの場合、 `StatusBar.currentHeight` の値は `undefined` になってしまうので、上記のようにするとキーボードに隠れてしまう。iOSの場合、StatusBarの高さの論理値は20と決まっているので、それを指定する。またiPhoneXの場合はノッチを加味すると44になる。

参考: https://www.npmjs.com/package/react-native-status-bar-height
swiftで音声を再生する

swiftを勉強し始めたのでメモ

### やりたいこと
- IOSでボタンを押したら音声が再生・停止される
- 音量を調整できる

###  環境
- Xcode: Version 10.1 (10B61)
- mac: 10.14.1
- swift: 4

### 方針
- ストーリーボードで実施
- AVFoundation(音声や画像、動画の作成や再生の細かい作業を行うためのAPIフレームワーク)を使用
- ViewControllerに全部書くと冗長な気がしたので、extensionを用いて音声周りのメソッドを定義
- Main.storybordと同じ階層にwater.mp3を置いてこれを再生・停止・音量調整する  

### 実装
```swift

import UIKit
import AVFoundation

class ViewController: UIViewController {
    var audioPlayer: AVAudioPlayer!
    var soundFlag: Bool = true
    @IBOutlet weak var volume: UISlider!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func tapButton(_ sender: Any) {
        if soundFlag{
            playSound(name: "water", onSound: true)
            soundFlag = false
        } else {
            playSound(name: "water", onSound: false)
            soundFlag = true
        }
        
    }
    
    // volume調整
    @IBAction func changeVolume(_ sender: Any) {
        if audioPlayer != nil {
            audioPlayer.volume = volume.value
        }
    }
}

extension ViewController: AVAudioPlayerDelegate {
    func playSound(name: String, onSound: Bool) {
        guard let path = Bundle.main.path(forResource: name, ofType: "mp3") else {
            print("音源ファイルが見つかりません")
            return
        }
        
        do {
            
            // AVAudioPlayerのインスタンス化
            audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path))
            
            // AVAudioPlayerのデリゲートをセット
            audioPlayer.delegate = self
            
            if onSound{
                // 音声の再生
                audioPlayer.play()
            } else {
                audioPlayer.stop()
            }
        } catch {
        }
    }
}
```

### ざっくり解説
- playSoundは引数にString型のname, Bool肩のonSoundを指定して上げる
- name: mp3ファイル名（例：water.mp3）
- onSound: true → 再生 / false → 停止

### おわりに
以上です。swiftすぐ動くからたのしいですなあ〜
不備・指摘などはコメントかツイッターでおねがいします🙏🏻
Windowsでnodeのバージョン切り替え -nodlist の使い方

###公式
https://github.com/nullivex/nodist

###インストール済みのバージョンを調べる
```
nodist
  7.2.1
  7.8.0
  7.9.0
  7.10.0
> 10.14.1  (global: 10.14.1)
```
10.14.1が設定されていることが分かります。

###インストールできるNode.jsのバージョンを調べる
```
nodist dist
  0.1.14
  0.1.15
  0.1.16
  0.1.17
  0.1.18
  0.1.19
  0.1.20
・・・
```

###インストールする
```
nodist + 10.14.1
```

###使用するバージョンを切り替える
```
nodist global 10.14.1

// 特定のディレクトリでのみ切り替えたい場合
nodist local 10.14.1

// ターミナル内のみで有効
nodist env 10.14.1
```

###アンインストールする
```
nodist - 10.14.1
```
chromebook（OS ver64.0）でctrl、caps lock、検索等のキーを入れ替える方法

# chromebook（OS ver64.0）でctrl、caps lock、検索等のキーを入れ替える方法

## 背景
Chrome OSのバージョンによって設定方法が異なるため、手元にある環境での設定方法を備忘録として残す。
ハードはASUS Flip C101PA-OP1、OSのバージョンは、64.0.3282.167（Official Build） （32 ビット）で動作を確認した。

## 手順
1.設定画面を開く
2.左側メニューの「詳細設定」から「言語と入力」を選択する
3.「ユーザ補助機能」の「ユーザ補助機能を管理」を選択する
4.「キーボード」の「キーボードのデバイス設定を開く」を選択する
5.キー設定画面が開くので、検索、Ctrl、Alt、CapsLock、エスケープ、Backspaceについて、「検索、Ctrl、Alt、CapsLock、エスケープ、Backspace」のいずれかへの入れ替えか、無効化を設定する

## 備考
私の場合には、下記の設定を行っている。たいへんに快適。
　1.検索キーをCtrlキーに入れ替え
　　Chromebookキーボードには、Windowsで言うところのCapsLockの位置に検索というキーがある。かなり邪魔。
　2.CapsLockをCtrlキーに入れ替える
　　こちらは使い慣れたBluetoothキーボードを利用するときのための設定
「車輪の再発明」は、自作、再実装、模倣、改善を否定する言葉ではないぞ！から始まるプログラミング学習法

>「車輪の再発明」"Reinventing the wheel"
> すでに広く知られたアイデアを、その存在を知らずに改めて考案すること

## 今回の主題

* 「発明」と「生産、実装、作成」など混同されがちな言葉をはっきりしておく
* 「車輪の再発明」が推奨される状況を書く

## 車輪の再発明

「『車輪の再発明』は良くない」という言い回しをプログラマはよく使います。
この言い回しは頻繁に誤って使われる（あるいは意味が本来とは変わっている）ものです。

## "Reinvent"あるいは「再発明」の対象は「アイデア」「方法」であって「実装物」ではない

すでに存在するものを使わずに、自分で実装することを「車輪の再発明」と呼ぶ人がいます。
これは本来の意味からすると、誤っています。

### "invent":「発明」の意味

発明は、新しい「アイデア」「問題解決法」を生み出すことです。
それゆえ「車輪の再発明」という言葉において「アイデアがどのように実装されるか」はスコープ外です。

冷静になって考えればわかることですが、今の世の中車輪を作っている人はたくさんいます。
（比喩でなく、自動車業界や鉄道業界を指しています）
その人たちが車輪を再発明しているかといえば、Noです。
彼らはすでに発明された「車輪」という概念を形にしています。
それは否定されることではありません。

### ではどのような状況で「車輪の再発明」と言われるべきか

「パフォーマンスを発揮するべき状況」で「すでに存在する解決方法を調べず」に「解決方法を生み出そうとする」とき。
つまり「車輪の再発明」は、ネットスラングで言うならggrksの範疇に収まります。

### すでに存在するソフトウェアを自作するか否かについて

すでに存在するソフトウェアを使うか否かは、そのソフトウェアの信頼とかパフォーマンスとか状況とかいろいろ考慮して、自作するかきめればよい、というただそれだけの話です。

## 「車輪の再発明」あるいは「車輪の自作」「車輪の再実装」が推奨される状況

先程車輪の再発明について「パフォーマンスを発揮するべき状況」という注釈をつけました。
今日見たTED talksに、[How to get better at the things you care about](https://www.ted.com/talks/eduardo_briceno_how_to_get_better_at_the_things_you_care_about/transcript?referrer=playlist-practice_makes_perfect)というものがありまして、効率よく何かをできる人は初学者を抜けた後も「学ぶ時間」と「パフォーマンスを発揮するべき時間」を意識的に分けて考えている、というものです。

「学ぶ時間」という文脈では、「車輪の再発明、自作、再実装、模倣、改善など」は推奨されるべきです。

## 学びとしての模倣について

学ぶの語源は真似することとか、軽くググっただけで出てくる模倣することの意義を語る記事たち。

https://cybozushiki.cybozu.co.jp/articles/m000319.html
https://wirelesswire.jp/2018/06/65757/

言語（自然音声言語）学習には、Silent Periodなる概念があります。
最初のうちはひたすらインプットして、自分から発話することは難しい時期がある、というものです。

個人的な感覚になりますが、プログラミングにもSilent Periodに近いものがあって、インプットがある程度進まないとオリジナルのコードを書くのは難しいのではないかな、と思っています。
それで、Silent Periodのインプット方法に最適なのが模写と。
慣れてきたら、既存のアイデアの再現（再実装）あるいは改善。

## 学びとしての「車輪の再発明」について

新しい問題解決方法を発明するのは、訓練がいるので「学びの時間」の中なら自分で既存の概念を再発明するのはありだと思います。

## まとめ

「車輪の再発明」という言葉は正しく使おう。
初心者のうちは模写しよう。
JavaScript で if式っぽく動くようなswitch式...というかswitch関数作ったよ。

# 前の記事で if式 じゃなくて、if関数は作ってしまったのだ。

こちらの記事です。

JavaScriptの三項演算子が読みにくいらしいので、if式ならぬ if関数を作りました。そしてもっと読みにくい感。 - Qiita
https://qiita.com/standard-software/items/794724427fcee1cbd00b


# どうせif関数も作ったので、真似て switch関数を作ります。

名前は「switch_」です。

値を渡したら、それを評価して分岐するという機能。

こんな書き方ができるようになります。

```js

var switchValue = 1;
console.log(
  switch_(switchValue)([
    [1, 'Val1'], 
    [2, 'Val2'],
    [3, 'Val3'],
    ['1', 'ValStr1'],
    ['defaultVal']
  ])
);


var switchValue = '1';
console.log(
  switch_(switchValue)([
    [1, 'Val1'], 
    [2, 'Val2'],
    [3, 'Val3'],
    ['1', 'ValStr1'],
    'defaultVal'
  ])
);

```
特定条件によって値を代入するときに let 変数じゃなくて const 変数を使いたい場合でも、この「switch_関数」を使えば使い放題です。(使わなくても工夫したら使いたい放題だろうけれどもな)

上の書き方、細かくみてみるとわかるように、配列じゃない値を渡したり、長さ1の配列を渡すとそこがデフォルト値になります。

数値の1と、文字列の1の比較もできるぞ、という感じ。

なぜ配列にしているかというと、オブジェクトだと、{1: 'Val1', '1': 'ValStr1'} こんな書き方ができないから。オブジェクトのプロパティは全部文字列に変換されるらしいよ。

# 「switch_」関数の実装

ということで実装です。結構簡単。

```js
const isFunction = (value) => {
  return (typeof value === 'function');
};

const functionValue = (value) => {
  if (isFunction(value)) {
    return value();
  } else {
    return value;
  }
};

const assert = function (value, message) {
  if (typeof message === 'undefined' || message === null) {
    message = '';
  }
  if (value !== true) {
    throw new Error(message);
  }
};

const switch_ = (expression) => {
  return (args) => {
    assert(Array.isArray(args), 'switch_ function');
    for (let i = 0; i < args.length; i += 1) {
      if (!Array.isArray(args[i])) {
        return args[i];
      } else if (args[i].length === 0) {
        return undefined;
      } else if (args[i].length === 1) {
        return args[i][0];
      } else {
        if (args[i][0] === expression) {
          return functionValue(args[i][1]);
        }
      }
    }
  };
};

```

if_関数の実装と同じように、内部で、functionValue を使っているので、次のように書けば、条件合致しない部分のものは、関数呼び出しそのものが行われません。

これで場合によっては、値によって関数呼び出しを制御する、ということも簡単にできます。

```js
var switchValue = 2;
console.log(
  switch_(switchValue)([
    [1, _=>'Val1'], 
    [2, _=>'Val2'],
    [3, _=>'Val3'],
    ['1', _=>'ValStr1'],
    'defaultVal'
  ])
);

```

switch_関数は、if_関数よりかはいくらか実用的かもしれないですね。

まあ、これもお遊びみたいなものですが、こんなこともできる。ってことで。よろ。

# 追記
2019/03/21(木)

switch_ を組み込んだライブラリを npm で配信しています。TypeScriptコードです。

standard-software/copipejs: simple code parts
https://github.com/standard-software/copipejs

デフォルト値の記載方法を少し変えました。

https://github.com/standard-software/copipejs/blob/master/source/copipe_core.ts
このあたりのソースをみると実装がわかり、
https://github.com/standard-software/copipejs/blob/master/source/test/test_copipe_core.ts
こちらのテストコードをみると使い方がわかります。
最小限の持ち物で勉強できるのか？iPadで開発 《第1弾》

# 野望
机の上には最小限のものだけで勉強する！！
iPad Pro でどこまで開発の勉強ができるか？
はたまたアプリも作れるのか！？
# こんな人にオススメ？？
- iPad ひとつでなんでもやりたい人
- 持ち歩くものを減らしたい人
- PCの買い替えはもう嫌な人
- 新しい勉強の仕方を開拓したい人

# 環境
- iPad Pro 2018 11inch
- Apple 純正 Smart Keyboard
- モバイルルータ

# ことの始まり
・出発点
家でも外でもプログラミングの勉強をしたい、それも長時間。
・問題点
MacBook Pro ちゃんは電池どか食いなので短時間高負荷向け。
充電可能席争いに負けたら数時間でお盆になる。
・今やっと使えそうな技術
1. PCの遠隔操作
2. ネット上に無料開発環境を作れる（借りれる）

# 実際に使ってみた
今回は下記2つを試してみました。
## paiza.IO
いつも簡単なコードを試している[piazza.IO](https://paiza.io/ja) を試してみた。
実はこのサイトと出会ってからこの企画を思いついたのである。
期待していたのもつかの間、smart keyboardの方向キーが使えないではないか！！
そうなんです、サイトによっては方向キーがうまく使えないのです。
ちなみにこの記事を書くのにはちゃんと使えていますが。

反省
ちゃんと事前確認が必要。。。

## Play with Docker
Quita を徘徊していたところ下記の記事を見つけました。
[Docker 入門にはインストールなしで使える「Play with Docker」がいいと思う](https://qiita.com/tag1216/items/ec7228440f6eaf849cd6)
クラウド上でDocker が使えるというもの。
詳しいことは私の方では割愛します。
Docker が使えるということは、なんでもできるのではないか！！と思い実際に試してみました。
下記からStart を押して入ると、、、
https://labs.play-with-docker.com
![7CA2BE9C-C03F-4D5A-A398-FFF4267E84CF.png](https://qiita-image-store.s3.amazonaws.com/0/162539/441609c7-7b5c-3eab-6c68-694312441bdb.png)
そこにはDockerが使える環境がまっていました。
（右下コンソール部分）
![CF94BDAE-711A-40A1-A6E0-826C2DAEE9D7.png](https://qiita-image-store.s3.amazonaws.com/0/162539/f31467a7-8fda-a661-8b52-f9302487a165.png)


早速CentOS 7 のコンテナイメージをpull

```
docker pull centos:7
docker run --name test -it centos /bin/bash
```

なんと簡単！ちゃんと入れました！！
これで簡単にテスト環境ができました！
今のところ何か思いついて試すくらいであればこれで十分かなと思います。
試しにpython3 でもやってみようかとの事で。。。

```
yum install -y https://centos7.iuscommunity.org/ius-release.rpm
yum install -y python36u python36u-libs python36u-devel python36u-pip
```
としたらちゃんとすんなり入ってくれました！

自身のwi-fi 環境でもないので、インストールなどすぐ終わってくれるので辺鄙な環境にいても良さそうです。

ですが！また問題になるのが、方向キー使えない問題。。。
しかし、そんな頻繁に行替えするわけでもないのであまり気になりませんでした。
また、コピペは機能するので、メモ帳に流したいコマンド一気に書いて貼り付けて実行すれば楽チンでした。

# 今後やりたい事
前から調べていたところssh 接続がアプリから使えるそうなので、PCなどに環境作っておいて外ではiPadのみ！など色々考えています。
後はRaspberry Pi もssh できるのでそちらの開発・勉強も一緒にしてみたいと思います。

# まとめ
- とりあえず勉強くらいはできそう！
- Play with Docker を使えば最低限のことはできそう！

お付き合いありがとうございました。
Pythonではじめる機械学習　レポート④

# 4章　データの表現と特徴量エンジニアリング
　特定のアプリケーションに対して、
最良のデータ表現を模索することを**特徴量エンジニアリング(feature engineering)**という。

## カテゴリ変数
　以下のようなデータの場合、
年収が500万円を超えるか？超えないか？
という2クラス分類をすることもできるし、
年収を予測するというアプローチもできる。

| 年齢 | 雇用形態 | 学歴 | 性別 | 年収 |
|-----:|:--------|:-----|:----|-----:|
| 39   |公務員   | 大学  |男   |500万以下|
| 50   |自営業   | 大学  |男   |500万以下|
| 38   |民間     | 高卒  |男   |500万以下|
| 52   |自営業   | 高卒  |男   |500万越え|
| 31   |民間     | 院卒  |女   |500万越え|
| 42   |民間     | 大学  |男   |500万越え|

　しかし、「年収が500万円を超えるか？超えないか？」という問題に対しては、
2クラス分類の方が簡単である。

　このデータの「学歴」は、連続値(数値)ではないので、
ロジスティック回帰分析には直接当てはめることはできない。
よって、データを別の方法で表現する。

### ワンホットエンコーディング
　上記の例で、「学歴」などをそれぞれ「1」と「0」のフラグに置き換えてデータ化することを
**ワンホットエンコーディング(one hot encoding)**という。

|学歴|中卒|高卒|大卒|
|:--|---:|---:|---:|
|中卒|1|0|0|
|高卒|0|1|0|
|大卒|0|0|1|

## ビニング、離散化、線形モデル、決定木
　**ビニング(binning)=離散化(discretization)**とは、
特徴量を複数に分割することである。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/ac0f2b26-938b-56dc-5373-d330ea4fe343.png)
　上のデータを離散化すると、以下のようになる。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/dda3294a-65cd-1d37-fe54-c973895d5901.png)
　ビン(bin)毎に出力を予測するので、
線形回帰も決定木も同じ値を示す。

　線形回帰にとってはメリットがあるが、
決定木は元々ビニング機能が備わっているので特に利点はない。
よって、どうしても線形回帰を使いたい場合に離散化を行うと良い。

## 自動特徴量選択
　特徴量が多いと、モデルは複雑になって計算もコストがかかる。
よって、有効な特徴量だけ使うことによって効果的に恩恵が得られる。
しかしながら、どの特徴量が有効かをどうやって判断するのか
というのが問題である。そこで、
以下の3つの手法を使う。

### 単変量統計(univariate analysis)
　特徴量と出力に、統計的に関係があるかどうかを計算し、
最も高く関連している特徴量を１つずつ調べていく手法である。

### モデルベース特徴量選択(model-based selection)
　教師あり学習モデルを使って、各特徴量の重要性を判断する手法である。

### 反復特徴量選択(iterative selection)
　異なる特徴量をモデルを作る手法であり、
やり方は２通りある。

①１つずつ特徴量を加えていき、出力を比較していく。

②すべての特徴量を組み込んだ後、１つずつ特徴量を引いていく。
これは**RFE(Recursive feature elimination)**(ランダムフォレスト)と呼ばれ、
決定木を複数作成した後、その多数決で有効なものを分類する手法である。
パラメータがバラバラになった時に精度が悪くなれば重要度が高いと判断できる。

## 専門家知識の利用
　例えば、JR東海に勤めているとして、
価格・駅・日付を記録したデータで学習モデルを作ったとする。
しかし、天皇即位の日にちがわかるわけではない。
この場合において、特徴量を予め組み込んでおくことで、
対応することはできる。
　機械が判断できない部分でも、人間が理解している部分を組み込むことによって
計算コストが減る例はいくらでもある。
Google Photoを業務システムのクラウドストレージとして使った結果

# はじめに
弊社で、お客さんから依頼を受けて開発している基幹システム(Web系)があるのですが、
業務の一部として、街に行って物件の写真を撮ってくるということを行っています。
この写真は、お客さんにとっては貴重な情報であり、日々の業務でも多用されるものです。

# 業務的な要件
各物件はシステムできちんと管理しており、撮影した写真もシステムで管理しております。
管理している写真は社内サーバにあり、格納している写真44000枚ほどでした。
これらをクラウドストレージに移行したいという依頼を受けました。
各画像はブラウザ上から見られる必要があります。
どのサービスを使うのかという話になったとき、Google Photoなら、圧縮すれば容量が無制限で使えるとのことで、使うことになりました。

ところが、仕様を調査したところ、いろいろと制約が多いことが判明しました。

## 日にち単位のアクセス制限がある
Google Photo APIの場合、1日のアクセス制限が2500アクセスのようで、44000枚もの写真データを一度に移行できませんでした。
そのため、一日2000～2250ほどまでアクセスするようにし、20日以上かけて定時バッチでアップロードしていくことになりました。

## EXIF情報を登録できない
物件の写真はスマホで撮影し、物件の位置も知る必要があるため、写真のEXIFの位置情報を使います。
ところが、Google Photoに上げるとEXIF情報が保存できないのです。
物件の写真を撮った時に、その場でGoogle Photoに上げて、システムからGoogle Photoにアクセスして緯度経度を取得するということができません。
システムに写真を登録する際に、EXIF情報から緯度経度を取得し、DBに保存するという従来の方法を維持することになりました。

## APIから削除ができない
APIに写真やアルバムの削除機能がありません。
間違えて写真をアップロードしたとき、API経由で削除ができません。
Google Photoのページから手動で削除する方法しかないのです。
そのため、
システムから削除された場合、写真を管理するDBのテーブルについては論理削除にし、削除されたやつについては適宜画面から削除することになりました。
早く削除機能が実装されることを祈ります。

## プレビュー画像のURLが固定でない
画像を取得するとき、写真IDを元にしたURLではなく、
その都度URLが変わるため、いちいち問い合わせをしなければいません。
そのため、写真を1枚取得するには、2回アクセスをしなければいけないのです。

以下のようにMEDIA_ITEM_ID(写真アップロード時に取得したID)を指定して、写真を取得するには、レスポンスが返すbaseUrlにアクセスします。

![accessmediaitems.png](https://qiita-image-store.s3.amazonaws.com/0/150066/29395a52-c34c-6ca6-0a04-3348a49a57d3.png)

## APIからだと「元のサイズ」でしかアップロードできない
Google Photoには、アップロードのモードとして、「元のサイズ」と「高画質」という2つのモードがあります。
「元のサイズ」はアップロード画像を元のサイズのままアップロードし、この場合は容量を消費します。
「高画質」はGoogle独自の技術で高画質のまま画像を圧縮してアップロードします。冒頭で「容量無制限」と言いましたが、こちらのことです。
写真の移行作業を毎日行っていたとき、一週間くらいしたら、容量が足りなくエラーになってしまい、調査したら、元のサイズのままアップロードを繰り返し、容量を食いつぶしていたということがありました。
Google Photoの機能で、「容量を開放」という機能があるので、それを実施すれば全写真が「高画質」モードになります。
ただ、APIから「容量を開放」という機能がないため、手動でやらなければいけません。。

# ID変更事件(2018年9月)

2018年8月末にシステムをリリースしてから数日後に事件が起きました。
お客さんから「写真が見れない」という問い合わせを受け、調査したところ、青ざめてしまいました。

https://developers.google.com/photos/library/support/release-notes

```
9月5日のNotes
If you stored IDs (such as IDs for albums, media items or enrichment items) before 5 September 2018, they will no longer work as the format has changed. You will need to obtain new IDs for use in your application.
```

いわゆる、9月5日前に取得したIDは、リセットされているとのこと。 
DBに写真IDを保持して、そのIDを元に写真を取得するというロジックのため、
業務システムから全ての写真がアクセスできなくなりました。
IDを振り直すことも考えましたが、特定できる情報がGoogle Photo側になく、
泣く泣くもう一度やり直すことになりました。
ただし、システムから写真を登録する時点では、アプリサーバに写真を保存してそれを参照し、夜間バッチでGoogle Photoにアップロードするというロジックになっていたため、写真が見れないということは避けられました。

# まとめ
Google Photo APIは、Picasaから変わったAPIなので、まだ発展途上なのかもしれません。
データをきちんと管理をしなければいけない業務システムに使うには、注意が必要です。
Laravelでサブクエリをメソッド使いたい。joinSub()

laravelでサブクエリをつかいたい。

DB::rawを使って生sqlでサブクエリを読み込ませる方法が過去あったが、5.6からjoinSubというメソッドができたらしい

```php

$hoges = DB::table('hoge')
             ->where('fuga')
             ->select('piyo');

function hogeGet () : object
{
    return DB::table('hogehoge')
            ->joinSub($hoges,'hoges', function ($join) {
                $join->on('hogehoge.id', '=', 'hoges.hogehoge_id');
            })
            ->get();
}

```


Laravel News
Laravel 5.6.17 Released
https://laravel-news.com/laravel-5-6-17
ブランチにつけられたチケット番号をコミットコメントに反映する方法

:warning: このGitHooksは以下の開発環境の人限定です。  
ブランチの命名規則に`チケット番号`or`Issue番号`が入っている  

### 作った理由
後で`commit`毎にどの対応か見たかったんだけど・・・それを入力するのがすっごくめんどくさかったから

## やり方
以下の手順で導入できます。

1.hooksに移動

```shell
.git/hooks
```
2.hooksに含まれているcommit-msgを使用可能にする(sampleが付いていると動作しません)

```shell
mv commit-msg.sample commit-msg
```
3.実行言言を付与

```shell
chmod +x commit-msg
```
4.AndroidStudioでファイルを開く(viでもいいです)

```shell
open -a Android\ Studio commit-msg
```
5.開いたファイルに以下を記載

```ruby
#!/usr/bin/env

branchName = ｀git branch | grep '*'｀.match(/\d+/)
if “#{branchName}“.length < 5 then
 branchName = “”
else
 branchName = ‘[#’ + “#{branchName}” + ‘]’
end

commit_msgs = File.readlines(ARGV[0])
open(ARGV[0], ‘w’) {|file|
  file.print “#{branchName}”
  file.puts commit_msgs
}
```
正規表現部分
`match.(/\d+/)`
をもっとガチガチに書けばいろんなbranch名にも対応できそうですが、そこはお好みで・・・

以上です！
SAML2.0 ID プロバイダをつくるときの参考資料まとめ

この記事は [グロービス Advent Calendar 2018](https://qiita.com/advent-calendar/2018/globis) の８日目の記事です。

SAML認証によるログインをWebサービスに実装することはあっても、
ゼロからSAMLの認証プロバイダを設計・実装する機会は少ないんじゃないでしょうか。
今回は自分がSAML2.0の Identity Provider(IdP) を作るときに参考になった資料をまとめました。
随時追記予定です。

## SAMLについてざっくり理解する
* [SAML認証ができるまで - Cybozu Inside Out | サイボウズエンジニアのブログ](https://blog.cybozu.io/entry/4224)
* [OpenSSO社内勉強会第二回 -SAML- (pdf)](https://www.osstech.co.jp/_media/techinfo/opensso/osstech-opensso-study-02-saml.pdf)


## 仕様書を読んで理解する
- [SAML Specifications](http://saml.xml.org/saml-specifications)
- [SAML Core(pdf)](https://www.oasis-open.org/committees/download.php/56776/sstc-saml-core-errata-2.0-wd-07.pdf)

OASISによるSAML2.0の仕様書。
SAML仕様はいくつかのカテゴリに分かれており、IdPを実装する場合 Core だけでなく他のカテゴリの仕様も把握しておく必要があります。
すべて読むのは正直大変なので、レファレンスとしての利用がおすすめです。

## OSSライブラリを読んで理解する
- [sam-idp/saml-idp](https://github.com/saml-idp/saml_idp)
- [onelogin/ruby-saml](https://github.com/onelogin/ruby-saml)

rubyによるIdP、SPの実装。仕様書を読むよりコード読むほうが理解が早い人におすすめ。
OneLogin が公開しているSAMLのSP実装はruby以外もあるので他の言語がいい方はそちらを参照のこと。

## 他サービスのSAML実装を把握する
- [GSuite (IdP)](https://support.google.com/a/answer/6087519)
- [GSuite (SP)](https://support.google.com/a/answer/60224)
- [AWS](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_saml.html)
- [Salesforce](https://help.salesforce.com/articleView?id=sso_saml_setting_up.htm&type=5)
- [Cybozu](https://jp.cybozu.help/general/ja/admin/list_externalservices/list_saml/saml_settings.html)

SAML認証を提供している他サービスの連携仕様。
SPにとって連携しやすいIdPを作るための参考にしています。

## 知っておくと便利なサービス
* [SAMLTool.com | SAML Testing Tools | Online SAML Debugger | Examples](https://www.samltool.com/index.php)

OneLoginが提供しているSAMLのテストツール。
認証要求のバリデーションやXMLのエンコードなど、SAML認証のフローをWeb上で試すことができます。
機械学習の評価指標を簡単にまとめてみた

# はじめに
この記事は、機械学習の推定結果を評価する際に用いる評価指標について、どの場面でどの指標を利用すればよいか毎回迷ってしまうので、一度まとめます。今回紹介する指標以外にも多々ありますが、自身が良く利用するものを紹介していること、機械学習のコーディングなどではないため、悪しからず。


# 混同行列(Confusion Matrix)
混同行列とは、クラス分類の推定結果をまとめた表のことを言い、下記のように「行」に実測値、「列」に推定値をおきます。
<img width="500" alt="スクリーンショット 2018-12-09 19.18.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/196312/a6ee019c-43e8-6ff8-5f52-5e5dbfcfb139.png">

TP(True Positive) 正しく正(陽性)と判断された。
TN(True Negative) 正しく負(陰性)と判断された。
FP(False Positive) 誤って正(陽性)と判断された。
FN(False Negative) 誤って負(陰性)と判断された。

#### 例えば・・・:question:
ある一人の患者が、ある医者に「あなたは病気にかかっています」と診断されました。
しかし、後にとある検査によって、この患者は病気にかかっていないことが判明しました。
この時の医者の判断は「TP、TN、FP、FN」のどれに分類されるでしょう。
病気にかかっていることを陽性、かかっていないことを陰性とします。

:writing_hand:正解は、「FP」誤って陽性と判断されたとなります。

以下、この混同行列を利用した評価指標をまとめます。

## 正解率(Accuracy)
全体のうち、予測通り正誤分類できた割合を表します。

計算式　:point_right::point_right:  **TP+TN / 全体**

どのような時の指標に利用するのか？
:arrow_down_small:
分類を適切にできた数の割合のため、直感的に一番分かりやすいが、FP、FNを無視して良い場合に利用する。（オレンジとみかんが混ざってしまった時に分類など。）

## 適合率(Precision)
予測値で陽性である判断された時、実際に陽性のサンプルである割合を表します。

計算式　:point_right::point_right:  **TP / TP＋FP**

どのような時の指標に利用するのか？
:arrow_down_small:
検索サイトである単語に対して、適合するサイトを表示させるなど、FPが低ければ良い検査の場合に利用する指標となります。

## 再現率(Recall)
実際に陽性であるサンプルのうち、陽性であると判断されたサンプルの割合を表します。

計算式　:point_right::point_right:  **TP / TP＋FN**

どのような時の指標に利用するのか？
:arrow_down_small:
FNが低ければ低いほど、良い結果になるため、病院の検査結果や、空港での海外からの流行病検査などには有効な指標となります。

上記の適合率と再現率は、一方の数値を高めると、もう一方の数値が低くなるトレードオフの関係にあります。

※たくさん陽性を出す検査➡️再現率が高まり、適合率が低くなる。
※たくさん陰性を出す検査➡️適合率が高まり、再現率が低くなる。

このため、下記のような「**F値**」と呼ばれる指標が利用されます。

## F値 (f1-score)
適合率と再現率の調和平均を表します。

計算式　:point_right::point_right:  **2Precision × recall / precision + recall**

## おわりに・・・
今回取り上げた指標以外にも、「不正解率」や「特異度」など、検査や利用したい結果によって、評価指標が変わってきますので、今後も利用するたびに、まとめて挙げていきたいと思います:exclamation:
OpenSiv3DとLibTorchでカルピスの判定

これは[Siv3D Advent Calendar 2018](https://qiita.com/advent-calendar/2018/siv3d)10日目の記事です。
#はじめに
カルピス美味しいですよね。そこで今回はカルピスのボトルの写真から味の判定をするアプリケーションを作りました。

#[LibTorch](https://pytorch.org/cppdocs/)+[OpenSiv3D](https://github.com/Siv3D/OpenSiv3D)
LibTorchはPyTorchのC++ APIです。これを使えば、C++でDeep Leaningができます。OpenSiv3Dから、LibTorchを呼び出してあげることで、簡単にDeep Learningを使用したアプリケーションを作れます。（[簡単に作れるとは言ってない](#奮闘記)）

#OpenSiv3D側
GUIと画像の前処理を請け負っています。

#LibTorch側
PyTorchで作ったモデルを読み込んで、OpenSiv3Dから渡された画像から、カルピスの味を判定しています。

#制作したアプリケーション
ウィンドウに画像ファイルをドラッグアンドドロップすると、勝手に判別するようになっています。
![Screenshot from 2018-12-09 20-06-06.png](https://qiita-image-store.s3.amazonaws.com/0/147638/8ef3b2c8-df30-f738-3d34-a9a270a40ab8.png)
カルピス北海道はまあまあ美味しいですね。
![Screenshot from 2018-12-09 20-06-30.png](https://qiita-image-store.s3.amazonaws.com/0/147638/4eee7142-1a8c-192d-6ce6-2c263759f750.png)
自分は普通のカルピスが一番好きです。
![Screenshot from 2018-12-09 20-06-51.png](https://qiita-image-store.s3.amazonaws.com/0/147638/bb586d79-9977-be53-94b1-3f1c995a11a3.png)
カルピスの写っていない画像も判別するようにしました。

#ソースコード
本記事で作成したアプリケーションのソースをあげときます。
[https://github.com/MurakamiShun/CALPIS](https://github.com/MurakamiShun/CALPIS)



#奮闘記
そう簡単にできたら、困ってませんよwww
###ABIのバージョンとCMakeファイル
まず、OpenSiv3DはC++17準拠で書かれています。
またLibTorchはC++11準拠で書かれているのですが、ABIのバージョンが古いため、そのままコンパイルするとOpenSiv3D側のコンパイルが通らないという問題があます。このABIのバージョンを`_GLIBCXX_USE_CXX11_ABI`で指定する必要があります。しかし、このフラグがLibTorchのCMakeファイルに書かれいるため、一度無効化して、LibTorchを使用しているcppファイルで再度宣言してあげる必要があります。これに気づくのにかなりの時間を要してしまいました。

###PyTorch1.0の正式リリース
この記事を書いている途中にPyTorch1.0が正式リリースされました。これが12/8日のことでした。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">[v1.0] : JIT Compiler, Faster Distributed, C++ Frontend, CUDA10<br>Read more about the changes at <a href="https://t.co/Xfrad06NZO">https://t.co/Xfrad06NZO</a><br><br>As always, get the install commands on <a href="https://t.co/DeaBDSRxs8">https://t.co/DeaBDSRxs8</a></p>&mdash; PyTorch (@PyTorch) <a href="https://twitter.com/PyTorch/status/1071145924959686656?ref_src=twsrc%5Etfw">2018年12月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
オゥ...書きなおすか...(投稿2日前)

###データセット
カルピスの画像って少ないんですね...
苦労しました。
Vue.jsでラジオボタンのチェック情報をデータバインディングする


```javascript
data: {
    picked: {
        hoge: ''
    }
}
```

```html

<input type="radio" value="1" v-model="picked.hoge">
<input type="radio" value="２" v-model="picked.hoge">
```

Vue.js
フォーム入力バインディング
https://jp.vuejs.org/v2/guide/forms.html
PowerShellメモ　クリップボード操作

# ■概要

クリップボードから値を取り出したり、クリップボードに値を設定したり。

# ■クリップボードから値を取得

## ◇テキストを取得

```PowerShell:構文
Get-Clipboard -Format Text
```

実行例）
[準備]文字列をクリップボードにコピー
![ps_clip01.png](https://qiita-image-store.s3.amazonaws.com/0/142879/ce406910-1f35-fce5-a7ec-01f89388a540.png)

Get-Clipboardの結果を変数に入れてから表示
![ps_clip02.png](https://qiita-image-store.s3.amazonaws.com/0/142879/6c7277a2-5bcc-94d1-05c8-1953ac6c930e.png)

パイプで渡して処理
![ps_clip03.png](https://qiita-image-store.s3.amazonaws.com/0/142879/4f8fd67f-49eb-a89d-2e6e-17a6f10aab89.png)

## ◇ファイルを取得

```PowerShell:構文
Get-Clipboard -Format FileDropList
```

実行例）
[準備]エクスプローラーでファイルやフォルダをコピー
![ps_clip04.png](https://qiita-image-store.s3.amazonaws.com/0/142879/5610e08f-383b-1e97-5b38-bd9997dc9e9c.png)

![ps_clip05.png](https://qiita-image-store.s3.amazonaws.com/0/142879/64850b2b-3de3-d918-60ca-5056bd1c3c7d.png)

## ◇画像を取得

```PowerShell:構文
Get-Clipboard -Format Image
```

実行例）
[準備]画像をコピー
![ps_clip06.png](https://qiita-image-store.s3.amazonaws.com/0/142879/a4c89dff-64da-dee7-ee56-ecbe805bfc1c.png)

![ps_clip07.png](https://qiita-image-store.s3.amazonaws.com/0/142879/4d60b5ee-9f8c-7023-c202-015a5e775dc6.png)

# ■クリップボードに値を設定

## ◇テキストを設定

```PowerShell:構文
Set-Clipboard
```

実行例）
[準備]クリップボードに`アイウエオ`を設定するコマンドを実行
![ps_clip08.png](https://qiita-image-store.s3.amazonaws.com/0/142879/4c022eaf-2672-b0d4-9bf3-7956fb2eea28.png)

メニューから貼り付け
![ps_clip09.png](https://qiita-image-store.s3.amazonaws.com/0/142879/4dbb220c-baba-0bd1-19dc-29122afc52b2.png)

## ◇テキストを追加

```PowerShell:構文
Set-Clipboard -Append
```

実行例）
[準備]クリップボードに`アイウエオ`を設定、更に`12345`を追加するコマンドを実行
![ps_clip10.png](https://qiita-image-store.s3.amazonaws.com/0/142879/7e5fc8a0-0e69-0ded-80f1-2b7475d62670.png)

メニューから貼り付け
![ps_clip11.png](https://qiita-image-store.s3.amazonaws.com/0/142879/6057e162-248e-0056-6962-a1cf1f1163a9.png)

# ■動作確認した環境

* PowerShell V5.1 (Windows 10)