<?xml version="1.0" encoding="UTF-8" ?>
<rss version="0.91">
  <channel>
    <title>隠居SEの備忘録</title>
    <description>やったことの記録
主にlinuxとかperlとか</description>
    <link>https://inkyose.gjgd.net/</link>
    <language>ja</language>
    <copyright>Copyright (C) NINJATOOLS ALL RIGHTS RESERVED.</copyright>

    <item>
      <title>selenium + headless chrome でのダウンロードが失敗する</title>
      <description>最近、selenium + chrome (headless) + タスクスケジューラで動かしてるプログラムがよくコケるようになった。&lt;br /&gt;
気にはなってたけど、手動で動かすと動いていたので調査を後回しにしてたら、今日全く動かなくなった。&lt;br /&gt;
仕方ないので重い腰を上げて調査したら、headlessでなければ動くのとエラーが出る時は以下のようなエラーが出ることが分かった。
&lt;pre&gt;[1212/084929.223:INFO:CONSOLE(11)] &quot;Uncaught (in promise) NotAllowedError: play() failed because the user didn't interact with the document first. https://goo.gl/xX8pDD&quot;, source: https://～～～ (11)
&lt;/pre&gt;
どうやら動画再生回りでコケている模様。&lt;br /&gt;
でも、取得してるページは特に動画を扱うページではないんだけど．．．&lt;br /&gt;
広告かな？&lt;br /&gt;
&lt;br /&gt;
キーワードを試行錯誤しつつググって以下のページを発見。&lt;br /&gt;
&lt;span style=&quot;font-size: large;&quot;&gt;&lt;a href=&quot;https://qiita.com/nukisashineko/items/decf54efc2c8b3c201e1&quot; title=&quot;&quot;&gt;chrome(v66以降)でseleniumテストが動画の自動再生でハングする - Qiita&lt;/a&gt; &lt;/span&gt;&lt;br /&gt;
なので、書いてあるとおり、
&lt;pre&gt;--autoplay-policy=no-user-gesture-required
&lt;/pre&gt;
と言うオプションを追加したら、解決しました。</description> 
      <link>https://inkyose.gjgd.net/%E6%9C%AA%E9%81%B8%E6%8A%9E/selenium%20-%20headless%20chrome</link> 
    </item>
    <item>
      <title>[munin] [FATAL] There is nothing to do here, since there are no nodes with any plugins.</title>
      <description>９月１２日にmuninがアップデートされてから、&lt;br /&gt;
５分置きにエラーメールが送られてくるようになりました。&lt;br /&gt;
&lt;br /&gt;
送り主は&amp;nbsp;/usr/bin/munin-cron&lt;br /&gt;

&lt;pre&gt;[FATAL] There is nothing to do here, since there are no nodes with any plugins. Please refer to &lt;a class=&quot;moz-txt-link-freetext&quot; href=&quot;http://munin-monitoring.org/wiki/FAQ_no_graphs&quot;&gt;http://munin-monitoring.org/wiki/FAQ_no_graphs&lt;/a&gt; at /usr/share/munin/munin-html line 40&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
最初はあまり気にしてなかったのですが、&lt;br /&gt;
あまりに沢山通知が来るし、ログは膨らむし、どうやらグラフの更新も止まってるようなので、&lt;br /&gt;
指示されたページに書かれたことをすべてやってみるも、&lt;br /&gt;
全く効果なし＿|￣|○ il||l&lt;br /&gt;
&lt;br /&gt;
ネット検索でもなかなか有益な情報が得られず、結構時間を無駄にしましたが、&lt;br /&gt;
検索条件を１ヶ月に絞ったらあっさりヒット。&lt;br /&gt;

&lt;h2 style=&quot;box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom: 1px solid #eaecef; color: #24292e; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';&quot;&gt;&lt;a href=&quot;https://mgng.mugbum.info/1454&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: #0366d6; outline-width: 0px;&quot;&gt;munin で [FATAL] There is nothing to do here, since there are no nodes with any plugins. メールが届きまくる：犬ターネット&lt;/a&gt;&lt;/h2&gt;
&lt;br /&gt;
/etc/munin/munin.conf&lt;br /&gt;
のlocalhostのところのコメントを外すだけでした。&lt;br /&gt;

