python逐个遍历字符串(含汉字)

s = "中国china" for j in s: print j 首先一个,你这个’a’是什么编码?可能不是你所想的gbk >>> a='中国' >>> a 这样试试看,如果出来是6个字(word),说明是utf-8,如果是4个字,说明gbk。 另外,不管是utf-8还是gbk,都不能这样遍历,因为这里它会一个字一个字拿出来。虚拟机把a当成一个长度为len(a)的字符串了。 接下来是遍历问题。 linux的shell大都默认是utf-8,所以一个中文字符是三个字,所以要三个三个地读,你可以试下: >>> a[:3] 出来就是个”中”字 windows的command的默认是cp936,也就是gbk,一个中文字符是两个字,所以两个字两个字地读(a[:2])。 还有另一种遍历的方法,把字符串转换成unicode,这样中文英文都是一个字,就可以用你的for i in a的方法遍历了。这个的好处是中文英文字符都是一个字,而utf-8和gbk里,英文字母只占一个字。 s = u"中国china" for j in s: print j 输出如下: 中 国 c h i n a

Chrome浏览器支持的时间格式

简单试验了一下,大致支持以下格式: 相关的代码如下: new Date() //Thu Dec 01 2016 11:23:55 GMT+0800 (中国标准时间) new Date(new Date()) //Thu Dec 01 2016 11:23:58 GMT+0800 (中国标准时间) new Date(new Date(new Date())) //Thu Dec 01 2016 11:24:02 GMT+0800 (中国标准时间) new Date(0) //Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间) new Date("//Thu Dec 01 2016 11:24:02 GMT+0800") //Thu Dec 01 2016 11:24:02 GMT+0800 (中国标准时间) new Date("2016-12-01 11:24:02 GMT+0800") //Thu Dec 01 2016 11:24:02 GMT+0800 (中国标准时间) new Date("2016-12-01 11:24:00") //Thu Dec 01 2016 11:24:00 GMT+0800 (中国标准时间) 当然,像 Extjs 或者其他框架,都封装了转换时间的函数。

ActivityManager(9)—getAppTasks()

ActivityManager:getAppTasks() 1.作用 用于获取与应用相关的任务列表,返回类型List<ActivityManager.AppTask>。 2.源码 public List<ActivityManager.AppTask> getAppTasks() { ArrayList<AppTask> tasks = new ArrayList<AppTask>(); List<IAppTask> appTasks; try { appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName()); } catch (RemoteException e) { return null; } int numAppTasks = appTasks.size(); for (int i = 0; i < numAppTasks; i++) { tasks.add(new AppTask(appTasks.get(i))); } return tasks; } 3.分析及说明 源码中重要的部分是ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());我们追踪到这个方法: public List<IAppTask> getAppTasks(String callingPackage) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeString(callingPackage); mRemote.transact(GET_APP_TASKS_TRANSACTION, data, reply, 0); reply.

ActivityManager(7)—getDeviceConfigurationInfo ()

ActivityManager:getDeviceConfigurationInfo () 1.作用 用于获取设备的信息,返回值是ConfigurationInfo。 2.源码 public ConfigurationInfo getDeviceConfigurationInfo() { try { return ActivityManagerNative.getDefault().getDeviceConfigurationInfo(); } catch (RemoteException e) { } return null; } 3.分析及说明 返回类型是ConfigurationInfo,我们来看一下ConfigurationInfo的属性: reqTouchScreen:设备的触摸屏幕信息。 值: Configuration.TOUCHSCREEN_NOTOUCH 不能触摸 Configuration.TOUCHSCREEN_STYLUS 手写笔 Configuration.TOUCHSCREEN_FINGER手指触摸 reqKeyboardType:应用程序的输入方法的偏好。 值:Configuration.KEYBOARD_UNDEFINED(不明) Configuration.KEYBOARD_NOKEYS(没有物理键盘) Configuration.KEYBOARD_QWERTY(普通键盘) Configuration.KEYBOARD_12KEY(12键的小键盘) reqNavigation:设备导航 值:Configuration.NAVIGATION_UNDEFINED(不明) Configuration.NAVIGATION_DPAD(DPAD导航) Configuration.NAVIGATION_TRACKBALL(轨迹球导航) Configuration.NAVIGATION_WHEEL(滚轮导航) reqInputFeatures:输入功能的特性 值:INPUT_FEATURE_HARD_KEYBOARD(物理键盘输入) INPUT_FEATURE_FIVE_WAY_NAV (软键盘输入) reqGlEsVersion:应用程序使用的GLES版本。 4.使用 ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); configurationInfo.reqTouchScreen; configurationInfo.reqKeyboardType; configurationInfo.reqNavigation; configurationInfo.reqInputFeatures; configurationInfo.reqGlEsVersion;

打包依赖.aar文件以及坑总结

