お米炊けるまで備忘録

プログラミング数年目のがくせい

MacでEmacsにパッケージを導入するまで

VSCodeやらAtomやらばかり使っていて久しくEmacsに触れていなかった間にパッケージの導入方法を完全に忘却していたので備忘録として。

環境

今回の作業環境は以下の通りです。

  • 2017年6月13日時点
  • macOS Sierra 10.12.5
  • Emacs 25.2.1
  • Homebrew 1.2.2
  • Homebrew-Cask 1.2.2

最新版のEmacsのインストー

Macにデフォルトでインストールされているバージョン22のEmacsはパッケージの管理に関する機能が搭載されていないなど、色々と不都合があります。(現時点での最新版は25.2)

f:id:hakumai164:20170613010017p:plain

Homebrew-Caskを使用して最新版のEmacsをインストールします。
“Homebrew"はmacOS用のパッケージマネージャー、"Homebrew-Cask"はHomebrewで扱うパッケージの範囲をGUIアプリケーション等まで拡大したものですが、ここでは詳しい説明は省略します。

$ brew cask install emacs
==> Downloading https://emacsformacosx.com/emacs-builds/Emacs-25.2-universal.dmg
######################################################################## 100.0%
==> Verifying checksum for Cask emacs
==> Installing Cask emacs
==> Moving App 'Emacs.app' to '/Applications/Emacs.app'.
==> Linking Binary 'Emacs' to '/usr/local/bin/emacs'.
==> Linking Binary 'ctags' to '/usr/local/bin/ctags'.
==> Linking Binary 'ebrowse' to '/usr/local/bin/ebrowse'.
==> Linking Binary 'emacsclient' to '/usr/local/bin/emacsclient'.
==> Linking Binary 'etags' to '/usr/local/bin/etags'.
🍺  emacs was successfully installed!

ここで取得したEmacsはそのまま実行するとGUIEmacsが起動してしまうので、CUI版を実行するためには-nwオプションを使用します。

$ emacs -nw

バージョン25のEmacsが導入できました。

f:id:hakumai164:20170613013421p:plain

パッケージのインストー

Emacsを起動し、M-x list-packages を入力し実行します。
利用可能なパッケージの一覧が表示されます。 f:id:hakumai164:20170613015449p:plain

インストールしたいパッケージの行にカーソルを移動し、iキーでマークが付きます。 f:id:hakumai164:20170613020103p:plain

選択後、xキーでインストールを実行します。

パッケージリポジトリの追加

list-packagesで表示されるパッケージは、デフォルトではEmacsの公式リポジトリに含まれているもののみが表示されますが、それとは別に参照する外部のリポジトリを追加することも可能です。
今回は有名なパッケージが多数含まれている"MELPA"というリポジトリを追加します。

設定ファイル~/.emacsを開き、(package-initialize)という記述がある行の直後に以下を追記し、リポジトリを追加します。

