電子工作

単純に興味が湧いたのでやってみたいなと。

以前、H8マイコンを使った実習をやったことがあるけど、
同じように手軽に始められるものはないかなと調べてみた。


・GR-SAKURA

がじぇっとるねさす | ルネサス エレクトロニクス

初心者向けの手軽にマイコンを使った電子工作が可能な国産マイコンボード。
マイコン初心者でも作成可能な開発環境がクラウド上で提供されており、誰でも気軽に始めることができる、らしい。
Arduinoと互換性あり。

価格 GR-SAKURA  3505円
   GR-SAKURA FULL 4705円


Arduino(アルドゥイーノ)

マイコン基板と専用の開発環境(Arduino IDE)から構成されるシステム。
C言語風の専用プログラミング言語はプログラム経験のないアーティストにも使えるよう設計されている。

Webで探せば大抵のことが見つかるらしい。

アマゾンでも制作キットが売られていた。

Amazon.co.jp: Arduinoをはじめようキット: パソコン・周辺機器

 

Arduino面白そう。キットも4000円だから比較的手軽に始められそう。

Cocos2d-x 3.1.1のタッチ入力について

2.Xのテキストを使って勉強していたら
タッチ入力回りでエラーが出たので調べてみました。

具体的にはLayerクラスを継承した際のタッチ入力処理なのですが、
3.Xからはメソッド名が異なるみたいです。


2.X     →  3.X
ccTouchBegan → onTouchBegan
ccTouchEnded → onTouchEnded


そこまで大幅な変更は今のところ遭遇していないので、2.Xのテキストでも

十分やっていけそうです。

CGIとPHPの違い

CGI と PHP の違いは何ですか? - CMS「すぐ使えるCGI」

 

レンタル掲示板の多くがCGIで作られている印象を受けたので
なんか理由あるのかなとふと疑問に思ったので調べてみました。

 

得た情報

・そもそもアクセス数が少ない場合はどちらで作っても大差ない

CGIはさまざまな言語が使えるので機能制限が少ない
・処理速度はPHPの方が早い(リクエストごとにプロセスが生成されない)

・ページ全体を動的に表示する場合はPHPが適している

・移植性が高いのはCGI

 

個人レベルで利用する掲示板のアクセス数なんてたかが知れているので

CGIにしてるんですかね。

 

 

 

cocos2d-xをwindows環境で動かす

ちなみにターゲットはWin32アプリケーションです。

はじめはAndroidで開発しようとして環境を整えたのですが 、Eclipseの重さと不安定さに耐えられなかったので、まずはWin32アプリケーションでcocos2d-xの使い方を学ぶことにしました。 

 

まずは環境設定からですが、基本的には cocos2d-xの公式サイトを参考にしています。

How to run cpp-tests on Windows | Cocos2d-x


Win32は他の環境と比べると比較的楽に整えられると思います。

 

 

■必要なもの
・Cocos2d-x v3.1.1 http://www.cocos2d-x.org/download
Visual Studio Express 2012 http://www.microsoft.com/ja-jp/download/details.aspx?id=34673

 ・Python 2.7 https://www.python.org/download/releases/2.7.7/


※ちなみにOSはWindows8.1 で開発しています。

 

 

■Cocos2d-xのダウンロード

http://cocos2d-x.org/download


最新の3.x系を使っていきます。
alpha版やbeta版は安定していない可能性があるので 正式リリース版にしました。
ここでは v3.1.1 を使っています。


ダウンロードが完了したらzipファイルを解凍して、パスの中に日本語が入らない位置に保存します
(和製ソフトではないので、日本語厳禁。この手のソフトは基本日本語が入らないように気を付けましょう)

ここではCドライブ直下に

 cocos2d-xフォルダ

を作成し、そこに配置します。

f:id:oimodx:20140625212557p:plain

 

 

環境変数の設定(cocos用)

新しいプロジェクトを作成するときにはコマンドプロンプト上でcocosコマンドを使うので 、そのパスを環境変数に設定していきましょう。

 コントロール パネル → システムとセキュリティ → システム

と開き、 
 システムの詳細設定
