カテゴリー : プログラミング

SOY

SOY CMSの開発秘話を投稿しました。→SOY CMSの開発秘話
ブログ内検索
 

字句解析器を作る為にデータ構造のスタックを見る

PHPのハッシュテーブルを見るの記事で表題通り、PHPのハッシュテーブルを見て、ハッシュテーブルに関数を登録するところを見ようとしたが、共同体の記述の解釈で断念でした。一旦、ハッシュテーブル周りを見るのは保留にして、バーチャルマシン(VM)を含む機械がコードを解釈して実行する箇所を見ることにする。上記のコードを解釈して実行する過程はコンパイラもしくはインタプリタによって、人が書いたコードを機械が解釈できる形式に翻訳して実行する。コンパイラ - Wikipediaインタプリタ ...

 

PHPのハッシュテーブルを見る

ハッシュテーブルのチェイン法を見るまでの記事でデータ構造のハッシュテーブルを見た。ハッシュテーブルはPHPの変数や関数の登録の際にも利用されているので、PHPのハッシュテーブルを見る。ソースコードは今日現在のGitHub - php/php-src: The PHP Interpreterのソースコードとする。早速、HashTableで検索をしたら、php-src/Zend/zend_types.htypedef struct _zend_array HashTable;...

 

ハッシュテーブルのチェイン法を見る

データ構造のハッシュテーブルを見るの記事でデータ構想のハッシュテーブルに触れ、データ構造の単方向連結リストを見るの記事でデータ構造の連結リストを見た。これらを踏まえた上で、PHPで採用されているハッシュテーブルのチェイン法を見る事にする。技術評論社から発売されているPHPはどのように動くのか~PHPコアから読み解く仕組みと定石よるとPHPのハッシュテーブルのチェイン法では双方向連結リストを用いているが、前回触れた単方向連結リストでもニュアンスは伝わるはず。というわけで、今回もPH...

 

データ構造の単方向連結リストを見る

前回のデータ構造のハッシュテーブルを見るの記事でハッシュテーブルに触れたが、ハッシュテーブルの衝突の問題が残っている。PHPではハッシュテーブルの回避の手段としてチェイン法を採用しているが、チェイン法を見るためにはデータ構造の連結リストを把握する必要があるので、今回は連結リストを見ることにする。といっても、ここではPHPでシンプルな単方向連結リストのみ触れる事にする。連結リスト - Wikipedia今回も細かい説明は後回しにして、単方向連結リストに必要な関数を挙げる。※...

 

データ構造のハッシュテーブルを見る

