OmniAICreator/Qiita-1.07M huggingface dataset:
よく使うgitコマンド集

随時追加
## git log系
### 特定のファイルのコミット履歴を確認したい時
```
git log 対象のファイル
```
### 特定の期間のコミット履歴を確認したい時 
```
git log --since="開始日" --until="終了日"
```
### 特定の人のコミット履歴を確認したい時 
```
git log --author='コミット者の登録名'
```
### コミットメッセージで検索したい時 
```
git log --grep='コミットメッセージ'
```
### ある特定の文字列が更新・削除されたリビジョンを取得する
```
git log -S "対象文字列"
```

### ある特定の文字列が更新・削除されたリビジョンと行を取得する
```
git log -p -S "対象文字列"
```

### プロジェクトのコミットした行数を取得する
```
git log --numstat --pretty="%H" --author='名前' --since=2018-08-28 --until=2018-08-29 --no-merges | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("%d (+%d, -%d)\n", plus+minus, plus, minus)}'
```

## git reset系
### 直前のコミットだけブランチを間違ってしまった時
```
git reset --soft HEAD^
```
### 直前のコミット・プッシュのブランチを間違ってしまった時
```
git reset --soft HEAD^
git push -f origin 変更内容を消したいブランチ
```
### 特定のコミットを削除したい場合
```
git reset --soft ハッシュ値
```
## git commit系
### 直前のコミットだけコミットメッセージを間違ってしまった時
```
git commit --amend -m "直したいメッセージ"
```
## git revert系
### 特定のcommitを打ち消したい時(元に戻したい)
```
git log -S '戻したい文字列を覚えて入れば' ファイル
コミットIDを確認
git revert コミットID
```

## git rebase系
### 直近のコミットメッセージをまとめたい時
```
git rebase -i HEAD~まとめたいコミット数

新しくまとめたコミットメッセージを作る場合(squash)
pickをsquashに変更し保存(対象のコミットメッセージの冒頭)
コミットメッセージを入力し保存

既存のまとめたコミットメッセージにする場合(fixup)
pickをfixupに変更し保存(対象のコミットメッセージの冒頭)

git push -f origin 対象のブランチ
```
### まとめ方を間違えた時
```
git rebase --abort
```
## git cherry-pick系
### 別ブランチを切って、他の複数ブランチの特定のコミットをまとめたい時
```
git checkout -b ブランチ名
git cherry-pick コミットID
```

## git blame系
### 特定の行のコミット履歴を見たい時
```
git blame -L 該当開始行,該当終了行 ファイル名
```
### 特定箇所のコミット履歴を見たい時
```
git blame -L /特定文字列/ ファイル名
```

## その他
### 特定のファイルのコミット履歴とファイルを抹消したい時
```
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch ファイル名' HEAD
git gc --aggressive --prune=now
git push -f
```
他のユーザーも利用しているリポジトリなどであった場合はクローンし直してもらう必要がある

### 特定のコミットの差分を確認したい時
```
git show コミットハッシュ
```
Bigquery で load が終わらない時などに jobの進行率を見るコマンド例

# 進捗50%の例

`bq show -j --format=prettyjson [bq job id]`

```
 "statistics": {
    "completionRatio": 0.5,
    "creationTime": "15441554234456",
    "startTime": "15441554557681"
  },
```

#Help

| jobs[].statistics.completionRatio | double | [TrustedTester] [Output-only] Job progress (0.0 -> 1.0) for LOAD and EXTRACT jobs. |
|:--|:--|:--|


https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/list








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
asp.net core > swagger



## 環境
VS：VisualStudio2017
フレームワーク: .asp.net core 2.1

## Swaggerをインストール

「ツール」→「NuGetパッケージマネージャー」→「NuGetパッケージの管理」

検索に`Swashbuckle.AspNetCore`

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/8c04f436-48ae-6be4-d6e6-526b217be4d6.png)


## Startup.cs

Startup.csに追記


1. using

```cs:Startup.cs
using Swashbuckle.AspNetCore.Swagger;
```


ConfigureServicesにAddSwaggerGenを追加

```cs:Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

    services.AddSwaggerGen(options =>
    {
        options.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
    });
}

```


ConfigureにUseSwagger, UseSwaggerUIを追加

```cs:Startup.cs

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }


    // SwaggerドキュメントをJSONとして出力する設定
    app.UseSwagger();

    // Swagger UIを表示する設定
    app.UseSwaggerUI(options =>
    {
        options.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    });



    app.UseMvc();
}

```


## デバッグの設定

デバッグの設定

プロジェクトのプロパティ→デバッグ

ブラウザーの起動に、`swagger` を入力

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/f8539d08-f432-7f5a-3a1b-f67244fd0b2c.png)


## 実行

F5で実行する。

URLの後ろに「/swagger」が付いたURLで起動する。はず。

例）`http://localhost:49256/swagger`


以下のような画面が表示されれば成功

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/4b8cbad5-6aa9-354f-97df-51c8e936b7c8.png)
React > IE11 > react-scripts ver2 でエラーになる件の対処



## 概要

react-scriptsのバージョンを"1.1.5"→"2.1.1" 
に変更したところIE11でエラー吐いて動かなかった件

↓IEでのエラー
```
SCRIPT438: オブジェクトは 'assign' プロパティまたはメソッドをサポートしていません。

SCRIPT5009: 'Promise' は定義されていません。
```


## 調査

