OmniAICreator/Qiita-1.07M huggingface dataset:
障がい故に情報を受け取ることが困難な方に的確に情報を伝えるために、Webエンジニアができること

2020年CivicTechテック好きアドベントカレンダー5日目です。
私のcivictech活動は、障がいのある方に向けた活動を主に行っています。

近年、webによって様々な情報が発信されるようになりました。 一方で抱えてしまった障がいによって、そうした情報を受け取ることができないことが生じる場合もあります。このような障害をなくしていく上で、作り手ができることを考えていきましょう。

##情報を受け取ることが困難な方

抱えている障がいによって、web上で表示される情報を受け取ることが、困難な方々がおります。

###・視覚に障がいがある方
こうした方々は、「スクリーンリーダー」と言った機能を用いて、パソコンやスマートフォンのwebをご覧になっています。スクリーンリーダーは、テキストを読むことはできますが、画像を認識することができません。一般の対応方法には、イメージに`alt`属性を持たせて画像について、説明を加えることがあります。

###・理解に限界がある方
知的障がいとも分けられることもありますが、程度によってはweb閲覧ができ、自分の関心のある分野のWebをご覧になってる方もおられます。こうした方々の困難な点として、言葉は知っていても感じが止めにくい、言葉自体も知らないというケースが生じます。

私はこうした方々を「真の情報弱者」と思っております。
>本来の情報弱者とは
>情報環境が良くない場所に住んでいたり、情報リテラシーやメディアリテラシーに関する知識や能力が十分でないために、放送やインターネット等から必要な情報を享受できていない人。 (Wikipediaより)

特定の分野におけるwebサービスならば、未対応でも許されるケースが仮にあっても、生活に関わる情報や命に関わる情報であればそこに「障害」を生じさせてしまうことは作り手として避けていかなければなりません

情報を受け取ることが困難な方にも的確に情報を渡していく

では、こうした「真の情報弱者」の方々に的確に情報を渡すために、作り手はどんな工夫ができるでしょうか？
私は自分で取り組んでいるプロジクトにおいて、次の工夫をしてみました。

####・視覚に障がいがある方に向けて
テキストと、イメージの`alt`属性は確かにスクリーンリーダーで読み込むことはできますが、さらにもう一夫工夫してみました。
こうした多目的トイレの情報が表示されるとしましょう。
![q1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208025/5bba77df-1986-0577-4716-631ab6f587b7.png)
（店舗名など、個人の情報は伏せております）
この「i」という表示は、イメージです。なので`alt`属性を持たせることができます。私はそのalt属性にモーダルにある全ての情報を書き込んでしました。スクリーンリーダー特徴として、左上から右下に画面を読んでいきますので、必要な情報を受け取れば、スクリーンリーダーが余計なところを読まずに戻ることができるかもしれません。

####・理解に限界がある方に向けて
個人個人の理解の度合いを考えることは、難しいですがすぐにできることとして、漢字に読み仮名を振ることができるでしょう。漢字に読み仮名を振るためには`html`のタグ`<ruby>`で対応することができます。
次のように書くことができます。

```sample.html
<p><ruby><rb>漢字</rb><rp>(</rp><rt>かんじ</rt><rp>)</rp></ruby>に<ruby><rb>読</rb><rp>(</rp><rt>よ</rt><rp>)</rp></ruby>み<ruby><rb>仮名</rb><rp>(</rp><rt>がな</rt><rp>)</rp></ruby>を<ruby><rb>振</rb><rp>(</rp><rt>ふ</rt><rp>)</rp></ruby>りましょう</p>
```
以下のような表示になります。
![q2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208025/b6d255ce-ffba-5688-0856-1920a4999aec.png)

書き方としては、`<p><ruby><rb>漢字</rb><rp>(</rp><rt>かんじ</rt><rp>)</rp></ruby>`の1つセットで用意すすることができます。加えて、下記のサイトのツールを用いるなら、自動で読み仮名を振ることができます。

#####参照：ふりがな（ルビ）振りツール
https://www.drk7.jp/pub/tools/YahooRuby/index.cgi

加えて、理解に限界がある方の中には、言葉を知らないケースがあります。こうしたケースに対応するためには、表現を工夫する必要があるかもしれません。私達は成長するにつれて難しい表現を当たり前のように用いています。しかし、そこに一旦疑問を持って当事者がここの表現を理解できるか考えて見ましょう。

##最後に

私達は、障がい故に情報を受け取れない方の気持ちや見方を１００％理解することは難しいところがあります。しかし、当事者の目線で考えていくこと、当事者のご意見を伺い、参考にし開発を進めることはできます。大切な事は、当事者と目線を共有していくことかもしれません。公共の情報を伝える際にこうした点を参考にしていただければ、幸いです。（1人の障害を持つ者からのお願いです）
varsに潜む罠

# やりたいこと

`my_date`に時刻を格納して一意のキーとして利用としたい。
だが！
以下のように `my_date`の定義方法(`vars`か`set_fact`)次第で挙動が異なっていたので、紹介したいと思います。
ちなみにvarsのみならず、**group_vars、host_vars、vars_filesも同様な挙動**を確認しています。
シーンによっては再帰的に利用できていいかもしれない。

```yaml:vars_my_date.yml
- name: Test playbook
  hosts: localhost
  connection: local
  gather_facts: False
  vars:
    # 時間を取得
    my_date: "{{ lookup('pipe', 'date +%s') }}"
  tasks:
    - debug: msg="{{ my_date }}"
    - pause: seconds=5
    - debug: msg="{{ my_date }}"
```

1回目（`1606815454`）と2回目（`1606815459`）の実行結果で`pause`の5秒があります。
つまり、代入した`my_date`を呼び出すたびにその値を再評価している動きになっています。

```shell:実行結果
TASK [debug] ********************************
Tuesday 01 December 2020  18:37:34 +0900 (0:00:00.120)       0:00:00.120 ****** 
ok: [localhost] => {
    "msg": "1606815454"
}

TASK [pause] ********************************
Tuesday 01 December 2020  18:37:34 +0900 (0:00:00.037)       0:00:00.157 ****** 
Pausing for 5 seconds
(ctrl+C then 'C' = continue early, ctrl+C then 'A' = abort)
ok: [localhost]

TASK [debug] ********************************
Tuesday 01 December 2020  18:37:39 +0900 (0:00:05.013)       0:00:05.171 ****** 
ok: [localhost] => {
    "msg": "1606815459"
}
```

set_factで定義したらどうなるか？

```yaml:set_fact_my_date.yml
- name: Test playbook
  hosts: localhost
  connection: local
  gather_facts: False
  tasks:
    - set_fact:
        my_date: "{{ lookup('pipe', 'date +%s') }}"

    - debug: msg="{{ my_date }}"
    - pause: seconds=5
    - debug: msg="{{ my_date }}"
```

1、2回目の実行結果は`1606815486`であり、変わっていないことがわかります。

```shell:実行結果

TASK [debug] ********************************
Tuesday 01 December 2020  18:38:07 +0900 (0:00:00.038)       0:00:00.160 ****** 
ok: [localhost] => {
    "msg": "1606815486"
}

TASK [pause] ********************************
Tuesday 01 December 2020  18:38:07 +0900 (0:00:00.028)       0:00:00.188 ****** 
Pausing for 5 seconds
(ctrl+C then 'C' = continue early, ctrl+C then 'A' = abort)
ok: [localhost]

TASK [debug] ********************************
Tuesday 01 December 2020  18:38:12 +0900 (0:00:05.014)       0:00:05.203 ****** 
ok: [localhost] => {
    "msg": "1606815486"
}
```
【メモ】リーダブルコードを読んで

* 製造業出身のデータサイエンティストがお送りする記事
* 今回は自分のメモとして記事に残しておきます。

##はじめに
今回はリーダブルコードを読んで自分用のメモとして書きます。

##理解しやすいコード
* コードは理解しやすくなければいけない
* コードは他の人が最短時間で理解できるように書かなければいけない
* コードは理解するのにかかる時間を短くすることが大切

##名前に情報を詰め込む
* 明確な単語を選ぶ
* 具体的な名前を使う
* （理由がなければ）汎用的な名前を避ける
* 大文字やアンダースコアなどに意味を含める
* 接頭辞や接尾辞を活用して情報を追加する

##誤解されない名前を使う
* 名前が他の意味と間違えらえることはないか自問自答する
* 誤解されない名前の例

|種類|例|
|:---|:---|
|限界値|max, min|
|ブール値|is, has|
|包含的範囲|first, last|

##美しさ
* 読み手が慣れているパターンと一貫性のあるレイアウトを使う
* 似ているコードは似ているように見せる
* 関連するコードは纏めてブロックにする
* 意味のある順番を選んで常にその順番を守る
* 空行を使って大きなブロックを論理的な段落に分ける

##コメントすべきことを見極める
* コメントの目的は読み手に書き手の意図を知らせることである
* コードから分かることはコメントしない
* コードが何故このやり方なのかを
* 定数の値にまつわる背景を記載
* コードの欠陥をTODO: ×××：を使って示す
* 一般的な読み手が驚くような動作はコメントする
* ファイルやクラスには全体像を書いておく
* コードブロックにコメントをつけて概要を纏めておくことで、読み手が細部に捕らわれないようにする

##コメントは正確で簡潔に書く
* 関数の動作はできるだけ正確に書く
* コメントに含める入出力例は適切に選ぶ
* コードの意図は高レベルで書く
* 多くの意味が詰め込まれた言葉や表現を使ってコメントを簡潔に保つ
* 分かりにくい引数にはインラインコメントを使う

##制御フローを読みやすくする
* 比較する際は変化する方の値を左、より安定した値を右に書く
* if、else文は肯定、単純、目立つものを先に処理する
* 深いネストは集中して読む必要があるので、直線的なコードを選択する
* ガード節を使用してネストを削除したり、クリーンにする

