No Driver error in TheSchwartz

14 December 2007


generally that's something in Data::ObjectDriver::Driver::DBI

u need configure your dsn as "dbi:mysql:database=theschwartz;host=mysql.foorumbbs.com;port=3306"
but not "DBI:mysql:database=theschwartz;host=mysql.foorumbbs.com;port=3306".

since
        if (my $dsn = $driver->dsn) {
($type) = $dsn =~ /^dbi:(\w*)/;
in Data::ObjectDriver::Driver::DBI

JFYI.

Dreamhost Catalyst

14 December 2007


It's a best Catalyst Calendar ever for Dreamhost:

local::lib and Catalyst

jQuery and browser time zone

10 December 2007


generally everyone has a browser time zone.
var timezoneOffset = -(new Date().getTimezoneOffset());
like mime is 480.

I want add a simple class="date" to time span, then it will add time zone automatically. (MySQL DateTime format for now. I'll use it in my Foorum)

it's a sample html: http://www.fayland.org/jQuery/dateTimeZone.html

it will convert <span class='date'>2007-11-05 12:20:30</span> to 2007-11-05 20:20:30 in my browser.
$(function() {
// follows are copied from datePicker/date.js
// utility method
var _zeroPad = function(num) {
var s = '0'+num;
return s.substring(s.length-2)
//return ('0'+num).substring(-2); // doesn't work on IE :(
};

$(".date").each(function (i) {
var s = $(this).text();
var f = this.id; //format
if (! f) {
f = 'yyyy-mm-dd hh:ii:ss';
}

var d = new Date(1997, 1, 1, 1, 1, 1);
var iY = f.indexOf('yyyy');
if (iY > -1) {
d.setFullYear(Number(s.substr(iY, 4)));
}
var iM = f.indexOf('mm');
if (iM > -1) {
d.setMonth(Number(s.substr(f.indexOf('mm'), 2)) - 1);
}
d.setDate(Number(s.substr(f.indexOf('dd'), 2)));
d.setHours(Number(s.substr(f.indexOf('hh'), 2)));
d.setMinutes(Number(s.substr(f.indexOf('ii'), 2)));
d.setSeconds(Number(s.substr(f.indexOf('ss'), 2)));

var timezoneOffset = -(new Date().getTimezoneOffset());
d.setMinutes(d.getMinutes() + timezoneOffset);

var t = f
.split('yyyy').join(d.getFullYear())
.split('mm').join(_zeroPad(d.getMonth()+1))
.split('dd').join(_zeroPad(d.getDate()))
.split('hh').join(_zeroPad(d.getHours()))
.split('ii').join(_zeroPad(d.getMinutes()))
.split('ss').join(_zeroPad(d.getSeconds()))
;

$(this).text(t);
} );
});


Enjoy!

Foorum 0.08

09 December 2007


The last version of this year. I'll push out a 0.1.0 on next month next year.

http://foorum.googlecode.com/files/Foorum-0.08.tar.gz

Changes:
0.08 Sun Dec 9 16:30:30 2007
- I18N encoding fix
- use the lastest Catalyst::Plugin::Authentication (Store::FromSub::Hash)
- use jQuery flot to do daily chart
- bin/setup.pl
- RSS text fix
- lots of changes are missed.

check out your code from
svn checkout http://foorum.googlecode.com/svn/trunk/ Foorum


have fun! welcome to join us to make a new Catalyst based forum app - Foorum.

jQuery Flot For Daily Chart in Foorum

08 December 2007


I know Google just release his Chart days ago. it's powerful, more than jQuery flot.

but I still want to use flot because it's simpler. yet badly it's not supporting day as its X. like 20071131 is next to 20071201, not far away as treated in flot.

Foorum has a feature that it will record the count of some tables every day. we have a table named 'stat', and columns are "stat_id", "stat_key", "stat_value", "date". so somehow we would have something like
20071201 user_counts 510
20071202 user_counts 640
then go on.
we use a cron script to collect those data.

data is not so straight for human being. we need CHART.
so I just make vars from stat table like:
stats => {
user_counts => {
20071201 => 510,
20071202 => 640,
20071203 => ...

then we use a TT file to create a HTML file.
$(function () {

[% i = 0 %]
[% FOREACH ctype IN stats.keys %]

$('body').append("<h2>[% ctype %]</h2><div class='placeholder' id='placeholder[% i %]' style='height:300px;'></div>");

var d[% i %] = [];

[% FOREACH key IN stats.${ctype}.keys.sort %]

d[% i %].push([[% key %], [% stats.${ctype}.$key %]]);

[% END %]

$.plot($("#placeholder[% i %]"), [
{
data: d[% i %],
lines: { show: true },
points: { show: true }
}
]);
[% i = i + 1 %]
[% END %]
});


more details @
http://fayland.googlecode.com/svn/trunk/Foorum/lib/Foorum/TheSchwartz/Worker/DailyChart.pm
http://fayland.googlecode.com/svn/trunk/Foorum/templates/stats/chart.html

@Enjoy;

C::A::S::FromSub::Hash

07 December 2007


I just release a new CPAN module for Catalyst - Catalyst::Authentication::Store::FromSub::Hash.

Generally I always hate one situation that http://search.cpan.org/perldoc?Catalyst::Authentication::Store::DBIx::Class hits database every request. to ease database, I create one cache layout between Authentication and database.

In my Foorum,
Foorum.pm
use Catalyst qw/Authentication ../;

foorum.yml
authentication:
default_realm: 'members'
realms:
members:
credential:
class: 'Password'
password_field: 'password'
password_type: "hashed"
password_hash_type: "SHA-1"
store:
class: 'FromSub::Hash'
model_class: "UserAuth"

In this config, we use store "FromSub::Hash" and model_class "UserAuth". so we need create a Foorum::Model::UserAuth:
package Foorum::Model::UserAuth;
use base 'Catalyst::Model';

sub auth {
my ($self, $c, $userinfo) = @_;

my $where;
if (exists $userinfo->{user_id}) {
$where = { user_id => $userinfo->{user_id} };
} elsif (exists $userinfo->{username}) {
$where = { username => $userinfo->{username} };
} else { return; }

my $user = $c->model('User')->get( $c, $where );
return $user;
}

$c->model('User')->get($c, $where); has built-in cache layout. and it return hash from/to cache.

I guess I would create another module - Catalyst::Authentication::Store::FromSub::Object later.
but since I don't use it, I'm not sure when will it kick out.

@Enjoy!

Catalyst Advent Calendar 2007

03 December 2007



Email::Send::SMTP::TLS

28 November 2007


I wrote a new CPAN module Email::Send::SMTP::TLS.
it can use Gmail smtp.gmail.com to send email, and it runs well under Win32.

I tried Email::Send::Gmail, but it's not working in my computer at all.

example:

use Email::Send;

my $mailer = Email::Send->new( {
mailer => 'SMTP::TLS',
mailer_args => [
Host => 'smtp.gmail.com',
Port => 587,
User => [email protected]',
Password => 'password',
Hello => 'fayland.org',
]
} );

use Email::Simple::Creator; # or other Email::
my $email = Email::Simple->create(
header => [
From => [email protected]',
To => [email protected]',
Subject => 'Subject title',
],
body => 'Content.',
);

eval { $mailer->send($email) };
die "Error sending email: $@" if $@;

three books

07 November 2007



Catalyst::Plugin::PickComponents

11 October 2007


I have written another Catalyst module to pick up desired components for Catalyst App.

Catalyst::Plugin::PickComponents

When I develop Foorum, I find the Controller/Model pm are expanding quickly. and it's not good for mod_perl since it will load all modules into the process. it costs memories.

that's why I wrote this. to reduce memory usage of mod_perl.

Thanks.