admin のすべての投稿

考える倫理観

人はなぜ考えるのか。
成長するため?
自分の身を守るため?
幸せになるため?
何かを守るため?

人はなぜ自分の意見を主張したがるのか。
共感して欲しいから。

自分の考えを通すということは、良いことか否か。

その考えがすべての事象を包括的に考え、すべての人幸せになる意見だとしても、押し通すことは良くないかもしれない。
その考えのすべてを理解してくれる人なんてごく僅かなわけで、必ずしも正しいという保証はない。

多くの人はそれを「わがまま」だと思うだろう。

ならば、自分の意見を主張しないほうが良いのかもしれない。

この世の中の意見はきっとどれが正しくてどれが間違っているっていう明確な基準なんてない。しいて言うならば法律ぐらい。でもやはり基準っていうのは倫理観というものである程度定まっていて、多くの人は持っているわけでその倫理観という見方の中で物事を「これは正しい、これは間違っている」という判断を下している。

そしてもし他人が間違っていると思えば自分の倫理観に従い、注意なり叱ったりしてその行為を正すものなんだろう。

多くの人が共通して持っている倫理観に、逆らうならばそれはそれは多くの非難を浴びる。もし仮に自分が正しかったとしても全世界の人が持っている共通の価値観を変えることは当たり前だができない。

そんなことは起こり得ないというだろう。大抵の場合、多くの人が思っていることは正しいと。

ただ仮に、万が一そんな状況になったら自分はどうするか。
どう考えてみても、自分は間違っているとは思えない。でも多くの人が思うのならそうなんかな。自分がおかしいんだ。「当たり前のことを当たり前と思うことが正義だと思うことにしよう」って本気でそう思うことができるんだろうか。

そんな自分の中の疑問を表に出さず、気づかないふりをして生活する。そのうちそんな疑問を感じていたことなんて感じなくなっちゃって、人に流されてなんとなく楽しい人生って思って死んでゆくんじゃないかと思うとなんかすごく切ない。

正解なんてないと割りきって生きるのが正解?
正解なんてあるのかよと言いつつも探していく人生のほうが良かったんじゃないのか。

生きる意味っていうのは難しい。生きる意味っていうのは、裏を返すと死なない意味になると自分は思うのだが、どうなんだろうか。迷惑をかけないならば死んでもいいのか。

最近、善悪の判断ができてない。

何が正しくて、何が悪いことなのか。非常に危ない。
もう少し冷静になれ。

OpenCLのマンデルブロ集合

ホストプログラム
[cpp]
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<CL/cl.h>
#include<string>

#define MAX_SOURCE_SIZE (0x100000)
#define MEM_SIZE (1000)

using namespace std;

