Selenium3をMacで動かす

Selenium使うことになったので、Selenium実践入門読みながらインストールしようと思ったら、Seleniumのバージョンが3に上がってて、パッケージ構成から違ってて涙目になった。
ググったところ、下記の記事が参考になったが、一部つまづくところがあったので、自分のためにメモを残す。
なお対象のブラウザはFirefoxChrome

Selenium入門その6[Selenium3でWebDriver(Java/Junit4)の環境を作成しEdge,Chrome,Firefoxで確認してみる]

環境情報

ソフト バージョン
Mac OS X El Capitan 10.11.6
Selenium 3.4.0
mozilla Firefox 54.0.1
geckodriver 0.18.0
Google Chrome 59.0.3071.115
chromedriver 2.30

前提

環境構築

基本は参考ページ通りでいいが、chromedriverはPATHの通ったディレクトリに配置しておかないと、実行時にエラーになるっぽい。
自分は/usr/local/bin配下に配置した。

実行

参考ページのソースを以下のように微修正して実行した。

package sample.selenium3;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.DesiredCapabilities;

public class Selenium3Sample {

    @Test
    public void firefoxTest() {
        System.setProperty("webdriver.gecko.driver", "./exe/geckodriver");
        DesiredCapabilities cap = DesiredCapabilities.firefox();
        cap.setCapability("marionette", true);
        WebDriver driver = new FirefoxDriver(cap);
        driver.navigate().to("http://www.google.com");
        driver.findElement(By.id("lst-ib")).sendKeys("Selenium3");
        driver.findElement(By.name("btnK")).click();
        if(driver!=null) {
            driver.close();
        }
    }
    
    @Test
    public void chromeTest() {
        System.setProperty("webdriver.chromedriver.driver", "");  //chromedriverはPATHの通っている/usr/local/binに配置
        WebDriver driver = new ChromeDriver();
        driver.navigate().to("http://www.google.com"); 
        driver.findElement(By.id("lst-ib")).sendKeys("Selenium3");
//     driver.findElement(By.name("btnK")).click();              //動かなかった
        driver.findElement(By.id("lst-ib")).sendKeys(Keys.ENTER);    //動いた
        if(driver!=null) {
            driver.close();
        }
    }
}

参考ページからの変更点は3点。

  1. DesiredCapabilities周りの設定の削除
    なしでも動いたので削除した。Seleniumのバージョンが上がって、なしで動くようになった?
  2. chromedriverのPATH指定
    exe配下にchromedriver置いてもちゃんと読んでもらえず、エラーになってしまう。
    PATHの通ったところにchromedriverを配置したら読んでもらえたので、setPropertyの第二引数は明示的に空にしておいた。
  3. chromedriverでの検索実行
    「driver.findElement(By.name(“btnK”)).click();」だと動かなかったので、とりあえず「driver.findElement(By.id(“lst-ib”)).sendKeys(Keys.ENTER);」にした。

まとめ

参考ページをベースにちょっと変更をしたら、Selenium3を動かすことができた。参考ページに感謝。

STSをMacにインストールして日本語化する

同じような手順がネットに載っているのは重々承知しているが、
その通りやっても動かなかったので、成功した手順をメモで残す。

バージョン情報

Mac: OS X El Capitan 10.11.6
STS: 3.8.4
pleiades:1.7.27

手順

  1. STSサイトからダウンロードする
  2. 解凍する
    tar -zxvf spring-tool-suite-3.8.4.RELEASE-e4.6.3-macosx-cocoa-x86_64.tar.gz
  3. sts-bundleディレクトリ配下のSTSをダブルクリックして起動する。
    日本語化前に一度STSを起動するこの手順を抜かすと、日本語化した後STSが起動しない気がするので、やっておく。
    ワークスペースを開いてIDEの画面が見えるところまで確認したら閉じる。
  4. pleiadesサイトからダウンロードする。
    Pleiades All in One」ではなく、最新版ダウンロードからダウンロードすることに注意。
  5. 解凍する
    unzip pleiades.zip -d pleiades
  6. pleiadesディレクトリ内のfeaturesとpluginsをコピーする。ここはGUIの想定で説明する。
    手順2で作成されたsts-bundleディレクトリ内のSTSファイルを右クリックして「パッケージの内容を表示」をクリックする。
    Contents/Eclipse配下にfeaturesとpluginsディレクトリがあるので、pleiades内の同名のディレクトリ配下のファイル「jp.sourceforge.mergedoc.pleiades」をコピーする。
  7. Contents/Eclipse配下のSTS.iniのバックアップを念のため取っておく。
    cp STS.ini STS.ini.org
  8. STS.iniの末尾にオプションを追記する。
    echo '-javaagent:../Eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar' >> STS.ini
  9. sts-bundleディレクトリ配下のSTSをダブルクリックして起動する。

自分はこの手順で動いた。サンプルのプロジェクトを用いた動作確認はこちらの手順で実施した。

ゼロから作るDeep Learning 4.4節を理解するために考えたことのメモ

ゼロから作るDeep Learning 4.4節がよくわからなくて、3章から読み直したらなんとなくわかった気になったので、自分なりの理解をメモをとして残しておく。

まずわからなかったのが、以下の文章。

形状が2×3の重みWだけを持つニューラルネットワーク

最初はこの文章だけでは、どんなニューラルネットワークをイメージすればいいのか分からなかったが、図3-14と図3-16を踏まえると、入力層が2個, 出力層が3個, 隠れ層なしの1層ニューラルネットワーク(バイアスと活性化関数は省略)を意味していることがわかった。

f:id:sonomirai:20170529001749j:plain

そのあと、simpleNetを使ってみるところでまたつまづいたが、出てきている値を上図に当てはめるとイメージが湧いた。ガウス分布で重み決めて、適当な入力与えて、結果的に最大だったインデックスを正解ラベルにしているということだと思う。 普通は正解ラベルは決まっているものだが、4.4節はあくまでニューラルネットワークに必要な勾配の概念を学習するという章なので、勾配の説明のために、普通とは違うことをしているのだと思う。その後の4.5節では、MNISTデータセット使って、実際の学習に即したやり方をしている。

f:id:sonomirai:20170529000706j:plain

そのあと勾配を求めていて、dWの値を見ると、正解ラベルへの重みはマイナス、正解ラベル以外への重みはプラスになっていることがわかる。これはつまり正解ラベルの重みを大きく、それ以外の重みを小さくするよう学習を進めようとしていることがわかる。

f:id:sonomirai:20170529000819j:plain

インデックス2と値の近いインデックス0への重みdw11, dw21は値が大きいのは、「dw11, dw21の重みを今以上に大きくしたら、正解であるインデックス2との区別がつかなくなるからやめろよ!」という意味だと思う。 (こんな風に入力と重みの関係が密なのは、今学習データが1つだけだからで、2つ以上になったらこの辺りは隠れてしまう気がする。)

f:id:sonomirai:20170529000830j:plain

今回は入力が(0.6, 0.9)の1個のみだが、他の入力が来た時でも、正解を正解と判断できるように重みを更新しているということだと思う。

リンク集作成アプリ「localportal」の紹介

この投稿は「作ったアプリ自慢! Advent Calendar 2016」の23日目の記事です。

はじめに

紹介するのは、手軽に,検索しやすい形でリンクを登録できるアプリ「localportal」です。 「localportal」という名前は「HTML5のlocalstorageを使っている」+「個人用portalの役割を担っている」というところから名付けました。
まだまだプロトタイプレベルですが、最低限の機能は実装したつもりで、個人では職場で使い始めています。

利用技術

Ver0.0.5時点の利用技術は次の通りです。

AngularJS2がリリースされていますが、将来的に 別のAngular1のアプリをメンテする可能性があるので、勉強のためあえてAngularJS1を使いました。

機能の紹介

使用中の画面を見てもらうのがはやいと思うので、メインの機能である「リンクの登録」、「タグ検索」、「タグ追加」をGIF画像で紹介します。(画像はVer0.0.4時点)

【デモ1】リンクの登録

localportalは、ブラウザからリンクを登録することができます。
デモ1では、AngularJS公式サイトのAPIドキュメントページをリンクとして登録しています。
その際、登録名は「Angular APIドキュメント」、タグは「angularjs,api,docs」で登録しています。
今回のリンクは公式サイトなので、「official」のタグがあった方が後で検索しやすいですが、ここでは設定しておりません。この後のデモ3で設定します。

f:id:sonomirai:20161219200003g:plain

【デモ2】タグ検索

localportalは、タグを指定してリンクを絞り込むことができます。
デモ2では、リンクを「angularjs」、「event」、「doorkeeper」と絞り込み、Doorkeeperの「Angular Japan User Group」のページを開いています。

f:id:sonomirai:20161219200004g:plain

【デモ3】タグ追加

localportalは、登録済みリンクのタグを更新することができます。
デモ3では、「リンクの登録」で登録したAngularJS公式サイトのAPIドキュメントページを「official」というタグで絞り込もうとしたところ、「official」がタグとして設定されておらず検索できなかったことから、登録済みのリンクに対して「official」のタグを追加してから検索をし直すというシナリオを実行しています。

f:id:sonomirai:20161219200005g:plain

その他の機能はREADMEの「Usage」をご覧ください。

開発の動機

デモではWebサイト(URL表記のリンク)を登録・検索していたのですが、localportalを開発した一番の動機は、ファイルサーバのパス(UNC表記のリンク)を手軽に,検索しやすい形で登録できるアプリが欲しかったからです。
なぜURL表記のリンクではなくUNC表記のリンクかというと、仕事では日々メールやIRCでたくさんのファイルサーバのパスが送られてくるのに、この管理を効率化する仕組みがないと思ったからです。(一方のURL表記のリンクについては、会社自体がポータルサイトを持っていたり、ブラウザが頻繁に使うサイトを覚えておいてくれたりするので、UNC表記のリンクに比べるとアクセスの効率化はできていることが多いと思っています。)
ここから、「従来のファイルサーバのパスの管理方法と問題」と「localportalでの解決策」を紹介します。

従来のファイルサーバのパスの管理方法と問題

従来のファイルサーバのパスの管理方法は、次の3通りに分類できると思っています。

  1. ショートカット格納用フォルダを作って、そこでショートカットを階層構造で管理する
  2. テキストもしくはHTMLで簡単なリンク集を作成して管理する
  3. 浅い階層だけショートカットで管理していて、メールに記載のパスを開くときはメールクライアントの検索機能やGoogle Desktopの機能で検索する

1, 2の管理方法だと、リンクを階層構造で管理するので、階層構造を綺麗に保つための管理コストがかかるという点が問題となり、3の管理方法だと、メール全体が検索範囲になるので、ノイズが入ってしまって検索効率が悪いという点が問題になります。

localportalでの解決策

localportalは、タグ付け機能により、従来のファイルサーバのパスの管理方法の問題を解決しています。(しているつもりです。)

従来の問題 localportalでの解決策
階層構造で管理すると管理コストがかかる タグ機能により階層構造なしで効率的な管理ができる
メール検索だと検索範囲が広いのでノイズが入って検索効率が悪い 検索範囲をタグに限定しているので検索効率が高い

タグ付け機能自体は、最近のWebサービスだとよくある機能だと思うのですが、この機能をlocalstorageと組み合わせて、ブラウザ上でリンクの管理が完結するSPAという形にまとめてあるところは、このアプリのユニークなところかなと思っています。

おわりに

現状の実装はプロトタイプレベルで、まだまだ改善の余地がありますが、利用技術に挙げた技術や先人のノウハウのおかげで、自分が欲しいと思っていたアプリを作ることができてよかったです。
今後は利用技術の深堀やテストの仕方を学んで、アプリのユーザビリティを高めていきたいと思っています。
それでは、よいお年を。

千葉市生涯学習センターでschooを利用してきた

千葉市生涯学習センターでschooを利用してきたので、レポート書きます。
結論から言うと、自分のPC,自分のアカウントでschooの録画授業を受けられて、かなり良いという感想です。
最近敷地内にドトールが出店して、コーヒーブレイクもできるようになったので、千葉市民は活用してみるといいと思います。

schooとは

  • IT系を中心とした明日から仕事に使えるスキルが身につく学習動画を提供」しているWebサービス(サイトから引用)
  • ユーザ区分は3種類。
    • 無料の「オープン学生」
    • 月額980円の「プレミアム学生」
    • 月額1980円の「プレミアムプラス学生」
  • この文章書いてる人はオープン学生でございます。
  • 授業は2種類。
    • 生放送
    • 録画授業
  • 1授業は60分とか120分とかで、複数回の授業で1講座が構成されていたりする。ここら辺は講座によるっぽい。
  • オープン学生は生放送は見放題、録画授業はチケット1枚につき1授業受けられる。チケットは1か月に1枚もらえるとかそんな感じだった気がする。
  • ニコニコ動画のプレミアム会員になるとニコ生のタイムシフト視聴ができるようになるとか、そんなのに近いイメージ。

千葉市生涯学習センターとは

千葉市生涯学習センターでのschoo利用

受付

受付は地下1階なので、とりあえず地下1階に行く。建物の1階には「schooを利用したい人は地下1階まで」的な貼り紙はないので、ここ覚えておいてください。
schooのポスターは貼ってあるんですけどね。なんだかな。。。
受付に行ってschoo利用したい旨伝えて身分証見せると、利用方法を説明してくれます。
ここでちょっと驚いたんですが、なんと生涯学習センターでは、自分のノートPCを持ち込んで,自分のアカウントを使ってschooを受講できるそうです。
千葉市生涯学習センターのプレスには「生涯学習センター地下1階「マルチメディア体験ブース」に設置してあるパソコンから」とあったので、手ぶらで行ったのですが、自分のノートPC使えるとは。これでかいですよね。いいですよね。
で、手ぶらで行った私はどうしたかというと、貸し出してもらったiPad Proでschooを利用しました。iPad Pro使ったの初めてですよ。でけぇよiPad Pro。まさかこんなタイミングで使う機会が訪れるとは。ちゃんとキーボードといい感じのヘッドホンも貸し出してくれました。

利用場所

利用場所は受付近くのブラウジングカフェって名前のエリアのみということでした。
ブラウジングカフェは4人掛けテーブル×2、カウンター席7席くらいの空間で、WIFI, 電源がありました。ありがたや〜。
平日の午後行ったら、ブラウジングカフェの利用者は自分入れて4人でした。休日は満席になったりするのかな?わからん。 あとどうでもいいけど、椅子が長時間は座れねえなコレって感じの椅子でした。

schoo利用

自分のアカウントでログインすると、普段「オープン学生」と表示されているところに「ビジネスプラン」と表示されていて、普通に録画授業が好きなだけ受講できました。
生涯学習センター用のアカウント作るみたいな作業が一切不要で、普段使っているのと同じ感じで、録画授業を受講できるのはすごい良かったです。

まとめ

千葉市生涯学習センターでschooを利用してきました。今回は自分のノートPC持って行かなかったので,貸し出してもらったiPad Proを使いましたが、それでも自分のアカウントを使って、いつもと同じように録画授業を受講できるのはすごい良かったです。
お役所の提供するサービスだから、どうせ使いづらいんでしょって思って期待しないで行ったんですがね。いい意味で予想を裏切られました。千葉市民で良かったって思いましたね。次回は自分のノートPC持っていこうと思います。

Microservices Meetup vol.2参加レポート

2016年8月9日、株式会社FiNCで開催されたMicroservices Meetup vol.2に参加してきた。
Microservicesってバズワードになっているわりに、これまで実践している人の話って聞いたことがなかったのだけれど、この勉強会では実践している人たちの話をたっぷり聴けて、本当に勉強になった。参加してよかった。
当日のメモを公開する。

「マイクロサービスとSREの役割」by 鈴木さん@kenjiszk (株式会社FiNC)

  • マネージャー。

What is Microservices?

What is SRE?

  • Googleを発端として、インフラの人が名乗りだした。
  • 新規にやること以外はこの部署がやりますよ、みたいなイメージ。
  • SREが独立しがち。

Microservices x SRE

  • サーバの種類が多い
  • Microserviceは増える
  • SREネックになるのでは?
  • Microserviceにすると、Railsとか一個一個対応しなくちゃいけなくて辛い。
  • 1マイクロサービスに1SRE張るのも現実的じゃないしなー。

対策案

  • 業務開発チームに任せてみる

SRE育ててみた

  • 注意すべきは、セキュリティなど、SREの本質的な部分はSREで守らないといけない。

「SRECon 2016 Wrap Up」by 坂本さん@takus (スマートニュース株式会社)

  • druid.io

SmartNews

  • バイルに特化
  • スマニューには半年に1回海外の空気に触れさせる制度がある。

SRECon

  • Freedom & Responsibility
  • Netflixでは開発者に、サービスぶっ壊せるくらいの権限を与えている。
  • ぶっ壊されたらどうするの?=>開発者は変なツール使わない。 SREが作った、安全なツールがいけているから、何も言わなくてもそれ使う。

社内PaaS作った

  • 社内の課題を見つける
  • プロトタイプを作る
  • 最初の顧客を見つける

障害に現実感を持ってもらう

  • めったに起きないことに時間を割きにくい
  • 計画的にぶっ壊す。
  • Chaos Engineering
  • この辺り、うまくゲーミフィケーションの設定しようぜ。 - 障害発生時にbotにコメントしておくと、botがレポートにまとめてくれる。

SRE should be a Enabler, SRE should not be a Servant

「マイクロにしすぎた結果がこれだよ!」by 榎本さん@mosa_siru (株式会社Gunosy)

KDDIと連携して作ったニュースパスの話

  • コンポーネント分けて、権限ガチガチに分けた。
  • セキュリティグループ見れば

  • OpsWorksはラーメントッピング感覚でサーバ作れる

  • 全体構成が複雑

  • 開発が遅い
  • 障害時の調査範囲が広い ボトルネックの把握が難しい
  • オーバーヘッドが大きい 余ったリソースを融通しあえない
  • 共通部分がしんどい
  • 内部APIのIF変更が辛い モノリシックの辛さをレイヤーを変えて味わっているような感覚。。。
  • 統合管理画面がやばい

良かったこと

  • 影響範囲は局所化できた。
  • メンバー追加のハードルが低い。
  • 今のところデメリット多いけど、人が増えたら再評価されるかも。

「Microservicesの実際と対策」by 大谷さん@shot6 (株式会社 ファーストリテイリング)

  • AWSで働いてたら、作りたくなった。
  • ヘキサゴン
  • Queue, Database, Notification, File, REST, View
  • AWSの機能フル活用している
  • マルチクラウドは辛いので、どっちかに寄せたいという気持ちがある。
  • APIはSwagger。
  • elasticsearch。logstashをbeatsに置き換えたい。
  • MESOSPHERE。
  • KONG。
  • マイクロサービスは技術重要じゃない、組織、体制の話。
  • 並行開発しないなら効果出ない。
  • マイクロサービスは要件に十分な複雑さがない限りペイしない。
  • モノリシックの方が絶対的に安い。
  • CRUDAPI全部作る、いやいややりすぎでしょ、はあるある。
  • ZIPKIN。Twitterが作っているツールがある。
  • Microservicesのテスト難しい。

ウェルネスタイム

  • HIIT(High- intensity interval training)
  • タバタトレーニング
  • 椅子にお尻をちょんとつけるスクワットを20秒やって、10秒休む。これを8セット。計4分。
  • これで1時間の有酸素運動と同じ効果。

「より良いAPIを作るために」by 相川さん@awakia (ウォンテッドリー株式会社)

  • 綺麗なAPI速習会
  • Wontedlyは生まれた時からHerokuだった。
  • WebはAngular, Reactでできるだけシングルページアプリにして、API通信する。
  • BFF(Backends for Frontends)
  • SEOの問題で、Nodeがいいと思っている。
  • FacebookAPI力入れている。
  • eager loadみたいな形で作っている。
  • APIのバージョンはヘッダに入れる。
  • apig。みんながCRUDAPI全部作るの!?と言っていたところ、DBのスキーマ情報から作るようにした。

まとめ

Infrastructure as CodeやImmutable Infrastructureは、基本実践したほうがメリットがあるので、頑張って実践しよう、という感じで盛り上がっていたと思う。
それに比べるとMicroservicesを実践する/しないをしっかり見極めないと、メリット出なそうと思った。
理解しきれていない部分も多かったが、Microservices実践している人の話を聞けて、Microservicesが単なるバズワードから現実感のあるものになった気がして、本当にモチベーション上がった。 togetherはここ

CSVで吐かれるリソース情報をelasticsearch, kibanaでグラフ化する

CSVで吐かれるリソース情報を週次でグラフ化する必要があったんだけど、毎週Excel開いてグラフ作るのはだるいので、ログ可視化周りでデファクトスタンダードになっているっぽいelasticsearch, kibanaでグラフ化することにした。

手順は次の通り。

  1. elasticsearch, kibana環境を準備する
  2. リソース情報CSVをBulk API対応のJSONに変換する
  3. リソース情報JSONをelasticsearchにバルクインポートする
  4. kibanaでインポート結果を確認する
  5. kibanaでグラフを作成する

1. elasticsearch, kibana環境を準備する

環境構築は切り出してこっちに書いた。

2. リソース情報CSVをBulk API対応のJSONに変換する

