OmniAICreator/Qiita-1.07M huggingface dataset:
永続値が保存できない・・・なぜだろう？

Dialogflow v2 に挑戦しています。

永続値を保存しようとして、以下のシンプルなコードを試しましたが、
永続値が取得できなかった。何か間違っているのだろうか？

```js:index.js
'use strict';

const functions = require('firebase-functions');
const { dialogflow } = require('actions-on-google');

const app = dialogflow();

app.intent('FirstIntent', conv => {
    conv.user.storage.value = 'A';
    conv.followup('SecondEvent');
});

app.intent('SecondIntent', conv => {
    conv.close('value is ' + conv.user.storage.value);
});

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
```

```json:package.json
{
  "name": "dialogflowFirebaseFulfillment",
  "description": "This is the default fulfillment for a Dialogflow agents using Cloud Functions for Firebase",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "8"
  },
  "scripts": {
    "start": "firebase serve --only functions:dialogflowFirebaseFulfillment",
    "deploy": "firebase deploy --only functions:dialogflowFirebaseFulfillment"
  },
  "dependencies": {
    "actions-on-google": "^2.2.0",
    "firebase-admin": "^5.13.1",
    "firebase-functions": "^2.0.2",
    "dialogflow": "^0.6.0",
    "dialogflow-fulfillment": "^0.6.1"
  }
}
```

まず、FirstIntentが呼ばれて、
永続値を保存してからSecondEventを発生させます。
次に、SecondIntentが呼ばれて、
永続値を読み込んでから「Value is A」の応答を返す想定ですが、
「Value is undefined」と表示されてしまいます。

以下のログを見つけました。

```
Billing account not configured. 
External network is not accessible and quotas are severely limited. 
Configure billing account to remove these restrictions
```

課金しなければならないように見えたのでflameにアップグレードし、
このログが表示されないことは確認しましたが、
永続値が保存・取得できない問題は解決しませんでした。
この問題と課金は関係ないのかなぁ・・・

***

追記

@yoichiro6642 様のコメントによると、この現象は仕様通りとのこと。

API Referenceにも記載があるそうです。
https://actions-on-google.github.io/actions-on-google-nodejs/classes/dialogflow.dialogflowconversation.html#followup

別の方法で対応しなきゃならないですね・・・

***
Flutter 何故かiOSでビルドできない場合

何故かビルドできなくなったりしますよね。
エラーを読んでもいまいち原因がわからなかったり、解決方法が不明だったりします。

そんなときはとりあえず、次のことをまずはやってみましょう。

- Podfileを最新のFlutterのものになっているか確認する
- Podfile.lockを削除
- flutter clean
- flutter run
PygameでShootingゲーム 03

## 目標:
#### 前回: [PygameでShootingゲーム02](https://qiita.com/sf_/items/16456eb00f99a597bacb)

### Pygame でShootingゲームを作る 03
#### Tasks
- このままだとbulletとbulletの間の間隔が短すぎる
- `Player`クラスに`self.shoot_delay`属性を入れる（bulletの間隔 millisecond）
- `Player`クラスに`self.last_shot`属性を入れる
- 最後に撃ったbulletの時間を格納 
- `pygame.time.get_ticks()`でその瞬間の時間を格納
- 現在の時間とlast_shotの時間を比較し、`shoot_delay`の間隔より大きくなったら次のbulletを撃っても良いようにする
- `Player`クラスの`shoot()`を更新する

***
#### `Player`クラスに`self.shoot_delay`属性を入れる（bulletの間隔 millisecond）
#### NEW
1. `self.shoot_delay`属性を設定
2. `self.last_shot`属性を設定
3. `shoot()`が多く変化
    - `now` に現在の時間を格納
    - `now`と`last_shot`の時間の差を`shoot_delay`と比較
    - `shoot_delay`より大きかったら`shoot()`を実行
        - `Bullet()`インスタンスを作成、`bullet`に格納
        - `all_sprites`と`bullet`の`Sprite`グループに足す


```python
class Player(pygame.sprite.Sprite):
    # sprite for the Player
    def __init__(self):
        super().__init__()
        self.image = pygame.transform.scale(player_img, (50, 38))
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 10
        self.speedx = 0

        # +++ NEW!!!! +++
        # Bulletの間隔を空ける時間
        self.shoot_delay = 150
        # 最後に撃ったBulletの時間
        self.last_shot = pygame.time.get_ticks()

    def update(self):
        self.speedx = 0

        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -10
        if keystate[pygame.K_RIGHT]:
            self.speedx = 10

        # Bullet を撃つ
        if keystate[pygame.K_SPACE]:
            self.shoot()

        self.rect.x += self.speedx

        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0

    # BulletをPlayerが撃つ
    def shoot(self):
        # +++ NEW!!!! +++
        # 現在の時間をnowに格納
        now = pygame.time.get_ticks()
        # 現在の時間と最後に撃った時間(last_shot)をshoot_delay属性と比較
        if now - self.last_shot > self.shoot_delay:
            # 最後に撃ったbulletの時間を現在に更新
            self.last_shot = now
            bullet = Bullet(self.rect.centerx, self.rect.top)
            all_sprites.add(bullet)
            bullets.add(bullet)

```
PygameでShootingゲーム 02

## 目標:
#### 前回: [PygameでShootingゲーム01](https://qiita.com/sf_/items/693fe8fd967875b6e3de )

### Pygame でShootingゲームを作る 02
#### Tasks
- bullet.pngを設定 
- bullet.png をload() -> bullet_img に格納
- Bulletクラスを実装
- bullets.sprite.Group()を作成
- Playerクラスに shoot()を作成
- Playerクラスのupdate()にshoot()を入れる

#### プロジェクトストラクチャー

- project/ -- 全てを入れるフォルダ（ディレクトリ）
    - img/ -- 画像を保存するフォルダ（ディレクトリ）
		- player.png
		- background.png
    - app.py -- codeを書くファイル

***
#### bullet画像を読み込む

```python
bullet_img = pygame.image.load(
    os.path.join(img_folder, "bullet.png")).convert()
```

***
#### bulletのスプライトグループを作成

```python
bullets = pygame.sprite.Group()
```

***
#### Bulletクラスを実装

```python
# ---- Bullet Class ----
class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = bullet_img
        self.rect = self.image.get_rect()
        # 座標を設定
        self.rect.bottom = y
        self.rect.centerx = x
        # Bulletのスピードの初期値
        self.speedy = -10

    def update(self):
        self.rect.y += self.speedy
        # もし画面の上から出たら消える
        # kill()はSpriteクラスに組み込まれているfunction
        if self.rect.bottom < 0:
            self.kill()
```

***
#### Playerクラスをアップデート
#### NEWとなっている所に注意
1. `update()` に`K_SPACE`キーの状態を確認するcodeを追加
2. `shoot()` を追加

```python
class Player(pygame.sprite.Sprite):
    # sprite for the Player
    def __init__(self):
        super().__init__()
        self.image = pygame.transform.scale(player_img, (50, 38))
        self.image.set_colorkey(BLACK)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 10
        self.speedx = 0

    def update(self):
        self.speedx = 0

        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -10
        if keystate[pygame.K_RIGHT]:
            self.speedx = 10

        # +++ NEW!!!! +++
        # Bullet を撃つ
        if keystate[pygame.K_SPACE]:
            self.shoot()

        self.rect.x += self.speedx

        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0

    # +++ NEW!!!! +++
    # BulletをPlayerが撃つ
    def shoot(self):
        # Bulletクラスのインスタンスを作成
        # 座標はｘはPlayerの真ん中、yはPlayerの上から
        bullet = Bullet(self.rect.centerx, self.rect.top)
        # all_spritesに追加する
        all_sprites.add(bullet)
        # bulletsグループにも追加する
        bullets.add(bullet)

```

***
#### ゲームループにイベント待ちを追加する
#### NEW
1. `event.type == pygame.KEYDOWN`キーが押されているかを確認
2. キーの中でも`K_SPACE`キーがおされているかを確認
3. 押されていたら、`player.shoot()`を実行

```python
while running:

    # ---- EVENTS: イベントを管理 ----
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # +++ NEW!!!! +++
        # Bulletを撃つ
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                player.shoot()

```

### 注意!!: このままだとbulletとbulletの間隔がなさすぎるという問題が発生
### 次回解決
Lightning Hint&Tips

#### コンポーネントの説明を修正する
管理コンソールから下記のSOQLを実行して修正する。またはクライアントから meta.xmlを直接修正する

`Select Id, DeveloperName, Description from AuraDefinitionBundle`

####  開発Sandboxでコンポーネントのキャッシュを無効にする
デフォルトでは強力なキャッシュが有効になっているため、Lightningコンポーネントを修正したり、標準の設定を変更しても、LEX環境ではすぐには有効にならない（2−3度リロードが必要）。
下記の設定をOFFにすることでこのキャッシュを無効にできるので、開発Sandboxでは無効にしておくことを推奨