一、打包 aar 1、单个模块打包 打开 Gradle 工具窗口,找到 Android Library 模块. 在 build 任务中双击 assemble. 执行成功后,在 mylibrary/build/outputs/aar 目录下找到 aar 包. 默认 Debug 和 Release 的 AAR 包都会打出来,当然你也可以选择只打 Debug 的包,双击 assembleDebug 任务就可以了. 只打 Release 的包同理. 2、多个模块打包 当要打包的模块又依赖了其它几个模块时,常常需要把它们打包成一个 aar。多模块打包使用 fat-aar,打包关键步骤如下: 将下载好的 fat-aar.gradle 文件添加到对应的模块目录中,并在 build.gradle中引入 apply from: 'fat-aar.gradle'。或直接引用 apply from: 'https://raw.githubusercontent.com/adwiv/android-fat-aar/master/fat-aar.gradle' 添加要打包的工程,使用 embedded 关键字。示例代码如下: apply from: 'fat-aar.gradle' dependencies { ... embedded project(':DynamicPageLibrary') embedded project(':VideoPlayerLib') embedded project(':AudioPlayLibrary') embedded project(':BaseCloudMusicResource') } 步骤同上《单个模块打包》一致。 二、引入 aar 方法一、通过 libs 引入到 app 中

可视化利器 —— t-SNE(matlab toolbox 的使用与解释)

t-SNE – Laurens van der Maaten(感谢学术男神们的无私开源)User_guide.pdf(用户指南) 1. tsne 函数 mappedX = tsne(X, labels, no_dims, init_dims, perplexity) tsne 是无监督降维技术,labels 选项可选; X∈RN×D ,N 个样本,每个样本由 D 维数据构成;no_dims 的默认值为 2;(压缩后的维度) tsne 函数实现, X∈RN×D⇒RN×no_dimes (mappedX)init_dims:注意,在运行 tsne 函数之前,需要使用 PCA 对数据预处理,将原始样本集的维度降低至 init_dims 维度(默认为 30)。perplexity:高斯分布的perplexity,默认为 30; 2. mnist 数据集可视化 mnist 的 mat 文件,下载地址,mnist.zip

ng-click 事件获取dom元素 angular

