OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby】配列の要素を集計してハッシュにする

# 配列内の重複要素を集計してハッシュにまとめる
## シェルのuniq -cみたいな機能をrubyでもやりたい
文章の中に同じ単語がそれぞれ何回づつ出てくるのか調べたいな、と思った時、便利なので私はいつもシェル芸を使いがちなのですが、プログラムの中でこういう機能を実現したいときいちいち外部プログラムを呼び出してやるのはあまりエレガントとはいえないので、Rubyで要素の集計を行なうにはどうしたらいいか考え、コードを書いてみました。

### コード例
```ruby:uniq_count.rb
#!/usr/bin/ruby

arr = ["yamada", "yamada", "tanaka", "tanaka", "tanaka", "suzuki", "yasuda", "yasuda"]

arr = arr.sort
arr_words = arr.uniq

hsh = Hash.new
arr_words.each do |word|
        count = arr.rindex(word) - arr.index(word) + 1
        hsh.store(word, count)
end

# puts hsh => {"suzuki"=>1, "tanaka"=>3, "yamada"=>2, "yasuda"=>2}
```


## 使うのは、Array.indexとArray.rindex
配列に対するindex( *obj* )メソッドは、その配列中に*obj*と同じ要素があるか調べるもので、その配列中で*obj*が初めて出てくる場所の位置情報を教えてくれます。たとえば、

```ruby:sample_1.rb
arr = ["apple", "melon", "banana", "grape", "apple", "banana"]
puts arr.index("apple")
# => 0
puts arr.index("banana")
# => 2
```

となります。一方、rindex( *obj* )メソッドは、indexメソッドとは逆で、その配列中で*obj*が出てくる最後の位置を教えてくれます。つまり、

```ruby:sample_2.rb
arr = ["apple", "melon", "banana", "grape", "apple", "banana"]
puts arr.rindex("apple")
# => 4
puts arr.rindex("banana")
# => 5
```

となります。

## arr.rindex(*obj*) - arr.index(*obj*)
ところでシェル芸をつかって要素の集計をするときには、`uniq -c`だけではなくて、`sort | uniq -c`のようにsortコマンドと組み合わせて使うことが多いです。これと同じように考えて、配列の要素を集計するにはまずその配列にソートをかけたらいいんじゃないかと思いました。

```ruby:sample_3.rb
arr = arr.sort
#puts arr => ["apple", "apple", "banana", "banana", "grape", "melon"]
```

このように要素を整列させると、
`arr.rindex(obj) - arr.index(obj) + 1`
という関係を使って各要素の個数が調べられることがわかります。
説明するよりやってみたほうが早いので、実際にやってみると、

```ruby:sample_4.rb
arr = ["apple", "apple", "banana", "banana", "grape", "melon"]

puts arr.rindex("apple") - arr.index("apple") + 1
# (1 - 0 + 1) => 2
puts arr.rindex("banana") - arr.index("banana") + 1
# (3 - 2 + 1) => 2
puts arr.rindex("grape") - arr.index("grape") + 1
# (4 - 4 + 1) => 1
puts arr.rindex("melon") -arr.index("melon") + 1
# (5 - 5 + 1) => 1
```

のようになり、確かに各要素の個数をちゃんと数えることができていることがわかります。

## 集計結果を再利用できるようにハッシュ化する
集計結果をこのあと利用しやすいように、要素の名前とその数を紐つけて管理しておくと便利です。そこで、ハッシュを作成します。
ハッシュを作成するにあたっては、さっきのコードのように一つ一つの要素ごとに式を書いていたら非効率ですし、正確性にも欠けるので、配列`arr.uniq`にeachメソッドを使ってループを回します。
また、ハッシュにキーとオブジェクトを登録する際にはHash.store(*key*,*obj*)メソッドを活用するといいでしょう。

```ruby:sample_5.rb
arr_elements = arr.uniq
# => ["apple", "banana", "grape", "melon"]

hsh = Hash.new
arr_elements.each do |word|
        count = arr.rindex(word) - arr.index(word) + 1
        hsh.store(word, count)
end
# => {"apple"=>2, "banana"=>2, "grape"=>1, "melon"=>1}

```
Android ViewModelにおける文字リソースの扱い方に関する提案

[ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel?gclid=EAIaIQobChMIrJSTg7Tg3wIVjKmWCh073wCrEAAYASAAEgLo8_D_BwE)における文字リソースの扱いと改めて向き合ってみる中で、幾つかネット上で選択肢が見つかったものの、どれもしっくりこなかったので自分なりに解決策を考えてみました。