;; MELPA-stable
(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/") t)

その後、再度Emacsを起動、list-packagesを実行しパッケージ一覧を表示させた後、M-x package-refresh-contents を実行しパッケージリストを更新します。

MELPAに含まれるパッケージをインストールすることが可能になりました。 f:id:hakumai164:20170613024324p:plain

おわり

3年前に似たような事書いた時*1はなんか2,3日かかった気がするんですが、今見たらEmacs22と24の両立とかいうこれ意味あるのかなあ、と感じるような事を書いていたので大人しく最新版を使うのが良いと思います

はじめてのReact.jsで詰まった

クッソ久々の更新

この記事は"coins Advent Calendar 2016" 20日目の記事です。
www.adventar.org

ひょんなことからReactを触ってみたのでその時困ったことなどを書きたいと思います。

Reactってなに

Reactは、Facebookが開発したJavaScriptライブラリです。
主にWebページ上のUI部品の構築・描画に関する機能を提供します。

細かい機能や扱い方などは、公式チュートリアルなりWeb上の記述なりを探していただければと思いますが、ざっくりと特徴を挙げると以下のようになります。

こんな感じでしょうか。

一応コードの例を挙げてみたいと思います。
コンポーネントの作成例です。ボタンを表示し、押すとその数だけ下に「ほげ」が表示されます。

class ClickButton extends React.Component {

   constructor(props) {
      super(props);
      this.state = {
         text: ""
      };
      this.addHoge = this.addHoge.bind(this);
   }

   // "hoge"を追加する関数
   addHoge() {
      this.setState({
         text: this.state.text + "hoge"
      });
   }

   // 実際にDOMに追加されるHTMLを記述
   render() {
      return (
         <div className="clickButton" >
            <button onClick={this.addHoge}>{this.props.name}</button>
            <div>
               {this.state.text}
            </div>   
         </div>   
      );
   }
}


上記のコードで作成したコンポーネントは、以下のような記述で呼び出し、idが"wrapper"のdiv要素の中に追加することができます。

ReactDOM.render(
   <ClickButton name="おしてね" />,     // name属性の値はコンポーネント内でthis.prop.nameで参照できます
   document.getElementById("wrapper")
);

こちらで実行結果を確認できます。

ボタンを押すと、onClickに指定されているaddHoge関数が呼び出され、this.state.textの値が変更されます。この時、コンポーネントは、stateの変更を自動でキャッチし、render関数が再度実行され再描画されます。


このように、Reactは画面のパーツをコンポーネントとして管理し、ユーザーの入力に応じた変化への対応に長けたライブラリと言えます。

Reactをいきなり使おうとして困ったこと

そんなReactですが、初めて触ってみるにあたって、ブラウザ上で動かせる状況になるまでに詰まった点がいくつかあったので挙げてみたいと思います。

「なんかJSの中にHTMLが混じってるんだけど」

先述のコードのように、Reactに関連するコードにはJavaScriptの内部にHTMLのような記述が混じる構文が頻繁に出てきます。これは"JSX"と呼ばれるJavaScriptの独自拡張構文です。厳密にはHTMLのタグがそのまま使える訳ではありませんが、ほぼ似たような形で書くことができます。

最終的には普通のJavaScriptに変換して実行するため、厳密には必ずJSX構文で書く必要はありませんが、使ったほうが分かりやすく書けると思います。

「どうやって読み込むの」

npmのようなパッケージマネージャーを使えばよいと思いますが、単純に使うだけなら以下の記述でソースコードを読み込めば十分です。

<script src="https://unpkg.com/react@15/dist/react.min.js"></script>
<script src="https://unpkg.com/react-dom@15/dist/react-dom.min.js"></script>

「これどうやって実行するの」

JSX構文のJavaScriptはそのままではブラウザ上で実行できないため、JSX構文でない通常のJavaScriptに変換する必要があります。

変換する方法はいくつかありますが、一番簡単なのは"JSXTransformer"を使用することです。

<script src="http://fb.me/JSXTransformer-0.12.1.js"></script>
<script src="path/to/jsxfile.jsx" type="text/jsx"></script>

これでページをロードする際にJSXファイルをその場で変換し、JavaScriptとして実行することができます。しかし、本番環境でこの方法を使用することは推奨されていません。(読み込みが明らかに遅くなります)

他の手段として、Babelというコンパイラを使用し、あらかじめJavaScriptに変換しておく方法があります。

$ npm install -g babel-cli babel-preset-react

上記のようにBabel本体とJSX用のプラグインをインストールすると、以下のコマンドで変換することができます。

$ babel input_jsx_file.jsx > output_js_file.js


他にもwebpackやbrowserifyを使用する等の方法があるようですがこの辺りは使った事が無いので省略します。

JavaScriptにclass構文ってあったっけ」

これは厳密にはReactとは関係無いですが、Reactに関して調べる際に公式チュートリアルや他サイトのサンプルコード等で頻繁に見かけたので一応。

2015年5月に公開されたECMAScript2015*1(ES6)より、JavaScriptにclass構文が追加されました。

以下はclass構文を使用しない例です。

var Hello = React.createClass({
  render: function() {
    return (
      <div>Hello {this.props.name}</div>
    );
  }
})

これをclass構文を使用すると以下のように記述することができます。

class Hello extends React.Component {
  render(){
    return (
      <div>Hello {this.props.name}</div>
    );
  }
}

他にもアロー関数やlet, constを使った変数宣言の機能などが追加されていますがそれは省略します。


このES6の構文は、記事を書いている現在ではIE11等のブラウザがまだ未対応*2なので、それ以前の構文に変換する必要があります。


先述したJSXTransformerでは、JSXファイルを読み込む際に以下のように"harmony=true"を追加することで、class構文やアロー関数など、ES6の構文の一部が使用できます。

<script src="path/to/jsxfile.jsx" type="text/jsx;harmony=true"></script>

Babelの場合は、ES6用のプラグインを追加で導入することで変換の際にES6の構文に対応できます。

$ npm install -g babel-preset-es2015

おわりに

ここで挙げた点はReactの公式Docsやチュートリアルをちゃんと読めば分かる事かもしれませんが、私のような英語流し読みマンはもしかしたら同じような所で詰まるかもしれませんので、参考になれば幸いです。

Reactはライブラリという位置づけからも言えますが、JavaScriptは各種フレームワークと比べて、学習コストが低く手が出しやすい割に慣れればかなり便利に扱えると思います。触った事が無い人も、もし興味が湧いたらとりあえずチュートリアルを読んで雰囲気だけでも掴んでみると良いのではないでしょうか。

おわり。
マサカリはお手柔らかにお願いします。

*1:ECMAScript : Ecma Internationalによって策定されている、JavaScriptの標準仕様

*2:参考 : http://caniuse.com/#search=ES6

WordPress導入時にディレクトリの位置で混乱した話

VPS、いろいろあるけど自分は↓のサービスを使ってます。
http://dream.jp/vps/

選んだ理由はなんだったか、ぱっと見安かったから?色々考えてた訳ではないです。

 

ドメイン取得して自分のWebページ運用するのが契約した主目的だったので本当にそれだけでしか使ってなかったんですが、このVPS、契約時に「ブログセット」なるものを選択すると初期の状態からWordPressがインストールされているんですね。んで折角なので初期設定してみました。

f:id:hakumai164:20160102183101p:plain http://dream.jp/vps/service.html より。真ん中のやつ

 

と言っても実際の初期設定の手順に関しては省略。特に何もなかった。公式のチュートリアルによると「http://<ドメイン名>/blog」がWordPressのアドレスらしい。

 

んで設定終わったあと、もう1回アクセスしてみると、

f:id:hakumai164:20160102194910p:plain

それっぽい画面とサンプル投稿らしきものが。確かに設定できたらしい。

じゃあ実際のところ<ドキュメントルート>/blog下にはどんなファイルが入っているだろうか。設定時間かかったしさぞかしごちゃごちゃした構成なんだろうなあ。
f:id:hakumai164:20160102195618p:plain

何もありませんでした。残念。

というわけでWordPressの関連ファイルを探してみた。
f:id:hakumai164:20160102200302p:plain

ドキュメントルート(htmlディレクトリ)のひとつ上に置いてありました。

じゃあWordPressの設定でここを参照してるようにしてるのかなあ、と見てみたら、

 f:id:hakumai164:20160102200813p:plain

blogディレクトリ指定してました。どういうこったい。

そもそもURLで指定するからドキュメントルートより親の階層は覗けないし、ここじゃ対処できない。WordPressのデータベース内の記述もちょっと見てみたけど正直良く分かりませんでした。

んで結局

http.confでインクルードされてたwordpress.confでエイリアス設定されてただけでした。

f:id:hakumai164:20160102201806p:plain

これでhttp://<ドメイン名>/blogに対するアクセスで/var/www/wordpressを参照するようにしていたようです。多分これだけ。

 

これって

ドキュメントルート下に置いてないファイルもWebから参照できますし結構便利なんじゃないですかね。パーミッション周り気をつけないと大変なことになりそうですけど。

 

サーバー移転作業

ServersMan@VPSを借りておきながら自前のページは未だにさくらのレンタルサーバーで運用していたので移転作業した話。

Apache導入

移転先のサーバーにWebサーバーソフトウェアApacheをインストール。

# yum install httpd

インストールしたhttpdを再起動等の時に自動起動するようにする。

# chkconfig httpd on

/etc/httpd/conf/httpd.confを編集して設定の変更。
記述の最後に以下を追記。

# サーバーの情報の非表示
ServerTokens ProductOnly
# サーバー署名の非表示
ServerSignature off

以下の記述を探す。

# <Directory "/var/www/html">



Options Indexes FollowSymLinks ←これ

これを以下のように変更。

# index.htmlが存在しない場合のファイル一覧表示の禁止
Options -Indexes
ファイルの移行

元のサーバーに置いてあったWeb用のデータを丸ごとVPSの/var/www/html/下にコピーする。

さくら側のドメイン設定削除

さくらのレンタルサーバーのコントロールパネルでドメインの設定を削除する。

f:id:hakumai164:20150216001955p:plain

ネームサーバーの設定を変更

独自ドメインのネームサーバーを変更する。
今まではさくらのネームサーバーを使用していた(らしい。さくらサーバーの初期設定の時に何も考えずに設定していたが、ドメインの登録時にネームサーバーの登録も行われていたのか)が、お名前.comのネームサーバーに変更する。

お名前.comの設定ページから「DNSレコード設定を利用する」を選択

f:id:hakumai164:20150216003917p:plain

独自ドメインVPSIPアドレスを関連付けさせるようにDNSレコードを追加。

f:id:hakumai164:20150216004537p:plain

"TYPE"の項目は"A"("Adress"?)、"TTL"の項目は"3600"(キャッシュ生存時間)、"VALUE"の項目はサーバーのIPアドレスを入力する。

一番下のネームサーバー変更確認のチェックボックスにチェックを入れる。

f:id:hakumai164:20150216005105p:plain

ここまでやったら入力した情報を確認して設定を保存。

おわり

DNSの変更が浸透するまでしばらく時間がかかるものの、これで最低限の設定は終わったかと。
完全に手探りで作業したのでどこかでやらかしてそうなのが怖いところ

これで現状、さくらのレンタルサーバーが完全に使われなくなってしまったので何か使用用途を考えたいところ。確か1年契約だったはず

VPSを借りたので初期設定

botつくりてえ」

「プログラム動かすサーバーが必要」

「ならVPSを借りればいいじゃない!(・∀・)」

というわけでVPSを契約したので初期設定。

ドットインストールのVPS関連のページ参考。
http://dotinstall.com/lessons/basic_sakura_vps

契約した

今回使うのはServersMan@VPSのEntryプラン。安かった。
http://dream.jp/vps/

f:id:hakumai164:20150124225718p:plain

契約の流れは省略。
データセンターの場所は東京、初期OSはCentOS7 64bit、テンプレートはブログパックを選択した。

初期設定

接続

sshコマンドを使ってrootユーザーで接続。初期設定ではssh用のポート番号は3843。

$ ssh -p 3843 root@xxx.xxx.xxx.xxx
パッケージ更新とか

パッケージの管理にはyumコマンドを使う。最初はyum updateで入っているパッケージの更新。

# yum update

テキスト編集にはEmacsを使いたい人間なのでインストール。viは初期から使える。

# yum install emacs
ユーザー作成

作業用にユーザーを作成、パスワード設定

# useradd username
# passwd username password

所属グループをwheelグループとする

#usermod -G wheel username

wheelグループでsudoコマンドが使えるようにする。
visudoコマンドでsudoコマンド用の設定ファイル(/etc/sudoers)を編集する。
起動するエディタがviであることに注意

# visudo

下のような記述を探す

## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL

2行目の行頭がコメントアウトされている場合は # を消去して解除
最初から無かった場合はそのままで良い

## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
作成したユーザーでログイン

rootユーザーをログアウトして作成したユーザーで再ログイン。

ssh -p 3843 username@xxx.xxx.xxx.xxx
鍵認証の設定

鍵保存用のディレクトリを作成し、パーミッションを所有者のみに変更

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh

ssh接続元の端末で公開鍵と秘密鍵のペアを作成する。(Macでの作成方法)
ssh-keygenコマンドを使用し、RSA形式の鍵を作成。保存先やパスフレーズはデフォルトで良いので何も入力しない。

$ ssh-keygen -t rsa
Enter file in which to save the key (/***/***/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

「id_rsa」と「id_rsa.pub」の2つのファイルが~/.ssh下に作成される。
id_rsa.pubのパーミッションを所有者のみに変更

$ chmod 600 ~/.ssh/id_rsa.pub

公開鍵をVPSに転送する。転送先は先程作成した~/.sshとし、ファイル名を「authorized_keys」とする。
scpコマンドでのポート番号の指定は「-P port」とすることに注意。(sshコマンドでは「-p port」)

$ scp -P 3843 ~/.ssh/id_rsa.pub username@xxx.xxx.xxx.xxx:~/.ssh/authorized_keys

以後、パスワード無しでssh接続が可能になる。(rootユーザーでの接続にはパスワードが必要)

なお、秘密鍵はデフォルトで~/.ssh/id_rsaを参照するようになっているが、それ以外の場所に秘密鍵を作成した場合はsshコマンドを使用する際に手動で秘密鍵の場所を指定する必要がある。

$ ssh -p 3843 -i keyfile username@xxx.xxx.xxx.xxx
ssh用ポート番号の変更

sshコマンドで作成した作業用ユーザーでログインした後、root権限での作業を行うのでsudoコマンドを「-s」オプションを付けて実行する。

$ ssh -p 3843 username@xxx.xxx.xxx.xxx
$ sudo -s

sshに関する設定は/etc/ssh/sshd_configに記述されている。編集前にバックアップをとっておく。

# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org

バックアップを取ったら編集。「Port 3843」と書いてある部分を変更する。17行目あたり。

Port 3843
Port port
パスワードログインの禁止

同ファイルの「PasswordAuthentication yes」と書いてある部分を変更する。78行目あたり。

PasswordAuthentication yes
PasswordAuthentication no
Rootユーザーでのログイン禁止

同ファイルの「PermitRootLogin yes」と書いてある部分を変更する。48行目あたり。
コメントアウトされている場合は解除。

#PermitRootLogin yes
PermintRootLogin no

編集終了後、設定の変更を反映させるためsshサーバーの再起動を行う。

# service sshd restart
ファイアーウォールの設定

サーバーに対する通信のルールを設定する。
設定は /etc/sysconfig/iptables を編集して変更する。ここでは省略

編集終了後、設定を保存し、変更を有効にするためにサービスを再起動する、

# service iptables save
# service iptables restart

おわり

VPS契約直後にやったこととしてはここまで
あとは使用用途に合わせて色々と

VMware上でArchLinuxを動かしたかった

意気揚々と書き始めたはいいものの、結局途中までしか書けていない

今回はArchLinuxに手を出した。興味の対象がコロコロ変わっているがともかく。

基本的に公式wikiのガイドに従って作業した。

動作環境

インストールメディアの取得

公式のダウンロードページから日本のミラーサイトを選択する。

「archlinux-2015.01.01-dual.iso」をダウンロードする。

仮想マシン作成

VMware Fusionを起動して新規に仮想マシンを作成する。

f:id:hakumai164:20150117010032p:plain

先程ダウンロードしたisoを選択する。
OSの種類の選択はLinuxの欄にArchLinuxの項目が無いので「Other Linux 3.x カーネル (64 ビット)」を選択した。
カーネルのバージョンは公式のダウンロードページで確認できる)

f:id:hakumai164:20150117010945p:plain

仮想マシンの作成後、設定から仮想ハードディスクのサイズを20GBとした。ここは自由に。使い方にも依るがこんなに必要無い気がする

起動→インストール作業

起動後に表示されるメニューでBoot Arch Linux (x86_64)を選択。

f:id:hakumai164:20150117012314p:plain

コマンドラインが表示されて入力を受け付けるようになったら作業開始。

キーボードレイアウト設定の変更

初期状態ではキーボードレイアウトが「us」に設定されており、キーと実際に入力される文字が一部、一致しないので「jp106」に変更する。

# loadkeys jp106
ネットワーク疎通確認

pingコマンドでネットワークに接続できるか確認。VMware上ならば使用している端末がネットワークに接続されていればおそらく問題は無い...はず

# ping -c 3 www.google.com
パーティション分割

パーティション分割の方式としてMBR(Master Boot Record)とGPT(GUID Partition Table)があるが、ここではMBRを使用する。

fdiskコマンドでパーティションの設定に入る。Linuxでは各種デバイスもファイルとして/dev以下に配置されるが、仮想ディスクは/dev/sdaとして配置されている。

# fdisk /dev/sda

「o」と入力して新規にDOSパーティションテーブルを作成する。
(DOS:Disk Operating System、外部ディスクを記憶装置として使用するOS)

Command (m for help): o

「n」と入力して新たにパーティションを作成する。
パーティションの種類、番号、開始セクタを設定するが、デフォルトの設定を使用するので何も入力せずに確定する。

Command (m for help): n
Select (default p):
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):

