Haxe OpenFL でゲームを作る

マルチプラットフォーム対応ってのが嬉しいHaxe OpenFLですが、肝心な情報ページが少ないのが悩みの種。
FlashDvelopを入れて・・・って辺りは分かるんだけど、じゃあ、アプリをどうやって作ったらいいの?
って辺りまでカバーしたページは実に少ないですね。
アプリにもいろいろありますが、ここはいっちょゲームアプリってやつにチャレンジしましょう。
なんて言ったって完成したら自分で遊べるって辺りが良い。
まずは単純な2Dゲームからってことで、ここからスクリプトコードを頂いてきてFlashDvelopで適当なOpenFLプロジェクトを作ってMainに貼り付ければとりあえず簡単なゲームの出来上がり。
あとはいろいろアレンジを加えていけばいいだけなので、楽しみながらHaxeを学んでいけるはず。

バリューコマースのウェブサービスを利用してみた

バリューコマースはヤフーやアマゾンも取り扱う大手のASPなので、
どんなジャンルのサイトであっても、
相応しい広告がゴロゴロしているので紹介しやすいのでは?

サクッとバリューコマースウェブサービスを体感することができるサンプルコードを掲載しました。

ワードプレスの投稿欄なんかに貼り付けて実行することも出来ます。

ページャーも含めて動作させるにはワードプレス側のリライト機能を制御する必要がある。

バリューコマースで取得するトークンが必要です。

<?php

/**********************************************************************/

// バリューコマースWEBサービス
$token = ""; // トークン

/**********************************************************************/
/**********************************************************************

// カテゴリー(参考)
"computers"         (コンピュータ)
"electronics"       (家電、AV機器) 
"music"             (音楽、CD) 
"books"             (本、コミック) 
"dvd"               (DVD) 
"fooddrink"         (フード、ドリンク) 
"fashion"           (ファッション、アクセサリー) 
"beautys"           (美容、健康) 
"toysgameshobbies"  (おもちゃ、ホビー) 
"recreationoutdoor" (レジャー、アウトドア) 
"homeinterior"      (生活、インテリア) 
"babymaternity"     (ベビー、キッズ、マタニティ) 
"officesupplies"    (ビジネス、ステーショナリー"

***********************************************************************/

echo '<div style="width:80%;margin:5% auto;">';
echo '<div style="margin:0; padding:0">';

?>
// 検索フォーム
<div style="margin:0 0 2% 0;">
<form name="searchform" id="itemsearchform" method="get" action="">
<input type="text" name="keyword" id="itemkeyword" value="" />
<input type="submit" id="itemssubmit" value="検索" />
</form>
</div>
<?php

$keyword = htmlspecialchars($_GET['keyword'], ENT_QUOTES);

// URLエンコード
$e_keyword = urlencode($keyword);

$page = (empty($_GET['page'])) ? 1 : $_GET['page'];

$baseurl = 'http://webservice.valuecommerce.ne.jp/productdb/search?';

$vcparam = array();

// キーワードをセット
if ($e_keyword != "") {
  $vcparam['keyword'] = $e_keyword;
}

// リクエストパラメーターをセット(任意)
$vcparam['token']            = $token; // トークン
$vcparam['results_per_page'] = 10; // 1ページ毎の結果件数
$vcparam['sort_by']          = ''; // ソートの属性
$vcparam['sort_order']       = ''; // ソート順(昇順または降順)
$vcparam['category']         = ''; // カテゴリー
$vcparam['stock']            = ''; // 検索対象の在庫状況
$vcparam['ecCode']           = ''; // 検索対象のECサイトコード
$vcparam['merchant']         = ''; // 検索対象のECサイトを指定
$vcparam['product_id']       = ''; // 商品識別コード
$vcparam['sub_store']        = ''; // ECサイトのサブストアID
$vcparam['adult']            = ''; // アダルト商品を検索結果に含めるかどうかの指定
$vcparam['price_max']        = ''; // 最大価格
$vcparam['price_min']        = ''; // 最小価格
$vcparam['rate_max']         = ''; // 最大報酬率
$vcparam['rate_min']         = ''; // 最小報酬率
$vcparam['fixed_max']        = ''; // 最大定額報酬料
$vcparam['fixed_min']        = ''; // 最小定額報酬料
$vcparam['fee_max']          = ''; // 最大報酬額
$vcparam['fee_min']          = ''; // 最小報酬額
$vcparam['page']             = $page; // 表示する検索結果のページ番号
$vcparam['format']           = 'json'; // 検索結果のフォーマット

