dired で rsync する

タイトル通り dired で rsync しようということです。ここしばらく使っていますがそこそこ便利なものです。

(defvar *dired-rsync-default-option* "-auv")

(defun dired-rsync-directory-name (dir)
  (if (string-match "^/[^:]+:\\(.+\\)$" dir)
       (match-string-no-properties 1 dir)
     dir))

(defun dired-do-rsync ()
  (interactive)
  (let* ((dired-dwim-target t)
         (target (dired-rsync-directory-name
                  (expand-file-name
                   (read-file-name "rsync to: " (dired-dwim-target-directory)))))
         (options (read-from-minibuffer "options: " *dired-rsync-default-option*))
         (dir (dired-rsync-directory-name (expand-file-name (dired-current-directory))))
         (files (mapcar 'file-name-nondirectory (dired-get-marked-files)))
         (win (selected-window))
         (buf (pop-to-buffer "*rsync*")))
    (erase-buffer)
    (dolist (f files)
      (start-process-shell-command
       "dired-rsync"
       buf
       (format "rsync %s %s%s %s" options dir (shell-quote-argument f) target))
      (newline))
    (select-window win)))

途中で強制終了ができないので注意してください。メジャーモードとしてしっかり書けばいいのですがそれは面倒なので手抜きです。

もう一つ注意点としては dired でマークしたディレクトリには末尾にスラッシュがつかないという点があります。つまり dir/ ではなく dir として扱われるということです。これは rsync では重要なので強調しておきます。--delete オプションをつけるときには特に注意して下さい。痛い思いをすることがあります。

デフォルトのオプション *dired-rsync-default-option*-auv にしてありますが、自分の良く使うものに変更すると良いでしょう。

dired-rsync-directory-name は tramp のリモートディレクトリを /ssh:ryo1@hostname:path/to/dir としたとき /ssh: の部分を無視するための関数です。正規表現はあまり自信はないのでもし問題があれば修正してください。

dired-do-rsync の最初の (dired-dwim-target t) は不要かもしれません。あっても損ではないのでそのままにしてあります。

キーバインドは好みの問題ですが

(define-key dired-mode-map (kbd "C-c r") 'dired-do-rsync)

普通の dired のコマンドのように一文字でもいいと思います。

メールフォームを設置しました

このサイトは静的サイトなのでコメント欄が無く当初からメールフォームを設置するつもりでしたが、のんびりしてしまいました。サイドバーの「メッセージを送る」というところから使えます。

調べてみると色々ありますが google のアンケート用のフォームを使うのが手軽でいいかなと思いました。

参考1 新Googleフォームで問い合わせフォームを作る方法&自動返信メール設定

参考2 Googleフォームを解説! 無料でも使えて、メール、問い合わせ、アンケート、申し込みフォームを作成できる! – Life is sparks.

このあたりを参考にしてやってみると簡単にできました。デザインがブログに合っていないのですが、無料でこういうことまで可能になるというのはすごいことだと思います。

余談ですが、長年使ったニフティのメールを解約しました。

思えば初めてメールを使った当初(90年代)はまだパソコン通信のニフティサーブの時代でした(Windows95が出る少し前)。その後いったん解約してまた戻ったのですが、合計で10数年は使ったので多少の感慨はあります。それからコンピューター、インターネットの世界の移り変わりは凄まじく、いまはクラウドの時代でこのブログもクラウド上でやっていますが、これもそのうち古いもの(というか当然のもの)になるのだろうと思います。

私は基本的に最新のものに追随するのが苦手なのでいつも時代遅れですが、これからは AI が伸びてどこまで行くのかと注目しています。

オフスクリーンレンダリングして画像書き出し

旧ブログの同名の記事を書き直したものです。

オフスクリーンレンダリングして画像書き出し-TIPS

旧記事では古い OpenGL に関して書きましたが、今回の記事は OpenGL 3.3 以降で使えるはずです。といっても、ほとんど違いはなく関数名、定数名から EXT を外すだけですが。

今回もまた大雑把なやり方だけ記します。

グローバル変数

frame buffer と render buffer のインデックスをそれぞれ fbID, rbID とする。書き出したい画像のサイズを FB_WIDTH, FB_HIGHT とする。

GLuint fbID, rbID;
int FB_WIDTH, FB_HEIGHT;

初期化

glewInit();

// renderbuffer object の生成
glGenRenderbuffers( 1, &rbID );
glBindRenderbuffer( GL_RENDERBUFFER, rbID );

// 第二引数は 色 GL_RGB, GL_RGBA, デプス値 GL_DEPTH_COMPONENT, ステンシル値 GL_STENCIL_INDEX などを指定できる
glRenderbufferStorage( GL_RENDERBUFFER, GL_RGBA, FB_WIDTH, FB_HEIGHT ); 

// framebuffer object の生成
glGenFramebuffers( 1, &fbID );
glBindFramebuffer( GL_FRAMEBUFFER, fbID );

// renderbufferをframebuffer objectに結びつける
// 第二引数は GL_COLOR_ATTACHMENTn, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT など
glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbID );

glBindFramebuffer( GL_FRAMEBUFFER, 0 );

Display 関数内で

// fbo 有効化
glBindFramebuffer( GL_FRAMEBUFFER, fbID );
glDrawBuffer(GL_COLOR_ATTACHMENT0);

// 通常の描画...

// 読み込むバッファを選ぶ
glReadBuffer(GL_COLOR_ATTACHMENT0);

// glReadPixels を用いて画像を保存する処理...

// fbo 無効化
glBindFramebuffer( GL_FRAMEBUFFER, 0);

その他

オフスクリーンなのでウインドウを出さずにやりたいのですが、そのやり方はいまだに不明です。OpenGL の初期化自体ができないので。しょうがないので小さなウインドウ(100×1)を出してやっています。

この記事が旧ブログからの初めての移転記事になりますが、全部やるつもりはないのでいくつか選んで移転するつもりです。

各種テスト

色々とテストする記事です。意味はありません。

シンタックスハイライトと数式は外部の javascript に依存しています。

画像を貼るテスト

test-image

シンタックスハイライトのテスト

シンタックスハイライト用のライブラリは何種類かあるようですが対応言語の多い hilight.js を使用。

以下よく使いそうなもの:

C
#include <stdio.h>

int main(int argc, char** argv)
{
    printf("Hello, World!\n");
    return 0;
}

Lisp
(defun string< (s1 s2)
  (cl-loop for c1 across s1
           for c2 across s2
           if (< c1 c2) return t
           if (> c1 c2) return nil
           finally (return (< (length s1) (length s2)))))
Clojure
(defn permutation [coll]
  (let [coll (into [] coll)
        n (count coll)
        idx (vec (for [j (range n)] (symbol (str "i" j))))
        lst (take n (iterate identity coll))
        args (vec (interleave idx lst))]
    (eval `(for ~(conj args :when `(= (count (set ~idx)) ~n)) ~idx))))
