OmniAICreator/Qiita-1.07M huggingface dataset:
nuxt.jsでvue-chartjsを使ってグラフを作る

テーブルも良いけど図表（グラフ）だともっと見やすくなるよね？
で、[Chart.js](https://www.chartjs.org/)。
Chart.jsをVueで使うための[vue-chartjs](https://vue-chartjs.org/)まであるなんて。

# vue-chartjsをインストールする

[vue-chartjsのインストール](https://vue-chartjs.org/guide/#npm)

```sh
$ npm install vue-chartjs chart.js --save
```

# コンポーネントを作る

線グラフのコンポーネントを作る

`this.chartData`は`mixins: [reactiveProp]`で自動作成されるのでpropsには記述不要。

```vue:components/LineChart.vue
<script>
import { Line, mixins } from 'vue-chartjs'
const { reactiveProp } = mixins

export default {
  extends: Line,
  mixins: [reactiveProp],
  props: {
    options: {
      type: Object,
      default: null
    }
  },
  mounted() {
    this.renderChart(this.chartData, this.options)
  }
}
</script>
```

# 線グラフを表示する

```vue:pages/index.vue
<template>
  <div>
    <LineChart :chart-data="lineChartData" :options="lineChartOptions" />
  </div>
</template>

<script>
import LineChart from '@/components/LineChart'

export default {
  components: {
    LineChart
  },
  data: () => ({
    lineChartData: {
      labels: ['春', '夏', '秋', '冬'],
      datasets: [{
        label: '気温',
        data: [18, 23, 15, 10]
      }]
    },
    lineChartOptions: {
      responsive: true,
      maintainAspectRatio: false
    }
  })
}
</script>
```
Symbol Platform (NEM) 開発情報まとめwikiの紹介

# Symbol Platform (NEM) 開発情報まとめ

次期NEMチェーンのSymbolチェーンのデプロイに向け、2021年1月14日にスナップショットが実施される予定となり、
延期に次ぐ延期だったCatapultエンジンによるブロックチェーンネットワークがいよいよ開始する目処が経ってきました。

リリースも迫っているので、今のうちにできるだけ問題を粗探ししたり、改善を投げたいところです。
滑り込みでも何か貢献できれば、より良い物に仕上がるはずです。

なるべく最新のSymbolに関する開発情報をまとめているので、
Symbolの利用を検討している方で、テストネットを触ってみようと思っている方は、
ぜひ、参考にしてみてください。


## 開発情報まとめWiki

- [JP\-NEM\-DEV\-WIKI](https://jp-nem-dev.growi.cloud/)

Qiitaにあれこれ書くにはちょっと見にくいと思われますので、
個人的にまとめているWikiへのリンクを貼らせてもらいます。


## まとめ

しかし、せっかくの初日なのにまとめでお茶を濁している感じがするのは、
ちょっと仕事で忙しかったという言い訳と、
修正てんこ盛りのマイナーバージョンアップ(?)が今日までにリリースされなかったからです。

現時点の最新版から、大幅に仕様が変わるというわけではないのですが、
ブロックデータの同期の問題の解決や、上手く動いていない機能もあったので、
それらの検証をしたいところでした。

１２月中旬には公開されると思われる見込みなので、カレンダー中盤で新しいネタが上がってくれば、
空いている枠で何かネタだしができればと思ってます。

ともあれ、Wikiから開発情報に触れてみて、後日、続く記事の内容もお楽しみいただければ幸いです。
リストからfindを使わずにキー指定でvalueを取得する方法&ts(7053)エラー対応簡易メモ

## やりたいこと

```ts
interface Hoge {
  id: number | string;
  value: string;
}

const hogeList: Hoge[] = [
 { id: 'A', value: 'a' },
 { id: 'B', value: 'b' },
 { id: 'C', value: 'c' },
];
const hogeList2: Hoge[] = [
 { id: 1, value: 'a' },
 { id: 2, value: 'b' },
 { id: 3, value: 'c' },
];

const byB = hogeList.find(hoge => hoge.id === 'B');
console.log(byB); // 'b'

const by3 = hogeList2.find(hoge => hoge.id === 3);
console.log(by3); // 'c'
```

`hogeList`リストから、
`find`を使わずにid指定でvalueを取得したい

## 方法
リストからidをキーにしたオブジェクトへ変換

```ts
const obj = toObjectFromList(hogeList);
console.log(obj['B']); // 'b'
console.log(obj); // Object{A: 'a', B: 'b', C: 'c'}

const obj2 = toObjectFromList(hogeList2);
console.log(obj2[3]); // 'c'
console.log(obj2); // Object{1: 'a', 2: 'b', 3: 'c'}
```

## ts(7053)エラーになる書き方

```ts
export function toObjectFromList(list: Hoge[]): {[k: number]: string} | {[k: string]: string} {
  return list.reduce((acc, { id, value }) => {
    acc[id] = value;
    return acc;
  }, {} as {[k: number]: string} | {[k: string]: string});
}
```

```
型 'string | number' の式を使用して型 '{ [k: number]: string; } | { [k: string]: string; }' にインデックスを付けることはできないため、要素は暗黙的に 'any' 型になります。
型 'string' のパラメーターを持つインデックス シグネチャが型 '{ [k: number]: string; } | { [k: string]: string; }' に見つかりませんでした。ts(7053)
```

※`tsconfig.json`で`compilerOptions`に`"noImplicitAny": true,`を指定した場合にエラーになります。

## 修正

```ts
export function toObjectFromList(list: Hoge[]): {[k in string | number]: string} {
  return list.reduce((acc, { id, value }) => {
    acc[id] = value
    return acc;
  }, {} as {[k in string | number]: string});
}	
```

[Playground](https://www.typescriptlang.org/play?#code/PTAEkTCAlBXA7Qeo0OoMgzBkM-Kg7BkFsMgfhkB0M6AZAewHMBnQcwZAFX0BzzQaMjAYhkD8GQTQYAoAS1gBcBTAJwBmAQwDGvUAAlSEgN5tQi0BwAmALlCxoAWwBGA0AB9QZbvy4kA3AqUA3YQBtovDafOwrbAL5s2guKLcHESwoNxEAPK6AFa8gQBi-ETaBBymABQOadwa0iS8ANoAugCUGrIFANbKoW4WRpo6+vxFrmYWXqDySqD8vNzQ-KFZpgB0fSrQ4unpYqIANF3KKov2ThJeJaAAvAB8XTY9inMFqkU7oGvO1kdKfQNDoHM3Sl6Lsp3CZF1VNSbtHgaWj0Ala-3cJE21h8vlEIVMoAAFjJUqZcjJihcCoclqoNAByACC+NWjmcBOE+NAbxxsmWBIAQiTLmSXKB8boqTSenS8eyAMLMq5s-GiLnzNhFaxsOGwBFEGIXcJRWIJJIpbLpZH5VHcErWWVkIgOXijBykdIK6IFfFM0psIA)
Zabbixのバージョンとサポート期間と注意事項（2020年版）

日本Zabbixユーザー会の田中です。

Zabbix Advent Calendar 2020の2日目ということで、今年も最新のサポート状況を整理しておきたいと思います。

# 現在のサポート状況

Zabbixのリリースバージョンとそのサポート期限を整理すると以下のようになります。

|バージョン|種類|リリース日|フルサポート終了|リミテッドサポート終了|
|:---------|:---|:---------|:---------------|:---------------------|
|5.2|ポイント|2020年10月27日|2021年04月|2021年05月|
|5.0|LTS|2020年05月12日|2023年05月|2025年05月|
|4.4|ポイント|2019年10月07日|2020年05月|2020年06月|
|4.2|ポイント|2019年04月02日|2019年09月|2019年10月|
|4.0|LTS|2018年10月01日|2021年10月|2023年10月|
|3.4|ポイント|2017年08月22日|2018年02月|2018年03月|
|3.2|ポイント|2016年09月14日|2017年10月|2017年11月|
|3.0|LTS|2016年02月16日|2019年02月|2021年02月|
|2.4|ポイント|2014年09月11日|2016年02月|2016年03月|
|2.2|LTS|2013年11月12日|2017年08月|2019年08月|
|2.0|LTS|2012年05月21日|2015年05月|2017年05月|
|1.8|-|2009年12月07日|-|2014年11月|

**※** 5.2の期限は、5.4が2021年03月にリリースされた場合

サポート期間の長いバージョンは、種類としてはLTSと呼ばれるバージョンです。それに対して、新機能を積極的に盛り込みますがサポート期間が短いバージョンをポイントリリースと呼びます。

1.8、2.0、2.2、2.4、3.2、3.4、4.2、4.4などのポイントリリースは、リミテッドサポートも終了してしまっているので、今後、公式には不具合や脆弱性の問題が修正されたバージョンはリリースされないでしょう。セキュリティ上の問題となる可能性もあるので、早急にバージョンアップをご検討ください。

現時点では、より長期のサポートが提供されるLTSの4.0もしくは5.0を選択されるとよいと思います。サポート期間が短くてもよいので新機能を使用されたい方は、5.2を使用してみてください。

詳細は、以下のURLに記載されています。

- [Zabbix サポート期間とリリースポリシー](http://www.zabbix.com/jp/life_cycle_and_release_policy)


# 最近のリリースでの注意点

## Zabbix 5.2のRHEL 7用パッケージ

Zabbix公式のリポジトリ上では、RHEL 7用のZabbix 5.2のサーバーを構成するために必要なパッケージが公開されていません。先日のZabbix Summitでは遅れてリリースされるとの話もありましたが、結局、サーバー用のパッケージは公開されないことになったようです。
後日、正式に詳細なアナウンスがブログ等でなされると思います。

- [v5.2 packages for CentOS 8 but not CentOS 7 ](https://www.zabbix.com/forum/zabbix-help/413118-v5-2-packages-for-centos-8-but-not-centos-7?p=413551#post413551)

Zabbix 5.2のサーバーをZabbix公式のパッケージを使用して構築するのであれば、RHEL 8(CentOS 8)、Debian 10、Ubuntu 18.04、Ubuntu 20.04のような比較的新しいバージョンのOSを使用するようにしてください。

## Zabbixエージェント2でのUserParameterでの注意

先日、コミュニティの方に問い合わせがあって気づいたのですが、UserParameterでawkを呼び出す際に、$$1とかよく使うと思うのですが、現時点のバージョンでは正常に機能しないようです。
UserParameterでこの条件に当てはまる設定を使用している環境では、Zabbixエージェント2へは、まだ移行しない方がよさそうです。

- [ZBX-17716 : Not possible to use awk with $-sign in UserParameter in agent2](https://support.zabbix.com/browse/ZBX-17716)


## Webインターフェースで言語を変更しても反映されない

Twitterにも投稿しましたが、Debian 10上にZabbixサーバーを構築してWebインターフェースの言語を切り替えても表示される言語が切り替わらないという現象が発生した方がいたようです。

私自身でもいくつかの組み合わせで環境を構築してみたものの再現できなかったのですが、答えを見つけてくれた人がいました。原因は、mod_phpのgettextの処理にmod_perlが干渉してしまって、gettextが機能しなかったようです。
mod_perlのモジュールを無効にすることで機能するとのことでした。

同じような現象が発生してしまっている場合は、有効になっているモジュールを確認してみてください。

- [Problem with changing the language [Debian]](https://www.zabbix.com/forum/zabbix-troubleshooting-and-problems/406728-problem-with-changing-the-language-debian)


# 最後に

今年のZabbix Summit Onlineの動画やZabbix Conference Japanの資料も公開されています。
イベントに参加できなかった方でも、それぞれの情報を参照してみてください。

- [Zabbix Summit 2020 Agenda](https://www.zabbix.com/jp/events/zabbix_summit_2020_agenda)
- [Zabbix Conference Japan 2020 アジェンダ](https://www.zabbix.com/jp/events/conference_japan_2020_agenda)

Zabbix 5.2の新機能や今後のZabbixの開発予定などが多く紹介されています。

Zabbix Conference Japanの発表内では、problemテーブルの肥大化問題と対策とか運用にも役立つ情報が発表されていたりするので、実際の運用にも役に立つと思います。ぜひご覧ください。
Linux シェルスクリプト

#【Linux シェルスクリプト】

##シェルスクリプト 構文

###・if構文

```shell
if コマンド1
　コマンド2
fi
```
###・test構文

```shell
test 条件式
```

###・for構文

```shell
for シェル変数 in 値リスト
do 
   コマンド
done
```

###・while構文

```shell
while コマンド1
do 
   コマンド2
done
```

###・seq 構文

```shell
seq 終了値
seq 初期値 終了値　
seq 初期値 増分 終了値
```
年末に向けてディレクトリやファイルの大掃除を始めよう

現在、エンジニア転職をするため独学でプログラミングを勉強しているのですが、どうもエラーで先に進めない事態になることが多いです。

エラーが積み重なると

「もうプログラミングなんて！！えええええええいい！！！」

心が折れそうになりそうになりますよね。

そこで、いっそのこと最初からやりなおしてみようと思い、ドットインストールで作成したディレクトリをリセットすることに。
その際にしようしたコマンドをまとめたので、エラーがわからなすぎて最初からやり直したい方は参考にしてみてください。

##ディレクトリを探索する

まずはそのディレクトリが本当に消去してもよいかを確認するために、ディレクトリを探索しましょう。

```terminal:ホームに戻る
cd
```

```terminal:lsで表示下ディレクトリに移動する
cd <ディレクトリ名>
```

```terminal:ディレクトリ内のファイル(ディレクトリ)を表示
ls
```
```terminal:現在いるディレクトリのルート表示
pwd
```



##ディレクトリを消去する

```terminal:ファイルを消去する
rm <ファイル名>
```
```terminal:空のディレクトリを消去する
rmdir <ディレクトリ名>
```
```terminal:中にファイルのあるディレクトリを消去する
rm -rf <ファイル名>
```

ここら辺のコマンドを使って、いらないディレクトリを探して、消去してスッキリできます。

##最後に

プログラミング初心者はターミナルを使い始めるところが最初の壁だと思っています。

ですのでその壁を少しでも低くできるように、最初の状態に戻す術は知っておくべきだなと強く思います。

この記事が少しでも参考になれたら幸いです。
【TypeScript】関数定義

#はじめに
前回は[【TypeScript】インターフェースの使い方](https://qiita.com/t_t238/private/5bbb71d817404b49961c)についてアウトプットしました。
今回は**``関数定義``**について学んだことをアウトプットします。

#functionキーワード
``引数``と``return``で返される値に型定義をすることが出来ます。

```javascript

function isDone(flag: boolean): string {
  return "done";
}
```

#無名関数
関数が格納された変数自体に型定義することが出来ます。

```javascript
let add = function(a: number, b: number): number {
	return a + b;
}
```

#アロー関数
上記をアロー関数で置き換えることが出来ます。

```javascript
let add = (a: number, b: number): number => {
	return a + b
}
```

#直ちに値を返す場合は{}とreturnが省略可能
この場合は1行で書くことが出来ます。

```javascript
let add = (a: number, b: number): number => a + b;
```

#オプショナルなパラメータ
``?``を使うことでそのパラメータはオプショナル扱いとなり、関数の呼び出し時に引数を省略することができます。
オプショナルな引数は必ずオプショナルではないすべてのパラメータの後に付ける必要があります。

```javascript
function buildName(firstName: string, lastName?: string) {
    if (lastName) {
        return firstName + " " + lastName;
    } else {
        return firstName;
  }
}
let result1 = buildName("Taro");                  // => OK!!
let result2 = buildName("Taro", "Yamada", "Yamada");  // => error
let result3 = buildName("Taro", "Yamada");         // => OK!!

```

#デフォルトパラメータ
引数の値が未入力の場合のデフォルト値を設定出来ます。


```javascript
function greet(name: string = '太郎さん') {
  console.log(`Hello, ${name}`);
}

greet('Qiita');  // => 'Hello, Qiita'
greet();  // => 'Hello, 太郎さん'

```

#参照
[TypeScript Handbook : Functions](https://www.typescriptlang.org/docs/handbook/functions.html)
AWS Alexa資格に合格しました

# はじめに
今日（11/30）「AWS Certified Alexa Skill Builder - Specialty」資格（以降AXS）に受かりました。
Alexaの開発を業務でやっている人はあまりいないかもしれませんが、試験としてはあまり難しくないので、頭の体操としては良い経験になったと思います。
誰かの役に立てば幸いです。

ちなみにAlexa資格は2021年3月末をもって終了となるようなので、欲しい人はお早めに。

https://aws.amazon.com/certification/coming-soon/?nc1=h_ls

※過去の記事
[AWS SAAに受かった話](https://qiita.com/kkino1985/items/85bcfa50686fcfe69c56)
[AWS SOAに受かった話](https://qiita.com/kkino1985/items/295509d3d94c726ae56a)
[AWS DVA(とCLP)に受かった話](https://qiita.com/kkino1985/items/8f3db5e102876cca47b1)
[AWS SAPに受かった話](https://qiita.com/kkino1985/items/7ad6bcdde44a2b4e4916)
[AWS SCSに受かった話](https://qiita.com/kkino1985/items/7182ada488b60d196ec5)
[AWS ANSに受かった話](https://qiita.com/kkino1985/items/1976c5a55f4047dc5385)
[AWS DBSに受かった話](https://qiita.com/kkino1985/items/25e9e19e6a83b6f0161f)
[AWS DASに受かった話](https://qiita.com/kkino1985/items/37fb7c7396c23f9f0f7c)

# 獲得スコア
|受験日|スコア/合格点/満点|結果|
|:--|:--|:--|:--|
|2020/11/30|873/750/1000|合格|

試験中はあまり自信なかったですが、思ったより取れました。

# 勉強に使った教材
## Alexa道場
AlexaはBlackbelt等の資料が無くなかなか勉強しにくかったですが、AWS公式の下記ウェビナーがかなり役に立ちました。
（Alexa開発の基本的な部分を解説しているウェビナーですが、試験自体も基本的なことしか出ないのでそのまま試験対策になる、というイメージです）

Alexa道場ガイダンス
https://developer.amazon.com/ja-JP/alexa/alexa-skills-kit/get-deeper/webinars

上記以外だと、公式の模擬試験とサンプル問題も実試験に近い形式なので、解説も含めて普段以上に読み込んでおくと良いと思います。

# 試験の所感
- 難易度はLinuc(LPIC) Lv1ぐらい
    - コマンド入力問題が無い分それよりも低いかも
- Alexaを開発する上での基本的な用語を理解しているかが問われる
    - インテント
    - サンプル発話
    - 呼び出し名
    - スロット
    - ダイアログ
    - セッションアトリビュート（永続アトリビュート）
    - などなど
- AWSのサービスについても問われるが、Lambdaについては多少細かい程度
- 意図したインテントや発話が呼ばれない場合の対処
    - デバッグ方法（インテント履歴やCloudwatchの見方など）
    - ビルドインのスロットが提供されているが、足りない場合は追加も可能
- 構成としては、「ユーザー→Alexa→スキル（Lambdaなど）」
    - Lambda以外を使う場合は、構成要件を満たす必要がある（HTTPSで通信を暗号化する等）
    - スキル関連のオブジェクト（画像等）はパブリックに公開（読み取り）する必要がある
- Alexaタイムアウト問題
    - Lambdaを使っている場合はLambdaのタイムアウト問題もある（いつもの）
- オーディオファイルの制約
    - 使えるのはMP3のみだが、MP3の中でも制約がある（ビットレートなど）
- スキル開発～リリースの流れ
    - リリース時には認定があり、必要な機能が含まれているか、Alexaのポリシーに違反していないかなどを審査される
    - 基本的には公開済みのスキルを直接修正することはできない（緊急のバグ修正などは例外）
- 試験が始まった2019年当時と2020年現在では、Alexaホスティングスキルの制約が変わっている
    - 今回の試験では出なかったが、おそらく2019年の制約が適用されているはず
    - 使用可能言語：node.jsのみ（2019年）→今はPythonも利用可能
    - 永続アトリビュート保存先にS3しか使えない（2019年）→今はDynamoDBも利用可能
shutdownとrebootの違い

## 勉強前イメージ

同じような気がするけど、rebootはなにかのプロセスが上がったままとか？
なんかそんな気がする....

## 調査

### shutdown コマンド

よく、 `shutdown -h now` で使用したりする
サーバの電源を切るためのコマンド
ログインしているユーザに再起動のアナウンスがある

- shutdown -h now

よく使うコマンド。
今すぐシステムをシャットダウンする

- shutdown -r now

`-r` オプションを使うことによって、再起動がかかる

- shutdown -h 22:00

22:00に停止するように時間設定も出来ます

- shutdown -h +1

1分後に停止するように設定が出来る

- shutdown -r 22:00

もちろん再起動のコマンドも時間設定出来ます。

- shutdown -c

時間設定のシャットダウンの設定をキャンセルします

### reboot コマンド

サーバを再起動するためのコマンド
`shutdown -r now` でも同じ動作になる
shutdownとは異なり、ログインしているユーザに再起動のアナウンスがない

### shutdownとrebootの違い

再起動のアナウンスがあるかどうかが大きな違い
基本的には最終的に電源が落ちるか、再度システムが立ち上がるかが違うようである。

## 勉強後イメージ

調べたけどあんまりふわっとしてて理解できなかった....元々分かってたくらいの感じ。
ちゃんとランレベルとかの調査をしたらもう少し理解が出来たりするのかな？
ただshutdownコマンドに時間設定したりできるなんて知らなかったから勉強になった。

## 参考

- [【 shutdown 】コマンド――タイミングを指定してシステムを終了する](https://www.atmarkit.co.jp/ait/articles/1701/19/news012.html)
- [【 reboot 】 システムをすぐに再起動する](https://xtech.nikkei.com/it/article/COLUMN/20060227/230868/)
- [shutdownコマンドについて詳しくまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-shutdown)
- [shutdown - システムを終了する - Linuxコマンド](https://webkaru.net/linux/shutdown-command/)
- [reboot - システムをすぐに再起動する - Linuxコマンド](https://webkaru.net/linux/reboot-command/)
Pythonで〇〇が立った！〜scipyで慣性モーメント最小化問題を解く〜

teratailの質問回答で、図形が立つとは何ぞや、という質問に答えてみましたので、一般化して記録しておきます。

皆さんおなじみの左のような絵、走っている状況であるのと漫画風のデフォルメが効いているので、自然に感じます。しかし、真ん中のように2値化してみると、漫画効果が薄れて、なんだかバランスが悪く、倒れてしまいそうに感じます。それを、右のように「立たせる」ための角度を、理論的に求めて、立たせてみよう、という試みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156600/37ed815d-d4b2-b9a4-2298-b9be83687b88.png)

アイデアは次のようなものです。

+ まずは図形の重心が中心になるように並行移動する
+ そのあと、中心を軸に回転させて、最も「バランスよく立った」状態にする
+ 「バランスよく立った」を、中心縦軸を固定して「まわした」時の慣性モーメントが最小になる、と定義する

慣性モーメントを最小化することで、左右をなるべく縮めた位置が求められます。結果的に図形が「立つ」ことになります。フィギュアスケートの選手が、腕をたたむことで、安定して高速回転できるのと、原理は同じです。

重心を求めること、並行移動、回転、目的関数の最小化にはPythonの数値計算ライブラリであるscipyの関数を使いました。scipyの勉強にもなりますね。目的関数である慣性モーメントを算出する部分のみnumpyで手作りしました。なお、上の図はレイアウトの関係上縦長の枠にしていますが、実際に計算した図形は、回転してはみ出さないように、ほぼ正方形を枠としています。

以下がコードです。-14.12度ほどの回転をさせることで、気持ちよく「立たせる」ことができました。

```Python
import numpy as np
from scipy import ndimage, optimize
import matplotlib.pyplot as plt
import cv2

# 画像読み込みと2値化、白黒反転
img = cv2.imread('sample.jpg', 0)
_, img = cv2.threshold(cv2.bitwise_not(img), 1, 1, cv2.THRESH_BINARY)

# 平行移動して重心を中心にする
center = ndimage.center_of_mass(img)
img = ndimage.shift(img, np.array(img.shape)/2-np.array(center))

# 2値化した図形を表示
plt.imshow(img)
plt.show()

# 図形を立てた時の、中心軸に対する慣性モーメント
# mass:縦軸ピクセル数、radius:中心軸からの左右のピクセル距離
# 慣性モーメント = Σ mass * radius^2
def inertia(img):
    mass = img.sum(axis=0)
    radius = np.abs(np.arange(-len(mass)//2, len(mass)//2+1))
    if len(mass) != len(radius):
        radius = radius[radius != 0] - 0.5  # 中心位置の補正
    return (mass * radius * radius).sum()

# 回転させて慣性モーメントを測定する=最小化関数
def rotated_inertia(degree, img):
    return inertia(ndimage.rotate(img, degree, reshape=False))

# 最小化関数の最小値を求めることで、-90〜90度の回転時の最小慣性モーメントを得る
res = optimize.minimize_scalar(
    rotated_inertia, bounds=[-90,90], args=(img), method='Bounded')

# 最小値の時の回転角度を求める
print(res.x)

# 最小値の時の回転を実際に行う
img = ndimage.rotate(img, res.x, reshape=False)

# 「立った」図形を表示
plt.imshow(img)
plt.show()
```
Linux 特殊なシェル変数

#【Linux 特殊なシェル変数】

##特殊なシェル変数まとめ

$$　シェルのPID

$?　最後に実行したコマンドの終了値

$#　引数の個数

$*　区切り文字で区切られた全ての引数（デフォルトは空文字）

$0　実行ファイル名

$1...　1番目の引数、2番目の引数...
Go言語で作成した実行ファイルをEC2でデーモンとして実行する

# 概要
Go言語でbuildした実行ファイルをEC2上に配置しdeamon化します。
そうして、EC2の起動時に自動的にGoでビルドしたWebサーバを実行させます。

### 経緯
Go言語+GinでビルドしたWebサーバをEC2上で構築していたのですが、
EC2の起動時に自動実行されなかったのでいろいろと試した結果、デーモン化しinit.dで自動起動させました。

### 1 ビルドした実行ファイルのデーモン化
```

ディレクトリ
/etc/systemd/system/サービス名.service

[Unit]
Description=説明文

[Service]
User=root
Group=root
WorkingDirectory=ディレクトリ
ExecStart=ディレクトリ/実行ファイル名
Restart=always
KillMode=process

[Install]
WantedBy=multi-user.target
```

サービスの確認
> systemctl status サービス名.service
> systemctl start サービス名.service
> systemctl stop サービス名.service

上記でサービスの起動が出来たらデーモン化は完了です。

###2. init.dでサービスの自動起動を設定 

```

ディレクトリ
/etc/int.d/app_start
--------------init.d 内容-------------------------
#!/bin/sh
# chkconfig: 2345 99 10
# description: deamon wakeup scrupt

case "$1" in
 start)
       date >> /home/user/start.txt
       echo "start!" >> /home/user/app_start.log
       sudo sh /home/user/scripts/application_start_server.sh
       ;;
 stop)
       echo date >> /home/user/app_stop.log
       sudo sh /home/user/scripts/application_stop_server.sh
       ;;
  *) break ;;
esac

```
application_start_server.sh の部分は直接コマンドを書いても良いですし、
今回はシェルスクリプトを実行させました。
（サービスの起動・停止時に時間をファイルに出力しています。）

### 3 確認
EC2を再起動しサービスが正常に起動していれば完了です。

## 所感
インスタンスの再起動は物理マシンの起動と挙動が違うので、
その辺りが原因でバッチ処理ではうまく動かなかったのだと考えています。
scikit-learnのr2_score関数の取りうる範囲に関するメモ

#はじめに
scikit-learnでR^2を計算した結果をそのまま出力していたのだが、R^2にしてはマイナスの値が大きくない？というつっこみがあったのであらためて調べてみた。


#scikit-learnのR^2(r2_score関数)定義

ソースを見てみる。
https://github.com/scikit-learn/scikit-learn/blob/0fb307bf3/sklearn/metrics/_regression.py#L499

重みなどいろいろ複雑な処理がはいっているが、定義はよくある以下の数式のようだ。

```math
1 - \sum{(y-\hat{y})^2} / \sum{(y-\bar{y})^2} 
```

ちなみに、データ数が1の場合、定義からも分かるように、後ろの項の分母が0になるため計算できない。

#とりうる値
では、このr2_scoreのとりうる値について考えて見よう。
最大値は定義から1である。
最小値はということ、$y$ と$\hat{y}$ の差を大きくすれば、後ろの項の分子はいくらでも大きくできるため、ものすごく大きなはずれ値があれば、いくらでもマイナスになりそうだ。

#やってみよう

まずは同じ値を持つ者同士を引数に。

```python
>>>from sklearn.metrics import r2_score
>>>r2_score([1,2,3,4,5],[1,2,3,4,5])

1.0
```

ちょっとだけ変えてみる。

```python
>>> r2_score([1,2,3,4,5],[1,3,3,3,5])
0.8
```

全然違うものにしてみる。
おっと、いきなりマイナス。

```python
>>> r2_score([1,2,3,4,5],[5,4,3,2,1])
-3.0
```

めっちゃでかいはずれ値を入れる

```python
>>> r2_score([1,2,3,4,5],[100,4,3,2,1])
-981.5
```

なるほど、いくらでもマイナスはとれそうだ。


#おわりに
これで次回から「scikit-learnの関数の仕様です」と胸をはっていえそうだ。
はじめてのRaspberry Pi

ちょっとやりたいことがあって、はじめてRaspberry Piを買いました。
最初が大変じゃないかって敬遠してましたが、とても簡単でしたので、まとめてみました。

##パーツの購入
今回は、最初なんで、面倒なのでキットを購入しちゃいました。

amazonで、raspberry pi zero wh のセットを買いました。
https://www.amazon.co.jp/gp/product/B07GYRVHJ9/ref=ppx_yo_dt_b_asin_title_o00_s00

入っていたものは下記です。
・本体
・ケース
・ヒートシンク
・microSDカード３２GB
・ACアダプター
・USB電源ケーブル（スイッチ付）
・USB OTGアダプタ―（Aをmicro-Bに変換）
・HDMIケーブル（フル＝ミニ）

自分の都合で追加で買ったもの。
・HDMIフル＝ミニ変換アダプタ
→自分の持っているモバイルモニターはミニHDMIだったので、ミニ＝ミニにしないといけなかった・・。

##OSのインストール
Raspberry Pi imager ってのが推奨のようです。
これが簡単でした。
https://www.raspberrypi.org/software/

自分はMacなんで、ダウンロードしてインストール。
起動して、OSと書き込み先のSDKカードを選べばOK。
それだけです。簡単。
![スクリーンショット 2020-11-30 14.38.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/0483a6d6-1014-af77-37c2-91bd8891f51a.png)


##組み立てと起動
本体をケースに入れ、ヒートシンクを貼り、SDカードを入れて、キーボードとモニターをつないで、スイッチON！
USBポートが1つしかないので、とりあえずキーボードで接続。TABキー、SPACEキーを駆使して作業(^^)

ここスクショを取り忘れました。
なので、スクショが、下記サイトをご紹介しておきます。ありがとうございます。
https://studio.beatnix.co.jp/kids-it/hardware/raspberry_pi/raspberry-pi-imager/

ソフトウェアアップデートが、そこそこ時間かかりましたね。

##SSHとVNC
基本的には、SSHでつなぎますが、せっかくなんでVNCも使ってみようと思い、下記設定をしました。

[ラズベリーメニュー]->[設定]ー＞[Raspberry Piの設定]の[インターフェース]タブで、SSHとVNCをONにします。
![スクリーンショット 2020-11-30 19.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/cd031491-149e-11fd-8780-c1922e49320c.png)

![スクリーンショット 2020-11-30 19.47.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/da977636-dea5-46a1-f6c2-dcb822414f98.png)

VNCは、接続方法が、「UNIX password」になっているので、これを、「VNC password」にします。
パスワードを聞かれますので、いい感じに設定します。
![スクリーンショット 2020-11-30 20.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186659/483135d0-3a88-f7ae-ee94-49cd5649f412.png)

## mDNS設定
DHCP運用ですと、IPアドレスが毎回変わってしまいます。
そこで、mDNSも入れておきます。
MacのBonjourってやつです。

面倒なので、suになっておきます。

```
$ sudo su
```

自分はすでにインストール済みでしたが、入ってない人は、avahi-daemonを入れます。

```
# apt-get install avahi-daemon
```

必要ならホスト名を変更します。

```
# vi /etc/hostname
```

SSHサービスを登録します。

```
# vi /etc/avahi/services/ssh.service
```

内容↓

```
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">

<service-group>
  <name replace-wildcards="yes">%h</name>

  <service>
    <type>_ssh._tcp</type>
    <port>22</port>
  </service>
</service-group>
```

デーモンを再起動します。

```
# cd /etc/init.d
# ./avahi-daemon restart
```

##疎通確認

### SSH

```
$ ssh pi@raspberrypi.local
```

### VNC

Macの場合、「画面共有」アプリでつなぎます。
[移動]->[サーバへ接続]

```
vnc://raspberrypi.local:5900
```

##完成
めでたしめでたし。
[Cocoa][Swift]Cocoa Update

<p>以前のWWDCでは、Cocoaの変更内容を『Cocoa Update』という名称で発表していた。近年では『What's New in Cocoa』という名称で発表されていたが、今年のWWDCのセッションにはCocoaという用語が使われているものがない。Apple Developerサイトを確認しても、Cocoaという用語を見つけることが困難だ。</p>

<p>理由は色々あるだろう。以前はAppleのフレームワークの概念の理解させていということでCocoaという名前で説明していたが、もう、Cocoaという名称で設計思想を啓蒙する必要がなくなったということだろうか。</p>

<p>Cocoaと呼ばれていたフレームワークの基本的な考え方をApple Developerサイトから入手できた『Objective-Cプログラミングの概念（CocoaEncyclopedia.pdf）』の目次から拾ってみる。</p>

<ul>
<li>クラスクラスタ（Class Cluster）</li>
<li>デリゲートとデータソース</li>
<li>インストロスペクション<br />実行時にオブジェクト自身の内部の詳細を調べる機能</li>
<li>オブジェクトの初期化</li>
<li>Model-View-Controllerパターン</li>
<li>オブジェクトモデリング</li>
<li>オブジェクトの可変性</li>
<li>Receptionistパターン<br />キー値監視やKVO通知など</li>
<li>ターゲット - アクション機構</li>
<li>フレームワークの相互乗り入れについて<br />Core FoundationとFoundationとで互換性のあるデータ型</li>
</ul>

<p>WWDC20の『Platforms State of the Union』から、フレームワークの更新に相当するものを抜き出してみる。</p>

<ul>
<li>Apple Silicon<br />たとえば、SDKを提供してる場合はライブラリはXCFrameworkでないと困るはず。</li>
<li>Mac Catalystの進化<br />iOSアプリケーションのmacOS対応の方法の選択肢が増えた。</li>
<li>macOS Big Sur<br />Aquaではなくなった。</li>
<li>Widget</li>
<li>App Clips</li>
<li>SwiftとSwiftUI<br />Cocoaとは異なる概念のものも。</li>
</ul>

<p>もはや、Cocoaという用語が通じない世代の開発者も存在していると思うので、世代間ギャップを感じる。</p>

【関連情報】
<a href="https://qiita.com/advent-calendar/2020/cocoa">Cocoa Advent Calendar 2020</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
オランダ🇳🇱に発つぜ

ヨーロッパに住んでみたいと10代の頃からずっと思っておりました。
ようやく挑戦することができそうなので、発つ前にこの記事を書いています。

# オランダという国

西ヨーロッパに位置する、九州ほどの面積で東京都の人口より少し多いくらいの小さな国です。
日本との時差は8時間ほどです。
英語ではKingdom of the Netherlandsと言います。(低い土地という意味)
ちなみにオランダ人は世界一平均身長が高いです。(男性184cm, 女性171cm)
これで私もノッポ扱いされずに済む…。

# なぜオランダなのか?
1. 日本人はビザが取得しやすい
移民の国で、且つ日本とオランダは400年にわたる交流がある。そう、オランダは江戸時代の鎖国下で欧州諸国で唯一外交関係を維持した国なのです。

2. 非英語圏の国で最も英語が通じる
アメリカ、イギリス、オーストラリア、カナダなど英語が公用語の国を除くと、オランダは世界で一番英語が通じる国です。前述したようにオランダはとても小さい国なので、近隣国とのお付き合いは生き延びるためにも非常に重要なことなため、必然的にそうなったように思います。

3. ヨーロッパの交差点
中世より国際貿易の中心として栄えてきたオランダは、ヨーロッパの要衝に位置しています。
パリやロンドン、ミラノやベネチアまでの飛行時間は2時間以内。週末にフラっと行けます。

#気になるオランダのIT事情
UNICEF子供の幸福度ランキングで一位を取っていることからも分かる通り、非常に子供の教育に力を入れている国です。それはIT学習をいち早く取り入れている点にも表れています。

・オランダでは、98%の家庭が何らかの形でインターネット接続している
・ほぼすべての家庭に、DSLかケーブルによる接続が提供されている
・2016年の統計によると、オランダ企業のほぼ100％がインターネットを使用して仕事をしている。98%はブロードバンド接続である
・16〜74歳のオランダ人の91％がアクティブなインターネットユーザーである
・16〜74歳のオランダ人の75％が基本的なICTスキルを持っている
こういった情報もあります。

また、IT業界で事業展開している企業のうち、フォーブス誌が選んだ上位2000社の中で60％がすでにオランダに拠点を置いています。


#最後に
恐らく大半の人に取って全く馴染みのない国であるオランダのことを、少しでもわかってもらえたら嬉しいです。
しかしこうやってみるとこの国、イケてますなぁ〜:relaxed: (記事執筆時点でまだ行ったこともないけど)

そして、デジタルクエストの皆様、3年間大変お世話になりました。
Dank je wel!(オランダ語でありがとう)
DockerHub pull制限の動向と対策について

[Ateam Lifestyle Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ateam-lifestyle)の3日目は 株式会社エイチームライフスタイルの @dabits が担当します。

2020年11月よりDockerhubの規約が変更になり、その兼ね合いでDockerhubからのpull回数に時間あたりの制限が加わることとなりました。
dockerが浸透した弊社においても一部その影響を受ける箇所があり、調査/対応を行いましたのでご紹介します。

## 2020年11月からのpull制限内容

2020年11月からのDockerhubにおけるpull可能回数は以下の通りの区分に変更されました。

* 非ログインユーザ : 100回/6時間 (IP毎)
* ログイン済無償ユーザ : 200回/6時間
* pro/teamプランユーザ : 無制限

同一IPにおいて非ログインユーザとログイン済みユーザが混在する場合、それぞれのpull回数は個別にカウントされるため、
例えば非ログインユーザとログイン済み無償ユーザがそれぞれ1名ずつ同一IPで利用している場合、合算300回/6時間まで利用できることになります。

なおこの上限を超えてpullを行った場合、Dockerhubのサーバからは`429 Too Many Requests`のレスポンスが帰ってきて、当面の時間pullが実施できなくなります。

## 現在の制限値確認方法

以下の手順でシェル上でコマンドを実行することで、現在のIPもしくはアカウントにおける制限値を確認することができます。
なお、手順2を実行した時点でpull 1回を行ったのと同等のカウントがなされるためお気をつけください。

### 1.匿名or非匿名でのtokenを取得する

* 匿名の場合

```bash
$ TOKEN=$(curl "https://auth.docker.io/token? 
service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)
```

* アカウントをお持ちの場合

```bash
$ TOKEN=$(curl --user 'username:password' "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)
```

### 2.現在の制限値を取得する

```bash
$ curl --head -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest 2>&1 | grep RateLimit
```

## 制限緩和方法

大きく分けて3つほど対応方法があります。

### a. サービス提供各社が提供する方法に従う

サービス提供各社が独自の対応をとっている場合があり、その方針に従うケースです。
以下の主要なクラウドサービスでは、それぞれ対応方法を案内しています。

* クラウドサービス
  * AWS : [有償アカウント若しくはECRの使用を推奨](https://aws.amazon.com/jp/blogs/containers/advice-for-customers-dealing-with-docker-hub-rate-limits-and-a-coming-soon-announcement/)
  * GCP : [有償アカウント若しくはContainer Registryの利用を推奨](https://cloud.google.com/blog/ja/products/containers-kubernetes/mitigating-the-impact-of-new-docker-hub-pull-request-limits)
* CI/CDサービス
  * Github Actions : [非公式情報では問題なし](https://qiita.com/tippy/items/2972b01ff484616bf6ed)
  * Circle CI : [当座は問題なし](https://discuss.circleci.com/t/dockerhub-2020-11-pull-circleci/37367/13)
  * Gitlab CI : [Saasは原則ミラー、SelfHostedはミラー経由を推奨](https://about.gitlab.com/blog/2020/10/30/mitigating-the-impact-of-docker-hub-pull-requests-limits/)

### b. ミラーサーバを構築し、それをハブにして利用する

* [Gitlab CIのBlog記事記載](https://about.gitlab.com/blog/2020/10/30/mitigating-the-impact-of-docker-hub-pull-requests-limits/)に通り、ミラーサーバを構築してそれをハブにすることである程度制限を緩和することができます。

### c. Dockerhub pro/team planに加入して制限を撤廃する

* Dockerhubからの公式発表通り、有償プランに加入することでpull制限を撤廃することができます

## 対応事例/最後に

弊社では上記緩和方法のうち、cを適用して自社内CI/CDサーバに有償アカウントのtokenを割り当てることで制限の緩和を実施しております。

Dockerhubに限らず、サービス提供各社ともに対応方針が流動的に動いているため、今後も対応方法が流動的に変化する可能性があります。
業界動向を見守りながら引き続きコンテナ技術の浸透に従事する予定です。

なお、本記事は私が調べた範囲の情報のみになりますので誤情報が含まれるかもしれません。その際はぜひ編集リクエストをいただけるとありがたいです。

## 参考記事

* [Dockerhub Understanding Docker Hub Rate Limiting](https://www.docker.com/increase-rate-limits)
* [Docker docs Download rate limit](https://docs.docker.com/docker-hub/download-rate-limit/)
Backlog APIで使うuserIdは何を使う？

# Backlog APIではよくuserIdを使う

例えばユーザー情報を取得する場合
> **URL**
> `/api/v2/users/:userId`
> [ユーザー情報の取得 | Backlog Developer API | Nulab](https://developer.nulab.com/ja/docs/backlog/api/2/get-user/#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E6%83%85%E5%A0%B1%E3%81%AE%E5%8F%96%E5%BE%97)

userIdの説明は**ユーザーのID**となっている。

|パラメーター名|型|内容|
|:--|:--|:--|
|userId|数値|ユーザーのID|

# userIdの候補
初めてBacklog APIを使うときに悩む。

## [個人設定]画面にある「ユーザーID」
![スクリーンショット 2020-11-28 6.39.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/a8dfd708-6875-99ef-d273-5bbe85f084df.png)

## Backlog APIでとれる「userId」
```zsh
% curl https://xx.backlog.jp/api/v2/users/myself?apiKey=ponsukeNoApiKey
{"id":102345,"userId":"t-ponsuke", # <<< これ
```

## Backlog APIでとれる「id」
```zsh
% curl https://xx.backlog.jp/api/v2/users/myself?apiKey=ponsukeNoApiKey
{"id":102345 # <<< これ
```

# 使うのはBacklog APIでとれる「id」
「ユーザーのID」なのでユーザー情報で取れるIDなんだと思う。

```zsh
# Backlog APIでとれる「id」を指定するとユーザー情報が取れた
% curl https://xx.backlog.jp/api/v2/users/102345?apiKey=ponsukeNoApiKey
{"id":102345,"userId":"t-ponsuke","name":"ぽんすけ太郎","roleType":1,"lang":"ja","mailAddress":...
```
Redmineのチケット情報をAPIを用いて取得する方法 with GAS

Redmineのチケットのうち自分に関係のあるチケットを抽出・管理したいと思い、GoogleAppsScriptを用いて整理ツールを作成しました。
そのときに使用したAPIの書き方を紹介します。

## チケットの一覧を取得
以下のようにAPIを実行することで、指定した検索条件に一致するチケット一覧が取得できます。

```
[ドメイン名]/issues.json?[検索条件]&key=[APIキー]
```

私はRedmineに登録しているクエリを指定してチケット一覧を取得しています。
取得したデータはJson形式で取得されるため、変換してあげることで連想配列として情報を取得することが可能です。

```
let res = UrlFetchApp.fetch("[ドメイン名]/issues.json?query_id=[クエリID]&key=[APIキー]");
let ticketJson = JSON.parse(res.getContentText());
let ticketList = ticketJson["issues"];
for(var i = 0; i < ticketList.length; i++) {
    console.log(
        ticketList[i]["id"]                      // チケットID
        + ticketList[i]["project"]["name"]       // プロジェクト名
        + ticketList[i]["tracker"]["name"]       // トラッカー名
        + ticketList[i]["status"]["name"]        // ステータス名
        + ticketList[i]["priority"]["name"]      // 優先度名
        + ticketList[i]["subject"]               // 題名
        + ticketList[i]["assigned_to"]["name"]   // 担当者名
        + ticketList[i]["fixed_version"]["name"] // バージョン名
        + ticketList[i]["created_on"]            // 作成日時
        + ticketList[i]["updated_on"]            // 更新日時
        + ticketList[i]["due_date"]              // 期日
        + ticketList[i]["description"]           // 説明
    );
}

```


## チケットの詳細を取得
前項で取得したチケット一覧には「関連チケット」や「注記」の情報が含まれていません。
そのため、以下のAPIを実行することで、該当チケットの詳細を取得することができます。

```
[ドメイン名]/issues/[チケットNo].json?include=attachments,journals&key=[APIキー]
```

一覧を取得した後、詳細が必要なチケットはfor文で1つ1つチケットの内容を確認し、情報の整理を行っていきました。

```
let res = UrlFetchApp.fetch("[ドメイン名]/[チケットNo].json?include=attachments,journals&key=[APIキー]");
let ticketInfoJson = JSON.parse(res.getContentText());
let ticketInfo = ticketInfoJson["issue"];
if(ticketInfo["relations"] != null) {
    // 関連チケットの取得
    var relationText = "";
    for(var j = 0; j < ticketInfo["relations"].length; j++) {
        relationText = relationText + "," + relationList[ticketInfo["relations"][j]["relation_type"]] + " #" + ticketInfo["relations"][j]["issue_id"];
    }
    // データ保存処理
}
if(ticketInfo["journals"].length > 0) {
    // 注記の取得
    var commentText = "";
    for(var j = 0; j < ticketInfo["journals"].length; j++) {
        if(ticketInfo["journals"][j]["notes"] != null) {
            commentText = commentText + "\t" + ticketInfo["journals"][j]["notes"];
        }
    }
    // データ保存処理
}
```

## 参考資料
[Redmine API](https://www.redmine.org/projects/redmine/wiki/Rest_api)
DeNA 20 新卒 Advent Calendar 2020が始まります🙌【＋専用アプリの紹介】

# はじめに
今年もDeNA 20 新卒 Advent Calendarが始まります🎉
去年から始めた新卒同期でのAdvent Calendar、前回は内定者として参加した20卒が今年は新卒1年目として参加します。去年の参加メンバーの多くが今年も参加してくれています。見比べてみると面白いかもしれません。
今年もTwitterハッシュタグは #DeNA20AdCal です。感想などはハッシュタグをつけてTweetしていただけると嬉しいです！

▼去年のカレンダーはこちら
[DeNA 20 新卒 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/dena-20-shinsostu)

▼去年のまとめモーメント
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">1/4の集計締め切りで、正式にQiitaのAdvent CalendarでDeNA 20 新卒カレンダーが<br>・購読者数、企業で9位<br>・いいね数、全体で3位、企業で2位<br>とランクインしました🎉<br><br>1ヶ月本当にありがとうございました。<br><br>下記はカレンダーの反応を含めたまとめです🙌<a href="https://twitter.com/hashtag/DeNA20AdCal?src=hash&amp;ref_src=twsrc%5Etfw">#DeNA20AdCal</a><a href="https://t.co/VHc2ShwpiF">https://t.co/VHc2ShwpiF</a></p>&mdash; naro 20新卒のエンジニア (@naro143) <a href="https://twitter.com/naro143/status/1214184772013977600?ref_src=twsrc%5Etfw">January 6, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 同期カレンダーを企画した理由
去年の[なぜDeNA 20 新卒 Advent Calendar 2019を企画したのか【＋専用アプリの解説】](https://qiita.com/naro143/items/827059d52527efb4f978)の記事に書いた内容の繰り返しになります。

> 「内定者で何かをしたい！」という思いと、「採用に貢献したい！」という思いが合わさった結果です。
この企画は来年で完成するもので、

> 👨‍🎓内定者のカレンダー
👩‍💻新卒のカレンダー
👨‍💻社員のカレンダー
の3つを作成することで

> 👨‍🎓内定者のカレンダー: どういう人が入社するのか
👩‍💻新卒のカレンダー: 1年後の成長度、成長環境
👨‍💻社員のカレンダー: 2年以降のキャリア

> を一部ですが表現でき、DeNAという会社のことをより知ってもらえる機会になると考えました。
学生にとっては、どういう人が入社し、1年後の成長、その後のキャリアが見えるのは非常に有益な情報になると考えてます。
採用イベントで知ることが可能ですが記事という、より自然体で個人の思想がでる媒体での情報から感じ取れるものがあると私は思ってます。（就活中は各社の技術ブログはチェックしてました）

> 以上のような思いから企画をしました。

> また、今回は「内定者vs社員！？」という企画をしたように、普通のカレンダーとは違う楽しみ方を提供できると考えています。

去年の記事で書いた通り、内定者のカレンダー、新卒のカレンダー、社員のカレンダーの3つがあることでDeNAという会社のことをより知ってもらえる機会になると考えました。今年は20卒同期は新卒として執筆していきます。ただ、去年と同じく「自由に書く」をテーマにしたため「1年後の成長度、成長環境」というよりは「個人の興味、関心、学び」という記事が多いのでご了承ください。（20同期の輪読会での学びの記事など同期ならではの記事も多少あります。）

# 今年のDeNAは3つカレンダーがある！
👨‍🎓内定者のカレンダー
👩‍💻新卒のカレンダー
👨‍💻社員のカレンダー
の3つが揃いました🎉（なんと21卒カレンダーもあります！）
是非、ご覧ください。購読登録をすると通知されるので便利です。

▼DeNA社員の方のカレンダー👨‍💻
[DeNA Advent Calendar 2020](https://qiita.com/advent-calendar/2020/dena)

▼DeNA20新卒のカレンダー👩‍💻
[DeNA 20 新卒 Advent Calendar 2020
](https://qiita.com/advent-calendar/2020/dena-20-shinsotsu)

▼DeNA21内定者のカレンダー👨‍🎓
[DeNA 21 新卒 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/dena-21-shinsotsu)

また、 [DeNA 公式 Twitter アカウント @DeNAxTech](https://twitter.com/DeNAxTech) では記事だけで無く色々な勉強会での登壇資料も発信してますので、ぜひフォローしてご覧ください🙌
<a href="https://twitter.com/DeNAxTech?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-size="large" data-lang="ja" data-show-count="false">Follow @DeNAxTech</a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 専用アプリ！
PWAで簡易的なサイトを作成しました。LGTM数のグラフや毎日の記事が表示されます。
https://vs-dena-advent.naro143.com/

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222499/200c285b-37ea-b1bf-c781-b2244a13e9c4.png" width=300 />　<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222499/f2432db1-b8d7-2b1f-3e9d-da9254f9bac3.png" width=300 />


# 今年もDeNA 20 新卒 Advent Calendarをよろしくお願いします！
3DスキャンしたデータをUnityでみーる

# はじめに
3D Scanner AppでスキャンしたデータをUnityで見てみましょう

# 開発環境
- Windows 10 PC
- Unity 2019.4.1f1 

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">プライムデーで安かったので、予備PC<br>【基本スペック】<br>OS：Windows 10 Home 64bit、CPU：インテル Core i7-9750H、GPU：NVIDIA GeForce GTX 1650 Ti Max-Q デザイン 4GB GDDR5、メモリ：16GB（8GB ×2）、SSD：512GB、液晶パネル：15.6インチ、フルHD（1,920×1,080）、リフレッシュレート120Hz <a href="https://t.co/S8RIsayFPY">pic.twitter.com/S8RIsayFPY</a></p>&mdash; 藤本賢志(ガチ本)@pixivFANBOXはじめました (@sotongshi) <a href="https://twitter.com/sotongshi/status/1317758401946947591?ref_src=twsrc%5Etfw">October 18, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- iPad Pro もしくは iPhone 12 Pro 
- 3D Scanner App （スキャンアプリ）

# スキャンしたデータをUnityで見る
1．LOW RESでスキャンし、All Dataでエクスポートする

| 1 LOW RES| 2 All Data| 3 このiPhone内| 4 Save to Files|
|:--|:--|:--|:--|
|![129478441_296394731721157_1823947785055561488_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/990bd676-cf34-dfe2-29c9-61d793c88529.jpeg)|![129097609_3116913878409944_6030272060197824665_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/d6634146-a273-fde5-cb1e-e5f8a49086bd.jpeg)|![129280361_393602245216674_1946086510496454770_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/3b548ff7-6457-e2f9-4a74-6dc95d8619d8.jpeg)|![129443777_1009610712868404_2148449614996122316_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/523b7f42-e05c-1989-0df7-d0707a4d17f2.jpeg)|


2．エクスポートしたモデルはUSBで接続してPCへ取り込む

iTunesを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/1b0ec164-1023-7d74-8d05-8a0fccbc0e68.png)

3D Scanner Appから対象のデータをクリックし、保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/a1949bdc-58f1-0816-fb16-eed7e3d1be73.png)


3．エクスポートしたデータのファイル構成は下記

| | |
|:--|:--|
|textured_output.jpg | 3Dモデルのテクスチャ |
|textured_output.obj | テクスチャ付き3Dモデル | 
|textured_output.mtl | 3Dモデルのマテリアル |
|info.json | バージョンや頂点数など | 
|export.obj | テクスチャなし3Dモデル |
|frame_xxxxx.json | カメラ情報など |
|frame_xxxxx.jpg | カラー画像 |
|depth_xxxxx.png | 深度画像 |
|thumb_00000.jpg | サムネイル画像 |

4．Unityでプロジェクトを作成する

5．textured_output.objおよびtextured_output.jpgをProjectビューのAssets以下にD&Dする（名前を2f1とした）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/c662417b-5ce1-76e6-af7b-ac751d4b2e83.png)

6．Assets->2f1（3Dモデル）をHierarchyビューにD&Dする。2f1->defaultのInspectorビューを開き、Assets->2f1（テクスチャ）をAdd Componentの付近にD&Dすると色が付く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/587618f5-e9c5-b529-b27d-4cd9a8f8bf9e.png)
NetApp上でパケットキャプチャを行う方法

はじめに
-------------
NetApp上でパケットキャプチャを行う方法についての手順メモです。
NetApp ONTAP 9.6で確認をしております。

①実行コマンド
----

### NetApp上でパケットキャプチャの取得開始

```
network tcpdump start -node ノード名 -port ポート名
※ノード名、ポート名は取得対象のSVMのLIFが割り当てされているもの
```

### NetApp上でパケットキャプチャの取得終了

```
network tcpdump stop -node ノード名 -port ポート名
```

### 取得したキャプチャファイル名の確認
```
network tcpdump trace show
```

②パケットキャプチャ ログファイルのダウンロード
----
ブラウザで以下を開く

```
http://管理用LIFのIP/spi/
```
「File Access Links」の「logs」をクリックする。
「packet_traces」をクリックして「取得したキャプチャファイル名の確認」で
確認したファイル名をクリックしてダウンロードします。


パケットキャプチャ ログファイルの確認方法
----
取得したファイルは、Linuxのtcpdumpログファイルと互換性がありますので
Wiresharkで読み込ませることが可能です。
Wiresharkでキャプチャログファイルを開いて内容を確認します。
Platypus(遺伝的アルゴリズム)で整数と実数を一緒に使う魔法の呪文

##Platypusで整数と実数を同時に使うと

`Platypus`で、整数を使う時は`Integer`、実数を使う時は`Real`を使って設定をしますが、両方を一緒に使うと次のエラーが出ます。

`PlatypusError: must define variator for mixed types`

なんか、`variator`を定義しなさいと言うのですが、日本語のサイトには情報がありません。皆さんどちらかだけを使った例を書いています。
でも、実際には、整数と実数が混ざって使いたいことはよくあると思うのですが、エラーが出てどうしようもありません。

##Platypusに書く魔法の呪文

いろいろ探していたら元々の`Github`の英語のサイトに答えがありました。

https://github.com/Project-Platypus/Platypus/issues/31

いろいろ書いてあるのですが、たぶんこれを`algorithm`の中に書くだけで動くようです。
`variator=CompoundOperator(SBX(), HUX(), PM(), BitFlip()`

これで、整数と実数が使えるようになります。

このプログラムは、そこのサイトにあったプログラムです。

```Python

from platypus import *

def mixed_type(x):
    print("Evaluating", x)
    return [x[0], x[1]]

problem = Problem(2, 2)
problem.types[0] = Real(0, 10)
problem.types[1] = Integer(0, 10)
problem.function = mixed_type

algorithm = NSGAII(problem, variator=CompoundOperator(SBX(), HUX(), PM(), BitFlip()))
algorithm.run(10000)

print("Final solutions:")
for solution in unique(nondominated(algorithm.result)):
    print(solution.variables, solution.objectives)
```
JavaScript 型確認方法 (急がしい方向け)

## 型確認 / JAVASCRIPT

型確認方法をどうやるのか？
たくさん情報がありすぎて時間を食われないように、すぐにハンズオンできる簡単な方法を提示します。

| コード                                        |      内容      |
| --------------------------------------------- | :------------: |
| typeof([型を調べたい値])　※別の記法もあります | 型の確認を行う |

※　別記法：typeof　[型を調べたい値] 

### 動作確認をしていきましょう！

最初にコードの出力結果を見てみましょう！

```javascript
typeof(1) =>  number
typeof("1") =>  string
typeof("文字") => string
```

上記の結果から、数値の場合には「number」、文字列の場合には「string」が出力されます。

様々な型が存在しますので、実際に手を動かして挙動を見てみましょう。
:warning: typeofでは配列・nullなどはobjectクラス型にひとくくりで出力されるようなので、その場合はObject.prototype.toString.call() を使って見てください。


現状で全てを学習するのは時間効率悪い為、使う時が来て勉強する必要があると感じた時に更新しようと思います。

深く勉強する必要がない人は、現状はtypeofかObject.prototype.toString.call()のどちらかを必要な時に使うということを覚える程度でいいかもしれないですね。

☆結論: 型確認したい時はtypeofかObject.prototype.toString.call()の使い方を調べて、実際にコンソールで型確認。　おわり。

もし気になる方は、良い勉強になりそうな雰囲気の記事を見つけたので、時間があったら見てみてください。

<a href = "https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Grammar_and_types#Data_structures_and_types">データ型について</a>  /  <a href ="https://qiita.com/amamamaou/items/ef0b797156b324bb4ef3">参考１</a>  /  <a href ="https://techacademy.jp/magazine/35968">参考2</a>
＜Excel VBA＞表からデータを抽出して別シートに表作成

# 概要
この記事では、Excelの表から指定したキーの行を抽出し、別シートに表を作成するというマクロ処理のVBAソースコードを公開します。
# 必要となるシート
ここでは、ソースコードの前に、マクロを実行する上で必要となるExcelシートを簡単に説明します。

まず、抽出元となる表です。
画像では下が切れていますが、47都道府県の都道府県庁所在地、市・町・村それぞれの数を表にしています。
##### ①「都道府県一覧」シート
![①「都道府県一覧」シート.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604686/c64787be-dd8c-44c8-b78a-5b09b003169e.jpeg)
続いて、キーとなる「コード」だけを記載したシートです。
特定の行だけを抽出できるよう、フィルター機能を使っています。
##### ②「キー（コード）」シート
![②「キー（コード）」シート.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604686/6a7a8211-c096-9199-31a6-b655f905d2b5.jpeg)
抽出した行から表を作成するシートです。
「実行」ボタンをクリックすることで、マクロを実行し、表を作成します。
##### ③「抽出結果」シート
![1-10-1-02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604686/69576950-960c-4147-8151-55a039d4f40c.jpeg)
# ソースコード
①の表から②で指定した行のみを抽出し、③に表を作成するという処理内容です（シートを番号で表記）。

```visualbasic
Sub Prefectures()

Dim ws_pref As Worksheet: Set ws_pref = Worksheets("都道府県一覧")
Dim ws_key As Worksheet: Set ws_key = Worksheets("キー（コード）")
Dim ws_result As Worksheet: Set ws_result = Worksheets("抽出結果")

With ws_key
    .Range("a1").CurrentRegion.SpecialCells(xlVisible).Copy ws_result.Range("a1")
    If .FilterMode = True Then
        .ShowAllData
    End If
End With

Dim arr As Variant
With ws_result
    arr = .Range(.Range("a2"), .Cells(Rows.Count, 1).End(xlUp))
End With

Dim brr As Variant
brr = WorksheetFunction.Transpose(arr)
Dim strArray() As Variant
Dim i As Integer

For i = 1 To UBound(brr)
ReDim Preserve strArray(i - 1)
strArray(i - 1) = str(brr(i))
Next

With ws_pref
    .Range("a1").AutoFilter field:=1, Criteria1:=strArray, Operator:=xlFilterValues
    .Range("a1").CurrentRegion.SpecialCells(xlVisible).Copy ws_result.Range("a1")
    .AutoFilterMode = False
End With


MsgBox "処理が完了しました"

End Sub
```
詳しい説明は、以下、ご参照ください。
# 参考
・[WorksheetFunctionについて](https://excel-ubara.com/excelvba4/EXCEL207.html)
・[WorksheetFunction（ワークシート関数の使い方）](https://excel-ubara.com/excelvba1/EXCELVBA387.html)
・[AutoFilter](https://excel-ubara.com/excelvba1/EXCELVBA389.html)

マクロVBAの準備や実行方法などの使い方は、以下のサイトで確認できます。
・[Excelマクロの使い方入門（初心者向け）！作成〜保存方法まで](https://office-hack.com/excel/macro/)
・[エクセルの神髄 ExcelマクロVBA入門編](https://excel-ubara.com/excel_vba1.html)
因みに、私は「エクセルの神髄」で勉強しました。実際に手を動かしてみるのが1番だと思います。
マクロVBAにかかわらず、ショートカットキーを覚えると便利ですよ！
# 実行結果
②でキーとなる「コード」を選択（フィルタリング）します。
※図では、2、13、18、21、26を選択
![③実行結果.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604686/372e56d7-ac10-3505-9d86-3f9127f3df8e.jpeg)
「実行」ボタンをクリックすると、②で選択した行を抽出した表が③に作成され、ダイアログボックスが表示されます。
![④実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/604686/249763df-87c2-3382-4e7a-25f43f7e4f29.png)
Storybook でアクセシビリティ（a11y）改善

storybook-addon-a11y を CLI でレポートできるパッケージを公開しました！
詳しくは [Storybook でアクセシビリティの自動チェック](https://qiita.com/kalbeekatz/items/2570c0d3cde76dd70e75)をご覧ください。

# ウェブアクセシビリティとは

> ウェブページにある情報や機能の利用しやすさを意味します。
引用：https://waic.jp/knowledge/accessibility/

アクセシビリティ → accessibility → a11y
と略記されることもあります。

## アクセシビリティの具体例
Webサイトは様々なシーンで利用されますよね。

例えば、VoiceOver などのスクリーンリーダーで読み上げられるようなシーン。これはアクセシビリティの説明でよくある例です。
アクセシビリティが配慮されていない HTML をスクリーンリーダーに通すと、ただ文字が読み上げられるだけで見た目ではボタンだと伝わっても、耳から入る情報だけではそれが伝わらないことがあります。

また、文字サイズやカラーコントラストなどはWebサイトの見やすさ使いやすさに大きく影響します。
マウスを使った操作ができないこともあるかもしれませんし、屋外にいて画面が見づらい状況かもしれません。

ブラウザという機械にとって正しく認識させることもアクセシビリティの一つと言えますよね。

## 達成基準 WCAG

ウェブアクセシビリティには業界標準的に定められた達成基準があります。
WCAG (Web Content Accessibility Guidelines) は W3C の Web Accessibility Initiative (WAI) が勧告している達成基準です。
2020年12月現在は WCAG2.1 が最新のバージョンです（2.2 の勧告は2021年の予定）。

しかし、
ISO/IEC 40500:2012：WCAG2.0 の内容
JIS X 8341-3:2016：WCAG2.0 の内容
となっており規格としては WCAG2.0 の内容となっています。

WCAG2.1 の内容は WCAG2.0 に下位互換性があります。追加された項目としては、オリエンテーション（ディスプレイの向き）を制限しない事などがあります。モバイル端末が普及して時代に寄り添う形で追加されたのでしょう。
すべての追加項目は[こちら](https://www.w3.org/TR/WCAG21/#new-features-in-wcag-2-1)に記載されています。

# storybook-addon-a11y

[Storybook](https://storybook.js.org/) では [storybook-addon-a11y](https://github.com/storybookjs/storybook/tree/next/addons/a11y) という addon を導入することで WCAG2.0, WCAG2.1 に適合しているかを簡単にチェックすることができます。
storybook-addon-a11y の内部では [axe-core](https://github.com/dequelabs/axe-core) というライブラリで測定が行われます。このライブラリは Lighthouse のアクセシビリティ検査でも使われているものです。

すでに Storybook を使っていれば、[公式ドキュメント](https://github.com/storybookjs/storybook/tree/next/addons/a11y)に記載の通りサクッと導入できます。

## a11y チェックの結果
![スクリーンショット 2020-11-23 16.37.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435654/0f531885-34e5-a9af-d34b-65c74dbd995f.png)
右側（設定によっては下側）にチェック結果が表示されます。
このエラー表示で検出された内容は、「閉じる」ボタンのカラーコントラストが基準を満たしていないというものでした。
確かに文字が読みづらいですよね、、

このように Storybook の story （コンポーネント）単位でチェックすることができます。

# 何が嬉しいのか

storybook-addon-a11y の何が良いかと言うと、React で Storybook を導入してる場合などでは、コンポーネントに渡す props を変える事で様々なパターンで検証可能になる点です。
フォームなどを作っていると、ある項目を選択した時にしか表示しないコンポーネントなどが出てくると思います。
そのような場合でも story さえ用意してしまえば、Storybook 上で対象コンポーネントを開くだけでチェックできてしまうんですね（受け取った props に応じて出し分けてる場合に限りますが）。

a11y の測定ツールは様々なものがあるようです。
URL を入力して計測するタイプや、外部から css を挿入してハイライトするものなどもあります。

storybook-addon-a11y の場合はローカルで立ち上げた Storybook で動くので、非公開のページに対してもチェックできます（URL を入力するタイプだと難しいですよね）。
【Swift】基本的な型の紹介〜Bool型〜

#Bool型とは

Bool型とは真理値のことで、ある命題が真であるか偽であるかを表す値です。
つまり、式が型推論されない場合はBool型の値であるtrueかfalseを返します。

```swift

let a = true   // Bool型
let b = false   // Bool型
let c: Bool
c = 10 == 10   // true
```

##論理演算
論理演算とは真理値に対する演算になります。
Bool型には、否定・論理積・論理和の3つの論理演算子が用意されています。

論理演算をうまく使うことにより様々な条件式を記載することが可能です。

###・ 否定

否定は、真理値を逆にする論理演算です。
Bool型の値の否定を求めるには、！演算子を利用します。

否定したい変数や定数に！をつけることにより、逆の真理値を導くことが可能になります。

```swift

let a = true   // true
let b = !a   // false
```

###・ 論理積
論理積とは、与えられた**複数の真理値全てが真**であれば真となる論理演算子です。

2つ以上の真理値の論理積を求める場合には&&を使用します。
&& は、〜かつ〜 の、かつの部分だと思ってください。

true && true の場合は全ての真理値が true なので結果も true になります。
しかし、true && false の場合は全ての真理値が true ではないので結果は false になります。

国語のテストで、点数が50点を超えているかどうか調べる際に論理積を使うとこうなります。
たろう：１００点、あやか：６０点、まこと：１０点の場合。

```swift

let tarou = 100   // たろうは100点
let ayaka = 60   // あやかは60点
let makoto = 10   // まことは10点

var result: Bool   // Bool型

//たろうの点数が50点以上 &&(かつ) あやかの点数が50点以上 -> true && true
result = tarou >= 50 && ayaka >= 50   // true
//太郎の点数が50点以上 &&(かつ) まことの点数が50点以上 -> true && false 
result = tarou >= 50 && makoto >= 50   //false
//三人のテストの結果が５０点以上 -> true && true && false
result = tarou >= 50 && ayaka >= 50 && makoto >= 50   //false
```

少しわかりにくいですかね・・・？(笑)

とにかく論理積を使っていた場合、
一つでもfalseが存在したら結果はfalseになるということです！


###・ 論理和

論理和とは、与えられた真理値の少なくともどれか一つが真であれば、結果も真となる論理演算です。

2つ以上の真理値の論理積を求める場合には||を使用します。
|| は、〜または〜 の、またはの部分だと思ってください。

true || true の場合は、どちらもtrueなので、結果はtrueになります。
true || false の場合は、片方がtrueなので、結果はtrueになります。
false || false の場合は、両方ともfalseでtrueが存在しないので、結果はfalseになります。

先ほどの例を使うとこのようになります。

```swift

let tarou = 100   // たろうは100点
let ayaka = 60   // あやかは60点
let makoto = 10   // まことは10点

var result: Bool   // Bool型

//たろうの点数が50点以上 ||(または) あやかの点数が50点以上 -> true || true
result = tarou >= 50 || ayaka >= 50   // true
//太郎の点数が50点以上 ||(または) まことの点数が50点以上 -> true || false 
result = tarou >= 50 || makoto >= 50   //true
//三人のテストの結果が５０点以上 -> true || true || false
result = tarou >= 50 || ayaka >= 50 || makoto >= 50   //true
```

論理和の場合は、**どれか一つでもtrueが入っていれば結果はtrueになるということです！**

Bool型は最初のうちはよくわかりませんでしたが、
使っていく内に結構慣れていきました！

分からなくても色々試して調べて使えるようにしていきましょう！

以上、ありがとうございました。
地味に便利なVSCodeの改行を紹介。

意外と知らない(かもしれない)、VSCodeの改行まわりについて紹介します。

## ショートカット
### 現在の行の次に行を追加
![cmd-enter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140048/6d502972-4b1b-56b1-5595-5921b9874d38.gif)
行の途中でも改行することができます。いちいち行末に移動しなくていいので便利です。

| Mac | Windows |
|:-:|:-:|
| Cmd-Enter | Ctrl-Enter |

### 現在の行の前に行を追加
![cmd-shift-enter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140048/2300ece3-7940-068d-8836-3fe853cc2e64.gif)
現在の行の上に改行を追加できます。

| Mac | Windows |
|:-:|:-:|
| Cmd-Shift-Enter | Ctrl-Shift-Enter |

## 設定でできること

### 候補をEnterで選択してしまうことを防止
```json
"editor.acceptSuggestionOnEnter": "off"
```
改行しようとしたら、候補がEnterで選択されてしまう「わずらわしい」を防止します。
候補を選択する場合は`Tab`でも選択できます。

### ファイルの末尾に自動的に改行を挿入する
```json
"html.format.endWithNewline": true
```
VSCodeの設定でも追加するか否か、設定できます。
JavaScriptの関数（基本中の基本）

##はじめに
脱初心者にむけてアウトプットをしていこうと思って記事を書いております。
私は、まだ現場に出たことのない完全にど素人です。
間違ったことがありましたら、ぜひコメントいただけると幸いです。

##対象読者
JavaScriptの関数を学習している方が対象です！
関数の基本的な機能や使い方をざっくりと紹介しているので、ぜひ復習にお使いください。

##JavaScriptにおける関数とは
一つの目的のために、文がまとまったものです。
他の言語を学んだことがある方なら理解が早いと思いますが、簡単にいうと、メソッドです。
##

```.js
function sayHello() {  //宣言始まり

  console.log("Hello world");
  console.log("こんにちは、世界！");

}  //宣言終わり

sayHello();  //関数が呼び出され、本文が実行される
```
このプログラムの**「{」から「}」**までが関数の宣言になります。
これにより関数seyHello()が定義されます。

最後のsayHello( )で関数の呼び出しを行います。
呼び出しが行われると、宣言内に書かれたコードが実行され、コンソール上に結果が出力されます。



##関数の戻り値

戻り値とは**値を呼び出し側に戻す**ことです。
下記のプログラムの場合、returnに書かれたHello world が値を返ます。
##
```.js
function getGreeting() {

  return "Hello world!";  //値（戻り値）を返す

}
const message = getGreeting(); //関数が呼び出され。戻り値が代入される
console.log(message);
```
この場合関数が呼び出された後に、定数messageに代入され、結果として出力される戻り値は、関数getGreeting（）に記述された戻り値、
**Hello world!**になるのです。


##呼び出しと参照
呼び出しと参照の違いについて、
違いは簡単です
##
```.js
function getGreeting() {

  return "Hello world!";

}

console.log(getGreeting()); //Hello world!         呼び出し
console.log(getGreeting);   //function getGreeting()  参照
```
()をつけるか付けないかで、呼び出しか参照を区別することができるのです。


##関数の引数について、
上記で説明した、呼び出しや、参照などは関数から値を受け取る方法でした。
逆に関数に情報を渡すには、引数を使います。
##
```.js
function avg(a,b) {  //関数宣言においてaとbは「仮引数」と呼ばれる
  return (a + b)/2;
}
console.log(avg(5, 10));  //7.5
```

function avg(a,b) に書かれた(a, b)は**仮引数**と呼ばれます。
関数が呼び出された時に、呼び出し側で渡された値が代入され、本体が実行さえる。
そして出力される、戻り値は**7.5**になる。


##無名関数について、
その名の通り、関数名をしてしない書き方です。
##
```.js
const f = function() {
//
};
```
このように書くことで実質的な効果としては関数宣言と変わらないが省略することができます。
呼び出し、参照するときも、変わらず
##
```.js
console.log(f());  //呼び出し
console.log(f);    //参照
```


##アロー関数
アロー関数とは省略できる書き方です。
関数の定義と違う点が三つあります。

1. functionが省略できる
2. 引数が一つならば「（）」を省略できる
3. 関数本体が一つの式からなる場合、「{}」とreturn文を省略できる


##
```.js
const f1 = function() { return "Hello!";} //　関数
const f1 = () => "hello!";
```

このアロー関数はES2015から導入された便利な記法です

##まとめ
今回は関数についてざっっくりと説明してみました。
ここの説明間違ってる！！とかありましたら、ぜひお声かけください🙇‍♀️
最後までご覧いただきありがとうございました。