首页 文章 精选 留言 我的

精选列表

搜索[鸿蒙课程],共8106篇文章
优秀的个人博客,低调大师

德哥PG系列课程直播(第13讲):PostgreSQL 图式关系数据应用实践

直播回顾 地址:https://yq.aliyun.com/live/869 知识点 知识点:图式关系、递归查询、广度优先搜索 学习资料 1、PostgreSQL 家谱、族谱类应用实践 - 图式关系存储与搜索标签:PostgreSQL , 家谱 , 族谱 , 图式搜索 2、金融风控、刑侦、社会关系、人脉分析等场景思考 - PostgreSQL如何实现图式应用场景标签:PostgreSQL , pgrouting , neo4j , graph database , 图数据库 , 金融风险控制 , 风控 , 刑侦 , 社会关系 , 近亲 , linkedin , 人脉 3、PostgreSQL 图式搜索(graph search)实践 - 百亿级图谱,毫秒响应标签:PostgreSQL , CTE , 递归查询 , cycle , depth , loop , deep , level , 层级 , array , row array , JSON 4、PostgreSQL 递归妙用案例 - 分组数据去重与打散标签:PostgreSQL , 递归 , UDF , 窗口查询 , 分组TOP , 分组打散 , 分组去重+随机返回 5、PostgrSQL 递归SQL的几个应用 - 极客与正常人的思维标签:PostgreSQL , with recursive , 递归查询 , 求差 , 求唯一值 , 求稀疏列 , 求时序数据最新值 往期回顾 PostgreSQL多场景阿里云沙箱实验(第12讲):PostgreSQL 物联网最佳实践https://yq.aliyun.com/live/846PostgreSQL多场景阿里云沙箱实验(第11讲):PostgreSQL 在社交应用领域的最佳实践 https://yq.aliyun.com/live/824PostgreSQL多场景阿里云沙箱实验(第10讲):PostgreSQL 时空调度数据库实践 https://yq.aliyun.com/live/807PostgreSQL多场景阿里云沙箱实验(第9讲):PostgreSQL 时空业务实践 https://yq.aliyun.com/live/794PostgreSQL多场景阿里云沙箱实验(第8讲):PostgreSQL 简单空间应用实践 https://yq.aliyun.com/live/783PostgreSQL多场景阿里云沙箱实验(第7讲):PostgreSQL 并行计算 https://yq.aliyun.com/live/733PostgreSQL多场景阿里云沙箱实验(第6讲):PostgreSQL 用户画像系统实践 https://yq.aliyun.com/live/710PostgreSQL多场景阿里云沙箱实验(第5讲):PostgreSQL 估值、概率计算 https://yq.aliyun.com/live/691PostgreSQL多场景阿里云沙箱实验(第4讲):PostgreSQL 实时多维分析 https://yq.aliyun.com/live/659PostgreSQL多场景阿里云沙箱实验(第3讲):PostgreSQL 实时搜索实践https://yq.aliyun.com/live/647PostgreSQL多场景阿里云沙箱实验(第2讲):PG秒杀场景实践https://yq.aliyun.com/live/615PostgreSQL多场景阿里云沙箱实验(第1讲):如何快速构建海量逼真测试数据https://yq.aliyun.com/live/594 主讲人 德哥(云栖社区昵称:德哥)阿里云数据库专家,PostgreSQL中国社区校长。 格言:公益是一辈子的事, I'm digoal, just do it. 专家已经在社区发布了1946篇技术博文,很快将突破2000篇。厉害了!想要成为德哥粉丝请直接点击这里。 直播时间 时间:2019年2月20日 19:30 直播地址 PostgreSQL技术进阶群,钉钉扫码入群看直播

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

08.自定义方法以及直接访问java类方法---《Beetl视频课程》

