OmniAICreator/Qiita-1.07M huggingface dataset:
PlayFab 各プランのAPI制限値とか比較してみた

### はじめに

PlayFabはAPI利用制限が細かく定められており、契約プランによって変動します。
（一部のリソースは個別に課金して引き上げることも可能）

以下のページにプラン比較が載っているのですが、個別のAPI制限値までは載っていませんでした。
https://playfab.com/pricing/

プランごとでどれくらい制限値が違うか確認したのでまとめておきます。

#### 注意
2019年10月1日時点の情報です。
当然変更もあると思うので最新情報はご自身で調べてください。

### プランの種類

* Essentials（無料）
    * LiveOps系APIは制限あり
    * MAUに制限はなし
    * ユーザーフォーラムによるサポート
* Indie Studio（$99/月）
    * Professionalと同じ機能を格安で使える
    * 1000MAUまでは無料
    * 10万MAUに達したらProfessionalへ自動移行
    * 専用サポートあり
* Professional（$299/月〜）
    * API制限値はIndie Studioプランと同じ
    * SLA保証あり
    * 専用サポートあり
* Enterprise（問い合わせ）
    * 色々すごい

分かりづらくて調べたこと

* Indieプランも1000MAUまでは請求されない？
    * https://community.playfab.com/questions/27275/indie-tier-pricing.html
    * されないので安心
* IndieとProのAPIリミットは？
    * https://community.playfab.com/questions/13455/limits-for-pro-tier.html
    * IndieとProは同じ制限値。

Indie StudioとProfessionalは基本的に同じプランで、一定MAU以下の場合は安く利用できるだけのようですね。

Indie/Proどちらも1000MAU以下なら無料で始められますが、スタジオ単位で1000MAUを超えた月から請求される様です。また、翌月以降1000MAUを下回っても、無料プランに自動的に戻ることはないようです。

Indieプラン契約中で10万MAUを越えると、自動的にProfessionalプラン（従量課金）に切り替わります。
Pro/Enterpriseには多少お得なリザーブドインスタンス契約もある様です。

この辺りはIndieプラン契約する途中のページに記載がありました。

### API制限値の確認方法

> どこ探してもAPI制限値がまとまっていませんでした。
公式で書いて欲しい・・・

自分の契約の制限値は下記方法で確認可能です。

タイトル名の歯車 -> タイトルの設定 -> 制限

![スクリーンショット 2019-10-01 0.58.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59975/4294a85d-b00f-c1d5-0b1e-56ba3a6f4d06.png)

### 無料とIndieプランのAPI制限値比較

* 実際にIndie契約して確認しました。（1000MAUまで課金されないのを信じて...）
* Proは未確認ですが、フォーラムによるとIndieと同じ制限値らしいです。

大量にあるのでとりあえず自分が使いそうなものだけ抜粋

| リソース | Essential | Indie Studio & Professional | 
| --- | --- | --- |
| カタログアイテム | 250個 | 3000個 |
| 仮想通貨 | ８種 | 10個 |
| プレイヤーインベントリアイテム | 100個 | 1500個 |
| プレイヤー統計情報 | 25個 | 300個 |
| ランキングプライズテーブルのランク | 10個 | 1000個 |
| CloudScript実行時間(API呼び出し) | 4.5秒 | 10秒 |
| 発行された Cloud Script 実行 API 要求 | 15 | 25 |
| Cloud Script スクリプトのサイズ | 50,000 バイト | 1,000,000 バイト |
| Cloud Script 引数のサイズ | 30,000 バイト | 30,000 バイト |
| プレイヤー セグメント | 10個 | 100個 |
| アクション トリガー | 3個 | 100個 |
| タスク | ５個 | 25個 |
| Cloud Script 実行時間 (トリガーされたアクション) | 1秒 | 1秒 |
| 発行された Cloud Script 実行 API 要求 (トリガーされたアクション) | 3 | 5 |
| 検索可能なイベント履歴 | 7日 | 30日 |
| スケジュール済みタスクの同時実行 | 1個 | 5個 |
| プレイヤー データ値のサイズ | 10,000 バイト | 300,000 バイト |
| 15 秒あたりのプレイヤー データ値更新 | 10回 | 10回 | 
| タイトル データのキー/値ペア | 50個 | 1000個 |



### まとめ

チート対策等でサーバーサイドに処理をまとめていくと、CloudScriptまわりの制限にすぐ到達すると思うので、無料の範囲が絶妙だなーと思いました。
その次にアイテム・インベントリあたりが引っかかってくるでしょうか。

プレイヤーデータだけを使えば無料プランでもMAU無制限に使えるのですごいです。
CloudScriptやアイテム・インベントリを活用すると無料プランでは厳しそうですが、
それでも10万MAUまでは$99で使えるのはとてもありがたいです。
【エラー】HTMLのメニューアイコンが表示されない

##練習用のメニューをchromeで開くとアイコンが表示されない<br>エラーが発生
<img width="486" alt="error1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204606/c56ad565-f940-646a-86f7-a44ba34af11d.png">

###今回学習した項目
* HTML5
* CSS

###エラーの原因を調査
F12を押下しElementsからアイコンのソース部分を確認。cssファイルの【content: '\f0c9';】の箇所にあたりをつけてぐぐったらFont Awesomeというワードを検索。
　Font Awesomeというフォントを使用したい場合下記のコードをヘッダーに記述しサイトから直接、CSSを読み込ませるとアイコンが正常に表示された。

###　記述するコード
``` html:xxxx.html

 <link href="http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">

```
<img width="486" alt="error2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204606/df933e54-8a23-d7c0-75c3-2487a5073209.png">


##所感
　今回のエラーは解決するのにあたりを早めにつけ解決することができた。しかし、Font Awesomeなどのネット上から直接CSSを読み込ませることが知識としてなくCSSの学習が足りないことも実感した。

###参考URL
https://web-design-cafe.com/archives/320
https://fontawesome.com/icons?from=io
macOSでPerlを有効にする【macOS10.14】

一部手間取ったところがあったので、これも備忘。
Webアプリケーション用に使いたいので、主にhttps.confの編集に尽きます。


#1. Perlのインストール...？
MojaveにもPerlはプリインストールされていますが、C言語で書かれたPerlモジュールはセキュリティ上の理由でインストールに失敗してしまうとのこと。
しかし今回はまずPerlをいじることが目的の為、プリインストールのPerlを使用します。
Perlのバージョンは  ```$perl -c```で確認できます。
<img width="602" alt="a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/44d8ed4e-0662-e707-f09f-4ec80afb57a2.png">
macOS10.14.6ではPerl 5.18.4とのこと。

パスを確認したい場合は```$which perl```で確認できます。
プリインストールされているPerlの場合は```/usr/bin/perl```かと思います。

#2. https.confの編集
続いて、httpd.confを編集します。
```$sudo -s vi /etc/apache2/httpd.conf```
でhttpd.confを開きます。もしmacOSデフォルトのapacheではなく、自信でインストールしている場合はインストール先のhttpd.confを開きます。

以降、行番号がわかっているととても便利なので、ファイルを開いたらエスケープモードの状態で
```:set number```と入力して行番号を出しておきます。
<img width="704" alt="b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/47199683-56bc-7d7e-6578-d94f9dd5eb08.png">

###2.1 LoadModuleの有効化
デフォルトではコメントアウトされている行のコメントアウトを外して有効化します。
LoadModuleは68行目あたりから始まります。（使用環境によって行数は変わります）

・165行目付近
```LoadModule cgi_module libexec/apache2/mod_cgi.so```

・174行目付近
```LoadModule userdir_module libexec/apache2/mod_userdir.so```

・176行目付近
```LoadModule rewrite_module libexec/apache2/mod_rewrite.so```

・179行目付近
```LoadModule perl_module libexec/apache2/mod_perl.so```

###2.2 DocumentRootの指定
245行目付近にあるDocumentRootを設定する。
自信がWebページとして公開する場所を指定すればよい。
今回はデフォルトの/Library/WebServer/Documentsをそのまま使用。

```<Directory "/Library/WebServer/Documents>```
から
```</Directory> ```
の間、259行目付近にある
```Options FollowSymLinks Multiviews```の末尾に「ExecCGI」を追記。
```Options FollowSymLinks Multiviews ExecCGI```とする

###2.3 MIMEの設定
406行目付近にあるmime_moduleの設定をして、.cgiや.plがwebコンテンツとして認識されるようにする。
・437行目付近
```AddHandler cgi-script .cgi```のコメントアウトを外し、末尾に　.plを追記。
拡張子を.cgiで統一する場合はコメントアウトを外すだけでも可。

###2.4 ホームディレクトリの設定
ユーザのホームディレトリ設定を有効にする。
・510行目付近
```Include /private/etc/apache2/extra/httpd-userdir.conf```
のコメントアウトを外す。


