TheoryOfContraints official blog
1 | 2 | 3 | 4 | 5 | 最初次のページへ >>

2024/03/26


お久しぶりです。テクノなミュージシャンのはずな、セオリーなコンストレインツなくぼひさです。

あー、ふざけて作った新曲のサブスク配信出ます。「Simplies」って曲です。(⁠•⁠‿⁠•⁠)

シンプル過ぎる曲っす。「Simplies Reprice.」に関してはシンプル過ぎて、音楽3大要素がありません。反=音楽な現代音楽ってやつだったら面白いなー



Ebitenのメモ

Go言語でゲームのプログラムが作れるebitenで画面表示の部分を作ったのでメモ

 

// copy
var (
    subImg    *ebiten.Image
    op      *ebiten.DrawImageOptions
)

func GrapCopyGet(fromScreen *ebiten.Image, x, y int, mx, my int) {
    subImg = fromScreen.SubImage(image.Rect(x, y, mx, my)).(*ebiten.Image)
    op = &ebiten.DrawImageOptions{}
}

func GrapCopyScale(dx, dy float64, angle float64) {
    w, h := subImg.Size()
    var wx, wy float64 = float64(w) * dx, float64(h) * dy

    op.GeoM.Scale(dx, dy)
    op.GeoM.Translate(-wx/2, -wy/2)
    op.GeoM.Rotate(angle / 180 * math.Pi)
    op.GeoM.Translate(wx/2, wy/2)
}

func GrapCopyAlpha(alpha float64) {
    op.ColorM.Scale(1, 1, 1, alpha)
}

func GrapCopyDraw(x,y float64) {
    op.GeoM.Translate(x, y)
    screenImage.DrawImage(subImg, op)
}

久しぶりでURLルーティングを作り直す

仮組みで、とりあえず動いている

 

-------

