カテゴリーアーカイブ 言語

著者:杉浦

ダミーデータ作成ライブラリFakerの紹介

 FakerはPHP上で扱うダミーデータ作成ライブラリです。この記事で扱うのはPHPのFakerですがいくつかの他言語でもFakerという名のダミーデータ作成ライブラリは存在します。

JavaScript faker
Python Faker
Ruby Faker
Perl Data-Faker

 歴史的にはRuby,PerlのFakerが元で、この便利なライブラリをPHP、Javascriptで使う人が出てきて、Pythonでも実装されて、といった具合です。Ruby版はPokemon,BackToTheFuture等の特にニッチなフォーマットがいくつかあります。いずれのFakerも多種多様なフォーマットのランダムなデータを生成でき、ダミーデータの作成を簡単に行えます。
 基本的な使い方はリンク先にある通り

<?php
// require the Faker autoloader
require_once '/path/to/Faker/src/autoload.php';
// alternatively, use another PSR-0 compliant autoloader (like the Symfony2 ClassLoader for instance)

// use the factory to create a Faker\Generator instance
$faker = Faker\Factory::create();

// generate data by accessing properties
echo $faker->name;
  // 'Lucy Cechtelar';
echo $faker->address;
  // "426 Jordy Lodge
  // Cartwrightshire, SC 88120-6700"
echo $faker->text;
  // Dolores sit sint laboriosam dolorem culpa et autem. Beatae nam sunt fugit
  // et sit et mollitia sed.
  // Fuga deserunt tempora facere magni omnis. Omnis quia temporibus laudantium
  // sit minima sint.

 fakerを呼び出し、任意のフォーマット名のプロパティを呼び出せば、そのフォーマットのランダムな値が返ってきます。

$faker->optional($weight = 0.9, $default = 'abc')->word; // 10% chance of 'abc'

の様に重みとデフォルト値をつけると、一定の割合でデフォルト値が出力されます。こういったデータの分布の操作もいくらかできます。
 配布された状態のままでは出力されるデータのパターン数がwebページのテストに困らない程度しかありません。そのため機械学習等のビッグデータを用いたプログラムのテストには使用できません。
 しかしながらデータセットの改変は容易です。データセットの記述されたファイルはfaker/src/Faker/Provider以下にあります。この部分を参考にProviderクラスのどれかを継承して、データセット変数を任意のデータセットで上書き、

$faker->addProvider(new Faker\Provider\en_US\Person($faker));

の様に新たなProviderを追加することで、オリジナルのデータセットでダミーデータを作成できます。

  • この記事いいね! (0)
著者:杉浦

CRUD機能を持つコントローラ

 CRUDはデータを扱う各機能であるCreate(生成)、Read(読み取り)、Update(更新)、Delete(削除)の頭文字をとってまとめた略語です。ざっくばらんに言えばCRUDはデータを操作のに最低限必要な機能のまとめです。4つだけの当たり前の機能をまとめているのは、4つまとめて使うことが多く、どれかの機能が欠けているだけでデータを操作する機能とは呼べないものになってしまうからです。例えば、使用可能な機能を、一般ユーザにはRead機能のみ、管理者ユーザにはCRUD機能全て、と割り当てるのは管理者のみがデータを操作できる機能割り当てと呼ばます。
 コーディングには機能の分割を行うべきという原則があります。機能を関数に分けたり、クラスに分けたりして理解しやすく、間違えにくくするわけです。この分割の定番として、データを表現するモデルとデータを扱うコントローラ、を分割する手法があります。この手法によってコントローラを分割した際、コントローラの中の機能を更に分割していきます。このコントローラの機能の分割の基準としてCRUDを用います。機能をCRUDとしてテンプレートの様に扱うことによって、先述した”データを操作する機能とは呼べない不完全な機能”を作ってしまうことがとても減ります。

  • この記事いいね! (0)
著者:杉浦

説明や要約を行う変数、関数

 巨大なオブジェクトを扱う時、深い場所にいる子要素を扱うことがままあります。メソッドチェーンによる処理結果を扱う時は深い子要素よりも簡単に、元の意味からかけ離れた式を作れます。例えば、

if line.split(':')[0].strip() == "root":

Dustin Boswell; Trevor Foucher. リーダブルコード (Kindle の位置No.1520). 株式会社オライリー・ジャパン. Kindle 版. 
@if ($experiense->member_id == Auth::user()->id)

です。こういった式をそのまま扱うと、これから先に読み返す時、混乱のもとになります。これを意味の通る変数名にまとめるとコメントもなく、可読性が高まります。変換は例えば、

username = line.split(':')[0].strip()
if username = = "root":