大伙都知道,angular不推荐直接操作DOM元素,而是用指令代替它,但是有时候,我们就是想要获取事件的元素,比如点击等鼠标事件,当然只要理解其中一种,其他的都好说。 下面是代码: <div> <ul > <li><a href="###" ng-click="clickHere($event)"></a></li> </ul> </div> js代码 $scope.clickHere() = function($event) { console.log($event.target)// a元素 } 函数中可以传入其他参数,另外ng-mouseoverr, ng-mouseenter等等各种事件的原理都一样。 另外,angualar.element(HTML string or DOMElement)方法可以把参数包装成一个jq对象,使用jq的方法,详见下面的链接: https://docs.angularjs.org/api/ng/function/angular.element

AngularJs在ng-click函数中如何获取代表当前元素的DOM对象

<input class="unchecked" type="checkbox" ng-model="item.isCustOmized" ng-click="switchCheckBox($event, item.isCustOmized)" /> $scope.switchCheckBox = function($event, value) { // console.log(value) if (value) { $($event.target).addClass("checked"); } else { $($event.target).removeClass("checked"); } } 可见只需要在函数参数中传入$event参数,在函数中使用$event.target就可以获取到了.

Hub与Switch的帧的广播细节

Hub与Switch的帧的广播细节 @(计算机网络) 直接看题。 (2016.35)若主机H2向主机H4发送一个数据帧,主机H4向主机H2立即发送一个确认帧,则除H4外,从物理层上能够收到该确认帧的主机还有:D A. 仅H2 B. 仅H3 C. 仅H1,H2 D. 仅H2,H3 分析:只是单纯考察数据链路层帧的传送时的过程。当H2向H4传递时,将会把MAC地址告诉Switch,这样当H4发回确认帧时,可以直接一对一传到H2.但是这里要注意,H4经过Hub发回确认帧时,H3也会偷听到。即,Hub是广播的方式,包括H4自己也会听到,只不过这里说除了H4,那么H2,H3可以收到该确认帧。

腾讯云互动直播SDK集成综述

SDK构成 互动直播SDK由两部分构成,IMSDK和AVSDK 其中IMSDK为云通信SDK,为AVSDK提供账号登录、信令通道、IM弹幕消息、日志模块、日志上报等功能 AVSDK提供摄像头采集、编码、解码、美颜等一系列功能(下图为AVSDK整体框架) 登录交互逻辑 腾讯云互动直播提供两种账号对接方式 托管模式 由腾讯提供账号的注册、密码存储及校验 独立模式 由第三方业务自己保存账号体系,使用互动直播时,腾讯对第三方账号体系进行一定程度校验,是目前应用最广泛的一种验证方式。 本文着重讲解独立模式使用方法 详细内容参考账号登录集成说明 1.App登录业务服务器,做用户身份业务方鉴权 2.业务服务器验证成功后,根据用户身份,使用私钥加密用户身份信息后生成UserSig返回给客户端 3.将UserSig传给IMSDK的login接口,完成腾讯云服务器登录 创建房间交互逻辑 互动直播采用房间的概念进行音视频流交换,即观看者与主播必须同一个房间内才能完成通信。但互动直播不进行房间管理操作,相关的房间号分配、房间成员列表、房间的观众主播进出都可由业务来管理(可借助IMSDK实现该功能,详情请见房间状态通知) 创建房间交互流程如下: 1.主播向业务服务器请求创建房间 2.业务服务器分配房间号 3.主播使用分配的房间号调用AVSDK创建房间接口完成创建 4.通知业务服务器创建房间完成 观众进入房间交互逻辑 在主播完成房间创建后,业务直播平台已经有当前正在直播的房间列表。观众在登陆后可以看到该房间列表点击后进入房间,可发IM消息或者业务逻辑通知给其他已经在看的观众和主播。详细流程图如下: 注意:AVSDK不提供观众进入直播间通知,且不维护房间成员数及列表,可使用IMSDK实现或业务自行实现(见示意图虚线部分) 观众主播IM消息交互逻辑 观众正在欣赏主播表演同时,可以和主播进行IM互动,进行聊天、送花和送礼物等其它操作 当观众需要进行送花、送礼物等计费相关操作时,有两种方案可供选择 观众送花,由互动直播云回调业务后台,进行扣费观众送花,由App上行请求至直播平台,完成扣费操作后,直播平台通过IMSDK REST API接口发送该消息 当直播间内成员较多时,较大消息量可能会引起主播性能问题,业务侧需要优化渲染策略,同时互动直播云(IMSDK)可控制消息频率 观众退出房间交互逻辑 观众退出房间时,也需要通知给主播和其它的观众,相关流程可参考观众进入房间交互逻辑 主播退出房间交互逻辑 当主播退出房间时,需做以下几件事情 通知业务直播平台,直播间销毁通知其它的观众,主播已退出显示直播结束页(展示直播时长、直播热度等) 流程图如下: 视频连麦 连麦功能是腾讯云互动直播SDK在直播场景下推出的特色功能,可供主播和某一(多)观众进行视频连线,相互交流,其它的观众可看到主播和被邀请的观众的音视频画面(映客、聚美优品等App均实现了该功能) 可下载随心播进行体验,并可参考随心播封装代码(Android下载、iOS下载) 上麦的实现流程如下: 注意 邀请A上麦需要发点多点的消息(可使用云通信IMSDK的单聊消息,用CustomElem实现一定要在A完成上麦(开麦克风、摄像头,上传本地画面)完成后,再发送上麦广播通知上麦广播通知可使用云通信的群消息(CustomElem)实现 下麦的实现流程如下: 注意 主播和观众A下麦都需要考虑(代码中要做好保护)下麦的广播通知和下麦者关闭本地视频上传可同时进行(但建议先发出下麦通知,再关闭本地画面) 推流RTMP/HLS(H5或网页端观看) 互动直播SDK可直接由后台将私有协议转码为RTMP和HLS,业务可以将RTMP和HLS进行应用间分享,如分享到微信、QQ、朋友圈、QZone和其它应用内 建议使用 推流的TIMAvManager.StreamParam参数可直接设置进行录制,不需要再调用录制API(推流结束录制也结束,生命周期一致) 注意 互动直播推流使用了直播的cdn,需要业务申请直播权限(重要)直播有频道数限制,请业务提前申请足够的频道数因各种客户端异常导致没有正常销毁频道,开发者需从腾讯云控制台上手动关闭频道,否则频道会一直存在(占用总频道数) 文档参见旁路直播开发 录制主播视频(回放) 互动直播提供了音视频录制API,可由互动直播后台将主播的音视频录制下来,并且存储到点播服务器上,待转码完成以后,就可以实现回放、分发等其他的功能 注意 需要开通点播服务录制仅限于主播(第一个进入房间并且有音视频流的人)录制会以60分钟为间隔生成MP4文件转码需要时间需要显式的调用停止录制API 更多文档参见:录制功能开发 鉴黄 待补充 开发注意事项(必读) 观众人数过多时,消息量也会随之增多,需注意主播端性能,常见因渲染代码过多导致CPU飙升卡顿主播可能因为某种原因(CRASH、断网等)掉线,业务直播平台需增加主播心跳,实现直播列表的实时更新互动直播不提供房间成员管理等操作,需业务直播平台自行实现,或采用IMSDK方案

WebView详解一:打造优雅的WebView

相关文章: 《WebView详解二:Android与JS交互的实现过程》 《下拉刷新?我看好MaterialRefreshLayout!》 废话不多说老样子,先上效果图: 嘻嘻,千万别认为这是浏览器,这只是一个简单的WebView而已,伙伴们先不要喷,无论在怎么折腾,产品经理只要满意,你做的就是一个完美的答卷,对不对? 下面就来打造一个属于你自己的的WebView吧! 一、使用WebView并不需要开通网络权限 WebView可以加载本地Html文件和加载网络的Url路径,对其都有很好的支持 二、众多的基本属性你都知道吗? (1)表示不支持js,如果想让java和js交互或者本身希望js完成一定的功能请把false改为true。 mWebView.getSettings().setJavaScriptEnabled(false); (2)设置是否支持缩放,我这里为false,默认为true。 mWebView.getSettings().setSupportZoom(false); (3)设置是否显示缩放工具,默认为false。 mWebView.getSettings().setBuiltInZoomControls(false); (4)一般很少会用到这个,用WebView组件显示普通网页时一般会出现横向滚动条,这样会导致页面查看起来非常不方便。LayoutAlgorithm是一个枚举,用来控制html的布局,总共有三种类型: NORMAL:正常显示,没有渲染变化。 SINGLE_COLUMN:把所有内容放到WebView组件等宽的一列中。 NARROW_COLUMNS:可能的话,使所有列的宽度不超过屏幕宽度。 mWebView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); (5)不现实水平滚动条 mWebView.setHorizontalScrollBarEnabled(false); (6)不现实垂直滚动条 mWebView.setVerticalScrollBarEnabled(false); (7)滚动条在WebView内侧显示 mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY); (8)滚动条在WebView外侧显示 mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); (9)加载网页有时候会左右滑动,没法自适应屏幕,就加上下面的两句话 mWebView.getSettings().setUseWideViewPort(true);//设置此属性,可任意比例缩放 mWebView.getSettings().setLoadWithOverviewMode(true); 三、废话不说了,大家都知道,实现效果先 XML文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent"> <TextView android:id="@+id/title" android:gravity="center" android:textSize="15dp" android:textColor="#ffffff" android:background="#4998e7" android:layout_width="match_parent" android:layout_height="47dp"/> <ProgressBar android:id="@+id/Progress" android:padding="5dp" android:layout_width="match_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" /> <com.cjj.MaterialRefreshLayout android:id="@+id/refresh" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:overlay="false" app:wave_color="#4998e7" app:wave_show="true"> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF"/> </com.cjj.MaterialRefreshLayout> </LinearLayout> MainActivity文件: public class MainActivity extends AppCompatActivity { private WebView mWebView; private TextView mTitle; private ProgressBar mProgress; private MaterialRefreshLayout mMaterialRefreshLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.