&lt;pre&gt;#
# A simple host tree
#
[localhost]
      address 127.0.0.1
      use_node_name yes
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
有益な情報をありがとうございますm(__)m</description> 
      <link>https://inkyose.gjgd.net/%E6%9C%AA%E9%81%B8%E6%8A%9E/-munin-%20-fatal-%20there%20is%20n</link> 
    </item>
    <item>
      <title>libsepol.print_missing_requirements: munin's global requirements were not met: type/attribute munin_services_plugin_t (No such file or directory).</title>
      <description>タイトルのエラー、結構悩みました。&lt;br /&gt;
&lt;br /&gt;
audit.logにmunin関係のエラーがたくさん出てたので、&lt;br /&gt;
ポリシーの修正を試みたところ、タイトルのようなエラーが出ました。&lt;br /&gt;

&lt;pre&gt;# grep munin /var/log/audit/audit.log | audit2allow -M munin
# semodule -i munin.pp
libsepol.print_missing_requirements: munin's global requirements were not met: type/attribute munin_services_plugin_t (No such file or directory).
libsemanage.semanage_link_sandbox: Link packages failed (No such file or directory).
semodule:  Failed!
&lt;/pre&gt;
&lt;br /&gt;
munin_services_plugin_t が登録されて無いのか？と思って、&lt;br /&gt;

&lt;pre&gt;semanage permissive -a munin_services_plugin_t
&lt;/pre&gt;
&lt;br /&gt;
したりもしましたが、全く効果なし。&lt;br /&gt;
&lt;br /&gt;
他にもいろいろやりましたが、どれもハズレ。&lt;br /&gt;
&lt;br /&gt;
ネット検索も色々やってみたものの、回答には結びつかず。&lt;br /&gt;
&lt;br /&gt;
で、半ば諦めかけた頃になって、答えにたどり着きました。&lt;br /&gt;
&lt;br /&gt;

&lt;pre&gt;# grep munin /var/log/audit/audit.log | audit2allow -M munin2
# semodule -i munin2.pp
&lt;/pre&gt;
&lt;br /&gt;
なら通る。&lt;br /&gt;
そう、munin.ppと言う名前が既に使われているからダメな模様。&lt;br /&gt;
名前を変えればいいだけでしたとさ。&lt;br /&gt;
&lt;br /&gt;
う～ん、難しい＿|￣|○ il||l</description> 
      <link>https://inkyose.gjgd.net/%E6%9C%AA%E9%81%B8%E6%8A%9E/libsepol.print_missing_req</link> 
    </item>
    <item>
      <title>正しいSQLインジェクション対策とは</title>
      <description>&lt;p&gt;ネットを徘徊していて、&lt;br /&gt;
