2013年9月11日水曜日

COREファイルの出力先

COREファイルの出力先についてよくわからないことがある.

COREファイルの出力先は, 「/proc/sys/kernel/core_pattern」に定義されており, RHEL6/CentOS6はデフォルトで以下のように定義されている.
|/usr/libexec/abrt-hook-ccpp <hogehoge>
<hogehoge>の部分はRHELとCentOSで異なっていた.
Linux2.6.19以降, 上記のようにCOREファイルをパイプ後方のプログラムの標準入力に渡すことができるようだ. この場合, 「abrt-hook-ccpp」というプログラムに渡している.
つまり, バグ報告プログラム「ABRT」にCOREファイルを渡すということが読み取れる.

ということは, COREファイルは「ABRT」に渡されるのだから, 実行ファイルと同じディレクトリには出力されなくなっているのではないだろうか?
ちょっと調べてみると, このページには, 実行ファイルと同じディレクトリにCOREファイルを出力するのであればcore_patternの記述を変更しなさいと書かれている(3. Ruling out ABRTのところ).

ところが, RHEL6.1がインストールされたとある環境では, core_patternで「ABRT」に渡しているのにもかかわらず, COREファイルが実行ファイルと同じディレクトリに出力されていた. もしかして「ABRT」が正常に機能していない場合は, 実行ファイルの場所に出力される仕様なのか?

【2013/09/12 追記】
以下のドキュメントを見つけた.

「How to Enable Creation of Core Dump Files Due to Crashed Applications in Fedora Linux Distribution」

この中に以下の記述がある.
$sysctl -a|grep core_pattern
kernel.core_pattern = |/usr/libexec/abrt-hook-ccpp /var/cache/abrt %p %s %u %c

“abrtd” creates a sub-directory (named something like “ccpp-1279914365-14618″) in the directory “/var/cache/abrt” as shown in the value of the variable. This also means that the core files will also be stored in that sub-directory in the “/var/cache/abrt” directory (in addition to the current directory where application was run). ABRT daemon also creates other files in addition to the core dump files in the sub-directory to further help users in debugging the crash issue.
 つまり, abrt-hook-ccppにパイプすると, 実行ファイルと同じディレクトリにCOREファイルを出力するのに加えて, バグレポート用にCOREファイルを「/var/cache/abrt/ccpp-<hoge>(RHEL6.1では, /var/spool/abrt/ccpp-<hoge>)」配下にも出力するということだ.

実際にプロセスをKILLしてみたところ, COREファイルが両方に出力されることを確認できた. この状態だとCOREファイルのサイズが倍になるということだから, 知らずにシステム設計してしまうと, ディスク使用量の見積もりを間違えて大変なことになるな.

2013年9月9日月曜日

セキュリティコンテキストの設定

SELinuxが有効になっているCentOS6上にpukiwikiを設置しようとして, セキュリティコンテキストの設定に手こずった.
SELinuxが有効になっている場合, とあるセキュリティコンテキストが設定されているディレクトリ配下のファイルには, セキュリティコンテキストが適切に設定されている必要があるようだ(経験上そうらしいというだけしか知らない).
SELinuxを無効にするのが手っ取り早いのだが, 悔しいのであえて有効のままやった.

手こずった経緯を書くのは面倒なので, 結論と注意事項くらいにまとめる.
今回, ドキュメントルートは「/var/www/html」とし, pukiwikiのディレクトリ名を「wiki」にして設置した. この場合, セキュリティコンテキストは以下のように設定する.
# semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/wiki/(attach|backup|cache|diff|wiki)(/.*)?"
# semanage fcontext -a -t httpd_sys_htaccess_t "/var/www/html/wiki/(.*/)?\.ht[^/]*"
# restorecon -R /var/www/html/
これでうまくいった.
「semanage」コマンドは, セキュリティコンテキストを定義するコマンドなのだが, デフォルトではインストールされていないので, 以下を参考にインストールしておく.

【参考】
RHEL 6: semanage SELinux Command Not Found

「restorecon」は, 定義したセキュリティコンテキストを適用するコマンド. このコマンドは, 私の環境にデフォルトでインストールされていた.ちなみに, 適用されたセキュリティコンテキストは「ls -Z」で確認することができる.
# ls -aZ /var/www/html/wiki
・・・
-rw-r--r--. apache apache unconfined_u:object_r:httpd_sys_htaccess_t:s0 .htaccess
-rw-r--r--. apache apache system_u:object_r:httpd_sys_htaccess_t:s0 .htpasswd
-rw-rw-rw-. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 COPYING.txt
-rw-rw-rw-. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 INSTALL.txt
-rwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 README.en.txt.gz
-rw-rw-rw-. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 README.txt
-rwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 UPDATING.en.txt.gz
-rw-rw-rw-. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 UPDATING.txt
drwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 attach
drwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 backup
drwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 cache
drwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 counter
・・・
はじめ, セキュリティコンテキストをすべて「httpd_sys_content_t」で設定したら(/var/www/html/index.htmlがそうだったから), pukiwikiにアクセスしたときに以下のエラーがでてしまった.
Runtime error
Error message :

