月別アーカイブ 4月 2019

takahashi 著者:takahashi

FuelPHP + pdo_sqlsrv + SQL Server で「’NAMES’ は SET オプション として認識されません。」となったときの対処法

FuelPHPにSQL Serverを連携させたPHPのWebアプリを作ったときに出た問題。

SQL文自体には問題がなかったのですが、このようなエラーが発生しました。

原因はFuelPHP側の設定ファイルに文字コード設定を入れてしまっていたこと。

// fuel/app/config/db.php

return array(
    'default' => array(
        'type' => 'pdo', 
        'connection' => array(
            'dsn' => 'sqlsrv:Server=localhost;Database=hoge_db;',
            'username' => 'user',
            'password' => 'password123',
            'persistent' => false,
        ),
        'identifier' => '', 
        'table_prefix' => NULL,
        'charset' => 'utf8', //←これが原因
    )
);

charsetを入れると、DB呼び出し時にfuelが自動的に

SET NAMES 文字コード;

のようなSQL文を実行しようとします。

ところが、SQL Serverではこの”SET NAMES”オプションが廃止されており、これが原因でSQL実行時に毎回エラーになってしまいます。

対策としては

'charset' => 'utf8', 

'charset' => '', 

と書き換えれば、SET NAMESが行われなくなり、エラーが解決します。

いろいろ調べまくってやっと判明したぐらい細かい項目で、原因がわかるまで苦労しました…

お困りの方の参考になれば幸いです。

  • この記事いいね! (0)
村上 著者:村上

【未解決】「Warning: Material-UI: You cannot call prepareStyles() on the same style object more than once.」警告の対処法

タイトル通り、未解決です。
現在、修正中のアプリで「Warning: Material-UI: You cannot call prepareStyles() on the same style object more than once.」というワーニングが発生しています。
エラーではないので、これが原因でアプリが落ちることは今のところないのですが、コンソール画面で赤文字がちらつくのはやっぱり気になるので、対応している最中です。

警告文の中に Material-UI とあるのと、発生している警告文の数から、Material-UI の Cards コンポーネントのあたりに問題があるのではというところまでは特定できましたが…そこから若干難航しています。

 

なお、Material-UI の GitHub はこちらから。

GitHub – mui-org/material-ui: React components for faster and easier web development. Build your own design system, or start with Material Design.
https://github.com/mui-org/material-ui/

GitHub の issues タブに、今回の警告についての投稿がいくつかあったので、そちらにも目を通している最中です。

が、どうやら Material-UI のバグのようなので、バージョンを更新すれば対処できそう…?
と思ったのですが、現在インストール済みのバージョンは、そのバグ報告があったものよりも新しいので、修正は反映されているはず。
ちなみに、この投稿です。

[CardMedia/SvgIcon] React warning・issue #5128・mui-org/material-ui・GitHub
https://github.com/mui-org/material-ui/issues/5128

…もう少し調べてみます!

 

以上、未解決の警告「Warning: Material-UI: You cannot call prepareStyles() on the same style object more than once.」についてでした。
とりあえず、他の投稿にも目を通して、あとはバージョンの再確認をまず行いたいと思います。
あとは、怪しいと思われる要素を一つずつコメントアウトして実行し、具体的にどこの記述でこの警告が発生しているかを突き止めます。

少し前から格闘していた他のバグについては、今日ようやく対処できたので、やっとこの警告にあてられる時間が捻出できそうです。
何かわかりましたら、また報告します。

  • この記事いいね! (0)
著者:杉浦

【PHP】コードの複雑さを調べるPHP静的解析ツールPhpMetricsの紹介

 ソースコードを静的に(実行せずに)評価する際には様々な指標があります。大体、条件文の多さ、行数、クラスの数、依存関係、抽象度、意味のあるコメントの量あたりを元にして色々計算するのですが、それらすべてを把握するのは困難です。PhpMetricsはそういった指標を計算してレポートを出力してくれる静的解析ツールです。
PhpMetrics
 Composerで提供されているのでインストールは

composer global require phpmetrics/phpmetrics

で十分です。使い方もお手軽です。例えばHTML形式のレポートが欲しいなら

