wktk's diary

日記やメモ

通信ケーブルで「カードリーダーモード」になって充電出来ないときの対処法

[asin:B003XKOII4:detail]
ちょっと前に上と同じタイプの USB モバイルバッテリーを買った。値段の割に容量も大きくて便利に使ってたんだけど、1 つ困ったことがあった。

USB 通信ケーブルで繋いで手持ちの Android 端末を充電しようとすると、端末が「カードリーダーモード」になってうまくいかない。AC からの充電器なら通信ケーブルでもちゃんと充電できるのに…。

仕方なく通信ケーブルと充電専用ケーブルを両方持ち歩いていたけど、僅かながらかさばるし、使い分けるのが面倒臭く不便である。

原因から書くと、USB はデータ線がショートしている場合は高速充電、していない場合は通信モードと決まっていて、このモバイルバッテリーでは USB のデータ線がショートしていないため「カードリーダーモード」になってしまうらしい。

例えば手元のこの機種では、PC に端末を挿すと最初に一瞬「カードリーダーモード」になったあと、PC がデータ線経由で何か連絡して、充電が開始される。データ線がショートしていない場合、まずはこのような段取りを踏まないと充電が開始しないことになっているらしい。

参考に、手元の AC-USB 充電器の 1 つの、スルーホールマウント型の USB コネクタだと、このように真ん中 2 つのデータ線部分が半田でショートされている。

そこで、このモバイルバッテリーの基板のデータ線部分も半田でそのままくっつけてショートさせることにした。他にもケーブルを細工して対処する方法などあるけど、持ち歩くケーブルを減らすのが今回の目的だし、そもそも既に持ってる充電ケーブルと同じなのでパス。

まずモバイルバッテリーのフタを外す。短辺に 2 箇所、長辺に3 箇所、計 10 箇所あるツメで固定されている。フタの裏に、リチウムポリマーバッテリー (3.7 V, 2,500 mAh) ×2 が並列で繋がれて固定されている。

そして上の画像の AC 充電器の様に中央 2 つのデータ線部分に半田をつけてショートさせる。

作業時間は数十秒。やっと半田こてが温まったところなのにもう終わりかよ!><

でもこれで通信ケーブルでも「カードリーダーモード」にならずに充電出来るようになった。

ここまで書いたけど、基板とかはあまり詳しくないので、どっか間違ってたら教えて欲しい。今のところ爆発はしてない。

ところで数日後、Amazon でこんな商品を発見した。

このケーブルを使えば細工せずともそのまま使える気がする。
スイッチで通信用と充電専用とを切り替えられて、1 本 2 役で使えるらしい。最初からこれ使っとけば良かったかも。

Pxem で素数判定をする

ag.- (= 6) が素数かどうか

ag.-.tab.-.c.w.c.c.!.m.x.strue.paa.-.c.c.a.c.wab.-.+.c.m.%.cab.-.y.s.sfalse.paa.-ab.-aa.-.aaa.-.a.a.pxe
=> false

dd.! (= 10,000) が素数かどうか

dd.!.tab.-.c.w.c.c.!.m.x.strue.paa.-.c.c.a.c.wab.-.+.c.m.%.cab.-.y.s.sfalse.paa.-ab.-aa.-.aaa.-.a.a.pxe
=> false

dd.!ah.-.+ (= 10,007) が素数かどうか

dd.!ah.-.+.tab.-c.w.c.c.!.m.x.strue.paa.-.c.c.a.c.wab.-.+.c.m.%.cab.-.y.s.sfalse.paa.-ab.-aa.-.aaa.-.a.a.pxe
=> true

今回の方針は、

  1. 2 から順に数え上げながら割っていく
  2. 途中で割り切れたら素数でない (false)
  3. 引数の平方根を超える数までカウントアップできたら素数 (true)

です

素数でない場合に、引数を割り切れる最小の数をドヤ顔で表示することもできます
dd.!ab.-.+ (= 10,001) の場合

dd.!ab.-.+.tab.-.c.w.c.c.!.m.x.strue.paa.-.c.c.a.c.wab.-.+.c.m.%.cab.-.y.s.tfalse(.p.m.n).paa.-ab.-aa.-.aaa.-.a.a.pxe
=> false(73)

もちろんファイルサイズは 0 バイトです
ただこれだと数え上げる途中に合成数でも割ってしまっているので、改善の余地があるかも…?

Pxem で階乗計算をする

13! からはオーバーフローしてうまくいかないかも
32 bit あたりが関係ありそうだけどよく知らないです

3! を計算するなら

ad.-ab.-.t.c.w.c.m.!.tab.-.-.c.a.s.m.n.pxe

5! を計算するなら

af.-ab.-.t.c.w.c.m.!.tab.-.-.c.a.s.m.n.pxe

これは最初に与えられた値の階乗をもとめるプログラムです
上記の場合なら ad.- (= 3), af.- (= 5) です
標準入力から受け取るのもいいとおもいます
もちろんファイルサイズは 0 バイトです

スタックで引数をデクリメントしながら一時領域に数を掛けていく方針です
流れを示すと

  1. 引数をスタックに置く
  2. 一時領域に 1 を置く
  3. スタックの値が 0 以外ならループ突入
  4. 一時領域の値とスタックの値を掛けて一時領域にしまう
  5. スタックの値を 1 減らす
  6. ループの最初 (3.) に戻る
  7. 一時領域の数値を表示する