首页 文章 精选 留言 我的

精选列表

搜索[异步训练],共10002篇文章
优秀的个人博客,低调大师

异步社区本周预售新书

《算法详解(卷1)——算法基础》 Tim Roughgarden著 算法详解系列图书共有4卷,本书是第一卷——基础算法。本书共有6章,主要介绍了4个主题,它们分别是渐进性分析和大O表示法、分冶算法和主方法、随机化算法以及排序和选择。附录A和附录B简单介绍了数据归纳法和离散概率的相关知识。本书的每一章均有小测验、章末习题和编程题,这为读者的自我检查以及进一步学习提供了较多的便利。 《PHP和MySQL Web开发学习指南》 [澳] 汤姆·巴特勒(Tom Butler)凯文·雅克(Kevin Yank)著 全书共包括12章。第1章介绍了PHP和MySQL的安装;第2章和第3章,分别简单介绍了MySQL和PHP;第4章将创建一些Web页面;第5章介绍了关系数据库理论;第6章介绍了PHP编程基础;第7章扩展了第6章的主题:第8章讨论正则表达式的应用;第9章探讨了cookie和会话;第10章介绍了MySQL的管理技术;第11章探讨了高级SQL查询技巧;第12章介绍了二进制数据的应用和处理。 《Wireshark网络分析实战(第2版)》 [印度]甘德拉·库马尔·纳纳(Nagendra Kumar Nainar)著 Wireshark是最流行的一款网络嗅探软件。本书以示例方式详细讲解了如何使用Wireshark进行网络分析。通过本书的学习,读者可以掌握如何安装、配置Wireshark,如何使用Wireshark捕获数据,如何来对捕获的数据进行分析,以解决常见的网络问题等。 《量化交易学习指南——基于R语言》 [印度]帕勒姆·吉特(Param Jeet) 普拉桑特·瓦次(Prashant Vats)著 本书包括9章内容,分别从R编程基础、统计建模、计量经济学、小波分析、时序分析、算法交易、机器学习在交易中的应用、风险管理、优化、衍生品定价等内容。几乎每一个小标题都是一个热点,非常值得相关领域的人员学习阅读。 《全程软件测试(第3版)》 朱少民著 本书系统地总结了过去十年中软件测试发生的变化,浓缩了作者许多宝贵的软件测试经验。本书首先介绍对于软件测试的不同看法,全程软件测试的思想,软件测试的基础设施与TA框架、团队能力建设;然后逐步深入到测试的计划、设计、执行、持续反馈和改进;接着,讨论全程测试的思想,包括全程静态测试、全程性能测试、全程安全性、全程建模、全程可视化。本书最后展望了软件测试的未来。 本书适合软件测试人员阅读,也可作为相关专业人士的参考指南。 《RISC-V架构与嵌入式开发快速入门》 胡振波著 本书是一本介绍RISC-V架构嵌入式开发的入门书籍,以通俗的语言系统介绍了嵌入式开发的基础知识和RISC-V架构的内容,力求帮助读者快速掌握RISC-V架构的嵌入式开发技巧。本书共分为两部分。第一部分为第1~14章,基本涵盖了使用RISC-V架构进行嵌入式开发所需的所有关键知识。第二部分为附录部分,详细介绍了RISC-V指令集架构,辅以作者加入的背景知识解读和注解,以便于读者理解。

优秀的个人博客,低调大师

Android 异步消息分发机制

