伊藤清徳の垂直落下式ムーンサルトプレス

PerlとかPHPとかMySQLとか...がんばっても8割だ。

Category: 未分類 (page 2 of 5)

スト2がクソゲーだったはなし

このブログは2015年「クソゲーアドベントカレンダー」の12/20担当分でございます。
 


まずは自己紹介

わたくし「きよっち」といいます。Twitterアカウントはこれ
アイコンは昔懐かしの任天堂ディスクシステムのキャラクター「ディスくん」。
おー!ゲーマー!
と言われますが、実はそんなことはなく、
生まれてから「ちゃんとやったゲーム」は実は、
CAPCOMのストリートファイター2シリーズ と ストリートファイター4シリーズのみです。
ちょっと意外と言われますが。
 


スト2

今ではアーケード(いわゆるゲーセン)はもとより、
ネット回線の進化で、コンシューマーゲーム機でも、
見知らぬ人の乱入による対戦型格闘ゲームは当たり前に存在しますが、
そのフォーマットを作ったのが、いわずとしれた、
カプコンのストリートファイター2です。
 
2と名が付いている通り、1も存在しますが、
ゲームに2ほどの躍動感もなく、難解さもあるものだったので、
人気こそ出ましたが、爆発的でもありませんでした。
なお、カプコンが人気を爆発させた
他のゲームには「ファイナルファイト」というゲームがありますが、
これは「ストリートファイター’89」として開発をしたものの、
市場調査担当のカプコンUSAにNGを食らって、
別ゲームとして再出発した経緯があります。
 
スト2は、躍動感にあふれ、たくさんのキャラクターを使えること。
ゲーム性はちょうどいい難易度で、かつ明快。
ちょっとのゲーム筐体の改造で、見知らぬ人同士の対戦まで実現したことが、
爆発的な人気の要因となりました。
 
爆発的な人気にあやかり多くの家庭用ゲーム機に移植がされましたが、
当時の家庭用ゲーム機は、現在と違いアーケード用プラットフォームと
かなりの処理速度の違いや、メモリ容量の違いがあり、
移植性がいまいちなものが多かったので、
この記事では本家本元アーケードのスト2で話をすすめます。
 
またスト2シリーズでは、

  • 無印
  • ダッシュ
  • ダッシュターボ
  • スーパー
  • スーパーX
  • ハイパー
  • HDエディション(海外のみ)

というマイナーチェンジがあり、それぞれにバグフィックスバージョンがありますが、
全部を網羅するのは難しいの特にクソだったところを書いていきます。


ぼくはバルログ使い

スト2ダッシュがリリースされたのが、
ぼくが小学校5年生の終わりごろだったと記憶しています。
スト2無印は少しやっていましたが、本格的にやりはじめたのが、スト2ダッシュ。
そこからおおよそ25年間。
スト2シリーズでもスト4シリーズでも一貫してメイン利用キャラはバルログです。
余談ですが。
 


人気爆発なのにクソゲー?

さて、そんな世の中をブームの渦に巻き込んだスト2ですが、
クソなところがあるのか?
というとYESです。
 
というか、相当なバグの集まりでした。
  
例を上げると
https://www.youtube.com/watch?v=64mLwH1TsXw
こちらの動画の冒頭。
リュウという左側のキャラが、アッパーを出した後に波動拳という必殺技をつなげています。
リュウというキャラのアッパーという技は、与えるダメージが多い代わりに
技の出し入れが大振りになって技の出際と出したあとに、
大きく隙ができるという技なのです。
にもかかわらず、波動拳という技へつながっています。
 
波動拳は、特定コマンドを入力することによって発生する「必殺技」です。
特定の技と、特定の必殺技は、必殺技のコマンドを素早く入力することで繋がるようになっています。
これを「キャンセル必殺技」などと称し、スト2シリーズを元祖として、
後に生まれるほとんどの対戦格闘ゲームに導入されています。
 
が、スト2では元々このキャンセル必殺技は、狙って生まれたものではなく、
ゲームの難易度を下げるために、必殺技コマンドを入力しやすくしたためのバグでした。
カプコン曰く、テスト段階でこのバグには気づいていたけれども、
ゲーム性が広がるので残した「副産物」だそうです。
 
前述のとおり、これは狙って生まれたバグであったにもかかわらず、
それが独立して一つの概念となり、多くのゲームに影響をあたえていったわけです。
 
つまり何をいいたいかといいうと、スト2は確かにおもしろいゲームだが、
同時に「バグの塊」というクソゲーの概念ももっていたというわけです。
 
それを少々お話したいと思います。
 


ゲームバランス

スト2では多くのキャラクターが活き活きと画面の中で表現されており、
プレーヤーの性格や、プレーヤーの思惑をキャラによって反映できるところが
とてもおもしろい面でした。
 
が。しかし、それは諸刃でもありました。
どういうことかというと、ひとつのバグが見過ごされることにより、
1体のキャラが圧倒的な強さをもってしまったり、
逆に圧倒的な弱さになってしまうということでした。
 
特に有名なバグがこれ
https://www.youtube.com/watch?v=dclJsFQu1SI
初代スト2にあったバグで、ガイルというキャラのバグです。
問答無用で相手キャラを投げることができたり、
相手キャラが何もできない状況をつくったりと、
とまぁひどいバグでした。
元々ガイルというキャラが、使いやすいわりに、技性能が異常なほど高く設定されていて、
かつ、このバグですから、ゲーム性が大きく損なわれた、
まさにクソゲーでした。
 
スト2シリーズは、こういったゲームバランスを調整していくごとに、
新バージョンができていったと言って過言ではありません。
 


小さなバグがゲームバランスを崩すこともある

スト2が流行っていた頃にアーケード、つまりゲームセンターのゲームの攻略雑誌といえば
「ゲーメスト」です。誤字誤植の多い雑誌として有名なアレです。
 
そのゲーメストが発見した、小さなバグから大きくゲームバランスをくずしたという歴史もあります。
https://www.youtube.com/watch?v=JVzhl2AYusY&start=170&end=178
それがこちらの動画。再生スタート位置から3つのキャラの連続技を紹介しています。
いずれの連続技も、しゃがんだ状態からのキックから、立った状態のパンチへ移行しています。
これは通常動作では繋がらないようになっているのですが、
特定状況においてつながってしまうという「バグ技」なんです。
 
たかがそれくらいと思うかもしれませんが、
当時のスト2は使い手のレベル差に対する考慮はほとんどされておらず、
この技がつながってしまうことによって、
キャラのHPが半分以上のこっていたとしても
一気に死亡に持っていけるほど脅威なバグ技でした。
このバグ技を持っていないキャラを使うユーザーに対しても脅威なら、
初級者にとっても脅威だったのです。
 
これが故にスト2ターボの頃にはユーザーが固定化してしまっていたのも事実で、
このあたりも「クソゲー」といって過言ではないものでした。
(実際のところそういった面を打開するために生まれたのがスーパースト2でした)
 


その他のバグ

その他詳しくのバグは
http://games.t-akiba.net/sf2/bug.html
こちらに表があります。
 
