androidでネットワーク接続を許可

androidのライブラリ実装中にudp接続ができずに軽くハマるも、getaddrinfo()のエラー値を見ると

no address associated with hostname android
などと出力されている。
調べるてみると、AndroidManifest.xmlに以下を記述すればよいということで解決しますた。

<uses-permission android:name="android.permission.INTERNET"/>

ndk-buildでc++のコードをビルドする

Application.mkに以下を追記

APP_STL := c++_static
NDK_TOOLCHAIN_VERSION := clang

Android.mkに以下を追記

LOCAL_C_INCLUDES := /sources/cxx-stl/llvm-libc++/libcxx/include
include Application.mk

eclipseを使っている場合は,
プロジェクトの[プロパティ]->[C/C++一般]->[パスおよびシンボル]->[インクルード]に以下のパスを追加

/sources/cxx-stl/llvm-libc++/libcxx/include

Emacs on Win32を25.1.1に更新

Emacs24.1でM-x grep-findを実行すると、not matches foundとメッセージが出てgrepできない。
Windowsが内部エンコーディングがShift-JISだから動作しないのだろうと踏んで、emacsエンコードをShift-JISに設定したのだけど、うまく動作しない。

どうやらシェルの設定をbashにして、cygwinのbinのパスを通せば動作するらしいということで、init.elに以下を追加してみた。


(setenv "PATH" "C:/cygwin/bin")
(setq shell-file-name "C:/cygwin/bin/bash.exe")

するとgrep-findは動作してgrepした文字列は取得できるようにはなったけど、今度は


grep: warning: GREP_OPTIONS is deprecated
といった警告メッセージも出るようになった。

この警告メッセージはgrep2.21から出力されるようになったらしいけど、emacs上で出力されているのはバグっぽい.
My Future Sight for Past: Solution of grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
1176547 – emacs grep warns "GREP_OPTIONS is deprecated"

公式サイトを確認すると25.1がリリースされていたので、更新するとgrepの警告メッセージが出力されなくなってあっさりと解決した..
ただし、init.elには


(setenv "PATH" "C:/cygwin/bin")
を設定しておかないとうまく動作しなかった.

TimeMachineのファイル backuppdbの削除方法

既出事案らしいのですが、知らずにTime Machineのファイルであるbackuppdbを削除したらゴミ箱を空にできなくなったという話。TimeMachineを無効にしたので、バックアップファイルいらないから削除!とかやった自分が全て悪いわけですが。

しかしrootでrm -rfでも消えないし、さらにSSDをフォーマットしてOSを再インストールしたあとゴミ箱を覗くとbackuppdbが残ってる..不死身か。

途方に暮れて調査していると以下の記事を発見。
Time Machineのファイルを直接削除 - Qiita

いざという時のために、Time Machineの権限を持った状態で他のコマンドを起動するコマンドが用意されているようです。実行したいコマンドを引数にrootから実行してやればOK。

Time Machineのファイルを直接削除

脱法コマンドだと..?
ターミナルから以下を叩く.

$ sudo /System/Library/Extensions/TMSafetyNet.kext/Contents/Helpers/bypass
> rm -rf /Volumes/<Volume Name>/.Trashes/Backups.backupdb

き、消えたー!

ただ以下のような指摘もあって、bypassコマンドは危ないからtmutil使えって書いてあります。
最初から知ってればこれ使って消してましたが...ゴミ箱に放り込んだら意味なしですよね.
macos - How can I delete Time Machine files using the commandline - Super User

というわけでTimeMachineのバックアップファイルを迂闊にゴミ箱に放り込まないように気をつけよう。

android SDKアップグレードによるappcompat-v7のエラー対処

android SDKのバージョンをAndroid6.0(API 23)にアップグレードして、プロジェクトを読み込むと以下の箇所でエラーになり、ビルドできません。

import android.support.v7.app.ActionBarActivity;

以下のエントリによると、どうやら新たにappcompatを設定しないといけないようです。
https://akira-watson.com/android/lollipop-api-21.html
android - Private Librariesが消えてしまいました。 - スタック・オーバーフロー

当方もandroid studioにまだ移行できてないので、非常に助かりました..

環境

eclipse Mars 4.5.1
android 6.0 (API 23)

AppCompat

そもそもAppCompatってなんぞと思ったので調べてみました。

AppCompat(別名 ActionBarCompat)は Android 4.0 の ActionBar API を Gingerbread 搭載デバイスに対応させるためのバックポートとしてはじまり、バックポートとフレームワーク共通の API レイヤーを提供していました。

https://googledevjp.blogspot.jp/2014/11/appcompat-v21-lollipop.html