<?php
/*
    Web Cheep Framework "Typoon".
    Copyright(C)2021 kubohisa.
*/    
    
    ini_set('display_errors',1);
    error_reporting(E_ALL);
    
    // Setting.
    class TyRouter {
        public static $SessionName = "hoge";
        public static $domain = "localhost";
        public static $https = false;
        
        public static $rule = array(
                "/form/:hoge/:hogi/:hoe" => "form"
        );
    }
    
    // Echo files.
    $_SERVER = TyRouterInter::sanitizer($_SERVER);
    
    $_url = ltrim($_SERVER["REQUEST_URI"], "\/");
    if ($_url == "" && file_exists("index.html")) {
        TyRouterInter::echo("index.html");
    } elseif (file_exists($_url.".html")) {
        TyRouterInter::echo($_url.".html");
    } elseif(file_exists($_url."/index.html")) {
        TyRouterInter::echo($_url."/index.html");
    }
    
    // ドメインチェック
    if (!preg_match('#\A'.TyRouter::$domain.'\z#i', $_SERVER['SERVER_NAME'])) {
        // 不正アクセス
        TyRouterInter::error(500);
    }
    
    // md Setting.
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");
    
    // Session Seting.
    ini_set('session.cookie_httponly', 1); // http only.
    ini_set('session.use_strict_mode', 1); // server mode only.
    ini_set('session.cookie_secure', 0); // if https then.

    if (TyRouter::$https) {
        if (empty($_SERVER['HTTPS'])) {
            TyRouterInter::error(500);;
        }
        ini_set('session.cookie_secure', 1); // if https then.
    }
    
    // セッションIDリセット
    session_name(TyRouter::$SessionName);
    session_start();
    session_regenerate_id(true);
    
    // nullバイト
    $_GET = null;
    $_POST = TyRouterInter::sanitizer($_POST);
    $_COOKIE = TyRouterInter::sanitizer($_COOKIE);
    $_urlget = array();
    
    TyData::$post = $_POST;
    TyData::$cookie = $_COOKIE;
    TyData::$server = $_SERVER;

    //
    $_url = $_SERVER["REQUEST_URI"];
    
    // ライフチェック
    if($_url == "/life"){
        echo("life."); exit;
    }
    
    // URLルーティング
    TyRouterInter::$exec = "";
    
    //        echo($_url); exit;
    if ($_url == "/") {
        TyData::$get = array();
        TyRouterInter::execSet("index");
    } else {    
        ksort(TyRouter::$rule);
        foreach(TyRouter::$rule as $key => $value) {
            $key = preg_replace("#\:(.+?)(\/|$)#", "(?<$1>.*?)$2", $key);
            
            if (preg_match("#\A{$key}\z#", $_url, $arr)) {
                foreach($arr as $key_ => $value_){
                    $arr[$key_] = preg_replace('#\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z#u', '', urldecode($arr[$key_]));
                }
                TyData::$get = $arr;
                //print_r($arr);
                
                TyRouterInter::execSet($value);
                break;    
            }
        }    
    }
    TyData::$url = $_url;
    
    //
    if (TyRouterInter::$exec == "" || !file_exists(TyRouterInter::$exec)) {
        TyRouterInter::error(404);
    }
    
    require_once '../lib/smarty/Smarty.class.php';
    $smarty = new Smarty();
    $smarty->template_dir = TyData::$dir;
    $smarty->compile_dir  = '../lib/smarty/templates_c/';
    $smarty->cache_dir    = '../lib/smarty/cache/';
    $smarty->escape_html  = true;
    
    // php呼び出し
    require_once("../lib/Typoon.php");
    require_once(TyRouterInter::$exec);
    exit;
    
    // Classes.
    class TyRouterInter {    
        public static $exec = "";
        
        public static function delSpace($str) {
            return preg_replace('/[\p{C}\p{Z}]/u', '', $str);
        }
        
        public static function sanitizer($arr) {
            if (is_array($arr)){
                return array_map('self::sanitizer', $arr);    
            } else {
                return str_replace("\0", "", $arr);
            }
        }
        
        public static function error($no) {
            header('HTTP', true, $no);
            //header("Location: {$no}.html");
            exit;
        }
        
        public static function echo($file) {
            if (!file_exists($file)) {
                TyRouterInter::error(404);
            }
            echo(file_get_contents ($file));
            exit;
        }
        
        public static function execSet($value) {
            TyData::$dir = "../src/action/".$value."/";
            TyRouterInter::$exec = TyData::$dir."index.php";
        }
    }
    
    use TyData as TyD;
    
    class TyData {
        public static $get = array();
        public static $post = array();
        public static $cookie = array();
        public static $server = array();
        
        public static $url = "";
        public static $dir = "";
    }
    

PHPで変なテキトーなパスワードハッシュの作り方のパッチ var.20200715

少し機能を追加したのでパッチをブログで残しておく

 

ShiftとShiftをXorして、それをXorするのは、クロス・クロスオア・シフトって言うジョークで作った

 

        static function NotXorLeft($x) {
            if ($x > 16) {
                $x = 16;
            }
            $x = self::$seed << $x;
            self::Not();
            self::$seed = self::$seed ^ $x;
        }
        
        static function NotXorRight($x) {
            if ($x > 16) {
                $x = 16;
            }
            $x = self::$seed >> $x;
            self::Not();
            self::$seed = self::$seed ^ $x;
        }
        
        static function XxorShift($x, $y) {
            if ($x > 16) {
                $x = 16;
            }
            if ($y > 16) {
                $y = 16;
            }
            $x = self::$seed >> $x;
            $y = self::$seed << $y;
            $x = $x ^ $y;
            self::$seed = self::$seed ^ $x;
        }
        
        static function NotXxorShift($x, $y) {
            if ($x > 16) {
                $x = 16;
            }
            if ($y > 16) {
                $y = 16;
            }
            $x = self::$seed >> $x;
            $y = self::$seed << $y;
            $x = $x ^ $y;
            self::Not();
            self::$seed = self::$seed ^ $x;
        }
        
 

