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で呟けるという話でした。
今回は本当にツイートするだけで終わったのでそのうち他にもなんかしたい

おわり。

Emacsに拡張機能を追加した話

2017.6.13 追記

書き直しました。

hakumai164.hatenablog.com

 

MacBook Airを購入して半年以上過ぎているが、今に至るまでテキストエディタは、春先の講義でEmacsを使わされたことから特に何も考えずそのまま使用している。 

しかし、「Emacsはカスタマイズしてなんぼ」という話を頻繁に聞きながら「拡張機能なにそれおいしいの」みたいな使い方をするのもさすがにどうなのよ、と思ったのでじゃちょっと調べてみよう、ってなった話。

パッケージ管理機能を使う

Emacsのバージョンが24以上ならば、スクリプトpackage.elが標準で追加されており、「M-x package-list-packages」と入力することで導入可能な拡張機能の一覧を表示できる。

普段はターミナル上でEmacsを起動して使用しているので、今回も同様に起動して入力してみたが、受け付けなかった。

f:id:hakumai164:20141128225236p:plain
"No Match"と言われる

 

とりあえずバージョン確認。 

f:id:hakumai164:20141128230513p:plain

"Emacs22.1.1"との表示が

 

Emacs22。調べたところ(http://www.gnu.org/software/emacs/history.html)、2012年にはEmacs24がリリースされているので、だいぶ古い。

今度は後に手動で導入したEmacs.appで試してみる。
LanchpadからEmacs.appを起動してみたところ、

 

f:id:hakumai164:20141128230834p:plain
こちらは"Emacs24.3.1"

 

こちらはEmacs24。ほぼ最新のものである。
(ここまできてやっと「ターミナルから起動しているMacOSXに標準で導入されているEmacsと自分で導入したEmacsが全く別の独立したアプリケーションである」という事に気づいた)

Emacs 24ならば「M-x package-list-packages」と入力することで拡張機能の一覧が表示される。

f:id:hakumai164:20141128231053p:plain f:id:hakumai164:20141128231103p:plain
パッケージ名をクリックすることで説明の確認とインストールが可能

 

この機能によって導入された拡張機能は ~/.emacs.d/elpa 内に保存され、Emacsを起動した時に自動で読み込まれる。

~/.emacs.d/
├──auto-save-list
├──elpa
└──init.el

手動で追加

elpaと同じ階層に置かれているinit.elはEmacsの設定が保存されている。

上記の方法以外にも、このファイルに直接追記することで拡張機能の導入が可能であり、バージョンが24未満で上記の方法が使えない場合はこの方法となる。

(ここで、ターミナル上で動くEmacsと手動で導入したEmacsでバージョンが異なる(前者が22.1.1、後者が24.3.1)が、.emacs/dフォルダは共通なので、互換性を考慮してそれぞれ別のelファイルを使用するようにする。
今回は前者をinit22.el、後者をinit24.elとした)

元のinit.elには、Emacsのバージョンに応じて使用するelファイルを変えるように追記する。

;init.el
(setq preferences-directory "~/.emacs.d/")
;"preferences-directroy" という変数の中身を"~/.emacs.d/" とする

(defun load-file-in-dir (dir file)
 (load (concat dir file)))
;"dir"と"file"という2つの引数をとる関数"load-file-in-dir"を新たに定義
;(dirとfileの中身を結合させた文字列).elを読み込む

(cond
 ((string-match "^24\." emacs-version)
 (load-file-in-dir preferences-directory "init24.el"))
 ((string-match "^22\." emacs-version)
 (load-file-in-dir preferences-directory "init22.el")))
;条件分岐
;変数emacs-version に"^24." という文字列が含まれていた場合
;"~/.emacs.d/init24.el"を読み込む
;変数emacs-version に"^22." という文字列が含まれていた場合
;"~/.emacs.d/init22.el"を読み込む

今回は行番号を左側に表示する拡張機能を導入してみる。

と言っても、Emacs23以降ならばこの機能は標準で専用のスクリプトが導入されているらしく、init.el(ここではinit24.el)に追記するだけで良い。

;init24.el
(global-linum-mode t) ;変数global-linum-modeの値を真にする(有効にする)
f:id:hakumai164:20141128234554p:plain
左側に行番号が表示された

 

Emacs22ではまず自分でスクリプトを持ってくる必要がある。
(EmacsWiki)
http://www.emacswiki.org/emacs/line-num.el

ここでは.emacs.dの下に、Emacs22用のスクリプトを保存するフォルダとしてplugin22を作成し、その中にlinum.elとして保存する。

~/emacs.d/
├──auto-save-list
├──elpa
├──init.el
├──init22.el
├──init24.el
└──plugin22/
          └──linum.el

しかし、このままでは保存しただけでEmacsを起動してもlinum.elを読み込まないので、 plugin22の中に追加したelファイルを、Emacsを起動した時に自動で読み込むように設定を追加する(load-pathを追加する)必要がある。

;init22.el
(setq load-path (cons "~/.emacs.d/plugin22" load-path))
;変数load-path に "~/.emacs.d/plugin22" を追加 (require 'linum)
;(linum.elが読み込まれていない場合は)linum.elを読み込む
(global-linum-mode t)
;//変数globa-linum-modeの値を真にする

これでEmacs22でも行番号が表示されるようになる。

f:id:hakumai164:20141129000239p:plain
こちらでも左側に行番号が表示された

まとめ

Emacs拡張機能を導入するには、

(1)スクリプト保存用のフォルダを用意し、その中にスクリプトを保存する
(2)init.elにload-pathにそのフォルダを追加するように記述
(3)require関数で読み込む
(4)設定を弄るなりなんなり

で出来る。Emacs24ならばパッケージ管理機能も標準で導入されている。