<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xml:lang="ja"><channel><title>YoheiM.NET - 世の中をさらに便利に、面白く</title><link>http://www.yoheim.net/</link><description>YoheiM.NET - 世の中をさらに便利に、面白く</description><dc:creator>yoheiM</dc:creator><item><title><h2 data-category="CSS">CSSだけで簡単に、すりガラスの表現を実現する（backdrop-filterの利用）
</title><link>http://www.yoheim.net/blog.php?q=20250329</link><description><![CDATA[<h2 data-category="CSS">CSSだけで簡単に、すりガラスの表現を実現する（backdrop-filterの利用）</h2>
<div class="article">
こんにちは、<a href='http://twitter.com/yoheiMune' target='_blank'>@yoheiMune</a>です。<br>
できるとちょっとカッコイイ！、擦りガラスの表現をCSSで行う方法を紹介したいと思います。<br>
<img src="image/633.jpg" alt=""/>
<br>
<br>
<br>

<h4 class="jsnotoc">目次</h4><div data-type="pageList"></div><br><br><br>

<h4>まずはサマリ</h4>
お急ぎの方向けに結論と、コピペ可能なコードをまずは掲載します。<br>
<code>backdrop-filter: blur(20px);</code>を用いることで、背景部分をぼかして表示することができます。<br>
その機能を用いることですりガラスのような表現を実現できます。<br>
<br>

<style>
    .xdkfir {
        width: 100%; 
        max-width: 600px; 
        margin: 10px auto; 
        position: relative;
    }
    .xdkfir img {
        width: 100%;
        height: auto;
    }
    .xdkfir div {
        position: absolute; 
        top: 80%; 
        left: 0;
        width: 100%;
        padding: 20px 40px; 
        transform: translateY(-50%); 
        backdrop-filter: blur(20px); 
        background-color: rgba(255, 255, 255, 0.5); 
        color: white;
        font-size: 1.6em;
        text-align: center;
        box-sizing: border-box;
        line-height: 1.6;
        border: 1px solid rgba(255, 255, 255, 0.4);
    }
</style>
<div class="xdkfir">
    <img src="http://www.yoheim.net/image/s431.jpg" alt="">
    <div>CSSだけで簡単に<br>すりガラスの表現！</div>
</div>
<br>
<br>
以下に、上記のコード（全量）を記載します。<br>
<br>
<pre class="prettyprint">
&lt;style&gt;
    .xdkfir {
        width: 100%; 
        max-width: 600px; 
        margin: 10px auto; 
        position: relative;
    }
    .xdkfir img {
        width: 100%;
        height: auto;
    }
    .xdkfir div {
        position: absolute; 
        top: 80%; 
        left: 0;
        width: 100%;
        padding: 20px 40px; 
        transform: translateY(-50%); 
        backdrop-filter: blur(20px);     # ←← ★★ポイントはここです！★★
        background-color: rgba(255, 255, 255, 0.5); 
        color: white;
        font-size: 1.6em;
        text-align: center;
        box-sizing: border-box;
        line-height: 1.6;
        border: 1px solid rgba(255, 255, 255, 0.4);
    }
&lt;/style&gt;
&lt;div class="xdkfir"&gt;
    &lt;img src="http://www.yoheim.net/image/s431.jpg" alt=""&gt;
    &lt;div&gt;CSSだけで簡単に&lt;br&gt;すりガラスの表現！&lt;/div&gt;
&lt;/div&gt;
</pre>
<br>
<br>
<br>

<h4>backdrop-filterを用いたぼかし方法</h4>
<code>backdrop-filter</code>に<code>blur(20px)</code>などを指定することで、ボカシ表現を行うことができます。<br>
<style>
    .xdkfir2 {
        width: 100%; 
        max-width: 600px; 
        margin: 10px auto; 
        position: relative;
    }
    .xdkfir2 img {
        width: 100%;
        height: auto;
    }
    .xdkfir2 div {
        position: absolute; 
        top: 80%; 
        left: 0;
        width: 100%;
        padding: 20px 40px; 
        transform: translateY(-50%); 
        backdrop-filter: blur(20px); 
        font-size: 1.6em;
        text-align: center;
        box-sizing: border-box;
        line-height: 1.6;
        color: white;
    }
</style>
<div class="xdkfir2">
    <img src="http://www.yoheim.net/image/s431.jpg" alt="">
    <div>CSSだけで簡単に<br>すりガラスの表現！</div>
</div>
<br>
コードとしてのキモは以下の1行だけ。<code>backdrop-filter</code>というCSSを使うことで、後にある要素（画像やHTML要素）をぼかすことができるのです。<br>
<pre class="prettyprint" data-filename="css">
backdrop-filter: blur(20px);
</pre>
あとはこの要素に、色味、上下のセパレート線、配置位置などを指定することで、いい感じのデザインに仕上げることができます。<br>
<br><br><br>

<h4>使いどころ</h4>
色々とサイトのデザインを覗いていると、意外と多くの場面で使われていることに気づきます。<br>
<br>
<ul>
    <li>ヘッダーの背景にぼかし使って、ヘッダーが上部固定だとしても邪魔な存在感を出しすぎないようにする。</li>
    <li>レビューサイトなど、コメントが長いところで切る場合に、ぼかし効果を使う。</li>
</ul>
いろいろなサイトを見ると、使いどころのセンスが磨かれると思います。<br>
<br><br><br>

<h4>ブラウザサポート</h4>
メインどころの、Chrome、Edge、Safari、Firefox、各種スマホブラウザでは、すべてサポートされいます。安心して利用できます。<br>
以下のサイトは古くからありますが、ブラウザサポートを調べるには非常に便利です。<br>
<img src="http://www.yoheim.net/image/s432.png" alt=""/><br>
<a href="https://caniuse.com/css-backdrop-filter" target="_blank">引用：Can I Use</a><br>
<br><br><br>

<h4>最後に</h4>
こういうコードは生成AIで簡単に作れますが、自分の引き出しとして持っていても損はないと思います。<br>
パッと使えて、それも使いどころが上手いと、それだけで重宝されそうです。<br>
<br>
最後になりますが本ブログでは、フロントエンド、サーバー、PHP、Python、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「<span class="bold">プログラミングで困ったその時の、解決の糸口に！</span>」そんな目標でブログを書き続けています。ぜひ、<a href="http://feeds.feedburner.com/Yoheimnet.xml" target="_blank">本ブログのRSS</a>や<a href="http://twitter.com/yoheiMune" target="_blank">Twitter</a>をフォローして貰えたら嬉しいです ^ ^<br>
<br>
最後までご覧頂きましてありがとうございました！<br>
<br>
<br>
<br>
</div>
]]></description><dc:creator>yoheiM</dc:creator><pubDate>Sat, 29 Mar 2025 12:09:39 12MarJST</pubDate></item><item><title><h2 data-category="マークアップ">フォームの遷移先を、ボタンごとに変更する（formaction属性を利用）
</title><link>http://www.yoheim.net/blog.php?q=20200701</link><description><![CDATA[<h2 data-category="マークアップ">フォームの遷移先を、ボタンごとに変更する（formaction属性を利用）</h2>
<div class="article">
こんにちは、<a href='http://twitter.com/yoheiMune' target='_blank'>@yoheiMune</a>です。<br>
<code>&lt;form&gt;</code>の遷移先は<code>action</code>要素で指定しますが、実はボタンでも指定できます。今日はその方法をブログに書きたいと思います。<br>
<img src="image/632.png" alt=""/>
<br>
<br>
<br>

<h4 class="jsnotoc">目次</h4><div data-type="pageList"></div><br><br><br>

<h4>まとめ</h4>
<code>&lt;button&gt;</code>や<code>&lt;input type="submit"&gt;</code>に<code>formaction</code>属性を指定することで、ボタンごとに別々の遷移先を指定できます。<br>
<pre class="prettyprint">
&lt;form action="/save"&gt;

    &lt;!-- formタグのaction（/save）を呼び出します. --&gt;
    &lt;button&gt;保存する&lt;/button&gt;

    &lt;!-- formactionで指定した遷移先（/temporary-save）を呼び出します. --&gt;
    &lt;button formaction="/temporary-save"&gt;一時保存する&lt;/button&gt;

    &lt;!-- formactionで指定した遷移先（/update）を呼び出します. --&gt;
    &lt;input type="submit" formaction="/update" value="更新する"&gt;

&lt;/form&gt;
</pre>
<br>
<br>
<br>


<h4>何に便利なのか</h4>
何らかのフォーム（登録フォームやお問い合わせフォームなど）で、同じフォームを使いつつ処理を分けたいときに便利です。例えば最近の仕事では、発注書や見積書を作る際に、同じフォームを使い「新規作成」と「下書き保存」で処理を切り替えました。JavaScriptを使わずに、サブミット先を切り替えられる点が便利です。<br>
<br>
<br>
<br>

<h4>動作の仕組み</h4>
<code>&lt;button&gt;</code>や<code>&lt;input&gt;</code>に<code>formaction</code>属性に遷移先を指定することで、ボタン押下時の遷移先を個別に指定できます。<code>formaction</code>の値は、<code>&lt;form&gt;</code>の<code>action</code>属性の値よりも優先されます。<br>
<pre class="prettyprint">
&lt;!-- buttonタグに指定した例。formactionで指定した遷移先（/temporary-save）を呼び出します. --&gt;
&lt;button formaction="/temporary-save"&gt;一時保存する&lt;/button&gt;