未だSQLインジェクション対策について誤解されている方が多いのかな？と感じることがあったので、&lt;br /&gt;
ここに正しいSQLインジェクション対策とはどう言うものかを簡単に記載しておきます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
そのために、まずSQLインジェクションとは何かをかいつまんで説明します。&lt;br /&gt;
&lt;br /&gt;
SQLインジェクションとは、SQL文に差し込まれたデータによってSQL文が改変され、&lt;br /&gt;
意図しない結果を返してしまうことを言います。&lt;/p&gt;
&lt;pre&gt;$id = &quot;1234&quot;;
$pass = &quot;' or pass != '&quot;;
select * from account_table where id = '$id' and pass = '$pass';
&lt;/pre&gt;
&lt;pre&gt;select * from account_table where id = '&lt;strong style=&quot;font-family: Arial, メイリオ, sans-serif;&quot;&gt;1234&lt;/strong&gt;&lt;span style=&quot;font-family: Arial, メイリオ, sans-serif;&quot;&gt;' and pass = '&lt;/span&gt;&lt;strong style=&quot;font-family: Arial, メイリオ, sans-serif;&quot;&gt;' or pass != '&lt;/strong&gt;&lt;span style=&quot;font-family: Arial, メイリオ, sans-serif;&quot;&gt;';&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;
そしてその原因は、外部から入力されたデータ（入力データ由来の保存データも含む）を用いて動的にSQL文を組み立てることにあります。&lt;br /&gt;
（上記はデータの差し込みですが、order by句などでカラム名を差し込む場合も同じです）&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ですから、正しいSQLインジェクション対策とは、&lt;br /&gt;
&lt;strong&gt;動的にSQL文を生成しないこと&lt;/strong&gt;になります。&lt;br /&gt;
&lt;br /&gt;
そして、静的SQL文のみでアプリケーションを組み立てるには、&lt;br /&gt;
プレースホルダを使わなければならないと言うことです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ですから、プレースホルダを使っていても、&lt;br /&gt;
外部から入力されたデータがSQL文に混入するような動的SQL文の構築を行っていたのでは、&lt;br /&gt;
全く意味はありません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ソート順をユーザーに選択させるようなシーンは滅多にないでしょうし、&lt;br /&gt;
必要な場合でも結果をすべて読み込むようなケースであれば、&lt;br /&gt;
アプリ側でソートすれば済む話です。&lt;br /&gt;
（私は、ソートのような単純処理は、DBサーバー側ではなくAPサーバー側で行う派です。&lt;br /&gt;
　理由は、Apサーバーの方がスケールアウトが容易だからです）&lt;br /&gt;
&lt;br /&gt;
もちろん、読み込むカラムも、絞り込み条件も、ソート順もユーザーが任意に指定できるようにするような、&lt;br /&gt;
DB管理ソフトのようなものでは動的SQLの構築は避けられませんが、&lt;br /&gt;
そのようなアプリケーションを組む人がいったいどれだけ居ると言うのでしょうか？&lt;br /&gt;
（そのような場合でも、enumを利用するなど、入力データを用いないようにすることはできますが）&lt;br /&gt;
&lt;br /&gt;
そのようなレアケースを軸とした対策ではなく、&lt;br /&gt;
プログラマのスキルによらず確実に対応できるようにすることこそが、&lt;br /&gt;
正しい対策です。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
動的SQLの生成は止めましょう。&lt;br /&gt;
プログラムの先頭でprepareしておいても正しく動くプログラムを目指しましょう。&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;</description> 
      <link>https://inkyose.gjgd.net/%E6%9C%AA%E9%81%B8%E6%8A%9E/%E6%AD%A3%E3%81%97%E3%81%84sql%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E5%AF%BE%E7%AD%96%E3%81%A8%E3%81%AF</link> 
    </item>
    <item>
      <title>ApacheからPostgresにアクセスできない</title>
      <description>個人でサーバー内DBを使ってゴニョゴニョする程度だったら、&lt;br /&gt;
