CGI で使うために Ruby をいじり中。 CSV を読めたのでメモ。

2013年5月30日 2:22:19
test.csv

17:00,40,ビール中ジョッキ,2
17:05,40,カシスオレンジ,2

CSVtest.rb

#!C:/Ruby200-x64/bin/ruby.exe
# encoding: utf-8

print "Content-Type:text/html\r\n\r\n"

require "cgi"
require "csv"
cgi = CGI.new
cp  = cgi.params["tesutesu"]
f = "test.csv"
x = 0
orderTime  = Array.new
torihikiNo = Array.new
syouhinmei = Array.new
suuryou    = Array.new
CSV.foreach(f) do |row|
	orderTime[x]  = row[0]
	torihikiNo[x] = row[1]
	syouhinmei[x] = row[2]
	suuryou[x]    = row[3]
	x += 1
end
print orderTime[0] + torihikiNo[0] + syouhinmei[0] + suuryou[0] + "\n"
print orderTime[1] + torihikiNo[1] + syouhinmei[1] + suuryou[1]


require "cgi"
require "csv"

CSV には require "csv" が必要。

cgi = CGI.new
cp  = cgi.params["tesutesu"]

GET で送られてきた tesutesu の値で CSV をなんやかんやするには params["tesutesu"] で値を取り出します。
今回は何もしてません。
params = cgi.params
最近はハッシュにしてます。 その場合は
params["tesutesu"][0]
のように配列になってるので[0]が必要

dirf = "test.csv"
CSV.foreach(dirf) do |row|

これで1行ずつ読む。
1行を row に入れる。

orderTime  = Array.new
torihikiNo = Array.new
syouhinmei = Array.new
suuryou    = Array.new
orderTime[x]  = row[0]
torihikiNo[x] = row[1]
syouhinmei[x] = row[2]
suuryou[x]    = row[3]

今回の場合配列にした。
rowは配列なので[index]で各列を取り出せます。
orderTime.push(row[0]) でもいいし、
orderTime << row[0] でもいいね
xを使わず、んーんんんなんだっけインデックスが自動的に付く、ぬーーーw
each_with_index これだ、これでもいいね
あ、さりげなく ruby のバージョンは 2.0.0 にしちゃいました。
ruby -v
ruby 2.0.0p195 (2013-05-14) [x64-mingw32]

先月の VirtuMVP の件でやっぱりどうも終わった

2013年5月28日 23:01:49
ASUS P8H67-V に VirtuMVP を導入して早一ヶ月経ちました。
ライセンスが切れました。
もうあの速さは戻ってこない・・・
VirtuMVP を使用しないで爆速を得られる方法はないものか。
やっぱりマザーボードを変えるしかないんでしょうね…。

cgi を ruby にして ajax? の DOM みたいな感じ

2013年5月23日 23:32:08
apache2 ちゃんに cgi(.rb) をできるようにしておく(これもメモにしようと思ったけどどう httpd.conf したかわからない・・・)。
(a href="javascript:ajaxruby();")ここをクリック(/a)して cgi(.rb) に飛ばし、データが返ってきたらテキストを変える
ということをやってみたので、そのメモです。

まず test.rb を apache2 の cgi 設定フォルダ (cgi-bin/) の中に保存する。
test.rb

#!C:/Ruby193/bin/ruby.exe
# encoding: utf-8

print "Content-Type:text/html\r\n\r\n"

require "cgi"
cgi = CGI.new
cp  = cgi.params["x"]
print cp

最初の1行目は ruby 本体のファイルパス。 path を通してれば ruby だけでいいはず。(ググってチラ見なので詳しい記述はわかりませんw)
2行目 test.rb の文字コード

print "Content-Type:text/html\r\n\r\n"

に関しては、http://d.hatena.ne.jp/tilfin/20080118/1200653984さんのブログより。
ruby の cgi の情報が少なすぎてやっと辿り着いたのがココでした。ありがとうございます!動きました!

cp  = cgi.params["x"]

この1行にどんだけ時間費やしたことかwwwwwwwwwwww
最初はよくわからんまま、POST で送信してたんだ。POST ってかっこいいじゃん?
しかし html の a href で javascript で飛ばすんだから、 name=" " ってどうすればいいのかわからないので、
params[" "] ←ここがどうもわからなかった。
数時間、いや数日かかっただろうな。自力ですからwプログラミングなど独学の知識。経験も何もない。
そこで GET にしてみよう!と、よく気づいたよw
cp という変数に GET で送られてきた値を入れている
そして最後に print でいいのか知らんが値を返却できたので、 print cp

以下のコードはhttp://allabout.co.jp/gm/gc/24097/#2を少し改良。
test.php の中の javascript

