首页 文章 精选 留言 我的

精选列表

搜索[Solon框架],共10000篇文章
优秀的个人博客,低调大师

关于搜索功能的实现原理(laravel框架)

这里的搜索功能主要基于表单get提交实现的 <formaction="/backend/auditList"method="get"> <tableclass="search_tab"> <tr> <thwidth="120">选择分类:</th> <td> <selectname="class"> <optionvalue="">全部</option> @foreach($categoryas$c) <optionvalue="{{$c->id}}">{{$c->class_name}}</option> @endforeach </select> </td> <thwidth="70">文章标题:</th> <!--查询关键词--> <td><inputtype="text"name="keywords"placeholder="文章标题"></td> <td><inputtype="submit"name="sub"value="查询"></td> </tr> </table> </form> php部分逻辑 publicfunctionarticle_list(){ //echo'zoule';exit;测试表单是否走进方法中大家随意写 $shownum=1; if(array_key_exists('class',$_GET)||array_key_exists('keywords',$_GET)){ //echo'111'; if($_GET['class']){ //Article模型leftJoin表连接查询根据俩个表里的这些字段来执行 $postdata=Article::leftJoin('category',function($join){ $join->on('article.class_id','=','category.id'); })->select(['article.id','category.class_name','article.status','article.title_editing','article.update_time'])->where('article.class_id','=',$_GET['class'])->orderBy('release_time','desc')->paginate($shownum); }elseif($_GET['keywords']){ $postdata=Article::leftJoin('category',function($join){ $join->on('article.class_id','=','category.id'); })->select(['article.id','category.class_name','article.status','article.title_editing','article.update_time'])->where('article.title_editing','=',$_GET['keywords'])->orderBy('release_time','desc')->paginate($shownum); }else{ $postdata=Article::leftJoin('category',function($join){ $join->on('article.class_id','=','category.id'); })->select(['article.id','category.class_name','article.status','article.title_editing','article.update_time'])->orderBy('release_time','desc')->paginate($shownum); } }else{ //echo'2222'; $postdata=Article::leftJoin('category',function($join){ $join->on('article.class_id','=','category.id'); })->select(['article.id','category.class_name','article.status','article.title_editing','article.update_time'])->orderBy('release_time','desc')->paginate($shownum); } //分类id不是父id $category=DB::table('category')->where('parent_id','!=','0')->get(); //渲染页面传递参数 returnview('backend.article_list',['postdata'=>$postdata,'shownum'=>$shownum,'category'=>$category]); }

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

Appium框架中Android下EditText内容清除

在做 手机 自动化测试过程中 ,难免会对EditText的内容进行修改,通常我们对EditText输入 内容的时候,用的是Send_key()函数。可是这个函数不会先清除原来的内容,只会在光标当前位置上输入函数参数中的数据。如果我们需要修改,必须清除原来的内容,查看了一下clear()参数不好使用,只好去网上搜索了。 找到了如下方法: “首先 clear(), send_keys(), set_text(),在android上不太好用是个已知的bug (在IOS上不清楚,没有测试环境),会在 Appium1.2.3上修复。请参见github的issue:https://github.com/appium/python-client/issues/53 在这之前我们可以用 press_keycode的方式实现删除,删除速度比忽略 clear()抛出的异常要快很多。 大概思路是: 1. 点击要清除的edit field 2. 全选 3. 删除 element.click() sleep(1) #waiting for 1 second is important, otherwise 'select all' doesn't work. However, it perform this from my view self.driver.press_keycode(29,28672) # 29 is the keycode of 'a', 28672 is the keycode of META_CTRL_MASK self.driver.press_keycode(112) # 112 is the keycode of FORWARD_DEL, of course you can also use 67“ 我试了一下上面的方法,没有什么效果,只好继续寻找了。搜了好多网页,在一个网页上看到了一个不错的办法,不过可以打开的网页太多了,一忙忘记是哪儿个网页了。具体的方案就是: 先将光标移到文本框最后,然后取一下EditText中文本的长度,最后一个一个地删除文本。 具体示例如下: def edittextclear(self,text): ''' 请除EditText文本框里的内容 @param:text 要清除的内容 ''' DRIVER.keyevent(123) for i in range(0,len(text)): DRIVER.keyevent(67) 使用实例: adr=DRIVER.find_element_by_id('com.subject.zhongchou:id/edit_person_detailaddress') #找到要删除文本的EditText元素 adr.click()#激活该文本框 context2=adr.get_attribute('text')#获取文本框里的内容 self.edittextclear(context2)#删除文本框中是内容 最新内容请见作者的GitHub页:http://qaseven.github.io/

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

在 Ionic 框架移动应用中支持 iBeacons

Ionic framework 构建的 Android 或 iOS 应用中使用 iBeacons 我最近购买了一些 Estimote IBeacons 模块玩,并想将它们接入到基于 Ionic Framework 创建的 Android 与 iOS 应用中。 如果你对 iBeacons 感到陌生,没关系,它其实是用于近距离数据传输的蓝牙设备。Estimote 模块的优点在于其低功耗和电池寿命,目前已经有很多制造商已经正在制造 Estimote 模块。iBeacons 通常可以以 100ms 到 1000ms 的间隔发送广播信息,其间隔因配置或其制造商不同而不同。iBeacons 发送的广播信息包括 UUID、主版本号和次版本号。 在开始讨论代码前,我分享些可以应用 iBeacons 的场景: 1.在博物馆通过特定 iBeacons 触发你的手机显示出一段文字或播放一段音频。将一个 iBeacons 放在意大利的大卫雕像旁,当人们靠近时,人们就可以得到这个作品的信息。 2.用来追踪你商店里的人流量。也许你拥有一个像沃尔玛一样大小的商店,在每个部门都安装有iBeacons,你可以通过它来查看哪个部门的人流量最多。 3.通过 iBeacons 技术,可以计算你在游乐园的排队等待时间。 iBeacons 的应用不只在这些场景。 到现在你应该对 iBeacons 有一些了解了,下面我们将讨论代码。假设在你的机器上已经有 Ionic,在终端或命令提示符里运行以下命令:``ionic start IonicBeacon blankcd IonicBeaconionic platform add iosionic platform add android 如果你使用的不是 Mac,不要执行第三条命令。因为只有 Android 可以在 Linux 和 Windows 机器上运行。 插件我们使用 Peter Metz 的 cordova-plugin-ibeacan。在我写这个文档时,我可以获取的最新版本是 50315dbc。你也可以尝试使用新的版本。 打开终端或命令提示符,输入以下命令安装 IonicBeacon 插件: cordova plugin add https://github.com/petermetz/cordova-plugin-ibeacon.git 下面我们可以开始编码了。因为 Peter Metz 的 iBeacon 插件是使用 JavaScript 编写的,在 Ionic 这并不是最好的方式。因此我们使用 AngularJS 封装了这个插件。封装后的 ng-cordova-beacon 可以在我的 GitHub 上下载。从 dist 目录下载 ng-cordova-beacon.min.js 并将它拷贝到你的工程的 www/js 目录下。 下一步,打开你的工程中 www/index.html 文件,并在 app.js 行之前添加以下 JavaScript 代码: 打开 www/js/app.js 文件并添加以下代码来引入 AngularJS: angular.module('starter', ['ionic', 'ngCordovaBeacon']).run(function($ionicPlatform) { $ionicPlatform.ready(function() { if(window.cordova && window.cordova.plugins.Keyboard) { cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); } if(window.StatusBar) { StatusBar.styleDefault(); } }); }).controller("ExampleController", function($scope, $rootScope, $ionicPlatform, $cordovaBeacon) { $scope.beacons = {}; $ionicPlatform.ready(function() { $cordovaBeacon.requestWhenInUseAuthorization(); $rootScope.$on("$cordovaBeacon:didRangeBeaconsInRegion", function(event, pluginResult) { var uniqueBeaconKey; for(var i = 0; i < pluginResult.beacons.length; i++) { uniqueBeaconKey = pluginResult.beacons[i].uuid + ":" + pluginResult.beacons[i].major + ":" + pluginResult.beacons[i].minor; $scope.beacons[uniqueBeaconKey] = pluginResult.beacons[i]; } $scope.$apply(); }); $cordovaBeacon.startRangingBeaconsInRegion($cordovaBeacon.createBeaconRegion("estimote", "b9407f30-f5f8-466e-aff9-25556b57fe6d")); }); }); 让我们看下这里发生了什么。 angular.module('starter', ['ionic', 'ngCordovaBeacon']) 首先我们需要将 ng-cordova-beacon 添加到 AngularJS 模块中。好了,我们可以按我们的想法去用它了。 在插件使用设备相关的代码前,我们需要在 $ionicPlatform.ready 接口中进行相关的设置。在 iOS 应用中,我们需要申请权限去访问本地服务,而 Android 应用则不必如此。 我们调用 $rootScope.$on 用来监测距离。如果我们接收到了 iBeacon,我们需要知道其距离我们有多远。我们也可以通过一个对象将广播信息显示到前端。 现在我们可以在一定范围广播我们消息了。如果你希望广播多个不同的消息,可以使用不同的配置多次调用下面代码,但我只想广播一个消息。其代码如下: $cordovaBeacon.createBeaconRegion("estimote", "b9407f30-f5f8-466e-aff9-25556b57fe6d") 我选择使用具有可读性的描述符作为 estimote 的 UUID。UUID 中也可以包含主版本号与次版本号,但当你使用它们时需要使用通配符。你可以为每个 UUID 使用多个不同的主版本号与次版本号,这样你会得到多个结果。 最后我们要关心的是这个 APP 怎么在手机上显示出来。回到工程的 www/index.html 文件,将下面的代码加入到 <ion-content> 标签中: <div class="list"> <div class="item" ng-repeat="(key, value) in beacons"> <div class="row"> <div class="col truncate"> </div> </div> <div class="row"> <div class="col"> major: </div> <div class="col"> minor: </div> </div> <div class="row"> <div class="col"> </div> </div> </div> </div> 我使用的 Ionic 类中没有 truncate 方法,我们需要将其加上。打开 www/css/style.css 文件添加下面的代码: .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } 因为我们使用 UUID 太长,不能完全的显示在屏幕上,过长的部分会被“...”代替。 ![image](https://yqfile.alicdn.com/27e544314546b7aa97e828756fbb79b0935f34b2.png) 当我们的程序启动后探测到 iBeacons 时就会如上图一样的显示。 ###结论 你可以使用 iBeacons 做很多有趣的事情,并且在 Ionic Framework 中的使用非常简单。你可以从Estimote下载开发工具,这里有很多兼容 Android 与 iOS 设备的版本。 可以通过下面的网址观看这个示例的视频: https://youtu.be/PlDNPeG8iJo

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

PhoneGap 1.8.1 发布,跨平台移动开发框架

PhoneGap官方今天发布了PhoneGap 1.8.1版本,主要修复了1.8版本中导致iOS平台上PhoneGap应用程序崩溃的bug。 该版本相对于之前的1.7版本,主要修复了iOS、Android、Windows Phone、黑莓和WebOS平台上的大量bug,此外还进行了大量的改进,部分如下: iOS:添加HTTP状态码到FileTransferError对象 iOS:升级地理位置功能,以和W3C规范一致 iOS:新增记录器插件 iOS:重写了加速器插件,简化了该插件的启动/停止行为 Android:当删除图像文件时查询Andoid content数据库 Android:在FileUtils.notifyDelete中使用stripFileProtocol协议 Android:修复了一些示例中出现的问题 WP:允许创建新的命令行界面项目 WP:重写了加速器插件 文章转载自 开源中国社区 [http://www.oschina.net]

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

Apache Storm 官方文档 —— Ack 框架的实现

Storm 的acker使用哈希校验和来跟踪每个 tuple 树的完成情况:每个 tuple 在被发送出的时候,它的值会与校验和进行异或运算,然后在 tuple 被 ack 的时候这个值又会再次与校验和进行异或运算。这样,一旦所有的 tuple 都被成功 ack,校验和就会变为 0(随机生成的校验和为 0 的概率极小,可以忽略不计)。 你可以在wiki中了解更多关于可靠性机制的信息。 ackerexecute() Acker 实际上也是一个 bolt,它的execute 方法是定义在mk-acker-bolt中的。在一个新的 tuple 树生成的时候,spout 为每个 tuple 发送一个用于异或的固有 id,acker 会将这些 id 记录在它的挂起队列中。每次 executor ack 一个 tuple 的时候,acker 会接收到一个部分校验和,这个校验和是 tuple 自身的 id(将其从挂起队列中清除)和 executor 发送的每个下游 tuple 的 id(放入挂起队列中)的异或值。 这个过程是这样的: 在接收到 tick tuple 信号的时候,将 tuple 树的校验值向超时方向移动并且返回。同时,在 tuple 树中更新或者创建一个记录。 初始化阶段:使用指定的校验和值进行初始化,并且记录 spout 的 id; ack 阶段:将部分校验和与当前的校验和进行异或运算; fail 阶段:仅仅将 tuple 标记为 failed 状态。 接下来,将记录存入RotatingMap(重新设置超时计数值)并且继续以下过程: 如果总校验和为 0, 表明 tuple 树已经完成:将记录从挂起队列中移除,并通知 spout 处理成功; 如果 tuple 树失败了,也会有一种完成状态:将记录从挂起队列中移除,并通知 spout 处理失败。 最后,发送一个我们自己的 ack 信号。 挂起 tuples 与RotatingMap Acker 将挂起树存放在一个RotatingMap中。RotatingMap是一个在 Storm 中多处使用的简单工具,它主要用于高效地处理过程的超时。 RotatingMap 与 HashMap 类似,支持 O(1) 时间的 get 操作。 在 RotatingMap 内部有多个 HashMap(称为槽,buckets),每个 HashMap 都保存有一群会在同一时间超时的记录。我们称存在时间最长的 bucket 为死亡牢房(death row),而访问最多的 bucket 称为苗圃(nursery)。一个新的值在被.put()到 RotatingMap 中,它都会被重定位到 nursery 中,并且从其他的它之前可能在的 bucket 中移除(这是一种高效的重新设置延时时间的方法)。 在 RotatingMap 的所有者调用.rotate()方法的时候,RotatingMap 会将每个 bucket 向着超时的方向移动一步(一般 Storm 对象会在收到一个系统 tick 流 tuple 的时候调用 rotate 方法)。如果此时在前面所说的 death row bucket 中有 key-value 键值对,RotatingMap 会为每个 key-value 键值对触发一个回调函数(在构造器中定义的),让他们的所有者选择一个合适的操作(例如,将 tuple 标记为处理 转载自并发编程网 - ifeve.com 失败)。

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册