0%

上传大文件到Cassandra时失败,/var/log/cassandra/system.log中有如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WARN \[SharedPool-Worker-2\] 2015-05-26 10:29:56,900 AbstractTracingAwareExecutorService.java:169 - Uncaught exception on thread Thread\[SharedPool-Worker-2,5,main\]: {}
java.lang.RuntimeException: java.lang.IllegalArgumentException: Mutation of 25802415 bytes is too large for the maxiumum size of 16777216
at org.apache.cassandra.service.StorageProxy$LocalMutationRunnable.run(StorageProxy.java:2219) ~\[apache-cassandra-2.1.5.jar:2.1.5\]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) ~\[na:1.7.0_79\]
at org.apache.cassandra.concurrent.AbstractTracingAwareExecutorService$FutureTask.run(AbstractTracingAwareExecutorService.java:164) ~\[apache-cassandra-2.1.5.jar:2.1.5\]
at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:105) \[apache-cassandra-2.1.5.jar:2.1.5\]
at java.lang.Thread.run(Thread.java:745) \[na:1.7.0_79\]
Caused by: java.lang.IllegalArgumentException: Mutation of 25802415 bytes is too large for the maxiumum size of 16777216
at org.apache.cassandra.db.commitlog.CommitLog.add(CommitLog.java:221) ~\[apache-cassandra-2.1.5.jar:2.1.5\]
at org.apache.cassandra.db.Keyspace.apply(Keyspace.java:368) ~\[apache-cassandra-2.1.5.jar:2.1.5\]
at org.apache.cassandra.db.Keyspace.apply(Keyspace.java:348) ~\[apache-cassandra-2.1.5.jar:2.1.5\]
at org.apache.cassandra.db.Mutation.apply(Mutation.java:214) ~\[apache-cassandra-2.1.5.jar:2.1.5\]
at org.apache.cassandra.service.StorageProxy$7.runMayThrow(StorageProxy.java:1036) ~\[apache-cassandra-2.1.5.jar:2.1.5\]
at org.apache.cassandra.service.StorageProxy$LocalMutationRunnable.run(StorageProxy.java:2215) ~\[apache-cassandra-2.1.5.jar:2.1.5\]
... 4 common frames omitted

这是因为cassandra.yaml配置文件中默认配置的单个提交日志文件的大小为32MB,而Cassandra允许的最大写尺寸是其一半,也就是16MB,亦即是上述错误中提示的16777216

1
commitlog_segment_size_in_mb: 32

Cassandra并不是为大文件设计的,所以最好适当的限制一下写尺寸,或者上传文件的大小,而不是调整系统参数。

===
[erq]

当form没有给定name时,Chrome会提示”An invalid form control with name=’’ is not focusable”,为form添加name属性即可,或者添加novalidate属性亦可,不过此时form将不校验其内部的所有输入元素。

