ドメインが利用可能かチェックするPHPスクリプト

ドメイン名が利用可能かチェックするのに dns_get_record 関数を使います。
パラメータには url か domain.com のようなドメイン名
結果はテキストで OK か NG を返します。

<?php
$url = $_GET["url"];
$res = parse_url($url);
$name = "";

if (isset($res['host'])) {
    $name = $res['host'];
} else if (isset($res['path'])) {
    $name = $res['path'];
}

header('Content-type: plain/text');
if (!empty($name)) {
    $result = dns_get_record($name);
    if ($result === false || empty($result)) {
        echo 'NG';
    } else {
        echo 'OK';
    }
} else {
    echo 'ERR';
}
exit;
?>

このPHPスクリプトをエクセルVBAから呼び出す例:

'
' ドメインチェック WebAPI
'
'   URL: https://www.northwind.mydns.jp/samples/webservice/checkdomain.php
'   パラメータ: url
'   レスポンス:
'        OK: 利用可能
'        NG: 利用不可
'
' Ex.
'  IsDomainAvailable("northwind.mydns.jp")        = True
'
'
Function IsDomainAvailable(DomainUrl As String) As Boolean
    On Error GoTo ErrHandler

    Dim Request As Object
    Dim checkerUrl As String

    IsDomainAvailable = False
    checkerUrl = "https://www.northwind.mydns.jp/samples/webservice/checkdomain.php"

    Set Request = CreateObject("WinHttp.WinHttpRequest.5.1")

    With Request
      .Open "GET", checkerUrl & "?url=" & DomainUrl, False
      .send

        If .StatusText = "OK" And .ResponseText = "OK" Then
            IsDomainAvailable = True
        End If
    End With

    Set Request = Nothing
    
    Exit Function
ErrHandler:
    Debug.Print Err.Number & ": " & Err.Description
End Function

Sub Test()

    Debug.Print IsDomainAvailable("northwind.mydns.jp")

End Sub

CentOS7 をPHP7.0 インストール

CentOS7 の PHP を PHP7.0 にしてたら、結構ハマってしまった。

結局、思考錯誤の結果、一度全部 PHP を削除:
# yum remove php*

そして、PHP7.0 を REMI リポジトリからインストール:
# yum install –enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-mysqlnd php-intl php-pear

インストールされたパッケージ:
# rpm -qa | grep php
php-common-7.0.33-8.el7.remi.x86_64
php-xml-7.0.33-8.el7.remi.x86_64
php-7.0.33-8.el7.remi.x86_64
php-pear-1.10.9-2.el7.remi.noarch
php70-php-xml-7.0.33-8.el7.remi.x86_64
php70-php-pecl-mysql-1.0.0-0.9.20151007git294ce3b.el7.remi.x86_64
php-pdo-7.0.33-8.el7.remi.x86_64
php70-php-mysqlnd-7.0.33-8.el7.remi.x86_64
php-mysqlnd-7.0.33-8.el7.remi.x86_64
php-json-7.0.33-8.el7.remi.x86_64
php70-runtime-2.0-1.el7.remi.x86_64
php70-php-mbstring-7.0.33-8.el7.remi.x86_64
php-gd-7.0.33-8.el7.remi.x86_64
php70-php-gd-7.0.33-8.el7.remi.x86_64
php-cli-7.0.33-8.el7.remi.x86_64
php70-php-common-7.0.33-8.el7.remi.x86_64
php-fedora-autoloader-1.0.0-1.el7.remi.noarch
php70-php-json-7.0.33-8.el7.remi.x86_64
php70-php-pdo-7.0.33-8.el7.remi.x86_64
php-devel-7.0.33-8.el7.remi.x86_64
php-process-7.0.33-8.el7.remi.x86_64
php-mbstring-7.0.33-8.el7.remi.x86_64
php-intl-7.0.33-8.el7.remi.x86_64

python で database クラスを作ってみる (修正版)

python で database クラスを作ってみる (Part 5) で作ったクラスでは、python3.6 では動かなかったので、少し改修して python3.6 で動作するようにしました。

動作確認下環境:
1)
CentOS Linux release 7.5
mysql Ver 15.1 Distrib 5.5.56-MariaDB
Python 2.7.5
Python 3.6.5

2)
CentOS release 6.10
mysql Ver 14.14 Distrib 5.1.73
Python 2.6.6
Python 3.6.5

