5月 2015アーカイブ

Linuxのバックアップについて(メモ)

経緯

最近自宅のノートパソコンのHDDをSSDに換装しましたが、環境の移行をなるべくスムーズに行えるようにしたかったので以下の方法をとりました。

このおかげで復旧を楽に終わらせることができました。

バックアップの作成

シンボリックリンクは外付けHDDにバックアップすることができなかったためファイルをまとめて圧縮してから保存しました。

今回は7z形式で圧縮していますが、 tar.gzでもいいです。

ホームディレクトリに存在するファイル

適度なファイルサイズになるように分割して圧縮しました。

ホームディレクトリのドットファイル(重要)

ホームディレクトリに存在するドットファイルは

7za a dotfiles-(日付).7z ~/.[a-zA-Z0-9]*

のようにしてバックアップをとりました。むしろこちらの方が重要かもしれません。

解凍は

7za x dotfiles-(日付).7z

で行います。

上書きが怖い場合には別のフォルダで解凍してから必要なファイルを移動すればいいと思います。

/usr/local

7za a usr_local-(日付).7z /usr/local

のようにしてバックアップを作成しました。

ちなみに

  • Emacs
  • gcc-4.8.3およびそのクロスコンパイラ(以前に自分でビルドしたもの)
  • texlive

などが /usr/local以下にインストールされています。

実は texliveに関してはsquashfs形式で圧縮して /usr/local/texlive/2014にマウントしているのですが、それについてはここでは省略します。

インストール済のパッケージ

依存するパッケージに関しては手書きのメモを残しておいたのでそれをもとにインストールしました。

不足分は思い出したときにインストールします(汗)

起動時にNumLockを有効にする

Linuxの起動時にNumLockを有効にしておきたいので調べたところ、 numlockx というプログラムが紹介されていたためインストールしました。 その時のメモです。

numlockxの導入

Vine Linuxにはnumlockxパッケージがないためソースコードからインストールしました。

ソースコードのダウンロード

DebianやArch Linuxのパッケージなどはすぐに情報が見つかるのですが、ソースコードの場所を探すのに時間がかかりました。結局はGitHubで見つけました。

今回は https://github.com/rg3/numlockx/releases からソースコードをダウンロードしました(.tar.gzと.zip形式があるので好きな方を)。

パッケージのインストール

解凍してからディレクトリに移動して

./configure --prefix=/usr/local
make
sudo make install

で完了です。終了まで1分もかかりませんでした。

ただし

./configure

では /usr/bin/以下にインストールされてしまったため –prefix=/usr/local をつけました。

自動起動するための設定

/etc/rc.localの最後の方に以下の内容を追加します。

if [ -x /usr/local/bin/numlockx ]; then
  /usr/local/bin/numlockx on
fi

Cygwinのcronによるスケジュールでショートカットを作成する方法

経緯

現在、Windows7 (32bit)でgnupack13.00を使用しています。その中に含まれているcygwinを使用して cronで毎日データのバックアップをとるようにしています。

今回、必要があって毎日0:00にショートカットを作成することを試みました。試行錯誤の結果うまくいくようになったのでその経緯をメモとして残しておきます。

具体的には、 るびきち様のメルマガ 「●るびきちEmacs 087●るびきち大ピンチ!」から「●るびきちEmacs 090●helmってみた」まで4回にわたるファイル管理の内容です。

この中の「●るびきちEmacs 087●」に書かれている方法です。この中ではLinuxを念頭に置いているため「シンボリックの作成」となっていますが、ここではWindowsの話のため「ショートカット」と表記します。

ショートカットの作成

ここからが本題です。

まずは失敗例

今のcygwinではターミナルから ln -s を実行するとシンボリックリンクが作成され、 Windowsからでもショートカットとして使用できます。

ところがcronを使用して同様のコマンドを実行してもショートカットが作成されず、リンクファイルになってしまいました。

解決法

そこで、しばらく悩んだ上で Cygwin でシンボリックを使うための環境変数 を参考にし、 cronで実行したいファイルに

export CYGWIN="winsymlinks"

を追加したところ、ショートカットが作成されるようになりました。

おそらくcronを実行するユーザー”cygserver”(下記を参照)にはシンボリックリンクを作成する権限がないのでしょう。

別の解決法

