創意無限空間

Smarty講座 第8回 このエントリーを含むはてなブックマーク

本日Smarty講座 第8回が公開されました。

今朝、起きてからPCを立ち上げてサイトチェックしていたら、Smartyの公式サイトが更新されており、確認してみると…… 昨晩、最新バージョンの2.6.22がリリースされたようでしたorz まさか2回続けて公開とタイミングがかぶるとは。

慌ててPHPプロ!の担当の方にメールを入れ、追記を入れてもらいました。

No comments

Smarty講座第7回 このエントリーを含むはてなブックマーク

昨年、PHPプロでSmarty講座の連載を全6回で担当させていただいたのですが、その続編を再び書かせていただくことになりました。本日第7回が公開されました。

前回のターゲットはSmarty初心者だったのですが、今回はもう少し使いこなした人にも興味を持ってもらえるような内容にしていこうと思っています。

追記:
今www.smarty.net見たら、2日に2.6.21がリリースされたみたいですね。タイミング悪いなぁ…

Version 2.6.21 (Dec 2nd, 2008)
------------------------------

- fix  function injection security hole closed (U.Tews)
- fix pass expiration time at cache_handler_fuc call in core.write_cache_file.php (U.Tews)
- Update of compiler.class.php to allow method chaining for PHP4 and PHP5 (U.Tews)
No comments

@マーク付きのCSVデータをExcelで読み込むと… このエントリーを含むはてなブックマーク

Excelでマクロエラー?

先日、とある会社で動かしているシステムで、クライアントから「データをCSVファイルに書き出して、それをExcelで読み込もうとしたら、『セキュリティエラー』が出たんだけど」との報告が。

最近SQLインジェクション攻撃による改ざんが話題になっていたので、もしかしてこちらのデータも改ざんされてウィルスでも仕込まれたのでは? と一瞬不安がよぎる。

急いでデータの確認。CSVを書き出してExcelに読み込ませてみる。すると、

Excelエラーダイアログ

というExcelのエラーダイアログが。ん? マクロが埋め込まれている?

CSVファイルを少しずつ削っていき、エラーを出しているセルを絞り込んでいく。すると、以下のデータで引っ掛かっていることが判明。

“@table(アットテーブル)”

どうやら、CSVセル内の @table(…) という表記を関数として見なしてしまっているよう(全角、半角関係なし)。”table”を他のExcel関数の名前に変えても、関数と見なされてしまうようだ。

仕方ないのでクライアントにお願いして、当面は@マークのあとに空白を入れてもらうことで回避することに。

@マークの回避方法は…

さて、この@マーク問題。調べてみるとこういうページを発見。

「@」マークが入力できない――打倒「1-2-3」の名残が、今はトラブルのもと

エラーの原因は、セルに入力した「@nifty」といった言葉を、エクセルが“関数式”と誤って認識するため。エクセルは関数式を入力するとき、「= SUM」のように先頭に「=」(イコール)を付ける決まりとなっている。だが実は、「@」も「=」と同様、関数の始まりを表す記号として使われている。試しに、合計を求めるSUM関数の式を「@SUM(B3:D3)」などと入力してみよう。これはエラーとならず、正しい結果が表示されるはずだ。その際、「@」は「=」に自動で置き換えられる。

(中略)

それにしても、なぜ「@」が関数式の始まりを表す記号として認識されるのだろうか。

これはエクセルが、かつての競合「ロータス1-2-3」の仕様を取り入れたためにほかならない。

…なるほど、昔の名残の仕様なのですね。で、Excelから先頭が「@」のデータを入力する場合は、

もちろん対処法はある。「書式」メニューの「セル」を選択し、セルの「表示形式」をあらかじめ「文字列」に設定しておけばよい。すると入力した内容がすべて“文字列”扱いになるので、「@」で始まる言葉も関数式とは認識されず、そのまま表示できる。

また表示形式をそのつど変えなくても、「’」を先頭に付けて入力すれば、「@」で始まる言葉を“文字列”として入力できる。この「’」も、1-2-3から引き継がれた「接頭辞」という機能。1-2-3には、接頭辞を使ってデータを文字列扱いにする機能があった。そして「’」は左揃え、「?」は中央揃え、「”」は右揃えなどと、接頭辞で配置まで指定できたのだ。

しかし、CSV読み込みの場合はこの方法がうまくいかなかった。接頭辞「’」を使うとそのまま「’」付きの文字列データとして読み込まれてしまう。

接頭辞「’」付きのCSVを読み込んだところ

