插播 OOP讲解 (转)

苹果CMS视频采集与播放器整合完全指南 本文还有配套的精品资源,点击获取 简介:苹果CMS是一款用于视频网站搭建的开源内容管理系统,提供包括视频发布、管理和展示在内的功能。本文详细介绍了苹果CMS的一键采集和播放器整合方法,包括采集过程中的网页解析、网络爬虫、数据清洗转换技术,以及如何选择和配置播放器软件,与系统后台无缝对接。同时探讨了利用ImageMagick进行图像处理,以及PHP开发中必须掌握的技能,如数据... 阅读详情

经过一段时间的学习,对于 OOP ,对于 AS3 已经有了初步的认识与了
解,后面的教程都会用 ActionScript 3.0 语言进行讲解。对于学习者
来说掌握 OOP 设计思想是非常重要的,但这确实需要一些时间进行学
习。这对于程序员也提出了更高的要求,不仅要有抽象思维,还要有形
象化思维(后面的教程会举一些具体的例子)。有人说“ AS3.0 最适
合作为入门 OOP 语言来学习。”,说明我们不仅学习了 AS3 这门语言
本身,而且也能以它作为学习其它 OOP 语言的踏板。
    这些迹象都表明,学习 AS3.0 还是有价值的。虽然它让小程序(玩
具程序)变得复杂,但是它使得大项目带来的改变是显而易见的。虽然
每一次改革都是一把双刃剑,但是当利大于弊的时候我们有理由接受
它。
    这里是我们迈向 AS3.0 的起点,让我们共同努力,进入这个全新
的世界。
    最后原网名“FL 基理大师”更名为“FL 车在臣”,一来是为了迎
接奥运会的召开,二来是为了适应国际化市场。呵呵,越说越不沾边了。
    在这个 3F 时代(浮躁,腐败,肤浅),要在默念切勿沾染这些三
俗的气节。学习就要耐得住寂寞。是的,这也需要锻炼。
    ——呵呵,半年报就写到这里,不搞形式主义了。

 

as3制作 LRC 歌词同步

 

一、准备工作
    既然要制作歌词同步程序,首先要准备一首歌,我们就以“周杰伦-青花瓷”为例。首
先要下载这首“青花瓷.mp3”,保存为“C:\My Player\Music\青花瓷.mp3”。还要下载青
花瓷的 LRC 文件,大家可以到网上下载(地址见附录),将文本内容保存为“C:\My
Player\LRC\青花瓷.lrc”。我们的程序(类和 FLA)则保存在“C:\My Player\”文件夹下。
青花瓷.lrc 文件:
[ti:青花瓷]
[ar:周杰伦]
[al:我很忙]
[by:张琪]
[00:00.00]发送短信 18 到 291199 下载该歌曲到手机
[00:01.11]青花瓷
[03:36.49]
[00:21.39]素眉勾勒秋千话北风龙转丹
[00:26.08]屏层鸟绘的牡丹一如你梳妆
[00:30.46]黯然腾香透过窗心事我了然
[00:34.93]宣纸上皱边直尺各一半
[00:39.49]油色渲染侍女图因为被失藏
[00:43.83]而你嫣然的一笑如含苞待放
[00:48.30]你的美一缕飘散
[00:50.77]去到我去不了的地方
[02:23.97][00:55.77]
[03:01.92][02:25.63][00:56.90]天正在等烟雨
[03:03.57][02:27.91][00:58.99]而我在等你
[03:05.92][02:30.44][01:00.93]炊烟袅袅升起
[03:07.76][02:32.25][01:03.49]隔江千万里
[03:10.36][02:34.85][01:05.84]在平地书刻你房间上的飘影
[03:14.67][02:38.73][01:09.87]就当我为遇见你伏笔
[03:18.83][02:43.35][01:14.34]天正在等烟雨
[03:21.20][02:45.60][01:16.68]而我在等你
[03:23.71][02:48.01][01:18.99]月色被打捞起
[03:25.74][02:50.10][01:21.18]掩盖了结局
[03:28.33][02:52.54][01:23.72]如传世的青花瓷在独自美丽
[03:32.30][02:56.67][01:27.65]你眼的笑意
[01:50.25]色白花青的景已跃然于碗底
[01:54.69]临摹宋体落款时却惦记着你
[01:59.22]你隐藏在药效里一千年的秘密
[02:03.75]急溪里犹如羞花沾落地
[02:08.32]林外芭蕉 惹咒语
[02:10.57]梦幻的铜绿
[02:12.84]而我路过那江南小镇的等你
[02:17.19]在泼墨山水画里
[02:19.75]你从墨色深处被隐去
    大家也可以把这个文本内容复制下来,然后在“C:\My Player\LRC\”下创建一个文本