以上でhttpd.confの設定は完了。
ファイルを保存したらapacheを再起動する。
```sudo -s apachectl restart```

#3. ブラウザで表示してみる
簡単なHello Worldを表示するファイルを作成。

```perl:hello.pl
#!/usr/bin/perl

print("Hello World!");
```
このファイルをhttpd.confで指定したDocumentRootに置きます。
その後ブラウザで```http://localhost/hello.pl```にアクセス。

<img width="1178" alt="スクリーンショット 2019-10-01 0.58.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/68a59f31-04ed-0916-1656-ab406dcdbcce.png">

画像のように表示されたら設定完了です。

#4. 思った通りに表示されない...
Hello World！と表示されなかった場合、2通りの表示がでるかと思います。

###4.1 ソースコードがそのまま表示される
httpd.confの設定が間違っているとブラウザにはソースコードがそのまま表示されてしまいます。
もう一度httpd.confを見直す必要があります。


###4.2 Internal Server Errorと表示される
<img width="1178" alt="スクリーンショット 2019-10-01 0.47.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/43f84e1f-db32-3fc6-240c-422bbd039115.png">
画像のような表示になってしまった場合。よくある原因が
***ソースコードのファイル、もしくはそのファイルが格納されているフォルダのアクセス権が違う***
場合です。
その場合は
```$sudo -s chmod 755 xxx```でアクセス権を変更してあげてください。

もう１つの可能性として、***ソースコードの記述内容が違う***
ということもあります

```print "Content-Type: text/html\n\n";```
の一文が記載されていないと、こちらもInternal Server Errorの原因となります。
ソースコードを見直して、書いていないようであれば追記して、ブラウザを読み込み直してみてください
vue-routerの使用方法

## はじめに
laravelとvue-routerが入っている前提としての記事になります。
もしvue-routerをインストールされていない方がいましたら
こちらの記事を参照ください。
https://qiita.com/KARENN/items/48334437eb06628b78fc

今回は実際にvue-routerで指定したURLに、vueファイルで記述した内容を画面に表示できるようにする方法になります。

## 今回使用するファイル構成
```
projectName
　↳resorces
　　↳js
　　　↳components
　　　　↳index.vue
　　　　↳detail.vue
　　↳views
　　　↳index.blade.php
```

## router.jsの内容
```
import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter);

import index from './components/index.vue';
import detail from './components/detail.vue';

export default new VueRouter({
    mode: 'history',
    routes: [
        {
            path: '/',
            name: index
            component: index
        },
        {
            path: '/detail',
            name: detail,
            component: detail
        }
    ]
});
```
vue-routerの中身がこのようになっていることが前提となります。

## index.blade.php
``` index.blade.php
<!doctype html>
<head>
    <script src="{{ asset('js/app.js') }}" defer></script>
</head>
<body>
    <div id="app">
       <router-view />
    </div>
</body>
</html>
```

headの中身に必ずコンパイルしたjsを使用するようにしてください。
idをapp.jsで指定した内容を記述して¸``` router-view ```を呼ぶようにすると
``` router.js ```の中身を見るようになります。
ここまでがbladeに記述する内容になります。

## vue内の記述
では実際ここからは``` vue-router ``` を使用したvue.jsの内容です。

``` index.vue
<template>
    <div>
        index.vueの中身になります。
        <router-link to="/detail">detail.vueに遷移</router-link>
    </div>
</template>
```
URLに``` / ```を入力すると``` router.js ```で指定した``` index.vue ```の中身が表示されます。
この場合、画面に下記のように表示されます。
![スクリーンショット 2019-10-01 0.47.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297248/2616d06b-7477-9939-8ccf-4b1456cf2fea.png)


``` detail.vueに遷移 ```を押下すると``` detail.vue ```の内容が表示されます。

``` detail.vue
<template>
    <div>
        detail.vueに遷移しました。
    </div>
</template>

```

実際の画面ではこのようになります。
![スクリーンショット 2019-10-01 0.48.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297248/deada31a-2533-5965-9e2e-5bfedb16f163.png)

これで``` vue-router ```を使用した画面遷移になります。
laravelでvue-routerの設定方法

## はじめに
今回はvue-rounterのみのURLを使用した場合のlaravelとvue.jsの設定についての記事になりますので、
laravelとvue.jsの環境が整っている事が前提となっています。

vue-routerのインストールからコンパイルまでの記事になっていますので、
実際に使用方法を知りたい方はこちらを参照ください。
https://qiita.com/KARENN/items/03b5881bb6e8e521ad11

## 今回使用するファイル構成
```
projectName
　↳routes
　　↳web.php
　↳resorces
　　↳js
　　　↳app.js
　　　↳router.js
　　　↳components
　　　　↳samaple.vue
　　↳views
　　　↳index.blade.php
　↳webpack.mix.js
```

## インストール
```
npm install vue-router
```

## laravelのルーティングファイル
```web.php(vue-routerのみ)
Route::get('/{any}', function () {
    return view('index');
})->where('any', '.*');
```

この記述をしておくことで「/」の後のURLは全てvue-rounterで指定した内容を読み込んでくれることになります。
この記述がなければ、vue-rounterを使用してもlaravelのRouting設定が先に読まれることになりますので注意してください。
この書き方は全てのURLをvue-routerで使用したい場合の書き方ですので、
特定の条件を利用したい場合はこちらの記述をします。

``` web.php(laravelとvue-router)
Route::get('/', function () {
    return view('task.list');
})

Route::get('/member/{any}', function () {
    return view('member.list');
})->where('any', '.*');
```
このように書くと、```/```でアクセスするとタスク一覧はlaravelのルーティングとして認識されます。
```/member```配下のURLは全てvue-routerで指定したルーティングとして認識されるようになります。


## vue.jsの設定

``` app.js
import Vue from 'vue' ←追加
import router from './router' ←追加

new Vue({
    el: '#app',
    router: router ←追加
})
```
app.jsはVue.jsをインストールした際にデフォルトで追加されているファイルなので
そのファイルに対して上記の部分を追加してください。

## ルーティングの設定
``` router.js
import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter);

// コンポーネントをインポート
import index from './components/index.vue';
import detail from './components/detail.vue';

export default new VueRouter({
    // モードの設定
    mode: 'history',
    routes: [
        {
            // routeのパス設定
            path: '/',
            // 名前付きルートを設定したい場合付与
            name: index,
            // コンポーネントの指定
            component: index
        },
        {
            path: '/detail',
            name: detail,
            component: detail
        }
    ]
});
```
modeの設定はデフォルトでは```hash```となってますが、ここでは```history```を使用しています。
```hash```を使用している場合、下記のように```#```がrouteの中に入るので注意してください。
ex) /detailのルーティングの場合： http://localhost/#/detail

## コンパイル
``` webpack.js
const mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.js('resources/js/app.js', 'public/js')
    .js('resources/js/router.js', 'public/js') ←追加
    .sass('resources/sass/app.scss', 'public/css');
```

```npm run watch```を再度行い、```public/js```の下に```router.js```があればコンパイル成功となります。
⭐️ARKitでプラネタリウムを作りたい（1）

タイトル通りARkitでプラネタリウムが作りたくなったので作ってみる
（１）では星の座標計算の準備までを作っていく

- 計算に必要なもの
    - 星のデータ
    - 現在地座標
    - 時刻

## 星のデータ

- 星はめっちゃあるので今回は1等星に絞る
    - 一等星21個 + ヘッダーの22行
- 欲しい要素は↓
  - 番号：一意の番号
  - 名前：星の名前（多分英語）
  - 視等級：明るいほど小さい（地球から見たときの明るさ）
  - 赤経：天体の位置（時分秒で表される）
  - 赤緯：天体の位置（+90 ~ -90）