mklink コマンドでショートカットを作成するように設定した バッチファイルをスケジューラーから起動させてもいいです。

こちらでも試しましたが、 cygwinで行いたかったため上記の方法をとりました。

(参考)cronの設定

cronのインストール

今回は、 CygwinでCronサーバーを動かす の方法を参考にしています。

cygwinのターミナルを「管理者として実行」し、

cron-config

を実行したあとにユーザー”cygserver”を追加します。

cronの確認

どのページでも書かれているように

crontab -e

を実行してから

* * * * * /bin/date >> /tmp/crontest.log

と入力し、 1分毎に時刻が出力されたら成功です。

始めはユーザー”cygserver”を作成せずに行っていましたがログに全く出力されませんでした。そこでユーザー”cygserver”を作成したところ成功しました。

GnuPG公開鍵による暗号化(Windowsおよびgnupack版)

前回の記事はLinux用でしたが、 Windows 7 (32-bit) のSylpheedでも使用したいので設定を行いました。その経過をメモとして残しておきます。

GnuPG 1.4.x

プログラムの入手およびインストール

http://www.nanashinonozomi.com/tips/how-to-install-gnupg-on-windows.html の記事を参考にして、 Windows 7にGnuPGをインストールしました(今回は1.4.19)。

PATH設定

今回はSylpheedで使用したいだけなので環境変数PATHの設定は不要でした。

設定

必要なファイルのコピー

Linuxの~/.gnupgフォルダに存在しているファイル(pubring.gpgなど)を /c/Users/ユーザ名/AppData/Roaming/gnupg(cygwin方式でのパス名)にコピーします。

これでSylpheedでGnu鍵が使用できるようになります。

シンボリックリンクの作成

gnupack(インストールしたMew)でも使用できるように Cygwinのターミナルで

ln -s /c/Users/ユーザ名/AppData/Roaming/gnupg ~/.gnupg

を実行します。

もともと存在していた ~/.gnupg は念のためあらかじめフォルダ名を変更しておきました(必要ないかもしれません)。

これでcygwinからも同じ鍵を使用することができるようになりました。

ちなみに

ln -s ~/.gnupg /c/Users/ユーザ名/AppData/Roaming/gnupg

ではWindowsから認識してくれませんでした。

GnuPG公開鍵による暗号化

基本的にDropboxには他人に見られても問題のない書類しか置いていません。ただし、自宅で試験問題などを作成した場合には Dropbox上に保存することになります。

GnuPG鍵対の生成は既に行っていたため、今回はそれを利用してファイルの暗号化を本格的に始めてみました。

Emacsで暗号化ファイルを読み書きする

Emacsで暗号化されたファイルを読み書きするのは非常に簡単でした。

ファイル名

ファイルを保存する際にファイル名の最後に .gpg をつけるだけです。つまり拡張子が .gpg です。

その際に

Select recipients for encryption.
If no one is selected, symmetric encryption will be performed.  
- `m' to mark a key on the line
- `u' to unmark a key on the line
[Cancel][OK]

  u 8A299530CD08C432 Toshiaki Ara <mail address>

のように聞かれるため、 [OK]の所で Enter を押します。その後、パスフレーズを入力します(2回)。

ファイルを開く

C-x C-f でも recentf-open-files でも ファイルを開くときにパスフレーズを聞かれるため、入力すれば自動的に複合化してくれます。

GnuPG鍵

この項目については2009年に Vine LinuxでRのパッケージングの担当を始めたときに行っています。

GnuPG鍵対の生成

鍵束内の鍵一覧を表示

~ $ gpg --list-key
/home/ara/.gnupg/pubring.gpg
----------------------------
pub   1024D/CD08C432 2009-09-03
uid                  Toshiaki Ara <mail address>
sub   2048g/5FE5B097 2009-09-03

鍵のFingerprint(電子指紋)を表示

~ $ gpg --fingerprint CD08C432
pub   1024D/CD08C432 2009-09-03
                 指紋 = B66C 6C43 D16C CB84 2122  FC39 8A29 9530 CD08 C432
uid                  Toshiaki Ara <mail address>
sub   2048g/5FE5B097 2009-09-03

公開鍵のexport

PGP公開鍵サーバー に登録しています。

~ $ gpg --export -a CD08C432
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1

