TypedValue.applyDimension()返回值

TypedValue.applyDimension()该函数多用于兼容不同手机的尺寸大小。 float radius=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()); radius在1440x2400的手机上返回80,在1080x1800手机上返回60; getResources().getDisplayMetrics()获取屏幕密度相关信息。获取数据格式如下: DisplayMetrics{density=4.0, width=1440, height=2400, scaledDensity=4.0, xdpi=537.882, ydpi=537.388} TypedValue.applyDimension()函数的具体实现如下,请仔细阅读,不要被别人误导了: public static float applyDimension(int unit, float value, DisplayMetrics metrics) { switch (unit) { case COMPLEX_UNIT_PX: return value; case COMPLEX_UNIT_DIP: return value * metrics.density; case COMPLEX_UNIT_SP: return value * metrics.scaledDensity; case COMPLEX_UNIT_PT: return value * metrics.xdpi * (1.0f/72); case COMPLEX_UNIT_IN: return value * metrics.xdpi; case COMPLEX_UNIT_MM: return value * metrics.xdpi * (1.0f/25.4f); } return 0; }

angularJs中的jqLite

方法描述addClass()为每个匹配的元素添加指定的样式类名after()在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点append()在每个匹配元素里面的末尾处插入参数内容attr()获取匹配的元素集合中的第一个元素的属性的值bind()为一个元素绑定一个事件处理程序children()获得匹配元素集合中每个元素的子元素,选择器选择性筛选clone()创建一个匹配的元素集合的深度拷贝副本contents()获得匹配元素集合中每个元素的子元素,包括文字和注释节点css()获取匹配元素集合中的第一个元素的样式属性的值data()在匹配元素上存储任意相关数据detach()从DOM中去掉所有匹配的元素empty()从DOM中移除集合中匹配元素的所有子节点eq()减少匹配元素的集合为指定的索引的哪一个元素find()通过一个选择器,jQuery对象,或元素过滤,得到当前匹配的元素集合中每个元素的后代hasClass()确定任何一个匹配元素是否有被分配给定的(样式)类html()获取集合中第一个匹配元素的HTML内容next()取得匹配的元素集合中每一个元素紧邻的后面同辈元素的元素集合。如果提供一个选择器,那么只有紧跟着的兄弟元素满足选择器时,才on()在选定的元素上绑定一个或多个事件处理函数off()移除一个事件处理函数one()为元素的事件添加处理函数。处理函数在每个元素上每种事件类型最多执行一次parent()取得匹配元素集合中,每个元素的父元素,可以提供一个可选的选择器prepend()将参数内容插入到每个匹配元素的前面(元素内部)prop()获取匹配的元素集中第一个元素的属性(property)值ready()当DOM准备就绪时,指定一个函数来执行remove()将匹配元素集合从DOM中删除。(同时移除元素上的事件及 jQuery 数据。)removeAttr()为匹配的元素集合中的每个元素中移除一个属性(attribute)removeClass()移除集合中每个匹配元素上一个,多个或全部样式removeData()在元素上移除绑定的数据replaceWith()用提供的内容替换集合中所有匹配的元素并且返回被删除元素的集合text()得到匹配元素集合中每个元素的合并文本,包括他们的后代toggleClass()在匹配的元素集合中的每个元素上添加或删除一个或多个样式类,取决于这个样式类是否存在或值切换属性。即:如果存在(不存在)就删除(添加)一个类triggerHandler()为一个事件执行附加到元素的所有处理程序unbind()从元素上删除一个以前附加事件处理程序val()获取匹配的元素集合中第一个元素的当前值wrap()在每个匹配的元素外层包上一个html元素 转载于:https://www.cnblogs.com/rainbow8590/p/7230958.html

Android 使用RecyclerView实现(仿微信)的联系人A-Z字母排序和过滤搜索功能

