Fedora 10...
最近一直在折腾机器玩。打算把这经历写一篇长小说,有点像硬盘的那个。
从Ubuntu 8.10换到了Fedora 10. 里面的KDE开同样的设置,Fedora要慢两点。
switch.ch是个好东西。使rpmfusion的时候要动手编辑/etc/yum.repos.d/里面的文件,都加上一个.sixxs.org,还要把#去掉。
scim不好,应该改成iBus.
compiz千万别用。至少就目前(2008年12月17日)而言。
texlive已经有东亚包了,按以前的方法折腾是折腾不下去的。愤而直接挂texlive.iso,谁叫我菜呢。
终端下的head和tail是个好用的东西。
多弄几个桌面,可以换着玩。sweet是个小孩子玩的桌面,准备给下一代玩吧。。。。
搞Fortran就用Eclipse带Photran,但是一定要装C包。这玩意源里面有,但是依赖关系还没有加。我要报告!
以上。
Photran的用法(转载自eclipse官网)
Getting Started with Managed Make
If your system has the GNU gfortran compiler installed, try this.
- File | New | Fortran Project
- Call it whatever
- Choose the Executable (Gnu Fortran) from the project type list 注:对于Ubuntu 8.10系统已经不再提供G77支持了,因此,编译器一定要选gfortran,即GNU Fortran
- Choose GCC Toolchain from the toolchain list (you may need to uncheck the "Show project types..." check box at the bottom of the window)
- Click Next
- Click on Advanced Settings
- Expand C/C++ Build in the list on the left, and click on Settings
- Click on the Binary Parsers tab. Check the appropriate parsers for your platform. If you are using Windows, check PE Windows Parser and/or Cygwin PE Parser; if you are using Linux, check Elf Parser; if you are using Mac, check Mach-O parser.
- Click on the Error Parsers tab. Check the error parser(s) for the Fortran compiler(s) you will use.
- Click OK
- Click Finish
- Click File | New | Source File
- Call it hello.f90; click Finish
- Type the standard "Hello, World" program, and click File | Save.
program hello
print *, "Hello World"
stop
end program hello
- Open the Console view, and make sure "make" ran OK and compiled your program
- In the Fortran Projects view, expand the Binaries entry, and click on your executable (e.g., "whatever - [x86le]") 这个设计很好很强大到让人摸不着头脑,因为用M$的V$已经用惯了。。。
- Run | Run As | Run Local C/C++ Application (yeah, I know, it should say "Fortran Application", but it doesn't)
- Choose GDB Debugger (Cygwin GDB Debugger if you're under Windows)
- Check the Console view, and make sure Hello World appeared.
Getting Started with Standard Make
To get started, try this. If you're under Windows, you need to be running Cygwin, c:\cygwin\bin and c:\cygwin\usr\bin should be in your system path, and the g95 libraries need to be copied into /usr/lib (to make things easier for yourself, at least).
- File | New | Fortran Project
- Call it whatever
- Choose Makefile Project from the project type list (it has a folder icon; do not expand it)
- Choose "-- Other Toolchain --" from the toolchain list <--li>Click Next
- Click on Advanced Settings
- Expand C/C++ Build in the list on the left, and click on Settings
- Click on the Binary Parsers tab. Check the appropriate parsers for your platform. If you are using Windows, check PE Windows Parser and/or Cygwin PE Parser; if you are using Linux, check Elf Parser; if you are using Mac, check Mach-O parser.
- Click on the Error Parsers tab. Check the error parser(s) for the Fortran compiler(s) you will use.
- Click OK
- Click Finish
- File | New | File
- Call it Makefile
- Click Finish
- We assume you're familiar with how to format a Makefile. Something like this will work for now. Remember to start the g95 line with a tab, not spaces. The -g switch instructs g95 to include debugging symbols in the generated executable so that it can be debugged later.
all:
g95 -g hello.f90
clean:
- File | New | Source File
- Call it hello.f90
- Click Finish
- Type the standard "Hello, World" program.
program hello
print *, "Hello World"
stop
end program hello
- Project | Clean; then click OK
- Open the Console view, and make sure "make" ran OK and compiled your program
- In the Fortran Projects view, expand the Binaries entry, and click on your executable (e.g., "whatever - [x86le]")
- Run | Run As | Run Local C/C++ Application (yeah, I know, it should say "Fortran Application", but it doesn't)
- Choose GDB Debugger (Cygwin GDB Debugger if you're under Windows)
- Check the Console view, and make sure Hello World appeared.
ubuntu 8.10平台eclipse + photran部署成功
要点
先装cdt. 一定要和eclipse主程序的版本对上。
再装对应版本的photran(从achieve里找)。万勿追最新版,切记!特别是eclipse是从源里装的情况下。
所有的安装不要直接从压缩包里装,应该解压。解压的文件夹中应该包括两个子文件夹feature和plugins。然后,从Help - Software Updates里开,选New features to install 下一步,找到文件夹装上。
Ubuntu下关进程的办法
终端下skill <进程名>。
不行的话就 kill -9 <进程号>
注意进程号应该由ps -e 命令列出。
Ubuntu 下 Mathematica 5.2 for Linux 的透明字体解决方案 zz
说明
本文参考了鱼一尾《beryl下如何是mathematica正常显示》一文(http://acevery.blogcs.com/2007/03/berylmathematica_1.html),经实验后,稍加改动。特此致谢。
*** 引用开始 ***
发现Methematica出现严重的透明,后来一查才知道是因为visual模式选择的问题。解决方法很容易,用 mathematica -virsualchooser 启动Mathematica,然后从下往上尝试(越下面效果越高),记下第一个可以使用的模式,如我用的32。然后打开Mathematica安装目录下 SystemFiles/FrontEnd/SystemResources/X/XMathematica,修改下面几行:
*best: False
*visualClass: DirectColor <--这个是32模式的类别,要看你用的模式!
*visualID: 32
之后,Mathematica就能正常显示了。
*** 引用结束 ***
实验结果:
首先应该记得安装目录在哪里,不行就用nautilus搜,要那个大一点的目录(/usr/share下面的那个基本不是),本人找到文件的地址是/usr/local/Wolfram/Mathematica/5.2/SystemFiles/FrontEnd/SystemResources/X。
*visualID不改也能用,但是*visualClass一定要根据实际情况改。
XP与Vista双系统 tooold
在XP与Vista双系统的情况下,只有Vista“固若金汤”是不行的。XP的Admin一旦被攻陷,使用某种设置就可以破坏Vista的文件,轻而易举,不可不防焉。虽然是老话,也要有重提的必要。
zz 似曾相识么?《よく似たC言語》
http://www.geocities.jp/eyeofeconomyandhealth/homepage/hojo/mame/c.html#c
よく似たC言語
Fortranだけに限りませんが、プログラミング言語というのは、1種類覚えてしまえば他の言語にも簡単に乗り換えることができるといわれています。それは、どれも書き方が似たものであるからです。僕もFortranのほかに、C言語を学びました(本との基礎だけですけど)。最初はビビリまくりでC言語に突入しましたが、少しの違いだけ呑み込めば、後はすんなりと学習が進んでいきました。ですから、Fortranを学ぶことは、その効果はFortranだけにとどまらないということです。
沢山あるプログラミング言語の中でも、Fortranのように科学計算の中心として使われ、またFortranと似た感覚で使用することができるC言語を少しだけ紹介してみたいと思います。全体の概念さえ理解してしまえば、後は命令文の呼び方の違いぐらいなので、少しがんばってみればプログラミングの代表言語であるC言語を簡単に会得することができます(高度なものはさすがにそれ相応の努力が必要ですが)。Fortranが分かっていれば、乗り換えは簡単です。
試しにC言語でプログラムを書いてみましょう。Fortranで書いた例文が下の文です。
program main
print *,'Hello world!'
end program
そして、これがC言語で記述した場合の文です。
#include
void main(){
printf("Hello world!¥n");
return 0;
}
結構見た目が変わりましたね。でも、最初に適切なヘッダファイル(C言語に必須なのは「stdio.h」)、主プログラムも関数になること、関数の初めと終わりは中括弧、あとは命令文の名称の違いだけ理解できれば、ほとんど同じであることが分かると思います。ちなみに、「void」とあるのは、「この(main)関数は値を返し(持ち)ません」という意味で、それを実行しているのが「return 0」です。値を返すというのは、Fortranでの副プログラムの結果変数に値をしまうことです。この場合は、副プログラムを使用していませんので、mainプログラムを呼び出した別のプログラム単位(例えばFortranのサブルーチン)mainプログラムの値を返す必要がないので、「値0を返す」、つまり値を返さない処理を行なっているというわけです。
では下に、Fortranで使用されている命令文が、C言語ではどのような名称で呼ばれているのかを紹介していきたいと思います。簡単にしか紹介しないので、少ないですが、C言語にはFortranを超える沢山の命令文が他にも用意されています。
integer
int a;
real
float a;
character
char a;
double precision
double a;
配列
int a[3];
write
printprintf("この答えは%d",a);
read
scanf("%d %d",&a,&b);
if else endif
if(a>3){命令文;}
else{命令文;}
case
switch(a){
case 0:命令文
break;
case 1:命令文
break;
default:命令文
break;
}
do
for(i=1;i<8;i++){命令文;}
while(i>=2){命令文;}
do{命令文;]while(i=3);
save
static
type
mainよりも上側で
struct Student{
char name;
int number;
};
void main(){
struct Student seito
seito.number=11
function
mainよりも上側で int sum(int x,int y);
void main(){ int x,y,z;
z=sum(x,y); printf("和は%d",z);
return 0;
}
int sub(int x,int y){
int z;
z=x+y;
return z;
}
どうですか。これは本の一部ですが、結構C言語の言葉はFortranと似ているのではないかと思います。後は慣れです。書き方の形式に慣れてしまえば(特に中括弧とセミコロン)、後はFortranで培った知識を生かせば、簡単にC言語のプログラミングを行なうことができます。C言語にはポインタに代表されるようなFortranよりも強力な操作が可能なので、Fortranでは簡単すぎて飽き飽きしてしまった人にはぴったりかもしれません。
もしC言語をやってみたい・もっと詳しく知りたいと思った人は、ぜひ『プログラムを書こう! C入門』を訪れてみてください。このページはC言語を詳しく分かりやすく書いているページでオススメです。さらにC言語の進化形であるC++や、C言語と並んで有名なJavaも扱っているので、みんなまとめて学習するのもいいと思います。せっかくFortranを学んだなら、C言語にもチャレンジしてみてくださいね。
很菜的Sodoku Solver
其实是模拟了手工填写数独的方法,用的排除法。这个代码的不足在于没有怎么规划,其实board::pencilMark()完全可以做成按行、列、正方形顺序将所有的方格的pencil mark全部填好。稍加改动,可以解16*16或8*8的数独。
-
using namespace std;
-
-
class cell
-
{
-
private:
-
int number;
-
int pencil;
-
public:
-
bool getPencil(int num);
-
bool setPencil(int num);
-
bool isHavingPencil(void);
-
int getAllPencil(void);
-
bool erasePencil(int num);
-
int getNumber(void);
-
bool fillNumber(int num);
-
bool initCell(int num);
-
bool clearPencil(void);
-
protected:
-
};
-
-
bool cell::getPencil(int num)
-
{
-
return (pencil & (1<<num))?true:false;
-
}
-
-
bool cell::setPencil(int num)
-
{
-
if(!num)
-
return true;
-
if(pencil & (1<<num))
-
;
-
else
-
pencil += (1<< num);
-
return true;
-
}
-
-
bool cell::isHavingPencil(void)
-
{
-
return pencil?true:false;
-
}
-
-
int cell::getAllPencil(void)
-
{
-
return pencil;
-
}
-
-
bool cell::erasePencil(int num)
-
{
-
if(!num) //Meet zero
-
return true;
-
if(pencil & (1 << num))
-
pencil -= 1<< num;
-
return true;
-
}
-
-
int cell::getNumber(void)
-
{
-
return number;
-
}
-
-
bool cell::fillNumber(int num)
-
{
-
number = num;
-
clearPencil();
-
return true;
-
}
-
-
bool cell::initCell(int num)
-
{
-
number = num;
-
pencil = num?0:((1 << 10) - 2);
-
return true;
-
}
-
-
bool cell::clearPencil(void)
-
{
-
pencil = 0;
-
return true;
-
}
-
-
class board
-
{
-
private:
-
cell boardCells[10][10];
-
int blankCell;
-
int cellSolved;
-
public:
-
bool solveOneStep(void);
-
bool pencilMark(int x, int y);
-
bool decideNumber(void);
-
void printBoard(void);
-
bool readCell(void);
-
protected:
-
-
};
-
-
void getSquare(const int x, const int y, int & left, int & top)
-
{
-
static int coordinates[]={0,1,1,1,4,4,4,7,7,7};
-
left = coordinates[x];
-
top = coordinates[y];
-
return;
-
}
-
-
bool board::pencilMark(int x, int y) //True for having pencil mark, false for not.
-
{
-
int linearPointer, sqLinePointer, sqColumnPointer, sqLeft, sqTop;
-
int reading;
-
-
if(!(boardCells[x][y].getNumber())) //Blank Cell.
-
{
-
boardCells[x][y].initCell(0); //Initialize pencil marks.
-
//Line
-
for(linearPointer = 1; linearPointer <= 9; linearPointer ++)
-
{
-
if (linearPointer == y)
-
continue;
-
reading = boardCells[x][linearPointer].getNumber();
-
if (reading)
-
boardCells[x][y].erasePencil(reading);
-
}
-
-
//Column
-
for(linearPointer = 1; linearPointer <= 9; linearPointer ++)
-
{
-
if (linearPointer == x)
-
continue;
-
reading = boardCells[linearPointer][y].getNumber();
-
if (reading)
-
boardCells[x][y].erasePencil(reading);
-
}
-
-
//Square
-
getSquare(x, y, sqLeft, sqTop);
-
for(sqLinePointer = 0; sqLinePointer < 3; sqLinePointer ++)
-
{
-
if (x - sqLeft == sqLinePointer)
-
continue;
-
for(sqColumnPointer = 0; sqColumnPointer < 3; sqColumnPointer ++)
-
{
-
if(y - sqTop == sqColumnPointer)
-
continue;
-
reading = boardCells[sqLeft + sqLinePointer][sqTop + sqColumnPointer].getNumber();
-
if(reading)
-
boardCells[x][y].erasePencil(reading);
-
}
-
}
-
}
-
else
-
return true;
-
return boardCells[x][y].isHavingPencil();
-
}
-
-
bool board::decideNumber(void) //True for progress, false for no.
-
{
-
int x, y, marks;
-
bool retlog;
-
-
cellSolved = 0;
-
-
//Calculate pencil marks.
-
for(x = 1; x <= 9; x++)
-
{
-
for(y = 1; y <= 9; y++)
-
{
-
retlog = pencilMark(x, y);
-
if(!retlog)
-
goto noSolution;
-
}
-
}
-
-
//Search for single pencil mark.
-
for(x = 1; x <= 9; x++)
-
{
-
for(y = 1; y<= 9; y++)
-
{
-
if(boardCells[x][y].getNumber()) //Already have number
-
continue;
-
marks = boardCells[x][y].getAllPencil();
-
if(!(marks & (marks - 1))) // Only have one number.
-
{
-
switch(marks)
-
{
-
case 2:
-
boardCells[x][y].initCell(1);break;
-
case 4:
-
boardCells[x][y].initCell(2);break;
-
case 8:
-
boardCells[x][y].initCell(3);break;
-
case 16:
-
boardCells[x][y].initCell(4);break;
-
case 32:
-
boardCells[x][y].initCell(5);break;
-
case 64:
-
boardCells[x][y].initCell(6);break;
-
case 128:
-
boardCells[x][y].initCell(7);break;
-
case 256:
-
boardCells[x][y].initCell(8);break;
-
case 512:
-
boardCells[x][y].initCell(9);break;
-
default:
-
cout << "ERROR! ";
-
}
-
blankCell--;
-
cellSolved++;
-
}
-
}
-
}
-
if(cellSolved)
-
return true;
-
-
int searchNum;
-
int markCount;
-
int lastPos, lastSqX, lastSqY;
-
int linearIndex, sqRowIndex, sqColumnIndex, sqLeft, sqTop;
-
//Search for only candidates.
-
-
//By Row
-
for(x = 1; x <= 9; x++)
-
{
-
for(searchNum = 1; searchNum <= 9; searchNum ++)
-
{
-
markCount = 0;
-
lastPos = 0;
-
for(linearIndex = 1; linearIndex <= 9; linearIndex++)
-
{
-
if(boardCells[x][linearIndex].getPencil(searchNum))
-
{
-
markCount ++;
-
lastPos = linearIndex;
-
}
-
}
-
if(markCount == 1)
-
{
-
boardCells[x][lastPos].initCell(searchNum);
-
goto foundSolution;
-
}
-
}
-
}
-
-
//By Column
-
for(y = 1; y <= 9; y++)
-
{
-
for(searchNum = 1; searchNum <= 9; searchNum ++)
-
{
-
markCount = 0;
-
lastPos = 0;
-
for(linearIndex = 1; linearIndex <= 9; linearIndex++)
-
{
-
if(boardCells[linearIndex][y].getPencil(searchNum))
-
{
-
markCount ++;
-
lastPos = linearIndex;
-
}
-
}
-
if(markCount == 1)
-
{
-
boardCells[lastPos][y].initCell(searchNum);
-
goto foundSolution;
-
}
-
}
-
}
-
-
//By Square
-
for(sqLeft = 1; sqLeft < 9; sqLeft += 3)
-
{
-
for(sqTop = 1; sqTop < 9; sqTop += 3)
-
{
-
for(searchNum = 1; searchNum <= 9; searchNum ++)
-
{
-
markCount = 0;
-
lastSqX = 0, lastSqY = 0;
-
for(sqRowIndex = 0; sqRowIndex < 3; sqRowIndex ++)
-
{
-
for(sqColumnIndex = 0; sqColumnIndex < 3; sqColumnIndex++)
-
{
-
if(boardCells[sqLeft + sqRowIndex][sqTop + sqColumnIndex].getPencil(searchNum))
-
{
-
markCount ++;
-
lastSqX = sqRowIndex, lastSqY = sqColumnIndex;
-
}
-
}
-
}
-
if(markCount == 1)
-
{
-
boardCells[sqLeft + lastSqX][sqTop + lastSqY].initCell(searchNum);
-
goto foundSolution;
-
}
-
}
-
}
-
}
-
-
if(blankCell) //Not solved yet.
-
cout << "Cannot solve. " << endl;
-
return false;
-
-
foundSolution:
-
cellSolved ++;
-
blankCell --;
-
return true;
-
-
noSolution:
-
cout << "No Solution!!" << endl;
-
return false;
-
-
}
-
-
bool board::solveOneStep(void)
-
{
-
int x, y;
-
for(x = 1; x <= 9; x++)
-
for(y = 1; y<= 9; y++)
-
pencilMark(x,y);
-
return decideNumber();
-
}
-
-
bool board::readCell(void)
-
{
-
int x, y, recv;
-
blankCell = 0;
-
for(x = 1; x <= 9; x++)
-
for(y = 1; y <= 9; y++)
-
{
-
cin >> recv;
-
boardCells[x][y].initCell(recv);
-
if(recv==0)
-
blankCell++;
-
}
-
return true;
-
}
-
-
void board::printBoard(void)
-
{
-
int x, y, num;
-
num = 0;
-
for(x = 1; x <= 9; x++)
-
{
-
for(y = 1; y <= 9; y++)
-
{
-
num = boardCells[x][y].getNumber();
-
cout << " " << num;
-
}
-
cout << "\n";
-
}
-
}
-
-
int _tmain(void)
-
{
-
board game;
-
int counter = 0;
-
-
cout << "VIKTOR\'S SODUKU SOLVER VER 1.00A SEPT 7, 2008\n";
-
cout << "Input soduku, 0 for blank\n";
-
-
game.readCell();
-
cout << "Your initial soduku is: \n\n";
-
game.printBoard();
-
-
while(game.solveOneStep())
-
{
-
counter ++;
-
/*DEBUG CODE
-
cout << "The " << counter << " step of soduku is: \n\n";
-
game.printBoard();
-
*/
-
}
-
-
cout << "Your soduku is solved after " << counter << " steps as follows: \n" ;
-
game.printBoard();
-
-
return 0;
-
}
-
-
Viktor的Fortran手记之五 IFC可视化设计(二)
5 连接变量和对话框
对话框必须连接到变量上。变量的类型是
并且定义在IFLOGM.F90模块中。(CFC是定义在DIALOGM模块中)具体的连接方式如下:
include 'resource.fd' !默认的资源文件头
type(dialog) dlg
logical retlog
retlog = DlgInit(IDD_WINDOW, dlg)
6 使用对话框的一般过程
- 建立TYPE(dialog)型变量,并调用DlgInit或DlgInitWithResourceHandle函数连接对话框。
- 用DlgSet等手段,赋予控件初始值。
- 使用DlgSetSub函数,规定控件响应回调程序。
- 显示对话框。模态可用DlgModal,无模态情况下用DlgModeless函数调用,并在消息处理例程中增加DLGISDLGMESSAGE事件。
- 用DlgGet等手段取用控件值。
- 用DlgUninit释放对话框。(必要!)
7 Edit和Static
这些都是最普通的控件,使用时,没有必要附加属性指定,因为得以存取的,无非是字串(对应字串型)。DlgGet与DlgSet是重载函数。如果用逻辑型变量存取,修改的是Enabled属性。IFC Documentation给出了一个内部读写的例子,插在事件处理回调程序中:
character(256) text !按Viktor的习惯还是写character(len=256)好
logical retlog
select case (control_name)
case (IDC_EDIT_CELSIUS)
retlog = DlgGet(dlg, IDC_EDIT_CELSIUS, text) !将Edit内容装入text中
read (text, *, iostat = retint) cel !所谓“内部读取”,其实是数据转化过程
if (retint .eq. 0) then !成功,以免没有读到正确的值
far = (cel - 0.0) * (212.0 - 32) / 100.0 + 32.0 !为什么不化简?
write (text, *) far !内部输出。不用判断了。
retlog = DlgSet(dlg, IDC_EDIT_FAR, trim(adjustl(text))) !左对齐好看
end if
!下略
end select case
Viktor的Fortran手记之四 IFC可视化设计(一)
呵呵……原来在日文版的浏览器下FCKEditor也会变日文版的……很好很强大……
下列内容根据Intel(R) Visual Fortran Compiler Documentation编译。
1 控件类型支持
除ActiveX外,Intel Visual Fortran Compiler(以下简称IFC)支持十五种控件:
- Button
- Check box
- Combo box
- Edit box
- Group box
- List box
- Picture
- Progress bar
- Radio button
- Scroll bar (horizonal)
- Scroll bar (vertical)
- Slider
- Spin control
- Static text
- Tab control
2 控件值的取用: DLGGET()
注意,该东西是个函数,返回逻辑型(.true.对应“成功”,.false.对应“成仁”)。需要什么,应该写成参数。写法是
比如
需要注意的是,读EDIT控件只能读字符串,存到字符串(一般可用txt之类的名字)中。需要数值时再用read读数值:
...
retlog = DlgGet(dlg, IDC_EDIT_TOL, text)
!因为Edit的默认属性就是框里的内容
read (text, *) tol
3 将H文件转化为FD文件
IFC提供DEFTOFD程序。是不是自动的,没试,不敢说。
4 主程序要求
必须
也必须包含.fd文件,如