&lt;!-- inputタグに指定した例。formactionで指定した遷移先（/update）を呼び出します. --&gt;
&lt;input type="submit" formaction="/update" value="更新する"&gt;    
</pre>
<br>
<br>
<br>

<h4>ブラウザサポート状況</h4>
<code>formaction</code>はHTML5から追加された属性で、<span class="bold">IE11、Edge、Chrome、Safari、Firefoxと主要ブラウザでは全て動作</span>します。便利ですね。<br>
<br>
<a href="https://caniuse.com/#search=formaction" target="_blank">formationのブラウザサポート状況 | Can I use</a><br>
<br>
<br>
<br>

<h4>最後に</h4>
僕は最近までこの実装を知らず、とある仕事でコードレビューをしている時に初めて見つけました。コードレビューはいくつかの案件で行っていますが、人それぞれコーディングが違うので、見ていて楽しいですし、学ぶことがたくさんあり、その点でも楽しいなと感じています。<br>
<br>
最後になりますが本ブログでは、フロントエンド、サーバー、PHP、Python、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「<span class="bold">プログラミングで困ったその時の、解決の糸口に！</span>」そんな目標でブログを書き続けています。ぜひ、<a href="http://feeds.feedburner.com/Yoheimnet.xml" target="_blank">本ブログのRSS</a>や<a href="http://twitter.com/yoheiMune" target="_blank">Twitter</a>をフォローして貰えたら嬉しいです ^ ^<br>
<br>
最後までご覧頂きましてありがとうございました！<br>
<br>
<br>
<br>
</div>
]]></description><dc:creator>yoheiM</dc:creator><pubDate>Mon, 27 Jul 2020 14:27:15 14JulJST</pubDate></item><item><title>[CSS] 上下左右中央に表示する５つの方法（IE, Edge, Chrome, Safari, Firefoxに対応）
</title><link>http://www.yoheim.net/blog.php?q=20200601</link><description><![CDATA[<div class="article">
こんにちは、<a href='http://twitter.com/yoheiMune' target='_blank'>@yoheiMune</a>です。<br>
マークアップする際に「上下左右中央に表示したい」という要件はよく出てきます。今日はその実装方法をブログに書きたいと思います。５つあるので、色々な状況に応じたものを選んで使えると思います。<br>
<img src="image/631.png" alt=""/>
<br>
<br>
<br>

<h4 class="jsnotoc">目次</h4><div data-type="pageList"></div><br><br><br>

<h4>なぜこの記事を書くのか</h4>
プログラミングスクールの講師をしていて、上下左右中央に表示する方法をアドバイスさせて頂く機会もあり、ブログにまとめておきたいと思ったのが執筆のきっかけです。複数の実現方法を提示することで様々な条件に応じることができますし、また各種ブラウザ（IE、Edge、Chrome、Safari、Firefox）の対応状況も確認済みなので、品質の良いコーディングができると思います。<br>
<br>
これからWebページ制作をされる方に、少しでも役立てたらいいなと思います。<br>
<br>
<br>
<br>

<h4>方法1：absolute + top,left=50% + ネガティブマージン</h4>
<code>position: absolute</code>で絶対配置する際に、<code>top</code>と<code>left</code>を<code>50%</code>として真ん中を指定して、要素の横幅と縦幅それぞれ半分をネガティブマージンとして設定する（=マイナス値を<code>margin</code>に指定する）ことで、上下左右中央に表示することができます。<br>
<pre class="prettyprint">
&lt;div class="container"&gt;
    &lt;div class="item"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
    .container {
        position: relative;
        width: 300px;
        height: 300px;
    }
    .item {
        /* 要素の大きさを指定する */
        width: 150px;
        height: 150px;

        /* top と left に 50% を指定して、要素の左上を中央にする. */
        position: absolute;
        top: 50%;
        left: 50%;

        /* 要素の大きさの半分をネガティブマージンとすることで、要素を画面中央にする. */
        margin-top: -75px;
        margin-left: -75px;
    }
&lt;/style&gt;
</pre>

<p class="bold">(表示例)</p>
<div class="sk1oda-container">
    <div class="sk1oda-item"></div>
</div>
<style>
    .sk1oda-container {
        position: relative;
        width: 100%;
        max-width: 300px;
        height: 300px;
        margin: 20px 0;
        border: 1px solid #ccc;
    }
    .sk1oda-item {
        position: absolute;
        top: 50%;
        left: 50%;
        width: 150px;
        height: 150px;
        margin-top: -75px;
        margin-left: -75px;
        background: rgba(255, 255, 100, .5);
    }
</style>
<p class="bold">(サポートブラウザ)</p>
<table class="table01 textCenter mt0">
    <tr>
        <th style="width:20%;">IE11</th>
        <th style="width:20%;">Edge</th>
        <th style="width:20%;">Chrome</th>
        <th style="width:20%;">Safari</th>
        <th style="width:20%;">Firefox</th>
    </tr>
    <tr>
        <td>○</td>
        <td>○</td>
        <td>○</td>
        <td>○</td>
        <td>○</td>
    </tr>
</table>
<br>
<br>
<br>

<h4>方法2：absolute + top,left=50% + translate</h4>
方法1と似ていますが、ネガティブマージンの代わりに<code>translate</code>を使います。<code>translate</code>で縦横それぞれ半分の長さずつ動かすことで、上下左右中央に表示できます。こちらの方法は、要素の大きさが可変でも中央に表示できるので、柔軟性があります。<br>
<pre class="prettyprint">
&lt;div class="container"&gt;
    &lt;div class="item"&gt;おはよう&lt;br&gt;こんにちは&lt;br&gt;おやすみなさい&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
    .container {
        position: relative;
        width: 300px;
        height: 300px;
    }
    .item {
        /* top と left に 50% を指定して、要素の左上を中央にする. */
        position: absolute;
        top: 50%;
        left: 50%;

        /* tarnslate で要素の縦横それぞれ50%分の長さを動かすことで、要素を中央にする. */
        transform: translate(-50%, -50%);
    }
&lt;/style&gt;
</pre>

<p class="bold">(表示例)</p>
<div class="sk1odb-container">
    <div class="sk1odb-item">おはよう<br>こんにちは<br>おやすみなさい</div>
</div>
<style>
    .sk1odb-container {
        position: relative;
        width: 100%;
        max-width: 300px;
        height: 300px;
        margin: 20px 0;
        border: 1px solid #ccc;
    }
    .sk1odb-item {
        position: absolute;
        top: 50%;
        left: 50%;
        text-align: center;
        padding: 20px;
        transform: translate(-50%, -50%);
        background: rgba(255, 255, 100, .5);
        white-space: pre;
    }
</style>
<p class="bold">(サポートブラウザ)</p>
<table class="table01 textCenter mt0">
    <tr>
        <th style="width:20%;">IE11</th>
        <th style="width:20%;">Edge</th>
        <th style="width:20%;">Chrome</th>
        <th style="width:20%;">Safari</th>
        <th style="width:20%;">Firefox</th>
    </tr>
    <tr>
        <td>○</td>
        <td>○</td>
        <td>○</td>
        <td>○</td>
        <td>○</td>
    </tr>
</table>

<br>
<br>
<br>

<h4>方法3：absolute + top,bottom,left,right=0 + width,height + margin=auto</h4>
この方法は少し手品のようですが、次の4つの条件が成立する場合、上下左右中央に表示されます。<br>
<ol>
    <li><code>position</code>が<code>absolute</code>である</li>
    <li><code>top, bottom, left, right</code>が全て<code>0</code>である（※）</li>
    <li><code>margin</code>が<code>auto</code>である</li>
    <li><code>width,height</code>が<code>auto</code>以外である</li>
</ol>
<p class="small">※ 正確には<code>0</code>である必要はありませんが、<code>0</code>にすることが多いです。詳細は後述の説明リンクをご参照ください。</p>
<pre class="prettyprint">
&lt;div class="container"&gt;
    &lt;div class="item"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
    .container {
        position: relative;
        width: 300px;
        height: 300px;
    }
    .item {
        /* 1. absolute にする. */
        position: absolute;

        /* 2. top, bottom, left, right を 0 にする. */
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;

        /* 3. width, height を auto 以外にする. */
        width: 150px;
        height: 150px;

        /* 4. margin を auto にする. */
        margin: auto;
    }
&lt;/style&gt;
</pre>

<p class="bold">(表示例)</p>
<div class="sk1odc-container">
    <div class="sk1odc-item"></div>
</div>
<style>
    .sk1odc-container {
        position: relative;
        width: 100%;
        max-width: 300px;
        height: 300px;
        margin: 20px 0;
        border: 1px solid #ccc;
    }
    .sk1odc-item {
        position: absolute;
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
        width: 150px;
        height: 150px;
        margin: auto;
        text-align: center;
        padding: 20px;
        background: rgba(255, 255, 100, .5);
        white-space: pre;
    }
</style>
<p class="bold">(サポートブラウザ)</p>
<table class="table01 textCenter mt0">
    <tr>
        <th style="width:20%;">IE11</th>
        <th style="width:20%;">Edge</th>
        <th style="width:20%;">Chrome</th>
        <th style="width:20%;">Safari</th>
        <th style="width:20%;">Firefox</th>
    </tr>
    <tr>
        <td>○</td>
        <td>○</td>
        <td>○</td>
        <td>○</td>
        <td>○</td>
    </tr>