Python の MySQL インターフェースに mysqlclient を使用します。

# pip install mysqlclient
# pip3.6 install mysqlclient

以前の SimpleDB クラスは、Python 3.6 でエラーになってしまうので手直ししたものを再掲します。

SimpleDBクラスのソース: simpledb.py
(ファイル名を simpledb.py_.txt から “simpledb.py” に変更してください。)

python で database クラスを作ってみる (Part 5)

今回は、複雑な SELECT 文に対応する select_custom 関数を追加して、簡単なテーブルでテストをしてシリーズ最後にします。

select_custom 関数は、引数 sql にパラメータ(%s)付きSQLステートメント、bind にパラメータの値リストを渡します。

class SimpleDB(object):
... (省略)...

    def select_custom(self, sql, bind):
        result = None

        if self.__cursor is not None:
            self.__cursor.execute(sql, bind)
            columns = self.__cursor.description
            result = []
            for row in self.__cursor.fetchall():
                item = {}
                for (index, value) in enumerate(row):
                    item[columns[index][0]] = value
                result.append(item)
        return result
    ## End def select_custom

... (省略)...
## End class

次に、SimpleDBクラスで、テーブルへデータ登録、更新、削除、そして選択してテストします。

テーブル名は t_test でテーブル定義は以下です。

CREATE TABLE t_test (
     id                int NOT NULL AUTO_INCREMENT
    ,name              varchar(260) NULL
    ,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

以下、テスト用コードです。

if __name__ == '__main__':
    dbconfig = {
        "host": "localhost",
        "database": "<your database>",
        "user": "<your username>",
        "password": "<your secure password>"
        }

    try:
        db = SimpleDB(dbconfig['host'], dbconfig['database'], dbconfig['user'], dbconfig['password'])
        db.open()

        # insert
        data = { 'name' : '山田 太郎' }
        rowid = db.insert("t_test", data)
        print "rowid: %d" % rowid


        # select
        conditions = { 'id' : rowid }
        res = db.select("t_test", conditions, "id", True)
        if res is not None:
            for r in res:
                print "select : %s, %s" % (r['id'], r['name'])

        # select_custom
        bind = [ rowid ]
        res = db.select_custom("select * from t_test where id = %s order by id", bind)
        if res is not None:
            for r in res:
                print "select_custom : %s, %s" % (r['id'], r['name'])

        # update
        conditions = { 'id' : rowid }
        data = { 'name' : '山田 花子' }
        rows_affected = db.update("t_test", data, conditions)
        print "%d 件更新" % rows_affected

        # select all
        conditions = None
        res = db.select("t_test", conditions, "id", True)
        if res is not None:
            for r in res:
                print "select : %s, %s" % (r['id'], r['name'])

        # delete
        conditions = { 'name' : '山田 花子' }
        rows_affected = db.delete("t_test", conditions)
        print "%d 件削除" % rows_affected

        # select all
        conditions = None
        res = db.select("t_test", conditions)
        if res is not None:
            for r in res:
                print "select : %s, %s" % (r['id'], r['name'])
        
        db.close()
    except Exception as e:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        print "%s, %s, %s" % (exc_type, fname, exc_tb.tb_lineno)

実行結果:

# python simpledb.py 
rowid: 15
select : 15, 山田 太郎
select_custom : 15, 山田 太郎
1 件更新
select : 15, 山田 花子
1 件削除

参考までに:

SimpleDBクラスのソース: simpledb.py
(ファイル名を simpledb.py_.txt から “simpledb.py” に変更してください。)

Python で例外が発生した場所を取得する

python でプログラミング中、try ~ except で例外を補足しますが、どのコードでその例外が発生したかを特定する方法がわからなかったので調べました。

https://docs.python.org/ja/2.7/library/sys.html

sys.exc_info() で返されるレースバックオブジェクトに設定された現在の行番号 tb_lineno で、例外が発生したコードの行番号がわかります。

import sys, os

try:
    # リスト インデックス範囲外
    for link in navi[0]:
        ・・・(省略)・・・
except Exception as e:
    exc_type, exc_obj, exc_tb = sys.exc_info()
    fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
    print "%s, %s, %s" % (exc_type, fname, exc_tb.tb_lineno)

出力例:

<type 'exceptions.IndexError'>, 'test.py', 131