CSV書き出し時のエスケープ処理について、カンマやダブルクォーテーションに関してはよく言及されているけど、こういう関数やマクロなどのエスケープはどうしたらいいもんですかねぇ。また、ここまで厳密に対応してくれるモジュールってあるのかな?

No comments

Developers Summit 2008 このエントリーを含むはてなブックマーク

デブサミ2008へ行ってきました。2/14の午後3セッションだけ聴講。うちMS系のセッションは寝てしまったのでorz、それ以外の2セッションのメモ書き。走り書きのメモを起こしたものなので、もしかしたら実際の内容と違っているところがあるかもしれませんがご容赦を。

ネオ・ナレッジマネジメント論-ネットワーク上のプラットフォームを活用した新しいコラボレーション形態を探る

  • グループウェアなどの文書共有をメインとした第1世代KM、イントラブログ、社内SNSなど、ナレッジを生み出している「人」を中心とした第2世代KMに続いて、ニコニコ動画ピアプロのVOCALOIDのように、作り出したネタをみんなでしゃぶり倒すコラボレーション形態は新しい世代のKMではないか
  • ネタを創る側と見る人側との間で、創る→発表する→見る→気付く→創る→ … のスパイラルが発生。更に、期待に応える→盛り上がる→評価する→満たされる→期待に応える→ … の逆方向のスパイラルも発生する。
  • ニワンゴの溝口浩二さん登場
    • 何故盛り上がるのか? → みんなで共有して盛り上がる感覚、承認欲求充足
    • 「ほめる」重要。
      • 日本は目立つ人をバッシングする傾向がある
      • 特に名前を出している人を叩く
      • 叩かれた人は萎縮してしまう
      • だからニコニコ動画は匿名にした
    • ニコニコ動画はオープンソースコミュニティに似ている?
      • CodeReposにドワンゴ社内で利用しているコードをcommitしている
    • ネットコミュニケーション
      • 社内でWiki,IRC,メールなどを利用している。在宅勤務の人もいるので
      • 全部を使いこなしている人は一部。使いやすいものを使いたいときに
    • YouTube問題
      • 止められた後、たまたま社内に動画サービスを個人で作ったことがある人がいたので、短時間で作り上げることが出来た
    • ユーザーの年齢構成
      • 男性がやはり多い
      • 10代後半は男女半々ぐらい
      • 20,30代は男性が多い
      • 40代以上は少ない
    • ニコニコ動画をフィルタリングされて社内で見られない人 → 会場内でアンケート → 6:4で見ることができるほうが多い
    • 立ち上げ前の分析は?
      • サービスを考えた人は、絶対に当たると思ったらしい
      • 11月にプロトタイプを見たときは正直当たらないと思った
      • けど弾幕を見て面白いと思った
      • ドワンゴ社内はニコ厨多い
  • クリプトン・フューチャー・メディアの佐々木渉さん登場
    • 初音ミクがニコニコ動画でここまで盛り上がると思ったか?
      • 初音ミクの録音が終わった頃、たまたまMEIKOを使った作品を見て、もし乗っかることが出来れば面白いかもとは思ったが、まさかここまで盛り上がるとは思わなかった
    • ドラマなどでは、まず作品があって音楽は主題歌など後出しになってしまうが、オリジナルの歌詞やメロディが作られて、そこから動画や絵をつけてドラマ化していくという逆転現象が起こっている
    • ネギとかロードローラーとか
      • CGM的でみんなで盛り上がれば面白いと思う。「今」を共有
      • クリプトンが口出しするのはナンセンス。茶々を入れるべきではない。ユーザーにまかせた方がいい
      • ジョジョ好きなのでむしろ見ていて楽しい
    • ピアプロ
      • 祭りにクリプトンも巻き込まれていきたい
      • みんなが作ったものを見てみたいと思い、社長自身が作った
      • ニコニコ動画などの素材置き場のような感じで
      • 社長自身もニコ厨になってしまった
      • 2時ぐらいに社長室から曲が聞こえてくることがある
    • 社内情報共有、KM
      • ノイズとか「音」を聞いてなんぼの仕事なので、倉庫に机を持って行ってそこで音を出せるようにしている→輸入代理店なので…
      • そういう意味でKMは結構アナログ。サイボウズは使っているけど…
      • 「音」は情報にしにくいが、検索できるシステムは検討している
    • 初音ミクは使っている?
      • 普段は全く使っていない
      • 開発中に聞きすぎて中毒気味になった
      • 頭の中に声のインパクトが残ってしまっている