自动部署war包到ROOT路径,也就是网站的根目录时,deploy插件的”Context path”要填写:”/“,而不是”ROOT”或者”/ROOT”,不然自动部署会失败,有类似以下错误:

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
Build step 'Invoke Gradle script' changed build result to SUCCESS
Deploying /var/lib/jenkins/jobs/devel_auto_build_deploy/workspace/build/libs/reis.war to container Tomcat 7.x Remote
\[/var/lib/jenkins/jobs/devel_auto_build_deploy/workspace/build/libs/reis.war\] is not deployed. Doing a fresh deployment.
Deploying \[/var/lib/jenkins/jobs/devel_auto_build_deploy/workspace/build/libs/reis.war\]
ERROR: Build step failed with exception
org.codehaus.cargo.container.ContainerException: Failed to deploy \[/var/lib/jenkins/jobs/devel_auto_build_deploy/workspace/build/libs/reis.war\]
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.deploy(AbstractTomcatManagerDeployer.java:111)
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:185)
at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:73)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:116)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:103)
at hudson.FilePath.act(FilePath.java:991)
at hudson.FilePath.act(FilePath.java:969)
at hudson.plugins.deploy.CargoContainerAdapter.redeploy(CargoContainerAdapter.java:103)
at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:61)
at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:45)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:779)
at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:726)
at hudson.model.Build$BuildExecution.post2(Build.java:185)
at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:671)
at hudson.model.Run.execute(Run.java:1769)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:374)
Caused by: java.io.IOException: Error writing request body to server
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.checkError(HttpURLConnection.java:3478)
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.write(HttpURLConnection.java:3461)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:126)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.pipe(TomcatManager.java:647)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.invoke(TomcatManager.java:538)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deployImpl(TomcatManager.java:611)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deploy(TomcatManager.java:291)
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.deploy(AbstractTomcatManagerDeployer.java:102)
... 17 more
java.io.IOException: Error writing request body to server
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.checkError(HttpURLConnection.java:3478)
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.write(HttpURLConnection.java:3461)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:126)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.pipe(TomcatManager.java:647)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.invoke(TomcatManager.java:538)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deployImpl(TomcatManager.java:611)
at org.codehaus.cargo.container.tomcat.internal.TomcatManager.deploy(TomcatManager.java:291)
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.deploy(AbstractTomcatManagerDeployer.java:102)
at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:185)
at hudson.plugins.deploy.CargoContainerAdapter.deploy(CargoContainerAdapter.java:73)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:116)
at hudson.plugins.deploy.CargoContainerAdapter$1.invoke(CargoContainerAdapter.java:103)
at hudson.FilePath.act(FilePath.java:991)
at hudson.FilePath.act(FilePath.java:969)
at hudson.plugins.deploy.CargoContainerAdapter.redeploy(CargoContainerAdapter.java:103)
at hudson.plugins.deploy.DeployPublisher.perform(DeployPublisher.java:61)
at hudson.tasks.BuildStepMonitor$3.perform(BuildStepMonitor.java:45)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:779)
at hudson.model.AbstractBuild$AbstractBuildExecution.performAllBuildSteps(AbstractBuild.java:726)
at hudson.model.Build$BuildExecution.post2(Build.java:185)
at hudson.model.AbstractBuild$AbstractBuildExecution.post(AbstractBuild.java:671)
at hudson.model.Run.execute(Run.java:1769)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:374)
Build step 'Deploy war/ear to a container' marked build as failure
Finished: FAILURE

如果打开jenkins - Configure Global Security中的Prevent Cross Site Request Forgery exploits选项,则所有project的Build Now就会无效。

Tkinter.Tk.clipboard_get(selection=’CLIPBOARD’, type=’STRING’) # 获取系统剪贴板内容
Tkinter.Tk.clipboard_append(string,type=’STRING’) # 设置系统剪贴板内容
Tkinter.Tk.clipboard_clear() # 清空系统剪贴板

Tk预定了不少虚拟事件,比如
[html]
<>,<>,<>,<>,<>,<>,<>
[/html]
等,方便应用程序处理一些公共事务。

References:
[1] Tk event

py2exe已经好久不更新了,pyinstaller则是打包python程序更强大的工具。支持多平台打包,包括Linux,Mac,Solaris,AIX和Windows,而且使用十分简单。

虽然pyinstaller说是实验性的支持python 3,其实已经支持的很好了。

安装

linux平台

pyinstaller开发版已经支持python 3,使用pip3安装支持python 3的开发版pyinstaller

1
$ sudo pip3 install https://github.com/pyinstaller/pyinstaller/archive/python3.zip

windows平台

windows 平台需要根据目标python 版本先安装相应的pywin32

然后下载https://github.com/pyinstaller/pyinstaller/archive/python3.zip,解压缩后,命令行进入该目录执行:

1
cmd&amp;gt; python setup.py install

打包python程序
pyinstaller尚不支持跨平台打包应用程序。

打包应用程序十分简单:

1
$ pyinstaller -F -w your_application_entry.py

在当前目录生成一个新目录dist,生成的可执行文件就在该目录之下。

-F,–onefile 参数指定生成一个可执行文件。
-w, –windowed, –noconsole 参数指示不生成控制台窗口,主要针对Mac和Windows平台。

如果能在当前PATH中找到UPX,会使用UPX来压缩exe文件。

其他参数详见官方文档(参考[1])

References:
[1]PyInstaller Manual

===
[erq]

linux的cron守护程序, 其名字来源于希腊语的chronos,意思为时间。另一说为Command Run ON。