2011年8月26日金曜日

picasaアドレス変更?

いつもbloggerに画像を上げる時にはgoogleのサービスであるpicasaを使っていたんですけど
どうやら現在、一部を除いてブログに画像が表示されていません。

クリックでもリンク先へ飛べないので調べたところ、どうやら画像のアドレスが変わっているようです。
さすがに全部の画像を貼り直すのはとても面倒なので他の方法を考えたんですけど、
残念ながら手作業でリンク先を変更するしかないようです。

調べても引っ掛からなかったから他の人はこんな現象起こってないのかなぁ。
最近Androidケータイに変えてそこから一度更新したので、
それが悪さをしたんじゃないかと思う反面、アドレスの先頭が変わってるので単なる変更の可能性も……。

特にgoogleからのアナウンスはないみたいですね。
と言っても訳後でないと読めませんけど(笑)


すぐに戻すにはちょっと時間が足りないのでぼちぼちって感じですねー。
電験の終わる9/4日以降かな?


夏休みはいろいろする予定だったんだけど遊んで終わっちゃいそうだなぁー……。
そして電験の得点率が6割を越しませんorz
一教科受かればそれでいいんだけどなー。


ここでgalaxy SII tips。
galaxy SIIではホームボタンと電源ボタンでスクリーンショットが撮れます。
これはiPhoneと同じみたいですね。
初期から入っている操作なのでアプリのダウンロードの必要はありません。
操作は、ホームボタンを先に押し、すかさず押したまま電源ボタンを押すことで撮ることができます。

ちょっとしたポップアップが出るので撮れたかどうか確認できます。
画像はギャラリー内に。
でもあんまり使う機会がなさそうってのもあるんだよなぁ。

以上、今回も携帯からの投稿でした。

2011年8月15日月曜日

Android

先日、携帯電話がスマートフォン、サムスン製のgalaxySIIに変わりました。
現在のところ活用できるほど何も入れていませんが、
これからいろいろ入れていく予定です。

iPhoneでなくAndroidを選んだ理由はまあ、
よくある回線の問題や開発の容易さが大きかったかな。

iPhoneのアプリはMacintoshでしか開発できないからなぁ。
その分Androidはプラットホームを選ばないし簡単。
言語もjavaだし。

そんな感じでプログラミングの練習がてら
いつものオセロでも作ってみる感じです。


そのあとはチェスとかかなー?
もちろんそっちの専門ではないので対人打ちだけですけど。
Aiはかなり敷居が……。

他にはARとか触っていけたらいいなーなんて。

今回、ケータイからの投稿なのでこのくらいで。

2011年8月4日木曜日

キーボード掃除

今日から夏休みに入って時間が出来たので前からやろうと思ってたキーボードとの掃除を。

使ってるのがNEC LaVie LLのノートPCなので、 キーを掃除するためには結構面倒な感じで外さなきゃいけないんですよね。

ノートのキーボードはどうやらパンタグラフ(?)みたいな感じになっているようです。
これやる前に必ず写真撮っておきましょう。Insertあたりは結構覚えてないもんです。


壊さないように慎重に取り外し……。





十数分かけて全部取り終えました。
良く見るとスペースキーの場所に何か書いてます。



"H"と"I"かな?もしかしたら組み立て中にイニシャルを書いたとか?笑

ちなみに取り外しはキーの角に指を入れて左右片方ずつ取れば割れずに全部とれました。
シールを引きはがす感じ?

最初の方はストローを加工して水平に上に引っ張って取ってましたけど
時間かかるし手でいったら案外割れずに済んだってのが真実です。

まずはあまり使わないキーで試してみましょう。
(InsertとかPauseとか右Ctrlとか右Altとか……)


実は結構汚いキーボードの内側。



埃やら髪の毛やらがびっしりです。
これを歯ブラシで軽くこすりながら掃除機で吸うこと数分……。

結構きれいになりました。(しかし画像なし)
変な汚れは手元にあったエタノールで処理しました。
さっきのサイン(?)も消えました。

キーの方も同じくエタノール使いながら汚れを綿棒やらで取ります。

そして今までPCを使ってきた勘で組み直し。
ノート特有のONテンキーの数字に助けられつつ……なんとか組み直し完成。




こんな感じになりました。
正解と見比べてみると……。

Enterすぐ左のカッコふたつのキーが逆になってました。笑
はじまりが下にあるって見ただけでなんか違和感あるのに……。

キーを取ってつけ直し。
そんな感じでキーボードの掃除終了でした。

キーの装着の方は、片方のツメに見ながらはめ込むと
反対側は位置が固定されるのでそのまま押すだけで入ります。

あとEnterキーは出来れば外さない方がよかったかな。
補助用(?)にShiftとかEnterなどの大きなキーには金属の棒が入ってるんだけど、
それをつけるのが至難でした。

まわりからも掃除機で吸えるのでEnterだけ付けたままでもよかったなー。

それと掃除機を近づけ過ぎると固定用のプラスティックも外れたのでそこも要注意かな。


夏休み初日に何やってんだろ(笑)

2011年6月23日木曜日

Windowsプログラミングによるオセロ

学校の課題の休憩中にWinAPIの練習がてらいつものオセロを作ってみました。

Drawing関数はInvalidateRect()とかでWM_PAINT内で処理させた方がよかったかな。

最初に何よりも迷ったのがVisualC++でのWinプロジェクトの作成。
コンソールだとウィンドウとか出せないので、Winプロジェクトを作る必要があるんだけれど、
わざわざそんな初歩的なこと書いてないし、
なにより参考HPが基本的に以前のVerのVisualStudioだったりとか。

新規プロジェクト→Win32→Win32プロジェクトから作れます。
コンソールアプリケーションじゃだめ。

中身自体は空のプロジェクトでOK。そのあといつものように.cppを追加しとけば大丈夫。
とりあえずAPIの基本的な動き方はわかった(つもり)ので、
これからチェスとか作れればいいなぁなんて。

ちょっと前にもあったけどネタ。
http://www.gizmodo.jp/2011/06/667.html

これに対応する予定は今のところありません(笑)


以下リスト。

#include<windows.h>
#include <tchar.h>
#include<stdlib.h>
#include<stdio.h>


//const
#define WINDOW_WIDTH (430)
#define WINDOW_HEIGHT (340)


//grobal
RECT g_windowPos;
int board[10][10] = {0};
int buf_board[10][10] = {0};
int rev_board[10][10] = {0};
static int act = 1,wait = 2;//1 = player1,2 = player2
int rev_act = 2,rev_wait = 1;


//Prototype
HWND Create(HINSTANCE hInst);
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp);
void OthelloInit(HWND hWnd);
void Drawing(HWND hWnd);
int Algo(int x,int y,HWND hWnd);
void Check(int x,int y,int i,int j,int *flag);
void REV(int flag,HWND hWnd);
int NUMSTONE(int color);


