データモデリング

今日1日これを見て勉強しました_!!

www.atmarkit.co.jp

 

新しくWebサービスをつくるや、新しく機能と追加する時はその対象を明確にしなければいけないね。対象というのは何に対して何を行うと思ってそんなに間違いではないであろう_!

とすると、データモデリングはもっとも大事なことであると思える。何に対して何を行うというのはデータモデリングで言うエンティティのリソース系とイベント(処理)系に当たる。リソース系は何に対して、イベント(処理)系は何を行うである。

 

 

まだ勉強不足が、1つ簡単なのを書くね。

 

アマゾンなどでものを買う時自分がユーザー、買ったものは商品と言う。商品を買うという行動を注文と言うね。このユーザーと商品はエンティティのリソース系、注文はイベント(処理)系である。

 

ユーザーは買う商品が1つと限らない、商品を買う人も1人ではない。

DBでユーザーテーブルと、商品テーブルをつくるだけでどのユーザーがどの商品を買ったのを記録するのは難しいそうね!

ここでどのユーザーがどの商品を買ったのを記録するための注文テーブルを作れば良いんだ!!

 

 

自力でもそれなりの商品と言えるWebサービスを作れる人になりたいと思ってるので、DB設計は避けて通れないと思う。頑張ります。

 

 

続 Qiita投稿を研究

さて、ソースコードを見ていこう!!

 

qiita.com