</table>
上記はちょっと不思議ですが、cssの仕様でそのように動作します。詳細は「<a href="https://hyper-text.org/archives/2014/08/position_absolute_center_layout.shtml" target="_blank">position: absolute; の指定で要素が上下左右中央配置になる理由</a>」を読んでみてください。<br>
<br>
<br>
<br>

<h4>方法4：display=flex</h4>
<code>display: flex</code>、<code>align-items: center</code>、<code>justify-content: center</code> を使うと、簡単に上下中央寄せにできます。絶対配置でない場合に中央表示にするなら、この方法がシンプルで便利です。<br>
<pre class="prettyprint">
&lt;div class="container"&gt;
    &lt;div class="item"&gt;おはよう&lt;br&gt;こんにちは&lt;br&gt;おやすみなさい&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
    .container {

        /* flexbox を用いて、上下左右中央に表示します. */
        display: flex;
        align-items: center;
        justify-content: center;

        width: 300px;
        height: 300px;
    }
    .item {
        /* 中身の要素はCSSの指定なしでOK */
    }
&lt;/style&gt;
</pre>

<p class="bold">(表示例)</p>
<div class="sk1odd-container">
    <div class="sk1odd-item">おはよう<br>こんにちは<br>おやすみなさい</div>
</div>
<style>
    .sk1odd-container {
        display: flex;
        align-items: center;
        justify-content: center;
        width: 100%;
        max-width: 300px;
        height: 300px;
        margin: 20px 0;
        border: 1px solid #ccc;
    }
    .sk1odd-item {
        text-align: center;
        padding: 20px;
        background: rgba(255, 255, 100, .5);
        white-space: pre;
    }
</style>
<p class="bold">(サポートブラウザ)</p>
<table class="table01 textCenter mt0">
    <tr>
        <th style="width:20%;">IE11</th>
        <th style="width:20%;">Edge</th>
        <th style="width:20%;">Chrome</th>
        <th style="width:20%;">Safari</th>
        <th style="width:20%;">Firefox</th>
    </tr>
    <tr>
        <td>○</td>
        <td>○</td>
        <td>○</td>
        <td>○</td>
        <td>○</td>
    </tr>
</table>

Bootstrap4 でも積極的に採用されている方法で、様々なサイトで利用されています。<br>
<br>
<br>
<br>

<h4>方法5：vertical-algin=middle</h4>
少し古典的な方法ですが、<code>display: table</code>と<code>display: table-cell</code>を用いてテーブル表現を行い、<code>vertical-align: middle</code>で上下中央表示に、<code>text-align: center</code>で左右中央に表示できます。<br>
<pre class="prettyprint">
&lt;div class="container"&gt;
    &lt;div class="item"&gt;&lt;span&gt;おはよう&lt;br&gt;こんにちは&lt;br&gt;おやすみなさい&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;style&gt;
    .container {

        /* table 要素として表示する. */
        display: table;
        width: 300px;
        height: 300px;
    }
    .item {
        /* table-cell 要素として表示する. */
        display: table-cell;

        /* 上下中央に表示. */
        vertical-align: middle;

        /* 左右中央に表示. */
        text-align: center;
    }
&lt;/style&gt;
</pre>

<p class="bold">(表示例)</p>
<div class="sk1ode-container">
    <div class="sk1ode-item"><span>おはよう<br>こんにちは<br>おやすみなさい</span></div>
</div>
<style>
    .sk1ode-container {
        display: table;
        width: 100%;
        max-width: 300px;
        height: 300px;
        margin: 20px 0;
        border: 1px solid #ccc;
    }
    .sk1ode-item {
        display: table-cell;
        vertical-align: middle;
        text-align: center;
    }
</style>
<p class="bold">(サポートブラウザ)</p>
<table class="table01 textCenter mt0">
    <tr>
        <th style="width:20%;">IE11</th>
        <th style="width:20%;">Edge</th>
        <th style="width:20%;">Chrome</th>
        <th style="width:20%;">Safari</th>
        <th style="width:20%;">Firefox</th>
    </tr>
    <tr>
        <td>○</td>
        <td>○</td>
        <td>○</td>
        <td>○</td>
        <td>○</td>
    </tr>
</table>
あまり使う機会はありませんが、htmlからPDF生成をするためのツール（<a href="https://github.com/mikehaertl/phpwkhtmltopdf" target="_blank">phpwkhtmltopdf（Laravelなどで利用）</a>、<a href="https://github.com/mileszs/wicked_pdf" target="_blank">wicked_pdf（Railsで利用）</a>）では、Flexboxがサポートされていないので、上記の方法で上下中央表示を実現することがあります。<br>
<br>
<br>
<br>

<h4>最後に</h4>
今回紹介した5つのいずれかが、ご覧いただいた方の要件に合う方法であることを祈っています。このようなノウハウはこれからもどんどんと執筆したいと思います。<br>
<br>
最後になりますが本ブログでは、フロントエンド、サーバー、PHP、Python、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「<span class="bold">プログラミングで困ったその時の、解決の糸口に！</span>」そんな目標でブログを書き続けています。ぜひ、<a href="http://feeds.feedburner.com/Yoheimnet.xml" target="_blank">本ブログのRSS</a>や<a href="http://twitter.com/yoheiMune" target="_blank">Twitter</a>をフォローして貰えたら嬉しいです ^ ^<br>
<br>
最後までご覧頂きましてありがとうございました！<br>
<br>
<br>
<br>
</div>
]]></description><dc:creator>yoheiM</dc:creator><pubDate>Thu, 11 Jun 2020 10:50:54 10JunJST</pubDate></item><item><title>[シェル] grepで前後の行も表示して、エラーログ調査を楽にしよう
</title><link>http://www.yoheim.net/blog.php?q=20200401</link><description><![CDATA[<div class="article">
grepでヒットした行の前後を表示できると、エラー調査の時などにとても役立ちます。今日は、grepで前後の行を表示する方法をブログに書きたいと思います。<br>
<img src="image/630.png" alt=""/>
<br>
<br>
<br>

<h4 class="jsnotoc">目次</h4><div data-type="pageList"></div><br><br><br>

<h4>なぜ、grepで前後の行を表示したいのか</h4>
目的は色々あると思いますが、僕はエラーログを調査するときに前後の行を表示します。エラーログの前には直前の作業のログが、後ろにはスタックトレースが出力されていることが多いです。grepでエラーログの前後も表示することで、エラー内容の特定に加えて、原因調査もできるので便利です。<br>
<br>
以下で実際にやってみたいと思います。<br>
<br>
<br>
<br>

<h4>grepで該当した行の前後を表示する</h4>
ヒットした行の前後を表示するには、下記のように実行します。<br>
<pre class="prettyprint">
# 前後3行を表示する
$ grep -3 "ERROR" [ファイルパス]

# 前3行を表示する
$ grep -B 3 "ERROR" [ファイルパス]

# 後ろ3行を表示する
$ grep -A 3 "ERROR" [ファイルパス]
</pre>
<br>
例えば、前後3行を表示すると、何をしていて、どんなエラーになったのか、を把握できるようになります。<br>
<pre class="prettyprint">
# 前後3行を表示して、エラーの内容把握
$ grep -3 "ERROR" storage/logs/laravel-2020-04-03.log

# 以下出力内容

# 前3行（直前の作業）
[2020-04-03 10:40:02] local.INFO: user_id=1がログイン。
[2020-04-03 10:40:02] local.INFO: user_id=1がタスク(id=123)を作成。
[2020-04-03 10:40:02] local.INFO: user_id=1が発注書(id=123)を作成。

# grepでヒットした行
[2020-04-03 10:46:42] local.<span class="red bold">ERROR</span>: Class App\Http\Controllers\TaskPreviewRequest does not exist. user_id=1.

# 後ろ3行（エラーのスタックトレースの一部）
[stacktrace]
#0 /var/www/html/myapp/vendor/laravel/framework/src/Illuminate/Routing/RouteSignatureParameters.php(25): ReflectionParameter->getClass()
#1 [internal function]: Illuminate\\Routing\\RouteSignatureParameters::Illuminate\\Routing\\{closure}(Object(ReflectionParameter))
</pre>
この場合、<code>TaskPreviewRequest</code>がないというエラーであることが分かります。また直前の行から、影響範囲はタスク作成や発注書作成周りであることが分かり、後ろの行から原因はリファクタリングの対応漏れかなと推測できます。<br>
<br>
<br>
<br>

<h4>grepについてさらに詳しく</h4>
grepコマンドは使いこなすと非常に探し物が早くなります。以下の記事もぜひご覧ください。<br>
<br>
<a href="/blog.php?q=20160302" target="_blank">[シェル] Grepでand検索、or検索、not検索、正規表現、再帰的に検索、圧縮ファイル内検索、など行う</a>
<br>
<br>
<br>

