ぽにょ、ぽにょぽーにょ -3ページ目

ぽにょ、ぽにょぽーにょ

2012年からWebエンジニア。
プログラムとか、趣味とか、人生とかの備忘録。

なんかアメブロってださくて使いづらいからそのうち引っ越しまふ。

ストアドプロシージャ関連のまとめ

① プロシージャーをつくる
ファイル名 a.sql

DELIMITER //

DROP PROCEDURE IF EXISTS hogeyyyyyMM;
//

CREATE PROCEDURE hogeyyyyyMM(_trgt_date DATETIME)
EXEC_BLOCK:BEGIN
        SELECT * FROM media LIMIT 1;
END;

//
DELIMITER ;

/*
CALL hogeyyyyyMM('2013-01-01 00:00:00');
*/

② プロシージャーが出来た事を確認する。

SHOW PROCEDURE STATUS;

SHOW CREATE PROCEDURE `DB名`.`プロシージャ名`;
SHOW CREATE PROCEDURE db. hogeyyyyyMM

③ a.sqlがあるディレクトリで、mysql -u***************
そこでSOURCE a.sql

mysql@hogehoge 17> SOURCE honge.sql
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

④ mysql ログイン後
CALL プロシージャー名

(参考)消し方
DROP PROCEDURE IF EXISTS db. hogeyyyyyMM




idやクラスを使わずテーブルの縦列の平均や和を求めてみた

を少し改良した。

最終的にはぽちぽち選んで、その行だけを表示させるようにしたい。

[機能追加]
・項番を動的に取得できるようにした。
・特定idをもったタグを削除(行を表示させなくする。)
・あと何となくjavascriptをfunctionにしてみる。

[注意点]
各種functionで定義したとき
上から呼ばれるため、呼び出す順番があるので注意

<script type="text/javascript" src="<?=base_url() ?>js/tableshow.js"></script>
<script type="text/javascript" src="<?=base_url() ?>js/tablecalc2.js"></script>
<script>
_tableAvgSum();
</script>

[ js ]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

// 項番を表示されてる動的に表示
function _set_idx(thlen, rowNum){

if(rowNum <= 1){ // 行数が1のとき
// 合計もとめる欄しかないので何もしない
return;
}
// 計算
var i = 1;
for(var m = 1; m < rowNum; m++){
td[m*thlen].innerHTML = i++;
}
}

// 一番上の行に合計値や平均をのせる
function _tableAvgSum(){
/*
* 横の個数を求める
* 縦の個数を求める
* 最初のforは横の個数の考え
* 次のfor縦の個数の考え
*
* こんな考え。td[2],td[3]に合計を入れる、みたいな
* td[0] td[1] td[2]  td[3]
* td[4] td[5] td[6]  td[7]
* td[8] td[9] td[10] td[11]
*/
var tr = document.getElementsByTagName("tr");
// tr配下の子要素ノードを取得
// thの個数を求める(横の個数)
var thlen = tr[0].children.length;
// 縦の個数を調べる
td = document.getElementsByTagName("td");
var rowNum = td.length / thlen;

// 項番を動的にふる
_set_idx(thlen, rowNum);

// 計算
// 最初はtd[2]からいれていくのでi=2からスタート
for(var i = 3; i < thlen; i++){
var tdNum = 0;
for (var m = 1; m < rowNum; m++){
tdNum += parseInt(td[i + m*thlen].innerText);
}

if(i == 5){ //平均のとき
// 平均を求める
tdNum = tdNum / (rowNum - 1);
// 少数点2位で四捨五入
// 普通にできないようなので、100かけて、小数点以下を四捨五入して100で割る
// まず100倍
tdNum = tdNum * 100;
// 小数点以下を四捨五入
tdNum = Math.round(tdNum);
// 100で割る
tdNum = tdNum / 100;
}
td[i].innerHTML = tdNum;
}
}

//特定id自体を非表示にする
function _delete_dom_obj_by_id(id_name){
// tableの行を非表示にしてみる
var v = document.getElementById(id_name);
var v_obj_parent = v.parentNode;
v_obj_parent.removeChild(v);
}

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

html
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

<table>
<tr>
<th>項目</th>
<th>名前</th>
<th>タイプ</th>
<th>縦列 計</th>
<th>縦列 計</th>
<th>縦列 平均</th>
</tr>
<tr>
<td>合計</td>
<td>-</td>
<td>-</td>
<td>縦列 計</td>
<td>縦列 計</td>
<td>縦列 平均</td>
</tr>
<tr id = "noShow">
<td>-</td>
<td>Aさん</td>
<td>a</td>
<td>100</td>
<td>50</td>
<td>503</td>
</tr>
<tr>
<td>-</td>
<td>Bさん</td>
<td>b</td>
<td>150</td>
<td>70</td>
<td>701</td>
</tr>
<tr>
<td>-</td>
<td>Cさん</td>
<td>c</td>
<td>80</td>
<td>30</td>
<td>300</td>
</tr>
</table>