Scheme
(define (fib n)
  (fib-iter 1 0 n))

(define (fib-iter a b count)
  (if (= count 0)
      b
      (fib-iter (+ a b) a (- count 1))))
Maxima
compose_sub(fn,var):=fn(var);
compose(fn,n,var):=rreduce(compose_sub, makelist(fn,n), var);

g(x):=x^2;
compose(g,3,x); 
=> x^8
Bash
cat feed.xml |
    grep -E '<title>|<link>' |
    sed -n '3,4p'

数式のテスト

数式は MathJax を使用。以下の2文につながりはありません。適当に教科書から拾ったものです。

写像

\[
G \times \widehat{G} \ni (x, \chi) \mapsto \langle x, \chi \rangle := \chi(x) \in \mathbb{C}^{\times}
\]

をカプリングという。

直積空間 \(S^{1} \times S^{1}\) 上の \(C^{\infty}\) 関数 \(K(\theta, \varphi)\) が与えられたとき、\(C^{\infty}(S^{1})\) 上の線型写像を

\[
C^{\infty}(S^1) \ni f(\theta) \mapsto \frac{1}{2\pi} \int_{0}^{2\pi} K(\theta,\varphi)f(\varphi)d\varphi \in C^{\infty}(S^1)
\]

で定義する。

