OmniAICreator/Qiita-1.07M huggingface dataset:
web3.jsでノード上にアカウントを作る

web3 1.0.0-beta を利用して、geth(private)のノード上にアカウントを作る手順。
（ローカルに秘密鍵を作るのではなく、接続先のノード上に秘密鍵を作る）

# geth起動

```
geth --rpc --rpcapi "personal" --networkid "15" --nodiscover console
```

# Node.js側でJavaScript実装(web3.jsを用いて)

``` newAccount.js
web3.eth.personal.newAccount('password1').then( function (address) {
  console.log("typeof(address)", typeof(address));
  console.log("address", address);
}).catch( function ( error ) {
  console.log(error);
});
```

# 実行

```
$ node newAccount.js
typeof(address) string
address 0x890917A6AE8E24667f75679dAB5dfb30Fd7599F6
```

# 参考
- [web3.js - web3.eth.personal - newAccount](https://web3js.readthedocs.io/en/1.0/web3-eth-personal.html#newaccount)
- [github.com/ethereum - #1365 How can I create account in geth rpc by web3.personal.newAccount or web3.eth.accounts.create?](https://github.com/ethereum/web3.js/issues/1365)
MSTestのTimeout属性でタイムアウトするとTestCleanupが実行されない

# 背景

私が所属する品質検査部では現在テストの効率化の一環で、手動でアプリを操作して行うテストの自動化を進めています。
自動操作では、通信や描画待ち等、適切な状態になるまで待機する処理が頻発しますが、待機の仕方が悪いと一部のケース（ページ遷移に失敗、一定条件でのみポップアップする警告ダイアログが出現等）で処理が停止してしまうことがあります。
停止しないよう注意深く実装すればいいと言えばそこまでですが、一度停止してしまうと後続のテストが実行されず、CIのリソースもロックされてしまうことを考えると、別途セーフティネットが欲しくなりました。
テスト対象はXAMLベースのC#アプリケーション（WPFアプリ）であるため、テストFWにはMSTestを使用しており、Timeout属性により手軽にテストメソッド単位でタイムアウトを設けられます。
しかし、試しに使ってみたところ、確かにタイムアウトはするものの、なぜか後続のテストが全てエラーになってしまったため、タイムアウトした際の挙動を調査しました。

# 調査内容

調査に用いたコードは以下の通りです。

```csharp
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestProject1
{
	[TestClass]
	public class UnitTest1
	{
		[TestInitialize]
		public void Initialize()
		{
			System.Console.WriteLine("Init");
		}

		[TestCleanup]
		public void TestReflesh()
		{
			System.Console.WriteLine("Clean");
		}
		// 100ミリ秒でタイムアウト
		// 1000ミリ秒のSleepがあるので確実にタイムアウトする
		[TestMethod, Timeout(100)]
		public void TimeoutTest()
		{
			System.Console.WriteLine("test");
			System.Threading.Thread.Sleep(1000);
		}
	}
}
```

テストを実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/119280/827dd234-2cc7-bc7c-0ade-0ade57e83d88.png)
当然タイムアウトで失敗しますが、 **TestCleanup が 実行されていません**。
自動操作テストでは、TestCleanupでテスト対象アプリをログイン直後の状態に戻す処理を行っています。
タイムアウトによりTestCleanupが実行されなかったことで、ログイン直後でない状態のテスト対象アプリに対してテストを実行しようとし、エラーになっていたようです。

なお、TimeoutTestを以下のように、タイムアウト以外のエラーで失敗させると、

```csharp
[TestMethod, Timeout(100)]
public void TimeoutTest()
{
	System.Console.WriteLine("test");
	Assert.Fail();
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/119280/a403975a-97f0-ec4c-9f12-e40655ba43d5.png)

当然TestCleanupは実行されます。

調べたところgithubにIssue上がってましたが、執筆時点ではタイムアウトした際にはTestCleanupは実行されないようです。
https://github.com/Microsoft/testfx/issues/522

# ちなみに
[フォーラム](https://social.msdn.microsoft.com/Forums/ja-JP/c5989f13-7fa6-4eb7-b57a-94aba9a3696a/timeout-attribute-for-mstest-does-not-call-test-cleanup-method?forum=vsunittest)に `vstest.console.exe` で実行することをお勧めすると書いてありましたが、こちらもダメでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/119280/09453975-ef3c-7636-10b2-b84cb45cc453.png)

# NUnitは大丈夫
C#では、MSTestの他にいくつかテストFWが存在しますが、NUnitで同様の検証をしてみました。
NUnitではTimeoutしてもメソッド終了後の処理は実行されます。
検証用コードは以下の通りです。

```csharp
using System;
using NUnit.Framework;

namespace NUnitTest
{
	[TestFixture]
	public class UnitTest1
	{
		[SetUp]
		public void SetUp()
		{
			Console.WriteLine("SetUp");
		}

		[TearDown]
		public void TearDown()
		{
			Console.WriteLine("TearDown");
		}

		[Test, Timeout(10)]
		public void TestMethod1()
		{
			Console.WriteLine("Test");
			System.Threading.Thread.Sleep(100);
		}
	}
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/119280/652a98b6-dd75-9767-bf81-3e45bd8bf0fd.png)

# 最後に

画面を自動制御するテストでは、タイムアウト時に後処理（TestCleanup）が実行されないのは致命的なので、FW乗換作業のコストを覚悟してでもNUnit等、他のFWに移行すべきと感じました。
RPAへの理想と現実のギャップ〜RPAとの正しい向き合い方

RPAツールWinactorの導入、シナリオ設計、実装、運用を始めて1年がたちました。
一部業務のRPA化によって、**定量的には15人日もの工数削減**、**定性的には定型業務から解放された人がより創造的な業務にシフトして業績に貢献する**など、RPAがもたらした恩恵は計り知れません。
その一方で、RPA化にはまだまだ残された課題があります。
この記事では、現場にRPAを導入していく中で感じたことを「RPAへの理想と現実のギャップ」と題してまとめました。
なお、この記事での[現場]は[非IT系の職場]を指します。

## RPAとは何か
RPAはRobotics Process Automationの頭文字をとった略語で、ロボットによるプロセスの自動化を意味します。
だいたい現場でRPAというと、もう少し狭い意味で**マニュアル化・手順化できる業務を自動化する概念**を指す場合が多いと思います。
RPAについて少し調べたことがある方なら、WinactorやUiPathなどのアプリケーション名を耳にしたことがあるかと思いますが、これらはRPAツールと呼ばれるものです。
RPAツールはRPAを実装するためのツールであり、最近になって脚光を浴びてきました感があります。
実は現場で昔からよく使われているExcel VBAも、RPAの概念と照らし合わせれば立派なRPAツールと言えます。
RPAという言葉自体は新しいですが、今までよく使われてきた概念ということです。

## 現場におけるRPAに対する崇高な理想
現場にRPAを浸透させていく中で、現場ではRPAに対して以下の崇高な理想が抱かれていると感じました。

- RPAは100%誤りなく作業を遂行する
- RPAは人手を一切介在する必要がない
- RPAは迅速に作業を遂行する

ITに精通している現場ならともかく、非ITの現場ではRPAが歪んだ形で現場に浸透します。
RPAが**「既存システムのような高度な基盤で、AI技術も取り入れた先端的なもの」**という、スーパーサイヤ人的なアプリと思われていたりするのです。


## 理想と現実のギャップはRPAへの不信に繋がる
しかし実際にRPAを運用していくと、先にあげられた理想はことごとく打ち破られ、現実とのギャップを突きつけられることになります。
以下に、RPAの理想と対応させた現実とのギャップを見ていきましょう。

### 「RPAを適用すれば100%誤りなくタスクを遂行する」という理想
私の知る限り、RPAツールが100%誤りなく稼働する保証はありません。
コマンドプロンプトやVBAを使用したプログラムならばほぼ誤作動しませんが、特定ウィンドウの一部を絶対参照でクリックしたり、画像マッチングを使用した場合には誤作動する可能性がかなり高くなります。
ロボットのシナリオ上は想定できない動作も、不意なポップアップや画面解像度の変化、もしくは参照するアプリケーションの都合によって想定外の誤作動を起こすことがあります。

### 「人手を一切介在する必要がない」という理想
上に関連しますが、RPAで一連の作業を完全に自動化した場合、誤りを含む可能性を排除しきれません。
そのため、正確性を期す場合にはロボットが行なった作業を人手でチェックする必要が出てきます。
例えば社外へのメール配信などにRPAを適用する場合はロボットの作業後に人手のダブルチェックを挟むことになります。
RPAとは言うものの、完全に人の作業を解放することはできないのです。

### 「迅速に作業を遂行する」という理想
RPAツールはロボットレイバー(仮想労働者)とも呼ばれているように、人の作業を代行するのが本来の役目です。
システム開発などで導入されるアプリケーションとは質が異なり、作業の効率化を目的にしていません。
RPAツールは人が実際にデスクトップ上で作業していることを代行するだけであり、高速な作業の遂行を保証するわけではないのです。
RPAツールは**長時間でルーチンな作業を人の代わりに強いることができる仮想労働者**というのが正しい認識と言えます。

<hr>
上記で見てきたように、RPAに対する理想と実運用で発生していく事象(現実)との間には大きなギャップがあります。
当初の理想が高すぎる分、RPA運用における現実を知ったとたんに一気に信用されなくなるリスクが高いのです。

## RPAと正しく向き合うためには
冒頭でも述べたようにRPAによる恩恵は計り知れません。
_※RPAは一旦運用されると現場ではインフラとして扱われるようになるため、そのありがたみを現場では感じられなくなりますが..._
しかし、RPAに対して崇高な理想を持たれていた場合、一度でもRPAに不信を抱かれてしまうとそのインフラが停止されかねません。
一度RPA化されたプロセスを再び人力作業に切り替えるのは事業的にもかなりの損失となりえます。
そこで上記のような大損失を避けてRPAと正しく向き合うためには、**RPAに関する正しい認識を現場で揃えて(特に決裁権があるマネージャー陣)、RPAの強み弱みを理解したうえで既存システムとうまく調和させながら全体としてRPAを作っていく姿勢**が必要と思われます。

## 最後に
RPA運用はトライ&エラーの繰り返しです。
一度のミスでRPA全体の信用を失くさず、原因を切り分けてどこがだめで次回はどう修正することでカバーできるのか、建設的に考えていくことがRPA運用では必要だと感じます。
【Java8】Streamで重複削除（& 重複チェック）

[`Stream#distinct`](https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html#distinct--)を用いたリストの重複削除について書きます。

## 重複削除
重複削除は`distinct`してから`collect`でリストに変更することでできます。

```java:重複削除
List<Integer> list = Arrays.asList(1, 1, 2, 3, 4, 5);
//[1, 2, 3, 4, 5]になる
List<Integer> ans = list.stream().distinct().collect(Collectors.toList());
```

## 重複チェック
[@swordone](https://qiita.com/swordone)さんから頂いたコード（コメント欄）の方がスマートだったので、重複チェックはこちらを使った方が良いです。

```java:重複チェック
List<Integer> list = Arrays.asList(1, 1, 2, 3, 4, 5);
boolean ans = (list.size() == new HashSet<>(list).size());
```

### 旧版
非効率ですが`stream`を使う旧版も一応残します。

```java:重複チェック
List<Integer> list = Arrays.asList(1, 1, 2, 3, 4, 5);
boolean ans = (list.size() == list.stream().distinct().count());
```

## 参考にさせて頂いた記事
- [Stream\#map\(\)とStream\#collect\(\)を使ってListを生成する](http://tomoyamkung.net/2015/01/12/java8streammap_collect/)
pythonで並行処理をしてみる

# 並行処理と並列処理
https://qiita.com/ogihara/items/1b7f002b7d14a2710bce
並列処理： 1つのCPUに対して、手が空いている時に他の仕事をさせること
並行処理： 複数のCPUが同時進行で仕事をできるようにすること

今回は並行処理(multi processing)がしたい。

# 並行処理をしてみる
http://iatlex.com/python/parallel_first#multiprocessing
すごく丁寧に解説してくれているので、なぞりながら勉強。

まずはCPUの数を調べる。2個でした。

```python
import multiprocessing
multiprocessing.cpu_count()
```
次に載せてくださった例をそのまま動かしてみる。
（↓これって並列じゃなくて並行ではないのかな・・？）

```python
######## 並列計算を使えるように #########
from multiprocessing import Pool
 
##### 並列計算させる関数(処理):引数1つ ###
##### この場合は，引数の二乗を返す関数 ###
def nijou(x):
    print( x*x )
 
###### 並列計算させてみる #########
if __name__ == "__main__":
    p = Pool(2)
    p.map( nijou, range(10) )#nijouに0,1,..のそれぞれを与えて並列演算
```

結果

```python
0
1
4
16
9
25
64
36
81
49
```


とりあえず動いている。
これ本当にCPU２つ使ってるのかわからないので、数を増やしてCPU利用率を見てみる。
<img width="591" alt="スクリーンショット 2019-01-17 15.07.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/333838/8b09a9f3-a8c2-2c34-d39a-75a68824f15c.png">
今まで50%までしか使っていなかったのに100%近くなってる！
ついでに、os.getpid()でプロセスIDが取得できたので、つけてみた。

```python
1 process id: 226633
1251 process id: 226634
1252 process id: 226634
1253 process id: 226634
2 process id: 226633
1254 process id: 226634
1255 process id: 226634
3 process id: 226633
...
```
　プロセスは分かれてそうです。ただ、調べてみると1つのCPUで複数のプロセスが実行できるそうなので、あまり参考にならず・・・。

プロセスとかスレッドとか調べてみましたが深入りしてしまい終わらなさそうなので、
並列処理の勉強はここで一旦終了です。
Apache Solr 7.6 で日付のフィールドを使う


#フィールドの定義

Typeに「pdate」を指定する

#SolrJ での追加

format には「"yyyy-MM-dd'T'HH:mm:ss"」を使う。

```java

String urlString = "http://localhost:8983/solr/sandbox";
SolrClient solr = new HttpSolrClient.Builder(urlString).build();

SolrInputDocument document = new SolrInputDocument();
document.addField("id", "5");
document.addField("field_text_en", "This is test. for Date formatting ");
String dateNow = (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")).format(new Date());
document.addField("field_date", dateNow);
UpdateResponse response = solr.add(document);
System.err.println(response);
solr.commit();


```
Railsプロジェクトの作成の仕方とコマンド

Gemfileを生成してvendor/bundle以下にRailsをインストールする
　システムのgemはできるだけクリーンに保ちたい為、gemはvendor/bundleに入れてbundle execで呼び出すようにする。

自分用のメモ

## 手順
### 1. ディレクトリを作成する
コマンド

```
$ mkdir ディレクトリ名
$ cd ディレクトリ名
$ bundle init
Writing new Gemfile to /path/to/project_name/Gemfil
```

### 2.生成されたGemfileを編集する
最後の欄に＃gem "rails"と書かれているが、この「＃」を消して、gem "rails"にする
編集する時はテキストエディターでする

編集後のGemfile内

```
# frozen_string_literal: true
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails"  
```

### 3.Railsをインストールする
コマンド

``` 
$ bundle install --path vendor/bundle
```

### 4.Railsプロジェクトを生成する
コマンド

```
$ bundle exec rails new .
```

※railsコマンドの実行は頭に　bundle exec　をつける
Dynamic Port Forwarding経由でgit clone

# 想定環境

* あるLAN内からでないとアクセスできないサーバ`gitserver.hoge.com`上にあるGitリポジトリからgit cloneしたい
* アクセスにはDynamic Port Forwardingを利用したい
  * ゲートウェイサーバ`gateway.hoge.com`を経由することにする

# アンチパターン

* イヤな例: `git config --global`でプロキシを設定
  * 利用するリポジトリ全てで適用されてほしくない

# 結論

git cloneの`--config`オプションを使えば今から引っ張ってくるリポジトリのみに適用できる

# 方法

## Dynamic Port Forwardingする

```shell
$ ssh -Nf gateway -D 8080
```

この状態で`localhost:8080`にアクセスすれば，`gateway`を経由したアクセスになる．

## git cloneする

```shell
$ git clone --config http.proxy=socks5://localhost:8080 http://gitserver.hoge.com/fuga
```
Azure Pipelines のリリースゲート機能概要

※本記事は2019年1月現在の情報です
#はじめに

本記事では、Azure Pipelinesのリリースゲートという機能を紹介します。VSTS時代から存在していた機能ですが、この機能について紹介している記事があまりなかったため、作成することにしました。

#リリースゲートの目的

リリースゲート(release gate)は、サービスをリリースする際の条件(もしくはリリース後の条件)を、外部ツールが返した値を元に設定できる機能です。Azure Pipelinesでは、Build終了後のReleaseプロセスで、リリースゲートを設定をすることが出来ます。リリースゲートを用いることで、インシデント管理や品質評価等をアプリケーションのリリース前・後に自動的に行うことが出来ます。

※本記事では、リリース前にゲートを設置するという文脈で綴ります。


#ゲートの種類

デフォルトで用意されている主に利用可能なゲートは以下4つです。

・**Invoke Azure Function**
-> リリース前にAzure Functionに書かれたコードを実行し、設定した結果が返ってきたらリリースを実行する。
・**Query Azure Monitor alerts**
-> Azure Monitorで設定したアラートルールの結果を元にリリースを実行する。
・**Invoke REST API**
-> REST APIをコールし、成功レスポンスが返ってきたらリリースを実行する。
・**Query Work Items**
-> Azure Boardsに登録されたwork itemsにクエリをかけた結果を元に、設定した値が返ってきたらリリースを実行する。

本記事では、Query Work Itemsを例に紹介をします。

#リリースゲートの設定方法 
ここでは、**Work Itemsに登録されているバグが0でない限りリリースをしない**という設定をゲートを用いて行いたいと思います。

1.ビルドが終了したところから始めます。ビルドが正常に終了したら画面右上の「Release」ボタンをクリックしてください。

<a href="https://imgur.com/ZUgYV5R"><img src="https://i.imgur.com/ZUgYV5R.png" title="source: imgur.com" /></a>

2.以下の手順でクリックしていくと、ゲートを設定するところにいきます。

<a href="https://imgur.com/RSukNfN"><img src="https://i.imgur.com/RSukNfN.png" title="source: imgur.com" /></a>

3.クエリはAzure BoardsのQueriesのShared Queriesに保存されているものの中から選択することが出来ます。ここでは、Critical Bugsクエリを選択します。

<a href="https://imgur.com/Zad7Vsn"><img src="https://i.imgur.com/Zad7Vsn.png" title="source: imgur.com" /></a>

4.Upper thresholdでは、クエリの結果として返ってきた値の閾値の最大値を決めることができます。今回の例だと、Critical BugsがOO個以下だったらリリースさせるという設定を決めていることになります。ここでは、Work Itemsに登録されているバグが0個でなければ、リリースさせないという設定にしましょう。
(ゲートを評価する時間間隔も決めることができます。ここでは5分としています。)

<a href="https://imgur.com/lWYv3Rm"><img src="https://i.imgur.com/lWYv3Rm.png" title="source: imgur.com" /></a>

5.全ての設定が終わったら、画面右上のSaveボタンをクリックして設定内容を保存しましょう。

#実行・結果
1.「Create a release」ボタンをクリックし、「Create」をクリックすると手動でのデプロイを開始することが出来ます。
(今回はAzure Web Appへのデプロイを設定しています。設定方法についてはこの記事では割愛します。)

<a href="https://imgur.com/jvUnHFa"><img src="https://i.imgur.com/jvUnHFa.png" title="source: imgur.com" /></a>

<a href="https://imgur.com/GxbpXk3"><img src="https://i.imgur.com/GxbpXk3.png" title="source: imgur.com" /></a>

2.Critical Bugsのクエリを実行すると、1つbugが残っています。

<a href="https://imgur.com/JAn0qhV"><img src="https://i.imgur.com/JAn0qhV.png" title="source: imgur.com" /></a>

3.そのため、リリースのプロセスが止まっていることが分かります。

<a href="https://imgur.com/kwb4ZYH"><img src="https://i.imgur.com/kwb4ZYH.png" title="source: imgur.com" /></a>

#さいごに
本記事ではQuery Work Itemsの結果をリリースの条件として設定する手順を紹介しました。VSTSから存在していた機能なので、あまり新鮮味を感じない方もいるかと思いますが、Azure Pipelinesとして提供されてから紹介されている方がいらっしゃらなかったので、今回このような形でまとめをしました。Azure Pipelinesのリリースゲート機能には今回紹介した以外のもの(FunctionsやREST APIなど)もありますので、リリース条件を決めて自動で評価をしたい際には非常に便利な機能かと思います。

※間違っている点、補足コメント等あったら是非お願いします。自習ノートとしてまとめているものですので・・
Googleスプレッドシートで郵便番号から住所を表示する関数 その２

# 概要
セルに郵便番号を入力することで、住所を表示してくれる関数があったらなぁと思って書いた[プログラム](https://qiita.com/KensukeSakakibara/items/01470b28fd5ec4cf3416)が動かなくなっていたので、zipcloudさんのAPIを使って書き直してみました。

APIの詳細につきましてはこちらをご確認ください。
http://zipcloud.ibsnet.co.jp/doc/api

※本スクリプトをご使用の際はzipcloudさんの利用規約をご確認の上、ご利用者さん各自の責任の元でご利用ください。

# 使い方
下記をスクリプトエディタにコピペすれば関数を利用できるようになります。
`=ZIP_ADDRESS("154-0004","address1")`
みたいな感じ。

利用できるデータの種類はzipcloudさんのWEBサイトでも確認できますが次の通りです。
zipcode	郵便番号
prefcode 都道府県コード
address1 都道府県名
address2 市区町村名
address3 町域名
kana1 都道府県名カナ
kana2 市区町村名カナ
kana3 町域名カナ

```js
function ZIP_ADDRESS(zip,part)
{
  zip = zip.replace(/\-/g, '');
  var response = UrlFetchApp.fetch('http://zipcloud.ibsnet.co.jp/api/search?zipcode=' + zip);
  var res = JSON.parse(response.getContentText());
  if (res.status == 400) {
    return res.message;
  }
  
  if (res.results) {
    var address = res.results[0];
    return (address[part]) ? address[part] : "";
  } else {
    return "該当するデータがありません";
  }
}
```
SourceTreeでグローバルユーザ以外でコミットする時に困ったこと

別垢で登録するときはリモートリポジトリの指定を以下のようにする

```
https://username@github.com/username/hoge.git
```

サブドメインみたいに先頭に**username@**を付けるとコミットできるようになる
jupyter の kernel に python2 と 3 を共存させる

# Overview

pyenv で2系と3系が両方入ってるとき、

```bash
$ pyenv versions
  system
  2.7.15
* 3.6.8 (set by /Users/xxx/.pyenv/version)
```

3系で起動した jupyter の kernel に2系も追加したい話。

調べると conda 使ってやる方法は出てくるけど、conda 使わないでやる版。

# 3系で jupyter を入れる

```bash
$ python -V
Python 3.6.8

$ pip install jupyter

(..snip..)
```

kernel が追加されたの図。

```bash
$ jupyter kernelspec list
Available kernels:
  python3    /Users/xxx/.pyenv/versions/3.6.8/share/jupyter/kernels/python3
```

![スクリーンショット 2019-01-11 16.36.38.png](https://qiita-image-store.s3.amazonaws.com/0/41925/a5ccf7b4-8538-9c4d-8b0d-d784fa8233aa.png)


# 2系に kernel を入れる

```bash
$ pyenv global 2.7.15

$ python -V
Python 2.7.15

$ pip install ipykernel

(..snip..)

$ python -m ipykernel install --user

(..snip..)
```

# 3系に戻して確認　

```bash
$ pyenv global 3.6.8

$ python -V
Python 3.6.8
```

2系の kernel が追加されてる。

```bash
$ jupyter kernelspec list
Available kernels:
  python2    /Users/xxx/Library/Jupyter/kernels/python2
  python3    /Users/xxx/.pyenv/versions/3.6.8/share/jupyter/kernels/python3
```

# jupyter を再起動すると

![スクリーンショット 2019-01-11 16.39.48.png](https://qiita-image-store.s3.amazonaws.com/0/41925/b3e85ea0-ff46-8658-c664-630252774ccf.png)

おわり。

# cf.

https://ipython.readthedocs.io/en/stable/install/kernel_install.html
Oracle12c：CentOS7のGNOMEへxrdpで接続すると、インストーラーやDatabase Configuration Assistantの文字が白ける問題への対応

## はじめに
CentOS7のGNOMEへxrdp接続すると、以下のようにDatabase Configuration Assistantのウインドウ内の文字列が白けてしまい、可読困難となる場合があります。また、インストーラーでも同様の問題が発生する場合があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64876/9e3c8018-a088-5700-6e82-7df57e241535.png)

## 原因
リモートデスクトップの画面の色が「最高品質 (32ビット)」の場合、当該問題が生じる場合があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64876/a2e36988-3874-5c05-95a9-1764ee17bbe6.png)



## 対応
リモートデスクトップの画面の色が「True Color (24ビット)」に変更してから接続することで、正常に表示されるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64876/13719753-3836-c24e-282c-a0c67346357e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64876/34a9a7ab-2978-7f2f-8b3e-0a65d57222f8.png)
【Java】ループ内で使う変数はループの中で宣言しよう【ブロック内の変数】

# はじめに
forループに限らず、whileループとかif-else文とかtry-catchとか・・・。
いろいろ「ブロック」はあるけれど、その中でしか使わない変数は、ブロックの中で宣言しましょうね、というお話です。

# よくない例
```JAVA
List<String> strList = new ArrayList<String>();
String str = new String();  // ←これ！！！

for (int i = 0 ; i <= 10 ; i++) {
  str = i + "番目";
  strList.add(str);
}
```
※このプログラムが正しく動くかどうかは置いといて、スコープだけに焦点を当てて話を進めます。

`String str`をforループの外で宣言しているので、forループの外側でも使用可能です。
なので、「スコープは可能な限り小さく！」というJavaのセオリーには反しています。

## この書き方をした人に聞いてみた
２人ほどこの書き方をしていた人がいたので、「どうしてこういう書き方にしたの？」って聞いてみました。
そしたら
> 同じ`String str`を使いまわすので、メモリ節約になるかなーと :sparkles: 

無駄な変数はたくさん作らないという意味では、決して間違った考え方ではないんですけどね:sweat_smile:
だけど、スコープが不必要に広がってしまうのでNG:ng:です。

# よい例
```JAVA
List<String> strList = new ArrayList<String>();

for (int i = 0 ; i <= 10 ; i++) {
  String str = new String();
  str = i + "番目";
  strList.add(str);
}
```
※上記の「よくない例」と比較するために書きましたが、おそらく実際の現場ではこんなまどろっこしい書き方はしないと思ってます。
※このソースがイケてるかどうかではなく、スコープだけに焦点を当ててます。

`String str`を使うのはforループの中だけです。
だったら、forループの中で宣言すれば、スコープは小さくなります。

Javaは「使い終わったらすぐにメモリを開放する」ためのガベージコレクトが機能するので、forループ１回ごとに新しい`String str`が作られては解放されていきます。
そのため、あんまりメモリを意識しなくてよいと思います。

# まとめ
forループの中だけで使う変数は、forループの中で宣言する。
※一番馴染みのありそうなforループで説明しましたが、if-else文やwhileループなどでも同様です。

乱暴な言い方をすると、迷ったら一旦ループの中に変数を入れてみましょう。
エラーにならなければ、そのまま入れっぱなしでOKです。

# おまけ
「よい例」で書いたプログラムは、私の場合は、ここまで整理するかなー。

```JAVA
List<String> strList = new ArrayList<String>();

for (int i = 0 ; i <= 10 ; i++) {
  strList.add(i + "番目");
}
```
LaTeXでbibtexを使う方法

#目的
$\rm\LaTeX$でbibtexを使う

#環境
macOS Mojave
TeXLive 2017

# 下準備
jtygm.styのインストールが必要になる場合があります。
ダウンロード・インストール方法は以下の通りです。
1. http://khotta.html.xdomain.jp/ghost/psfont.html よりjtygm.styをダウンロードする
2. WindowsでTeXLive環境の場合、`C:\texlive\texmf-local\tex\latex\local`内にjtygm.styを配置する。
3. PowerShell・コマンドプロンプト等で`mktexlsr`を打ち込み実行する。

#方法
```:ディレクトリ構成
 ——TopDirectory
    ├─sankou.bib
    └─main.tex
```


```main.tex
\documentclass[a4j]{jreport}

\usepackage{jtygm} %参考文献リストでの斜体を表示するのにたぶん必要
\usepackage{url} %参考文献リストで，urlを適切な位置で改行するのに必要
\renewcommand{\bibname}{参考文献} %関連図書→参考文献に変える

%以下，junsrtかjplainの2つのうちどちらか1つを用いる
\bibliographystyle{junsrt} %参考文献リストを引用された順にソートする (個人的おすすめ)
%\bibliographystyle{jplain} %参考文献リストをsankou.bibに記載した順にソートする

\begin{document}
\bibliography{sankou} %sankou.bibのこと
\end{document}
```

```tex:sankou.bib
@book{book_label,
	Author = "{Qiita 太郎}",
	Title = "{タイトル}",
	Publisher = "{Qiita出版}",
	Year = "{2019}",
}


@misc{webpage_label,
	Author = "Qiita",
	Title = "{LaTeXでbibtexを使う方法}",
	note = "\url{https://www.qiita.com} (参照 2019-01-01)"
}
```

本文中で文献を参照する際は`\cite{book_label}`で参照できます。

# タイプセット（コンパイル）
pbibtexによるタイプセット（コンパイル）が必要となります。
詳しくは [こちら(VScodeでLaTeXをタイプセットする時の設定)](https://qiita.com/ta_b0_/items/bb8a0d4e379fb818bd14)
AWS MediaStore のファイルを全部消す方法

新年明けましておめでとうございます。

新年早々、ネタを用意できない streampack 木村です。
そんな訳で今回は小ネタを。

# MediaStore のファイル削除

ところで皆さん、MediaStore のファイルを消すの面倒じゃありませんか？
S3 みたいに一括処理ができないので、今の所一つ一つｼｺｼｺ消す以外に方法がありません。

ご存知の方も多いかもしれませんが、AWS のフォーラムで AWS CLI と awk コマンドと組み合わせた一括削除コマンドが上がっております。


```
aws mediastore-data list-items --endpoint=your endpoint -—path=path to files | awk ‘{system(“aws mediastore-data delete-object --endpoint=your endpoint --path=path to files"$6)}'
```

**How to delete all items (eg, empty container)?**
https://forums.aws.amazon.com/thread.jspa?messageID=829906&tstart=0

`your endpoint` と `path to files` をあなたの環境に合わせて叩くと全部消してくれます。


## シェルスクリプト

上記でも良いのですが毎回コマンド叩くのも面倒なのでスクリプト化しました。

```sh

#!/bin/sh

epoint="your endpoint"
path="path to files"

aws mediastore-data list-items --endpoint=$epoint --path=/$path --output=text | awk '{system("aws mediastore-data delete-object --endpoint='"${epoint}"' --path=/'"${path}"'/"$6)}'
```

簡単ですみません・・・
今回は以上！

# 2019/3/7 追記

`profile`と`region`も変数化しました。

```sh

#!/bin/sh

epoint="your endpoint"
path="path to files"
region="ap-northeast-1"
profile="your profile"

aws mediastore-data list-items --region=$region --profile $profile --endpoint=$epoint --path=/$path --output=text | awk '{system("aws mediastore-data delete-object --endpoint='"${epoint}"' --profile '"$profile"' --region='"$region"' --path=/'"${path}"'/"$6)}'
```
Amazon ECS サービス作成に失敗する

ECSのサービスの作成でこんなエラーがでた場合！


`エラーメッセージ: Service already exists. (Service: AWSServiceDiscovery; Status Code: 400; Error Code: ServiceAlreadyExists; Request ID: ...)`


![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/22244732-dbd3-9b1a-353d-c6f3476204b5.png)


原因： Serviceがすでに存在しているから。

対処1：別のサービス名で作成する。

対処2：「サービスの検出サービスの設定」を「既存のサービスの検出サービスの選択」で進める。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/9e1ed41a-669c-df3e-4082-ddf3773508af.png)
Qiita API v2で一部リソースにアクセスできなくなったので確認してみた

下記の記事でQiita API v2を利用しているのですが、2019/01/11 11時の更新ができてなかったので、調べてみたらQiita API v2の一部リソースにアクセスできなくなった模様。。。(2019/01/11 16時時点)


Qiita週間ストック数ランキング【自動更新】 - Qiita
https://qiita.com/kai_kou/items/180a91fd88dbbbd746f6

`Not found`なので、アクセストークンが無効ってわけでもなさそう。


```sh
# items: OK
curl "https://qiita.com/api/v2/items
[{"rendered_body":"(略)

# items/:item_id: OK
> curl "https://qiita.com/api/v2/items/b4ac2d316920e08ac75a"
{"rendered_body":(略)

# items/:item_id/like: NG
> curl "https://qiita.com/api/v2/items/b4ac2d316920e08ac75a/like" \
  -H "Authorization: Bearer Qiitaのアクセストークン"
{"message":"Not found","type":"not_found"}

# items/:item_id/stock: NG
> curl "https://qiita.com/api/v2/items/b4ac2d316920e08ac75a/stock" \
  -H "Authorization: Bearer Qiitaのアクセストークン"
{"message":"Not found","type":"not_found"}
```

:item_id以下のリソースにアクセスできなくなってるので、ルーティングまわりの改修でデグレた疑惑w

Qiita:Supportへ問合せしたものの、金曜日だし夕方だし、いつ対応になるやら。。。
そういえば、前に同じようなことがあったのも金曜日だったようなぁぁぁ。。。

Qiitaのコメント数表示がおかしくなったので調べてみた - Qiita
https://qiita.com/kai_kou/items/58e8e009b058ffaed6a3

## 参考

Qiita API v2ドキュメント - Qiita:Developer
https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF
Google Colaboratory でPython 機械学習 に入門する

# Google Colaboratory とは
Colaboratory は、完全にクラウドで実行される Jupyter ノートブック環境です。設定不要で、無料で利用できます。

Python の学習に最適だと思います。

#使い方
1. Google アカウントでログイン
1. [Google Colaboratory](https://colab.research.google.com/) を開く
1. 新しいノートブック を選択
1. 作成したノートブック(ipynbファイル)は [Googleドライブ - マイドライブ - Colab Notebooks] へ保存される

#学習１．回帰分析

scikit-learnなど主要なライブラリはインストール済みです。

【Python】scikit-learnの使い方を直線回帰分析で速習 
https://code-graffiti.com/practice-scikit-learn-in-python/

問題なく学習できました。

#学習２．サポートベクターマシンで手書き文字認識

Recognizing hand-written digits
https://scikit-learn.org/stable/auto_examples/classification/plot_digits_classification.html

"Download Jupyter notebook: plot_digits_classification.ipynb"からノートブックをダウンロードし、そのまま動きました。
AWS RDSについて

自分がAWSのRDSについて調べたことを備忘録として記録しておきます。

# RDSについて
**AWS(Amazon Web Service)上で使えるデータベースのこと。**
Relational Database Serviceの略で、クラウド上で提供するRDBMSサービスである。
クラウド上で提供されているので運用の負荷が劇的に削減できるメリットがある。

# RDSの機能
・プロビジョニング
・パッチの適用
・バックアップ
・リカバリ
・障害検知
・リペア

##特筆機能
### Multi-AZ機能
データベースの可用性を高めることができる機能で、通常のDBと異なり、冗長構成を組む際にとらなければいけなかった親機と子機のデータの同期をAWS側が自動でしてくれる。これによりユーザーは同期をとる構成を組む必要がなくなる。また、フェイルオーバー機能を使い、親機に障害があった際に自動で子機に切り替えが行われる。
### RR(リードレプリカ機能)
読み取り専用のレプリケーションを作成できる機能。親機に読み取りにかかる負荷を軽減できるので、結果として親機のパフォーマンスが向上する。

# RDSの利点
・作成後にサーバのスペックを変更できる
・後からストレージの容量を増やせる
・オンプレミスでデータベース構築に必要な作業をRDSが担ってくれる

# 対応DBエンジン
AWSで使えるRDSはライセンスが必要なものと不要なものに分かれている。また、ライセンス料が必要なものでも、AWSのRDSの場合、ライセンス料が時間単価に含まれているので、ライセンスの契約期間を気にすることなく利用停止することができる。

## AWSで使えるRDS一覧
### ライセンス料不要
　・MySQL
　・PostgreSQL
　・Microsoft SQL Server
　・Amazon Aurora
　・MariaDB
### ライセンス料必要
　・Oracle

## RDSのインスタンスタイプ
RDSはDBインスタンスのサイズによってかかる費用が変わってくるので、インスタンスを選択する前に自分が使うデータ量を加味してインスタンスを選ぶことが重要です。

### 主なインスタンスタイプ（2019/1/11現在）
| インスタンス | 特徴                                                                        |
|:-----------:|:---------------------------------------------------------------------------:|
| R４          | メモリに特化したインスタンス。通常のM3インスタンスよりも大きいメモリを積んでいる。 |
| M5          | スタンダードなインスタンス。コア数、メモリ共に普通の一般的なインスタンス。         |
| T2          | ミニマムなデータベースに最適なインスタンス。                                     |

##最後に
現状、ざっくりとしかRDSについて把握できていないので、また追加で書くかもしれません。。。
javascriptでURLクエリーを簡単に取得してみた

- やり方は色々あったが、わかりづらかったので、自分なりに簡単な方法を考えてみた。
- いつも誰かのコピペしてたので、自分で書けるようにしたかった
- ~~for文よりforEachの方が好き派~~⇦初心者の考え
- forEachが好きとか言ってたら，forEachは最終手段らしい(なるべく，map,filter,reduceなどを使うべし) <br>
参照: [JavaScript で forEach を使うのは最終手段](https://qiita.com/diescake/items/70d9b0cbd4e3d5cc6fce)
- とりあえず，foreachで書いてみた

```main.js
function getParams(){
    // クエリーparamは?からなので、まず?で分割
    // paramが複数ある場合のため&で分割
    var params = location.search.split('?')[1].split('&');
    // オブジェクトで取れるようにする
    var data = {};
    params.forEach(function(param){
        // =でkeyとvalに分ける
        var key = param.split('=')[0];
        var val = param.split('=')[1];
        data[key] = val;
    });
    return data;
}
```
コメントにあるようforEachではなく，reduceで書いた方が良いとのこと．

reduceで修正した

```reduce.js
function getParams(){
    // クエリーparamは?からなので、まず?で分割
    // paramが複数ある場合のため&で分割
    var params = location.search.split('?')[1].split('&');
    // reduceで生成したオブジェクトを直接返す
    return params.reduce(function(data, param) {
	    var key = param.split('=')[0];
	    var val = param.split('=')[1];
	    data[key] = val;
	    return data;
	}, {});
}
```
reduceを使うことでdataの宣言がいらなくなった.(reduceの第二引数でinitialValueとして{}を入れた)

>配列のデータを集計するような場合にはreduceを使います。

なるほど．．配列から何か新しいデータを生成するときはreduceとかmapの方が良いみたいだな
ということで，なるべくforEach使わないようにしよ

以上。ご自由にお使いください。
WebStorageAPIを使って初回アクセス時だけLoadingを表示する

初回アクセス時だけLoadingを表示するために、
WebStorageAPIを使ってみたまとめ

# WebStorageAPIって何？
> Web Storage API は、Cookie を使用するよりも直感的な方法で、ブラウザがキーと値のペアを保存できる仕組みを提供します。

https://developer.mozilla.org/ja/docs/Web/API/Web_Storage_API

ブラウザに何やらデータが保存しておけるという仕組みらしい。

# sessionStorageとlocalStorage
sessionStorageとlocalStorageの2種類のストレージが用意されている。

| 種類 | 別ウィンドウ（タブ） | 保存期間 |
|:-----------|:-----------:|:-----------|
| sessionStorage      | NG | ブラウザを閉じるまで      |
| localStorage      | OK | 永久      |

# データのセットと取得
今回はブラウザを閉じたら再度Loadingを表示させたいので、
sessionStorageを使うことにします。

具体的な使い方としては、
sessionStorage.setItemを使ってデータをセット、
sessionStorage.getItemを使ってデータを取得します。

## sessionStorage.setItem

```
# keyとvalueを使ってデータをセット
sessionStorage.setItem('key', 'value');
```

## sessionStorage.getItem

```
# keyを指定してデータを取得
sessionStorage.getItem('key');
```

# 初回アクセス時判定
ブラウザに保存されたデータで、初回アクセスの判定をします。
データが保存されていれば2回目以降のアクセスになり、
データが保存されていなければ初回アクセスという事になります。
<p data-height="265" data-theme-id="0" data-slug-hash="oJapQx" data-default-tab="js,result" data-user="kfunnytokyo" data-pen-title="WebStorage" class="codepen">See the Pen <a href="https://codepen.io/kfunnytokyo/pen/oJapQx/">WebStorage</a> by kayukihashimoto (<a href="https://codepen.io/kfunnytokyo">@kfunnytokyo</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


# 初回アクセス時だけLoadingを表示する
あとはLoadingで表示させたいテキスト、アニメーションを用意して、
cssで調節すればOK。

これで初回アクセス時だけLoadingを表示する事が出来ました。

<p data-height="265" data-theme-id="0" data-slug-hash="gZBoJX" data-default-tab="js,result" data-user="kfunnytokyo" data-pen-title="WebStorage" class="codepen">See the Pen <a href="https://codepen.io/kfunnytokyo/pen/gZBoJX/">WebStorage</a> by kayukihashimoto (<a href="https://codepen.io/kfunnytokyo">@kfunnytokyo</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

おわり！
VBA_ログファイル作成

#1.概要
・VBAのログファイル関数を作成。
・書き込みは追記式

#2.ソースコード

```vb
Sub LogTest()
    Dim i As Long
    For i = 0 To 5
       Call DebugPrintFile("テスト")
    Next
End Sub

'ログファイルを作成。書き込みは追記式、ファイル名、フォルダ名は省略可
Function DebugPrintFile(arg_Data As Variant, Optional arg_filename As String, Optional arg_folderpath As String)
    Dim lngFileNum As Long 'ログファイルのファイル番号
    Dim strLogFile As String 'ログファイルのパス
    
    'ファイル名の指定があれば適用
    If arg_filename = "" Then
        arg_filename = "Log_Debug.txt"
    Else
        arg_filename = arg_filename & ".txt"
    End If

    'フォルダの指定が無ければ直下
    If arg_folderpath = "" Then
        arg_folderpath = ThisWorkbook.Path
    End If

    'ログファイルのパスを作成
    strLogFile = arg_folderpath & "\" & arg_filename
    
    '現在使用されていないファイル番号を取得
    lngFileNum = FreeFile()
    
    '追記式(Append)でファイルを開く(中身が消えていいならOutPut)
    Open strLogFile For Append As #lngFileNum
    
    '取得したファイル番号にarg_Dataを書き込み
    Print #lngFileNum, arg_Data
    
    'ファイルを閉じる
    Close #lngFileNum

End Function

```

#3.出力結果

Log_Debug.txt

```
テスト
テスト
テスト
テスト
テスト
テスト
```

#4.出典
https://tsware.jp/tips/tips_546.htm
AWS内で完結するウェブアプリケーションの作成 （仮想環境へのサンプルアプリケーションの搭載編）

## 前回の記事について
[AWS内で完結するウェブアプリケーションの作成 （仮想環境の構築編）](https://qiita.com/MMorioka/items/33e0eed7482fd03ee310)の続きです。
先ずはこちらを参照いただければ幸いです。

## 作成条件
- 基本的にAWS内で完結させる。ローカルへのアプリダウンロード等は行わない。
- できる限り無料枠を利用する。
- AWSアカウントを所持していることを前提条件とする。
- [AWS内での仮想環境の構築が完了している](https://qiita.com/MMorioka/items/33e0eed7482fd03ee310)ことを前提条件とする（上記リンク参照）。

## 構築手順
### 1.サンプルアプリケーションの搭載
AWSにログインし、[AWS マネジメントコンソール](https://us-east-2.console.aws.amazon.com/console/home?region=us-east-2#)に移動する。
![帰社日 画像集 (000).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/bef30039-5696-b2be-a231-cbd66e3b29ec.jpeg)

**開発プロジェクトを開始**をクリックする。
![帰社日 画像集 (6).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/b3b5456a-dad2-1aea-5c45-fb6bc7c994c6.jpeg)

**新規プロジェクトの作成**をクリックする。
![帰社日 画像集 (7).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/62d9eeae-1b36-0617-c42a-5b18ecc393e1.jpeg)

メッセージボックスが出るので、**はい、ロールを作成します**をクリックする。
![帰社日 画像集 (8).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/4d007add-9d89-18a1-6dad-8769bfb8a884.jpeg)

**プロジェクトを開始する**をクリックする。
![帰社日 画像集 (9).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/2378a6c3-5cda-c0e8-1304-f816a2cb175c.jpeg)

プロジェクトのテンプレートを選択する。
今回は**Java Spring ウェブアプリケーション Amazon EC2(管理している仮想サーバーで実行）を選択**。
![帰社日 画像集 (10).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/28a673db-ad04-9e5d-bd8c-d3f485481922.jpeg)

プロジェクト名に任意の文字列を入力し、**AWS CodeCommit**リポジトリを選択する。
プロジェクトID、リポジトリ名が自動入力されているのを確認し、**次へ**をクリックする。
![帰社日 画像集 (11).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/1db66608-d0d9-5962-4017-356d62c157b6.jpeg)

チェックボックス「AWS CodeStarが、お客様に代わって、AWSリソースを管理する権限を要求しています」にチェックし、
**プロジェクトを作成する**をクリックする。
![帰社日 画像集 (12).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/0c0bea38-b832-e4c3-3d72-eaa91011bdf3.jpeg)

メッセージボックスが現れるので、プルダウンで「AWS内で完結するウェブアプリケーションの作成 （仮想環境の構築編）」にて作成したキーペアを選択し、**プロジェクトを作成する**をクリックする。
![帰社日 画像集 (13).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/8a7e8491-a583-863e-e20d-56953dc3e601.jpeg)

**AWS Cloud9**を選択し、**続行**をクリックする。
![帰社日 画像集 (14).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/54802239-4fde-79cf-b66d-9e031d9fcdf9.jpeg)

**t2.micro**を選択し、**次へ**をクリックする。
![帰社日 画像集 (15).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/30770c92-8f1e-ccfe-b176-bf99bd280443.jpeg)

以下の画面が表示されると、今回の目的である「仮想環境へのサンプルアプリケーションの搭載」は完了となる。
![帰社日 画像集 (15.5).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/d4422b15-a4df-3f2b-f0b7-fdc6d1109517.jpeg)

### 2.サンプルアプリケーションの表示
ダッシュボードをクリックする。
![帰社日 画像集 (16).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/cc70eb1c-9227-fbad-8e36-85fa9c00fbd1.jpeg)

アプリケーションのエンドポイントのリンクが表示されたらクリックする（数分かかる場合がある）。
![帰社日 画像集 (17).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/944195a7-ed9f-05c3-79d1-98feaa6982f7.jpeg)

Amazonが用意したサンプルアプリケーション（ムービー）が再生される。
![帰社日 画像集 (18).jpg](https://qiita-image-store.s3.amazonaws.com/0/243247/6f497182-8147-a5b7-62b7-8431f4ad8b5e.jpeg)

## Congratulations!
以上で仮想環境へのサンプルアプリケーションの搭載は完了です。
続きの記事ができましたので、こちらも参照していただければ幸いです。
[AWS内で完結するウェブアプリケーションの作成 （アプリケーションの構築編）](https://qiita.com/MMorioka/items/af392b88a6f0c5951cb3)
Cognos Analytics の折れ線グラフで縦に基準線を引く

#概要
ご質問を頂きましたので、回答ついでに投稿します。

折れ線グラフで、こういう表現ができるか、というご質問です。
日付1、日付2のプロンプトで指定した日付が、折れ線グラフ上での位置が分かるように、青い縦線、赤い縦線が表示されています。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/04a50a28-c961-49b0-f8e7-1773a4cfd8fd.jpeg)

#実装方法
基本的な技術は、グラフのプロパティにある「カテゴリー基準線」を使用します。
画面は、日付1プロンプト(パラメーター名はp1)用の設定ですが、カテゴリー基準線を「レイアウト計算」で作成し、レポート式に以下を記載しています。
[グラフ].[日付] = ParamDisplayValue('p1')
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/14d67fc7-5502-1f55-0f4d-27be571aa0b6.jpeg)

ポイントはもう一つ、レポート内で使用している[日付]は、全て以下のようにchar(10)にcastしています。
cast([販売 (クエリー)].[時間].[日付],char(10))
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/ada44c78-75bd-fb9f-d404-cd732282ab6e.jpeg)

castしている理由ですが、このカテゴリー基準線の式の定義で、以下の様に、Date型 = Date型にした場合に、検証はOKなものの、実際にレポート実行すると基準線が表示されず、char型 = char型か、int型 = int型にする必要があるようです。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/5a701a7a-ca0b-a0e0-b83b-a083d8937769.jpeg)

簡単ですが、以上です。
NiZ製キーボードの設定をMacからParallelsで行う

# NiZ atom66

NiZからミニレイアウトである「atom66」が登場しました。

![IMG_20190110_175845.jpg](https://qiita-image-store.s3.amazonaws.com/0/142812/8651829e-4e16-2e42-1187-ae5b9ef3d929.jpeg)

奥にあるのがNiZの７５キー、手前がatom66です。HHKBそっくりですね。しかもこいつはキーリマップができちゃうんです（新しいHHKBはキーリマップできちゃうんですが）。

ところがキーマップを変更するにはWin機が必要になってきます。しかし我が家にはMacしかありません。どうしたものでしょうか。

# MacでNiZ製キーボードを設定する

そんなときは[Parallels](https://www.parallels.com/jp/)でなんとかしましょう。

で、この記事は終わってしまうんですが、ハマってしまった箇所があるので、そこを紹介しましょう。

## まずは普通にツールをインストール

[Nizのダウンロードページ](https://www.nizkeyboard.com/download/)から自分のキーボードにあったものをダウンロードします。インストールせずにスタンドアロンで動作するようです。無線モデルは有線でPCに接続し、`ｅｘｅ`ファイルを実行します。

## ところが

ここで一旦ハマります。。

    Keyboard is not connected

と出てしまい、ツールが起動しません。

## 解決策

Parallels のメニューバーから [デバイス]-[USBとBluetooth]-[（キーボード名）]を選び、Windows VMに直接機器を接続します。それから先程のツールを起動すると、起動できているはずです。

![スクリーンショット 2019-01-11 14.20.41.png](https://qiita-image-store.s3.amazonaws.com/0/142812/ea5882f9-494b-90b0-cc62-54a11ffcd0a2.png)

# その他Tips

これで基本的におしまいなんですが、その他Tipsを少し

## 上記方法でも Keyboard is not connected になる

キーボードがMacモードになっている可能性があります。
`win / mac` キー（デフォルトでは右Fn+左Win）を3秒ほど長押ししてください。そうするとバックLEDが光ります。これでWinモードとMaｃモードがトグルしましたので、これでツールを起動してみてください。

## カスタム内容が反映されない

![スクリーンショット 2019-01-11 14.25.56.png](https://qiita-image-store.s3.amazonaws.com/0/142812/dc27a7ce-32b3-6eac-4c12-cbc0a6e1b137.png)

キーボードをカスタムした結果をキーボードに反映させるには、[WriteKeys]をクリックします。そうするとキーボードへの書き込みがはじまります。
また、キーボードがプログラムモードになっていることを確認してください。Fnキーと丸Mキーを長押し、もしくは裏面にスイッチが有る場合はそれをプログラムモードにします。

2度目以降からは `ReadAll` をクリックしてキーボードからレイアウトデータをダウンロードし同期した状態からリマップしましょう。

## ソフトウェアキーボードを使う

もう一台キーボードがあったり、ノートの組込みキーボードがあればいいですが、Nizキーボードしか手元にない場合、カスタマイズが非常に不便です。こういったときはソフトウェアキーボードを使うとよいでしょう。

システム設定のアクセシビリティから[スイッチコントロール]を選択します。

![スクリーンショット 2019-01-11 14.26.55.png](https://qiita-image-store.s3.amazonaws.com/0/142812/8039bbf9-1619-0bde-4c0a-c4c48aef24ae.png)

上記の[スイッチコントロールを有効にする]にチェックを入れるとソフトウェアキーボードが出現します。これを用いてキーを入力するとスムーズにカスタマイズが進みます。

![スクリーンショット 2019-01-11 14.29.11.png](https://qiita-image-store.s3.amazonaws.com/0/142812/b21078e8-afc6-fe17-4339-0887da913d5e.png)
値が増加し続ける三角関数

![ずっと増え続けるSin関数 - Google スプレッドシート - Google Chrome 2019-01-11 14.57.57.png](https://qiita-image-store.s3.amazonaws.com/0/128561/24b1c263-9c8c-2b29-2962-fcb0811d9388.png)

いきなりですが、上の図の様に値がなめらかに増え続けるSin関数欲しいと思ったことはありませんか。
私はあります。
意外と無いものなので自作しました。すでにあったらごめんなさい。
関数名がダサいのとMathfの拡張メソッドになってないのでそこら辺は適当でお願いします。

```c#:esin.cs
	float ESin(float rad){
		float HALF_PI = 0.5f*Mathf.PI;
		int num = Mathf.FloorToInt( rad / HALF_PI );
		if ( (num & 1) == 0 ){
			return num + Mathf.Sin( Mathf.Repeat(rad, HALF_PI) );
		}
		else{
			return num + (1.0f+Mathf.Sin( Mathf.Repeat(rad,HALF_PI)+1.5f*Mathf.PI ));
		}
	}
```

やってることは0.5PIから1.5PIにラジアンを飛ばすことでSin関数をなめらかにつなげつつ、0.5PI毎に値が増えるようにしています。

Unityなどで歩きの様に振動しながら増え続ける物に使うとそれっぽく動きます。
三角関数の周期を使っているので、上下動に三角関数使って同期させたり任意の時間で特定の位置まで線形補間するみたいな用途にも使えるので割と便利だと思います。
php cURLを使う時、CA証明書が必須になってる

####開発環境
- Windows 10
- XAMPP

phpで、file_get_contentsが便利すぎて使ってたんですけど、タイムアウトの設定ができないとかで最近は、cURLを使うといいよっていう記事がたくさん出てくるんですが、どうもうまく動かない。
ということで調べてみました。c

#CA必須
CAとは、客室乗務員、、、ではなくて、Certification Authority。認証局のことです。その証明書が以下でダウンロードできます。

https://curl.haxx.se/docs/caextract.html

cacert.pem
というリンクがあるのでダウンロードします。

これを指定しないとphpでcURLが使えません。

サーバーだとたぶん、最初から入っているんじゃないかと思います。
古い場合はアップデートが必要です。

これは、認証局の情報で、SSL通信するときに、証明書のやり取りが行われて、正しいものかどうか判定するわけですがどこに問い合わせているかというと、認証局といわれるところです。
そこの情報が書かれたファイルがcacert.pemというファイルです。

ここに認証局の情報が入っているっていうことです。

##対応について
一応、基本的なところは簡単に説明しますと
php.ini
にて
extensionで
curlとopenssl
を有効にする必要があります。

caを参照するには、opensslであるためです。
なので、opensslの設定箇所で以下のように記述します。これは、xampp/phpにファイルを配置したのでそのように指定しています。
確認する箇所は3か所ですね。

```ini:php.ini
extension=php_curl.dll
extension=php_openssl.dll

openssl.cafile= C:\xampp\php\cacert.pem
```

これで、webサーバーを再起動でOK。
tigから直接やっていく

# まとめ

* tigでは`:`でtigのプロンプトが開ける
* tigプロンプトでは`!`から始まる文字列で外部コマンドが実行できる
* コマンド中に`%(file)`を書くとファイル名に展開できる
* 上記より`:!git checkout :%(file)`と打つことにより今見ているファイルだけHEADに戻せる

# 日常風景

tigでコミット眺めながら「このファイルだけいらんなー」とか思うものの、シェルに戻ったりショートカット作ったりする手間がめんどくさいことよくありませんか？
僕はあります。

標準のキーバインドは`h`で見れますが、cherry-pick、ブランチのチェックアウト、ファイルのstaging/unstaging、stash操作はあるものの、あらゆる操作が登録されているわけではありません。

[キーバインドを定義](http://jonas.nitro.dk/tig/manual.html#commit-id)することでgitにまつわる（git以外のコマンドも可）いろんな操作が行なえますが、設定ファイルを編集してリロード(`source`でできるけど)するのは微妙に億劫ですし、そもそも俺はドリルじゃなくて穴が欲しいんだ。

というわけでワンショットで実行したいわけです。

# tigの中からコマンドを実行する。

tigの対話画面上で`:`を入力すると[プロンプト](http://jonas.nitro.dk/tig/manual.html#prompt)が開きます。
プロンプトでは`!`か`exec`で外部コマンドを実行できます。
git操作系のデフォルトのキーバインドも同じ感じで定義されているだけなので、似たような感じでいけます。

[ユーザ定義コマンド](http://jonas.nitro.dk/tig/manual.html#commit-id)のところに利用できる変数がたくさん書いてあるので、適当に使っていけばいいでしょう。

とりあえず今カーソルがあるファイルだけをHEADに戻したいなら`:!git checkout %(file)`と打てばよいでしょう。

カーソルがあるファイルだけの履歴が見たければ`:!git log %(file)`でいけます。

# Git上の絶対パスに展開する

`%(file)`はリポジトリのルートディレクトリからの相対パスに展開されるので、カレントディレクトリが.gitディレクトリのあるgitのルートディレクトリでないとコマンド実行に失敗するでしょう。

そんな時はgitの絶対パスを使いましょう。絶対パスを使うと、git（およびgitリポジトリを扱うツール）では、現在いるディレクトリを無視して、直接そのファイルを操作できます。

tigのプロンプト中でファイル名の頭にコロンを付ける（`:%(file)`）と絶対パスとして展開してくれます。

# 感想

時々便利。
detailsタグ、summaryタグについて

HTML5.1から追加されてる detailsタグ、summaryタグが中々使い勝手が良さそうだったのでメモ  

## detailsタグ、summaryタグとは

> HTML の詳細折りたたみ要素 (details) は、ウィジェットが open 状態になった時のみ情報が表示される折りたたみウィジェットを作成します。概要やラベルは summary 要素を使用して提供することができます。

> 折りたたみウィジェットはふつう、回転して開閉状態を示す小さな三角形を使用し、その隣のラベルと共に画面上に表現されます。 details 要素の最初の子要素が summary の場合は、 summary 要素が折りたたみウィジェットのラベルとして使用されます。

（https://developer.mozilla.org/ja/docs/Web/HTML/Element/details より引用）

要約すると、簡素なアコーディオンが作れるタグ

## 実装方法
detailsタグの中に見出しとなるテキストをsummaryタグで囲む。
アコーディオンと中身になる部分を記述する。
（Qiitaでは記事にタグを直書きすると反映される。）

```
<details>
    <summary>見出し</summary>
    あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。
</details>
```

<details><summary>見出し</summary>あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。
</details>

## 長所
### javascriptでの実装が不要
htmlだけで実装できるので、別途javascriptを記載する必要がない。

### cssで調整しやすい
中身の表示、非表示がdetailsタグの属性(open)で管理されるのでjavascriptでアコーディオンを作る時の
「is-open」のようなクラスを付けたり外したりするように使える。

また、見出しの横に表示される「▶︎」も以下の記述で消す事ができる。

__Chrome__ 

```
summary::-webkit-details-marker { display: none; }
```

__Chrome以外__ 

```
summary { list-style: none; }
```

[Qiita](https://blog.qiita.com/151329031329-2/)、Github内でも使えるので、以下のような行数が多いコードを共有する時等使い道が結構ありそう。

<details>
  <summary>長めのコード</summary><div>

```

<ul class="numList">
    <li class="numList-item">list-1</li>
    <li class="numList-item">list-2</li>
    <li class="numList-item">list-3</li>
    <li class="numList-item">list-4</li>
    <li class="numList-item">list-5</li>
    <li class="numList-item">list-6</li>
    <li class="numList-item">list-7</li>
    <li class="numList-item">list-8</li>
    <li class="numList-item">list-9</li>
    <li class="numList-item">list-10</li>
    <li class="numList-item">list-11</li>
    <li class="numList-item">list-12</li>
    <li class="numList-item">list-13</li>
</ul>

<table class="numTable">
    <thead>
        <tr>
            <th colspan="4">thead-1</th>
        </tr>
        <tr>
            <th rowspan="2">thead-2<</th>
            <th>thead-3</th>
            <th>thead-4</th>
            <th>thead-5</th>
        </tr>
        <tr>
            <th>thead-6</th>
            <th>thead-7</th>
            <th>thead-8</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>tbody-1</td>
            <td>tbody-2</td>
            <td>tbody-3</td>
            <td>tbody-4</td>
        </tr>
        <tr>
            <td>tbody-5</td>
            <td>tbody-6</td>
            <td>tbody-7</td>
            <td>tbody-8</td>
        </tr>
        <tr>
            <td>tbody-9</td>
            <td>tbody-10</td>
            <td>tbody-11</td>
            <td>tbody-12</td>
        </tr>
    </tbody>
</table>
</details>
```
</div>
</details>

## 短所
### edge,IE11で見れない

edge、IE11で見られる機会があるサイトでの実装は避ける。
[iOS、Android](https://caniuse.com/#search=details)では問題なく使える。
~~Android4系でも使えるのにedgeで使えないってどうなん~~

### 開いたり閉じたりする間のアニメーションを実装できない。
よくある中身が伸びたり縮んだりする動き等が実装できないため、アニメーションありきの実装は難しい。


## まとめ
企業サイト等、IEでの流入があるサイトで使用するのはまだ難しいが、QiitaやGithubのように技術者メインのサイトで、アニメーションの実装が不要なサイトであれば実装可能

余裕あれば後々、detailsとsummaryタグでアニメーションも作る予定。
Fire action when UICollectionView page changed

## conclusion
Use UIScrollView#scrollViewDidScroll
Check weather page changed in this func, then fire action if true.

## memo
### UICollectionViewCell's state
UICollectionViewCell instance has two state.
- isSelected
- isHighlighted

ref:
https://developer.apple.com/documentation/uikit/uicollectionviewcell

But it's not useful for this purpose

### UIFocusEnvironment
At first, "focus" is useful I think.
But my colleague says it may not be used often.
I searched for this usecase.
use it when change focus manually.
Python3: reportlab で A4横 PDF ファイルを作成

次のような A4横ファイルを作成する方法です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/484cb3d5-34cd-18e1-8710-b7bc1acb293e.png)

```py:gen_landscape.py
#! /usr/bin/python
#
#	gen_landscape.py
#
#						Aug/08/2022
#
# ------------------------------------------------------------------
import	sys
#
from reportlab.pdfgen import canvas
from reportlab.pdfbase.pdfmetrics import registerFont
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.lib.pagesizes import A4, landscape, portrait
from reportlab.lib.pagesizes import A3
from reportlab.pdfbase.ttfonts import TTFont
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
file_out = sys.argv[1]
sys.stderr.write(file_out + "\n")
#
IPAG_TTF = "/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf"
TakaoMincho_TTF = "/usr/share/fonts/truetype/takao-mincho/TakaoMincho.ttf"
TakaoGothic_TTF = "/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf"
#
#IPAG_TTF = "/usr/share/fonts/OTF/ipag.ttf"
#TakaoMincho_TTF = "/usr/share/fonts/OTF/TakaoMincho.ttf"
#TakaoGothic_TTF = "/usr/share/fonts/OTF/TakaoGothic.ttf"
#
registerFont(TTFont('ipag', IPAG_TTF))
registerFont(TTFont('takao_mincho', TakaoMincho_TTF))
registerFont(TTFont('takao_gothic', TakaoGothic_TTF))
#
pdf_canvas = canvas.Canvas(file_out,pagesize=landscape(A4))
#pdf_canvas = canvas.Canvas(file_out,pagesize=landscape(A3))
#
ypos = 500
str_base = "日本語でこんにちは！　"
for font in ['ipag','takao_mincho','takao_gothic']:
	pdf_canvas.setFont(font, 30)
	str_out = str_base + font
	pdf_canvas.drawString(100, ypos, str_out)
	ypos -= 100
#
ypos = 200
str_base="2022年8月8日 PM 12:48"
for font in ['ipag','takao_mincho','takao_gothic']:
	pdf_canvas.setFont(font, 15)
	str_out = str_base + "  " + font
	pdf_canvas.drawString(400, ypos, str_out)
	ypos -= 50
#
pdf_canvas.showPage()
pdf_canvas.save()
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行方法

```bash
./gen_landscape.py out01.pdf
```

次のバージョンで確認しました。

```text
$ python --version
Python 3.10.4
```

A4縦 PDF ファイルを作成する方法のサンプルはこちら
[Python3: reportlab で PDF ファイルを作成](https://qiita.com/ekzemplaro/items/8b5abe1fe7d9c9bdde0e)
Ubuntuにリモートデスクトップで接続したいがpassword failedと言われる

とてもマイナーなエラーだったが解決方法をみつけるのに時間がかかったので、解決方法を共有する

## 現象  
* AWSでUbuntuを使用しておりGUI環境も整備していた
* ある日突然リモートデスクトップでの接続ができなくなった(Window remote desktop, Ubuntu Remmina)
* 正しいパスワードを入れているがpassword failedと言われる
* sshからは接続することができる
* Web上で見つけた解決方法[https://www.raspberrypi.org/forums/viewtopic.php?t=31814] ```sudo service xrdp restart```しても解決しなかった  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190972/791d0ac8-7dc8-131c-2863-b9225619c727.png)


## 環境
* AWS Ubuntu 16.04 LTS
* Windows10 remote desktopまたはUbuntu 18 Remminaから接続

## 解決方法
* xrdpのversionを上げることにより解決した
* このサイト[https://netdevops.me/2017/installing-xrdp-0.9.1-on-ubuntu-16.04-xenial/] を参考にxrdpを0.6から0.9にアップグレ
ードした    


1. xrdpのバージョン確認  
```
xrdp -v
```  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190972/4e5f2afd-afa0-da69-1838-ec150690949b.png)  
0.6となっている

2. xrdpのアップグレード  
```
sudo add-apt-repository ppa:hermlnx/xrdp
sudo apt-get update
sudo apt-get install xrdp
sudo service xrdp restart
```

3. 再びxrdpバージョン確認  
```
xrdp -v
```  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190972/66b0d4af-fdd3-27da-e12a-8d706616f3f0.png)

0.9に更新された



これによりリモートデスクトップ接続が再びできるようになった。どうやら何かのアップデートによりxrdpの古いバージョンでは接続できなくなってしまったみたい。
p5.jsでヒレが元気に動く魚を作ってみた！

先日、魚のマウスストーカーが実装される拡張機能を作りました！
![kakucyou.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/690dd76b-ef09-4042-4264-59d1466f2217.gif)

gif動画では確認しにくいのですが、実はこの魚たちは`p5.js`で作られていて、ヒレや尾びれも元気に動いています笑

ここでは、`p5.js`における魚の作り方を紹介します。参考になれば幸いです。

## 成果物
![fishMoving.gif](https://qiita-image-store.s3.amazonaws.com/0/314351/18eaab8d-f2ce-7d89-2372-c2eeeeb82453.gif)

## 魚の基本形

まずプログラムを紹介し、その後に解説を進めていきます！

```p5.js
class Fish {
  constructor(x, y) {
    this.position = createVector(x, y)
    this.theta = 0
    this.color = { filet: color(153, 206, 255), body: color(30, 144, 255) }
  }

  update() {
    this.theta += PI / 100
  }

  display() {
    push()
    noStroke()
    translate(this.position.x, this.position.y)

    //左右のヒレ
    for (let i = -1; i <= 1; i += 2) {
      push()
      fill(this.color.filet)
      translate(0, 10)
      rotate((PI / 12) * sin(this.theta * 2) * i)

      beginShape()
      vertex(0, 0)
      vertex(12 * i, 4)
      vertex(10 * i, 10)
      vertex(0, 4)
      endShape()
      pop()
    }
    ////////////

    //尻尾
    push()
    fill(this.color.filet)
    translate(0, 25)
    rotate((PI / 12) * sin(this.theta * 2))
    beginShape()
    vertex(0, 0)
    bezierVertex(0, 0, 5, 5, 3, 15)
    bezierVertex(3, 15, 0, 8, 0, 8)
    bezierVertex(0, 8, 0, 8, -3, 15)
    bezierVertex(-3, 15, -5, 5, 0, 0)
    endShape()
    pop()

    //胴体
    beginShape()
    fill(this.color.body)
    vertex(0, 30)
    bezierVertex(0, 30, -10, 10, 0, 0)
    bezierVertex(0, 0, 10, 10, 0, 30)
    endShape()

    pop()
  }
}

let fish

function setup() {
  createCanvas(300, 200)
  fish = new Fish(width / 2, height / 2)
}

function draw() {
  background(0)
  fish.update()
  fish.display()
}
```

超簡単にまとめると、`display`が魚の描写、　`update`がヒレに関与する`theta`を更新する関数になります！

### ヒレが動く原理
ヒレは、基本形を`rotate`で回転させて胴体にくっつけています。

ここで`theta`をsinにぶち込むことで、ヒレが円運動します！もしヒレの速さや振れ幅を変えたいときは、`rotate`内の数字をいじってみて下さい！

## 最後に
ここでは`p5.js`で魚を表現するプログラミングを紹介しました。ここから派生して、色々な魚を作ることができますので、ぜひ色々お試しください！

### おまけ：フィッシュマウスストーカーの拡張機能
・[fishMouseStalker](https://chrome.google.com/webstore/detail/fishmousestalker/pijcbpakhehbbkffbaniofjcdcpbpjeo?hl=ja)
Rustで初めての簡単なWebAssembly入門

本記事の内容はあまり実用的ではないもののとりあえずブラウザでWebAssemblyが動くのを確認したい人向け

###前提
Rustの最新版がインストールされていること
本記事を執筆時点では1.31.1が最新だった

###ビルドターゲットの確認
ターミナルで以下のコマンドを打つとビルドターゲット一覧が確認できる

```terminal
# rustup target list
```

この中でWebAssemblyに関係しているのは以下の三つ
asmjs-unknown-emscripten
wasm32-unknown-emscripten
wasm32-unknown-unknown

今回はwasm32-unknown-unknownを使って話を進めるものとする
ビルドターゲット追加のコマンドは以下の通り

```terminal
# rustup target add wasm32-unknown-unknown
```

今回の簡易な方法ではcargoは利用せず直接rsファイルを生成、コンパイルする
実行例として1から10までの和を返す関数

```rs:test.rs
#[no_mangle]
pub fn sum_from1_to10() -> i32 {
	let mut sum = 0;
	for i in 1..=10 {
		sum += i;
	}
	sum
}
```

これに対してのコンパイルは以下のコマンドで行う

```terminal
rustc --target wasm32-unknown-unknown -O test.rs --crate-type=cdylib
```

コンパイル後test.wasmというファイルができるのでこれを適当なWebサーバーのドキュメント配下に配置し
同じ場所に以下のhtmlファイルを用意する

```index.html
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="utf-8" />
		<script>
fetch('test.wasm')
	.then((response) => response.arrayBuffer())
	.then((bytes) => WebAssembly.instantiate(bytes, {}))
	.then((results) => {
		const instance = results.instance;
		console.log(instance.exports.sum_from1_to10());
	});
		</script>
	</head>
	<body>
	</body>
</html>
```
ブラウザからアクセスした際にコンソールに以下のように55が表示されればひとまず成功
![img_20190111.png](https://qiita-image-store.s3.amazonaws.com/0/314532/59c9c395-3511-6526-8adb-f130c76f9b11.png)

###参考
[Rust単体でWebAssemblyをコンパイルする（Emscripten無し）](https://sbfl.net/blog/2017/11/27/rust-webassembly-standalone/)