読者です 読者をやめる 読者になる 読者になる

だめグラマーの独り言

40過ぎのおっさんがWeb系プログラム関連のいろいろを多分に私見で綴るブログ

デビルズ・アドボカシー

デビルズ・アドボカシーという言葉をご存知でしょうか?

「デビ~ルズ!アドボカシーーーー!」
って言うとちょっと必殺技っぽくて好きな言葉ですw

たまに話しをしていると、やたら反論をしてくる相手っていませんか?
単なるひねくれた性格や、やっかみで偏屈な人(w)なのかもしれませんが、それを意図的に行うのがデビルズ・アドボカシーです。
スペルはDevils(悪魔の)Advocacy(弁護)。

「悪魔の弁護」なんて言うとちょっとおっかない印象がありますが、意図的に反対意見をぶつけることで停滞しがちな議論を活発に動かすというのが目的です。
朝まで生テレビの田原さんや、テレビタックルでのタケシさんなど、あえて喧嘩口調で相手に反論をぶつけているのを見たことがあると思います。あれこそがデビルズ・アドボカシーです。

ただこれはさじ加減が難しく、ともすれば単なる口喧嘩になりかねません(;・∀・)
実社会でないWeb上の掲示板なんかでやると確実に荒れます( ̄▽ ̄;)

勘違いしないでほしいのは「相手を非難」することが目的ではなく、最適解を導き出すために「YES!YES!」だけではなく「NO!」と否定的な側面からの議論を促すことが目的です。
非難が目的ではありませんから、あくまでもそこを「感情的」に行ってはダメです。
いかに「論理的」に反論するかがポイントです。
しかも「本来は相手が正しい」と思っていても、あえてそれに理論の穴を突いて反論するわけですから、そこで破綻してしまうと「何あいつトンチンカンな反論してんの(;´∀`)」と悲しい結末になります(´・ω・)

かようにさじ加減の難しいデビルズ・アドボカシーですが、例えば穴がある理論を強引に進めようとしている人には考え直すきっかけになったり、また逆に満場一致で決まりそうな議論でも、あえて反対意見を述べることで「やっぱこれが正しい!」と、より強い結束に支えられた意見になっていくわけです。

なので、この反対意見を言う人は目上の人が行ったほうがいいでしょうね。
立場が下の人がこれを行うと、後の生活にまで影響しかねませんので(;・∀・)
あくまでも反論は議論の上だけにした方がいいですよ(;´∀`)
さもないと・・・あ、俺はデビルズ・アドボカシーを行ったことで、あなたの生活や仕事関係にどのような支障が出たとしても保証できかねますのであしからず( ̄▽ ̄;)

CakePHPでPHPExcelを使った際、データの読込でハマったこと(toArrayメソッドについて)

備忘録的にCakePHPに組み込んだPHPExcelプラグインのtoArrayメソッドの引数について。

どのページを見てもエクセルデータを読み込んだ後、toArrayメソッドで全データを読み込む場合

$data = $obj->setActiveSheetIndex(0)->toArray(null, true, true, true);

とお題目的に書かれているだけで、引数に関する説明がない( ̄▽ ̄;)
いやきっとどこかに日本語で説明されたページはあるんだろうけれど、俺には見つけ出せませんでしたil||li_| ̄|○il||li

なので忘れないように自分的備忘録。

toArrayの第一引数は
Value returned in the array entry if a cell doesn't exist.
直訳すれば、セルが存在しない場合、配列エントリに返される値。

なのでこれはnullのままでOKなはず。
これを「""」(空文字)にしたらどうなるかとかやったことないけれど、受け取った側の変数で""(空文字)になるってことなのかな?(おそらく)

第二引数は
Should formulas be calculated?
直訳すれば、数式を計算すべきか?
つまりそのまま数式として文字列的に読み込むならfalse、数式に計算された結果を読み込むならtrue。
これはその後またエクセルで出力するような二次利用が目的じゃなければ計算された結果を読み込んで利用したいのでtrueが多そう。

