mojavy.com

C言語の文字列初期化について

January 21, 2013 at 08:00 PM | categories: C, programming |

なんとなく気になったので以下ひとりごと。


Cで文字列を初期化するときは以下のように書く。

char str[] = "xyz";

こう書けばNULL終わりのchar配列としてスタックに格納してくれるので、以下のように書くのと同じことになる。

char str1[4] = "xyz";
char str2[4] = {'x', 'y', 'z', '\0'};

文字列はcharのポインタで扱うからといって、

char *str = "xyz";

のように書くと違う意味になる。 こう書くと"xyz"が格納されているアドレスでポインタを初期化する。文字列リテラルで宣言したデータが格納される領域は通常はread onlyなので*str='X'などとするとセグフォするが、通常の代入と同じ意味なので違和感はない。

でも、char str[] = "xyz"; のほうはは冷静に考えると気持ち悪い。初期化と代入は違うといってしまえばそれまでだけど、この式だけみても予備知識がないとなにがおこるのかわからないと思う。

以下のような挙動も合理的とは思えない。そもそもCに配列なんて必要なかったのではないか。

void f1(char s[]) {
    /* 意味はないけどエラーでもない */
    s = "baz";
}

void f2(void) {
    char s[] = "foo";
    /* これはエラー */
    /* s = "bar"; */
}

などということを今更ながら考えて悶々としていたのだけど、結局のところこういう類の便利機能は欲しくなってくるわけで、便利さのために不合理を許容するとなるとこのあたりが妥当な落とし所のような気もしてきた。

まとめ:プログラミング言語を考える人はすごい



tmuxでalcの英単語を引く

January 11, 2013 at 10:00 PM | categories: ruby, tmux, english |

english

2013-01-15追記 規約違反とのコメント頂いたのでスクレイピングするスクリプトを削除しました。

tmuxのcommand-promptを使うと任意のコマンドをインタラクティブに実行できます。 これをつかってtmux上でalcの英単語を表示できるようにしたら思いの外便利だったので紹介します。

まず、alcの検索結果をスクレイビングしていい感じに表示するコマンドをつくります。 rubyのnokogiriとrainbowに依存してますが、ぼくがつくった適当なスクリプトでよければこれを使って下さい。

# 2013-01-15 削除しました

これをパスの通った場所にalcという名前で保存して、.tmux.confに以下の設定を追記します。

unbind C-a
bind C-a command-prompt "split-window -h 'alc %% | lv -c'"

C-aにバインドしてますがお好みのキーに変えてください。 rainbowで色付けしてるのでエスケープシーケンスを解釈できるpagerをつかって下さい。

これで.tmux.confをリロードして、prefix-key C-a とかするとtmux上にプロンプトが表示されるので、そこで調べたい単語を入力します。 そうすると新しいpaneに結果が表示されます。pagerを閉じると自動的にpaneも閉じます。



yaml-modeを拡張してyamlを高速に編集する

January 09, 2013 at 10:00 PM | categories: elisp, emacs |

emacs

とあるプロジェクトで巨大なyamlを編集しなければならない時があるのですが、素のyaml-modeだけだと非力に感じたので拡張するためのemacs lispを書きました。

といっても、現状ではブロック単位で移動する関数を適当にyaml-mode-mapにバインドしているだけの単純なものです。

使い方は、https://github.com/taksatou/yaml-mode-extからおとしてきてloadするだけです。 (yaml-modeはあらかじめインストールしておく必要があります)

(load-file "path/to/yaml-mode-ext.el")

以下のキーバインドが使えます。

  • M-C-f 同じ階層の次のブロックへ移動
  • M-C-b 同じ階層の前のブロックへ移動
  • M-C-u 親ブロックの先頭へ移動
  • M-C-e 親ブロックの末尾へ移動
  • M-C-d 直下の子ブロックへ移動

当初はyaml-modeをhideshow.elに対応させようと思ってたのですが、ブロック単位で移動ができるようになったところで満足してしまいました。