を選択

f:id:oimodx:20140625212845p:plain

 

 

システムのプロパティウィンドウが表示されるので 

 詳細設定 -> 環境変数

を選択 

f:id:oimodx:20140625212950p:plain

 

 

環境変数ウィンドウの システム環境変数 の中から 「Path」 を選択し
編集ボタンを押下

f:id:oimodx:20140625213142p:plain

 

 

変数値の一番最後に

 C:\cocos2d-x\cocos2d-x-3.1.1\tools\cocos2d-console\bin

を追加し、最後に 「;」をつけましょう。
;が一つ一つのパスの区切りを表すので、必ず最後に;をつけるようにしましょう。 

f:id:oimodx:20140625213258p:plain

 

 

■Visual Studio2012のインストール

Express版なら無料です。下記サイトからダウンロードしてインストールしましょう。

http://www.microsoft.com/ja-jp/download/details.aspx?id=34673



Pythonのインストール

cocosコマンドはpythonを利用しているので必要です。
ちなみに、2.7系でないとうまくいかないので注意です。(3.X系は未対応)

https://www.python.org/download/releases/2.7.7/

 

f:id:oimodx:20140625213509p:plain

 

Windows X86-64 MSI Installer(2.7.7) もしくは Windos x86 MSI Installer(2.7.7) をダウンロード 。
インストーラは特に設定を変える必要はないので、次へ次へと押していけばOK。

 

 

Python環境変数を設定

PythonはデフォルトではCドライブ直下にインストールされているので

 C:\Python27;


をPathの末尾に追加。

f:id:oimodx:20140625213636p:plain

 

 

■CppTestの実行

cocos2dのサンプルを実行してみましょう。

 cocos2d-x-3.1.1\build

の中の

 cocos2d-win32.vc2012.sln

を起動します。

(cocos2d-wp8.vc2012.slnはwindows phone用かな?)

f:id:oimodx:20140625213812p:plain

 


そして、ソリューションエクスプローラの中から

 cpp-test プロジェクト

を選択し、右クリック -> スタートアッププロジェクトに設定 をクリック 

f:id:oimodx:20140625213938p:plain

 

 

これでビルドされるようになったので、F7キーを押してビルドを行いましょう。
初回ビルドは結構時間がかかりますので気長に待つ。

 

ビルドが完了すると、ビルドエラーが出るはず

f:id:oimodx:20140625214200p:plain

 

 

LabelTestNew.cpp の中に中国語の文字列が含まれており、これが原因のようです。f:id:oimodx:20140625214331p:plain

 

 

cocos2d-x 3.x セットアップ

を参考に、LabelTestNew.cpp

(cocos2d-x-3.1.1\tests\cpp-tests\Classes\LabelTestにあります)

をさくさくエディタで開いて BOM付UTF-8 で保存して再ビルド。
今度は成功するはず。 

f:id:oimodx:20140625214532p:plain



■EmptyProjectの作成方法

cocos2d-x用の空のプロジェクトは、コマンドプロンプト上でcocosコマンドを使って作成します。

新しいプロジェクトの作成コマンド

 cocos new プロジェクト名 -p パッケージ名 -l 使用言語 -d 保存先フォルダ

例)
 cocos new MyGame -p com.MyCompany.AwesomeGame -l cpp -d C:\cocos2d-x\workspace

パッケージ名はJavaのクラスやandroidのアプリを一意に識別するための仕組みのことです。 一般的にはドメイン名を逆から読んだ値にするのですが、今回は試しなので適当です。

f:id:oimodx:20140625214830p:plain

 

 

しばらくすると完了するので、保存先のフォルダに行き

 proj.win32フォルダ

の中のslnファイルを立ち上げましょう。

スタートアッププロジェクトを設定してビルドすると、Hello Worldが表示されます。

f:id:oimodx:20140625215045p:plain

 

以上です!

空投稿防止

投稿ボタンを押したとき、フォームに何も入力していなくても空投稿できてしまっていたのを修正した。

 

投稿先ではisset関数を使ったチェックを行っていたのだが、isset関数では空文字列かどうかの判定はできないらしい。

