MW211 EXIT

devlog
PHP配列/var_export()
2014年04月10日
PHPの配列は以下のような感じで定義する訳だが、
┌──────────────────────────────────────┐
│$配列 = array (                                                             │
│    キー => 値,                                                             │
│    内部配列 => array (                                                     │
│        0 => array (                                                        │
│            キー => 値,                                                     │
│        ),                                                                  │
│    ),                                                                      │
│);                                                                          │
└──────────────────────────────────────┘
定義後の「$配列」から、右辺を再現する方法がある。
「var_export($配列);」だ。

第二引数に、「TRUE」を付ければ、標準出力ではなく、左辺に代入もできる。
┌──────────────────────────────────────┐
│$文字列 = var_export($配列, TRUE);                                          │
└──────────────────────────────────────┘

で、これを配列に復元させるには…、コピペしてソースに貼り付ければいい。
ってな、冗談はさておき、といってもこれが結構実用的だったりする。

プログラム的に復元するには、「eval()」を使うことになる。
(ソースにコピペしたような挙動をしてくれる便利な関数だ)

一連の流れをまとめると以下のような形となる。
┌──────────────────────────────────────┐
│$文字列 = var_export($配列, TRUE);                                          │
│$配列 = var_import($文字列);                                                │
├──────────────────────────────────────┤
│function var_import($string) {                                              │
│    eval('$array=' . $string . ';');                                        │
│    return $array;                                                          │
│}                                                                           │
└──────────────────────────────────────┘
但し、「eval()」は万能過ぎるので、致命的なこと(例えばファイル削除)を
意図せずして行われる危険性を伴う(SQLインジェクションみたいな感じで)。

なので、あまり、使わない方がいいようだ。
ってことで、「var_export()」は手動コピペと共にってのが上手な付き合い方かも。
分類:PHP配列
PHP/マルチバイト文字数
2014年04月09日
マルチバイト文字の文字数等を取得する関数は以下の通り。

【UTF-8】マルチバイト文字はだいたい1文字あたり3バイト分を使用
┌────────────┬────────────┬────────────┐
│         文字数         │         文字幅         │        バイト数        │
├────────────┼────────────┼────────────┤
│mb_strlen('a')       →1│mb_strwidth('a')     →1│strlen('a')          →1│
├────────────┼────────────┼────────────┤
│mb_strlen('あ')      →1│mb_strwidth('あ')    →2│strlen('あ')         →3│
├────────────┼────────────┼────────────┤
│mb_strlen('aあ')     →2│mb_strwidth('aあ')   →3│strlen('aあ')        →4│
├────────────┼────────────┼────────────┤
│mb_strlen('①')      →1│mb_strwidth('①')  →1★│strlen('①')         →3│
└────────────┴────────────┴────────────┘

【SJIS-win(シフトJIS(CP932))】マルチバイト文字は1文字あたり2バイト分を使用
┌────────────┬────────────┬────────────┐
│         文字数         │         文字幅         │        バイト数        │
├────────────┼────────────┼────────────┤
│mb_strlen('a')       →1│mb_strwidth('a')     →1│strlen('a')          →1│
├────────────┼────────────┼────────────┤
│mb_strlen('あ')      →1│mb_strwidth('あ')    →2│strlen('あ')         →2│
├────────────┼────────────┼────────────┤
│mb_strlen('aあ')     →2│mb_strwidth('aあ')   →3│strlen('aあ')        →3│
├────────────┼────────────┼────────────┤
│mb_strlen('①')      →1│mb_strwidth('①')  →1★│strlen('①')         →2│
└────────────┴────────────┴────────────┘

問題は「mb_strwidth()」における記号(「①」など)の扱い(★)。
半角(1バイト幅)扱いで算出されてしまうのだ。

これは仕様で文字コードの帯域によって、以下のように定義されているからだ。
┌───────┬─────┐
│U+0000~U+0019│ 0バイト幅│
├───────┼─────┤
│U+0020~U+1FFF│ 1バイト幅│
├───────┼─────┤
│U+2000~U+FF60│ 2バイト幅│
├───────┼─────┤
│U+FF61~U+FF9F│ 1バイト幅│
├───────┼─────┤
│U+FFA0~      │ 2バイト幅│
└───────┴─────┘

