Tech Ideas

C++,Linux,Algorithm,Crypto,Lisp,etc

【旧代码】mysql备份的shell脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
bk_to="/var/mysql-backup-`date +%Y-%m-%d-%k-%M-%S |tr -d ' '`"
user_name="root"
user_pw="dev"

sql="
flush tables with read lock;
system cp -pR /var/lib/mysql $bk_to; 
unlock tables;
"
mysql -u $user_name -p$user_pw -e "$sql"
echo $sql
tar cjf $bk_to.bz2 $bk_to
rm -rf $bk_to

【旧代码】fortran中的指针实现链表的代码

我不喜欢fortran,

奇怪的词法规则(竟然不用空格分开token),

io操作竟然是语言的一部分(这种非本质的东西像C那样用库来扩展多好)

。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
program link
implicit none
type node
    character(20) name
    integer id
    integer score
    type(node),pointer ::next
end type

integer,parameter::num=3
type(node),pointer ::students

call init_all(students,num)
call show_all(students)
print*,"now,we add a student"
call add_node(students)
call show_all(students)
print*,"now,we delete the student"
call del_node(students)
call show_all(students)

contains 
subroutine add_node(pos)
type(node),pointer ::pos,tmp
allocate(tmp)
tmp%name="abc"
tmp%id=1
tmp%score=100
print*,"please input name,id,end score of one students"
read*,tmp%name,tmp%id,tmp%score
if(associated(pos%next)) then
tmp%next=>pos%next
pos%next=>tmp
else 
nullify(tmp%next)
pos%next=>tmp
end if
end subroutine

subroutine del_node(pos)
type(node),pointer ::pos,next
next=>pos%next
if(associated(next%next)) then
pos%next=>next%next
deallocate(next)
else
nullify(pos%next)
deallocate(next)
end if
end subroutine

subroutine show_all(pos)
type(node),pointer ::pos,tmp
integer ::cnt
cnt=1
print*,"all students are:"
tmp=>pos
do while(associated(tmp))
print*,cnt,"th ",tmp%name,tmp%id,tmp%score
tmp=>tmp%next
cnt=cnt+1
end do
end subroutine

subroutine init_all(pos,num)
type(node),pointer ::pos,tmp,walk
integer num
integer i

allocate(tmp)
nullify(tmp%next)
call add_node(tmp)
pos=>tmp%next
deallocate(tmp)
walk=>pos
do i=1,num-1
call add_node(walk)
walk=>walk%next
end do
end subroutine

end program link

 

我很少讨厌某种技术,坦诚的说,关于fortran,是有其他因素参合进来了。

Visual Studio静态,动态链接库开发工具简单使用

这是2011年8月份做过的一点实验,查了MSDN等等很多资料,基本搞明白了。这里我不会使用visual studio的图形界面工具,作为专业人士,还是搞懂自己的工具是怎么运转的,这样比较好。

要使用的是visual studio的命令行工具,其实和gcc那堆工具对应关系挺明显的,大致如下:

gcc cl
ar lib
ld link

文件后缀对应关系:

递增子序列数目计算的算法

这是前几天笔试时,考场上想出来的算法,但是算了两次都不一样,最后只好蒙了一个选项,悲催!

问题如下:

给定一个整数序列,例如 4,2,6,3,7,1 ,该序列有多少个递增子序列?

我的算法如下:

记第i个元素为arr[i] ,记以第i个元素结尾的递增子序列有N[i]个,

则,考虑以第i+1个元素结尾的所有递增子序列,

1
2
3
4
5
6
7
8

首先置N[i+1]=1;//表示只有第i+1个元素一个元素的子序列。

对j=1...i

           如果arr[j]<arr[i+1]

                  N[i+1]+=N[j]

最后结果等于N数组里所有元素之和。

找出平面上的特殊无向图中的所有三角形的算法

问题提出背景:在非结构化三角形网格生成过程中,若采用前沿推进法,在推进过程中是不好构造三角形的(而且也没有要),最好在把所有的边都连好以后再找出所有三角形,于是提出了问题:在由三角形构成的平面无向图中如何找出所有三角形?

网格如图:

要注意的是,这个无向图很特殊,

1.这个图在平面上。

2.这个图是由三角形构成的(如果不是由三角行构成,那这个网格就没有用处了)。

我的算法如下,伪代码表示:

1
2
3
4
5
6
7
8
9
10
11
12
foreach(点 p in所有的点){
    foreach(点 np in p的所有邻居点){
        foreach(点 nnpin np的所有邻居点){
            if(   p,np,nnp三点两两不重合
               && p,np,nnp三点两两相连
               && p==uniqPointOfTriangle(p,np,nnp)
               && uniqPointOf2Points(np,nnp)==np)  ){
                   输出p,np,nnp构成的三角形。
               }
       }
   }
}

算法的关键在于uniqPointOfTriangle( )和uniqPointOf2Points( )这两个函数。

Codeblocks配合gfortran作为fortran开发环境的配置方法

 

