OmniAICreator/Qiita-1.07M huggingface dataset:
Unity as a LibraryによるUIネイティブ化

こんにちは、mizogucheです。2015年9月にクラスターに入ったのでもう6年目です。

この記事は[クラスター Advent Calendar 2020 - Qiita](https://qiita.com/advent-calendar/2020/cluster)の2日目の記事です。

# Unity UIでの課題
UnityでUIを実装すると普段使っているネイティブアプリの操作性と違った触り心地になります。

ネイティブアプリで簡単に実装できるUIの操作性をUnityで再現するコストはかなり高く、たとえばiOSにおける戻るジェスチャ、Androidにおけるバックボタンなど、OS固有の操作はネイティブUIだと何も実装しなくても実現できる[^1]一方で、Unityではそれぞれのプラットフォームごとに独自に実装していく必要があります。

感覚的なものでいうと、スクロールビューのスクロールの感触なんかもUnity、iOS、Androidでそれぞれ違うので、Unity製のアプリだと他のネイティブアプリと比較して触り心地がよくないのが正直なところです。

Unityのランタイムの起動に時間がかかる分、アプリの起動時間が遅くなってしまうというのも大きな問題でした。

# Unity as a Library
Unityでビルドしたアプリを起動したらすぐにUnityのランタイムが実行されますが、[Unity as a Library(= UaaL)](https://unity.com/ja/features/unity-as-a-library)という技術で、アプリの一部分だけでUnityを利用することができます。

これによりUnityでの再現が難しいネイティブアプリのUIの操作感を実現しつつ、必要なところでUnityの表現力を発揮することができます。

## メンテナンスコストの増加
すべてがUnity製のアプリであれば1つのコードからiOS/Android両プラットフォームのアプリをビルドすることができます。

しかし、UaaLを使うことでiOS/Android両プラットフォームのネイティブUI部分を実装する必要が生まれます。

つまり、UaaLの採用によって実質的に2つのアプリを開発・メンテナンスする必要が生まれます。

# clusterではUaaLをどう利用したか
## ネイティブUIのoutroom/Unityのinroom
ワールド・イベントに入るまでの世界をoutroom、ワールド・イベントに入った後のUnityの世界をinroomと呼んでいます[^2]。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">in-gameとかのもじりなんだけど、in-game人によって解釈ばらつくっていうのと、イベントとかエモいワールドとか別にゲームじゃないけど大事なので疎外するような言葉を使いたくないよねっていう造語、たぶんこの先5年ぐらい使うことになるので言霊の設計は大事</p>&mdash; xyx (@xanxys_) <a href="https://twitter.com/xanxys_/status/1333828886891700224?ref_src=twsrc%5Etfw">December 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

モバイルアプリ版clusterで、outroomをネイティブ、inroomでUnityを使うようアップデートしたものが[11月にリリースした v1.85](https://note.com/cluster_official/n/n764ffc8cf06b)です。

これにより、Unity UIでの課題を解決してネイティブの触り心地を実現つつ、ワールド・イベントのクリエイティブな領域ではUnityの表現力を使うことができるようになりました。

[この動画をご覧いただくと](https://youtu.be/n7y2ECnQqrA)、普通にネイティブUIで実装し直すだけでどれだけ改善されたかがおわかりいただけるかと思います。

# 今後
outroomをネイティブUIにして体験を改善することができました。

しかしまだまだ改善することは山積みなため、[クラスターではiOS/Androidエンジニアを募集しています。](https://www.wantedly.com/companies/cluster/projects)

というわけで2日目の記事は以上です。

明日はかばにゃすさんの経理業務とデータベースの関係性です。 お楽しみに！！

[クラスター Advent Calendar 2020 - Qiita](https://qiita.com/advent-calendar/2020/cluster)

# 参考リンク
- [Unity - Manual: Using Unity as a Library in other applications](https://docs.unity3d.com/2019.4/Documentation/Manual/UnityasaLibrary.html)
- [Unity-Technologies/uaal-example](https://github.com/Unity-Technologies/uaal-example)

[^1]: Androidのバックボタンは遷移先の制御を考えると何も実装しなくてもいいは過言 :innocent: 
[^2]: roomというのは古来よりクラスター内部で使われてきた用語です。
2日目

# 2日目やってみた
- 日中出たり入ったりが多々あったせいか、疲れてしまい1ページ（フォントカラーとサイズ）だけしか出来なかった
- 次は背景色変更とサイズの修正
- 個人的にはなんかHTMLらしくなってきたと思う
駆け出しエンジニア の学習記録 4日目　HTML/CSS



参考サイト↓
http://www.htmq.com/html/indexm.shtml


insert mode 勝手に発動していた


css 

class は　."class名"
id は　#"id名"
 
pタグの中のclassを指定するのは　　　p."class名"
h1,p 　　　　　　　両方を指定
h1,".class名" 　　　両方を指定
div p 　　　　　　　divタグのpを指定　
h2:hover           疑似クラスを使ったセレクタ　状態を指定している　
padding 内側の余白
margin 外側の余白　
padding:○px.○px.○px.○px.; 上から時計回りに指定できる　
<!-margin :auto; よく使う　 


他のメモはHTMLタグが反応しまくって見えにくいので割愛しますｗ
配列に対してメソッドを使う時気を付けること(RubyonRails)

私のメモ用ですが、どなたかのヒントになれば幸いです
#概要
配列に対して処理を使う際、ひとつひとつに対して処理を適用しなければならない。
結論はmapメソッドを使えば配列それぞれに処理を適用できます。

#実例
下記の例では配列Arrayに対してメソッドの確認を行おうとしておりますが、当然これでは確認はできません。

```ruby:例
if Array.respond_to?(:content_type)
# => false
```

mapメソッドを使えば、配列のひとつひとつに対して処理を行えます。

```ruby:例
if Array.map {|a| a.respond_to?(:content_type)}
# => true(Arrayにcontent_typeメソッドがあれば)
```

#まとめ
結論、mapメソッドの使い方の話になりますが、これに気付かず一日ハマってしまいました。
扱っているものが単体なのか配列なのかをしっかり意識すべきだと思いました。
Javaの文字列入門

今回はJavaの文字列についての扱いを簡単にまとめて見ます。

#1 Javaでの文字列変数の定義方法

Javaでは文字列は標準クラス（Javaの言語機構に標準で含まれているクラス）のStringを使います。

```Java
String str = new String("Hello world");
```

こんな感じです。
あるいは、下記のような書き方でも宣言できます。

```Java
String str = "Hello world";
```

ただし、newを使うやり方だと無駄なインスタンスを使うことになってしまうので、通常はString str = "Hello world";のようにします。


#2 文字列を扱う便利なメソッド

文字列の扱いは、文字列用に用意されたStringクラスのメソッドを使うことで便利になります。

```Java
// length 文字列の長さを取得
String str1 = "apple";
int strlen = str1.length(); // 5

// substring 文字列の部分文字列を取得
// 1番目の引数：始まりの位置（0から始まる）
// 2番目の引数：終わりの位置（省略すると最後まで）
String str2 = "orange";
String str3 = str2.substring(2, 4); // ang
String str4 = str2.substring(0, 3); // oran
String str5 = str2.substring(3); // nge

// indexOf 指定された文字列が最初に現れる位置を返す（0が起点）
// 存在しない場合は-1が返される
String str6 = "banana";
int index1 = str6.indexOf("nan"); // 2
int index2 = str6.indexOf("non"); // -1
```

他にも文字列を扱うメソッドはたくさんあるので、詳しくは[公式ドキュメント（Java8）](https://docs.oracle.com/javase/jp/8/docs/api/index.html?java/lang/String.html)を見てください。

#3 文字列の比較方法

文字列の比較はequalsというメソッドを用います。

```Java
String str7 = "Tokyo";
String str8 = "Tokyo";
String str9 = "Osaka";
boolean check1 = str7.equals(str8); // true
boolean check2 = str7.equals(str9); // false
```

こんな感じです。イコール（=）で比較するとメモリ領域を比較することになるので、必ずしも期待した結果にならないので気をつけてください。

#4 文字列の結合

文字列の結合はプラス（+）を使います。

```Java
String str10 = "Super";
String str11 = "Star";
String str12 = str10 + str11; // "SuperStar"
```

こんな感じです。ただし、何回も繰り返すとパフォーマンスが悪くなるので、このような場合はStringBuilderクラスを使って以下のようにします。

```Java
StringBuilder builder = new StringBuilder();
List<String> data = getData(); // getDataは文字列のリストを取得するメソッドとします
int dataSize = data.size();
for (int i = 0; i < dataSize; i++) {
    builder.append(data.get(i));
}
return builder.toString();
```

# 終わりに

こんな感じで、いくつか気をつけるところがあったりしますが、うまく文字列処理ができるようになりたいものです。
文字列処理は正規表現を使うともっと複雑なことができたりしますが、それについては別の機会に紹介します。

この記事は[こちらのブログ](https://yk0807.com/techblog/2020/11/30/java%e3%81%ae%e6%96%87%e5%ad%97%e5%88%97%e5%85%a5%e9%96%80/)の内容を転記したものです。
deviseだけで管理者を設定したい

#はじめに
　現在作成中のアプリでユーザーを`user`と`admin`に2つに分けたいと思い、実装してみた。

##前提
　userのコントローラーやビューやモデルは作成済み。
　管理者設定のgemは使わず、deviseのみで完結させる。

##adminコントローラー生成まで

####deviseのconfigをいじる。

```ruby:config/initializers/devise.rb/247行目
  # ==> Scopes configuration
  # Turn scoped views on. Before rendering "sessions/new", it will first check for
  # "users/sessions/new". It's turned off by default because it's slower if you
  # are using only default views.
  config.scoped_views = true ←コメントアウトを外して、trueにする
```


```ruby:config/initializers/devise.rb/255行目
# Set this configuration to false if you want /users/sign_out to sign out
  # only the current scope. By default, Devise signs out all scopes.
  config.sign_out_all_scopes = false ←コメントアウトを外してfalseにする
```

ターミナルで

```bash
rails g devise admin
```

##adminコントローラーを少し編集

```ruby:app/models/admin.rb
class Admin < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, #:registerable, ←コメントアウトする
         :recoverable, :rememberable, :validatable
end
```
【#PowerApps】Power Apps でアプリを作成する人向け学習コンテンツまとめ

# 概要

これから Power Apps を始める人も、すでに始めている人にもおすすめな Power Apps でアプリを作成する人向けの学習コンテンツのまとめになります。
何かあれば随時、追加・編集していきます。


# コンテンツ

## Microsoft Learn

### Microsoft Power Platform の基本
https://docs.microsoft.com/ja-jp/learn/paths/power-plat-fundamentals/
Power Platform の基本を押さえた内容になります。
Power Platform および Power Apps とは何？という方やもう一度基礎から学びたい人などにおすすめです。

### Power Apps に関する入門情報
https://docs.microsoft.com/ja-jp/learn/modules/get-started-with-powerapps/
Power Apps を触ったことのない人向けのコンテンツです。
若干古い部分もありますが、概要やアプリの設計方法など基本は変わっていないのでこの辺りは押さえておきましょう。

### Power Apps でキャンバス アプリを作成する
https://docs.microsoft.com/ja-jp/learn/paths/create-powerapps/
Power Apps の作成 ~ 管理方法まで学べます。
Power Apps で普段アプリを作っているけど管理までしたことがない人にはぜひ！

### Power Apps キャンバス アプリの高度な技法を習得する
https://docs.microsoft.com/ja-jp/learn/paths/understand-advanced-topics/
様々な数式の使い方やパフォーマンスの改善方法、テスト方法などが学べます。
Power Apps でアプリを１度でも作ったことがある方にお勧めです。

### Power Apps のモデル駆動型アプリケーションを作成する
https://docs.microsoft.com/ja-jp/learn/paths/create-app-models-business-processes/
Dataverse (旧 Common Data Service)　の基礎とモデル駆動型の基礎が学べます。
コンテンツが若干古いので戸惑う部分も少しあるのが....

### Power Apps ポータルの利用を開始する
https://docs.microsoft.com/ja-jp/learn/paths/get-started-power-apps-portals/
Power Apps ポータルの基礎が学べます。
Power Apps ポータルを触ったことがないのであればこちらをお勧めします。
ただし、前提条件としてモデル駆動型アプリの基礎は押さえておいたほうが良いでしょう。


### Power Apps Component Framework を使用したコンポーネントの作成
https://docs.microsoft.com/ja-jp/learn/paths/use-power-apps-component-framework/
こちらは開発者向けの内容になっています。
非開発者の場合実際に開発することは少ないと思いますが、どういったアーキテクチャや管理がされているのかは押さえておいたほうが良いと思います。

### Power Apps の高度なデータ オプションおよびコネクタを使用する
https://docs.microsoft.com/ja-jp/learn/paths/advanced-data-options-and-connectors/
Power Appsからのデータやコネクタ周りを詳しく解説しています。
リレーション？委任？となる方はぜひ！

## ドキュメント

### 公式Docs
https://docs.microsoft.com/ja-jp/powerapps/
とても量が多いので気になるところを見てください。

### 公式 Docs のサンプルアプリ
https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/sample-crisis-communication-app
結構高度なことを行いますので、最初からこちらをやるのはお勧めはしませんが、Power Apps 以外も含めてサンプルがありますので、構築の参考になります。

### PowerAppsキャンバスアプリのコーディング規約とガイドライン_ホワイトペーパー
https://aka.ms/powerappscanvasguidelinesjp
Power Apps でのキャンバスアプリのコーディング規約などが丁寧に書かれています。2018年と少し古いですが、今でも使う内容ですので、一度ご覧ください。（最新版があったら教えてください。修正します。）

### SlideShare
https://www2.slideshare.net/search/slideshow?searchfrom=header&q=Power+Apps&ud=any&ft=all&lang=**&sort=
コミュニティーやイベントでの登壇で様々な方が登壇資料を公開しています。

### できるPower Apps
https://info.microsoft.com/JA-PowerApps-CNTNT-FY20-12Dec-03-Dekirupowerapps-SRGCM3106_01Registration-ForminBody.html

内容が少し古いですが、実際に社内での活用促進の方法や導入計画、アプリの作成方法などイラストなど込みで分かりやすく解説しています。

# まとめ

こういった資料を読んだからと言って実際に Power Apps を使えるかと言ったら答えは **「No」** です。
Excel や Word も初めは「？？？」がでながら **実際に触って覚えた部分や初めて知った機能** も多くあると思います。
ですので、資料を読んだり、問題を解いたりするだけではなく、実際に手を動かすことが Power Apps を理解する上での一番の近道だと私は思います。

***Let's try！***
Redmine入門

#Redmineの使い方とインストール方法　〜インストール編〜
参考サイト
https://goworkship.com/magazine/how-to-use-redmine/

##Redmineとは

プロジェクト管理をするためのオープンソースソフトウェア。
無償提供されている。

プロジェクト進捗やタスク管理に使い、それらをメンバーと共有するもの。

##特徴やメリット

・いわゆるタスクが「チケット」というもので管理されている。
・タスクごとに設定したスケジュールをガントチャートで確認できる。
・「Bitnami」を使えんば、簡単かつ無料でインストール可。
・Webサーバー上でインストールすれば複数人で共有して利用できる。
・タスクの対応漏れをチェックする機能が豊富
・運用方針に合わせてカスタマイズしやすい。

とまあ、簡単にチャットワークなどではタスクが放置されがちなリスクを回避できる工夫がされている感じでしょうか。
多角的にタスク管理できるのはありがたいですよね。
タスクが流れていってしまうのが一番怖いですからね。
これがあれば引継ぎや人員抜けによる戦力ダウンを防ぐことができると思います。

##インストール方法

1. 「Bitnami」からRedmineをDL
2. DLしたインストーラーを起動し、日本語を選択して「OK」をクリック
3. 「次へ」
4. 変更せず「次へ」
5. フォルダ選択は変更せず「次へ」
6. 管理者情報を入力して「次へ」　※ログイン名は小文字のみ
7. 「Apatch Webサーバのポート番号」を変更せず、「次へ」
8. 「SSLのポート番号」を変更せず、「次へ」
9. 「MySQLのサーバのポート番号」も変更せず、「次へ」をクリック
10. データベースで使用する言語を「日本語」にし、「次へ」
11. SMTPの設定画面でチェックをせず、そのまま「次へ」
12. Bitnamiクラウドホスティングについてもっと詳しくのチェックを外し「次へ」
13. 「次へ」をクリックし、インストール
14. これでローカルサーバー上でアクセスすればRedmineでログインができるようになる

※あくまでも今回のケースはローカルサーバー上での手順です。
Docker for Windows で postgresのコンテナが起動できない

Docker for Windows　で laradockのデータベースをpostgresにしたところ、うまくできない場合・・・


## psqlで接続できない・・・

laradockを利用して、postgresにデータベースを作成する為に

```
docker-compose exec workspace psql -U default -h postgres
```

を実行したところ、以下のエラー

```
psql: could not translate host name "postgres" to address: No address associated with hostname
```

## そもそもコンテナが起動してない・・・

docker ps してコンテナを確認すると、postgresは起動していない
docker-compose up -d で特にエラーが出ていなかったのだが・・・

```
docker ps

CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
1370b45bf0b5        nginx:alpine            "/docker-entrypoint.…"   40 minutes ago      Up 10 seconds       0.0.0.0:8082->80/tcp     laravel-sns_nginx_1
e92f90d8dd0f        laravel-sns_php-fpm     "docker-php-entrypoi…"   6 days ago          Up 12 seconds       0.0.0.0:9000->9000/tcp   laravel-sns_php-fpm_1
4fc742fdaba5        laravel-sns_workspace   "docker-php-entrypoi…"   6 days ago          Up 12 seconds       9000/tcp                 laravel-sns_workspace_1
```

## laradockディレクトリ内の.env　は永続化OK
```
DATA_PATH_HOST=../data
```

.envのDATA_PATH_HOSTがデフォルトの状態だとエラーになるという記事がヒットするが、私の環境は変更済み

はて？

## 解決！！！

laradockディレクトリのdocker-compose.yml を変更する事で解決しました！

```
  postgres:
    image: postgres:${POSTGRES_VERSION}-alpine
    depends_on:
      - php-fpm
    ports:
      - ${POSTGRES_PORT}:5432
    volumes:
#      - ${DATA_PATH_HOST}/postgres:/var/lib/postgresql/data   #変更前
      - ${DATA_PATH_HOST}/postgres:/var/lib/postgresql   #変更後
    environment:
```

vokumesのディレクトリ指定で最後のdataを削除

これで、再度、コンテナを起動

```
docker-compose up -d workspace php-fpm nginx postgres
Starting laravel-sns_workspace_1  ... done                                                                           Starting laravel-sns_php-fpm_1   ... done                                                                            Starting laravel-sns_nginx_1      ... done                                                                           Recreating laravel-sns_postgres_1 ... done  
```

でコンテナを確認

```
 docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
07773a4cbf64        postgres:11.6-alpine    "docker-entrypoint.s…"   6 seconds ago       Up 4 seconds        0.0.0.0:5432->5432/tcp   laravel-sns_postgres_1
1370b45bf0b5        nginx:alpine            "/docker-entrypoint.…"   44 minutes ago      Up 4 seconds        0.0.0.0:8082->80/tcp     laravel-sns_nginx_1
e92f90d8dd0f        laravel-sns_php-fpm     "docker-php-entrypoi…"   6 days ago          Up 6 seconds        0.0.0.0:9000->9000/tcp   laravel-sns_php-fpm_1
4fc742fdaba5        laravel-sns_workspace   "docker-php-entrypoi…"   6 days ago          Up 6 seconds        9000/tcp                 laravel-sns_workspace_1
```

無事にpostgresを起動できました！

しかし、同じ環境でmacのdockerだと問題なく動くのに、Docker for Windowsだと動かない原因までは追っていません！
自動調整ツールRubocopの導入と使い方

# Rubocop
Rubocop（ルボコップ）はRubyの静的コード解析ツールです。
「インデントが揃っていない」「余分な改行・スペースがある」などの指摘をRubyStyleGuideに基づいて行ってくれます。

[公式GitHub](https://github.com/rubocop-hq/rubocop)

Rubocopを導入

```ruby:Gemfile
group :development do
  gem 'rubocop', require: false
end
```

```ruby:ターミナル
% bundle install
% touch .rubocop.yml
```
続いてRubocopの設定を行います。

```ruby:.rubocop.yml
AllCops:
# 除外するディレクトリ（自動生成されたファイル）
# デフォルト設定にある"vendor/**/*"が無効化されないように記述
 Exclude:
   - "vendor/**/*" # rubocop config/default.yml
   - "db/**/*"
   - "config/**/*"
   - "bin/*"
   - "node_modules/**/*"
   - "Gemfile"


# 1行あたりの文字数をチェックする
Layout/LineLength:
 Max: 130
# 下記ファイルはチェックの対象から外す
 Exclude:
   - "Rakefile"
   - "spec/rails_helper.rb"
   - "spec/spec_helper.rb"

# RSpecは1つのブロックあたりの行数が多くなるため、チェックの除外から外す
# ブロック内の行数をチェックする
Metrics/BlockLength:
 Exclude:
   - "spec/**/*"

# Assignment: 変数への代入
# Branch: メソッド呼び出し
# Condition: 条件文
# 上記項目をRubocopが計算して基準値を超えると警告を出す（上記頭文字をとって'Abc'）
Metrics/AbcSize:
 Max: 50

# メソッドの中身が複雑になっていないか、Rubocopが計算して基準値を超えると警告を出す
Metrics/PerceivedComplexity:
 Max: 8

# 循環的複雑度が高すぎないかをチェック（ifやforなどを1メソッド内で使いすぎている）
Metrics/CyclomaticComplexity:
 Max: 10

# メソッドの行数が多すぎないかをチェック
Metrics/MethodLength:
 Max: 30

# ネストが深すぎないかをチェック（if文のネストもチェック）
Metrics/BlockNesting:
 Max: 5

# クラスの行数をチェック（無効）
Metrics/ClassLength:
 Enabled: false

# 空メソッドの場合に、1行のスタイルにしない　NG例：def style1; end
Style/EmptyMethod:
 EnforcedStyle: expanded

# クラス内にクラスが定義されていないかチェック（無効）
Style/ClassAndModuleChildren:
 Enabled: false

# 日本語でのコメントを許可
Style/AsciiComments:
 Enabled: false

# クラスやモジュール定義前に、それらの説明書きがあるかをチェック（無効）
Style/Documentation:
 Enabled: false

# ％i（）構文を使用していないシンボルで構成される配列リテラルをチェック（無効）
Style/SymbolArray:
 Enabled: false

# 文字列に値が代入されて変わっていないかチェック（無効）
Style/FrozenStringLiteralComment:
 Enabled: false

# メソッドパラメータ名の最小文字数を設定
Naming/MethodParameterName:
 MinNameLength: 1

```
|  Rubocop |  標準設定 |  備考 |
|:--|:--|:--|
|  文字列 |  シングルクォーテーション |  式展開や文字列内にシングルクォーテーションがある場合はダブルクォーテーションを使います |
|  変数名とメソッド名 |  キャメルケースで定義する |   |


Rubocopを実行するにはターミナルで以下のコマンドを実行します。

```ruby:ターミナル
# Rubocopを実行
% bundle exec rubocop
```

チェック内容を自動で修正させることもできます。

```ruby:ターミナル
# Rubocopを実行し、check内容を自動修正
% bundle exec rubocop -a
```

コードレビュー前にRubocopを実行すると見やすいコードになるかと思います。
AWS Amplify フレームワークの使い方Part15〜SSR対応導入編〜

# はじめに
ついにこの日がやってきました。

AmplifyがSSRに対応しました！！！ﾊﾟﾁﾊﾟﾁﾊﾟﾁ

しかもメチャクチャ簡単なんです。

# 実装方法
ほんの少しの設定とコード修正だけでOKなんです。

## 基本設定
設定は、今までのamplify設定ファイルに`ssr: true`を追加するだけです。

```javascript:plugins/amplify.js
import Vue from 'vue'
import Amplify, * as AmplifyModules from 'aws-amplify'
import awsExports from '../aws-exports'
Amplify.configure({ ...awsExports, ssr: true }) // これだけ
Vue.use(AmplifyModules)
```
たったこれだけで、SSRの設定完了です。

## API/Auth/Storage

基本的にクライアントサイドでの実行については、一切コードを変更する必要はありません。(たぶん)
asyncDataやmiddlewareなどサーバーサイドで実行される関数についてのみ、`withSSRContext`を追加するだけです！

### Auth
```javascript
// import { Auth } from 'aws-amplify'
import { withSSRContext } from 'aws-amplify'

export async function getServerSideProps(context) {
  const { Auth } = withSSRContext({ req: context.req })
  const userInfo = await Auth.currentAuthenticatedUser()
}
```
### API

```javascript
// import { API, graphql } from 'aws-amplify'
import { withSSRContext, graphql } from 'aws-amplify'
import * as gqlQueries from '../graphql/queries' 

export async function getServerSideProps(context) {
  const { API } = withSSRContext(context)
  const userData = await API.graphql(gqlQueries.getUser, { id: 'taro'});
}
```

## Storage
おそらくほぼ同じ書き方だと思われますが、未調査&未検証なので、また追記します。

# おわりに
こんな簡単に実装できるなんて本当に素晴らしいですね。

またデプロイの方法ですが、Next.jsであれば下記参考の公式ブログに簡単なデプロイ方法も掲載されていますが、Nuxtは自力で決める必要があります。
とりあえず、CloudFront+LambdaEgeをServerlessFramework使って構成するのが現時点でのベストプラクティスなのかなと思っていますが、どうやらAmplifyコンソールで、SSRに対応するとかしないとかの話が出ているようなので、こちらの今後にも期待です。

[Server-side rendering support / SSR #412](https://github.com/aws-amplify/amplify-console/issues/412)

# 参考
[SSR Support for AWS Amplify JavaScript Libraries](https://aws.amazon.com/jp/blogs/mobile/ssr-support-for-aws-amplify-javascript-libraries/)
エンジニアに筋トレが必要な理由

#はじめに
なんとなく「筋トレAdvent Calendar」を作ってみました。
きっとエンジニアの中にも筋トレ好きはたくさんいるはず！
とりあえずプログラミングあまり関係ない記事を書きます。

【12月6日】　
私の他に３人も埋めてくれてうれしい！
ちょっとはエンジニアよりの記事もいつか書きます笑

#疲れの原因
現代社会における「疲れ」の原因の多くが精神的ストレスによるものです。身体的ストレスであれば休息をとることで解消できますが、精神的ストレスを解消するには運動が好ましいと考えています。

#運動によるストレス低減効果
運動によるストレス低減効果は、３０年以上にわたり運動心理学の文献において報告されてきました。特に、ストレス低減効果は幅広い強度での有酸素運動に典型的に見られます。一定のペースで行うウォーキンやジョギングなどがもつリズミカルな性質が、心身ともにリラクゼーションを促進するためと考えられています。

#相反過程理論
ウェイトトレーニングなどの高強度のトレーニングによるストレス低減効果は「相反過程理論」により説明できると思われ、激しい運動を終えた際に、活動中の不快感や負担感の反動としてプラスの感情が生じるというものです。

この反動的な爽快感は運動中のストレスに対処するために分泌されたβエンドルフィンや幸せホルモンとも呼ばれるセロトニンが運動終了後（ストレス解放後）もしばらく維持されるためだと考えられます。

#大脳皮質の左側が活性化！
運動は脳前頭部の活動を変化させることが多くの研究からわかっています。運動後は、肯定的な感情をもたらす大脳皮質の左側が、否定的な感情をもたらす右側に比べて活性化します。その結果、気分に前向きな変化が生じると論じられています。

#まとめ
他にも、運動の目標を達成することは、達成感や自己効力感を顕著に高めます。このように、運動による心理状態の変化は「気分が良くなる」現象であり、その現象は社会的および心理生物学的要因の複雑な相互作用によって起こります。

運動は間違いなく日常（ストレス）からの気晴らしであり、精神的な疲れを癒してくれる存在です。

運動ができない理由として40％以上の人が「仕事が忙しいから」と回答していますが、十分な睡眠時間をとることが可能であれば、仕事が忙しいからこそ運動するべきではないでしょうか？？
3行で読むスクラムガイド2020 変更点

[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)が久しぶりに更新されたので、3行で変更点をまとめておこうと思います。

* 価値が大切なんだよ。しっかりゴールを意識しようね。
* スクラムでいうチームは1つなんだよ。開発チームじゃなくて開発者ね。
* シンプルになり見た目が綺麗になり読みやすくなったよ。みんな読もう。



変更点は大きいと言われていますが、本質は変わらないのでこれまでしっかりとスクラムを実施してきた方には、
言葉の使い方や捉え方の違いに見えるかと思います。
スクラムガイド 2017 年版からスクラムガイド 2020 年版への変更点は以下です。
合わせて社内、社外のスクラムコーチ＆スクラムマスターと雑談した内容もメモしておきます。

##指示的な部分を削減
スクラムガイドは時間が経つにつれて少し指示的なものになっていた。2020 年版では、指示的
な表現を削除または緩和して、スクラムを最小限かつ十分なフレームワークに戻すことを目的
としている。たとえば、デイリースクラムの質問の削除、PBI（プロダクトバックログアイテム）
の属性に関する記述の緩和、スプリントバックログにあるレトロスペクティブのアイテムに関
する記述の緩和、スプリントの中止のセクションの削減などを実施した。

* デイリースクラムは、状況に合わせてゴールに向かうために行おう。決まった質問ばかりじゃないよね。
* スプリントレトロスペクティブのカイゼンで最も影響力のあるものは、できるだけ早く対処しよう。
* スクラムガイドはガイドブックでルールブックではないので、ガイドをもとに自分たちにあったものを作り上げよう。

##ひとつのチームがひとつのプロダクトに集中する
これはチーム内で分断が発生し、PO と開発チームの関係が「プロキシ」や「我々と彼ら」とい
った問題につながることを排除するためである。存在するのは、PO、SM、開発者の 3 つの異
なる責任を持ち、同じ目的を共有するひとつの「スクラムチーム」だけである。

*　ゴールは一つなのでそれに向かってみんなで考えようね。
*　POの作業は他の人に委任できる。もちろん最終責任はPO。


##プロダクトゴールの導入
スクラムガイド 2020 年版では「プロダクトゴール」を導入した。スクラムチームに大きな価値
のある目的に集中してもらうためである。各スプリントでは、プロダクトを全体的なプロダク
トゴールに近づける必要がある。


##スプリントゴール、完成の定義、プロダクトゴールの居場所
以前のスクラムガイドでは、明確なアイデンティティーを与えることなく、「スプリントゴー
ル」と「完成の定義」について説明していた。これらは作成物ではなく、作成物に付随するも
のだった。2020 年版では「プロダクトゴール」を導入し、これらの位置づけを明確にした。3
つの作成物には、それぞれの「確約（コミットメント）」が含まれる。つまり、プロダクトバ
ックログにはプロダクトゴール、スプリントバックログにはスプリントゴール、インクリメン
トには完成の定義（カッコをなくした）が含まれる。これらの存在により透明性がもたらされ、
作成物の進捗に集中できるようになる。

* 価値を提供することを強く意識しようね。
* スプリントバックログの定義が分かりやすくなってるね。

##自己組織化よりも自己管理
以前のスクラムガイドでは、開発チームは自己組織化しており、「誰が」「どのように」作業
するかを選択できるとしていた。2020 年版ではスクラムチームの自己管理に重点を置き、「誰
が」「どのように」「何の」作業をするかを選択できるようにした。
スプリントプランニングの 3 つのトピック
これまでのスプリントプランニングのトピックである「What」と「How」に加えて、スクラム
ガイド 2020 年版では、3 つ目のトピック「Why」に重点を置いた。これはスプリントゴールで
言及されている。
* 自己管理の範囲はPOも含まれてるよ。
* 個人の成長が結果的にチームの成長につながる側面もあるよ。
* Whyなので結局届けたい価値が大切だね。


##幅広い読者のために全体的に文章を簡略化
スクラムガイド 2020 年版では、冗長で複雑な文章と IT に関する記述（例：テスト、システム、
設計、要求など）を排除している。以上の変更で、スクラムガイドは 13 ページ未満となった。
* シンプルで読み易くなってるね。
* ビジネス側のメンバーでも理解しやすいね。
* 一方で、指示的な部分が初版から改定で無くなってきているので、よりスクラムマスター、スクラムコーチの役割が大事になるね。

## おわりに
今回ちょっと深く記載していない点でやはり
`スクラムマスターは、スクラムチームと、より大きな組織に奉仕する真のリーダーである。`

スクラムマスター機能していないプロジェクトが世界に多くあったため上記の様な記載に変更になった
感じもしますが、真のリーダーという点やスクラムマスターの責任という点については
先日Scrum incのメンバーと話す機会があって確認しましたが、もう一度背景をヒアリングした上で
追記したいと思います。
tailwind.config.jsを見える化できるライブラリを使ってみる！

この記事は[Ateam Brides Inc. Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ateam-brides) 3日目の記事です。

# はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217487/e85faff4-0028-040b-a2b8-16d251f920d6.png)

皆さんtailwindCSS使ってますか？＼(^o^)／
カスタマイズ性が高いので自分のプロダクトに合わせて`tailwind.config.js`を編集し、使うことも多いと思います！
個人開発や、数人での開発なら`tailwind.config.js`を直接見にいけば特に設定で迷うことはないかなと思いますが、10人以上で開発をするプロダクトとなると、デザイナーやコーダーなどあまり設定に関して知識がない人もいる場合があります。
設定の情報が誰でも簡単に、最新なものが見れる状態にできないかと考えて調べていると、良さそうなライブラリを見つけたので紹介します！

# Tailwind Config Viewer
[Tailwind Config Viewer](https://github.com/rogden/tailwind-config-viewer)
Tailwind Config Viewerは、`tailwind.config.js`を視覚化するためのUIツールです。
以下のように`tailwind.config.js`の設定を見ることができます！
見るだけじゃなく、class名をクリックするとクリップボードにコピーもできるのでそのままコードに貼り付けて作ることもできます！

[DEMO](https://rogden.github.io/tailwind-config-viewer/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217487/8070818c-6428-6800-8bca-ba3d132e6be8.png)

## インストール
**NPX**

```shell
npx tailwind-config-viewer
```
`tailwind.config.js`があるディレクトリで実行します。

**グローバル**

```shell
npm i tailwind-config-viewer -g
```

**ローカル**

```shell
npm i tailwind-config-viewer -D
```

```json
"scripts": {
  "tailwind-config-viewer": "tailwind-config-viewer -o"
}
```
ローカルにインストールする場合は、`package.json`に上記のスクリプトを追加し、ビューアーを起動することもできます。
*※`npm run dev`する時とかに一緒に起動するようにしておくと便利そうですね！*

## 使用方法
`tailwind.config.js`を編集して同じ階層でtailwind-config-viewerを実行するだけでOK！

colorsにextendでprimaryとsecondaryのカラーを追加してみました！
*※extend内に書くことでtailwindCSSのデフォルトカラー設定に継承する形で追加できます。*

```js:tailwind.config.js
module.exports = {
  theme: {
    extend: {
      colors: {
        primary: "#C43BAD",
        secondary: "#46C9E5",
      },
    },
  },
  variants: {},
  plugins: [],
};
```

無事反映されました！
![スクリーンショット 2020-12-01 22.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217487/bdc3ddfc-6892-553b-ec27-9e78155762b1.png)

## ファイルに書き出してデプロイ
ローカルで実行して、localhostで確認しても普通に使えると思いますが、どこかにデプロイして常に最新のものを見たいというケースもあると思います。

以下のコマンドで特定のディレクトリに書き出すことができます。
*※ディレクトリは自由に作ってください。*

```shell
tailwind-config-viewer export ./output-dir
```

GitHub等にpushして、tailwind.config.jsが変更されていたらexportしてデプロイする。みたいに作っておけばうまく運用できそうです！

## 起動コマンド(オプション)

| オプション | デフォルト | 説明 |
|:-----------|------------:|:------------:|
| -p, --port     | 3000       | ビューアを実行するポート。使用されている場合は、次に使用可能なポートを使用します。  |
| -o, --open    | false   | 	デフォルトのブラウザでビューアを開きます。     |
| -c, --config     | tailwind.config.js      | tailewind.config.jsへのパスを指定します。      |

# さいごに
tailwindCSSをゴリゴリカスタマイズして使っている方や、チームで認識の統一をしたい方々には有用なライブラリではないでしょうか＼(^o^)／
単純に設定を可視化しているだけですが、簡単なデザインシステムのように使うこともできそうなのでとても便利なのではないかなと思います！
AppSyncのGraphQL APIを@apollo/clientで呼び出す

# はじめに

AWS AppSyncのJavaScriptクライアントといえば、[AWS AppSync JavaScript SDK](https://github.com/awslabs/aws-mobile-appsync-sdk-js) です。AppSyncがサポートする認証などに対応していて Apollo Client ベースなので Apollo Client を使ったことがある人であればすんなり使い始められると思います。だた、ベースのバージョンがv2.4.6とちょっと古いため、最新の [graphql-code-generator](https://graphql-code-generator.com/) などのツールが生成するコードとバージョンが合わないので一緒に使えません。

この記事では、AppSyncの認証は使いたいけど、Apollo Clientも最新バージョンを使いたいという場合の対応方法を紹介します。

# @apollo/clientにAppSync用のApolloLinkを組み込む[^1]

Apollo ClientにはApolloLinkというミドルウェアのような機能があり、ApolloLinkの構成しだいでカスタムの処理をApollo Clientに組み込むことができます。

AWS AppSync JavaScript SDK は ApolloLink の実装として以下のモジュールを単独で公開しています。

* [aws-appsync-auth-link](https://www.npmjs.com/package/aws-appsync-auth-link)
* [aws-appsync-subscription-link](https://www.npmjs.com/package/aws-appsync-subscription-link)

こられのApolloLink実装を使うことで、@apollo/clientでAppSyncの認証とSubscriptionを利用することができます。

実際にコードは以下のようになります。

```ts:apolloClient.ts
import { createAuthLink, AuthOptions } from 'aws-appsync-auth-link';
import { createSubscriptionHandshakeLink } from 'aws-appsync-subscription-link';
import { ApolloClient, InMemoryCache, ApolloLink } from '@apollo/client/core';

import appSyncConfig from './aws-exports';

const url = appSyncConfig.aws_appsync_graphqlEndpoint;
const region = appSyncConfig.aws_appsync_region;
const auth: AuthOptions = {
  type: 'API_KEY',
  apiKey: appSyncConfig.aws_appsync_apiKey
};

const link = ApolloLink.from([
  createAuthLink({ url, region, auth }),
  createSubscriptionHandshakeLink({ url, region, auth })
]);

export const apolloClient = new ApolloClient({
  link,
  cache: new InMemoryCache()
});
```

上記のコードとほぼ同じものが [aws-mobile-appsync-sdk-jsのREADME](https://github.com/awslabs/aws-mobile-appsync-sdk-js#using-authorization-and-subscription-links-with-apollo-client-no-offline-support) に書かれています。しかし、サンプルのコードは`@apollo/client`ではなく`apollo-client`を利用するコードになっているのでちょっとみただけでは`@apollo/client`で使えるのか不安になりますが、これらの package.json の dependenciesには `"@apollo/client": "^3.2.0"` と書かれているので問題なく使えます。

# 注意点

* offline 機能はサポート外なので、どうしてもoffline機能が必要なら[aws-mobile-appsync-sdk-js](https://github.com/awslabs/aws-mobile-appsync-sdk-js)(apollo-clientの拡張)自体を利用する必要があります。
* `aws-appsync-auth-link`, `aws-appsync-subscription-link` を使い場合、Reactを利用していない場合でもreactを依存に追加しておかないとエラーが発生します。原因はこの2つのモジュールが @apollo/client のモジュールをインポートする際に `@apollo/client/core` ではなく `@apollo/client` としてしまっているのが原因です。[Issue](https://github.com/awslabs/aws-mobile-appsync-sdk-js/issues/598) と [Pull Request](https://github.com/awslabs/aws-mobile-appsync-sdk-js/pull/599) が出ているのでマージされればこのエラーは解消されると思います。

# まとめ

AWS AppSync と @apollo/client は ApolloLink を構成することで問題なく利用できます(offline以外は)。[graphql-code-generator](https://graphql-code-generator.com/) などのツールも使えるようになるのでスキーマやクエリーなどからコードを生成して TypeScript の型を利用した開発をしたい場合でも安心です。

[^1]: v2をapollo-client, v3を@apollo/clientと書いています。
Rust,Wasm,Dockerで"hello world"をする MacOs catalina

#Rust,Wasm,Dockerで"hello world"をする

Mac OS でRust,Wasmの環境を作ろうとしたのですが、

```:コマンド
cargo install cargo-generate
```
がエラーになり進めなかったため、dockerで環境構築しました。

環境構築の方法についてはこちら↓で記事にしております。

[Rust,Wasmの環境をDockerで作る MacOS](https://qiita.com/stnao/items/7e790fdf721478873f21)

今回は、ここから更に、簡単なwebページを作成して"hello world"するまでを解説いたします。

参考にした記事はこちら↓です。
[ゼロからRust+WasmをFirebaseでデプロイするまでを簡単に](https://qiita.com/namn1125/items/8ffa0f87fa03f59f3acc)

**上記の記事をそのままやろうとしても上手くできないので、詰まったポイントについて解説いたします。**

##環境構築

こちらの記事で解説しています。

[Rust,Wasmの環境をDockerで作る MacOS](https://qiita.com/stnao/items/7e790fdf721478873f21)

#テンプレートを取ってくる

```:コマンド
cargo generate --git https://github.com/rustwasm/wasm-pack-template
Project Name: wasm-lesson
```


##src/lib.rs の内容を書き換える

元の関数名が「greet」なのを「aisatsu」に変更

```rust:src/lib.rs
mod utils;

use wasm_bindgen::prelude::*;

// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
// allocator.
#[cfg(feature = "wee_alloc")]
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

#[wasm_bindgen]
extern {
    fn alert(s: &str);
}

#[wasm_bindgen]
//pub fn greet() { ここを変更しています。
pub fn aisatsu() {
    alert("Hello, wasm-lesson!");
}
```


##プロジェクトをビルド


```:コマンド
wasm-pack build
```

## webページテンプレートを取ってくる

```:コマンド
npm init wasm-app www
```

## index.jsを書き換える

wasm.greet()を「wasm.aisatsu()」に変更します。

```javascript:index.js
import * as wasm from "hello-wasm-pack";

//www.greet() これを変更します。
wasm.aisatsu();
```

##npmで依存関係を解決

```:コマンド
cd www
npm install
```

#Wasmを index.html が読み込めるようにする

www/package.jsonのdependenciesにディレクトリを追加する。


```json:package.json
{
  //...
  "devDependencies": {
      "wasm-lesson": "file:../pkg", // 追加
      // ...
  }
}
```

再び依存関係を解決します。

```:コマンド
npm install
```

##実行するもエラーになる

ここでサーバーを立ち上げます

```:コマンド
npm run start
```

しかしブラウザを立ち上げて`localhost:8080` するとエラーになってしまいます。

#サーバーの設定ファイルを変更する

サーバーのホストとポートを変更するために、設定ファイルを開きます。

```:コマンド
vim node_modules/webpack-dev-server/bin/options.js
```

すると、host,portについての記載部分があるのでこちらを次のように変更します。

```javascript:options.js
//~~省略~~
port:{
 default:'8080', //これを追記
 describe:'The port',
 group:CONNECTION_GROUP,
 }
//~~省略~~
host:{
 type:'string',
 // default:'localhost',
 default:'172.17.0.2', //これを追記
//~~省略~~
```

こうすることでホストのブラウザでも実行を確認できるようになります。
こちら↓の記事を参考にしました。
[dockerコンテナ上でnode.jsのサーバを起動し、ホスト端末からアクセスする
]
(https://qiita.com/hotdrop_77/items/a2ca316c97ba4b748d9a)

もし、まだエラーになっている場合、dockerのポート設定が`8080`ではないか、
または`172.17.0.2`以外を指定する必要があるかもしれません。
上記のポストが参考になると思いますので参照してください。

#再度、試してみる。


```:コマンド
npm run start
```

今度は成功です。ブラウザで動作を確認できるようになりました。



#参考にした記事


[Rust,Wasmの環境をDockerで作る MacOS](https://qiita.com/stnao/items/7e790fdf721478873f21)


[ゼロからRust+WasmをFirebaseでデプロイするまでを簡単に](https://qiita.com/namn1125/items/8ffa0f87fa03f59f3acc)

[dockerコンテナ上でnode.jsのサーバを起動し、ホスト端末からアクセスする
]
(https://qiita.com/hotdrop_77/items/a2ca316c97ba4b748d9a)
LINE WORKS×PEPでチャットボットをつくり、Zoomの会議予約を自動化する

こんにちは。<a href=https://pep.work/>PEP</a>というチャットボットの開発プラットフォームを提供しています。
今年は誰にとっても忘れられない1年となりました。
仕事の仕方も大きく変わりましたよね。私も打ち合わせの99%がオンラインになりました。

そういえばLINE WORKSはTVCMも始まって、認知度がどんどん上がっていますね。すごいです。
LINE WORKSがあれば、テレワークでも簡単にコミュニケーションができて、仕事も効率化されていくでしょう。

このLINE WORKSをさらに便利にするのがそう、チャットボットです。
もはや業務応対を自動化するチャットボットは当たり前になってきていて、昨今は他のサービスとどう連携していくかというところに焦点が集まっています。

そこで今回はLINE WORKSでつくったチャットボットでZoomの会議予約をする事例をご紹介します。

<h1>実現イメージ</h1>

LINE WORKSでつくったチャットボットを立ちあげる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537412/72330883-691b-3edd-043f-e9d4d64f7ca8.png)
zoom予約したいとお願いする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537412/242ef5ab-2ef5-bb67-8329-281ab0382979.png)
言われた通りに、日にちを入力する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537412/29727b66-f2ce-2716-630d-0f915adad4dd.png)
ミーティング時間を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537412/e7b9114c-3383-f321-d98a-ea32b86e107c.png)
予約をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537412/18f4009e-1654-e007-3f9b-10efe5a6e7f7.png)
予約を代わりにして、会議URLを送ってくれました。


つまり、ZoomにアクセスしなくてもLINE WORKSや社内ポータルサイトから、自身または指定したアカウントのオンラインミーティングを予約し会議URLを発行できるのです。
さらに空いているアカウントから優先的に予約を入れるなど、特定のアカウントで重複した時間帯でのミーティング予約を防ぐこともできます。

<h1>作り方のイメージ</h1>
これをどのように作るのか、一部ご紹介します。

PEPは以下のようなGUIエディタでチャットボットを開発するソリューションです。
ドラッグアンドドロップでパーツを繋ぎ合わせていけば、誰でも簡単にボットを作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537412/cc6638c6-689c-a0b4-b57c-a759cc2db1ec.png)

今回はZoomのAPIを使用しました。
ZoomのAPIは<a href=https://marketplace.zoom.us/docs/api-reference/zoom-api>Zoom Developer</a>にてリファレンスをご確認ください。

PEPのAPIノードというパーツを利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537412/bf3a6a2b-0825-27fc-f1cf-9e546d780c9e.png)

API名、URL、HTTPメソッド(GET/POST/PUT/DELETE/PATCH)、パラメータ、JSON payload、RAW payloadを指定することにより実現します。

Zoomの場合JWTでの予約とOAuth2を使っての予約も可能です。

Zoomには会議予約以外でも、ウェビナーなど機能ごとにAPIが用意されているので色々細かく設計ができそうです。

これを応用すれば、Zoom以外でもセールスフォースなどのCRMやRPAなどとも連携ができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537412/fb8e0c89-e753-5f59-3e1f-2136210af65d.png)

最終的にはLINE WORKSで作ったチャットボットをあらゆる業務の窓口にしていけると、生産性が向上していくでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537412/2d61cecc-9401-fd2c-82ea-9c7377a74246.png)

<h1>最後に</h1>
こんな世界観をこれからも少しずつ実現していきたいと思います。
簡単なご紹介でしたが、他にもこういったことができないか？というアイデア募集しております！
ぜひ<a href=https://twitter.com/UCyy>Twitter</a>でお気軽にご連絡ください！
オッズにインプライドされた着順確率をキャリブレーションする



## 設計

各馬の走破タイムを確率的にモデル化する。

出走馬がN頭いて、それぞれの馬を$i=1,\cdots,N$と表現する。

各馬の走破タイム$\tau_i$が確率分布$s_i(\tau_i)$に従うとする。



## ある馬が優勝する確率

馬$i$が優勝する確率$W_i$、は
$$
\begin{align}
W_i = \int_{\tau_i<\tau_{j\neq i}}dp(\tau_1,\cdots,\tau_N)
\end{align}
$$
で計算される。

各馬の走破タイムが独立な確率分布に従うと仮定すると、

```math
\begin{align}
W_i  &= \int_0^{\infty}\left\{ s_i(\tau_i)\int_{\tau_i}^{\infty} s_1(\tau_1)d\tau_1\cdots\int_{\tau_i}^{\infty} s_{i-1}(\tau_{i-1})d{\tau_{i-1}}\int_{\tau_i}^{\infty} s_{i+1}(\tau_{i+1})d{\tau_{i+1}}\cdots\int_{\tau_i}^{\infty} s_{N}(\tau_{N})d{\tau_{N}}  \right\}d{\tau_{i}} \\
&= \int_0^{\infty}\left\{ s_i(\tau_i) \left( 1-\int_0^{\tau_i} s_1(\tau_1)d\tau_1 \right)\cdots \left( 1-\int_0^{\tau_i} s_{i-1}(\tau_{i-1})d{\tau_{i-1}} \right) \left( 1-\int_0^{\tau_i} s_{i+1}(\tau_{i+1})d{\tau_{i+1}} \right)\\
\cdots\left( 1-\int_0^{\tau_i} s_{N}(\tau_{N})d{\tau_{N}} \right)  \right\}d{\tau_{i}} 
\end{align}
```

## ある2頭が優勝、準優勝する確率

今度は馬単について考える、馬$i$が優勝、馬$j$が準優勝する確率$W_{i,j}$は、

$
W_{i,j} = \int_{{\tau_i}<\tau_{j}<\tau_{k\neq i,j}}dp(\tau_1\cdots\tau_N)
$

先ほどと同様に走破タイムの独立性の仮定を用いれば、

```math
\begin{align}
W_{i,j} &= \int_{0}^{\infty}\left\{ s_i(\tau_i) \int_{\tau_i}^{\infty} \left\{
	s_j(\tau_j) \int_{\tau_j}^{\infty}s_1(\tau_1)d\tau_1\cdots\int_{\tau_j}^{\infty}s_N(\tau_N)
d\tau_N\right\}d\tau_j\right\}d\tau_i \\

&= \int_{0}^{\infty}\left\{ s_i(\tau_i) \int_{\tau_i}^{\infty} \left\{
	s_j(\tau_j) \left( 1-\int_{0}^{\tau_j}s_1(\tau_1)d\tau_1\right)\cdots\left(1-\int_{0}^{\tau_j}s_N(\tau_N)
d\tau_N\right)\right\}d\tau_j\right\}d\tau_i \\
\end{align}
```


## 実際のカリブレーション

- $s_i$ は各々$\Gamma$ 分布に従うと仮定する

- 上記の計算はこれ以上は解析的にすすめられない（多分）あきらめて数値計算する

- $\Gamma$分布にはパラメタが2つあり、全体で2N個のパラメタが存在する

- 単勝オッズだけだとN個しか方程式がないので単純にはカリブレーションできない

- この場合はΓ分布の片方を固定するなどの必要がある

- 馬単からカリブレートする場合には$N(N-1)$の方程式が存在するので最小2乗法などを使用する必要がある

- Γ分布の平均がαβで分散がαβ^2、モードが(α－1)β。

- 走破タイムは規格化されたもんで十分なので、初期値値をα＝100、β＝0.01として、平均１、で1標準偏差に10%くらい入るようにした。

  
## 次回以降

- 馬単ですら2重の数値積分が入っていてそれなりに時間がかかるので、3連単まで考えるとレース前に直前オッズを取得して計算をまわしたり、数十年のバックテストを数値正規分を使って行うのは厳しいと考える
- 効率的な計算手法か近似法について考える必要がある
- 近似については参考文献をみつけたので次回以降解説を進める
PythonでJavaScriptの分割代入のようなことをする

#やりたいこと
JavaScriptの[分割代入](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)のようなことがPythonでしたいです。

```JavaScript:destructuringAssignment.js
let a, b, c;
[a, b, c] = ["x", "y", "z"];
console.log(a, b, c); // x y z
```

#結論
Pythonの[シーケンスのアンパック](https://docs.python.org/ja/3/tutorial/datastructures.html#tuples-and-sequences)によって実現できます。

```Python:unpack.py
a, b, c = ("x", "y", "z")
print(a, b, c) # x y z
```

#余談
Pythonのテキストデータは[テキストシーケンス型](https://docs.python.org/ja/3/library/stdtypes.html#text-sequence-type-str)であり、シーケンスのアンパックが行えます。

```textunpack.py
a, b, c = "xyz"
print(a, b, c) # x y z
```

このPythonの挙動を見て、JavaScriptではどうなるのか試したところ。。。

```textDestructuringAssignment.js
let a, b, c;
[a, b, c] = "xyz";
console.log(a, b, c); // x y z
```

いけました！ただし、色々調べましたがこちらの仕様がECMAScriptのどこで定義されているのかはよくわかりませんでした。。。

さらにここから、見かけ上Pythonと同様の記法も試してみました！

```textUnpack.js
let a, b, c;
a, b, c = "xyz";
console.log(a, b, c); // undefined undefined xyz
```
どうやら左辺の最後の変数に右辺の値が代入され、左辺の最後以外の変数には何も起きないようです。
このあたりの仕様も一旦この記事にメモ書きして、興味が湧いたらまた調べます！

#参考URL
[分割代入 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)
[5. データ構造 — Python 3.9.1rc1 ドキュメント](https://docs.python.org/ja/3/tutorial/datastructures.html#tuples-and-sequences)
[組み込み型 — Python 3.9.1rc1 ドキュメント](https://docs.python.org/ja/3/library/stdtypes.html#text-sequence-type-str)
【Rails6】趣味でしているテニスのブログを作ってみた。

#アプリ概要
テニスのブログサイト
趣味で行っているテニスについて、日報形式で活動内容を発信するサイトです。
掲示板機能も備えており、ユーザ同士でテニスに関する情報交換、疑問の解決をします。

~~下記ページで公開中です！~~
~~https://tennis-beginners-blog.com/~~
※現在公開を中止しております。

#このアプリを作った背景
テニスの魅力を伝え、仲間を増やしたいから。
具体的には下記の通りです。

```
1. 運動が苦手、もしくはテニス未経験な方の力になりたい
2. 趣味としてのテニスを知っていただきたい
```

##1. 運動が苦手、もしくはテニス未経験な方の力になりたい
私は元々文化系で運動が得意ではありませんでした。かつ未経験からテニスを始めたので、
最初はラリーはおろか打ち返すことすら出来ませんでした。
なので「どうすれば人並みにやれるようになるのだろうか？」と悩み苦しんだ時期もありました。
しかし基礎を１つひとつ地道に習得し、球をうまく打ち返せるようにまで成長しました。
元々運動に自信がなかったり、テニスの経験がない初心者であっても、フットワークやスイングの姿勢など基本的なことを身につければ、間違いなく上達します。
そんな私の体験に基づき、有益な情報をブログ形式でお伝えしようと考えました。

##2. 趣味としてのテニスを知っていただきたい
テニスは老後になっても楽しめるので、これからの人生百年時代にはもってこいだと思います。
全身をフル活用するスポーツなので、健康増進に役立つこと間違いなしです。
今を楽しむだけでなく、生き生きとした老後を作る趣味として、テニスを知って頂けるように情報を発信していきます。

#機能

```
・ユーザ登録、およびログイン
・ブログ
・掲示板、およびコメント
・用語集

##ユーザ登録、およびログイン
名前、メールアドレス、パスワードで登録します。任意で自己紹介文と画像も掲載できます。
ログインするときはメールアドレス、パスワードを入力します。

なお、ユーザには管理者フラグを設けており、フラグが立っている場合は「管理ユーザ」としています。
この管理ユーザのみ他のユーザを削除できます。

##ブログ
日付単位でテニスに関する記事を登録します。記事の構成は本文と画像（任意）です。
編集、削除は管理ユーザのみ可能としています。

##掲示板、およびコメント
テニスに関する疑問の解決、情報共有をする場としています。
掲示板に質問や役立つ情報を投稿し、その投稿に対し不特定多数のユーザがコメントをします。
掲示板、コメントともに文章は140字以内です。

##用語集
テニスに関する用語の解説記事を登録します。記事の構成は本文と画像（任意）です。
編集、削除は管理ユーザのみ可能としています。

##追加実装予定
GithubのIssuesに、実装内容と目的をまとめています。
https://github.com/tattu501/tennis_app/issues/25

##ポイント
・画像投稿機能
・パンくずリスト

##使用技術等
- 言語：Ruby
- フレームワーク：Ruby on Rails
- テスト：RSpec
- フロント：Bootstrap
- ソースコード管理：GitHub
- インフラ：Amazon EC2
- Webサーバ：Nginx
- ロードバランサ：Amazon ALB
- ストレージ：Amazon S3
- ルーティング：Amazon Route53
- ドメイン：お名前.com
- SSL証明書：Amazon Certificate Management

##環境
- Ruby 2.7.0
- Ruby on Rails 6.0.3
- PostgreSQL 11
- Nginx 1.18.0

##使用した主なGem
- webpacker CSS、JavaScript、画像などの部品を1ファイルにまとめる
- bootstrap-sass CSS用
- gretel パンくずリスト
- rails-i18n 入力チェックメッセージの日本語化
- kaminari ページネーション
- RSpec 単体テスト
- Unicorn プロセス上で動くサーバ
- Capistrano 自動デプロイ
```

#ER図
![er_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628846/ea5ea614-33ef-e64c-68af-d2c4ac039143.png)

##開発にあたり意識したこと
###業務を想定した開発
・目的ごとにfeatureブランチを作成してコーディング
・プルリクエストを作成してmasterブランチにマージ
・小さな単位でコミットすること
（とはいっても最初はコマンドラインしか使っておらず、一括でコミットしていました。
オンラインサロン内での共同開発プロジェクトでGithub Desktopを知り、
コミットを細切れに打つ習慣が付きました。草を生やすことの気持ちよさも合わせて知りました。）

###短時間で集中して進める
現職で普通に出社しているため、平日は多くても数時間、休日も家事など他にやることが多く、
作業時間を確保することが困難でした。そこで作業中は他のことには目もくれず全力投球しました。
その結果、時間の割には効率よく開発を進めることが出来ました。

##苦労した点
###エラーが発生したときの対処
開発中エラーに出くわすことがよくあり、毎度解決に数十分は掛かりました。
コマンドラインやエラー画面のメッセージが英語でかつ見慣れない単語もあり、解読するのに苦労しました。
ですが実は原因が誤字・脱字、SELECTにおける取得項目の指定間違いなど、見落としによるものが多く、コーディング時に注意すれば簡単に防げるということも学習しました。

###マイグレーションが上手くいかない
不要になったテーブルのカラムを削除しようとすると、該当のカラムがないというエラーが起きました。あるはずなのに、ない!?という不可解な状態にはまって苦労しました。

###画像の大きさに悩んだ
記事やプロフィールページに画像を設置出来るようにしましたが、
デザインに疎かったこともあり、どの程度のサイズにすれば見栄えが良いのか悩みました。
最終的には画像が文章に対して大きくなりすぎない程度にしました。

##感想
・本番環境にデプロイして、無事に動くことを確認できたときは感動しました！
・開発環境でテストデータを打ち込むのが楽しかったです。本番ではないので、笑える文言を入力して面白がっていました。
・自分でもアプリを開発できるんだ！という自信がつきました。

##最後に
アプリ開発は自分の好きなことや趣味をサービス化出来るので、苦労は多いけど楽しいです。
本記事が皆さんのプログラミング学習や開発の参考になれば幸いです。
異業種から転職して感じたwebエンジニアに必要な素養

#とりあえず箇条書き

・分かりづらいことを分かりやすく説明する能力
・急な内容修正などに対する対応力と柔軟性
・チームの人に対する思いやりと気遣い（コードの工夫やコミュニケーションなどで）
・自分の書くコードに過度な愛着やこだわりを持たない
・自分の思い通りにいかなくても許容する広い心
・ファイル内容やDB構造など広く記憶する記憶力
・どんなバグにもへこたれない強いメンタル
・行き詰ったらすぐに質問をする
・手遅れになる前に相談する
・小まめに進捗報告をする（実は気付いていない内容がよくある）
・どんな状況においてもポジティブシンキング
・自分の間違いを認められること
・相手の間違いを許せること
・意見が合わなくてもレスバしないでうまく妥協点を見つける、その場を丸く収める
・納期を守る、約束を守る
・ダブルチェック、確認をしっかりとする
・あいさつをする
・遅刻しない
・整理整頓
・清潔感
・笑顔

<b>もうエンジニア関係なくなっちゃった！<b>


#今日の名言

If today were the last day of my life, would I want to do what I am about to do today?
（もし今日が人生最後の日だとしたら、今しようとしていることが、本当にしたいことだろうか？）

-スティーブ・ジョブズ
[iOS]UIImageViewがタップされた時にイベントをつける

UIImageViewがタップされた時にイベントを発火させたかった。

# バージョン
Swift 5.3
Xcode 12.1

# 実装

```swift:UIViewController.swift
import UIKit

class UIImageViewEventViewController: UIViewController {
	
	let imageView: UIImageView = UIImageView(image: UIImage(named: "cat"))
	

    override func viewDidLoad() {
        super.viewDidLoad()
		imageView.frame.size = CGSize(width: 100, height: 100)
		imageView.center = view.center
		view.addSubview(imageView)
		
		imageView.isUserInteractionEnabled = true	
		imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapped)))
    }
	
	@objc
	func tapped() {
		imageView.center = CGPoint(x: Double.random(in: 100...200), y: Double.random(in: 100...300))
	}

}

```
# 結果
![closemodal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352602/4066c932-54de-708c-0fa0-74aaa069e9e9.gif)

画像にイベントをつけることができました。猫がかわいいですね

# 解説
今回の肝になる部分はここです

```swift
imageView.isUserInteractionEnabled = true	
imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapped)))
```

まず、`isUserInteractionEnabled`はUIViewクラスが持っているプロパティで、ユーザーが行う操作(タップ、長押しなど)を無視するかどうかを決めるプロパティみたいです。
`addGestureRecognizer`の部分はGestureRecognizerを追加するメソッドです。

## GestureRecognizerとは
ユーザーからのタップなどの操作を認識し、何かしらの処理を行うために用意されたクラスです。
上のコードで指定している`UITapGestureRecognizer`も`UIGestureRecognizer`のサブクラスみたいですね。
その他にピンチされた時(UIPinchGestureRecognizer)やスワイプ(UISwipeGestureRecognizer)された時などにイベントを発火させたり、普段自分たちが使っているアプリのUIはこのクラスをこねくり回して元に作られてそうですね。しらんけど

## 終わりに
GestureRecognizerを使ったら色々面白いことができそうなので、今後も触っていきたいです。


# 参考文献
- [isUserInteractionEnabled | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uiview/1622577-isuserinteractionenabled)
- [UIGestureRecognizer | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uigesturerecognizer)
- [[iPhone] アプリでタップや長押しを認識させるには](https://i-app-tec.com/ios/uigesturerecognizer.html)
Linux　まとめ

備忘録としてまとめる。

###ls
- * 任意の文字列
- ? 任意の1文字

```
$ls *.html
Index.html home.html

$ls /bin/x???
/bin/zcat /bin /bin/zcmp  /bin/znew
```

####オプション

```
ファイルの詳細情報を表示する。
$ls -l
drwx------+  4 ryohei.udagawa  staff   128  9 16 14:25 Movies
drwx------+  3 ryohei.udagawa  staff    96  9  9 16:17 Music
drwx------+  4 ryohei.udagawa  staff   128  9 16 16:08 Pictures
drwxr-xr-x+  4 ryohei.udagawa  staff   128  9  9 16:17 Public

隠しファイルも含めた全てのファイルを表示する。
$ls -a
.            .ssh            Library
..            .vscode            Movies

ファイル種別を表示する
$ls -F
Applications/    Downloads/    Music/        workspace/
Desktop/    Library/    Pictures/
```

###cat
```
% cat -n /etc/hosts

1    ##
2    # Host Database
3    #
4    # localhost is used to configure the loopback interface
5    # when the system is booting.  Do not change this entry
```


###less(catより広く見れる)
```
$less ファイル名

/<文字列>  下方向に向かって検索
?<文字列>  上方向に向かって検索
```

###rm(削除)
```
ディレクトリも合わせて削除する
rm -r dir

ファイルを削除する際に警告文を表示しない
rm -f file

ファイルの削除前に確認する
rm -I file
```

###mv
```
mv 移動元　移動先

#ファイル名を変更
$mv file file1

#ファイルを移動（移動先がディレクトリならば、ファイル移動）
$mv file1 dir/

上書きする前に確認する
$mv -I file file1
```

###cp
```
cp コピー元　コピー先

#ファイルをコピー
$cp file new_file

#ファイルをディレクトリ内にコピー
$cp file dir

上書きする前に確認する
$cp -i file new_file

ディレクトリをコピーする
$cp -r dir new_dir  
```

###find
```
find 検索開始ディレクトリ　検索条件　アクション

ファイル名を指定してファイルを検索。ファイル名の大文字小文字を区別する
$find .-name README.md

#ワイルドカードが使える。*を使って指定する時は''で囲うこと
$find . -name '*.html' -print

ファイル名を指定してファイルを検索。ファイル名の大文字小文字を区別しない
$find . -iname readme.md

# -type fは通常ファイル
$find . -type f -print

#-type |　はシンポリックリンク
find . -type | -print

#-type dはディレクトリ
$find . -type d -print

複数の検索条件を指定。なお、-aは省略可能
$find . -type d -a -name images -print
```
Typescriptは何が楽しいのか？



## 「JavaScriptでええやん」

JavaScriptでええやん、TypeScriptなんてどうせ面倒くさいだけやろ。
真の漢は型にはまらず、生きていくもんやで。


そう思っていた時期が私にもありました。。。


そんな私が二ヶ月後なんと...
ブンツブン！ブンツブン!(RIZAPの音)



## 型がなければいきていない体に。

まじでこれです、RIZAPのおかげ変われました。結果にコミットしたのです。
改めて昔の自分のコード読むと、型もなしでよくこんな難しいの書いたなって思います。
「型があった方がむしろ簡単」、
当時の自分からするとデキる人の煽りみたいなセリフですが、本当なんです。


今日はそんな型の旨味の話をします。


## 型の何がええの？

一番大きなメリットは、脳のワーキングメモリを確保できることだと思います。
例えば４桁と４桁の掛け算を頭の中だけでやれって言われたら、結構むずかしいですよね。
たいていの人は途中式を書くと思います。
TypeScriptもそんな感じです。

(x: number, y: number) => number

っていう方があったらxとyを使ってなんやかんやしてnumberを返す関数です。

これが例えば

```javascript
const hoge = (ｘ，ｙ) => {


 // すごい長いなんやかんや

 return huga
}

```

間にすごい長いなんやかんやがあったら、読んでる途中で
この関数は結局、何がしたかったんやっけってなりますよね。
これがTypeScriptなら冒頭に要約がついているようなモンですから、
すいすい読めますし頭の中がこんがらがったりしません。


## 型で開発速度UP

あと、自分が持っていた偏見として
保守性:
TypeScript > JavaScript
スピード:
TypeScript < JavaScript
というのがありました。
急いでいるときはJavaScript!みたいな。


これもそんなことないです。

一日でできるだけすごいもの作れ！と言われたらJavaScrptを使うかもしれませんが、
一週間でできるだけすごいもの作れ！と言われたら２００％TypeScriptを使います。

そんくらい早くスピードの元はとれます。
AWS ソリューションアーキテクトアソシエイト １９

##AWSにおける運用の考え方
ビジネスの変革が急速に進む現在、システム構築時やアプリケーション開発時だけでなく、その後のリリースや更新の早さや運用の品質向上・維持は重要な要素になっています。
システムの高い運用性を保つためにはできるだけ作業を自動化するとともに、構築した内容の文書化と動作確認のためのテストを定期的に実施する必要があります。
AWSには、クラウド上で高い運用性を実現するための以下のような設計原則があります。

###コードによるオペレーション実行
「コードを書いて実行する」というアプリケーションの考え方クラウドシステムのオペレーションに適用することにより、システムの運用を効率化します。
これまで手動で行っていた作業が自動化されることにより、作業ミスが少なくなります。
また、同じ作業であればコードを再利用することができます。


###定期的に、小規模で、元に戻すことができる変更を行う
システムは一度構築したら終わりではないため、定期的な更新を行う前提で設計することが重要です。
たとえば、システムを構成するコンポーネントを容易に変更できるようにあらかじめ設計しておきます。また、すでに稼働しているシステムに変更を加える場合は、システムは小さな範囲で変更します。
このような設計・運用をすることでメンテナンス性が上がります。万一、変更作業時に失敗が起きても影響を最小限に抑えることができ、変更前の状態に戻しやすくなります。

###運用手順を見直す
システムは定期的に変更されますが、システムだけが進化しても、それに見合った運用手順を確保しておかなければ、運用の品質向上・維持を果たすことができません。

###障害発生を想定する
障害発生を想定したテストを行い、障害発生時の影響を性格に把握しておきます。また、発生した障害への対応手順もてすとし、手順が正しいかを確認して、運用チームが障害対応の内容を正しく理解しておくようにします。

###運用の失敗をもとに改善する
運用上の作業や障害対応への経験をもとに、運用作業を改善します。また、経験から学んだ内容をチームなどに共有します。

次節からは、高い運用性をAWSで実現していくための考え方やサービスについて説明していきます。
AWS ソリューションアーキテクトアソシエイト ２０

##コードによるインフラストラクチャ構成管理
ハードウェアを自社で調達して行うインフラストラクチャ構築では、一般的にインフラストラクチャ担当のエンジニアが環境構築手順書を作成して、環境のセットアップを行います。
そのときの課題として、以下のようなことが挙げられます。

- 作業中にミスが発生する可能性がある
- 導入後に構成変更がることを考慮して、インフラストラクチャ管理（設計書やサーバーのパラメータなど）が必要

アプリケーション開発においても、以前はプログラムの変更やリリース作業で同様の問題が起きていました。しかし、現在は、サーバーへのデプロイ作業が自動化できるようになるなど、作業の効率化に有効な手段が一般化しています。

このようにアプリケーション開発で実践されているコード管理・作業自動化という手法をインフラストラクチャ構築にも導入して、インフラストラクチャ構築作業内容をコードで記述して管理できるようにした**Infrastructure as Code(IaC)**という考え方があります。
AWSでは、定義ファイルをコーディングし、コードを実行することでリソースをプロビジョニングすることができます。インフラストラクチャ環境の運用をコードで管理しているため、まったく同じ作業であれば以前に実行したコードをそのまま流用できます。構築作業に変更が生じた場合は、該当箇所のみを修正してコードを実行することにより修正版のインフラストラクチャ環境を構築することができます。
これにより、従来は煩雑だったインフラストラクチャ構築手順のバージョン管理も容易になりました。

###CloudFormationのコード管理
AWSにおいてIaCを実現したのが、AWSリソースをプロビジョニングするサービスである**AWS CloudFormation(CloudFormation)**です。
「テンプレート」と呼ばれるプロビジョニングのための定義ファイルを用意し実行することで、定義内容に従ってAWSリソースを構築することができます。

AWSにおいてIaCを実現したのが、AWSをリソースをプロビジョニングするサービスである**AWS CloudFormation（CloudFormation）**です。
基本情報３

##タスク管理の役割
コンピュータは、私たちがアプリケーションで行う操作を、細かい仕事単位である**タスク**に分解して、処理しています。タスクは、コンピュータから見た仕事の単位です。システムによって**プロセス**とも呼ばれます。OSは、コンピュータのあちこちで無駄な空き時間が出ないように、タスク単位で細かくCPUや主記憶を割り当て、コンピュータ全体として効率的な処理が行われるように制御しています。

##タスクの状態遷移
OSは、CPUの使用権を適切に割り当てるために、タスクを次の３つの状態に分けて管理します。

＜タスクの3つの状態＞

|状態|概要|
|---|---|
|実行可能状態|CPUが使えるようになるのをタスクが待っている状態|
|実行状態|タスクがCPUを使って実行されている状態|
|待ち状態|自分が要求した入出力動作が終わるのを待っている状態|

###1,実行可能状態から実行状態へ
タスクが生成されると、まず実行可能状態となります。いくつものタスクがこの状態で待っています。自分の番が来てCPUが使えるようになると、実行状態へ移ります。

###2,実行状態から実行可能状態へ
割り当てられたCPUの使用時間を使い切ったときや、実行中に別のタスクからCPUの使用権を奪われた場合、実行状態のタスクは一時中断し、再び実行可能状態となります。

###3,実行状態から待ち状態へ
実行状態中に入出力動作が発生すると、自分が要求した入出力処理が終わるまで待ち状態となります。

###4,待ち状態から実行可能状態へ
入出力処理が終了すると、再び実行可能状態になります。

##タスクのスケジューリング方式
タスクがいくつも存在している場合、どういう順番でタスクを実行すべきかを決める必要があります。これを**スケジューリング**といい、OSの関わり方によって、次の２つ方式があります。

###プリエンティブ方式
OSが強制的にタスクを切り替えるスケジューリングの方法、**プリエンティブ**といいます。以下のような方式があります。

＜プリエンティブなスケジューリング方式＞

|方式|説明|
|---|---|
|優先度方式|プライオリティ法式ともいう。優先度や緊急度の高いタスクから順番に実行する方式|
|タイムスライス方式|複数のタスクに対して、均等にCPU処理時間を割り当て、順番に次々と実行する方式|

###ノンプリエンティブ方式
OSがタスクを切り替えるのではなく、プログラムに任せる方法を、**オンプリエンティブ**といいます。実行状態のタスクがみずから待ち状態に遷移するか終了するまで、他のタスクは実行状態に遷移しません。

＜ノンプリエンティブなスケジューリング方式＞

|方式|説明|
|---|---|
|到着順方式|実行可能状態になったタスクから順番に実行する方式|

##マルチプログラミング
タイムスライス方式では、非常に小さな時間単位でタスク処理を実行していくため、まるで複数のタスクが同時並行で処理されているように見えます。見かけ上、いくつものプログラムが同時に実行されているように見えるOSの働きを**マルチプログラミング**といいます。**マルチタスク**、**多重プログラミング**とも呼ばれます。
マルチプログラミングにおけるタスクの切替え手順は、以下の図のとおりです。

##割り込み処理
実行中のタスクを一時中断して、別のタスクの処理に切り替える仕組みを**割り込み処理**といいます。割り込んだタスクの処理が終わると、割り込まれたタスクの処理が再開されます。割込みは、タスク自体にエラーなどが発生して起こる**内部割込み**と、ハードウェア故障といったタスク以外が原因となって起こる**外部割込み**に分けられます。

＜内部割込み＞

|割込みの種類|説明|
|---|---|
|プログラム割込み|桁あふれやゼロにとる徐算など、プログラム上のエラーによって発生する割込み|
|SVC割込み|プログラム内部から入出力装置を使うときなど、監視プログラム（SVC:SuperVisor Call）を呼び出すときに発生する割込み|

＜外部割込み＞

|割込みの種類|説明|
|---|---|
|マシンチェック割込み|ハードウェアの誤操作や故障により発生する割込み|
|入出力割込み|入出力動作が終了したときに発生する割込み|
|タイマ割込み|プログラムの実行時間が割り当てられた時間を超えたときに、その旨を通知するインターバルタイマによって発生する割込み|

###スプーリング
タスクを実行するCPUの処理速度に比べると、入出力装置の処理速度は極端に遅くなります。そのため、タスクの実行結果である出力データを一時的に高速な補助記憶に蓄えることで、印刷など出力までの待ち時間を減らす方法を**スプーリング**といいます。また、処理速度の違いを緩和するために設けられた記憶域のことを**バッファ**といいます。

###プリエンプティブ
OSが強制的にタスクを切り替える

###ノンプリエンプティブ
実行状態のタスクがみずから待ち状態に遷移するか終了するまで、他のタスクが実行状態に遷移しない

###スプーリング
低速な装置への出力データを一時的に高速な補助記憶に蓄え、待ち時間を減らす

###バッファ
処理速度の違いを緩和するために、入出力装置と処理装置の間に設けた記憶域
基本情報２

##ソフトウェアの分類
###基本ソフトウェア
基本ソフトウェアは、ハードウェアを制御したり、さまざまなソフトウェアの動作を管理するなど、コンピュータを動作させるための基本機能を提供するソフトウェアです。
WindowsやMac OS、UNIXなどのOS（オペレーティングシステム）は基本ソフトウェアです。

###応用ソフトウェア
基本ソフトウェアの上で動くソフトウェアが、**応用ソフトウェア**です。
私たちの仕事を直接助けてくれるソフトウェアで、**アプリケーション**ともいいます。
ワープロソフトのWord、表計算ソフトのExcelなどは応用ソフトウェアです。

###ミドルソフトウェア
**ミドルウェア**は、応用ソフトウェアと基本ソフトウェアの中間に位置し、多くの応用ソフトウェアが共通に利用する専門的な機能を提供するソフトウェアです。特定分野で多くの応用ソフトウェアが必要とする機能、例えば、データベースの管理機能を提供します。このミドルウェアをデータベース管理システム（DBMS）といいます。応用ソフトウェアは、DBMSを呼び出すことで、複雑な手続きなしにデータベースを使うことができます。

##OSの役割
###ハードウェアを管理する
CPUや主記憶など、限られたハードウェアの資源を効率よく使えるよう、うまく仕事を割り振ります。

###ファイルを管理する
データの入れ物である**ファイル**を作ったり、ファイルが間違った使われ方をしないように管理します。

###周辺機器を管理する
マウスやプリンタなどの周辺機器を、ユーザがスムーズに使えるよう手助けします。
新しい周辺機器を接続したときには、周辺機器を応用ソフトウェアから操作できるようにするためのソフトウェアである**デバイスドライバ**をOSにインストールする必要があります。