氣象報告常常不準

台湾生活。華語・台湾語学習。システム関連の話題など。

「蓮舫=二重国籍」批判のデタラメ

 八幡和郎氏の著書「蓮舫「二重国籍」のデタラメ」(飛鳥新社 2017年1月9日 第一刷)を読んだ。

二重国籍は日本では違法である(p57)
蓮舫は二重国籍を隠していた(p57)
従って、違法な二重国籍がしばらく、あるいは現在まで続いている可能性がある(p70)

巧妙な「二重国籍」批判を読んでいくうちにすっかり「(蓮舫=二重国籍)→違法」との構図が刷り込まれてしまいそうだが、p227からの、日本政府の立場を説明した部分で、それまでの話がひっくり返る内容がさらりと出てくる。

《その理由は、国籍法の条文が、「外国の国籍を有する日本国民は、法務大臣に届け出ることによつて、日本の国籍を離脱することができる(第十三条)」となっているように、「外国の国籍を有する」という条件のもと、台湾(中華民国)は日本が承認している国家ではないため、それが証明書を出すところの「国籍」は「外国の国籍」にあたらないからだという。》(p227-228

 驚かされる。日本政府(法務省)の見解は、

・「台湾籍を持っている日本国民」の「台湾籍」は、国籍法上の「外国の国籍」にあたらない

よって
・「台湾籍を持っている日本国民」は、国籍法上の「外国の国籍を有する日本国民」にあたらない

というものなのだ。*1


 そもそも著者の八幡和郎氏が「二重国籍=違法」と主張しているのは、
「『外国の国籍を有する日本国民』は、外国及び日本の国籍を有することとなつた時が二十歳に達する以前であるときは二十二歳に達するまでに、その時が二十歳に達した後であるときはその時から二年以内に、いずれかの国籍を選択しなければならない。」

という「国籍法14条」があるからだ。

「22歳をとうに過ぎているのに、しなければならない選択をしていなかったから違法」との理屈だ。しかし当の日本政府(法務省)が、日台重籍者のケースを国籍法上の「外国の国籍を有する日本国民」にはあたらないと説明していることを踏まえれば、違法呼ばわりは無理筋というものだ。

参考文献)「日台共栄」2016年10月号『二重国籍問題が導く日本版・台湾関係法』(亜細亜大学非常勤講師 多田恵先生による解説記事)
http://www.ritouki.jp/wp-content/uploads/2016/10/40-5.pdf

*1:あくまでも「台湾籍を持っている日本国民」が、国籍法上「外国の国籍を有する日本国民」にあたるかどうかだけの解釈であることに注意。日本国籍を持たない台湾人の台湾籍についての解釈を述べたものではない。

「台湾籍」は選べるの?

 産経新聞の報道

www.sankei.com

によると、過去日台重籍者だった者(蓮舫氏)が、台湾籍の離脱証明出しても受理せず、そのあとで10月7日に国籍選択宣言を受け付けたというのですかね? この報道が本当なら蓮舫氏よりも、制度面のツッコミどころ満載です。

 9月23日には台湾籍はもう抜けていたわけで、10月7日時点で蓮舫氏は既に日台重籍者じゃなくて、日本籍単籍者です。そういう人に国籍法14条の宣言をさせたことになるけれど14条は「外国の国籍を有する日本国民」が行う手続きなのでは?

 

 さて、蓮舫さんちょっと脇に置いておいて、なにより、台湾籍を維持している「一般の」日台重籍者に「国籍選択宣言」が求められているという解釈は理解し難い。

 仮に選択が義務なら、「台湾籍」を選んだらどうなるか?ですけど、

実は現状、「台湾籍」は選べないのです。

 国籍法14条の国籍選択制度で外国籍を選ぶ場合は法務省のサイト

http://www.moj.go.jp/MINJI/minji78.html#01

に国籍法13条による「(日本)国籍離脱届」を出すか、当該外国に国籍選択制度がある場合ならば、戸籍法103条の「(日本)国籍喪失届」を出す
二つの方法が示されています。

 

http://www.moj.go.jp/content/000011149.gif