<h4>最後に</h4>
最近は本番稼働中のシステムを調査をする仕事もあり、構成がわからない中でgrepを使いながら該当のファイルを探すことも多いです。Linuxコマンドが使えるようになるともっと作業効率化できるなと感じています。学んだことはブログにも書いていきたいと思います。<br>
<br>
最後になりますが本ブログでは、サーバー、フロントエンド、PHP、Python、インフラ、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「<span class="bold">プログラミングで困ったその時の、解決の糸口に！</span>」そんな目標でブログを書き続けています。ぜひ、<a href="http://feeds.feedburner.com/Yoheimnet.xml" target="_blank">本ブログのRSS</a>や<a href="http://twitter.com/yoheiMune" target="_blank">Twitter</a>をフォローして貰えたら嬉しいです ^ ^<br>
<br>
最後までご覧頂きましてありがとうございました！<br>
<br>
<br>
<br>
</div>
]]></description><dc:creator>yoheiM</dc:creator><pubDate>Thu, 23 Apr 2020 11:58:07 11AprJST</pubDate></item><item><title>[フロントエンド] Reduxの考え方をシンプルに理解しよう（入門記事）
</title><link>http://www.yoheim.net/blog.php?q=20191201</link><description><![CDATA[<div class="article">
こんにちは、<a href='http://twitter.com/yoheiMune' target='_blank'>@yoheiMune</a>です。<br>
Reduxという考え方は、React、Vue、Swift、Kotlin、とクライアントアプリ界隈で非常に流行っています。今日はその考え方をシンプルに学びたいと思い、ライブラリを使わずにReduxとは何かを説明したいと思います。<br>
<img src="image/s430.png" alt="Reduxの全体像" style="display:none;"/>
<br>
<br>
<br>

<h4 class="jsnotoc">目次</h4><div data-type="pageList"></div><br><br><br>

<h4>この記事の目的</h4>
この記事では、Reduxを初めて学ぶ人や、一度は触れたけど挫折した人向けに、Reduxとはどのようなものかを解説しています。僕自身、いろいろな案件でReduxを使っていますが、少しもやっとしたところもあり、整理したいなと思い執筆しました。<br>
<br>
Reduxはデータを扱うための考え方の1つです。Reduxという考え方を実現したライブラリが存在します（reduxやreact-reduxなど）。ただ、考え方を学ぶ上でライブラリを使うとわかりづらい点があります。ライブラリの中でいい感じに処理してくれる（=処理が隠蔽されている）部分があるためです。そのため、今回はあえて、ライブラリを使わずに、素のJavaScriptを実装しながらReduxの考え方を学びたいと思います。<br>
<br>
なお、<a href="https://github.com/reduxjs/redux" target="_blank">Reduxのライブラリ</a>は、コンパイルすると2KBほどの小さなライブラリで、コード全量を読むこともそんなに大変ではありません。この記事を読んだ後に、気になる方はライブラリのコードも覗いてみてください。この記事で見た用語や関数名を見つけることができ、理解が進むと思います。<br>
<br>
<br>
<br>

<h4>Reduxを構成する要素</h4>
前述でも触れましたが、Reduxはデータを扱う考え方の一つです。Reduxでは、アプリケーションで扱うデータ全てを、1つの変数（stateと呼びます）で管理します。<br>
<br>
<img src="image/s429.png" alt="Reduxのstateのイメージ" style="max-width:300px"/>
<br>
その、ステート（state）を管理するために、ストア（
store）というものがあり、ステートを変更する際に、アクション（action）、ディスパッチ（dispatch）、リデューサー（Reducer）、というものがあります。ステートの変更を受け取るために、サブスクライブ（subscribe）という機能もあります。急にいっぱい出てきて混乱しますが、現時点では理解していなくて問題ありません。<br>
<br>
Reduxの全体像を示します。<br>
<br>
<img src="image/s430.png" alt="Reduxの全体像"/>
<br>
Reduxが難しく感じるポイントは、この用語の多さだと思います。<br>
1つずつ話を進めていきたいと思います。<br>
<br>
<br>
<br>

<h4>ステート（state）</h4>
それでは早速、構成要素を1つずつ見ていきたいと思います。まずはステート（state）です。<br>
ステート（state）は、アプリケーションで扱う全データを保持するオブジェクトです。大きな1つのJSONと考えるわかりやすいかもしれません。<br>
ここでは、タイトル（<code>title</code>）とカウント（<code>count</code>）を保持するオブジェクトとしましょう。<br>
<pre class="prettyprint">
// ステート
{
    title : '',
    count : 0
}
</pre>
ただのJavaScriptオブジェクトですね！全く怖くありません(笑)。<br>
このステートを、Reduxという考え方で管理したいと思います。<br>
<br>
<br>
<br>

<h4>ストア（store）</h4>
上記のステートを管理する人（管理者）として、ストア（store）というものを定義します。Reduxの全体像のイメージで示した通り、ストア（store）がステート（state）を保持します（Store has State）。<br>
<pre class="prettyprint">
// ストア
const store = {

    // ストアが、ステートを、保持している.
    state : {
        title : '',
        count : 0
    }
}
</pre>
ストアの中に、ステートがあります。これもわかりやすいですね、簡単なJavaScriptです。<br>
Reduxでは、ストアがステートを保持していて、ステートの変更はストアが行います。<br>
<br>
<br>
<br>

<h4>ステートの値を変更する</h4>
それではステートの中身を変更したいと思います。ステートを変更する場合、アクション（action）、ディスパッチ（dispatch）、リデューサー（Reducer）の3つを使います。<br>
<br>
ここでは「ステートの中の<code>count</code>を1つ増やす」ことを考えてみたいと思います。<br>
<br>
<br>
<h5>アクション(Action)</h5>
ストアに変更したい内容を伝えるため、アクション（action）を作成します。アクションは変更指示書のようなものです。<br>
<pre class="prettyprint">
// アクション.
const action = {
    type : 'ADD_COUNT'
}
</pre>
アクションも簡単なJavaScriptオブジェクトですね！<br>
アクションには<code>type</code>という決まった項目を用意し、その項目に指示を書きます。ここでは<code>ADD_COUNT</code>という文字列を指定しました。<br>
<br>
<br>
<h5>ディスパッチ（dispatch）</h5>
指示書を作っても、それがストアに届かなければ意味がありません。ストアに届けるために、ディスパッチ（dispatch）を使います。<br>
ストア（store）に<code>dispatch</code>というメソッドを用意し、引数でアクションを受け取ります。<br>
<pre class="prettyprint">
const store = {

    // 上記のステートを、ストアは保持している.
    state : {
        title : '',
        count : 0
    },

<span data-add>    // ディスパッチを追加.</span>
<span data-add>    dispatch : function (action) {</span>
<span data-add>        // あとで実装します.</span>
<span data-add>    }</span>
}
</pre>
これで、ストアにアクションを渡すことができます。<br>
<br>
<br>

<h5>リデューサー（reducer）</h5>
ストアは受け取ったアクションを読み取って、ステートを変更します。アクションの内容を理解してステートを変更する処理を担当するのが、リデューサー（reducer）です。<br>
<br>
ここではまず、リデューサー（reducer）の処理を定義したいと思います。<br>
リデューサー（reducer）は、現在のステートとアクションを引数で受け取り、変更後の新しいステートを返却する関数として定義します。<br>
<pre class="prettyprint">
// リデューサー（reducer）.
// @param state 現在のステート
// @param action 変更内容
function myReducer(state, action) {

    // actionのタイプごとに、処理を分ける
    switch (action.type) {

        // ADD_COUNTの場合は、countを1増やす.
        case 'ADD_COUNT':
            state = {
                ...state,
                count : state.count + 1
            }
            return state

        default:
            return state
    }
}
</pre>
リデューサーの中ではアクションの<code>type</code>項目を見て、それぞれに応じた処理を行います。ここでは<code>type</code>が<code>ADD_COUNT</code>の場合に、ステート内の<code>count</code>に1加えています。<br>
<br>
これで、アクション内容を理解してステートを変更する処理（=リデューサー）を作成できました。<br>
<br>
なおReduxでは、既存のステートを変更するのではなく、新しいステートを毎回作成します。<br>
<pre class="prettyprint">
// 新しいステートのオブジェクトを作成している.
state = {
    ...state,
    count : state.count + 1
}
</pre>
これはReduxの3原則の一つ「State is read-only」でとても大切なことですが、最初のうちは気にしなくて良いと思います。まずは大枠を掴むことが大切です。<br>
<br>
上記で作成した<code>myReducer</code>を、storeに設定します。<br>
<pre class="prettyprint">
// Store に reducer を追加.
const store = {

    state : {
        title : '',
        count : 0
    },

<span data-add>    // リデューサー.</span>
<span data-add>    reducer : myReducer,</span>

    dispatch : function (action) {
        // あとで実装します.
    }
}
</pre>
これで、ストアがリデューサーを使えるようになりました。<br>
<br>
そして、この<code>reducer</code>を<code>dispatch</code>メソッドの中で使うことで、ステートを変更できるようになります。<br>
<pre class="prettyprint">
// dispatch メソッド内で、reducer を使う.
const store = {

    state : {
        title : '',
        count : 0
    },

    reducer : myReducer,

    dispatch : function (action) {
<span data-add>        // reducer を使って、state を変更する.</span>
<span data-add>        this.state = this.reducer(this.state, action)</span>
    }
}
</pre>
これで、ストア内のステートを変更できました。<br>
<br>
<br>
<br>

<h4>実際に、Action → Dispatch → Reducer で State を変更してみる</h4>
実際に値を変更してみましょう。上記を実装した状態で、下記のコードを実行します。<br>
<pre class="prettyprint">
// アクションを定義.
const action = {
    type : 'ADD_COUNT'
}

// 動作テスト
store.dispatch(action)
console.log('1回目:', store.state)  // 1回目: {title: "", count: 1}

store.dispatch(action)
console.log('2回目:', store.state)  // 2回目: {title: "", count: 2}