ネット・コミュニケーション2.0

  • ドワンゴ戀塚昭彦さん「ニコニコ動画が産まれたわk」
    • タイトルは釣りwww 実際のプレゼン内容は「在宅勤務について」
    • フリーランス時代を含めて、8年間在宅勤務を続けている。
    • 但し、ドワンゴは基本出社が必要で、特別待遇扱い。
    • 3K
      • 帰れない → もう家にいる
      • 給料が安い → マネージャー出来ない
      • キリがない → 裁量労働制とのコンボ → 24時間働ける →実際には8時間ぐらい
    • 生産性
      • モチベーション × 知識 × 集中時間
      • メリット
        • 自分の空間 → 但し、集中するには自分の努力も必要
        • 移動時間ゼロ
        • 自由な時間配分
        • 連絡経路が細いので自分の裁量で
      • デメリット
        • 設備管理責任
        • セキュリティ
        • 上司、同僚から見えない。こちらからも見えない
        • 集中できない → 誘惑が多いので
    • コミュニケーション
      • マネージャーとの信頼関係が重要
      • ネットコミュニケーションの発達、ネット環境の向上
      • 会議重要 → 文字だけだと十分な伝達に時間がかかる
      • リアル重要 → メイン業務以外の雑談は重要
      • 週1回出社して社内を徘徊している
    • ニコニコ動画
      • システム設計、ベースとなるソフトウェア実装
      • 顧客役1人だけと議論、但し顧客役は関係者全員と議論
    • コミュニケーション重要
      • 完成イメージが出来ているか
      • 仕事認識を共有する
      • コミュニケーションパスを減らす
  • DeNA松内良介さん「DeNAモバゲータウン開発の裏側」
    • 元はMSでVista、WPFの開発をしていた。今はDeNAの米国勤務
    • モバゲータウンのシステム
      • ユーザー数903万人、15PV/月
      • 開発は10~15人ぐらい
      • 自前のテンプレートコンパイラを作成し使っている。せいぜいIF文ぐらい。3キャリア対応
      • 絵文字変換テーブルを用意 → 開発でちょこちょこチューニングしている
      • Webサーバー130台、DBサーバー200台
      • DBはSJIS、ソフトバンクはUTF-8、AU、ドコモはSJIS
      • 広告主に怒られるため、メンテナンスでサーバーを止めることは簡単にできない→朝5時に2分だけ止めるとか
    • 健全化
      • フィルタリング規制に関してはノーコメント
      • 画像著作権保護
      • 監視技術の研究対策
        • 成年男性が未成年女性へミニメールを大量に送っている人リスト → ペナルティ、悪質な場合は強制退会
        • 監視フィルタリングツール
          • 目視でピックアップしたフィルタリング対象を元に統計情報、自然言語解析を行い自動的にフィルタリングできるようになった
          • 10分以内に見つけ出し、早急な退会処理が出来るように
        • ネガティブに見られがちだが、技術的には非常にチャレンジングで面白い→行動ターゲティング広告などに応用できそう
  • ライトニングトーク
    • Twitで行こう!
      • WindowsのTwitterクライアント。作成時の困ったことの話とか
    • コミュニケーションを加速するコミュニティサイトWassrを高速に開発するためのコミュニケーション技法について
      • 社内で定時終了1時間前に帰りの会をやっている話
    • 秋月VFD量産計画によるコミュニケーション促進
      • OSが落ちてしまい、プレゼンできず…
      • が、全員終了後、再チャレンジで無事プレゼンできた
      • VFD(蛍光表示管)とWii Fitを使ってプレゼン。かなり大がかりだったので、お蔵入りにならなくてよかったと思った。
    • 地域コミュニティに国境はないかも
      • YAPC::Asiaの話。地域コミュの話
    • ネットウォッチ2.0
      • Plaggerを使って、GMail,Bloglines,mixi,twitterなどあらゆるネット情報を効率よく目を通す話
    • Asiajinでみるエンジニアの海外進出方法
      • Asiajinの話。正しい英語でなくていいから、英語を使って日本のことを発信していこうという話
    • CodeReposにうpする事は恐くないよ
      • CodeReposを使って高速開発な話。mobircの例
    • “involve”, NOT “evolve”
      • 勉強会やセミナーで聞けなかったセッションを社内勉強会でやってもらう話
      • そのために上司も巻き込む