//Start
int WINAPI WinMain(HINSTANCE hInst,
HINSTANCE hPrevInst,
LPSTR lpCmdLine,
int showCmd)
{
HWND hWnd;
MSG msg;


//Create Window
hWnd = Create(hInst);


if ( hWnd == NULL){
MessageBox(NULL,_T("Creating Window is failed"),_T("ERROR"),MB_OK);
return 1;
}


//Show Window
ShowWindow( hWnd, SW_SHOW);
UpdateWindow(hWnd);


OthelloInit(hWnd);


//Message Loop
while( 1 ){
BOOL ret = GetMessage( &msg,NULL,0,0);//Get Message
if( ret == 0 || ret == -1){
//if get Message of Shutdown,
//or failed GetMessage() (return -1),EndLoop
break;
} else {
//Message
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
return 0;
}


HWND Create(HINSTANCE hInst){
WNDCLASSEX wc;


// Window Class
wc.cbSize = sizeof(wc); //const size
wc.style = CS_HREDRAW | CS_VREDRAW; //style
wc.lpfnWndProc = WndProc; //window procedure
wc.cbClsExtra = 0; //Extra Info1
wc.cbWndExtra = 0; //Extra Info2
wc.hInstance = hInst; //Instance handle
wc.hIcon = (HICON)LoadImage( //Icon
NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,
0,0,LR_DEFAULTSIZE | LR_SHARED
);
wc.hIconSm = wc.hIcon; //child Icon
wc.hCursor = (HCURSOR)LoadImage( //Mouse Cursor
NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,
0,0,LR_DEFAULTSIZE | LR_SHARED
);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//Window Background
wc.lpszMenuName = NULL; //Menu Name
wc.lpszClassName = _T("Default Class Name");//Window Class Name


//Submit Window Class
if ( RegisterClassEx( &wc ) == 0){
return NULL;
}


//Window's location
g_windowPos.left = (GetSystemMetrics( SM_CXSCREEN ) - WINDOW_WIDTH )/2;
g_windowPos.top = (GetSystemMetrics( SM_CYSCREEN ) - WINDOW_HEIGHT )/2;
g_windowPos.right = g_windowPos.left + WINDOW_WIDTH;
g_windowPos.bottom = g_windowPos.top + WINDOW_HEIGHT;


//Create Window
return CreateWindow(
wc.lpszClassName, //Window Class Name
_T("Sample Program"), //Title bar
WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME, //Window type
g_windowPos.left, //X
g_windowPos.top, //Y
WINDOW_WIDTH, //Window Width
WINDOW_HEIGHT, //Window Height
NULL, //Parent Window handle
NULL, //Menu Handle
hInst, //Instance Handle
NULL //Extra Data
);
}


//Window Procedure
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp)
{
static int x,y;
static BOOL draw = FALSE;
HWND hButtonWnd;
HINSTANCE hInst;
hInst = (HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE);


switch( msg ){
case WM_LBUTTONUP:
x = LOWORD(lp);
y = HIWORD(lp);
if(x >= 20 && x <= 55+34*7 && y >= 20 && y <= 55+34*7){
Algo(x,y,hWnd);
Drawing(hWnd);
}
return 0;
case WM_RBUTTONUP:
if(act == 1){
act = 2;
wait = 1;
}else if(act == 2){
act = 1;
wait = 2;
}
Drawing(hWnd);
return 0;
case WM_CREATE:
hButtonWnd = CreateWindow(
_T("BUTTON"),_T("UNDO"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
310,20,100,30,hWnd,(HMENU)1000,hInst,NULL);
hButtonWnd = CreateWindow(
_T("BUTTON"),_T("RESTART"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
310,260,100,30,hWnd,(HMENU)2000,hInst,NULL);
break;
case WM_COMMAND:
switch(LOWORD(wp)){
case 1000:
REV(2,hWnd);
Drawing(hWnd);
break;
case 2000:
OthelloInit(hWnd);
return 0;
}
break;
case WM_CLOSE:
if( MessageBox(hWnd,_T("shutdown?"),_T("checking"),MB_YESNO ) == IDNO){
return 0;
}
break;
case WM_DESTROY://when Window Destroy
PostQuitMessage(0);
return 0;
}


//other Messages is DEFAULT
return DefWindowProc(hWnd,msg,wp,lp);


}


void OthelloInit(HWND hWnd){
int i,j;


act = 1;
wait = 2;
for (i = 0;i < 10;i++){
for(j = 0;j < 10;j++){
board[i][j] = 0;
}
}


for (i = 0;i <; 10;i++){
board[i][0] = 8;
board[i][9] = 8;
board[0][i] = 8;
board[9][i] = 8;
rev_board[i][0] = 8;
rev_board[i][9] = 8;
rev_board[0][i] = 8;
rev_board[9][i] = 8;


}
board[4][5] = 1;
board[5][4] = 1;
board[4][4] = 2;
board[5][5] = 2;
rev_board[4][5] = 1;
rev_board[5][4] = 1;
rev_board[4][4] = 2;
rev_board[5][5] = 2;


EnableWindow(GetDlgItem(hWnd,1000),FALSE);


Drawing(hWnd);
}


void Drawing(HWND hWnd){
int i,j;
char word[50];
RECT rc;
HDC hDC;
HBRUSH hBrush;
HPEN hPen;
WCHAR prev_word[50];


hDC = GetDC(hWnd);
/*
GetClientRect(hWnd,&rc);
InvalidateRect(hWnd,&rc,FALSE);
*/
hPen = CreatePen(PS_NULL,0,0);
hBrush = CreateSolidBrush(RGB(255,255,255));
SelectObject(hDC,hPen);

SelectObject(hDC,hBrush);
Rectangle(hDC,310,160,400,200);
DeleteObject(hPen);
DeleteObject(hBrush);

//GetStockObject(BLACK_PEN);
SelectObject(hDC,(HPEN)GetStockObject(BLACK_PEN));
for (i = 0;i < 8;i++){
for (j = 0;j < 8;j++){
hBrush = CreateSolidBrush(RGB(0,255,0));
SelectObject(hDC,hBrush);
Rectangle(hDC,20+34*i,20+34*j,55+34*i,55+34*j);
DeleteObject(hBrush);
switch(board[i+1][j+1]){
case 1:
hBrush = CreateSolidBrush(RGB(0,0,0));
SelectObject(hDC,hBrush);
Ellipse(hDC,22+34*i,22+34*j,53+34*i,53+34*j);
DeleteObject(hBrush);
break;
case 2:
hBrush = CreateSolidBrush(RGB(255,255,255));
SelectObject(hDC,hBrush);
Ellipse(hDC,22+34*i,22+34*j,53+34*i,53+34*j);
DeleteObject(hBrush);
break;
}
}
}
SetRect(&rc,310,100,400,150);
switch(act){
case 1:
DrawText(hDC,_T("Black turn"),-1,&rc,0);
break;
case 2:
DrawText(hDC,_T("White turn"),-1,&rc,0);
break;
}

sprintf_s(word,30,"black = %d\nwhite = %d",NUMSTONE(1),NUMSTONE(2));
mbstowcs_s(0,prev_word,30,word,_TRUNCATE);
SetRect(&rc,310,160,400,200);
DrawText(hDC,prev_word,-1,&rc,DT_WORDBREAK);
ReleaseDC(hWnd,hDC);
}


int Algo(int x,int y,HWND hWnd){
int locx,locy,i,j,flag;
for(i = 0;i < 8;i++){
if (x >= 20+34*i && x <= 55+34*i){
locx = i+1;
}
if (y >= 20+34*i && y <= 55+34*i){
locy = i+1;
}
}


if(board[locx][locy] != 0){
return -1;
}


if(locx >= 1 && locx <= 8 && locy >= 1 && locy <= 8){


/*置き石判定*/
flag = 0;
REV(flag,hWnd);
for (i = -1;i <= 1;i++){
for(j = -1;j <= 1;j++){
Check(locx,locy,i,j,&flag);
}
}
if(flag != 0){
REV(flag,hWnd);
board[locx][locy] = act;
if(act == 2){
rev_act = act;
rev_wait = wait;
wait = act;
act = 1;
} else {
rev_act = act;
rev_wait = wait;
wait = act;
act = 2;
}
}
}
return 0;
}


void Check(int x,int y,int i,int j,int *flag){
int k,num;
if(board[x+i][y+j] == wait){
num = 0;
while(1){
if(board[x+i][y+j] == wait){
num++;
} else if (board[x+i][y+j] == act){
for(k = 0;k < num;k++){
board[x-i*k][y-j*k] = act;
}
*flag = 1;
break;
} else if(board[x+i][y+j] == 8 || board[x+i][y+j] == 0){
break;
}
x += i;
y += j;
}
}
}


void REV(int flag,HWND hWnd){
int i,j;
if(flag == 0){
for(i = 0;i < 10;i++){
for(j = 0;j &t; 10;j++){
buf_board[i][j] = board[i][j];
}
}
} else if(flag == 1){
for(i = 0;i < 10;i++){
for(j = 0;j < 10;j++){
rev_board[i][j] = buf_board[i][j];
}
}
EnableWindow(GetDlgItem(hWnd,1000),TRUE);
} else if(flag == 2){
act = rev_act;
wait = rev_wait;
for(i = 0;i < 10;i++){
for(j = 0;j < 10;j++){
board[i][j] = rev_board[i][j];
}
}
EnableWindow(GetDlgItem(hWnd,1000),FALSE);
}
}

int NUMSTONE(int color){
int i,j,num;
num = 0;
for(i = 0;i < 10;i++){
for(j = 0;j < 10;j++){
if(board[i][j] == color){
num++;
}
}
}
return num;
}

2011年6月19日日曜日

課題・ガウスの消去法3(ピボット)

ガウスの消去法1
ガウスの消去法2

引き続いてガウスの消去法。

前回はいったん答えが出たように思いましたが、このような

場合には正常な値が出ませんでした。

PRINTを前進消去の直後に入れると解るんですけど、
2行目以下の値がERRORになっています。

これは手計算してみると解るんですけど、
2行2列が0になってしまっています。

これによって2行目を2行2列で割って、1にするという計算が誤作動を起こします。
(定数割る0なので)

これを回避するために、ピボット(1にしたい対角要素)に合わせて
行を入れ替えるという方法があります。






まず、このピボットの選択のためには今見ている行以下の行で、
見たい列の中の最大値がある行を現在の行と入れ替える方法を使います。

今の場合、見ている行は2行2列で、2行目以下(つまり2行目と3行目)で
2列目が最大になる行を選べばいいことになります。

ややこしいですけど2列目が一番大きい3行目を2行目と入れ替えるということです。


前進消去のループのしょっぱなには今見ている行列をbufに入れて、
bufで割ってしまっているのでピボットの選択はこれより前、
かつfor(i=0~)よりあとに入れます。


この式を例にとった場合、列の最大値をa_maxとでも置くと、

if(a_max > a_matrix[0][0]){
a_max = a_matrix[0][0];
}

if(a_max > a_matrix[1][0]){
a_max = a_matrix[1][0];
}
if(a_max > a_matrix[2][0]){
a_max = a_matrix[2][0];
}
//ここまで1行目(i=0)の場合

if(a_max > a_matrix[1][1]){
a_max = a_matrix[1][1];
}
if(a_max > a_matrix[2][1]){
a_max = a_matrix[2][1];
}
//ここまで2行目(i=1)の場合

if(a_max > a_matrix[2][2]){
a_max = a_matrix[2][2];
}
//ここまで3行目(i=2)の場合

次にこれを簡略化すると、jはこの時使用されていないのでjを使うと、

for(j = i;j < 3;j++){
if(a_max > a_matrix[j][i]){
a_max = a_matrix[j][i];
}
}

となります。これでその列の最大値が求まりましたが、
このままでは何行目にその最大値があったのかわかりません。
(最大値があった行と、もとの行を入れ替えるために必要)

なので適当な変数にその「最大値があった行」をいれておきます。
ここでは使われない(予定)のkをつかいます。
(できるだけ宣言する変数は少ない方がいいので、いままで宣言した変数の中で
その時値を変えても大丈夫な変数があればそれを使います。)


for(j = i;j < 3;j++){
if(a_max > a_matrix[j][i]){
a_max = a_matrix[j][i];
k = j;
}
}

これで最大値のある行が把握できました。

これからこのk行とi行とを入れ替えます。
入れ替えには1つ目を適当な変数に一度格納しておき、2つ目を1つ目に入れた後に
適当な変数から2つ目にいれるという方法を使います。

もとの行はi行、入れ替える行はk行なので

for(j = 0;j < 3;j++){
buf = a_matrix[i][j];
a_matrix[i][j] = a_matrix[k][j];
a_matrix[k][j] = buf;
}
buf = b_matrix[i];
b_matrix[i] = b_matrix[k];
b_matrix[k] = buf;

となります。

これらをすべてリストに直したものが以下にあります。
a_maxはbufで代用できるのでbufに変更、
for(i=0~)の最初に最大値の初期化としてbuf = 0;が入っています。

そして最大値buf(元a_max)は、マイナスであろうと0でなければいいので
絶対値をfabs()でとっています。fabs()はmath.hを#includeすれば使えます。

他にbuf(a_max)が0の時にERRORとして終了させると、
連立方程式が不成立の時に強制的に終了させることが出来ます。

以上、おつさまですた。

#include<stdio.h>
#include<math.h>

/*prototype*/
int PRINT(double a_matrix[3][3],double b_matrix[3]);

int main(void){
int i,j,k;
double a_matrix[3][3] = {{1,1,1},{1,1,3},{2,4,5}};
double b_matrix[3] = {6,8,19};
double buf;

PRINT(a_matrix,b_matrix);

//前進消去
for(i = 0;i < 3;i++){
buf = 0;
for(j = i;j < 3;j++){
if(buf < fabs(a_matrix[j][i])){
buf = a_matrix[j][i];
k = j;
}
}

for(j = 0;j < 3;j++){
buf = a_matrix[i][j];
a_matrix[i][j] = a_matrix[k][j];
a_matrix[k][j] = buf;
}
buf = b_matrix[i];
b_matrix[i] = b_matrix[k];
b_matrix[k] = buf;

buf = a_matrix[i][i];
for(j = 0;j < 3;j++){
a_matrix[i][j] = a_matrix[i][j] / buf;
}
b_matrix[i] = b_matrix[i] / buf;

for(j = i + 1;j < 3;j++){
buf = a_matrix[j][i];
for(k = 0;k < 3;k++){
a_matrix[j][k] = a_matrix[j][k] - a_matrix[i][k] * buf;
}
b_matrix[j] = b_matrix[j] - b_matrix[i] * buf;
}
}

//後退代入
for (i = 2;i >= 1;i--){
for (j = i-1;j >= 0;j--){
buf = a_matrix[j][i];
for (k = 0;k < 3;k++){
a_matrix[j][k] = a_matrix[j][k] - a_matrix[i][k] * buf;
}
b_matrix[j] = b_matrix[j] - b_matrix[i] * buf;
}
}

PRINT(a_matrix,b_matrix);
return 0;
}

int PRINT(double a_matrix[3][3],double b_matrix[3]){
int i,j;

for(i = 0;i < 3;i++){
for(j = 0;j < 3;j++){
printf("%6.4f ",a_matrix[i][j]);
}
printf("%6.4f\n",b_matrix[i]);
}
printf("\n");
return 0;
}

2011年6月12日日曜日

課題・ガウスの消去法2(後退代入)

ガウスの消去法1
ガウスの消去法3

前回に引き続き、ガウスの消去法。
前進消去が終わって上三角行列になったので、ここからは答えを求める後退代入。
用語はあっているか知りませんけど。

現時点でここまで求めることが出来ています。


ここから3行目を利用して2行目と1行目を消していきます。

  1. 2行目3列が0になるように3行目を定数倍して2行目から引く
    (2行目マイナス、3行目3列かける2行目)
  2. 1行目3列が0になるように3行目を定数倍して2行目から引く
    (1行目マイナス、3行目3列かける1行目)
  3. 1行目2列が0になるように2行目を定数倍して1行目から引く
    (1行目マイナス、2行目2列かける1行目)

上の式が、
1.

2行目3列が0になって、

2.

1行目3列が0になって、

3.

1行目2列が0になり、答えが求まります。


前進消去と似たような感じなので手早くプログラムを羅列していきます。


/*1*/
buf = a_matrix[1][2];
a_matrix[1][0] = a_matrix[1][0] - a_matrix[2][0] * buf;
a_matrix[1][1] = a_matrix[1][1] - a_matrix[2][1] * buf;
a_matrix[1][2] = a_matrix[1][2] - a_matrix[2][2] * buf;
b_matrix[1] = b_matrix[1] - b_matrix[2]* buf;

/*2*/
buf = a_matrix[0][2];
a_matrix[0][0] = a_matrix[0][0] - a_matrix[2][0] * buf;
a_matrix[0][1] = a_matrix[0][1] - a_matrix[2][1] * buf;
a_matrix[0][2] = a_matrix[0][2] - a_matrix[2][2] * buf;
b_matrix[0] = b_matrix[0] - b_matrix[2] * buf;

/*3*/
buf = a_matrix[0][1];
a_matrix[0][0] = a_matrix[0][0] - a_matrix[1][0] * buf;
a_matrix[0][1] = a_matrix[0][1] - a_matrix[1][1] * buf;
a_matrix[0][2] = a_matrix[0][2] - a_matrix[1][2] * buf;
b_matrix[0] = b_matrix[0] - b_matrix[1] * buf;

これを前までのプログラムの下に入れてあげると(すべてのforループの外)、
x1 = 3,
x2 = 2,
x3 = 1
という答えになります。

ここから、今まで書いたプログラムの中に上手く入るようにしていきます。
このくらい短いプログラムの省略だとまず恒常的に、一番回るのが遅いループを探します。

この場合、buf = a_matrix[1][2]の右側の配列番号が、手順3まで変化しません。
反対に左側の部分は、手順2で0に変化しています。
この一番外のループをiにします。

次に、2番目に遅く回るループを探します。
さっきの左側の部分は手順が次に行くまで変化しません。これをjとします。

残りは手順内で0~2と変化するのでこれをkとします。

するとこのプログラムは、
for (i = 2;i >= 1;i--){
for (j = i-1;j >= 0;j--){
buf = a_matrix[j][i];
for (k = 0;k < 3;k++){
a_matrix[j][k] = a_matrix[j][k] - a_matrix[i][k] * buf;
}
b_matrix[j] = b_matrix[j] - b_matrix[i] * buf;
}

となります。

前回を含めたプログラムリストに直すと、
#include

/*prototype*/
int PRINT(double a_matrix[3][3],double b_matrix[3]);

int main(void){
int i,j,k;
double a_matrix[3][3] = {{2,1,1},{2,3,5},{1,1,3}};
double b_matrix[3] = {9,17,8};
double buf;

PRINT(a_matrix,b_matrix);

/*前進消去*/
for(i = 0;i < 3;i++){
buf = a_matrix[i][i];
for(j = 0;j < 3;j++){
a_matrix[i][j] = a_matrix[i][j] / buf;
}
b_matrix[i] = b_matrix[i] / buf;

for(j = i + 1;j < 3;j++){
buf = a_matrix[j][i];
for(k = 0;k < 3;k++){
a_matrix[j][k] = a_matrix[j][k] - a_matrix[i][k] * buf;
}
b_matrix[j] = b_matrix[j] - b_matrix[i] * buf;
}
}

PRINT(a_matrix,b_matrix);

/*後退代入*/
for (i = 2;i >= 1;i--){
for (j = i-1;j >= 0;j--){
buf = a_matrix[j][i];
for (k = 0;k < 3;k++){
a_matrix[j][k] = a_matrix[j][k] - a_matrix[i][k] * buf;
}
b_matrix[j] = b_matrix[j] - b_matrix[i] * buf;
}
}

PRINT(a_matrix,b_matrix);
return 0;
}

int PRINT(double a_matrix[3][3],double b_matrix[3]){
int i,j;

for(i = 0;i < 3;i++){
for(j = 0;j < 3;j++){
printf("%6.4f ",a_matrix[i][j]);
}
printf("%6.4f\n",b_matrix[i]);
}
printf("\n");
return 0;
}


これで連立一次方程式のガウス消去法による解が求まりました。

しかしこれだけでは

のような連立一次方程式の解は得られません。
次はピボットについて書く予定です。

おつさまですた。

2011年6月11日土曜日

課題・ガウスの消去法1(前進消去法)

ガウスの消去法2
ガウスの消去法3

前回から授業が1回空いて、今回はガウスの消去法です。
2つ前はシンプソン公式による近似で、1つ前は改良オイラー法による常微分方程式でした。
ガウスの消去法は前進消去とか後退代入とかのやつです。
今回は前進消去だけを扱って、後退代入は次の記事になるとおもいます。

今回はこの式を題材に使います。

まあ簡単な連立一次方程式なんですけど、項の数が多くなってくると手計算は大変ですよね、
ということでプログラム化です。

行列についてはあまり言及しません。
学校で行くと去年の前期のことなんで忘れてるってのもありますけど^^;
計算自体は線形代数です。

行列式の計算は

となることを利用しています。

まずは1行目を左端の2で割って、

とします。(左端を1にしたい)

次にその1行目に、「1行目の左の数が2行目の左の数になるように」定数nをかけます。
そして2行目から、n倍した1行目を引きます。するとこのように、

2行目の左端が0になりました。
(同じように3行目も1行目をn倍して引いてます。)


1行目の左端が1に、それ以外の左端が0になったので、
次は2行目2列が1になるように同じように定数(この場合では2)で割ります。



そしてその2行目を使って3行目の真ん中を0にします。(1/2をかけている)


再び、3行目の右が1になるように定数で割ります。



ここまでが前進消去です。左下に0が三角形に並んでいます。

今回はこの「前進消去」をプログラム化していきます。



これまでの流れとしては、行列をi行j列とすると、

  1. 1行目の1列が1になるように1行目を割る。
    (1行目1列で1行目を割る)
  2. 2行目の1列が0になるように1行目を定数倍して2行目から引く。
    (2行目マイナス、2行目1列かける1行目)
  3. 3行目1列が0になるように、1行目を定数倍して3行目から引く。
    (3行目マイナス、3行目1列かける1行目)
  4. 2行目2列が1になるように2行目を割る。
    (2行目2列で2行目を割る)
  5. 3行目2列が0になるように、2行目を定数倍して3行目から引く。
    (3行目マイナス、3行目2列かける2行目)
  6. 3行目3列が1になるように3行目を割る。

という感じです。


1~3をプログラム化すると、
int i,j,k;
double a_matrix[3][3]={{2,1,1},{2,3,5},{1,1,3}};
double b_matrix[3]={9,17,8};

/*1*/
a_matrix[0][0] = a_matrix[0][0] / a_matrix[0][0];//ここでa_matrix[0][0]が変わる
a_matrix[0][1] = a_matrix[0][1] / a_matrix[0][0];
a_matrix[0][2] = a_matrix[0][2] / a_matrix[0][0];
b_matrix[0] = b_matrix[0] /a_matrix[0][0];

/*2*/
a_matrix[1][0] = a_matrix[1][0] - a_matrix[0][0] * a_matrix[1][0];//ここでa_matrix[1][0]が変わる
a_matrix[1][1] = a_matrix[1][1] - a_matrix[0][1] * a_matrix[1][0];
a_matrix[1][2] = a_matrix[1][2] - a_matrix[0][2] * a_matrix[1][0];
b_matrix[1] = b_matrix[1] - b_matrix[0] * a_matrix[1][0];

/*3*/
a_matrix[2][0] = a_matrix[2][0] - a_matrix[0][0] * a_matrix[2][0];//ここでa_matrix[1][0]が変わる
a_matrix[2][1] = a_matrix[2][1] - a_matrix[0][1] * a_matrix[2][0];
a_matrix[2][2] = a_matrix[2][2] - a_matrix[0][2] * a_matrix[2][0];
b_matrix[2] = b_matrix[2] - b_matrix[0] * a_matrix[2][0];

と書きたいところですけど、コメントのようにその時点で使いたい数字が変更されてしまうので、
違う数値に格納しておきます。これをbufとでも付けておきます。
修正して4~6も入れたのが以下です。

修正後
int i,j,k;
double a_matrix[3][3]={{2,1,1},{2,3,5},{1,1,3}};
double b_matrix[3]={9,17,8};
double buf;

/*1*/
buf = a_matrix[0][0];
a_matrix[0][0] = a_matrix[0][0] / buf;
a_matrix[0][1] = a_matrix[0][1] / buf;
a_matrix[0][2] = a_matrix[0][2] / buf;
b_matrix[0] = b_matrix[0] /buf;

/*2*/
buf = a_matrix[1][0];
a_matrix[1][0] = a_matrix[1][0] - a_matrix[0][0] * buf;
a_matrix[1][1] = a_matrix[1][1] - a_matrix[0][1] * buf;
a_matrix[1][2] = a_matrix[1][2] - a_matrix[0][2] * buf;
b_matrix[1] = b_matrix[1] - b_matrix[0] * buf;

/*3*/
buf = a_matrix[2][0];
a_matrix[2][0] = a_matrix[2][0] - a_matrix[0][0] * buf;
a_matrix[2][1] = a_matrix[2][1] - a_matrix[0][1] * buf;
a_matrix[2][2] = a_matrix[2][2] - a_matrix[0][2] * buf;
b_matrix[2] = b_matrix[2] - b_matrix[0] * buf;

/*4*/
buf = a_matrix[1][1];
a_matrix[1][0] = a_matrix[1][0] / buf;
a_matrix[1][1] = a_matrix[1][1] / buf;
a_matrix[1][2] = a_matrix[1][2] / buf;
b_matrix[1] = b_matrix[1] /buf;

/*5*/
buf = a_matrix[2][1];
a_matrix[2][0] = a_matrix[2][0] - a_matrix[1][0] * buf;
a_matrix[2][1] = a_matrix[1][1] - a_matrix[1][1] * buf;
a_matrix[2][2] = a_matrix[1][2] - a_matrix[1][2] * buf;
b_matrix[2] = b_matrix[2] - b_matrix[1] * buf;

/*6*/
buf = a_matrix[2][2];
a_matrix[2][0] = a_matrix[2][0] / buf;
a_matrix[2][1] = a_matrix[2][1] / buf;
a_matrix[2][2] = a_matrix[2][2] / buf;
b_matrix[2] = b_matrix[2] /buf;

これで一応の答えは出たかなー?
まあご周知の通りこんなプログラム汎用性がないわけです。
行列増やしたらまた打ち直しとか。

そんなわけでここからループ化していきます。
実際、自分がプログラムに書くのってここからなんですけど^^;

まず、感じとしては、同じ一連の数字のところに同じ変数を入れます。
その前に、プログラムとして同じ処理を見極めます。

手順1と4,6はbufで割る計算、2,3,5はaにbufをかけてaから引く計算です。
なので順番は1→2,3→4→5→6とします。

手順1のbuf = a[0][0];を手順4,6と比べてみると、[0][0]と[1][1],[2][2]であることがわかります。
なので両方同じように増えるのでa[i][i]と置いてみます。
ループとして書くと、
for(i = 0;i < 3;i++){
/*処理*/
}

そして、aをbufで割る計算のところは、aの左側がiと同じ、右側は0~2と増えていきます。
右側をjと置きます。右側をjと置くと、jは0,1,2なので

for(j = 0;j < 3;j++){
/*処理*/
}

とすればいいように思います。
以下は実行しないでください。

int i,j,k;
double a_matrix[3][3]={{2,1,1},{2,3,5},{1,1,3}};
double b_matrix[3]={9,17,8};
double buf;

/*1*/
for(i = 0;i < 3;i++){
buf = a_matrix[i][i];
for(j = 0;j < 3;j++){
a_matrix[i][j] = a_matrix[i][j] / buf;
}
b_matrix[i] = b_matrix[i] /buf;/*何度も割ってはいけないのでjの外に出す*/
}

/*2*/
buf = a_matrix[1][0];
a_matrix[1][0] = a_matrix[1][0] - a_matrix[0][0] * buf;
a_matrix[1][1] = a_matrix[1][1] - a_matrix[0][1] * buf;
a_matrix[1][2] = a_matrix[1][2] - a_matrix[0][2] * buf;
b_matrix[1] = b_matrix[1] - b_matrix[0] * buf;

/*3*/
buf = a_matrix[2][0];
a_matrix[2][0] = a_matrix[2][0] - a_matrix[0][0] * buf;
a_matrix[2][1] = a_matrix[2][1] - a_matrix[0][1] * buf;
a_matrix[2][2] = a_matrix[2][2] - a_matrix[0][2] * buf;
b_matrix[2] = b_matrix[2] - b_matrix[0] * buf;

/*5*/
buf = a_matrix[2][1];
a_matrix[2][0] = a_matrix[2][0] - a_matrix[1][0] * buf;
a_matrix[2][1] = a_matrix[1][1] - a_matrix[1][1] * buf;
a_matrix[2][2] = a_matrix[1][2] - a_matrix[1][2] * buf;
b_matrix[2] = b_matrix[2] - b_matrix[1] * buf;

次に、手順2,3,5を考えます。
2,3,5ともに1と同じくaの右は0~2です。
2,3ともに左側は1~2です。
しかし5では左側が2のみです。

この場合では手順2,3をペアに、5をひと固まりとして考えます。

手順2,3ではiの値は0で、aの左は1~2です。
手順5ではiの値は1で、aの左は2です。

こうすると、aの左はi+1から始まり、2で終われば良いように思います。
これはb_matrix[i] = b_matrix[i] /buf;の下に書かなければいけないため、
さっきのjループの外側です。なのでもう一度、変数jを利用します。

その中にまたループを作ってaの右を0~2しなくてはいけないので、
同じようにkでループを作ります。

for(j = i+1;j < 3;j++){
for(k = 0;k < 3;k++){
/*処理*/
}
}

これらすべてをプログラムとして完成させると、

#include<stdio.h>

/*prototype*/
int PRINT(double a_matrix[3][3],double b_matrix[3]);

int main(void){
int i,j,k;
double a_matrix[3][3] = {{2,1,1},{2,3,5},{1,1,3}};
double b_matrix[3] = {9,17,8};
double buf;

PRINT(a_matrix,b_matrix);

for(i = 0;i < 3;i++){
buf = a_matrix[i][i];
for(j = 0;j < 3;j++){
a_matrix[i][j] = a_matrix[i][j] / buf;
}
b_matrix[i] = b_matrix[i] / buf;

for(j = i + 1;j < 3;j++){
buf = a_matrix[j][i];
for(k = 0;k < 3;k++){
a_matrix[j][k] = a_matrix[j][k] - a_matrix[i][k] * buf;
}
b_matrix[j] = b_matrix[j] - b_matrix[i] * buf;
}
}
PRINT(a_matrix,b_matrix);
return 0;
}

int PRINT(double a_matrix[3][3],double b_matrix[3]){
int i,j;
for(i = 0;i < 3;i++){
for(j = 0;j < 3;j++){
printf("%6.4f ",a_matrix[i][j]);
}
printf("%6.4f\n",b_matrix[i]);
}
printf("\n");
return 0;
}

となります。
これで前進消去は完成です。
PRINTは行列を表示するためのサブルーチンです。

後退代入も同じような手段なのでここまで書ければ簡単だと思います。
それとループの打ち切り数3は変更がきくように変数に書き換えておくと便利かと思います。
同じく行列も50x50くらいで作っておくと、項の数が多くなっても融通がききます。

次回は後退代入とピボット(の予定)です。

おつさまですた。

2011年5月30日月曜日

課題・近似式


最近学校でもプログラミングをやり始めたのでそれについても触れてみようかなぁ、と。
前年度でもちょっとは触ってるんですが実は去年の方が難しかったり。

今回は5回目(?)だったかな、で近似式。
10*x^c(cは定数)の近似で、積分と台形公式とシンプソン公式によるものです。

一番下にリストがあるので対照するとわかりやすいかも。


数学科ではないので実は渡された公式を見てプログラムに書き換えるだけなんですけどね。
普通に積分すると

10*x^(c-1)/(c+1)

になります。これが理論値。

こんな風に不定積分できないときのために近似を使うわけです。
今回はたぶん理論値とどのくらい近似がとれているかを測るために積分可能な関数なんでしょう。

台形公式だと

h*{(y0+yn)/2+Σ(i =1 to n-1)y(i)

となり、シンプソン公式だと

h/3*{(y0+yn)+4Σ(i=1 to n/2)y(2i-1)+2Σ(i=1 to n/2-1)y(2i)}

となります。

変数の指定は以下のとおり。
始点a=0
終点b=1
分割数n=10
刻み幅h=(b-a)/n=0.1
定数c=適当な数値


これをプログラム化していくわけですけど、なぜかみんな結構躓いてたなぁ。
まず今回は理論値が出せるのでこれを利用しない手はないです。
以下簡単な手順。


1.数値目標(答え)を求める。

目標が解ってるって結構安心なんです。
答えが与えられてないときは簡単な数値で計算してみるといいかも。
1とか2とか10とか。


2.プログラム・フローを考える。

今回は式があるのでほとんど何も考えてませんね。
Σがあるからwhileよりはforかなーくらいで。

あとは計算する箇所を分けましょう。
たとえば今回ではΣがあるのでここは別計算だなぁーとか。


3.まずは式を書いてみる。

変数宣言とかどうでもいいのでまずは一番重要な式を書いてみる。
台形公式では

answer = h/2*((y0+yn)/2+SUM);


って感じですかね。
Σがあるのでこれは四則演算にないので適当な名前に置くこととします。
まだこの時点では変数とも関数とも決めていません。


4.足りない変数を宣言。

まず、a,b,c,h,nは指定があるのでとりあえず変数宣言します。
型は計算結果を入れる場合はdouble、
自分で数値を入力するだけならそれに対応する型にします。

たとえば
c=a*b
ならcはどのような値になるかわからないのでとりあえずdouble、
aとbは整数しか入れないならint、それ以外ならfloatとかdoubleとか。

今回はa,b,hはdoubleでそれ以外はintでいいんじゃないんでしょうか。
(別に全部doubleでもいい)

課題ではSUMを関数化したので変数宣言はしていませんが、
今回はいったん計算した数値をSUMにいれてから使うようにするので
SUMもdouble宣言しちゃいましょう。


5.定数を入れてみる。

入れられる定数を入れてみます。
a,b,c,h,nが決まっているので入れていきます。

入力数値という指定になっていますが、
一回ずつ打つのは面倒なので定数として宣言しておきます。
ここでは

int a=10,b=3;


などと入れるよりは、

int a,b;
a=10;
b=3;


のようにしておいた方が便利だと思います。
あとで定数宣言している部分をまとめて消す、またはコメントアウトできるので。


6.足りない部分を考える。

ここが一番のミソになりますね。Σの部分をどう作るのか。
プログラムと聞いて構えがちですけど、要は数学の考え方でいいんですよね。


台形公式の場合ではΣ(i=1 to n-1)y(i)部分になります。
これはy(i)を1からn-1まで足す、という式ですのでfor文でどうにかなりそうです。

example:y(1)+y(2)+y(3)+……+y(n-1)


ここでyというのはもともとの関数、つまり10*x^cです。
xとは今回、刻みが変化する場所です。上にあるように0から0.1ずつ1まで動きます。

y(1)というのは2個目のyということです。(y(0)がスタートなので)

そして始点が0、終点が1、分割数が10つまり刻み幅が0.1となっているので、
y(0)は

10*(0)^c


となります。そしてy(1)はそこからxが0.1だけ動くので

10*(0.1)^c


同じようにy(2)は

10*(0.2)^c


となります。
ここまでくるとどうにかfor文で書けそうです。


7.次に大きい部分を考える。

先ほど、SUMがy(1)~y(n-1)までの和だったのでまずはfor文で書いてみます。
今回も必要な部分の宣言は後です。

for(i = 1;i <= n-1;i++){
        SUM = SUM + y[i];
}


これでSUMにyのi番目を足しこむことが出来ました。
でもこのままではyは宣言されていないしyには何も入っていません。

ここで4番と同じように、y[]を宣言します。
今までy0やynのように書いてきたyを配列で管理します。

yの配列の大きさを決めなきゃいけないんですけど、
y[i]はnまで動くのでそれより大きな数値にします。

ただ、nを変更するときにわざわざ配列の大きさを変えるのも面倒なので
y[50]とかy[100]とかでもいいと思います。

このSUMは一番上のanswerの計算よりも
先に終わっていなければならないのでそれよりも前(上)に出しておきます。


8.その次に大きな部分を考える。

次に、最終としてy[]の中身を作っていきます。
基本的に大きな枠組みを作った後に必要なものを増やしていくスタンスです。

ここでy[]の中身というのは

10*x^c


でした。

y[0]はこれのxに始点(a=0)を入れて、

10*0^c


最後の項であるy[n]には終点(b=1)での値が入り、

10*1^c


となります。

始点(a=0)から終点(b=1)までは(n=10)分割され、
ひとつの項ごとのxの変化は(h=0.1)となります。

つまりxの値は0から0.1刻みで増えていき、最終的には1まで増えます。
並べてみるとこんな感じ。

第0項  0
第1項  0.1
第2項  0.2
第3項  0.3
第4項  0.4
第5項  0.5
第6項  0.6
第7項  0.7
第8項  0.8
第9項  0.9
第10項  1.0

y[]項の変化だけをfor文で書くと、
for(i = a;i <= n;i ++){
/*処理*/
}

となります。
xの変化は0.1刻みなので、

x = x + 0.1;

をfor内に入れます。

今回は項とxの変化量が比例しているので、
上記の処理は計算式内に

i*0.1

と記すことでも解決できます。

ここでさっきのy[]に数値を入れていくので、

for(i = 0;i <= n;i ++){
        y[i] = 10*pow(x,c);
        x = x + 0.1;
}

または、

for(i = 0;i <= n;i ++){
        y[i] = 10*pow(i*0.1,c);
}

となります。pow()はべき乗の関数で、pow(x,c)ではxのc乗という意味になります。
pow()関数を使う場合には<math.h>の#includeが必要となるので忘れずに書いておきます。

このy[i]の計算はSUMで和を出すより前に解っていないといけない値なので、
その計算よりは前(上)に出します。


9.実行してみる

今までの計算をリストにしてみると、

#include<stdio.h>
#include<math.h>

int main(void){
        int i,n;
        double a,b,c,h,/*x,*/SUM,answer;
        double y[50];

        a = 0;
        b = 1;
        n = 10;
        h = (b - a)/n;
        c = 1;
        /* x = 0 */;
        SUM = 0;
        answer = 0;

        for(i = 0;i  <= n;i++){
                y[i] = 10*pow(i*0.1/* x */,c);
                /* x = x + 0.1; */
        };

        for(i = 1;i <= n-1;i++){
                SUM = SUM + y[i];
        }

        answer = h*((y[0]+y[n])/2+SUM);

        printf("%f\n",answer);
}

のようになりました。
定数cは簡単のために1としています。
積分で計算してもわかるように、答えは5となっています。

コメントアウトされている部分はxの使用についてで、こんな風にもかけるよーって感じです。

10.デバッグなどの修正。

ここまででいろんなミスが発生しました。
たとえば、iの範囲がnまでになっていたり、hに1/2がかかっていたりと様々です。

そんな時にはどこがおかしいかを確かめるデバッグが必要になりますけど、
大体は、

・1か所目がすでに間違っている
・2か所目以降のループが間違っている
・使用している変数の方がおかしい

などが多い気がします。
そんな時には気になる変数をプリント(printf)してみて、
たとえばiが0から始まっていないだとか、
y[i]に思ったような数値が入っていないだとかが見つけられます。

そんなこんなでおかしいところを順次直していけば、正しい解答に辿りつけると思います。


というわけで今回はここまでにして、以下、課題提出時の関数処理でのプログラムリスト。

/*後日載せます*/


2011年5月14日土曜日

blogger不具合

今朝ニュースで見ましたが、bloggerに不具合が起こってた模様ですね。
昨日あたりに軽く見に来ようと思ったらサービスが停止中だったので……。

どうやら近日中に投稿された記事が一時的に見れないようになっているようです。
データは残っているらしいので近いうちに復旧するんだろうなぁ。

まあどっちにしろ最近投稿していないのであんまり関係ありませんが(笑)

2011年4月17日日曜日

アンプ

前回からの話は割愛し、アンプを実装してみました。

写真をミスって消してしまって撮り直すのが面倒なので今回はなしということに(ぇ


回路図はこんな感じになりました。



なんとなく解りづらくなってしまいましたが、
AC-INにはイヤフォン端子からのプラスが刺さります。
グランド(マイナス)端子はもちろんグランド(電位のマイナス)に。

イヤフォンからは2本の線が出ているのが多いと思いますが(耳につける部分が2つあるのはそう)、
マイナス端子はどちらでもなく、周りについてる銀色の「網」みたいなのです。
2本の線は両方プラス端子なので、その2つをアンプにつなげてもたぶん変な音がします。


あんまり当初との差異はないですね。
右上の5kΩが1kΩに変化しているくらいでしょうか。

図面では修正していますが右側の0.1uFのコンデンサは最初は100uFの予定でしたけど、
100uFを入れてしまうとどうやらクリップしてしまうようなので結構小さくしました。

クリップというのは波形が大きすぎて(バイアス電流があっていなくて)、
上下がトランジスタの出力できる範囲から外れてしまっている現象です。


それとスピーカに直列になっているコンデンサも最初は10uFの予定でしたが、
10uFを持っていないので100uFにしました。
こっちは0.1uF(小さくする)だと若干不具合が起こったので大きい方に差し替えました。

どちらも正直、10uFがあればちょうどよかったんですけど、
持っていないのでしょうがない、って感じですかね。

まあ製品でもないしただの実験なので関係ない関係ない。動けばいいんです(笑


実験する場合にそこそこ重要だと思うのが、自分が持っている部品に合わせるということ。
ほんとは33kΩだったりのE系列とやらが適しているようなのですが、
自分は100、1k、10k、100kしか持っていないので、それで簡単に作れる数値に合わせました。

50kは100kを2つ並列、あとは単体で作れますね。
コンデンサは直列で抵抗の並列と同じ計算(和分の積)になるんですけど、
まあそこまで厳密な静電容量はいらないのでそのままで。


そしてこれが実装した波形のシミュレーションです。




下が入力、上が出力です。
クリップもなくいい感じです。
実際に聞いてみても結構クリアな音だと思いました。

ただトランジスタが2石なのと、1次側の出力をそのまま2次側の入力に持っていってるので
もう少し上手いこと増幅することは可能だと思います。
(2回もバイアスの計算をするのが面倒だったからとかではない)


今回は電池以外は手持ちだったので、電池の価格=製作費になりました。
この電池もまだまだ使えるのでパーツがひとつ増えたって感じですね。


アンプとは無関係ですけど実はいまさらマルチバイブレータが学校で出てきたので、
これで何かできないかなーとか考えてます。
せっかくだしパルス速度上げて音でも出してみようかな?


全くアナログ回路を知らないままデジタルを触り始めたので
まだまだやることがたくさんありそうです。

もともと若干ソフト寄りだからなぁー。
メカトロニクス技術者に向けてアナログ、デジタル、メカニクスは習得しておきたい。

なんというか抱負でした。以上。

2011年4月5日火曜日

LTspice(フリーソフト)とアンプ

私の部屋(というか家)にはオーディオというものが一切なくてですね、
もちろんスピーカーの類もないわけです。

音楽聴くときはだいたいノートPCのスピーカーとかイヤフォンとか。

そんなときにふと、PCのイヤフォンジャックから手持ちの0.5Wスピーカにつなげるのではないか、
とかいうわけのわからない発想が出てきましてイヤフォンのケーブルを切ってテスタで電圧とかを測ってみたんですけど
まったくもって針が振れないという結果に終わりました。
いや、10mAのレンジでやや振れるかなー程度には観測できました。

もちろんスピーカにつなげても音など鳴るはずもなく、ならトランジスタで増幅を~(アンプ自作)と思ったものの
現在、ブレッドボードは使用中…。
そして一回ずつ回路を組み替えて測定するのは骨が折れる。
入力波形も微弱なためミスが発見し難い。

そんなときにアンプ関連のサイトでLTspiceとかいうソフトが紹介されていたわけです。
一番上の箱の「ダウンロード!LTspiceIV」を押して、
「No thanks...」とかいう下の方を押せばDL完了です。


LTspiceは回路シミュレータ(シュミレータ、ではない)で、
回路をコンピュータ上で実験してくれるソフトです。

物理系ならphunとかBlenderとかのフリーソフトがあるんですけど、
電気はなかなか見つかりませんで^^;
(といっても探す気もなかった)

あと機械系ならAutodeskかどっかが出してたなぁ。これはもちろん有料(数百万のレンジだったと思う)。
ちなみにそこに使う3DcadもAutodeskが出してるけど有料。


それでまあ電気CADもAutodeskが出していたような気がするので大体有料か、
そうでなければ機能制限もしくはロークォリティな感じかと思っていましたが、まさかのミドルレンジ。

いや、実際そうなのかは知らないけど(笑
部品点数の制限がありません。

そんな感じで波形やら電圧やら電流やら消費電力やらを解析(シミュレーション)できるソフトを手に入れたってわけです。

余談だけど(我が)龍谷大学ではPspiceというソフトらしいです。これもフリー(まさかのフリー)


見ているうちにどっかのサイト(http://gomisai.blog75.fc2.com/blog-entry-448.html)が
PspiceとLTspiceの比較をしていたので見た結果、LTspiceに。

(前置きここまで)


試しにここ(http://www005.upp.so-net.ne.jp/guitarder/other/o-07-tr-01.html)の
一石トランジスタ回路をシミュレートしてみた結果、素晴らしい感じに。




中心付近の波形が入力(スピーカー端子から)で、一番振幅の大きいのが出力電圧、
あいだにある青いのが出力電流(負荷は適当)です。


なぜかへんに嵌ってしまってインダクタとコンデンサで適当な波形を作ったりして遊んでいます。
部品数の制限がないのでバーサライタのシミュレーションもできます。
もちろん、マイコン(AVRとか)は出来ませんけど。
解放時の出力電流や、消費電力などがシミュレートできるのでお薦め。


そんな感じで支離滅裂ながらお遊び日記。

使用方法はさっきのねがてぃぶろぐさんにあります。以上。

LEDバーサライタmarkII・スケッチ


前回の最後の方で行ってたスケッチです。
見ての通り一部の文字しか対応していません(笑

これでおおよそ1500byteくらいです。
Attiny2313のフラッシュメモリが2000byteなので頑張れば移植できそうです。
ただポート番号が変わるのと、PCINTがBピンの並びにしかないので
使うならばINT割り込みになるんじゃないでしょうか。
(INT0はPD2、INT1はPD3)

LEDが9列なので少し見難い感はありますけど当初よりはスマートになったんじゃないかな?
以下。


#include<avr/io.h>
#include<avr/pgmspace.h>
#include<avr/interrupt.h>
#include<util/delay.h>


const prog_uint8_t a_line[2][6] = {{0b00000000,0b00000001,0b00000001,0b00000001,0b00000001,0b00000000},
{0b11111111,0b00001000,0b00001000,0b00001000,0b00001000,0b11111111}};
const prog_uint8_t b_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000000},
{0b11111111,0b00010001,0b00010001,0b00010001,0b00010001,0b11101110}};
const prog_uint8_t d_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000000,0b00000000},
{0b11111111,0b00000001,0b00000001,0b00000001,0b10000010,0b01111100}};
const prog_uint8_t e_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000001},
{0b11111111,0b00010001,0b00010001,0b00010001,0b00010001,0b00000001}};
const prog_uint8_t h_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11111111,0b00010000,0b00010000,0b00010000,0b00010000,0b11111111}};
const prog_uint8_t i_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000001},
{0b00000001,0b00000001,0b11111111,0b00000001,0b00000001,0b00000001}};
const prog_uint8_t l_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000},
{0b11111111,0b00000001,0b00000001,0b00000001,0b00000001,0b00000001}};
const prog_uint8_t m_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11111111,0b11000000,0b01110000,0b01110000,0b11000000,0b11111111}};
const prog_uint8_t o_line[2][6] = {{0b00000000,0b00000001,0b00000001,0b00000001,0b00000001,0b00000000},
{0b11111110,0b00000001,0b00000001,0b00000001,0b00000001,0b11111110}};
const prog_uint8_t p_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000000},
{0b11111111,0b00010000,0b00010000,0b00010000,0b00010000,0b11100000}};
const prog_uint8_t r_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000000},
{0b11111111,0b00010000,0b00010000,0b00011000,0b00010100,0b11100011}};
const prog_uint8_t t_line[2][6] = {{0b00000001,0b00000001,0b00000001,0b00000001,0b00000001,0b00000001},
{0b00000000,0b00000000,0b11111111,0b00000000,0b00000000,0b00000000}};
const prog_uint8_t u_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11111110,0b00000001,0b00000001,0b00000001,0b00000001,0b11111110}};
const prog_uint8_t v_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11111000,0b00000110,0b00000001,0b00000001,0b00000110,0b11111000}};
const prog_uint8_t w_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11111100,0b00000111,0b00111100,0b00111100,0b00000111,0b11111100}};
const prog_uint8_t y_line[2][6] = {{0b00000001,0b00000000,0b00000000,0b00000000,0b00000000,0b00000001},
{0b11000000,0b00100000,0b00011111,0b00010000,0b00100000,0b11000000}};

