首页 文章 精选 留言 我的

精选列表

搜索[便捷],共6722篇文章
优秀的个人博客,低调大师

Chrome OS超便捷安装指南

Chrome OS是一款Google开发的基于PC的操作系统。 Google Chrome OS是一款基于Linux的开源操作系统。Google在自己的官方博客表示,初期,这一操作系统将定位于上网本、紧凑型以及低成本电脑。这款开源软件将被命名为Chrome OS,谷歌公司于2010年12月7日(北京时间12月8日2点30分)在美国举行Chrome相关产品发布会,发布会上正式发布[Chrome Web store](https://baike.baidu.com/item/Chrome Web store)和Chrome OS。 百度百科-GOOGLE CHROME OS 最近在操作系统领域的一则新闻引起了大家的注意,在 IDC 的数据统计中我们看到了谷歌的Chrome OS操作系统的市场份额超越了MacOS升至第二,仅次于微软的Windows。第一眼看到这个统计非常令人意外,平时都不怎么听说过的Chrome OS的增长势头居然如此的凶猛。不过一想原因其实也能理解,在国内由于某些原因,对于Google的产品大家本身接触的机会就不多,更别说会使用Chromebook笔记本了。 随手一搜就能看到很多关于Chrome OS的新闻: Chrome OS市场份额超越MacOS 出于好奇,我决定体验一下这个听起来很厉害的Chrome OS。下面是整个安装体验过程: 安装步骤 制作U盘启动器 安装Chrome OS 制作U盘启动器(适用于Windows环境下) 由于谷歌方面并没有开放Chrome OS镜像文件的下载,不过类似于Chrome浏览器,Chrome OS也拥有自己的开源版本系统Chromium OS,所以第三方可以基于Chromium OS来开发出类似于Chrome OS的系统。所以在本文中我将安装基于Chromium OS的CloudReady系统(一个基于Chromium OS开发出来的操作系统,国内也有类似的操作系统如:fyde OS)来体验Chrome OS的魅力。 1.进入CloudReady官网页面 进入CloudReady官网页面,鼠标下拉到如下位置: 选择版本 CloudReady提供了三种版本的系统供用户选择,这里我们选择第三种面向个人和家庭的免费版本。点击“GET THE FREE VERSION”按钮,进入系统镜像的下载页面。 2.下载U盘启动器制作工具 在制作U盘启动器之前需要准备一个容量大于8GB的U盘,CloudReady官方也提供了制作U盘启动器的工具,不过目前此工具只针对Windows用户,如果是Mac用户可以使用后面我提供的方法来制作系统启动盘。 进入下载页面,页面下拉到如下位置: 下载u盘启动器制作工具 点击“DOWNLOAD USB MAKER”将工具下载至本地,并安装。 3.制作USB启动盘 将准备的U盘插入电脑中,随后打开刚刚安装的启动盘制作工具,按如下步骤进行操作: 制作U盘启动器 操作至此,在windows下,我们的CloudReady U盘启动器已制作完成。 制作U盘启动器(适用于MacOS、ChromeOS环境下) 我们看到了在Windws下制作CloudReady的U盘启动器非常的方便快捷,不过如果我们的操作系统是Mac OS或者Chrome OS的时候,U盘启动器的制作过程会略微复杂一点。 1.下载镜像 进入下载页面之后,鼠标下拉到如下位置: 镜像下载 点击图中的“DOWNLOAD 64-BIT IMAGE”按钮将镜像下载至本地。 2.安装并启动Chromebook Recovery Utility 下载Chromebook Recovery Utility 扩展并将其添加到您的Chrome浏览器中(如果没有安装Chrome浏览器,则需要先安装chrome浏览器)。 添加扩展 随后在Add "Chrome Recovery Utility"的提示下,点击“Add app”: add app 此时Chrome Recovery Utility应用已被添加至系统的应用程序列表中,打开Chrome Recovery Utility: 打开Chrome Recovery Utility 如果找不到该页面,可以手动在浏览器地址栏中输入chrome://apps来访问。 打开Chrome Recovery Utility后,点击应用窗口右上角的设置图标,并点击“Use Local Image”,随后选择刚刚下载的镜像文件: use local image 点击“Get started”按钮,进入下一步,此时插入我们准备好的U盘,并进行如下操作: 插入u盘 选中我们插入的U盘,继续点击下一步。 此时出现启动盘制作进度条,等待完成,至此U盘启动器制作完成: 制作完成 安装CloudReady 将制作完成的U盘启动器插入计算机,随后重启我们的计算机并进入BIOS系统(关于如何进入BIOS读者可以自行百度,不同品牌的计算机进入方式不同),在BIOS的Boot选项中修改计算机的启动顺序(将从U盘启动放在第一位),然后退出BIOS重启计算机,稍等片刻CloudReady将在计算机中启动。 如果是Mac用户,在计算机重启的过程中一直按住“option”键,进入启动项选择界面,选择我们插入的U盘作为启动项启动。 至此,类Chrome OS系统CloudReady就已经成功启动,等待片刻,剩下的步骤就是体验或者安装到本机。 启动中... 注意事项:由于在国内访问Google相关站点时会受到一定的限制,所以需要提前准备一些工具手段来连接到Google的服务。 参考: https://www.lifewire.com/install-chrome-os-on-pc-4174289 https://guide.neverware.com/build-installer/working-mac-os/#download-cloudready 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 欢迎访问笔者博客:https://www.techflower.cn 关注笔者公众号,推送各类原创/优质技术文章 ⬇️ 😂🤣🤨🤩🥴😘🥸我也是一名低调的Up主:https://space.bilibili.com/330000719

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

智慧城市让生活更便捷

“从前早高峰送孩子上学得花上半个多小时,现在只要十几分钟,这个信号灯改造得挺管用的! ”11月11日,说起现在交通信号机的便利,马鞍山市民张女士满面笑容。近年来,马鞍山交警针对该市18条道路的智能交通安全设施进行新建、改建和扩建。张女士每天接送孩子必经的雨山路与江东大道就是智能交通信号灯配时优化的路段之一。如今,在这两条路的交口,整齐排列的新型智能交通信号机下方,人车通行井然有序。 11月12日,在南谯路巡查的滁州市琅琊区城管执法局琅琊大队执法人员利用“城管通”采集和上传商户违章行为。该局今年4月建立了数字城管指挥中心,从公安部门转接1116个监控探点,涵盖辖区32条主次干道和400余条街巷。网格责任点的执法人员配有“城管通”设备,能够及时监控和反馈市容、违建与环卫等方面的问题,同时掌控执法人员的履职状态,此举大大提高了城管水平和工作效率。 这些只是“智慧城市”建设给人民群众和政府管理带来诸多便利的缩影。在日常生活中,人们会发现,许多富含“高科技成分”的创新举措,正在让我们的城市变得越来越 “聪明”。生产生活“一网打尽”,服务资讯“装进口袋”,办理事务“足不出户”。智慧城市是运用物联网、云计算、大数据、空间地理信息集成等新一代信息技术,促进城市规划、建设、管理和服务智慧化的新理念和新模式,涉及人们工作、居家、出行、就医、办证、购物等方方面面,为城市居民创造美好生活,促进城市和谐发展。 2012年开始,住建部启动国家智慧城市试点申报,我省已有合肥、芜湖、滁州等16个市(县、区)获批,试点数量位居全国前列。近年来,试点地区从解决城市发展的实际问题入手,重点围绕智慧建筑、数字城管、智慧能源、智能交通、智慧社区、污水处理、农业物联网等重点领域推进智能化平台建设,因地制宜探索实践了务实有效、典型示范的建设模式。 “十三五”期间,我省将加大“数字安徽”建设力度,推动智慧城市时空信息云平台建设。计划在今年年底全面完成16个地级市的“数字城市”建设;到“十三五”末,完成30%“数字县域”建设,力争16个市全面启动智慧城市时空信息云平台建设。 本文转自d1net(转载)

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

Apache DeltaSpike 1.9.3 发布,便捷 CDI 扩展

Apache DeltaSpike 1.9.3 发布了,ApacheDeltaSpike包含一组 JSR-299 (CDI) 扩展,用于构建 Java SE 和 EE 平台的应用程序。 新版本主要特性如下: 支持组件配置和其他有用的 CDI 实用程序的核心模块 JSF 集成,包括向后移植 Java EE 6 的 JSF 2.2 功能 JPA 集成和事务支持 数据模块,用于在 JPA 之上创建易于使用的存储库模式 详情可查看更新说明。

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

JEIM版本更新【2.0.0】:沟通更便捷

JEIM是基于JEPaaS低代码快速开发平台(JEPaaS链接)而搭建,支持个性化的前端设计,快速解决办公途中的沟通协同问题、缩短企业内部沟通距离、提高企业工作效率。 本次升级优化了聊天及通讯录的界面,并增加了群组中添加成员的功能。 【适用场景】 主要适用于企业内部沟通,企业内部管理通讯等企业办公场景。 【功能包括】 好友聊天 群组聊天 通讯录 群组中添加成员 pc端沟通界面 pc端讨论组沟通界面 手机端讨论组及通讯录 【本次升级内容】 1.前端采用了MVC的设计模式; 2.增加快速建立单聊的通道:点击群组的群成员头像,右侧面板展示群成员的具体信息,点击发捷信; 3.对群组的操作会有socket消息的推送:目前增加的是创建一个群组;添加一个群成员,群成员可以退出群组; 4.快速搜索,目前支持汉字,拼音,首拼(大写&&小写),结果高亮; 【相关链接】 JEIM详细介绍:点击查看详情 JEIM下载地址:点击下载 JEPaaS低代码快速开发平台详细介绍:点击查看详情 JEPaaS低代码快速开发平台下载地址:点击下载 JEPaaS低代码快速开发平台绿色版下载地址:点击下载

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

Ophone平台便捷呼叫功能实现原理

在OPhone平台上,捕获用户在界面上的触发事件有很多种方法。一般来讲,开发者会从用户交互的特定的View对象(例如Button、TextView等)中捕捉事件,并使用View类提供方法来实现。前文中我们分析了软件的第一个功能的构成形式,在界面方面,由按钮和菜单两部分组成,初始化代码如下: public class CallAST extends Activity implements OnClickListener{ private Button btn1, btn2,btn3; private TextView tv; private EditText edit1,edit2; private SharedPreferences contact; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); btn1 = (Button)findViewById(R.id.Button01); btn2 = (Button)findViewById(R.id.Button02); btn3 = (Button)findViewById(R.id.Button03); contact = getSharedPreferences("contact",0); btn1.setText(contact.getString("Button01name","")); btn2.setText(contact.getString("Button02name","")); btn3.setText(contact.getString("Button03name","")); tv = (TextView)findViewById(R.id.TextView01); btn1.setOnClickListener(this); btn2.setOnClickListener(this); btn3.setOnClickListener(this); } 上述代码在界面上添加3个按钮,并从SharedPreferences中读取按钮的标题。菜单用于实现按钮标题的修改,采用BT1、BT2、BT3的菜单名称分别对应3个按钮。代码如下: @Override public boolean onCreateOptionsMenu(Menu menu) { int i; for(i=1;i<=3;i++) menu.add(0,i,i,"BT"+Integer.toString(i)); return super.onCreateOptionsMenu(menu); } 在上述代码中,与以往程序最大的不同之处在于:在Class的声明中多了implements OnClickListener。根据MVC模式的设想,该功能用于实现(implements)单击响应的接口(interface)。在单击按钮时,软件呼叫该按钮对应的联系人号码。它的定义是: abstract void onClick(View v) 代码如下: public void onClick(View arg0) { String callnum=""; contact = getSharedPreferences("contact",0); if (arg0==btn1) callnum = contact.getString("Button01num",""); if (arg0==btn2) callnum = contact.getString("Button02num",""); if (arg0==btn3) callnum = contact.getString("Button03num",""); if (!(callnum.equals(""))) startActivity(new Intent( Intent.ACTION_CALL, Uri.parse("tel:"+callnum))); } 知识点:Event Listener和Event Hanlder 当相应的事件在该对象上发生时,这些方法被OPhone的框架所呼叫。例如:当一个View(如一个Button)被单击,onTouchEvent方法会在该对象上被调用,为了响应该事件,我们必须extend该Class,并且override这个方法。这就是View类还包含一系列通用接口和回调的原因,以便于用户可以统一地定义和管理。这些接口(例如上面代码中的OnClickListener接口),就称为event listener,是我们捕捉用户行为的工具。 当我们使用event listener来监听用户行为时,如果确实有需要extend一个view来建立一个特定的组件,在这种情况下,你可以使用event handler来为该class定义默认的事件行为,如onKeyDown、onKeyUp、onTouchEvent、onTrackballEvent、onFocusChanged。 弹出对话框 在此之前的所有代码,都是从SharedPreferences中取出数据(按钮标题和呼叫号码),但是我们还没有看到写入数据的过程——在菜单中编辑SharedPreferences的数据。在单击菜单时,软件弹出窗口,用户在弹出的窗口中输入标题和呼叫号码。Windows使用Messagebox函数来管理对话框,在OPhone中,需要使用AlertDialog.Builder来建立对话框并实现数据的提交。在onCreate中需要新建AlertDialog.Builder对象,代码如下: builder = new AlertDialog.Builder(this); @Override public boolean onOptionsItemSelected(MenuItem item) { final int itid = item.getItemId(); LinearLayout layout = new LinearLayout(CallAST.this); //新建对话框布局用于放置文本框和按钮 layout.setOrientation(LinearLayout.VERTICAL); //设置控件走向 LinearLayout.LayoutParams param = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); edit1 = new EditText(CallAST.this); edit2 = new EditText(CallAST.this); layout.addView(edit1, param); //在layout上添加文本框 layout.addView(edit2, param); builder.setView(layout); //将layout和对话框相关联 builder.setPositiveButton("OK",new DialogInterface.OnClickListener() { @Override //添加OK按钮及其响应 public void onClick(DialogInterface arg0, int arg1) { writetosp(itid,edit1.getText().toString(), edit2.getText().toString());} //将按钮标题和呼叫号码写入后台配置文件 }); builder.show(); return super.onOptionsItemSelected(item); } 保存输入数据 在弹出窗口的代码中,我们对LinearLayout很熟悉,因为在main.xml的界面描述中,layout是不可缺少的元素。但是在这里,layout是作为一个界面对象存在的,开发者对layout对象进行初始化和编辑,并将其视图(View)显示在builder上。我们在前文中提到,builder是一个对话框管理器,负责对话框的界面和按钮响应。对话框的“OK”按钮调用了一个叫做writetosp的方法,该方法将对话框中的数据写入SharedPreferences,供按钮的标题和呼叫响应提取。代码如下: private void writetosp(int spid,String name,String num){ contact = getSharedPreferences("contact",0); contact.edit().putString("Button0"+Integer.toString(spid)+ "name",name).commit(); contact.edit().putString("Button0"+Integer.toString(spid)+ "num",num).commit(); switch(spid){ case 1:{ btn1.setText(name); break; } case 2:{ btn2.setText(name); break; } case 3:{ btn3.setText(name); break; } }} 上述代码将每个按键的参数,如Button01name、Button01num的形式存入SharedPreferences。在写入按键参数之后,后台的数据发生了变化,但是按钮的标题并没有更新,所以需要在后面的switch-case部分,实时更新按钮标题。在输入以上代码后,第一个功能基本完成,运行效果如图4-7所示,单击“张三”后,程序出现错误。 如何使用permission 在Debug视图中查看日志,可以看到一大串的错误信息,第一条是Permission Denial:starting Intent{action=android.intent.action. CALL data=tel: 13912345678 comp={com.android.phone/com.android.phone.InCallScreen}} from ProcessRecord{43bc7a20 1601:oms.CallAST/10040}(pid=1601,uid= 10040)requires android.permission.CALL_PHONE,如图4-8所示。 日志跟踪结果中指出:“系统不允许呼叫,需要许可证(Permission)—android. permission.CALL_PHONE”。那究竟什么是系统允许的操作,什么是系统禁止的操作?这就要涉及OPhone系统的安全许可机制。OPhone系统在默认的情况下,应用程序不允许访问可能影响操作系统或者其他应用程序的API。这些API都是敏感操作,如访问语音网络、数据网络、访问硬件等。如果开发者希望程序访问这些敏感API,必须在AndroidManifest.xml中添加请求。对于用户来说,在安装该软件时,系统会显示出敏感API的列表,可以使用户看到该软件对系统的影响,并选择是否继续安装。这和手机Java平台不同,J2ME在安装时不作提示,但是在运行时,例如访问网络时会弹出对话框询问是否允许访问网络。OPhone在程序安装时就设置好规则,让用户在使用时具备更好的体验。 为了让系统允许呼叫操作,开发者需要在AndroidManifest.xml的permissions选项卡中添加安全许可,如图4-9所示。 单击“Add”按钮,选择“Uses Permission”,如图4-10所示。在右侧下拉列表中选择android.permission. CALL_PHONE,完成安全许可的添加,如图4-11所示。在AndroidManifest.xml文件的文本标签中可以看到文件多了一行“Uses Permission”。 知识点:常用Permission列举 l ACCESS_FINE_LOCATION:精确位置信息获取,如GPS应用等。 l ACCESS_NETWORK_STATE/CHANGE_NETWORK_STATE:获取/改变网络状态信息。 l ACCESS_WIFI_STATE/CHANGE_WIFI_STATE:获取/改变WiFi等WLAN无线网络的状态。 l RECEIVE_MMS/RECEIVE_SMS/SEND_SMS:收彩信,收发短信。 l BATTERY_STATS:获取Android平台上电池设备信息。 l CAMERA:摄像头权限控制。 l INTERNET:访问网络。 完成Permission的添加之后,再次运行程序,单击“张三”按钮,可以看到软件界面切换至拨号界面,电话被拨出,如图4-12所示。在OPhone中,一个应用程序的进程就是一个安全的沙盒。它不能干扰其他应用程序,除非显式地声明了“Permissions”,以便它能够获取基本沙盒所不具备的额外的能力。它请求的这些权限“Permissions”可以被各种各样的操作处理,如自动允许该权限或者通过用户提示或者证书来禁止该权限。应用程序需要的那些“Permissions”是静态的,在程序中声明,所以他们会在程序安装时就被知晓,并不会再改变。 知识点:什么是沙盒? 沙盒(Sandbox,也称为沙箱)是一种容器,所谓容器,也就是通过某种保护层之类的东西与外界隔离开。在军事上,人们常用沙盒按照一定的比例制作地形模型以及放置代表军队与武器布置的模型或图案,不用了可将沙子推倒重来。在现在的计算机领域中,沙盒是一种安全软件,可以将一个程序放入沙盒运行,这样它所创建、修改、删除的所有文件和注册表都会被虚拟化重定向,也就是说所有操作都是虚拟的,真实的文件和注册表不会被改动,这样可以确保病毒无法对系统关键部位进行改动而破坏系统。 本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/817462,如需转载请自行联系原作者

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

DigitalPalette —— 简单便捷的色彩编辑器

简介 DigitalPalette 是一款免费开源软件,它可以帮助您从色彩转轮或者已有图像中生成一组符合一定调和规则的色彩,并应用到您的创作中。 特性 免费并且开源的色彩编辑器。 可以从色彩转轮中创建一组色彩。 可以从色彩图像中定位一组色彩。 可以将创建的色彩组添加到色彩仓库中。 可以将创建的色彩组导入到其他图像编辑器中。 … 以及更多! 截图 从色彩转轮中创建一组色彩。 从色彩图像中定位一组色彩。 将创建的色彩组添加到色彩仓库中。 支持的文档格式 DigiPale 色彩组文档 (*.dps) 此格式文档中保存有当前色彩组中所有的色彩数据,包括色彩的调和规则、色彩的十六进制(Hex)代码、RGB 数值、HSV 数值等。此格式文档可以作为备份使用并导入(恢复)到 DigitalPalette 中。 DigiPale 色彩仓库文档 (*.dpc) 此格式文档中保存有色彩仓库中所有的色彩数据,包括色彩的调和规则、色彩的十六进制(Hex)代码、RGB 数值、HSV 数值等。此格式文档可以作为备份使用并导入(恢复)到 DigitalPalette 中。 纯文本文档 (*.txt) 此格式文档中保存有基本的色彩数据,包括色彩的 Hex 代码、RGB 数值、HSV 数值等。此格式文档比 DigiPale Json 格式文档的可读性更好,可以直接用普通编辑器打开、阅览和编辑。 Adobe 样板文档 (*.aco) 此格式文档中保存有所有的色彩数值,可作为色彩样板导入到 Photoshop、GIMP、优动漫 Paint 等图像处理软件中。 GIMP 色板文档 (*.gpl) 此格式文档中保存有所有的色彩数值,可作为色彩样板导入到 GIMP、Krita 等图像处理软件中。 Pencil 色板文档 (*.xml) 此格式文档中保存有所有的色彩数值,可作为色彩样板导入到 Pencil2D 等图像处理软件中。

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

Android——TabLayout——选项卡的便捷实现

个人博客CoorChice,https://chenbingx.github.io/ ,最新文章将会首发CoorChice的博客,欢迎探索哦 ! 同时,搜索微信公众号CoorChice,或扫描文章末尾二维码,可以关注我的微信公众号。同期文章也将会优先推送到微信公众号中,以提醒您有新鲜文章出炉。 TabLayout可以方便的实现导航标签功能,它需要与ViewPager联合使用,ViewPager加载适配器,TabLayout加载ViewPager。 使用前需要先导入desgin包。 属性 app:tabIndicatorColor="@color/white" // 下方滚动的下划线颜色 app:tabSelectedTextColor="@color/gray" // tab被选中后,文字的颜色 app:tabTextColor="@color/white" // tab默认的文字颜色 几个关键方法 mTabLayout.setTabMode(TabLayout.MODE_FIXED); //设置TabLayout的标签模式 mTabLayout.addTab(); //为TabLayout添加标签 mTabLayout.setupWithViewPager(); //为TabLayout添加ViewPager 下面在实例中介绍 activity.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" tools:context="com.icechen.tablayoutdemo.MainActivity"> <android.support.design.widget.TabLayout android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabTextColor="#252525" app:tabSelectedTextColor="#ff7473" app:tabIndicatorColor="#d09ec6" > </android.support.design.widget.TabLayout> <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> </android.support.v4.view.ViewPager> </LinearLayout> activity.java public class MainActivity extends AppCompatActivity { private TabLayout mTabLayout; private ViewPager mViewPager; private String[] titles = {"最新","一周最热","买买买","读书","设计","文艺","礼物","指南","爱美"}; private FragmentManager fragmentManager; private List<Fragment> fragments = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragmentManager = getSupportFragmentManager(); for (int i = 0; i < titles.length; i++) { fragments.add(Fragment1.newInstance(""+i)); } initView(); } private void initView() { mTabLayout = (TabLayout) findViewById(R.id.tabLayout); mViewPager = (ViewPager) findViewById(R.id.viewPager); for (int i = 0; i < titles.length; i++) { //设置tab的标题 mTabLayout.addTab(mTabLayout.newTab().setText(titles[i])); } mViewPager.setAdapter(new FragmentPagerAdapter(fragmentManager) { @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } //使用Fragment需要指定好tab @Override public CharSequence getPageTitle(int position) { return titles[position % titles.length]; } }); //MODE_SCROLLABLE:可以滚动 //MODE_FIXED:会适配到屏幕 mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); //将ViewPager加载到TabLayout中,使它们能够联动 mTabLayout.setupWithViewPager(mViewPager); } } fragment.java public class Fragment1 extends Fragment { public static Fragment1 newInstance(String content) { Bundle args = new Bundle(); args.putString("content",content); Fragment1 fragment = new Fragment1(); fragment.setArguments(args); return fragment; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_tab,container,false); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ((TextView)(getView().findViewById(R.id.content))).setText(getArguments().getString("content")); } } 效果 CoorChice的公众号

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

Google 打造云中 Hadoop 便捷版 强势对抗 AWS

Google Compute Engine 的虚拟机提供了一种快速、可靠的方式来运行 Apache Hadoop。如今,Google 正在努力通过Google Cloud Storage Hadoop预览版更简单的在 Google Cloud Platform 上运行Hadoop,这样你就可以更加专注于数据处理逻辑而不是集群管理和文件系统。 下图是Hadoop在Google Cloud Platform上的图解。在Google Cloud Storage上存储数据时HDFS、NameNode是可选的。 在十年前,从Google第一次介绍了Google File System (GFS)——Hadoop Distributed File System(HDFS)的基础——Google一直在努力改善Google大数据处理的存储系统。最新的成果是Colossus。 今天的发行版本提供了准确的——使用了一个简单的连接器库,Hadoop现在可以直接地在Google Cloud Storage运行——一个对象存储创建在Colossus上。这意味着你在大数据处理时可以从Google的这项技术中获益。 下面是用Google Cloud Storage运行Hadoop的优势: 兼容性:Google Cloud Storage connector for Hadoop 代码兼容Hadoop。只要将URL指向你的数据就可以。 快速启动:数据准备处理。当你的数据复制到HDFS以及NameNode,你不必等待过长时间来结束这个安全模式。同时,你也不需要花费数据复制VM时间。 更高的可用性和可扩展性: Google Cloud Storage比HDFS具有更高的可用性,因为它有独立的Compute Nodes和NameNode。如果虚拟机拒绝(或云禁止、崩溃)你的数据还在。 低成本:包括存储和计算:存储,因为没有必要维护两份数据,一个用于备份,另一个用于运行Hadoop;计算,因为你不需要仅仅为服务数据而保持VM一直运行。同时,它是以分钟计费,你可以在多个内核上更快的运行Hadoop,并且你的成本不再是四舍五入为一个小时来计算。 没有存储管理开销:鉴于HDFS需要日常维护——比如文件系统校验、重整、升级、反转和NameNode重启——Google Cloud Storage只需要为计算付费。你的数据是安全和一致的,不需要更多的努力。 互通性:通过在Google Cloud Storage保管你的数据,你可以从Google上其它已经完美融合的服务中获益。 性能:由于有了Google Cloud Storage,Google的基础设施将会比HDFS提供更高的性能——因为它没有管理和维护开销。 http://static.oschina.net/uploads/img/201401/17124830_nkWm.jpg" > 如果想了解Google Cloud Platform到底有哪些优势,可以访问这个简单指导 。 Google很乐意听到你关于如何更好的在Google Cloud Platform运行Hadoop和MapReduce的反馈和想法。 写在最后:为了与该领域的主要对手 AWS及其EC2竞争,Google已经通过增加一系列得新特性来巩固其平台优势,包括更先进的路由、高达10TB的大型永久磁盘、更新App Engine托管服务以及降低成本等。可以预测,这些措施将使Google获得数十亿美元的基础设施市场,同时,我们期待Google能够为App继续开 放更大的空间。 文章转载自 开源中国社区 [http://www.oschina.net]

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

史上最便捷搭建RocketMQ服务器的方法

最近学习使用 rocketmq,需要搭建 rocketmq 服务端,本文主要记录 rocketmq 搭建过程以及这个过程踩到的一些坑。至于有多简单呢,在本机已有Docker环境的情况下只需要三步即可。 从github上面拉取项目 修改broker.conf中的brokerIP1 参数,修改为本机IP 进入docker-compose.yml文件所在路径,执行docker-compose up命令即可 前言 首先我们是使用Docker进行搭建环境的,所以我们先要在自己机器上的安装Docker,具体的安装过程以及对于Docker的介绍官方文档里面说的很清楚了https://docs.docker.com/get-started/。 我们要搭建RocketMQ服务器,那么我们就要知道大概搭建RocketMQ服务器需要部署哪些东西。对于RocketMQ有一个架构图,如下所示。而图中所示的Producer(生产者)和Consumer(消费者)无需我们搭建,因为那是作为一个服务器进行启动的。nameserver就是一个注册中心一样组件,我们可以将其简单理解成springcloud中的Eureka,那么nameserver是需要我们搭建的。broker就是真正处理消息的地方,也是需要我们搭建的。 正常情况我们搭建上面所提到的两个组件其实就能已经能够满足我们的发送接收消息的需求了。但是通常情况下我们还需要搭建一个Web可视化的平台用来查看MQ的服务状态、消息的消费情况、主题的队列配置等等。这里使用rocketmq-console。同样也是通过Docker来进行安装。 部署 上面我们提到了需要安装三个组件,那么这三个组件又是需要能够互相通信连接的,考虑到分开部署进行配置连接信息比较麻烦,于是这里我们采用docker-compose进行配置部署。 首先我们需要创建docker-compose.yml配置文件。文件内容如下 version: '3.5' services: rmqnamesrv: image: foxiswho/rocketmq:server container_name: rmqnamesrv ports: - 9876:9876 volumes: - ./logs:/opt/logs - ./store:/opt/store networks: rmq: aliases: - rmqnamesrv rmqbroker: image: foxiswho/rocketmq:broker container_name: rmqbroker ports: - 10909:10909 - 10911:10911 volumes: - ./logs:/opt/logs - ./store:/opt/store - ./conf/broker.conf:/etc/rocketmq/broker.conf environment: NAMESRV_ADDR: "rmqnamesrv:9876" JAVA_OPTS: " -Duser.home=/opt" JAVA_OPT_EXT: "-server -Xms128m -Xmx128m -Xmn128m" command: mqbroker -c /etc/rocketmq/broker.conf depends_on: - rmqnamesrv networks: rmq: aliases: - rmqbroker rmqconsole: image: styletang/rocketmq-console-ng container_name: rmqconsole ports: - 8080:8080 environment: JAVA_OPTS: "-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false" depends_on: - rmqnamesrv networks: rmq: aliases: - rmqconsole networks: rmq: name: rmq driver: bridge 然后在与docker-compose.yml同级下面相应的建立三个文件夹conf、logs、store。然后在conf文件夹下面建立broker.conf配置文件,所有文件的目录位置如下所示。 docker-compose.yml conf - broker.conf logs store 然后在编写broker.conf配置文件里面的内容 # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # 所属集群名字 brokerClusterName=DefaultCluster # broker 名字,注意此处不同的配置文件填写的不一样,如果在 broker-a.properties 使用: broker-a, # 在 broker-b.properties 使用: broker-b brokerName=broker-a # 0 表示 Master,&gt; 0 表示 Slave brokerId=0 # nameServer地址,分号分割 # namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876 # 启动IP,如果 docker 报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to &lt;192.168.0.120:10909&gt; failed # 解决方式1 加上一句 producer.setVipChannelEnabled(false);,解决方式2 brokerIP1 设置宿主机IP,不要使用docker 内部IP brokerIP1=192.168.1.16 # 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数 defaultTopicQueueNums=4 # 是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭 !!!这里仔细看是 false,false,false autoCreateTopicEnable=true # 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true # Broker 对外服务的监听端口 listenPort=10911 # 删除文件时间点,默认凌晨4点 deleteWhen=04 # 文件保留时间,默认48小时 fileReservedTime=120 # commitLog 每个文件的大小默认1G mapedFileSizeCommitLog=1073741824 # ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整 mapedFileSizeConsumeQueue=300000 # destroyMapedFileIntervalForcibly=120000 # redeleteHangedFileInterval=120000 # 检测物理文件磁盘空间 diskMaxUsedSpaceRatio=88 # 存储路径 # storePathRootDir=/home/ztztdata/rocketmq-all-4.1.0-incubating/store # commitLog 存储路径 # storePathCommitLog=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/commitlog # 消费队列存储 # storePathConsumeQueue=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/consumequeue # 消息索引存储路径 # storePathIndex=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/index # checkpoint 文件存储路径 # storeCheckpoint=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/checkpoint # abort 文件存储路径 # abortFile=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/abort # 限制的消息大小 maxMessageSize=65536 # flushCommitLogLeastPages=4 # flushConsumeQueueLeastPages=2 # flushCommitLogThoroughInterval=10000 # flushConsumeQueueThoroughInterval=60000 # Broker 的角色 # - ASYNC_MASTER 异步复制Master # - SYNC_MASTER 同步双写Master # - SLAVE brokerRole=ASYNC_MASTER # 刷盘方式 # - ASYNC_FLUSH 异步刷盘 # - SYNC_FLUSH 同步刷盘 flushDiskType=ASYNC_FLUSH # 发消息线程池数量 # sendMessageThreadPoolNums=128 # 拉消息线程池数量 # pullMessageThreadPoolNums=128 配置文件中的内容我们只需要改动一点即可,即brokerIP1 这个属性,我们将其更改为我们本机的ip,可以利用ipconfig进行查看。 修改完以后我们直接在docker-compose.yml文件所在的位置输入命令docker-compose up即可启动。启动成功以后在浏览器中输入http://localhost:8080/即可看到管理页面,就表示我们搭建成功了。 使用Springboot快速上手 这里将会使用 springboot 快速上手使用 mq,将会使用rocketmq-spring-boot-starter模块。 pom 配置如下 <!--在pom.xml中添加依赖--> <dependency> <groupid>org.apache.rocketmq</groupid> <artifactid>rocketmq-spring-boot-starter</artifactid> <version>2.0.3</version> </dependency> gradle配置如下 implementation 'org.apache.rocketmq:rocketmq-spring-boot-starter:2.0.3' 消费服务发送方配置如下: ## application.properties rocketmq.name-server=ip:9876 rocketmq.producer.group=my-group 消费服务发送方程序如下: @SpringBootApplication public class ProducerApplication implements CommandLineRunner { @Resource private RocketMQTemplate rocketMQTemplate; public static void main(String[] args){ SpringApplication.run(ProducerApplication.class, args); } public void run(String... args) throws Exception { rocketMQTemplate.convertAndSend("test-topic-1", "Hello, World!"); rocketMQTemplate.send("test-topic-1", MessageBuilder.withPayload("Hello, World! I'm from spring message").build()); } } 这里图省事的话可以将消费者和生产者写道同一个项目中。 消息消费方配置如下: ## application.properties rocketmq.name-server=ip:9876 消息消费方运行程序如下: @SpringBootApplication public class ConsumerApplication{ public static void main(String[] args){ SpringApplication.run(ConsumerApplication.class, args); } @Slf4j @Service @RocketMQMessageListener(topic = "test-topic-1", consumerGroup = "my-consumer_test-topic-1") public static class MyConsumer1 implements RocketMQListener<string> { public void onMessage(String message) { log.info("received message: {}", message); } } } 到现在为止我们就可以在本机上快乐的试验各种关于RocketMQ的相关东西了。 RocketMQ的Docker配置文件存放处 RocketMQ的Docker配置文件存放处 RocketMQ的Docker配置文件存放处 大家可以直接从上面拉取项目,启动RocketMQ只需要两步。 修改broker.conf中的brokerIP1 参数,修改为本机IP 进入docker-compose.yml文件所在路径,执行docker-compose up命令即可 如果大家不想自己搭建Springboot项目的话,可以从https://github.com/modouxiansheng/Doraemon上面直接拉取下来就行了。</string>

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

5款便捷的App帮你预定出租车

在我们开始之前,我想先提一条建议:在下载应用之间,最好是检查一下地理服务区。很多应用只在特定国家或者特定城市很好用。我曾尝试了列出一个尽可能覆盖面广的应用榜单,但是确实存在很明显的地域限制--不过我选择这些应用都是有原因的。 1、Uber Uber(如图A)是一款在多个国家都广受欢迎的出租车服务应用。这款应用的基本理念就是,你可以通过Uber司机来安排乘坐,他们通常是使用私家车的普通人。Uber应用可以用于选择Uber司机来接你。 图A 这款应用详单简单,但是有一点让我受不了:你必须注册并提供支付信息(例如信用卡号或者PayPal账户),甚至只是你刚开始看看这款应用有些什么之前。此外,当你完成的时候似乎没有办法删除你的支付信息或者删除帐号。 Uber应用支持iOS、安卓和Windows Phone。 2、Easy Taxi Easy Taxi(如图B)是请求出租车的最好的应用之一。我喜欢这款应用有两点。首先,它几乎可以在任何地方使用,它覆盖了有大约40个国家。另外一点,就是它的简洁性。这款应用的叫车流程相当小白--相信我,当我起得非常早要赶早上5点的飞机时,这是一个非常好的优点。 图B Easy Taxi支持iOS、安卓和Windows Phone。 3、mytaxi mytaxi(如图C)是另外一款免费的预约出租车的应用。与Uber一样,mytaxi要求你得创建一个账户,但是如果你只是想看看并了解下这个应用,你可以跳过选择支付方法的部分。这款应用本身非常简单。你只需要验证你在地图上的GPS位置是否正确,然后点击确认接送地点。美版网站声称已经连接了4.5万辆出租车。 图C mytaxi支持iOS、安卓、Windows Phone和黑莓。 4、GroundLink Car and Limo Service GroundLink Car and Limo Service(如图D)是针对那些喜欢“司机的黑车服务”多过传统出租车的人。这款应用在美国已经连接了4.5万辆车,同时覆盖其他110个国家。 图D 这款应用的功能与mytaxi几乎相同,你必须验证你在地图上的位置,然后点击确认接送地点以安排行程。 GroundLink Car and Limo Service支持iOS和安卓。 5.WOW Taxi WOW Taxi(如图E)与其他我提到的应用相比有一些局限性,因为它只能在纽约市使用。尽管如此,我必须选择这款应用是因为它满足了一个非常现实的需求。WOW Taxi中的WOW代表“Wheels on Wheels”。这个有些不寻常的名字,是因为它是为残疾人士在曼哈顿出行而专门设计的。WOW Taxi与其他出租车应用相比与众不同之处在于,它只用于调度无障碍出租车。正如我所说的,这项服务目前仅限于在纽约式提供,但我希望能够扩到的其他地区。 图E 这款应用本身和其他应用的使用方法相同--你必须确认GPS位置,然后预定行程。 WOW Taxi支持iOS和安卓。 原文发布时间为:2015-2-14 本文作者:孙博 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

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

Nacos

Nacos

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

Spring

Spring

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