OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】モデル作成の小さなサンプルメモ

# 作成するモデル

- Page
    - title: text
    - content: text


# メモ

## モデル/マイグレーションの作成

```sh:console
% rails g model Page title:text content:text
Running via Spring preloader in process 14662
      invoke  active_record
      create    db/migrate/20180527151423_create_pages.rb
      create    app/models/page.rb
      invoke    test_unit
      create      test/models/page_test.rb
      create      test/fixtures/pages.yml
```

出来たマイグレーションファイル↓

```ruby:20180527151423_create_pages.rb
class CreatePages < ActiveRecord::Migration[5.1]
  def change
    create_table :pages do |t|
      t.text :title
      t.text :content

      t.timestamps
    end
  end
end
```

できたモデルクラス↓

```ruby:page.rb
class Page < ApplicationRecord
end
```

できたフィクスチャ↓

```yaml:pages.yml
# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html

one:
  title: MyText
  content: MyText

two:
  title: MyText
  content: MyText
```

## マイグレーション

```sh
% rails db:migrate
```

できたテーブル↓

```
# \d pages
 id         | bigint                      | not null default nextval('pages_id_seq'::regclass)
 title      | text                        | 
 content    | text                        | 
 created_at | timestamp without time zone | not null
 updated_at | timestamp without time zone | not null
```

## フィクスチャの使用

```
% rails db:fixtures:load
```

確認↓

```ruby:rails_console
irb(main):003:0> Page.all
  Page Load (0.3ms)  SELECT  "pages".* FROM "pages" LIMIT $1  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Page id: 980190962, title: "MyText", content: "MyText", created_at: "2018-05-28 02:14:05", updated_at: "2018-05-28 02:14:05">, #<Page id: 298486374, title: "MyText", content: "MyText", created_at: "2018-05-28 02:14:05", updated_at: "2018-05-28 02:14:05">]>
irb(main):004:0> Page.find(1)
```

```text:postgres_console
# select * from pages;
id         | 980190962
title      | MyText
content    | MyText
created_at | 2018-05-28 02:14:05.849503
updated_at | 2018-05-28 02:14:05.849503
-----------+---------------------------
id         | 298486374
title      | MyText
content    | MyText
created_at | 2018-05-28 02:14:05.849503
updated_at | 2018-05-28 02:14:05.849503
```
Vagrantでjavaの検証環境をローカルに立ち上げる

以前の職場で、リモート環境に検証する環境がなくローカルにて確認できる環境を構築する際に勉強がてらvagrantとansibleを用いてjavaの環境構築をしてみましたので共有致します。※mac環境のみの手順記載となります。
現在は、iOSのクライアント側の開発が主でサーバーサイドの開発(node.jsは少し携わっている程度)は行なっていない為折角作ったのは良いが私自身は全く活用出来ていないという状況です、、、

---

事前に下記のインストールをお願いします。

```
$ brew install ansible
$ brew cask install vagrant
$ brew cask install virtualbox
```

## ここからが具体的な設定方法