- 星表は[ヒッパルコス星表](http://astronomy.webcrow.jp/hip/)を使用した

```csv:StarData.csv
hip_number,name,right_ascension,declination,visual_magnitude
32349,Sirius,6.4509,-16.4247,-1.44
30438,Canopus,6.2357,-52.4144,-0.62
69673,Arcturus,14.1540,19.1114,-0.05
71683,Rigil Kent,14.3940,-60.5006,-0.01
91262,Vega,18.3656,38.4658,0.03
24608,Capella,5.1641,45.5956,0.08
24436,Rigel,5.1432,-08.1205,0.18
37279,Procyon,7.3918,5.1339,0.4
7588,Achernar,1.3742,-57.1411,0.45
27989,Betelgeuse,5.5510,7.2425,0.45
68702,Agena,14.0349,-60.2222,0.61
97649,Altair,19.5046,8.5202,0.76
60718,Acrux,12.2635,-63.0556,0.77
21421,Aldebaran,4.3555,16.3035,0.87
65474,Spica,13.2511,-11.0940,0.98
80763,Antares,16.2924,-26.2555,1.06
37826,Pollux,7.4519,28.0134,1.16
113368,Fomalhaut,22.5738,-29.3718,1.17
62434,Becrux,12.4743,-59.4119,1.25
102098,Deneb,20.4125,45.1649,1.25
49669,Regulus,10.0822,11.5801,1.36
```

## csvファイルを読み込み

用意したcsvファイルを取得して、使いやすいように整形（配列に格納）していく

```swift:ViewController.swift
// cavファイル読み込み
var csvArray = [String]()
guard let csvPath = Bundle.main.path(forResource: "StarData", ofType: "csv") else {
    return
}
do {
    let csvString = try String(contentsOfFile: csvPath, encoding: String.Encoding.utf8)
    csvArray = csvString.components(separatedBy: "\n")
    // 最後の改行を削除
    csvArray.removeLast()
} catch _ as NSError {
    return
}

for star in csvArray {
    let starDetail = star.components(separatedBy: ",")
    print("HIP番号: \(starDetail[0])\n名前: \(starDetail[1])\n赤経: \(starDetail[2])\n赤緯: \(starDetail[3])\n視等級: \(starDatail[4])\n")
}
```

<img width="243" alt="スクリーンショット 2019-09-30 1.36.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137649/c21fa1ec-be9c-c528-b151-1cb385c053db.png">

これで星の方の準備は完了

## 現在地取得

星の位置は地球のどこにいるかで変わるので、のちの計算のために取得

Core Locationを使用
<img width="446" alt="スクリーンショット 2019-09-30 1.03.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137649/7491032c-a98d-c0e1-73e4-06f3fafa3504.png">

ほぼコピペなので割愛

## 時刻取得

星はの位置は時刻によって変わr(略

```swift:VierController.swift
// 時刻を取得
let date = Date()
let format = DateFormatter()
format.dateFormat = "yyyy,MM,dd,HH,mm,ss"
format.timeZone   = TimeZone(identifier: "Asia/Tokyo")
let currentTime = format.string(from: date).split(separator: ",")

print("現在時刻: \(currentTime[0])/\(currentTime[1])/\(currentTime[2]) \(currentTime[3]):\(currentTime[4]):\(currentTime[5])")
```

```
現在時刻: 2019/09/09 02:11:58
```

---

値が準備できたので計算処理を作る（次回）
初めてゲームを作るためにしたこと

#はじめに
はじめまして、株式会社テクロスでアルバイトをしている大学生です。プログラミングをしたことがない私が、ゲームを作ろうとするお話です。

ゲーム作りに興味を持っている人の役に立てば幸いです。

私はUnityというゲームエンジンをインストールして使いました。

#ゲーム作成のためにしたこと

###1. Unityを触る
Unity上に立方体のオブジェクトを置いてその向きや場所をドラッグして動かしたり、大きさを変えたりしていました。またそれぞれのタブがどのような役割を持つのかをざっくりと把握しました。
たとえば…
 **Hierarchy**：ステージに置いている物を文字で表示してるとこ
 **Scene**：ステージの映像
 **Game**：カメラ視点の映像、再生すると結果をカメラ視点で見れる
 **Project**：使った道具や物を置いておくところ
 **Console**：エラーを教えてくれるところ
 **Inspector**：置いた物の位置とかいろいろ書いているところ
<img width="1679" alt="スクリーンショット 2019-09-30 12.31.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/279001/90cdbc2e-5eac-6939-dda4-e00b56465b82.png">
 
こんな感じで厳密ではないです。厳密なのが知りたい方は[Unityの公式マニュアル](https://docs.unity3d.com/ja/2018.1/Manual/UsingTheEditor.html)を確認してください。正直ここまでは全然楽しくなかったです。やっぱりUnityにある　▶️（再生）　を押してオブジェクトを指示通りに動かしたいですね。

###2. プログミングの勉強
オブジェクトにスクリプトをアタッチする（くっつける）と、スクリプトの指示通りにオブジェクトを動かすことができます。
さて肝心のスクリプトですが、Unity上で
**Project**で右クリック -- >  **Creat** -- > **C#Script**
とすることで以下のようなスクリプトを用意することができます。

```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class sample : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
```

この画面を使って[Unity5の教科書, 北村愛実](https://www.amazon.co.jp/Unity5%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-2D%EF%BC%863D%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-%E5%8C%97%E6%9D%91-%E6%84%9B%E5%AE%9F-ebook/dp/B01H4ONR86)を参考にしながら、プログラミングの基本的なことを確認していきました。

* 記述のルール、クラスや型などの考え方
* 演算の仕方
* 条件説や繰り返しなどの処理の仕方　等

本などで勉強していると章とかが進む度にステップアップしてる感じがしていいですね。その後は本にあった例題や、ネットの初心者向けの記事などの正しいスクリプトがすぐに参照できるもので練習しました。

私は全く同じように書いたつもりでも{　}が抜けていたり、大文字小文字を間違えていたりとミスが多かったので、エラー文と格闘している時間が長かったかなと思います…ただ一発で思い描いた動きをしてくれた時や、エラーを解決できた時はものすごく達成感がありました。

私が実際にゲームを作成するまでにしたことは以上です。ゲームを作成するのはもっと難しいと思っていたので、簡単なゲームを作成するのであれば、必要な知識もそれほど多くないというのが個人の感想です。
APIキーはハードコーディングせず.envファイルを活用しよう


# 対象の方
- プログラミング初心者
- .envを使用した事がない方


# ハードコーディングって何？
> ハードコーディングとは、本来プログラム中に記述すべきでないリソースを、直接ソースコード中に埋め込むことである。これらは本来、外部ソースから取得するか、実行時に生成するべきものであり、これをソフトコーディングという。 
ウィキペディア


    # このようなコードの事
    api_key = "xxxxxxxxxxxx"　

実際プログラミング初めて間もない頃は環境変数の言葉すら知らず、この様に直書きしてました笑
今考えると、Githubにpublicで上げるのに論外ですよね…

# ハードコーディングのここがダメ
- 特定のkeyが存在する場合はそれに関連する情報がコードの漏洩と共に盗まれる可能性がある。
- 複数箇所で使用する場合、毎回書くのは面倒く際
- などなど…


### 結果.envファイルを作成して、変数として管理しよう！！


## 使い方
1. 隠しファイル.envを作業ディレクトリに作成しよう。
2. 変数名=値の形で宣言しよう
    api_key="xxxxxxxx" #変数名 = 実際の値

手順としてはこれだけで後はこの値を使用したい箇所で呼び出すだけ！
とっても簡単！！

こうする事で、apiキーだけでなくdockerで構築するdb情報を書いておけば

    docker-compose.yml
    
    USER : ${変数名}

の様に使用することが出来る。

また、node.jsなどで使用したい場合はdotenvを利用して.envを読み込み使用する事が出来る。

    例
    require('dotenv').config({path: ここに.envまでのパス})
    
    process.env.変数名 #呼び出し

# 後書き
初めてQiitaに記事を書いてみました。
読みづらい箇所が所々あったとは思いますが読んで頂きありがとうございます。
また、間違えがあればご指摘頂けると幸いです
pyppeteerにてヘッドレスChromeが勝手に落ちてpyppeteer.errors.NetworkError: Protocol error Target.sendMessageToTarget: Target closed.となった場合の対処法

#開発環境
OS: **macOS Mojave 10.14.5**
言語: **python 3.7.2**
#エラーの内容
pyppeteerを使ってheadlessのChromeブラウザを立ち上げ、データフレームに格納されたリンクに順番にジャンプするプログラムを書いた。
csvファイルは[こちら](https://drive.google.com/open?id=1Nj-7ttuDbbshgvMagXgW12kcBSaZR9-o)

```py
import asyncio
from pyppeteer import launch
import pandas as pd
import time

async def main():
    browser = await launch(autoClose=False,headless=False,args=['--no-sandbox'])
    page = await browser.newPage()

    linkData = pd.read_csv('ファイルのパス',usecols=[1])
    print(linkData)

    for i, row in linkData.iterrows():
        await page.goto(str(row[0]))
        time.sleep(1)

    await browser.close()


if __name__=='__main__':
    asyncio.run(main())
```

途中でブラウザが閉じてしまい、うまく動かない。
エラーは以下。

```
pyppeteer.errors.NetworkError: Protocol error Target.sendMessageToTarget: Target closed.
```
#解決法

```
$ pip3 install websockets==6.0 --force-reinstall
```

どうやらwebsocketがうまく動いていなかったらしいので、version6.0をインストールしたら解決した！

#参考
[pyppeteer.errors.NetworkError: Protocol error Target.activateTarget: Target closed. #171](https://github.com/miyakogi/pyppeteer/issues/171)
Unity での衝突（OnCollisonEnter か OnTriggerEnter が呼ばれない）を整理する

Unity で OnCollisonEnter か OnTriggerEnter が呼ばれないと困っている人もいるかと思い、イベントを呼ぶための Rigidbody と IsTrigger の関係を表に整理しました。
Cube と Sphere を衝突させて、イベントが起こる起こらないを確認しています。

# TL;DR
Unity で OnCollisonEnter か OnTriggerEnter を呼ぶためには、まず、

* 衝突しあう両方のオブジェクトに Collider を入れる
* 衝突するどちらか一方に Rigidbody を入れる

です。

その上で Collider の

* IsTrigger が Off なら OnCollisionEnter が呼ばれます。
* IsTrigger が On なら OnTriggerEnter が呼ばれます。

## 表のまとめ
### Collider は必須
ぶつかり合う Cube と Sphere の `両方` に Collider が入っていないと、イベントは起きません。
Rigidbody はどちらかに入っていれば反応します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/aa7d58d7-38d5-7248-56ef-4749e1a12570.png)

### IsTrigger が優先
さっきの表をよくよく見ると、ある法則があり、青、緑、ピンクで塗ったセルの塊ごとに結果は同じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/82c2600a-acfb-e4c0-70cd-0badd0d702eb.png)
つまり IsTrigger が On か Off に影響され、On ときは OnTriggerEnter が呼ばれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/51460730-2e9d-f088-7d04-7376bae61e80.png)


# それでは説明です

## 確認した環境
Unity のバージョンは 2019.1.6f1 で、こんな感じの簡単な環境で実施しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/442fbfda-7138-5c6d-0ce3-b3779eca3a5f.png)

## Code sample
### Sphere.cs
```C#
using UnityEngine;

public class Sphere : MonoBehaviour
{
    private void OnCollisionEnter(Collision other)
    {
        Debug.Log($"{other.transform.name} is OnCollisionEnter in Sphere.");
    }

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log($"{other.transform.name} is OnTriggerEnter in Sphere.");
    }
}
```
### Cube.cs
```C#
using UnityEngine;

public class Cube : MonoBehaviour
{
    private float speed = 0.1f;
    private float elapsed = 0.0f;

    // 適当に動かしてぶつけることにした
    void Update()
    {
        elapsed += Time.deltaTime;
        
        var pos = transform.position;
        transform.position = new Vector3(pos.x + speed, pos.y, pos.z);

        if (elapsed > 1.0f)
        {
            speed = -speed;
            elapsed = 0.0f;
        }
    }

    private void OnCollisionEnter(Collision other)
    {
        Debug.Log($"{other.transform.name} is OnCollisionEnter in Cube.");
    }

    private void OnTriggerEnter(Collider other)
    {
        Debug.Log($"{other.transform.name} is OnTriggerEnter in Cube.");
    }
}
```

## 確認した内容
Rigidbody のある・なし、IsTrigger の On・Off を切り替えて、コンソールに出力されるログを確認しました。

### Rigidbody のある・なし
左側の Cube には Rigidbody がなく、右側の Sphere にはRigidbody がある状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/457e7a78-490c-83c5-74f4-d476ddc847ab.png)

### IsTrigger のOn・Off
左側の Cube の Box Collider の IsTrigger は Off で、右側の Sphere Sphere Collider の IsTrigger は On です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/be8d79a8-33c2-92c3-80ac-b63e8ec38b87.png)