文档,将内容粘贴上去,再将文档保存为“青花瓷.lrc”,注意扩展名是“.lrc”。
二、LRC 内容分析
    准备工作完成了,下面分析一下这个 LRC 文件。之所以叫 LRC ,是因为它是 Lyric (歌
词) 的缩写。这种格式真是一目了然,前面“[ ]”中的数字表示其后歌词的开始时间。例
如,“[01:50.25]色白花青的景已跃然于碗底”表示在 1 分 50.25 秒时,歌词内容是“色白
花青的景已跃然于碗底”。
    还有一种形式是“[03:01.92][02:25.63][00:56.90]天正在等烟雨”  这种形式常用于赋
格部分(俗称:歌曲的高潮部分),它表示在 03:01.92, 02:25.63, 00:56.90 时的歌词都
是“天正在等烟雨”。由于这种形式的存在,使后面的编程稍显复杂,不过没关系,凭借各
位的聪明智慧一定没问题。

三、预备知识
1. ActionScript 3 中默认使用 Unicode 来解码外部文件,如果读取的文本不是 Unicode
编码,而是按照操作系统代码页编写的,比如 GB2312,那么需要先导入
flash.system.System 类,并在加载外部文本的语句前将 System.useCodePage 设为 true,
默认情况下为 false,即默认不使用操作系统页解码。
    如果 System.useCodePage = false 且外部 LRC 文件编码格式是 ANSI 的话,那么显
示的中文歌词会是乱码。解决办法有两个:一是,将外部 LRC 文件编码格式改为 Unicode;
二是,不改变外部文件编码格式,只在文档类中加入一句 System.useCodePage=true 即可。
由于后一种方法使用简便,我们就采用第二种方法。

2.读取声音:
  var sound:Sound=new Sound();
  sound.load(new URLRequest("Music/青花瓷.mp3"));
3.播放声音及获取当前播放时间(毫秒):
  var sc:SoundChannel;
  var sound:Sound=new Sound();
  sound.load(new URLRequest("Music/青花瓷.mp3"));
  sc=sound.play();
  stage.addEventListener(Event.ENTER_FRAME,EnterFrame);
  function EnterFrame(evt:Event):void {
    trace(sc.position);
  }
 这里将 sc 声明为全局变量(或类变量),因为在多个方法中都要使用它。
4.读取外部文件:
   var loader:URLLoader=new URLLoader();
   loader.load(new URLRequest("LRC/青花瓷.lrc"));
   loader.addEventListener(Event.COMPLETE,LoadFinish);
   function LoadFinish(evt:Event):void {
    trace(evt.target.data);
  }
5.将字符串按分隔符分隔为数组(String.split):
   var str:String="FL Basic Theory Master";
   var array:Array=str.split(" ");
  trace(array);
  //输出数组:[[FL],[Basic],[Theory],[Master]]
   str=" http://blog.sina.com.cn/yyy98";
   array=str.split(".");
  trace(array);
  //输出数组:[[http://blog],[sina,com],[cn/yyy98]]
6.简单的正则表达式应用:
1>获取匹配次数:
  var Pattern:RegExp=/Window/g;
  //意思是所有名为“Window”的字符串
  var str:String="Windows seems like a Window, so called Windows OS! ";
  trace(str.match(Pattern).length)
  //结果:3
2>获取正确匹配:
  var foo:RegExp=/[0-3][0-9]\/[0-1][0-9]\/[0-2][0-9][0-9][0-9]/g;
  //意思是所有格式为“日/月/年”的字符串
  var str:String="Date Format: 2006/12/25 2006-12-25 12/25/2007 25/12/2007"
  trace(str.match(foo))
  //结果:25/12/2007

7.字符串取子串操作(String.substr):
  var str:String="[03:01.92][02:25.63][00:56.90]天正在等烟雨";
  trace(str.substr(0,30));
  //从 0 号索引开始,取 30 个字符
  //结果:[03:01.92][02:25.63][00:56.90]
  trace(str.substr(30));
  //只写一个参数,表示从该索引处到字符串结束位置
  //结果:天正在等烟雨
