2012年2月アーカイブ

gifアニメをリサイズする方法 ImageMagick

こんばんは。プログラマの下園です。

今回はphpとImageMagickを使用して
アニメーションgifをリサイズする方法を紹介したいと思います。

▼まずはインストール&設定
http://ameblo.jp/yst141/entry-10404223305.html

インストール&設定が終わったら
下記のソースを貼り付けます。(自分の設定に合ったパスに変更してください。)

<?php

$image = new Imagick('C:\www\php\imagick\main.gif'); // 画像のパス
$image = $image->coalesceImages();
do {
  $image->scaleImage("120", "120"); // リサイズしたい幅と高さ
} while ($image->nextImage());
$image->writeImages('C:\www\php\imagick\rs.gif', true); // 書き込む画像のパス

?>

これだけでアニメーションgifをリサイズできます!
※フルパスでないと画像を読み込めませんでした。設定の問題・・・?

gifアニメって「Esc」で止めることができるんですねぇ
最近知りました。


こんなところにもデジタルサイネージ

こんにちは。またもやお久しぶりのデザイナーのクサです。

スペースアイではデジタルサイネージ関連の仕事もしているので、
街中にあるデジタルサイネージを見つけると、なるべく観察するようにしています。
会社近くだと、金山駅にでっかいのがドーンとありますね~。
アスナルでのイベント情報、アスナルに入っているお店のCM、行政からのお知らせ(もあったかな?)などが流れているのを目にします。

今回、サイネージを見かけたのは名古屋駅です。
名古屋駅構内にはポスターがたくさん貼ってあります。
ふと、新幹線の改札近くを通りかかった時に、SKE48のポスターだ~と通り過ぎようとしたら...動いている...!!
よくよく見ると、デジタルサイネージでした。
そして動いている部分はポスターにはめ込んだみたいな感じになっていて、歌っている映像のところだけ動いてました。

写真を撮っていないので、簡単に描いた図です。
(マウスで描いたのでがったがたですが...)
サイネージ.jpg

動いている部分以外は、静止画だったので一瞬「え?はめ込み?」と思ったのですが、
次に違う広告がぱっと表示されたので、一部だけ動いていたものだったみたいです。

名古屋駅の広告はポスターばかりだと思い込んでいたので、動いていると結構目にとまりますね!
また、新幹線改札口付近(銀時計付近)は待合わせしている人も多いので、たくさんの人の目に触れるのではないでしょうか。
スペースアイでも、効果的なデジタルサイネージをご提案出来るように、他のデジタルサイネージなどもどんどん観察していいものを取りこんでいきたいと思います!

外気温で変わるっ!?

こんにちわ
はやしです。

昨日、とあるショッピングモールへ
ショッピングに行ってきました。

中のお店では、たくさんのセールが開催されていました。

そんななか、とても変わったセールをしているお店がありました。
アクセサリーショップだったので、中に入る勇気がなく
詳しいことはよくわからなかったのですが......
「外気温セール」とポスターに書いてありました。
どうやら、外気温によって割引を決めているようです。

普段アクセサリーショップに足を運ばず、セールをやっていても
気づかないぐらいなのですが、
余りにも変わった文字が目に入ったので、
広告に目を向けてしまいました。(笑)

他のお店とは少し違うセールの内容というだけで、
普段目にしてもらえないお客さんにも
目を向けてもらうことができるんだなぁと思いました。

そんな発想をみならいつつ、
いろんな人が「面白い!!」と思ってもらえるようなものが
考えられるといいなぁと思いました。

ログイン画面を作ろうと思うと結構めんどくさかったりします。

ログイン画面のユーザーの参照ページを保持したり途中別のページが開かれたり

ややこしい認証だと共通モジュールに入れると全体が見づらくなったりと。。。

 

弊害を上げていったら切りがありませんが、ほとんどのブラウザはBesic認証に

