窓を作っては壊していた人のブログ

提督の窓や成績の窓を作ってました.今では適当に好き勝手に開発をしてます.

Xamarin.Forms 2.4.0系を使うとiOSのListViewとLabelの組み合わせてNullReferenceExceptionで落ちる

タイトルのとおりです.

現在Xamarin.Forms 2.4.0.282でアプリケーションの開発をしていたのですが,なぜかiOSでのみListViewにカスタムCellを入れてLabelをモデルのバインディングで表示させるとNullReferenceExceptionで落ちる問題が発生していました.

どうも同様の報告が既になされていたようです.

59813 – "NullReferenceException" in "Xamarin.Forms.Platform.iOS.Renderers.LabelRenderer.cs" within "UpdateText()" & "UpdateTextColor()"

データを取ってきて,そのままListViewにバインディングするというシンプルなアプリケーションでは再現しないのですが,フィルタリング機能をつけたり,ItemSourceの長さが増減するようなアプリでのみ再現するっぽい感じです(検証してみた結果

どうしようもないので 2.3.5.239-pre6ぐらいに落として運用しています.

納期が近いのにこれを引き当ててしまってなんといいますか,今年は運がなさすぎる...

Visual Studio for Macで netstandard 2.0なプロジェクトでXamarin.Formsを使ってみる

注意!!!!!!

以下の手段でタイトルの件は試すことが出来ますが,現在手元のVisual Studio for Mac 7.3.0.692で,jsonファイルを開くとVisual Studio for Macの動作が不安定,またファイルを閉じようとするとクラシュする問題が発生しています. 試す方は自己責任で...


Beta Release: 15.5 Preview 1 | Xamarin Releases

つい先日 Visual Studio for Mac 7.2のStableがリリースされたばかりですが,さっそく7.3のPreviewも配信され始めました.

その中でも非常に注目なのが,Xamarin.Forms 2.4を使用し,netstandardなプロジェクトで開発できるようになったことです.

Xamarin.Forms 2.4.0 Service Release 1 - Xamarin

公式でもアナウンスされていましたが,リリースされたときから

> NET Standard support does not work completely with Visual Studio for Mac. We highly recommend waiting for an update and service release. The work to improve this support is being tracked here.

と言われてビルドをすることが出来ませんでした(xamlの埋め込みの問題でしたっけ?)

ですが,今回のアプデにより以下の Xamarin.Forms 2.4対応のコミットがマージされたことにより試すことが出来そうです.

Merge pull request #3159 from mono/d15-5-support-xamarin-forms-2.4 · mono/monodevelop@0a9c6a5 · GitHub

それでは実際に試してみましょう.


あれ,実はもう7.2でもxamlファイルが見えなくなったりするバグはあれど出来そう...

https://developercommunity.visualstudio.com/content/problem/127509/xaml-forms-page-issue-in-net-standard-project-vs-7.html


やり方は概ね

www.nuits.jp

id:nuitsjp さんの記事を追っていけば問題ないのですが,ここで変更点が一部あります.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Compile Update="**\*.xaml.cs" DependentUpon="%(Filename)" />
    <EmbeddedResource Include="**\*.xaml" SubType="Designer" Generator="MSBuild:UpdateDesignTimeXaml" />
  </ItemGroup>
  
  <ItemGroup>
    <PackageReference Include="Xamarin.Forms" Version="2.3.5.256-pre6" />
  </ItemGroup>
</Project>

こう書かれているものを,

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  
  <ItemGroup>
    <PackageReference Include="Xamarin.Forms" Version="2.4.0.282" />
  </ItemGroup>
</Project>

こう変えます,更にシンプル!!

自分で EmbeddedResource などと記述してしまうと,もともとXamarin.Forms 2.4のビルドタスクに含まれているxaml関係のタスクとかぶってしまって,

Duplicate 'Compile' items were included. The .NET SDK includes 'Compile' items from your project directory by default. You can either remove these items from your project file, or set the 'EnableDefaultCompileItems' property to 'false' if you want to explicitly include them in your project file. For more information, see https://aka.ms/sdkimplicititems.

と出て怒られてしまうからです.

その後一度このnetstandardなライブラリのみでビルドをかけて,その後iOSAndroidの実行などをするとうまく通ります. だめだったらcleanして試しましょう.

追記

以上の方法で現在開発しているプロジェクトを書き変えて実装を進めています. 残念なことにファイルダイアログなどを使用して,新しいxamlファイルを作成すると,csprojファイルに自動的に依存が追加されてしまってビルドが通らなくなります. 毎回自分でcsprojを編集して,embeddedの欄を消す必要があるようです...めんどい

またその方法で削除すると,UnloadしてReloadするまでそのxamlファイルがプロジェクトから見えなくなります...なんだこれは...

更に追記

それからこの問題に関するBugzillaを監視していたのですが,最近おもしろいハックが紹介されていたので紹介します.

59286 – Xamarin.Forms default MSBuild items not handled

Xamarin.Forms.AddinのContentViewとかのテンプレートファイルに対してSubType="Designer"を加えるだけ.

実際に試してみましたが,どうも良さそうな感じでした.

以上です.

Visual Studio for Mac の Alpha channel で苦しめられてきた日本語入力問題が直った

日本時間では今朝7時ぐらいに配布された15.4のアップデートで先日辺りに書いた日本語入力問題が直ったMonoが配布されました.

これでやっとMono 5.7系を使って完全なる人柱をしなくて済みそうです.頑張ってPR出してよかったー

なおXamarin.Forms 2.4系 + netstandard2.0 の問題はまだ直っていない模様...

SECCON Beginners 2017 仙台に参加してきた(ネタバレ含)

2017.seccon.jp

3つの講義を受けて後の演習で実際に難問か解くというもの. ビギナーの私にも理解できるような非常に丁寧で面白い講義でした.

以下覚えてることを適当に解き方と一緒に書く.

続きを読む

日本語を含むC++のプロジェクトをAppVeyorでビルドしたらはまった

Raspberry Piに喋らせてみるみたいなことで使ってる人もいるのかもしれない OpenJTalk. これをC# でラップして,ライブラリ化して使いたいなと思ったためちょこちょこと作業をしていました.

実際のC/C++のプロジェクトがこちら

GitHub - yamachu/LibOpenJTalk: Unofficial OpenJTalk mirror

そして成果物のC# ラッパーがこちら

github.com

以前このブログでも紹介したように各プラットフォームでネイティブのライブラリをビルドし,DllImport属性などを使ってラップしていくやり方で行っていたのですが,どうもWindows環境で日本語をネイティブ側に渡そうとすると文字コードの問題が発生してしまうと言った問題が起こりました.

結論としてはAppVeyorの言語ロケールが英語になっていたため,ソースコードUTF-8で保存されたものと解釈しそのままビルドが行われたりしたことが問題でした. またコマンドラインオプションを使用しないとビルドすら通らなかったため,AppVeyorでビルドする際はそのあたりも考えたほうが良かったみたいです.

まずはビルドを通るようにするには,cl.exe のオプションに対象ソースコード文字コードを記述します. 自分はSJISで保存されたファイルだったので /source-charset:.932 を追記しました.

こちらの記事が非常に参考になりました.

Visual C++(cl.exe)で UTF-8 のファイルをコンパイルする - Bite Code

この修正によりビルドが通るようになりましたが,複数のwarningが発生し,また生成されたライブラリで日本語の扱いがうまくいかないバグが発生しました. 実際の warning は以下のとおりです.

c:\projects\libopenjtalk\text2mecab\text2mecab_rule_shift_jis.h(75): warning C4566: character represented by universal-character-name '\u3000' cannot be represented in the current code page (1252)

ここの 1252 は Windows-1252 - Wikipedia のことを指します.

どうもロケールを変えてcode pageを今回ではSJISの932に変えてあげる必要がありそうです.

やり方は流石にAppVeyorとかのドキュメントに書いてあるだろうと思ったのですが,実際載ってなくてIssueを漁っていたら発見できました.

Support a different code page · Issue #846 · appveyor/ci · GitHub

日本語環境では

init:
- ps: Set-WinSystemLocale ja-JP
- ps: Start-Sleep -s 5
- ps: Restart-Computer

こんな感じです. ちなみにこのStart-Sleepを抜くと処理が返ってきません(このCIを回して他の作業をしていたのですが通知がこなくて見てみたら止まっていましたw)

こんな感じで日本語を含むプロジェクトでもAppVeyorでいい感じにビルドできそうです.

このミスに気づくのに数日かかったの本当に辛いお気持ちです…

私のネタ帳 - 随時更新 -

2017/09/04

  • dotnet code-generator の Visual Studio for Mac 向けのラッパーアドイン
    • (9/5) 雛形は完成したけど,gtkでダイアログ作らないとなのでMono developインストールしないと…
  • csx を使った Realm の初期データ挿入のマイグレーション支援アプリケーション

2017/09/06

最新の Mono のビルドをしている.

git clone --recursive --depth 1 https://github.com/mono/mono.git --branch master --single-branch で最新コミットとサブモジュールを全部引っ張ってきて,./script/mac-sdk-なんちゃらを叩く.

実際 Mono だけのビルドであれば他のビルド方法がある(Qiitaの私の記事参照)

ビルド中にllvmのビルドが始めるのだけれど,Valgrindのヘッダが見つからずビルドに失敗するので,llvmのビルドが始まる前にstage/includeにvalgrindのヘッダをコピーしておく. このディレクトリは実行権限ぐらいしかなくて,書き込みができないので,sudoで無理やり入れてからchownで戻すのがいいだろう.

追記

fsharpくんのビルドで落ちるからビルド対象から除いた.

更に追記(9月19日)

どうも自分のMacの環境が悪いんじゃないか疑惑. まっさらな状態にして再度ビルドをかけたらすんなりいった. そこで使ったビルドの手順は

Monoのビルドの時のコマンドメモ · GitHub

諦めが悪いので再度PRを出した

[gtk] Fix crashing when using Third-party IME by yamachu · Pull Request #49 · mono/bockbuild · GitHub

ASP.NET Core と Realm Object Serverを使ってクライアントとマスターデータの共通化を試してみたい

雑記とメモです.

現在作っている東北大学大学祭アプリのデータベースにRealmを使用しています.

昨年はサーバーはPythonDjangoで作成して,データベースはMySQLを使用していました. しかしクライアント側はRealmを使用していて,同期の難しさが問題となっていました.

そこで今回はサーバーサイドもRealmにしてしまいました. いいタイミングで.NET Core対応も来ていたところでもあるので.

blog.realm.io

そこで詰まったことと気づきをちょこっと書いていきます.

気づきとかつまったところ

  • 他のユーザーとデータベースを共有する設定のやり方がわからない

realm://{Realm Object Serverのアドレス}:{ポート}/__admin を開いて Permission のところで権限を与えたいユーザを追加する. 自分はこの方法でやったけれども,絶対に別の正しいやり方があるはず…

  • mayRead を与えた DB に書き込めない

ローカルのコピーになら書き込めるんでしょとか適当に考えていたらダメだった. 今回はマスターデータに追加のフィールドとしてお気に入りとかの boolean を追加したいと思っていたのだけれども,ダメそうなのでローカルに新たにそれ専用のフィールドを持った DB を作ってそちらに書き込む.

  • masterデータを管理するユーザに関して

今回は運営の人にデータを入れてもらうので,Admin以外で運営専用のアカウントを作成.間違って他のテーブルを破壊されても困りますしね.

  • Dockerで EXIT 99 になって動かない

未解決,どうしよう.とりあえずログ見てみよう.

  • Credentials.UsernamePassword(ユーザー名, パスワード, false)にしてるのに,create が常に True になる

こればっかりは本当に原因がわからなかった.dotnet clean とか rebuild とか試してたらいつの間にか出来るようになってた.

  • (追記)プロジェクトのある型だけをSchemeとして使用したい

JavaとかSwiftのやつでは見覚えがあって,dotnet ではどうするんだろうと悩んでいたけれども,頑張ってAPIドキュメントを探すと見つかる.

Class RealmConfigurationBase | Realm

と思ったらちゃんと書いてある…

https://realm.io/docs/xamarin/latest/#class-subsets

  • (追記 8/30) dotnet コマンドでビルドが出来ない

公式ドキュメントに

The dotnet command line tool is not supported when building for .NET Core. Please use Visual Studio or the msbuild command line tool to build your project.

こうあるように,Visual Studio を使うか,MSBuild コマンドでビルドすればいい. で,不親切なことに近くに MSBuild での注意点が書いてない…

ビルド方法は CI でビルドする時,みたいな Q&A を参考にすれば良い

VSCode とかでビルドタスクを書いてもいいし,コマンドラインから以下の様にすれば Fody のタスクが走って,いい感じに Realm が使える.

msbuild /p:SolutionDir=$(pwd)

(追記 9/5)

実際毎回 SolutionDir のパラメータを付けるのは面倒なので,ちょっとした対策をしてみた.

ソリューションファイル(.sln) があるのであれば,そのディレクトリとの相対パス

<PropertyGroup>
    <SolutionDir>..\</SolutionDir>
  </PropertyGroup>

こんな感じで csproj に追加してあげる.これで msbuild 一発で通るようになる.


また何か辛くなったら追記しよう.

また学祭アプリはサーバーサイドもクライアントサイドもいい勉強材料だったり,イベントに使用できるテンプレートでもあるので,公開準備ができ次第公開します.

(追記 8/30) ちょっとした雛形は github.com で公開しています.

使用している技術としては

  • ASP.NET Core MVC + Razor Pages
    • 独自のトークン認証機構のMiddlewareとかその辺も盛り込んでます
  • Realm
  • Xamarin.Forms
  • Docker
  • MySQL(Realmで管理しないユーザーの登録とかアンケートの集計関係)
  • Redis(発行したセッショントークンの管理)

デプロイ先はAzure VMを予定.

十分話せる内容ですね,勉強会で登壇する内容が増えて嬉しい(?