ただ、台湾に国籍選択制度は無いので最初の国籍法13条の国籍離脱届(日本籍の離脱届)を提出する方法しか選べません。

 ところが、現状の運用では、法務省は、日台重籍者に、日本籍を離脱して台湾籍のみになることを許していない(台湾籍は国籍じゃないので離脱を許すと無国籍者になってしまうとの説明)
 国籍離脱届は通常は却下されます。却下されたらまだ選択義務を果たしていないということになるのでしょうか?

参) 

櫻井よしこ「理由は中国への気兼ねか? 日台両国の架け橋的人物の日本国政離脱を阻む不可解」 | 論説 | 日本李登輝友の会 │ 新しい日台交流にあなたの力を!

となると、台湾籍を選びたい人はどうしたらいいの?ということになってしまう。妙な話です。

DelphiでAndroid開発挑戦日記(4)

(試行錯誤したものの、進捗の無い一日でした。)

USBデバッグモードでつないだときに

・HTCのスマホ(HTC ONE X+)なら期待通り動作する

・しかし、Sony Tablet Sは「認識されるが、期待通り動かない」

(走らせたときに一瞬画面が真っ黒になるだけ。)

という状況が続いている。Labelを一つ置いただけの何もしないコードでこれ。

デバッグ時のイベントログでは

モジュールの読み込み: libjnigraphics.so. デバッグ情報なし. ベースアドレス: $0000006A. プロセス Project1.apk (16686)
モジュールの読み込み: libProject1.so. デバッグ情報あり. ベースアドレス: $5B992E30. プロセス Project1.apk (16686)
[Switching to Thread 16707]  プロセス Project1.apk (16686)
$5B9FC2A6 で初回の例外が発生しました。例外クラスは Illegal instruction (4)。 プロセス Project1.apk (16686)

+++++++++++++++++

 比較のために、お蔵入りしていた我が家のもう一台のAndroid端末、Acerの”ICONIA TAB A500”を押入れから引っ張り出す。こちらはドライバインストールは、ドライバーセットアップのプログラムを起動するだけ、とSonyに比べてずっと簡単だった。Delphiから認識されるところまでは順調に行った。

 しかし、これも期待の動作をしない。

 単純なフォームを表示するだけのプログラムで「Project1が予期せず停止しました。やり直してください[強制終了]」と表示される。

統合環境のイベントログを見ると、

「モジュールの読み込み: libjnigraphics.so」までで止まっている。SonyTabletとも微妙に症状が違う。

 現時点で、タブレットはうまくいかず。スマホはOKという状況。

+++++++++++++++++

 もしかすると、SDK、NDK、JDKの構成が良くないのかな。

まず、JavaJDKの7に入れ替えてみたが、結局同じこと。駄目でした。

 

 

 Android開発の基本が全然わかっていないのを痛感。

 日経ソフトウェア「よくわかる 挫折しないAndroid開発の入門書」というのを買って来ました。( 小中学生でもできる ってあるんで・・・笑)

DelphiでAndroid開発挑戦日記(3)

(タイトル変えました!)

 RAD Studio XE5に含まれるDelphi起動して、ターゲットのAndroidデバイスを「デバッグモード」にしてUSB接続すれば、自動認識されて、それをターゲットにした開発ができるようになる。

 

 そのとおりでHTCのスマホはOKだった。だが、Sonyが以前出していたタブレット形端末(Sony Tablet S)をつないで見たら、認識してくれない。

 

 ソニーのサイトで見つけた「Android SDK開発環境設定について」

 http://www.sony.jp/support/tablet/products/info/sdk.html

 HTCと違って、一手間必要なんですね。使う立場では、「つなぐだけ」、にしてほしいところだ。「こんなことくらいできなくて、開発なんてできるのかー?」と言われたら返す言葉が無いが(汗)。

 

 さて、「SDK・USBドライバのインストール、および設定」をせよとあるが、RAD Studioのインストールでほとんど準備はできているのではないかな。

 SDKマネージャーを起動して開発環境を確認するが、

 RAD Studioの場合は

 スタート→すべてのプログラム→Embarcadero RAD Studio XE5→Android Tools

