OmniAICreator/Qiita-1.07M huggingface dataset:
EC2にroleを渡せなくてトラブった話

javascript SDKで、次のような流れの処理を書こうとしていたのですが、EC2の起動時にRoleが渡せなくて週末の夜が潰れてしまったので、似たようなことをする方向けにメモしておきます。

- 一時的にRoleを作成
- EC2インスタンスを起動
- UserDataで渡したスクリプト内でゴニョゴニョする
- Roleを削除

コードは次のような感じになります。
PolicyArnには起動するEC2に許可したいポリシーのArnが入っていて、ec2Paramにはインスタンス起動時に必要な他のパラメータが全部入っていると考えてください。

```
const AssumeRolePolicyDocument = JSON.stringify({
  Version: "2012-10-17",
  Statement: {
    Effect: "Allow",
    Principal: { Service: "ec2.amazonaws.com" },
    Action: "sts:AssumeRole"
  }
});
const iam = new AWS.IAM()
await iam.createRole({ RoleName, AssumeRolePolicyDocument }).promise();
await iam.attachRolePolicy({ RoleName, PolicyArn}).promise();
const InstanceProfileName = RoleName;
await iam.createInstanceProfile({ InstanceProfileName }).promise();
await iam.addRoleToInstanceProfile({ InstanceProfileName, RoleName }).promise();

const ec2 = new AWS.EC2();
ec2Param.IamInstanceProfile={ Name: InstanceProfileName };
await ec2.runInstances(ec2Param).promise();
```

特に問題の無いコードに見えますが、これだとrunInstancesで ```InvalidParameterValue: Value (****) for parameter iamInstanceProfile.name is invalid. Invalid IAM Instance Profile name``` と言われて起動しません。
waitForでinstanceProfileExistsを待ってからrunInstancesを呼んでも状況は変わらず、どうしたもんかと悩んでいたんですがAWS forumの古い記事に答えが書いてありました(この方はRuby sdkでやっていたようです)

https://forums.aws.amazon.com/thread.jspa?threadID=107077

>
Many of the AWS APIs are eventually consistent. While the API call responds right away, it can take a variable amount of time before that resource is ready. In this case, the IAM instance profile is not available for use outside IAM yet.

つまり、IAM側で有効になっててもEC2側からは未だ見えない可能性があるよ!!ってことですね。

このフォーラムでは、ちょっと待ったらOKだったよ!みたいな話になってますが、こっちを使ってrunInstancesに成功するまで頑張ってもらった方が良さそうです。

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html#retry-event

色々ハードコーディングしていますが、こんな感じのコードで、Instance Profile name絡みでエラーが出たら、3000ミリ秒の間隔を空けて、10回リトライします。

```
let retryCount = 0;
const result = await ec2.runInstances(ec2Param)
  .on("retry", (res)=>{
    if (retryCount < 10 && res.error.code === "InvalidParameterValue" && res.error.message.endsWith("Invalid IAM Instance Profile name")) {
      res.error.retryable = true;
      res.error.retryDelay = 3000;
      ++retryCount;
    }
  })
  .promise();
```

**2019/2/13追記**
上のコード例で、callbackルーチン内でリトライ回数の判定をしていましたが、AWSConfig側にmaxRetriesというプロパティがあって、EC2の場合は3に設定されているようです。したがって、このコードのようにリトライ回数のチェックをrunInstancesの呼び出し毎に行なう場合は、EC2のコンストラクタに渡すオプションか、AWS.Config()を事前に呼び出してこちらで設定した回数より大きい値を設定しておく必要があります。
また、複数回runInstancesの呼び出しがあってリトライ回数は同じで良いような場合は、callback内でのカウントを止めて、Config側で設定してしまえば十分です。


<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br />この記事は <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">クリエイティブ・コモンズ 表示 4.0 国際 ライセンス</a>の下に提供されています。
備忘録：【Windows10】エラーが出て動かないdockerを動かすまでにしたこと

# dockerが動いてくれない・・・
ここ最近職場でdockerを使うようになり
家でも勉強がてら使おうとしたら、まぁ動かない・・・。
この類の記事を色々めぐりながら、やっと起動できたのでメモ。

# 環境
windows 10 pro
Hyper-v
Docker for Windows (docker version 18.09.1)

# 環境の準備
* Hyper-vの有効化
[Windows の機能の有効化または無効化] から設定
https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v

* Docker for Windowsのインストール
下のURLから
https://docs.docker.com/docker-for-windows/install/

# 動かない・・
職場では上記の環境の手順ですんなり動いたけど、
下記のようなエラーが出てクジラさんが真っ赤か。

```log
[10:50:14.918][NamedPipeServer][Error  ] Unable to execute Start: Unable to create: ユーザー設定変数 "ErrorActionPreference" または共通パラメーターが Stop に設定されているため、実行中のコマンドが停止しました。オブジェクトは既に存在します。
```

# ああでもない、こうでもない
色々試す。
早く結論知りたい人は読み飛ばしてください。

## 環境の準備をやり直す
* dockerのアンインストール(AppData/RoamingとC:\Program Files配下にあるdocker関連のファイルも削除)
* Hyper-vを無効化
してから再度Hyper-vの有効化とdockerのインストール。

でも動かず。

## Mobylinuxvm --create
環境準備してすんなり動くと、Hyper-vにmobylinuxvmという仮想マシンが立ち上がるが
それが見当たらないのでC:\Program Files\Docker\Docker\resources配下で
PowerShellから「.\Mobylinuxvm --create」を打ち込む。
が上記と同じエラー【オブジェクトは既に存在します。】が出る。
「.\Mobylinuxvm --destroy」を打ち込んでからやってもだめ。


