著者アーカイブ 村上

村上 著者:村上

【Android】setVisibilityを使ってボタンを表示・非表示にする方法

ちょっとボタンの表示・非表示を使うことがあったのでメモとして。

なお、今回ボタンはこのように定義しています。

// ボタンの定義
Button btn;
btn= (Button) findViewById(R.id.button);


で、ボタンを非表示にする場合、setVisibility() メソッドを利用します。

// ボタンを非表示にする
btn.setVisibility(View.INVISIBLE);
btn.setVisibility(View.GONE);

引数は、View.INVISIBLEView.GONE のどちらかを指定します。

 

そして今回迷ったのが、こちらの引数でどちらを使うのか、です。
どちらも非表示には変わりないのですが、微妙に挙動が違います。

まず、View.INVISIBLE
こちらは、単に見えなくなるだけで、ボタンの領域は確保されたままです。
CSSでいうところの、visibility:hidden の挙動と同じですね。

次に、View.GONE
こちらは、ボタンの領域を確保せず、非表示にしたボタンのエリアを詰めて表示します。
View.INVISIBLEが「隠す」というイメージに対して、View.GONE は「削除」というイメージですね。
CSSでは、display:none の挙動に近いです。

ちなみに、今回は View.INVISIBLE を使いました。

 

なお、ボタンを表示する場合はこちら。

// ボタンを表示する
btn.setVisibility(View.VISIBLE);

引数に View.VISIBLE を指定します。

 

こういう違いって、いざ使おうとするとどちらがどちらの挙動だったかをすぐ忘れてしまいます。
もしくは、引数をどう指定するかとかも忘れやすいので、今回、備忘録としてまとめてみました。
結構よく使うメソッドなので、少しでも参考になれば。

村上 著者:村上

【CSS】意外と使える背景画像のサイズを変更する方法

大した技術ではないのですが、個人的に使えると思ったのでご紹介。
タイトルにある通り、CSS の background-image で指定した画像のサイズを変更する方法です。

コードはこちら。

// 背景画像を 30px × 30pxに指定
background-image:url("背景画像のパス");
background-size:30px;

そのものずばり、background-size というプロパティを使います。
上記のコードを追加すると、背景に指定した画像のサイズが縦横30pxで表示されます。

また、上記のようにサイズをじかに指定する以外にも、パーセント指定や、containcover といった値も使用できます。
パーセントの場合は、背景画像が指定された範囲に対する画像の幅と高さをパーセンテージで指定できます。
containは、画像の縦横の比率は保持して、背景の範囲に収まる最大サイズになるように画像を拡大縮小してくれます。
coverは、画像の縦横の比率を保持するところまでは、contain と同じですが、こちらは背景の範囲を完全に覆う最小サイズになるように画像を拡大縮小してくれます。
用途によって使い分けてください。

なお、画像のサイズを、縦20px 横 40pxなど、正方形でないサイズで指定したいときは、下記のように指定します。

// 背景画像を 縦20px 横 40pxに指定
background-image:url("背景画像のパス");
background-size:40px 20px;

横のサイズ 縦のサイズ、の順番で記載します。

 

今回は、グラフのマス目を背景画像を指定して表現するというときに、このプロパティを利用しました。
background-size を使えば、マス目の大きさを変えたいときに、元画像自体を編集することなく、CSSのみで調整することができます。
ちょっとしたことですが、意外と汎用性が高そうです。

村上 著者:村上

【CSS】要素に指定した position: fixed が効かない時の対処法

そこまで長時間悩んだわけではないのですが、ちょっぴりハマったのでご紹介。

とある要素に、下記のようにCSSを指定していたのですが、スクロールした際に、親要素の下部にくっついて動くような挙動になってしまいました。

position: fixed;
bottom: 0;
left: 0;

本来は画面の下部にくっついて動かないでいてほしかったのですが、気が付けばページ自体に追従する形になっており、そこそこ慌てました。
が、親要素を確認しても、特に変な記述は見つからず…。

 

で、色々調べてみたところ、bodyに指定した下記のCSSが原因でした。

transform: translateZ(0);

親要素ばかりみていたので、これは盲点でした。