之前做项目的时候遇到一个需求是实现品牌的字母排序功能,网上的资料很多,但是有一部分有bug,这篇文章是我学习和解决部分bug之后的总结。今天带来的是RecyclerView的A-Z字母排序和过滤搜索功能。 首先上效果图: 重点:1、实现数据排序分类 2、实现右侧的字母导航 3、搜索 这里使用了一个中文转化为拼音的工具包,即pinyin4j-2.5.0.jar。官网地址:http://pinyin4j.sourceforge.net/ 布局顶部是一个带删除按钮的文本编辑框,我们在输入框中输入字母或汉字可以自动过滤出我们想要的东西,当输入框中没有数据自动替换到原来的数据列表,然后下面一个RecyclerView用来显示数据列表,右侧是一个字母索引表,其实就是一个自定的View,当我们点击不同的字母,RecyclerView会定位到该字母索引地item。 这是主界面布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:focusable="true" android:focusableInTouchMode="true"> <com.xp.sortrecyclerview.ClearEditText android:id="@+id/filter_edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="8dp" android:background="#9DDE76" android:drawableLeft="@drawable/search_bar_icon_normal" android:hint="请输入关键字" android:maxLines="1" android:textSize="15dp" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> <TextView android:id="@+id/dialog" android:layout_width="80dp" android:layout_height="80dp" android:layout_centerInParent="true" android:background="#9DDE76" android:gravity="center" android:textColor="#ffffffff" android:textSize="30dp" android:visibility="invisible" /> <com.xp.sortrecyclerview.SideBar android:id="@+id/sideBar" android:layout_width="30dp" android:layout_height="match_parent" android:layout_alignParentRight="true" /> </RelativeLayout> </LinearLayout> 之前出现过两个问题,一个就是,每次进入界面后EditText自动获取焦点,导致输入法自动弹出来,所以为了解决这个问题在EditText的父布局也就是我们的根布局加了两个属性:android:focusable=”true”和android:focusableInTouchMode=”true”。 还有一个问题就是侧边栏会被输入法顶上去,结解决办法是在清单配置文件的对应Activity加上android:windowSoftInputMode=”adjustPan”,防止布局被输入法顶上去。 中间的TextView是用来显示选中的字母索引。 主界面的话主要是三个方法: 初始化的方法主要是对比较器的初始化,设置监听,对数据排序和对RecyclerView的初始化。 代码: private void initViews() { //初始化比较器 pinyinComparator = new PinyinComparator(); sideBar = (SideBar) findViewById(R.

Java基础知识点笔记(一):java中的取整与四舍五入