一步一步开始FPGA逻辑设计 - 高速接口之PCIe

写在前面 近两年来和几个单位接触下来,发现PCIe还是一个比较常用的,有些难度的案例,主要是涉及面比较广,需要了解逻辑设计、高速总线、Linux和Windows的驱动设计等相关知识。 这篇文章主要针对Xilinx家V6和K7两个系列的PFGA,在Linux和Windows两种系统平台下,基于Xilinx的参考案例XAPP1052的基础上,设计实现了总线主控DMA(Bus Master DMA),透明映像内存空间和中断机制,在实际工程实践中得到了良好的应用,主要应用在光纤PCIe数据采集卡、FPGA加速卡、存储子系统等所有需要和主机进行高速数据交互的场所。这篇博客记录了在学习、开发、调试FPGA和主机之间的PCIe通讯接口的方方面面,记录难免有些差错,有任何事宜,欢迎邮件交流学习,jackxu8#163.com。需要完整设计文件或协助进行二次开发的,也可邮件联系。 第一版本多以开发记录为主,不尽完善,看得人多的话我在逐步完善,尽量讲的更加清楚一下。 PCIe协议基础知识 在高速互连领域中,使用高速差分总线替代并行总线是大势所趋。与单端并行信号(PCI总线)相比,高速差分信号(PCIe总线)可以使用更高的时钟频率,从而使用更少的信号线,完成之前需要许多单端并行数据信号才能达到的总线带宽。 PCI总线使用并行总线结构,在同一条总线上的所有外部设备共享总线带宽,而PCIe总线使用了高速差分总线,并采用端到端的连接方式,因此在每一条PCIe链路中只能连接两个设备。这使得PCIe与PCI总线采用的拓扑结构有所不同。PCIe总线除了在连接方式上与PCI总线不同之外,还使用了一些在网络通信中使用的技术,如支持多种数据路由方式,基于多通路的数据传递方式,和基于报文的数据传送方式,并充分考虑了在数据传送中出现服务质量QoS (Quality of Service)问题。 PCIe总线 与 PCI 总线不同, PCIe 总线使用端到端的连接方式,在一条 PCIe 链路的两端只能各连接一个设备,这两个设备互为是数据发送端和数据接收端。 PCIe 链路可以由多条 Lane 组成,目前 PCIe 链路× 1 、× 2 、× 4 、× 8 、× 16 和× 32 宽度的 PCIe 链路,还有几乎不使用的× 12 链路。 PCIe总线规范 总线频率 单Lane的峰值带宽 编码方式 单个Lane带宽 1.x 1.25GHz 2.5GT/s 8/10b编码 250MB/s 2.x 2.5GHz 5GT/s 8/10b编码 500MB/s 3.0 4GHz 8GT/s 128/130b编码 1GB/s 在PCIe总线中,使用GT(Gigatransfer)计算PCIe链路的峰值带宽。GT是在PCIe链路上传递的峰值带宽,其计算公式为 总线频率×数据位宽×2。 按照常理新一代的带宽要比上一代翻倍,PCIe3.0的原始数据传输带宽应该是10GT/s才对而实际却只有8.0GT/s。我们知道,在1.0,2.0标准中,采用的是8b/10b的编码方式,也就是说,每传输8比特有效数据,要附带两比特的校验位,实际要传输10比特数据。因此,有效带宽=原始数据传输带宽*80%。而3.0标准中,使用了更为有效的128b/130b编码方案从而避免20%带宽损失,3.0的浪费带宽仅为1.538%,基本可以忽略不计,因此8GT/s的信号不再仅仅是一个理论数值,它将是一个实在的传输值。 PCIe总线采用了串行连接方式,并使用数据包(Packet)进行数据传输,采用这种结构有效去除了在PCI总线中存在的一些边带信号,如INTx和PME#等信号。在PCIe总线中,数据报文在接收和发送过程中,需要通过多个层次,包括事务层、数据链路层和物理层。PCIe总线的层次结构如下。 PCIe总线的层次组成结构与网络中的层次结构有类似之处,但是PCIe总线的各个层次都是使用硬件逻辑实现的。在PCIe体系结构中,数据报文首先在设备的核心层(Device Core)中产生,然后再经过该设备的事务层(TransactionLayer)、数据链路层(Data Link Layer)和物理层(Physical Layer),最终发送出去。而接收端的数据也需要通过物理层、数据链路和事务层,并最终到达Device Core。

