20210306のPHPに関する記事は10件です。

[PHP]1行チャットプログラム

こちらを参考に作ってみました。

[PHP]1行チャットプログラム

ロジック部分

<?php
$filename = 'chat_data.dat'; //チャットのデータを格納するファイル

if(isset($_POST['name']) || isset($_POST['comment'])) {
    $name = $_POST['name'];
    $comment = $_POST['comment'];
    date_default_timezone_set('Asia/Tokyo');
    file_put_contents($filename, date("y/m/d H:i").",".$name.",".$comment."\n", FILE_APPEND); //ファイルへの書き込み(1書き込みごとに改行する)
}
$contents = file_get_contents($filename); //ファイルの読み込み
$lines = explode("\n", $contents); //読み込んだ内容を1書き込みごとに分け、配列に入れる
?>
...
<?php    
    foreach($lines as $value) {
        list($date, $name, $comment) = array_pad(explode(",", $value, 3), 3, null); //$linesをさらに","ごとに分け、それぞれ$date, $name, $commentに格納
?>
    <tbody>
        <tr>
            <td><?php echo $date; ?></td>
            <td><?php echo $name; ?></td>
            <td><?php echo $comment; ?></td>
        </tr>
    </tbody>  
<?php } ?>

制作物

chat.png

学んだこと

・ファイル操作

file_put_contents($filename, date("y/m/d H:i").",".$name.",".$comment."\n", FILE_APPEND); //ファイル書き込み。FILE_APPENDはファイルの最後に追記することを表す
file_get_contents($filename); //ファイル読み込み

・文字列を任意の文字列で分割

$lines = explode("\n", $contents);

・array_pad()

list($date, $name, $comment) = array_pad(explode(",", $value, 3), 3, null);

explode()によって返される配列を3に制限し、返される値が3未満の場合、3になるまでnullが追加されるそう。
最初foreachで回す部分を

<?php    
    foreach($lines as $value) {
        $data = explode(",", $value); 
?>
        <table>
            <tr>
                <td><?php echo $data[0]; ?></td>
                <td><?php echo $data[1]; ?></td>
                <td><?php echo $data[2]; ?></td>
            </tr>
        </table>
<?php } ?>

こう書いていましたが、「Undefined offset: 1」「Undefined offset: 2」が消えず、、、
ロジック部分の該当箇所に修正したら消えました。
あと、list(変数1, 変数2,,,)の書き方初めて知った。便利そう!

感想

bootstrap初めて使ったけど便利!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【使い分け】mb_substr()とpreg_match()

初めに

生のPHPを使ってAPIから値を取得する課題を進めている中で、特に学びとなったことを覚えとして投稿
※PHPでAPIの取得方法は
こちらの記事
当時のツイート

※私の状況
・プログラミング学習歴:8か月(ほぼ独学)
・PHP学習歴:2か月

経緯

問題内容

たくさんの猫の情報が詰まっている、とあるAPIから以下のような条件で値を取り出す問題があった

・問題
猫の品種(name)の末尾が"hair"で終わる品種(name)の内、寿命(life_span)の最大値が一番大きい猫の品種(name)を表示

当初予定(mb_substr)

当初は、

猫の品種(name)の末尾が"hair"で終わる品種

と聞いた時
mb_substrを使って末尾だけが"hair"である猫の品種(name)に絞ればOK!」
と思い

mb_substr($json_arry["name"], -4)="hair"

の条件を見たす品種(name)を取得する予定でしたが、うまく狙った値が取り出せず、一度他の方法を考えることに。

修正案(preg_match)

他の方法を調べたところ、preg_match()を使った正規表現を見つけたので、こちらで実装することにした。
実は正規表現は書き方が複雑で少し避けがちであった関数でしたが、調べてみると

記述方法 用途 使用例
"/^~/" 冒頭にマッチ 文字列の冒頭が"~"で始まる文字列がマッチ
"/~$/" 文末にマッチ 文字列の文末が"~"で終わる文字列がマッチ
"/*.~/" 改行以外の任意の1文字にマッチ "* ~"や"*-~"などの文字列がマッチ
"/--[abc]--/" []内の任意の1文字にマッチする a,b,cいずれかを含む文字列がマッチ。[]内は英数字でも可。

...etc

ここで書いたのは一例です。
こんな形で用途が様々で便利だと実感しました。

今回は「末尾が"hair"」なので$を使用し

