设置mysql用户存储过程执行权限

mysql报错 execute command denied to user ‘用户名’@’%’ for routine ‘函数名称’

1.root 登陆mysql mysql -hlocalhost -uroot -p;

2.设置指定用户执行存储过程权限
后来一查原来是权限问题,只要用下面的语句改一下相应用户的权限就可以了:
GRANT ALL PRIVILEGES ON *.* TO ‘用户名’@’%’ ;
FLUSH PRIVILEGES;

相应的撤消权限命令:
REVOKE ALL PRIVILEGES ON *.* FROM ‘用户名’@’%’ ;
FLUSH PRIVILEGES;

svn手册

前人说的对,好记性不如烂博客,嗯svn流水账补一篇

1.有效命令及选项列表

命令 描述
:about 显示关于对话框。如果没有给命令也会显示。
:log 打开日志对话框,路径指定了日志显示的文件或目录,另外还有三个选项可以设置:/revstart:xxx/revend:xxx/strict
:checkout 打开检出对话框,/path指定了目标路径,而/url制定了检出的URL。
:import 打开导入对话框,路径制定了数据导入路径。
:update 更新指定目录 /path:xx  /rev:x 更新到指定版本,rev -1 弹出版本选择界面,默认更新到最新
:commit 提交指定目录 /path:xx 打开提交对话框,路经指定了目标路径或需要提交的文件列表,你也可以使用参数/logmsg给提交窗口传递预定义的日志信息,或者你不希望将日志传递给命令行,

你也可以使用/logmsgfile:path,path指向了保存日志信息的文件。为了预先填入bug的ID(如果你设置了集成bug追踪属性),你可以使用/bugid:"the bug id here"完成这个任务。

:add /path的文件添加到版本控制 。
:revert 恢复工作副本的本地修改,/path说明恢复哪些条目。
:cleanup 清理中断和终止的操作,将工作副本的/path解锁。
:resolve /path指定文件的冲突标示为解决,如果给定/noquestion,解决不会向用户确认操作。
:repocreate /path创建一个版本库。
:switch 打开选项对话框。路径参数指定目标目录。
:export /path的工作副本导出到另一个目录,如果/path指向另一个未版本控制目录,对话框会询问要导出到/path的URL。
:merge /path:xx 本地需要合并的目录
:copy 带来branch/tag对话框,/path是branch/tag在工作副本中的出处。
:settings 打开设置对话框。
:remove 从版本控制里移除/path中的文件。
:rename 重命名/path的文件,会在对话框中询问新文件,为了防止一个步骤中询问相似文件,传递/noquestion
:diff 启动TortoiseSVN设置的外置比较程序,/path指定了第一个文件,如果设置了/path2,比较程序会启动两个文件,如果省略/path2,比较程序会比较/path和它的BASE。
:conflicteditor 打开TortoiseSVN设置的冲突工具,在/path中需要设置冲突文件的正确文件。
:relocate 打开重定位对话框,/path指定了重定位的工作副本路径。
:help 打开帮助文件
:repostatus 打开为修改检出对话框,路经指定了工作副本目录。
:repobrowser 打开版本库浏览对话框,URL为工作副本/path指向的或/path直接指出的,另外一个选项是/rev:xxx,可以用来指定要显示的修订版本号,如果省略/rev:xxx,缺省是HEAD。
:ignore /path中的对象加入到忽略列表,也就是将这些文件添加到svn:ignore属性。
:blame 打开/path指定文件的追溯对话框,如果设置了startrevendrev,对话框询问追溯范围的对话框不会显示,如果设置了/line:nnn,TortoiseBlame会打开特定文件的某一行。
:cat /path指定的工作副本或URL的文件保存到/savepath:path,修订版本号在/revision:xxx,这样可以得到特定修订版本的文件。
:createpatch 创建/path下的补丁文件。
:revisiongraph 显示/path目录下的版本变化图。
:lock Locks a file. The ‘lock’ dialog is shown so the user can enter a comment for the lock. /path
:rebuildiconcache 重建windows的图标缓存,只有windows的图标缓存出了问题才需要这样做,一个副作用就是(不可避免)桌面的图标会重新组织。/noquestion

2.closeonend值说明

如果想在进度对话框执行完毕后自动关闭,而又不必设置永久性的参数,可以传递/closeonend参数。

  • /closeonend:0 不自动关闭对话框
  • /closeonend:1 如果没发生错误则自动关闭对话框
  • /closeonend:2 如果没发生错误和冲突则自动关闭对话框
  • /closeonend:3如果没有错误、冲突和合并,会自动关闭
  • /closeonend:4如果没有错误、冲突和合并,会自动关闭

下面的列表列出了所有可以使用TortoiseProc.exe访问的命令,就像上面的描述,必须使用/command:abcd的形式,在列表中,因为节省空间的关系省略了/command的前缀。

3.格式和示例

格式:[svn]  [command:type]  [parms] [closeonend:n]

