OmniAICreator/Qiita-1.07M huggingface dataset:
報告の仕方はエンジニアから学べ

みなさん、こんにちは！！
ジャスティンです！

今日は**「報告の仕方」**についてシェアします。
エンジニアさんなどと仕事をする上で「報告の仕方」は
**かなり重要です！！**

以前、僕がエンジニアさんにバグ報告した時に
「すみません。ユーザー登録できません」
と伝えたら、めっちゃ怒られました。

まず、どういう手順を踏んで行なったのか
という**「再現手順」**を書いてと言われました。

```
トップページメニューの「ユーザー登録」を押下
↓
ユーザー画面の必須項目を入力する
↓
登録ボタンを押しても次の画面へ進まない。
```

というふうに、「ユーザー登録できません」
と一言で言っても

```
・登録ボタンを押しても次の画面に進まないのか？
・登録ボタンを押すとエラーと表示されるのか？
・ページは移るが、データが登録されていないのか？
```

など、様々なパターンをエンジニアさんは考えます。
そこで、また聞き直さないといけないという手間がかかってしまいます。

なので、報告する際には
**『起こった事象の概要』**
**『事象が起こる再現手順』**
**『こうなってほしいという期待する挙動や姿』**
の３点セットで報告すれば大丈夫です。

この報告の仕方は
業種や立場が変わっても通用するし
一番分かりやすいと思っています。
VB.Net備忘録

#VB.NETの備忘録


## FORM のイベント

### Actived

公式ドキュメントにはフォームがアクティブになった際に発火するとなっているが
アクティブとは何か気になったのでちょっと調べてみました。

アクティブになる条件の仮説
① 画面に表示される
② フォーム内をクリックされる
③ フォーム内のコントロールにフォーカスされる
④ フォーム内の関数が呼び出される

結果としては④以外は発火しました。


## 文字列操作

### 文字列の途中で改行する

Enviroment.NewLine

### 0埋め

* Strings.Formatを利用する
 Format(“{0:000}”, isn’t) => 3桁で0埋め
上記方法はString型には使えない

* String.PadLeft(3, “0”c)

## ADO.NETでのSQL発行

* 発行するSQLに「;」をつけてはいけない

発行されているSQLを実行するとエラーにならないのに、
システムを実行するとエラーになるのはなぜ、、、と悩まされた

# コントローラ関連

## コントロールを探す

```vb
Me.Controls.Find("TextBox1", True)
```


## コンボボックス

* コンボボックスに表示する値と裏で持つ値を分ける

① コンボボックスに独自クラスを追加する。
Items.addで追加する場合

```vb
comboBox.items.add(hogeClass)
```
コンボボックスの表示はクラスのtoStringを使っているため、
toString関数をオーバーライドし、表示したい項目を指定すれば表示できる。


② sourceに設定する場合

```vb
combobox.DataSource = hogeClass.list
ComboBox.DisplayMember = hogeClass.name
comboBox.ValueMember = hogeClass.code
```

②の場合、
selectedItemのみでなく、selectedValueが使えるので楽チン


# プロセスの起動