8.数组排序中比较函数的应用:
  var a:Object={price:20,number:3};
  var b:Object={price:10,number:7};
  var c:Object={price:50,number:1};
  var amountAry:Array=[a,b,c];
  function compare(paraA:Object,paraB:Object):int {
    var resultA =paraA.price*paraA.number;
    var resultB =paraB.price*paraB.number;
    if (resultA > resultB) return 1;
    if (resultA < resultB) return -1;
    return 0;
  }
  amountAry.sort(compare);
  trace(amountAry[0].price); //输出:50
  trace(amountAry[1].price); //输出:20
  trace(amountAry[2].price); //输出:10
四、LRC 的读取与存储转换(使用文档类设计)
1.读取 LRC 文件,这一步非常简单与读取普通的文本文件是一样的;
  public function LRCPlayer() {
    var loader:URLLoader=new URLLoader();
    loader.load(new URLRequest("LRC/青花瓷.lrc"));
    loader.addEventListener(Event.COMPLETE,LoadFinish);
  }
  function LoadFinish(evt:Event):void {
    trace(evt.target.data);
  }
2.将读取的 LRC 数据按行分割( "\n" 为换行符),数组的每一个元素代表 LRC 的一行内
容;
  function LoadFinish(evt:Event):void {
    var list:String=evt.target.data;
    var listarray:Array=list.split("\n");
    trace(listarray);
  }
3.在数组中提取每一行的时间及歌词,解决单时间序列的问题;
(注意!此段代码只作讲解,不以应用)
LRC 内容如下:
[00:43.83]而你嫣然的一笑如含苞待放
[00:48.30]你的美一缕飘散
[00:50.77]去到我去不了的地方
[03:01.92]天正在等烟雨
[03:03.57]而我在等你
[03:05.92]炊烟袅袅升起
[03:07.76]隔江千万里
代码如下:
  function LoadFinish(evt:Event):void {
    var list:String=evt.target.data;
    var listarray:Array=list.split("\n");
    for (var i=0; i < listarray.length; i++) {
     var info:String=listarray[i];
     //提取每行内容,用变量 info 保存
     var lyric:String=info.substr(10);
     //将歌词内容提取到 lyric 变量中
     var ctime:String =info.substr(0,10);
     //提取时间序列字串
     var ntime:Number=Number(ctime.substr(1,2))*60+Number(ctime.substr(4,5));
     //将时间字串转换为计算机可读取的时间
     var obj:Object=new Object();
     obj.timer=ntime*1000;
     obj.lyric=lyric;
     LRCarray.push(obj);
     //将时间与歌词保存到一个 Object 中,并压入 LRCarray 数组
     trace(obj.timer,obj.lyric);
    }
  }
输出结果:
43830 而你嫣然的一笑如含苞待放
48300 你的美一缕飘散
50770 去到我去不了的地方
181920 天正在等烟雨
183570 而我在等你
185920 炊烟袅袅升起
187760 隔江千万里

 

4.在 LRC 文件,还有多时间序列的存在,所以单时间序列算法不能满足实际需要,下面就来
解决多时间序列问题;
LRC 内容如下:
[00:43.83]而你嫣然的一笑如含苞待放
[00:48.30]你的美一缕飘散
[00:50.77]去到我去不了的地方
[03:01.92][02:25.63][00:56.90]天正在等烟雨
[03:03.57][02:27.91][00:58.99]而我在等你
[03:05.92][02:30.44][01:00.93]炊烟袅袅升起
[03:07.76][02:32.25][01:03.49]隔江千万里
代码如下:
  function LoadFinish(evt:Event):void {
    var list:String=evt.target.data;
    var listarray:Array=list.split("\n");
    var reg:RegExp=/\[[0-5][0-9]:[0-5][0-9].[0-9][0-9]\]/g;
   //建立正则表达式,范围:[00:00.00]~[59:59.99]
    for (var i=0; i < listarray.length; i++) {
     var info:String=listarray[i];
     //提取每行内容,用变量 info 保存
     var len:int=info.match(reg).length;
     //该行拥有时间序列的个数
     var timeAry:Array=info.match(reg);
     //将匹配的时间序列保存到 timeAry 数组中
     var lyric:String=info.substr(len*10);
     //根据每个时间序列占 10 个字符,找出歌词内容的起点
     //将歌词提取到 lyric 变量中
     for (var k:int=0; k < timeAry.length; k++) {
      var obj:Object=new Object();
      var ctime:String=timeAry[k];
      var ntime:Number=Number(ctime.substr(1,2))*60+Number(ctime.substr(4,5));
       obj.timer=ntime*1000;
       obj.lyric=lyric;
       LRCarray.push(obj);
       trace(obj.timer,obj.lyric);
     }
     //将时间序列转换为毫秒并与歌词一起保存为一个数组元素
    }
  }