preg_match('/hair$/', $data_first['name']);

と記述。
無事狙い値を取得し、問題を解くことができました。

使い分け方

更に深堀りして学習。

一見、似た処理をするmb_substrpreg_matchですが、何が違うのかというと
mb_substr:「切り出し」た文字列の自体を取得
 ⇒返り値は"hair"など文字列の一部
preg_match:指定した文字列を「含む」か否か
 ⇒返り値はtruefalse

という使い分けになります。

最後に

学習始めたての方々にとってはもしかしたら
正規表現って書き方難しそうだし、できれば使いたくない…
と思うかもしれません。(かくいう、私もそんな風に思っていました…)

ですが、上記のように値を取得する際に便利なオプションがあります。
今後、上のオプションを用いた正規表現を使えそうであれば是非使ってみてください!
便利さを実感すると同時にコーディングの幅が広がると思います。

最後までご覧頂きありがとうございました!m(__)m

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

composer require で Allowed memory size が発生したときの対処方法

はじめに

composer require を行ったときに Allowed memory size が発生したので対処方法をまとめました

環境

$ sw_vers
ProductName:    macOS
ProductVersion: 11.2.2
BuildVersion:   20D80

$ php -v
PHP 7.4.9 (cli) (built: Aug  8 2020 11:29:07) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
    with Xdebug v2.9.6, Copyright (c) 2002-2020, by Derick Rethans

$ php artisan -V
Laravel Framework 8.31.0

解決した方法

COMPOSER_MEMORY_LIMIT=-1 でメモリ制限を解除して composer require を実行することで解決しました

以下のように実行すると、メモリ不足となりました

$ composer require laravel/ui
Using version ^3.2 for laravel/ui
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
PHP Fatal error:  Allowed memory size of 1610612736 bytes exhausted

そこで、 COMPOSER_MEMORY_LIMIT=-1 の環境変数を渡して、 composer require を実行することでメモリ不足を回避しました

$ COMPOSER_MEMORY_LIMIT=-1 composer require laravel/ui
Using version ^3.2 for laravel/ui
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing laravel/ui (v3.2.0): Downloading (100%)         
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
74 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

参考

Memory limit errors

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【超初心者向け】「変数は何のために使う??」2分で理解

今回は、変数は何で使うのかという理由を書かせていただきます!

前回の記事:
変数とは何か??

今回の記事を読む前に変数とは何か??を読んだ後の方が理解がしやすいと思います。


では、初めていきます!

変数は何ために使うのか?

答えは、

また使いたい時に再利用ができるからです!!

例えば、

毎月の水を30本ECサイトで買っているとすると、毎月水を検索して買うのはとても面倒だと思います!

その際にその水30本をすぐに見つけられる様に欲しいものリストに入れておくといつでもすぐに見つけることが可能になります!

変数は欲しいものリストに商品を入れて置くのと一緒ということになります!

・変数という箱にデータを入れる
・欲しいものリストという箱に欲しい商品のデータを入れて置く

こうすることにより、いつでもデータを使うのが簡単になります!

終わりに

今回は、変数は何のために使うかについて書かせていただきました!
読んでもらえると、とても嬉しいです!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Laravel] CircleCIにphp-gdをインストールする

概要

CircleCIでテストを自動化している際に画像関連のテストで以下のエラーで引っかかってしまいました。

Error: Call to undefined function imagecreatetruecolor()

/home/circleci/ci-demo/backend/vendor/laravel/framework/src/Illuminate/Http/Testing/FileFactory.php:75
/home/circleci/ci-demo/backend/vendor/laravel/framework/src/Illuminate/Support/helpers.php:263
/home/circleci/ci-demo/backend/vendor/laravel/framework/src/Illuminate/Http/Testing/FileFactory.php:87
/home/circleci/ci-demo/backend/vendor/laravel/framework/src/Illuminate/Http/Testing/FileFactory.php:58

画像処理系のライブラリであるphp-gdがCircleCIイメージにインストールされていないために起こったエラーみたいです。

忘れないようにメモします。

環境

CircleCI 2.1
Laravel 8.12
PHP 7.3

実装