問題は第三引数。
Should formatting be applied to cell values?
直訳で、セル値に書式を適用する必要がありますか?
ここは利用方法によって分かれそう。
ネットで探すと、この第三引数をみんなtrueにして全セルに書式が適用されたデータとして扱っていることが多い。

例えば日付データなんかの場合だと、エクセルでは1901年1月1日を起点としてシリアル値と呼ばれるただの経過日数(数値)が入っている。
でもそれをエクセルの書式設定でxxxx年xx月xx日とかxxxx/xx/xxとか人間の目でわかる文字列に自動的に変更されているわけ。
これもそのまま表示するとか保存するとかならtrueのままでいいのだろうけれど、PHP側でそこから何日後とか、データベースに日付書式で保存するとか、二次的な利用を考えるならfalseにしてシリアル値として読み込み、PHP側で所定の書式に書き換えてあげた方が間違いない気がする。
なので、俺はPHPExcelでエクセルファイルを読み込む場合、第三引数はfalseにしている。

余談だけれど、「/」で年月を区切った場合、「-」で区切った場合は、英文だとちょっと意味が違ってくる。年数を4桁で表示するならそれほど問題はないんだろうけれど、今回コーディングしていた環境ではちょっと問題が出た。
trueにして読み込むと、例えばエクセルのあるセルに「2010/10/1」って書いてあった場合、それをPHPExcelを通してPHPにデータの引き渡しをした際、齟齬が出てしまった(´・ω・)
内部的に「/」区切りの年月日は「DD/MM/YY」の英文扱いになってしまい、妙な日付がデータベースに保存されてしまった(;´Д`)
ちなみに「-」区切りの年月日が書かれていた場合は「YY-MM-DD」扱いになり日本語的順序で読み込めた。
ここはそのエクセルファイルを作成した各人の胸先三寸になってしまう部分なので、ソース側ではどちらにしてもシリアル値で受け取り、PHP側で年月日を正しく解析して扱うことにした。
例えば仕様で「エクセルのその年月日入力欄には、必ず【-】区切りで年月日を入力する」みたいに絶対的に定義されているなら「/」の場合は?とか「,」の場合は?なんて考えなくていいんだろうけれどね(;・∀・)

んで、最後は第四引数。
False - Return a simple array of rows and columns indexed by number counting from zero.
True - Return rows and columns indexed by their actual row and column IDs.
これも直訳。
Falseの場合は0から数えてカウントされた行と列の単純な配列を返します。
Trueの場合は実際の行IDと列IDでインデックスを付けた行と列を返します。
これはそのまんま。
Trueにすると後のプログラム側でエクセルの「A1」欄に書かれたデータは、二次元配列の$変数[1]["A"]に入る。
Falseにすると、同じくエクセルの「A1」欄に書かれたデータは、二次元配列の$変数[0][0]に入る。
ここも見解の別れる所なのかもだけれど、俺的には直感的なTrueが楽でした( ´ー`)

ってことで備忘録的なメモでした・・・っとw

日本のSNSシェアについて思うこと