Directory is not found or not writable (DATA_DIR)
Directory is not found or not writable (DIFF_DIR)
Directory is not found or not writable (BACKUP_DIR)
Directory is not found or not writable (CACHE_DIR)
そこで, 「semanage fcontext -l | grep wiki」で調べたら, mediawiki用に「httpd_sys_rw_content_t」が定義されていたので真似をした. 「httpd_sys_htaccess」は, ググってたら見っけた.

備忘録ちゃんとつけようと思った

1年半くらいブログをほったらかしにしてしまった.

2012年度は, 仕事でめっためたにされて疲れてしまった(とは言うものの, いろいろ挑戦はしたし, 結構頑張ったと思う).

だけど, 2013年の9月になって, やっとブログ書こうかなって気になった.
備忘録ちゃんとつけて, 同じこと調べるといった無駄を省きたいと思った.

一時期Twitterを備忘録にしようと思ったけど, アレ流れちゃうから駄目だね.
ブログに書き散らして, wikiにまとめるって習慣をつけられるといいなぁ.

2012年4月8日日曜日

Oracle Master Silver 11g に合格した

今回は, 黒本ではなくて白本を使ってみた.


仕事で疲れてしまって, 前回よりも勉強してなかったけど(各章末問題と模擬試験2回を一通りやっただけ), 73%とれた. 白本スゴイ!

2012年2月1日水曜日

Oracle Master Bronze 11g に合格した

あんまり勉強してなかったから合格ラインギリギリだった.
参考書は, 定番の黒本を使用.



一通り読んで, 巻末の模擬試験を解けるようになっていれば, とりあえず合格点は取れるはず.
でも, 黒本の予想問題は全然あてにならなかった.

2012年1月22日日曜日

はじめてのアプリ作成(PhoneGap)

WEB+DB vol.66にPhoneGapを使ってアプリを作成する記事が掲載されていたので, これを参考にアプリ自作に挑戦してみた.

この前iPhone買ったけど, Macの開発環境整えるのが面倒だったので, Androidアプリを作ってみる(iPhone以前にASUS TF101を衝動買いしていたのだ).

PhoneGapでアプリを実行するまでの流れ
  1. Androidプロジェクトを作成する.
  2. libsフォルダを作成して, phonegap-x.x.x.jarをコピー(現時点は1.3.0).
  3. jarをビルド・パスに追加.
  4. assets/wwwフォルダを作成して,  phonegap-x.x.x.jsをコピー.
  5. assets/www/index.htmlを作成.
  6. resフォルダ内にPhoneGapに含まれるxmlフォルダをコピー.
  7. Activityファイルを開く.
  8. 継承しているActivityクラスをDroidGapクラスに変更.
  9. 「setContentView(R.layout.main);」を「loadUrl("file:///android_asset/www/index.html");」に変更.
  10. com.phonegap.DroidGapをインポート.
  11. AndroidManifest.xmlを開く.
  12. タグを追加.
  13. index.htmlを作る.
  14. ビルド(Androidアプリケーションの実行).
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.local.android"
    android:versionCode="1"
    android:versionName="1.0" >
<!-- ADD:ここから -->
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:resizeable="true"
android:anyDensity="true"
/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- END:ここまで -->
    <uses-sdk android:minSdkVersion="13" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" android:debuggable="true">
        <activity
            android:name=".PhoneGapCase20120121Activity"
            android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden" ><!-- ADD:この行 -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <!-- ADD:ここから -->
        <activity
            android:name="com.phonegap.DroidGap"
            android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden">
            <intent-filter> </intent-filter>
        </activity>
        <!-- END:ここまで -->
    </application>

</manifest>

iPhone4Sに機種変更

今月初旬に携帯をiPhone4Sに変更した.

以下, 使用感.
  • テンキーじゃなくてqwerty配列使えるのがいい(フリック入力は覚える気なし).
  • アドレス交換面倒.
  • アドレス帳の整理面倒(半角カナ打てない).
  • Undo大雑把すぎ.
  • 使っていて気持ち良くなる(Apple製品特有の感覚).
ガラケーよりも性に合ってると思う.

自分でアプリ作れるようになりたいなぁ.