circleci/config.yml
version: 2.1
jobs:
  build:
    docker:
      - image: circleci/php:7.3.0-node-browsers
      - image: circleci/mysql:8.0.0
        command: mysqld --default-authentication-plugin=mysql_native_password
    environment:
      - DB_CONNECTION: circle_testing
      - APP_ENV: testing
      - MYSQL_ALLOW_EMPTY_PASSWORD: true
      - MYSQL_ROOT_HOST: '%'
      - MYSQL_DATABASE: circle_test
    working_directory: ~/ci-demo
    steps:
      - checkout
      - run: 
          name: Update apt-get
          command: sudo apt-get update
   //ここで追加
      - run:   
          name: Install php-gd
          command: |
            sudo apt-get -y install libpng-dev  
            sudo docker-php-ext-install  gd 
      - run:
          name: Docker php extensions install
          command: sudo docker-php-ext-install pdo_mysql
      - run:
          name: Wait for DB
          command: dockerize -wait tcp://127.0.0.1:3306 -timeout 3m 
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "backend/composer.json" }}
            - v1-dependencies-
      - run:
          working_directory: backend
          name: Install PHP libraries
          command: composer install -n --prefer-dist
      - save_cache:
          paths:
            - ./vendor
          key: v1-dependencies-{{ checksum "backend/composer.json" }}
      - run:
          working_directory: backend
          command: composer install
      - run:
          working_directory: backend
          command: php artisan migrate
      - run:
          working_directory: backend
          name: Run PHPUnit
          command: ./vendor/bin/phpunit

circleci/config.yml
      - run:
          name: Install php-gd
          command: |
            sudo apt-get -y install libpng-dev
            sudo docker-php-ext-install  gd
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ポートフォリオ作成日記

ポートフォリオ作成のために必要なことを明確化する

明確な目標設定

・3ヶ月でポートフォリオを作成する
・6月までにポートフォリオを完成させる

今の自分がわかっていないこと

・ポートフォリオの作り方
・GitHubの使い方
・フレームワーク
・ポートフォリオまでの道筋
・要件定義のやり方

これからの大まかなスケジュール

最初の一ヶ月

・書籍を用いたPHP基本文法の学習
・Udemyを用いた基礎的な開発環境の整理
・Webサイトの模写による基本的なHTMLの確認

二ヶ月目

・ポートフォリオに搭載する機能の整理
・PHPによる開発
・フレームワークの利用

三ヶ月目

・ポートフォリオ完成
・デプロイ
・企業に持っていく
・(javascriptまで実装できたらなお良い)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】初心者向け アロー関数の書き方

はじめに

PHP 7.4からアロー関数が使えるようになりました?
これで、PHPをJavaScript風に書けるようになりますねー

実行バージョン

$ php -v
PHP 8.0.2 (cli) (built: Feb  4 2021 18:01:33) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.2, Copyright (c), by Zend Technologies

アロー関数とは

アロー関数は 無名関数 を簡潔に書ける文法として PHP 7.4 で追加されました。
公式より

php
// 今まで
$calc = function($x,$y) {return $x+$y;};

// アロー関数
$calc = fn($x,$y) => $x+$y;

今まではクロージャーで関数を定義する場合、functionreturnを書く必要がありましたが、アロー関数で記載することで、functionfnにして、returnを省略することができます。
アロー関数で書いた方がスッキリ?

できない書き方

php
$calc = fn($x) => {$x};
// PHP Parse error:  syntax error, unexpected token "{"

$calc = fn($x) => return x;
// PHP Parse error:  syntax error, unexpected token "return"

$calc = fn($x) => {
    $y = 2;
    return $x+$y+;
};
// PHP Parse error:  syntax error, unexpected token "{"