今天编码时,需要对数据进行保留两位小数处理,结果卡壳了,百度了一下解决掉后,结果返回到前端的值不是预想值,特此整理,以备后续遗忘。 一.java中取整数的方式 1.直接使用强制转换 public static void roundOne(){ System.out.println("正数:(int)10.12 = " + (int)10.12); System.out.println("负数:(int)-10.12 = " + (int)-10.12); System.out.println("---------------------------------"); System.out.println("正数:(int)1011111111111111111111.12 = " + (int)1011111111111111111111.12); System.out.println("负数:(int)-1011111111111111111111.12 = " + (int)-1011111111111111111111.12); } 直接用强制转换的方式将浮点型数据转换为整型时,直接去掉小数点后部分的精度,取整数部分;直接强制取整有精度风险,一方面是小数位损失,另一方面当浮点型数字超过整型数字最大值时,会发生溢出。实际工程中,如果这两种因素都不会对工程产生影响,可以使用,否则不建议使用。 2.java中提供的取整的函数 java中提供了三种取整的函数: (1).Math.ceil(double num); (2).Math.floor(double num); (3).Math.round(double num); public static void roundTwo(){ System.out.println("正数:Math.ceil(10.12) = " + Math.ceil(10.12)); System.out.println("负数:Math.ceil(-10.12) = " + Math.ceil(-10.12)); System.out.println("正数:Math.ceil(101111111111111111111.12) = " + Math.ceil(101111111111111111111.12)); System.out.println("负数:Math.ceil(-101111111111111111111.12) = " + Math.ceil(-101111111111111111111.12)); System.out.println("---------------------------------"); System.out.println("正数:Math.floor(10.12) = " + Math.floor(10.12)); System.out.println("负数:Math.floor(-10.12) = "

css3动画--小熊快跑

相关链接: https://codepen.io/zhoupipipipipipi/pen/awgpEz 将gif图用ps分成一张一张的png图,本来有35张图,这里只采用了7张图,用雪碧图拼接在一起 通过动画修改背景图,让小熊跑动起来 缺点:虽然实现了动画效果,但是还是使用了较大的图片,尽量用svg实现 .bear{ width: 400px; height: 400px; background: url("https://github.com/Zhoupipipipipipi/Svg/blob/master/image/bear.png?raw=true") 0 0 no-repeat; animation: myMove; animation-iteration-count: infinite;/* 动画无限播放 */ animation-timing-function: step-start;/* 马上跳到动画每一结束桢的状态 */ animation-duration: 950ms;/* 动画运行的时间 */ } @keyframes myMove{ 0% { background-position: -10px -10px; } 16.67% { background-position: -430px -10px; } 33.33% { background-position: -850px -10px; } 50% { background-position: -1270px -10px; } 66.67% { background-position: -1690px -10px; } 83.34% { background-position: -2110px -10px; } 100% { background-position: -2530px -10px; } }

在 Shell 提示符中显示 Git 分支名称的方法

PS1介绍 PS1介绍 配置 获取branch名称 通过git branch获取(不推荐) git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/' 通过.git/HEAD 获取(推荐) vi .git/HEAD ############ ef: refs/heads/dev ############ 配置.bashrc vim ~/.bashrc ###################### #获取branch名称 find_git_branch () { local dir=. head until [ "$dir" -ef / ]; do if [ -f "$dir/.git/HEAD" ]; then head=$(< "$dir/.git/HEAD") if [[ $head = ref:\ refs/heads/* ]]; then git_branch="${head#*/*/}" elif [[ $head != '' ]]; then git_branch="detached" else git_branch="

架构师之路-网络框架的搭建(高逼格)

一,了解常见的框架 1,你已经工作量3年不等或也许是菜鸟,只要接触Android开发那么在项目中必不可少的就是一些第三方框架:常见的网络请求框架,图片加载框架等… 我们具体了解下常见的网络框架: 网络框架:okhttp,Volley,Xutils,Retrofit.... 图片框架:picasso,xutils,imageLoader,glide,fresco,Fac... 他们的优点:兼容性好,代码很少,逼格够高,封装….这么多的优点,也许刚接触开发的很多小伙子们直接拿来就在项目中使用。哪里需要网络请求哪里直接上代码也不是很费劲!如果你是这样做的你这时候应该看完我这篇博客啦! 二,不同级别人使用框架的方式 (1):第一种初级程序员: 1,初级程序员做法:拿来就用 2,优点:简单粗暴 3,做法如下: x.http().get(new RequestParams(url), new Callback.CommonCallback<String>() { @Override public void onSuccess(String result) { } @Override public void onError(Throwable ex, boolean isOnCallback) { } @Override public void onCancelled(CancelledException cex) { } @Override public void onFinished() { } }); 4,缺点: 耦合度太高:因为一个大型项目中用到的网络框架部分有可能成千上万,如果你是程序员,你所使用的网络请求框架不满足产品的需求时候,你是要一个一个来修改么?这么多交互代码是不是很难,很耗费时间。效率极低。 (2):第二种中级程序员: 1,中级程序员做法:为了降低耦合度进行了一次封装: 2,有点:耦合度低,小小装逼,代码少了,逻辑清晰,使用方便。 3,做法如下:当然了我这里分装时候进行了一些简单的操作,单例模式,泛型。相信都可以看懂。将网络框架分装到类里面不在跟View交互 package com.example.ls.mynetframe.volleyutils; import android.content.Context; import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.

初次运行 Git 前的配置

配置用户名 git config --global user.name 'liweibin' git config --global user.email liweibin@okay.cn 生成密钥 #查看密钥 cat ~/.ssh/id_rsa.pub #不存在则生成密钥 ssh-keygen -t rsa -C "你的邮箱" 以上完成以后就可以使用git了

Android Wi-Fi Ethernet新IP获取机制—IpManager(Android 7.0)

1 android N之前 Ethernet旧的ip获取 Android N之前,即android 5.0和android 6.0的IP获取机制都是通过/system/bin下面的dhcpcd的bin档去拿的ip //EthernetNetworkFactory.java (frameworks\opt\net\ethernet\java\com\android\server\ethernet) public void onRequestNetwork() { // TODO: Handle DHCP renew. Thread dhcpThread = new Thread(new Runnable() { public void run() { ... DhcpResults dhcpResults = new DhcpResults(); // TODO: Handle DHCP renewals better. // In general runDhcp handles DHCP renewals for us, because // the dhcp client stays running, but if the renewal fails, // we will lose our IP address and connectivity without // noticing.

关于结构体内存对齐总结

内存对齐计算可谓是笔试题的必考题,但是如何按照计算原则算出正确答案一开始也不是很容易的事,所以专门通过例子来复习下关于结构体内存对齐的计算问题。(编译环境为vs2015) 对齐原则: 原则1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。 原则2:结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。 原则3:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。 默认对齐值: Linux 默认#pragma pack(4) window 默认#pragma pack(8) 注:可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是指定的“对齐系数”。 例一:一字节对齐 第一步: 成员数据对齐 #pragma pack(1) struct AA { int a; //长度4 > 1 按1对齐;偏移量为0;存放位置区间[0,3] char b; //长度1 = 1 按1对齐;偏移量为4;存放位置区间[4] short c; //长度2 > 1 按1对齐;偏移量为5;存放位置区间[5,6] char d; //长度1 = 1 按1对齐;偏移量为6;存放位置区间[7] //整体存放在[0~7]位置区间中,共八个字节。 }; #pragma pack() 第二步: 整体对齐 整体对齐系数 = min((max(int,short,char), 1) = 1,所以不需要再进行整体对齐。整体大小就为8。 图示如下: 例二:二字节对齐 第一步: 成员数据对齐 #pragma pack(2) struct AA { int a; //长度4 > 2 按2对齐;偏移量为0;存放位置区间[0,3] char b; //长度1 < 2 按1对齐;偏移量为4;存放位置区间[4] short c; //长度2 = 2 按2对齐;偏移量要提升到2的倍数6;存放位置区间[6,7] char d; //长度1 < 2 按1对齐;偏移量为7;存放位置区间[8];共九个字节 }; #pragma pack() 第二步: 整体对齐 整体对齐系数 = min((max(int,short,char), 2) = 2,将9提升到2的倍数,则为10.

selenium - Python环境搭建(windows)

搭建 selenium - Python 环境可以直接通过 python脚本调用webdriver,打开浏览器进行输入点击等一系列操作。结合火狐的Selenium ide插件可以快速实现web操作抓取及python脚本导出,通过简单编辑即可实现自动化操作web。 一、安装Python 安装要点: a、要选择安装 pip 及 Add python.exe to Path b、安装成功后打开 cmd 命令执行 Python 如下提示: 二、 安装 Python 对应的 selenium 包 方式一: 通过pip 命令直接安装 (可能因为网络原因下载不了),如果提示: pip' 不是内部或外部命令,也不是可运行的程序,则需要到python\Scripts目录下执行下(如 C:\Users\changge\AppData\Local\Programs\Python\Python35-32\Scripts)。 pip install -U selenium 方式二: 下载 Selenium 包,解压后使用命令安装 python setup.py install 三、 下载对应浏览器 Driver,放到系统的PATH下 (环境变量 path)供 python 脚本调用 四、 运行实例: from selenium import webdriver browser = webdriver.Firefox() //打开火狐,同理 webdriver.chrome 为打开chrome browser.get('http://seleniumhq.org/') 更多api学习可参考 WebDriver API 另,python脚本抓取生成可使用火狐 Selenium - ide 抓取脚本,火狐插件下载地址

Java中常用的10种设计模式详解

1. 观察者模式 定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。 对于JDK或者Andorid中都有很多地方实现了观察者模式,比如XXXView.addXXXListenter , 当然了 XXXView.setOnXXXListener不一定是观察者模式,因为观察者模式是一种一对多的关系,对于setXXXListener是1对1的关系,应该叫回调。 /** * 注册一个观察者 */ public void registerObserver(Observer observer); /** * 移除一个观察者 */ public void removeObserver(Observer observer); /** * 通知所有观察者 */ public void notifyObservers(); @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { int index = observers.indexOf(observer); if (index >= 0) { observers.remove(index); } } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(msg); } } /** * 主题更新信息 */ public void setMsg(String msg) { this.

工作常用软件

编辑器 Notepad++ 下载:http://rj.baidu.com/soft/detail/13478.html?ald Sublime3 下载:http://www.sublimetext.com/3 PhpStorm 9.0 下载:链接:http://pan.baidu.com/s/1miOK33q 密码:h72c Vim 下载:http://www.vim.org/download.php typora 下载:https://www.typora.io/ 接口文档 http://apidocjs.com/ Google 浏览器扩展 Host修改 Host Switch Plus 下载 Http请求 Postman 下载 Postman Interceptor 下载 Json JSON Formatter 下载 GitHub Octotree 下载 Axure Axure RP Extension for Chrome 下载 Cookie EditThisCookie 下载 编码 Charset:下载 WEB前端助手(FeHelper)下载 快捷方式: Vimium 下载 下载 Google 拓展 http://crx.2333.me/ https://yurl.sinaapp.com/crx.php https://chrome-extension-downloader.com/ 技术相关 XAMPP 下载:https://www.apachefriends.org/zh_cn/download.html Navicat Premium 下载:链接:http://pan.baidu.com/s/1kVP26Uz 密码:2t9s SVN 下载:http://rj.baidu.com/soft/detail/11993.html?ald Git 下载:https://git-scm.com/download UML

JavaScript通过preventDefault()使input[type=text]禁止输入但保留光标

一、说明 取消事件的默认动作。 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作)。例如,如果 type 属性是 "submit",在事件传播的任意阶段可以调用任意的事件句柄,通过调用该方法,可以阻止提交表单。注意,如果 Event 对象的 cancelable 属性是 fasle,那么就没有默认动作,或者不能阻止默认动作。无论哪种情况,调用该方法都没有作用。 二、语法 event.preventDefault() 三、示例 3.1 阻止<a>元素跳转 <a href="http://www.mazey.net/baby/blog" target="_blank" id="a-prevent">点击我看会不会跳转</a> <script> document.getElementById('a-prevent').addEventListener('click',function(e){ var eObj = e || window.event; eObj.preventDefault(); }); </script> 点击我看会不会跳转 3.2 禁止<input>元素键盘输入 <input type="text" id="input-prevent" placeholder="试试能不能输入" /> <script> document.getElementById('input-prevent').addEventListener('keypress',function(e){ var eObj = e || window.event; eObj.preventDefault(); }); </script> JavaScript通过preventDefault()使input[type=text]禁止输入但保留光标