store.dispatch(action)
console.log('3回目:', store.state)  // 3回目: {title: "", count: 3}
</pre>
無事に、アクション、ディスパッチ、リデューサー、を使って、ステートの値を変更できました。<br>
<br>
実際に<a href="https://github.com/reduxjs/redux" target="_blank">Reduxのライブラリ</a>を使う場合には、<code>store.state</code>とプロパティに直接アクセスするのではなく、<code>store.getState()</code>と関数を通してステートを取得します。<br>
ここでもそれにならって、<code>getState</code>メソッドを定義したいと思います。<br>
<pre class="prettyprint">
// Store.
const store = {

    /* 省略 */

<span data-add>    // ステートを取得するメソッドを追加.</span>
<span data-add>    getState : function () {</span>
<span data-add>        return this.state</span>
<span data-add>    }</span>
}
</pre>
上記のメソッドを使って、ステートを取得しましょう。<br>
<pre class="prettyprint">
store.dispatch(action)
console.log('4回目:', store.getState())  // 4回目: {title: "", count: 4}
</pre>
無事にステートを取得することができました。<br>
<br>
<br>
<br>

<h4>変更を検知する（サブスクライブ(subscribe)）</h4>
さて、ステートを変更するのが自分であればステート変更のタイミングは分かりますが、誰か他の人が（=他の処理が）更新した時には、ステートがいつ変更されたのかわかりません。他の人がステートを変更した際に、その変更を教えてもらうのが、サブスクライブ（subscribe）という機能です。<br>
<br>
ストア内に<code>subscribe</code>というメソッドを用意して、変更があった時に呼び出してもらう関数を登録できるようにしましょう。<br>
<pre class="prettyprint">
// Store.
const store = {

    /* 省略  */

    // 変更時に呼び出す関数を保持する変数.
    subscribers : [],

    // 引数で受け取った関数を、subscribers変数に追加する.
    subscribe : function (fn) {
        this.subscribers.push(fn)
    }
}
</pre>
そして、subscribersに登録された関数を、ストアの<code>dispatch</code>メソッドの中で呼び出し、ステート変更を通知します。<br>
<pre class="prettyprint">
// Store.
const store = {

    /* 省略. */

    dispatch : function (action) {
        this.state = this.reducer(this.state, action)

<span data-add>        // ステートの変更後、変更を通知する.</span>
<span data-add>        this.subscribers.forEach(function (subscriber) {</span>
<span data-add>            subscriber()</span>
<span data-add>        })</span>
<span data-add>    },</span>

    subscribers : [],

    subscribe : function (fn) {
        this.subscribers.push(fn)
    }
}
</pre>
これで、サブスクライブ（subscribe）の実装ができました。<br>
<br>
実際に使ってみたいと思います。<br>
<pre class="prettyprint">
// ストアにサブスクライブを追加.
store.subscribe(function () {
    console.log('subscribe:', store.getState())
})

// ステートを変更する（1回目）
store.dispatch(action)     // subscribe: {title: "", count: 1}

// ステートを変更する（2回目）
store.dispatch(action)     // subscribe: {title: "", count: 2}
</pre>
ステートに変更があった場合に、変更を検知することができました。<br>
<br>
<br>
<br>

<h4>Reduxのメリット</h4>
さて最後に、Reduxを導入するメリットを考えてみたいと思います。こんなに大変なデータ管理をする必要があるのでしょうか。正直なところ、メリットを感じないうちは使う必要はありません。ただ、大きめなプロダクトを開発する時には、下記3つのメリットが生きてきます。<br>
<br>
<ol>
    <li>データの変更方法が制限されている</li>
    <li>データの変更を検知する術がある</li>
    <li>離れたコンポーネント間でデータのやり取りができる</li>
</ol>
<br>
「1. データの変更方法が制限されている」は一見不便そうですが、プロダクトが大きくなるとメリットがあります。データを変更する方法が限られるので、「このデータ、誰が変えたの？」という問題が発生しても、すぐに調べて原因を特定できます。データの更新方法が制限されていたり、データの更新者が制限されることで、アプリケーションのデータの堅牢性が上がります。<br>
<br>
「2. データの変更を検知する術がある」は、Reduxの「サブスクライブ（subscribe）」という機能です。例えば、画面ヘッダーのコンポーネントで、「誰が更新したかはわからないけど、ステートの中の<code>title</code>が変わったら、自分の表示を更新しよう」といった実装ができるようになります。変更を通知してくれる仕組みは非常に便利です。<br>
<br>
最後に「3. 離れたコンポーネント間でデータのやり取りができる」は、「2. データの変更を検知する術がある」とも関連しますが、例えばスレッドを表示する画面があったとします。「スレッドが切り替わるたびに、スレッド名を画面ヘッダーに反映したい。僕(=スレッド画面)はステートの<code>title</code>を更新すれば、君(=画面ヘッダー)がそれをサブスクライブしているから自動的に変更してくれるよね、ありがとう」といった使い方ができます。<br>
特にReactなど、親子関係以外のコンポーネント間でデータをやり取りしたい場合に便利です。<br>
<br>
他にもメリットがあると思いますが、Reduxを使うことで上記のメリットを享受できます。<br>
<br>
<br>
<br>

<h4>参考サイト</h4>
Reduxの本家ページなど、リンクを掲載します。英語ですが、読むとためになります。<br>
<br>
<a href="https://redux.js.org/" target="_blank">redux.js.org（本家ページ）</a><br>
<br>
<a href="https://github.com/reduxjs/redux" target="_blank">redux | Github（コードが読めます）</a><br>
<br>
<br>
<br>

<h4>最後に</h4>
今日はReduxのチュートリアルを書きました。本記事で紹介したコードはどれも簡単なものなので、ぜひ実装してみてください。理解に役立ちます。<br>
<br>
なお、Reduxの全体像を把握することを主眼としているため、実装内容の一部がReduxに準拠していない場合もあります。実際にReduxを使う場合は、Reduxのライブラリを使うと良いと思います。<br>
<br>
最後になりますが本ブログでは、フロントエンド、PHP、Python、インフラ、サーバー、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「<span class="bold">プログラミングで困ったその時の、解決の糸口に！</span>」そんな目標でブログを書き続けています。ぜひ、<a href="http://feeds.feedburner.com/Yoheimnet.xml" target="_blank">本ブログのRSS</a>や<a href="http://twitter.com/yoheiMune" target="_blank">Twitter</a>をフォローして貰えたら嬉しいです ^ ^<br>
<br>
最後までご覧頂きましてありがとうございました！<br>
<br>
<br>
<br>
</div>
]]></description><dc:creator>yoheiM</dc:creator><pubDate>Tue, 10 Dec 2019 16:27:35 16DecJST</pubDate></item><item><title>[JavaScript] 全角カナ、半角カナの判定を行う方法
</title><link>http://www.yoheim.net/blog.php?q=20191105</link><description><![CDATA[<div class="article">
こんにちは、<a href='http://twitter.com/yoheiMune' target='_blank'>@yoheiMune</a>です。<br>
先日は「<a href="/blog.php?q=20191101" target="_blank">[JavaScript] 全角⇔半角の変換を行う（英数字、カタカナ）</a>」のブログを書きました。今回は、JavaScriptで日本語カナのチェックを行う実装をブログに書きたいと思います。<br>
氏名カナの入力チェックなどで使うことができます。<br>
<br>
<br>
<br>

<h4 class="jsnotoc">目次</h4><div data-type="pageList"></div><br><br><br>

<h4>全角カナのチェックを行う</h4>
<br>
<h5>基本形</h5>
文字列が全角カナであるかを判定するためには、下記の実装で判定できます。<br>
<pre class="prettyprint">
// 全角カナの判定.
function isZenkakuKana(s) {
    return !!s.match(/^[ァ-ヶー　]*$/);  // 「　」は全角スペースです.
}
</pre>
下記のように利用します。
<pre class="prettyprint">
isZenkakuKana('シブヤ');  // true
</pre>
<br>

<h5>派生系（許可する文字種類を増やしたい場合）</h5>
また、全角数字など、許可したい文字列を追加することもできます。<br>
<pre class="prettyprint">
// 全角カナ、全角数字、を許可
function isZenkakuKana(s) {
    return !!s.match(/^[ァ-ヶ０-９ー　]*$/);
}

// 全角カナ、全角数字、半角数字、を許可
function isZenkakuKana(s) {
    return !!s.match(/^[ァ-ヶ０-９0-9ー　]*$/);
}

// 全角カナ、全角数字、半角数字、半角スペース、を許可
function isZenkakuKana(s) {
    return !!s.match(/^[ァ-ヶ０-９0-9ー　 ]*$/);
}
</pre>
全角カナの入力欄ですが、要件によっていろいろなので、上のバリエーションで要件に合うものを使えると良いかなと思います。<br>
<br>
<br>
<br>

<h4>半角カナのチェックを行う</h4>
<br>
<h5>基本形</h5>
文字が半角カナであるかを判定する関数は、下記です。<br>
<pre class="prettyprint">
// 半角カナのチェック.
function isHankakuKana(s) {
    return !!s.match(/^[ｦ-ﾟ]*$/);
}
</pre>
「<code>ｦ-ﾟ</code>」の範囲は、「<code>ｦｧｨｩｪｫｬｭｮｯｰｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜﾝﾞﾟ</code>」を表します。<br>
<br>
下記のように利用します。<br>
<pre class="prettyprint">
isHankakuKana('ｼﾌﾞﾔ')  // true
</pre>
<br>