を開く。

Statusが UpdateAvailableになっているものが

(Tools)

Android SDK Tools (22.0.1→22.2.1)

Android SDK Platform-tools(17→18.0.1)

(Extrasの)

Android Support Library(13→18)

の3つ。

 

デフォルトでチェックがついていながら未インストールのものが

(Android4.3)

  Documentation for Android SDK

  SDK Platform

  Samples for SDK

  ARM EABI v7a System Image

  Intel x86 Atom System Image

  Google APIs

  Sources for Android SDK

(Extras)

 USBDriver

の8つ。

 

右下に「Install 11 packages」「Delete 3 packages」

というボタンが表示されているが。ご指名の(3+8)の11パッケージはぜんぶInstallしておく。

→インストール完了まで約40分かかった。

 

 RADStudioの環境のSDK Pathは

 C:\Users\Public\Documents\RAD Studio\12.0\PlatformSDKs\adt-bundle-windows-x86\20130522\sdk

Google USB Driver は extras\google\usb_driver

 C:\Users\Public\Documents\RAD Studio\12.0\PlatformSDKs\adt-bundle-windows-x86\20130522\sdk\extras\google\usb_driver

にある。そこ開いて、ソニーサイトで解説されている手順 

http://www.sony.jp/support/tablet/products/info/sdk.html

を実行した。

 「今度こそ」、といさんでソニータブレットS挿してみたがやはりまだ認識せず。PC再起動してつなぎなおしてみたが・・・

 

だめじゃん。お手上げ状態。

 =====================

検索してみたところ、

「be-style」様のブログ

http://blog.be-style.jpn.com/article/53114554.html

にて、この問題点と追加情報が詳しく解説されているのを見つけました。

 

 

※つまり、ソニーのサイトの記載だけでは情報不足だったということ。

 

「be-style」様が書かれている『追加』の手順どおりに作業して、ようやく当方でも、ソニータブレットSを認識しました。

f:id:liuk:20131001115953j:plain

 

 さあこれで、タブレット用アプリを!と試してみたのだが、なんだろこれ。SonyTablet本体にアプリの転送は出来た。しかし実行と同時に、作ったフォームを拝む前に終了して閉じてしまう。(HTCのスマホに戻したら、問題なく動いたが・・。)

DelphiでAndroid開発挑戦日記(2)

 前回、PCとUSB接続したAndroid端末をDelphiに認識させることができた。

さっそくこいつをターゲットにして、何か動かしてやろうとしたが、

エラー

プロセスを生成できません。

C:\...\Project1.apkをインストールできません。

Failure

[INSTALL_PARSE_FAILED_NO_CERTIFICATES]

となってしまった。アプリに署名が無いから、らしい。

 Delphiをいじっているうちに「構成」の設定を「アプリケーションストア」にしてしまっていたのが原因。「構成」を「デバッグ」に設定していれば、署名なしで配置でき、問題なく動作する。 

 「署名」については

http://docwiki.embarcadero.com/RADStudio/XE5/ja/%E7%BD%B2%E5%90%8D%E6%B8%88%E3%81%BF_Android_%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%85%8D%E7%BD%AE

に書いてあるが、作成したアプリを公開するのでなければ、(自分で使うだけのアプリなら)署名の事はとりあえず考えなくていい。

 これまで、恥ずかしながら、「開発環境の構築で四苦八苦して開発をはじめる前に力尽きる」なんてこともあったのだが、RadStudio XE5のDelphiについては、デフォルト設定でインストールして、『デバッグモードにしたAndroid端末』を開発PCにUSB接続すればすぐ使えるようになった。

 付属のサンプルコードに、GPSや加速度センサー等を活用する例があり、勉強になる。サンプルコードを実機で走らせてみるのは面白い。何気なく使っていたスマホが多機能なセンサーの塊である事を実感させられる。

 しばらくはサンプルコードを一つ一つ試しながら、遊んでみよう。ゲームなんかよりこのほうが面白いと思う。

DelphiでAndroid開発挑戦日記(1)

