【PHP学习】move_uploaded_file() 使用注意

今天刚弄好WAMP,端口问题焦头烂额一上午,最后停止IIS服务就好了。。。

看PHP基本的部分,在用到 move_uploaded_file()时一直是错误,说是无法把文件从临时路径移动到指定路径下,最后发现指定路径不存在。。。就是最后的upload目录没有创建,心里还想着它会自动创建这个目录呢,真是傻了。。。

(代码是W3SCHOOL上的例子,稍有改动)

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
<?php
if( $_FILES["file"]["type"] == "text/plain" && $_FILES["file"]["type"] < 20000 )
{
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
$oldPath = $_FILES["file"]["tmp_name"];
$newPath = "D:\\WAMP Server\\wamp\\tmp\\upload\\" . $_FILES["file"]["name"];

echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: $oldPath temporarily!<br />";

if( file_exists($newPath) )
{
echo "$newPath already exists!";
}
else
{
move_uploaded_file($oldPath, $newPath);
echo "Stored in: $newPath !";
}
}
}
else
{
echo "Invalid File!";
}
?>

青城山

他提了提书箱,有点潮,昨夜下了整晚的雨。“听人说长安是个好地方,让人去了就不想回来”,他心里想着,望了望背后的青城山。青城山再往后,地上是有两行脚印的,只是雨太大,早就冲刷干净了。

路上虽然辛苦,但是也见到了不少人和事,果真是读万卷书不如行万里路。

他虽然读了很多书,写了很多文章,但是这次仍然控制不住拿笔的手的颤抖,尽管文章在心中已经想好,但是笔还是未落又起。“墨又干了”。他端起水倒到砚台上,没有拿起墨,而是用笔在砚台上来回涂抹,直到已经干掉的墨和清澈的水再也不分彼此。

他不知道在害怕什么,因为当前最好的选择就是把肚子里的文章倒出来,然后一身轻松地离开,等到挤着别人与被人挤着的时候踮踮脚探探头然后在那张大纸上看到自己的名字,然后等着他挤的人与挤他的人的五颜六色的目光与五颜六色的声音。

哦,他想起来为什么害怕,因为他并没有想过如果那张纸上没有自己的名字的情况,他是村里最谦逊也最有学问的书生,戒尺不离手的先生和脏话不离口的父亲都很喜欢他,他是最谦逊的书生,但也是最有学问的,所以他敢在先生和父亲面前,他敢在她面前说自己一定能被写在那张纸上,并且还是在一眼能看到的位置。

墨已经可以用了。“盛世黎民,嬉游于光天化日之下。太平天子,上召夫景星庆云之祥”。他是见过考官的,考官很喜欢他的文章,考官说过一定不能错过任何人才。他觉得自己就是考官说的人,因为考官说这话的时候是望着他的,他没有礼物给考官,考官说也不收礼物,他拿出了自己的文章,考官很喜欢他的文章,考官说的。

现在他在写了,考官很喜欢他的文章,考官说的。他写的时候没有想着这篇文章该怎么写,因为早就已经想好了,他想着先生的戒尺,父亲的脏话,青城山后的她,和乡里人五颜六色的目光。他没有想到考官,因为考官很喜欢他的文章,考官说的。

“天地交泰,斯称盛世。”落完最后一笔,他没有把笔放回笔架,而是重重地戳在了砚台上,溅出来的墨已经磨过好几次,因而黑的发亮,他白色的衣服和白色的宣纸也有几处黑的发亮了。

长安城真的很大啊,走上一圈比爬上青城山还累。可能是只有自己一个人逛这长安城吧,没人说话,也就只能想着路有多长,脚有多累。他想找个地方扔掉书箱,因为用不到了。他要赶快翻过青城山到背面去,不能再背这么重的东西了,他要翻过青城山等着贴那张纸的人的到来。他在想如果见到了那个人,一定要拿点银子出来说声官爷辛苦了。

他现在不害怕如果那张纸上没有自己名字的情况了,因为他早就知道蓬莱岛上有神仙,神仙是不用为这些世俗之事烦心的,他如果不能被写在那张纸上,那他就去找神仙。反正总是有无量的前途的。

他想到了她,她是不会和他一起去当神仙的,她想住进大房子里,她想住进长安城,她不想住到蓬莱岛上。他不知道她会不会阻拦他去当神仙,但是她是送他到了青城山下的,她是送了他去长安城的。神仙是自在的,神仙不会死,所以他不着急去当神仙,他想先在那张纸上看到自己的名字。