function requestTest ( data , method , async ) {
	var rq   = new XMLHttpRequest();
	var filename = "test.rb";
	if ( method == "GET" ) URI = "../cgi-bin/" + filename + "?x=" + data;
	rq.open ( method , URI , async );
	rq.onreadystatechange = function() {
		if ( rq.readyState == 4 ) {
			on_loaded ( rq );
		}
	}
	if ( method == "GET" ) data = null;
	rq.send ( data );
}
function on_loaded( rqobj ) {
	res = rqobj.responseText;
	alert ( res );
}

rq で XMLHttpRequest オブジェクト作成
filename に cgi ファイルの名前
if ( method 略 は、最初POSTでやってたんで、付け加えました。この状態でPOSTで送ると、URI 変数が GET のみに生成されているのでエラーになります。
+ "?x=" + data; これで、cgi に、x=data を送っています。
URI = cgi-bin/test.rb?x=data; の状態になっています。

rq.open ( method , URI , async );

open は 初期化。この3つでおk。
method は "POST" か "GET"
URI はそのまんま 送信先。ここもうまくいかず悩みました。このtest.php からみた相対パスです。※実際のファイルパスじゃなく、WEB上でのパス。この場合、1個上のフォルダのcgi-bin/test.rb 。
async は非同期とうい訳。 true か false 。この場合は true です。
rq.onreadystatechange はサーバーとの通信状態が変化したら、onreadystatechangeが呼び出されます。
コピペなのでこの辺はようわからんwwwww。

if ( method == "GET" ) data = null;
rq.send ( data );

これは、GET である場合、deta は null にしないといけません。
data を送信します。


if ( rq.readyState == 4 ) {
	on_loaded ( rq );
}
function on_loaded( rqobj ) {
	res = rqobj.responseText;
	alert ( res );
}

readyState は
0 未初期化
1 読み込み中
2 読み込み済み
3 処理中
4 完了
4 であるとき on_loaded ( rq ) を実行、オブジェクトを渡す。
res = rqobj.responseText テキストデータとして res に渡す。
値を受け取ることができたので、
これを利用して DOM をすればおっけえええい。
すっげええええ日数かかった。まずルビーで死んだ。その後、どうやったらデータを受け取れるのかわからなかった。
ググって出てきてよかった;;ありがとうv
test.php の中の a href による javascript 呼び出し

	<a href="javascript:requestTest('test', 'GET' , true );">ここをクリックしてね!</a>

ブロックをリンクした時の firefox の範囲がおかしいので解決してみた件

2013年5月14日 2:05:18
前の記事を書いたあと、すぐに解決したんだがここにのっけてなかった。
それは <div class="w600px"> <a> <div class="box w600px"> </div> </a> </div> のように、
ブロックをリンクしたすぐ外側にブロックと同じ大きさで囲むと範囲が正しくなります。
親要素の描画範囲になるなら親の描画範囲を小さくしてやるだけのことです!。
text-align:center; をさせたいなら margin:auto; も忘れずに。

前回の firefox だと範囲がおかしいよねの実験
しょうがないからここに例を出そう div class=blocka-A
処置を施すとこんな感じ
しょうがないからここに例を出そう div class=blocka-A

php 配列の数をカウントする
$_POST の配列の数とか $_POST["x"] の中身が存在するのかとか

2013年5月9日 14:48:41
javascript で動的に form で送る数が変わる場合、
送った先の for文で取り出す場合に、何回繰り返せばいいのかわからないので、 count を使うことにした。
今回はそのメモです。

setlocale(LC_ALL,'ja_JP.UTF-8');
$cnt     = count ( $_POST ) / 2 + 1;
for ( $i = 1 ; $i < $cnt ; $i++ ) {
	${"line".$i}  =  $_POST["line".$i];
	${"suu".$i}   =  $_POST["suu".$i];
	if ( strcmp ( $_POST["line".$i], "" ) ) {
		echo ${"line".$i} . "    " .  ${"suu".$i} . "
\n"; } }
count() / 2 + 1 は、今回の場合2種類あるので÷2、for文用に+1しないといけない。
もし、何種類あるかもわからない場合は、連想配列だったかなーそれを使うといいとかかググったきがする
それなら送るときに種類の数を $_POST["syurui"] で数字を送ってもらった方が早いキガス。
あと、動的な変数の記述で勉強になった。
$line1 と連番とか数字を付ける場合は ${ "この文字と". $i . "ではさむ" }のように (結果→$この文字1ではさむ)
{}の中で文字と、変数をつなげることができる。
これは知ってたので$_POST[{ "あ" }] にやろうとしたらできなかった。
上記のように $_POST[ "あ" . $i }] でよかった { } はいらないみたい。
これで小一時間悩んだwなんでー?wていうw
あと大事なのがもう1個
$_POST["anything"] の中身があるのかどうかという if文。
issetだと入っていようが入ってまいが true を返すという。
そこでググると 最初の文字と 次の文字を比較して <0 >0 =0を返すという。
つまり中身が空白の0と同じ場合 0 = false
1文字でも入っていた場合 >0 = true (0ではない)

javascript でdiv の子、 div タグを追加してさらに class とか追加しちゃう件

2013年5月9日 1:19:39
メモメモ
下記のコードは、確実に俺しかわからんだろうが、やってることは、
引数xは行数
x行目の値をn値に変更した履歴を、Gx というidを付ける。
別の div MejirushiG と div MejirushiS に書き込んでいるような状況
追加した div に名前をつけ ( addG ) そこに setAttribute() に クラスとスタイルシート名をぶっこむ。

function addDiv(x,n) {
// 連番で id 登録してるので
	Gstr  = "G" + x;
	Sstr  = "S" + x;
	var FindId = document.getElementById(Gstr);
	if ( FindId == null ) {
		// 複数回編集されるので null (id未作成)の場合、こちらを実行
		var divG    = document.createElement("div");
		var divS    = document.createElement("div");
		var idGyou  = document.getElementById("MejirushiG");
		var idSuu   = document.getElementById("MejirushiS");
		divG.id     = Gstr;
		divS.id     = Sstr;
		var addG    = idGyou.appendChild(divG); // つづり間違えてるの気付かず、どんだけ時間つぶしたことかwwwwwww
		var addS    = idGyou.appendChild(divS);
		FindId.innerHTML                        = x;
		document.getElementById(Sstr).innerHTML = n;
		addG.setAttribute("class","InlineBox box wpx40");
		addS.setAttribute("class","InlineBox box wpx40");
	} else {
	// すでに id 発行済みの場合はこちら
		document.getElementById(Sstr).innerHTML = n;
	}
}

この機能は、スタンダード 権限を持つアプリケーションからのみ利用できます。

2013年5月7日 3:49:35
なんだよこれええええ
単語登録したいと思いちょろっと IME いじったらこんなん出てきた!
プロパティも開けねえ!
ググると、 IE のセキュリティタブのチェックボックスを外すとあるが、はずしても駄目だった。
もう少し調べると、辞書の位置を変更するといいというもの。
変更してやったぜ!
バッチリ動いたぜ!
変更して解決すんなら根本的なセキュリティの解決になってない気がすんだが。

ブロックをリンクにしたときの firefox の範囲がおかしい・・・よね?

2013年5月5日 2:45:00
HTML5 になってぶっとぶぐらい「おーっ」となったのがブロック要素を a で囲むことができるようになったこと。
さっそく使っているわけだが、どうもわからんのが一つ。
まず画像を見てほしい。

わかりづらいと思うけどw説明しよう
表示されている画像は左側半分。右側にはこれと同じものが左右反転のようになる。
で、 div の入れ子で、最後の div に a /a で囲んでブロックのリンクとしている。
まず朱色っぽい色(#FF8072)が大枠の DIV padding を上下左右に指定中。
次に背景が白(#FFFFFF)そして width:100%; padding: 2%; を指定。
そして問題のボタン(div) は左側しか映っていない。
margin: auto; width: 400px; で真中寄せにしている状況。
スタイルシートは、
a:hover > div[class~="buttonSelect"] {
しかし、a div /div /a のように囲んでいるにもかかわらず、
上記画像の黒い線の中からボタンがリンクの範囲となっているのだ。
クシャクシャとしたのがマウスの位置だと思っていい。プリスクだとマウスが撮れないw

firefox と IE とでクリックできる範囲はどうですか?
しょうがないからここに例を出そう div class=blocka-A
firefox と ie とで範囲が違うんだが俺だけなんかな

この状態で、「んじゃ IE はどうなのか」と思ってやったらびっくらこいた。
ちゃんとした div のみの範囲で選択された。

これが全体像。マウスが映らないのが残念だが、ちゃんと角が丸い( border-radius )div 上が選択範囲となっている。
firefox の場合、親 BOX の padding からリンクがスタートしているようになってるんだよなああ。
で、どうするかというと強引に div class = "sutairusi-to" onclick="tobe();" のように onclick で処理するというw
リンクじゃなくなるので、 sutairusi-to:hover のみの指定でよくなる。
もしかしてスタイルシートの記述がおかしいのかな~?
おかしいならなぜ IE はちゃんと動作するのか
ま、いいやww