2010-03 / 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

2010-03-30 (火)

C でクロージャ [C]

gcc 拡張を使うと、関数の中に関数を定義することができる。これを利用する
と C でもクロージャが使えることを少し前に知ったが、


ようやく理解できた...気がする。

クロージャとは


C 言語のコールバック関数に近いが、引数以外の変数を自身が定義された静的
スコープで解決することが最大の特徴。

...だと理解しています。^^;

コーディング例


#include <stdio.h>

/* 任意の関数 func を n 回実行するだけのライブラリ関数 */
void
dolist(void (*func)(void), int n)
{
    int i;

    for(i = 0; i < n; i++) {
	func();
    }

    return;
}

int
main(void)
{
    int level = 0;

    void lambda(void)
    {
	level++;
    }

    printf("%d\n", level);

    dolist(lambda, 1);
    printf("%d\n", level);

    dolist(lambda, 2);
    printf("%d\n", level);

    dolist(lambda, 3);
    printf("%d\n", level);

    return 0;
}



結果


0
1
3
6


Solaris9 の /usr/local/bin/gcc で確認した。

dolist は渡された処理(lambda)を、指定された回数分実行するだけのライブラ
リ関数。

ユーザ(main)は処理内容を、自分の静的スコープの中で自由に定義することが
できる。level を外部変数にしなくて良い点が素晴らしい。狭いスコープ大事。

lambda() を nm で確認したところ、t マークが付いていた。lambda() はスタッ
クに展開されているわけではなく、static な関数として定義されているという
こと。

lambda() と level の関係はどうなっているんだろう?

この記事に言及しているこのブログ内の記事

2010-03-22 (月)

『池袋ウエストゲートパーク』を読んだ [Book]



@kanatinxx から借りた。

最初のドーベルマンのエピソードで引いた。。こういうアングラな話は、
読んでてお腹いっぱいになるなあ。

2010-03-17 (水)

『東京奇譚集』を読んだ [Book]



『回転木馬のデッド・ヒート』の次に読んだのは正解だった。こちらはよ
り小説に近くなっている。「偶然の旅人」「ハナレイ・ベイ」のもの悲し
さが好き。「どこであれそれが見つかりそうな場所で」これは氏の他の小
説と比べて意外な展開で楽しめた。

『回転木馬のデッド・ヒート』を読んだ [Book]



登場人物をリセットしながら読むのが苦手なので短編はあまり読まないけ
ど、これは読みやすかった。インタビューに近い構成を取っているためだ
と思う。ただ、聞いたそのままを文章にしているわけではない。「昼飯に
ハムとキュウリのサンドイッチを作って食べ、ビールを一缶飲んだ。」こ
のあたりは間違いなく村上アレンジ。

2010-03-13 (土)

Emacs で現在の日時付きの名前でバックアップしてからセーブする [Emacs]

例えば「昨日まで書いてあったんだけど、もうあの内容は消しちゃったな
あ」ということは良くあると思います。

ずいぶん前から「現在の日時付きの名前で ~/.trash にバックアップして
から、セーブする関数」を使っています。結構便利です。ファイルは無限
に増えるので、cron 等で削除して下さい。

(defvar renban-copy-directory "~/.trash" "The directory for renban-copy.")
(defvar renban-copy-upper-limit-size (* 512 1024) "The upper limit of the file size for renban-copy.")

