<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Untagged on notes</title><link>https://unionsep.dev/tags/untagged/</link><description>Recent content in Untagged on notes</description><generator>Hugo -- 0.161.1</generator><language>en</language><lastBuildDate>Fri, 30 Jun 2017 19:04:32 +0900</lastBuildDate><atom:link href="https://unionsep.dev/tags/untagged/index.xml" rel="self" type="application/rss+xml"/><item><title>Zephirはじめてみました</title><link>https://unionsep.dev/posts/2017/06/30/190432/</link><pubDate>Fri, 30 Jun 2017 19:04:32 +0900</pubDate><author>unionsep</author><guid>https://unionsep.dev/posts/2017/06/30/190432/</guid><description>&amp;lt;no value&amp;gt;</description><content type="text/html" mode="escaped"><![CDATA[<p>どうも</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://ogimage.blog.st-hatena.com/10328537792370092437/10328749687236641325/1492068189"
      alt=""
      loading="lazy"
    >

  <a href="http://unionsep.hatenablog.com/entry/2017/04/13/162309" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">再帰的なarray_searchを作った</div>
      <div class="cite-card__description">
        どもども すっかり春な気候になってきて、フレッシュな方々を目にする機会が多くなりました。 フレッシュな感じに羨望の眼差しを向けながら、ここ4年ぐらい、ず〜っとPHPをメインに扱って…
      </div>

    <div class="cite-card__site">Webメモ</div>
  </a>
</aside>

<p>前回の記事で少し話しましたが、Zephirを触ってみました<br>
ZephirはPHPカンファレンス2015ぐらいに見聞きしていて、興味のあるプロダクトでした</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://assets.phalcon.io/zephir/logo.png"
      alt=""
      loading="lazy"
    >

  <a href="https://zephir-lang.com/" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">Zephir Website</div>
      <div class="cite-card__description">
        Zephir is an open source, high-level/domain specific language designed to ease the…
      </div>

    <div class="cite-card__site">Zephir Website</div>
  </a>
</aside>

<aside class="cite-card">
    <img
      class="cite-card__image"
      src="http://phpcon.php.gr.jp/2015/ogp.png"
      alt=""
      loading="lazy"
    >

  <a href="http://phpcon.php.gr.jp/2015/" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">PHPカンファレンス2015</div>
      <div class="cite-card__description">
        PHPカンファレンスは、国内最大のPHPイベントとして2000年より毎年夏に開催されています。今年も10月3日（土）に大田区産業プラザ（PiO)にて開催いたします。
      </div>

    <div class="cite-card__site">PHPカンファレンス2015</div>
  </a>
</aside>

<p>ただ、インストールしてみるものの、なかなか実際にどんなものか確かめるまでに至らなかったのですが、おもむろに見てみたらバージョンが <code>0.9.8</code> になっててそろそろ正式版になるのではと思って焦って触りましたｗ</p>
<hr>
<p><a href="https://docs.zephir-lang.com/en/latest/install.html">Installation</a> に <code>If you’re using Ubuntu</code> って書いてあったので、手持ちのUbuntu16.04にインストールしてみました<br>
ホント、最近 <code>apt</code> でなんでもインストールできますよね<br>
みんなUbuntu好きなのかな</p>
<p>インストール自体は書いてある通りに <code>gcc</code> やら <code>PHP</code> を入れて <code>git clone</code> して installer叩くだけなので、手順は割愛します</p>
<p>で、とりあえず <a href="https://docs.zephir-lang.com/en/latest/tutorial.html">Tutorial</a> にあるものを作ってみました<br>
他でも書かれてありますが、ちょっとコードを書いてPHPとの違いを意識したのは以下ぐらいでした</p>
<ul>
<li>変数の書き換えに <code>let</code> を指定</li>
<li><code>namespace</code> は必須</li>
<li><code>for</code> は <code>foreach</code> になる</li>
<li><code>if</code> で条件式に括弧いらない</li>
<li>型がPHPより厳密</li>
<li>functionの戻り値の型をhintで指定できる</li>
</ul>
<p>まぁ、JavaとかC#とか触ってる人だったら、あんまり意識しなくても自然な流れで書けるのではないでしょうか<br>
聞いていた <code>elseif</code> が使えないというのも、このバージョンでは使えるようになっているみたい</p>
<a href="https://docs.zephir-lang.com/latest/introduction/#if-statement" target="_blank" rel="noopener noreferrer">Introduction - Zephir Documentation</a>

