OmniAICreator/Qiita-1.07M huggingface dataset:
強力な ID 基盤による企業の保護

# セッション説明

https://tokyo.myignitetour.techcommunity.microsoft.com/sessions/83686

# メモ

- 色々なクラウド製品を使うことによりIDが多数作られることになる
  - Azure ADを利用することによりIDを一つにできる
- Magic Quadrant（ガートナー社）
  - Microsoftが2番手、1番はオクタ
  - 今後はOkta（オクタ）対応の機能強化
- Azure ADの利用
  - 10万社
  - 2.5憶人（月間アクティブ（MAU))
  - 300憶回（1日の認証回数）
- クラウドのすべてのIDを管理
  - プロビジョニング
    - CSV
    - Power Shell
    - Cloud HRからプロビジョニング可能
      - 現在は3社のみ
  - Azure ADからローカルADへの反映も可能
- すべてのアプリをAzure ADと接続する
  - 1,419,000 アプリと接続している
    - 1年で倍に増えている
    - それだけクラウド利用が増えている
  - Secure Hybrid Access
    - サードパーティー製品を利用してHTTPとHTTPS以外のアクセスが可能になる
    - 外部からの接続がAzureADだけになるので監視はAzureADのみにできる
  - 接続検証されているアプリ
    - 3,200アプリ
    - MyAppsも見やすく改善
  - シングルサインオンの設定方法の改善
    - One Click SSO
    - 証明書の交換を手作業で行わなくても良くなった
    - 現在はまだ対応アプリは少ない
- 全てのユーザーのアクセスを管理する
  - Identity governance（導入済み）
    - 4つの機能をまとめているだけ
      - エンタイトルメント管理
        - パッケージを作成して前提条件（権限）を設定
- 業界をリードするセキュリティの実装
  - 目指すところはパスワードレス
    - Windows Hello
    - Microsoft Authenticater
    - FIDO2
  - 条件付きアクセス＋ID保護
    - 条件付きアクセスの新機能
      - Report-Only mode
    - Identity Protection
      - UIの変更
      - リアルタイムにBANする機能が実装
最近の MTP: 深く掘り下げ、脅威からの保護ビジョンを実現している方法をご覧ください

# セッション説明

https://tokyo.myignitetour.techcommunity.microsoft.com/sessions/83684

# メモ

- 防御する側はリストで防御します。攻撃者側はグラフを用いて攻撃する
  - 防御は境界を守る
  - 攻撃は通れるところを探す
- 境界を超える攻撃
  - サイバーキルチェーン
    - 最近は進化してきて順番が変わってきている
    - パスワードスプレー（一撃で最終地点を攻める）
      - パスワードを奪取
      - ExchangeやOneDriveからデータ抽出
      - 組織内のフィッシングメール
      - Exchangeの転送ルール作成
      - 悪質なOAuthアプリ
      - クラウドからの悪用実行コード
      - サプライチェーン
  - クラウドベースの攻撃ツールが標準になりつつある
    - Ruler
      - By Sense Post
    - MailSniper
      - By Black Hills
    - O365-Attack-Toolkit
      - By KitPloit
  - 従来のMITRE ATT%CKフレームワークを超えて
    - 様々な攻撃方法が公開されている
      - Azure ADのハッキング方法
      - スフィアフィッシングの方法
- クラウドを活用した国家犯罪
  - HOLMIUM exploitation with Ruler
  - 攻撃の流れ
    - パスワードスプレー（ADFS）
      - Azure ATP
    - 盗難した視覚情報を使用してO365へログイン
      - Rulerを使用してOutlookホームページを悪用
      - Outlookのある特定のページを見ると悪質なコードが実行されるように設定
      - Microsoft Cloud App Security
    - RulerによりOutlookがPowerShellコマンドを実行し、バックドアをメモリ上に展開
      - Microsoft Defender ATP
    - ネットワークの偵察
      - Microsoft Defender ATP
    - Mimikatzを使用してLSASSから資格情報をダンプ
      - Microsoft Defender ATP
    - Pass the Ticketドメインコントローラーへの悪用コードの実行
      - Azure ATP
    - ドメインコントローラーへアドミンアカウントを追加
      - Azure ATP
    - Exchange Onlineに侵入
      - Microsoft Cloud App Security
  - 課題
    - 複数ポータルから単一ポータル
    - アラートからインシデントへ
    - 境界防御から総合的な防御
    - 解決策
      - Microsoft Threat Protection
- Microsoft Cloud App Securityの特徴
  - 特徴
    - それぞれのソリューションがBest Of Breedへ
    - 脅威シグナルの共有を含む製品
    - 攻撃を阻止するための様々なレイヤーの保護および自動調査＆対処
    - セキュリティチームが単一のポータルを通じて攻撃を調査、追跡、または修正
  - 区分ごとの機能
    - ID
      - Azure AD
      - Azure ATP
      - Microsoft Cloud App Secure
    - エンドポイント
      - Microsoft Defender ATP
    - メール
      - Office 365 ATP
    - アプリ
      - Microsoft Cloud App Secure
  - Security.microsoft.com
    - プライベートプレビュー
    - Incidents queue
      - 検知された情報を組み合わせてそれが何のインシデントかを判断している
      - インシデントがどこまで進んでいるのか可視化できる
      - エビデンスも表示されている
      - 自動調査と対処
        - ヘクサダイト社：インシデント対応（自動調査と対処のAI開発会社）
        - このエンジンをDefender ATPに組み込み
          - ファイルレス攻撃に自動調査と対処が可能になった
        - 最近Office365ATPにも組み込んでいる
        - Entities analizedという手法で調査
      - 端末情報の取得
        - Highly confidential
          - AIPと連携、社外秘ファイルがその端末にあると表示される
        - Data sensitivity
          - どれだけ機密ファイルがあるか
      - Advanced hunting（ハンティング）
        - 端末から情報を収集して連携することが可能
        - クエリで抽出できる
    - Threat アナリティクス
      - テナントが攻撃されているか
- Microsoft Threat Protectionの運用イメージ
  - Microsoft Threat Protectionの画面を見ることがベース
  - 2020年1月にリリース
  - 利用条件
    - M365 E5
  - 参考リンク
    - Aka.ms/mtp
jRumbleで要素を揺らしてみた備忘

## jRumble使ってみた備忘

2019年のサイボウズデイのkintoneの発表の中で
jRumbleが使用されているのを拝見して使ってみたいなと思ったのがきっかけです。

