OmniAICreator/Qiita-1.07M huggingface dataset:
Macターミナルのコマンドエイリアスおすすめ

# 記事の想定

## ユーザー
- Mac買いたてで何もわからん人
- エイリアスやったことない人
- ターミナルのコマンドおすすめ無いかな〜・・・な人

## 想定環境
- Mac初期設定？のzsh(特に買ってからターミナル周りの設定いじってないな〜って人は多分これになってるはず)  
(私は今の所不自由してないのでこのまま行こうと思ってる。。。)

#  結論
- exa(lsのリッチver.)入れとけ[^1]

```
$ brew install exa
```


- ひとまず/Users/(yourDirectory)/.zshrcに以下ぶっこんどけ


```
#ステータス表示を消す
eval "$(anyenv init -)"
export PS1="%~ $ "

#exa(lsのリッチver.)
alias ls='exa'
alias ll='exa -ahl --git'

#cdしたらls
cdls ()
{
    \cd "$@" && ls
}
alias cd="cdls"

#Homebrew
alias b='brew'
alias bi='brew install'
alias bui='brew uninstall'
alias bu='brew upgrade'
alias bl='brew list'
alias bs='brew search'

alias bc='brew cask'
alias bci='brew cask install'
alias bcui='brew cask uninstall'
alias bcu='brew upgrade --cask'
alias bcl='brew list --cask'
alias bcs='brew search --cask'

#google検索
google() { open /Applications/Google\ Chrome.app/ "http://www.google.com/search?q= $1"; }
alias g="google"
```

# 説明
## 一応ざっくり用語説明
### エイリアス
- '別名'のこと
- 今回やっていることは主にターミナルで「○○って打ち込んだら、これは△△のことだからね！！」ってターミナル君に教え込むことをしてる

### zsh
- シェルの一種

### /Users/(yourDirectory)/.zshrc
- zshの設定ファイル

## 今回の設定について解説

### ステータス表示の変更
```javascript
eval "$(anyenv init -)"
export PS1="%~ $ "
```
- いきなりエイリアスじゃない話
- ざっくりいうと、コマンド打つところの最初の'$'より前のステータス周りの文字を消してる

```javascript
// ↓↓↓設定すると'~'だけになる！
    ~ $ hogehoge
```

- 画面狭いMacで作業するときにステータスの表示が長くて邪魔だったので。。。


### exa関係

``` javascript
// exa(lsのリッチver.)
alias ls='exa'               // ←既存の'ls'を置き換えちゃう
alias ll='exa -ahl --git'    // ←更に詳細情報を調べたいとき用

// cdしたらls
cdls ()
{
    \cd "$@" && ls  // ←'cd'による遷移が成功したら'ls(上で'exa'に変更してる)が実行される
}
alias cd="cdls"
```

- ls(カレントディレクトリ直下の一覧表示)をリッチにしてくれる
    - ディレクトリとファイルを色分けしてくれるだけでもだいぶ有り難いので即入れる
    - 他には権限情報、Gitステータスなんかを表示してくれるようにもできる

### homebrew関係
```javascript
// Homebrew
alias b='brew'
alias bi='brew install'
alias bui='brew uninstall'
alias bu='brew upgrade'
alias bl='brew list'
alias bs='brew search'

alias bc='brew cask'
alias bci='brew cask install'
alias bcui='brew cask uninstall'
alias bcu='brew upgrade --cask'
alias bcl='brew list --cask'
alias bcs='brew search --cask'
```
- シンプルに、短縮形を登録

### ターミナルからGoogle検索
```javascript
google() { open /Applications/Google\ Chrome.app/ "http://www.google.com/search?q= $1"; }
alias g="google"
```
- 地味に便利系
- "$ g ほげほげ"ってターミナルで打てばchromeが立ち上がって「ほげほげ」で検索されたページが立ち上がる

おわり

# 編集記録
- 20200912|初版
- 20200913|brew upgrade, brew cask系追加

[^1]: brewは真っ先に入れるべき。。。[homebrewとは何者か。仕組みについて調べてみた](https://qiita.com/omega999/items/6f65217b81ad3fffe7e6)
画面の移動

#画面の移動
　普通、画面の移動は画面の上をマウスでドラッグして移動するけど、なんだか画面が上までいってマウスが触れないときのTIPS

#答え
　alt+[space],m

#動作の説明
　まあ、これは全てのwindowsの標準でalt+[space],mで「移動」となる。
　ここで、カーソルで動かして画面を動かすという方法

　あまり、使っていなかったけど、最近画面を動かす事が多いし、画面上部がタブだらけになって、触れる部分が少なくなった場合にも使える。
　ショートカットキーは[home]や[end]も使わなかったりするが、けっこう重要
【GoLand】LiveTemplate で構造体に GORM タグをさくっとつける

# TL;DR
Preferences ＞ LiveTemplates ＞ Go Struct Tags からテンプレートを追加でできる。

![goland_livetemplate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34022/1bcb8c18-4b08-ebb6-db0e-c06014338915.gif)


# 設定
GoLand で、 Struct を定義する際、json とかいて json タグを自動で記述できるのはすごくべんりです。
gorm で列名を指定するとき、同じように記述するにはどうするかというはなし。

なお、例として gorm なだけで、それ以外でも同じ要領でもちろんだいじょうぶです。
ではやっていきます。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34022/0a78c2d7-aa73-dfb6-305e-2e0079b833f4.png)

↑
Preferences の LiveTemplates より、 Go Struct Tags を選択。
`＋` でテンプレートを追加します。

Abbreviation に `gorm` 、これは json みたいなテンプレートの起点になる文字です。
Description は適当に、 `gorm:"column:xxx"` とか。
Template text に値を、

```
`gorm:"column:$FIELD_NAME$"$END$`
```

のようにします。
変数も埋めれます。
変数はこの段階で未定義でだいじょうぶです。

Edit variables で変数を定義します。
値として Expression を入力します。

![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34022/39aafbe8-8e35-4aff-42f0-7dddb03b85b9.png)

↑
json のところを参考に `snakeCase(fieldName())` にしています。
Expression を編集しようとするとサジェストしてくれるので、使えるものはここでわかります。


![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34022/157de5c3-c1da-d2e1-0668-32d41e1644c4.png)


↑
あとは、この LiveTemplate を適用する範囲を指定します。
Template text の下あたりに、 No application context とあるので、Define をクリック。
ここでは Go の Tag をチェックします。

これだけ。

# 参考
[GoLand デフォルトで使用可能なLive Templates一覧 - Qiita](https://qiita.com/fuubit/items/cd5140e0a8417737cbdd)

おわり。
Shopify Theme Kitをダウンロードしてコードエディタでテーマ編集する

#Shopifyテーマとは
Shopifyをご存知の方はもちろん、最近ノーコードが注目される中でプログラミングなしでECサイトが作れちゃうということで人気になっているShopify
Shopifyのアプリケーション開発を担当する中でテーマの方をお手伝いしたこともあり、ブラウザ上でコードを見るのが非常に辛かったので、自分のコードエディタで作業するために必要なことをまとめます。

#はじめに
Shopifyはテーマ開発においてLiquidという独自の言語を使用しています。今回のテーマ開発に関しては、このLiquidを使用して作られた既存のテーマたちとそのテーマにカスタムCSSを加える際に活用できる環境整備についてお話します。
まずはじめに、[こちら](https://shopify.github.io/themekit/#installation)よりShopify Theme Kitをダウンロードしてください。

#ローカル環境の整備
[Shopify Theme Kit](https://shopify.github.io/themekit/)では、新たなテーマをCLIで1から開発する際、下記のようなコマンド

```
theme new --password=[your-password] --store=[your-store.myshopify.com] --name=[theme name]
```
が必要となっていますが、実際にテーマを購入したり、選んだりしてストアに入れてみてから、管理画面上でセクション等をカスタマイズしてみて初めて構築・CSS編集となることが多いかと思います。
なので、ここでは既存のストアにテーマを入れてある状態で、ローカルにそのテーマを落としてくるところから解説します。

- ローカルにテーマ構築のディレクトリを作成

```shell
mkdir "project_name"
cd "project_name"
```

- config.ymlを作成

```shell
touch config.yml
```
- config.ymlにAPIシークレットを記載

```yaml
development:
  password: "Password from Admin API"
  theme_id: "Theme_id from URL"
  store: "https://<store_name>.myshopify.com"
```

#編集するテーマのAPIアクセスを取得
Shopifyストアの管理画面にいき、Appsをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656820/3ab1c8a0-ecf3-f4d2-693f-3aa6b3dc6d26.png)


プライベートアプリを作成する箇所から、アプリを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656820/66fdd144-2ed7-9153-cfd8-c4294ffdd980.png)

Admin APIの箇所で全てのAPI許可を表示し、テーマの読み取り・書き込みを許可します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656820/0a83059d-eb3b-b794-8915-a5ec0540fc2c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656820/4ee19754-b897-6eee-4d13-dccac7622d01.png)

API作成で表示されるPasswordがconfig.ymlに記載する"Password from Admin API"になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656820/f5d26a08-3e11-3517-7370-03853bc17afa.png)

#テーマIDとストアのURLを取得
ストアの管理画面からテーマのカスタマイズ画面に進みます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656820/6db8cfec-6f37-e221-db38-59525fe279e1.png)