PHPで変なテキトーなパスワードハッシュの作り方 var.20200713

パスワードハッシュプログラムの改良版を作った。

 

i*でunpuckして、暗号化後、i*のpackで戻して。それを暗号化すると元へ戻るのは面白い


ライセンスは、てきとーなMITライセンスで良いので

 

- 以下、ソースリスト ------

<?php
    class Password {
        static $seed;
        static $OriginSeed;
        static $HashHash;
        
        static function SetSeed($seed) {
            self::$seed = $seed;
            self::$OriginSeed = $seed;
            
            self::$HashHash = "efgsdsegew";
        }
        
        static function ResetSeed() {
            self::$seed = self::$OriginSeed;
        }
        
        static function Lcg($x, $y) {
            self::$seed = floor(self::$seed / 10000);
            $x = $x | 1;    // 奇数で掛ける
            if ($x >= 10000) {
                $x = 9999;
            }
            if ($y >= 10000) {
                $y = 9999;
            }
            self::$seed = self::$seed * $x + $y;
        }
        
        static function Not() {
            self::$seed = ~self::$seed;
        }
        
        static function Xor($x) {
            self::$seed = self::$seed ^ $x;
        }
        
        static function XorLeft($x) {
            if ($x > 16) {
                $x = 16;
            }
            $x = self::$seed << $x;
            self::$seed = self::$seed ^ $x;
        }
        
        static function XorRight($x) {
            if ($x > 16) {
                $x = 16;
            }
            $x = self::$seed >> $x;
            self::$seed = self::$seed ^ $x;
        }
        
        static function RndSeed() {
            // 適当なランダム処理
            self::Lcg(3202, 1233); // 乗算+加算から始めるのがセオリーらしい
            
            self::Not();
            self::Xor(904845396);
            self::Not();
            self::Xor(12345678901234567);
            self::XorRight(15);
            
            // エラーチェック
            if (is_float(self::$seed)) {
                echo("Error: Float."); exit;
                //self::$seed = self::$OriginSeed;
            }
             if (self::$seed == 0) {
                self::$seed = self::$OriginSeed;
            }
           
            return self::$seed;
        }
        
        static function MakeHash ($password, $seed) {
            self::SetSeed($seed);
            
            $data = unpack("i*", $password);
            
            $password = "";
            foreach ($data as $value) {
                $value ^= self::RndSeed();
                
                $password .= pack("i*", $value);
            }
                        
            return hash_hmac('ripemd160', $password, self::$HashHash);
        }
        
        // 参考URL
        // https://qiita.com/k_nitadori/items/42970f850d5e2cffdff7
    }
    
    echo(Password::MakeHash("password", 1234567890));

 

PHPで変なテキトーなパスワードハッシュの作り方

ツイッターの方で、テキトーでパスワードハッシュを作ったら、悪いハッカーが嫌がるのではないのか?を考察していたけど

 

それを暇つぶしで実装して、大体で動いている物が出来た。いくつかパスワードを作成して、ハッシュが出来ているのは確かめたけど。実際で使えるかどうかは知らない

 

試験的な実装なので

 

- 以下、ソースリスト ------

<?php
    class Password {
        static $seed;
        
        static function RndSeed() {
            // 適当なランダム処理
            self::$seed = ~self::$seed;
            self::$seed = self::$seed ^ 904845396; //XOR
            self::$seed = self::$seed ^ 12345678901234567; //XOR
            self::$seed = ~self::$seed; //NOT
            self::$seed = self::$seed * 6 + 1233;
            
            // 丸める
            self::$seed = self::$seed % 10000000000000000000;
            
            return self::$seed;
        }
        
        static function MakeHash ($password, $seed) {
            self::$seed = $seed;
            
            $data = unpack("i*", $password);
            
            $password = "";
            foreach ($data as $value) {
                $seed = self::RndSeed();
                $value = $value ^ $seed;
                
                $password .= pack("C*", $value);
            }
            return hash_hmac('ripemd160', $password, 'secret');
        }
    
    }
    
    echo(Password::MakeHash("password", 1234567890));

