なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

見せると驚かれることが稀によくあるパソコンの操作3つ。

f:id:nazuna_0124:20170312082946p:plain

100記事書くまではアクセス数は気にしないようにしようと思っていたのですが、

さすがに気になります。みょーに多い!


アクセス元で急上昇したのが、 getpocket.comなるサイト?

どうやら、Webの保存サービスぽいのですが、あの記事を保存してから

あとで読もうって方が増えたとも思えず。


このサービスから検索エンジンぽく巡回でもあるんでしょうか? 謎です。


さて、今回は普通に知ってる人は多いけど、たまにびっくりされる操作なぞを紹介。



ダブルクリックで単語選択

基本といえば基本ですねー。選択のされ方はエディタによってしまいます。

キーボードショートカットできる場合もあります。

f:id:nazuna_0124:20170401095922g:plain



送るでデスクトップにショートカット

これは気が付かないときが結構あります。

  • ファイルかフォルダで右クリック
  • 送る
  • デスクトップ(ショートカットを作成)


たまーに、作成してから切り貼りしてる人がいます。


Ctrl押しながらドラッグでExcelシートのコピー

f:id:nazuna_0124:20170401100635g:plain


知ってると結構便利!


というわけで、今回はgifを貼ってみるテストでした!

フラット型多次元連想配列のフィルター

f:id:nazuna_0124:20170312082946p:plain

飲み屋でしてはならない話題に政治、宗教、野球というのがあるそうです。

オブジェクト指向の盛り上がり(?)を考えると、プログラミングの設計指向(こういえばいいの?)

も入れてあげてもいいんじゃとか思ってます。


にもかかわらず、オブジェクト指向と民主主義ってなんとなく似てるよね!

と、より危険な方の比喩を使ってみたり。

民主主義の原則

  • 自由
  • 平等
  • 友愛

オブジェクト指向の原則

  • 隠蔽
  • 継承
  • 多相性


ほらほら!


民主主義とは多数決のことである、というのはよくある誤解らしいので、


オブジェクト指向とはクラスを使うことであると誤解して突き進んで見る方向性。


さて、では本日のお題は前記事で定義したフラット型多次元連想配列のフィルタについてです。

組み込み関数は大抵一次元用なので自分でなんとかするしかないのです。


以前に紹介したGinqはこっそり挫折しました……。


テストページはこちら


項目ごとに抽出できるってだけのページです。


趣味の項目だけ、曖昧検索ちっく。といっても1単語だけですけれど。


<?php
   require_once ('common.php');
    $array[] = ['id'=>'0001','name' => 'AAA' ,'age' => '20' ,'hobby'=>'game,soccer','created'=>'2017/01/01'];
    $array[] = ['id'=>'0002','name' => 'BBB' ,'age' => '30' ,'hobby'=>'game','created'=>'2016/01/01'];
    $array[] = ['id'=>'0003','name' => 'CCC' ,'age' => '40' ,'hobby'=>'','created'=>'2016/01/04'];
    $array[] = ['id'=>'0004','name' => 'DDD' ,'age' => '50' ,'hobby'=>'game,soccer,fishing','created'=>'2017/02/01'];
    $array[] = ['id'=>'0005','name' => 'EEE' ,'age' => '60' ,'hobby'=>'baseball,soccer','created'=>'2017/03/01'];
    

   
    $data = new aryFilter();
    $data->setData($array);