Android的消息机制–主要是指 Handler 的运行机制 和 MessageQueue 、 looper 的工作过程。 MessageQueueMessageQueue 消息队列,用来存储消息,虽然称为消息队列,但是它的存储结构是采用 单链表的数据结构来存储消息队列的。 包含两个操作插入(enqueueMessage) 和 读取(next) enqueueMessage :往消息链表 中插入一条信息 next:从消息列表中读取一天消息,并将其从消息队列中移除,next方法是一个无限循环的方法,如果消息列表里没有消息,那么会一直阻塞在这里。 LooperLooper 消息循环,用来处理消息。 Looper 会不停的从 MessageQueue 中查看是否有新的消息,如果有新消息就会立即处理Looper.java private Looper(boolean quitAllowed) { mQueue = new MessageQueue(quitAllowed); mThread = Thread.currentThread(); } 在 Looper 的构造方法会创建一个MessageQueue,消息队列,然后将当前线程的对象保存起来。 public static @Nullable Looper myLooper() { return sThreadLocal.get(); } private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper(quitAllowed)); } 问题 为什么Looper.prepare() 不能被调用两次?答:因为每次调用 Looper.prepare() 的时候的都会判断 ThreadLocal是否已经存储当前的 Looper 对象,如果已经存在就会抛出异常。 /** * Run the message queue in this thread. Be sure to call * {@link #quit()} to end the loop. */ public static void loop() { final Looper me = myLooper(); if (me == null) { throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread."); } final MessageQueue queue = me.mQueue; // Make sure the identity of this thread is that of the local process, // and keep track of what that identity token actually is. Binder.clearCallingIdentity(); final long ident = Binder.clearCallingIdentity(); for (;;) { Message msg = queue.next(); // might block if (msg == null) { // No message indicates that the message queue is quitting. return; } // This must be in a local variable, in case a UI event sets the logger final Printer logging = me.mLogging; if (logging != null) { logging.println(">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what); } final long traceTag = me.mTraceTag; if (traceTag != 0 && Trace.isTagEnabled(traceTag)) { Trace.traceBegin(traceTag, msg.target.getTraceName(msg)); } try { msg.target.dispatchMessage(msg); } finally { if (traceTag != 0) { Trace.traceEnd(traceTag); } } if (logging != null) { logging.println("<<<<< Finished to " + msg.target + " " + msg.callback); } // Make sure that during the course of dispatching the // identity of the thread wasn't corrupted. final long newIdent = Binder.clearCallingIdentity(); if (ident != newIdent) { Log.wtf(TAG, "Thread identity changed from 0x" + Long.toHexString(ident) + " to 0x" + Long.toHexString(newIdent) + " while dispatching to " + msg.target.getClass().getName() + " " + msg.callback + " what=" + msg.what); } msg.recycleUnchecked(); } } loop 方法就是一个死循环,跳出死循环的方法,是 MessageQueue的 Next 方法为空,即queue.next() 为空。Looper 调用 quit 方法或者 quitSafely 方法,通知消息队列退出,会使 MessageQueue 的 next 方法 返回为空。 loop 调用 MessageQueue 的 next 方法获取新的消息,如果 没有消息,next 方法会一直阻塞在那里,导致 loop 方法也会一直阻塞在那里。 如果 next 方法返回了新的消息,Looper 就会处理新的消息,调用 msg.target.dispatchMessage(msg),msg.target 就是发送这条消息的 Handler 对象(Handler 中有讲解)。这样就把代码逻辑切换到指定线程去执行了。 3. ThreadLocal线程内部的数据存储类, 通过它可以在指定的线程存储数据,而且存储后,只能在指定线程获取存储的数据,其他线程无法获取。 应用:当某些数据是以线程为作用域,并且不同线程具有不同数据 存在Looper中,并不是线程,作用是在每个线程中存储数据 问题:Handler内部是如何获取当前线程的 Looper 的?Handler.java public Handler(Callback callback, boolean async) { if (FIND_POTENTIAL_LEAKS) { final Class<? extends Handler> klass = getClass(); if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && (klass.getModifiers() & Modifier.STATIC) == 0) { Log.w(TAG, "The following Handler class should be static or leaks might occur: " + klass.getCanonicalName()); } } mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); } mQueue = mLooper.mQueue; mCallback = callback; mAsynchronous = async; } 答:Handler 通过 ThreadLocal 获取每个线程的 Looper. ThreadLocal 可以在不同线程中互不干扰的存储并提供数据。 在调用 Looper.prepare() 的时候 “sThreadLocal.set(new Looper(quitAllowed));” - 创建了一个 Looper 实例并将一个Looper的实例放入了ThreadLocal 存储。然后在 Handler 中 调用“mLooper = Looper.myLooper();”-从 sThreadLocal.get() 获取到 Looper 对象。 问题:主线程中为什么可以默认使用Handler?答: 线程默认是没有Looper 的 ,如果要使用 Handler ,就必须为线程创建 Looper. 但是主线程,也就是 UI 线程,它就是 ActivityThread, ActivityThread 被创建的时候默认会初始化 Looper,当前UI线程调用了Looper.prepare()和Looper.loop()方法. Handler主要工作:发送和接收消息; public final boolean sendMessage(Message msg) { return sendMessageDelayed(msg, 0); } public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMillis < 0) { delayMillis = 0; } return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); } public boolean sendMessageAtTime(Message msg, long uptimeMillis) { MessageQueue queue = mQueue; if (queue == null) { RuntimeException e = new RuntimeException( this + " sendMessageAtTime() called with no mQueue"); Log.w("Looper", e.getMessage(), e); return false; } return enqueueMessage(queue, msg, uptimeMillis); } private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; if (mAsynchronous) { msg.setAsynchronous(true); } return queue.enqueueMessage(msg, uptimeMillis); } 由上面可以看出 Handler 发送消息的过程就是向消息链表中插入了一条消息,MessageQueue 的 next 方法会返回这条消息给 Looper,Looper 收到消息,通过msg.target.dispatchMessage(msg) 交给 Handler 处理。 上面 enqueueMessage 方法首先 “msg.target = this;” 会把 this 赋值给 msg.target ,也就是说 把Handler 赋值给 msg的 target 属性。 public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } } 首先会检查 Message的 callback 是否为 null,不为空就处理通过 handleCallback 来处理消息。 callback 是一个 Runnable 接口,就是 Handler 的 post 方法传递的 Runnable 参数 private static void handleCallback(Message message) { message.callback.run(); } 举个栗子 第一种handler 的使用方式,post方法 Handler mHandler = new handler(); mHandler.post(new Runnable() { @Override public void run() { Log.e("TAG", Thread.currentThread().getName()); mTxt.setText("yoxi"); } }); 其次 查看 mCallback 是否为空,mCallback 是个接口 public interface Callback { public boolean handleMessage(Message msg); } Callback 提供另一种使用 Handler 的方式,不想派生Handler的子类,可以通过 Callback 来实现。 举个栗子 第二种使用 Handler 的方式 private Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case value: break; default: break; } }; }; 最后,调用 Handler的 handleMessage 方法来处理消息。 原文发布时间为:2018-08-25本文来自云栖社区合作伙伴“Android开发中文站”,了解相关信息可以关注“Android开发中文站”。