function format_phone_number($input, $strict = false) {
    $groups = array(
        5 => 
        array (
            '01564' => 1,
            '01558' => 1,
            '01586' => 1,
            '01587' => 1,
            '01634' => 1,
            '01632' => 1,
            '01547' => 1,
            '05769' => 1,
            '04992' => 1,
            '04994' => 1,
            '01456' => 1,
            '01457' => 1,
            '01466' => 1,
            '01635' => 1,
            '09496' => 1,
            '08477' => 1,
            '08512' => 1,
            '08396' => 1,
            '08388' => 1,
            '08387' => 1,
            '08514' => 1,
            '07468' => 1,
            '01655' => 1,
            '01648' => 1,
            '01656' => 1,
            '01658' => 1,
            '05979' => 1,
            '04996' => 1,
            '01654' => 1,
            '01372' => 1,
            '01374' => 1,
            '09969' => 1,
            '09802' => 1,
            '09912' => 1,
            '09913' => 1,
            '01398' => 1,
            '01377' => 1,
            '01267' => 1,
            '04998' => 1,
            '01397' => 1,
            '01392' => 1,
        ),
        4 => 
        array (
            '0768' => 2,
            '0770' => 2,
            '0772' => 2,
            '0774' => 2,
            '0773' => 2,
            '0767' => 2,
            '0771' => 2,
            '0765' => 2,
            '0748' => 2,
            '0747' => 2,
            '0746' => 2,
            '0826' => 2,
            '0749' => 2,
            '0776' => 2,
            '0763' => 2,
            '0761' => 2,
            '0766' => 2,
            '0778' => 2,
            '0824' => 2,
            '0797' => 2,
            '0796' => 2,
            '0555' => 2,
            '0823' => 2,
            '0798' => 2,
            '0554' => 2,
            '0820' => 2,
            '0795' => 2,
            '0556' => 2,
            '0791' => 2,
            '0790' => 2,
            '0779' => 2,
            '0558' => 2,
            '0745' => 2,
            '0794' => 2,
            '0557' => 2,
            '0799' => 2,
            '0738' => 2,
            '0567' => 2,
            '0568' => 2,
            '0585' => 2,
            '0586' => 2,
            '0566' => 2,
            '0564' => 2,
            '0565' => 2,
            '0587' => 2,
            '0584' => 2,
            '0581' => 2,
            '0572' => 2,
            '0574' => 2,
            '0573' => 2,
            '0575' => 2,
            '0576' => 2,
            '0578' => 2,
            '0577' => 2,
            '0569' => 2,
            '0594' => 2,
            '0827' => 2,
            '0736' => 2,
            '0735' => 2,
            '0725' => 2,
            '0737' => 2,
            '0739' => 2,
            '0743' => 2,
            '0742' => 2,
            '0740' => 2,
            '0721' => 2,
            '0599' => 2,
            '0561' => 2,
            '0562' => 2,
            '0563' => 2,
            '0595' => 2,
            '0596' => 2,
            '0598' => 2,
            '0597' => 2,
            '0744' => 2,
            '0852' => 2,
            '0956' => 2,
            '0955' => 2,
            '0954' => 2,
            '0952' => 2,
            '0957' => 2,
            '0959' => 2,
            '0966' => 2,
            '0965' => 2,
            '0964' => 2,
            '0950' => 2,
            '0949' => 2,
            '0942' => 2,
            '0940' => 2,
            '0930' => 2,
            '0943' => 2,
            '0944' => 2,
            '0948' => 2,
            '0947' => 2,
            '0946' => 2,
            '0967' => 2,
            '0968' => 2,
            '0987' => 2,
            '0986' => 2,
            '0985' => 2,
            '0984' => 2,
            '0993' => 2,
            '0994' => 2,
            '0997' => 2,
            '0996' => 2,
            '0995' => 2,
            '0983' => 2,
            '0982' => 2,
            '0973' => 2,
            '0972' => 2,
            '0969' => 2,
            '0974' => 2,
            '0977' => 2,
            '0980' => 2,
            '0979' => 2,
            '0978' => 2,
            '0920' => 2,
            '0898' => 2,
            '0855' => 2,
            '0854' => 2,
            '0853' => 2,
            '0553' => 2,
            '0856' => 2,
            '0857' => 2,
            '0863' => 2,
            '0859' => 2,
            '0858' => 2,
            '0848' => 2,
            '0847' => 2,
            '0835' => 2,
            '0834' => 2,
            '0833' => 2,
            '0836' => 2,
            '0837' => 2,
            '0846' => 2,
            '0845' => 2,
            '0838' => 2,
            '0865' => 2,
            '0866' => 2,
            '0892' => 2,
            '0889' => 2,
            '0887' => 2,
            '0893' => 2,
            '0894' => 2,
            '0897' => 2,
            '0896' => 2,
            '0895' => 2,
            '0885' => 2,
            '0884' => 2,
            '0869' => 2,
            '0868' => 2,
            '0867' => 2,
            '0875' => 2,
            '0877' => 2,
            '0883' => 2,
            '0880' => 2,
            '0879' => 2,
            '0829' => 2,
            '0550' => 2,
            '0228' => 2,
            '0226' => 2,
            '0225' => 2,
            '0224' => 2,
            '0229' => 2,
            '0233' => 2,
            '0237' => 2,
            '0235' => 2,
            '0234' => 2,
            '0223' => 2,
            '0220' => 2,
            '0192' => 2,
            '0191' => 2,
            '0187' => 2,
            '0193' => 2,
            '0194' => 2,
            '0198' => 2,
            '0197' => 2,
            '0195' => 2,
            '0238' => 2,
            '0240' => 2,
            '0260' => 2,
            '0259' => 2,
            '0258' => 2,
            '0257' => 2,
            '0261' => 2,
            '0263' => 2,
            '0266' => 2,
            '0265' => 2,
            '0264' => 2,
            '0256' => 2,
            '0255' => 2,
            '0243' => 2,
            '0242' => 2,
            '0241' => 2,
            '0244' => 2,
            '0246' => 2,
            '0254' => 2,
            '0248' => 2,
            '0247' => 2,
            '0186' => 2,
            '0185' => 2,
            '0144' => 2,
            '0143' => 2,
            '0142' => 2,
            '0139' => 2,
            '0145' => 2,
            '0146' => 2,
            '0154' => 2,
            '0153' => 2,
            '0152' => 2,
            '0138' => 2,
            '0137' => 2,
            '0125' => 2,
            '0124' => 2,
            '0123' => 2,
            '0126' => 2,
            '0133' => 2,
            '0136' => 2,
            '0135' => 2,
            '0134' => 2,
            '0155' => 2,
            '0156' => 2,
            '0176' => 2,
            '0175' => 2,
            '0174' => 2,
            '0178' => 2,
            '0179' => 2,
            '0184' => 2,
            '0183' => 2,
            '0182' => 2,
            '0173' => 2,
            '0172' => 2,
            '0162' => 2,
            '0158' => 2,
            '0157' => 2,
            '0163' => 2,
            '0164' => 2,
            '0167' => 2,
            '0166' => 2,
            '0165' => 2,
            '0267' => 2,
            '0250' => 2,
            '0533' => 2,
            '0422' => 2,
            '0532' => 2,
            '0531' => 2,
            '0436' => 2,
            '0428' => 2,
            '0536' => 2,
            '0299' => 2,
            '0294' => 2,
            '0293' => 2,
            '0475' => 2,
            '0295' => 2,
            '0297' => 2,
            '0296' => 2,
            '0495' => 2,
            '0438' => 2,
            '0466' => 2,
            '0465' => 2,
            '0467' => 2,
            '0478' => 2,
            '0476' => 2,
            '0470' => 2,
            '0463' => 2,
            '0479' => 2,
            '0493' => 2,
            '0494' => 2,
            '0439' => 2,
            '0268' => 2,
            '0480' => 2,
            '0460' => 2,
            '0538' => 2,
            '0537' => 2,
            '0539' => 2,
            '0279' => 2,
            '0548' => 2,
            '0280' => 2,
            '0282' => 2,
            '0278' => 2,
            '0277' => 2,
            '0269' => 2,
            '0270' => 2,
            '0274' => 2,
            '0276' => 2,
            '0283' => 2,
            '0551' => 2,
            '0289' => 2,
            '0287' => 2,
            '0547' => 2,
            '0288' => 2,
            '0544' => 2,
            '0545' => 2,
            '0284' => 2,
            '0291' => 2,
            '0285' => 2,
            '0120' => 3,
            '0570' => 3,
            '0800' => 3,
            '0990' => 3,
        ),
        3 => 
        array (
            '099' => 3,
            '054' => 3,
            '058' => 3,
            '098' => 3,
            '095' => 3,
            '097' => 3,
            '052' => 3,
            '053' => 3,
            '011' => 3,
            '096' => 3,
            '049' => 3,
            '015' => 3,
            '048' => 3,
            '072' => 3,
            '084' => 3,
            '028' => 3,
            '024' => 3,
            '076' => 3,
            '023' => 3,
            '047' => 3,
            '029' => 3,
            '075' => 3,
            '025' => 3,
            '055' => 3,
            '026' => 3,
            '079' => 3,
            '082' => 3,
            '027' => 3,
            '078' => 3,
            '077' => 3,
            '083' => 3,
            '022' => 3,
            '086' => 3,
            '089' => 3,
            '045' => 3,
            '044' => 3,
            '092' => 3,
            '046' => 3,
            '017' => 3,
            '093' => 3,
            '059' => 3,
            '073' => 3,
            '019' => 3,
            '087' => 3,
            '042' => 3,
            '018' => 3,
            '043' => 3,
            '088' => 3,
            '050' => 4,
        ),
        2 => 
        array (
            '04' => 4,
            '03' => 4,
            '06' => 4,
        ),
    );
    $groups[3] += 
        $strict ?
        array(
            '020' => 3,
            '070' => 3,
            '080' => 3,
            '090' => 3,
        ) :
        array(
            '020' => 4,
            '070' => 4,
            '080' => 4,
            '090' => 4,
        )
    ;
    $number = preg_replace('/[^\d]++/', '', $input);
    foreach ($groups as $len => $group) {
        $area = substr($number, 0, $len);
        if (isset($group[$area])) {
            $formatted = implode('-', array(
                $area,
                substr($number, $len, $group[$area]),
                substr($number, $len + $group[$area])
            ));
            return strrchr($formatted, '-') !== '-' ? $formatted : $input;
        }
    }
    $pattern = '/\A(00(?:[013-8]|2\d|91[02-9])\d)(\d++)\z/';
    if (preg_match($pattern, $number, $matches)) {
        return $matches[1] . '-' . $matches[2];
    }
    return $input;
}

 