PHPでの空値の扱い〜issetとemptyを比較する - 戦う葦 〜ウェブリテラシー篇

 

上記記事によると、変数の示す先がNULLかどうか調べているようで、例え空文字列だとしてもPOSTされた場合は _POST[”○○○”] は存在することになるのでtrueが返されてしまう。

なので、空文字列チェックを行う場合はempty関数を用いる必要がある。

PHP: empty - Manual

 

加えて今回は、投稿時の名前や本文が空白文字だけだった場合も弾くようにチェックを入れたのだが、後から考えてみると余計なチェックだったかもしれない。

 

最後に、一つ前のページに戻す簡単な方法はないかと調べてみた。

(未知のページから直接飛んできた場合と、投稿ページから飛んできたけど入力に誤りがある場合の戻り処理を統一したかった)

【PHP】遷移してきたページ(1つ前のページ)のURLの取得方法|なんちゃって技術者のブログ

 

フォームデータの再送信防止について

昨日の続き。

調べてみたらいくつか方法があるみたいで、下記サイトでは

・ページ遷移による対策

・セッションによる対策

リファラによる対策

の3パターンが紹介されていた。

http://d.hatena.ne.jp/gravit/20111020/1319141223


中でもページ遷移を使った方法が、環境を選ばず有効だということなので試してみた。


ページ遷移による方法はphpのheader関数を使って実現する。

header関数は、HTTPヘッダを送信できる関数で、


<?php
header('Location: http://www.example.com/');
exit;
?>

という風に、他のWebページやファイルを呼び出すことができる。

で、このとき、自分自身を再帰的に呼び出してあげれば、POSTが行われていない状態を作り出すことができるので、その後更新ボタンを押したとしても、直前で何もPOSTしていないので多重投稿を防げるといった感じ。

多分。

ちなみにheader関数を呼び出す前に、何か出力をしていると失敗するとのこと。
http://www.php.net//manual/ja/function.header.php

 

掲示板

訳あって、ApachePHPMySQLの勉強をはじめました。

 

で、勉強に使っていた書籍の巻末に、総まとめとして簡単な掲示板の作り方みたいなのが載っていたのですが、「これくらい作ればイントラネット内の身内用としてなら使えるね」見たいな事が書かれていたので、じゃあ、どこまでセキュリティを高めればインターネットで公開できるのかなあと、疑問に思ったので調べて修正をしてみました。

 

・参考にしたサイト

 http://kan-chan.stbbs.net/download/cgi/tutorial/cgihole.html
 http://d.hatena.ne.jp/Kazumi007/20090921/1253501500
 http://www.tagindex.com/html_tag/form/form_action.html

 

・とりあえず現状の掲示板の仕様(見本どおり)

 - フォームに入力された値 はhtmlspecialchars()を使ってタグ無効化

 - フォームの入力データは一応チェックしている

 - データベースのユーザー名とパスは別ファイル

 - フォームとphpとのデータのやり取りは全部method=getを利用

 

 大体こんなところ。

 

・今回やった修正

 method=getからmethod=postを使ってデータを送信するようにした。

 

 言うてもサンプルコードなのでいろいろと欠陥はあるわけなのですが、とりわけ、メッセージの投稿やスレ立てが更新ボタンを連打すると複製が無限にできてしまうのがやべーなと思ったので、そこから手を付けてみました。

 

 そもそもmethod=getとmethod=postの違いがわからなかったのでそこから。

 

 - method=get 送信データがURLの一部として送信される。
          送信データとURLは ? で区切られる。
          URL自体に長さ制限があるので、大容量のデータは

             送信できない場合も(環境による)。

   
 - method=post      サーバ側から標準入出力経由で送信される。
           こちらは本文としてデータが送信されるので大容量のデータが

              送信可能。

 

 掲示板とかメールフォームではpost、検索エンジンではget。

 

 ・結果

method=postでも更新ボタンを押すと、フォームの再送信が行われてしまい多重投稿できてしまった。ネットショップのレジとかだと、リロードすると無効になってくれてた気がするんだけどあれってどうやるんだろ。