ということで、全角文字なのに、半角扱いされてしまう文字を当てはめてみると…。
┌───────┬─────┐
│U+0000~U+0019│ 0バイト幅│
├───────┼─────┤
│U+0020~U+1FFF│ 1バイト幅│ω(U+03C9)
├───────┼─────┤
│U+2000~U+FF60│ 2バイト幅│※(U+203B)、①(U+2460)、★(U+2605)、℃(U+2103)
├───────┼─────┤
│U+FF61~U+FF9F│ 1バイト幅│
├───────┼─────┤
│U+FFA0~      │ 2バイト幅│
└───────┴─────┘
ん?辻褄が合わない?

さて、こんな挙動が不審な「mb_strwidth()」対策は?
思い切って使うのを止めてしまう(安定するまで)。

シフトJISならバイト数=文字幅なので、これを利用して、
シフトJISに変換してバイト数を求めるのが無難なやり方みたい。
で、変換できない(「?」になる)UTF-8特有文字とかの対策は?ってことになるが
ま、そいつらは黙殺するしかないか。
分類:PHP
PHP配列/特定の列の調査
2014年04月08日
下記のようなSQL文で取得した複数行データのような多次元連想配列があったとして。
┌──────────────────────────────────────┐
│$多次元連想配列 = array(                                                    │
│    array(                                                                  │
│        キー   => 値,                                                       │
│        データ => 値,                                                       │
│    ),                                                                      │
│    array(                                                                  │
│        キー   => 値,                                                       │
│        データ => 値,                                                       │
│    ),                                                                      │
│);                                                                          │
└──────────────────────────────────────┘

列を縦に切り出して配列化するのは「array_column()」を使う。
┌──────────────────────────────────────┐
│キーの配列 = array_column($多次元連想配列, キー);                           │
└──────────────────────────────────────┘

これを使って、特定の列の最大値を求めることもできる。
┌──────────────────────────────────────┐
│列の最大値 = max(array_column($多次元連想配列, 列));                        │
└──────────────────────────────────────┘

といっても、「array_column()」を使えるのは「PHP5.5以降」でのこと。

「mb_strwidth()」を駆使すれば、列の最大幅を調査することもできる。
┌──────────────────────────────────────┐
│列の最大幅 = max(array_map(function($value) {return mb_strwidth($value);},  │
│                           array_column($多次元連想配列, 列)));             │
└──────────────────────────────────────┘
但し、「mb_strwidth()」にはややこしい問題があるので注意
#UTF-8では「①」が半角扱いになるなど
分類:PHP配列
JavaScript/クラスみたいなもの
2014年04月06日
クラスっぽく定義してみた。
┌──────────────────────────────────────┐
│var newJavaScript = {                                                       │
│    member  :'メンバ変数',                                                  │
│    run     :function() {                                                   │
│        this.alert();                                                       │
│    },                                                                      │
│    alert   :function() {                                                   │
│        alert(this.member);                                                 │
│    }                                                                       │
│};                                                                          │
├──────────────────────────────────────┤
│newJavaScript.run();                                                        │
└──────────────────────────────────────┘
っていうか既にオブジェクトじゃん。
分類:JavaScript
Smarty/ループインデックス
2014年04月04日
┌──────────────────────────────────────┐
│{foreach name=ループ名 from=$配列 key=no item=value}{/foreach}              │
└──────────────────────────────────────┘
上記のようなループ文の場合、ループインデックスは、
以下のような定数で取得することができる。
┌───────────────┬──────────────────────┐
│0オリジンのループインデックス │$smarty.foreach.ループ名.index      →0,1,…│
├───────────────┼──────────────────────┤
│1オリジンのループインデックス │$smarty.foreach.ループ名.iteration  →1,2,…│
└───────────────┴──────────────────────┘
なお、データ(連想配列の添字)は「key=no」で指定した「$no」で取得できる。
分類:Smarty
Excel/ファイル名を取得する関数
2014年04月03日
こんな感じ。
┌──────────────────────────────────────┐
│=MID(CELL("filename"),                                                      │
│     SEARCH("[",CELL("filename"))+1,                                        │
│     SEARCH("]",CELL("filename"))-SEARCH("[",CELL("filename"))-1)           │
└──────────────────────────────────────┘
分類:Excel
jQuery/非同期のループ
2014年04月02日
以下のような感じで、配列ごとに非同期でAjaxでデータを取得して処理をするとする。
┌──────────────────────────────────────┐
│for (var index in 配列) {                                                   │
│    $.getJSON(                                                              │
│        配列[index]['url'],                                                 │
│        function(json) {                                                    │
│            alert(配列[index]['name']);                                     │
│        }                                                                   │
│    );                                                                      │
│}                                                                           │
└──────────────────────────────────────┘
ここで、配列ごとの他の要素(「配列[index]['name']」)を、
コールバック関数で参照したい場合、上記のようにすると、
戻った頃には「index」が最後まで進んでいたりして、正しい値を取得できない。
例えば、「赤、青、黄」という三つのデータ配列だった場合、
コールバック関数中ではすべて「黄、黄、黄」となってしまう。