## 補足
* 発火する条件を満たしていれば、OnTriggerEnter・OnCollisonEnter は、 Cube・Sphere のどちらに書いても、両方に書いても、処理が走ります。
* Console に Debug.Log が表示されないと思ってこの結果が間違っていると思うかもしれませんが、実は Console にデバッグレベルのログが表示されない設定になっているかもしれません。お気を付けください。
Project Euler 033を解いてみる。「桁消去分数」

# Project Euler 033
[033](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2033)
>49/98は面白い分数である.「分子と分母からそれぞれ9を取り除くと, 49/98 = 4/8 となり, 簡単な形にすることができる」と経験の浅い数学者が誤って思い込んでしまうかもしれないからである. (方法は正しくないが，49/98の場合にはたまたま正しい約分になってしまう．)
我々は 30/50 = 3/5 のようなタイプは自明な例だとする.
このような分数のうち, 1より小さく分子・分母がともに2桁の数になるような自明でないものは, 4個ある.
その4個の分数の積が約分された形で与えられたとき, 分母の値を答えよ.


->[次の問題](https://qiita.com/radiol/items/eb4f34b443b8cbb96c14)

## 考え方
総当りで力づくしか思いつきませんでした…
itertoolsのproductを使い、denominator, numerator, add_numそれぞれに1~9まで順番に組み合わせを試しています。
if文にはORを使い全ての組み合わせをゴリゴリに書いています。
ウツクシクナイ

## コード
```Python:euler033.py
from itertools import product
from math import gcd


def main():
    answer_numerator = 1
    answer_denominator = 1
    for numerator, denominator, add_num in product(range(1, 10), range(1, 10), range(1, 10)):
        temp = numerator / denominator
        if temp >= 1:
            continue
        # 組み合わせを全て記載
        if temp == (numerator * 10 + add_num) / (denominator * 10 + add_num) or \
           temp == (numerator * 10 + add_num) / (denominator + add_num * 10) or \
           temp == (numerator + add_num * 10) / (denominator * 10 + add_num) or \
           temp == (numerator + add_num * 10) / (denominator + add_num * 10):
            print(f'{numerator}/{denominator}, {add_num}')
            # 積をとってから約分するので分子・分母をそれぞれかけて、
            # 答えの分子・分母とする
            answer_numerator *= numerator
            answer_denominator *= denominator
    # 分子と分母の最大公約数で分母を割り、約分したときの値を得る
    print(answer_denominator // gcd(answer_denominator, answer_numerator))


if __name__ == '__main__':
    main()
```
`結果
1/4, 6
1/5, 9
2/5, 6
4/8, 9
100
`
【Rails】入力フォームで値を送信

# この記事の概要
・RubyOnRailsについて、Progateで学んだことを書き記す
・ガチ初心者によるもの
・主に備忘録として、随時書き足していく

# 項目
## 入力フォーム

```
<%= form_tag(/introduce/create) do %> //submitボタン押下時のデータ送信先URLを指定
    <textarea></textarea>
    <input type="submit" value="投稿">
<% end %>
```
【初心者】プログラミング言語って何ができるの?不正確だけど、読みやすく書いてみた。

## progateはやったけど...
私は初学者の時に、progateのレベルが280程度になるくらいまでは
繰り返したのですが、全体像が掴めておらず、
そもそもプログラミング言語が何ができるか、何の為にあるのかわかりませんでした。

当時こういう記事があれば、勉強の合間に読んで役立てられたのではないかな？
と思い、書いています。
フレームワークやCMSであるwordpress、無料ブログサービスも例にとって説明します。

## 前提
WEBの勉強をされる初学者の方の、休憩時間にでも読んでもらえれば。

ただあくまで正確なことは公式ドキュメントや論文、かための技術書に書かれている内容です。
しかし変数はハコのような物みたいな例え話なんかは、正確に変数を理解する前の橋渡しになると考えていますので、考えがあう人はイメージに使って見てください。（逆に言えば合わないなら価値のない情報です。）

## そもそもプログラミング言語は何ができるのか
**何でもできる**

## 何でもできるが理解しにくいわけ
たくさんプログラミング言語があるのに、それぞれの目的がわからないから。

## 一覧
```
機械寄り、不便、自由、ぶっ壊せる。
1.バイナリ
2.アセンブリ言語
3.C言語,シェルスクリプト
4.Ruby,PHP,Python
5.Ruby on Rails,Laravel
6.WordPress
7.Amebaブログ等
人間寄り、便利、制限多い、ぶっ壊せない。
```
1.機械語そのもの
2.機械語にかなり近い言語
3.機械語に近い高級言語
4.所謂プログラミング言語(近年初学者が学ぶことが多い)
5.プログラミング言語と環境の組み合わせを絞って便利にしている（フレームワーク）
6.ブログを作れるシステム（CMS）、この中では自由度が高い
7.無料ブログサービス。簡単に扱えるが自由度が低い。

## そもそもコンピュータは計算しかできない
コンピュータの持っている機能はそもそも計算だけです。
多くの機能が利用できているのも、超具体的に落とし込めば、
高速で大量の計算をしているだけなのです。

## 1.バイナリ

```
010100011011010010101010101
```
↑こんなイメージです。
コンピュータは0と1だけで命令する。有名な話ではないでしょうか？
その通りでコンピュータは0と1だけで命令を受け取り、そのように処理します。

000101ならAという部品を動かすとか、
001000ならBという部品を動かすとかそんなイメージです。
（例なので適当です。実際の動作とは異なります。）

## 2.アセンブリ言語
バイナリをそのまま打っていくとかなり長くなります。
そして人間としては読みにくい。
それをもっと人間がわかりやすく、簡単にかけるものが必要。
それを実現したものです。

## 3.C言語,シェルスクリプト
アセンブリ言語で便利になりました。
とはいえまだまだ機械にわかるような超具体的な命令をしなくてはいけません。
どこの部品を動かして〜のような。

しかし人間がやりたいことって限られているものです。
極論すればものすごい長い文字を毎回打てばいいですが、
よくやることを覚えさせた方が便利ですよね？

なので、文字を出して、ファイルを作って。
のような形で命令できるものを先に用意しておく。
これが高級言語と呼ばれるものです。

## 4.Ruby,PHP,Python
これらも高級言語。
より書き方を便利にして、直感的にかけるようになりました。
これも先ほどと同じ考えで、C言語などはいちいちライブラリ（外部の機能）を呼び出す
必要がある機能が多いのですが、そういうものもあらかじめセットしておこうということです。
それによりもっと簡単にかけるようになりました。

## 5.Ruby on Rails,Laravel
いわゆる、フレームワークですね。
これも同じ。よく使うものを先に入れておくってやつです。
WEBサービスを作るならプログラミング言語だけではダメで、
WEBサーバー、マークアップ言語など色々と設定が必要です。

それを一つのパッケージにしたものが、このフレームワークです。
フレームワークを使う設定をすれば、とりあえずPC上でWEBサービスが動く環境が出来ます。
ここまで来るとかなり便利になっており、例えば複数形のsがつくか、つかないか？
だけでも全く別のものを示すようになり、理解せずに使うと問題解決が非常に困難です。

## 6.WordPress
先ほどのフレームワークでももちろんブログは作れます。
しかし、殆どのWEBサービスに対応できるように
色々なものが入っているので、ブログとはじめから決めているのであれば
不要っていうものも多い。

そんな時に利用できるのがこのWordpressです。
こちらについてはエンジニア出ない方でも非常によく使われています。
無料、有料のテーマ（着せ替えみたいなもの）があり比較的小さい労力で、
デザインに飛んだブログを作ることができます。

## 7.Amebaブログ等
所謂、無料のブログサービスですね。
Wordpressなんかはかなり便利とはいえ、
自由度も担保したものなので、初見ではそれなりに苦労することもあります。

自身でのサーバー契約や、ドメイン取得が必要だったり...
その分アフィリエイトを効果的に運用したりだとか、
デザイン性に富んだブログにして、記事を映えさせるなんてことも可能です。

しかし、単純にブログを書きたい！
細かいことはどうでもいい！
ということであれば、無料ブログサービスはかなり手軽ですね。
いくつかクリックして設定すれば完成！

しかし当然無料で借りているから、自分の入れていない広告が出たりだとか
わかりやすく不自由な面もあります。

## 機械寄り、不便、自由、ぶっ壊せる。←→人間寄り、便利、制限多い、ぶっ壊せない。
今あげた中で番号が若いもの程この傾向が強いです。
機械に直接命令するので、理解して使えば制限なく自由に動かせます。
その分入力が多くなり不便です。
特に1.〜3.あたりはやっちゃダメ！な致命的な問題をPCに起こすことも割と簡単にできます。

それについてはここに書きませんが、
実行はせず、何が起こるか見るだけにとどめて下さいね。
（大抵の記事では配慮されていると思いますが）

逆に言えば近頃プログラミングスクールなんかで扱われる、
4.は簡単にそういうことが出来ないので、
よっぽど無茶しなければ、積極的にコードを書いて実行して経験を積めるということ。
（でも実行前にコードの内容は確認して下さいね）

## 最後に
殴り書きで恐縮ですが、これが誰かのやくに少しでもたつといいなあ。と思います。
（多分ツッコミどころいっぱいありますが。。）
規則的な名前が付いたPDFを結合

#やりたいこと

タイトルのまんま．

フォルダの中に連番のPDFが入ってるのを，一つに結合する．

まあ，それだけならGUIのフリーソフトでもできるんだけど，たとえば

```console
001.pdf
002.pdf
003.pdf
003s.pdf
004.pdf
005.pdf
006.pdf
007.pdf
007s.pdf
・・・
```
みたいな感じで，`s`がはいったりしてて，それを一個一個外すのが面倒くさいのと，


```console
001.pdf
002.pdf
・・・
105.pdf
t001.pdf
t002.pdf
t003.pdf
・・・
```
って感じで，頭に`t`が入ったファイルを，以下みたいな感じに，間に入れていきたいのとで，pythonでやることにした．

```console
001.pdf
t001.pdf
002.pdf
t002.pdf
003.pdf
t003.pdf　<-003s.pdfは外す
004.pdf　　
t004.pdf
・・・
```

#組んだソースコード
PyPDF2ってのがあるらしい．
また，ファイルの有無はosライブラリを使う．

ちなみに，作業ディレクトリの下にPDFファイルが入った`test`って名前のディレクトリがある，という構造．
ファイルは連番で140まで．

```python
import PyPDF2
import os

merger = PyPDF2.PdfFileMerger()

Dir = "test"

for i in range(140):
    Filename1 = "./"+Dir+"/%03d.pdf" % i
    Filename2 = "./"+Dir+"/t%03d.pdf" % i
    if os.path.isfile(Filename1) :
        merger.append(Filename1)
    if os.path.isfile(Filename2) :
        merger.append(Filename2)

merger.write('%s.pdf' % Dir)
merger.close()
```

いたってシンプル．簡単にできました．


#参考
PyPDF2について
https://note.nkmk.me/python-pypdf2-pdf-merge-insert-split/

ファイルの有無について
https://techacademy.jp/magazine/18994
ONNXで fuse_consecutive_transposes 最適化

ONNXがサポートしている最適化 fuse_consecutive_transposes を調べてみました。

字面から連続する転置を合成してくるはず。

https://github.com/onnx/onnx/blob/master/onnx/optimizer/passes/fuse_consecutive_transposes.h

わかりやすい転置を２つ並べてみます。

```python
transpose0 = helper.make_node(
    'Transpose',
    perm = [0, 2, 1, 3],
    inputs = ['X'],
    outputs = ['transpose0_out'],
)

transpose1 = helper.make_node(
    'Transpose',
    perm = [3, 1, 2, 0],
    inputs = ['transpose0_out'],
    outputs = ['Y'],
)
```
![fuse_consecutive_transposes_optimized.onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/887d0a4e-1ca3-e299-0cb2-18e36d94035e.png)


passにfuse_consecutive_transposesを指定して、optimizer.optimizeを呼び出します。

```python
passes = ['fuse_consecutive_transposes']

optimized_model = optimizer.optimize(model_def, passes)
```

グラフを確認すると、無事fuseされています。


最適化後のtransposeを調べてみると、転置の次元もちゃんとfuseされています。

```python
attribute {
  name: "perm"
  ints: 3
  ints: 2
  ints: 1
  ints: 0
  type: INTS
}
```

全ソース

```python
import onnx
from onnx import helper
from onnx import TensorProto
from onnx import optimizer

X = helper.make_tensor_value_info('X', TensorProto.FLOAT, [1, 1, 2, 3])
Y = helper.make_tensor_value_info('Y', TensorProto.FLOAT, [3, 2, 1, 1])

transpose0 = helper.make_node(
    'Transpose',
    perm = [0, 2 , 1, 3],
    inputs = ['X'],
    outputs = ['transpose0_out'],
)

transpose1 = helper.make_node(
    'Transpose',
    perm = [3, 1 , 2, 0],
    inputs = ['transpose0_out'],
    outputs = ['Y'],
)

graph_def = helper.make_graph(
    [transpose0, transpose1],
    'test-model',
    [X],
    [Y]
)

model_def = helper.make_model(
    graph_def,
    producer_name='onnx_example'
)

onnx.save(model_def, 'onnx/fuse_consecutive_transposes.onnx')

onnx.checker.check_model(model_def)

# 最適化パスを指定
passes = ['fuse_consecutive_transposes']

optimized_model = optimizer.optimize(model_def, passes)
onnx.save(optimized_model, 'onnx/fuse_consecutive_transposes_optimized.onnx')

print(optimized_model.graph.node)

```
CloudFormationでDynamoedbを作成するYAML

# はじめに
簡単なテンプレートなので、世間に出回っているとは思いますが自分のメモのために書きます。

# テンプレートのYAMLファイル
パーティションキーとソートキーがあるテーブル、

```yaml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  famzonRequestDataDb:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: 【テーブル名】
      AttributeDefinitions:
        -
          AttributeName: 【パーティションキー名】
          AttributeType: 【データ型】
        -
          AttributeName: 【ソートキー名】
          AttributeType: 【データ型】
      KeySchema:
        -
          AttributeName: 【パーティションキー名】
          KeyType: HASH
        -
          AttributeName: 【ソートキー名】
          KeyType: RANGE
      ProvisionedThroughput:
        ReadCapacityUnits: 【読み込みキャパシティーユニット数】
        WriteCapacityUnits: 【書き込みキャパシティーユニット数】
```

パーティションキーとソートキーは、任意に決めたもの。
データ型は、下記のように設定する。
S：String
N：数値
B：バイナリ
※このブログを書くまでBの存在知らなかったです。

書き込み/読み込みキャパシティーユニット数は、整数で設定する。
ARM Template をVisual Studio 2017で作って可視化する

# 概要

ARM Templateを可視化する拡張を使ってみました。
Visual Studio Code専用です。仕事ではVisual Studio 2017を使っているので、同じような拡張があると嬉しい。

# Visual Studio 2017でプロジェクトを作成する

スタートページタブの「新しいプロジェクト」で『Azure』を検索し、『Azure リソース グループ』を選択します。C#とVBが存在しますが、今回はC#を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/2b2e03fd-fa04-e5ba-3a3c-04116a77c49e.png)

適当にプロジェクト名を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/3d42d7dc-8a4a-bec7-025f-283b7f370012.png)

