Download CounterをWPプラグイン、PHP:Mysql、ファイル 形式で作成する[第五回]

では、第四回でSQLサーバに記録できるようになりましたので応用して記録して読み出すものを作成します。
今回は集計せずSQLデータベースにあるレコードを読み込んで一覧表示させます。

sql_counterのスクリプト圧縮ファイル

↑からmysqlDLカウンターPHPがDLできる。ダウンロード状況は以下で確認できます。:パスワードはwspri

DL状況

使い方は以前と同様に以下のようにタグを埋め込む。

<a href="http://plusload.dip.jp/sql_counter.php?fname=sql_counter.zip&dir=DL">sql_counterのスクリプト圧縮ファイル</a>

解説

mysqlなどのsqlサーバがインストールされていてユーザー名とパスワードが設定されていて、データベースの作成権限がある事が前提です。

sql_counter.zipがDownloadファイル名。
DLがディレクトリ名(省略するとカレントからファイルを検索します)

第四回にdlcount.phpみ実装したファイルのダウンロードと新たにレコードの読み込みを追加しただけです。

新たに追加したレコードの読み込み表示部

//Sql DataBase が存在するか確認する
try{
    //Sql connect
    $db = new PDO($host,$user,$pass);

    //view databases
    $sql = 'SHOW DATABASES';
    $results = $db->query($sql);

    //array loop
    while ($result = $results->fetch(PDO::FETCH_NUM)){
        //Does the database exist
        if($result[0]==$db_name){
            $exist=true;
        }
    }
    if($exist){
        $sql = 'use '.$db_name;
        if($db->query($sql)){
            $sql = "SELECT * FROM count_table";
            $sql=$db->query($sql);
            foreach($sql as $row){
                echo "<tr><td valign=\"middle\" align=\"center\" bgcolor=\"#ffffff\"><div style=\"font-size:10pt;\">".$row['id']."</div></td>
                      <td valign=\"middle\" align=\"center\" bgcolor=\"#ffffff\"><div style=\"font-size:10pt;\">".$row['ip']."</div></td>
                      <td valign=\"middle\" align=\"center\" bgcolor=\"#ffffff\"><div style=\"font-size:10pt;\">".$row['filename']."</div></td>
                      <td valign=\"middle\" align=\"center\" bgcolor=\"#ffffff\"><div style=\"font-size:10pt;\">".date("Y年m月d日 H時i分s秒",$row['dt'])."</div></td></tr>\n";
            }
        }
    }else{
        //テーブルタグ
        echo ("
                </tbody>
            </table>
            <table cellpadding=\"4\" cellspacing=\"1\" border=\"0\" width=\"800\"
                align=\"center\" bgcolor=\"#ff0000\">
            <tbody>
            <tr>
                <td height=\"100\" valign=\"middle\" align=\"center\" bgcolor=\"#ffffff\">
                    <div style=\"font-size:24pt;color:#ff0000;\">Sql DataBase が存在しません!</div>
                </td>
            </tr>
            </tbody>
            </table>
        ");


    }
    //connect close
    $db = null;
}catch(PDOException $e){
    echo "DB connect failure..." . PHP_EOL;
    echo $e->getMessage();
    exit;
}

sqlへの書き込み時にUNIXタイムスタンプを得てそのまま書き込むようにしましたので読み込み時に成型しています。

ダウンロードされた回数だけtrを一旦出力してCSSで表示数を制御する方法を実装しています。

//pageview
$pageview = 5;

$pageviewに設定した値で表示数が変わります。ここでは5に設定してますが、実際には20-50位が妥当かな。

if($exist){
    $sql = 'use '.$db_name;
    if($db->query($sql)){
        $sql = "SELECT * FROM count_table";
        $sql=$db->query($sql);
        $i=0;
        foreach($sql as $row){
            $rows[$i]="<tr id=".$i." style=\"display:none\"><td valign=\"middle\" align=\"center\" bgcolor=\"#ffffff\"><div style=\"font-size:10pt;\">".$row['id']."</div></td>
                <td valign=\"middle\" align=\"center\" bgcolor=\"#ffffff\"><div style=\"font-size:10pt;\">".$row['ip']."</div></td>
                <td valign=\"middle\" align=\"center\" bgcolor=\"#ffffff\"><div style=\"font-size:10pt;\">".$row['filename']."</div></td>
                <td valign=\"middle\" align=\"center\" bgcolor=\"#ffffff\"><div style=\"font-size:10pt;\">".date("Y年m月d日 H時i分s秒",$row['dt'])."</div></td></tr>\n";
             $i++;
        }
    }
    $page = $i / $pageview;
    if($page<1){
        foreach($rows as $table){
            echo $table;
        }
        echo ("<script>
            for(i=0;i<".$pageview.";i++){
                obj = document.getElementById(i);
                obj.style.display = (obj.style.display == 'none') ? '' : 'none';
            }
        </script>");
    }else{
        echo ("
            <script>
            var obj;
            var i=0;
            var ol=0;
            function first(ii){
                //表示したものは消しときます
                for(i=ol;i<ii;i++){
                    obj = document.getElementById(i);
                    obj.style.display = 'none';
                }

                //表示します
                for(i=ii;i<".$pageview."+ii;i++){
                    obj = document.getElementById(i);
                    obj.style.display = (obj.style.display == 'none') ? '' : 'none';
                }
                ol=ii;
            }

            </script>
            <center><p><button onclick=\"first(i);\">next</button>&nbsp;|&nbsp;<button onclick=\"first(0);\">reset</button></p></center>\n
        ");
        foreach($rows as $table){
             echo $table;
        }
        echo "<script>i=0;first(i);</script>";
    }
}

表示・非表示はCSSのdisplayで行っています。最初にすべてのtrタグの中身をdisplay=’none’にしておいてすべて出力して、$pageview数だけ”にしています。また、表示した$pageviewのtrは次の表示の前に’none’にしています。
まあ、CSSなので表示が早いのが特徴です。なんせすべて最初に出力してますから…

また、集計結果もみられるように次はしようかと思いますが、それはphp側の処理ですので次の第六回にしようと思います。

 

Download CounterをWPプラグイン、PHP:Mysql、ファイル 形式で作成する[第四回]

第三回で作った(改造した)DLカウンターをMySql(Sql)対応にしてみます。
DLしたIPとDLファイル名、時間を記録してPHPで集計表示します。

まずはPHPでMySqlに接続してDATABASE一覧を得ます。

<?php
$host = 'mysql:host=localhost';
$user = 'root';
$pass = 'yourpassword';

try{
    //Sql connect
    $db = new PDO($host,$user,$pass);

    //view databases
    $sql = 'SHOW DATABASES';
    $results = $db->query($sql);

    //$results array echos
    while ($result = $results->fetch(PDO::FETCH_NUM)){
        echo $result[0]."<br>";
    }

    //connect close
    $db = null;
}catch(PDOException $e){
    echo "DB connect failure..." . PHP_EOL;
    echo $e->getMessage();
    exit;
}

ちなみにMySqlがインストールされている事が前提です。
これでDB一覧が得られます。

次にこれの応用で一覧の中に設定したDBが既にあるか判定します。
これは一覧を得るところに指定のものがあったらフラグを立てるという仕様にします

    //array loop
    while ($result = $results->fetch(PDO::FETCH_NUM)){
        //Does the database exist
        if($result[0]==$db_name){
            $exist=true;
        }
    }

これで判定できました。
ではDBが見つかった場合は追記。なかった場合はDBを追加し、テーブルを作ります。
ただ、ここでポイントはINSERT文などに直接変数を入れて実行させることができないのでひと手間必要です。
次のコードを見てください。

    //main
    if($exist){
        $sql = 'use '.$db_name;
        if($db->query($sql)){
            $sql = 'INSERT INTO count_table (ip,filename,dt) VALUES (:ip,:file,:time)';
            $sql = $db->prepare($sql);
            $param = array(':ip'=>$get_ip,':file'=>$get_filename,':time'=>$get_timestamp);
            $sql->execute($param);	
        }else{
            echo "Donot use detabase....";
        }
    }else{
        //create database
        $sql = 'CREATE DATABASE '.$db_name;
        if($db->query($sql)){
            $sql = 'use '.$db_name;
                if($db->query($sql)){
                    $sql = 'create table '.$tb_name.' (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,ip varchar(32),filename varchar(2048),dt int(10))';
                    if($db->query($sql)){
                        $sql = 'INSERT INTO count_table (ip,filename,dt) VALUES (:ip,:file,:time)';
                        $sql = $db->prepare($sql);
                        $param = array(':ip'=>$get_ip,':file'=>$get_filename,':time'=>$get_timestamp);
                        $sql->execute($param);
                    }else{
                        echo "Donot create table...";
                    }
                }else{
                    echo "Donot use detabase....";
                }
            }else{
                echo 'Donot create database....';
            }
        }

‘INSERT INTO count_table (ip,filename,dt) VALUES (:ip,:file,:time)’を見てください。
INSERT文を作っているのですが何か変ですよね?:ipって何だ?
これは変数を入れる位置を示した空の値をここでは代入してINSERT文を作ります。
で、array(‘:ip’=>$get_ip,’:file’=>$get_filename,’:time’=>$get_timestamp);で配列を作って後から変数を代入しないとダメなんです。
う~ん。難しい。

ここまでのコード

<?php
////////////////////////////////////////////////
//File DownLoad Counter
//(c)2020 WSPRI J.Amano
//
//https://wspri.dip.jp/
////////////////////////////////////////////////

//変更可能箇所//////////////////////////////////

//password
$pass = "wspri";
//LogoType
$logoType= "https://wspri.dip.jp/wordpress/wp-content/uploads/2020/05/rogo_l.jpg";
//database name
$db_name="dlcount_db";
//table name
$tb_name="count_table";
//sql info
$host = 'mysql:host=localhost';
$user = 'root';
$pass = 'yourpass';

//以下は変更しないでください////////////////////
$exist= false;
$get_ip=$_SERVER["REMOTE_ADDR"];
$get_filename="test";
$get_timestamp=time();
try{
    //Sql connect
    $db = new PDO($host,$user,$pass);

    //view databases
    $sql = 'SHOW DATABASES';
    $results = $db->query($sql);

    //array loop
    while ($result = $results->fetch(PDO::FETCH_NUM)){
        //Does the database exist
        if($result[0]==$db_name){
            $exist=true;
        }
    }
    //main
    if($exist){
        $sql = 'use '.$db_name;
        if($db->query($sql)){
            $sql = 'INSERT INTO count_table (ip,filename,dt) VALUES (:ip,:file,:time)';
            $sql = $db->prepare($sql);
            $param = array(':ip'=>$get_ip,':file'=>$get_filename,':time'=>$get_timestamp);
            $sql->execute($param);
        }else{
            echo "Donot use detabase....";
        }
    }else{
        //create database
        $sql = 'CREATE DATABASE '.$db_name;
        if($db->query($sql)){
            $sql = 'use '.$db_name;
            if($db->query($sql)){
                $sql = 'create table '.$tb_name.' (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,ip varchar(32),filename varchar(2048),dt int(10))';
                if($db->query($sql)){
                    $sql = 'INSERT INTO count_table (ip,filename,dt) VALUES (:ip,:file,:time)';
                    $sql = $db->prepare($sql);
                    $param = array(':ip'=>$get_ip,':file'=>$get_filename,':time'=>$get_timestamp);
                    $sql->execute($param);
                }else{
                    echo "Donot create table...";
                }
            }else{
                echo "Donot use detabase....";
            }
        }else{
            echo 'Donot create database....';
        }
    }

    //connect close
    $db = null;
}catch(PDOException $e){
    echo "DB connect failure..." . PHP_EOL;
    echo $e->getMessage();
    exit;
}

Download CounterをWPプラグイン、PHP:Mysql、ファイル 形式で作成する[第三回]

まずはMySqlを使わないWPプラグインではないPHPのDLカウンターの巻

これは以前WSPRIで配布していたPHPサンプルをちょっと改造。
以外に良くできてた( ´艸`)

dlcountのスクリプト圧縮ファイル

↑からDLカウンターPHPがDLできる。ダウンロード状況は以下で確認できます。:パスワードはwspri

DL状況

こちらもセキュリティの問題からDLディレクトリを指定してこのディレクトリ以下しか指定できないように修正しました。使用の際はDLディレクトリを設置カレントに作成してその中に対象ディレクトリを作成するかして使用ください

使い方は以下のようにタグを埋め込む。

<a href="http://plusload.dip.jp/dlcount.php?fname=dlcount.zip&dir=DLFile1">dlcountのスクリプト圧縮ファイル</a>

解説:
http://plusload.dip.jp/dlcount.php
はdlcounter.phpまでのパスを指定。
fname=dlcount.zip
はDLさせるファイル名
※*.htmlもしくは*.htmも指定できます。その場合アクセスカウンタとしても使う事ができますよ。
dir=DLFile1
はDLさせるファイルが格納されているDLディレクトリの中に作成したディレクトリ名を指定する。DLディレクトリ内にディレクトリを作らずにDLディレクトリ内にダウンロードさせるファイルがある場合は不要。

dirで指定できるのはディレクトリ名のみで..や../などのカレントを移動する記号は含められない。また、fnameにもカレントを上位に移動する..や../は含めることはできません。

〇..dlcount.php?fname=dlcount2.zip&dir=DLFile1
×..dlcount.php?fname=./DLFile1/dlcount2.zip
×..dlcount.php?fname=dlcount2.zip&dir=../

※実際にDLされるのはDLディレクトリ内にあるdlcount2.zipです。

で、DL数を見るには

<a href="http://plusload.dip.jp/dlcount.php>DL状況</a>

にアクセスするとパスワードを求めるので入力すると見られる。

次回はこれをMySqlに書き込む仕様に変更するよ。

Windows10 64bitでRolandの古いUM1 USB MIDIアダプタを使う

Rolandにドライバはありますがそのままでは使えません。

まずはメインメニューの「設定」から「更新とセキュリティ」をポチっと

「回復」>PCの起動をカスタマイズも「今すぐ再起動」

で、再起動したら「トラブルシューティング」>「スタートアップ設定」を選択して「再起動」を押す

再起動したらメニューが表示されるのでその中でも

7. ドライバー署名の強制を無効にする

を選択して起動

https://driver64bit.wiki.fc2.com/ref/um1_w10d_v100 64bit.zip

↑のドライバをDLして展開後UM1をPCに接続して「デバイスマネージャー」の表示されている「不明なデバイス」をWクリック

「ドライバの更新」で展開したドライバのフォルダを指定する

ダイアログが開いてインストールするかしないか聞いてくるのでインストールするを選択。

UM1が認識されたらおしまい

Linux Git Serverの立て方

まず、クライアントにGitをインストールします。

①git bashを起動して以下のコマンドをうち、SSH用のキーを作ります。

ssh-keygen -t rsa

C:\Users\tuser\.sshにid_rsaとid_rsa.pubが作られます。

②Linuxサーバでの作業

Tera Termなどでサーバにログインします。

面倒なのでスーパーユーザーにしときます。

Git用のユーザーを作ります

adduser git-user
passwd git-user

そして先ほど作ったキーを登録するにディレクトリを用意します。

su git-user
cd
mkdir .ssh

先ほど作ったキーファイルid_rsa.pubをWinSCPなどでgit-userのカレントへ送ります。

cat id_rsa.pub >> ~/.ssh/authorized_keys

これでキーが登録されました。
また、スーパーユーザに戻ってリポジトリを置くディレクトリを作成します。

mkdir /var/lib/git
cd /var/lib
chown git-user -R git
chgrp git-user -R git

このディレクトリの中に各リポジトリを作って運用します。

最後に/etc/passwdにgitのシェルのパスを追記します。

vi /etc/passwd
git:x:1000:1000::/home/git-user:/usr/bin/git-shell

パスが違う場合があるので一応調べてください。

which git-shell

③LinuxServerのリポジトリを作る

先ほど作った/var/lib/git/の中にリポジトリにするディレクトリを作ります。

mkdir /var/lib/git/jivagoo
cd /var/lib/git/jivagoo
git init --bare --shared

これでリポジトリが作られました。
でも./objectsと./refs/headsに書き込み権限がないので最初のpush時に怒られてしまいます。
なので書き込み権限を与えておきます。

chmod -R 777 ./objects
chmod -R 777 ./refs/heads

④クライアントGitの設定

管理者でメモ帳などのエディタを開き、以下のファイルに追記します

C:\Program Files\Git\etc\ssh\ssh_config
Host gitlocal
  User git-user
  HostName wspri.dip.jp
  IdentityFile ~/.ssh/id_rsa
  Port 22
  IdentitiesOnly yes

このサーバの場合はwspri.dip.jpですが、IPでも大丈夫です。

⑤TortoiseGitでの作業

pushする最初のソースのあるディレクトリに移動してリポジトリを作成します

ディレクトリの中に.git(隠しファイル)ができます。
続いてTortoiseGitの設定メニューでサーバーのリポジトリのパスを設定します。

コマンドでもいけます。

git remote add origin ssh://wspri.dip.jp/var/lib/git/jivagoo

これで最初にpushする準備ができました。

git bashでリポジトリを見てみます

OKのようなので最初のpushをします。

git push origin master

これでエラーが出なければリポジトリはできています。TortoiseGitでクローンして開発を進めてください。
また、push前にはpullして最新版をバックアップするのを忘れないでください。

UE4などプロジェクトのサイズが大きい場合はPushでOut of memoryなエラーが出てPushできない場合があります。

http://iranoan.my.coocan.jp/essay/pc/201610270.htm

↑を参考にパックファイルの上限を上げてさらに小分けにするとpushできるようです。※僕の環境では2gが上限らしい

git config --global core.packedGitLimit 1g 
git config --global core.packedGitWindowSize 1g 
git config --global pack.packSizeLimit 2g
git gc --aggressive --prune=now

LinuxServerの容量を確認する

Androidアプリの開発をしていてGitを使っているのでUE4プロジェクトのサイズが大きく、Serverの容量を確認する必要があったのでメモ

root@ubuntu:~$ df -hT
Filesystem Type     Size Used Avail Use% Mounted on
udev       devtmpfs 476M 0    476M 0%    /dev
tmpfs      tmpfs    99M 12M   88M 12%    /run
/dev/sda1  ext4     228G 6.5G 210G 3%    /
tmpfs      tmpfs    495M 84K  495M 1%    /dev/shm
tmpfs      tmpfs    5.0M 4.0K 5.0M 1%    /run/lock
tmpfs      tmpfs    495M 0    495M 0%    /sys/fs/cgroup
tmpfs      tmpfs    99M 24K   99M 1%     /run/user/1000
tmpfs      tmpfs    99M 4.0K  99M 1%     /run/user/108
tmpfs      tmpfs    99M 0     99M 0%     /run/user/1002

dfコマンドで確認できる。オプションの-hTはボリュームサイズの単位を指定している。

うちのサーバーはしょぼいからこんなもんしかない。ちな32bitATOM250G1M

UE4+Androidのパッケージ化

UE4+Androidのパッケージ化についてはいろいろ種類があり試してみたが

が良いみたい。

Multiがなんでも4使えていいと思ったが、GooglePlayConsoleさんに限定されるので良くないと警告を受ける。ATCも同じ。

ちなみにMultiにするとサイズが1.3倍くらいになるのでやめたほうがいいか。

Androidアプリ消費型課金アイテムの実装方法:UE4

Androidアプリに課金アイテムを実装する方法をUE4で示す。

①まず、UE4で開発するアプリに課金アイテムの実装をする。

LevelBP

ウィジット

  • drive:\yourprojectname\Config\Android\AndroidEngine.iniを開き以下を追加する
[OnlineSubsystem]
DefaultPlatformService=GooglePlay

[OnlineSubsystemGooglePlay.Store]
bSupportsInAppPurchasing=True
  • project settingsを開き以下を追加する

com.android.vending.BILLING

  • こちらを参照にKeyStoreを作成して配置し、ProjectSettingsに記載しておく

Google Play License KeyのところにGooglePlayConsoleの「開発ツール」>「サービスとAPI」のこのアプリのライセンス鍵をコピーして貼り付ける

Storeバージョンはプロジェクトを更新してGooglePlayコンソールにアップロードする際に必ず上げておく

例えば1でアップロードしたものを更新する場合は2にする
  • GooglePlayコンソールにログインしてアプリを登録する

☑のついた個所はすべて記載し、☑を有効にしておく

  • 課金を実装したapkをアップロードする
先にアプリで課金を実装しておかないとアイテムの作成ができないので注意

GooglePlayコンソールで「ストアでの表示」>「アプリ内サービス」で管理対象のアイテムで課金アイテムを作る

  • リリース管理>アプリのリリースでアルファ版をリリースする
リリースをユーザー限定にしてテストする:
ユーザーにテスターのアカウントを追加する
  • コンソールのトップに戻り、「設定」>アカウントの詳細で「テスト用のアクセス権がある Gmail アカウント」に先ほどのテスターアカウントを追加する
これを追加しないと有料のテストがそのまま有料になってしまうので注意

参照1 | 参照2 | 参照 | 参照 | 参照

ちなみに今は昔と違い審査があるのでアルファ版でも公開の前に審査があって時間がかかるようだ

UE4でAndroid開発ビルドでクラッシュ

UE4でAndroid開発あうると開発用端末のテストではうまくいくが、最終的にリリース版でビルドすると「SlateTextShaper.cpp」でクラッシュをする。
絶対にクラッシュする。

こんな感じで…

意味不明だがググってたどり着いたのはここ

どうやら日本語環境にエディタの設定をしていると文字化けしてクラッシュするバグのようだ。

英語環境だとクラッシュせず、日本語環境だと絶対クラッシュするとのこと。

なのでエディタは英語で使う。これならビルドできるようだ。

※クラッシュしてもAndroidアプリはビルドできている様子。出力先のフォルダにapkができているので試しにbatファイルをWクリックして実機にインストールしてみるとインストールされる。

追記:ビルド時にログを非表示にするとエラーが出ないのでクラッシュしない。ログを見ると日本語のところが文字化けしているようで、これが表示されるとクラッシュしちゃうみたい。