OmniAICreator/Qiita-1.07M huggingface dataset:
【簡単に変更履歴を管理】AWS Config導入事例５選【導入事例から学ぶ】

以前お伝えした運用改善系のサービスの一つAWS configで何ができるのかを調べてみました。
[AWS運用改善サービスランキング【AWS Management Governance】](https://qiita.com/toma_shohei/items/a5feb73435ca20e8787d)


## はじめに
AWSを運用していると
「この設定、いつ誰が何のために入れたんだろう」
という悩みを持ったことはないでしょうか？
私はインフラエンジニアを10年近く経験していますが、結構ありますね。
※細かい権限を設定されているが、謎にAdministrator権限が追加されているIAMなど。。

AWS Configはこの悩みを解決してくれる機能を持っていて、導入も簡単に行えます。
（「何のために」は推測するしかないですが、、）
それだけでなく、色々な活用方法があったのでそれを紹介していきます。


## AWS Config 導入
### 導入手順
下記のサーバーワークスの動画を見ると分かりやすいと思います。
ハンズオン形式で設定項目をみることができます。
導入は簡単ですね。

[【はじめてのAWS #09】 AWS Config を設定してみよう](https://www.youtube.com/watch?v=dscjIkqinwU)


### AWS Configの設定
下記４つの設定項目があります。
必須の設定はリソースタイプ指定とS3です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/3674ac7c-db79-7b35-0800-294912d0c26b.png)


### AWS Configの料金

従量課金のため、使ってみないとどの程度の料金になるか分かりません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/0ebb798d-48b3-a7c8-49ce-ec50f0e57bf3.png)

[公式ページ：AWS Config の料金](https://aws.amazon.com/jp/config/pricing/)

Config Ruleの課金体系の理解は下記の記事を見ると分かりやすいかと思います。
[Config Rulesが激安になるのでみんな使ったほうが良いRuleを紹介します！]（https://dev.classmethod.jp/articles/recommend-config-rules-for-all-user/）

## AWS Config導入事例
### Preziのケーススタディ(2016年)
https://aws.amazon.com/jp/solutions/case-studies/prezi/

リソース構成の変更追跡と変更管理のルールに使用した事例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/163b62a1-3491-1d8c-bae4-48cc0e77206c.png)



### FanDuelケーススタディ（2014年）
https://aws.amazon.com/jp/solutions/case-studies/fanduel/

AWSのマネージドサービスにAWS Configを利用した事例です。
マネージドサービスでも使えるんですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/529e940c-18ea-e248-bf9f-269c6a8861dd.png)

調べてみたらマネージドサービスでもかなり使えるようになっています。
[参考：サポートされているリソースタイプ](https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/resource-config-reference.html)

### 100を超えるAWSアカウント運用におけるガードレール構築事例
https://engineering.visional.inc/blog/171/awssummit_securityguardrail/

これまでのセキュリティはゲート（チェックリストなどで厳しく管理）という考え方でした。
アジリティを維持してガバナンスコントロールを実現するために新しくガードレールという考え方が生まれています。
AWS Configを利用することでルール外の動作を自動検知する運用がガードレールになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/3661a458-fc24-8cbb-0d0b-e5cd1b01a0e4.png)

隠れて守らないこともできるゲートより、ガードレールの方が理想に見えます。

### セキュリティで加速するクラウドジャーニー
https://pages.awscloud.com/rs/112-TZM-766/images/C1-04.pdf

事例ではないですが、一般的なCloudConfigを使う例となります。
AWS Configは発見的コントロールに分類されたセキュリティ対策製品になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/af00b9f5-88a5-9718-d0b1-33ce9e9db80b.png)


### AWSセキュリティ導入パック（CloudShift）
https://cloudshift.stylez.co.jp/aws-security-pack/

こちらも事例ではないですが、AWSのセキュリティ対策をパッケージ化したサービスなので、
参考になると思います。
AWS Configは設定変更履歴管理とルール準拠状況確認の役割をはたしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311339/61a0b5bc-cae3-9050-6690-d42a8ef44676.png)

## さいごに
事例をみても変更履歴管理と想定外設定の発見（Config Rule）という２つの役割を果たすサービスであることが分かりました。
ルールをどうするかの検討はありますが、導入が簡単なため、まずは有効化してみるのはありかなと思います。
最終的にはガードレールの考え方を適用していきたいと思います。
Vue.js単体テストで複数のコンポーネントを扱う

単体テストで、親子揃って初めて機能するコンポーネントをテストする際などに子をマウントする方法です。

以下のような場合、親をマウントして子をコンポーネントとして登録します。

```vuejs:index.vue
<template>
  <tabs>
    <tab>タブ 1</tab>
    <tab>タブ 2</tab>
    <tab>タブ 3</tab>
  </tabs>
</template>
```

```javascript:__tests__/index.spec.js
import { mount } from '@vue/test-utils';
import Tabs from '../index.vue';
import Tab from '../../Tab/index.vue';

describe('Tabs', () => {
  const wrapper = mount(Tabs, {
    slots: {
      default: [
        '<tab>タブ 1</tab>',
        '<tab>タブ 2</tab>`',
        '<tab>タブ 3</tab>',
      ]
    },
    components: {
      tab
    }
  });
});

```

普通に`<script>`内に書くように`components`で登録すれば良いようです。
`components`はマウンティングオプションに記載がありませんでした。
https://vue-test-utils.vuejs.org/ja/api/options.html
Ubuntu18.04LTSでCD/DVDにファイルを書き込む

故あってLinux Mintを試したくなったので、公式からisoファイルをダウンロードして、DVDに書き込むことにした。

[ファイル(nautilus)]でダウンロードしたisoファイルを選んで右クリック・・・

![qiita_20201112_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/afb05218-3d44-7c96-bda8-fbc5d899b276.png)

・・・あら、Win10のような「書き込み」メニューは無いのね。

んでも、[別のアプリケーションで開く]から[ディスクイメージライター]なるものがあったので、コレで行けそう。

![qiita_20201112_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/6e1eb73a-fd16-9157-02af-4e6f0a00bdca.png)

ところが空のDVD-Rを入れて認識しても、転送先にCD/DVDドライブを選ぶことができず・・・なんでやねん。

## isoファイル書き込み
従来であればddコマンドを駆使して頑張るのだろうが、UbuntuだってGUIは充実してるんだし、ここはアプリで実現することに。

ということで[Ubuntuソフトウェア]から**「brasero」**をインストール。起動すると以下のウインドウが表示された。

![qiita_20201112_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/7d33705e-c667-3f65-6df6-82e3daa1a491.png)

今回はisoファイルを書き込みたいので、「イメージの書き込み」を選択。

![qiita_20201112_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/01a6ea7e-d8a3-31b5-163f-7118b8924f77.png)

[書き込むディスクイメージ]にはisoファイルを、[書き込み先のディスクの選択]はドライブに空きDVD-Rを入れると自動的に認識したので、[書き込み]をクリック。すると書き込みが始まり・・・

![qiita_20201112_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/6f23e905-115c-bf9a-2148-75fa565813ec.png)

しばし後、無事、書き込みが完了。中身もちゃんと見れた。

![qiita_20201112_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/5f03c3cf-391f-a35e-6314-ea1d112c3d3c.png)

## データディスクの作成
「brasero」はisoファイルだけでなく、個別にファイルを書き込むことも出来る。

![qiita_20201112_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/e03116d1-8daa-ce2d-602c-2e5cf3d0b514.png)

ファイルの選択は追加ボタンからだけではなく、GUIらしく[ファイル]アプリ(nautilus)からドラッグ＆ドロップでも可能。ちゃんと(？)出来るもんですな。

## 雑感
-　DVDはisoファイルだけでなく、数多ある写真をバックアップするときなんかでも出番あるし、braseroにはディスクコピー機能もあるしと、CD/DVD周りもLinux(ubuntu)でも十分やっていけると感じた
-　ググったときに[ココ](https://sicklylife.jp/ubuntu/1804/help/files-disc-write.html)が筆頭に出てきたのだが、全く参考にならなかった。CD/DVDクリエーターって何もんなんだろ？
AWS EC2にdockerをインストールする

# はじめに
AWS EC2にdockerをインストールする手順です。

# インストール手順
  - Amazon Linux 2
 
```sh:ターミナル
# yumのアップデート
sudo yum update -y

# dockerのインストール
sudo amazon-linux-extras install docker -y

# dockerの起動
sudo service docker start

# ec2-userのセカンダリグループにdockerを追加する
# ※これによりsudoを利用せずとも、dockerコマンドが利用できるようになる
sudo usermod -a -G docker ec2-user

# 一度、ターミナルを再接続する

