著者アーカイブ 村上

村上 著者:村上

【PHP】文字列の置換を行うstr_replace()、preg_replace()の違い

今回はPHPで文字列を置換する方法について。
が、文字列の置換でも、関数は2種類あるので、その違いについて。
どちらかというと、自分のためのまとめですね。

置換を扱う関数は、str_replace()preg_replace() があります。
PHPマニュアルは下記からご確認ください。

str_replace():http://php.net/manual/ja/function.str-replace.php
preg_replace():http://php.net/manual/ja/function.preg-replace.php

 

使い方は下記のとおりです。

$text = "ABCDEF";  // 置換前の文字

$result1 = str_replace("A", "Z", $text);
$result2 = preg_replace("/^A/", "Z", $text);

結果はどちらも「ZBCDEF」になります。

例を見てわかる通り、str_replace() は A を B に置き換えるなど、単なる文字列の置換に向いています。
マニュアルにも、「正規表現のような技巧的な置換を必要としない場合、preg_replace() の代わりにこの関数を常用するべき」とありました。
対して、preg_replace() は正規表現を利用する、少し複雑な検索と置換を扱うときに使用します。

なお、今回は書きませんでしたが、どちらの関数でも置換した回数を取得することができます。
str_replace()の時は、第4引数に、preg_replace()の時は、第5引数に、$count などの変数を指定しておくと、指定した変数の中に、置換回数が格納されます。

 

以上、PHPで文字列を置換する方法でした。
単純な置換の場合は str_replace()を、正規表現を使った置換の場合は preg_replace()を使うように心がけましょう。

村上 著者:村上

【PHP】指定した幅で文字列を丸める関数「mb_strimwidth()」

本日は、他の人が書いたソースコードを読んでいて発見したPHPの関数「mb_strimwidth()」について。
「この関数見たことないな?何だろう?」と調べたところ、指定した幅で文字列を丸めてくれるとのことで…とっても便利そうな関数でした。
もう少し早くに出会いたかった…!

PHPマニュアルの mb_strimwidth()関数についてのページはこちらから。

PHP: mb_strimwidth-Manual
http://php.net/manual/ja/function.mb-strimwidth.php

 

さて、具体的な使い方は、下記のとおりです。

$text = mb_strimwidth("丸めたいテキストを指定", 0, 20, "....", "UTF-8");

上のコードを実行すると、「丸めたいテキスト….」という結果になります。
どうやら第3引数の丸めた後のテキスト幅は、第4引数の文字数を丸めた後に追加する文字列まで含めた数で、かつ半角でカウントした場合のようです。
なお、第5引数の文字コードは指定しておくと、文字化けしなくなるとのことなので、出来る限り指定したほうがよさそうです。
こちらについては、下記のサイトが分かりやすかったです。

指定した文字数で文字列をまるめるPHPの関数 mb_strimwidth で、第4引数に「文字列をまるめた後に付加する文字列を指定」する際、色々気を付けないと文字化けるよ、というお話。|ITキヲスク
http://smkn.xsrv.jp/blog/2013/03/mb_strimwidth-function-tips/

 

以上、mb_strimwidth() で文字列を丸める方法でした。
以前の記事で、JavaScriptで文字列を丸める方法についても紹介しましたが、こちらの方が便利そうですね。
今後はこちらを積極的に使うようにしたいと思います。

村上 著者:村上

【CSS】CSSで計算式を扱うためのcalc()関数が使えない時の対処法

以前に紹介した、CSSで計算式を使うための関数「calc」について、指定したはずなのに何故かブラウザに反映されない!という現象に遭遇したので、それの回避方法についてです。

なお、前回のcalc()についてまとめた記事はこちらから。

【CSS】スタイルシート内で計算式が使えるcalc()が便利
https://cpoint-lab.co.jp/article/201801/【css】スタイルシート内で計算式が使えるcalcが便利

 

で、本題ですが、その時指定したCSSがこちら。

div {
    width: calc(50vw-20px);
}

ちなみに、値には特に意味はありません。
一見、何の問題もないように思えますが、このCSSを指定しても横幅は変化しませんでした。