なお、ブロックの境界はインデントレベルだけをみて判定しているのでyamlに限定する必要はなかった気はしますが、pythonとかhaskellとかでもつかいたくなってきたら書き直そうと思います。



おやつの時間をお知らせしてくれるUnixコマンド:at teatime (他...)

January 08, 2013 at 08:30 PM | categories: unix, tips, linux |

banana

Favorite Linux Commands(http://clippy.in/b/YJLM9W) で紹介されてたコマンドのうち知らなかったものをメモ。

at

入力されたコマンドを指定されたタイミングで実行するようにスケジュールする。 cronに登録するほどでもない単発のコマンドを実行したいときとかにつかう。 時間の指定には現在の時刻からの経過時間や絶対時間の他にteatimeやmidnightといった文字列もつかえる。 ちなみにteatimeは午後4時。 出力先を指定しなければコマンドの出力はcronと同じようにメールにとぶ。$TTYにリダイレクトしてやればコマンドを実行した端末に表示させることもできる。

echo "echo おやつの時間です > $TTY"| at teatime
echo "echo はろー > $TTY" | at now + 3 minute

mtr

tracerouteとpingをあわせたようなもの。tracerouteより表示がみやすい。 ネットワークのどこで時間がかかってるのか一目でわかる。

mtr mojavy.com

column

入力テキストをいい感じのカラム表示にフォーマットしてくれる。 縦に長い出力するコマンドとか、そのままだと出力がみづらいときとかにつかう。

gem list | column
mount | column -t
grep -v '^#' /etc/apt/sources.list | column -t

reset

端末をリセットする。 うっかりバイナリファイルをcatとかしてしまって端末が壊れてしまった場合に端末を閉じずに復帰できる。

sshfs

ssh経由でリモートのファイルシステムをマウントできる。

sshfs name@server:/path/to/dir /path/to/mount/point
fusermount -u /path/to/mount/point  # unmount

その他

以下はコマンド自体の機能ではないけど覚えておくと便利かもしれないもの

curl ifconfig.me

ifconfig.meというサイトがある。自分のグローバルIPがわかる。

dig +short txt .wp.dg.cx

dnsクエリでwikipediaのエントリーがみれる。

$ dig +short txt banana.wp.dg.cx
"Banana is the common name for herbaceous plants of the genus Musa and for the fruit they produce. It is one of the oldest cultivated plants. They are native to tropical South and Southeast Asia, and are likely to have been first domesticated in Papua New " "Guinea. Today, they are cultivated throughout the tropics. They are grown in at least 107 countries, primarily for their... http://en.wikipedia.org/wiki/Banana"


2012年の振り返りと2013年の抱負

January 08, 2013 at 12:30 AM | categories: others |

tool

早いもので1月も8日に突入してしまいましたが、2012年の振り返りと今年の抱負について書いておこうと思います。

2012年にやったことのうち思いだせる範囲かつ主観的にみてそれなりにやった感のあるものを列挙してみます。

  • Androidアプリ開発
  • iOSアプリ開発
  • Unityゲーム開発
  • Common Lisp
  • Phonegap (Cordova)
  • Hadoop
  • HBase
  • Symfony
  • FuelPHP
  • Jenkins
  • Gearman

こうしてならべてみると色々やった年でした。今年だけでC#, Objective-C, Common Lispの3つの言語を新たに使えるようになったし、新しいものを多くやったという意味ではよかったです。 ただ、長い目で見て有用なスキルが身に付いたかというとそうでもない気がします。技術的に深く掘り下げたものがあまりなかったのも残念です。

また、転職や引越しがあったり、自炊をするようになったり、持ってた本をほぼ全部bookscanで電子書籍化したり、とプライベートの生活はそれなりに変化がありました。

今後やりたいことは色々ありますが、もろもろ短かくまとめて

  • 心身を鍛える
  • たくさん遊ぶ

というのを2013年の抱負としてやっていこうかと思ってます。

今年もよろしくお願いします。



About Me

pic
mojavy

Recent posts






Categories



Badges