精华内容
下载资源
问答
  • 元素已经使用了很长时间。然而,我觉得有些用例并...现在,让我们看一个简单的示例。这个设计有一个 section title,在它左边有一个小圆圈。当我们将鼠标悬停在section title上时,圆圈会变大。.section-title:b...

    伪元素已经使用了很长时间。然而,我觉得有些用例并不是所有开发人员都完全了解的。我写下这篇文章是为了阐明它们,以便它们能被更多地使用。

    父子元素悬停特效

    由于伪元素属于其父元素,因此存在一些不寻常的用例。现在,让我们看一个简单的示例。

    820df1bd4cbcd01272c07606da55e231.png

    这个设计有一个 section title,在它的左边有一个小圆圈。当我们将鼠标悬停在section title上时,圆圈会变大。

    .section-title:before {
    content: "";
    width: 20px;
    height: 20px;
    background: blue;
    /* Other styles */
    }

    .section-title:hover:before {
    transform: scale(1.2);
    }

    简单明了,接着我们将此概念延伸到更有用的用例。

    项目/博客组

    在我的网站上,有一个部分需要列出了所有的项目名称。我想为每个项目添加一个缩略图,但这对我来说并不是最重要的事情。对我来说,更重要的是链接本身。不久前,我在[Ethan Marcotte][1]网站上首次看到了这种效果。

    6f8a6d356003a0e9bcc0cb33da5381a8.png

    上面的设计模型展示了我想要应用的想法。段落中的每个彩色链接都有一个与之配对的伪元素。

    5e5fe4fdb0ca41b565ee216dace60b20.png

    「HTML」

    Hello, my name is Ahmad. I’m a UX Designer and Front End Developer that enjoys the intersection between design and code. I write on ishadeed.com and a11ymatters.com on CSS, UX Design and Web Accessibility.


    1.向 hero 元素添加 padding

    ef9133d49556dcbe99da47cfbfdc3a7a.png

    我想为伪元素保留空间,所以添加padding是一个解决方案。

    2.对伪元素进行绝对定位

    为了绝对定位它们,我需要定义哪个父类是相对的父类。它应该被添加到hero中 。

    注意以下GIF中的位置:.hero部分中的position: relative是如何影响伪元素的。

    fcd218054081557fed931a5c99fdea88.gif

    3.添加伪元素

    最后一步是添加伪元素及其悬停效果:

    .link-1 {
    color: #854FBB;
    }

    @media (min-width: 700px) {
    .link-1:after {
    content: "";
    position: absolute;
    right: 0;
    top: 20px;
    width: 150px;
    height: 100px;
    background: currentColor;
    opacity: 0.85;
    transition: 0.3s ease-out;
    }

    .link-1:hover {
    text-decoration: underline;
    }

    .link-1:hover:after {
    transform: scale(1.2);
    opacity: 1;
    }
    }

    926d21015e77571c244757ad68ddd6e4.gif

    注意,我使用了currentColor作为伪元素背景色。如果你不知道这个关键字,它表示继承其父元素的color值。所以在任何时候,我想要改变链接的颜色,只改变一次是很容易的。

    98d21ed750b9a3b31e64ad6d00deda3a.gif

    事例源码:https://codepen.io/shadeed/pen/66e9c2039b50463d96a2a9832f05ec0f

    增加可点击区域的大小

    通过向链接添加一个伪元素,链接周围的可点击区域将变得更大。这是非常有用的,将增强用户的体验。我们举个例子:

    7dbe5964c1bcf4e1892e7b61ea7e7f45.png

    此外,它还可以用于扩展卡片组件的可点击区域,该组件具有查看更多链接的功能。请注意,文章的内容(如标题和图像)将位于伪元素之上,因此它不会影响文本的选择或图像的保存。

    e2ed864bec6314bd62799c3775ff2a58.png

    叠加层

    假设有一个带有背景图像的元素,并且设计中有一个渐变叠加层,并且混合模式设置为color,伪元素可以帮到你。

    e5f15a01d6b4839366d5c6c382ad8771.png

    .hero {
    position: relative;
    height: 300px;
    background: url("image.jpg") center/cover;
    }

    .hero:after {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    background-image: linear-gradient(180deg, #851717 0%, #30328C 100%);
    mix-blend-mode: color;
    }

    事例源码:https://codepen.io/shadeed/pen/627c62e16dfa49021960cdc74ce459ba

    包裹的阴影

    过去,我曾经创建过一个在边缘倾斜的阴影。它有一点微妙的效果。你猜怎么了!可以使用伪元素来实现它们。

    3d1d09ddf82bea5fb8897ebd69b239be.png

    创建元素

    使用以下常规样式创建了一个div元素。

    .elem {
    position: relative;
    display: flex;
    align-items: center;
    max-width: 400px;
    background: #fff;
    padding: 2rem 1rem;
    font-size: 1.5rem;
    margin: 2rem auto;
    text-align: center;
    box-sizing: border-box;
    }

    89782e0188df726fd25613bb4492bb0d.png

    添加伪元素

    然后,我为每个元素添加了:before:after伪元素,其宽度为50%(为了更好的演示,我为每个元素添加了不同的背景)

    .elem:before,
    .elem:after {
    content: "";
    position: absolute;
    top: 2px;
    width: 50%;
    height: 100%;
    }

    .elem:before {
    left: 0;
    background: grey;
    }

    .elem:after {
    right: 0;
    background: #000;
    }

    e743f5095aede778576beedc66ceca5d.png

    接下来,添加transform: skew(x),其中X为2度。对于其中之一,X应该为负数以实现所需的效果。

    a627ce3017be4d91d922db32eb4da0df.png

    接下来,我将向每个伪元素添加z-index:-1,以将其移到其父元素的后面。

    完成后,执行以下操作:

    • 添加filter: blur
    • 降低透明度
    • 添加了从透明到黑色的渐变(以隐藏其父级顶部中心的伪元素边缘)

    「最后代码」

    .elem {
    position: relative;
    display: flex;
    align-items: center;
    max-width: 400px;
    background: #fff;
    padding: 2rem 1rem;
    font-size: 1.5rem;
    margin: 2rem auto;
    text-align: center;
    box-sizing: border-box;
    }

    .elem:before,
    .elem:after {
    content: "";
    position: absolute;
    top: 3px;
    width: 50%;
    height: 100%;
    z-index: -1;
    background: linear-gradient(to bottom, transparent, #000);
    filter: blur(3px);
    opacity: 0.3;
    }

    .elem:before {
    left: 0;
    transform: skewY(-2deg);
    }

    .elem:after {
    right: 0;
    transform: skewY(2deg);
    }

    还有另一种选择,即在伪元素:before:after之间交换skewY值。

    b563d108864f47bd30aec9a5be6b5ade.png

    事例源码:https://codepen.io/shadeed/pen/be104604ada76a7fa854bffca1d6b806

    :after VS :before

    在最近的Twitter讨论中,我了解到最好使用:before而不是:after。为什么?因为在使用:after时,可能需要我们向其他嵌套元素添加z-index,以便伪元素不会与它们重叠。我们举一个真实的例子。

    这是一张由缩略图和标题组成的简单卡片。注意到,在文本下方会有一个渐变叠加层,以使文本更清晰,以防缩略图颜色太浅。

    0be4cccfa2189b86660d240a01f8fe6f.png

    Title here



    要在文本下方添加渐变叠加层,我将需要使用伪元素。你会选择哪一个?:before:after?我们来研究看看。

    1. after 元素

    在这种情况下,标题将显示在伪元素叠加图的下方,如下所示:

    ae3cde0a1c5a4a981b1cc57968b072e0.png

    解决方案是在卡片标题中添加z-index。即使这是一个简单快速的解决方案,也不是正确的做法。

    .card-title {
    /*Other styles*/
    z-index: 1;
    }
    2. before 元素

    使用:before元素时,默认情况下可以使用!无需在卡片标题中添加z-index。原因是,使用:before时,该元素不会出现在其他同级项的上方,而当元素为:after时,它将出现在其他同级项之上。

    事例源码:https://codepen.io/shadeed/pen/0032e918818efe33b9016434a98bf6ff

    基于文件扩展名的链接样式

    例如,如果有一个包含PDF文件的链接,则可以添加PDF图标,以使其对用户更清晰。

    面是如何显示链接的PDF图标的示例

    「HTML」

    Download PDF


    Download Doc


    「CSS」

    a[href$=".pdf"]:before {
    content: "";
    display: inline-block;
    vertical-align: middle;
    margin-right: 8px;
    width: 18px;
    height: 18px;
    background: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/182774/np_pdf_377198_000000.svg) center/20px no-repeat;
    padding: 3px;
    }

    1ef25196da5ff588a71d4a18e38b37e1.png

    事例源码:https://codepen.io/shadeed/pen/24ecff4a6e9269d1ee526ec692151af4

    分隔线

    42d72540858a1cb787f36311c0c4eb58.png

    在此示例中,存在带有“or”的分隔符。在每一侧都有一条线。使用伪元素和 Flexbox 可以做到这一点。

    「HTML」

    Or


    「CSS」

    p {
    display: flex;
    align-items: center;
    }

    p:before, p:after {
    content: "";
    height: 2px;
    background: #c5c5c5;
    flex-grow: 1;
    }

    p:before {
    margin-right: 10px;
    }

    p:after {
    margin-left: 10px;
    }

    事例源码:https://codepen.io/shadeed/pen/314cc43ddbd4ac384f02551d8907a323


    作者:ahman  译者:前端小智 来源:css-tricks 原文:https://www.sitepoint.com/hide-elements-in-css/

    相关热门推荐CSS 中你需要知道 auto 的一切!我发现了7个关于 CSS backgroundImage 好用的技巧Web 隐藏技术:几中隐藏 Web 中的元素方法及优缺点Vue 中,如何将函数作为 props 传递给组件如何写出优雅的 JS 代码,变量和函数的正确写法「前端编程挑战 24」HTML+CSS3 实现粘性导航特效5个很棒的 React.js 库,值得你亲手试试!2020年面向前端开发人员的10个很棒的 JS 库通过几个事例,就可以说明 for...of 循环在 JS 是不可或缺

    4643944874b3d1f06a58fdc1a894138d.png

    6e2a31a16c12fe1adf13498442a96fbd.png
    展开全文
  • 笔者目前在开发TI蓝牙芯片,CC2640,在开发一个与手机蓝牙通讯以实现单片机系统联结广域网功能设备。本来想把自己开发过程遇到问题与困难分享出来,但是想到与我一样开发这样设备朋友太少了,写在知乎不大...

    9c9d034764ba26f40848e86d91fb4e88.png

    笔者目前在开发TI的蓝牙芯片,CC2640,在开发一个与手机蓝牙通讯以实现单片机系统联结广域网功能的设备。本来想把自己开发的过程遇到的问题与困难分享出来,但是想到与我一样开发这样设备的朋友太少了,写在知乎不大好,于是还是打算将开发的过程分享到CSDN上。

    https://blog.csdn.net/Clarence_happy/article/details/88838008blog.csdn.net

    在开发CC2640前,笔者先是开发了CC2541,,CC2541是TI推出的蓝牙芯片,功能强大是没说了。这里为什么要提他,因为笔者使用官方提供的SDK开发套件代码的时候,看到了很多优秀的代码编辑方法,CC2541使用了类似TI-RTOS的实时操作系统,但是为什么说是类似的,因为我分明看到主函数的运行内容是C语言清晰可见的逻辑,并没有牵扯到底层堆栈、上下文信息保存、、等等这些操作系统必有的深奥东西,我想到CC2541上运行的也许并不是一个真正的实时操作系统。

    这里笔者粗浅的说一下自己对真正操作系统的理解,希望各位朋友能斧正。

    在51单片机中,笔者认为只有两个线程,一个是主线程,一个是中断线程。主线程运行在main中,是按顺序执行的代码序列,中断线程运行在特定硬件事件发生后,有对应的服务函数。这两个线程最大的特点是,主线程运行后,如果此时中断出现,系统会保护当前的各种重要数据,例如通用寄存器R0-R12和PC寄存器等等,这些信息都保存好,然后重新载入一系列中断服务函数需要的寄存器值,从而实现从主线程跳转到中断线程。

    笔者认为,一个中断服务函数相当于一个中断线程,多个中断服务函数的话,会出现抢占的问题,但是优秀的处理器会处理好这些抢占的问题,例如NVIC不就是管理这些事情的吗?反正笔者认为线程的切换,换汤不换药,就是先保护现场,然后跳转到特定的程序段,覆盖现场,执行完以后回到之前的现场。

    这让笔者联想到交换两变量数值的算法

    //交换a 和 b 里面的数值
    void swap(uint8_t * a , uint8_t *b){
    uint8_t temp;
    temp = *a ; //保护现场,因为*a马上就要被覆盖了
    *a = *b ; //覆盖的事情发生了,这样做以后,程序会跳转
    *b = temp;//回到最初的状态继续运行主函数
    }

    笔者认为,如果RTOS中TASK的概念是建立在上述这样的线程之上的,是真RTOS,因为它是真正的实时抢占的,好比51里面主函数正运行某一个函数,这时中断线程来了,主函数没有执行完,但是不给你执行完的时间了,立刻切换。TASK也是,如果有两个TASK,其中一个TASK正在运行,此时优先级更高的(笔者认为51单片机的主线程是低优先级TASK,任意中断服务函数是高于主线程的TASK)TASK出现,优先级低的TASK立刻保护现场,转而执行到另一个TASK中来!

    这里的真RTOS,笔者认为晦涩,因为和底层芯片级的操作密切相关,微机原理,编译原理,这些太困难,也只有像TI等等这些芯片公司或者FREERTOS这样的开源组织能够提供技术方案。移植真RTOS的时候会发现与底层寄存器相关程度太高了,如果没有前人相应的经验,移植起来实在困难。(这里笔者说的是把FREERTOS的源码移植进自己的工程,而不是使用芯片厂商的一系列开发工具链)

    相对应的,笔者想分享的是假RTOS,类似CC2541提供的操作系统一般,使用时间片轮询法实现一个假的实时操作系统。

    这个假RTOS,笔者在大学的时候和实验室的朋友讨论过,朋友说,有一定的可能WINDOWS就是用的这个假实时的方法。因为电脑的主控速度太快了,你看不出是假实时,又可能是因为人类的输入方式太慢了,人的反应速度太慢了,你根本感受不出来这是假实时。这无从考证,毕竟不开源。随口一提,不必当真!

    笔者认为,如果TASK的概念是基于上下文顺序的,一个任务的执行必须等待上一个正在执行任务结束才能执行的,是伪RTOS,如果主频够快,你也能感受到这两个任务是同时运行一般。

    举个例子吧,按键和LED灯,两个TASK我希望他能通同时运行,并且采用伪操作系统的思维。

    这里写的简单一点,只是想分享方法,伪RTOS需要时钟sysTick来实现延时,在单片机里可以用任意定时器中断来实现它,这里笔者阐明 SYS_TICK会在1ms的时候置1一次,实现方法:在1ms定时器中断函数中将其置1,具体代码不写。

    void toggle_led(void); //执行此函数一次,LED闪烁一次
    bool get_key(void);//执行此函数,如果按下返回false 否则返回true
    //上文阐明SYS_TICK变量会在1ms后置1一次
    extern bool SYS_TICK;
    //创建两个任务,实现检测到按键事件,LED闪烁
    void main(){
    bool task_button_start = false;
    bool task_led_start =false;
    bool button_pressed_message =false;
    uint32_t button_tick=0;
    //一系列硬件初始化
    while(1){
    if(SYS_TICK){
    //此函数类似时间片调度器
    SYS_TICK = false;
    //当查询到SYS_TICK置1,认为1ms已经过去,这里做计时用
    button_tick ++;
    if(button_tick > 100){
    button_tick = 0;
    task_button_start = true; //100ms开启一次key监测任务
    }
    if(button_pressed_message ){
    //发现了按键消息,如果没有收到对应的数据,线程被挂起,这个if永远是false
    button_pressed_message = false;
    toggle_led();
    }
    if(task_button_start){
    task_button_start = false;
    //button task被调度
    if(!get_key())
    button_pressed_message = true;
    }
    }
    }
    }

    显然,这里创建了两个TASK ,一个是LED TASK 这个TASK一般是挂起的,等待KEY被按下的事件触发,BUTTON TASK是100ms执行一次的,由时间片调度器给到开始条件。

    仔细看的话,LED TASK 和 BUTTON TASK的优先级 很明显是 LED TASK优先级高,因为 LED TASK在上下文 BUTTON TASK之前,每次while(1)都先运行LED TASK 然后再运行BUTTON TASK。 当然调度时间片的任务优先级就不谈了,他算不上TASK。

    这里简单的分享了笔者对假RTOS的认识,当然内容还有很多,比如操作系统里的任务管理,TASK之间的消息传递,implement这些接口之后,咱伪RTOS都得一个个实现。

    笔者接下来想写一点关于CC2541里操作系统的实现方法,或许TI的天才工程师创建工程的方法,能给我们开发单片机设备有很多的启发。

    笔者愿分享这些给诸君。如有错误,请诸君提出,我好学习改正!

    今天是主日,愿诸君平安!

    展开全文
  • 作者:jishuzhain原文链接:[原创]恶意代码分析之 RC4 算法学习-『软件逆向』-看雪安全论坛1 摘要RC4(Rivest Cipher 4)是一种基于密钥流加密算法,它密钥长度可变,密钥长度在 1-256 字节范围。它特点是算法...

    作者:jishuzhain

    原文链接:[原创]恶意代码分析之 RC4 算法学习-『软件逆向』-看雪安全论坛

    1 摘要

    RC4(Rivest Cipher 4)是一种基于密钥流的加密算法,它的密钥长度可变,密钥长度在 1-256 字节范围。它的特点是算法简单、运算效率高,而且非线性度良好。它加解密使用相同的密钥,假设定义 RC4 的运算过程是RC4(key,data),那么,密文=RC4(key,明文),明文=RC4(key,密文)。因此也属于对称加密算法,WEP 里也用到了 RC4 算法。

    2 起因

    近期分析多个勒索软件时,会遇到使用 RC4 解密相应字符串或者配置的过程,加之之前阅读过相关的分析报告后也发现存在勒索软件使用 RC4 解密相应的内容的行为,由于笔者之前并未学习过密码学,于是对 RC4 算法进行学习,并相应记录笔记。

    3 原理

    RC4 由伪随机数生成器和异或运算组成,RC4 一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个 S 盒。S 盒用来加密数据,而且在加密过程中 S 盒会变化。

    3.1 伪代码
    出现的几个变量如下:S、K、T、kS S 盒,是一个 256 个字节大小的 char 类型数组,char S[256]K 密钥 K,长度限定在 1-256 个字节T 临时变量 T,大小也是 256 个字节的数组k 输出的密钥流,大小与实际需要加密的内容一致。
    S 盒与临时变量 T 初始化,伪代码如下:for i=0 to 255 doS[i]=i;T[i]=K[ I % K_len ];
    S 盒打乱过程会使用到上述初始化后的 S 与 T 变量,伪代码如下:j=0;for i=0 to 255 doj= ( j+S[i]+T[i]) % 256;swap(S[i],S[j]); //交换
    密钥流的长度与需要加密的明文长度一致,输出密钥流 k[r],伪代码如下:i,j=0;for r=0 to r_len do //r为明文i=(i+1) % 256;j=(j+S[i]) % 256;swap(S[i],S[j]);t=(S[i]+S[j]) % 256;k[r]=S[t];
    加密与解密是一致的,k[r]为之前输出的密钥流,d[r]为加密后的内容,伪代码如下:for r=0 to r_len dod[r] ^= k[r]4 C 语言例子4.1 主文件#include <stdio.h>#include<Windows.h>#include "RC4.h"int main(){unsigned char text[] = "UOIzVDP2Vzs=";unsigned char key[] = "flag{this_is_not_the_flag_hahaha}";unsigned int i;printf("加密前的数据:");for (i = 0; i < strlen((const char*)text); i++)printf("%c", text[i]);printf("n");rc4_crypt(text, strlen((const char*)text), key, strlen((const char*)key));printf("加密后的数据:");for (i = 0; i < strlen((const char*)text); i++)printf("%X", text[i]);printf("n");rc4_crypt(text, strlen((const char*)text), key, strlen((const char*)key));printf("解密后的数据:");for (i = 0; i < strlen((const char*)text); i++)printf("%c", text[i]);printf("n");system("pause");return 0;}4.2 RC4.c#include <string.h>static void rc4_init(unsigned char* s_box, unsigned char* key, unsigned int key_len){unsigned char Temp[256];int i;for (i = 0; i < 256; i++){s_box[i] = i;//顺序填充S盒Temp[i] = key[i%key_len];//生成临时变量T}int j = 0;for (i = 0; i < 256; i++)//打乱S盒{j = (j + s_box[i] + Temp[i]) % 256;unsigned char tmp = s_box[i];s_box[i] = s_box[j];s_box[j] = tmp;}}void rc4_crypt(unsigned char* data, unsigned int data_len, unsigned char* key, unsigned int key_len){unsigned char s_box[256];rc4_init(s_box, key, key_len);unsigned int i = 0, j = 0, t = 0;unsigned int Temp;for (Temp = 0; Temp < data_len; Temp++){i = (i + 1) % 256;j = (j + s_box[i]) % 256;unsigned char tmp = s_box[i];s_box[i] = s_box[j];s_box[j] = tmp;t = (s_box[i] + s_box[j]) % 256;data[Temp] ^= s_box[t];}}4.3 RC4.h#ifndef RC4_H#define RC4_H/*导出rc4_crypt函数,参数为要加密的数据、数据长度、密码、密码长度*/void rc4_crypt(unsigned char* data, unsigned int data_len, unsigned char* key, unsigned int key_len);#endif5 逆向分析5.1 静态分析
    上述代码编译后,得到 RC4.exe,直接载入 IDA 中进行分析,为了效果,使用 release 模式编译,不加载 pdb 文件。先找到 main 函数,如下:

    7e98a1eec35cdc5b3343b4a7faccc010.png


    双击进入 main 函数后,只关注 RC4 加密函数,如下:

    a8204b48411ccf68c82fa5d5ab083bfa.png


    再次双击进入,逻辑非常清晰,存在 3 个循环,如下:

    c3ddf67ed0a7b023b3b0beb85d7b33ae.png


    首先第一个循环是初始化 S 盒与临时变量 T。

    c78a09ec9dbe87d24472f3de079d097f.png

    第二个循环是打乱上面初始化的 S 盒

    b5f85eb39876c0fcb1be44a569dc3495.png

    最后一个循环是输出加密密钥流,最后与明文进行逐字节异或,得到加密的密文。

    a89eb13b1d0b37514627e69145c9f528.png

    5.2 动态分析
    ollydbg 调试 debug 版本,如下:

    720087c63a5107a43ac2671e54501081.png

    3ec0a760c06f3824a09930d97d17bae9.png

    bc0b6da73f14a52cbbf20f79b4d7f682.png

    cd21e72b05437396beb7574d1c63e710.png

    865ed113aca0e862a52d61a3c2c34fe3.png

    6 实际案例
    这里选择一个勒索样本(64a1fbb51ab62f1aa012172b45c8ca15)作为例子,IDA 打开后分析如下:

    10b11302e6ce25ff1098ddf9545cddd4.png


    从最开始的两个函数可以发现极有可能会解密资源,进入第一个函数看看,如下:

    bab05600d9fe87dd1226ae649138d43f.png

    4a6b6ea9530d92bb4dad4acdec00231f.png

    两处循环,次数都为 256 次,第一次循环赋值是按照顺序进行赋值的,相当于之前的初始化 S 盒。

    dd88ecf5bd82c96c6be92ff36cfd48ae.png

    第二个函数进入后发现也是循环后进行赋值,最后有一处是对之前第一个函数得到的值进行相应的异或操作,最后得到一个值。动态调试如下, 0x0040E000 开始的 128 个字节在函数执行后保持不变,而之后的字节数值已经被更改,猜测这 128 个字节是密钥。

    ccf1e29eb6a5ba6807b9cbfd0dbad215.png

    51104da589c650b96b70cd5662f85c5d.png

    执行完该函数后,相关的数据区域确实发生了变化,根据之前的分析猜测是 RC4 算法,本地提取相关区域数据后对其进行手工解密如下,发现结果确实是使用地址 0x0040E000 前 128 个字节(0x80)作为密钥,然后采用 RC4 算法解密后的结果如下,与上图执行完后得到的数据是一致的。

    aa7576f1929b440c8e4c70418b598480.png

    7 总结
    识别点:存在 3 个循环,前两次循环的次数为 256 次,最后一次循环的次数以某个变量的值为限,实质是需要加密(解密)的内容长度,每次循环的最后有一个异或的操作代表加密该内容。

    展开全文
  • 代码整理自 《Hands On Machine Learning with sklearn,Keras and TensorFlow》Chapter 15: Processing Sequences Using RNNs and CNNs。@[toc]1.生成模拟数据import 模拟数据大致模样如下图所示:2.朴素预测方法...

    代码整理自 《Hands On Machine Learning with sklearn,Keras and TensorFlow》Chapter 15: Processing Sequences Using RNNs and CNNs。

    @[toc]

    1.生成模拟数据

    import 

    模拟数据大致模样如下图所示:

    0354b0a038ac2d2b79606b7b53407f39.png

    2.朴素预测方法作为基准预测方法

    预测结果约为 mse=0.019979032。

    ####朴素预测方法(naive forecast)作为预测效果比较
    

    3.预测未来的1个值

    3.1 TensorFlow线性回归预测

    预测结果约为 mse=0.003~0.004,比基准预测效果好得多。

    #### linear regression
    

    3.2 SimpleRNN

    预测结果约为 mse=0.011左右, 只用一个RNN神经元的一层RNN,准确率不如LR。

    #### simple RNN
    

    3.3 多层 SimpleRNN

    预测结果约为 mse=0.0037 。

    #### deep rnn #1
    

    3.4 多层 LSTM

    预测结果约为 mse=0.002 左右,要好于多层SimpleRNN

    #### deep RNN:LSTM
    

    3.5 多层GRU

    预测结果约为 mse=0.002 左右,和多层LSTM差不多。

    # deep RNN:GRU
    

    4. 预测未来的10个值

    亦即 Forecasting Several Time Steps Ahead。下述代码的预测误差mse比上述方法预测mse大,是因为预测未来的多个点是更困难的任务。

    4.1 10次预测10个值:Sequence-to-Vector RNN

    基本思路是要预测第10个点,先用模型预测未来的第1个点;然后未来的第1个点的预测值当做已知的,预测第2个点,以此类推......

    下述代码中,预测结果取决于训练好的单个模型的准确度。

    #### Forecasting Several Time Steps Ahead:forecast a point one time
    

    4.2 1次预测10个值:Sequence-to-Vector RNN

    将RNN的输出改为10,一次预测未来10个点,此时需要重构训练集的构造:label变为10维。

    下述代码,结果约为 mse=0.0188 左右。

    #### Forecasting Several Time Steps Ahead:forecast 10 points one time,sequence-to-vector model
    

    4.3 1次预测10个值:Sequence-to-Sequence RNN

    【自己的理解,供参考】6.2中损失函数计算时候最用了RNN最后输出的向量和标签来计算梯度优化模型,还可以更进一步。每一个time step都给模型一个标签,这样可以更充分的优化模型,进一步提高模型的准确率。此时需要重构标签:在6.2标签的基础上添加time step维度。

    下述代码中,last_time_step_mse=0.0067 左右,要比4.2要好。

    #### Forecasting Several Time Steps Ahead:forecast 10 points one time,sequence-to-sequece model
    

    4.4 1次预测10个值:1-d-CNN+Sequence-to-Sequence RNN

    在4.3的模型开头加上一层1-d cnn,会提高准确率。

    需要注意的是:输入维度为[7000,50,1],经过下面代码中的CNN之后,输出的维度为[7000,24,20](因为kernel_size=4,stride=2),这个维度再经过后面的两层SimpleRNN,模型的输出维度为[7000,24,10],因此此时需要将原来的label(尺寸为[7000,50,10]),进行截取操作,由Ytrain[:, 3::2]之后,得到的维度就是[7000,24,10]。Y_valid同理。

    下述代码中,last_time_step_mse=0.0039左右。

    #### 1d-CNN+RNN
    

    5. 总结

    在本实验中:

    (1)预测未来1个值的时候:LSTM和GRU预测准确度最高,线性回归训练速度比二者快一些;

    (2)预测未来10个值的时候:准确率的关系CNN+RNN>S-to-S RNN> S-to-V RNN,而且CNN+RNN训练速度快。

    展开全文
  • 对于业务开发来说,业务逻辑的...首先可读性,不言而喻,过多的if-else代码和嵌套,会使阅读代码的人很难理解到底是什么意思。尤其是那些没有注释的代码。其次是可维护性,因为if-else特别多,想要新加一个分支的时...
  • 对于业务开发来说,业务逻辑的复杂是必然的。...首先可读性,不言而喻,过多的 if-else 代码和嵌套,会使阅读代码的人很难理解到底是什么意思。尤其是那些没有注释的代码。其次是可维护性,因为 if-else 特...
  • 伪代码的基本思想是a)使复杂代码易于理解,或b)表达一个想法,即你将要编写代码/尚未想出如何编写代码。在例如,如果我要制作一个需要从数据库中读取信息的工具,将其解析为字段,只获取用户请求的信息,然后格式化...
  • Apriori算法详解之【二、伪代码例子

    万次阅读 多人点赞 2013-06-09 10:55:53
    上一篇文章中对Apriori算法进行了简单的描述(Apriori算法详解之【一、相关概念和核心步骤】http://blog.csdn.net/lizhengnanhua/article/details/9061755),现在用伪代码实现,及对经典例子进行描述(红兰PPT上之...
  • 教你写一手漂亮的伪代码(详细规则&简单实例)

    千次阅读 多人点赞 2020-06-11 10:12:41
    文章目录前言伪代码的7个主要部分1.算法名称2.指令序列3.输入/输出4.分支选择5.赋值6.循环7.算法结束补充举个例子说明 前言 最近在复盘《算法设计与分析》这门课程的时候,发现老师写得一手漂亮的伪代码,着实羡慕...
  • 一般来说论文中算法的伪代码生成是比较简单,所以我只给出两种方法algorithm 宏包usepackage{algorithm}usepackage{algorithmic}我给出两种例子,足够平时使用:官方用例如下:begin给出另一个我实际论文中写法...
  • 一般来说论文中算法的伪代码生成是比较简单,所以我只给出两种方法algorithm 宏包usepackage{algorithm}usepackage{algorithmic}我给出两种例子,足够平时使用:官方用例如下:begin{algorithm} caption{Calculate...
  • 我发现自己在使用PythonSocket Server...我将努力挖掘一些我过去用过例子。在如果您正在寻找一站式解决方案,我建议您研究一下Twisted。有一个明确学习曲线,但它可能值得你这样做。请注意,如果您想使用...
  • 伪代码

    千次阅读 2018-06-10 17:22:20
    1. 组成 : 简单计算机语言 + 人类语言(自然语言) + 逻辑符号等;2. 例子 : Begin 输入 a,b,c IF a&gt;b 则 a→Max 否则 b→Max IF c&gt;Max 则 c→Max Print Max End 。3. 介于自然语言和编程语言...
  • quotecodequote是一种使伪代码具有功能编程语言 介绍 您是否曾经浏览过BogosortWikipedia文章,却无法以您选择语言实现伪代码? 别无所求,因为quotecodequote是适合您语言! quotecodequote本质上是详尽...
  • 算法结束补充举个例子说明前言最近在复盘《算法设计与分析》这门课程的时候,发现老师写得一手漂亮的伪代码,着实羡慕不已,看他写其实已经知道大致写伪代码的规则,但本着严谨的态度,还是系统的学习和整理出来。...
  • WebRTC通信相关API非常多,为避免篇幅过长,文中部分采用了伪代码进行讲解。详细代码例子可以在笔者Github上找到,有问题欢迎留言交流 前文链接: WebRTC:会话描述协议 WebRTC:连接建立过程网络穿透 相关...
  • K-近邻算法的伪代码: 对未知类别属性中点分别依次执行以下操作: 1.计算出当前点与已知类别数据集中距离; 2.按照距离大小从小到大排序; 3.选出与当前点距离最小前K个点; 4.确定这前K个点所在...
  • 第一章写了编程精义详细写出了编程是简单的。举愚公移山的例子,既写出了我们中华文化源远流长,博大精深,千百年前就有了编程思想,也引出了结构概念,虽我之死,有存焉”,这里描述了可能存在分支结构,即...
  • 效果图 文件目录布局 webvtt.vtt文件设置在各个时间段显示详细文字, ...css中可以通过元素设置字幕样式 html全部代码 <!DOCTYPE html> <html> <head> <meta name='viewpor...
  • A和B有一个单向关联关系,现在要为A增加一个属性boolean resident,该属性值有如下简单的业务逻辑决定(伪代码):if(a.x == a.b.x)resident = true;elseresident = false;前台查看页面需要显示这个值,当用户修改...
  • 一个非常简单的例子,反映了很多开发人员通病 ...A和B有一个单向关联关系,现在要为A增加一个属性boolean resident,该属性值有如下简单的业务逻辑决定(伪代码): if(a.x == a.b.x)resident = true;else re...
  • 客户/服务器通信模式 TCP/UDP协议推动了客户/服务器通信模式广泛运用。在通信个进程中,一个进程为客户进程,另一个为服务器进程。...以下伪代码演示了服务器进程大致工作流程: while(true){ ...
  • 谁能用真实代码的例子告诉我什么是循环引用吗? 什么 ObjectA *a = [ObjectA alloc]; ObjectA *b = [a copy]; 这样的伪代码就不要了! 因为一般ObjectA都没有实现copy方法! ![CSDN移动问答][1] [1]: ...
  • k 临近算法的伪代码,对位置类别属性数据集中每个点依次执行以下操作: 计算已知类别数据集中每个点与当前点之间距离; 按照距离递增次序排序; 选取与当前点距离最小k个点; 确定前k个点所在类别出现...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 343
精华内容 137
关键字:

伪代码的简单例子