問題は、なんと半角スペース
なんでも、計算式で使われている + などの符号の前後に、半角でスペースを空けないと構文エラーになるとのことでした。

なお、今回参考にしたサイトはこちら。

css3-CSS calc() not working-Stack Overflow
https://stackoverflow.com/questions/14967421/css-calc-not-working

同じように、calc()が動かない、という質問に対しての解決策がまとめられています。
やはり、同じように間違ってしまう人がいるようですね。

と、いうことで、先程のCSSを下記のように修正すれば、万事解決です。

div {
    width: calc(50vw - 20px);
}

 

以上、calc()が使えない時の対処法でした。
まさかスペースが関係しているとは思わず…少し悩んでしまいました。
皆様も、CSS で calc() を使うときはお気を付けください。

村上 著者:村上

【Mac】画面のスクリーンショットを撮影する方法

知っているよ!という人が大半だとは思いますが、自分でも訳がわからないくらいコマンドが覚えられないので、こうして記事にまとめて覚えることにします。
なんだろう…キーが3つだからかな?

参考にさせていただいた…というか、Appleの公式サイトはこちらから。

Mac でスクリーンショットを撮る方法
https://support.apple.com/ja-jp/HT201361

 

まず、画面全体のスクリーンショットを撮影するときには、

command + Shift + 3

上記の3つのキーを押します。
すると、デスクトップに自動的にスクリーンショットの画像が保存されます。
なお、撮影できた画像は下のような感じです。

次に、選択した一部分のみのスクリーンショットを撮影するときは、

command + Shift + 4

上記のキーを押します。
すると、マウスカーソルが十字に変わるので、スクショを取りたい範囲を選択します。
これはあまり使ったことがないですね。

最後に、ある特定のウィンドウのスクリーンショットを取りたいとき。
この場合は、まず下記のキーを押します。

command + Shift + 4

で、マウスカーソルが変わったのを確認後、スペースキーを押します。
すると、マウスカーソルがカメラアイコンに変わり、そのマウスカーソルの下にあるウィンドウが青く選択されます。
なので、スクリーンショットを取りたいウィンドウの上でクリックします。
あとは、自動的にデスクトップに画像が保存されます。
なお、撮影できたスクリーンショットは下のような感じです。

ウィンドウの縁に影がついています。
ちょっとした装飾ですが、単なる切り取りよりもおしゃれな感じがしますね。

 

ということで、Macでスクリーンショットを撮る方法でした。
Shiftキー なのか Controlキーなのか、毎回わからなくなってしまうのですが、こうして書くと、なんとか覚えられそうな気がします…!
…忘れませんように!

村上 著者:村上

【Xcode】アプリをアップロードできないときの対処法

最近は遭遇率がほぼゼロなのですが、一時期、正規の方法でXcodeからApp Storeにアプリをアップデートできない時がありました。
で、その時の対処法についてまとめ。
ちなみに、主な原因はネットワーク接続エラーでした。
そのため、接続先を変更すれば改善されることもありましたが、どうしようもないときにこちらの方法を使いました。

なお、今回参考にさせていただいた記事はこちらから。

Xcodeからアップロードできないときは、Application Loaderを使おう – Qiita
https://qiita.com/_natsu_no_yuki_/items/68140e7c0e96afbb2e4b

 

さて、そのアップロード方法ですが、まず Archive を実行すると自動的に表示される下の画面から、アプリをエクスポートします。

なお、この画面は、Xcodeのメニューから Window > Organizer からも開くことができます。

エクスポートが完了したら、Xcode の メニューから Xcode > Open Developer Tool > Application Loader を選択します。

すると、下記のような画面が表示されるので、下の選択から、先程エクスポートしたアプリの iOS App ファイル(拡張子が .ipa)を選択します。

ファイルを選択後、アプリの情報が表示されたら、次へを押せば完了です。
これでアップロードできたので、あとは、アプリ情報が反映されるのを待つだけです。

 

以上、アプリがアップロードできないときの対処法でした。
当時、ひどいときは 2〜3回試しても失敗したので、そのときはこの方法を使っていました。
最近では、全くと言っていいほど遭遇しなくなり、ありがたいですが…いざというときのために覚えておきたいです。