void space(){
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(30);
}

int main(void){
cli();
DDRB = 0b11111111;
DDRD = 0b11111111;
DDRC = 0b00000000;
PORTC = 0b11111111;
PCICR = (1<<PCIE1);
PCMSK1 = (1<<PCINT8);
int i;
sei();
while(1){
for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&h_line[0][i]);
PORTD = pgm_read_byte(&h_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&a_line[0][i]);
PORTD = pgm_read_byte(&a_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&p_line[0][i]);
PORTD = pgm_read_byte(&p_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&p_line[0][i]);
PORTD = pgm_read_byte(&p_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&y_line[0][i]);
PORTD = pgm_read_byte(&y_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


space();


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&b_line[0][i]);
PORTD = pgm_read_byte(&b_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&i_line[0][i]);
PORTD = pgm_read_byte(&i_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&r_line[0][i]);
PORTD = pgm_read_byte(&r_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&t_line[0][i]);
PORTD = pgm_read_byte(&t_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&h_line[0][i]);
PORTD = pgm_read_byte(&h_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&d_line[0][i]);
PORTD = pgm_read_byte(&d_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&a_line[0][i]);
PORTD = pgm_read_byte(&a_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 6;i++){
PORTB = pgm_read_byte(&y_line[0][i]);
PORTD = pgm_read_byte(&y_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 0;i < 2;i++){
space();
}
}
}

