@Coddee.

Unity/C#とか、PHP/MySQLとか。ぺーぺーがプログラムの備忘録も兼ねて。

【PHP】数値のカンマ区切り(価格表示とか)

価格表示とか、数値の動的出力の時に、値を見やすくするために「カンマ」で数字を区切っていることがあると思いますが、いともたやすく出来るのだなーと思ったので、備忘録がてら。

使う関数はnumber_format関数

<?php
    $numTmp = 123456789;
    $num = number_format($numTmp);

    echo $num; // 結果は「123,456,789」
?>

使い方はこんな感じ。
int値をnumber_format関数に入れてあげればOK。
(いままで桁数で繰り返して、4桁目にきたらカンマを挿入していたのは内緒)

桁数とか何で区切るのかを決めることが出来る引数

引数ごとでオプションも設定できるので、うまく使うといいかも。

<?php
    $numTmp = 12345.6789;

    /**
     * 第1引数: フォーマットする数値
     * 第2引数: 小数点以下の数値をいくつ表示するか
     * 第3引数: 小数点を何の文字にするか
     * 第4引数: 千の位を何の文字で区切るか
     */
    $num = number_format($numTmp, 2, "_", "+");

    echo $num; // 結果は「12+345_67」
?>
わかると思うけど、出力は文字列(string)です。

"number"って言っているので、なんとなく数値として出力されそうですけど、記号とかスペースとか入っちゃうからね。
is_intとか使っちゃうと、当然通らないので念のためご注意をば。

PHP: number_format - Manual

【HTML/CSS】管理画面系のおすすめ

すっかりLAMPエンジニアの仲間入りを果たしてしまいましたね。。
当分はLMAP系の話題がひっきりなしかと思います。(まぁ本ブログそのものが、備忘録目的ですし...ご容赦を!)e-words.jp

管理画面とか作りたいってなったとき

まぁ仕事とは関係なしで、最近エンジニア(?)仲間がちょくちょく増え始めてきていて、ちょっとずつ楽しくなってきています。
そんな時に、「Yadukkiiさん以外の人も、データを触れるとね」っていう話になって。
その時にちょっといいな、って思った参考文献をば。

まぁフレームワークの話です。

Bootswatch: Free themes for Bootstrap
最近はお世話になってます。おきまりのBootStrapなのですが、エレメント(部品や部分的なもの)を集中して集約したものです。
最近はだいぶ使っています。ちょっと迷った際は、ぜひぜひ。

最近の話

前述の友人たちとともに、またYadukkiiはやらかすようです。
キャラクターイラストに関連した簡単なシステムになるのですが、近日公開いたします。
その時のお話も、また次回以降に。

【PHP】外部サーバへのファイル転送は「cURL」関数

まさかのデスマーチ
とあるお仕事で、そんなキーワードが頭によぎるような事態がありました…
まあまあ、終わったのでいいですけれど。デスマーチのきっかけは、お題にある「cURL」。備忘録がてら、使い方を残しておきます。

外部サーバに対してファイルを転送するときとか

<?php
// sftpによる接続およびファイル転送
$curl = curl_init();
$file = fopen("curl.txt", "r+");
$url = "http://192.168.33.10/file/";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_UPLOAD, 1);
curl_setopt($curl, CURLOPT_INFILE, $file);
curl_exec($curl);
curl_close($curl);

標準の関数で飛ばすこともできるんですが、キーファイルを指定されたり、ポート指定があったり、そもそも飛ばし方に指示があったり……。
悩んだ挙句、一番マッチして、かつそこまで改修が必要のない関数「cURL」を選択しました。

オプションは「curl_setopt()」で指定

cURL」のもう一つの強みが、付随するオプションの豊富さです。これがあったから、デスマーチもなんとか乗り切れた感はあります…

  • CURLOPT_URL

転送先URLを設定

  • CURLOPT_UPLOAD

ファイルをアップロードする際に使用。(1なら「転送ON」)

  • CURLOPT_INFILE

実際に転送するファイルを指定

  • CURLOPT_PROTOCOLS

転送する際に経由するのはSFTP?SCP?FTP?っていうのを決める

  • CURLOPT_SSH_PUBLIC_KEYFILE

公開鍵ファイルに指示がある際はこれでファイルを指定

  • CURLOPT_SSH_PRIVATE_KEYFILE

こっちは秘密鍵

  • CURLOPT_SSH_AUTH_TYPES

AUTHキーの指定がある際はこれ

  • CURLOPT_SSLKEYPASSWD

SSL接続のためのパスワード指定