これを解決するには、「$.each()」を使えばよい。
┌──────────────────────────────────────┐
│$.each(配列, function(index, value) {                                       │
│    $.getJSON(                                                              │
│        value.url,                                                          │
│        function(json) {                                                    │
│            alert(value.name);                                              │
│        }                                                                   │
│    );                                                                      │
│});                                                                         │
└──────────────────────────────────────┘
PHPの「foreach (配列 as $index => $value)」のようなものだ。
#連想配列の場合「$index」の部分は「$key」の方が一般的だろう。
分類:jQuery
JavaScript/配列(添字配列)の欠番
2014年04月01日
突然、大きな添字の配列に値を代入した場合、配列はどうなるのか?

PHPだと添字配列も連想配列の一部なので、そこまでの配列は欠番となる。

では、JavaScriptの場合は?
┌──────────────────────────────────────┐
│var 配列 = [];                                                              │
│配列[2] = 値;                                                               │
│alert(配列.length);  // →「3」(0,1,2)                                      │
└──────────────────────────────────────┘
こちらの場合は、配列はあくまで添字配列なので(連想配列はハッシュで代用)、
欠番はできず、値のない配列ができる。
分類:JavaScript
SQL/条件付き追加・削除
2014年03月31日
「OR REPLACE」   「REPLACE」…存在したら置き換える
「IF NOT EXISTS」「IGONRE」 …存在したら作らない
「IF EXISTS」               …存在しなかったら消さない
┌───────────────┬─────┬─────┐
│                              │  MySQL   │PostgreSQL│
├───────────────┼─────┼─────┤
│CREATE DATABASE               │    ○    │    ○    │
│CREATE OR REPLACE DATABASE    │    ×    │    ×    │
│CREATE DATABASE IF NOT EXISTS │    ○    │    ×    │
│───────────────│─────│─────│
│DROP DATABASE                 │    ○    │    ○    │
│DROP DATABASE IF EXISTS       │    ○    │    ×    │
├───────────────┼─────┼─────┤
│CREATE TABLE                  │    ○    │    ○    │
│CREATE OR REPLACE TABLE       │    ×    │    ×    │
│CREATE TABLE IF NOT EXISTS    │    ○    │    ×    │
│───────────────│─────│─────│
│DROP TABLE                    │    ○    │    ○    │
│DROP TABLE IF EXISTS          │    ○    │    ×    │
├───────────────┼─────┼─────┤
│CREATE INDEX                  │    ○    │    ○    │
│CREATE OR REPLACE INDEX       │    ×    │    ×    │
│CREATE INDEX IF NOT EXISTS    │    ×    │    ×    │
│───────────────│─────│─────│
│DROP INDEX                    │    ○    │    ○    │
│DROP INDEX IF EXISTS          │    ×    │    ×    │
├───────────────┼─────┼─────┤
│CREATE VIEW                   │    ○    │    ○    │
│CREATE OR REPLACE VIEW        │    ○    │    ○    │
│CREATE VIEW IF NOT EXISTS     │    ×    │    ×    │
│───────────────│─────│─────│
│DROP VIEW                     │    ○    │    ○    │
│DROP VIEW IF EXISTS           │    ○    │    ×    │
├───────────────┼─────┼─────┤
│CREATE TRIGGER                │    ○    │    ○    │
│CREATE OR REPLACE TRIGGER     │    ×    │    ×    │
│CREATE TRIGGER IF NOT EXISTS  │    ×    │    ×    │
│───────────────│─────│─────│
│DROP TRIGGER                  │    ○    │    ○    │
│DROP TRIGGER IF EXISTS        │    ○    │    ×    │
├───────────────┼─────┼─────┤
│INSERT                        │    ○    │    ○    │
│REPLACE                       │    ○    │    ×    │
│INSERT IGNORE                 │    ○    │    ×    │
│───────────────│─────│─────│
│DELETE                        │    ○    │    ○    │
└───────────────┴─────┴─────┘
分類:SQL、PostgreSQL、MySQL
設計/ドキュメントのフォルダ構成
2014年03月30日
  こんな感じか。(ひとつの案)