Very Light Weight Frame work "Typon" Ver20200629

とりあえず、今の状況。本体のみ

 

-------

<?php
    /**
     * Very light framework is the "Typon".
     * Ver.20200629.
     * @author kubohisa at pdbrec.com.
     */
    
    // Requires.
    require_once('../lib/typon/stdio.phl');
    require_once('../lib/typon/setting.phl');
    require_once('../lib/smarty/Smarty.class.php'); // Smarty3.
    
    /**
     * Start Typoon IPL.
     */

    // null.
    function sanitizer($arr) {
        if (is_array($arr) ){
            return array_map('sanitizer', $arr);    
        }
        return str_replace("\0", "", $arr);
    }
    $_POST = sanitizer($_POST);
    $_COOKIE = sanitizer($_COOKIE);
    $_SERVER = sanitizer($_SERVER);
    $_GET = array(); // Delete gets.
    
    // Domain check.
    if ($_SERVER['SERVER_NAME'] != Ty\TyponReg::$DomeinName) {
        Ty\STDIO::ErrorCode(500);
        exit;        
    }
    
    // Https check.
    // テスト環境ではhttpなので外してます
/*    if (empty($_SERVER['HTTPS'])) {
        Ty\STDIO::ErrorCode(500);
        exit;        
    }
*/
    // Longer Url Check.
    if (strlen($_SERVER["REQUEST_URI"]) > 1000) {
        Ty\STDIO::ErrorCode(500);
        exit;        
    }
    
    // md Setting.
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");
    
    // セッションIDリセット
    session_name(Ty\TyponReg::$SessionName);
    session_start();
    session_regenerate_id(true);
    
    // Get Get.
    $UrlGet = preg_split("/\//", $_SERVER["REQUEST_URI"]);
    array_shift($UrlGet);
    
    // Trim Get.
    foreach ($UrlGet as $key => $value){
        $UrlGet[$key] = Ty\Strings::Trim($value);
    }
    
    // ヘルスチェック(仮)
    if ($UrlGet['0'] == "health") {
        echo("Clean.");
        exit;
    }
    
    // adtionがあるか?
    if ($UrlGet['0'] == "" || $UrlGet['0'] == "index") {
        $UrlGet['0'] = "index";
    }
    $ExecName = array_shift($UrlGet);

    if (! preg_match('/\A[a-zA-Z0-9\-\_]++\z/i', $ExecName)) {
        Ty\STDIO::ErrorCode(505);
        exit;
    }
    
    $Statename = "";
    if (! empty($_POST['state'])) {
        $_POST['state'] = Ty\Strings::Trim($_POST['state']);
        
        if (! preg_match('/\A[a-zA-Z0-9\-\_]++\z/i', $_POST['state'])) {
            Ty\STDIO::ErrorCode(505);
            exit;
        }
        
        $Statename = $_POST['state'];
    } else {
        $Statename = "index";
    }
    
    $PresentName = "../scripts/".$ExecName."/".$Statename.".action";
    
    if (! file_exists($PresentName)) {
        Ty\STDIO::ErrorCode(505);
        exit;
    }
    
    // responseがあるか?
    $ResponceName = "../scripts/".$ExecName."/".$Statename.".responce";
    if (! file_exists($ResponceName)) {
        $ResponceName = "";
    }
    
    // Seting Smarty.
    $smarty = new Smarty();
    $smarty->loadFilter('variable', 'htmlspecialchars');
    $smarty->template_dir = '../html';
    $smarty->compile_dir  = '../lib/templates_c';

    // 実行
    require_once($PresentName);
    
    if ($ResponceName != "") {
        require_once($ResponceName);
    }
    
    exit;

