03 Jan 2015, 13:49

org-babel と R の組み合わせがとても心地よい件

はじめに

org-mode と R を 組み合わせたら, 予想外に心地よかったので, メモメモ.

できること

テキスト + コード + グラフ が ひとつのファイルのなかにおさまるのだ.

  • org-mode で書いているテキストの中にコードを埋め込むことができる.
  • org-mode で書いているテキストの中にグラフを埋め込むことができる.
  • org-mode で書いているテキストの中のコードをその場で実行できる.

サンプル

  #+OPTIONS: toc:nil
  * Lab3
  ** 1. 
     Make a histogram to visualize the distribution of Earnings.

  #+name: earnings
  #+begin_src R :file earinings.png :width 600 :height 600 :results graphics :session ex :export both
  bull <- read.csv ("BullRiders.csv")
  earnings <- bull$Earnings
  hist (earnings)
  #+end_src

  #+RESULTS:
  [[file:earinings.png]]

  ** 2. 
     Generate the appropriate descriptive
     statistics for this distribution.

  #+name: earnings-median
  #+begin_src R :session ex :export both
  median (earnings)
  #+end_src

  #+RESULTS:
  : 111147.63

  #+name: earnings-mean
  #+begin_src R :session ex :export both
  max (earnings)
  #+end_src

  #+RESULTS:

: 1464475.61

設定

org-mode からコードを実行する

まずは, 以下の設定が必須

(org-babel-do-load-languages
 'org-babel-load-languages
 '((R . t)
   )
 )

begin_src のところで C-c C-c をたたいて 評価する.

評価するときにいちいち質問されないようにするために,以下を書く.

(setq org-confirm-babel-evaluate nil)

org-mode でファイルをひらくときに,inline-image があれば読み込み.

(add-hook 'org-babel-after-execute-hook 'org-display-inline-images)   
(add-hook 'org-mode-hook 'org-display-inline-images)   

画像変換 : :file earinings.png :width 600 :height 600 :results graphics

グラフを生成するには, org-babel Header に以下をかく.

:file earinings.png :width 600 :height 600 :results graphics 

インタプリタ :session hogehoge

インタプリタをもつ言語では, :session hogehoge を記述することで, hogehoge バッファでセッションが開始する.

なにがうれしいかというと, 複数の code block の間で, 変数を共有することができるのだ.

さいごに

文芸的プログラミング, 普通のプログラミングにはつかいどころがないと 思っていた.絵空事だとおもってた.

R 言語のようにグラフをともなうものにこそ, そのコンセプトは光り輝くのだと思った.

Reproducible Research というバズワードも最近になって話題になった.

これを機会に,もってみんな Emacs と org-mode をつかうべし.

Bookmarks

R 言語と org-mode で Reproducible Research を.

02 Jan 2015, 17:13

conkeror の 黒背景 & ダークテーマ で 目に優しいクールなブラウザをつかおう!

はじめに

ブラウザは conkeror を 利用しています.

今回, 黒背景と黒テーマを偶然にも発見した.

設定したらあまりにもカッコ良かったのでメモする.

黒 Google 検索

白い Google 検索が嫌いだった. 待ってたよ, Dark Google!!

黒背景

ここで手に入る. https://github.com/scottjad/dotfiles/blob/master/.conkerorrc/color-theme.js

カスタマイズを解説した動画もある.

.conkerorrc に color-theme.js に取得した color-theme.js を配置する.

黒テーマ (zenburn)

ここで手に入る.

.conkerorrc/themes/ にチェックアウトした.

.conkerorrc ディレクトリ配下の *.js に以下を.

theme_load_paths.unshift ("~/.conkerorrc/themes/");
theme_unload ("default");
theme_load ("conkeror-theme-zenburn");

02 Jan 2015, 15:41

2015 年の書き初め! Emacs Lisp をはじめて書いてみた

はじめに

今年の目標は, Emacs Lisp がかけるようになること.

というわけで, 新年早々, Emacs Lisp をはじめて書いてみた.