int main()
{
//char string[MEM_SIZE];

FILE *fp;
char fileName[] = "./calc.cl";
char *source_str;
size_t source_size;

fp = fopen(fileName, "r");
if(!fp)
{
cout << "file failed" <<endl;
exit(1);
}
source_str = (char *)malloc(MAX_SOURCE_SIZE);
source_size = fread(source_str,1,MAX_SOURCE_SIZE,fp);
fclose(fp);

cl_int status;
cl_platform_id platforms[2];
cl_uint num_platforms;
status = clGetPlatformIDs(2, platforms, &num_platforms);
//cout << status << endl;

cl_device_id devices;
cl_uint num_devices;
cl_context context;
status = clGetDeviceIDs(platforms[1], CL_DEVICE_TYPE_GPU, 4, &devices, &num_devices);
//cout << status << endl;

context = clCreateContext(NULL, 4, &devices, NULL, NULL, &status);
//cout << status << endl;

cl_command_queue queue;
queue = clCreateCommandQueue(context, devices, 0, &status);
//cout <<"queue:"<<status << endl;

cl_program program;
program = clCreateProgramWithSource(context, 1, (const char**)&source_str, &source_size, &status);
//cout << status << endl;

status = clBuildProgram(program, num_devices, &devices, NULL, NULL, NULL);
//cout << status << endl;

/*////////////////////////

size_t logsize;
status = clGetProgramBuildInfo(program,devices,CL_PROGRAM_BUILD_LOG,0,NULL,&logsize);
if(status == CL_SUCCESS)
{
char *logbuffer;
logbuffer = new char[logsize + 1];
if(logbuffer == NULL)
{
cout << "memory allocation failed."<<endl;
//return;
}

status = clGetProgramBuildInfo(program,devices,CL_PROGRAM_BUILD_LOG,logsize,logbuffer,NULL);
if(status == CL_SUCCESS)
{
logbuffer[logsize]=’\0’;
cout << "build log" << endl;
cout << logbuffer << endl;
}
delete [] logbuffer;
}

*////////////////////////

cl_kernel kernel;
kernel = clCreateKernel(program, "calc", &status);
//cout << status << endl;

float Outx[MEM_SIZE];
float Outy[MEM_SIZE];
bool OutCheck[MEM_SIZE][MEM_SIZE];
Outx[0] = -2;
Outy[0] = -2;
for(int i= 0; i < MEM_SIZE-1 ;i++)
{
Outx[i+1] = Outx[i] + (4.0 / MEM_SIZE);
Outy[i+1] = Outy[i] + (4.0 / MEM_SIZE);

for(int j = 0; j < MEM_SIZE ;j++)
{
OutCheck[i][j] = 0;
}
}

cl_mem memoutx, memouty, memoutcheck;
memoutx = clCreateBuffer(context, CL_MEM_READ_WRITE, MEM_SIZE * sizeof(float), NULL, &status);
//cout <<status<<endl;
memouty = clCreateBuffer(context, CL_MEM_READ_WRITE, MEM_SIZE * sizeof(float), NULL, &status);
//cout <<status<<endl;
memoutcheck = clCreateBuffer(context, CL_MEM_READ_WRITE, MEM_SIZE * MEM_SIZE * sizeof(bool), NULL, &status);
//cout <<status<<endl;

status = clEnqueueWriteBuffer( queue, memoutx, CL_TRUE, 0, MEM_SIZE * sizeof( float ), Outx, 0, NULL, NULL );
//cout << status << endl;
status = clEnqueueWriteBuffer( queue, memouty, CL_TRUE, 0, MEM_SIZE * sizeof( float ), Outy, 0, NULL, NULL );
//cout << status << endl;
status = clEnqueueWriteBuffer( queue, memoutcheck, CL_TRUE, 0, MEM_SIZE * MEM_SIZE * sizeof( bool ), OutCheck, 0, NULL, NULL );
//cout << status << endl;

status = clSetKernelArg(kernel, 0,sizeof(cl_mem),(void *)&memoutx);
status = clSetKernelArg(kernel, 1,sizeof(cl_mem),(void *)&memouty);
status = clSetKernelArg(kernel, 2,sizeof(cl_mem),(void *)&memoutcheck);
//cout <<"カーネルに渡す引数セット:"<<status<<endl;

//status = clEnqueueTask(queue, kernel, 0, NULL, NULL);
size_t global_work_size[] = {MEM_SIZE * MEM_SIZE};
size_t local_work_size[] = {MEM_SIZE};
status = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);
if( status < 0){
cout <<"実行:"<<status<<endl;
cout << CL_DEVICE_MAX_WORK_GROUP_SIZE << endl;
exit(0);
}

//status = clEnqueueReadBuffer(queue, memoutx, CL_TRUE, 0, MEM_SIZE * sizeof(float), Out, 0, NULL, NULL);
//status = clEnqueueReadBuffer(queue, memouty, CL_TRUE, 0, MEM_SIZE * sizeof(float), Out, 0, NULL, NULL);
status = clEnqueueReadBuffer(queue, memoutcheck, CL_TRUE, 0, MEM_SIZE * MEM_SIZE * sizeof(bool), OutCheck, 0, NULL, NULL);
//cout <<"結果取り出し:"<<status<<endl;