<img width="824" alt="Screen Shot 2018-10-12 at 21.34.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/161463/a70dd33e-8892-21aa-1c5a-0e9d2289395d.png">

#### コンポーネントのデバッグモードの有効化

https://help.salesforce.com/articleView?id=aura_debug_mode.htm
PHP基礎（演習０−１）

#演習０−１
**0-1-1)**
整数の8と2を使って四則計算（+,-,*,/)をするコードを実践して確認して下さい。



**0-1-2)**
文字列"abc"と”xyz”を連結するコードを実践して確認して下さい。



**0-1-3)**
整数をキャストを使って文字列に型変換するコードを実践して確認して下さい。



**0-1-4)**
文字列をキャストを使って整数に型変換するコードを実践して確認して下さい。



**0-1-5)**
配列["A","B","C"]を定義し、その配列から2番目の要素を取り出して確認して下さい。



**0-1-6)**
配列["A","B","C"]を定義し、その配列に別の任意の配列を追加し、その配列の全要素を確認して下さい。



**0-1-7)**
配列["A","B","C"]を定義し、その配列からarray_popメソッド(配列の末尾から要素を取り除く)で取り除いた結果を確認して下さい。参考：http://php.net/manual/ja/function.array-pop.php



**0-1-8)**
配列のarray_shiftメソッドは、配列の先頭から要素を一つ取り出します。このメソッドを使って配列が変更される様子を確認して下さい。参考：http://php.net/manual/ja/function.array-shift.php



**0-1-9)**
自由な名前でキーとバリューの組み合わせを発案し、3つほどの要素を入れて作った連想配列を定義し、存在するキーからその対応するバリューを確認して下さい。



**0-1-10)**
0-1-9で作った連想配列に新しくキーとバリューの追加を行い、その連想配列の全要素を確認して下さい。
Swift String Range で範囲ないの文字列を取得

# Swift String Range で範囲内文字列を取得

## Overview

Swift で範囲内の文字列を取得、切り出しを行うのは一苦労になりました。
Objective-C だったら簡単だったがSwiftでは一苦労になり、苦戦しております。
なので簡単にやるにはどのよういやったら良いかを考えてみた。


### Apple 公式のAPIの使い方

```swift
let name = "Marie Curie"
let firstSpace = name.firstIndex(of: " ") ?? name.endIndex
let firstName = name[..<firstSpace]
```

このような感じになっている、伝えたいことはわかるが、Stringを配列的な感じで使えるのがいい感じである、
C言語のcharと同じ感覚である、さらにそれをRangeにして範囲を取得できるようになっているのはいいが、

このコードはコンパイルできない、

(☝︎ ՞ਊ ՞)☝︎

がStringの肩を配列のような添字で取得できる、

上記の方法ではなく、下記のようにすると取得できる、。

```swift
let moji = "1234567890"
// 一番最初から、二文字目まで取得できます。
let str = moji[moji.startIndex..<moji.index(moji.startIndex, offsetBy: 2)]
        
print (str)

```

これで取得できる

Rangeで指定できるが、String.Indexにしないと範囲指定はできない、

ここが大変であるので、Appleさん、　RangeのInt型で指定できると尚良いと考える

これは面倒なので、Stringを拡張した関数を実装してみる

下記になる、

```swift

extension String {
    
    func substring (range: Range<Int>) -> String {
        return String(self[self.index(self.startIndex, offsetBy: range.lowerBound)..<self.index(self.startIndex, offsetBy: range.upperBound)])
    }
    
}

```

使い方は下記になる。

```swift
let moji = "1234567890"
print (moji.substring(range: 0..<5))
print (moji.substring(range: 1..<4))
```

Rangeで範囲を指定して取得することができる
PHP基礎（３）型の変換

#キャスト
型の変換はキャストを使います。

文字列から数値に変換する例は、 

```php

<?php
$str = "10"; // $strは文字列
$num = (integer)$str; // 整数変換 
var_dump($num); // => 10
?>
```