書き初めみたいな. ちなみに, 初夢はなにもみなかった.

はじめて??

はじめて というと, 正確にはウソ.

今までは他人の書いた Code をコピペしたり, 部分的に書き換えたりしながらつかってきた.

今回は, コピペではなく, 文法を理解しつつ書いたという意味で, はじめて.

文法の勉強

まずは, 文法を知らないとなにもできないので,

以下の本のはじめのほうを読む.

書いたもの

もちろん, 他の人の書いたものをベースにして書いた.

ERC で キーワード が呼ばれたら, Growl で通知

Linux では erc-nick-notify があるのだけれども, Windows 環境で 通知する elisp がなかったので,つくってみた.

つくってみたのだが, テストできないので, テストしていないという…

元ネタはこれ.

Windows 環境での Growl の設定は以下を参考にした.

Growl を利用すると, Alt+x, Alt+Shift+x が利用できなくなるという 致命的な問題がある. なんと, M-x が利用できない!

%USERPROFILE%\Local Settings\Application Data\Growl\2.0.0.0\user.config

で Alt+X とかいてあるところをべつのものに修正すればいい.

つくったもの

というわけで, 作成したのは以下.

初仕事は会社で elisp のデバッグだ!!

休憩時間をタイマーではかる

休憩時間に休憩中というメッセージを画面に表示して, 休憩時間を計測する elisp.

こんな感じ.

以下を参考にした.

つくったもの

02 Jan 2015, 10:41

Emacs での eval について調べてみた

はじめに

Elisp を評価 (eval) する方法について調べてみました.

代表的なコマンド

以下の 3 つが代表的.

  • eval-buffer バッファを評価
  • eval-region リージョンを評価
  • eval-last-sexp C-x C-e 最後のかっこを評価

参考:

インタラクティブに評価

こんな感じや, こんな感じに,

片方のウィンドウで評価したら別のウィンドウで動作させたいので, 以下の関数を書いてみた.