ISR(PCINT1_vect){
if(bit_is_clear(PINC,PC0)){
_delay_ms(80);

int i;

for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&d_line[0][i]);
PORTD = pgm_read_byte(&d_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&l_line[0][i]);
PORTD = pgm_read_byte(&l_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&r_line[0][i]);
PORTD = pgm_read_byte(&r_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&o_line[0][i]);
PORTD = pgm_read_byte(&o_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&w_line[0][i]);
PORTD = pgm_read_byte(&w_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


space();


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&o_line[0][i]);
PORTD = pgm_read_byte(&o_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&l_line[0][i]);
PORTD = pgm_read_byte(&l_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&l_line[0][i]);
PORTD = pgm_read_byte(&l_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&e_line[0][i]);
PORTD = pgm_read_byte(&e_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);


for(i = 5;i >= 0;i--){
PORTB = pgm_read_byte(&h_line[0][i]);
PORTD = pgm_read_byte(&h_line[1][i]);
_delay_ms(3);
}
PORTB = 0b00000000;
PORTD = 0b00000000;
_delay_ms(3);
space();
}else{
}
}

2011年4月1日金曜日

LEDバーサライタmarkII

そこそこ完成に近いと思います。

ブレッドボードの大きさの問題でLEDは初期と同じく9個ですけど
反対向きに振ったときの文字の表示もできるようになりました。

