OmniAICreator/Qiita-1.07M huggingface dataset:
「.swiftlint.yml」のルールが機能しなくハマったこと

.swiftlint.ymlに`line_length`のルールを記載したのに反映されないことがありハマりました。
AppDelegateなどでコメントのwarningがでていたのでLintに以下のルールを追加しましたが、反映されませんでした。

```:.swiftlint.yml
line_length:
  warning: 300
  ignores_comments: true
```
SwiftLintのバージョンが古いとか、RULEに半角スペースが3つあるとかでも反映されないような現象があるみたいですが、
私の場合は違いました。

## 試したこと
- Homebrewをupgradeしてswiftlintの入れ直し。
- YAMLが正しく書いているか確認。
    - YAMLlint - The YAML Validator http://www.yamllint.com/
- swiftlintのupgrade / swiftlintのuninstall


## 結論
`.swiftlint.yml`は`xxx.xcodeproj`と同じ階層にないと反映されない。
私の場合、githubからcloneしてきたので以下のディレクトリの構成になっていました。

```:before
SampleProject
    ├── SampleProject
    │   ├── SampleProject/...
    │   ├── SampleProject.xcodeproj
    │   └── SampleProjectTests
    ├── .swiftlint.yml
    ├── README.md
    ├── .gitignore
    └── .git
```
以下のようにルートディレクトリに`xxx.xcode.proj`と`.swiftlint.yml`を同じ階層に置けばルールが適応されました。

```:after
SampleProject
    ├── SampleProject/...
    ├── SampleProject.xcodeproj
    ├── SampleProjectTests
    ├── .swiftlint.yml
    ├── README.md
    ├── .gitignore
    └── .git
```

cloneしてからプロジェクトファイルを作るとプロジェクト名のディレクトリがダブるので、
プロジェクトファイルを作成してから、` git clone http://xxxxxx.com/xxxxxx.git .`をした方がよさそうと思った。
最後の`.`はリポジトリと同名のディレクトリを作らないためにつける。

## 参考
How to use swiftlint command and Xcode Script when .swiftlint.yml file not in the same folder with project.xcodeproj? · Issue #2673 · realm/SwiftLint
https://github.com/realm/SwiftLint/issues/2673

git clone でディレクトリを作らない | 株式会社Orfool
https://orfool.com/programing/2206/

SwiftLintを試してみた - Qiita
https://qiita.com/ushisantoasobu/items/b494c9cf7d78a968b373

SwiftLintのdisabled_rules一覧(実例付き) - Qiita
https://qiita.com/akatsuki174/items/6da27f7ccdd0572f8927

SwiftLintの運用ノウハウ - Qiita
https://qiita.com/shtnkgm/items/6dd756aa14926736c6f5
Expo+Redux(+firebase)でログインフォーム⑤　〜入力フォームとログインロジックの実装〜

# はじめに
この記事は、[Expo+Redux(+firebase)でログインフォーム④　〜ReactNavigationを使った画面遷移〜](https://qiita.com/AtsushiNi/items/5c1aad6349e3a3bccee3)　の続きです。
この記事では、ログイン画面の入力フォームを作り、firebase.Authenticationを使ったパスワード認証のロジックを書いていきます。
オブジェクト指向の継承による肥大化を避ける方法

オブジェクト指向の特徴としてよく出る継承という仕組み。
便利ではありますが、調子に乗って使うと痛い目を見ます。

# 継承の例

わかりやすい例としてはゲームのキャラクターで表すとわかりやすいです。

・キャラクターは名前とHPとMPを持っています。また、回復するためのメソッドを持っています。
・ヒーローは必殺技回数を持っています。
・敵は経験値とお金を持っています。

```js:キャラクター
class Character {
  string name;
  int hp;
  int maxHp; // 最大HP
  int mp;
  int maxMp; // 最大MP
  
  // 回復する
  recoveryHp( value ) {
    int hp = this.hp + value;
    if( maxHp < hp){
      this.hp = maxHp;
    }else{
      this.hp = hp;
    }
  }
}
```

```js:ヒーロー
class Hero extends Character {
  int skillCount;
}
```

```js:敵
class Enemy extends Character {
  int exp; // 経験値
  int money;
}
```

Hero と Enemy は Character を継承しています。
こうすることで、Hero も Enemy も名前と hp と mp の仕組みを両方持つことができます。
また、recoveryHp も使うことができます。

```js
hero = new Hero();
hero.name; // 使える
hero.hp; // これも使える
```

こうすると、Character自体に power(攻撃力) が増えるなど、追加要素があっても継承元の Character クラスを直すだけで、
Hero にも Enemy にも機能が追加できます。

# 機能を増やそう

例えば、キャラクターの顔アイコンであるサムネイル画像を返す仕組みが必要になったとしましょう。

```js
class character {
  // 
  // 既存の処理
  //
  string iconUrl;

  createThumbnail() {
    binary = download(character.iconUrl);
    image = Image.create(binary);
    return image;
  }
}
```
このように処理を増やすと、サムネイル画像を取得するメソッドが作れます。
hero でも enemy でも呼び出すだけで、サムネイル画像が取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147535/56b2b02b-dd33-61f9-e7b6-2ea807a9289a.png)

めでたしめでたし。。。

# 次第にどんどん機能拡張されていく...

ところが次に起こることとして、Characterにどんどん機能が増えていくのです。
例えば、power という力の項目が増えたり、防御力が増えたり必要な項目がどんどん増えます。
メソッドでも、毒状態になり、HPが減っていく。キャラクターボイスを再生するの機能も増えるかもしれません。

これを対応していくと、次第に Character にメソッドがどんどん増えていって、
1000行を超えることになります。

# そして神クラスへ・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147535/7ad03c38-4bab-f0a3-cf20-727b213be8c4.png)


神と呼ばれるクラスになって、扱いづらくなり、飲み会での愚痴に繋がっていったりしていきます。
こんなの良くないですよね・・・。

# ではどうするか

分割していきます。

先程例で示したサムネイル作成の処理は分けられたりします。
以下のようなクラスを作ります。

```js
class ThumbnailCreator {
  static createCharacter(charcter) {
    binary = download(character.iconUrl);
    image = Image.create(binary);
    return image;
  }
  
  static createItem(item) {
    binary = download(character.iconUrl);
    image = Image.create(binary);
    return image;
  }
}
```

サムネイルを作る処理は ThumbnailCreator に分割できました。
これで Character から処理を省くことができました。
また、ThumbnailCreator には、 Item のサムネイル作成処理など、
サムネイル作成系は全部入れたりできます。
サムネイル作成のための共通的な処理もここに入れておくことができます。

元の Character には、以下の処理だけいれておいても良いです。

```js
class Character {
  createThumbnail() {
    return ThumbnailCreator.createCharacter(this);
  }
}
```

こうすることで処理を別クラスへ移動できつつ、呼び出し方も変わらない理想的な状態ができます。

同様にボイス再生処理も、 voiceManager などのクラスを作って分割していくことができます。

出来上がりのイメージはこのような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147535/7f6fcfb2-09b1-6fef-fa71-7e9e89d02796.png)

このように1クラスを太らせすぎないように、神にならざるクラスとし、
適切に処理を分割していくことが設計において重要です。

# まとめ

**とりあえず先に開発して、あとでリファクタリング**

ではなく、

**リファクタリングと新規開発を 50:50 など常に力を配分しておく**

そうすることでプロダクトを高品質に保ち続けることができます。
[Unity] DOTween のシーケンスを使いまわしたい君へ [Sequence]

## 問題

DOTween のシーケンスは非常に便利だが、そのままだと作った瞬間に実行しはじめ、挙句の果てには自分をKillしてしまう。
これだと使いまわせない。

## 結論

これ足せ。

```cs
.Pause()
.SetAutoKill(false)
.SetLink(gameObject);
```

実行時はこれ。

```cs
sequence.Restart();
```

関数にすると便利だね。

```cs
using DG.Tweening;
using UnityEngine;

public static class Utilities {
    public static Sequence CreateReusableSequence(GameObject linkTarget) {
        return DOTween.Sequence()
            .Pause()
            .SetAutoKill(false)
            .SetLink(linkTarget);
    }
}
```

## サンプル

```cs
using DG.Tweening;
using UnityEngine;

public class Ahan : MonoBehaviour {
    private Sequence sequence;

    private void Start() {
        sequence = DOTween.Sequence()
            // 好きなようにTweenする
            .Append(transform.DOScaleX(1f, .0f))
            .Append(transform.DOScaleX(0f, .1f))
            // ここからが大事
            .Pause()
            .SetAutoKill(false)
            .SetLink(gameObject);
    }

    private void Update() {
        if (Input.GetButtonDown("Fire1")) {
            sequence.Restart();
        }
        if (Input.GetButtonDown("Fire2")) {
            sequence.Restart();
        }
    }
}
```

## 説明

コメントの通り以下の三行が、シーケンスを再利用可能なものにしている。

```cs
.Pause()
.SetAutoKill(false)
.SetLink(gameObject);
```

一行ずつ見ていこう。

### .Pause()

シーケンスは作られたらすぐに実行しようとするせっかちな男だ。
止めよう。


### .SetAutoKill(false)

シーケンスは一度実行されるとすぐに自殺しようとするメンヘラだ。
刃物は取り上げておこう。

### .SetLink(gameObject);