return, {を書くと怒られます。また、複数行で記述することもできません。。
JavaScriptはできるのに。。

コールバック関数として使用

php
$arr = [1,2];
$res = array_map(fn($n) => $n*$n, $arr);
// array(2) {
//   [0]=>
//   int(1)
//   [1]=>
//   int(4)
// }

$res = array_filter($arr, fn($n) => $n === 1);
// array(1) {
//   [0]=>
//   int(1)
// }

もちろんコールバック関数でも使うことができます。

最後に

私はこの書き方を結構気に入っています!若干、JavaScriptと書き味が違うので気をつけてください。親のスコープの変数を参照できる等、少し癖があるので、公式を読んでから使うようにしてください!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】アロー関数入門

はじめに

PHP 7.4からアロー関数が使えるようになりました?
これで、PHPをJavaScript風に書けるようになりますねー

実行バージョン

$ php -v
PHP 8.0.2 (cli) (built: Feb  4 2021 18:01:33) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.2, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.2, Copyright (c), by Zend Technologies

アロー関数とは

アロー関数は 無名関数 を簡潔に書ける文法として PHP 7.4 で追加されました。
公式より

php
// 今まで
$calc = function($x,$y) {return $x+$y;};

// アロー関数
$calc = fn($x,$y) => $x+$y;

今まではクロージャーで関数を定義する場合、functionreturnを書く必要がありましたが、アロー関数で記載することで、functionfnにして、returnを省略することができます。
アロー関数で書いた方がスッキリ?

できない書き方

php
$calc = fn($x) => {$x};
// PHP Parse error:  syntax error, unexpected token "{"

$calc = fn($x) => return x;
// PHP Parse error:  syntax error, unexpected token "return"

$calc = fn($x) => {
    $y = 2;
    return $x+$y+;
};
// PHP Parse error:  syntax error, unexpected token "{"

return, {を書くと怒られます。また、複数行で記述することもできません。。
JavaScriptはできるのに。。

コールバック関数として使用

php
$arr = [1,2];
$res = array_map(fn($n) => $n*$n, $arr);
// array(2) {
//   [0]=>
//   int(1)
//   [1]=>
//   int(4)
// }

$res = array_filter($arr, fn($n) => $n === 1);
// array(1) {
//   [0]=>
//   int(1)
// }

もちろんコールバック関数でも使うことができます。

最後に

私はこの書き方を結構気に入っています!若干、JavaScriptと書き味が違うので気をつけてください。親のスコープの変数を参照できる等、少し癖があるので、公式を読んでから使うようにしてください!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

変数とは何か??

今回は、変数についての説明をしていきます

誰向けの記事か

・PHPの勉強を始めたばかりの方
・変数は、わかっているけど言語化できない

という人向けに書きます。

変数とは何か??

変数とは、入れたいデータを入れる事ができるです。

例:

test.php
<?php
    $test = 'ここのデータが$testに入る';

これで変数はOKです!

上記の書き方をすると変数の中($test)に'ここのデータが$testに入る'が入ったことになります。


しかし、ここで問題があります。。。

変数にデータを入れたはいいけど代入したデータを表示できない・・・

これの解決方法は簡単です!!

test.php
<?php
    $test = 'ここのデータが$testに入る';
    print $test;

これでOKです!!

これだけで変数にデータを入れてさらにデータを表示ができます!

次にオススメの記事:

【超初心者向け】「変数は何のために使う??」2分で理解

終わりに

今回は、変数のことを書きました。

なぜこの記事を書こうとしたかというと、


僕がプログラミングを始めた際に、
教材に難しく書いてあり理解できなかったので、できるだけ簡単に初心者時代の自分にでも理解できる様に書きました。


最後まで読んでいただきありがとうございます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

証券のリスクとリターンを計算するアプリケーションを作ろう

ファイナンス理論では証券のリターンとリスクを手がかりにポートフォリをを構築していく。
ポートフォリオに個別証券をどれだけの割合で組み入れるかを判断するためには、以下のパラメータが必要。

  1. リターン(期待収益率)
  2. リスク(標準偏差)
  3. 各銘柄についての相関係数

要件

個別証券の番号やティッカーを入力すると、上記パラメータが出力されれば良いので、コンソールアプリケーションでも良いが、商品化も視野に入れてるので最初からWebアプリケーションで開発する。
使用する言語は以下を想定

  1. R
  2. PHP
  3. HTML

設計方針

リスクとリターンを計算するためのヒストリカルデータのサンプリング期間については様々な議論があるが、三菱信託UFJ銀行は過去 20 年間の月次のリターン実績から算定しているそうなので、これに倣うとしよう。
計算式は以下の通り

リスク推計値\left(年率標準偏差\right)=\left(n年間の月次リターンの標準偏差\right)×\sqrt{12}\\\\
ただし、n=20

しかし、ヒストリカルデータが20年に満たない場合があるので、この際は設定来のデータを利用しよう。
ちなみにリターンは年率リターンの平均値で計算する。
相関係数はヒストリカルデータから分散、共分散を計算できるので、追加の情報は不要。

Webサーバの構築

お手軽なWebサーバーの立て方というのが公開されていたので、これにしてみよう。
ついでにSmartyというPHPテンプレートエンジンもインストールしておく。
Smartyを使いやすくするために、Smartyクラスを継承するSmarty_PortfolioMakerクラスを作成するsetup.phpをPHPのinclude_pathに設置しておく。

setup.php
<?php

// Smartyライブラリを読み込みます
require('Smarty.class.php');

// setup.phpはアプリケーションに必要なライブラリファイルを
// 読み込むのに適した場所です。それをここで行うことができます。例:
// require('guestbook/guestbook.lib.php');

class Smarty_PortfolioMaker extends Smarty
{

   function __construct()
   {

      // クラスのコンストラクタ。
      // これらは新しいインスタンスで自動的にセットされます。

      parent::__construct();

      $this->template_dir = 'C:/xampp/portfoliomaker/templates/';
      $this->compile_dir  = 'C:/xampp/portfoliomaker/templates_c/';
      $this->config_dir   = 'C:/xampp/portfoliomaker/configs/';
      $this->cache_dir    = 'C:/xampp/portfoliomaker/cache/';

      $this->caching = Smarty::CACHING_LIFETIME_CURRENT;
      $this->assign('app_name', 'Portfolio Maker');
   }
}

あとはRの環境を用意すれば準備OK。

PHPとRの結合

入出力の要件定義より、処理順を以下の通り設計。

  1. PHPで出力したHTMLより銘柄コードまたはティッカーを入力して送信
  2. 入力値をRに渡してヒストリカルデータを取得
  3. Rでヒストリカルデータを解析し、リスクとリターンを出力
  4. 出力されたデータをPHPで受け取り、HTMLに描画して表示

では作っていこう。

入力画面

これはHTMLを吐けばいいので簡単。
phpはdisplay関数を呼ぶだけにとどめ、マークアップはtplファイルに任せる。

input.php
<?php
require_once('portfoliomaker/setup.php');
$smarty = new Smarty_PortfolioMaker;
$smarty->display('input.tpl');
?>
input.tpl
<!DOCTYPE html>
<html lang=“ja”>

<head>
    <meta charset=“UFT-8”>
    <title>さいきょうのポートフォリオを作ろう!</title>
</head>

<body>
    <h1>ETFのリスクとリターンを検索する</h1>
    <form action="portfoliomaker/quants.php" method="POST">
        <input type=“text” name=ticker><br />
        <button type=“submit” value=“送信“>送信</button>
    </form>
</body>

</html>

Rによる統計解析

ここではphpはさておき、Rだけでスクリプトを書いてみる。

analyze_risk_and_return.R
install.packages("tidyverse", repos = "http://cran.us.r-project.org", dependencies=TRUE)
install.packages("tidyquant", repos = "http://cran.us.r-project.org", dependencies=TRUE)
install.packages("timetk", repos = "http://cran.us.r-project.org", dependencies=TRUE)
install.packages("PerformanceAnalytics", repos = "http://cran.us.r-project.org", dependencies=TRUE)
install.packages("GGally", repos = "http://cran.us.r-project.org", dependencies=TRUE)
install.packages("ggrepel", repos = "http://cran.us.r-project.org", dependencies=TRUE)
install.packages("patchwork", repos = "http://cran.us.r-project.org", dependencies=TRUE)
install.packages("formattable", repos = "http://cran.us.r-project.org", dependencies=TRUE)
install.packages("rjson", repos = "http://cran.us.r-project.org", dependencies=TRUE)
library(tidyverse)
library(tidyquant)
library(timetk)
library(PerformanceAnalytics)
library(GGally)
library(ggrepel)
library(patchwork)
library(formattable)
library(rjson)

args <- commandArgs(trailingOnly = TRUE)
symbol <- args[1]
rawdata <- tq_get(symbol, from = "1993-01-01")

data <- rawdata %>%
group_by(symbol) %>%
tq_transmute(adjusted, mutate_fun = dailyReturn, col_rename = "return") %>%
slice(-1)

data %>%
summarize(start = min(date), end = max(date), na = sum(is.na(return)))

get_start_date <- function(data) {
    data %>%
    summarise(start_date =  min(date)) %>%
    pull(start_date) %>%
    max()
}

align_start_date <- function(data) {
  start_date <- get_start_date(data)
  filter(data, date >= start_date)
}

add_cumret_dd <- function(data) {
  suppressWarnings(
    data %>%
    mutate(cum_ret = cumprod(1 + return) - 1,drawdown = Drawdowns(return))
  )
}

convert_to_xts <- function(data, name_col, value_col) {
  name_col <- enquo(name_col)
  value_col <- enquo(value_col)
  data %>%
    select(date, !!name_col, !!value_col) %>%
    pivot_wider(names_from = !!name_col, values_from = !!value_col) %>%
    tk_xts(-date, date)
}

calc_perf_metrices <- function(data) {
    xts_data <- convert_to_xts(data, symbol, return)

    map_dfr(names(xts_data), function(symbol) {
        ra <- xts_data[, symbol]
        data.frame(
            Symbol  = symbol,
            Sharpe  = round(as.numeric(SharpeRatio(ra, annualize = TRUE, FUN = "StdDev")), 2),
            Avg_Ret = as.numeric(Return.annualized(ra)),
            Cum_Ret = as.numeric(Return.cumulative(ra)),
            StdDev  = as.numeric(StdDev.annualized(ra)),
            MaxDD   = as.numeric(maxDrawdown(ra)),
            stringsAsFactors = FALSE
        )
    }) %>%
    mutate_at(vars(Avg_Ret, Cum_Ret, StdDev, MaxDD), percent, digits = 1) %>%
    arrange(-Sharpe)
}

analysis_result <- list()
analysis_result$data <- data %>%
    align_start_date() %>%
    add_cumret_dd()

analysis_result$pref_table <- calc_perf_metrices(analysis_result$data)
cat(toJSON(analysis_result$pref_table))

まず、phpの実行ユーザ権限でパッケージをインストールする必要があるので、初回実行時だけinstall.packages()関数でパッケージをインストールする。
インストールログはApacheのerror.logに出力されるので、これをtailで流しながらインストールすると安心である。
メインプログラムは以下の手順で処理を実行する。

  1. 引数からティッカーを取得する
  2. ティッカーのヒストリカルデータをYahoo!Financeからダウンロードする
  3. ヒストリカルデータからリターンを計算し、行列に追加する
  4. ヒストリカルデータからドローダウンを計算し、行列に追加する
  5. 各種指標を計算し、toJSON()関数でエンコードしてcat()関数で標準出力する

解析結果の表示

POSTされたティッカーをRに渡し、結果を表示する処理をphpに記述する。
こちらのサイトを参考に開発する。

quants.php
<?php
require_once('portfoliomaker/setup.php');
$smarty = new Smarty_PortfolioMaker;
if (isset($_POST['ticker'])) {
    $ticker = $_POST['ticker'];
    $enc_ticker = json_encode($ticker);

    if (file_exists('C:/xampp/php/pear/portfoliomaker/R/analyze_risk_and_return.R')) {
        $cmd = "Rscript.exe --vanilla C:/xampp/php/pear/portfoliomaker/R/analyze_risk_and_return.R $enc_ticker";
        exec($cmd, $response);
        $res = json_decode($response[4]);
        $smarty->assign('ticker', $ticker);
        $smarty->assign('Avg_Ret', $res->Avg_Ret);
        $smarty->assign('StdDev', $res->StdDev);
    } else {
        print_r("Rスクリプトがないよ。");
        print_r(__DIR__);
    }
}
$smarty->display('quants.tpl');
?>

今回はRに渡す値が1つしかないので、JSON形式である必要は全く無いが、後学のためにフォームからPOSTされた値をjson_encode()関数でJSON形式にエンコードしてから、Rscript.exeの引数に渡す。
実行するスクリプトは先程作ったanalyze_risk_and_return.Rだ。
出力したい値をassign()関数で割り当てておき、quants.tplでマークアップする。

quants.tpl
<!DOCTYPE html>
<html lang = “ja”>
    <head>
        <meta charset = “UFT-8”>
        <title>さいきょうのポートフォリオを作ろう!</title>
    </head>
    <body>
        <h1>ETFのリスクとリターン</h1>
        <div>
            <p>ティッカー:{$ticker}</p>
            <p>リスク:{$StdDev}</p>
            <p>リターン:{$Avg_Ret}</p>
        </div>
    </body>
</html>

まとめ

これでコーディングは完了した。
あとは、input.phpにお目当てのティッカーを入力して送信すれば、quants.phpがヒストリカルデータを引っ張ってきてリスクとリターンを出力してくれる。
次回は複数の銘柄を入力し、相関係数を出力するプログラムに発展させてみよう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む