本期视频实现了发布评论时间自定义显示; 内容简介:使用了自定义方法以及直接访问java方法实现了发布时间自定义显示 一起学beetl目录:https://my.oschina.net/u/1590490?tab=newest&catalogId=6214598 作者:GK 自定义方法 我们想要实现类似于${ strutil.subString ("hello",1)} 这样的方法,在Beetl模板中直接使用函数。一、集成Function 接口,实现call方法 call方法存在两个参数,一个是模板传输过来的参数列表Object[] objects,另外一个是beetl模板的上下文Context。 上下文中包含以下信息,需要用到可以自取。 byteWriter 输出流 template 模板本身 gt GroupTemplate globalVar 该模板对应的全局变量 byteOutputMode 模板的输出模式,是字节还是字符 safeOutput 模板当前是否处于安全输出模式 其他属性建议不熟悉的开发人员不要乱动 有几个注意事项,需要注意下: call方法要求返回一个Object,如果无返回,返回null即可 为了便于类型判断,call方法最好返回一个具体的类,如date函数返回的就是java.util.Date call方法里的任何异常应该抛出成Runtime异常 实现代码如下: package com.ibeetl.blog.function; import org.beetl.core.Context; import org.beetl.core.Function; import java.text.SimpleDateFormat; import java.util.Date; /** * @author GavinKing * @ClassName: PrintTime * @Description: * @date 2018/12/11 */ public class PrintTime implements Function { @Override public String call(Object[] objects, Context context) { Date date = (Date) objects[0]; Date now = new Date(); Long fiveM = date.getTime() + (5*60*1000); Long thM = date.getTime() + (30*60*1000); Long oneH = date.getTime() + (60*60*1000); if(now.getTime() < fiveM){ return "刚刚"; } if(now.getTime() < thM){ return "半小时前"; } if(now.getTime() < oneH){ return "一小时前"; } SimpleDateFormat sdf = new SimpleDateFormat(objects[1].toString()); return sdf.format(date); } } 二、注册function函数 在beetl.properties 中,增加 FN.printTime = com.ibeetl.blog.function.PrintTime 进行注册。 三、在模板中使用 ${printTime(msg.createTime!,"yyyy-MM-dd HH:mm:ss")} 这就可以使用我们自定义的方法了。 直接访问java类与方法 直接使用java方法,步骤没有那么复杂。 可以通过符号@来表明后面表达式调用是java风格,可以调用对象的方法,属性,比如: ${@user.getMaxFriend(“lucy”)} ${@user.maxFriend[0].getName()} ${@com.xxxx.constants.Order.getMaxNum()} ${@com.xxxx.User$Gender.MAN} <% var max = @com.xxxx.constants.Order.MAX_NUM; var c =1; var d = @user.getAge(c); %> 可以调用instance的public方法和属性,也可以调用静态类的属性和方法 ,需要加一个 @指示此调用是直接调用class,其后的表达式是java风格的。 更多用法请查询官网http://www.ibeetl.com/guide/#beetl。 我们在代码中新建一个类 package com.ibeetl.blog.function; import java.text.SimpleDateFormat; import java.util.Date; /** * @author GavinKing * @ClassName: PrintTimeUtil * @Description: * @date 2018/12/11 */ public class PrintTimeUtil { public static String printTime(Date date,String format){ Date now = new Date(); Long fiveM = date.getTime() + (5*60*1000); Long thM = date.getTime() + (30*60*1000); Long oneH = date.getTime() + (60*60*1000); if(now.getTime() < fiveM){ return "刚刚"; } if(now.getTime() < thM){ return "半小时前"; } if(now.getTime() < oneH){ return "一小时前"; } SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(date); } } 在模板中直接使用 ${@com.ibeetl.blog.function.PrintTimeUtil.printTime(page.list[i+1].createTime,"yyyy-MM-dd HH:mm:ss")} 不用注册函数,直接使用类的static公共方法。 项目git地址:https://gitee.com/gavink/beetl-blog 视频地址:下载下来会更清晰,视频比较长,可使用倍速看 百度网盘下载: https://pan.baidu.com/s/1LyxAxlKpVXgVjwSXIbzBuA 提取码: 68im 在线播放地址:bilibili (可以调节清晰度): https://www.bilibili.com/video/av36278644/?p=8 博客目录:https://my.oschina.net/u/1590490?tab=newest&catalogId=6214598

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

05.Beetl标签函数以及定界符、占位符介绍---《Beetl视频课程》

