著者アーカイブ 村上

村上 著者:村上

【PHP】配列で重複した値を削除する方法

たまにしか使わないから毎回忘れる配列の値が重複したときの削除方法について。
今回使用するのは、array_unique という関数です。
PHPのマニュアルページはこちらから。

PHP: array_unique – Manual
http://php.net/manual/ja/function.array-unique.php

 

こちらの関数は、重複を削除したい配列を引数として渡せば、重複を削除した後の配列を戻り値として返してくれます。
サンプルコードは下記のとおりです。

$array = array(1, 3, 5, 1, 2, 4, 3);
// 重複削除
$unique = array_unique($array);

// 実行結果:array(1, 3, 5, 2, 4)

ただし、この関数では、重複削除後もキーは保持されます。
なので、詳細に書くと結果が下記のようになっていることに注意してください。

$array = array(0 => 1,
               1 => 3,
               2 => 5,
               3 => 1,
               4 => 2,
               5 => 4,
               6 => 3);
// 重複削除
$unique = array_unique($array);

// 実行結果:array(0 => 1,
//                1 => 3,
//                2 => 5,
//                4 => 2,
//                5 => 4);

結果を単に foreach かなにかで処理するだけなら問題ないかと思いますが、キーをセットに扱う処理を行う場合などは、このままでは使えません。
その場合は、PHPの関数の array_values を使います。
こちらを使うと、数字が飛び飛びになったキーの番号を振り直すことができます。
使用方法はこちら。

$array = array(0 => 1,
               1 => 3,
               2 => 5,
               3 => 1,
               4 => 2,
               5 => 4,
               6 => 3);
// 重複削除
$unique = array_unique($array);
// キーの振り直し
$result = array_values($unique);

// 実行結果:array(0 => 1,
//                1 => 3,
//                2 => 5,
//                3 => 2,
//                4 => 4);

これでキーの番号が飛び飛びになる問題も解決できます。

 

ということで、配列のデータ重複を解消する方法でした。
意外と使う機会がある関数なので、覚えておいて損はないはず。
ついでに、下の方で紹介した配列のキーの振り直し方法についてもセットで覚えておくといいでしょう。

村上 著者:村上

【MySQL】集計した値を日付けごとにグループ化して抽出する方法

タイトル通り、ログイン数の合計などの集計したいデータを日付けごとにグループ化して抽出するためのMySQLの書き方です。
これを使うことで、日ごとの投稿数とか、日ごとのログイン数がサクッととれるので、かなり重宝しています。
なお、この抽出を行うためには、数えたいカラムと日付を保存したカラムがある必要があります。

 

SQL文はこちら。

SELECT date_format([日付のカラム],'%Y%m%d'),count([カウントしたいカラム名]) FROM [テーブル名] GROUP BY date_format([日付のカラム],'%Y%m%d');

このSQL文を実行すると、カウントしたいカラムの合計値を日付けごとに抽出することができます。

今回重要なのは、GROUP BY句と、date_format() という時間関数を使うことです。
date_format()関数を使うことで、日付のデータを任意の書式に変更することができます。
今回は、「2018/04/26」のような形式に変更しています。
勿論、別の書き方でも問題ありません。

そして、その日付の値を GROUP BY でグループ化することで、同じ日付の値だけをそれぞれカウントしてくれます。
MySQLを使い始めたばかりだと、GROUP BY句ってどんな時に使うのか、そもそもどうやって使うのかの感覚がつかめなかったりするのですが、分かってしまうと凄く便利です。
日付け以外にも、カテゴリごととか、そういう指定もできますしね。

なお、上のSQL文を応用して、下記のように記述すると月ごとに集計することも可能です。

SELECT date_format([日付のカラム],'%Y%m'),count([カウントしたいカラム名]) FROM [テーブル名] GROUP BY date_format([日付のカラム],'%Y%m');

やろうと思えば時間単位でもできそうですが…それだとデータ数がとんでもないことになりそうなので、WHERE句で期間を指定するなど、計画的に行ってください。
INTO OUTFILE を使って、抽出結果を外部ファイルにエクスポートすると、後々使いやすいと思います。

 

なお、この書き方だと、カウント数が だった日付があった場合、その日は省略されますので、そこだけは注意してください。
値が 0 の日付も表示する方法はあるのかな…?
今のところ、この仕様でも困っていないのであまり意識していませんでしたが、あるなら便利そうですね。
時間があったら、方法を探してみたいと思います!

村上 著者:村上

【Cordova】アプリ内にAdMobのバナー広告を導入する方法

タイトル通り、Cordovaで開発したアプリにバナー広告を入れる方法です。
ちなみに、AndroidとiOSの両方に対応しています。
本当はネイティブ広告という、Twitterのタイムラインで表示されるような、記事っぽくみえる広告を導入したかったのですが、どうやらプラグインが対応していないようです。

