2010年9月11日土曜日

Emacsから校正支援する

 Emacs から 日本語の校正支援をする Emacs lisp を作ってみました。


インストール

 github からダウンロードしてきた yspel.el ~/emacs.d/ などの load-path の通った場所に置いてください。
 git コマンドからなら、
git clone git://github.com/yama-natuki/yspel
で落とせます。
 落としてきたら ~/.emacs
(require 'yspel)
と書いておきます。


使い方

  • 校正したいテキストファイルを開きます。
  • 開いたら M-x yspel としてyspel を起動します。
  • ウィンドウが分割され、校正箇所がリストアップされます。
  • pキーとnキーでリストを上下に移動します。
  • リターンキーで該当箇所にジャンプします。
  • ウィンドウを閉じるときは q キーです。



 Yahoo API を利用して校正支援をおこなっています。
 yahoo API の制限で校正できるファイルサイズは 100KB までです。あまり大きいテキストだとうまくいかないかもしれせん。
 だいたい4000文字ぐらいが安心?
 文書が大きい場合は範囲選択して分割して M-x yspel するようにしてください。


 取りあえず、動くものを作った。多分動くと思う(^_^;)
 原稿や論文などの校正にお役立てください。メールを送信する前とかにもいいですね。

 まーしかしあれですね、Emacsはプログラムだけでなく普通の文章を書くのにも最高の道具ですね。Emacsから広辞苑は引けるわ、Emacsから英辞郎もひけるわ、Emacsから翻訳もできるわ、Emacsからはてなキーワードを調べられるわ、Emacsから原稿枚数も計算できるわ、Emacsから校正支援もできるわ。Emacs最高です。

2010年8月11日水曜日

Emacs でファイルをsudoで開き直す。その2

 前回、root所有のファイルをsudoで自動的に開き直してくれる Emacs lisp の記事を書きました。わりと好評だったようでよかったです。
 今回、rootユーザだけでなく、他のユーザのファイルも同様に開いて編集したいとのリクエストがきたので、修正してみました。以下になります。差し替えて使ってみてください。

(defun file-other-p (filename)
"Return t if file FILENAME created by others."
(if (file-exists-p filename)
(/= (user-real-uid) (nth 2 (file-attributes filename))) t))

(defun file-username (filename)
"Return File Owner."
(if (file-exists-p filename)
(user-full-name (nth 2 (file-attributes filename)))
(user-full-name (nth 2 (file-attributes (file-name-directory filename))))))

(defun th-rename-tramp-buffer ()
(when (file-remote-p (buffer-file-name))
(rename-buffer
(format "%s:%s"
(file-remote-p (buffer-file-name) 'method)
(buffer-name)))))

(add-hook 'find-file-hook
'th-rename-tramp-buffer)

(defadvice find-file (around th-find-file activate)
"Open FILENAME using tramp's sudo method if it's read-only."
(if (and (file-other-p (ad-get-arg 0))
(not (file-writable-p (ad-get-arg 0)))
(y-or-n-p (concat "File "
(ad-get-arg 0) " is "
(if (file-exists-p (ad-get-arg 0)) "read-only." "newer file.")
" Open it as "
(file-username (ad-get-arg 0)) "? ")))
(th-find-file-sudo (ad-get-arg 0))
ad-do-it))

(defun th-find-file-sudo (file)
"Opens FILE with root privileges."
(interactive "F")
(set-buffer (find-file (concat "/sudo:"
(file-username file) "@" (system-name) ":" file))))



 これで他のユーザのファイルでもそのユーザとして開いて編集する事ができます。



2010/08/15:修正


 新規ファイルを開こうとするとエラーになってしまうのを修正した。

2010/08/16:修正


 他ユーザの新規ファイルを開けるようにした。
 再度ダウンしなおして差し替えてください。

2010年6月12日土曜日

ubuntu 10.04 アップデートメモ

 遅ればせながら ubuntu10.04 にアップグレードしたのでそのメモを。

  • 起動時のスプラッシュ画面が、Plymouthになった。
  • kernel option で vga=792 としていたが、コンソールが表示されなくなった。
     フレームバッファの取り扱いも変更になたようだ。
     nvidia のプロプラなドライバを利用している場合は、
    echo FRAMEBUFFER=y | sudo tee /etc/initramfs-tools/conf.d/splash
    sudo update-initramfs -u
    とし、
    sudo hwinfo --framebuffer
    として解像度の値を取得。 Mode 0x031b: 1280x1024 (+5120), 24 bitsにしたいので、kernel optionに、
    vga=0x031b
    と指定。無事コンソールが高解像度で表示されるようになった。

  • Emacs = Emacs23 となったので、以前のemacs22 と emacs-snapshot を削除。すっきり。
  • アップグレード時にxscreensaver が起動してるとダメよとメッセージが出たので、killした

 トラブルはこんなものか? 今回はほとんどトラブルらしいトラブルがなかった。
 特に問題もなくアップグレード作業は終わり。うーん書くことがない。困った(^_^;)
 起動時間は少し速くなったかなあという感じ。うちのPCがロートルなので体感出来ていないだけですかね。
 ext4 が以前より体感で高速になっている。不思議。遅くなっているハズなんだけどなあ。
 そんなわけで特に問題もなく、きわめて快適です。

2010年4月3日土曜日

nautilusのゴミ箱表示に削除した日と元の場所を追加する

 nautilusのゴミ箱を一覧表示した時に「元の場所」と「ゴミ箱に入れた日」という項目を表示するパッチを当てたものをPPAに置きました。
 よろしかったらどうぞ。

PPAの追加の仕方

sudo add-apt-repository ppa:yama-natuki/ppa

インストール

sudo apt-get update
sudo apt-get upgrade


こんな感じ。


 ubuntu 9.10 用です。

2010年3月1日月曜日

Emacs でファイルをsudoで開き直す

 tramp の最初の一回目の認証で待たされる感覚が嫌いなので、私はよくsudo をやらずにそのままファイルを開いてしまいます。そうして「ああ、やっぱり編集したい」となり、sudo で開きなおします。
 作業の流れ的に美しくありませんし、毎回引っかかるのでストレスにもなります。
 vim ですと「:e sudo:%」でカレントファイルを sudo で開きなおしてくれるようです。いいなあ。

 ということで 自動的に sudo で開きなおしてくれる機能を作ろうかと思ったら、すでにあったのでそれを導入します。
 元のlispは、書き込み不可なファイルすべてをsudoで開きなおすか聞いてくるのでうっとおしいので、少し修正しました。
 root所有なファイルを開いた時だけ、sudoで開き直すか聞いてくるようにしました。

 以下を ~/.emacs にコピペしします。

(defun file-root-p (filename)
"Return t if file FILENAME created by root."
(eq 0 (nth 2 (file-attributes filename))))

(defun th-rename-tramp-buffer ()
(when (file-remote-p (buffer-file-name))
(rename-buffer
(format "%s:%s"
(file-remote-p (buffer-file-name) 'method)
(buffer-name)))))

(add-hook 'find-file-hook
'th-rename-tramp-buffer)

(defadvice find-file (around th-find-file activate)
"Open FILENAME using tramp's sudo method if it's read-only."
(if (and (file-root-p (ad-get-arg 0))
(not (file-writable-p (ad-get-arg 0)))
(y-or-n-p (concat "File "
(ad-get-arg 0)
" is read-only. Open it as root? ")))
(th-find-file-sudo (ad-get-arg 0))
ad-do-it))

(defun th-find-file-sudo (file)
"Opens FILE with root privileges."
(interactive "F")
(set-buffer (find-file (concat "/sudo::" file))))



 これで dired や C-x C-f で普通にファイルを開いても、それがroot所有なファイルならば自動的にsudoで開きなおすか聞いてくれます。おかげでtrampを意識しなくて済むのでとても楽になりました。

2010年2月23日火曜日

Ubuntu のdvipdfmx でB5でPDFにしたら用紙サイズが変

 前回 TeX を導入し、いろいろ弄くって PDF に変換したりして遊んでいたんですが、
dvipdfmx -p b5 test.dvi
とかして 用紙を B5 指定にしてPDFに変換しても、どうもレイアウトがずれる。あれーおかしいなあとかなり悩んだんですけど、どうも用紙サイズがB系列がISO規格になっていて、国内のJIS規格に対応していないのが原因だった。

 とりあえず linpaper にB系列の用紙サイズを追加したものを PPA にアップしておきましたのでどうぞ。

dvipdfmx -p b5j test.dvi
というように j を付ければJIS規格のサイズで出力されます。
ついでにはがきサイズも追加しておきました。 hagaki でいけます。

2010年2月18日木曜日

Ubuntu 9.10 に TeX を入れてみた

 Ubuntu に TeX を入れてみましたので、メモ。
基本的に ubuntu wiki のとおり。
sudo apt-get install latex-env-ja
sudo apt-get install latex-extra-ja
sudo jisftconfig add


でインストールが完了します。簡単ですねー昔の事を考えたら素晴しい進化です。

●dvipdfmx が jsarticle で動かない

 jarticle では問題なく動きます。新しい jsarticle ではエラーが出て動きませんでした。
 うちの環境では、/etc/texmf/dvipdfm/dvipdfmx.cfg の最下行に、
f jis-cjk.map

を追記し、 sudo update-vfontmap する事で動きました。

  • 出来たdviファイルを確認する時は→
       xdvi を使う。
  • PDFに変換するには→
       dvipdfmx を使う。
  • 文字コードは→
       当座はeuc-jpにする


 こんなとこかな?
 TeXなんて使ったのは遥か昔の事なので、完全に忘れています。使う機会もないんですが、テキストのメモなんかプリントアウトする際にちょちょいと整形するのに便利なので、今後使っていこうかな。かな。かなあ?

2010年2月10日水曜日

darkroom.el をちょこっと修正

 事前にcolor-themeを設定しなくても済むようにしました。自動で保存・復元します。
 こちらから落としなおして下さい。

バグ
 DDSKK を起動すると背景色が復元しない><
 追記:ddskk をcvs先端にしたら直った。ということでオールクリアー。

2010年2月8日月曜日

Emacs で DarkRoom

 DarkRoom とはフルスクリーンでただ文章を書くことのみに集中させるというシンプルなエディタです。
 しかしこれが言うのとやるのとでは全然違います。最近のPCは画面も大きくなり、横長になり、様々なウィジットをデスクトップにちりばめ、タスクトレイにいろんアイコンが並んでいる。気がつくと情報過多なデスクトップになっているのです。その事に気づかされました。


でまあ、当然これをEmacsでもできないかとなと思い、やってみました。



 以下の Emacs lisp を darkroom.el という名前で load path の通った場所に保存してください。
 次に ~/.emacs に、
(require 'darkroom)
(global-set-key [f11] 'darkroom-mode)
と追記すればOKです。
 後は F11 キーを押せばフルスクリーンでDarkRoomモードになります。
;;; darkroom.el --- 
;; Copyright (C) 2010  yama
;; Author: yama ;; Keywords: 
;;  $Id: darkroom.el,v 1.10 2010/02/25 10:22:02 yama Exp $ 
;; This program is free software; you can redistribute it and/or modify;; it under the terms of the GNU General Public License as published by;; the Free Software Foundation, either version 3 of the License, or;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,;; but WITHOUT ANY WARRANTY; without even the implied warranty of;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; use color-theme
;;; Usage
;;; (require 'darkroom);;; M-x darkroom
;;; Code:(require 'color-theme)


;;; Config ---------------------------------------------------------(defvar darkroom-left-margin  30
  "left margin")

(defvar darkroom-right-margin 30
  "right margin")

(defvar dark-mode-on nil
  "Non-nil if DarkRoom mode is enabled.
Don't change this variable directly, you must change it by one of the
functions that enable or disable Dark Room mode.")

;;; -------------------------------------------------------------------

(defun fullscreen (&optional f)
  "Chenge FullScreen. for Emacs23"
      (interactive)
      (set-frame-parameter f 'fullscreen
                           (if (frame-parameter f 'fullscreen) nil 'fullboth)))

(defun darkroom-mode ()
  "simple writing environment."
  (interactive)
  (if (equal dark-mode-on t) (darkroom-mode-disable)
    (darkroom-mode-enable)))

(defun darkroom-mode-enable ()
  (setq dark-mode-on t)
  (setq darkroom-default-background-color
        (cdr (assoc 'background-color default-frame-alist)))
  (fset 'color-theme-snapshot (color-theme-make-snapshot))
  (sleep-for 0.05)
  (color-theme-simple-1)
  (fullscreen )
  (set-cursor-color "yellow") ;; cursor color  (tool-bar-mode 0)
  (menu-bar-mode 0)
  (display-time-mode 1)
  (scroll-bar-mode)
  (set-face-foreground 'mode-line "gray25")
  (set-face-background 'mode-line "gray1")
  (if (equal (intern-soft "elscreen-version") nil) nil
    (elscreen-toggle-display-tab))
  (auto-fill-mode 1))

(defun darkroom-mode-disable ()
  (setq dark-mode-on nil)
  (add-to-list 'default-frame-alist
               '(background-color . darkroom-default-background-color))
  (color-theme-snapshot)
  (scroll-bar-mode)
    (if (equal (intern-soft "elscreen-version") nil) nil
    (elscreen-toggle-display-tab))
  (display-time-mode 0)
  (sleep-for 0.05)
  (fullscreen ))
    
(defun window-count ()
  (length (window-list (selected-frame) 1)))

(defun set-margin ()
  (set-window-margins (selected-window)
                      darkroom-left-margin
                      darkroom-right-margin))

(defun dark-window-update ()
  (if (equal dark-mode-on t)
      (if (> (window-count) 1)
          (progn
            (set-window-margins (selected-window) 0 0)
            (set-window-margins (previous-window) 0 0))
        (set-margin))
  (set-window-margins (selected-window) 0 0)))

(add-hook 'window-configuration-change-hook 'dark-window-update)


(provide 'darkroom)
;;; darkroom.el ends here




 低機能です。フルスクリーンにする部分がEmacs23からの機能を使っているので、emacs23以上で使用してください。そこを書き換えればemacs22とかでも動作するはず。
 あらためて こうして全画面で作業をしていると、twitter や ウェブブラウズとかしなくなり、気が散らずに作業できるんだなあと。というか今までどんだけ注意力散漫だったんだろうと思いましたw


 さあ皆さんも思う存分執筆に集中して下さいw


ps.
# 端末で起動してフルスクリーンにすればいいじゃんという突っ込みはなしで;;



●追記:
 color-theme の設定書いただけで反映するの忘れてた(^_^;) 修正しましたので落とした方は再度落とし直して下さい。

●2012/08/30 追記:
 続き→ http://ubulog.blogspot.jp/2012/08/darkroomel.html

2010年1月26日火曜日

ubuntuで壁紙をランダムに切り替える。

 起動時にランダムに壁紙を変更していきます。
 毎回同じ壁紙だと飽きてくるし、かといって手動でいちいち切り替えるのも億劫になってきまして(^_^;)


 まず、ランダムに変える壁紙を入れたディレクトリを決めておきます。壁紙となる画像ファイルはあらかじめ gimp などのフォトレタッチソフトを使ってサイズを統一しておきましょう。その方がいろいろと面倒じゃなくなるので。

● icewm の場合

 以下を random-wallpaper-icewm.sh という名前で ~/bin あたりに保存します。保存したら、chmod +x random-wallpaper-icewm.sh として実行属性を付けるのを忘れずに。
 pref は ~/.icewm/preferences の場所です。
 WALLPAPERS は壁紙のあるディレクトリを指定します。
 それぞれ御自分の環境に合わせて修正してください。

#!/bin/bash
# last updated : 2010/01/21 21:13:37 JST
#
# icewm用ランダム壁紙チェンジャー
#

pref='/home/ユーザー名/.icewm/preferences'
WALLPAPERS="$HOME/MyPictures/Wallpapers"
ALIST=( `ls -w1 $WALLPAPERS` )
RANGE=${#ALIST[*]}
SHOW=$(( $RANDOM % $RANGE ))

sed --in-place=.bak -e \
's:^DesktopBackgroundImage=.*$:DesktopBackgroundImage="'"${WALLPAPERS}/${ALIST[$SHOW]}"'":' $pref
icewmbg -r
 修正して保存し終えたら、~/.icewm/startup の最後の方に追記します。
 以上で次回以降、icewmにログインする度に壁紙がランダムで変更されます。


● GNOME の場合

 以下を random-wallpaper-gnome.sh という名前で ~/bin あたりに保存します。保存したら、chmod +x random-wallpaper-gnome.sh として実行属性を付けるのを忘れずに。
 WALLPAPERS は壁紙のあるディレクトリを指定します。
 自分の環境に合わせて修正してください。

#!/bin/bash
# last updated : 2010/01/26 15:13:17 JST
# Set Random Wallpapers for GNOME.
#

WALLPAPERS="$HOME/MyPictures/Wallpapers"
ALIST=( `ls -w1 $WALLPAPERS` )
RANGE=${#ALIST[*]}
SHOW=$(( $RANDOM % $RANGE ))

gconftool-2 --type string --set "/desktop/gnome/background/picture_filename" $WALLPAPERS/${ALIST[$SHOW]}
gconftool-2 --type string --set "/desktop/gnome/background/picture_options" "centered"
 保存し終えたら、メインメニューのシステム設定自動起動するアプリ を起動します。

 起動したら追加ボタンを押して追加メニューを出し、登録していきます。


 これで次回以降ログインする度に壁紙がランダムに設定されて表示されます。

● openbox の場合

 以下を random-wallpaper.sh という名前で ~/bin あたりに保存します。保存したら、chmod +x random-wallpaper.sh として実行属性を付けるのを忘れずに。
 WALLPAPERS は壁紙のあるディレクトリを指定します。
 自分の環境に合わせて修正してください。
 feh というコマンドを使いますので、あらかじめ
sudo apt-get install feh
として入れておいて下さい。

#!/bin/bash
# last updated : 2010/01/05 15:12:05 JST
#
# SET random Wallpapers for background.
#

WALLPAPERS="$HOME/MyPictures/Wallpapers"
ALIST=( `ls -w1 $WALLPAPERS` )
RANGE=${#ALIST[*]}
SHOW=$(( $RANDOM % $RANGE ))

feh --bg-scale $WALLPAPERS/${ALIST[$SHOW]}
 修正して保存し終えたら、~/.config/openbox/autostart.sh の最後の方に追記します。
 以上で次回以降、openboxにログインする度に壁紙がランダムで変更されます。

2010年1月2日土曜日

ubuntuでファイルコピーでベリファイする

 ubuntuで大きいファイルや沢山のファイルをコピーする場合は、nautilusでコピーするのではなく、cp コマンドを使うと便利です。リソースも食わず、バックグラウンドで放っておけますし、なにより基本中の基本コマンドなので安心感が違います。
 とはいえ、ネットワーク越しのコピーだと外乱要素が多いので、ちゃんとコピーできたかどうか確認した方がいい場合もあります。大事なデータの引越しとかですね。
 そこで正しくコピー出来たかどうか確認するためにベリファイをします。各ファイルのハッシュ値を出して比較して正しくコピー出来たか確認します。
 標準で md5sum コマンドがありますが、今回は確認作業をもっと楽にしてくれる md5deep コマンドを使います。


インストール

sudo apt-get install md5deep

使い方


  1. 元ファイルのハッシュ値リストを作成する。

     まず最初に元となるファイル群のハッシュ値リストを作成します。
    md5deep -r ディレクトリ名 > hash.list

    -r オプションを付けることにより、再帰的に動作します。
    -e オプションを付けると進行状況を表示します。大きいファイルの時に使うといいでしょう。
    このハッシュリストは元データと同じディレクトリに保存しておきますと、そのうちなにかの役にたつかもしれませんw
  2. コピー先と比較する。
     作成しておいたハッシュ値リストと、コピーした先のファイル群のハッシュ値とを比較していきます。
     正常にコピー出来たファイルはいちいち報告する必要はないので、正常にコピー出来なかったファイル名だけ表示させるようにします。
    md5deep -X hash.list -r 比較作ディレクトリ
    -X オプションはマッチングしないものだけを表示します。
    両方のファイル名を表示させたいなら、-w オプションを付けます。
     これでなにも報告されなかったら正常にコピーできています。もしハッシュ値が違っていた場合は報告されますので、再度そのファイルをコピーすればいいでしょう。


 基本的な手順は以上です。簡単でしょう?
 シェルスクリプトでサブプロセスで動かせば、並列して計算させる事も出来るので、高速化もできるでしょう。同一のHDDじゃあまり意味ないですけど。マルチコアじゃないと意味がないですけど。

 大事なデータの移動には是非ベリファイしておきたいものです。
 ついでに cp ですが、 nice コマンドと併用することでコピー時の負荷を減らす事が出来ます。さらに ionice と組み合わせると、もっとシステム負荷を減らせます。

ex.
ionice -c3 -n7 nice -n19 cp コピー元 コピー先 && zenity --info --text "コピー完了"

-c3 はシステムがアイドル時にしかコピーしません。-n7 で優先度を最低に。さらにniceの方でも優先度を最低にしています。
 これでバックグラウンドでコピーさせています。もちろんコピーの優先度を最低にしてますので、結果としてコピーの時間はかかりますが、システムの負荷は減るでしょう。
 最後にコピーが終了したら通知ウィンドウを表示させるようにしていますので、時間のかかるコピーでも、コピー完了を忘れることを防ぎます。

 であであ快適なubuntu生活を♪