<!-- js -->

<script type="text/javascript" src="<?=base_url() ?>js/tablecalc2.js"></script>
<script>
//ここも呼び出す順番注意
_delete_dom_obj_by_id("noShow");
_tableAvgSum();

</script>

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


https://neil.fraser.name/software/tablesort/

これを使って、すごく簡単にテーブルソートができるようになったけど、
¥とか,(カンマ)が入るとうまくいかなくなるので下記のように修正

TableSort.compare_num = function(a, b) {

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
↓ここ追加!
  //余計な文字をとる
  //.はいらない
a[0] = a[0].replace(/([,*+?^=!:${}()|[\]\/\\])/g, "");
b[0] = b[0].replace(/([,*+?^=!:${}()|[\]\/\\])/g, "");
  //
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  var aNum = parseFloat(a[0]);
  if (isNaN(aNum)) {
    aNum = -Number.MAX_VALUE;
  }
  var bNum = parseFloat(b[0]);
  if (isNaN(bNum)) {
    bNum = -Number.MAX_VALUE;
  }
  if (aNum == bNum) {
    return 0;
  }
  return (aNum > bNum) ? 1 : -1;
};


(htmlはこんな感じ)

<table border = 1>
<thead>
<tr>
<th>項</th>
<th class = "nocase">1</th>
<th class = "case">2</th>
<th class = "num">3</th>
<th class = "num">4</th>
<th class = "num">5</th>
<th class = "num">6</th>
<th class = "num">7</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>a</td>
<td>b</td>
<td>1</td>
<td>109</td>
<td>\1012</td>
<td>1,041</td>
<td>1043</td>
</tr>
<tr>
<td>2</td>
<td>aa</td>
<td>B</td>
<td>2</td>
<td>3000</td>
<td>\3,110</td>
<td>3,220</td>
<td>3660</td>
</tr>
<tr>
<td>3</td>
<td>ab</td>
<td>BB</td>
<td>3</td>
<td>520</td>
<td>\1,120</td>
<td>320</td>
<td>240.345</td>
</tr>
<tr>
<td>4</td>
<td>ab</td>
<td>c</td>
<td>3</td>
<td>20</td>
<td>\2,011</td>
<td>2,000</td>
<td>220.55</td>
</tr>
</tbody>
</table>

<!-- js -->
<script type="text/javascript" src="<?=base_url() ?>js/tablesortme.js"></script>



codeIgniterのutf-8,SJIS文字化け修正備忘録

結局自分のぽかミスでしたが、codeigniterとかviでの文字コード修正など、色々勉強になったのでメモ。

[結論]
ブラウザのエンコードの自動識別を自動にすればok

[事象]iframeを使っているサイトで新規にcodeigniterをいれてページをつくった。
   そしたらつくったやつが文字化け。
	 ここはサイトとかDBがSJISでつくられていたり、utf-8とまじっていてめちゃくちゃ

[背景]codeIgniterはデフォルトutf-8だからSJISに直そうとしたが、、、、、

①viewファイル、下記だけSJISにしてもだめでした。。
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
ファイルをSJISで保存しなおしましょう。
viでいうと、
:set fenc=sjis-win

②controllerをSJIS変換すると、view側でhtmlspecialcharacterとか使ったらエラーでます。
multi byte変換できませんみたいな。。

(参考)
viでSJISファイルを開いて、文字化けするとき、、、、
http://deginzabi163.wordpress.com/2009/02/18/%E8%A6%9A%E6%9B%B8vim%E3%81%A7sjis%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%96%8B%E3%81%84%E3%81%9F%E3%82%89%E3%80%81%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%97%E3%81%9F%E3%82%89/
開いた時に
:e ++enc=cp932[Enter] をやりましょう

(参考ページ)
入力データのサニタイズの影響で、Webアプリケーションを「UTF-8」で開発し、 HTML側が「ShiftJIS」のような場合、POSTデータが文字化けしてしまいます。
できれば、HTML側も「UTF-8」で運用することが良いのですが、何らかの理由でHTML側の文字コードが「UTF-8」以外の場合、 フック機能の「pre_system」フックポジションで、POSTデータを「UTF-8」に変換する処理が必要になってきます。

http://www.ci-guide.info/practical/core/utf8/


ベストプラクティスとしては、
$config['charset'] = 'UTF-8';
で、ソースコードは UTF-8。HTML 出力時に Shift_JIS に変換。
そして、入力時に Shift_JIS のデータを UTF-8 に変換する必要があります。
http://program.sagasite.info/wiki/index.php?CodeIgniter%20%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E5%A4%89%E6%8F%9B