Python学习整理之输入输出input(),print()

廖雪峰Python教程 一、输入 1、输入字符串。 name=input() 这样可以接收一个字符串,包括空格,都可以输入。只有回车不接受,作为结束符。 提示信息的添加: name=input('please input a string')Python所有的输入都是以字符串形式接收,再转化成数字或其他数据 用int()函数可以把字符串转化成数字,比如int(name)。然后name就变成了数字 2、输入多个数字 a=input().split(' ') #默认空格,可改为其他 n=int(a[0]) m=int(a[1])或者 n,m=input().split() 输入两个数字或字符串, 以空格隔开,空格不接受(也可以改为逗号)。int()函数可以把字符串转化成int型数字 3、循环输入(oj题目) while(True): try: a=input() print(a) except: break 适用于oj题目的循环输入多组测试数据时,的循环输入。try:部分实现循环体 二、输出 1、输出字符串 print("Hello,",name) 结尾默认换行,中间逗号默认空格,自行修改: print(name,"Mary",sep=' *此处空格* ',end=' *此处结尾* ')

接口还回的数据自动在头部加上了BOM头,导致json_decode()转换失败.

2019独角兽企业重金招聘Python工程师标准>>> $html = file_get_contents($url); $html = str_replace(' ','',$html); $userInfo = json_decode($html,true); 原因:接口还回的数据自动在头部加上了BOM头,导致转换失败。 解决方案:$html = str_replace(' ','',$html); 转载于:https://my.oschina.net/u/2376927/blog/1301701

