OmniAICreator/Qiita-1.07M huggingface dataset:
[Vim] neosnippetで使うsnippet自作

## NeoSnippetをインストール

```vim:vimrc
NeoBundle 'Shougo/neosnippet.vim', {
      \ 'depends' : ['Shougo/neosnippet-snippets'],
      \ 'insert' : 1,
      \ 'filetypes' : 'snippet',
      \ 'unite_sources' : [
      \ 'neosnippet', 'neosnippet/user', 'neosnippet/runtime'],
      \ }
```

## 自作スニペットを格納するディレクトリを設定

```vim:vimrc
let g:neosnippet#snippets_directory = '$HOME/.vim/snippets/'
```

## スニペットを追加する

### 追加する対象のプログラミング言語のファイルを開く

```sh
vim sample.rb
```

### NeoSnippetEditコマンドを実行する

```
:NeoSnippetEdit
```

### ＄HOME/.vim/snippets/ruby.snipが開くので編集する

```vim:snippets/ruby.snip
snippet logger
  Rails.logger.debug '${1} ---------------------'
  Rails.logger.debug $1
```

保存して`.rb`ファイルで使用する

![vim_snip.gif](https://qiita-image-store.s3.amazonaws.com/0/20045/3ce8422a-23bd-c5a9-93e5-f3315f944e4f.gif)

`${1}`に入力された値がそのまま`$1`の部分にコピーされます。このあたりはお好みで使ったり使わなかったりするといいと思います。

以上
Microsoft Flow でFlow作成

# 今回作成したFlow

最近研修で、新しく入社したスタッフのメンバーの出席と資料のお知らせなどのメールの通知などを任されることになった。
そこでMicrosoft Flowでその辺のFlowをメモ

## 使用したアプリ

- Office 365 ユーザー
    - スタッフの名前やE-mail、部署などを管理している 
- SharePoint
    - 研修スタッフを記録するリストを作成 
- Office 365 Outlook
    - メールの取得から通知に使用

## Flow

![flow01.png](https://qiita-image-store.s3.amazonaws.com/0/178856/f67ea4f8-26c2-542f-da46-bb0f25a7e5f3.png)

1. メールで件名に**入社の挨拶**があるとFlowがはじまる
2. メールアドレスからユーザー検索で、スタッフの情報を取得
3. 出席用のリストとメールの通知が分岐
    - SharePointのリストにスタッフの項目を新規作成
    - Outlookでスタッフを通知

### 1.メールで件名に**入社の挨拶**があるとFlowがはじまる

![flow2.jpg](https://qiita-image-store.s3.amazonaws.com/0/178856/779b0069-da07-0450-d867-7cb8fe1bf2ba.jpeg)

**一から作成する**でOutlookを選択後に**新しいメールが届いたとき**を選び、
詳細オプションを表示しないから、Subject Filterに「入社」と入力

### 2.メールアドレスからユーザー検索で、スタッフの情報を取得

![flow3.jpg](https://qiita-image-store.s3.amazonaws.com/0/178856/752f40b0-c58a-8c7e-1cd2-cf90cb2e6fab.jpeg)


**Office 365 ユーザー**から**ユーザーの検索**を選択して、検索後に入力フォームにフォーカスしたら「新しい電子メールが届いたとき」が表示されるので、ここから「差出人」を選択
こうするとメールの差出人のユーザー情報を取得できる

### 3.出席用のリストとメールの通知が分岐

![flow4.jpg](https://qiita-image-store.s3.amazonaws.com/0/178856/789d1369-3bb2-4c33-1d23-fc2da9ba2df6.jpeg)

条件分岐をおこなう、ここからへんがMicrosoft Flowが独特でいろいろ条件が作成できる。
iftttやzapierだと一方通行だがMicrosoft Flowだと複数分岐が行える。＋ボタンから並列分岐の追加を選択して、SharePointとOutlookを選択

### 4.項目作成

SharePointから項目の作成を選択後に対象のSharePointのリストを選択。
そこからそれぞれの項目に必要な情報を入力
ちょっとここで関数を使った。ここまでだと入社した日時の入力ができないので関数を使用

```
utcNow()で現在の時刻を取得
```
ただこれだと07/16/2018 05:08:45になるので、yyyy-mm-ddへ変更する


まずutcNow()のみだと世界標準時なので、日本の標準時＋9時間にする

```
addHours(utcNow(),9)
```

ここから年と日と日を取り出したいので、```formatDateTime()```を使用

```
formatDateTime(addHours(utcNow(),9),'yyyy-MM-dd')
```

これで```2018-07-16```になる

### 5.メールで通知

**Outlook**から**電子メールの送信**を選択から、送信したいアドレスや本文を入力後に完成
あれ？WebView（swift）が動作していない。

とんだお騒がせをしてしまいました。
iphoneX対応をしていませんでした。笑。
お粗末。<img width="408" alt="スクリーンショット 2018-07-17 15.47.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/5135/ae2d9aae-a0d3-8a5a-06ea-dfc3763e469d.png">


今日は2018年7月16日なのですが、15時49分現在、SwiftでのWebViewが動作しません。
Javaは問題なし

<img width="377" alt="スクリーンショット 2018-07-16 15.45.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/5135/bbd44f10-863e-d13e-066b-59ad9e03cce3.png">

<img width="414" alt="スクリーンショット 2018-07-16 15.51.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/5135/6ed8fc63-a148-d086-33f0-eceaa158d6f0.png">
AWS SAA 合格に関するメモ

システムのクラウド化が激しい。クラウドはセキュリティ大丈夫？というのは一昔前。逆にクラウドの方が使い方によっては安全。
ハードを納期一カ月で買って、田舎のデータセンターまで出向いて、ごそごそ作るのは時代遅れ。なんでもクラウドファースト。

危機感を感じで急いでAWSの資格を取得。メモを残します。

1.勉強方法

・「合格対策 AWS認定ソリューションアーキテクト - アソシエイト」これを繰り返し勉強。網羅されていると思う。ただしご存じの通り一部情報が古い。AWSサービスが常にアップデートされているから。

・AWS無料枠を活用して
インスタンス作成、S3バケット作成、ポリシー作成、ロール作成、cliで動作確認
スナップショット作成、AMI作成など繰り返す。
スナップショット作りすぎて５ドルほど課金発生。このくらいはなんでもないだろう。

無料問題

AWS SAA(2018/2開始)
https://d1.awsstatic.com/training-and-certification/docs-sa-assoc/AWS%20Certified%20Solutions%20Architect%20-%20Associate_Exam%20Sample_v1.5_FINALJP.pdf

https://aws.koiwaclub.com/sample/aws-sample-exam/　（一部無料）

https://aws-walker.com/free-sample-assoc/aws-solutions-architect

https://awsjp.com/exam/saa-sap/c/index.html

当日
写真とサイン付き証明書と書かれていたのでパスポートを持っていくが免許書でOK。サインはないが。
場所は歌舞伎座。入口がちょっとわかりにくいので早めにいくとよいだろう。
観光客多し。有楽町から歩いて１０分ー１５分を見ておくとよいだろう。

試験のポイント：
問題文の末尾に注目！！
コスト重視、可用性、性能のどれを聞かれているかが大事。そこを間違えると意味がない。
消去法もよいだろう。明らかにおかしいものから消していく。
kinesis,read replica,SQS、role,route 53,CloudFront などが売りなので答えに選ばれやすいかな。
Android Studio初心者がHUAWEI nova2で "Hello World"を表示させるまで

##Android Studioをダウンロードし終えてから、携帯にHelloWorldを表示させるまでに発生した様々な問題と解決までの経緯をメモしておきます

####やり始めた時の環境
Mac OS 10.9 （これが原因でつまずいた。実際は10.10以上が必要になる）
HUAWEI nova2 Android version 7.0
JDKはインストール済み

####参考サイト
AndroidStudio超入門　こちらをベースに設定していきました。
http://www.atmarkit.co.jp/ait/articles/1709/04/news015.html


###以下設定した内容の記録

#####作製するアプリのバージョン
OS 4.0

#####テンプレート
Empty Activity

#####仮想デバイスの作製
AVD manager　というボタンから

#####エミュレータ
仮想デバイスのOS:Android API 28　（最新にしておけばいいだろうと選択したが、後に問題発生）
機種：Nexus 5X API 28


##今回つまずいた問題たち
####HAXMをインストールしないとエミュレータが使えない問題

- Mac OS 10.10以降じゃないとHAXMをインストール出来ないということで、MAC OS High Sierraをインストール。

####ビルドできない問題

- SDKmanagerボタンから、こちらをインストールしてみると解決→Android 7.0　（HUAWEI nova2　のOSに合わせてみた。たまたまかもしれないがビルド出来るようになった）

####RUN出来ない問題　＆　エミュレータにアプリが反映されない問題

- Sync Project with Gradle files　というボタンを押したら、RUNボタンが押せるようになった。
実行環境を選択出来るようになったので、作製済みのエミュレータを選択して実行

Hello World と表示された！！でもまだ問題が。。。

####MAC BOOK Air のメモリが4Gで仮想デバイスのメモリも4Gという問題
PC熱くて壊れそう

- HUAWEI　nova2 と繋ぐ
- 端末側の設定を各種変更（上記サイトを参照）
- USBコードで繋ぐだけでOK
- HiSuiteというアプリは不用だった

- AndroidStudioのHPにはPC側の設定としてAndroidManifest.xmlというファイルにandroid:debuggable="true"　と記述しろとあったが、記述しなくても実行出来た


##感想
ここまで丸１日半、、、やっとの思いでアプリを携帯端末に表示させることが出来た。
ちょっとしたバージョンの違いとか、細かく気をつけないといけない事がたくさんあるのだなと実感しました。ようやく本来の目的であるアプリ制作に取りかかる事ができるようになりました。ここからが本番なので頑張ります。
Windows10でRuby on Railsの環境を立ち上げる

Update on 2018.07.16

半年ちょっとC#をやってきたのですが、転職してRuby on Railsを触ることになりました。
とりあえず環境を作ってみたので自分用メモもかねて手順を残しておきたいと思います。

ちなみにOSはWindows10 HomeEditionです。


## まずはnode.jsをインストール
Win10で最新版のrailsを動かす場合はnode.jsが必要らしいので、インストールします。
https://nodejs.org/en/download/
これも深く考えずにnext押してけばインストールされるはず。


##Ruby本体をインストール
参考: http://koboldtodragon.hatenablog.com/entry/2018/05/21/080000

下記のサイトからダウンロードしましょう。
https://rubyinstaller.org/downloads/

上のほうにある**WITH DEVKIT**っていう項目のをとってくると調子いいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/254731/3a07bcb2-aba8-3fcf-f0bf-a2e4ede4635c.png)

実行したら特に何も考えずNextでOK。



## ちゃんとインストールできたか確認

コマンドプロンプトを立ち上げてRubyをインストールしたディレクトリに移動したら、
```
ruby -v
```
を投げてバージョンが表示されればOKです。

## 以下のgemをインストール

さきほどバージョン確認した手順と同様に以下のコマンドを投げる

```
gem update --system
gem install sqlite3
gem install nokogiri
gem install bundler
gem install rails
```

ちなみに筆者はこれらのgemがなぜ必要かはよくわかってないが、色んな記事を見ても大体同じように書いてたのでとりあえず入れてみた。
(DBに関してはMySQLという人もいたけど、デフォルトはSQLite3のようである）

無事終われば一通りインストールは完了。

## newしてプロジェクトを作ってみる
参考: https://ameblo.jp/aimhigh-1213/entry-12321926908.html
適当なフォルダを作って、コマンドプロンプトで移動する。
(ちなみに、エクスプローラーのアドレスバーを触って cmd って入れてEnterするとそのフォルダでコマンドプロンプトが立ち上がるので便利)

以下のコマンドを入れるとプロジェクトのひな型がごっそり出来上がる。

```
rails new プロジェクトファイル名
```

実はこの状態ですでに最初のページは表示できる状態になっているので、試してみる。

先ほど作ったプロジェクト名のディレクトリでコマンドプロンプトを開いて、下記のコマンドを投げる
```
rails s
```
サーバーが立ち上がった感じのメッセージが出てれば成功。

この状態でブラウザを開き、
http://localhost:3000/
を開いて、Railsの初期画面が出れば無事完了。

ブラウザを閉じて、コマンドプロンプトに戻ってCtrl+C→y入れてEnter でサーバーも終了させておく。


##IDEをインストール
最後に、統合開発環境のインストール。
無料でやる場合はEclipseとNetBeansの2択になるっぽいので、僕はNetBeansにしてみました。

https://ja.netbeans.org/

中段左のリンクから最新版をクリック。
Javaの開発をする予定はないので、真ん中のHTML/JavScriptからダウンロード。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/254731/40a70716-862d-3577-1842-df214e7c5fdb.png)

NetBeans本体のインストールが完了したら、Railsを編集できるようにするプラグインをインストールします。
手順は下記をご参考ください。
https://www.oiax.jp/rails/zakkan/how_to_install_rails_plugin_on_netbeans_8_0_1.html


## 完了
とりあえず上記の手順が完了した段階で、問題なく使えております。

たぶんほんとはSQLite3との連携？みたいなのが必要なのかもしれないけど、それは今後ぶつかった段階でまた記事にしようかなと思います。
twitterから投稿を継続的に取得

import os

import tweepy

CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

class MyStreamListener(tweepy.StreamListener):
	def on_status(self, status):
		print('@', status.author.screen_name, status.text)

stream = tweepy.Stream(auth, MyStreamListener())

stream.sample(languages=['ja'])

これを必要なライブラリとか適当にインストールして実行するだけ！簡単！
Excelで筆算的プログラミング(3)

# 問題
０から９までの数字の平均値を求めよ。

```vba
(A4) =P("V_0 1 2 3 4 5 6 7 8 9","合計","個数_0","除法_1,2")  [4.5]
```

# 出来ない事
Application.Run の重ね掛けが出来ません。

```vba
Function 平均(D, Optional S = "")
    S = P(D, "合計", "個数_0", "除算_1,2")
    
    平均 = S
End Function
```

と定義しても、以下の式は正しい値を返しません。

```vba
(A4) =P("V_0 1 2 3 4 5 6 7 8 9","平均")  []
```
SpringBootにWebJarsを追加してみた

[前回](https://qiita.com/keb/items/c039d00c85fd99c2cee1)の続き

bootstrapやjQueryを追加したいと思いWebJarsを追加した。

### 環境

- Mac High Sierra 10.13.5
- Java 1.8.0_11
- Maven 3.5.4
- springboot 2.0.3

### 手順

[WebJars](https://www.webjars.org/)で、pom.xmlに記載する内容を確認し、追加。

```pom.xml
<dependency>
	<groupId>org.webjars</groupId>
	<artifactId>bootstrap</artifactId>
	<version>4.1.1</version>
</dependency>
<dependency>
	<groupId>org.webjars</groupId>
	<artifactId>jquery</artifactId>
	<version>3.3.1</version>
</dependency>
```

htmlを修正。以下3行を追加し、とりあえず文字を青くした。

```html
  <link rel="stylesheet" href="webjars/bootstrap/4.1.1/css/bootstrap.min.css" />
  <script src="webjars/bootstrap/4.1.1/js/bootstrap.min.js"></script>
  <p class="text-primary" th:text="${hello}"></p>
```

追加後のhtml

```html:index.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>index page</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta charset="UTF-8" />
  <link rel="stylesheet" href="webjars/bootstrap/4.1.1/css/bootstrap.min.css" />
  <script src="webjars/bootstrap/4.1.1/js/bootstrap.min.js"></script>
</head>
<body>
  <p>index page</p>
  <p class="text-primary" th:text="${hello}"></p>
</body>
</html>
```

cssとjsのディレクトリを作成。

```
src/main/resources/static/css
src/main/resources/static/js
```

jarファイルを作成し、起動。
Hello World !の文字が青くなっていれば成功。

### 参考

https://www.boraji.com/using-webjars-in-spring-boot-application
[Review] Temporal Difference Learning and TD-Gammon

## Paper Detail
Autor: Gerald Tesauro
Published Year: 1998
Link: https://courses.cs.washington.edu/courses/cse590hk/01sp/Readings/tesauro95cacm.pdf

## What is TD-Gammon?
This is the basic algorithm combining neural network (Multi-layer perceptron) with TD-Learning. And this approach has outperformed the human champion. 
The model used one hidden layer and TD($\lambda$) algorithm.

## What is his claim?
1. Delayed Reward
2. Limits on the scale of the learning algorithm(either look-up tables or linear function approximation)

## What is the context of this research?
1. Development of SL algorithms(Decision Tree, SVM and so on)
2. Invention of TD-Learning
Because of these two developments, this TD-Gammon algorithm could surpass the issues beforementioned.
And He looked back his previous approach named NeuroGammon and has adapted the handcrafted feature engineering technique to this algorithm.

## Model
<img width="454" alt="Screen Shot 2018-07-16 at 15.01.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/35d3b311-d2fa-400f-8ae4-d88eba7109e4.png">
Input: raw feature set of Backgammon
Output: probability of the each four potential actions

## Any further discussion?
Why did TD-gammon work?
https://pdfs.semanticscholar.org/c1ec/5116d71176aaca80b1df944c01e82cc35212.pdf

According to this paper, the authors were able to replicate the algorithm using a neural network and hill climbing optimisation approach. Indeed, they didn't use TD-learning or even reinforcement learning approach at all.
So they claimed that the success introduced by Tesauro's TD-Gammon had to do with more stochasticity in the game itself, since the way to play the game is that each player rolls the dice and place the stone in turn. So the dynamism could actually help a lot for the agent to learn.
Vue.jsで作るクリックされたら全選択されるテキストエリア

Vue.jsにてテキストエリア、またはテキストボックスをクリックした際に
全選択させる方法
コピーしてリンクを共有してもらうようなテキストエリア用です。

```vue.js:sample.vue
<template>
  <div>
    <label for="fullPath">コピーして共有</label>
    <input ref="target" type="text" @click="$refs.target.select()">
    </form>
  </div>
</template>
```

input領域を用意します。ここはなんでも大丈夫です。テキスト選択できるようなUIが好ましいと思います。
`<input type="text">`

refを使ってDomのオブジェクトへの参照を定義します。

利用するときは`$refs.{定義した名前}`

文字選択のメソッド `select()` はJavascriptに実装されています。

Javascriptのサンプルだと`onClick="this.select()"`のように利用されているので
こちらをVue用にまるまる置き換えた形になります。
AmazonLinuxにJettyを導入してデモサイトを起動してみる

# はじめに

Amazon LinuxにJettyをインストールしたので、忘れないように記録を残します。
インスタンスはAmazon EC2 を想定しています。

Macでもやってみたので、興味のある方はそちらもご参照ください。
[MacにJettyを導入してデモサイトを起動してみる](https://qiita.com/segur/items/7dab98c3787b1e9920e2)


# Jettyとは？

Java Servlet コンテナの一種です。Java Servlet コンテナはアプリサーバーとかWebコンテナとか呼ばれたりもします。類似の技術にApache Tomcatがあります。



# JDKをインストールする

以下のコマンドを叩いて、バージョン番号が表示されれば、JDKがインストールされています。

```
java -version
```

バージョン番号が表示されなければ、JDKがインストールされていませんので、以下のコマンドでJDKをインストールします。

```bash
sudo yum install java-*
```

これでインストールされます。



# Jettyをインストールする

以下のコマンドでJettyをダウンロード＆インストールできます。ダウンロード先は`/opt`が一般的なようなので、私もそこにしました。

```bash
curl -L \
  https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.11.v20180605/jetty-distribution-9.4.11.v20180605.tar.gz  \
  | sudo tar zxvf - -C /opt
```

以下の場所にインストールされました。

```bash
/opt/jetty-distribution-9.4.11.v20180605
```



# demo-baseでJettyを起動する

jettyをインストールすると、demo-baseというサンプルプロジェクトが一緒に導入されますので、それを起動してみます。

以下のコマンドを実行してください。

```bash
# demo-baseフォルダに移動
cd /opt/jetty-distribution-9.4.11.v20180605/demo-base

# jettyを起動
java -jar /opt/jetty-distribution-9.4.11.v20180605/start.jar
```

ブラウザからアクセスしてみます。ポート番号はデフォルトの8080です。

<img width="867" alt="スクリーンショット 2018-07-16 13.57.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/221845/995501e1-3db2-dc0b-9047-5b288879562d.png">

こんな感じに表示されれば、Jettyの起動は成功です。demo-baseフォルダの内容が表示されています。

今度は停止してみましょう。`Control+C` でJettyを停止できます。

再度、 http://localhost:8080 にアクセスします。

<img width="422" alt="スクリーンショット 2018-07-16 13.14.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/221845/f609d00a-4952-ef8e-c472-834a2239d27a.png">

先ほどの画面は表示されず、こんな感じに画面が表示されます。これでJettyを停止させることができました。




# 最後に

カレントディレクトリによって、start.jarの実行結果が変わるのに戸惑いましたが、それ以外は特に苦労せずにJettyを導入することができました。


# 追記

デプロイ手順をまとめてみました。
[Jettyを組み込んだjarファイルをEC2にデプロイする](https://qiita.com/segur/items/a1fdb19c174908968b8e)
SQLserverでビューの定義を取得するときの注意点



保守しているプロジェクトのビュー定義を見ようとして色々調べていたんですが、ちょっと注意したい点があったのでメモ代わりに残しておきます。


### 環境
Windows8
SQL server 2008 R2   (SSMS 10.50.2500.0)


## 下記の方法はお手軽。けど、字数に制限があるっぽい。

参考 http://d.hatena.ne.jp/nagakura_eil/20070122/1169446593

```SQL

SELECT * FROM information_schema.views WHERE TABLE_NAME = 'ビュー名'

```




使っているDBOに上記のSQLを投げるとビューが返ってくるんですが、
定義が長いとある部分から先は取得できません。

(短ければちゃんと全部見れる)



## こちらは全部取得できる

参考 https://www.projectgroup.info/tips/SQLServer/SQL/SQL000010.html

```SQL

SELECT sys.views.name
      ,sys.sql_modules.definition

FROM   sys.views

INNER JOIN sys.objects
ON  sys.objects.object_id = sys.views.object_id

INNER JOIN sys.schemas
ON  sys.schemas.schema_id = sys.objects.schema_id

INNER JOIN sys.sql_modules
ON  sys.sql_modules.object_id = sys.objects.object_id

WHERE  sys.views.name = 'ビュー名を指定'	--指定しない場合は全件取得

ORDER BY sys.views.name

```

こっちは全部取得できます。
ので、特に問題なければこっちを使いましょう。



## なぜ発見したか

保守用のPCが社内のクローズドなLANにしか繋がらないのでコピペできない → 別のPCでブラウザ見ながらSQL手打ち → 書く量が少ないほうにしよ → なんか途中で切れちゃう！？

何事もめんどくさがってはいけないようです。笑
[PC-6001] tips

アセンブリで何か作るときに役立つかも知れないtipsです。

* [キークリック音のON/OFF](https://qiita.com/fuzzball/items/25106a26545a808868cb)
* [ポート$B0](https://qiita.com/fuzzball/items/27ef8bed0eb2d44d40bb)
* [2msタイマー](https://qiita.com/fuzzball/items/2f8915a7640606514f29)
* [PSG制御](https://qiita.com/fuzzball/items/403402e3ea395b905348)
* [キー入力 & ジョイスティック入力](https://qiita.com/fuzzball/items/246dd6bcc2b20613dd68)
* [メモリマップ](https://qiita.com/fuzzball/items/7b46657ee1dc7e919a09)
* [カートリッジから起動する](https://qiita.com/fuzzball/items/d68b99cdf362470d93ee)
JavascriptでEthereumのアドレスからトランザクションを取得する


#正攻法
 直近のブロックから、アドレスのトランザクション数が0になるか、Balanceが0になるまでトランザクションを取得し続けます。

```javascript
function getTransactionHistory(address){
        const web3 = new Web3(new Web3.providers.HttpProvider([任意のイーサリアムノード]));
        const currentBlock = web3.eth.blockNumber;
        var transactionList = [];
        var transactionCount = web3.eth.getTransactionCount(address, currentBlock);
        var balance = web3.eth.getBalance(address, currentBlock);           
        for (var i=currentBlock; i >= 0 && (transactionCount > 0 || balance > 0); --i) {
            var block = web3.eth.getBlock(i, true);
            if (block && block.transactions) {
                block.transactions.forEach(function(e) {
                    if (address == e.from && e.from != e.to) {
                        balance += e.value;
                        transactionList.push({'blockNumber':i,'from':e.from,'to':e.to,'amount':e.value.toString(10)})
                        --transactionCount;
                    }
                    if (address == e.to) {
                        if (e.from != e.to)
                        balance -= e.value;
                        transactionList.push({'blockNumber':i,'from':e.from,'to':e.to,'amount':e.value.toString(10)})
                    }
                });
            }
        }
        return transactionList;
}
```
　infura.ioのノードで試しましたが、リクエスト過多で固まってしまいました・・・

#妥協策
邪道とは思いましたが、諦めてEtherscanから取得したら現実的に動いてくれました。

```javascript
function getTransactionHistory(address){
      const web3 = new Web3(new Web3.providers.HttpProvider([任意のイーサリアムノード]));
      const currentBlock = web3.eth.blockNumber;
      const reqBody = {
        'module':'account',
        'action':'txlist',
        'address':address,
        'startblock':0,
        'endblock':currentBlock,
        'page':1,
        'offset':10, //取得するトランザクションの最大数
        'sort':'asc',
        'apikey':'[EtherscanのAPI KEY]'
      }
      const res = $.ajax({
          url: 'https://api.etherscan.io/api',
          type: "GET",
          dataType: "json",
          data: reqBody,
          async:false,
      }).responseText;

      return JSON.parse(res).result;
}        
```

#参考URL

https://ethereum.stackexchange.com/questions/2531/common-useful-javascript-snippets-for-geth

https://etherscan.io/apis#transactions
Git add, commit, pushをコマンド一つにまとめるaliasの設定

# Mac編

## 準備
Macの場合はターミナルから```.bash_profile```と```.bashrc```を作成します。

```
$ cd ~
$ echo > .bash_profile
$ echo > .bashrc
```
作成した```.bashr_profile```を編集します。

``` 
$ vim .bash_profile
```

```bash:.bash_profile
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```

次に```.bashrc```にコマンドを記述します。

``` 
$ vim .bashrc
```

```bash:.bashrc
gitpush() {
  git add .
  git commit -m "$*"
  git push origin HEAD
}

alias gp=gitpush
```

※ファイルの編集だけではまだ反映されていません。一度ターミナルを閉じ、もう一度立ち上げると反映されます。

## 使い方
今回は```gp```というコマンドを登録しました。

```
$ gp YOUR_COMMIT_MESSAGE
```

上記コマンドを叩くと
```git add .``` → ```git commit -m "YOUR_COMMIT_MESSAGE"``` → ```git push origin YOUR_BRANCH```
のように処理されます。

# Windows編
## 準備

Windowsの場合はGit Bashから```.bash_profile```を作成します。

```
$ cd ~
$ echo > .bash_profile
```


次に```.bash_profile```にコマンドを記述します。

``` 
$ vim .bash_profile
```

```bash:.bash_profile
gitpush() {
  git add .
  git commit -m "$*"
  git push origin HEAD
}

alias gp=gitpush
```
※ファイルの編集だけではまだ反映されていません。一度Git Bashを閉じ、もう一度立ち上げると反映されます。

## 使い方
今回は```gp```というコマンドを登録しました。

```
$ gp YOUR_COMMIT_MESSAGE
```
上記コマンドを叩くと
```git add .``` → ```git commit -m "YOUR_COMMIT_MESSAGE"``` → ```git push origin YOUR_BRANCH```
のように処理されます。

# 補足
## 現在のブランチにpush
```git push origin HEAD```とすることで現在のブランチにpushすることができます。
masterブランチで作業している場合は
```git push origin HEAD``` → ```git push origin master```となります。

## pushせずにadd, commitまでにしたい場合

```
$ git commit -am "YOUR_COMMIT_MESSAGE"
```

上記コマンドで実行できます。
しかし、せっかくなのでailiasに登録してしまいましょう。

Macの場合は```.bashrc```Windowsの場合は```.bash_profile```を編集します。

```bash
gitcommit() {
  git add .
  git commit -m "$*"
}

alias gc=gitcommit
```
使い方はpushと同様に

```
gc YOUR_COMMIT_MESSAGE
```
上記コマンドで実行できます。

# その他
他にもよく使うコマンドはaliasに登録すると良いでしょう。

```bash
alias gitb="git branch"
alias gitch="git checkout"
alias gits="git status"
```

# 参考
https://qiita.com/peccul/items/90dd469e2f72babbc106
https://qiita.com/ma_me/items/f76295f3da9579043bbc
https://qiita.com/yutat93/items/b5bb9c0366f21bcbea62
https://stackoverflow.com/questions/19595067/git-add-commit-and-push-commands-in-one
JavaScript:クリップボートのイメージをBase64変換する

# 始めに
JavaScriptでクリップボートのイメージをBase64変換するプログラムを書いてみた
クロスブラウザは全く考慮していないので、まともに動くのはChromeだけとなる

#ソース
```dragImage.html
<html>
<head>
<meta charset="UTF-8">
<script>
document.addEventListener('paste',handleClipBoard)
function handleClipBoard(e){
    e.preventDefault();
    var  clipboardFile= e.clipboardData.files[0];
    var reader = new FileReader();
    reader.onload = function (evt) {
        document.getElementById("result").value=evt.target.result;
        document.getElementById("img_source").src = evt.target.result;
    }
    try{
        reader.readAsDataURL(clipboardFile);
    }catch(e){
        alert('バイナリデータ以外は貼り付けできません')
    }
}

</script>
</head>
<body>
<textArea id='result' cols='100' rows='20'></textArea><br><br><br>
<img id="img_source"></img>
</body>
</html>
```
react native geolocation APIで東京都ではなくサンフランシスコが出る問題

# react native で geolocation APIを使った時
reactでは東京都の緯度、経度が出たけどnativeだとサンフランシスコの緯度、経度が出た。

どうやらこれはsumilatorのデフォルトの設定らしい。

こちらを参考にした。
https://stackoverflow.com/questions/45555363/wrong-geolocation-with-react-native-and-ios-simulator
MacにJettyを導入してデモサイトを起動してみる

# はじめに

MacにJettyをインストールしたので、忘れないように記録を残します。

Amazon Linuxでもやってみたので、興味のある方はそちらもご参照ください。
[AmazonLinuxにJettyを導入してデモサイトを起動してみる](https://qiita.com/segur/items/e61f5198042b191f2aaa)



# Jettyとは？

Java Servlet コンテナの一種です。Java Servlet コンテナはアプリサーバーとかWebコンテナとか呼ばれたりもします。類似の技術にApache Tomcatがあります。



# JDKをインストールする

以下のコマンドを叩いて、バージョン番号が表示されれば、JDKがインストールされています。

```
java -version
```

バージョン番号が表示されなければ、JDKがインストールされていません。Homebrewがあるなら、以下のコマンドでインストールできます。

```bash
brew cask install java
```

すると、以下のパスにインストールされます。

```bash
/Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home
```

環境変数に以下を追加してください。

```bash
# JAVA_HOMEに1.8を指定
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home

# PATHの先頭に追加
export PATH=$JAVA_HOME/bin:$PATH
```


# Jettyをインストールする

以下のコマンドでインストールできます。

```bash
brew install jetty
```

以下の場所にインストールされました。

```bash
/usr/local/bin/jetty
```

上記はシンボリックリンクで、実態は以下にあるようです。

```bash
/usr/local/Cellar/jetty/9.4.11.v20180605/bin
```



# demo-baseでJettyを起動する
jettyをインストールすると、demo-baseというデモサイトが一緒に導入されますので、それを起動してみます。

以下のコマンドを実行してください。

```bash
# demo-baseフォルダに移動
cd /usr/local/Cellar/jetty/9.4.11.v20180605/libexec/demo-base

# jettyを起動
java -jar /usr/local/Cellar/jetty/9.4.11.v20180605/libexec/start.jar
```

ブラウザで http://localhost:8080 にアクセスします。

<img width="867" alt="スクリーンショット 2018-07-16 13.57.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/221845/995501e1-3db2-dc0b-9047-5b288879562d.png">

こんな感じに表示されれば、Jettyの起動は成功です。demo-baseフォルダの内容が表示されています。

今度は停止してみましょう。`Control+C` でJettyを停止できます。

再度、 http://localhost:8080 にアクセスします。

<img width="422" alt="スクリーンショット 2018-07-16 13.14.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/221845/f609d00a-4952-ef8e-c472-834a2239d27a.png">

先ほどの画面は表示されず、こんな感じに画面が表示されます。これでJettyを停止させることができました。

# 最後に
カレントディレクトリによって、start.jarの実行結果が変わるのに戸惑いましたが、それ以外は特に苦労せずにJettyを導入することができました。
[ポエム] 良いコードとはなにか

社内でコードレビューを行う機会が最近増え、良いコードとは何かについて私自身が考えることが多くなりました。
本記事では、n番煎じではありますが、現時点でどのようなコードを私が良いコードと考えているかについて、ポエムの形で記したいと思います。

## 1. 対象読者

本記事では次のような方を対象読者として想定しております。

- 時間が有り余っている方
- 良いコードとは何かについて意見がない方
- 良いコードとは何かについて意見がある方

## 2. 「良い」とはなんだ

この世の中には様々なプログラム言語があります。
HTMLやCSSなどの比較的 [^1] かんたんに取り組める言語 [^2] から、SwiftやKotlinなどのそれなりにプログラムについて知識がないと取り組みづらい言語があります。
また一口にプログラマと言っても週末に趣味で開発される方から、プログラムが生業の方まで幅広い層が想定でき、作成したソースコードについても、製品に投入されるものから研究開発に利用されるもの、または自身の勉強のためのものなど様々な物があると思います。
そのため本記事では、プログラマやソースコードの利用レベルを次のように想定し、想定した彼らにとってどのようなコードが良いコードなのかを考えることとしました。

> *日々プログラムを書くことを生業とし、設計からコーディングテストまで一貫して担当を行う。*
> *必要があれば世に言う上流から下流まですべて担当する。*
> *開発したソースコードは自社サービスに利用され、日々利用者に利用される*

## 3. 自社サービスエンジニアにとって、良いコードとはなにか

本記事で想定した自社サービスエンジニアは次のような特徴を持ちます。

- 自分自身が開発したコードを継続的に自身、もしくは自分の同僚がメンテナンスする必要がある
- 自分自身が開発したコードにバグがあれば、即会社の評判に傷をつける、ないしは利用者に対して迷惑をかける

そのため、 **彼ら** にとって良いコードとは次のような特徴を持ったコードだと考えました。

1. 開発者の意図が、**明瞭** かつ、**漏れなく** 適切に伝わるプログラム
(変数の役割、期待されるメソッドの処理、返却値・・・etc)

2. 不要なコードが **一切ない** プログラム
(必要最小限のコードで構成されていること)

3. 作成したソースコードの **読者が開発者のスキル不足を疑う要素がない** プログラム
(適切なスキルを持った開発者が開発したことを感じられるプログラム)

# 4. 終わりに

**様々な視点に対して「良いコード」が存在します。**
**別の言い方をするならば、「万人の目線に対して良いコード」は存在しません。**
**そのため、本記事で述べた内容は私にとっての「良いコード」であり、万人にとっての「良いコード」ではないことにご留意いただければ幸いです**
 
---

[^1]: 僕自身の主観的な考えです。
[^2]: ここで言う取り組むとは、とりあえず触ってみる、Hello World + α程度を行うことを想定しています。
MySQL のパスワード入力を省略する

パスワードを毎回手入力するのがあれだったので調べてみた。

# 手順

1. .my.cnfファイルを作成する

    ```
    # vi ~/.my.cnf
    ```

    ```~/.my.cnf
    [client]
    password=<パスワード>
    ```

2. 権限を変更し、所有者のみが参照・編集可能にする

    ```
    # chmod 600 ~/.my.cnf
    ```

# 参考
- [公式サイト - 6.1.2.1 End-User Guidelines for Password Security](https://dev.mysql.com/doc/refman/8.0/en/password-security-user.html)
fieldsetタグ内のButtonタグにdisplay:flexを適用する

fieldsetタグ内のButtonタグにflexboxスタイルを使用しても期待通りに動かない。
そんな時はdivタグでwrapperを作成する

<h2>Flexboxが適用されない例</h2>

```HTML
<fieldset>
  <legend>データタイプを選択</legend>
  <button>ボタンA</button>
  <button>ボタンB</button>
  <button>ボタンC</button>
  <button>ボタンD</button>
</fieldset>
```
```CSS
fieldset {
  display: flex;
  justify-content: space-around;
}
```

<h2>Flexboxが適用される書き方</h2>

```HTML
<fieldset>
  <legend>データタイプを選択</legend>
  <div class="flexbox-wrapper">
    <button>CSV</button>
    <button>TSV</button>
    <button>Excel</button>
    <button>SQL</button>
  </div>
</fieldset>
```
```CSS
.flexbox-wrapper {
  display: flex;
  justify-content: space-around;
}
```
Vue-cli3系の導入

Vuejsを利用するために便利なvue-cliの導入です

インストール

`npm install -g @vue/cli`

プロジェクト作成
公式ページ:https://cli.vuejs.org/guide/creating-a-project.html#vue-create

アプリの名称を指定して作成
`vue create app-name`

ここからは対話式でインストールする内容を選択します

```
? please pick a preset:
> default (babel, eslint)
  Manually select features
```

特に気にしない人や始めて使う人は
お任せのdefaultで
慣れている人はカスタムのManually select featuresで必要なツールのセットを選択的に導入しましょう

その後の対話の回答は以下の用にしました

```
? Please pick a preset: Manually select features
? Check the features needed for your project: Babel, Router, Vuex, Linter, Unit, E2E
? Pick a linter / formatter config: Standard
? Pick additional lint features: Lint on save
? Pick a unit testing solution: Mocha
? Pick a E2E testing solution: Cypress
? Where do you prefer placing config for Babel, PostCSS, ESLint, etc.? In dedicated config files
? Save this as a preset for future projects? No
```

作成されたプロジェクトファイルで最初に目についたの **viewディレクトリができている所ですね

コンパイルが早くなっている気がするのは私だけでしょうか？？？

開発中の起動コマンドが変わっているので注意しましょう！

`npm run dev` → `npm run serve`
tmux1.9以上でsplit-window, new-windowをカレントディレクトリで開く設定


tmuxでウインドウを新しく作ったり分割したりするときにカレントディレクトリにいる状態で開く設定です。
バージョンが1.8以下だとデフォルトでカレントディレクトリで開いてくれますが、1.9以上だと`pane_current_path`を使う必要があります。

```config
bind-key S split-window -c "#{pane_current_path}"\
bind-key | split-window -h -c "#{pane_current_path}"\
bind-key C-c new-window -c "#{pane_current_path}"\
```

## 参考ページ

pane_current_pathについて
https://qiita.com/bomcat/items/73de1105f7ffa0f93863

## 蛇足

`if-shell`を使ってバージョン1.9以上のときだけ上記の設定を反映するのを試してみましたがうまく動きませんでした。

```config
bind-key S split-window
bind-key | split-window -h
bind-key C-c new-window

if-shell "[[ `tmux -V | cut -d' ' -f2` -ge 1.9 ]]" '\
    bind-key S split-window -c "#{pane_current_path}"\
    bind-key | split-window -h -c "#{pane_current_path}"\
    bind-key C-c new-window -c "#{pane_current_path}"\
'
```

man-page
http://man.openbsd.org/OpenBSD-current/man1/tmux.1#if-shell
Ruby経験者のPython ハマりポイント（with文とスコープ）

個人的に誤解していたので記載しておきます。


## 最初に結論

Pythonのwith文は、Rubyのブロック（do-end）と似ているが別物。
Rubyのブロックと違ってPythonの`with`文はスコープを生成しない。

例えばファイルを扱う処理で「自動的にファイルを閉じる」という目的が達成できるという点では同様だが、変数のスコープとしては意識しておく必要がある。

## 環境

OSはmacOSで確認（そもそもOSに依存しない）。

```
$ ruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
```

```
$ python3 -V
Python 3.7.0
```

※ `with`文（構文？）が使えるようになったのはPython 2.5以降らしい。

## 具体例


まずはRubyから。

```ruby
irb(main):011:0> File.open('test.txt') do |file|
irb(main):012:1* a = 1
irb(main):013:1> end
=> 1
irb(main):014:0> a
Traceback (most recent call last):
        2: from /usr/local/bin/irb:11:in `<main>'
        1: from (irb):14
NameError (undefined local variable or method `a' for main:Object)
```

do-endの内部で定義した変数`a`はブロック内のローカル変数なのでスコープの外側ではアクセスできない。

別の言い方をすると、Rubyのブロックはスコープを作る（ただし、`if`や`for`などの制御構文はスコープを作らない）。

Python の場合は以下のようになる。

```python
IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: with open('test.py' ) as fp :
   ...:     a = 1
   ...:
   ...:

In [2]: print(a)
1

```

with文はスコープを生成しないのでこの変数`a`は**ローカル変数ではない**。
制御構文の一種と捉えるか、try-except文（これもスコープを作らない）のシンタックスシュガーと考えておいたほうがいい。



PythonもRubyに共通して制御構文である`if`、`for`、`while`もスコープを生成しない（C言語系の言語は違う）。

## まとめ

C言語系のスコープとRubyのブロック、このあたりの区別ができていないとコードの読解で混乱します。

他にもハマりやすいぽいんとはありますが他の記事で解説されていると思うので省略。



## 参考URL

- [変数のスコープ - Qiita](https://qiita.com/yoichi22/items/8ae2ca180407a5ad5a6d)
- [PEP 343 -- The "with" Statement | Python.org](https://www.python.org/dev/peps/pep-0343/)
.vueファイルを編集するときのVimの設定

## シンタックスハイライト用のプラグインを入れる

[vim-vue](https://github.com/posva/vim-vue)というプラグインを入れる

### NeoBundleの場合

```vim:vimrc
NeoBundle 'posva/vim-vue'
```

これで大体はOKなのですが、いくつか問題が出ることがあります。

## ファイルの途中でハイライトがきかなくなるとき

例えば

![スクリーンショット 2018-07-16 12.53.02.png](https://qiita-image-store.s3.amazonaws.com/0/20045/946e8302-9914-92f9-b3d5-dd476e99a1ce.png)

このように途中でハイライトが効かなくなったとき

### ファイルの先頭からパースしてハイライトを行う設定を追記する

```vim
autocmd FileType vue syntax sync fromstart
```

vueファイルのときだけそのように設定しました
結果
![スクリーンショット 2018-07-16 12.57.49.png](https://qiita-image-store.s3.amazonaws.com/0/20045/af1e76b4-a422-04b8-b1cd-43de99ef743c.png)

## NERDCommenterでのコメントアウト機能を直す

1つのVueファイルの中にHTML, JS, CSSの記述が存在するのでそのままだとコメントアウトが正確に動作しなくなります。
例えば

![スクリーンショット 2018-07-16 13.03.34.png](https://qiita-image-store.s3.amazonaws.com/0/20045/a16f9904-51c5-fa64-6f0c-121c61abcef8.png)
こちらの`data`の部分のようにHTMLのコメントアウトが挿入されてしまいます。

このとき
[こちら](https://github.com/posva/vim-vue#nerdcommenter)に書いてあるように設定を行うと解決します
下記をvimrcに追記すればOK

```vim
let g:ft = ''
function! NERDCommenter_before()
  if &ft == 'vue'
    let g:ft = 'vue'
    let stack = synstack(line('.'), col('.'))
    if len(stack) > 0
      let syn = synIDattr((stack)[0], 'name')
      if len(syn) > 0
        exe 'setf ' . substitute(tolower(syn), '^vue_', '', '')
      endif
    endif
  endif
endfunction
function! NERDCommenter_after()
  if g:ft == 'vue'
    setf vue
    let g:ft = ''
  endif
endfunction
```

正確にコメントアウトされるようになります

![スクリーンショット 2018-07-16 13.05.21.png](https://qiita-image-store.s3.amazonaws.com/0/20045/8953af0e-4b61-dac9-00ac-bae4cc30ffe2.png)

以上です。
Docker で localhost に立てた ssh サーバーにホスト名を付けてアクセスする

適当に手元の ssh config でホスト名を付けてやれば良い。

# ssh config

```conf:~/.ssh/config
Host dockerhost1
  HostName localhost
  Port 10001

Host dockerhost2
  HostName localhost
  Port 10002

Host dockerhost3
  HostName localhost
  Port 10003
```

# 動作例

```
$ ssh root@dockerhost1

root@localhost's password:
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.9.87-linuxkit-aufs x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Mon Jul 16 03:57:55 2018 from 172.17.0.1
```

# 参照

- [Docker 初心者 | ssh で接続できるサーバーを立てる - Qiita](https://qiita.com/YumaInaura/items/adb20c8083fce2da86e1)

# ところで

`/etc/hosts` は portに対しての名前解決のためのものではないので使えない。

>DNS is the service that translates domain names to ip addresses so that computers can communicate with each other.
>Ports are another concept. 

- [apache - httpd: how to save 127.0.0.1:81 as a hostname in /etc/hosts - Stack Overflow](https://stackoverflow.com/questions/34980462/httpd-how-to-save-127-0-0-181-as-a-hostname-in-etc-hosts)

# 環境

- Docker version 18.03.1-ce, build 9ee9f40








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
正規表現で改行を置き換えする時は /\n|\r/g を使う

改行を置き換えるときよくやりがちな /\n/g を指定していたのですが、これだと全ての改行を網羅できません。
/\n|\r/g を指定すれば全部置き換えできます。

```replace_kaigyo.js
var kaigyonashi_text = '改行を含むテキスト'.replace(/\n|\r/g,'');
```
wifiの研究 その３

#概要

wifiを理解したかった。
wemosで、wifiに接続してみた。

#結果
11g, WPA-PSKに、接続できた。

#サンプルコード

```
#include <ESP8266WiFi.h>

const char * ssid = "001D736531AA_G";
const char * password = "";
WiFiServer server(80);
void setup() 
{
	Serial.begin(115200);
	delay(10);
	pinMode(2, OUTPUT);
	digitalWrite(2, 0);
	Serial.println();
	Serial.println();
	Serial.print("Connecting to ");
	Serial.println(ssid);
	WiFi.mode(WIFI_STA);
	WiFi.begin(ssid, password);
	while (WiFi.status() != WL_CONNECTED)
	{
		delay(500);
		Serial.print(".");
	}
	Serial.println("");
	Serial.println("WiFi connected");
	server.begin();
	Serial.println("Server started");
	Serial.println(WiFi.localIP());
}
void loop()
{
}



```

以上。
Ansible のインベントリで 別ポート・同一ホストを複数指定しても一回しか処理が走らない

「環境側でうまくやって別々のホスト名を付けてくれ」ということらしい

>This is expected behavior, you must specify a different hostname for each host in inventory. Instead of doing it this way, you should give each VM a different name in your host inventory and use the ansible_ssh_host=127.0.0.1

[Cannot specify two different ports to the same host in inventory · Issue #8306 · ansible/ansible](https://github.com/ansible/ansible/issues/8306)



# インベントリファイルの例

「同じホストでポート違う」グループを複数作る。

```conf:this_inventory_file.txt
[group1]
localhost

[group1:vars]
ansible_port=2221

[group2]
localhost

[group2:vars]
ansible_port=2222
```

# 動作例

全ホストを一覧しようとしても、localhost1個しか出てこない。


```bash
$ ansible -i this_inventory_file.txt all --list-hosts
  hosts (1):
    localhost

 https://github.com/ansible/ansible/issues/8306
```

実際にモジュールを走らせても、片方にしか処理が走らないようだった。

```bash
$ ansible -i this_inventory_file.txt all -m 'raw' -a 'echo ok'

localhost | SUCCESS | rc=0 >>
ok
```

# 対応

`~/.ssh/config` でホスト名をつけてやるなりして名前解決する。

[Docker で localhost に立てた ssh サーバーにホスト名を付けてアクセスする - Qiita](https://qiita.com/YumaInaura/items/fab4de7dca0af0795a37)

# Gist

- [Ansible closed issue | Can not list multiple hosts have different ports on a same hostname](https://gist.github.com/YumaInaura/d58b6f411453ff9b7534a536d419c242)

# 環境

- ansible 2.6.1








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ruby on Rails5.2を動かしているDockerfileの書き方

# 概要
Ruby on Rails(とVue.js)を動かすために独自のコンテナを作成しています

作成する上で困った点が合ったのでその内容の共有やより良いDockerfileの書き方に関するご意見あればと思います

## 現状の設定
下記はUbuntuベースで作っているDockerfileのRuby部分の抜粋です。
rbenvを利用してRuby2.5.1やRailsのcliツールをインストールしています。

```dockerfile:Dockerfile
### Rubyのインストール部分抜粋
RUN apt-get install -y rbenv ruby-build ruby-dev
RUN git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

RUN rbenv install -l
RUN rbenv install 2.5.1

RUN rbenv init -
RUN echo 'eval "$(rbenv init -)"' >> ~/.bashrc
RUN rbenv global 2.5.1

RUN rbenv exec gem install bundler
RUN rbenv exec gem install rails
```


## 誤った設定
```dockerfile:Dockerfile
### Rubyのインストール部分抜粋
RUN apt-get install -y rbenv ruby-build ruby-dev
RUN git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

RUN rbenv install -l
RUN rbenv install 2.5.1

RUN echo 'eval "$(rbenv init -)"' >> ~/.bashrc
RUN rbenv global 2.5.1

RUN gem install bundler
RUN gem install rails
```

Ruby install後のgemでbundlerなどをインストールしましたが
デフォルトでシステムのRuby(この時2.3系)を見ていました。

確認方法
`which bundler`

Railsコマンド(rakeコマンド)を利用する際にエラーがでてしまった時点で気づき上記のDockerfileに修正しました。
バッファ回路の必要性

#バッファ回路って何のためにあるの？
基本情報処理技術者試験の勉強で論理回路について勉強していた際、論理回路内にでてくるバッファ回路の必要性について気になったので、少し調べてみました。知ってる人からしたらツマラン内容かもしれませんが、自分の備忘録としてqiitaに残そうと思い、投稿しました。

#バッファ回路って？
論理回路をやっているとたまに出てくる、三角形の形をしたあいつです。下記画像で言えば下から３つ目にあるヤツです。（一番下のスリーステートバッファについては本文最後の参考URLに詳説があります）
![スクリーンショット 2018-04-22 17.03.56.png](https://qiita-image-store.s3.amazonaws.com/0/159675/69ec224d-0a2e-e1bc-4f65-0deebdd7ad4d.png)

#バッファ回路の必要性
AND回路やOR回路などの論理ゲートは、2入力を1出力にする役割を持っており、いわば論理回路の主要メンバーなのは理解できます。しかし、バッファ回路は1入力しか受け付けることができず、また、否定器がなければ出力の値が変化するわけでもありません。入力値がそのまま素通りしていくだけです。なぜこのような無意味なものが存在するのでしょうか。

ここで、論理回路を電気回路として見ていきます。

周知かと思いますが、論理回路は0と1でそれぞれ偽と真を表しています。論理回路は実際には電子回路または電気回路なので、回路内には電流が通っています。そしてそこにはしきい電圧という概念が存在し、入力電圧がしきい電圧より高ければ1（真）、低ければ0（偽）といったルールがあります。

回路には電気抵抗があるため、回路長が長くなるにつれて流れる電流の電圧は徐々に下がっていきます。入力時には1（真）だったものが電気抵抗により徐々に電圧が下がっていき、しきい電圧よりも低くなってしまい、0（偽）と判断されてしまうことも起こり得ます。

ここで登場するのがバッファ回路です。バッファ回路は　入力電圧を補正する役割を持ちます。つまり、電気抵抗により低下した入力電圧を補正してくれます。これにより、電気抵抗による電圧低下を防止することができるのです。

#バッファ回路は大事
こうした電気回路の事情から、バッファ回路は非常に大切な役割を果たしています。論理回路を眺めているだけではこうした事情は中々気づくことができませんね。


#参考URL
http://tech.nikkeibp.co.jp/it/members/ITPro/ITBASIC/20021011/1/
http://ednjapan.com/edn/articles/1202/01/news138.html
※スリーステートバッファについてもここに詳しく載っています。気になる方はどうぞ。
Azure AKS（Kubernetes Service）を使い始めるには

#はじめに
AKSはコンテナオーケストレーションサービスであるKubernetesの環境をオールインワンで提供するAzureのPaaSです。極めて簡単に使い始められますが、環境の準備に少しクセがあるため、ちょっとつまづいたりします。この記事は、その「つまづき」を無くしてスムーズに使い始めるためのガイドです。

#環境セットアップ
## Azureのセットアップ
Azure側のセットアップは特に悩むところはないと思うので、さらっとだけ説明すると、Azure管理ポータルに行き、検索窓で「AKS」を検索 → 画面の指示に従ってリソースグループの名前やクラスターの名前を付け、コンピューティングリソースの数（VMの数）を選んで作成するだけです。

リソースグループやクラスターの名前は、後からダッシュボードに接続する時などにも使いますし、分かりやすい名前にしておいた方が良いでしょうね。

作成実行をしてからクラスターができあがるまで、けっこうな時間がかかります。小一時間はかかるので、お茶でも飲んでゆっくり待ちましょう。


## 操作端末（Windowsクライアント）のセットアップ
コマンドで操作するのは手間ですからGUIベースで操作できるようにしたいので、Kubernetes ダッシュボードに接続できるようにします。こちらがけっこうやっかいで、いっぱいつまづきます。よく注意しましょう。

Azureでクラスターの作成が終わったら、Azure管理ポータル上で作成したAKSインスタンスの概要ページを開くと「Kubernetes ダッシュボードを表示」というアイコンというかリンクがあるので、そこをクリックすると↓のような画面が開きます。まずはこの画面の手順でセットアップするんですが、ここの説明が大ざっぱで書いてないことが多いため、詳しくないとつまづくんですよね。

![AKS1.png](https://qiita-image-store.s3.amazonaws.com/0/94690/fdd88891-5e66-a825-d618-9d84f63eeae3.png)


1. 最初にAzure Cliをインストールします。最新版を入れましょう。インストーラーは↓にあります。
https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?view=azure-cli-latest
1. PowerShellを「管理者モード」で起動します。（PowerShellのアイコンを右クリック→「管理者として実行」で開く）
1. `az aks install-cli` コマンドを実行（エラーっぽいメッセージ「Please ensure that C:\Program Files (x86) is in your search PATH, so the `kubectl.exe` command can be found.」が表示されますが、これはエラーではありません。パスを通しておこうねという注意文言です。）
1. kubectl.exeが "C:\Program Files (x86)\" にインストールされるので、環境変数にパスを通しておく。（WindowsのGUIで環境変数に追加しておくのが無難。）
1. `az login` する
　　AKSをセットアップしたAzureのユーザーでログインしましょう。
1. `az account set --subscription "サブスクリプション名"` でサブスクリプションを選択
　　AKSがセットアップされているサブスクリプションを選択します。もしサブスクリプション名が分からない場合は `az account list --output table` で表示できます。
1. Azure管理ポータルの「Kubernetes ダッシュボード」のウインドウ（上図）から3番の資格情報取得と4番のダッシュボードを開くコマンドをそれぞれコピペしてPowerShellで実行します。

ここまですると、ローカルPCでプロキシーが起動してブラウザが立ち上がり、Azure上のKubernetesクラスターのダッシュボードが表示されます。

###要注意
このままダッシュボードを開くと、Forbiddenエラーなどが頻発していて情報が見られない状態になっているはずですので、権限設定をしましょう。（参考：[KubernetesにDashboardをインストールして、認証なしでアクセスする](https://qiita.com/sheepland/items/0ee17b80fcfb10227a41)）

Azure管理ポータル上のクラウドシェルを起動し、以下の通り実行します。

```bash
$ cat <<EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system
EOF
```

これで正しく表示されるようになります。
あとはダッシュボードでいろいろいじってみましょう。
データ型の項目「数式」に、参照関係にある「選択リスト」の項目を入れる方法

# これは何？
salesforceのオブジェクトのデータ型で、「数式」というものがあります。
これを使うことで、リレーション関係にある他のオブジェクトの項目を参照することができます。

ただ一方で、参照先が「選択リスト」だと、テキストに入れることができません。
入れようとすると、こんなエラーが出てきます。
```
「エラー: 項目hogehogeは複数選択リスト項目です。複数選択リスト項目は、特定の関数でのみサポートされます。」
```

かなり力技ですが、テキスト形式として無理矢理突っ込む方法がありますｗ

# いつ使うの？
参照関係にあるデータを条件に、ビューとを作りたいときとか。

# やり方
例で示します。
取引先にあるリスト型の項目hogehogeを、取引先責任者の数式型の項目hogeに登録する場合です。

```
IF( INCLUDES( Account.hogehoge , "りんご" ) , "りんご, " , "" )
+ IF( INCLUDES( Account.hogehoge , "パイナップル" ) , "パイナップル, ", "" )
+ IF( INCLUDES( Account.hogehoge , "みかん" ) , "みかん, ", "" )
```

取引先の選択リストhogehogeに、「りんご」が含まれていたら、取引先責任者の項目hogeに、「りんご,」が入ります。
選択リストの数だけ、IFを追加していきます。

# 参考情報
https://developer.salesforce.com/forums/?id=906F00000009B6hIAE
https://help.salesforce.com/articleView?id=tips_for_using_picklist_formula_fields.htm&type=5
PyenvによるPythonのバージョン管理

# pyenvとは
pythonのバージョンを管理することができる

## pythonのバージョンの切り替え
###以下のコマンドは全てterminal上で入力する：

- `pyenv versions`でpyenvで管理しているpythonのバージョンを確認できる

- `pyenv global 3.X.X`でバージョンを切り替えられる

    - カレントディレクトリのみでバージョンを切り替えたい場合は，`pyenv local 3.X.X`を使う。
    - `pyenv global 3.X.X`で切り替わらない場合は，ホームディレクトリに間違えて`pyenv local 3.X.X`コマンドを入力し，`./python-version`ファイルを作成してしまっているかもしれないので，`rm ~/.python-version`によって削除する必要がある。


- `pyenv install 3.X.X`で指定したバージョンのPythonをインストールできる
macOS High Sierra 10.13.6 + homebrew で leveldb をインストール

#macOS High Sierra 10.13.6 + homebrew で leveldb をインストール

セミナー用のガイダンス

##leveldb
leveldb のためのformulaがあるか検索

```terminal
$ brew search leveldb
==> Formulae
leveldb                                  redis-leveldb
```

存在したので更にoption をチェックする

```terminal
$ brew options leveldb
--with-test
	Verify the build with make check
```

## leveldbのインストール
ということなので、`--with-test` オプションを指定してインストール

```terminal
$ brew install leveldb --with-test
==> Installing dependencies for leveldb: gperftools, snappy
==> Installing leveldb dependency: gperftools
==> Downloading https://homebrew.bintray.com/bottles/gperftools-2.7.high_sierra.
######################################################################## 100.0%
==> Pouring gperftools-2.7.high_sierra.bottle.tar.gz
🍺  /usr/local/Cellar/gperftools/2.7: 103 files, 4.3MB
==> Installing leveldb dependency: snappy
==> Downloading https://homebrew.bintray.com/bottles/snappy-1.1.7_1.high_sierra.
######################################################################## 100.0%
==> Pouring snappy-1.1.7_1.high_sierra.bottle.tar.gz
🍺  /usr/local/Cellar/snappy/1.1.7_1: 18 files, 118KB
==> Installing leveldb --with-test
==> Downloading https://github.com/google/leveldb/archive/v1.20.tar.gz
==> Downloading from https://codeload.github.com/google/leveldb/tar.gz/v1.20
######################################################################## 100.0%
==> make
Last 15 lines from /Users/percipere/Library/Logs/Homebrew/leveldb/01.make:
2018-07-21 19:39:28 +0900

make

mkdir out-shared
clang++ -I. -I./include -std=c++0x  -DOS_MACOSX -DLEVELDB_PLATFORM_POSIX -DLEVELDB_ATOMIC_PRESENT -DSNAPPY -O2 -DNDEBUG -fPIC -c db/db_bench.cc -o out-shared/db/db_bench.o
error: unable to open output file 'out-shared/db/db_bench.o': 'No such file or directory'
1 error generated.
make: *** [out-shared/db/db_bench.o] Error 1
make: *** Waiting for unfinished jobs....

READ THIS: https://docs.brew.sh/Troubleshooting
```

## エラー対応
`db_bench.o`が無いというエラーが発生
ファイル名からは大きな影響が無いかもしれないので、とりあえず再度実行してみる

```terminal
$ brew install leveldb --with-test
```

```terminal
==> Downloading https://github.com/google/leveldb/archive/v1.20.tar.gz
Already downloaded: /Users/percipere/Library/Caches/Homebrew/leveldb-1.20.tar.gz
==> make
==> make check
🍺  /usr/local/Cellar/leveldb/1.20_2: 26 files, 1.2MB, built in 2 minutes 13 seconds
```

完了:smile:
GUIで操作するのが面倒すぎてiTunesをターミナルで操作することを試みてみた

<br>

こんにちは、「好きなこと、おもしろいこと」をコンセプトに活動しているテックチーム soberです。

### 突然ですが、iTunesをGUIで動かすの面倒じゃないですか？

![thomas-kolnowski-707181-unsplash.jpg](https://qiita-image-store.s3.amazonaws.com/0/256631/90ba7266-806f-c9a1-3348-da6c01b03a19.jpeg)


<br>

### そんなあなたに、解決方法をみつけました！！
(すみません、自分が知りたかっただけです・・・。)

<br>

[itunes-cli](https://github.com/ktr0731/itunes-cli)というツールを使うと、なんとiTunesをターミナルで操作することができます！

![markus-spiske-207946-unsplash.jpg](https://qiita-image-store.s3.amazonaws.com/0/256631/09bb80f1-4010-2557-d3e1-2ba0887f4ca4.jpeg)

<br>

さっそくインストールしていきましょう。
[itunes-cli](https://github.com/ktr0731/itunes-cli)を動作させるには、まずgoのインストールが必要になります。

### goのインストール

インストール

```bash

brew install go
```

バージョン確認

```bash

go version
```

パスを通すため.bash_profileに追加

```bash

export GOPATH=/user/go
export PATH=$PATH:$GOPATH/bin
```

### itunes-cliのインストール

インストール

```bash

go get github.com/lycoris0731/itunes-cli/itunes
```

パスに追加

```bash

export ITUNES_CLI_FUZZY_TOOL="fzf"
```

インストール確認

```bash

itunes help
```

### iTunesをターミナルで操作

再生

```bash

itunes play
```

次の曲再生

```bash

itunes next
```

検索再生

```bash

itunes search -a xxx
```

停止

```bash

itunes stop
```

<br>

どうでしょうか？これで開発が効率化されますね:vulcan_tone1:

![jefferson-santos-450403-unsplash.jpg](https://qiita-image-store.s3.amazonaws.com/0/256631/7e38a2a0-aa4c-94fe-4afa-2f7a18dc224a.jpeg)
[関数系] htmlspecialcharsにおける注意点

# 概要

htmlspecialcharsを使うためにphp.netを読んでいたところ、そんなことやってんだ。と思ってことがあったので、メモがてら投稿。

# htmlspecialcharsの定義

```php
string htmlspecialchars (
     string $string 
     [, int $flags = ENT_COMPAT | ENT_HTML401 
     [, string $encoding = ini_get("default_charset")
     [, bool $double_encode = TRUE ]]] )
```
|引数|説明|
|:---:|:---|
|$string|変換される文字列|
|$flags|フラグを組み合わせたビットマスク。 クォートや無効な符号単位シーケンス、そして文書型の扱いを指定。 デフォルトは ENT_COMPAT or ENT_HTML401|
|$encoding|オプションの引数。文字を変換するときに使うエンコーディングを定義。省略した場合の encoding のデフォルト値は、varies PHP のバージョンによって異なる。 PHP 5.6.0 以降では、デフォルト値として default_charset の値を使用。PHP 5.4 と PHP 5.5 のデフォルト値は、 UTF-8 で、それより前のバージョンの PHP のデフォルト値は ISO-8859-1。|
|$double_encode|double_encode をオフにすると、PHP はすでに変換済みのhtmlをエンコードしない。 デフォルトでは、既存のエンティティも含めてすべてを変換。|

## $flagsの内容

| 定数名 | 説明 |
|:--|:--|
| ENT_COMPAT | ダブルクオートは変換しますがシングルクオートは変換しません。 |
| ENT_QUOTES | シングルクオートとダブルクオートを共に変換します。 |
| ENT_NOQUOTES | シングルクオートとダブルクオートは共に変換されません。 |
| ENT_IGNORE | 無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく無効な部分を切り捨てるようになります。 このフラグは使わないようにしましょう。 » セキュリティの問題が発生する可能性があります。 |
| ENT_SUBSTITUTE | 無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく Unicode の置換文字に置き換えます。 UTF-8 の場合は U+FFFD、それ以外の場合は &#xFFFD; となります。 |
| ENT_DISALLOWED | 指定した文書型において無効な符号位置を、Unicode の代替文字である U+FFFD (UTF-8) あるいは &#xFFFD; で置き換えます。 これを設定しなければ、無効な符号位置をそのまま残します。 これは、外部コンテンツを埋め込んだ XML 文書を整形式に保つために有用です。 |
| ENT_HTML401 | コードを HTML 4.01 として処理します。 |
| ENT_XML1 | コードを XML 1 として処理します。 |
| ENT_XHTML | コードを XHTML として処理します。 |
| ENT_HTML5 | コードを HTML 5 として処理します。 |

## $encodingについて

| 文字セット | エイリアス | 説明 |
|:--|:--|:--|
| ISO-8859-1 | ISO8859-1 | 西欧、Latin-1 |
| ISO-8859-5 | ISO8859-5 | ほとんど使われないキリル文字セット (Latin/Cyrillic)。 |
| ISO-8859-15 | ISO8859-15 | 西欧、Latin-9 。Latin-1(ISO-8859-1) に欠けている ユーロ記号やフランス・フィンランドの文字を追加したもの。 |
| UTF-8 |   | ASCII 互換のマルチバイト 8 ビット Unicode 。 |
| cp866 | ibm866, 866 | DOS 固有のキリル文字セット。 |
| cp1251 | Windows-1251, win-1251, 1251 | Windows 固有のキリル文字セット。 |
| cp1252 | Windows-1252, 1252 | 西欧のための Windows 固有の文字セット。 |
| KOI8-R | koi8-ru, koi8r | ロシア語。 |
| BIG5 | 950 | 繁体字中国語。主に台湾で使用。 |
| GB2312 | 936 | 簡体字中国語。国の標準文字セット。 |
| BIG5-HKSCS |   | Big5 に香港の拡張を含めた繁体字中国語。 |
| Shift_JIS | SJIS, SJIS-win, cp932, 932 | 日本語。 |
| EUC-JP | EUCJP, eucJP-win | 日本語。 |
| MacRoman |   | Mac OS で使われる文字セット。 |
| '' |   | 空文字列を指定すると、 スクリプトのエンコーディング (Zend multibyte)、 [default_charset](http://php.net/manual/ja/ini.core.php#ini.default-charset)、 そして現在のロケール ([nl_langinfo()](http://php.net/manual/ja/function.nl-langinfo.php) および [setlocale()](http://php.net/manual/ja/function.setlocale.php)) の順でエンコーディングを検出。この方法は非推奨。|

# 少しキモいと思っているところ

ここでキモいと感じているパターンの書き方を見てみる。
エイリアスを使った書き方である・・・

```PHP:なんか動く・・・その1
htmlspecialchars($pre_escape, ENT_QUOTES, 'SJIS');
```

```PHP:なんか動く・・・その２
htmlspecialchars($pre_escape, ENT_QUOTES, 'SJIS-win');
```

SJISやSJIS-winというオプションは正確にはないが、エイリアスとして用意されている。
そのため、動きはするが、プロジェクトごとにまとめておかないと、書き方が、たくさん出てくるので、どこかに定数として持たせるか、ラップ用関数を作っておくに越したことはなさそう。

# まとめ

他にもエイリアスが適用されているメソッドがPHPにはある模様。エイリアスがあるところは前述の通り、プロジェクトごとにまとめてよしなにやっておかないとつらみが噴出する可能性が否めない。注意が必要。

# 参考
- [php.net htmlspecialchars](http://php.net/htmlspecialchars)
- [「何故htmlspecialcharsを通すのか？」を一言でどうぞ](https://qiita.com/mpyw/items/19e6fed835ccdbcb0d6d)