输出结果:
43830 而你嫣然的一笑如含苞待放
48300 你的美一缕飘散
50770 去到我去不了的地方
181920 天正在等烟雨
145630 天正在等烟雨
56900 天正在等烟雨
183570 而我在等你
147910 而我在等你
58990 而我在等你
185920 炊烟袅袅升起
150440 炊烟袅袅升起
60930 炊烟袅袅升起
187760 隔江千万里
152250 隔江千万里
63490 隔江千万里
5.将获得的 LRCarray 数组按起始时间排序,这对于按序读取歌词有重要意义;
  LRCarray.sort(compare);
  private function compare(paraA:Object,paraB:Object):int {
    if (paraA.timer > paraB.timer) {
     return 1;
    }
    if (paraA.timer < paraB.timer) {
     return -1;
    }
    return 0;
  }
结果如下:
43830 而你嫣然的一笑如含苞待放
48300 你的美一缕飘散
50770 去到我去不了的地方
56900 天正在等烟雨
58990 而我在等你
60930 炊烟袅袅升起
63490 隔江千万里
145630 天正在等烟雨
147910 而我在等你
150440 炊烟袅袅升起
152250 隔江千万里
181920 天正在等烟雨
183570 而我在等你
185920 炊烟袅袅升起
187760 隔江千万里
6.最后,随着音乐的播放,读取播放时间段内的歌词。用当前播放时间与 LRCarray 中的时
间相比较,如果当前时间小于 LRCarray[i].timer 的时间,那么就显示
LRCarray[i-1].lyric 的歌词。为什么要显示 [i-1] 的歌词呢?比如说当前播放到第 500
秒,读取的 LRCarray[20].timer 时间是 400 秒,那么 i++ 。下一次读取的
LRCarray[21].timer 时间是 700 秒, 这时当前播放时间小于读取的这个时间,就说明当前
的第 500 秒仍处于 LRCarray[20].timer 的时间范围内。
  var lrc_txt:TextField=new TextField();
  var LRCarray:Array=new Array();
  var sc:SoundChannel;
  public function LRCPlayer() {
    lrc_txt.width=500;
    lrc_txt.selectable=false;
    addChild(lrc_txt);
    //歌词在文本 lrc_txt 中显示
    var loader:URLLoader=new URLLoader();
    loader.load(new URLRequest("LRC/青花瓷.lrc"));
    loader.addEventListener(Event.COMPLETE,LoadFinish);
  var sound:Sound=new Sound();
  sound.load(new URLRequest("Music/青花瓷.mp3"));
  sc=sound.play();
  //播放声音,并生成 sc 变量,SoundChannel 类的实例
  stage.addEventListener(Event.ENTER_FRAME,SoundPlaying);
  //实时刷新歌词
}
function SoundPlaying(evt:Event):void {
  for (var i=1; i < LRCarray.length; i++) {
    if (sc.position < LRCarray[i].timer) {
      lrc_txt.text=LRCarray[i-1].lyric;
      break;
      //找到歌词,跳出循环体
    }
    lrc_txt.text=LRCarray[LRCarray.length-1].lyric;
   //找不到歌词,说明已超出了最后一句的时间,因此显示最后一句歌词
  }
}
五、全部代码(文档类 LRCPlayer.as):
package {
 import flash.display.Sprite;
 import flash.net.URLRequest;
 import flash.net.URLLoader;
 import flash.media.Sound;
 import flash.media.SoundChannel;
 import flash.events.Event;
 import flash.text.TextField;
 import flash.system.System;
 public class LRCPlayer extends Sprite {
  var lrc_txt:TextField=new TextField();
  var LRCarray:Array=new Array();
  var sc:SoundChannel;
  public function LRCPlayer() {
    System.useCodePage=true;
    lrc_txt.width=500;
    lrc_txt.selectable=false;
    addChild(lrc_txt);
    var loader:URLLoader=new URLLoader();
    loader.load(new URLRequest("LRC/青花瓷.lrc"));
    loader.addEventListener(Event.COMPLETE,LoadFinish);
    var sound:Sound=new Sound();
    sound.load(new URLRequest("Music/青花瓷.mp3"));
    sc=sound.play();
    stage.addEventListener(Event.ENTER_FRAME,SoundPlaying);
  }
  function SoundPlaying(evt:Event):void {
    for (var i=1; i < LRCarray.length; i++) {
   if (sc.position < LRCarray[i].timer) {
     lrc_txt.text=LRCarray[i-1].lyric;
     break;
   }
   lrc_txt.text=LRCarray[LRCarray.length-1].lyric;
  }
}
function LoadFinish(evt:Event):void {
  var list:String=evt.target.data;
  var listarray:Array=list.split("\n");
  var reg:RegExp=/\[[0-5][0-9]:[0-5][0-9].[0-9][0-9]\]/g;
  for (var i=0; i < listarray.length; i++) {
   var info:String=listarray[i];
   var len:int=info.match(reg).length;
   var timeAry:Array=info.match(reg);
   var lyric:String=info.substr(len*10);
   for (var k:int=0; k < timeAry.length; k++) {
     var obj:Object=new Object();
     var ctime:String=timeAry[k];
     var ntime:Number=Number(ctime.substr(1,2))*60+Number(ctime.substr(4,5));
     obj.timer=ntime*1000;
     obj.lyric=lyric;
     LRCarray.push(obj);
   }
  }
  LRCarray.sort(compare);
}
private function compare(paraA:Object,paraB:Object):int {
  if (paraA.timer > paraB.timer) {
   return 1;
  }
     if (paraA.timer < paraB.timer) {
      return -1;
     }
     return 0;
   }
  }
}

 