Very Light Frame work is "Typoon" Ver.20200223.

とりあえず、ライブラリの実装を進めてますが、バリデーターが沼だ…

ショボーン

 

で、簡易MVPパターンで組んでたけど、ADRパターンを知ったので、POSTでActionのモードを投げてソースリストを分岐で読み込む部分を追加して、Actionのソースを分割できる風に実装した

 

その部分のみをブログで公開しますよ。進捗は進んでます

 

[Typoon.php]

<?php
    /**
     * Very light framework is the "Typoon".
     * Ver.20200223.
     * @author kubohisa at pdbrec.com.
     */
    
    /**
     * Typoon Seting.
     */
    class TypoonReg
    {
        static $SessionName = "Hie4Ewxz";
        static $DomeinName = "localhost";
        
        static $HashDummyA = "esfdf4gesg";
        static $HashDummyB = "erg6gefbdr";
    }
    
    // Requires.
    require_once('../lib/typoon/stdio.phl'); // Smarty3.
    require_once('../lib/smarty/Smarty.class.php'); // Smarty3.
    
    /**
     * Start Typoon IPL.
     */

    // null.
    function sanitizer($arr) {
        if (is_array($arr) ){
            return array_map('sanitizer', $arr);    
        }
        return str_replace("\0", "", $arr);
    }
    $_POST = sanitizer($_POST);
    $_COOKIE = sanitizer($_COOKIE);
    $_SERVER = sanitizer($_SERVER);
    $_GET = array(); // Delete gets.
    
    // Domain check.
    if ($_SERVER['SERVER_NAME'] != TypoonReg::$DomeinName) {
        TypoonSTDIO::ErrorCode(500);
        exit;        
    }
    
    // Https check.
    // テスト環境ではhttpなので外してます
/*    if (empty($_SERVER['HTTPS'])) {
        TypoonSTDIO::ErrorCode(500);
        exit;        
    }
*/
    // md Setting.
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");
    
    // セッションIDリセット
    session_name(TypoonReg::$SessionName);
    session_start();
    session_regenerate_id(true);
    
    // Get Get.
    $UrlGet = preg_split("/\//", $_SERVER["REQUEST_URI"]);
    array_shift($UrlGet);
    
    // Trim get.
    foreach ($UrlGet as $key => $value){
        $UrlGet[$key] = TypoonStrings::Trim($value);
    }

    // プレゼンテーターがあるか?
    if ($UrlGet['0'] == "") {
        $UrlGet['0'] = "index";
    }
    if (! empty($_POST['mode'])) {
        $UrlGet['0'] = $UrlGet['0']."@".$_POST['mode'];
    }
    if (! preg_match('/\A[a-zA-Z0-9\-\_\@]++\z/i', $UrlGet['0'])) {
        TypoonSTDIO::ErrorCode(404);
        exit;
    }
    if (! file_exists("presenter/".$UrlGet['0'].".present")) {
        TypoonSTDIO::ErrorCode(404);
        exit;
    }
    $PresentName = array_shift($UrlGet);
    
    // Seting Smarty.
    $smarty = new Smarty();
    $smarty->loadFilter('variable', 'htmlspecialchars');
    
    // 実行
    require_once("presenter/".$PresentName.".present");
    exit;
?>

phpマイクロ過ぎるフレームワーク”Typoon” Ver.20200216.

お久しぶりです、くぼひさです

 

暇なので、作り始めました。仮組みのプログラムぼろぼろで凄いよね…

笑い泣き

 

とりあえず、ルーティングの部分のみを作りました。以下がソースですよ。後はバリデーションなどのメゾットを追加します

 

良い暇つぶしになりそうだ

 

[typoon.php]

