Androidを英語設定にしたまま日本語をきれいなフォントで表示する

2016/05/26 追記

シンタックスハイライトとか要らんやろみたいなあたりをどうにかしたり常識の記述をどうにかした.読み直すとパーミッションnoobだったためなのか,chmod 777とかやってて完全にガバガバなのでもう少しどうにかならんかったのかという感じです.つか書いてからもう2年弱経ってるので信用しないほうが良いです.
追記ここまで.



お元気でしょうか
私は死んでます

久しぶりにこういう記事書くので緊張している

そもそも

英語を勉強している人に携帯を英語表記に設定している人が多かったのでまねしようとしたら,日本語フォントが中華フォントになった

しかし,Androidに対する知見が少ないために,元のフォントに戻す方法を知らなかったので調べた

手順

前提

  • root権限取得済み
  • adb shellを使える状態
  • 2014/11/11現在の情報 今後xmlファイルの内容が変更される可能性がある

環境として Galaxy Nexus(SC-04D)/ParanoidAndroid 4.6-BETA6 を用いた.

前座
Androidがフォントの読み込む際,優先順位は

/system/etc/fallback_font.xml

に記述されている順である.
システム言語が英語に設定されている場合,最下部には

<family>
        <fileset>
            <file>DroidSansFallback.ttf</file>
        </fileset>
</family>
<family>
        <fileset>
            <file lang="ja">MTLmr3m.ttf</file>
        </fileset>
</family>

と書いてある.通常,日本語設定では

<file lang="ja">MTLmr3m.ttf</file>

が読まれ,日本語はきれいなモトヤLマルベリ3等幅でレンダリングされる.
しかし,英語設定の場合ではその上の

<file>DroidSansFallback.ttf</file>

が読まれ,クソみたいなフォントでレンダリングされる.
今回はこの記述を改変する.

リマウント
通常ではAndroidの/systemは以下のパーミッションでマウントされる.

$ ls -l
...
drwxr-xr-x root root <タイムスタンプ> system
...

そこで,

$ su
# mount -o rw,remount -t ext4 /dev/block/foobar/system /system

これで/systemをいじれるようになった.
なお,ファイルシステムおよびfoobarの部分は引数なしのmountで確認できる.

この状態で放置するのはかなり恐ろしいことのような気がする.インターネット接続を切断しておいたほうが良いかもしれない.

ファイルいじり
目標のファイルは/system/etcにある.

# chmod 777 /system/etc

を叩いて/system/etcを読み書きできるようにする.モード指定は755でも差支えないだろう.
ちなみにadb shellでは文字列によるモード指定は使えないようである.*1

次に目標のファイルをPC上に持ってくる.別のコマンドプロンプト

>adb pull /system/etc/fallback_fonts.xml

を叩けば,adbを動かしているフォルダ(この環境ではsdk/platform-tools)にファイルがコピーされる.
これをエディタで開いて最下部を見ると,冒頭で書いたようになっている.

<family>
        <fileset>
            <file>DroidSansFallback.ttf</file>
        </fileset>
</family>
<family>
        <fileset>
            <file lang="ja">MTLmr3m.ttf</file>
        </fileset>
</family>

これを,

<family>
        <fileset>
            <file>MTLmr3m.ttf</file>
        </fileset>
    </family>
    <family>
        <fileset>
            <file>DroidSansFallback.ttf</file>
        </fileset>
</family>
<family>
        <fileset>
            <file lang="ja">MTLmr3m.ttf</file>
        </fileset>
</family>

とすれば,モトヤマルベリがDroidSansFallbackよりも先に読み込まれる.

後片付け
先ほど編集したファイルを元の場所に戻す.コマンドプロンプトで,

>adb push fallback_fonts.xml /system/etc

とした後,ファイルの属性を整える.

# chmod 644 /system/etc/fallback_fonts.xml
# chown root.root /system/etc/fallback_fonts.xml

/system/etcも元に戻す.

# chmod 755 /system/etc

再起動

# sync
# reboot
終了

調べるのにめっちゃ時間がかかった
2年位前まではfallback_fontsは言語の種類だけあったらしい(言語設定によって変わっていた?)が,今は一つのファイルに集約されているので混乱した
ちなみにキャリア公式のロムなら/system/vendor/の中にもあるらしく,そこも書き換えなければならないらしいのでめんどい
ここまでするならむしろ普通に英語勉強したほうが良い

PCK2014

パソコン甲子園出場者のみなさん,お疲れ様でした
本選出場者のみなさん,頑張ってください
俺はもう疲れたよ...

5問目がボーダーかと思ってたら実は4問目がボーダーだったみたいですね

1問目 問題印刷中に解法を言われてマジで焦る
というか開始3分位でacceptもらってる団体どういうことだよ
2問目 えっこれはなんかえらく簡単ですね
3問目 あっ!この問題過去問でやったことある!→WA1回

ここまで10分

4問目 なぜかWA.飛ばす→ 最後の一時間をすべて注ぐものの完全にダメ
5問目以降 !!??!?????