ゼロから作るならblank templateから作りますが、とりあえず、可視化できればいいので、Azure テンプレートの中から `201-sql-database-transparent-encryption-create` を選択します。`Azure QuickStart(github.com/Azure/azure-quickstart-templates)`が一番豊富なようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/2139486a-f0b7-369c-8f5f-c43610a551d9.png)

自動で作成された `azuredeploy.json` を開き、JSON アウトラインを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/205b5260-4660-7cd0-996c-f400fe995036.png)

で、ここまではVisual Studio 2017です。
テンプレートから作る流れが簡単なので・・（というのは建前で良さげなVisualizerがなかったのが理由です）

# ARM Templateを可視化する

Visual Studio 2017で作ったARM TemplateをVisual Studio Codeで読み込みます。
もちろん、Visual Studio 2017で作らなくても [github.com/Azure/azure-quickstart-templates](https://github.com/Azure/azure-quickstart-templates) からCloneしてくればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/34b49d9f-a491-0be3-27a0-34a5caa401b6.png)

おもむろに `ARM Template Viewer` （拡張）をインストールしてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/8e947549-17a5-b1d1-92b8-094663175875.png)

ファイルに戻って『目』のアイコンをクリックしてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/b4730e76-c7a2-0ec1-4191-f7bfc87b97b7.png)