六、*无处不在的优化
      至此,该程序已经可以顺利执行了,此处只讨论一下优化问题,看不懂可以跳过。
以这段代码为例:
  function SoundPlaying(evt:Event):void {
   for (var i=1; i < LRCarray.length; i++) {
     if (sc.position < LRCarray[i].timer) {
      lrc_txt.text=LRCarray[i-1].lyric;
      break;
     }
     lrc_txt.text=LRCarray[LRCarray.length-1].lyric;
   }
  }
如果要进行优化,那么这个 for 循环,应该写成:
   for (var i=1,j=LRCarray.length; i < j; i++) {… …}
这样在执行判断时,不必每次都进行 LRCarray.length 操作,该操用于读取数组长度,执
行 Array 类的 length 方法,属于高级操作,花费的时间要比低级操作多。其实,只要读
取一次长度,然后将结果保存在变量 j 中,每次判断时读取 j 的值即可。取值与赋值都属
于低级别的操作,  速度较快。同样的道理, if (sc.position < LRCarray[i].timer) {… …}
                                        在
中的 sc.position 在每次判断时都要读取一遍,这时就应将它在循环之前保存到一个变量
里,这段代码优化后应是这样:
  function SoundPlaying(evt:Event):void {
   var now:Number=sc.position;
   for (var i=1,j=LRCarray.length; i < j; i++) {
     if (now < LRCarray[i].timer) {
      lrc_txt.text=LRCarray[i-1].lyric;
      break;
     }
     lrc_txt.text=LRCarray[j-1].lyric;
   }
  }
      在我们的文档类中还有几个地方用到了 for 循环,请大家按照上述方法自行优化。
      其实,代码优化无处不在,其中的学问不胜枚举,有兴趣的朋友可以到我的博客中看一
下关于代码优化的总结贴,见附录。
七、附录
1.LRC 文件下载地址:
http://lrc.bzmtv.com/
http://www.5ilrc.com/
2.至于 MP3 的下载,我想大家比我在行,用百度或酷狗都可以。
3.代码优化总结贴地址:
http://blog.sina.com.cn/s/blog_3ecb9b11010086wi.html
4.整个文件包括(歌曲、歌词、LRCPlayer.as 、FLA 文件)打包下载:
 http://www.fs2you.com/zh-cn/files/cf760b0f-01a0-11dd-9174-0014221f3995/
八、结束语
     恭喜您坚持到了现在,确实内容比较长,同时也涉及了一些知识点。其实做法肯定不只
