2008年10月アーカイブ

Text::QRCodeっての作ってみた。まだCPANには上げてない。
#いや、むしろ上げるべきじゃないような。

http://coderepos.org/share/browser/lang/perl/Text-QRCode/trunk

なにができるって、Imager::QRCodeみたいに文字列を渡すとスペースとアスタリスク
の2次元配列のarrayrefを返してくれるだけです。

これだけだと端末では認識しないし、なーんも意味ないんですけどね…。

% perl -MText::QRCode -e '$map = Text::QRCode->new->plot("I love qrcode."); print join "\n", map { join "", @$_ } @$map'
*******   * * *******
*     * * * * *     *
* *** * * **  * *** *
* *** *     * * *** *
* *** * *** * * *** *
*     * ***   *     *
******* * * * *******
        *  **        
** *  **  *   *** ** 
** *** *   ***  ** **
    *** * * * **  ***
  ** *  ** *  ** *  *
* **  *** ****  *    
        *  **  *  *  
******* *   * * **** 
*     *  * *       **
* *** *  ***** *     
* *** * *   *********
* *** *  * *** ***  *
*     * * * ** *     
******* * *   ***  * 

なんかにぽたんいろいろいじってもらってわかったんだけど、
周りに余白がないと端末では読み込めないかもしれない。

追記:
とおもったらにぽたんがこんなことしてました。
これで端末で読めるようになりますね。
余白は必要ということですな。

でもデータ的には余白はなくてもいいような気がするのでとりあえずコードは
このままにしておきます。

追記2:
CPANに上げちゃった。
そのうちインデックスされると思う。

いつもhttp://web.archive.org/のURLを忘れるのでメモ。
ついでに今見てるページのアーカイブが簡単に見られうようにBookmarkletにしておいた。

Web Archive

あたり前だけど検索したら、すでに多くの人が同じことをやっていたけど
覚え書きということで書いておく。

なんかのソース(たしかmod_dosdetector)を読んでてCにtmpnam()ってのがあるのを知りました。

なんの関数なんだろうとman tmpnamで調べたらテンポラリーファイル用の関数でした。
プログラムでテンポラリーのファイルを使う場合の名前をよしなに
決定してくれるものらしく、stdio.hで定義されています。
使い方は↓こんな感じにするとs[]にファイル名が入るみたい。
#include <stdio.h>

int main()
{
    char s[L_tmpnam+1];
    tmpnam(s);
    printf("%s\n", s);
    return 0;
}

ためしに実行してみると、
% gcc ./tmpnam_test.c
% ./a.out
/var/tmp/tmp.0.GYj9KF

こんな感じ。あーなんかこのファイル名どこかで見たことあるような…。

上のコードのL_tmpnamってのを配列の大きさにつかってるんだけど、
これもstdio.hに定義されています(Mac OS XやFreeBSDの場合はstdio.h、
CentOSだとbits/stdio_lim.hに定義されていました)。
Mac OS Xだとパスの最大長と同じバイトになってました。


ちなみにCentOSでtmpnam()を使おうとしたら、
% gcc tmpnam_test.c
/tmp/ccwelnuR.o(.text+0x24): In function `main':
: warning: the use of `tmpnam' is dangerous, better use `mkstemp'

って怒られた。デンジャラスだってぇえぇえぇ!

mkstemp()を使えと言ってるので調べてみたら、これも同じような用途に使う関数らしい。 manによると以下のような感じで使うらしい。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char template[] = "/tmp/fileXXXXXX";
    int fd;
    FILE *fp;

    fd = mkstemp(template);

    if ((fp = fdopen(fd, "w")) == NULL)
        exit(1);

    fprintf(fp, "temp test\n");
    fclose(fp);
    return 0;
}

こうすると「temp test」って内容の/tmp/fileXXXXXX(XXXXXXは毎回違う)という
ファイルが作成されるようだ。

なるほど。
なんかのときに使えそうなので覚えておこう。

検索

広告

OpenID対応しています OpenIDについて
Powered by Movable Type 4.22-ja