今日はちょっと長文( ´ー`)
結果から言うとInstagramネガキャンになってしまっている気がしなくもないのですがご容赦を( ̄▽ ̄;)

こういう商売をしていると「営業ツールや広告媒体としてどんなSNS利用するのがいいのかなぁ」というご相談をたまに受けます。

最近では「Instagramのユーザー数が6億人を超えた」とか「Twitterユーザー数をInstagramユーザー数が超えた」などSNSの栄枯盛衰が盛んに叫ばれていますが、それはあくまでもグローバル視点で見て・・・です。
はたして国内ではどうなんでしょう?

ご自分が今すでに利用しているSNSをイチ押ししたい気持ちはわかるんですけれど、商売柄公平に情報を探してみました。
うまいことそういうことを綺麗にまとめられているサイトが2つ。

http://gaiax-socialmedialab.jp/post-30833/gaiax-socialmedialab.jp

http://www.uniad.co.jp/260204www.uniad.co.jp

情報を取得した時期がまちまちで一概には言えませんが、数字から読み取れる情報だけ比べるなら国内ではアクティブユーザー数から言ってTwitterFacebook、LINEの三つ巴の戦いって感じです。
Instagramはまだまだ他SNSの1/10~1/4前後のアクティブユーザー数で、国内でならもう少し流行り廃りを静観していてもいいかなってくらいのユーザー数の差があります。

世界で見るなら
FacebookInstagramTwitter >>(越えられない壁)>> LINE
なのでしょうが、日本で見るなら
LINE > FacebookTwitter >>>> Instagram
・・・という感じです。

ではなぜこれほど「InstagramInstagram!」と耳にするようになったのでしょう?
原因としては以下の様なことが考えられます。

1,「世界で」という記事を国内でも同数比の情報として鵜呑みにしている。
2,ネット上でバイアスのかかった記事を多く目にしている。
3,PPAPの爆発的人気などから有名人が多く使っているイメージが定着している。

1については「うんまぁ情弱乙」ですね( ̄▽ ̄;)

2については「『ニュース』になっているかどうか」だと思います。
ニュースになるため・・・言い換えるならインターネット上に拡散されるためには、ある程度「劇的」であることが求められます。
そこで「小が大を倒した」とか、意味は少し違いますが「勧善懲悪」的なコンテンツは日本人大好きです(;・∀・)<私も大好きですw

また、当然その「大」なコンテンツを利用しているマジョリティにとっては他人事ではないため目が集まります。
ニュースを発信している側、コンテンツ作成側など、言い換えれば人の注目を集めたい側としてはマジョリティへのネガティブキャンペーンは多くの耳目を集められるので、これでもかと「○○はやばい」「○○はもう終わりだ」などとバイアスをかけて書き立て、当然それを目にする機会も増えるって寸法です。

3については確かに海外では前述のようなSNSシェアなんですから、海外の有名人が多く使っているのも当然です。
そういう方々が取り上げた情報はそれだけでインターネットに拡散するので、爆発的に流行ったりするわけです。
さらには世界の「セレブ」や「有名人」が使っているという情報があれば、日本でも見栄が商売の芸能人や有名人も使うので、時々「○○(有名人)のInstagramにこんな絵が~」なんてニュースになり、Instagramって言葉を耳にする機会が増えるって寸法です。

そういう方々のInstagramならとんでもない拡散力、影響力がありますけれど、結果から言ってフォロワーが数千人、数万人いれば、それはInstagramに限らずTwitterであれFacebookであれ影響力はとんでもないです。

結論。
今現在の日本で「InstagramInstagram!」いう方は、よほどすでに自分のInstagramのフォロワーさんが多い方か、「木を見て森を見ず」ではありませんが「森を見て木を見ず」でインターネットの情報に踊らされている情弱・・・ってことでしょう。
 
 
さて、今後Instagramはどうなるのかという予測です。
予測なので、ここからは完全な私見ですからあしからず(;・∀・)

一時期Pintarestを楽天が公式採用したって話しがあり、「これからはTwitterよりもFacebookよりもPinterestだ!」なんてEC業界界隈が慌ただしかった時期がありました。
・・・が、結果を見ていただけば分かる通り、今や世界でも国内でもユーザー数は僅かです。
特に国内では散々たる結果と言ってもあまり語弊はないでしょう。

なぜこれほど流行らなかったんでしょう?
思うに日本人は強烈に行間を読める能力を持っている人が多くて、絵よりも文字の文化だったから、という気がします。
(何度も書くけれど私見ですよw)

日本人は昔から俳句や短歌など、行間を把握して情景を浮かべるようなスーパー文章力とでも呼ぶべき文化を有しています。
最近では出典不明の逸話とも言われている「I love you」を「月が綺麗ですね」と訳した夏目漱石ですが、逸話だとしても一般的言語の理解の範疇を超えていますし、超えていますが「なるほどなぁ」なんて納得させられてしまいます( ̄▽ ̄;)

そういうスーパー行間把握術とも言えるような文化をして、流行るべくして流行ったのがTwitterFacebookやLINEだったのではないでしょうか。
そういう文化ですので、「まずは絵ありき」といったPinterestは流行りませんでしたし、SnapChatやInstagramSNSの世界比率に比べれば、日本ではあまり流行っているとは言えません。

ってことで、おそらくはInstagramもその流れを踏襲するんじゃないのかなぁと、個人的には推察しています。
ただそれでもある一定の年齢層以下の方たちは、そういった「絵ありき」の文化に馴染んできていますから、今後そういう人たちが社会を回す時代になった時には、また少し話は違ってくるかもしれませんw

ただ将来的にも日本独特の「恥じらい」や「奥ゆかしさ」がなくなり、自己顕示欲丸出しな「個人情報?何それおいしいの?」って感じのSNSへの顔出し映像や動画、Youtubeやニコ動にある「俺を見ろ!」的動画が氾濫する日本には、これ以上あまりなってほしくはないなぁ・・・なんて老害をこじらせたおっちゃんは思いますけどね( ´ー`)