感想

  • 作っている自分たちが楽しめるサービス、製品かどうかが重要
  • ユーザーが楽しんでいるところに自分も巻き込まれてみることが重要。クリプトンの社長が「みんなが作ったものを見てみたい」と言ってピアプロを立ち上げたという話が印象的だった
  • 自宅勤務で重要なのは集中できるかどうか、という話は今の自分の置かれた状況もそうなので非常に共感。自宅で集中するために具体的にどうやっているのか、聞いてみたかった
  • DeNAの監視技術の話は面白かった。ケータイコンテンツ、大規模、ターゲット層が未成年と、あまり自分の興味と交わらない範囲のようだけど、自動フィルタリングの話とか中ではかなり面白いことをやっている事が分かって興味深かった。
  • ライトニングトークでインパクトがあったのはWii Fitプレゼン。最初の失敗も実は釣りなんじゃないかwと思うぐらいのインパクト。
  • 秋元さんのAsiajinの話も色々と考えさせられた。前から思ってはいたけど、何か海外へ発信できるというのは強いよなぁと思う。日本語が下手な日本人もたくさんいるのだから、ちょっと文法がおかしいぐらいの英語でも別に気にしなくていいのかもしれない。下手くそな英語でもいいから、何か書くようにしてみるか…
  • (多分)初めてotsuneさんを見たw エゴサーチもしているとのことなので、ここも引っかかるかな?
  • ネットワーク環境やサービス、ツールが発達して、効率のいいコミュニケーション手段が取れるようになったけど、それでも重要なのはリアルなコミュニケーション。ツールはあくまでリアルコミュニケーションを円滑に進めるための補助的なものと割り切るべき。
No comments

CakePHPの$this->dataの扱い このエントリーを含むはてなブックマーク

アマゾンのサーバでエラーが起こっているかもしれません。一度ページを再読み込みしてみてください。

もう随分日が経ってしまってますが、CakePHP勉強会に参加してきました。内容に関してはあちこちで書かれているのでここでは省略。

さて、Shin x blogの新原さんの発表「CakePHPを業務に導入する」

$this->dataはそのまま使わない
=> 外部から来る値は信用しない

という話があったのですが、この件について書いてみようと思います。

$this->dataをそのままsaveしない

発表後の質疑応答で新原さんは、

formに入力された値を鵜呑みにすると危険。入力フォームで表示していないが存在するフィールドに対しても値が入ってしまう可能性があるので、いきなり$this->dataの値をsaveメソッドに渡さず、別配列に値を渡すなどして、必ず値のチェックをしましょう

という趣旨のことを話されていました。例えば以下のようなユーザーを管理するテーブルが用意されていたとします。

CREATE TABLE users(
id INTEGER PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
is_admin TINYINT
);

nameがユーザー名、is_adminが管理者を表すフラグとします。

ここで、ユーザーを追加するためnameの値だけ受け取るような入力フォームが用意されているとします。

<?php echo $html->input( ‘User/name’ ); ?>

Controllerでは$this->data['User']['name']に入力された値が入ります。

で、この$this->dataをそのまま$this->User->saveに渡すと値がDBに保存されますが、もし用意したフォーム以外から$this->data['User']['is_admin']に値が渡されていたらどうなるでしょう? 管理者権限が与えられてしまい、場合によってはそのサイトが乗っ取られてしまう可能性もあります。

空の値に注意

もう一つ、自分が遭遇した$this->dataの値をそのまま保存しないほうがいい理由について書いてみます。

例えば、商品を管理するテーブルが用意されているとします。

CREATE TABLE articles(
id INTEGER PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
price INTEGER,
openprice TINYINT
);

nameが商品名、priceが値段、openpriceがオープンプライスかどうかのフラグとします。
これらの3つを受け取る入力フォームを用意します。

<div>商品名: <?php echo $html->input( ‘Article/name’ ); ?></div>
<div>価格: <?php echo $html->input( ‘Article/price’ ); ?></div>
<div><?php echo $html->checkbox( ‘Article/openprice’ ); ?>オープンプライス</div>

さて、オープンプライスの商品を入力しようと思い、価格の値を空欄とします。この時$this->dataの値をそのまま保存するとどうなるでしょうか?

実は新規で保存した場合、価格の値はnullになるのですが、更新した場合は価格の値が0になります。これはUPDATE文でpriceの値に空文字列が渡されてしまうため、このような現象が発生します。

0とnullを区別する必要がない場合はいいのですが、例えばfindの条件でIS NULLを指定したい場合など、このままでは困ってしまうシチュエーションもあります。したがって、saveの前に値チェックを入れる必要があります。

if( empty( $this->data['Article']['price'] ) && $this->data['Article']['price'] != ‘0′ ){
$this->data['Article']['price'] = null;
}
$this->Article->save( $this->data );
?>

文字列フィールドの場合も空文字列として登録されてしまうので、nullと空文字列を区別したい場合は同様の処理が必要です。