这一种,所以希望大家多多发挥主观能动性,结合上述内容继续将这个播放程序做大做强。
好了,就到这里,再次感谢。

如果转载中有什么错漏请指出来 好及时更正~~

 

 

(如果要转载请注明出处http://blog.sina.com.cn/jooi,谢谢)

当LightGBM推理遇上GPU:3种替代方案性能对比(含ONNX实战代码) 本文针对LightGBM官方不支持GPU推理的性能瓶颈,深度评测了RAPIDS cuML、ONNX Runtime GPU和Triton Inference Server三种GPU加速推理替代方案。通过详尽的性能对比和实战代码,为高并发、低延迟的在线预测场景提供了清晰的选型指南,帮助工程师打破推理性能枷锁,实现显著的吞吐量提升。 阅读详情

相关推荐

海康视觉脚本开发全流程解析

本文详细解析了海康机器视觉平台(VM)中脚本模块的开发全流程。从创建第一个脚本模块入手,深入讲解了输入参数、输出参数与内部变量的定义与区别,并提供了C#脚本编写、公用函数调用、代码结构组织以及编译调试的实用指南。旨在帮助开发者掌握海康视觉脚本开发的核心技巧,高效实现复杂的自定义视觉逻辑处理。

beer8的博客 603

AS3 中文乱码解决的一种方式

flash中的2个直接转换的函数: unescape(String);//把URL编码转换成普通字符 escape(String);//把字符转换成URL编码

Makenna's World 645

汇川EASY系列之以太网通讯(MODBUS_TCP做从站)

汇川easy系列PLC做MODBUS_TCP从站,,ModbusTCP服务器默认开启,无需设置通信协议(即不需要配置),端口号为“502”。ModbusTCP从站最多支持31个ModbusTCP客户端(ModbusTCP主站)同时连接。

这是一个长期关注工控行业技术的博客,实现0-1的突破,期待您的关注和留言 8907

针对当前火热的人工智能、AIoT、异构计算等热门技术谈谈我的认知

几年前,专门为嵌入式工程师打造的C语言进阶视频教程:C语言嵌入式Linux高级编程,收到了几千名学员的中肯建议和好评。独家GNU C扩展语法精讲,帮你破解阅读Linux内核驱动,或者GNU开源软件源码时,各种稀奇古怪的GCC编译器扩展语法。首家使用ARM平台和反汇编,深度讲解程序的编译、链接、运行和安装原理,深度讲解程序运行时的堆栈内存管理、栈溢出攻击实例。结合嵌入式开发的常用三种场景:裸机环境、RTOS、Linux,分析总结三种场景下的内存管理,让你一览整个嵌入式开发环境概貌。针对当前火热的人工智能、AI

linlaoshi2009的博客 336

TCP报文 Flood攻击原理与防御方式

TCP交互过程中包含SYN、SYN-ACK、ACK、FIN和RST报文,这几类报文也可能会被攻击者利用,海量的攻击报文会导致被攻击目标系统资源耗尽、网络拥塞,无法正常提供服务。接下来我们介绍几种常见的Flood攻击的原理和防御方式。

qq_32044265的博客 4222

cmw500 lte非信令测试_WiFi信令测试在研发过程中的作用

  1、关于信令测试的故事  2016年的某天,某著名网络产品公司技术负责人致电寻求技术支持:我们的无线路由器遇到了一个困惑:我们某款路由器应用于实际WiFi网络中时,WiFi终端接入非常困难。但是我们使用测试工具检测此路由器,它的所有物理射频指标都非常优异。不知道是为什么?  我来到了测试现场看到:WiFi路由器受控于芯片公司的测试工具,其WiFi发射机指标在非信令测试仪上显示:无论功率、EVM...

weixin_39662263的博客 3926

直播间商品自动上下架系统的通用设计方案

商品自动上下架的核心是队列管理和时间线调度。本质上是生产者-消费者模式的一个应用:商品队列是缓冲区,时间线引擎是消费者。设计的关键在于异常处理和人工干预能力,完全自动化在直播场景中并不总是最优解。

lingxishenzhi的博客 243

腾讯滑块验证码防水墙 tdc.js 补环境实录

腾讯滑块验证码破解研究摘要 本文记录了破解腾讯防水墙滑块验证码(tdc.js)的全过程。研究重点包括: 流程分析:通过抓包分析验证码完整链路,识别出关键参数collect和eks需从tdc.js虚拟机获取 环境模拟:采用渐进式补环境方法,针对字节码虚拟机特性构建完整的window对象,包括navigator、screen、canvas等API的精确模拟 核心破解:成功调用TDC.getData()和TDC.getInfo()获取关键参数,解决POW计算和滑块缺口识别问题 优化调整:针对errorCode 5

码王吴彦祖的博客 235

java自学笔记(day03),归纳总结自:B站狂神说java

java自学笔记(day03),归纳总结自:B站狂神说java 插播:Typora字体颜色可以用css样式去写,优快云博客要用font标签 面向过程 &面向对象 面向过程思想: 步骤清晰简单,第一步做什么,第二步做什么… 面对过程适合处理一些较为简单的问题 面向对象思想: 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。 面向对象适合处理复杂的问题,适合处理需要多人协作的问题! 对于描述复杂的事物,为

weixin_46083893的博客 246

2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++初中组:带解析)(7月4日试卷一)【文末附答案和解析】

