一人情シスのつぶやき

名古屋の中小企業で一人情シスをしている作者が、日々の業務で思うことをつぶやきます。

C#におけるIEnumerable,IEnumerator

IEnumerable(IEnumerator)はIListに比べると制約が多く、同じことをやろうとしても面倒、その分汎用性が高い、くらいに思ってました。

実際には、IEnumerableには要素の編集が一切できないのが最も大きな違いだと思います。

stackoverflow.com

System.Linqを参照に追加すればIEnumerable.Appendが利用できますが、これはIList.Addとは違い非破壊的メソッドで自身は変更せずに要素を追加した新しいオブジェクトへの参照を返すだけです。 逆に言うと、一度設定したら編集しないCollectionを利用する場合はIEnumerableとして公開すればそとから編集されないことを保証できます。

Java(Android)のService, Application(Context)

AndroidにてActivityにまたがる処理を行う処理を記述するには、Bound Serviceを使う必要がある。bindeServiceの引数ServiceConnectionのコールバック関数onServiceConnectedにて渡されるIBinderでServiceオブジェクトを取得し、必要なメソッドを実行できる。

SQLiteへの保存処理をこれで行おうと考えたのだが、そのためのSQLiteOpenHelperにはContextが必須となっている。

ServiceはActivity(Contextを継承する)に依存したくないために利用しているので、そのままContextを取得できない。 必要なメソッドの引数に都度Contextを指定する手も無くはないが、メソッドが増えるほど面倒さが増すし、そもそもDatabaseへのconnectの条件としてcontextが必要なので、メソッドの呼び出しの都度Databaseへの再接続が発生してしまう。

ApplicationもContextを継承している。これならどこからでも呼び出せそうだが、Applicationインスタンスを取得するにはActivityのメソッドを呼び出す必要がある... ということで、Applicationを継承した独自クラスを作成し、Singletonとしてインスタンスを取得すると良いとわかった。よく使われている手法らしい。

kazuooooo.hatenablog.com

これら独自Service, Applicationを利用する際の注意事項として、Application.manifestに宣言をしないといけない。これを忘れるとそれらをインスタンス化できずにnullになってExceptionが発生するが、エラー内容を一見してApplication.manifestが原因だとは判別できない。

Androidの各種メソッド・ライブラリには、この手のContext前提のものが多い。今回のSQLiteのライブラリに関しては内部で呼び出しているFileアクセスがContext前提となっているためのようだ。ただ、それがなぜContext前提にする必要があるかは理解できていない。C#WPF, UWP関連でも似たような制限があった気がするので、現代的なアプリ開発には必要なセキュリティなどのための必須仕様なのかもしれない。

AndroidStudioでEmulatorが起動するも接続できない。

Android Studio 3.2.1(Windows64)にて、Emulataorが起動するのにアプリが全然起動しない状態になりました。 最下部にandroid waiting for target device to come onlineと表示されたままで変化せず、LogcatのデバイスリストにはにはDisconnectedと表示される状態。

stackoverflow.com

のMarkDubyaさんが言うように、adb kill-serverを実行したらアプリが起動し、Logcatにログが出力されるようになった。 Windows 10でのadb.exeはC:\Users\(ユーザー名)\AppData\Local\Android\Sdk\platform-toolsにあった。

Chromeの自動更新

Chromeの自動更新をADのグループポリシーで行っている。

support.google.com

を参考に設定したが、更新されない。 以下の設定を追加で変更したところ、うまく動作するようになった。

  • [Google Update]-[Application]-[Google Chrome]
    • Allow installation: 未構成 → 有効
  • [Google Update]-[Preferences]
    • Auto-update check period override: 1400 → 60

Excelでオプションボタン

利用者が使い慣れたExcelでアンケートシートを作ろうとした際のこと。

どれか1つを選択してほしい場合は、オプションボタンを使う。開発タブにあり、フォームコントロールActiveXの2つがある。

  • フォームコントロール

    • フォントの見た目がActiveXと比べればマシ。
    • グループ化するのに、グループポックスを使用しないといけない。
      • 行や列の追加・削除でグループボックスに入ったり外れたりすると挙動が想定外となる
      • レイアウト上、グループボックスが不要な場合は非表示にしないといけない。が、非表示にするとどこにあったかわからなくなる。
      • 誤ってグループボックスが重なったりするとやはり想定外の挙動となる。
  • ActiveX

    • グループ化するのにグループ名を指定できるので、フォームのように想定外の動作をすることはない
    • フォントの見た目がひどい。クリックしたときとそうでないときで大きさが変わる?
    • 項目Aを選択し、項目Bを選択してさらに項目Aを選択...と繰り返すと、どんどんフォントが大きくなる(致命的)

ActiveXのフォントが大きくなる不具合は致命的なので、グループボックスの位置に注意しながらフォームコントロールを使うことにした。 どちらの場合もだが、オプションボックスをセル内に収まるようにしないと、セルの追加で配置がずれてしまうので注意。

NECのEXPRESSSCOREのJavaアプレットが動かない

当社ではNEC製サーバを導入しているのだが、NECサーバではサーバのステータス確認や設定変更にEXPRESSSCOREというWebコンソールが利用できる。 これが、一部機能がJavaアプレットで動く仕様になっている、今時...

BIOS等の更新が出ているので適用しようと思い、現在のバージョンを確認しようとすると、このアプレットか、サーバを再起動して起動画面で確認するしかない...

今時Javaアプレットが動くのはIESafariくらい。JREは8までしかサポートしない。 Windows 7IEでなんとか動かそうとするのだが、反応しない。

通常のブラウザで確認できる画面にsshの項目があり、これを有効にしたところsshでログインできた。ほしいバージョン情報も取得できた。 ただ、このまま開放しとくのも気持ち悪いので、必要なときだけsshを有効にする運用とした。