下記はQiita投稿に書いてある通り任意のハイフンなし電話番号をこの関数に入れるとハイフン付きの電話番号が出てくる。

使い方
echo format_phone_number('0120828828'); // 0120-828-828

 

先ず配列$groupsを見て行こう!!!$groupsは総務省資料の確かな情報を使ってまとめた配列である。

    $groups = array(
        5 => 
        array (
            '01564' => 1,

「01564」の部分は市外局番などハイフン区切りの一番前である。

「1」は市内局番の桁数。前回に話したように市内局番の桁数は市外局番によって決まる。

 

それから配列を回して処理の部分。ここは番号を振って詳しく話していくね!

【1】$number = preg_replace('/[^\d]++/', '', $input);
    foreach ($groups as $len => $group) {
 【2】 $area = substr($number, 0, $len);
  【3】if (isset($group[$area])) {
            $formatted = implode('-', array(
                $area,
                substr($number, $len, $group[$area]),
                substr($number, $len + $group[$area])
            ));
            return strrchr($formatted, '-') !== '-' ? $formatted : $input;
        }
    }
  【4】 $pattern = '/\A(00(?:[013-8]|2\d|91[02-9])\d)(\d++)\z/'; if (preg_match($pattern, $number, $matches)) { return $matches[1] . '-' . $matches[2]; } return $input;

 

【1】はこの関数を使う時、半角数字以外の入力あったら空白に入れ替える。

【2】はハイフンの一番前市外局番を取るための事前処理。

【3】で市外局番を決定し、後ろの市内局番も決定すると、個人番号の部分決まる。

下記の部分は記入した番号は間違いであって「080-2345-」このように最後はハイフンであった時、記入した番号をそのままに返す。

return strrchr($formatted, '-') !== '-' ? $formatted : $input;

【4】は事業者識別番号を使われた場合の処理

 

説明不足かもしれませんが、ここでQiita投稿を研究を終わりにします。

 

Qiita投稿を研究

これから何回に分けて下記「ハイフンなしの電話番号をハイフン付き電話番号を復元する」Qiita投稿を研究していきたい_ _!

自分は今後こういうのをつくれるようにならないといけないと思う。だけど今に1から考えてこのレベルのものをつくるにはまだ難しいので、先ず先人が作ったものを研究して、沢山研究して沢山作ってみていつかつくれるようになると思う。

qiita.com

「ハイフンなしの電話番号をハイフン付き電話番号に復元する」をつくる前に先ず何をもってどういうルールでハイフンをつけるの!?を正しく理解しないといけないね。プログラマーはただコードを書くではなくてあんなことこんなことを正しく理解できないといけないんだね!!!

ハイフンをつけるルールは簡単ではなかった。

総務省|電気通信番号の利用・指定|電気通信番号指定状況を見ると難しいすぎほどだった。

総務省の資料を確認すると大きく下記8種類の電話番号がある

  1. 固定電話等の電話番号(市外・市内局番),
  2. 携帯電話・PHSの電話番号(070(*)
  3. M2M等専用番号(020)
  4. 発信者課金ポケベル電話番号(0204)
  5. IP電話の電話番号(050)
  6. 着信課金用電話番号(0120)
  7. 情報料代理徴収用電話番号(0990)
  8. 統一番号用電話番号(0570)

・固定電話だけでも色々考えないといけないで難しい

 市外局番 ー 市内局番 - 加入者番号

上記のルールではあるけど、話はそう簡単ではない。

市外局番は3桁の011、4桁の0123、2桁の03があるように桁数は一つではない。この後ろに続く市内局番の桁数もいろいろあるが、幸い市内局番の桁数は前の市外局番によって決定してる。たとえば市外局番001に続く市内局番は3桁と決まってある。 

 

 

 

配列を回す

さて配列を回していこう

 

1.ループした回数をカウント

2.ループの中のif文

の2つのことについて下記のソースコードで説明していく

サンプル3
デフォルト
>|php|
<?php
$group1[0]['name'] = '一郎';
$group1[0]['age'] = '18';
$group1[0]['gender'] = '男性';


$group1[1]['name'] = '和子';
$group1[1]['age'] = '26';
$group1[1]['gender'] = '女性';

$group1[2]['name'] = '二郎';
$group1[2]['age'] = '36';
$group1[2]['gender'] = '男性';


$group2[0]['name'] = '一助';
$group2[0]['age'] = '18';
$group2[0]['gender'] = '男性';


$group2[1]['name'] = '和香子';
$group2[1]['age'] = '26';
$group2[1]['gender'] = '女性';

$group2[2]['name'] = '二助';
$group2[2]['age'] = '36';
$group2[2]['gender'] = '男性';

$class_list[]=$group1;
$class_list[]=$group2;

$count_class = 0;
foreach ($class_list as $class_key => $class) {
$count_class++;
$count_group = 0;
foreach ($class as $group_key => $group) {
if ($class_list[$class_key][$group_key]['gender'] == '男性') {
echo $class_list[$class_key][$group_key]['name'];
}
$count_group++;
echo $count_group;
}
}

 

 

・先ず1.ループした回数をカウントについて、

 デフォルトのecho $count_group;では「123123」が表示する。

 

 それを上下変えて1回カウントしたあとに表示するのではなくにすれば、

 echo $count_group;

 $contn_gorup++;

 「012012」と表示するになる。

 

 それとカウンタの初期化$contn_gorupをコメントアウトすると、

12345」とループした2周分を全部数える、

$count_class は一番外側のループのカワンタであるので$count_class = 0;を

コメントアウトしても変わらないね。

 

・それからループの中のif文について考えよう。

 デフォルトのecho $class_list[$class_key][$group_key]['name'];で

一郎二郎一助二助」と男性の名前だけは表示する。

 

 こうしてif文で男性と指定したから

  if ($class_list[$class_key][$group_key]['gender'] == '男性') {
 echo $class_list[$class_key][$group_key]['name'];
 }

 

 おれは今基本的にループの中でのif文はifの条件に合ったループと理解してる。

 このように考えて、デフォルトはgenderは男性であるループの名前だけを表示すると 理解できる。

 

 

これでは分かりにくいかもしれませんが、

すぐ良いものを書こうとすると書けなくなる感じがしますから、

今後少しずつ成長していきたいと思ってます($・・)/~~~

 

 

 

配列をつくって回す

配列は運転の曲がり、回してループは駐車。これほど配列と、配列を回すループが大事と思う。

 

先ず配列について

 

・サンプル1
>|php|
<?php
$group1 = array(
array('name' => '一郎', 'age' => 18, 'gender' => '男性'),
array('name' => '和子', 'age' => 26, 'gender' => '女性'),
array('name' => '二郎', 'age' => 36, 'gender' => '男性'),
);

$group2 = array(
array('name' => '一助', 'age' => 18, 'gender' => '男性'),
array('name' => '和香子', 'age' => 26, 'gender' => '女性'),
array('name' => '二助', 'age' => 36, 'gender' => '男性'),
);
$class_list = array($group1, $group2);

 

$group1、$group2は2次元配列、

$group1、$group2を配列にした$class_listは3次元配列

 

$class_lsitを表示させると以下になる

ちゃんと3次元配列になってる

 array(2) {
[0]=>
array(3) {
[0]=>
array(3) {
["name"]=>
string(6) "一郎"
["age"]=>
int(18)
["gender"]=>
string(6) "男性"
}
[1]=>
array(3) {
["name"]=>
string(6) "和子"
["age"]=>
int(26)
["gender"]=>
string(6) "女性"
}
[2]=>
array(3) {
["name"]=>
string(6) "二郎"
["age"]=>
int(36)
["gender"]=>
string(6) "男性"
}
}
[1]=>
array(3) {
[0]=>
array(3) {
["name"]=>
string(6) "一助"
["age"]=>
int(18)
["gender"]=>
string(6) "男性"
}
[1]=>
array(3) {
["name"]=>
string(9) "和香子"
["age"]=>
int(26)
["gender"]=>
string(6) "女性"
}
[2]=>
array(3) {
["name"]=>
string(6) "二助"
["age"]=>
int(36)
["gender"]=>
string(6) "男性"
}
}
}

 

サンプル1をブラケットで書き直すと下記サンプル2になる
・サンプル2
>|php|
<?php
$group1[0]['name'] = '一郎';
$group1[0]['age'] = '18';
$group1[0]['gender'] = '男性';


$group1[1]['name'] = '和子';
$group1[1]['age'] = '26';
$group1[1]['gender'] = '女性';

$group1[2]['name'] = '二郎';
$group1[2]['age'] = '36';
$group1[2]['gender'] = '男性';


$group2[0]['name'] = '一助';
$group2[0]['age'] = '18';
$group2[0]['gender'] = '男性';


$group2[1]['name'] = '和香子';
$group2[1]['age'] = '26';
$group2[1]['gender'] = '女性';

$group2[2]['name'] = '二郎';
$group2[2]['age'] = '36';
$group2[2]['gender'] = '男性';

$class_list[]=$group1;
$class_list[]=$group2;

 

配列をループして、ループの中で新しい配列を組む時ブラケットを使うと便利と思うので、ブラケット書き方について掘りましょう

 

サンプル2のここ

$class_list[]=$group1;
$class_list[]=$group2;

キーを省略する書き方してるが

省略しないとこうなる

$class_list[0]=$group1;
$class_list[1]=$group2;

よって下記で「一助」が表示される

echo $class_list[1][0]['name'];

今回はここまでにします($・・)/~~~
次は配列を回します_ _!

コピーペはだめ、絶対にだめ

結果から言いますと、コピーペしたら使いにくいプログラマーになる

 

つい最近2,3カ月前だけど、先輩に「コピーペはだめ、絶対にだめ」ソースコードをコピーペするからこんな変なバグが起こる!」などとよく言われた。

その時は本当にバグが多いし、できるだけコピーペしないように努めようと思った。だけど、コピーペすると多くの時間を節約できる。それに今の自分ではできない仕事もなんとかできてしまう気がして、それなりにコピーペしてもしょうがないではないかなとも思ってた。

「達人プログラマー」で偶然的プログラミングしていけないというのを読んでから、「コピーペはだめ、絶対にだめ」の理由を分かるようになった。価値のあるプログラマーでありたいなら「コピーペはだめ、絶対にだめ」。

達人プログラマーに「信頼におけるものだけを前提としてください。」という言葉がある。信頼、信頼が大事からコピーペはだめ、絶対にだめ」なのである

ソースコードをコピーペして期待した通りに動いても、なぜこのように動いたのを分かってない。理解できてないからこれから変な動きしないことを保証できない。保証できない=信頼がない

誰も信頼がないプログラマーを使いたくないはず。だから、ずっとコピーペしてなんとなく動くソースコードを書き続けたら、価値がないプログラマーにしかならない

 

次か、次の次かソースコードを少し書きたいと思ってます_ _

よろしくお願いします( *´艸`)

気持ちが大事

何ことも気持ちが大事と思うし、プログラマーとしても気持ちが大事と、仕事で先輩に学んだ( ;∀;)

 

自分には気持ちがないと集中できないし、辞めたくなるのはあるが、今回に伝えたいことは人の気持ちを考えることが大事!!!

 

プログラミングして作ったものが最終誰かが使うになるから、使う人の気持ちになれないプログラマーはだめと思う。

実際に仕事で見たことは、プランナーから指示をもらうが、プランナーの指示は途中であって、最後にかたちにするのはプログラマーである。やはり途中だと見えない最後かたちにするプログラマーにしか見えないものが多々ある。

 

だから、使う人の気持ちになれないプログラマーだと使いやすいサービスをつくれないではないかと思う!