<hr>
<p>でですね、再帰的なarray_searchを作ろうと思ってこんなコードを書いてみたわけですが、結構ハマりました<br>
書いたと言いましたが、多分これじゃない感じなんですけど、それっぽいものが書けたので、とりあえずコードは載せようと思いまして^^;<br>
どうもZephirにはPHPの <code>use</code> に相当する機能（参照渡し）がないようで、どう解消しようかハマっていました<br>
結果どうなのか追えていないのですが、以下あたりで議論されてるみたいです</p>
<aside class="cite-card">
    <img
      class="cite-card__image"
      src="https://opengraph.githubassets.com/ff1f08c6055946bcb1ce7b07f8b010d3a18450af942a637c0aebcf0b8e0c3cec/zephir-lang/zephir/issues/1318"
      alt=""
      loading="lazy"
    >

  <a href="https://github.com/phalcon/zephir/issues/1318" target="_blank" rel="noopener noreferrer">
    <div class="cite-card__title">Is Zephir supported use keyword in closure? · Issue #1318 · zephir-lang/zephir</div>
      <div class="cite-card__description">
        the code here:https://docs.zephir-lang.com/en/latest/closures.html namespace MyLibrary;…
      </div>

    <div class="cite-card__site">GitHub</div>
  </a>
</aside>

<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#66d9ef">namespace</span> <span style="color:#a6e22e">Utils</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Arrays</span>
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#a6e22e">keys</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">arraySearchRecursive</span>(<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">needle</span>, <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">heystack</span>) <span style="color:#f92672">-&gt;</span> <span style="color:#a6e22e">array</span>
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">let</span> <span style="color:#a6e22e">self</span><span style="color:#f92672">::</span><span style="color:#a6e22e">keys</span> <span style="color:#f92672">=</span> [];
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">self</span><span style="color:#f92672">::</span><span style="color:#a6e22e">search</span>(<span style="color:#a6e22e">needle</span>, <span style="color:#a6e22e">heystack</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">self</span><span style="color:#f92672">::</span><span style="color:#a6e22e">keys</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">search</span>(<span style="color:#66d9ef">var</span> <span style="color:#a6e22e">needle</span>, <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">heystack</span>) <span style="color:#f92672">-&gt;</span> <span style="color:#a6e22e">bool</span>
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">key</span>, <span style="color:#a6e22e">val</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> <span style="color:#a6e22e">key</span>, <span style="color:#a6e22e">val</span> <span style="color:#a6e22e">in</span> <span style="color:#a6e22e">heystack</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">is_array</span>(<span style="color:#a6e22e">val</span>) {
</span></span><span style="display:flex;"><span>                <span style="color:#a6e22e">self</span><span style="color:#f92672">::</span><span style="color:#a6e22e">search</span>(<span style="color:#a6e22e">needle</span>, <span style="color:#a6e22e">val</span>);
</span></span><span style="display:flex;"><span>            } <span style="color:#66d9ef">else</span> {
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">needle</span> <span style="color:#f92672">==</span> <span style="color:#a6e22e">val</span> {
</span></span><span style="display:flex;"><span>                    <span style="color:#a6e22e">let</span> <span style="color:#a6e22e">self</span><span style="color:#f92672">::</span><span style="color:#a6e22e">keys</span>[] <span style="color:#f92672">=</span> <span style="color:#a6e22e">key</span>;
</span></span><span style="display:flex;"><span>                }                
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><hr>
<p>どうやらSuperGlobal、_POSTの値とかも取れるみたいで、取る必要ないんちゃうかなとか思いました^^;<br>
言語仕様は、そこまで込み入った感じはなかったのですが、<code>function</code> に <code>-&gt;</code> 指定で返却値の型をhintで書けるぐらいが独特かなぁというぐらいでした</p>
<a href="http://tech.cygames.co.jp/archives/2976/" target="_blank" rel="noopener noreferrer">【PHPカンファレンス2016 フォローアップ】Cygamesを支えるPHPについて講演しました | Cygames Engineers&#39; Blog</a>

<p>こちらの記事にも書かれている通り、配列処理で高速化が見込めるそうです<br>
僕も計測をしてみたかったのですが、わりとハマったので一旦ここで断念しましたが、ソーシャルゲームを開発していた時は、巨大な配列処理を行う事が結構あったので、ガチャロジックとか開催中のイベント配列とかで使えないかなと思いました<br>
あと、単純にextension化することで、簡単に処理を変更できなくするという意味でも有効性を見いだせる気がしています</p>
<p>今はゲーム事業から離れてしまったので、Zephirを使って高速化を試みるより、リファクタリングやDBの正規化で事足りますが、いつかキラーコンテンツとして提案できる日が来たらいいなぁと思っています<br>
いつか使うど！</p>
<p>（UbuntuデフォのFirefoxではてな開くと英語になったのにちょっと感動した！）</p>
]]></content></item></channel></rss>