## shellとDiagnostics.Process, ProcessStartInfo
[Shell Vs Process.start for executing external application](https://stackoverflow.com/questions/26038052/shell-vs-process-start-for-executing-external-application)
別記事にして細かく書く予定

色々と細かく制御できるDiagnostics.Processを使うことをここでは推奨されてます。
ただし、他に議論しているところ等を見つけられなかったので、どちらでもいいのかもしれません。

ProcessStartInfoを使って細かく設定することができる

```vb
Diagnostics.Process.Start(ProcessStartInfo)
```


# 排他制御

## Mutex

Mutex.WaitOneで取得。 他のプロセスが取得していればNG.
引数で待機時間を設定可能
使い終わったら、Mutex.ReleaseMutex()で解放


# log4netの設定
[[log4net] log4netの設定](http://blog.hiros-dot.net/?p=5461)

# ハンドリングできなかったエラーのハンドリング
[適切に処理されなかった例外をキャッチするには？](https://www.atmarkit.co.jp/ait/articles/0507/01/news134.html)

# logへの変数名やクラス名の出力

‘’’vb
$”{NameOf(hogeClass)}”
‘’’

上記記載により変数名のリファクタリングで同時に変更されるようになる。
また&でつなぐより可読性が高い


# STAとMTA
複数スレッドから呼び出せる(スレッドセーフ)か、単一のスレッドのみから呼び出せるものか定義する。
[STAとMTAについて](http://eternalwindows.jp/com/apartment/apartment01.html)
[Ubuntu/debian] apt-getでGPGエラーが出た時の対処メモ

Ubuntuやdebianを使っていると、
サードパーティーのリポジトリを使いたいということがあると思います。
launchpadなんかのリポジトリを登録して`apt-get update`すると、
GPGエラーが出てそこのソフトウェアリストが取得できないなんてのは
よくあります。
その度に先人様のお知恵を借りることになるわけですが、
いつまでも甘えるとゆーのもアレなので、備忘録。
まんま参考サイトのコピペだけでは芸がないので、
シェルスクリプトを作ってみました。

```bash:reg_gpg.sh
#!/bin/sh
 
# 引数処理
if [ $# -ne 1 ]; then
 echo "リポジトリの公開鍵を指定してください。" 1>&2
 exit 1
fi
 
# 実行ユーザ判定
if [ `id -u` -ne 0 ]; then
 echo "管理ユーザで実行する必要があります。" 1>&2
 echo "例：sudo ${0}" 1>&2
 exit 1
fi
 
# 公開鍵処理
gpg --keyserver keyserver.ubuntu.com --recv-keys $1
gpg --armor --export $1 | apt-key add -
apt-get update
```
AttributeError: 'module' object has no attribute 'reader'


```
import csv
file = open('/Users/mizuguchitaishi/Documents/data (24).csv')
reader = csv.reader(file)
print(reader)
```


pythonでcsvモジュールをインポートして実行したら
AttributeError: 'module' object has no attribute 'reader'
というエラーが出た

モジュールを探すとき最も優先されるのはスクリプトのあるディレクトリなので、この場合スクリプトは自分自身をインポートしてることになるらしい。
だから使うモジュールと同じ名前の.pyファイルを作らないように注意しないといけない。
csv.py→csvファイル.pyに変更したら実行できました。

参照
(https://togetter.com/li/2075)
Ubuntu 16.04 x64 に samba をインストールしてみる

#目的
Windows 10 からファイルをコピーするために、とりあえずsambaを使用する
※BULK INSERT を使う前にファイルをコピーする　とか
##sambaのインストール
$ sudo apt-get install -y samba
##samba用のログインアカウントを登録する
<pre>
# pdbedit -a tabizou
new password:
retype new password:
Unix username:        tabizou
NT username:
Account Flags:        [U          ]
～
</pre>
##共有dirの設定の定義を追加する
[printers]の前に追加 237行目位～
$ sudo vi /etc/samba/smb.conf
<pre>
[share]
   comment = Share directory
   path = /var/export/share
   read only = no
   guest only = no
   guest ok = no
   share modes = yes
</pre>
##共有dirを作成する
$ sudo mkdir /var/export/
$ sudo mkdir /var/export/share
$ sudo chmod 0777 /var/export/share
$ sudo systemctl restart smbd nmbd
explorer から \\ip-addr\share を確認する
##参考にしたのは以下のサイト
[Ubuntu 16.04: sambaをインストールしてWindows 10とファイル共有する](https://www.hiroom2.com/2016/05/11/ubuntu-16-04%E3%81%ABsamba%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6windows-10%E3%81%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B/)
Railsチュートリアル躓き→解決箇所:「2.3.5 アプリケーションをデプロイする」

##問題: heroku run rails db:migrateできない
- 環境: AWSCloud9
バージョン設定はRailsチュートリアル内容に準じる。

- エラー表示： 
heroku: command not found

- 解決法: https://teratail.com/questions/121247
上記ページ記載の手順を実行。
git push herokuはできたのになぜかこのコマンドは使えませんでした。
この解決法は「2.1 アプリケーションの計画」でも使用しており、同じものをインストールしているはずなので解決理由は不明です。
kintone プラグイン開発メモ　その５（設定画面で保存した値を読み込んでみる）

今回は、設定画面で保存した値を一覧画面で読み込んでみたいと思います。

# 流れ

 1. 設定画面を作成
 2. 設定画面で入力した値を保存
 3. 一覧画面で保存した値を読み込んで表示

# ソースコード

### プラグイン設定画面

```config.html
<html>
    <body>
        <h1>Hello,world設定画面</h1>
        <div id="form">
            <div>
                <label for="text">名前を入力：</label>
                <input type="text" id="name">
            </div>
            <div>
                <label for="text">今日の運勢を入力：</label>
                <input type="text" id="unsei">
            </div>
                <div class="button">
                <button type="button" id="button_submit">保存</button>
            </div>
        </div>
    </body>
</html>
```

### プラグインJS

```config.js
(function (pluginId) {
    "use strict";
    window.addEventListener('DOMContentLoaded', function() {
        console.log(kintone.plugin.app.getConfig(pluginId));
        document.getElementById("button_submit").onclick = function() {
            let elName = document.getElementById("name");
            let elUnsei = document.getElementById("unsei");
            let config = {
                "name": elName.value,
                "unsei": elUnsei.value
            };
            kintone.plugin.app.setConfig(config);
            window.alert("保存しました");
        };
    });

})(kintone.$PLUGIN_ID);
```

### アプリ用JS

```customize.js
(function(pluginId) {
    "use strict";
    let config = kintone.plugin.app.getConfig(pluginId)
    console.log(config);
    kintone.events.on('app.record.index.show', function(event) {
        window.alert('Hello,' + config["name"] + 'さん！ 今日の運勢は、' + config["unsei"] + 'ですね！');
    });
})(kintone.$PLUGIN_ID);
```

ひとまずプラグインで保存した値を読み込むまでやってみました。
実際に使うためには入力値をチェックする等のセキュリティが必要だと思いますので、そのあたりも調べていきたいと思います。
[JavaScript]Googlebotが理解できるWebシステムを構築するには　～進化が止まったからこそ使えるIE11～

#GooglebotとJavaScript

　JavaScriptを使用したWebシステムの作成において、念頭に置いておくのはSEO対策を行うかどうかである。サーチエンジンで拾ってもらう必要性のないシステムを構築するなら本記事は不要であり、好きなように作るのが最善だろう。今回はGooglebotに対して、いかにシステムが吐き出した情報を理解させるかという部分について記事にしていきたい。

##Googlebotの理解するJavaScript

　まずは公式サイトの情報を参照する
　　[Google 検索でのレンダリングについて](https://developers.google.com/search/docs/guides/rendering)

　まず前提としてChrome41相当の能力を持つと書かれている。JavaScriptに関してはES6をサポートせず、ES5に準ずる形で記述する必要がある。QiitaではJavaScriptというとES6に関する記事が沢山ヒットするものの、それらの機能はトランスコンパイルを前提にしなければ使用できない。

##機能として使用できないもの

　IndexedDB
　WebSQL
　Service Worker
　WebGL 

##その他の制限

　LocalStrageとSessionStrageはページをまたがることは出来ない。ただしページ内でのやりとりは可能なの。
　Cookieはページをまたがることは出来ないので、基本的にはサーバから送り出すだけとなる。

##動作確認の方法

　作ったシステムがGoogleBotで認識できるかどうかは、Googleが提供している「Search Console」の「Fetch as Google」を使用すれば良い。ただ、開発中に何度も利用するのは手間がかかる。そこで登場するのがInternetExplorer11だ。

　ご存じの通りIE11は、開発元のMicrosoftから見捨てられた存在だ。セキュリティの更新こそされるものの、新機能などは一切増える予定は無い。見事に進化が止まったブラウザなのだ。そしてIE11はGoogleBotが対象としているES5のJavaScriptまでしか動作しない。つまり動作検証にはうってつけなのだ。IE11で動いた物がGoogleBotで動かない可能性は低い。

##ES5はきっつい

　いかにSEO対策のためとはいえ、今更IE11をターゲットにしたES5の開発はつらい。しかしDOMの部分はどうにもならないが、CSSの定数定義やJavaScriptのES6で拡張された文法に関してはなんとかなる。そうトランスコンパイルだ。

#SCSS(SASS)やTypeScriptのススメ

　トランスコンパイルによって新しい機能を古い環境へ対応させる手段はいくつも出ている。その中でも開発で有用だとお勧めしたいのがSCSSとTypeScriptだ。

　SCSSに関してはスタイルシートの定数定義や構造化をすることが出来る。VSCodeに「Easy SASS」というプラグインを入れておけば、.scssを保存した瞬間に.cssが作成される。

　TypeScriptはJavaScriptの最新の文法を古い環境用にコンパイルしてくれるだけで無く、柔軟で高機能な型推論や入力補完を提供してくれる。これを使ったが最後、もはや素のJavaScriptには戻れないほど便利なのだ。コンパイルも早く、ウオッチビルドを有効にしておけば、保存した瞬間にコンパイルが始まる。そしてコンパイルの時間は、人間がブラウザの更新ボタンを押すより早い。

#化石環境にうんざりしている開発者

　色々なしがらみで古い環境に対応しているときの気持ちは「うんざり」というのが正直なところだと思う。しかし開発環境次第で、その「うんざり」を軽減したり、取り払ったり出来るのだ。後は便利なものをすんなり導入できる場所にいるかどうかが、次のポイントかもしれない。
Ansible日付付きディレクトリ

```
- name: hello
  debug: msg="This is copy"
- name: Now date
  shell: date "+%Y%m%d%A%M"
  register: result
- name: fetch
  fetch:
    src: ./files/dest.conf
    dest: ./files/backup/{{ result.stdout }}/
    flat: yes
- name: copying
  copy:
    src: ./files/src.conf
    dest: ./files/dest.conf
```
Ruby 三項演算子を使ってif 文を短く書いてみる。わっほい　２０１９/１/24　１５時更新

三項演算子という言葉を聞いたことはありますか？
どうやらif文をスマートに書く方法とのことなので早速使ってみましょう。
![if式の修正画像.png](https://qiita-image-store.s3.amazonaws.com/0/285561/7fbfeb4d-94e9-2426-ed49-ddf561e3aaac.png)
今回はシンプルな if 文を書き直してみます。まずは if 文で 以下のコードがあったとします。
出力結果は「100より大きいです」となります。

続いて条件演算子（またの名を三項演算子）の書き方なのですが、!![その3.png](https://qiita-image-store.s3.amazonaws.com/0/285561/e33469e4-27e3-5ed9-eef8-2ddfc9bbc2f6.png)
という書き方ができるそうです。実際に先ほどのコードを書き直してみます。
if 式
![その1.png](https://qiita-image-store.s3.amazonaws.com/0/285561/68a20914-652a-d4d6-9a7b-aef792faa8ae.png)

を三項演算子だと
![しび2.png](https://qiita-image-store.s3.amazonaws.com/0/285561/ede29c5b-12b1-763b-bd25-8512423359da.png)
とこんなにも短く書くことができます。5行のif 式がなんと1行になった。いいですね。

また以下のようにカッコで式をくくる書き方もできるそうです。
![条件演算子の変更.png](https://qiita-image-store.s3.amazonaws.com/0/285561/3cc15a90-66d0-272d-f77b-5a7e9d4a0b86.png)


また、if elsif など複雑な条件分岐にはコードの可読性が悪くなるという意見を
よく聞きます。なので今回のようなシンプルな文章にのみ使えるショートカット的なものと考えておいたほうがいいのかもしれないです。

でも、使いこなすとかっこいい感じはありますね。

以上です。


2019/01/24 コメントを参考に編集しました。
anacondaでconda createを実行しようとすると「 Solving environment: failed 」と出て実行できなかった

##環境
Windows10 64bit
anaconda3(2018.12)

##解決法
anacondaディレクトリ内の\Library\binをpathに追加するだけ



##至るまでの経緯
anacondaをインストールして機械学習用の環境を構築しようと思い、他記事を参考にcreateコマンドを打ってみた所以下のエラーが発生

```

>conda create -n deep python=3.5 anaconda
Solving environment: failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/pro/win-64/repodata.json.bz2>
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.

If your current network has https://www.anaconda.com blocked, please file
a support request with your network engineering team.

SSLError(MaxRetryError('HTTPSConnectionPool(host=\'repo.anaconda.com\', port=443): Max retries exceeded with url: /pkgs/pro/win-64/repodata.json.bz2 (Caused by SSLError("Can\'t connect to HTTPS URL because the SSL module is not available."))'))

```

エラー文でググってみると、sslを無効にすれば出来ただとかcondaをアップデートしろだとか出てきたが行っても解決せず
(condaに至ってはupdateコマンド打っても同様のエラー発生で実行できない)

困り果てながら探していると以下のコメントを発見
https://github.com/conda/conda/issues/6064#issuecomment-453147166

言われるがままにpathへ追加した後コマンドを打ち込むと成功

```

>conda create -n deep python=3.5 anaconda
Solving environment: done

## Package Plan ##

  environment location: C:\Users\[ユーザ名]\Anaconda3\envs\deep

  added / updated specs:
    - anaconda
    - python=3.5


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    pylint-1.8.4               |           py35_0         779 KB
…以下略

```

わぁいやったぁ
【Java初心者】＝＝演算子とequalsメソッド

■ == 演算子(オペレーター)：比較するものはオペランド(値や変数)
■ objectクラスのequalsメソッド：比較するものはオブジェクト


● equalsメソッドはオーバーライドして使うことを前提としている


【Stringクラスのequalsメソッド】

String型のequalsメソッドでは、String型の文字列をchar型の配列に代入して1文字づつ確認する。
つまり、String型のインスタンスは文字列として判断される。

(1)   String a = new String("sample");
(2)   String b = "sample";
(3)   System.out.print(a==b);
(4)   System.out.print(a.equals(b));

【解説】
(1)String型のインスタンス
(2)String型のリテラル
(3)実行結果：false   理由：参照が異なる為
(4)実行結果：ture    理由：文字列を比較している為
Rails と jupyter の連携をとても簡単にする railtie の gem を書いた

# TL; DR

```ruby:Gemfile
gem 'jupyter_on_rails'
gem 'ffi-rzmq'
```

すると

```shell-session
rake jupyter:notebook
```

ができて

![the_screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/62111/472d71ee-6f98-e563-ab7a-0c328d790ac1.png)

rails が自動ロードされるカーネルが設定された jupyter が開けるようになる。

# 詳細

## モチベーション

jupyter で rails 読み込んで、もろもろの分析(Daru とか)を行うようなタスクをやっていると、どうも jupyter が rails に乗っかっていないような気がするので、それをできる限り自動化したいと思った。

[Jupyter Notebook 上で rails c を動かす](https://qiita.com/QUANON/items/9afd25c6749e924d4cf9)　のように、 jupyter notebook 上に rails をロードする設定を書いてやればいいといえばいいのだが、

* DRY じゃない。。
* ユーザーグローバルに存在する iruby カーネルに気を遣う必要がある

のはいやだと思った。

## 実装方針

Rails なのだから、すべてプロジェクトディレクトリで完結して、 ruby と python さえあればだいたいよろしく動いてくれるようにする。そのために: 

* jupyter は Pipfile で管理されてればそれを使う
* jupyter の設定 (iruby の設定) は rails プロジェクトルートの中で行う
* ruby で完結できるものは rake タスクで自動的に一発で
* Rails を自動読み込みしてくれる jupyter カーネル作る

## できあがったものがこちら

https://github.com/Yuki-Inoue/jupyter_on_rails

## 利用法

### 前提条件

* `iruby` と `ffi-rzmq` の gem が通るように環境を整える (それぞれのページをご参照ください)
* `jupyter` コマンドが利用できる。
    * 個人的なおすすめは、プロジェクトルート直下の Pipfile に対して `pipenv install jupyter`

### 使い方 -> TL; DR 参照

注意点として、 iruby は session に使う gem を選択できるようになっているので、それにならい

* `ffi-rzmq`
* `cztop`

のいずれかをアプリケーションの Gemfile に記述することを想定してます。

どちらも存在しないと、 `IRuby::Kernel::Session` がないよ！みたいなエラーがでます。

## 所感

spring は魔法。
How to Make a Social Networking App for Android

![how to develop an app for android](https://d32myzxfxyl12w.cloudfront.net/assets/images/article_images/edd353cca8f016d01755a5d3a5c5939afc9a9eb1.png?1543158110)

General information on social media app development for Android:

- Architecture: MVVM (model–view–viewmodel) architectural pattern
- Programming language: Earlier we used only Java to develop apps for Android but now Kotlin is preferable for all new projects.
- Framework: The main framework used is Google Play Services. It allows for access to Google Services like Firebase, Cloud Messages, In-App purchases, Geolocation, etc.
- Library: RxJava2 mostly for composing asynchronous operations.

Technical implementations for the Network layer are done with:

- Retrofit for network requests
- GSON for JSON parsing
- Glide for loading images and caching

Code generation: Dagger framework for dependency injections.
Analytics: Fabric platform for collecting crash reports and minimal data about app usage.
Test frameworks: JUnit, Mockito, Robolectric

Learn more [here](https://mlsdev.com/blog/how-to-create-social-media-app)
Gnuplotでオングストローム記号が正しく表示されない問題

こちらの[リンク](https://stackoverflow.com/questions/19141767/gnuplot-angstrom-label-with-times-roman-font)にあるように、Gnuplot（私の手元でversion 5.2.2）でepsを作成する時、Times-RomanフォントのÅ記号を出そうとすると、正しく表示されない時があります。
それに対してなんとかして表示してみたというものです。
リンク内の回答でも、
```~A{1{^\260}}```
とすれば少し不恰好だけど、表示できるとありますが、"A"と"°"のフォント大きさをそれぞれ変えて
```{/=30 {/Times-Roman ~A{/=24 ^\260}}```
のように重ねて表示すればちゃんとÅになりました。
Java ばらばらの文字コードを一括で同じ文字コードに変換

Java ファイルのばらばらの文字コードを一括で同じ文字コードに変換して保存

``` Java
    public void writeFile() throws IOException {
        Files.list(Paths.get("dir"))
            .filter(p -> p.toFile().getName().endsWith(".txt"))
            .forEach(p -> writeFile(p));

        Files.find(Paths.get("dir")
                , Integer.MAX_VALUE
                , (p, a) -> p.toFile().getName().endsWith(".txt"))
            .forEach(p -> writeFile(p));
    }

    public void writeFile(Path path) {
        try {
            Files.write(path
                    , readFile(path).stream().collect(Collectors.joining("\r")).getBytes(StandardCharsets.UTF_8));
        } catch (IOException e) {
            throw new IllegalStateException("write error file : " + path.toAbsolutePath(), e);
        }
    }

    public List<String> readFile(Path path) {
        for (Charset charset: Charset.availableCharsets().values()) {
            try {
                return Files.readAllLines(path, charset);
            } catch (MalformedInputException e) {
                e.printStackTrace();
                continue;
            } catch (IOException e) {
                throw new IllegalStateException("read error file : " + path.toAbsolutePath(), e);
            }
        }
        throw new IllegalStateException("read error file : " + path.toAbsolutePath());
    }
```
Rails ルーティング、レンダー、リダイレクト

###Railsのルーティング、レンダー、リダイレクトについてまとめ。
本やネットではよく見ますが、自分でまとめないとよく理解出来ていない気がするので図にしてアウトプット。

<img width="920" alt="スクリーンショット 2019-02-05 4.36.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/343136/ff797ee7-3dda-db62-92fa-caa5b3efb868.png">

アクションに続けて、ビューを表示する事をレンダー(render)
アクションの次に別のURLにリクエストし直す事をリダイレクト(redirect)
[Markdown] リンク付き画像をReference-style linkで短く表記する

###### (An English translation is available [here](https://dev.to/tomoyukiaota/markdown-short-notation-for-an-image-with-a-link-using-reference-style-link-3mg).)

# はじめに

Markdownでリンク付き画像を表示すると、必要な文字列が長くなる傾向があります。
例えば、Travis CIのバッジ（[![Build Status](https://travis-ci.org/travis-ci/travis-web.svg?branch=master)](https://travis-ci.org/travis-ci/travis-web)）は次のようになります。

```
[![Build Status](https://travis-ci.org/travis-ci/travis-web.svg?branch=master)](https://travis-ci.org/travis-ci/travis-web)
```

（このバッジの例は、Travis CIの[Embedding Status Images](https://docs.travis-ci.com/user/status-images/)で紹介されているものです。）

これほど長い文字列だと、例えば表の中でリンク付き画像を使いたい場合に書きづらくなってきます。

| OS     | Status |
|:------:|:------:|
| Ubuntu | [![Build Status](https://travis-ci.org/travis-ci/travis-web.svg?branch=master)](https://travis-ci.org/travis-ci/travis-web) |

```
| OS     | Status |
|:------:|:------:|
| Ubuntu | [![Build Status](https://travis-ci.org/travis-ci/travis-web.svg?branch=master)](https://travis-ci.org/travis-ci/travis-web) |
```

上の例ではバッジは１つですが、仮に１行に２つ以上バッジを並べようとすると、列の区切りの`|`が一目で分からないぐらい複雑になってきます。
実際の例としては、[srz-zumix/iutestのREADME.md](https://github.com/srz-zumix/iutest/blob/master/README.md)には、多くのバッジを載せた表があります。その[Raw content](https://raw.githubusercontent.com/srz-zumix/iutest/master/README.md)はとても複雑です。

どうにか短くできないものでしょうか？

# 改善案

[Reference-style link](https://www.markdownguide.org/basic-syntax/#reference-style-links)を使うと、多少マシになります。次のようになります。



```
| OS     | Status |
|:------:|:------:|
| Ubuntu | [![travisci-image]][travisci-link] |
```

`[![travisci-image]][travisci-link]`と、だいぶ短くなりました。
これなら、１行に２つ３つバッジを並べても大丈夫でしょう。
画像URLとリンクURLは、別の場所に次の２行を書いておきます。

`[travisci-image]: https://travis-ci.org/travis-ci/travis-web.svg?branch=master`
`[travisci-link]: https://travis-ci.org/travis-ci/travis-web`

`travisci-image`と`travisci-link`は任意の文字列なので、分かりやすい名前をつけるなり、列の区切り文字`|`が揃うように文字数を調整するなりすれば良いと思います。

# おわりに

Qiita上でこの表記法を使った表を置いておきます。この記事のURLの末尾に.mdをつけて、ソースを見てみてください。

| OS     | Status |
|:------:|:------:|
| Ubuntu | [![travisci-image]][travisci-link] |

[travisci-image]: https://travis-ci.org/travis-ci/travis-web.svg?branch=master
[travisci-link]: https://travis-ci.org/travis-ci/travis-web

GitHubでもこの表記法は使えます。例として[GitHub Gist](https://gist.github.com/TomoyukiAota/812dd25222819347cb9c7eea973fc3b3)を置いておきます。このGistでRawボタンをクリックすると、実際に使っていることが分かります。
メモ:javascriptの単項プラス(+)について

javascsriptで文字列(string)から数値（number）への変換を行う時、parseInt()を使うが、javascriptの使用には以下のような記法も存在する。

```
const num1 = parseInt('5')
const num2 = +'5'
```

ブラウザのコンソールなどで試して見るとわかるがこれは同じ結果になる。
とはいえ、これは別にparseIntの省略形とかそういうわけではなく、仕様上はECMAscriptのUnary + Operator（単項プラス演算子）である。

[ECMAScript Language Specification - ECMA-262 Edition 5.1](https://www.ecma-international.org/ecma-262/5.1/#sec-11.4.6)

```
11.4.6 Unary + Operator

The unary + operator converts its operand to Number type.

The production UnaryExpression : + UnaryExpression is evaluated as follows:

1. Let expr be the result of evaluating UnaryExpression.
2. Return ToNumber(GetValue(expr)).
```

実装上はparseInt()の代わりなどで使われることが多そうだが、明示的ではなくぱっと見『？？？』と思ってしまうので、可読性がいいともいえないだろう。parseInt()が使われる頻度を考えれば、単項プラスにしたところでコード全体で見れば対して効率がよくなっているとも思えない。
高速であると言われている（が、自分で計測はしてないのでなんとも）。だが、高速とはいっても、numberへの変換だけを数百数千とやるようなコードをjavascriptで書くことがそうそうある気もしない（あるなら話は別なのだろうが。。）。

正直、あまり使わない方がいいのではないか、とも思えるが一応メモ。
Rstudioのグラフで日本語が豆腐になっちゃうときはフォントをインストールしよう

勉強会用にvagrant + ubuntu18.04 + RStudioServer環境を作ったんですが、標準ではグラフのタイトルやラベルに日本語表示を使うことができません。お馴染みの豆腐表示になっちゃいますガビーン。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/4d025022-d9d0-2687-26d8-11806e3d5abd.png)

というわけでフォントを追加してグラフに日本語表示ができるようになるとこまでやってみます。


## 1. 仮想環境にssh接続

この記事では以前作った環境に追加していきますので、そちらも見て頂けるとスムーズだと思います。ubuntuマシンにRStudioServerをインストールしてる場合は普通にterminalで操作すれば良いだけですのでスキップしてください。
https://qiita.com/studio_haneya/items/3f8980c02520422bae79

vagrant環境なので仮想マシンを起動してssh接続します。

```
cd c:\Users\ユーザー名\Vagrantのあるフォルダ\
vagrant up
vagrant ssh
```
仮想マシンにインストールされてるフォントの一覧を確認します。

```
$ fc-list
/usr/share/fonts/truetype/dejavu/DejaVuSerif-Bold.ttf: DejaVu Serif:style=Bold
/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf: DejaVu Sans Mono:style=Book
/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf: DejaVu Sans:style=Book
/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf: DejaVu Sans:style=Bold
/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf: DejaVu Sans Mono:style=Bold
/usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf: DejaVu Serif:style=Book
```
日本語フォントがないようですのでインストールします。ubuntu18.04のXウィンドウ版で標準になっているgoogle notoフォントを使おうと思います。ちなみにnotoはno more tofuの略で、マルチバイト文字が表示できなくて豆腐になっちゃうのを防ごうという動機で作られたフォントなんだそうです。ありがたやですね。

```
sudo apt-get install fonts-noto-cjk
```
インストールできたか確認しておきます。

```
vagrant@vagrant:~$ fc-list : family

Noto Sans Mono CJK TC,Noto Sans Mono CJK TC Bold
Noto Sans Mono CJK TC,Noto Sans Mono CJK TC Regular
Noto Sans Mono CJK SC,Noto Sans Mono CJK SC Regular
DejaVu Sans Mono
Noto Serif CJK JP
Noto Serif CJK KR
Noto Sans CJK SC,Noto Sans CJK SC Regular
Noto Serif CJK SC
Noto Serif CJK TC
Noto Sans CJK TC,Noto Sans CJK TC Regular
Noto Sans CJK KR,Noto Sans CJK KR Bold
Noto Sans CJK JP,Noto Sans CJK JP Bold
Noto Sans CJK SC,Noto Sans CJK SC Bold
DejaVu Sans
Noto Sans CJK TC,Noto Sans CJK TC Bold
Noto Sans Mono CJK SC,Noto Sans Mono CJK SC Bold
Noto Sans Mono CJK JP,Noto Sans Mono CJK JP Regular
Noto Sans CJK JP,Noto Sans CJK JP Regular
Noto Sans Mono CJK KR,Noto Sans Mono CJK KR Regular
DejaVu Serif
Noto Sans CJK KR,Noto Sans CJK KR Regular
Noto Sans Mono CJK KR,Noto Sans Mono CJK KR Bold
Noto Sans Mono CJK JP,Noto Sans Mono CJK JP Bold
```
無事インストールできたようなので、RStudioServerで確認してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/b8430583-d05b-f375-7c0a-a7b9385a17d2.png)
やったね
Webフレームワークのベンチマーク

Webフレームワークの選択には色々な角度からの比較が必要だ
学習難易度、将来性、技術者の集めやすさ、ライブラリの充実度、Web情報量、日本語コミュニティ、実行速度
その中でも、速度について調査した  

https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&d=1l

上記は有名なベンチマークである
もちろん、ベンチマークじゃ実際の数値はわからないが、参考には十分になる
ただし、このベンチはMySQL、PostgreSQLであり、NoSQLだと値は大きく変わるかもしれない

#まずは有名フレームワーク

データは先頭より
順位、フレームワーク名、スコア、トップとの割合
MySQLがあるものは、なるべくそちらを選ぶようにした

##akka(scala Microservice)
| 41 | akka-http | 18,329 | 40.1% |
|--:|:--|:--|:--|

よく速いと言われているフレームワーク。やはり速い


##servlet(java Platform)
| 45 | servlet-mysql | 17,994 | 39.4% |
|--:|:--|:--|:--|

Javaも速い

##revel(go Fullstack)
| 90 | revel-raw | 12,013 | 26.3% |
|--:|:--|:--|:--|

フルスタックフレームワークでこの速度！！

##node.js(JS Microservice)
| 125 | nodejs | 8,522 | 18.6% |
|--:|:--|:--|:--|

スクリプト言語では健闘している

##play2(scala Fullstack)
| 127 | play2-scala-anorm-netty | 8,401 | 18.4% |
|--:|:--|:--|:--|

##bottle(python Microservice)
| 141 | bottle-raw | 8,048 | 17.6% |
|--:|:--|:--|:--|

##play2(java Fullstack)
| 161 | play2-java-jpa-hikaricp | 6,925 | 15.1% |
|--:|:--|:--|:--|

##spring(java Fullstack)
| 170 | spring | 6,238 | 13.6% |
|--:|:--|:--|:--|

##phoenix(elixir Fullstack)
| 174 | phoenix | 5,987 | 13.1% |
|--:|:--|:--|:--|

##laravel(PHP Fullstack)
| 231 | laravel | 2,821 | 6.2% |
|--:|:--|:--|:--|

##rails(ruby Fullstack)
| 232 | rails | 2,795 | 6.1% |
|--:|:--|:--|:--|

##codeigniter(PHP Fullstack)
| 243 | codeigniter | 2,296 | 5.0% |
|--:|:--|:--|:--|

##Django(python3 Fullstack)
| 254 | django-py3 | 1,659 | 3.6% |
|--:|:--|:--|:--|

##tornado(python Platform)
| 296 | tornado-postgresql-raw | — | Did not complete |
|--:|:--|:--|:--|

Pythonの非同期フレームワークだが、残念ながらこのベンチは達成できなかった


想定通り
スクリプト言語よりコンパイル言語が速い
同期より非同期が速い
フルスタックフレームワークよりマイクロサービスフレームワークの方が速い
という全体的な傾向が出た

Java、Scalaは速い
revel(go)はフルスタックのわりに高速

#気になるフレームワーク

##actix(rust Microservice)
| 1 | actix-pg | 45,719 | 100.0% |
|--:|:--|:--|:--|

##vertx(Java Platform)
| 3 | vertx-postgres | 41,920 | 91.7% |
|--:|:--|:--|:--|

##http4k(kotlin Microservice)
| 5 | http4k | 28,062 | 61.4% |
|--:|:--|:--|:--|

##fasthttp(go Platform)
| 9 | fasthttp-postgresql | 26,890 | 58.8% |
|--:|:--|:--|:--|

##swoole(PHP Platform)
| 24 | swoole | 22,289 | 48.8% |
|--:|:--|:--|:--|

##asp.NET core MVC(C#Fullstack)
| 38 | aspcore-mw-ado-my | 19,015 | 41.6% |
|--:|:--|:--|:--|


PHPのswoolが速いと聞いていたが予想以上に速い
また、フルスタックながらC#の .NET MVC速い
が、トップに Rustのactixがきて
次点としてJavaのvertx

何個か気になったフレームワークあったので、今度調査します
unityにおいてボタンでカメラの切り替えを行う。

Unity 2018.3.1f1を使い始めた初心者です。
シーンに配置した二つのカメラ"MainCamera"と"SubCamera"をButtonで"MainCamera"から"SubCamera"へ切り替わるようにしたいのですが
NullReferenceException: Object reference not set to an instance of an object
のエラーが出てしまいます。

使用しているスクリプトは以下のものです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

    public class switchcamera : MonoBehaviour { 

    Camera mainCamera; 
    Camera subCamera;

    public switchcamera()
    {
    }

    void start(){ 
        mainCamera = GameObject.Find("MainCamera").GetComponent<Camera>(); 
        subCamera = GameObject.Find("SubCamera").GetComponent<Camera>(); 
        subCamera.enabled = false;
        mainCamera.enabled = true;
    }
    public void OnClick() { 
        mainCamera.enabled = false; 
        subCamera.enabled = true; 
 
   
    } 
}

ヒエラルキー画面はこのような要素になっています。
<img width="363" alt="スクリーンショット 2019-01-24 1.53.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/347789/49cca816-77a3-8518-973a-c5dc33995dcf.png">

MainCameraのセッティング画面です。
<img width="281" alt="スクリーンショット 2019-01-24 1.56.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/347789/865fa892-6804-894f-5eef-6006ac715f6c.png">

SubCameraはこちらです。
<img width="271" alt="スクリーンショット 2019-01-24 1.57.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/347789/b2cf7785-5e0a-58e2-653b-9339a8596f05.png">

Buttonのinspectorはこちらです。
<img width="673" alt="スクリーンショット 2019-01-24 2.00.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/347789/9225f354-2a94-4065-b9e6-2263b3f53164.png">

findがうまくいっていないのかと思っています。
どなたか、ご教授お願いいたします。
Windows10 Pro x64 + VirtualBox に Ubuntu 16.04 をインストールする

#目的
VirtualBox に Ubuntu 16.04 をインストールしたときのメモ
##isoイメージのダウンロード
[Ubuntu 16.04.5 LTS (Xenial Xerus)](http://releases.ubuntu.com/16.04/)
より ubuntu-16.04.5-desktop-amd64.iso をDLする
##VirtualBoxの設定
###ダウンロード
<a href="http://download.virtualbox.org/virtualbox/5.2.24/">Index of /virtualbox/5.2.24</a>
より VirtualBox-5.2.24-128163-Win.exe をDL後インストールする
###仮想マシンの作成
・VirtualBoxを起動
　新規ボタン -> エキスパートモードボタンを押して、vdiファイルの保存先を指定する
・Ubuntuをインストールする前の設定（後でも良い）
　設定ボタン
　　一般 -> 高度(A)
　　　クリップボードの共有：双方向
　　　ドラッグ＆ドロップ：双方向
　　システム -> マザーボード
　　　メモリ：10240MB
　　システム -> プロセッサー
　　　プロセッサー数：４
　　システム -> スクリーン
　　　ビデオメモリー：128MB
　　ネットワーク -> アダプター１
　　　割り当て：ブリッジアダプター
　　　名前：Intel(R)I211 Gigabiy Network Connection
　　ユーザーインターフェース
　　　メニュー横のチェックボックスがonであることを確認
　　グローバルツールボタン
　　　アダプター(A)
　　　　アダプターを手動で設定をチェック
　　　　アドレスとネットマスクを設定する
　上記を設定後、Ubuntuをインストールする
###Ubuntuイストール後の設定
####rootのパスワードの設定
$ sudo passwd root
####パッケージの更新
$ sudo apt-get update
$ sudo apt-get upgrade -y
####openssh-serverのインストール
$ sudo apt-get install openssh-server
$ sudo vi /etc/ssh/sshd_config
\# 28行目：no に変更してrootログイン一切禁止
PermitRootLogin no
$ sudo systemctl restart ssh
####システム設定ボタン押下
　画面の明るさとロック
　　ロックする：オフ
　外観 -> 挙動
　　ウインドウのメニューを表示：ウインドウのタイトルバーの中をチェック
　ネットワーク -> 有線 -> オプションボタン
　　IPv4
　　　方式：手動
　　　追加ボタン押下：アドレス、ネットマスク、デフォルトゲートウェイを入力
　　　DNSサーバー：入力する
　$ sudo service network-manager restart
　$ ifconfig で変更されていることを確認する
###debパッケージのインストール
最初にVsCodeをインストールすることが多いのでついでにメモ
[Download Visual Studio Code](https://code.visualstudio.com/download)
より .deb 64bit をDLする
$ sudo dpkg -i code_1.30.2-1546901646_amd64.deb
$ ls /etc/apt/*/* で以下が追加される
 /etc/apt/sources.list.d/vscode.list
 /etc/apt/trusted.gpg.d/microsoft.gpg
####pylintをインストールする
$ sudo apt install python-pip
$ sudo apt install python3-pip
$ sudo pip3 install pylint
####拡張機能の追加
　Japanese Language Pack for VS Code
　Code Runner
　Python for VSCode
####サンプルの実行
```py:test01.py
# _*_ coding: utf-8 _*_
# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode
print('日本語')

[Running] python3 -u "/path/to/dev/vscode/python/samp/test01.py"
日本語

[Done] exited with code=0 in 0.05 seconds
```
参考にしたサイトはこちら
<a href="https://sicklylife.jp/ubuntu/1604/tsukaikata/usage.html">Ubuntu 16.04 LTSの使い方 (基礎編)</a>
・ランチャーに常時アイコンを表示したい場合は、アプリケーションを起動した後
　ランチャーのアイコンを右クリックしてLauncherに登録をクリックすれば常時表
　示されるようになります。
php-master-changes 2019-01-23

今日はアンシリアライザからの PHP3 形式のオブジェクトのサポート削除、テストのスキップ条件の修正があった！

# 2019-01-23
## nikic: Remove the "o" serialization format
- https://github.com/php/php-src/commit/89a4c172e24d7eb2be7f272a6075634a14f1d791
- unserialize() の処理からオブジェクトの "o:" のサポートを削除
- "C:" とか "O:" の方は残る
- "o:" は serialize() で決して吐かれない奴で、セキュリティ面での考慮を減らすため消したみたいな感じかな
- なお "o:" は PHP3 のオブジェクト用っぽい
    - [PHP4 で "O:" になった](https://github.com/php/php-src/commit/6ecd417b34bd5b957e0f9b76610f94421f38d955)みたいなコミットが

## carusogabriel: Make more tests run os MacOS
- https://github.com/php/php-src/commit/04723f21017c6ecd4c8d449d2801c2c79c7ecabd
- 幾つかのテストで OS を見てスキップするのをやめた
- この人前からスキップ条件外す修正ちょこちょこ入れてるんだけど、テストのスキップ条件て意図なく入れてるものではないと思うので、うーん、これはやった方いい奴なのかやらん方いい奴なのか、みたいな気持ちでいつも見てる
WordPressのREST APIにAll in One SEOの項目を追加する方法

WordPressのREST APIは便利ですが、色々カスタマイズしないと使いにくいのも事実。
みなさんがよく使うAll In One SEOの項目が入ってないのでこれを項目に追加して取得可能にする方法を以下に示します。
いつものWordPressのfunction.phpに以下を足すだけです。ちなみに追加するフックはこちらを参照ください。
http://hookr.io/plugins/all-in-one-seo-pack/2.3.9.2/hooks/#index=a

```
add_action( 'rest_api_init', 'adding_post_meta_rest' );
function adding_post_meta_rest() {
	register_rest_field( 'post',
						'_aioseop_title',
						array(
							'get_callback'      => 'post_meta_callback',
							'update_callback'   => null,
							'schema'            => null,
						)
					   );
	register_rest_field( 'post',
						'_aioseop_description',
						array(
							'get_callback'      => 'post_meta_callback',
							'update_callback'   => null,
							'schema'            => null,
						)
					   );
	register_rest_field( 'post',
						'_aioseop_keywords',
						array(
							'get_callback'      => 'post_meta_callback',
							'update_callback'   => null,
							'schema'            => null,
						)
					   );
}
function post_meta_callback( $post, $field_name, $request) {
	return get_post_meta( $post[ 'id' ], $field_name, true );
}
```

WordPressAPIは以下のようになっています。
(your website)/wp-json/wp/v2/posts?_embed
こうして呼ぶことで情報を取得できます。

![rest.png](https://qiita-image-store.s3.amazonaws.com/0/1593/3c785edd-4d59-6f9b-5679-78b22ed7c332.png)
最低限のGit運用

# 目的
- 今までの現場ではSVNしか使った事が無いのでGitの運用方法が分からなかった。
- プライベートでは使っていたがmasterしか使っておらず、Gitの良さを理解していなかった為、この機会に勉強しようと思った。

# 準備するもの
- Githubのアカウント
- Sourcetree
# やってみた
**とりあえずbranchを切る**

- master：リリース時のソースコードを管理するブランチ
- develop：開発の主軸となるブランチ
- feature：作業ブランチ。機能追加毎に作成する
![スクリーンショット 2019-01-24 0.36.03.png](https://qiita-image-store.s3.amazonaws.com/0/344952/6392b281-bddb-3625-efb5-c7b168efe199.png)

**featureブランチで作業(今回はファイル追加)を行い、コミット&プッシュを行う**
![スクリーンショット 2019-01-24 0.37.23.png](https://qiita-image-store.s3.amazonaws.com/0/344952/c24729f0-1eaa-2518-b337-a069d13993ea.png)

**Githubにてfeatureからdevelopに対してpull requestを行う**
![スクリーンショット 2019-01-24 0.56.05.png](https://qiita-image-store.s3.amazonaws.com/0/344952/2127aae4-b124-75a3-5157-ccc68d087067.png)

**pull requestを承認する事でマージされる(今回は自作自演)**
![スクリーンショット 2019-01-24 0.56.25.png](https://qiita-image-store.s3.amazonaws.com/0/344952/157cc9f7-28c0-dbc8-c78f-58f7474046c1.png)

**developからmasterにマージする**
![スクリーンショット 2019-01-24 0.57.12.png](https://qiita-image-store.s3.amazonaws.com/0/344952/84fe6084-db1f-0f22-2c73-7df518adfdbd.png)

# まとめ
とりあえず最低限の運用としてはこんな感じかな。
まだまだ学ぶ事はあるのでGitの勉強はちゃんとやっていきたい。
Ubuntu: ~/.profile を誤って上書きしてしまったときの解決法

# 背景
仮想サーバー VirtualBox 上で動かしている Ubuntu に対して日本語化しようとして、いつの間にか色機能が失われ、白一色になってしまった。

*辺り一面雪景色の図*
<img width="577" alt="Screen Shot 2019-01-24 at 1.11.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/68d9e059-2549-8caf-0eef-322e52162f2e.png">

# 原因
ファイルへの追記ではなく、上書きをしてしまったことが原因と思われた。

```bash:正
echo export LANG=ja_JP.UTF-8 >> ~/.profile
```

```bash:誤（上書きしてる）
echo export LANG=ja_JP.UTF-8 > ~/.profile
```

# 解決方法
## 流れ
デフォルトの状態が別ファイルに存在しているので（ありがたい...！）、それをコピー元に、「~/.profile」ファイルを初期化する。
もしデフォルトに対して追記したものがあれば、別ファイルに退避しておき、初期化後今度こそ正しいコマンドで追記する。

まさしくこの Q&A のとおり。
https://askubuntu.com/questions/381340/how-to-reset-profile-to-default

## 実行コマンド
```bash:デフォルトからコピーして復活させる
$ cp /etc/skel/.profile ~/.profile
```
```bash:設定内容を反映させる
$ source ~/.profile
```

## 参考
```bash:ちなみに、デフォルトのファイルの中身を確認すると...
$ less /etc/skel/.profile 
```

```bash:出力結果はこうなっていた
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"
```

# 結果
色づいた。

<img width="682" alt="Screen Shot 2019-01-24 at 1.28.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/292215/0a7ce848-a8a0-bfc7-fec5-399430837e2e.png">
メモ帳からコピペすることでExcelに入力できる

#補足
このページからコピペした場合はタブがスペースになっています。
そこで、スペースをタブに変える方法を使います。

#結合セルはエラーになる
結合セルは人類の敵です。
コピペするときは結合しないセルが前提です。
なぜか一つのセルとして扱います。

#改行で縦の列ができる

A
B
C

とメモ帳に入力します。これを全部選択しコピーし、エクセルに貼り付けます。

#タブで横の行ができる
1,000 2,000 3,000
これを貼り付けると横の行になります。

#縦と横と式

```
Person a b total
A 1,000 2,000 3,000
B 1,000 2,000 3,000
C 1,000 2,000 3,000
Total "" "" =SUM(D2:D4)
```

空白の部分は空白ではありません。Tabで区切られています。
メモ帳に開き、貼り付けます。
そしてエクセルを開き、メモ帳のテキストをすべて選択し、コピーし、Excelに戻ってA1を選択して貼ると計算式まで入ります。
###コピーして
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/703e3dfa-5ed8-5b18-32d0-57a7ee8bf471.png)
###メモ帳にペースト
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/fa5508f6-4760-3bb2-b32b-3e2c2db0a51d.png)
###タブを一つ打ちます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/d3f6cb09-1b26-093c-547f-c2dee76e57c0.png)
###タブをコピーしてHOMEキーを打ちます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/50d7912c-3b7b-03c8-ce9e-ce20927db77c.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/0390a627-6967-992c-0242-cd8dedd3fafc.png)

###CTRL+Hで置換を呼び出します
そして検索する文字列に半角のスペース、そして置換後の文字列にCTRL+Vタブを貼り付けます
そのあと、すべて置換をクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/fd79ee9f-f757-e305-389b-97ad89ad267e.png)
###最後に冒頭のタブを削除
これで空白はすべてタブになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/b62c5498-802e-42c5-ad52-5df702584043.png)
そこで冒頭のタブを選択し、削除します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/62f86926-49ee-919b-8057-a2a51fd2c4c7.png)
###完成!
これで出来上がりです。すべて選択してエクセルに貼り付けられます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/0e1816a5-2c69-e0f0-1106-c35b69d1892b.png)
##Excelに貼り付け
###すべて選択してコピー Ctrl+A Ctrl+C
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/a26474e1-a278-78e9-be0e-f277ce8147e9.png)
###ExcelのA１を選択して
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/6a60cc62-6007-8e31-97a7-cb1f42ac9687.png)

###右クリックかCtrl+Vで貼り付けて出来上がり
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126919/ba11e027-e3fd-f3ed-316c-d86a5a5707a4.png)



```
Total "" "" =SUM(D2:D4)
```

この

```
 "" ""
```
は本当は不要ですが、タブはわかりくいので目印としてダブルクォーテーション二回、つまり vbNullStringが入っているのです。

CSVファイルなのでコンマで区切られるような気もしますが、コンマはうまくいきません。
その代わりこのように金額をコンマ付きで書いてあっても、そのまま入力されます。


#コンマで区切られていたら?
その時は保存して、拡張子をcsvにして開きます。
ただし、縦横要素数が同じでないとおかしくなります。
robotframework + seleniumlibrary で空白文字を扱う

#モチベーション
robotframework + seleniumlibrary で空白を含む文字をtextboxに入力するテストを作るのに苦労したので、得た知見を残しておく。

#環境や前提条件
windows10
PowerShell
python3.7
robotframework3.1.1
robotframework-seleniumlibrary 3.3.1
selenium 3.141.0
Chrome バージョン: 71.0.3578.98（Official Build） （64 ビット）
ChromeDriver 2.45

#解決したい課題
「 robotframework」「 robotframework 」など空白を含む文字列をtextboxに入力したい。作成するKeywordを「検索する」とすると、空白2つ以上をdelimitterとみなすというRFの仕様から以下のように''で囲む必要がある。

```
    検索する  ' robotframework'
    検索する  ' robotframework '
```
そのままtextboxに入れると、「' robotframework'」や「' robotframework '」となってしまうのでクォーテーションを削除する必要がある。
クォーテーションで囲む必要のない「robotframework」の場合は、以下のように記載したい。

```
    検索する  robotframework
```
上記二つを両立したい。

#手段
まず結論から、Googleで検索をする例にしてますが、以下のテストケースを作成した。

```google1.robot

*** Settings ***
Documentation     Simple example using SeleniumLibrary.
Library           SeleniumLibrary
Library           String
Suite Teardown     Close Browser

*** Variables ***
${URL}            https://google.com/
${BROWSER}        Chrome

*** Test Cases ***
Googleでいろいろ検索する
    Googleを開く
    検索する  robotframework
    検索する  'robotframework'
    検索する  ' robotframework'
    検索する  ' robotframework '
    検索する  ' robotframework 
    検索する  ' !"#$%&'()=~|`*+<>? '
    検索する  'あかさたな'

*** Keywords ***
Googleを開く
    Open Browser    ${URL}    ${BROWSER}

検索する  [Arguments]  ${val}
    ${quote}=  クォーテーション確認  ${val}
    ${string}=  Run Keyword If  ${quote}==True   先頭後尾削除  ${val}
    ...         ELSE                             Set Variable  ${val}
    Log To Console  ${string} 
    InputText      xpath=//input[@title="検索"]  ${string}
    Press Keys  None  RETURN
    Capture Page Screenshot


クォーテーション確認  [Arguments]  ${val}
    ${head}=  Get Substring  ${val}  0  1
    ${tail}=  Get Substring  ${val}  -1
    ${quote}=  Set Variable If  "${head}"=="\'" and "${tail}"=="\'"  True  False
    [Return]  ${quote}


先頭後尾削除   [Arguments]  ${val}
    # 先頭削除
    ${string}=  Get Substring  ${val}     1
    # 後尾削除
    ${string}=  Get Substring  ${string}  0  -1
    [Return]  ${string}
```

今回の課題と直接関係ないところは端折って、苦労した点を紹介する。以下の3Keywordで構成してます。もっと短く書けるとは思いますが、RFの理解のために多少冗長な構成になってます。
・目的のkeywordである「検索する」
・シングルクォーテーションで囲まれているかを判断するKeyword「クォーテーション確認」
・文字列の先頭と語尾一文字ずつを削除するKeyword「先頭後尾削除」

## Keyword:検索する
```
    ${string}=  Run Keyword If  ${quote}==True   先頭後尾削除  ${val}
    ...         ELSE                             Set Variable  ${val}
```

変数に変数を代入するのに

```
    ${string}=${val}
```
みないたことはできず、Set Variableを使う必要がある（面倒。。。）
Run Keyword IfのELSEは大文字。

## Keyword:クォーテーション確認
SubSringの使い方1：先頭文字抽出

```
    ${head}=  Get Substring  ${val}  0  1
```
SubSringの使い方2：後尾文字抽出

```
    ${tail}=  Get Substring  ${val}  -1
```

Set Variable Ifでは文字列変数を""で囲む。
変数と「'」を比較したいので、「"\'" 」

```
    ${quote}=  Set Variable If  "${head}"=="\'" and "${tail}"=="\'"  True  False
```

## Keyword:先頭後尾削除
SubSringの使い方3：先頭文字削除(先頭から1文字以降を抽出)

```
    ${string}=  Get Substring  ${val}     1
```
SubSringの使い方4：後尾文字削除(先頭から0文字～後尾から1文字を抽出)

```
    ${string}=  Get Substring  ${string}  0  -1
```
JavaScriptでのオブジェクトをループで回して処理

### 経緯
普段は、サーバーサイドの開発を行い、PHPではオブジェクトや配列をループで回したい時に、とりあえず、foreachで回すようにしています。
JavaScriptでの開発する機会があり、同様の場面があり、JavaScriptでも,PHPで使うforeachに類似したものがあるだろうと思い、調べたところforEachというものがありました。調べたとおりに、forEachを使ったところエラーが発生しました。原因としては、forEachが使えるのは配列のみらしいので、別の方法を探すことにしました。

### For inというものを使う
``` javascript
for(let key in obj) {
  console.log(obj[key]);
}
```

###　まとめ
他にも、オブジェクトをループで回す方法があるそうですが、今回はこちらを使うことによって解決としました。
【Perl】ハッシュの基礎知識

# はじめに
Perlハッシュについて学習した基礎的内容を記載する。

# 宣言
```Perl
my %dora;
```

# キーと値の代入
## 一括
```Perl
my %dora = ("nobi" => "nobita", "minamoto" => "shizuka");
```
## 個別
```Perl
$dora{"honekawa"} = "suneo";
$dora{"gouda"} = "takeshi";
```

# キーの取得（出力結果は代入順とは異なる（無関係））
```Perl
@arr = keys %dora;
print "@arr\n";
```

# 値の取得（出力結果は代入順とは異なる（無関係））
```Perl
@arr = values %dora;
print "@arr\n";
```

# キーと値の取得(まとめて)
```Perl
while (my ($key, $value) = each(%dora)) {
	print "$key:$value\n";
}
```
```Perl
for my $key (keys %dora) {
	print "$key:$dora{key}\n"
}
```
>実行結果  
nobi:nobita  
minamoto:shizuka

# 値の取得(個別)
```Perl
print "$dora{nobi}\n";
	print "$key:$value\n";
}
```
>実行結果  
nobita

# キーのソート
```Perl
for my $key (sort keys %dora) {
	my $value = $dora{$key}
	print "$key:$value\n";
}
```

# キーと値の削除
```Perl
delete $dora{"nobi"}
```

# おわりに
記載間違い等ありましたらコメント頂けると幸いです。
メール受信時にコマンドを実行する

- 呼び出すスクリプトを用意

```
# vi /tmp/a.pl
#!/usr/bin/perl
use strict;
use warnings;

open my $fh, ">>/tmp/a.txt";
while(my $line = <STDIN>) {
        chomp $line;
        print $fh "$line\n";
}
close $fh;
# chmod +x /tmp/a.pl
```

- `/etc/aliases`に対象アカウントを記載（このアカウントは存在していなくてよい）

```
# vi /etc/aliases
tester:         "|/tmp/a.pl"
# newaliases
```

- メールを送信

```
$ echo "test" | mail -s "title" -S "smtp=smtp://localhost:25" -r from@example.com tester@`hostname`
```

- スクリプトが実行される

```
# cat /tmp/a.txt
Subject: title
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

test
```



[メール受信で自動的にスクリプトを実行する \| 情シスハック](http://success.tracpath.com/blog/2009/08/07/%E3%83%A1%E3%83%BC%E3%83%AB%E5%8F%97%E4%BF%A1%E3%81%A7%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B/)

[設定ファイル:/etc/aliases: UNIX/Linuxの部屋](http://x68000.q-e-d.net/~68user/unix/pickup?%2Fetc%2Faliases)
丸紅の広告「丸は丸、とがった丸など存在しない」に対する位相空間論的な回答

丸紅の広告にこうあって、ふと思い出した。マンハッタン距離上の円なら、とがって見えるなぁと。

> 「丸は丸、とがった丸など存在しない」そんな既成概念を覆せ。
> さぁ世界がみたことのない答え、○を見せようじゃないか。

[マンハッタン距離](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%B3%E3%83%8F%E3%83%83%E3%82%BF%E3%83%B3%E8%B7%9D%E9%9B%A2)とは、ビル街のような縦横に走る道路のような空間で考えることのできる距離だ。

まずは、ユークリッド距離は $d1(\mathbf{A},\mathbf{B})= \sqrt{(A_x-B_y)^2+(A_y-B_y)^2}$ となる。

![metric_space_01_600x484.jpg](https://qiita-image-store.s3.amazonaws.com/0/326797/ac28e750-8884-7c96-c03a-a87ad68eeede.jpeg)

そして、ユークリッド空間で、同じ距離で上の点の集まりが円だとすると、同じものはマンハッタン距離上では四角になる。マンハッタン距離は $d2(\mathbf{A},\mathbf{B})= |A_x-B_x| + |A_y-B_y|$ で表される。原点(0,0)との距離だと思えば、$d2(\mathbf{A}=(A_x,A_y),(0,0))= |A_x| + |A_y|$ となる。x軸とy軸の絶対値を足すだけの簡単なもの。

![metric_space_02_600x626.jpg](https://qiita-image-store.s3.amazonaws.com/0/326797/ff887786-ed34-9a25-5646-e364ae69473a.jpeg)

もう少し言うと、マンハッタン距離が成立する空間が、縦横としか点と点の繋がりを考えられないとすると、つまり、斜めには繋がっていなくて移動できないとすると、この縦横しか移動できない空間上に、ユークリッド空間で言う円は存在できないという事にもなる。

円というと、一周回って戻ってこれるという特徴があるが、この空間ではそれがとがった四角ということである。

ともあれ、とがった○が存在する空間とは、あまり自由のない空間なのでした。
自由な発想は不自由？
Chain of ResponsibilityパターンのScalaによる実装サンプル

JJUGナイトセミナーで紹介されていた（私は出席してないので伝聞） `Chain of Responsibility` をJavaのラムダとSteram APIで実装する [サンプル](https://github.com/mariofusco/from-gof-to-lambda/tree/master/src/main/java/org/mfusco/fromgoftolambda/examples/chainofresponsibility) を見て思ったのは、Javaだとやっぱり記述が冗長になってしまうなーという点。

ということで、上記サンプルと同じことをScalaでやってみた。

まずはFileクラスの定義：

```File.scala
sealed abstract class File(val content: String)
case class Text(c: String) extends File(c)
case class Presentation(c: String) extends File(c)
case class Audio(c: String) extends File(c)
case class Video(c: String) extends File(c)
```

CoRを構成する個々のハンドラを表すトレイト：
`-->` メソッドは、自分が処理できない場合に次のハンドラに処理を委譲する、合成された `Handler` を生成するもの。

```Handler.scala
trait Handler {
  def handle(file: File): Option[String]

  def -->(next: Handler): Handler = file => {
    val result = this.handle(file)
    result match {
      case Some(s) => Some(s)
      case None => next.handle(file)
    }
  }
}
```

使用例：
CoRを `h1 --> h2 --> h3 --> h4` と視覚的に表現できるのがうれしい。

```ChainOfRespTest.scala
import org.scalatest._
import org.scalatest.Matchers._

class ChainOfRespTest extends FunSuite with Matchers {

    test("Chain of Responsibility works fine") {
      val h1: Handler = _ match {
        case Text(c) => Some("Text file: " + c)
        case _ => None
      }
      val h2: Handler = _ match {
        case Presentation(c) => Some("Presentation file: " + c)
        case _ => None
      }
      val h3: Handler = _ match {
        case Audio(c) => Some("Audio file: " + c)
        case _ => None
      }
      val h4: Handler = _ match {
        case Video(c) => Some("Video file: " + c)
        case _ => None
      }
      val result = h1 --> h2 --> h3 --> h4 handle Audio("Blackout")

      result should be (Some("Audio file: Blackout"))
    }
}
```
今日の作業記録 python error(81)（言語処理100本ノック:81）解決

言語処理100本ノック 2015
# 81. 
複合語からなる国名への対処
http://www.cl.ecei.tohoku.ac.jp/nlp100/
「英語では，複数の語の連接が意味を成すことがある．例えば，アメリカ合衆国は"United States"，イギリスは"United Kingdom"と表現されるが，"United"や"States"，"Kingdom"という単語だけでは，指し示している概念・実体が曖昧である．そこで，コーパス中に含まれる複合語を認識し，複合語を1語として扱うことで，複合語の意味を推定したい．しかしながら，複合語を正確に認定するのは大変むずかしいので，ここでは複合語からなる国名を認定したい．

インターネット上から国名リストを各自で入手し，80のコーパス中に出現する複合語の国名に関して，スペースをアンダーバーに置換せよ．例えば，"United States"は"United_States"，"Isle of Man"は"Isle_of_Man"になるはずである．」

素人の言語処理100本ノック:81
https://qiita.com/segavvy/items/216888c3549cea3d8e81

```
# ./p81.py
Traceback (most recent call last):
  File "./p81.py", line 10, in <module>
    with open(fname_countries, 'rt') as data_file:
FileNotFoundError: [Errno 2] No such file or directory: 'countries.txt'
```

```
# vi countries.txt
 :wq
# ./p81.py
# ls -al
total 1655536
drwxr-xr-x 1 root root      4096 Jan 23 15:18 .
drwxr-xr-x 1 root root      4096 Jan 20 02:13 ..
-rw-r--r-- 1 root root 725635680 Jan 23 15:02 corpus80.txt
-rw-r--r-- 1 root root 725635468 Jan 23 15:20 corpus81.txt
-rw-r--r-- 1 root root         0 Jan 23 15:18 countries.txt
-rw-r--r-- 1 root root 221903910 Feb  8  2015 enwiki-20150112-400-r10-105752.txt.bz2
-rw-r--r-- 1 root root  22022468 Mar 11  2015 enwiki-20150112-400-r100-10576.txt.bz2
```

# 解決
# Reference
Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

C++ Support(0)　
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514

Coding Rules(0) C Secure , MISRA and so on
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0

Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
### 文書履歴(document history)
ver. 0.01 初稿 20190124
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
MailHogでテスト用メールサーバーを立てる


![image.png](https://qiita-image-store.s3.amazonaws.com/0/330873/0ec9922f-34ca-9271-e249-1846f5b30662.png)



```yml:docker-compose.yml
version: "3"
services:
  mail:
    image: mailhog/mailhog:latest
    ports:
      - "8025:8025"
      - "1025:1025"
```

- 上記docker-compose.ymlを作成して起動するだけ。

```
$ vi docker-compose.yml
$ docker-compose up
Recreating mail_mail_1_39afdc4c7660 ... done
Attaching to mail_mail_1_39afdc4c7660
mail_1_39afdc4c7660 | [HTTP] Binding to address: 0.0.0.0:8025
mail_1_39afdc4c7660 | Creating API v1 with WebPath:
mail_1_39afdc4c7660 | Creating API v2 with WebPath:
mail_1_39afdc4c7660 | 2019/01/23 14:58:28 Using in-memory storage
mail_1_39afdc4c7660 | 2019/01/23 14:58:28 [SMTP] Binding to address: 0.0.0.0:1025
mail_1_39afdc4c7660 | 2019/01/23 14:58:28 Serving under http://0.0.0.0:8025/
```

- あとはメールを投げればUIから確認可能

```
$ echo "test" | mail -s "title" -S "smtp=smtp://localhost:1025" -r from@example.com to@example.com
```

# 参考

[mailhog/MailHog: Web and API based SMTP testing](https://github.com/mailhog/MailHog)

[mailhog/mailhog \- Docker Hub](https://hub.docker.com/r/mailhog/mailhog)

[雑に用意するWindowsでのDockerを利用したLaravel開発環境 \- Qiita](https://qiita.com/fagai/items/6dfe78dad897a151acc2)

[LaravelでMailHogを導入して快適にメール開発をしよう！【Docker】 \| WINDII](https://windii.jp/laravel/laravel-mailhog-docker-compose)

[ローカルでのテストに使えるメールサーバー、MailHogを試す \- CLOVER🍀](https://kazuhira-r.hatenablog.com/entry/2018/12/05/004126)

[mailコマンドでSMTPサーバを指定してメール送信する方法 \| ぴぐろぐ](https://pig-log.com/mail-smtp-linux/)