##巨大な式を分割する
* 説明変数を導入する
* ド・モルガンの法則を使う

##変数と読みやすさを考慮する
* 不要な変数は削除する
* 一度だけ書き込む変数を使う
* 変数スコープはできるだけ小さくする

##無関係な下位問題を抽出する
* 一般的な問題を解決するライブラリーを作っていくことで核だけが残る
* プロジェクト固有のコードから汎用コードを分離していく

##一度に1つのことを行う
* コードは一つずつタスクを行うようにする
* 読みにくいコードがあったら、そのタスクを全て列挙し、別の関数やクラスに分類する

##短いコードを書く
* 汎用的なコードを作って重複を避ける
* 未使用なコードや無用な機能を削除する
* コードの重量を意識し、軽量で機敏にしておく
* 不必要な機能をプロダクトから削除し、過剰な機能は持たせない
* 最も簡単に問題を解決できるような要求を考える

##テストと読みやすさ
* 他のプログラマーが安心してテストの追加や変更ができるようにテストコードを読みやすくする
* テストのトップレベルはできるだけ簡潔にする
* テストが失敗したらバグの発見や修正がしやすいようなエラーメッセージを表示する
* テストに最も有効で単純な入力値を使う
* テスト関数に説明的な名前をつけて何のテストを行っているのかを明らかにする
リーダブルコード 1章 理解しやすいコード

> 　読みやすいコードを書くのに「面白い」ことをする必要はない。いい名前をつける。適切なコメントを書く。意味のある単位に分割する。キレイに整形する。こうした基本的なことを着実にやればいい。このことを丁寧に説明してくれるのが本書である。
（「訳者まえがき」より）

**「本書の目的は、君のコードをよくすることだ。」**（「はじめに」より）

勤務先のCTOから「これを読むように」と本棚から手渡されたのが本書。

**「本書は楽しく気楽に読んでもらいたい。できれば１〜２週間で読んで欲しい。」**（「はじめに」より）

楽しく気楽に読めるかは定かでないが、２週間以内には１周目を読み終えたい。

本書の1章のサマリーをまとめていく。

# 1.1 「優れた」コードって何？

コードを書くうえでいちばん大切な原則は、

**「コードは理解しやすくなければならない。」**

プログラマは直感でプログラミングのことを決めていることが多いが、**「簡潔」**なコードと**「安心」**なコードではどちらが大切なんだろうか？

ここでいう**「簡潔」**なコードと**「安心」**なコードは以下のようなものだ。

```c:C
/* 簡潔 */

return exponent >= 0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);
```

```c:C
/* 安心 */

if (exponent >= 0) {
  return mantissa * (1 << exponent);
} else {
  return mantissa / (1 << exponent);
}
```

# 1.2 読みやすさの基本定理

### 「コードは他の人が最短時間で理解できるように書かなければいけない」

「コードを理解する」というのは、
・変更を加えたり
・バグを見つけたり
できるという意味。

他のコードと連携する方法も理解しておかなければいけない。

「他の人」とは
・6ヶ月後の君自身
・君のプロジェクトに途中から参加する人
・他のプロジェクトで再利用する人

# 1.3 小さなことは絶対にいいこと？

コードは短くした方がいい。ただし、理解するまでにかかる時間を最短にするためには、
・行を分ける
・コメントをつける
方が大切。

# 1.4 「理解するまでにかかる時間」は競合する？

高度に最適化されたコードであっても、もっと理解しやすくできる。
理解しやすいコードは優れた設計やテストのしやすさに繋がることが多い。

常に一歩下がって、**「このコードは理解しやすいだろうか？」**と自問自答することが大切。

# 1.5 でもやるんだよ

想像上の誰かが自分のコードを理解しやすいかなんて考えるのは大変だが、
**これまでとは違う脳味噌を回転させなきゃいけない！**

#  本書を購入したい方は