//    $data->extMatch('name','BBB'); //一致
//    $data->extMore('age','30'); //以上
//    $data->extLess('age','50'); //以下
//    $data->extStrpos('hobby','game'); //含まれる
//    
//    echo var_dump($data->resFilter())
// 
//    echo var_dump($data->FilterDiff());     
    

    $form = array('id','name','ageMore','ageLess','strpos');
    
    if(!empty($_POST)){
        foreach ($_POST as $key => $val){
            $p[$key] = htmlspecialchars($val,ENT_QUOTES,'UTF-8');
        }
    }else{
        foreach($form as $val)
            $p[$val] = '';          
    }
  
      
    if (!empty($p['id'])){
        $data->extMatch('id',$p['id']);
    }
    
    if (!empty($p['name'])){
        $data->extMatch('name',$p['name']);
    }
    
    if (!empty($p['ageMore'])){
        $data->extMore('age', $p['ageMore']);
    }
    
    if (!empty($p['ageLess'])){
        $data->extLess('age', $p['ageLess']);
    }
    
    if (!empty($p['strpos'])){
        $data->extStrpos('hobby', $p['strpos']);
    }

    $outHtml = $data->resFilter();
    
  
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>filterTest</title>
    </head>
    <body>
        <form method="post" action="">
            <div>ID:<input type="text" name="id" value="<?= $p['id'] ?>"></div>
            <div>名前:<input type="text" name="name" value="<?= $p['name'] ?>"></div>
            <div>年齢:<input type="text" name="ageMore" value="<?= $p['ageMore'] ?>">以上<input type="text" name="ageLess" value="<?= $p['ageLess'] ?>">以下</div>
            <div>趣味:<input type="text" name="strpos" value="<?= $p['strpos'] ?>"></div>
            <div><input type="submit" value="絞込み" ></div>
        </form>
        <table>
           
            <?php if(!empty($outHtml)): ?>
                <tr>
                    <?php foreach($outHtml[0] as $key => $val): ?>
                        <th><?= $key ?></th>
                    <?php endforeach; ?>
                </tr>

                <?php foreach($outHtml as $row => $key): ?>
                    <tr>
                        <td><?= $key['id'] ?></td>   <td><?= $key['name'] ?></td> <td><?= $key['age'] ?></td> <td><?= $key['hobby'] ?></td> <td><?= $key['created'] ?></td>
                    </tr>
                <?php endforeach; ?>
            
                <?php else: ?>
                       検索結果がありません
            <?php endif; ?>
        </table>
    </body>

</html>

クラスのメソッド用にコメアウトをしつつ。


少なくともPHPの部分はわかりやすーい!


さて…肝心のクラス側はこちら

<?php
class aryFilter{
    private $_data;//元データ
    private $_resData;//フィルター結果
    
    function setData($array){
        $this->_data= $array;
        
        $this->_resData = $array; //html表示対策のためセット
    }

    function putAllData(){
        return $this->_data;
    }
    
        
        //フィルタ結果がなければ格納。連続でフィルタを行いたいのでsetDataで使用しない。
        private function exitsResData(){
            
            if(empty($this->_resData)){
                $this->_resData = $this->_data; 
            } 
  
        }
    
    //フィルター後の逆を算出。(含まれないを抽出したいときに)
    function FilterDiff(){
        $this->exitsResData (); //意味ないけど一応、セットしておく。
        $responseArray = $this->_data;
        
  
        foreach ($responseArray as $Row => $resVal){
            
                foreach($this->_resData as $key => $dataVal){
                   
                     if($dataVal['id'] == $resVal['id']){
                         
                         unset($responseArray[$Row]);
                     }
                }
            
        }
        
        return $responseArray;
    }
        
        
    
    //含まれる処理。
    function extStrpos($inkey,$inval){
        $this->exitsResData();
        
        $ary = $this->_resData;
        $putary = [];
   
  
        foreach ($ary as $row){
            foreach ($row as $key => $val){
                if($key == $inkey){  
                    if (strpos($val,$inval)!==False){
                        $putary[] = $row;
                    }
                }
            }  
        }
        
        $this->_resData =$putary;

    }    
        
        
    
    //以上なので注意。演算子を変数にできるんかな。
    function extMore($inkey,$inval){
        $this->exitsResData();
        
        $ary = $this->_resData;
        $putary = [];
   
        
        foreach ($ary as $row){
            foreach ($row as $key => $val){
                if($key == $inkey){
                    if ($val >= $inval){
                        $putary[] = $row;
                    }
                }
            }  
        }
        
        $this->_resData =$putary;
    }
   
    
     function extLess($inkey,$inval){
        $this->exitsResData();
        
        $ary = $this->_resData;
        $putary = [];
   
        
        foreach ($ary as $row){
            foreach ($row as $key => $val){
                if($key == $inkey){
                    if ($val <= $inval){
                        $putary[] = $row;
                    }
                }
            }  
        }
        
        $this->_resData =$putary;
    }
    
    //キーと文字列を指定。一致するものだけを抽出。
    function extMatch($inkey,$inval){
        $this->exitsResData();
        
        $ary = $this->_resData;
        $putary = [];
        
        foreach ($ary as $row){
            foreach ($row as $key => $val){
                if($key == $inkey){
                    if ($val == $inval){
                        $putary[] = $row;
                    }
                }
            }  
        }
        
        $this->_resData =$putary;
        
    }
     
        //フィルター結果を出力。
        function resFilter(){
            return $this->_resData;
        }
    
}
?>


隠蔽とはコードの無様さを隠することである!(断言)


そんなことゆっても、他に思いつかなかったんだもん!!!


使い回し簡単ですし、メソッド足せば機能追加も簡単ですし


クラスって素敵!!