phpmetrics --report-html=[htmlレポートの出力先] --exclude=[調査しないディレクトリA],[調査しないディレクトリB] [調査対象のソースコードのディレクトリ] 

 これだけです。フレームワークやライブラリを用いている場合、[調査しないディレクトリ]を指定しないとそれらを、神クラス――機能が集中しすぎているクラス――扱いして結構な数の警告が出ます。
 実行結果のHTMLを見ると次の様な画面が出ます。

 PhpMetrics report
 とりあえず特に気にするべきなのが赤丸で囲ったViolationsとAverage cyclomatic complexity by classとMaintainability / complexityです。
 Violationsはバグりそう、読み難そうといった原因がはっきりしているコードをその理由付きでリスト化しています。ここに現れたものを解決するだけでいくらかマシになります。

 Average cyclomatic complexity by classはクラス毎の循環複雑度の平均です。この値が大きいと条件文などによる分岐が多いコードということです。分岐が多いと処理を追う際の組み合わせが膨大になり、テストも困難になってしまいます。
 Maintainability / complexityはソースコード中の各クラス、ファイルを図示したものです。色は危険度、大きさはコード量を表しています。この図が小さい緑丸で染まったコードが分かりやすいコードということです。

  • この記事いいね! (1)
asaba 著者:asaba

【androidJava】LocationManagerで現在位置が取れない時の処理

現在地を取得したい時はLocationManagerで取ることができますが、gpsの情報が不正確だったりgpsの許可が下りていなかった場合は nullで帰ってきてしまい正しい位置情報を取得することができません。しのぐ方法はいくつかあるのですが、自分はまず最初に位置情報を 取得させ、nullだった場合はLocationManager.NETWORK_PROVIDER(基地局からの現在位置の情報)を使いネットワークから取得 させています。

最初からgpsの設定していない場合はSettings.ACTION_LOCATION_SOURCE_SETTINGSを使ってgpsを使うように促して設定ページに移動 させます。これで最小限の設定が出来るので、後は端末のバージョンと相談しながら必要なパーミッションや機能をつければ実装完了です。


Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

if (location != null) {

  System.out.println(location + "there");

  onLocationChanged(location);

  GeoPoint homeposition = new GeoPoint(location.getLatitude(),location.getLongitude());

  mapController.setCenter(homeposition);

} else { location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

  System.out.println(location+ "null");

  onLocationChanged(location);

  GeoPoint homeposition = new GeoPoint(location.getLatitude(), location.getLongitude());

  mapController.setCenter(homeposition);

}
// GPSを設定するように促す
Intent settingsIntent =
        new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(settingsIntent);

 

  • この記事いいね! (0)
村上 著者:村上

【CSS】パーセントで指定した横幅に応じた正方形のエリアを描画する

今日、後輩の作業のお手伝いをしているときに見つけた方法です。
個人的にはかなり驚きというか、こんなことできるの!?という指定方法だったので、備忘録としてまとめ。
というか、今後絶対使うときが来る気がする。

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

横幅にあわせて正方形のエリアを作って画像を当てはめたいときの簡単なCSS – NaLabo Blog
https://www.nalabo.net/blog/2017/05/04/1009

 

実装方法ですが、まず HTML を下記のように記述します。

<div class="frame">
    <div class="content">
        <!-- 表示したい要素 -->
    </div>
</div>

で、CSS は下記のように指定します。

.content {
    width: 100%;
    height: 0;
    padding-bottom: 100%;
}

上記のように記述すると、content クラスの要素が、横幅 100% の正方形で描画されます。
ポイントは、height: 0;padding-bottom: 100%; です。
パーセント指定なので、親要素のサイズが変わっても対応できます。

正直、こんな方法があるのか…とかなり驚きでした。
なお、width: 80%; にするときは、padding-bottom: 80%; としておくと、これでも正方形になります。

 

以上、パーセントで指定された要素の横幅に応じた正方形を描画する方法でした。
かなり便利だったので、同じことでお困りの方は是非ご参考にしていただければと思います。

  • この記事いいね! (0)
著者:杉浦

