電子工作
単純に興味が湧いたのでやってみたいなと。
以前、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のテキストでも
十分やっていけそうです。
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のダウンロード
最新の3.x系を使っていきます。
alpha版やbeta版は安定していない可能性があるので 正式リリース版にしました。
ここでは v3.1.1 を使っています。
ダウンロードが完了したらzipファイルを解凍して、パスの中に日本語が入らない位置に保存します。
(和製ソフトではないので、日本語厳禁。この手のソフトは基本日本語が入らないように気を付けましょう)
ここではCドライブ直下に
cocos2d-xフォルダ
を作成し、そこに配置します。
■環境変数の設定(cocos用)
新しいプロジェクトを作成するときにはコマンドプロンプト上でcocosコマンドを使うので 、そのパスを環境変数に設定していきましょう。
コントロール パネル → システムとセキュリティ → システム
と開き、
システムの詳細設定
を選択
システムのプロパティウィンドウが表示されるので
詳細設定 -> 環境変数
を選択
環境変数ウィンドウの システム環境変数 の中から 「Path」 を選択し
編集ボタンを押下
変数値の一番最後に
C:\cocos2d-x\cocos2d-x-3.1.1\tools\cocos2d-console\bin
を追加し、最後に 「;」をつけましょう。
;が一つ一つのパスの区切りを表すので、必ず最後に;をつけるようにしましょう。
■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/
Windows X86-64 MSI Installer(2.7.7) もしくは Windos x86 MSI Installer(2.7.7) をダウンロード 。
インストーラは特に設定を変える必要はないので、次へ次へと押していけばOK。
■Pythonの環境変数を設定
PythonはデフォルトではCドライブ直下にインストールされているので
C:\Python27;
をPathの末尾に追加。
■CppTestの実行
cocos2dのサンプルを実行してみましょう。
cocos2d-x-3.1.1\build
の中の
cocos2d-win32.vc2012.sln
を起動します。
(cocos2d-wp8.vc2012.slnはwindows phone用かな?)
そして、ソリューションエクスプローラの中から
cpp-test プロジェクト
を選択し、右クリック -> スタートアッププロジェクトに設定 をクリック
これでビルドされるようになったので、F7キーを押してビルドを行いましょう。
初回ビルドは結構時間がかかりますので気長に待つ。
ビルドが完了すると、ビルドエラーが出るはず
LabelTestNew.cpp の中に中国語の文字列が含まれており、これが原因のようです。
を参考に、LabelTestNew.cpp
(cocos2d-x-3.1.1\tests\cpp-tests\Classes\LabelTestにあります)
をさくさくエディタで開いて BOM付UTF-8 で保存して再ビルド。
今度は成功するはず。
■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のアプリを一意に識別するための仕組みのことです。 一般的にはドメイン名を逆から読んだ値にするのですが、今回は試しなので適当です。
しばらくすると完了するので、保存先のフォルダに行き
proj.win32フォルダ
の中のslnファイルを立ち上げましょう。
スタートアッププロジェクトを設定してビルドすると、Hello Worldが表示されます。
以上です!
空投稿防止
投稿ボタンを押したとき、フォームに何も入力していなくても空投稿できてしまっていたのを修正した。
投稿先ではisset関数を使ったチェックを行っていたのだが、isset関数では空文字列かどうかの判定はできないらしい。
PHPでの空値の扱い〜issetとemptyを比較する - 戦う葦 〜ウェブリテラシー篇
上記記事によると、変数の示す先がNULLかどうか調べているようで、例え空文字列だとしてもPOSTされた場合は _POST[”○○○”] は存在することになるのでtrueが返されてしまう。
なので、空文字列チェックを行う場合はempty関数を用いる必要がある。
加えて今回は、投稿時の名前や本文が空白文字だけだった場合も弾くようにチェックを入れたのだが、後から考えてみると余計なチェックだったかもしれない。
最後に、一つ前のページに戻す簡単な方法はないかと調べてみた。
(未知のページから直接飛んできた場合と、投稿ページから飛んできたけど入力に誤りがある場合の戻り処理を統一したかった)
【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
掲示板
訳あって、ApacheとPHPとMySQLの勉強をはじめました。
で、勉強に使っていた書籍の巻末に、総まとめとして簡単な掲示板の作り方みたいなのが載っていたのですが、「これくらい作ればイントラネット内の身内用としてなら使えるね」見たいな事が書かれていたので、じゃあ、どこまでセキュリティを高めればインターネットで公開できるのかなあと、疑問に思ったので調べて修正をしてみました。
・参考にしたサイト
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でも更新ボタンを押すと、フォームの再送信が行われてしまい多重投稿できてしまった。ネットショップのレジとかだと、リロードすると無効になってくれてた気がするんだけどあれってどうやるんだろ。