<h5>派生系（許可する文字種類を増やしたい場合）</h5>
半角スペースや半角数字など、他の文字も許可したい場合には、下記のように実装します。<br>
<pre class="prettyprint">
// 半角カナ、半角スペース、を許可
function isHankakuKana(s) {
    return !!s.match(/^[ｦ-ﾟ ]*$/);
}

// 半角カナ、半角スペース、半角数字、を許可
function isHankakuKana(s) {
    return !!s.match(/^[ｦ-ﾟ 0-9]*$/);
}
</pre>
半角カナチェックも要件がいろいろなので、その時に応じて対応できたら素敵です。<br>
<br>
<br>
<br>

<h4>関連記事</h4>
「<a href="/blog.php?q=20191101" target="_blank">カナの全角と半角の相互変換を行う方法</a>」もブログに書きました。もし良ければご参考ください。<br>
<br>
<br>
<br>

<h4>最後に</h4>
業務用のアプリケーションの場合、カナを扱うことも多いので、ノウハウを残しておければと思いブログに書きました。実装がすぐにできれば、より多くの価値を生み出せると思いますので、今後も実装の役に立つネタをブログに書いていけたらと思っています。<br>
<br>
最後になりますが本ブログでは、PHP、フロントエンド、Python、インフラ、サーバー、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「<span class="bold">プログラミングで困ったその時の、解決の糸口に！</span>」そんな目標でブログを書き続けています。ぜひ、<a href="http://feeds.feedburner.com/Yoheimnet.xml" target="_blank">本ブログのRSS</a>や<a href="http://twitter.com/yoheiMune" target="_blank">Twitter</a>をフォローして貰えたら嬉しいです ^ ^<br>
<br>
最後までご覧頂きましてありがとうございました！<br>
<br>
<br>
<br>
</div>
]]></description><dc:creator>yoheiM</dc:creator><pubDate>Wed, 20 Nov 2019 11:05:58 11NovJST</pubDate></item><item><title><h2 data-category="PHP">DBからの検索結果をPHPで並び替える（array_multisortの利用、昇順、降順、複数のソートキー、ユーザー定義ソート）
</title><link>http://www.yoheim.net/blog.php?q=20191104</link><description><![CDATA[<h2 data-category="PHP">DBからの検索結果をPHPで並び替える（array_multisortの利用、昇順、降順、複数のソートキー、ユーザー定義ソート）</h2>
<div class="article">
こんにちは、<a href='http://twitter.com/yoheiMune' target='_blank'>@yoheiMune</a>です。<br>
先日は「<a href="/blog.php?q=20191103" target="_blank">PHPの連想配列のソートいろいろ</a>」を書きました。<br>
今日は、データベースからの取得した結果（配列の中に複数の連想配列が含まれているもの、いわゆる多次元配列）を、<code>array_multisort</code>関数を用いて、並び替える方法をブログに書きたいと思います。<br>
<br>
<br>
<br>

<h4 class="jsnotoc">目次</h4><div data-type="pageList"></div><br><br><br>

<h4>今回説明に使うデータ</h4>
以下のような、配列の中に連想配列が入ったもの（=多次元配列）を使いたいと思います。<br>
<pre class="prettyprint">
$fruits = [
  array('id' =>'01', 'name' => 'apple'),
  array('id' =>'02', 'name' => 'orange'),
  array('id' =>'03', 'name' => 'pinapple')
];
</pre>
フルーツの一覧を、データベースから取得した時のデータ構造のイメージです。<br>
<br>
<br>
<br>

<h4>任意のキーで、昇順に並び替える</h4>
まずは、並び替えに使うキーを決めます。ここでは<code>id</code>列の値で並び替えたいと思います。<br>
<code>id</code>の昇順に並び替えるには、<code>array_multisort()</code>を用いて実装します。<br>
<pre class="prettyprint">
// id の昇順に並び替える.

// 並び替えの基準を取得します.
$ids = [];
foreach($fruits as $fruit) {
    $ids[] = $fruit['id'];
}

// PHP5.5以降では、下記の書き方でもOK.
$ids = array_column($fruits, 'id');

// idの昇順（SORT_ASC）に並び替える.
array_multisort($ids, SORT_ASC, $fruits);

// Array
// (
//     [0] => Array
//         (
//             [id] => 01
//             [name] => apple
//         )

//     [1] => Array
//         (
//             [id] => 02
//             [name] => orange
//         )

//     [2] => Array
//         (
//             [id] => 03
//             [name] => pinapple
//         )
// )
</pre>
<br>
<br>
<br>

<h4>任意のキーで、降順に並び替える</h4>
<code>id</code>の降順に並び替えるには、ソート順に<code>SORT_DESC</code>を指定します。<br>
<pre class="prettyprint">
// id の降順に並び替える.

// 並び替えの基準を取得します.
$ids = array_column($fruits, 'id');

// idの降順（SORT_DESC）に並び替える.
array_multisort($ids, SORT_DESC, $fruits);

// Array
// (
//     [0] => Array
//         (
//             [id] => 03
//             [name] => pinapple
//         )

//     [1] => Array
//         (
//             [id] => 02
//             [name] => orange
//         )

//     [2] => Array
//         (
//             [id] => 01
//             [name] => apple
//         )
// )
</pre>
<br>
<br>
<br>

<h4>複数のキーを使って、並び替える</h4>
今までは1つのキーのみで並び替えしていましたが、複数のキーでもソートできます。<br>
<pre class="prettyprint">
// 今回使うデータ.
// 第1ソートキー（volume）に同じ値があり、一意にソートできないので、
// 第2ソートキー（edition）も指定します.
$data = [];
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

// 第1ソートキー（volume）
$volume  = array_column($data, 'volume');

// 第2ソートキー（edition）
$edition = array_column($data, 'edition');

// データを volume の降順、edition の昇順にソートします.
// $data を最後のパラメータとして渡し、同じキーでソートします.
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

// Array
// (
//     [0] => Array
//         (
//             [volume] => 98
//             [edition] => 2
//         )

//     [1] => Array
//         (
//             [volume] => 86
//             [edition] => 1
//         )

//     [2] => Array
//         (
//             [volume] => 86
//             [edition] => 6
//         )

//     [3] => Array
//         (
//             [volume] => 85
//             [edition] => 6
//         )

//     [4] => Array
//         (
//             [volume] => 67
//             [edition] => 2
//         )

//     [5] => Array
//         (
//             [volume] => 67
//             [edition] => 7
//         )
// )
</pre>
<br>
<br>
<br>

<h4>ユーザー独自定義の並び順で並び替える</h4>
<code>usort()</code>を使うと、並び順を自由に定義できます。ここでは<code>name</code>列の文字数で並び替えをしてみました。<br>
<pre class="prettyprint">
// ユーザー独自定義のソート.
usort($fruits, function ($f1, $f2) {
    // ここでは name の文字数の多い順に並べています.
    return strlen($f2['name']) - strlen($f1['name']);
});

// Array
// (
//     [0] => Array
//         (
//             [id] => 03
//             [name] => pinapple
//         )
//     [1] => Array
//         (
//             [id] => 02
//             [name] => orange
//         )
//     [2] => Array
//         (
//             [id] => 01
//             [name] => apple
//         )
// )
</pre>
<br>
<br>
<br>

<h4>参考資料</h4>
<code>array_multisort()</code>の公式マニュアルは下記です。<br>
<br>
<a href="https://www.php.net/manual/ja/function.array-multisort.php" target="_blank">https://www.php.net/manual/ja/function.array-multisort.php</a><br>
<br>
<br>
<br>

<h4>最後に</h4>
DBからの取得結果をPHPで並び替えるにはどうしたらいいんだろう、と調べたのがきっかけで<code>array_multisort()</code>を知りました。しかし、最初は使い方がいまいち理解できずでしたが、サンプルを実装してみたり、ブログに書いてみることで理解できました。<br>
<br>
最後になりますが本ブログでは、PHP、フロントエンド、Python、インフラ、サーバー、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「<span class="bold">プログラミングで困ったその時の、解決の糸口に！</span>」そんな目標でブログを書き続けています。ぜひ、<a href="http://feeds.feedburner.com/Yoheimnet.xml" target="_blank">本ブログのRSS</a>や<a href="http://twitter.com/yoheiMune" target="_blank">Twitter</a>をフォローして貰えたら嬉しいです ^ ^<br>
<br>
最後までご覧頂きましてありがとうございました！<br>
<br>
<br>
<br>
</div>

]]></description><dc:creator>yoheiM</dc:creator><pubDate>Sat, 16 Nov 2019 07:32:52 7NovJST</pubDate></item><item><title>[PHP] 連想配列を並び替えする方法（キーでのソート、値でのソート、ソート順の独自定義）
</title><link>http://www.yoheim.net/blog.php?q=20191103</link><description><![CDATA[<div class="article">
こんにちは、<a href='http://twitter.com/yoheiMune' target='_blank'>@yoheiMune</a>です。<br>
PHPの連想配列は柔軟に使えて便利ですよね。今日は、連想配列の中身を並び替える方法を、ブログに書きたいと思います。<br>
<br>
<br>

<h4 class="jsnotoc">目次</h4><div data-type="pageList"></div><br><br><br>