どうやら、子要素に position: fixed を指定した時、親要素に transform が指定されていると、position: fixed が希望した通りの挙動をしてくれなくなるみたいでした。

対処法としては、body に指定した transform を削除するか、下記のように !important を用いて無理矢理上書きするかですね。

// transform: translateZ(0);
// transform を解除

transform: none !important;
// !important を使って none で強制的に上書き

力業感が否めませんが…正常に動くようになったので、今回はこれで問題なしということにしておきます。

position を指定した要素の挙動がおかしくなった場合は、親要素もしくは body に transform が指定されていないか確認してみてください。

村上 著者:村上

【未解決】Xcode 9.1 で ‘Cordova/CDVViewController.h’ file not found というエラーが発生

Cordova で開発中のアプリをビルドしようとしたところ、下記のようなエラーが発生しました。

MainViewController.h:28:9: ‘Cordova/CDVViewController.h’ file not found

エラー内容は書いてある通りで、MainViewController.h というファイルで、Cordova/CDVViewController.h が見つからないというものでした。
MainViewController.h を確認してみると、確かに #import <Cordova/CDVViewController.h> の行でエラーとなっていました。

 

解決方法を調べたところ、下記の画像のように、Build SettingsHeader Search Path の値に下記のような記述があるので、

"$(OBJROOT)/UninstalledProducts/include"

こちらを、

"$(OBJROOT)/UninstalledProducts/$(PLATFORM_NAME)/include"

上記に変更すれば、実行できますとの書き込みを見つけたので、早速試してみました。

が、今回のエラーはこちらでは解決できませんでした…!
以前も全く同じエラーに遭遇したことがあり、その時はこのやり方で解決できたのですが、今回は何故かダメでした。
他にも、iOSのプラットフォームを一度削除した後、再度追加するとビルドできるとの記載もあったのですが、こちらも効果なし…。
それ以外の解決方法も検索してはいるのですが、ほぼ Build Settings > Header Search Path の値を修正するという解決策しかヒットしないので、正直手詰まりです。

もし、上記以外の解決策をご存知の方は、是非ともご教授くださいませ。
どうぞよろしくお願い致します。

村上 著者:村上

【解決済】FuelPHPでストアドプロシージャを実行する方法

以前に投稿した、FuelPHPでストアドプロシージャを実行する方法について、解決したので改めて記事にまとめてみます。
詳しくは、先日の記事をご覧ください。

【未解決】FuelPHPでストアドプロシージャを実行してデータを取得したい
https://cpoint-lab.co.jp/【未解決】fuelphpでストアドプロシージャを実行して/

今回実行するストアドプロシージャはこちら。
年と月を指定して、この期間に該当するデータを取得します。

1> EXEC dbo.user_month_report @year =2017, @month =12;
2> go

こちらは、直接ターミナルで実行すると、データが取得できるので、プロシージャには問題なし。

そして、前回のコードは下記の通り。

// 修正前
$result = DB::query("EXEC dbo.user_month_report @year =2017, @month =12;");
$result->execute();

こちらを実行すると、結果で bool(true) が返ってきてしまい、理由がわからず頭を抱えていましたが、実行の方法が間違っていました。

修正後の正しいコードはこちら。

// 修正後
$tmp = DB::query("EXEC dbo.user_month_report @year =2017, @month =12;", DB::SELECT);
$result = $tmp->execute()->as_array();

修正前のコードでは、execute() で実行したものをそのまま出力しようとしていたのですが、そうではなく、一旦変数に代入してから出力したところ、無事にデータが取得できているのを確認できました。
また、DB::query()の第二引数の$typeに SQL クエリタイプとして「DB::SELECT」を指定して、データを取得するプロシージャであることを明記しました。
これも必須の指定のようでした。

更に、取得できたデータに対して as_array() を使うと、データを配列に格納できて、扱いやすくなります。
execute() と as_array() はセットで覚えるのがおすすめですね。

以上、FuelPHPでストアドプロシージャを実行する方法でした。
ちょっとしたミスでしたが、私はこういう些細なミス程ハマりやすいので、今後もこまめに備忘録として投稿していきたいと思います。