相方が3ヶ月前までプログラミングの初心者だったのに,当日には1問目を見た瞬間に解法を言ってくれるくらいに成長していたので最強
俺は結局探索を身につけられなかったので雑魚
おかげで5問目以降すべてできなかった感じになった

しかしなぜ4問目でWAが出るんだ...ここで解けていたら激本戦出場ユウテワンチャンアルッショコレ状態だったんだが

実力不足が否めない

おわり

文字列処理できない雑魚

それは私のことだ
C++のコードでは暗黙にusing namespace stdです,あとmain関数は省略

おおよそここから引用しました*1

復習

Cで文字列を扱うとき

#include "stdio"
char s[100];
scanf("%s", s);

のようにする

C++バージョン
#include <string>
string str;

C++では終端をnull文字で管理するのではなく文字数で管理するらしい,
よって最初に文字数を決める必要はないので柔軟

使えそうな関数

stringではいろいろ関数が使える
ここでは競技プロコンで使えそうなやつを列挙

#include <string>
string str = "hoge";
int a  = 0;
bool b;

a = str.length(); //aに文字列の文字数を格納
a = str.size();   //上と宣言まで同じ 使い分けはよくわからない
b = str.empty();  //空の文字列かどうかを判定
str.reserve(new_size);  //文字列をnew_sizeに変更(new_sizeはsize_type型)

ちなみにsize_type型ってのは大抵size_t(unsignded int)らしい*2

文字列から数値への変換はいろいろありすぎて書くのが面倒くさい
<cstdlib>のatoiとか<sstream>のisstringstreamとかいろいろあるらしいが詳しい使い方はよくわかりません*3

おわり

なんかしらんが最近他の高専の方々とつながりができた,たのしい

夏ですね

おはようございません

パソコン甲子園予選が2週間後に迫る中,みなさんいかがお過ごしでしょうか
模擬予選をしたが4問しか解けずこれで大丈夫なのかという感じ

今年が地元(から半径30km以内)で浴衣JKを見られる最後のチャンスだったけど見られなさそうだしつらすぎる




どう考えても後者の日本語がヤバイ

引っ込み思案を治したい

コーディング速度を鍛えたい

以上

あ,マーニー最高でした 原作ほしいです

9/2追記
いろいろあったが浴衣JKと祭りに行けた

STLがつよい

備忘録

よく使うやつ

また追加するかもしれない

すべてstd名前空間に属してる

  • int型,要素数elementsの動的配列を生成*1
#include <vector>
vector<int> vt(elements)
#include <vector>
vector<int>::iterator it;
  • vectorの中身を昇順にソート*3
#include <algorithm>
sort(vector.begin, vector.end);
  • 降順にソート
#include <algorithm>
#include <functional>
sort(vector.begin, vector.end, greater<int>());

初めてのPythonと動的型付けについて

テスト中だがPythonやってみようと思った

C言語Hello worldしようとすると

//C言語
#include <stdio.h>

void main {
printf("Hello, World!");
}

という感じだけど、Pythonなら

#Python
print "Hello,World!"

これだけでいいらしい
この手軽さは非常に良い、The スクリプト言語という感じ

ところがどっこい

Cは静的型付け、Pythonは動的型付けだったのだ!

いままでずっと静的型付け言語ばかりを触っていたために、動的型付けの書き方に慣れない

wikipediaによれば動的型付けとは、

プログラミング言語で書かれたプログラムにおいて、変数や、サブルーチンの引数や返り値などの値について、その型を、コンパイル時などそのプログラムの実行よりも前にあらかじめ決めるということをせず、実行時の実際の値による、という型システムの性質のことである。*1

らしい

たとえば、

//変数hogeに標準入力から整数を代入
int hoge;
scanf("%d", &hoge);

みたいなことするときに、Pythonだと

#変数hogeに標準入力から”何か”を代入
hoge = raw_input()

になる

変数hogeの型はプログラムの実行中に決まるので、上ではraw_input関数からの戻り値によって変化する
つまり、raw_inputから値が来るまでは、hogeは文字列である可能性もあるし、数値である可能性もある

ということは、コーディング中に常に変数がどんな型をとっているのかを意識しないといけない気がする

そもそも変数の型が最初から決まってないのが非常にむず痒い、宣言がないだけでコンパイルできなさそうな気さえしてくる*2

しかし宣言文が無いことでコード自体は短くなるし、これに慣れればコーディングも短い時間でできるような気がしなくもない(憶測)

とにかく

Pythonは便利そう、どんどん活用していきたい
AOJでも使えるので学習する上でも良さそう

テストは知らん

AOJ0280

解いた

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0280

AOJ0280

書いてあることをそのまま全部やっていけば良いという感じだったので比較的楽だった

 

ところで昨日模擬試験をやってみた、コーディングが全くできなさすぎてつらまった

 

あとツイッタークライアントのショートカットをAndroidのホーム画面から全部削除した

全部うまく行きそうなかんじがしてきた

 

躁状態っぽい