【nodejs实战】实现一个通过导入excel表格发送定制邮件web小工具

本程序功能是上传excel表格,然后编辑邮件模板,根据excel每条内容,给每个人发送定制邮件。典型应用场景工资条,模板是相同的,但是每个人都有个性化的内容。 开发这个的起因是公司的hr小姐姐说以后工资条不通过邮件发送,而是纸质工资条,然后调戏下说是不是因为没有自动发邮件的工具。网上一搜好像没什么好的工具,然后就尝试着实现这个功能。 贴上github地址https://github.com/win5do/node-excel2email 主要目标 上传文件读取excel数据根据邮件模板创建不同的邮件发送邮件 github上一搜,找到node-xlsx和nodemailer两个库,前者可以帮我解析excel表格,后者则可以通过smtp服务器发送邮件。下面我们要做的就是实现一个简单的邮箱模板,编写一个易用的前端页面给用户,那上面那个流程串联起来,最后把发送邮件后的状态反馈给用户。 技术选型 后端: node express session pug前端: jquery materialize-css(css框架) webpack通讯: ajax socket.io工具: node-xlsx nodemailer umeditor(富文本编辑器) multer(文件上传) 这个程序功能都放在一个页面里,也就没用vue、react等框架,直接pug + jquery + materialize-css搞定,主要是平时工作都是vue前端端分离,想体验一下传统的玩法。materialize-css是一个和bootstrap类似的css框架,风格是meterial-design风格,非常漂亮。 没有用的数据库,通过session区分用户,数据直接放到内存里,用后即焚。因为需要把每个邮件的发送结果即时反馈给前端,这里用到socket.io,通过tcp连接让服务器给客户端发送消息。查了一些资料,使用ajax轮询或Server-Sent Events也可以实现,不过还是websocket更优雅,对多用户支持更好。 前端资源这块,js模块 scss式样还是通过webpack处理,本来像复古用用gulp,但一想到要写一大堆task,还是webpack的loader方便,配置的也比较熟了,通过watch就能即时编译。 富文本编辑器挑了半天,github上星最多的quill,但是对中文支持不是很好,还有很多一大堆bug或者配置起来超复杂,还是选用了百度的umeditor,功能比较全,没有明显bug,但是不支持umd,囧。 效果预览 最后 nodejs生态的各种轮子齐全,使用简单,把几个轮子组装起来功能满足需求,全后端无缝切换,开发效率杠杠的,这就是nodejs的优势所在。仅以此文记录项目实现的过程。把一个想法实现,还是很有成就感的。 参考文献 编写一个简单的JavaScript模板引擎 用node.js实现HTML5原生的comet(长连接) 学习 NodeJS 第八天:Socket 通讯