## 見つけた方法たち
### AndroidViewModelを使う
```kotlin
class MainViewModel(application: Application) : AndroidViewModel(application) {
    val text: LiveData<String> = Transformations.map(this.name) { name ->
        this.getApplication<Application>().getString(R.string.hello, name)
    }
}
```
今まではこの方法でやっていました。
しかしこの方法だと、application contextなので、例えばユーザーが言語設定を変更したとき、再起動するまで反映されません[[1]](https://www.reddit.com/r/androiddev/comments/7rinro/android_arch_mvvm_where_to_formattransform/dsxmycm)。
そういうものだと思えばそれでも良いかもしれませんが、できればactivity contextを適用してあげたい。

### StringProvider
```kotlin
class StringProvider(val context: Context) {
    fun getString(resId: Int, vararg formatArgs: Any) = this.context.getString(resId, formatArgs)
}

class MainViewModel(stringProvider: StringProvider) : ViewModel() {
    val text: LiveData<String> = Transformations.map(this.name) { name ->
        this.getApplication<Application>().getString(R.string.hello, name)
    }
}
```
この方法を採用している人も見かけました[[2]](https://www.reddit.com/r/androiddev/comments/7rinro/android_arch_mvvm_where_to_formattransform/dsx57uo)。
ViewModelの直接的なcontext依存がなくなり、テストの書きやすさは向上しそうですが、StringProviderに対してactivity contextで依存解決するのは少々手間がかかります。Application contextを適用すれば、「[AndroidViewModelを使う](#AndroidViewModelを使う)」と同様の問題が生じます。

### XMLで変換する
```xml
android:text="@{@string/hello(viewModel.name)}"
```
ViewModelではgetStringの変数（ここでは`name`）だけを持たせておき、XML側で文字リソース指定するやり方もあります[[3]](https://github.com/googlesamples/android-sunflower/issues/132#issuecomment-409508336)。
これなら、「[AndroidViewModelを使う](#AndroidViewModelを使う)」のapplication context問題は回避できます。
ただ、条件によって文字リソースを切り替えたい場合、この方法では分岐をViewModel内で完結させられません。

## 提案
「[StringProvider](#StringProvider)」の流れを反転し、「[XMLで変換する](#XMLで変換する)」を掛け合わせるイメージです。

```kotlin
internal interface StringResource {
    fun apply(context: Context): String

    companion object {
        fun from(@StringRes resId: Int, vararg formatArgs: Any) = object : StringResource {
            override fun apply(context: Context) = context.getString(resId, formatArgs)
        }
    }
}

class MainViewModel : ViewModel() {
    val text: LiveData<StringResource> = Transformations.map(this.name) { name ->
        StringResource.from(R.string.hello, name)
    }
}
```
```xml
android:text="@{viewModel.text.apply(context)}"
```
StringResource生成時にresIdと変数を渡しておき、xmlでcontextを適用しています。
改善余地はありそうですが、雰囲気良さげなんじゃないかと。

## 参考URL
1. https://www.reddit.com/r/androiddev/comments/7rinro/android_arch_mvvm_where_to_formattransform/dsxmycm
2. https://www.reddit.com/r/androiddev/comments/7rinro/android_arch_mvvm_where_to_formattransform/dsx57uo
2. https://github.com/googlesamples/android-sunflower/issues/132#issuecomment-409508336
無料で無制限にプライベートリポジトリが持てる。そう、GitHubならね。

# GitHubでプライベートリポジトリが作れる
1月7日からGitHubで無料ユーザでもプライベートリポジトリが作れるようになった。
言うまでもないが、いままでは無料ユーザではパブリックリポジトリしかつくれなかった。
だから、プライベートリポジトリが必要な時にはBitbucketとかを使う必要があった。
しかし、GitHubでも作れるようになったからGitHubだけで大丈夫だねって話。

料金とかの詳細は[こちら](https://github.com/pricing)

# Pro(旧Developer)との比較
料金プランの名前がDeveloperからProに変更された。

### Free
無制限の公開リポジトリ
無制限のプライベートリポジトリ
プライベートリポジトリは3人までの共同編集者OK
Issues と bug trackingが使える
プロジェクト管理ができる

### Pro
無制限の公開リポジトリ
無制限のプライベートリポジトリ
無制限の共同編集者
Issues と bug trackingが使える
プロジェクト管理ができる
高度なコードレビューツール

FreeとProの大きな違いはプライベートリポジトリの共同編集者の人数制限とコードレビューツールだけになった。
これだけの差しかないのはProを使ってる人からみるとどうなんだろうね。
Pro(旧Developer)のプライベートリポジトリが持てるのは大きな強みだったように感じる。

# まとめ
GitHubが無料ユーザでも無制限にプライベートリポジトリを持てるようにしてくれたよ。
Microsoftに買収された影響でそうゆうことをしてるのかな？
全然知らないけどね。

まぁ、私はこれからもBitbucketを使っていくよ！！！
jupyter notebook like な javascript online editor / Observable を試してみた。

# どういったものか
jupyter notebook のように、特定の行までを実行し状態を持っておくことが出来るので、重い処理をあらかじめ実行しておくことで、その先の処理のみにマシンパワーを集中させることが出来ます。

セルコーディングと言われているみたいですね。

トライ＆エラーでコードをガシガシ書きたい人に打ってつけのツールです。

本家サイト - https://beta.observablehq.com
Five-Minute Introduction - https://beta.observablehq.com/@mbostock/five-minute-introduction

# ツール一覧

Observable 製の 個人的に好きなツールです。

* Package Dependencies - https://beta.observablehq.com/@mbostock/package-dependencies
    * npm module 名を入力すると、その依存ツール一覧が描画されます。
* Visualise Tensorflow.js Model Topology - https://beta.observablehq.com/@aman-tiwari/visualise-tensorflow-js-model-topology
    * tensorflow.js 向けモデルのURLを入力すると、そのグラフが描画されます。


# 各種リンク

Observable を始めるにあたって、見ておくと便利そうなリンクを張っておきます。

* Tutorial - https://beta.observablehq.com/collection/@observablehq/tutorial
    * ページ右下の?ボタンからこのページに飛べます。簡単なツール作成の紹介がされています。
* Inputs - https://beta.observablehq.com/@jashkenas/inputs
    * Observable では他の作者さんの部品をimportすることが出来ます。便利な入力フォームで、作成者はJashkenasさん！僕が尊敬するエンジニアの一人です！


# どういったものに使えるか

ざっくり以下のケースで有用そうです。

* マークダウンを利用しての対話性のあるドキュメント作成
* 簡単なインタラクションを持つWebツール作成
* 重い処理を伴うもの、機械学習など

自分はまずはシンプルにtensorflow.jsを動かしてみました。
https://beta.observablehq.com/@ampcpmgp/tensorflow-js-fit-sample

jsのリロードが無い分ほんと快適です。

# おわりに

お試しあれ！
ndenvでバージョンがうまく設定されない場合の解決方法


## 概要

## brewでnodeが入っていればアンインストールする

おそらくはだいたいこれで直る。

```:brewでインストールされているものの確認
brew list
```

```:nodeをアンインストール
brew uninstall node
```

## ndenvのPATHがなければシェルに記述し再起動

anyenvからインストールすると忘れがち。

.bash_profileなり.zshrcなりに記述する。

```:PATHの設定
export PATH="$HOME/.ndenv/bin:$PATH"
eval "$(ndenv init -)"
```

```:設定を反映しシェルを再起動
exec $SHELL -l
```
コンテナ全削除とコンテナイメージ全削除するdockerコマンドのメモ


# コンテナ全削除(稼働中コンテナ含む)
上が新体系のコマンド、下が旧体系のコマンドで、動作は変わらない。

```
docker container ls -aq | xargs docker container rm -f
docker ps -aq | xargs docker rm -f
```

# コンテナイメージ全削除(↑から続けてやれば全部消える)
同じく、上が新体系のコマンド、下が旧体系のコマンドで、動作は変わらない。
現在起動中のコンテナのもとになったコンテナイメージは削除できない。

```
docker image ls -aq | xargs docker image rm -f
docker images -aq | xargs docker rmi -f
```

# 備考

* ``xargs``使ってるのでwindowsで打つ場合はWSLに切り替えてから発行する
* ``docker for windows``の場合はlinuxコンテナモードとwindowsコンテナモードを使い分けできるが、
  * linuxコンテナモードで作業してもwindows側のリソースは消えない
  * windowsコンテナモードで作業してもlinux側のリソースは消えない
     * 別モードのコンテナやコンテナイメージは``ls``や``ps``で見えないようになっているので。
0.9999999は1ではない

# 0.9999999の恐怖
主にUnityについてのお話
バージョンは2017.4.1

## 0.9999999について
Unityでプロパティにアクセスした時やインスペクタで時々出てくる

### 0.9999999 == 1なのか？
結論から言うと**1ではない**
**0.9999999… == 1**であり**0.9999999 != 1**である

## 実例
UnityのスクロールビューのNormalizedPosition(スクロール位置)が1以上、つまり最大になったか判定をしようとした

```c#
if([ScrollRect].horizontalNormalizedPosition >= 1)
{
//何か処理
}
```
スクロールが1で止まる時と0.9999999で止まる時があった

## まとめ
Unity的には0.9999999は1と認識している？
プログラム的には間違っているので、floatの判定をする時は気をつけたいところ
Storybookでプレビューに任意のCSSファイルを読みこませる3つの方法

Storybookのプレビューはiframeになっていて、ストーリーで設定したコンポーネントが表示されます。
Storybookは実際のサイト上での開発ではないが、CSSが同じものをベースに作らないと表示崩れを起こすので、ベースCSSを任意のものに変えることはスタイルを設定する上で非常に重要です。
StorybookでCSSを読みこますことに関して、日本語でドキュメントが少なく（もしかしたら検索スキルの問題なのか）、やっとのこと3つ方法を発見したので共有します。

![img_preview.png](https://qiita-image-store.s3.amazonaws.com/0/177417/06a42332-99fd-93f7-b2ea-658004609361.png)

### 方法1：外部のCSSファイルを読み込む

「.storybook」ディレクトリに「preview-head.html」を作成し、下記のようにlinkを記述する。

```
<link rel="stylesheet" href="http://sample.com/base.css">
```

後はstorybook起動するだけ！

### 方法2：その開発環境に配置したCSSファイルを読み込む

ベースにしたいCSSを配置（例：/static/css/base.css）

package.jsonにStorybookを立ち上げるときに、静的ファイルを参照できるようにsオプションでCSS配置したディレクトリを指定 

```
  "scripts": {
    "start-storybook": "start-storybook -s ./static"
  }
```

「.storybook」ディレクトリに「preview-head.html」を作成し、下記のようにlinkを記述する。
このHTMLが、プレビューのhead内に記述される。

```
<link rel="stylesheet" href="css/base.css">
※2で指定したstaticディレクトリが起点になるため、css/base.cssでOK
```

後はstorybook起動するだけ！

### 方法3：JavaScriptで読み込む（外部パッケージのCSSファイルなどの利用に）

style-loaderとcss-loaderをインストールします。
style-loaderは、style要素が作り、head内に差し込み、css-loaderは、JavaScriptからrequireするのに必要です。


```
npm i -D style-loader css-loader
```

「.storybook/webpack.config.js」のcssにloader設定に「'style-loader'」と「'css-loader'」を設定します。

```
    {
      test  : /\.css$/,
      loader : ['style-loader', 'css-loader'],
    },
```

「.storybook/config.js」にCSSをimportする

```
import 'sample-package/base.css';
```

後はstorybook起動するだけ！

## 参考文献

* [Add Custom Head Tags](https://storybook.js.org/configurations/add-custom-head-tags/)
* [2-via-a-directory　Serving Static Files](https://storybook.js.org/configurations/serving-static-files/#2-via-a-directory)
上場会社一覧を取得して有報キャッチャーのatomを閲覧するまわり（XBRL取得の準備など）

```python:qiita.py

#事前処理
#!pip list
!pip install -q xlrd
###############################################

from google.colab import files

import google.colab
import googleapiclient.discovery
import googleapiclient.http

import os
#import datetime
import requests
from bs4 import BeautifulSoup
import time

import pandas as pd


def fn_fuga(sic):
    
    ### 有報キャッチャーの閲覧 ###
    start = time.time()
    print(sic)
    
    url = 'http://resource.ufocatch.com/atom/edinet/query/'+str(sic) + '0' 
    r = requests.get(url)

    soup = BeautifulSoup( r.text,'html.parser')
    tbl = soup.find_all("entry")

    if len(tbl) > 0:print("処理を開始します")
    ## 本処理：XBRLをダウンロードしてファイルをパースして値を取得 [後編に続く] ##    

    time.sleep(3)
    e_time = time.time() - start
    print ("endpoint_time:{0}".format(e_time) + "[sec]")
    

def fn_hoge(sc):
    
    ### 取得銘柄リストの生成###
    
    #JPXの東証上場一覧のページへのアクセス
    url= 'https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls'
    os.system('wget '+ str(url)+' -O data_j.xls -a wget-log')
    
    ## pandasでexcelファイルの読み込みとdf整形など
    df = pd.read_excel( "data_j.xls" ) 
    df.columns = ['date','code','name','lst','sectorCode','sectorName', 'flr1', 'flr2', 'flr3', 'flr4']
    drop_col = ['flr1', 'flr2', 'flr3', 'flr4'] 
    df = df.drop(drop_col , axis=1) 
    df = df[df['sectorCode'] !='-']
    df = df[df['lst'] !='PRO Market']

    ec = sc+100
    df = df[df['code'] >=sc]
    df = df[df['code'] <=ec]
    lst = [i for i in df['code']]
    print( lst )
    x =[fn_fuga(sic) for sic in lst]
    print(len(lst))
# main
if __name__ == '__main__':

    total_star = time.time()
    
    sc = 1301
    if len(str(sc))==4:fn_hoge(sc)

    elapsed_time = time.time() - total_star
    print ("total_time:{0}".format(elapsed_time) + "[sec]")
  
```

　有価証券報告書のXBRLファイルを取得してパースしたい場合は、有報キャッチャーにて取得可能です。(他のサイトだと、日経電子版の各銘柄ページのリリース状況にEDINET提出書類としてpdfとXBRLファイルが置いてあります)

　有報キャッチャーのatomのURLで、企業コード（=証券コード+'0'の５桁のコード)を指定してあげると、該当銘柄の提出書類のXBRLやpdfのURL一覧が閲覧可能。例えば1301極洋の提出書類を閲覧したい場合は、「13010」で閲覧可能。

　仮に存在しない証券コード(例えば13020など)を指定してatomのURLを実行しても、スカスカの結果が変えるだけ、entryタグが存在しないなので、普通に1301から9999までrange(1301,9999)でforループを実行しても問題ないかと思うけれど、存在しないコードをわざわざ検索しにいくのも無駄といえば無駄なので、上記スクリプトでは最初に東証HPにて公開されている月次の上場会社一覧エクセルファイルをwgetで取得して、pandasでread_excel()でdfを生成した上で、ループ処理で有報キャッチャーatom_URLを閲覧しにいっています。

　なお東証HPにて公開されている月次の上場会社一覧エクセルファイルは、J-REITやETF、インフラファンドなども含まれているので、上記ではSectorCode='-'でそれら銘柄を除外し、なおかつPROマーケット銘柄も市場名で判定して除外しております。
memcached_exporter導入メモ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/f6d55ae0-7f8c-e06a-8d20-1dde7c0340f3.png)

Prometheusのmemcacheノード側エージェント、「memcached_exporter」を導入したのでメモ

# memcached_exporter
* prometheusでmemcachedの様子を見ることができる
* githubからmemcached_exporterをwgetでダウンロード
* 面倒なので/homeにダウンロードして配置
* ちゃんとしたい場合は/usr/local/binなどに配置したりシンボリックリンクしたり
* memcached_exporterは9150をLISTENするよう
* ファイアウォールも9150を空けておく

## memcached_exporter側

```
$ wget https://github.com/prometheus/memcached_exporter/releases/download/v0.5.0/memcached_exporter-0.5.0.linux-amd64.tar.gz
$ tar xvfz memcached_exporter-*.tar.gz
$ mv memcached_exporter-0.5.0.linux-amd64 memcached_exporter
$ rm -f memcached_exporter-0.5.0.linux-amd64.tar.gz
$ cd memcached_exporter
$ ./memcached_exporter &
$ sudo lsof -i:9150
COMMAND     PID    USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
memcached 16494 appuser    3u  IPv6 3077568297      0t0  TCP *:9150 (LISTEN)
```

# prometheus側
* prometheusの設定は終わっているものとする

```
$ cd prometheus
$ vi prometheus.yml
          :
  - job_name: 'prd-smem-001'
    static_configs:
      - targets: ['10.45.12.152:9100']
      - targets: ['10.45.12.152:9150']　<---追加
          :
$ killall prometheus
$ ./prometheus --config.file=./prometheus.yml
```

## grafana側

* Queryに「mem…」と入力されると補完されるので入力
* 個別でQueryを書くなら「memcached_current_connections{instance="ipaddress:9150",job="hostname"}」など

![image.png](https://qiita-image-store.s3.amazonaws.com/0/57350/d3ee6adc-be73-1940-2ee5-1c2381944ed7.png)


以上！
１分おきに画像をキャプチャしてBlobに保存するやつ（Python3.7.0、OpenCV3.4.1、Azure Blob）

１分おきに画像をキャプチャしてBlobに保存するやつ。

## 開発環境
- Python 3.7.0
- OpenCV 3.4.1

## Azure Storage アカウントの作成
Azure Storage アカウントの作成方法、コンテナの作成方法は[[1]](https://qiita.com/garicchi/items/a07c32df5e3010548736)を参考にしてください。アカウント名とKeyを使用するのでメモってください。

## ソースコード
`account_name`、`account_key`にメモった名前とKeyを入れてください。

~~~python
from datetime import datetime
import cv2
from azure.storage.blob import BlockBlobService
from azure.storage.blob import ContentSettings

account_name="{insert your account}"
account_key="{insert your key}"
container_name="testcontainer"
file_path="tmp.jpg"

def upload_blob(dirname, filename):
    service = BlockBlobService(account_name=account_name,account_key=account_key)
    service.create_blob_from_path(container_name, dirname + filename, file_path, content_settings=ContentSettings(content_type="image/jpg"))

cap = cv2.VideoCapture(0)
t_ = -1
while(True):
    ret, frame = cap.read()
    d = datetime.now()
    t = d.minute
    if t_ != t:
        cv2.imwrite("tmp.jpg", frame)
        frame_ = frame.copy()
        dirname = d.strftime("%Y%m%d") + "/"
        filename = d.strftime("%Y%m%d%H%M") + ".jpg" # "%Y-%m-%d-%H-%M-%S"
        upload_blob(dirname, filename)
        print(t)
        t_ = t
    cv2.imshow("frame", frame_)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()
~~~

## 結果
1分おきに保存できていればOKです。
<img width="790" alt="test.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63863/7732bc4f-0f39-35b2-313b-a3c13a70b979.png">

## 参考文献
[1] [AzureBlobStorageをPythonから使う](https://qiita.com/garicchi/items/a07c32df5e3010548736)
AWS EC2 (t1.micro) のメモリがいっぱいの人はSwap領域を作成しよう

# AWSの脆弱サーバの余ってるHDD領域を有効活用しよう

自分の趣味でやっているwordpressのサイトのメモリがいっぱいになってmySQLがガンガン落ちて全くつながらないのでなんとかした件のまとめ。

ここではAWSのEC2 t1.microという非常に弱い＆安いサーバでの運用。

## ユーザーの切り替え

```
[ec2-user@ip-**-134-***-183 ~]$ sudo su
[root@ip-**-134-***-183 ec2-user]#
```
ec2-userでログインはするものの、rootユーザーに切り替えましょう。
接続後にIP出てたから一部伏せ字。

## メモリの容量確認

```
[root@ip-**-134-***-183 ec2-user]# grep Mem /proc/meminfo
MemTotal:         550440 kB
MemFree:           75476 kB
```

## Swapの容量確認

```
[root@ip-**-134-***-183 ec2-user]# grep Swap /proc/meminfo
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
```
## メモリの利用状況

```
[root@ip-**-134-***-183 ec2-user]# free
             total       used       free     shared    buffers     cached
Mem:        550440     543724       6716          0      14936     105952
-/+ buffers/cache:     422836     127604
Swap:            0          0          0
```
メモリのfreeなさすぎワロタｗ

## ディスクの利用状況

```
[root@ip-**-134-***-183 ec2-user]# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/xvda1            51606140  31917732  19604552  62% /
tmpfs                   275220         0    275220   0% /dev/shm
```
半分は超えてるけど、使う枠はいっぱいある。。。

## そうだ、Swap領域を作ろう

```
[root@ip-**-134-***-183 ec2-user]# fallocate -l 4G /swapfile
```
fallocate が楽だった。
`dd if=/dev/zero of=/swapfile bs=1G count=512` とかでも良いんですが、なんかオプションいくつもあってよくわからんので調べるの面倒だし、fallocateで作っちゃいました。

```
[root@ip-**-134-***-183 ec2-user]# chmod 600 /swapfile
```
rootのみが読み書き。他は除外するpermissionを設定。

```
[root@ip-**-134-***-183 ec2-user]# mkswap /swapfile
スワップ空間バージョン1を設定します、サイズ = 4194300 KiB
ラベルはありません, UUID=4ee87db1-055a-4864-99ce-c4f96665d300
```
作った。
UUIDは適当に発行されるけど今回は特に必要としてないのでどうでもよい。

```
[root@ip-**-134-***-183 ec2-user]# swapon /swapfile
[root@ip-**-134-***-183 ec2-user]# swapon -s
Filename				Type		Size	Used	Priority
/swapfile                               file		4194300	211328	-1
```
`swapon ファイル名`でswap領域をアタッチする。
`swapon -s`で状況を調べて、なにかしら表示がされるはず。　

## Swapの容量を再度確認(ちゃんと付いたかな？)

```
[root@ip-**-134-***-183 ec2-user]# grep Swap /proc/meminfo
SwapCached:         3704 kB
SwapTotal:       4194300 kB
SwapFree:        3987632 kB
```
最初の方でやったgrep Swapでもいいし、

```
[root@ip-**-134-***-183 ec2-user]# free
             total       used       free     shared    buffers     cached
Mem:        550440     426864     123576          0      20812      69872
-/+ buffers/cache:     336180     214260
Swap:      4194300     211564    3982736
```
freeなどで調べてSwapが0じゃないことを確認すればOKです。

## 余談：Swapの破棄

```
[root@ip-**-134-***-183 ec2-user]# swapoff /swapfile
[root@ip-**-134-***-183 ec2-user]# rm /swapfile
```
swapoffして削除するだけ。

## 結論
強いEC2インスタンスを用意するのがいい。
DSaaS侵入防御イベントでALBのIPアドレスが出る時の対処法

##Deep Security as a ServiceのエラーをAmazon SNSにJSONに送る
各監視サーバでエラー,warningが出た時に、Amazon SNSにJSONを送ってくれます。

Amazon SNSトピックへのイベントの転送を有効にする手順についてはこちら
[Amazon SNSでのイベントへのアクセス](https://help.deepsecurity.trendmicro.com/ja-jp/sns.html)

送られてくるJSONの説明はこちら
[JSON SNS設定](https://help.deepsecurity.trendmicro.com/ja-jp/Events-Alerts/sns-json-config.html)

### 便利だなー

### あれ？

### なんか侵入しようとしてるやついるぞ

### でもIPおかしくね？

送られてくる、 JSONのDescriptionに

```
 Reason: URI Path Length Too Long
 SourceIP: 10.0.0.0(ローカルIPじゃないか！)
 SourceMAC: 00:00:00:00:00:00
```

侵入防御してくれてるのは良いけど、どうみてもローカルのIPじゃないか・・・
ALBが悪さしてるのかと思って、AWSに問い合わせてしまったじゃないか・・・

###Trend Micro様に聞いてみた
```
当窓口で確認できているX-Forwarded-Forヘッダを侵入防御イベントに出力する設定は、下記となります。

　1.以下の侵入防御ルールが適用されている事を確認する。

　　・"1006540 - Enable X-Forwarded-For HTTP Header Logging"

　2.X-Forwarded-Forを出力させる侵入防御ルールのプロパティにて
　　以下のオプションにチェックが入っている事を確認する。

　　・[イベント] -> "常にパケットデータを含める"

 ```

面倒だが、割り当てられている `侵入防御ルール` 全てに上記を適用する必要がある。
要注意なのが設定画面のわかりづらさ。

<img width="424" alt="dsaas1.png" src="https://qiita-image-store.s3.amazonaws.com/0/164563/2820b42a-d3e8-7fbe-5dfa-484b0e327764.png">

継承してるから大丈夫なのかな？と思いきや

<img width="426" alt="Dsaas2.png" src="https://qiita-image-store.s3.amazonaws.com/0/164563/4f5252d9-b5ed-29a4-4723-c38d9ef28497.png">

継承を外して、わざわざ `常にパケットデータを含める` をONにしないとダメ！

ポリシーを変更したら、各コンピュータにポリシーの送信を忘れないようにしよう。

これでようやく悪さをしてるIPアドレスがわかるようになるよ。
Markdown記法

# はじめに
Markdownチートシートまとめ

# 参考
[Markdown-Cheatsheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)

# 基本
* スペースやタブでインデント不可
* 改行は文末に半角スペース2つ
* 空行を挿入すると段落が分割

# 見出し
`# 見出し`

`見出し`  
`==`

# h1
## h2
### h3
##### h4
###### h5
h1
==
h2
--

# テキスト装飾
`*イタリック* _イタリック_`  
`**太字** __太字__`
  
*装飾*
_装飾_  
**装飾**
__装飾__

# リスト
`1. 番号付き`  
`* 番号なし`  
上下に空白が必要

1. 番号付き
 1. 番号付き
1. 番号付き
 1. 番号付き


* 番号なし
* 番号なし
  - 番号なし
  - 番号なし
   + 番号なし
   + 番号なし

# 引用
`>`
>引用
>>引用

# テーブル
`|ヘッダー|`  
`|:------:|`  
`|値|`  
:で文字表示位置を設定

|ヘッダー|ヘッダー|ヘッダー|
|:-------|:------:|-------:|
|左寄せ  |中央寄せ|右寄せ  |

# 水平線
`---`  
`***`  
`___`

---
***
___

# チェックボックス
`- [ ]`  
`- [x]`
- [ ] チェックボックス
- [x] チェックボックス

# リンク
`[リンクテキスト](URL)`  
[Google](https://www.google.com)

## 画像
`![画像名](画像URL)`  

![googlelogo](https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png)

## コード表示
バッククォート\`\`でコードを表示  
`console.log("Hello World!");`

# シンタックスハイライト
```javascript
let i = "Hello World!";
console.log(i);
```
java mailの添付ファイル名が文字化けした際の解決策

# 現象
メール送信した際、添付したファイルのファイル名が文字化けしていました:cold_sweat:
:envelope: javax.mail '1.6.2'

## 修正前コード
```java:
import javax.mail.internet.MimeUtility;
・・・
MimeUtility.encodeWord(new File(filePath).getName(), "UTF-8", "B");
```
# 原因
エンコードされた添付ファイル名のデータの行末をみてみると`?=`ではありませんでした
行末が`?=`でないと、デコード処理をしないとのことです

JavaMailでは添付のデータをBASE64でエンコードした後に、添付ファイル名をMimeBodyPartのオブジェクトにセットするのですが、エンコードがうまくいっていないようです

# 解決:bulb: 修正後コード

```java:
MimeUtility.encodeWord(new File(filePath).getName(), "UTF-8", "B");
```
は

```java:
String fileName = new File(filePath).getName();
```
に変更し、

```java:
System.setProperty("mail.mime.encodefilename", "true");
System.setProperty("mail.mime.charset", "UTF-8");
```
Systemのプロパティを追加しました！

- `mail.mime.encodefilename`を"true"に設定すると、MimeUtilityメソッドのencodeTextを使用して、ファイル名に含まれるASCII以外の文字をエンコードします
- `mail.mime.charset`はSystemプロパティを使用して、エンコードされた単語やテキスト部分に使用されるデフォルトのMIME文字を指定します

これを設定することで添付ファイル名の文字化けを解決できました！

# 参考文献
[javax.mail.internet (Java(TM) EE 8 Specification APIs)](https://javaee.github.io/javaee-spec/javadocs/javax/mail/internet/package-summary.html)
Riot.js と Storybook （IE11で動作しなかったので、挫折＆頓挫）


write: 2019.1.9

[Storybook for Riot](https://storybook.js.org/basics/guide-riot/)を試していたが、
IE11で動作しなかったので、挫折＆頓挫


riot.compiler.jsにて以下の個所がエラーになってしまう。

```js:node_modules/riot-compiler/dist/riot.compiler.js
var S_R_SRC2 = `${S_R_SRC1.slice(0, -2)}{}])`
```


IEなんて早く無くなればいいのに


## 最初の1歩

Add @storybook/riot をやる前に、Riotが動作するWebpack環境を作っておく

手っ取り早く動作する、[riot/examples](https://github.com/riot/examples) の [examples/webpack](https://github.com/riot/examples/tree/gh-pages/webpack) を使用する。


### 

```shell
npm install
```

```
npm start
```





### Storybookを入れる

```shell
npx -p @storybook/cli sb init
```


## Storybook実行

```shell
yarn storybook
```


 以下のような画面が出ればOK。
【GAS修行①】毎朝天気を教えてくれるLINE BOTをLINE Notifyで作成

- **※2021/01/31 livedoor天気API廃止に伴い、別APIによる大幅修正。**

・GAS熟練者への道。
・先人達のコードの「写経＆コピー」の駆使の成果物のまとめ。
・第一弾

## 経緯
・「第一発目だけど、実用的なものを作りたい。」
・「今を振り返ってみて、一発目にこれ選んだ自分に浸りたい。」
・「でも簡単なものがいい。」
→そんな私にぴったりのサンプルアプリと仏様サイトを発見。
https://www.smilevision.co.jp/blog/tsukutte10/
→「これを参考（マルコピ）に作ってみるか。」
→取り組み開始。

## 概要
- 毎朝、LINEに下記の内容を通知してくれる。
    -  今日の天候（晴れ、曇りのち雨等）
    -  明日の天候（晴れ、曇りのち雨等）

## 結果
・実際の画面はこちらです。
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336499/7cafd449-5646-4f00-a066-15373310ed50.jpeg)

## 作成環境
1. Google Apps Script
2. LINE Notify
3. livedoor Weather Hacks

## 手順
-  Googleドライブからスクリプトエディタを起動。  
※Googleアカウントを持っていない人は、作成する。
    - Googleドライブを起動
    - 「新規」→　「その他」→「アプリを追加」の順にクリック。  
    - アプリ検索欄に「script」と入力して検索。  
    - 検索結果に「Google Apps Script」が表示されるので、そこの「接続」ボタンをクリック
    - 改めて「新規」→ 「その他」の順にクリックしていくと、「Google Apps Script」が表示されているので、クリック。
- 起動したプロジェクトに名前をつける  
※プロジェクト名が反映されるわけではないが、自分がわかる名前をつける。  
→保存されたら一旦置いておく。
- LINE Notifyのトークンを発行。
    - [LINE Notify](https://notify-bot.line.me/ja/)にアクセスして、自分のLINEアカウント情報でログイン。
    - ログイン後、マイページを開く。
    - マイページ内の「トークンを発行する」ボタンをクリック  
    - 「トークン名」「通知先のトークルーム」を設定する。
    - 設定後、「発行する」ボタンをクリックして、トークンを発行。
    - 発行されたトークンをコピーして、控えておく。
- LINE Notifyを設定したトークルームに招待する。
- 先程のスクリプトエディタに戻り、下記のコードをコピーして、保存。
 
```JavaScript:line-weather.gs
// 「ACCESS_TOKEN」をLINE Notifyのアクセストークンに書き換え。
const ACCESS_TOKEN= "LINEのアクセストークン";
async function weatherForecast() {
  // city_id : 471010(那覇)
  const response = await UrlFetchApp.fetch("https://weather.tsukumijima.net/api/forecast/city/471010");
  const json= await JSON.parse(response.getContentText());
  const today_info = json["forecasts"][0];
  const tomorrow_info = json["forecasts"][1];
  let strBody = `
  ${today_info["date"].replace(/-/g,"/")} ${json["location"]["city"]}
  天気: ${today_info["telop"]}
  ${tomorrow_info["date"].replace(/-/g,"/")} ${json["location"]["city"]}
  天気: ${tomorrow_info["telop"]}
  `
  sendToLine(strBody);
}
// LINE送信処理
function sendToLine(text){
  const token = ACCESS_TOKEN;
  const options =
   {
     "method"  : "post",
     "payload" : "message=" + text,
     "headers" : {"Authorization" : "Bearer "+ token}
   };
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
```
 ※以下の項目を自分のものに変えるのを忘れない。
　　　・LINE Notifyのアクセストークン（先程メモしたもの。）
　　　・取得したい地域ID
　　　・通知されるメッセージ
 ※取得したい地域・ID一覧・・・・[定義表](https://weather.tsukumijima.net/primary_area.xml)
 ※他の表示情報一覧・・・・[仕様](https://weather.tsukumijima.net/)

- 自分のコードに書き換えて保存後、「weatherForecast」関数を実行して、通知確認。
    - スクリプトエディタ内の上部メニューの「関数名」の部分を「weatherForecast」に変更して、二つ左の「▶」ボタンで実行。
- 通知確認後、指定の時間にコードを実行してもらうために、トリガーを設定。
    - スクリプトエディタのタブメニューの「編集」→ 「現在のプロジェクトのトリガー」をクリック。
    - トリガーを作成して、下記の画像のように設定。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/2ec4e746-6218-68a9-b051-e505ff77cd28.png)

    - 保存。
- 完了。

## まとめ
・第一弾としては、凄く実用的なものを作れたと感動。
・今後も、幅広いものを作れるように奮起。

## 参考
- https://www.smilevision.co.jp/blog/tsukutte10/  
→ほぼこのサイトで完結。大変お世話になりました。
- https://blog.apibank.jp/use_how-api/  
→APIの仕組みがまとめられている。
- **追記**
    - https://weather.tsukumijima.net/
    - こちらのAPIに変更
ローカル環境（Ubuntu）でrails5にBootstrap4を導入しようとしてハマった件


#ローカル環境
Vagrant + Virtualbox + Ubuntu
PC: mac
ruby 2.4.1
Rails 5.1.6.1

#ハマるまでの手順
##実装
まずは、Gemfileに書いてインストール

```Gemfile
gem 'bootstrap', '~> 4.1.3'
gem 'jquery-rails'
```

```ubuntu
$ bundle install
```

###コントローラーとアクション名を作成しておく

```ubuntu
$ rails g controller top 
```

###reset.cssを書き込むファイル`reset.scss`を作成して書き込む
```app/stylesheets/reset.scss
/* http://meyerweb.com/eric/tools/css/reset/ 
   v2.0 | 20110126
   License: none (public domain)
*/

html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline; }

  /* HTML5 display-role reset for older browsers */

  article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
    display: block; }

  body {
    line-height: 1; }

  ol, ul {
    list-style: none; }

  blockquote, q {
    quotes: none; }

  blockquote {
    &:before, &:after {
      content: '';
      content: none; } }

  q {
    &:before, &:after {
      content: '';
      content: none; } }

  table {
    border-collapse: collapse;
    border-spacing: 0; }
```

###gem関連を引っ張るために `custum.scss`というファイルも作成

```app/stylesheets/custum.scss
@import "bootstrap";
```

###Honokaテンプレートから検証ツールでhtmlをコピペ
日本語Bootstrapテンプレートである　ほのかサイト　はこちら　http://honokak.osaka/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204239/39bf62dc-d376-c0a3-28b7-b086ff5783e5.png)


###railsを起動してブラウザで確認
```ubuntu
$ rails s -b 0.0.0.0 -p 3000
```

エラーメッセージが！！！！

###ハマったエラーメッセージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204239/a0c495ca-64f8-06db-b740-f58c13985102.png)

#結論
```Gemfile
gem 'mini_racer'
```
を追加したら成功！
(Live Demoボタンは後から色変えてます)

最終的に追加すべきだったのは

```Gemfile
gem 'bootstrap', '~> 4.1.3'
gem 'jquery-rails'
gem 'mini_racer'　　#これ大事！
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/204239/dc3802b2-fa55-60d2-61bf-6391305c938d.png)


#ハマった理由の考察
同じ手順で、macOSの人はトラブルなくCSS表示された。
ということは、Ubuntuのせいか？

https://stackoverflow.com/questions/51926146/ruby-on-rails-autoprefixer-doesn-t-support-node-v4-9-1-update-it-how-to-fix
で調べると
〜〜〜〜〜〜
![image.png](https://qiita-image-store.s3.amazonaws.com/0/204239/21e1fea3-3040-31cb-7293-36ebe526616d.png)
〜〜〜〜〜〜
というわけで、上記結論に至った。

#補足：jsのファイルはどうしたかというと
```app/javascripts/application.js
//= require jquery3
//= require popper
//= require bootstrap-sprockets

//= require rails-ujs
//= require turbolinks
//= require_tree 
```
javascript/canvas/axiosで画像をPOSTしてpython/flaskで画像を受け取る

メモ

### Javascript側(抜粋)

```javascript
const canvas = this.$refs.imageLayer;
const base64_png = canvas.toDataURL("image/png");
const fd = new FormData();
fd.append("image", base64_png);
const BASE_URL = "http://127.0.0.1:5000";
axios
  .post(BASE_URL, fd)
  .then(function (response) {
    console.log("response", response);
  })
  .catch(function (error) {
    console.log(error);
  });
```

### Python(Flask)側

```python
import os
from flask import Flask, make_response, request
from flask_cors import CORS
from pathlib import Path
import base64
from PIL import Image
from io import BytesIO

app = Flask(__name__)
CORS(app)

@app.route('/', methods=['POST'])
def send():
    if request.method != 'POST':
        return make_response(jsonify({'result': 'invalid method'}), 400)
    base64_png = request.form['image']
    code = base64.b64decode(base64_png.split(',')[1])  # remove header
    image_decoded = Image.open(BytesIO(code))
    image_decoded.save(Path(app.config['UPLOAD_FOLDER']) / 'image.png')
    return make_response(jsonify({'result': 'success'}))
```
base64のデータに`data:image/png;base64,kpvdfkg...` のような形でヘッダっぽいものがついてくるので,`split(',')`を使っている
[CentOS7]cifsマウントのキャッシュを無効化する

#▽ はじめに

当方のあるサーバのメモリのバッファキャッシュが溜まりまくってしょうがない事があり、その際の対処についてメモ。

#▽ 対処の流れ
物理メモリ16GB中5GBがバッファキャッシュてどないやねんという事で調査した結果、バッファキャッシュ含めたメモリ使用率が上昇し始めた時間帯にcifsdが元気に動いていた事を確認。

```
# top
top - 16:01:01 up 39 days,  3:54,  0 users,  load average: 1.37, 0.55, 0.24
Tasks: 254 total,   1 running, 253 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.2 us, 16.1 sy,  0.0 ni, 67.7 id,  9.7 wa,  0.0 hi,  3.2 si,  0.0 st
KiB Mem : 16267632 total,  6351336 free,  4629688 used,  5286608 buff/cache
KiB Swap:  8257532 total,  8202492 free,    55040 used. 11016332 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
28472 root      20   0       0      0      0 S  12.5  0.0  38:51.34 cifsd
 5111 root      20   0 7651508   3.9g  18236 S   6.2 24.9 101:02.68 java
    1 root      20   0  125496   4036   2596 S   0.0  0.0  13:03.92 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.63 kthreadd
    3 root      20   0       0      0      0 S   0.0  0.0   0:12.34 ksoftirqd/0
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:+
    7 root      rt   0       0      0      0 S   0.0  0.0   0:03.16 migration/0
    8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
    9 root      20   0       0      0      0 S   0.0  0.0   5:37.94 rcu_sched
   10 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 lru-add-dr+
```

cifsdがバッファキャッシュの使用率を上昇させたと仮定すると、cifsdでアクセスした先のストレージ上のデータは、当環境では巨大且つ再利用性もないのでそんなファイルの為にキャッシュを貼る意味が分らないという事で、下記サイトを参考に無効化する事にした。

〇参考サイト
https://stackoverrun.com/ja/q/4042831
Linuxのクライアント側でCIFS（samba）のキャッシュを無効にする方法

```
# mount -t cifs ~中略~ -o cache=none
```

上記オプションをマウント設定に追加した所、サーバのバッファキャッシュ使用率が逓減され、意図した通りの状態となった。
【C#】ProjectEuler29, 30, 31問目

#はじめに
C#を用いてProjectEulerに挑戦している人の記録です。VisualStudio2017で、1つのフォームアプリの中に問題番号のボタンを作成し、そのボタンをクリックすると結果をラベルに表示するという形式でやっています。

#29問目
$2 ≤ a ≤ 5$ と $2 ≤ b ≤ 5$について, $a^b$ を全て考える。
これらを小さい順に並べ, 同じ数を除いたとすると, 15個の項を得る:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125

$2 ≤ a ≤ 100$, $2 ≤ b ≤ 100$のとき、いくつの異なる項が存在するか。

```CSharp
private void button29_Click(object sender, EventArgs e)
        {
            var Hashset = new HashSet<BigInteger>();
            for (BigInteger i = 2; i <= 100; i++)
            {
                for (int j = 2; j <= 100; j++)
                {
                    Hashset.Add(BigInteger.Pow(i, j));
                }
            }
            label1.Text = "Answer = " + Hashset.Count;
        }
```

$a^b$を2から100まで行った結果をハッシュセットに代入し、ハッシュセットの内容の個数を答えとしました。ハッシュセットは同じデータの重複を許さないリストです。

#30問目
驚くべきことに, 各桁を4乗した数の和が元の数と一致する数は3つしかない.

- 1634 = 14 + 64 + 34 + 44
- 8208 = 84 + 24 + 04 + 84
- 9474 = 94 + 44 + 74 + 44

ただし, 1=14は含まないものとする. この数たちの和は 1634 + 8208 + 9474 = 19316 である.

各桁を5乗した数の和が元の数と一致するような数の総和を求めよ.

```CSharp
private void button30_Click(object sender, EventArgs e)
        {
            int AnswerSum = 0;
            int PowSum = 0;
            for (int i = 1000; i < 1000000; i++)
            {
                char[] NumberString = i.ToString().ToCharArray();
                for (int j = 0; j < NumberString.Length; j++)
                {

                    int EachNumber = NumberString[j] - '0';
                    int PowEachNumber = 1;
                    for (int k = 0; k < 5; k++) { PowEachNumber *= EachNumber; }
                    PowSum += PowEachNumber;
                    if (PowSum > i)
                    {
                        break;
                    }
                }
                if (PowSum == i)
                {
                    AnswerSum += i;
                    textBox1.AppendText(i.ToString() + " ");
                }
                PowSum = 0;
            }
            label1.Text = "Answer = " + AnswerSum;
        }
```
1000から1000000までの数字に対して、string型の文字列に変換し、char型の配列に変換し、int型に変換することで各桁の数字を取得し5乗してその輪と判定中の数字を比較しています。
#31問目
イギリスでは硬貨はポンド£とペンスpがあり，一般的に流通している硬貨は以下の8種類である.

1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).

以下の方法で£2を作ることが可能である．

1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p

これらの硬貨を使って£2を作る方法は何通りあるか?

```CSharp
 private void button31_Click(object sender, EventArgs e)
        {
            int[] Money = new int[200 + 1];
            Money[0] = 1;
            int UB = Money.GetUpperBound(0);

            foreach (int EachInt in new int[] { 1, 2, 5, 10, 20, 50, 100, 200 })
            {
                for (int i = 0; i < UB; i++)
                {
                    if (Money[i] == 0) continue;

                    int NewInd = i + EachInt;
                    if (UB < NewInd) break;
                    Money[NewInd] += Money[i];
                }
            }
            label1.Text = "answer = " + Money[UB];
        }
```
1から200の状態を配列にいれ、その数字を取り得る場合の数を動的計画法で計算しています。
Amazon EC2で量子ゲートシミュレータのQulacsを使う

QunaSys社が開発している量子ゲートシミュレーターQulacsは、[公式サイト](http://qulacs.org)に super-fast quantum circuit simulator とあるとおり速さに強いこだわりを持って開発されているそうです。

いろいろ実験するために、Amazon EC2に環境を構築しようとしたのですが、少しはまったので、記録を残しておきます。（あんまり中身はないんですが、他にはまる人もいると思って...）

# 最初に試したこと
まずは、AWSにログインして、EC2を立ち上げます。今回利用したイメージは

> Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type - ami-00a5245b4816c38e6

です。とりあえずt2.microという2番目に小さいインスタンスを選択しました。
[公式GitHubページ](https://github.com/qulacs/qulacs)によるとRequirementsとして

- gcc/g++ >= 7.0.0
- cmake >= 3.0

とのことなので、追加でインストールします。

```bash
sudo yum install cmake3 gcc gcc-c++ gcc72 gcc72-c++
sudo ln -s /usr/bin/cmake3 /usr/bin/cmake
```

あとEC2のデフォルトはPython2.7なのですが、私はPython3系を使いたかったので（このときは3.6.8を使用）pyenv経由でインストールします。（この手順は省略）
この状態で、公式GitHubページの手順に従って、

```bash 
python setup.py install
```
とするのですが、次のエラーが出てしまいます。

> omp.h: そのようなファイルやディレクトリはありません

原因ですが、yumでインストールされるgcc7.2には、Qulacsが使っているOpenMPのヘッダーファイルomp.hが含まれていない様子。

# 解決策
ということで、

```bash
sudo yum erase gcc72 gcc72-c++ libgcc72
```
で一旦gcc7.2を削除します。
その上で、あらためてgcc 7.4.0を手作業でインストールします。
インストール手順は、[こちらの記事](https://qiita.com/liveralmask/items/6ed4a98ebb3bf6b7f707)が参考になりました。

これで先ほどの

```bash 
python setup.py install
```
が正常に終わり、インストールが完了します。

# もっと簡単に使いたい
Google ColaboratoryというJupyter Notebookのホスティングサービスを使うと、簡単にQulacsを試せるみたいです。
それについては、[こちらの記事](https://qiita.com/sakiyama0101/items/ad2e5c987873261fce71)に書かれていました。

さんざんEC2で苦労したあとで、あとから気づきました。。。
サブサンプリングデータで機械学習して確率予測する

# **はじめに**
データが非常に多いときに、サブサンプリングしてデータを少なくしてから機械学習して、確率を予測したいときがあります。
たとえば「広告に対するユーザのアクション（クリックやコンバージョン）」データのように、正例（アクションあり）は普通に扱える量なのに対して、負例（アクションなし）データは膨大だったりします。

こういうとき、負例を100分の1とかにして学習できたら楽ですよね。

この場合、大きく二つの方法があり得るかと思います。

- （サブサンプリングした）負例の重みを100倍にして重み付き学習する。
- 重みなしで学習して、求まった確率を「元のデータでの確率」に戻す。

バッチ学習なら単に重み付き学習すれば良いのですが、オンライン学習では**「負例が来たぞ！ 100回更新！」**などと更新するのは悪影響がありそうで、2の方法を学んでおくのも役に立つかと思います。

本稿では、2の場合に「元のデータでの確率」の予測値にどのように戻すのか、について書きます。

# **一般の機械学習手法に対する方法**
ここでは機械学習手法は問わずに任意の機械学習手法で、「元のデータでの確率」に戻す方法について考えます。
負例を$1/r$にサブサンプリングして学習した確率予測器の出力値$q(\boldsymbol{x})$を、元のデータでの確率の予測値$p(\boldsymbol{x})$に変換する方法です。

確率は

```math
\begin{align}
\frac{正例の生起確率}{正例の生起確率＋負例の生起確率}
\end{align}
```
であり

```math
\begin{align}
q(\boldsymbol{x})
 &= \frac{q(\boldsymbol{x})}{q(\boldsymbol{x}) + (1-q(\boldsymbol{x}))}
\end{align}
```
です。
このとき、負例を$1/r$にサブサンプリングして学習した$q(\boldsymbol{x})$を、元のデータでの確率の予測値$p(\boldsymbol{x})$に戻すには「負例の生起確率」に対応する分母の$(1-q(\boldsymbol{x}))$を逆に$r$倍してやればよいですね。

```math
\begin{align}
p(\boldsymbol{x})
 &= \frac{q(\boldsymbol{x})}{q(\boldsymbol{x}) + r(1-q(\boldsymbol{x}))} \\
\end{align}
```

# **ロジスティック回帰に対する方法**
ロジスティック回帰でも、上記のように換算してももちろん「元のデータでの確率」は求まります。
ですが、上記の方法だと元のデータで学習したモデルは得られず、サブサンプリングデータに対する確率予測器の出力はあくまで$q(\boldsymbol{x})$で、これを$p(\boldsymbol{x})$に変換する、というものでした。

ロジスティック回帰を用いる際には係数に興味があることも多いので、出力がダイレクトに$p(\boldsymbol{x})$になるロジスティック回帰の係数が欲しい、ということもあるかと思います。
そしてなんとロジスティック回帰の場合には、重み付き学習をするのでなく、このように$q(\boldsymbol{x})$を出力するモデルを**改造して**$p(\boldsymbol{x})$を出力するモデルにできます！

```math
\begin{align}
q(\boldsymbol{x}) = \frac{1}{1 + \exp\big( -(b + \boldsymbol{w}^T \boldsymbol{x}) \big)}
\end{align}
```
とすると、

```math
\begin{align}
\ln \frac{q(\boldsymbol{x})}{(1-q(\boldsymbol{x}))}
 = b + \boldsymbol{w}^T \boldsymbol{x}
\end{align}
```
です。
求めたい$p(\boldsymbol{x})$のロジットは、このロジットの分母$(1-q(\boldsymbol{x}))$を$r$倍したものですね。

```math
\begin{align}
\ln \frac{p(\boldsymbol{x})}{(1-p(\boldsymbol{x}))}
 &= \ln \frac{q(\boldsymbol{x})}{r(1-q(\boldsymbol{x}))} \\
 &= \ln \frac{1}{r} + \ln \frac{q(\boldsymbol{x})}{(1-q(\boldsymbol{x}))} \\
 &= - \ln r + b + \boldsymbol{w}^T \boldsymbol{x}
\end{align}
```

すなわち、サブサンプリングデータで学習したロジスティック回帰のバイアス項$b$から$\ln r$を引くだけです！

```math
\begin{align}
p(\boldsymbol{x}) = \frac{1}{1 + \exp\big( -(b - \ln r + \boldsymbol{w}^T \boldsymbol{x}) \big)}
\end{align}
```

[1] の4.7でも同じ結果は導かれているのですが、個人的には上記の導出のほうがわかりやすいのではないかと思います。

以上、本稿では、サブサンプリングデータで学習して「元のデータでの確率」の予測値を得る方法について書きました！

[1] Chapelle, Olivier, Eren Manavoglu, and Romer Rosales. Simple and scalable response prediction for display advertising. ACM Transactions on Intelligent Systems and Technology (TIST), 2015, 5.4: 61, 2015
Anacondaの仮想環境をJupyter notebookに反映させる方法

環境：Windows10
前提：Anacondaをインストール済み

**仮想環境の生成**
```$ conda create -n Name python=3.7 numpy jupyter```
jupyterをインストールする必要がある

**jupyter_environment_kernelsのインストール**
```$ pip install environment_kernels```

**Jupyterの設定ファイル生成**
```$ jupyter notebook --generate-config```

**Conda環境を読み込む設定を追記**
C:/Users/userName/.jupyter/jupyter_notebook_config.pyに下記を追記する

```jupyter_notebook_config.py
c.NotebookApp.kernel_spec_manager_class='environment_kernels.EnvironmentKernelSpecManager'
c.EnvironmentKernelSpecManager.env_dirs=['仮想環境が生成されているパス']
```
例）仮想環境が生成されているパス： C:/Users/userName/Anaconda3/envs/


**ipynbファイルのメニュー→kernel→Change kernelで、作成した仮想環境が選択できるようになっている**

**参考**
[Condaで作ってる仮想環境の切り替えをJupyter上で簡単に行う方法](https://qiita.com/yoppe/items/38005f415a5b8b884c7d)
[Anacondaで作った仮想環境をJupyter Notebookで使う方法](http://d.hatena.ne.jp/mopper27/20181102/1541171288)
Condaのチャンネルとは？

**チャンネルとは？**
Condaでは、[anaconda.org](https://anaconda.org/)にユーザーが独自のリポジトリを作成し、
パッケージを登録・管理することが出来る

このリポジトリ名を**チャンネル**と呼ぶ

このチャンネルを使うことにより、ユーザは
```$ conda install -c チャンネル名 パッケージ名```
として、独自のパッケージをインストールすることが出来る

---
**パッケージを検索**
```$ conda search --full-name パッケージ名```
追加済みのチャンネルから指定のパッケージが有るか検索する

**チャンネル一覧を取得**
```$ conda config --get channels```

**チャネルを追加**
```$ conda config --add channels チャンネル名```
追加したチャンネルが`# highest priority`になる


```$ conda config --append channels チャンネル名```
`# highest priority`を移動させずに、チャンネルを追加できる

**チャンネルを削除**
```$ conda config --remove channels チャンネル名```

**参考**
[Pythonメモ-44 (conda に conda-forge チャネルを追加) (conda config, channel, 追加パッケージ)](https://devlights.hatenablog.com/entry/2017/12/09/183715)
[conda menpoとは？](https://teratail.com/questions/83171)
Reactで画像ファイルを任意のタイミングでリフレッシュする方法


# TL;DR

imgタグのsrcにハッシュをつければ良い

# サンプルコード

以下のコードではhashをReactコンポーネントのstateにもたせている。
hashはimgタグのsrcの最後にクエリパラメータとして渡す。
hashの値を変えるメソッドrefreshImgを呼ぶことで任意のタイミングで画像をリフレッシュすることができる。

```js
render() {
  const { imgHash } = this.state;
  return <img src={`/img/url?${imgHash}`}
}
```

```js
refreshImg() {
  this.setState({
    imgHash: new Date().getTime(),
  });
}
```


参考：[Force React to reload an image file?](https://stackoverflow.com/questions/47922687/force-react-to-reload-an-image-file)
OneToOne データ取得(Select)

# はじめに
OneToOneの関係のテーブルにデータを取得(Select)する。
「[OneToOne データ追加(Insert)](https://qiita.com/ma33588/items/ac735d936ce821c1620f)」の続き。

# データ取得(Select)
## Controllerよりアクセス
ControllerからRepository経由でアクセス

```php:app/Customize/Controller/SamplePageController.php
/**
 * @Route("/sample/{id}", name="sample_index")
 * @Template("Sample/index.twig")
 */
public function index($id)
{
    $product = $this->productRepository->find($id);
    dump($product);

    return [
        'shop_name' => $this->baseInfo->getShopName(),
        'product_name' => $product->getName(),
        'maker_name' => $product->getMakerName(),
        'size_a' => $product->getProductSize()->getSizeA(),
    ];
}
```


## ブラウザよりアクセス
/sample/1 でdtb_productとdtb_product_sizeのデータを取得できた。

```
Product {#3838 ▼
  -_calc: false
  -stockFinds: []
  -stocks: []
  -stockUnlimiteds: []
  -price01: []
  -price02: []
  -price01IncTaxs: []
  -price02IncTaxs: []
  -codes: []
  -classCategories1: []
  -classCategories2: []
  -className1: null
  -className2: null
  -id: 2
  -name: "チェリーアイスサンド"
  -note: null
  -description_list: null
  -description_detail: """
    チェリーアイスサンドは北海道産のチェリーのアイスをサクサクのクッキーでサンドしたスイーツです。立方体なので大量に持ち運ぶときも便利です。\n
    いまだけ、頑丈な箱つきです。
    """
  -search_word: null
  -free_area: null
  -create_date: DateTime @1538129692 {#3841 ▶}
  -update_date: DateTime @1538129692 {#3840 ▶}
  -ProductCategories: PersistentCollection {#3877 ▶}
  -ProductClasses: PersistentCollection {#3875 ▶}
  -ProductImage: PersistentCollection {#3931 ▶}
  -ProductTag: PersistentCollection {#3989 ▶}
  -CustomerFavoriteProducts: PersistentCollection {#4040 ▶}
  -Creator: null
  -Status: ProductStatus {#4080 ▶}
  -AnnotationReader: AnnotationReader {#261 ▶}
  +maker_name: "メーカー２"
  -ProductSize: ProductSize {#4066 ▼
    -id: 2
    -product_id: 2
    -size_a: 20
    -size_b: 200
    -create_date: DateTime @1545902935 {#4069 ▶}
    -update_date: DateTime @1545902935 {#4068 ▶}
    -Product: Product {#3838}
    -AnnotationReader: AnnotationReader {#261 ▶}
  }
}
```

#まとめ
親をfind()して子オブジェクトを参照。

#参照
[OneToOne データ追加(Insert)](https://qiita.com/ma33588/items/ac735d936ce821c1620f)
Bash 5.0 で追加された変数の紹介

## Bash 5.0 がリリースされました

- [Bash-5.0 release available](http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00063.html)
- [「GNU Bash 5.0」リリース、10年ぶりのメジャーバージョンアップ － Publickey](https://www.publickey1.jp/blog/19/gnu_bash_5010.html)
- [Bash 5.0登場、UNIX時間を保持する変数導入 | マイナビニュース](https://news.mynavi.jp/article/20190109-753770/)
- [bash 5.0のNEWSファイル私訳 - Qiita](https://qiita.com/emasaka/items/47eaa5fb5a01572fcc17)
- [bash 5.0がリリースされた話 - Qiita](https://qiita.com/ryuichi1208/items/9f0b42517a51ccd34243)

以下の変数が新機能として追加された。

- `BASH_ARGV0`
- `EPOCHSECONDS`
- `EPOCHREALTIME`


## Bash のアップグレード

### macOS は `brew` でアップグレードできる

macOS ユーザーは homebrew で bash を管理していれば

```
brew update && brew upgrade
```

で Bash をアップグレードできます。

homebrew で bash を管理したいなら

```
brew install bash
```

とすればOK

### ソースからビルドする

[Bash-5.0 release available](http://lists.gnu.org/archive/html/bug-bash/2019-01/msg00063.html) 👈 に `bash-5.0.tar.gz` のダウンロードリンクがある。これを展開した中の `README` にビルド方法が書かれている。macOS ユーザーもそれ以外 (Linux, Ubuntu とか) もソースからビルドして bash 5.0 を試せる。

```
wget ftp://ftp.cwru.edu/pub/bash/bash-5.0.tar.gz
# もしくは ftp://ftp.gnu.org/pub/gnu/bash/bash-5.0.tar.gz
tar xvf bash-5.0.tar.gz
cd bash-5.0
CC=cc ./configure
make
./bash
```

### bash バージョンの確認

Bash のバージョンは `bash --version` で確認できる。

```
$ bash --version
GNU bash, version 5.0.0(1)-release (x86_64-apple-darwin18.2.0)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```

もしくは bash をインタラクティブシェルとして実行中に `echo $BASH_VERSION` で確認できる。

```
$ echo $BASH_VERSION
5.0.0(1)-release
```


## `BASH_ARGV0`

> e. `BASH_ARGV0`: a new variable that expands to `$0` and sets `$0` on assignment.

`BASH_ARGV0` には `$0` が保持されており、また `$0` を設定する時には `BASH_ARGV0` を書き換えれば良いらしい。

`script.bash` を以下の内容で作成。

```
echo $BASH_VERSION
echo $0
echo $BASH_ARGV0
BASH_ARGV0=new_bash
echo $BASH_ARGV0
echo $0
```

`bash script.bash` で実行してみる。

```
$ bash script.bash
5.0.0(1)-release
script.bash
script.bash
new_bash
new_bash
```

どのように活用するかは私には分からない。


## `EPOCHSECONDS`

> b. There is an `EPOCHSECONDS` variable, which expands to the time in seconds since the Unix epoch.

Unix 時間を秒単位で参照できる。

```
$ echo $EPOCHSECONDS
1547022153
```

`date +%s` の代わりに使える。

```
$ echo $EPOCHSECONDS; date +%s
1547022153
1547022153
```


## `EPOCHREALTIME`

> c. There is an `EPOCHREALTIME` variable, which expands to the time in seconds since the Unix epoch with microsecond granularity.

Unix 時間を microsecond 単位で参照できる。

```
$ echo $EPOCHREALTIME
1547022153.595532
```
Capistranoで自動デプロイした時に出たSSHKit::Runner::ExecuteError解決法

## Capistranoでデプロイしようとした時にSSH認証エラーが出ました
プログラミングスクールの課題で作成したアプリを修正してEC2へデプロイしようとしたら
以下のエラーが出たため解決法を記しておきます。

``` :terminal
# プロジェクトのローカルディレクトリで自動デプロイを実行
$ bundle exec cap production deploy

(Backtrace restricted to imported tasks)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as ec2-user@ElasticIP: Authentication failed for user ec2-user@ElasticIP


Caused by:
Net::SSH::AuthenticationFailed: Authentication failed for user ec2-user@ElasticIP

Tasks: TOP => rbenv:validate
(See full trace by running task with --trace)
```

## エラーの原因
再起動するとSSH鍵が消えてしまうみたいなので .sshディレクトリにて以下のコマンドでSSH鍵を登録し直します。

``` :terminal
.ssh $ ssh-add ~/.ssh/hoge.pem
# 以下のように表示されたら
Identity added: /Users/komaki/.ssh/hoge.pem (/Users/komaki/.ssh/hoge.pem)
```

## 再度　"bundle exec cap production deploy" を実行
無事にデプロイが成功しました！
![Image from Gyazo](https://i.gyazo.com/589d63260515dc4b0a2440c59503dcbe.jpg)

## 再起動した後でも保持させるには...
以下のコマンドを使用すると、キーチェーンストア(鍵の保管庫)に鍵を登録して再起動後も保持してくれます。

```:terminal
.ssh $ ssh-add -K ~/.ssh/hoge.pem
```
venvで環境構築

venvは、同じ(python)バージョンで違う環境を作成するためのもの


### 事前準備

venvはvirtualenvがPython 3.3から標準機能として取り込まれたものなので、Python 3.3以上をインストール  

- [anyenvでPython3.xをインストール](https://qiita.com/yoshiweb/items/f4ac19d94dd9dfc243ec)  


## 仮想環境構築

```
$ python -m venv env
```

`env`フォルダができてその中にいろいろインストールされる  
`env`は仮想環境名（任意に設定できる）  
  
※パスにスペースが入ってるとエラーになることがありました。


## 仮想環境に入る

```
$ source env/bin/activate
(env)$ 
```

この状態でTensorflowのインストールなどを行う。  
`env`フォルダの中（仮想環境）にインストールされるのでOS環境が汚れない。  

例：Tensorflowのインストール

```
(env)$ pip install tensorflow
```

## 仮想環境から出る

```
(env)$ deactivate
```

## 仮想環境の削除

`env`フォルダを削除すればいい
WebAuthnのデモサイト "webauthn.me" のアニメーションがちょっと親切

ritou です。

去年から話題になっており個人的にも注目している `WebAuthn` のデモができる環境は結構あります。
個人的によく使うのはこの辺りでした。

* https://webauthn.org/
* https://webauthndemo.appspot.com/ by Google
* https://demo.yubico.com/webauthn/ by yubico

基本的に認証のdemoと言うのは一瞬で終わってその後に「裏ではこれこれこう言う...」って説明するパターンが多いです。

上記のサイトもリクエスト/レスポンスの表示などは親切なところもありますが、何が起こっているか直感的に説明するためには補足が必要でした。

んで、最近出てきた Auth0 が提供しているdemoサイトがこちらです。

https://webauthn.me/

バックエンドのサーバーから challenge が渡されて来る感じとかがわかりやすい気がしています。

んで、やってみた動画はこちらです。

[![webauth.me デモ動画](http://img.youtube.com/vi/gzeJ0VV2mUE/0.jpg)](http://www.youtube.com/watch?v=gzeJ0VV2mUE)

[![webauth.me デモ動画(w/ Android Chrome)](http://img.youtube.com/vi/P9Il2X5DbGQ/0.jpg)](http://www.youtube.com/watch?v=P9Il2X5DbGQ)

YouTubeにあげたらぼやけてイマイチですが、説明しながらデモする機会があったらここ使ってみようと思います。

ではまた。