【PhpStorm】インターフェイスとPhpStormで一貫性のあるコードを量産する

 インターフェイスはあるクラスが実装するべきメソッドを定義する仕組みです。あるクラスにおいてインターフェイスを用いると宣言したにも関わらず、インターフェイス内で定義したメソッドが足りないならばエラーになります。
PHP: オブジェクト インターフェイス – Manual
 例えば次のインターフェイスならば

use Illuminate\Database\Eloquent\Builder;

interface Searchable
{
    public function scopeSelectForSearch(Builder $query): Builder;
    public function scopeWhereForSearch(Builder $query, array $search_criteria): Builder;
    public function scopeSortForSearch(Builder $query, array $sort_option): Builder;
}

 次の様に実装を強要できます。

use Illuminate\Database\Eloquent\Builder;

class Hoge implements Searchable
{
    public function scopeSelectForSearch(Builder $query): Builder
    {
        // 検索用select文クエリ構築
        return $query;
    }

    public function scopeWhereForSearch(Builder $query, array $search_criteria): Builder
    {
        // 検索用where文クエリ構築
        return $query;
    }

    public function scopeSortForSearch(Builder $query, array $sort_option): Builder
    {
        // 検索用order byt文クエリ構築
        return $query;
    }
}

 インターフェイスはコーディングの自由度を下げる仕組みです。一定の制約を設けることによって一貫性を持ったコーディングを実現します。例のSearchableインターフェイスを実装したクラスならば、必ずBuilderクラスないしBuilderクラスを継承したクラスのインスタンスを引数にするscopeSelectForSearchメソッドが存在し、そのscopeSelectForSearchメソッドからはBuilderクラスないしBuilderクラスを継承したクラスのインスタンスが返ってくる、と保障されます。一人で小さいプログラムを組んでいるときには開発速度の障害であり無縁な方が良い位の仕組みですが、相手の頭の中を簡単に知れない多人数開発であったり記憶が飛ぶ様な大規模開発では、インターフェイスによるクラス設計がソースコードの破綻を防ぎます。

 インターフェイスは便利な仕組みですが、インターフェイスで定義された決まりきった構文をいちいち書いたりコピペして直したりするのは面倒です。PhpStormにはこれを自動で記述する仕組みが備わっています。
 
 Alt+Insert→メソッドの実装→実装するメソッドを選択→OK、で宣言がずらっと並びます。便利です。PhpStormのAlt+Insertからは他にも決まりきった文字列を色々出力できます。例はPHPですがJavaScriptにも対応しています。

  • この記事いいね! (0)
asaba 著者:asaba

【androidJava】gms:play-services-locationが使えない時の対処法

gmsplay-services-locationのバージョンが古かったので、アップデートしようとしたところでエラーが起きました。当然ですが新機種で使うにはアップデートが必要とのことだったので、渋々インストールしようとしたところ更に次のようなエラーが出た。(二枚目です)