(以前在bmy bbs发过一次)

 

  这个方法试过在64位win7和32位winxp上可用。

    1,首先安装codeblockes,必须选完全安装(Full,All plugins,…),路径可以选默认路径即 C:/Program Files/CodeBlocks

(如果安装到别的路径,后面提到的路径请自行对应更改),一路点yes,装完后关掉codeblocks。

    2,汉化,把locale这个文件夹拷贝到 C:/Program Files/CodeBlocks/share/CodeBlocks/下(win7下需要管理员权限),确保最后的路径是这样的: C:/Program Files/CodeBlocks/share/CodeBlocks/locale/zh_CN/codeblocks.mo

然后打开codeblocks,如果没有自动汉化,到settings->environment->选左侧view,找到右侧的internationalization里找中文选上,点OK后重启codeblocks,如果汉化不成功,请检查codeblocks.mo文件是否在正确的路径。

    3,安装含有gfortran的gcc,注意:最好选择一个不带空格的路径,更不要用中文路径,如C:/gcc ,把路径记住。

    4,让codeblocks使用gfortran,在codeblocks菜单中选 “设置”–>“编译器和调试器”,选中“GNU GCC 编译器”,点“复制”,然后输入一个好记的名字如“my Gfotran compiler”,打开“可执行工具链”,在“编译器安装目录”里找到C:/gcc,确定。

然后把下面的“C编译器”,“C++编译器”,“动态库链接器”都选成gfortran.exe,“调试器”选gdb.exe,其他的都不要动,确定。安装完成。

    5,文件->新建->项目,选“empty project”,输入项目名,保存路径等,然后,在编译器下拉框中,必须选择“my Gfotran compiler”其余默认,建好项目后,选文件->新建->文件,选“empty file”,点 “…”按钮,输入一个以.f90结尾的文件名,并选中debug和release,确定。就可以在打开的编辑窗口中输入代码了。在菜单上有构建,调试等功能。

 

参考链接:

http://wiki.codeblocks.org/index.php?title=Installing_Fortran_Compiler

http://www.d2school.com/codeblocks/doc/codeblocks_setup.html  

 

codeblocks下载页面(要上外网)

http://www.codeblocks.org/downloads/26

equation solution编译的gcc

http://www.equation.com/servlet/equation.cmd?fa=fortran

汉化包 

http://www.d2school.com/codeblocks/download/d2school_codeblocks_chinese_locale.7z 

 

一个用inotify监控apache的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
#Author:windydays
#Date : 2010/8/29
#用于监控apache,如果退出就自动重启apache,原理是在如果apache退出,则apache的pid文件会被close,或触发attrib事件,
#只要用inotify监控这个事件,然后重启apache,再重新监控pid文件即可。
#使用方法:用root权限运行即可。
#停止方法:sudo pkill inotifywait.
pid_file=/var/run/apache2.pid
mon_log=/var/log/apache2/mon-apache.sh.log
if ! [ -f $pid_file ] ; then
        echo 'pid file does NOT exist! maybe it is somewhere else or
        service is
        down now.' >>$mon_log;
        exit 1 ;
fi
#如果apache没有出问题,会阻塞在下面这里.
inotifywait -q -e close $pid_file >>$mon_log;
exit_code=$?;
echo "At $(date)" >>$mon_log;
#如果#?不等于0说明inotifywait不正常退出。
if  [ $exit_code = 0 ];then
        /etc/init.d/apache2 restart
        sleep 8;
        exec $0;
fi

领会意思即可,这个东西没有实用价值,有一些超时问题无法解决。

实际上还是那种每隔两分钟,就发个HTTP请求,检测apache是否还活着的方式比较稳定可靠,例如monit。

Apache的安全增强配置(使用mod_chroot,mod_security)

                                                  作者:windydays      2010/8/17  

LAMP环境的一般入侵,大致经过sql注入,上传webshell,本地提权至root,安装rootkit等步骤。采用如下的配置,mod_chroot和单独分区挂载可以让本地提权变得极为困难,而mod-security可以封堵一般的sql注入等应用层攻击。

以下内容是在ubuntu10.04上实践以后总结出来的,直接上命令,就不做过多解释了,水平有限,错误在所难免,欢迎指正。

首先确保apache,php,mysql已经正常工作,出现问题的话,查看/var/log/apache2,/var/log/syslog,/var/log/mysql/error.log ,尤其是apparmor导致的权限错误,不易发现。

1.mod_chroot的安装,配置目标是chroot/var/www

(1) 安装:

sudo service apache2 stop
sudo apt-get libapache2-mod-chroot
sudo vi /etc/apache2/mod-available/mod_chroot.conf

内容为

<IfModulemod_chroot.c>
    LoadFile /lib/libgcc_s.so.1
    ChrootDir /var/www
</IfModule>
sudo a2enmod mod_chroot

/etc/apache2/site-enabled/000-default 中 DocumentRoot 改为 /          

sudo ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid

 并把                    

 ln -s /var/www/var/run/apache2.pid /var/run/apache2.pid

加到/etc/rc.local