PHPの関数の登録2の記事でPHPの実行中に関数が登録される過程を見た。PHPの深いところ(C言語レベル)で見ると、関数の登録にはデータ構造のハッシュテーブルというものが重要になってくる。ハッシュテーブルといえば、PHPのzvalと変数の作成を見るの記事で変数の登録時のシンボルテーブルでも登場した。PHPの深いところに向かう前にハッシュテーブルについて触れておく事にする。例えば、array(16) {[0] =string(6) "オヒシバ"[1]...

 

PHPの関数の登録2

PHPの関数の登録の記事で?php$funcs = get_defined_functions();var_dump($funcs);$a = myFunc();function myFunc(){return null;}このようにmyFunc関数の記述の前に、get_defined_functions関数を実行したらどうなるのか?を試してみたら、エラーなく実行された内容を記載した。この試みの後、2つほど疑問が生じた。・includeの...

 

PHPの関数の登録

PHPのオブジェクトの継承の負荷を見るの記事でオブジェクトの継承においてメモリの使用量で予想とは異なる結果になった。予想を外した要因は関数とメソッドを含むクラスの読み込み周りの知識不足であるので、関数やメソッドの登録周りを知りたくなった。例えば、下記のようなコードがあったとする。?phpfunction myFunc(){return null;}$a = myFunc();最後の行でmyFunc関数を実行する際、予めメモリにmyFuncの番地を登録...

 

PHPのオブジェクトの継承の負荷を見る

PHPでクラスのインスタンスを作成する際、他のクラスを親に持つクラスであった場合、メモリの使用量はどうなるのか?を見ることにする。実行せずともなんとなく結果は予想できるけれども、PHPのVLDでfor文を見る2のようなことがあるので、一応確認しておく。obj.php?phpclass Animal {function bark(){return "ばう";}}class Cat {}echo memory_get_usage...

 

PHPで関数内の変数のメモリ領域はいつ解放されるか?

前回のPHPのガベージコレクションを見るの記事で、PHPのガベージコレクションの基礎になる参照カウント法を見た。?php$a = new stdClass();$c = $b = $a;xdebug_debug_zval('c');というコードだと、各変数はこの図のような形になる。このコードを見て、コンストラクトしたオブジェクトをすぐに他の変数に入れる事なんてあるのか?という疑問が速攻で湧いた。色々と考えてみたら関数が当てはまるということで下記のような...

 

PHPのガベージコレクションを見る

PHPのzvalと変数の作成を見るの記事で、PHPの変数周りの内容を見た。前回の内容を踏まえて、PHPのガベージコレクション(以後、GCと略す)を学ぶための準備をしていく。PHPのガベージコレクションを学ぶにXdebugを入れるの記事でPHPの変数の詳細を確認できるxdebug_debug_zval関数を使用できるようにして、/path/to/dir/xdebug.php?php$a = new stdClass();xdebug_debug_zval('a');...

 

PHPのzvalと変数の作成を見る

PHPのガベージコレクションを理解する為のメモPHPは動的に変数を扱う事ができる言語で、この動的に変数を操作するためにzvalというものがある。動的に変数を扱う例として、/path/to/dir/var.php?php//変数aに数字の1を挿入する$a = 1;var_dump($a);//変数aに文字列のhogeを挿入する$a = "hoge";var_dump($a);//変数aに配列の値を挿入する$a = array(1, 2, ...

 

PHPのガベージコレクションを学ぶにXdebugを入れる

VLDでPHPのオペコードを確認するの記事でも記載した通り、SOY Shopの改修でメモリを意識する必要が生じたので、PHPの仕様を見始めた。現時点での一番の疑問は関数内で使用した変数はどのタイミングでメモリを解放するのか?もしくはPHPの関数内の変数の解放は手動で行わなければならないのか?PHPのCGI版やモジュール版はブラウザからリクエストを送信して、サーバでHTMLを組み立ててレスポンスを返した時点でプロセスを終了し、処理に関するメモリを解放するという仕様上、メモリにあまり...

 

PHPのOPCacheで生成されるキャッシュを見る

【SEO対策】PHPのOPCacheの更新チェックの頻度を下げるでサイトの表示速度の向上の為に、OPCacheの更新チェックの頻度を2秒から1日に変更してみた。そもそもの話でOPCacheはどんな感じでキャッシュしているのだろう?という事が気になった。OPCacheの説明文を改めて読むと、コンパイル済みのバイトコードを共有メモリに保持と記載されている。メモリ上だとキャッシュを確認することは難しいなと思うが、デバック用にファイルに変更する事ができるらしい。というわけで早速変...

 

PHPでforeach文の抜け方を見る

PHPで数字の配列の中に偶数があるか?という判定用の関数を作成したいとする。配列の中に偶数が一つでもあればtrue(真)を返すわけだから、?phpfunction isEven($arr){foreach($arr as $int){if($int % 2 === 0) return true;}return false;}このように偶数があった場合にreturn true;で終わ...

 

PHPで変数に割り当てた無名関数を解除できるか?

PHPのVLDで無名関数を見るの記事の続きで、?php$isEven = function($n){return ($n % 2 === 0);};if($isEven(2)){echo "even";}else{echo "odd";}$isEven変数に割り当てた無名関数の処理を解除できるか?が気になった。今回の内容に触れる前に割当の解除であるunsetについて触れておく。PHP: unset...

 

PHPのVLDで無名関数を見る

PHPのVLDで関数を見るの記事で、PHPの関数の処理をVLDで見てみた。C言語やGoのようなmain関数から始まる言語とは異なり、PHPはいきなり書き始められる言語では、他言語のmain関数の箇所でfunction nameがnullとして処理が開始していた。VLDで関数のオペコードを見た時、無名関数だとどうなるのだろう?と気になったので、今回は無名関数で試してみる。無名関数に関しては、オライリーから出版されているアンダースタンディングコンピューティション 単純...

 

PHPのVLDで関数を見る

PHPで関数がどのように実行されているか気になるので、下記のコードをVLDで確認してみることにした。even.php?phpfunction isEven($n){return ($n % 2 === 0);}if(isEven(2)){echo "even";}else{echo "odd";}偶数であればtrue(真)を返す簡単な関数だ。このコードのオペコードを確認してみると、$ ph...

 

PHPのVLDでforとforeachを比較する

$arr = range(1, 100000);のような配列があった場合の繰り返しで、$cnt = count($arr);for($i = 0; $i $cnt; ++$i){//処理を書く}foreach($arr as $i = $v){//}上記のようなfor文かforeach文のどちらを使えば良いか迷う。そんな時はVLDでオペコードを確認してみたり、実行速度を確認してみると迷いがなくなる。先に...

 

PHPのVLDでfor文を見る2

PHPのVLDでfor文を見るの記事の続きPHPのfor文の書き方で、//$arrには配列型のデータが格納されているfor($i = 0; $i count($arr); ++$i){//処理を書く}上記のコードのようなforの二番目の式でcount(配列)を書くのはよろしくないと記載されていることが多い。理由はfor文による繰り返しの際に都度、count関数を実行する事になり、関数の実行は処理が重いからすべきではないという。実際にどれ程...

 

PHPのVLDでfor文を見る

PHPのfor文の高速化の話題で、教科書等によく記載されているfor($i = 0; $i 10 $i++){//処理を書く}ではなく、for($i = 0; $i 10 ++$i){//処理を書く}にした方が良いということを時々見かける。実際のところはどうなのか?を処理速度の測定とVLDで確認してみる。VLDでPHPのオペコードを確認するちなみに$i++と++$iの違いは、if文等で、式を実行してから$iに1を加える(インクリメント)か、...

 

VLDでPHPのオペコードを確認する

SOY Shopの開発でPHPの深い箇所を意識してコードを書く必要が出てきた。PHPをより深く理解する為には何から手を付けていけば良いのだろう?ということで、PHP: Hypertext Preprocessor技術評論社から発売されているPHPはどのように動くのか~PHPコアから読み解く仕組みと定石を読むことから始めてみた。この本はPHPの本なのにC言語が頻繁にあり、メモリの確保やインタプリタの説明が少ない状態で話が始まるので、もしこの本を読むのであれば、事前に...

 

WSL2でSOY CMSの開発環境を作ってみた

CORE i5 iiyamaのパソコンを購入した。WSL2(Windows Subsystem for Linux:以下wslと表記)が入っており、WindowsでLinuxが使える点が購入に決めてだった。Windows Subsystem for Linux - Wikipediawslを使う利点は、プログラミングの実行環境を準備するのがWindowsの標準を使うよりはるかに簡単である。私の開発環境は、wslでLinuxのUbuntuを使えるようにした。その手順は、下記...

 

郵便番号を入力したら半径3km内のすべての町名を取得する

郵便番号を入力したら半径3km内のすべての町名を取得したいという要望がありました。この要望を聞いた時に頭に浮かんだのがGoogleのGeocoding APIだったので、このAPIで指定の場所の周辺の町名を取得してみる。Overview  |  Geocoding API  |  Google DevelopersGeocoding APIはGoogle Maps Platformで支払い方法の設定をしていないと使用できない。これから記載する内容はGoogle Maps Pl...

 

SOY CMSを介さずにSOY2Mailでメールを送信してみる

PHPの実行環境でフルスクラッチでsendmailを実行する必要が出てきた。mail関数はメール送信前にヘッダ周りの設定が何かと面倒なので、SOY CMSの開発で様々なサーバの運営に関わった知見を活用するため、SOY CMS内で動いているSOY2フレームワークのSOY2Mailのみを使用することにしてみた。SOY CMSの開発秘話root├── index.php└── lib└── soy2_build.phpSOY2Mailを試す為のファイル構成は...

 

php-webdriverでelement click interceptedのエラーに対して

Selenium + Jenkins + phpwebdriver + Chromiumのヘッドレスでテストの自動化を行っている。Jenkins + ヘッドレスChromeでテスト自動化の省力化先日、SOY CMSとSOY Shopに常に画面左下に設置されるメモウィジェットを設置して、テストにかけてみたら、PHP Fatal error: Uncaught Facebook\WebDriver\Exception\UnrecognizedExceptio...

 

SOY ShopのオーダーカスタムフィールドでjQueryのDatepickerを使ってみる

配送と店舗受け取り型の形態のネットショップを運営予定の方から、カートのお支払い・配送方法の選択画面で、配送(上のキャプチャでは宅配便)と店舗受け取りを並べつつ、どちらの注文も同時に対応できるようにしたいという要望がありました。どちらか一方であれば、標準配送モジュールの複製と少々のカスタマイズで事足りるが、一つの注文で両方同時に選択したいという要望の為、プラグイン(モジュール)の複製では要件を満たさない。SOY Shopの配送モジュールのカスタマイズ例そこで、配送モ...

 

SheetJSを試してみた

オライリーから出版されたReal World HTTP 歴史とコードに学ぶインターネットとウェブ接続の第2版が出たので、早速購入して読んでみた。この本はGoでHTTPを学べる良書で、サイト運営での表示の高速化をする上で知っておきたい内容が充実しているので、SEOをする上で絶対に読んでおいた方が良い。第2版になって、JavaScriptのXMLHttpRequestやCDNについての章が増え、JavaScriptの章を読んでいたら、XMLHttpRequest - Web API ...

 

gRPC for PHPのインストール

Google AdsのMCCアカウントでキーワードプランナーを無料で使えるようにするまでの記事の続きで、Google Ads APIを使用するための手順を整理する。サービスの概要 | Google Ads API Beta | Google Developersに目を通すと、事前にgRPCを使えるようにしておいてほしいとのことで、gRPC for PHPのインストールを行う。※gRPCの仕組みは難しいので今回の記事では端折るgRPC – A high-performa...

 

【SEO対策】他のCMS向けの総当り攻撃を避ける

今回の対策はSEOに直結するかわからないけれども、サイトを運営していてページの表示速度を下げる要因なので触れておく。とあるサイトを公開した後にアクセスログを確認したら衝撃的なログがあった。そのログというのが、https://example.com/wp-loginhttps://example.com/wp-adminへのアクセスだった。このサイトは世界ナンバーワンのシェアを誇る某CMSを使用していないので関係ないといえば関係ないけれども、アクセスログに上記のパスで埋...

 

【SEO対策】Google Mapsの遅延出力

仕事内容 - saitodev.co当サイトの仕事紹介のページにiframeでGoogle Mapsを表示している個所がありますが、このGoogle Mapsの出力によって、PageSpeed Insightsの結果が80点台になっていました。今回の記事ではGoogle Mapsを遅延出力してみたらどうなるのか?を試した結果を紹介します。遅延出力する前に記載されていたコードは、iframe src="https://www.google.com...

 

【SEO対策】最終産物のHTMLのキャッシュで高速化

SEO対策、データベースチューニングでサイトの表示速度を上げる為にはMySQL等のサーバ型のデータベースを採用して、サーバのメモリが許す限りデータベースにメモリ等の使用を振り分けるという内容を紹介しました。と紹介したものの、当サイトではデータベースはファイル型のSQLiteを使用しています。理由はSOY CMSを利用するであろうユーザのほとんどがMySQLがチューニング出来ないサーバを利用するはずで、SQLiteで高速化が出来なければ意味がないだろうと判断して、SQLiteを使用し続...

 

【SEO対策】実行環境のバージョンを上げて高速化

SEO対策、キャッシュの利用でデータ転送量を削減までの記事では、ブラウザでサイトを見る時のブラウザからリクエストを送り、レスポンスが返ってくる時のデータの最適化を見てきたけれども、今回から新たな視点を加えてのSEO対策を見ていくことにする。Google製のWebサービスであるPageSpeed Insightsでスコアが100になるためには、ラボデータで各項目がオールグリーンになる必要がある。ここで最後まで苦戦したのが、インタラクティブになるまでの時間と初回入...

 

SOY ShopのマイページのフォームでParsely.jsを使用する際に注意すること

本題に入る前に先にParsely.jsについて触れておくと、Parsely.jsお手軽に見栄えの良い入力内容のチェックを設置出来るJavaScriptのライブラリで、form data-parsley-validate上記のようにdata-parsely-validateと、必須にしたい項目にrequiredを付けるだけで設置が完了します。このライブラリをSOY Shopのマイページ等で使用する場合はひと工夫が必要になります。話を始める前にマイページ内のフ...

 

pickadate.jsでHTML5のrequired属性を使いたい

pickadate.jsというスタイリッシュでレスポンシブなカレンダー形式の選択フォームを設置できるライブラリがある。packadate.jsこのライブラリを利用しつつ、HTML5のrequired属性を使用しなければならない状況に遭遇し設置に苦戦したので、今回はその時に対応した方法をメモとして残しておく。フォームデータの検証 - ウェブ開発を学ぶ | MDNpackadate.jsの仕様をよく読むと、/****************************...

 

Ubuntu19.10でSelenium + php-webdriverが動作しなかった時の対処

Ubuntu19.10でテストの自動化の環境を作ろうと思ったけれども、環境を構築して実際に実行したけれども、/*****************************************************/拡張機能の読み込みエラー次の場所から拡張機能を読み込むことができませんでした:. マニフェスト ファイルが見つからないか読み取りません/*****************************************************/というエラーで実行...

 

Ubuntu19.10でSnapのBracketsのライブプレビューが動作しなかった時の対処

表題の通り、UbuntuでSnap版のBracketsを入れたけれども、作成中のHTMLをライブプレビューで確認したら、Brackets - A modern, open source code editor that understands web design.Snappy - WikipediaChromiumが立ち上がった後、/****************************************************/ファイル...

 

PHPのexec関数でセッションの値の引き継ぎに苦戦した時のメモ

Amazon Linuxでセッションの取扱で苦戦したのでメモとして残す。※今回の内容はAmazon Linuxとは関係ないかもしれないけれども、LAMPの環境のPHPの初期設定の注意点になるかもしれないので、OS名を晒しておく。※LAMP = Linux + Apache + MySQL + PHP(or Perl or Python)の環境の略LAMP - Wikipedia環境OS:Amazon Linux 2 AMIAmazon Linux 2(セキュアなLin...

 

PHPで形態素解析エンジンのMaCabを使用する為の手順のメモ

PHPで形態素解析エンジンであるMeCabを使えるようにする為の手順をメモしておく。MeCab: Yet Another Part-of-Speech and Morphological AnalyzerMeCab - Wikipedia形態素解析 - Wikipedia環境OS:Ubuntu19.10Apache 2.4.41PHP 7.3.11-1+ubuntu19.10.1+deb.sury.org+6Server API FPM/FastCGI上記...

 

Jenkins + ヘッドレスChromeでテスト自動化の省力化

SOY CMS / Shopの開発で、Jenkinsを利用してテストの自動化を行っている。※詳しい構成は下記のリンク先の記事に記載がある。さくらVPSにJenkinsを入れて、Selenium + php-webdriverを動かせるようにする機能を追加する度に負荷の高いテストコードを追加し続け、気がついたら、一回のビルドの所要時間が5時間を超えていた。1日3回ぐらいJenkinsがテストを行ってくれるので、1日15時間とテスト要因で人を雇ったらブ...

 

PHPで並行処理

PHPで並行処理をしたい個所が出てきた。PHP: Hypertext Preprocessorデータベースに挿入するデータがタイムスタンプとそれに紐づく値で、データを挿入する順番を気にしなくても良いログのようなものだ。タイムスタンプは必ず0時0分0秒のものにして、重複する場合は挿入しないという仕様なので、片っ端からデータを突っ込もうとしてもデータベースに過剰にデータが挿入されるということはない。Go言語であればゴルーチンという素敵な仕様があるけれども、Go言語...

 

さくらのVPSにUbuntu18.04を入れてSOY CMSを動かした時のメモ

以前、さくらのVPSでSOY CMSを動かした時のメモでさくらのVPSにUbuntuを入れて、SOY CMSの環境を構築した記事を投稿したけれど、古くなったので改めてまとめることにする。最終的な環境さくらのVPS 4GVPS(仮想専用サーバー)|さくらインターネット - 無料お試し実施中Ubuntu 18.04(16.04を入れた直後に速攻でアップグレード)Apache2.4.38PHP 7.3.3.1 FastCGIMySQL 5.7.25今回の話を...

 

Go言語でKVSのRedisを使ってみる

Go言語で構築したサーバで複数台の構成にして、ロードバランサで負荷分散しなければならない状況になりそうだ。複数台にした時に問題になるのが、複数サーバ間でセッションのような値を共有したいという問題が発生する。どうにかできないかと検討してみたところ、https://redis.io/KVS(Key-Valueストア)のRedisであればできそうだということを思い出し、NoSQL - WikipediaGo言語でRedisの使い方を調べること...

 

Go言語を使ってJSONから複数のデータを取得してみる

Go言語でJSON前回JSONから、秘密鍵などが入ったデータファイルをmain.goで読み込んだ。今回は、複数のデータの場合、どう呼び出すか試してみる。まず、sample.jsonに下記のコードを入力する。[{"id" : 1,"name" : "usako","reading" : "usano"},{"id" : 2,"name" : "kumata","reading" : "k...

 

Go言語でJSON

JSONとは、JavaScript Object Notationの略で、テキストベースのデータフォーマットだ。***.jsonという形でデータファイルになる。秘密鍵などのデータを保存しておきたい時の設定ファイルとして使うことが多い。今回は、~/workspace/json/sample.jsonを作成し、下記の情報を入力する。{"id":1,"name":"usako","reading":"usano"}lsonファイルは、{ “項目”:値.....

 

Go言語でGoogle Analyticsのデータをチャットワークに送ってみる

「植物のミカタ」のGoogle Analytics(以後GAと略す)から取得したpageviewsをチャットワークに送ってみる。今回は、前日のpageviewsと日付けを取得してみる。※pageviewsとは、閲覧されたページの合計数として定義される指標実際のコードを書く前に今回のコードで必要なライブラリを取得しておく。$ go get golang.org/x/oauth2$ go get google.golang.org/api/analytics/v3pa...

 

妻がプログラミングをはじめてGo言語とQtでアプリを公開するまで

Go言語とQtで給与明細の計算機を作ってみたで記載した通り、今年の四月からプログラミングの勉強をはじめ、ちょうど半年が経過したところで、Go言語とQtでGUIアプリケーションの税金計算のアプリを公開した。実際に書いたコードはGitHubで管理して、下記のURLから開発したコードを確認することができる。https://github.com/ryoko-saito/payslip_on_restaurant_bizhttps://github.com/ryoko-saito/ta...

 

Go言語でsyncパッケージを使ってみる

O'Reilly Japan - Go言語による並行処理Go言語で並行処理についての本が出版されたので購入して読んでいる。この本よりも前にLambda Note GoならわかるシステムプログラミングGoでシステムプログラミングに触れる本でも並行処理について記載されていて、syncパッケージのWaitGroupやMutexが大事だという記載があり、説明文からもこれらが大事だということはわかるんだけれども、普段並行処理を書かない私にとってしっくりこなかった...

 

Go言語で関数の練習問題③

r := generate()とする数字をランダムに出力するgenerate関数を作成する。package mainimport ("fmt")func main() {r:=generate()fmt.Println(r)}func generate() int {rand.Seed(time.Now().UnixNano())r := rand.Intn(10)return r}今回は、お題にr := gen...

 

Go言語で関数の練習問題②

今回は、greet(name) にname := "うさこさん"と入力すれば、こんにちはうさこさんと出力する関数を作成してみる。package mainimport "fmt"func main() {name:="うさこさん”greet(name)}func greet(a string) {fmt.Println("こんにちはうさこさん”)}ここで作成する関数は、greet関数で、今回は、name := "うさこさん"と...

 

Go言語で関数の練習問題①

関数を自分で作成する際、引数や返り値をどう設定すればよいのかわからなかったので、例題でどう書けばよいのか考えることにした。Go言語で関数Go言語でf(x) = x 2という関数を作ってみる。そこにx=3を代入して結果を表示してみる。package mainimport "fmt"func main() {x := 3y := f(x)fmt.Println(y)}// f(x) = x + 2という式を意味する関数func f(...


Powered by SOY CMS  ↑トップへ