- 如何在unity中实现倒计时
老朱佩琪!
unityunity游戏引擎c#
publicclassshowtime:MonoBehaviour{publicTextMeshProUGUICountdown;voidUpdate(){if(Input.GetKeyDown(KeyCode.Space))//如果按下空格后开始倒计时{StartCoroutine(hahaha());}}IEnumeratorhahaha()//声明了一个协程函数hahaha{inttime=
- kotlin协程学习总结
天花板之恋
kotlinkotlin开发语言协程
1.协程是什么?kotlin中的协程是基于协程框架Coroutine实现的轻量级线程,提供一种简化处理异步任务的方式。2.怎么使用协程?使用协程框架中的launch方法包裹的代码块就是协程的内容,常规的代码如下:valcoroutineScope=CoroutineScope(context)coroutineScope.launch{getImage(imageId)}在实际的项目中,我们通常使
- C++异步从理论到实践总览篇
程序员编程指南
c++网络编程语言java人工智能
作者:fangshen,腾讯IEG客户端开发工程师C++20带来了coroutine特性,同时新的execution也在提案过程中,这两者都给我们在C++中解决异步问题带来了新的思路.但对比其他语言的实现,C++的协程和后续的execution都存在一定的理解和封装成本,本系列的分享我们将围绕基本的原理,相应的封装,以及剥析优秀的第三方实现,最终结合笔者framework落地的情况来展开.1.纠结
- 漫谈协程(coroutine)
协程c++
一什么是协程协程现在已经不是一个新的技术了,但是由于之前一直在用较低版本的c++,没什么机会使用协程。最近写了不少go的代码,接触到了协程,所以想从零开始学习一下协程。1.到底什么是协程之前听说协程的时候,大家都讲协程就是执行在用户态的微线程,加上go中协程的使用和线程差不多,我也就一直这样理解了。但是真正定义协程的功能是:可以随时的挂起和恢复,它允许多个入口点在不同的执行点挂起和恢复,而不是像线
- Kotlin 流 倒计时
安果移不动
#038Composekotlinandroid开发语言
funcountDownCoroutines(total:Int,onTick:(Int)->Unit,onStart:(()->Unit)?=null,onFinish:(()->Unit)?=null,):Job{returnflow{for(iintotaldownTo0){emit(i)delay(1000)}}.flowOn(Dispatchers.Main).onStart{onSta
- Android Compose Material3 ModalNavigationDrawer 抽屉的使用(处理了一些坑)
wilinzz
android
AndroidComposeMaterial3ModalNavigationDrawer抽屉的使用(处理了一些坑)valdrawerState=rememberDrawerState(initialValue=DrawerValue.Closed)valscope=rememberCoroutineScope()ModalNavigationDrawer(drawerState=drawerSta
- 3.协程的调度(1)
学吉他的袁先生
上一张通过四种启动模式,我们知道只有调度器ok,才能执行协程里面的代码,那么协程是如何调度的?下面是CoroutineScope.launch的源码publicfunCoroutineScope.launch(context:CoroutineContext=EmptyCoroutineContext,start:CoroutineStart=CoroutineStart.DEFAULT,bloc
- Kotlin协程 ----- suspendCoroutine和suspendCancellableCoroutine的使用
dashingqi
Android_Banner.jpg简介suspendCoroutine的使用suspendCancellableCoroutine的使用Retrofit是如何支持协程的suspendCoroutine的使用这里我们将使用suspendCoroutine将单一方法的接口方法改造成具有返回值的方法单一方法的回调声明一个单一方法的接口/***@author:zhangqi*@time:6/22/21*
- 开发知识点-swoole高性能Php异步编程框架
amingMM
swoolephp后端
swoole高性能Php异步编程框架介绍主要特性应用场景使用Swoole的优势介绍Swoole是一个高性能的PHP异步编程框架,它允许PHP开发者编写高并发、实时、异步的网络服务器和应用。Swoole通过提供了一套在PHP中使用异步I/O、协程(Coroutine)、多线程、高速序列化和IPC等高级功能的API,极大地扩展了PHP的能力,使得PHP不仅仅能用于传统的Web开发,也能用于开发微服务、
- Lua协程-coroutine
keep-learner
lua开发语言
lua也有协程这个机制,用以完成非抢占式的多任务处理。协程与线程协程和线程类似,有自己的堆栈、局部变量、指令指针等等。但同时也有不一致的地方,其中最重要的地方在于多线程程序可以同一时间运行多个线程,而协程同一时间只能运行一个,并且运行期间只有被显式要求挂起的时候才会选择挂起操作。基础操作coroutine.create(func)代表创建一个协程,也是个高级函数,参数即是function。coro
- python协程 async/await的理解
一条不更新的懒狗
新老对比用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yieldfrom调用另一个coroutine实现异步操作。为了简化并更好地标识异步IO,从Python3.5开始引入了新的语法async和await,可以让coroutine的代码更简洁易读。请注意,async和await是针对coroutin
- unity-协程详解
真的没事鸭
unityC#unity游戏引擎c#
什么是协程协程,即Coroutine,顾名思义,协助程序的意思。我们在进行主任务的同时,需要一些分支任务来配合工作,这就是协程的用处。协程不是进程或线程,它是一个特殊的函数,可以认为它是一个返回值是IEnumerator(不知道也没关系,后面会说)的函数。协程依然是在主线程上进行的,是一种异步多任务处理的方式,相比于线程,开辟多个协程开销不大,适合对某任务进行分时处理。我们只要知道协程是一个可以暂
- lua入门笔记2 深入函数 深入函数 迭代器与泛型for 编译、 协同程序(coroutine)执行与错误
Charon_ted
这一篇章的内容深入函数迭代器与泛型for编译、执行与错误协同程序(coroutine)1.深入函数基础知识Lua中,函数是第一类值,和所有其他值一样都是匿名的,即他们都没有名称。当讨论一个函数名时(例如print)实际上是讨论持有某个函数的变量第一类值:表示Lua中函数与其他传统类型的值(数字、字符串)具有相同的权利。函数可以存储到变量中(无论是全局变量还是局部变量)或table中,可以作为实参传
- 什么是 Python 中的协程(coroutine)?如何使用 async 和 await 关键字实现协程?如何在 Python 中实现一个简单的异步 RESTful API 客户端?Python 中
顶碗冷笑话
pythonpythonrestful开发语言面试改行学it后端
什么是Python中的协程(coroutine)?如何使用async和await关键字实现协程?协程(Coroutine)是一种用于异步编程的概念,允许在执行过程中暂停和恢复,而不阻塞整个程序。在Python中,协程通常与async和await关键字一起使用。async和await关键字:async关键字:用于定义一个异步函数(协程函数)。异步函数的执行不会阻塞程序的其他部分,可以在执行过程中暂停
- Coroutines和Rxjava异步编程对比之二
小菜鸟程序媛
原文地址:https://medium.com/@manuelvicnt/coroutines-and-rxjava-an-asynchronicity-comparison-part-2-cancelling-execution-199485cdf068在Android开发中,取消RxJava或Coroutines的执行时很重要的,因为在View即将被销毁的时候,取消网络请求或者对象的创建是必须
- io_uring 从原理到动手实践 part1: 使用系统调用接口实现 cat 程序
云微123
linux数据结构与算法linuxepollsyscall
原文感觉目前看到介绍io_uring的文章还是比较少,大部分都集中在对其原理性的介绍和简单的对官方文档的翻译,真正结合实际的例子还是比较少。本文翻译整理自一篇博客:io-uring-by-example-part-1-introduction我也增加了一些自己的理解和其他的参考材料。另外,在2020年,C++也正式将协程coroutine加入标准,我尝试使用io_uring和c++20协程实现了一
- linux下的io_uring和windows下的overlapped均可实现异步I/O,有什么异同?
lingshengxiyou
linux虚拟机c++开发语言dpdk
感觉目前看到介绍io_uring的文章还是比较少,大部分都集中在对其原理性的介绍和简单的对官方文档的翻译,真正结合实际的例子还是比较少。本文翻译整理自一篇博客:io-uring-by-example-part-1-introduction我也增加了一些自己的理解和其他的参考材料。另外,在2020年,C++也正式将协程coroutine加入标准,我尝试使用io_uring和c++20协程实现了一个高
- Kotlin Collection KTX:让你的集合操作如丝般顺滑
图你怀中安稳
开发工具kotlin开发语言API
当今移动应用开发,常常需要使用各种集合类型来存储和操作数据。Kotlin提供了CollectionKTX扩展库,为我们操作集合提供了非常方便的API。在本篇文章中,我们将介绍CollectionKTX中包含的所有扩展函数,让你的集合操作变得更加高效、简单、易读。除了CollectionKTX,Kotlin还提供了许多其他扩展库,例如AndroidKTX、Coroutines、Serializati
- 【Unity】协程原理,以及CustomYieldInstruction
Unity尧明
Unityunity
我们知道Unity中开启一个协程是这样的:publicclassExampleScript:MonoBehaviour{voidStart(){StartCoroutine(DoSomThing());}publicIEnumeratorDoSomeThing(){Debug.Log("Start"+Time.realtimeSinceStartup);yieldreturnnewWaitFor
- Python中的协程、线程和进程
NLP工程化
Python教程python协程进程线程
一.协程与多线程和多进程一起使用有什么不同 协程、多线程和多进程都是实现程序并发执行的方法,不过它们在工作方式和适合的应用场景上存在一些区别。1.协程(Coroutine) 协程是在单一线程内部实现并发的,由于只涉及单一线程,不存在多线程中常见的数据竞争等线程同步问题。当协程遇到IO操作(如文件读写、网络请求)时,它会将控制权让给其他协程,直到IO操作完成。因此,协程适合用于IO密集型任务。2
- QCoro: Qt C++ 20 协程库介绍
丁劲犇
现代C/C++工具链Qtqtc++20开发语言coroutines协程
C++20推出了协程的实现(coroutines)。虽然开发一个支持协程特性的类库还是要花很多功夫的,但是使用一个开发好的类库则是非常嗨。这也是C++委员会一贯的原则:如果你是类库开发者,必须足够有耐心学习拗口的特性。但如果是类库使用者,则直接吃语法糖爽歪歪就行了协程是一种线程内的快速执行序切换功能,比回调函数调用起来要简单。这篇文章介绍了协程的基本概念。QCoro是Qt的一个协程库,利用C++2
- lua之coroutine
walterCui
异步编程lua开发语言
coroutinelua天然支持coroutine,coroutine属于协程而非多线程。通过coroutine.create来创建一个协程,然后调用coroutine.resume启动,当函数中遇到coroutine.yield时协程将会被挂起直到再次调用coroutine.resume。localco=coroutine.create(function(...)print(...)end)pr
- lua之async机制
walterCui
异步编程lua开发语言
luaasynclua中的coroutine本身提供了强大的功能,但是它属于基础API,在实现复杂逻辑的过程中,需要将coroutine进行包装,或者将coroutine的句柄传来传去。针对上面的问题,借鉴C#中task机制,现用纯lua的代码实现了一套async机制。简单示例代码localtempAsync=async(function()print(123)localtemp=await(ta
- 知识点2-协程
二十二_0cbe
什么是协程?协程,英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。协程的开销远远小于线程的开销。与多线程比,协程有何优势?最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是
- 一些kotlin协程的具体运用
山山而川_eb3b
前言启动一个协程suspend关键字suspend挂起与恢复CoroutineScope一些协程函数和apirunBlocking函数coroutineScope函数supervisorScope函数Jobasync协程的懒加载withContextwithTimeout启动一个协程成员变量并取消协程的异常处理compose中启动一些协程Androidktx的协程协程相关测试在测试中的调度器前言本
- 类银河恶魔城学习记录-3-3-被击特效-P56
SuKacZev
学习android
更改总则使被攻击的人变白更改Entity.csprotectedvirtualvoidStart(){fx=GetComponentInChildren();//获得EntityFX组件anim=GetComponentInChildren();rb=GetComponent();}publicvirtualvoidDamage(){fx.StartCoroutine("FlashFX");//通
- unity控制程序等待_Unity 中的协同程序
媛源啊
unity控制程序等待
今天咱就说说,协同程序coroutine。(这文章是在网吧敲的,没有unity,但是所有结论都被跑过,不管你信得过我还是信不过我,都要自己跑一下看看,同时欢迎纠错)先说说啥是协程:协同程序是一个非常让人作呕的东西,它的表现形式非常像线程,对线程有过接触的朋友可能更理解我这句话的意思,你没接触过线程,那么理解它会有一些难度。但是它不存在线程安全问题,可以放心使用。这不是J哥信口雌黄空口白牙跟这猜的,
- Unity-协同程序原理
我和BUG只能活一个
Unityunity游戏引擎
知识点一协程的本质知识点二协程本体是迭代器方法的体现1、协程函数本体定义一个协程函数、以及一个类:我们如果单独的调用协程Test函数的话,不会执行任何语句。没有任何输出。为什么我们无法单独调用协程函数,需要用StartCoroutine()函数?因为此时Test内的函数没有真正被执行,它只是返回了一个迭代器的对象。我们可以将这个对象存起来,并且不通过协程调度器去执行它。IEnumerator内部方
- C++新特性 协程
4399.9855
C++新特性开发语言c++
本篇文章我们来讲述一下C++协程协程(Coroutine)是一种能够挂起个恢复的函数过程是一种轻量级的并发编程方式,也称为用户级线程。它与传统的线程(Thread)相比,具有更低的开销和更高的执行效率。协程通常运用在异步调用中。同步和异步(拓展):同步是指线程要同时执行如果没有两者没有同步则需要线程A等待线程B或者主线程等待子线程而异步编程就不需要线程的等待但是也要注意线程争夺的问题协程要讲清楚非
- Compose的附加效应(十四)
Mr_Tony
JetPackandroid
文章目录一、前言二、LaunchedEffect三、rememberCoroutineScope四、rememberUpdatedState五、DisposableEffect六、SideEffect七、produceState八、derivedStateOf九、snapshotFlow十、重启效应十一、使用常量作为键十二、参考链接一、前言关于副作用的解释,只发现了掘金上的一篇文章写的挺好的,这里
- ASM系列四 利用Method 组件动态注入方法逻辑
lijingyao8206
字节码技术jvmAOP动态代理ASM
这篇继续结合例子来深入了解下Method组件动态变更方法字节码的实现。通过前面一篇,知道ClassVisitor 的visitMethod()方法可以返回一个MethodVisitor的实例。那么我们也基本可以知道,同ClassVisitor改变类成员一样,MethodVIsistor如果需要改变方法成员,注入逻辑,也可以
- java编程思想 --内部类
百合不是茶
java内部类匿名内部类
内部类;了解外部类 并能与之通信 内部类写出来的代码更加整洁与优雅
1,内部类的创建 内部类是创建在类中的
package com.wj.InsideClass;
/*
* 内部类的创建
*/
public class CreateInsideClass {
public CreateInsideClass(
- web.xml报错
crabdave
web.xml
web.xml报错
The content of element type "web-app" must match "(icon?,display-
name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,s
- 泛型类的自定义
麦田的设计者
javaandroid泛型
为什么要定义泛型类,当类中要操作的引用数据类型不确定的时候。
采用泛型类,完成扩展。
例如有一个学生类
Student{
Student(){
System.out.println("I'm a student.....");
}
}
有一个老师类
- CSS清除浮动的4中方法
IT独行者
JavaScriptUIcss
清除浮动这个问题,做前端的应该再熟悉不过了,咱是个新人,所以还是记个笔记,做个积累,努力学习向大神靠近。CSS清除浮动的方法网上一搜,大概有N多种,用过几种,说下个人感受。
1、结尾处加空div标签 clear:both 1 2 3 4
.div
1
{
background
:
#000080
;
border
:
1px
s
- Cygwin使用windows的jdk 配置方法
_wy_
jdkwindowscygwin
1.[vim /etc/profile]
JAVA_HOME="/cgydrive/d/Java/jdk1.6.0_43" (windows下jdk路径为D:\Java\jdk1.6.0_43)
PATH="$JAVA_HOME/bin:${PATH}"
CLAS
- linux下安装maven
无量
mavenlinux安装
Linux下安装maven(转) 1.首先到Maven官网
下载安装文件,目前最新版本为3.0.3,下载文件为
apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令;
2.进入下载文件夹,找到下载的文件,运行如下命令解压
tar -xvf apache-maven-2.2.1-bin.tar.gz
解压后的文件夹
- tomcat的https 配置,syslog-ng配置
aichenglong
tomcathttp跳转到httpssyslong-ng配置syslog配置
1) tomcat配置https,以及http自动跳转到https的配置
1)TOMCAT_HOME目录下生成密钥(keytool是jdk中的命令)
keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit
- 关于领号活动总结
alafqq
活动
关于某彩票活动的总结
具体需求,每个用户进活动页面,领取一个号码,1000中的一个;
活动要求
1,随机性,一定要有随机性;
2,最少中奖概率,如果注数为3200注,则最多中4注
3,效率问题,(不能每个人来都产生一个随机数,这样效率不高);
4,支持断电(仍然从下一个开始),重启服务;(存数据库有点大材小用,因此不能存放在数据库)
解决方案
1,事先产生随机数1000个,并打
- java数据结构 冒泡排序的遍历与排序
百合不是茶
java
java的冒泡排序是一种简单的排序规则
冒泡排序的原理:
比较两个相邻的数,首先将最大的排在第一个,第二次比较第二个 ,此后一样;
针对所有的元素重复以上的步骤,除了最后一个
例题;将int array[]
- JS检查输入框输入的是否是数字的一种校验方法
bijian1013
js
如下是JS检查输入框输入的是否是数字的一种校验方法:
<form method=post target="_blank">
数字:<input type="text" name=num onkeypress="checkNum(this.form)"><br>
</form>
- Test注解的两个属性:expected和timeout
bijian1013
javaJUnitexpectedtimeout
JUnit4:Test文档中的解释:
The Test annotation supports two optional parameters.
The first, expected, declares that a test method should throw an exception.
If it doesn't throw an exception or if it
- [Gson二]继承关系的POJO的反序列化
bit1129
POJO
父类
package inheritance.test2;
import java.util.Map;
public class Model {
private String field1;
private String field2;
private Map<String, String> infoMap
- 【Spark八十四】Spark零碎知识点记录
bit1129
spark
1. ShuffleMapTask的shuffle数据在什么地方记录到MapOutputTracker中的
ShuffleMapTask的runTask方法负责写数据到shuffle map文件中。当任务执行完成成功,DAGScheduler会收到通知,在DAGScheduler的handleTaskCompletion方法中完成记录到MapOutputTracker中
- WAS各种脚本作用大全
ronin47
WAS 脚本
http://www.ibm.com/developerworks/cn/websphere/library/samples/SampleScripts.html
无意中,在WAS官网上发现的各种脚本作用,感觉很有作用,先与各位分享一下
获取下载
这些示例 jacl 和 Jython 脚本可用于在 WebSphere Application Server 的不同版本中自
- java-12.求 1+2+3+..n不能使用乘除法、 for 、 while 、 if 、 else 、 switch 、 case 等关键字以及条件判断语句
bylijinnan
switch
借鉴网上的思路,用java实现:
public class NoIfWhile {
/**
* @param args
*
* find x=1+2+3+....n
*/
public static void main(String[] args) {
int n=10;
int re=find(n);
System.o
- Netty源码学习-ObjectEncoder和ObjectDecoder
bylijinnan
javanetty
Netty中传递对象的思路很直观:
Netty中数据的传递是基于ChannelBuffer(也就是byte[]);
那把对象序列化为字节流,就可以在Netty中传递对象了
相应的从ChannelBuffer恢复对象,就是反序列化的过程
Netty已经封装好ObjectEncoder和ObjectDecoder
先看ObjectEncoder
ObjectEncoder是往外发送
- spring 定时任务中cronExpression表达式含义
chicony
cronExpression
一个cron表达式有6个必选的元素和一个可选的元素,各个元素之间是以空格分隔的,从左至右,这些元素的含义如下表所示:
代表含义 是否必须 允许的取值范围 &nb
- Nutz配置Jndi
ctrain
JNDI
1、使用JNDI获取指定资源:
var ioc = {
dao : {
type :"org.nutz.dao.impl.NutDao",
args : [ {jndi :"jdbc/dataSource"} ]
}
}
以上方法,仅需要在容器中配置好数据源,注入到NutDao即可.
- 解决 /bin/sh^M: bad interpreter: No such file or directory
daizj
shell
在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。
分析:这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。
解决:
1)在windows下转换:
利用一些编辑器如UltraEdit或EditPlus等工具
- [转]for 循环为何可恨?
dcj3sjt126com
程序员读书
Java的闭包(Closure)特征最近成为了一个热门话题。 一些精英正在起草一份议案,要在Java将来的版本中加入闭包特征。 然而,提议中的闭包语法以及语言上的这种扩充受到了众多Java程序员的猛烈抨击。
不久前,出版过数十本编程书籍的大作家Elliotte Rusty Harold发表了对Java中闭包的价值的质疑。 尤其是他问道“for 循环为何可恨?”[http://ju
- Android实用小技巧
dcj3sjt126com
android
1、去掉所有Activity界面的标题栏
修改AndroidManifest.xml 在application 标签中添加android:theme="@android:style/Theme.NoTitleBar"
2、去掉所有Activity界面的TitleBar 和StatusBar
修改AndroidManifes
- Oracle 复习笔记之序列
eksliang
Oracle 序列sequenceOracle sequence
转载请出自出处:http://eksliang.iteye.com/blog/2098859
1.序列的作用
序列是用于生成唯一、连续序号的对象
一般用序列来充当数据库表的主键值
2.创建序列语法如下:
create sequence s_emp
start with 1 --开始值
increment by 1 --増长值
maxval
- 有“品”的程序员
gongmeitao
工作
完美程序员的10种品质
完美程序员的每种品质都有一个范围,这个范围取决于具体的问题和背景。没有能解决所有问题的
完美程序员(至少在我们这个星球上),并且对于特定问题,完美程序员应该具有以下品质:
1. 才智非凡- 能够理解问题、能够用清晰可读的代码翻译并表达想法、善于分析并且逻辑思维能力强
(范围:用简单方式解决复杂问题)
- 使用KeleyiSQLHelper类进行分页查询
hvt
sql.netC#asp.nethovertree
本文适用于sql server单主键表或者视图进行分页查询,支持多字段排序。KeleyiSQLHelper类的最新代码请到http://hovertree.codeplex.com/SourceControl/latest下载整个解决方案源代码查看。或者直接在线查看类的代码:http://hovertree.codeplex.com/SourceControl/latest#HoverTree.D
- SVG 教程 (三)圆形,椭圆,直线
天梯梦
svg
SVG <circle> SVG 圆形 - <circle>
<circle> 标签可用来创建一个圆:
下面是SVG代码:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<circle cx="100" c
- 链表栈
luyulong
java数据结构
public class Node {
private Object object;
private Node next;
public Node() {
this.next = null;
this.object = null;
}
public Object getObject() {
return object;
}
public
- 基础数据结构和算法十:2-3 search tree
sunwinner
Algorithm2-3 search tree
Binary search tree works well for a wide variety of applications, but they have poor worst-case performance. Now we introduce a type of binary search tree where costs are guaranteed to be loga
- spring配置定时任务
stunizhengjia
springtimer
最近因工作的需要,用到了spring的定时任务的功能,觉得spring还是很智能化的,只需要配置一下配置文件就可以了,在此记录一下,以便以后用到:
//------------------------定时任务调用的方法------------------------------
/**
* 存储过程定时器
*/
publi
- ITeye 8月技术图书有奖试读获奖名单公布
ITeye管理员
活动
ITeye携手博文视点举办的8月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。
8月试读活动回顾:
http://webmaster.iteye.com/blog/2102830
本次技术图书试读活动的优秀奖获奖名单及相应作品如下(优秀文章有很多,但名额有限,没获奖并不代表不优秀):
《跨终端Web》
gleams:http