Dustin Boswell; Trevor Foucher. リーダブルコード (Kindle の位置No.1522). 株式会社オライリー・ジャパン. Kindle 版. 
@if (Auth::user()->owns($experiense))
//ここから別のファイル
class User
{
    public function owns($experiense)
    {
        return $this->id === $experiense->member_id;
    }
}

の様にできます。後者の例は別のファイルにロジックを複数用意した方が良かったり、owns()が何度も使われたり、という時に特に役に立ちます。

  • この記事いいね! (0)
村上 著者:村上

【Android】「Only the original thread that created a view hierarchy can touch its views.」の対処法

今日の記事は、Androidアプリ開発中に遭遇したエラーについてです。
修正はそこまで大変ではなかったのですが、使用頻度が低く、忘れそうだったので備忘録としてまとめます。

エラーは「Only the original thread that created a view hierarchy can touch its views.」というもので、こちらはメインスレッド以外で、TextView などの UI を変更しようとすると発生するエラーです。
シンタックスエラーとは違い、ビルドは通ってしまうので要注意ですね。

 

では、早速対処法についてご紹介。
今回参考にさせていただいたサイトはこちらです。

メインスレッド以外でUIを変更する方法 – Accele Biz IT開発技術 調査報告書
http://accelebiz.hatenablog.com/entry/2016/09/01/061934

エラーが発生したコードはこちら。

TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textView = findViewById(R.id.[ID名]);
    showMessage();
}