mQGiBEqgT+ERBADevofgVffK6ZZsi1XmP+I8svl5+3/HmqiZvChfZENAgYKFzrus
ivXXech3Ql8DD3lP65CsmolWKQAkv7zJn3BpEjWlxoTlpfPjyukOOz7Wir+bKiaA
zhdyCERoOdIgBOrlKFbP+awsrDO8P04A6YUHnLHMsQ/terbPBm/pngFW2wCg/GpI
SJIiuVlWLitorjomqhR6M+8D+wervoWbMZkU2Ln7N5u/c84/bhkaHWmNRtUMywPF
y0sSmLc0gnABRd1FNYSjNiDHsc8UJrkE9GsPLQahl174R49a0mRt1vqhruSjJLQ3
TutEh+mVxSM8IMqZmKLjTAT1Jy1S567jyT/mOEBpq3YYrqa8oE6htEFc0rJHf6tC
kj9PBACKXshysniEj2OQcdTLbOICwdtrhCXpVKpvz4VL/Eu2OxrElt84YlF+k7Mb
4AuWZttJcajk9wQX/I0Xz3K1MQxT6Lqh6jXzQkNi6x4JXBCGMn7C4qNWmcBFswB8
6TRW28IjuYZnLjW5dnhEF72xAzGWbMMkWjo/6ASGu0JFZrrdLrQbVG9zaGlha2kg
QXJhIDxhcmFfdEAzODQuanA+iGAEExECACAFAkqgT+ECGwMGCwkIBwMCBBUCCAME
FgIDAQIeAQIXgAAKCRCKKZUwzQjEMhGTAJ9SOPWpaXZdHgVnW88bQpGYgUsJZQCf
bqMP/KjzkT6pakx7aJpg/aWUTem5Ag0ESqBQBBAIANoAL2K4ui25fSpG/ZcaOoXN
ojiSV7BUwgMvEAgA2ZgcCj9qAhDt82yB4oeRmk7a7ap31tRfMKBBWPwnDb4UAyv0
aHgvH3M6F6Tvpb2C+H3SFHAvFwUKOsbXgdRHxH4z2CgwsWDVTs8docNrFYndVDCd
SyzdS2it3uufGRurQh31sGrGV8Z/RbLjGM8iU3CX+yRT8+o5iyvxTsWaXqZpEoql
/XTZVZMVhWVLVzCraDSVcCKELxC13/Rs5ZQMXuvVNUrjzDtUVW88TOGlfmdMWQ7u
T8DKXId0x4wRWM/Mp3REiboBfZueufevMzvdNoB+XQBkV29ogaBkEjIBHTLQtfcA
BA0IAIA3Fqp9VOS2tXKI9bi+VblLfhtDZ/+ACWrf09w6zkVWqOb/EvY3tEIRDh/Y
1yfdUyJT3olEJN0MwbITydepzlF16kOVXFmb60Z2IGcJ9T/Z6CqR/1dbchqEVsJo
khWuElVuz4k6g/vquSkdH9FJ/L1Ebwx9MXk+iPlpPSDCjHjpKN/a/zjV/VCYYua0
5/pr/abNnvgacQm+A5xLWfy0a6LqxeUBOhGovAjgr6XC90Wd3PEz/leqxFmhivuH
rX1tbkpE3np/dcS4kCTN3vW4mDU/zYp3TSl9TSU1Ln5+4lxG43ySbiKbQMSMEW0l
zK2Wyz7TM1vfgFQadXg2aDQB8lyISQQYEQIACQUCSqBQBAIbDAAKCRCKKZUwzQjE
MvraAKCyR4a6Wt1InBpQywZbBFOLQMlTjACePooY0XWv0fY2T3AZCafW6ehiUbg=
=WeEj
-----END PGP PUBLIC KEY BLOCK-----

サーバの移行

レンタルサーバとして XREA+ (有料版)を使用していますが、同じ系列の CORESERVER.JP (CORE-MINIプラン)に移行しました。

まだお試し期間ですが、問題がなければ完全に移行する予定です。価格もほとんど変わらないですし。

少なくともFTP接続したときにリモートの内容が表示される時間が短縮されました。

また、XREA+のサーバで消去できなかったフォルダがあったため、気分的にもすっきりしました。

