2023年8月18日金曜日

Xamarinプロジェクトのエラーを解決してみた!

数年前に作成したVisual Studio 2019のXamarinプロジェクトを、まっさらなパソコンでビルドしたところ、いくつかエラーが発生しました。その解決メモです。

.NETのインストール


まず、下記のエラーが発生し、プロジェクトが「アンロード済み」となり、読み込まれませんでした。


error  : プロジェクト ファイルを開けません。 
.NET SDK バージョン 7.0.304 では、MSBuild バージョン 17.4.0 以上が必要です。
現在利用可能な MSBuild のバージョンは 16.11.2.50704 です。
global.json で指定した .NET SDK を、現在利用可能な MSBuild バージョンが求められる古いバージョンに変更します。


プロジェクトのターゲットフレームワークは「.NET Standard 2.0」です。
下記のサイトに


netstandard がターゲットの既存のコードの場合は、TFM を net5.0 から net6.0 に変更する必要はありません。
 .NET 5 と .NET 6 により、.NET Standard 2.1 以前が実装されます。

と書かれています。

Visual Studio 2019では、.NET 6以降は正式にサポートされていないため、(すでにサポートは終了していますが).NET 5をインストールする必要があります。Visual Studio Installerを使ってはうまくインストールできなかったため、.NET 5のダウンロードサイトからダウンロードし、インストールしました。

ちなみに、エラー内容にある「.NET SDK バージョン 7.0.304」は、Visual Studio 2022のインストールで「.NETマルチプラットフォームアプリのUI開発」をチェックした際に、インストールされたSDKです。

JDKのインストール


次に、Xamarin.Androidプロジェクトをビルドすると、下記のエラーが発生しました。


$(TargetFrameworkVersion) v12.0 を使用するときには、Java SDK 11.0 以上が必要です。


まっさらな環境なので、JDKもインストールしていません。
下記のダウンロードページからOpenJDK 11をダウンロードし、インストールします。


そして、[ツール] > [オプション] > [Xamarin] > [Android 設定]の「Java Development Kit の位置情報」から「JDK 構成」を開き、インストールしたJDK11のパスを指定します。


残念なことに、VS2019の仕様なのかバグなのか、VS2019を終了するとこの設定は元に戻ってしまい、起動するたびに再設定しなくてはなりません。。。

Android SDKのインストール


ビルドすると、まだエラーが発生します。


API レベル 31 の android .jar が見つかりませんでした。
これは、API レベル 31 の Android SDK プラットフォームがインストールされていないことを意味します。Android SDK マネージャー ([ツール] > [Android] > [Android SDK マネージャー...]) にインストールするか、インストールされている API バージョンを対象とする Xamarin.Android プロジェクトを変更します。(C:\Program Files (x86)\Android\android-sdk\platforms\android-31\android.jar がありません。)


API レベル 31、つまりAndroid 12が必要です。
ところが、Android SDK マネージャーを開いても、Android 12が表示されません。


下部の歯車アイコンを押下し、[リポジトリ] > [Google(サポート対象外)]の方を選択すると、「Android 12.0」が表示されるので、チェックしてインストールします。
これで無事にビルドすることができました。


またいつか、どこかで。

2023年8月4日金曜日

PHPの学習ノート②-DB接続の方法まとめ


こんにちは、せんです。

PHPの学習ノート第2回です。

 

前回の記事:環境構築


第2回はDB接続です。 

定番のPDOを含む合計4種類の方法について、簡単な使い方と使ってみた感想を記録します。 

※DBはPostgreSQLを使用

※この記事ではphp.iniの編集など、細かい説明を省略しています。


①PostgreSQL関数を使用する。


PHPのライブラリから提供される、pg_connect、pg_query、pg_fetch_allといった関数です。

PostgreSQL以外のDBについても、mysqli_connect、oci_executeなどが用意されており、使うDBに対応したメソッドを使います。


基本の書き方はこんな感じ。

引数にSQLを直接書くスタイルです。


$conn = pg_connect("host=localhost port=5432 dbname=testdb user=postgres password=***");
$result = pg_query($conn, "select * from books");
while ($row = pg_fetch_row($result)) {
    echo "id:$row[0] title:$row[1] writer:$row[2]<br/>";
}
pg_close($conn);


