首页 文章 精选 留言 我的

精选列表

搜索[技术极客],共10000篇文章
优秀的个人博客,低调大师

从流量迁移看企业数字化获客变革

生成式 AI 的普及,正在重塑商业信息检索的底层规则。大量企业持续投入传统搜索引擎优化,维持网站关键词排名,却面临询盘萎缩、品牌在 AI 问答场景无法曝光的困境。用户获取商业信息的入口发生结构性迁移,AI 搜索成为采购选型、品牌对比、服务商筛选的主要渠道,AI 搜索引擎优化随之成为企业数字化营销不可缺少的板块。本文将从用户行为变迁、传统搜索模式短板、GEO 生成式引擎优化价值、企业经营风险、品牌资产沉淀、落地判断标准六个维度论证:AI 搜索引擎优化的重要性持续提升,是企业适配新一代搜索生态的必然选择。

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

Android Things创客DIY第二课-Android Things入门配件包开发案例教程-报警灯

这是一个Android Things Simple PIO的扩展案例,使用入门开发配件包中的两个LED灯,1个蜂鸣器,1个按钮,实现LED灯闪烁、按钮响应、PWM驱动蜂鸣器功能。 先上一个实物图 如同警灯,红蓝灯会交替闪烁,程序运行时,蜂鸣器会叫一阵,之后当按钮按下时,蜂鸣器叫一阵。 面包板的接线图如下: 面包板接线图 代码可以在Github上下载:https://github.com/sysolve/androidthings-simplepioEx 案例代码已升级到Android ThingsDeveloper Preview 7版本,注意开发板系统与代码版本一致。 代码可直接在树莓派或NXP的PICO开发板上运行。 想要购买Android Things入门开发配件包?https://item.taobao.com/item.htm?id=564158582078 如果你手上已有Google派发的NXP PICO开发板,无需购买树莓派和摄像头。https://item.taobao.com/item.htm?id=564226570619 目前树莓派、IMX6UL_PICO、IMX7D_PICO三种开发板,在扩展接口的定义和名称上有所差别,端口功能基本一致,名称有所不同。 我已汇总如下,代码中com.sysolve.androidthings.utils.BoardSpec根据运行的设备会自动选择端口配置: 三种开发板的接口名称定义 为方便使用不同开发板的开发者,可直接通过 PIN 脚编号获取GPIO名称,例如: String gpioName = BoardSpec.getInstance().getGpioPin(BoardSpec.PIN_29); 为方便调试,AndroidManifest.xml文件中的IOT_LAUNCHER项已注释,开机不会自动运行。如要开机自动运行,请自行将注释去掉。 <!-- <category android:name="android.intent.category.IOT_LAUNCHER" />-->

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

Android Things创客DIY第一课-用Android Things展示你的智能设备创意-基础篇