for(int i = 0;i < MEM_SIZE; i++)
{
for(int j = 0;j < MEM_SIZE; j++)
{
if(OutCheck[i][j] == 0){
cout << Outx[i]<< " " << Outy[j] << endl;
}
}
}

clReleaseMemObject(memoutx);
clReleaseMemObject(memouty);
clReleaseMemObject(memoutcheck);
clReleaseKernel(kernel);
clReleaseProgram(program);
clReleaseCommandQueue(queue);
clReleaseContext(context);
}
[/cpp]

カーネルプログラム
[cpp]
#define MEM_SIZE (1000)
__kernel void
calc(__global float *outx,
__global float *outy,
__global bool outcheck[MEM_SIZE][MEM_SIZE] )
{

#define MaxCalcNum 100

int width = 2, height = 2, j = 0;
int out[MEM_SIZE*MEM_SIZE];

#pragma OPENCL EXTENSION cl_khr_fp64:enable
//int index_x = get_global_id(0);
//int index_y = get_global_id(1);
int index_x = get_group_id(0);
int index_y = get_local_id(0);

if(index_x > MEM_SIZE)index_x = 1;
if(index_y > MEM_SIZE)index_y = 1;
double prevX = 0.0f;
double prevY = 0.0f;

for(int i = 0; i < MaxCalcNum ; i++)
{
double newX = (prevX * prevX) – (prevY * prevY) + outx[index_x];
double newY = 2.0f * prevX * prevY + outy[index_y];

if ((newX * newX) + (newY * newY) > 4.0f)
{
outcheck[index_x][index_y] = -1;
break;
}
else
{
prevX = newX;
prevY = newY;
}
}
}
[/cpp]

画像出力

$ g++ -o main_cp main_cp.cpp -lOpenCL
$ ./main_cp > mandel.txt
$ gnuplot
> set terminal png
> set out "mandel.png"
> plot "mandel.txt"

楽しむためにはリスクをとらなくちゃ

こんにちわ。
最近普通の日記を書いてないと思いつつも、特に書くこともなく研究室バイト遊びを繰り返している日々です。

こんなんでいいのかなーってぐらい最近色々うまく回っている気がするのですが、一抹の不安がある。
今の自分の行動がすべて自分の将来のための布石になっているかということ。
自分の描いた理想の未来に少しでも近づけているのか。歩み出すその一歩は他人に流されてやしないか。

物事には優先順位があって、その一番上に絶対にやらなくちゃいけないことがある。それが今は「大学を卒業すること」。そのためには卒論を書かなければいけないこと。
これは絶対にやらなければならないこと。

ただ裏を返すと、本当にやらなければならないことってそれしかない。それが必要最小限であり、それ以外のことは何もしなくていい。むしろ4回生になった今、他の余計なことはしないほうがいいかもしれないぐらい。

でもなんかこーいうのって一生続く不安かもしれない。おそらく社会人になっても、「毎日遅刻せず出社する」とかそーいう絶対にやらなくちゃいけないことっていうのはあるんだと思う。それはきっと自分が生きていくための必要条件なんだと思うんだけど、やっぱりそれだけじゃ現状維持のままになるんだろうなと思う。現状維持でもいいんだけど、もっとこう自分自身、自分の周りをより良くしていくことが楽しいんじゃないかと思うわけで、そのためにはある程度のリスクっていうものをとらなくちゃいけないって思った。

そりゃあ今自分にとって本当にやらなければならないことって「大学を卒業すること」ぐらいしかない。ならば、もう全部バイトもやめて夢とかも考えるのやめて、本当に卒業するためだけに動けばいい。授業だってちゃんと出て出席とって、夜は早く寝て、たまに研究室行ってダベって、それなりに楽しんで、でもその人間関係っていうのはそれなりにして、飲み会に参加するのも次の日のことを考えて金曜か土曜だけにして、家が大好きで家には7時に帰ってご飯食べつつドラマ見て12時には寝てっていうそんな普通のことをすればいいんだ。卒業するためだけに動けばいい。誰も文句も言わないし、反感も買うことはない。

