香港の現状に思うこと

Why Civil Resistance Works 表紙

香港との接点

1987年から1988年にかけて,南京大学に語学留学していた冬休み,上海から船路で香港を訪ねた。鄧小平の南巡講話はすでにされていたが,経済発展の端緒についたばかり。翌年には天安門事件が起こるというタイミングである。19世紀末とあまり変わらないであろう生活スタイル,電力の節約で暗い中国大陸から,いきなりきらびやかな自由経済の旗手,東西混淆の香港にたどり着き,彼我の違いに目を見開きながら楽しんできた。

その後,就職して後も国際調達担当の業務で単独で新疆ウイグル自治区や山東省,河北省,江蘇省,福建省と訪れ,東京からの直行空路がふさがっているときは,啓徳空港からバスで市内を移動して境界を越える鉄道に乗り換えて広州へ往き,そこからまた空路で中国国内へと移動したこともある。また,食品会社を離れてからも,支援先の事業者さんや支援仲間と,あるいは単独で,視察や商談・出展・販売支援,観光にと随分足を運び,ときには密貿易の現場を覗きに行ったり,早朝の食品市場をめぐってみたり,いきあたりばったりでたどり着いた海岸で昼寝をしたりと,たびたび香港にはお世話になってきた。

スライドショーには JavaScript が必要です。

揺れる香港と過去の記憶

その香港が,今,揺れている。

一国二制度の形骸化を懸念しつつ,それでも独自の立ち位置にある香港は,海外旅行や食品輸出,海外展示会出展,商談の入門編として,手頃な場所であった。LCCが飛び始め,当初は大阪から発って深夜に到着するような強行軍をやってみたりしたが,ほどなく中部国際空港からも便利な時間帯に新たな路線が開設され,旅券とクレジットカード,スマホさえ持っていれば,当日思い立ってその日の夕方には香港などということもできるようになった。英語や中国語が通じ,社会秩序が安定しているという安心感があった。

一方で,銅鑼湾の書店主が行方不明になったり,愛国教育ー大陸では歴史・道徳教育的な位置づけーの延長として讒謗律のような法令が制定されるなど,耳目を集めるニュースが続いていた。

そして雨傘運動が起こり,民主派の立候補規制がかかるなど,揺れ動きが続いてきた。

今回,半年近くになる抗議活動が続いている。北京での騒動を,南京から戻ったばかりの頃,まだインターネットでニュースや動画が駆け巡るなどと思いもよらなかった頃,限られた情報を見つめていた。一介の学生としてやれることは限られていた。その頃の記憶につい意識が向き,暗い結末を迎える懸念が頭を離れない。

社会政治運動の成功率と香港の特殊な位置

ここに,20世紀100年間+アルファの期間の各種政治運動を分析した研究結果をまとめた本がある。

Book

・非暴力運動のほうが暴力行為中心の運動よりも成功率が2倍以上高い
・運動の参加率がピーク時で3.5%を超えると成功率が飛躍的に高まる

Why Civil Resistance Works 表紙
“Why Civil Resistance Works” Columbia University Press, SBN: 9780231527484

という研究成果が記載されている。香港の人口は約700万人。3.5%というと,約25万人だ。主催者発表では200万人を超える(警察発表でも30万人を越える)参加があったデモが複数回すでに起こっている。過去のデータから得られた知見からすれば,この運動は少なくとも香港域内では成功する確率が高いといえそうだ。

