criticablog

ソフトウェアエンジニアがニッチな情報を書きます。

広告を表示しなくても iOS 広告用識別子を使えた

広告を表示しないけれど、広告効果計測用のライブラリを使う iPhone アプリを作成しました。iTunes Connect にアップロードし審査へ提出するときの

このAppは広告ID(IDFA)を使用しますか?

が「はい」でも「いいえ」でも審査は通りました。 「はい」のときここらへんは多分チェックつけたはず:

  • App内で広告を出す
  • このAppのインストールを、前に出した広告と関連付ける
  • このApp内で行われたアクションを、前に出した広告と関連付ける

Apple Developer Program License Agreement の 3.3.12節

Advertising Identifier: 3.3.12 You and Your Applications (and any third party with whom You have contracted to serve advertising) may use the Advertising Identifier, and any information obtained through the use of the Advertising Identifier, only for the purpose of serving advertising. If a user resets the Advertising Identifier, then You agree not to combine, correlate, link or otherwise associate, either directly or indirectly, the prior Advertising Identifier and any derived information with the reset Advertising Identifier.

には “only for the purpose of serving advertising” とありますがこれが直接広告の画像なりテキストなりを app 内で表示することを指すわけではない、ということでしょうか。

一般的なアプリケーションの却下理由 - App Store - Apple Developer

アプリケーションで IDFA を使用していると答えたものの広告機能を備えていない、または広告が適切に表示されない場合は、アプリケーションが却下される可能性があります。

If you indicate that your app uses the IDFA, but it does not have ad functionality or does not display ads properly, your app may be rejected.

にある「広告機能」は広告表示に限らず、広告の効果測定のような、アプリを見て分からない機能も含むというということでしょうか。

それでは 2014年に英語や日本語でリジェクトされるぞって言っていたのは何だったのでしょう。

Appleのデベロッパに広告識別子の規則遵守が義務化, 違反者はApp Storeから拒絶される | TechCrunch Japan

ちなみに Android で使える Google Play 開発者サービスの Advertising ID はユーザーの分析に使えると書いてあります。

play.google.com

bitnami redmine と同じホストで git 連携する

目的

Bitnami 版 Redmine と同じホストの /git というパスで git リポジトリにHTTPアクセスできるようにする。 もちろん Redmine のプロジェクトのメンバー管理と連動して git リポジトリへのアクセス制限を掛ける。

git-http-backend を(mod_cgi.so が Apache に無かったので)fcgiwrap を使って FastCGI として実行することにした。

Bitnami 公式ドキュメントの手順 https://wiki.bitnami.com/Applications/BitNami_Redmine#How_to_configure_Redmine_for_advanced_integration_with_Git と比較すると、git.YOUR_DOMAIN_NAME とか別VirtualHost を切らなくていいし、htdocs 下に別の Passenger アプリ grack を置く必要もない(Apache の設定は詳しくないので別なやり方あれば教えてください……)。

なおリポジトリをこの Redmine 上で作成するために SCM Creator プラグイン を入れているが、たぶん無くても動作するのでここでは説明しない。

材料と道具

使用したバージョン

設定

fcgiwrap

apache (/opt/bitnami/apache2/bin/httpd.bin) プロセスが fcgiwrap の作るソケットに読み書きできるようにユーザ/グループを設定する。

/etc/default/fcgiwrap

FCGI_USER=daemon
FCGI_GROUP=bitnami
FCGI_SOCKET_OWNER=daemon
FCGI_SOCKET_GROUP=daemon

httpd の設定

vcs.conf とか別ファイルに書いて /opt/bitnami/apache2/conf/httpd.conf から Include する。

<IfModule !perl_module>
LoadModule perl_module modules/mod_perl.so
</IfModule>
<IfModule !env_module>
LoadModule env_module modules/mod_env.so
</IfModule>
PerlLoadModule Apache::Authn::Redmine