// 各パラメーターデータを'&'でつないでいく
foreach ($vcparam as $vckey => $vcvalue) {
    $pala .= '&'.$vckey.'='.$vcvalue;
}

$vcurl = $baseurl.$pala;

// レスポンスデータを取得
$vc_json = @file_get_contents($vcurl, true);

// デコード
$Items = json_decode($vc_json);

$ItemArray = $Items->items;

// ステータスを取得
$status = $Items->status;

// 商品数を取得
$resultCount = $Items->resultCount;

// 総ページ数を取得
$pageCount = $Items->pageCount;

// レスポンス商品数が100000を超えるようなら100000に制限
if($resultCount > 100000){
  $resultCount = 100000;
}

// 総ページ数が10000を超えるようなら10000に制限
if($pageCount > 10000){
  $pageCount = 10000;
}

// 次ページ、前ページをセット
    $nextpage = $page+1;
    $prevpage = $page-1;


// レスポンス表示部分

// ステータスがOKなら商品データを展開
if( $status == 'OK' ){

	foreach ( $ItemArray as $item ) {
		
		echo '<div style="width:154px;float:left;"><a href="'.$item->link.'" rel="nofollow" target="_blank"><img src="'.$item->imageLarge->url.'" alt="" />'.$item->pvImg.'</a></div>';

		echo '<div style="font-weight:bold;margin-left:155px;"><a href="'.$item->link.'" rel="nofollow" target="_blank">'.$item->title.$item->pvImg.'</a></div>';

		echo '<div style="color:#ff0000; font-weight:bold;margin-left:155px;">価格 '.number_format((int)$item->price).' 円</div>';

		echo '<div style="margin-left:155px;">'.mb_strimwidth($item->description, 0, 380, '...', 'UTF-8').'</div>';

echo '<div style="clear:both; visibility:hidden; width:100%; height:10px;">クリア</div>';
echo '<hr style="width:100%;border:1px dotted #bbb;" />';

	} // foreach end

}
if(isset($item)){ echo "<span>全 ".number_format($resultCount)." 数</span>"; }

// ページャー
echo '<div>';

$nextpage= '2'; //

$url_a ="<a style='background-color: #ffffff; color: #ff0000; margin: 0; padding: 0.2em 0.5em; border: solid 1px; text-decoration: none;' href=\"?keyword=$e_keyword&page=";

$url_b ="\"";

$html_Page_Link = Page_Link($pageCount,$page,$nextpage,$url_a,$url_b);

echo $html_Page_Link;

function  Page_Link($pageCount,$page,$nextpage,$url_a,$url_b){

	$html = "";

	if($pageCount < 1) return $html;

	if($page > 1) $html .= $url_a.($page-1).$url_b.' style="background-color: #ffffff; margin: 0; padding: 0.2em 0.5em; border: solid 1px; text-decoration: none;"'.">&laquo;</a>";

	$prevpage = $page - $nextpage;

	while ($prevpage < $page) {

		$prevpage++;

		if($prevpage > 1) $html .= $url_a.($prevpage-1).$url_b.">".($prevpage-1)."</a>";

	}

	$html .= '<span style="	background-color: #ff0000; color: #ffffff; margin: 0; padding: 0.2em 0.5em; border: solid 1px #ff0000; text-decoration: none;">'.$page.'</span>';

	if($page < $pageCount){

		$pageCount = $pageCount - $page;

		if($pageCount > $nextpage) $pageCount=$nextpage;

		$plus=0;

		while ($plus < $pageCount) {

			$nextpage=$page+$plus+1;

			$html .= $url_a.$nextpage.$url_b.">".$nextpage."</a>";

			$plus++;
		
		}
		
	$html .= $url_a.($page+1).$url_b.' style="background-color: #ffffff; color: #ff0000; margin: 0; padding: 0.2em 0.4em; border: solid 1px; text-decoration: none;"'.">&raquo;</a>";
	
	}

return $html;

}

echo '</div>';

echo '</div>';
echo '</div>';

?>

リンクシェア apiサンプル

リンクシェアのウェブサービスについての案内、詳細解説は、極めて雑で、結構、しんどいですね。

特に困惑されがちなのは、クロスオーバーサーチとAPIディベロッパーポータルにおいてのAPIを分けて感がる必要があるとこ。

APIディベロッパーポータルで作成するAPIは、いわゆるアプリで、アクセストークンにも有効期限があり、恒久的に利用するウェブサイトには当てはまらない。

