DBIx::Class::AsFdatのvalueがundefなのを表示したくない

DBIx::Class + Catalyst::View::JSON(2) - ヒルズで働く@robarioの技ログを使ってDBICのハンドルをJSON化だやったーなんて言っていて、その後DBIx::Class::AsFdatを知ってちょっと感動したりしたんですけど、as_fdat()で戻って来た値で、selectしていない値がundefで入っててイヤンな感じなのでそれをなんとかした?のをちょっと書いた。DBのcolumnがmogeとhogeって言うのがあったとしてselect moge from tableってやると、{moge=>'value', hoge => undef}みたいな感じになってしまうのを{moge => 'value'}みたいにしたい。

package DBIx::Class::SelectedColAsFdat;
use strict;
use warnings;
use base 'DBIx::Class';

our $VERSION = 0.01; 

sub as_fdat {
    my $self = shift;
    my $data = $self->{_column_data};
    my $ret;

    for my $col (keys %$data)   {
        $ret->{$col} = $self->$col;
    }

    return $ret;
}

1;

ほぼそのままですがな。


スキーマに問い合わせて、全てのcolumnをforで回してるのでundefが入る模様なので、selectされた項目だけを取り出してやろうと思ったけどdumpしたらそのままな内部データがあったのであとはdeflateした。書きながら思ったけどこれrelationあったら動かないんじゃね?とか、remove_columnでcolumn消せば良いんじゃね、とか、もしかしてDBICCatalystにこんな機能あるんじゃね?思ったけどそれはそのとき考える。

MacbookでMySQLのperl bindingが入らない件

三週間くらい前に半ば無理矢理Macbook買いました。地元帰ったときにふとヨドバシ行ったらApple Store+学割より一万円近く安かったので親にお金借りて買っちゃいました。ポイントついてしかもメモリ同時購入キャンペーンやってたらしいんで結局Macbook黒+メモリ2Gで17万くらいでした。新説、家電は地方のが安いんじゃないか説。


ま、そんなことはどうでもいいとしてコストパフォーマンスもいいし、「いいものを持っている感」がとてもあるので幸せな感じです。肝心の中身も最初は戸惑いましたがなれちゃえばなんてことはないです。でもscreenとFirefox行き来するのに、Ctrlとりんごキー駆使するのに未だに慣れません。


感想はこれくらいにしておいて。


もうメインマシンのWindowsマシンを放置して使うくらいになったのでもう開発環境ガシガシ入れる訳です。もろん卒業制作があるんでCatalystも。

で、なぜかDBD::mysqlが入らないんです。4.005です。force installしたんですけど使うスクリプトでエラーが出て落ちる。しばらく、ぐぐる先生に聞いてたんですけどバージョン違ってたり何でか動かなかったり。。


DBD::myql install | Parse Error


症状が同じページを発見。
で、ここのページの最後に書いてある「ライブラリ一式コピーやってみたら動いた」、やってみたら動きました!(なんだそれ)

要するに

cd /usr/local/mysql/lib/
sudo mkdir mysql
sudo cp * mysql

たぶんmakeでうまく引数渡してやればいいんでしょうけれども、まぁHDとかそんなにシビアじゃないし動いてるからこれでいいでしょう。

玄箱でsshがつながらない件を解決する、もといした。

これは壮絶な罠なヤカン。

930 859 sage04/11/25 11:38:02
>>927
colinux:~# chmod go+w /dev/tty
colinux:~# ls -l /dev/tty
crw-rw-rw- 1 root root 5, 0 Nov 25 11:34 /dev/tty
colinux:~#

うわあ、これでうまく行きました。
ホント、ありがとうございました、皆様。

この辺、まったく触ってない、っていうかDebianの素のイメージでも
同じでした。
後学のためにお教え下さい。
なぜ僕の環境のみこんなことになってたのでしょうか。




931名無しさん@お腹いっぱい。sage04/11/25 12:28:50
うひゃ。/dev/ttyがo-wになっていたのか…。この手の症状はほんと原因がつかみ
にくいなぁ。

ちなみに、Debian標準では当然ながら
crw-rw-rw- 1 root tty 5, 0 Nov 18 13:21 /dev/tty
とかいう感じのパーミッション& UID & GIDです




935名無しさん@お腹いっぱい。sage04/11/25 21:27:27
>>934
coLinux のサイトで公開されてる Debian のイメージを作った人が間違ったの
ではないかと。umask 22 のまま、tar で p をつけずにコピーしたものと思わ
れる

つまりは

chmod go+w /dev/tty

colinuxでも似たような症状があったのね。
sshつながらなくて泣きそうだったけどやっとコレで解決。

Web::Scraper使ってみた。

というわけです。

#!/usr/bin/perl

use Web::Scraper;
use URI;


my $t = scraper	{
			process '//table[@summary="upinfo"]//tr',
			
			'columns[]' => 	scraper {
								process '//td[2]', file_name	=> 'TEXT';
								process '//td[3]', comment		=> 'TEXT';
								process '//td[4]', file_size	=> 'TEXT';
								process '//td[5]', date			=> 'TEXT';
								process '//td[6]', mime			=> 'TEXT';
	
								result qw/file_name comment file_size date mime/;
							};

			result qw/columns/;
		};

use YAML;
	
warn YAML::Dump( $t->scrape( URI->new('http://rozeen.rdy.jp/cgi/up1r/') ) );

これでファイルの情報一覧みたいなのが返ってくる。いいね!短いきれい!!やっぱりmiyagawaさんすげぇ!!!