でもそれって【本当に】楽しいのか?

おれはおれの人生しか歩んだことないし歩めないから、断定はできないけど、もう一度よく考えてみろよって思う。それで楽しいって言われたら何も言えねぇけど。。。
そんでよく考えた結果、それじゃ嫌だとか、なんかありきたりな毎日とか、本当は自分はこうなりたい!とか思うなら、

もっとリスク取れよ!!!って思う。
楽しいことするためには、リスクとらなくちゃって、金だけで買える娯楽なんて本当の楽しさじゃないって!
誰かに寄りかかってるうちは本当に楽しいことを知らないんじゃないかって思っちゃう。きっとその人が楽しいって思ってることっていうのも他の誰かが作った楽しさの一部でしかないんだろうなって思っちゃう。

うん、なんかそれが寂しいっていうかそれを分かってもらえないのが辛い。

もうなんかここまで勝手に自分の妄想だけで日記を書いている気分になってきたけど、なんかそんな風に思うことが多い。
久々の日記はここまで。

OpenCLの環境(プラットホーム、デバイス)表示

[cpp]
#include <CL/cl.h>
#include <iostream>

using namespace std;

int main(){

/*–Platform取得–*/
cl_platform_id id[3];//プラットホームID

cl_int num = 3;//プラットホームを3つまで見つける
cl_uint Rnum;//実際に取得したプラットホーム数
cl_char name[1024];//プラットホーム名

clGetPlatformIDs(num,id,&Rnum);
cout<<"Platform Max Number = "<<Rnum<<endl<<endl;

for(int i = 0;i < Rnum;i++)//プラットホームを探し、すべてのプラットホームを表示
{
clGetPlatformInfo(id[i],CL_PLATFORM_NAME,sizeof(name),name,NULL);
cout<<"Platform Name = "<<name<<endl;

/*–デバイス取得–*/
cl_device_id dev[10];//デバイスID(構造体のアドレスが格納される)

cl_uint DC;//実際に取得したデバイス数
cl_char buff[1024];//デバイス名
cl_int num1 = 10;
clGetDeviceIDs(id[i],CL_DEVICE_TYPE_ALL,num1,dev,&DC);//プラットホームID,デバイスタイプ,
cout<<"Device Max Number = "<<DC<<endl;

for(int j= 0;j < DC;j++)
{

clGetDeviceInfo(dev[j],CL_DEVICE_NAME,sizeof(buff),buff,NULL);
cout<<" Device Name = "<<buff<<endl;
}
cout << endl;
}
}
[/cpp]

OpenCLのエラーコード

めも
[cpp]
// Error Codes
#define CL_SUCCESS 0
#define CL_DEVICE_NOT_FOUND -1
#define CL_DEVICE_NOT_AVAILABLE -2
#define CL_COMPILER_NOT_AVAILABLE -3
#define CL_MEM_OBJECT_ALLOCATION_FAILURE -4
#define CL_OUT_OF_RESOURCES -5
#define CL_OUT_OF_HOST_MEMORY -6
#define CL_PROFILING_INFO_NOT_AVAILABLE -7
#define CL_MEM_COPY_OVERLAP -8
#define CL_IMAGE_FORMAT_MISMATCH -9
#define CL_IMAGE_FORMAT_NOT_SUPPORTED -10
#define CL_BUILD_PROGRAM_FAILURE -11
#define CL_MAP_FAILURE -12