[Last call for Create React App v2 · Issue #5103 · facebook/create-react-app](https://github.com/facebook/create-react-app/issues/5103)

ここ↑にIEのサポートやめましたと書いてありました。

 > We have dropped default support for Internet Explorer 9, 10, and 11.
 > Internet Explorer 9,10、および11の既定のサポートを削除しました。


## 対策

助け舟でこうも書いてありました。

>  If you still need to support these browsers, follow the instructions below.
>  これらのブラウザをサポートする必要がある場合は、以下の手順に従ってください

#### 1, install react-app-polyfill:

```
$ npm install react-app-polyfill --save
$ # or
$ yarn add react-app-polyfill
```

#### 2, src/index.js の先頭行に以下のどちらかを追加

```js:src/index.js
import 'react-app-polyfill/ie9'; // For IE 9-11 support
# or
import 'react-app-polyfill/ie11'; // For IE 11 support
```


## 詳細

> You can read more about these polyfills here.
> さらに詳しくは以下を見てね

とのこと

[create-react-app/packages/react-app-polyfill at master · facebook/create-react-app](https://github.com/facebook/create-react-app/tree/master/packages/react-app-polyfill)
AWS上でFreeBSDを使う(その１）


AWSでFreeBSDを使うのは簡単です。

残念ながら、公式AMIはないのですが
FreeBSDとしてのオフィシャル？のAMIがあります。

![スクリーンショット 2018-12-07 8.47.24.png](https://qiita-image-store.s3.amazonaws.com/0/46046/ccfb13a8-7a96-59e9-fcf9-76a8a63884ee.png)

インスタンスの作成で出るAMIの選択画面で、FreeBSDで検索します。

![スクリーンショット 2018-12-07 13.13.01.png](https://qiita-image-store.s3.amazonaws.com/0/46046/f219cd0b-aff4-5052-fe2f-1d346075c079.png)

左側のメニューから、AWS marketplaceを選択します。

![スクリーンショット 2018-12-04 16.57.04.png](https://qiita-image-store.s3.amazonaws.com/0/46046/01feb02f-140e-9b2c-8432-cb74b1ef6b7f.png)

[選択]をクリックします。

![スクリーンショット 2018-12-07 9.41.17.png](https://qiita-image-store.s3.amazonaws.com/0/46046/c737e4cb-c930-69b4-87aa-9f0e18a1a1ee.png)

[continue]をクリックします。

![スクリーンショット 2018-12-07 9.42.50.png](https://qiita-image-store.s3.amazonaws.com/0/46046/ab76f5c6-8a36-c7f2-ad11-c19056fc43f0.png)

作成するインスタンスタイプをチェックして[確認と作成]を押します。

![スクリーンショット 2018-12-07 9.44.39.png](https://qiita-image-store.s3.amazonaws.com/0/46046/6c74424a-45e0-d489-207b-ca702f58a0cb.png)

そのまま[作成]をクリックしてはいけません。

SSHがワールドワイドに解放されてしまいます。

また、セキュリティグループ(ファイヤーウォール)名は、後から変更できますが、「説明」が変更できないのです逆だろ！って思うんですがそうなってるので仕方ありません。

なのでここで修正します。
(日本語は使えませんの注意、ここでエラーは出ませんが最後に怒られます)

セキュリティーグルプの編集をクリックします。

![スクリーンショット 2018-12-07 9.47.32.png](https://qiita-image-store.s3.amazonaws.com/0/46046/0241b894-bf70-b637-baa1-7ddfc24e5a48.png)

ソースのプルダウンで、カスタム又はマイIP(今接続してるIP)を選択します。
必要に応じて、ルールを追加します。
HTTPとHTTPSを追加してみました。


![スクリーンショット 2018-12-07 13.56.09.png](https://qiita-image-store.s3.amazonaws.com/0/46046/0bf1eecb-3c84-db20-ef6b-f94f2eeeaea8.png)

[確認と作成]を押します。


![スクリーンショット 2018-12-07 13.58.16.png](https://qiita-image-store.s3.amazonaws.com/0/46046/195239b7-735e-399c-f1ed-7436ab068511.png)

ここで再確認して、作成をクリックします。

キーペアの作成ダイアログが開きます。

![スクリーンショット 2018-12-07 14.13.07.png](https://qiita-image-store.s3.amazonaws.com/0/46046/f235a2ab-65d9-b2c7-6084-8a7ef6795967.png)

ここで、キーのペア名をつけます(任意)

キーペアのダウンロードをクリックすると、秘密キーがダウンロードされます。
これは、保存して無くさない様にしてください。

キーペアをダウンロードすると、インスタンスの作成ボタンがアクティブになります。

インスタンスの作成をクリックします。

![スクリーンショット 2018-12-07 14.00.45.png](https://qiita-image-store.s3.amazonaws.com/0/46046/cdda0ab6-d3de-0bb2-af05-cf54c39a76ec.png)

![スクリーンショット 2018-12-07 14.01.18.png](https://qiita-image-store.s3.amazonaws.com/0/46046/46185813-2b21-932b-b370-edd26fa090fa.png)

これで作成されました。

(その２に続きます。)
LaravelをAPIサーバとしてしか使わない（ので不要なしくみを排除したい）

初版：2018.12.7

* laravel-5.7, php-7.2

## 対応

1. ルーティング調整
1. 不要ファイル削除
1. レスポンスをjsonに固定
1. Auth系いらない場合

## ルーティング調整

* webルート削除

   * `routes/web.php`を削除
   * `app/Providers/RouteServiceProvider.php`から`mapWebRoutes()`の実装と呼び出しを削除
   * `app/Http/Kernel.php`の`$middlewareGroups['web']`を削除

* apiルートのprefix消す

   * `app/Providers/RouteServiceProvider.php`の`mapApiRoutes()`内、`prefix('api')`を`prefix(null)`にする


## 不要ファイル削除

* Controllers
    * `app/Http/Controllers/Auth/*` すべて削除

* frontend系
    * `package.json`
    * `webpack.mix.js`
    * `public/css/app.css`
    * `public/js/app.js`
    * `public/svg/*`
    * `resources/js/*`
    * `resources/sass/*`
    * `resources/views/*`
        * viewsは空にして、`resources/views/.gitkeep`でも入れとく

* Middleware
    * `app/Http/Middleware/VerifyCsrfToken.php` * `Kernel.php`でのクラス名指定も削除
    * `app/Http/Middleware/EncryptCookies.php` * 同上削除
    * `app/Http/Middleware/RedirectIfAuthenticated.php` * 同上削除


## レスポンスをjsonに固定

`Request`クラスを上書き

```php
<?php
/**
 * always json
 * - public/index.phpでRequestクラスを直接書き換え
 * - 以下は入れ替わってるのを確認
 *    - `request()`
 *    - `\Illuminate\Support\Facades\Request::getFacadeRoot()`
 *    - DI: `function hoge(Request $req) {}`
 * ほかになにか使われ方あったっけ..
 */
namespace App\Http;

class Request extends \Illuminate\Http\Request
{
    /**
     * override
     */
    public function expectsJson()
    {
        return true;
    }

    /**
     * override
     */
    public function wantsJson()
    {
        return true;
    }
}
```

```diff:/public/index.php
 $response = $kernel->handle(
-    $request = Illuminate\Http\Request::capture()
+    $request = \App\Http\Request::capture()
 );
```


## Auth系いらない場合

* 削除
    * `app/Http/Middleware/Authenticate.php`
    * `app/Providers/AuthServiceProvider.php`
    * `config/auth.php`

* 修正
    * `config/app.php` でAuthServiceProviderを削除

    ```php
        // App\Providers\AuthServiceProvider::class, // Removed
```

* `app/User.php` をどうにかする
    * Auth系の依存をはずす
    * `config/channels.php`も調整するか、使って無ければコメントアウト
Javaメモ(標準クラス)length

Java 標準クラス 簡単メモ
　文字数を数えるメソッド
　【length】
　　
　　使い方：変数 = String変数.length();
　　※変数に落とし込まなくてもそのまま表記することも可能

　　//ex)

```java
public static void main(String[] args){
//String変数wordにABCDEFGHIを格納　
String word = "ABCDEFGHI";
　　
//int変数countWordに文字数の長さをひっぱってくる
int countWord = word.length();

//int変数を表示
System.out.println(countWord);

//直接表示
System.out.println(word.length());
}
```
　　※表示結果※
　　　9
　　　9
Visual Studio 2017 Release ビルドでデバッグするぜ

プロパティにいくつか設定をするだけで有効になるらしい。

## Summary

* **元々、リリースビルドでのみ発生するバグのデバッグのための機能**
* **デバッグビルドのCallStackやブレイクポイントが使える**
* **パフォーマンスはデバッグビルド程落ちない**（oFでデバッグビルドすると結構遅いことがあるが、この設定では60fpsが割とでている※個人的所感）
* **本番で利用する場合は、この設定を戻してビルドすることになる。**(ちとめんどいが、ReleaseとDebugビルドを行き来するよりかはマシでは）

## How to setup([reference](https://docs.microsoft.com/en-us/previous-versions/fsk896zz(v=vs.140)))


**1. `C/C++ > General`で以下を変更。**

* Debug Information Format -> C7 compatible (/Z7) か Program Database (/Zi)
![01.png](https://qiita-image-store.s3.amazonaws.com/0/104234/8ca97f1d-d87a-97ea-3104-3e4afa9e8303.png)

　

**2. `Linker > General`で以下を変更。**

* Enable Incremental Linking -> No (/INCREMENTAL:NO)

![02.png](https://qiita-image-store.s3.amazonaws.com/0/104234/7f509181-c1d9-6f1f-1e32-40ab156fe696.png)


　

**3. `Linker > Debugging` で以下を変更**

* Generate Debug Info -> Yes (/DEBUG)
![03.png](https://qiita-image-store.s3.amazonaws.com/0/104234/ce64fb62-fb81-da67-f266-20e073b30a0b.png)


**4. `Linker > Optimization`でそれぞれ以下を変更**

* References -> /OPT:REF
* Enable COMDAT Folding -> /OPT:ICF.
![04.png](https://qiita-image-store.s3.amazonaws.com/0/104234/8d27cce2-4fd3-a589-a0d9-e2514a0a593d.png)
agora.io クイックスタートガイド WebSDK用(バージョン3)

#概要
この記事は以下の公式ドキュメントを翻訳したものです。
[公式ドキュメント(英文)](https://docs.agora.io/en/Video/start_call_web?platform=Web)


##STEP1. Agora Accountの作成とApp IDの取得
1. https://sso.agora.io/signup?source_id=3 からデベロッパー登録をします
2. 画面左側のナビゲーションメニューの ![01.auth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386074/f30012a6-8430-0c63-ebac-f3c3b5c9088d.png) を選択して **Project Management** ページを開きます。
3. **Create** を選択します。<img width="864" alt="02.auth.jfif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386074/67d2a8b5-cd93-9559-534b-27a00918f1ed.jpeg">
4. プロジェクト名を入力し、認証方法は **APP ID** を選択して下さい。<img width="395" alt="auth03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386074/69ab5ea6-631d-49dd-d7f6-6ec7cbff7a25.png">
※APP ID + APP certificate + Token (recommended) を利用する場合の手順については、[agora.io の Security Key について](https://qiita.com/v-cube/items/c43dd8b0241f03fedc1d)をご参照下さい。

5. **Submit** を選択すると **App ID** が発行されます。<img width="1010" alt="auth04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386074/39481145-8c50-336d-2eb2-270caddf1966.png">

##STEP2. Agora Web SDKの取り込み
以下の３通りの方法があります。
**Case1.npm経由**
1.以下のコマンドを実行

```
$ npm install agora-rtc-sdk
```
2.以下のコードを追加

```javascript
import AgoraRTC from 'agora-rtc-sdk'
```

**Case2.CDN経由**
1.以下のコードを追加

```javascript
  <script src="http://cdn.agora.io/sdk/web/AgoraRTCSDK-*.*.*.js"></script>
```

**Case3.SDKファイルを取得**
1.[ダウンロードページ](https://docs.agora.io/en/Agora%20Platform/downloads)からWebSDKをダウンロードします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/d8e406fc-0afe-a4b5-8507-a8567f78958a.png" width="60%">
2.AgoraRTCSDK-*.*.*.jsをプロジェクトフォルダにコピーします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/422a7360-61d5-9c0d-dc64-f20ae30b90ea.png">
3.SDKファイルの参照を追加します。
<img alt="web_sdk_reference.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/877588c1-d960-c45a-b2f9-0333b9e42aa6.png" width="70%">

##STEP3.実装
SDKに内包されているサンプルか、[APIドキュメント](https://docs.agora.io/en/Video/API%20Reference/web/index.html)を参考に実装を開始します。

##関連リンク
・[APP ID、Channel ID、User ID(uid)とは何ですか？](https://vcube-support.zendesk.com/hc/ja/articles/900001528466)
・[クイックスタートガイドはありますか？](https://vcube-support.zendesk.com/hc/ja/articles/360034193232)
・[APIリファレンス、SDKはどこからダウンロードできますか？](https://vcube-support.zendesk.com/hc/ja/articles/360034192992)
・[サンプルコードのリポジトリはどこにありますか？](https://vcube-support.zendesk.com/hc/ja/articles/360034562711)



---
##最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=b247f89859437589b0a6)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=b247f89859437589b0a6)
---
AWS Lambdaのrubyランタイムでalexaスキル実装

## はじめに
こんにちは。
日々の業務ではインフラをやっています@hayaosatoです。

最近趣味でアレクサスキルの開発を始めました。
まだまだ勉強中ですが、アレクサスキルはエンドポイントにAWS Labmdaを設定でき、非常にお手軽です。
ところで、この間の[re:Invent2018にてAWS Lambdaのランタイムにrubyが追加](https://aws.amazon.com/jp/blogs/compute/announcing-ruby-support-for-aws-lambda/)されましたね!
とういう事で今回はアレクサスキルをAWS Lambdaのrubyランタイムにて実装していきたいと思います！

## 作るもの
最小構成のアレクサスキルとして、アレクサに「おはよう」と言ったら今日の18時の天気と運勢を教えてくれるスキル

毎朝出かける前に天気と運勢を知りたいのですが、それらが一つになったスキルを作ってしまおうと思います。
また、朝なのでそんなにアレクサと会話するつもりもないですw
こちらが呼びかけたら答えてくれて、そのまま会話終了となるようにしていきます。
もっと会話を楽しみたいという方はアレクサのサンプルも豊富にあるので[そちら](https://developer.amazon.com/ja/docs/custom-skills/use-the-alexa-skills-kit-samples.html)をご覧いただければと思います。

それでは早速作っていきます。

## データ構造
アレクサは指定のデータ形式(JSON)のオブジェクトを渡せば答えてくれるので、今回は以下の
データ構造をアレクサに送るようにします。
アレクサに返すデータ構造としては以下のhashを返すようにしました。

```
{
  'version' => '1.0',
  'response' => {
    'outputSpeech' => {
      'type' => 'PlainText',
      'text' => "おはようございます"
    },
    'shouldEndSession' => true
  }
}
```
これが返ればひとまずはOK
それぞれの項目を説明すると、
### version
アレクサに返す応答のバージョン。
とりあえず `1.0`で
### response
アレクサが何を返す(話す)のかをmapで定義します
#### outputSpeech
アレクサに何か喋らせたい場合、こちらによってアレクサに喋らせたい内容をmapで定義します。
##### type
出力される音声のタイプを定義します。ひとまず `PlainText`で。
##### text
実際にアレクサに喋らせる文書を定義します。
#### shouldEndSession
アレクサが応答した後に会話を終わらせるか、そのまま会話を継続させるかを定義します。
今回はアレクサが一回喋って終わりでいいので `true`にしておきます。

という感じで実装しました。
APIなどの実装の説明は割愛させていただきます。
ソースコードは[こちら](https://github.com/hayaosato/good_morning_alexa)

## alexa設定
今度はAmazon開発者コンソールにてアレクサ側の設定ですが、設定フローとしては

- アレクサの呼び出し方を決める(今回は `おはよう　アレクサ`)
- カスタムインテントの設定(今回は使用しないのですが、アレクサへの入力を扱う場合にはこちらが利用できるそうです)
- アレクサとAWS Lambdaの連携
- アレクサスキルのビルド(上記設定の反映)

となっています。
ざっとフローのスクショを貼っておきます。
また、基本的には困ることはないかと思うのですが、アレクサとAWS Lambdaの連携では先にAWS LambdaにアレクサのARNを登録しておかないとアレクサにAWS LambdaのARNを登録できませんでした。

アレクサスキル作成
<img src=https://qiita-image-store.s3.amazonaws.com/0/312728/b744eeee-111d-9bad-39ea-7b82161fb5c1.png width=50%>
<img src=https://qiita-image-store.s3.amazonaws.com/0/312728/6765e707-cb5a-ec98-5448-0546433b55e9.png width=50% height=50%>
スキルの呼び出し名の設定
<img src=https://qiita-image-store.s3.amazonaws.com/0/312728/c48505e8-4c44-fdf5-a11d-1797f0da4f4a.png width=50% height=50%>
カスタムインテントの設定
<img src=https://qiita-image-store.s3.amazonaws.com/0/312728/6046c72e-2540-7257-cbdb-1da06dd3b022.png width=50% height=50%>
lambdaとの連携もして、全て通ればOK
<img src=https://qiita-image-store.s3.amazonaws.com/0/312728/55e3bba7-cfb4-711a-8ed5-78075a0cf91a.png width=50% height=50%>


## 完成
アレクサスキルの開発コンソールではアレクサスキルをテストすることもできます。
無事できました！
<img src=https://qiita-image-store.s3.amazonaws.com/0/312728/c52fb10c-1b8a-0c48-ca4d-590ec3874425.png>

## 終わりに
アレクサスキルはAWS Lambdaによってお手軽にかけます。
また、AWS Lambdaにカスタムランタイムが提供されたので、おそらく全ての言語でアレクサスキルが開発できると思います。
皆さんも是非試してみてください。

## 参考
- https://developer.amazon.com/ja/alexa-skills-kit/training/building-a-skill
- https://developer.amazon.com/ja/docs/custom-skills/request-and-response-json-reference.html
- https://qiita.com/zono_0/items/57247bed70dbe2b3ce28
- https://qiita.com/yamaryu0508/items/57c0aea47f97a6b76335
認知科学に基づく「効果的なデモ」のヒント

2018年社内アドベントカレンダー向け記事

# イントロ
- 技術者はデモをする機会も多い。
- 最近、効果的なデモをするための方法をまとめたのでご紹介。

[認知科学に基づく「効果的なデモ」のヒント](https://www.slideshare.net/ToshihikoYamakami/a1812talk-hintsfordemofromcognitivescience181207a)　(slideshare)

- マークダウンの練習にマークダウン版は以下

# 「効果的なデモ」のヒント
1. 顧客の気を散らさない
- 視覚的効果を重視
- 顧客に「自分ごと」としてとらえさせる
- 人間は親しんで短時間に処理できるものが気持ちいい

# 1. 顧客の気を散らさない
- 最短手順で操作
- 流れるようにいいテンポで操作する（テンポがずれたときは口頭
で補足して注意をそらす）
- ミスタイプしない(思い付きでタイプせず、練習しておく)
- 操作ミスによるやり直しをしない（リハーサルと違うことをしな
い）
- 属性の設定とか編集（再配置、リサイズ）はしない
- 編集操作は本人以外には認知的負荷がかかる
- デフォルト設定をデモ向きに変えておく: デモに使うテキストの
色やフォントは予めシナリオに沿って設定しておく（100 ポイン
ト、オレンジ、など）

# 2. 視覚的効果を重視
- 人間は視覚的情報処理がメイン:「視覚的気持ちよさ」は重要
- ケーキとかキャンディとか食欲をそそるカラフルな画像はよい
    - 明るい画像を使う
    - 笑顔はポジティブな印象、赤ん坊の笑顔は警戒を解く
    - 視覚効果の例: ノルウェイのベンチャー企業がデモで使ったのはサンバカーニバル動画、美人で肌の露出が多く扇情的でシーン切り替えが多く視覚的効果が高い
- 配色を考える
    - 読みやすい色
    - 画像の上に文字を載せるなら予め配色を考える（IKEA の黄色に青
文字とか見やすい）
    - 予めごみごみしていない空とか海とか草原とかの上に文字を載せる
（適切な色）
   - 赤は強調色だが強すぎる。全体の配色に注意する

# 3. 顧客が「自分ごと」としてとらえられるようにする
- デモとはいえネーミングは重要
    - demo, test, untitled とかを避ける
    - イタリアの広告なら、フォルダもRome Ad, とかMilano Sale とか
使う
    - マーキーテキストもBuy Now! Coming Soon! Premium Sale! などコンテキストに合うものを使う
- 非日本人なら日本語には違和感がある。わからない文字が出てく
ると異邦人感を感じる。相手の母語を使う。
    - ムンバイの商談ならマラーティー語（マハーラーシュトラ州の公用
語）
    - やりすぎるとスペルミスとかして台無しにするので要注意
- 顧客がサービスを使ったり、顧客自身が自分の顧客に売るシーン
を想像させる
  - 顧客は自分のビジネスに配慮してくれるパートナーが好き

# 4. 人間は親しんで短時間に処理できるものが気持ちいい
- 海外顧客なら、日本人や日本風景より相手国の女優や風景のほう
が短時間で認識できるので気持ちいい
- 使うなら自社のロゴより顧客のロゴ、自社の製品より顧客の製品
- 自分にとって毎日見ているデモ画面は気にならないが初めて見る
人にはごみごみした画面は処理に時間がかかる。不要なアイコン、
フォルダは見えないところに動かしておく
- 相手の会社の社長の写真を使うのはやりすぎだが心構えとして
はその方向
- カスタマイズは説得の基本。ただし別のデモで露出しないように
注意

# プロセス
- 世の中には「目的」と「手段」がある
    - デモは「手段」。目的を達成しなければ意味がない
    - 「動けばいいんだろう」というわけではない
- 目的の定義: まずデモの目的をチームで共有
- デモのプロセス
    - 見せる相手の理解: 見るのは「誰」
    - 相手の課題、問題を理解
    - 相手の課題、問題を解決するポイント
    - そのポイントを訴求するテーマ設定
    - テーマを実現するストーリー
   - 効果的なデモの計画と当日実行

# まとめ
- 認知科学に基づく「効果的なデモ」のヒント
    - 顧客の気を散らさない
    - 視覚的効果を重視
    - 顧客に「自分ごと」としてとらえさせる
    - 人間は親しんで短時間に処理できるものが気持ちいい
- デモは手段。手段は「目的」を満たさなければ意味がない
- 現代は関心経済: 関心が希少資源
    - 情報爆発で単位情報あたり関心は激減
    - 相手の関心を得る技法は人生全般に有用

# 補足: 注意
- 凝りすぎて間違えると逆効果
    - 他国の言語や地名をスペルミス
    - 顧客会社の関係者の写真を取り違えると逆効果
- 緊張しすぎない
    - 考えすぎたり計画しすぎたりすると緊張してうまくいかない
    - 心の余裕が大事

# 参考文献
- R. Cialdini: Influence
- D. Kahneman: Thinking, Fast and Slow
- ホワイトペーパーはタイトルが「命」！タイトル付けで注意すべき
点とは？　https://ferret-plus.com/7659 　（2017 年6 月)
AWS Resource Access ManagerでShared VPCを試す(組織外アカウント編)※組織外アカウントに対しはシェアできない

##はじめに
RAMでのshare作成画面に、「Allow external accounts」チェックボックスがあるため、組織外のアカウントに対してVPCを共有できるか確認しましたが、結論としてはShared VPCは2018/12/7現在未サポートでした。

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-sharing.html
>
Limitations
The following limitations apply to working with VPC sharing:
Owners can share subnets only with other accounts or organizational units that are in the same organization from AWS Organizations.

例えばTransit Gatewayは、組織外のアカウントへの共有も可能です。
https://docs.aws.amazon.com/vpc/latest/tgw/tgw-transit-gateways.html
>
(Optional) For Principals, add principals to the resource share. For each AWS account, OU, or organization, specify its ID and choose Add.
For Allow external accounts, choose whether to allow sharing for this resource with AWS accounts that are external to your organization.

組織内のアカウントに対しての共有は以下に記載してます。
https://qiita.com/atsumjp/items/5e63b8cd88956d42aeeb

##手順
###シェア元
最初は、Share TypeでSubnetを選択し、共有するSubnetの指定なしで、Resource Access ManagerのCreate resource shareの画面で「Allow external accounts」にチェックをします

>
Allow external accounts
Indicate whether you'd like to allow AWS accounts from outside your AWS organization to be added to this resource share. If this option is disabled, accounts outside your organization can not gain access to the resources in this resource share.

組織外のAWSアカウントのIDを入力します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/0806e62e-52d5-e964-a3e1-06da0d19f26e.png)

Principalが「Account(External)」と表示され、Statusが「Associating」になります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/a57b229a-6dfe-e72a-5ac3-7550a47de25f.png)

###シェア先
Resource Access Managerの画面を開くとinvitationが届いています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/59fc8bc9-1fc6-0fe6-de7e-fcef3eddb9ff.png)

Statusが「Pending」になっています
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/13a54bad-9d27-3b15-a7f4-61c3a61a7483.png)

Acceptします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/3aa2f30c-9c45-6229-2229-b864f1bcc509.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/14fcdebd-06f8-820d-b593-abe744979e67.png)

###シェア元
Associatedになります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/159c7037-96d2-a8f2-6caa-d5157e331bdd.png)

###シェア元
ただし実際にSubnetをシェアしようとするとできません

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/fb1e7dde-6191-8607-f9d1-ec57815395a2.png)

##お約束
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
インラインscriptのdefer, async属性は無効

以下のように、インラインのscriptにもdefer属性付ければ、headでdefer属性付けたscriptより後に実行してくれること期待したけど、ダメでした。

```js:functions.js
function awesomeFunction (selector) {
  document.querySelector(selector).innerHTML = 'awesome!!';
}
```

```html
<html>
  <head>
    <script src="functions.js" defer></script>
  </head>
  <body>
    <div id="app"></div>
    <script defer>
      awesomeFunction('#app');
    </script>
  </body>
</html>
```

インラインscriptのdefer, async属性は意味無しだそうです😢
https://developer.mozilla.org/ja/docs/Web/HTML/Element/Script#Attributes

おとなしく`document.addEventListener('DOMContentLoaded', ...`書くしかない

```html
<html>
  <head>
    <script src="functions.js" defer></script>
  </head>
  <body>
    <div id="app"></div>
    <script>
      document.addEventListener('DOMContentLoaded', function () {
        awesomeFunction('#app');
      });
    </script>
  </body>
</html>
```
C++ Builder XE4 > Clipboard > クリップボードへ画像を送り、クリップボードから画像ファイルへ保存

```txt:動作環境
C++ Builder XE4
```

### 関連

- [C++ Builder XE4 > TeeChart > TEdit付きのChart1をクリップボードへ送る | HDC dc = GetDC(Panel1->Handle); | ClipBrd.hpp](https://qiita.com/7of9/items/3ece1dfb10d1b3c9c34f)

### 処理概要

- TeeChartのChart1をクリップボードへ送る
- クリップボードから画像ファイル(.bmp)へ保存する

### 参考

- [Re: Saving Clipboard image to file in code](http://www.festra.com/wwwboard/messages/13169.html)
    - Delphiコード

### フォームデザイン

![2018-12-07_13h27_23.png](https://qiita-image-store.s3.amazonaws.com/0/32870/de10a008-ebc9-c418-0759-64668df8f87b.png)

### 実装

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <VCLTee.Chart.hpp>
#include <VCLTee.TeEngine.hpp>
#include <VCLTee.TeeProcs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TChart *Chart1;
	TButton *Button1;
	TImage *Image1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <ClipBrd.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	// 1. Clipboardへ
	TBitmap *lBmp = new TBitmap();
    try {
		lBmp->SetSize(Chart1->ClientWidth, Chart1->ClientHeight);
		HDC dc = GetDC(Chart1->Handle);
		BitBlt(lBmp->Canvas->Handle, 0, 0, Chart1->ClientWidth, Chart1->ClientHeight, dc, 0, 0, SRCCOPY);
        Clipboard()->Assign(lBmp);
    } catch (...) {
	}
	delete lBmp;

	// 2. Clipboardから画像ファイルへ保存
	if ( Clipboard()->HasFormat(CF_BITMAP) ) {
		Image1->Picture->Assign(Clipboard());
		Image1->Picture->SaveToFile(L"clip.bmp");
	}
}
//---------------------------------------------------------------------------
```

### 動作例

1. Button1を押す

clip.bmpが.exeファイルと同じフォルダに保存される。

clip.bmp (Windowsフォトビューアーで開いた状態)
![2018-12-07_13h31_34.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cbb94d11-d07c-86a9-5295-70c6748c0db0.png)
PepperでローカルIPを固定した話



### 導入
Pepperのアプリ開発スペース、アトリエ秋葉原では30~40体のPepperが存在している。普段は個体ごとにラベル付(atelierXX, P4b0Xなど)を行い識別しているが、個体ごとにその数値でもってIPを固定できると便利じゃね???
という意見から試行錯誤してなんとか固定できたので参考までに。

---

### 手法
DHCPサーバから固定したいクライアント端末のMACアドレスを用いてIP振り分けの予約を行う

---
### YAMAHA RTXシリーズ
家庭向けのルータではあまり見かけないYAMAHAだが、業務用のルータとしてはとても有名らしい。YAMAHAのルータを組み合わせると、小規模~大規模なネットワークの構築が可能になる。terminalからルータにアクセスして様々な詳細設定を行うことが出来る。アトリエ秋葉原ではこのシリーズのルータを採用している。

---
### 通信方式
* telnetについて
ネットワーク内のクライアントとサーバのやり取りをするアプリケーション層プロトコル。
基本的にはTCPポート23番を使用する。通信内容を暗号化せずに平文のまま送信するため、セキュリティ面での問題が存在する。

* SSHについて
telnetの問題点を改善したプロトコル。パスワード情報などすべてのデータが暗号化されて送信される。
SSHにはversion1とversion2の認証方式があるが現在はverison2の方が推奨されている。

---

### DHCPサーバ
DHCP(Dynamic Host Configration Protocol)は、LAN内などのネットワークでクライアント端末に対して未使用のIPアドレスを振り分ける機能
**1つのネットワーク内でDHCPサーバが複数ある場合は不具合のもとになるので、基本的にはサーバは一台で管理する**

---

### コマンド
* 今回使用したコマンドを紹介する


| コマンド | 説明 |
|:---: | :---:|
| dhcp service server | DHCPサーバとして機能させる |
| dhcp scope 1 192.168.100.XXX - 192.168.100.XXX/24 | DHCPサーバとして割り当てるIPアドレスのスコープを設定 |
| dhcp scope bind 1 192.168.100.XXX mac_address | DHCP予約アドレスの設定 |
| dhcp scope lease type 1 bind-priority | DHCPサーバのIPの振り分けの予約を優先 |

> http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/dhcp/dhcp_server_concept.html

---
### 確認
* 予約を行ったPepperのIPを確認<br>
![146.png](https://qiita-image-store.s3.amazonaws.com/0/216564/ca9c3bc3-9dd1-2273-134c-d9a94144ca28.png)<br>
![146view.png](https://qiita-image-store.s3.amazonaws.com/0/216564/f2b4cf57-4e09-1cd4-9cc3-bfb0da36af1d.png)


### 余談

##### ハマったこと
IPの固定にはPepperの機体のmacアドレスじゃなくて、wifiの方のmacアドレスで予約設定を行わないとIP予約が効かない。そしてルータ側でmacアドレスの識別子も確認してあげて、その情報も盛り込んで予約を行うことで初めて固定が実現できる。ネットワークに詳しい方からしたら当たり前と怒られそうｗｗｗ

##### 一般的なローカルIPの固定の手法

* 一般的なlinux端末からは`/etc/network/interfaces`から設定を書き加えて行う
* PepperはGentooベースのGNU/linuxディストリビューションであるから管理者に昇格して上記のファイルを編集したいがNAOqi2.5からSSHを使用してのnao以外のユーザー、つまりrooユーザーへの昇格が基本的に認めれていない。(NAOだと可能)<br>以下の記事ではこの手法を用いての固定を行っているが、おそらくPeperのNAOqiのversionが違うのではないかと思われる。<br>
http://rohifu.hatenablog.com/entry/2017/07/25/115451
LaravelとVue.jsを使って開発するための初期設定

# LaravelとVue.jsを使ってプロジェクトを作成してみる

どちらも便利なフレームワークなんだけど、共存させたらどの程度便利なのか、それとも不便になるところがあるのかを確認してみたいと思ったので、便利だったときのために、その手順をメモ。

## Laravelでプロジェクトを作成

```laravel-install.sh
$ composer create-project "laravel/laravel" laravel-vue
```

## Vue.jsのインストール

最近のLaravelには、最初からVue.jsがpackage.jsonに入っているので、インストールは下記コマンドだけ。

```vue.js-install.sh
$ cd laravel-vue
$ cat package.json | grep vue
        "vue": "^2.5.17"
$ npm install
```

## Vue.jsのコンポーネントの準備

```vue.js-preparation.sh
$ npm run dev
$ ls public/js/app.js
$ ls public/css/app.css
```

## assetの監視設定

これをしておくことで、assetを変更すると自動的にコンパイルしてくれるようになる。
ただし、動き続けるので、ターミナルは1つ犠牲に･･･

```watch-script.sh
$ npm run watch
```

## Bladeテンプレートの修正

- welcome.blade.php
    1. \<head\>内
        - \<meta name="csrf-token" content="{{ csrf_token() }}"\>
        - \<link rel="stylesheet" href="{{ mix('/css/app.css') }}"\>
    1. \<body\>内
        - \<div id="app"\>
          \<example-component\>\</example-component\>
          \</div\>
    1. \<body\>最終行
        - \<script src=" {{ mix('js/app.js') }} "\>\</script\>
          ※ Laravelをディレクトリー配下に設置する場合は、mix()だとおかしなことになるので、その場合は、asset()を使う。

## Laravelのデバッグ用のサーバーを起動

ローカルサーバーを立ち上げる。
ただし、動き続けるので、ターミナルは、もう1つ犠牲に･･･

```start-server.sh
$ php artisan serve
```

## Vue.js関連ファイル

- JS<BR>
  resources/js/
- SASS<BR>
  resources/sass/

## 最後に

色々書いたものの、ターミナルを2つも占有してしまう(npm run watch/php artisan server)ことを考えると、Dockerで専用の環境を提供した方がいろいろ良さそうな気がしてきた･･･

# 変更履歴

- 2018/12/12: mix()の問題を見つけたのでコメントを追加。
ASM/C/C++ coding standards

ARM Trusted Firmware Coding Guidelines
https://github.com/ARM-software/arm-trusted-firmware/wiki/ARM-Trusted-Firmware-Coding-Guidelines

Procedure Call Standard for the ARM® Architecture
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042f/IHI0042F_aapcs.pdf


Getting started with CMSIS
https://www.doulos.com/knowhow/arm/CMSIS/CMSIS_Doulos_Tutorial.pdf

Basics of the Cortex MCU Software Interface Standard: Part 1 - CMSIS Specification
https://www.embedded.com/design/programming-languages-and-tools/4438667/Basics-of-the-Cortex-MCU-Software-Interface-Standard--Part-1---CMSIS-Specification-

Guidelines for writing efficient C/C++ code
https://www.embedded.com/design/mcus-processors-and-socs/4006634/Guidelines-for-writing-efficient-C-C--code
PyCharmでPyObjCライブラリの自動補完は今できない

2018/12/7現在はPyObjCに関する関数を自動補完できない．

# PyObjCって
Objective-cをpythonで扱えるライブラリ（？）
[Introduction - PyObjC - the Python to Objective-C bridge](https://pyobjc.readthedocs.io/en/latest/)

Apple Developerで提供されるAppKitとかをPythonで利用できる．
つまりMacのウィンドウ操作とかをPythonでできる．

例えば：

```python
# アクティブ(最前面)ウィンドウの名前を表示する
from AppKit import NSWorkspace
activeWindow = NSWorkspace.sharedWorkspace().frontmostApplication()
print(activeWindow.localizedName())
```

# 自動補完(Autocomplete)が使えない
PyCharmの魅力の1つは，ライブラリの関数名を途中まで打つと候補が表示される＆補完できること．

例えばosライブラリをインポートしておいて「os.pathl」と打てばos.PathLike()を補完できる．
入力が小文字でも直してくれる優しい自動補完．

しかし，<b>PyObjCライブラリでは自動補完してくれない</b>．

それどころか上のコード例だと<b>AppKitの存在すら教えてくれない</b>．
当然from AppKit import NSWorkspaceと打っておいても，エディタからは「そんなモジュールは無い」と怒られ続ける（<b>でもちゃんと動く</b>）．

ちなみにAppKitだけでなくQuartzやFoundationも全滅．
正しく書けば動くので，自動補完なしで頑張るしかない…

# 問題は知られている
##PyObjCでは既に議論されていた
どうやらPyCharm側に問題があるとか．
[PyCharm issues with PyObjC - bitbucket/Ronald Oussoren/pyobjc](https://bitbucket.org/ronaldoussoren/pyobjc/issues/212/pycharm-issues-with-pyobjc)

※#211で問題提起され，この#212で課題として出された？

##PyCharmコミュニティにも投稿されている模様
[Autocomplete for PyObjC in PyCharm - IDEs Support (IntelliJ Platform) | JetBrains](https://intellij-support.jetbrains.com/hc/en-us/community/posts/360001814119-Autocomplete-for-PyObjC-in-PyCharm)

>I have a number of reports that PyCharm autocomplete does not work for PyObjC (Python bindings for Apple Objective-C frameworks on macOS) and I wonder what I can do to ensure working autocomplete for my users.  
google翻訳：PyChartオートコンプリートがPyObjC（MacOSのApple Objective-CフレームワークのPythonバインディング）で動作しないという報告がいくつかありますが、私は自分のユーザーのオートコンプリートを確実にするために何ができるのだろうかと思います。

##JetBrainsのissueにも投稿されている
[Provide support for pyobjc -  JetBrains Bug & Issue Tracker YouTrack 2018.3](https://youtrack.jetbrains.com/issue/PY-3154)

4年前の投稿者も同じ問題を抱えていたのだろうか？
li要素が増えた時にclassを追加せずに修正する

htmlで下のようなマークアップをを書く時に

エビデンス
↓
カニデンス
↓
タコデンス
↓
イカデンス


```
<ul>
<li>エビデンス</li>
<li>カニデンス</li>
<li>タコデンス</li>
<li>イカデンス</li>
</ul>

<style>
li:not(:last-child):after{
    content: "↓";
    display: block;
}
</style>
```

「:not(:last-child)」を挟むことで、最後の「li」要素以外に矢印が付くようになる。
こうしておけば、今後の更新例えば、「ウニデンス」や「タイデンス」などの追加があった場合でも、classの付け替えをせず、htmlに要素を追加するのみで完結できる。
ExcelVBAに関する覚え書き

Excel VBAを使ってマクロを作成したのですが、以前作成した際のことをすっかり忘れていたのでメモ。

○変数の宣言
Dim 変数名 As データ型

```ruby:例
Dim objSheet As Worksheet
objSheet = ThisWorkbook.Worksheets("Sheet1")

Dim str As String
str = ""
```

○セルの内容を取得
Cells(縦軸, 横軸).Value
Range(座標).Value

CellsとRengeでは座標を指定する順番が逆になることに注意。

```ruby:例
Dim valueCell As String
valueCell = objSheet.Cells(1, "A").Value

Dim valueRange As String
valueRange = objSheet.Range("A1").Value
```

○条件分岐
If 条件式 Then
　処理1
ElseIf 条件式 Then
　処理2
Else
　処理3
End If

ほぼJavaと同じ。細かい部分を忘れやすいのでメモ。

```ruby:例
If str = "○" Then
    result = "1"
ElseIf str = "×" Then
    result = "2"
Else
    result = "3"
End If
```

○繰り返し
Do
　処理
Loop

```ruby:例
Do
    Dim str As String
    str = objSheet.Range("A1").Value

    If str = "" Then
        Exit Do
    End If
Loop
```

○その他
ThisWorkbook　コードの記述されているブックを指定する
Worksheets(シート名)　指定したワークシートをWorksheet型で取得する
CStr(値)　指定した値をString型で取得する
Githubでリリースする一覧を出す

Githubを使っている場合限定です。
リリースPRを作るときに便利です。

以下コマンドをうつ

```
git fetch
git log --merges --first-parent --reverse --pretty=format:'- [ ] %h %B\n' remotes/origin/master..remotes/origin/develop
```

出力結果

```
- [ ] 35d29948 Merge pull request #1 from feature/hogehoge

hoge機能の追加

- [ ] 35d29948 Merge pull request #2 from feature/fugafuga

fuga機能の追加

```

これをGithubのリリースPRにコピペして運用しています
ブロックチェーン上の情報をGETする方法（gethの場合）

#はじめに
初投稿です。
今回は、BCからデータを吸い取る方法を載せます。

#コード
多分見れば、分かりますw
実行環境として
Gethを使用しています。
ビットコインの場合はまた違うと思います。

```JavaScript:bcCheck.js
var Web3 = require('web3');
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));

var blockNumber = web3.eth.blockNumber;
console.log("blockNumber:  " + blockNumber);

for(var i = 0;i <blockNumber;i++){
  if(web3.eth.getTransactionFromBlock(i) != null){
    var getInputSlice = web3.eth.getTransactionFromBlock(i).input.substr(0,10);
    if(getInputSlice == "0x42f09166"){
      var getInput = web3.eth.getTransactionFromBlock(i).input

      console.log("getInput:  " + i  + ":  " + JSON.stringify(getInput));
    }
    console.log("getInput:  " + i  + ":  " + JSON.stringify(getInputSlice));
  }
}
```

#コード説明
ここでweb3でGethと接続する

```Javascript
var Web3 = require('web3');
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));
```
(web3.eth.getTransactionFromBlock(i) != null)でそのブロックにトランザクションがあるかどうかが分かる。

>トランザクションがないブロックにはinputがないため
ここで、(web3.eth.getTransactionFromBlock(i).input != null)と書くと、エラーが出る。



```JavaScript
for(var i = 0;i <blockNumber;i++){
  if(web3.eth.getTransactionFromBlock(i) != null){
    var getInputSlice = web3.eth.getTransactionFromBlock(i).input.substr(0,10);
    if(getInputSlice == "0x42f09166"){
      var getInput = web3.eth.getTransactionFromBlock(i).input

      console.log("getInput:  " + i  + ":  " + JSON.stringify(getInput));
    }
    console.log("getInput:  " + i  + ":  " + JSON.stringify(getInputSlice));
  }
}
```

#終わり
今回はこれくらいで終わりです。
分かりにくかったらすいません。
何か疑問点があれば、質問などしてくれたら返事します。
Authorizationヘッダーで認証が必要なPhoenixのRequestSpecについて

(この記事は[「fukuoka.ex Elixir／Phoenix Advent Calendar 2018」](https://qiita.com/advent-calendar/2018/fukuokaex)の7日目です)

昨日の記事は，@kobatakoさんの[「ソフトウェアルータでカオスエンジニアリング入門」](https://qiita.com/kobatako/items/2d6cade69a8456c74391)でした。


## はじめに
こんにちは。 @zuminです。
アドベントカレンダーと聞くと，クリスマスが近づいてきて今年ももう終わりかーという気持ちになりますね。
今年1年も一瞬で過ぎ去っていった感じがします。

今回は，PhoenixでRESTful APIを作成した場合などにRequestSpecを書く際，AuthorizationヘッダーにJWTなどを含む必要がある場合について書こうと思います。

## 動作環境
ExUnitの例はたくさん出てくると思うので，今回はESpecを例に進めていきます。
ただし，ExUnitでも `Phoenix.ConnTest` まわりは変わらないと思うので， `build_conn()` は同様に利用することができると思います。

- Elixir 1.7.4
- Phoenix 1.3.4
- espec 1.6.3
- espec_phoenix 0.6.10


## 内容
以下のような，curlでユーザーデータのリストがとれるようなWeb APIのRequestSpecをESpecで書き， JWT認証を行う必要がある場合を想定しています。

```shell
curl http://localhost:4000/api/v1/users \
  -H "accept: application/json" \
  -H "Authorization:Bearer TOKEN"
```

JWT認証の実装に関しては今回は触れませんが， @yujikawaさんの[Phoenix/ElixirでAPIのログイン機能を作成する(guardian・guardianDB)
](https://qiita.com/yujikawa/items/fe262eb98c5be713d8fb)が参考になると思います。


## テストコード例
```Elixir
describe "GET /api/v1/users" do
  context "is successful" do
    let :token do, "TOKEN"
    let :conn do
      build_conn()
      |> put_req_header("authorization", "Bearer #{token()}")
    end

    it do
      response = get(conn(), "/api/v1/users")
      expect(response.status)
      |> to(eq 200)
    end
  end
end
```

[Phoenix.ConnTest](https://hexdocs.pm/phoenix/Phoenix.ConnTest.html) の `build_conn()` でテスト用の `Plug.Conn` のRequest Fieldsを生成することができます。
この時に，`build_conn() |> put_req_header("authorization", "Bearer TOKEN")` (TOKENには任意の文字列が入ります) とすることで，Authorizationヘッダーを含んだ `Plug.Conn` を作ることができます。


## まとめ
Phoenixでテストを書くとき， `Plug.Conn` は `Phoenix.ConnTest` のヘルパーによって楽にAuthorizationヘッダーなどを含めることができます。

「認証」が絡むテストだ・・・。と身構えてしまうかもしれませんが，意外と簡単にテストを書くことができましたね。
それでは良いBDDライフを！



明日は，[「fukuoka.ex Elixir／Phoenix Advent Calendar 2018」](https://qiita.com/advent-calendar/2018/fukuokaex)の担当は @mocamocalandさんです。 お楽しみに！
ゲームQAという仕事の伝え方を個人的に考えてみた

##はじめに
　師走のこの時期、忘年会などで普段関わりが薄い人との交流が増える傾向にあるかと思います。そんな中、自分のお仕事について人に説明することの難しさ、というのを実感しています。思いの外サクッと理解してもらえる人と「QA?て、テスト?」と腑に落ちていない人とで
別れている印象です。

　これは別にゲームQAに限った話ではないかと思いますが、やはり自分の職業を正しく伝えられない、というのは寂しいもの。何より、そんな自分に歯がゆさを感じます。

　というわけで、ゲームQAという仕事はどう伝えればいいのか、というのを、自分が過去対面した2パターンをベースに考えていこうかと思います。

※今回の記事は、言ってしまえばゲームQAとは直接関わりもなければ技術的なテーマでもないです。

##1. QAをそもそも知らないパターン
**よくある回答**: 「え、QAってなんですか? 」
・そもそもQA、そして品質保証という職業を認知されていない可能性が高い
・詳しく説明をするよりも魅力や要素をキーメッセージ的にお伝えするのが良さそう

　QAという仕事を知らないというパターン。実際に自分が遭遇した際、当時は「QAは品質保証でテストすること」というものすごい粗い説明をするか、事細かに説明をしすぎてドン引きされるかのどちらかでした。
　いま振り返ってみると、**業界に興味を持ってもらえるきっかけを自分で潰していた**印象です。少なくとも「それはなんですか」という返答をいただいているのでしたら、興味を持ってもらえている状況のはずです。

　その時に求められる回答は、**その職業の魅力を伝えられること**が重要かと思われます。今であれば「商品の品質に問題ないかをチェックする仕事」というより「商品をチェックしてユーザーの皆様に安心してお使いいただけるかを確認する仕事」などお伝えできるかなと思います。

##2. 知ってはいるけど知識が偏っているパターン
**よくある回答**: 「バグを出すお仕事」「ゲームを好きなだけ遊べる」
・まずその人の誤解を解く必要があるが伝え方に注意したい
・部分的に合っている所があればそこを尊重しつつ正しい情報を伝えると良さそう(人によりますが)

　最も遭遇率が多いのがこのパターンな印象です。間違っていない部分もありつつも、情報が偏っていたり、曲解していたりする場合です。ただし、間違いの訂正のみを行おうとするとそれはそれでこじれるか、全体的に話が長くなってしまう場合も…。
　もし今こういう場面にあったなら、相手の意見を踏まえて返答を考えたほうがよい事が多いです。いずれも仕事の魅力を伝えることをベースにはしつつ、相手がざっくりとしか知らないなら補足をする、偏っているなら踏まえつつ訂正する、という方法が考えられます。例えばよくある回答をベースにするなら1つ目への返答は「バグを出すこと以外にも、それを未然に予防する等よりよいものを作れるようにするお仕事でもあるんですよ」、2つ目なら「流石に好きなだけってわけではないですけど、世に出る前のものを触ることができますね」など。
　ある程度知っている人については、人によってはここの例以外の回答の仕方を求められる場合もありますが、いずれも魅力を伝えるベースで考えるとうまくいくことが多い印象です。

##まとめ
　個人の体験ベースにここまで書かせていただきました。その中からの振り返りとしては、職業の概要をさっくりとお伝えするだけでも勿論伝わるとは思います。が、これを機会に魅力を知ってもらうというところまで期待するならば、自分の職業の魅力、というところを知っておいて伝えることが必要かなと感じました。

　業界によって伝えるべき魅力というのは異なると思いますが、私も今一度自身の仕事の魅力、というものと振り返ってみようかと、改めて考える機会になりました。今後もゲームQAの仕事の魅力、というものを人に伝えられるよう、考えていきたです。
『メタプログラミングRuby』でのバリデーションてきなやつ

#初めに

『メタプログラミングRuby』を読んでいていろいろ気づくことがあります。
そのうちの一つにProcの必要性です。
Proc.callとかいつ使うんだよとか思ってましたがブロックの中身を後で決める場合にはとてもべんりなわけです。


#とりあえずコードを見てください

『メタプログラミングRuby』に書かれていたattr_checkedというメソッドで一番わかりやすかったやつ。

```ruby:attr_checked.rb
class Class
  def attr_checked(attribute, &validation)
    define_method "#{attribute}=" do |value|
      raise 'Invalid attribute' unless validation.call(value)
      instance_variable_set("@#{attribute}",value)
    end

    define_method attribute do 
      instance_variable_get "@#{attribute}"
    end 
  end 
end 

class Person
  attr_checked :age do |v|
      v >= 18 
  end 
end

person = Person.new
person.age = 20
p person.age
=> 20

person1 = Person.new
person.age = 10
p person.age
=> `block in attr_checked': Invalid attribute (RuntimeError)
```


最初見たときは何が書いているか全くわかりませんでしたがdefine_methodとproc.callがわかればどういったコードなのかわかります。


#define_method

define_methodはメソッドを定義するものでattribute=,attributeというメソッドを定義しています。


#proc.callの出番

```ruby
raise 'Invalid attribute' unless validation.call(value)
```

の部分ですがまずraiseはエラーを発生させます。

なのでunless validation.call(value)がtrueになったらエラーが起きるというわけです。


attr_checkedでattributeと&validationが渡されていますね。

今回の場合はattributeは:ageで&validationが:ageの後に書かれているブロックの部分です。

validationではなくて&validationと書くことによってブロックを受け取ることができてそのブロックを実行するために必要になるのがcallです。


#validatoin.call(value)


validation.call(value)によって年齢が　v >= 18　にチェックされtrueかfalseを返します。

そしてfalseが返ってきた場合にraiseでエラーを発生させているというわけですね。



#そのほかの書き方


上に書いたコードが一番わかりやすかったのですが他にもバリデーション的なやつをほかのコードでも実装していました。

その一つがこれ。



```ruby:add_checked_attribute.rb
class Person
end 

def add_checked_attribute(klass, attribute, &validation)
    klass.class_eval do 
      define_method "#{attribute}=" do |value|
        raise 'invalid attribute' unless validation.call(value)
        instance_variable_set("@#{attribute}", value)
      end 
  
      define_method attribute do
        instance_variable_get("@#{attribute}")
      end
    end 
end



add_checked_attribute(Person, :age) {|v| v >= 18}
person1 = Person.new
person1.age = 20
p person1.age
=> 20

person = Person.new
person.age = 10
p person2.age 
=> add_checked_attribute': invalid attribute (RuntimeError)
```

class Classの中に書いている場合は定義したどのクラスでも使えますが今回はそうではないのでどのクラスで使うか指定してあげなければいけません。

そのために使うのがclass_evalで例えば

```ruby:class_eval.rb

class Person
end


Person.class_eval do
  def self.greet
    p "hello!!"
  end 
end 

Person.greet
=> "hello!!"
```


みたいなことができます。

add_checked_attributeの第一引数でクラスをklassでもらってその値を使ってklass.class_evalを書いています。


#おわり

『メタプログラミングRuby』で書いてあったバリデーション的なのはとりあえずこんなかんじでした。

間違っているところがあればご指摘いただければと思います。
Mojaveに変えて困った話

こんにちは。私です。

つい先日社用で使ってるMacをSierraからMojaveにグレードアップしました。
そこで使えなくなった機能が現在で二つ。

##Clipy死んだ
語弊があったら申し訳ないのですが、使えなくなっただけです。

Macユーザーならほとんどの人が使っているであろうClipy。
知らない人は調べて使ってみてね[Clipy](https://clipy-app.com/)

私こちらClipyのヘビーユーザー…使いやすさが段違いですね。
ただ急に貼り付けられなくなった。履歴は残ってる。スニペットも。
でも履歴から貼り付けられなくなった。
Mojaveにアップグレードした後から………。すごい困る。

##Teamsも死んだ
弊社では社内のやりとりをMicrosoftのTeamsで行なっております。
とある社内打合せ参加の時にビデオもマイクも起動しなくなっていました。すごい困る。

##原因はMojaveのセキュリティ強化()にあった！
ユーザ認証が増えたそうです。
「システム環境設定」→「セキュリティとプライバシー」から変更を行なっていきます。

<img width="666" alt="セキュリティとプライバシー.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/fef0bdf2-9504-c76c-9139-154192cb4d22.png">



####Clipyを使えるように解消！
<img width="670" alt="アクセシビリティ.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/8f2dc8ed-eca4-c339-47a5-4cfcb3720f28.png">

####Teamsのカメラとマイクも解消！
<img width="666" alt="カメラ.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/3f137165-4b05-c4dd-4d12-9b1633bd010d.png">
<img width="666" alt="マイク.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/3757585e-178c-63a8-5d2e-0dbf514730a4.png">

##生き返った
適応させることでClipyも息を吹き返し()社内打合せにも参加することができました！

##特にPC操作に慣れてない方へ
####また、近くに「何もしてないのに使えなくなった」って言う人へ
Mojaveに更新し、様々なアプリを使おうとした時に認証を確認するポップアップが表示されると思いますが、その際よくわからないまま「許可しない」を選択してしまうことがあるかと思います。
上記やり方でうまいこと使えるように設定を変更してくださいね！

##使えてよかった
私のように使えなくなってしまった方へ何か手がかりになればいいなと思います！
では、皆様もよいMojaveライフを٩( 'ω' )و

##追伸
「セキュリティとプライバシー」で変更が終わったらロックかけるの忘れないでくださいね！
<img width="667" alt="ロック.png" src="https://qiita-image-store.s3.amazonaws.com/0/217071/7f6322a2-ab44-b696-e3dc-03ee11c2005a.png">
エディタで等幅日本語フォントを最適に表示させるには、フォントサイズを2か3か5の倍数にするといいよ！

等幅フォントをつかっていても、エディタで半角と全角の文字では、幅が噛み合わないことがあることがわかった。

その原因の一つに、フォントのサイズがあることがわかったので、知ったことを共有したい。

## 半角と全角の比率は、フォント次第

まず、大前提として、等幅フォントでも半角と全角の比率はフォント次第というのがある。

等幅フォントは、半角2文字に対して全角1文字のイメージがあったが、そんなことなかった。

Fira Codeは、半角5文字に対して、全角3文字。

Source Han Code JPは、半角3文字に対して、全角2文字。

Ricty Diminishedは、半角2文字に対して、全角1文字。

まとめると、このようになる。

フォント | 比率
-----|----
Fira Code | 5:3 
Source Han Code JP | 3:2
Ricty Diminished | 2:1

## フォントサイズによって、幅が噛み合わないことがあった

Fira Codeはフォントサイズが5の倍数のときに幅が整う。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">FiraCodeでも同様の現象が。FiraCodeは半角5:全角3の比率なので、フォントサイズを5の倍数にするときれいに整う。 <a href="https://t.co/E0d1tZgQoU">pic.twitter.com/E0d1tZgQoU</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1070872108710866944?ref_src=twsrc%5Etfw">2018年12月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Source Han Code JPはフォントサイズが3の倍数のときに幅が整う。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">一方、Source Han Code JPは、全角3:半角2の比率なので、フォントサイズは3の倍数にするときれいに整うことがわかった。 <a href="https://t.co/g8DFJ39FHI">pic.twitter.com/g8DFJ39FHI</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1070872356975857664?ref_src=twsrc%5Etfw">2018年12月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Ricty Diminishedはフォントサイズが2の倍数のときに幅が整う。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">Ricty Diminishedは、半角2:全角1の比率なので、フォントサイズは2の倍数にすると整う。 <a href="https://t.co/xNKtQYpPgA">pic.twitter.com/xNKtQYpPgA</a></p>&mdash; suin❄️PHPでオブジェクト指向 (@suin) <a href="https://twitter.com/suin/status/1070875068018786305?ref_src=twsrc%5Etfw">2018年12月7日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

以上の結果をまとめると次のようになる。

フォント | 比率 | 幅が整うフォントサイズ
-----|----|----
Fira Code | 5:3 | 5の倍数(10, 15, 20, 25, ...)
Source Han Code JP | 3:2 | 3の倍数(12, 15, 18, 21, ...)
Ricty Diminished | 2:1 | 2の倍数(10, 12, 14, 16, ...)

このことをツイートしたら、 @iteman から、Rictyは「既知の問題」にあがってることを教えてもらった。

> 半角文字と全角文字の横幅比が 1:2 にならないことがあります。ピクセル値 (px) が偶数でないとき、どのフォントでも起こりうる問題です。一般的な 96 DPI のフォントレンダリングでは 9 pt、10.5 pt、12 pt、13.5 pt、15 pt など、1.5 の倍数を指定すると 1:2 で表示されます。
> - [プログラミング用フォント Ricty](https://www.rs.tus.ac.jp/yyusa/ricty.html)

「どのフォントでも起こりうる問題です」まさにこれが当てはまった。

## 比率とフォントサイズは関係している

さっきの表を見てみると気づくことがある。「半角に対する全角の比率」と「幅が整うフォントサイズが何倍の値か？」は同じ値であるということ。

フォント | 比率 | 幅が整うフォントサイズ
-----|----|----
Fira Code | **5**:3 | **5**の倍数(10, 15, 20, 25, ...)
Source Han Code JP | **3**:2 | **3**の倍数(12, 15, 18, 21, ...)
Ricty Diminished | **2**:1 | **2**の倍数(10, 12, 14, 16, ...)

つまり、等幅フォントで日本語がきれいに出るフォントサイズの設定は、**半角に対する全角の比率の値の倍数にするといい**ということだ。
docker初心者がいまいち理解できず調べ直したところまとめ

docker初心者の私が中級者になるためにいちから調べなおしました。
そのなかで一回読んだだけだとわからなかったり、いろいろな記事を読むことでわかるようになったことについてまとめます。


#dockerのライフサイクル
dockerってなにがどうなって使える(実際にコンテナに入って作業ができる)ようになるのかがわかりませんでした。
まとめです。
![docker_ライフサイクル.png](https://qiita-image-store.s3.amazonaws.com/0/45528/37dfa78a-2dc5-f24c-415b-e18a6b013fe6.png)
参考
http://enakai00.hatenablog.com/entry/20140628/1403933390
http://blog.kamiazya.tech/post/docker-lifecycle/





#dockerとdocker-composeの違い
dockerを調べていると、`docker`コマンドと`docker-compose`コマンドの2つを目にします。
その違いについてです。

`docker`は主に単一のコンテナの操作を行ったり(コンテナの起動や、コンテナのログの出力など)、docker全体の情報を出力したり(dockerのバージョンなど)するときに使います。
`docker-compose`は、複数のコンテナをまとめて管理することが可能になります。
コンテナのビルドから連携までをymlファイルを使って実行することができます。

###そもそも複数コンテナはどんなときに作るのか?
webアプリを作成する場合、たいていはアプリのサーバーだけではなくDBも作ることになると思います。
これをdockerで動かす場合は、アプリで1コンテナ、DBで1コンテナ、とそれぞれ別のコンテナを使うことをお勧めされています。

参考：https://qiita.com/koka/items/3d3d4ee5680f92a0ad89#docker-compose


#dockerにexecすると、常にルートディレクトリ
Linux系のOSでコンテナを作りログインすると、(ユーザーを作って指定しない限り)rootユーザーでログインすることになります。
ホームディレクトリは`/root`なので、ログインしたときの最初のディレクトリ(ワーキングディレクトリ)も`/root`になるはずと思っていたのですが、常にルートディレクトリ(/)になってしまいます。

ワーキングディレクトリはデフォルトで`/`になっています。
別のディレクトリにしたい場合は、コンテナを作成する時に設定が必要です。

```bash
$ docker run -it --workdir /root <IMAGE> bash
```
これでワーキングディレクトリが/rootになります。


#-p と expose と -P
runコマンドのオプションに`―p`、`--expose`、`-P`などのポート関連のコマンドがいくつかあります。
それぞれどう使えばよいかわからなかったのでまとめます。

###-p
コンテナのポートをホスト側に公開する。

```bash
$ docker run -it -p 8080:80 <IMAGE> bash
```
ホストで`8080`にアクセスすると、コンテナの`80`ポートにつながります。
(この時に`--expose`などをする必要はありません。)

###--expose
コンテナのポートを公開する。ただしホストには公開しない。

```bash
$ docker run -it --expose 80 <IMAGE> bash
```
コンテナの`80`ポートが他のコンテナに対して公開されます。

###-P
exposeされているポートをホスト側に公開する。

```bash
$ docker run -it --expose 80 -P <IMAGE> bash
```
ホスト側のポートは自動的に割り振られます。
上記のように`run`コマンドでexposeオプションを使った場合も、Dockerfileに`EXPOSE`命令を書いた場合もホスト側に公開されます。