<h4>ソートの説明に使う連想配列</h4>
このブログでは、以下の連想配列を使って、ソートを説明します。<br>
<pre class="prettyprint">
$fruits = [
  '01' => 'apple',
  '02' => 'orange',
  '03' => 'pinapple'
];
</pre>
<br>
<br>
<br>

<h4>キーでのソート（昇順、降順、ユーザー定義）</h4>
キーでの並び替えは、連想配列のキー（<code>01</code>、<code>02</code>、<code>03</code>）を使ってソートします。<br>昇順ソートには<code>ksort()</code>、降順ソートには<code>krsort()</code>、ユーザー定義によるソートには<code>uksort()</code>を使います。<br>
<pre class="prettyprint">
// キーで昇順ソート
ksort($fruits);

// Array
// (
//     [01] => apple
//     [02] => orange
//     [03] => pinapple
// )
</pre>
<pre class="prettyprint">
// キーで降順ソート
krsort($fruits);

// Array
// (
//     [03] => pinapple
//     [02] => orange
//     [01] => apple
// )
</pre>
<pre class="prettyprint">
// ユーザー定義によるソート
// （ここでは、キーの昇順に並べています）
uksort($fruits, function ($key1, $key2) {
   return intval($key1) - intval($key2); 
});

// Array
// (
//     [01] => apple
//     [02] => orange
//     [03] => pinapple
// )
</pre>
<br>
<br>
<br>

<h4>値でのソート（昇順、降順、ユーザー定義）</h4>
値での並び替えは、連想配列の値（<code>apple</code>、<code>orange</code>、<code>pinapple</code>）を使ってソートします。<br>昇順ソートには<code>asort()</code>、降順ソートには<code>arsort()</code>、ユーザー定義によるソートには<code>uasort()</code>を使います。<br>
<pre class="prettyprint">
// 値で昇順ソート
asort($fruits);

// Array
// (
//     [01] => apple
//     [02] => orange
//     [03] => pinapple
// )
</pre>
<pre class="prettyprint">
// 値で降順ソート
arsort($fruits);

// Array
// (
//     [03] => pinapple
//     [02] => orange
//     [01] => apple
// )
</pre>
<pre class="prettyprint">
// ユーザー定義によるソート
// （ここでは、値の文字数が多い順に並べています）
uasort($fruits, function ($value1, $value2) {
   return strlen($value2) - strlen($value1);
});

// Array
// (
//     [03] => pinapple
//     [02] => orange
//     [01] => apple
// )
</pre>
<br>
<br>
<br>

<h4>関連：連想配列（多次元配列）をソートするには</h4>
以下のような多次元配列をソートする方法もブログに書きました。良ければ合わせてご確認ください。<br>
<pre class="prettyprint">
// 多次元配列の例（DBの検索結果など）
$fruits = [
  array('id' =>'01', 'name' => 'apple'),
  array('id' =>'02', 'name' => 'orange'),
  array('id' =>'03', 'name' => 'pinapple')
];
</pre>
<br>
<a href="/blog.php?q=20191104" target="_blank">[PHP] 連想配列（多次元配列）をソートする（昇順、降順、ユーザー独自ソート、複数のソートキー）</a><br>
<br>
<br>
<br>

<h4>参考資料</h4>
PHPの配列並び替えについてのマニュアルです。今回紹介したもの以外にも関数があります。<br>
<br>
<a href="https://www.php.net/manual/ja/array.sorting.php" target="_blank">https://www.php.net/manual/ja/array.sorting.php</a><br>
<br>
<br>
<br>

<h4>最後に</h4>
PHPでの実装をしていると、ちょっとしたことを調べることも多いので、少しずつノウハウを貯めてたいなと思っています。PHPには沢山の便利な関数が用意されていて、それらを知ると知らないとでは効率が大きく変わるので、1つずつ学べると良いなと思います。<br>
<br>
最後になりますが本ブログでは、PHP、フロントエンド、Python、インフラ、サーバー、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「<span class="bold">プログラミングで困ったその時の、解決の糸口に！</span>」そんな目標でブログを書き続けています。ぜひ、<a href="http://feeds.feedburner.com/Yoheimnet.xml" target="_blank">本ブログのRSS</a>や<a href="http://twitter.com/yoheiMune" target="_blank">Twitter</a>をフォローして貰えたら嬉しいです ^ ^<br>
<br>
最後までご覧頂きましてありがとうございました！<br>
<br>
<br>
<br>
</div>
]]></description><dc:creator>yoheiM</dc:creator><pubDate>Fri, 15 Nov 2019 17:01:49 17NovJST</pubDate></item><item><title>[PHP] 関数から複数の値を返す。複数の変数で一度に受け取る（タプル代入）
</title><link>http://www.yoheim.net/blog.php?q=20191102</link><description><![CDATA[<div class="article">
PHPの関数は<code>array()</code>を用いて複数の値を返却できます。またそれらの値を<code>list()</code>を用いて、複数の変数へ一気に代入できます。今日はその実装方法をブログに書きたいと思います。<br>
<br>
<br>
<br>

<h4 class="jsnotoc">目次</h4><div data-type="pageList"></div><br><br><br>

<h4>関数で、複数の値を返す</h4>
PHPの関数で複数の値を返したい場合、<code>array()</code>を用いて複数の値を返却できます。<br>
<pre class="prettyprint">
function getPerson() {
    $name = 'Yohei';
    $age = 33;
    return array($name, $age);
}

$person = getPerson();
echo $person;  // [ 'Yohei', 33 ]
</pre>
配列に複数の値を入れて返す、というのはシンプルで分かりやすいですね。<br>
<br>
<br>
<br>

<h4>list()を用いて、複数の変数に一括代入する</h4>
PHPでは、<code>list()</code>を用いて、複数の値を複数の変数に一度に代入できます。<br>
<pre class="prettyprint">
list($name, $age) = array('Yohei', 33);
echo $name;  //'Yohei'
echo $age;   //33
</pre>
また、PHP7.1以降では配列記述で受け取ることもできます。<br>
<pre class="prettyprint">
[ $name, $age ] = array('Yohei', 33);
echo $name;  //'Yohei'
echo $age;   //33
</pre>
なお他の言語では、この機能をタプル展開やタプル代入と呼ぶ場合があります。<br>
<br>
<br>
<br>

<h4>関数で複数の値を返却して、list()で複数変数に一括代入する</h4>
上記2点を組み合わせると、関数からの複数の戻り値を、複数の変数に一度で代入できます。<br>
<pre class="prettyprint">
// 配列で複数の値を返却する.
function getPerson() {
    $name = 'Yohei';
    $age = 33;
    return array($name, $age);
}

// list() で一気に受け取る.
list($name, $age) = getPerson();
echo $name;  //'Yohei'
echo $age;   //33
</pre>
関数からの戻り値を複数で扱えるようになると、実装幅がグッと拡がります。<br>
<br>
<br>
<br>

<h4>最後に</h4>
今回の内容は実装幅が広がりますし、コードもシンプルになるので、知っていて損はないと思います。少しずつPHPでの開発ノウハウも貯めていきたいなと思っています。<br>
<br>
最後になりますが本ブログでは、PHP、フロントエンド、Python、インフラ、サーバー、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「<span class="bold">プログラミングで困ったその時の、解決の糸口に！</span>」そんな目標でブログを書き続けています。ぜひ、<a href="http://feeds.feedburner.com/Yoheimnet.xml" target="_blank">本ブログのRSS</a>や<a href="http://twitter.com/yoheiMune" target="_blank">Twitter</a>をフォローして貰えたら嬉しいです ^ ^<br>
<br>
最後までご覧頂きましてありがとうございました！<br>
<br>
<br>
<br>
</div>
]]></description><dc:creator>yoheiM</dc:creator><pubDate>Tue, 12 Nov 2019 10:02:27 10NovJST</pubDate></item><item><title>[JavaScript] 全角⇔半角の変換を行う（英数字、カタカナ）
</title><link>http://www.yoheim.net/blog.php?q=20191101</link><description><![CDATA[<div class="article">
数字、アルファベット、カタカナの全角半角変換は、JavaScriptで簡単に実現できます。今日はその実装方法をブログに書きたいと思います。<br>
<br>
<br>
<br>

<h4 class="jsnotoc">目次</h4><div data-type="pageList"></div><br><br><br>

<h4>全角 → 半角（英数字）</h4>
<pre class="prettyprint">
function hankaku2Zenkaku(str) {
    return str.replace(/[Ａ-Ｚａ-ｚ０-９]/g, function(s) {
        return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
    });
}

// 使用例
hankaku2Zenkaku('１２３ａｂＣ');  // '123abC'
</pre>
文字コード上で、全角英数字から<code>65248</code>引くと半角英数字になります。<br>
また、処理範囲を正規表現で<code>[Ａ-Ｚａ-ｚ０-９]</code>と指定していますが、例えば<code>[０-９]</code>とすれば、変換対象を全角数字に限定できます。<br>
<br>
<br>
<br>

<h4>半角 → 全角（英数字）</h4>
<pre class="prettyprint">
function zenkaku2Hankaku(str) {
    return str.replace(/[A-Za-z0-9]/g, function(s) {
        return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
    });
}

// 使用例
zenkaku2Hankaku('123abC');  // '１２３ａｂＣ'
</pre>
全角→半角とは逆で、半角英数字に<code>65248</code>加えると全角英数字になります。<br>
全角→半角と同様に、正規表現の<code>[A-Za-z0-9]</code>を変更することで、処理対象を限定できます。<br>
<br>
<br>
<br>