flycheckの設定(RとRuby)

Emacsで文法チェックをするために flycheckおよび関連パッケージを導入したので、その時のメモです。

flycheckを使用するためのEmacsの設定

パッケージのインストール

  • flycheck
  • flycheck-pos-tip
    • エラー内容をその場にツールチップで表示するためのパッケージ
  • helm-flycheck
    • helmインターフェースからエラーを選択するためのパッケージ

init.elの設定

(require 'flycheck)
(require 'flycheck-pos-tip)

(eval-after-load 'flycheck
  '(custom-set-variables
   '(flycheck-display-errors-function #'flycheck-pos-tip-error-messages)))

(add-hook 'R-mode-hook 'flycheck-mode)
(add-hook 'ruby-mode-hook 'flycheck-mode)


(require 'helm-flycheck) ;; Not necessary if using ELPA package
(eval-after-load 'flycheck
  '(define-key flycheck-mode-map (kbd "C-+") 'helm-flycheck))

ここではRとRubyでflycheckを行うように設定しています。

helm-flycheckで修正候補を選択するためのキーに C-+ を割り当てています。

Rの設定

R-modeでycheckを使用するためには、 Rのlintrパッケージが必要なのでインストールしておきます。

install.package("lintr")

ox-pukiwikiの(私的)設定変更

org-modeの原稿をpukiwiki形式に変換するためのパッケージとして ox-pukiwiki があります。

非常に便利なのですが #+BEGIN_SRC#+END_SRC で囲んだ ソースコードを出力しようとしても #+BEGIN_SRC#+END_SRC そのものが出力されてしまいます。

#+BEGIN_EXAMPLE#+END_EXAMPLE で囲んだ部分は整形済みテキストとして出力されます。

そこでox-pukiwiki.elのソースコードを調べたところ

(org-export-define-backend 'pukiwiki
  '((babel-call . org-pukiwiki-identity)
          中略
    (example-block . org-pukiwiki-example-block)
          中略
    (src-block . org-pukiwiki-identity)
          中略
    (verse-block . org-pukiwiki-identity))
  :menu-entry
  '(?p "Export to Pukiwiki"
       ((?p "As Pukiwiki buffer"
      (lambda (a s v b) (org-pukiwiki-export-as-pukiwiki a s v)))
  (?P "As Pukiwiki file"
      (lambda (a s v b) (org-pukiwiki-export-to-pukiwiki a s v)))
  (?o "As Pukiwiki file and open"
      (lambda (a s v b)
        (if a (org-pukiwiki-export-to-pukiwiki t s v)
    (org-open-file (org-pukiwiki-export-to-pukiwiki nil s v))))))))

のように定義されていました。

したがって、

(src-block . org-pukiwiki-identity)

(src-block . org-pukiwiki-example-block)

に変更したところ、 #+BEGIN_SRC#+END_SRC で囲んだ部分も整形済みテキストとして出力されるようになりました。

以下、設定です。