もっとも,香港は中国の一地域という位置づけである。大陸での香港情勢に関する情報流通はかなり統制がかかっており,関心も高くない。中国自体が変わるには,総人口12億人(未登録者も多いので13億人以上というのが実態だろうが)の3.5%という数字を使えば4,200万人以上が動くことが指標となる。年々変動しているが,香港への入境者人数は年間約4,000万人。大陸から7割として,年間2,800万人が香港を訪れていることになる。もちろん,生活費が安い大陸に住み,越境して勤務する人も多く,現時点では大陸から香港への観光を大幅に制限しているようなので,直接,香港の今を見聞きしている大陸の人達の人数は現時点ではかなり限られるだろう。それゆえ,上記の数に達して大陸側も変わるという可能性は,全く0とはおもわないし,一国二制度が維持される50年間の間に融合的な動きが起こってほしいとは思うが,今の所そこまでの広がりはない。また,運動もそうした目標を持っているとはいえず,今回の五大要求は表面的にはあくまで香港域内での政府の変化を要求している。もちろん,行政長官が北京の了承がなければ辞任もできないように,香港の統治・政策は中国共産党の意志が大いに関わるので,間接的には大陸政府の変化を狙っていることになるが,

ともかくも

自分は社会問題の専門家ではないし,中国語も北京語はともかく広東語は片言程度しか話せないので,もっぱら個人的関心,業務上の必要から香港に関心を持ち続け,時折訪問しているわけだが,馴染みがあり,また訪れたい場所といえば間違いなくその筆頭候補の一つである。また,中国が世界と協調して平和裏に,経済のみならず,政治や社会も発展してほしく,またその変化を見続けたい。アジアのみならず,世界の行く末を決める大きな要因の一つが,中国のありかたであり,その重要な因子として,香港,台湾や,中国国内の民族・人権・政治の変化は,目が離せないでいる。

評論的なものはさておき,上記の研究結果を知るにつけ,また,暴力は慎むべきという個人的に信条からしても,軸となる人達には非暴力という志向を持ってほしい。暴力装置の介入は,そこで生活している人々の大きな不幸を招くだけでなく,世界的な経済の大混乱や,人材の喪失に至る。これを防ぎつつ,理想とは行かないにしても一歩でもより望ましい社会をより少ない不幸で実現するには,知恵と理性と戦略とをもち,周囲の共感を引き起こせる行動をしなければならない。市民側からすれば,警察や社会インフラ機構は攻撃対象ではなく,説得対象ではないだろうか。また,行政側からすれば,市民活動を力づくで抑え込もうとするほど,運動が過激になり,みすみす外部からの介入を許すことになりかねない。攻撃による反作用を燃料に活動活力を維持することは,双方いずれにとっても安直で愚かな手法である。

希望を持ち続けたい。

重陽節の夕べに来し方を振り返りつつ

菊の花

MEMS(ECU)モニタ開発状況 GHCのバグ?環境整備の問題?

エンジンルームを乾燥中の Rover Mini 1.3i

インジェクション・ローバーミニの車載コンピュータのモニタリング,Macではstack環境下で順調に開発・運用していますが,ラズパイでの運用は未完。stackでのコンパイルがまだできないので,ghcで直接コンパイルをしてみたのですが…

現状把握:何が起こっているか

使用している serialport パッケージ内の関数で引数の型として指定されている ByteString の参照先が Mac でstackを使ってコンパイル(stack 2.1.3) した場合と RaspberryPi で直接GHCでコンパイル(GHC 8.0.1 on Raspberian 4.14.79-V7+)した場合とで異なる。ラズパイ上ではなぜかbytestringのインターナルモジュール内の定義を参照し,呼び出し側は,モジュール内で明示的に指定した公開ライブラリを見にいっています。

具体的には,serialportパッケージのsend関数の第2引数の型が合いません。serialportの中では

> import qualified Data.ByteString.Char8 as B
>(中略)
> send :: SerialPort -> B.ByteString -> IO Int

と定義されています。一方,自作のモジュール内では,

> import qualified Data.ByteString.Char8 as BS
> (中略)
> send p $ BS.singleton (chr 0x0a)

みたいな感じで呼び出しています。

引数の型は合っているはず。Data.ByteString.Char8 (以下,「D.B.C」と省略)でのsingletonの定義は,

> singleton :: Char -> ByteString