本期视频实现了博客的详情页面; 内容简介:使用了标签函数layout完成详情功能 一起学beetl目录:https://my.oschina.net/u/1590490?tab=newest&catalogId=6214598 作者:GK 标签函数 layout 所谓标签函数,即允许处理模板文件里的一块内容,功能等于同jsp tag。 如Beetl内置的layout标签 index.html <% layout("/inc/layout.html",{title:'主题'}){ %> Hello,this is main part <% } %> layout.html title is ${title} body content ${layoutContent} footer 第1行变量title来自于layout标签函数的参数 第2行layoutContent 是layout标签体{}渲染后的结果 关于layout标签,参考高级主题布局 layout标签函数,相当于把公共部分抽取出来,包裹主单个页面的个性化内容。 定界符、占位符 通俗易懂的说: 定界符就是 界定动态beetl语言 与 html静态代码之间的符号。比如,在<%%>中间的代码,是beetl代码(被包裹的代码会被Beetl模板引擎编译),而定界符之外的代码就是html静态代码(beetl语法不会生效)。 <%if(a==1){%> <a href="xxxx">跳转</a> <%}%> 占位符,就是在静态代码中占一个位置。占位符中可以使用表达式,以及函数,占位符包裹住的代码会被Beetl引擎编译。 比如下面的url: <a href="${url}">跳转</a> 因为都是beetl代码,所以在定界符中,不需要在使用占位符包裹变量,可以直接使用变量名! Beetl作用阶段 Beetl的主要作用是把 数据(变量)+ 模板 => 编译成 静态代码。 静态代码产生之后就没有 Beetl 什么事情了,浏览器打开静态代码才开始执行JS脚本。 项目git地址:https://gitee.com/gavink/beetl-blog 视频地址:下载下来会更清晰,视频比较长,可使用倍速看 百度网盘下载: https://pan.baidu.com/s/1LyxAxlKpVXgVjwSXIbzBuA 提取码: 68im 在线播放地址:bilibili (可以调节清晰度): https://www.bilibili.com/video/av36278644/?p=5 博客目录:https://my.oschina.net/u/1590490?tab=newest&catalogId=6214598

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

8.kotlin安卓实践课程-用kotlin写第一个fragment

