ページ

2011-12-30

[鯖]phpなどでmysqlを操作する際の設定を外部に追いやる

phpなどで、mysqlを操作する際には、ユーザ名やパスワード等、セキュリティー上重要な情報が必要です。

これらの情報をwebに公開しているディレクトリに配置するのは情報が漏えいする危険性がある為、良くないと言われています。

では、どうすれば良いのか???

webに公開していないディレクトリに、それらの情報を置けば良いのです。

以下、さくらのレンタルサーバーで私が実際に行った方法を紹介します。
(phpを前提に記述しています)

これで本当に良いのかは分からないですが、多分大丈夫だと思います。
問題ありそうでしたら、より良い方法を教えて頂ければ幸いです。

まずは情報を記述しておくファイルを作成。

1) sshでサーバーにログイン (ログイン方法はマニュアルを参照)。
2) 自分のディレクトリに移動 (cd /home/アカウント名)
   このディレクトリにあるwwwというディレクトリがwebに公開されている。
3) 適当なディレクトリを作成(mkdir conf)
4) 作成したディレクトリに入る(cd conf)
5) 設定を書き込むファイルを作成する(vi hogehoge_conf.php)
6) 作成した設定ファイルに必要な情報を書き込む
  ex)
    <?php
      $db_conf['server']  = 'hogehoge';
      $db_conf['db_user']  = 'hogehoge_user';
      $db_conf['db_pass'] = 'hogehoge_pass';
     その他いろいろ
   ?>

次に記述した情報を使ってデータベースにアクセス。
ex)

        require_once('../conf/hogehoge_conf.php');

        $link = mysql_connect($db_conf['server'],$db_conf['db_user'],$db_conf['db_pass']);
        if( $link == false ){
            die('データベースに接続できません:');
        }
        いろいろ処理...


        mysql_close($link);


という感じ。

2011-12-28

[ニッキ]まどか☆マギカ展に行ってきた。



池袋で12/27-31まで開催されている”魔法少女まどか☆マギカ展”に行って来ました。

アニメのシーンが色々思い出せて面白かったです。

あと、杏子(あんこ)はやっぱり可愛いです。


沢山写真を撮ったので、下に貼り付けておきます(picasaスライドショー)。


2011-12-26

[TED][Mary Roach] "10 things you didn't know about orgasm"

問題作なのかもしれないけど、スゴク面白い。


2011-12-24

[arduino]一定周期毎に処理を実行するためのフレームワーク的なもの

arduinoを使っていて、一定の周期ごとに任意の処理をしたい時がある。
しかも、色々な周期で色々やりたいときなどは、Delayなどを使って時間を調整するのは結構大変だ。

タイマ割り込みは標準だと使えない。


ということで、4種類の周期で任意の処理をするためのスケッチを描いてみた。
オシロスコープなどで確かめていない為、本当に一定の周期で実行されているかは保証できないが、LEDを光らせてみた感じではなんとなく良さそうだ。
また、micros();で時刻を取得する際に、Arduino内部のカウンタがオーバーフローした時などはおかしなタイミング生成がされる場合がある。
そのうち対策する予定です。

あと、ひとつの周期の処理は16msec以内に終わらせないと、次の周期の処理がずれていきます。


以下、スケッチ。

/*
 * 一定の周期(64msec, 128msec, 512msec, 1024msec, 4096ms)で特定の処理を
 * 行うためのフレームワーク?
 * 
 * 以下の各関数が各周期毎に実行される。
 *  execute64msTask()   -> 64msec毎に実行
 *  execute128msTask()  -> 128msec毎に実行
 *  execute512msTask()  -> 512msec毎に実行
 *  execute1024msTask() -> 1024msec毎に実行
 *  execute4096msTask() -> 4096msec毎に実行
 *
 * 各々の関数内に任意の処理を記述するだけで良い。
 * 但し、各周期の処理は16msec以内に終わるものとする。
 * 今後のバージョンアップにより、32msecに伸びる可能性有り。
 */


/* タスクID定義 */
const byte TASK_ID_64MS    = 1;
const byte TASK_ID_128MS   = 2;
const byte TASK_ID_512MS   = 3;
const byte TASK_ID_1024MS  = 4;
const byte TASK_ID_4096MS  = 5;

/* 現在のタスクインデックス 0-255を繰り返す.*/
byte taskIndex = 0;

/* 
 * タスクIDのテーブル. taskIndexから次に実行すべきタスクを決定する. 
 * 読みやすさの為、値をベタ書き.
 */
const byte taskIdTbl[] =
{
/*1        4           8          12          16 */
  1, 2, 3, 4, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 3, 5, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 3, 4, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 3, 0, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 3, 4, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 3, 0, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 3, 4, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 3, 0, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,
  1, 2, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0,};

unsigned long taskStartTime = 0;     /* タスク開始時刻                */
unsigned long taskEndTime   = 0;     /* タスク終了時刻                */
int taskDelay               = 0;     /* 次の周期までの待ち時間        */
unsigned long BASE_DELAY    = 16000; /* 基本となるタスク実行周期 16ms */

unsigned int ledStat = 0;            /* LEDの状態. サンプル用. */

void setup(){
  /* LED サンプル用 */
  pinMode(13, OUTPUT);
}