# インストールの確認
docker info
```
GASでChatworkのBotを作ろう！（ローカル開発編）

初めまして
今回は、GoogleAppScriptを使いつつ、スプレッドシートを編集するだけで、定期的にChatWorkにタスクを投げるといったものを作っていきたいと思います。

## 技術的仕様
- Node 15.1.0
- Clasp 2.3.0
- Webpack 4.44.2


##　スプレッドシートのスクリプトエディタは使いにくい

ブラウザでコードを書いていっても良いのですが、やはりシンタックスも効かないし、普段使っているエディタでコードを書きたいですよね。
GASをローカル開発環境に落とし込むライブラリ「[Clasp](https://www.npmjs.com/package/@google/clasp)」があったのでそれを使っていきます。

Claspのインストール方法や使い方は下記記事が参考になりました
>[GAS のGoogle謹製CLIツール clasp](https://qiita.com/HeRo/items/4e65dcc82783b2766c03)

また、jsの最新記法も気兼ねなく使いたかったので、Webpack+Babelを使用することにしました。
本当は、有志が作成したdate処理のライブラリやchatworkのライブラリを使用したかったのですが、gasで実行すると、エラー多発だったので、ライブラリを使用することは諦めて、gasに準拠したライブラリのみ使用することにしました。

Webpackは4系を使いました。gasが5系にまだ対応していないみたいなので、4系にダウングレードしたらうまく実行してくれました。

webpackの構成ファイルを載せておきます。

~~~js:Webpack.config.js
const path = require('path')
const GasPlugin = require('gas-webpack-plugin')

module.exports = {
    mode: "development",
    devtool: false,
    entry: {
        app: './src/index.js'
    },
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: '[name].js'
    },
  
    module: {
      rules: [
        {
          // 拡張子 .js の場合
          test: /\.js$/,
          exclude: /node_modules/,
          use: [
            {
              // Babel を利用する
              loader: "babel-loader",
              // Babel のオプションを指定する
              options: {
                babelrc: false,
                presets: [[
                  // プリセットを指定することで、ES2020 を ES5 に変換
                  "@babel/preset-env", {
                    modules: false,
                    useBuiltIns: 'entry',
                    corejs: 3
                  }
                ]],
                plugins: [
                  ['@babel/plugin-transform-runtime', { 'corejs': 3 }]
                ],
              }
            }
          ]
        }
      ]
    },
    resolve: {
        extensions: ['.js']
    },
    plugins: [new GasPlugin({
      comment: false
    })]
  }
~~~

おそらく、余計な設定が多く入っていますが、これで動きました。

## 実際の製作物について

下図のようなスプレッドシートを作成します。

| スイッチ | ルームID | タスク実行人 | タスク内容 | 期限 | タスクを投げる日 |
|:-------:|:--------:|:----------:|:-------:| :-------:|:---:|
| ボタン    | Text  | Text | Text | text | text |

スイッチがtrueの行のみ、処理を実行します。

ChatWorkの下記エンドポイントにHTTPリクエストを投げます。

"https://api.chatwork.com/v2/rooms/{ルームID}/tasks?body={タスク内容}&limit={期限}&limit_type=date&to_ids={タスク実行人}"

gasでは、

~~~js
UrlFetchApp.fetch(endpoint, data)
~~~

でAPIにリクエストを投げられます。

endpointを設定します。

~~~js
let endpoint = https://api.chatwork.com/v2/rooms/{ルームID}/tasks
~~~

ルームIDの部分は、タスクを投げたいルームのIDです。
Chatwork公式ヘルプのルームIDの確認方法を参考にしました。
> [ルームIDを確認する](https://help.chatwork.com/hc/ja/articles/360000142942-%E3%83%AB%E3%83%BC%E3%83%A0ID%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B)

そして、下記オブジェクトを作成します。

~~~js
let data = {
 method: 'post',
 header: { 'X-ChatWorkToken': ENV.CHATWORK_API_TOKEN },
 payload: {
  'body': {タスク内容},
  'limit': {期限},
  'limit_type': 'date',
  'to_ids': {タスク実行人}
 }
}
~~~

タスク内容
期限
タスク実行人
はそれぞれ、スプレッドシートから取得します。

期限は、UNIX時間を秒表記に直します。
タスク実行人は、実行者のChatworkアカウントのユーザーidを入力します。

これでURLFetchすれば、chatworkにタスクが出現！
無事完成です。
あとは、トリガーの設定やらがありますが、続きは次回！

※こちらの記事は、追ってより詳しく再編集いたします。
JUnit単体テストの前処理と後処理の順番

# はじめに
単体テストを実装する間が空くたびに、コンストラクタ、テストクラス前処理とテストクラス後処理、テストメソッド前処理、テストメソッド後処理の順番を忘れるので個人参照用に残しておく。

# 環境
- JREシステム・ライブラリー[JavaSE-11]
- JUnit 4.13

# テスト対象
- コンストラクタ
- テストクラス（@BeforeClass, @AfterClass）
- テストメソッド（@Before, @After）

# テストサンプル
![スクリーンショット 2020-11-12 9.15.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189557/d9ba609b-d8f2-a85f-066b-f179d757a25b.png)

# 結果
![スクリーンショット 2020-11-12 9.15.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189557/874f3af1-ecd9-550f-11f5-51a4397e2cf4.png)

やってみるとあたりまえの結果ではあったが、とりあえず単体テスト実装時の「あれ…順番どうだったたけ？」が減りそうなのでメモとして残しておく。
boostnoteでローカルストレージのリンクどう張るの

# 初めに
markdownを使ってメモを取るソフトは様々ありますがその中でboostnoteは日本の会社が開発していることもあって贔屓にしています。
非常にシンプルなuiで動作も軽快なので気に入って使っているのですが、ローカルストレージにある写真を貼ったり、ディレクトリ等のリンクを載せたいときに苦労していました。調べてみても出てこないので備忘録として残しておきます。
# 環境
- version: 0.16.1
- Electron: 4.2.12
- Chrome: 69.0.3497.128
- Node.js: 10.11.0
- V8: 6.9.427.31-electron.0
- OS: Windows_NT x64 10.0.19041

# 方法
基本的にマークダウンのリンクの書き方ではローカルストレージのリンクを張ることはできませんでした。
そこでhtmlのタグを用いてリンクを貼ります。
C:\Users\User\Pictures\a.pngにある写真を貼りたい際には以下のように書きます
```<img src="\\C:\Users\User\Pictures\a.png" alt="aaa">```
C:\Users\User\Picturesにリンクを張りたい際には以下のように書きます。
```<a href="\\C:\Users\User\Pictures">リンク</a>```
git githubに挙げるまで　個人開発

1「git init」でgitを立ち上げ
2「git add -A」
3「git commit」
4「git remote add origin https://~~~~」
4.5「git branch -M リモートブランチ名(main)」こいつが必要！！！

5 「git push -u origin リモートブランチ名(main)」 

ファイル変更
↓
ステージングエリア
↓
ローカルリポジトリ
↓
リモートリポジトリ

4.5のブランチとは？
https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A8%E3%81%AF


##git addで特定のファイルだけaddする

```powershell
git add ~~~
git add main.js
...etc
```
>https://26gram.com/git-add

## 途中から始める時
1.masterブランチにチェックアウトしてgit fetch
違う所を確認

### 確認方法

```sh
git diff origin/~~~
```


2.git merge origin/develop
masterにマージする


####behindがあったとき
今いるローカルブランチでリモートリポジトリをmergeする

```sh
git merge origin/develop
```
それからpushして再度MRを出す
自サイトを Gatsby + Gatsby Cloud で置き換えようと思った話

# はじめに

自サイトの構成が古く（生PHPによるお手製CMS！）なってきたので、新しい技術で置き換えようと思いました。

いろいろ調べてみると、`Next.js`か`Gatsby`というフレームワークが良さそうだったので、こちらはGatsbyを試してみた記事です。

Next.jsについて試してみた記事はこちらです。
https://qiita.com/naga3/items/1aaa8d58bf0e4bfa27b6

## Gatsby ＆ Gatsby Cloudについて

Next.jsは動的コンテンツと静的コンテンツの両方に対応していましたが、Gatsbyは静的コンテンツのみの対応みたいです。

Gatsby CloudでGatsbyで作成されたコンテンツのホスティングができます。

Gatsby Cloudは無料プランと有料プランがありますが、個人が普通に使うぶんには無料プランで十分そうです。
https://www.gatsbyjs.com/pricing/

Gatsby CloudはVercelとは違い、**独自ドメインが使えません**。他のホスティングサービスとの連携が容易にできるので、VercelやNetlifyなどと接続して独自ドメインを使うスタンスのようです。

また、Gatsby CloudではWordPressなどのCMSをデータソースとして接続できます。最近WordPressはAPI対応になったので、フロントとして使う感じでしょうか。

# Gatsby Cloudプロジェクト作成

アカウントがなければサインアップしておきましょう。
https://www.gatsbyjs.com/dashboard/signup/

まず、ダッシュボードから`Add a site`を押します。

既存のリポジトリを使う`Import from a Git repository`と、テンプレートから作成する`Start from a Template`がありますが、今回はゼロから作るので`Start from a Template`を選びます。

Starterは`Blog`を選びます。

次にリポジトリを選ぶのですが、GitHubに`Gatsby Cloud`をインストールするか聞かれるのでインストールします。その後リポジトリ名を聞かれるので適当に付けます。

しばらくするとビルドが完了してサイトを見ることができるようになります。

# ローカルでの開発

ここからはローカルでの開発になります。`node`や`yarn`はインストールしておきます。

上で作成したリポジトリをcloneして、

```sh
yarn install
yarn develop
```

を実行するとサーバーが立ち上がって、`http://localhost:8000`で確認することができます。