Golang 中使用 JSON 的一些小技巧

原文链接: https://zhuanlan.zhihu.com/p/27472716?utm_source=wechat_session&utm_medium=social 英文版原文 : http://attilaolah.eu/2014/09/10/json-and-struct-composition-in-go/ 有的时候上游传过来的字段是string类型的,但是我们却想用变成数字来使用。 本来用一个json:”,string” 就可以支持了,如果不知道golang的这些小技巧,就要大费周章了。 1)临时忽略struct字段 type User struct { Email string `json:"email"` Password string `json:"password"` // many more fields… } 2)临时忽略掉Password字段 json.Marshal(struct { *User Password bool `json:"password,omitempty"` }{ User: user, }) 3)临时添加额外的字段 type User struct { Email string `json:"email"` Password string `json:"password"` // many more fields… } 4)临时忽略掉Password字段,并且添加token字段 json.Marshal(struct { *User Token string `json:"token"` Password bool `json:"password,omitempty"` }{ User: user, Token: token, }) 5)临时粘合两个struct type BlogPost struct { URL string `json:"

Android Studio设置默认签名文件的路径

Android Studio设置默认签名文件的路径 在我们对接第三方(百度地图、微信分享等)的时候,由于他需要正式的签名,所以每次打包测试是一个蛋疼的事,好在Android studio给我们提供了配置默认签名路径的方法。 写出本人常用的一种方式: 找到工程中build.gradle文件,在文件的添加此段代码即可 android { signingConfigs { debug { storeFile file("/文件名.jks") storePassword 'android' keyAlias '别名' keyPassword 'android' } } } 说明: storeFile file(“/文件名.jks”) 这里面设置的是签名路径。我这里一般是把签名文件放在工程的根目录(记得上线时候删除) 还有网上说的第二种方式: android { signingConfigs { release { storeFile file("/文件名.jks") storePassword 'android' keyAlias '别名' keyPassword 'android' } } buildTypes { debug { signingConfig signingConfigs.release } } } 总结: 两种方式其实都一样,第一种方式只是更简洁一点,所以建议选择第一种方式。