[こちら](https://github.com/borderhub/ansible-vagrant-java)からソースをcloneして下さい。

Vagrantfileのあるディレクトリにて

```
$ vagrant up
```

少し時間がかかると思いますが、正常に終了しましたら下記にアクセス。


`http://192.168.33.10:8080/sample/`

下記のwarが展開されます。

```
ansible-vagrant-java
└ www
　　└ tomcat
　　　　　└ webapps
　　　　　　　　└ sample-1.0.war
```

## サンプル画面

<img width="722" alt="スクリーンショット 2018-05-28 11.27.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/177529/e0922706-8661-016f-840b-d7cc5fcd3d16.png">

## 注意

もし、セットアップ中に下記のようなエラーが表示されたら

```
There are errors in the configuration of this machine. Please fix
the following errors and try again:

Vagrant:
* Unknown configuration section 'vbguest'.
*
```
vagrant-vbguest のインストールもしくは再インストールを行なって下さい。

```
$ vagrant plugin uninstall vagrant-vbguest
$ vagrant plugin install vagrant-vbguest
```

## まとめ

通常はIDEなどでもっと気軽に環境を作れるとは思いますが、リモートの検証環境がない場合など気軽に試せる環境として活用できるかと思いますので、良かったらご利用下さい。

## メモ

- [【まとめ】Vagrant コマンド一覧](https://qiita.com/oreo3@github/items/4054a4120ccc249676d9)
- [Vagrantコマンド一覧とかチートシートとか](https://qiita.com/ushio_s/items/e17592191edcdc68fc98)
- [Vagrant: Unknown configuration section 'vbguest' と言われる](https://qiita.com/nagomu/items/e7881599685c1446f5e1)
AzureAutomate等で夜中と土日をノンコーディングやすみんにする

gitlab-runnerにお仕事さすのは基本的に平日だけだし使わないときは止めとこうかな、もったいないし、
という動機でちょっとやってみたら思いのほか簡単だった（Runbookのおかげ）ので備忘録を。
使うときだけ起動とかまでいければいいんですがvmの起動そんなに早くないし。

gitlab-runner01にたいして、自動停止を毎日0時に設定（VMのメニューから可能）、

![auto-stop.png](https://qiita-image-store.s3.amazonaws.com/0/25031/87badcce-8eef-3df3-82da-53e6b7bd2ec1.png)

　で、AzureAutomateのギャラリーから自動スタートのRunbookをインポートして入出力設定からリソースグループとVM名のパラメータをカスタムで規定値設定して（設定しなくても使うときに指定可能）、

![auto-start.png](https://qiita-image-store.s3.amazonaws.com/0/25031/f06c3eec-7505-45f0-447c-0ce0792b11af.png)


　スケジュールで週次で月～金の8時に起動する感じに設定しました。

![start-vm.png](https://qiita-image-store.s3.amazonaws.com/0/25031/7bbef067-468f-3454-6c2f-5d802a19a29f.png)


これすると週末だけ止めて起動とか改めて設定しなくても意図した動作になりました。
週明け確認したところ意図したとおりになってたようです。
ホストの中身のサービスの自動起動はちゃんと指定しておく必要はありますかね。

```
# systemctl is-enabled gitlab-runner
enabled
# systemctl is-enabled zabbix-agent
enabled
```

というわけでコスト削減に。
複数台で長期間ならちりも積もれば山となるのではないのかなとおもいます。
バックアップを夜中にとってたりする場合に時間を気にする必要はありそうです。
あと監視アラートについてVM止める期間だけ無効化かメンテナンスに設定しないと通知がくるので注意。
（zabbixだとデータ収集ありでメンテナンスにしないと復活したとき監視が有効化されないようでした）

![vm-yasumin.png](https://qiita-image-store.s3.amazonaws.com/0/25031/1c085f4f-a50b-1649-a7c9-f91709c4f428.png)


さんこう
https://cloud.nissho-ele.co.jp/blog/azure_automationvm/
http://www.risingsun-planning.com/blog/blog20171102/
Ubuntu 18.04でRuby 2.0.0をビルドする

Ubuntu 18.04で普通に生活していると1.1.0以上のOpenSSLがインストールされるが、その状態で `rbenv install 2.0.0-p648` をやるとOpenSSLのヘッダで `#error` となりビルドに失敗する。
基本的にはEOLであるRuby 2.0.0を使うのをやめるのが正しいのだが、現在のtrunkがRuby 2.0.0の何倍高速かを調べるためにビルドしなければならなかったため、方法をメモしておく。

## OpenSSL 1.0.2をインストールする
aptの設定を書いてグローバルにインストールするOpenSSLのバージョンを下げることもできるが、まあ普通にRuby 2.0.0をビルドする以外では最新のものを使いたいのでソースからビルドして適当なディレクトリ(ここでは `/opt/openssl-1.0.2o`)に置いておくことにする。

https://www.openssl.org/source/ からOpenSSL 1.0.2をダウンロードし、ビルドする。

```bash 
# openssl-1.0.2u が最後のリリース (2019)
wget https://www.openssl.org/source/openssl-1.0.2u.tar.gz
tar xvzf openssl-1.0.2u.tar.gz
cd openssl-1.0.2o
./config --prefix=/opt/openssl-1.0.2u shared
make -j4
sudo make install
```

## --with-openssl-dir を指定してRuby 2.0.0をビルドする

```bash
# rbenv (ruby-build)
RUBY_CONFIGURE_OPTS="--with-openssl-dir=/opt/openssl-1.0.2u" rbenv install 2.0.0-p648

# ruby-install
PATH="/opt/bison-3.2.4/bin:${PATH}" ruby-install 2.0.0-p648 -- --with-openssl-dir=/opt/openssl-1.0.2u
```

これで無事ビルドできた。
RSSBus Connect サンプルパッケージ一覧

# はじめに

本記事ではRSSBus Connectの各種サンプルパッケージについて解説します。

https://www.rssbus.com/

# RSSBus Coonectとは？

RSSBus Connectは、ファイル、データベース、またはクラウドアプリケーションのデータをすべて1つのアプリケーションで簡単に統合することができるソフトウェアです。

アプリケーションとデータの接続を行い、Mrketoなどのマーケティングサービスから得た顧客情報をSalesforce等のSFAに連係したり、バイナリファイル転送・EDIによるプロセスの自動化も行うことが可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/cf34e29c-25bc-72fe-888f-981756ac4ca5.png)

RSSBus Connectは以下のようにフロー形式のUIで各データソースを繋ぐようにデータ連携のプロセスを開発することが可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/106a418a-2c3a-fd90-f0fa-53e284a9784c.png)

# インストールおよびPackageのインポート方法

以下の記事に詳しくまとめています。

[RSSBus Connectのインストールとパッケージの配置方法](https://qiita.com/sugimomoto/private/f371bf4ecfb9604ce0e2)


## Salesforce → PostgreSQL （Key によるUpsert）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/b152c7da-b510-3e81-6906-ffb011c54ab6.png)


### 概要


### Download




## PostgreSQL → Salesforce　（Email Address によるUpsert）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/f944e718-5fef-2bdb-443c-9e584cee53dc.png)




## Marketo → DynamicsCRM

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/7bb254ce-abcb-d5eb-6928-e9357d797378.png)



## DynamicsCRM → Sendgrid

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/b347c7f1-cb65-3ad3-3f94-55354ff72091.png)


[Download RSSBusPackage-DynamicsCRM-SendGrid.zip](https://s3-ap-northeast-1.amazonaws.com/cdatajbuilds/RSSBus+Connect+Package/RSSBusPackage-DynamicsCRM-SendGrid.zip)


## Kintone → Sendgrid

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/501d7d86-e539-fc07-6669-7d24e421fe6c.png)


[Download RSSBusPackage-Kintone-Sendgrid.zip](https://s3-ap-northeast-1.amazonaws.com/cdatajbuilds/RSSBus+Connect+Package/RSSBusPackage-Kintone-Sendgrid.zip)


## Salesforce → Sendgrid

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/ccb64a63-97f3-ece9-820e-e0748dbf80ed.png)


[Download RSSBusPackage-Salesforce-Sendgrid.zip](https://s3-ap-northeast-1.amazonaws.com/cdatajbuilds/RSSBus+Connect+Package/RSSBusPackage-Salesforce-Sendgrid.zip)


## Sansan → Sendgrid

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/8aea6dc2-5eb3-a6bc-8ebb-a8adbd11c9d0.png)


[Download RSSBusPackage-Sansan-Sendgrid.zip](https://s3-ap-northeast-1.amazonaws.com/cdatajbuilds/RSSBus+Connect+Package/RSSBusPackage-Salesforce-Sendgrid.zip)



##
v$osstatとlscpuのCPU情報比較

同一サーバーでLinuxの「lscpu」コマンドとOracle Databaseの「v$osstat」に対するSELECTを実施

## lscpu

```
CPU(s):                16
コアあたりのスレッド数:   2
ソケットあたりのコア数:   4
Socket(s):              2
```

## v$osstat

```
STAT_NAME                                                             VALUE
---------------------------------------------------------------- ----------
NUM_CPUS                                                                 16
NUM_CPU_CORES                                                             8
NUM_CPU_SOCKETS                                                           2
```

※CPU情報のみ抜粋
App-Prefs:root= を使っていたため2.5.1リジェクトされたときの対処法

## App-Prefs:root
このURLスキームは主に設定アプリの特定の画面を開くために利用することが多いのではないでしょうか。私も何も考えずに個人アプリで使っていて、2018/05/23あたりに指摘を受け、バイナリリジェクトとされました。

具体的には、通知の設定をしてほしかったため `App-Prefs:root=NOTIFICATIONS_ID&path=BUNDLE_ID` を使っていました。 

## 2.5.1とは
[App Store Review Guideline - Software Requirements](https://developer.apple.com/app-store/review/guidelines/#software-requirements)

こちらを読んでいただければわかるのですが、要するに「Appleが提供している公式かつ最新のAPIを使いなさい」ということみたいです。 `App-prefs:root` および `prefs:root` はnon-publicなURL Schemeに該当するようです。

## 対処法
`App-prefs:root` ではなく、 `UIApplication.openSettingsURLString` を使いましょう。具体的なコードは下記になります。

```swift
if let url = URL(string: UIApplication.openSettingsURLString), UIApplication.shared.canOpenURL(url) {
   UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
```

これを実行すると、設定アプリ内の、これを実装したアプリの項目を基本的には開くようです。もし上記コードが公式Twitterアプリで実行された場合、下記画面が開かれるはずです。

<img width="375" alt="Image from iOS.png" src="https://qiita-image-store.s3.amazonaws.com/0/74853/16d6ea9a-8baf-056d-1a67-77a300e7a40f.png">


詳細な挙動は下記記事が非常に参考になります。

[UIApplicationOpenSettingsURLStringから設定アプリを開いたときの挙動調査](https://qiita.com/shtnkgm/items/3c32718b4ac7be4d2463)
モンテカルロ法

```py
#必要ライブラリの導入

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.html.widgets import interact
%matplotlib inline


plt.style.use("ggplot")
np.random.seed(123)

NMC = 100
xmc = np.random.rand(NMC)
ymc = np.random.rand(NMC)
r = (xmc ** 2 + ymc ** 2)** 0.5
accept = np.where(r <= 1, 1, 0)
accept_ratio = np.sum(accept) / NMC
print(accept_ratio)

NMC = 100
xmc = np.random.rand(NMC)
ymc = np.random.rand(NMC)

@interact(mcs=(0, NMC,1))
def animation(mcs=0):
    plt.figure(figsize=(6,6))
    plt.xlim([0,1])
    plt.ylim([0,1])
    x = np.arange(0,1,0.001)
    y = (1 - x **2) ** 0.5
    y2 = np.ones(x.shape[0])
    plt.plot(x, y)
    plt.fill_between(x, y,alpha=0.3)
    plt.fill_between(x, y, y2, alpha=0.3)
    r = (xmc[:mcs] ** 2 + ymc[:mcs] ** 2) ** 0.5
    accept = np.where(r <= 1, 1, 0)
    accept_ratio = np.sum(accept) / mcs
    plt.scatter(xmc[:mcs], ymc[:mcs], color ="black", marker=",")
    plt.show()
print("Monte Carlo:", accept_ratio)
print("Analytical Solution:", np.pi / 4.0)
pi_mcs = []
NMC = 2000
xmc = np.random.rand(NMC)
ymc = np.random.rand(NMC)
for mcs in range(1, NMC):
    r = (xmc[:mcs] ** 2 + ymc[:mcs] ** 2) ** 0.5
    accept =np.where(r <= 1, 1, 0)
    accept_ratio = np.sum(accept) / mcs
    pi_mcs.append(accept_ratio)
pi_x = np.arange(len(pi_mcs)) + 1
plt.plot(pi_x, pi_mcs)
plt.hlines(0.785, pi_x[0], pi_x[-1], linestyles="dashed")
plt.xlabel("MCS")
plt.ylabel("accept ratio")
```

<img width="415" alt="スクリーンショット 2018-05-28 11.16.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/251844/ecdc27ed-19ea-b6c4-49d5-394fddbfe18a.png">


#MSCが増えると確率的に解析解に漸近していくことがわかる
jdbcでクエリログを出力するメモ


loggerとprofileSQLオプションを指定する

```
mysql.dataSource.url="jdbc:mysql://"${MYSQL_HOST}"/"${MYSQL_DATABASE_NAME}"?useSSL=false&logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true"
```


### 参照

[Enabling MySQL general query log with JDBC
](https://stackoverflow.com/questions/10903206/enabling-mysql-general-query-log-with-jdbc "Enabling MySQL general query log with JDBC")
AWSで日本アドレスがほしいとき

# こんな人におすすめ
* どうしてもAWS上で日本アドレスが欲しい方
* EC2インスタンスから、楽天のGOLDサーバにFTP接続したい方
    * 任意の店舗のみからの接続の場合、店舗登録者が楽天に申請すれば許可してもらえます

# サーバが特定の国に存在するという意味
GeoIP データベースを元にした地理情報による特定と、
regional Internet registry (RIR) という組織による割り当てを元にした分類の2種類の意味がある。

前者は、AWSで言うところのリージョンで判別できる。
東京リージョンであれば、東京に存在するという事となる。

ただこれはサーバ本体の話で、IPアドレスがどこの国に割り当てられているアドレスかを判別するのは後者である。

詳しくは `regional Internet registry` を調べてみてください。
ちなみに任意のIPアドレスの割当国がどこかは、[こちら](http://cc.wariate.jp/)のサイトなどで調べる事ができる。

# AWSで日本アドレスを得るには？
EC2には基本的には自動でIPアドレスが割り当てられる。
これは固定IPでは無いので、まず固定IPを設定する。

## EC2への固定IPの割り当て
独自で設定する場合はネットワーク周りの設定ファイルをいじったりするが、AWSでの設定は非常に簡単。

固定IPにするには、`ElasticIP`にてアドレスを生成して、インスタンスへの割り当てを行う。

![]([![Screenshot from Gyazo](https://gyazo.com/6e1e2c731619c6d4c7770197ff9ead50/raw)](https://gyazo.com/6e1e2c731619c6d4c7770197ff9ead50.jpg)

新しいアドレスを割り当て後、「アクションー＞アドレスの関連付け」にてインスタンスと紐付ける。

## 日本アドレスを割り当てるには
1. 「新しいアドレスの割り当て」でアドレスを割り当てる
2. 割り当てられたIPアドレスがどこの国の割り当てかを[こちら](http://cc.wariate.jp/)等で調べる
3. `JP`に当たるまで1,2を延々と繰り返す(笑)
    1. アカウント毎でリージョンあたりの Elastic IP アドレス は５つまでに制限されているようなので、「5つ一気に割り当てー＞まとめて調査」とするとスムーズかと

以上。

ちなみに、100件位割り当てて、ようやく2件日本アドレスを割り当てられました。（；＾ω＾）
あと、今回東京リージョンで行ったのですが、100件の中ではアメリカ、日本以外の国の割り当ては出てきませんでした。

# 所管
完全にガチャ感覚でしたｗ
結構面倒くさいですが、任意の国のアドレスを自由に生成する機能は実装するほどニーズ無いんでしょう。
この記事も何人の方の参考になることやら。。。
今からはじめるAzureコンテナ超入門

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「こわくない！今からはじめるAzureコンテナ超入門」で使われた資料のご案内です。</p>

- <strong>今からはじめるAzureコンテナ超入門</strong><br />
https://speakerdeck.com/asashiho/kowakunai-jin-karahazimeruazurekontenachao-ru-men
<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
プログラミングなしでERC20の独自トークンを発行しスマホのウォレットで管理する方法

# 必要な環境
## MetaMask
MetaMaskは[こちらのリンク](https://metamask.io/)からインストールできます。
インストールし、アカウントを発行する必要があります。

## Test netのEthererum
独自トークンをテストネットで発行するためには、手数料を払うために十分なETHが必要になります。
テストネットのETHを以下のサイトから手に入れられます。もらうETHは1ether程度で十分です。
https://faucet.metamask.io/

ちなみに、MetamaskでBuyボタンを押しても上記のサイトに飛ばされます。
詳しくは、
[Ethereum testnet (Ropsten)のアカウントを作成して1 ETH取得する手順](https://qiita.com/tmikada/items/cdc5a3871f655cb7b67d)
を参考にしてください。

## モバイルウォレット
モバイルウォレットには、今回Tachyonを使います。
イーサリアムに対応したスマホ用ウォレットです。テストネット上の独自トークンも管理することが出来ます。

https://itunes.apple.com/us/app/tachyon-wallet/id1321218464?mt=8&ign-mpt=uo%3D4

# 独自トークン発行までの流れ

- はじめに上の準備をします。Metamaskに独自トークンが発行できるだけのETH用意します。
- TokenFactoryにアクセスしトークンを発行します。
- 発行したトークンをMetamaskに送金します。(MetaMaskでは独自トークンを送金できないのでMEWに経由で送金をします。)
- Metamaskで作成したトークンを登録し、モバイルウォレットに送金します。
- 成功!!

# TokenFactory

以下のサイトで独自トークンを発行できます。
https://tokenfactory.surge.sh/#/factory

必要な情報を入れてCreateします。

![スクリーンショット 2018-05-28 10.39.11.png](https://qiita-image-store.s3.amazonaws.com/0/206272/a9932d2a-8f35-4925-3542-8fe577b5ac98.png)

発行されるまでしばらくまち、発行されたら自分のMetamaskのアドレスをコピーし
そこに送金するようにします。また、このとき、サイト上部に表示されている、Interacting with token at address: はあとで必要になるのでコピーしてどこかにメモっておきましょう。

![スクリーンショット 2018-05-28 10.45.00.png](https://qiita-image-store.s3.amazonaws.com/0/206272/b8a7a24f-c645-667c-dccb-6cfe660c6398.png)

送金するamountは発行したsupplyすべてなどにすると良いでしょう。
これで独自トークンがMetaMaskに送金されました。このままでは、MetaMaskで独自トークンを認識していないので、TokensボタンからAdd tokenをします。その際、発行されたコントラクトアドレスが必要になります。これは、先ほどInteracting with token at addressで保存したアドレスです。
AndroidStudio で `@SuppressWarnings` を自動挿入する

該当する警告名を調べる方法を調べてたらこれが見つかった。

抑止したい警告の上にカーソルを置いた上で

- Windows: <kbd><kbd>Alt</kbd> + <kbd>Enter</kbd></kbd>
- macOS: <kbd><kbd>Option</kbd> + <kbd>Enter</kbd></kbd>

で開くメニューの中から「Try to generify〜」のサブメニューを開くと、「Suppress〜」という始まりの項目がいくつかある。どのスコープで抑止するかによって項目を選ぶ。

ところで Suppress for statement を選んで知ったけど

```
//noinspection unchecked
```

なんでものもあるんですね。AS オリジナルっぽいのと、これ単体だと分かり辛いのでで使用する機会は限られそう。

参考
====

https://stackoverflow.com/a/17603987/4821980
java8でintの配列をintegerのListに変換

* java8でintの配列をintegerのListに変換する方法について躓いたのでメモ。

```java

public static void main(String[] args) {

    int[] array = new int[5];

    array[0] = 0;
    array[1] = 1;
    array[3] = 3;
    array[4] = 4;

    List<Integer> integerList = Arrays.stream(array).boxed().collect(Collectors.toList());
}

```
Backup  519 警告


'‎2018‎-‎05‎-‎25T15:30:24.803624300Z' に開始したバックアップ操作で、ボリューム '' のバックアップが失敗しました。イベントの詳細で解決策を確認し、問題の解決後にバックアップ操作を再実行してください。

って

ドコで確認するんだろ？？？
画像から日本の伝統色を取り出してみるライブラリ作った

# 画像から日本の伝統色を取り出してみる

## はじめに

こんにちわ、僕です。

今回は画像の中で専有している色を取り出す既存の `rgbaster.js` と、今回自分が作った `traditionalColors.js` を組み合わせてWebアプリを作ってみます。

## 成果物

イメージは以下にスクリーンショットを貼り付けましたが、画像の中の専有している色に近い「日本の伝統色」を返すという感じのWebアプリです。

<img width="1188" alt="スクリーンショット 2018-05-25 23.02.17.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/112929/e7b03f32-b79d-67b6-de05-a0d93ec5ce12.jpeg">

実際に動作する環境はこちらの[GitHub.io](https://ykhirao.github.io/traditional-color/)からどうぞ！！

「ファイルを選択」をクリックして適当な画像をブラウザにあげてみてください。そうするとJS/Canvasがごりごり動き出して色を判定してくれるはずです。

## 成果物2

イメージは以下にスクリーンショットを貼り付けましたがカラーピッカーを立ち上げて色を入力すると伝統色を返すWebアプリです。どうぞ遊んでみてください。 [GitHub.io](https://ykhirao.github.io/traditional-color/src/index.html) クリックできるのは上のほうのカラーピッカーだけです！

<img width="681" alt="スクリーンショット 2018-05-26 0.20.00.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/112929/d16f2474-89cf-35b0-fc9e-20dc593b8d72.jpeg">

## コード的な話

コードは https://github.com/ykhirao/traditional-color/ です。

```traditionalColor.js

;(function(window, undefined){
  "use strict";

  class TraditionalColors {
    constructor() {
      console.log("TraditionalColors is roaded !!!");
      this.colors = [] // 本当はここに伝統色のJSONが入っている
    }

    distance3D(a, b) {
      return Math.sqrt((Math.pow((a.r - b.r), 2) + Math.pow((a.g - b.g), 2) + Math.pow((a.b - b.b), 2)));
    }

    regExpToRgb(result, decimal=10) {
      const r = parseInt(result[1], decimal)
      const g = parseInt(result[2], decimal)
      const b = parseInt(result[3], decimal)
      return {r, g, b}
    }

    rgbStrToObj(str) {
      // from text "rgb(4,8,16)" to obj { r: 4, g: 8, a:16 }
      var result = /([0-9]{1,3}),([0-9]{1,3}),([0-9]{1,3})/i.exec(str);
      return result ? this.regExpToRgb(result) : null;
    }

    hexToRgbObj(str){
      // "#1234aa" to { r: 12, g: 34, a: aa }
      var result = /([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})([a-zA-Z0-9]{2})/i.exec(str);
      return result ? this.regExpToRgb(result, 16) : null;
    }

    getNearColor(rgb) {
      let i = 0,
        approximationIndex = 0,
        minDiff = Math.abs(this.distance3D(this.colors[0].rgb, rgb)),
        diff;

      while (++i < this.colors.length) {
        diff = Math.abs(this.distance3D(this.colors[i].rgb, rgb));

        if (diff < minDiff) {
          minDiff = diff;
          approximationIndex = i;
        }
      }
      return this.colors[approximationIndex];
    }
  }

  window.TraditionalColors = window.TraditionalColors || TraditionalColors;
})(window);
```

以上がtraditionalColors.jsですが、見てわかるように大したことはしていません。すべての伝統色との距離測って近いのを返却しているだけです。

使い方は

```index.html
<script src="./traditionalColors.js"></script> |
<script>
  const tc = new window.TraditionalColors();
  console.log(tc.getNearColor({r: 14, g: 12, b: 243}))
</script>
```

的な感じで、インスタンス変数を作ってメソッドを呼びせばいろいろ使えます。さくっと簡単なお遊びで作ったのですが、写真が趣味な人からすると結構楽しかったりします。

## 終わりに

rgbaster.js のソースコードを読むのは簡単でしたのでぜひ読んでみるといいかと思います。canvasの使い方も学べました。

## 参考

[rgbaster.jsを使って画像の色を抽出してみよう | 株式会社LIG](http://liginc.co.jp/web/js/other-js/130257)
C++ の json11 を使う (Read)

次のプログラムで作成した JSON を読みます。
[C++ の json11 を使う (Create)](https://qiita.com/ekzemplaro/items/2108876aa7ab411db315)

```cpp:json_read.cpp
// -----------------------------------------------------------------------
/*
	json_read.cpp

					May/28/2018
*/
// -----------------------------------------------------------------------
#include	<iostream>
#include	<fstream>
#include	<string>
#include	<cstring>
#include	<map>

#include "json11.hpp"
// -----------------------------------------------------------------------
using namespace std;
using namespace json11;

typedef	map<string,string> Unit;

// -----------------------------------------------------------------------
string file_to_str_proc (char file_in[])
{
	string chunk = "";

	ifstream ifs (file_in);
	string buf;

	while (ifs && getline (ifs,buf))
		{
		chunk += buf;
		}

	return	chunk;
}

// -----------------------------------------------------------------------
void dict_display_proc (map <string,Unit> dict_aa)
{
	map <string,Unit>:: iterator it = dict_aa.begin ();

	while (it != dict_aa.end ())
		{
		Unit unit_aa = (*it).second;

		cout << (*it).first << "\t";
		cout << unit_aa["name"] << "\t";
		cout << unit_aa["population"] << "\t";
		cout << unit_aa["date_mod"] << endl;

		it++;
		}
}

// -----------------------------------------------------------------------
map <string,Unit> json_to_dict_proc (string str_json)
{
	map <string,Unit> dict_aa;

	string err;
	auto json = Json::parse(str_json, err);

	if (!err.empty())
		{
		printf("Failed: %s\n", err.c_str());
		}
	else
		{
//		printf("Result: %s\n", json.dump().c_str());

		for (auto &kk : json.object_items())
			{
			string key = kk.first.c_str();
			Unit unit_aa;
			for (auto &ll : kk.second.object_items())
				{
				{
				string key_item = ll.first.c_str();
				string vvx = ll.second.string_value();
				if (vvx.length() == 0)
					{
					vvx = ll.second.dump().c_str();
					}
				unit_aa[key_item] = vvx;		
				}
			dict_aa[key] = unit_aa;
			}
		}

	return	dict_aa;
}

// -----------------------------------------------------------------------
int main (int argc, char* argv[])
{
	cerr << "*** 開始 ***\n";

	char file_in[160];

	strcpy (file_in,argv[1]);

	string str_json = file_to_str_proc (file_in);

	map <string,Unit> dict_aa = json_to_dict_proc (str_json);

	dict_display_proc (dict_aa);

	cerr << "*** 終了 ***\n";

	return 0;
}

// -----------------------------------------------------------------------
```

```text:Makefile
CPLUS_COMMON=/var/www/data_base/common/cplus_common
json_read: json_read.cpp
	clang++ -o json_read json_read.cpp -ljson11
clean:
	rm -f json_read
```

実行コマンド
./json_read cities.json
```
Windows向けにファイル名をShift-JISでZIP圧縮する（with zipfile)

# なにをするのか

python3でzipfileを使って日本語名のファイルをフォルダ事圧縮した場合、Windowsのエクスプローラーで解凍するとzipされたファイルが文字化けしてしまう。

# 原因

Windowsのエクスプローラーを使ってのzip解凍はShift-JIS(cp932)で解釈するため、zipfileモジュールを使った圧縮（UTF-8）だと、文字化けが発生する。つまりzipする際のファイル名のエンコードをShift-JISに指定すればOK。ただ、そんなオプションはなかったのでzipfileモジュールを直接いじる必要がある。

ちなみにLhaplusなどのちょっと賢い圧縮解凍ソフトならUTF-8でもちゃんと理解できるんだけどね。

**あくまでその場しのぎの方法です、自己責任でご利用ください**

# 環境
Python 3.6.3

# やり方

①まずソースコードをコピー

 https://github.com/python/cpython/blob/3.6/Lib/zipfile.py

②以下修正を加える

```py
# 430行目あたり~ 
    def _encodeFilenameFlags(self):
        try:
            return self.filename.encode('ascii'), self.flag_bits
        except UnicodeEncodeError:
            #return self.filename.encode('utf-8'), self.flag_bits | 0x800 #この行をコメントアウト
            return self.filename.encode('cp932'), self.flag_bits #Shift-JIS(cp932)を指定する。
```

③実行プロジェクトと同一のフォルダに設置して後は呼び出すだけ。

# ※注意事項※ モジュール呼び出し順序について

今回標準モジュールを作りなおしてるのだが、もともとのzipfileはPYTHONPATHに含まれる。
sys.pathでpathを通しても先に標準モジュールが呼び出される。
そのため同一フォルダに設置するなど、優先順位をあげるか別名で保存する必要がある。

参考までにファイルの検索順は以下の通りとなっている。
> 1. 実行中のファイルと同じフォルダ
> 2. カレントフォルダ
> 3. 環境変数「PYTHONPATH」に列挙したフォルダ
> 4. sys.pathに登録してあるフォルダ

# 参考

moduleのimportの仕組み
http://python.matrix.jp/pages/tips/import.html#id3
Ansible

# Ansible

## 公式サイト

 [Ansible](https://www.ansible.com/)
 [ドキュメント](http://docs.ansible.com/)

## Ansibleとは

 - OSSの構成管理システム
 - シンプルな構造

## Ansibleの環境構築
- Ansible2.7：2019/01/25時点に更新

### 管理ホスト
 
- OS：Linux, Mac
- ~~Python 2.6+ (Python 3.x is not supported)~~
- Python 2.7 or Python 3.5+

### 被管理ホスト

 - OS：Linux, Mac, Windows
 - ~~Python 2.5+ (Python 3.x is not supported)
  (2.4 + python-simplejson)~~
 - Python 2.6+ or Python 3.5+

## Ansibleの構成要素

### インベントリ (inventory)

 - 被管理ホストへの接続情報を記述するファイル
 - グループ管理も出来る

```sh:hosts
  [web]
  www.example.com ansible_user=demo1 ansible_ssh_pass=p@ssw0rd1
  www.example.net ansible_user=demo2 ansible_ssh_pass=p@ssw0rd2

```

|パラメータ|意味|デフォルト|
|:--|:--|:--|
|ansible_host|エイリアス||
|ansible_port|SSH接続先のポート|22|
|ansible_ssh_private_key_file|秘密鍵のファイルパス||
|ansible_become_pass|sudoを実行する際のパスワード||
|ansible_python_interpreter|被管理ホストのPythonのパス|/usr/bin/Python|


### モジュール (module)

 - ユーザを追加するなどの冪等性を持った操作

#### ansibleコマンドの実行

```sh

  ansible -i {イベントファイルのパス} {対象ホスト} -m {モジュール名}

```

```sh

  ansible -i hosts all -m ping

```

|パラメータ|意味|デフォルト|
|:--|:--|:--|
|--user ユーザ名|被管理ホストでコマンドを実行するユーザ|ansible_user > ansibleコマンドを実行したユーザ|
|--ask-pass|SSH接続時にパスワードを要求|ansible_ssh_pass|
|--become|モジュールをsudoで実行|-|
|--ask-become-pass|sudoで実行するためのパスワードを要求|ansible_become_pass|

### プレイブック (playbook)

 - DBサーバを作るなどの目的の為にモジュールを組み合わせて作った手順書
 - YAML形式で記述

```sh:pb1.yml

  - hosts: all
    become: yes
    become_user: root
    tasks:
      - user: name=demo
      - copy: src=/home/hoge/fuga.txt dest=/home/demo/

```

#### プレイブックの実行

```sh

  ansible-playbook -i hosts pb1.yml

```

#### その他
- 下書きが一杯になったので、とりあえず(中途半端な内容ですが、、、)投稿します。
CloudFormationのEC2Role変更で気をつけること


AutoScalingGroupのIAMRoleを変更した際エラーが発生しロールバックしてしまったので原因と対策を書き留めておきます。たまにやりそうなシチュエーションなので参考にして下さい。

## 環境
* CloudFormationスタックでAutoScalingGroupを作成
* MinSize & MaxSizeはどちらも1台
* IAMRoleを適用

## 実施内容
　CloudFormationコンソールの「スタックの更新」で、既にあるIAMRoleとは異なるRoleに変更し適用

### エラー内容

```
The following resource(s) failed to update: [AutoScalingGroup].
``` 

### 原因

Roleが変更される際、AutoScalingGroup内部で新しいRoleのEC2が立ち上がり、元のEC2を消す手順を踏むらしい。そのため、MaxSizeを1にしていると新たなEC2を立てることができずロールバックしてしまう。


### 対策

対策は２パターン
　1つは、一度AutoScalingGroupのMinSize,MaxSizeを０台に変更し、その際にRoleも変える方法
こうすることで一時的に全てのEC2が落ちてしまうというデメリットはあるが、Role変更でエラーにならない

もう１つはMaxSizeを２台に変更した後にRole変更を行う方法。
こちらは今回の原因であるMaxSizeの制限を取り払う方法で、EC2を立ち上げつつRole変更を行うことが可能
Linuxの基本について初心者でも分かるようにまとめてみた　rootユーザって何？編

こんにちは。
Linuxについて勉強しているときに、
「rootユーザって何？」だとか
「コマンドを打つ時に表示される記号って何？」だとか
疑問に思ったので、調べた結果をまとめてみました。

# rootユーザとは

rootと言えば根っこ。根っこと言えば植物の中でも重要な部分。
Linuxのrootユーザも、Linuxにとってとても大事なところです。

具体的には例えば他のユーザーのパスワードを書き換えることができます。
これだけでもかなり大きい権限を持っていることが分かると思います。
けれども、rootユーザの権限はそんなものじゃなくて、その気になれば全データ削除も可能です。

# rootユーザのセキュリティにはご用心

こんな感じで、rootユーザはものすごい力を持っています。
つまりrootユーザってとても重要なのです。

ということは、基本rootユーザはパスワードで守られることになります。
言い換えるとそのパスワード、外部に漏れるととんでもないことになりかねません。

セキュリティには十分注意してください。

# セキュリティを守るための工夫

セキュリティが心配だなあ。守れるかなあ。このように思った方はいらっしゃると思います。

セキュリティを守るためには、一般ユーザを普段は使用するのが安心です。
一般ユーザとはrootユーザよりももっと権限が少ないユーザのことです。

# 今使っているのはrootユーザ？一般ユーザ？

もしかすると、「そういえば、今使っているのは一般ユーザで大丈夫だよね？rootユーザだったらどうしよう。」
このようにふと疑問に思う瞬間があると思います。

見分け方は複数あるとは思いますが、そのうちの一つが``#``だとか``$``だとかいう記号です。

入力する際、コマンドのすぐ左で見られるこれらの記号、実は、rootユーザか一般ユーザかによって違うみたいです。

rootユーザには``#``がつきます。
プログラミングをする際、よくidなら``#``をつけますよね。それと関連付けると理解しやすいと思います。

対して一般ユーザの場合には``$``がつきます。
場合によっては``%``がつく場合もあるそうです。

# よく使うsudoって一体どういう意味？

さて、Linuxを使う際、``sudo`` から始まるコマンドを入力する機会も多いと思います。
``sudo``って何だ？とお考えの方もいると思います。

これは、一般ユーザに一時的にrootユーザ並みの権限を与える時に使います。
つまりこれをすることで、普通一般ユーザにはできないアップグレードなどをすることができます。

# まとめ

以上、Linuxの基本をrootユーザに関してを中心にご紹介しました。

参考になればと思います。
シェルスクリプトでpsql使用時にパスワードを聞かれないようにする。

シェルスクリプトでpsql使用時にパスワードを聞かれないようにする。

PGPASSWORDをエクスポートする。
```
export PGPASSWORD=postgres
psql -U postgres dbname -c "select * from tbl;"
```
ユーザ名とデータベース名をエクスポートするときは以下。
export PGDATABASE=dbname
export PGUSER=postgres
Ubuntu18.04 LTS Serverインストール時hostnameを恒久的に変更する

# ubuntu18.04でhostnameを変更する

## 前提条件
- 使ったisoはubuntu-18.04-live-server-amd64.iso
- http://ftp.riken.go.jp/Linux/ubuntu-releases/18.04/

## 手順

1. `/etc/cloud/cloud.cfg`の`preserve_hostname`をtrueにする
    - `preserve_hostname: true`
2. `hostnamectl`からhostnameを変更
    - `hostnamectl set-hostname yourhostname`
3. rebootして設定が反映されているか確認

## どうして
- (私の環境だけかもしれないが)Ubuntu18.04だとcloud.cfgの変更をしないとhostnameの変更ができなかった
    - 一応基盤の差じゃないかと思ったのでOpenstackとESXi双方で検証した
- Ubuntu16.04でもデフォルトでは`preserve_hostname: false`になっているものの、ここをtrueに変えずともhostnameの変更がreboot後も維持できる。

## 参考
- https://websiteforstudents.com/updating-changing-the-hostname-on-ubuntu-18-04-beta-server/
- https://askubuntu.com/questions/1028633/host-name-reverts-to-old-name-after-reboot-in-18-04-lts
TypeScript Sampleをやってみるその４


## はじめに
TypeScriptの強力な機能としてインターフェイスを定義することができます。インターフェイスはInterfaceキーワードを用いて定義します。クラスのインターフェイス実装はimplementsキーワードを用いて定義します。インターフェイスサンプルを試した備忘録を投稿します。提供されているサンプルでは出力するコード部がないので、htmlと出力のコーディングをおこないます。

## 前提

* [Visual Studio Code](https://code.visualstudio.com/download)がインストール済み
* [Node.js/npm](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)がインストール済み
* gitから[Sampleをダウンロードして](https://github.com/Microsoft/TypeScriptSamples/archive/master.zip)任意のディレクトリに解凍済み
* View In Browserがインストール済み(Market Placeより)
* OSはWindows7/10を想定

## サンプル interfaces
ブラウザへインターフェイスをインプリメントしたクラスの結果を出力するサンプル。

## ファイル構成
|パス|ファイル名|説明|
|:--|:--|:--| 
|.|index.html|ブラウザ出力用のhtml (新規追加)|
|.|interfaces.js|interfaces.tsのコンパイルにて作成されたJavaScriptファイル|
|.|interfaces.js.map|interfaces.tsのコンパイルにて作成されたmapファイル|
|.|interfaces.ts|インターフェイスサンプルのTypeScriptファイル|
|.|README.md|このサンプルの説明と使用方法|
|.|tsconfig.json|TypeScriptのコンパイルコンフィグファイル|

## クラス・インターフェイス・オブジェクト図
![TS_013.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/cd27df81-5201-1c6d-f467-ebc05c0a148e.jpeg)

## 追加
``` TypeScript:interfaces.ts
var myCar = new Car();
myCar.start();
myCar.drive(1000);
document.getElementById("box").innerHTML = "My Car Distance Posion : " + String(myCar.getPosition()) + " Km";
```
` 最終行に上記を追加 `

``` html:index.html
<!DOCTYPE html>
<html>
  <style>    
    body {font-family: 'Segoe UI', sans-serif }
    body {font-size: 24px; }
  </style>
  <body>
  <div id="box"></div>
  <script src="interfaces.js"></script>
  </body>
</html>
```

## 実行
```
cd ./interfaces
tsc --sourcemap interfaces.ts
```
`index.htmlをエディターで表示`<kbd>Ctrl+F1</kbd> 

## 結果
![TS_014.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/cc55d803-bbb9-caf2-515a-88f4483ba661.jpeg)

## ポイント
interfaceにてメソッドまたはプロパティの型を指定して定義します。この型を定義することにより、classで実装するinterfaceの実体（処理するコード）となるメソッドの戻り値との整合性が担保されます。ある意味、C言語系と比較するならば、ヘッダーがinterfaceであり、Cコードがclassと対応するかのようです。ただ、C言語系は、Cコードにincludeでヘッダーを指定することで外部ファイル化できますが、TypeScriptは同一ファイル内でinterfaceを定義する必要があります。そしてインターフェイスのメンバーはすべてパブリックになります。

## ノート
interfaceの基本構造をメモしておきます。
InterfaceでClassのメンバーの型をあらかじめ定義します。
![TS_018.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/925b63f7-95e4-cf5f-db05-7fdbaa2f69cf.jpeg)

## まとめ
開発プロジェクトで変数の型をきっちりと定義することは重要です。
MicrosoftがやりたかったことはJavaScriptの型の曖昧さからの脱却にほかならないような気がします。
TypeScriptの重要な機能としてインターフェイス定義はエポックメイキングに違いありません。
もちろんクラスを利用するための第一段階としての位置づけであることも忘れてはなりません。

以上、おそまつ
退屈なFlutter開発ショー（The Boring Flutter Development Show [Pilot Episode]）

# The Boring Flutter Development Show [Pilot Episode]

Flutter開発者向けのGoogle公式番組が突然YouTubeで始まりました！しかも始まり方がおかしい！

番組のタイトルを直訳すると「退屈なFlutter開発ショー」

https://youtu.be/yr8F2S3Amas

## GOOGLE DEVELOPERS TEST BROADCAST
<img width="1262" alt="GOOGLE DEVELOPERS TEST BROADCAST" src="https://qiita-image-store.s3.amazonaws.com/0/129712/508c4b05-98a9-46ac-d330-acb8b7e5f78e.png">

こんな始まり方でまるで昔のテレビのような雰囲気

## THE BORING FLUTTER DEVELOPMENT SHOW
<img width="631" alt="THE BORING FLUTTER DEVELOPMENT SHOW" src="https://qiita-image-store.s3.amazonaws.com/0/129712/49917d15-4b82-6ff1-5808-7c41259b3c34.png">

こちらもブラウン管テレビに映したような懐かしい雰囲気の映像

## 番組紹介

Andrew と Filip というGoogleのエンジニアが出てきてライブコーディングを始めます

うしろにあるホワイトボードには

> This is a whiteboard!

って書いてある

ホワイトボードにどんなアプリを作るか描いた後、Android Studioを起動してアプリを作り始めます。途中でももう一度動きを説明するためにホワイトボードを使います。

ライブコーディングしながら説明してくれるのでわかりやすいです。

## 学べること

* ListView, Text, TextStyle, PaddingなどなどWidgetの基礎
* 基礎的なレイアウトの組み方
* Flutterプラグインの探し方
* url_launcherプラグインでURLを開く
* ExpandableListViewをFlutterを使って一から作る
* PullToRefreshを実装

# 所感
一度もFlutterを触ったことがない方でライブコーディングを見ながら写経して学びたい方におすすめ。オープニングがちょっと変わってて面白いのを予想していたがそこは少し期待はずれでしたが、内容は良いです。

今回はパイロット版ということで、今後別のエピソードも公開するそうなので続編に期待！
D3.jsはバージョンに気をつけて

D3.jsを勉強し始めた際、
バージョンの部分ではまったポイントがありました。
自分と同じくD3.jsを使い始める方を対象に情報共有したいと思います。

# はじめに

本題に入る前に、D3.jsってなんぞや？ってところをざっくり触れていきたいと思います。

- JavaScriptで作成された、SVG・canvasの描画するためのライブラリ
- JQueryのようにセレクタ指定での操作が可能
- 昨今だと、データ可視化（グラフとか）のために使用されていることが多い

詳しいことは、以下の記事で解説されています。

- [Qiita - D3.jsの概要と使い所について](https://qiita.com/m_ohsumi/items/8d66e1a1df9e2d64fef6)

自分は、D3.jsを学び始めるまで、グラフ描画のためのライブラリと勘違いしていました。
あくまで、**SVG・canvasの描画するためのライブラリ**ということを、
上記記事から理解することができました。

## JSのグラフ系ライブラリ

D3.js以外にも結構あるんです。
Qiitaにて、すでにまとめられている記事がありました。
割と最新めな記事を以下に抜粋しましたので、一読いただければ幸いです。

- [Qiita - チャート、グラフを書くのに良さそうなJavascriptライブラリ6選](https://qiita.com/awakia/items/d064c772b759333c209a)
- [Qiita - グラフ描画にオススメなJavaScript Package](https://qiita.com/hurutoriya/items/727296839a2ec638fdc4)

また、Highchartsについては、情報とか特化した記事を書いてますので、
興味がありましたら合わせて読んで見てください。

- [Qiita - JSライブラリ highcharts.jsの紹介と技術メモ](https://qiita.com/zaki_zaki/items/816eddaaa92e9db9e742)

## D3.jsを元にグラフ描画に特化したライブラリ「C3.js」

見出し通りですが、**C3.js**というグラフ描画に特化したライブラリも登場していますので、
紹介だけしておきますね。公式ページは下記になります。

- [C3.js D3-based reusable chart library](http://c3js.org/)

# 本題

## バージョン

D3.jsの現在(2018/05時点)のバージョンはv5になりますが、
v3→v4で大きくAPIの名前や関数の使い方などの見直しが入りました。

抜粋するとこんな違いがあります。

### 例）目盛りが上方向に表示されるX軸の線を定義

```javascript:v3
var axisTop = d3.svg.axis().orient("top");
```
```javascript:v4とv5
var axisTop = d3.axisTop();
```

### 例）属性の変更

```javascript:v3
d3.select("svg")
  .axis({
    "data-sample1": "1",
    "data-sample2": "2"
  });
```

```js:v4とv5
d3.select("svg")
  .axis("data-sample1", "1")
  .axis("data-sample2", "2");
```
思ったより違いがはっきりしていますよね。上記はあくまで一例になります。
バージョン違いのことについて、詳しく解説してくださっているスライドがありましたので、展開しますね。

[slideshare - 細かすぎて伝わらないD3 ver.4の話](https://www.slideshare.net/xxshimizuxx/d3-ver4)

また、[GitHubのリポジトリ→Gallary](https://github.com/d3/d3/wiki/Gallery)からD3.jsのサンプルを閲覧することができます。
参考にする際、読み込んでいるD3.jsのバージョンに注意してください。

# Tips

## 勉強方法、実現方法の探し方

基本的には、[Gallary]()からやりたいことと同じ動作をするサンプルコードを見つけ、
それを参考に実装していく形で大丈夫と思いますが、
色々な要素（ズーム＋ツールチップ＋etc...)を組み合わせて実装したい場合、
D3.jsの機能をある程度勉強しておく必要があります。

自分は、勉強する際に以下のサイトを利用させていただきました。

- [D3.js v4/5 使い方 徹底攻略](https://wizardace.com/)

タイトル通り、v4v5でのD3.jsの使い方の記事を投稿されています。

## 修正BSDライセンス

ついでにライセンスについて触れて起きたいと思います。

ライセンスは[GitHub](https://github.com/d3/d3/blob/master/LICENSE)記載されている通り、**修正BSDライセンス**になります。
ライセンス表記さえしておけば、問題なく商用利用可能です。

- [修正BSDライセンスとは](http://wa3.i-3-i.info/word16498.html)
Qiitaの記事一覧をCLIで取得/選択してブラウザで閲覧できるようにしてみた

# 百聞は一見にしかず

![qiita.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/148373/210bb0ac-45cd-0b62-7e0e-dc2c7dd87a32.gif)

# TL;DR

- Rubyでコンソールの画面制御
- スクレイピング(Nokogiri)で記事取得
- 最低限の機能を実装しただけの醜いコードを公開してあります...

# これはなに？

「毎日のように閲覧するQiitaをコンソールから開ければ便利なのでは？」
と思い、なんとなく触れたことのある技術で作れそうだったため作ってみたものです

## 使用したもの

```
ruby 2.3.3
gem nokogiri
gem curses
```

# どうやってるの？

## 画面制御
コンソールの画面制御には`curses`というgemを用いました

この`curses`ですが、あまり資料が転がっていなかったため、
個人的にメモとしてまとめてみました

[Rubyでコンソールの画面制御をしよう](https://qiita.com/halspring/items/525d78fb8fba3cc052c5)


## 情報取得

Qiitaから情報を取得するために、`Nokogiri`というgemを使用しました
Webサイトから情報を抽出する技術のことをスクレイピングといい、`Nokogiri`を使うことでスクレイピングが簡単に出来ちゃいます

動的なコンテンツから情報を抽出したり、見やすい形に整形して出力したりできるので、
株価の取得だとかニュースの見出し一覧を取得するなど使い方は様々です
筆者は過去に大学の休講情報をスクレイピングしたりしてました


このあたりを参考にするといいと思います
[Nokogiriを使ったRubyスクレイピング [初心者向けチュートリアル]](https://morizyun.github.io/blog/ruby-nokogiri-scraping-tutorial/index.html)
筆者もお世話になりました

ただし、スクレイピングには法的なお話がついて回るので、注意しましょう
[Webスクレイピングの法律周りの話をしよう！](https://qiita.com/nezuq/items/3cc9772118ad112c18dc)

# ソースの公開/配布
最低限の機能の動作確認をした段階のコードを公開しています
[GitHub](https://github.com/halspring/cui_qiita)

ですのでリファクタリングもしておらず非常に汚い状態なので正直、恥部を晒している気分です...

が、醜いコードを晒したほうがたくさんの指摘やアドバイスが貰えるのでは？~~という言い訳もちゃんと考えております~~

## 使用方法
`Nokogiri`と`Curses`のgemのインストールし、`qiita_cui.rb`を実行してください

操作方法

- p : カーソル移動(上)
- n : カーソル移動(下)
- f : 次ページ
- b : 前ページ
- q : 終了
- Enter : 決定
- [Sort] : 投稿順/最新いいね順の切り替え
- [Search] : 検索ワードの変更(タグ検索なので現状1つのキーワードのみ)

## 知りたいこと

- より良い実装
- 高速化手法
- Rubyの実行ファイル化 <br>コマンドひとつで動かしたい(エイリアス以外) 
- 矢印キーでの入力
- これ法的に大丈夫？(スクレイピングだし)

# おわりに

筆者、まだまだ未熟者ですので、いろいろとご教授いただければと思います
QiitaにはAPIがありますので、スクレイピングが利用規約的に色々あぶなければ公開を停止します
~~というかAPI公開されてるんだからそっち使えばいいじゃん~~
Web3.js でプロバイダが MetaMask かどうかをチェック

```js
web3.currentProvider.isMetaMask
```

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Web3.js_でプロバイダが_MetaMask_かどうかをチェック
MetaMask を使用した Web3 の初期化

* MetaMask は Chrome プラグインとして使える大変便利な Ethereum ウォレットです。
* MetaMask を使用するとボタン 1 つでトランザクションに署名ができるので、エンドユーザーが DApps を使用する際に重宝します。

# MetaMask を使用した Web3 の初期化
* MetaMask をアンロックした状態で、Web3 ライブラリを使用しているウェブサイトを開くと、web3 というグローバル変数に自動的に Web3 オブジェクトがインジェクトされます。
* 通常、web3 にセットされたオブジェクトをそのまま使用するのではなく、次のような方法で初期化します。
* なお、MetaMask の github によると、ブラウザの load イベントで MetaMask のインジェクトが行われるようです。

```js
var web3js;	// ローカルの Web3 オブジェクトを格納するための変数
window.addEventListener('load', function() {
  // Web3 が Ethereum 対応ブラウザ （Mist や MetaMask） によってインジェクトされているかどうかをチェックします。
  if (typeof web3 !== 'undefined') {
    // Mist または MetaMask のプロバイダを使用して Web3 を初期化します。
    web3js = new Web3(web3.currentProvider);
  } else {
    // Mist や MetaMask 等の Ethereum 対応ブラウザを使用していない場合の初期化です。
    // 必要に応じて、ローカルノードやホスティングしているノード等を使用します。
    // 以下の例では infura.io をプロバイダとして使用し、Web3 を初期化しています。
    web3js = new Web3('wss://mainnet.infura.io/ws');
  }
});
```

# References
* https://github.com/MetaMask/faq/blob/master/DEVELOPERS.md
* https://github.com/MetaMask/faq/blob/master/detecting_metamask.md

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/MetaMask_を使用した_Web3_の初期化
Server Side SwiftをDockerコンテナ上で動かしてみる

## Swiftがインストールされているイメージを探す

https://hub.docker.com/explore/

![20180104184734.png](https://qiita-image-store.s3.amazonaws.com/0/92771/654e7905-69ed-49d4-edc5-00cd24173c8e.png)

で対象のSwift Versionを見つける。swiftで検索するといくつかのイメージが見つかる。
今回はdocker-swiftで提供しているイメージを使う。

## Dockerfile

サンプルプロジェクトはVapor + SwiftPMで構成されているので、各種設定ファイルをコンテナ上でコピーします。

```
FROM swift:4.0.3
USER root
RUN mkdir -p /server
COPY ./Config /server/Config
COPY ./Sources /server/Sources
COPY ./Makefile /server/Makefile
COPY ./Package.resolved /server/Package.resolved
COPY ./Package.swift /server/Package.swift
ENV PORT 9000
EXPOSE 9000
WORKDIR /server
RUN make build
CMD ["make", "run"]
```
サンプルプロジェクトは以下にあります。
https://github.com/Nonchalant/VaporProtobufSample


## Swift Core Library
- https://github.com/swiftdocker/docker-swift/blob/master/4.0/Dockerfile#L1

今回のベースイメージにしたswift:4.0.3はubuntuで動いています。macOSとLinuxOSで動くSwift Core Libraryは別物です。

- https://github.com/apple/swift-corelibs-foundation

LinuxOS用のFoundationは実装途中なので一部使えない機能((URLSessionなどが一部使えません。実装ステータスは[Status.md](https://github.com/apple/swift-corelibs-foundation/blob/master/Docs/Status.md)で確認できます))があるので、macOSで開発する際も時々LinuxOSで動くDockerコンテナで確認するとよいと思います。実装されていない機能はCライブラリなどで代替するしかなさそうです。
Web3.js で現在のハッシュレートを確認

* web3.eth.getHashrate を使用します。

# サンプルコード

```js
web3.eth.getHashrate()
.then(console.log);
// => 1234
```

# Reference
* https://scrapbox.io/web3-jp/web3.eth%23getHashrate

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Web3.js_で現在のハッシュレートを確認
Swift - ProtocolBuffersをはじめる

個人用のメモ書きです

## 環境

Swift: 4.0.3

## protobufのインストール 

```shell
$ brew install protobuf
```

## Appleが提供しているプラグインを使う

```shell
$ git clone https://github.com/apple/swift-protobuf.git
$ cd swift-protobuf
$ git checkout tags/1.0.2
$ swift build
```

## ビルドしたプラグインを指定して、.protoファイルをコンパイル

```shell
$ $ protoc --plugin=protoc-gen-swift=.build/debug/protoc-gen-swift --swift_out=. *.proto
```

## パスを通しておく

```shell
$ mkdir ~/.protoc
$ cp .build/debug/protoc-gen-swift ~/.protoc/protoc-gen-swift
$ echo 'export PATH=$PATH:$HOME/.protoc' >> ~/.zshrc
$ source ~/.zshrc
```

## Option

アクセス修飾子などの各種オプションは`--swift-opt`で設定することができます。詳細は以下で確認できます。

https://github.com/apple/swift-protobuf/blob/master/Documentation/PLUGIN.md

## 参考

https://speakerdeck.com/kyoheig3/protocol-buffers
サスペンド復旧のマウス無効に出来なかった話

Ubuntuさんのサスペンド時にマウスが少し動いただけで復旧してしまい。いらいらしたことないですか？
それを解決しようとぐぐってみると
https://atsuoishimoto.hatenablog.com/entry/20120711/1341992902
こちらのような記事があったり、
「楽勝そうやん」と思った中、

```shell-session
$ echo EHC1 > /proc/acpi/wakeup
zsh: 許可がありません: /proc/acpi/wakeup
```
!?!?
許可がなければsudoをつければいいじゃない

```shell-session
$ sudo echo EHC1 > /proc/acpi/wakeup
zsh: 許可がありません: /proc/acpi/wakeup
```
!?!?!?
sudoしても許可が降りないなんてことあるんですね。。。

ってことで更にググったものの日本語の情報がない。。。
その時、英語のそれっぽい情報をみつけました。
https://ubuntuforums.org/showthread.php?t=814939&page=3

```shell-session
$ sudo sh -c "echo EHC1 > /proc/acpi/wakeup"
```
ってやってみなよ
みたいなことが書いてある！！！

なんかよくわからないけどものは試し！

ってことで行けましたー
日本語の情報が少なすぎたので
これはQiita案件なのではと思い、初投稿
各種リンクは勝手にはっちゃいましたので、なにか問題があれば早急に対処します。
ではでは、はっぴーうぶんつらいふ
ルーティング概要

# はじめに
ネットワーク屋さんが1年目に必ず勉強することになる、ルーティングについて書きます。本稿はIP/Ethernet環境のみを想定しているため、IPアドレスやMACアドレスが通信に必須のものとして書いています。

# ルーティングの目的
イーサネット環境においてルーティングの目的は、適切な宛先にフレームを届けることです。処理の順をおおまかに書くと、次のような流れになります。

①入力インターフェースでフレームを受信する。
②フレームの宛先MACアドレスを確認し、自分宛であればフレームを分解してパケットを取り出す。
③宛先IPアドレスに基づいて**ルーティングを行い**、出力インターフェースと宛先MACアドレスを決定する。
④新しいフレームを生成し、出力インターフェースから送信する

この流れから分かるように、「出力インターフェース」「宛先MACアドレス」の2つを決めることがルーティングの仕事です。

## 出力インターフェースが決まるまで
パケットには宛先IPアドレスが書かれています。この宛先IPアドレスをルーティングテーブル上で確認します。ここでダイレクトコネクトの場合とそれ以外とで処理が分かれます。

①ダイレクトコネクトの場合
ルーティングテーブルには出力インターフェースが書かれています。出力インターフェースからARP要求を投げることで宛先MACアドレスを得ることができます。

②ダイレクトコネクト以外の場合
ルーティングテーブルにはNexthopが書かれています。出力インターフェースを得るために、Nexthopをルーティングテーブル上で再度確認します。Nexthopは（ほとんどの場合）ダイレクトコネクトになっているはずなので、2度目の処理で出力インターフェースを得ることができます。出力インターフェースからNexthopに対してARP要求を投げることで、宛先MACアドレスを得ることができます。
iOS Simulatorで音を鳴らしたときにイヤホンの音が小さくなる問題を解決する！

イヤホンにマイクがついているケースで発生する。サウンドの入力を内蔵マイクに変更すると治る！

![20180116172710.png](https://qiita-image-store.s3.amazonaws.com/0/92771/74ebfc01-ad9e-0e35-9e53-e7ae44977efc.png)
UIの更新をメインスレッドで実行する

Swiftのバージョンが変わってDispath周りもよく書き方が変わるのでメモ

## 環境

Swift: 4.0.3

## Code

```swift
DispatchQueue.main.async {
    // UIを更新する処理
}
```

## Reference

[DispatchQueue - Dispatch | Apple Developer Documentation](https://developer.apple.com/documentation/dispatch/dispatchqueue)
最近やってるやつメモ

https://cloud.google.com/ml-engine/docs/flowers-tutorial?hl=ja
のチュートリアル
チュートリアルの画像データはすでにgcsにアップロードされているので特に用意するものはない。
カスタムする前に愚直にやったほうが良さそう。

Docker使って作業環境作っている。
pythonは2で最後まで大丈夫なのでpyenvとか入れずにcentos:latestのdocker imageに入っているデフォのpython使う。

とりあえずpdとvariablesが出来上がったのでtensorflow-lite形式に変換したい。
変換にはtocoが必要なのでtocoをビルドするためにbazelインストール

# 環境
Docker
centos

# centosのセットアップ

```
docker pull centos:latest
docker images
```

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              e934aafc2206        7 weeks ago         199MB
```

今いるディレクトリをsrvにマウントしてdockerへ入る

```
docker run -v (pwd):/srv -t cents:latest /bin/bash
```


# チュートリアル

コピペでやる

# toco (tensorflow lite)のインストール

`yum install java-1.8.0-openjdk-devel`

```bash:.bash_profile
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/
export JAVA_HOME
```

```
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
bazel build --jobs 1 tensorflow/contrib/lite/toco:toco
```

# tocoでtflite形式に変換

```
bazel-bin/tensorflow/contrib/lite/toco/toco --savedmodel_directory=/srv/cloudml-samples-master/flowers/result/ --output_file=/srv/cloudml-samples-master/flowers/result/lite.tflite --input_arrays=input --input_shapes=1,224,224,3
```

うまくいかない、多分input_arraysとinput_shapesが適当なのがだめ


# リンク

TensorFlow Liteを使ってモバイル向けに最適化された機械学習モデルを動かしてみる
http://blog.gclue.com/?p=836

tocoのドキュメント
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/toco/g3doc/cmdline_examples.md#savedmodel

tocoのビルドでjobs-1すればいいという情報の出処
https://github.com/tensorflow/tensorflow/issues/349

bazelのバイナリ、重くてaxelで無理やり落とした
https://github.com/bazelbuild/bazel/releases

multcloud、urlから直にgoogle driveに落とせる
https://www.multcloud.com/jp/

centosにbazel入れる
https://www.hpc-technologies.co.jp/faq-201707-01

centosにbazel入れるやつ、この通りにやった
https://knowledge.sakura.ad.jp/6174/
Xcodeの検索機能まとめ

![20170326174253.png](https://qiita-image-store.s3.amazonaws.com/0/92771/3b8e0f31-7fce-dc76-1b56-6d2889479636.png)

Xcodeの検索機能には様々な機能があります。意外と知らない人も多いかもしれないのでまとめます。

## 検索範囲

![20170326174812.png](https://qiita-image-store.s3.amazonaws.com/0/92771/8f7e876e-39fb-6e0c-3740-51dba2d0b89a.png)

検索ボックスの下のプロジェクト名の部分を選択すると選択範囲をファルダ/ファイル単位で設定ができます


## 大文字と小文字の区別

![20170326174355.png](https://qiita-image-store.s3.amazonaws.com/0/92771/c01aed95-7396-de6f-8b21-cbaad93a6e8a.png)

### Ignoring Case

大文字と小文字を区別しないで検索

### Matching Case

大文字と小文字を区別して検索


## 一致条件

![20170326174947.png](https://qiita-image-store.s3.amazonaws.com/0/92771/5f5aefeb-8bf4-a3b8-129e-f514a0a6c1b2.png)

### Containing

部分一致

### Matching

完全一致

### Starting With

前方一致

### Ending With

後方一致


## 検索対象・検索方法

![20170326175111.png](https://qiita-image-store.s3.amazonaws.com/0/92771/6dfa8bba-7925-3b06-3cb5-7f279f71403c.png)

### Text

文字列検索

### Reference

![20170326180625.png](https://qiita-image-store.s3.amazonaws.com/0/92771/6661b23f-ae7f-445f-d764-bd1d991c1acb.png)

プロパティ名やクラス名などを対象に検索

### Definitions

![20170326180636.png](https://qiita-image-store.s3.amazonaws.com/0/92771/269a3bff-aec1-02e8-4c05-f1b47f8cd3e3.png)

検索範囲内で定義されたプロパティ名やクラス名などを対象に検索

### Regular Expression

正規表現

### Call Hierarchy

![20170326182427.png](https://qiita-image-store.s3.amazonaws.com/0/92771/f34d17b2-572a-a9d6-75eb-1d262fe0512e.png)

メソッド名やプロパティ名の依存関係


## 特殊文字の検索

![20170326183807.png](https://qiita-image-store.s3.amazonaws.com/0/92771/691e8f52-3ff6-1e5a-4caf-45a6b3f67989.png)
![20170326183815.png](https://qiita-image-store.s3.amazonaws.com/0/92771/edf3e9ab-2102-fafa-2a50-91b8e9b2c396.png)

検索ボックスの虫眼鏡アイコンをタップして、Insert Patternを押すと特殊文字を検索ボックスに追加できます


## ファイル名の検索

![20170326184228.png](https://qiita-image-store.s3.amazonaws.com/0/92771/556fc00a-01fb-b5ee-d59b-5310739ee0fa.png)

`Command + Shift + O` を押すとファイル名の検索窓を表示できます


## おまけ

![20170326180843.png](https://qiita-image-store.s3.amazonaws.com/0/92771/d26b8d41-0e52-ae59-f174-c6470e1099bc.png)

コード内でも右クリックで検索できます。上に挙げたような様々な検索方法が呼び出せます
minHeightを保ちつつContentViewに合わせたUIScrollViewをStoryboard上で定義する

## やりたいこと

デフォルトは画面の高さで、中の要素が画面の高さを越えたらスクロールするViewを設定したい

- 中の要素が画面の高さに収まる場合
![20170325015352.png](https://qiita-image-store.s3.amazonaws.com/0/92771/ff8257a3-28f6-7e35-0c4e-ac1eaac908b3.png)
- 中の要素が画面の高さに収まらない場合
![20170325015301.png](https://qiita-image-store.s3.amazonaws.com/0/92771/526ed62b-c290-e80c-332e-b6fd554343be.png)

## Storyboardの設定

![20170325014416.png](https://qiita-image-store.s3.amazonaws.com/0/92771/49aee922-4c06-0f32-cac7-3938a0b1d5f0.png)

1. UIScrollViewを追加する
    - UIScrollViewの上下左右の制約を画面に合わせる
![20170325014524.png](https://qiita-image-store.s3.amazonaws.com/0/92771/acb635ca-ffaf-e5c4-1b8e-48453de07893.png)
2. UIScrollViewの中にUIViewを追加する
    - UIViewの上下左右の制約をUIScrollViewに合わせる。Paddingを設定したければ、ここでConstantを設定する
    - UIViewの高さ・幅の制約をUIScrollViewに合わせる。Paddingを設定している場合は逆算した値をConstantに設定する（ここではPaddingを上下左右でそれぞれ8で設定しているので、逆算した値は-16になる）
![20170325014608.png](https://qiita-image-store.s3.amazonaws.com/0/92771/9b8730c6-6e3a-6928-f106-cc4ed031605b.png)
3. UIViewの中にUILabelを追加する
    - UILabelの上下左右の制約をUIViewに合わせる。Paddingを設定したければ、ここでConstantを設定する
![20170325014738.png](https://qiita-image-store.s3.amazonaws.com/0/92771/c21381ce-10d2-4176-3925-df6b46a253c5.png)
4. **[重要] UIViewの高さの制約の`remove at build time`を有効にする！**
    - これを設定することで、中の要素が画面の高さを越えたらスクロール可能になる
![20170325014918.png](https://qiita-image-store.s3.amazonaws.com/0/92771/60d18a8e-7f35-9313-b36c-32d6f9cf8d4b.png)
5. **[重要] UIViewにgreaterThanOrEqualToの高さの制約を設定する！**
    - これを設定することで、UIViewの高さの最小値を設定することができる
![20170325015101.png](https://qiita-image-store.s3.amazonaws.com/0/92771/d7e227e4-bec8-b52d-e325-2ab02e69bbac.png)

上の手順を踏めば、コードを書かずに中の要素に合わせて伸縮するScrollViewを実現できます！
本当はUIViewの高さのEqual制約は設定しなくても動くのですが、Storyboard上でエラーが出てしまうので、それを回避するために`remove at build time`を有効にした制約を設定しています。

### おまけ

`remove at build time`を有効にした制約はStoryboard上では普通の制約とは異なって表現されます。

![20170325015512.png](https://qiita-image-store.s3.amazonaws.com/0/92771/5e189089-e84e-1ad8-417a-ddc13826d1fa.png)

お分かりいただけたでしょうか？制約を表す線が青ではなくて黒になってますね！わかりやすい！ :thinking_face: