JavaでGoogleスプレッドシートを使う


最初に

Javaプログラムで処理した結果をスプレッドシートに出力したかったので、まずクイックスタートをやってみました。

公式ページ

使うのに必要なもの

スプレッドシートを使うにあたって必要な要件です。

  • Java1.7以上
  • Gradle2.3以上
  • インターネットとWebブラウザ
  • Googleアカウント

APIを有効にする

Step1のthis wizardのリンクをクリックする。
「APIを有効にする」の画面が表示される。
「プロジェクトを選択」をクリックする。
「+」アイコンをクリックする。
「新しいプロジェクト」画面に遷移。
「プロジェクト名」を入れ、「作成」ボタンをクリックする。

最初の「APIを有効にする」画面に戻るので、「プロジェクトを選択」から作成したプロジェクトを選ぶ。
G Suite APIsのSheets APIを選ぶ。
有効にするをクリックする。
Google Sheets APIのダッシュボード画面にある「認証情報を作成」をクリックする。

左ペインの認証情報をクリックする。
「OAuth同意画面」のタブを選択する。
メールアドレス、ユーザーに表示するサービス名を入力し、保存ボタンをクリックする。
「認証情報」タブを選択する。
認証情報を作成をクリックし、OAuth クライアントIDをクリックする。
アプリケーションの種類でその他を選択し、作成をクリックする。
「名前」に名称を入れる。
OKボタンをクリックし、ダイアログを閉じる。
JSONをダウンロードするアイコンをクリックしダウンロードする。
ファイルに適当な名前を付けて、Javaプロジェクトのディレクトリに置く。
例)client_secret.json

GradleでJavaプロジェクトを作成

公式ページにはgradleコマンドでプロジェクトを作成していますが、IntelliJ IDEAで作成しました。
Gradleで普通に作れば大丈夫です。

build.gradleのdependenciesに下記を追加します。
compile ‘com.google.api-client:google-api-client:1.22.0’
compile ‘com.google.oauth-client:google-oauth-client-jetty:1.22.0’
compile ‘com.google.apis:google-api-services-sheets:v4-rev478-1.22.0’

次にclient_secret.jsonをsrc/main/resources/に置きます。

実行

公式ページにあるサンプルソースをコピペして実行します。
初回起動時にはブラウザで認証が必要になります。
認証を行えば実行結果を得られます。

以上です。


IntelliJ IDEAでGradleのJavaプロジェクトを始める


IntelliJ IDEAを使ってGradleのJavaプロジェクトを始めるときの備忘録。

プロジェクトの作成

IntelliJ IDEAを起動し、「Create New Project」をクリック。

「Gradle」、「Java」を選択し、Next。

「GroupId」、「ArtifactId」を入れて、Next。
GroupId・・・パッケージ名
ArtifactId・・・プロジェクト名

下記にチェックを入れる。
「Use auto-import」
「Crate directories for empty content roots automatically」
下記チェックは外す。これを外す理由
「Crate separate module per source set」
それで、Next。

「Project name」、「Project location」は適宜入れて、Finish。

Gradleのディレクトリ構成のプロジェクトができる。

ソースの追加

Projectのディレクトリ構成から、
Gradle – src – main – java まで開き、右クリックで、New – Packageを選択。
パッケージ名を入れる。

できたパッケージを右クリックし、New – Java Classを選択。
クラス名を入れる。

適当にプログラムを書く。

クラスの横に実行マークが付いているのクリックする。

さらにダイアログが出て来るのでRunをクリックする。

ビルドが始まり、実行される。
実行結果は、画面下のRunのウィンドウに表示される。

ライブラリ追加

「Project Structure」のアイコンをクリックし、ダイアログを開く。

Libraries – + – From Maven…をクリックする。

コマンドライン引数のパーサをするライブラリargs4jを入れてみます。
開いたダイアログでargs4jを検索します。
テキストボックスにargs4jを入れて、虫眼鏡アイコンをクリックする。
いろんなバージョンが表示されますが、新しいバージョンを選んで、OKをクリックする。

Choose Modulesダイアログで1つだけGradleSampleと出てくるので、OKをクリックする。

Modules – GradleSample – Dependenciesタブにargs4jのライブラリが入っていることを確認する。
OKをクリックする。

args4jを使ってみる

上記手順でライブラリを使えるようになったので使ってみます。
ざっくり書いてみます。

コマンドラインで-fオプションを指定すれば、フィールドhogeに入ります。
IntelliJ IDEAから引数を指定するためにRun Configurationsのダイアログを開きます。
「Program arguments」に「-f」の後、文字列を入れます。

実行すると、オプションに指定した文字列が表示されます。

