OmniAICreator/Qiita-1.07M huggingface dataset:
Automation Anywhereのコミュニティについて紹介します♪

初投稿です♪
[RPAアドベントカレンダー2020](https://qiita.com/advent-calendar/2020/rpa)の8日目担当です。

この投稿では、Automation Anywhereのコミュニティについて整理したいと思います。

# 公式オンラインコミュニティ『A-People』
まずはオートメーション・エニウェア公式のオンラインコミュニティです。[A-People](https://apeople.automationanywhere.com/s/?language=ja)と呼ばれるフォーラムが公開されており、誰でも閲覧することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934744/40c4e5be-051b-d1e0-57ae-e59be97328bd.png)
英語のフォーラムがほとんどですが、日本語のグループもあるので、日本人はこのグループを利用します。書き込みをするには無料で登録が必要です。ユーザーでなくても誰でもアカウントは取得できます。

**[A-People Japanese Group 日本語グループ](https://apeople.automationanywhere.com/s/group/0F96F000000l0vwSAA/japanese-group-%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97?language=ja)**

# Automation Anywhere好きな人のコミュニティ『RPA勉強＆LT会！RPALT Automation Anywhere Talk』
日本最大のRPAコミュニティに「Automation Anywhere Talk」のグループがあります。後で触れられている「AA de Knight」と交互で隔月開催となっています。いまのところはオンライン開催です。

Automation Anywhereに興味がある方なら、ユーザーでなくても誰でも登録すれば無料で参加できます。Automation Anywhereを始めたい、使い方の事例を学びたい、情報収集をしたい、関係者と交流したいなど、いろいろな目的で参加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934744/5cb47837-5020-ef99-ac7a-bb0763bc5be4.png)

会の開催中はTwitterでも盛り上がります。事後に[Togetterにまとめられたり](https://togetter.com/t/AutomationAnywhere)もします。

ハッシュタグ
[#RPALT](https://twitter.com/search?q=RPALT&f=live)
[#AutomationAnywhere](https://twitter.com/search?q=AutomationAnywhere&f=live)

お申し込みは、こちらのイベント一覧の中からAutomation Anywhereグループのロゴを探して参加できます。また、Automation Anywhere専用のグループでなくても、触れられている場合もあります。(RPA女子部、マガジン朗読会など)

**[RPAコミュニティイベント一覧](https://rpacommunity.connpass.com/event/)**

# 技術者・開発者向けのコミュニティ『AA de Knight』
技術者、開発者向けにSB C&S社が開催している「AA de Knight」というコミュニティがあります。「Automation Anywhere Talk」と交互で隔月開催となっています。コロナ前はソフトバンクの本社ビルで会が行われていましたが、現在はオンライン開催です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/934744/d8ae7d22-3a7f-0d3e-f3d6-89cf892c0b7e.png)
技術者、開発者向けということで、内容は少し高度になります。製品ロードマップや最新情報の共有がオートメーション・エニウェア社からも行われます。「Find The Knight」というロボット作成コンテストも最近は開催されているので、ゲーム感覚で楽しむこともできます。

会の開催中はTwitterでも盛り上がります。事後に[Togetterにまとめられたり](https://togetter.com/t/AutomationAnywhere)もします。

ハッシュタグ
[#AAdeKnight](https://twitter.com/search?q=AAdeKnight&f=live)
[#AutomationAnywhere](https://twitter.com/search?q=AutomationAnywhere&f=live)

**[AA de Knightイベント一覧](https://aaj.connpass.com/)**

# 既存顧客向けユーザーコミュニティ
Automation Anywhereユーザー限定のユーザーコミュニティも運営されています。こちらも定期的に開催されています。
参加資格としてはユーザーである必要があるため、外部には公開されていません。

**JAAUG (Japan Automation Anywhere User Group)**

ハッシュタグ
[#JAAUG](https://twitter.com/hashtag/jaaug?src=hash&f=live)

以上
ターミナルで二段階認証

# サマリ
ターミナルで二段階認証できます。
もう二段階認証するためにMacを離れてスマホを使う必要はありません。

# おことわり
- 本内容はMacでの動作を想定しています。他のOSでは検証していませんのでご注意ください。
- 本内容の対象となる二段階認証はTOTP(Time-based One Time Password)です。おそらく最も普及している二段階認証方式です。
- 二段階認証に必要なシークレットキーの扱いには触れていません。各自で対策した上でお使いください。

# 初期手順
次のコマンドで必要なライブラリをインストールします。

```
brew install oath-toolkit
```

# 二段階認証方法
次の例に倣ってコマンドを実行します。

```
oathtool --totp --base32 {シークレットキー}
```

すると二段階認証に必要な6桁の数字が表示されます。

```
123456
```

# お勧めの使い方
次のスクリプトに実行権限を与え、パスの通った場所におきます。

```mfa
/bin/echo -n "Git "
oathtool --totp --base32 {gitのシークレットキー}
/bin/echo -n "AWS "
oathtool --totp --base32 {awsのシークレットキー}
...
```
```
% mfa
Git 123456
AWS 098765
...
```
 ポイントは`/bin/echo`です。
通常の`echo`だと`-n`オプションが効かず改行してしまいますが、bash組み込みの`/bin/echo`なら`-n`により改行を回避できます。

# WARNING!!
冒頭にも書きましたが、この方法だと<font color="red">シークレットキーが生の状態なので危険です。</font>シークレットといいつつオープンな状態です。
シークレットキーを何らかの方法で暗号化して保存するなどの対策を講じるか、危険を承知の上自己責任でご利用ください。
Konyでスクリーンショットを禁止する方法（Android）

#目次
1. はじめに
2. 実装方法
3. まとめ

#はじめに
機密性の高い情報を取り扱うアプリを開発する際にスクリーンショットを禁止する機能を導入することで、
情報漏洩リスクを軽減することができます。

Androidでスクリーンショットを禁止する方法をご紹介したいと思います。

#実装方法
**①スクリーンショットを禁止に設定**

1) 上のメニューの`File` > `Setting` を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/64e23f67-0021-e46f-1e70-35014629c924.png)

2) 上のタブの`Native`を押してから`Android`を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/910e0d4b-4d66-abcc-082e-f6e5d2ec44ad.png)

3) `Disable Application Screenshot`と書いてあるところのチェックボックスにチェックを入れてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/bc6915db-9bac-b388-6a50-dfd23f13d893.png)

4) 右下にある`Finish`を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/1e347cab-a409-9747-28d7-5d53325b1e50.png)

ここまでで、スクリーンショットを禁止する設定が完了しました。
次に実際にどうなるかみていきましょう！

**②実装の確認**
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/eFE3ZNHYKJ">pic.twitter.com/eFE3ZNHYKJ</a></p>&mdash; Kony (@Kony12763790) <a href="https://twitter.com/Kony12763790/status/1336499062577659905?ref_src=twsrc%5Etfw">December 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

スクリーンショットしようとしてもできないことが分かりますね！

#まとめ
今回は、Androidでスクリーンショットを禁止する方法を説明しました。
Konyでしたら、簡単に設定することができます:grinning:
ぜひ試してみてください:wave:

#参考
Screenshotを禁止する方法の説明: 
https://docs.kony.com/konylibrary/visualizer/visualizer_user_guide/Content/DisableScreenCaptureAndRecordingForAndroid.htm
PostgreSQL スキーマ・テーブルの作成から、カラムの変更追加等のまとめ

スキーマ・テーブルの作成から、カラムの変更追加等のまとめです。
テーブル名には基本スキーマ名をつけたほうが良い気がします。

12/23
csvをインポートを追加
2/18
カラム名の変更を追加


##スキーマを作成

```
構文
CREATE SCHEMA スキーマ名;
例
CREATE SCHEMA test_schema;
```

##テーブルを作成

```
構文
CREATE TABLE テーブル名 (カラム名 データ型, カラム名 データ型);
例
CREATE TABLE test_schema.test_table(
a_column integer,
b_column integer);
```

##テーブルの所属スキーマを変更

```
構文
ALTER TABLE テーブル名 SET SCHEMA スキーマ名;
例
ALTER TABLE before_schema.test_table SET SCHEMA after_schema;
```

##テーブル名を変更

```
構文
ALTER TABLE テーブル名 RENAME TO テーブル名;
例
ALTER TABLE test_schema.before_table RENAME TO after_table;
```

##テーブルにカラムを追加

```
構文
ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型;
例
ALTER TABLE test_schema.test_table ADD COLUMN add_column integer;
```

##テーブルのカラム名を変更

```
構文
ALTER TABLE テーブル名 RENAME 前のカラム名 TO　後のカラム名;
例
ALTER TABLE test_schema.test_table RENAME before_column TO after_column;
```

##テーブルのカラムを削除

```
構文
ALTER TABLE テーブル名 DROP COLUMN カラム名;
例
ALTER TABLE test_schema.test_table DROP COLUMN drop_column;
```

##カラムのデータ型を変更

```
構文
ALTER TABLE テーブル名 ALTER COLUMN カラム名 TYPE データ型;
例
ALTER TABLE test_schema.test_table ALTER COLUMN alter_column TYPE integer;
```

##カラム情報取得
```
構文
\d テーブル名;
例
\d test_schema.test_table;
```

##csvをインポートする
```
構文
\copy 入れるテーブル名 from 入れるCSVのパス with csv;
例
\copy test_schema.test_table from /test_folder/***.csv with csv;
```
AirflowのBigqueryOperatorでDECLARE + SETを使ったSQLを使おうとしたら失敗したのでUDFで書き換えた

# 背景

BigQueryにはDECLARE + SETを使って変数を定義できる機能がある。

#### [標準 SQL のスクリプト](https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting#declare)

これを使ったSQLの結果でテーブルを作成するBigqueryOperatorのタスクを作成したい。

例えば以下のようなもの

```py:failing_dag.py
from airflow import DAG
from airflow.contrib.operators.bigquery_operator import BigQueryOperator
from datetime import datetime

default_args = {"owner": "airflow", "start_date": datetime(2020, 12, 7, 0, 0, 0)}

dag = DAG("z_declare_test", default_args=default_args, schedule_interval=None)

SQL = '''
DECLARE max_date DATE
SET max_date = (SELECT MAX(exam_date) FROM `some_table1`)
SELECT * FROM `warehouse.gmap__bf_old_results`  WHERE test_date > max_date
'''

BigQueryOperator(task_id='bq_op',
    use_legacy_sql=False,
    sql=SQL,
    destination_dataset_table='some_table2',
    dag=dag
)
```

このタスクを実行するとエラーとなる。

```
Syntax error: Expected end of input but got keyword SET
```

そもそも、DECLARE + SETを使うようなSQLの実行結果からテーブルに作成するような機能はBigQueryではまだサポートされていない模様。

[Cannot set destination table with BigQuery Python API](https://stackoverflow.com/questions/58646725/cannot-set-destination-table-with-bigquery-python-api)

確かに、手元のBigQueryコンソールでもDECLARE + SETを使ったSQLの実行結果からテーブル作成はできない。

# UDFを使って回避
同様のSQLはUDFを使えば作成できるのでAirflowを使う場合は、UDFに書き換えれば問題なく動いた。

```py:imp_by_udf.py
CREATE TEMP FUNCTION maxdate() as ((SELECT max(exam_date) from `some_table1`));
SELECT * FROM `some_table2`  WHERE test_date > maxdate()

```
パスワードを表示・非表示に切り替える方法

#目次
1. はじめに
2. 実装方法
3. まとめ

#はじめに
通常、パスワードの入力欄はショルダーハッキング（覗き見）を防ぐため、
ほとんどのブラウザは入力した値を `●` や `*` などの文字に置換してレンダリングします。

一方で、マスクしない方が良いのではないかという説もあります。
「パスワードを隠すのをやめよう ( https://u-site.jp/alertbox/20090623_passwords )」

そこで、この記事では動的にパスワードを表示/非表示に切り替える方法をご紹介したいと思います。

#実装方法
**①画面の作成**
画面に以下の2つを設置します。
1. パスワードを入力するためのキーボード：WidgetはTextBox 
2. 動的にマスクプロパティを変更するためのボタン：WidgetはButton

このように設置しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/dff70806-53ce-e114-7831-bb752e8afaf3.png)

TextBoxの設定は以下のように設定しました:point_down:
1. Mask Text: On
2. KeyBoard Style:Email
最初にマスクするよう設定しています。
 
**②動的にパスワードを表示/非表示に切り替える**
今回は、動的にパスワードを表示/非表示に切り替えたいので、
Button Widgetを選択した状態でアクションメニューを開き、
onClick アクションにアクションを追加していきます。

onClick アクションはボタンをタップする度に呼び出されるアクションです。
その他にもこのようなアクションがあるので、活用してみてください。

| アクション名|　内容 |   
|:-----------------|:------------------|
|onClick|ボタンをタップすると呼び出されます|
|onTouchStart|ボタンを触れた時に呼び出されます|
|onTouchMove|ボタン上の移動が終了するまで継続的に移動した時に呼び出されます|
|onTouchEnd|触れていたボタンから離れた時に呼び出されます|

では、frmPasswordControllerにonClickアクションを設定していきます。

```frmPasswordController.js
define({ 
  // 動的にマスクプロパティを変更
  chengeMaskProperty: function(){
    if(this.view.txtPassword.secureTextEntry){
      this.view.txtPassword.secureTextEntry = false;
      this.view.btnMask.text = "パスワードを非表示";
    }else{
      this.view.txtPassword.secureTextEntry = true;
      this.view.btnMask.text = "パスワードを表示";
    }
  },
});
```
上について簡単な説明をします。
`secureTextEntry`：ユーザーが入力したテキストを、`●`や`*`などのマスク文字を使用して保護するかどうかを指定します。
trueの場合は保護する、falseの場合は保護しないになります。

Controllerでアクションの作成が完了したら、
onClickのアクションメニューでInvoke Functionを選択し、
chengeMaskPropertyを設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/7ffff43b-ca47-5701-178c-5f9f0b4de18f.png)

ここまでで、動的にパスワードを表示/非表示に切り替える準備が完了しました。
次に実際にどうなるかみていきましょう！

**③実装の確認**
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/XabZOCjhFq">pic.twitter.com/XabZOCjhFq</a></p>&mdash; Kony (@Kony12763790) <a href="https://twitter.com/Kony12763790/status/1334394720571691010?ref_src=twsrc%5Etfw">December 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<font color="Red">※マスクにしているため、キーボードを入力しているところは表示されておりません。</font>

ボタンを押すとパスワードの表示/非表示になっていることが分かりますね！

#まとめ
今回は、TextBox内でパスワードを入力した時に動的にパスワードを表示/非表示に切り替える方法を説明しました。
ログイン画面を作成するとき等使うシーンは多いのではないでしょうか？
Konyでしたら、このように柔軟にマスクプロパティの変更が可能なので便利です:sparkles:
ぜひ試してみてください:wave:


#参考
Button Widgetの説明: 
https://docs.kony.com/konylibrary/visualizer/viz_widget_prog_guide/Content/Button_Events.htm#onClick

Button Propertiesの説明:
https://docs.kony.com/konylibrary/visualizer/viz_widget_prog_guide/Content/TextBox_Properties.htm

secureTextEntryの説明:
https://docs.kony.com/konyonpremises/Subsystems/Widget_User_Guide/Content/TextBox_Basic_Properties.htm#secureTe
rel="noopener noreferrer" の必要性

## rel="noopener noreferrer"とは

### noopenerの指定

noopener を指定することで、リンク先からwindow.openerを使ってリンク元が参照できなくなります。さらに、リンク先とリンク元が別のものとして扱われるためパフォーマンスに対しての対策にもなっているのです。

参考サイト
https://html.spec.whatwg.org/multipage/semantics.html#link-type-noopener

### noreferrerの指定

noreffererを指定することで、リンク先にリンク元のリンク情報が送られないようになるため、 noopenerと同じくリンク先からの参照ができなくなります。
ブラウザによっては、noopenerがサポートされていないため、noopenerと合わせてnoreffererを指定するのが好ましいと言えます。
noreferrerを当てるだけでESlintのエラーに対応できそうですが、 `noreferrer noopener` としっかり書かないとだめみたいです。

参考サイト
https://html.spec.whatwg.org/multipage/semantics.html#link-type-noreferrer

```text:抜粋
It indicates that no referrer information is to be leaked when following the link.
```

```text:意訳

リンクをたどるときにリファラー情報漏らさないよ
```

```html:抜粋
<a href="..." rel="noreferrer" target="_blank"> has the same behavior as <a href="..." rel="noreferrer noopener" target="_blank">.
```

```text:意訳
noreferrerとnoreferrer noopenerは同じ
```

以上
ファイルシステムをCase-sensitiveに設定しておこう for Mac

# 前置き
この記事は 2020 年の RevComm アドベントカレンダー 15 日目の記事です。 14 日目は
@tatakahashi35 さんの「 [RevComm の裏側で動くアルゴリズム [二分探索編]](https://qiita.com/tatakahashi35/private/624c5fe9efc0bd5e340f) 」でした。

こんにちは、 RevComm のエンジニアの持田です。 MiiTelに続く、第二弾プロダクトの開発を担当し、プロジェクトマネージャーも兼任しています。
今回は、Macで作業していて少しトラブったことがあったので、反省のために具体的な事象と解決方法をお話したいと思います。
なお、 **Gitを用いた開発をしている方であれば誰でも起こりうる** ので、一読いただくとのちのち助けになるかと思います。

## 発生したトラブル
とあるフロントエンドの改修で、ローカルのgitリポジトリ以下に存在する、`setting.js` [^1] というファイルを、`Setting.js` [^1] にリネームしました。 
**この変更がgitに検知されず、コミットに含まれなかった**ことが原因[^2]で、 開発環境で`No such file or directory` エラーが発生しました。 

どうやらMacでは **デフォルトで大文字小文字を区別しない** ファイルシステムが設定されていたようでした。 
再発を防ぐため、大文字小文字を区別する開発用のボリュームを作成することにしました。


## 大文字/小文字を区別するボリュームの作成方法

1. Command + Spaceで「ディスクユーティリティ」と入力して、ディスクユーティリティを起動します。その後、ボリュームを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/7d043116-a4cc-f106-d3f4-d5c9304cc3b6.png)

2. フォーマットで、APFS (大文字/小文字を区別) を選択します。暗号化するかどうかは用途に合わせてください。
![02_大文字小文字区別選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/3e62a7b1-a0b6-6497-accc-8bb883654540.png)

3. ボリュームが作成されると、マウントポイントが表示されます。こちらのディレクトリ以下に開発ディレクトリを置くと良いでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/98507c40-885c-7cab-e01e-d30fb67af748.png)


## 確認方法
Case-sensitiveに設定できている場合は、下記のように大文字で始まる「Test」と小文字で始まる「test」の両方のファイルを作成できます。

```
mochida@mbp ~             % cd /Volumes/casesensetive
mochida@mbp casesensetive % touch test
mochida@mbp casesensetive % touch Test
mochida@mbp casesensetive % ls
Test    test
```



また、ディスクユーティリティでも、「大文字/小文字を区別」という記載がされるので、こちらでも確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148503/faa034a2-ad84-b48d-e564-2db16fa5afcb.png)