予め3ページ作られているようです。

![Screenshot from 2020-11-12 08-49-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32030/a8ec6dd4-615e-2569-700f-e57d8c7f5316.png)

## ページの編集

ページの編集はMarkdownファイルで簡単にできるようです。

`content/blog/new-beginnings/index.md`を編集してみます。

```md:new-beginnings/index.md
---
title: こんにちは
date: "2015-05-28T22:40:32.169Z"
description: ページの説明です。
---

こんにちは最初のページです。
```

保存するとリアルタイムで当該ページ・トップページ両方に変更が反映されました。

http://localhost:8000/new-beginnings/
![Screenshot from 2020-11-12 08-56-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32030/aa730400-189e-b8ae-5327-21c43dc28ac7.png)

http://localhost:8000
![Screenshot from 2020-11-12 08-55-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32030/a3ba7c21-96a5-c999-5b9f-03e2bfe1dc91.png)

ページの追加は、`/content/blog`ディレクトリに、そのままMarkdownファイルを置けば良さそうです。

```md:content/blog/page2.md
---
title: あはああああああ
---

うほおおおおおおお
```

![Screenshot from 2020-11-12 09-07-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32030/a9c78b62-5a7b-aaa4-0e9d-ae6c73ba8f9f.png)

## ローカルからのデプロイ

そのままmasterにpushすれば本番に反映されます。
【初学者/自分用】未経験者が学ぶべきSwift基礎

#はじめに
未経験の方は、エンジニアを目指すには何を学習すればいいのかわからない。
そのため、ロードマップが必要だと考えました。

https://qiita.com/Sossiii/items/e2c846d12f2f5db7c426
こちらの記事を参考にさせていただき、基礎から着実に学んでいこうと思います。

基礎の学習は、「レベル5：独学はもう効率悪いから今すぐ実務に入ろう」に到達した時点で実務を推奨されているので、この記事ではレベル５までの内容を記述していくことにします。
(※もちろん技術力が高い方が、未経験者の就職・転職はしやすいと思います。あくまで参考記事を目安します。)

最後にも述べますが、基礎を学び続けるよりもポートフォリオを作った方がインプット、アウトプット、就活・転職を効率よくできると思うので、一通り学んだらすぐにでもポートフォリオ作成に移ってしまいましょう！


※量が多かったので、見やすさを重視するために分散させました。🙇‍♂️
レベルごとにURLを飛んでいただくと、閲覧可能です。

それでは早速見ていきます

#レベル1：実務は厳しい
https://qiita.com/Nekosennshi/items/9dcb4a0dcb7323577153

・演算(+, -, *, /, %)
・インスタンスとは
・プロパティとは
・メソッドとは
・比較演算子(==, !=)
・変数 var
・定数 let
・エスケープ処理「\()」
・if文
・switch文
・for文
・構造体：struct
・関数 func
・型キャスト

#レベル2：数打てばどこか入れるかも
※作成段階です。🙇‍♂️

・型推論
・オプショナルがわかる
・if let
・オプショナルチェーン
・画像が使える
・storyboard/コーディングによる描画
　View、TableView、CollectionView、Switch、SegmentedControl
　TableViewとCollectionViewでのカスタムセルによる実装、
　その他もろもろのパーツ
・画面遷移(segue, navigationController,等)
・参照渡し, 値渡し
・アラート UIAlertController,UIAlertAction
・SVProgressHUDを適切なタイミングで使える
・NavigationControllerが使える

#レベル3：数打てばどこか入れるかも
※作成段階です。🙇‍♂️

・UIView.animateでアニメーションが実装できる
　-> ライフサイクルを意識できると良い
　　　これができるとUIに磨きがかかるので選考でウケがいい
・セルの再利用がわかり、適切に動作させることができる
　-> 再利用を理解せず(特に初期化)、副作用が起きがち
・selfをつける時、要らない時がわかる

#レベル4：入れる確率上昇中
※作成段階です。🙇‍♂️

・非同期処理(WebAPIを利用)->DispatchQueueやクロージャを使う
　(クロージャはここで使えれば良さそう)
・ライブラリ(Cocoapodsで外部ファイルをインストールして使う)
　Charts、FSCalendar、SwiftyJSON、とかで良さそう
・Delegateが実用できる
・NotificationCenterが使える
・Githubが使える
・SourceTreeが使える

#レベル5：独学はもう効率悪いから今すぐ実務に入ろう
※作成段階です。🙇‍♂️

・Firestore、RealmSwiftを使える
　サーバー上に保存した情報をローカルDBに入れることで、
　何回もFirestoreからデータを引っ張らなくても良い(通信が減る)
　RealmSwiftはメモリ上に保存するのでタスクキルでデータは消え、肥大しない
・チャットが実装できる
　ライブラリ-> MessageKit
・ある程度のUIが設計できる
  Pinterestでググれ

#終わりに
お疲れ様でした！いかがだったでしょうか？

私は覚えること多いな〜と思いながら、この記事を書いていました笑
ですが、記事を書いていると、すごく理解して覚えることができました。

仕事で技術職のエンジニアを目指すなら、技術力なんて最低限は必須ですよね。
皆さんもインプットだけではなく、アウトプットをしながら学習することをおすすめします。

筆者も初学者ですので、未経験からエンジニアになるための人助けに少しでもなればいいと思い書きました。
少しでも参考になれば幸いです。☺️

下の『ストック』や『LGTM』をお忘れずに👇👇👇それでは
レッツノートのリカバリーUSBメモリ作成方法（ダウンロード版）

Let's Noteはエンジニアの利用者が多いと思ったので書きました。
いつの間にかレッツノートがダウンロードリカバリに対応してくれていました。
（CF-SZ5～最新モデル）

## ダウンロード Windows 10 インストール用 リカバリーディスク作成ユーティリティ（ダウンロード対応版）

https://faq.askpc.panasonic.co.jp/faq/docs/004899

※ Let's noteは、製品品番の末尾が「S」の製品のみが対象となります。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/f81da7a5-e121-6253-4540-07f159e34453.png)


## USBメモリもリカバリーメディアに使える

* 16GB (空き容量15GB。NTFSフォーマット済み)のUSBメモリでも作成ができました。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/69c66798-3cee-66e6-eee9-c7a565d97104.png)
ServiceNow - スクリプトが利用されているスクリプトを検索する

#概要
スクリプトが呼び出されている他スクリプトを探すスクリプトです。
全文検索でスクリプトが利用されている可能性があるテーブルを検索する。但し、Flow DesignerやWorkflowからの呼び出されている箇所は対象外になります。

#スクリプト用テーブルの全文検索

```
var searchString = '＜検索する文字列＞';  // 例：GetUserInfo

var tableList = ['sys_script_client','sys_ui_policy','sys_ui_script','catalog_ui_policy','sys_widgets','sys_ui_page',
'sys_script','sys_script_include','sysevent_script_action','sysauto','sys_script_fix',
'sys_script_email','sys_installation_exit','sp_widget','sys_security_acl','sys_transform_script',
'sys_transform_entry','sys_ui_action','sys_ui_page','sys_ui_macro','sys_ws_definition','sys_script_validator'];

tableList.forEach(searchText);


function searchText(tableName) {
  gs.info(tableName + '*************************');
  var gr = new GlideRecord(tableName);
  gr.addQuery('IR_AND_OR_QUERY', searchString);
  gr.query();
  while (gr.next()) {
    gs.info(tableName + ':' + gr.name);
  }
}
```

#GITを利用する
ServiceNow Studioでgitを利用してソースコード管理をするとgrepでnewをしている行を検索することもできます。