void loop(){
  /* タスク実行時間計測の為、時刻をキャプチャ */
  taskStartTime = micros();
  
  /* 該当する周期のタスクを実行. */
  switch( taskIdTbl[taskIndex] ){
    case TASK_ID_64MS:
      execute64msTask();
      break;
    case TASK_ID_128MS:
      execute128msTask();
      break;
    case TASK_ID_512MS:
      execute512msTask();
      break;
    case TASK_ID_1024MS:
      execute1024msTask();
      break;
    case TASK_ID_4096MS:
      execute4096msTask();
      break;
    default:
      break;
  }
  /* タスクインデックスをインクリメント */
  taskIndex = taskIndex + 1;

  /* タスク完了時刻をキャプチャ */
  taskEndTime = micros();

  taskDelay = BASE_DELAY - (taskEndTime - taskStartTime);
  if( taskDelay >= 0 ){
    /*
     * delayMicrosecondsは16383マイクロ秒以内の値を
     * を指定したとき、正確に動作する.
     */
    delayMicroseconds(taskDelay);
  }
}

/*  64msec毎に起動する関数 */
void execute64msTask(){

}

/*  128msec毎に起動する関数 */
void execute128msTask(){

}

/*  512msec毎に起動する関数 */
void execute512msTask(){

}

/*  1024msec毎に起動する関数 */
void execute1024msTask(){

  if( getLedStat() ){
    digitalWrite(13,HIGH);
  }
  else{
    digitalWrite(13,LOW);
  }

}

/*  4096msec毎に起動する関数 */
void execute4096msTask(){

}

/* LED状態切替 サンプル用*/
boolean getLedStat(){
  boolean ret = false;

  if( ( ledStat % 2 ) == 0 ){
    ret = true;
  }
  ledStat = ledStat + 1;

  return ret;
}

2011-05-22

[TED][Dan Gilbert]"Why are we happy?"

生きるのが楽しくなりそう。

[TED][Arthur Benjamin] "Mathemagic"

すごい。

すごすぎて、笑ってしまう。


2011-04-20

しっくり来る例外.1

メソッドなどの引数がnullを許可しない場合は、


if( arg == null ){
throw new NullPointerException();
}


とかやったりするけど、なんかしっくりこない.

apache commons langにしっくり来る例外を発見.

NullArgumentException(msg);

というやつ.



public class Sikkuri{

public Sikkuri( final String str ){
if( str == null ){
throw new NullArgumentException("str");
}
}

}



しっくり来る.

apache commons ioは便利.2

こんな書き方もできる.





import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.commons.io.IOUtils;

public class FileReadSample{

public FileReadSample(final File file) throws IOException{

InputStream in = null;
try{
in = new FileInputStream(file);
List lines = IOUtils.readLines(in);

for( String line : lines ){
System.out.println(line);
}
}finally{
IOUtils.closeQuietly(in);
}
}

public static void main(String[] args) throws IOException {
if( args.length == 0 ){
throw new IllegalArgumentException();
}
new FileReadSample(new File( args[0]));
}

}

apache commons ioは便利.1

ファイルから文字列を読み込む処理が1行で書ける.

import java.io.File;
import java.io.IOException;
import java.util.List;

import org.apache.commons.io.FileUtils;

public class FileReadSample{

public FileReadSample(final File file) throws IOException{

List lines = FileUtils.readLines(file);//ここで読んでる.

for( String line : lines ){
System.out.println(line);
}
}

public static void main(String[] args) throws IOException {
if( args.length == 0 ){
throw new IllegalArgumentException();
}
new FileReadSample(new File( args[0]));
}



}

2011-04-13

antでHelloWorldをコンパイルする

HelloWorld.java

public class HelloWorld {

public static void main( String[] arg ){
System.out.println("Hello World.");
}
}

build.xml





ディレクトリ構成

└─HelloWorld
│ build.xml
├─class
└─src
HelloWorld.java

コマンドプロンプトで
HelloWorldディレクトリに行く.

ant -f build.xml

と、打つ.

BUILD SUCCESSFUL

と出ればOK.

後はclassフォルダの中にHelloWorld.classが作成されているので、

java HelloWorld

と打てば

HelloWorld.

と表示される.


2011-04-12

apache-antのインストール

・インストール

apache-ant-x.x.x-bin.zip

をダウンロード(x.x.xはバージョン).

適当に解凍.

・ANT_HOMEの設定

環境変数

新規

変数名:ANT_HOME
変数値:antをインストールした場所.

C:\apache-ant-1.8.2など.

・Pathの設定

環境変数

path

編集

変数値の一番後ろを、;で区切って%ANT_HOME%\bin;を追加.

何故かコレだとうまくいかなかった。

そのまま、
C:\apache-ant-1.8.2\bin;を追加したら出来た。

・確認

コマンドプロンプトで
ant -version

と打って、バージョン情報が出ればOK


JAVA_HOMEの設定

環境変数

新規

変数名:JAVA_HOME
変数値:javaをインストールしたディレクトリ

デフォルトだと「C:\Program Files\Java\jdk1.6.0_24」とか.

・確認
コマンドプロンプトで

set JAVA_HOME

を打つ。