Home > Archives > 2008-12

2008-12

TKGとは?

今日、体育会系(卓球部)の人と朝食の話していたら「今日はTKGで済ませたよ」と。TKG?
これは「(T)卵(K)かけ(G)ご飯」の略だそうです。いやーその定番メニューを頭3文字直す発想がおもしろい。なるほど「たまごかけごはん」より「TKG」の方が確かに言いやすいかも。となると「なっとうかけごはん」は「NKG」か。

Apacheでよく使うコマンドと設定項目

設置環境はFedoraを想定しています。
注:ソースからインストールした場合や他の環境だと一部ファイルのパスが違うところがあります。
今後も少しずつ書き足し・修正していきます。

コマンド

起動
# /etc/rc.d/init.d/httpd start
または、
# service httpd start
終了
# /etc/rc.d/init.d/httpd stop
または、
# service httpd stop
再起動
# /etc/rc.d/init.d/httpd restart
または、
# service httpd restart
自動起動に設定
# chkconfig httpd on
自動起動の確認(Run level 3:on)
# chkconfig --list httpd
設定の反映
# /etc/rc.d/init.d/httpd reload
ディレクトリの所有者の変更
# chown <ユーザ名>. /var/www/html/
ディレクトリをApache実行ユーザに変更
# chown -R apache:apache /var/www/html/cgi-bin/

httpd.confの設定