他提了提书箱,有点潮,昨夜下了整晚的雨。“总是听爹说长安是个好地方,很大而且人很多,走上一圈像爬青城山一样,让人去了就不想回来”,他心里想着,望了望背后的青城山,他知道娘也在山背后看着青城山。他不想去写文章,他想当木匠。读过很多书的爹在听到他的志向后也开始脏话不离口了。他问过爹长安城的妓院,就是书里写的青楼。爹说没有文章里写的那么好,爹说他没进去过,他在外边看的。他说要帮爹进去看看,爹难得没有骂脏话,反而惬意地笑了起来,背起一段他没听过的古文。

爹说过到长安城一定要去找那个考官,因为那个考官很喜欢爹的文章,爹还说在爹去过长安的那一年后,考官的儿子就住在了长安城。爹说了很多那个考官的好话,他也相信。

“但是,蓬莱岛到底在哪呢?其传在渤海中,去人不远···盖尝有至者,诸仙人及不死之药皆在焉。”“那渤海又在哪呢?村头李木匠的家比渤海好找多了,而且他做的事比神仙还自在,他的女儿也比仙女还好看。爹不也是当了教书先生,娶了他先生的女儿吗。我就和爹一样吧。”他在从贴那张纸的地方赶回家中的路上这么想着,等着爹的脏话和娘的眼泪,他知道这是因为爹去不了青楼了,娘也住不到长安城了。他觉得自己终于可以当木匠了,他准备先到山上去选好一棵粗壮的树当材料,他还带了墨线,因为只有李木匠家里有墨斗,自己只能先用一根墨线了。

他终于可以真正快乐了,他没有当上木匠,但是他和李木匠打造出来的家具永远在一起了,他作为一件家具永远和李木匠的女儿在一起了。


真是:

凡缘往事伴云消,
苦海命泉渡神桥。
红尘修真得证道,
蓬莱仙境乐逍遥。

Java 多线程学习中遇到的一个有趣的问题