简介 主要会通过安卓实战来讲解kotlin语法和实际应用,本教程设及知识点包括框架模式mvp+mvvm, Databinding(数据绑定框架),Dagger2(依赖注入框架),DeepLink(页面路由框架),Rxjava,RxAndroid(异步操作框架),Retrofit,Okhtttp等,不过本教程重点在kotlin所以这些框架需要了解可自行百度。 针对人群:Android中级以上,kotlin入门 我们马上开始完成第一个kotlin代码实现的fragment 首先先看一下代码 /** * * Created by bigman on 18-05-18. */ class AndroidFragment : BaseBingingFragment<ViewRecyclerBinding>(), AndroidContract.View { private var mList = ArrayList<AndroidBean>() private lateinit var mAdapter: AndroidAdapter private var mPage = 1 @Inject lateinit var mPresenter: AndroidPresenter override fun createDataBinding(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): ViewRecyclerBinding { return ViewRecyclerBinding.inflate(inflater!!, container, false) } override fun initView() { mAdapter = AndroidAdapter(mList) context.getMainComponent().plus(AndroidModule(this)).inject(this) with(mBinding) { recyclerView.adapter = mAdapter recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) //是否滚动到底部 if (!recyclerView?.canScrollVertically(1)!!) { mPresenter.getData(++mPage, ANDROID) } } override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) { super.onScrollStateChanged(recyclerView, newState) } }) } //请求数据 mPresenter.getData(mPage, ANDROID) mAdapter.setOnItemClickListener { pos -> val url = URLEncoder.encode(mList[pos].url) GankRouter.router(context, GankClientUri.DETAIL + url) } } override fun setData(results: List<AndroidBean>) { mList.addAll(results) mAdapter.notifyDataSetChanged() } override fun onDestroy() { super.onDestroy() mPresenter.unSubscribe() } companion object { val ANDROID = "ANDROID" fun newInstance(): AndroidFragment { val fragment = AndroidFragment() val bundle = Bundle() fragment.arguments = bundle return fragment } } } AndroidFragment 代码结构其实和MainActivity的差不多,首先是两个主要方法createDataBinding和initView,他同样是基类声明的两个抽象方法,我们看看基类 BaseBingingFragment的代码: /** * Created by bigman on 18-05-17. */ abstract class BaseBingingFragment<B:ViewDataBinding> : Fragment(){ lateinit var mBinding : B override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View { mBinding = createDataBinding(inflater,container,savedInstanceState) initView() return mBinding.root } override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } abstract fun createDataBinding(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): B abstract fun initView() } 当然它的实现和activity的基类一样,就是实现了databinding框架的页面绑定,不记得的同学可以翻看一下前面,我们再看基类提供的抽象方法的具体实现 override fun createDataBinding(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): ViewRecyclerBinding { return ViewRecyclerBinding.inflate(inflater!!, container, false) } 这里就是把view_recycler.xml由Databinding自动生成类ViewRecyclerBinding和页面绑定起来 然后再看看initView方法实现代码 override fun initView() { mAdapter = AndroidAdapter(mList) context.getMainComponent().plus(AndroidModule(this)).inject(this) with(mBinding) { recyclerView.adapter = mAdapter recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) //是否滚动到底部 if (!recyclerView?.canScrollVertically(1)!!) { mPresenter.getData(++mPage, ANDROID) } } override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) { super.onScrollStateChanged(recyclerView, newState) } }) } //请求数据 mPresenter.getData(mPage, ANDROID) mAdapter.setOnItemClickListener { pos -> val url = URLEncoder.encode(mList[pos].url) GankRouter.router(context, GankClientUri.DETAIL + url) } } 首先是实例化了一个adapter适配器,然后把通过context.getMainComponent().plus(AndroidModule(this)).inject(this)实现了依赖注入,然后是通过一个with函数包含的代码块实现了 recyclerView的初始化和滚动监听 语法点: with函数 with函数是将某对象作为函数的参数,在函数块内可以通过 this 指代该对象。返回值为函数块的最后一行或指定return表达式。 意思就是说如果要操作with的对象参数直接调用就行,不用多余的修饰符,比如这里的recyclerView就是mBinding对象的成员变量,完整写法应该是mBinding . recyclerView 剩下的需要注意这段代码 companion object { val ANDROID = "ANDROID" fun newInstance(): AndroidFragment { val fragment = AndroidFragment() val bundle = Bundle() fragment.arguments = bundle return fragment } } 这个伴生对象我们前面说过,这里再说一次,它相当于java的静态成员变量,这里的代码大家可以对比一下java的写法,相信java的写法大家都很熟悉了 欢迎一起交流,有问题加群交流 kotlin实战交流群群二维码.png

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

Android官方开发文档Training系列课程中文版:管理设备的睡眠状态

原文地址:http://android.xsoftlab.net/training/scheduling/index.html 引言 当Android设备处于闲置状态时,它的屏幕首先会变暗,接着会关闭屏幕,最后会将CPU关闭。这些举措可以防止设备的电量迅速被耗尽。但是当APP需要的话,还是会有例外情况: 游戏类APP或者视频类APP需要保持屏幕常亮。 有一部分APP或许不需要屏幕保持常亮,但是它们需要CPU继续保持运转,直到它们的任务执行完毕。 这节课主要学习如何在需要的时候保持设备的唤醒状态而又不至于非常耗电。 保持设备的唤醒状态 为了避免迅速将电量耗光,Android设备会在进入闲置状态后紧接着进入睡眠状态。不过,还是有一些例外情况的:它们需要保持屏幕常亮或者是保持CPU持续运转状态以便完成某些任务。 具体采用什么样的方式这取决于APP的需求。不过,有一条规则就是尽量采取最轻量级的方法,尽可能少的消耗系统资源。 保持屏幕常亮 某些APP比如游戏类APP或者视频类APP需要保持屏幕常亮。要做到这一点只需要在Activity中使用FLAG_KEEP_SCREEN_ON就可以,不过千万不要在服务或者其它组件中使用该标志: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } ... } 这种方法的优势在于:它不要指定特殊权限,系统会将APP之间的状态切换处理好,也不需要担心有关释放无用资源的问题。 另一个实现方式就是在布局文件中使用android:keepScreenOn属性: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:keepScreenOn="true"> ... </RelativeLayout> android:keepScreenOn=”true”的作用效果与使用FLAG_KEEP_SCREEN_ON的效果等同。你可以选择最合适的方式。使用标志的优势在于可以动态的清除该标志的状态,以便于屏幕可以转入关闭状态。 Note: 除非可以肯定屏幕不再需要保持常亮,否则不需要我们自己专门去清除该标志。WindowManager会严格把关这些事情:APP转入后台时,APP转入前台时。但是如果你明确要清除该标志以便屏幕可以转入关闭状态,那么可以使用clearFlags():getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) 保持CPU的运行 如果APP希望在系统转入睡眠状态之前完成一些事情,那么可以使用PowerManager系统服务中的WakeLock特性。WakeLock可以使APP控制设备的电源状态。 因为持有WakeLock对象可以直接与电源交互,所以只能在必要的时候使用WakeLock。绝不要在Activity中使用WakeLock。就像上面说的那样,如果希望保持屏幕常亮,只需要使用FLAG_KEEP_SCREEN_ON就可以。 使用WakeLock的合理场景就是后台服务。再强调一次,使用时应当以最小限度使用该标志,因为它会直接影响到电池的电量。 如果要使用WakeLock,首先需要在清单文件中添加WakeLock的权限: <uses-permission android:name="android.permission.WAKE_LOCK" /> 如果APP还包括了一个与服务做相关工作的广播接收器,那么可以通过WakefulBroadcastReceiver来管理WakeLock。这是一种非常理想的方案。如果APP没有那样的情况,那么也可以使用下面的方法: PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); Wakelock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag"); wakeLock.acquire(); 如果要释放WakeLock,调用wakelock.release()就好。它会释放你所持有的CPU资源。在任务完成后做这项工作是很重要的,因为这可以防止电池电量被迅速耗光。 使用WakefulBroadcastReceiver 广播接收器与服务的结合使用非常易于管理后台任务的生命周期。 WakefulBroadcastReceiver是一种特殊的广播接收器:它可以创建并管理APP的PARTIAL_WAKE_LOCK。在设备即将转入睡眠状态时,WakefulBroadcastReceiver会将该信号发给服务(通常是IntentService)。如果在收到广播后没有持有WakeLock,那么可以在工作完成之前设备就会转入睡眠状态。这就会导致任务不能及时完成,这并不是我们想看到的。 WakefulBroadcastReceiver用法的第一步就是将其添加到清单文件中,与其它广播接收器的添加方式一样: <receiver android:name=".MyWakefulReceiver"></receiver> 第二步就是使用startWakefulService()方法来启动MyIntentService。这个方法除了在启动时WakefulBroadcastReceiver持有了一个WakeLock外,其它的都与startService()很相似。在startWakefulService()中所使用的Intent被隐式的携带了一个WakeLock。 public class MyWakefulReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // Start the service, keeping the device awake while the service is // launching. This is the Intent to deliver to the service. Intent service = new Intent(context, MyIntentService.class); startWakefulService(context, service); } } 在服务结束时,要使用MyWakefulReceiver.completeWakefulIntent()将WakeLock释放。completeWakefulIntent()方法使用了被WakefulBroadcastReceiver传递过来的Intent对象: public class MyIntentService extends IntentService { public static final int NOTIFICATION_ID = 1; private NotificationManager mNotificationManager; NotificationCompat.Builder builder; public MyIntentService() { super("MyIntentService"); } @Override protected void onHandleIntent(Intent intent) { Bundle extras = intent.getExtras(); // Do the work that requires your app to keep the CPU running. // ... // Release the wake lock provided by the WakefulBroadcastReceiver. MyWakefulReceiver.completeWakefulIntent(intent); } }

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

鸿蒙版本的小小机器人APP开放源码啦

时下各种AI聊天应用争奇斗艳,一个比一个智能,一个比一个贴心。早在2022年出版的《Android Studio开发实战:从零基础到App上线(第3版)》中,笔者就基于Android实现了一个具备初级智能的小小机器人APP,不仅支持简单的问答,还支持问询天气预报,还支持加减乘除四则运算,还支持背诵唐诗宋词名篇佳句,可谓小朋友的贴心玩伴。

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

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

WebStorm

WebStorm

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

用户登录
用户注册