ブログ移転で苦労した点

ブログ移転で苦労した点などを記しておきます。

ドメイン名がない

.com のドメインが欲しかったのですが、使いたい名前はすでに使われているというのが問題で何度トライしたことか。これが一番苦労したかもしれない。

どこのサーバーを借りるか悩む

ドメインを取得した会社でサーバーも借りて wordpress をクリック一発でインストールというのが一番簡単だと思いますが、どこのサーバーを借りればいいのかわからない。

それで色々調べたわけですが、海外サーバーは安くて機能も豊富とかいう情報がけっこうあるのです。有名なところをいくつか比較してみたところ言うほど安くない気がするし、機能が豊富でもどうせ使わない(えない)だろうと思い、やっぱり日本の格安サーバーでいいか、などと思っていたところ、StaticPressとS3で爆速で激安な静的サイトを作ろうというサイトを発見した。

静的サイトってどうなのかなと思いましたが、ブログで使う動的機能というのはコメントとサイト内検索くらいらしく、6年やってもコメントなど1件しかなかったので別にいらないんじゃないかということで決心。トラブルを避けるためにコメントを閉じているブログもあるくらいなので問題はないでしょう。

ただ全く連絡がつかないというのも良くないので、そのうちメールフォームでも設置しようかと思っています。

web の知識がない

ネームサーバの設定など自分がやることになるとは思っていなかったし、css,javascript,phpなど名前は聞いたことはあるけれど、まるで興味がなかったので触ったこともない。javascript や php はともかく、css は wordpress のテーマのカスタマイズで少し触らざるを得ませんでした。といっても検索してコピペしただけでとりあえず何とかなりましたが。それと wordpress のテーマをカスタマイズするときには、子テーマを作ったほうが良いようです。

やってみてブログサービスというのはそれなりに良くできているのだなと初めて認識した次第。

サイドメニューについて

よくブログのサイドメニューに月別アーカイブというのを見ますが、長期間続けるとサイドメニューが非常に長くなり見にくいという問題があります。最初はロールバー(?)で表示しようと思ったのですが、staticpress の問題なのか wordpress のテーマの問題なのかわかりませんが、うまいこと変換してくれなかったので付けませんでした。そのかわりに固定ページで記事一覧を付けました。ついでにいうとRSSフィードも転送してくれなかったので手動でアップロードすることになりました。こういうときに javascript や php などがわかると自分で直せるのかもしれません。

以上こんなところですが、ドメイン名が無いのとネームサーバーの設定に苦労したかなと思います。初めてだとネームサーバーの設定で妙な不安感があります。特に設定してしばらく反映されないと焦ります。設定が間違っていたのではないか?とか考えますから。自分の場合だと朝起きたら反映されていました。正確にはわかりませんが10時間くらいかかったのかなと思います。速ければ1時間くらいで反映されるようですが2、3日かかる場合もあるようです。気長に待つしかないのでしょうかね。

ご挨拶

6年半ほどお世話になった、はてな(旧ブログ TIPS)から引越してきました。

lambda-domain は、lambda を名無しと訳せば、「名無しのドメイン」ですが、「名も無き領域」という意味で使っています。

今のところ AWS のストレージを借りて静的ウェブホスティングという形にしています。WEB について全然知識がないので難儀しました。

そもそもは友人がホームページを移転したいというので、自分もブログの引っ越しを考えていたこともあって、独自ドメインをとって、共同で管理すればいいかなというのが移転の理由です。(実際には私がやることになるのでしょうが。)

ブログも6年もやっていると時代に合わないような記事があったりして消してしまおうかと思ったり、ちょっと気分を変えたいという気持ちもあったのです。

このサイトはまだ完成しておらず、トップページも作っていないのですが、とりあえず自分のブログだけは移転してしまおうということです。少しずつ変化していくと思います。基本的には技術的なメモということでやってきたのでそれは続けると思いますが、少し趣を変えたような記事も書くかもしれません。

はてなブログは6年かかっても100記事にも到達しなかったので相当のんびりしたペースですが、今後もぼちぼちやっていくつもりです。今後ともご愛顧のほどをよろしくお願いします。