今天随便写了一个线程之间相互调度的程序,代码如下:

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
class First extends Thread
{
public First()
{
start();
}

synchronized public void run()
{
try
{
wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
try
{
sleep(2000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("hello world~");
}
}

class Second extends Thread
{
First first;
public Second(First first)
{
this.first = first;
start();
}

synchronized public void run()
{
try
{
wait();
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
synchronized( first )
{
try
{
sleep(2000);
System.out.println("I'm faster than first~");
}
catch(InterruptedException e)
{
e.printStackTrace();
}
first.notifyAll();
}
}
}

public class Main
{
public static void main(String[] args) throws InterruptedException
{
First first = new First();
Second second = new Second(first);
synchronized( second )
{
System.out.println("I'm faster than second~");
second.notifyAll();
}
}
}

本以为输出会很顺畅,但是出现的问题是,只输出了一行:I’m faster than second~

程序就一直处于无响应状态,纠结了好久终于想明白是这么一回事:在main函数中,对second.notifyAll()的调用早于second中的wait()调用(因为是多线程并行,故函数响应时间与代码先后顺序无关),这样先唤醒了second,紧接着second才开始wait,因此就处于无响应状态。

改进方法:只要在second.notifyAll()调用之前空出一点时间先让second的wait调用开始即可,事实上,这段时间如此之短以至于在我电脑上只需要在之前加一行输出语句即可。为了保险起见,还是多加了个sleep,改进后代码如下:

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
class First extends Thread
{
public First()
{
start();
}

synchronized public void run()
{
try
{
wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
try
{
sleep(2000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("hello world~");
}
}

class Second extends Thread
{
First first;
public Second(First first)
{
this.first = first;
start();
}

synchronized public void run()
{
try
{
wait();
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
synchronized( first )
{
try
{
sleep(2000);
System.out.println("I'm faster than first~");
}
catch(InterruptedException e)
{
e.printStackTrace();
}
first.notifyAll();
}
}
}

public class Main
{
public static void main(String[] args) throws InterruptedException
{
First first = new First();
Second second = new Second(first);
System.out.println("wating for all threads prepared~");
Thread.sleep(2000);
synchronized( second )
{
System.out.println("I'm faster than second~");
second.notifyAll();
}
}
}

输出结果:

1
2
3
4
wating for all threads prepared~
I’m faster than second~
I’m faster than first~
hello world~

文件夹遍历 Java 版

Java下的File类(文件类,其实感觉文件类有点误导性,用“文件路径”会好一点)有list方法,会返回指定路径下所有文件和目录,用这个方法以及简单的递归可以写出一个简陋的文件遍历程序

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
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class test_for_team_study_2
{
public static void traverse(String name, FileWriter wt) throws IOException
{
wt.write(name + "\r\n");
File path = new File(name);
String[] list = path.list();
if( null == list )
return ;
for(int i = 0; i < list.length; i ++)
if( -1 == list[i].indexOf(".") )
traverse(name + "/" + list[i], wt);
}

public static void main(String[] args) throws IOException
{
FileWriter wt = new FileWriter("C:/Users/Administrator/Desktop/file in D.out");
String name = "D:/";
File path = new File(name);
String[] list = path.list();
for(int i = 0; i < list.length; i ++)
{
wt.write("now is the file#:" + i + "\r\n==========================\r\n");
traverse(name + "/" + list[i], wt);
wt.write("\r\n\r\n\r\n");
}
wt.flush();
wt.close();
System.out.println("finished!");
}
}

JAVA 设置 JTable 表格的可编辑性

有时候,我们需要设置JTable表格某些行某些列不可编辑以保证数据准确,用DefaultTableModel初始化的话,需要重写它的public boolean isCellEditable(int, int)方法,写法简单呈现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DefaultTableModel myModel = new DefaultTableModel(dataOfOrder, headOfOrder)	//实例化表格模式
{
/**
*
*/
private static final long serialVersionUID = 1L;

public boolean isCellEditable(int rowIndex, int columnIndex) //重写方法改编可编辑性
{
if( columnIndex == getColumnCount() - 1 )
return true;
return false;
}
};

上述写法是设置只有表格的最后一列可编辑,其他列不可编辑。有了rowIndex和columnIndex这两个参数,可以随意的设置可编辑范围。

注意要达到目的,定义另一个类继承DefaultTableModel,之后在类中重写方法是不可行的!

Java 窗体中按钮布局问题

在Java窗体中,有时需要对按钮的设置进行布局,这时使用GridLayout(x, y)会很方便,意思是把窗口划分为x行y列的小格子,在add的时候就是一行一行的填充,这样可以是按钮得到标准化布局

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
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class test_for_blog extends JFrame
{
/**
*
*/
private static final long serialVersionUID = 5136083409273453255L;

private static int JFwidth = 450;
private static int JFheight = 350;

JPanel panel = null;

JButton btnAdd = null;
JButton btnDelete = null;

public test_for_blog()
{
super("按钮添加测试");

panel = new JPanel();

btnAdd = new JButton("Add");
btnDelete = new JButton("Delete");

panel.setLayout( new GridLayout(1, 2) );
panel.add(btnAdd);
panel.add(btnDelete);
this.getContentPane().add(panel, BorderLayout.SOUTH);
}

public static void main(String[] args)
{
test_for_blog test = new test_for_blog();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); //获取显示屏尺寸
test.setBounds((screenSize.width - JFwidth) / 2, (screenSize.height - JFheight) / 2, JFwidth, JFheight); //使程序窗口居中
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //窗口设为可关闭
test.setResizable(false); //窗口设为不可调节大小
test.setVisible(true); //窗口设为可见
}
}

POJ 3255 Roadblocks (次短路问题)

解法有很多奇葩的地方,比如可以到达终点再跳回去再跳回来(比如有两个点)。。。。反正就是不能有最短路,不过没关系,算法都能给出正确结果

思想:和求最短路上的点套路一样,spfa先正着求一次,再反着求一次最短路,然后枚举每条边<i,j>找dist_zheng[i] + len<i,j> + dist_fan[j]的第二小值即可!注意不能用邻接矩阵,那样会MLE,应该用邻接表

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
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
poj 3255
3808K 266MS
*/

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>

#define MAXN 200005
#define MAX_INT 2147483647

using namespace std;

int last[5005], dist_1[5005], dist_2[5005], n, m, gra[5005][5005];
bool mark[MAXN];

struct node
{
int u;
int v;
int w;
int next;
node()
{
u = v = w = next = 0;
}
}edge[MAXN];

void spfa( int dist[5005], int s )
{
queue<int>myQueue;
dist[s] = 0;
memset(mark, false, sizeof(mark));
mark[s] = true;
myQueue.push(s);
while( !myQueue.empty() )
{
int x = myQueue.front();
myQueue.pop();
mark[x] = false;
int t = last[x];
while( t )
{
if( dist[ edge[t].v ] > dist[x] + edge[t].w )
{
dist[ edge[t].v ] = dist[x] + edge[t].w;
if( !mark[ edge[t].v ] )
myQueue.push( edge[t].v );
}
t = edge[t].next;
}
}
}

int main()
{
cin >> n >> m;
for(int i = 1;i <= m;i ++)
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
edge[i].u = edge[i + m].v = a;
edge[i].v = edge[i + m].u = b;
edge[i].w = edge[i + m].w = c;
edge[i].next = last[a];
last[a] = i;
edge[i + m].next = last[b];
last[b] = i + m;
}
memset( dist_1, 1, sizeof(dist_1) );
spfa( dist_1, 1 );
memset( dist_2, 1, sizeof(dist_2) );
spfa( dist_2, n );
int ans = MAX_INT, tmp = MAX_INT;
for(int i = 1;i <= n;i ++)
{
int t = last[i];
while( t )
{
if( dist_1[i] + dist_2[ edge[t].v ] + edge[t].w < tmp )
{
ans = tmp;
tmp = dist_1[i] + dist_2[ edge[t].v ] + edge[t].w;
}
else if( dist_1[i] + dist_2[ edge[t].v ] + edge[t].w < ans
&& dist_1[i] + dist_2[ edge[t].v ] + edge[t].w != tmp )
ans = dist_1[i] + dist_2[ edge[t].v ] + edge[t].w;
t = edge[t].next;
}
}
cout << ans << endl;
return 0;
}

POJ 3093 Margaritas on the River Walk(0-1背包变形)

这题目的思路很巧妙,什么情况下剩下的所有物品都放不下呢?就是当前剩余物品中最小的那个也放不下。所以,先把物品按照容量从小到大排序,依次枚举当前背包为放不下的最小物品的情况。

对于当前物品i,必有1到i-1的所有物品都放进去,这时候比i大的物品谁放谁不放是不确定的。转换成0-1背包问题:把前i-1个物品都放进去以后,得到空间为tsum – sum[i-1](前缀和)的包,只要从第i+1到第n个物品中拿出一个方案填充这个包使得剩余体积小于第i个物品的体积就可以了,把总方案数累加就是结果!

注意特殊情况:当排序后最小的物品也无法放入时,直接返回0,因为dp[0]初始化为1,

代码:

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
/*
poj 3093
232K 0MS
*/
#include<cstdio>
#include<algorithm>
#include<iostream>

#define MAXN 1005

using namespace std;

int n, m, wei[35], dp[MAXN], sum[MAXN];

__int64 Bag()
{
memset(sum, 0, sizeof(sum));
sort( wei + 1, wei + n + 1 );
if(wei[1] > m) //因为很可能有最小的也放不下这种情况,而dp【0】是初始化为1的,会输出1
return 0;
for(int i = 1;i <= n;i ++)
sum[i] = sum[i-1] + wei[i];
__int64 ans = 0;
for(int i = 1;i <= n;i ++)
{
if(sum[i - 1] > m)
break;
memset(dp, 0, sizeof(dp));
dp[sum[i-1]] = 1;
for(int j = i + 1;j <= n;j ++)
for(int k = m; k >= sum[i - 1] + wei[j]; k --)
dp[k] += dp[k - wei[j]];

for(int j = m - wei[i] + 1;j <= m;j ++)
ans += dp[j];
}
return ans;
}

int main()
{
int Cases;
cin>>Cases;
for(int cnt = 1; cnt <= Cases; cnt ++)
{
cin >> n >> m;
for(int i = 1;i <= n;i ++)
cin>> wei[i];
cout << cnt << " " << Bag() <<endl;
}
return 0;
}

要开始编程了

6月准备期末考试,除了考试没有再编过程。今天院内ACM培训选拔赛,虽然手生,还是顺利通过了。这两周不用去听水课了,通过这两周找找感觉,巩固一下算法把,不要放下c++和Java的学习。一月不编程感觉水平有点下滑,很简单的题目竟然选择了很复杂的算法,还是错的,其实暴搜就可以,哎,好好练习吧