でもVBAのクラスモジュールさん、あなたはだめです。

職業訓練の授業56日目~PHPのテスト、最終日

f:id:nazuna_0124:20170301175105p:plain

ここのところずっと周りを見る余裕がありませんでした

ふと話を聞いてみると、Forループがすでにあやしい人がちらほらと。


全体的に2極化傾向です。勝手に何か作れるかプログラムの基礎からあやふやか


逆によくわからんとこで転んでるのは私くらいの印象。(妙な孤独感)


クラスの作成絡みで先生にちょっと質問してみたのですが、

それ作って何に使うの?感がすごい。


わたし目線だと、これなしで作業進めるのありえないまであるのですが…


ぐぐってすぐ出てこないのが本当に謎ですらあります。(探し方が悪い可能性)


こちらは別に記事書きます。


さてさて、本日はPHPの最終日。いつも通りペーパーテストで終了です。


ざっくりいうと、フォーム作成して、Getで確認画面に投げて、hiddenなフォームから

mysqlにinsertするプログラムの穴埋め問題です。


ここでそろそろ気になります。

このくらいって採用する側から見るとどうなんでしょう?


とりあえず、職業訓練生を採用するメリットは

無料どころか、補助金が入ったりするのはおいといて。


1、このくらいなら未経験と同じ。他の要因で判断する。

2、未経験者と同じ研修を受けさせるが、素養がわかってるので少し安心できる。

3、研修飛ばしてOJTに入れそう。研修だけで退職した人の穴埋めに使えそう。

4、基本構文わかれば勝手に読んでコピペででも作れる。なんでも良いから手伝って!


こんなかんじ?


いちおーVBAですが、未経験者を育てた経験だけで考えれば、

1ヶ月近い研修飛ばせるのはメリット。でも、1ヶ月教えるくらいなら平気だから

他の素養重視したいかなと思ってしまうとこです。


是非おしえてほしい部分なんですがここから派生するなら下記のうちどれが受けがよさそう?


1、大規模開発に向けてフレームワークも勉強しました!

2、出来ることだけでWebアプリ作成して、実際に公開しました。

3、PHPを主軸にアルゴリズムオブジェクト指向、命名規約などの基礎をさらに勉強しました。


他が全く気が進まないのでわたしは2を取るタイプの人間です。



この日の授業で半分が終わったところになります。

しばらくお休みが入り、4月5日からいよいよJAVAの開始です。


連休中に方向性をあらためて模索したいところです!

PHPのここをもっとちゃんと教えてよ!~その3:連想配列、配列、データ形式のタイプ別解説~

f:id:nazuna_0124:20170329192937p:plain

教わっておきながら、ダメ出しをしてみるこのコーナーも3回目。


書くたびに、こう説明されないと理解できない私が馬鹿なんぢゃ


自己嫌悪に陥りかけますが、実際説明するとすぐに理解してくれるので

自分を励ましつつ更新してみたいと思います。


本日のお題は配列関係です。PHPさんは特によく使うので重要ですね!

曖昧なままにしておくと割りと死ねる気がします。


説明しやすいような適当な名前をつけてみました


まず、とにもかくにも配列は繰り返し処理で楽をするためにあります。


配列

最初は基本のおさらい。

$data = [111,222,333];

echo $data[1];

Excelだとこんなかんじ

f:id:nazuna_0124:20170329201003p:plain

いわゆるインデックス番号で数字を取り出せます。

多次元配列

これを多次元と呼ぶか実はちょっと自信ありません

$data[] = [111,222,333];
$data[] = [11,22,33,44,55];

f:id:nazuna_0124:20170329201737p:plain


$row=行ってイメージで把握するとわかりやすいです。

foreach ($data as $row){
    echo "$row[0] $row[1] $row[2] $row[3] <br>" ;
}

//$row[3]はエラーが出ます!

縦でループ。それぞれをインデックス番号で指定してます。


列数が違うのでエラーが出ちゃってます。

対応するには2重ループです。

foreach ($data as $row){
    foreach ($row as $col){
        echo "$col ";
    }
    echo "<br>";
}

この使い方は慣れてなければ絶対に覚えましょう。

フラット型多次元配列(csv形式)

私の勝手な名付けです。

厳密には保証されていませんが、列数(各配列の要素数)と

縦で見たときのデータ型が一致しているものをこう呼びます。


$data[] = ['Sato','21','soccer','2017-03-29'];
$data[] = ['Takahashi','31','baseball','2016-03-21'];
$data[] = ['Yamada','41','game','2015-03-21'];

foreach ($data as $row){
    echo "$row[0] さん <br>";
}