村上 著者:村上

【PHP】PHPExcelを使うときにセルの書式設定を変更する方法

今回はPHPでのエクセルファイルの作成についてです。
ライブラリは、PHPExcelを使用しています。

 

まずは事前準備から。
ライブラリ導入は、Githubからダウンロードしてきて、requre_once で読み込むだけでOKです。
URLはこちらから。

PHPOffice/PHPExcel
https://github.com/PHPOffice/PHPExcel.git

//ライブラリ読み込み
require_once APPPATH.'../packages/excel/Classes/PHPExcel.php';
require_once APPPATH.'../packages/excel/Classes/PHPExcel/IOFactory.php';

パスは任意の場所に修正してください。

そしてエクセルファイルの作成から、編集するシートの設定までは下記の通り。

// PHPExcelオブジェクトを生成する
$book = new PHPExcel();
// テンプレート読み込み
$phpexcel = \PHPExcel_IOFactory::load('./tmp/template.xlsx');
$phpexcel->setActiveSheetIndex(0);
// カレントシート選択
$sheet = $phpexcel->getActiveSheet();
// シート名変更
$sheet->setTitle('データ');

今回はテンプレートを読み込んでいますが、もちろん新規のファイルを作成して、それを編集することも可能です。

セルに文字列や数値を入れる時は setCellValue()setCellValueExplicit() メソッドを使います。

// 数値
$sheet->setCellValue('A2', 0123);
// 文字列
$sheet->setCellValueExplicit('A1', "あいうえお", \PHPExcel_Cell_DataType::TYPE_STRING);

このあたりは分かりやすいですね。

 

本題はここから。
セルの書式設定を変える方法は下記のとおりです。

// 数値表示(小数点第2位まで)
$sheet->setCellValue('B1', 12.345);
$sheet->getStyle('B1')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER_00);
// 12.35

// 数値表示(小数点第2位まで & 3桁でカンマ区切り)
$sheet->setCellValue('B2', 8765.4321);
$sheet->getStyle('B2')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_NUMBER_COMMA_SEPARATED1);
// 8,765.43

// パーセント表示(小数点第2位まで)
$sheet->setCellValue('B3', 0.56789);
$sheet->getStyle('B3')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00);
// 56.79%

上記のように表示形式の定数が設定されており、それを指定して使用することができます。
他にもありましたが、使用頻度が高そうなのはこのあたりかな。

なお、下記のように自分で指定することもできます。

// 数値表示(3桁でカンマ区切り)
$sheet->setCellValue('C1', 12345);
$sheet->getStyle('C1')->getNumberFormat()->setFormatCode('#,##0');
// 12,345

指定方法は、エクセルのセルの書式設定の時と同じですね。

 

こちらの方法を使えば、小数値をパーセントに直すときに、100をかけて、% を後ろにつけて…なんて作業をやらずに済みますね。
というか、最初表示形式の指定方法を知らなくて、上のように文字列でパーセント表示をさせようとしてしまいました。
当たり前ですが、こちらの方が遥かに楽です。

また、エクセルを開いたときに時折見かける、「数値が文字列として保存されています」という警告も防げます。
個人的には、これが一番嬉しいですね。

ということで、PHPExcelの知っているとちょっと便利なメソッドでした。

村上 著者:村上

【PHP】DateTimeで現在日時から○日後の日付を取得する方法

後輩に聞かれたので、私と彼のための覚え書きのメモとして。

PHPには、日付と時刻を扱う DateTimeクラスがありますが、こちらを用いて、現在の日時から○日後や、○時間前の日付・時刻を取得する方法です。

DateTimeクラスについて、PHPのマニュアルはこちらから。

DateTime クラス – Manual
http://php.net/manual/ja/class.datetime.php

 

○日後を扱う前に、まず現在の日時を取得する方法は下記の通り。

// 現在の日時を取得
$now = new DateTime();
echo $now->format('Y-m-d H:i:s'); // 2017-12-05 19:05:00

DateTimeの引数を空で指定すると、現在の日時を取得できます。
それを任意のフォーマットに変換しています。