とりあえず、以上です。


headless Chromeの起動


Chrome59からheadlessで起動できると話題なので試しました。

Google公式に詳しく記載されています。

cliで起動とかはうまくいったのですが、LighthouseのChromeLauncherを使おうとするとエラーが発生しました。

Lighthouseが2.0から変わったようです。
上記のエラーではないのですが、似たようなIssueがありました。
内容を抜粋すると下記のようにすると起動できます。

requireするファイル、起動用の関数やオプションの指定の仕方も変わったようです。
サンプルのGitHubです。

以上です。


node.jsでMySQLを使う


node.jsでMySQLを使う場合、ググるといっぱい出てきます。

クラスメソッドのブログ

Qiitaの記事

npmにMySQLのライブラリがありますので、それを使用します。
MySQLのnpm
READMEによると下記のように使用します。

ライブラリのインストール

$ npm install mysql

接続情報とクエリーの実行

createConnection関数でMySQLのホスト名、ユーザー名、パスワードなどを定義し、
query関数でSQLを実行、コールバック関数で結果を受け取ります。

もうちょっと使いやすく

1ファイルに記述するのは上記のやり方で十分ですが、
実際には、接続情報は1箇所に記述したいですし、コネクションプールも使いたいかなと。
下記サイトが参考になりました。

How To Use MySQL With Node & Express

一部抜粋します。

本番用、テスト用のモードを指定し、使用するデータベースを分けています。
また、createPool関数でコネクションプールを使うようになっています。

以上です。


スクレイピング-SpookyJS編-


前回 CasperJSでスクレイピングしましたが、node.jsからは使用できなかったので、
node.jsから使用できるSpookyJSでスクレピングしてみました。

SpookyJS公式

SpookyJSはnode.jsからCasperJSを起動するようにしたライブラリです。
casperjsコマンドを内部で実行しているようです。

簡単なサンプルを作りました。GitHub

SpookyJSのインストール

CasperJS、PhantomJSのインストールも必要です。
SpookyJS自体はnpmでインストールできます。

$ npm install spooky

SpookyJSでスクレイピングする処理を書く

googleで”スクレイピング”を検索し、結果を表示します。

spooky.then内で定義している関数がPhantomJS内で実行されるJavaScriptになります。
‘load’イベントを作成し、その引数にCSSセレクタで指定した要素からhref属性を取得し、そのhrefを返します。
spooky.on(‘load’・・・で定義したところでイベントを受信します。
この動作自体はCasperJSと同じですが、SpookyJSなら受け取った値をmysqlのライブラリを使ってDBへ登録など、
node.jsのライブラリをも使うことができます。
CasperJSのwaitTimeoutやstepTimeoutも指定することができるので、Ajaxのページでも値が取ることができます。

以上です。


スクレイピング-CasperJS編-


目的

CasperJSを使ってスクレイピングしてみます。

CasperJS公式

CasperJSは、PhantomJSを使いやすくラッピングしたJavaScriptです。
最初は、node.jsのライブラリと思ってましたが、使ってみたらそうではなく、
casperjsというコマンドで実行します。
そのためnode.jsの他のライブラリを使うことはできませんでした。

CasperJS、PhantomJSのインストール

最初はPhantomJSからインストールします。

PhantomJSのダウンロードページ

各OS毎にバイナリが用意されています。
今回はMac OS X版をダウンロードし、zipを展開します。
展開するとバイナリが出てきますので、適当にパスが通ったところに置きます。
例)
mv ~/Download/phantomjs-2.1.1-macosx /usr/local/

次にCasperJSをインストールします。npmで簡単にインストールできます。

npm install casperjs

CasperJSでスクレイピングする処理を書く

CasperJSの実行

casperjsコマンドで実行します。

$ casperjs casperjs_sample.js

下記のようにログ出力されました。

/url?q=https://ja.wikipedia.org/wiki/%25E3%2582%25A6%25E3%2582%25A7%25E3%2583%2596%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AC%25E3%2582%25A4%25E3%2583%2594%25E3%2583%25B3%25E3%2582%25B0&sa=U&ved=0ahUKEwjH7s223I3SAhUMbbwKHWkWAroQFggYMAE&usg=AFQjCNHZAORThLyskf3nDxY9SlIMZY3Mvg
/url?q=https://ja.wikipedia.org/wiki/%25E3%2582%25A6%25E3%2582%25A7%25E3%2583%2596%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AC%25E3%2582%25A4%25E3%2583%2594%25E3%2583%25B3%25E3%2582%25B0&sa=U&ved=0ahUKEwjH7s223I3SAhUMbbwKHWkWAroQFggcMAI&usg=AFQjCNHZAORThLyskf3nDxY9SlIMZY3Mvg