CodeIgniter の出力を ShiftJIS にする
http://dhive.jp/blog/yama/195.html

CIのoutputメソッドを探してみる
http://blog.paz-para.com/?p=2610

viで覚えたこと

// 配列をutf-8からsjis-winに文字コード変換
mb_convert_variables('sjis-win','utf-8',配列)

// stringのencode判定
mb_detect_encoding($string)

//vi
:set fenc=sjis-win
[小ネタ]postは配列で渡せます。
<form action="./hoge" method="post" id="hoge">
	<input type="hidden" name="value[]" value=<?=$valueArr;?>>
</form>
って感じ
仕事で動的に横幅が増えていくテーブルの
縦列の合計や平均を求める必要があって、
なんとかならないかと思ってつくった。

[学んだこと]
htmlでの値の取得方法

var t = document.getElementsByTagName("td");
// tdタグ要素11番目の値を取得
console.log(t[11].innerText);
// その値を書き換える
t[11].innerHTML="hoge";
// trの子要素ノードを取得
var t = document.getElementsByTagName("tr");
console.log(t[0].children.length);
■ノードはこの人の説明がわかりやすかった
http://taro4.blog37.fc2.com/blog-entry-26.html

// iの型を調べる
typeof(i);
StringだったらparseIntでIntに直す必要がある
td[2].innerHTML = parseInt(td[6].innerText) + parseInt(td[10].innerText);

↓ 以下テーブル
==================
<table>
<tr>
<th>項目</th>
<th>名前</th>
<th>縦列 計</th>
<th>縦列 計</th>
<th>縦列 平均</th>
</tr>
<tr>
<td>合計</td>
<td>-</td>
<td>縦列 計</td>
<td>縦列 計</td>
<td>縦列 平均</td>
</tr>
<tr>
<td>1</td>
<td>Aさん</td>
<td>100</td>
<td>50</td>
<td>503</td>
</tr>
<tr>
<td>2</td>
<td>Bさん</td>
<td>150</td>
<td>70</td>
<td>701</td>
</tr>
<tr>
<td>3</td>
<td>Cさん</td>
<td>80</td>
<td>30</td>
<td>300</td>
</tr>
</table>

<!-- js -->
<script type="text/javascript" src="<?=base_url() ?>js/tablecalc.js"></script>

以下js
===================
/*
 * 横の個数を求める
 * 縦の個数を求める
 * 最初のforは横の個数の考え
 * 次のfor縦の個数の考え
/*
 * こんな考え。td[2],td[3]に合計を入れる、みたいな
 * td[0] td[1] td[2]  td[3]
 * td[4] td[5] td[6]  td[7]
 * td[8] td[9] td[10] td[11]
 */

var tr = document.getElementsByTagName("tr");
// tr配下の子要素ノードを取得
// thの個数を求める(横の個数)
var thlen = tr[0].children.length;
// 縦の個数を調べる
td = document.getElementsByTagName("td");
var rowNum = td.length / thlen;

// 計算
// 最初はtd[2]からいれていくのでi=2からスタート
for(var i = 2; i < thlen; i++){
var tdNum = 0;
        // 縦列の計算
for (var m = 1; m < rowNum; m++){
tdNum += parseInt(td[i + m*thlen].innerText);
}
//合計はそのまま入れる
if(i == 4){ //平均のとき
// 平均を求める
tdNum = tdNum / (rowNum - 1);
// 少数点2位で四捨五入
// 普通にできないようなので、100かけて、小数点以下を四捨五入して100で割る
// まず100倍
tdNum = tdNum * 100;
// 小数点以下を四捨五入
tdNum = Math.round(tdNum);
// 100で割る
tdNum = tdNum / 100;
}
td[i].innerHTML = tdNum;
}

でもちょっときいてよ、、、
この結果をcsvに落としたいんですわ、、、
でもjsから直でcsvに落とすのはむりなんですね、、
一回サーバ側に渡すとか、データ数的に絶対おこられるし、
結局js使わずphpとかで計算して表示させた方がよさそうです。

涙。



Your system folder path does not appear to be set correctly. Please open the following file and correct this: index.php

が出る時

applicationと同じ階層にあるindex.php
L50くらいからの
/*
 *---------------------------------------------------------------
 * SYSTEM FOLDER NAME
 *---------------------------------------------------------------
 *
 * This variable must contain the name of your "system" folder.
 * Include the path if the folder is not in the same  directory
 * as this file.
 *
 */
$system_path = '/var/www/html/codeigniter/system';
を正しいパスにしてあげましょう

////////////////////////////////////////////

http://localhost/xxxxxxxxx/index.php/test/hoge

URLの除去ができる
⇒http://codeigniter.jp/user_guide_ja/general/urls.html

効かないとき、、、、
mod_rewrite .htaccessで調べましょう