## 他の方法

後で調べたところ、[Gitでファイル名の大文字・小文字の変更を検知するようにする](https://qiita.com/sawadashota/items/aa312a3b7e2403448efe) という記事でも、本事象に関しては解決できそうでした。

あえてファイルシステムを変更するメリットとしては、
サーバーとして多々利用される、Amazon Linux 2 などではデフォルトで大文字/小文字を区別するようになっているので、少し手間はかかりますが開発端末も合わせておくと良いかもしれません。

## 最後に

明日は @shuheikatoinfo さんの「 音声合成・激動の10年を振り返る 」です。

[^1]: 実際とは異なる、わかりやすい名前を使っています。
[^2]: そもそも開発環境にデプロイするまで気がつかなった原因として付け加えるなら、差分のチェックが甘かったことと、build時のエラー検知が適切に設定されていなかったことも挙げられます。
【Stereo Depth】Concat + Dot Productのコンビネーション

<h1>Improved Stereo Matching with Constant Highway Networks and Reflective Confidence Learning</h1>
前回[MC-CNN](https://qiita.com/minh33/items/6b0ed63e7c23afb16ed9)というモデルを見たので、その進化系ぽいモデルを見つけたので要点だけまとめようと思う。

<h1>新規性</h1>
<h2>Matching cost</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/81e5d54b-3b5b-091f-a577-2de3c18cbd49.png)
今まではConcatenationの方法またはDot ProductがMatching Costを計算するのに使われていたのですが、両方を使う事で多様化しています。


<h1>結論</h1>
・ConcatenationとDot Productの両方を使ってMatching Scoreを計算している。

<h1>参考文献</h1>
Improved Stereo Matching with Constant Highway Networks and Reflective Confidence Learning
https://arxiv.org/pdf/1701.00165.pdf
見積もり基礎 LTまとめ

# 初心者向け見積もり心得
## 前書き
LTをした際に勉強したこと、本を読んでまとめた内容を記事にしました。これから初めて見積もりをする方、いまいち見積もりに対して確信が持てない、そんなエンジニアの方の課題解決になればと思います。少しでもお役に立てば幸いです。

## 自分の不得手を理解する
![スクリーンショット 2020-12-08 12.29.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572719/db82579c-fe0f-ddc9-4802-1254b00b6b47.png)

見積もりを見積もりの前、作業中、そして開発終了後の三つに分けました。上記のロードマップでは分けた三つ期間の中でやるべきことが分岐点になっています。もし分岐の中で「NO」に当てはまる場合には、改善することで見積もりの安定感につながるかもしれません。

## タスク出し
### タスク分割
タスク分割は対象を「作業できる単位」に落とし込むことです。
粒度としてはストーリー以下、todo以上の、大きすぎず細かすぎない単位にしたほうが後々のことを考えると便利になります。
タスク分割をすることでただ作業しやすくなるだけではなく、ホウレンソウしやすい、管理しやすいなどのメリットも得られる可能性があります。

## 計測
### ポモドーロ
タイマーを使って作業時間を計測することは、管理することにつながります。
また時間を計測するだけでなく、記録しておくことも大切です。
似たような仕事に取り掛かる際には、過去の記録を参考に正確な見積もりを出すこともできます。

## 見積もりの振り返り
### 客観的な意見を求める
どの作業にどれくらい時間がかかったか、座ってる時間と作業できた時間に差がないか、
タスク粒度は適切だったかなど振り返りの基準はチームや会社によりけりだと思います。
振り返りを行うことで次の見積もりの精度がよくなります。
また「振り返りの振り返り」も大切です。
振り返りをしてみたが意見が出なかった、一人がずっと話してしまった、時間が足りなかった、など始めたばかりのチームであれば、課題も多いかもしれません。

## LTのQ&Aで出てきた意見紹介
### 見積もり * 4
出した見積もりの時間を4倍することで正確な見積もりが出せるという話が出ました。
上流よりの方の意見ということもあり、作業時間の捻出、追加要求の対応..で4倍とのこと。バッファの比率を何倍にするかについては意見が割れそうなところです。（一般的には1.5くらいでしょうか?)