びっくりするほど放置してた(;・∀・)

その後会社も変わり、今は肩書だけ副社長なんて名前ですが、結局二人しかいない会社ので扱いは平社員と変わりません( ̄▽ ̄;)
むしろ「役員」なんて肩書になってしまったので、残業代が出ません(;・∀・)
そして結局まだひたすらコード書いてます。

CakePHPでシステム的なもの作ってるので、忘備録的に一つ・・・

デフォルトでpagenateのmaxが100になるなんて知らなかったぁぁああああヽ(`Д´)ノ

例えば

$this->set("hoges", $this->Paginator->paginate());

としてその前に何の設定もなく、viewにデータを渡そうとした時、どうやらlimitが100になってしまうらしい(´・ω・`)
知らんかったよ_ノ乙(、ン、)_

なので、この場合、最大を50とかにしようとするなら

$this->Paginator->settings = ["limit" => 50];
$this->set("hoges", $this->Paginator->paginate());

こんな感じにしないといけない。

んで、できれば制限なく表示させたいときがあるかもしれない。
そういう場合は

$this->Paginator->settings = ["limit" => $this->ModelName->find("count")];
$this->set("hoges", $this->Paginator->paginate());

・・・ではダメでした( ̄▽ ̄;)<結果から言って

limitだけじゃなくてmaxLimitってオプションもあるらしいんすわ(;・∀・)
なので

$cnt = $this->ModelName->find("count");
$this->Paginator->settings = ["limit" => $cnt];
$this->Paginator->settings = ["maxLimit" => $cnt];
$this->set("hoges", $this->Paginator->paginate());