設定ファイルhttpd.confのパス
/etc/httpd/conf/httpd.conf
外部設定ファイル*.confを置くパス
/etc/httpd/conf.d/*.conf
・起動時に読み込まれる
・AliasとDirectoryを合わせて用いる場合が多い
DocumentRoot
ルートディレクトリの設定
e.g. DocumentRoot "/var/www/html" で
www.example.com/へのアクセスは/var/www/htmlのインデックスページとなる。
Alias
Alias <ドメイン以下のURLパス> <サーバ内のディレクトリパス>
e.g. Alias /blog /var/www/blog
の場合は、http://www.example.com/blog/にアクセスした際、サーバの/var/www/blog/内の既定のインデックスファイルが読み込まれる。
Directoryタグ

e.g.

<directory "/var/www/html">〜<directory>

属性にディレクトリパスを指定している。

.htaccessを許可する場合
AllowOverride All
IPアドレスによるアクセス制限
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from 192.168.1.0/24

↑はlocalhost、イントラネット以外からのアクセスを拒否

.htaccessによるパスワード認証

.htaccessファイル内の設定例

SSLRequireSSL # SSL経由のアクセス
AuthUserFile <認証するユーザリストのパス>
AuthGroupFile <パス>
AuthName "<ページ名>"
AuthType Basic # 認証タイプ
require valid-user

認証するユーザの登録

初回は
# htpasswd -b -c <保存先> <ユーザ名> <パスワード>
二件目以降は既にファイルが作成されているので-cを抜く
# htpasswd -b <保存先> <ユーザ名> <パスワード>
ここで作成したファイルのパスを上のAuthUserFile項目に書く。

AIR: Webサーバ、Socketの接続状況を検知 - URLMonitor、SocketMonitorクラス

任意のアドレスのWebサイト[サービス]のネットワーク状況を検知するURLMonitorと、任意のサーバ+ポートに接続可能か否かを検知するSocketMonitorクラスの動作サンプルを下記に示します。

ソースコード

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
  applicationComplete="startup()">
  <mx:Script>
    <![CDATA[
    import air.net.SocketMonitor
    import air.net.URLMonitor;
    import flash.net.URLRequest;
    import flash.events.StatusEvent;

    private var SERVER_URL:String = "http://www.yukun.info/";
    private var SOCK_ADRR:String = "yukun.info";
    private var PORT:int = 6667;
    private var INTERVAL_TIME:int = 3000; // ms
    private var serviceMonitor:URLMonitor = null;
    private var socketMonitor:SocketMonitor = null;

    private function startup():void {
      var endpoint:URLRequest = new URLRequest(SERVER_URL);
      serviceMonitor = new URLMonitor(endpoint);
      serviceMonitor.addEventListener(StatusEvent.STATUS, onStatusEvent);
      serviceMonitor.pollInterval = INTERVAL_TIME;
      serviceMonitor.start();

      socketMonitor = new SocketMonitor(SOCK_ADRR, PORT);
      socketMonitor.addEventListener(StatusEvent.STATUS, onSocketStatusChange);
      socketMonitor.pollInterval = INTERVAL_TIME;
      socketMonitor.start();
    }

    // ネットワークサービスの状態の検知
    private function onStatusEvent(e:StatusEvent):void {
      var date:Date = new Date();
      trace(date.toLocaleTimeString());
      trace(SERVER_URL + "に" + (serviceMonitor.available ? "接続可" : "切断中"));
    }

    private function onSocketStatusChange(e:StatusEvent):void {
      trace(SOCK_ADRR + "のポート" + PORT + "は" +
        (socketMonitor.available ? "接続可" : "切断中"));
    }
    ]]>
  </mx:Script>
</mx:WindowedApplication>

実行結果


http://www.yukun.info/に接続可

yukun.infoのポート6667は切断中

URLMonitorはネットワーク状況を検知する為にサーバへGETリクエストを送出して、レスポンスのステイタスコードを確認して判断しているようです↓。

リファレンス

今年もなんとか年越せそう

夏みかん(12月)
先日、親戚の所へお歳暮持参で年末の挨拶に行ってきたけど、皆元気そうでなりよりでした。また、私も彼らに元気な様子といい話を伝えられて良かった。たまにしか会えないので再会の喜びはひとしお。しばらくおしゃべりした後はコタツでまたーりしてました。午後から暖かくなってきたので庭を散策していたら、ぽつんと実をつけたゆずの木↓があったので丁度冬至ということもあり数個頂きました。
ゆず(12月)
帰路の途中、高校の先輩から忘年会のお誘いがあったので飛び入り参加させてもらいました。席の隣になった方が大学時代にコンピュータ・サイエンスを学んでいたので、その時の研究内容を具体例を交えて分かりやすく説明して頂いたのですが、私の英語力がまだまだ足りないばっかりにうまく話を膨らますことができませんでした。それがもったいなかったので今後は英語学習の割合を増やして他を減らし、使う機会も積極的に設けていこう。

AIR: SQLiteでデータの挿入と検索 - SQLConnection、SQLStatementクラス

AIRアプリケーションからSQLiteのDBにアクセスするには主にSQLConnectionとSQLStatementクラスを用います。基本的な処理の流れは、

  1. SQLConnection#openAsync(<Fileオブジェクト>, <モード>)でDBに接続
  2. SQLStatement#textプロパティにSQL文を代入しexecute()で実行
  3. その際、フィールド値はSQLStatement#parameters["@<定義されたパラメータ>"]で代入する
  4. SELECT文の検索結果データははSQLStatement#getResult()で取得
  5. 結果データの型はSQLResultで、データそのものはdataプロパティ(Array型)に入っている。e.g. <SQLResult>.data[i].<フィールド名>

下のプログラムはDBに接続してテーブルの作成、レコードの追加、検索を行うサンプルです。

ソースコード

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" creationComplete="dbConnect()">
<mx:Script>
  <![CDATA[
  import flash.data.SQLConnection;
  import flash.filesystem.File;
  import flash.events.SQLErrorEvent;
  import flash.events.SQLEvent;

  private var conn:SQLConnection;
  private var dbFile:File;
  private var sql:SQLStatement;

  // DBに接続
  private function dbConnect():void {
    conn = new SQLConnection();
    conn.addEventListener(SQLEvent.OPEN, onDBOpen);
    conn.addEventListener(SQLErrorEvent.ERROR, onDBError);
    dbFile = File.desktopDirectory.resolvePath("test01.db");
    trace("フィアルは存在" + (dbFile.exists ? "します。:" : "しません。") + dbFile.nativePath);
    conn.openAsync(dbFile, SQLMode.CREATE);
  }

  // 接続完了
  private function onDBOpen(e:SQLEvent):void {
    trace("Connect DB");
    conn.removeEventListener(SQLEvent.OPEN, onDBOpen);
    conn.removeEventListener(SQLErrorEvent.ERROR, onDBError);
    createTable(); // テーブルを作成
  }

  private function onDBError(e:SQLErrorEvent):void {
    trace("Can't connect DB: " + e.error.message);
    trace("Error detals: " + e.error.details);
  }

  // テーブルを作成する関数
  private function createTable():void {
    sql = new SQLStatement();
    sql.sqlConnection = conn;
    var sqlTxt:String = "CREATE TABLE IF NOT EXISTS addresses " +
        "(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)";
    sql.text = sqlTxt;
    sql.addEventListener(SQLEvent.RESULT, onCreate);
    sql.addEventListener(SQLErrorEvent.ERROR, onCreateError);
    sql.execute();
  }

  // テーブル作成完了
  private function onCreate(e:SQLEvent):void {
    trace("Can create table");
    sql.removeEventListener(SQLEvent.RESULT, onCreate);
    sql.removeEventListener(SQLErrorEvent.ERROR, onCreateError);
    insertData(); // データを挿入
  }

  private function onCreateError(e:SQLErrorEvent):void {
    trace("Can't create table: " + e.error.message);
    trace("Error details: " + e.error.details);
  }

  private function insertData():void {
    sql = new SQLStatement();
    sql.sqlConnection = conn;
    var sqlTxt:String = "INSERT INTO addresses (id, name, age) " +
      "VALUES (@id, @name, @age)";
    sql.text = sqlTxt;
    sql.parameters["@id"] = 1;
    sql.parameters["@name"] = "名無し";
    sql.parameters["@age"] = 18;
    sql.addEventListener(SQLEvent.RESULT, onInsert);
    sql.addEventListener(SQLErrorEvent.ERROR, onInsertError);
    sql.execute();
  }

  // データ挿入完了
  private function onInsert(e:SQLEvent):void {
    trace("Can insert data");
    sql.removeEventListener(SQLEvent.RESULT, onInsert);
    sql.removeEventListener(SQLErrorEvent.ERROR, onInsertError);
    selectData(); // データを検索
  }

  private function onInsertError(e:SQLErrorEvent):void {
    trace("Can't insert data: " + e.error.message);
    trace("Error details: " + e.error.details);
  }

  private function selectData():void {
    sql = new SQLStatement();
    sql.sqlConnection = conn;
    var sqlTxt:String = "SELECT * FROM addresses";
    sql.text = sqlTxt;
    sql.addEventListener(SQLEvent.RESULT, onSelect);
    sql.addEventListener(SQLErrorEvent.ERROR, onSelectError);
    sql.execute();
  }

  // 検索結果を取得完了
  private function onSelect(e:SQLEvent):void {
    trace("Can select data");
    sql.removeEventListener(SQLEvent.RESULT, onSelect);
    sql.removeEventListener(SQLErrorEvent.ERROR, onSelectError);
    var result:SQLResult = sql.getResult();
    var num:int = result.data.length;
    var id:int;
    var name:String;
    var age:String;

    for (var i:int = 0; i < num; i++) {
      var row:Object = result.data[i];
      id = row.id;
      name = row.name;
      age = row.age;
      var str:String = "id=" + id + ", name=" + name + ", age=" + age;
      trace(str);
    }
  }

  private function onSelectError(e:SQLErrorEvent):void {
    trace("Can't select data: " + e.error.message);
    trace("Error details: " + e.error.details);
  }

  ]]>
</mx:Script>

</mx:WindowedApplication>

実行結果

フィアルは存在しません。/Users/yukun/Desktop/test01.db
Connect DB
Can create table
Can insert data
Can select data
id=1, name=名無し, age=18

リファレンス

Page 1 of 212

Home > Archives > 2008-12

バックナンバー
最近のコメント
最近のトラックバック
メタ情報

Return to page top