例如:
(1)update: “C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe” /command:update /path:“”c:\svndir” /rev:n /closeoned:1

(2)checkout: “C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe” /command:update /path:”c:\svndir” /url:”http://192.168.1.1/file” /closeoned:1

(3)commit: “C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe” /command:commit /path:”c:\svndir”  /logmsg:”提交日志”   /closeoned:1

as3 直接生成快捷方式

在web场景中大多数生成快捷方式的做法都是客户端发请求给服务器,然后服务器生成快捷方式文件,在传回快捷方式文件的下载地址,间接完成了需求。

不过在as里面有更酷的做法,直接在内存里面给你生成一个文件让你下载。

/**
* 获取桌面快捷方式配置
* @return
*/
public function getShortCutConf():Object
{
var o:Object={title: “游戏名字标题”, url: “http://www.xxxx/ajaxGameHelper/op/save/code/dtx{sid}/”};
}
return Func.getJSValue(“getShortCutConf”, o);
}
private var _saveLoader:FileReference;
private var shotcutdata:String=””;
private var shotcut_title:String=””;

/**
* 保存桌面快捷方式
*/
public function SaveShortCut():void
{
var shortCutConf:Object=getShortCutConf();
if (shortCutConf is String)
{
navigateToURL(new URLRequest(shortCutConf as String), “_blank”);
}
else if (shortCutConf.url)
{
if (!_saveLoader)
{
var url:String=shortCutConf.url.replace(“{pid}”, ExternalCmd.pid).replace(“{sid}”, ExternalCmd.sid).replace(“{uid}”, ExternalCmd.uid) || “”;
shotcutdata=”[{000214A0-0000-0000-C000-000000000046}]\r\nProp3=19,2\r\n[InternetShortcut]\r\nURL=” + url + “\r\nIDList=”;
shotcut_title=(shortCutConf.title || “游戏名字标题”).replace(“{pid}”, ExternalCmd.pid).replace(“{sid}”, ExternalCmd.sid).replace(“{uid}”, ExternalCmd.uid);

_saveLoader=new FileReference();
}
_saveLoader.save(shotcutdata, shotcut_title + “.url”);
}
}

ActionScript3.0多线程的简单介绍

一.多线程相关的类
MessageChannel
MessageChannelState(closed closing open)
Worker(start() terminate())
WorkerState(new running terminated)
WorkerDomain
Condition
Mutex
二.创建线程

1.Worker的创建(基于三种方式的swf的bytes,效果一样,官方并未说明差异)
_worker=WorkerDomain.current.createWorker(this.loaderInfo.bytes(自身swf) /*other.loaderInfo.bytes(外加载swf)*/ /*WorkerManager.workers_LogicWorker(内嵌swf)*/ );

2.MessageChannel创建
Worker.current主线程
_worker 子线程
var channelToMain:MessageChannel=_worker.createMessageChannel(Worker.current); //子线程到主线程的通道
var channelToWorker:MessageChannel=Worker.current.createMessageChannel(_worker); //主线程到子线程的通道

注意:子线程虽然是一个独立的swf并且继承了显示对象,但是它是一个后台线程,所以是无法用于显示内容的
只用用于辅组计算。

三.线程之间通信
1.收发数据(MessageChannel) send(), recvie()
2.共享数据(Worker) setshared(), getshared()

四.数据传输机制
1.可以使用AMF3序列化的对象,通过序列化和反序列化,然后内存拷贝的方式传输(必须使用 flash.net.registerClassAlias() 函数或 [RemoteClass] 元数据来注册类定义)
2.值类型直接复制值传输
3.可共享内存的对象(Worker,MessageChannel,可共享 ByteArray(其 shareable 属性设为 true 的 ByteArray 对象),Mutex,Condition)

注意:1.普通对象和值类型对象,都是内存拷贝,所有有一定开销
2.可共享内存对象,只是指针的内存地址相同,通过共享内存可以节省内存开销,不用内存拷贝可以增加传输效率。
但是两个线程引用的不是同一个对象。

五.多线程锁
1.web flashplayer操作设置了shareable 属性设为 true 的 ByteArray 对象,多个线程不能同时操作一块内存。
2.air flashplayer(有文件和loader权限) 多个线程不能同时操作一个文件(和同一段内存一样)
注意:和所有语言的多线程一样,如果某块内存或文件,存在多个线程同时修改,则使用互斥锁(mutex)

六.多线程有什么用?怎么用?
1.处理主线程消耗较高的计算
(1)复杂的算法逻辑(10w次循环)
(2)解压和寻路等高消耗高频次操作
2.处理主线程消耗较高的渲染(所以注定使用gpu渲染的地方,多线程帮不了什么忙了)
(1)位图绘制
(2)像素拷贝
3.日志等次要和外部交互的功能
4.多线程文件并发处理(air,权限够就任性)
5.多线程加载并发处理(air,权限够就任性)

Continue reading “ActionScript3.0多线程的简单介绍”

python批处理替换文件中的内容