(defun my-inf-elisp ()
  (interactive)
  (eval-buffer)
  (if (one-window-p)
    (split-window))
  (other-window 1)
  (eshell)
)
(define-key emacs-lisp-mode-map (kbd "C-c S") 'my-inf-elisp)

01 Jan 2015, 14:54

SKK サーバを利用して Linux 環境で 親指シフト&Google 日本語入力ができた!

はじめに

Google 日本語入力がもっとも変換にすぐれているとおもう. mozc を利用したいところなのだけれども, 自分には mozc をつかえない致命的な問題があった.

それは・・・ 親指シフトに対応していないこと

Windows 環境では, GoogleIME + やまぶきの組み合わせで実現できていた. Linux 環境での IME は, ibus-anthy を利用していた.

しかし, 今日でそれもおわりだ! Linux 環境でも Google 日本語入力をする方法を偶然にも発見してしまった.

それは,SKK を利用するというワザ.

SKK とは

SKK は, IME の一種.

導入手順は過去記事を参照. 親指シフトにも対応している.

SKK Server で Google 日本語入力サーバにアクセスする

SKK Server という機能を利用すると, Google 日本語入力サーバにアクセスすることができる.

ローカル PC で SKK サーバを動かして, 日本語入力サーバにアクセスすることで, 親指シフト入力が出来るようになる.

install

gem install google-ime-skk

install できたら, google-ime-skk を実行する.

ddskk の設定

IP を設定してアクセスする.

(require 'skk-server)
;; 辞書サーバを利用する場合の設定
(setq skk-server-host "0.0.0.0"
      skk-server-prog "google-ime-skk" ;; パスは通っているようだ.
      skk-server-portnum 55100)

;; 辞書サーバが使用不能になると辞書ファイルを 
;; Emacs のバッファに読み込んで 検索を行う.
(setq skk-server-inhibit-startup-server nil) ;; 通信エラー時はローカル辞書を.
(setq skk-server-jisyo "~/.emacs.d/dic/SKK-JISYO.L")

(add-to-list 'skk-search-prog-list
         '(skk-server-completion-search) t)
(add-to-list 'skk-search-prog-list
         '(skk-comp-by-server-completion) t)

;; 一応手動で起動する手段を用意するが, 起動は OS 側で実施する予定
(defun my/boot-skk-server ()
  "Start SKK server"
  (interactive)    
  (unless (skk-server-live-p)
    (async-shell-command skk-server-prog (get-buffer-create "*google-ime-skk*"))
    (setq skkserv-process (skk-open-server-1))
    (when (skk-server-live-p)
      (set-process-coding-system skkserv-process 'utf-8 'utf-8))))

(defun my/skk-close-server ()
  (interactive)
  (when (skk-server-live-p)
    (skk-disconnect-server)
    (kill-process (get-buffer-process "*google-ime-skk*"))
    (message "Server disconnected")))
(add-hook 'kill-emacs-hook 'my/skk-close-server)

おわりに

以前の記事にも書いたのだけれども, どうも SKK の打鍵方法と NICOLA は相性が悪い気がする. 文節のあたまで打鍵をする必要があるため, いままでに比べて打鍵数が増えているきがするのだ.

まだ慣れていないだけの問題なのだろうか??

しばらく様子見だけれども, そのうちどうするかは決定する. いまは, 長い文章を一気に変換できることに快感を覚えている.

31 Dec 2014, 16:00

SICP を読むために Emacs で Scheme 環境を構築

はじめに

2015 年は SICP を読んでいく予定です.

というわけで, Scheme の開発環境を Emacs で構築しました.

Scheme の処理系 Gauche

まずは, Scheme 処理系をインストール.(ゴーシュ)

gosh -V

scheme-mode

Default で Emacs にはいっている. 以下の設定を参考にした.

;; UTF-8 に統一
(setq process-coding-system-alist
      (cons '("gosh" utf-8 . utf-8) process-coding-system-alist))

(setq scheme-program-name "gosh -i")
(autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t)
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t)

;; 別のウィンドウに gosh を動作させる
(defun scheme-other-window ()
  "Run Gauche on other window"
  (interactive)
  (split-window-horizontally (/ (frame-width) 2))
  (let ((buf-name (buffer-name (current-buffer))))
    (scheme-mode)
    (switch-to-buffer-other-window
     (get-buffer-create "*scheme*"))
    (run-scheme scheme-program-name)
    (switch-to-buffer-other-window
     (get-buffer-create buf-name))))

(define-key global-map "\C-cS" 'scheme-other-window)

smartparens

カッコをあつかうための多機能な移動・編集ツール.

(require 'smartparens-config)
(smartparens-global-mode t)

default

smartparens-config では以下が設定される.

example

設定例.

あまりに多機能すぎて使いこなす自信がないな..

覚えておきたいのは,

  • かっこで囲む xx sp-pair M-(
  • かっこを外す sp-unwrap C-M-s
(define-key sp-keymap (kbd "C-M-f") 'sp-forward-sexp)
(define-key sp-keymap (kbd "C-M-b") 'sp-backward-sexp)

(define-key sp-keymap (kbd "C-M-d") 'sp-down-sexp)
(define-key sp-keymap (kbd "C-M-a") 'sp-backward-down-sexp)
(define-key sp-keymap (kbd "C-S-a") 'sp-beginning-of-sexp)
(define-key sp-keymap (kbd "C-S-d") 'sp-end-of-sexp)

(define-key sp-keymap (kbd "C-M-e") 'sp-up-sexp)
(define-key emacs-lisp-mode-map (kbd ")") 'sp-up-sexp)
(define-key sp-keymap (kbd "C-M-u") 'sp-backward-up-sexp)
(define-key sp-keymap (kbd "C-M-t") 'sp-transpose-sexp)

(define-key sp-keymap (kbd "C-M-n") 'sp-next-sexp)
(define-key sp-keymap (kbd "C-M-p") 'sp-previous-sexp)

(define-key sp-keymap (kbd "C-M-k") 'sp-kill-sexp)
(define-key sp-keymap (kbd "C-M-w") 'sp-copy-sexp)

(define-key sp-keymap (kbd "C-M-s") 'sp-unwrap-sexp)
(define-key sp-keymap (kbd "M-<backspace>") 'sp-backward-unwrap-sexp)

(define-key sp-keymap (kbd "C-<right>") 'sp-forward-slurp-sexp)
(define-key sp-keymap (kbd "C-<left>") 'sp-forward-barf-sexp)
(define-key sp-keymap (kbd "C-M-<left>") 'sp-backward-slurp-sexp)
(define-key sp-keymap (kbd "C-M-<right>") 'sp-backward-barf-sexp)

(define-key sp-keymap (kbd "M-D") 'sp-splice-sexp)
(define-key sp-keymap (kbd "C-M-<delete>") 'sp-splice-sexp-killing-forward)
(define-key sp-keymap (kbd "C-M-<backspace>") 'sp-splice-sexp-killing-backward)
(define-key sp-keymap (kbd "C-S-<backspace>") 'sp-splice-sexp-killing-around)

(define-key sp-keymap (kbd "C-]") 'sp-select-next-thing-exchange)
(define-key sp-keymap (kbd "C-<left_bracket>") 'sp-select-previous-thing)
(define-key sp-keymap (kbd "C-M-]") 'sp-select-next-thing)

(define-key sp-keymap (kbd "M-F") 'sp-forward-symbol)
(define-key sp-keymap (kbd "M-B") 'sp-backward-symbol)

(define-key sp-keymap (kbd "H-t") 'sp-prefix-tag-object)
(define-key sp-keymap (kbd "H-p") 'sp-prefix-pair-object)
(define-key sp-keymap (kbd "H-s c") 'sp-convolute-sexp)
(define-key sp-keymap (kbd "H-s a") 'sp-absorb-sexp)
(define-key sp-keymap (kbd "H-s e") 'sp-emit-sexp)
(define-key sp-keymap (kbd "H-s p") 'sp-add-to-previous-sexp)
(define-key sp-keymap (kbd "H-s n") 'sp-add-to-next-sexp)
(define-key sp-keymap (kbd "H-s j") 'sp-join-sexp)
(define-key sp-keymap (kbd "H-s s") 'sp-split-sexp)

;;;;;;;;;;;;;;;;;;
;; pair management
(sp-local-pair 'minibuffer-inactive-mode "'" nil :actions nil)

;;; lisp modes
(sp-with-modes sp--lisp-modes
  (sp-local-pair "(" nil :bind "C-("))

(sp-pair "(" ")" :wrap "M-(")

rainbow-delimiters

かっこの深さに応じて色付けしてくれる.

かっこの強調をどきつくする. これはいいなぁ.

注意 テーマ読み込みのあとに配置すること.

(require 'rainbow-delimiters)
(add-hook 'emacs-lisp-mode-hook 'rainbow-delimiters-mode)
(add-hook 'scheme-mode-hook 'rainbow-delimiters-mode)
(add-hook 'lisp-mode-hook 'rainbow-delimiters-mode)

;; these setting should be placed after load-theme
;; using stronger colors
(require 'cl-lib)
(require 'color)

;; 関数にしないとうまくいかない...手動で有効に
(defun rainbow-delimiters-using-stronger-colors ()
  (interactive)
  (cl-loop
   for index from 1 to rainbow-delimiters-max-face-count
   do
   (let ((face (intern (format "rainbow-delimiters-depth-%d-face" index))))
     (cl-callf color-saturate-name (face-foreground face) 100))))

;; making unmatched parens stand out more
(set-face-attribute 'rainbow-delimiters-unmatched-face nil
            :foreground 'unspecified
            :inherit 'error
            :strike-through t)

SICP を info で読む

以下の設定で Emacs の info で SICP が読める (English)

この方法のよいところは, テキストの文章をそのまま C-x C-e で評価して実 行できるところ.

# sicp.info 取得
wget http://www.neilvandyke.org/sicp-texi/sicp.info.gz
gunzip sicp.info.gz

# /usr/local/info に sicp.info をコピー.
$ sudo mkdir -p /usr/local/info
$ sudo cp sicp.info /usr/local/info

# dir ファイルを編集.
$ sudo emacs /usr/local/share/info/dir

# 次の二行を追記.
 The Algorithmic Language Scheme
 * SICP : (sicp.info). Structure and Interpretation of Computer Programs.

調べたけど利用しないもの

せっかく調べたけど, 設定を有効にしない (できない) ものも列挙.

paredit

Lisp コードで頻出する括弧類のバランスを維持することを目的としたもの.

smartparens に人気をとられてしまったかわいそうな子.

gosh-mode

scheme-mode の拡張.

scheme-mode を継承しているので, 基本的な操作は変わらないそうだ.

el-get で取得. リボジトリから取得後に make && make install

(require 'gosh-config)

M-x gosh-run で gosh が起動すれば OK.

scheme-mode に比べて情報がすくないのと, すごさがわからないので, ひとまずは scheme-mode を利用することにした.

なれてきたらそのうちもう一度挑戦する.

scheme-complete

auto-complete で補完をすることができる. デフォルト設定で, そこそこの補完候補が出る.

scheme-complete というものもあるそうなので,気休め程度に導入.

本家のサーバ落ちた?? github の mirror より取得.

以下を参考にして, auto-complete の source に scheme-complete の情報源を加える.

メンテされていないのと, auto-complete で何とかなるので削除.

(autoload 'scheme-smart-complete "scheme-complete" nil t)
(autoload 'scheme-get-current-symbol-info "scheme-complete" nil t)

(eval-after-load 'scheme
  '(define-key scheme-mode-map "\e\t" 'scheme-smart-complete))

;; scheme-mode-hook
(defvar ac-source-scheme
  '((candidates
     . (lambda ()
         (require 'scheme-complete)
         (all-completions ac-target (car (scheme-current-env))))))
  "Source for scheme keywords.")

(add-hook 'scheme-mode-hook
          '(lambda ()
             (make-local-variable 'ac-sources)
             (setq ac-sources (append ac-sources '(ac-source-scheme)))))

eldoc

scheme の eldoc は scheme-complete と合わせて利用するらしいが, eldoc error void-function eldoc-current-symbol とでてエラーする.

(require 'eldoc-extension)
(add-hook 'scheme-mode-hook
  (lambda ()
    ;; Gauche の場合, 次の 2 個の変数を設定しておいたほうがよいのかも.
    (setq default-scheme-implementation 'gauche)
    (setq *current-scheme-implementation* 'gauche)
    ;; eldoc-mode
    (set (make-local-variable 'eldoc-documentation-function)
     'scheme-get-current-symbol-info)
    (eldoc-mode t)
    )
  )
(setq lisp-indent-function 'scheme-smart-indent-function)

flymake 設定

glint というものがあるらしい. gauche 0.8.13 でしか動作しないようなので試していない.

31 Dec 2014, 04:54

2014 年の過去記事振り返りと 2015 年の目標

はじめに

2014 年にかいた過去記事を振り返りつつ, 2015 年の目標をたててみる.

2014 年の目標

2014 年の主な目標は以下

  • オブジェクト指向に慣れ親しむ
  • デザインパターンを学ぶ
  • 関数型言語に触れる
  • MOOC をがんばる

新年の記事.

2014 年のまとめ

Windows を捨てて Linux になった

去年, Windows 環境と決別することを決意した. 今年は, 上期は Mint Linux, 下期は ArchLinux を自分のノート PC に導入した.

と同時に, GUI 環境をすてて CUI 環境ですごすことにした.

Eclipse を捨てて Emacs になった

テキスト環境にすんでいると, 自然に Emacs を利用するようになった. そして, 気づけば, かなり Emacs の改造に熱がはいってしまった.

C 言語を捨てて Rubist, Javaer になった. いろんな言語に触れた

仕事では, Ruby, Java をつかうようになった.

また, MOOC を利用することで, 多くのプログラミング言語をまなんだ.

オブジェクト指向とデザインパターンをまなんだ

とくにデザインパターンを今年は努力した.

関数型言語にふれた

また, 関数型言語の Oz, Scala, Haskell を学んだ.

一番がんばったのは MOOC

そしてなにより, 一番がんばったのは, MOOC だ.

2015 年の目標

旗があれば, そこにむけて進んでいける.2015 年のすすむ方向をきめる.

2015 年は統計解析と関数型言語の学習に力をいれたい.

統計解析

統計学・データマイニング・機械学習・ビックデータ解析の知識に触れる.

もうこの記事がかかれてから 5 年が過ぎた.

今や本やさんにいくとデータサイエンティストやビッグデータという本でいっぱいだ.

学習の手段は去年からの MOOC を考えている.

Gakko とか, Coursera や edX に比べれば…と軽視していたけどこれやってみようかな.

関数型言語

2014 年で関数型の考え方になれたので, 2015 年はより知識を深めていきたい.

できれば, Emacs Lisp のひとつやふたつは簡単にかけるようになりたい.

31 Dec 2014, 01:43

Emacs DDSKK で NICOLA 親指シフト入力をする

はじめに

私は親指シフターだ.

Emacs の入力システムで SKK というものがある.

いままで利用していなかったのだけれども, 今朝調べてみたら, 親指シフトに対応しているようだ.

方法:

どんなものだか, ちょっと利用してみることにした.

SKK

インストール

インストールは el-get で実施した.

一般的な方法は以下.

設定

(require 'skk-autoloads)
(global-set-key "\C-x\C-j" 'skk-mode)
(global-set-key "\C-xj" 'skk-auto-fill-mode)

;; 親指シフト
(setq skk-use-kana-keyboard t)
(setq skk-kanagaki-keyboard-type 'omelet-jis)

使いかたは以下にある

キーバインド

以下に親指シフト専用のキーバインドがのっている.

感想

まず, SKK 自体に慣れていないので利用しにくい… Emacs のなかでは SKK を利用するのだが, Emacs の外側では ibus を利用するこ とになる. これがはたして効率がよい方法なのかどうかは疑問だ.

以下の意見に同感.引用します.

ローマ字入力の SKK は, 普通のローマ字入力「 kyouhasibuyani 」と体感上同じテンポで, 「 KyouHaSibuyaNi 」と入力できます.

しかし, JIS かなや親指シフトの SKK は, 普通のかな入力「きょうはしぶやに」とは別の, 「□きょう□は□しぶや□に」というテンポにどうしてもなってしまう. 体感するテンポが明らかに違ってしまうんですよ.

「これは常用できない……」と試したとき思いました

しかしここで諦めるのもなんだかくやしいので, もう少し試してみてから, 諦めることにする.

30 Dec 2014, 14:46

Java で Bridge パターンを実装をしてみた

はじめに

Java で Bridge パターンを実装をしてみました.

Bridge パターンとは

クライアントがアクセスするクラス (インタフェース) と実装クラスを分離して, それぞれを独立に変更できるようにする.

機能追加と機能実装の組み合わせ爆発を抑止することができる.

パターン適用前

言語と時間帯の分だけ, Man のサブクラスが増えていく.

なので, 言語や時間帯をひとつ追加すると その度にサブクラスが増えると言う問題がある.(組み合わせ爆発)

public class BridgeSample {
    public static void main (String args[]) {
        new JapaneseInTheMorning ().say ();
        new JapaneseInTheEvening ().say ();     
        new EnglishInTheMorning ().say ();
        new EnglishInTheEvening ().say ();      
    }
}

abstract class Man {
    public abstract void say ();
}

// ここで組み合わせ爆発が発生する!!!!
class JapaneseInTheMorning extends Man {
    public void say () { new Japanese ().inTheMorning (); }
}
class JapaneseInTheEvening extends Man {
    public void say () { new Japanese ().inTheEvening (); }
}
class EnglishInTheMorning extends Man {
    public void say () { new English ().inTheMorning (); }
}
class EnglishInTheEvening extends Man {
    public void say () { new English ().inTheEvening (); }
}

abstract class Language {
    public abstract void inTheMorning ();
    public abstract void inTheEvening ();   
}

class Japanese extends Language {
    public void inTheMorning () {
        System.out.println ("おはよう");
    }
    public void inTheEvening () {
        System.out.println ("こんばんわ");
    }
}

class English extends Language {
    public void inTheMorning () {
        System.out.println ("Good Morning");
    }
    public void inTheEvening () {
        System.out.println ("Good Evening");
    }
}

パターン適用後

言語と時間帯を分離して, 時間帯の引数で言語を渡す.

  • 言語の種類が増えても, 時間帯のクラスを増やす必要はない.
  • 時間帯の種類が増えても, 言語のクラスを増やす必要はない.

言語と時間帯はそれぞれ独立して機能拡張できる. つまり, 仕様変更に強い設計.

public class BridgeSample2 {
    public static void main (String args[]) {
        new Morning (new JapaneseSpeaker ()).say ();
        new Evening (new JapaneseSpeaker ()).say ();        
        new Morning (new EnglishSpeaker ()).say ();
        new Evening (new EnglishSpeaker ()).say ();     
    }
}

abstract class Man {
    protected Speaker speaker;
    public Man (Speaker speaker) {
        this.speaker = speaker;
    }
    public abstract void say ();

    protected void inTheMorning () {
        speaker.inTheMorning ();
    }
    protected void inTheEvening () {
        speaker.inTheEvening ();
    }
}

class Morning extends Man {
    public Morning (Speaker lang){ super (lang); }
    public void say () { inTheMorning (); }
}
class Evening extends Man {
    public Evening (Speaker lang){ super (lang); }  
    public void say () { inTheEvening (); }
}

abstract class Speaker {
    public abstract void inTheMorning ();
    public abstract void inTheEvening ();   
}

class JapaneseSpeaker extends Speaker {
    public void inTheMorning () {
        new Japanese ().inTheMorning ();
    }
    public void inTheEvening () {
        new Japanese ().inTheEvening ();        
    }
}

class EnglishSpeaker extends Speaker {
    public void inTheMorning () {
        new English ().inTheMorning ();
    }
    public void inTheEvening () {
        new English ().inTheEvening ();     
    }
}

abstract class Language {
    public abstract void inTheMorning ();
    public abstract void inTheEvening ();   
}

class Japanese extends Language {
    public void inTheMorning () {
        System.out.println ("おはよう");
    }
    public void inTheEvening () {
        System.out.println ("こんばんわ");
    }
}

class English extends Language {
    public void inTheMorning () {
        System.out.println ("Good Morning");
    }
    public void inTheEvening () {
        System.out.println ("Good Evening");
    }
}

実行結果

30 Dec 2014, 12:53

html ファイルを org ファイル形式に変換する方法メモ

はじめに

学生のときに Yahoo geocities で作成した html によるサイトを Futurismo Wiki に移行したい.

なぜなら, Yahoo geocities は, いつサービスが停止してもおかしくない気がするからだ.(人気的に) 昔の思い出は失いたくない.

  • 移行元サイトは完全な html 形式のファイル群
  • 移行先 wiki は org 形式でデータを管理している

ということで, html から org へ変換する方法を調べた.

Pandoc が利用できそう

以前, pandoc を利用して, markdown を org-mode へ変換することをやった.

今回もこの pandoc を利用して変換しよう. 導入方法は過去記事参照.

htlm を org 形式に変換するコマンド

$ pandoc index.html -f html -t org -o index.org

文字コードを Shift-Jis から UTF-8 へ変換

pandoc は UTF-8 形式しか受け付けないので注意. 変換には nkf を利用するとよい.

$ nkf -w index.html | pandoc ....

サイトを移行

FTP で接続してサイト取得.

とりあえずローカルに落として git 管理配下におく. 非公開で bitbucket へ upload.

これで若き青春の日々の日記はクラウド上で永遠の生命を得た.