カスタマイズ画面で表示されるURLが該当箇所になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656820/3beae096-0a24-a53f-f903-c1435cc8dc07.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656820/aafd92c3-ffa4-9b79-007f-b966cb0ed388.png)

#ローカルで現行のテーマを編集する
config.ymlに必要な箇所を記載したあと、下記のコマンドでローカルに現行のテーマをダウンロードできます

```
theme download
```

実際に作業する際、ローカルで編集したものをリアルタイムで現行のテーマに反映させるには

```
theme watch
```

を実行してからコード編集をしてください。

#注意点
上記のtheme watchを実行することで、ローカルで編集したコードは直接テーマに反映されますが、
テーマをストア管理画面上で編集した場合、theme downloadを実行しない限り、ローカルには反映されません。
管理画面上で現行のテーマを編集した場合には、ローカルのテキストエディタで編集する前にtheme downloadを実行されることをお勧めします。

また、現行のテーマをそのままローカルで編集するのに抵抗がある場合には、編集前のテーマを複製しておくのが良いかもしれません。
多段階契約

応用情報技術者平成29年秋期 午前65


"情報システム・モデル取引・契約書"によれば，情報システムの開発において，多段階契約の考え方を採用する目的はどれか。ここで，多段階契約とは，工程ごとに個別契約を締結することである。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/cd520173-ec32-e183-f00a-02158bdd0d2a.png)


１、多段階契約とは、
委託開始に際して役割分担等の要旨だけを記した基本契約だけを先に結んでおき、
具体的な委託内容については
　・「システム化の方向性～システム化計画」
　・「要件定義」
　・「外部設計」
　・「内部設計以降」
というような工程毎に個別契約を締結する契約方式です。

これにより曖昧な段階で行われた見積りは、要件が明らかになった段階で再見積もりされることになります。
多段階契約を採用すると、契約事務の手間は増大しますが、一括契約方式と比較して開発途中で発生する仕様変更の影響を極力抑えられる利点があります。


２、
・SLA導入の目的
　サービスレベルの達成・未達の結果に対する対応措置(協議手続，解約権，ペナルティ・インセンティブなど)及びベンダの報告条件などを定めるため

　※ペナルティ（Penalty）. 英単語「penalty」に由来する言葉で「罰」「罰金」「刑罰」「罰の」などの意味で使われる。 スポーツにおける反則行為に対する罰則。
　※インセンティブ（incentive）は「人の意欲を引き出すために、外部から与える刺激」のことです。 例えばプロスポーツチームと選手が、成績による出来高制で契約を行う場合、「出来高の仕組みを選手に与えること」をインセンティブ（＝動機付け）と呼びます。


・仮発注合意書のモデルを採用する目的
　正式な契約を締結する前に，情報システム構築を開始せざるを得ない場合の措置として，仮発注合意書(Letter of Intent:LOI)を交わすため


・基本契約書の考え方を採用する目的
　ユーザ及びベンダのそれぞれの役割分担を，システムライフサイクルプロセスに応じて，あらかじめ詳細に決定しておくため



参照：
https://www.ap-siken.com/kakomon/29_aki/q65.html
Extract を便利に使って型の推論を補う

TypeScript で、特定の型であることが明確なのに推論が効かないことがあります。

```ts
type Foo = { value: number };

type TopFooValueType<A extends Foo[]> = A extends [infer F, ...infer _] ? F['value'] : never;

// Type '"value"' cannot be used to index type 'F'.ts(2536)
// F は Foo 型のはずなのにエラーになる。
```

このようなケースでは、 下記のようにして制約を満たしていることを保証するかもしれません。

```ts
type TopFooValueType<A extends Foo[]> = A extends [infer F, ...infer _]
  ? F extends Foo
    ? F['value']
    : never
  : never;
```

もしくは、再利用できるように次の `Must` のような型を用意することもできます。

```ts
type Must<T, ToBe> = T extends ToBe ? T : never;

type TopFooValueType<A extends Foo[]> = A extends [infer F, ...infer _] ? Must<F, Foo>['value'] : never;
```

この `Must`、よく見ると `Extract` と同じです。

```ts
type Extract<T, U> = T extends U ? T : never;
```

つまり、冒頭の `TopFooValueType` は次のように書くことができます。

```ts
type TopFooValueType<A extends Foo[]> = A extends [infer F, ...infer _] ? Extract<F, Foo>['value'] : never;

type T = TopFooValueType<[{ value: 1 }, { value: 2 }]>; // 1
```

もし、型の指定が間違っている場合は `never` になります（`never` に対しての Lookup は常に `never` であるため）。

```ts
type Bar = { value: string };

type TopFooValueType<A extends Foo[]> = A extends [infer F, ...infer _] ? Extract<F, Bar>['value'] : never;

type T = TopFooValueType<[{ value: 1 }, { value: 2 }]>; // never
```
エンタープライズアーキテクチャの理想モデル

応用情報技術者平成29年秋期 午前61

エンタープライズアーキテクチャにおいて，業務と情報システムの理想を表すモデルはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/800fdb53-4d76-63f0-c907-120c4ca85912.png)


１、EA(エンタープライズアーキテクチャ)における理想モデル（To-Be）は、
対象の理想的な将来像・目標を表現するモデルです。

EAでは「政策・業務体系」「データ体系」「適用処理体系」「技術体系」の4つの体系で、それぞれ、最初に現状を分析した
・現状モデル(As-Is)を整理し、
・目標とする理想モデル(To-Be)を描き、
・最後に現状と理想目標を比較した現実的な次期モデルを作成します。

つまり、To-Beは基本は永遠に到着できないですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/80eb444d-657d-6c42-9125-e12f34cac9ee.png)


２、
・EA参照モデル　→　EAのひな型
　EA参照モデルは、政府が公開しているEAのひな型のことです。

・ザックマンモデル　→　EAの基礎
　ザックマンモデルは、1987年ジョン・A・ザックマンによって提唱されたEAの基礎となっているフレームワークで、5種類の異なる立場の視点とそれぞれの5W1H（What、How、Where、Who、When、Why）の側面から分析・記述する手法です。

・データモデル
　データモデルは、対象業務を情報システムやDBMSにおける抽象的な形式としてモデル化したものです。


参照：
https://www.ap-siken.com/kakomon/29_aki/q61.html
PHPで文字化けするCSV処理を文字化けしなくする方法

# 結論