优秀的个人博客,低调大师

CTF训练之OneWayIn

上次的题目counting star领悟透了吗?这次再介绍一道CTF真题吧,本次题目名称是onewayin,会用到代码解密等方面的知识。 今天介绍的CTF题目很有意思的。进入实验链接 OneWayIn,进入实验机操作。实验地址10.1.1.82。 你看到这个界面可以想到些什么呢?我们看到web题肯定首先就是看源码啊。 查看源码发现: 我们来分析一下这个源码。这里说: 当0_usename=0_pwd的时候输出f1() Crc32(0_usename)=Crc32(0_pwd)的时候输出f2() 不然就f3,东哥这里两个字符串的32位CRC相等需要输入的字符串相同吧,这不是跟前面的f1()判断冲突了吗? 这就不知道吧,我们这里是需要利用CRC32函数的一个缺陷,抓包把参数改成数组并且用户名和密码的值不同,如下图: 这样就可以绕过crc32函数了吗?对,不信的话,我们来试验一下把这个数据放至Repeater模块里, 点击go你会发现出现了不同的东西, 再点击跟随跳转, 然后再点击一次跟随跳转, 这出来好多十六进制,当然我们不能只看返回啊,看一下url那里是不是有一个base64编码。 我们把这个base64解密一下居然是test.txt,这里是file=多少。哇,那我们是不是可以进行文件读取。 我们可以试一下,看看能不能读index.php的源码,先把index.php编码, 把编码之后的替换到刚才url参数的位置并点击go。 看上去好像没什么东西啊?就一个<?php没什么用啊。仔细观察的话,可以看见还有一个num参数。改一下这个num参数试一试,感觉应该是解题关键了。我们试一下返回了一些代码,我估计这里的num是表示显示多少行的函数。 果然提交不同的num参数会显示不同的源代码的行(num的值为1的时候显示index.php的第一行源代码)这底下是我记录的代码。 我们分析一下代码根据源码的提示想要访问flag.php,cookie必须有role_cookie这项,并且值为flagadmin。 直接在抓包文件上面构造一个cookie= flagadmin,我们按照这个来读取一下flag.php,这好像乱码了。 不要急,我们可以用curl这个工具把源码下载下来 这打开还是乱码? 嗯...不要急,把这个丢进php环境里看一下会运行出什么。 这是一串base64的编码,我们操作解密一下就知道了,base64解密之后发现flag。 这次的题目也颇有难度,CTF的每一道题感觉都要花不少功夫啊!当然,孰能生巧,熟练掌握这道题的解题技巧,下次碰到类似的题目可以节省很多时间。这道题利用函数缺陷,抓包,提交,解码等过程,都需要熟练掌握才能解题!