[Amazonリンク](https://www.amazon.co.jp/リーダブルコード-―より良いコードを書くためのシンプルで実践的なテクニック-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?__mk_ja_JP=カタカナ&crid=FYD1CNVHVQW6&dchild=1&keywords=リーダブルコード+より良いコードを書くためのシンプルで実践的なテクニック&qid=1607004373&sprefix=リーダブル%2Caps%2C384&sr=8-1)
Qtで行う標準Cライブラリを直接使わない演算処理

こんばんは、[Qt Advent Calendar 2020](https://qiita.com/advent-calendar/2020/qt)の 3日目の記事です。
小ネタです。

CやC++を使用している時に、浮動小数点の比較や各種演算を行う場合、標準Cライブラリであるfloat.hやmath.hを使用しますよね。
Qｔを使用しているのにその時のクセで同じように書いてしまうことってありますよね…ありませんか？
コンパイラにmsvcを使用している時はそのままビルドを通すことができますが、MinGWやEmscriptenではfloat.hやmath.hが使用できません。
そんな時の対処法です。

# 一般的な数学関数
```
#include <math.h>
{
    double result = std::pow(2.0,2.0);
}
```
```
#include <QtMath>
{
    double result = qPow(2.0,2.0);
}
```

結果はどちらも4になります。
qPowは中でstd::powを呼んでいます。最初記事のタイトルを「Qtで行う標準Cライブラリに頼らない演算処理」にしていたんですが、書いていて頼っているなと思いタイトルを変更しました。

[QtMath](https://doc.qt.io/qt-5/qtmath.html)はqmath.hをインクルードしており、qmath.hはcmathを、cmathはmath.hをインクルードしています。
math.hの主要な演算関数はqmath.h内でq〇〇という名前で実装されています。

# 浮動小数点数の比較
```
#include <float.h>
#include <math.h>
{
    double a = 1.0, b = 1.0;
    b += 0.001;
    b -= 0.001; // 誤差発生
    bool result1 = std::fabs(a - b) <= DBL_EPSILON;
}
```
```
#include <QtGlobal>
#include <QtMath>
{
    double a = 1.0, b = 1.0;
    b += 0.001;
    b -= 0.001; // 誤差発生
    bool result2 = qFuzzyCompare(a,b);
}
```
結果はどちらもtrueになります。
qFuzzyCompareは浮動小数点数の比較関数です。
ただ、[QtGlobal](https://doc.qt.io/qt-5/qtglobal.html)のリファレンスに書いてある通り厳密な比較ではないですし、注意書きもいくつかあるので、自分の必要な精度の処理かは適宜調べてから使用していください。


# 事の発端

普段msvcを使用していて、WebAssemblyを使用してアプリを移植しようとしている時にコンパイラが~~MinGW~~Emscriptenになり発覚しました。
通常はMinGWをコンパイラに使用することが多いでしょうし、本来最初の方に発覚することでしょうか？

#追記
正確には、
・msvcは標準Cライブラリをインクルードしなくても使用可
・MinGWは標準Cライブラリをインクルードすれば使用可
・Emscriptenは標準Cライブラリはインクルード不可
でした。
【FileMaker】ショートカットからFileMaker Goのファイルを開くときの設定

[先日ご紹介した](https://qiita.com/tyuma/items/4a08cb29daccfa2dba42)、FileMaker GoとiOSのショートカットのオートメーションなどを利用する際にセキュリティ設定をチラッと書きましたが、こちらでまとめて書いておきます。

# ３つの設定

## 1.拡張アクセス権の設定
[前回](https://qiita.com/tyuma/items/4a08cb29daccfa2dba42)の記事にあるように、管理→セキュリティにある拡張アクセス権で、fmurlscriptを追加します。
やり方は、前回の記事を参考にしてください。

## 2.アクセスするアカウントを限定する
Adminでアクセスするのはセキュリティ上とんでもないことなので、fmurlscriptを与えたアクセス権セットでアカウントを作成します。
今回は、user1というアカウントを作り、fmurlscript権限を付与した閲覧のみアクセスを割り当てています。
![スクリーンショット 2020-12-03 22.50.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/51df15b1-a781-e5b9-7357-11adec32ee2a.png)

## 3.ファイルをパスワード付きで開くようにする
ファイルオプションで、「次のアカウントを使用してログイン」のチェックを外します。
このチェックがついていると、指定されたアカウントで自動で開いてしまい、これまたセキュリティ的に問題です。
![スクリーンショット 2020-12-03 22.35.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/725da1de-2f5a-3b74-45af-c394a6880570.png)

ここまでの設定で、ショートカットでファイルを開くときにアカウント要求がされます。
3の設定は、ショートカットは関係なく通常のFileMakerファイルを開くときのセキュリティ設定になりますので、おなじみですね。

# アクセスしてみる
では、ショートカットのオートメーションからアクセスしてみましょう。
![IMG_3304.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/7d42a1c5-f192-7f6a-57c9-66adfc31fb38.png)
いいですね！
これで外部からのファイルオープンでのセキュリティが高まりました。
昨今は思わぬ経路から個人情報が流出してしまうニュースを耳にしますので、横着せずにセキュリティ設定は細かく設定してくださいね。
今日からPythonエンジニアになろう


# はじめに
この記事は「Python勉強したいな」という方向けに圧倒的初心者の自分が「Python3の開発環境構築をVScodeで実現する」過程を先人の知恵をかりながら（**他力本願で**）解説したものになります。<br>記事を見ながら一緒に環境構築してみましょう！！<br>今回は[Anaconda](https://techacademy.jp/magazine/15703)を使ってPython3のインストールとVScodeでの軽い設定を行っていきたい思います。ちなみにAnacondaはPythonでよく使われるライブラリを最初からまとめたくれたものになります。


# 開発環境
Python3.8

# 手順

## 1.Anacondaのインストール
[Python3環境構築](https://ai-inter1.com/python-install/#AN2)を参考にAnacondaのインストールを行っていきます。
以下をクリックしてホームページに飛びます。
[Anaconda](https://www.anaconda.com/download/)

下の方にスクロールするとOSの選択画面があるので、任意のOSを選択しましょう。
![スクリーンショット 2020-12-03 20.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714305/9bfe92e1-91d1-43bb-2624-2de67b32ffa7.png)

細かい部分は以下を参照してください。(TechAcademyで学びましょう！！！）
[より効率よく開発できる！AnacondaでPythonの環境を構築する方法](https://techacademy.jp/magazine/15703)


インストールできましたか？
では、次にいきましょう。
## 2. VScodeで開発環境構築
インストールができたら、実際にお手元のVScodeで開発環境を作っていきます。
VScodeの入れ方わからない人は下記を参照してください。
[【ゼロから！】Visual Studio Codeのインストールと使い方](https://eng-entrance.com/texteditor-vscode)

さて、VScodeがインストールできたら画像の画面でpythonの拡張機能をインストールしましょう。(画像はすでにインストールした状態です。）
![スクリーンショット 2020-12-03 22.19.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714305/72444da8-2cc8-030b-5741-a5101d1a3632.png)

さらに最近リリースされた拡張機能のPylanceもなかなか使えるみたいです！気になった方は是非！
[[Python]PylanceのVS Code拡張機能をさっそく使ってみた。](https://qiita.com/simonritchie/items/33ca57cdb5cb2a12ae16?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items)

ここまでできればあとはpy拡張子のファイルを作って、ガリガリコードを書いていくのみです！
お疲れ様でした！！

## 3.Pythonってどんなことができるの？
　Pythonでは本当にいろいろなことができるみたいです。一般的なWebアプリケーションの作成はもちろん、データの処理や分析、自動収集など多岐に渡ります！
有名どこで言えば、InstagramやDropboxはPythonで作成されているみたいです！
自分もこれから大学でpythonやRを使ってデータ収集などやると思うので、ガシガシ使っていきたいです！
だいぶ端折ったとこや、説明不足なところあると思いますが、今回はこの辺で！！
enebular editorのflows_cred.jsonを取得する

[enebular Advent Calendar 2020](https://qiita.com/advent-calendar/2020/enebular)の5日目を担当します、ニアムギです。
今回はenebular editorにて編集しているフローの、flows_cred.json(資格情報が記載されているjsonファイル)がどこにあるか紹介したいと思います。

# 結論から

Windows環境の場合、以下のフォルダに入っています。

```
C:\Users\[ユーザー名]\AppData\Local\Programs\enebular-editor\resources\app\node-red
```  

Mac環境については手元にないので分からないのですが、おそらく似たようなフォルダ構成になっていると思われます。

![editor_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237144/c16bf9ab-2691-6b2d-eee2-9dbc80da6680.png)

# 経緯

以下のようにenebular editor上でもフローをダウンロード出来る機能はあります。
![editor_0_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237144/8eebdc68-925f-b755-d950-5f8c81a3266c.png)
![editor_0_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237144/64985879-f73a-1f57-0fb5-41d79da67c96.png)

しかしながらこの方法ではflows.json(フローが記載されているjsonファイル)は取得出来てもflows_cred.jsonは取得出来ません。
ラズパイやHerokuなど、enebularからスムーズにデプロイ出来る場合は気にしなくて良いのですが、それ以外のケースだったためflows_cred.jsonの居場所を探してみました。


# 更新タイミングに注意

1点だけ。ファイルの更新タイミングに注意が必要です。

* enebular editorを立ち上げた時　→　ファイルは初期化されます
* ダッシュボードからフローの編集画面に移行したとき　→　flows.jsonとflows_cred.jsonが更新されます
* 編集してデプロイボタンを押したとき　→　**flows.jsonとflows_cred.jsonは更新されません！**

つまり編集した最新のファイルを取得したい場合は、一度ダッシュボードに戻ってから編集画面を開きなおします。
ここだけ注意すれば問題ありません。

---

今回小ネタになってしまったのですが、参考になれば幸いです。
ではでは。
【Swift】コレクションについて〜辞書〜

#辞書 とは
辞書とは、**Dictionary\<Key, Value>型**という**キーと値のペアを持つコレクション**になります。
このコレクションは、キーを元に値にアクセスする用途で使用します。

Array\<Element>型と同様に、Dictionary\<Key, Value>型のKeyとValueは、
プレースホルダ型となっております。

実際には**Dictionary\<String, Int>型**のように
Key型とValue型に具体的な型を指定して使用します。

記述の方法は、Array\<Element>型と似た感じで、`[Key: Value]`の形で記述します。

また、カンマで区切ることによって、
配列のように複数のキーと値を変数や定数に入れることができます。

```swift

let dictonary = ["a": 1, "b": 2]
```

辞書にも型推論があり、今回の場合ですと`[String: Int]型`になります。

要素が一つも存在しない場合や、キーや値に複数の方が混在する場合には、
型推論ができないことがあります。

そういった場合は、明示的に型を宣言する必要があります。

```swift

let dictionary: [String: Int] = [:]   // 空の辞書
```

###KeyとValueに入れれる型

配列の場合はどんな型でも配列を作ることができましたが、
Dictionary\<Key, Value>型の場合は少し制限があります。

Key型には型の制限が存在し、Key型に入れることができる型は、
**Hashableプロトコルに準拠している型でないといけない**らしいです。
私も記事を書くまで知りませんでした・・・。

Hashableプロトコルに準拠している型はString型やInt型があります。
~~例えば、String型の値"a"のハッシュ値は4799450059485595655、
Int型の値１のハッシュ値は１らしいです。~~
現在は実行ごとに異なるハッシュ値が適用されるらしいです。　


ハッシュ値を特定の形でプログラムが理解できないと、
どの値を取り出せばいいのかわからなくなるからでしょうか。

一方で、Value型には型の制限が存在しません。
なのでこの様な辞書も作成できます。

```swift

// [String, [Int]]型   教科(キー)と点数の配列(値)の辞書
let a = ["math": [50, 33, 13, 100], "English": [91, 80, 22, 12]]   
```

他にも、`[String: [String: Int]]型`なども作ることも可能です。
こんなの作るとややこしそうですね(笑)

当たり前ですが、明示的に宣言された型と異なる型を代入するとコンパイルエラーになります。

一つ目は、Value型がInt型なのに、String型が代入されてエラー
二つ目は、Key型がString型なのに、Int型が代入されてエラー

```swift

let a: [String: Int] = ["a": "b"]   // コンパイルエラー
let b: [String: Int] = [1: 2]   // コンパイルエラー   
```

##Dictionary\<Key, Value>型の操作

値へのアクセス方法は配列と似ており、サブスクリプトを使い値を取り出します。

配列の場合は、サブスクリプトの引数にインデックスを指定していましたが、
辞書の場合は、サブスクリプトの引数にKey値を指定します。

```swift

let dictionary = ["key": 1]   // [String: Int]型
let value = dictionary["key"]   // Optional(1)
```

Dictionary\<Key,Value>型は、Array\<Element>型と違い、
**存在しない値にアクセスしても実行時エラーにはならずnilが返ります。**

そのため、値が存在したとしても返ってくる型はOptional\<Weapped>型になります。

###値の更新、追加、削除

Dictionary\<Key,Value>型の値の更新、追加、削除にもサブスクリプトを使用します。
サブスクリプトの引数にKey型の値を指定し、代入演算子を用いて変更を行います。

```swift

// 更新
let dictionary1 = ["key": 1]
dictionary1["key"] = 2
dictionary1   // ["key": 2]

// 追加
let dictionary2 = ["key1": 1]
dictionary2["key2"] = 2
dictionary2   // ["key1": 1, "key2": 2]

// 削除
let dictionary3 = ["key": 1]
dictionary3["key"] = nil
dictionary3   // [:]
```

配列ではいろいろなメソッドを使用しましたが、
辞書では、代入演算子で全て解決できるので楽ですね！

以上、最後までご覧いただきありがとうございました。
APN Ambassadorってなんだ？

Japan APN Ambassador Advent Calendar 2020　が、APN Ambassadorの皆様が著者になり始まりました！　3日目の本日は、そもそも APN Ambassadorってなんだ？を説明させて頂きたく思います。

##自己紹介
Amazon Web Services Japanで パートナーアライアンス統括本部　テクニカルイネーブルメント部　にて PSA（Partner Solutions Architect） のマネージャーをしている相澤と申します。元々外資系コンピューターメーカのプリセールスエンジニアをしており、データベースやDWHを担当しておりました。AWSに入社後にオンプレミス脳だった自分自身がクラウド脳になった、その感動体験を世の中に広めたいという思いがありテクニカルイネーブルメント部という部署を2017年に立ち上げまして、現在に至っております。我々のチームではAWSのパートナー様、その中でも主にシステムイングレーターのエンジニアのサポートをさせて頂いております。

投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

##APN Ambassadorとは？
APNとはAWS Partner Networkの略称です。　APN Ambassador Programとは世界中のAPN Consulting Partnerから卓越した技術力を持ち、社外への情報発信（セミナーでの発信、Blogや書籍での発信）をしているメンバーが、日本のみならず世界中のAPNパートナーの中から選出されるProgramです。そのProgramにより選出されたエンジニアの皆様がAPN Ambassadorとなります。APN Ambassadorの皆様はAWSの技術に明るだけでなく、豊富なバックグラウンドをお持ちの方々ばかりで私も一緒に仕事をさせていただく中で多くのことを学ばさせて頂いております。
2019年から選出をさせて頂いており、2019年はこちらの[Blog](https://aws.amazon.com/jp/blogs/psa/japan-apn-ambassador-2019/)、2020年はこちらの[Blog](https://aws.amazon.com/jp/blogs/psa/japan-apn-ambassador-2020-awards/)にて発表をさせていただきました。現在、国内では20名のエンジニアの方が、Japan APN Ambassadorとして活躍されおり、今回その20名＆勇退した2名（各パートナーから最大2名の選出というルールに従い、20年度のAPN Ambassdorからは、Classmethod社の佐々木さん、菊池さんは勇退されました。）にてAdvent Calendarを実施いただくこととなり、大変嬉しく、感激しております。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145392/d725519d-2848-0b9b-ab57-69dc0bbfe72d.png" width=50%>


##オススメの勉強法
私からは、簡単ですがオススメのAWSの勉強法を共有させてください。多くのパートナー様と話す中で、エンジニアの方からオススメの勉強法は？という質問をよく受けます。インフラに強いエンジニア、プログラミングが得意なエンジニア、新卒のエンジニアなど、一言でエンジニアといっても色々な状況があると思います。私が、成長著しいなと思うエンジニアの特徴は共通していて、ズバリ**「手を動かす、試してみる」**を実践している方になります。もし、オススメの勉強法を探している方がいましたら、すぐに触ってみることができるのがクラウドの良いところですので、手を動かすということにチャレンジしてみてください。何をしたらいいのか？ ですが、周りの先輩エンジニアなどにオススメのサイトなどを聞くのも良いですし、迷われたら是非こちら、 [実際に手を動かして学ぶ！AWS Hands-on for Beginners](https://aws.amazon.com/jp/blogs/news/aws-hands-on-for-beginners-01/) をオススメします。こちらのハンズオンは、Webページ上で、「こんにちは」とInputしたら、「Hello」という翻訳されたOutputが表示される、簡易翻訳サイトを動画をみながら自分のペースで構築できます。このハンズオンはシリーズになっており、今後も多くのハンズオンがリリース予定です。早い方で２時間程度、ゆっくりでも半日あれば翻訳サイトが出来上がります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145392/027088cd-9463-d5b4-5462-2b4290908a8b.png" width=100%>


##今後の抱負
2019年度は、AWS Summit Tokyoの会場でAPN Ambassadorの発表させていただきましたが、その時にプログラムオーナーの意気込みとして、**「Go Global」**を締めの言葉に使いました。日本国内のみならず、日本のエンジニアが世界で活躍できるようなサポートをさせてください！とプログラムオーナーとして所信表明をしたわけですが、まだまだそのサポートも道半ばでございます。**「Beyond Japan, Go Global」**を私のチームの2021年のミッションステートメントとして活動していきたいと思いますので、今後ともどうぞよろしくお願いします。
APN Ambassadorの皆様のAdvent Calendarが楽しみでなりません！！！
【2021/01/31迄：更新予定】全国のITを学べる"就労継続支援B型"事業所

（※2020/12/31：来年1月末までの宿題にしたいと思います、大変すみません）

#就労継続支援B型事業所とは
就労移行支援事業所等を利用したが、一般企業等の雇用に結びつかない方が、事業所内で工賃を貰いながら就労のOJTや実務を経験する為の施設・サービスです。


##就労移行支援事業所との違い

###メリット
・額は少ないが、作業に応じて工賃が支給される
###デメリット
・作業が必ずしも希望するITスキル等を修得出来るものに即した内容とは限らない場合がある
・企業への就労を目指す場合にはあまり都合が良くない？
・雇用契約を結ばない形式の仕事になる　→　あまり利用者当人のキャリアに寄与しない

##事業所一覧
（※随時更新予定）
###GFTD.WORKS
運営：Gftd Works 株式会社
https://gftd.works/
事業所所在地：東京（早稲田）・愛知（名古屋／蒲郡／東海）・大分・福岡（※休止中）
OSを自作してみた!

#OSを自作してみた
最近寒すぎてマジで凍死しそうなdangomushiです。マジで寒い。
どうにかならんかね、、、

#自作とは（哲学）

まず、この記事は

- 完全に自分で作ったOSではないこと

- まだまだ改善の余地があること

- 中学生が作ったこと

の前提を踏まえたものとなります。また、コードとファイルが多いため
サンプルコードはございません。Githubに上げたら追記します。製作期間は１か月ちょっとくらいです。

# OSについて

今回自作したOSは、自作好きなら誰しも読むであろう「OS自作入門」をよんで作ったものです。
その関係で、メインの関数やその他諸々名前がそのままのところがあります。
しかも私自身まだ完全に理解したわけではないのであんまり偉そうなことが言えないです。
できることは、今のところ

- ファイル一覧
- ファイルを開く
- メモリ量の表示
- 自作言語「Omega」の使用

ぐらいです。あと、「30日でできる」と題名にありますが、理解をするには私には30日では短すぎました。

# 外観
![スクリーンショット (8)](https://user-images.githubusercontent.com/74484618/101024871-15be9c00-35b8-11eb-8655-688fe3bd2d00.png)

真っ黒なのは、ただ単に私の好みです。自分であえてそうしました。

![スクリーンショット (9)](https://user-images.githubusercontent.com/74484618/101025021-4b638500-35b8-11eb-93c3-467e88c7b147.png)

利用できる数少ないコマンドもこの通り。

# まとめ

今回は自作OSを作って紹介しました。感想としては、結構入門の割には難しかったです。
ただやりたいことがなく時間を持て余していた私は1～2回読み直せば何とか理解できるようになりました。

改善点としては、

- コマンドが少なすぎる
- Cが苦手(C++できるのに！)
- Omega言語をもっと使えるようにしたい、、、
- UIも頑張る

まあ数少ない友人に見せて「うわなんかすげぇ」って言われるぐらいまでは仕上げたいと思っています。ラズパイとかと組み合わせて全部自作にするのもいいかもしれません。
それでは、また次の記事でお会いしましょう。
さようなら！
【Scratch】カタコトのニホンゴを話すネコの作り方

いつもkintoneの話をしている私ですが、
CoderDojo 久留米のメンターをしておりまして、
DojoCon Japan 2020 の実行委員をしております。

DojoCon Japan 2020 オンラインで開催です！
是非遊びに来てね✨✨

→→[DojoCon Japan 2020](https://dojocon2020.coderdojo.jp/)

の前に、CoderDojoとは？
→→[CoderDojo](https://coderdojo.jp/)

お住いの地域の CoderDojo 是非入門してみてくださいね(*´ω｀*)

追記：
1ヶ月前に書いているということを、投稿後に気づきました😨私大丈夫かな・・・
[Scratchでスプライトに「カタコトの日本語」を喋らせる](https://qiita.com/juri_don/items/684f5742c8a864746374)


# Scratchで作ったもの
さて、ようやく本題ですが私が作った作品が、 CoderDojo でウケたらしい。

私は福岡県にあるCoderDojo久留米でメンターをしておりますが、
海や山を越えた関東地方のCoderDojo小平 でウケたそうで調子に乗ってしまいました。

そのウケた作品がこちら↓

[2020/11/06の日記](https://scratch.mit.edu/projects/446217832/)
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/fc52d395-65d4-7358-51f2-fd9b71673ce9.png)
](https://scratch.mit.edu/projects/446217832/)

ネコとヒヨコがカタコトの日本語をしゃべります。

# 作り方
ポイントは2つだけです。

(1)一番左下のこれをクリックして、「音声合成」を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/f5ae4bdd-f4df-5098-b481-7e090fc07488.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/98f4904f-0304-32d5-2984-accba24c3bc0.png)

(2)英語を選んで、ローマ字で日本語を表現する
日本語をローマ字で表して、調整します。

「今日はインフルエンザの注射を」
↓
「kyou wa infuru en za no chu  shawo 」

分けたりアルファベットを変えたりしてそれっぽくなるように試行錯誤しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/0a893a51-f5ed-1509-6be1-afade1b802fc.png)

# まとめ
アドベントカレンダー3日目が終わる頃に投稿となりましたが、CoderDojoというよりScratchの話になっちゃったなぁ。
まぁいっか！

というわけで、 CoderDojo で自由に楽しい作品を作りましょう✨✨
脆弱性診断：自動診断ツールと手動診断ツール

#はじめに
今回は脆弱性診断を行う際の「自動診断ツール」と「手動診断ツール」の特徴や違いなどを自身の復習もかねてまとめてみました。

#◎自動診断ツールとは

WEBアプリケーションの**脆弱性**や**セキュリティ機能の不足**を効率的に発見することを目的としたツールです！

「脆弱性スキャナー」や「脆弱性検査ツール」などと呼ばれています。

####《主な機能は以下の通り》

●テストケース作成機能　
●脆弱性診断の実施機能
●レポート作成機能

###▶テストケース作成機能

テストケース作成機能とは、脆弱性診断の実施時の手順や実施した内容を決める機能。
**「診断対象を記録する機能」**と**「シナリオ作成機能」**の2つを使って行われます。

●診断対象を記録する機能はWEBサイトを自動または手動によってクロール（巡回）することによって、診断対象のWEBアプリケーションのWEBページやリクエスト内容を記録していく機能。

●シナリオ作成機能は記録した診断対象を基に、診断対象を診断する手順や、実施する内容を決める機能。

###▶脆弱性診断の実施機能

脆弱性診断の実施機能とは、テストケース作成機能によって作成されたテストケースに基づき、
**WEBページの脆弱性を発見する機能**。

####《脆弱性を発見する方法》

●記録したパラメーターに対して脆弱性診断の検査パターンを挿入し、正常時のレスポンスと検査パターン挿入時のレスポンスや挙動を比較する。
●レスポンスに含まれる特定の文字列を検出する。

###▶レポート作成機能

レポートを作成する機能とは、脆弱性診断の実行機能によって発見した**脆弱性についてまとめたレポートを出力する機能**。

「**発見した脆弱性の名称**」や「**概要**」「**URL**」や「**送信したリクエストとレスポンス**」「**脆弱性だと判断した理由**」「**脆弱性の緊急度**」「**対策方法**」などを記載します。

#自動診断ツールの特徴と得意分野

自動診断ツールの最も大きな特徴は**スピード**です！！

そのほか自動診断ツールが主に得意とすることは以下の3つになります。

●パラメーターに値を挿入して発見するタイプの脆弱性
●HTMLやCookieなどのセキュリティ機能の不足
●ディレクトリやファイルの発見

###▶パラメーターに値を挿入して発見するタイプの脆弱性

インジェクションに分類される「**SQLインジェクション**」や「**クロスサイトスクリプティング**」のようなタイプの脆弱性を発見することを特に得意としており、自動診断ツールが備える複数の検査パターンをクエリーやPOSTデータなどのパラメーターに次々と挿入することで、そのレスポンスを見るなどして脆弱性を発見していきます。

###▶HTMLやCookieなどのセキュリティ機能の不足

CookieやhttpOnly属性が付いているか、オートコンプリート機能が有効になっているかといったレスポンス内容を見れば判断ができる**セキュリティ不足**を発見することを得意としています。

###▶ディレクトリやファイルの発見

リンクされているURLの検索だけではなく、検索エンジンのためのrobots.txtのようなファイルを探したりすることも得意としている。場合によっては、自動診断ツールが備えた辞書機能によって、どこからもリンクされていないファイルやディレクトリを探すこともあります。

#自動診断ツールでは発見が難しい脆弱性や機能


|《脆弱性》             |
|:------------------|
|●認可制御の不備・欠落             |
|●ビジネスロック上の問題              |
|●メールヘッダーインジェクション              |
|●クロスサイトリクエストフォージェリ|
※認可制御の不備・欠落やビジネスロック上の問題は、正しい状態が何なのか**『人間の判断』**が必要になってきます！！

|《機能》          |
|:------------------|
|●人間の判断や操作が必要になるもの              |
|‐メール受信、CAPTCHA、二要素認証、複数要素認証              |
|●ゲームのような操作を伴うもの              |
|●脆弱性の発動に複数のパラメーターを利用するもの       |
|●一度しか実行できない機能      |
|●入力値の影響が次画面ではなく他の画面にでるもの    |
※WEBアプリケーションの脆弱性診断では**”手作業による診断”**併せて行うことが必要になります！

#◎手動診断補助ツールによる診断

手作業で診断を行う際にWEBブラウザだけでは行うことが困難なリクエストの内容を書き換えたり、レスポンス内容を確認したり、検査パターンを連続して挿入するといったことを行うことができます。

####《主な機能は以下の通り》

●HTTPメッセージ（リクエスト・レスポンス）の確認　
●リクエストメッセージの書き換え
●HTTPメッセージ（リクエスト・レスポンス）の記録


|      |        |  
|:-----------------|:------------------|
|▽リピーター   |一度送ったリクエストを再び送るリクエスト再生機能。プロキシにより、記録された過去のリクエストを再び送ることができる。 | 
|   ▽ファザー         |   自動的に値をクエリーやPOSTデータ、ヘッダーフィールドなどに入れてリクエストを連続して送信する機能。自動診断ツールのように自動的に脆弱性を検出することはないので、レスポンスの内容を人間が判断する必要がある。|
| ▽エンコーダ・デコーダ           |    指定した文字列をBase64やURLエンコードなどでエンコードしたり、デコードしたりする機能。 |  
|▽diff              |   ２つの差分をとることで変化している箇所を発見するための機能。２つのHTTPメッセージを比較したい場合、この機能を用いることで同じ箇所や異なっている箇所を発見しやすくなる。|  

##脆弱性診断に必ず付きまとう問題～誤検知と見逃し～

脆弱性診断に必ずつきまとう問題として、誤検知と見逃しの問題があります！

●**誤検知**・・・正常のものを誤って脆弱性だと判断してしまうこと
●**見逃し**・・・脆弱性を発見できずに見逃してしまうこと

誤検知が起きるときは、WEBアプリケーションに**何らかの問題**があることも多いので、一概に誤検知が悪いとはいえないこともあります！！

自動診断の診断結果の検証は、誤検知と見逃しを減らすことを目的としています！

自動診断ツールによる診断は、手作業による診断に比べると大幅に時間を減らすこともできますが、「誤検知」や「見逃し」が発生することがあります！
効率かつ確実な診断のためには「**自動診断ツール**」と「**手作業による診断**」を組み合わせて行うことが必要になります！！

#参考文献

書籍：Webセキュリティ担当者のための脆弱性診断スタートガイド
　　　上野宣が教える新しい情報漏えいを防ぐ技術　第2版
著者：上野　宣
JavascriptでRange関数を書いてみた

Javascriptの組み込み関数には連番入った配列を返すような「Range関数」がない。
もしあれば、`for-of`文などと組み合わせて簡潔に書ける処理が増えるだろう。

```Javascript:使用イメージ
for ( const value of Range( 10, 20 ) ) {
  //value = 10, 11, 12, ... 19
}
```

#実際に書いてみる

パフォーマンスなどは無視して、単純に書くと配列を返す処理になるだろう。
しかし、何万何十万という巨大な連番を振る場合には不都合が大きい。
要は iteratable を返せば良いのでジェネレーター関数とすれば良いだろう。

```Javascript:Range(&#x20;[start,]&#x20;end&#x20;[,&#x20;step]&#x20;)
function* Range( ...args ) {

  let start, end, step;

  switch ( args.length ) {
    case 0: throw new TypeError( "argument expected" );
    case 1: [ end ] = args; break;
    case 2: [ start, end ] = args; break;
    default:[ start, end, step ] = args; break;
  }

  [ start, end ] = [ start, end ].map( val => val == null ? 0 : Number( val ) );

  if ( step == null ) step = start < end ? 1 : -1;
  else step = Number( step );

  if ( [ start, end, step ].some( e => isNaN( e ) ) ) throw new TypeError( "illegal argument" );

  if ( step == 0 ) throw new TypeError( "illegal argument" );
  else if ( step < 0 )
    if ( start < end ) throw new TypeError( "illegal argument" );
    else for ( let value = start; value >= end; value += step ) yield value;
  else
    if ( start > end ) throw new TypeError( "illegal argument" );
    else for ( let value = start; value <= end; value += step ) yield value;

}
```

`start`と`step`は省略可能で、どの引数も負数を指定しても動くようになっている。
`start`と`end`に対する`step`の正負が不正か、いずれかの引数が`NaN`の場合はNGになる。

```Javascript:使用例
const maru = String.fromCharCode( ...Range( 13008, 13054 ) );

console.time( "TEST 1" );
for ( const times of Range( 100000 ) ) {
  //TEST
}
console.timeEnd( "TEST 1" );
```
[Rust][confy] confyが読み込む設定ファイルのファイルパス

[confy](https://github.com/rust-cli/confy)を使って設定ファイルを読み込もうとしたら、読み込まれるファイルパスが結構わからなかったのでメモ。

https://github.com/rust-cli/confy#breakings-changes
```
Starting with version 0.4.0 the configuration file are stored in the expected place for your system. See the directories crates for more information. Before version 0.4.0, the configuration file was written in the current directory.
```

0.4以降は[directories](https://crates.io/crates/directories)見てねってことだけど、、わからん、、、

https://github.com/rust-cli/confy/blob/master/src/lib.rs#L117-L125

```
pub fn load<T: Serialize + DeserializeOwned + Default>(name: &str) -> Result<T, ConfyError> {
    let project = ProjectDirs::from("rs", "", name).ok_or(ConfyError::BadConfigDirectoryStr)?;

    let config_dir_str = get_configuration_directory_str(&project)?;

    let path: PathBuf = [config_dir_str, &format!("{}.{}", name, EXTENSION)].iter().collect();

    load_path(path)
}
```

src見てやっと理解。

```
    let config: Config = confy::load("issue").unwrap();
```

こんな感じで name を `issue` にした場合、

```
Linux:   /home/__username__/.config/issue/issue.toml
Windows: C:\Users\__username__\AppData\Roaming\issue\issue.toml
macOS:   /Users/__username__/Library/Preferences/rs.issue/issue.toml
```
こうなる。
【マルチモジュール】Android Multi Moduleでのフォルダ構成のコツ

## こんな人が読むと幸せになる
Project tool windowをAndroidでみていて、
フォルダ構成が見辛い、整理しづらい人に朗報
こんなふうに

![スクリーンショット 2020-12-03 22.09.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138063/7b98a69a-07e4-d9ae-d20a-98ad95b36ee8.png)

モジュールだけのフォルダ、ほしいですよね
feature_aとfeature_bをまとめたいですよね！

## 結論 
こうじゃ
![スクリーンショット 2020-12-03 22.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138063/ae2284bf-a0ef-1c36-0a16-57be9b1a45af.png)

## 解説
ふつうにモジュールを追加すると
フォルダをいい感じにできませんよね？

ここから
![スクリーンショット 2020-12-03 22.08.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138063/9be113ed-9910-ec2c-ee09-c68c97a1fc54.png)

こうして
![スクリーンショット 2020-12-03 22.08.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138063/461d8643-9dab-d7ac-4cbc-c1d15fff83f3.png)

普通はこうやっちゃいますよね？
![スクリーンショット 2020-12-03 22.08.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138063/cd5b2b13-384d-bec5-56ab-3c03591ae32d.png)

この部分で
:features:features_a
というように：区切りで入力すると
![スクリーンショット 2020-12-03 22.11.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138063/5527bfa5-eb00-b855-2001-1e7bf6530eb2.png)

Project tool windowをAndroid
でも
いい感じにフォルダが構成できます！


## まとめ
みんなマルチモジュール開発がんばりまっしょい！

終わり!
rails6でi18nによるja.yml（日本語化）が適用されない時に確認すべき3つのポイント

railsの教科書を読みながらサンプルアプリを作っていたところ、日本語化ができずに詰まってしまいました。
今回はうまく日本語化できなかった原因と、どうやって解消したかについて紹介します。
また、調べている中で、よくある日本語化が適用できない原因もざっと知れたため、併せて紹介していきます。

1. [私のアプリが日本語化できなかった理由](#anchor1)
1. [railsアプリが日本語化されない際によくある3つの間違い](#anchor2)
1. [参考](#anchor3)

<a id="anchor1"></a>
#私のアプリが日本語化できなかった理由

まずは、私の作成したアプリがうまく日本語化できなかった原因は、「インスタンスを作成していないため」でした。
下記コード＋Gemfile記載後のbundle installが主に日本語化に必要だったことなのですが、この内私はcontrollerのメソッド内（今回はnewメソッド）において、
@task = Task.newを記載していませんでした。

html.erbでは該当部分に、model: @taskと記載がありますが、controllerでtaskモデルのターゲットを作っていなかったため、ja.ymlの判定には適用されていなかったようです。

```:locales/Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.6'
〜
gem 'rails-i18n'
```

```ruby:config/application.rb
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

module yourAppName # ここにはあなたのアプリの名前が入ります。
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0
    config.i18n.default_locale = :ja
  end
end
```

```yml:locales/ja.yml
ja:
  activerecord:
    errors:
      messages:
        record_invalid: 'バリデーションに失敗しました: %{errors}'
        restrict_dependent_destroy:
          has_one: "%{record}が存在しているので削除できません"
          has_many: "%{record}が存在しているので削除できません"
    models:
      task: 'タスク'
    attributes:
      task:
        id: 'ID'
        name: '名称'
        description: '詳しい説明'
        created_at: '登録日時'
        updated_at: '更新日時'
```

```ruby:tasks_controller.rb
class TasksController < ApplicationController

  def new
    @task = Task.new
  end
```


```erb:tasks/new.html.erb
<h1>タスクの新規登録</h1>

<%= link_to '一覧', tasks_path, class:'nav-link' %>

<%= form_with model: @task, local: true do |f| %>
  <div class='form-group'>
    <%= f.label :name %>
    <%= f.text_field :name, class:'form-control', id:'task_name' %>
  </div>
  <div class='form-group'>
    <%= f.label :description %>
    <%= f.text_area :description, ros: 5, class:'form-control', id:'task_description' %>
  </div>
  <%= f.submit nil, class: 'btn btn-primary' %>
<% end %>
```

続いて、よくある間違い3つの紹介に移っていきます。

<a id="anchor2"></a>
# railsアプリが日本語化されない際によくある3つの間違い


##ja.ymlの記載方法が違う

ja.ymlファイルはインデントでの判定が厳密です。
htmlファイルなどはインデントが適当でも動きますが、ja.ymlはインデントが適当だとそれ自体がエラーの原因になるので、注意しましょう。

##Gemfileをインストールしていない

当たり前かも知れませんが、gem 'rails-i18n'を記載の上、bundle installを行わなければ、i18n（国際化）はされません。
忘れないように気をつけましょう。

##configファイルに必要事項を記載していない

configファイルに以下を記載していない場合も日本語化ができません。

```ruby:config/application.rb

module yourAppName # ここにはあなたのアプリの名前が入ります。
  class Application < Rails::Application
    config.i18n.default_locale = :ja
  end
end
```

以上、日本語化がうまく適用できない原因を探る中でよく見かけた3つの原因でした。

<a id="anchor3"></a>
# 参考

[初学者]Railsのi18nによる日本語化対応
https://qiita.com/shimadama/items/7e5c3d75c9a9f51abdd5

Railsでja.ymlが反映されない
https://qiita.com/kobaryo04/items/10793fd7717919454a60
pg_restoreでテーブルやビューをインポート

## コマンド

pg_dumpでカスタムアーカイブ形式で取ったダンプからテーブルの定義とデータをインポートします。
テーブルでもビューでも```-t```オプションを使用します。

```
pg_restore -h <hostname> -u <username> -p <port> <dbname> -Fc -t <tablename> <dumpfile>

```

## サンプル

```
pg_restore -h sample.com -u sample_user -p 5432 sample -Fc -t tab0001 sample.dmp
```
dockerでnginxを使ってhtmlを表示する。

先月から少しずつ色んな記事を見ながら勉強してDockerfileとdocker-composeのいじり方が徐々に分かってきた感じなので、
アウトプットの練習も兼ねて記事にしたいと思いました。今回nginxを立ち上げるだけなのですが練習の意味でdocker-composeも利用してコンテナの設定を構築します。

## 環境
- Docker 19.03.13
- docker-compose 1.27.4
- nginx 1.16

## Dockerfileの設定
なにはともあれDockerfileの設定をしましょう。適当なディレクトリを作成してDockerfileを作成します。

```Dockerfile:Dockerfile
FROM nginx:1.16

ADD index.html /usr/share/nginx/html/index.html

CMD /usr/sbin/nginx -g 'daemon off;'
```
##### FROM
DockerHubからイメージをプルしてきます。
##### ADD
同じディレクトリのファイルをコンテナ内の指定したディレクトリにあるファイルに上書きします。今回Dockerfileと同じディレクトリにあるindex.htmlにてコンテナ内のファイルを上書きします。
##### CMD
コンテナが起動した際に走らせるコマンドを指定します。nginxはデフォルトだとデーモンで起動するのでここではデーモンオフにしてフォアグラウンドで実行する設定にしています。こうしないとdockerがコマンド実行したのち停止します。
## 表示するhtml

```html:index.html
this is nginx test!!!!
```
書くほどのこともないですが上書き用のhtmlも用意します。
## docker-composeの設定
一個のコンテナで使う意味はないですが、設定を書きます。

```docker-compose:docker-compose.yml
version: '3'
services: 
  web:
    build: .
    ports: 
      - 80:80
```
webサーバーなのでwebという名前にしています。同じディレクトリのDockerfileを使ってbuild。
ホスト80番、コンテナ80番でポートフォワーディングさせています。

```
nginx_test
  ┣ Dockerfile
  ┣ docker-compose.yml
  ┣ index.html
```
最終的にはこんな感じ

## コンテナを起動
コンテナを起動して起動しているか確認します。

```
$ docker-compose up -d
$ docker ps
```
確かに80番でnginxが80番ポートで待ってます。今行くぜ！

```
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
ec41e6accd3e        nginx_test_web      "/bin/sh -c '/usr/sb…"   20 minutes ago      Up 20 minutes       0.0.0.0:80->80/tcp   nginx_test_web_1
```
http://localhost にてアクセスしてindex.htmlの記述が表示されれば成功です。

## 所感
自分の中ではADDというのがしっかり理解できず、技術記事を見ていても、なんでローカルのファイルがコンテナに反映されるかが分からずに悩んでいましたがnginxのdockerでの起動について調べていくうちに理解できました。
技術備忘録【composer・環境変数設定】

自分自身の学習記録として記録しています。

今回は「Composer」についてです。
![Logo-composer-transparent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568321/6bdfa09c-1987-c7ec-0aec-2701eeca8773.png)

公式サイト：https://getcomposer.org/

composerはパッケージ管理ツールです。

どういう事かというと、
何かしらのWebサービス等を開発する際に、
先人達が開発した「ライブラリ」を使う事で、
素早くサービスを開発したり、機能を追加することが出来ます。

※ライブラリって？
特定の機能を提供するコードをひとまとめにしたようなものを言います

しかしながら、そのライブラリ自体も様々なライブラリを組み合わせて作られていることも多く、
一つのライブラリのバージョンが異なる事で正常に機能しなくなってしまう事もあります。

そこで、このcomposerを使用することで、
「ライブラリ同士の依存関係」を管理することができるようになります。　
言ってしまえば、チーム開発をする上での環境構築などがスムーズになる事や、
エンジニア間での使用しているライブラリのバージョンの差異を無くすことが出来ます。
不要なエラーをなくすことにもつながりますので、現場では必須ツールの一つと言われています。
私をはじめ初学者の方はしっかりと覚えていきましょう！

では具体的にどのようにして使用するのかを記載していきます。

★composerの仕組み

composerは「composer.jsonとcomposer.lock」でライブラリの依存関係を管理しています。
composer.json...プロジェクトで使用するライブラリをひとまとめにしたもの
composer.lock...実際にどのライブラリのどのバージョンをインストールしたかをまとめたもの

手順としては、
（1）composer.jsonに必要なライブラリとバージョン情報を記入する
（2）composer init を実行する
（3）インストールしたライブラリとバージョン情報がcomposer.lockに書き出される
（4）以降はcomposer.lockがあればinstallコマンドを打つとそちらを元にインストールがはじまる

もっと細かい手順
（1）チームの責任者がcomposer initでcomposer.jsonを作成する
（2）続いて、同様に責任者がcomposer require　<ライブラリ名>でライブラリを追加していく
（3）出来上がったcomposer.jsonをもとにチームメンバーが上記のcomposer initの手順を実行する

これでチーム開発時の使用するライブラリとそのバージョン情報を統一することが出来ます。
ちなみに使用しなくなったライブラリは不要な混乱を生むためcomposer remove　<ライブラリ名>で取り除くのが吉です。

昨今のPHPの開発環境ではcomposerを使用しての開発がベストプラクティスだそうです。
学習を進めるうえで追記すべきことがあればまた書き足して行こうと思います。

今回はここまで。お疲れ様でした。
ASP.NET Core よ HttpContext.Current は、どこにいった？

# はじめに
ASP.NET では、System.Web.HttpContext.Current で System.Web.HttpContext のインスタンスを取得していました。

ASP.NET Core では、同等の Microsoft.AspNetCore.Http.HttpContext が使用され、コントローラーの継承元 Microsoft.AspNetCore.Mvc.ControllerBase のプロパティ HttpContext から、HttpContext のインスタンスが取得できるようになっています。


ビュー(*.cshtml) 側でも、Context プロパティから HttpContext を取得できます。

```html:xxx.cshtml
@{
   var request = this.Context.Request;
   ...
}
```

これらの方法で HttpContext を取得できるので、困ることはほとんどないですが、Bot Framework SDK(ASP.NET Core 3.1 ベース)  の Dialog で HttpContext を取得する際に困ったことがあるので、このような場合での解決方法を説明したいと思います。
もちろん、Bot Framework でなくても同様の手順で、HttpContext を取得できます。

# HttpContextAccessor の依存性の注入とインスタンスの取得

依存性の注入で、IHttpContextAccessor のインスタンスを登録します。

```csharp:Startup.cs

public void ConfigureServices(IServiceCollection services)
{
     ...
     services.AddHttpContextAccessor();
     ...
}

```

あとは、コンストラクタ経由で、IHttpContextAccessor を取得するのみです。
IHttpContextAccessor.HttpContext で、HttpContext のインスタンスを取得できます。

```csharp:MainDialog.cs

   public class MainDialog : ComponentDialog
   {
        private readonly IHttpContextAccessor _httpContextAccessor;
        protected readonly ILogger Logger;

        public MainDialog(IHttpContextAccessor httpContextAccessor, ILogger<MainDialog> logger)
            : base(nameof(MainDialog))
        {
            this._httpContextAccessor = httpContextAccessor;
            Logger = logger;

            ...
        }

        ...

        private void DoSomething()
        {
           var request = this._httpContextAccessor.HttpContext.Request;
           ...
        }
   ...
   }

```


# 参考サイト

- [Access HttpContext in ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context)
RailsにService層を導入

# はじめに
いろいろ理解が間違っている部分もあると思うので、問題あればご指摘していただければと思います。

# Service層について
Modelの肥大化の対応として、複雑なロジックや、複数のモデルにわたる処理をService層に記載する方法があります。

# 使い方

フォルダ構成に関しては、`app/services`に書いていきます。

ルールに関しては、チームによって違うと思いますが、自分の場合は下記の様にパブリックなメソッドは`call`のみにする形をとっています

```ruby
class MetricsService
  
  def initialize(user)
    @user = user
  end

  def call
    # 何かしらの処理
  end

  private

  # プライベートメソッド
  
end
```

呼び出す際は

```ruby
MetricsService.new(user).call
```

の様にして、呼び出します。

# serviceをまとめる

おそらく、serviceを使っていると、結構serviceの量が増えてくると思います。

なので、モデルや機能などの単位でフォルダを切ると良いと思います。

例えば、usersに関するserviceを`app/services/users`内に書く場合は、


```ruby
module Users

  class CreateService

    def initialize(current_user, params = {})
      @current_user = current_user
      @params = params.dup
    end

    def call
      # 何かしらの処理
    end

    private

    # プライベートメソッド
  end

end
```

の様に定義して

```ruby
::Users::CreateService.new(current_user, params).call
```

の様にして使います。



# 終わりに

とりあえず、いろんなロジックをservice層に押し込む感じで運用しているのですが、結構悪くなさそうです。

また、service層以外にも、モデルの肥大化の対策はあります。

[こちら](https://techracho.bpsinc.jp/hachi8833/2013_11_19/14738)の記事が参考になると思います。
Spring Bootとはなにか

#プログラミング勉強日記
2020年12月3日
今日初めてSpring Bootを使って簡単にアプリを作ることができたので驚いた。なので、Spring Bootとはなにかまとめようと思う。

#Spring Bootについて
　Spring Bootの紹介をする前に、まずSpring Frameworkについて触れる。

##Spring Frameworkとは
　Spring Frameworkは2004年にリリースされたオープンソースのフレームワークで、依存性注入(DI)や、アスペクト指向プログラミング(AOP)などシステム開発やプログラムの修正がしやすいような仕組みになっている。他のフレームワークと比較しても、Spring Frameworkは汎用性が高く、WebシステムやWebサービス以外にもクラウドやモバイルシステムの開発にも適している。

　Spring Frameworkはフレームワークの集合体で、機能に応じて多数のフレームワークで構成されている。これによって、幅広い開発ができるが、機能の使い分けが難しいというデメリットもあった。

##Spring Bootとは
　Javaで行うWebアプリ開発を迅速かつ効率的にする仕組みを備えたフレームワークのこと。Spring Frameworkの機能の使い分けが難しいというデメリットを解決するために作られたフレームワーク。Spring BootもSpring Frameworkをベースとするフレームワークの1つである。

　主な機能としては、複数のフレームワークを使用するときに発生するBean定義やXML設定を可能な限り自動設定する機能がある。他にも、コードを書かなくてもプログラムの処理ができるようにJavadocと同様にアノテーションが記述できる。Spring Bootは、Spring MVCと呼ばれる別のフレームワークの仕様を引き継いでいるので、Spring Frameworkを構成するフレームワークの1つとして組み込まれている。

##Spring FrameworkとSpring Bootの違い

- Spring FrameworkはJavaのアプリ開発のために作られたフレームワークの集合体
- Spring Bootは集合体となった機能をつきやすくするためにフレームワーク

#Spring Bootの特徴(メリット)

- XML設定ファイルが不要
- jarファイルにWebコンテナを含められる
- コーディングする量が減る
- 依存性注入(DI)がベースにある
- STSとの相性が良い
- カスタマイズができる

##XML設定ファイルが不要
　Spring Bootでは複雑であったXML設定ファイルをなくして、基本的な設定を自動化している。
　一般的にはXMLファイルに記述する設定作業は、複雑なことをしようとするほどXMLも複雑になり、エラー特定が難しくなる。そこで、Spring Bootは必要最小限の設定のみでWebアプリを実行することができる。

##jarファイルにWebコンテナを含められる
　サーバー側にWebコンテナをセットアップすることなく、jarファイル単体でWebアプリの開発できる。

##コーディングする量が減る
　アノテーションを記述することで機能を実装できるので、短いコードで実装することができる。

##依存性注入(DI)がベースにある
　DIとは、クラス間にある依存関係をコードに記述するのではなく、実行時に外部から引数で呼び出すことができる手法。DIがあることで、クラスの仕様を変更しても既存のコードに影響を与えないことができ、単体のテストにおいてテスト用のクラスを作成することができる。

##STSとの相性が良い
　STSはSpring Tool Suiteの略で、EclipseをベースにSpring Frameworkでの開発に適した機能が備えられている開発環境のこと。STSを利用することで、コードの作成だけに集中して開発を進められる。

##カスタマイズができる
　初期段階で設定されてるものを変えることで、目的や好みに合わせて変更することができる。

#参考文献
[Spring bootとは？Spring frameworkとの違いは？](https://hnavi.co.jp/knowledge/blog/spring-boot/)
[Spring Bootとは？Spring Bootの基礎や使い方を初心者向けに解説！チュートリアルやおすすめの本も紹介](https://agency-star.co.jp/column/spring-boot)
[Spring Bootのメリット6つ｜使い方や開発事例を解説！](https://www.fenet.jp/dotnet/column/environment/3374/)
Symbolノード起動時のカスタムプリセットで使えそうなものをまとめていく

ノード構築をなんとなくやってませんか？
私はなんとなくでやってます。そろそろカスタムプリセットで設定できる項目について調べてみたので、アドベントカレンダーの場を借りて記事にします。
コンフィグから各サーバーの動作を知る手がかりになればと思いながら調べています。

※随時更新予定です。

この辺りの項目がプリセットで上書きされていく感じですね。
[configuring node properties](https://docs.symbolplatform.com/guides/network/configuring-node-properties.html)
[gihub symbol-sdk preset guide](https://github.com/nemtech/symbol-bootstrap/blob/main/docs/presetGuides.md)



## Restノードのスロットリング（アクセス制限）

いろいろな方の設定値を拝見していると平常時40、バースト時80くらいが良さそうですね。
throttlingRateは公式サンプルでは1000となっていますが、この設定合っているのでしょうか？

```
throttlingBurst: 80
throttlingRate: 40
```

このあたりで設定されています。
[catapult-rest/bootstrapper.js at 15922d068158aa49a6e62feb4a2a6681e8762665 · nemtech/catapult-rest · GitHub](https://github.com/nemtech/catapult-rest/blob/15922d068158aa49a6e62feb4a2a6681e8762665/rest/src/server/bootstrapper.js#L123)

## ノードのfee設定

手数料を徴収しないこともできるようですね。

```
minFeeMultiplier: 0
```

[ここ](https://github.com/nemtech/catapult-server/blob/46b2020604f1cdc3f708d7f5ad999fcae701e188/resources/config-node.properties)を見るとデフォルトが0のようですね。

## RESTゲートウェイを開くかどうか

外部に開放したくない場合に使うようです。

```
gateways:
    - openPort: false
```



## ノード名とホスト名
[ノードリスト (testnet)](https://symbolnodes.org/nodes_testnet/)で確認できますね。

複数ノードをアップデートすることもできるようです

```
nodes:
    - friendlyName: My node custom friendly name
      host: 'myNode.custom.hostname'
```  


## ハーベスティング系の設定

いずれも自分のものを入れておくと良いかと思います。
署名用の秘密鍵については説明不要かと思います。

```
nodes:
  - voting: true
    signingPrivateKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    vrfPrivateKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    votingPrivateKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

### voting,votingキーとは？
ファイナライズの際にノードによる投票(voting)が行われます。
こちらに参加するかどうかとどのキー(votingPrivateKey)を使うかを指定するか決めることができます。


### vrfキーとは？

こちらは「テストノードを建ててハーベスティングまで〜系の記事」に出てきますね。
ハーベスティングに必要なものです。

vrfキーには以下の目指せ北海道さんの記事にあるように`ジェネレーションハッシュを、vrfキーによってランダムで予測不能な値にすることができる`役割があり、それによってハーベストアカウントを予測不可能なものにします。

[【NEM技術勉強会】8.4 ブロックジェネレーションハッシュ 8.5 ブロックのHit値とTarget値【Symbol白書】](https://nemlog.nem.social/blog/40443)

上記2つのキーは以下のコマンドでリンクトランザクションを発行します。

```
symbol-bootstrap link
```

### 設定変更のあとは？
[symbol-bootstrap run のドキュメント](https://github.com/nemtech/symbol-bootstrap/blob/main/docs/run.md)によると `--resetData`をつけてあげるとkey等の情報はそのままDBを作り直してくれるそうです。
ドローンの飛ぶ仕組み

# なぜドローンは空を舞えるのか？
なぜドローンは空を舞えるのでしょう？　ドローンはどのような仕組みで移動できているのでしょう？　多くの人はドローンが上昇・下降する仕組みについての予想は立てていると思います(そしてその予想は合っているでしょう)。しかし、前後左右や回転動作の仕組みは知らない人もいるのではないでしょうか。今回はその仕組みを説明します。

# プロペラの構成
まず、ドローンのプロペラについてお話します。その前に、大体のドローンのプロペラの枚数って4, 6, 8枚といった偶数枚というイメージがありませんか？　このプロペラの構成に関する話が終わるころには答えが導き出せると思います。

さて、皆さんは国民的アニメのドラえもんをご存じでしょうか？　青い猫型ロボットで困ったときにはポケットに隠し持っているひみつ道具で助けてくれます。そんなドラえもんのひみつ道具の中に「タケコプター」という道具があります。頭につけると空を飛べる道具ですね。

そのタケコプターですが本来であれば大変な欠陥が生じています。それは**プロペラが回ると人も回ってしまうという事です**。仮にプロペラが右回転だったとしましょう。すると、その**プロペラの回転に対する反作用で人の体は反対に回転**してしまいます。(ちなみにアニメではそんな事は起こりません。何故なんでしょう・・・)

タケコプターはともかく、ドローンではそれを避けるために右回転するプロペラと左回転をするプロペラの両方を持っています。丁度下の図の様な感じです。

![2020-1203_2116.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323150/539e4285-6318-dcff-9023-7d88463b8377.png)

右回転するプロペラと左回転するプロペラの両方があることにより反作用を打ち消しあい、空を飛んでもクルクル回りだすことはありません。それを踏まえてドローンの移動の仕組みを説明します。

# 移動の仕組み
ドローンの操作をする際は下の表に従ってプロペラの回転数を操作します。

|行動|プロペラの操作|
|:----:|:----|
|上昇|全体の回転数を上げる|
|下降|全体の回転数を下げる|
|前へ|B, Cの回転数を上げる|
|後ろへ|A, Dの回転数を上げる|
|右へ|C, Dの回転数を上げる|
|左へ|A, Bの回転数を上げる|
|右回転|A, Cの回転数を上げる|
|左回転|B, Dの回転数を上げる|

### 上昇・下降
プロペラ全体の回転数を上げたり下げたりすることで上昇・下降が行えます。これは単純に空へ飛ぶ力を変えているためですね。

### 前へ・後ろへ・右へ・左へ
例えば、前に進みたいときは後ろについているプロペラの回転数を上げます。するとドローンが前方向へ傾き、前へ進みます。

### 右回転・左回転
例えば、右回転したいときは左回転しているプロペラの回転数を上げます。するとドローンへかかる右回転の反作用が大きくなり右に回転します。

# 最後に
私も最近これを知りました。これを考えた人は凄いですね。
BitriseでAppStoreConnectAPI Basedのdeploy

AppStoreConnectAPIの利用によって、`Auto Provisioning`の際に二段階認証とアプリ別シークレットを使うセッションベースの認証を使わなくてもよくなりました。

そちらの記事はいくつかあるのですが、`Deploy to iTunes Store`の方の解説がなかったので、この記事に残します。

# API BasedでAppStoreConnectにアップロードする方法
結論から言うと、「Deploy to iTunes Connect - Application Loader」ならAPI Basedでデプロイが可能です。ソースはこちら(公式)

https://devcenter.bitrise.io/getting-started/configuring-bitrise-steps-that-require-apple-developer-account-data/

# 手順
## 1. AppStoreConnectAPIとの連携
公式の手順があるのでこの記事では割愛します。
https://blog.bitrise.io/app-store-connect-api-on-bitrise

## 2. 「Deploy to iTunes Connect - Application Loader」を追加
以下のように、「Xcode Archive & Export」のステップでexport-methodが「app-store」のipa/pkgを吐き出した後の位置に「Deploy to iTunes Connect - Application Loader」ステップを挟みます。
![スクリーンショット 2020-12-03 21.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114709/a1d21561-a6dc-8e32-6a9a-b28155ad21c5.png)

## 3. Configに「API Key URL」と「Issuer ID」を設定する
p8ファイルのURLとissuerIDを設定すれば良いのですが、前者に少し工夫が必要です。
![スクリーンショット 2020-12-03 21.43.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114709/04f9b48b-6754-57f8-3c41-509737fd35e4.png)

説明に書いてあるとおり、`Workflow Editor`タブの最下部にある`Generic File Storage`にp8ファイルをアップロードし、そのURLをAPI Key URLとして設定するようにしましょう。

↓この場所で、最初にFile Storage IDを入力し、その後にp8ファイルをドロップします。
![スクリーンショット 2020-12-03 21.50.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114709/ad32d4b0-1ff1-ae99-75ea-8fa8171523b3.png)

IssuerIDは環境変数(もしくはシークレット)として定義し利用すると良いでしょう。

# まとめ
以上の設定で、AppStoreConnectにアプリケーションをデプロイできるはずです。

何か問題等あればコメントで教えてください。ありがとうございました。
[R] NSM3のインストールでエラーが出た時の対処法

# 環境
- Ubuntu 18.04.5 LTS (GNU/Linux 4.15.0-112-generic x86_64)
- R version 3.6.3 (2020-02-29)

# エラー内容

NSM3をインストールしようとすると``partitions``が not available と言われる。

```R:R
install.packages('NSM3')
```
```
ERROR: dependency ‘partitions’ is not available for package ‘NSM3’
```

# 対処法

以下をするとインストールできる様になる。

```bash:bash
sudo apt-get install libgmp-dev
sudo apt-get install libmpfr-dev
```

# この対処法が分かった経緯

``PMCMRplus``というライブラリをインストールする時に、[PMCMRplusのRDocumentation](https://www.rdocumentation.org/packages/PMCMRplus/versions/1.7.0)を参考にして上の2コマンドをしたらNSM3がインストールできる様になった。
RaspberryPiの発熱について

#はじめに
この記事はRaspberryPiで温度監視とその応用について調べたり検証したりした時の副産物の一部です。

あまり詳しく書くつもりもないのでサラッと読んでいただけると幸いです。
（これから先は口調が砕けます。）
#今回の環境
・自室(室温16~23度)
・床に直に置かれたRaspberryPi3B+(RaspbianOS)
・金属製のケース(2000円弱)
・ファン無し
・周りに扇風機や発熱する機器の存在無し
・microSDカードあり
#何をしたか？
RaspberryPiって発熱凄いとか熱対策とかいるとかクロックダウンする(諸説あり)とか言われてる(言われてた)けど、どんな感じになるの？

ってことでCPU使用率を100%にした状態にするとRaspberryPiのCPUの温度と周波数はどうなるのかについて調べた。
#方法と結果
方法としてRaspberryPiのCPUの温度とクロック周波数情報を分刻みで自動取得してcsvファイルを生成するプログラムを使用した。

time.sleep関数を使ってるため，極端な話，刻みは一時間刻みでもいいが，今回は三分毎に追記していく．
そのプログラムの一部が下記。

下記の抜粋は日付が変わって初めてのcsvへの追記なら新しく生成して時間,温度,クロック周波数の順に書き込むよという感じ。

```
def add_data(info):
    with open("log/" + info[1] + ".csv", "a") as f:
        writer = csv.writer(f)
        if(info[0] != info[1]):
            writer.writerow( ["time", "cpu_temperature[℃]", "cpu_clock[Hz]"] )
        writer.writerow( [info[2].replace(".", ":"), info[4], int(info[5])] )
```

その後は保存されているcsvファイルをExcelに持ってきて，オススメグラフの欄から折れ線と棒折れ線を選択(して補助線入れを)するだけでグラフが作成出来る(人力)
こんな感じに。![poo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679292/af4c7932-9a53-4d49-7f7c-7f96de3d32f6.png)

その結果としてこの様なグラフが出来上がった。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679292/794b9bba-656f-e4ec-f325-b8ca3b6fa727.png)
・温度が60度を超えた辺りからクロック周波数が1.2GHz以上(上限1.4GHz)出なくなった。
・ざっと一万個ぐらいのデータで計測している。
・温度が75～80度を超え続けるとフリーズして画面が動かなくなり，温度が72度くらいに下がるまで続く。
・ケースはそんなに熱くはなかったが出てくる空気が熱かった。

結果として重い処理を与え続けるとフリーズするし，寿命を縮めてしまうため，基本的に重い処理をする時は排熱がしやすいようにファンを付けるか，RaspberryPiの周りを冷やすことを勧める。
フリーズした時は室温21度くらいだったのでそれ以下に。

取得プログラムだけ走らせてCPU100%にしない場合は(室温によるが)45度～65度辺りを彷徨うだけだったので，軽く運用するだけなら別に気にしなくていいかもしれない。
#感想と得たもの
フリーズした時は熱で壊れたかと思ってホントに焦った。

RaspberryPi自体は燃えそうではなかったけど，USBレシーバーとか刺すスロットの部分が発熱しマウスのレシーバー差し替える時，かなり熱かった。

 ~~万が一を考えて冷ましたけど，レシーバーを冷ますという貴重な体験が出来たと思う。~~

~~あと，RaspberryPiの下の床がホカホカになるため寒い時に暖を取るのに丁度いいかもしれない。~~
#おわりに
ご覧下さりありがとうございました。これを真似してmicroSDカードが壊れても責任はとりません。