「RAD Studio XE5*1に含まれるDelphiで、Androidアプリの開発が出来るようになった」という点に魅力を感じて、(RAD Studio XE2からの)アップデートをした。

  

 自身、Android開発は初心者だが、Delphiは、先代のTurboPascal時代からお世話になっている。後者のノウハウを前者に活かせればよいなと期待はふくらむ。

 「ダウンロード版」を使っているが、インストールはだいぶ楽になった感じ。XE2のときは、なにかと途中でうまくいかないことがあって、結局「ISOイメージをDVD-Rに焼いて、そこからインストール」しないとならなかった。今回は、ダウンロードしたEXEファイルの実行だけで無事、最後まで行ってくれたし、Android開発に必要な、SDK NDK JDK関係もデフォルトで自動インストールしてくれた。

 但し、自分のPC(Core2 1.86GHz)では、二時間以上かかったように思う。インストールは時間に余裕があるときにやったほうがよさそうだ。(カタログには環境は「2GHz以上推奨」とある)

 

 

 Delphiを起動してみる。統合環境のぱっと見はXE2と同じようだ。この画面ならとっつきやすいのでありがたい。

 最初に表示される「ウェルカムページ」によると、アンドロイド開発を試したいとき、まず見るべきはこのビデオ(英語、5分弱)らしい。

http://www.youtube.com/watch?feature=player_embedded&v=8H80pEot4No

 

 見た感想。「USBで持っているAndroid端末つなげば、自動認識してくれるのでそれを『ターゲット』に設定すればチャチャチャのチャー!」ってことなのかな?

 

 エンバカデロ・デベロッパーTVのページ↓ から「RAD Studio XE5もっと見せます」のビデオを見る。こちらは日本語、32分。

http://www.embarcadero.com/jp/developers-tv

 

 

 8分40秒あたりに出てくるが「何も設定しなくてつなげば認識」してくれるらしい。

「では・・」と、自分の 「HTC One X+ (Android4.2.2)」を つないでみた。

 

・・・・認識しないじゃないの。

 

・開発者の方には当たり前なのかもしれないが、いろいろ検索してみると、こういうときは先に、スマホの方を、「デバッグモード」にする必要があるみたいだ。→そのためには、「開発者オプション」を表示する必要がある。

 

 そのやり方が、アンドロイド4.2以降の場合、不思議なおまじない!になっている。

参考)http://www.yahoo-help.jp/app/answers/detail/p/601/a_id/54447/~/usb%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E3%80%81%E6%8F%90%E4%BE%9B%E5%85%83%E4%B8%8D%E6%98%8E%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B#1

「設定」「バージョン情報」「ソフトウェア情報」「その他」へ入って、「ビルド番号」を7回選択する。すると開発者向けオプションが表示されるとのこと↑。

 途中で、「あと3ステップで」「あと2ステップで」などと表示されたが、なぜか最後に「お客様はデベロッパーではありませんね」と表示された。ムカッ。

 一度抜けてから、「設定」「バージョン情報」「ソフトウェア情報」「その他」へ入って、再度「ビルド番号」を触ると、「必要ありません、お客様はデベロッパーです」と表示。よくわからん。

 

 この後、調べたが、一度「開発者オプション」を表示させてしまうと、簡単には消せないみたい↓ 

参) Android 4.2の「開発者向けオプション」を削除する方法↓

http://andbrowser.com/development/1246/how-to-remove-developer-options-for-android-4-2/

 なんで「デベロッパーではありませんね」と表示されたのか、再現テストもできないまま、ともかくUSBデバッグモードをオンに。

 Delphiを起動して、スマホを接続。しばらく待ってようやく「プロジェクトマネージャー」の「ターゲット」に「HTC One X+」が追加されました。

 

 ようやく最初の関門を突破、といったところでしょうか。(続く、かも)

*1:RAD Studioはエンバカデロ社の開発ツール製品

 http://www.embarcadero.com/jp/products/rad-studio

結城先生のクロッシング問題、復習メモ(Delphi)

 > 挑戦者求む!交差点をすばやく数えよう! by The Essence of Programming http://t.co/2Xn4WbblEf @codeiqさんから

 