#define CL_INVALID_VALUE -30
#define CL_INVALID_DEVICE_TYPE -31
#define CL_INVALID_PLATFORM -32
#define CL_INVALID_DEVICE -33
#define CL_INVALID_CONTEXT -34
#define CL_INVALID_QUEUE_PROPERTIES -35
#define CL_INVALID_COMMAND_QUEUE -36
#define CL_INVALID_HOST_PTR -37
#define CL_INVALID_MEM_OBJECT -38
#define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39
#define CL_INVALID_IMAGE_SIZE -40
#define CL_INVALID_SAMPLER -41
#define CL_INVALID_BINARY -42
#define CL_INVALID_BUILD_OPTIONS -43
#define CL_INVALID_PROGRAM -44
#define CL_INVALID_PROGRAM_EXECUTABLE -45
#define CL_INVALID_KERNEL_NAME -46
#define CL_INVALID_KERNEL_DEFINITION -47
#define CL_INVALID_KERNEL -48
#define CL_INVALID_ARG_INDEX -49
#define CL_INVALID_ARG_VALUE -50
#define CL_INVALID_ARG_SIZE -51
#define CL_INVALID_KERNEL_ARGS -52
#define CL_INVALID_WORK_DIMENSION -53
#define CL_INVALID_WORK_GROUP_SIZE -54
#define CL_INVALID_WORK_ITEM_SIZE -55
#define CL_INVALID_GLOBAL_OFFSET -56
#define CL_INVALID_EVENT_WAIT_LIST -57
#define CL_INVALID_EVENT -58
#define CL_INVALID_OPERATION -59
#define CL_INVALID_GL_OBJECT -60
#define CL_INVALID_BUFFER_SIZE -61
#define CL_INVALID_MIP_LEVEL -62
#define CL_INVALID_GLOBAL_WORK_SIZE -63
[/cpp]

ブログサーバー構築の備忘録

前の投稿で、ブログサーバーがローカルで動くところまで行ったので、今度はそれをグローバルで公開して、インターネットを通じてどこからでもアクセスできるようにした備忘録。

自分の自宅サーバをインターネットに公開するためにはドメインとグローバルIPが必要(厳密に言うとドメインは必要ない)
マンション等でインターネット契約している場合、大元でグローバルIPを割り振ってもらえていなかったり、ポートを開放してもらえてなかったりする。如何せん、ぼくの家はマンションのため、まずはグローバルIPがとれているかとHTTPのポート80が開いているか調べる必要がある。

まずグローバルIPがとれているか調べる
ぼくの場合ルータの設定画面で確認することができた。IPアドレスが192.***.***.**的な感じで始まるものでなく、128.***.***.**的な訳のわからないIPになっていたら、そのルータにはグローバルIPが割り当てられる。もしわからなければルータを介さずに直接モデムからLANケーブルをパソコンに差し込んで、コマンドプロンプトやIPアドレスを表示してくれるサイト等で確認すれば良い。

次にポートが開いているか調べる。
まず、ポートが開いているか調べる前に、ルータを利用している場合、ルータでポートが開いているかを確かめよう。そしてもし開けていないならば、HTTPのポート80を開けるように設定する。それを行った上でポートが開いているか調べる。方法はコマンドプロンプトやポートが開いているか確かめるサイトがある。参考確認してポート80が空いていれば成功!!!インターネット公開できるぞ!ついでに外でも作業ができるようにsshのポート80も開けておけばputty等でサーバーにアクセスできる。

ここまできたらもうなんの心配もない。あとはダイナミックDNSを取得するだけ。ダイナミックDNSについても少しややこしいかも知れないが、簡単に説明すると、グローバルIPっていうのインターネットに接続する際、毎回変わってしまうものだから、サーバーみたいなIP変わって困る場合に役に立つ。仕組みはサーバーはいつもIPが違うのでドメインと毎回変わるIPを紐付けて定期的に更新すれば、ドメインにアクセスするだけで自動的に今サーバーに割り当てられているIPを取得することができるって感じ。それがダイナミックDNSってやつ。ダイナミック=動的ってこと。