実際に使ったコードはこんな感じ。

<?php
// ERRの取得
error_reporting(E_ALL);
ini_set("display_errors",1);

// cURLスタート
$ch = curl_init();
$file = fopen($filepath, "r+");

curl_setopt($ch, CURLOPT_URL, "sftp://$user:$password@$server_name/$filename");
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $file);
curl_setopt($ch, CURLOPT_SSH_PUBLIC_KEYFILE, $publickey);
curl_setopt($ch, CURLOPT_SSH_PRIVATE_KEYFILE, $privateKey);
curl_setopt($ch, CURLOPT_SSH_AUTH_TYPES, CURLSSH_AUTH_PUBLICKEY);
curl_setopt($ch, CURLOPT_SSLKEYPASSWD, $password);

curl_exec($ch);
$error_no = curl_errno($ch);

fclose($file);
curl_close($ch);

これにも助けられました…エラーハンドリングが、めちゃくちゃになっていた最中、これだけは裏切らなかった…!

余談ですが…

sftp接続する際、以下の点に気をつけてくださいね。こんなのにもスタックしてました…

  • 鍵ファイルはPutty形式かOpenSSH形式か
  • 鍵ファイルを開くためのパスワードは記述したか
  • ソフトウェア側のファイアウォールの22番ポートは開いているか(iptables
  • ハードウェア側はどうか(データセンターに問い合わせてくださいね)

今年入社の新人君がまさかの案件のメインフロントであることから、かなり振り回された感がありました…(ボクも反省するところは多々…)
まあ終わったことですのでね。いいですけれど。

【PHP/MySQL】忘れないようにPDO

ほんの一握りのやる気が、今のブログを成り立たせています。
どもども、ヤヅキです。(こんな書き始めも、今回が初めてかも)
記事の様子を見ていると、なんだかUnity/C#の記事がだいぶ人気があって、ありがとうございますね。見ていただいて。
だが今回の話題も、PHPについてだよっ!!ごめんねw

エスケープ系ですげー叱ってもらった

うん、そうなんだ。
まぁ「ライブラリのエスケープ処理使えよ」って話なんですけど、crontabで処理まわす際、これが難しい...!
ファイルの読み先とか、いろいろゴニョゴニョすればいいみたいなんだけど、ライブラリを使用せず「PDO」でまわす作戦に。

PDOの記述方法だけ。

詳しい内容は割愛、まずは記述方法を覚えておこうと。

<?php
// SQL用に値を準備
$memberUID = 100;
$memberAddress = "mail@address.com";
// PDO新規オブジェクト定義
$db = new PDO("mysql:host=localhost;dbname=DBName;charset=utf8", "User", "Password");
// 実行するSQL文
$sql  = "SELECT member_name ";
$sql .= "FROM com_member ";
$sql .= "WHERE ";
$sql .= "    member_id = :id ";
$sql .= "    AND member_address = :add ";
// SQLセット
$sth = $db->prepare($sql);
// 型を指定し、セットされたSQL文に値を格納
$sth->bindParam(":id", mysql_real_escape_string($memberUID), PDO::PARAM_INT);
$sth->bindParam(":add", mysql_real_escape_string($memberAddress), PDO::PARAM_STR);
// SQL実行
$queryExe = $sth->execute();
// 値を取得
$queryResult = $sth->fetchAll(PDO::FETCH_ASSOC);

こんな感じ。結果として

array( [0] => array( [member_name] = 会員の名前 ) ... )

こんな感じになる。いろいろとポイントはあるんだけど、取り急ぎ備忘録に。

【Linux】MacからSSH接続

自宅でカタカタやりだすと、Macだと「ターミナル」Windowsだと「コマンドプロンプト」。
この2ついずれかを結構使います。
でも、SSH接続したいなぁってとき、その方法を忘れちゃうので、これも備忘録。

簡単に。

diskDrive:finder User$ ssh ユーザー名@IPアドレス

こんな感じ。
ユーザー名が root なら「root@****」ってなるし、
IPアドレスのところには「****@192.168.33.10」みたいになるし。
実際書くと、こんな感じ。

## コマンド ssh で接続開始
dickDrive:vagrant Yadukkii$ ssh root@192.168.33.10
## パスワードが聞かれます
root@192.168.33.10's password: ●
## ※ 接続したのもついさっきw
Last login: Tue Oct  6 12:39:21 2015 from 192.168.33.1
Welcome to your Vagrant-built virtual machine.
## SSH接続成功!
[root@localhost ~]# cd /
[root@localhost /] # 

まぁ簡単なんですけど、忘れっぽいんでね。
ちなみに、最近はVagrant一択。他にこんなのもあるよって言えるよう、長い目で探しておきます。。w

【PHP/Smarty】配列の使い方

だいぶ前に作られたプログラムを触る機会があって、ちょっと「?」となったので備忘録。

Smarty」?なにそれ?

{* // 触ったコードはこんな感じ *}
{* // file.tpl.html *}
{foreach from=$cojp_member_data.zip_data key=member_key item=member_item}
    <p>{$member_key | escape:'html'}<span{if $member_item.zip_code eq 12}class="fontRed"{else}class="fontBlue"{/if}>{$member_item.zip_name | escape:'html'}</span></p>
{/foreach}

HTMLファイルに見たことのないコードが...
こんなのがめちゃめちゃ並んでて、もうわけわからん…
調べてみると、下記のようなことをやってます。

<?php
foreach($cojp_member_data["zip_data"] as $member_key => $member_item)
{
    if($member_item["zip_code"] == 12)
    {
        echo "<p><span class='fontRed'>";
        echo $member_item["zip_name"];
        echo "</span></p>";
    }
    else
    {
        echo "<p><span class='fontBlue'>";
        echo $member_item["zip_name"];
        echo "</span></p>";
    }
}
?>

ちょっと前のテンプレートエンジンなんだとか

PHPファイルで生成した値を、テンプレートファイルに表示させるやり方の一つに、Smartyエンジンってのが使われていたらしい。
PHPファイルの中に、こんなのがあったのがまさにそれ。

// これがテンプレートファイルに「アサインする」ってこと
$smarty->assign("cojp_member_data", $cojp_member_data);

配列cojp_member_dataを、指定のテンプレートファイルに"cojp_member_data"って変数でアサインする。
そうすることで、テンプレートファイルでは、

{* アサインした変数名に「$」を書いて使用 *}
{* カーリーブラケット「{}」で囲むのがポイント *}
{$cojp_member_data}

こんな感じで使っていく。

配列の場合、ブラケットで要素を指定するのではなく「.」で指定

{$cojp_member_data.zip_code}
{* echo $cojp_member_data["zip_code"]; とやりたいことは一緒 *}

このようにドットで展開していくようになる。
また、二次元、三次元となった場合は、第2,第3要素もドットで展開していく。

{$cojp_member_data.zip_code.12.name}
{* echo $cojp_member_data["zip_code"][12]["name"]; とやりたいことは一緒 *}

これにすんごい迷った...
CodeIgniterとか、CakePHPとかが出てくる前は、これが主流だったみたいだけど、
そのときは、まだプログラムの「プ」も知らない学生だったからなあ。
一応、備忘録に。

【Unity/C#】2Dオブジェクトの平行移動や回転とか。

主機能+αで、オブジェクトを動かしてみる

f:id:yadukkii:20151005234006p:plain:w150:right
『時計の機能だけでは、なんとなくさみしい...』

右の画像が今作っているモノの途中経過。
時計が主機能で、後々にアラート設定ができるようにしたいなーなんて考えています。
これを踏み台に、みんなの嫁が朝起こしに来る...的なのを作りたいなとw

で、実は図の中のちびキャラが背景で回転するようになっているのですが、これがまた詰まったトコロ。
というより、初めて使う関数や処理とかは、全部詰まってる気がする...

平行移動は「transform.Translate()」

public class moveChar : MonoBehaviour
{
    Rigidbody2D rb;
    void Start ()
    {
        rb = GetComponent<Rigidbody2D>();
    }
    void Update ()
    {
        var v = new Vector2(0.5f, rb.velocity.y);
        transform.Translate(v);
    }
}

このimageオブジェクトには Inspector>Physics>Regidbody 2D を設定した後、上記プログラムを組むと動くようにはなります。
「Vector2( X, Y )」のX軸に対し、1フレームに 0.5f ずつ進むようになっています。
これで横には進むようになったのですが、画面外に行ったり、スッスと横切るだけになったため、回転させてランダムに進むよう更に調整します。

回転は「transform.Rotate()」

    void Update ()
    {
        transform.Rotate(new Vector3(0.2f,0.1f,0.4f));
    }

「Vector3( X, Y, Z )」なので、薄っぺらい2Dオブジェクトが複雑な回転をするような動きになります。
組み合わせることで、背景にimageオブジェクトが回転しながらランダムに宙を回っているような動きが再現できました。

..まぁここまで来て、目覚まし機能が全然進んでいないことに気づき、今。
反省の念ばかり...w