(defun renban-copy ()
  "現在のバッファに対応するファイルを filename.year-date-time という
書式で `renban-copy-directory' にコピーします。
`renban-copy-upper-limit-size' より大きなサイズのファイルはコピー
しません。"
  (unless renban-copy-directory
    (error "%s is nil." (symbol-name 'renban-copy-directory)))
  (let ((srcname buffer-file-name)
	(dir (expand-file-name renban-copy-directory))
	(dir-mode #o2700)
	dstname)
    (when (and srcname
	       (file-exists-p srcname)
	       (buffer-modified-p)
	       (<= (nth 7 (file-attributes srcname))
		   renban-copy-upper-limit-size))
      (unless (file-exists-p dir)
	(make-directory dir t))
      (unless (eq dir-mode (file-modes dir))
	(set-file-modes dir dir-mode))
      (setq dstname
	    (expand-file-name
	     (concat
	      (file-name-nondirectory srcname)
	      "."
	      (format-time-string "%y-%m%d-%H%M%S"))
	     dir))
      (message "Copying...")
      (copy-file srcname dstname t nil)
      (message "Copying...done."))))



renban-copy() は advice や関数と組み合わせて使います。

例1: save-buffer() に advice します。他の elisp プログラムから呼ば
れた場合も、バックアップされます。

(defadvice save-buffer
  (before
   save-buffer-before-advice
   activate)
  "save-buffer() の前に renban-copy() します。"
  (renban-copy))



例2: 例1 とほぼ同じですが、バックアップする/しないを Ctrl-u で制御
できます。引数の意味が save-buffer() と逆になってしまうので、気にな
る人は気になるかもしれません。

(defadvice save-buffer
  (before
   save-buffer-before-advice
   activate)
  "save-buffer() の前に renban-copy() します。
ただし、引数が与えられたら renban-copy しません。"
  (let ((arg (ad-get-arg 0)))
    (if (or (null arg) (= arg 1))
	(renban-copy))))



例3: Ctrl-x Ctrl-s した時だけバックアップします。例えば Mew のドラ
フトはバックアップされないので、残念な気持ちになることもあるかもし
れません。

(defun renban-copy-and-save (&optional arg)
  "renban-copy() してから save-buffer() します。
ただし、引数が与えられたら renban-copy() しません。"
  (interactive "P")
  (unless arg (renban-copy))
  (save-buffer))

(define-key ctl-x-map (kbd "C-s") 'renban-copy-and-save)



元ネタは blankspace -> tips の my-backup-save() ですが、原型がほと
んどなくなってしまいました。こちらは現在のバッファをバックアップす
るので、微妙に動きが違います。

P.S.
ちょっとブログにアップするだけの予定だったのに、気がついたら関数を
だいぶ書き換えていました。アップ前は renban-copy() の中でセーブまで
していましたが、アップ後の方が汎用的で良いと思います。

追記(2010-03-14):
新規にファイルを作成し、セーブする場合に問題があったので、
renban-copy() を置き換えました。さらに 例2 も Mew のドラフトを作る
ときに問題があったので差し替えました...。

ver22 までの Emacs で、物理行単位にカーソル移動する方法 [Emacs]

[2009-01-20-1] の補完。

ver22 までの Emacs のカーソル移動は論理行単位なので、こんなのを使っ
てます。時々移動がミスりますが、そこはご愛嬌ということで。

(defvar vz-goal-column 0 "Vz風ゴールカラム")

(defvar vz-enable-p t "*Enable the physical moving.")

(defun toggle-variable (var)
  "Toggle '(symbol-value var)'."
  (set var (not (symbol-value var)))
  (message "'%s' is now '%s'"
	   (symbol-name var) (symbol-value var)))

(defun vz-toggle-vz-enable-p ()
  "Toggle 'vz-enable-p'."
  (interactive)
  (toggle-variable 'vz-enable-p))

(defun vz-next-line (num)
  "Vz:↓"
  (interactive "p")
  (if (or (not vz-enable-p) truncate-lines)
      (next-line num)
    (or (eq last-command 'vz-next-line)
	(setq vz-goal-column (% (current-column) (1- (window-width)))))
    (if (eolp)
	(progn
	  (forward-char 1)
	  (move-to-column vz-goal-column))
      (vertical-motion num)
      (move-to-column (+ vz-goal-column (current-column))))))

(defun vz-previous-line (num)
  "Vz:↑"
  (interactive "p")
  (if (not vz-enable-p)
      (previous-line num)
    (if truncate-lines
	(previous-line num)
      (or (eq last-command 'vz-next-line)
	  (setq vz-goal-column (% (current-column) (1- (window-width)))))
      (let ((ncol (- vz-goal-column (window-width) -1)))
	(vertical-motion (- num))
	(if (<= 0 ncol)
	    (move-to-column ncol)
	  (move-to-column (+ vz-goal-column (current-column))))))
    (setq this-command 'vz-next-line))) ;fake



情報源:
極私的 Emacs カスタマイズ紹介マガヂン Emacs をわたし色に染めて♪
第 16 回 物理行単位のカーソル移動 〜vz.el から一部を流用する〜

2010-03-07 (日)

『幽霊人命救助隊』を読んだ [Book]



[2009-09-19-1] 購入。職場の上司が勧めてくれた本。鬱や自殺について考
えるには良い本。ユーモアもある。ただ、前半のテンポは私には悪く感じ
た。普段長編ばかり読むので、このオムニバス風の話に慣れていないのも
あると思うが。4人のメガホンは読者に向けられていたんだと、最後の方
になって気づいた。作者はとにかく死ぬな死ぬなと、読者にメッセージを
出しつづけている。「未来が定まっていない以上、すべての絶望は勘違い
である」これは確かに名言。

2010-03-06 (土)

IP 電話への移行を検討しました

今ある固定電話は大学に入ったときに契約したのですが、ほとんど使うこ
とはありません。にも関わらず毎月¥1,800も払うのは無駄だと思ったので、
IP 電話への以降を検討しました。

加入することになるサービス


私は @nifty ひかり One T シリーズに加入していました。(今見たら、
2011 年 9 月でサービス終了って書いてある...。)

ひかり One T シリーズの場合、@niftyフォン-C に加入することになるら
しいです。

お得な料金


月額料金は @niftyフォン-C の方が安いです。

月額料金機器レンタル料金
NTT1740円0円
@niftyフォン-C0円525円

川崎〜浜松間の通話料金も、@niftyフォン-C の方が安いです。IP 電話に
すると、かける側もかけられる側も安くなるのですね。
平日 19:00〜23:00 の浜松への通話平日 19:00〜23:00 の浜松からの通話
NTT73.5円 <26秒>73.5円 <26秒>
@niftyフォン-C8.4円 <3分> (全国一律)11.34円 <3分> (全国一律)
国内通話料金|通話料金&国番号表|電話 - NTT コミュニケーションズ
@niftyフォン-C > 料金 : @nifty
固定電話からIP電話(050番号)への通話料金|料金のご案内|電話商品・サービス|NTT東日本 Web116.jp

携帯電話への通話料金も、概ねお得です。
NTT31.5〜42円 <1分>
NTT+003616.8〜18.375円 <1分>
@niftyフォン-C18.9円 <1分>
NTT東日本|固定電話発・携帯電話着0036通話サービス【料金表】
@niftyフォン-C > 料金 : @nifty

デメリット


良いことずくめですが、デメリットもあります。

@niftyフォンで110、118、119などの緊急電話番号へかけられますか。 - @nifty

かけられます。
ただし、その場合は@niftyフォンからの発信ではなく、一般加入電話から
の発信になります。一般加入電話を併用していない場合、かけることがで
きません。


電話番号も変わってしまいます。前回の引越しの履歴を見たら、今使って
いる固定電話番号で登録しているところがかなりありました。手続きが面
倒そうです。

IP電話は今までの電話番号を使い続けることはできますか。 - @nifty

ご利用されるIP電話サービスの種類によって異なります。
(省略)
@niftyフォン @niftyビデオフォン-F
現在ご利用中のNTT加入電話の電話番号は、そのままご利用可能です。
また、050から始まるIP電話用の番号が別途発行されますので2番号で
ご利用いただけます。


どうやら IP 電話と NTT 固定電話は併用することが前提のようです。

あと、停電になるとルータへの電源供給が止まるため、IP 電話は使えませ
ん。NTT 固定電話は使えます。

結論


IP 電話への移行はしません。固定電話を良く使うようになったら、また考
えることにします。

関連情報


通話料無料!? プロバイダのIP電話を活用しよう - AllAbout

追記(2011-01-04):
[2011-01-04-1] のとおり、IP 電話に移行しました。

この記事に言及しているこのブログ内の記事

2010-03-03 (水)

加湿空気清浄機を買いました

[2009-11-03-1] で発生したエコポイントを JCB ギフトカードと交換した
ので、空気清浄機を買うことにしました。

今回もあまり下調べはしませんでした。
たつをさんの記事を鵜呑みにして、SHARP の加湿空気清浄機を買いました。
[を] シャープの加湿空気清浄機を導入しました

SHARP KIREION 加湿空気清浄機 高濃度7000プラズマクラスター技術 加湿13畳/空清21畳 ホワイト系 KC-Y45-W




他のメーカーと比べて、SHARP はデザインが良いですね。

今まで加湿したい時は洗濯物を干していましたが、これからはお手軽に加
湿出来そうです。

元々空気が汚い部屋ではなかったようで、空気清浄の効果は良く分かりま
せん。しかし、買った翌日から朝の目覚めが良くなりました。深く眠れる
ようになったのかもしれません。

この記事に言及しているこのブログ内の記事

2010-03 / 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

最終更新時間: 2017-08-11 21:21

検索
最近の話題
- 2017-08-07
  github-nippou v3.0.0 released
- 2017-08-02
  『サーバーレスシングルページアプリケーション』を読んだ
- 2017-07-10
  emacs-helm の標準添付から外された helm-elscreen を Melpa に追加した
- 2017-07-05
  WEB+DB PRESS Vol.99の「実践Kubernetes」の第4章でつまづいたメモ #wdpress
- 2017-06-29
  Kubernetes Meetup Tokyo #5 に行ってきた #k8sjp
- 2017-06-26
  『プログラマのためのGoogle Cloud Platform入門』を読んだ
- 2017-06-02
  AWS Summit Tokyo 2017 に行ってきた #AWSSummit
最近追記された記事
- 2017-06-02-1 (41日前)
- 2017-04-29-1 (103日前)
- 2017-04-13-1 (117日前)
- 2017-04-13-1 (119日前)
- 2017-03-02-1 (161日前)
- 2017-02-25-1 (166日前)
- 2017-02-21-1 (170日前)
- 2015-06-07-1 (176日前)
- 2016-10-19-1 (185日前)
- 2016-01-01-1 (197日前)
カテゴリ
- Anthy (3)
- Apache (11)
- Apple (1)
- ATOK (4)
- au (3)
- AWS (19)
- Bazaar (1)
- Berkshelf (2)
- BigQuery (1)
- BitBar (3)
- Book (87)
- Boxen (2)
- Bugsnag (1)
- C (26)
- capistrano (4)
- chalow (56)
- ChatWork (1)
- Chef (17)
- Chrome (3)
- Chromecast (1)
- CircleCI (10)
- Comics (2)
- Cooking (10)
- cvs (15)
- cygwin (12)
- D3.js (1)
- Debian (55)
- Docker (3)
- E-mail (8)
- elasticsearch (4)
- Emacs (220)
- Emacs講座 (10)
- English (4)
- feedforce (7)
- fetchmail (3)
- Firefox (20)
- Fluentd (4)
- ftp (1)
- Game (20)
- GCP (1)
- Gem (5)
- Git (9)
- GitHub (17)
- Go (5)
- Google (1)
- gpg (4)
- GrowthForecast (7)
- Health (3)
- Heroku (9)
- Homebrew (10)
- HTML (6)
- iBook (1)
- iPhone (15)
- IRC (1)
- Jenkins (8)
- JS (1)
- Karabiner (1)
- KeySnail (3)
- Kibana (1)
- Kindle (1)
- Kubernetes (2)
- Langrich (7)
- LDAP (6)
- Life (19)
- Linux (6)
- Mackerel (1)
- Mew (18)
- MongoDB (1)
- Mozilla (19)
- Music (1)
- MySQL (1)
- NAS (4)
- nginx (6)
- NHK (1)
- Node (1)
- ntp (4)
- OOP (1)
- OpenID (2)
- openssl (1)
- Opera (2)
- OSX (41)
- Perl (14)
- PHP (19)
- PostgreSQL (1)
- procmail (4)
- Programing (3)
- Puppet (1)
- Python (2)
- Rails (12)
- Rake (2)
- RaspberryPi (1)
- RedHat (29)
- Redmine (3)
- Rspec (1)
- Ruby (50)
- samba (3)
- screen (7)
- sed (5)
- serverspec (6)
- sh (8)
- Slack (2)
- Solaris9 (22)
- Spring (2)
- ssh (4)
- StatusNet (21)
- svn (12)
- Swift (1)
- Tablet (1)
- tdiary (3)
- Twitter (14)
- Twmode (6)
- Ubuntu (5)
- UNIX (102)
- vagrant (8)
- Video (21)
- vim (1)
- Wercker (9)
- Windows (29)
- Wine (3)
- XML (11)
- XP (1)
- zsh (25)
- インストールメモ (33)
- クイックシェイプ (12)
- ネタ (15)
- 勉強会 (15)
- 携帯 (6)
- 正規表現 (4)
過去ログ
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12
2002 : 01 02 03 04 05 06 07 08 09 10 11 12
2001 : 01 02 03 04 05 06 07 08 09 10 11 12
Google+