<h4>全角 → 半角（カタカナ）</h4>
カタカナの場合、文字コードの演算ではうまくできない部分があるので、マッピングを作成して対応します。<br>
<pre class="prettyprint">
function zenkana2Hankana(str) {
    var kanaMap = {
         "ガ": "ｶﾞ", "ギ": "ｷﾞ", "グ": "ｸﾞ", "ゲ": "ｹﾞ", "ゴ": "ｺﾞ",
         "ザ": "ｻﾞ", "ジ": "ｼﾞ", "ズ": "ｽﾞ", "ゼ": "ｾﾞ", "ゾ": "ｿﾞ",
         "ダ": "ﾀﾞ", "ヂ": "ﾁﾞ", "ヅ": "ﾂﾞ", "デ": "ﾃﾞ", "ド": "ﾄﾞ",
         "バ": "ﾊﾞ", "ビ": "ﾋﾞ", "ブ": "ﾌﾞ", "ベ": "ﾍﾞ", "ボ": "ﾎﾞ",
         "パ": "ﾊﾟ", "ピ": "ﾋﾟ", "プ": "ﾌﾟ", "ペ": "ﾍﾟ", "ポ": "ﾎﾟ",
         "ヴ": "ｳﾞ", "ヷ": "ﾜﾞ", "ヺ": "ｦﾞ",
         "ア": "ｱ", "イ": "ｲ", "ウ": "ｳ", "エ": "ｴ", "オ": "ｵ",
         "カ": "ｶ", "キ": "ｷ", "ク": "ｸ", "ケ": "ｹ", "コ": "ｺ",
         "サ": "ｻ", "シ": "ｼ", "ス": "ｽ", "セ": "ｾ", "ソ": "ｿ",
         "タ": "ﾀ", "チ": "ﾁ", "ツ": "ﾂ", "テ": "ﾃ", "ト": "ﾄ",
         "ナ": "ﾅ", "ニ": "ﾆ", "ヌ": "ﾇ", "ネ": "ﾈ", "ノ": "ﾉ",
         "ハ": "ﾊ", "ヒ": "ﾋ", "フ": "ﾌ", "ヘ": "ﾍ", "ホ": "ﾎ",
         "マ": "ﾏ", "ミ": "ﾐ", "ム": "ﾑ", "メ": "ﾒ", "モ": "ﾓ",
         "ヤ": "ﾔ", "ユ": "ﾕ", "ヨ": "ﾖ",
         "ラ": "ﾗ", "リ": "ﾘ", "ル": "ﾙ", "レ": "ﾚ", "ロ": "ﾛ",
         "ワ": "ﾜ", "ヲ": "ｦ", "ン": "ﾝ",
         "ァ": "ｧ", "ィ": "ｨ", "ゥ": "ｩ", "ェ": "ｪ", "ォ": "ｫ",
         "ッ": "ｯ", "ャ": "ｬ", "ュ": "ｭ", "ョ": "ｮ",
         "。": "｡", "、": "､", "ー": "ｰ", "「": "｢", "」": "｣", "・": "･"
    }
    var reg = new RegExp('(' + Object.keys(kanaMap).join('|') + ')', 'g');
    return str
            .replace(reg, function (match) {
                return kanaMap[match];
            })
            .replace(/゛/g, 'ﾞ')
            .replace(/゜/g, 'ﾟ');
};

// 使用例
zenkana2Hankana('アシタハイイテンキカナ、ブーヴー');  // 'ｱｼﾀﾊｲｲﾃﾝｷｶﾅ､ﾌﾞｰｳﾞｰ'
</pre>
対応表に沿って、該当する文字を1つずつ変換しています。<br>
上記の対応表以外にも対応したい文字があれば、マッピングに追加することで、処理対象に加えることができます。<br>
<br>
<br>
<br>

<h4>半角 → 全角（カタカナ）</h4>
同じく、対応表（マッピング）を作成して対応します。<br>
<pre class="prettyprint">
function hankana2Zenkana(str) {
    var kanaMap = {
        'ｶﾞ': 'ガ', 'ｷﾞ': 'ギ', 'ｸﾞ': 'グ', 'ｹﾞ': 'ゲ', 'ｺﾞ': 'ゴ',
        'ｻﾞ': 'ザ', 'ｼﾞ': 'ジ', 'ｽﾞ': 'ズ', 'ｾﾞ': 'ゼ', 'ｿﾞ': 'ゾ',
        'ﾀﾞ': 'ダ', 'ﾁﾞ': 'ヂ', 'ﾂﾞ': 'ヅ', 'ﾃﾞ': 'デ', 'ﾄﾞ': 'ド',
        'ﾊﾞ': 'バ', 'ﾋﾞ': 'ビ', 'ﾌﾞ': 'ブ', 'ﾍﾞ': 'ベ', 'ﾎﾞ': 'ボ',
        'ﾊﾟ': 'パ', 'ﾋﾟ': 'ピ', 'ﾌﾟ': 'プ', 'ﾍﾟ': 'ペ', 'ﾎﾟ': 'ポ',
        'ｳﾞ': 'ヴ', 'ﾜﾞ': 'ヷ', 'ｦﾞ': 'ヺ',
        'ｱ': 'ア', 'ｲ': 'イ', 'ｳ': 'ウ', 'ｴ': 'エ', 'ｵ': 'オ',
        'ｶ': 'カ', 'ｷ': 'キ', 'ｸ': 'ク', 'ｹ': 'ケ', 'ｺ': 'コ',
        'ｻ': 'サ', 'ｼ': 'シ', 'ｽ': 'ス', 'ｾ': 'セ', 'ｿ': 'ソ',
        'ﾀ': 'タ', 'ﾁ': 'チ', 'ﾂ': 'ツ', 'ﾃ': 'テ', 'ﾄ': 'ト',
        'ﾅ': 'ナ', 'ﾆ': 'ニ', 'ﾇ': 'ヌ', 'ﾈ': 'ネ', 'ﾉ': 'ノ',
        'ﾊ': 'ハ', 'ﾋ': 'ヒ', 'ﾌ': 'フ', 'ﾍ': 'ヘ', 'ﾎ': 'ホ',
        'ﾏ': 'マ', 'ﾐ': 'ミ', 'ﾑ': 'ム', 'ﾒ': 'メ', 'ﾓ': 'モ',
        'ﾔ': 'ヤ', 'ﾕ': 'ユ', 'ﾖ': 'ヨ',
        'ﾗ': 'ラ', 'ﾘ': 'リ', 'ﾙ': 'ル', 'ﾚ': 'レ', 'ﾛ': 'ロ',
        'ﾜ': 'ワ', 'ｦ': 'ヲ', 'ﾝ': 'ン',
        'ｧ': 'ァ', 'ｨ': 'ィ', 'ｩ': 'ゥ', 'ｪ': 'ェ', 'ｫ': 'ォ',
        'ｯ': 'ッ', 'ｬ': 'ャ', 'ｭ': 'ュ', 'ｮ': 'ョ',
        '｡': '。', '､': '、', 'ｰ': 'ー', '｢': '「', '｣': '」', '･': '・'
    };

    var reg = new RegExp('(' + Object.keys(kanaMap).join('|') + ')', 'g');
    return str
            .replace(reg, function (match) {
                return kanaMap[match];
            })
            .replace(/ﾞ/g, '゛')
            .replace(/ﾟ/g, '゜');
};

// 使用例
hankana2Zenkana('ｱｼﾀﾊｲｲﾃﾝｷｶﾅ､ﾌﾞｰｳﾞｰ');  // 'アシタハイイテンキカナ、ブーヴー'
</pre>
こちらも同じく、変換処理に追加したい文字があれば、対応表に追加することで対応できます。<br>
<br>
なお、カタカナの全角半角の変換ルールは、プロジェクトやアプリケーションによって異なる場合があるので、上記と違う場合にはそれに応じて対応表を書き直す必要があります。<br>
<br>
<br>
<br>

<h4>関連記事</h4>
「<a href="/blog.php?q=20191105" target="_blank">[JavaScript] 全角カナ、半角カナの判定を行う方法</a>」もブログに書きました。もし良ければ合わせてご覧ください。<br>
<br>
<br>
<br>

<h4>最後に</h4>
サービス開発をしていて、全角と半角の変換処理を扱う機会が何度かあったので、ノウハウとして残しておきたいと思いブログにしました。コピペして使えるようになっておくとコーディングスピードが上がるので良いかなと思います。<br>
<br>
最後になりますが本ブログでは、フロントエンド、Python、インフラ、サーバー、PHP、Swift、Node.js、Java、Linux、機械学習、などの技術トピックを発信をしていきます。「<span class="bold">プログラミングで困ったその時の、解決の糸口に！</span>」そんな目標でブログを書き続けています。ぜひ、<a href="http://feeds.feedburner.com/Yoheimnet.xml" target="_blank">本ブログのRSS</a>や<a href="http://twitter.com/yoheiMune" target="_blank">Twitter</a>をフォローして貰えたら嬉しいです ^ ^<br>
<br>
最後までご覧頂きましてありがとうございました！<br>
<br>
<br>
<br>
</div>
]]></description><dc:creator>yoheiM</dc:creator><pubDate>Wed, 20 Nov 2019 11:08:23 11NovJST</pubDate></item></channel></rss>