### ディレクターさんのキャラに合わせた見積もり
ディレクターさんや上流サイドの担当者に合わせてバッファを変えると話していたデザイナーさん。
理由は人によって追加の要件があったり、人によるところがあるからとのことでした。

### キーワード紹介
他にも面白い話が出てきていたので単語だけ紹介したいと思います。
- QDC(quality, cost, delivery)
- リーン開発
- 会社宿泊(!)
- [BFT ポモドーロアプリ](https://apps.apple.com/jp/app/bft-bear-focus-timer/id1328806990)
- 不確実性のコーン(確実と不確実2ベクトル見積もり)

## まとめ
終業後にLTという形で登壇して、意見交換も白熱した感じでしたので、勢いのまま記事を書かせていただきました(感謝)。
見積もりが上手になると、管理の意識が高まったり、時間をロスしている箇所や負荷がかかるポイントを見つけられて、結果的にスキルを客観視できるかもしれません。
また、複数人での開発時に状況管理がしやすい、など他にもメリットがあると感じました。
日々実践しながら見積もり力を磨いて行こうと思いました。

### 参考文献
[エンジニアのための見積もり実践入門-技術の泉シリーズ](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E8%A6%AA%E6%96%B9Project-ebook/dp/B08LMXRV5F/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E8%A6%8B%E7%A9%8D%E3%82%82%E3%82%8A&qid=1607335776&sr=8-1)
[熊とワルツを](https://www.amazon.co.jp/%E7%86%8A%E3%81%A8%E3%83%AF%E3%83%AB%E3%83%84%E3%82%92-%E3%83%AA%E3%82%B9%E3%82%AF%E3%82%92%E6%84%89%E3%81%97%E3%82%80%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E7%AE%A1%E7%90%86-%E3%83%88%E3%83%A0-%E3%83%87%E3%83%9E%E3%83%AB%E3%82%B3-ebook/dp/B00F4QOMWM)
Flutterでマテリアルアイコンを探す方法

## アイコンの書き方

```dart

Icon(Icons.x)
```
xの部分に以下の方法で見つけた定数を記述します。

##アイコンの探し方

###### 1. IconsのAPIドキュメントの一覧ページを開く

https://api.flutter.dev/flutter/material/Icons-class.html

以下のようにアイコンとアイコンの定数が羅列されています。
![スクリーンショット 2020-12-08 10.36.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450548/be7fb23b-9b03-21cf-e9ef-c74e056f9ef5.png)


######  2.使いたいイメージのアイコンから連想する単語を英語訳

翻訳アプリに思いついた単語を入力して英語にする。
[google翻訳](https://translate.google.co.jp/?hl=ja&sl=ja&tl=en&op=translate)
[Deepl翻訳](https://www.deepl.com/ja/translator)

###### 3.単語検索をする

Command (Control) + Fで検索バーを表示して、
先ほと翻訳した英語を入力する。



２.3.を繰り返して探します。
終了


##まとめ


アイコンのドキュメントを開く
https://api.flutter.dev/flutter/material/Icons-class.html
Command (Control) + Fで検索!
エンジニアリングマネージャーについて考える

この記事は、[and factory Advent Calendar 2020](https://qiita.com/advent-calendar/2020/andfactory) の8日目の記事です。
昨日は@ayatothosさんの[図解『実践Terraform』](https://qiita.com/ayatothos/items/27024e8168a8b766bcd3)でした。

# はじめに

私は、およそ1年ほど前から、iOSチームのエンジニアリングマネージャーをやっています。
何をするべきなのか最初は迷うこともありましたが、徐々に方向が定まってきたかなと思うので、考えや心掛けを書いていきます。

# そもそもエンジニアリングマネージャーって何？

マネージャーという言葉どおり、管理する人ということになりますね。
エンジニアリングマネージャーであれば、エンジニアを管理する人ということになるかと思います。

調べてみると、だいたい以下のような項目が挙げられていました。

- ピープルマネジメント
- 環境整備
- 採用
- 評価

わりと人事寄りの仕事が多いように感じました。
でも、エンジニアの何をどう管理すれば良いのか？という点は、モヤモヤしていました。

# 私なりのマネジメントの考え方

採用に関しては、今までも行っていたので、それは続けていくとして。
ピープルマネジメントや環境整備ってどんなことが出来るんだろう？と考えていたとき、ふと頭に浮かんだことがありました。
それは、**管理するというより、サポートをする、という考え**のほうがしっくりくるな、ということです。

「ピープルマネジメント」には**マネジメント**という言葉が入っているので、マネージャーが主体となって何かをするという風に考えていました。
しかし、実際に行動するのは、メンバー（マネジメントされる側）です。

例えば、ピープルマネジメントですぐに思いつくこととして、キャリアパスをたてるとか、スキルアップの為に勉強するというのが考えられますが、計画をたてた後に行動するのはメンバーです。
なので、あくまでも主役はメンバーで、私はメンバーが動きやすいようにサポートをしようと考えるようになりました。

ちょうど、学校の部活動におけるマネージャーのように、選手がプレーに集中できるように環境を整える、という感じです。

# 強制しない

人間それぞれ個性がありますし、エンジニアとして考えた時にも興味のある分野、好きな分野、嫌いな分野など、完全に同じ人は稀だと思います。
なので、キャリアパスや勉強のプランを考えるときも、サポートやアドバイスをすることはありますが、強制はしないように心掛けています。
メンバーが、**自分に必要と思うことを、自分自身でしっかり考えて実行することが重要**と考えているからです。
（強制してしまうと、やらされてる感も出てしまって、効率が悪くなったりモチベダウンしたりというデメリットが多そうですし。）

アドバイスもちゃんとメンバーが納得した上で、自分に必要だと感じたら実行するという温度感で良いと思います。
なぜなら、アドバイスも結局は私の経験に基づくものだったり、一般論でしかないからです。
どちらにせよ失敗するときは失敗しますし、失敗した経験から学ぶことも多いはずです。
なにより、必要になったらきっと自分から行動するでしょう。（勉強するなり調べるなり。）

# 何をやるのか

メンバーが開発に集中できるような環境を作ったり、そのサポートに尽きると思います。
手段はいろいろあると思いますが、最終的にそれがメンバーのパフォーマンス向上に繋がるのであれば、きっとそれが正解なのでしょう。

1on1はメンバーの人となりを知る手段で、人となりを知ることができれば、そのメンバーにあったサポートができるかもしれません。
あるいは何かしらの不安があったり、会社に対する不満があるならば、それを取り除くように働きかけることも必要になりそうです。

# おわりに

エンジニアリングマネージャー自体がまだ歴史が浅いこともあり、何をするべきなのか迷いがちですが、迷ったら『メンバーの為になることは何なのか？』という原点に戻って考え、思考を整理していきたいと思います。

一つの考えとして、この記事が参考になれば幸いです。
WordPressで子テーマを作るための準備

ワードプレスのテーマ twentytwenty を基盤に、子テーマを作る実装を行ったので、備忘録的にこの記事を残す。

# 環境情報

PHP：version 7.3.12
WordPress：version 5.5.3
WPテーマ：twentytwenty

# 作業

WordPress の公式テーマなどで配布されているオリジナルテーマに独自に機能を追加したり別のテンプレートを追加したい場合には、「子テーマ」という仕組みを利用します。
もし、オリジナルのテーマを直接変更した場合、テーマのアップデートの際にアップデートの仕組み上最新バージョンのテーマのファイルに上書きされてしまい、自分が行った変更が消えてしまいます。
その状況を防ぐため、親テーマを継承した子テーマを作成してカスタマイズを行う手法をとります。
今回は、例として Twenty Twenty のテーマを継承して作成していきます。「twentytwenty_child」という子テーマを作成します。

## ディレクトリとファイルの作成

wp_content/themes 以下に twentytwenty_child というディレクトリを作成し、その中に index.php、style.css、functions.php の3つのファイルを作成する。

## style.css の編集

子テーマの style.css に以下を記述する。

```style.css
/*
Theme Name: Twenty Twenty Child   <---   子テーマの名前
Author: the WordPress team   <---   子テーマの作成者
Template: twentytwenty   <---   親テーマのディレクトリ名
Description: Twenty Twentyの子テーマです。   <---   テーマの説明
Version: 1.0   <---   子テーマのバージョン
*/
```

## index.php の編集

子テーマの index.php は親テーマの index.php のコピペでよいが、必要に応じて変更箇所を編集することができる。

## functions.php の編集

親テーマのスタイルシートを読み込むようにするために、wp_enqueue_scripts をフックに、wp_enqueue_style で style.css を読み込むようにします。
以下を functions.php に記述します。

```functions.php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
    wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
    wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/style.css', array( 'parent-style' ) );
}
```

## 管理画面から有効化

WordPressの管理画面から「外観」>「テーマ」>「Twenty Twenty Child」が表示されるので、「有効化」をクリックします。
RPAからExcelマクロを呼び出す場合の関数名についてのメモ～Excelマクロが実行できない場合の解決策

Excelマクロを呼び出すことができるRPA製品も多くありますが、Excelマクロを呼び出すアクティビティの**「マクロ名」**に何を指定すべきか、迷うことがありませんか？以下のような関数がある場合、マクロ名は単純に「関数名」を指定するだけで動く場合もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/2c7168ee-5c00-e998-54b7-2e17c13793b9.png)
しかし、同じ関数名が他の場所にあったり、別のExcelブックが開いているケースなどを考えたときに、**あらゆるケースでエラーが出にくい名前を指定しておく**必要があります。

ではどのように指定すべきかというと、以下の通りフルパスで指定しておくとよいでしょう。

```
<Excelブック名>!<モジュール名>.<関数名>
```
たとえば`Excelbook.xlsm!Sheet1.FunctionName`という記載となります。

この名前は、Excelでマクロが含まれるファイル以外にファイルをもう一つ開いて、そこからマクロダイアログボックスを表示させることで、以下のようにフルパスでマクロ名を表示させることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/c3385204-a94a-5cb6-2468-b8bfd4634fbf.png)

各RPA製品では、以下の通り指定します。

# UiPathの場合
「マクロを実行」アクティビティの「マクロ名」に`<Excelブック名>!<モジュール名>.<関数名>`をダブルクオートで囲って指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/1ba86905-9c57-e6d7-2fca-ec52147a91c0.png)

# Automation Anywhere A2019の場合
「Excelの高度な操作:マクロを実行」アクションの「マクロ名」に`<Excelブック名>!<モジュール名>.<関数名>`をダブルクオートで囲って指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479715/e975b43f-0c97-3cfd-777c-efe4d3309061.png)
コンテナイメージではない大きなコードをAWS Lambdaに上げる裏技

こんにちは。
Web・iOSエンジニアの三浦です。

今回は、コンテナイメージにしていないサイズの大きなコードを、AWS Labmdaにデプロイする裏技を紹介します。

# はじめに
今でこそAWS Lambda（以降Lambda）は[2020年12月4日に10GBまでのコンテナイメージが使用できるようになりました](https://aws.amazon.com/jp/blogs/news/new-for-aws-lambda-container-image-support/)が、それまでは最大で250MBまでしかコードをデプロイすることができませんでした。
まだその制限があった際に250MBを超えるコードのデプロイが必要になったことがあり、とある裏技を使うことでなんとか回避してデプロイすることができたので、今回はその方法について紹介していきます。

# AWSとLambdaの紹介
## AWSとは
[AWS](https://aws.amazon.com/jp/)は、Amazonが運営するクラウドサービスです。
サーバやデータベース、その他開発に必要/有用な様々なサービスを提供してくれています。
使用するメリットとして、使った分だけ請求されることや、管理をAWS側に任せることができることが挙げられます。

## Lambdaとは
[Lambda](https://aws.amazon.com/jp/lambda/)は、AWSが提供しているサービスの一つで、コードをデプロイして動かす事のできるサービスです。
サーバそのものに加え、内部の設定や負荷分散してくれる機能なども含めて提供してくれているサービスであり、エンジニアは、コードのデプロイと多少のパラメータの設定をするだけで良いというものになっています。

# Lambdaの制限とその回避方法
## Lambdaに存在する制限
上記で挙げたとおりLambdaは非常に便利なサービスですが、一方でいくつか制限も存在します。
その一つが、コンテナイメージでないコードだと、デプロイできるコードが最大250MBということです。
私が以前行っていたプロジェクトでは、以下のシステムをLambdaで実現しようとしたときに250MBを超えてしまいました。

![スクリーンショット 2020-12-07 12.20.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/c954e8df-7fe7-d539-6cf8-9ee784254b3d.png)
> インターネット上のサイトをChromeのバイナリを使ってスクレイピングし、その結果をDBに保存するシステム。
> Chromeのバイナリと、それを操作してデータを取得・DBに保存するPythonのコードをLambdaにデプロイする。

特にChromeのバイナリが重く、全て合わせると250MBを超えてしまっていました。
ただ、いくつかの事情からこの状態でLambdaでの運用をする必要があり、色々検討した結果、以下の方法でこれをデプロイ・実行できることが判明しました。

## Lambdaのコードサイズ制限の回避方法
回避方法といってもシンプルなもので、以下のようにChromeのバイナリを圧縮した、というものです。

![スクリーンショット 2020-12-07 14.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407637/76147265-b02d-0c1c-b672-26ca93b54964.png)

ChromeのバイナリのみZIPとして固めた状態でLambdaにデプロイし、Lambda実行時にコード上で解凍して使用します。
このときのプロジェクトでは、Chromeのバイナリを圧縮すれば250MBを下回ったので、この方法でなんとかデプロイすることができました。
また、解凍後に250MBを超えてしまいますが、現状（2020年11月23日現在）では問題なく動いています。

# まとめ
Lambdaには、コンテナイメージでないコードは250MBまでしかデプロイできないという制限がありますが、一部のコードやバイナリなどを圧縮してデプロイし、Lambda実行時に解凍して使用する、という裏技を使うことで、250MBを超えていてもデプロイできます。
ただし、以下の懸念点も存在します。

- 使用する言語・フレームワークによっては、実行時に解凍して使用できない可能性がある
- 圧縮しても250MBを上回る場合はデプロイできない
- 現状では、デプロイ時に250MBを下回っていさえすれば、実行時に解凍して250MBを超えていても問題ないが、将来的に問題ないという保証はない

以上の点から、250MBを上回ってしまう場合は、コンテナイメージを使用したり、EC2・ECS等を使用するほうが安全性は高いでしょう。
ただ、もしどうしようもない理由がある場合は、こちらの裏技を試してみてもいいかも知れません。

参考になれば幸いです。
クラシルとRxSwiftデビュー

こんにちは！

ずっと気になっていたサウナに先輩デザイナーに連れて行ってもらい完全にハマってしまい、最近は仕事中もサウナに行きたくて堪らない禁断症状が出ている
dely(クラシル)でiOSエンジニアをしています @RyogaBarbie です♨️

このnoteは dely Advent Calender #2 の8日目の記事となります。
[dely Advent Calendar #1](https://adventar.org/calendars/5252)
[dely Advent Calendar #2](https://adventar.org/calendars/5253)

昨日の記事はAndroidチームのマネージャーのうめもりさん（Twitter: [@kr9ly](https://twitter.com/kr9ly)） の記事になります！
[Androidのビルド用Dockerイメージダイエット計画](https://tech.dely.jp/entry/2020/12/07/170000)

### クラシル
クラシルの凄腕PdMの奥原さんの紹介で今年9月にdelyのiOSエンジニアとして入社しました。
現在はレシピ動画サービスのクラシルの速度改善チームにてiOSを担当してます。

そんな奥原さんのAdvent Calendarは [こちら](https://note.com/okutaku/n/n65f6ca449f0e)

delyに入社した理由はたくさんあるのですが、いくつかあげると

- 料理が好き(食べる)
- 自粛期間で料理作ることが増えた
- 働いてる人が良さそう(知り合いが働いてることで雰囲気もある程度つかめた)

といった感じです。

dely入社前にシェアされていたdelyの資料 [これ](https://blog.tsubotax.com/n/n3fbf3ecdea9e?fbclid=IwAR1rdmFnbo5hxqwZZxOup46iVl8_S5ftWB_Usx4Hb9P1sLFZq5DR5k77-ls)や [これ](https://blog.tsubotax.com/n/nd5e1ce807507?fbclid=IwAR2fWCX8rvPCFppunUD5uUf4BAXjzDJ5MxR9szpDJvTCpwGy02zgALvovao)に記載されてるように情報がフルオープンの会社になってます。
slackを追えば何がどうなっているかがわかる会社です。
逆にslackのチャンネル多すぎ&流れるの早すぎで、最初は困惑しました！

そして、働いてる同僚が良い人しかいない、環境(オープンさ)がいいので心理的安全性高めで働くことができています！


ちょっとでも興味ある方は
[Twitter](https://twitter.com/RyogaBarbie)または[採用ページ](https://join-us.dely.jp/)からぜひ！


### RxSwift
現在クラシルではRxSwiftを使ったMVVMでの開発を行っています。
おおざっぱに書くと↓のような感じ
Router - View(ViewController) - ViewModel - UseCase - Repository
(細かい話はまたいつか…)

前職などではRxSwiftを使わないClosureを使ったMVVMでの開発だったので、RxSwiftを実務で使うのはクラシルが初めてでした。
一定まではClosureを使った開発でも特に辛さを感じないのですが、複数の非同期のAPIを待つなどで辛さが出てくるので `zip`には感動しました。
`「細かいRxSwiftの書き方や使い方は実際に実務でいろいろ書かないとわからない」`というのがRxSwiftを使ってみての感想です。


RxSwiftとMVVMの実装のStyle設計に関しては[@yimajo](https://twitter.com/yimajo)の[RxSwift研究読本シリーズ](https://swift.booth.pm/items/1076262)がオススメです。
そしてクラシルでは[Unio](https://github.com/cats-oss/Unio)を導入してViewModelのStyleを揃えています。
Viewで発生するInputをViewModelに定義し、ViewControllerで`ViewModel.input.hoge(())`のように発火させるのは導入当初は違和感しかなく、先輩エンジニアなど雑談したりしましたが、今では書き方統一するメリットの方が大きく`Unio良き`という気持ちです。

### 終わりに

明日は弊社CXOの[坪田さん](https://twitter.com/tsubotax)の`開発体制をSquad化してきてわかってきたコツと課題`です！

そして、delyではエンジニア・デザイナー共に絶賛募集中です！
クラシルやTRILL開発部の情報が以下のリンク先にまとまっています。
[採用ページ](https://join-us.dely.jp/)

また、開発メンバーが組織や技術・手法などについてざっくばらんにお話しするオンラインイベントを開催しています。「雰囲気をみてみたい」「聞きたいことがある」などありましたら、ぜひご参加ください！
[オンラインイベント](https://bethesun.connpass.com/)
個人的によく使うeximコマンド

eximで個人的によく使うコマンドを書き留めておきます
なにかの参考になれば

* eximのバージョン表示

```shell
$ exim -bV
```

* メールキューの一覧を表示

```shell
$ exim -bp
```

* キューIDの一覧

```shell
$ exim -bp | awk '{print $3}'
```

* キューIDを指定して本文の表示

```shell
$ exim -Mvb キューID
```

* キューIDを指定してヘッダーの表示

```shell
$ exim -Mvh キューID
```

* キューIDを指定してログの表示

```shell
$ exim -Mvl キューID
```

* キューを指定して再配送

```shell
$ exim -M キューID
```

* 全メール再配送

```shell

$ exim -qff
```

* キューIDを指定してメール削除

```shell

$ exim -Mrm キューID
```

* 特定の送信元アドレスのメールを全削除

```shell
$ exim -bp | grep "送信元アドレス" | awk '{print $3}' | xargs -I {} exim -Mrm {}
```
sliceメソッドを使ったAPI問題

本日はこちらの問題を解いていきます。

　
問題.
任意の文字列の最後の2文字を3回繰り返し
出力するメソッドを作りましょう。

出力例：
extra_end('Hello') → 'lololo'
extra_end('ab') → 'ababab'
extra_end('Hi') → 'HiHiHi'

ヒント
sliceメソッドを用いることで、配列や文字列から指定した要素を取り出すことができます。

```ruby
# 配列を作成します
array = [0,1,2,3,4,5,6]

# 配列から引数で指定した要素をsliceします
ele1 = array.slice(1)
puts ele1
#=> 1

# 配列番号1から4つ分の要素をsliceします
ele2 = array.slice(1,4)
puts ele2
#=> 1 2 3 4

# 配列はもとのままです
puts array 
#=> [0,1,2,3,4,5,6]
```

模範回答

```ruby
def extra_end(str)
  char_num = str.length
  right2 = str.slice(char_num - 2, 2)
  puts right2 * 3
end
```

解説
たとえば、extra_end('Hello')でメソッドを呼び出した場合、
.lengthを使うことによって１から数えることが出来ます。（使わないと0から数えてしまいます。）
char_num = 5となり、right2 = str.slice(3,2)になります。
slice(3,2)は配列番号（インデックス）3つ目から数えて2つ分の要素を切り取ります。
今回の場合、切り取られた結果loが残り、right2 = loとなります。
最終的に、right2 * 3、つまりlololoと出力されます。
aura:componentの中での文字列から数値への変換

たまにしか使わないので、良く忘れてしまいます。私の覚えです。

コントローラ、ヘルパーはJava Scriptと似てて非なる部分もあって、戸惑うことがあります。
その一つが文字列から数値への変換。

動かない例

```
var invalue ="1234";
var myInt = Integer.parseInt(invalue); 

var myInt2 = Integer.valueOf(invalue); 
```

正解

```
var invalue ="1234";
var myInt = parseInt(invalue); 
```
Big Sur　pyenvインストール

Big Surを入れてからpyenvからインストールできなくなってしまった時の対処法

brew install zlib
export LDFLAGS="-L/usr/local/opt/zlib/lib"
export CPPFLAGS="-I/usr/local/opt/zlib/include"
pyenv install xxx



https://github.com/pyenv/pyenv/issues/1746
[macOS][cocoa][Swift]なかなか調べるのに時間がかかったりしたのでメモ

# 忘れないようにメモ

個人的にアプリを作った際に調べたものをメモ.....φ(・∀・＊)

## スクロールビューの有効/無効を出来るようにする

``` swift
class MyScrollView: NSScrollView {
    /// スクロール有効/無効
    var isScrollEnabled = true
    
    /// scrollWheel
    /// - Parameter event:
    override func scrollWheel(with event: NSEvent) {
        if self.isScrollEnabled {
            super.scrollWheel(with: event)
        }
    }
}
```

## ESCをショートカットキーで利用する場合

他のアクションに繋いでも動かなくて悩みました。ESCキーはデフォルトで下記アクションが利用されるようで、overrideする事により出来るようになりました。

``` swift
@IBAction override func cancelOperation(_ sender: Any?) {
}
```

## presentAsSheet で呼び出したViewのサイズ固定

``` swift
class MyViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // サイズを固定
        self.preferredContentSize = self.view.frame.size
    }
}
```

## NSWindow のフルスクリーン判定

``` swift
extension NSWindow {    
    // フルスクリーン判定
    var isFullScreen: Bool {
        return self.styleMask.contains(.fullScreen)
    }    
}
```

## メニューの有効/無効

NSMenuItemValidationプロトコルの実装を使う。

``` swift
extension ViewController: NSMenuItemValidation {
    func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
        switch (menuItem.action) {
        // toggleSidebarメニューを条件によって有効/無効にする
        case #selector(NSSplitViewController.toggleSidebar(_:)):
            if self.hoge {
                return false
            } else {
                return true
            }
        default:
            return true
        }
    } 
}
```

## オブジェクトをファイルへ保存
```swift
// NSConfig プロトコルを実装
class Entity: NSObject, NSCoding {
    var id: Int = 0
    var name: String = ""
    
    override init() {
        super.init()
    }

    required init?(coder: NSCoder) {
        self.id = coder.decodeInteger(forKey: "id")
        self.name = coder.decodeObject(forKey: "name") as! String
    }

    func encode(with coder: NSCoder) {
        coder.encode(self.id, forKey: "id")
        coder.encode(self.name, forKey: "name")
    }
}

// ファイルへ出力
var item: Entity(id: 1, name: "hoge")
NSKeyedArchiver.archiveRootObject(item, toFile: filePath)

// ファイルから読み込み
let readedItem = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? Entity
```

他にも、あとで追記予定。。。
本当にあった UI の指摘事項

# メインページ

```
これは、私が実際に業務で体験した、UIへの指摘事項の話です。

私は数年間、社内ポータルの開発に携わってきました。
これまで学んできた UI のお作法に則って開発をしてきましたが、
まさか、そこに様々な指摘事項を貰うことになるとは
思いもよりませんでした。
```

## 概要
UI は我々がPCなどで日常的に目にしているもので、
人の顔と同じ様に、アプリやページによって様々な特徴があります。
そして、顔に目、口、鼻、髪などが揃っている様に、
UI にもお決まりのテンプレートがあります。

ただ、万人に通用する UI のテンプレートはまず存在しないでしょう。
例えば、人によって好きな髪型は違うと思います。
UI も同じ様に、使う人、見る人によって好みが分かれます。

今回紹介する記事は、
私が UI 作成に携わってきた中で得た、
様々な方々からの指摘・意見をまとめたものです。

UI を考える方、作成している方、
これから UI 開発に携わりたい方に、是非見て頂ければと思います。


## 各記事へのリンク
### [営業担当からの指摘編](https://qiita.com/hantyou-k/items/517fa8eed33e4918d874)

### [Windows 利用者からの指摘編](https://qiita.com/hantyou-k/items/20a780183b036df29f17)

### [運用担当者からの指摘編](https://qiita.com/hantyou-k/items/032c00e3106ff3911b56)


## あとがき
実際の利用者から得た指摘事項は、UI 開発におけるとても大切な財産です。
これをヘアーカタログの様に、UI（事例）カタログとしてまとめておけば、
様々な種類の顧客に提案しやすくなるのではないでしょうか。
音ゲーのタイミング計算

音ゲーを作ったのでその時の知見をまとめておきます

前提として今回は一定の速度でノーツが移動します
beatmaniaIIDXの[SOFT LANDING ON THE BODY](https://www.nicovideo.jp/watch/sm7706507)のようなソフランは考慮していませんが、最初からノーツスピードが遅く流れてくる太鼓の達人のようなソフランは対応できます

```C#:ノーツの移動
update(){
 this.gameObject.transform.Translate(0, "ノーツの移動速度" * Time.deltaTime, 0);
}

//ノーツの移動速度の計算方法
speed  = "曲のノーツスピード" * "プレイヤーが設定したノーツスピード" * "曲のBPM" / 60;

```


```C#:原型
座標 = "曲のBPM" / 60 * "ノーツをタップする時間" * "曲のノーツスピード" + "曲のオフセット";
```

```C#:プレイヤーが設定をいじる場合
座標 = "曲のBPM" / 60 * "ノーツをタップする時間" * "曲のノーツスピード" * "プレイヤーが設定したノーツスピード" + "曲のオフセット" + "プレイヤーの設定したオフセット";
//この際、曲のノーツスピードは基本値を１にしておくこと
```

このように座標の計算ができる

#おまけ
###スコア計算について

最終的に1000000になるように1ノーツあたりのスコアを計算して足していく方法が最初に思いついたが、細かすぎる計算はあまりきれいに出ない
何なら1000000にならないことが多々あった

別の方法として割合で計算する方法がある

```C#
score = (int)((float)1000000 * (((((float)"最高判定の数" * (float)2) + (float)"ひとつ下の判定" )/ ((float)"すべてのノーツ数" * (float)2))));
```



#参考元
[小節数から再生時間を計算する](http://sumishiro.blogspot.com/2010/08/blog-post_26.html)
master.keyが無い問題の解決への道 [config/master.key: No such file or directory]


# 最初に

**カレンダー企画2020の8日目**
プログラミングの勉強を始めて3ヵ月程経ったので学んだことのメモをアウトプットとして記事に残します。
これからプログラミングの世界に入る人の手助けになれたら嬉しい限りです。
間違っていたり、言葉が違っていたり、誤解されるような言葉があったら教えてください^^
言葉を長々と読みづらかったら申し訳ありません。少しずつなれてがんばります。

# deployをしようとした時にmaster.keyがなくて困った

こんなのがエラーで出てくる^^;

```ターミナル:ターミナル
config/master.key: No such file or directory
```

## 環境

Rails 5.2.4

## 無くなった原因

git push時にmaster.keyは除外されるようになっているのでGitHub上には残らない（GitHubにあがるとまずい^^;）
git cloneを行ったりするとmaster.keyがない状態になる。(私はこれが原因でした！)
他にもあるのかもですが分からないです！

## 解決

1. アプリケーションのディレクトリに移動
2. `config/credentials.yml.enc`というファイルがあると思う。それを削除します
3. そうするとconfigの中には`master.key`と`credentials.yml.enc`がない状態になる
4. これをターミナルで実行

```ターミナル:ターミナル
sudo EDITOR="vi" rails credentials:edit
```

5. するとconfigの中に`master.key`と`credentials.yml.enc`現れる。

もし、このあとdeployをする場合はpushをしてdeploy環境下でpullを忘れずに！
`credentials.yml.enc`の中身が変わっているのでこれをしないとまた違うエラーが出るよ！(経験済！^^)

## そもそも`master.key`と`credentials.yml.enc`って何？？

`credentials.yml.enc`が暗号化されているよう…
`master.key`を使って復号化するみたい…

2つはセットでどちらかが欠けてもダメってことですね！(調べて見て鍵と鍵穴の関係で説明されていました！)
とくに`master.key`は大事なので保管方法にも気をつけた方が良いみたいです！

これを見て勉強しました！（良かったらどうぞ）
[参考サイト:https://techtechmedia.com/credentials-masterkey-rails/#masterkey-2](https://techtechmedia.com/credentials-masterkey-rails/#masterkey-2)

## 最後に

自分が詰まったエラーだったのでメモのつもりで残しました！
php開発でのVSCode拡張のススメ

# Visual Studio Code でphp開発に使う拡張機能のススメ

ほぼ自分が使っているVSCodeの拡張の紹介になります。
開発速度を速くする可能性があるものはどんどん取り入れるといいと思います。

## php専用

### PHP Intelephense
ジャンプ、入力補完、全般的な補助、PHP開発には必須です。
いろいろの機能があるので使いこなせるようになるといいと思います。


## 他の言語でも使える
### Material Icon Theme
ファイルアイコンを見やすくすることができます。
他にも種類があるのでIcon等で検索するといいでしょう。
### Rainbow CSV
カンマ（.csv）、タブ（.tsv）、セミコロンとパイプで区切ったファイルを
色分けして強調表示します。
### indent-rainbow
テキストの前のインデントを各ステップで
4つの異なる色に交互に色付けします。
### GitLens
エディタ上でgitを使いやすくなります。
かなり多くの機能が存在するため、一度は説明を熟読をするといいと思います。

### Remote-SSH
エディタ上でリモート先のファイルを操作可能になります。

### Trailing Spaces
後方の全角スペースを可視化する。
### Bracket Pair Colorizer 2
カッコに色をつけること閉じ括弧がわかりやすくなります。
WordPressの独自リソースを一元管理する

ワードプレスのテーマtwentytwentyを基盤に、wp_head( )内の独自のスクリプト、スタイルシートをfunctions.php内で一元管理する実装を行ったので、備忘録的にこの記事を残す。

# 環境情報

PHP：version 7.3.12
WordPress：version 5.5.3
WPテーマ：twentytwenty

# 作業

functions.php内に以下のコードを記述する。

```functions.php
function my_enqueue_scripts() {
    wp_enqueue_script( 'jquery' );
    wp_enqueue_script( 'bundle_js', get_template_directory_uri() . '/assets/js/bundle.js', array() );
    wp_enqueue_style( 'my_styles', get_template_directory_uri() . '/assets/css/styles.css', array() );
}
add_action( 'wp_enqueue_scripts', 'my_enqueue_scripts' );
```

その後、header.php内の以下の3行を削除する。

```header.php
<link rel="stylesheet" type="text/css" href="<?php echo get_template_directory_uri(); ?>/assets/css/styles.css" />
<script type="text/javascript" src="<?php echo get_template_directory_uri(); ?>/assets/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="<?php echo get_template_directory_uri(); ?>/assets/js/bundle.js"></script>

```
行動ログを吐き出すバッチを作ったら便利だった話

「[Applibot Advent Calendar 2020](https://qiita.com/advent-calendar/2020/applibot)」 7日目の記事になります。
前日は @kaz2ngt さんの [goでデータの循環参照をチェックする(gonumパッケージ グラフ入門)](https://qiita.com/kaz2ngt/items/ed4a0b0209e140357e00) という記事でした!

今回は、弊社のログ基盤「Dive」を使った分析要件の話になります。
Diveについて簡単に説明すると、Diveとは[データレイク](https://aws.amazon.com/jp/big-data/datalakes-and-analytics/what-is-a-data-lake/)という考え方を取り入れたログ基盤です。DiveのインフラはAWSを採用しているため、S3をデータレイクとして用いています。様々なプロジェクトから吐き出される行動ログはKinesisを経てこのデータレイクに流れ着きます。そしてアナリストやCS対応者などは、Redash,TableauといったBIツールを通してこのデータレイクにアクセスすることで目的の情報を得られるようになっています。

弊社のログ基盤の詳細については下記記事をご覧ください。

[ソーシャルゲームの運用に欠かせないデータ分析基盤の作り方](https://blog.applibot.co.jp/2019/05/31/data-analysis-for-social-game/)

## 背景

新規開発において、ログから得られるデータの集計値が正しいかどうかを保証したいという課題がありました。BIツールなどでデータを参照して集計値をビジュアライズしたところ、それらしい数値は出てきたが本当にこれが正しいデータなのかどうかが分かりません。毎度プロジェクトのサーバーアプリケーションからログを吐き出して集計の確認をすることはかなり手間がかかるため、それを解決すべくログ吐き出しバッチを作成するに至ったというものです。 

## 何をしたか

### 全API網羅シナリオをかけて1ユーザーの行動ログテンプレートを作成する

幸いにもこの課題に取り組むときに全てAPIを網羅するシナリオがあったのでこの選択肢を選ぶことができました。全てのAPIが叩かれることでほとんどの行動ログを出力することができました。仮にもしそれが選択できない状況下であれば、全てのAPIを網羅するようなユーザー行動シナリオを設計してそれを実行するという選択肢を取っていたと思います。

### その際に流れたログをデータレイクであるS3から抽出してローカルに落とす

S3のAWSコンソールではディレクトリを丸ごとダウンロードすることはできないかつログの種類が数十あったため、aws s3コマンドを用いたスクリプトを作成することで簡単にダウンロードできるようになります。aws s3コマンドのサブコマンドであるcpやrmはかなり危険なコマンドなので実行前に`--dryrun`オプションをつけて確認することがおすすめです。

### 前項で得たログの集合を1ユーザーの行動ログテンプレートとしてそれを複製するバッチプログラムを作成する
ユーザーIDや行動時日付などを適切に割り振ってテンプレートからログを複製します。
このバッチプログラムの作成にgolangを用いました。s3にアップロードする処理をgoroutineを用いて並列化することによって、バッチ処理時間を短くすることができました。

### バッチをDockerイメージ化してAWS Batchにデプロイし、AWS Batchインスタンス上で複製した大量のログをS3にアップロードする

AWS Batchとはその名の通り、EC2インスタンス上でバッチを実行してくれるサービスです。使用したいDockerイメージと実行するコマンドを指定することで、バッチジョブを実行してくれます。これを用いることでAWSネットワーク内でログ転送が完結させることができます。

### Dive集計バッチをAWS Batch上で走らせて集計データの確認をする

バッチから流した行動ログから得られる集計値と想定値が一致するかどうかを確認します。
   

## 何がよかったか

- 集計処理の速度計測ができるようになった
    - バッチで吐き出すログ量を大量にすることでログ基盤アプリケーションの実行速度テストに使える
- アナリストのクエリのチェックに役立った
- Golangの知見を得ることができた
    - Kotlinは多くの言語機能を持っているがgolangは比較的シンプルなイメージ
    - ライブラリ周りのエコシステムがとても充実している
        - 今回の場合、sirupsen/logrus, google/uuidが素敵でした！
    - goroutineによる並列化で処理効率がアップすることを実感できた

## まとめ

行動ログ吐き出しバッチを作成することによって、ビッグデータから得られる集計値の精度向上に役立ちそうです。
今回作ったところまででは全てのAPIを叩くようなシナリオに対して集計値が想定値と一致するかどうかのチェックができるようになりましたが、さらに精度向上を目指す場合は精度を向上させたい集計値が如実に現れるようなシナリオを考えて、そのシナリオに対する想定値を仮定し、バッチを実行してテストをするとよいのではと考えています。今後の展望として、このような様々なシナリオが存在する場合の汎用的な設計を目指しています。
【Stereo Depth】MC-CNN : CNNでstereo depthの初期の方法

<h1>Stereo Matching by Training a Convolutional Neural
Network to Compare Image Patches</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6b1472d4-ef0b-14f0-cbec-303cd9f4c306.png)

SGM(Semi Global Matching)やBM(Block Matching)などの人間によってチューニングをしたパラメーターをCNNにやらせようというかなり初期に提案された方法を見ていきたいと思う。

<h1>新規性</h1>
SGMをbaseにしてMatching Costの計算の方法をCNNで行うという手法である。
どうやってMatching Costを求めるか見ていきたいと思う

<h2>The fast architecture</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/83eb5d1a-074c-8824-71c6-338385f94cfb.png)
1つ目は計算速度の早いネットワークで、Left input patchとRight input patchを入力にCNNで特徴量を畳み込み、内積(Dot Product)の計算をしてSimilarity Score(Matching Score)を出力。
右と左の特徴が似ていればSimilarity Scoreは高くなる。




<h2>The accurate architecture</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/0a0947f2-971e-c6e9-7438-13c9b998b54f.png)
2つ目はより精度に重点を置いたネットワークで、内積をとるのではなくChannel方向に結合(Concatenate)しFully Connectedを行い最後にsigmoidをする事で0~1にsimilarity scoreを正規化出来る。

単純に内積を出すのではなく特徴を結合する事で、精度があがる.

「なんでやねん！」って思う人がいると思うので、あえて言うなら特徴量1つ1つに重みをつけたりMatchingする特徴の組み合わせによってsimilarity scoreを変化する事が出来るイメージ


<h1>結論</h1>
・CNNを用いてMatching Costを計算する事が出来る
・Concatした方が精度が良い

この手法をPatch(くり抜いた画像の一部)にやるのではなくて、画像全体にやる手法に関して次は見ていきたい！

<h1>参考文献</h1>
Stereo Matching by Training a Convolutional Neural　Network to Compare Image Patches
https://arxiv.org/pdf/1510.05970.pdf
PyAutoGUIでは色の変化に気を付けよう

PyAutoGUIでチュートリアル通りに電卓を押させようとしたらうまくいかなかったのです。

よくよく見てみると画像の通り、Windows10の電卓は背景やフォーカスによって色が微妙に変わります（確認した限りでは2色。Windowsのテーマによってもっと違いがあるかもしれません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/d2488b42-d183-17d8-6850-530a06803595.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/be8dc76c-6743-a0c1-cbb8-8e56b58ef44e.png)

なので、以下のような感じでセカンドチャンスを与えてあげる必要があるみたいです。

```python:pyautogui_trial.py
try:
    pyautogui.click('calc_dark.png')
except TypeError as e:
    # 公式ドキュメントによると、画像にあたる部分が見つからなかった場合は別の例外がスローされるみたいだが、自環境だとTypeErrorがスローされる。
    pyautogui.click('calc_light.png')
```
netshでパケットキャプチャ 2

つづき

# 4回目

Windows Server 2016
C5.large (2コア,　Intel Platinum)

実行して

```
c:\tmp>netsh trace start capture=yes traceFile=C:\tmp\NetTrace.etl maxsize=1MB

トレース構成:
-------------------------------------------------------------------
ステータス:           実行中
トレース ファイル:    C:\tmp\NetTrace.etl
追加:                 オフ
循環:                 オン
最大サイズ:           1 MB
レポート:             オフ
```

終了かける

```
c:\tmp>netsh trace stop
トレースを関連付けています... 完了
トレースの結合中... 完了
データ収集を生成しています ... 完了
```

ここでCPU使用率が40%～70%台で2分間推移
Win10と変わらなかったか
仮想化されて性能下がってるとは言え、現行の最新世代でCPU良いインスタンスタイプなんだが..

2分後、以下が出力されてcabが生成される

```
トレース ファイルと追加のトラブルシューティング情報は、"C:\tmp\NetTrace.cab" としてコンパイルされました。
ファイルの場所 = C:\tmp\NetTrace.etl
トレース セッションは正常に停止しました。
```

うーん、netshでのキャプチャは終了時のデータ生成の負荷が高くて本番では使えないという結果に..

~~あとやはり生成されるetlはWireSharkではエラーで開けない~~ やり方があった。後述
ただ解析の仕方調べても結局負荷高くて実用性ないから調べなくていいか..
気が向いたらnetshの使用事例を調べてみようか
＞調べた

# WireSharkでの解析
https://github.com/microsoft/etl2pcapng/releases
から最新の (今だとv1.4.0) etl2pcapng.zipをDLする

etl2pcapng.zipを適当なフォルダに配置し、中にあるetl2pcapng,exeを利用してetlをpcapngに変換する

```
c:\tmp>C:\app\etl2pcapng\etl2pcapng.exe NetTrace.etl NetTrace.pcapng
IF: medium=eth  ID=0    IfIndex=3
Converted 830 frames
```

(VCRUNTIME140.dllがないエラーがでる場合)
https://visualstudio.microsoft.com/ja/downloads/
Visual Studio 2019 の Microsoft Visual C++ 再頒布可能パッケージ
の64bit用をDLしてインストールする

WireSharkでpcapngを開けば普通に解析できるようになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/936820/e1913229-0357-1261-e122-cde0f32b0854.png)

ネット上の情報だとnetshのキャプチャだと送信元IP、宛先IPが含まれてないって書いてあったけど、そんなことなく、送信元/宛先の、IPアドレス/ポート番号、他の情報も揃ってるように見える。
tmuxの使い方(個人用メモ)

最低限の労力でtmuxの恩恵を受けることを目指します。似たような記事はいくつかありますが、最低限のコマンドだけ集めました。

# 環境
Macです。ショートカットはMac準拠で書きます。

# tmuxを使う目的
リモートサーバーで重めの処理を回すときに、sshの接続を切っても裏で回ってほしいからです。他の用途もあるらしいですが、僕の場合はこれがメインです。

# tmuxで出来ること
## [terminal] 新規セッション開始
tmuxと打つだけです。新しいセッションが始まります。

```bash
$ tmux
```

## [terminal] セッション一覧の確認
セッション一覧を確認できます。ここから入りたいセッションがどれか確認します。

```bash
$  tmux ls
0: 1 windows (created Tue Dec  8 00:36:16 2020) [253x65]
```

## [terminal] セッションに入る
セッションに入ります。

```bash
$  tmux a
```

特定のセッションに入る場合はセッション一覧で確認した番号を指定します(一番右のやつ)

```bash
$  tmux a -t 0
```


## tmux内でのショートカット集
セッションからでます。tmux内でショートカットを打ちます。

```bash
# ショートカット
ctrl+b d
```

|ショートカット|説明|
|---|---|
| ctrl+b d | セッションから出る |
| ctrl+b [ | セッションでスクロールできるようにする |



# まとめ
これぐらいさえ知ってたらなんとかなります。
新しい機能を学んだら追記していきます。
金額入力のテキストボックスにカンマを表示する

#目次
1. はじめに
2. 実装方法
3. まとめ

#はじめに
アプリ上で金額を入力する場合に、カンマも同時に表示されていると見やすいです。
この記事では、数字を入力すると同時にカンマを表示する方法についてご説明したいと思います。

#実装方法
**①テキストボックスを設置する**
画面に金額を入力するためのキーボードを設置します。
Widgetはユーザーが入力できるよう、テキストボックスを使います。

このように設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/7ac2d8d5-dfee-73c3-89bc-b65469d98fb5.png)
この後の設定についてはこちらのURLをご参照ください。
＜iOSアプリの数字キーボードで完了ボタンを表示する＞
https://qiita.com/Kony_Team/items/4121c0a3ac76a00a681e

**②カンマを表示する**
今回は、金額入力と同時にカンマを表示したいので、
TextBox Widgetを選択した状態でアクションメニューを開き、
onTextChange アクションを使ってアクションを追加していきます。

onTextChange アクションは、文字を入力する度に呼び出されるアクションです。
その他にもこのようなアクションがあるので、活用してみてください。

| アクション名|　内容 |   
|:-----------------|:------------------|
|onTextChange|テキストボックスのテキストが変更されたときに呼び出されます|
|onDone|ユーザーがGoやDoneボタン等といった実行アクションを選択した時に呼び出されます|
|onTouchStart|ユーザーがテキストボックス上で入力した文字のフォーカス部分を移動させる等行った際に呼び出されます|
|onTouchMove|画像をフォトアルバムに保存できないとき、またはデータ保存エラーの場合に呼び出されます。|
|onTouchEnd|ユーザーが触れていたテキストボックスから離れた時に呼び出されます|

では、frmSampleControllerにonTextChangeアクションを設定していきます。

```frmSampleController.js
define({ 
  
  // カンマを表示
  setValueWithComma: function(){
    var value = this.view.txtMoney.text;
    this.view.txtMoney.text = this.putComma(value);
  },

  // カンマをセット
  putComma: function(num){
    num = num.toString().replace(/,/g, '');
    x = num.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1))
    x1 = x1.replace(rgx, '$1' + ',' + '$2');
    return x1 + x2;
  },
});
```

Controllerでアクションの作成が完了したら、
onTextChangeのアクションメニューでInvoke Functionを選択し、
setValueWithCommaを設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/5b9c94ec-af0c-8d7a-8506-8168054f87b6.png)
ここまでで、カンマを表示させる準備が完了しました。
次に実際にどうなるかみていきましょう！

**③実装の確認**
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/70auePczJy">pic.twitter.com/70auePczJy</a></p>&mdash; Kony (@Kony12763790) <a href="https://twitter.com/Kony12763790/status/1334343838110924801?ref_src=twsrc%5Etfw">December 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

テキストボックスで数字を入力するとカンマを含めた数字が表示できていますね！

#まとめ
今回は、TextBox内で数字を入力した時に数字と同時にカンマをつける方法を説明しました。
金額を使ったアプリを開発する際に必要となる場合があるかと思います。
ぜひ試してみてください:wave:


#参考
TextBox Widgetの説明: 
https://docs.kony.com/konyonpremises/Subsystems/Widget_User_Guide/Content/TextBox_Events.htm

TextBoxの設定の説明：
＜iOSアプリの数字キーボードで完了ボタンを表示する＞
https://qiita.com/Kony_Team/items/4121c0a3ac76a00a681e
Wikidata dumpでかすぎる問題

# 背景
## SPARQL 動かない
研究で先行研究に合わせてwikidataを使うことになった。
https://query.wikidata.org/ にあるwebapiで sparqlっていうSQLっぽい言語で情報取得できるらしい。
全ての人名を取得するには...どうやらこれで取得できそう...

```sparql
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX wd: <http://www.wikidata.org/entity/> 
select  DISTINCT ?item
where {
        ?item wdt:P31/wdt:P279* wd:Q215627 .
        ?item rdfs:label ?itemlabel .  
}
```

じゃ、もうちょっとクエリを分けて飛ばしてみるにしても概算で71日かかる...
でも人様のサーバーだし、処理並列化できないしどうしよう...

## wikidata dump
そこでwikidata dump (https://dumps.wikimedia.org/wikidatawiki/entities/) 使う
ダウンロードに10時間ぐらいかかってる...よく見たら約100GBもある...
これ、単純に ```cat & grep``` しても、一周5時間かかる...え？
こんなのどうすればいいんだ...

## wiki-base-dump-filterを使う
### Node.js を インストール
研究室サーバーのため sudo 権限がないので、 linux brew 経由で、Node.js を インストール
https://qiita.com/jigengineer/items/a7da86e8b4d4e3471656#%E8%A3%9C%E8%B6%B3linux%E5%90%91%E3%81%91

```sh
brew install nodenv
```
https://nodejs.org/ja/download/releases/ をみると Node.js 15 系のリリースは最近らしいし、一つ昔の14 の Node.js 14.15.1　をインストールする

```sh
nodenv install 14.15.1
echo "export PATH=~/.nodenv/shims:\$PATH" >> ~/.profile
nodenv global 14.15.1
```
install先から shims フォルダの位置がわかったので、環境変数を通しておく。
### wikibase-dump-filter のインストール
wikibase-dump-filter の README.md に従い

```sh
npm install -g wikibase-dump-filter
PATH=~/.nodenv/versions/14.15.1/bin:$PATH
```

でインストール
(```~/.nodenv/shims``` にはなぜか```wiki-base-dump-filter``` が置かれないので、 
```~/.nodenv/versions/14.15.1/bin``` にパスを通しておく (Node.jsと違ってこっちは一時的な使用にしておく))
### wikibase-dump-filter を使ってみる
```sh
cat wikidata-20201130-all.json | wikibase-dump-filter --claim 'P31:Q571&P50' --languages ja | head > books_with_an_author.ndjson
```

## 次回
VirtuosoというSPARQLサーバーを使って、
DBPedia読み込んだ方が上手くできることが判明
(そのうち書く)
【PHP】PHP7でも「名前付き引数」を使いたくて作ってみた

使う場面はなかなかないだろうけれど、やっつけしてみた

```
<?php
class Hoge
{
    public function __call($name, $arguments)
    {
        $funcRef = new ReflectionMethod($this, $name);
        $parameters = $funcRef->getParameters();
        
        $createNewArguments = false;
        
        if (count($arguments) == 1) {
            if (count($parameters) == 1 && isset($arguments[0][$parameters[0]->name])) {
                $createNewArguments = true;
            } elseif (count($parameters) != 1) {
                $createNewArguments = true;
            }
        }
        
        if ($createNewArguments) {
            $arguments = $arguments[0];
            foreach ($parameters as $param) {
                if (isset($arguments[$param->name])) {
                    $newArgs[] = $arguments[$param->name];
                } else {
                    var_dump($param->isDefaultValueAvailable());
                    if ($param->isDefaultValueAvailable()) {
                        $newArgs[] = $param->getDefaultValue();
                    } else {
                        throw new Exception('引数$'.$param->name.'が定義されていません');
                    }
                }
            }
            call_user_func_array([$this, $name], $newArgs);
        } else {
            call_user_func_array([$this, $name], $arguments);
        }
    }
    
    protected function test($a, $b = 'test', $c)
    {
        var_dump([
            'a' => $a,
            'b' => $b,
            'c' => $c,
        ]);
    }
}

$class = new Hoge();
$class->test([
//    'b' => 'bbb',
    'a' => 'aaa',
    'c' => 'ccc',
]);

$class->test('123', '234', '345');

```