楽天の経営者じゃないので、よくわからないが、API利用させてあげるからそのかわりにアプリ作って提供してね・・・みたいな感じですかね?

クロスオーバーサーチ上では楽天市場商品が扱えないのも、意図的にAPIディベロッパーポータルに誘導しようとしているとしか思えない。

まあ、楽天商品でアフィリエイトしたいなな、はじめから楽天ウェブサービスを使えばよいだけだけど・・・。

ということでクロスオーバーサーチに限って言うなら、利用はとっても簡単で、サイトのアクセストークンを設定してクエリを送ればそれなりのレスポンスが返ってくる。

が、気を付けなければならないのは、広告インプレッションの計測用のイメージタグを、こちら側で作らなければならない。

バリューコマースウェブサービスであれば「pvImg」で取得できるので楽なのですが、クロスオーバーサーチは・・・・・、そこまで気が利いてないようで。

広告インプレッション・・・すなわち広告が何回表示されたかってことですが、これが分かるのと分からないのとでは、その後の対策に大きく影響してくる。

仮に広告インプレッション、クリックが共にASPの管理画面で確認できるのであれば、広告インプレッションをカウントするイメージタグが広告リンクに入ってなければ、広告インプレッションはいつまでたっても0のままになる。

とうぜんと言えばとうぜんなのですが、ASP側ではリンク改変は禁止・・・みたいな警告はするが、この広告インプレッションタグのことに関しては言及してないのが逆に不思議。

たとえば仮に広告リンク経由で成約につながったとしても、広告の表示が確認できませんので承認を破棄します・・・・みたいなこともありうる。

広告インプレッション用のタグを広告リンクコードに含めるのはASP側にとってもメリットはある。

たとえばリダイレクトを使ったアフィリエイトなど、ページアクセスがあると強制的にアフィリエイトリンク先に飛ばすなど、クリックカウントは上がるが、広告表示回数は0・・・であれば不正発覚の手掛かりになる。

だから広告インプレッション用のタグが入らないアフィリエイト広告リンクを提供してるASPは意図が理解できない。

アフィリエイター、ASP側にしてもクリック回数しか分からない。

元々、機能していないアフィリエイトリンクと疑われても仕方ないのでは?

リンクシェアのAPI、ここではクロスオーバーサーチによるウェブサービスについてですが、広告リンクコード内に広告インプレッション用のイメージタグをしっかり入れておきましょう。

ウェブサービスを介さずアフィリエイトリンクコードを作成し、リンクコードの構造をみて、同様に生成されるようにしておけば間違いはないでしょう。

リンクシェアAPIの広告インプレッション用のイメージタグの作成方法

ウェブサービスの広告表示カウント用のイメージタグについて

リンクシェアのウェブサービスでは、レスポンスデータから表示カウント用のイメージURLを取得することは出来ません。

ウェブサービスを使わずリンク作成画面で作成する広告コードには、しっかりと表示カウント用のイメージタグが挿入されているのに、ウェブサービスにおいては単純に広告リンクしか取得できないのはどうなの?

この辺りについてリンクシェアやAPIディベロッパーポータルに詳しい解説がないのは戴けませんね。

これはリンクシェアに限ったはなしではなく、他のウェブサービスにおいても、このあたりは詳しく載っていない。

そもそもきちんと広告が表示されたうえでクリック誘導が成されたかの確認が、表示カウント用のイメージタグの役割だと思うのですが、逆に考えると、仮にクリック誘導、成果に結びついたとしても、広告表示の確認がとれないので承認できません・・・、みたいなことになりかねないのではないでしょうか?

本来、手動で作成した広告コードとウェブサービスにおいて生成される広告コードは同一のものであるべき。

このような観点でみればウェブサービスで生成されるコードにも広告表示カウント用のイメージタグを付加すべきではないでしょうか?

バリューコマースウェブサービスにおいては、レスポンスデータから、ちゃんと表示カウントようのイメージURLが得られるようですが、リンクシェアのウェブサービス・・・、楽天リンクシェアのウェブサービスなのかよく分かりませんが、そこまで気の利いた配慮はありません。

でどうする?

ってことになりますが、このサンプルコードに解決策が載っています。

2017 千葉県知事選挙 候補者一覧

千葉県知事選挙 候補者詳細

氏名  :すみや 信一(すみや しんいち)
公約  :受験競争や貧困で子どもが泣くことのない県政に取り組む、ブラック企業を千葉県からゼロにする。
党派  :無所属・新人
支援  ;共産党
肩書  :元県立高校教諭
生年月日:昭和29年8月8日(62歳)生まれ
学歴  :
家族  :
公式HP :http://sumi8.net/
備考  :
戸籍名「角谷信一」