期待するものは、httpsから始まるURLですが、最初に”/url?q=”という文字がついています。
どうもユーザエージェントの指定で結果が変わるようです。
CasperJSのデフォルトのユーザエージェントは下記のものでした。

Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) CasperJS/1.1.3+PhantomJS/2.1.1 Safari/538.1

ユーザエージェントをChromeのものに変えると期待するURLを得ることができました。

casper.userAgent(“Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36”);

スクレピングするならbotらしいユーザエージェントが良いのだと思います。

以上です。


MacBook Pro(Late 2016)がやってきた


ようやくMacBook Proが到着しました。
注文日:2016/10/29
到着日:2016/12/03
5週間くらいかかりました。
以前使っていたのはMacBook Air(Late 2011)なので5年ぶりの新調です。

MBP2016

MBP2016

スペック

注文内容より転記。

13インチMacBook Pro – スペースグレイ
2.9GHz Dual-core Intel Core i5
16GB 2133MHz LPDDR3 SDRAM
Intel Iris Graphics 550
512GB PCIe-based SSD
Four Thunderbolt 3 ports
Touch Bar and Touch ID
Force Touch trackpad
KYBD/USER’S GUIDE-JPN
COUNTRY KIT-JPN

使ってみた感想

とりあえず開封して環境を整えての感想です。

外観

MacBook Airより重いけど、薄い。
実際に横に並べてみるとAirの一番厚い部分よりも薄いです。

トラックパッドが大きく、クリックも軽いので快適です。

キーボードのストロークが浅く良くないと前評判でしたが、実際使ってみると悪くありません。
浅いは浅いですが、キーの反発も強いので打ちやすいと思います。

電源にケーブルを巻き付ける仕組みがなくなっていて、
ケーブルをまとめるのがやりにくそうです。
また、接続部分がMagSafeのようにカチッと気持ち良くいかず、
グッと挿し込む必要があります。
抜くときもグッとやるので、抜いた反動で手が近くに置いていた携帯に当たり、テーブルから落ちる事故が。。。
気をつけたいと思います。
このケーブルですがUSB Type-Cなので、MacとNexus5Xをつなげることができました。

スペック的に以前使っていたAirよりも遥かに上がっているので快適なのは間違いありません。

TouchBar

一番気になっていたTouchBarですが、対応しているアプリケーションが少ないのでなんとも。。
SafariでYoutubeを再生するとシークバーが出てきますし、新規タブを開くとブックマークが出てきます。
複数タブを開いてるとタブの内容が表示されています。タップでタブが切り替えられます。
とはいえこれくらいの機能だと使うかというと使わないかなぁと。
ChromeはまだTouchBarに対応していないようで、TouchBarには最小限のものしか出ていません。
これからアプリケーションが対応してきたら違ってくるのかもしれません。

TouchBarがファンクションキーを兼ねていて、fnキーを押すとF1からF12が表示されます。
カタカナに変換とかいちいちfnキー押さないといけないのが手間です。
何か改善できないかと情報探しています。

escキーが端っこから少しずれて右に寄っていて気になりますが、
escキーじゃない左側をタップしてもキーが反応しているので、
特に気にならないかもしれません。

MBP2016 esc

MBP2016 esc

まとめ

  • 薄い
  • トラックパッド快適
  • キーボードの打鍵感は気にならない、慣れそう
  • 電源ケーブルは巻き付けられない
  • TouchBarは対応アプリケーション待ち
  • 文字入力中はファンクションキーを常時出したいけどどうしたら良いんだろう
  • escキーは特に問題にならなさそう
  • 以前使っていたMacよりスペックが大幅に上がって感動

—-
2016/12/10追記

> 文字入力中はファンクションキーを常時出したいけどどうしたら良いんだろう

カタカナ、半角全角英数への変換をファンクションキーでやっていましたが、
Macではcontrolを押しながらやる方法が存在していました。知らなかった。。。

Macの英数・カタカナ変換はファンクションキーではなくControlキーを使う

Google日本語入力で確認しました。

ショートカット 変換
cotrol+j ひらがな
cotrol+k カタカナ
cotrol+l 全角英数
cotrol+; 半角
カタカナの状態で変換すると半角カタカナ
英数の状態で変換すると半角英数になる

以上です。


NURO光のONU(F660A)のSambaを使ってみたらMacからつながらなかった


最初に

我が家の回線はNURO光を使っています。
NURO光のONUにはUSBが付いており、そこにUSBメモリ等を接続することで簡易的なNASになります。
せっかくなのでUSBメモリを買ってきて使ってみました。