优秀的个人博客,低调大师

CTF训练之 CountingStars

今天介绍一道某比赛的真题。 首先我们来进行CTF 练习,进入实验链接:CoutingStars 首先看到题目名称:CoutingStars ,数星星,不知道是代表什么,我们直接进入道题目发现页面: ??数星星?难道是数这个$ 符号有多少个?动动脑经, CTF 哪里有这么简单。 我们来看页面打印了一句话,还是没什么头绪,随意的在输入框中输入,点击提交,答案错误,页面返回Sorry... 这只是测试一下,我们再来查看一下源码,看看有什么头绪。 里面有关键 信息OS : MAC OS 。但是 你知道MAC OS 有一个有名的 .DS_Store 文件泄露敏感信息吗? 请 记住一下,这里应该是解题的关键。我们来访问一下.DS_Store 看来我们找到题目的关键了来看一下我们刚刚下载的文件。 这个.zip 文件是什么?我们访问一下试一试就知道了。 居然又可以下载。看来我们的思路没错我们来看一下这个文件里面是什么。 这一看就是这个题目的源码啊。但是我们要分析这个源码。好像挺麻烦的我们就直接改一下代码吧让他自己输出。 我们是不是输入这一个值就通关了呢? 理论上来说是这样。我们把d0llars 作为答案,输入看一下, 又翻车了?咳咳,应该没错刚刚好像页面闪了一下。这里有什么蹊跷吗?我们用burpsuite 抓包看一下果然 flag 在刚刚闪过的页面里面。 成功获取到了flag 。 3.通关总结 解题过程中遇到的一些困难,你还不能很快的发现并解决吧!知识在于积累,更何况CTF 讲究的是技术比拼,没有丰富的经验和缜密的思维,很难胜人一筹哦!

优秀的个人博客,低调大师

Python | Xpath实战训练

一、前言 今天给大家分享的是,如何在cmd和pycharm中启动自己的spider以及Xpath的基本介绍,并利用Xpath抓取伯乐在线单篇文章基本信息。 二、Xpath介绍 1. 维基百科看 Xpath XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。 XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作 为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询 语言。 2. 我来扯扯Xpath 1. Xpath使用路径表达式在xml和html中进行导航(据说访问速度、效率比bs4快) 2. Xpath包含标准函数库 3. Xpah是一个W3c的标准 3. Xpath基本使用语法 三、看代码,边学

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册