nishiru3の日記

備忘録です。ネットのゴミ。

isset関数メモ

POST値の引き取り

PHPでPOST値をチェックするのにisset関数をよく使う。
実際の振る舞いについて確認のメモを残しておく。

ソース

<?php
/**
 * isset関数
 * http://php.net/manual/ja/function.isset.php
 * (PHP 4, PHP 5, PHP 7)
 * isset — 変数がセットされていること、そして NULL でないことを検査する
 * 変数が空文字の場合、TRUEであることに注意
 * http://php.net/manual/ja/types.comparisons.php
 */
/**
 * 変数が宣言されていて、空文字であるのでTRUEになる。
 */
$var ='';
if(isset($var)) {
    echo 'TRUE'.'<br />';
} else {
    echo 'FALSE'.'<br />';
}
/**
 * 変数が宣言されてるのみなので、FALSE
 */
$x;
if(isset($x)) {
    echo 'TRUE'.'<br />';
} else {
    echo 'FALSE'.'<br />';
}
/**
 * 変数が宣言されていないので、FALSE
 */
if(isset($y)) {
    echo 'TRUE'.'<br />';
} else {
    echo 'FALSE'.'<br />';
}

preg_matchによる所定の書式の文字の確認

ちょっとした正規表現

以前、正規表現による値が数値かどうかを確認する記事を書いたが、
PHPで日付データを確認する方法をメモしておく。

nishiru3.hatenablog.com

ソース

まだ十分ではないが、書式についてはチェックできる。ただし、2018/33/33とかにもマッチしてしまうので、
その部分は修正が必要。

<?php
/**
 * preg_matchによる日付のチェック
 * 「2018/12/12 00:00:00」
 * $patternで正規表現のパターンを設定
 * 「^」、「$」は最初と最後を固定
 *  \d{4} 西暦の4文字
 *  ([/-]?) 次の月の区切りとして/もしくは-。ただしなくてもよい。
 *  \d{1,2} 月の1文字もしくは2文字。
 *  ([/-]?) 次の日の区切りとして/もしくは-。ただしなくてもよい。
 *  ¥d{1,2} 日の1文字もしくは2文字
 *  \s スペース
 *  \d{2}:\d{2}:\d{2} 00:00:00にマッチ。上位の桁の場合も2文字でないとマッチしない。
 */
$pattern="#^\d{4}([/-]?)\d{1,2}([/-]?)\d{1,2}\s\d{2}:\d{2}:\d{2}$#";

$str_time='2018/12/22 00:00:00';
if(preg_match($pattern,$str_time,$match)){
    print $str_time."は正しい書式です。"."<br>";
}else{
    print $str_time."は正しくない書式です。"."<br>";
}

PDOによるテーブルやデータの操作

基本的な操作

すぐ忘れちゃうので書いておく。

<?php
/**
 * PDOによる
 * 「テーブルの作成」
 * 「データの挿入」
 * 「データの取得」
 * 「データの削除」
 * 「データの取得」
 * 「テーブルの削除」
 * http://php.net/manual/ja/book.pdo.php
 */
/**
 * PDOでMySQLに接続するためのパラメータ
 */
$dsn = 'mysql:dbname=projects;host=localhost';
$user = 'admin';
$password = 'pass';
/**
 * MySQLに接続
 */
try{
    $dbh = new PDO($dsn, $user, $password);
    print('接続に成功しました。<br>');
}catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}
/**
 * テーブルの作成
 */
$stmt = $dbh->query("CREATE TABLE projects.meibo (id INT,name TEXT)");
/* 結果の取得*/
$results = $stmt->fetchall();
/**
 * データの挿入
 */
$stmt = $dbh->query("INSERT INTO projects.meibo VALUES(1,'名無し1')");
$results = $stmt->fetchall();
/* データの取得
 * PDO::FETCH_ASSOC 連想配列で返すフラグみたいなもの
 */
$stmt = $dbh->query("SELECT * FROM projects.meibo");
$results = $stmt->fetchall(PDO::FETCH_ASSOC);
echo '<br />データ挿入後<br />';
var_dump($results);
/**
 * データの削除
 */
$stmt = $dbh->query("DELETE FROM projects.meibo WHERE id = 1");
$results = $stmt->fetchall(PDO::FETCH_ASSOC);
echo '<br />データ削除後<br />';
var_dump($results);
/**
 * デーブルの削除
 */
$stmt = $dbh->query("DROP TABLE projects.meibo");
$results = $stmt->fetchall();

strposによる検索

strpos

strpos関数を使って検索を実現する。

http://php.net/manual/ja/function.strpos.php

具体例

<?php
/**
 * http://php.net/manual/ja/function.strpos.php
 * (PHP 4, PHP 5, PHP 7)
 *  strpos — 文字列内の部分文字列が最初に現れる場所を見つける
 */
/**
 * 次の例は検索がひっかかるパターン
 */