前回は割り込みを外部割り込みINT0~1を使う予定でしたが
あまりにも文字部分を書き換える手間が発生してしまうので、
最終的にはPCINTを使うことに。

INTもPCINTもたぶん大して変わりはない(INTはまったく使用せずなので)と思います。
INTがレジスタで割り込みの発生条件を決めるのに対して、
PCINTはプログラム内で発生条件を決める、という解釈でいいんでしょうか?

まあPCINTがなんでもかんでも拾うからそれをifとかで選別しろってことですね。たぶん(ぇ


というわけで回路図。


前より少しだけ横長になりました(笑

いつものことですけどGNDとかVCCとか書かないのはだれが見てもわかるように。
今はちょっと読めるようになったけど昔は「GNDってなんだ?」状態でしたので。



その他、プログラムの方は
配列を作るとなぜかEEPROMに書き込まれる仕様
となっていたので(AVR特有らしい)、それをフラッシュメモリ(プログラムと一緒のところ)に
入れるのに四苦八苦。

別にEEPROMでもよかったんですけどこれには深いわけが…。
ということもなく(実際にはあったんですけど)。

単純に電源の質が悪かっただけなのに行き着いた結果がこれです(笑
ダイジェストで説明。

LEDの点滅速度が一定じゃない(9個バラバラなので振っても文字にならない)

もしかして割り込みが悪いんじゃないか

違ったので、もしかしたら配列がEEPROMに入っているのが悪いんじゃ(略

ここでEEPROMからフラッシュに移動させる(しかし改善されず)

どうやらライタが接続されている間はちゃんと動作するのに、
ライタを外すとダメなようだ

ライタの中で何か接続がされていてそこを繋げばいいんじゃ

ISPケーブルを一本ずつ抜いていってどれを抜くとアウトかを調べる

VCCまたはGNDでした。ということはつまり。


電源(電池)の接触が悪く、単にノイズ(というよりはもっと大きな電圧変化)の所為でした。
もともとブレッドボードは場所により接触悪いので、挿す場所を変え、
電源用の電解コンデンサをぶち込む事で解決でした。



なんという徒労…orz

上の「配列を作ると~」は全く関係なかったわけですね。
ライタを接続していれば大丈夫だった理由は、
たぶんライタ内にコンデンサでも入ってるってことなんでしょうね。
(半透明なのに見えない…( ̄⊿ ̄)ぐぬぬ…


まあ結果的に書き換え回数が10,000回のEEPROMを使わずに済んだのは良かったのかも。
今後はこれで嵌ることがないようにしないと…。数時間これと格闘してたからなぁ(遠い目

回路図のRESET10kΩもたぶんいらないです。

これを完成させるにはまずICソケットを買わないとなぁ。
物流動いてるんだろーか。
プログラムスケッチは別で貼ろう。

2011年3月23日水曜日

LEDバーサライタ続き

前回の続きです。

予想だにしない問題というのは、
「文字を選択できるようにするなら、どの文字を選択しているか解らなければならない」
ということ。

当たり前っちゃ当たり前ですね(笑)

フルLEDボードなら見ながら変更できますけど、バーサライタ(英語ではpersistence of visionと言うらしい)は
振らないと文字を表現できないので、どの文字を選択しているかは振ってみるまで解りません。

さすがにこれはダメだろ…。ということで文字選択は出来ないようにするかも。
その場合、簡単に書き換えが出きるようにICソケットか何かで着脱を簡単にしておこうかと思います。

文字選択を実装するならLCDとかで表示用のシステムを作らなければいけないし…。
ちょっと技術的にきついかなー。まだ2つ以上のマイコン同士の通信は出来ないので。
ポートが足りない…(´д`)

というわけでまずは概観から。


まだ割り込み関連を理解していないため、表示素子だけになっております。
前回バーサライタのLED増やしただけバージョンですね。

ここからたぶん4ピン(PD2)を使用しない方向で修正すると思うので
主にPORTCとPORTBで構成されることになるかと思います。
(割り込み処理がPD2を使う関係でPORTDが制限される)


割り込み処理とは、プログラムの実行中に割り込みの条件が起こることによって
一旦、そのプログラムを中断して割り込みプログラムを優先的に実行するシステムです。

AVRなどのマイコンは割り込み処理が定義されていて、
それにしたがって記述するだけで割り込み処理が実現できます。
(といってもこれがなかなか資料が無くて…^^;)

この割り込み処理でボタンを押している間はLEDの表示順序を反対にする
(双方向で表示が出来る)ようになり(し)ます。


まだプログラムも実験段階でとりあえず関数ポインタが使えるようになったくらいなので
実装は4月上旬かなー(遅い)。

それにしてもPD2を割り込みに使うとなるとプログラムの書き換えが面倒そうだな…。

そんな感じで再評価版も準備を始めています。
当たらしい物も何か作りたい…。でもアイデアが…orz。

だれかメンバー募集(ぇ
いや結構マジで

2011年3月20日日曜日

LEDバーサライタ再評価

前回のバーサライタでは、

・一方にしか文字が表示できない
・文字をあらかじめ決めておかなければならない
・文字が小さいので遠くから読みづらい
(バーサライタは遠くからの方がよく見えると感じたので)


などの問題があると感じました。
今回はそれをできるだけ改善する方向でいきたいと思っています。

まずは表示方法。
前回はLEDを縦に1列9個でしたが、今回は18個と倍に増やすつもりです。

5mmLEDを使っているので9個だと感覚1mmでも、
(5+1)*9=54mm
なのでたいした大きさではありませんでしたが、
倍に増やすことで表示サイズを108mmまで大きくすることができます。

108mmというとかなり遠くからも見えると思うので、大きいだけで暗くならないように
LEDも赤色に変えることにします。
最近手に入ったから使ってみようと思っただけなのは内緒。


大きくなったからと言って文字を書き換えるのも面倒なので出力はひとつでいきます。
つまり従来と同じ9ピンで18個を点灯させる予定です。

ここで問題になってくるのがマイコンからの出力可能電流で、
AVRの情報みてないですけどPICが±20mAらしいので同等かなーと。

今回LEDを10mA程度で使おうと思っているので、ちょっとオーバー気味かなと思い、
トランジスタを使うことにします。みんな大好き2SC1815!
まだ評価してないですけど、どうせスイッチング動作なので
あんまり気にしないでいいかなーと。(甘い?)


その次にプログラムのスケッチ(と言うと用語的には間違っているかも)。
いうなればアルゴリズムテスト用プログラムです。

今回は動的に表示するのが目標なのでそこを重点的に。

どうやら「関数ポインタ」とかいうので処理できるようです。
関数ポインタは関数に対するポインタでありアドレスを指し示し~なんて言っても
解る人には解るし、解らない人には解りません。

まあ今までのだと関数名(aとかbとか)を直接記入しないといけない
(=書き込み機で書き換えなければいけない)でしたが、関数ポインタを使うことで
関数をポインタの中に格納できます。(=プログラム中で選択できる)


たとえばA_writeという関数があったとして、
これを使用するには
A_write();
と記入する他ありませんでしたが、ポインタに入れると、
int (*pointer_name)();
pointer_name = A_write;
となり、呼び出しは
(*pointer_name)();
となります。カッコで囲んで先頭にアスタリスクです。

これだけだとあまりメリットは感じられませんが、真の使い道は配列にしてからだと思います。

同じく、関数A_writeとB_writeがあったとして、これを呼び出すならば、
A_write();
B_write();
となります。ちょっとC言語をさわったことがある人なら想像つくと思いますが、
これを例えばB_write→A_writeとしたいならば、一度プログラムを書き換えるしかありません。
実行中に選択するならばifとかforとかを使ってループさせれば実現出来ますが、
さらにCとかDとか増えてくるとifが増えてきたりともう大変なことになってきます。

上記を関数ポインタの配列として使うと、
int (*pointer_name[2])();
pointer_name[0] = A_write;
pointer_name[1] = B_write;
となります。呼び出しはもちろん、
(*pointer_name[0])();
(*pointer_name[1])();
となります。

こうするとちょっとメリットが見えてきました。
pointer_nameの配列番号を自由にいじることでfor 0 to 1やfor 1 to 0で
上からだったり下からだったり自由に選択出来ます。

こんな感じで今回はバーサライタに文字の選択を追加しようと思います。
しかしここで予想だにしない問題が!!!
続きます。

2011年3月19日土曜日

東北地方太平洋沖地震

前回の記事を投稿した当日、2011年3月11日金曜日にご存知のとおり地震が発生しました。
幸運なことに滋賀県在住のため被害などはありませんでしたが、
地震による災害は多くの生命を奪っていきました。

この件について多くのデマやチェーンメールが流され、
無為に不安を煽るような事がなされたことは遺憾です。

インターネットはもちろん民放や新聞でさえも多くの誤った情報が流されていると感じます。
どうか誤った情報に流されること無く、情報をよく吟味して、
正しい情報であろうと無作為に拡散することなく、口頭で伝えるなどの手段を取ってほしいと思います。

口頭で伝えることによって、現在の情報の真偽を疑うことができます。

地震により被害を受けていない人々が情報の撹乱により被害を大きくすることを人災と呼びます。
実害を受けた東北地方の方々のためにも落ち着いた行動をし、
現在、支援作業にあたっている方が全力で作業出来るように配慮してほしいと願います。

2011年3月11日金曜日

bloggerテンプレート

やっぱりhtml/css/javascriptとかが少しわかってくると
次にやりたいのはテンプレートの作成ですよね。

でもbloggerの新テンプレートだと環境変数等がフクザツで解りにくいので、
旧テンプでテストしてみました。

テスト用のブログ

元のテンプはRoundersです。作成者はblogger(公式)。


こういうブログ系列は扱ったことがないので変数がまったくあぼんでした。
あと、普段はちょっとcssとか齧るくらいなのでstyleの指定って
divでしかほとんどしないんですよね。
でもこのような場合は主にclass分け、id指定が絡んでくるのでかなりの難関でした。
テンプ作ってる人って結構すごいんだと実感(笑)


もとのテンプと比較すればわかるように
・全体の幅の拡大
・タイトルの背景色と文字色の変更
・好みでなかったちょっとしたデザイン(ドット線とか)の変更
・全体のレイアウトの調整
に手を加えました。


一番の難題はコメントフォームの属性が用意されていなくて、
自分で新たに作成しなくてはならなかったこと。

もともとある属性をいじるだけなら簡単だったんですけど、
属性の追加となるとちゃんとわかっていないと出来ないんですよね…。
マークアップ言語舐めてました。プログラミング言語とは違った難しさ。
オブジェクト指向(?)な雰囲気あるよね。たぶん。


横枠が不振な位置にあるのは仕様です。
あの部分は画像なんだけど特に新しいの作るわけでもなく横幅を増やしたので
画像が足りてないんですね。
これは全部のレイアウトが決まってからのお話。

あとはガジェットの追加とか、不必要な部分の排除をすればプロトタイプは完成かな。
それから「同日に投稿された記事が繋がらないように」なれば完璧なんだけどなぁ。

なかなか上手くいきません。
以上。

2011年3月9日水曜日

javascript test2


ボタンを押すことによってリンク先が変化する。

javascript test



javascriptがbloggerで使えるかどうかのテスト。
CSSのdisplay:blockやjavascriptのgetElementByIdも
問題なく使えるようです。

2011年3月7日月曜日

module9


Option Explicit

Sub kuroban()
    Range("K2").Select
    ActiveCell.FormulaR1C1 = "黒"
    Range("K3").Select
    ActiveCell.FormulaR1C1 = "の"
    Range("K4").Select
    ActiveCell.FormulaR1C1 = "番"
    Range("K5").Select
    ActiveCell.FormulaR1C1 = "で"
    Range("K6").Select
    ActiveCell.FormulaR1C1 = "す"
End Sub
Sub siroban()
Range("K2").Select
    ActiveCell.FormulaR1C1 = "白"
    Range("K3").Select
    ActiveCell.FormulaR1C1 = "の"
    Range("K4").Select
    ActiveCell.FormulaR1C1 = "番"
    Range("K5").Select
    ActiveCell.FormulaR1C1 = "で"
    Range("K6").Select
    ActiveCell.FormulaR1C1 = "す"
End Sub

Sub okiba(okiba As Integer)
Dim n As Integer, m As Integer
okiba = 0
For n = 2 To 9
For m = 2 To 9
If Sheet1.Cells(n, m).Interior.Color = RGB(0, 255, 0) Then
okiba = okiba + 1
End If
Next m
Next n
End Sub

module6


Option Explicit

Sub Macro()
'
' Macro Macro
'

'
    Range("A1:J10").Select
    With Selection
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .WrapText = False
        .Orientation = 0
        .AddIndent = False
        .IndentLevel = 0
        .ShrinkToFit = False
        .ReadingOrder = xlContext
        .MergeCells = False
    End With
    Range("B2").Select
    ActiveCell.FormulaR1C1 = "1,1"
    Range("C2").Select
    ActiveCell.FormulaR1C1 = "1,2"
    Range("D2").Select
    ActiveCell.FormulaR1C1 = "1,3"
    Range("E2").Select
    ActiveCell.FormulaR1C1 = "1,4"
    Range("F2").Select
    ActiveCell.FormulaR1C1 = "1,5"
    Range("G2").Select
    ActiveCell.FormulaR1C1 = "1,6"
    Range("H2").Select
    ActiveCell.FormulaR1C1 = "1,7"
    Range("I2").Select
    ActiveCell.FormulaR1C1 = "1,8"
    Range("B3").Select
    ActiveCell.FormulaR1C1 = "2,1"
    Range("C3").Select
    ActiveCell.FormulaR1C1 = "2,2"
    Range("D3").Select
    ActiveCell.FormulaR1C1 = "2,3"
    Range("E3").Select
    ActiveCell.FormulaR1C1 = "2,4"
    Range("F3").Select
    ActiveCell.FormulaR1C1 = "2,5"
    Range("G3").Select
    ActiveCell.FormulaR1C1 = "2,6"
    Range("H3").Select
    ActiveCell.FormulaR1C1 = "2,7"
    Range("I3").Select
    ActiveCell.FormulaR1C1 = "2,8"
    Range("B4").Select
    ActiveCell.FormulaR1C1 = "3,1"
    Range("C4").Select
    ActiveCell.FormulaR1C1 = "3,2"
    Range("D4").Select
    ActiveCell.FormulaR1C1 = "3,3"
    Range("E4").Select
    ActiveCell.FormulaR1C1 = "3,4"
    Range("F4").Select
    ActiveCell.FormulaR1C1 = "3,5"
    Range("G4").Select
    ActiveCell.FormulaR1C1 = "3,6"
    Range("H4").Select
    ActiveCell.FormulaR1C1 = "3,7"
    Range("I4").Select
    ActiveCell.FormulaR1C1 = "3,8"
    Range("B5").Select
    ActiveCell.FormulaR1C1 = "4,1"
    Range("C5").Select
    ActiveCell.FormulaR1C1 = "4,2"
    Range("D5").Select
    ActiveCell.FormulaR1C1 = "4,3"
    Range("E5").Select
    ActiveCell.FormulaR1C1 = "4,4"
    Range("F5").Select
    ActiveCell.FormulaR1C1 = "4,5"
    Range("G5").Select
    ActiveCell.FormulaR1C1 = "4,6"
    Range("H5").Select
    ActiveCell.FormulaR1C1 = "4,7"
    Range("I5").Select
    ActiveCell.FormulaR1C1 = "4,8"
    Range("B6").Select
    ActiveCell.FormulaR1C1 = "5,1"
    Range("C6").Select
    ActiveCell.FormulaR1C1 = "5,2"
    Range("D6").Select
    ActiveCell.FormulaR1C1 = "5,3"
    Range("E6").Select
    ActiveCell.FormulaR1C1 = "5,4"
    Range("F6").Select
    ActiveCell.FormulaR1C1 = "5,5"
    Range("G6").Select
    ActiveCell.FormulaR1C1 = "5,6"
    Range("H6").Select
    ActiveCell.FormulaR1C1 = "5,7"
    Range("I6").Select
    ActiveCell.FormulaR1C1 = "5,8"
    Range("B7").Select
    ActiveCell.FormulaR1C1 = "6,1"
    Range("C7").Select
    ActiveCell.FormulaR1C1 = "6,2"
    Range("D7").Select
    ActiveCell.FormulaR1C1 = "6,3"
    Range("E7").Select
    ActiveCell.FormulaR1C1 = "6,4"
    Range("F7").Select
    ActiveCell.FormulaR1C1 = "6,5"
    Range("G7").Select
    ActiveCell.FormulaR1C1 = "6,6"
    Range("H7").Select
    ActiveCell.FormulaR1C1 = "6,7"
    Range("I7").Select
    ActiveCell.FormulaR1C1 = "6,8"
    Range("B8").Select
    ActiveCell.FormulaR1C1 = "7,1"
    Range("C8").Select
    ActiveCell.FormulaR1C1 = "7,2"
    Range("D8").Select
    ActiveCell.FormulaR1C1 = "7,3"
    Range("E8").Select
    ActiveCell.FormulaR1C1 = "7,4"
    Range("F8").Select
    ActiveCell.FormulaR1C1 = "7,5"
    Range("G8").Select
    ActiveCell.FormulaR1C1 = "7,6"
    Range("H8").Select
    ActiveCell.FormulaR1C1 = "7,7"
    Range("I8").Select
    ActiveCell.FormulaR1C1 = "7,8"
    Range("B9").Select
    ActiveCell.FormulaR1C1 = "8,1"
    Range("C9").Select
    ActiveCell.FormulaR1C1 = "8,2"
    Range("D9").Select
    ActiveCell.FormulaR1C1 = "8,3"
    Range("E9").Select
    ActiveCell.FormulaR1C1 = "8,4"
    Range("F9").Select
    ActiveCell.FormulaR1C1 = "8,5"
    Range("G9").Select
    ActiveCell.FormulaR1C1 = "8,6"
    Range("H9").Select
    ActiveCell.FormulaR1C1 = "8,7"
    Range("I9").Select
    ActiveCell.FormulaR1C1 = "8,8"
    Range("B2:I9").Select
    With Selection.Font
        .Color = -16776961
        .TintAndShade = 0
    End With
End Sub

module5


Option Explicit

Sub white_hidariue(x As Integer, y As Integer, handan As Integer)
Dim xx As Integer, yy As Integer, cnt As Integer, n As Integer
xx = x
yy = y
With Sheet1
cnt = 0
xx = xx - 1
yy = yy - 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
cnt = cnt + 1
mark:
xx = xx - 1
yy = yy - 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
    cnt = cnt + 1
    GoTo mark
ElseIf .Cells(xx, yy).Interior.Color = RGB(255, 255, 255) Then
        For n = 1 To cnt
            .Cells(xx + n, yy + n).Interior.Color = RGB(255, 255, 255)
        Next n
        handan = handan + 1
    End If
End If
End With
End Sub
Sub white_ue(x As Integer, y As Integer, handan As Integer)
Dim xx As Integer, yy As Integer, cnt As Integer, n As Integer
xx = x
yy = y
With Sheet1
cnt = 0
xx = xx - 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
cnt = cnt + 1
mark:
xx = xx - 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
    cnt = cnt + 1
    GoTo mark
ElseIf .Cells(xx, yy).Interior.Color = RGB(255, 255, 255) Then
        For n = 1 To cnt
            .Cells(xx + n, yy).Interior.Color = RGB(255, 255, 255)
        Next n
        handan = handan + 1
    End If
End If
End With
End Sub

Sub white_migiue(x As Integer, y As Integer, handan As Integer)
Dim xx As Integer, yy As Integer, cnt As Integer, n As Integer
xx = x
yy = y
With Sheet1
cnt = 0
xx = xx - 1
yy = yy + 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
cnt = cnt + 1
mark:
xx = xx - 1
yy = yy + 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
    cnt = cnt + 1
    GoTo mark
ElseIf .Cells(xx, yy).Interior.Color = RGB(255, 255, 255) Then
        For n = 1 To cnt
            .Cells(xx + n, yy - n).Interior.Color = RGB(255, 255, 255)
        Next n
        handan = handan + 1
    End If
End If
End With
End Sub

Sub white_hidari(x As Integer, y As Integer, handan As Integer)
Dim xx As Integer, yy As Integer, cnt As Integer, n As Integer
xx = x
yy = y
With Sheet1
cnt = 0
xx = xx - 0
yy = yy - 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
cnt = cnt + 1
mark:
xx = xx - 0
yy = yy - 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
    cnt = cnt + 1
    GoTo mark
ElseIf .Cells(xx, yy).Interior.Color = RGB(255, 255, 255) Then
        For n = 1 To cnt
            .Cells(xx, yy + n).Interior.Color = RGB(255, 255, 255)
        Next n
        handan = handan + 1
    End If
End If
End With
End Sub

Sub white_migi(x As Integer, y As Integer, handan As Integer)
Dim xx As Integer, yy As Integer, cnt As Integer, n As Integer
xx = x
yy = y
With Sheet1
cnt = 0
xx = xx - 0
yy = yy + 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
cnt = cnt + 1
mark:
xx = xx - 0
yy = yy + 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
    cnt = cnt + 1
    GoTo mark
ElseIf .Cells(xx, yy).Interior.Color = RGB(255, 255, 255) Then
        For n = 1 To cnt
            .Cells(xx, yy - n).Interior.Color = RGB(255, 255, 255)
        Next n
        handan = handan + 1
    End If
End If
End With
End Sub

Sub white_hidarisita(x As Integer, y As Integer, handan As Integer)
Dim xx As Integer, yy As Integer, cnt As Integer, n As Integer
xx = x
yy = y
With Sheet1
cnt = 0
xx = xx + 1
yy = yy - 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
cnt = cnt + 1
mark:
xx = xx + 1
yy = yy - 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
    cnt = cnt + 1
    GoTo mark
ElseIf .Cells(xx, yy).Interior.Color = RGB(255, 255, 255) Then
        For n = 1 To cnt
            .Cells(xx - n, yy + n).Interior.Color = RGB(255, 255, 255)
        Next n
        handan = handan + 1
    End If
End If
End With
End Sub

Sub white_sita(x As Integer, y As Integer, handan As Integer)
Dim xx As Integer, yy As Integer, cnt As Integer, n As Integer
xx = x
yy = y
With Sheet1
cnt = 0
xx = xx + 1
yy = yy - 0
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
cnt = cnt + 1
mark:
xx = xx + 1
yy = yy - 0
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
    cnt = cnt + 1
    GoTo mark
ElseIf .Cells(xx, yy).Interior.Color = RGB(255, 255, 255) Then
        For n = 1 To cnt
            .Cells(xx - n, yy).Interior.Color = RGB(255, 255, 255)
        Next n
        handan = handan + 1
    End If
End If
End With
End Sub

Sub white_migisita(x As Integer, y As Integer, handan As Integer)
Dim xx As Integer, yy As Integer, cnt As Integer, n As Integer
xx = x
yy = y
With Sheet1
cnt = 0
xx = xx + 1
yy = yy + 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
cnt = cnt + 1
mark:
xx = xx + 1
yy = yy + 1
If .Cells(xx, yy).Interior.Color = RGB(0, 0, 0) Then
    cnt = cnt + 1
    GoTo mark
ElseIf .Cells(xx, yy).Interior.Color = RGB(255, 255, 255) Then
        For n = 1 To cnt
            .Cells(xx - n, yy - n).Interior.Color = RGB(255, 255, 255)
        Next n
        handan = handan + 1
    End If
End If
End With
End Sub