#### 必要なもの
jquery(https://code.jquery.com/)
※3.4.1で実施しました。

（補足メモ）
uncompressed・・・コメントあり。開発時に使用を想定。
minifield・・・コメントなど除外した軽量版。稼働時に使用を想定。
slim・・・ajax,effectsを省いたコメントありのバージョン
slim minifield・・・ajax,effectsを省いてコメントなどを除外した軽量版。

jRumble(https://jackrugile.com/jrumble/)

#### やったこと
ドットインストールの「JavaScriptでストップウォッチを作ろう」を元にして、
Stopボタンを押下された時にStartボタン押下時からStopボタン押下時までの差分のミリ秒が3で割り切れる数字の場合は、
timer要素（ストップウォッチの秒が表示されている要素）をjRumbleで揺らす。
Startボタンがクリックされると揺れを停止する。

トリガーを設定
◆今回は、「Stop」ボタンをクリックされた時のイベントリスナーに以下を追加
※ elapsedTimeは、「Start」ボタン押下時と「Stop」ボタン押下時のミリ差分を保持

``` js:
if(elapsedTime%3 === 0){
    $('#timer').trigger('startRumble');
}
```

◆「Start」ボタンをクリックされた時のイベントリスナーに以下を追加

``` js:
$('#timer').trigger('stopRumble');
```

揺れ幅の設定（クリックされた時の挙動）

``` js:
$('#timer').jrumble({
    x: 10,
    y: 10,
    rotation: 4
});
```

#### 実演/感想
＊反省点gifうまく作れなかった。
＊意外と３で割り切れるとこでStopできない。
＊面白い。。。IT関係ない部署の方が見たらバグか何かと勘違いしかねない気もした。

![jRunble.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536171/234bc8ab-bfef-6413-47f0-aa899c258074.gif)


#### 参考
https://code.jquery.com/
https://jackrugile.com/jrumble/
URLにパスやクエリパラメータを追加する

　初投稿です。Android で URL にパスやクエリパラメータを追加したいときは[`Uri.buildUpon()`](https://developer.android.com/reference/android/net/Uri.html#buildUpon()) が便利ですね。

```kotlin
val uri = Uri.parse(uriString)
    .buildUpon()
    .appendPath("path")
    .appendQueryParameter("foo", "bar")
    .build()
```

- [Uri - Android Developers](https://developer.android.com/reference/android/net/Uri)
- [Uri.Builder - Android Developers](https://developer.android.com/reference/android/net/Uri.Builder.html)
ウェブページがピンチアウト・ズームされているかどうか検出する方法

スマホやタブレットなどのモバイル端末の UI を実装しているとき、ときどき「今、ユーザーが画面をピンチアウトして拡大表示しているかどうか？」を知りたくなることがあります。

## ピンチアウト・ズームされているかどうか検出するコード

**１行で済ませられる DOM API があります。**Visual Viewport API です。この API に対応している環境では、window オブジェクトの `visualViewport` プロパティが利用可能です。以下のようなコードを書けば、ピンチズームの検出が可能です。

Android の Chrome と、iOS Safari で対応されています。

```javascript
function isPinchZooming() {
  return window.visualViewport.scale > 1
}
```

注意したいのは、iOS が Visual Viewport API に対応したのが Safari 13（2019年9月リリース）だということです。もしそれ以前の環境にも対応する場合、以下のコードでピンチズームを検出できます。

```javascript
function isPinchZooming () {
  if ('visualViewport' in window) {
    return window.visualViewport.scale > 1
  } else {
    return document.documentElement.clientWidth > window.innerWidth
  }
}
```

## Visual Viewport とは何か？

「ブラウザが現在表示している画面領域」と言い換えられます。タッチ端末が登場する以前は存在しない概念でしたが、Apple が iPhone に「ピンチアウトでブラウザの部分領域を拡大して表示する」新しい操作概念を導入したことで初めて意識されるようになりました。

これに対して、Initial Containing Block (ICB) という言葉があります。名前が示す通り「初期化時における包含ブロック」です。これはモバイル端末においては、meta viewport で指定した `width` の値を幅として、端末のアスペクト比に準じて高さを算出したものです。いちど確定したら、ページ遷移するまで原則として（ズームしても）変化しません。

上記のコードは、Visual Viewport と ICB の挙動の違いを使ってピンチズーム中かどうかを判別できるようにしたものです。
Microsoft Surface で究極のセキュリティを実現

# セッション説明

https://tokyo.myignitetour.techcommunity.microsoft.com/sessions/87538

# メモ

- Surfaceのセキュリティ
  - chip-to-cloud
    - チップレベルからクラウドまでのセキュリティ管理
  - 多層防御
  - 独立した防御コンポーネントの多重化
- セキュアブート
  - 信頼されたOS以外は起動させない
    - 信頼チェーン
- Surfaceファームウェア
  - マイクロソフトが開発
  - Windows Updateで最新化できる
- Surface Enterprise Management Mode
  - UEFIファームウェアのセキュリティと管理構成
  - SCCMに統合可能
  - 標準ツール
- DFCI
  - クラウドからのUEFI管理
  - Intuneを介したSEMMの機能
- BitLoker
  - OOBE時に設定可能
- Windows Hello for Business
  - 顔認証が標準
  - 指紋認証も可能で別売りの製品が必要
- 高度なWindowsのセキュリティ機能
  - Virtual Secure Mode
    - 仮想化ベースのセキュリティ
- Conditional Access（条件付きアクセス）
  - アクセスを制御してSurfaceを守る
- Microsoft Defender ATP
  - エージェント不要
- Surface Tools for Business
  - 無料で提供している
DevOps でアプリケーションデリバリーを管理しよう

# セッション説明

https://tokyo.myignitetour.techcommunity.microsoft.com/sessions/83721

# メモ

- DevOpsとは
  - エンドユーザーに価値を継続的に提供できるヒトとプロセスおよびプロダクトの連携です（MS)
  - DevOpsの定義は存在していないため色々な会社が自社のDevOpsを定義している
  - リードタイムを短縮して早く価値を届けたい
  - DevOpsを行った企業が成しえたもの
- 人・プロセス・プロダクト
  - 人と人をシームレスにつなぐ
  - プロセス
    - プラン
    - 開発＋テスト
    - リリース
    - モニタリング＋ラーニング
  - プロダクト
    - Develop
      - GitHub
      - Visual Studio
      - VS Code
    - Operate
      - Azure Monitor
      - Azure Policy
      - Azure Automation
      - Azure Security Center
    - Deliver
      - Azure DevOps
      - GitHub Extentions
      - GitHub Actions
  - Azure DevOps
    - Azure Boards
      - カンバンボード
    - Azure Repos
      - コード管理
    - Azure Pipelines
      - デプロイパイプライン
    - Azure Artifacts
      - パッケージの管理
    - Azure Test Plans
      - マニュアルテスト
      - ブラウザからテスト実行
        - クリックした瞬間にスナップショットを取得したりとかできる
    - GitHub
      - コーディングワークフローを提供
- DevとOpsの関係
  - コード化が進んでいる
    - GUIでの設定の限界
    - ログとして保存できる
  - 統合が進んでいる
- デモ
  - Dev
    - コード
    - ユニットテスト
    - GitHubリポジトリ
    - CI/CDオートメーション
  - Ops
    - Azure DevOps Project
    - Webサーバー
    - スケーリング
    - CD/CIオートメーション
    - モニタリング
    - セキュリティ
本番アプリケーションをデバッグし、繰り返し改善する

# セッション説明

https://tokyo.myignitetour.techcommunity.microsoft.com/sessions/83717

# メモ

- Azure Monitor
  - 統合監視
    - 全てのメトリックスとログおよびその他の監視テレメトリーの共通プラットフォーム
  - データ・ドリブン インサイト
    - 機械学習機能を活用した高度な診断と分析
  - ワークフローの統合
    - 連携可能
      - ザビックス
      - DevOpsやイシュー管理
      - SIEM
      - ITSM
  - Azureにおけるシグナルとソース
    - アプリケーション
    - オペレーティングシステム
    - Azureリソース
    - Azureサブスクリプション
    - Azureテナント
    - customソース
- Application Insights
  - ライブラリを登録するだけでhttpsでログをクラウド上に上げる
  - アプリケーションの監視と分析
    - 可視性
      - 全体の把握
    - インサイト
      - 問題を見つける
    - 最適化
  - DevOpsとの統合
  - アプリケーションマップ
    - ピンポイントで問題の原因を探す
  - サーバー間の関係を追跡
  - エンドツーエンドトランザクション
- Azure Monitor Logs
  - AzureポータルでのLog Anlyticsの高度なエクスペリエンス
    - Azure Monitorのほうがログの保存期間が長い
  - タイプごとのRBAC
  - 統計、ルートコーズ（根本原因）傾向分析のためのクエリ実行
  - MLアルゴリズムを利用したクラスタリング後と異常検知
- スナップショット・デバッグ
  - 本番環境でのデバッグ
  - 分散アプリのサポート
  - ロールによるセキュアアクセス
  - 利用するには強い権限が必要（RBAC）
- デプロイスロット
  - 色々な環境が作成できる
  - 開発環境やステージング環境でもモニタリングをすることが重要
  - A/Bテストができる
    - 割合を決めて振り分けることが可能
- まとめ
  - Azure Monitorはモニタリングの統一ソリューション
  - Application Insightsを利用した本番アプリ内部の確認
  - Log Analyticsを使用したログ及びトレース検索
  - スナップショットデバッグ機能で本番環境のアプリをデバッグ
  - デプロイスロットを利用して効果的なテストができる
クラウド インテリジェンスで Web アプリケーションを拡張する

# セッション説明

https://tokyo.myignitetour.techcommunity.microsoft.com/sessions/83720

# メモ

- サーバーレスの概要
  - 時代の流れ
    - オンプレミス
    - IaaS
    - PaaS
    - Serverless
  - サーバーレスとは
    - サーバーの抽象化
    - イベント駆動・インスタントスケール
    - マイクロ課金
- Azure Serverless Platform
  - Event Grid
  - Logic App
  - Functions
- Azure Function
  - トリガーをもとにプログラムを起動
  - データをバインディングする
- 利用シナリオ
  - タイマーで15分ごとに起動
  - Blob Storageにファイルが追加された
  - 撮影した写真をWebhook呼び出し
  - 読み込まれたWebページからWebhook呼び出し
- イベント駆動の問題点
  - どこから呼ばれているか不明確
  - 解決策
    - Azure Event Grid
      - 完全に管理されたイベント・ルーティング
      - ほぼスケールでのリアルタイムイベント配置
      - Azure内およびそれ以外の広範囲なカバレッジ
  - 利用シナリオ
    - サーバレスアプリ
    - 運用の自動化
- Azure Logic 概要
  - ワークフロー
- Azure Cognitive Services
  - 利用形態
    - REST API
    - Container
- まとめ
  - Azure Function：インフラストラクチャのオーバーヘッドなしで容易に機能拡張
  - メッセージングのための Event Grid
  - サービス連携のためのAzure Logic
データベースを Azure に移動する-英語で配信、日本語に翻訳

# セッション説明

https://tokyo.myignitetour.techcommunity.microsoft.com/sessions/83719

# メモ

- Azure Cosmos DB
  - データタイプ
    - キー型
    - カラムファミリ
    - ドキュメント
    - グラフ
  - 複数のタイプのデータを登録できる
- SQL マネージドインスタンス
  - 一般提供
  - エンタープライズ対応
  - クラウド移行後には最適化が必要
- まとめ
  - PostgreSQL、MySQL等々色々対応している
  - Azureへの移行は今が最適なタイミング
AndroidでFirebaseStorageを使ってみよう

Android初心者アドベントカレンダー９日目を担当しますカーキです．
普段はLife is Tech!というところで大学生メンターをしたり、名古屋のスタートアップのスタメンという会社でモバイルアプリエンジニアインターン生として働いています．

## FirebaseStorageとは

[FirebaseStorage](https://firebase.google.com/docs/storage/android/start?hl=ja)はGoogleが提供する[Firebase](https://firebase.google.com/?hl=ja)の機能の一つです．
FirebaseStorageではその名の通り、ファイルの送受信がいとも簡単に行うことができます．
そしてAndroidでは後述しますが画像を受け取る際にGlideという画像ローダーライブラリを使用することができます！(やったね！) :thumbsup:

## 準備
### プロジェクト側
`build.gradle`にfirebase-storageを追加します．
またGlideを使ってファイルをダウンロードする際に必要になるfirebase-uiも同時に記述しておくとなお良いです．

```build.gradle
implementation 'com.google.firebase:firebase-storage:19.1.0'
implementation 'com.firebaseui:firebase-ui-storage:4.3.1'
```
現在(2019年12月9日時点)の最新のバージョンを入力していますが、より新しいのもがあればそちらを使用してください．

### Firebaseコンソール側
コンソールの方でも使用の許可をしてあげる必要があります．
<img width="1640" alt="vote_–_概要_–_Firebase_console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82263/42135289-a557-5dee-2a57-442f5f6290c8.png">

FirebaseStorageのページの『始める』から進めていけばFirebaseStorageのバケットを作成することができます．
また初期設定ではFirebaseCloudStoreと同様にセキュリティルールが誰でもアクセスできるという甘めの設定になっているので、リリースする前にはしっかり見直す必要があります．

## ファイルをアップロードする
ファイルをアップロードするために端末内の画像のURIパスからファイルを指定してアップロードすることができます．

### Firesorageのパスを作成する
画像をアップロードする際にファイルをどのようなフォルダ構成で格納するのかを示すパスを作成する必要があります．
今回は例として`Users`フォルダの配下に画像をアップロードすることとします．
フルパスが必要になるため、ファイル名は画像選択の際に取得するか任意に決めておく必要があります．

```MainActivity.kt
val storage = FirebaseStorage.getInstance()
val userImageRef = storage.reference.child("Users/user001.jpg")
```
これでFirestorageのパスを作成することができました．

### アップロードの処理

端末のギャラリーなどから選択した画像のURIを`imageUri`としています．
流れとしてはUri→パス→ファイル→インプットストリーム
に変換してfirebasestorageに渡していきます

```MainActivity.kt
val path = imageUri.path?: return
val stream = FileInputStream(File(path))
val uploadTask = userImageRef.putStream(stream)
uploadTask.addOnSuccessListener {
      // アップロード成功時

   }
   .addOnFailureListener { error ->
      // エラー発生時

   }
```
成功時と失敗時のリスナーにより、それぞれでの処理をハンドリングしていくことができます．
## Glideを使ってファイルを受け取る
この場合もアップロードする場合と同様にして取得したいファイルのFirestorage上でのパスを作成する必要があります．

```MainActivity.kt
val storage = FirebaseStorage.getInstance()
val userImageRef = storage.reference.child("Users/user001.jpg")
```

続いてGlideを使用してFirebaseStorageのパスから画像を取得していきます．
Glideは指定した画像URLから画像を`ImageView`に表示させるという元々の機能がありますが、
それをFirebaseStorageでもそのまま使用できることになります．

```MainActivity.kt
Glide.with(this)
     .load(userImageRef)
     .into(imageView)
```

Glideではプレースホルダー用画像を指定することでファイルのローディング中にデフォルト画像を表示することができます．

```MainActivity.kt
Glide.with(this)
     .load(userImageRef)
     .placeholder(R.drawable.ic_default_user)
     .into(imageView)
```

## まとめ
どうだったでしょうか、
画像をアップロードする際はUriからインプットストリームを作成する必要があり、少しややこしいですがファイルのダウンロードの場合はGlideを使用することでかなり楽になりますよね．

ただGldieはもちろん画像ローダーであるため、画像以外の場合はGlideを使用してダウンロードすることはできません．
その場合はぜひ公式のドキュメントを参考にしてみてください
[Android でファイルをダウンロードする](https://firebase.google.com/docs/storage/android/download-files)
Web アプリケーションを Azure に移行する

# セッション説明

https://tokyo.myignitetour.techcommunity.microsoft.com/sessions/83718

# メモ

- なぜモダナイズ
  - コスト削減
  - マネージドサービス
  - エラスティックスケール
  - チームスキルセット
- なぜモダナイズしないのか
  - 移行は大変だから
- 移行とモダナイズ
  - パターン
    - Rebuild
      - 完全にクラウドネイティブ
    - Refactor
      - 再パッケージ化するが、大きなコード変更はしない
    - Rearchitect
      - コードのモダナイズ
    - Rehost
      - コードを変更せずに移行
    - Lift and Shift
      - もっとも抵抗の少ない道
  - Rehost以外は経験がないとなかなか難しい
- 移行する手順
  - クラウドニーズの把握
  - 移行戦略の選択と適用
  - 最適化
- Azure Migration Center
  - 移行のための情報があつまっている
- サービス
  - IaaS
  - Azure App Service
CentOS6.10をWindows10のHyper-Vで動かす

# はじめに
Hyper-V関連のナレッジを蓄えるため、久しぶりにCentOSをセットアップすることにした。

# 環境

|||
|:-:|:-:|
|ホストOS| Windows10 Pro|
|仮想化ソフトウェア|Hypver-V|
|仮想マシンのOS|CentOS6|
|仮想マシンにインストールするサービス|Apache,PHP,PostgreSQL|

# 仮想マシンを新規作成する

1. Windows スタートメニューで[Hyper-V マネージャー]を検索し、アプリを実行。
<img width="633" alt="Cortana_2019-10-27_0-22-56_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/05c4c134-7223-2055-042b-8a9a6f07a940.png">

2. [Hyper-V マネージャー]の左ペインで管理先ホストを選択し、[操作]-[新規]-[仮想マシン]を選択。
<img width="937" alt="make vm 01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/5269bcde-338b-00b9-59ab-aabea5133b39.png">

3. [次へ]をクリック。
<img width="528" alt="make vm 02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/45e927af-53bb-b59b-9c71-9dbae673d875.png">

4. 仮想マシンの名前を[名前]に入力し、[次へ]をクリック。
<img width="528" alt="make vm 03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/8f2ff885-18a4-f3fe-4c65-2d41da87e757.png">

5. [第1世代]を選択し、[次へ]をクリック。
<img width="528" alt="make vm 04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/817eba0c-04fd-ab2f-2f19-dae51a8e3117.png">
<font color="red">※Windows10でサポートされる仮想マシンのインストールするOSで異なるため注意。</font>

6. [起動メモリ]を変更し、[次へ]をクリック。
<img width="528" alt="make vm 05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/73530314-e8f8-66a9-421a-07e853b4f899.png">
<font color="red">※ここでは2.0GBメモリを割り当てる。</font>

7. 接続するネットワークは[Default Switch]に変更し、[次へ]をクリック。
<img width="528" alt="make vm 06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/9ea75e01-15b1-2cd4-84b7-1e05ec6d7b23.png">
<font color="red">※インターネットからyumパッケージを取得するときになったら、外部接続用のネットワークに切り替えることとする。</font>

8. 仮想マシンをインストールする仮想ハードディスク(VHDX)の[名前]、[場所]、[サイズ]を指定し、[次へ]をクリック。
<img width="528" alt="make vm 07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/a7e8af0e-9e85-9067-d7ef-3d55a32225ab.png">

9. 仮想マシン作成後にOSのインストールを行いたいため、[ブートCD/DVD-ROMからオペレーティングシステムをインストールする]を選択。[参照]ボタンを押下し、Windowsダイアログにてイメージファイル(iso)を選択。[次へ]をクリック。
<img width="528" alt="make vm 09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/a7b004ce-eb78-de27-27ab-ae782ebd20df.png">

10. [完了]をクリック。
<img width="528" alt="make vm 10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/694dd9d7-d3ad-3b36-b6e2-01afd50e94c6.png">

11. 仮想マシンの作成が完了します。
<img width="937" alt="make vm 11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184939/2900f150-db29-2326-3d69-6d1e18efc3f1.png">

以上でCentOS6.10をHyper-Vにインストールする準備が終わりました。


# CentOSをインストールする

<b>準備中</b>


# 参考
- HYPER-V でジェネレーション 1 または 2 の仮想マシンを作成するか。 https://docs.microsoft.com/ja-jp/windows-server/virtualization/hyper-v/plan/should-i-create-a-generation-1-or-2-virtual-machine-in-hyper-v
楽しい楽しいプログラミングの勉強会に参加しよう!

#自己紹介
初めまして!
私は独学でプログラミングをしている高校生です。
一番好きな言語はJavaです

<b>プログラミングの成果や出来事をメインに書いていこうと思います</b>

#概要

私は11月27日に初めてCoderDojoにニンジャとして参加して12月8日にCo-KonPILE #0に参加しました。
そこで私が学んだことや楽しかったこと、よいところを説明します

#勉強会やイベントに行きたいと思ったきっかけ

私が独学でプログラミング始めたのは、中学1~2年生の頃です。
お年玉でRaspberry Pi 2を購入して、プログラミングを勉強しました
しかし、当時私の周りにはプログラミングを一緒にやる仲間がいなくて、ただ一人で独学していました。
友人と少し一緒にJavaをやったことはあります

高校2年生になって、さすがに一人でやるのも疲れてきたので、ノートパソコンを持っている今、
無料で参加できるプログラミング会を探すことにしました。

#CoderDojoとの出会い

初めての参加で作成したプログラムは、Jsoupを使ったGoogleのロゴ画像のURLを取得する簡単なプログラムです

そこでいろいろな話をして、貴重な経験ができました!

#Co-KonPILE #0

CoderDojoから帰ったあと、JSoupの使い方をアドバイスしていただいた方にお礼の連絡をしました。
そして、12月8日にCo-KonPILEを開催するのでもし良かったらどうぞ、みたいな感じで返信が来たので参加しました。
都会に住んでいない私にとっては参加がしやすいのです。

>Co-KoNPILe (ここんぱいる)

>東京都の小平市や国分寺市や小金井市で地道に積み重ねる IT 勉強会的なものです
>参加費 : 大人500円(会場費やおやつ代に充当)，学生無料

当日、ゆるーく雑談をしながらパソコンを使って楽しかったです!

<b>今後も私はITのイベントに参加していきます</b>

#イベントに参加する良いところ

<b>・貴重な経験や情報交換ができること
   ・楽しくプログラミングができること
</b>

#まとめ ~プログラミングの勉強会に参加しよう~

独学で一人でプログラミングは、やっぱり<b>寂しい</b>です。
なのでたくさん交流会や、勉強会に参加することが大事だと思います!
Haskell個人メモ【型】

#Haskellおべんきょメモ
地道に進めてる

#型
- 型はすべて大文字で
- 関数は小文字かアンダーバー(_)で始める

~~~type1.hs
--myName(私の名前)をString型で宣言する
myName :: String 
myName = "nekoGorilla"

--年齢を表す
myAge :: Int
myAge = 23

--タプルも使えば色んな情報詰め込める
myAddress :: (String, String, String)
myAddress = ("日本", "東京都", "杉並区")
~~~

#関数の型
- 関数にも型を定義する
- 引数の型が一つとは限らないため、型変数を利用することもある

~~~type2.hs
--引数をそのまま返す関数
returnArg :: String -> String
returnArg x = x
--しかし↑のままではString型しか返せない(返すだけなら型はなんでもいい)

--型変数を利用することで、aは何らかの型になる
returnArg :: a -> a
returnArg x = x

--100を渡した場合
returnArg 100 

--aはHaskellの型推論によりInt型だと解釈される
returnArg :: a -> a
--↓
returnArg :: Int -> Int
~~~

#型を定義する
- 一つの型に対して別名を使用することを**型シノニム**という
- 型シノニムを定義する際には`type`キーワードを使う

~~~type3.hs
--自分の情報から簡単なプロフィールを作る関数
--引数に名前・あだ名・出身地・年齢・血液型を設定する
makeProf :: String -> String -> String -> Int -> String-> String
makeProf name nickName birthPlace age bloodType = "名前: " ++ name ++ " あだ名: " ++ nickName ++ " 出身: " ++ birthPlace ++ " 年齢: " ++ show age ++ " 血液型: " ++ bloodType

putStr (makeProf "nekoGorilla" "ゴリラ" "ジャングル" 23 "O")
名前: nekoGorilla あだ名: ゴリラ 出身: ジャングル 年齢: 23 血液型: O

--ただし引数を見ただけではどんな情報を受け取る関数なのかが分からない
makeProf :: String -> String -> String -> Int -> String-> String

--そこで型の定義をする
type Name = String
type NickName = String
type BirthPlace = String
type Age = Int
type BloodType = String

--定義した型に置き換えてみると…
makeProf :: Name -> NickName -> BirthPlace -> Age -> BloodType-> String
--どんな情報を引数として受け取る関数なのかが一目で分かるようになった！
~~~

#独自の型を定義
- `data`を使い、独自の型を定義できる
- 型シノニムとの使い分けには注意する

~~~type4.hs
{-
独自の型: Direction型
Directionは型コンストラクタ
North | Est | South | Westはデータコンストラクタ
-}
data Direction = North | Est | South | West

--Direction型を受け取り、Direction型が東西南北どのインスタンスかで戻り値が決まる
direction :: Direction -> String
direction North = "北"
direction Est = "東"
direction South = "南"
direction West = "西"

--Estを受けとると
putStr (direction Est)
東
~~~

#今日の感想
まだ楽しめていると思う
そろそろややこしくなってきそうだけども…
valet install  でこけた

valet installでこけた。
その忘備録、記録をまとめるためにこちらにインストールするまでの経緯を記述します。


## エラー内容

```
In Brew.php line 204:
                                          
  Homebrew PHP appears not to be linked.  
                                          

install
```

PHPが紐付けされてないから失敗してるっぽい

## 対応方法

ググる

[参考：(Mac)ローカルに手動でValet+Laravel環境を作成する手順](https://qiita.com/bonny_d/items/0749dda5343aeb68544e)

`brew link php72 --force`で紐付けをしてみた。

```
$ brew link php72 --force

Linking /usr/local/Cellar/php@7.2/7.2.24... 
Error: Could not symlink sbin/php-fpm
/usr/local/sbin is not writable.
```

`/usr/local/`に`sbin`が無いと怒られた。

sbinってなんだ。。

本当に無いのかみる

```
$ ls -la  /usr/local
```

なかったのでとりあえず作ってみた。

```
$ sudo  mkdir -p /usr/local/sbin 
$ sudo chown -R $(whoname):admin /usr/local/sbin  
```

もう一回`brew link php72 --force`を実行

```
brew link php72 --force

Linking /usr/local/Cellar/php@7.2/7.2.24... 25 symlinks created

If you need to have this software first in your PATH instead consider running:
  echo 'set -g fish_user_paths "/usr/local/opt/php@7.2/bin" $fish_user_paths' >> ~/.config/fish/config.fish
  echo 'set -g fish_user_paths "/usr/local/opt/php@7.2/sbin" $fish_user_paths' >> ~/.config/fish/config.fish
```

言われた通りにコマンドを叩く。

```
$ echo 'set -g fish_user_paths "/usr/local/opt/php@7.2/bin" $fish_user_paths' >> ~/.config/fish/config.fish
$ echo 'set -g fish_user_paths "/usr/local/opt/php@7.2/sbin" $fish_user_paths' >> ~/.config/fish/config.fish
```

もっかい`valet install`

```
$ valet install 

Stopping nginx...
Installing nginx configuration...
Installing nginx directory...
Updating PHP configuration...
Restarting php@7.2...
Installing dnsmasq...
[dnsmasq] is not installed, installing it now via Brew... 🍻
Restarting dnsmasq...
Valet is configured to serve for TLD [.test]
Restarting nginx...
```

できた！！！！！！

けど、実際問題力技で`/usr/local/sbin`を作って良いのかは謎。。。
【Firebase】Reactのcreate-react-appで作ったWEBアプリをデプロイする際の注意点

# build後、firebaseにデプロイしたらコンソールログでエラーが出た
エラー内容はこんな感じです。
```/%PUBLIC_URL%/favicon.ico:1 Failed to load resource: the server responded with a status of 400 ()
```

#firebase.jsonを修正すれば解決！
firebase.jsonのホストティング対象はデフォルトではpublicになっています。

```
{
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
```
こいつの"public": "public" を　"public": "build"に変更すれば解決しました。

```
{
  "hosting": {
    "public": "build",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
```

こういう系ってハマるととことんハマりますよね。。。
昔を思い出しながらLaravel、FuelPHP、Codeigniterを比較してみた。

こんにちは！葛山です。
今回会社でアドベントカレンダーをやろうということで僕も慣れないブログを書いてみることにしました。
業務でコードに触れることは少なくなったのですが、最近Laravelを勉強したので昔使っていたFuelPHPやCodeigniterとの比較記事を書こうと思います。


### はじめに
パーソンリンクは2011年に僕が立ち上げた会社なのですが、少人数だったので僕がPMを担当しながらプログラマーも兼務しているという状況でした。
最初はCodeigniter、2012年からはFuelPHPをメインに使っていました。


### なぜPHPなのか
僕がPMの時にPHPを採用していた理由は「人が集めやすい」からです。
開発案件は急に始まるので、その際一番苦戦するのが人員の確保です。
当時はうちのメンバーの人数も少なく、外部の方と一緒に即興でチームを組むこともありましたので（開発では割とそれがスタンダードなのかも）その際一番募集をかけやすかったのがPHPでした。

PHPはWEBアプリ開発において人気のプログラミング言語なのですが、フレームワークの種類が多すぎて何を使うべきかわかりませんよね。
そこで今回は、数あるフレームワークの中で僕が推しているLaravel、FuelPHP、Codeigniterについて比較と解説をしていきたいと思います。


### 学習コスト
僕の体感だと
Laravel > FuelPHP > CodeIgniter
です。

CodeIgniterを初めて使った時、それまでZend FrameworkやSymfonyなどを使っていましたが、学習コストの少なさに驚きました。
CodeIgniterで街コンサイトを作ったのですが、PHPさえ知っていればほぼ学習せずに作り上げるところまではいけました。ピュアなPHP+αってイメージです。
FuelPHPとCodeIgniterの差は機能の多さで、フレームワークとしての本質はあまり変わらない印象です。

まだ勉強を始めたばかりなのですが、LaravelはRuby on Railsみたいないイメージでコーディング規約もちゃんとあるので大規模開発にも適応できそうです。
開発環境の構築も簡単でドキュメントも読みやすかったです。
AWSやSNSとの連携等、機能がたくさんあるので使いこなそうと思うと学習コストはかかりますが、これさえあれば大体のwebアプリ開発は完結できそうです。


### 処理速度
検証していないので後日上げますw
他の記事を読んだところこの中ではCodeIgniterが一番高速らしいですね！


### 柔軟性と拡張性
CodeIgniter > FuelPHP > Laravel
です。

CodeIgniterが一番コーディング規約などの制限が緩く、自分で書きやすいように書いていくことができます（僕は簡単なシステムを作るときはModelはほぼ書かずに既存ORMのみで書きました）
フレームワークの拡張もしやすくcoreをオーバーライドすることで簡単に拡張できます。
個人的には2人以上が関わるプロジェクトにはオススメしませんが、今はもしかすると良い管理方法があるかもしれません。。

FuelPHPもCodeIgniterの開発者の一部の人たちが作っていることもあり、似ている部分は多いです。
規約が緩いのは変わらないですが、Oilコマンドでクラスの自動生成ができるので、そこである程度型が決まってきます。
ディレクトリ構成もわかりやすく、coreの拡張がし易いです。
下記のようなディレクトリ構成になっていますが、appとcoreの配下がほぼ同じ構成になっているので拡張したいcoreがあればそれをappでオーバーライドして記述すれば良いのです。
```
ルートディレクトリ/
　├fuel/
　│　　├app/
　│　　├core/
　│　　└packages/
　│
　└public/
　　　　├assets/
　　　　└index.php
```
また、CodeIgniterではデフォルトでドキュメントルートにシステムファイルが置かれてしまっていましたが、publicディレクトリに切り離されたのでセキュリティ的にも良くなりました。

Laravelはプラグインが充実していることとフレームワーク自体の完成度が高いため、coreなどを柔軟に拡張することは前提としていないのですが、ベースとなるController等どのプロジェクトでも拡張するようなクラスはデフォルトでapp配下に置いてあるのでそれを拡張していく感じです。
それ以外を拡張する場合は少し面倒で、ただcoreを継承するだけではなくService Providerを書かなければいけなかったり工程が多いので柔軟性は他の二つに比べると一番低いとしました。
ただし、前述したようにcomposerで簡単に高機能なプラグインが導入できるので拡張性は高いとも言えます。

### まとめ
ここまで僕の所感を元にPHPのフレームワーク比較をしてきましたが、現在のイチ推しはLaravelです。
理由はフレームワークの性能以上に、メンテナンスの頻度やプラグインの豊富さなどがビジネス要件を多く満たせるかの鍵になってくるので、今トレンドのものを選択するのが一番良いからです。
これからPHPを学ぶ人はLaravelから始めてみましょう！
OS別、DockerクライアントのみをインストールしてリモートのDockerに接続する為の設定方法

[DockerデーモンにTLS接続出来る][0]のが前提の記事となっています。

### 更新履歴
* 2021/5/1
    * 公式配布のWindows向けバイナリが最新版になっていたので、そちらを推奨手順に変更しました。

##検証環境

- Windows 10 Pro version 1909
- Ubuntu 19.04
- macOS Catalina

##共通の手順

クライアントのインストール手順はOS毎に違いますが、接続先の設定は認証用のファイルを~/.dockerに置いて環境変数を設定するだけです。

公式手順に従っていた場合はca.pem,cert.pem,key.pemの３つのファイルが出来ているはずなので、この３つのファイルを各クライアントにコピーし、~/.dockerに移動しておきます。

デフォルトの接続先をUNIXソケットからTCPソケットに変えるには下記の２つの環境変数を設定します。

```
DOCKER_HOST=tcp://hoge.exampl.com:2376
DOCKER_TLS_VERIFY=1
```

上記の```hoge.exampl.com:2376```は接続先のFQDNとポートに置き換えてください。

##Docker Clientのインストール (Ubuntu)

[公式手順][1]の最後の```sudo apt-get install docker-ce docker-ce-cli containerd.io```のところでdocker-ceとcontainerd.ioを省くだけです。

##Docker Clientのインストール (macOS)

Homebrewがdockerを配布しているので、これを利用するのが簡単です。多分クライアントだけだと思います。

```
brew install docker
```

##Docker Clientのインストール (Windows)

Windowsでは決定版的パッケージマネージャーが存在せず、少なくともMSYS2のpacman等ではdockerの配布はされていません。

取れる手段は3つです。

1. WSLにインストールして、Windows側にwsl上のdockerを呼び出すラッパーを用意する。
2. ~~[公式配布の古いバイナリ][2]をダウンロードし、パスを通す。~~  
   **2021年5月現在、公式配布のバイナリのバージョンが最新のものになっているので、こちらを利用するのが確実です。以降のビルド関連の記述は旧来のバイナリが欲しい等の特殊事情でない限り無視してください。**
3. 自分で公式ソースをビルドし、パスを通す。

1番はお手軽ではあるものの、VSCodeのRemote - Containersが使う```||```の解釈に失敗して上手く動きませんでした。

2番もお手軽ではあるものの、VSCodeのRemote - Containersが未実装のオプションを利用する為上手く動きませんでした。

よってここでは3番で行きます。

###Docker Clientをビルドする

gitコマンドが使える、dockerがインストールされている環境で作業します。
dockerはクロスビルドに対応している為、Windowsでなくて構いません。

適当なディレクトリを作り、そこにdocker-ceのリポジトリをcloneします。

```
$ mkdir ~/docker-ce 
$ cd ~/docker-ce
$ git clone https://github.com/docker/docker-ce.git .
```

これで取得するソースは開発版になるので、安定版が良い場合はバージョンをタグで指定してcheckoutします。

```v19.03.5への切り替え
$ git checkout refs/tags/v19.03.5
```

次にDocker Clientのディレクトリに移動し、ビルドを行います。

```
$ cd components/cli/
$ make -f docker.Makefile binary-windows
```

makeにdockerコマンドを利用している為、dockerコマンドにsudoが必要な環境ではmakeの前にsudoをつけてください。

ビルドが完了するとbuildフォルダの中にdocker-windows-amd64というファイルが出来ているので、これをWindowsの適当なディレクトリにscp等でコピーします。

コピーしたファイルをdocker.exeにリネームし、環境変数のPATHにdocker.exeのあるディレクトリへの絶対パスを追記すればインストール完了です。

##参考文献

[Get Docker Engine - Community for Ubuntu][1]

[0]:https://qiita.com/negineri/items/0978f5e72e46570c8be0
[1]:https://docs.docker.com/install/linux/docker-ce/ubuntu/
[2]:https://download.docker.com/win/static/stable/x86_64/
インデントってなんだ？

#おい俺！コードが見にくいぞ！
swiftを今は初学者向けの本で学習をしているのだが、どうもサンプルコードを自分で書くと、コードが読みづらい。
というのも、ページの都合上改行しないといけない文がある為、「これが正しいコード」として認識をしていたのである。

例えば例として、こんなコードを書く。


 ```
import UIKit

class ViewController: UIViewController {
//スーパークラスUIViewControllerを継承しているclass ViewController

   @IBOutlet weak var label: UILabel!

    @IBAction func sayHello(_ sender: Any) {
    label.text = "こんにちは"
//
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}
 ```
でね、このコードのデコボコ具合ってなんか謎な訳ですよ。
初学者には。

コードを書くと意味分からないところで改行されるし。

だから見やすいコードっていうのは

 ```
import UIKit

class ViewController: UIViewController {
//スーパークラスUIViewControllerを継承しているclass ViewController

@IBOutlet weak var label: UILabel!

@IBAction func sayHello(_ sender: Any) {
label.text = "こんにちは"
//
}
    
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}


}
 ```
っていうもんだと思う訳ですよ。

整理されてるやん！って。

で、コードにエラーが出て知り合いのエンジニアさんにコードを送ると

「インデントのズレを直したいね」と言われた。

インデントのズレ？

##インデントってなんだ

ウィキペディアによると
>字下げスタイルまたはインデントスタイル（英: Indent style）とは、プログラミングにおいてプログラムの構造を明らかにするために、コードのブロックの字下げをどうするかを決めたものである。本項ではC言語やそれに類似した言語を主に扱うが、他のプログラミング言語（特に括弧を使用してブロックを記述する言語）にも適用可能である。字下げスタイルはプログラミング作法の一部である。

とある。

いや、下げる意味なんてないやん！
<b>いいえ、おおありでした。</b>

###インデントは国語でいうところの段落！？

「今日は晴れでした楽しかったです明日も晴れるといいな。」

という文章があるとしよう。
この文章は果たして読みやすいだろうか。

「今日は、晴れでした。楽しかったです。明日も晴れるといいな。」なら読みやすい。

つまり先ほどの

 ```
import UIKit

class ViewController: UIViewController {
//スーパークラスUIViewControllerを継承しているclass ViewController

@IBOutlet weak var label: UILabel!

@IBAction func sayHello(_ sender: Any) {
label.text = "こんにちは"
//
}
    
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}


}
 ```

は、「今日は晴れでした楽しかったです明日も晴れるといいな。」という文章状態。
どこが段落で「。」があるのか分からない状態である

一方で

 ```
import UIKit

class ViewController: UIViewController {
//スーパークラスUIViewControllerを継承しているclass ViewController

   @IBOutlet weak var label: UILabel!

    @IBAction func sayHello(_ sender: Any) {
    label.text = "こんにちは"
//
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}
 ```
だと

 ```
import UIKit

class ViewController: UIViewController {　←段落１
//スーパークラスUIViewControllerを継承しているclass ViewController

   @IBOutlet weak var label: UILabel!

    @IBAction func sayHello(_ sender: Any) {　←段落２
    label.text = "こんにちは"
//
    }　←段落２の終わり
    
    override func viewDidLoad() {　←段落３
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }　←段落３の終わり


}←段落１の終わり
 ```
となっている。

確かに、段落１の始まりと終わりの文字の銭湯が同じ位置にあるし、段落２と３の始まりと終わりも同じ位置にある。

これが全部同じ位置に配置されていると、どれ段落の始まりで終わりかが分からない。

今までなんとなくモッコリさせればいいと思っていたけど、これでスッキリ！！
Xaasについて

<h3>Saas　（sofrware as a service）</h3>
<p>ソフトウエアをダウンロードして使うのではなく、サーバーにアクセスして、サーバー上でソフトウエアを操作して、使用する。ソフトウエアの導入とかしなくても、登録して、ログインして使える。データもサーバーに保管されているから、ログインすれば、前回の続きから作業できる。会員制のツールとかのイメージ。</p>

<h3>Paas (platform as a service)</h3>
<p>事業者向けに、OSやコンピュータなどの基盤（プラットフォーム）をインターネット上から利用できるようにしたもの。</p>

<h3>Iaas (infrastructure as a service)</h3>
<p>システムの稼働に必要な基盤（インフラ）をインターネット上で利用できるようにしたもの。</p>

<h4>インターネットを利用して資源や機能を提供する、サービスとしての〜を提供することをX as a service = Xaasという。</h4>
Azure Application Gatewayで502 Bad Gatewayが出た話

# はじめに

[SENSYN Robotics](https://www.sensyn-robotics.com/)(センシンロボティクス)の中山です。
Webアプリやそのインフラ周りと、Web側とドローンの接続を行うデバイスドライバ的な部分を担当しています。

今回はAzure Application GatewayでHTTPの502 Bad Gatewayが出たときの話です。

# Azure Application Gateway

Microsoft Azureで提供されている、HTTP・HTTPSのレイヤー7ロードバランサです。AppGWと略すことが多いです。AWSのApplication Load Balancer(ALB)みたいなものですね。マネージドサービスなので、管理が楽です。

ロードバランサなので、ユーザーに公開されるIPアドレスはAppGWのものになります。[SENSYN Robotics](https://www.sensyn-robotics.com/)のサービスはKubernetes上のコンテナとして動いているのですが、そのコンテナ群のフロントエンドとして機能します。

図にするとこんな感じ↓。

```
Web browser <--HTTPS--> AppGW <--HTTP--> containers on Kubernetes
```

# 502 Bad Gateway

サービスの提供を開始した頃、いくつかのリクエストに対して502 Bad Gatewayが返るという問題が発生しました。テストしてみると、大量[^1]のリクエストを送ったときに発生するようです。

当初は、コンテナ側の負荷上昇が原因でAcceptキュー(backlog)が溜まり、時間内にHTTP接続を受け付けられなかったことで接続タイムアウトしたのだと考えていました。

しかし、tcpdumpで調査してみると、そもそもTCPの接続要求(SYN)が来ていないように見えます。AppGWが502を返すまでの時間が非常に短いことからも、backlog溢れによる接続タイムアウトという可能性は低そうでした。

# HTTP1.1

AppGWのドキュメントを見てみると、バックエンドとHTTP1.1で通信するとあります。

[HTTP2 のサポート](https://docs.microsoft.com/ja-jp/azure/application-gateway/configuration-overview#http2-support)より

> バックエンド サーバー プールへの通信は、HTTP/1.1 で行われます。

HTTP1.0とHTTP1.1の違いといえば、

A. 接続の再利用
B. パイプライン
C. Chunked response
D. キャッシュ制御の標準化

といった辺りです。今回は接続で問題が起きているので、Aの接続の再利用が関係している可能性が高そうです

# 仮説

HTTP1.1で追加された機能である接続の再利用をAppGWが利用している[^2]とすると、以下のシーケンスで問題が起きそうです。

1. AppGWがリクエストを受け付ける
2. AppGWがバックエンドに対してTCP接続する
3. TCP接続を通してHTTPのリクエストをバックエンドに投げる
4. バックエンドがAppGWにレスポンスを返す
5. AppGWがクライアントにレスポンスを返す
6. AppGWはTCP接続を**切らない**
7. バックエンドは一定時間使われていないTCP接続を切断しようとする
8. 切断中にAppGWがリクエストを受け付ける
9. AppGWが切断中のTCP接続にリクエストを送ろうとする
10. 送れないのでBad Gatewayエラーを返す

AppGWはまだ接続中だと思っているTCP接続が、バックエンド側では切断されている、という状況です。バックエンド側で切るのが早すぎるのが問題です。

# 解決

バックエンド側が**一定時間使われていない**と判断する閾値を変更しました。具体的にはKeep-Aliveのタイムアウトを5秒から3分にしています。

問題の起きていたバックエンドはNode.jsで書かれているので、以下のようなコードにしました。

```javascript
var server = http.createServer(app).setTimeout(config.timeout.server());
server.keepAliveTimeout = config.timeout.server();  // デフォルトは5秒
```

この修正を入れてテストしてみると、きれいに502エラーが消えました。問題解決です。

# まとめ

* Azure Application Gatewayで502 Bad Gatewayが起きたときは、バックエンド側のKeep-Aliveが原因のケースがある
* tcpdumpを使うと原因を切り分けやすい


[^1]: 大量といっても100req/s程度
[^2]: connection poolingの一種と考えられます
tmuxの操作を98%くらい効率化するキーバインド

**個人的** には、一般的にtmuxで使う98%くらいの操作は以下のような機能だと思っている。（※ *98%は完全に主観的な数値であり客観的データに基づいているわけではないことをご了承ください*）

- ウィンドウの新規作成 (ウィンドウ = タブみたいなやつ)
- ウィンドウの削除
- ウィンドウの切り替え
- ウィンドウの位置の入れ替え
- ウィンドウの分割[水平/垂直] （ウィンドウを分割してできたエリアをpaneという)
- paneのフォーカス移動
- コピーモードへの切り替え (主にコピーするためではなく上にスクロールするため)

これらの操作にいちいちプレフィックスキー(デフォルト `C-b` )を打つのはめんどくさい。特に２つ隣のウィンドウに移動するときなど連続でキーを入力するときがめんどくさい。[^1]

そこでプレフィックスを入力しなくてよいキーバインドとなる `bind -n` と修飾キー、直感的にわかりやすい矢印キーを使って効率化する。[^2]

[^1]: 今回紹介はしないが `bind -r` というプレフィックスのあと連続入力することができるオプションもある
[^2]: 普通の人向けに矢印キーを使っているが、私はVimmerなので当然矢印キーの代わりにhjklを使っている :boom:

---

**私の日々のtmuxの使用方法**

私はtmuxの機能の中でもウィンドウの切り替えが圧倒的に使用頻度が多くて、次にウィンドウの作成・削除、コピーモードへの切り替えが多い。paneの分割はvimの分割と併用していることが多いので、シェルを一時的に同じ画面で開きたいときに使うくらいな感じで日々使用している。
私が使用している98%の残りの2%（要はプレフィックスを打ってから使っている機能）はなにかというと、セッションのデタッチ、ウィンドウ<->paneの切り替え、ウィンドウ名の名前変更、paneのサイズ変更などだと思う。

---

**修飾キーをターミナルで使う上での注意点**

修飾キーはターミナルのショートカットに割り当てられていることもあるので、ターミナルのショートカットはオフにしておいたほうがいい（どうせ対して使うことはないため）。

またターミナルによっては修飾キー+矢印キーがうまく入力できないこともある。そういうときは `Ctrl-v`を入力したあと `Alt-上矢印キー` などを入力して正しいキーシーケンスになっているか確認する必要がある。
(使っているターミナルがalacrittyの場合は `~/.config/alacritty/alacritty.yml` の `key_bindings:` にある)


ちなみに私の環境では

- Alt-上矢印キー: `^[[1;3A`
- Alt-下矢印キー: `^[[1;3B`
- Alt-右矢印キー: `^[[1;3C`
- Alt-左矢印キー: `^[[1;3D`
- Ctrl-上矢印キー: `^[[1;5A`

となっていた。[dotfilesのここの部分](https://github.com/yutakatay/dotfiles/blob/69e4f458581f6efe89d45ba6b2870be95797c81a/.config/alacritty/alacritty.yml#L835-L870)

(※ 普通Ctrl-左右矢印キーは単語移動に割当られているので、使っている場合は設定しないほうがいい)


## 設定

私はtmuxの主な修飾キーはAltを選択しているのでここではAltを用いた設定を書く。サブとしてShiftとCtrlも使っているが、エディタなどとコンフリクトすることが多いので矢印キーなど限定的に使うのが好ましいと思われる。


```shell:.tmux.conf
# Alt-上矢印キーでウィンドウの新規作成
bind -n M-up new-window -c "#{pane_current_path}"

# Alt-下矢印キーでウィンドウの削除
bind -n M-down confirm-before 'kill-window'

# Alt-右左矢印キーでウィンドウの切り替え
bind -n M-left previous-window
bind -n M-right next-window

# ウィンドウの位置の入れ替え
bind-key -n M-S-left swap-window -t -1
bind-key -n M-S-right swap-window -t +1

# Alt-- でウィンドウの分割[水平]
bind -n  M-- split-window -vc "#{pane_current_path}"

# Alt-\ でウィンドウの分割[垂直]
# ( | で垂直分割としたいが|は入力にShiftが必要なため省略)
bind -n 'M-\' split-window -hc "#{pane_current_path}"

# paneのフォーカス移動 (よく使う動作のため、Shift-矢印キーを使う)
bind -n S-left select-pane -L
bind -n S-down select-pane -D
bind -n S-up select-pane -U
bind -n S-right select-pane -R
思われる
# コピーモードへの切り替え (Ctrl-上矢印キー)
bind -n C-up copy-mode
```


これでtmuxのよく使う動作をプレフィックスなしで実行できるようになった :tada:
他にもよく使う動作があれば修飾キーを用いて入力を高速化し、生産性を向上させるといいと思う :+1:
【Git】GitLabでクローンすることなく古いコミットが欲しい

#こんな状況に出くわした
リポジトリがでかすぎて私の激遅回線ではクローンするのに1日かかってしまう！
※イメージ
<img width="200px" alt="でかすぎポジトリ" src="https://gyazo.com/7896c81f7d4c75d6e64a324ba1dba229/raw">

今回はこのリポジトリ下から2番目のコミット`First Commit`(`e24b3ba0f2d9d367d4758ccfafa4aef0e90b804a`)が欲しいのだ
![First Commit](https://gyazo.com/32363f6bdb2d912ea193e73d9ae8a618/raw)

## 実験
当然、クローンしていないので

```bash
git checkout e24b3ba0f2d9d367d4758ccfafa4aef0e90b804a
```
などとはできない。
そして、

```bash
git fetch origin e24b3ba0f2d9d367d4758ccfafa4aef0e90b804a:refs/remotes/origin/template
```
などとしても、

```bash
error: Server does not allow request for unadvertised object e24b3ba0f2d9d367d4758ccfafa4aef0e90b804a
```
と怒られてしまう

## 結論
Web上からタグを作ってしまおう [^1]

## 方法
タグ画面から
![GitLab Tags](https://gyazo.com/3184ac83574ed879500d1c13f1ec69a0/raw)
New tagを押して
![New tag](https://gyazo.com/edf8ade7d3cc890f84c230372496b8e6/raw)
Tag nameは適当、Create FromにコミットIDを打ち込んで
![New tag](https://gyazo.com/d5e0c92179e4ebc4fe2a4316e611f60f/raw)
Create tagを押す

あとは
`git init`などでリポジトリを作り、`git remote set-url origin <URL>`などでリモートを設定後、
タグ名でフェッチできる

```bash
git fetch origin template:refs/remotes/origin/template
```
あとはチェックアウトするだけ

```bash
git checkout -b template refs/tags/template
```

[^1]: 書き込み権限がないリポジトリの場合はフォークしましょう
【8日目】トランザクションサポートデータベース実装

# まえがき
さて、今回からはトランザクションをサポートする機能を持ったデータベースを実装していきます。
正直なところ、実装と記事投稿を同時並行で進めているため、あとから大きく実装方針を変えたりすることがあるかもしれません。最終的に25日間の記事を読めば、スムーズにRDBMSを実装できるようにしたいと思っています。
_Basically Available, Soft-state and Eventual consistency._

トランザクションサポートデータベースで実装したい機能は下記の想定です。

* ACID特性
* 障害耐性

## 実装戦略
まずいくつか制約を付けます。4つのDML（INSERT, SELECT, UPDATE, DELETE文）は必ずトランザクションの中でのみ実行できるとします。そのため、BEGINで始まりCOMMITまたはROLLBACKで終わる下記のようなトランザクションが想定されます。
BEGIN→INSERT→SELECT→UPDATE→COMMIT
次に、トランザクションは同時には実行できないものとします。複数のクライアントがトランザクションを開始しようとした場合、後からトランザクションを開始したクライアントは、先に開始されているトランザクションが終了するまで待機させられます。そのため実行されるトランザクションは常に高々一本のみです。複数トランザクションの同時実行はAC後半の方で実装予定です。

さて、これらの制約の中で、どのようにトランザクションをサポートするプログラムを実装していくか。今の想定では、[ACID特性](https://ja.wikipedia.org/wiki/ACID_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E7%A7%91%E5%AD%A6))のそれぞれについて実装していく予定です。
その次に、障害発生時の回復動作について実装していきます。
最後に複数トランザクションの同時実行制御などについて実装する予定です。

# まとめ
トランザクションサポートデータベースの実装がおそらく一番難しく、一番面白いところだと思います。様々な方法を試しつつ、実装していけたらと思います。
xcodeについて

少し趣向を変えて
今日知った知識について

# Xcodeとは
Xcode（エックスコード）とは、Apple社が開発・リリースしているソフトウェアです。
MacやiPhone、iPad向けのアプリケーション開発に特化しています。

# Xcodeの特徴
2003年にリリースされ
当初はMacOS Xに含まれていたのでその時代のMacには全てXcodeが入っていたことになります。

統合開発環境と呼ばれていて、Xcodeには開発関係の数多くのツールが含まれています。

代表的なものの一つは、アプリケーションのインターフェースを作成するGUIツール
Interface Builder（インターフェイスビルダー）です。

テキストやボタンなどの要素を、マウスを使ってドラッグアンドドロップして配置することができます。
配置した要素に伴って、必要なクラスやコードも自動追加してくれます。

# Xcodeでつくれるもの
XcodeはMacOSやiOSで動作するアプリを制作するものです。
逆に言うと、XcodeがなければiPhoneアプリはつくれません。

App Storeの全てのアプリがそれで作られていると考えて下さい。

# インストール
Xcodeをインストールするには、MacOSの動作するパソコンと、Apple IDが必要です。
App StoreからXcodeを選択し、インストールを行えばOKです。

難しいその後の内容についてはまた後日紹介予定です。
SREと開発チームの働き方

# はじめに
[SRE Advent Calendar 2019](https://qiita.com/advent-calendar/2019/sre) 8日目になります。

[SREコミュニティ@福岡 - connpass](https://sre-fukuoka.connpass.com/) をしてます、[@transnano](https://twitter.com/transnano) です。雰囲気でSREをやってます。

## 背景

上記の福岡のSREコミュニティで参加者の人と話している時に、SREと開発チームで知識の伝達がうまくいかない（原文は少し違ったかも）、という意見がありました。

なるほどそうなのかと思いました。と言うのも私のチームでは開発チームからSREをやる人が生まれた（以下の画像のイメージ）ため、SREと開発チームとの間で問題が発生したことがありませんでした。そうです、**One Team** です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84493/e005bdb3-4587-a98d-cbeb-ab3d8fd188fd.png)

## モブプログラミング・ペアプログラミング

以下にとても良くまとまっていますのでそちらを参考ください。
- [モブプログラミングを実際にやってみた - Qiita](https://qiita.com/TAKAKING22/items/31e027dfb6ea8b1a8d69)
- [モブプログラミング・ベストプラクティス　ソフトウェアの品質と生産性をチームで高める/マーク・パール/長尾高弘](https://paypaymall.yahoo.co.jp/store/boox/item/bk-4822289648/?sc_i=shp_pc_search_itemlist_shsrg_title)
- [ペアプログラミングで「強いエンジニアチーム」を作る！ ヤフーが実践する全てペアプロ開発の手法 - エンジニアHub｜若手Webエンジニアのキャリアを考える！](https://employment.en-japan.com/engineerhub/entry/2019/11/07/103000)

私のチームでは、スクラムを採用しており、その中でモブプログラミングやペアプログラミングによる開発を行っています。

## どのようにSREと開発チームが1つになるか

上記の参考文献を読んでもらうと、モブプログラミングやペアプログラミングの特徴の一つに、メンバー同士での知識の共有があることが分かると思います。そうです。この特徴を利用して **One Team** になるということです。

そのため、開発チームにSREが入る（図の左側のイメージ）組織の場合でも、SREと開発チームの間の壁はなくなる（壁が薄くなる）と考えています。

また、モブプログラミングやペアプログラミングは始めるのに抵抗があるともよく聞きます。そのため、開発工程の全てで適用するのではなく、例えばSREがメインで行う作業(Infrastructure as a Code化やコンテナ化)を開発チームと一緒にモブプログラミングを始めてみてはいかがでしょうか。

## おわりに

~~計画的に記事は書かないと時間ギリギリになる~~ ではなく、SREはやることが多いです。これを一人でやろうとするととてつもないスーパーマンが生まれます。それでもいいですが、ゼネラリストが揃った **One Team** でもいいのではないでしょうか。そのためには、モブプログラミングやペアプログラミングがとても有効だと私は考えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84493/700cb86b-91ab-4521-046d-42a97265b4e4.png)
Rubyのクラスについて その1


RubyのClassについて無知だったので調べた。

例としてUserクラスを作成

## Userクラス

まずは簡単なUserクラスを作成する。

```ruby

class User
  attr_accessor :name, :age
  
  @@counter = 0

  def initialize(name, age, admin)
    @name = name
    @age = age
    @admin = admin
  end
  
  def self.increment
    @@counter += 1
  end

  def self.get_counter
    @@counter
  end
  
  def adult
    @age >= 20
  end
end

```
クラスからインスタンスを作成して使ってみる。

```ruby

user = User.new("tanaka", 19, true)

p user.name
p user.age
user.name = "yamada"
p user.name

p user.adult

p User.get_counter
User.increment
p User.get_counter

```

実行結果

```
"tanaka"
19
"yamada"
false
0
1
```
ここからはクラスの中身について説明する。

### attr_accessor

外部からインスタンス変数を参照と書き込みを行うことができるようにする。インスタンス変数の説明については後ほど。
上記の例では`attr_accessor`で指定した`user`と`age`は外部から参照と書き換えを行うことができる。`attr_accessor`で指定していない、`admin`は`user.admin`で参照することができない。

```
attr_accessor :name, :age
```

参照と書き込みのみを行うためのaccessorも存在する。

#### attr_reader
インスタンス変数の読み出し専用アクセサを定義することができる。

#### attr_writer
インスタンス変数の書き込み専用アクセサを定義することができる。

### クラス変数
クラスの中で値を保存しておくために利用される。変数名は`@@`から始める。
`Userクラス`でのクラス変数は`@@counter`の1つ。

### インスタンス変数
インスタンスの中で値を保存しておくための利用される。オブジェクト毎に固有のものとなる。変数名は`@`から始める。
`Userクラス`でのインスタンス変数は`@user`、`@age`、`@admin`の3つ。

### initializeメソッド
作成するインスタンスに初期値を設定するためのメソッド。`new`メソッドによってインスタンスが作成される時点で呼び出される。`new`メソッドのメソッドの引数が、`initialize`メソッドの引数として渡される。

上記の例以外に以下のような書き方もできる。

```ruby
def initialize(params)
  @name = params[:name]
  @age = params[:age]
  @admin = params[:admin]
end
```
`new`でのパラメータの渡し方が変わってくる。

```ruby
user = User.new(name: "tanaka", age: 19, admin: true)
```

### クラスメソッド
クラス自身が使えるものであり、クラスで共通の情報を持った処理に使う。上記の例では以下の2つがクラスメソッド。
メソッド名は`self.`から始める。


```ruby
@@counter = 0

def self.increment
　@@counter += 1
end

def self.get_counter
　@@counter
end
```

利用例

```ruby
p User.get_counter
User.increment
p User.get_counter
```
実行結果

```
0
1
```

### インスタンスメソッド
作成したインスタンスに対して利用するメソッド。上記の例では以下がインスタンスメソッド。

```ruby
def adult
　@age >= 20
end
```

利用例

```ruby
p user.age
p user.adult
```

実行結果

```
18
false
```

簡単にまとめたみた。クラスメソッド、インスタンスメソッドあたりでわからないことが多いので追加で調べてみる。
EC-CUBE4の管理画面からtwigで実装できる商品詳細の機能カスタマイズ

## はじめに

EC-CUBE4の管理画面からは、フロント画面のテンプレートファイル(twig)を編集することができます。twigだけでも条件判断や計算ができるので、管理画面からtwigを編集するだけでどんなカスタマイズができるか考えてみました。

#### この記事を書いた環境
EC-CUBE 4.0.3

#### 管理画面からのテンプレートの編集方法
この記事ではすべて「商品詳細ページ」のカスタマイズのサンプルになっています。
管理画面 > コンテンツ管理 > ページ管理 > **商品詳細ページ** からtwigテンプレートの編集ができます。

#### このサンプルの制限事項
「1.」「2.」のカスタマイズは、規格なし商品のみのサンプルです。規格あり商品で同じことを実現する場合は、複数規格を考慮した実装が必要になります。(今回はサンプルを作る時間が無かった...)

## 1. 商品の在庫数が5個以下のときにお知らせを表示する

商品の在庫数を取得して、5個以下の場合はお知らせと在庫数を表示してみます。

#### 変更後の表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113212/442b86bf-ea45-e359-e46e-43c7413dd09e.png)

#### 実装コード

```twig:商品詳細ページ(Product/detail.twig)
{% if Product.StockMax <= 5 %}
  <div class="ec-color-red ec-font-size-3">(在庫僅か：残り{{Product.StockMax}}個)</div>
{% endif %}
```

1行目：在庫数(Product.StockMax)を取得して、5個以下かどうかを判定しています。
2行目：判定に利用した`Product.StockMax`を使って、残りの在庫数を表示しています。

※ソースコードの[差分はこちら](https://www.diffchecker.com/eFUSBemy)

#### ポイント
- 在庫はStockMaxで取得できる。
- 表示で利用しているclass(ec-color-redなど)は[EC-CUBE 4 Style Guide](https://eccube4-styleguide.herokuapp.com/#/section/1)であらかじめ用意されている.

## 2. 商品の割引率を表示する
商品には「通常価格」と「販売価格」を設定することができます。
２つの価格から販売価格の割引率を計算して表示してみます。

#### 変更後の表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113212/e0b57f75-9f1d-712f-ba13-45bfa323b7ef.png)

#### 実装コード

```twig:商品詳細ページ(Product/detail.twig)
{% if Product.getPrice01Max is not null %}
  {% set discountRate = (1.0 - (Product.getPrice02Min / Product.getPrice01Min)) * 100 %}
  <div class="ec-color-red ec-font-size-3">(通常価格より {{discountRate|round}}% 割引)</div>
{% endif %}
```

1行目：通常価格(Price01Min)が入力されていない場合を想定しています。
2行目：Productから通常価格(Price01Min)と販売価格(Price02Min)を取得して割引率を計算し、変数`discountRate`に設定します。
3行目：`discountRate`を利用して割引率を表示しています。このとき[twigのroundフィルター](https://twig.symfony.com/doc/3.x/filters/round.html)を利用して、小数点以下を表示しないようにしています。

※ソースコードの[差分はこちら](https://www.diffchecker.com/paVZ2ore)

#### ポイント
- EC-CUBEでは「通常価格=Price01」「販売価格=Price02」。
- twigのフィルターを利用して値の表示方法を変更できる。(参考：[twigドキュメント](https://twig.symfony.com/doc/3.x/))


## 3. 会員ログイン時のみメッセージを表示する
会員ログイン状態を取得して、ログインしているときのみ会員向けのメッセージを表示してみます。

#### 変更後の表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113212/f65d92ca-66cd-698d-a3ee-4f26c80456da.png)

#### 実装コード

```twig:商品詳細ページ(Product/detail.twig)
{% if is_granted('ROLE_USER') %}
    <div class="ec-color-red ec-font-size-2">
        {{ app.user.name01 }}様いつもご利用ありがとうございます。<br>
        会員のみなさまにお試しセットをプレゼントしています！
    </div>
{% endif %}
```
1行目：会員のログイン状態を取得して判定しています。
3行目：ログイン状態だったときに表示するメッセージで、`app.user.name01`から会員の名前(姓)を取得して利用しています。

※ソースコードの[差分はこちら](https://www.diffchecker.com/LdTj5jij)

#### ポイント
- 会員がログイン状態かどうかは`is_granted('ROLE_USER')`で判定できる。
- `app.user`からログインしている会員の情報を取得できる。

## おわりに
テンプレートファイルの編集だけでできる簡単なカスタマイズをご紹介しました。
今回は商品詳細ページのみでしたが、他のページにも応用してカスタマイズしてみて下さい。
計算力学技術者（熱流体）2級の資格試験受けてきた その１

2019-12-07 受けてきた。 ~~結果は未定~~ 合格してた。

計算力学のQiita記事は初かもしれない。
どマイナー資格

[その２](https://qiita.com/iowanman/items/a3bee173e08603aefc10) 試験内容直結

#計算力学技術者の資格認定とは？(2級 熱流体）

日本機械学会が主催しているCAE関連の試験

以下は[日本機械学会のページ](https://www.jsme.or.jp/cee/about)からコピペ

>認定技術レベル
基本的な流体力学，熱力学（伝熱学を含む）の問題に対して,単相の非圧縮性流／圧縮性流／層流／乱流の範囲において正しく解析問題を設定することができ,解析方法の内容を理解しており,さらに解析結果の信頼性を自分自身で検証することができる.よって，いずれかの信頼おけるCAEソフトウエアを用いて適切な解析機能を選択しながら,基本的な熱流体問題を大きな誤りなく解けるものと期待できる.

>受験資格の目安
機械系大卒レベルの数学的，力学的知識を有し，1年以上の解析実務経験を有する技術者.

そもそもこんな情報をググって来る人は何らかのCAEの技術者だと思うので、詳しくは割愛
何らかのCFDソフトを使うことに関わっている人で、会社から言われて受験とか、仕事の単価アップのために必要とか、取ったら時給が上がるとかのために受験する人ばかりでしょ？

##受験資格
この資格を受験するためには生意気なことに受験資格を満たす必要があります。

大学等で計算力学の単位を取っていたり、機械学会の講習を受けたり、CAEベンダーの認定講習を受けなければなりません。
もしくは、CAE経験を証明する書類を作成しなければなりません。詳しくは[このへん](https://www.jsme.or.jp/cee/examinee/outline)の案内のPDFを見てください。

地味に受験資格を満たすのが大変です。
CAEベンダー講習は10万近くするし。一番安いのは機械学会の講習に出ることですかね？
ちなみに私は会社負担のベンダー講習です。


##試験の申し込み・試験日
###申し込み
**コロナ禍なので、2021年度の試験はCBTとなりました。**

以下はコロナ禍以前の内容です。コロナ禍が過ぎれば有効になるかもしれません。

申込期間は、例年8月1日～8月16日という**お盆休暇の時期と丸かぶり**する鬼畜日程なので、私の予想では受験申し込み忘れによる不合格率が2割は居ると勝手に思っています。

申し込みはネットから出来るのですが、~~今どきの資格試験ではあり得ないことですが、**試験料のカード払いができません**。~~(2020/08/15現在 カード払いができるようにするらしい)

~~社壊人にとっては、街の大きな休日まで営業してくれる郵便局に行くか有給で平日に郵便局等に行くかして、振込用紙を書いて支払う必要があります。独身社壊人にとってはめっちゃめんどい。~~

受験時に標準問題集を同時に買うことができるのですが、買わないっていう選択肢は無いので買いましょう。
もしくは先輩から貰いましょう。
年度ごとに新版を出してるのですが、中身はそっくりそのままほぼ同じです*（もちろん正誤表もたいてい同じです）*

###試験日
**2021年度はCBTで平日に行うようになりました。**

以下コロナ禍以前の内容です。

例年、12月最初の**土曜日**に行われるようです。これも**鬼畜**です。
私の知る限り、ほぼすべての公的資格の試験は日曜に行われるので、この点でも曜日・日時の誤認によって不合格率が1％は増えてると思います。
また私の元弊社では日曜以外は休みが無かったので、仕事を調整して休む必要があります。これも**鬼畜**です。

###標準問題集
公式が出してる標準問題集なしでこの資格を突破するのは凡人には至難の業だと思うのですが、
8月の申し込み後の**10月頭に発送してくれる**ので、**実質2ヶ月**しか勉強期間がありません。
日本機械学会は受験者を合格させる気があるのか大いに疑問です。


#勉強時間とか自己紹介
##受験時の筆者のスペック
###経歴
工業等専門学校 機械科卒業   流力・熱力
大学 工業系 編入・卒業     
大学院 工業系 修了 修論と全く関係ないサブでCFDのことをいろいろやった
会社 某プラントみたいな土方みたいな会社の現場職

###関連しそうな資格（受験時）
・基本情報処理技術者
もともとパソコンヲタクだったこともあるのですが、コンピューターの基礎はノー勉余裕でした。
・LPIC Level1
基本情報ではあまり求められないネットワーク知識もノー勉余裕でした。
計算サーバーに対してログインしてコマンドを打たなくても、イマドキなソフトは対応してくれてるみたいですが。

・エネルギー管理士（熱分野）
エネルギー管理士の試験には流力や熱力が含まれており、その難易度は計算力学試験よりはるかに難しい問題が出題される。
（ただし、受験後まで覚えているかは不明）


というわけで、シミュレーションという括りでいうと、物体の運動方程式(F=ma)のシミュレーションプログラムは自力で書ける。
パソコンヲタク。ネットオタク。

大学でサブでやってたCFDで、プリ計算ポストまで一通り全部一人でやれる。むしろヲタクである僕でなかったら出来てなかった。
夏の合宿的なやつで、CFDの基礎の講習は受けたことがある（あんまり覚えてないけどゴーストは鍛えられた）

流力・熱力も数値計算の基礎も、ある程度の数学力もそもそも揃ってる。

##勉強時間
10月に標準問題集が来てから試験日まで、
平均一日1時間以下くらい。
そもそも、そこそこの基礎があるから。

ベルヌーイの法則とかPV=RTも知らん数値計算もわからんパソコンの知識もない、微積分もわからんとなると、かなり真剣に勉強しないと無理だと思われます。


#勉強法

ひたすら標準問題集。
一周目はめっちゃ苦痛やけど標準問題集
一周目は問題を解いてる時間よりも、後ろの解説を読んでる時間の方が長いです。
初日はひたすらググってた気もする。
資格試験勉強とはそういうものです。
わからない単語はぐぐる。

標準問題集の後ろの解説から、問われそうな問題を類推する。
問題集を回すと、その問題の答えとその理由だけを覚えてしまうので、できるだけ、問題を拡大させましょう。
例えば、選択肢を全部隠して記述式にするとか。


#試験を実際に受けた感想
標準問題集のコピペ問題も多数でてた。
いくつか、題意すら理解不能な問題や、選択肢が全部間違ってるとしか思えない正解を選べ問題とかがあったけど、
ほとんど標準問題集のコピペ
倫理なんて、まじコピペ