2026年全国青少年信息素养大赛复赛真题(算法应用主题赛C++初中组:带解析)(7月4日试卷一)【文末附答案和解析】

王老师青少年编程 1741

DeerFlow 系列教程 附录 | 核心文件索引、官方文档索引与推荐阅读顺序

DeerFlow 系列教程 附录本附录汇集了 DeerFlow 项目的核心文件索引、官方文档索引和推荐阅读顺序三份速查资料,方便读者在日常开发和学习中快速定位关键代码与文档。内容按实际项目目录结构整理,所有路径均基于 DeerFlow 2.0 版本验证。

weixin_43674738的博客 328

死磕Android_App 启动过程(含 Activity 启动过程)

文章目录1. 前言1.1 简单介绍一下主要的类2. 应用的启动过程2.1 Launcher简介2.2 启动应用源码分析3. 启动Activity3.1 启动进程3.2 启动主线程3.3 创建Application3.4 创建Activity参考 1. 前言 Activity是日常开发中最常用的组件,系统给我们做了很多很多的封装,让我们平时用起来特别简单,很顺畅.但是你有没有想过,系统内部是如何启动...

潇风寒月 3181

【异常】解决 Claude Code 及第三方插件提示 “API Error: 404“ 的配置修复指南

在使用 Claude 相关的 CLI 工具(如)或 IDE 插件进行开发辅助时,配置错误的模型参数是导致连接失败的常见原因。本文将针对这一典型报错进行复盘与解决。

奶爸的编程之路,也就一周冷个三天 7750

OSAL系统框架专题2

9. TI协议栈所用系统框架探讨。51的系统往往不是太大,但是几十K的程序,也足以让一个初学者望而却步。我们首先忽略C语言本身的难度,光是系统框架也让生手读起来很吃力,再加上这种到处是API跟"define"的程序,还没有正式学习协议部分就已经让人在丛林中“迷路”了。在接下来的一段时间内,我会以TI所用的系统框架为主线进行学习,希望大家共同探讨。。。在层层迷雾中摸索了两天,终于拨...

frankzfz的专栏 104

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android的消息机制--Handler

Android的消息机制主要是指Handler的运行机制,及Handler所附带MassageQueue和Looper的工作过程。Handler的主要任务是将一个任务切换到指定的线程中去执行。且这种功能大部分是用于从子线程切到Android UI线程中去更新UI。 这里延伸一点,Android系统为什么不允许在子线程中访问UI呢?这是因为Android的UI控件是线程不安全的,如果多线程并发访问会导致UI控件处于不可预期的状态。系统不对IU控件的访问添加锁机制,是因为加上锁机制会让UI访问的逻辑变得复杂,并

u010869159的博客 187

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Python 基础较难理解的 15 个知识

以上是 Python 基础中较难理解的 15 个知识点的详细讲解和示例。通过这些示例,你可以更好地理解和应用这些概念,提高你的编程技能。如果你有任何其他问题或需要进一步的解释,请随时留言区提问。一、Python所有方向的学习路线Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。二、全套PDF电子书。

2301_78150559的博客 688

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

activity 生命周期_死磕Android_App 启动过程(含 Activity 启动过程)