(require 'ox-pukiwiki)

(org-export-define-backend 'pukiwiki
  '((babel-call . org-pukiwiki-identity)
    (bold . org-pukiwiki-bold)
    (center-block . org-pukiwiki-identity)
    (clock . org-pukiwiki-identity)
    (code . org-pukiwiki-code)
    (comment . org-pukiwiki-comment)
    (comment-block . (lambda (&rest args) ""))
    (diary-sexp . org-pukiwiki-identity)
    (drawer . (lambda (&rest args) ""))
    (dynamic-block . org-pukiwiki-identity)
    (entity . org-pukiwiki-identity)
    (example-block . org-pukiwiki-example-block)
    (fixed-width . org-pukiwiki-identity)
    (footnote-definition . org-pukiwiki-identity)
    (footnote-reference . org-pukiwiki-identity)
    (headline . org-pukiwiki-headline)
    (horizontal-rule . org-pukiwiki-identity)
    (inline-babel-call . org-pukiwiki-identity)
    (inline-src-block . org-pukiwiki-identity)
    (inlinetask . org-pukiwiki-identity)
    (italic . org-pukiwiki-italic)
    (item . org-pukiwiki-item)
    (keyword . org-pukiwiki-keyword)
    (latex-environment . org-pukiwiki-identity)
    (latex-fragment . org-pukiwiki-identity)
    (line-break . org-pukiwiki-identity)
    (link . org-pukiwiki-link)
    (node-property . org-pukiwiki-identity)
    (paragraph . org-pukiwiki-identity)
    (plain-list . org-pukiwiki-plain-list)
    (planning . org-pukiwiki-identity)
    (property-drawer . (lambda (&rest args) ""))
    (quote-block . org-pukiwiki-identity)
    (quote-section . org-pukiwiki-identity)
    (radio-target . org-pukiwiki-identity)
    (section . org-pukiwiki-identity)
    (special-block . org-pukiwiki-identity)
    (src-block . org-pukiwiki-example-block)
    (statistics-cookie . org-pukiwiki-identity)
    (strike-through . org-pukiwiki-strike-through)
    (subscript . org-pukiwiki-identity)
    (superscript . org-pukiwiki-identity)
    (table . org-pukiwiki-table)
    (table-cell . org-pukiwiki-table-cell)
    (table-row . org-pukiwiki-table-row)
    (target . org-pukiwiki-identity)
    (timestamp . org-pukiwiki-identity)
    (underline . org-pukiwiki-underline)
    (verbatim . org-pukiwiki-verbatim)
    (verse-block . org-pukiwiki-identity))
  :menu-entry
  '(?p "Export to Pukiwiki"
       ((?p "As Pukiwiki buffer"
      (lambda (a s v b) (org-pukiwiki-export-as-pukiwiki a s v)))
  (?P "As Pukiwiki file"
      (lambda (a s v b) (org-pukiwiki-export-to-pukiwiki a s v)))
  (?o "As Pukiwiki file and open"
      (lambda (a s v b)
        (if a (org-pukiwiki-export-to-pukiwiki t s v)
    (org-open-file (org-pukiwiki-export-to-pukiwiki nil s v))))))))

gnupackでMewを使用するための設定

自宅ではLinuxを使用していますが、職場ではWindows7 (32bit)を使用しています。

Windows用のEmacsとして gnupack を使用しています(現時点での最新版は13.00-2015.05.02)。 gnupackには非常にお世話になっています。

るびきち様の勧め にしたがって gnupack-develをインストールしています。

また、メーラーは Mew を使用しています。

gnupackのバージョンを上げると、これらのアプリケーションを含めて cygwin環境をもう一度設定し直さなければならないため、インストール方法をメモしておきます。

Cygwin上での作業

stunnelのインストール

Gmailを使用する場合に必要となります。

startup_cygwin.exeを起動するか Emacs上のシェル(M-x eshell か M-x shell)で

apt-cyg update -m http://ftp.jaist.ac.jp/pub/cygwin
apt-cyg install stunnel

1行目はミラーサーバーとして http://ftp.jaist.ac.jp/pub/cygwin を選択しています(登録されるため以後は指定しなくてもよい)。

Mewのインストール

Mewのソースコードのダウンロード

ホームページ からソースコードをダウンロードする(現時点での最新版はmew-6.6.tar.gz)。

Mewのビルドおよびインストール

cd (path to sourcecode)
tar xzf mew-6.6.tar.gz
cd mew-6.6
./configure
make
make install
make install-jinfo

これで終了です。

当然ですが ~/.mew.el は必要です。

anythingで絞り込み選択をする際に全ての候補を選択する方法

最近、helmからanythingに戻せるものは戻しています。

そうした所、 helm(helm-miniなど)で絞り込み選択をする際に M-a で全ての候補を選択することができていましたが、 anythingではできないことに気付きました。

以下、解決法です。

そのため、 helmのソースコードで M-a を使用している箇所を検索したところ helm-mark-all という関数が見つかりました。

anythingでも同じような関数が定義されているかを調べたところ anything-mark-all が見つかりました。

そこで

(define-key anything-map (kbd "M-a") 'anything-mark-all)

としてM-aにanything-mark-allを割り当てたところ、 anythingでも全ての候補を選択できるようになりました。

【追記】

anythingのコードを見ると anything-mark-allがM-aに割り当てられているようです。

ただ、M-aが効いたり効かなかったりするので自分自身では上記の設定をしておきます。

また、 M-m (anything-toggle-all-marks)で全てを選択したり選択を解除することができるので、こちらでもいいかもしれません。