数値から文字列に変換するときは、式展開の働きを利用してダブルクォーテーション(")で括ることもできます。

```php

<?php
$num = 10; // $numは整数
$str = "$num"; // $strは文字列
$str2 = (string)$num; // $str2も文字列
var_dump($str2); // => "10"
?>

```

#intval関数
他の方法としてintval関数を使って文字列から数値に変換することも一般的です。

```php

<?php
$str = "12345"; 
$num = intval($str);
var_dump($num); // => 12345
?>
```

ただ実務的にはis_numeric関数で数値文字列かどうかを判定してからintvalした方がいいです。 

```php
<?php
$s = "1234";
if (is_numeric($s)) {
  var_dump(intval($s)); // => 1234
}
?> 
```

[＜＜PHP基礎（２）配列]
(https://qiita.com/taka027/items/06a81e2150b0ccb1a17c)

[PHP基礎（４）条件分岐＞＞]
(https://qiita.com/taka027/items/eba98138a9816ced69fc)
VSCode から Anaconda 環境をちゃんと使う (windows)

# やりたいこと
* vscodeエディタ内のターミナルを起動したときに、conda仮想環境のactivateまで自動でやってくれるようにしたい
* 日本語が文字化けするのでなんとかしたい

# tl;dr
**【2019/10/15 追記】**
記事の設定は古くなっているため追記
「ctrl+shift+P」でコマンドパレットを立ち上げて「pythonインタプリタを選択」することでconda系の仮想環境を選択できます。
少し前からできるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54654/bff1b688-2b12-fb3f-b481-328d00d6b823.png)
**【追記ここまで】**



* vscodeのworkspaceの設定で以下を行う
* condaで作成した仮想環境のpython.exeへPATHが通るように設定
* terminal起動時に仮想環境のactivateとterminalの文字コードをUTF-8とする

``` vscode.setting
{
    "python.pythonPath": "C:\\Users\\xxx\\Anaconda3\\envs\\hoge\\python.exe",
    "terminal.integrated.shellArgs.windows": [
        "/k",
        "activate",
        "hoge",
        "&chcp",
        "65001"
    ]
}
```
# condaでpython仮想環境の作成

### condaバージョン確認
```cmd.exe
Y:\>conda -V
conda 4.5.11
```
### 作成
* 適当に作成

```cmd.exe
Y:\>conda create -n hoge python=3.7
```

### 確認
* ここで確認したパスを使う

```cmd.exe
Y:\>conda info -e
# conda environments:
#
base                  *  C:\Users\xxx\Anaconda3
hoge                     C:\Users\xxx\Anaconda3\envs\hoge
```
AWS CLIの認証設定をする際の注意

## 概要

AWS CLIを使うためにはAWSにアクセスするためのアクセスキー（アクセスキーIDとシークレットアクセスキー）が必要になります．本記事ではコマンド（configure）を使って認証情報を設定する時の注意事項について述べます．

## 結論

```terminal
$ aws configure
```

じゃなくて

```terminal
$ aws configure --profile [好きな名前]
```

を使おう．


## 調べたらよく出てくるやり方

まず認証情報と設定ファイルを作成する．

```terminal
$ aws configure
```

次に，出てくる4項目を入力する．

```terminal
AWS Access Key ID [None]: xxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

AWS Access Key ID [None] と AWS Secret Access Key [None] には発行したアクセスキーを，
Default region name [None] にはデフォルトリージョンを，
Default output format [None] にはコマンド出力結果の表示形式（json,table,textのうちどれか）を，それぞれ指定します．

これで設定は終了です．

## 何がよくないか

上のコマンドによって`~/.aws　`ディレクトリに作成された，認証情報（credentials）と設定ファイル（config）の内容を確認してみます．

```text:credentials
[default]
aws_access_key_id = xxxxxxxxxx
aws_secret_access_key = xxxxxxxxxx
```

```text:config
[default]
output = json
region = ap-northeast-1
```

・・・defaultってなに？って感じなんですが，これはオプションをつけずにAWS CLIコマンドを実行したときはこの認証情報と設定を使ってAWSにアクセスするよってことです．
まぁ一種類の情報，設定しか使わない人ならこれで問題ないんですが，複数の環境にアクセスする必要があり，IAMユーザーを使い分ける人は多いと思います．
別の環境にS3バケットを立てたかったのに，間違ってデフォルトの環境に立てちゃった！ってやっちゃいそうじゃないですか？僕はやる自信があります．
それを防ぐためにdefaultは設定せずに，必ずオプションをつけないとアクセスできないようにしたいんです．
具体的には，

```terminal
$ aws configure --profile [好きな名前]
``` 

というコマンドを使うことで，

```text:credentials
[好きな名前]
aws_access_key_id = xxxxxxxxxx
aws_secret_access_key = xxxxxxxxxx
```

```text:config
[好きな名前]
output = json
region = ap-northeast-1
```

という内容のファイルが作成され，例えばS3のバケットを一覧表示するコマンド`aws s3 ls`だったら，

```terminal
$ aws --profile [好きな名前] s3 ls
```

としないとエラーが出るようになるわけです．
Object.assign 引数5つ以上の any 戻り型を克服する

# 引数5つ以上で any

[libの定義にある通り](https://github.com/Microsoft/TypeScript/blob/master/lib/lib.es2015.core.d.ts#L280-L313)、引数5つ以上の `Object.assign` は `any` が戻り型となる。知らなかった。（thx: @k-okina）


```typescript
const ONE = { type: 'ONE' as 'ONE' };
const TWO = { type: 'TWO' as 'TWO' };
const THREE = { type: 'THREE' as 'THREE' };
const FOUR = { type: 'FOUR' as 'FOUR' };

const merged1 = Object.assign({}, ONE, TWO, THREE);
const merged2 = Object.assign({}, ONE, TWO, THREE, FOUR);
```

```typescript
/** 【推論結果】 **/
const merged1: { type: 'ONE' } & { type: 'TWO' } & { type: 'THREE' }
const merged2: any
```

# 少し拡張する

定義されている ObjectConstructor に推論を追加する。tsconfig の include 相当の場所にあれば良い。

```typescript
type UTI<T> = T extends any ? (args: T) => void : never
type UnionToIntersection<T> = UTI<T> extends (args: infer I) => void ? I : never
type ArgsIntersection<T> = T extends (infer I)[] ? UnionToIntersection<I> : never
interface ObjectConstructor {
  assign<T extends any[]>(...sources: T): ArgsIntersection<T>;
}
```

めでたし。

```typescript
/** 【推論結果】 **/
const merged1: { type: 'ONE' } & { type: 'TWO' } & { type: 'THREE' }
const merged2: { type: 'ONE' } & { type: 'TWO' } & { type: 'THREE' } & { type: 'FOUR' }
```
PHP基礎（２）配列

#配列

配列はよく使うデータ構造です。配列はarray構文で作成します。このarrayの引数は、各要素をカンマで区切り、「キー => 値」の組を引数とします。

```php
<?php
$arr = array(
  'pascal' => 'パスカル',
  'edison' => 'エジソン', 
  'leibniz' => 'ライプニッツ',
);
var_dump($arr);
?>
```

キーは、整数または文字列です。値は任意の型を指定できます。これはハッシュと呼ばれるデータ構造です。

##連想配列（ハッシュ）を使う例

```php
<?php
// PHP 5.4 以降ではこのようにも書けます 
$arr = [
  'pascal' => 'パスカル',
  'edison' => 'エジソン', 
  'leibniz' => 'ライプニッツ',
];
// 連想要素の総数
count($arr); // => ３
// この連想配列の中身がないときtrueを返す
empty($arr); // => false
// キー・値の要素を順番に出力する
foreach ($arr as $key => $value) {
  $k = $key;
  $v = $value;
}
//'edison'をキーにもつ値の取得
$a = $arr['edison']; // => 'エジソン'
 
// 要素の追加
$all = array_merge($arr,array('tesla'=>'テスラ'));
// 存在しないキーに対し値代入
$all['einstein'] = 'アインシュタイン';

?>
```
PHPにおいてはインデックスで要素にアクセスする添字配列とハッシュの間に違いはなく、データ構造としては1つだけで、キーを整数として扱えば添字配列と同じ扱いとなります。

##添字配列として使う例

```php
<?php
$arr = []; // 空の配列の作成 []を付けて配列型であることを示します。
$numbers = [2, 3, 5, 7]; // 初期値を与えて生成(最初に4つの要素を入れる)
$fruits = ["orenge", "apple", "lemon"]; // 初期値を与えて生成(最初に3つの要素を入れる)

// 配列要素の総数
count($numbers); // => 4
// この配列の中身がないときtrueを返す
empty($arr); // => true
// 配列の要素を順番に出力する
for($i = 0; $i < count($fruits); $i++) {
  $s = $fruits[$i];
}
foreach ($fruits as $fruit) {
  $s = $fruit;
}
//2番目の値の取得(添字0が最初の要素を示します)
$a = $fruits[1]; // => apple

//値の変更（１番目の値を書き換える）
$fruits[0] = 'strawberry';
//配列の末尾に値を挿入する
array_push($fruits,'peach');
//配列の合成
$all = array_merge($fruits,$numbers);
//値の削除（第一引数は切り取り対象配列、第二引数は開始位置、第三引数は切り取り数）
$splice = array_splice($all, 2, 3);
?>
```

[＜＜PHP基礎（１）変数と型について]
(https://qiita.com/taka027/items/17fb1787f10be5ede7d0)

[PHP基礎（３）型の変換＞＞]
(https://qiita.com/taka027/items/d162b8eefad38c26bc05)
罪深きExcelで印刷物を作るテクニック

Excelで印刷物というと、どうしても画面表示通りに印刷されない、それがテキストボックスだととんでもないことになる、ということは有名なお話です。
しかしながら、Excelで印刷物が作れたら、完璧でなくともいいところまでできれば、Excelで印刷物を作るメリットが増えるかもしれません。
今回、Excelでラベル印刷をしたいというケースがあり、そこで調べたことを発表します。
# WordでできないExcelのメリット
印刷に関して、Wordではできない、Excel特有のメリットが一つだけあります。
「縮小して全体を表示」という機能です。
これはExcelのセルの中に文字が入り切らなかった場合に、文字サイズを自動的に縮小し全体を表示するという機能です。
Ctrl+1でセルの書式設定ダイアログボックスを表示して、配置タブの中にこのチェックがあります。
ラベル印刷するもので可変長の長さで大きくなるものに住所がありますが、住所欄でこの機能を使えばいいのではないかと思います。
# ラベルの大きさを調べる
必要なのは何よりラベルの大きさです。これは様々なメーカーごと型番ごとに決まっているのでググるといいでしょう。
このような形で表示されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/97bf1dad-ccc3-e39a-738a-d78859330582.png)
ほとんどの場合、右余白と上余白と１つのラベルの縦横が書いてあります。
# 表示するもの
元データはこんな表です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/99019122-004e-5e97-7b02-2c8649bac1a8.png)
ラベルに表示するものは、郵便番号、住所、あて先名の３つです。
一つのラベルは縦に５５ｍｍなので
上余白５ｍｍ
郵便番号１５ｍｍ
住所１５ｍｍ
あて先名１５ｍｍ
下余白５ｍｍ
とします。
# 余白の設定
ページレイアウトタブの余白で余白の設定をします。
左１４ｍｍ、上１０ｍｍ、下、右、ヘッダー、フッターは０ｍｍとします。
また、プリンタの設定によってはフチなし設定にする必要があります。
# Excelの列幅や高さをｃｍやｍｍで指定するには
今回のポイントはここなのですが、普通ではExcelのセル幅はｃｍ、ｍｍ単位では指定できません。
高さはできます。
また、全体の用紙のレイアウトを見ながら作業となるとなかなか難しいです。
そこで、表示タブのページレイアウトを選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247287/aacb4ec5-2512-239e-bbfb-3f9498f84c12.png)
一件、印刷プレビューのようにも見えますが、この状態でシート操作ができます。
しかもこの表示モードでは、ｃｍ単位やｍｍ単位での設定が可能なのです。
A列の列見出しを右クリックして、列幅を設定します。
「１４ｍｍ」と入力すれば１４ｍｍの設定ができます。「１．４ｃｍ」と入力してもかまいません。
B列とC列は５５ｍｍに設定します。
１行目の行見出しを右クリックして行の高さを５ｍｍとします。
２行目から４行目は１５ｍｍ、５行目は５ｍｍとします。
# 計算式の設定
セルA1には、１と数値を入力します。
文字色を薄めの灰色にします。
セルA2には、
="〒"&VLOOKUP(A1,一覧表範囲,2,false)
セルA3には、
=VLOOKUP(A1,一覧表範囲,3,false)
「縮小して全体を表示」も設定します。
セルA4には、
=VLOOKUP(A1,一覧表範囲,3,false)&"　御中"
とします。
さらに、セルB1には、
=A1+1
そして、A2からA4までの範囲をB2からB4をコピーします。
すると、1番目、2番目までできます。
この1行目から5行目までのパターンを6行目から10行目までコピーします。
セルA6は
=B1+1
とします。
これで３と４番目ができました。
この状態で6行目から10行目までを、11行目から25行目まで貼り付けます。
これで全パターンができました。
セルA1の値を11にすれば11番目から20番目までのラベルになります。
# 最後に
実際に印刷したところ、大体の寸法はこの方法であうようです。
セル内ではみ出した部分が切れることもありませんでした。
ただ、完璧ではない可能性もあるため、それぞれのセルの上下の配置やインデントなどを設定し、数ミリの余裕は確保して使いましょう。
この方法で、はがき印刷にも応用できると思います。
「発火は非同期、回収は同期」

# はじめに
同期処理、非同期処理がよくわからない時に書いていたコードで、同期処理を多用していて、
パフォーマンスを不必要に下げていました(低レベル)
今は少しレベルアップしたので記録しておきます。
JS初心者で、奇跡的に自分と同じレベルだった人が救われれば本望です。

また、なにか他にいい考え方、あれば教えて欲しいです！

# そして結論
タイトル通りなのですが、



```main.js
getUserData = async() => {
 const user = await Backend.getUser()
 const followers = await Backend.getUserFollowers(user)
 const comments = await Backend.getComments(user)
}
```

これだと、getUserをしたあと、
getUserFollowersをして、その処理が終わった後に
getCommentsを実行します。

なので、

```main.js
getUserData = async() => {
 const user = await Backend.getUser()
 const [followers, comments] = await Promise.all(
  [Backend.getUserFollowers(user), Backend.getComments(user)]
 )
}

or
getUserData = async() => {
 const user = await Backend.getUser()
 const promiseFollowers = Backend.getUserFollowers(user)
 const promiseComments = Backend.getComments(user)
 const [followers, comments] = await Promise.all([promiseFollowers, promiseComments])
}
```


こうすると、
Backend.getUserFollowersと、
Backend.getCommentsは非同期で実行されて、

await Promise.allで、二つの処理が終わってから回収されます！

# 発火は非同期、回収は同期

ですね！

## 追記(rithmety様より)

```main.js

getUserData = async() => {
 const user = await Backend.getUser()
 const follower$ = Backend.getUserFollowers(user)
 const comment$ = Backend.getComments(user)
 const followers = await follower$
 const comment$ = await comments
}

```

これでもいいみたいです。
こちらの方がスッキリ収まっていて、気持ちいいですね
Wi-Fi ルーターをレンタルして遅かったのをなんとかした


[SoftBank E5383 \| \| WiFiレンタルどっとこむ](https://www.wifi-rental.com/item/item23.html)
をレンタルしたのに遅かったので悲しみに暮れながら四苦八苦した経緯を記録する。

#現象
- 11acの速度が明らかに出ていない。86.7Mbpsこれはひどい。

![wifi-11n.png](https://qiita-image-store.s3.amazonaws.com/0/33674/9d8ded06-44ba-74c3-b2ed-ed428a6f895c.png)


#環境

- Windows10 Pro バージョン 1803

- 無線LAN親機　HUAWEI Wi-Fi ルーター『Mobile Wi-Fi E5383』
	- [SoftBank E5383 \| \| WiFiレンタルどっとこむ](https://www.wifi-rental.com/item/item23.html)
	- [Mobile Wi\-Fi E5383 \| モバイルブロードバンド \| ファーウェイ・グローバル](https://consumer.huawei.com/jp/mobile-broadband/e5383/)
	- ソフトウエアバージョン 21.317.00.01.1283
- 無線LAN子機　IO-DATA WN-AC433UMK　『11ac』対応の5GHz専用Wi-Fi子機
	- [WN\-AC433UMシリーズ \| Wi\-Fi（無線LAN）子機 \| IODATA アイ・オー・データ機器](http://www.iodata.jp/product/network/adp/wn-ac433um/index.htm)
	- ドライバーのソフトウェアバージョン 1.05
- PCに挿した子機と親機の距離は1m以内


#解決策
・親機の設定Wi-Fi Bandwidth（Wi-Fi帯域幅）を`20MHz`から`20MHz/40MHz/80MHz`に変更


![wifi-11ac-huawei-settings.png](https://qiita-image-store.s3.amazonaws.com/0/33674/8488d540-5e5f-916d-04a8-88738145b919.png)


![wifi-11ac.png](https://qiita-image-store.s3.amazonaws.com/0/33674/4737113f-3f25-a2a8-478f-e787a262eaed.png)


#その他

実はその前にもこんな問題にひっかかりました。

・子機が`5GHz`に対応していない
＞5GHz対応の子機を購入

・Wi-Fiモードを`2.4G`から`5G`に変更しようとすると「設定の保存に失敗しました。後で再試行してください。」となる
＞親機のタッチパネルメニューではなく、親機の設定ツールへのURL `http://www.huaweimobilewifi.com` からの変更で解決（Wi-Fi ルーターを再起動しても復帰せず、試しにブラウザから操作すると成功。そして以後の変更は問題なくなった。なぜかは不明）

#参考

[無線LAN｜基礎知識](https://www.allied-telesis.co.jp/products/list/wireless/knowl.html)

[無線LANが11ac接続できているか確認する方法 \- ぼくんちのTV 別館](https://freesoft.tvbok.com/web/lan/check_11ac.html)

[Wi\-Fiがつながる通信規格 \| 今日からはじめるWi\-Fiガイド \| BUFFALO バッファロー \| BUFFALO バッファロー](http://buffalo.jp/product/wireless-lan/wi-fi/standard/)

[5GHzの無線LAN、屋外では利用できる周波数はW56のみ！](https://itbouzy.site/wifi/5ghz-outdoors/)
Ruby on Railsを入れようとしたらgemが動かなかった話(SSL認証エラーも起きた)

##起きた問題
MacでRailsを動かそうとした。
がgemが動かなくなった
##解決した方法
1.SSL証明書の有効期限が切れているのが原因のようなので、httpsではなく、httpをソースに変更してアップデートする。

2.PATHを
/usr/bin/ruby -> /Users/ユーザ名/.rbenv/shims/ruby
にすると直った

参考
https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf


##過程
```
rails -v

Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.
```

```
$ sudo gem install rails
Password:
ERROR:  Could not find a valid gem 'rails' (>= 0) in any repository
```

```
$ gem update --system

Latest version currently installed. Aborting.
```
gemのupdateができない・・・

```
$ gem list --remote
*** REMOTE GEMS ***
```
remoteのgemlistも何も表示されない

```
gem source --add https://rubygems.org/
Error fetching https://rubygems.org/:
	SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: tlsv1 alert protocol version (https://rubygems.org/specs.4.8.gz)
```
addしようとすると怒られる

いろいろ調べて
https://qiita.com/hirokishirai/items/7579eaad5132a8e48975
を試してみたが、証明書のディレクトリがおかしいのかうまくいかず、

諦めて一度、

```
$ gem sources --add http://rubygems.org
```
することにした。

```
$ gem update --system
```

```
YAML safe loading is not available. Please upgrade psych to a version that supports safe loading (>= 2.0).
ERROR:  While executing gem ... (Errno::EPERM)
    Operation not permitted - /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/gem
```
こけた… 今度はgemが使えなくなってしまった…

##解決
路頭にまよったが
https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf
を参考にして、~/.bash_profileに 
```eval "$(rbenv init -)"```
を追記した。

```
$ vi ~/.bash_profile
$ source ~/.bash_profile
$ which ruby
/Users/${USER}/.rbenv/shims/ruby
$  gem install bundler
Fetching: bundler-1.16.6.gem (100%)
Successfully installed bundler-1.16.6
Parsing documentation for bundler-1.16.6
Installing ri documentation for bundler-1.16.6
Done installing documentation for bundler after 4 seconds
1 gem installed
```



```
$ gem install bundler
Successfully installed bundler-1.16.6
Parsing documentation for bundler-1.16.6
Done installing documentation for bundler after 3 seconds
1 gem installed
```
gemが動いたーーーーーーーーー！！！

```
$ gem install rails
(略)
30 gems installed
```

無事インストールできましたとさ。

##Railsプロジェクトの作成
```
$ cd [railsプロジェクトを作成したい場所へ移動]
$ rails new [project_name] -d mysql -B
```

作成もできました。
めでたし。

##参考
rubygemが反応しない問題
https://qiita.com/H1r0ak1Y0sh10ka/items/f4370fa57cba163d6262
rbenvでバージョンがうまく切り替わらなかった時にやったこと
https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf
gem installでpermission deniedされました
https://qiita.com/tokimari/items/feda1ed61f2d8b5b317c
PyMC3 で GaussianRandomWalk を使った状態空間モデルの実装

"pymc3 状態空間モデル" とか "pymc3 state space model" でググると、状態方程式(ここでは最も基本的な "ランダムウォーク + ノイズ" のいわゆるローカルレベルモデルとする)の1つ1つの状態変数に `Normal()` を割り当てている、つまり

```python
import pymc3 as pm

...

with pm.Model() as model:

    ...

    # y は入力の時系列データ
    # 本当は i == 0 (初期状態) の時に場合分けをしないといけないが、ここでは雰囲気だけ掴むために省略
    # 気になる人は上のキーワードでググってください
    states = [pm.Normal(name=f"state{i}", mu=states[i - 1], ...) for i in range(len(y))]

    obs = pm.Normal(name='obs', mu=states, observed=y, ...)
```

みたいにしている実装しか見当たらなかった。PyMC は変数の数が増えると実行時間がすごい勢いで遅くなっていくので、このようなやり方だと時系列の長さのオーダーが 1,000 を超えたあたりから普通のマシンではとても辛くなってくる。

PyMC3 ではこのような場合に代わりに `pm.GaussianRandomWalk()` を使用することを推奨している。が、これを使った(少なくともシンプルな)実装が見当たらなかったので書いた(公式ドキュメントにあっても良さそうな気もするのですが)。このメソッドは、上のような(標準)正規分布に従う変数のリストを、あたかも1つの変数として扱うことを可能とする。実行時間もとても速くなる。

以下のベタ書きコードでは、状態誤差(遷移)が平均 0 標準偏差 3 の正規分布、観測誤差が平均 0 標準偏差 1 の正規分布に従うような長さ 100 の時系列データ `y` に対してローカルレベル状態空間モデルをベイズ推定している。ベイズ的でない普通の(？)フィッティングがしたい場合は、例えば `statsmodels.api.tsa.UnobservedComponents()` のカルマンフィルタを使う方法が高速だし標準的だろう。こちらはググると大量の記事が見つかるので割愛。

```python

import numpy as np
import pymc3 as pm
import matplotlib.pyplot as plt

# "観測時系列データ" の生成
y = np.cumsum(np.random.normal(scale=3, size=100)) + np.random.normal(scale=1, size=100)
plt.plot(y)   # 乱数のシードを固定していないので実行のたびに結果は変わる
plt.show()

with pm.Model() as model:
    # 状態誤差が従う正規分布の標準偏差の事前分布
    state_sd = pm.InverseGamma('state_sd', alpha=1.0, beta=1.0)
    # ここが主題。各状態ごとの正規分布のリストの代わりに、用意されている便利な "ランダムウォークの分布" を使う
    state = pm.GaussianRandomWalk('state', sd=state_sd, shape=len(y))
    # 観測誤差が従う正規分布の標準偏差の事前分布
    obs_sd = pm.InverseGamma('obs_sd', alpha=1.0, beta=1.0)
    # 観測値を生成するモデル
    obs = pm.Normal('obs', mu=state, sd=obs_sd, observed=y)
```

事前分布はある程度なんでも良いはずだが、最初に状態誤差・観測誤差それぞれ `pm.Uniform('...', 0, 10)` とかにしたら変なことになった。

以下の一文で作ったモデルをグラフィカルモデル的に表示できる。

```python
pm.model_to_graphviz(model)
```

今回のモデルだとこうなる。

<img width="963" alt="スクリーンショット 2018-10-12 19.48.51.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/81825/337fe7fe-a24c-f8f6-9db6-1175858addf3.jpeg">

推定の実行および結果の表示は以下の通り。

```python
# サンプリングの実行(モデルのパラメタ推定)
with model:
    trace = pm.sample()

# 推定した変数の事後分布およびサンプリング時の値の遷移の表示
pm.traceplot(trace)
plt.show()

# 推定値やp値などの結果のテーブルが返ってくる
pm.summary(trace)   # 結果は省略
```

<img width="848" alt="スクリーンショット 2018-10-12 20.01.22.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/81825/ad3cbf37-53e8-f56d-99da-6338d65e3b92.jpeg">

観測誤差の標準偏差の推定があまりよろしくない。どなたかおかしな箇所があったら教えてください。。

(2018/10/13 追記: その後 `GaussianRandomWalk()` ではなく `Normal()` のリストを使ったモデルでも学習してみたが、結局のところこちらでも似たような傾向の結果となった(下図; 入力データは上のものとは異なることに注意)。なのでこれはモデルの問題ではなく、今回生成しているデータの本質的な推定の難しさによるものかもしれない。もしくは現在全てデフォルトで実行しているサンプリング `pm.sample()` をチューニングすれば改善するかも？)

<img width="852" alt="スクリーンショット 2018-10-13 20.14.40.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/81825/7b645631-05ea-e117-6a3b-103f0f2aa546.jpeg">
Bitrise とかの CI 上だけ一部のテストをスキップさせる方法

例えばの話、API 通信するテストを CI 上ではスキップさせたい。

もちろんそもそもの話、実際の API 通信はアプリ側で保証すべき項目ではなく、基本ローカルで完結するモックとかでテストすればいいですが、たまには手元で実際の通信の確認をすぐにしたい、なのでそのためのテストコードがあればとても便利な場面も多々あります。マウスのワンクリックですぐに結果が確認できますので。

しかしそのテストコードをそのまま上げると CI 上では不都合な場合もよくあります。例えばサーバが IP アドレスで弾いたり、そうでなくても実際のサーバと CI との接続が遅くて予想外のエラーになってしまったり。それはアプリの問題でもないのに CI が通らないので PR がマージできなかったりするのでとても辛い。なのでこれらのテストを CI 上だけスキップさせたい。

Xcode 8 から、Swift のビルド時フラグによるコードの切り替えは `SWIFT_ACTIVE_COMPILATION_CONDITIONS`（Xcode 上表示名 *Active Compilation Conditions*）で制御するようになりました。Build Configuration ごとにこれを変えられるので、Debug ビルドに `DEBUG` というフラグがデフォルトで入っており、これにより `#if DEBUG` を書いておけばこの部分のコードは Debug ビルドにだけ有効になります。なので例えば `BUILT_ON_CI` という「CI 上でのビルドだよ」のフラグがあって、`#if !BUILT_ON_CI` を書いておけば、その部分のコードは CI 環境でスキップできるようになるはずです。問題はどうやってこのフラグを CI でビルドするときだけ立てるかです。

ここでよくある方法は一つ新しい Build Configuration と Scheme を切って、その Build Configuration に `BUILT_ON_CI` のフラグを立てることです。そうすれば CI 上ではこの Scheme をテストするように作れば OK です。問題は筆者の場合はただでさえ Debug ビルドと Release ビルドに加えて、バックエンド環境に応じて Dev 環境、Stg 環境と本番環境がありますので、すでに 2×3=6 通りの Build Configuration があるので、これ以上増やすとビルド時フラグの管理が非常に大変になるのでもう増やしたくないのです。ではどうすればいいのか。
<img width="1440" alt="スクリーンショット 2018-10-12 18.57.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/63998/4fe7acf0-2946-99d5-1937-d79e861c2636.png">

CI 上でのテストは基本 Terminal で `xcodebuild test` コマンド叩くテストです。このコマンドは Scheme やカバレージ出力など、様々な指定を引数で渡せるのですが、残念ながらここで追加の `SWIFT_ACTIVE_COMPILATION_CONDITIONS` を渡す引数がないのです。そして直接 `VARIABLE=FOO` のように、強制的に環境変数 `VARIABLE` を `FOO` で代入することも可能ですが、ここで無理やり `SWIFT_ACTIVE_COMPILATION_CONDITIONS=BUILT_ON_CI` を渡してしまうと Build Configuration に設定されているフラグが全て無視され、間違ったバイナリーが生成されてしまいます。

ところで、環境変数を渡せるということは、逆に言ってしまえば `SWIFT_ACTIVE_COMPILATION_CONDITIONS` に更に別の環境変数を渡してしまえば、その環境変数を設定することによってコマンドラインで必要なフラグを渡せるようになるということです。なのでここでは Xcode のプロジェクト設定の Build Settings に行って、更に User Defined として `EXTRA_SWIFT_ACTIVE_COMPILATION_CONDITIONS` という変数を追加し、`SWIFT_ACTIVE_COMPILATION_CONDITIONS` の最後にこの変数を設定します。
<img width="1440" alt="スクリーンショット 2018-10-12 19.29.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/63998/8a515cfe-b840-380d-4d0d-87d62bf05ed5.png">

画像の中の *+* を押せば、*Add User-Defined Setting* の選択肢が出てくるので、これを押せば最後の *User-Defined* のセクションに新しい項目が追加されます；ここで項目の名前だけ `EXTRA_SWIFT_ACTIVE_COMPILATION_CONDITIONS` にし、値は全て空のままで大丈夫です。そして元々の *Active Compilation Conditions* の中に、各 Build Configuration の設定に `$EXTRA_SWIFT_ACTIVE_COMPILATION_CONDITIONS` を追加すればいいです。

これで CI 側だけ特殊のフラグを入れる準備が整えたので、あとは CI 側の設定だけです。ここは筆者が使っている Bitrise を例に説明します。まずは該当の Workflow の Xcode Test の項目を選択します。
<img width="1440" alt="スクリーンショット 2018-10-12 19.39.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/63998/bbe2a056-a9bd-7b9c-021b-b1d0c5f6ad60.png">

次にその項目の最後に *Debug* というセクションがあるので、それをクリックすると展開され、中には更に *Additional options for \`xcodebuild build test\` call* の項目があります。ここにさっき追加した変数を代入する `EXTRA_SWIFT_ACTIVE_COMPILATION_CONDITIONS=BUILT_ON_CI` を追加すれば完成です。他の CI も設定する場所は違うと思いますが、同じ理屈で設定できると思います。
<img width="1440" alt="スクリーンショット 2018-10-12 19.40.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/63998/415ff53a-a103-af3b-217f-f98676a8613d.png">

以上の設定によって、`#if !BUILT_ON_CI` の部分のコードは、CI 環境だけスキップするようにできました。めでたしめでたし。
Dockerfileのビルド時にOutOfMemoryExceptionが発生する場合の対処方法

# 概要

[Windows Server コンテナ](https://hub.docker.com/r/microsoft/windowsservercore/) のイメージを使用して Dockerfile をビルドしていると、Windowsサーバーの機能のインストール中にメモリ不足の例外が発生しました。対処方法がありましたので記載しておきます。

```:Dockerfile
・・・(略)・・・
RUN PowerShell Install-WindowsFeature Print-Server
・・・(略)・・・
```

```:コマンドプロンプト
docker build -t server .
・・・(略)・・・
Step 18/25 : RUN PowerShell Install-WindowsFeature Print-Server
 ---> Running in d6c2e805d8cb

Unhandled Exception: OutOfMemoryException.
・・・(略)・・・
```

# 対処方法

Dockerfile のビルド時にコンテナのメモリ上限を指定することで回避できます。
メモリ上限の指定は `-m` オプションに続けてメモリサイズを指定します。

```:コマンドプロンプト
docker build -t server -m 4g .
```
[iOS][fastlane][BITRISE] 構築メモ

iOSのビルド環境をfastlaneでBitriseに組んでみたメモ

# やりたい事

- 指定のブランチにpushされたら、ビルドしてfabricのBetaに配布
- 環境毎に色々変える
- なるべくfastlaneで

# 構成
- XCode (9.3)
- fastlane (2.105.2)
- GitLab (self-host)
- Bitrise

---

# やった事
## Bitrise
ほぼfastlane呼ぶだけ。Code SigningやSecrets、Env Varsなし

```yml:bitrise.yml
---
format_version: '5'
default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
project_type: ios
workflows:
  beta:
    steps:
    - activate-ssh-key:
        run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}'
        inputs:
        - verbose: 'true'
    - git-clone:
        inputs:
        - update_submodules: 'no'
    - cache-pull: {}
    - fastlane:
        inputs:
        - lane: beta
    - cache-push:
        inputs:
        - cache_paths: "$BITRISE_CACHE_DIR"
trigger_map:
- push_branch: beta/*
  workflow: beta

```

## fastlane

- `import_from_git`でPrivate RepositoryのFastfileからENVに読み込む

```ruby:fastlane/Fastfile
default_platform(:ios)

import_from_git(
  url: "ssh://git@hoge/secret.git",　branch: "master"
)

platform :ios do

  lane :beta do |options|
    if is_ci?
      ENV["FASTLANE_PASSWORD"]=ENV["APPLE_ID_PASSWORD"]
    end

    match

    update_build_number
    add_badge(dark: true)

    build(
      app_identifier: ENV["APP_IDENTIFIER_BETA"],
      provisioning_profile: ENV["PROVISIONING_PROFILE_BETA"],
      development_team: ENV["TEAM_ID"]
    )

    if is_ci?
      add_git_tag
      push_git_tags
    end

    crashlytics
    upload_symbols_to_crashlytics

  end
end
```

- `increment_build_number`が使いにくかったので`update_build_number`を作った

```Ruby
  private_lane :update_build_number do
    app_version = get_info_plist_value(path:'./Info.plist', key: 'CFBundleShortVersionString')
    next_build_number = "#{app_version}.#{number_of_commits}"
    set_info_plist_value(path: './Info.plist', key: 'CFBundleVersion', value: next_build_number)
    lane_context[SharedValues::BUILD_NUMBER] = next_build_number
  end
```

- Xcode9とmatchでgymがうまくいかなった分の対応
  - Exit status: 65とかExit status: 70とか

> [Fastlane gym does not use provisioning profile set by match](https://github.com/fastlane/fastlane/issues/12849)

```Ruby
  private_lane :build do |options|
    settings_to_override = {
      :BUNDLE_IDENTIFIER => options[:app_identifier],
      :PROVISIONING_PROFILE_SPECIFIER => options[:provisioning_profile],
      :DEVELOPMENT_TEAM => options[:development_team]
    }
    gym(xcargs: settings_to_override)
  end
```

### 設定はそれぞれに

```ruby:fastlane/Appfile
apple_id ENV["APPLE_ID"]
team_id ENV["TEAM_ID"]
```

```ruby:fastlane/Matchfile
git_url "ssh://git@hoge/certificates.git"
for_lane :beta do
    force_for_new_devices true
    type "adhoc"
end
```

```ruby:fastlane/Gymfile
for_lane :beta do
    scheme "Beta"
    export_method "ad-hoc"
end
```

# やりたい事

- deliverでrelease
- slackからbeta, release
- danger
TypeScriptとioredisのコードをJestでテストしたらコンストラクタじゃないと言われた件

## 📝 TypeScript と ioredis のソースコード

TypeScript で Redis 使いたい場合は [ioredis](https://github.com/luin/ioredis) で書いてこんな感じのコードになる（ちなみに ES6 で Promise 導入されてからはレガシーなままの [node_redis](https://github.com/NodeRedis/node_redis) 使ってる人も少ないと思う）。

### sample.ts 

```javascript
import * as Redis from 'ioredis';

(async () => {
  const redis = new Redis();
  const pong = await redis.ping(); // => PONG
})();
```

このコードは正しく動く。

## 🌡 Jest のテストコード

ところが Jest でテスト書いたら実行できなくてハマってしまった。

### sample.spec.ts

```javascript
import * as Redis from 'ioredis';

describe('Redis', () => {

  it('should be reply pong', async () => {
    const redis = new Redis();
    const pong = await redis.ping();
    redis.disconnect();
    expect(pong).toBe('PONG');
  })

});

```

`.ts` ファイルを直接実行するので [ts-jest](https://github.com/kulshekhar/ts-jest) を入れている。

```
$ jest
    TypeError: Redis is not a constructor

      4 |
      5 |   it('should be reply pong', async () => {
    > 6 |     const redis = new Redis();
        |                   ^
      7 |     const pong = await redis.ping();
      8 |     redis.disconnect();
      9 |     expect(pong).toBe('PONG');

      at Object.it (src/sample.spec.ts:6:19)
```

`TypeError: Redis is not a constructor` 

## 😵 なんでやねん

```javascript
import * as Redis from 'ioredis';
const redis = new Redis();
```

 のところでコンストラクタじゃないと言われる。書き方は正しいのに。  

```javascript
import Redis from 'ioredis';
```

に直したら動いた。間違ってるのに。  
まぁそんなこともあるのかな、と思って現実逃避したりもしたけど、テストファイルをコンパイルして `.js` ファイルにしてテスト実行してみるとエラーになる。

```
    TypeError: ioredis_1.default is not a constructor

      4 | describe('Redis', () => {
      5 |     it('should be return pong', async () => {
    > 6 |         const redis = new ioredis_1.default();
        |                       ^
      7 |         const pong = await redis.ping();
      8 |         redis.disconnect();
      9 |         expect(pong).toBe('PONG');

      at Object.it (dist/sample.spec.js:6:23)
```

`TypeError: ioredis_1.default is not a constructor`  
やっぱり間違ってるいるわけだ。

## 👾 原因

`ts-jest` にバグがあったようだ。でも Issue からは見つけられなかった。

```json
"devDependencies": {
    "@types/ioredis": "^4.0.3",
    "@types/jest": "^23.3.5",
    "jest": "^23.6.0",
    "ts-jest": "^21.2.4",
    "typescript": "^3.1.3"
  }
```

`yarn upgrade --latest ts-jest` して `23.10.4` にしたら治った。
Symfony3のTwigでGlobal値を利用する方法

## 概要
TwigでGlobal値を利用する場合はconfig.ymlで読み込むか、Twigの拡張を利用する方法がある
基本は前者でよいと思うが管理方法は人それぞれなので二種類メモしておく

## 動作環境
- Symfony 3.4.15
- Twig 2.5.0

## 方法1:config.ymlに定義する
```config.yml
# Twig Configuration
twig:
    globals:
        # parametersから読み込む場合
        base_url: '%base_url%'
        site:
            name: 'テストサイト'
```
config.ymlの肥大化を防ぎたい場合はtwig.ymlとかに書いてimportすれば良い

### templateで使う
```sample.twig
{{ site.name }}
```

### Controllerで使う
```php
<?php
    /**
     * @Route("/", name="sample")
     * @Method("GET")
     */
    public function sampleAction()
    {
        $twigGlobalValues = $this->get('twig')->getGlobals();
        dump(site_name)
    }
```


## 方法2:Twigの拡張設定を行って定義する
### yamlにGlobal値を定義する
```src/AppBundle/Resources/config/global_params.yml
site:
    name: 'テストサイト'
```

### twigの拡張設定をする
```src/AppBundle/Twig/AppExtension.php
<?php
namespace AppBundle\Twig;

use \Symfony\Component\Yaml\Yaml;
class AppExtension extends \Twig_Extension implements \Twig_Extension_GlobalsInterface
{

    /**
     * Global値を取得する
     * @return array
     */
    public function getGlobals()
    {
        $app_global = Yaml::parseFile(__DIR__.'/../Resources/config/global_params.yml');

        return array(
            'app_global' => $app_global,
        );
    }

}
```

### templateで使う
```sample.twig
{{ app_global.site.name }}
```

### controllerで使う
```php
<?php
    /**
     * @Route("/", name="sample")
     * @Method("GET")
     */
    public function sampleAction()
    {
        $twigGlobalValues = $this->get('twig')->getGlobals();
        dump($twigGlobalValues['app_global']);
    }
```
VSCodeのエクスプローラー(サイドバー)をキーボードだけで操作したい

# 動機
VSCodeって、エディタ上から特定のフォルダにファイルを新規作成する時、

1. エクスプローラーでフォルダを選択
2. 上の方にあるファイル作成ボタンをクリック
3. ファイル名を入力
4. エンター
 
っていう手順を踏む必要があります。
ファイルを作成するときに、マウスを触らないといけないのは辛いのです。
そこで、ある程度の基本的な操作は、マウスを触らずともできるようにキーマップを弄りました。
Qiitaで共有する理由は、「エクスプローラー上からファイルをエディタグループに開く」という処理が中々見つからなかったためです。

# 処理とその設定
emacsっぽい移動と、Atomっぽいファイルの作成にしました。

## focusの上下方向の移動
```javascript
    {
        "key": "ctrl+p",
        "command": "selectPrevSuggestion",
        "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && textInputFocus"
    },
    {
        "key": "ctrl+n",
        "command": "list.focusDown",
        "when": "explorerViewletFocus && listFocus &&explorerViewletVisible && !inputFocus"
    }
```

## フォルダの展開と折りたたみ
```javascript
    {
        "key": "ctrl+b",
        "command": "list.collapse",
        "when": "explorerViewletFocus && listFocus &&explorerViewletVisible && !inputFocus"
    },
    {
        "key": "ctrl+f",
        "command": "list.expand",
        "when": "explorerViewletFocus && listFocus &&explorerViewletVisible && !inputFocus"
    }
```

## ファイル作成とフォルダ作成
エクスプローラー上で、作成したい場所まで移動してから、コマンド入力

```javascript
    {
        "key": "a",
        "command": "explorer.newFile",
        "when": "explorerViewletFocus && listFocus &&explorerViewletVisible && !inputFocus"
    },
    {
        "key": "shift+a",
        "command": "explorer.newFolder",
        "when": "explorerViewletFocus && listFocus &&explorerViewletVisible && !inputFocus"
    }
```

## ファイルの削除とリネーム
削除の際に、確認画面が出ます。
この確認画面ですが、向こうにすることができます。
また、向こうにしたくない場合、OS側の設定(mac)でtabキーとspaceキーで選択できるように設定できます。

```javascript
    {
        "key": "d",
        "command": "deleteFile",
        "when": "explorerViewletFocus && listFocus &&explorerViewletVisible && !inputFocus"
    },
    {
        "key": "ctrl+enter",
        "command": "renameFile",
        "when": "explorerViewletFocus && listFocus &&explorerViewletVisible && !inputFocus"
    }
```

## エクスプローラとエディタの移動
私は、エクスプローラへの移動は、quickOpenViewを開いて、キーから手を離す(一番上が選択される)というキーマップでやってます

```javascript
    {
        "key": "ctrl+q",
        "command": "workbench.action.quickOpenView",
    },
    {
        "key": "escape",
        "command": "workbench.action.focusActiveEditorGroup",
        "when": "explorerViewletFocus && listFocus &&explorerViewletVisible && !inputFocus"
    }
```

## focusが当たっているファイルを開く
こんな簡単なコマンドがなかなか見つけられなかった……。
ちなみに、フォルダに対して行うと展開します。

```javascript
    {
        "key": "enter",
        "command": "list.select",
        "when": "explorerViewletFocus && listFocus &&explorerViewletVisible && !inputFocus"
    }
```

# 終わりに
他にも、こういう操作便利じゃない？とかあったら、コメントくださるとうれしいです。
dockerでlaravelの環境構築

# はじめに
今回の環境構築にはLaradockを使用します。
LaradockとはLaravelの開発環境をDockerで実現するためのパッケージです。
Laravel以外にもSymfony、CodeIgniter、WordPress、Drupalなども含まれているみたいです。(Laravelの環境構築以外は試していないです)

# 実行環境
OS: windows 10 pro
git: 2.17.0
docker: 18.06.1

# 構築手順
Laradockをcloneする 

```bash
git clone https://github.com/Laradock/laradock.git
```

laravelプロジェクトを配置するためのディレクトリを作成
今回はlaradock配下に作成

```bash 
cd laradock
mkdir laravel_project
```

laradock配下にenv-exampleがあるのでコピーして.envを作成

```bash 
cp env-example .env
```

コンテナを構築、起動

```bash 
docker-compose up -d nginx mysql phpmyadmin redis workspace
```

.envファイルに設定を修正、追加

```bash 
[修正前]
APP_CODE_PATH_HOST=../

[修正後]
APP_CODE_PATH_HOST=./laravel_project
```

```bash 
[追加]
DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd
```

workspaceのbashに入り、laravelプロジェクトを作成

```bash 
docker exec -it laradock_workspace_1 bash
```

パッケージリストの更新

```bash 
apt-get update
```

laravelプロジェクトを作成

```bash 
composer create-project laravel/laravel sample
```

sampleに移動し、storageとchcheに権限を付与

```bash 
cd sample
chmod 766 storage
chmod 766 bootstrap/cache
exit
```

nginxのbashに入り、ドキュメントルートを変更

```bash
docker exec -it laradock_nginx_1 bash
vi /etc/nginx/nginx.conf.default
```

```vi:nginx.conf.default
[修正前]
root /var/www/public;

[修正後]
root /var/www/sample/public;
```

bashから抜けて、コンテナを再起動する

```bash
docker-compose restart
```

[ http://localhost ]にアクセスして終了
作成途中の遺伝学学習VBAに機能追加

こんばんは。

Excel　VBAで作成している遺伝学学習VBAに

Deleteメソッドとモジュールを追加して

特定範囲の削除ができる様にしました。
![2018-10-12.png](https://qiita-image-store.s3.amazonaws.com/0/200171/93d78104-3557-06e0-66d6-ff04c5b4c13b.png)

Quiz Startと書かれたモジュールの下に

『履歴削除』と書かれたモジュールを付加し

履歴削除を押すと、一気に消えます。

こうして機能を追加していっていますけども

日によって結果っていうのは変わってくると思うので

そういう事にも対応できるように

Addメソッドを使ってアクティブシートの切り替え、シートの名称変更など

ができる様にしていきたいと考えております。

こちらがある程度完成した段階で

国際会計士対策のVBA作成にも移っていきます。

そちらは、Income(収益)やLiability(負債)と言ったような

勘定項目や現金出納帳や元帳や精算表などを英語表記に

変換したようなものなどがランダムに出る様にしていこうかと考えております。

色々な理解が深まるようにしていこうと考えております。

発達障害ながらも、１行読み飛ばしてしまうとかどこから読書再開かわからなくなる

といった特性への訓練でもあるので

頑張って読み進めながら、それと同時にVBAのほうの学習も

楽しくできたらなと思っています。

また、明日更新いたします。
AWS アクセスキーを人為的ミスで流出させたときの記録（Risk credentials exposed）

流出したのは、IAM のユーザー（S3 bucket full access 権限のみ）に割り当てたアクセスキー。

# 経緯
1. `10/10 17:30` GitHub の public レポジトリに AWS のアクセスキーを push してしまう
2. `10/10 18:30` ダッシュボードでアラートが出ていて気づき、レポジトリから対象のファイルを削除（コミット履歴もさかのぼって削除）
3. `10/10 18:30` ワシントンから :telephone:（スルーする）
4. `10/11 00:00`（キーは削除していたし安心していた）
5. `10/12 16:30` ワシントンから :telephone:（出る。聞き取れない。10分後くらいに📩するねといわれ（た気がしたので）**yes, please** とだけ伝える）

# アラートが出た図
認証情報（`aws_access_key_id` と `aws_secret_key`）が外部に漏れているという Issue が出ています。

**Risk credentials exposed**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/e6e3b152-e2be-cb05-44aa-efbec18a904e.png)

# 📩にあったサポートURLからメッセージでやり取りができた

> To contact us again about this case, 
please return to the AWS Support Center
using the following URL:
> `https://console.aws.amazon.com/support/home#/case/?displayId={問いあわせID}&language=en`


上記のページからメッセージを送ることができたので、「**キーを削除したけど、解決しているか確認してもらえますか？**」 という返信をしてみた。

## ステータス お客様によるアクション完了済み（？）
> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/06a67a32-215f-2723-fe9e-d7f00495a3f7.png)

メッセージフォームの上部にある情報をよくよく確認してみたら、**完了済み**と書かれている。これは **ケースのクローズ** を実行して、自分で Issue を閉じるというプロセスが必要なのだろうか。
Amazon Lightsailにdockerコンテナを２分でデプロイする

Amazon Lightsailにdockerコンテナを２分でデプロイします。

# 前提

+ awsアカウントがセットアップ済み
+ 動作するdocker-compose.yml
（ここでは例としてdocker-redmineを使います）

# 方法

+ AWS lightsailのページからインスタンスの作成を選びます
+ インスタンスイメージの選択で以下を選択します。
 + プラットフォーム:　Linux/Unix
 + 設計図の選択: OSのみ Ubuntu 16.04LTS
+ 起動スクリプトの追加をクリックして以下のコードをコピーします

```
curl -o docker-compose.yml https://raw.githubusercontent.com/sameersbn/docker-redmine/master/docker-compose.yml
curl -o ./install.sh https://gist.githubusercontent.com/bellx2/3085b3ee771440a8664fbc86ce9826d2/raw/
chmod +x ./install.sh
./install.sh
```
※先頭はサンプルとしてdocker-redmineのdocker-compose.ymlをダウンロードしています。

+ インスタンスプランを選択します
+ インスタンスの名前は適当に指定します。
+ 作成をクリックして１～２分ほど待ちます

docker-redmineは10083ポートを使いますので以下の手順が追加で必要です。
+ インスタンスの右端をクリックして「管理」を選びます
+ ネットワーキングの「ファイアウォール」に```カスタム,TCP,10083```を追加し保存します
+ ```http://ipアドレス:10083/```にアクセスするとredmineが開きます

# 解説

起動スクリプトで空のubuntuに以下を行います

+ docker-compose.ymlをダウンロードします。
+ 以下のURLよりインストールスクリプトをダウンロードして実行します。

https://gist.github.com/bellx2/3085b3ee771440a8664fbc86ce9826d2

 + dockerのダウンロード
 + ubuntuユーザーにdockerの権限付与（sudo不要に）
 + docker-composeのインストール
 + docker-compose.ymlの移動
 + docker-composeのサービス登録
 + docker-compose up

docker-compose.ymlを入れ替えればいろいろ応用が効くかと思います。

# 参考

Deploying Docker Containers on Amazon Lightsail
https://www.youtube.com/watch?v=z525kfneC6E
git 忘れがちなコマンド　メモ

たまに使う忘れがちなgitのコマンドをメモ程度に
いちいち調べるの面倒だしね

##ブランチの名前を変更
###今いるブランチの名前を変更
	git branch -m <新しいブランチ名>
###今いるブランチ以外の名前を変更
	git branch -m <古いブランチ名> <新しいブランチ名>

##ブランチ削除
###リモートブランチ削除
	git push --delete origin <消したいブランチ名>
###ローカルブランチ削除
	git branch -D <消したいブランチ名>

##git log系
###そのコミットでコミットされたファイルと修正箇所を表示
	git log -p <コミットID>

##直前のコミットメッセージを修正
	git commit --amend
	もしくは
	git commit -m '修正版コメント' --amend
古のNagiosでURL監視

### やりたいこと
特定URLのレスポンスコードを監視したい
例）
http://example.com/example_path へアクセスしてステータスコード200であれば正常
それ以外のステータスコードであれば異常とみなしエスカレーションする

### 設定
- まずコマンドの型を定義します

@command.cfg

```
define command{
        command_name    check_http_url
        command_line    $USER1$/check_http -H $ARG1$ -u $ARG2$ -e $ARG3$
        }
```

引数の説明：
-H　対象のアドレス（ドメイン）
-u　ドメイン以降のパス
-e　ステータスコード


- 次に実際の監視コマンドとして定義します。
上記で定義した型に従い、各引数の値を感嘆符で区切って記述します

@services.cfg


```
define service{
        use                             generic-service
        host_name                       example.com
        service_description             HTTP URL
        [省略] 
        check_command                   check_http_url!example.com!/example_path!200
        }
```

このあとnagiosのconfigtestを実施し問題ないようであればreloadを実施、上記で設定した監視が開始されます。
[メモ] lldb で変数を見られない原因はAddress Sanitizerかも


# 現象
- lldbでローカル変数のpoとかexprしようとすると `error: <EXPR>:3:1: error: use of unresolved identifier 'hogehoge'` とエラーが出る

- Xcode の Variables View でもちゃんとアドレスが表示されず、右クリックしてPrint Description of "hogehoge" したときもエラーが出る

# なおった方法
schemeのAddress Sanitizerをoffにするとなおりました。(Edit scheme... → Run → Diagnostics → Address Sanitizer)

(そういえばしばらく前にAddress Sanitizerを含めいくつかデバッグ用の設定をonにしたxcodeprojをコミットしていた。犯人を探していたら犯人は私だった。)

# 今回関係なかった方法
- optimization を off にする → 既にoffになっていた
PHP基礎（１）変数と型について

#プログラムの始まりと、コメントの書き方

<?php ・・・・・・PHPはこのタグで始まります
そして
?> ・・・・・・・・このタグで終わります

```php
<?php
echo 'プログラミングを学ぼう'; // 単一行コメント
/* ↑ステートメントの終わりにはセミコロン(;)を付けます。
このように改行して何行でもOK */
echo 'PHP、こんにちは'; # シェル型単一行コメント 
```

#変数と型

PHPの変数は変数名の先頭に$を付けて、=の右辺の値を左辺の変数に代入する形で、型が解釈されます。

```php
<?php
$i = 100; // これで変数$iは100という数値の入ったinteger型になります。
$a = true; // 真偽値：boolean型(true or false)
$str = 'xyz'; // 文字列：string型
$pi = 3.14; // 浮動小数点：float型

echo $str; // echoはカッコを省略できて変数の値を見るのに手軽です。
var_dump($pi);// var_dumpという関数で変数の型とバイト数も確認できます。
var_dump(gettype($a)); // gettypeという関数で変数の型を知ることができます。

$s = $str . '123'; // 文字列の連結はピリオド(.)を使います。
var_dump($s);
$sum = $i + 12; // 四則演算もできます。
var_dump($sum);

// 型判定is_int:数値であれば真となる 
if (is_int($i)) {
  $i += 123;
  var_dump($i); 
}
// 型判定is_string:文字列であれば真となる
if (is_string($s)) {
  var_dump("String:\n $s"); 
}
?>
```
ちなみに文字列の中で改行したい場合はバックスラッシュ(\\)nと書きます。（これを特殊文字と言います）

文字列の括りで使う、ダブルクォーテーション(")とシングルクォーテーション(')の違いは次のようになります。

- ダブルクォーテーション
文字列中の変数を変数値に置換する。特殊文字（バックスラッシュで始まる改行など）を出力する。

- シングルクォーテーション
文字列中の変数を変数値に置換しない。特殊文字はエスケープする（文字としてバックスラッシュを出力する）


そのため内部的にダブルクォーテーションの方が高機能な処理を行っておりシングルクォーテーションの方が単純です。通常はシングルクォーテーションを使うようにしましょう。

##ヒアドキュメントについて

文字列リテラル（リテラルとはコード内で表現する値そのものの固定的な表記のこと）で、改行を含む長い文章を書きたいとき下記のように始まり〜終わりを示します。

```php
$msg = <<< EOS
この文章を改行を含めて
文字列リテラルとしてコード
に書けます。
EOS;

```
「EOS」は始まり〜終わりを示すための印で、スタートとエンドが同じであれば何でも良いです。上記の例では変数＄msgに文字列を代入しています。

#nullについて

何もないことを示すnull(ヌル)という値があります。例えば

```php
<?php
$num = null;
var_dump(gettype($num)); // => NULL
?>
```
というように変数にnullを代入してその変数の型を調べるとNULL型となります。null値はNULL型で唯一の取り得る値になります。

[PHP基礎（２）配列＞＞](https://qiita.com/taka027/items/06a81e2150b0ccb1a17c)
【TIPS】UITableViewCellの高さの自動計算されてないときの対処法

iOS開発でハマったのでメモとして残しておく

## 事象
iOS11ではUITableViewのレイアウトが崩れていないのにiOS10ではUITableViewのレイアウトが崩れてしまっていた。

## 原因
- 自動で高さを計算してくれてなかった。
- AutoLayoutの制約をStoryboardではなくコード上でレイアウトが組まれていただけだった。

## 対処
- iOS10以前もサポートするアプリは

```
public func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}
```

これでOSのバージョンに関係なく高さを自動で計算できます。

# 参考
[UITableViewのrowHeightやestimatedRowHeightに何を設定すると良いのか](https://qiita.com/masashi-sutou/items/bb8ac89c717dcbe56123)