#スクリプトを含むテーブル一覧
|No.|名前|テーブル名|継承|
|---|---|---|---|
|1|Client Scripts|sys_script_client|
|2|UI Policy|sys_ui_policy|
|3|UI Scripts|sys_ui_script|
|4|Catalog Client Script|catalog_script_client|Client Scripts
|5|Catalog UI Policy|catalog_ui_policy|UI Policy
|6|Widget client script|sys_widgets|
|7|UI Pages - Client script |sys_ui_page|
|8|Business rule|sys_script|
|9|Script include|sys_script_include|
|10|Script action|sysevent_script_action|
|11|Schedule job|sysauto|
|12|Fix Scripts|sys_script_fix|
|13|Workflow run script|-|
|14|Email Scripts|sys_script_email|
|15|Installation Exits|sys_installation_exit|
|16|Widget server side script|sp_widget|
|17|ACL Script|sys_security_acl|
|18|Transform map scripts|sys_transform_script|
|19|Field map scripts|sys_transform_entry|
|20|UI Actions|sys_ui_action |
|21|UI Pages - Processing script|sys_ui_page|
|22|UI Macros |sys_ui_macro |
|23|Scripted REST APIs|sys_ws_definition|
|24|Validation Scripts|sys_script_validator|
ServiceNowのThemeを増やしてみる

version: Newyork

# やること
ServiceNowのThemeを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/557dcb64-de20-e31c-3986-57ca54d457e4.png)
増やします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/b644f016-b5a0-098f-3ad2-dc62cb221499.png)
# Themeの設定を確認
久しぶりにThemeを見たら以前のVersionに比べて増えているような気がしました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/907f373b-c86a-9a77-abf9-9a09a69d847e.png)
Filter Navigatorに"theme"と入力して[Sysmte UI] - [Theme]を表示してみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/2bdf65b0-cb1e-554f-22a8-e5913ec58885.png)
System Settingに表示されているThemeと比べてみるとどうもDeviceがConcourseでActiveがtrueのものが利用されているように思えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/22f79725-83d3-1f06-7904-072ab50f2db4.png)
# Themeの追加
適当なThemeを選択して編集して別名でInsertしてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/1d68c460-3149-e35e-4408-12181a19ac83.png)
増えました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/9eda1dcf-937e-0a00-e300-26f4022183e7.png)
Activeがfalseだったものをtrueにしてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/06d5a979-0d70-c5f3-10b7-9437e7599982.png)
もっと増えました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/f0b58905-6ed0-4a79-8d13-edc711d67764.png)
Unity 2D #2 jsonファイルの読み書き

unityでjsonファイルをデータベースのように使いたいと思います。

>データの保存について

データの保存はクラス内容の保存という形で実行されます。例として、以下のクラスを考えます。

```
[System.Serializable]
public class CharacterTable{
    public List<CharacterIndividual> characters;
}

[System.Serializable]
public class CircleIndividual {
    [SerializeField] public int Id;
    [SerializeField] public string Name;
    [SerializeField] public int Width;
    [SerializeField] public int Height;
    [SerializeField]public int[] Points;
    [SerializeField]public string[] ComboType;
    [SerializeField]public float[] ComboEffect;

    public CircleIndividual(int id, string name, int width, int height, int[] points, string[] comboType, float[] comboEffect){
        this.Id = id;
        this.Name = name;
        this.Width = width;
        this.Height = height;
        this.Points = points;
        this.ComboType = comboType;
        this.ComboEffect = comboEffect;
    }
}
```

ここで、CharacterTableはCharacterIndividualをまとめているだけで不要に感じるかもしれませんが、データの保存のためには、CharacterTableのようにクラスを包含する一回り大きいクラスが必要となります。
また、詳しい説明は避けますが、[System.Serializable]も上のように書いてある必要があります。(publicである必要もある)
そのため、試したい方は注意してください。

```
string characters_path = "/Characters.json";
int Characterindex = 0;
CharacterTable characterTable = new CharacterTable();

characterTable.characters = new List<CharacterIndividual>();
AddCharacter("火の魔法使い", 100, 50, new string[] {"atkup1"}, new float[] {50});
AddCharacter("水の魔法使い", 120, 40, new string[] {"defup1", "atkup1"}, new float[] {20, 20});
AddCharacter("雷の魔法使い", 80, 60, new string[] {"defup1"}, new float[] {30});

string characters_jsonToSave = JsonUtility.ToJson(characterTable);

// Save
StreamWriter characters_writer;
characters_writer = new StreamWriter(Application.dataPath + characters_path, false);
characters_writer.Write(characters_jsonToSave);
characters_writer.Flush();
characters_writer.Close();
```

```
void AddCharacter(string name, float hp, float attack, string[] skillType, float[] skillEffect){
    // id, name, hp, attack, skillType, skillEffect
    CharacterIndividual chara = new 
    CharacterIndividual(Characterindex, name, hp, attack, skillType, skillEffect);
    characterTable.characters.Add(chara);
    Characterindex++;
}
```

上のコードのようにデータを作成し、内容を保存しました。
Application.dataPathはunityでのパスを表すもので、何も設定することなく使用可能です。上のコードだとAssetフォルダ直下にjsonファイルが保存されるはずです。
完成したjsonファイルは以下の通りです.

```
{"characters":[
  {"Id":0,"Name":"火の魔法使い","HP":100.0,"Attack":50.0,"SkillType":["atkup1"],"SkillEffect":[50.0]},
  {"Id":1,"Name":"水の魔法使い","HP":120.0,"Attack":40.0,"SkillType":["defup1","atkup1"],"SkillEffect":[20.0,20.0]},
  {"Id":2,"Name":"雷の魔法使い","HP":80.0,"Attack":60.0,"SkillType":["defup1"],"SkillEffect":[30.0]}
]}
```

>データの読み込みについて

保存したjsonファイルの中身は以下のように読み込みます。

```
StreamReader reader = new StreamReader(Application.dataPath+DataHandring.characters_path);
string JsonText = reader.ReadToEnd();
reader.Close();
CharacterTable　ReadCharacterTable = JsonUtility.FromJson<CharacterTable>(JsonText);

// ReadCharacterTable.characters[0].Name
// 火の魔法使い
```

また、c#スクリプトの上部に

```
using System;
using UnityEngine;
```

を記載するのを忘れないようにしてください。(他にも必要だったかもしれない)
RailsでPayjpを使った際の環境変数の設定方法

# 環境
macOS
Ruby 2.6.5
Rails 6.0.3.2

# 概要
RailsアプリケーションでPayjpを使用しました。
その際に環境変数の設定方法がわからなかったので備忘録として残しておこうと思います。

# 達成したいゴール
Payjpを通して環境変数の取り扱いができるようになること。

# 解決したい問題
秘密鍵や公開鍵をコードに直張りするのはセキュリティの都合上よくありません。
そのため、環境変数を用いて秘密鍵と公開鍵を取り扱ってみたいと思います。

# 環境変数
環境変数は、Railsからは ENV['<環境変数名>'] という記述でその値を利用することができます。

# ローカル環境
Catalina以降であれば、

```ターミナル:ターミナル
アプリケーション名 % vim ~/.zshrc
```
Catalina以前であれば、

```ターミナル:ターミナル
アプリケーション名 % vim ~/.bash_profile
```
ターミナルにて上記を実行。

```ターミナル:.zshrc
//まず「i」を押して入力モードにします
export PAYJP_ACCESS_KEY='sk_test_*************'
export PAYJP_PUBLIC_KEY='pk_test_*************'
// その後、escキーを押して:wqで.zshrcから抜けます

アプリケーション名 %　source ~/.zshrc
```
sourceコマンドは、ファイルに書かれたコマンドを現在のシェルで実行するというコマンドです。
主にシェルの設定ファイルを反映させる際に使用します。

環境変数を変えただけでは、railsは変更前の環境変数しか読み込みません。
そのため、アプリケーションを起動している場合には一度終了します。
そして、環境変数を修正したターミナルで再度、rails sでログインし直します。

設定した環境変数を扱うためにはコントローラーに下記のような形で記載していきます。

```ruby:creditcards_controller.rb
# クレジットカードの保存
  def create
    Payjp.api_key = ENV["PAYJP_PRIVATE_KEY"]
    if params['payjp-token'].blank?
      render :new
    else
      customer = Payjp::Customer.create(
        card: params['payjp-token'],
        metadata: {user_id: current_user.id}
      )
      @card = Creditcard.new(
        user_id: current_user.id,
        customer_id: customer.id,
        card_id: customer.default_card
      )
      if @card.save
        redirect_to root_path, notice: "クレジットカードが登録されました"
      else
        render :new, notice: "クレジットカードの登録に失敗しました"
      end
    end
```
上記の例文は、フォームに入力したクレジットカード情報をトークン化して保存するための処理です。