ダイナミックDNSを利用するためには、どっかのサービスに登録しなければならない。このサービスをやってるところはいろいろあるから「ダイナミックDNS」で調べてみるといい。無料で使えるところもあるみたい。ぼくはDynDNSってところ。年2000円くらい。登録したら、ドメインを作成する。好きなドメイン名をつけれる。そしていまのIPアドレスを入力する。それでダイナミックDNSの設定は終了。今度はルータの設定にはいる。ルータの設定を開いてDDNSってところを探す。するとルータによってはDynDNSが簡単に使えるようになっているので、これを利用する。アカウント名とパスワードを入力して更新頻度を指定すれば、簡単に設定できる。もしルータにそーいう機能がなかったらサーバ側にドメイン名とIPアドレスを自動的に定期的に更新するように設定しなければならない。

一応これでグローバル公開は完了。おつかれっしたー。

ローカルからアクセスできない原因

自宅にサーバーを立てて、このブログを公開しているわけであるが、使っていて1つ問題が、、、

ローカルネットワークからアクセス出来ない。。。
外からならアクセスできるのに、中からだとアクセス出来ない。

具体的には、ローカル内のパソコンからローカルIPを指定すればつながるが、グローバルIPまたドメインを指定するとつながらない。
ただローカルIPを指定して繋がった場合もブログ内の画像ファイルやサーバー内のリンク等にはアクセス出来ないため、ブログの投稿すらできないのだ!!!!これは面倒!サーバーを立てている自宅からはブログの投稿ができない!くそっくそ!

ローカルからアクセス出来ないのは、当たり前のことだったっぽい。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=23242&forum=10

NATの原理を理解していれば分かるらしいが、よくわからん。まだまだ勉強が必要。

なんだかんだで公開プロキシをかましたらできた。プロキシも学校のクソなイメージがあったけど、プロキシっていうのは本来おれも思っていたものとは違うっぽい。今日はこれまで。

ブログサーバー構築の備忘録

勉強がてらブログサーバーを立ち上げることにした。まだローカルでしか動かないけど、近いうちに自分でサーバーを公開できるようにしたいと思っている。

日経Linux2012.7月号を参考に作成。
とりあえず、ローカルで動かすまでの備忘録。

1.まずパソコンにubuntusever12.04LSTをインストール
ここは普通にEnter連打でOK

2.文字化けを治す
インストールが終わったらアカウントにログインする。文字化けをしてるから

$ LANG=C nano ~/.bashrc

と実行。そしてファイルの一番最後に

case $TERM in
linux)LANG=C ;;
*)LANG=ja_JP.utf8 ;;
esac

と入力保存。ログインし直すと文字化けが治っているはず。

3.ネットワークの設定
無線LAN設定はできなかったorz
プロキシを通している場合、さっきのバッシュファイルを開き

export http_proxy="アドレス:ポート番号"

と入力する。その後設定を更新するために$ source ~/.bashrcを実行。
またサーバーを構築する前にはファイアウォールを切っておいたほうが良いらしい。

$ sudo ufw disable

でファイアウォール設定をOFFに。ちなみに

$ sudo ufw status

で設定を確認できる。

4.最新状態に更新
ネットワーク設定が終わりインターネットに繋がったら、OSのアップデートをする。

$sudo apt-get update
$sudo apt-get upgrade

これで完了。

5.apacheとSQLをインストール

$sudo apt-get install apache2
$sudo apt-get install mysql-server

wordpressはphpで動くためphpとその関連モジュールもインストール

$sudo apt-get install php5 php5-mysql php5-gd

6.apacheとSQLの設定
●apache
/etc/apache2/apache2.conf

73行目 Keepalive On

に変更。
/etc/apache2/sites-available/default

2行目 ServerAdmin メールアドレス
3行目 ServerName webサーバーのホスト名:サービスポート番号

に変更。
●MySQL

44行目 skip-external-locking
45行目 skip-name-resolve
46行目 log

を追記。
☆2つのサービスを起動する。

$ apachectl configtest
$ service apache2 start
$ service mysql start
$ mysqladmin -u root password 新しいパスワード

7.Wordpressのインストール

$ sudo apt-get install unzip wget
$ wget http://ja.wordpress.org/wordpress-3.4.1-ja.zip
$ unzip -d /var/www/ wordpress-3.4.1-ja.zip