もといこのページLDRize入れてたらPagerizeが効いてびっくりした。microformatsなのかなSITEINFO書いたのかな。

壮絶に日付がずれていたので

昨日あたりに玄箱で鯖設置して運用しだしたんですけど、ふと見るとかなり昔を指してるのに気が付きました。svn単体だったらまだいいんですけど時計を直したらtracのtimelineが見えなくなっちゃったんでレスキュー。

while (<>)  {
    if ( /^2007/ )  {
        s/2007-07-(\d+)T/sprintf '2007-09-%02dT', $1 - 5/e;
    }
    print $_;
}

約二ヶ月ずれてたのね。適当に置き換えるスクリプト@dt.pl。名前はDateTimeを使おうと思った名残 :-)

sudo svnadmin dump /var/svn/socks 2>/dev/null | perl dt.pl > dumped.txt  

とりあえずdumped.txtにはいてみる。


あとは

svnadmin create repos
svnadmin load repos < dumped.txt

sudo mv repos /var/svn
cd /var/svn
sudo chown www-data:www-data repos -R

dump&loadしたら権限も忘れずに。

で、完了。ちゃんと元に戻った。あとはtrac

sudo trac-admin /var/trac/repos resync

resyncすればtracのデータとも調合が取れる。よしよし。

svnadmin dumpで吐いてフィルタしてsvnadmin loadで読めば日付は直せそうですね。コミットメッセージとかはLengthとはあるみたいなんでめんどくさそうですけど。まぁどっちにしろIllegalだな、これ。時計はちゃんと合わせましょうね、と。

玄箱でscreenが使えない

少人数だから鯖を玄箱で運用しようかと思いいろいろ試したけどscreenだけが動かない!!!

GNU screenの”No more PTYs” - ksaitoの日記
bne.jp

ここらを参考したりしましたけど動かない!なんで!rootだと動くから権限の問題だとは思うけどもういじくりまわしすぎてわからない。


なんでなんでばっかり言ってるのも何なので関係しそうなもの全部貼ってみる。ちなみにsushi-kさんのdebian化してあります。

agile@socks:~$ ls -l /usr/bin/screen
-rwxr-sr-x 1 root utmp 305416 Mar  5 17:53 /usr/bin/screen




agile@socks:~$ ls -lR /var/run/screen/
/var/run/screen/:
total 2
drwx------ 2 agile agile 1024 Jul  7 23:06 S-agile
drwx------ 2 root  root  1024 Jul  7 22:58 S-root

/var/run/screen/S-agile:
total 0
ls: /var/run/screen/S-root: Permission denied




agile@socks:~$ sudo cat /etc/fstab
# UNCONFIGURED FSTAB FOR BASE SYSTEM
proc            /proc           proc    defaults        0       0
sysfs           /sys            sysfs   defaults        0       0
devpts          /dev/pts        devpts  gid=5,mode=620  0       0
#none           /dev/shm        tempfs  defaults        0       0
/dev/sda2       /               ext3    defaults        1       1
/dev/sda3       swap            swap    defaults        0       0
/dev/sda1       /boot           ext3    defaults        1       1





agile@socks:~$ id
uid=1001(agile) gid=1001(agile) groups=1001(agile)

agile@socks:~$


追記:コメントいただいたようなので。

Sorry, could not find a PTY. と味気ないメッセージ出して終了します。でもsudoしてみると動いたりするのでpermissionの問題なのかな。
外で使ってるやつはソースコードからコンパイルしたら動いたのでどうなんでしょ。

初めてグリモン書いてみたよ!

TracWikiで書類管理したいなぁと思って先生他いろいろの承認用のハンコ押すとこがほしいなと思いちょこちょこっとuser scriptを初めて書いてみた。やっぱこういうちょこっと直すのってHackっぽくていいね!

恥ずかしくてたまらないけどとりあえずさらす。晒して成長するメソッド。

// ==UserScript==
// @name         AddStampPlace
// @namespace    http://d.datena.ne.jp/agile/
// @description  Adding stamp place to Trac Wiki
// ==/UserScript==

$X = function (exp, context) {
    if (!context) context = document;
    var resolver = function (prefix) {
        var o = document.createNSResolver(context)(prefix);
        return o ? o : (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
    }
    var exp = document.createExpression(exp, resolver);
    
    var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
    switch (result.resultType) {
        case XPathResult.STRING_TYPE : return result.stringValue;
        case XPathResult.NUMBER_TYPE : return result.numberValue;
        case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
        case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
            result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
            var ret = [];
            for (var i = 0, len = result.snapshotLength; i < len ; i++) {
                ret.push(result.snapshotItem(i));
            }
            return ret;
        }
    }
    return null;
}



last_rev	= $X("//ul/li[@class='last']")[2].innerHTML.match(/version=(\d+)/)[1];
head_img	= document.createElement("div");
elem		= document.getElementById("content");
head_img.style.textAlign = "right";
head_img.innerHTML = "<img src='http://www.google.co.jp/intl/ja_jp/images/logo.gif'><br>revision " + last_rev; 

elem.insertBefore(head_img, elem.childNodes[0]);

cho45さんの$Xとかめっさインラインで貼ってるし。後で直す。

とりあえずハンコ押すところはイメージを張る感じで。今はないからGoogleのロゴ。
ついでにリビジョンも表示したいと思ってソースを軽く見てたら右上メニューの「LastChange」のパラメータにリビジョン入ってるっぽかったから抜き出してみた。

無名名前空間使えとか動くドメイン制限しろとかあるいはスクリプト側でTracかどうか調べろよとか言う突っ込みは無しの方向で。後で直す。