だ。ログ。

開発とかスノボとかやきうとか。

EC-CUBE3のテンプレート内のループ数を取得する

普段のphpだと

for($i=0;$i<=$loop;$i++){
   echo $i;
}

で済むのだが、EC-CUBEPHPコードをテンプレートに書くと基本NG。
じゃあどうやってループ数を取得するか。

{% for Product in pagination %}
             {{ loop.index }}
{% endfor %}

あらかじめ予約語があるのでこっちを仕様する。

ハマスタレジェンドマッチ

はじめて自分と友人で行った横浜スタジアムのライトスタンドから見えた背番号23、強肩とシュアなバッティングのレイノルズが大洋のライトとして守っていた。
多分家族の話しを聴く限り、もっと前にも横浜スタジアムには行っていた。スーパーカートリオを観ているハズだが、覚えているホエールズは須藤監督が指揮をし、屋敷高木を筆頭に世代交代が始まる前のホエールズだったのを覚えている。
それから幾年かが過ぎ、朝7時の水色の103系根岸線に乗り外野ベンチシートに座る為に早朝から並び、島田→佐々木のリレーに酔いしれた。

結局、気がつけば野球が近くに居たのである。
20代前半の人売全盛期に毎日終電常駐で運良く20時過ぎに会社を出て電車は横浜駅を過ぎる。
関内に近づくと煌々と輝く横浜スタジアムが見えてくる。根岸線から見える電光掲示板の B - 相手チームはいつも相手チームの点数が多く入っている。
「ああ、また負けてんのか。」当時スマホが無く、駅で貰ったR25に目を落とす。
それから少し仕事が落ち着き週に1,2回は早く帰れるようになるが、途中経過はいつもベイスターズが負けている。
もう、負ける事が当たり前になっていた。
電車で関内を出て視界には明るい光が感じられるが視線すら上げなくなる。
スポーツ新聞には内ゲバの醜聞、大物選手がFA流出の情報が流れ、大台の負け数が見えてきた事が報じられる程度の扱いであった。

あれから早10年弱、ベイスターズは19年振りに日本シリーズへの出場権を得た。結果は2勝4敗でホークスの強さばかり際立つばかりだった。

いつもなら10月には秋風が吹き、他球団の日本シリーズに一喜一憂したが今年は11月まで真剣勝負を楽しむ事が出来た。
しかしまだ今年はピリオドとなっていなかった。

チケット争奪戦

運良くチケット争奪戦に勝つ事が出来た。
ベイスターズのチケットは正午に先行発売がはじまる。相変わらずサーバーに到達する前にロードバランサに弾かれてエラーページに飛ばされる。
何度かポチポチと試すとチケット購入画面に。この時点で12:13、流石に指定席となるボックスシートは×が並んでいる。
家族を招待する為に内野自由席を選択すると幸運にも購入する事が出来た。
その後、行こうか迷っている友人を待つためにそのまま画面を開き続いてけていたが12:40の段階で内野は△、外野ライトは×が付く。
13:20の段階でレフト外野自由以外が×になり、13:30の段階で全部×印が付いた。この時点で公式ページでの用意したチケットは完売となった。

ただ、この後知人から聞いたがセブンイレブンチケットでは自由席が残っており14時の段階でも購入可能だったそうな。

入場までの長い道のり

今回内野が自由席と言う事もあり、朝から並ばないと良い席は確保出来ないと思い公式からアナウンスが有った7時の整列に間に合わせようとしたが実際に到着したのは7:20
入場待機列はスターサイドゲートからライト8ゲート入場口まで3周しており、1000人以上は並んでいた。その後8時には4周め8時30分には5周めと人が並び続ける。
今度はライト側ではなく、横浜公園の出口側に人を並ばせるように大きく列は周りはじめる。9時前の段階で警備の方から整列をはじめる旨をアナウンス。
整列かと思いきや入場が早まり9:30から入場開始、結局10時前には内野席の確保が終わる。この時点で強い雨、座席確保を終えると大半の人がコンコース内に避難。

その後、10:30くらいに雨に耐えきれず内野ショップに並ぶ。自分が並んだ時は階段で2F手前の折り返しに並んだがその後一気に列が長くなる。
お目当ての鈴木尚典選手と三浦大輔投手のタオルを購入。ポスターは売り切れが目立ち、佐伯選手のタオル等は売り切れ寸前。

11時、家族がハマスタ到着。ここでチケットを自分が持っていたのでチケットを渡しに一旦外へ。
落ち合って入場しようとしたが入場に20分以上かかってしまう。現状ハマスタが工事中のと言うことと入場ゲートが一つしかない。
加えて降っていた雨が完全に止んだ事で一気に人が来場した事で渋滞してしまったものと思われる。