そしてこちらが、当時小学生のぼくがゲーセンでやらかしてしまったバグ
https://www.youtube.com/watch?v=85l1ox5JlEg
このバグを発動すると、永久ループが発生して、電源を落とさないと戻らないものでした。大顰蹙です。
 


それでもこよなく愛されたスト2

スト2が生まれて、そして多数のバグが生まれてから、
対戦格闘ゲームの開発というのは、ゲームバランスを作り上げる世界になりました。
対戦格闘以外のゲームが、世界観を作り上げていくことに苦慮しているのとは、
全く別のアプローチです。
現在稼働中のストリートファイター4シリーズと、
2016年2月18日発売のストリートファイター5シリーズでも、
同様です。
 
スト2流行当時は、スト2クローンのようなゲームがたくさん生まれました。
そういったゲームの中で好きだったのが
https://www.youtube.com/watch?v=Az84v21uv7w
こちらの大江戸ファイトですが、
そりゃもうひどいゲームバランスで、それなりに面白かったですが、
シリーズとしては続かないよねぇ‥という出来だったわけです。
 
スト2という「クソゲー」は、
対戦格闘型ゲームの雛形をつくったという功績とともに
クソゲー要素を多分に含んでいることが、
対戦格闘型ゲームの歴史を語る上で重要なわけです。
 


最後に

「クソゲー」は賞賛に値する称号です。
だれもやらないゲームには「クソゲー」という称号はつきません。
 
ぼくは愛着をもってスト2を「クソゲー」と呼びます。

はつこいのはなし

この記事は2015年初恋アドベントカレンダーのために書いた記事です。
 
昨日までが、GOUTENさんの3部作で、そのあとってことで強烈にやりにくいですが、まぁ書いてみます。
 
すっごい昔のはなしで、結婚しているいま、妻にも申し訳ない思いで書きます。
 


はつこい

えっと、みなさんは初恋っていつくらいなんですかね。
幼稚園?小学校低学年?中には18才なんていうお嬢様もいるでしょう。
 
ぼくの場合「これなんだ?」ってなったのが、小5のはじめ。
周りの人の話を聞く限りこれが恋愛ってやつだと気づいたのが、小5の夏です。
小学校ずーっと同じクラスで、
ずーっとぼくが男子の名簿順筆頭、彼女が女子の名簿順筆頭という間柄で、
要するに、学年が上がると数ヶ月は必ず席がとなりという関係でした。
 


彼女は

彼女は頭脳明晰、スポーツもできて、
見た目のことは小学校のときはあんまり気にしてなかったけど、
今になって思えば、中の上?(なんて上から目線なんだw)。
決して底抜けに明るいわけではないけれども、心優しい女の子でした。
小1のときは、最初から同じクラスだったわけでなく、
親の転勤で小1の夏休み明けに、海外から帰ってきた帰国子女だったと記憶しています。
 
まぁですね要するにですね、高嶺の花なんですわ。
 
でも、ぼくはそういう世間的によしとするところを好きだったという記憶はなく、
いつもちかくにいて感覚がとても合うという感じだったという記憶はしています。
 


ところがですね。

小学校5年くらいになると、林間学校やら修学旅行やらで、
泊まりがけでどこかに行くという学校行事も出てきます。
 
そこであるのは「ねぇねぇだれがスキなの?」みたいなやつだよね。
男女それぞれに。
 
そこでわかったことが、どうもいわゆる「両思い」ってやつだったわけです。
 


当時のぼくは

当時のぼくは、いわゆる肥満児で、小学生のころの貴乃花親方のような体型。
いまでもそうですが、きわめて運動神経はにぶかったです。
今のぼくに照らし合わせて考えると、
これもまたウソのようなはなしかもしれませんが、
極度にシャイで家から出るのがイヤで、
特定の誰かとしか遊びたくないという感じのこどもでしたね。
小学校の花型男子といえばドッジボールができてかけっこの速い男の子。
ぼくの地元でも、例に違わずで、そういう男子がモテていました。
が、その中でぼくが?という感じも。
いまになっても不思議で仕方ないです。
 


でもですね

ぼくの地元はとっても田舎。
名古屋市のベッドタウンとして発展している町ですが、所詮は田舎。
しかも25年も前のはなし。
小学生の両思いなんていうのは、とてもセンセーショナルなんです。
 
汚いはなしですが、よく小学生にうんこをする権利はない。なんてはなしがありますが、
それに近いものがあり、
かなりからかわれました。。。
 
彼女も相当つらい思いをしたと思います。
ごめんなさいを何回言ったら良いかわからないくらいです。
 


ぼくは救われた

いきなりはなしが飛びますが、ちょうどその頃。
ぼくの実家は破綻しました。父のお店が借金まみれであることがわかりました。
ぼくの母は元来、動揺することはなく、かつ奔放で、いつでもどっしりと
ぼくたちの前に立ちはだかる母なんですが、
あの頃は、母は動揺し、時にはつらい思いを口にすることもありました。
ぼくの仕事におけるコンサル方針はこの頃の経験をもとに考えるくらい、
たった35年しか生きていませんが、とても大きなできごとの一つです。
 
両親は離婚するのか?家を出ていかなければならないのか?
を考えたり、
何も知らずにとった電話が借金の取り立ての電話だったりと。
 
まぁおおよそ普通の小学生では体験できないような苦痛です。
小学校中学校の頃の、諸先生方にはこの点をご考慮いただき続けて、
いまでも本当に感謝の念しかありません。
 
おっと、閑話休題。
こんな時期に、その女の子のことをはじめて「好き」と思ったのです。
偶然なのかなんなのか、彼女も好意をもってくれていたようで、
ぼくの小さな変化に気づいてくれていました。
極力明るく家の話題は学校では話していませんでしたが。
どういうことで変なのかはわかっていなかったようですが、
事あるごとに声をかけてくれたり、家に来てくれたり、
妹にまで気を使ってくれたこともありました。
 
ほんとうに救われましたよ。
ありがとうも何回言っても感謝になりません。
 
 


例に違わず

初恋というのは実らず終了するものです。
それで良いのです。
 
どうやら彼女は優秀な大学を卒業し、有名企業に入ったらしい話は聞いています。
きっと幸せな家庭生活をしているか、
はたまたバリバリのキャリアウーマンとして活躍しているかでしょう。
 
いまは残念ながら、ご実家も地元を離れたようで、
1人2人はさめば所在はわかっているものの、
直接の連絡はとれないため、詳細は不明です。
 
ただただ、当時の思いを書くために、この記事。
いつかどこかで届けばいいですが。
 

フリーランスが新卒で一本釣ってみた

どうもこんにちは。きよっちこと伊藤清徳と申します。
 
この記事は2015年フリーランスアドベントカレンダー6日目の記事です!
 
昨年は、プロレスのフリーランサーのことについてかいてみました。今年はもうちょっとまじめに書きますすみません。


まずは自己紹介