// 検索対象文字列
$text = '文字列の検索';
// 検索文字列
$retrieval = '';
//
$pos = strpos($text,$retrieval);
// 
if($pos !== false) {
    echo '検索一致';
} else {
    echo '検索不一致';
}

正規分布の指数型分布族への変形

指数型分布族

指数型分布族にはいくつかの表現があるが、本記事では次のとおりとする。

f:id:nishiru3:20180714063027p:plain

ここで、\thetaは自然パラメータ、\phiは分散に関するパラメータである。

正規分布の密度関数

正規分布の密度関数は次のとおりである。

f:id:nishiru3:20180714063247p:plain

指数型分布族への変形

指数型分布族への変形は次のとおりである。

f:id:nishiru3:20180714063357p:plain

指数型分布族との比較

上記の二つを比較すると次のとおりである。

f:id:nishiru3:20180714063536p:plain

期待値と分散

指数型分布族の期待値と分散の導出はまだやってないが、
それに従うと、次のとおりである。

f:id:nishiru3:20180714063844p:plain

数値データかどうかのチェック

モチベーション

  • 数値解析をしていると、入力データや出力データが数値データになっているかのチェックをする事が多い。
  • 解析そのものはFortranC言語で書いてるので、入力時や出力時のチェックを行うのも良いが、文字や文字列処理を書くのはめんどくさい。
  • AWKPerlであれば文字や文字列処理は得意。
  • ひと手間かかるが、AWKPerlで一度確認した方が結果的に時間がかからない。

AWKの場合

プログラム

BEGIN{
    FS = ','
}
/^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][+-]?[0-9]+)?$/{
    print $0;
}
END{
}
  • BEGIN内では、フィールドセパレータ(FS)をカンマに設定している。

概略

  • 「^」:最初にマッチ
  • 「$」:最後にマッチ
  • 「[+-]?」:+もしくは-が付いても付かなくても構わない。
  • 最初の小かっこ内は、仮数部に引っかかるようなパターンである。
  • 次の小かっこ内は、指数部に引っかかるようなパターンである。ただし、カッコ後に「?」が付いているので、指数部はあってもなくても構わない。

仮数

  • [0-9]+で1コ以上の数値の並び。
  • 「[.]?」で小数点があってもなくても構わない。
  • [0-9]*でその後の数字が0コ以上。
  • 「|」は、または、の意。整数部が0の場合省略可能。

指数部

  • 指数部は「[eE]」で表記。プログラムによってはDとかでも出力されるので、[eED]としておけば、「e」もしくは「E」もしくは「D」で引っかかるようにできる。
  • 「[+-]?」は指数部のプラスマイナスにマッチする。あってもなくても良い
  • 「[0-9]+」は「1.0E-10」の「10」なんかに引っかかる。「+」が付いているので、1コ以上の数字が必要。
  • 最後の「?」は、指数部全体にかかるので指数部はあってもなくても構わない。

この表現はPerlでも使える。

プログラミング言語AWK

プログラミング言語AWK

  • 作者: A.V.エイホ,P.J.ワインバーガー,B.W.カーニハン,足立高徳
  • 出版社/メーカー: USP研究所
  • 発売日: 2010/01/01
  • メディア: 単行本(ソフトカバー)
  • クリック: 1回
  • この商品を含むブログを見る

表組みのCSSメモ

表組みとCSS

HTML

htmlファイルは次のとおり、linkはCSSファイルのパスを書いておく。
talbleのクラスはCSSファイルを参照。

<!DOCTYPE html>
<html>
<head>
    <title>表組み</title>
    <link rel="stylesheet" href="./css/style.css">
</head>
<body>
<table class="sample">
    <tr>
        <th>th1</th>
        <th>th2</th>
        <th>th3</th>
        <th>th4</th>
    </tr>
    <tr>
        <td>td1</td>
        <td>td2</td>
        <td>td3</td>
        <td>td4</td>
    </tr>
    <tr>
        <td>td1</td>
        <td>td2</td>
        <td>td3</td>
        <td>td4</td>
    </tr>
    <tr>
        <td>td1</td>
        <td>td2</td>
        <td>td3</td>
        <td>td4</td>
    </tr>
    <tr>
        <td>td1</td>
        <td>td2</td>
        <td>td3</td>
        <td>td4</td>
    </tr>
</table>
</body>
</html>

CSS

CSSファイルは次のとおり。
コメントは/**/ で行う。

table, th, td {
    border-collapse: collapse;
    border: 1px solid #ccc;
    line-height: 1.5;
}
/* sampleはhtml側でclassとして指定する*/
table.sample th {
    width: 150px;
    padding: 10px;
    font-weight: bold;
    vertical-align: top;
    background: #3f3f3f;
    color: #ffffff;
}
table.sample td {
    width: 350px;
    padding: 10px;
    vertical-align: top;
}
/* 偶数と奇数で切り替える */
tr:nth-child(even) {
    background: #d9d9d9;
}