村上 著者:村上

【PHP】画像URLから画像をBase64にエンコードする方法

昨日の記事に引き続き、本日もPHPについて。
今回は、画像URLを Base64 にエンコードする方法です。
…需要があるかは分かりません。

Webページの読み込み時に、画像の表示があまりに遅かったり、そもそも表示できないものがあったので、Base64に変換してしまえば何とかなるのでは?と試してみました。

 

コードはこちらから。

$image_url = [変換したい画像のURL]; 
$entry_image = "";  // Base64に変換後のデータ
if(!empty($image_url) && @file_get_contents($image_url, NULL, NULL, 0, 1)) {
    switch (true) {
        case preg_match('/(\.jpg)$|(\.jpeg)$|(\.JPEG)$|(\.JPG)$/', $image_url):
            $image_type = "image/jpeg";
            break;
        case preg_match('/(\.png)$|(\.PNG)$/', $image_url):
            $image_type = "image/png";
            break;
        case preg_match('/(\.gif)$|(\.GIF)$/', $image_url):
            $image_type = "image/gif";
            break;
        case preg_match('/(\.bmp)$|(\.BMP)$/', $image_url):
            $image_type = "image/bmp";
            break;
        default:
            $image_type = "";
            break;
    }
    if($image_type != ""){
        $img_base64 = base64_encode(file_get_contents($image_url));
        $entry_image = "data:".$image_type.";base64,".$img_base64;
    }
}

3行目で、file_get_contents 関数を使い、画像が実際に存在するかどうかを調べています。
ちなみに、戻り値を全て取得すると時間がかかるので、1文字だけ取得するようにして、高速化を図っています。
そして、Switch文で末尾を確認して、画像の拡張子が何かを判断しています。
22行目では、ファイルデータをBase64にエンコードしています。
エンコードには、PHPの関数の base64_encode を使用しています。
なお、最終的に変換したデータは $entry_image に格納され、もし変換できなかった場合は空文字が格納されます。

 

以上、画像URLから、画像を Base64 にエンコードする方法でした。
これを試したところ、実際画像の表示速度は速くなりましたね。
が、文字数としてはかなり増えたので、若干通信速度が遅くなりました…。
通信速度が画像の表示速度か…どちらを取るかはその時の状況によって対応してください。

村上 著者:村上

【PHP】Switch文の条件に正規表現を使う方法

今回は、Switch文の応用的な使い方についてです。
コード内で、Aの正規表現の条件に一致したら Aの処理、Bの正規表現の条件に一致したら Bの処理…というようなSwitch文を書きたかったので、今回の方法を試してみました。

参考にさせていただいた記事はこちら。

PHP switch文の応用的な使い方 – Qiita
https://qiita.com/tkykmw/items/ee0ab7bf502361f413d8

 

で、早速書き方はこちらから。

$image_url = [画像のURL];
switch (true) {
    case preg_match('/(\.jpg)$|(\.jpeg)$|(\.JPEG)$|(\.JPG)$/', $image_url):
        // jpeg画像の時の処理
        break;
    case preg_match('/(\.png)$|(\.PNG)$/', $image_url):
        // png画像の時の処理
        break;
    case preg_match('/(\.gif)$|(\.GIF)$/', $image_url):
        // gif画像の時の処理
        break;
    case preg_match('/(\.bmp)$|(\.BMP)$/', $image_url):
        // bmp画像の時の処理
        break;
}

今回のコードは、画像URLの末尾の拡張子を調べて、その拡張子ごとに処理を分けています。

ちなみに、この書き方は JavaScriptでも使えます。
なお、その場合は、case の後の条件で test() メソッドを使います。
正規表現自体はPHPとほぼ同じです。

 

以上、switch文の条件に正規表現を使用する方法でした。
switch文の引数に true を指定するやり方を知らなかったので、こんな書き方があるのかと少し驚きでした。
とても興味深かったです。
これで少し複雑な条件分岐が大分楽になりそうです。
同じことにお困りの方がいらっしゃいましたら、是非参考にしていただければと思います。

