UE4でLAMP(Nginx)にアカウントを作ってログインし、データを保存してGETする

UE4でサーバーにログインする場合、そのままではできないのでC++でノードを作ってHTTP/HTTPSで通信するんですが、フリーのプラグインでこれを実現するものがあったのでこれを使って実装してみる。

VaRestって言うプラグイン。標準では入ってないのでこちらからDLする。

DLはEpicのランチャーが起動し、これからDLしてインストールする。インストールし終わったらEnabledにチェックを入れてUE4を再起動ボタンを押す

説明(英語)を読むとC++で構築する必要はなく、これだけでHTTP/HTTPS通信ができるとのこと。

それではこれでHTTP/HTTPS通信のテストをしてみます。

まず、サーバー側に次のphpファイルを用意します。

<?php
$user = "user";
$pass = "pass";
//this script path
$script_php=$_SERVER['SCRIPT_NAME'];
if ($_SERVER["REQUEST_METHOD"]=="POST"){
    if ($_POST['user']==$user && $_POST['pass']==$pass){
        echo $user."で、パスワード".$pass."にてログインしました\n";
    }
}else{
//テーブルタグ
echo ("
    <form method=\"POST\" action=\" $script_php \">
    <table cellpadding=\"4\" cellspacing=\"1\" border=\"0\" width=\"800\"
        align=\"center\" bgcolor=\"#336666\">
        <tbody>
            <tr>
            <td height=\"100\" valign=\"middle\" align=\"center\" bgcolor=\"#ffffff\">
            USERを入力してください。<br><br>
            USER:<input type=\"text\" name=\"user\">
            <br><br>
            パスワード:<input type=\"password\" name=\"pass\">
            <br><input type=\"submit\" value=\"ログイン\">
            </td>
            </tr>
       </tbody>
    </table>
</form>
");
}

GETは簡単なので割愛します。まず、POSTが行われたらPOSTを検知してUSER名とパスワードを確認して正しければPOSTされたユーザー名とパスワードを出力します。
POSTされてないとフォームを出力しますがこれは動作確認用です。設置したらまずPCから動作確認しましょう。

post.phpという名前で設置しました。こんな感じで出力されます。

ではUE4側の処理です。Zキーを押すとPOSTされて出力をUE4で受け取る処理です。

まず、適当にProjectを作ってレベルBPで構築します。

こんな感じです。UE4.24.3+VaRestです。

解説

まず、VaRestプラグインをEnableにします。で、キーボードイベントでZキーイベントを置きます。で、ConstractJsonRequestを配置し、VerbをPOSTにして、ContentTypeをRequestBodyにしてRequestをサーバーに投げるようにします。

VaRestRequestJson型の変数を作ってそこにRequestを格納します。

OnRequestCompleteにイベントをバインドして変数からRequestObujectを取り出しアカウント情報をセットします。

最後にphpスクリプトにPOSTして呼びます。

Zキーを押すとサーバーにログインしてデータを受け取ります。

次はこれでログインしてアカウントの作成とアカウントがある場合はログインしてSQLからデータを得るものを作成しますね

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

第五回でほぼ全て実装しましたので今回はSql命令文を使って集計させます

おばけが付近にいるか検索するAndroidアプリ「JivaGooAR」
↑別サーバーにジャンプさせてカウントを取るサンプル

<html>
<head>
	<title>JivaGooAR</title>
	<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
	<script>
		location.href = "https://play.google.com/store/apps/details?id=jp.dip.wspri.jivagoo ";
	</script>
</head>
<body>
</body>

SAKURA(楽曲:mp3)
↑カウントテスト用(mp3ファイルをDL)

sql_counterのスクリプト圧縮ファイル
↑からmysqlDLカウンターPHPがDLできます。ダウンロード状況は以下で確認できます。:パスワードはwspri

DL状況

解説

ダウンロードされたファイルを集計して棒グラフで表示させるために以下のSql命令文を追加して実行させています
                        $count_files = "SELECT filename, COUNT( filename ) FROM $tb_name GROUP BY filename";
                        $count_files=$db->query($count_files);
                        $all="select count(id) from $tb_name";
                        $all=$db->query($all);
                        foreach($all as $all_row){$all = $all_row[0];}

SELECT filename, COUNT( filename ) FROM $tb_name GROUP BY filenameでダウンロードされたファイル名とそのカウント数を得ています。

select count(id) from $tb_nameは全体のカウントを得ています。で、実行結果はオブジェクトで返ってきますのでループでカウントを抜き出しています。オブジェクトなのでそのままでは使えません。
全体のカウントを得たらDLファイル毎のカウントを割って全体の割合を出してグラフに反映させています。このやり方ならDL数が大きくなってもはみ出るようなことはありませんね。

                        //ファイル毎の集計を表示で出力
                        //テーブルタグHEADER
                        echo ("
                            <table cellpadding=\"4\" cellspacing=\"1\" border=\"0\" width=\"800\"
                            align=\"center\" bgcolor=\"#336666\">
                            <tbody>
                            <tr id=\"count_f\" style=\"display:''\">
                            <td valign=\"middle\" align=\"center\" bgcolor=\"#2f4f4f\"><div style=\"font-size:10pt;color:#ffffff;\">ダウウンロードファイル名</div></td>
                            <td valign=\"middle\" align=\"center\" bgcolor=\"#2f4f4f\"><div style=\"font-size:10pt;color:#ffffff;\">DL数</div></td>
                            <td valign=\"middle\" align=\"center\" bgcolor=\"#2f4f4f\"><div style=\"font-size:10pt;color:#ffffff;\">グラフ(全体の割合)</div></td></tr>
                        ");
                        foreach($count_files as $count_row){
                            echo("
                            <tr id=\"count_f\" style=\"display:''\">
                            <td valign=\"middle\" align=\"left\" bgcolor=\"#ffffff\" width=\"200px\"><div style=\"font-size:10pt;\">".$count_row[0]."</div></td>
                            <td valign=\"middle\" align=\"left\" bgcolor=\"#ffffff\" width=\"50px\"><div style=\"font-size:10pt;\">".$count_row[1]."</div></td>
                            <td valign=\"middle\" align=\"left\" bgcolor=\"#ffffff\"><div style=\"background-color: blue; width: ".($count_row[1]/$all*100)."%; font-size: 10px;\">&nbsp;</div></td></tr>
                            ");
                        }
                        echo ("</tbody>
                        </table>");

で、出力ですが、集計結果は消す必要がないのでそのまま一番上に出力しています。ファイル数が何百とかになるならその下の処理同様にCSSで送ることができますね。こんなもんでどうですか。次は最終回、WPプラグイン化しますね。

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状況

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

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

解説:
http://plusload.dip.jp/dlcount.php
はdlcounter.phpまでのパスを指定。
fname=dlcount.zip
はDLさせるファイル名
※*.htmlもしくは*.htmも指定できます。その場合アクセスカウンタとしても使う事ができますよ。
dir=./
はDLさせるファイルが格納されているdlcount.phpから見たディレクトリ名を指定
この場合はカレントにあるので指定しなくてもしてもOK
※実際にDLされるのはDLディレクトリ内にあるdlcount2.zipです。

で、DL数を見るには

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

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

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

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

COBOLってよく聞くが試しにUbuntuにインストールしていつものHELLO WORLDさせてみる

COBOLってよく聞くよね化石みたいな言語らしい

って、UbuntuにOpen-COBOLってインストールしてみて「HELLO WORLD」ってプリントしてみる。

【Open-COBOLをインストール】

user@user:~@ sudo apt-get install open-cobol

とUbuntuのコンソールに書いてリターン

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
libmircommon6 linux-headers-4.8.0-28 linux-headers-4.8.0-28-generic
linux-image-4.8.0-28-generic linux-image-extra-4.8.0-28-generic
openbsd-inetd
これを削除するには 'sudo apt autoremove' を利用してください。
以下の追加パッケージがインストールされます:
autotools-dev libcob1 libcob1-dev libdb-dev libdb5.3-dev libgmp-dev
libgmp3-dev libgmpxx4ldbl libltdl-dev libncurses5-dev libtinfo-dev libtool
提案パッケージ:
db5.3-doc gmp-doc libgmp10-doc libmpfr-dev libtool-doc ncurses-doc autoconf
automaken gfortran | fortran95-compiler gcj-jdk
以下のパッケージが新たにインストールされます:
autotools-dev libcob1 libcob1-dev libdb-dev libdb5.3-dev libgmp-dev
libgmp3-dev libgmpxx4ldbl libltdl-dev libncurses5-dev libtinfo-dev libtool
open-cobol
アップグレード: 0 個、新規インストール: 13 個、削除: 0 個、保留: 4 個。
2,105 kB のアーカイブを取得する必要があります。
この操作後に追加で 8,902 kB のディスク容量が消費されます。
続行しますか? [Y/n] y

こんな感じでインストール
ちゃんとインストールされとるか確認する

user@user:~@ cobc --v

インストールされればこんな感じで表示される

cobc (OpenCOBOL) 1.1.0
Copyright (C) 2001-2009 Keisuke Nishida / Roger While
Built    Aug 04 2016 15:56:22
Packaged Feb 06 2009 10:30:55 CET

じゃ、早速HelloWorld!してみましょう。
viエディタでカレントにHW.cobってソースファイルを作ります。

user@user:~@ vi HW.cob

そしたら以下を書きます。

      *これはコメントでソースは8文字目から始めます
      *7文字目まではスキップされますよ!注意しましょう!
       IDENTIFICATION DIVISION.
       PROGRAM-ID. helloworld.
       PROCEDURE DIVISION.
       DISPLAY "Hello World!".
       STOP RUN.
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"HW.cob" [Incomplete last line] 5 lines, 141 characters

【解説】
7文字目の*はC++、PHPでいう//でコメントです。
IDENTIFICATION DIVISION.とPROCEDURE DIVISION.は必要な呪文です。何も考えず入れましょう。
PROGRAM-ID. の後のhelloworld.は何でもいいんですがプログラムの識別子です。
DISPLAY “Hello World!”.のDISPLAYはC++、PHPでいうprintです。
STOP RUN.はここで終わりますねっていう呪文です。
,/td><<<<<<< 注意!)COBOLのソースは必ず8スペース開けてから書きます!コメントは*を7スペース目に入れて8文字目から書きますんで注意してください!この約束を守らないと「./HW.cob:1: Error: Invalid indicator ‘F’ at column 7」って怒られます!

COBOLは4つのカテゴリで分けられるようです。

構文 意味
見出し IDENTIFICATION DIVISION. 見出し呪文
環境部 ENVIRONMENT DIVISION. データファイルを記述
データ部 DATA DIVISION. 変数などのメモリ領域を記述
手続き部 PROCEDURE DIVISION. 処理ルーチンを記述

じゃ、コンパイル(ビルド)しますね。

user@user:~@ cobc -x HW.cob
user@user:~@

するとカレントに`HW`って実行ファイルができますので実行させてみます。

user@user:~@ ./HW
Hello World!

おお!Hello World!しましたね!おしまい。次は計算が得意な言語らしいので計算をさせてみます。

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

ダウンロードカウンターで検索してこられる人が結構いるので今回は①WPプラグイン形式、②PHPスクリプトでMysql形式で記録閲覧、③PHPスクリプトでファイルで記録閲覧という3つのダウンロードカウンターを作ってみることにする

【実装】

まず、Anonymous(匿名)でのダウンロードとアカウント(登録制)を切り替えられるようにするため、WPの認証機能を使います。※いらねーかな

require_once('./wp-load.php');

これを書くとWPのユーザーが今誰かを見ることができるようになります。_oneceなので一回だけって意味です。

あとは

/*オブジェクトを生成*/
new dlcounter;

というオブジェクトを作成して

/*dlcounterクラスを定義*/
class dlcounter {
    /*コンストラクタだから一回だけ:UE4Blueprintの場合はEventBiginPlay*/
    function __construct() {
        /*wordpressから自身のMySQLへ接続するインスタンスを呼ぶ*/
        global $wpdb;
        add_action('admin_menu', array($this, 'add_admin'));//管理者メニューに追加する準備
    }
 
    /*管理メニューの設定*/
    function add_admin() {
        if(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)=="ja"){
            $menuname="DLカウンター";
        }else{
            $menuname="DLCounter;
        }
        //level_8から10が管理者
        add_menu_page($nenuname,$menuname,'level_9', __FILE__, array($this,'dl_counter'));
    }

として以降に

function dl_counter(){

}

を書きます

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

ダウンロードカウンターで検索してこられる人が結構いるので今回は①WPプラグイン形式、②PHPスクリプトでMysql形式で記録閲覧、③PHPスクリプトでファイルで記録閲覧という3つのダウンロードカウンターを作ってみることにする

【設計】

①WPプラグイン形式で作成する

まずはワードプレスのPluginで作成してみる事にする

    • ダウンロードリンクにプラグインを指定することでIPとタイムスタンプを記録する
    • Anonymous(匿名)でのダウンロードとアカウント(登録制)を切り替えられる
    • 申請はアカウント登録のない場合は申請可能にする
    • メール登録型で申請メールに認証URLが送られ認証するとアカウントが承認される

※認証はいらねーかな。

といったチョット商用可能な感じのものにします。
WPプラグイン、PHPスクリプトも同じ仕様にします。

【ヘッダ】

<?php
/*
Plugin Name: WSPRI Download Counter
Plugin URI: https://wspri.dip.jp
Description: ダウンロードカウンタープラグイン
Author: j.amano
Version: 1.0
Author URI:https://wspri.dip.jp
*/
//user control
require_once('./wp-load.php');