次に終了セクタを設定するが、これは開始セクタからのパーティションのサイズで指定できるので、ここでは「+10G」と入力する。

Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +10G

同様に2つ目のパーティションを作成する。残りのセクタをすべて使うので終了セクタもデフォルトの設定で良い。

Command (m for help): n
Select (default p):
Partition number (1-4, default 2):
First sector (20973568-41943039, default 20973568):
Last sector, +sectors or +size{K,M,G,T,P} (20973568-41943039, default 41943039):

「p」と入力するとパーティションテーブルのプレビューを確認できる。

Command (m for help): p

問題無ければ「w」と入力してディスクに書き込む。

Command (m for help): w

ここで作成したパーティションはsda1、sda2という名前で/dev以下に配置される。

ファイルシステム構築

OS上でハードディスクを使用するには作成したパーティション上にファイルシステムを作成する必要がある。ここではext4ファイルシステムを使用する。 ファイルシステムの作成にはmkfsコマンドを使用する。

mkfs -t ext4 /dev/sda1
mkfs -t ext4 /dev/sda2
ファイルシステムのマウント

ディスク上の作成したファイルシステムにアクセスするにはマウントという作業が必要になる。
マウントを行うことで、ファイルシステムをディレクトリの1つとして認識し使用することができる。
マウント用のディレクトリとして /mnt が用意されているのでそれを使用する。