今回使ったのは、cordova-plugin-admob-free というプラグインです。
GitHubはこちら。

GitHub – ratson/cordova-plugin-admob-free: Cordova AdMob Plugin
https://github.com/ratson/cordova-plugin-admob-free

 

まずインストールは下記のコマンドをコマンドプロンプト等で実行します。

cordova plugin add cordova-plugin-admob-free --save

インストールが終わったら、下記のコードをプログラムに記述するだけ!
なお、私の環境では、index.js というファイルに記述しました。

// AdMob 広告ID
var admobid = {}
if (/(android)/i.test(navigator.userAgent)) {  // Android
    admobid = {
        banner: 'ca-app-pub-3940256099942544/6300978111'
    }
} else if (/(ipod|iphone|ipad)/i.test(navigator.userAgent)) {  // ios
    admobid = {
        banner: 'ca-app-pub-3940256099942544/2934735716'
    }
}

document.addEventListener('deviceready', function () {
    // バナー広告表示
    admob.banner.config({
        id: admobid.banner,
        isTesting: true,  // テスト広告
        autoShow: true,
    })
    admob.banner.prepare()
}, false);

コードの上の方で、アプリを使っている端末が Android なのか iOS なのかを取得しています。
Android と iOS では、広告のIDが異なるので、この処理も重要です。

なお、広告のIDはテスト用のものを使っています。
なんでも、動作を確認している段階のアプリで本番用の広告IDを使うと、最悪の場合アカウント停止になることもあるとのことだったので…。
絶対にそれは避けたいので、慎重に。

ちなみに、広告の種類は他に「インタースティシャル」という画面に大きく表示される広告と、あとは「動画広告」もあります。
このあたりは、お好みで使い分けてください。
…が、個人的に画面全部を覆うような広告は嫌いなので、使うとすればバナー広告かな。

 

以上、アプリ内に広告を入れる方法でした。
アプリの利用者数が増えてきたら、導入を検討していきたいと思います。

村上 著者:村上

【Excel】日付を曜日付きで表示する方法

Excelを使っていて、例えば下の画像のように、「4月1日(日)」と、曜日まで表示したいときの作業です。

要は、データとしては「2018/04/01」と入力されているものを、「4月1日(日)」の形式で表示するということです。
日付の表示形式は案外簡単に変えられるのですが、曜日の表示はひと手間必要です。

今回は、こちらのサイトを参考にさせていただきました。

Excelで日付から自動的に曜日を入力する – @IT
http://www.atmarkit.co.jp/ait/articles/1708/02/news014.html

 

まず、表示形式を変えたいセルで右クリックし、メニューから「セルの書式設定」をクリックします。

すると、ウィンドウが表示されるので、「表示形式」タブの左のメニューから「ユーザー定義」をクリックします。

そして、「種類」の欄で、曜日を表示したいところに「aaa」を入力します。
私の場合だと、「“(“aaa”)”と入力したため、実際の表示では「(日)」となります。

なお、表示形式は他にもあるので、お好きなものをチョイスしてください。

表示形式コード 曜日の表示形式
aaa 月、火、水、木、金、土、日
aaaa 月曜日、火曜日、水曜日、木曜日、金曜日、土曜日、日曜日
ddd Mon、Tue、Wed、Thu、Fri、Sat、Sun
dddd Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday

作業としては以上です!

 

なお、今回紹介したサイトに、別のセルに関数を使って曜日のみを表示する方法も載っているので、場合によって使い分けてください。
曜日を表示したいセルに、次の式を入力すればOKです。

=TEXT([曜日を表示したい日付が入力されたセル],"aaaa")

どちらも、入力した日付で自動的に曜日が算出されるので、凄く便利です。
また、入力間違いもなくなるので、曜日を表示したいときは積極的に使いたいと思います。

村上 著者:村上

【Windows】空き容量があるUSBメモリにファイルをコピーできない時の対処法

タイトル通り、Windowsのパソコンで、空き容量は十分あるはずのUSBメモリに何故かファイルをコピーできない時の対処法です。
なお、エラーメッセージは、「ファイルが大きすぎます。ファイル’[ファイル名]’は大きすぎて、対象のファイルシステムに入りません。」というものでした。

こちらの対処法について、参考にさせていただいたサイトはこちら。

USBメモリや外付けHDDに空き容量があるのにファイルコピーできない時の解決法|データ復旧のパソコンサポートやまもと
https://datarescue.yamafd.com/howto_solve_unable_copy/

 

なお、データがコピーできない原因ですが、USBメモリのフォーマット形式により、1ファイルの最大サイズが 4GB までという制限があるからとのことでした。
コピーしようとしていたファイルが 4GB 以上の動画データだったので、まさにこの制限に引っかかっていました。
で、こちらの問題は USBメモリのフォーマット形式を変更すれば、大きいファイルでもコピーをすることができます。