foreach ($data as $row){
    echo $row[1]+ 5 ," 歳 <br>";
}

f:id:nazuna_0124:20170329201954p:plain


CSVデータを扱うことは多いです。


連想配列

上の多次元配列で思うわけです。

何列目が何のデータかわかりにくい。

そんなときに連想配列。まずはおさらい。

$data = ['name'=>'Sato','age'=>'21','hobby'=>'soccer','created'=>'2017-03-29'];

echo $data['name'];

f:id:nazuna_0124:20170329202228p:plain

一応の注意点。

  • $data[0]では取り出せません
  • キー値はユニークとしますphpでは登録はできたりします)

フラット型多次元連想配列(データベース形式)

要するにデータベースにselectした時の返り値です。

この取り出し方がいまいちであれば、絶対に基本からやり直しましょう

むしろこれだけあれば結構なんとかなるかもしれません


$data[] = ['name'=>'Sato','age'=>'21','hobby'=>'soccer','created'=>'2017-03-29'];
$data[] = ['name'=>'Takahashi','age'=>'31','hobby'=>'baseball','created'=>'2016-03-21'];
$data[] = ['name'=>'Yamada','age'=>'41','hobby'=>'game','created'=>'2015-03-21'];

foreach ($data as $row){
    echo $row['name'],"さん<br>" ;
}

f:id:nazuna_0124:20170329202339p:plain

行数に関してはインデックスが使えます。

echo $data[1]['name'] //Takahasiが返ってきます。

リスト型連想配列

勝手な名称その2。これを見たら逃げてください

もしくは、他のタイプに合わせられないかを考えましょう。

どういうわけか、よく例に出される気もします。

$data = ['SQL' => ['基礎','データベース','insert']] ;
$data += ['Javascript' => ['基本構文','DOM']];
$data += ['PHP' => ['POST/GET','session','データベース操作'=>'PDO']];


echo $data['Javascript'][0];//基本構文
echo $data['PHP']['データベース操作']; //pdo

f:id:nazuna_0124:20170329210054p:plain

要するに最初のキー値こそ等価値。その先がぐちゃぐちゃ。

こういうのをあっさりループ出来る人はかっこいいなと思います。

プロパティ型連想配列

オブジェクトを配列に直すとこうなることが結構あります。

名称が同じでもデータとしては違う とか、そもそもキーを持ってないとかあります。

と思いきや、全く同じのもあってループに使えたりもします。

$data = ['車' => ['価格' => '1000000','重量'=> '1t', '色'=>'赤']] ;
$data += ['携帯' => ['価格' => '100000','重量'=> '400g','OS' => 'android']];
$data += ['ボールペン' => ['価格'=>'100','本数'=>'10']];

$山田さんの持ち物 = $data;

$sum = 0;
foreach ($data as $key=>$val){
    $sum += $val['価格'];
}

echo "山田さんの持ち物の総額は $sum円です。";

f:id:nazuna_0124:20170329210238p:plain


プロパティ型多次元連想配列

$山田さんの持ち物 = ['車' => ['価格' => '1000000','重量'=> '1t', '色'=>'赤']] ;
$山田さんの持ち物 += ['携帯' => ['価格' => '100000','重量'=> '400g','OS' => 'android']];
$山田さんの持ち物 += ['ボールペン' => ['価格'=>'100','本数'=>'10']];

$川上さんの持ち物 = ['車' => ['価格' => '500000','重量'=> '1.5t', '色'=>'白']] ;
$川上さんの持ち物 += ['携帯' => ['価格' => '90000','重量'=> '350g','OS' => 'iOS']];
$川上さんの持ち物 += ['ボールペン' => ['価格'=>'1200','本数'=>'5']];

$山川コンビの持ち物[] = $山田さんの持ち物;

$山川コンビの持ち物[] = $川上さんの持ち物;

$res = 0;
foreach ($山川コンビの持ち物 as $row){
    foreach ($row as $key => $val){
        $res += $val['価格'];
    }
}

echo "山川コンビの持ち物の総額は $res 円です。";

f:id:nazuna_0124:20170329210805p:plain



多次元バージョンです。どちらかというと、引っ張ってきたデータが

このタイプに該当すると判断できることが大事です。


これだけ多次元部分をシートが違うことで表現してます。

こうしておくと、オブジェクト、クラスの説明に映るときに理解が早いと思います。


はい…要するにこのプロパティ型多次元連想配列とデータベース型連想配列の違いを

感覚として理解するのに時間がかかったというおちです。


というわけで、これらを覚えればなんとかなる気がするかもしれません!