まず、/dev/sda1 上のファイルシステムを /mnt にマウントする。

# mount /dev/sda1 /mnt

次に /mnt 上に homeディレクトリを作成し、 /dev/sda2 をマウントする。

# mkdir /mnt/home
# mount /dev/sda2 /mnt/home
ベースシステムのインストール

sda1とsda2のマウントによって、作成したパーティション内での作業が可能になったので、 /mnt をシステムのルートディレクトリとして、ベースとなるシステムをこの中にインストールする。 ベースシステムのインストールにはpacstrapコマンドを使用する。baseパッケージと補助ツールをまとめたbase-develパッケージをインストールする。

# pacstrap /mnt base base-devel

各種ファイルがダウンロード、インストールされる。

fstabファイルの作成

ファイルシステムのマウントの際には、 /etc/fstab に記述されているファイルシステムに関する情報を参照する。
このfstabファイルは genfstab コマンドで生成できる。インストールしたシステムのルートディレクトリを指定する。

# genfstab -U -p /mnt >> /mnt/etc/fstab

この後

この後、インストールした環境の中に入って作業していく。続きはそのうち書きたい
(書くとは言っていない)

JavaでTwitterを弄る【呟くだけ】

年の瀬だしなんかしたいって事で。

JavaTwitterを弄れないかなって思ったので、
今回は【Javaでツイートを行う】ことを目的としてやってみました。

