OmniAICreator/Qiita-1.07M huggingface dataset:
Web Audio APIで音が鳴る最小構成は何

Web Audio APIについて初めて調べていて、「とりあえず音を鳴らすにはどうしたらいいんだろう？」と思って調べても

「最小」みたいなことを謳いながら、音色を選ぶボタンがあったり周波数を選ぶスライダーがあったりして、「いや、音を鳴らすためだけにやらなきゃいけない最低限のことはどの部分なんだよ！」と思ったりしたので

探ってみました。

多分、最小はこれです。

#コード 

```html:test.html
<!DOCTYPE html>
<html>
  <body>
    <script src="test.js"></script>
  </body>
<html>
```

```javascript:test.js
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
var oscillator = audioCtx.createOscillator();
oscillator.connect(audioCtx.destination);
oscillator.start();
```

この2つのファイルを同じフォルダにおいて、`test.html`をブラウザで開くと、いきなり音がなります。

止めることは出来ません(なんですって

ブラウザかタブを閉じて下さい。止まります。


#解説

申し訳程度に解説をつけます。

```javascript
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
```

まず、Web Audio APIでは、あらゆることを`AudioContext`というオブジェクトの中で行います。なのでまずこれを作ります。

単に`new AudioContext()`としていないのは、ブラウザによって対応してたりしてなかったりするからです。

Safariで鳴らさなくてもいいなら、この行はもっと短く

``` javascript
var audioCtx = new AudioContext();
```

としても大丈夫です。

`window.AudioContext`と`window.webkitAudioContext`のうち、動く方をとってくるために、こんな感じのコードになっています。

次いきます。

```javascript
var oscillator = audioCtx.createOscillator();
```

`oscillator`は、「音源ノード」の一種で、今回のように引数を省略した場合は440Hzのサイン波を出力します。

「ノード」というのは、イメージで言うと、点と、それをつなぐ線からなるネットワークのうちの、「点」の方のことです。

線の方は「エッジ」といったりします。

Web Audio APIでは、ノードを接続してネットワークを作るわけですね。

数学的には「有向グラフ」ということになります。まあ、点同士を矢印でつないだものと思ってくれれば大丈夫です。

```javascript
oscillator.connect(audioCtx.destination);
```

この行で、さっき作った音源ノード`oscillator`を、`destination`とかいうノードに接続しています。

向きは`oscillator`→`destination`です。

`destination`というノードは、最終的な出力を表します。

音源を出力につないでるわけです。普通ですねえ。

音源を出力意外のものにつなぐことがあるんでしょうか？

結論から言うと、あります。例えば、エフェクターに繋いで音を加工することができます。このエフェクターから、さらに別のエフェクターだったり、`destination`だったりに接続していくわけですね。

```javascript
oscillator.start();
```

最後、この行で、音源のスイッチをオンにしてます。

これで音が鳴ります。


とりあえずこれで音が鳴るので、あとはこれを元にいろいろ触っていけば良いと思います。
Ruby on Rails入門

# Ruby on Rails入門

Ruby on Railsで掲示板を、最短で作ってみます。ここでは、ローカルに開発環境を構築しなくてもWeb開発ができる[PaizaCloud](https://paiza.cloud/ja) を使います。

内容は以下の記事に沿っています。

https://paiza.hatenablog.com/entry/paizacloud_ruby_on_rails/2017/12/14

# 開発環境

[PaizaCloud](https://paiza.cloud/ja) を開き、アカウント作成後、サーバを作成します。
サーバ作成時に、"MySQL"を選択しておくと、データベースも自動的に起動します。

# プロジェクト作成

Ruby on Railsのプロエジェクトを作成するため、"rails new"をPaizaCloudのターミナルから実行します。「boardgame-app」の部分は好きなプロジェクト名を入れてください。

```
$ rails new boardgame-app
```

# 掲示板の作成

Railsの魔法「スキャッフォルド(scaffold)」で、テーブル、コントローラ、モデル、ビュー、ルーティングを一気に作成します。テーブル名(games)、カラム名(name,players)は好きな名前でいいです。

```
$ cd boardgame-app
$ rails generate scaffold games name players
```
# テーブル作成

マイグレーションからテーブルを作成します。

```
$ rails db:migrate
```

# サーバ起動

```
$ rails server
```

サーバが起動しました。[PaizaCloud](https://paiza.cloud/ja) 画面左側の「3000」と書かれたブラウザアイコンをクリックしたら画面が表示されます。URLを http://localhost:3000/posts/ のようにすると、掲示板が表示されます。

ここまでくれば、以下の記事に沿って、アプリ作成をさらに続けることもできます。

https://paiza.hatenablog.com/entry/paizacloud_ruby_on_rails/2017/12/14
VuePress で babel を使う

**EDIT**(2018/05/26): 現在の VuePress ではデフォルトで Babel を使っているようです。そのため、以下の設定は不要になりました。

----

[VuePress](https://vuepress.vuejs.org) では Vue.js のコンポーネントをビルドする際、デフォルトで Buble を使って変換しています。しかしながら、Buble は Async 関数など ES2017 以降の構文をサポートしていない [^1] ため、コンポーネントで最近の構文を使うとビルドエラーになってしまいます。

Buble の代わりに Babel を使うことで、この問題を解決できます。

- `@babel/plugin-syntax-dynamic-import` は必須でした。
- [webpack-chain](https://github.com/mozilla-neutrino/webpack-chain) を使っているようです。

**必要なパッケージを追加:**

```console
$ npm install --save-dev babel-loader@^8.0.0-beta.2 @babel/core @babel/preset-env @babel/plugin-syntax-dynamic-import
```

**設定ファイル:**

```js:.vuepress/config.js
"use strict"

module.exports = {
    /* 省略 */
    
    // Webpack の設定を上書きする
    chainWebpack(config) {
        const jsRule = config.module.rule("js")
        jsRule.uses.delete("buble-loader")
        jsRule
            .use("babel-loader")
            .loader("babel-loader")
            .options({
                presets: [
                    [
                        "@babel/preset-env",
                        {
                            modules: false,
                            targets: { browsers: ["last 2 versions"] },
                            useBuiltIns: "usage",
                        },
                    ],
                ],
                plugins: ["@babel/plugin-syntax-dynamic-import"],
            })
    },
}
```


[^1]: 執筆時点の話。何故か Stage 3 Dynamic Imports はサポートしているようだ。
gccのソースコードを読む アセンブリコード出力

gccのアセンブリコード出力部分のソースコードを読んでみたので、分かったことを書いてみました。

まぁ、分かってみると、ただのテンプレートエンジンみたいな文字列処理をしているだけでしたよ。

gccはgithub　https://github.com/gcc-mirror/gcc/
にある2018-04-26のソースコードを使いました。


# final()
gccの アセンブリコード 出力はfinal.cのfinal()で行います。
final()に、引数としてコード生成済みのrtxと出力先のアセンブラファイルのファイルポインタを私ます。

```
 void
 final (rtx_insn *first, FILE *file, int optimize_p)
```
で実際の アセンブリコード出力部分はここから、もうちょっと奥に進んだ部分です。

final() -> final_1() -> final_scan_insn() -> final_scan_insn_1()

final_scan_insn_1()も長い関数なのですが、重要なのは３つの処理です。

* insnのリストから、insnを一つ取り出し、そのinsnに対応するコード番号を取得する。  
* コード番号から、テンプレートを取得する。　
 * テンプレートにはコード番号に対応したアセンブラコード文字列が格納されています。このテンプレートは各アーキテクチャの*.mdファイルに記載されています。
* テンプレートを使ってアセンブラ出力する。　(recog_data.operandはrecog_memoized（）を呼ぶと設定されるグローバル変数で、中身はアセンブラ命令のオペランドです。)

```
	insn_code_number = recog_memoized (insn);
...
	/* Find the proper template for this insn.  */
	templ = get_insn_template (insn_code_number, insn);
...
	/* Output assembler code from the template.  */
	output_asm_insn (templ, recog_data.operand);

```

#output_asm_insn()
output_asm_insn()内で実際にファイルにアセンブリコードを出力しています。


output_asm_insn()の最低限必要な部分だけ示すと下記になります。

```
void
output_asm_insn (const char *templ, rtx *operands)
{
  const char *p;
  int c;
  int oporder[MAX_RECOG_OPERANDS];
  char opoutput[MAX_RECOG_OPERANDS];
  int ops = 0;
...
  memset (opoutput, 0, sizeof opoutput);
  p = templ;
  putc ('\t', asm_out_file);

  while ((c = *p++))
    switch (c)
      {
...
      case '%':
	if (*p == '%'
	    )
	  {
...
	  }
	/* % followed by a digit outputs an operand the default way.  */
	else if (ISDIGIT (*p))
	  {
	    unsigned long opnum;
	    char *endptr;

	    opnum = strtoul (p, &endptr, 10);
	    if (this_is_asm_operands && opnum >= insn_noperands)
	      output_operand_lossage ("operand number out of range");
	    else
	      output_operand (operands[opnum], 0);

	    if (!opoutput[opnum])
	      oporder[ops++] = opnum;
	    opoutput[opnum] = 1;

	    p = endptr;
	    c = *p;
	  }
...
	break;

      default:
	putc (c, asm_out_file);
      }

  putc ('\n', asm_out_file);
}
```

ざっくりとした処理の内容

* \tを出力
* テンプレートの文字列を１文字ずつ出力
* テンプレートに含まれる%数字を、数字に対応するoperandに置き換えて出力
* 改行を出力

この処理を例で示すと、templateが```movl  %2, %0```で、operandが```%ebx```と```NULL_RTX```と```%ecx```ならば、

```
　　　　movl  %ecx, %ebx
```
がアセンブリコード出力されます。


gccのソースコードを読みを再開してみたのですが、ソースコード全体の理解度が上がってきたので、以前よりは、だいぶ動作が追えるようになってきた気がする。
ヤマハルータからSLACKへメッセージを飛ばす

Yamahaさんのルータに実装されているLuaですが、  
バージョン"1.08"よりhttpsに対応しています。

そこでSlack(IncomingWebhook)にメッセージを飛ばすテストをしてみました。

2018年4月現在 https対応のファームが適用できるルータは

- NVR510
- NVR700W
- RTX1210

の3機種です。

## Slack IncomingWebfookの設定

・・・は、解説サイトも多いですし省きます
<small>
手抜きバンザイ＼(^o^)／
</small>

## ルータ設定

### モジュール

<A HREF="https://github.com/rxi/json.lua" target="_top">こちらのjson.lua</A>を利用させていただきました。
ありがとうございます。 :)
<small>
手抜きバンザイ＼(^o^)／
</small>

### ファイル構成

こんな感じで配置しました

```
# show file list / all
[ / ]
2017/10/11 12:47:10 <DIR>           lua

[ /lua ]
2018/04/26 15:36:51 <DIR>           module
2018/04/26 15:37:47             517 slack.lua

[ /lua/module ]
2018/04/26 15:37:31           10414 json.lua
```

### ルータ設定内容

``` 
set LUA_PATH="/lua/module/\?.lua;"
set PWD="/lua"
```

``` /lua/slack.lua
json = require("json")

local req_t = {}
local res_t

req_t.url    = "https://hooks.slack.com/services/ほにゃらら"
req_t.content_type = "application/json;charset=UTF-8"
req_t.method = "POST"

local req_b = {
  channel    = "#channel",
  icon_emoji = ":ghost:",
  username   = "ghost",
  text       = "message"
}

req_t.post_text = json.encode(req_b)
res_t = rt.httprequest(req_t)
-- print(tostring(res_t.code)) -- チェック用
```

ルータ側で

```
lua slack.lua
```

とすればメッセージが飛んできます :)

あとは文字コードの問題とかは、Yamahaさんの<a href="http://www.rtpro.yamaha.co.jp/RT/utility/index.html" target="_top">Lua kconv 漢字コード変換ライブラリ</a>を利用してみたり、"console character"コマンドでja.utf8を設定したりすると なんやかんやと出来るかもしれませんね。
試してないですが _(´ω`_)⌒)_
<small>
手抜きバンザイ＼(^o^)／
</small>
recpt1 の更新

# 背景

 4k, 8k 放送開始に関連して、BS放送の再編が始まっている。( cf. [総務省のページ](http://www.soumu.go.jp/menu_seisaku/ictseisaku/housou_suishin/4k8k_suishin/bs_restructuring.html "")) BSジャパン(BS171)がその第一弾として、各種パラメタを変更した。録画サーバを自前で立てている場合には、設定変更が必要だ。

# recpt1 を利用している場合

  Linux で recpt1 を利用している場合には、既にメインテナーの方によるパッチが提供されているので、これを利用する。
  http://hg.honeyplanet.jp/pt1/
動的に作られる sitemap.xml を検証する

## 概要

LFTV のレビューおじさんです。Xin Chao. ホーチミンは地獄のような暑さです。

さて、ベトナムでは、基本的にエンジニアは自分が作ったものを検証しないので、「たぶん大丈夫なはず」くらいで、気軽にレビューを依頼してくる。1回目のレビューでは、おそらく検証していないであろう点を検証し、指摘する。
まず最初に検証するのは、

1. 異常系
2. 検証ボリュームが多く、確認作業が単調なもの

などが考えられる。間違いない。

異常系はコードをサラッと舐めて当たりをつけ、おかしなデータを用意したり、おかしなリクエストを投げてみれば良い。コードを細かくレビューするまでもない。

検証ボリュームが多く、確認が作業が単調なものは、こちらもやってられないので、網羅はしたいが手は抜きたい。
例えば、リンク切れがないかとか、動的に作られた sitemap.xml が正しく作られているかとか。今回は簡単に URL を抽出できる、sitemap.xml について検証する。

## 方針

どこまで検証するかは悩みどころだが、ひとまず URL に関しては HTTP status が 200 となっていれば OK とする。当然いちいちブラウザで開いて確認してられないので、 curl する。

```bash
$ curl -I -sS $URL | grep HTTP
HTTP/1.1 200 OK
```

こんな感じ。URL リストを読み込みながら処理して行きたい。URL リストは、sitemap.xml の中に書いてある。
今は、URL さえ分かれば良いので、xml をパースしたりはせず、cat して加工する。

```bash
$ cat sitemap.xml | grep "<loc" | sed -e "s/^.*<loc>//g;s/<\/loc>.*$//g"
```

sitemap.xml の書き方として、URL は attribute なしの loc 要素として記述されているので、抽出は簡単（grep "\<loc"）。なお、xml は改行はされているものとする（されていない場合は、grep の前に工夫して改行して）。行頭・行末の不要なものを取り除けば(sed...)、欲しい URL リストの出来上がり。

読み込む sitemap.xml は複数に分割されている場合があるので、パラメータとして受け取れるようにしておく。そんなに頻繁に使うものではないので、ファイルの走査などはやめておく。
出力は、URL と HTTP Status の組み合わせを出していくものとする。

以上を組み合わせた bash スクリプトを書いておけば、それを叩くだけで、検証することが可能になる。楽ちん。

今更ではあるが、検証するサービスの Web サーバが curl を受け付けてくれないと使えない。

## 完成したスクリプト

```bash:chk_http_stutus_sitemap.sh
#!/bin/bash
cat $1 | grep "<loc" | sed -e "s/^.*<loc>//g;s/<\/loc>.*$//g" | while read line
do
    echo -n $line
    echo -n " : "
    curl -I -sS $line | grep HTTP
    # 負荷を気にするなら sleep 1 とかお好きに
    # sleep 1
done
exit;
```

### 使い方

```bash
$ ./chk_http_stutus_sitemap.sh sitemap.xml
```
エラー部分だけで良ければ、

```bash
$ ./chk_http_stutus_sitemap.sh sitemap.xml | grep -v "200 OK"
```
とか。（これがやりたかったので、出力結果は1行にした）

### やってみた

実際のプロジェクトの sitemap.xml を検証してみた（バシっ

```bash
$ ./chk_http_stutus_sitemap.sh sitemap.xml
///****_st/ : curl: (3) <url> malformed
https://..... : HTTP/1.1 200 OK
^C
```

1つ目からかよ笑
証明書差し替えマニュアル

一昔前に書いたメモが見つかったので、Qiitaに上げておきます。
当時の事はあまり覚えてないので、ほとんどメモのままですが...

# きっかけ

上司「証明書と鍵の交換しといてー、これ使ってね」

- `****.key`
- `****.crt`
- `****.inca`

わい「うぃす(やり方知らんけど、聞くのもあれだし、自分で調べながらやろう)」

# 手順

## 1. 何のWebサーバを使っているのか特定する
Webサーバによって、証明書を解釈するアルゴリズムが違うらしい。(Apache、Nginx、Glassfish...)
なので、何のWebサーバを使っているのか特定する必要がある。

ざっくりと説明すると、

- 証明書を使っているという事はHTTPS通信をしていると
- HTTPSはポート番号=443
- LISTEN状態のポート一覧を表示して、ポート番号=443を探し、`Program name`を確認する

Linuxの場合、以下のコマンドを叩き、LISTEN状態の一覧を表示する。
以下の場合だと、`nginx`を使っている事が確認できる。

```sh
$ netstat -tanp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
	(････省略････)
tcp        0      0 0.0.0.0:443                 0.0.0.0:*                   LISTEN      1113/nginx
	(････省略････)
```


## 2. 証明書がどこに配置されているか確認する
nginxの場合、デフォルトのインストール先は`/etc/nginx`であり、基底となる設定は`nginx.conf`となるため、これを見る。
(インストール先が異なる場合は、そこに移動してください)

```sh
$ cd /etc/nginx
$ cat nginx.conf

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

```

ここには証明書に関する設定はないようだ。

設定ファイルの中に`include /etc/nginx/conf.d/*.conf;`と書かれている。
「別の設定ファイルも読み込んでますよ〜」という意味なので、そちらも見てみる。

```sh
$ cat conf.d/*.conf

(････省略････)
server {
	(････省略････)
	ssl on;
	ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
	ssl_certificate     /home/nginx/certificate/********.pem;
	ssl_certificate_key /home/nginx/certificate/********.key;
	(････省略････)
}
(････省略････)
```

見つけた。
`.pem`ファイルが、証明書。
`.key`ファイルが、秘密鍵or公開鍵となる。

なので、ここに証明書が配置されている事が確認できる！！！やったねたえちゃん！！！


## 3. 証明書の差し替え
さて、場所も分かったので証明書を差し替えよう。

まずは、配置先まで移動。

```sh
$ cd /home/nginx/certificate/
```

思い出した。
上司からもらった証明書と鍵は`.key`、`.crt`、`.inca`
差し替える対象の証明書と鍵は`.key`、`.pem`

一致しない.....
どういう事なの..........

調べてみると、こういう事らしい。

- `.crt`は証明書
- `.inca`は中間証明書

更に調べてみると、`.pem`はこうやって作るらしい。

- `.pem`の空ファイルを作る
- `.crt`をテキストエディタで開いて、そのまま貼り付ける
- 改行をかます
- `.inca`テキストエディタで開いて、そのまま貼り付ける


以上。
シンプルな常用漢字のテキスト・一覧

ゲーム用のビットマップフォントを作る際に、シンプルな常用漢字の一覧表がなくて、ちょっと苦労した。
なので、ここに貼っておく。

亜哀挨愛曖悪握圧扱宛嵐安案暗以衣位囲医依委威為畏胃尉異移萎偉椅彙意違維慰遺緯域育一壱逸茨芋引印因咽姻員院淫陰飲隠韻右宇羽雨唄鬱畝浦運雲永泳英映栄営詠影鋭衛易疫益液駅悦越謁閲円延沿炎怨宴媛援園煙猿遠鉛塩演縁艶汚王凹央応往押旺欧殴桜翁奥横岡屋億憶臆乙俺卸音恩温穏下化火加可仮何花佳価果河苛科架夏家荷華菓貨渦過嫁暇禍靴寡歌箇稼課蚊牙瓦我画芽賀雅餓介回灰会快戒改怪拐悔海界皆械絵開階塊楷解潰壊懐諧貝外劾害崖涯街慨蓋該概骸垣柿各角拡革格核殻郭覚較隔閣確獲嚇穫学岳楽額顎掛潟括活喝渇割葛滑褐轄株釜鎌刈干刊甘汗缶完肝官冠巻看陥乾勘患貫寒喚堪換敢棺款間閑勧寛幹感漢慣管関歓監緩憾還館環簡観韓艦鑑丸含岸岩玩眼頑顔願企伎危机気岐希忌汽奇祈季紀軌既記起飢鬼帰基寄規亀喜幾揮期棋貴棄毀旗器畿輝機騎技宜偽欺義疑儀戯擬犠議菊吉喫詰却客脚逆虐九久及弓丘旧休吸朽臼求究泣急級糾宮救球給嗅窮牛去巨居拒拠挙虚許距魚御漁凶共叫狂京享供協況峡挟狭恐恭胸脅強教郷境橋矯鏡競響驚仰暁業凝曲局極玉巾斤均近金菌勤琴筋僅禁緊錦謹襟吟銀区句苦駆具惧愚空偶遇隅串屈掘窟熊繰君訓勲薫軍郡群兄刑形系径茎係型契計恵啓掲渓経蛍敬景軽傾携継詣慶憬稽憩警鶏芸迎鯨隙劇撃激桁欠穴血決結傑潔月犬件見券肩建研県倹兼剣拳軒健険圏堅検嫌献絹遣権憲賢謙鍵繭顕験懸元幻玄言弦限原現舷減源厳己戸古呼固股虎孤弧故枯個庫湖雇誇鼓錮顧五互午呉後娯悟碁語誤護口工公勾孔功巧広甲交光向后好江考行坑孝抗攻更効幸拘肯侯厚恒洪皇紅荒郊香候校耕航貢降高康控梗黄喉慌港硬絞項溝鉱構綱酵稿興衡鋼講購乞号合拷剛傲豪克告谷刻国黒穀酷獄骨駒込頃今困昆恨根婚混痕紺魂墾懇左佐沙査砂唆差詐鎖座挫才再災妻采砕宰栽彩採済祭斎細菜最裁債催塞歳載際埼在材剤財罪崎作削昨柵索策酢搾錯咲冊札刷刹拶殺察撮擦雑皿三山参桟蚕惨産傘散算酸賛残斬暫士子支止氏仕史司四市矢旨死糸至伺志私使刺始姉枝祉肢姿思指施師恣紙脂視紫詞歯嗣試詩資飼誌雌摯賜諮示字寺次耳自似児事侍治持時滋慈辞磁餌璽鹿式識軸七叱失室疾執湿嫉漆質実芝写社車舎者射捨赦斜煮遮謝邪蛇尺借酌釈爵若弱寂手主守朱取狩首殊珠酒腫種趣寿受呪授需儒樹収囚州舟秀周宗拾秋臭修袖終羞習週就衆集愁酬醜蹴襲十汁充住柔重従渋銃獣縦叔祝宿淑粛縮塾熟出述術俊春瞬旬巡盾准殉純循順準潤処初所書庶暑署緒諸女如助序叙徐除小升少召匠床抄肖尚招承昇松沼昭宵将消症祥称笑唱商渉章紹訟勝掌晶焼焦硝粧詔証象傷奨照詳彰障憧衝賞償礁鐘上丈冗条状乗城浄剰常情場畳蒸縄壌嬢錠譲醸色拭食植殖飾触嘱織職辱尻心申伸臣芯身辛侵信津神唇娠振浸真針深紳進森診寝慎新審震薪親人刃仁尽迅甚陣尋腎須図水吹垂炊帥粋衰推酔遂睡穂随髄枢崇数据杉裾寸瀬是井世正生成西声制姓征性青斉政星牲省凄逝清盛婿晴勢聖誠精製誓静請整醒税夕斥石赤昔析席脊隻惜戚責跡積績籍切折拙窃接設雪摂節説舌絶千川仙占先宣専泉浅洗染扇栓旋船戦煎羨腺詮践箋銭潜線遷選薦繊鮮全前善然禅漸膳繕狙阻祖租素措粗組疎訴塑遡礎双壮早争走奏相荘草送倉捜挿桑巣掃曹曽爽窓創喪痩葬装僧想層総遭槽踪操燥霜騒藻造像増憎蔵贈臓即束足促則息捉速側測俗族属賊続卒率存村孫尊損遜他多汰打妥唾堕惰駄太対体耐待怠胎退帯泰堆袋逮替貸隊滞態戴大代台第題滝宅択沢卓拓託濯諾濁達脱奪棚誰丹旦担単炭胆探淡短嘆端綻誕鍛団男段断弾暖談壇地池知値恥致遅痴稚置緻竹畜逐蓄築秩窒茶着嫡中仲虫沖宙忠抽注昼柱衷酎鋳駐著貯丁弔庁兆町長挑帳張彫眺釣頂鳥朝貼超腸跳徴嘲潮澄調聴懲直勅捗沈珍陳賃鎮追椎墜通痛塚漬坪爪鶴低呈廷弟定底抵邸亭貞帝訂庭逓停偵堤提程艇締諦泥的笛摘滴適敵溺迭哲鉄徹撤天典店点展添転填田伝殿電斗吐妬徒途都渡塗賭土奴努度怒刀冬灯当投豆東到逃倒凍唐島桃討透党悼盗陶塔搭棟湯痘登答等筒統稲踏糖頭謄藤闘騰同洞胴動堂童道働銅導瞳峠匿特得督徳篤毒独読栃凸突届屯豚頓貪鈍曇丼那奈内梨謎鍋南軟難二尼弐匂肉虹日入乳尿任妊忍認寧熱年念捻粘燃悩納能脳農濃把波派破覇馬婆罵拝杯背肺俳配排敗廃輩売倍梅培陪媒買賠白伯拍泊迫剥舶博薄麦漠縛爆箱箸畑肌八鉢発髪伐抜罰閥反半氾犯帆汎伴判坂阪板版班畔般販斑飯搬煩頒範繁藩晩番蛮盤比皮妃否批彼披肥非卑飛疲秘被悲扉費碑罷避尾眉美備微鼻膝肘匹必泌筆姫百氷表俵票評漂標苗秒病描猫品浜貧賓頻敏瓶不夫父付布扶府怖阜訃負赴浮婦符富普腐敷膚賦譜侮武部舞封風伏服副幅復福腹複覆払沸仏物粉紛雰噴墳憤奮分文聞丙平兵併並柄陛閉塀幣弊蔽餅米壁璧癖別蔑片辺返変偏遍編弁便勉歩保哺捕補舗母募墓慕暮簿方包芳邦奉宝抱放法泡胞俸倣峰砲崩訪報蜂豊飽褒縫亡乏忙坊妨忘防房肪某冒剖紡望傍帽棒貿貌暴膨謀頬北木朴牧睦僕墨撲没勃堀本奔翻凡盆麻摩磨魔毎妹枚昧埋幕膜枕末抹万満慢漫未味魅岬密蜜脈妙民眠矛務無夢霧娘名命明迷冥盟銘鳴滅免面綿麺茂模毛妄盲耗猛網目黙門紋問冶夜野弥厄役約訳薬躍闇由油喩愉諭輸癒唯友有勇幽悠郵湧猶裕遊雄誘憂融優与予余誉預幼用羊妖洋要容庸揚揺葉陽溶腰様瘍踊窯養擁謡曜抑沃浴欲翌翼拉裸羅来雷頼絡落酪辣乱卵覧濫藍欄吏利里理痢裏履璃離陸立律慄略柳流留竜粒隆硫侶旅虜慮了両良料涼猟陵量僚領寮療瞭糧力緑林厘倫輪隣臨瑠涙累塁類令礼冷励戻例鈴零霊隷齢麗暦歴列劣烈裂恋連廉練錬呂炉賂路露老労弄郎朗浪廊楼漏籠六録麓論和話賄脇惑枠湾腕

虞且遵但朕附又　←上のブロックにこれを足したものが常用漢字

磯絆哨疹胚　←上の一行を除いて、この一行を足したものが新聞常用漢字
SpringToolSuite(STS)で使用するプロパティエディタの検討

# きっかけ
上司「Eclipseでプロパティファイルを開いた時は日本語化されるのに、STSで開いたら日本語化されないから、STSで使えるプロパティエディタの検討よろしく」
わい「うぃす」

という事で調べました( 'ω')ｳﾞｪｪｪ
 

# そもそも、どういう仕組みで日本語化されるのか

## `native2ascii`
- JDKに「native2ascii」というコード変換ツールが含まれている
	- ネイティブコードからUnicodeに変換してくれるツール

## 何故、Eclipse(Pleiades)だと日本語化されるのか
- Eclipse(Pleiades)に同梱されているプロパティエディタ「`Limy`」
- このエディタは、プロパティファイルを開いた時に、`native2ascii`を**自動実行する**ため、日本語化される

## 何故、STSでは日本語化されないのか
- STSに同梱されているプロパティエディタは「`Spring Properties Editor`」
- このエディタは、プロパティファイルを開いた時に、`native2ascii`を**自動実行してくれない**ため、日本語化されない


# という事で、日本語化するために
**Pleiadesに同梱されているプロパティエディタ「`Limy`」をSTSに適用してしまおう！**
という事に。(ネットで調べててもそれが多い)


## STSへのLimyの適用手順
1. Pleiadesのフルパッケージをダウンロード
2. ダウンロードファイルを解凍
3. フォルダ内に含まれるフォルダ「`Limy`」をコピー
4. `STS/dropins`配下に、[3]を貼り付け

## STSでのLimyの使用手順
1. STSを起動
2. 開きたいプロパティファイルを右クリック
3. 「次で開く」から「Limy プロパティ・エディター」を選択
	- 「Limy プロパティ・エディター」が表示されない場合
		- STSを再起動
		- `clean`オプションを付けて起動
		- OSを再起動
			- それでもダメだったらｺﾞﾒﾝﾅｻｲ
 
----

「何でSpring Properties Editorはnative2asciiを自動実行してくれないのか」とか、
「Spring Properties Editorでnative2asciiを自動実行する仕組みはないのか」とか、
その辺までは調べてません。ｺﾞﾒﾝﾅｻｲ。
知ってる人いたら教えてください。


以上。
0426授業まとめ

18/04/26（木）授業まとめ

---

#Oracle VM VirtualBoxのインストール

■ sambaサーバからの実行ファイル配布
⇒ 先生含む複数人が一斉にサーバにアクセス＆ファイルをコピー

〇 その時、様々な問題が発生した
1. sambaサーバへのアクセスができない
2. ネットワークに急に繋がらなくなる
3. コピー＆ペーストを終了するのに莫大な時間がかかる
4. 一部、無線ではなく有線にしても、無線と同じくらいの回線速度である、等

・1 と 2 はほぼ同じ問題ではある ⇒ サーバへのアクセス制限がある可能性有
・有線のケーブル自体が破損しているものがある
・配線がむき出しでそのまま放置しているものがある ⇒ **危険**

〇 1 と 2 に関しては、再起動や再度ネットワークを繋げることで、一応は解決はする
ただし、教室後方側の席では何度もそういったことが起こっているそうなので**早期対応を求める**
（今日はデスクトップがブラックアウトしたPCが一台有）

##VirtualBox-5.2.8-121009-Win.exeの実行

■ コピーしてきたファイルを実行
⇒ 実行及びインストールには、左程時間はかからなかった印象

〇 Next Install Finish を押していけば何れインストールは終了

・デスクトップに「Oracle VM VirtualBox」のアイコン（ショートカット）
・「Oracle VM VirtualBoxマネージャー」のウィンドウが自動起動

#UbuntuMATEのインストール

■ sambaサーバからのファイル配布
⇒ 先生含む複数人が一斉にサーバにアクセス＆ファイルをコピー

〇 前述と同じ問題が発生（省く）

・ファイルは今回、Cドライブの直下に置く
・通常（一斉アクセスではない）時でも、コピー＆ペーストに五分ほどかかる模様

〇 コピーが終了次第、下記のリンクを見つつインストール作業
⇒ [UbuntuMATEのインストール](https://jet-consulting.tech/blog/install_ubuntu_16_04_lts_for_virtualbox/)

〇 インストール終了後、初期設定を行う
⇒ [Ubuntuの初期設定](https://jet-consulting.tech/blog/install_wordpress_for_ubuntu/)

#Lhaplus で RLogin の解凍

■ sambaサーバからのファイル配布
⇒ 前工程が終わり次第、サーバにアクセス＆ファイルをコピーだったため、時間はあまりかからなかった

##lpls174.exeの実行

〇 次へ インストール を連打

・「Lhaplusシェルの初期設定」
変更点
1. コンテキストメニューのチェックを二つとも外す
2. ドラッグアンドドロップメニューのチェックを二つとも外す

・デスクトップに「Lhaplus」のアイコン（ショートカット）

##rlogin_x64.exeの解凍

■ Lhaplusを起動し、rlogin_x64.exeを解凍
⇒ RLogin が使える！

※ RLogin …… 起動中のサーバを遠隔操作できる

---

大体の授業のまとめを書きました
・コマンドの資料を読む
・実際にコマンドを打つ
等、まだありましたが、ここで終わります
VitualBoxでUbuntuを動かす設定

#はじめに
今日はVirtualBoxで仮想HDを作ってそこにUbuntu METAのISOファイルを使って少し触ってみました
なので、今回はインストール手順を書いていこうと思います
#開発環境

`
OS:windows10(64bit)
`
`
IDE:Oracle VM VitualBox5.2.8
Rlogin
UbuntuMETA16.04.4(isoファイル)
`



#1.VitualBoxでUbuntuを動かす設定
まず初めにVitualBoxをダウンロードします
![44.png](https://qiita-image-store.s3.amazonaws.com/0/249281/381b6e5a-4079-a122-d456-8822bfe14456.png)


[VitualBox](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp)←こちらからダウンロードページへジャンプできます。

ダウンロードしていただいて、インストールが終わった後の解説をします。
![46.png](https://qiita-image-store.s3.amazonaws.com/0/249281/57b4028b-dba2-0de7-e032-25e3b847d0b0.png)
インストールが終わるとこちらの画面が表示されると思います。
（初期段階では赤枠の部分は何も表示がありません）
まず初めに新規を選択してください
![47.png](https://qiita-image-store.s3.amazonaws.com/0/249281/2f0c2b91-ed17-d119-d24d-709148a77ec8.png)
そうするとこちらの画面が出てくるので好きな名前にしていただいて、タイプをLinuxに変えて、バージョンを指定します。
（RedHat等もあります）
指定が終わったら次へを選択します
![48.png](https://qiita-image-store.s3.amazonaws.com/0/249281/78bc1b50-06ab-f6c2-5149-02e974582659.png)
メモリーサイズは今回は1GB使用します
![49.png](https://qiita-image-store.s3.amazonaws.com/0/249281/5bc0c4a9-62ab-d968-08a4-9cff6d1c9dd3.png)
ハードディスクは仮想ハードディスクを作成するを選択します。
![50.png](https://qiita-image-store.s3.amazonaws.com/0/249281/0789383b-84a4-dfd3-b99a-e85ae02342ed.png)
ハードディスクのファイルタイプはVDIを選択して、次へを選択します。
![51.png](https://qiita-image-store.s3.amazonaws.com/0/249281/1c63cbbe-ba52-b271-2e29-d2c0ae7d3497.png)
ハードディスクのサイズを変えるのなら可変を選んでください。
![52.png](https://qiita-image-store.s3.amazonaws.com/0/249281/62137db5-36b5-f288-ff9b-c13a76727ce0.png)
下の部分でサイズを変更して、作成を選択してください。
![53.png](https://qiita-image-store.s3.amazonaws.com/0/249281/472ebc9e-419c-57c7-8273-0c96fea70e1b.png)
作成が終わるとこのように、左の枠に設定したものが増えていると思います
![54.png](https://qiita-image-store.s3.amazonaws.com/0/249281/b8a06132-2898-9e57-0548-496abc3d3967.png)
設定を開き、ストレージの中の赤枠で囲っているところを選んでディスクを選択します。
![55.png](https://qiita-image-store.s3.amazonaws.com/0/249281/a8c15c2e-3eb3-91c1-bfe5-87fedf4ba541.png)
次にネットワークを選んで割り当てをブリッジアダプターに変えます。
これで一通りのvitualboxの設定は終了です。

---
最後まで閲覧ありがとうございました
line api v2.0 php でログイン、プロフィール取得

#今回はcakephpでの走り書き


・LINEAPI v2.1 は今日現在バグってて動かない。
・LINEAPI v2 を使う

・LINEAPIは v1, v2 , v2.1 とバージョンがバラバラなので、エンドURLに注意する。

```

//ここ変更すりゃ動く
define("LINE_CLIENT_ID", "15****61");
define("LINE_CLIENT_SECRET", "3*******b401cc");
define("LINE_WEB_LOGIN_URL", "https://access.line.me/dialog/oauth/weblogin");
define("LINE_ACCESS_TOKEN_URL", "https://api.line.me/v2/oauth/accessToken");
define("LINE_PROFILE_URL", "https://api.line.me/v2/profile");
define("LINE_REDIRECT_URL", "https://your.com/hoges/complete/");




class HogesController extends AppController
{

    public function test()
    {

        $params = [
            'response_type' => 'code',
            'client_id' => LINE_CLIENT_ID,
            'redirect_uri' => LINE_REDIRECT_URL,
            'state' => 'rand'.time()
        ];


        $url = LINE_WEB_LOGIN_URL."?";
        $url .= http_build_query($params);
        header("Location: {$url}");

        $this->autoRender = false;
    }


    public function complete()
    {


        $url = LINE_ACCESS_TOKEN_URL."?";


        $params = [
            "grant_type" => "authorization_code",
            "code" => $_GET["code"],
            "redirect_uri" => LINE_REDIRECT_URL,
            "client_id" => LINE_CLIENT_ID,
            "client_secret" => LINE_CLIENT_SECRET,
        ];

        $url .= http_build_query($params);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('application/x-www-form-urlencoded'));

        $response = curl_exec($ch);
        curl_close($ch);
        $result = (array)json_decode($response, true);



        $accessToken = $result['access_token'];

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . $accessToken));
        curl_setopt($ch, CURLOPT_URL, LINE_PROFILE_URL);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $response = curl_exec($ch);
        curl_close($ch);

        $json = json_decode($response);

        pd($json);



        $this->autoRender = false;
    }



}


```
コマンドラインの世界

今日はAndroidの授業じゃなくVirtualBoxを使った授業をした。授業の前にインストールするのに時間がかかったため遅れてスタートでした。
インストールの時間が長いのもあって最初の時はひたすらインストールが終わるのを待つ作業でした。
VirtualBoxを使ってやったのは最初は1個１個設定をして自分でうったとこが間違ってて何回もやり直しでした。
そもそもVirtualBoxって何のこと？
VirtualBoxは、2008年にSun Microsystems社(現Oracle社)が発表したソフトウエア仮想化ソフトウエアです。2010年にOracle社によるSun Microsystems社の買収によって現在の製品名は、Oracle VirtualBoxとなっており、商用・非商用を問わずGNU General Public License (GPL)ライセンスで配布されているため、商用利用の際にライセンスが発生するVMware Playerとは異なったライセンス形態で配布されています。VirtualBoxが対応するホストOSは、Windows XP以降のWindows、Solaris、全てのLinuxディストリビューションの32ビット/64ビットに対応しており、オープンソースコミュニティによってその他のプラットフォーム用にポーティングされていることがありますので、多くのホストOS上にインストールすることができます。ゲストOSについては、VMware Playerとほぼ同様となっているため、ソフトウエア仮想化システムを再販するなど商用利用を行う際には、VirtualBoxが適していると言えます。


$ cal Enterで今日の日付を出してくれて便利と思いました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/0a2bc0bc-ee4d-7a13-c4d3-f9e2d054a9b3.png)
AOJにCLIでsubmitできるツールを作った

## 作ったもの
[aocli(AOJ submission tool on CLI)](https://github.com/kamaboko123/aojcli)

## 使い方

### セットアップ
Python2.7で動きます。
環境変数からクレデンシャルを取得するので、必要な変数を登録します。
~~install.shはエイリアスを.bashrcに書き込んでいるだけです。~~
**PyPIに登録したのでpipからインストールできるようになりました**

```bash
$ pip install aojcli
$ echo 'export AOJCLI_ID=your_user_id_of_AOJ' >> ~/.bashrc
$ echo 'export AOJCLI_PASSWORD=your_password_of_AOJ' >> ~/.bashrc
```

### submit
問題のID、記述言語、ソースコードファイルを指定するだけです。

```bash
$ aojcli submit ITP1_1_D C++11 ITP1_1_D.cpp
[submit success]
Access token for checking result : a3d80b96-4fda-432d-a6b2-3af1c6ff043d
```

### status
問題のIDを指定してstatusが確認できます。

```
$ aojcli status ITP1_1_D
[Status of submission(ITP1_1_D)]
+----------+----------------+-------+---------------------+---------------------+
| judge id | status         | lang  | submit date         | judge date          |
+----------+----------------+-------+---------------------+---------------------+
| #2791323 | STATE_ACCEPTED | C++11 | 2018-04-17 23:18:02 | 2018-04-17 23:18:03 |
+----------+----------------+-------+---------------------+---------------------+
```

## 作った背景
仕事はじめてから趣味プログラミングする時間がなくなりました。
ちゃんとした開発はまとまった時間がないと厳しいので、問題集解いてみたりすることにしました。

AOJは過去に使ったことがあるので、まずはそこで適当に色々と解いてみることにしましたが、
解答の提出をするのに毎回ブラウザにコピペするの面倒くさい。
あと、Linux ServerにSSHしてVimでコードを書くのが今の僕の開発スタイルなので、そもそもファイルが今操作してるマシン上にない事が多いです。

というわけで、開発環境からそのままコマンドひとつで、回答を提出できるツールを作ることにしました。

## その他
AOJのAPIの制限が厳しく、短時間に複数回認証を行うと弾かれてしまいます。
submitしたらすぐにstatus確認したい気持ちはありますが、10秒程度お待ち下さい。。

自分が使うために作ったので、イケてないのときっとバグがたくさんあります。ご利用は自己責任で。
あと、これ以上の機能拡張は今の所考えていないです。

[参考]
[AOJ API Reference](http://developers.u-aizu.ac.jp/index)
リアルタイムでログを確認する！tailコマンドが神すぎた件

社員さんが、ログの見方を教えてくれました。

ターミナルにこれを打てばいい。

```
tail -f ファイル名
```

エラーが出たら随時更新してくれます。だから、エラーが出た瞬間に、あっ！エラーや！って気づくっていう笑


詳しい使い方は[こちら](https://hydrocul.github.io/wiki/commands/tail.html)


ではでは！

(Windowsは、違うやり方で出来るらしいです)
React Nativeでメッセージ機能を実装する（Firebase）


React Netiveでメッセージ機能を追加しました。


## 開発環境

react native 0.52.3
redux 3.7.2
react-native-firebase 3.2.2
react-native-gifted-chat 0.4.3

## ソースコード

```Message.js
class Message extends React.Component {

  constructor(props) {
    super(props);
    this.state = {
      messages: [],
    };
  }

  componentWillMount() {
    this.props.messagesFetch();
  }

  onSend(message) {
    this.setState((previousState) => ({
      messages: GiftedChat.append(previousState.messages, message),
    }));

    this.props.sendMessage({
      message
    })
  }

  render() {
    const { currentUser } = firebase.auth();
    return (
      <View>
        <GiftedChat
          messages={this.props.messages}
          onSend={this.onSend.bind(this)}
          user={{
            _id: currentUser.uid
          }}
          renderBubble={this.renderBubble}
          renderSend={this.renderSend}
        />
      </View>
    );
  }
}

const mapStateToProps = (state) => {
  const { text, user, createdAt, _id } = state.messageForm;
  const messages = _.orderBy(state.messages, ['_id'], ['desc']);

  return { text, user, createdAt, _id, messages };
};

export default connect(mapStateToProps, {
  sendMessage,
  messagesFetch
})(Message);
````

```messageAction.js
/**
* メッセージの保存
*/

export const sendMessage = ({ message }) => {
  return (dispatch) => {
      firebase.database().ref(`/messages/`)
      .push({
        _id: createdAtDate(new Date()),
        text: message[0].text,
        user: {
          _id: user._value.uid,
          name: user._value.name,
          photoURL: user._value.photoURL
        },
        createdAt: formatDate(new Date()),
      })
      .then(() => {
        dispatch({ type: 'message_create' });
      });
    })
  }
}

/**
* メッセージの表示
*/

export const messagesFetch = (room) => {
  return (dispatch) => {
    firebase.database().ref(`/messages/`)
    .orderByChild('_id')
    .on('value', snapshot => {
      dispatch({ type: 'messages_fetch_success', payload: snapshot.val() });
    })
  };
};
```
[TensorFlow] Custom Metrics Functionを使っているmodelのリストア方法



CNNでの画像の超解像技術を試すために、下記のようなpsnr関数を作成しそれをmetricsに設定したmodelを構築しました。

```
# Custom Mertics Function
def psnr(y_true, y_pred):
    return -10*K.log(K.mean(K.flatten((y_true - y_pred))**2)) / np.log(10)
```


```
# model Compile
model.compile(
    loss = 'mean_squared_error',
    optimizer = 'adam',
    metrics = [psnr]
)
```

そのmodelをクラウド環境で学習させ、別環境でロードしようとしたところ「ValueError: Unknown metric function:***」というメッセージが出力されました。

```
model = load_model('model.h5')
---------------------------------------------------------------------------
ValueError   Traceback (most recent call last)
(省略)
ValueError: Unknown metric function:psnr
---------------------------------------------------------------------------
```

Custom Functionを使ったmodelを別環境で使用するには、modelをロードする際に引数として、
[custom_objects]を指定するがあるようです。

今回は、psnrというCustom Functionを作成したのでそれを移動先の環境でも定義して指定します。

```
model = load_model('model.h5', custom_objects={'psnr':psnr})
```

これでmodelが使用可能になります。
もしかすると、modelをsaveするときにCustom Functionもまとめて保存できる方法があるのも...
ご存知の方がいらっしゃいましたらお教えいただけるとありがたいです。
Oracle VitualBox

※自分の勉強用にメモ書きしています

環境：windows10 VitualBox

##VitualBox初期設定
まずホームページでホストOSと同じBitのISOイメージをダウンロードする。
次にVitualBoxを起動して左上の新規を選択する。
次のウィンドウで名前の欄に仮想マシンの名前を記入しホストOSと同じBitを選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/86e797ea-0c36-b514-cce0-00c35d6cd49d.png)
次のウィンドウで仮想マシンで使うメモリ量を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/9d3c659c-25b7-0ceb-847e-6fe96b8564d9.png)
仮想ハードディスクを作成を選択して次の画面も初期設定のままで、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/6948908b-f32e-ed11-e3c3-895e780db43b.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/15ab392d-8ce3-89e5-8af6-43b48800c596.png)
物理ハードディスクのストレージを可変を選択してハードディスク名とサイズを選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/53cbc30a-e540-da43-a53d-f56150bffaaa.png)![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/f5b38dbe-c823-870a-23e8-718ef4e6ef1e.png)
これで仮想ハードディスクの設定が完了。
次に設定の済んだハードディスクの初期設定をする。
右クリックで選択して設定をクリックして、
ディスプレイ設定で3Dアクセラレーションのチェックを(ビデオカードに余力があるなら)入れ、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/710f2da7-8c37-182f-7f3f-0a0eb27e6956.png)
ストレージのコントローラ：IDEの光学ドライブの追加を選択して、
ディスクを選択をクリックし最初にダウンロードしたISOイメージを選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/8b8021b3-ce61-c0f6-941e-9497486d2895.png)
ネットワークの割り当てをブリッジアダプターに設定して起動前の準備が完了。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/49382d2a-fc34-11e5-6fa3-15a47cfb28fe.png)
その後起動して起動設定をする。
起動して待つと最初の起動設定画面がでるので、
左のリストで言語を選択して右にあるUbuntuをインストールを選択する。
次にインストール中にアップデートをインストールするを選択して続けるを選択し、
ディスクを削除を選択してインストールして出てくるポップアップも続けるを選択。
どこに住んでいるかを選択して次の画面でキーボードのレイアウト言語選択して続ける。
次の画面で仮想マシン用の名前とユーザー名、パスワードを記入し続ける。
インストールが始まるので待った後今すぐ再起動するを選択して完了

##起動後の設定
まず初めに上のメニューバーからデバイスの
Guest Additions CD イメージを挿入を選択して実行。
先ほどのパスワードを要求されるので入力して待ち、
インストールが完了したらEnterキーを押す。
次に端末を探し起動し必要な設定をコマンドで記入していき設定する
これ完了。
Ubuntu16.04 StaticIPの設定

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/251603/a2cfc68c-7fcf-098a-c646-21fb6eb758c6.png)
上の画面通り選択して、現在使っているネットワークを選択し、編集（EDIT）ボタンをクリックする。
![スケッチ (6).png](https://qiita-image-store.s3.amazonaws.com/0/251603/96bb5d9e-1f75-bce0-dae4-658c50e03b6a.png)
次の画面にIPを入力する。
scikit-learnで決定木

決定木がどんな感じで分類するのか確認してみる。

```python
import matplotlib.pyplot as plt
import numpy as np
from sklearn.tree import DecisionTreeClassifier

np.random.seed(20180426)  # 乱数の出方を固定

X = np.array([[i, j] for i, j in zip(np.random.normal(2, 1, 100), np.random.normal(2, 1, 100))])
y = np.array([0] * 100)

X = np.append(X, np.array([[i, j] for i, j in zip(np.random.normal(3, 1, 100), np.random.normal(3, 1, 100))]), axis=0)
y = np.append(y, [1] * 100)


def draw_tree(n):
    clf = DecisionTreeClassifier(max_depth=n)

    clf.fit(X, y)

    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                         np.arange(y_min, y_max, 0.1))
    color_set = ['b' if i == 0 else 'r' for i in y]

    plt.figure(figsize=(8, 8))

    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    plt.contourf(xx, yy, Z, alpha=0.4)
    plt.scatter(X[:, 0], X[:, 1], c=color_set, s=30, edgecolor='k')
    plt.title("木の深さ: " + str(n))

    # plt.savefig("graph" + str(n) + ".png")
    plt.show()


for i in range(1, 11):
    draw_tree(i)
```

![graph1.png](https://qiita-image-store.s3.amazonaws.com/0/233069/d6799c03-039c-3ced-d00e-93e245e18816.png)
まだアバウト。

![graph2.png](https://qiita-image-store.s3.amazonaws.com/0/233069/4235425a-4e25-f02c-f06d-6e5df1885a97.png)
![graph3.png](https://qiita-image-store.s3.amazonaws.com/0/233069/a436b8b9-023a-96e1-ec65-9cc5339fb041.png)
![graph4.png](https://qiita-image-store.s3.amazonaws.com/0/233069/770ae296-38df-2d99-3fd4-aad16775e95c.png)

だいぶ良くなってきたか？

![graph5.png](https://qiita-image-store.s3.amazonaws.com/0/233069/6d73af6c-0f82-fdf4-6dcd-fd6d6469dc9f.png)
![graph6.png](https://qiita-image-store.s3.amazonaws.com/0/233069/60262636-288c-ef10-3c59-a54eebb3ac9c.png)

流石に過学習している感ある。最終的にはこうなった。

![graph10.png](https://qiita-image-store.s3.amazonaws.com/0/233069/72d7746d-579b-55cb-5553-6957a50adfaf.png)

交差検証でスコアがどれくらいになるのか見てみよう。

```python
import matplotlib.pyplot as plt
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score

np.random.seed(20180426)  # 乱数の出方を固定

X = np.array([[i, j] for i, j in zip(np.random.normal(2, 1, 100), np.random.normal(2, 1, 100))])
y = np.array([0] * 100)

X = np.append(X, np.array([[i, j] for i, j in zip(np.random.normal(3, 1, 100), np.random.normal(3, 1, 100))]), axis=0)
y = np.append(y, [1] * 100)


def calculate_score(n):
    clf = DecisionTreeClassifier(max_depth=n)

    clf.fit(X, y)

    scores = cross_val_score(clf, X, y, cv=5)
    return np.average(scores)


xx = [i for i in range(1, 11)]
yy = [calculate_score(i) for i in range(1, 11)]

plt.xlabel("木の深さ")
plt.ylabel("スコア")
plt.xticks(np.arange(0, 11, 1))
plt.plot(xx, yy)
# plt.savefig("result.png")
plt.show()
```

![result.png](https://qiita-image-store.s3.amazonaws.com/0/233069/e4df51da-d964-7074-ab0f-6afaad9bcf74.png)

やっぱり深さ4くらいが一番マシだった。
IPアドレスの変更方法

#はじめに
ネットワーク共有センターに行くまでの方法が二種類あるのですが今回は今日やった方法で記載指せていただきます。


#開発環境
OS : Microsoft Windows10 (64bit)

#ネットワーク共有センター行く方法
一つ目がデスクトップにあるネットワークアイコンを右クリックしてもらいプロパティをクリックしてもらうと行く事ができます。
もしネットワークアイコンが無い場合デスクトップで右クリックをしてもらい個人用設定設定をクリックします。

![10.png](https://qiita-image-store.s3.amazonaws.com/0/249265/4cdde0e0-0a8f-d6f4-6a3a-d7cccf53bdc8.png)

次に

#IPアドレス変更方法
初めにコントロールパネルを開きます。

コントロールパネルを開いてもらうと、画面にネットワークとインターネットをクリックしてもらいます。

![IP adress.png](https://qiita-image-store.s3.amazonaws.com/0/249265/38bc329e-9e60-bf84-a98e-f5f923a42306.png)

クリックして開いてもらうとネットワークと共有センターをクリックしてもらいます。

![IP adress1.png](https://qiita-image-store.s3.amazonaws.com/0/249265/f8bda5d3-9c44-9487-a059-bfb7e4c32ae7.png)

次に今接続しているネットワークを右クリックしてもらいプロパティを開きます。

開いてもらうとこの画面になるので赤線で囲んでいる場所を１，２の順に押します。

![gazou.png](https://qiita-image-store.s3.amazonaws.com/0/249265/bcf23dc1-39bf-9157-34fd-fca42e7fb864.png)

そうすると次に次のIPアドレスを使うにチェックを入れてもらいIPアドレスを入力してもらうと変更の完了になります。

![gaaoaoa.png](https://qiita-image-store.s3.amazonaws.com/0/249265/c8ff83fb-306c-a54b-eec5-8392270275ff.png)

#最後に
今回初めてIPアドレスの変更をやったので、普通じゃあまり体験しない事だったので出来てとてもよかったです。
PHP フォームに入力、確認画面を表示する

フォームに入力して確認ボタンを押すと、入力内容の確認画面に移動します。

```html:in.php
<form action="out.php" method="post">
名前：<br>
<input type="text" name="name" size="30" value="">
<br>
コメント：<br>
<textarea name="comment" cols="30" rows="5"></textarea>
<br>
<input type="submit" value="確認">
</form>
```

```php:out.php
<?php
	$name = $_POST['name'];
	$comment = $_POST['comment'];
	print ("入力データ確認<br>");
	print ("名前：$name<br>");
	print ("コメント：$comment<br>");
?>
```
VirtualBoxにUbuntuをインストールする

VirtualBox-5.2.8-121009-Win.exeとubuntu-mate-16.04.4-desktop-amd64.isoを準備する。
tokushimaサーバーからコピー、またはUnbuntuHPとVirtualBoxHPへアクセスし、ダウンロードする。

VirtualBoxをインストールして、起動して、VirtualBox仮想HD作成する。
<img src="https://i0.wp.com/jet-consulting.tech/blog/wp-content/uploads/2016/08/2016-08-29_01h59_46-1.png?resize=768%2C544&ssl=1">

「名前」は任意の名前を入力し(ex.Ubuntu_16_04_LTS)、タイプ・バージョンは下図の通り指定し、「次へ」
<img src="https://i2.wp.com/jet-consulting.tech/blog/wp-content/uploads/2016/08/2016-08-30_01h49_59.png?w=371&ssl=1">

メモリに応じて調整する、1GB(1024MB)を指定する。
次の画面に「仮想ハードディスクを作成」を選択し、「作成」をクリックする。

「VDI(VirtualBox Disk Image)」を指定する。
<img src="https://i2.wp.com/jet-consulting.tech/blog/wp-content/uploads/2016/08/2016-08-30_01h50_18.png?w=370&ssl=1">

次の画面に「可変サイズ」を選択する。
任意の仮想ハードディスクファイル名を入力する。
ここまでVirtualBox仮想HD設定完了。

追加した仮想HDを右クリックし、「設定」を選択する。
<img src="https://i2.wp.com/jet-consulting.tech/blog/wp-content/uploads/2016/08/2016-08-30_01h50_59.png?resize=768%2C544&ssl=1">

ビデオカードに余力がある場合は、下図のとおり「ディスプレイ」の設定を実施する。
<img src="https://i2.wp.com/jet-consulting.tech/wp-content/uploads/2016/08/2016-08-29_02h24_26.png?ssl=1">

「ストレージ」の「コントローラ:IDE」にある「光学ドライブの追加」を選択する。
<img src="https://i0.wp.com/jet-consulting.tech/blog/wp-content/uploads/2016/08/2016-08-30_01h52_28-1.png?resize=768%2C544&ssl=1">

「ディスクを選択」を選択する。
<img src="https://i2.wp.com/jet-consulting.tech/blog/wp-content/uploads/2016/08/2016-08-30_01h52_34.png?resize=768%2C544&ssl=1">

準備したUbuntu 16.04 LTSのISOイメージを選択する。
Ubuntu 16.04 LTSのISOイメージが設定される。
<img src="https://i0.wp.com/jet-consulting.tech/blog/wp-content/uploads/2016/08/2016-08-30_01h52_56-2.png?resize=768%2C417&ssl=1">

「ネットワーク」の割り当てを「ブリッジアダプター」に設定する。
<img src="https://i1.wp.com/jet-consulting.tech/blog/wp-content/uploads/2016/08/2016-08-29_07h07_47-1.png?resize=768%2C544&ssl=1">

追加したUbuntuのVirtualBox仮想HDイメージファイルを選択し、「起動」を選ぶ

言語や時刻などを設定する、アカウントを作成する。
![スケッチ (5).png](https://qiita-image-store.s3.amazonaws.com/0/251603/1a31496d-720d-6e69-7c5c-ab0bb8db2bec.png)
インストールが完了すると再起動を促すポップアップが出るので、「今すぐ再起動する」を選択する。
ここまでVirtualBoxにUbuntuをインストール完了。
VSCodeでTypeScriptがトランスパイルできなかったハナシ

## これまでのあらすじ

ぐぐって出てきた入門的なテキストを読みながらVSCodeでTypeScript入門をしようとしてみたら、トランスパイルができない。こんなところで躓くなんていう日本語情報はない。
あれか、いまだWindows7とか使ってる私が悪いのか。マカーじゃなくちゃだめなのか。ガッデム（ひがみ）。

## げんいん
ターミナルをGitBashにしていたのが原因でした。
内部のどこかでWindowsだったらファイルパスの区切り文字は「￥」って決め打ちしているところがあって、それが原因で上手くいかなくなるのだとか（英語斜め読みのてきとうな情報）。

## かいけつほうほう
VSCodeの設定でターミナルで使用するシェルをPowerShellに切り替えることで無事トランスパイルできるようになりました。
具体的には "terminal.integrated.shell.windows" の部分でございます。
他ではBashが使いたいのであれば、ワークスペース限定で変更すると良いと思います。私はそうしてます。
っていうかGitいれてたらGitBashつかうよね。え、私だけ？

### いいわけ、または愚痴
小さなカイシャで孤立無援のフルスタックエンジニアもどきを長らくやっているので、世の感覚がさっぱりわかりません。
お目汚しにしかなっていないようだったら、ごめんなさい。
Sourcetreeで merge —no—ff する際、コミットのコメントを書き換えるスクリプトの作成方法

# 目的
普段Sourcetreeを使用しており、mergeは fast-forward ではなく -no-ff で行いたいが、その場合コミットのコメントが一律で以下のようになってしまう。

> Merge branch ‘マージ対象のブランチ名’ into マージされるブランチ名

これではmergeされたことはわかっても、その内容まではわからないため、mergeとコメントを変更する処理をワンタッチでできるようするべく、シェルスクリプトを作成することにした。

# 環境
macOS High Sierra
Sourcetree version 2.7.3

# 処理の流れ
1. Sourcetreeでカスタムアクションを実行
2. merge —no—ff 実行
3. ターミナルのウィンドウが開いて最新コミットのコメント修正を求める

# 問題とその解決
上記のような流れで処理を行いたかったが、いくつか詰まったところがあったので、その紹介をします。

## Sourcetreeでカスタムアクションを実行した際、ターミナルが表示されない

Sourcetreeにシェルスクリプトをカスタムアクションとして実行した場合、ターミナルは開かれない。なので以下のようなスクリプトを組んでもコメントの書き換えを行えない。

```
#リポジトリに移動
cd $*

#merge(--no-ff)する
git merge --no-ff マージしたいブランチ名

#コメント入力
read -p "コメントをなるべく簡潔・明瞭に入力して下さい：" input

#最新のコミットのコメントを書換
git commit --amend -m $input
```

なので、ターミナルを開くためにopenのコマンドを使用することにした。

また、”コメント入力”と”最新のコミットのコメントを書換”する処理を、別のシェルスクリプト（comment.sh）に記述し、ターミナルからそのファイルを開くようにした。

`open -a "Terminal" comment.sh`

## open コマンドを使用してターミナルからシェルスクリプトを実行する場合、引数を渡すことが（簡単には）できない 

ターミナルの画面を呼び出してシェルスクリプトを実行させることは可能になったが、上記の場合、リポジトリの位置を引数として渡すことができないという問題があった。

※ちなみに、open には —args という引数を渡すオプションがあるが、これはアプリケーションに対して値を渡すためのもので、シェルスクリプトへ値を渡すことはできなかった。

このことについて調べて見たところ、次のことがわかった。
（参考：「コマンドを指定してTerminal.appを実行する」[notions:iaarchiver](http://iaarchiver.github.io/posts/2014-07-01-2205.html)）

1. コマンドに引数を指定してターミナルを実行するのは簡単にはできない
2. もし引数を渡したいなら、tmpファイルまたはAppleScript経由で行う

ここではとりあえずtmpファイル経由を選択した。ちなみに以下のようなコマンドとなる。（参考サイトより）

`echo "echo 'Hello'" > .tmp/tmp; chmod +x .tmp/tmp; open -a "Terminal" .tmp/tmp`

上記を参考に、以下のような処理でターミナルを呼び出すこととし、シェルスクリプトに引数を渡すことが可能になった。

```
#実行対象のシェルスクリプトを指定
ShellScript="/ファイルパス/comment.sh"
	
#引数を書き込む一時ファイルの位置
TmpFile="/ホームディレクトリ/.tmp/tmp"
	
#シェルスクリプトへのファイルパスと引数（$1, リポジトリ位置）を一時ファイルに書き込み、ターミナルでそのファイルを開く
echo "$ShellScript $1" > $TmpFile; chmod +x $TmpFile; open -a "Terminal" $TmpFile
```

※上記の場合、ホームディレクトリに .tmp ディレクトリを作成する必要があります

以上で問題解決です。

# スクリプト
- **merge.sh**をSourcetreeにカスタムアクションとして設定
- 設定時、パラメータに**$REPO**を指定
- call_comment.shは、コメント修正を行いたい場合にのみ使用

merge.sh

```
#!/bin/sh

#関数ファイル呼び出し
. /ファイルパス/function.sh

#リポジトリに移動
cd $*

#merge(--no-ff)する
git merge --no-ff マージしたいブランチ名

#最新コミットのコメント修正スクリプト呼び出し
CallChangeComment $*
```

function.sh

```
#!/bin/sh

#最新コミットのコメント修正スクリプト呼び出し
function CallChangeComment() {

 #実行対象のシェルスクリプトを指定
 ShellScript="/ファイルパス/comment.sh"
	
 #引数を書き込む一時ファイルの位置
 TmpFile="/ホームディレクトリ/.tmp/tmp"
	
 #シェルスクリプトへのファイルパスと引数（$1, リポジトリ位置）を一時ファイルに書き込み、ターミナルでそのファイルを開く
 echo "$ShellScript $1" > $TmpFile; chmod +x $TmpFile; open -a "Terminal" $TmpFile

}
```

comment.sh

```
#!/bin/sh

#リポジトリに移動
cd "$1"

#コメント入力
read -p "コメントをなるべく簡潔・明瞭に入力して下さい：" input

#最新のコミットのコメントを書換
git commit --amend -m $input
```

call_comment.sh

```
#!/bin/sh

#関数ファイル呼び出し
. /ファイルパス/function.sh

#最新コミットのコメント修正スクリプト呼び出し
CallChangeComment $*
```

# まとめ
シェルスクリプトはろくすっぽ書いたことがなかったので、かなり大変でした。特に、シェルスクリプトに値を渡す部分については、参考になるサイトが一つしか見当たらなかったので、本当に助かりました。

あまりにも面倒なので、コメント修正だけターミナルで叩こうかとも思ったのですが、紹介した方法だと "カスタムアクションをクリック → ターミナルが開く" といったように、ワンタッチでできるので上手いこといってよかったです。

誰かお詳しい方、もっといい方法があるよ！という場合はコメントくださると嬉しいです。
Macbook Air 11inch にインストールした ubuntu にてコマンドキーでIMEのオンオフを切り替える

Macbook Air 11inch モデルに ubuntu16..04をインスールして使用しているのですが、コマンドキーでのIMEオンオフに慣れてしまったせいでついつい押してしまいます。そこで、インプットメソッドを変更してMac同様IMEのオンオフを切り替えたいと思います。
### Environments
- Macbook Air 11inch
- ubuntu 16.04
- US Keyboard

### How to install fcitx  

- purge ibus

```
sudo apt purge ibus ninja-build ibus-mozc
```
- dconf editor
  - desktop > ibus > general
    - delete preload-engin, version
  - org > gnome > desktop > input-sources
    - delete sources
- remove ibus integlation

```
gsettings set org.gnome.settings-daemon.plugins.keyboard active false
```
- install fcitx

```
sudo apt install fcitx fcitx-mozc
```
- create profile

```
vim ~/.xprofile
```
  - contents of profile

```
export GTK_IM_MODULE=fcitx  
export QT_IM_MODULE=fcitx  
export XMODIFIERS=@im=fcitx  
export DefaultIMModule=fcitx
```
- setting startup application fo /usr/bin/fcitx
- reboot
- setting shortcut key
  - fcitx configuration (show advance option)
    - Global Config > Active input method > Super_L
    - Global Config > Inactive input method > Super_R
- setting skin
  - right click to menubar icon > skin > dark

### 参考URL：
http://archlinux-blogger.blogspot.jp/2016/02/ibus-mozcfcitx-mozc.html
Vagrant と VirtualBox で簡単に仮想サーバーたてたよ

仮想サーバーならVagrant使うといいよって教えてもらったので、使ってみた。 
で、使って思った。 
なんて出来のよいヤツだと。 
今までOS落としたり、IP設定したり悪戦苦闘してたあれは一体・・・？ 
ってくらいとにかく簡単。というか楽。

最初はコマンドとかで戸惑うけど、開発環境いっぱいほしいから楽したい。 
ので、また使うときの為にキロク。

## 環境
ホスト：window
ゲスト：centOS7
ターミナル：Cygwin64

## DLから起動までの手順

#### 1.VirtualBoxのDL
  [https://www.virtualbox.org/wiki/Downloads](https://www.virtualbox.org/wiki/Downloads)
#### 2.VagrantのDLとインストール
  [https://www.vagrantup.com/downloads.html](https://www.vagrantup.com/downloads.html)

```cmd:コマンド
# 入ったか確認
$ vagrant -v
```
#### 3.Vagrant配下にフォルダ作成と移動

```cmd:コマンド
$ mkdir /cygdrive/c/Vagrant/centos7 
$ cd /cygdrive/c/Vagrant/centos7
```

#### 4.入れたいOSの検索 & コマンド実行  
  [https://app.vagrantup.com/boxes/search](https://app.vagrantup.com/boxes/search)  
※ 今回は [bento/centos-7.2 Vagrant box]を導入。[NEW] タブにコマンドあり。  

```cmd:コマンド
$ vagrant init bento/centos-7.2
```

#### 5.Vagrantfileの編集
centos7フォルダに作成された [Vagrantfile]をviで編集  
↓ 35行目のコメントアウトを外す  

```ruby:Vagrantfile
29   # within the machine from a port on the host machine and only allow access
30   # via 127.0.0.1 to disable public access
31   # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
32
33   # Create a private network, which allows host-only access to the machine
34   # using a specific IP.
35   config.vm.network "private_network", ip: "192.168.33.10"
36
37   # Create a public network, which generally matched to bridged network.
38   # Bridged networks make the machine appear as another physical device on
39   # your network.
40   # config.vm.network "public_network"
```
#### 6.仮想マシンの起動

```cmd:コマンド
vagrant up
```
※ VirtualBoxマネージャーからGUI操作でも可

で、おしまい

## ssh接続するなら


初期アカウント

| user    | pass    |
| ------- | ------- |
| root    | vagrant |
| vagrant | vagrant |

手順(5)でコメントアウトを外した行に記載されているIPアドレスと  
上記アカウントを組み合わせてssh接続。

```cmd:コマンド
ssh root@192.168.33.10
```
password聞かれるので、入力してログイン。

#### **2018/04/26 追記** 
sshコマンドですが、そんなめんどくさい繋ぎ方しなくてもよかったみたいです。  

```cmd:コマンド
vagrant ssh
```
これだけで繋がっちゃうなんて、さすがvagrant様です。

※ @tenmyoさんコメントありがとうございました


## 使ってみた感想
なんでもっと早く使わなかったんだろ。
<p></p>
faviconを動的に変更する


faviconが回転しているサイトを見つけたので備忘録
https://umabi.jp/poputepi-kinen/assets/js/favicon.js

```javascript:favicon.js
(function(){

  var favicons = [
    '/favicon_1.png',
    '/favicon_2.png',
    '/favicon_3.png',
    '/favicon_4.png'
  ];
  var favicons_base64 = [];
  var counter = 0;
  var elms = [];
  var head = document.getElementsByTagName('head')[0];
  var FPS = 200;
  var STAGE_SIZE = 64; // 画像サイズ

  var canvas = document.createElement('canvas');
  canvas.width = STAGE_SIZE;
  canvas.height = STAGE_SIZE;
  var context = canvas.getContext('2d');

  function main(){
    setBase64ToArray( counter );
  }

  function setBase64ToArray( n ){
    var img = new Image();
    img.onload = function(){
      context.drawImage(img, 0, 0);
      var base64 = canvas.toDataURL('image/png');
      favicons_base64.push(base64);
      if(n === favicons.length - 1){
        canvas = null;
        context = null;
        counter = 0;
        animateFavicon();
      }else{
        n++;
        context.clearRect(0, 0, STAGE_SIZE, STAGE_SIZE)
        setBase64ToArray( n );
      }
    };

    img.src = favicons[ n ] + '?' + new Date().getTime();
  }

  function animateFavicon(){
    setInterval( function(){
      changeFavicon();
    }, FPS);
  }

  function changeFavicon(){
    elms = document.getElementsByTagName('link');
    for(var i = 0, cnt = elms.length; i < cnt; i++){
      if(elms[i].getAttribute('rel')){
        if(elms[i].getAttribute('rel') === 'icon'){
          // console.log(elms[i]);
          elms[i].setAttribute('href', favicons_base64[counter]);

          if(counter === favicons.length - 1){
            counter = 0;
          }else{
            counter++;
          }              
        }
      }
    }
  }

  window.addEventListener('load', function(){
    var ua = window.navigator.userAgent.toLowerCase();
    if(ua.indexOf('trident') >= 0 || ua.indexOf('edge') >= 0 || ua.indexOf('iphone') >= 0 || ua.indexOf('android') >= 0 || ua.indexOf('ipad') >= 0) return;
    main();
  }, false);


})();
```

> 参考
[JavaScript で faviconを動的に変更する](https://hacknote.jp/archives/6400/)
[faviconを動的に変更する(html5-canvas)
](https://blog.mitsuto.com/archives/107155)
C# Console出力

今日やった内容はC#です。
そもそもC#とは何かというとC言語/C++言語をベースに拡張しつつ、Java風の機能や表記などが盛り込まれている。ガベージコレクションや変数の管理強化など、Javaも備える機能が追加されている。開発効率がC++から格段に向上する一方で、Visual Basicと同等以上の動作速度を持つアプリケーションを開発できるとされるプログラミング言語です。
１年の時にやったC言語はOS上で動くソフトウェアC#はWEBアプリケーションやWEBサイトなどに使われている言語です。
最初の時はCとC#似たようなことをするのかなって思っていたんですけど　
１年でやった時のC言語のソースコードはこういった感じで文字を表示しており
+```c
include <stdio.h>
int main(void) {
 printf("おはよう");
 return 0;
}
+```
+
２年生からの従業でのC#では
+
+```csharp
namespace MyconsoleApp
{
 class Program
 {
 static void Main(string[] args)
 {
 string n = "こんにちは";
 Console.WriteLine(n);
 Console.ReadKey();
 }
 }
}
+```
+
stringを使って表示をさせています。
VirtualBoxで２つのVMを立ち上げ、内部ネットワークで接続。かつMacのターミナルからssh接続する。

自分用メモとして適当に書きます。

目的
　・VirtualBoxで作成したVMに、Macのターミナルからssh接続する。
　・VMを２つ用意し、内部ネットワークで接続する

VirtualBoxで作成したVMに、Macのターミナルからssh接続する。
 ・VirtualBoxの「ファイル」→「ホストネットワークマネージャ」からipアドレスと名前を取得
　　・VMのネットワーク設定から「ホストオンリーアダプタ」を選択し、名前を先に取得した物に設定。
　　・VM起動し"nmtui"でネットワークマネージャを起動し、ipアドレスを設定。ホスト部分はネットワーク内
　　　　でユニークなものにする。ipv6は無効。デフォルトゲートウェイやip自動割り当てサーバは無効。
　　・"service NetworkManager restart" "service network restart"で再起動
　　・ターミナルから"ssh root@ipアドレス"で接続

VMを２つ用意し、内部ネットワークで接続する
　　・vmを２つ作成
　　・vmに新たなネットワークアダプターを追加。内部ネットワークを選択。名前を同一にする。
　　・vmを起動。
　　・nmtuiからipアドレスを設定。ネットワークは揃え、ホスト名はユニークにする。
　　・先と同様にネットワークの再起動。
 ・pingの送信