今回、リソース情報CSVとして適当に作成したダミーファイルは以下の通り 日付はelasticsearchのDate型にあわせないといけない。 最初作ったダミーファイルの日付は「DD-MM-YYYY」の形式だったんだけど、これだとelasticsearchが日付と認識してくれなかった。

# memory.csv
Date,memory
2015-01-01,10
2015-01-02,11
2015-01-03,12
2015-01-04,13
2015-01-05,14
2015-01-06,15
2015-01-07,16
2015-01-08,17
2015-01-09,18
2015-01-10,19
2015-01-11,20
2015-01-12,21
2015-01-13,22
2015-01-14,23
2015-01-15,24
2015-01-16,25
2015-01-17,26
2015-01-18,27
2015-01-19,28
2015-01-20,29
2015-01-21,30
2015-01-22,31
2015-01-23,32
2015-01-24,33
2015-01-25,34
2015-01-26,35
2015-01-27,36
2015-01-28,37
2015-01-29,38
2015-01-30,39
2015-01-31,40
2015-02-01,41
2015-02-02,42
2015-02-03,43
2015-02-04,44
2015-02-05,45
2015-02-06,46
2015-02-07,46
2015-02-08,46
2015-02-09,46
2015-02-10,46
2015-02-11,46
2015-02-12,46
2015-02-13,46
2015-02-14,46
2015-02-15,46
2015-02-16,46
2015-02-17,46
2015-02-18,46
2015-02-19,46
2015-02-20,46
2015-02-21,46
2015-02-22,46
2015-02-23,46
2015-02-24,46
2015-02-25,46
2015-02-26,46
2015-02-27,46
2015-02-28,46
2015-03-01,46
2015-03-02,46
2015-03-03,46
2015-03-04,46
2015-03-05,46
2015-03-06,46
2015-03-07,46
2015-03-08,46
2015-03-09,46
2015-03-10,46
2015-03-11,46
2015-03-12,46
2015-03-13,46
2015-03-14,46
2015-03-15,46
2015-03-16,46
2015-03-17,46
2015-03-18,46
2015-03-19,46
2015-03-20,46
2015-03-21,46
2015-03-22,46
2015-03-23,46
2015-03-24,46
2015-03-25,46
2015-03-26,46
2015-03-27,46
2015-03-28,46
2015-03-29,46
2015-03-30,46
2015-03-31,46
2015-04-01,46

これをBulk API対応のJSONに変換する。 ポイントは、普通に変換するだけだと数値が文字列に変換されてしまう(""がついちゃう)ので、数値だったら数値として変換する必要があるということ。 Qiitaに掲載のスクリプトを参考に、以下の通りスクリプトを作成した。

参考

以下のコマンドを実行してmemory.csvをmemory.jsonに変換する。

cat memory.csv | ./csv2esjson.rb > memory.json

こんな感じになるはず。memoryの値に""がないので、数値として変換されているのがわかる。

"index":{"_index":"test","_type":"type1","_id":"bc171ba7-cffa-4b47-a763-1071c758e59b"}}
{"Date":"2015-01-01","memory":10}
{"index":{"_index":"test","_type":"type1","_id":"ddb85e8e-4933-4579-8aff-05073e14f201"}}
{"Date":"2015-01-02","memory":11}
{"index":{"_index":"test","_type":"type1","_id":"c9053988-cffe-47af-9bd0-82ee664dd047"}}
{"Date":"2015-01-03","memory":12}

3. リソース情報JSONをelasticsearchにバルクインポートする

curl -s -XPOST localhost:9200/_bulk --data-binary @memory.json

4. kibanaでインポート結果を確認する

http://localhost:5601にアクセスすると「Configure an index pattern」という画面になる。
「Index contains time-based events」にチェックした上で、「Index name or pattern」に「test」と入力する。
testはjsonの_indexで指定した値。うまくいっていれば、ちょっと待つと「Create」というボタンが表示される。
「Time-field name」には「Date」と表示されているはず。
ここに何も表示されていなかったら、それは日付型の指定がうまくいっていないということだと思う。
「Create」を押す。Fieldsで、「Date」のtypeが「date」, 「memory」のtypeが「number」になっていることを確認する。

5. kibanaでグラフを作成する

「Discover」タブを押す。「No results found」と表示されるが、それは表示範囲が直近15分だから。
右上の「Last 15 minutes」を変更するとグラフが表示されるはず。
その後は「Visualize」タブを押して、任意のグラフを作成する。 スケールの変更もGUIで簡単にできるし、ここは問題ないと思う。