PHPで経度・緯度の位置情報を取得する~file_get_contentsできないとき向け~2017年

f:id:nazuna_0124:20170309204724p:plain

  • GoogleMapを利用したい!
  • 位置情報は経度と緯度で設定が必要。
  • Googleにgetで投げればjsonで返してくれるサービスがある。
  • file_get_contentsで出来るって書いてあるのにできない!!!


という方(ちょっと前のわたし)向けの更新。

やや古い程度の情報が軒並みだめだったので、表題に年を入れてみたりしました。


コードの結論はこちら。

<?php

$address = "ディズニーランド";
//$url = "http://maps.google.com/maps/api/geocode/json?address=$address&sensor=false&region=India";
$url= "https://maps.googleapis.com/maps/api/geocode/json?address=$address&sensor=false&region=India";

$ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$res = curl_exec($ch);
curl_close($ch);
$resData = json_decode($res);
echo "lat:" , $resData->results[0]->geometry->location->lat;
echo "<br>";
echo "lng:",$resData->results[0]->geometry->location->lng;
echo "<br>";
echo "ファイルの中身<br>";
echo var_dump($resData);

?>


もし、これでもだめなときはphp.iniの設定確認です。

allow_url_fopen = On になってることと

opensslがコメントアウトされてないかをチェック。


NetBeans + xampp環境では設定済みで大丈夫でした!


file_get_contentsで動かない時は、curl関数を使うまでは

すぐに見つかったんですが、試しても動かず。


いくつか回って動くのを見つけた次第でございまする。


先人の皆様に敬礼!

職業訓練の授業55日目~蔵書管理システム2日目、クラスの紹介

f:id:nazuna_0124:20170310221050p:plain

ずっと調子の悪かったマイぱそこんが治りました!

実は最近、急に電源が落ちるという恐ろしい環境でプログラミングしてました。


原因はそのまんま電源でした

交換しただけで完了。1万以下で元気に復活。よい仕事しました。


せっかくなので、交換の手順を紹介。


  • 原因がわかりそうな人を見つける。
  • 交換してもらう。
  • お礼にランチおごる。


…え? 出来る人を探すのって自分でやったのうちに入らないのですか???


さて、今日は昨日と代わり映えしないので早めの更新です。


今日のハイライトは疑問に即答する先生でした

配列のarray_filterのマニュアル眺めてたら見つけたこちら。

PHP: array_filter - Manual

<?php
$input = 4;

if($input & 1){
    echo '奇数';
}else{
    echo '偶数';
}
?>


やりたいことはわかるけど、何やってるかわかんない!

& 1 ってなに??? ぐぐってもわからずギブアップ


先生<「論理積ですね」


かっこよく即回答。


はて論理積??? ビット演算か!


あ~ あれねー。さ、さいきん流行ってるよね…。ほ、ほら特に若い世代にさ…


こういう判定もあるんですねー。勉強になりました。


すぐ聞ける人がいるって環境は大事!



などと書いて終わらせるつもりでしたが、クラスを習ったんでした。


どっちかっていうと、サブルーチンとかそういう感じの説明でした、まる。

職業訓練の授業54日目~蔵書管理システムと三者面談~

f:id:nazuna_0124:20170303232129p:plain

人間には2種類いるそうな。直感派と思考派です。


皆様はどちら?わたしはガチガチの直感派です


そして自分の直感を全く信じない派です


さて、そんな自分のカンが告げています。


今の技術で作れる蔵書管理システムは絶対使わない


理由は後で考える事にして、時間もあまりないので今回は信じることにします。

(主義をあっさり曲げる派でもあります)


代わりに何を作ってたかといいますと、データベースに接続すると

テーブル一覧出して、テーブル選択すればinsert用のフォームを生成して、データがあればselectを全表示する。


ってのを1つのファイルでやってくれるとゆーやつです。


出力結果を、ファイルで別途保存すれば、あっという間にフォームの完成!


フレームワーク使ったほうが楽な気もしますが、気にしません。


少し話を戻しまして、表題の三者面談です。

三者面談といっても親じゃないです。担任講師と就職指導員の方です。

これがあるので、二日間はほぼ放置でプログラムです。


面談前に、履歴書、職務経歴書を作成して今後の方針を決めましょうというもの。


要は勉強ばっかしてないで、ちゃんと就職のために動いてねです。


この種の強制力はとても大事です。

ついグダグダ先延ばしにするわたしにはピッタリ!


文句ばっかり言いながらも、通うことにしてよかったなーと、しみじみ。


こっそり感謝しつつ、おやすみなさい!