また日付文字列を引数に指定する事も出来ます。

// 日付文字列で指定した日時を取得
$date = new DateTime("2017-06-01 06:00:00");
echo $date->format('Y-m-d H:i:s'); // 2017-06-01 06:00:00

日付文字列で指定した日時を取得できます。

 

で、本題はここから。
○日後という相対的な日時を取得したい場合、modify というものを使うことにより、DateTimeで取得した日付を変更できます。

// 現在の日時の1日後の日時を取得
$date = new DateTime();
$date->modify('+1 day');
echo $date->format('Y-m-d H:i:s');  // 現在の日時の1日後の日付

または、この書き方でもOK。

// 日付文字列で指定した日時の1日後の日時を取得
$date = new DateTime("2017-06-01 06:00:00 + 1 day");
echo $date->format('Y-m-d H:i:s'); // 2017-07-01 06:00:00

上記はGoogle Chromeでしか動作検証していませんが、1日後の日付が正しく取得できました。

それ以外にも、「– 1 day」と書けば1日前、「+ 3 hour」と書けば3時間後、「+ 1 week」と書けば1週間後の日時がそれぞれ取得できます。
日付の変更は、使用頻度はそこまで高くはないのですが、ふとした拍子に使ったりするので、頭の片隅ででも覚えて置きたいですね。

 

また、今回 DateTimeクラスを調べていて知ったのですが、数値を指定して日時を取得することもできるとのこと。
このやり方については私はまだ実際に使ったことありません。

// 数値を指定して日時を取得
$date = new DateTime();
$date->setDate(2017,6,1);
$date->setTime(6,0,0);
echo $date->format('Y-m-d H:i:s'); // 2017-06-01 06:00:00

セレクトボックスから年・月・日をそれぞれ選んで、それらを日付に変換するときとかに使えそうですね。
が、今回はDatepickerを使っているので、使うことはなさそうです。

村上 著者:村上

【未解決】FuelPHPでストアドプロシージャを実行してデータを取得したい

タイトルにある通り、今回の記事はまだ未実装、というか実現できていないことについて。
ということで、もし解決策をご存知の方がいらっしゃれば、何卒ご教授くださいますようお願い致します。

 

ストアドプロシージャについては、こちらの記事がわかりやすいかと。

ストアドプロシージャの基本的ななにか – Qiita
https://qiita.com/setsuna82001/items/e742338eb93e3a48ba46

こちらの記事によると、ストアドプロシージャとは「データベース上での一連の処理に、名前をつけて関数のように呼び出して使用できるもの」とのこと。
データベース上で動作が完結するので、開発言語に依存しません。

 

FuelPHPについて、公式サイトはこちらから。

FuelPHPドキュメント
http://fuelphp.jp/docs/1.7/

FuelPHPは、PHP5.3以上を対象に開発されたWebフレームワークです。
他のフレームワークに比べて規約が少なく、また高速で軽量なため、使いやすいのが特徴です。

こちらのサイトもご参考に。

高速で軽量なフレームワークFuelPHPを使う
http://www.buildinsider.net/web/bookphplib100/096

 

そして、今回実現したいのは、この両方を利用して、データベースからデータを取得する方法についてです。
実行するストアドプロシージャはこんな感じ。

1> EXEC dbo.user_month_report @year =2017, @month =12;
2> go

※実際に動作させているものとは異なります。

こちらをターミナルで実行すると、望んだとおりの結果が得られます。
したがって、ストアドプロシージャ自体には問題はなさそう。

が、こちらを下記のように FuelPHP で実行すると、結果が何故か bool(true) が返ってきます。

$result = DB::query("EXEC dbo.user_month_report @year =2017, @month =12;");
$result->execute();

ストアドプロシージャに問題がないようなので、十中八九 FuelPHP が原因というのは分かるのですが、その解決策がどうしてもわかりません。
FuelPHPのドキュメントにも、ストアドプロシージャの実行方法についての記述がないため、そもそも対応していないのでしょうか。