<?php
    /**
     * Very light framework is the "Typoon".
     * Ver.20200216.
     * @author kubohisa at pdbrec.com.
     */
    
    /**
     * Typoon Seting.
     */
    class TypoonReg
    {
        static $SessionName = "Hie4Ewxz";
        static $DomeinName = "localhost";
    }
    
    /**
     * Start Typoon IPL.
     */
    
    // null.
    function sanitizer($arr) {
        if (is_array($arr) ){
            return array_map('sanitizer', $arr);    
        }
        return str_replace("\0", "", $arr);
    }
    $_POST = sanitizer($_POST);
    $_COOKIE = sanitizer($_COOKIE);
    $_SERVER = sanitizer($_SERVER);
    $_GET = array(); // Delete gets.
    
    // Domain check.
    if ($_SERVER['SERVER_NAME'] != TypoonReg::$DomeinName) {
        header('HTTP', true, 500);
        exit;        
    }
    
    // Https check.
    // テスト環境ではhttpなので外してます
/*    if (empty($_SERVER['HTTPS'])) {
        header('HTTP', true, 500);
        exit;        
    }
*/
    // Requires.
    require_once('../lib/smarty/Smarty.class.php'); // Smarty3.
    
    // md Setting.
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");
    
    // セッションIDリセット
    session_name(TypoonReg::$SessionName);
    session_start();
    session_regenerate_id(true);
    
    // Get Get.
    $UrlGet = preg_split("/\//", $_SERVER["REQUEST_URI"]);
    array_shift($UrlGet);

    // プレゼンテーターがあるか?
    if ($UrlGet['0'] == "") {
        $UrlGet['0'] = "index";
    }
    if (! preg_match('/\A[a-zA-Z0-9\-\_]+\z/i', $UrlGet['0'])) {
        header('HTTP', true, 404);
        exit;
    }
    if (! file_exists("presenter/".$UrlGet['0'].".present")) {
        header('HTTP', true, 404);
        exit;
    }
    $PresentName = array_shift($UrlGet);
    
    // exec.
    require_once("presenter/".$PresentName.".present");
    exit;
?>

"Typon" Ver.20190609.

Typonのフレーム部分は動いていて、それぞれの関数は確かめてない版だ

 

動作チェックできてないので、使うなよ。責任は取らんぞ

以上 ニコ

 

-------[index.php]-------

<?php
    // Typon Seting.
    define("typonDomain",        "localhost");
    define("typonExecNo",        0);
    define("typonExecDir",        "frames/");
    define("typonDataDir",        "data/");
    define("typonSessionName",    "Heni39EDc");
    define("typonHashSeed",        "edJIe23Om");
    define("typonDebug",        0);
    
    // Session Seting.
    ini_set('session.cookie_httponly', 1); // http only.
    ini_set('session.use_strict_mode', 1); // server mode only.
    // ini_set('session.cookie_secure', 1); // if https then.
    
    //     ヌルバイトアタック処理
    function sanitizer($array) {
        if (is_array($array)) {
            return array_map('sanitizer', $array);
        }
        return str_replace("\0", "", $array);
    }

    $_POST = sanitizer($_POST);
    $_COOKIE = sanitizer($_COOKIE);
    $_SERVER = sanitizer($_SERVER);
    $_GET = array(); // Delete gets.
    
    // Typon Debug Check.
    if (typonDebug == 1) {
        $error = 0;
        if (!preg_match('/\A'.typonDomain.'/i', $_SERVER['SERVER_NAME'])) {
            $error = 1;
        } elseif (!file_exists(typonDataDir)) {
            $error = 1;
        } elseif (!file_exists(typonExecDir)) {
            $error = 1;
        } elseif (!file_exists(typonExecDir."toppage.frame")) {
            $error = 1;
        }
        
        if ($error == 1) {
            echo("[Typon] Error.");
        } else {
            echo("[Typon] No Error.");
        }
        exit;
    }
        
    // ドメインチェック
    if (!preg_match('/\A'.typonDomain.'/i', $_SERVER['SERVER_NAME'])) {
        // 不正アクセス
        echo("[Typon] Domain name Error."); exit;
    }
    
    // md Setting.
    mb_language("Japanese");
    mb_internal_encoding("UTF-8");
    
    // セッションIDリセット
    session_name(typonSessionName);
    session_start();
    session_regenerate_id(true);
    
    //Get $_GET.
    $requestDATA = STD::cmdline();
    
    // プレゼンテーターネームチェック
    $exec = $requestDATA['0'];
    if ($exec == "") {
        // "/"なのでtoppageを実行。indexはindex.phpと競合する
        $exec = "toppage";
        $requestDATA['0'] = $exec;
    } elseif (!preg_match('/\A[a-zA-Z0-9\-\_]+\z/i', $exec)) {
        // 不正アクセスなのでログアウト
        STD::logout();
        exit;
    }
    
    // プレゼンテーターがあるか?
    if (! file_exists(typonExecDir.$exec.".frame")) {
        if ($exec == "toppage") {
            // error.
            echo("[Typon] Error: No thing [toppage.frame].");
            exit;
        } else {
            // 不正アクセスなのでログアウト
            STD::logout();
            exit;
        }
    }
    
    // 実行
    require_once(typonExecDir.$exec.".frame");
    exit;