could not findとのことなので、恐らくallprojectsメソッド内でgoogle()を定義し忘れていると思い目を通したら案の定何も無かった。
のでbuildscript内とallprojects内それぞれにgoogle()を定義して解決させました。
buildscript {
  repositories {
     jcenter()
     google()
}
allprojects {
 repositories { 
    jcenter()
    google()
}

google製のライブラリgms:play-services-locationを使うには、google様の名前を付けましょうねということですね。

  • この記事いいね! (0)
takahashi 著者:takahashi

eclipseにDBViewerPluginを追加する方法

無料のIDEであるeclipseですが、実はデフォルトではDBに接続・操作する機構を持っていません。
eclipse上からDBへ接続できるようにするには、プラグインを追加する必要があります。

ただ…

“新規ソフトウェアのインストール”ではリポジトリにパッケージがないため、インストールすることができません。

じゃあどうすればいいんやと困って探していたところ、こちらのサイトを発見。

DBViewerをEclipse2018-12で使用したい!! – Qiita

どうやら、DBViewerPluginを単体で入手して、eclipseのプラグインフォルダに突っ込めばいいとのこと。

まず、下記サイトからDBViewerPluginをダウンロードします。

DBViewer Plugin for Eclipse 開発プロジェクト – OSDN

バージョンはなるべく新しめの方がいいと思います。

上記サイトからプラグインのjarファイルを入手したら、これを

eclipseインストールディレクトリ/eclipse/plugin

に入れます。

eclipseに適用させるために、一旦eclipseを終了し、eclipseの本体が入っているディレクトリにある

eclipse.exe -clean.cmd

を実行します。

すると、キャッシュを一度削除したうえでeclipseが立ち上がります。

この状態で画面右上の”パースペクティブを開く”をクリックします。

すると、下の画像のようなウインドウが開きます。

一覧の中に”DBViewer”が追加されていれば成功です。

なお、実際にデータベースと接続するには、別途ドライバーが必要になります。

この辺りの設定方法についてはまた後日ご紹介します。

  • この記事いいね! (0)
takahashi 著者:takahashi

MySQL 5.7で厳格になったパスワードポリシーを解除する方法

MySQLは5.7からrootパスワードがデフォルトで設定されていたりと、なにかと面倒な仕様変更が多いのですが、その流れで今回困ったことがあったのでご紹介したいと思います。

とりあえず、開発用のテスト環境としてセットアップをしたサーバーにMySQL5.7をセットアップし、エディタからSQLサーバーへアクセスできるようにするために、いつも通り外部からのアクセスが可能なユーザーを作成しようとしたのですが…

-- 実際にはもっと予想されにくい認証情報を指定しています。
GRANT ALL PRIVILEGES ON DBNAME.* TO user@'%' IDENTIFIED BY 'PASSWD123' WITH GRANT OPTION;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

…はいでました、ポリシー違反(汗
MySQL5.6あたりまでは平気で設定できていたパスワードも、ものによっては5.7以降になると単純すぎるとはじかれます。

本番環境であれば十分に複雑で、かつ大文字や記号が入っているパスワードがベストなのはわかっていますが、開発中は手動で何度も接続しないといけない場合があるため、複雑なパスワードにしてしまうとちょっと困ります。(もちろんオフィス以外から接続できないようにするなどの別の対策はとってます。)

なんとか緩いパスワードを設定したいと探したところ、SQL上でパスワードポリシーを変更する方法を見つけました。

mysql5.7でパスワードを変更する – Qiita

MySQLのシェルに入った状態で、次のSQL文を入力します。

-- パスワードの最低文字数を4文字に変更
SET GLOBAL validate_password_length=4;
-- 要求するポリシーレベルを"LOW"に変更
SET GLOBAL validate_password_policy=LOW;

これで再度

GRANT ALL PRIVILEGES ON DBNAME.* TO user@'%' IDENTIFIED BY 'PASSWD123' WITH GRANT OPTION;

を実行してみると…

Query OK, 0 rows affected (0.00 sec)

無事成功しました。

MySQL 5.7から結構あちこち変更されているので、今までのノリで触っていると戸惑ってしまうような変更が結構ありますが、その仕様変更に当たっても、焦らずに一つ一つ解決していきたいですね。

  • この記事いいね! (0)
村上 著者:村上

【Webサービス】Base64に変換した画像をデコードできるサイト「Base64デコード」

最近、Base64 関連の記事ばかりですみません。
よく使うサイトがあるので、ブックマーク代わりにまとめ。
タイトルにもある通り、Base64 に変換した画像をデコードできるサイト「Base64デコード」です。
要は、テキストデータを画像に戻してくれるサービスです。

サイトは下記から確認できます。

Base64デコード
https://tomari.org/main/java/base64d.html

 

ページにアクセスしてもらえれば分かりますが、かなりシンプルなサイトなので、操作が分からないということはないかと。
ページ中央に「base64デコードするデータを貼り付ける。」と書かれたテキストエリアがあるので、そこに変換したいBase64データを貼り付けます。
で、あとは「表示」ボタンを押すだけです。

データ量にもよりますが、少し待てば変換された画像が表示されるはずです。
なお、コピーミスなどでデータが間違っている場合は、破損した画像ファイルが表示されるので、その際は変換前のデータを確認してみてください。

 

以上、Base64データに変換した画像ファイルをデコードして表示できるサイトのご紹介でした。
ブックマークしておけばいいものを、度々忘れてしまうのでこうしてまとめておきます。
ご活用いただければ幸いです。

  • この記事いいね! (0)