とすることで、ようやく制限に引っかからなくなりましたよっと( ´ー`)

GoogleMapにマーカーを表示する

昨日の続き。

地図を表示させただけじゃなくてマーカーを表示してみましょ。
地図を描くまではまったく一緒。
その後、google.maps.event.addDomListener内に

// マーカー表示する緯度経度を指定するLatLng型の変数作成
var pos = new google.maps.LatLng(xx.xxxxx, yy.yyyyy);

// そのポジションへマーカーを立てる一文
marker = new google.maps.Marker(
{
  position:pos, // マーカーを立てる位置
  map:map, // マーカーを表示するMapオブジェクト
  title:'ひゃっはー' //マーカーにマウスオーバーした時に表示される文字列
});

これでpositionの場所にデフォルトのマーカーが表示されます。
google.maps.Markerにはオプションがいっぱいあって

オプション名 説明
clickable boolean true の場合、マーカーはイベントイベントを受け取る。デフォルト値は trueなので普通は指定する必要なし。
cursor string マウスオーバー時に表示されるマウスのカーソル。
draggable boolean trueの場合、マーカーをドラッグ可。デフォルト値は false。
flat boolean true の場合、マーカーの影は表示されない。
icon string,MarkerImage 前面のアイコン。Googleで用意されたアイコンや自前のアイコンも使える。(URL指定)
map Map,StreetViewPanorama マーカーを表示する地図。(必須)
positi6on LatLng マーカーの位置。(必須)
shadow string,MarkerImage 影の画像。自前でも作成可能(URL指定)
shape MarkerShape ドラッグ/クリック用の画像マップの領域の定義。
title string マウスをマーカーにロールオーバーした時に表示されるテキスト。
visible boolean trueの場合、マーカーが表示。
zIndex number 地図上のすべてのマーカーがzIndex順に表示されるが、デフォルトでは、緯度を基準に低緯度が手前で重なるのでデフォでおk。

マーカーを設置した後で、JavaScriptでオプションを変更することも可能。
setOptionsって関数がある。
ちなみにmapオブジェクトのオプション(縮尺や中心位置等)も変更できるので、Mapの外から何かのボタンをおすことで、Mapの見た目を変更したりマーカーの位置や見た目を変更することも可能。

次回は地図に複数のマーカーを置いてみよう。

GoogleMap API V3

先月まで仕事でとあるページにGoogleMapを実装させていたのでソレにまつわるTipsをいろいろ

まずGoogleMapを表示させるには
headタグ内

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>

headタグ内でgooglemapのAPIをロードします。
URL最後のfalseはPC向けページならfalse、スマホGPS搭載機向けページならtrueを使用します。(現在地表示ができるようになります)
標準的にjQueryと併用する方も多いので、jQueryAPI読み込みに記述して下さい。

JavaScript

<script type="text/javascript">
// jQuery書き出しのお約束
jQuery(function($) 
{
  // すでにonload属性で何かJavaScriptが動いていたとしても
  // 気にせず地図表示させるためのページ表示イベントリスナー
  google.maps.event.addDomListener(window, 'load', function()
  {
    // 地図を表示させる位置(DIV)の取得
    var mapdiv = document.getElementById("map_canvas");

    // 表示する地図のオプション
    mapOptions = {
      zoom: 11, //地図の縮尺
      center: new google.maps.LatLng(xx.xxxx, yy.yyyy), 地図の中心地点(緯度と経度)
      mapTypeId: google.maps.MapTypeId.ROADMAP, 地図の種類(後述)
    };

    // 地図を所定の位置に書き出す呪文
    map = new google.maps.Map(mapdiv, mapOptions);
  });
});
</script>

地図を表示するだけならこれだけで表示できます。
地図の種類ですが、文末の「ROADMAP」を以下に書き換えるだけで、いろんなタイプの地図を表示することができます。

  • ROADMAP
    • デフォルトの2DMapを表示します。
  • SATELLITE
    • 空撮写真地図を表示します。
  • HYBRID
    • 空撮写真とデフォルトの地図レイヤを組み合わせて表示します。
  • TERRAIN
    • 等高線を引いたような地図を表示します。

SyntaxHighlighterの動作実験

どうしてもソースコードを書くことが多くなるので、ぜひSyntaxHighlighterが完動するようにしておきたい為、いろいろと動作実験。

<?php
    $str1 = "apple";
    $str2 = $str1 . "google";
    echo $str2;
?>

とりあえず「はてな表記モード」にすればそれなりに見えるし、ヨシとするかなぁ(;´Д`)
ただ、本来はてな表記モードだと、>|php|とか言語指定すれば、「変数」や「"」内部を着色してくれるはずなんだけれど、ページデザインが優先されるみたいで着色されてないんだよなぁ(;´Д`)
行数表示もないし・・・
ん~微妙(´・ω・`)