対応しています。通常は「.htpassword」にパスワードが保存されていますが、

PHPでは「PHP_AUTH_USER」と「PHP_AUTH_PW」をつかってヘッダー内の

パラメーターを簡単に取得出来てしまいます。

ログイン画面に必要な機能はBesic認証でそろってますしこれを使わないては

無いですよね^^b

 

ってことでこんな感じで実装してみました。

 

<?php

$id = 'root';
$pw = 'pass';

// ユーザー認証
if(empty($_SESSION['IS_LOGIN'])){
 // パラメーターの有無を確認、いやマージしておこう。
 $auth = array_merge(
  array('PHP_AUTH_USER','PHP_AUTH_PW'),
  $_SERVER
 );

 if(
  $auth['PHP_AUTH_USER'] $id &&
  $auth['PHP_AUTH_PW']   $pw
 ){
  // ログイン成功
  $_SESSION['IS_LOGIN'] = 1;
  /*
   ここでセッションやクッキーにパラメーターを
   記録しておいて次回表示に備える。
  */
 }else{
  // ログイン失敗
  header('WWW-Authenticate: Basic realm="Wellcome"');
 }
}else{
 // すでにログインしている場合はスルー

}

echo 'Hello';

セキュリティー関連の問題が無いかがちょっと不安ではありますが、

お知らせや予定表等のみの簡単なCMSしか搭載していないサイトであれば

こっちのほうが簡単ですよね。

 

(完)

 

お世話になっています。
プログラマの竹内です。

CakePHP の便利な機能で、モデルの「アソシエーション」機能があります。
関連付けた複数テーブルのデータを一度に取得できる機能です。

今回はこのアソシエーションの1つ、「hasAndBelongsToMany」なモデルデータを、ページ分割してデータ取得してくれる「paginate」メソッドで使うことができないかなあ?というお話。


1. hasAndBelongsToMany とは

例えば、以下のようなテーブルが3つあり、

ユーザーにタグをつけて検索したいという場合。


●users テーブル

 id    name

●users_tags テーブル

 id    user_id    tag_id

●tags テーブル

 id    name


モデルには以下のように記述します。

     var $hasAndBelongsToMany = array(
        'Tag' => array(
            'className' => 'Tag',
            'joinTable' => 'users_tags',
            'foreignKey' => 'user_id',
            'associationForeignKey' => 'tag_id',
        )
    );


2. paginate で取得するには

find と同様に、モデルのデータを取得してくる paginate ですが、表面的に同じような使い方をすると期待する結果が取得できない場合があります。


通常テーブルのデータ(例えば、ユーザー名を取得する)なら

$this->paginate('User', array('User.name'=>'ひろし'));

などという感じで取得することができます。


しかし、hasAndBelongsToMany のデータを取得する場合、

例えばタグで検索しようとして

$this->paginate('User', array('UsersTag.tag_id'=>1));

などとやっても、このままでは取得することができません。


3. paginate メソッドでモデル結合する。

しょうがないので、検索のSQLでデータを結合して取得してくるようにします。


コントローラー冒頭の宣言で

    var $paginate = array('User' =>
                array(
                    'conditions'=>array(
                        'User.del_flag'=>false
                    ),
                    'limit'=>10,
                    'order'=>array(
                        'User.id'=>'asc'
                    ),
                    'joins'=>array(
                        array('type'=>'LEFT', 'alias'=>'UsersTag', 'table'=>'users_tags',
                            'conditions'=>'User.id = UsersTag.user_id')
                    )
                )
        );

と記述します。


これで、

$this->paginate('User', array('UsersTag.tag_id'=>1));

のような方法によるデータの取得が可能になりました。       


後記

だいぶ遠回りしていますが、CakePHP の機能でまだまだ不備のある点がよくわかって面白いです。

P.S. bindModel を使う手もありそうですが、恒久的なデータの取得に向かなさそうなので避けました。


1  2