private void showMessage(){
    try {
        /* 処理 */
        textView.setText("[表示したい文字列]");
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

一部改変していますが、だいたいこんな感じ。
で、問題は、showMessage() 内の try/catch で指定した、setText() です。
やった事がなかったので知らなかったのですが、このようにメインスレッド以外で UI を操作することはできないようでした。

ですが、対処法もちゃんと用意されていました。
参考サイトそのままですが、Handler を使用して、別スレッドからメインスレッドに処理を依頼する方法です。
具体的には下記のとおりです。

private void showMessage(){
    final Handler mainHandler = new Handler(Looper.getMainLooper());
    try {
        /* 処理 */
        mainHandler.post(() -> {
            textView.setText("[表示したい文字列]");
        });
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

2行目に Handler を宣言し、TextView の操作の記述を mainHandler.post() で囲うだけです。
これを追加したところ、問題なく TextView の操作を行うことができました。

 

以上、TextView などの UI の操作をメインスレッド以外から行う方法でした。
今回の解決策は、例えば何らかの処理を別スレッド&非同期で行っていて、結果が返ってきたタイミングで UI を変更したい、等の場合にも使えるかと思います。
もし、同じエラーでお困りの場合は、是非参考にしていただければと思います。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】プラグイン「cordova-plugin-fcm」のgetTokenでnullが返ってくるときの対処法

現在進行形で格闘中のアプリの修正の中で、解決したものがあったのでそれをご紹介。
タイトル通り、「cordova-plugin-fcm」で端末の一意のトークンを取得する getToken() で、なぜか取得した値が null になる時の対処法です。
他にも同じエラーに悩んでいる人はいたようだったので、ある程度簡単に情報はヒットしました。
で、今回参考にしたサイトはこちら。

getToken() returns ‘null’ only after install・Issues #104・fechanique/cordova-plugin-fcm・GitHub
https://github.com/fechanique/cordova-plugin-fcm/issues/104

 

解決策としましては、もしトークンが取得できなかった場合は、onTokenRefresh() を使って、トークンを再取得しなおす方法が良いとのこと。
実際のコードはこちら。

FCMPlugin.getToken(
    (token) => {
        if(token == null){
            FCMPlugin.onTokenRefresh(function(token){
                // onTokenRefresh() でトークンを取得時の処理
            });
        } else {
            // getToken() でトークンを取得した時の処理
        }
    },
    (err) => {
        // エラー時の処理
    }
);

こんな感じです。
もし、getToken() で取得したトークンが null だったら、onTokenRefresh() でトークンを再取得しています。
現時点では、問題なくトークンが取得できました!
取得できたトークンはデータベースに保存なりして、プッシュ通知の送付に使います。

…が、なぜか今度はプッシュ通知が送れず…。
Androidだと、上記のトークンが取得できない問題もなく、あっさりとプッシュ通知送付まで実装できたのですが、まさかiOSでつまづくとは…。
一難去ってまた一難という感じですが…引き続き頑張ります。

 

ということで、cordova-plugin-fcm プラグインでトークンが取得できない時の対処法でした。
同じことにお困りの方は、是非お試しください。

  • この記事いいね! (0)
asaba 著者:asaba

【cordova-react】プラグインについての豆情報(二つあります)

今日はお題は二つの小ネタです。一つ目はcameraプラグインについてです。

 

cordova-camera-pluginとphonegap-camera-pluginはコルドバでカメラを使うことができるプラグインです。

自分のファイルの中にこの両方が入っており、どちらか消しても問題ないだろうと思いcordova-camera-pluginを削除したのですが

動かなくなりました。慌てて入れ直すとあっさりと元通り。なんでニコイチやねんと思いました。

米国のサイトまでいって調べたのですが、原因は分からずじまいです。

 

二つ目はプラグインを入れるタイミングの話です。

cordova platform rm androidした後にプラグインを入れてadd platformすると下記の画像のように怒られます。

原因は確信ではないのですが、直前に入れたプラグインを記憶できないためだと思われます。

なので必ず新しいplatformを入れてからプラグインを導入してくださいね、という感じです。赤文字は怖いですが大抵グレイドルか

プラグイン関係なので恐れることはないと思います。

以上小ネタでした。

 

  • この記事いいね! (0)
著者:杉浦

PHPの標準勧告提案PSR

PHPの標準勧告提案PSR
 PHP Standards Recommendations – PHP-FIG
PSRはPHPのコードはこのように作るべきだと推奨する提案の一つです。PSRはPHP-FIG — PHP Framework Interop Group – PHP-FIGによって策定されています。PHP-FIGはPHP Framework Interop Groupとある通り、複数あるPHPフレームワークの各関係者の集団です。その影響力は強く、いくつものフレームワークを始めとして多くのコードがPSRに準拠したコードになっています。
 現在、承認済みのPSRは次の表の通りです。

Accepted

Num Title Editor Coordinator Sponsor
1 Basic Coding Standard Paul M. Jones N/A N/A
2 Coding Style Guide Paul M. Jones N/A N/A
3 Logger Interface Jordi Boggiano N/A N/A
4 Autoloading Standard Paul M. Jones Phil Sturgeon Larry Garfield
6 Caching Interface Larry Garfield Paul Dragoonis Robert Hafner
7 HTTP Message Interface Matthew Weier O’Phinney Beau Simensen Paul M. Jones
11 Container Interface Matthieu Napoli, David Négrier Matthew Weier O’Phinney Korvin Szanto
13 Hypermedia Links Larry Garfield Matthew Weier O’Phinney Marc Alexander
15 HTTP Handlers Woody Gilk N/A Matthew Weier O’Phinney
16 Simple Cache Paul Dragoonis Jordi Boggiano Fabien Potencier
17 HTTP Factories Woody Gilk N/A Matthew Weier O’Phinney

 この中で特に多くの出番があるのはPSR-2、コーディング規約です。インデントはスペース4個、一行はできるだけ80文字以内に最大でも120文字以内、クラス、メソッドの開き括弧は次の行、などなどコードのスタイルについての規約が羅列されています。日本語訳も既にいくつかあります。PSR-2 コーディングガイド(日本語)|北海道札幌市のシステム開発会社インフィニットループ
【PSR】PHPの標準コーディング規約 – Qiita
【PHP】PSR-2 Coding Style Guide(コーディングスタイルガイド)
 チェックツールにはphp_codesniffer、修正ツールには php-cs-fixerなどがあります。

  • この記事いいね! (1)
村上 著者:村上

【PHP】FireBase Cloud Messagingを利用したプッシュ通知をPHPから送る方法

今日は、FireBase Cloud Messaging を利用したプッシュ通知を PHP から送付する方法についてです。
思ったより簡単に実装できたので、自分の備忘録(または困ったときのコピー元)としてまとめました。
なお、こちらは送信方法のみです。
FireBaseのアカウント作成等は飛ばしておりますので、その点はご了承ください。

今回参考にさせていただいた記事はこちらから。

WebAPIを叩く(curl) – Qiita
https://qiita.com/re-24/items/bfdd533e5dacecd21a7a

WebAPIの実行には、curl を使用しています。

 

早速ですが、コードはこちら。

$token = '[firebaseのトークン]';
$base_url = 'https://fcm.googleapis.com/fcm/send';

$data = array(
  "to" => "[送付先のデバイストークン]",
  "priority" => "high",
  "notification" => array(
    "title" => "[タイトル]",
    "body"  => "[メッセージ]",
    "sound" => "default",
    "click_action" => "FCM_PLUGIN_ACTIVITY"
  )
);

$header = array(
  'Authorization: key='.$token,
  'Content-Type: application/json'
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $base_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); // post
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); // jsonデータを送信
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); // リクエストにヘッダーを含める
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, true);

$response = curl_exec($curl);

$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE); 
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);
$result = json_decode($body, true); 