感想

まずこういうイベントを開催したDeNAベイスターズがとうとうベイスターズ、大洋と言う球団の過去に振り向いたと言う印象が強い。
ここまでのDeNAの運営は「これから」のベイスターズは、「これから」の野球は。と事あるごとに大々的に発表してきた。
DeNAベイスターズはこうなります!と言う未来をファンと共有する事で、この先変わる景色をファンだけでなく選手も期待する事を共有出来た。
ただ、それは未来を見続ける事で淀んでいたファンや現状を打破する為の球団のスタンスであり、過去はファンが自嘲してしまうから避けてきたのだと思う。
去年5周年の際に横浜大洋、マリンくんを復活させ少しだけ過去を観る事が出来たが、現役の選手のイベントと言う感が強かった。

横浜スタジアム改修にあたり、ここまで余り接点の無かったOB方が一同に会して「野球」をする。
それすらもはばかられるほど、過去との距離が遠かったがこの日距離を大きく縮める事が出来た。
存命であれば、加藤博一氏の大ヒロカズコールに蒲田行進曲が流れる所が観たかったが今回のこのレジェンドマッチをどこかであの笑顔で観ていてくれたと思いたい。

不遇、と呼ぶにはややおこがましいかもしれない。
球団の体質のみならず、個々の強烈なキャラクターの坩堝であったマシンガン打線に端を発した小さなぬかるみは、絶頂期を過ぎるとじわりじわりと深みをました沼は
いつのまにか閑古鳥が無くオレンジの観客席、ビジターファンが大挙し高い確率で勝ちゲームが観れる場所になっていた。
求心力を失ったチームは個々の成績にのみ注力していき、弱い=ベイスターズと言うレッテルが見事に浸透してしまった。
プロ野球ニュースやその他のテレビメディアでも、他球団に所属している解説者は「元横浜」は出さない人が多かった。

そのぬかるみから確実に脱しつつあるベイスターズ高木豊さん、野村弘樹さん、平松政次さん、斉藤明雄さんが嬉しそうにプロ野球ニュースで解説をしている。
そして、その面々が個々思い入れのあるユニフォームを着て横浜スタジアムで現役を交えた「横浜」と交錯する空間を目の当たりにし
今よりも暗くオレンジ色の目立つ横浜スタジアム、電光掲示板にライトスタンドのセンター寄りに存在したオルガン室が鮮明に思い出された。
試合が終わりインタビューが始まると権藤博さんは「また来年、もう一回やろう!」と力強く話しをしてくれた。

「このユニフォームを着て横浜スタジアムに立つ事はもうないだろう」
佐伯は感慨深そうにスタンドを見回した後に発した言葉。
最後にフロントとのわだかまりに近い感情で出てきてしまった後ろめたさ。
今回参加した以外の当時「選手」だったOBは、やはりその時のベイスターズで時間が止まってしまっていたのだと言う事が認識出来た。
最後にI☆YOKOHAMAのタオルを持った佐伯がはにかみながら「アイラブヨコハマ!」と叫ぶ。

このイベントを通じ球団は過去にあったわだかまりは引き継いでいない。
もっと先輩方に胸を張って横浜OBです!と言ってもらいたい。と言うメッセージを感じる事が出来た。

来年も。と言う事は難しいかもしれない。
ただ、パワプロでしか見たことのないような「夢」をスタジアムから発信したベイスターズ
これも一つの「未来」だったのだろうと思う。

f:id:rider_dice:20171201164457j:plainf:id:rider_dice:20171201164457j:plainf:id:rider_dice:20171201164500j:plainf:id:rider_dice:20171201164459j:plainf:id:rider_dice:20171201164509j:plainf:id:rider_dice:20171201164509j:plainf:id:rider_dice:20171201164515j:plainf:id:rider_dice:20171201164517j:plainf:id:rider_dice:20171201164524j:plainf:id:rider_dice:20171201164526j:plainf:id:rider_dice:20171201164526j:plainf:id:rider_dice:20171201164528j:plainf:id:rider_dice:20171201164452j:plainf:id:rider_dice:20171201164451j:plainf:id:rider_dice:20171201164536j:plainf:id:rider_dice:20171201164536j:plainf:id:rider_dice:20171201164543j:plain

EC-CUBE3のfaviconを変える

/src/Eccube/Resource/template/default/default_frame.twig
を変えられない事もあると思うので。

##場所
/html/template/default/img/common/favicon.ico

これを変更する。
ただし、管理画面のfaviconは別途であり