# Subversionの設定
<Location /svn>
    DAV svn
    SVNParentPath /opt/repositories/svn
    SVNListParentPath on
    # 適当な内容の設定を置いてある
    AuthzSVNAccessFile /usr/local/etc/svnauthz

    AuthType Basic
    AuthName "Subversion"
    # http://www.redmine.org/boards/2/topics/35428
    AuthUserFile /dev/null
    Require valid-user

    # Redmine プロジェクトのメンバー管理と連動したアクセス制御。
    PerlAccessHandler Apache::Authn::Redmine::access_handler
    PerlAuthenHandler Apache::Authn::Redmine::authen_handler
    # /opt/bitnami/apps/redmine/htdocs/config/database.yml と同じ値にする。
    RedmineDSN "DBI:mysql:database=bitnami_redmine;host=localhost;mysql_socket=/opt/bitnami/mysql/tmp/mysql.sock"
    RedmineDbUser "bitnami"
    RedmineDbPass "****"
</Location>

# Gitの設定
# bitnami の apache には mod_cgi.so が付属しないので CGI コマンドを直接実行できない。
<IfModule !proxy_module>
LoadModule proxy_module modules/mod_proxy.so
</IfModule>
<IfModule !proxy_fcgi_module>
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
</IfModule>

LogLevel trace2
# Alias を使い SCRIPT_FILENAME が git-http-backend を指すようにする。$1 は GIT_PROJECT_ROOT 下のディレクトリ名
AliasMatch "/git/(.+)" "/opt/bitnami/git/libexec/git-core/git-http-backend/$1"
<Location /git>
    # SCRIPT_FILENAME 変数が proxy:fcgi://〜 で始まるというバグが Apache 2.4.20 の mod_proxy_fcgi にある。
    # [Bug 59618 – SCRIPT_FILENAME is prefixed with bogus "proxy:fcgi"](https://bz.apache.org/bugzilla/show_bug.cgi?id=59618)
    # そのため fcgiwrap が実行すべきコマンドが分からず
    # Cannot get script name, are DOCUMENT_ROOT and SCRIPT_NAME (or SCRIPT_FILENAME) set and is the script executable?
    # というエラーを返す。 https://github.com/gnosek/fcgiwrap/blob/master/fcgiwrap.c
    # 一方 proxy:balancer: は除去するようになっているので balancer を経由するよう書けばよい:
    SetHandler "proxy:balancer://fcgi59618workaround"
    # バグ修正されたバージョンの Apache を使う場合こうなるはず:
    #SetHandler "proxy:unix:/run/fcgiwrap.socket|fcgi://."

    SetEnv GIT_HTTP_EXPORT_ALL ""
    SetEnv GIT_PROJECT_ROOT "/opt/repositories/git"

    AuthType Basic
    AuthName "Git"
    # http://www.redmine.org/boards/2/topics/35428
    AuthUserFile /dev/null
    Require valid-user

    # Redmine プロジェクトのメンバー管理と連動したアクセス制御。
    PerlAccessHandler Apache::Authn::Redmine::access_handler
    PerlAuthenHandler Apache::Authn::Redmine::authen_handler
    # /opt/bitnami/apps/redmine/htdocs/config/database.yml と同じ値にする。
    RedmineDSN "DBI:mysql:database=bitnami_redmine;host=localhost;mysql_socket=/opt/bitnami/mysql/tmp/mysql.sock"
    RedmineDbUser "bitnami"
    RedmineDbPass "****"
    RedmineGitSmartHttp yes
</Location>

# bug 59618 の回避策用の balancer を定義する。ここで決めた名前に proxy: をプレフィクスして上の SetHandler で参照している。
<Proxy "balancer://fcgi59618workaround">
    # fcgiwrap は FCGI プロトコルをしゃべり、SCRIPT_FILENAME で指定された CGIコマンド を実行する。
    # Unix domain socket を使う記法は https://httpd.apache.org/docs/2.4/en/mod/mod_proxy_fcgi.html のとおり。
    # socat でデバッグするときはソケットの path を変更する。
    BalancerMember "unix:/run/fcgiwrap.socket|fcgi://."
</Proxy> 

モジュールの配置

mkdir -p /opt/bitnami/perl/lib/site_perl/5.16.3/Apache/Authn
ln -sv /opt/bitnami/apps/redmine/htdocs/extra/svn/Redmine.pm /opt/bitnami/perl/lib/site_perl/5.16.3/Apache/Authn/Redmine.pm

おわりに

以上の設定で /opt/repositories/git/aaa を git clone http://(サーバ名)/git/aaa などと読み書きできるはず。