氏名  :竹浪 永和(たけなみ ひさかず)
公約  :防災、雇用、自殺、子宝、結婚の5つの対策について政策を実行。
党派  :無所属・新人
肩書  :建設会社元社員
生年月日:昭和50年1月4日(42歳)生まれ
学歴  :
家族  :
公式HP :

氏名  :森田 健作(もりた けんさく)
公約  :「東京湾アクアライン」の通行料800円の恒久化。
党派  :無所属・現職
支援  :自民、公明
肩書  :千葉県知事
生年月日:昭和24年12月16日(67歳) 東京都大田区生まれ
学歴  :明治学院大学中退
家族  :
公式HP :http://mori-ken.jp/
戸籍名「鈴木栄治(すずきえいじ)」

氏名  :松崎 ひでき(まつざき ひでき)
公約  :道路網の整備、医師・看護師不足を改善。
党派  :無所属・新人
肩書  :前浦安市
生年月日:昭和25年1月24日(67歳)生まれ
学歴  :明治大学商学部卒業、明治大学大学院ガバナンス研究科修士課程修了
家族  :妻、息子1人、娘1人
公式HP :http://matsuzaki-hideki.com/
備考  :
戸籍名「松崎秀樹」

どうせ自民、公明がタニマチやってる森健が圧勝するのは目に見えているので、わざわざ候補者選びに悩むのは時間の無駄。

アクアライン通行料800円を是非、実現してもらおうじゃないですか。

AWSはハッキリ言ってしょっぱい?

アフィリエイト・・・アマゾンでは「アソシエイト」の名称でとおっていますが、アソシエイトを今時、コピペでやるのも時代にそぐわないので、ウェブサービスを利用してみました。

今ではネット上でたくさんのウェブサービスが提供されていますが、基本がどれも同じで、クエリを送りレスポンスを得て展開するだけです。

よって各ウェブサービスのクエリ内容、レスポンス項目さえ判れば、やり方はどれも一緒です。

で、AWSサンプルコードを入手し、自分の持つ環境に導入します。

・・・の前にAWSを利用するにはアクセスキーとシークレットキーを取得する必要があります。

シークレットキーがいつ、どこで必要になるのかは不明ですが、アクセスキーだけは是が非でも必要になります。加えてアソシエイトIDもです。

既にアマゾンジャパンのサイトでアカウントを持ってる人ならアソシエイトIDも簡単に入手できますが、AWS自体、アメリカアマゾンの管理下にあるので、アメリカアマゾンのAWSのページで新たにアカウントを申請しなければなりません。

英語で名前や住所etc・・・を入力したり、これが結構、面倒。

で、何とか無事にアクセスキーを取得できたら、さっそくクエリにのせて送信してみましょう。

楽天バリューコマースウェブサービスに慣れてしまってるせいか、極めて醜いレスポンス内容に拍子抜けしてしまいます。

AWSはハッキリ言ってやる価値ないですね。

どうしてもと言うならバリューコマースウェブサービスを利用しましょう。

以上。

主婦にもおすすめ情報発信を収益化させる方法

革命的なアフィリエイトのご紹介。

従来のアフィリエイトを図で表わすと下記になる。

これだとページ内容がどんなに有益な内容であったとしてもseoにおける発リンクによるマイナス要因は避けられない。

これを下記のように変えると

状況はかなり違ってくる。

解りやすい図で示すと

発リンクでしかないアフィリエイト広告リンクをいくら貼ろうがコンテンツページと独立したnoindexページであればコンテンツページの有益性がけがれることは避けられる。

素晴らしく有益な情報が掲載されたページであっても、ひとつアフィリエイトリンクのような外部リンクがあるだけで、その有益性が大幅にスポイルされてしまう。

つまり広告を貼れば上位表示が遠のき、逆であれば上位表示はされるが収益は発生しない。

これがアフィリエイトジレンマってやつで、根本的に解決するには上の図で示した構造にするしかない。

結局、無料系のブログやsnsでは無理な話で、最低限、phpなどのプログラムの実行、ページ毎にメタ設定が可能なワードプレスなどで作った自立サイトが必要になる。

さらにページ内容に対し限りなくネイティブな広告を用意するのも必須。

無料系ユーザーにとってはクリアしなければならない関門がいくつかあるが、一発で解消できる方法がないこともない。

ワードプレスサイトにコンテンツ解析型アフィリエイト機能を導入する方法