## 先人の知恵をかりる。
エラーの種類は違うが、なんとか動かした人の記事を参考にいろいろしてみる。
[Docker for Windowsで起動エラーが起きた場合の対処](https://qiita.com/k_akimoto/items/182418e2d200616e7db6)
[Dockerについて　パート００１](https://qiita.com/k_akimoto/items/182418e2d200616e7db6)

しかし動かず。


# これで解決した！
GitHubで下記のissueを発見！
["ErrorActionPreference" or common parameter is set to Stop: Element not found. ](https://github.com/docker/for-win/issues/429)

どうやらネットアダプターの設定が原因らしい。
紹介されている下記のネットワークのリセットを行いました。
[How to Reset Your Entire Network in Windows 10 and Start From Scratch](https://www.howtogeek.com/265870/how-to-reset-your-entire-network-in-windows-10-and-start-from-scratch/)

__※ネットワークリセットするとネットワーク関連のソフトウェアを再インストールすることになる場合があるのでご注意を。__

# やっと動いた
ネットワークリセットして、再起動したら
正常に起動。真っ赤だったクジラさんも真っ白に。
めでたしめでたし。
Cognosでクロス集計に行番号を追加する

##はじめに
何の気もなしにQiitaと連携させているGoogle Analyticsで、自記事への検索キーワードを見てみると「クロス集計 行番号 Cognos」とありました。
検証してくれと頼まれたのではないですが、少し気になり検証してみたので結果を投稿します。

![000.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/f07de9e0-3634-59f8-995e-3513708bab99.jpeg)

##手順
###クロス集計の作成
まずはいつものサンプルデータを使用し、シンプルなクロス集計を作成してみます。
行アイテムに「製品ライン」「製品タイプ」
列アイテムに「発注方法のタイプ」
数値アイテムに「収益」を配置しています。

![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/781d409b-01a7-5df5-b988-b1da9c583932.jpeg)

###※「行番号」アイテムを使用してみる
ツールに用意された「行番号」だと、クロス集計上に配置使用としたタイミングで、メッセージが表示され配置できません。
別の方法での対応が必要そうです。
※この「行番号」をクロス集計に配置できるという方はコメントいただけると幸いです

![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/2962e73b-7ce7-d129-f9e2-2f4b197a8fe2.jpeg)

##「クロス集計スペーサー (ファクト・セル)」を使用する
「行番号」ではなく、「クロス集計スペーサー (ファクト・セル)」を使用します。
ツールの詳細設定の中に含まれている「クロス集計スペーサー (ファクト・セル)」を、クロス集計の行アイテムの右側に配置します。

![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/219ca5c2-dddf-79cd-f761-28ba80253701.jpeg)

配置したクロス集計スペーサーのプロパティから、ソースのタイプを「レポート式」に変更し、レポート式に「RowNumber ()」を入力します。
ここの入力は、関数タブのレポート関数から追加することも可能です。

![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/f6982966-5d27-0b22-940d-df00c1cc8ef7.jpeg)


##完成イメージ
レポート定義はこれまでの作業で完了しているので、あとはレポートを実行するだけです。
無事、追加したクロス集計スペーサーの箇所に行番号が表示されるようになりました。

![005.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/e6055a8f-53c0-74c4-1d6e-9170b1475060.jpeg)


##ちなみに
クロス集計の特性上、行アイテムの右側やアイテム間に配置した場合は下記のような出力結果になります。

![007.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/58468d59-78ee-d35e-0e8d-37d9651c09ee.jpeg)

次のページでは上部に再度行番号が表示される。

![008.jpg](https://qiita-image-store.s3.amazonaws.com/0/146283/1d064fd3-f144-cfe6-ac2a-a5bed7ea40aa.jpeg)

どうしても「行番号は一番左側に欲しい」なんて要件がある場合には、クロス集計を諦めてリストを上手に作りこんでいくなどの工夫が必要になるかもしれません。


##さいごに
前回検索した方がこの記事にたどり着くかは不明ですが、少しでもこの記事が有益になる人がいればと思い投稿させていただきます。

また、今回はGoogle Analyticsの結果からたまたま検証してみて記事にしましたが、検証リクエストを受け付けている訳ではありませんのであしからず。
これからも気まぐれに記事を投稿させていただきます。
[Android]歩数計アプリを作ってみた。

# 歩数計
ローパスフィルタと呼ばれるフィルタリング処理を実装して歩数計をAndroidアプリで作成する。

# 1. はじめに
## 1.1 目的
 Androidアプリを作成する際に加速センサーを用いて開発できるようなる。
加速度センサーを用いて歩数計を作成する。
## 1.2 使用した技術・考え方
 スマートフォンには3軸の加速度センサーが存在する。
 
 ![3軸センサー](https://imgur.com/ffXnJuh.jpg)
 
 これらの加速度センサーから得られる加速度の増減を利用して歩数をカウントする。
 しかし、スマホがどのような状態で保持されているか分からないため、1軸の加速度だけでは正確に計測できない可能性がある。
 そこで3軸の加速度を合成した以下の値の増減を利用して歩数を計測することにする。
 
 ![合成値](https://imgur.com/q3j4d8v.jpg)
 
 歩行時、3軸の加速度を合成した値を取り、3軸の加速度を合成した値の極大値を取った回数を歩数としてカウントする。
 
 ![極大値カウント](https://imgur.com/j83uyPB.jpg)
 
 また、センサーから取得した生のデータには歩数計算に邪魔なノイズが含まれるため、余分なノイズを取り除き、
 なるべく正しい歩数をカウントできるようにローパスフィルタと呼ばれるフィルタリング処理を行う。
 ローパスフィルタとは高周波成分を取り除いて、低周波成分のみを取り出す処理である。
 
 ![ローバスフィルタ](https://imgur.com/zI6u6W1.jpg)
 
# 2. 結論
## 2.1 使用したプログラム

[GitHubを参照](https://github.com/TsubasaSato/Pedometer)
- MainActivity.java を参照
- activity_main.xml を参照

## 2.2 実行画面
 アプリを起動するとこの画面が表示される。
 
 ![起動画面](https://imgur.com/62SInm3.jpg)

 Startボタンを押すとこの画面が表示される

 ![Startボタンを押した後](https://imgur.com/65XJtJZ.jpg)
 
 他にもRestartボタンは押されると歩数を0歩に初期化することができる。
 Stopボタンを押すと計測をいったんストップすることができる。
 
 ![実際に歩いて計測](https://imgur.com/pi2yErF.jpg)
 
 実際に歩いて計測した。14歩歩いたが、計測上では16歩となってしまった。
 2歩分の誤差が生まれてしまった。改善の余地あり
firebase initしても何もファイルが作成されないときの対処法

Firebaseを使用するにあたって、最初に実行するコマンド**firebase init**ですが、
本来コマンドを実行すると下記の画像のようなファイル・ディレクトリが作成されるのですが、
コマンドを実行しても何もファイル・ディレクトリが作成されない場合の対処法メモです。
<img width="370" alt="スクリーンショット 2019-01-28 11.41.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/88012/6ef37b8e-9ea4-b5e8-7ab6-d8f7d37fe42b.png">

（先日Firebaseハンズオンに参加した際に、参加者45人中 僕だけが出くわしたレアなトラブルだったようなのでメモを残しときます）
https://fjug-osaka.connpass.com/event/117752/
https://twitter.com/fumizooooo/status/1089047954969657345

#上位階層にfirebase.jsonが存在しないか確認・削除
**firebase init**を実行したディレクトリの上位階層に**firebase.josn**が存在する場合は、ファイルが作成されないので対象ファイルを削除した後、再度**firebase init**を実行しましょう。

##例）「firebase_test_child」ディレクトリでコマンド実行

**失敗する例**
<img width="541" alt="スクリーンショット 2019-01-28 11.59.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/88012/1d03f403-3e5e-8ade-26bb-cf8e2b9559a3.png">

**成功する例**
<img width="547" alt="スクリーンショット 2019-01-28 12.01.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/88012/b56ab9a8-7d62-87c3-ec55-561ecddca041.png">

##ホームディレクトリも要確認
僕の場合は、ホームディレクトリ内に**firebase.json**が見つかりました。
間違ってホームディレクトリで**firebase init**しちゃってたみたいです（汗）

```
/Users/ユーザ名/
```
Railsでunicornを使う

# 
Railsのデフォルトはpumaだが、unicornを使う必要性が出てきたのでアプリケーション・サーバーを変更したときのメモ。

## 環境
Rails 5.1.6
Ruby 2.3.6

# 手順
## Gemfileに記載

``` Gemfile
gem 'unicorn'
```

## unicorn.rbの設定
``` config/unicorn.rb
app_path = "/app" # アプリケーションに合わせて変更

case ENV['RAILS_ENV']
when 'production'
  worker_processes Integer(ENV["WEB_CONCURRENCY"] || 4) # ワーカー数の設定
else
  worker_processes 2
end

listen "/tmp/unicorn.sock", backlog: Integer(ENV["UNICORN_BACKLOG"] || 64) # バックログ数(裏で持っておくタスク)の設定

working_directory app_path

listen 8080 # unicorn用のポート

pid "#{app_path}/run/unicorn.pid" # このディレクトリを予め用意しておく

stderr_path "#{app_path}/log/unicorn.stderr.log"
stdout_path "#{app_path}/log/unicorn.stdout.log"

preload_app true

# use correct Gemfile on restarts
before_exec do |server|
  ENV['BUNDLE_GEMFILE'] = "#{app_path}/Gemfile"
end

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!

  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end

  sleep 1
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

```

## pidファイルの置き場所を用意
今回はapp/run/配下にpidファイルを置く設定にしているので。app/run/.keepを作って保持しておく。
AWSの移行サービス

##1.AWS Application Discovery Service##

オンプレミスで実行されているアプリケーション、その依存関係、およびパフォーマンスプロファイルを自動的に識別することで、SIがすばやく確実にアプリケーションを移行するのに役立ちます。
サーバー、ストレージ、ネットワーク機器から設定や使用状況のデータを自動的に収集します。
これらを利用して、アプリケーションのリストや動作方法、相互依存性を作成できます。
この情報は暗号化されたフォーマットで AWS Application Discovery Service データベースに保持され、CSV または XMLファイルでお好きな仮想化ツールまたはクラウド移行ソリューションにエクスポートできます。



##2.AWS Database Migration Service##
データベースを簡単かつ安全に移行します。
移行中でもソースデータベースは完全に利用可能な状態に保たれ、データベースを利用するアプリケーションのダウンタイムは最小限に抑えられます。
異なるデータベースプラットフォーム間の移行もサポートしています。




##3.AWS Server Migration Service##
数千のオンプレミスワークロードを簡単に短時間で AWS に移行できるエージェントレスサービスです。
ライブサーバーのボリュームの増分レプリケーションを自動化、スケジュール設定、追跡できるため、大規模なサーバーの移行を簡単に処理することができます。



##4.AWS Snowball　AWS Snowball Edge　AWS Snowmobile##

|サービス名|説明|
|----------|--------------------|
|AWS Snowball|セキュアなアプライアンスを使用し、AWS との大容量データ転送を行うペタバイト規模のデータ転送ソリューションです。<br> [オリジナル Snowball デバイスは利用不可になったため、Snowball Edge Storage Optimized がデータ転送に使用される主要なデバイスになりました。](https://aws.amazon.com/jp/snowball/faqs/)|
|AWS Snowball Edge|オンボードのストレージとコンピューティング能力を搭載したデータ転送デバイスです。<br>Snowball Edge Storage Optimizedは80TB、Snowball Edge Compute Optimizedは42TBのストレージ容量があります。|
|AWS Snowmobile|大規模なデータを AWS に移動する際に使用するエクサバイト規模のデータ転送サービスです。|
JetBrains製品でSSH接続時に秘密鍵が利用できない場合の一時対処法

_この記事はmacOS 10.14(Mojave)以上、Xcode 10.1、PhpStorm 2018.3.3を利用した環境で書いています。_

_(JetBrains製品の**2019.2**以降でこの問題は解決されています。（2019年10月4日更新）)_

はじめましての投稿です、こんにちは。
最近MacBook Proを買い換えてウキウキしながら開発したりしてます。

新しいPCは新しい環境に全部リセットしてイチから環境構築しようと思い、新規にインストールしたり、色々設定し直したりしていたところ、掲題の問題に当たったので共有します。

# 何が起きたか

手元の環境で`ssh-keygen`で生成した秘密鍵が、PhpStorm(2018.3.3)上では鍵のフォーマットが正しく無いと言われて使用できず、IDE上から開発環境へ接続できなくなりました。
<img width="607" alt="現象発生時のSFTP接続設定画面" src="https://qiita-image-store.s3.amazonaws.com/0/17603/71e08301-8178-0042-2553-e1e388efdfd7.png">


# 結論

先に結論を書くと、接続に使用するキーペア生成時に`-m PEM`オプションを指定して生成し、そのキーペアを使用する。

```shell
ssh-keygen -t rsa -b 2048 -m PEM
```


# 何故できなかったのか

OpenSSH 7.8以降で、鍵ファイルを生成する際、デフォルトでOpenSSH形式の鍵ファイルが生成されるようになったようです。

[【OpenSSH 7.8】秘密鍵を生成する形式が変更になった件について ｜ DevelopersIO](https://dev.classmethod.jp/server-side/network/openssh78_potentially_incompatible_changes/)

## どういうことか

これまで、`ssh-keygen`コマンドで公開鍵/秘密鍵を生成すする場合、デフォルトはPEMフォーマットで出力されていました。
鍵ファイルの見た目としては下記の様になります。

```text:~/.ssh/id_rsa.pem
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
```

これが、

```text:~/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
```

というフォーマットになっており、このフォーマットには掲題製品は現時点(2019/01/28 現在)では未対応のようで、正しく認識されないようです。


この問題については既にIssuesにも上がっていて、今後対応される可能性もあります。
[Support OpenSSH format private keys : PY-33521](https://youtrack.jetbrains.com/issue/PY-33521)

~~今後のアップデートで対応されることを願います:)~~
2019.2.3 現在ではこの問題は対応されました。（2019年10月4日現在）

# 問題を確認した環境

私が今回の問題に当たったときの環境は **macOS 10.14 (Mojave)**、**Xcode 10.1** を利用していました。
Xcode 10.1のCommand Line Toolsでは**OpenSSH 7.9**となっており、キーペア生成時にオプションを指定せずデフォルトで生成すると、この問題に当たりました。

```shell
% ssh -V
OpenSSH_7.9p1, LibreSSL 2.7.3
```

# 謝辞

この問題に当たってた所、[Twitter上](https://twitter.com/yusuke/status/1089516037056356354)で @yusuke さん上記Issuesを教えていただきました。ありがとうございました。
今日の記録3　主に java

#sourceコマンドとは
ファイルに書かれたコマンドを現在のシェルで実行する。
シェルの設定ファイル（環境設定等)の内容をログインし直さず、即座に反映させたい時に役立つ。

#Java
##unmodifiableList
呼び出し元でaddやremoveが出来なくなる。読み取り専用となる。

##Javaオーバーライド
戻り値の変更もオーバーライドで出来ると思ったけどできなかった。

>オーバーライドする側とオーバーライドされる側の戻り値の型、メソッド名、引数の型、引数の数、引数の並び順が同じであること。
http://www.techscore.com/tech/Java/JavaIntro/7/

##Map
###MapのentrySetとkeySet
keySetはkeyの情報だけを必要とする場合に、
entrySetはkeyとvalue両方を必要とする場合に
それぞれ使い分ける。

補足：　エントリ（キーと値のペア）

###サンプルコード：　キーと値両方取り出したい場合

```java
map.entrySet().stream().forEach(e -> System.out.println(e.getKey()+e.getValue())
```

###サンプルコード：　キーだけを取り出したい場合

```java
map.keySet().stream().forEach(System.out::println);
```

###サンプルコード：値だけを取り出したい場合

```java
map.entrySet().stream().map(Map.Entry::getValue).forEach(System.out::println);
```

##ストリームからコレクションや配列などを生成する方法
例：7文字のキーのみををリストに変換

```java
List<String>list=
   map.keySet().stream().filter(e->e.matches("\\w{7}")).collect(Collectors.toList());
```

様々な型変換のやり方はp258を参考にする



###多次元配列をループを使わずにプリントする方法
参考サイト：https://teratail.com/questions/102877

4×13のtable配列が宣言されていたとする。
各要素はトランプの絵柄に対応して順に数字が入っている。

```java

Card[][] table = new Card[Card.SUIT_NUM][Card.CARD_NUM];
    table[0][1] = new Card(1, 2);
    table[1][4] = new Card(2, 5);
    table[2][5] = new Card(3, 6);
    List<Card[]> cards = Arrays.asList(table);
    cards.stream().map(Arrays::toString).forEach(System.out::println);
// Arrays.deepToStringでも出来る
// System.out.print(Arrays.deepToString(table).replaceAll("],",
// System.lineSeparator()).replaceAll("null", ".."));
//必要に応じて、replaceAllで文字を置換する
```

出力結果

```
[null, S2, null, null, null, null, null, null, null, null, null, null, null]
[null, null, null, null, D5, null, null, null, null, null, null, null, null]
[null, null, null, null, null, C6, null, null, null, null, null, null, null]
[null, null, null, null, null, null, null, null, null, null, null, null, null]
```

解説：
`cards.stream().map(Arrays::toString).forEach(System.out::println);`
map: 各要素の変換（各要素を倍にする等)
::　　：　ダブルコロンは**メソッド参照** と呼ばれる。　　
　　　　　クラスメソッドやインスタンスメソッドをLambdaの実装として利用することが出来る。

##並列処理のオーバーヘッド
並列化処理をすると早くなると言われているが、オーバーヘッドの可能性もあるため、逆に遅くなることもある。

並列化オーバーヘッドについての参考サイト
http://web.yl.is.s.u-tokyo.ac.jp/pl/abclf/ipa-final/reports/html/5/6/node23.html

#実装テクニック
Javaは参照渡しなので、読み取りだけを目的としたメソッド(特にget）の実装は注意する。
Listをgetするのであれば、unmodifiableListを使う
vue/dist/vue.esm.js を使わない方法

## vue/dist/vue.esm.js を使いたくない

Vueの入門者が最初に躓きがちな問題として、「自分の環境でVue公式のサンプル通りにコンポーネントを書いてみても動かない！」ということがあると思う。
大抵はVueのimportの書き方が問題になる。この解決策として、「`import Vue from 'vue'`ではなく`import Vue from 'vue/dist/vue.esm.js'`を使いましょう」という方法が紹介されていることが多いと思う。
これは、`import Vue from 'vue'`と書いたときに読み込まれる「ランタイム限定ビルド（vue.runtime.esm.js）」ではなく、「完全ビルド（vue.esm.js）」を使うようにする書き方なのだけど、なるべくランタイム限定ビルドを使ったほうが良いですよーというのが[公式のおすすめ](https://jp.vuejs.org/v2/guide/installation.html#%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0-%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%A8%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E9%99%90%E5%AE%9A%E3%81%AE%E9%81%95%E3%81%84)。

> ランタイム限定ビルドは完全ビルドに比べおよそ 30% 軽量なため、利用できるときにはこれを利用したほうが良いでしょう。

結構な差で軽量。そんなにランタイム限定ビルドのほうが軽量と言われたらそっちを使いたくなる。

## なぜvue/dist/vue.esm.jsが必要なのか。

Vueで`el`オプションを使ったときや、`template`オプションに直接HTMLのテンプレートを渡す場合は実行時にコンパイラが必要になるので、完全ビルドを使わざるを得なくなってしまう。
なので、ランタイム限定ビルドを使用するためには、コンパイラが必要ないコードにする必要がある。

このあたりに関しては、この記事がめっちゃ詳しい。
[Vue2.x系のハマりどころ templateとコンパイラを完全解説するよ](https://aloerina01.github.io/blog/2017-03-08-1)

## vue/dist/vue.esm.jsを使わない方法

templateオプションでcreateElementを使って頑張ったりJSXを渡ったりしたり[vue-template-loader](https://github.com/ktsn/vue-template-loader)を使ったりすればよいかもしれないが、別のパッケージを入れたり面倒。なるべく今までと同じように書きたい。

単一コンポーネント（.vue）に書いたテンプレートに関しては、ビルド時にコンパイルされるため、実行時に完全ビルドは必要なくなる。なので、elオプションもtemplateオプションも使わずに、**全部コンポーネントに書いてしまう**方法がある。
もちろん、単一コンポーネントをビルドできるようにしておく必要はある。

例えば、数字をクリックするとカウントアップするVueアプリのコードがこれ。

```index.html
<div id="app"><span @click="increment">{{count}}</span></div>
```

```index.js
import Vue from 'vue/dist/vue.esm.js'

document.addEventListener('DOMContentLoaded', () => {
  new Vue({
    el: '#app',
    data: {
      count: 0
    },
    methods: {
      increment () {
        this.count++
      }
    }
  })
})
```

このコードでは、html側にテンプレートが書かれているので、実行時コンパイルのために完全ビルドが必要になる。

このhtmlのテンプレートを単一コンポーネント側に持っていき、script部分はコンポーネントそのままではなく`Vue.extend`を使用してVueのサブクラスコンストラクタを作成する。これならhtmlテンプレートが単一コンポーネント内に収まるため、ビルド時にコンパイルされ実行時コンパイルは不要になる。
次のようにする。

```index.html
<div id="app"></div>
```

```index.js
import App from '../app.vue'

document.addEventListener('DOMContentLoaded', () => {
  const app = new App
  app.$mount('#app')
})
```

```html:app.vue
<template>
  <span @click='increment'>{{count}}</span>
</template>

<script>
import Vue from 'vue'

export default Vue.extend({
  data: () => {
    return {
      count: 0
    }
  },
  methods: {
    increment () {
      this.count++
    }
  }
})
</script>
```

重要なのは、`$mount`を使ってちゃんとマウントしてあげること。
elオプションを使わない場合は、自分で任意のタイミングで`$mount`する必要がある。

これで完全ビルドを使う必要がなくなり、めでたしめでたし。
Highchartsの画像ダウンロードメニュー日本語化方法

# はじめに
データのビジュアライズにHighchartsを使っています。
Highchartsの公式サイトはこちら
[Interactive JavaScript charts for your webpage | Highcharts](https://www.highcharts.com/)

Highchartsは商用利用だと有償になりますが、簡単に見栄えの良いグラフが作れるので有償ならば一択な感じです。
どのようなグラフが作れるかはデモサイトが参考になります。
[Highcharts demos | Highcharts](https://www.highcharts.com/demo/)

今回、グラフの右上にある画像ダウンロードメニューの日本語化方法を説明します。
![図.png](https://qiita-image-store.s3.amazonaws.com/0/270785/ea77fc09-2d57-ffc8-2cb3-a04ee0f2bf4e.png)

# 画像ダウンロードメニューの日本語化方法
Highchartsのグローバルオプションとして最初に以下のように設定するだけです。

```javascript:
Highcharts.setOptions(
    {lang:
        {
            contextButtonTitle: '画像としてダウンロード',
            printChart:         'グラフを印刷',
            downloadJPEG:       'JPEG画像でダウンロード',
            downloadPDF:        'PDF文書でダウンロード',
            downloadPNG:        'PNG画像でダウンロード',
            downloadSVG:        'SVG形式でダウンロード'
        }
    }
);
```
※`contextButtonTitle`はボタンにマウスオーバーした際にツールチップ表示されるテキストです。

# おわりに
データのビジュアライズによくHighchartsとChart.jsは比較されますが
商用利用にあたってはHighchartsは有償のため、その分オプション設定などはHighchartsの方が充実しています。
ただ、指定できるオプションが非常に多く便利な設定も忘れがちになるため、備忘録的にメモしていきます。
Rails✖️Prawn✖️Gruff のただのメモ

#Gruff::new

```ruby

def spider_graph_report(building)
  #参考に
  #https://d.conma.me/entry/20081011/1223736412
    stroke_axis
    #平均点をハッシュで返す
    @score = building.parts.group(:part_type).average(:score)
    g = Gruff::Spider.new(7, '535x400')
    # タイトル
    #g.title = '部位ごとの点数'
    # 使うフォント
    #g.font = File.expand_path('artwork/fonts/meiryo.ttc', RAILS_ROOT)
    g.font = "vendor/fonts/ipaexg.ttf"
    # グラフの目盛りの最大値
    g.maximum_value = 6.0
    # グラフの目盛りの最小値
    g.minimum_value = 0
    g.no_data_message = 'データがありません'
    @score.each do |key ,value|
      value = value.to_f
      g.data "#{key}", [value]
    end
    g.data "壁10", [5.5]
    g.data "壁10", [6.5]
    g.data "壁10", [5.5]
    g.data "壁10", [4.5]

    # g.theme = {
    #   :colors => ['black', 'grey'],
    #   :marker_color => 'grey',
    #   :font_color => 'black',
    #   :background_colors => 'transparent'
    # }

    #g.theme_rails_keynote
    g.theme_keynote

    # g.theme_37signals
    # g.theme_greyscale
    # g.theme_keynote
    # g.theme_odeo
    # g.theme_pastel
    #g.theme_rails_keynote

    g.bottom_margin = 80
    g.top_margin = 60
    #g.title_font_size = 70
    g.legend_font_size = 35
    # marker_font_size
    # title_font_size グラフのタイトルのフォントサイズ
    # legend_font_size  凡例のフォントサイズ
    # legend_box_size 凡例のサイズ

    #ファイルとして置く
    #g.write(filename=File.expand_path('graphs/status.png', RAILS_ROOT))

    # うまくいかなかったらこっちで
    # #g.write("tankyou#{g.object_id}.png")
    # #image "tankyou#{g.object_id}.png"
    # 画像の表示

    #graphsフォルダ配下に画像を保存
    g.write(filename=File.expand_path("graphs/#{g.object_id}.png"))
    image "graphs/#{g.object_id}.png"
end

```
OpenCVの画像(nd_array)の取扱いと構造のメモ

## 取扱い方
* カラー画像の読み込み

```
img = cv2.imread( img_path )
```

* 画像の表示

```
cv2.imshow(window_name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```


* グレースケール化

```
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
```

* HSV変換

```
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
```

* ヒストグラム平坦化(gray)

```
gray_flat = cv2.equalizeHist(gray)
```

* ヒストグラム平坦化(color)

カラー画像のヒストグラム平坦化はHSV空間のvalue(明度)を対象に行う

```
hsv_flat = hsv.copy()
hsv_flat[:, :, 2] = cv2.equalizeHist(hisv_flat[:, :, 2])
```


## 構造

* 画像のプロパティ

```
row, column, channel = img.shape
```

* channelの順序(BGR)

```
blue, green, red = img[:, :]
```

* channelの順序(HSV)

```
hue, saturation, value = img[:, :]
```


随時更新
Vue CLI 3プロジェクトでIE対応する


IE対応でこの記事に辿り着いてしまうことがないことを祈りつつも、もし問題にぶち当たった人のために残しておきます。

基本的にはドキュメントに従って行いました。

参考: [Browser Compatibility](https://cli.vuejs.org/guide/browser-compatibility.html)



## 環境



- @vue/cli: 3.3.0
- vue: 2.5.21



## はじめに

IEで動かない場合は大概ES6+で書いているための構文エラーが原因です。

その解決策として、二つあります。



1. 使っているモジュールで構文エラー or 自分のコード上で構文エラーだが、どのPolyfillを使えばわかる場合
2. なんかよくわからないけど構文エラーになる場合



## 1. 使っているモジュールで構文エラー or 自分のコード上で構文エラーだが、どのPolyfillを使えばわかる場合

使っているモジュールがES6などで書かれていて、IEでエラーになって動かなかったりします。

そんな時は原因になっているモジュールをトランスパイル対象に追加する必要があります。

Vue CLI 3ではvue.config.jsの `transpileDependencies` オプションを指定します。



``` js
// vue.config.js
module.exports = {
.
.
.
	transpileDependencies: ['my-module'], // node_modulesにあるトランスパイル対象リスト
}
```



一方で、どのpolyfillを使えばいいかわかっていれば、個別に追加できます。



``` js
// babel.config.js
module.exports = {
  presets: [
    ['@vue/app', {
      polyfills: [
        'es6.promise',
        'es6.symbol'
      ]
    }]
  ]
}
```





## 2. なんかよくわからないけど構文エラーになる場合

なにが原因かわからないときは全てのpolyfillをインポートしちゃいましょう。

`useBuiltIns` オプションを `entry` にします。

こうすることで、babelでは`browserslist` に書かれている環境に関する全てのpolyfillを自動インポートしてくれるようになります。

``` js
// babel.config.js
module.exports = {
  presets: [
    ['@vue/app',
      {
        useBuiltIns: 'entry'
      }
    ]
  ],
  .
  .
}
```

そして、エントリファイルでインポートします。

``` js
// src/main.js

import '@babel/polyfill'

.
.
```



これで対応するブラウザ環境に関する全てのpolyfillをインポートできました。

しかしこのやり方だとアプリケーションで一度も使わないようなpolyfillもインポートしてしまうので、

ビルド後のバンドルサイズが大きくなってしまうという欠点があります。



## まとめ

バンドルサイズが気になる場合は、対応する各Polyfillを使うようにして、

気にならない場合は、全てのPolyfillをインポートしちゃってIEについて気にせず開発を進めていけばいいのかと思います。
記号をPOSTする際の注意事項(メモ)

&や+-などの記号をそのままサーバ側処理で使う場合はJavascriptのencodeURIComponent関数を使ってURLエンコードする、というメモ。
encodeURI関数では記号はURLエンコードされない点に注意。

~~~
p = "aaaa#&&&+++---";
p = encodeURIComponent(p);
~~~

・・・&はパラメータの区切りに使われるし、よく考えたらURLエンコードが必要なのは当然である。
１分でわかるリッジ回帰

#OLS (最小２乗回帰）

![ols1.png](https://qiita-image-store.s3.amazonaws.com/0/315063/bc24d497-cbf2-1cdf-a9bd-cb9cbab3a318.png)
>出典：https://scikit-learn.org/stable/modules/linear_model.html#ordinaly-least-squares



一見この式で十分に思えるが、<b>実際は何でもありの関数ができてしまう</b>


#リッジ回帰
![ridge2.png](https://qiita-image-store.s3.amazonaws.com/0/315063/f310de4f-da2a-a040-81aa-adadc298110c.png)
>出典：https://scikit-learn.org/stable/modules/linear_model.html#ridge-regression

<b>重みが大きくなることも損失とみなす</b>


#イメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/e4e11e38-623c-5b69-8825-77ad78069550.png)


<b>重みの大きさを抑えることをしないとどういった関数になるかのイメージ</b>

・重みが小さいと大まかな傾向を捉えた関数になる
・重みが大きいとすべてのデータを通るような関数になる

#正則化の効果
＜OLS＞
・誤差さえ小さくなればどんな関数になってもいい

＜Ridge＞
・<b>誤差を小さくしつつ、各重みも小さくする</b>
・誤差を小さくするには重みを大きくしないといけない状況になったら、誤差を残してでも重みを小さいままにする<b>（トータルで小さくする）</b>

＊重みが大きくなると関数は複雑化して過学習する

#まとめ
<b>リッジ回帰の式は過学習を防ぎながら誤差を小さくするという
機械学習において求められていることを端的に表している
Python3 + Selenium + Chrome の自動テスト環境のインストールからテスト実行まで。

#Seleniumとは
Seleniumとは、Webの自動テストのためのライブラリで、ド定番です。
自動テストだけでなく、スクレイピングのための利用も多いかと思います。
特に非同期通信がある場合だと他のスクレイピング方法より、優秀だったりします。
今回は、Python3 + Selenium + Chrome をwindows上で設定する過程を記載します。

#インストール

##Python3のインストール。
1.下記リンクからDownload Windows x86-64 executable installerをクリックして、exeをダウンロード。
https://www.python.org/downloads/windows/

2.exeを開いて、特に変更せずに進め、完了まで。

3.コマンドプロンプトで『py -V』を実行。
『Python 3.xxxx』と返ってくればOK

＃#Seleniumのインストール
1．コマンドプロンプトを開き、pythonインストールフォルダのScriptsフォルダに移動。(例 cd C:\python\Python37\Scripts

2.pip install seleniumをコマンドプロンプト上で実行。

##Chromeのインストール
割愛

##webDriverのダウンロードと配置
１．下記リンクから自分のchromeのversionに合うDriverをダウンロード。
http://chromedriver.chromium.org/downloads

2.Unzipして適当に配置。(例 C:\python\source\webdriver

#テスト実行
1.下記のソースを入力したhelloworld.pyを作成。
from selenium import webdriver
 
driver = webdriver.Chrome("C:\python\source\webdriver\chromedriver.exe")
driver.get("https://www.google.com/")
 
elem_search_word = driver.find_element_by_xpath('//*[@id="tsf"]/div[2]/div/div[1]/div/div[1]/input')
elem_search_word.send_keys("helloworld")

2.コマンドプロンプトからhelloworld.pyを実行。(例 py C:\python\source\helloworld\helloworld.py

3.自動でchromeが開かれて検索欄にhelloworldと入力されれば正常に動いています。

#あとがき
久しぶりに記事を書きました。
今回、まっさらなwindows環境にこれらを入れようと思ったら、ちょうどいい記事がなかったので、一から書いてみました。
chromeでだけなぜか音声入力やカメラの利用ができない

javascriptのWeb Speech API　を利用する際に、
mac自体の音声入力やカメラの利用はできる(siriなどは使える）のに
なぜかchrome(クローム）でだけ利用することができなく、
原因はシンプルなのでしたが、探すのに時間がかかったので書き残しておきます。

まず<font color="blue">システム環境設定</font>に行き、<font color="blue">セキュリティーとプライバシー</font>に飛びます。その後
<img width="668" alt="スクリーンショット 2019-01-28 11.19.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/344311/0f8fe312-62b0-ee82-a814-b3b8abb92757.png">

この画面の<font color='gold'>カメラ</font>や<font color='gold'>マイク</font>の欄をクリックし、画像のようにクロームのアイコンにチェックマークをつけてください。

<hr>
<font color='red'>※</font>このチェックが外れていると、ブラウザ側でマイクやカメラの利用を許可しても
マイク やカメラを使うことができません。
PythonのDjangoのプロジェクト作成までを瞬時に終わらせる

Djangoは触ったことがある、けどプロジェクトを作成する手順は毎回忘れる！面倒くさい！という時のための備忘録です。

## 始めに

まずは以下のコマンドを打ち込みます。

```
> cd HelloWorld
> python -m venv env
> env\Scripts\activate
> python -m pip install --upgrade pip
> echo Django~=2.0.6 > requirements.txt
> pip install -r requirements.txt
> django-admin.exe startproject HelloWorld .
> vim HelloWorld/settings.py
```

``` HelloWorld/HelloWorld/settings.py
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static') # 静的ファイルのパス
```
```
> python manage.py migrate
> python manage.py runserver
```

## 出来ました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/52392/0dbaa62b-6991-236c-8fb3-49b034db1fb0.png)

## ちなみに

macでは
以下のコマンドでは権限がないと怒られましたが

```
$ ./env/bin/activate
-bash: ./env/bin/activate: Permission denied
```
以下のコマンドでは入れました。

```
$ source env/bin/activate
(env) KnothMBP:DjangoHW knoth$ 
```

requirements.txtの作成については
他の方法として、以下のように書き出すこともできます。
こっちの方が使い勝手は良さそうですね。

```
pip install Django
pip install django-bootstrap4
pip freeze > requirements.txt
```

以上です。
PHPで整数の割り算

# はじめに

PHPで整数の割り算をするときに整数で(割り切れないときは小数部分を切り捨てた)結果が欲しいときの注意点のメモ。

# 結論

PHP7以降なら`intdiv($x, $y)`を使う。

PHP5.6なら`($x - ($x % y)) / $y`とするのがいい。

よく紹介される`intval($x / $y)`は場合によって間違えた値になる。

# 解説

## intval($x / $y)ではなぜだめなのか

PHPの`/`演算子の説明には以下のように書いてあります。([代数演算子](http://jp2.php.net/manual/ja/language.operators.arithmetic.php))

> 除算演算子 ("/") の返す値は浮動小数点数となります。 ただし、ふたつのオペランドがともに整数 (あるいは整数に変換できる文字列) であり、かつ結果が割り切れる場合には整数値を返します。 整数の除算については intdiv() を参照ください。

PHPの浮動小数点数は整数より精度が低いので、たとえば9999999999999999(9が16桁)を10で割ったら999999999999999(9が15桁)余り9ですが、実際にはこうなります。

```console
% php -r 'var_dump(9999999999999999 / 10);'
float(1.0E+15)
% php -r 'var_dump(intval(9999999999999999 / 10));'
int(1000000000000000)
```

intvalの前の割り算の段階で浮動小数点数の精度では扱えずに結果が丸まってしまっているので、正しく小数点以下を切り捨てた値になりません。

## intdiv関数

浮動小数点がからむとなにかと面倒なので、素直に整数演算を行う`intdiv`関数がPHP7で新たに追加されました。

```console
% php -r 'var_dump(intdiv(9999999999999999, 10));'
int(999999999999999)
```

こちらはそのためのものなので問題ありません。

## intdivがない5.6系ではどうするか

`intdiv`がないのであるものでなんとかするしかありません。`/`演算子は割り切れる場合には整数演算で計算しますので、あらかじめ余りを引き算して割り切れるようにすれば正しく計算されます。

```console
% php -r 'var_dump(9999999999999990 / 10);'
int(999999999999999)
```

式にまとめて`($x - ($x % y)) / $y`の形で使うといいでしょう。

# さらに詳細

「割り切れる場合には整数値を返す」といっても途中の計算については何も言っていないと突っ込まれそうなので、念のためソースを確認しておきましょう。割り算の処理をしているのは`Zend/zend_operators.c`の`div_function()`関数です。整数同士の演算だったときに実行される部分はこうなっています。

```C
			case TYPE_PAIR(IS_LONG, IS_LONG):
				if (Z_LVAL_P(op2) == 0) {
					zend_error(E_WARNING, "Division by zero");
					ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1) / (double) Z_LVAL_P(op2)));
					return SUCCESS;
				} else if (Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == ZEND_LONG_MIN) {
					/* Prevent overflow error/crash */
					ZVAL_DOUBLE(result, (double) ZEND_LONG_MIN / -1);
					return SUCCESS;
				}
				if (Z_LVAL_P(op1) % Z_LVAL_P(op2) == 0) { /* integer */
					ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2));
				} else {
					ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1)) / Z_LVAL_P(op2));
				}
				return SUCCESS;

```

割り切れるときは整数のまま割り算、割り切れないときはdoubleにキャストして割り算していることがわかります。(この場合は割り切れるので問題にはならないですが、Cは整数同士の割り算は数学的商が整数でなければ小数部を捨てる(0方向に切り捨て)という仕様です。)

ZEND_LONG_MIN(PHP_INT_MINに相当)を-1で割ったときは整数の範囲に収まらないので特別扱いしているのがなるほどという感じです。
mysqlエラー時に困ったメモ

## 急にmysqlが起動しなくなった
とあるスクールの講師をしていたのですが、phpの授業でxmappを起動
そして再びrails側のプロジェクトを起動しようとしたら
`... ERROR! The server quit without updating PID file (/usr/local/var/mysql/xxxxxx.local.pid).`

と表示される
焦る



で原因は一つずつ追っていくと

1.rails別のプロジェクトでdockerを起動しておった
なので`docker-compose ps`でチェックして、ストップをかけた

再度`mysql.server start`をやると今度も同じ

##　xamppの起動をチェックして挙動をチェック
何度かxmapp側のプロセスを見てストップしていたのだが、止めたと思ったらついていて、という謎の現状（謎と思っているのは自分だけできっと何かやっていたのでしょう）
それはさておき、
- `ps aux |grep mysql`にたどりついてみるとしっかりとxmapp側でプロセスうごいてまっせーと教えてくれたので

やはりxmapp側と決定

一旦xmapp側でストップをかけてシャットダウンする前に、mysql.server startをやって無事起動確認


## まとめ
grepコマンドあまり使い慣れてないが、やはり必要だと感じました
`ps aux |grep mysql`これ超便利
ショートカット登録しておこう
Windows 10 Pro x64 で SQLite3を試してみる

#目的
Windows 10 Pro x64 で sqlite3 インストールして A5:SQL Mk-2 よりアクセスしてみる
##ファイルのダウンロード＆インストール
以下より最新版をDLする
[SQLite Download Page](https://www.sqlite.org/download.html)
sqlite-dll-win64-x64-3260000.zip を解凍後、sqlite3.dll sqlite3.def を C:\Windows\System32 以下にコピーする
sqlite-tools-win32-x86-3260000.zipp を解凍後、C:\DEV\DB\ 以下に sqlite3 にリネームして配置する
[SQLite ODBC Driver](http://www.ch-werner.de/sqliteodbc/)より
sqliteodbc_w64.exe sqliteodbc.exe をDL後、実行してインストールする
※sqliteodbc_w64.exe は C:\Windows\System32 以下にもDLLを配置するが、アンインストール時には削除しない
　この状態で新しいバージョンをインストールしても C:\Windows\System32 以下のDLLは上書きしない
　謎仕様？
##A5:SQL Mk-2のインストール
[A5:SQL Mk-2](https://a5m2.mmatsubara.com/")
より a5m2_2.13.3_x64.zip を解凍後、適当なフォルダに配置する
##DBの作成
<pre>
> cd C:\DEV\DB\sqlite3
> ./sqlite3 C:\DEV\DB\sqlite3\demo.sqlite3
SQLite version 3.26.0 2018-12-01 12:34:55
Enter ".help" for usage hints.

sqlite> CREATE TABLE TEST_TABLE (
   ...>   ID INTEGER PRIMARY KEY AUTOINCREMENT,
   ...>   VALUE VARCHAR(256)
   ...>   );
sqlite> INSERT INTO TEST_TABLE (VALUE) VALUES ('HOGE');
sqlite> INSERT INTO TEST_TABLE (VALUE) VALUES ('FUGA');
sqlite> INSERT INTO TEST_TABLE (VALUE) VALUES ('PIYO');
sqlite> SELECT * FROM TEST_TABLE;
1|HOGE
2|FUGA
3|PIYO
sqlite> .exit
</pre>
##A5M2から接続してみる
　　起動後左側のデーターベースを右クリックして　データベースの追加と削除　を選択する
　　追加ボタンをクリック
　　SQLite(sqlite3.dll)をクリック
　　データーベース：C:\DEV\DB\sqlite3\demo.sqlite3 を選択
　　　テスト接続をクリックして、正常に接続することを確認
　　　OKボタンをクリック
　　閉じるをクリック
　demo.sqlite3　をクリックして正常に動作することを確認する
##参考にしたサイトはこちら
[SQLite3を試食する](https://qiita.com/kitfactory/items/a8a3c2d0349bbb3e041f)
[今すぐSQLite入門。知っておくべきたった5つのこと。](http://d.hatena.ne.jp/grgrjnjn/20110401/1301669692)
[Node.jsでsqlite3を使ってデータベースを操作する方法まとめ](https://kuroeveryday.blogspot.jp/2016/05/nodejs-sqlite3.html")
[SQLiteインストール](https://www.dbonline.jp/sqlite/install/)
[AUTOINCREMENTを設定する場合としない場合の違い](https://www.dbonline.jp/sqlite/table/index9.html)
[SQLite Node.js Tutorial](http://www.sqlitetutorial.net/sqlite-nodejs/)
Kotlin 1.3のCoroutineの使い方⑦（コルーチンは軽量！）

# 検証環境
この記事の内容は、以下の環境で検証しました。

* Intellij IDEA ULTIMATE 2018.2
* Kotlin 1.3.0
* Gradle Projectで作成
* GradleファイルはKotlinで記述（KotlinでDSL）

# 準備
詳細は下記の準備を参照してください。
https://qiita.com/naoi/items/8abf2cddfc2cb3802daa

# Coroutines ARE light-weight
[前回](https://qiita.com/naoi/items/5a6bd53af6e8363e84dc)に引き続き、[公式サイト](http://kotlinlang.org/docs/reference/coroutines/basics.html#coroutines-are-light-weight)を読み解いていきます。

今回のタイトルはわかりやすいです！
軽量アピールです。

早速読み進めます。

> Run the following code:

いきなり、サンプルコードを実行せよと言われたので、実行してみたいと思います。
まず、サンプルコードは以下のとおりです。

```kotlin
import kotlinx.coroutines.*

fun main() = runBlocking {
    repeat(100_000) { // launch a lot of coroutines
        launch {
            delay(1000L)
            print(".")
        }
    }
}
```

実行したら大変な事になりました。
「.」ドットが大量に表示されました。

説明を読んでみましょう。

> It launches 100K coroutines and, after a second, each coroutine prints a dot. Now, try that with threads. What would happen? (Most likely your code will produce some sort of out-of-memory error)

意訳込みですが

> 10万のコルーチンを起動しました、1秒後にそれぞれのコルーチンがドットを出力します。
> 早速ためしてみてください。何が起こりました？（多くの場合、ある種、OOMのような感じになりまるよね。）

要は、軽いよって言いたいんですね。確かにスレッドを10万も生成したらOOMになりますね。

# まとめ
このブロックは、ひたすら軽量アピールでした。
ipアドレス 169.254.5.250　とかのリンクローカルアドレスに関して

http://www.geolocation.co.jp/learn/ip/10.html

何故か
リンクローカルアドレス
169.254.5.250
がサーバー移設すると割り振られて
IPアドレスがちゃんと取れないので
後で調査するためタイトルだけで作成しますっ

なんで繋がらないんだあああああああああ
WINDOWS7からWINDOWS10にアップデートした際にpowershellでIEのDOM操作ができなくなった話

#概要

POWERSHELLを使って、IEを操作しファイルDLをしていたのですが、WINDOWS7からWINDOWS10にアップデートした際に、動作しなくなったため対応方法の覚書です。
https://qiita.com/kk-ster/items/259ad6c9921242a86731
の続きの記事です。
以前の記事を書いたあと、別スクリプトで発生した問題を追加で記事を作成しました。


## 特定のサイトでDOM要素が取得できない
タイトルの通りです。
問題のサイトは古くからあるWEBサービスの管理者サイトなのですが
WINDOWS10にVerUP後、InternetExplorer.Applicationからの
DOM操作がいうことを聞かなくなりました。
ieオブジェクトの中身は正常にセットされているのですが
ieオブジェクトのDocumentから操作しようとしても
エラーが発生するようになってしまいました。

例えば要素に対してクリックを実行しようとした場合

```powershell
[System.__ComObject] に 'click' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。
```
とエラーが発生してしまいます。

発生パターンの検証はできていませんが、対象のサイトはクライアント証明書が
必要なサイトであるため、関係があるかもしれません。（未検証）

###対応
操作したいサイトに対して互換表示設定を実施した。

〇操作方法
操作したいサイトを開いた状態で、
ツール➡互換表示設定
をひらいてください。
「追加するWEBサイト」の項目に開いているサイトがはいっているため追加を押下してください。
私の環境では、これで、DOM操作ができるようになりました。



## navigate()でURLを開いたものに対して、DOMで要素が取得できない

こちらも、すべてのサイトで発生するわけではないのですが、navigate()で画面表示したあと
IEオブジェクトからDOM操作ができなくなる現象が発生するようになりました。

以下、DOM操作のサンプル（URLを開きNameがLINKのタグをクリック）

```powershell
# IEオブジェクトを取得
objShell=new-object -com Shell.Application
$ie=new-object -com InternetExplorer.Application
$ie.navigate("開きたいURL")
# IEオブジェクトからdocument取得
$doc = $ie.document

# documentからDOM操作
$pass = $doc.getElementsByName("LINK")
# 要素が複数取得されているため、1個目をクリック
@($pass)[0].click()

```

処理させると、docからDOM操作して取得できるはずの情報が取得できず、エラーが発生します。
このとき$ieの中身を確認するとSystem.__ComObjectと返ってきます。


ieオブジェクトの確認

```powershell
$ie 
```
結果

```powershell
System.__ComObject
```
本来であれば、下で示すようにURL情報等細かい情報表示ができるはずなのですが
情報が取得ができていないため、DOM操作ができなくなっていると思われます。

成功例：

```powershell
Application          : System.__ComObject
Parent               : System.__ComObject
Container            : 
Document             : mshtml.HTMLDocumentClass
TopLevelContainer    : True
Type                 : HTML ドキュメント
Left                 : 592
Top                  : 28
Width                : 1226
Height               : 1011
LocationName         : 「サイトのタイトル」
LocationURL          : 「サイトのURL」
Busy                 : False
Name                 : Internet Explorer
HWND                 : 2295408
FullName             : C:\Program Files (x86)\Internet Explorer\IEXPLORE.EXE
Path                 : C:\Program Files (x86)\Internet Explorer\
Visible              : True
StatusBar            : True
StatusText           : 
ToolBar              : 1
MenuBar              : True
FullScreen           : False
ReadyState           : 4
Offline              : False
Silent               : False
RegisterAsBrowser    : False
RegisterAsDropTarget : True
TheaterMode          : False
AddressBar           : True
Resizable            : True
```


###対応
表示中のブラウザ（IE）からオブジェクトを取得しなおした。
navigate()を実行したあとに、objshellからieを再取得することで
正常にDOM操作できるようになりました。
以下再取得サンプル

```powershell
$ie = $objShell.Windows() |
? {$_.Name -eq "Internet Explorer"} |
Select-Object -First 1
```
この処理を実行した後で$ieの内容を表示すると、細かい情報が表示されるようになり
DOMでの取得、操作ができるようになりました。




#最後に
IE操作についてWIN7ではすんなり動いていた処理がWIN10になると遅くなったり安定しなくなったように感じます。
POWERSHELLでIE操作処理はインストール不要だったので重宝しているのですが
代替も考えないといけないかもしれません。
秒でわかる範囲のkubernetes

# 概要
暇つぶしで読める範囲の kubernetes の説明です。
何をするものなのかを説明するとものすごく長くなるので、ソフトウェアっていう単位でどういう風に導入されてるかだけ書きます。

# ちゃんと知りたい方はこの本がおすすめです
[Kubernetes完全ガイド](https://www.amazon.co.jp/gp/product/4295004804/)

# 結局 kubernetes ってなんなのよ
秒で読める範囲だけ書きます。

## kubernetes はソフトウェアの集合です
「Java」って言ったら JVMやJREなどの周辺のものも含む、みたいなイメージです。

## kubernetes は複数のサーバーで動作します(単体のサーバーでも動きます)
クラウド上ではこのサーバーがEC2(AWS)であったりCompute Engine(GCP)であったりVM(Azure)であったりするわけです。

## kubernetes を構成するソフトウェアは複数のサーバーにインストールする必要があります
複数のサーバーで動作するので、全部のサーバーにインストールする必要があります。
でもめんどくさいのである程度自動でやってくれるコマンドとか、そもそもクラウド側が全部やってくれるサービスとかがあります。

## kubernetes で使うもの(IPとかコンテナとか)はyamlファイルで書くことが多いです
この「kubernetesで使うもの」は、最初に紹介した 「Kubernetes完全ガイド」では「リソース」って書かれてます。
公式のドキュメントでは「kubernetes object」って表現されてます。
どういうことかといえば、使いたいものをyamlファイルで表現するってことです。つまり。。

(開発者)「example1.yamlファイルを登録するよ」→ (kubernetes)「このyamlファイルはコンテナだ...」
(開発者)「example2.yamlファイルを登録するよ」→ (kubernetes)「このyamlファイルはIPだ...」

yamlファイルを登録するとkubernetes の内部でいろいろやってくれます。yamlファイルなのでgit管理出来て良いですね、っていう感じです。

# 結論
公式の説明を読むとなんだか巨大な化け物みたいなイメージがありますが、いうてもただのソフトウェアです。
落ち着いて一つ一つ読んでいけば大丈夫です。
rails c 時の Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib (LoadError) 解決方法

## 環境
- Ruby 2.6.0
- Rails 5.2.2
- MacOS

## 症状
rails c　でコンソール起動時に

dlopen(/{ユーザーのパス}/.rbenv/versions/2.6.0/lib/ruby/2.6.0/x86_64-darwin17/readline.bundle, 9): Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib (LoadError)
  Referenced from: /{ユーザーのパス}/.rbenv/versions/2.6.0/lib/ruby/2.6.0/x86_64-darwin17/readline.bundle
  Reason: image not found - /{ユーザーのパス}/.rbenv/versions/2.6.0/lib/ruby/2.6.0/x86_64-darwin17/readline.bundle

## 解決法

https://github.com/rails/rails/issues/26658
ここらへんを参考に、gem fileのdevelopmentグループにを追加

```ruby:Gemfile

group :development do
...
  gem 'rb-readline'
end
```
GitLab-CEからnetlifyにdeployする

[netlifycli](https://github.com/netlify/netlifyctl)を利用する

# インストール

https://github.com/netlify/netlifyctl#installation

を参考にインストール。

# アカウント認証

```
$ netlifyctl login
```

netlifyのauth画面が出てくるので、netlifyにログインして承諾。

# デプロイ設定

deploy対象のプロジェクトに移動する。
このとき自分のいる origin の branch名が、deployのトリガになるbranchになる。

準備ができたら、以下のコマンドで手動で設定していく。

```
$ netlifyctl init --manual
Create a new site? (yes/no) yes
Site created  ✔
Directory to deploy (blank for current dir): (default: .) 
```

デプロイするディレクトリを指定する。ビルドする場合は、ビルド後に生成されるディレクトリ名を指定

```
Your build command (hugo build/yarn run build/etc): 
```

ビルドコマンドを記載する

```
Configuration:

    Repository: xxxxxxxxxxxxxxxxxxxx
    Production branch: master
    Publishing directory: ./build
    Build command: yarn build

Continue? (yes/no) yes
Configuring Continuous Deployment ...

Give this Netlify SSH public key access to your repository:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbZgBoposL3iW3qhw5i1EI4wNrJFUq...
```

ビルドサーバからgit cloneするために、sshキーをgitlabに登録する。
![ssh.png](https://qiita-image-store.s3.amazonaws.com/0/14275/d7707005-5df6-bbb5-832a-9b0b6b85e7e1.png)

ログインした状態で https://gitlab.sample.domain/profile/keys に行き、鍵を登録したらOK.

```

Continue? (yes/no) yes

Configure the following webhook for your repository:

    https://api.netlify.com/hooks/xxxxxxxxxxxxxxx
```

gitlab上のレポジトリに何かがあったときに、gitlabからnetlifyに通知をするためにwebhookを追加する。

https://gitlab.sample.domain/{project}/{repository}/settings/integrations

とりあえずコードに変更があれば検知したい場合は、以下のように Push eventとMerge request eventにチェックしておけばOK.

![notify.png](https://qiita-image-store.s3.amazonaws.com/0/14275/69f69b33-af1a-4150-cc25-14e1609d2706.png)


```
Continue? (yes/no) yes
Success! Whenever you push to git, Netlify will build and deploy your site  ✔

    https://xxxxxxx-xxxxxx-xxxxx.netlify.com
```

これでOK.
あとはdeployされるのを待てばいい。
7 Trending JavaScript Libraries in 2019

というタイトルの動画を見たので紹介します
リンクはこちら[https://www.youtube.com/watch?v=2Km9zWkbLtA](https://www.youtube.com/watch?v=2Km9zWkbLtA)
動画をみたらこの下を読む必要は特にないです。

# howler.js
[公式サイトはこちら](https://howlerjs.com/)
jsで音を扱えるライブラリみたいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251548/02108299-d80e-b4e4-c288-de207344c0b0.png)

オーディをファイルを投げたら勝手に波形にしてくれるのかな？
そしたらすごいクール。

# SweetAlert2

[公式サイトはこちら](https://sweetalert2.github.io/)
アラート、ダイアログ系のライブラリみたいです。

UIがとにかく綺麗で設定項目も少ないのが魅力的ですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251548/e142d636-0369-e00b-1ebc-97d2e5010965.png)


```javascript
Swal.fire(
  'Good job!',
  'You clicked the button!',
  'success'
)
```

こんなに美しいダイアログが５行で実装できます。
汎用性が高そうです。

# Cleave.js

[公式サイトはこちら](https://nosir.github.io/cleave.js/)
これもめちゃくちゃ良さそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251548/5d255879-d631-0306-3ab6-f38da7524709.png)

バリデーション？オートコンプリート？系のライブラリなんでしょうか？
サインアップの会員情報入力とかで使えたら良さそうですね。

# html2canvas

[公式サイトはこちら](https://html2canvas.hertzen.com/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251548/17c5ac47-8ab2-91fb-8eb8-97044a567bf2.png)

よくわかってないですがdom要素をcanvasに書き出してそれを画像にして出力してくれるライブラリなんですかね？
使い所がいまいち分からなかったです。

# Popmotion

[公式サイトはこちら](https://popmotion.io/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251548/312c1197-e074-4770-cb16-130e6a29079f.png)


アニメーション系のライブラリみたいです。
アニメーション系はTweenMaxしか使ったことがないのですが、どちらのほうが使い勝手いいのでしょうか？
Popmotionは最近流行りのフロントエンドフレームワーク御三家への対応に力を注いでいるみたいなので、それらを使っている人はあえて使ってみるのもいいかもしれません。
ちなみに僕はフシギソウ使いです。

# Typed.js

[公式サイトはこちら](https://mattboldt.com/demos/typed-js/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251548/51eb0b0a-2e12-8a8c-0eca-d241f70dd1d7.png)

タイピングするのが楽しくなりそうなライブラリです。
slackはこのライブラリを使っているみたいです。

これも色んな所に使えそう？

# ScrollMagic

[公式サイトはこちら](http://scrollmagic.io/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/251548/6f78e9ff-883f-0a58-9d8f-fab676c8a153.png)


スクロール系のライブラリみたいです。
[ここに例がありました。](http://scrollmagic.io/examples/index.html)
スクロール系のイベントってなんだかめんどくさそうで敬遠しちゃってるので、じっくり勉強してみたいものです。

# 総括
全体的にアニメーションに力を入れてるライブラリが多かった気がします。
あと紹介用のwebサイトですら美しいです。
使えそうなライブラリがあったらぜひ使ってみてください。
【一年生の頃の私へつづる言葉⑦】Visual Studio Code拡張機能で最低でも入れてほしいもの

・今となっては、当然のごとく使用していることを、ただ手紙としてしたためるだけの記事の第七弾。
・有限である日常においてもなお、「Orangeごっこ」という非現実的かつ非効率な時間跳躍遊びを止める気ない私。
・[泥臭調査](https://qiita.com/t_o_d/items/01301bc6c079e63d4020)という新しい無駄遊びも発見し、方向性迷子に磨きがかかっている生活は、さぞ過去の私は嫉妬にまみれているだろう。
・よし。今回は入社後、知っておけばよかったことを書こう。

## Visual Studio Code拡張機能について
### ＜当時＞
- 入社初期、学習や開発や資料作成等での使用のため、追加していた拡張機能は下記のみ。
    - Auto-Open Markdown Preview・・・マークダウン自動プレビュー機能
    - Markdown PDF・・・マークダウンからPDF変換機能
    - Java Extension Pack・・・Java構築機能

※HTMLやCSS等のフロントを触る際は、標準の補完機能等を使用。

### ＜現在＞
・[こちらの記事](https://qiita.com/Yuta_Yamamoto/items/fbeb7b31173b3e787fc2)を参考にしながら、環境に合わせて必須機能や便利機能等を調査して、自分用に整理。
・また、新リリース情報を確認して、逐一試用して追加。
※増えすぎ防止のため、担当内容に応じた最低限の拡張機能のみ追加。
・下記一覧

- ***Java***
※研修の自宅での復習や、開発等に使用。
    - [Java Extension Pack](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack)・・・Java構築機能。
    - [Code Runner](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)・・・コード実行機能。様々な言語に対応。
    - [Visual Studio IntelliCode
](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode)・・・機械学習によるコーディング支援。2018年後期にJavaに対応。

- ***Markdown***
※資料作成やメモ等の際の、Markdown使用時に使用。
    - [Auto-Open Markdown Preview](https://marketplace.visualstudio.com/items?itemName=hnw.vscode-auto-open-markdown-preview)・・・マークダウン自動プレビュー機能  
    - [Markdown PDF](https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf)・・・マークダウンのPDF変換機能  
    - [markdownlint](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint)・・・マークダウン検査機能  
    - [Paste Image](https://marketplace.visualstudio.com/items?itemName=mushan.vscode-paste-image)・・・画像貼り付け機能

- ***フロントエンド***
※HTMLやCSS等のフロント開発の際に使用。
    - [Auto Complete Tag](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-complete-tag)・・・タグ補完機能  
    - [CSS Peek](https://marketplace.visualstudio.com/items?itemName=pranaygp.vscode-css-peek)・・・CSS編集機能  
    - [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)・・・コード整形機能

- ***Git***
※Git連携時に使用。
    - [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)・・・Git高管理機能  
            
- ***促進機能***
※開発や資料作成等において、促進化や効率化を図るために使用。
    - [indent-rainbow](https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow)・・・インデント装飾機能
    - [テキスト校正くん](https://marketplace.visualstudio.com/items?itemName=ICS.japanese-proofreading)・・・文章校正機能

### ＜過去の私へ送る言葉＞
- <font color = "tomato">効率化だけではなく、理解力向上のためにも、必要に応じて追加していってね</font>
- <font color = "tomato">自分の環境をどんどん便利にして、素敵な生活を過ごしてね</font>

## まとめ
- 今回は、Visual Studio Code拡張機能ということで、気高き聖人達が開発した名作を使用していなかったころを思い出しながら、記事を書く。
- 「機械学習によるコーディング支援機能」追加当時に、「今後、定型入力だけでの完全自動化も叶うのでは」という、お家芸の他人依存発想で、決して到達しない声で必死に賢人の方々への応援作業。
- そのようなことをしながら、快適な環境探しにまた奔走する旅を、別次元で生きている過去の私は、しかと胸に刻み込んでいるだろう。

## 参考
- https://qiita.com/Yuta_Yamamoto/items/fbeb7b31173b3e787fc2  
→こちらの記事を参考にいたしました。大変お世話になりました。
リモートデスクトップ 毎回ログイン情報を聞かれるときは


ローカルグループポリシーエディターを開いて
（スタートボタンを押して「gpedit」と入力したら出てくる）
以下の情報を編集する。

- コンピューターの構成 > 管理用テンプレート > システム > 資格情報の委任
    - NTLMのみのサーバー認証で保存された資格情報の委任を許可する

ラジオボタンの「有効」をチェックして
オプションの「サーバーを一覧に追加」の「表示」をクリックして開く。
接続先のサーバーを以下の要領で入力欄に登録する。
「TERMSRV/リモート接続する端末のIPアドレス」
※ワイルドカードで一括登録できるようのなので私は「TERMSRV/*」にしました。

最後にコマンドからポリシーの更新をすれば完了。

```:cmd
gpupdate
```
Goでポインタを使う

#これは何？
ポインタの使い方の覚書です。

#利用例
## main()で使う

```go
package main

import (
	"fmt"
)

func main() {	
	// int型のポインタ変数宣言
	var hoge *int

	// &（アドレス演算子）を使って、nのアドレスを代入
	var num int = 100
	hoge = &num

	fmt.Println("numのアドレス：", &num)
	fmt.Println("hogeの値：", hoge)

	fmt.Println("numの値：", num)
	// *(間接参照演算子）を利用して、ポインタの中身を取得
	fmt.Println("hogeの中身：", *hoge)
}
```

## ポインタ渡し

```go
package main

import (
	"fmt"
)

func main() {
	a, b := 10, 10

	// aはそのまま、bはアドレス演算子をつけて呼び出す
	called(a, &b)

	fmt.Println("値渡し：", a)
	fmt.Println("ポインタ渡し：", b)
}

func called(a int, b *int) {
	// 変数をそのまま変更
	a = a + 1
	// 変数の中身を変更
	*b = *b + 1
}
```


# Reference
- [Goのポインタ - はじめてのGo言語](http://cuto.unirita.co.jp/gostudy/post/pointer/)
FUJITSU Cloud Service for OSSの仮想サーバプランについて



富士通が提供しているクラウドサービス(FUJITSU Cloud Service for OSS)では、
複数の仮想サーバプランが用意されている。

http://jp.fujitsu.com/solutions/cloud/k5/


各プランはCPUコア数とメモリ容量のセットで提供され、
各サーバのプラン名はアルファベットと数字で表されるのだが、公式HPの料金表だと、
各アルファベットがどういうプランなのか分かりづらかったので、整理した。

(2019/01/27時点)


# P系プラン

||P-1|
|---:|---|
|CPU|1|
|メモリ|512|

※ CPUコア数と、メモリ容量が同じでCPUがハイスピードCPUになるP2系プランもある

# T系プラン

||T-1|
|---:|---|
|CPU|1|
|メモリ|1|

※ CPUコア数と、メモリ容量が同じでCPUがハイスピードCPUになるT2系プランもある

# C系プラン

||C-1|C-2|C-4|C-8|C-16|
|---:|---|---:|---:|---:|---:|
|CPU|1|2|4|8|16|
|メモリ|2|4|8|16|32|

※ CPUコア数と、メモリ容量が同じでCPUがハイスピードCPUになるC2系プランもある

# S系プラン

||S-1|S-2|S-4|S-8|S-16|
|---:|---|---:|---:|---:|---:|
|CPU|1|2|4|8|16|
|メモリ|4|8|16|32|64|

※ CPUコア数と、メモリ容量が同じでCPUがハイスピードCPUになるS2系プランもある

# M系プラン

||M-1|M-2|M-4|M-8|M-16|
|---:|---|---|---|---|---|
|CPU|1|2|4|8|16|
|メモリ|8|16|32|64|128|

※ CPUコア数と、メモリ容量が同じでCPUがハイスピードCPUになるM2系プランもある

# LM系プラン

||LM-1|
|---:|---|
|CPU|1|
|メモリ|16|

※ CPUコア数と、メモリ容量が同じでCPUがハイスピードCPUになるLM2系プランもある

# XM系プラン

||XM-4|
|---:|---|
|CPU|4|
|メモリ|128|

※ CPUコア数と、メモリ容量が同じでCPUがハイスピードCPUになるXM2系プランもある

# L系プラン

||L-12|L-24|
|---:|---|---|
|CPU|12|24|
|メモリ|128|128|

※ CPUコア数と、メモリ容量が同じでCPUがハイスピードCPUになるL2系プランもある