Android Things旨在让Android开发者可以用熟悉的工具(Android Studio)开发智能设备。 Android Things是给Android开发者开发智能设备的一个大大的福利,Android开发者熟悉移动开发和移动互联网,可以将自己的移动互联网思维注入智能设备的设计中,而传统的硬件开发者,在这方面相较于Android开发者有所欠缺,这是Android开发者的优势。 如何开发一个智能设备 然而,Android开发者对硬件、电路往往不够熟悉,这是劣势,然而通过学习,对硬件和电子电路有一些了解,就可以很方便的用Android Things开发智能设备了。如果你喜欢动手,可以很方便的设计你的智能设备,并DIY出原型产品,开发运行在设备中的Android Things APP,结合云服务和手机APP,展示你的产品创意。之后聪明的你就可以全面的展示你的智能设备,融资或是通过众筹的方式,进行智能设备的产品化。或者你只想DIY自己玩玩,或是带着你的孩子一起玩,对,给孩子开发自己专属的智能玩具,那也是很酷的事情。 一个基于Android Things的玩具小车 做Android Things,做物联网开发,就不得不说电子电路了,Android开发者可能并不熟悉,不过本文会帮你梳理一下,基本上都是初中物理的知识。首先要介绍一个非常好的工具——面包板。 树莓派和面包板 面包板可以让你不需要焊接,通过接插的方式,把电子元件连接在一起,实现所需的功能,非常省时省力。Android Things官网的开发案例,也基本上都是通过面包板连接电子元件实现的。上图就是Android Things官网的第一个例子,电灯大法(让LED灯闪烁)。虽然Android Things现在也推荐一些集成了LED、按键和一些传感器的树莓派扩展板,不过还是建议入门者选择面包板和插件元件的配件套装,这样你知道电路是怎么连接的,知道原理会有助于发展你的创意。 我们在淘宝上提供了入门套装,你可以选择包含了树莓派和已烧录Android Things系统的TF的套件,如果你已经有树莓派,只购买配件即可。如果你要自己下载烧录Android Things系统,可以先读我的另一篇《Android Things入门防坑必读-硬件和系统下载安装篇》。 https://sysolve.taobao.com/ 套件根据Android Things官网Samples开发案例所需的配件进行打包,精选优品,无需自己搭配,专业工程师亲自搭配测试。 Android Things开发配件套装 开发第一个Android Things APP 如果你是Android开发者,你应该已经有了Android Studio,如果没有的话,可以到官网下载一个最新版的。 https://developer.android.google.cn/studio/index.html 下载Android Studio API版本选择API 26: Android 8.0 (Oreo)。 之后,到Github上去下载官网第一个例子(Simple PIO)的源代码。 https://github.com/androidthings/sample-simplepio 在Android Studio中打开,这里有个坑,应该是Android Studio的Bug,由于项目使用的是新的gradle-4.1进行编译,提示Failed to open zip file。没有下载成功。测试发现用浏览器是可以打开下载的,所以感觉是Android Studio的Bug。如图,打开gradle-wrapper.properties文件,看最后一行。 Android Studio提示Failed to open zip file错误 如下图红框所示,讲最后一行的https改成http,重新编译即可,第一次编译时要下载gradle-4.1-all.zip文件,需要耗费很长时间。 将https改成http 通过网络adb连上树莓派,假设树莓派的IP地址为192.168.1.100,即在命令行输入 adb connect 192.168.1.100 如果是NXP的Pico开发板,则是通过USB Type-C线,通过USB方式连接ADB,通过网络方式连接ADB会提示拒绝连接。 连接成功后,运行blink这个app即可看到LED灯闪烁了。 运行blink 还有一个坑需要注意一下,通常我们在调试APP的时候,可以在Android Studio中点击停止按钮,来停止设备上的APP运行,但你可以试一下Android Things上的这个APP,你点击停止,它马上又重新启动了!!! 这是Android Things的看门狗程序实现的功能,试想你的智能设备售卖出去了,然后程序异常退出了,你总不希望它在用户手里变砖头吧,所以Android Things发现你的APP退出之后,会帮你重新启动。(以前都要自己写异常重启的代码,现在系统帮你实现了。) 不过在调试的时候,没办法停止就不太好,比如你先调试了A程序,然后又运行了B程序,A程序没法退出,B程序就没法申请A程序已使用的资源。所以,官网给出的方法是,调试完A程序之后,如果要调试B程序,则先通过ADB将A程序卸载掉。 adb uninstall com.example.projectA 或者,用我这个方法——在调试的时候,取消掉程序的IOT_LAUNCHER属性:修改AndroidManifest.xml文件,如下图所示,将 <category android:name="android.intent.category.IOT_LAUNCHER" /> 这一行注释掉。再运行,APP退出后就不会自动重启了。当然注释掉之后,Android Things设备开机后,也就不会自动运行这个APP了,所以正式发布的时候,要把注释取消掉。 注释掉IOT_LAUNCHER 我在Blink代码的基础上,做了一个数字管显示数字,自动累加的例子,你可能猜到了数码管其实就是一系列LED灯组合在一起的,下一篇文章中会做介绍,你也可以动手实践一下。 在Blink基础上修改的数字显示例子 数码管显示代码示例

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

左神算法、牛客网算法、剑指java、Java后台面试宝典----个人总结(实习、春招、秋招)