Android通用的筛选栏实现

最近事情比较多,不管是生活还是工作,感觉节奏都在赶着走,对于之前相对比较喜欢自由的我,也要慢慢适应之后的节奏了,不管怎样,生活还在继续,加油~~ 今天来写一个通用的筛选栏的实现,也是因为之前项目中要好多地方用到筛选栏这么个东西,所以为了之后用起来比较方便,就简单的做了一些封装.废话不多说,看一下效果图: 很多APP都有用到这个筛选栏,相信大家也不陌生. 一、需求分析 看到这个筛选栏之后,先来考虑一下布局,在开始接触android时候的我,可能看到这个布局的想法是:筛选栏这个部分,一个LinearLayout的横向布局,然后再分为3个部分,每个部分各占比重为1,然后在每个部分中放一个TextView和ImageView,之后监听每个部分的点击事件,对TextView和ImageView进行颜色、文字、方向等的处理.确实,这样做能实现功能,不过写起来很麻烦,需要手动的去处理TextView和ImageView的变化,可能筛选栏多了之后就会乱掉,而且还要花费大量时间去查找修改BUG,可能有一个小地方写反了,效果就乱掉了. 所以思考一下,对于筛选栏这个部分,有没有更好的布局设计呢?翻了翻能用的控件,发现CheckBox其实用在这里很好用(之前可能对于CheckBox的用法,只停留在勾选个对勾这样),怎么说它好用呢,因为CheckBox有两种状态(选中和未选中)刚好可以符合需求,选中的时候将字体颜色变为蓝色,并且将图标转换方向和颜色,未选中时重置为起始的样式,并且可以通过设置selector轻松的完成样式的转变.只需管理CheckBox的状态即可. 对于弹出框,很简单,自定义一个popWindow就可以了.不过需要注意的是因为需要在弹框弹出的时候,改变背景色的透明度,并且在弹出框消失之后恢复背景色的透明度,所以需要做一些特殊处理,这里打算去监听popWindow的变化来去完成相关处理. 二、代码实现及优化 根据上边的分析,布局设计如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.junweiliu.filterdemo.MainActivity"> <!--筛选栏--> <LinearLayout android:id="@+id/ll_stay_visit_selsect" android:layout_width="match_parent" android:layout_height="40dp" android:background="@color/white" android:gravity="center_vertical" android:orientation="horizontal"> <!--筛选地点--> <LinearLayout android:id="@+id/ll_place_tab" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center"> <CheckBox android:id="@+id/cb_place" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@null" android:button="@null" android:drawablePadding="10dp" android:drawableRight="@drawable/seletor_stock_arrow" android:gravity="center" android:text="地点" android:textColor="@drawable/selector_text_stock" android:textSize="15sp"/> </LinearLayout> <!--筛选类型--> <LinearLayout android:id="@+id/ll_type" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center"> <CheckBox android:id="@+id/cb_type" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@null" android:button="@null" android:drawablePadding="10dp" android:drawableRight="@drawable/seletor_stock_arrow" android:gravity="center" android:text="条件" android:textColor="@drawable/selector_text_stock" android:textSize="15sp"/> </LinearLayout> <!--筛选时间--> <LinearLayout android:id="@+id/ll_time" android:layout_width="

JavaScript for循环中使用Ajax发送请求