Sqlite3が一番軽いしメンテも楽だし．．．ってことでずっとSqlite3使ってたのですが、&lt;br /&gt;
ネットワーク越しにDB閲覧しようと思ったら、&lt;br /&gt;
Sqlite3だと極端に重くなってしまいました。&lt;br /&gt;
&lt;br /&gt;
原因がSqlite3にあるのかWebDAVにあるのかは不明ですが、&lt;br /&gt;
ちゃんとしたDBエンジンを使うタイミングかと思い、&lt;br /&gt;
現役時代ぶりにPostgresをインストールしてみました。&lt;br /&gt;
&lt;br /&gt;
インストールや設定は難なく終了し、&lt;br /&gt;
データの取り込みも行い、&lt;br /&gt;
さて、同じサーバー上のcgiからアクセスするかと言う段になって、&lt;br /&gt;
何故か繋がらない(- -;ｳｰﾑ&lt;br /&gt;
同じcgiでバッチならちゃんと動くのに。&lt;br /&gt;
&lt;br /&gt;
と言うことでログを漁ると、&lt;br /&gt;
&lt;br /&gt;
httpd/error_log&lt;br /&gt;

&lt;pre&gt;[Fri Sep 21 12:33:03 2018] [error] DBI connect('dbname=foo','',...) failed: could not connect to server: Permission denied\n\tIs the server running locally and accepting\n\tconnections on Unix domain socket &quot;/var/run/postgresql/.s.PGSQL.5432&quot;? at /usr/share/perl5/foo/DBI.pm line 125\nCompilation failed in require at /home/foo/html/view.cgi line 9.\nBEGIN failed--compilation aborted at /home/foo/html/view.cgi line 9.\n
&lt;/pre&gt;
と言うわけで、アクセス権がない模様。&lt;br /&gt;
&lt;br /&gt;
考えられる原因は３つ。&lt;br /&gt;
ひとつはpostgresの設定。&lt;br /&gt;
しかし、postgresのログには何も出ていないので、postgresに到達できていないと考えるべき。&lt;br /&gt;
&lt;br /&gt;
次に考えられるのはiptables。しかし、&lt;br /&gt;
sysconfig/iptables
&lt;pre&gt;-A INPUT -i lo -j ACCEPT
&lt;/pre&gt;
と言う具合に、iptablesの設定はローカルアクセスを制限していないので、これも違う。&lt;br /&gt;
&lt;br /&gt;
と言うことは、３つ目の可能性であるSELinuxのポリシー制限。&lt;br /&gt;
と言うわけでログを確認すると、&lt;br /&gt;
audit.log&lt;br /&gt;

&lt;pre&gt;type=AVC msg=audit(1537500783.022:18112): avc:  denied  { connectto } for  pid=3214 comm=&quot;httpd&quot; path=&quot;/var/run/postgresql/.s.PGSQL.5432&quot; scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:system_r:initrc_t:s0 tclass=unix_stream_socket
&lt;/pre&gt;
と言うことで、どうやらpostgresのsocketにアクセス権がないらしい。&lt;br /&gt;
&lt;br /&gt;
事前に、ApacheからDBにアクセスするための設定として、&lt;br /&gt;

&lt;pre&gt;[root@foo foo]# setsebool -P httpd_can_network_connect_db 1
&lt;/pre&gt;
と言うコマンドを入れておいたのですが、不十分だったようです。&lt;br /&gt;
&lt;br /&gt;
と言うわけで、以下のように設定を生成して追加。&lt;br /&gt;

&lt;pre&gt;[root@foo foo]# cat /var/log/audit/audit.log | grep postgres | audit2allow -M postgres
[root@foo foo]# semodule -i postgres.pp
&lt;/pre&gt;
以下のような設定が生成されたようです。
&lt;pre&gt;module postgres 1.0;

require {
        type postgresql_db_t;
        type httpd_t;
        type initrc_t;
        class unix_stream_socket connectto;
        class dir read;
        class file getattr;
}

#============= httpd_t ==============
allow httpd_t initrc_t:unix_stream_socket connectto;
allow httpd_t postgresql_db_t:dir read;
allow httpd_t postgresql_db_t:file getattr;
&lt;/pre&gt;
&lt;br /&gt;
これで一応、アクセスができるようになりました。 めでたしめでたし。&lt;br /&gt;
</description> 
      <link>https://inkyose.gjgd.net/%E6%9C%AA%E9%81%B8%E6%8A%9E/apache%E3%81%8B%E3%82%89postgres%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84</link> 
    </item>
    <item>
      <title>[Android] Parcelableを実装しているのにデータが復元できない</title>
      <description>&lt;span face=&quot;ＭＳ ゴシック&quot; style=&quot;font-family: 'ＭＳ ゴシック';&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;いくつかのカスタムビューで&lt;/span&gt;&lt;span style=&quot;font-size: 12px;&quot;&gt;Parcelableを使ってデータを退避してる筈なのに、&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;何故か一部のカスタムビューだけデータが復元できませんでした。&lt;br /&gt;
&lt;br /&gt;
追いかけてみると、onSaveInstanceStateやonRestoreInstanceStateのイベント自体は発生しているのですが、writeToParcelが呼び出されず、データが保存されていない様子。&lt;br /&gt;
リソースIDが割り当てられていなかったり重複していると正しく保存されないことは知っていたので、&lt;br /&gt;
真っ先に確認するも、他では使っていない判りやすい名前を使っているので、重複は考えにくい。&lt;br /&gt;
&lt;br /&gt;
でも、よくよく探してみると、重複してました(￣&amp;nabla;￣*)ゞﾃﾍｯ&lt;br /&gt;
&lt;br /&gt;
元々Activityに直接書いていた複雑な構造のビューを切り出してカスタムビューにしたので、&lt;br /&gt;
カスタムビュー自体にIDがセットされていて、&lt;br /&gt;
そのカスタムビューをActivityに載せた時に、そちらにも同じIDをセットしてしまっていました。&lt;br /&gt;
その結果、ひとつのビューに２つのIDが振られてしまい、&lt;br /&gt;
正しく保存できなくなっていたようです。&lt;br /&gt;
&lt;br /&gt;
activity.xml
&lt;pre&gt;  &amp;lt;jp.foo.bar.mycustomview
    android:layout_width=&quot;wrap_content&quot;
    android:layout_height=&quot;match_parent&quot;
    android:id=&quot;@+id/myCustomView&quot; /&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
custumview.xml
&lt;pre&gt;&amp;lt;!--?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?--&amp;gt;
&amp;lt;relativelayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
  android:layout_width=&quot;wrap_content&quot;
  android:layout_height=&quot;match_parent&quot;
  &lt;strong&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;android:id=&quot;@+id/myCustomView&quot;&lt;/span&gt;&lt;/strong&gt;&amp;gt;  &amp;larr;これが余計

&amp;lt;/relativelayout&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
半日無駄にした(^^;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;/Search?search=#AndroidStudio&quot;&gt;#AndroidStudio&lt;/a&gt; &lt;a href=&quot;/Search?search=#Parcelable&quot;&gt;#Parcelable&lt;/a&gt;</description> 
      <link>https://inkyose.gjgd.net/%E6%9C%AA%E9%81%B8%E6%8A%9E/-android-%20parcelable%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%84</link> 
    </item>
    <item>
      <title>[Android][Java] 関数をスレッド化する</title>
      <description>Androidは時間のかかる処理をUIスレッド上で行うことは、&lt;br /&gt;
端末が固まったように見えるのでご法度と言うことらしいので、&lt;br /&gt;
スレッド化を試してみました。&lt;br /&gt;
&lt;br /&gt;
でも、無意味にスレッド化しても仕方ないので、&lt;br /&gt;
関数を簡単にスレッド化したり、&lt;br /&gt;
効果が見込めないと戻せるようにするための書き方を記載しておきます。&lt;br /&gt;
もちろん、スレッドなので、戻り値を求めるような関数には使えません。&lt;br /&gt;
&lt;br /&gt;
対象となる関数は、仮に&lt;br /&gt;

&lt;pre&gt;private void funcFoo( int Var ){&lt;br /&gt;
}&lt;/pre&gt;
とします。&lt;br /&gt;
&lt;br /&gt;
まずは引数をスレッドに渡すために、&lt;br /&gt;
引数の値をすべて保持するThreadクラスを継承したワーカーを作ります。&lt;br /&gt;
ポイントは、関数が要求する引数と同じ変数を内部に定義し、&lt;br /&gt;
コンストラクタで渡し、run()メソッドから元の関数を呼び出します。&lt;br /&gt;

&lt;pre&gt;private class funcFooThread&amp;nbsp;extends Thread{
    //引数に使う変数
&amp;nbsp; &amp;nbsp; int Var;
    //コンストラクタ
&amp;nbsp; &amp;nbsp; public funcFooThread( int Var ) {
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; this.Var = Var;
&amp;nbsp; &amp;nbsp; }
    //スレッド処理
&amp;nbsp; &amp;nbsp; public void run(){
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; funcFoo( Var );
&amp;nbsp; &amp;nbsp; }
}
&lt;/pre&gt;
&lt;br /&gt;
あとは、今まで関数を呼び出していたところで、&lt;br /&gt;
新しいスレッドを関数と同じ引数で作り、start();するだけです。&lt;br /&gt;

&lt;pre&gt;funcFooThread&amp;nbsp;thread = new funcFooThread( Var );
thread.start();
&lt;/pre&gt;
これなら、スレッドが上手く機能しなかった時も、&lt;br /&gt;
簡単に戻せます。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
実のところ、作ってるアプリが動作中に固まったように見えたと言うことではなく、&lt;br /&gt;

&lt;pre&gt;I/Choreographer: Skipped 280 frames!&amp;nbsp; The application may be doing too much work on its main thread.
&lt;/pre&gt;
と言う警告が出てたので、重いビューを生成してる場所をスレッド化してみたのですが．．．&lt;br /&gt;
今のところ効果がありません(- -;ｳｰﾑ&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;/Search?search=#AndroidStudio&quot;&gt;#AndroidStudio&lt;/a&gt; &lt;a href=&quot;/Search?search=#Java&quot;&gt;#Java&lt;/a&gt; &lt;a href=&quot;/Search?search=#Thread&quot;&gt;#Thread&lt;/a&gt;</description> 
      <link>https://inkyose.gjgd.net/%E6%9C%AA%E9%81%B8%E6%8A%9E/-android--java-%20%E9%96%A2%E6%95%B0%E3%82%92%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E5%8C%96%E3%81%99%E3%82%8B</link> 
    </item>
    <item>
      <title>[Android] リソースファイル内での空白の扱い</title>
      <description>リソースファイルに空白が複数入った文字列を定義して、&lt;br /&gt;

&lt;pre&gt;&amp;lt;string name=&quot;format_summary1&quot;&amp;gt;Games:%1$d&amp;nbsp; &amp;nbsp; &amp;nbsp;Total:%2$d&amp;nbsp; &amp;nbsp; &amp;nbsp;Avg:%3$.1f&amp;lt;/string&amp;gt;&lt;/pre&gt;
これをTextViewに表示したところ、htmlのように空白が詰められました。&lt;br /&gt;

&lt;pre&gt;Games:0 Total:0 Avg:0&lt;/pre&gt;
XMLにそんな仕様あったけ？などと思ったのですが、かと言って&amp;amp;nbsp;に変えてもエラーが出るだけ。&lt;br /&gt;
試しに文字列をダブルクォーテーションで囲ってみたら、&lt;br /&gt;
スペースが詰められることはありませんでした。&lt;br /&gt;

&lt;pre&gt;&amp;lt;string name=&quot;format_summary1&quot;&amp;gt;&lt;strong&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;&lt;/span&gt;&lt;/strong&gt;Games:%1$d&amp;nbsp; &amp;nbsp; &amp;nbsp;Total:%2$d&amp;nbsp; &amp;nbsp; &amp;nbsp;Avg:%3$.1f&lt;strong&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&quot;&lt;/span&gt;&lt;/strong&gt;&amp;lt;/string&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;a href=&quot;/Search?search=#AndroidStudio&quot;&gt;#AndroidStudio&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;/Search?search=#Resource&quot;&gt;#Resource&lt;/a&gt;</description> 
      <link>https://inkyose.gjgd.net/%E6%9C%AA%E9%81%B8%E6%8A%9E/-android-%20%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%86%85%E3%81%A7%E3%81%AE%E7%A9%BA%E7%99%BD%E3%81%AE%E6%89%B1%E3%81%84</link> 
    </item>
    <item>
      <title>[Android] Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" attribute?</title>
      <description>&lt;pre&gt;&amp;lt;string name=&quot;format_summary&quot;&amp;gt;Games:%d&amp;nbsp; Total:%d&amp;nbsp; Avg:%.1f&amp;lt;/string&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
こんな値をリソースファイルに書いたら、&lt;br /&gt;
&lt;br /&gt;

&lt;pre&gt;Multiple substitutions specified in non-positional format; did you mean to add the formatted=&quot;false&quot; attribute?&lt;/pre&gt;
&lt;br /&gt;
と言うエラーが出た。&lt;br /&gt;
&lt;br /&gt;
位置指定されていない複数の置換が指定されたフォーマットだよ。&lt;br /&gt;
もしかして、非フォーマットデータだった？&lt;br /&gt;
&lt;br /&gt;
と言う意味らしい。&lt;br /&gt;
&lt;br /&gt;
つまり、位置指定するか、アトリビュートを追加しろと言うことですね。&lt;br /&gt;
&lt;br /&gt;
位置指定するならこう。&lt;br /&gt;
&lt;br /&gt;

&lt;pre&gt;&amp;lt;string name=&quot;format_summary&quot;&amp;gt;Games:%&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;strong&gt;1$&lt;/strong&gt;&lt;/span&gt;d&amp;nbsp; Total:%&lt;strong&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;2$&lt;/span&gt;&lt;/strong&gt;d&amp;nbsp; Avg:%&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;strong&gt;3$&lt;/strong&gt;&lt;/span&gt;.1f&amp;lt;/string&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
アトリビュートを追加するならこう。&lt;br /&gt;
&lt;br /&gt;

&lt;pre&gt;&amp;lt;string name=&quot;format_summary&quot; &lt;strong&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;formatted=&quot;false&quot;&lt;/span&gt;&lt;/strong&gt;&amp;gt;Games:%d&amp;nbsp; Total:%d&amp;nbsp; Avg:%.1f&amp;lt;/string&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;/Search?search=#AndroidStudio&quot;&gt;#AndroidStudio&lt;/a&gt; &lt;a href=&quot;/Search?search=#Resource&quot;&gt;#Resource&lt;/a&gt;</description> 
      <link>https://inkyose.gjgd.net/%E6%9C%AA%E9%81%B8%E6%8A%9E/-android-%20multiple%20substit</link> 
    </item>
    <item>
      <title>[Android] ContentProviderでGROUP BYを最もスマートに利用する方法</title>
      <description>ContentProviderのqueryにGROUP BYやHAVINGの引数がないものだから、&lt;br /&gt;
ネット検索してみると、Where句に続けて書いてみるとか色々苦心されているのが伺えた。&lt;br /&gt;
&lt;br /&gt;
でも、みんなトリッキーな手法に頼り過ぎ。&lt;br /&gt;
考えすぎ。&lt;br /&gt;
&lt;br /&gt;
素直にView作れば済む話ですよね？&lt;br /&gt;
&lt;br /&gt;
DBを作る時に、&lt;span style=&quot;color: #4a4a4a; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', 'Hiragino Kaku Gothic ProN', メイリオ, meiryo, sans-serif; font-size: 16.1px;&quot;&gt;BaseColumnsをimplementsして&lt;/span&gt;テーブルの定義をしますが、&lt;br /&gt;
View用に新たに定義を作ればOK。&lt;br /&gt;
CREATE TABLEする時にCREATE VIEWするだけです。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;/Search?search=#AndroidStudio&quot;&gt;#AndroidStudio&lt;/a&gt; &lt;a href=&quot;/Search?search=#ContentProvider&quot;&gt;#ContentProvider&lt;/a&gt; &lt;a href=&quot;/Search?search=#GROUP&amp;nbsp;BY&quot;&gt;#GROUP BY&lt;/a&gt;</description> 
      <link>https://inkyose.gjgd.net/%E6%9C%AA%E9%81%B8%E6%8A%9E/-android-%20contentprovider%E3%81%A7</link> 
    </item>

  </channel>
</rss>