class STR {    
    // 全角トリム
    function mbTrim($str) {
        $str = self::toUtf8($str);
        $str = preg_replace('/[\r\n]/u', '', $str);
        return preg_replace('/\A[\p{C}\p{Z}]++|[\p{C}\p{Z}]++\z/u', '', $str);
    }
    
    // UTF変換
    function toUtf8($str) {
        return mb_convert_encoding($str, "UTF-8", "auto");
    }
    
    // Nullバイト削除
    function nullDelete($str) {
        return str_replace("\0", "", $str);
    }
    
    // <br>変換
    function toBr($str) {
        $str = preg_replace('/\n\r/u', '\r\n', $str);
        $str = preg_replace('/\r\n/u', '\r', $str);
        $str = preg_replace('/\n/u', '\r', $str);
        $str = preg_replace('/\r/u', '<br>', $str);
        return $str;
    }
    
    function toRn($str) {
        $str = preg_replace('/<br>/u', '\r\n', $str);
        return $str;
    }

    function len($str) {
        return mb_strlen($str);
    }
    
    function checkNull($str) {
        return empty($str);
    }
    
    function htmlConvert($str) {
        return htmlspecialchars($str, ENT_QUOTES);
    }

    function randomText($len) {
        $char = array_merge(range('a', 'z'), range('A', 'Z'), range('0', '9'));
        
        $salt = "";
        for ($i = 0; $i < $len; $i++) {
            $salt .= $char[mt_rand(0, count($char) - 1)];
        }
        
        return $salt;
    }

    function checkUrl($str) {
        return preg_match('/\Ahttps?(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)\z/', $str);
    }

    function checkPassword($str) {
        return preg_match('/\A[a-zA-Z0-9]+\z/i', $str);
    }

    function checkNumber($str) {
        return preg_match('/\A[0-9]+\z/i', $str);
    }
    
    function checkMail($str) {
        // https://gist.github.com/felds/864067
        $regexp = '/^(?:[a-z0-9!#$%\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}'.
                '~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\['.
                '\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-'.
                '9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-'.
                '9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?'.
                '|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-' .
                '\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])$/';
        return preg_match($regexp, $str);
    }
}

class FORM {
    function session() {
        $_SESSION['session'] = STR::randomText(60);
        return $_SESSION['session'];
    }
    
    function sessionCheck($str) {
        $check = $_SESSION['session'];
        $_SESSION['session'] = null;
        
        if ($check == $str) {
            return true;
        } else {
            return false;
        }
    }
}