・「三十万個超の数値データを順々に読み出す、一つの数値を読み出すたび、『それより大きい既出の数値の個数』を積算していく」問題だと解釈。

 

 

 そこで、自分はDelphiで「既出の数値をリスト構造に昇順で保存する」という方法をとったが、9秒が限界。課題要件の「3秒未満」には至らなかった。

 

 9/3にいただいた結城先生の解説「マージソート版」は「あ、これだったのかぁ」という印象だったが、別解の「逆転表版」は目からうろこ。模範プログラム例はRubyとC。これをDelphiに移植して、「本当に(Delphiでも)1秒以下で正解が出せる」ことに、まず感激。

 ただ、「何でこのソースコードで、正解が出るのか」なかなかピンとこなかった。変数の動きを追いかけ追いかけ、ようやく、「上位ビットを配列の添字にしている」ことで「上位ビットが共通のデータ」をまとめて扱えていることを理解。

 なるほど、無駄が無く美しい。

ーーーーーーーーーーーーー

しばらくすると忘れそうなのでDelphi移植版に、いろいろコメントつけたのを置いておく。(フォームに出力用メモコンポーネントMemo1を置いている。)

procedure TForm1.Button1Click(Sender: TObject);
//逆転表版
var
    bits, i,j,k,s, datacount: Integer;
    cross_sum   : UINT64;
    nums : TList<Integer>; //課題の配列を入れておく
    invs : TList<Integer>; //逆転表用

    StringList:  TStringList; //ファイル読み出し用文字列リスト

begin
    Memo1.Lines.Add(DateTimeToStr(Now));//開始時刻記録

    cross_sum := 0;  //クロス数初期化

    //課題のデータを文字列リストに読み出し

    StringList := TStringList.Create;
    StringList.LoadFromFile('C:\temp\crossing.txt'); //ファイル置き場指定し読み出し

    //データ数 (=314159個)が求まる↓
    datacount := StringList.Count;

    //作業用配列準備
    nums := TList<Integer>.Create;
    invs := TList<Integer>.Create;
    try
      for i := 0 to datacount -1 do begin
        nums.Add(StrToInt(StringList.Strings[I])); //文字列リストから数値リストへ変換
        invs.Add(0);//ゼロ埋め(メモリ確保)
      end;

      //配列の添え字を2進表記した場合の最上位ビットの桁位置をbitsへ。
      //配列要素数314159個だが 2^19で524288, 2^18で262144なのでbitsは18 になる
      for bits := 31 downto 1 do begin
        if (datacount and (1 shl bits))>0 then break;
      end;

      //上位ビットから順に処理。
      for k := bits downto 0 do begin
        //使う分だけ、invsの初期化
        for s := 0 to datacount div (1 shl (k+1)) do invs[s] := 0;

        //横、データ数の分だけスキャン
        for j := 0 to datacount-1 do begin
          s := nums[j] div (1 shl (k+1));//データの上位のビットだけ取り出す


          if nums[j] and (1 shl k)>0 then  invs[s] := invs[s]+1
          //↑そのビットが1のとき、
          //『上位ビットが共通で、その時点で初めて自分より大きいとわかる

    //自分よりも左にある数の個数』はゼロ。
          //上位ビット(s)が共通で、そのビットが1である個数:invs[s]を

    //インクリメントしておく

          else cross_sum := cross_sum + invs[s];
          //↑そのビットが0のとき、
          //『上位ビットが共通で、その時点で初めて自分より大きいとわかる

    //自分よりも左にある数の個数』は
          //その時点でのinvs[s]であるから、それをクロス数に追加。

        end;
      end;
      Memo1.Lines.Add(IntToStr(cross_sum));//結果の出力
    finally
      invs.Free;
      nums.Free;

      StringList.Free;
    end;
    Memo1.Lines.Add(DateTimeToStr(Now));//終了時刻記録
end;

=============

出力結果(処理時間一秒未満)

2013/09/05 15:21:01
24689222839
2013/09/05 15:21:01