import re
import os
#读取文件夹,枚举所有文件
def read_dir(rootdir):
    for dirpath, dirnames, filenames in os.walk(rootdir):
        print(‘now is open dir:’, dirpath)
        for filename in filenames:
            fullpath=dirpath+”/”+filename
            print(‘now is reading:’, fullpath)
            read_file(fullpath)
#读取文件
def read_file(path):
    file_object = open(path,’r’,encoding= ‘utf-8’)#gbk
    try:
        all_the_text = file_object.read()
        #print(all_the_text) 打印当前读取的文件
        print(“————–结果—————–“)
        replace_china(all_the_text,path)
    finally:
        file_object.close()
#从指定内容中匹配特定字符
#匹配内容格式:
def replace_china(fileStr,path):
    #xx = u”([\u4e00-\u9fa5]+)”#  监听全局事件  纯中文
    xx = u”([\u4e00-\u9fa5]+)\””#  “监听全局事件”  引号中的中文
    #xx = u”([\u4e00-\u9fa5]+)\”\+”# “监听全局事件”+(    引号包括的中文加特殊符号
    pattern = re.compile(xx)
    results = pattern.findall(fileStr)
    #替换匹配的内容
    for result in results:
        newstr=result+”–测试追加替换一些奇怪的内容new”
        print(result,newstr)
        fileStr=fileStr.replace(result,newstr,1)
    #print(fileStr)
    #写入文件
    file_object = open(path, ‘w’)
    file_object.write(fileStr)
    file_object.close()
#调用入口
if __name__==’__main__’:
    read_dir(“C:/Users/Administrator/Desktop/testdir”)

    #testdir 需要进行替换操作的目录  会替换目录下所有文件

 本文为作者原创转载请标明出处 http://www.ooflash.com/?p=26

使用JSFL打包资源

//打包选中目录的的所有图片到swf
//@enger
//jsfl path=C:\Users\zhangyong\AppData\Local\Adobe\Flash CS5.5\zh_CN\Configuration\Commands

fl.outputPanel.clear();
var dom = fl.getDocumentDOM();
var lib = dom.library;
var URI = fl.browseForFolderURL(“选择素材文件夹…”);
var fileName;
var output=”file:///E|/xy-工作目录/XY2/RES/ui/”;
var replaceDir=”Desktop/”;
var folders={};

////////////////逻辑操作//////////////////////
var paths=URI.split(“/”);
var exportPath=output+paths[paths.length-1]+”.swf”
importFolder(URI);
exportSwf();
//导入图片
function importFolder(folderURI){
var arr=folderURI.split(“/”);
fileName=arr[arr.length-1]; //获取文件名
if(URI==null)
{
fl.trace(“请重新选择操作目录”);
return;
}
var folderContents;
var fitem, i,className;
//文件导入库
folderContents = FLfile.listFolder(folderURI); //第二个参数可以设置获取文件还是文件夹,默认是全部获取
for (i in folderContents) {
fitem = folderContents[i];
if(fitem)
var inx = fitem.lastIndexOf(“.”);
if (inx > 0) {
var ext = fitem.substr(inx+1).toLowerCase(); //扩展名
if (ext == “jpg” ||ext == “png” || ext == “gif”) {
className=getClassName(ext,fitem,folderURI);
folders[fitem]=className;
dom.importFile(folderURI + “/” + fitem); //导入库
}
}
else //文件夹继续递归
{
importFolder(folderURI + “/” + fitem);
}
}
}
//根据文件完成路径获取导出类名称
function getClassName(ext,fitem,folderURI){
var arr=[];
var str;
var temp=folderURI.split(replaceDir)[1];
//拼接后缀
arr.push(ext);
temp=temp.split(“/”);
//拼接目录
while(temp.length)
{
str=temp.shift();
if(str.length){
arr.push(str);
}
}
//拼接名称
arr.push(fitem.substr(0,fitem.lastIndexOf(“.”)));
return arr.join(“.”);
}
//设置导出类
function setClasss(lenLib){
var item;
for (i=0; i<lenLib; i++) {
item = lib.items[i];
if (item.itemType == “bitmap”) {
item.linkageExportForAS = true;
item.linkageExportInFirstFrame = true;
item.linkageBaseClass = “flash.display.BitmapData”;
//导出的类名

item.linkageClassName = folders[item.name];
item.qulity=100; //品质100
}
}
}

//导出资源
function exportSwf(){
var lenLib=lib.items.length;
fl.trace(“正在设置导出类…”);
setClasss(lenLib);//设置导出类
//导出
dom.exportSWF(exportPath);
fl.trace(“恭喜,打包swf操作成功!…”);
////////////////////重新初始化////////////////////
fl.trace(“正在清理场景!…”);
fl.getDocumentDOM().library.selectAll();
fl.getDocumentDOM().library.selectAll(true);
fl.getDocumentDOM().library.deleteItem();
}

本文为作者原创转载请标明出处 http://www.ooflash.com/?p=1