Hibernate实战(第二版)笔记----第二章--开启一个项目

最近在看Hibernate实战(第二版)这本书,个人感觉翻译的不是很好,有些地方读都读不通。。。 随便做下笔记,书中提供下载源码的地址为: http://jpwh.org 下载下来之后,目录如下 其中: apps----第18/19章对应的客服端与服务端程序 environment----一些通用的环境 examples----一些实例 model---一些实体类 shared---共享的一些帮助类什么的 README.txt说明文件如下: ============================================================================== Java Persistence with Hibernate - Second Edition http://www.manning.com/bauer3/ ============================================================================== 入门 ------------------------------------------------------------------------------ - Install JDK 7. - Install Maven 3.x. - 运行'mvn clean test'来执行所有的例子(这将需要一段时间 依赖关系必须首次下载)。 - 打开报告 examples/target/surefire-reports/index.html - 详细了解每个子目录的pom.xml文件中的模块并进行浏览 源代码。 - 获取更多的日志输出, 编辑 shared/src/main/resources/logging.properties 并运行测试。 所有日志输出都将写入文件 examples/target/surefire-reports/TestSuite-output.txt - 要仅运行单个测试,请先将模块安装到您的本地Maven中 存储库使用'mvn clean install'。 然后运行测试: mvn -pl examples -Dtest=org.jpwh.test.simple.CRUD clean test - 如果只运行单个测试,则控制台日志输出将被写入 在以前的情况下,一个不同的文件: examples/target/surefire-reports/org.jpwh.test.simple.CRUD-output.txt 运行示例APPS ------------------------------------------------------------------------------ - 安装Wildfly 8.