さて、USBメモリのフォーマット形式の変更方法ですが、こちらを行う前に、まずメモリ内に保存されているファイルを別の場所に移動させて保存します。
フォーマットをするとすべてのデータが消えてしまうので、この作業は忘れずに!

データが保存出来たら、まずエクスプローラーから、フォーマット形式を変更したい USBメモリを右クリックします。
そしてメニューから、「フォーマット」を選択します。

すると、下のようなウィンドウが表示されるので、その中の「ファイル システム」を「ExFAT」に変更します。

あとは、「クイックフォーマット」にチェックが入っていることを確認して、「開始」をクリックします。

作業はこれで終了!
あとは、コピーしたいファイルを通常通りにコピー&ペーストすれば、今度は問題なくコピーができるはずです。
ただし、ExFAT 形式はデータが壊れやすいという欠点があるとのことだっため、重要なファイルを入れないほうが良いかもしれません。
そのあたりは、記事冒頭で紹介した参考サイトをご確認の上、自分の環境にあった形式を選択してください。

 

以上、USBメモリにファイルがコピーできない時の対処法でした。
なかなか 4GB 以上のファイルを扱う機会がないもので、空き容量はあるのにコピーできない!という状況には少し焦りましたね。

村上 著者:村上

【Cordova】Android・iOSアプリを終了させる処理

Cordovaのアプリを開発中、プログラムからアプリを終了させる処理を行いたかったので、やり方を調べました。
が、結局アプリを終了しない処理で落ち着いたんですけどね。

今回参考にさせていただいたサイトはこちら。

monaca(cordova)でアプリを終了させる(Androidのみ)
https://blog.mitsuto.com/cordova-exit

 

で、アプリを終了させる処理は、実はこれだけ。

// アプリを終了する
navigator.app.exitApp();

アプリを終了させたいタイミングで、上記の一行を書くだけです!
思ったよりも簡単でした。

ですが、この処理は iOS では動作しません。
なので、下記のプラグインをインストールする必要があります。

GitHub – FRD49/iOS-ExitApp: navigator.app.exitApp() on iOS
https://github.com/FRD49/iOS-ExitApp

インストールするときは、下記を実行します。

// iOS-ExitApp のインストール
cordova plugin add com.frd49.cordova.exitApp

// 上のコマンドがエラーになる場合はこちらを実行
cordova plugin add https://github.com/FRD49/iOS-ExitApp.git

プラグインをインストールする時にエラーが発生した場合は、下のコマンドを実行してください。
私の環境では、上のコマンドではインストール元が見つからないとかで失敗しました。

プラグインの追加が完了したら、アプリを再ビルドして、実機で実行すればOKです。
これで、iOS でも「navigator.app.exitApp();」を使ってアプリを終了できるようになります。

 

以上、プログラムからアプリを終了させる方法でした。
が、確かにアプリは終了できるのですが、終了時の挙動が強制終了の時と似ている、というか同じなので、終了する前に「アプリを終了しますか?」の確認ダイアログは必須ですね。

村上 著者:村上

【JavaScript】App Storeに公開済みのアプリのバージョンを取得する方法

タイトル通り、ストアに公開済みのiOSアプリのバージョンを取得する方法です。
Cordovaアプリを開発していて、アプリに新しいアップデートがあれば通知する、という機能を実装するための処理で使用しています。
プラグインが見つかればよかったのですが…見つからなかったので、JavaScriptでゴリゴリ書きました。

今回参考にさせていただいたサイトはこちら。

[iOS] iTunes Search API を利用してアプリの情報を取得する|Developers.IO
https://dev.classmethod.jp/smartphone/get-app-info-using-itunes-search-api/

[JS] iTunes APIをJavaScriptから利用して、iTunesで配信中の楽曲を視聴する – Yoheim.NET
https://www.yoheim.net/blog.php?q=20130702

上の記事で、iTunes Search API の URL の指定方法を。下の記事では、その URL を Ajax で使う方法を参考にしました。
特に、Ajax の指定が間違っていたせいで、URLがあっているのに取得できない!という現象に悩まされました…。

 

先にコードをご紹介。

$.ajax({
    url: 'https://itunes.apple.com/lookup?id=[アプリのID]&country=JP',
    method: 'GET',
    dataType: 'jsonp',
    success: function(data) {
        // 取得成功
        var version = data.results[0].version; // アプリのバージョン
    }, error: function(xhr, type){
        // エラー時の処理
    }
});

URLには、GETの書き方で、アプリのIDと国を指定します。
ポイントとしては、Typeを GET で指定することと、dataType を JSONP という指定にするという点ですね。
最初、単に JSON としてしまったせいで、エラーが発生していました。
成功すれば、変数 data でアプリの情報を取得できるので、そこから必要な情報を取得すればOKです。

 