です(尤も,D.B.C内のByteStringの定義は,後述の通り,Internalモジュールからインポートしていますが)。

実際,macOSでstack buildをした場合,問題なく通りますし,運用もできます。ところがraspberianで ghc でのコンパイルをすると,BS.ByteString は Data.ByteString.Internal で定義されているbytestring-0.10.8.1:Data.ByteString.Internal.ByteStringと合わないというわけで,型の不一致とされてしまいます。うーむ。

原因分析:何が原因か

serialportのソースをおっかけてみると,まずByteStringの定義は前述の通り,D.B.Cを参照しています。また,sendの第2引数は,途中でWord8に変換するため,B.unpackをかけており,その先のD.B.Cのほうでは,unpackは結局,内部関数のunpackAppendCharsLazyを束縛しています。

> unpackChars :: ByteString -> [Char]
> unpackChars bs = unpackAppendCharsLazy bs []
> (後略)

そこでunpackAppendCharsLazyを見ると,内部のByteStringの定義を用いて関数が定義

> unpackAppendCharsLazy :: ByteString -> [Char] -> [Char]
> unpackAppendCharsLazy (PS fp off len) cs
> (後略)

されています。

InternalモジュールでのByteStringの定義は
> data ByteString = PS {-# UNPACK #-} !(ForeignPtr Word8) -- payload
> {-# UNPACK #-} !Int -- offset
> {-# UNPACK #-} !Int -- length
> deriving (Typeable)

となっています。これは外部公開していないモジュールのはずですから,ここを参照すべきではないでしょうし,D.B.Cのほうで,ちゃんとByteStringをエクスポートしています。

> module Data.ByteString.Char8 (
>
> -- * The @ByteString@ type
> ByteString, -- abstract, instances: Eq, Ord, Show, Read, Data, Typeable, Monoid
> (後略)

ですので,D.B.Cを指定したByteStringで型は一致するはずなのですが…

真因追求:本当の原因として考えられること

  • raspberian 上で整えた GHC の環境がおかしい? … 冒頭で述べたように,stackでの開発がラズパイ上ではできていません。cabal ライブラリのコンパイルをはじめて,大きなライブラリのコンパイルでメモリが不足して止まってしまう(一応,仮想メモリとして4GBを確保してあるのですが)。stackの環境構築がこのように中途半端になっているので,それがローカルなライブラリDBを構成するなどの悪さをしている?
  • 環境・構成に依存するGHCの挙動の違い? … GHC のバージョンや,Stackを使った場合と生で呼び出した場合のGHCに渡されるオプションや構成の違いが真因の可能性も。

考えられる対処

いずれにしても,検証するには環境を合わせることから始める必要がありそうです。そもそも stack ・ GHC 直接という違いもあり,macOS と raspberian とでは GHC のバージョンも違うため,そこらへんを合わせてみることが必要なのかもしれません。

思い切って,ラズパイ用は go言語で組み直してみる?手続き型言語の冗長さと,代数データ型やモナドが使えないなどの面倒さにつきあうのはためらいがありますが…。

蛇足

こんなデータを0.5秒おきにとっています。開発目的は,時々発生するECU気絶に由来すると思われるエンジン停止や回転数低下の原因を特定したいためと,IoTや関数型言語でのプログラミングの勉強。

下記画像では,右端の部分で時々横線が入っているように見える部分が,そこが,ECUのデータ読み出しができなかった瞬間です。左側の数値が羅列されている部分でいうと,文字列が並んでいる行です。

気が付かれる方もあるかもしれませんが,魚野の車はマニュアル車です。ですが,ECUが原因かという検証のため,修理業者さんが別の車のオートマ用ECUをつないでくれたために,オートマと表示しています。ECUが変わっても,瞬停や回転数落ちはまだ発生していますので,ECUそのものが原因ではないと思っています。

Rover Mini ECU(MEMS) Monitor CSV Data
Rover Mini ECU(MEMS) Monitor CSV Data