以下、今回の環境。

Twitterアカウントを作成

普段使ってるTwitterのアカウントを使うのも抵抗があるので新しく作成。
今回は「hakumai_develop」というIDで登録

f:id:hakumai164:20141228210121p:plain

Twitter4Jをダウンロード

Java向けのTwitterライブラリ「Twitter4J」を使用します。

f:id:hakumai164:20141228211004p:plain

Twitter4J - A Java library for the Twitter API(http://twitter4j.org/)

最新安定版をダウンロードして適当な場所に置いておきます。

 

Twitter APIを使えるようにする

TwitterAPIを使用できるようにします。

 

【アプリケーションの登録】

下のページからアプリケーションの登録をします。
Twitter Application Management(https://dev.twitter.com/apps)

「Create New App」から情報を入力します。

f:id:hakumai164:20141228215318p:plain

  • 「Name」:
    アプリケーションの名前
  • 「Description」:
    アプリケーションの説明
  • 「Website」:
    アプリケーションに関連付けされるWebサイト(無かったら自分のTwitterのURL等でも良い?)
  • 「Callback URL」:
    アカウント認証を行った際のリダイレクト先URL(今回は必要無し)

入力後、利用規約に同意すると登録完了です。

登録後、「Keys and Access Tokens」からアプリケーションの「Consumer Key」と「Cousumer Secret」の値を確認しておいてください。

f:id:hakumai164:20141228232054p:plain

 

【アクセストークンの生成】

Twitterのアカウントに対して何らかの操作をする場合にはそのアカウントの「アカウントトークン」が必要です。

他者のアカウントに対して操作をする場合は認証を行ってアカウントトークンを取得しますが、アプリケーションの登録を行ったアカウントのアクセストークンならばすぐに確認することが可能です。

「keys and Access Tokens」の下のほうの「Your Access Token」から「Create my access token」を選択しアクセストークンを取得します。

取得後、こちらも「Access Token」と「Access Token Secret」の値を確認しておいてください。

f:id:hakumai164:20141228233559p:plain

 

Eclipseでプロジェクト作成、ビルドパス追加

ダウンロードしたTwitter4Jのライブラリを使用できるようにします。

Eclipseで新規にJavaプロジェクトを作成、作成後にメニューバーの「プロジェクト」から「プロパティー」を選択、「Javaのビルド・パス」から「外部Jar追加...」を選択し、先ほどダウンロードしたフォルダ内の./lib/twitter4j-core-〇〇.jarを追加します。

f:id:hakumai164:20141228213557p:plain

 

アプリケーションとアクセストークンの設定

アプリケーションとアクセストークンの情報を記録しておきます。

Eclipse上でプロジェクトのsrcフォルダ下に「twitter4j.properties」を作成し、以下のように記述します。

debug=true
oauth.consumerKey=(アプリケーションのConsumer Key)
oauth.consumerSecret=(アプリケーションのConsumer Secret)
oauth.accessToken=(アカウントのAccess Token)
oauth.accessTokenSecret=(アカウントのAccess Token Secret)

コードを書く

実際に中身のコードを書きます。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;

public class Test {

	public static void main(String[] args) {

		System.out.println("What's happening?");

		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			String tweetString = br.readLine();

			Twitter twitter = new TwitterFactory().getInstance();
			twitter.updateStatus(tweetString);

		} catch (IOException e) {
		} catch (TwitterException e) {
		}
	}
}

コードのおおまかな解説。

  • 一行の入力をツイートの中身として tweetString に代入
  • TwitterFactoryクラスのgetInstanceメソッドTwitterクラスのオブジェクトを生成して変数twitterに代入
  • TwitterクラスのupdateStatusメソッドに引数としてtweetStringを渡すことでその中身がツイートされる

呟いてみる

Eclipse上で実行。「てすと」と入力して確定

f:id:hakumai164:20141229021946p:plain

twitter4j.properties内でdebug=trueとしているので、デバック情報が色々と流れた後に問題が無ければツイートが行われます。

確認。

f:id:hakumai164:20141229022400p:plain

できてます。

まとめ

twitter4jを使えばJavaで呟けるという話でした。
今回は本当にツイートするだけで終わったのでそのうち他にもなんかしたい

おわり。