村上 著者:村上

【アプリ】生活音やメロディーを聞きながら眠れる「Relax Melodies」

今日は技術ネタではなく、最近よく使っている「Relax Melodies」というアプリについて。
こちらのアプリは、雨の音や滝の音、もしくはオルゴールの曲などを再生できるアプリです。

アプリのジャンルとしては、睡眠・ヨガにあたるみたいです。

アプリのインストールはこちらから。

Android:https://play.google.com/store/apps/details?id=ipnossoft.rma.free&hl=ja
iOS:https://itunes.apple.com/jp/app/relax-melodies-sleep-sounds/id314498713?mt=8

 

一部有料のものもありますが、50以上のサウンドが用意されており、それを好きな組み合わせ&お好みの音量でミックスして再生することができます。

また、気に入った組み合わせについては下の画像のように保存することもできます。

最近は、オルゴール調の「ブラームスの子守歌」が気に入っています。
単調なメロディーなので、聞いているとウトウトと眠くなってきます。

さらにタイマー機能も付いているので、設定しておけば、朝までずっと音楽が流れてしまうこともありません。

私の場合はいつも30分で設定しています。
よっぽどのことがない限りは、聞き終わる前に眠れます。

 

ということで、快適な入眠にぴったりなアプリ「Relax Melodies」の紹介でした。
静か過ぎると眠れない!という方や、リラックスできる音楽を聴きながら眠りたいという方は、ぜひ試してみてください。
しかし、不眠が続く場合は、アプリではなく、早急にお医者様へかかってください。

村上 著者:村上

【PHP】PDOでMySQLを使った際のエラー「Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY093]: Invalid parameter number: no parameters were bound’」

今回は、PDOを使ってMySQLでデータを取り出すときに遭遇したエラーについて。
コード自体は、既に動いているものをコピーして修正したものなので、動かなくて焦りました…。

エラー全文はこちら。

Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[HY093]: Invalid parameter number: no parameters were bound’ in [エラーが発生したファイル名]

 

で、調べたところ、SQL文の構文エラーがある場合や、パラメータの数が一致していない時に発生するエラーとのことです。
なお、今回参考にした記事はこちら。

PHP-PDOを使ったSQL文のエラー(HY093)|teratail
https://teratail.com/questions/3209

私の場合は、パラメータの数が一致していなかったために発生していました。
また、下記のサイトによると、「クエリのプレイスホルダとバインドするパラメータはきちんと数を合わせる必要がある」とのことでしたので、こちらが原因ですね。

PDO::bindParamの挙動を知る|Kwappa研究開発室
http://randd.kwappa.net/2008/05/29/25

恐らくコピーした時に、何かが抜けるかしたのかと思われます。

 

ということで、PDOを使用した時に発生したエラーの対処法でした。
今回のエラーについては、とりあえずコードを良く読み返して、パラメータに数を確認することが解決への近道ですね。
エラーに遭遇した時はとにかく焦ってしまうものですが、あわてず騒がず落ち着いて、最初から確認し直すことを心掛けたいです。

村上 著者:村上

【CSS】要素のタッチやクリックを無効にするpointer-eventsプロパティ

/タイトル通り、今回は要素に対するタッチやクリックを無効化する方法について。
button要素であれば、下記のように disabled を指定すれば、クリックができなくなりますが、それをdiv要素などで行う場合です。

<button type="submit" disabled>無効化されたボタン</button>

 

使うプロパティは「pointer-events」です。
こちらのプロパティは、初期値は auto が指定されています。
この値に、none を指定することで、要素に対するクリック・タップを無効化することができます。

サンプルはこんな感じ。

<div>
    <p>無効化された要素</p>
</div>
div {
    pointer-events: none;
}
$("div").on("click", function(){
    alert("div click!");
});

こちらを実行すると、div要素をクリックしてもアラートが表示されません。
ちなみに、スマートフォンでも動作します。

 

ということで、div要素などのクリック・タップを無効化する方法でした。
なかなか、butto要素以外でクリック・タップをすることはないかもしれませんが…知っていれば便利です。
是非参考にしてください。