ARM Templateがビジュアルで表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7886/349320d5-183e-5348-6f67-feb39f7fbbfc.png)

なんか、すごい（語彙力）

# 感想

リソースを追加/**削除**するときに、親子関係を確認するのが少しだけ楽しくなりそうです。JSONとJSONアウトラインのにらめっこは辛いので・・。

ここまでご覧いただき、ありがとうございました。
【秀丸マクロ】grep

#[複数検索文字列を一発で秀丸Grep置換する](http://blog.livedoor.jp/tyottomitaikoto/archives/39502485.html)
①ディレクトリをマクロにあわせて作成
②置換対象のファイルをそこに移動
③検索文字列[タブ]置換文字列　のリストをテキストで作成
④別のウィンドウで開く
⑤そのウィンドウでマクロを実行


>参考
[連続grep置換](http://kukekko.hatenablog.com/entry/2016/08/27/164242)
[Grep結果より関数を取得するマクロ](https://hide.maruo.co.jp/lib/macro/searchfunction.html)
Rails 6 に Fort Awesome 5 を導入する

# インストール

```sh
yarn add @fortawesome/fontawesome-free
```

# application.js に import する

```sh:app/javascript/packs/application.js
import '@fortawesome/fontawesome-free/js/all'
```

# 任意のアイコンを探して適用

https://fontawesome.com/icons?d=gallery

```html
<i class='fas fa-plus fa-fw'></i>
```
HerokuにPythonアプリをデプロイしたときにハマった箇所

runtime.txtを用意してから、ローカルからのPushも、GitHub連携でのデプロイでも失敗しました。
ググっても解決せず、よくよく見たらruntime.txtの記述が間違っていたという話。

```
>git push heroku master
Enumerating objects: 27, done.
Counting objects: 100% (24/24), done.
Delta compression using up to 8 threads
Compressing objects: 100% (11/11), done.
Writing objects: 100% (13/13), 4.72 KiB | 1.18 MiB/s, done.
Total 13 (delta 2), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Python app detected
remote:  !     Requested runtime (Python-3.7.4) is not available for this stack (heroku-18).
remote:  !     Aborting.  More info: https://devcenter.heroku.com/articles/python-support
remote:  !     Push rejected, failed to compile Python app.
remote:
remote:  !     Push failed
remote: Verifying deploy...
remote:
remote: !       Push rejected to hogehoge.
remote:
To https://git.heroku.com/hogehoge.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/hogehoge.git'
```

runtime.txtの`Python`の`P`が大文字になっているのが原因でした。

```:runtime.txt
python-3.7.4
```

のように小文字にしてあげたら、無事デプロイに成功しました。
bootboxのconfirmで複数の入力チェックでのメッセージ表示を行おうとした

## 何をしようとしたか
画面から更新ボタンが押された時に入複数の入力チェックを行い、
チェックに引っかかった場合はそれぞれの入力チェックにあった確認メッセージをbootboxで表示、確認を行おうとしました。

## 初めに書いたコード
以下のコードでは確認ダイアログが表示されませんでした。

```Javascript
$('#koushin').on('click', function() {
    let msg = '';

    // 確認１ 確認ダイアログ表示
    if (koumoku1) {
        bootbox.confirm("日付が○日以下ですがよろしいですか？", function(result) {
            if(!result) {
                return false;
            }
        });
    };

    // 確認２ 確認ダイアログ表示
    if (koumoku1) {
        bootbox.confirm("項目２が変更されていますがよろしいですか？", function(result) {
            if(!result) {
                return false;
            }
        });
    };

    // 更新処理を実行
    koushin();
    return true;
});

function koushin() {
    // 更新処理
};
```
想定では`bootbox.confirm( ~ `の箇所で毎回確認ダイアログが表示されると考えていた。

## なぜ想定通りに動作しなかったのか
コールバック関数で、onでの処理完了後にダイアログが呼び出されるため。

## 考えた解決方法
表示させる確認メッセージは別々に表示させないと行けないものでは無かったため、１回で表示させることによってこの問題を解決しました。

```Javascript
$('#koushin').on('click', function() {
    let msg = '';

    // 確認１
    if (koumoku1) {
        msg = msg + "日付が○日以下ですがよろしいですか？" + "<br>";
    };

    // 確認２
    if (koumoku2) {
        msg = msg + "項目２が変更されていますがよろしいですか？";
    };

    // 確認ダイアログ表示
    if(msg) {
        bootbox.confirm(msg, function(result) {
            if(result) {
                koushin();
                return true;
            } else {
                return false;
            }
        });
    }

    // 確認する事がない場合は確認ダイアログを表示せずに更新
    koushin();
    return true;
});

function koushin() {
    // 更新処理
};
```

bootboxに表示させるメッセージを改行させるときは`\r\n`ではなく`<br>`とhtmlタグを付けないと行けないことも合わせてこのときに知ることが出来ました。
確認１のメッセージのみに入力チェックが引っかかった場合、msgの後ろに`<br>`がついてしまいますが、対象のブラウザ(IE11)ではありなしで表示に差が無かったため、そのままにしました。
Microsoft Azure Fundamentals に合格したときの具体的な学習法

# Microsoft Azure Fundamentals とは
合格すると、**Microsoft Certified Azure Fundamentals** という資格を取得できる試験です。
Azureの案内ページによると、この資格をもっていれば、

**Cloudの概念、コアな Azure サービス、Azure の価格とサポート、および Cloud セキュリティ、プライバシー、コンプライアンス、信頼の基礎について理解していることの証明。**

が、できるとのこと。

# 難易度
感覚的には、AWS 認定クラウドプラクティショナー程度です。GCPとAWSのアソシエイトよりは、はるかに簡単でした。

IT系に関わらずだと、簿記3級よりちょっと難しい程度です。

Azureはプロジェクトで触ったことがないが、AWSは数プロジェクトで触ったというレベル感の筆者だと、約1ヶ月の学習で、実試験の正答率は8割程度でした。

# 学習方法
ポータルサイトの下記ラーニングパスモジュールを2回読みました。

https://docs.microsoft.com/ja-jp/learn/paths/azure-fundamentals/

URLのパスにも書いてますし、まさに試験（資格）のために必要なドキュメントと言ってよいかとおもいます。

これを1回読んで、試験前にもう一回読みました。内容はそんなに厚くないですが、文量がまぁまぁあるので1日1時間程度しか時間とれないと1週間かかります。

※Azure側によると目安は9 時間 35 分とのことですが、多少は時間を圧縮して読めます

次に、1つランクのあがる**Microsoft Azure Administrator**用のラーニングパスモジュールを読みました。
こちらは少し難易度もあがりますし、さらに文量も増えるので、正直流し読み一回です。

https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RWtY7Z

上記にある、以下5つを読みました。

https://docs.microsoft.com/ja-jp/learn/paths/azure-fundamentals/index
https://docs.microsoft.com/ja-jp/learn/paths/secure-your-cloud-data/index
https://docs.microsoft.com/ja-jp/learn/paths/manage-resources-in-azure/index
https://docs.microsoft.com/ja-jp/learn/paths/administer-infrastructure-resources-in-azure/index
https://docs.microsoft.com/ja-jp/learn/paths/administer-containers-in-azure/index

Azureのドキュメントは「あるプロジェクトを任されたA氏は・・」的な物語風のものも多く、個人的には、GCP、AWSのドキュメントを読むよりも随分読むのが楽でした。日本語への翻訳率＆精度も高かったです。

他にも無料で使えるパートナー用のドキュメントや、お金を払っての模擬試験もありますが、手っ取り早く無料でとっちゃいたいという方は、参考ください。
Windows で外部ストレージを書き込み禁止にする

# 概要

中身に変更を加えたくない外付けハードディスク等を Windows に接続するときは、レジストリを書き換えることで書き込み禁止にすることができる。

# お断り

* Windows 10 で検証
* すべての外付けデバイスに効くかどうかは無保証
* 本当に1バイトも書き換えられないのかは無保証

# 手順

## 書き込み禁止

下記の内容のテキストファイルを作成し、`.reg` という拡張子で保存して実行する。私の環境では OS の再起動をしなくても効いた。

```
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies]
"WriteProtect"=dword:00000001
```

試しに USB メモリを挿して適当なファイルを書き込もうとすると、下記のエラーになる。

<img width="337" alt="kinshi.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104866/c7281ef8-ee53-bc21-ab49-24b8a8e22ab4.png">

## 書き込み許可

元に戻すときは、同様に下記を実行する。

```
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\StorageDevicePolicies]
"WriteProtect"=dword:00000000
```

もしくは、作成されたレジストリを regedit で削除しても良い。
ONNXで fuse_consecutive_squeezes 最適化

ONNXがサポートしている最適化 fuse_consecutive_squeezes を調べてみました。

最適化をしている箇所はここ。
https://github.com/onnx/onnx/blob/master/onnx/optimizer/passes/fuse_consecutive_squeezes.h

コメントの方がわかりやすい。

```C++
// Before:
//   X is a tensor with shape=[1, 1, 2, 3, 1, 5, 1]
//   Y = Squeeze(X, axes=[1, 4]) -> shape=[1, 2, 3, 5, 1]
//   Z = Squeeze(Y, axes=[0, 4]) -> shape=[2, 3, 5]
// After:
//   Z = Squeeze(X, axes=[0, 1, 4, 6])
```

連続するSqueezeがまとめられるなら、一つのSqueezeにfuseします。

最適化前のグラフ

![fuse_consecutive_squeezes.onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/3859dd44-9f55-1bf7-f8ef-5bb224d4ba89.png)


passにfuse_consecutive_squeezesを指定して、optimizer.optimizeを呼び出します。

```python
passes = ['fuse_consecutive_squeezes']

optimized_model = optimizer.optimize(model_def, passes)
```

最適化後のグラフ

![fuse_consecutive_squeezes_optimized.onnx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327/86100ea1-4a36-952b-a7fb-00bd673d75a6.png)


上手く消えてました。

全ソース

```python
import onnx
from onnx import helper
from onnx import TensorProto
from onnx import optimizer

# Before:
#  X is a tensor with shape=[1, 1, 2, 3, 1, 5, 1]
#   Y = Squeeze(X, axes=[1, 4]) -> shape=[1, 2, 3, 5, 1]
#   Z = Squeeze(Y, axes=[0, 4]) -> shape=[2, 3, 5]
# After:
#   Z = Squeeze(X, axes=[0, 1, 4, 6])


X = helper.make_tensor_value_info('X', TensorProto.FLOAT, [1, 1, 2, 3, 1, 5, 1])
Y = helper.make_tensor_value_info('Y', TensorProto.FLOAT, [2, 3, 5])

squeeze0 = helper.make_node(
    'Squeeze',
    axes = [1, 4],
    inputs = ['X'],
    outputs = ['squeeze0_out'],
)

squeeze1 = helper.make_node(
    'Squeeze',
    axes = [0, 4],
    inputs = ['squeeze0_out'],
    outputs = ['Y'],
)

graph_def = helper.make_graph(
    [squeeze0, squeeze1],
    'test-model',
    [X],
    [Y]
)

model_def = helper.make_model(
    graph_def,
    producer_name='onnx_example'
)

onnx.save(model_def, 'onnx/fuse_consecutive_squeezes.onnx')

onnx.checker.check_model(model_def)

# 最適化パスを指定
passes = ['fuse_consecutive_squeezes']

optimized_model = optimizer.optimize(model_def, passes)
onnx.save(optimized_model, 'onnx/fuse_consecutive_squeezes_optimized.onnx')
```
初心者によるプログラミング学習ログ115日目


#　100日チャレンジの115日目。

Twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

115日目は、


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>115日目<br><br>表示できなくなっていたvue.jsの環境構築やり直し<br>UdemyでVue.js<br>メンターさんから課題のコードレビュー<br>ドットインストールで三択クイズ<br>やりました<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1178420083258867712?ref_src=twsrc%5Etfw">September 29, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

* UdemyでVue.jsの動画学習および、環境再構築
* MENTA:メンターさんの課題のコードレビューを受けた
* ドットインストールでjavaScriptの三択クイズ作成

## コードレビューを受けた結果

指摘事項はいろいろあったのですが、ざっくりというと、

* 変数名と関数名は、キャメルケースで命名すること
* 変数名と関数名は、なるべく具体的な名前をつける
* 再代入する必要あるもの→let,それ以外はconst
* 演算子の前後は空白を入れる


など。
基本的なことがわかっていなかったので、指摘うけて良かったです。

ちなみにキャメルケースとは、
camelCase(キャメルケース)のこと。

単語の先頭を大文字にする命名規則のことです。
引数がある初期化関数を用いた, defaultdictの実装 (Python)

## 目的
keyを引数とする関数で初期化を行うようなdefaultdictの実装

## 通常のdefaultdict
通常のdefaultdict. dictの初期化が, 与えた関数に従って行われます.

```python
>>> from collections import defaultdict
>>> dd = defaultdict(int)
>>> dd[1] += 1  # dd[1] = (0 + 1)
>>> dd
defaultdict(<class 'int'>, {1: 1})
```

lambda式関数などで, 自作の関数を用いることもできます.

```python
>>> dd = defaultdict(lambda: 10)
>>> dd[1] += 1  # dd[1] = (10 + 1)
>>> dd
defaultdict(<class 'int'>, {1: 11})
```

しかし, defaultdictの関数に用いることができるのは, 引数なしの関数のみとなっており,
例えば, $f(x) = 2x$ という関数で初期化を行いたい場合, 通常のdefaultdictで実現することはできません(たぶん).

## 引数ありのdefaultdictの実装

まず, 通常のdefaultdictを簡単に自作しようとすると, 以下のようになります.

```python
# defualt dictの実装
class SimpleDefaultdict(dict):
    def __init__(self, func):
        self.func = func
    def __getitem__(self, item):
        if item not in self:
            self[item] = self.func()
        return super().__getitem__(item)
```

`dict`を継承して実装していて, `__getitem__` で[]参照されたときの処理を定義しています. itemが辞書dになければ, 与えた関数の返り値で初期化を行う具合ですね.
余談ですが, もし `__getitem__`の返り値を`return self[item]`にしてしまうと, `self[item]`の計算時に`__getitem__`が呼ばれ, またその計算時に`__getitem__`が呼ばれて...が繰り返されて無限再帰となってしまうので注意が必要です.

<br>
これを踏まえると, 引数ありの関数でのdefualt dictは次のようにすれば作成できます.

```python
# 引数ありの場合
class MyDefaultdict(dict):
    def __init__(self, func):
        self.func = func
    def __getitem__(self, item):
        if item not in self:
            self[item] = self.func(item)  # <-- ここが変わった
        return super().__getitem__(item)
```

初期化の際に関数に引数を与えています. 実際に$f(x) = 2x$ という関数で初期化を行う場合

```python
>>> mdd = MyDefaultdict(lambda x: 2*x)
>>> mdd[1]
2
>>> mdd
{1: 2}
```

できていますね.


## まとめ
dictクラスを継承して, 引数ありの関数によるdefaultdictを実装しました.
G検定学習メモ（ニューラルネットワーク）

G検定の勉強を始めたので、備忘録としてざっくりUPします。

ニューラルネットワークとは、ニューロンという単純な数値予測を行う予測器を
沢山繋げてできる予測器である。
※ニューロンはニューラルネットワークの最小単位である。

ニューラルネットワークは左から入力されて演算を繰り返しながら右へと進み
最終的には出力が得られる。

その工程を以下のように呼ぶ。
入力層　→　中間層（隠れ層）　→　出力層

ニューロンは入力に対して以下のように演算が行われる。
・総入力（入力の重み付け和＋バイアス）の計算
・活性化関数による出力計算

単純な数値予測をするニューロンを沢山繋げることで
複雑な予測を行おうとしている。

ディープニューラルネットワークを用いて学習、予測を行うモデルのことを
ディープラーニング（深層学習）と呼ぶ。（機械学習のアルゴリズム）
procdumpの使い方

#procdumpとは
sysinternalsのツールの一つ。プロセスを監視してダンプファイルを生成できる。

- フルダンプ
- ミニプラスダンプ
- ミニダンプ
- .netFrameworkのミニプラスダンプは取得できない。

#procdumpの実行方法【基本編】

- myapp.exeを起動しておいて当該プロセスのミニダンプを出力する
  `procdump myapp.exe`

- myapp.exeを起動しておいて当該プロセスのフルダンプを出力する
  `procdump -ma myapp.exe`  

- myapp.exeを起動しておいて当該プロセスのミニダンプを指定フォルダに出力する
  `procdump -ma myapp.exe C:\myapp\dmp` 

- myapp.exeを起動しておいて当該プロセスを5秒間隔で3回ミニダンプを出力する
  `procdump -s 5 -n 3 myapp.exe`

- 当該プロセスが5秒連続cpu使用率90％を超えたらミニダンプを出力する
  `procdump -c 90 -s 5 myapp.exe` 

#procdumpの実行方法【障害対応編】
procmonとprocdumpを合わせて使用する

- procmon側の設定
 1. procmonで「監視対象プロセスのプロセスID」「procdumpプロセスのプロセスID」を
includeフィルターに設定
 2. プロファイルイベントを表示設定
- procdump側の設定
 1. `-e 1 -l -f ""`オプションを使い、ダンプ出力を行わず例外発生報告だけを行う。
 2. <補足> `-l`はデバック出力時に報告を行うためのパラメータ。

併用することにより、片方だけだと出力できないログがprocmonに一覧表示できるため障害対応時に有効

#dmpファイルの調査方法
WinDbg(Debugging Tools for Windows)を使う
後日勉強してまとめる。
Lambdaでタグによって、EC2インスタンスの起動停止を行う

#目的
AWSのEC2で節約のために、EC2インスタンスを必要な時間だけ起動させておくために作ったLambdaを記録。

# EC2のタグ
下記のタグをEC2インスタンス毎に設定されている前提のLambdaです。
startInstanceTime：EC2インスタンスを起動する時間
stopInstanceTime：EC2インスタンスを停止する時間
※日本時間です

例）9時に起動して、18時に停止するEC2インスタンスの場合
startInstanceTime：9
stopInstanceTime：18

# Lambdaのプログラム(python3)
CloudWatch Eventsで1時間毎に実行する前提のプログラムです。

```python
import json
from datetime import datetime, timedelta, timezone

def lambda_handler(event, context):
    import boto3
    ec2 = boto3.client('ec2')
    # 現在の時間
    hour = getNowTime().strftime('%H')

    # 起動対象のインスタンスIDリスト取得
    instanceIdStartList = getTgtList(ec2,'startInstanceTime', hour)
    if len(instanceIdStartList) != 0:
        # 起動実行
        ec2.start_instances(InstanceIds=instanceIdStartList)

    # 停止対象のインスタンスIDリスト取得
    instanceIdStopList = getTgtList(ec2,'stopInstanceTime', hour)
    if len(instanceIdStopList) != 0:
        # 停止
        ec2.stop_instances(InstanceIds=instanceIdStopList)


# 起動 or 停止のec2インスタンスIDリストを取得します。
def getTgtList(ec2, tag_key, hour):

    query = [
        {'Name': 'tag-key', "Values": [tag_key]},
    ]
    describe_instances_result = ec2.describe_instances(Filters=query)['Reservations']
    tgtList = []

    for i in describe_instances_result:
        for tags in i['Instances'][0]['Tags']:
            if tag_key in tags['Key']:
                if tags['Value'].zfill(2) == hour:
                    instanceId = i['Instances'][0]["InstanceId"]
                    tgtList.append(i['Instances'][0]["InstanceId"])

    return(tgtList)

# 現在日時を取得します。
def getNowTime():
    # AWSの時刻は、UTCなのでJSTに変換
    return datetime.now(timezone(timedelta(hours=+9), 'JST'))

```


# 最後に
おりゃ!って書いたので定数化などしてないですが、ちゃんと動きます。
こういうのはいろんな人がやってそうですが、意外と見つからなかったです。
当たり前すぎてぐぐってもでてこなかったのかも。
SPRSENSEでILI9341 SPI液晶をライブラリを競合させないで動かす方法

※これは自分用の覚書も兼ねてます。

# SPRESENSEに液晶パネルをつなぐ

まず、実際にライブラリ付属のサンプルを動かした写真から。

![EFZk5KWVAAAbiGU.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/613aabcf-ef11-42fa-37ec-dce01981f58b.jpeg)

## ハードウエア

### LCDパネル
LCDパネルは2.2インチ ILI9341を使用

私はAliexpressで購入。Amazonでも複数の業者が販売している。
https://www.aliexpress.com/item/32945052728.html?spm=a2g0s.9042311.0.0.27424c4drPFPl5

### SPRESENSE
SPRESENSEはメインボードと拡張ボードを使用

- SONY SPRESENSE メインボード CXD5602PWBMAIN1

https://amzn.to/2mnsitE

- SONY SPRESENSE 拡張ボード CXD5602PWBEXT1

https://amzn.to/2nOk0LD

### 液晶取り付け基板
**功力製作所** のLCDSP001基板を使用

- 販売サイト
https://www.switch-science.com/catalog/5728/

- 功力製作所サポートページ
https://kunutest.jimdofree.com/lcdsp001%E5%9F%BA%E6%9D%BF/

## ライブラリ

ILI9341のライブラリはSPRESENSE用にカスタマイズされたこれを使用
https://github.com/kzhioki/Adafruit_ILI9341
https://github.com/kzhioki/Adafruit-GFX-Library

使ったサンプルは
\Adafruit-GFX-Library-spresense\examples\spresense_mock_ili9341

普通にAuduino IDEのライブラリに入れると、本家のILI9341ラブラリとバッティングするので両方のライブラリを解凍したらスケッチと同じフォルダに突っ込む(こんな感じ)
![EFZ3n2jU4AEi98v.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120903/42ac3e3b-44b6-3f2a-252c-2db8d41cb3c3.png)

あとは、"Adafruit_ILI9341.h” の以下の2か所をローカル優先で参照する様に変更。

```Adafruit_ILI9341.h
// #include <Adafruit_SPITFT.h>
#include "Adafruit_SPITFT.h"
//#include <Adafruit_SPITFT_Macros.h>
#include "Adafruit_SPITFT_Macros.h"
```

ボードマネジャーでSPRESENSEのパッケージを最新版に更新後、bootloaderを再度書込む
(bootloaderはAPIを含んでいるのでパッケージのバージョンにあわせてUpdate必要)
[Windows] 休止(ハイバネーション)をできるようにする

# やりたいこと
Windows10で`休止`(英語でいうとhibernation、略してhibとかハイバネとか)が、インストール時の状態ではできない(スタートメニューの電源のところに出ていない)ので、休止できるようにしたい。

# やり方

- コントロールパネルを開く
- [表示方法]で[カテゴリ]を選択する
- [システムとセキュリティ]を押す
- [電源オプション]の[電源ボタンの動作の変更]を押す
- [現在利用可能ではない設定を変更します]を押す
- [シャットダウン設定]の中の[休止状態]に、チェックを入れる
- [変更の保存]を押す

これで、スタートメニューの電源のところに「休止」が表示される。

# 参考
https://dynabook.com/assistpc/faq/pcdata2/016713.htm