# 本番環境
また、ローカル環境と本番環境では、環境変数を設置するファイルが異なります。

```ターミナル:ターミナル
[ec2-user ~]$ sudo vim /etc/environment
```

```ターミナル:/etc/environment
//まず「i」を押して入力モードにします
PAYJP_ACCESS_KEY='sk_test_*************'
PAYJP_PUBLIC_KEY='pk_test_*************'
// その後、escキーを押して:wqで/etc/environmentから抜けます
exit
// 再度sshでec2にログイン
```
ローカル環境同様、環境変数を設定・修正した際にはunicornの再起動、もしくは再デプロイが必要となります。

# 終わりに
この記事が少しでもお役に立てる内容になっている幸いです。

参考：
https://wa3.i-3-i.info/word11788.html
https://qiita.com/Richelieu/items/b872dfce81124084b199#%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AB%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80
https://qiita.com/suzy1031/items/7964829086eb929471a6
メソッドについてのアウトプット　その３

##前回までのアウトプット（２４風に）😁

[メソッドについてのアウトプット　その1です](https://qiita.com/yuzo-taguti/items/356385d3fd3a5b0a0d6e"メソッドについてのアウトプットです　その１")
[メソッドについてのアウトプット　その２です](https://qiita.com/yuzo-taguti/items/0159180d9df2e4491e45"メソッドについてのアウトプット　その２です")

Rubyって面白いですね！！🙇‍♂️

##メソッドアウトプットその３行きます！！

まずは復習といたしまして、、

メソッドとは！？
僕的な解釈といたしまして、処理のかたまりと理解しています。

メソッドのメリットは
　・コードがスマートになる
　・複数の処理の視認性が上がる
　`` 今の時点ではこの認識でご容赦下さい。 ``

引数を用いる

```sample.rb
def sample(hiki, suu)
 hiki + suu
end

puts sample("引", "数")
（出力結果　=> 引数）
```
引数とは、
`def sample()`のカッコの中の
`hiki`と`suu`にそれぞれ
hikiには引、suuには数が送られています。

[新たに学んだメソッドのルール]
`命名規則というのがあります。
　1文字目は英文字かアンスコ（_）
　2文字目以降は英数文字かアンスコ（_）
 メソッドの定義は、メソッドの呼び出しの前である必要があります。これも守らないとエラーになります。
`

###処理の順番？
Rubyに於いてメソッドの処理は一番し最後に評価した値を戻してくれます。
どういうことかと言いますと、、、

```sample.rb
def sample(hiki, suu)
  hiki + hiki
  suu + suu
  hiki + suu
end

puts sample("引", "数")

=>引数　#実行結果

end
```

` hiki + hiki
  suu + suu `
なんと、この二つは無視されています。

へぇー、そうなんだぁー って感じですが

```sample.rb
def addition
  eraser = 110
  pen = 150
  "300円以上購入で割引になりますよ！" if eraser + pen <= 300
  eraser + pen
end

puts addition

実行結果=> 260
```
一番したの値を評価して、if文無視されてます。
`return`をif文の頭につけると

```sample.rb
def addition
  eraser = 110
  pen = 150
  return "300円以上購入で割引になりますよ！" if eraser + pen <= 300
  eraser + pen
end

puts addition

実行結果=> 300円以上購入で割引になりますよ！
```
returnを入れると処理を途中で抜けられるみたいです。
`※厳密に言うと多分違います。あくまでアウトプットですのでご容赦を！！`

３回にわたりメソッドのアウトプットを行いましたが、やっぱりまだまだ理解度が低いと言うか
文章がとても稚拙ですね。🙇‍♂️
[node.js] 簡易HttpServer


* ソースコード
    * GET/POST関係なく同じレスポンスを返します。
    * 色々分岐したければ、req の内容を見て判定すればよい。

```httpServer.js
const http = require('http');
http.createServer().on('request', function(req, res) {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.write('Hello world\n');
    res.end();
}).listen(8000);
```

* 起動

```
$ node httpServer.js
```

* 停止
    * Ctrl+c で停止。
terraformでsnapshotからAzureVirtulaMachineを作成する

## ポイント
- Azureでは、AWSでいうAMIスナップショットをとることはできない
    - キャプチャという機能でできるんだけど、VMを破棄することになるというのとWindowsの場合Sysprepをかけておかないと再利用ができない
    - キャプチャは展開用のイメージを作る感じでバックアップで利用するのは難しい
- VMにアタッチされているルートボリュームのスナップショットを取得しておけばバックアップになる
- terraformで利用する場合は、以下のように、storage_os_diskにdiskを指定し、そのdiskがsnapshotから作榮されるような感じで書く
- `os_profile_windows_config`などの設定は全部切らないとデプロイエラーになる

## ソース

```terraform
resource "azurerm_virtual_machine" "main" {
  name                  = var.web01-vmname
  location              = var.location
  resource_group_name   = azurerm_resource_group.resource_group.name
  network_interface_ids = [azurerm_network_interface.main.id]
  vm_size               = "Standard_DS1_v2"

  storage_os_disk {
    name            = azurerm_managed_disk.root.name
    os_type         = "Windows"
    managed_disk_id = azurerm_managed_disk.root.id
    create_option   = "Attach"
  }
}

resource "azurerm_managed_disk" "root" {
  name                = "root"
  location            = "japaneast"
  resource_group_name = "backup"
  storage_account_type = "StandardSSD_LRS"
  create_option = "Copy"
  source_resource_id = "/subscriptions/9611116b-ea93-42fc-bc7a-6a1149bb2521/resourceGroups/backup/providers/Microsoft.Compute/snapshots/web-20201005"
}
```
C++11 or later で自動微分するメモ

## 背景

* C++11 or later でグラフィックスや機械学習関連のコードで自動微分したい
* コンパイル時に式は決まっている(動的な expression を微分しなくてもよい
  * => template(expression template) を使う
  
autodiff(いくつか同名のプロジェクトはあるが, ここでは以下の URL)のコード

https://autodiff.github.io/

が参考になります.

## 方法

基本は Dual number(二重数, 双対数)を使って実装します.

たとえば, OpenShadingLanguage では, シェーダ微分のために dual が実装されています.

https://github.com/imageworks/OpenShadingLanguage/blob/master/src/include/OSL/dual.h


## コンパイル時 symbolic differentiation

Compile-Time Symbolic Differentiation Using C++Expression Templates 
https://arxiv.org/abs/1705.01729

Dual を使わず, template expression をベースにテンプレートを使ってコンパイル時に symbolic に処理する.

C++ ではテンプレート引数に定数を直接は指定できないので(いずれ C++2x で指定できたりするかしらん?),
たとえば浮動小数点の定数は, いったん string にしてから `stod` で floating point にしています.

```c++
Real<2,0,1> _2_; // stands for 2 = 0.20e1

template<int L,int R,int Ex>
class Real
{
 private:
  double value_;
 public:
  Real()
  {
    std::ostringstream strout;
    strout << "0." << L << R << "e" << Ex;
    value_ = double( strtod(name.c_str(), NULL) );
  }
  inline double operator()(const double* x) const
  { return value_; }
};

```

Dual での実装に比べて, 高次の微分がやりやすかったり, 式の simplification(e.g. `x/x -> 1`)がやりやすいという利点があります.

複雑な式になるとコンパイル時間がかかります!

## その他

Eigen-AD: Eigen で自動微分: Eigen-AD: Algorithmic Differentiation of the Eigen Library https://arxiv.org/abs/1911.12604

ACORNS: An Easy-To-Use Code Generator for Gradients and Hessians
https://arxiv.org/abs/2007.05094
https://github.com/deshanadesai/acorns

C99 コードから微分コードを生成. 実装としては pycparser で C99 構文をパースして, そこから微分コードを python で生成.

 
## References

*  微分環と双対数 https://tetobourbaki.hatenablog.com/entry/2017/01/29/160445#%E5%8F%8C%E5%AF%BE%E6%95%B0%E3%81%AE%E5%AE%9A%E7%BE%A9 
* ［C++］constexprに双対数（二重数）を実装する https://onihusube.hatenablog.com/entry/2018/12/22/173923
* Compile-Time Symbolic Differentiation Using C++Expression Templates https://arxiv.org/pdf/1705.01729.pdf
* Eigen-AD: Algorithmic Differentiation of the Eigen Library
[AutoHotkey] CapsLockキーを無効化する

# 目的

CapsLockキーを無効化したい。
できるだけシンプルで、それなりにメジャーで、拡張性も高く、なおかつ動作に不透明な所が無いツールを選びたい。

→ 色々調べた結果、AutoHotkey に決定。
公式サイト: https://www.autohotkey.com/

# 環境
Windows Surface Pro
Surface Pro タイプカバー key

# 手順

1. AutoHotkeyをインストール。
1. 下記の内容を.ahkスクリプトとして保存し、実行する。

※ 文字コードはUTF-8。

```ahk:script.ahk
; 英数/CapsLock キーを無効化。
vkF0::Return
Shift & vk14::Return
```

# 解説 AutoHotkeyとは

オープンソースのキーコンフィグアプリ。
スクリプトによってキーバインディング、ショートカット等の多様な設定が可能。

公式サイトは[ここ](https://www.autohotkey.com/) (https://www.autohotkey.com/) 。

使い方は簡単。

1. AutoHotkeyをインストール。
1. キーコンフィグ内容をテキストファイル（UTF-8）として記述。
1. 拡張子 .ahk で保存。（.ahkスクリプト）
1. 保存した .ahkスクリプトをダブルクリック等で実行すれば、キーコンフィグが有効になる。
1. 終了するにはタスクバーからアイコンを右クリック → Exit 。

# AutoHotkeyのバージョンについて

ググると AutoHotkey Wiki (http://ahkwiki.net/Top) というページがヒットするが、情報が古い。
他のページも断片的な情報が多いので、現行バージョンに至るまでの変遷をまとめた。
（推測含む）

- かつて AutoHotkey は64bit非対応、かつ .ahkスクリプトの文字コードはShift_JISのみだった。
- 64bitに対応させ、.ahkスクリプトをUTF-8で書けるようにするなど、機能拡張した非公式派生版 AutoHotkey_L が登場。
- 公式版の AutoHotkey が64bit/UTF-8に対応したので、AutoHotkey_L を使う必要性は薄れた。

よって現在、公式サイトからDLできる最新バージョンは、

- 名称: AutoHotkey
- 文字コード: UTF-8

である。


# .ahkスクリプトの記法

- 行頭のセミコロンはコメント行。
- 「`キーラベル::動作内容`」の形式で記述。
- キーの同時押しは `&`。
- 「何も動作しない」は `Return`。

詳細は公式ドキュメント (https://www.autohotkey.com/docs/AutoHotkey.htm) 等を参考のこと。

# キーラベルの調べ方

こちら (https://pouhon.net/ahk-basic/692/) を参考にした。

私の環境では下記のとおり。

- 英数/CapsLock: `vkF0`
- Shift + 英数/CapsLock: `Shift & vk14`

単押しとShift同時押しでキーラベルが異なっていることに気づかず、しばらくハマった。
特に割り当てたい動作もなかったので、`::Return`とした。


# 参考

公式サイト
https://www.autohotkey.com/
https://www.autohotkey.com/docs/AutoHotkey.htm

AutoHotkey Wiki
http://ahkwiki.net/Top

(最も参考にしたブログ) Output0.1 
インストールと初期設定 – スタートアップに登録する方法
https://pouhon.net/ahk-install/661/
修飾キーのシンボル一覧/キーバインドとホットキーの設定方法
https://pouhon.net/ahk-basic/692/
半角/全角キーやCapsLockが正常に扱えない理由と対策
https://pouhon.net/ahk-capslock/788/
switch文　範囲指定

#概要
switch文の条件の範囲の指定方法について記述してみました。
自分自身switch文の条件には特定の値しか設定できないと思っていたので、自分で振り返る意味でも残しておきます。

#記述
switch文は制御式の値に応じて実行する命令を切り替えるもの。

```ViewController.swift
switch 制御式{
case 条件1:
    //条件1に当てはまる場合の処理
case 条件2:
    //条件2に当てはまる場合の処理
default:
    //どの条件にも当てはまらなかったっ場合の処理
}
```

条件に範囲がなく特定のものは問題なく記述できますが、以下のようなif文をswitch文に置き換える場合はどのようにすればいいでしょうか？

```ViewController.swift
let number: Int!
if number > 0 {
    //　numberが正のときの処理
} else if number < 0 {
    //numberが負のときの処理
} else {
    //numberが0のときの処理
}
```

このような時は、*Int.min*や*Int.max*を用います。
Int.minは整数型の取りうる最小値を表し、Int.maxは整数型の取りうる最大値を表しています。
整数の最大値、最小値と考えると＋∞、−∞を思い浮かべますがデータ上は異なります。
整数の最大値は9223372036854775807、最小値は-9223372036854775807です。
桁が莫大なので実質＋∞、−∞と考えていいと思います。
ということで、これを使ってswitch文を作ります。
[追記]ランダムの範囲が整数型全てであった時、`1..<Int.max`ではInt.maxが正の整数の範囲外になってしまうので`1...Int.max`と修正しました

```ViewController.swift
let number = Int.random(in: -100...100)
switch number{
case 1...Int.max:
    //numberが正のときの処理
    //[追記]1..<Int.maxの場合Int.maxが範囲外
case Int.min..<0:
    //numberが負のときの処理
default:
    //numberが0のときの処理
}
```

Int.maxなどを用いずに範囲指定したい場合も実行できます。
処理を行わない時はbreakで中断します。

```ViewController.swift
let number = Int.random(in: 0...10)
switch number{
case 1...5:
    //numberが1~5のときの処理
case 6...10:
    //numberが6~10のときの処理
default: break
}
```

#最後に
自分自身、あまりswitch文を用いずにif文のみで解決してきたところがあったので、
内容に間違いがあるかもしれません。その際はご指摘のほどよろしくお願いします。

##参考文献
この記事は以下の情報を参考にして執筆しました。

- [[増補改訂第3版]Swift実践入門](https://gihyo.jp/book/2020/978-4-297-11213-4)
Shopify liquidでセールのOFF率を表示する

## 今回の目的

ShopifyのDebutテーマでは、管理画面で商品価格と割引前価格を設定すると価格が割引価格として表示されます。
![スクリーンショット 2020-11-12 0.03.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435480/96475842-b2c0-d444-2b93-d58be551b4e2.png)

確かにこれでセール価格になったんだなというのは見た目でわかりますが、どれくらい価格が割引になったかはわかりづらいです。
今回はここにLiquidでOFF率を入れてみます。

## LiquidでOFF率を加える

これは、商品詳細の話ですのでsectionディレクトリの**product-template.liquid**を使います。

そして、**product-template.liquid**で価格について呼び出しているのはこの部分ですね。chromeの検証でclass名とかから探すと見つけやすいです。

```
<div class="product__price">
 {% include 'product-price', variant: current_variant, show_vendor: section.settings.show_vendor %}
</div>
```

includeを利用しているのでsnippetディレクトリにある**product-price.liquid**で価格についての情報があることがわかります。

**product-price.liquid**では、

価格の情報をここに入れていました。liquidタグは、正直あまり使わなくてもよい気がします。

```
{%- liquid
  if variant.title
    assign compare_at_price = variant.compare_at_price
    assign price = variant.price
    assign available = variant.available
  else
    assign compare_at_price = 1999
    assign price = 1999
    assign available = true
  endif

  assign money_price = price | money
-%}

```
￥マークを先頭につけたくない場合は price | money_without_currencyを使うと良いでしょう。

ここからが本題です。
off率を作成していきます。これを上のliquidタグの下で作成してください。
変数は自分が適当に決めたものなのであんまり気にしないでください。

```
{% assign float_compare_at_price = compare_at_price | times: 1.0 %} 
{% assign per_sale = price |  divided_by: float_compare_at_price %}
{% assign float_per_off = 1 | minus: per_sale %}
{% assign per_off = float_per_off | times: 100  | round %}
```

まず割引前価格(compare_at_price)に1.0を掛けて小数にします。roundフィルターで小数を整数に丸めるためにしないといけません。

その後価格(price)を割引前価格(float_compare_at_price)で割ります.

1 - per_sale　をすることで小数のoff率が出ます。

最後にper_offに100をかけて整数の%で表せるようにし、roundで小数を整数に丸めます。

liquid言語のフィルターとかは[こちら](https://shopify.github.io/liquid/basics/introduction/)から見るとわかりやすいと思います。

あとはセール価格について表示しているところに先ほど作成した変数を入れてあげると、

```
    <div class="price__sale">
      <dt>
        <span class="visually-hidden visually-hidden--inline">{{ 'products.product.sale_price' | t }}</span>
      </dt>
      <dd>
        <span class="price-item price-item--sale" data-sale-price>
          {{ money_price }}
        </span>
        {{ per_off }}% OFF!!
      </dd>
      <dt>
        <span class="visually-hidden visually-hidden--inline">{{ 'products.product.regular_price' | t }}</span>
      </dt>
      <dd>
        <s class="price-item price-item--regular" data-regular-price>
          {{ compare_at_price | money }}
        

      </dd>
    </div>
```

![スクリーンショット 2020-11-12 2.04.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435480/faa3b815-1685-91b0-7db9-acd2f9adc8e3.png)

このようにoff率を表示させることができます！

## まとめ

今回はliquidで手動でOFF率を表示させてみました。
あまり大した内容の記事ではないかもしれませんがどこかの誰かに役立ってくれれば嬉しいです。

何か間違っていることとか、もっとこうした方が良いとかありましたら是非是非コメントお待ちしております。
JavaScriptをIE11対応させるためにしたことまとめ

# 急にIE11対応を頼まれた
JavaScript初心者の私が、IE11対応を頼まれて苦戦した箇所をまとめます。
修正前と修正後のコードを載せたので、参考になれば嬉しいです。


## アロー関数
### 該当のコード
```javascript
$button.click((event) => {
    alert('ボタンを押しました');
});

// => SCRIPT1002: 構文エラーです。
```

#### 修正後のコード
```javascript
$button.click(function(event) {
    console.log('ボタンを押しました');

// => ボタンを押しました
});
```

## テンプレートリテラル
バッククォートで囲んだ文字列の中で変数展開させるやつ
### 該当のコード
```javascript
const age = 20
console.log(`私の年齢は${age}です。`);

// => SCRIPT1014: 文字が正しくありません。
```

### 修正後のコード
```javascript
const age = 20;
console.log('私の年齢は' + age + 'です。');

// => 私の年齢は20です。
```

## isNaN
引数が非数かどうか評価するメソッドらしい
### 該当のコード
```javascript
const int = 1000;
console.log(Number.isNaN(int));

// => SCRIPT438: オブジェクトは 'isNaN' プロパティまたはメソッドをサポートしていません。
```

### 修正後のコード
```javascript
const int = 1000;
console.log(isNaN(int));

// => false
```

## .find()
### 該当のコード
```javascript
const fruits = ['Apple', 'Orange', 'Banana']
if(fruits.find(function (fruit) {return fruit === 'Grape'})) {
  console.log('りんごだよ！');
}else {
  console.log('りんごじゃないよ！');
}

// => SCRIPT438: オブジェクトは 'find' プロパティまたはメソッドをサポートしていません。
```

### 修正後のコード
```javascript
function sample(arg) {
    const fruits = ['Apple', 'Orange', 'Banana']
    if(fruits.filter(function (fruit) {return fruit === arg})[0]) {
      console.log('くだものだよ！');
    }else {
      console.log('くだものじゃないよ！');
    }
}

sample('Banana')
sample('Tomato')

// => くだものだよ！
// => くだものじゃないよ！
```

### 2020/11/12追記
indexOfの方がわかりやすく書ける

```javascript
function sample(arg) {
    const fruits = ['Apple', 'Orange', 'Banana']
    if(fruits.indexOf(arg) !== -1) {
      console.log('くだものだよ！');
    }else {
      console.log('くだものじゃないよ！');
    }
}

sample('Banana')
sample('Tomato')

// => くだものだよ！
// => くだものじゃないよ！
```

@il9437さんご指摘ありがとうございますm(_ _)m

# バージョン情報
**IE: 11.418.18362.0**

「もっとこうした方がいいよ！」とか「こういう書き方もあるよ！」とか、アドバイスがあればコメントしてくださいm(_ _)m
【Unity】最速でテキストで日本語を使えるようにする方法（自分用）

通常のTextでは日本語が使えない為、テキストメッシュプロ（TMP）を使う。

まずは左上にある「Create」→「UI」→「Text-TextMeshPro」の順で押していく。

そうするとTextMeshProの素材をImportする為のポップアップが表示されるので「import TMP Essentials」を押す。


![“shot” 2020-11-11 23.42.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688851/79fc371d-8da1-9789-49e0-21c5fb779c69.png)


その後「Window」→「TextMeshPro」→「FontAssetCreator」の順番に押していく。

↓の画像のウインドウが出てくる

![“shot” 2020-11-11 23.51.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688851/170b1e8b-a152-800f-56c0-dd489a63a964.png)

「Source Font File」利用したいフォントを入れるところ。（ttf, otfのファイルのみ）
「Padding」文字同士の間隔の設定する場所。数字が小さいとかぶってしまうので調整する。
「Atlas Resolution」文字を保存するテクスチャサイズ。日本語は文字数が多いので8192×8192にしておく。
「Character Set」日本語で生成する為、「Custom Characters」にする。

[おすすめフォントサイト](https://coliss.com/articles/freebies/japanese-free-fonts.html)
ここで適当に使いたいフォントを探す。
利用したいフォントを「Source Font File」に入れる。

次に日本語の文字が使えるように文字データを登録する。
↓のサイトから日本語をコピー。
[japanese_full.txt](https://gist.github.com/kgsi/ed2f1c5696a2211c1fd1e1e198c96ee4)
↓ここにペースト。そして「Generate Font Atlas」を押す。少し時間がかかるので待つ。
![“shot” 2020-11-12 1.36.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688851/9b71bae5-9d7d-3f0b-578b-2b839072a0a9.png)

終わったら「Save As」を押す。

そしたら↓のようなファイルができているので
![“shot” 2020-11-12 1.39.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688851/c4b7affa-105f-cecf-125c-2d32fa518b3b.png)

それをテキストメッシュプロの「Font Asset」にドラッグ＆ドロップ

![“shot” 2020-11-12 1.42.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688851/aa0871c7-8798-462f-96c1-d3bc4bfaa7c5.png)


以上。
PRML 演習問題8.1(基本) 解答 

<a id="eq:1.152"></a>
##はじめに
本記事は, 機械学習の教科書の決定版ともいえる, Christopher Bishop先生による『Pattern Recognition and Machine Learning （パターン認識と機械学習）』, 通称PRMLの演習問題のうち, 私が解いた問題の解答を記したものです

今回は演習問題8.1の解説です
<a id="eq:1.152"></a>

##問題

変数を一つずつ周辺化することによって、有向グラフの同時分布の表現(8.5)が正しく規格化されていることを示せ。ただし、個々の条件付き分布は正しく規格化されていると仮定する。

```math
p(\mathbf{x})=\prod_{k=1}^{K} p\left(x_{k} \mid \mathrm{pa}_{k}\right)\quad(\text { 8.5 })
```


##解答

p(x)の各変数によって周辺化を行っていき、以下の式を満たすように考えます


```math
\sum_{x_{1}} \ldots \sum_{x_{K}} p(\mathbf{x})=\sum_{x_{1}} \ldots \sum_{x_{K}} \prod_{k=1}^{K} p\left(x_{k} \mid \mathrm{pa}_{k}\right)=1
```

個々の条件付き分布は正しく規格化されていると仮定するので、一つずつ打ち消していきます

```math
\begin{aligned}
\sum_{x_{1}} \cdots \sum_{x_{K}} p(\mathbf{x}) &=\sum_{x_{1}} \cdots \sum_{x_{K}} p\left(x_{K} \mid \mathrm{pa}_{K}\right) \prod_{k=1}^{K-1} p\left(x_{k} \mid \mathrm{pa}_{k}\right) \\
&=\sum_{x_{1}} \cdots \sum_{x_{K-1}} \prod_{k=1}^{K-1} p\left(x_{k} \mid \mathrm{pa}_{k}\right)
\end{aligned}
```

最終的に、以下のように最後まで消えてしまい、規格化したことが示されます

```math
\sum_{x_{1}} p\left(x_{1} \mid \emptyset\right)=1
```


よって題意は示されました。


参考
[PRML公式解答(Solutions to Exercises Web-Edition)](https://www.microsoft.com/en-us/research/wp-content/uploads/2016/05/prml-web-sol-2009-09-08.pdf)
FirestoreとGoのデータ型変換の関係

## ソース
- Go から Firestore のデータ型変換
https://godoc.org/cloud.google.com/go/firestore#DocumentRef.Create

- Firestore から Go のデータ型変換
https://godoc.org/cloud.google.com/go/firestore#DocumentSnapshot.DataTo

## Firestoreのデータ型
https://firebase.google.com/docs/firestore/manage-data/data-types?hl=ja


## Go から Firestore のデータ型変換
| Go | Firestore |
| --- | --- |
| bool | Bool|
| string | String |
| int, int8, int16, int32 and int64 | Integer |
| uint8, uint16 and uint32 | Integer |
| uint, uint64 and uintptr | [^6]だめ | 
| float32 and float64 | Double |
| []byte | Bytes |
| time.Time and [^7]*ts.Timestamp | Timestamp |
| [^3]*latlng.LatLng | GeoPoint |
| Slices | Array |
| *firestore.DocumentRef | Reference |
| Maps and structs | Map |
| あらゆる型のnil | Null |

[^6]: 整数型の基礎となるint64では表現できない値をもつ可能性があるため。
[^7]: tsパッケージ："github.com/golang/protobuf/ptypes/timestamp"


## Firestore から Go のデータ型変換
| Firestore | Go |
| --- | --- |
| Null | nil |
| ブール値 (Bool) | bool |
| 文字列 (String) | string |
| 整数 (Integer) | [^1]int64 |
| 浮動小数点数 (Double) | [^2]float64 |
| バイト (Bytes) | []byte |
| 日時 (Timestamp) | time.Time |
| 地理的座標 (GeoPoint) | [^3]*latlng.LatLng |
| 配列 (Arrays ) | [^4][]interface{} |
| マップ (Maps) | [^5]map[string]interface{} |
| 参照 (References) | *firestore.DocumentRefs |


[^1]: 構造体フィールドにセットする場合、uint, uint64, uintptr 以外の整数型（signedやunsignedによらず）が許可されます。オーバーフローはエラーとして検出されます。
[^2]: 構造体フィールドにセットする場合、float32も許可されます。オーバーフローはエラーとして検出されます。
[^3]: latlngパッケージ："google.golang.org/genproto/googleapis/type/latlng"
[^4]: 構造体フィールドにセットする場合、任意の型のsliceまたはarrayとして、再帰的に入力されます。Sliceは入力値に合わせてリサイズされます。配列(array)では余った要素は0で満たされ、逆に配列が短すぎる場合は入力値の余りは削除されます。
[^5]: 構造体フィールドにセットする場合、キーは文字列のみ、値は任意の型が許可され、再帰的に入力されます。
softether VPNをCentos7で構築する。

##はじめに
より高いスループットで実現できる構築方法を確立しましたので↓の方法を推奨します。
[SecureNATを無効化したSoftetherVPN server構築](https://qiita.com/honahuku/items/7be170ffe36405fc5c88)


~~ここでは中級者向けにsoftetherのセットアップを解説します。
なお、サーバー初期設定は以下の通り
https://qiita.com/honahuku/items/8d74833e649ccc511fdc
環境は以下の通り~~


```
Server OS:Centos 7
Client OS:Windows 10
Client software:Tera Term
```

## ダウンロード&転送

以下からサーバーソフトウェアをダウンロード

https://www.softether-download.com/ja.aspx?product=softether

ソフトウェアはSoftEther VPN (freeware)、
コンポーネントはSoftether Server、
プラットフォーム、CPUは各環境に合わせてください。
私はLinux、Intel x64 / AMD64(64bit)でした。
この後、rtmの最新版をダウンロードします。2020/11/12現在ではVer 4.34, Build 9745です。

TeraTeamでSCP(ファイル転送)を行います。
ServerにSSHし、ダウンロードしたファイルをコマンド画面にドラッグすると確認ウィンドウが表示されます。
デフォルトのままEnterするとユーザーディレクトリ直下にファイルがあります。
私は/rootにsoftether-vpnclient-v4.34-9745-rtm-2020.04.05-linux-x64-64bit.tar.gzがありました。

##解凍、ファイル移動
```sh
#rootユーザーで作業しているものとします
wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.38-9760-rtm/softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz
tar zxvf softether-vpnserver*
cd vpnserver
make
cd
\cp -r -f ./vpnserver/ /usr/local/
\rm -rf ./vpnserver
ls -lra /usr/local/vpnserver
rm -rf softether-vpnserver*
```
ライセンスとかの確認画面が表示されるので、1を3回選択してください。
この中で自動で動作確認がされます。

```sh
すべてのチェックに合格しました。このシステム上で SoftEther VPN Server / Bridge が正しく動作する可能性が高いと思われます。
```
と表示されたらインストールには問題ないはずです。

##firewallの設定
今回は443ポートを用いてVPN接続を行うので、これを開放する。

```sh
firewall-cmd --permanent --add-port=443/tcp && \
cat /etc/firewalld/zones/public.xml|grep 443 && \
firewall-cmd --reload && \
firewall-cmd --list-ports
```
##SELinuxの設定
無効化されがちなSELinuxですが、このセットアップでは有効にして運用します。
ここでSELinuxの有効化を行いますが、SSHのポートを変更していたり他のwebサーバー、mailサーバーが起動している場合はそれら対しても設定を適宜行ってください。

### 有効化
```sh
$ getenforce
```
を行ってSELinuxの設定状況を確認します。
DisabledかPermissiveなら`/etc/selinux/config`を開き、以下に設定変更してください。
Enforcingなら不要です。

```sh
SELINUX=permissive
```
`/etc/selinux/config`を変更した場合は

```sh
$ reboot
```
等でサーバーを再起動し設定を反映させてください。このときSSHのポートにアクセス許可されていないとSSHに失敗するので注意してください。
### vpnserverにラベルを付与
vpnをインストールしたフォルダーに対し、外部からのアクセスを許可します。

```sh
restorecon -RF /usr/local/vpnserver
```
でラベルが付与されます。

参考記事
https://qiita.com/chi9rin/items/af532d0dd9237cc65741


##自動起動設定(systemd)
```
cd /etc/systemd/system && \
vim softethervpn.service

# 以下を記述
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop

[Install]
WantedBy=multi-user.target
```
##systemdの反映と確認

```sh
systemctl daemon-reload && \
systemctl enable softethervpn && \
systemctl start softethervpn && \
systemctl status softethervpn
```
以下のような表示が出ればインストール成功です

```sh
● softethervpn.service - SoftEther VPN Server
   Loaded: loaded (/etc/systemd/system/softethervpn.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-01-11 21:14:54 JST; 3s ago
  Process: 20904 ExecStart=/usr/local/vpnserver/vpnserver start (code=exited, status=0/SUCCESS)
```

#さいごに
構築お疲れ様です。
この後はWindowsでサーバー管理ツールを用いての作業を行います。[^1]
記事は[こちら](https://qiita.com/honahuku/items/5a29355faaf363f87654)
[^1]: コマンドからの操作も可能です。
セッション管理の安全対策について

# 注意
僕は少しセキュリティ についてかじり出した初心者です。
間違った情報を書いている可能性があるので、コメントで教えていただけると幸いです。
ちなみに徳丸本を参考にしています。

# はじめに
当たり前のことなのですが勉強も兼ねてアウトプットします。
本題の前にクッキーとセッション変数についてそれぞれ簡単に説明します。


# クッキー
クッキーの中にはデータを保存しておくことができる。しかし値の個数や文字列の長さに制限がある。さらに利用者本人から参照、変更可能ということもあり、クッキーは秘密情報の格納に向かない。

# セッション変数
上記で説明した通りクッキーは秘密情報の格納に向いていません。
そこでwebサーバー上でセッションidを生成し、セッション変数に保存します。
そのセッション変数をクッキーに保管するという形でweb ブラウザに状態を持たせます。


# セッション管理安全でないところ
それは漏洩してしまう可能性があるという事です。
その原因は主に5つあります。

- クッキー発行の際の属性に不備
- セッションidの盗聴
- クロスサイト・スクリプティングなどアプリの脆弱性による漏洩
- プラットフォームの脆弱性により漏洩
- セッションidをURLに保持している場合はRefererヘッダから漏洩する

#それぞれの対策
今回は一つ目のみの対策を書きます。
二つ目以降は正しく理解したのちに執筆します。
### クッキー発行の際の属性に不備
クッキーにはいくつか属性をつけることができ、その中のDomain属性とHttpOnly属性、加えてSameSite属性が漏洩の原因につながりやすいです。
#### Domain属性
まず一つ目のDomain属性ではサーバーを指定することができます。何も指定していなければクッキーをセットしたサーバーでしか使えないのでこれが安全です。サーバーを指定することでそのサーバーでもクッキーを利用できます。（複数指定可）不用意に多くのサーバーを指定してしまうと脆弱性の原因になるので気をつけましょう。

#### HttpOnly属性
二つ目HttpOnly属性ではJavaScriptからアクセスできないクッキーを設定する事です。
格納されたセッションidを盗み出すにはクロスサイトスクリプティングという攻撃手法を使います。
HttpOnly属性をつけておくとクロスサイトスクリプティング攻撃を難しくすることができます。

#### SameSite属性
三つ目はSameSite属性はcsrfの脆弱性対策で追加されました。
これをLaxと指定することでそのクッキーは他のサイトから遷移した場合は送信されなくなる。
しかしこれは根本原因の対策にならない。
そちらの対策も別途記事にする。

# 感想
完璧に安全を確保するというのはできない。でも脆弱性対策をすることで少しでも安全なアプリケーションにすることで安心してユーザーが使えるようになるのでしっかり理解してものにしていきたい。そう思った。