結果は以下の通りです。
WindowsPC・・・日本語で書き込む以外問題なし
Android・・・日本語は文字化けするが使える
Mac・・・アクセスできない
iPad・・・日本語は文字化けするが使える

環境

ONU・・・ZXHN F660A(ファームウェア:V1.0.10P4T1)
WindowsPC・・・Windows10
Android・・・Nexus5X(Android7.0)
Mac・・・MacBook Air(OS X El Capitan 10.11.6)
iPad・・・iPad Air(10.0.1)
USBメモリ・・・Transcend 64GB TS64GJF790KPE

やったこと

Sambaを有効にする

  1. F660AにUSBメモリを挿す。
  2. F660A管理画面にログインする。
  3. 左側メニューのアプリケーション-ホーム共有(samba)をクリック
  4. 「Sambaサーバを有効」にチェックを入れる。
  5. 「ホスト名」に名前を入れる(今回はnuroにしました)

各チェックボックスの意味は取説を参照してください。
F660Aの取説

WindowsPCからアクセス

エクスプローラーからネットワークを開くと、ネットワークに「NURO」というコンピュータが表示されます。
「\\NURO\samba\usb1_1」のパスでアクセスできました。
ファイルの読み込み・・・OK
ファイルの書き込み・・・OK
日本語ファイル名・・・事前に日本語で用意したファイルの表示は問題ないが、Samba経由でファイルを日本語で作成すると表示がおかしい。

Android携帯からアクセス

Androidから「X-plore File Manager」というアプリを使用しました。
ファイルの読み込み・・・OK
ファイルの書き込み・・・OK
日本語ファイル名・・・NG

Macからアクセス

MacのFinderから「サーバへ接続」で試みましたが接続自体できませんでした。
サーバアドレスに「smb://nuro/samba/」で接続できるはずですが、下記エラーが発生しました。

F660A samba error

サーバ”nuro”への接続で問題が起きました。
接続しようとしているサーバのバージョンはサポートされていません。
システム管理者に問い合わせて、この問題の解決を依頼してください。

またMacのコンソールにもエラーが出ていました。

2016/11/20 15:30:40.000 kernel[0]: smb1_smb_negotiate: Support for the server NURO has been deprecated (PreXP), disconnecting

何かしらバージョンがサポート対象外のようです。
エラーメッセージをググりました。

10.9.2 Mavericks and can no longer connect to our SMB file share on the network.

MavericksからSMBのバージョンが上がって、旧バージョンは使えなくなったような事が書かれていそうです。

10.9: Switch the SMB stack to use SMB1 as default

強制的にSMB1を使用する設定があるようです。
しかしこの設定を試してみたのですが、接続はできませんでした。。。
El Capitanまでいくとまた変わっているのかもしれません。そこまでは調べられませんでした。。。

iPadからアクセス

iPadから「FileExplorer Free」というアプリを使用しました。
ファイルの読み込み・・・OK
日本語ファイル名・・・NG

書き込みはFree版だと機能提供されていないので試せませんでした。

以上です。


ES2015の環境作成(Babel、watchify)


ES2015でJavaScriptを書こうと思い環境構築を始めましたが、
新旧情報があり何をすれば良いのかいまいちわからなかったので、
手順を残します。

2016/06/15時点の情報です。

npmはすでにインストール済みの状態で始めます。

1. workディレクトリを作成する。

$ mkdir work
$ cd work

2. npmで初期化する。

$ npm init
全部エンターで作成してみる。
変更したい所があれば随時変更する。
package.jsonが作成されます。

3. 必要なライブラリをインストールする。

$ npm install –save-dev watchify
$ npm install –save-dev babelify
$ npm install –save-dev exorcist
$ npm install –save-dev babel-preset-es2015

4. .babelrcを作成する。

$ vi .babelrc
下記の設定を記述する。
{
“presets”: [“es2015″]
}

5. watchifyを起動する設定を記述する。

毎回watchifyコマンドで起動してもよいのですが、
npmコマンドで簡単に起動できるように設定ファイルに記述します。

$ vi package.json
以下のwatchの記述を追加する。
scripts: {
test: echo \”Error: no test specified\” && exit 1,
“watch”: “watchify -t babelify ./index.js -o ‘exorcist ./build.js.map > ./dist/index.js’ -d”
}

出力用のディレクトリも作成しておきます。
$ mkdir dist

入力用のファイルを作成しておきます。中はからでもOKです。
$ touch index.js

入出力用のファイル、ディレクトリが無いとwatchify起動時にエラーになります。

6. watchifyを起動する

$ npm run watch

これでindex.jsを保存するたびにトランスパイルされたJavaScriptが生成されます。

以上です。