まとめ

  • $this->dataの値を手つかずでsaveする場合は注意が必要
  • 入力フォームに表示していない値が渡ってくる可能性を想定する
  • 空の値の正規化をsave前に行う

おまけ

勉強会参加者の中に、家がすぐご近所の方を発見。しかも出身中学が隣だったことも発覚し、軽く衝撃w。そして懇親会で同じテーブルだった方が隣の市にお住まいだったりしてまたびっくり。Web業界って渋谷とか六本木とか、都心の方が盛り上がっているけど、多摩地区も負けてないなぁと思ったりもしました。三多摩IT技術者の会みたいなのが出来たら面白いかもしれませんね。

No comments

Smarty講座第5回 このエントリーを含むはてなブックマーク

本日Smarty講座第5回が公開されました。

過去4回はSmartyの使い方とか文法の話とかをしてきましたが、今回はSmartyを使って実用的なページ(問い合わせフォーム)を作ってみました。ソースコードが多いので、いつもよりページ数が増えてますw

1 comment

Smarty講座第4回 このエントリーを含むはてなブックマーク

Smarty講座第4回が公開されています。今回は関数と修飾子の話です。

No comments

Smarty講座第3回(第2回も) このエントリーを含むはてなブックマーク

Smarty講座第3回が本日公開されました。

…実はこちらに書くのを忘れていましたが第2回も先々週公開されています…

回を重ねるごとに、初心者に分かりやすく説明するのが難しくなってきました。コードが増えてきた分、それを読めば分かる人にはいいんでしょうが、必ずしもそういう人ばかりではない(むしろ多数だと思われる) ので、さてどうしたものかと思案中です。

No comments

Smarty講座 このエントリーを含むはてなブックマーク

PHPプロ!Smarty講座の連載を担当することになりました。

で、本日、第1回が公開されました。

初心者をターゲットとしているので、あまり突っ込んだところ(プラグインの作り方とか…)までは書けないと思いますが、Smartyやテンプレートエンジンに興味がある方は是非ご覧いただければ、と思います。

# イラストが可愛く描かれすぎて照れる…

No comments

WordPressのサムネイルについて このエントリーを含むはてなブックマーク

昨日作成したエントリで、サムネイル画像がやけに小さくなっていたのが気になりました。これはWordPressの管理画面から画像ファイルをアップして、サムネイルを表示するという手順を踏んだのですが、デフォルトの設定だと、サムネイル画像の最大サイズは幅128px、高さ96px以上にならないようです。

残念ながらWordPressの管理画面からはサムネイルの最大サイズの変更は出来ないよう。その代わり、直接ソースに手を加えることでサムネイルのサイズを変更出来るようです。なお今回の対象はWordPress ME 2.2.1です。

参考サイト:

修正するファイルは、wp-admin/admin-functions.phpです。ここではサムネイルサイズの最大サイズを幅400px、高さ300pxにしています。

2107行目:

function get_udims( $width, $height) {
// if ( $height < = 96 && $width <= 128 )
if ( $height < = 300 && $width <= 400 )
return array( $width, $height);
elseif ( $width / $height > 4 / 3 )
// return array( 128, (int) ($height / $width * 128 ));
return array( 400, (int) ($height / $width * 400 ));
else
// return array( (int) ($width / $height * 96 ), 96 );
return array( (int) ($width / $height * 300 ), 300 );
}

2228行目:

if ( $max < 0 || $metadata['width'] * $metadata['height'] < $max ) {
// $max_side = apply_filters( ‘wp_thumbnail_max_side_length’, 128, $attachment_id, $file );
$max_side = apply_filters( ‘wp_thumbnail_max_side_length’, 400, $attachment_id, $file );
$thumb = wp_create_thumbnail( $file, $max_side );

if ( @file_exists($thumb) )
$metadata['thumb'] = basename($thumb);
}

さてこれで、サムネイルのサイズが変わるはずです。ローカルサーバーで動作確認してみると…

??? サムネイル画像が生成されていない…

おかしいと思い、Apacheのエラーログを見てみると何やらエラーが。

[client ***.***.***.***] PHP Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 719280 bytes) in /***/wp-admin/admin-functions.php on line 2266, referer: http://*****/wp-admin/upload.php?style=inline&tab=upload&post_id=*****
Allowed memory size of 8388608 bytes exhausted (tried to allocate 0 bytes)

というわけでメモリーが足りなかったようです。php.iniのmemory_limitを修正してみます。もしレンタルサーバーなどで編集が出来ない場合は、小さいファイルサイズの画像で試したり、上記のサムネイルサイズを小さめにするといいのかな?(これは未確認)

memory_limit = 32M

参考サイト:

2 comments

次ページへ »