小任班长 发布的文章

Using ArrayUtils.removeElement(Object[],Object)from org.apache.commons.lang is by far the easiest way to do this.int[] numbers = {1,2,3,4,5,6,7};//removing number 1
numbers =(int[])ArrayUtils.removeElement(numbers, 1); //1 是实际数组里面的值

当然也可以根据数组的索引进行移除,详情参考下方api



commons.apache.org library:Javadocs

maven引入
<!-- java执行 linux 命令  -->
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>

import org.springframework.core.io.ClassPathResource; import org.springframework.util.ResourceUtils; import java.io.*; import java.util.ArrayList; import java.util.List; import ch.ethz.ssh2.*; import ch.ethz.ssh2.StreamGobbler; /** * Created by Administrator on 2017/8/18 018. */ public class Test { public static List<String> l = new ArrayList<String>(); public static void main(String args[]) { exportSvnCommend();//初始化list String hostname = "172.1.1.1"; String username = ""; String password = ""; try { /* Create a connection instance * * pom add <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>262</version> </dependency> * * * */ Connection conn = new Connection(hostname); /* Now connect */ conn.connect(); /* Authenticate. * If you get an IOException saying something like * "Authentication method password not supported by the server at this stage." * then please check the FAQ. */ boolean isAuthenticated = conn.authenticateWithPassword(username, password); if (isAuthenticated == false) throw new IOException("Authentication failed."); //************************ for循环执行命令*******************start*********************** /** * throw new IOException("A remote execution has already started.");所以如果需要执行多条命令 * ,则把多条命令柔和为1条命令,命令之前用回车\n连接,这样就可以成功执行,拿到所有的控制台输出内容 */ String cmd = ""; // cmd = "whereis java"; //test // cmd = "svnadmin create /usr/local/Repositories/item1"; for (int i =0;i<l.size();i++){ String itemName = l.get(i); //创建资源库并导入 cmd += "svnadmin create /home/SvnRepositories/"+itemName+"\n";//可以一次执行多个命令 cmd += "svnadmin load /home/SvnRepositories/"+itemName+" < /home/SvnRepositories/svnbak/svnbak/"+itemName+".dump"+"\n";//可以一次执行多个命令 execLinuxCommend(cmd,conn); } //************************ for循环执行命令************end****************************** /* Close the connection */ conn.close(); } catch (Exception e) { e.printStackTrace(); e.printStackTrace(System.err); System.exit(2); } } public static void execLinuxCommend(String cmd,Connection conn){ try { /* Create a session */ Session sess = conn.openSession(); sess.execCommand(cmd); System.out.println("Here is some information about the remote host:"); /* * This basic example does not handle stderr, which is sometimes dangerous * (please read the FAQ). */ InputStream stdout = new StreamGobbler(sess.getStdout()); BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); while (true) { String line = br.readLine(); if (line == null) break; System.out.println(line); } /* Show exit status, if available (otherwise "null") */ System.out.println("ExitCode: " + sess.getExitStatus()); /* Close this session */ sess.close(); }catch (Exception e){ e.printStackTrace();; } } //批量导出windows visualSVN的资源文件备份命令 public static void exportSvnCommend(){ try{ // File cfgFile = ResourceUtils.getFile("classpath:1.txt"); File file = ResourceUtils.getFile("classpath:1.txt"); BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); String tempString = null; int line = 1; // 一次读入一行,直到读入null为文件结束 while ((tempString = reader.readLine()) != null) { // 显示行号 // System.out.println("line " + line + ": " + tempString); System.out.println("svnadmin dump F:\\Repositories\\" + tempString + " > F:\\svnbak\\"+tempString+".dump"); l.add(tempString); line++; } reader.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (Exception e1) { e1.printStackTrace(); } } } }catch (Exception e){ e.printStackTrace(); } } }

 

一、备份VisualSVN项目

1. 现在要使用Linux作为svn服务器,之前是在windows Server 2008上的,用的是VisualSVN

 

2.现在svn中有一个项目fpp,需要将fpp这个项目导出到linux环境下。运行cmd,输入命令 svnadmin dump E:\Repositories\fpp > e:\svnbak\fpp.dump将项目导出到e:\svnbak目录下。运行结果如下:

3. 可见命令会导出每个版本的详细信息,保证了之前的历史信息不会丢失。现在我们便得出备份文件fpp.dump,如下:

4. 利用批处理实现项目的批量导出,编写svnbak.bat, 双击运行,会一次性导出所有项目,结果如下图:

 

二、上传备份文件到Linux

1. 利用ftp, ssh等工具将fpp.dump文件传输到Linux服务器上,这里利用直接利用openSSH这个软件上传。如图,文件上传成功,文件的路径为/root/fpp.dump。

 

三、Linux下SVN的安装与配置

1. Linux下安装svn,这里直接利用yum命令进行安装。yum install subversion完成subversion的安装。

2. 建立版本库目录svndata。

mkdir /svndata

svnserve -d -r /svndata #启动svn,设置版本库目录为/svndata

killall svnserve #关闭svn

3. 建立项目库

svnadmin create /svndata/fpp

4. 配置用户访问权限

cd /svndata/fpp/conf

vi svnserve.conf

释放如下几行的注释

anon-access=none

auth-access=write

password-db=passwd

5. 增加访问用户,格式为(username = password),等号两边要加空格,否则无效。如下图,没有加空格,就一直没用:

 

6. svn的命令这里不作介绍,大家自己去学习使用。

四、导入备份文件

1. 输入命令:svnadmin load /svndata/fpp < /root/fpp.dump,运行结果如下:

 

2. 为了避免逐个导入项目,所以写了一个shell脚本,进行批量导入,遍历备份目录下所有*.dump文件,并产生相应的导入命令,15个项目,花了10分钟左右完成导入,脚本如下:

 

五、客户端进行代码的检出

1.windows端安装TortoiseSVN, 右键svn checkout

2. 在打开的对话框中,输入svn库的地址,确定便可以同步项目。地址如下,ip地址加项目名称,如图:

 

3. svn提示检出成功,在目录下可以找到检出的项目。

 

4. 对于以前的项目,重定向到新的svn服务器,右键->TortoiseSVN->Relocate,在弹出的对话框中填写新的地址,TortoiseSVN会提示修改成功,之后,就可以使用新的svn了。

 

 

5. 如果你是使用eclipse中的subeclipse的插件,首先打开svn资源库视图,然后选择你的项目,右键选择重定向,填入新的svn地址。

 

6. linux下若使用svn命令的话,形式如下:

svn switch --relocate (Old Repository Root) (New Repository Root)

 

 


 

VisualSVN Server仓库迁移到Linux(包含所有版本, 权限,用户信息)

公司开发服务器从Windows换成CentOS,所以要把原服务都转移到Linux下,MySQL、SMB的迁移都很顺利,但是SVN的转移却遇到了些问题,花费了三天时间,走了不少弯路,现在总算解决了SVN迁移问题,记录下:

在Windows上我们是用VisualSVN Server作SVN服务的,Linux上是编译安装的subversion 1.7.7。
Windows 的SVN仓库在E:\SVNRepositories,Linux在 /data/svnrepos

第1步,导出VisualSVN仓库:svnadmin dump E:\SVNRepositories\repo1 E:\repo1.dump

第2步,在Linux端create相同名称的仓库: svnadmin create /data/svnrepos/repo1

第3步,在Linux端load Windows导出的库:
            cd /data/svnrepos
            svnadmin load repo1 < repo1.dump

到此为止,repo1库就导入到Linux的subversion中了,但是用户信息、权限信息还没导入(这也是我折腾很久的问题),继续:

第4步,把E:\SVNRepositories\authz 上传到 /data/svnrepos
            把E:\SVNRepositories\htpasswd 复制为 passwd 并修改后上传到 /data/svnrepos
            修改后的passwd格式如下(其实就是用户名 = 密码):
             [users]
             user1 = 123
             user2 = 456

第5步,修改仓库的/conf/svnserve.conf,使它指向第4步上传的那两个文件:
            [general]
            anon-access = none
            auth-access = write
            password-db = ../../passwd
            authz-db = ../../authz

到这里就完成了,用命令  svnserve -d -r  /data/svnrepos/ 启动subversion服务。

  • 这样做还有个问题是passwd文件原密码信息全丢失了,知道解决方法的请留言告诉我:)
    打开passwd可以看到之前的密码是加密的,而放到linux上,需是明文,修改密码到明文即可。
  • 我只用了repo1这个仓库,如果有多个仓库一样步骤,分别导出导入,并修改仓库的/conf/svnserve.conf
     [此步骤,可以利用linux批量查找替换功能,将密码文件指定到../../的passwd文件]
  • 如果按照上述方法操作还是不行,启动svnserve时用  --log-file ./log.txt参数查看错误信息

 

常用命令总结:

#启动svn,设置版本库目录为/Repositories
svnserve
-d -r /usr/local/Repositories

#关闭svn
killall svnserve



windows服务器导出:
svnadmin dump F:\Repositories\item1
>F:\svnbak\item1.dump

创建项目资源
svnadmin create
/usr/local/Repositories/item1

还原备份文件到资源库
svnadmin load
/usr/local/Repositories/item1 < /usr/local/Repositories/item1.dump

svn导出路径
svn:
//172.16.28.70/item1

 

Android Things Developer Preview 5

10 August 2017
Posted by Wayne Piekarski, Developer Advocate for IoT

Today, we're releasing Developer Preview 5 (DP5) of Android Things, which includes the major change of being based on the upcoming Android O release. Android Things is Google's platform to enable Android Developers to create Internet of Things (IoT) devices, and seamlessly scale from prototype to production.

Android O

Android O is currently under Developer Preview for phones and tablets, and DP5 is now based on this upcoming release (previous releases were based on Android N). This means that your future Android Things applications should target API 26 to work correctly on the platform with our support libraries.

Hardware Changes

DP5 now adds support for the new NXP SprIoT i.MX6UL design, as listed in our developer kits documentation. With Intel discontinuing the Edison and Joule hardware designs, these platforms are moving to legacy support. They will not continue to receive the latest platform updates, but developers may continue to access the DP4.1 system images from the Android Things Console.

An important goal of Android Things is to help developers seamlessly scale from prototype to production. When we exit Developer Preview, we will differentiate between hardware platforms targeted for prototyping-only and hardware reference designs that can scale to production. Production-ready hardware will satisfy Google's security requirements and include long term support from the silicon manufacturers. We will have more to share later on.

Improvements

With the move to the Android O codebase, there are new API features from Android as well as specific features for Android Things. For those developers using UserDriver APIs, you will need to add new permissions to your AndroidManifest.xml. The documentation contains details about the permissions needed for each driver type. DP5 also now supports OpenGL ES 2.0 and WebView on the Raspberry Pi 3, which was a highly requested feature from developers. We have also implemented dynamic pin muxing for the Raspberry Pi 3, with pins being configured at runtime depending on what features are being used.

Android Studio

The samples for Android Things are now available directly in Android Studio for browsing and importing. You can now go to File, New, Import Samples, and search for Things to see everything that is available. We have a wide range of samples, demonstrating how to interact with buttons, sensors, LEDs, and displays, as well as implementing Google Assistant and TensorFlow.

Android Things Console

We recently launched the Android Things Console, which provides the ability to support over-the-air updates (OTA) to Android Things devices. We have recently made a number of UX improvements to the console to improve usability and functionality. DP5 is now available within the Android Things Console, but the DP5 update will not be pushed automatically to devices without your intervention. You will need to update your application for DP5, then create a new update and push it via the console yourself.

Feedback

With Android Things being updated to Android O, significant changes have been made to the platform. Please send us your feedback by filing bug reports and feature requests, and asking any questions on Stack Overflow. To start using DP5, use the Android Things Consoleto download system images and update existing devices. More information about the changes are available in the release notes. You can also join Google's IoT Developers Community on Google+, a great resource to get updates and discuss ideas. Also, we have our new hackster.io community, where everyone can share the amazing projects they have built!

 

今天,我们发布了Android Things的“开发者预览5”(DP5),其中包括基于即将推出的Android O版本的重大变化。 Android Things是Google的平台,可让Android开发人员创建物联网(IoT)设备,并从原型到生产无缝扩展。

Android O

目前,Android O正在针对手机和平板电脑进行开发人员预览,DP5现在基于此即将推出的版本(以前的版本基于Android N)。这意味着您未来的Android Things应用程序应该使用API​​ 26在平台上使用我们的支持库来正常工作。

硬件更改

DP5现在增加了对我们的开发工具包文档中列出的新型NXP SprIoT i.MX6UL设计的支持。随着英特尔停止使用爱迪生和焦耳硬件设计,这些平台正在转向传统支持。他们不会继续收到最新的平台更新,但开发人员可能会继续访问Android事件控制台中的DP4.1系统映像。

Android的一个重要目标是帮助开发人员从原型到生产无缝扩展。当我们退出Developer Preview时,我们将区分针对原型的硬件平台和可扩展到生产的硬件参考设计。生产就绪的硬件将满足Google的安全要求,并包括硅制造商的长期支持。我们稍后会有更多的分享。

改进

随着移动到Android O代码库,Android有新的API功能以及Android Things的特定功能。对于那些使用UserDriver API的开发人员,您需要向AndroidManifest.xml添加新的权限。该文档包含有关每种驱动程序类型所需权限的详细信息。 DP5现在还在Raspberry Pi 3上支持OpenGL ES 2.0和WebView,这是开发人员非常需要的功能。我们还为Raspberry Pi 3实现了动态引脚复用,根据使用的功能,在运行时配置引脚。

Android Studio

Android的样品现在可以直接在Android Studio中进行浏览和导入。您现在可以转到文件,新建,导入样品,然后搜索“事物”,查看可用的所有内容。我们有各种样品,展示如何与按钮,传感器,LED和显示器进行交互,以及实施Google Assistant和TensorFlow。

Android事情控制台

我们最近推出了Android Things Console,它提供了支持Android Things设备的无线更新(OTA)功能。我们最近对控制台进行了许多改进,以提高可用性和功能。 DP5现在在Android事件控制台中可用,但DP5更新不会自动推送到设备,无需您的干预。您将需要更新DP5的应用程序,然后创建一个新的更新,并通过控制台自己推送它。

反馈

随着Android系统更新到Android O,平台已经发生了重大变化。请通过提交错误报告和功能请求向我们发送您的反馈,并在Stack Overflow上提出任何问题。要开始使用DP5,请使用Android Things Console下载系统映像并更新现有设备。有关更改的更多信息,请参见发行说明。您也可以在Google+上加入Google的IoT Developers社区,这是获取更新和讨论想法的绝佳资源。另外,我们有新的hackster.io社区,每个人都可以分享他们建立的惊人的项目!

夜读 | 读书和不读书的人生,差别有多大

2017-08-02

新华社

 

 

导读

读书让人拥有富足的内心,那是千金不换的财富。

 

- 1 -

 

我刚毕业时被分到一所乡村中学任教,那年百年一遇的大洪水冲毁了许多房屋村舍。兴冲冲到单位报道的我傻眼了:学校被淹!只看得到教学楼的房顶。眼瞅着夏天过完,学校还泡在近一米深的水里。

 

还好8月的最后几天,市里一所知名中学愿意接纳我们,拨出教室和宿舍供我们使用。师生这才安顿下来。

 

那时我认识了苏,一个家境优越的女孩,她和我同岁,也是刚刚毕业参加工作,不同的是她进入的是市内知名中学,我进入的是被洪水淹没的中学。

 

认识她之后,我才知道当女孩子可以如此优越。

 

她穿的一条裙子抵我好几个月的工资,一个小包要好几位数,头发做过离子烫。她说每年和妈妈去香港购物多次,她说喜欢到西餐厅吃西冷牛排,周末去琴台大剧院看舞台剧。

 

她像一株娇艳的美人蕉在风中漫舞。

 

而我像一株不起眼的狗尾草在风中卑微。

 

我那时穿在身上的是赈灾发下来的一件灰色小外套,头发毛躁,素面朝天,为吃一元钱或一元五角钱的饭而纠结。

 

从不知牛排是什么样子,剧院的门朝哪里开。漂亮的衣物对我来说遥不可及,香港购物对我来说是个奢侈的梦。

 

人和人的差距如此巨大。

 

苏的生活是我到不了的云端。

 

我不敢当众发言,怕别人注意我简陋的衣服;

 

我不敢争取机会,怕被人嘲笑我的不自量力;

 

我不敢恋爱,怕男生只是逗我好玩。

 

我活得卑微而谨慎,像只河蚌紧紧地封闭了自己。

 

直到我找到那间小图书室,找到了一本本图书。我沉浸在书里,从此它们成为我美妙的饕餮大餐,我得到了救赎。

 

无数次,我记不起自己没有吃午饭,记不起身上寒碜的衣服,记不起口袋里没有半毛钱。

 

书拯救了我贫瘠的青春,它让我没有时间胡思乱想,它解脱我内心的焦虑、恐惧、寂寞、悲哀,使胸中的积郁释然超脱,达到淡泊宁静、自信从容的状态。

 

很多年后,我遇到很多人,能够不卑不亢,正是读书给我增添了底气;

 

很多年后,我能够写一点文字,大概也是当年读书内化反刍的结果。

 

 

 

- 2 -

 

同样,有人因为读书改写了自己的命运。

 

我们老家曾经出了一个人物,一位80年代的知名教授。那时很多人大字不识一个,他却考到北京,后来还出国交流。退休前在北京一所大学任教。人们尊敬地称他为管教授。

 

听我爸讲,那个年代大家都很穷,连吃饭穿衣都很困难。管教授的父亲有一天叫了他们兄弟几个,说你们别去上学了,鞋子烂得快,你妈做不过来。哥哥们沉默了。唯有小管说,爸,你让我读书,我再不废鞋了。

 

后来,他出门总是把鞋拎在手里,光着脚跑在路上,快到学校再把鞋穿上,哪怕是滴水成冰的冬天也不例外。

 

成家后,妻子发现他的一双皮鞋穿了五年没烂!吃惊之余,她偷偷地跟着他出门,发现丈夫脱了鞋光脚踩在地上,健步如飞。

 

他在接受记者采访时聊到小时候读书的故事,记者问他,您大冬天光着脚难道不冷?

 

他摇头,不冷。我的老师是个书迷,家里各式书籍非常多,而我们家从上到下是没有一本书的。一想到可以到老师家看书我就兴奋。

 

我唯一担心的就是我再也看不到它们。至于光着脚,我心里一团火,脚下生着风,又怎么会冷?

 

王尔德曾在他的一部作品中告诉人们:世间再没有比人的灵魂更宝贵的东西,任何东西都不能跟它相比。

 

我看到这句话几乎热泪盈眶。读书让人拥有富足的内心,那是千金不换的财富。我遗憾没有更早看到它。

 

 

 

- 3 -

 

英国著名历史学家麦考莱曾留下一个流传很广的故事。

 

他曾给一个小女孩写信。

 

信上说,如果有人要我当最伟大的国王,一辈子住在宫殿里,有花园、佳肴、美酒、大马车、华丽的衣服和成百的仆人,条件是不允许我读书,那么我决不当国王。我宁愿做一个穷人,住在藏书很多的阁楼里,也不愿当一个不能读书的国王。

 

读书的魅力如此巨大,治愈了我青春的自卑症,改变了管教授的命运,让王尔德一生骄傲,让麦考莱连国王都不想当。

 

宋代黄山谷说:

一日不读书,尘生其中;

两日不读书,言语乏味;

三日不读书,面目可憎。

 

掬一口好茶,捧一本好书,进一寸有一寸的欢喜。

 

文字摆渡,我们终将上岸,以后无论去到哪里,都是阳光万里,鲜花开放。

 

主播

李林欣

 

阅读是件最美的小事

可以汇成耀眼的星河

 

新华社#领读者计划#

邀你一起

加入阅读大厦

做全民阅读的领读者

 

 

 

点击文末“阅读原文”链接

可订阅#领读者计划#网易云电台

 

者:花样年华

来源:武汉花样年华

(ID:cyp15971434290)

 

监审:袁建

监制:葛素表、刘洪、王咏涛

摄影:中国之美社群

(程爱民、大肚哥、祁连雪)

编辑:赵刚、董琳娜

实习生:宋宁馨、曹堯、马越

©新华社新媒体中心、新华社音视频部

点击“阅读原文”,订阅“领读者计划”网易云电台!



 

祝您天天开心,生活幸福!
免责声明
本博客部分内容来自于互联网,不代表作者的观点和立场,如若侵犯到您的权益,请联系[email protected]。我们会在24小时内进行删除。