つまり上位のAPILevelの機能を下位のAPILevelで動作させるための仕組みと理解しました。

原因

上記のStackOverflowでも議論されていますが、どうやら新しいSDKにアップグレードしたことで、AppCompatを参照できなくなったようです。
なので、新しいAppCompatをインポートして、古いAppCompatを参照している設定を削除し、新しいAppCompatへの参照を設定することで解決できる模様。

Eclipseの場合、ActionBarActivityを使うには同じワークスペースのプロジェクトに、v7 support libraryが必要です。<中略>
ADTの以前のバージョンでは新規プロジェクトを作る度に、自動で最新版をインポートして新規プロジェクトと紐付けていたのですが、現在は手動でインポートしてビルドパスの解決を行う必要があるみたいですね。

android - Private Librariesが消えてしまいました。 - スタック・オーバーフロー

現状確認

  1. プロジェクトを選択して右クリック[プロパティ]
  2. [Andorid]-[ライブラリー]のappcompatがエラーになっていることを確認

対策1:android-support-v7-appcompatのインストール

上記エントリにも書いてありますが、appcompat-v7の設定手順をメモとして残しておきます。

  1. [ファイル]->[インポート]->[Android]->[Existing Android Code Into Workspace]を選択
  2. [ルート・ディレクトリー]に/extras/android/support/v7/appcompat/を参照するように設定
  3. パッケージエクスプローラandroid-support-v7-appcompatのプロジェクトがインポートされる
  4. libs内のandroid-support-v7-appcompat.jarを選択して右クリック->[ビルド・パス]->[ビルドパスに追加]
  5. libs内のandroid-support-v7-appcompat.jarを選択して右クリック->[ビルド・パス]->[ビルドパスの構成]を選択
  6. プロジェクトのプロパティが開くので、[順序およびエクスポート]タブにandroid-support-v7-appcompat.jarが設定されていることを確認
  7. 同タブ内の[Android Dependencies]のチェックを外す
  8. 作成しているアプリケーションのプロジェクトを右クリック->プロパティ->[Android]->[ライブラリ]を開く
  9. 新しいappcompat-v7があることを確認したら古いappcompat-7を除去して新しいappcompat-v7を追加

上記エントリによればminSdkVersionを13以下に設定するとappcompat-v7が自動的に生成されてしまうようですので、14以上にすることで回避できるそうです。

<uses-sdk android:minSdkVersion="14"
          android:targetSdkVersion="21" />

ビルド

これで動くかと思いきや、ビルドすると今度は以下のようなエラー。

You need to use a Theme.AppCompat theme (or descendant) with this activity.
ActivityでTheme.AppCompatを使えや!と怒られました。

対策2:style.xmlのThemeを修正

本件の対策については、以下に詳しく書かれていました。
Proguard有効でビルドを行ったアプリを起動するとIllegalStateException: You need to use a Theme.AppCompat theme... - Qiita

対策として以下を行いました。

  • res/values-v11/style.xmlで定義されているTheme.LightをTheme.AppCompat.Lightに変更
  • res/values-v14/style.xmlで定義されているTheme.Light.DarkActionBarをTheme.AppCompat.Light.DarkActionBarに変更
  • proguard-project.txtに以下を追加
-keep class com.google.android.gms.** { *; }
-keep public class com.google.android.gms.**
-dontwarn com.google.android.gms.**
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }
  • project.propatiesに記述されている以下のコメントを外す


proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

というわけで、無事に動作しました。

emacsのpython-modeでインデント

emacspythonのコードを書く際にインデントしようとして、いつものように範囲選択後に


M-x indent-region
としても反映されなくて困った。

そこで、試しにM-x python- でTABを入力すると、


python-indent-shift-left
python-indent-shift-right
とそれっぽいものが。

というわけで解決しましたが、入力が長いので後日ショートカットに割り当てることにします。

libeventのメモリリークを追う

デバッグしていると,libeventで盛大なメモリリークを確認しました。
スタックトレースで追っていくと、どうやらevthread_use_windows_threads()でリークしている模様。非同期処理するためには、この関数で有効化する必要があるんですけど、ここでリークしているとは...

調査してみると、コミュニティでは議論されている模様。
[Libevent-users] evthread_use_windows_threads() cause memory leak?

とりあえず終了時にlibevent_global_shutdown()を呼べばOK!みたいなことが書かれていたので、該当するAPIを探してみるものの存在しない。どうやら2.0.x系では無いみたいです。

というわけで、2.1.x系にアップデートしてlibevent_global_shutdown()を呼んだらリークは解消しました。
きっとevthread_use_windows_threads()で内部的に確保したリソースを開放し忘れていているんでしょうけど..
あとでソースを読んでみることにします。