/opt/bitnami/apache2/conf/httpd.conf は大部分 bitnami の配布しているままだが、再現性の観点から載せとく。

/opt/bitnami/apache2/conf/httpd.conf

Apache で mod_proxy_fcgi と fcgiwrap を組み合わせる例もウェブ上には少ないので参考になると思う。

おまけ

FastCGIunix domain socket 通信内容を見たい場合 socat を apt-get でインストールして

sudo socat -t100 -v unix-listen:/home/bitnami/fcgiwrap.socket,mode=777,reuseaddr,fork unix-connect:/run/fcgiwrap.socket > ~/fcgiwrap.log 2>&1 &

と起動しておいて上の vcs.confunix:/run/fcgiwrap.socket と書いてるとこを unix:/home/bitnami/fcgiwrap.socket と置き換えればよい。 ちなみに設定を書き換えたら sudo /opt/bitnami/ctlscript.sh restart apache で読みなおす必要がある。

SSL protocol error of Device Portal on Windows 10 Mobile

Device Portal of Windows 10 Mobile is now available on NuAns NEO but it's not usable. Browsers say “The connection to the server was reset while the page was loading.” This is not a kind of insecure-certificate problem.

update 2016-07-31: I found that the SNI servername other than "localhost" causes the error. So a workaround is to use USB connection with URL https://localhost:10443/ .

My NuAns NEO:

  • Windows 10 Mobile, build 10.0.14393.5 (The problem exists since the first 10586 build which come to NuAns NEO as far as I can remember.)
  • Firmware rev 1028.020.001.79

I've tested it with the openssl command.

C:> openssl s_client -connect 172.16.10.186:443
CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 306 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1469769595
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

The message lacks server certificate, cipher string and so on. I wonder what situation/configuration causes this. Like the phone vendor forgot to install something?

Using USB connection doesn't help because http://127.0.0.1:10080 redirects https page which emits the same erroneous message. cURL says unknown SSL protocol error:

C:> curl --verbose -i https://127.0.0.1:10443/
* STATE: INIT => CONNECT handle 0x600082340; line 1402 (connection #-5000)
* Added connection 0. The cache now contains 1 members
*   Trying 127.0.0.1...
* STATE: CONNECT => WAITCONNECT handle 0x600082340; line 1455 (connection #0)
* Connected to 127.0.0.1 (127.0.0.1) port 10443 (#0)
* STATE: WAITCONNECT => SENDPROTOCONNECT handle 0x600082340; line 1562 (connection #0)
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /usr/ssl/certs/ca-bundle.crt
  CApath: none
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* STATE: SENDPROTOCONNECT => PROTOCONNECT handle 0x600082340; line 1576 (connection #0)
* Unknown SSL protocol error in connection to 127.0.0.1:10443
* multi_done
* Closing connection 0
* The cache now contains 0 members
* Expire cleared
curl: (35) Unknown SSL protocol error in connection to 127.0.0.1:10443

In contrast, connection to another phone Lumia 1520 succeeds as follows.

C:> openssl s_client -connect 172.16.10.5:443
CONNECTED(00000003)
depth=0 CN = 172.16.10.5
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = 172.16.10.5
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/CN=172.16.10.5
   i:/CN=Microsoft Windows Web Management (Test) (Windows-Phone)
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDYzCCAkugAwIBAgII/x+R…
-----END CERTIFICATE-----
subject=/CN=172.16.10.5
issuer=/CN=Microsoft Windows Web Management (Test) (Windows-Phone)
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1355 bytes and written 432 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 1324…
    Session-ID-ctx:
    Master-Key: 2818…
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 146976…
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---
read:errno=104

AT&Tでできる Lumia SIMアンロック

昨年の某イベントで配布された Lumia 1520 などの Windows Phone は AT&T回線にロックされていた。しかし現在はAT&T自身が非契約者にもアンロックコードを提供しているので、これらのスマートフォンSIMロックを安全かつ無料で解除できる。


従来、AT&T回線ロックされた端末をロック解除するには AT&Tと契約をするか、米国のアンロック業者を使う必要があった。

statemachine.hatenablog.com

ところが10月に AT&Tのページを読みなおしてみると、契約を持っていない者もアンロックできるように書いてある。

AT&T Wireless Consumer Device Unlock Request

ページなかほどの非顧客 (Non-AT&T Mobility Customers) のところ:

You’ve never had an AT&T wireless account and you meet the General Requirements for unlock requests.

ということで、上の General Requirements for All Unlock Requests を読んで当てはまるなら申請できる。

次のページでは Customer Type: Non-AT&T Mobility customer を選ぶと番号などの入力が不要になる。 IMEIなどの必要事項を入力すれば Confirmation Email が送られてくる。 もしかしたら必要事項を入力してサブミットしたとき、間違えたつもりは無くとも、失敗したとかエラーとか出るかもしれない。後日再度入力したらいいはず。 f:id:criticabug:20151101224104p:plain

Confirmation Email の指示に従いリンクにアクセスするとリクエストが受け付けられ、2営業日以内にアンロック コードが用意される。メールで送られてくるかはわからないが、このページでステータスを確認するとアンロックコードが得られる:

AT&T Wireless Consumer Device Unlock Status f:id:criticabug:20151101223555p:plain

SIMを Windows Phone に挿し数字20桁のアンロックコードを間違えずに入力するとあっさりアンロックに成功する。APN設定を行えば通信ができるようになるだろう。1520は 4G (iijmio LTE) も利用できる。なお技適(ry

またこの端末は以前 8.1 Developer Preview や Windows 10 Mobile Insider Preview にアップグレードしていたが、使っていると反応がなくなるなど不安があったので、端末リセットしてあったことを付記しておく。

Windows 10 Mobile のリリースが待ち遠しい。


以下余談

なぜ AT&T が契約を持っていない者にも回線アンロックを許可するようになったかというと、CTIAという業界団体のガイドラインが 2015年2月に変わっただか発行されただかが関係あるようだ。

build fglrx module for linux 3.17 or later

こんばんわ。グラボRadeon 使っています。

2〜3ヶ月前から最新の linux カーネル用に fglrx ドライバをビルドできなくなっていたので、しかたなく linux 3.16 を使っていました。

しかし今回パッチを見つけたのでそれを適用してビルドしました。module-assistant 使う場合にオレオレ パッチをとりあえず差し込めましたが、これでよかったのでしょうか。

一回失敗する

%  module-assistant --text-mode --verbose build fglrx
NOTE: You are not root but member of the src group. Mapping the base
working directory to "/usr/src/modass".
Found sudo, will use it for %s and dpkg commands.unpack
Removing old /usr/src/modass/usr_src/modules/fglrx/ tree
 rm -rf /usr/src/modass/usr_src/modules/fglrx
Extracting the package tarball, /usr/src/fglrx.tar.bz2, please wait...
 tar --bzip2 -x -f /usr/src/fglrx.tar.bz2
tar: modules: Cannot utime: Operation not permitted
tar: modules: Cannot change mode to rwxr-xr-x: Operation not permitted
tar: Exiting with failure status due to previous errors
"/usr/share/modass/packages/default.sh" build KVERS=3.17.0-trunk-amd64 KSRC=/lib/modules/3.17.0-trunk-amd64/build KDREV=3.17.4-1~exp1 kdist_image
 fakeroot debian/rules kdist_clean
/usr/bin/make  -f debian/rules clean
make[1]: Entering directory '/usr/src/modass/usr_src/modules/fglrx'
test -f debian/control || cp debian/control.template debian/control
dh_testroot
rm -f configure-stamp
rm -f fglrx.ko fglrx.mod.c *.o
rm -f .version .*.o.flags .*.o.d .*.o.cmd .*.ko.cmd
rm -rf .tmp_versions
rm -rf patch
dh_clean debian/control debian/install
make[1]: Leaving directory '/usr/src/modass/usr_src/modules/fglrx'
 fakeroot debian/rules KVERS=3.17.0-trunk-amd64 KSRC=/lib/modules/3.17.0-trunk-amd64/build KDREV=3.17.4-1~exp1 kdist_image
/usr/bin/make  -f debian/rules binary_modules
make[1]: Entering directory '/usr/src/modass/usr_src/modules/fglrx'
sed -e 's/#KVERS#/3.17.0-trunk-amd64/g' \
    -e 's/#VERSION#/1:14.9+ga14.201-2/g' debian/control.template > debian/control
sed 's/#KVERS#/3.17.0-trunk-amd64/g' debian/install.template > debian/install
touch configure-stamp
dh_testdir
dh_prep
/usr/bin/make -C /lib/modules/3.17.0-trunk-amd64/build SUBDIRS=/usr/src/modass/usr_src/modules/fglrx modules
make[2]: Entering directory '/usr/src/linux-headers-3.17.0-trunk-amd64'
Makefile:10: *** mixed implicit and normal rules: deprecated syntax
make[1]: Entering directory `/usr/src/linux-headers-3.17.0-trunk-amd64'
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/firegl_public.o
/usr/src/modass/usr_src/modules/fglrx/firegl_public.c:6387:12: warning: ‘KCL_fpu_save_init’ defined but not used [-Wunused-function]
 static int KCL_fpu_save_init(struct task_struct *tsk)
            ^
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_acpi.o
/usr/src/modass/usr_src/modules/fglrx/kcl_acpi.c: In function ‘KCL_ACPI_Slot_No_Hotplug’:
/usr/src/modass/usr_src/modules/fglrx/kcl_acpi.c:845:21: error: ‘struct acpi_device_flags’ has no member named ‘no_hotplug’
          tdev->flags.no_hotplug = true;
                     ^
/usr/src/linux-headers-3.17.0-trunk-common/scripts/Makefile.build:262: recipe for target '/usr/src/modass/usr_src/modules/fglrx/kcl_acpi.o' failed
make[5]: *** [/usr/src/modass/usr_src/modules/fglrx/kcl_acpi.o] Error 1
/usr/src/linux-headers-3.17.0-trunk-common/Makefile:1390: recipe for target '_module_/usr/src/modass/usr_src/modules/fglrx' failed
make[4]: *** [_module_/usr/src/modass/usr_src/modules/fglrx] Error 2
Makefile:181: recipe for target 'sub-make' failed
make[3]: *** [sub-make] Error 2
Makefile:8: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/usr/src/linux-headers-3.17.0-trunk-amd64'
debian/rules:53: recipe for target 'build' failed
make[1]: *** [build] Error 2
make[1]: Leaving directory '/usr/src/modass/usr_src/modules/fglrx'
debian/rules:109: recipe for target 'kdist_image' failed
make: *** [kdist_image] Error 2
BUILD FAILED!
See /usr/src/modass/var_cache_modass/fglrx-source.buildlog.3.17.0-trunk-amd64.1419839576 for details.
Build failed. Press Return to continue...

エンター押しといてください

パッチを拾う

fglrx linux 3.17 と検索して見つけたのが https://gist.github.com/aginor/4f232d4c28aef7685282 です。なるほど no_hotplug の代わりに別のところに ignore_hotplug ができたんですね。

% cd /usr/src/modass/usr_src/modules/fglrx
% curl -O https://gist.githubusercontent.com/aginor/4f232d4c28aef7685282/raw/c7958e092fa19b4e2603e9bd377aca89569d77fb/AMD-fglrx-3.17.patch

debian/rules を修正

build ルールの $(MAKE) 直前あたりが適当そうです。さっきの .patch で目当てのコードが書き換わるよう、こう修正してみましょう:

build: configure-stamp
    dh_testdir
    dh_prep
    patch kcl_acpi.c AMD-fglrx-3.17.patch
    $(MAKE) -C $(KSRC) SUBDIRS=$(CURDIR) modules

いつもの patch -p0 < ○.patch の書き方だとどのファイルにパッチあてるかファイル名聞かれちゃいます。

ビルド

%  fakeroot debian/rules KVERS=3.17.0-trunk-amd64 KSRC=/lib/modules/3.17.0-trunk-amd64/build KDREV=3.17.4-1~exp1 kdist_image
/usr/bin/make  -f debian/rules binary_modules
make[1]: Entering directory '/usr/src/modass/usr_src/modules/fglrx'
dh_testdir
dh_prep
patch kcl_acpi.c AMD-fglrx-3.17.patch
patching file kcl_acpi.c
/usr/bin/make -C /lib/modules/3.17.0-trunk-amd64/build SUBDIRS=/usr/src/modass/usr_src/modules/fglrx modules
make[2]: Entering directory '/usr/src/linux-headers-3.17.0-trunk-amd64'
Makefile:10: *** mixed implicit and normal rules: deprecated syntax
make[1]: Entering directory `/usr/src/linux-headers-3.17.0-trunk-amd64'
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_acpi.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_agp.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_debug.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_ioctl.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_io.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_pci.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_str.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_iommu.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_wait.o
  LD [M]  /usr/src/modass/usr_src/modules/fglrx/fglrx.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /usr/src/modass/usr_src/modules/fglrx/fglrx.mod.o
  LD [M]  /usr/src/modass/usr_src/modules/fglrx/fglrx.ko
make[2]: Leaving directory '/usr/src/linux-headers-3.17.0-trunk-amd64'
dh_testdir
dh_testroot
dh_installdirs
dh_install
dh_installdocs
dh_installchangelogs
dh_installmodules
dh_bugfiles
dh_lintian
dh_link
dh_strip
dh_compress
dh_fixperms
dh_installdeb
dh_gencontrol -- -v1:14.9+ga14.201-2+3.17.4-1~exp1 \
        -V'fglrx:Version=14.9+ga14.201' \
        -V'built:using:kernel=linux (=3.17.4-1~exp1)' \
        -V'built:using:fglrx=fglrx-driver (=1:14.9+ga14.201-2)'
dpkg-gencontrol: warning: File::FcntlLock not available; using flock which is not NFS-safe
dh_md5sums
dh_builddeb --destdir=/usr/src/modass/usr_src/modules/fglrx/../..
dpkg-deb: building package `fglrx-kernel-3.17.0-trunk-amd64' in `/usr/src/modass/usr_src/modules/fglrx/../../fglrx-kernel-3.17.0-trunk-amd64_14.9+ga14.201-2+3.17.4-1~exp1_amd64.deb'.
make[1]: Leaving directory '/usr/src/modass/usr_src/modules/fglrx'

お、パッケージできました。なるほど。

%  ls -l ../../
total 2184
-rw-r--r--  1 yosi src 2217200 Dec 29 17:15 fglrx-kernel-3.17.0-trunk-amd64_14.9+ga14.201-2+3.17.4-1~exp1_amd64.deb

インストール

dpkg -i 使うなりそれぞれのやり方でインストールしてください。 うちは全部 apt-get(aptitude) で把握したいのでローカルリポジトリに配置します。詳細は省略します。

% mv ../../fglrx-kernel-3.17.0-trunk-amd64_14.9+ga14.201-2+3.17.4-1\~exp1_amd64.deb /var/cache/apt-build/repository 
# apt-build build-repository && aptitude update; aptitude install fglrx-kernel-3.17.0-trunk-amd64

Xorg 再起動

OS再起動してもいいけど。

# modprobe fglrx
# sleep 60 && service kdm stop && sleep 60 && service kdm start

それではこれから確かめてみます。

Dvorak 配列を実用するために

Dvorak 配列は言及されることの多いわりに使っている人を見ない。私は最近5年は家でもそれ以外でもほとんど Dvorak 配列で入力してきたので、どのようにしてその環境を維持してきたのか説明し、これから始める人への一助としたい。

どこでも Dvorak を使う

私は職場 (Windows) と自宅 (Linux, Mac) の両方で Dvorak を使っている。 さらにスマホでもアルファベットをフリック入力にしてとことん QWERTY を避けた。 新しいやり方を続けたいのなら慣れたやり方を捨ててどっぷり浸かるべきだし、 QWERTY で入力する場面が残っている場合、きっといつまでも感覚の切り替えが必要になってつらい。

英語配列キーボードを使う

普通のひとはキーボードのレイアウト変更で、ソフトウェア的に Dvorak 配列を使うと思う。このとき jp106 キーボードに対してスタンダードな Dvorak マッピングというものは存在しないので、loadkeys マップなどを自分で編集することになる。Windows の場合スキャンコード入れ替えでは対応できないのでオンラインソフトを常駐させる必要すらあったかもしれない。一方 英語配列キーボード (pc104) ならば最初からOSが用意しているマップを使えるので、どのOSでも手早く始められる。

英語配列ならキートップを入れ替えて Dvorak 表示にすることもできるが、たまに他の人に使わせることがあるならやめといたほうがよい。

日本語入力では c で か行 とする

日本語は子音母音となることが多く、Dvorak を使うと右手と左手が交互に打鍵されることが多い。 だが k の文字は左手人差し指が担当(QWERTYで v の位置)なので極端に か行 が入力しづらくなる。 そこでIMEのローマ字マッピングを次のように変更しよう。

  • ca -> か
  • ce -> け
  • ci -> き
  • co -> こ
  • cu -> く
  • cya -> きゃ
  • cye -> きぇ
  • cyi -> きぃ
  • cyo -> きょ
  • cyu -> きゅ

ちなみに左手担当のほかの子音は p, y, q, j. じゃ行 も zy のほうが入力しやすい。

たまに他の人にキーボードを使わせる場合

上司が思ったように打てないと、Dvorak に対する風当たりが強くなってしまうかもしれない。

Windows7でDvorakとQwertyを簡単に切り替える方法の提案 - nishio-dens's diary

自分が Google IME を使って、他の人には MS IME を使わせるのでもいいと思う。

逆に自分が人のキーボードで入力しなきゃいけないとき、キーを見ないと打てなくなっている。

OSログインパスワードで使う文字を制限する

ログイン画面でユーザ名の入力不要のOSがあるが、そういう不親切なOSではパスワードを入力するときにキーボードレイアウトが間違っていることに気付きにくい。そこで、Dvorak でも QWERTY でも位置が変わらない英数字や記号だけを使ってパスワードを作ろう(このようなことを公言するべきではないかもしれない。複雑で長いパスワードにすること)。

これはさらに、Dvorak 配列を設定したコンソールに KVM over IP(リモート)で接続したときに QWERTY->Dvorak写像が余計に入る(v を押すとコンソールは k を受け取り t を表示する)問題に対する workaround となる。なにせログインしなければ loadkeys でデフォルトマップに戻すこともできないのだから、どちらでも同じく入力できるパスワードというのは重宝するのだ。

その他

  • hl は右手、jk は左手で打てば vim も問題ない。
  • C-x C-f は、それぞれ左手右手で打つ。両手を使わざるをえない。x(QWERTY で b の位置)は右手と左手の真ん中だが、そういうわけで左手で打つことが多い。
  • MacBook (Air|Pro) ではUS配列を消して DvorakGoogle IME を切り替えて使っている。

Debian Chrome で半角文字だけ文字化けする

Google Chrome のURLバーやメニューなどで、英数字が表示されるべき部分だけ全角記号やひらがなに置き換わってしまう問題が起きていた。Debian では fonts-droid パッケージを更新すると直る。

Chrome 以外にも同じ文字化けをしたアプリがあった気がして、現象も一言で言いづらいし、Debian (fontconfig) か KDE の問題か切り分けられてもいなかったので1ヶ月ほど放置していた。 さっき4〜5回ググって chrome フォント 半角 文字化け というキーワードで数ヶ月以内の記事を探したら上記の二つの記事が見つかった。

問題のパッケージをアンインストールできるかなと aptitude で見てみれば fonts-droid 1:4.4.4r2-2 という更新があったのでとりあえずインストール

Retrieving bug reports... Done
Parsing Found/Fixed information... Done
Reading changelogs... Done
debconf: apt-extracttemplates failed: Illegal seek
(Reading database ... 456082 files and directories currently installed.)
Preparing to unpack .../fonts-droid_1%3a4.4.4r2-2_all.deb ...
Unpacking fonts-droid (1:4.4.4r2-2) over (1:4.4.3r1.1-1) ...
Processing triggers for fontconfig (2.11.0-6.1) ...
[master 1ce1037] committing changes in /etc after apt run
 1 file changed, 1 deletion(-)
 delete mode 120000 fonts/conf.d/65-droid-sans-fonts.conf
Press Return to continue.

/etc/fonts/conf.d/65-droid-sans-fonts.conf が削除され、Chrome を再起動すると直った。

使用している Chrome は 37.0.2062.3-1 (Google 公式)

ちなみに愛用しているフォントは VL Gothic です。0 と O, I と l の区別がつきやすい。