[fw3/streams](https://packagist.org/packages/fw3/streams)を`composer require fw3/streams`して、CSVを扱っている処理を次のように囲ってあげれば文字化けしなくなります。

※ PHP7.2.0未満(下限PHP5.3.3)で解決したい場合は[fw3_for_old/streams](https://packagist.org/packages/fw3_for_old/streams)を利用してください。（`composer require fw3_for_old/streams`）
　 [fw3/streams](https://packagist.org/packages/fw3/streams)および[fw3_for_old/streams](https://packagist.org/packages/fw3_for_old/streams)共にPHP8.0 beta 2まで動作確認済みのため、PHP7.2.0以上のシステムの場合はどちらを入れても変わりはありません。
※ composerを使用できない環境の場合は、[こちらからZIPファイルをダウンロード](https://github.com/fw3-for-old/streams/archive/master.zip)し、展開して任意のディレクトリにコピーしてください。
　 その後、使用対象となる処理より前に`require_once sprintf('%s/src/filters_require_once.php', $path_to_copy_dir);`として`src/filters_require_once.php`を読み込むようにしてください。

# 2022/01/20追記：PHP8.1における **Sigh. Double sigh.** な修正について。

PHP8.1になって突然`SJIS-win`が削除されました。
https://github.com/php/php-src/commit/e2459857afdf70ed4bc23bc7f614e9f383eb3072

そのため、日本語PHPにおける鉄板エンコーディング設定が使えなくなっています。

この記事で紹介している`fw3/streams`および、`fw3_for_old/streams`では「`PHP8.1.*`かつ`SJIS-win`が指定された場合は`CP932`に読み替える」対応を行い、実質的な影響が出ないようにしています。


## 読み込み

既存の実装が次のような形の場合。

```:php

$fp     = \fopen($csv_file_path, 'r+b');
$data   = [];
while (($row = \fgetcsv($fp, 1024)) !== FALSE) {
    $data[] = $row;
}
\fclose($fp);
```

次のようにラップしてあげるだけで解決。

```:php
<?php

// fw3_for_oldを使用している場合は、`use fw3\`を`use fw3_for_old\` として読み替えてください。
use fw3\streams\filters\utilitys\StreamFilterSpec;
use fw3\streams\filters\utilitys\specs\StreamFilterConvertEncodingSpec;
use fw3\streams\filters\utilitys\specs\StreamFilterConvertLinefeedSpec;

$data   = StreamFilterSpec::decorateForCsv(function () use ($csv_file_path) {
    // フィルタの設定
    $spec   = StreamFilterSpec::resource($csv_file_path)->read([
        StreamFilterConvertEncodingSpec::toUtf8()->fromSjisWin(), // Shift_JIS(Windows-31J、MS932)として読み込んでUTF-8として出力
    ]);

//// STA 元のコード
//
    $fp     = \fopen($spec->build(), 'r+b'); // ここだけ `$csv_file_path` を `$spec->build()`に書き換える
    $data   = [];
    while (($row = \fgetcsv($fp, 1024)) !== FALSE) {
        $data[] = $row;
    }
    \fclose($fp);
//
//// END 元のコード

    return $data;
});
```

## 書き込み

既存の実装が次のような形の場合。

```:php
$fp = \fopen($csv_file_path, 'w+b');
foreach ($rows as $row) {
    \fputcsv($fp, $row);
}
\fclose($fp);
```

次のようにラップしてあげるだけで解決。

```:php
<?php

// fw3_for_oldを使用している場合は、`use fw3\`を`use fw3_for_old\` として読み替えてください。
use fw3\streams\filters\utilitys\StreamFilterSpec;
use fw3\streams\filters\utilitys\specs\StreamFilterConvertEncodingSpec;
use fw3\streams\filters\utilitys\specs\StreamFilterConvertLinefeedSpec;

$data   = StreamFilterSpec::decorateForCsv(function () use ($csv_file_path, $rows) {
    // フィルタの設定
    $spec   = StreamFilterSpec::resource($csv_file_path)->write(array(
        StreamFilterConvertEncodingSpec::toSjisWin()->fromUtf8(),   // UTF-8として読み込んでShift_JIS(Windows-31J、MS932)として出力
        StreamFilterConvertLinefeedSpec::toCrLf()->fromAll(),       // いかなる改行コードであってもCRLFとして出力
    ));

//// STA 元のコード
//
    $fp = \fopen($spec->build(), 'w+b');
    foreach ($rows as $row) {
        \fputcsv($fp, $row);
    }
    \fclose($fp);
//
//// END 元のコード
});
```
網羅性

応用情報技術者平成29年秋期 午前60


在庫管理システムを対象とするシステム監査において，当該システムに記録された在庫データの網羅性のチェックポイントとして，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c1e3acc4-9c0b-9f0d-574a-cb6f1654cce0.png)

１、網羅性とは、
抜けや漏れがなくすべてのことが集まり含まれている様子をいいます。

・抜け：あるはずのものがないこと。抜けていること。


システムで連番を自動的に付与することによって入出庫の計上漏れや重複計上を防ぐことができますね。

参照：
https://www.ap-siken.com/kakomon/29_aki/q60.html
システム監査の改善指導(フォローアップ)


応用情報技術者平成29年秋期 午前58

システム監査の改善指導(フォローアップ)において，被監査部門による改善が計画よりも遅れていることが判明したとき，システム監査人が採るべき行動はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/394211b4-e9bf-13a4-b7de-841c37be8ec0.png)


１、フォローアップ
システム監査人は、監査の結果に基づいて所要の措置が講じられるよう、適切な指導を行う役割をもちます。
フォローアップとは、システム監査後に監査人が被監査側に対して行う改善指導です。
ただし、
・監査人が行うのは指導に留まり、
・改善活動自体は被監査側が主体となって実施します。



下記の特徴があります：
・具体的な行動計画を策定するのは被監査部門の役割です。
・監査人が主体的に改善活動に参加することはありません。
・遅れを取り戻すための方策について，被監査部門の責任者に助言する。
・監査人が行うのは助言であり、是正要求ではありません。



参照：
https://www.ap-siken.com/kakomon/29_aki/q58.html
クラウドを使用したデータ分析基盤の代表的な設計パターン3つをまとめてみた


##適切なデータ分析基盤の設計

こちらの記事のまとめと所感。

引用: https://xtech.nikkei.com/atcl/nxt/mag/nc/18/041400166/061500003/

データ分析基盤設計の代表的なパターンとしては、以下の3つがあるようです。

①データレイク型
②統合型
③分散型

それぞれにメリット・デメリットがあり、各社のデータ特徴、エンジニアの質などを総合的に踏まえて、適切なアーキテクチャを選定することが重要。
上記3パターンを順番に考察していきます。

##①データレイク型

**1.概要**

各業務DB、IOTデバイス等が集めてくるデータ達を、そのままの形で1つのストレージにガバっと保存しておきます(このストレージを「データレイク」と呼びます)。
こうして会社内のあらゆるデータが集まったデータレイクから、用途に合わせて必要な分だけ抽出・適切な形に加工し、(これを「ETL」と呼びます)、利用する、というものです。
以下はAWSのサービスを利用した例。


![aws-42-638.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513692/539a03f5-cb58-8ab2-f924-714c7fc5a7b9.jpeg)

クラウドサービス各社が「分析基盤はこうして設計するのだ！」と、セミナーなどで提唱しているのも、大体この型です。


引用:
>https://www.slideshare.net/akuwano/aws-69861007
>https://www.slideshare.net/AmazonWebServicesJapan/aws-70254977
>https://cloud.google.com/solutions/build-a-data-lake-on-gcp?hl=ja

**2.メリット**

以下3つのメリットがあると言われています。

①データを一元管理できること
②インプット(データを入れる)システムとアウトプット(溜めたデータを何かに使う)システムを分離できる
③各アーキテクチャが疎結合で、柔軟性が高いこと


データは各社によってその性質も、量もバラバラです。
自社の特徴に合わせて柔軟に構築できる点では、非常にコストメリットも大きいのではないでしょうか。
また、自社で様々なサービスを持っている会社などは、各サービスが別個でデータを管理し、どんなデータが何処にあるか分からず、分析のハードルが高い(データがサイロ化した)状態になりやすかったりします。
1つこういう基盤を持っておくことで、サイロ化を防ぎ、意思決定補助のスピード感を高めることも可能かと思います。

**3.デメリット**

記事、所感からデメリットは3つあります。

①図を見れば分かるかと思いますが、様々なサービスを使用しなければなりません。
柔軟でカスタマイズの幅が広い分、各サービスに対する理解を深めておかなければ無駄なコスト、性能リスクが発生しやすいです。使いこなすには難易度の高いアーキテクチャと言えると思います。エンジニア魂が燃えますね。

②次に、「色んなデータを使える形で加工する」、ここが本当に難しい。データへの深い理解と、不良データに負けないストレス耐性。ビジネスサイドからの無理難題...こいつらを解決しなければなりません。

③運用難易度が高いです。各サービスを統合管理できません。AWSなどではcloudwatchなどを駆使すればいけそうかと思いますが、ここの仕組みを構築するのは高額です。
統合監視の難易度が高い分、運用は複雑になります。


##②統合型

**1.概要**

DB界最強のOracleや、SQLserver、SAP HANA、最近だとSnowflakeが流行ってますね。
1製品であらゆる機能を賄おう、という考えです。

**2.メリット**

以下3つのメリットがあると言われています。

①構成を考えるのが楽です。ベンダーが予めカスタマイズしているものに当てはめればいいので。必要な機能は大体最初から備わっています。

②各製品独自の機能が便利です。特にリカバリやセキュリティといった部分。当然オンプレミスにも対応なので、リスクに厳しい大企業・金融系などはよくoracleを選択してますね。

③データレイク型と被りますが、こちらもデータを一元管理できるので、サイロ化は起きづらいです。

**3.デメリット**

こちらも3つあると言われます。

①シンプルに高い。本当に。中小企業だとコストに圧し潰されます。

②柔軟性はデータレイク型に比べ下がります。ハード性能などは細かくサイジングできないので、突発的なデータ増・負荷増などに対応しづらい点は、面倒かなと思います。

③「とりあえずそのままの形でデータを保存しよう」が出来ません。製品によって予め決まった型に合わせなければなりません。ここも面倒ですね。


##3.分散型

**1.概要**

各DBで相互に連携しながら、うまい事処理しましょう、という基盤。
ここまで挙げてきた2つと違い、これといった統合管理をすることが無いのが特徴です。


**2.メリット**

既存システムに変更を加えなくて良いことです。
また、製品も何でもいいので、業務の特徴に合わせて、例えばMySQLとPostgreSQLを併用する、といったことも可能です。


**3.デメリット**

反面デメリットは3つです。

①データレイクと被りますが、色々なサービス(製品)を使うので、を統合管理と設計が難しいです。

②データがサイロ化しやすいです。これが最大のデメリットかもしれません。サイロ化のリスクはデータレイク型のメリットでお伝えした通り。サイロ化した基盤を触ったことがある身からすると、これは想像以上に生産性が低いです。

③データ連携が複雑になりやすいです。各DBで微妙にSQLの書き方や仕様は違いますし、「どことどこをどう連携するか」という部分は、DBが増えるにつれて網の目の様に複雑になります。


##結局どのタイプがいいの？

個人的には①を推したいです。
割と新興のアーキテクチャ故、推進出来る人も少ないですが、
何よりコスト面での有用性は高いと思います。
クラウド各社のプロたちから知識も得やすいですしね。

②は、前述しましたがセキュリティ等のリスク絶対守るマンや、
①は難易度が高いよ...既存のやり方でやらせてくれ...って場合にはアリだと思います。
何より、エンジニア的にはガッツリDBの基礎を学べるので、(話は逸れちゃいますが...)新卒エンジニアなどはこれを採用してる現場に行くと、基本が身につきやすくていいと思います。

③は、あまりメリットが思い浮かばず。。。すいません
自分の現在の価値観の中だと、データ整備がうまく出来なかった企業の成れの果て...みたいなイメージでしかありません。
勿論これでうまくやってる会社さんもあると思うので、ぜひ知りたいです。
冷房負荷

応用情報技術者平成29年秋期 午前57 


空調計画における冷房負荷には，"外気負荷"，"室内負荷"，"伝熱負荷"，"日射負荷"などがある。冷房負荷の軽減策のうち，"伝熱負荷"の軽減策として，最も適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/501d8aaa-3205-539d-6cc7-896f372f21a8.png)


１、冷房負荷は、
室内の温度・湿度を一定に保つために、空気から取り除くべき熱量をいいます。
太陽熱、
室外から侵入する空気内の熱、
機器・照明の熱、
室内外の温度差による窓や壁からの伝熱
などがあります。

伝熱負荷は、壁や窓を通じて室外から室内に伝わる熱量を示します。


２、軽減策
・室内負荷の軽減策
　使用を終えたらその都度PCの電源を切る。

・外気負荷の軽減策
　隙間風や換気による影響を少なくする。

・日射負荷の軽減策
　日光が当たる南に面したガラス窓をむやみに大きなものにしない。

・伝熱負荷の軽減策
　屋根や壁面の断熱をおろそかにしない。




参照：
https://www.ap-siken.com/kakomon/29_aki/q57.html
SSL証明書の認証の違い(DV,OV,EV)

## DV(ドメイン)認証

`ドメインの所有者であること` を証明する必要がある認証タイプです。

- ドメインの所有者であれば発行されるSSL証明書
- 組織情報や認証局からの確認はなし
- 無料のSSL [Let's Encrypt](https://letsencrypt.org/) はこのタイプ
- SSL化が目的であればドメイン認証SSLで十分

## OV(企業)認証

`ドメインに登録されている運営元が実在していること` を証明する必要がある認証タイプです。

- 企業の実在性を証明することで発行される証明書
- ドメイン認証より、企業の実在性が証明されていることからwebサイトの信用性を向上させることができる

## EV認証

`第三者機関への組織の確認、また組織の実在を証明する手続きのほか電話による在籍確認` を証明する必要がある認証タイプです。

- OV(企業)認証よりも厳格な審査が必要
- 3種類の認証の中で一番安全と信頼性がある
- 上記のような確認、また証明書の属性に組織情報が設定されることからフィッシング詐欺対策に有効
- ブラウザのアドレス欄がグリーンになり、金融機関などでも多く使用されている

## まとめ

- 3つの認証で大きく異なるのは、`サイト運営元の実在証明` が必要な部分
- 信頼度で言えば、`DV(ドメイン)認証` → `OV(企業)認証` → `EV認証` の順番に上がっていく

## 参考

- [SSL証明書の種類について（認証方法別：DV・OV・EV）](https://www.slogical.co.jp/ssl/docs/ssl_type_authentication/)
- [認証レベルについて（ドメイン認証、企業認証、EV SSL）](https://www.sslbox.jp/about/authentication_level.php)
- [SSLには、EV認証・企業認証・ドメイン認証の3種類があります](https://deep-blog.jp/engineer/ssl-3type-detail/)
<java>Zipファイルを読み込み直接文字列に変換する

# 概要
Zipファイルを読み込み直接文字列に変換します。


# 解説
読み込みにはInputStreamクラスのreadAllBytesメソッドを使用しています。
すべてのバイトを一気に読み込んでくれるのでとても便利ですね～。

ただしリファレンスによると、「このメソッドが、すべてのバイトを1つのバイト配列に読み取ると都合が良い簡単なケースで使用するものであることに注意してください。 大量のデータを持つ入力ストリームを読み込むためのものではありません。」という記載がありました。


# コード
```java:Unzip.java

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.util.zip.ZipInputStream;

public class Unzip{
	public static void main(String[] args) throws Exception {

		String filePath = "ここでZipファイルのパスを指定";

		ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(filePath)));

		//zipファイルの中にファイルがあるだけ繰り返す
		while(zis.getNextEntry() !=null){

			String str = new String(zis.readAllBytes());

			//とりあえず出力しておく
			System.out.println(str);
		}
		zis.close();
	}
}


```
# 参考
参考までに、少しずつ読み込むコードも載せておきます。

```java:Sample.java
		String filePath = "ここで読み込むZipファイルのパスを指定します";

		ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(filePath)));


		String str = null;
		byte[] tempBuffer = new byte[1024];//一度に読み込むバイト数
		ByteArrayOutputStream streamBuilder = null;
		int bytesRead;

		//zipファイルの中にファイルがあるだけ繰り返す
		while(zis.getNextEntry() !=null){
			while ( (bytesRead = zis.read(tempBuffer)) != -1 ){

				streamBuilder = new ByteArrayOutputStream();
				streamBuilder.write(tempBuffer, 0, bytesRead);

			}
           //Stringに変換する
			str = streamBuilder.toString("UTF-8");
			System.out.println(str);
		}
		zis.close();
```
【React】ライフサイクル

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました。
[React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで](https://www.amazon.co.jp/React%E5%85%A5%E9%96%80-React%E3%83%BBRedux%E3%81%AE%E5%B0%8E%E5%85%A5%E3%81%8B%E3%82%89%E3%82%B5%E3%83%BC%E3%83%90%E3%82%B5%E3%82%A4%E3%83%89%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AB%E3%82%88%E3%82%8BUX%E3%81%AE%E5%90%91%E4%B8%8A%E3%81%BE%E3%81%A7-%E7%A9%B4%E4%BA%95%E5%AE%8F%E5%B9%B8-ebook/dp/B078XDLL2J/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=)

私的アウトプットです。

#ライフサイクル
ライフサイクルの種類

- コンポーネントのマウントで呼ばれるメソッド
- コンポーネントでのデータの変化によって呼ばれるメソッド
- エラーハンドリングで使うメソッド

##マウントのライフサイクル

|用語|説明|
|---|---|
|マウント|新たにReactコンポーネントが配置されること。|
renderメソッドを初めて呼び出して**マウント**
2回目の呼び出しで**アップデート**
コンポーネントがDOMからなくなったら**アンマウント** 

###oncomponentWillMount
マウント直前に呼ばれる
普通はコンストラクタで十分
###oncomponenDidMount
マウント直後に呼ばれる
イベントリスナの登録をする
###oncomponentWillUnMount
アンマウント直前に呼ばれる
後処理
setIntervalのcleaIntervalを実行するなど
##データアップデートのライフサイクル

###componentWillReceiveProps
|引数|説明|
|---|---|
|引数|受け取る予定のpropsをとる|


```
componentWillReceiveProps(NextProps)
```
今のthis.propsをNextPropsを比較できる

###shoulComponentUpdate
|引数|説明|
|---|---|
|第1引数|受け取る予定のpropsをとる|
|第2引数|受け取る予定のstateをとる|

```
shoulComponentUpdate(NextProps,NextState)
```
主にパフォーマンスチューニングに使われる

###componentWillUpdate
|引数|説明|
|---|---|
|第1引数|受け取る予定のpropsをとる|
|第2引数|受け取る予定のstateをとる|

```
componentWillUpdate(NextProps,NextState)
```
render前に呼ばれる最後のメソッド
##エラーハンドリング関連のライフサイクル
エラーが起きたときに呼ばれる

###componentDidCatch
子コンポーネントでエラーが起きたときによばれる

```
componentDidCatch(error,info)
```
|引数|説明|
|---|---|
|error|受け取る予定のpropsをとる|
|info|受け取る予定のstateをとる|
Wake on LANを使って、遠隔からパソコンを起動しよう【macOS】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


**Wake on LAN (WOL)**とは、**「同じネットワーク内のパソコンに対して、Magic Packet（マジック パケット）というパケットを送り込み、遠隔から電源をつけることができる仕組み」**です。同じネットワーク内だったとしても、中継しているルータがMagic Packetをブロックしている場合もあります。

今回は、macOSのパソコンからMagic Packetを送る方法を紹介します。

# 1. 受信PCのMACアドレスを確認
まず受信PCのMACアドレスを確認します。

MACアドレスは、**Media Access Control**の略称で、「**ネットワーク機器に割り当てられた住所**」のことです。AppleのmacOSとは全く関係なく、WindowsPCにも割り当てられています。

まず`このMacについて`を開きます。
<img alt="MAC_confirm_1.png" width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240280/d7751793-fb37-cdcf-66c3-33e3778f5616.png">

そして、`システムレポート`を開きます。
<img alt="MAC_confirm_2.png" width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240280/873dd24e-57fa-caad-48fe-c9650b850ed9.png">

最後に、`ネットワーク > ネットワーク環境 > ハードウェア（MAC）アドレス`をスクロールして探します。
<img alt="MAC_confirm_3.png" width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240280/0e35f807-b8dc-08f7-bb24-d56f696acc71.png">

# 2. 送信PCからMagic Packetを送信
受信PCのMACアドレスがわかったら、送信PCで`ターミナル`というアプリを開き、以下のようなコマンドを実行してみましょう。
特に、エラーなく実行できたら、準備完了です。

```zsh:
% mkdir ~/bin
% curl https://raw.githubusercontent.com/jpoliv/wakeonlan/master/wakeonlan -o ~/bin/wakeonlan
% chmod +x ~/bin/wakeonlan
```

最後に、以下のようなコマンドで`xx:xx:xx:xx:xx:xx`に受信PCのMACアドレスを入れて、実行してみましょう。

```zsh:
% ~/bin/wakeonlan xx:xx:xx:xx:xx:xx
```

これで、受信PCが起動したと思います。
研究室などで、別の部屋のパソコンがスリープに入った時に起動させたいタイミングなどがあり、意外と便利です。

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
# 参考文献

https://wa3.i-3-i.info/word12306.html

https://wa3.i-3-i.info/word173.html

https://www.atmarkit.co.jp/ait/articles/0602/25/news014.html
AWS SAMのtipsをひたすら書く

#はじめに
タイトルめっちゃ雑ですみません。
筆者は約半年に渡って、aws-samを使ったアプリケーションを作成しています。
たくさんトラブルや学びがあったので、それらをメモしてきたいと思います。

# 勉強の仕方
### サンプルをバラす

コマンドラインで、`sam init`を実行すると、様々なサンプルアプリケーションが出てきます。
それをバラすと勉強になります。

### 書籍
英語の情報が多いので、日本語のまとまった情報は貴重です。
筆者はkindleで買ったのですが、画面で見るには文字が小さかったので印刷された本を買った方が良いかもしれません。
- [AWSによるサーバーレスアーキテクチャ](https://www.amazon.co.jp/AWS%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AC%E3%82%B9%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3-Peter-Sbarski/dp/4798155160/)

### 勉強サイト
Webサイトで勉強するのも良いでしょう。（英語ですが一番詳しいです）

- [serverless.com](https://www.serverless.com/)
- [serverlessland.com](https://serverlessland.com/)

#トラブルとその解決

### 開発環境と本番環境を分けたい
パラメータの上書きを使うと良いです。
筆者の場合はこんな感じです。

```
Parameters:
  AppId:
    Type: String
  Environment:
    Type: String
```

### リソース数が200を超えてこれ以上デプロイ出来ない
クロススタック参照を使うと良いです。
CodePipelineの画面はこんな感じになっています。
![スクリーンショット 2020-09-12 19.42.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163480/0fd61a2c-df91-91b7-0da5-bd491d9e58eb.png)

### デプロイが遅い
色々試しましたが、どうしようもありませんでした。
なので、`sam-local invoke`を使って、ローカルで呼び出すしたり、関数のテストコードを書くと良いでしょう。

### DynamoDBの読み書きテストをしたい
https://jestjs.io/docs/en/dynamodb
出来ます。

### CORSどうしよう
関数の返り値にCorsの情報を追加してください。

### 初回起動遅い（コールドスタート）
```
AutoPublishAlias: live
      ProvisionedConcurrencyConfig: 
        ProvisionedConcurrentExecutions: 2
```
同時実行の予約をすると良いでしょう。
ただ、デプロイに時間がかかるようになります。。。
Cookpad LicenseToolsPluginの横スクロール対策

クックパッドのAndroid向けのライセンス管理プラグイン [cookpad / LicenseToolsPlugin](https://github.com/cookpad/LicenseToolsPlugin)
ライセンス表示ページ作る際にいつもお世話になってます！

今回はプラグインから出力されたHTMLで横スクロールされて困ってる人へ向けての対策。
※ 2020/03/19リリースの`v1.2.2`時点の対策になります

この問題はライセンスのURLが改行されずに行で表示されることが原因となっています。
[Wrap html links in licenses.html #2](https://github.com/cookpad/LicenseToolsPlugin/issues/2)  

なのでURLを改行するように修正を行います。
Issuesを辿って旧プラグインのIssuesに行くと暫定対応の方法が書かれているのでそのとおりに対応すればOKです。
[Wrap html links in licenses.html css #74](https://github.com/cookpad/license-tools-plugin/issues/74)

これで `./gradlew generateLicensePage` のHTML出力時に改行設定を追加してくれます。

|対策前|対策後|
|---|---|
|![CookpadLicenseToolsPlugin_wrap_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620330/73fc4ef2-a80f-0eeb-57be-4b8d6401cebb.png)|![CookpadLicenseToolsPlugin_wrap_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620330/2c512be1-4643-7f6c-cab7-e46f7e8ae095.png)|

私の場合は以下のようにプロジェクトに書いてます（Issuesの内容とほぼ同じです）

### app/build.gradle
```gradle
apply plugin: "com.cookpad.android.plugin.license-tools"
apply from: '../tools/cookpadLicensePatch.gradle'
```

### tools/cookpadLicensePatch.gradle
```gradle
// Wrap html links in licenses.html
// https://github.com/cookpad/LicenseToolsPlugin/issues/2
// https://github.com/cookpad/license-tools-plugin/issues/74
task patchLicensePageStyles() {
    doLast {
        def licensesHTMLFile = new File(project.rootDir, "/app/src/main/assets/licenses.html")
        try {
            def additionalStyles = "    a { word-break: break-all; }"
            def licensesHTML = licensesHTMLFile.getText('UTF-8')
            licensesHTML = licensesHTML.replaceFirst(/(\s*<\/style>)/, "\n" + additionalStyles + "\$1")
            licensesHTMLFile.text = licensesHTML
        } catch(Exception e) {
            println e
        }
    }
}
generateLicensePage.finalizedBy(patchLicensePageStyles)
```

リンク先と違うのはカスタマイズCSSファイルを使わず文字列で直接設定しているところ。
今回の対策に必要なCSSが短いのと複数ファイル管理が面倒なためです。

半角スペースが入っているのは出力された `licenses.html` のStyleのインデントを揃えたかっただけなので無くても問題ありません。

```html
  <style>
    ...
    input:checked ~ .license {
    max-height: none;
    }
    a { word-break: break-all; }
  </style>
```

`tools/cookpadLicensePatch.gradle` はapp/build.gradleに直接書いて良いです。
私はbuild.gradleが大きくなりすぎないようにするためと、この設定はプロジェクトに依存しておらず他のプロジェクトでも使える、ということを表すために別ファイルに書くようにしています。

---

旧プラグインの修正PRがマージされていなかった理由が気になるところ。
修正されるといいな。
Re:ゼロから始める共有ファイル生活 2nd season

社内SE「社内のWindows Serverを共有ファイルサーバにするのをやめて、AWSのS3を使うクラウドサービスに切り替えます。」

わい「おー、これで会社にいなくてもどこからでも共有ファイルにアクセスできるようになって助かるわー。全部で１０TBくらい容量あるから、データ移行はAWS Snowball使うん？」

社内SE「いえ、お金あまりかけたくないので、S3をWindowsにマウントしてROBOCOPYでファイル転送します。」

・・・・・・

社内SE「1週間ずっと動かし続けてるけど、まだ終わらない・・・」

・・・数日後・・・

社内SE「Windows ServerのHDDが1本死にました。」

わい「おおお・・・、1週間以上ずっとROBOCOPYガリガリ動かしてたから酷使しすぎたんじゃない？でもRAID5構成だから1本死んでもまだ大丈夫だよね？」

社内SE「いえ、実は元々1本死んでて、これが2本目です。」

わい「えっ！・・・ということは・・・」

社内SE「はい、復旧不能で完全にお亡くなりになりました・・・。」

----

この後自動バックアップ取っていたと思っていたものが実は取れていなかったことが発覚し、大金かけてデータ復旧サービスに依頼するも復旧できず、結局大ひんしゅくを買いながら諦めることになりました。

AWS Snowballのお金をケチったせいで、それを遥かに上回るデータ復旧サービス料金がかかった上に、貴重な知的財産をすべて失うという、**一文吝みの百知らず**を地で行くようなことが起きてしまいました。

お金の力で楽で安全なやり方を選ぶことは意義ある選択です。お金は正しく上手く使いましょう。

**なるほど、それが君の金欲の根幹か**
ディープラーニング、ニューラルネットワークの概要

## 背景
大学で人工知能の研究をしているものだが、前期が終わり後期からディープラーニングとニューラルネットワークの学習が始まるにあたり、何か基礎知識をつけたいと思い、オライリーの「ゼロから作るDeep Learning」を購入した。
[その本](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585)
備忘録を兼ねて投稿しようと思う。
なお、投稿者はニューラルネットワーク及びディープラーニングの知識は0。
## ディープラーニングとは...
### 前提知識
<dl>
<dt>パーセプトロン</df>
<dd>ニューラルネットワークの基本単位。複数の信号を元に、ある一つの結果を返すもの。なお、ニューラルネットワークはパーセプトロンの集合体であり、パーセプトロン自体がニューラルネットワークということではない。</dd>

>引用元：https://blog.apar.jp/deep-learning/11979/
![画像](//o3vdxh6s.user.webaccel.jp/wp-content/uploads/2019/05/ogp-perceptron.png)

<dt>活性化関数</dt>
<dd>閾値を境にして出力が切り替わる関数。「ステップ関数」や、「階段関数」とも呼ばれる。（ニューラルネットワークでは違うものが使われる。）上の画像で言うと、活性化関数は出力の段階で使用されることになる。
<dt>シグモイド関数</dt>
<dd>ニューラルネットワークでよく用いられる活性化関数の一つ。</dd>
<br>
### 2020-9-13　追記
ニューラルネットワークにおける、出力層の活性化関数については、通常の活性化関数とは違うものが利用される。
ニューラルネットワークは、分類問題と回帰問題に用いることができるが、そのどちらも違った関数を利用している。
<dl>
<dt>回帰問題での出力層の活性化関数</dt>
<dd>これには恒等関数というものが用いられる。一般的にこの関数は入力された信号に対して、何も変更を加えずにそのまま返す。</dd>
<dt>分類問題での出力層の活性化関数</dt>
<dd>これにはソフトマックス関数というものが用いられる。<br>
[参考資料](https://www.atmarkit.co.jp/ait/articles/2004/08/news016.html)</dd>



## まとめ
ニューラルネットワークとは、パーセプトロンの集合体で、信号を変換する際に使われる活性化関数がシグモイド関数など、多岐に渡り、その変換された信号が別のパーセプトロンに行くと言うのが何度も続いたもの （あってるのだろうか...）

## 感想
初めてqiitaの記事を書いてみたが、初めてにしてはいい方なんじゃないか。
ただ、画像の挿入や、リストの使い方など、まだまだ不安な点は多い。これからブラッシュアップしていきたい。
また、ここは違うと言った指摘も随時受け付けております。その都度変更を加えて、いい記事が描けるように精進していきたいと思う。
これからよろしくお願いいたします。
s=jωをする理由（制御工学）

#s=jωはフーリエ変換しているのと同じ
まずは，ラプラス変換とフーリエ変換の式を見比べてみましょう。


#### フーリエ変換
```math
  F(j\omega) = \mathcal{F}[f(t)] = \int^{\infty}_{-\infty}f(t)e^{-j\omega t}dt 
```

#### ラプラス変換
```math
F(s) = \mathcal{L}[f(t)] = \int^{\infty}_{0}f(t)e^{-st}dt = \int^{\infty}_{0}f(t)e^{-(\sigma+j\omega)t}dt
```

どこが違うか分かりましたか？

$e$の指数部分と積分範囲ですね。ラプラス変換の$e$の指数部分で，$\sigma=0$ (つまり$s=j\omega$) とすると，下のようになります。

```math
F(s=j\omega)  = \int^{\infty}_{0}f(t)e^{-j\omega t}dt
```

もうこれ，フーリエ変換ですね。
え？　積分範囲が$-\infty$～$\infty$じゃないって？
そうなんです。実は，"$s=j\omega$でフーリエ変換と同等になる" というのは，元の関数$f(t)$が次の条件式になっている場合に限られます。

```math
f(t) = \left\{
\begin{array}{ll}
f(t) & (t \geq 0) \\
0 & (t \lt 0)
\end{array}
\right. 
```

もう一度，$s=j\omega$した式に戻りましょう。
$t<0$において$f(t)=0$であることを踏まえて，以下の変形をします。

```math
\begin{align}
F(s=j\omega)  &= \int^{\infty}_{0}f(t)e^{-j\omega t}dt\\
&=\int^{0}_{-\infty}0・e^{-j\omega t}dt+\int^{\infty}_{0}f(t)e^{-j\omega t}dt\\
&=\int^{0}_{-\infty}f(t)・e^{-j\omega t}dt+\int^{\infty}_{0}f(t)e^{-j\omega t}dt\\
&=\int^{\infty}_{-\infty}f(t)e^{-j\omega t}dt\\
&=\mathcal{F}[f(t)]
\end{align}
```

以上から，$s=j\omega$としたとき，フーリエ変換と同等になることが分かりました。

# まとめ
$s=j\omega$とすると，フーリエ変換と同等になると言いましたが，先程説明した通り$f(t)$に$t\lt 0$のとき$f(t)=0$になるという条件があることに注意してください。
~~また，$f(t)$がそもそもフーリエ変換可能な関数ではない場合も$s=j\omega$としてはいけません。 例えば，$f(t)=\sin(\omega t)$の場合，ラプラス変換すると$F(s)=\frac{\omega^2}{s^2+\omega^2}$になります。ここに，$s=j\omega$とすると分母が発散してトンチンカンなことになります。
そもそもラプラス変換は，このようなフーリエ変換できない関数をフーリエ変換するために，収束因子$e^{-\sigma t}$をかけたという経緯があります。ですので，フーリエ変換できない関数をラプラス変換したものに，$s=j\omega$(つまり，$\sigma=0$)としてフーリエ変換にするという行為は極めてナンセンスです。~~
※訂正：
$f(t)=\sin(\omega_0 t)$のフーリエ変換は存在しました。

```math
F(\omega)=\mathcal{F}[f(t)]=\dfrac{\pi}{j}\{\delta(\omega-\omega_0)-\delta(\omega+\omega_0)\}
```
【PHP】リンクの?と&

PHPについて学習内容を備忘録としてまとめます。

#リンクの?と&

##パスに?を指定
リンク先のパス名を書くときに値を渡したい時があると思います。
例えば、商品番号であるpro_codeをリンク先に値として渡したいときには?の後に指定します。

```php
#pro_list.php
#rec['code']は飛ぶ先の商品コードが入っており、今回は１が入っています。
#商品の詳細情報を確認するボタン

<a href="../product/pro_disp.php?pro_code='.$rec['code'].'">商品コード１</a>

↓クリックするとpro_disp.phpに飛ぶ

#pro_disp.php

<?php
print '商品コード１：';
print '.pro_code.';
?>

#実行結果
商品コード：1

```
このようにパスで指定したpro_codeの値をパス先であるpro_disp.phpに渡しています。

##パスに&を指定
パス先に複数の値を返したいときには&を使います。
下記の例では先ほどに追加でユーザーIDを値として渡す場合の処理になります。

```php
#pro_list.php
#商品の詳細情報を確認するボタン
#user_idには１が入っています

<a href="../product/pro_disp.php?pro_code='.$rec['code'].'&user_id=$_SESSION['user_id']">商品コード１</a>

↓クリックするとpro_disp.phpに飛ぶ

#pro_disp.php

<?php
print '商品コード１：';
print '.pro_code.';

print 'ユーザーID：';
print '.user_id.';

?>

#実行結果
商品コード：1
ユーザーID：1

```
このように商品IDとユーザーIDを2つパス先に渡すことができました。
Python関数〜max, min, sum, len, all, any


#はじめに
今回の記事では、paizaのスキルチェックでも多用するリストに関する関数を取り上げていきたいと思います。
max, min, sum, len, all, anyの6つを取り上げていきます。
それではいきましょう。

#max
max関数はリスト内の最大値を取得してくれます。

```Python

numbers = [23, 25, 21, 20, 26, 28, 22, 29, 27, 24, 30]

print(max(numbers))

# 30
```
一瞬でリスト内の最大値を取得できました。

文字列も見ていきましょう。

```Python

names = ["B", "K", "C", "Z", "A"]

print(max(names))

# Z
```
文字列の場合max関数を使うとZを取得できました。
アルファベットでは、後ろにあるほど大きいと捉えるとわかりやすいですね。


#min
min関数はリスト内の最小値を取得してくれます。

```Python

numbers = [23, 25, 21, 20, 26, 28, 22, 29, 27, 24, 30]

print(min(numbers))

# 20
```
一瞬でリスト内の最小値を取得できました。

文字列も見ていきましょう。

```Python

names = ["B", "K", "C", "Z", "A"]

print(min(names))

# A
```
文字列の場合max関数を使うとAを取得できました。
アルファベットでは、前にあるほど小さい捉えるとわかりやすいですね。

#sum
sum関数はリストないの数字の合計を出力してくれます。

```python
numbers = [23, 25, 21, 20, 26, 28, 22, 29, 27, 24, 30]

print(sum(numbers))
# 275
```
このようにリストないの数字の合計を出力してくれました。

ここで注意点があります。
リスト内の要素に文字列が一つでもあるとエラーがでます。

```python
numbers = ['23', 25, 21, 20, 26, 28, 22, 29, 27, 24, 30]

print(sum(numbers))

#TypeError: unsupported operand type(s) for +: 'int' and 'str'
```
リスト内の要素が全部数字であることを確認してから使うようにしましょう。

#len
len関数はリストの要素数を出力してくれます。

```python
numbers = [23, 25, 21, 20, 26, 28, 22, 29, 27, 24, 30]

print(len(numbers))
# 11
```
このようにリストの要素数を出力してくれました。

#all
all関数はリストの要素が全てTrueであればTrueを返し、一つでもFalseがあればFalseを返します。
言葉の説明ではわかりにくいので、コードを見ていきましょう。

```python
numbers = [1, 0, 1, 1, 1, 1, 1]

print(all(numbers))
# False
```

```python
numbers = [1, 1, 1, 1, 1, 1, 1]

print(all(numbers))
# True
```

```python
words = ["B", "K", "C", "Z", "A"]

print(all(words))
# True
```
```python
print(all([])

# True
```
このように全てがTrue以外の時はFalseを返すことが確認できました。

#any
all関数はリストの要素が全てTrueであればTrueを返し、一つでもFalseがあればFalseを返します。

```python
numbers = [0, 1, 0, 0, 0, 0, 0]

print(any(numbers))
# True
```
```python
numbers = [0, 0, 0, 0, 0, 0, 0]

print(any(numbers))
# False
```
１つでもTrueとなるものがあればTrueを返すことを確認できました。

#最後に
今回はリストに関する関数を取り上げてきました。
今後paizaのスキルチェックでの活用法などを上げていきたいと思います。
また、Pythonの関数についても今後上げていくので、参考になれば幸いです。
Re:ゼロから始める共有ファイル生活

A「会社の共有ファイル置き場にしてるサーバおっそくてイライラするわ〜」
A「せや！自動でファイル同期するフリーウェア使って常にローカルに共有フォルダの中身置いておけば、いちいちサーバ見に行かなくて済むやん！」

・・・・・・

A「保存先のフォルダを作って〜、アプリの設定で同期元と同期先のフォルダを指定して〜、同期開始！」

・・・・・・

A「あれ？同期されてない。フォルダが空のままだ。」

B「うわあああ！サーバの共有フォルダ空なんだけど！」
C「今までの仕様書とか全部ないんだけど！バックアップとってる！？」
社内SE「バックアップ取ってないです」

A「・・・・ああああああああ、同　期　元　と　同　期　先　の　フ　ォ　ル　ダ　の　設　定　を　逆　に　し　て　た」

・・・・・・

A「みんながローカルにいろいろ保存してくれていたおかげで、ある程度復元できた、みんなありがとう〜」

B「次から気いつけや」
C「次から気いつけや」

・・・翌日・・・

B「また共有フォルダ空になってるんだけど！」

A「同　期　ア　プ　リ　O　N　に　し　た　ま　ま　だ　っ　た」

----

同期アプリやコマンドはちょっと設定ミスっただけで大惨事になるので、同期元、同期先のパスはよく確認しましょう。
ｒｓｙｎｃならｄｒy−ｒｕｎで事前にどういうファイル更新が行われるのか確認できるので、必ず実行前に確認しましょう。

**あなた、怠惰デスね**

と言われないように。

----

[2nd season](https://qiita.com/tosiooooooo/items/17de55c35ff42802c340)もあります
ソフトウェア品質特性ー保守性、信頼性、移植性、機能性

応用情報技術者平成29年秋期 午前54


品質の定量評価の指標のうち，ソフトウェアの保守性の評価指標になるものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2e8c850a-d947-c670-21ed-106021d8b08b.png)


１、保守性
ソフトウェア品質特性について定めたJIS X 0129-1では、
保守性を「修正※のしやすさに関するソフトウェア製品の能力」と定義しています。
つまり保守性の度合いは、そのソフトウェアを修正するために要するコストの高低によって決まるということになります。

※是正若しは向上，又は環境の 変化，要求仕様の変更及び機能仕様の変更にソフトウェアを適応させることを含む


２、信頼性
(最終成果物に含まれる誤りの件数)÷(最終成果物の量)
残存バグ数の割合を表す式なので、信頼性の評価指標です。


３、移植性
(変更が必要となるソースコードの行数)÷(移植するソースコードの行数)
別環境への移植に際して変更が必要となるソースコードの割合を表す式なので、移植性の評価指標です。


４、機能性
(利用者からの改良要求件数)÷(出荷後の経過月数)
月当たりの改良要求件数を表す式なので、機能性の評価指標です。


参照：
https://www.ap-siken.com/kakomon/29_aki/q54.html
【Python】Numpyにおけるdtype「int32」の理由（Windows環境）（2020年9月時点）

私がNumpyの勉強を実施している時に気になったことがあります。
例えば以下の通りNumpyの配列を作成して「dtype」でデータ型を確認します。
すると、以下の通り「int32」が返ってきます。
※Windows環境が前提となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/6984c1ea-b53e-5885-7073-0394a6be87f9.png)

ここで疑問を感じました。

<font color="red">『なぜデフォルトが  int32(32bit）なのか？』</font>

#■ OS環境のビット数に依存するのか？　⇒　NO
最初はOSのビット数に依存しているのかと考えました。
しかし私の環境は以下の通り64bitです。
OS環境のビット数には依存していません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/ca5a9def-d45f-ee84-af98-e62395526ebf.png)

#■ Python環境のビット数に依存するのか？　⇒　NO
次にPython環境のビット数に依存しているのかと考えました。
sysモジュールのmaxsizeを利用してPython環境のビット数を調べます。

32bit　：　2147483647
64bit　：　9223372036854775807

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561572/637a5f7e-0309-e3ee-00aa-28274462fafd.png)

結果は上記の通り「9223372036854775807」なので、Python環境は「64bit」となります。
Python環境のビット数には依存していません。

#■　結論　⇒　C言語におけるlong型の仕様です
<font color="red">『なぜデフォルトが  int32(32bit）なのか？』</font>

この原因を理解するためには、Numpyの前提を思い出す必要がありました。

『NumPyの内部はC言語 (およびFortran)によって実装されているため非常に高速に動作する』

NumpyはC言語によって実装されており、np.int_はC longで定義されています。

参考：[『Numpy　データ型』](https://docs.scipy.org/doc/numpy-1.10.1/user/basics.types.html)

Microsoftによりデフォルトのlong型は4byte(4*8=32bit)とされています。
そのためWindowsにおいてはOSやpython、numpyのビット数に関わらず、
デフォルトでは np.int_がint32となっているようです。

参考：[『C言語　基本タイプのサイズ』](https://docs.microsoft.com/en-us/cpp/c-language/storage-of-basic-types?redirectedfrom=MSDN&view=vs-2019)

結論は<font color="red">『C言語におけるlong型の仕様』</font>でした。
ffmpegのコツを掴む

##ffmpegとは
"動画から画像を切り出したい"や"動画から音声のみを取り出したい"、"複数の画像から動画を作りたい"、"jpegをpngに変換したい"など思ったことはありませんか？
でもいちいちソフトをダウンロードするのはめんどくさいし、有料・無料とか種類はたくさんあって結局どれを選べばいいのかわからない。
そんな時にとっても便利なのがffmpegです。読みはエフエフエムペグ。

##インストール方
Windows: [こちら](http://rikoubou.hatenablog.com/entry/2019/11/07/144533)
Mac: "brew install ffmpeg"を実行

##使用法
基本: "ffmpeg -i [入力データのパス] [出力データのパス]" (出力データのパスで指定した拡張子でエンコードされる)
例: "ffmpeg -i input.avi output.mp4" => input.aviがoutput.mp4に変換されて出力

##最高画質で画像を切り出す
"ffmpeg -i input.mp4 -q 1 -qmin 1 %4d.jpg"
-q と -qmin で1を指定してやることで最高画質で切り出せます。
%4dのところは数字列4桁の連番で画像名が決まるってだけでなんでもいいです。
1秒あたりの切り出し枚数は-r 30みたいにオプションつけることで指定できます。
【Vue.js】怖がらないで、引数分割束縛（argument destructuring）

関数({ $axios })とか初見だと、ビビる引数の書き方でてきますよね

その名も`引数分割束縛`。なんか、恐い言葉です。

これの目的は、何回も記されるコードを`因数分解`して、省略しちゃおうというのが目的です。


##asyncData

contextを省略するパターン

```javascript:
async asyncData(context) {
  const posts = await context.$axios.$get('/posts')
  return { posts }
},
```

↓

```javascript:
async asyncData({ $axios }) {
  const posts = await $axios.$get('/posts')
  return { posts }
},
```

contenxtとresを省略するパターン

```javascript:
async asyncData (context) {
  const res = await axios.get('/posts/' + context.params.id)
  return { post: res.data }
}
```
↓

```javascript:
async asyncData ({ params }) {
  const { data } = await axios.get('/posts/' + params.id)
  return { post: data }
}
```


##Vuexのstore

```javascript:
export const actions = {
  async login (context) {
    await context.commit('switchLogin')
  })
}
```

↓ 

```javascript:
export const actions = {
  async login ({ commit }) {
    await commit('switchLogin')
  })
}
```


#つまり、何が起きているか。

まず分割代入の仕組みで、代入

```javascript:
{ a } = { a: 1 }
console.log(a)  // 1
```

オブジェクトのキーから、代入

```javascript:
let option = { a: 1 }
{ a } = option.a
console.log(a)  // 1
```



##要はこんなことが起きている

```javascript:
export const actions = {
  async login (context) {
    await 〇〇('switchLogin')
  })
}

export const actions = {
  async login ({ commit }) {
    await 〇〇('switchLogin')
  })
}
```

いずれの場合も、「〇〇」と示せるようにすれば良いから

```javascript:
{ commit } = { commit: 〇〇 }
console.log(commit)  // 〇〇

let context = { commit: 〇〇 }
{ commit } = context.commit
console.log(commit)  // 〇〇
```
プレシデンスダイアグラム（PDM図）、アローダイアグラム（PERT図）

応用情報技術者平成29年秋期 午前53


次のプレシデンスダイアグラムで表現されたプロジェクトスケジュールネットワーク図を，アローダイアグラムに書き直したものはどれか。ここで，プレシデンスダイアグラムの依存関係は全てFS関係とする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7c88955a-3b02-55fa-bd11-a576189880d5.png)
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/0166828d-23e3-bbc6-dbe6-8f3c50078941.png)


１、プレシデンスダイアグラム法は、PDM　precedence diagramming method
個々の作業を四角で囲み、作業同士を矢印で結ぶことで作業順序や依存関係を表現する図法です。

PERT図より、PDMは連続する2つの作業の間にラグ（待ち時間）とリード（準備期間）の概念を持ち込み、より精緻な日程計画を表現できるように工夫されている。

※precedence　(時間・順序などが)先立つこと、先行、先任、上位、優先(権)


２、PERT図（別名：アローダイヤグラム）　Program Evaluation and Review Technique
PERTなどは先行作業が終了すればすぐに後続作業がスタートする“イベントドリブン型”。


３、PERT図とPDM図
作業同士の関係を表すという意味ではアローダイアグラムと同じですが、
・アローダイアグラムでは作業を矢印で、結合点を丸のノードで示すので、記述方法が根本的に異なります。
・またアローダイアグラムでは、ある作業の終了が別の作業の開始条件となる「終了－開始」(FS：Finish to Start)の依存関係しか表現できませんが、
・プレシデンスダイアグラムではこの他に、「開始－開始」(SS：Start to Start)、「開始－完了」(SF：Start to Finish)、「完了－完了」(FF：Finish to Finish)の関係を記述できることが特徴です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/33d2975e-b3e0-ea86-96eb-f3c3d8ae9693.png)



参照：
PERT（パート）図を使って遅れてはいけないポイントを洗い出す
https://sp-jp.fujifilm.com/future-clip/visualization/vol4.html

プレシデンスダイアグラム法
https://www.itmedia.co.jp/im/articles/0603/19/news005.html
Docker ComposeでNode.jsの環境構築

#動機
[Create React Appを少し遠回りしてはじめよう](https://hand-dot.com/blog/start-react-app-with-create-react-app/)をローカル環境を汚さずに実践したかっため、タイトルのような環境構築を目指しました。

#最終的なディレクトリ構成
```:最終的なディレクトリ構成
node-docker/
    |--docker-compose.yml
    |--node/
        |--app/
```

#docker-compose.yml
>
[Docker Compose 概要](https://docs.docker.jp/compose/overview.html)
Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。

まずプロジェクトフォルダ`node-docker`を作成し、そこに`dockercompose.yml`ファイルを作成します。

```:現在のディレクトリ構成
node-docker/
    |--docker-compose.yml
```
```docker-compose.yml
version: '3'
services:
  node:
    image: node:14.9.0-alpine3.10
    container_name: node
    volumes:
      - ./node/app:/app
    tty: true
    ports:
      - 3000:3000
```

##### version
`docker-compose.yml`のファイルフォーマットのバージョン
##### services
各コンテナをサービスとして定義できます。
##### node
サービス名
##### image
コンテナを実行時に元となるイメージを指定します。
イメージが存在していなければ、ComposeはDocker Hubからpull（取得）を試みます。
`Dockerfile`からイメージを作成する場合は、例えば`node`ディレクトリの下に`Dockerfile`を作成し、以下のように指定します。
`build: ./node`
##### container_name
デフォルトで生成される名前の代わりに、カスタム・コンテナ名を指定します。なお、デフォルトだとnode-docker_node_1という名前になります。
##### volumes
ローカルのパス（左）とコンテナのパス（右）を共有します。
##### tty
端末を起動するかどうかを指定しています。（多分）

* [Docker— docker run -it の -t を抜くとどうなるか ( tty 指定なしの interactive モード )](https://qiita.com/YumaInaura/items/b8d605f17d98572bb865)
* [ttyとかptsとかについて確認してみる](https://qiita.com/toshihirock/items/22de12f99b5c40365369)

##### ports
ポートを公開します。ホストとポートを指定（ホスト:コンテナ）するか、コンテナのポートのみ指定します（ホスト側のポートはランダムに選ばれます）。
`expose`はポートを露出し、リンクされたサービス間でのみアクセス可能になります。

* [docker-compose の ports 指定まとめ]
(https://qiita.com/tksugimoto/items/23fcce1b067661e8aa46)
* [ロミオとジュリエットで学ぶ「ポートが開いてる」と「Listenしている」の違い](https://qiita.com/DQNEO/items/7027fda87a1ecf44b9f2)

#コンテナの作成と起動
ここまでで必要なファイルが揃ったので、コンテナの作成と起動を行っていきます。
`Dockerfile`からイメージを作成する場合は、`Docker-compose build`する必要がありますが、今回は既にビルドされたイメージをリモートから取得するので必要ありません。
作業は`docker-compose.yml`が置いてあるディレクトリ上で行います。

```console:terminal
$ docker-compose up -d
```

`d`オプションにより、バックグラウンドで起動することができます。

# nodeコンテナに入る
以上でnode環境は整いましたが、node環境はコンテナ上にあるため、作業はその上でする必要があります。
そのために、起動中のコンテナ内で指定したコマンドを実行できる`exec`コマンドを利用して、コンテナ上でシェル、端末を起動します。

```console:terminal
$ docker-compose exec node sh
```

コンテナ内のディレクトリ構成は以下のようになっていて、`docker-compose.yml`で指定したためコンテナでの`app`ディレクトリとローカルの`node/app`ディレクトリは対応しています。

```:コンテナ内のディレクトリ構成
/
    |--app
    |--bin
    |--dev
    |--home
    |--lib
    |--media
    |--mnt
    |--opt
    |--proc
    |--root
    |--run
    |--sbin
    |--srv
    |--sys
    |--tmp
    |--usr
    |--var
```
作業は、ローカルと共有できているappディレクトリでした方が良いと思います。
#参考
[Compose file version 3 reference](https://docs.docker.com/compose/compose-file/#reference-and-guidelines)
[Compose ファイル・リファレンス](https://docs.docker.jp/compose/compose-file.html#volumes-volume-driver)
[Docker Compose - docker-compose.yml リファレンス](https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa)
[【初心者向け】Dockerで手軽にNode.js開発環境構築 (2)](https://qiita.com/yukin01/items/4f54496fd2f577c56b1d)
EVM(Earned Value Management)

応用情報技術者平成29年秋期 午前52

プロジェクト管理においてパフォーマンス測定に使用するEVMの管理対象の組みはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/6695dd48-04cf-4657-abbb-619ca2235c6c.png)


１、EVM(Earned Value Management)は、プロジェクトにおける作業を金銭の価値に置き換えて、コストとスケジュールの2つを定量的に管理する進捗管理手法です。

EVMでは予算値と実績値からPV、EV、ACの各指標を算出し、それぞれを比較することでコスト差異とスケジュール差異を把握します。

EVMとは、プロジェクトマネジメントにおいて進捗状況の把握・管理を行う手法の一つ。作業の到達度を金銭などの価値に換算したEV（Earned Value：アーンドバリュー、出来高）という概念で把握する。

・EV (Earned Value：出来高)
EVMで利用される指標の一つで、ある時点までに完了した工程の予算コストの合計のこと。

・PV (Planned Value：計画価値)
積算した計画値

・AC (Actual Cost：実コスト)
EVMで利用される指標の一つで、ある時点までに投入した実際のコストの合計のこと。

・コスト効率指数（CPI：Cost Performance Index）= EV/AC

・スケジュール効率指数（SPI：Schedule Performance Index）= EV/PV

・SV (Schedule Variance：スケジュール差異)
EVMで利用される指標の一つで、ある時点で完了した作業の予算コストの合計（EV：Earned Value）と、計画時にその時点で完了していると予想されていた作業の予算コストの合計（PV：Planned Value）の差のこと

・CV (Cost Variance：コスト差異)
EVMで利用される指標の一つで、ある時点までに投入した実際のコスト（AC：Actual Cost）と、完了した作業の予算コストの合計（EV：Earned Value）との差のこと


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3be00331-4a13-4c31-9c87-50a9495eeaef.png)


参照：

開発プロジェクト管理
https://qiita.com/lymansouka2017/items/1377a2aab513c78152c7

https://www.ap-siken.com/kakomon/29_aki/q52.html
Laravel8をインストールしたらやっていること一覧

## まえがき

・ヮ・）あ、おはようございまーす

毎回「この前、最初にどんな設定をしたっけ」と悩んでしまうので**自分がよくやる設定**を備忘録を兼ねてまとめました

Laravel6の設定は[こちら](https://qiita.com/schrosis/items/a41c132ad002a9eebf02)

## `composer create-project` しないでインストールした場合

`composer create-project` してLaravelをインストールすると
`.env.example` をコピーして `.env` を作って、`APP_KEY` の設定もしてくれます

しかし、Laravelのプロジェクトをクローンして `composer install` でインストールした場合は、手動でやる必要があります

```sh
# .env.exampleをコピーして.envを作成
php -r "copy('.env.example', '.env');"
# APP_KEYの生成
php artisan key:generate
```

## APP_NAMEの変更

```ini:.env
APP_NAME=アプリケーション名
```

```php:config/app.php
'name' => env('APP_NAME', 'アプリケーション名'),
```

## public/storageにstorage/app/publicへのシンボリックリンク作成

```
php artisan storage:link
```

## データベースの設定

```ini:.env
DB_CONNECTION=mysql
DB_HOST=ホスト名
DB_PORT=3306
DB_DATABASE=データベース名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
```

## タイムゾーン

```diff:config/app.php
-'timezone' => 'UTC',
+'timezone' => 'Asia/Tokyo',
```

## 言語設定
```diff:config/app.php
-'locale' => 'en',
+'locale' => 'ja',
```

ダミーデータの日本語化もついでに

```diff:config/app.php
-'faker_locale' => 'en_US',
+'faker_locale' => 'ja_JP',
```

## メッセージの日本語化
resources/lang/ja/
に各種メッセージファイルを作る

```sh
php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang-files.php');"
php -f install-ja-lang-files.php
php -r "unlink('install-ja-lang-files.php');"
```


## よく使うライブラリ導入(お好みで)

```sh
# マイグレーションでカラムの定義を変更するのに必要なdbal
composer require doctrine/dbal

# FacadeやModelのPHPDocを生成してIDEでコード補完できるようにしてくれるlaravel-ide-helper
composer require --dev barryvdh/laravel-ide-helper

# デバッグバーを表示してくれるlaravel-debugbar
composer require --dev barryvdh/laravel-debugbar
# laravel-debugbarの設定ファイルをconfig/debugbar.phpに持ってくる
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
```