第一节课 第一题:题意与leetcode354的问题相同算法原型 最长递增子序列问题 * 题意:求出给定序列的最长递增子序列的长度,给定序列不是有序的,子序列不是子数组,元素在原数组中不必是连续的 * */ /* * solutions1: 时间复杂度O(n^2),空间复杂度O(n) * 新建一个辅助数组h,h[i]表示以nums[i]结尾的最长递增子序列的长度 * h[i]值的确定,需要nums[i]与nums[j](0<=j<i)做比较,h[i] = h[j] + 1 (when nums[j] < nums[i]),找出这些值中的最大值即最终的nums[i] * 如果nums[i]最小的话,则h[i] = 1; * 因为h[i]值的确定需要nums[i]进行最多i-1次比较,所以时间复杂度为O(n^2) */ /* * solution2: 时间复杂度O(n*log(n)),空间复杂度O(n) * 新建一个辅助数组h,h[i]表示遍历到当前nums[j]位置时长度为i+1的递增子序列的最小末尾 * h填入值的部分称作有效区,还未填入值的部分称作无效区 * h[i]值的确定,h[0] = nums[0],在遍历nums 的同时,在h[i]中找到第一个大于等于nums[j]的数,并将其替换为为nums[j],如果没找到则将h有效区后一个元素置为nums[j] * h[i]会一直保持有序状态,所以找第一个大于等于nums[j]的数可以用二分法,最后返回h有效区的长度即可 * 由于在遍历的同时采用了时间复杂度为log(n)的二分查找,故时间复杂度为O(n*log(n)) */ /* * 实现solution2 */ public class LongestSubSequence { public int getLonggestLen(int[] nums) { int maxLen = 0; if (nums.length == 0) return maxLen; int[] h = new int[nums.length]; h[0] = nums[0]; maxLen = 1; for (int i = 1; i < nums.length; i++) { int pos = getPos(h, 0, maxLen - 1,nums[i]); if (pos == -1) { h[maxLen++] = nums[i]; } else h[pos] = nums[i]; } return maxLen; } public int getPos(int[] h, int left, int right, int num) { if (left <= right) { int mid = left + (right - left) / 2; if (h[mid] >= num) { int pos = getPos(h, left, mid - 1, num); if (pos == -1) return mid; return pos; } else { return getPos(h, mid + 1, right, num); } } return -1; } public static void main(String[] args){ LongestSubSequence l = new LongestSubSequence(); int[] nums = {1,3,6,7,9,4,10,5,6}; l.getLonggestLen(nums); } } 第二题 * 题意:详见2016 《牛课堂第一节课课件.pdf》第2题,leetcode42原题 */ /* * solution1:时间复杂度 O(n) 空间复杂度O(n) * 首先简化一下题意:如果能求得当前位置格子上的水量,那么总水量就是每个位置水量之和 * 当前格子上所能存储的水量 = 当前格子左边最大值与右边最大值之间的较小值 - 当前格子高度 * 所以要先求出当前格子左边的最大值与右边最大值,对于右边最大值用数组r来辅助存储,从右往左遍历一下原数组即可得到r * 对于左边的最大值在遍历原数组的同时用一个全局变量记录下来就行,此时时间复杂度为O(n) 空间复杂度O(n),还没达到最优解 * * solution2:时间复杂度 O(n) 空间复杂度O(1) * 为了不使用辅助数组,我们采用双指针的方法 * 双指针left和right分别指向数组的第二个元素和倒数第二个元素,由题意可知第一个元素和最后一个元素的储水量都是零 * 当前元素的遍历则从第二个和倒数第二个元素开始,用leftMax和rightMax分别记录左边最大值和右边最大值,用一个全局变量totalWater 更新总的储水量 * 若leftMax < rightMax则结算左指针height[left],leftMax > height[left]时,totalWater += leftMax - height[left++],反之更新左边最大值leftMax = height[left++],左指针向右移一位; * 反之,结算右边的当前元素,过程与左边类似 */ public class Question1 { public int getWater(int[] height){ if (height == null || height.length < 3) return 0; int totalWater = 0; int left = 1, right = height.length - 2; int leftMax = height[0], rightMax = height[height.length - 1]; while (left <= right) { if (leftMax < rightMax) { if (leftMax > height[left]) { totalWater += leftMax - height[left++] ; } else { leftMax = height[left++]; } } else { if (rightMax > height[right]) { totalWater += rightMax - height[right--] ; } else { rightMax = height[right--]; } } } return totalWater; } public static void main(String[] args){ Question1 q = new Question1(); int[] height = {0,1,0,2,1,0,1,3,2,1,2,1}; q.getWater(height); } }

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

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

用户登录
用户注册