以上、ストアのアプリのバージョンを確認する方法でした。
Android SwiftObjective-C だと、思いのほかやり方がすぐ見つかるようでしたが、JavaScriptはあまりヒットせず、苦労しました。
同じことでお悩みの方は、是非参考にしていただければと思います。

村上 著者:村上

【Android Studio】Gradleのバージョンを確認&アップデートする方法

今日、Cordovaアプリにプラグインを追加しようとした際、Gradleのバージョンが低すぎる!と怒られました。
で、更新方法がわからず調べたので、まとめです。

最初はアプリの build.gradle のどこかを更新するのかと思いましたが、どうやら違うみたいです。

 

今回参考にさせていただいたサイトはこちらから。

AndroidStudioのGradleのアップデートについて – Pelikan Philosophy
http://www.peliphilo.net/archives/685

バージョンの確認&アップデート方法ですが、まず Android Studioのメニューバーにある File から Project Structure をクリックします。
そうすると、下の画像のようなウィンドウが表示されるので、左側のメニューから Project を選択します。

そうすると、ウィンドウ上部に、Gradle versionを入力する欄があるので、こちらに任意のバージョンを入力します。
入力出来たら、右下にある OK を押して、ウィンドウを閉じます。
あとは、Android Studio が入力されたバージョンを自動でインストールしてくれるので、それを待てば完了です!

 

もしかしたら、インストールに少し時間がかかるかもしれませんが、それ以外はとても簡単でした。
冒頭でも書きましたが、てっきり build.gradle に記述しているのではと思い込んでいたので、少し探してしまいました。
やはりわからないことは調べるに限りますね!

村上 著者:村上

【CSS】:activeなどの疑似クラスがスマートフォンで効かない時の対処法

クリックした時や、要素の上にマウスを乗せたときのスタイルを指定できる疑似クラスはとても便利でよく使いますが、今回スマートフォンではスタイルが反映されないという現象に遭遇しました。
しばらくCSSの書き方が間違っているのかと悩みましたが、どうやら関係なかったみたいです。
で、対処法がこちら。

 

a:active, a:hover {
    background-color: red;
}
<a href="[リンク先]" ontouchstart="">リンクはこちら</a>

疑似クラスを指定した要素、今回は、aタグに対して、ontouchstart属性 を追加するだけです。
これを追加することにより、:active:hover が有効になります。
ちなみに、:active は要素がタップされたとき、ここで指定したスタイルが反映されますが、:hover は、マウスオーバー時ではなく、要素をタップ後、別の要素がタップされるまでの間、指定した要素が反映されます。

参考にさせていただいたサイトはこちらから。

:hoverに設定したCSSがスマホで反応しない時の対処|ビギナーズハイ
http://beginners-high.com/css-hover/

なお、追加する属性は、ontouchstart 以外にも、ontouchendontouchmove でも良いとのこと。

 

対処法としては以上です!
予想以上に簡単でしたので、同じことでお悩みの方は、是非お試しください。

村上 著者:村上

【MySQL】SELECT文で取得したデータを外部ファイルに書き込む方法

気付けばこの投稿が記念すべき100記事目でした。
いつも必死に書いていましたが、案外100記事ってあっという間ですね。

 

さて今回は、MySQLでSELECT文で取得したデータを ○○○.csv のような形式で、外部ファイルに書き込む方法です。
すぐやり方を忘れる or 定型文としてメモしてあるのをコピーして使っているだけなので、私のための備忘録としてまとめます。

select * from [テーブル名] INTO OUTFILE '[ファイル名]' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';

こちらを実行すると、指定したファイル名(例えば data.csv など)で新しくファイルが作られ、そこに抽出したデータが書き込まれます。

具体的には、まず「INTO OUTFILE [ファイル名]」でデータをファイルに書き込みます。
なお、既にあるファイル名を指定することはできません。
次に「FIELDS TERMINATED BY ‘,’」で、抽出したデータをカンマ区切りに変更します。
OPTIONALLY ENCLOSED BY ‘”‘」では囲み文字を指定でき、抽出したデータを指定した文字で囲むことができます。
今回は、「”(ダブルコーテーション)」でデータを囲みます。

また、サンプルコードでは指定しておりませんが、改行コードを指定することもでき、「LINES TERMINATED BY ‘\r\n’」を使います。
が、エクセルなどで開くと、いい感じに整形してくれるので、あまりこのオプションを使うことは少なそう。

 

データベースのデータをCSVファイルとして抽出できると、あとから表でまとめるときにとても楽なので、このオプションはとても重宝しています。
が、初めて使ったときは変な風に指定してしまい、おかしな形式になってしまったので、慣れるまではサンプルコードをコピー&ペーストした方が無難ですね。