M.C.P.C.

―むり・くり―プラスコミュニケーション


« 2012年1月 | トップページ | 2012年3月 »

2012.02.29

PerlのDateTimeとTime::Pieceでのタイムゾーン指定の仕方の比較

MySQLのtimestamp形式の日付文字列をPerlで日付として取り扱いたい。いままではDateTimeを使っていたけれども、今後の事を考えるとPerl 5.10で標準となっているTime::Pieceを使うのがよいだろう。ということでテストしてみたが。

テストしたのは、MySQLのtimestamp形式 "2012-03-01 00:00:00"(GMT) を、日本の時刻として読めるISO 8601形式の日付文字列(JST+09:00)として表示させるというもの。

FileName: datetime-timepiece.pl

use strict;
use warnings;
use Time::Piece::MySQL;
use DateTime::Format::MySQL;
 
my $datestrings = '2012-03-01 00:00:00';
 
my $dt = DateTime::Format::MySQL
          ->parse_datetime( $datestrings )
          ->set_time_zone('GMT')
          ->set_time_zone('Asia/Tokyo');
# DateTime::Format::MySQLを使わない場合は、
#use DateTime::Format::Strptime;
#my $strp = DateTime::Format::Strptime->new(pattern => '%F %T',time_zone => 'GMT');
#my $dt = $strp->parse_datetime( $datestrings )->set_time_zone('Asia/Tokyo');
 
my $tp = localtime Time::Piece->from_mysql_timestamp( $datestrings )->epoch ;
# Time::Piece::MySQLを使わない場合は、
#my $tp = localtime Time::Piece->strptime( $datestrings, '%Y-%m-%d %H:%M:%S')->epoch ;
 
print "DateTime   > $dt\n";
print "Time::Piece> ".$tp->datetime."\n";
 
__END___

実行結果:

$ perl datetime-timepiece.pl
DateTime   > 2012-03-01T09:00:00
Time::Piece> 2012-03-01T09:00:00
$

勝手知ったるDateTimeは、日付文字列をparseした瞬間は、タイムゾーンなどないまっさら状態なので、1回目のset_time_zone('GMT')で、"2012-03-01 00:00:00" はGMTにおける時刻であると設定したうえで、2回目のset_time_zone('Asia/Tokyo')で、日本のタイムゾーンを設定しました。set_time_zoneが2つあるというのが違和感ありますが、だいたいこんなもんです。

一方、Time::Pieceでは、parseして得られた時刻はGMTになっているから、一回epochに戻してからlocaltimeの引数として指定することで、タイムゾーンを設定しています。epochにまで戻す必要があるというのが違和感ありますが、そんなもののようです。

こんな感じで、タイムゾーンの指定は難しいよ、というお話でした。

[Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2012.02.28

僕らはノイズだらけのFAX原稿をトレースオンしてロゴの実線を拾い上げる魔術師なんだぜ

すっかり教育訓練に明け暮れて、開発などみじんもしない毎日なのですが、今日はちょっといかついロゴのトレースを教えていたわけです。

ロゴのトレースといっても、FAXで送られてきたノイズ混じりの原稿をスキャニングして、それをIllustratorのパスに起こすっていうことになるわけですけれども、こういう判別のしにくい原稿から、「ここに境界線があったはず」と決めつけてスパッと線を引いて行くのが僕らの仕事です。これって、Fate/stay nightの衛宮士郎が、アニメの1話目でストーブを修理するときに、機械の構造をトレースしていたときの絵じゃね? とイメージが重なりました。やった僕魔術師だったんだ!

しかし、トレースを何十年もやっているのについぞセイバーが召喚できませんでした。なんでやろう……とか言っていたら、

「鞘持ってないんじゃね?」

とか言われました。まあなあ。

[Illustrator] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2012.02.27

Mojoliciousのテンプレートシステムでトップページとそれ以外のページでtitleの記述を変える

Mojoliciousのテンプレートシステムのepなんですけれども、titleヘルパーでページタイトルが与えられていない場合(すなわちトップページ)をlayout側で判断して、titleの中身を変えたいという時。

たとえば、サイト名が「ちんぽこりん」だとして、

/ にアクセスした場合は<title>ちんぽこりん</title>
/new にアクセスした時は <title>更新情報 - ちんぽこりん</title>

みたいにしたいとき。stashの中をのぞいてifで判別するといいのかな。

Filename: common.html.ep

    <title><% if ( defined stash('title') ) { %><%= title %> - <% } %><%= $site_name %></title>

スマートじゃねえような気がしますが……

[Perl] | 固定リンク | コメント (1) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2012.02.26

SazamとかSoundHoundってAndroidのほかの音声出力ソフトの音でも認識するのね

Sazamとか、SoundHoundとか、マイクで拾った音から、楽曲を探し当てるソフトがありますが、

これって、周りの音を聞かせるだけでなくて、Android端末で音を出して再生しているソフトの音も当然ながら拾えるわけですよね。

こっちではRadiko使えないんですけれども、Radikoで流れている曲なんかそのまま認識させる、そのまま購入することできるのではないかと思いました。

しかし、Radikoとか使えないんですけれども、Radikoから流れている曲自体にメタデータで曲情報とかつけて利用するようにすればいいんじゃねえかとか思うのですが、結局Sazamのような楽曲認識という力技に頼るようになったのかなあ、ちょっと残念だなあとか思います。

[パソコン・インターネット] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2012.02.25

サークルKサンクスに3000円のiTunesカードがない場合は、お取り寄せできるぞ

サークルKサンクスのiTumesカードが、1500円分なら200円引き、3000円分なら500円引き、というキャンペーン(2012年2月9日~2012年2月28日、カルワザ会員のみ)がそろそろ終わるので、近くのサークルKに3000円分のiTunesカードを買いに行きましたが。

ここはものすごく田舎なので、iTunesカードを買おうとする人がいないのか、1500円カードが2枚しか入荷していませんでした。田舎なめすぎだろ。

お店の人が申し訳なさそうに「1500円分カードが2枚でもいいですか?」というので、「うーん、割引率が違うんですよね……」と言ったらば、「注文してみます。」ということになりました。

というわけで、3000円分カードがない場合は、時間はかかるが、注文できるようですよ。1500円分カードを2枚買うよりも100円分得ですね。

ただ、僕の場合、2月24日夜からの注文だと、キャンペーン終了の2月28日までには入荷が間に合わないと事が発覚、結局1500円カードを2枚買うことになりました。ちぇ。

[パソコン・インターネット] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2012.02.24

見出ミンMA31をモリサワTypeSquareのウェブフォントと、OpenTypeの実フォントで比較

そもそも、モリサワの見出ミンMA31なんて、横棒が極端に細すぎる書体なわけですが。

ともかく、モリサワTypeSquareの明朝体が、Windows版Google Chromeで見るとひどいらしいのですが、

モリサワTypeSquareを比較してみる [wakufactory.jp]

ウェブフォントじゃなくて実フォントで見たらどうなるかというテスト。

~~~

まず、ウェブフォント。

Morisawatypesquare01s
▲横棒が飛んでーら

次に、OpenTypeフォント。

Morisawatypesquare02s
▲見えたっ!

つうわけで、実フォントだとちゃんと見えるので、モリサワさんは、ウェブフォントの場合どうして横棒が飛んで見えるのか、説明したほうがいいと思いました。おそらく公式ルートでまともに回答できるフォントベンダーなんて、モリサワさんぐらいだと思うし。

[フォント] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2012.02.23

自分が持っているドメインのサブドメインにQRコードに変換する機能を付ける/Google Chart APIを使う

3年前に作ったエントリ

M.C.P.C.: 自分が持っているドメインのサブドメインにQRコードに変換する機能を付ける

ていうのがあったのだけれども、Apacheのmod_aliasのredirect機能と、Google Chart API使うとものすごく簡単だなーと気付いたので。

①サブドメインのルートに設置する場合

サブドメインもうけた後、サブドメインのルートの.htaccessにこんな風に書きます。

RedirectMatch ^(.*)$ http://chart.apis.google.com/chart?chs=150x150\&cht=qr\&chl=$1

例えば、これを http://qr.dtpwiki.jp/ に設置した場合は、
ウェブブラウザのアドレスバーに、http://qr.dtpwiki.jp/うんこ とか入れると、Google Chart APIにリダイレクトされて、画面にQRコードが表示されます。

②サブドメインではなく、サブディレクトリ(/qr としよう)に設置したい場合

サブディレクトリの中の.htaccessで以下のようにします。

RedirectMatch ^/qr/(.*)$ http://chart.apis.google.com/chart?chs=150x150\&cht=qr\&chl=$1

例えば、これを http://labo.dtpwiki.jp/qr/ に設置した場合は、
ウェブブラウザのアドレスバーに、http://labo.dtpwiki.jp/qr/うんこ とか入れると、Google Chart APIにリダイレクトされて、画面にQRコードが表示されます。

~~~

これ、リダイレクトでやるのがミソで、mod_rewriteのリダイレクトを使うと、スラッシュ2文字が、スラッシュ1文字に置き換えられてしまうんですよね。URLなどで欠損が出て、実用に堪えませんので、mod_rewriteには注意しましょう。

[Web] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2012.02.22

jquery.slideViewerPro.1.5.jsをXHTML5(application/xhtml+xml)対応にする

今どきで言うとdocomoのサイトのトップページのようなギャラリーができるjQueryプラグインの、jQuery slideViewerProというのがあります。

jQuery slideViewerPro 1.5 [www.gcmingati.net]

ところが、このjQueryプラグインは、サイトがXHTMLで、MIMEタイプがapplication/xhtml+xml(XHTMLとして処理するにはこのMIMEタイプが必須です)の場合、うまく動かない。

というわけで奥さん、パッチです!

Filename: jquery.slideViewerPro.1.5.js.patch

*** jquery.slideViewerPro.1.5.js.old  2012-02-22 23:08:17.000000000 +0900
--- jquery.slideViewerPro.1.5.js  2012-02-22 23:09:02.000000000 +0900
***************
*** 23,30 ****
    }
  });
  jQuery(function(){
!    jQuery("div.svwp").prepend("<img src='images/svwloader.gif' class='ldrgif' alt='loading...'/ >"); //change with YOUR loader image path
! });
  var j = 0;
  jQuery.fn.slideViewerPro = function(settings) {
      settings = jQuery.extend({
--- 23,30 ----
    }
  });
  jQuery(function(){
!    jQuery("div.svwp").prepend('<img src="images/svwloader.gif" class="ldrgif" alt="loading..." />'); //change with YOUR loader image path
! });
  var j = 0;
  jQuery.fn.slideViewerPro = function(settings) {
      settings = jQuery.extend({
***************
*** 97,103 ****
        jQuery(this).next().after("<a href='#' class='left' id='left" + j + "'><span>"+settings.leftButtonInner+"</span><\/a><a href='#' class='right' id='right" + j + "'><span>"+settings.rightButtonInner+"<\/span><\/a>");

        jQuery(this).find("li").each(function(n) {
!             jQuery("div#thumbSlider" + j + " ul").append("<li><a title='" + jQuery(this).find("img").attr("alt") + "' href='#'><img width='"+ thumbsWidth +"' height='"+ thumbsHeight +"' src='" + jQuery(this).find("img").attr("src") + "' /><p class='tmbrdr'>&nbsp;<\/p><\/a><\/li>");
        });

        jQuery("div#thumbSlider" + j + " a").each(function(z) {
--- 97,103 ----
        jQuery(this).next().after("<a href='#' class='left' id='left" + j + "'><span>"+settings.leftButtonInner+"</span><\/a><a href='#' class='right' id='right" + j + "'><span>"+settings.rightButtonInner+"<\/span><\/a>");

        jQuery(this).find("li").each(function(n) {
!             jQuery("div#thumbSlider" + j + " ul").append('<li><a title="' + jQuery(this).find("img").attr("alt") + '" href="#"><img width="'+ thumbsWidth +'" height="'+ thumbsHeight +'" src="' + jQuery(this).find("img").attr("src") + '" /><p class="tmbrdr">&#160;</p></a></li>');
        });

        jQuery("div#thumbSlider" + j + " a").each(function(z) {

要は、プラグインが挿入しようとしているHTMLは、XMLの文法的に間違っているから入れられないというのです。

パッチ前半の部分は、XMLとしてはimg要素は<img src="~" />と書かなくてはいかんということで、後半の部分は、XHTML5だと文字実体参照として定義されている文字が極端に少なく、&nbsp; というのもXHTML5だとエラーになるので、数値文字参照でノーブレークスペースのコードを直接指定するということです。

こんなに苦労せずとも、ウェブサーバが吐き出すときのMIMEタイプを、application/xhtml+xmlから、text/htmlあたりにすると解決なんですけれども、XHTML5を使っているとはいえなくなるよね。

ともかく、XHTML5として解釈されていると、JavaScriptから挿入するHTMLもXHTML5に矛盾しないようにしなくてはいけないです。めんどくさいが気をつけましょう。

[Web] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2012.02.21

Googleアドワーズ広告って、休止しているとクーポンくれるんだね

昔、HWNDBasedPanelView.comサイトをGoogleアドワーズを使って広告を出していたのですけれども、財力が尽きたので、休止していたのです。

んで、その後、Googleからダイレクトメールが届くようになり、「新規アカウント開設時に使える5000円・7500円クーポン」ていうのが6回ぐらい送られてきて、「アカウント何個も作らねーよGoogle爆発しろ」とか言っていたら、ついに電子メールで10000円分の既存のアカウントに継ぎ足して使えるクーポンを送ってきました。

早速再開しました。

こんな宣伝文です。見た人いるかな?

Hwndad
▲根本解決するサイトではないが

[Web] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2012.02.20

GPキャラクター名人気投票集計結果から総得票数を推定

ニュース:日印産連、GPキャラクター名人気投票集計結果を発表|PJ web news【印刷ジャーナル】 [http://www.pjl.co.jp] (ソース:日本印刷産業連合会 インフォメーション [www.jfpi.or.jp])

Gpchara (社)日本印刷産業連合会(猿渡智会長)は、「第13回エコプロダクツ2011」で実施したGPキャラクター愛称人気投票の集計結果を発表した。

【人気投票結果】
▽1位=エコリン(得票率27.1%)
▽2位=リーフィー(同18.7%)
▽3位=プリンティ(同15.3%)
▽4位=ぷりりん(同14.8%)
▽5位=ぐりっぴー(同14.2%)
▽6位=ジッピー(同9.9%)

昨年末にこんなニュースが出ていたんですね。そんで、総得票数がいくらなのかというのを計算してみました。

どーん。

Gpcharasheet
▲Excelで総得票数を推測してみたよ

答え:203票

[印刷] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

< 最後 « これより前10ä»¶ | 全件