┌──────────────────────────────────────┐
│ドキュメント                                                                │
│├仕様書                                                                    │
│││・基本仕様書                                        ※外部向け  ※最新版│
│││・概要仕様書                                                    ※最新版│
│││・定数定義書                                                    ※最新版│
│││・電文仕様書                                                    ※最新版│
│││・共有メモリ定義書                                              ※最新版│
│││・ファイル定義書                                                ※最新版│
│││・共通関数仕様書                                                ※最新版│
│││・画面仕様書                                        ※外部向け  ※最新版│
│││・入力制限仕様書                                                ※最新版│
│││・実行環境定義書  #フォルダ構成も含む                          ※最新版│
│││・著作権定義書                                                  ※最新版│
││├データベース定義書                                                      │
│││  ・テーブル定義書  #ER図も含む                                ※最新版│
│││  ・ビュー定義書                                                ※最新版│
│││  ・トリガ関数仕様書                                            ※最新版│
││├詳細設計書                                                              │
│││  ・●●詳細設計書                                  ※非共有    ※最新版│
││├01初回開発                                                              │
││││・基本仕様書(初回)                                ※外部向け          │
││││・概要仕様書(初回)                                                    │
│││└詳細設計書                                                            │
│││    ・●●詳細設計書(初回)                          ※非共有            │
│││    ・単体評価項目&成績書                          ※非共有            │
││└02(改造プロジェクト名)                                                  │
││  │・改造基本仕様書(改造プロジェクト名)              ※外部向け          │
││  │・改造概要仕様書(改造プロジェクト名)                                  │
││  └改造詳細設計書                                                        │
││      ・●●改造詳細設計書(改造プロジェクト名)        ※非共有            │
││      ・単体評価項目&成績書                          ※非共有            │
│├評価書                                                                    │
││├01初回開発                                                              │
│││・総合評価項目&成績書                                                  │
│││・結合評価項目&成績書                                                  │
││└02(改造プロジェクト名)                                                  │
││    ・総合評価項目&成績書                                                │
││    ・結合評価項目&成績書                                                │
││    ・回帰評価項目&成績書                                                │
│├取扱説明書・手順書                                                        │
││  ・取扱説明書                                        ※外部向け  ※最新版│
││  ・保守手順書                                                    ※最新版│
│└販売促進資料                                                              │
│    ・(パワーポイント資料など)                          ※外部向け          │
└──────────────────────────────────────┘
  以下の三つのレベルに分ける(上流から下流へ、公開性が高いものから低いものへ)
    (a) 外部向け資料        …顧客にほぼ提示可能なもの、「ですます」調で記述
    (b) 内部向け共有資料    …開発者が共有する開発の核となる資料
    (c) 内部向け非共有資料  …担当者のみで閉じた資料、ブラックボックス的なもの
  開発の核となるのは(b)であり、これをもって開発プロジェクト全体の統制をとる。
  個々の担当者はあくまで(b)としての結果を出せばよく、
  その補助資料的な役割としての(c)がある(咄嗟の問い合わせに回答できるように等)。
  顧客向けには(a)を提供することにより、説明責任を果たすことになる。
  一方で、要求の元は顧客からのものなので、(a)が(b)の上流資料にあたることになる。
分類:設計
前へ 1 … 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 … 156 次へ