##場所
/template/admin/assets/img/favicon.ico

となる。両方変えないと管理画面だけデフォルトの帽子にままと言う事がある。
ある程度サイトを動かしてしまっているとガッチリキャッシュされてしまっている事がある。その場合はdefault_frame.twigを以下のように変更
/src/Eccube/Resource/template/default/default_frame.twig

<link rel="icon" href="{{ app.config.front_urlpath }}/img/common/favicon.ico">
##上記を変更
<link rel="icon" href="{{ app.config.front_urlpath }}/img/common/favicon.ico?v={{ constant('Eccube\\Common\\Constant::VERSION') }}">

バージョンを書き加える事で違う物と認識し、ブラウザにて即反映される。
また、スマホのショートカットアイコン等を設定する場合は以下
/src/Eccube/Resource/template/default/default_frame.twig

##ios
<link rel="apple-touch-icon" href="任意のアイコンの場所?v={{ constant('Eccube\\Common\\Constant::VERSION') }}">
##android
<link rel="shortcut icon" href="任意のアイコンの場所?v={{ constant('Eccube\\Common\\Constant::VERSION') }}">

EC-CUBE3のページ管理のdescriptionの文字数を変更する

EC-CUBEの管理画面からページ管理を行った際にSEO対策で行うdescriptionの文字上限数が少ないと結構指摘される。
あまり長すぎてもSEO上良い影響はないとと思うが流石にデフォルトの50文字だと短すぎる。
ここはPOSTした際にコンフィグファイルを観るので、ファイルの修正。

/src/Eccube/Resource/config/constant.yml.dist

#213行目
stext_len: 50
→これを
stext_len: 任意も文字数に

DB上はlongtextで持っているので問題はないが、簡潔にページの内容を伝えられるかがミソになる。
とりあえず100文字にして150文字にしてと足りない分を徐々に上げていく方が良いのかも。

WAFを経由したらIPが複数に。

セキュリティの観点と導入が簡易に出来ると言う事からWAFを導入する機会が増えてきている。
特に管理画面等をIPアドレスで絞った場合に起こりうる事だが、サーバー変数をREMOTE_ADDRから取っていると

111.222.333.444, 123.456.789.120

と言った形で前がアクセス元のアドレス、後ろがWAFのアドレスとして付与されている事が見受けられる。
それもWAFがゾーンでの指定の場合、固定ではなく変動するので一意にし難い。
$_SERVER変数を見てアクセスするIPアドレス「のみ」が入っている変数がどれかと言う事をアプリケーション側で確認し変える必要がある。
今回自分がハマった時には

$_SERVER['HTTP_INCAP_CLIENT_IP']

と言う変数がそれに該当し、変更を行った。
シングル構成や単純な構成であれば、あまりここは気にしなくても良いが大きなシステムになると
「クライアントの接続元はREMOTE_ADDRだから」と言う固定概念に囚われてハマる事もある。

灯台下暗しって事とWAFは今後も導入が増えるのでメモ。

いちいちPHPからCSVにデータをエクスポートする際の文字コード変換を使うのが面倒くさい

タイトル通り。
本当に面倒くさい。古いシステムだと全てのカラムにmb_comvert_encodingが書いてあり人的なミスでエンコードを忘れやすい。
ふと調べていたが、ファイルに保存する際にこれにした方が楽。

fp = fopen('hogehoge.csv', 'w');
stream_filter_prepend($fp,'convert.iconv.utf-8/cp932');
fopen($fp, "w");
foreach($data as $v){
    $line = "hoge,fuga,moge";
    fwrite($fp, $line . "\n");
}

いちいち文字コードをアレコレしなくても stream_filter_prependを掛けておけばそれでよし。

EC-CUBE3のClassErrorを解消する。

自分で新たに作ったClassファイルが有り、コントローラに記述をする。

	$Sender = new \Eccube\Sender\Sendar();
	$Sender->setRequest(array("order_id"=>$orderId));
	$Sender->sendData();

自分が作ったのは商品購入 ShoppingController.phpの商品購入コンバージョン用の新クラス。
この新たに追加したクラスを読み込むと以下のようなエラーが出る

ClassNotFoundException in ShoppingController.php line xxx:
Attempted to load class "Sendar" from namespace "Eccube\Sender".
Did you forget a "use" statement for another namespace?

namespaceが解決出来てない、まずこのクラスってあるか?
ってな事をエラーとして吐いてくる。ローカルや開発では動いているが、ステージングに新たに入れた時のみこんなエラーが出る。

この原因はキャッシュ。
/app/cache/
内のデータを削除すると正しく動作した。

うーんなんだかなあ。。