声明:本博文用于学习总结及工作心得 问题: 以前同事写在前端写有一个聊天的组件,点击该组件会出现一个聊天用户的界面;是用树结构显示的;而调用的function中使用的是for循环加Ajax循环发出请求 最近用户在多用户登录使用gauge组件的时候,造成浏览器假死;因为最开始不知道function中是for循环发送Ajax请求,只有观察服务器状态,一步步调试, 服务器TCP连接出现大量的Time_Wait 和Close_Wait;修改服务器配置文件已解决TIME_WAIT出现过多的原因,而CLOSE_WAIT则是由于程序代码的问题,比如SOCKET没有释放 就会出现这样的问题;结局我好服务器以后,仔细调试代码。才发现加载树调用的function中使用的是for循环加Ajax循环发出请求; 原因: Ajax请求默认是异步的,由于JS的for循环与ajax非同步运行,因此导致for循环结束了而ajax却还未执行,如果采用的是异步请求的方式,如果每次迭代的时候都去new一个XMLHttpRequest,因为遍历树,后端处理用到了递归;这样前端for循环在发送请求,而后台在递归,也没有加锁,照成服务器递归不到结点,跳不出递归,而客户端也一直等着浏览器response消息,直到超时,客户端主动断开连接; 看看TCP断开连接的四次握手: 1.Client -> FIN -> Server 2.Client <- ACK <- Server 这时候Client端处于FIN_WAIT_2状态;而Server 程序处于CLOSE_WAIT状态。 3.Client <- FIN <- Server 这时Server 发送FIN给Client,Server 就置为LAST_ACK状态。 4.Client -> ACK -> Server Client回应了ACK,那么Server 的套接字才会真正置为CLOSED状态。 CLOSE_WAIT产生于被动关闭的一方,客户端超时以后,发出主动断开连接的请求,而服务器却告诉客户端我还有东西没传给你(之前发出的请求),这样就照成了大量的CLOSE_WAIT状态; 解决方法: 1.前端使用递归,一个Ajax请求结束以后执行下一个 2.同步Ajax请求,注意普通的同步是有问题的,一样会造成浏览器假死,使用闭包 我用的第二种: for (var i = 0; i < groupArray.length; i++) { setTimeout((function (i) { return function () { Ext.Ajax.request({ url: 'departmentgetNodesByDept', method: 'post', async: false,//同步请求数据 params: { groupType: groupArray[i].

matlab学习

12天的努力,我看完了586页书,学了MATLAB,过得很累,但我心里很舒坦。我不用再为别的事情烦心了,因为我在一门心思的学习,我花了我将近所有的课余时间。只有这样,我才能用自己身体上的累来掩盖我自己心里面的累。这么多年了,几乎每天我都在自己的挣扎中度过。还好,一切就快过去,我有我自己的生活。我不要可怜,我不要虚心假意,我只要我自己过得好。别人能那么自私的对我,我为什么还要那样对他,值得吗?其实,没有人懂我的心,也没有人懂我,我做的这一切,不会有人知道,因为它永远的埋在了我的心里。风,带走我的思念吧! 这纯属瞎扯淡,不用理会我的牢骚。下面是我这12天的笔记,如果有爱好MATLAB或者正在学习的再或者想学的,我希望你们能看看我的笔记,这对你们会有帮助的,我相信。因为这是我的汗水和心血! 1 概述安装介绍 略 2 矩阵和数组 2.1 创建特殊矩阵函数 Compan 伴随矩阵 Diag 对角矩阵 Eye 单位矩阵 Gallery 测试矩阵 Hadamard hadamard矩阵 Hilb hilb矩阵 Invhilb invhilb矩阵 Magic 魔方矩阵 Ones 全一矩阵 Rand 均匀分布随机矩阵 Randn 正态分布随机矩阵 Rosser 经典对称特征测试矩阵 Wilkinson wilkinson特征值测试矩阵 Zeros 全零矩阵 注:diag(A,n)以向量A为主对角线为基准偏移n个位置 2.2 矩阵连接 水平 c=[a,b]或者c=[a b] 垂直 c=[a;b] 连接函数 Cat 指定方向 Cat(1,a,b)水平 Cat(2,a,b)垂直 Horzcat 水平方向 Vertcat 垂直方向 Repmat 对现有矩阵复制粘贴 Blkdiag 以对角阵方式重组 2.3 改变矩阵形状 Reshape 制定行列重排 Rot90 逆时针90 Filplr 垂直方向为轴旋转180 Flipud 水平方向为轴旋转180 Flipdim 指定方向为轴翻转矩阵

android中RecyclerView条目无法横向铺满的问题

该问题网上比较多的答案,都是要求修改inflate条目布局的方式,具体如下: View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.ble_result_item_unmatched, parent, false); 关键在于parent不能传空. 假如使用 LayoutInflater.from(parent.getContext()).inflate(R.layout.ble_result_item_unmatched, null, false); 则很可能出现条目无法横向铺满的情况,即便你在view的布局中设置了layout_width为match_parent,原因在于如果parent(即父布局)传空,则方法内部实现的时候,会忽略你设置的layout参数, parent不传空,attachToRoot传false: if (root != null) { // 系统根据父布局生成layoutParams params = root.generateLayoutParams(attrs); // 如果不添加到父布局,则添加layoutParams if (!attachToRoot) { temp.setLayoutParams(params); } } parent不传空,attachToRoot传true: // 如果父布局不空,且添加到父布局 if (root != null && attachToRoot) { root.addView(temp, params); } parent传空,则只是inflate布局,但并不会添加layout参数. 如果使用: View view = View.inflate(parent.getContext(), R.layout.ble_result_item_unmatched, null); 该方法内部是用的也是该方法: LayoutInflater.inflate(resource, root, root != null)

CMPP发送长短信,我可以实现了 CMPP2长短信实现(java版)

辞职后我就在yiDong从事短信和群发的工作,从北京方面的专家哪里学会了发送短信,一开始只能发送短短信,就是不超过140个字符,如果超过我就分割然后分成短的发送。一直不能发送超过140字符的。后来经过我阅读了很多人帖子才实现,主要是看了下面的内容,然后修改了代码才实现的。希望能够帮助和我一样迷茫的朋友把。 http://blog.csdn.net/pwlazy/archive/2010/03/05/5349625.aspx大家有什么不明白的可以看这里,写的很好。 我来说说我的实现吧: 1.以前我们可以发短短信的的时候的那个CMPPSubmitMessage。我们还是会用这个。我开发使用的是华为的一个短信开发包做的。这个包是移动给的。要做短信网关都可以叫移动提供。发短信用的是这个com.huawei.smproxy.CMPPSMProxy.send(CMPPSubmitMessage msgvo) 方法发送的。长短信也是用这个发送。 CMPPSubmitMessage 类中的几个属性给说明一下: /** * 相同Msg_Id的信息总条数,从1开始 */ int pkTotal = 1; /** * Pk_number 1 Unsigned Integer 相同Msg_Id的信息序号,从1开始 */ int pkNumber = 1; /** * Registered_Delivery 1 Unsigned Integer 是否要求返回状态确认报告: 0:不需要 1:需要 2:产生SMC话单 (该类型短信仅供网关计费使用,不发送给目的终端) */ int registeredDelivery = 1; /** * Msg_level 1 Unsigned Integer 信息级别 */ int msgLevel = 3; /** * Service_Id 10 Octet String 业务类型,是数字、字母和符号的组合。 */ String serviceID = "XXXXX"; /**

Android中的五大数据存储方式之一——文件存储

Android中的数据存储方式有5种,分别是文件存储、SharedPreferences、SQLite数据库、ContentProvider、网络存储。 每种存储方式有不同的特点,在这里简单介绍一下: 文件存储 :以I/O流形式把数据存入手机内存或者SD卡,可以存储大数据,如音乐、图片或视频等。 SharedPreferences:它本质上是一个XML文件,以键值对形式存入手机内存中。常用于存储较简单的参数设置,如QQ登录账号密码的存储、窗口功能状态的存储等,使用起来简单方便。 SQLite数据库 :是一个轻量级数据库,可跨平台,占用内存小,支持基本SQL语法,支持大部分的语言,是项目中经常被采用的一种数据存储方式,通常用于存储用户信息等。 ContentProvider:又称内容提供者,是Android四大组件之一,以数据库形式存入手机内存,可以共享自己的数据给其他应用使用。相对于其他对外共享数据的方式而言, ContentProvider统一了数据访问方式,使用起来更规范。 网络存储 :把数据存储到服务器,不存储在本地,使用时直接从网络获取。 本文主要介绍文件存储。 文件存储是Android中最基本的数据存储方式,与java中的文件存储类似,都是通过I/O流的形式把数据原封不动的存储到文档中。 文件存储可存在设备内部的存储空间中,即内部存储,也可存入到外置的SD卡中,即外部存储。这两种存储方式的主要区别在于,外部存储比内部存储多了一个确认设备是否可用的步骤,其余的输入输出都与内部存储类似。 1.内部存储 内部存储创建的文件保存在/data/data//files目录下。内部存储方式存储的文件被创建的应用程序私有,其他程序若要使用需设置权限。当应用程序被卸载时,内部存储文件也被随之删除。 内部存储使用openFileOutput()和openFIleInput()方法,获得FileOutputStream对象和FileInputStream对象,两个方法的形式如下: FlieOutputStream openFileOutput(String name,int mode); FileInputStream openFileInput(String name); 上述两个方法中,openFileOutput()用于打开应用程序中对应的输出流,存储数据;openFIleInput()用于打开对应输入流,读取数据。 其中,name表示文件名,mode表示读写文件的方式,取值有如下四种: MODE_PRIVATE: 该文件只能被当前文件读写,且不能追加,每一次都会覆盖原文件,默认的操作模式。MODE_APPEND: 会检查文件是否存在,存在就追加内容,否则创建新文件,常用的一种模式。MODE_WORLD_READABLE: 用来控制其他应用是否有权限读该文件,安全性低,通常不使用。MODE_WORLD_WRITEABLE: 用来控制其他应用是否有权限写该文件,安全性低,通常不使用。 Flie类方法(包括内部和外部)介绍示例 File file = this.getFilesDir(); //获得当前程序默认文件存储目录,即/data/data/<package name>/files File file = this.getCacheDir(); //获得默认缓冲文件存放位置,把一些不太重要的文件在此处创建、使用, //内存不足时系统会自动删去APP的cache目录的数据 File file = this.getDir("name",MODE_APPEND); //创建一个目录在/data/data/<package name>/files之下 File file = this.getExternalCacheDir(); //可以得到外部的存储位置,该位置的数据跟内置的使用相同。 //若APP卸载,此数据也会自动清除 存储数据示例代码 String fileName="data.txt"; //文件名称 String context="helloworld"; //要保存的数据 FileOutputStream fos; try{ fos = openFileOutput(fileName,MODE_PRIVATE); //打开程序的输出流,存储数据到data.

Mysql GTID 模式详解

一、GTID的概述: 1、全局事物标识:global transaction identifieds。 2、GTID事物是全局唯一性的,且一个事务对应一个GTID。 3、一个GTID在一个服务器上只执行一次,避免重复执行导致数据混乱或者主从不一致。 4、GTID用来代替classic的复制方法,不在使用binlog+pos开启复制。而是使用master_auto_postion=1的方式自动匹配GTID断点进行复制。 5、MySQL-5.6.5开始支持的,MySQL-5.6.10后开始完善。 6、在传统的slave端,binlog是不用开启的,但是在GTID中,slave端的binlog是必须开启的,目的是记录执行过的GTID(强制)。 二、GTID的组成部分: 前面是server_uuid:后面是一个序列号 例如:server_uuid:sequence number 7800a22c-95ae-11e4-983d-080027de205a:10 UUID:每个mysql实例的唯一ID,由于会传递到slave,所以也可以理解为源ID。 Sequence number:在每台MySQL服务器上都是从1开始自增长的序列,一个数值对应一个事务。 三、GTID比传统复制的优势: 1、更简单的实现failover,不用以前那样在需要找log_file和log_Pos。 2、更简单的搭建主从复制。 3、比传统复制更加安全。 4、GTID是连续没有空洞的,因此主从库出现数据冲突时,可以用添加空事物的方式进行跳过。 四、GTID的工作原理: 1、master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。 2、slave端的i/o 线程将变更的binlog,写入到本地的relay log中。 3、sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。 4、如果有记录,说明该GTID的事务已经执行,slave会忽略。 5、如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。 6、在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描。 要点: 1、slave在接受master的binlog时,会校验master的GTID是否已经执行过(一个服务器只能执行一次)。 2、为了保证主从数据的一致性,多线程只能同时执行一个GTID。 六、使用GTID搭建mysql的主从复制的主要参数: [mysqld] #GTID: gtid_mode=on enforce_gtid_consistency=on server_id=2003306 #每天实例的server_id都要不一样 #binlog log-bin=mysqlbin log-slave-updates=1 #允许下端接入slave binlog_format=row #强烈建议,其他格式可能造成数据不一致 #relay log skip_slave_start=1 注意:建议使用mysql-5.6.5以上的最新版本。 (二)、启动GTID的两种方法: 方法一、 1、如果是在已经跑的服务器,你需要重启一下mysql server。 2、启动之前,一定要先关闭master的写入,保证所有slave端都已经和master端数据保持同步。 3、所有slave需要加上skip_slave_start=1的配置参数,避免启动后还是使用老的复制协议。 方法二、 1、如果是新搭建的服务器,直接启动就行了。 七、master-slave搭建的注意事项: (一)、使用GTID的方式,把salve端挂载master端: 1、启动以后最好不要立即执行事务,而是先change master上。 2、然后在执行事务,当然知不是必须的。 3、使用下面的sql切换slave到新的master。 stop slave;

如何查看Android的ANR(无响应)异常

在Android开发中,当程序发生异常时会抛出异常信息,可以通过如下代码来获取异常信息,然而在ANR时我们在Logcat中并看不到异常信息。 Thread.setDefaultUncaughtExceptionHandler(new Thread. UncaughtExceptionHandler() { public void uncaughtException(Thread t, Throwable e) { System.out.println(t + " throws exception: " + e); } }); 那么我们在遇到一个ANR异常时,该怎样去排查是哪里的错误呢。通过查看Logcat的打印日志,会发现在每次出现ANR时都能看到这两句: I/art: Thread[2,tid=25238,WaitingInMainSignalCatcherLoop,Thread*=0xafa0e400,peer=0x12c2a080,"Signal Catcher"]: reacting to signal 3 I/art: Wrote stack traces to '/data/anr/traces.txt' 在发生ANR时,系统会将异常信息写入到traces文件中, 系统会记录异常的位置、CPU和内存当时的使用情况 ,通过查看日志基本就能判断问题所在。 接下来打开该文件,通过shell命令就可以了。 如使用cat的打开文件: 1, adb shell --> cat /data/anr/traces.txt 2,adb shell "cat /data/anr/traces.txt" | less