まずはわたくしが何をしているかという話から。
普段は、主に電子商取引(EC)のコンサルティングと、EC向けなシステム開発を生業としていますが、
その他チラシプランニングやら、店舗プロデュースやらと、「人がどこかのお店に行く」ということを
クライアントさんと一緒にいっしょにやってる、
マーケッターなんだか、WEBプロデューサーなんだか、WEBプログラマなんだか
よくわからない立場で生きている人です。
 
2011年4月に個人事業を開始し、今に至ります。
「伊藤くんさ。給料高いし、出ていこうか」と
まさかの宣言を前職社長より受け、
そして開業にむけていろいろやっているなか、
2011年3月あの未曾有の災害を通りぬけての独立でした。
まぁこのお話はどこかで。
 


わが店は2人体制に

わたしは「春芳堂(しゅんぽうどう)」という屋号で仕事をしておりまして、
2015年4月。春芳堂は二人体制になりました。
しかも体制がちょっと風変わりでして、新卒を専属委託外注として採用しました。
(この新卒を以下「新人くん」と書きます。)
 
なぜ雇用でないのか、なぜ新卒なのか。などその辺を書いていこうと思います。
 


新人くん


左が新人くん。21才。
わたし。ちょうど開業準備中より、某専門学校にて、
PHPとかをおしえていまして、彼はその生徒です。
2014年夏頃からアルバイトにきてもらっていて、そのまま採用となったわけです。
 
はじめて人を使うという立場になるわけで怖さはありましたが、
一人でやりつづけるよりはずっといいなーと思って、来てもらいました。


専門学校はよいリクルートの場

前述のとおり専門学校の生徒からの一本釣りをしたことがおおきなきっかけですが、
これもアルバイトながら専門学校という場所に携わっていなければできなかったことです。
正直なところ、専門学校の臨時講師としてもらえるフィーは決っして良いものではないですが、
若い人に突っ込まれながら、冷や汗を書きながら教えるというのは、
叱られる立場にないフリーランサーにとっては貴重な場所でした。
30を超えてしまうと、20代前半の人たちが言ってることに聞く耳をもたず、
なにかというと見下してしまいがちなものですが(つまりおっさん化)
講師をやるとなるとそうはいきません。
生徒たちの人となりを理解しながら、会話をして授業をすすめるので
そのうちには「こいつとなら仕事やってみたい」というやつもでてくるわけです。
 
わたしの事業である春芳堂はどちらかというとジェネラリストとしての動きを
クライアントさんから求められることが多く、
どこかに突出した技術、たとえばデザインが凄いとか、すごいエンジニアだとか、
そういうのは不要で、満遍なく俯瞰しながら、どんな人とでも一定の会話が必要です。
(自分ができているかどうかは置いておいて)
うちの新人くんは、いまのところ、何かに専門化したような感じでもなく、
かといって、大きな弱点がなかったことが近くにおいてみようと思った所以です。
 
またもう一つの見方として、自分のリクルートだけでなく、
様々なタイプのクライアントさんと直接のやりとりを行うフリーランサーにとっては、
クライアントさんの求人に合う新卒を、マッチングすることもできちゃったりします。
「伊藤くんさーこんな人いない?募集してるんだけど」
「あーちょうどいい子いますよ!」
なんていう感じですね。
これひとつで結構クライアントさんとの距離をぐっと縮めることもできたりするわけです。
 


ところでなんで雇用じゃないの?

フリーランスという言葉のイメージで言えば雇用のイメージはないかもしれませんが、
個人事業でも雇用はもちろんできます。正社員やパートなど。
では、なんで、雇用にならなかったかというと、
正直に言ってしまえば、雇用にかかる費用が大きいこともありますが、
もう一つが、春芳堂の将来展望と、新人くんの将来展望には大きなズレがあるからです。
 
わたしたちフリーランサーは、事業主個人の考えを色濃く反映した事業展開をしていくことが、
生き残る唯一の道です。決めてくれる人がいるわけでもなければ、決めなければ何もできない。
そのへんは去年の記事にも書きました。
 
フリーランサーが一人くらいを雇うとなると、
やはり、上下関係はあれど、関係は1対1なんですね。
つまり道は一筋に通っていないとうまくいかない。
 
新人くんは元々は絵を書いたりイラストレーションを作ったりなど、
WEBとは関係のないところの技術が長けている人物です。
ですが、大変言い方が悪くなってしまうけれども「器用貧乏さ」により、
WEBが「できてしまっている」という感じで、
将来はきっとWEBを自分の表現の手段として利用するんでしょう。
わたしきよっちには、もともとクリエイティブな感覚はなく、
クライアントさんの表現のお手伝いにWEBを利用しています。
ここには大きな違いがある。
雇用してしまえば、うちのやり方に染まってもらうしかなくなってしまうので、
1対1の両個人事業での関係でスタートを切りました。
 


それでも見える世界がかなり変わる

そんな感じでふたり体制の春芳堂が今年からはじまるわけですが、
ふたりになると見える世界もだいぶ変わるものです。
フリーランスがひとりで仕事をする分には良くも悪くも自分の裁量です。
っていうか、ひとりでやってる分には
良くも悪くもの「悪くも」が存在するのに、目をそらしている部分があります。
それをまざまざと見せつけられました。
 
クライアントさんとの関係やら、結果の求め方、
結果の明文化やら逆にプロセスの明文化など。
 
フリーランスは、作業に専念するだけでなく、
自分自身のマネジメント(将来展望も含め)が必須の働きかたです。
そりゃそうです。自分でしか何も動かせないんですから。
でも、まぁ人ですからねぇ。自分に甘えますよ。
で、そのうちそれに慣れていってしまう。
 
そんな自分をまざまざと見せつけられました。
転換が必要なほど、大きく舵を切ることはないですが、
方向の修正は必要だと気付かされました。
 


なんか…

なんかとりとめのない文章になってしまいましたが、
フリーランサーだからといって一人でいることがいいわけではないと思ったので、
今回このことを記事にしてみました。
 
参考にはならないかもしれませんが、こんな変わった奴もいるんだなと思ってくれれば。
 
あーそうそう。2015年は沖縄県那覇市に事務所を開設しました。
この記事も沖縄で書いています!沖縄県のフリーランスさん会いましょう!

こさりん

こさりんAdventCalendarというがあってだな、なに書くのかよくわからないままこの日を迎えた。

わたしは、名古屋市で「EC専業」を謳いマーケティングコンサルとシステム開発を行っているきよっちという者です。
 


こさりんとのであい

こさりんと出会ったのは、2011年の初夏。僕が独立開業して間もない頃。
彼はまだ大学生。どんな会話をしたのかほとんど記憶にない。
存在だけを鮮烈に覚えている。そんな感じ。
 
当時のヤツはマカロンを食べる少年だったが、
いつのまにかマカロンになっていた。
なんのこっちゃとお思いかもしれないが、とにかくマカロンだったのだ。
マカロンブームが終わってもヤツはマカロンであり続けた。
ヤツは、すばらしい。
 


その後