class STD {
    // GET取得
    function cmdline() {
        $str = trim($_SERVER['REQUEST_URI'], "\/");
        $data = explode("/", $str);
        
        if (typonExecNo > 0) {
            for ($i = 0; $i < typonExecNo; $i++) {
                unset($data[$i]);
            }
            $data = array_values($data);
        }
        
        return $data;
    }

    // ドメインチェック
    function refererCheck() {
        if (!preg_match('/\Ahttps?(\:\/\/)'.typonDomain.'[\:\/]/i', $_SERVER['HTTP_REFERER'])) {
            // 不正アクセスなのでログアウト
            self::reset();
            exit;
        }
    }
    
    // Loginセーブ
    function loginSave($userId) {
        $_SESSION['id'] = $userId;
        STD::uidMake($userId);
    }
    
    // Loginチェック
    function loginCheck() {
        if (empty($_SESSION['id'])) {
            self::logout();
            exit;
        } else {
            self::refererCheck();
        }
    }

    // ログアウト
    function logout() {
        $_SESSION = array();

        // クッキーを削除
        setcookie(typonSessionName, '', time()-1000);
        setcookie(typonSessionName, '', time()-1000, '/');
        
        session_destroy();
        header("Location: /");
    }
    
    // uID.
    function uidMake() {
        $user_id = $_SESSION['id'].STR::randomText(60);
        $user_id = hash_hmac("ripemd160", $user_id, typonHashSeed);
        
        $_SESSION['uid'] = $user_id;
        return $_SESSION['uid'];
    }
    
    function uidCheck($str) {
        $uid = $_SESSION['uid'];
        // self::uidMake($_SESSION['id']);
        if ($_SESSION['uid'] == $str) {
            return true;
        }
        return false;
    }
    
    function uidGet() {
        return $_SESSION['uid'];
    }
        
    // time.
    function timeSectime($y, $mon, $d, $a, $m) {
        return mktime($a, $m, 0, $mon, $d, $y);
    }
    
    function timeDateRss($sectime) {
        return date(DATE_RFC822, $sectime);
    }
    
    function timeDate($sectime) {
        return getdate($sectime);
    }
}

class DB {
    var $db;
    
    // mysql
    function make() {
        if (empty($this->db)) {
            $this->db = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
        }
        
        return $this->db;
    }
    
    function get() {
        return self::make();
    }
    
    function error() {
        $str = "";
        
        if($this->db->connect_errno) {
            $str = $this->db->connect_errno . ' : ' . $this->db->connect_error;
        }
        return $str;
    }
    
    function close() {
        mysqli_close($this->db);
    }

    // JSON.
    function jsonWrite($data, $array) {
        $file = typonDataDir."{$data}.data";
        if (! file_exists($file)) {
            return false;
        }
        if (file_put_contents($file, serialize($array)) == false) {
            return false;
        }
        return true;
    }
    
    function jsonRead($data) {
        $json = array();
        $file = typonDataDir."{$data}.data";
        if (! file_exists($file)) {
            return $json;
        }
        $json = unserialize(file_get_contents($file));
        return $json;
    }
}

class MAIL {
    function send($toAdrs, $fromAdrs, $subject, $body) {
        if (!STR::checkMail($toAdrs)) {
            return false;
        } elseif (!STR::checkMail($fromAdrs)) {
            return false;
        }
        
        $header = "From: $fromAdrs\nReply-To: $fromAdrs\n";
        return mb_send_mail($toAdrs, $subject, $body, $header);
    }
}

class SONOTA {
    // Make Crypt's Salt.
    function makeSalt() {
        $char = array_merge(range('a', 'z'), range('A', 'Z'), array('.', '/'));
        
        $salt = "$2y$07$";
        for ($i = 0; $i < 22; $i++) {
            $salt .= $char[mt_rand(0, count($char) - 1)];
        }
        $salt .= "$";
        
        return $salt;
    }
}
?>



 

1 | 2 | 3 | 4 | 5 | 最初次のページへ >>