オーナーの変更

$ sudo chown apache2 /var/www/wordpress
$ sudo chown -R apache2 /var/www/wordpress/wp-content

8.データベースの用意

$ sudo mysql -uroot -p
mysql> CREATE DATABASE wordpress CHARACTER SET utf8;
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO username@localhost IDENTIFIED BY 'パスワード';
mysql> FLUSH PRIVILEGES;
mysql> quit;

9.アクセス権の設定

$ chown apache2 /var/www/wordpress
$ chmod 775 /var/www/wordpress

10.wordpress初期設定
他のパソコンから「http://サーバのアドレス/wordpress」にアクセスする。
このとき注意することがローカルでアクセスしてしまうとwordpressが自動でそのローカルアドレスに設定しまうので、必ずグローバルなアドレスでアクセスする。

ユーザー名はおそらくroot、パスワードは8.で設定したパスワード。

以上でサーバー構築は完了。

ここからはAmebloからWordpressへ記事を移行する手続き。
方法はいくつかあるらしいが、ここではFC2ブログを利用して記事を移行する

11.FC2ブログに登録
サイトに行って普通に登録する

12.ログインしてブログ開設するときにAmebloからの移行を選択する
ブログの詳細情報を決める初期設定みたいなところで以前のブログを引きつぐってやつAmebloからの引越しツールが使える。

13.amebloのユーザ名とパスワードを入力し引越し完了メールを待つ。
僕の場合は、2時間くらいでした。

14.引越し完了したら、FC2ブログにログインしてバックアップファイルをダウンロードする。

15.インポート・プラグインを導入しようとしたら、FTP接続情報を求められてしまった
wp-config.phpにつぎの記述をする。

define(‘FS_METHOD’, ‘direct’);

そしてつぎに更新用(?)のディレクトリが必要になるので「wp-content/upgrade」を作成、パーミッションを書き込み可に変更。
同様に「wp-content/themes」と「wp-content/plugins」にも書き込み許可を与える。

$ mkdir wp-content/upgrade
$ chmod 0707 wp-content/upgrade
$ chmod 0707 wp-content/themes
$ chmod 0707 wp-content/plugins

参考http://xoops123.com/modules/wordpress/?p=215

研究テーマ

ずっとOpenCLについて勉強しているが、卒論の具体的なテーマについてはまだ決まっていない。
ただ漠然と興味を持ったOpenCLだけど、もう一度OpenCLはなにができるかについて考えた。
OpenCLはデバイス間の互換性を保つことが最大の役割。
 この言葉は非常に曖昧。デバイス間と一言で言っても、CPUの中のIntelとAMDのことを言っているのか、それともCPUとGPUのことを言っているのかによって大きく目指すところが違ってくる。
 もし、同じプロセッサー間のメーカー間の互換性を保つことが役割ならば、各メーカーごとのデバイスで同じプログラムを動かしてみて、性能評価するところからしなければならない。NVIDIAのCUDAとAMDのATI Streamを使った場合とOpenCLを使った場合の比較。そして差があったらなぜそれほどの差が出たかを調べ、その差を埋めるための研究をすればいい。
 もし、異なるプロセッサー間の互換性を保つことが役割ならば、、まず各プロセッサーのMAXの能力指数を図るところから始め、その差を埋めることが必要になる。CPUのシングルコア(単純な逐次での比較)とマルチコア(OpenMP等との比較)、そしてGPU(CPU)をそれぞれのデバイスの持ってる能力をOpenCLで引き出す研究をまずしなければならない。そして次にそれらが複合されたヘテロジニアスな環境下でそのプログラムがその環境のデバイスを一番見合った適材適所で割り振れるようなプログラム開発の研究をするべきだろう。そしてそれと同時に誰もが簡単にソースを使いまわせる(ワークアイテムの数を簡単に変えられる等の変更も含め)ことも必要になってくるだろう。