②PDOを使用する。


PostgreSQL関数を1番に持ってきましたが、検索するとPDOに関する記事が最も多く、現在最も定番の方法のようです。

PDOとは「PHP Data Objects」の略。

PHP5.1から使えます。


「PDOのメリット=共通のメソッドを使用するのでDBを変更しても修正が楽」という説明が非常に多いのですが、

それでは決め手にならないんじゃないか…と思うので、ほかの違いも見てみましょう。

基本の書き方はこんな感じです。

こちらも引数に直接SQLを書きます。

PDOクラスのオブジェクトを生成して接続します。


try {
    $dbh = new PDO('pgsql:dbname=testdb host=localhost port=5432 user=postgres password=***');
    $sql = 'select * from books';
    foreach ($dbh->query($sql) as $row) {
        print "id:$row[0] title:$row[1] writer:$row[2]<br/>";
    }
} catch (PDOException $e) {
    print('Error:' . $e->getMessage());
    die();
}
$dbh = null;


例外はPDOExceptionとしてキャッチされるので、try-catchで書けます。 基本は上の通りです。

PDOについて調べると、プリペアドステートメントを使用した書き方も登場します。

INSERT処理を見てみましょう。


$sql = "insert into books (title, writer) values (:title, :writer)";
$stmt = $pdo->prepare($sql);
$params = array(':title' => '赤毛のアン', ':writer' => 'モンゴメリ');
$stmt->execute($params);


values句で、あとから値をセットするプレースホルダ(:〇〇)を使っています。

SQLインジェクション対策として「PDO+プリペアドステートメント+プレースホルダ」は頻出のセットですが

PostgreSQL関数にもpg_query_paramsという関数があり、これを使えば同じことができそうです。

PHP公式ドキュメント

MySQLの場合はmysqliクラスを使ってPDOと同じように書く方法もあります。


③Idiormを使用する。


オブジェクトを操作するようにDBを操作するORMのライブラリです。

ORMなどのキーワードを追加して初めて検索結果に出てくるレベルです。

2011年に登場しました。

idiorm.phpの1ファイルを追加するだけなので、フレームワークを使用するより簡単かつ軽量に実装できる選択肢です。

公式ドキュメント

簡単な使用例はこちら。 SQLは書きません。


require_once('../idiorm.php');
ORM::configure('pgsql:dbname=testdb host=localhost port=5432');
ORM::configure('username','postgres');
ORM::configure('password','***');

$books = ORM::for_table('books')->find_many();
foreach ($books as $book) {
    echo $book->title . '</br>';
}

$newBook = ORM::for_table('book')->create();
$newBook->title = '長くつしたのピッピ';
$newBook->writer = 'リンドグレーン';
$newBook->save();


④のフレームワークと比べるとはるかに簡単に使えますが、 

複雑なクエリを実行する場合はraw_queryメソッドの引数に直接SQLを指定することになります。


④Laravelなどのフレームワークを使用する。


LaravelをはじめとしたPHPのメジャーなフレームワークには、もれなくORMが含まれています。

クエリビルダでDB操作を行うこともできますが、 ここではLaravelのORMであるEloquentの基本的なメソッドを見てみましょう。


$allBooks = Book::all();
foreach($allBooks as $book){
    echo $book->title;
}

$newBook = Book::create([
    'title' => '若草物語',
    'writer' => 'オルコット'
    ]);
    
$updateBook = Book::findOrFail(1);
$updateBook->title = 'Anne of Green Gables';

$deleteBook = Book::findOrFail(2);
$deleteBook->delete();

このコードはControllerクラスに書かれます。BookはMVCのモデルです。

createメソッドで配列を入れるあたりは見た目にも分かりやすいです。

ただ、ここまで来るまでが長いので、しっかり勉強してから使いたいです。


まとめ


DB接続について検索すると、体感8割くらいがPDOに関する記事です。

それに乗ってPDOを使うにしても、ほかの方法についていくらか知っておきたいものです。


すでに使用するフレームワークが決まっている場合はその機能を活かしたいですが、

そうでなければ①から③で選ぶことになるでしょう。


この記事が方法選択のとっかかりになれば幸いです。

ご覧いただいてありがとうございました。