curl_close($curl);

接続先だったり、送付するデータを変更しただけで、ほぼ参考にさせていただいた記事に書かれていたコードそのままです。
変数 $data 内に指定しているデータは、通知の内容によって変更してください。
FCMの詳細については、下記の公式サイトのガイドを参考にしてください。

Firebase Cloud Messaging|FireBase
https://firebase.google.com/docs/cloud-messaging/?hl=ja

 

以上、FireBase Cloud Messaging で プッシュ通知をPHPで送信する方法でした。
他の WebAPI を PHP で実行するときにも使えますので、参考にしていただければと思います。

  • この記事いいね! (0)
村上 著者:村上

【PHP】XMLファイルのエラー「Parse error: syntax error, unexpected T_STRING」の対処法

今日は、XMLを扱ったときに遭遇したエラーについて。
エラーの全文はこちら。

Parse error: syntax error, unexpected T_STRING in [ファイル名] on line 1.

「予期しないT_STRING がある」というシンタックスエラーです。
シンタックスエラー=構文エラーということでしたが、参考にしたサンプルと見比べても、間違いはないし…何故?と少しだけ焦りました。
そもそも、xml ファイルを開いているのに、何故 PHP のエラーが発生するのかも最初は分かりませんでした。

 

こちらのエラーは、原因としては下記の1行目が、PHP と誤認識されるために発生するエラーとのことでした。

<?xml version="1.0" encoding="utf-8"?>

確かに、PHPって <?php ~処理~ ?> だけでなく、省略形として <? ~処理~ ?> とも書けましたね…。

こちらの誤認識を防ぐために、下記のように、PHPの echo を使って1行目を記述すると、問題なく動作するとのことでした。

<?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>

試したところ、確かに問題なく動作しました!

他にも、.htaccess に「AddType text/html .html」もしくは「php_flag short_open_tag Off」を追加するという方法もあるようでしたが、対処が簡単だったこちらの方法を採用しました。

ちなみに、今回参考にさせていただいたサイトはこちらから。

「syntax error, unexpected ‘version’・・・」 エラーの対処方法 – Project Group
https://www.projectgroup.info/tips/php/comm_0004.html

 

以上、XMLファイルが正常に読み込めない・開けない時の対処法でした。
思ったよりもあっさり解決できたので良かったです。
もし同じところで躓いていらっしゃる方がいましたら、参考にしていただければと思います。

  • この記事いいね! (0)
著者:杉浦

Unicodeプロパティを用いた正規表現で日本語を抽出

Unicode(ユニコード)は、符号化文字集合や文字符号化方式などを定めた、文字コードの業界規格である。文字集合(文字セット)が単一の大規模文字セットであること(「Uni」という名はそれに由来する)などが特徴である。

引用:Unicode – Wikipedia
 この引用文にある通り、Unicodeは非常に多くの文字を含んだ文字コードです。多種多様な文字を扱うために文字に分類付けがされています。この分類の仕方は複数あり、この記事で扱う分類はスクリプトです。スクリプトは文字体系による分類形式です。Script (Unicode) – Wikipediaにはスクリプトの一覧が載っています。
 正規表現ではUnicodeプロパティを用いて文字を識別できます。日本語のスクリプト名はそれぞれ、ひらがながHiragana、カタカナがKatakana、漢字がHanと名付けられています。ちなみにこのHanは繁体字のHanです。
 例えばjavascriptでは次の画像の様にUnicodeプロパティを用いた正規表現を使えます。

/\p{分類の名前=分類の中における文字集合の名前}/u

 phpなら

$pattern = '/\p{Hiragana}/u';

javascriptにもphpにもついていたuはUnicodeを使うという宣言です。

import regex
pattern = r'\p{Han}'
print(regex.findall(pattern, "朝早く起きた"))

 pythonはとてもシンプルな記法です。ただし3系の正規表現でもデフォルトではUnicodeプロパティ表現に対応しておらず、regex · PyPIのようなライブラリが必要です。
 注意点としてUnicodeのプロパティによる分類は強力ですが、Unicodeという探索範囲がとても広いため速度はあまり優秀でありません。PHPのPHP: Unicode 文字プロパティ – Manual にも以下の様に注意書きがあります。

Unicode プロパティを使った文字列マッチングは速くありません。PCRE は 15,000 以上のデータからなるストラクチャを検索する必要が有るためです。 そのため、PCRE では、\d や \w といった 以前から有るエスケープシーケンスは Unicode プロパティを使用しないように なっています。

  • この記事いいね! (0)