Linuxにおいて大体何かを組んでいると一時的に何かに保存したいとかメモリ食べたくないとか様々な理由で一時的なファイルを作成すると思います。一時的なファイルを作成すること自体はそこまで難しくなく/tmp/以下に好きな前をつけて扱えばいいと思うのですが、好きに/tmp以下にファイルを作るのは複数プロセスが立ち上がった場合に同一ファイルを意図せず見てしまう、他のプログラムが同一の名前を意図せず使用してしまう、セキュリティホールなどになってしまう(see man tempnam)などの危険性があります。頑張ればこれらの問題はファイルオープン時におけるオプションのO_EXCL(see man open)とファイル名生成の工夫で大体は解決つくはずですが、これを頑張らなくてやってくれる仕組みがtmpfileです。読み書き用で開いてO_EXCLで他のプロセスが同じ名前で開くことを防ぎます。おまけにオープ
たまたま、goで書かれた物をperlへ移植しようとしていたらsplitの挙動の差が出てきまして、他の言語の場合どうなるんだろうとぱっと思いついた言語で実行して見ました。以下の文字列を言語標準でついている文字列のsplitを実行した結果となります。 "/path/to/hoge/" 言語 結果 perl(5.12) ['','path','to','hoge'] golang(1.5) ["" "path" "to" "hoge" ""] ruby(2.1) ["", "path", "to", "hoge"] ptyhon(2.7.8) ['', 'path', 'to', 'hoge', ''] js [ '', 'path', 'to', 'hoge', '' ] perl6 ("", "path", "to", "hoge", "") # (perl6-m -e 'say "/pat
https://metacpan.org/release/SYOHEX/Mouse-v2.4.4 Mouse with threads did not work on Perl 5.22.0 or higher version. This makes Text::Xslate test failure for a long time. This version fixed the issue and works with threads. Please upgrade for newer perl users. Example We expects $foo->syntax is "Kolon" but $foo->syntax is undef with older Mouse on Perl 5.22.0 or higher. This test is passed with Mous
Linuxでddで1GBのファイルを作成し perf でプロファイリングし、Flame Graph (炎のグラフ?)にして可視化したものです。 Flame Graphs は perf(Linux)、SystemTap(Linux)、DTrace(Solaris、Oracle Linux(UEK)、Mac OS X、FreeBSD)、XPerf.exe(Windows) などでのプロファイリング結果を可視化して最も使われているコードパスを早く正確に特定することができます。実体はプロファイリング結果をグラフ(SVG)に変換する Perl スクリプトです。 下から上に行くほどコールスタックが深く、左から関数名のアルファベット順でソートされています。一番上で横幅が広い関数がCPUを長く使っています。今回は "_aesni_enc1" つまり暗号化がボトルネックになっていることがわかります。 システ
Perl 書いてりゃ Test::More でテスト書きまくると思うのですが、Test::More っていうか、まあ別に Test::More だけがそうというわけでもないのですが、テストこけたときのケアが十分じゃないなと思うときがけっこうあります。 開発過程で書いてるコードというのは、いつもいつも確信を持って書いているわけではないわけで、それでなくてもうっかり間違うときもあり、せっかくテスト書いているのに何だかよくわからない理由でこけてパスできなくて時間を浪費してしまったりが日常になってたりしませんか? そういうのを繰り返しているとやがてテスト嫌いになりテスト書かなくなって本番コードにデバッグコードが入り乱れ、リファクタもどんどん不可能になって小回り効かないままプロジェクトが失敗して彼女に振られてしまうわけですね。困ります。 note diag explain Test::More には
URI::QueryParam - Additional query methods for URIshttps://metacpan.org/pod/URI::QueryParam perlにはURI::QueryParamというモジュールがありまして、URIモジュールだけだと 届かない痒いところに手が届くことをしてくれるモジュールです。 例えば、uriから特定のパラメータだけを削りたいとかそういう場合 URIだけだと面倒なんですが、URI::QueryParamがあれば割と簡単に消せます。 # uri_query.pl use strict; use warnings; use URI; use URI::QueryParam; my $uri = URI->new('http://google.com/'); $uri->query_form( a => 1 ); warn $uri
こんにちは、週末海でマンボウを獲っていたらラギアクルスに襲われた@hirataraです。今回はPerl Data Languageについて紹介します。 Perl Data LanguageとはMATLABやNumpy、Rなどと同様に、多次元配列を効率よく扱って数値計算を実現するためのライブラリです。cpanmで普通にインストールすれば使えますが、グラフを描画したり本格的な数値計算のライブラリであるGSLのバインディングを利用したりする場合はhomebrewでゴニョゴニョしたりする必要があるので、多少頑張って下さい。 基本的にはpdl関数でオブジェクトに変更してから使います。 use PDL; my $pdl = pdl [[1, 0, 0], [0, 1, 0], [0, 0, 1]]; print $pdl; 【実行結果】 [ [1 0 0] [0 1 0] [0 0 1] ] pdlが
File::Temp を使っていると、表題のようなエラーが発生することがある。 これは一件すると、ファイルを開く処理が失敗した用に見えて、ファイル開き過ぎとかかなあと思うんだけど、実際はそういうことではないようだ。 File::Temp の実装はこのへんになっていて、要するに EEXIST が発生した場合に 1000 回ファイル名を変えてリトライして、その結果としてダメだったというときにいい感じにあがる例外である。 https://github.com/Perl-Toolchain-Gang/File-Temp/blob/master/lib/File/Temp.pm#L602 ここを見れば分かる通り、EEXIST の時だけしか次のループにいかないので、OS 的な問題ではない。 https://github.com/Perl-Toolchain-Gang/File-Temp/blob/ma
必要最小限でvimでのperl開発(utf8)するのにどんな設定渡したらいいかなと考えてまとめてみました。 多分これでいけそうな気がしてる。(要検証)これを作成した過程で不要な設定などいくつか自分の環境における不要な設定が発見できたのはよかった。 代表的な物は以下の2つかな。 termencoding nocompatible see Vim - set nocompatibleはもういらない - Qiita fileencodingとfencの関係がいまいちよく分からないので後で調べます。 .vimrc "must set expandtab set shiftwidth=4 set shiftround set autoindent set fileencoding=utf-8 set fileencodings=utf-8 set encoding=utf-8 set fenc=ut
This document discusses Perl testing libraries and frameworks. It provides an overview of the history of Perl testing including Test::More and Test::Class. It also introduces some newer testing libraries like Test::Pretty, Test::Ika, and Test::Kantan that aim to improve on Test::Builder and provide additional features like BDD-style testing and improved output. The document encourages trying out t
現状、本稿ははげしくかきかけです。フィードバックをおまちしております。 はじめに† Perl で C の拡張がスラスラと書けたら……。C の拡張がスラスラ書けたら、ネイティブのバインディングもスラスラ書けるし、ホットスポットを C で最適化するなんてこともお手の物。書けたらいいけど、XS ってなんかむずかしそう……。 ちがうんです! 今までの XS の教え方がまちがっていたんです!この教材をつかえば、誰でも簡単に今すぐに XS を書けるようになるんです。Perl の C 拡張を書いて同僚や上司を アッー! と言わせちゃおう! この教材では XS のややこしい機能をつかわずに、Perl の C 拡張を書く方法を伝授!初心者でもすぐに C 拡張が書けるようになるぞ! 前提知識† 本稿では一般的な C の知識および Perl の知識を読者がもっていることを想定しています。XS の知識や Perl
いくつか方法があるが、それぞれ試してみる。 条件 open 非圧縮ファイル読み込み open zcat(gzip -cd) 標準出力読み込み IO::File zcat(gzip -cd) 標準出力読み込み Compress::Zlib サンプルファイル 内容 CSVファイル 行数 6309行 sample.csv 1661636 bytes (1.6M bytes) sample.csv.gz 196774 bytes (193K bytes) 環境 OS Debian GNU/Linux 4.0 (coLinux 0.7.1) Perl v5.8.8 メモリ 512MB/2048MB (coLinux割り当て/全体) PC HP ProLiant ML115 (Windows XP) 使うモジュール Compress-Zlib 2.008 http://search.cpan.org/
今日、メモリ開放周りで詰まったので覚書。 100M程度のデータを変数に入れてゴリゴリやる際に スコープから外れたのに開放されねーよ、という事態に陥ったので。 メモリ使用量はpsなりタスクマネージャなりで確認した。 create_scar(); sleep; sub create_scar { my $scar; $scar .= " " for ( 1.. 1000000 ); } 例えば、↑だとメモリ食いっぱなし sub create_scar { my $scar; $scar .= " " for ( 1.. 1000000 ); undef $scar; } ↑undefすれば開放。あたりまえか。 create_scar(); create_scar(); sleep; sub create_scar { my $scar; $scar .= " " for ( 1.. 10000
Perlで大規模な処理をしたときに、メモリに気を使わないといけないことがあって、メモリの開放について調べたときに、以下のページを見て、スコープ外れただけではメモリ開放されないことを知ったので、自分でも試してみた。 http://skitai.blog98.fc2.com/blog-entry-49.html メモリ使用量の確認には Devel::MemUsed を利用。昔はcpanにあったぽいけど、今はないようなので、https://github.com/jozef/devel-memused からcloneして使う use v5.14; use strict; use warnings; use lib glob "modules/*/lib"; use Devel::MemUsed; my $mem_used = Devel::MemUsed->new; $mem_used->rese
拡大 ここのところずっとAndroidアプリプログラミングの勉強ばかりやっててちょっとお疲れモード。何気なく机の引出を開けるとそこには紙が黄色く変色したプログラミングPerlの初版が…。なつかしいな。ということで、気分転換にperlスクリプトの開発環境でも整備してみるかな、と思い立ちました。 perlスクリプトをまともにさわるのは…10数年ぶりですね(笑)。文法もほとんど覚えてない…。軽く調べてみると、あれからperlもえらいかわってるようです。よく使っていたのはクラスの概念なんてなかった頃かな。 Windows環境なので、ActivePerlをインストールしたら開発環境の構築はおしまい、以上…。 なのですが、それじゃぁつまらないのでEclipse上でPerlスクリプトの編集、デバッグができるようにしてみます。 拡大 Eclipse上でPerlスクリプトを編集できるようにするために、EPI
StarletやStarmanと組み合わせてよく使われているServer::Starterですが、普段気にしないような部分を読む機会があったのでメモ。 Server::Starterは --port (TCP) や --path (Unix Domain Socket) を渡すとこれでlisten(2)して起動するworkerに引き渡してくれる。 これはfork(2)とexec(2)によってファイルディスクリプタを引き継ぐことにより実現されているが、ファイルディスクリプタそのものをどのように引き渡しているのか、という問題。 exec(2)により実行バイナリは差し換わってしまうので、プログラム中の変数により引き継ぐことはできない。 Server::Starterではこれを環境変数SERVER_STARTER_PORTにより実現している。 おおよそ以下のような感じ。 FD = integer
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く