そんなヤツとの出会いから三年経つ。
特にこれといった深い関係もなく、だらだらと面白いことをTwitterで言い合い、
年に2回くらい会う。ただそれだけの毎日。
ヤツが名古屋に来ることがあっても、
会うこともないことが多い。
むしろそれが良いのだ。ヤツはそこにいるのかいないのか、わからない。
マカロンみたいな存在でいることがこさりんなのだ。
 


さみしくなったら

Twitterでこさりんにむけて、エアリプライを送ってみよう。
 
あなたの心のなかに29,800円。こさりんです。
ふぁぼってくれるかも。
 
 
(こんなのでいいのか?

[覚書]Yiiで複数データ・ソースを扱う

今日は完全な覚書です。
 
僕はYiiが大好きです。あ、PHPのフレームワークのことです。
(ぼくにとっては)使いやすい。現在はYii2がベータ版で開発中。
giiというGUIでのCRUDジェネレータがあり、
管理画面を作るにはとっても手軽、かつ、高機能に振る舞ってくれる
CRUD画面をつくってくれます。
 


こういったフレームワークにかならずついてくるのがORMやらARやら。
YiiにももちろんARがあります。
CActiveRecordを継承したクラスをつくれば、それで「はい完成」。
(もちろんテーブル名の設定などは必要ですが)
 
ただし、CActiveRecordは、初期値でフレームワークに設定されるDBへの接続を前提につくられており、複数データソースに接続する場合はちょこっと改造が必要です。
 


複数データソースへの接続

'components'=>array(
	'db'=>array(
		'connectionString' => 'mysql:host=host;dbname=databasename',
		'emulatePrepare' => true,
		'enableParamLogging' => true,
		'username' => 'user',
		'password' => 'password',
		'charset' => 'utf8',
	),
)

初期値ではこんな感じの設定がconfigにあります。
1つのデータソースへの接続ですね。
 
これを…

'components'=>array(
	'db'=>array(
		'connectionString' => 'mysql:host=host;dbname=databasename',
		'emulatePrepare' => true,
		'enableParamLogging' => true,
		'username' => 'user',
		'password' => 'password',
		'charset' => 'utf8',
	),
	'db2'=>array(
		'class' => 'CDbConnection',//←これ追加
		'connectionString' => 'mysql:host=host;dbname=database2',
		'emulatePrepare' => true,
		'enableParamLogging' => true,
		'username' => 'user',
		'password' => 'password',
		'charset' => 'utf8',
	),
)

こんな風にすると、2つめのデータソースへは

Yii::app()->db2

でアクセス可能です。おぉ。便利。


ARで利用

class TableModel extends CActiveRecord
{
	/**
	 * テーブル名を指定
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'tablename';
	}
	
}

YiiのActiveRecordは最低限これだけ書けばARクラスをつくることができます。
ただ、前述のとおり、Yiiのアクティブレコードは初期で設定されているYii::app()->dbを前提としていますので、2つめのデータソースのAR作成は、ちょこっと変更が必要。
 
そのやり方が…

class DB2Model extends CActiveRecord
{
	
	/**
	 * データ接続先を設定
	 */
	public function getDbConnection()
	{
		return Yii::app()->db2;
	}
	
	/**
	 * テーブル名
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'sessions';
	}
	
}

こんな感じgetDbConnection()をオーバーロードして、
configで追加した別のデータソースをリターンするだけ。
 
おお。さらに便利。


 
誰得です。現場からは以上です。

マイカフェの田中とかいう人

マイカフェというコワーキングスペースの代表の田中とかいうおじさん(実際は僕より年下だけど)が、僕の写真をいっぱい乗っけた記事を書いてくれたのでAnswer記事だコラ!タココラ!


コワーキングスペースってなんぞ

wikipediaによると>>http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AF%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0

すごく感情の入っていないことばでいえば
「コミュニティ付きのシェアオフィス」
なんすけどね。
 
マイカフェはその一言では片付けられないのですよ。宣伝みたいだけど。
 


田中とかいう人

このマイカフェの代表が「田中」ってヤツでしてね。
僕とこの人が出会ったのが、2年くらい前ですか。
マイカフェで開催されていたストリートファイター2の大会に呼ばれていったところで出会いました。
 
そこから半年くらい、名前を覚えてもらえずスト2大会で僕が使っていた「バルログ」から、
僕は「バルログさん」と呼ばれていたわけです。
 
まぁコワーキングって何かよくわからなかったし、そこから得られるメリットもわからなかったし、
「田中さんよ。あんた一体何者よ?」
みたいなところもあって。
 
でもだんだん、この田中って人の味がわかってきてね。
マイカフェの会員にならないまでも、アドバイスを受けたりしてもらったり。
そんなこんなで変な友情が芽生えているわけですよ。
 
マイカフェさんは12月に3店舗目となる「錦通店」をオープンしました。
その店の開店と同時に、僕はついに口説き落とされて、会員になったわけですが、
まぁそれは置いておいて、
この錦通店オープンのレセプションがあったんですよ。
そのときに、来賓の方々の挨拶が次々と行われて、
みなさん口をそろえておっしゃるのです。
 
「マイカフェ = 田中イズム」
 
だと。
 
つまりはですね
マイカフェ ≒ コワーキングスペース
マイカフェ = 田中イズム
なんですね。
 
田中とかいう人のフィールドの中で、僕たち会員がコミュニティを作っている。
そんなイメージです。
 


競争とかそういうことじゃない

 
マイカフェさんの中の意識の実情は知りませんよ。
あくまで、僕が会員として思ってることですが、
結局のところね、商売って競争を意識した時点で負けですよね?って常々おもっているわけです。
自分のイズムに共感してくれる方々が顧客で、
その顧客をただひたすらにケアしつづけるのが商売なんじゃないかって。
 
Apple信者にMS-Windowsの良さをひたすらに説いても仕方ないし、
ホンダ信者にトヨタ車の良さを説いても仕方ない。
 
だって、そこには共感はないから。
信者は、その企業や事業者と共感してる。
それを覆すのは、ある意味顧客の信念を潰すようなやり方でもあります。
 
田中イズムってこういうのに通じてんじゃないかなーって。


 
 
あれ?なんか締まらなくなってきたな。とりあえずさ、田中さんよ。いやマイカフェさんよ。一緒におもしろいことやろうや。

スーパーママチャリGP参加攻略(核心は語らない)

2年前にブログでレポートした富士スピードウェイで行われるスーパーママチャリGPに実はあれから連続参加しておりまして、今回は前日の場所取りからスタートしたので、ちょっと参加の攻略を書いてみようとおもいます。

ですが、あまり完全な攻略を書くと、自分たちが死ぬので、ヒントだけです。あと速さは僕たちは追求していないので、レースの攻略については書きません。


開門前

 
ママチャリGPは全1400チームが参加し、各チーム10人の選手と数名のサポーターで成り立っているチームがほとんどですので、人数にすると、2万人近くが富士スピードウェイに集まります。しかも、F1のようにピットエリアが確保されているわけではなく、場所取りによって成立します。参加者によって場所とりをしなくてはならない場所は、ピットエリア、暖を取るためのBBQエリア、仮眠をするためのクリスタルルームにそれぞれ人数分の場所を確保することが最低限必要になってきます。
 

 
▲これが、前日開門時間ごろの待ちの車列です。私たちがいつについたのかは、核心に迫るので言いませんが、最前列にいた方にはなしをきいたところ、前々日の19:00に並んだとのことです。怖い…怖い…
 
2014年は比較的暖かく待ちの時間も、外に出てサッカーをやったりなど、皆さん思い思いに過ごしていましたが、例年は外にでることができないくらい寒く、車のエンジンを切ることは不可能になるようなので、燃料の量に注意してください。
 
なお、車列の場所取りは基本的に禁止で、一回外にでると並び直しです。
 


ダッシュ組 = これがママチャリGPの本番

開門前の行列は、何も車だけではありません。自動車は、開門時には、セーフティカー(F1で使われるあれです)に先導されてゆっくりしか駐車場にはいることしかできず、駐車場に入ってから、場内の場所取りをしていては、時すでに遅しです。
 
車列の駐車場とは他の駐車場には、ダッシュ or 自転車で入場するための待機場が作られ、そちらにも並ばなくてはなりません。前述の通り、平年では、外に出ていることがすでに寒い位の天気の中、何時間も身一つで待っていなくてはならない過酷な行列です。
 
こちらの列は16:45分からスタートを切ることができますが、入場口までは、ダッシュで向かうことになります。したがって、最終的な入場順は、どれだけダッシュできたか?によるわけです。
 
しかし、このダッシュがとにかくキツイ。高低差およそ35mの上り坂を、待機場から、おおよそ1キロ弱ダッシュし続けたところに入場口があります。ここまでとにかくどれだけ走れるかが、場所取りの生命線です。
 
本気のチームは場所取りだけのために、ロードバイクをもちこんで入場するほどです。身一つでダッシュするひとの多くはこの時点で足が壊されて、レース本番に影響を与えてしまいます。
 
はっきりいて、これがママチャリGPの本番です。
 
他の方の動画で2013年のものですが、参考までに
http://www.youtube.com/watch?v=lLuYuKAkJ-A


入場後


 
これは翌日朝の写真ですが、場内エリアでは、このようなテント村ができます。外では、暖を取るためのBBQエリアの確保と、建物内ではピットエリアの確保、暖房の効いたクリスタルルームの確保が必要です。
 
入場前のダッシュにひき続いて、入場口からこれらエリアの確保に向かわないといけません。場内のダッシュは、全部で500メートルほどでしょうか。
 
これらが必要なのか?と参加したことがない方から指摘されますが、レースにつかうママチャリの車検がなんとAM3:00からAM5:00の間に行われるという鬼畜っぷりで、場所を確保しなくては、マイナス5度の極寒のなか、ただただ車検時間とレース開始時間を外で待つという憂き目にあう上、レース時間中は待機場所がないという過酷な状況に置かれます。
 
ご存知の方もいらっしゃると思いますが、富士スピードウェイは1周4.5キロ、高低差35メートル、しかも後半半周はずっと上り坂というかなりキツイコースで、休憩待機場所を確保できないということは、ほぼイコール死を意味します。(自宅への帰途は自動車ですしね)
 
なお、この場所取りに失敗した結果、暖を取りつつ眠るために、毎年トイレで寝る人が現れるそうです。
 


途中外出

富士スピードウェイ自体の入退場は、一度入場料1,000円を払えば、入退場許可を示すアームバンドがもらえますので、それを見せることで再入場が可能です。
 
ただ、問題は駐車場です。駐車場の場所取りについては、運営側の目が行き届かないこともあり、基本的には大丈夫です。が、あくまでOKなのは「場所取り」であって、その駐車場に戻ってこれるかは別問題です。というのもの、会場に近い駐車場が満車になったのを確認すると、そこへの自動車での入場は、制限されます。したがって、場所取りした場所に戻ることはできないとかんがえているべきです。
 
実際わたしたちが停めた駐車場の付近に場所取りを行っておきながら、戻ってこれなかった車を数台見ています。
 
食事や入浴をしに外にでることは、ダメだと認識していたほうが良いです。


ルールブックは読んでおこう

ママチャリGPのルールブックはA4で50ページにも及ぶものですが、場内の火気の制限や、場所取り方法まで、かなり事細かに書かれています。
 
実際に会場に行ってみてわかるのですが、ルールブックを読んでいないチームが、テント張り禁止エリアに場所取りを行ってしまっていて注意されたり、火気禁止エリアでBBQを行って注意されたりしていました。
 
前述のとおり、思うような場所を確保できず、暖を取ることができないのは、ママチャリGPにおいては、大変な憂き目に会います。
 
ルールブックはチームで最低2名は完全に目を通しておくべきです。
 


ママチャリGPは大人のたしなみだ!

前述のとおり、ママチャリGPには、非常に事細かなルールが設定されており、また1500チームもの人がひとつの場所でせめぎ合う場所のため、助け合いの精神も必要です。
はっきり言えば、精神が子どもな人にはただただキツいだけの遊びになると思うのです。
 
大人になりたければ、ママチャリGP!


ママチャリGPのリーダーはやってみるべき!

ママチャリGPは前日の場所とりから、帰宅まで、おおよそ3日間、チーム総勢20名弱を統制していかなくてはなりません。この舵取りは、はっきりいって、会社でプロジェクトリーダーをやるより難しいです。基本的には遊びですから、それぞれが思いのままに楽しむように舵取りというのはこんなに難しいのかorz と思いますよ。
 
その分、学ぶところも多いです。ママチャリGPでチームを自分で作ってみるというもの、非常に経験になりますから、皆さんにおすすめします。
 
ちなみに、エントリーは毎年7月頃で、すぐに参加打ち止めになるほど人気のイベントです。エントリー権の確保、チームメンバーの構成、誓約書の堤出、宿の手配、そして場所取り、本番。やることが山積みです。
 
ママチャリGPは戦(いくさ)です!
 
だから面白い!

Webベースのレジスターに簡単にクレジットカード決済機能をPaypalHereでつけてみた

どうもみなさん2014年お正月いかがおすごしですか?
Webシステム屋はお正月は、とても良い勉強期間だったりなんかしちゃったりします。
この期間私は、PayPalHereを勉強してみました。


PayPal Here?

PayPal HereとはiPhoneなどのスマフォやiPadなどのタブレット端末に、
専用のカードリーダーをつけることで、専用端末のレンタルをすることなく、
クレジットカード決済を導入することができるものです。
 
この他のサービスとして、

などがあります。
 
通常クレジットカード決済専用端末を導入するには
数週間の審査と、月額利用料5,000円程度負担しなければなりません。
スマフォ決済であれば、この審査は簡単に、かつランニングの負担は軽くなります。
 
専用端末が悪いような言い方になってしまうので、フォローします。
専用端末のいいところは、
月当たりの決済額が大きくなるごとに決済手数料がやすくなったり、
オンライン決済と合わせて契約すると別々に契約するより負担が軽くなったりしますし、
専用端末を貸し出していただけるサービス提供業者は、
私の経験上、総じてサポート体制がかなり充実しています。
 
専用端末を導入するか、スマフォ決済を導入するかは、
目指す店舗の大きさや、サービスの内容をベースに、
しっかり比較することをおすすめします。


Webベースのレジスター?

東日本大震災の際にユビレジが仮設の店舗で非常に役に立ったと話題になって依頼、
タブレット端末をPOSやキャッシュレジスターにするサービスが、たくさん展開されています。
日本では、タブレット端末によるPOSが大盛況ですが、
海外では、この他WEBベースのPOSソリューションがたくさんあります。
 

 
などが有名ですが、大小かなりの数のソリューションがあります。
POSは複数拠点で利用するようなものでなければ、
仕組みは非常に単純なので、つくろうと思えば、
 

  • キャッシュドロワ制御
  • レシート印刷
  • バーコードリーダー制御
  • クレジットカード決済

 
を除いては、比較的簡単につくることができます。
 
バーコードリーダー機能については、
USB接続のものはバーコードリーダー自体がキーボードとして動いてくれます。
 
レシート印刷については、
一般的なレシートでなくB5などで印刷してOKなら印刷用CSSの適用で解決できますね。
 
キャッシュドロワについては、
Windows利用前提で、USB接続のものであれば、
COMポートから決まった信号を送れば良いので、
実はそれほど難しくないです。
 


クレジットカード決済

ECサイトなどで利用するオンラインのWEB決済であれば、
クレジットカード決済代行会社と契約することで、
規定のWEBインターフェイスに、クレジットカード番号をPOSTなどすることで、
比較的簡単に導入することができます。
 
それならWEBベースのPOSの場合も、決済代行会社と契約すればよいのじゃないか?
とお思いかもしれませんが、
日本国内の代行会社の審査は非常に厳しく、
WEBベースのPOSの利用のために、
決済代行会社との契約のための審査が通る可能性は、かなり少ないです。
 
というのも、POSなどで動作をさせるには「PA-DSS」などの
クレジットカード決済専用のセキュリティ基準に、
POS端末そのものを対応させる必要があり、
この基準に対応していなければ、
クレジットカード各社が利用を許可することはまずないからです。
仮に、審査が通ったとしても、事故などに関して、
全責任をPOS運用者あるいはPOS運用業者が負うことになります。
 
前述のPaypalHereなどスマフォクレジットカード決済サービスや、
専用端末などは、この基準に従った設計がなされています。
 


それなら話は早い!導入だ!

ということで、スマフォクレジット決済を導入だ!
と、思ったらちょっと早計でした。
海外であれば、こういったサービスにWEB APIは付き物なのですが、
前述のとおり、日本では、法的な基準や、審査が非常に厳しい国ですので、
海外でスマフォ決済対応しているサービスでも、
日本国内のみAPI提供をしていなかったり、
十分な説明がされていないケースがほとんどです。
 
PayPalHereに関しても同様で、APIはあるようですが、
公式に十分な説明がなされていないものをつかうのは、
実際にお金のやりとりが行われるサービスで利用するのは
危険としか言いようがありません。
 
さて、どうしたものか…
 
とおもっていたら、PayPal Here にはURLSchemeが搭載されていることを知りました!
これで簡単にWEBベースのPOSにクレジットカード決済機能が導入できます。
 
URLSchemeとは
「アプリケーション名://メソッド?パラメータ」
というようなURLを実行することで、
端末内のアプリケーション制御ができる機能です。
これならjavascriptなどで簡単に作れるじゃないか!!


ってなわけで、作ってみました。

言いたいことはほぼこのクラスの中に入っています。

function paypal_here_helper(){
	
	//商品データ保存用
	this._items = [];
	
	//設定
	this._params = {};
	
	//コンストラクタ
	this.initialize.apply(this, arguments);
	
}

paypal_here_helper.prototype = {
	
	
	//コンストラクタ
	initialize: function( params ){
		this._params['callback'] = params['callback'];
		this._params['merchantEmail'] = params['merchantEmail'];
	},
	
	//商品追加
	add_item: function( itemname, price, quantity ){
		
		var item = {};
		item['name'] = itemname;
		item['description'] = itemname;
		item['quantity'] = quantity;
		item['unitPrice'] = price;
		item['taxRate'] = '0.0';
		item['taxName'] = 'Tax';
		
		
		this._items.push( item );
		
	},
	
	
	//支払い実行
	goto_here: function(){
		
		//設定
		var invoice = {};
		invoice['itemList'] = {};
		invoice['itemList']['item'] = this._items;
		invoice['paymentTerms'] = 'DueOnReceipt';
		invoice['currencyCode'] = 'JPY';
		invoice['discountPercent'] = '0';
		invoice['merchantEmail'] = this._params['merchantEmail'];
		
		
		//URL生成
		var retUrl = encodeURIComponent( this._params['callback'] + "?{result}?Type={Type}&InvoiceId={InvoiceId}&Tip={Tip}&Email={Email}&TxId={TxId}");
		var pphereUrl = "paypalhere://takePayment?returnUrl=" + retUrl;
		pphereUrl = pphereUrl + "&accepted=cash,card,paypal"
		pphereUrl = pphereUrl + "&step=choosePayment";
		pphereUrl = pphereUrl + '&invoice=' + encodeURIComponent(JSON.stringify(invoice));
		
		
		
		//ジャンプ
		location.href = pphereUrl;
	}
	
	
	
};

▲このコードをファイルに保存し、HTMLからロード。
あとは、
 

			//初期化
			var phh = new paypal_here_helper({
				
				//コールバックURL
				'callback': return_url,
				
				//店舗メールアドレス
				'merchantEmail': 'parsley-eater@i.softbank.jp'
			});
			
			//商品追加
			phh.add_item( 'コーヒー', 300, 1 );
			phh.add_item( 'サンドイッチ', 450, 1 );
			
			
			//支払い実行
			phh.goto_here();

とjavascriptを実行すればOKです。
 
コールバックは、GETで
 
Type:「CrediCard」←固定
InvoiceId: 支払いID
Tip:?
TxId:トラッキングコード
 
が返ります。
Tipだけ意味がわかりませんでした…「0」が返っているようなのですが…
これを取得し支払い済みとして処理すればOKです。


簡単!簡単!!

Javascriptでここまで簡単にできるのはいいですねー。
 
と思うのは早計です。いや、仕組みがつくれるのはいいのですが、
これだけ簡単なので、設計や運用に関しては、
通常より遥かに慎重になる必要はあります。
 
またそもそも、前々からおもっている個人的な意見ですが、
金銭のやりとりが実際に発生するものを、
iPhoneなどを通じて行うことに関して、
小売店やサービス提供業者としての資質に疑問を持つ
消費者は少なくないとおもいます。
ましてや、そのiPhoneが誰かのポケットから出てきたものだとしたら…
 
スタイリッシュだとか、簡単だとか、
そういった理由でスマート決済を利用するのは良くないとおもいます。
 
私のこのコードを利用すること自体は、お好きにして頂いて結構ですが、
しっかり決済サービスは「選択」をしてくださいね。

YiiでInter-Mediatorを使ってみる

INTER-MediatorというPHPアプリケーションフレームワークがあります。
HTMLからのDBカラム指定でデータが呼び出せたり、
Javascriptの制御でDB操作ができたりなど、なかなか重宝するフレームワークです。

が、必ずしも万能というわけではないのかなというところがあり、
私はSymfonyなどに代表されるMVCフレームワークにINTER-MEdiator(以下、IMと略す)を統合して、
利用しています。

以前はCodeigniterにIMを統合するという記事を書きましたが、今回はYiiに統合をしてみます。


Yii?

PHPのフレームワークといえば?というところで最初にあがってくるようなフレームワークではないですが、柔軟で高速で、かつ、スカッフォールディングなどベースの生成が頭がいいので、気に入って利用しています。他方CakePHPほどの「なんでも感」はないので、PHPerとしての「地力」が試されるフレームワークであると思っています。


早速やってみましょう

これよりさきはMySQLへの接続を前提としてお話をすすめます。

IMのファイルは、yiiのアプリケーションディレクトリ(通常であればprotected)に配置します。

/protected/Inter-Mediator/...

のような感じですね。
特に何かコマンドを打つ必要はありません。


設定ファイルの書き換え

データベースへの接続設定をIMでも使いまわせるようにするために、
初期値ではメイン設定に閉じ込められているデータベース設定を、
別ファイルに移します。

/protected/config/main.phpの

'db'=> array(
			'connectionString' => 'mysql:host=localhost;dbname=dbname',
			'emulatePrepare' => true,
			'username' => 'user',
			'password' => 'pass',
			'charset' => 'utf8',
		), 

の値の部分をカットして、

'db'=> require dirname(__FILE__) . '/database.php'

とします。新規に/protected/config/database.phpを作成して、その中を

<??php
return array(
			'connectionString' => 'mysql:host=localhost;dbname=dbname',
			'emulatePrepare' => true,
			'username' => 'user',
			'password' => 'password',
			'charset' => 'utf8',
		);

とします。
さらに、main.phpのほうには、Yiiのセッション機能を使えるようにするために、加筆をします。
(IMの設定情報をセッションで保持することで柔軟に利用できるようにします)

//DBを外に
		'db'=> require dirname(__FILE__) . '/database.php',
		
		
		//セッションを追加
		'session'=>array(//追加
				'class'=>'CDbHttpSession',//追加
				'sessionTableName'=>'sessions',//追加
				'connectionID'=>'db',//追加
		),

先ほどのDBの設定の部分の下に、セッションを利用可能にしておきます。
そして、下記に説明するヘルパを自動読み込みさせるために、サードパーティーライブラリのフォルダを自動ロードするように設定します。

	'import'=>array(
		'application.models.*',
		'application.components.*',
	),

とします。

	'import'=>array(
		'application.models.*',
		'application.components.*',
		'application.vendor.*',
	),

に書き換えます。
設定ファイルの書き換えは以上。


ヘルパファイルの作成

続いて、IMの設定をラクにするヘルパファイルを作ります。
/protected/vendor/ImHelper.php
を作成し、

<??php
YiiBase::import('application.Inter-Mediator.*');
class ImHelper
{
	//デバッグ
	private static $debug = FALSE;
	
	// ----------------------------------------------------
	
	/**
	 * IMコードのセット
	 */
	public static function setImCode( $im1, $im2 = array(), $im3 = array() )
	{
		//データベース設定をロードしてIMの引数に設定
		$database = require YiiBase::getPathOfAlias('application.config') . '/database.php';
		$im3['db-class'] = 'PDO';
		$im3['dsn'] = $database['connectionString'];
		$im3['user'] = $database['username'];
		$im3['password'] = $database['password'];
		
		
		//一時コードの発行
		$code = sha1( uniqid( '', true ) );
		$data = array(
			'im1' => $im1,
			'im2' => $im2,
			'im3' => $im3,
			'debug' => self::$debug
		);
		Yii::app()->session['im_temporary_code_' . $code] = $data;
		
		return $code;
	}
	
	// ----------------------------------------------------
	
	/**
	 * IMコードの取得
	 * @param type $im 
	 */
	
	public static function getImCode( $code )
	{
		global $callURL;
		$callURL = Yii::app()->createAbsoluteUrl( 'im/get', array('code'=>$code) );
		require_once 'INTER-Mediator.php';
		$params = Yii::app()->session['im_temporary_code_' . $code];
		//echo 'var test = ' . json_encode($params) . ';';
		IM_Entry( $params['im1'], $params['im2'],  $params['im3'], $params['debug'] );
	}
	
	// ----------------------------------------------------
	
	/**
	 * URL作成
	 */
	public static function getUrl( $im1, $im2 = array(), $im3 = array() )
	{
		$code = self::setImCode($im1, $im2, $im3);
		return Yii::app()->createAbsoluteUrl( 'im/get', array('code'=>$code) );
	}
	
	// ----------------------------------------------------
}

と書いて起きます。

YiiBase::import('application.Inter-Mediator.*');

で、IMのフォルダ内をオートロードの対象にしておきます。


IM自体の改造

IM自体の改造が必要です。

まず、INTER-Mediator.phpを改造します。

if (!class_exists('Crypt_RSA')) {
    require_once($currentDir . 'phpseclib' . DIRECTORY_SEPARATOR . 'Crypt' . DIRECTORY_SEPARATOR . 'RSA.php');
}
if (!class_exists('Crypt_Hash')) {
    require_once($currentDir . 'phpseclib' . DIRECTORY_SEPARATOR . 'Crypt' . DIRECTORY_SEPARATOR . 'Hash.php');
}
if (!class_exists('Math_BigInteger')) {
    require_once($currentDir . 'phpseclib' . DIRECTORY_SEPARATOR . 'Math' . DIRECTORY_SEPARATOR . 'BigInteger.php');
}

//Yiiのオートローダーを一旦解除
spl_autoload_unregister(array('YiiBase', 'autoload'));


if (!class_exists('Crypt_RSA')) {
    require_once($currentDir . 'phpseclib' . DIRECTORY_SEPARATOR . 'Crypt' . DIRECTORY_SEPARATOR . 'RSA.php');
}
if (!class_exists('Crypt_Hash')) {
    require_once($currentDir . 'phpseclib' . DIRECTORY_SEPARATOR . 'Crypt' . DIRECTORY_SEPARATOR . 'Hash.php');
}
if (!class_exists('Math_BigInteger')) {
    require_once($currentDir . 'phpseclib' . DIRECTORY_SEPARATOR . 'Math' . DIRECTORY_SEPARATOR . 'BigInteger.php');
}

//Yiiの再登録
spl_autoload_register(array('YiiBase', 'autoload'));

とします。これは、先のImHerlper.phpでIMのディレクトリ内をオートロードの対象にしたわけですが、PHP拡張である「Crypt_RSA」などのクラスの存在拡張をチェックすると、自動的にファイルを探しに知ってしまうのを回避しています。

続いて、GenerateJSCode.phpを改造します。

public function generateInitialJSCode($datasource, $options, $dbspecification, $debug)
{
	$q = '"';

public function generateInitialJSCode($datasource, $options, $dbspecification, $debug)
{
	global $callURL;
	$q = '"';

としておきます。IMのコードを見ると、$callURLがセットされていれば、このURLを優先して利用する仕組みになっているようですので、globalにして、先のImHelper.php内でコールするURLを指定できるように改造しています。

もしかすると、

if (isset($callURL)) {

if ( $callURL != '' ){

にしておいたほうが賢明かもしれません。


IM処理用コントローラーの設置

次にIMの処理を担うコントローラーファイルを設置します。
/protected/controllers/ImController.php
を作成し

<??php
class ImController extends CController
{
	
	// ----------------------------------------------------
	
	/**
	 * アクセスルール
	 */
	public function accessRules()
	{
		return array(
				'actions'=>array(  ),
				'users'=>array('@'),
			),
		);
	}
	
	// ----------------------------------------------------
	
	/**
	 * IM用コード出力
	 */
	public function actionGet( $code )
	{
		echo ImHelper::getImCode($code);
	}
	
	// ----------------------------------------------------
}

と保存しておきます。アクセス状況によってはアクセスルールを適切に設定したほうがよいでしょう。


準備完了

準備ができました。
あとは任意のコントローラーアクション内で、

$ds = array(
			array(
				'name' => 'categories',
				'records' => 20,
				'paging' => true,
			),
		);
		$def = array();
		$ds2 = array();
		
		$url = ImHelper::getUrl(
				$ds,
				$def,
				$ds2
		);

とすれば、$urlにIMの設定を呼び出すための一時URLが発行されるため、
viewの中で表示するなり、clientScriptクラスに登録するなりすればOK

ImHelper::getUrl()の引数は
IM_Entry()の引数に引き当てられます。
DBへの接続設定はImHelperで自動的に割り当てられるので、不要です。


これで、開発高速化!

現場からは以上です。

Yahoo!ショッピングのカートフォームに無茶をさせる

以前、楽天のカートフォームに無茶をさせるというと記事を書きましたが、
(もう2年も前なのか!?)
今回はYahoo!ショッピングのカートフォームに無茶をさせてみましょう。
 


フォームのソース

まずは、ヤフーショッピングが出力しているコードを見てみましょう。

<form name="form2" method="post" action="https://order.shopping.yahoo.co.jp/cgi-bin/cart-form;_ylc=[セッションコード?]?[ショップID]+[セッションコード?]&ccode=Nat">
<input name="vwitem" type="hidden" value="[商品ID]">
<input name="vwcatalog" type="hidden" value="[ショップID]">
<input name="vwquantity" type="text" value="1" class="ptPrice">
<input type="image" src="http://i.yimg.jp/images/store/shp/bt/bt_003.png" alt="カートに入れる" width="142" height="36" border="0" onClick="YAHOO.JP.sc.addCart(YAHOO.JP.sc.products, YAHOO.JP.sc.prop22);">
</form>

 
こんな感じです。
[セッションコード?]はセッション用の一時コードか何かのようです。
ちょっとこの辺りは追うことができず…
[ショップID]は、Yahoo!ショッピング開店時に申請したショップのIDです。
これはショップURLからも判断出来ます。
[商品ID]は商品を登録した際に、任意で商品につけるコードです。
 


外してもOKなコードがある

上記の用なフォームを作成することで、
ヤフーショッピング用のカートフォームが
作成できることがわかりました。
 
が、そもそも、この通りに作る必要があるのか検証したところ、
どうやらその必要は無さそうです。
セッションコードと思しきコードは省略しても、
ちゃんとカートに商品が追加できることがわかりました。
 

<form name="form2" method="post" action="https://order.shopping.yahoo.co.jp/cgi-bin/cart-form?[ショップID]&ccode=Nat">
<input name="vwitem" type="hidden" value="[商品ID]">
<input name="vwcatalog" type="hidden" value="[ショップID]">
<input name="vwquantity" type="text" value="1" class="ptPrice">
<input type="image" src="http://i.yimg.jp/images/store/shp/bt/bt_003.png" alt="カートに入れる" width="142" height="36" border="0" onClick="YAHOO.JP.sc.addCart(YAHOO.JP.sc.products, YAHOO.JP.sc.prop22);">
</form>

 
フォームタグのaction属性に付けられた難解なURLは、
ここまで単純化してもちゃんとカートに入ってくれます。


オプション的な要素は?

オプション的な要素は任意のオプションを追加することができます。

<form name="form2" method="post" action="https://order.shopping.yahoo.co.jp/cgi-bin/cart-form?[ショップID]&ccode=Nat">
<input type="text" name="色" value="赤" />
<input type="text" name="サイズ" value="M" />
<input name="vwitem" type="hidden" value="[商品ID]">
<input name="vwcatalog" type="hidden" value="[ショップID]">
<input name="vwquantity" type="text" value="1" class="ptPrice">
<input type="image" src="http://i.yimg.jp/images/store/shp/bt/bt_003.png" alt="カートに入れる" width="142" height="36" border="0" onClick="YAHOO.JP.sc.addCart(YAHOO.JP.sc.products, YAHOO.JP.sc.prop22);">
</form>

このようにするとカゴの中に
色:赤
サイズ:M
として商品が追加されます。
 
このオプション値を変更することで、
カートは同じ商品でも、別の明細としてカート内に追加をする仕組みになっているようです。
逆に、カート内に以前に同じ商品IDとオプション値を持つ商品が以前に追加されている場合は、
個数が合算されて追加される仕組みになっています。
 
この法則を使うと、裏技的な使い方として、
オプション値にタイムスタンプなどを埋め込んでおけば、
能動的に明細行をカゴボタンを押すごとに分けることが可能です。
 


楽天より仕組みが簡単

楽天では、楽天側が自動発行するデータベースIDを利用して
カートに商品を入れる仕組みになっているため、
カスタマイズがわかりにくいですが、
Yahoo!ショッピングでは、ショップ側がつけたIDのみを利用するため、
カスタマイズが非常にわかりやすいです。
 
たとえば、
自分のブログに、
前述の仕組みを利用してヤフーショッピングのカートフォームを埋め込んで、
ランディングページを作ったりすることができ、
モール内に閉じがちな、プロモーション手段を少しだけ広げることができます。
 
また、ヤフーショッピングは楽天と違い、
CSVでの商品登録などはオプションではないので、
CSVを通して簡易DBを作ることが可能ですから、
無料のCSV検索CGIなどを利用して、
自社サイトにカートシステムを実現するなんてこともできなくはないです。
 


モールの特性は知っておくべき

フォームなどの特性を知っておけば、
モールの規約の範囲内で、モールの枠を少しだけ超えたプロモーションをすることができます。
私は楽天やらカラーミーショップなど、結構な数を「魔改造」していますが、
フォームを使って実験をしてみた賜物です。
(がゆえに、無茶な仕事がたまに落ちてきたりしますがw)
 
知っていることはとても重要なことです!

Older posts Newer posts