1. 前言Activity是日常开发中最常用的组件,系统给我们做了很多很多的封装,让我们平时用起来特别简单,很顺畅.但是你有没有想过,系统内部是如何启动一个Activity的呢?Activity对象是如何创建的,又是如何回调生命周期方法的?通过对底层工作原理的学习,是通往高级工程师的必经之路,我们必须对Activity的启动原理知己知彼,才能在平时的开发中应对各种疑难杂症.本文主要是对Activi...

weixin_39943992的博客 162

Ansible(九)自动化运维之Playbook之roles

上一章节相关的参考 回顾 上章对ansible的palybook做了讲解,涉及了playbook的语法、变量、模板、判断、循环等,了解了如何编写playbook文件。 对比:Template生成目标文件,copy无法对配置文件进行修改 when:判断,一个应用场景就是针对不同的操作系统,进行不同的配置 with_items和loop:两种循环模式! tags的作用 1、regist...

wzj_110的博客 897

10 OSAL分析补充

I协议栈所用系统框架探讨。 51的系统往往不是太大,但是几十K的程序,也足以让一个初学者望而却步。我们首先忽略C语言本身的难度,光是系统框架也让生手读起来很吃力,再加上这种到处是API跟"define"的程序,还没有正式学习协议部分就已经让人在丛林中“迷路”了。 在接下来的一段时间内,我会以TI所用的系统框架为主线进行学习,希望大家共同探讨。。。 [注:本文源自www.feibit.

lzjsqn的专栏 401

JavaScript 运行机制详解:再谈Event Loop

JavaScript 运行机制详解:再谈Event Loop 作者: 阮一峰 日期: 2014年10月 8日 一年前,我写了一篇《什么是 Event Loop?》,谈了我对Event Loop的理解。 上个月,我偶然看到了Philip Roberts的演讲《Help, I'm stuck in an event-loop》。这才尴尬地

The Void 396

Z-Stack协议学习笔记2--OSAL系统框架专题

TI协议栈所用系统框架探讨。 51的系统a往往不是太大,但是几十K的程序,也足以让一个初学者望而却步。我们首先忽略C语言本身的难度,光是系统框架也让生手读起来很吃力,再加上这种到处是API跟"define"的程序,还没有正式学习协议部分就已经让人在丛林中“迷路”了。 在接下来的一段时间内,我会以TI所用的系统框架为主线进行学习,希望大家共同探讨。。。 在层层迷雾中摸索了两天,终于拨云

gougouhai1212的专栏 1133

Pandas入门教程(三十一):字符串操作——str 访问器、正则表达式与文本清洗实战

文本数据是数据清洗的重灾区。本文系统讲解 .str 访问器的完整能力:大小写转换、查找替换、去空格填充、切片连接、正则提取与分割、长度统计与类型转换,并通过姓名、电话、邮箱三类脏数据的清洗实例,帮你掌握文本处理的系统方法。

Smell_of_earth的博客 136

在网站改版中用正则表达式排查附件中的身份证号与手机号:误报、漏报与工程取舍

本文探讨在网站改版中利用正则表达式批量排查4200个附件中的身份证号与手机号。针对格式多样、人工核对耗时(约210小时)的难题,提出“先归一化后匹配”的工程策略,设计兼顾准确率与召回率的正则模式,并强调扫描件需OCR支持、Excel数字格式需文本化以避免漏检。通过构建“检测—定位—人工确认—处置留痕”闭环链路,实现从210小时到25分钟的效率跃升。文中警示误报漏报风险及落地四坑,明确适用边界:仅限固定格式敏感信息,不可替代业务判断。

bbsh2099的博客 456

正则表达式

在学习正则表达式的时候有没有这样的困惑,这么多符号这么记呀?某符号代表啥?某符号代表啥?某符号代表啥?某符号代表啥?某符号代表啥?

qq_44776900的博客 197

VSCode 正则表达式使用指南

本文介绍了VSCode中正则表达式的使用方法,涵盖开启搜索替换、常用语法(如\w、\d、^、$)、捕获组及示例应用。通过实例演示如何删除空行、转换日期格式、提取中文字符和匹配邮箱。支持多文件全局搜索与历史记录保存,建议使用在线工具调试复杂表达式,并注意大小写敏感与特殊字符转义问题。

weixin_63043528的博客 177
上一篇: 转 第七章 交互动画:移动物体(as3.0)
下一篇: 转 第八章 缓动与弹性运动(1)(as3.0)
coding_most
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值