Blog | ytyng.comhttps://b.ytyng.com/blog/2024-03-29T08:42:39+00:00BlogPHPでJANコードのチェックデジットをバリデーションするコード2023-04-01T02:27:15+00:002024-03-29T02:32:06+00:00ytynghttps://b.ytyng.com/blog/author/ytyng/https://b.ytyng.com/blog/jan-checkdigit-validation-php-code/```php
/**
* JANのチェックデジットを検証し、[成功?, メッセージ] を返す
*/
function validate_jan($jan): array
{
$match = preg_match('|^(\d{12})(\d)$|', $jan, $matches);
if (!$match) {
return [false, '桁数エラー'];
}
$chars = str_split($matches[1]);
$odd_total = 0;
$even_total = 0;
foreach ($chars as $i => $v) {
if ($i % 2 == 0) {
// 0スタートなので0は奇数桁
$odd_total += $v;
} else {
$even_total += $v;
}
}
$total = $even_total * 3 + $odd_total;
$digit = (10 - ($total % 10)) % 10;
if ($matches[2] != $digit) {
return [false, "チェックディジットが不一致。本来は {$digit}"];
}
return [true, ""];
}
```PHPでXMLを Zend Framework HTTP Cient で POSTする2022-04-20T00:34:17+00:002024-03-28T22:35:20+00:00ytynghttps://b.ytyng.com/blog/author/ytyng/https://b.ytyng.com/blog/php-xml-post-by-zend-framework-http-client/<p><span>PHP で、 SimpleXMLで XML を構築し、 Zend Framework の HTTP Client でリクエストするコード</span></p>
<pre><span>$xml </span><span>= </span><span>new </span><span>\</span><span>SimpleXMLElement(</span><span>'</span><span><request/></span><span>'</span><span>)</span><span>;<br/></span><span>$xml</span><span>-></span><span>addChild</span><span>(<br/></span><span> </span><span>'partner'</span><span>,<br/></span><span> </span><span>$this</span><span>-></span><span>credentials</span><span>[</span><span>'aaa'</span><span>])</span><span>;<br/>$order = $xml->addChild('order');<br/>$order->addAttribute('order_id', $orderId);<br/>$order->addChild('status', $status);<br/><br/>$client = new \Zend_Http_Client();<br/>$client->setUri('https://....');<br/>$client->setRawData($xml->asXML(), 'text/xml');<br/>$response = </span><span>$client</span><span>-></span><span>request</span><span>(</span><span>'POST'</span><span>)</span><span>;<br/></span></pre>
<p><span></span></p>Vue.js webpack dev server の Proxy で Django + Python social auth のソーシャルプロバイダ認証をする場合2019-03-14T15:19:17+00:002024-03-29T08:42:39+00:00ytynghttps://b.ytyng.com/blog/author/ytyng/https://b.ytyng.com/blog/vue-js-webpack-dev-server-proxy-django-python-social-auth/<p>Vue で開発する際、webpack dev server を起動していて、API バックエンドに Django を使っていて、Django の認証に Python social auth + 外部 Auth プロバイダを使っているケース。</p>
<p>そのままだと、外部プロバイダ認証時のコールバックURL が Django の検証サーバのポートになってしまうため、認証ができない。</p>
<p></p>
<p>その場合は、webpack dev server の設定で X-Forwarded-For で webpack dev server にリクエストしているポートを指定し、</p>
<h2>vue.config.js</h2>
<pre><span>module</span>.<span>exports </span>= {<br/> <span>devServer</span>: {<br/> <span>proxy</span>: [{<br/> <span>context</span>: [<span>'/auth'</span>, <span>'/accounts'</span>, <span>'/admin'</span>],<br/> <span>target</span>: <span>'http://localhost:8014'</span>,<br/> <span>headers</span>: {<br/> <strong>'X-Forwarded-For': </strong><span><strong>'http://localhost:8080'</strong><br/></span><span> </span>}<br/> }],<br/> },<br/>};</pre>
<p></p>
<p>Django の設定で USE_X_FORWARDED_HOST = True にする</p>
<h2>Django settings</h2>
<pre>USE_X_FORWARDED_HOST = <span>True</span></pre>
<p></p>PHP SSHの逆ポートフォワードごしにリモートデバッグする2017-04-28T03:25:22+00:002024-03-28T17:39:01+00:00ytynghttps://b.ytyng.com/blog/author/ytyng/https://b.ytyng.com/blog/php-remote-debug/<p>本番サーバ等、離れた環境にある PHP をリモートデバッグする場合。</p>
<p>開発用の PC は社内 LAN の中にあり、外からは直接アクセスできないとします。</p>
<p>その場合、SSH で逆向きのトンネルを作り、本番サーバ→ローカルPC と通信させます。</p>
<p></p>
<p>本番のPHPのxdebugの設定ファイル</p>
<p>例: /etc/php/5.6/apache2/conf.d/20-xdebug.ini</p>
<pre>[xdebug]<br/>zend_extension=xdebug.so<br/><br/>xdebug.remote_enable=1<br/>xdebug.remote_port="9000"<br/>xdebug.profiler_enable=0<br/>xdebug.profiler_output_dir="/tmp"<br/>xdebug.max_nesting_level=1000<br/>xdebug.idekey = "PHPSTORM"</pre>
<p>phpinfo() した時、Scan this dir for additional .ini files /etc/php/5.6/apache2/conf.d のような表示が出るのでそこから設定ファイルを探す</p>
<p></p>
<p>上記の設定の場合、デバッグ時 (URLのGET引数に ?XDEBUG_SESSION_START=12345 みたいに入ってる時) にローカルホストの 9000 ポートに接続するようになってます。</p>
<p></p>
<p>開発用ローカルPCで</p>
<pre>$ ssh -R 127.0.0.1:9000:127.0.0.1:9000 user@example.com</pre>
<p>として、本番サーバの9000 ポートをローカルの 9000ポートにトンネルします。</p>
<p></p>
<p>そして、PHPStorm でデバッグを実行すると、ブレイクポイントでブレイクしてデバッグできます。</p>
<p>サーバ設定のパスマッピングをちゃんと作成してないとブレイクしないのでご注意ください。</p>
<p></p>
<p>ちなみに、私はデプロイに Python の Fabric を使っているため、このようなコマンドでトンネルを作ります。</p>
<pre>@runs_once<br/>def xdebug():<br/> """<br/> xdebug用のSSHトンネルを作ります<br/> """<br/> local('ssh -R 127.0.0.1:9000:127.0.0.1:9000 {}@{}'.format(env.user, env.hosts[0]))</pre>
<p></p>Mac brew の PHP で dlopen(/usr/local/opt/php56-intl/intl.so, 9): Library not loaded: /usr/local/opt/icu4c/lib/libicuuc.57.dylib2017-02-03T01:18:00+00:002024-03-22T11:57:53+00:00ytynghttps://b.ytyng.com/blog/author/ytyng/https://b.ytyng.com/blog/mac-brew-%E3%81%AE-php-%E3%81%A7-dlopenusrlocaloptphp56-intlintlso-9-library-not-loaded-usrlocalopticu4cliblibicuuc57dylib/<pre>$ <strong>php</strong><br/>PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/opt/php56-intl/intl.so' - dlopen(/usr/local/opt/php56-intl/intl.so, 9): Library not loaded: /usr/local/opt/icu4c/lib/libicuuc.57.dylib<br/> Referenced from: /usr/local/opt/php56-intl/intl.so<br/> Reason: image not found in Unknown on line 0</pre>
<p><br/>となったら<br/><br/>/usr/local/opt/icu4c/lib/ を見てみると、icu の 58 はインストールされている。</p>
<p></p>
<pre>$ <strong>brew info icu4c</strong><br/>icu4c: stable 58.2 (bottled), HEAD [keg-only]<br/>C/C++ and Java libraries for Unicode and globalization<br/>http://site.icu-project.org/<br/>/usr/local/Cellar/icu4c/52.1 (257 files, 59.8M)<br/> Poured from bottle on 2013-12-11 at 10:59:53<br/>/usr/local/Cellar/icu4c/54.1 (260 files, 64.5M)<br/> Built from source on 2014-10-18 at 22:55:53<br/>/usr/local/Cellar/icu4c/55.1 (262 files, 65M)<br/> Poured from bottle on 2015-04-30 at 04:59:44<br/>/usr/local/Cellar/icu4c/57.1 (265 files, 65.0M)<br/> Poured from bottle on 2016-09-15 at 10:44:40<br/>/usr/local/Cellar/icu4c/58.2 (243 files, 65M)</pre>
<p></p>
<pre>$ <strong>brew switch icu4c 57.1</strong><br/>Cleaning /usr/local/Cellar/icu4c/52.1<br/>Cleaning /usr/local/Cellar/icu4c/54.1<br/>Cleaning /usr/local/Cellar/icu4c/55.1<br/>Cleaning /usr/local/Cellar/icu4c/57.1<br/>Cleaning /usr/local/Cellar/icu4c/58.2<br/>Opt link created for /usr/local/Cellar/icu4c/57.1</pre>
<p></p>
<pre>$ <strong>php -a</strong><br/>Interactive shell</pre>
<p><br/>エラー出なくなる</p>
<p></p>
<p>追記</p>
<p>lessc を使おうとしたら</p>
<pre>dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.59.dylib<br/> Referenced from: /usr/local/bin/node<br/> Reason: image not found</pre>
<p>になったので良くないかも?</p>
<p></p>
<p>ひとまず、シンボリックリンクしてみたらどうだろう。試験中</p>
<pre>$ brew switch icu4c 59.1</pre>
<p></p>
<pre>$ cd /usr/local/opt/icu4c/lib/</pre>
<pre>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicudata.57.1.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicudata.57.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicui18n.57.1.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicui18n.57.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicuio.57.1.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicuio.57.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicule.57.1.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicule.57.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libiculx.57.1.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libiculx.57.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicutest.57.1.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicutest.57.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicutu.57.1.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicutu.57.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicuuc.57.1.dylib ./<br/>$ ln -s /usr/local/Cellar/icu4c/57.1/lib/libicuuc.57.dylib ./</pre>
<p></p>Failed to fetch http://ppa.launchpad.net/ondrej/php5-5.6/ubuntu/dists/trusty/main/binary-amd64/Packages 404 Not Found になったら2017-02-01T09:20:08+00:002024-03-28T07:14:15+00:00ytynghttps://b.ytyng.com/blog/author/ytyng/https://b.ytyng.com/blog/ondrej-php5-5.6-not-found/<p>ubuntu で、</p>
<pre>sudo apt update</pre>
<p>した時に</p>
<pre>Failed to fetch http://ppa.launchpad.net/ondrej/php5-5.6/ubuntu/dists/trusty/main/binary-amd64/Packages 404 Not Found</pre>
<p>になったら</p>
<p></p>
<pre>sudo add-apt-repository ppa:ondrej/php</pre>
<pre><span style="text-decoration: line-through;">sudo rm /etc/apt/sources.list.d/ondrej-php5-5_6-trusty.list<br/></span>sudo add-apt-repository ppa:ondrej/php5-5.6 --remove --yes<span style="text-decoration: line-through;"><br/></span></pre>
<pre>sudo apt update</pre>