ちなみに、FuelPHPのフォーラムに、「DB Class with mysql – select from stored procedure」という、今回の状況に似たような投稿があったのは見つけました。
その中で、DB::query()の第二引数の$typeに SQL クエリタイプとして「DB::SELECT」を指定するといいとの記述があったので試してみましたが、残念ながら結果は変わりませんでした。

参考にしたフォーラムの投稿はこちら。

DB Class with mysql – select from stored procedure
https://fuelphp.com/forums/discussion/4299

 
新しいライブラリやフレームワークを使うのは、やはり難しいですね。

村上 著者:村上

【CSS】DIV要素を上下左右で中央揃えする方法(IE、Safari対応)

使用頻度は高めだけど、良く忘れるので備忘録として。
今回は今回は子要素を上下左右で中央揃えにするやり方について。
なお、同じ方法で画像の中央揃えも実現できます。

HTML、CSSのコードはこんな感じ。

<!-- HTML -->
<div id="parent">  <!-- 親要素 -->
    <div id="child"></div>  <!-- 子要素 -->
</div>
/* CSS */
#parent {
    background-color: blue;
    height: 200px;
    width: 200px;
    position: relative;
}
#child {
    background-color: green;
    height: 100px;
    width: 100px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    -webkit-transform: translate(-50%, -50%);
    -moz-transform: translate(-50%, -50%);
}

このとき重要となってくるのが、親要素に指定された position: relative; と、子要素に指定された position: absolute; です。
これがあることで、子要素が表示される際の基準位置が親要素の左上となります。

そして、子要素の top、left をそれぞれ50%とすることで、子要素の左上の位置を親要素の中央に来るようにしています。
が、これでは左下に移動しすぎなので、transform: translate(-50%, -50%); で子要素の縦横それぞれの50%分だけ左上に移動させて、ちょうど親要素の上下中央に子要素が来るように調節しています。

 

やっていることは以上です。
他にも上下中央揃えする方法はあるようですが、今回の書き方を使ったところ、IESafariなど、表示が崩れやすいブラウザで表示した時に崩れなかったので、個人的にはおすすめの書き方です。
IEやSafariでデザイン崩れに悩まされている場合は、こちらの書き方をお試しになってみてはいかがでしょうか。

村上 著者:村上

【PHP】指定した値の範囲でランダムな少数の値を生成する方法

ランダムな整数の生成なら、rand() 関数が用意されていますが、今回は少数値が必要だったので、生成方法をご紹介。
PHPのマニュアルに掲載されていたものですから、少し調べればわかるやり方ではありますが、今後も使うことがあるだろうという事で、備忘録も兼ねています。

 

まずはランダムな整数の生成から。
こちらは簡単で、rand() 関数を使用するだけ。

// rand() 関数
int rand ( int $min , int $max );

// 実行例
$random = rand(1, 10);

引数は省略可ですが、指定した場合は、この範囲内で収まる値で乱数を返してくれます。
上記の実行例だと、1から10の範囲内の乱数が生成されます。

PHPマニュアルはこちらからご確認ください。
http://php.net/manual/ja/function.rand.php

 

お次はランダムな少数値の生成方法。
この場合は、mt_getrandmax()という、mt_rand() 関数が呼ばれた際に返される最大の値を返す関数を利用しています。

なお、mt_rand() はランダムな整数を生成する関数です。
乱数を返す機能としては rand() 関数との違いはなさそうですが、PHPマニュアルによると、rand()よりも4倍以上高速に乱数を生成してくれるのだとか。

ランダムな少数を返す関数は下記の通り。

// ランダムな少数値を返す
function randomFloat($min = 0, $max = 1) {
    return $min + mt_rand() / mt_getrandmax() * ($max - $min);
}

// 実行例
$random = randomFloat(0, 100);

こちらを実行すると、0から100の範囲でランダムな少数値を返してくれます。
ちなみに、こちらの関数も引数は省略可です。

 

と、いう事で、ランダムな少数値の生成方法でした。
なお、0から1の間で乱数を返す関数でしたら、lcg_value() という関数もあるそうでしたが、こちらは乱数の精度があまりよくないとのこと。
また、値の範囲が0から1というのも、少し汎用性が悪い場合がありそうですから、小数値の乱数生成なら上記の関数がおすすめです。