シーケンスはゲームオブジェクトがDestroyされても生き続ける孤独な不老者だ。
一緒に死ぬ相手を紹介してあげよう。

## これで君もニッコリ

やったね！
javaでAtCoder Beginner Contest 156を解く

AtCoder Beginner Contest 156お疲れ様でした！
[公式ページ](https://atcoder.jp/contests/abc156)

今回の自分の書いたコードは[こちら](https://github.com/ko-flavor/atcoder-java/tree/master/atcoder/src/abc/abc156)
結果はA-DまでAC、Eはコンテスト終了後5分でACできました。悔しい:cry:

以下簡単に解説します。

##[問題A](https://atcoder.jp/contests/abc156/tasks/abc156_a)

引数にNとKが与えられ、
Kが10以下の場合にはNに`100*(10-K)`を足し算する問題。

100点問題っていう感じの難易度だったかと思います。

##[問題B](https://atcoder.jp/contests/abc156/tasks/abc156_b)

とある数字がK進法だと何桁かを出力する問題。
while文でぐるぐるまわして桁数をカウントしていけば大丈夫です。

```java
while (n >= k) {
	n = n / k;
	digit++;
}
```

##[問題C](https://atcoder.jp/contests/abc156/tasks/abc156_c)

数直線上にN人の人がいて、その全員の移動距離の二乗和を最小にする点と二乗和を求める問題。
まずN人の人の中心となる座標を選定して(整数じゃないといけないのが注意)
あとは単純に二乗和を足し算しました。

`N<=100`となっていたので、計算量はあんまり気にしなくて大丈夫そうでした。

##[問題D](https://atcoder.jp/contests/abc156/tasks/abc156_d)

二項係数的な問題。以下の性質を使用します。

```math
2^n = {}_n C _0 + {}_n C _1 + {}_n C _2 + ・・・\\
    = \sum_{k=0}^n {}_n C _k\\
```

すると、計算すべきは、

```math
2^n - {}_n C _0 - {}_n C _a - {}_n C _b
```
となります。

##[問題E](https://atcoder.jp/contests/abc156/tasks/abc156_e)

法則を見つけられたのが終了10分前とかで、実装が間に合いませんでした、、
もともとN個の部屋に1人ずつ入っていて、1回移動が起こると、どこかの部屋が0になることに気づきました。

K個の部屋が0人の場合の組み合わせを計算してみました。すると、

```math
{}_n C _k \times {}_{n-1} C _{n-1-k}
```
となります。具体的に言うと、n=6,k=2の場合は、

```math
{}_6 C _2 \times {}_5 C _3
```
です。なので、この和をとって、

```math
\sum_{i=0}^k \left( {}_n C _k \times {}_{n-1} C _{n-1-k} \right)
```

です。k=1のときとkが大きいときはまた別途考慮が必要でしたが、基本は以上で計算できました。
逆元を最初に計算して計算量の部分はうまく書けたのに、あとちょっとでした。

##[問題F](https://atcoder.jp/contests/abc156/tasks/abc156_f)

手つかずです。なんか入力も多くて難しい気がしたのでスルーしました。笑

----

レーティングは944→974。

全体的に少し難しかったように思えます。
E問題があともう少し・・・で手が届かず。でも、もう少しでE問題に手が届きそうだったので成長の実感は得られました！
次こそはE問題ACしたい・・・！

あと、TeX使って数式書いてみました。やっぱり美しいですね:chart_with_upwards_trend:
Struts2 を手動でwarファイルにしてデプロイするには

＃目的
eclipseなしでStruts2をtomcatに配備する方法を知る。
前提：クラスファイルはコンパイル済み
#フォルダ構成
<img width="312" alt="スクリーンショット 2020-02-22 22.54.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/a85c3d27-cf63-db2e-3502-2cf07b455baf.png">

Struts2Calcというプロジェクトがあったとして、
トップページがindex.jsp
controllerパッケージにCalcAction.class
beanパッケージにCalcFormBean.class

というのがあるとすると上図のようになる。

classファイルがbinとかにある場合はこのようにclassesフォルダを作って移動させておく。
struts.xmlなどもclassesフォルダ直下になる。

#warにする

```terminal:terminal
cd ~/JavaProjects/Struts2Calc
jar cvf Struts2Calc.war -C WebContent .
```

で、warファイルができるので
これをtomcat/webapps/
に配置するとデプロイできる。

#実はwarにする必要はない
どこをみてもtomcatにデプロイするにはwarを作ってwebappsフォルダに入れるように書いていますが、
試しに上のフォルダ構成でwarにせずにそのままwebappsに持っていっても動きました。
warファイルの正体はzipファイルで、tomcatは単にそれを普通に解凍しているだけのようです。
とはいえwarにするのが常識なので普通はそうしたほうがいいです。
GCPでNAT構築と、CloudSQL+mroonga on GCEスレイブしようとして断念

公式ドキュメントに書いてあるけどね。

## NAT構築

### やること
Cloud NAT使わずに自前でNATインスタンスを構築

### なんで
開発環境で、可用性がそんなにいらない。落ちたら立て直せばいいし。
通信量もそんなに無いし…ってことで貧乏構成でいこうじゃあないか。
というわけでf1-micro/centos7。

### 成功の手引き
https://cloud.google.com/vpc/docs/special-configurations#natgateway

### 一応
VPCやサブネットの作成は割愛。ドキュメントにも載ってるし、かなり前に自分でも書いた。
ドキュメントはCUIで進めてるけど自分はコンソールでやりました。
インスタンス名はここでは`yasui-nat`とでもしましょう。

注意点は、インスタンス作成時にオプションのネットワークタブにあるIP転送チェックボックス、これ忘れたら後からいじれないんじゃないかって気がするくらいです。ネットワークタグは`pub`とでもしましょう。

ドキュメントには`no-ip`ってタグがすごい胸張った感じで出てくるので「このタグそのものに何か意味があるのか？」と最初怯みましたが、別に何だって動きます。ここでは適当に`priv`とかにしましょうか。
多分↑のドキュメント、VPCがデフォルトルールなのが前提なのか、GCP内部NWからNATへの通信を許可するためのルール設定が割愛されてます。`pub`は`priv`からのパケットは基本全部許可するようなファイアウォール設定を忘れずにしときましょう。勿論、利用ポートが完全に絞れているなら全部じゃなくても問題なし。

あとは書いてある通り

```bash
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 確認
iptables -v -L -t nat
```
で転送設定を書き、ネットワーキングのルート設定から、送信IPを`0.0.0.0/0`、タグは`priv`でネクストホップは`yasui-nat`を指定します。

これでまあいけるかと思います。
設定の保存に関しては、

```bash
yum -y install iptables-services
/usr/libexec/iptables/iptables.init save
```
でいけるって見ましたが、自分の場合この設定入れたあとインスタンス止めてイメージ化、イメージから起こしなおしたらiptableの設定は無くなってました。かなしみ。

## CloudSQL+mroonga on GCE
結論、__ムリです__

・CloudSQLにはプラグイン突っ込めない
・ならばGCEでスレーブ作ってスレーブ側でmroonga入れれば良いのでは？

↓

・mroongaはトランザクションが効かないエンジンである
・GTID_MODEはトランザクション効かないエンジンに機能しないし、マスターとスレーブで異エンジン・同一テーブルの場合ONにしたらアカン
・CloudSQLはGTID_MODEを触れない上にデフォルトONである(ちなみにAWS RDSはパラメータグループでOFFに出来る)
・ｺﾞﾌｯ

検索に使うタネとelasticsearchとかに突っ込んでキーだけ取得、キーでDBからデータ本体持ってくる仕組みに作り変えるか、それともmysql on GCEにするか…で悩んだけど後者にすることにしたよもう。
DBだけはAWS使うっていうウルトラCも一瞬頭によぎったけど転送量高そうだし…
javascript超基礎


# 型

| 型の名前| 種類| 特徴 |
|:-----------------|:------------------|:------------------|
| プリミティブ型|文字列,数値,null,真偽値,undefined|値渡し |
| オブジェクト型|配列,オブジェクト |参照渡し|


# 変数と定数

- 最近のプログラミングでは、なるべくconstを使いつつ、必要なときにletを使う。
    - (varは古い)
- 使える文字は英数字、$、_のみ。
    - (ハイフンは使えない)
- 数値から始められない。
- JavaScriptでは大文字と小文字は区別される。
- 予約語は使えない。
- constで定義しても配列なら上書きできる。

# 値の再代入

```javascript
let price = 500;

// price = price + 100;
price += 100; // 600

// price = price * 2;
price *= 2; // 1200

// price = price + 1;
// price += 1;
price++; // 1201

// price -= 1;
price--; // 1200
```

# JavaScriptデータ型

- 文字列(String)
- 数値(Number)
- Undefined
- Null
- 真偽値(Boolean)
- オブジェクト(Object)

※nullをtypeof関数でチェックするとobjectと認識されるのはJavaScriptの有名なバグ

# 数値からなる文字列

- 「+」は文字列の連結のための演算子となる
- 足し算にしたい場合はparseInt()で数値に変換する。

```javascript
console.log('5' * 3); //15
console.log('5' - '3'); //2

console.log('5' + 3); //53
console.log(parseInt('5', 10) + 3); //8

console.log(parseInt('hello', 10)); //NaN
```

# 真偽値

false:0,null,undefined,'',false
true:上記以外

# テンプレートリテラル

変数の値を文字列中に埋め込む機能。他の言語ではよく見られる機能。

```javascript
for (let i = 0; i <= 10; i++) {
    console.log(`hello ${i}`);
}
```

# 関数

仮引数にはletやconstなどの宣言は不要。

```javascript
function showAd(message = 'Ad') { // 仮引数
    console.log('----------');
    console.log(`--- ${message} ---`);
    console.log('----------');
}
```

# 関数宣言と関数式

関数式は関数を定数や変数に値として代入するため、最後に;が必要。
関数式で渡す関数には名前がないため、無名関数とよく呼ばれる。

```javascript
//関数宣言
function 関数名(仮引数,仮引数) {
    処理;
    return 返り値;
}
//呼び出し
関数名(実引数,実引数);

//関数式
const 定数名 = function(仮引数,仮引数) {
    処理;
    return 返り値;
};
//呼び出し
定数名(実引数,実引数);
```
【C++】負の数を正の数で割ったときの余りを求める

#はじめに
ABC156で負の数を割ることを考慮した計算が必要だったので忘れないように書き起こします。

#コード
```c++
#include <iostream>
using namespace std;

const int MOD = 5;
int main(void){
    //この書き方だと正しく求められない
    cout << -32%MOD << endl;//want:3 out:-2
    cout << -31%MOD << endl;//want:4 out:-1
    cout << -30%MOD << endl;//want:0 out:0
    
    //この書き方なら正しく求められる
    cout << (-32%MOD+MOD)%MOD << endl;//want:3 out:3
    cout << (-31%MOD+MOD)%MOD << endl;//want:4 out:4
    cout << (-30%MOD+MOD)%MOD << endl;//want:0 out:0
}

```

#終わりに
C++なら上記ソースコードの後半部のように書けばOKです。ABC156-D問題はこれで通せました。

【コメント欄での補足】
C++11 以降は余剰の符号が言語仕様で規定されたようです。C++11　以降なら負数に対する剰余演算はあまり気にせず行えばよいとのことです。ご指摘ありがとうございます。
docker + vagrant　つまった

https://qiita.com/yuki_ycino/items/cb21cf91a39ddd61f484

### 結論
x6高速化した(およそ)

```
root:/app# time be rails c
exit
Loading development environment (Rails 5.2.1)
[1] pry(main)> exit

real    0m34.178s
user    0m4.220s
sys     0m5.320s
root@265ac4de7a75:/app#
```

```
root:/app# time be rails c
exit
Loading development environment (Rails 5.2.1)
[1] pry(main)> exit

real    0m5.528s
user    0m3.944s
sys     0m1.032s
root@55ab770832b2:/app#
```

測定方法がわからなかったので、rails consoleとexitを間髪入れずに入力して、timeで測定しました。

### 成果物
https://github.com/kajirikajiri/docker-vagrant

### 以下つまったところ

#### vagrant sshで接続して、curlできない

エラー curl: (6) Could not resolve host: get.docker.com

```
vagrant ssh
sudo dpkg-reconfigure resolvconf
sudo vi /etc/resolv.conf
# 追加２行
nameserver 8.8.8.8
nameserver 8.8.4.4
```

---

#### dockerコマンドでエラーが発生

エラー If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

```
sudo docker　でok
上記のようなエラーが発生するため、分かりづらい。(premission deniedとか言ってほしい)

https://qiita.com/rysk92/items/e10f898abdc701e09e38
上記記事のようにしてもできるはず
```

---

#### ファイル監視数の上限が足りない

```:ok
vagrant ssh
echo "fs.inotify.max_user_watches = 524288" >> /etc/sysctl.conf && sysctl -p
```

```:ng
docker exec -it container_name bash
echo "fs.inotify.max_user_watches = 524288" >> /etc/sysctl.conf && sysctl -p
```

https://qiita.com/enta0701/items/bc9f8f8c780222979784
vagrant内でファイル監視数上限を上げることでok
最初、dockerコンテナ内で監視上限をあげようとして、失敗した

---

#### pcが急にシャットダウンする

pcのメモリ16GBに対して
vagrant 8GB
docker 8GB
を与えたら落ちました。たぶんそれで落ちたと思うので、メモリは確認しましょう

---
ベイグラントって読むんですね
https://ja.wikipedia.org/wiki/Vagrant_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)
PythonでABC156のA,Bを解く

###はじめに
こんばんは、tax_freeです。[前回](https://qiita.com/taxfree_python/items/6a3cebdffd9e580aec9c)からレートが**15**下りました。今回はAとBしか解けませんでした。悔しい

###A問題
[問題](https://atcoder.jp/contests/abc156/tasks/abc156_a)

**考えたこと**
問題文のとおりに計算するだけ。

```python
n, r = map(int,input().split())
if n < 10:
    print(r+(100*(10-n)))
else:
    print(r)
```

###B問題
[問題](https://atcoder.jp/contests/abc156/tasks/abc156_b)

**考えたこと**
10進法からn進法に変換して、lenで長さを調べている。
[参考にした記事](http://iatlex.com/python/base_change)

```python
n, k = map(int,input().split())
def Base_10_to_n(X, n):
    if (int(X/n)):
        return Base_10_to_n(int(X/n), n)+str(X%n)
    return str(X%n)
print(len(Base_10_to_n(n,k)))
```
###C問題
[問題](https://atcoder.jp/contests/abc156/tasks/abc156_c)
問題文を読んで、できなさそうだったので諦めてDに行きました。

###D問題
[問題](https://atcoder.jp/contests/abc156/tasks/abc156_d)
$2^n$の計算を高速化する方法を知らなかったので解けず。

###まとめ
非常に勉強不足だと思いました。最近、勉強していなったツケが模試だけでなく競プロにも回ってきている感があります。勉強します。おやすみなさい
Automation Anywhere A2019でユニバーサルレコーダを使う方法とアクションパレットから組み立てる場合の違い

Automation Anywhereでは、レコーダーからフローを作成 (画面操作を記録) する場合と、アクションパレットからアクションをドラッグ＆ドロップしてフローをくみ上げる場合とで、できあがる結果が違います。UiPathではレコーダーを使ってもアクティビティをシーケンスにドラッグ＆ドロップしてくみ上げる場合でもできあがる結果が同じなので、注意が必要です。

A2019では以下の通り、できあがるフローに違いが出てきます。
空のメモ帳を起動しておいて、本文に「abcde」と入力してみることを想定してみましょう。

# ユニバーサルレコーダーで記録する場合
Botを新規作成後、「レコード」ボタンをクリックしてレコーディングを開始します。ウィンドウ選択ダイアログボックスで「無題 - メモ帳」を選択して記録を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/8e108c7a-326a-9a55-3146-90d03b86a95d.png)

メモ帳の本体にマウスカーソルを合わせると赤く枠が表示されるのでクリック、その後、本体の中で「abcde」とキーボード入力した後、レコーダーツールバーの「End Recording」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/0698e871-cefc-f82f-ab4c-ebd154c47120.png)

できあがったフローを見ると**「レコーダー: Capture」**というアイコンが挿入されています。クリックしてアクションの詳細を見ると、メモ帳ウィンドウを指定、プレビューを見ると本体部分が赤い四角でキャプチャされており、そのオブジェクトプロパティが表示されていて、そこにSet text (テキストを入力)で「abcde」と入力されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/7b3b946b-30e8-a85f-e917-f25b3cb4a779.png)

>「レコーダー: Capture」はひとつのオブジェクトに対する一つの操作 (つまり「1ステップ」) ごとに作成されます。複数ステップの操作を記録すると、その数だけ「レコーダー: Capture」アイコンが作成されます。

# アクションパレットから作成する場合
アクションパレット内に「キーストロークのシミュレーション」というアクションがあるので、これをフロー内にドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/990f172a-f183-0170-8bca-b6b21c03215c.png)
アクションの詳細を開いて、まずウィンドウ選択フィールドで最新のウィンドウ一覧にリフレッシュした後、ドロップダウンから「無題 - メモ帳」を選択、その後キーボード操作フィールドに移動して「abcde」と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/f64193b9-740e-4f3f-833b-f754d6fdf55a.png)

>注: アクションパレットの中にも「レコーダー: Capture」アクションがあるので、それを使って画面記録を1ステップずつ足していくことも可能です。つまり、このように作ればレコーダーによる記録と同じ結果となります。

# まとめ
どちらの場合でも、保存後、Botを実行すると同じ結果が得られます。どちらで組み立てるかは通常は好みで選んで問題ありません。(場合によっては、やり方によって成功率やスピードに影響が出る場合があるので、そのような場合は両方試してチューニングしていくことになります)

では、また！
AtCoder Beginner Contest 156 参戦記

# AtCoder Beginner Contest 156 参戦記

## [ABC156A - Beginner](https://atcoder.jp/contests/abc156/tasks/abc156_a)

4分で突破. 書くだけ.

```python
N, R = map(int, input().split())

if N >= 10:
    print(R)
else:
    print(R - 100 * (10 - N))
```

## [ABC156B - Digits](https://atcoder.jp/contests/abc156/tasks/abc156_b)

2分で突破. 書くだけ. K進数の 10 は K で、100 は K<sup>2</sup> だと分かっていれば、K で何回割れるか調べるだけと分かるはず.

```python
N, K = map(int, input().split())

result = 0
while N != 0:
    result += 1
    N //= K
print(result)
```

## [ABC156C - Rally](https://atcoder.jp/contests/abc156/tasks/abc156_c)

3分半で突破. 書くだけ……なのは、この計算をしなれてるからなんですが. (X<sub>i</sub>−P)<sup>2</sup> が最小になる P は重心. 減色の K-means で3次元のこの計算をしてます…….

```python
N = int(input())
X = list(map(int, input().split()))

P = int(sum(X) / N + 0.5)
print(sum((x - P) * (x - P) for x in X))
```

## [ABC156D - Bouquet](https://atcoder.jp/contests/abc156/tasks/abc156_d)

70分半で突破. まず <sub>n</sub>C<sub>0</sub>+<sub>n</sub>C<sub>1</sub>+...+<sub>n</sub>C<sub>n</sub> = 2<sup>n</sup> を知っていないといけない. 私は知りませんでした orz. パスカルの三角形の Wikipedia 見てたら書いてあって知りました. これで過去に書いた mcomb を貼って終わりかと思ったら n! を求める部分があって 2≤n≤10<sup>9</sup> に殺される. a, b はたかだか 10<sup>5</sup> であることに気づき、<sub>n</sub>C<sub>k</sub> を求める別の式に組み替えてようやく解けた. 良問!

```python
def mcomb(n, k):
    a = 1
    b = 1
    for i in range(k):
        a *= n - i
        a %= 1000000007
        b *= i + 1
        b %= 1000000007
    return a * pow(b, 1000000005, 1000000007) % 1000000007


n, a, b = map(int, input().split())

result = pow(2, n, 1000000007) - 1
result -= mcomb(n, a)
result + 1000000007
result %= 1000000007
result -= mcomb(n, b)
result + 1000000007
result %= 1000000007
print(result)
```
haml,scssで画面実装

フロント画面実装
display: flex;の使い方がやっとわかってきた気がする
link_toの使い方が全然わからない、iconの方はカリキュラムにあるがEditボタンへの使い方が分からないので明日はそのやり方を検索して全体の8~9割は必ず終わらせたい。
HerokuのPostgreSQLのdbをみる方法

Herokuでデータベース絡みのエラーが発生！
何が起きているのかデータベースを覗いてみる方法。

### PostgreSQLのバージョンを確認
```
$ heroku pg:info
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           0/20
PG Version:            12.1
Created:               2020-02-21 12:18 UTC
Data Size:             8.3 MB
Tables:                6
Rows:                  10/10000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off
Add-on:                postgresql-crystalline-37699
```

### psql コマンドが入っていないと見れない
```
$ heroku pg:psql
--> Connecting to postgresql-crystalline-37699
 ▸    The local psql command could not be located. For help installing psql, see
 ▸    https://devcenter.heroku.com/articles/heroku-postgresql#local-setup
```

psql コマンドをローカル環境に入れていきましょう！
バージョンを揃えるため、最初に確認したinfoにある　
*PG Version: 12.1*　をインストールします。

###　PostgreSQLをインストール
```
$ brew install postgresql
```
これだけです。非常に簡単。



### これでpsqlコマンドが使えるようになりました！
```
$ heroku pg:psql
--> Connecting to postgresql-crystalline-37699
psql (12.2, server 12.1 (Ubuntu 12.1-1.pgdg16.04+1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.
```


####おまけ
今までmysqlしか使ったことなかったので
postgreSQLのことはこれから勉強します。。。
分かりやすいコマンドまとめです。
[https://dev.classmethod.jp/server-side/db/postgresql-organize-command/](https://dev.classmethod.jp/server-side/db/postgresql-organize-command/)
AtCoderで黄色になるまでにやったこと

2月16日、ついにAtCoder黄色に到達しました。（2度目ですが）
AtCoder黄色に到達するまでにやったことをまとめます。

# 灰色まで
初コンテストは[ABC097](https://atcoder.jp/contests/abc097)で、この時は2完して初めてレートが付きました。
これまでには、AOJのIntroduction to Programming（現在のIntroduction to Programming 1）を使って基礎的な知識をつけていました。
自分が競プロを始めた時には、APG4bがまだ充実していなかったのでAOJが主流でしたが、現在はAPG4bを使うのもアリだと思います。

# 茶色まで
特に何かをした覚えはありません。灰色までの頃と同じように、AOJとAtCoderの問題を特に何も考えずに埋めていたくらいです。
あと、確かこのころ[蟻本](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC2%E7%89%88-%EF%BD%9E%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E6%B4%BB%E7%94%A8%E5%8A%9B%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%EF%BD%9E-%E7%A7%8B%E8%91%89%E6%8B%93%E5%93%89/dp/4839941068)を買いました。

# 緑色まで
蟻本を読み始めました。
あとは、@e869120 さんの[STL講習会](https://drive.google.com/drive/folders/1HCOnXzyiqwUrARBBHHXpJe-H9gyHYv0B?usp=sharing)（埋もれていたので、僕が許可を取って公開しています）を読みました。これは緑色以降の伸びに大きくかかわったと思います。
このころはちょうど中学1年の夏休みで、このころに結構精進をした記憶があります。
AtCoderには関係ないですが、JOI（日本情報オリンピック）の難易度5相当の問題をたくさん埋めました。これもこのあたりのレート帯の人にとってはとてもいい練習です。

# 水色まで
このころも、特に何も考えずひたすら精進をしていました。たぶん主に400点を埋めていました。
とはいえ、ad-hocな考察を要するような、現在だとDifficultyが1700くらいの問題は一切解けなかったと思います。
このころはコンテストの質的にも、早解きでレートが上げやすかったのが原因だと思います。

# 青色まで
時代は令和になり、いわゆる「令和ABC」になってからRatedが増えて、青入りしました。
青入りしてすぐは、AGCでもABCでも好調で、すぐにレートを1800前後まで上げられました。
このころまでには、400点問題までは全部埋めていたはずです。
しかし、そこから長い停滞に入ります。
この停滞の中で、現在の自分につながるような考察力の強化やアルゴリズム力の強化ができたように感じます。
400点問題を埋め終わり、難しめの500点、そして600点問題を中心的に埋めるようになります。
この中で、AtCoderで要求されるような500点-600点を素早く解く頭の回転が鍛えられたのだと思っています。

# そして、黄色
初めて黄色入りしたのは、2019年11月23日です。
この日は自分の競プロ人生に残るような大成功を収め、初めての橙パフォーマンスを取って一気に黄色入りしました。
そのあとはしばらくRatedがないまま黄色コーダーとして[GigaCode 2019](https://atcoder.jp/contests/gigacode-2019)や、[パ研合宿2019](https://atcoder.jp/contests/pakencamp-2019-day3)、そして日本情報オリンピック二次予選などの競プロのイベントに臨んでいました。

# また青
しかし、黄色になって次のRated,AGC041で水色Difficultyが解けないという大失態をやらかし、また一気に青に引き戻されます。
そのあとも、スピードが勝負のABCでなかなか結果を残せないままでした。とはいえ、この時期も、先に述べた青色での停滞期と同じように、実力を多少つけられたと思います。
やることとしては、ひたすらラスボス級の500点と600点を解くだけ。
そして、レートの上下を繰り返しながら、最終的にはABCの早解きでレートを黄色まで持っていきました。

# 2度目の黄色
そして今、もう1度黄色に返り咲きました。
また青には戻りたくないですね…

# おわりに
水色までは効率的に努力して、蟻本を読んで、落ち着いてコンテストに出ればどうにでもなります。
実際、ほぼ無精進で水色まで、場合によっては青まで到達している人もいます。（とはいえ、僕のいたころの環境と今とは少し違うので、昔よりは大変かもしれません）
青以降は、500点や600点をひたすら演習して実装力、考察力を上げましょう。
競プロ、頑張りましょう！！！
ABC156 解説

[ABC156](https://atcoder.jp/contests/abc156)の解説です。
36:51全完で、12位を取って最高記録を更新しました。
では、解説に入ります。
# [A問題](https://atcoder.jp/contests/abc156/tasks/abc156_a)
問題文解読ゲーです。
$N$ が $10$ 以上の場合とそうでない場合に分けるか、$max$ で適当に処理するかしましょう。
それでもこれはB問題相当くらいあると思うのですが…

# [B問題](https://atcoder.jp/contests/abc156/tasks/abc156_b)
結論から言えば、${\rm ceil}(\log_K N)$ を求めればいいのですが、$N$ を $K$ で順々に割っていくのが一番楽で早いです。

# [C問題](https://atcoder.jp/contests/abc156/tasks/abc156_c)
集会をする位置を全探索します。
$X_i$ の制約を考えると、集会は $1$ 以上 $100$ 以下のどこかで開かれるので、これを全部試せばよいです。

# [D問題](https://atcoder.jp/contests/abc156/tasks/abc156_d)
$1$ 以上 $n$ 以下の、 $a,b$ 以外のすべての整数 $i$ について ${}_n\mathrm{C} _i$ を計算して、その総和を求めます。
$N$ の制約は大きいので、このままだと間に合いません。

```math
\sum_{i=0}^{N} {}_N \mathrm{C} _i=2^N
```
が成り立つことはあまりにも有名で、これは前提知識となります。
結局、$2^N$ から ${}_N\mathrm{C} _a$ と ${}_N\mathrm{C} _b$ と $1$ （0本の場合）を引いたものが答えです。

# [E問題](https://atcoder.jp/contests/abc156/tasks/abc156_e)
D問題に引き続き、組み合わせの問題です。
$n$ と $k$ の条件を満たすような人数の組み合わせは、どのような性質があるでしょうか。
結局のところ、条件を満たすのは、$0$ 人の部屋が $k$ 部屋以下であることと同値です。
$k\geq 2$ の条件がないと実はこれは成り立ちませんが、簡単に証明できるので省略します。
$0$ 人の部屋の個数を $i$ 個と決めたとすると、この時の組み合わせの個数は、人の入る部屋への人の入り方と、人の入る部屋の集合の選び方を考えて、

```math
{}_{i} \mathrm{H} _{N-i}\cdot{}_{n} \mathrm{C}_i={}_{n-1} \mathrm{C}_i\cdot{}_{n} \mathrm{C}_i
```
となるので、これを $i$ が $min(n,k+1)$ 未満になるまで計算して加算すればよいです。

# [F問題](https://atcoder.jp/contests/abc156/tasks/abc156_f)
それぞれのクエリで構成される数列は、$x_i$ を初項として、差が $d$ の各要素の繰り返しによって周期的に変化する数列です。
それぞれのクエリについて、$d$ の各要素と$x_j$ は、$\bmod{m_j}$ で考えて問題ありません。
$(a_j \bmod{m_i})<(a_{j+1} \bmod{m_i})$ となる $j$ の個数は、$(a_j \bmod{m_i})\geq(a_{j+1} \bmod{m_i})$ とならない $j$ の個数を $n_i-1$ から引いたものに他なりません。
これを求めることで答えを引き算で求めることを考えます。
まず、$(a_j \bmod{m_i})=(a_{j+1} \bmod{m_i})$ となる場合は、$d$ の各要素が加算されるときにそれが $0$ かどうか考えればいいので、周期性を利用すれば簡単に求められます。
$(a_j \bmod{m_i})>(a_{j+1} \bmod{m_i})$ となる時には、modの世界で繰り上がりが起きている、と解釈して、最初から最後までで繰り上がりが何回起こるか計算します。$d$ の各要素について先にmodをとっておき、ここでも周期性を利用して初項からmodの値がいくら増えるかわかれば、繰り上がりの回数も計算できます。
こうして、$(a_j \bmod{m_i})\geq(a_{j+1} \bmod{m_i})$ となる $j$ の個数が求められたので、答えが求まりました。
計算量は各回のクエリで $O(k)$ で、全体で $O(kq)$ です。

# おわりに
今回は、前回とは違って結構な早解きセットでした。
DとEで数学力が試されたのもありましたが、簡単めな回だったと思います。
Fは、とてもABCらしい問題だと思いました。
ではまた。
入れ子v-forでselectを使う

# 概要
入れ子v-for中のselectタグの選択に応じて、表示を変えたい場合に詰まったのでメモ

# デモ

<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="js,result" data-user="tyariponzu614" data-slug-hash="QWbGmPZ" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="v-for usage">
  <span>See the Pen <a href="https://codepen.io/tyariponzu614/pen/QWbGmPZ">
  v-for usage</a> by らい さむ (<a href="https://codepen.io/tyariponzu614">@tyariponzu614</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
基本情報技術者　ストラテジ系　第1章 システム戦略⑤

 
# ⑤経営管理システム

## SCM
Supply Chain Management

商品供給全体の効率化と最適化を計らるマネジメント手法

## CRM
Customer Relationship Management

顧客との関係を密接していく手法

## SFA
Sales Force Automation

情報システムを利用して、革新的に営業活動を効率化させる考え方。

## ナレッジマネジメント
知識の共有化を図る手法
経験などのデータバンク化

## ビジネスシステム
ビジネス現場の情報システム

### POS
Point of Sales: 販売時点情報管理
レジなどのデータをまとめる

### EOS
Electronic Ordering System: 電子発注システム
PCを用いて発注業務を行う手法

## エンジニアリングシステム
生産現場で利用される情報システム

### MRP
Material Reguirements Planning: 資材所要量計画
必要量を求め、資材の手配を行う

### CAD
Computer Aided Design
設計図面を作成

## e-ビジネス
インターネットを利用したビジネスで下記のような種類があります。

EC: Electronic Commerce　電子証取引
　　オンラインショッピング

EDI: Electronic Data Interchange 電子データ交換

### EC

#### BtoB
企業対企業

#### BtoC
企業対個人

#### CtoC
個人同士

#### GtoB
公共対企業

#### GtoC
公共対個人

### EDIの規約

#### 取引基本規約

#### 業務運用規約
障害時の対応など

#### 情報表現規約
交換データの記述方法

#### 情報伝達規約
通信プロトコルに関わる取り決め

## ICタグ
RFID: Radio Frequency IDentification

商品識別タグ
laravelで404エラーになる人（モデルが原因かも）

#結論
モデルが違う

#パターン1
例えば
今はAモデルのデータを引っ張ってきて表示しています。
![404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/529af885-e763-d6c6-7b24-6a1767a00379.png)


editをクリックすると404エラーです。
![4041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/3e5884e8-ff84-d270-573d-d726f819c04a.png)

理由としてはeditはBモデルのデータを引っ張ってきていたからです。
※Bモデルのテーブルの中身はこの場合、空

Bモデルのテーブルに中身が入っていたらBモデルのデータが表示されますが、Aモデルを表示しておいてeditを押すとBモデルのデータが表示されるのは意味が分からないのでどちらかに統一しましょう。


#パターン2
![delete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/cf49e9e0-5a3d-f75e-4482-1ed860ca0c57.png)

画像の"×"ボタンを押すと削除されるはずだが・・・

![4041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543413/b075da7c-6e47-33de-7dbb-ea7f015e65e3.png)

404エラーです。

これも同じく、Aモデルのデータを引っ張ってきているのに"×"を押した先はBモデルの削除が実行されているからです。

DBにBモデルの中身は存在しません。よって404エラー

※理由は上記と同じ


##コード修正

```php:web.php
//変更前　中身が空っぽのpostモデル
 Route::delete('/posts/{post}', 'PostsController@destroy');

//変更後
 Route::delete('/posts/{ico}', 'PostsController@destroy');
```

```php:PostsController
//変更前 中身が空っぽのpostモデルを引っ張ってきて削除
   public function destroy(Post $post) {
      $post->delete();
      return redirect('/');
    }


//変更後
   public function destroy(Ico $ico) {
      $ico->delete();
      return redirect('/');
    }
```
【Vim】Python自動補完プラグインKiteの使い方

こんな感じでpythonの自動補完できる。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">今日はKite pluginをインストールしたので偉い。 <a href="https://t.co/ThViz69Wj2">pic.twitter.com/ThViz69Wj2</a></p>&mdash; 春はあげぽよ (@78910jqk13) <a href="https://twitter.com/78910jqk13/status/1231200773096099846?ref_src=twsrc%5Etfw">February 22, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
##注意
**vimについてのみインストールとその後の使い方メインです**
英語がわかる人は[KiteのGithubリポジトリ][offgit]をみたほうが正確です。
他のEditerについては [Kite公式サイト][off]
vimはvim8以上に対応のようです。

#Kiteとは
Kiteはコーディングを、今流行りのdeep learningを使って手助けくれるプラグインです。Pyhtonの自動補完プラグインとしては[YouCompleteMe][you]や[Jedi][jedi]などがありますが、[Kite公式サイト][off]でこれら既存のプラグインとの違うKiteの特徴が3つ挙げられています。
1.補完の候補をランク付けしてくれること
2.行補完ができること。
3.自動化されたスニペットが利用できること
#インストール
OSに応じて[公式サイト][off]にしたがってください。
linuxでvimにインストールする場合、

```bash:bash
bash -c "$(wget -q -O - https://linux.kite.com/dls/linux/current)" 
```
をterminalでたたいてインストールしてもいいし
[このマニュアル][manins]のとおりに.vimにgithubから直でインストールしてもok
vimを起動して終わりです。



おしまいです。
#使いかた
pythonファイルを開きます。
なんか打ったら、imp　とか打ったら動画のように補完候補がでてくるので
キーボードで上、下（またはCtrl-p [コントロールを押しながらp] Ctrl-n）で選択して、Ctrl-yで確定。
スニペットはCtrl-j Ctrl-kで移動できる。動画だとnp.linspaceのところでやってる。
これで使えないことはないけど、Ctrl-pが押しづらい人は、key-bind変えるために

```vimscript:.vimrc  
inoremap <silent> hh <C-p> "挿入モード中、hhで選択を下に移動
inoremap <silent> nn <C-n> "挿入モード中、nnで選択を上に移動
let g:kite_tab_complete=1 "tabで確定

```
とか.vimrcに書き加えればいいです
もっと色々変えたかったら[githubのリポジトリ][offgit]をみればいいと思います。

#困ったこと
jedivimと併用できない。
.vimrcに
setlocal completeopt-=preview
autocmd FileType python setlocal completeopt-=preview
とか書いていると補完できない。

[off]:https://kite.com/
[jedi]:https://github.com/davidhalter/jedi-vim
[you]:https://github.com/ycm-core/YouCompleteMe
[offgit]:https://github.com/kiteco/vim-plugin
[manins]:https://github.com/kiteco/vim-plugin/blob/master/DEVELOPMENT.md
【UiPath】InvokeWorkflowFileのタイムアウトはアクティビティの途中でも中断させるのか確認してみた

## 概要
![キャプチャ2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/0ae5e10f-b326-76d4-af92-7a4742ee951f.jpeg)
UiPathのInvokeWorkflowFileアクティビティではプロパティでタイムアウトを設定できます。
さて、このタイムアウトが発生した時に、実行中だったアクティビティは
終わるまで待ってくれるのか？中断されるのか？というところを確認してみました。

結論としては、中断されるようです。

## 検証
以下のワークフローで検証してみます。
![シーケンス4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/7c9e05ed-cdca-0a98-8f72-fdac7b71e2d8.jpeg)
![60秒待機.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/f12842a4-b14e-f8b0-c5f0-65b584315778.jpeg)

60秒待機.xamlの中の「待機（Delay）」アクティビティは<b>60秒</b>待つ設定。
一方、「ワークフロー ファイルを呼び出し（InvokeWorkflowFile）」は<b>30秒</b>のタイムアウトを設定しています。[^1]
フローの初めと終わりで時間を出力し、30秒で終わるのか60秒で終わるのか計ります
実行してみると…。


|![キャプチャ3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578020/ae29479f-c207-5b8d-7ebc-e77100e8315c.jpeg)|
|:-:|
`開始：09:29:28`
`終了：09:29:58`
きっちり30秒で終了しています。
待機アクティビティは実行中だったはずですが、中断されたようですね。
<b>実行中のアクティビティがあっても中断させて、きっちり設定時間で終わらせる</b>という動きをしているようです。

## 動作環境
- UiPath 2019.9.2 Community Edition

[^1]: タイムアウトするとエラーになるため、`エラー発生時に実行を継続`をTrueにしています。
MacOSをCatalinaにしたとき、デフォルトのメールクライアントのCPU使用率が異常に高い問題とその解決策

# 問題

MacOSをCatalinaにアップデートしてから、メールクライアントのCPU使用率が異常に高くなった(常時200%とか)

# 解決策

メールクライアントのツールバーから、 `メールボックス` > `再構築` を選択
これをすることで、メールを再受信してるっぽい？完了するまでコーヒーでも飲む

# 解決後

メールクライアントのCPU使用率は多くて数％で安定した

ググってもそれっぽい情報がなかったので、だれかの参考になれば！
【Python】GoogleTranslationAPIを叩く

英語の文章を日本語に翻訳するスクリプトです。
[以前のコード](https://qiita.com/KanikaniYou/items/aa6ace3d5ce29d038197)をクラスにしたものです。配布されているライブラリがうまく動かなかったので作成したものです。

GoogleCloudのAPI Keyは取得していただく必要があります。（すぐできます）

```google_translate.py
import requests
import json
import time

class GoogleTranslate:
    def __init__(self):
        self.private_key = '<ここにAPIKeyを入れる>'

    def post_text(self,text):
        url_items = 'https://www.googleapis.com/language/translate/v2'
        item_data = {
            'target': 'ja',
            'source': 'en',
            'q':text
        }

        response = requests.post('https://www.googleapis.com/language/translate/v2?key={}'.format(self.private_key), data=item_data)
        return json.loads(response.text)["data"]["translations"][0]["translatedText"]


    def split_and_send_to_post(self,text):
        sen_list = text.split('.')

        to_google_sen = ""
        translated_text = ""

        for index, sen in enumerate(sen_list[:-1]):
            to_google_sen += sen + '. '
            if len(to_google_sen)>1000:
                #1000字を超えてたらgoogleに送信
                translated_text += self.post_text(to_google_sen)
                time.sleep(3)

                to_google_sen = ""

            if index == len(sen_list)-2:
                #最後の文章の翻訳
                translated_text += self.post_text(to_google_sen)
                time.sleep(1)

        return translated_text


    def main(self,text):
        original_text = text
        if original_text[-1] != '.':
            original_text+='.'
            #.で終わっていない場合に分割処理に支障が出るので
        text_translated = self.split_and_send_to_post(original_text)
        print(text_translated)
        return text_translated
```

```test.py
from google_translate import *

input_text = input('英語に変換して検索したいワードを日本語で入力してください:')
google_tr = GoogleTranslate()
translated = google_tr.main(input_text)

print(translated)
```
コードヘルス - 私のコードレビュー、コメント多すぎ…？

*この文書は[Code Health: Too Many Comments on Your Code Reviews?](https://testing.googleblog.com/2017/06/code-health-too-many-comments-on-your.html)の翻訳です。*

コードレビューは個々のコードチェンジをスローダウンさせるかもしれない。しかし、他の経験豊富なエンジニアの知識から学び、君のコードを改善する機会でもある。どうすればそれを最大限に活用できるだろうか？

君のコードチェンジが最初のラウンドのレビューで承認されることを目指そう。**もし君のコードレビューが何ラウンドにも渡ってコメントをもらい続けるようなら、このティップスによって時間が節約できるかもしれない。**

**レビューアの時間を賢く使おう ー それは限られたリソースだ。** もし彼らが、君でも簡単に見つけられるような問題を指摘しているなら、君はチーム全体の生産性を下げている。

## コードレビューに送る前に:

- **コードを再評価しよう:** テストがパスしたからといってすぐにレビューに送るのは止めよう。一歩下がって全体を再考しよう ー デザインはクリーンか？特にもう遅い時間なら、翌朝にもっといいアプローチを思いつかないかを待つのもいい。こうすることは個々のコードチェンジを遅らせるが、長期的な平均スループットをより大きくする。

- **気軽にデザインに関して議論しよう:** もしよく分からないことがあるなら、ペアプログラミングをしたり、直接話したり、早い段階で変更を送り、全体のデザインに関して「プレビュー」を頼もう。

- **コードチェンジをセルフレビューしよう:** コードについて何も知らない人になったつもりで、できる限り批判的にコードをみてみよう。コードレビューツールを通してみると普段のIDEとは全く違った視点でみることができる。こうすることでレビューの回数を減らすことができる。

- **変更を分かりやすいものにする:** 複数の変更を一度にするとコードレビューは難しくなる。セルフレビューの際に、変更をより小さなサイズのものにできないか考えよう。例えば大規模なリファクタリングやフォーマットの変更は別のコードレビューに分割しよう。

- **サブミットメッセージに大事な情報を隠さないように:** 大事な情報はコードにも書こう。後でコードを読む誰かがサブミットメッセージを見ることはほぼない。

## コードレビューのコメントに対応するとき:

- **自明ではないコメントに対応したあとではコードを再評価しよう:** 一歩下がって、真っ新な目でコードを確認しよう。一通りの変更をし終えた後は、その変更が可能にする、あるいは示唆する、さらなる改良が見つかるものだ。リファクタリングと同様に最善のデザインに到達するには何ステップもかかるだろう。

- **レビューアがどうして各コメントをしたのか理解しよう:** コメントの裏にある理由を理解していないなら、ただ変更するのではなく、レビューアに尋ねて、新たなことを学ぼう。

- **レビューアの質問にコードで答えよう:** 単に返答するのではなく、コードをより分かりやすくしよう。（例えば、変数名を改善したり、真偽値を列挙型に変更したり）コメントを加えるのもいい。後になって、他の誰かが同じ質問をするだろうから。
基本情報技術者　ストラテジ系　第1章 システム戦略④



# ④ビジネス戦略

## 3C分析
ビジネス環境を分析する手法

顧客(Customer)
競合他社(Competitor)
自社(Company)

##  ニーズウォンツ分析
「必要性」と「欲求」を分析する手法

## ビジネス目標と評価
上記の用語をまとめます。

### CSF
(Critical Success Factors: 重要成功要因)
ビジネス成功要因

### KPI
(Key Performance Indicator: 重要業績評価指標)
週次、月次の実績値を示す指標
KGIは成約件数にたいし
KPIは成功率や解約件数などとしめします。

### BSC
(Balance Score Card: バランススコアカード)
従来の財務指標だけで業績評価するのではなく
下記にするしたように、三つ加えて
4っつの視点で総合的に行う手法

#### 財務の視点

#### 顧客の視点

#### 業務プロセスの視点
効率性などみる

#### 学習と成長の視点
従業員のスキルアップの視点
【GAS】【SpreadSheet】セルの操作(値取得編)

#Spreadsheetのセルを操作する編

##0.はじめに
この記事ではGASからSpreadsheetのセル操作における、セル内の値を取得する方法についてご紹介する。
1.特定のセルの中身を取得する。
2.特定の範囲のセルの中身をfor文を使って順に同じオブジェクトに取得する。
3.特定の範囲のセルを配列使って取得する。

##Method
```javascript

//特定のセルを指定
sheetobject.getrange('列行番号');
//'列行番号'はA1、B5など。

//特定のセルの範囲を指定
sheetobject.getrange('行番号, 列番号, 行数, 列数');
//行番号, 列番号, 行数, 列数の順に入力する。

rangeobject.getValue();
//単体のセルの値を取得する。

sheetobject.getdatarange().getvalues();
//sheetの値を全てdataとして取得する。
```

##1.特定のセルの中身を取得する。

A1に値(5)が入っている。この値(5)を取得してオブジェクトに格納する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/b1bacbd3-1e12-78dd-df5c-6de1cd7b0848.png)

```javascript
function myFunction() {
  var ss1 = SpreadsheetApp.openById("Spreadsheet-key");
  //spreadsheetをss1に格納。
  
  var sh1 = ss1.getSheetByName("sheet1");
  //特定のシート(sheet1)をsh1に格納
  
  var sell1 = sh1.getRange('A1')
  Logger.log(sell1.getValue());
```

###結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/df539ce6-795c-5183-115c-cb181779a95d.png)

##2.特定の範囲のセルの中身をfor文を使って順に同じオブジェクトに取得する。
A1からA10に格納している値は以下。この値をfor文使って順に同じオブジェクトに格納していく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/6cb4e647-df41-ab96-ba8d-44182f15d421.png)

```javascript

function myFunction() {
  var ss1 = SpreadsheetApp.openById("spreadsheet-key");
  //spreadsheetをss1に格納。
  
  var sh1 = ss1.getSheetByName("sheet1");
  //特定のシート(sheet1)をsh1に格納
  
  var sell1 = sh1.getRange('A1')
  //sell1にA1の値を格納する。
  
  for(var i = 1;i <= 10; i++)
  {
    var sell3 = sh1.getRange(i,1,1,1);
    //getrange(行番号, 列番号, 行数, 列数);
    Logger.log(sell3.getValue());
  }
    
```


###結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/8624c935-18ff-f59d-97b8-e330718f0785.png)

##3.特定の範囲のセルを配列使って取得する。
シートは以下のように値が入っている。
配列を使って、自由自在に値を取得する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/94c54a2a-bce8-058b-941e-c43247114250.png)


```javascript
function myFunction() {
  var ss1 = SpreadsheetApp.openById("1-rQe4tnalMfTKRDCRCN6LWTaGvum67Ok8wnlxyG3-lo");
  //spreadsheetをss1に格納。 
  var sh1 = ss1.getSheetByName("sheet1");
  //特定のシート(sheet1)をsh1に格納
  var sell1 = sh1.getRange('A1')
  //sell1にA1の値を格納する。
  
  var data1 = sh1.getDataRange().getValues();
  //sh１の列を全てdataとして格納する。

  Logger.log(data1[0][0]);
  Logger.log(data1[2][1]);
  //配列を指定して取得する。
```

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573711/42eda70e-273d-a566-2c85-bf74fe310c9d.png)


##まとめ
今回はGASを使って特定のセルの値を取得する方法を紹介しました。
次回はGASからセルに入力する編を書こうと思います。
取得・入力が理解できれば、基本的操作はこれでほぼ理解したと言えるでしょう！
あと書きたいのは、GASで計算式を扱う方法、セルに計算式を入力する方法...

この辺が終わったあと、Gmail操作編を描こうと思っています。
asset_path について

便利と思ったので備忘録。
# asset_path について

画面上にimageを表示する際、
```'/assets/titel.png'```と記述する事も多いですが、

**asset_pathを使えば、**

```= image_tag asset_path("title.png")```
↑で
app/assets/images/title.pngを参照してくれます。
（プロダクション環境でも参照可能）


他にも参考に
application.js というファイルが assets/javascripts に存在する場合
`'/assets/application.js'` が、=>`asset_path('application.js')`　てな感じ。
 
image.png というファイルが assets/images に存在する場合
`'/assets/image.png'`が、=>`asset_path('image.png')`　てな感じ。
 
config.assets.digest = true な環境で application.css というファイルが assets/stylesheets に存在する場合
`'/assets/application817776380c2b21405e00e88cbdd215e1.css'`が、=> `asset_path('application.css')`　てな感じ。


参考記事
[Railsのasset_pathは何をやってくれてるのか](http://blog.livedoor.jp/sasata299/archives/51948013.html)
IE11から逃れられないみなさまへ

## この記事のターゲット
- IE11対応とかきいてないんだけど？
- 案の定IE11だけ表示おかしいんだけど？

## 結論だけ欲しい人用

```css
/* only IE11 */
_:-ms-lang(x)::-ms-backdrop, .クラス名 {
  /* スタイル */
}
```

## 各要素について

### :lang
MDNリファレンス : https://developer.mozilla.org/ja/docs/Web/CSS/:lang

lang擬似要素はその要素に言語の情報を付与します。
:lang(en)
:lang(ja)
みたいな。

### ::backdrop
MDNリファレンス : https://developer.mozilla.org/ja/docs/Web/CSS/::backdrop

backdrop擬似要素何らかの要素が全画面モードで表示される直下に直接表示される viewport の寸法のボックスとされています。

### -ms-
これはInternet Explorer用のベンダープレフィックスですね。


## まとめ
ベンダープレフィックスでIEに絞った上でIE11だけかつ上の層から適用できる要素を指定している、という理解です。
できればこんなものは使わずに済ませたいところですがどうしてもここだけ、という時などはぜひ。
基本情報技術者　ストラテジ系　第1章 システム戦略③


# ③経営戦略の基礎
SWOT分析: 強み、弱み、機会、脅威などの点をはっきりする方法
PPM分析: 市場における、成長率よ占有率から位置付けを図る方法

## SWOT分析
強み、弱み、機会、脅威などの点をはっきりする方法
それぞれの文字の意味を下記に記します。

### S(強み)
Strengths
自社のプラス要因

### W(弱み)
Weaknesses
自社のマイナス要因

### O(機会)
Opportunities
外的要因のプラス要因

### T(脅威)
Threats
外的要因のマイナス要因

## PPM分析
Product Portfolio Management
プロダクトポートフォリオマネージメント

市場成長率と市場占有率を軸して、製品の位置付けを分析する手法
下記のような図の形で分析します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430767/a9144ed9-e0a4-a2b2-97e0-64db3bd704f0.png)

### 問題児
市場は問題ないが、能力に問題あり
資金投入などの改善が必要

### 負け犬
将来性なし、即撤退するべき

### 花形
市場、能力問題なし
努力を怠らない

### 金のなる木
独占状態、落ち着く事情の中で確固たる地位を気づいている

## バリューチェーン
購買、製造、出荷物流、マーケティング、サービスの各活動で
付加価値をつけることができる。

## 経営戦略手法関連用語

### コアコンビタンス
自社独自の技術

### ベンチマーキング
他社の業務手法に基づいて、最良方法を探る。

### M&A
合併と買収

### アライアンス
提携のこと

### OEM
相手先ブランドによる製品の供給

### フランチャイズ契約
各種情報、資源を提供する契約のこと

供給する側をフランチャイザー
受ける側をフランチャイジー
RaspberryPiで重さ測る その2 2台編

##モチベーション
2台に増やしたい

##環境
RaspberryPi3B+
Raspbian 9.8
RPi.GPIO
python
ロードセル
ADコンバータ HX711

## 接続
1台目

- VCC青 - Raspberry Pi3 5V  Pin#2
- GND橙 - Raspberry Pi3 GND Pin#6 
- DT黄  - Raspberry Pi3 BCM5 Pin#29
- SCK緑 - Raspberry Pi3 BCM6 Pin#31 

2台目

- VCC赤 - Raspberry Pi3 5V  Pin#5
- GND白 - Raspberry Pi3 GND Pin#9 
- DT黒  - Raspberry Pi3 BCM17 Pin#11
- SCK茶 - Raspberry Pi3 BCM18 Pin#12 

## ソフトの仕様
2台を並行で動かしたいので
引数にREFFERENCE UNIT, DTのBCM値, SCKのBCM値を与えられるように変更

## ソースコード
``` example.py
~~ 省略 ~~
    # 引数を変数に格納
    referenceUnit = int(args[1])
    dout = int(args[2])
    pd_sck = int(args[3])

~~ 省略 ~~
    # REFFERENCE UNITの設定
    hx.set_reference_unit(referenceUnit)

~~ 省略 ~~
   # dout, pd_sck を使ってHX711を初期化
   hx = HX711(dout, pd_sck)

```

## 実行

```
python example.py 1 5 6 
```
を実行した結果から1台目の補正値を計算 → 361

```
python example.py 1 17 18
```
を実行した結果から2台目の補正値を計算 → 375

以下の2つのコマンドを別のshellから起動することで2台の計測ができました。

```
python example.py 361 5 6 
python example.py 375 17 18
```
windows10にZen言語をインストールする

# はじめに
### ごきげんよう、Zen言語
最近、低レイヤに興味が出てきて色々調べていたところ、[Zen言語](https://zen-lang.org/ja-JP/)というプログラミング言語に出会いました。
Zen言語がどういうものかという説明は[公式ドキュメント](https://www.zen-lang.org/ja-JP/docs/)に記載されているため詳細は省きますが、要は安全なC言語を目指しているそうです。
ちょっと興味が出てきたのでインストールしようとしたところ、インストーラーやインストール手順はなくzipがあるだけだったので忘備録的な感じでQiitaに書くことにしました。

# インストールする
## 前提
- windowsバージョン  
Microsoft Windows [Version 10.0.18362.657]  

## 手順
以下の手順で環境を作っていきたいと思います。

1. 公式からzipをダウンロードする
1. 適当なところに展開する
1. パスを通す
1. コマンドプロンプトで確認する


### 1. 公式からzipをダウンロードする
[公式サイトのダウンロードページ](https://www.zen-lang.org/ja-JP/download/)にアクセスする。
<img width="1280" alt="2020-02-22 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157491/ae42b5c4-5c87-68ca-8a5d-96f43773a7b7.png">
windows版をダウンロードします。
Zen言語は2月22日現在、Public Beta (v0.8.20191124)でした。

### 2. 適当なところに展開する
ダウンロードしたzipファイルを右クリック>すべて展開(T)を選択します。
後述しますが実はここでハマってしまいました。
`C:\Program Files`の直下に展開したところ、ビルドに失敗しました。
パスにスペースが入っていたことが原因でした。
Cドライブ直下などのパスにスペースがない所に展開したところ無事実行できたので、windowsで環境構築する人は気を付けてください。

### 3. パスを通す
winキーを押して「環境変数」と入力するとシステム環境変数の編集という画面を開くことができるのでそこから編集します。
Pathを選択して[2.適当なところに展開する]で展開した所のパスを設定してください。
自分はCドライブ直下に展開したので`C:\zen-windows-x86_64-0.8.20191124\` というパスを通しました。

### 4. コマンドプロンプトで確認する
コマンドプロンプトを開きます。
`zen`と打ち込みます。
きちんとパスが通っていればヘルプが表示されるはずです。
<img width="979" alt="2020-02-22 (9).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157491/3d6dba8e-e37c-d100-97f7-c90d40201605.png">
やったぜ！

<img width="979" alt="2020-02-22 (7).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157491/4240e5e9-8a3b-b8fa-4cba-21e71d001179.png">
せっかくなので[公式ドキュメント](https://zen-lang.org/ja-JP/docs/ch01-hello-world/)通りにHello Worldしてみました。
`Congratulations on your first step to writing perfect software in Zen.`
無事にZen言語でソフトウェアを書く第一歩を踏み出すことができました！

# ハマったところ
[2.適当なところに展開する]でも述べた通り、`C:\Program Files`に展開したときにエラーが発生しました。
<img width="979" alt="2020-02-22 (10).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157491/8a81422e-958b-9f4b-8c91-59ae381941ac.png">
`zen init-exe`コマンドは問題なく動きますが、`zen build run`コマンドでエラーが発生しました。
公式サイトにもインストール手順がないので、どうしようかなと思っていたところ...
そういえばZen言語はZig言語からフォークした言語だなと思い出し、Zig言語のインストール手順を見ればなんとかなるかもしれないと思い[WindowsでZig言語の環境構築をするページ](https://github.com/ziglang/zig/wiki/Building-Zig-on-Windows)にアクセスしました。
>Unzip this file to a directory with no spaces, such as C:\Users\Andy\. It contains a single directory, so when you do this the full path will be e.g. C:\Users\Andy\llvm+clang-9.0.0-win64-msvc-mt\.

スペースがないディレクトリに解凍しろとズバリ書いてありましたね。
このページのおかげでwindowsで無事Zen言語を実行することができました。

コマンドプロンプトのエラーコードをもう一度きちんと読むと、
`Unrecognized command: Fileszen-windows-x86_64-0.8.20191124zen.exe build-exe`
と書いてあるので、スペースのあとのFilesがzen-windows-x86_64-0.8.20191124の一部として読み込まれてしまい、実行できなかったということでしょうか。

他のソフトウェアでもフォルダにスペースや日本語が入っていると上手く実行できないものがあるので、windowsに環境構築をする場合はこのようなミスに気を付けていきたいです。

# おわりに
普段はインストーラーやパッケージマネージャーを使ってソフトウェアをインストールしているため、フォルダ名にスペースが入っているという些細なミスでハマってしまいました（2時間くらいハマった）。
システムプログラミング向きでなおかつ現在Public BetaであるZen言語を使ってみようと思う人でこのようなハマり方をする人はあまりいないかと思いますが、自分のように低レイヤに興味持ち始めたけど普段はインストーラー頼りだからよく分からんという人に役に立てば幸いです！
tarfileの圧縮・展開

```py:1
import tarfile

with tarfile.open('test.tar.gz', 'w:gz') as tr:
    tr.add('test_dir')
#test_dirというディレクトリをtest.tar.gzというファイル名でtarfileに圧縮

with tarfile.open('test.tar.gz', 'r:gz') as tr:
    tr.extractall(path='test_tar')
#test_tarというディレクトリにtest.tar.gzを展開
```

```py:2
import tarfile

with tarfile.open('test.tar.gz', 'r:gz') as tr:
    with tr.extractfile('test_dir/sub_dir/sub_test.txt') as f:
        print(f.read())
#tarfileに圧縮されたtest.tar.gzを展開することなく、sub_test.txtを出力
```
アルゴリズム自習

# なんでアルゴリズム

日課としてるpaizaのスキルチェックでＢランクで時間内にとけない問題が散見してきたので、アルゴリズムの学び直しを日課に追加したので復習用をかねての備忘録

この歳まで見てみないふりしてきた貧弱なアルゴリズム基礎体力をこれを機に人並みくらいにはあげたい。


# 日課
1. Udemyでデータ解析のお勉強
2. UdemyでReactのお勉強
3. [freeCodeCamp](https://www.freecodecamp.org/learn/)でJavaScriptのお勉強
3. paizaでスキルチェック
4. [AIZU ONLINE JUDGE](https://onlinejudge.u-aizu.ac.jp/home)のコースでアルゴリズムのお勉強（new!）


# 最大公約数（Greatest Common Divisor）

最大公約数を求めるアルゴリズムですね。
ユークリッド互除法の実装。
計算量は、O(logN)

```Python3
def gcd(x, y):
    if y == 0:
        return x
    return gcd(y, x%y)

if __name__=='__main__':
    # 標準入力から最大公約数を算出する2値を取得する
    x, y = map(int, input().split())
    if y > x:
        x, y = y, x

    result = gcd(x, y)
    # 結果を出力
    print(result)
```
[Rails] ActiveRecordでデータを更新したときに、各カラムが更新されたかどうか知りたかったんだ

# はじめに
タイトル通りです。

下のアプリはチャットルームに「タイトル」と「ルームの説明」、「カテゴリ」を設定できるんだけれども、
「タイトル」が変更された時だけトークルームに通知が来るようにしたかった。
[![Image from Gyazo](https://i.gyazo.com/9472cc055f0929cd50611f85e73dbe18.gif)](https://gyazo.com/9472cc055f0929cd50611f85e73dbe18)

変更前のパラメーターを取得するか、変更されたかどうかを判定するメソッドがあったら嬉しいなーと思って探した。

# 実装
どうやらActiveRecordさんには「カラム名_changed?」っていうヘルパーメソッドがあるらしいと聞いて...

```ruby:room_controller
  def update
    if @room.update(room_update_params)
      if @room.title_changed? # ココ。title_cahged?がtrueであれば自動メッセージを送るようにしたつもり。
        Message.create(room_id: @room.id, user_id: current_user.id, content: "＊自動投稿＊ タイトルを「#{@room.title}」に編集しました")
      end
      redirect_to room_path(@room.id)
    else
      render :edit
    end
  end
```
こんな感じで実装してみたのだけれども失敗した。

[Githubのrails]([Rails(https://github.com/rails/rails/blob/master/activerecord%2Flib%2Factive_record%2Fattribute_methods%2Fdirty.rb#L22-L29))を見てみると、なんか更新されているらしい。

# つまり
カラム名_changed?は、ActiveRecordのコールバックを使って処理を分けることができていたが、

[コールバックまとめ](https://www.techscore.com/blog/2012/12/25/rails%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%BE%E3%81%A8%E3%82%81/)



save前の場合は、

```ruby
オブジェクト.will_save_change_to_カラム名
```

save後の場合は、

```ruby
オブジェクト.saved_change_to_{カラム名}?
```
という風に書き変える必要があるみたい。

# 再度実装

```ruby:room_controller.rb
  def update
    if @room.update(room_update_params)
      if @room.title_updated?
        Message.create(room_id: @room.id, user_id: current_user.id, content: "＊自動投稿＊ タイトルを「#{@room.title}」に編集しました")
      end
      redirect_to room_path(@room.id)
    else
      render :edit
    end
  end
```
コントローラーで「saved_change_to」やら「will_save_change_to」やらを呼び出すとうまくいかなかったので、
モデル側に「更新されたかどうか判別するインスタンスメソッド」を作りました。

```ruby:room.rb
  def title_updated?
    if self.saved_change_to_title?
      return true
    else
      return false
    end
  end
```

これでタイトル編集時のみメッセージが投稿されるようになりました。

[![Image from Gyazo](https://i.gyazo.com/a37dfa1f6f65c270c28a8246ed7260b5.gif)](https://gyazo.com/a37dfa1f6f65c270c28a8246ed7260b5)

# おわりに
今回初めてrailsのソースコードを見ましたが、もっと見ていくととても勉強になりそうです。
暇を見つけてもっと読んでみようと思いました。

おわり。
【AWS】エラー文make_bucket failed: s3://名前 ~ (BucketAlreadyExists)  The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.

## 結論：他ユーザーとかぶらない様なバケット名をつける。





バケットを作るためにaws s3 mb s3:（名前）   と入力したところターミナルに次のエラー文が表示されました。

```
make_bucket failed: s3://potepanec An error occurred (BucketAlreadyExists) when calling the CreateBucket operation: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.
```

## 原因

重複するバケット名をつけることはできないらしい。
自分のアカウントのみで重複する名前を付けていなくても、別のAWSアカウント（つまり他人）が同じ名前のバケットを所有していればバケット名が重複することになるります。
（出典：AWS公式サイト）

## 解決策

誰も思いつかない様なバケット名をつける。