首页 文章 精选 留言 我的

精选列表

搜索[初体验],共248篇文章
优秀的个人博客,低调大师

SpringBoot2初体验,简单认识spring boot2并且搭建基础工程

前言 发展史 Spring boot 1.1(2014 年 6 月) - 改进的模板支持,gemfire 支持,elasticsearch 和 apache solr 的自动配置。 Spring Boot 1.2(2015 年 3 月) - 升级到 servlet 3.1 / tomcat 8 / jetty 9,spring 4.1 升级,支持 banner / jms / SpringBootApplication 注解。 Spring Boot 1.3(2016 年 12 月) - Spring 4.2 升级,新的 spring-boot-devtools,用于缓存技术(ehcache,hazelcast,redis 和 infinispan)的自动配置以及完全可执行的 jar 支持。 Spring boot 1.4(2017年1月) - spring 4.3 升级,支持 couchbase / neo4j,分析启动失败和RestTemplateBuilder。 Spring boot 1.5(2017年2月) - 支持 kafka / ldap,第三方库升级,弃用 CRaSH 支持和执行器记录器端点以动态修改应用程序日志级别。 Spring boot 2.0(2018 年 03 月)-基于 Java 8,支持 Java 9,支持 Quartz ,调度程序大大简化了安全自动配置,支持嵌入式 Netty。 SpringBoot 1.x再见,拥抱SpringBoot 2.x 2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 如今 Spring Boot 1.X 版本最后将永久的定格在 v1.5.22.RELEASE,其实回想起来自从 Spring Boot 1.0 发布已经过去了 5 年多,相当于 Spring Boot 一年发布一个大的子版本,然后到了现在的 1.5.x。 正在使用 Spring Boot 1.x 需要立刻升级吗? spring Boot 1.x 只是停止维护,并不是不能用了,如果你不是特别着急想用 Spring Boot 2.x 的新特性,再用个几年也是没有任何问题的。 Spring Boot 1.x 到 2.x 中间更新了很多 API 以及依赖组件。升级时需要先将 Spring Boot 1.X 系列升级到 1.5.x,再从 1.5.x 升级到 2.x 最新稳定版本。 Spring Boot 2.x 对 Java 环境的要求最低为 JDK 8,可能还有很多的公司服务器还在 1.6 或者 1.7 的环境中跑着,升级的时候也需要先升级服务器的基础环境。 如果项目中使用了微服务架构,建议可以一个一个子服务进行升级,不要一次全部升级完成,保障整个服务在升级过程的稳定性。 建立Springboot工程有两种方式 1.通过官网快速构建 2.手动构建Springboot工程 注:这两种方式在本文都会提到,本文仅构建简单的Springboot工程,如果需要构建Maven聚合的Springboot工程请期待后续文章 一.官网快速构建 1.Springboot官网提供了一个快速构建工程的方案 网址:https://start.spring.io/ 填写一些基本信息 2.下载并解压工程(工程目录如下,是一个标准的Maven工程) 3.Eclipse导入Maven工程 注:请升级至Eclipse_v2019.09,否则导入代码会报错。并且该代码依赖于Maven,所以需要提前准备Maven环境,并且导入的时候需要下载Jar请耐心等待。导入完成如图所示 4.Springboot工程目录结构介绍 5.运行项目 打开SpringbootApplication.java类运行其main方法即可 注:此时项目运行在8080默认端口,用浏览器访问即可。由于我们没写任何代码仅仅测试项目所以访问会报404错误,如下图所示 二.手动构建Springboot工程 1.创建一个Maven工程 创建出来的工程如下 注:第一次创建Maven工程,需要提前准备Maven环境、并且初次创建Maven项目需要去中央仓库下载Jar包,请耐心等待。 2.修改Maven的配置文件pom.xml 添加spring-boot-starter-parent xml 复制代码 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> 添加web依赖 xml 复制代码 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> 添加springboot打包插件 xml 复制代码 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> 注:由于修改了maven配置文件,工程会报错。所以需要刷新工程。 3.创建启动类 java 复制代码 package org.xujun; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringbootMyApplication { public static void main(String[] args) { SpringApplication.run(SpringbootMyApplication.class, args); } } 4.运行项目 参考[通过官网快速构建]的启动方式即可 总结:如果你看到了以上的404报错恭喜你,项目已经构建成功了。

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

WORKBUDDY初体验

其次,我有一台10多年前的老旧核心交换机,7年前突然web界面登陆不上去了,厂家保修也都过了。查了很多资料让升级版本和重新修改库,由于是生产设备不能停机就一直没有弄。这会workbuddy,在不影响我使用的情况下,2个小时就给我解决了。太好了!通过使用和磨合本人是个新手小白,但是也发现一些问题,就是比较消耗积分。workbuddy的确很强大,还有很多很多需要学习的东西,希望越来越好。workbuddy的确能够做很多事情

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

SwiftUI 初体验

前言 苹果在 WWDC 2019 的开幕式中给我们来带了超多的惊喜,全新的iPad OS, 给生产力和商业带来了新领域,iOS 项目可以通过简单的修改移植到 Mac OS 上,全新的 Mac Pro 高清的显示器等新硬件,但对于在苹果平台的开发者们,最重要的莫过于 Swift UI。 曾几何时,iOS 开发者的 UI 开发体验一直是大前端中体验最差的,粗矿原始的 Frame 布局系统, API 冗长难用的 Autoalyout, 都是把开发者按在地上使劲的摩擦。 毫无开发体验可言。 去年大火的 Flutter 给客户端上开发带来了全新的体验,声明式的 UI 语法,亚秒级别的实时刷新, 都极大的提升了开发效率,但现在这些都在 SwiftUI.Framework上得以实现,并且是官方原生的支持。 昨天一起观看WWDC的小伙伴们都戏称 SW

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

Kotlin初体验

距离kotlin成为Android一级开发语言已经一年了,这节将从零开始,实现kotlin的几个小知识点。 以下操作是在AndroidStudio3.0.1下完成的,如果是3.0以下版本的AndroidStudio,需要安装好kotlin插件才能使用Kotlin进行开发 Kotlin教程推荐 官网文档,黑马教程,《Kotlin for android developers》中文版翻译 相关代码已经上传到Github的KotlinPractice文件夹下了 创建项目: 在创建项目中勾选kolin支持后直接下一步即可 勾选kotlin支持 创建完项目后我们发现主类已经是使用了kotlin代码了,我们去project的build.gradle目录下可以看到 ext.kotlin_version = '1.1.51' kotlin //版本号 dependencies { classpath 'com.android.tools.build:gradle:3.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"//依赖 } 以及module下build.gradle的: apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' 实际上这就是我们刚才勾选kotlin后给我们自动生成的,如果我们想要在现有Java代码项目中使用kotlin,那么我们就需要手动的去添加这些依赖,或者使用方便的java代码转kotlin来进行配置,我们看到MainActivity默认已经是kotlin类了 /** * : AppCompatActivity() * :类名,表示继承于AppCompatActivity类 */ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } } 为TextView控件赋值: 我们在布局从添加一个TextView,id命名为text_01 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.administrator.kotlin.MainActivity"> <TextView android:id="@+id/txt_01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试文本" /> </LinearLayout> 回到Activity,在activity的导包中添加这一行 import kotlinx.android.synthetic.main.activity_main.* 它的作用现在只要知道添加了这一行后我们就不需要再findViewById就可以了,activity_main的意思是Activity布局的包名。 import kotlinx.android.synthetic.main.activity_main.* /** * : AppCompatActivity() :类名,表示继承与什么类 */ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 为TextView设置值,koltin的语句后面是不需要;的,但是如果你加上也不会报错的 txt_01.setText("你好,世界") } } 运行程序,确实和我们想要的是一样的 设置按钮点击事件 我们再为布局添加3个button按钮 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.administrator.kotlin.MainActivity"> <TextView android:id="@+id/txt_01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试文本" /> <Button android:id="@+id/btn_01" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮1" /> <Button android:id="@+id/btn_02" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮2" /> <Button android:id="@+id/btn_03" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮3" /> </LinearLayout> 回到Activity,让MainActivity类继承于View.OnClickListener接口,我们可以看到koltin继承接口是使用,号进行的,如果我们想要继承多个接口,只需要使用多个,分隔开来就行了 /** * : AppCompatActivity() :类名,表示继承于什么类 * ,View.OnClickListener, View.OnLongClickListener 表示继承于 View.OnClickListener 点击事件接口, View.OnLongClickListener 长按事件接口 */ class MainActivity : AppCompatActivity(), View.OnClickListener, View.OnLongClickListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 为TextView设置值,koltin的语句后面是不需要;的,但是如果你加上也不会报错的 txt_01.setText("你好,世界") } /** * 重写OnClickListener接口的onClick方法 */ override fun onClick(p0: View?) { } /** * 重写OnLongClickListener接口的onLongClick方法 */ override fun onLongClick(p0: View?): Boolean { return false } } 然后就是我们熟悉的在点击事件里面使用switch找到对应控件的id了,只是在kotlin里面是使用when /** * 重写OnClickListener接口的onClick方法 */ override fun onClick(p0: View?) { when (p0!!.id) { R.id.btn_01 -> { Toast.makeText(this, "按钮1", Toast.LENGTH_LONG).show() } R.id.btn_02 -> { Toast.makeText(this, "按钮2", Toast.LENGTH_LONG).show() } R.id.btn_03 -> { Toast.makeText(this, "按钮3", Toast.LENGTH_LONG).show() } } } 最后要注意,虽然我们通过import kotlinx.android.synthetic.main.activity_main.*使得不需要写控件的fndId,但是我们仍然是要写setOnClickListener(this)控件点击回调监听的 完整代码: import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.Toast import kotlinx.android.synthetic.main.activity_main.* /** * : AppCompatActivity() :类名,表示继承与什么类 */ class MainActivity : AppCompatActivity(), View.OnClickListener, View.OnLongClickListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 为TextView设置值,koltin的语句后面是不需要;的,但是如果你加上也不会报错的 txt_01.setText("你好,世界") // 设置控件的回调监听 init() } /** * 设置控件的回调监听 */ private fun init() { btn_01.setOnClickListener(this) btn_02.setOnClickListener(this) btn_03.setOnClickListener(this) } /** * 重写OnClickListener接口的onClick方法 */ override fun onClick(p0: View?) { when (p0!!.id) { R.id.btn_01 -> { Toast.makeText(this, "按钮1", Toast.LENGTH_LONG).show() } R.id.btn_02 -> { Toast.makeText(this, "按钮2", Toast.LENGTH_LONG).show() } R.id.btn_03 -> { Toast.makeText(this, "按钮3", Toast.LENGTH_LONG).show() } } } /** * 重写OnLongClickListener接口的onLongClick方法 */ override fun onLongClick(p0: View?): Boolean { return false } } 运行程序点击按钮后,出现了我们想要的吐司 实现网络请求 开始之前我们先在module下配置anko依赖,这是为了等下线程调度用的 module: dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' // kotlin插件anko implementation "org.jetbrains.anko:anko-common:0.10.4" } 然后实现我们的network()请求网络方法,最后不要忘了在AndroidManifest.xml下添加网络权限 <uses-permission android:name="android.permission.INTERNET" /> /** * 重写OnClickListener接口的onClick方法 */ override fun onClick(p0: View?) { when (p0!!.id) { R.id.btn_01 -> { // 只进行网络请求 network(); } R.id.btn_02 -> { // 进行网路请求,并且进行json数据解析 Toast.makeText(this, "按钮2", Toast.LENGTH_LONG).show() } R.id.btn_03 -> { Toast.makeText(this, "按钮3", Toast.LENGTH_LONG).show() } } } /** * 网络请求 */ private fun network() { // 声明要请求的网址,在kotlin中,var能声明一切类型,而后面的:String其实是可以不加的 var string: String = "http://www.wanandroid.com/tools/mockapi/2872/k1" // 作用类似java在子线程中进行网络请求,但是async在kotlin中叫做协程 async() { val fore = URL(string).readText() Log.d("tonjies", fore) } } 观察日志,我们可以看到确实已经获取了Json数据 这里写图片描述 Json数据解析 接下来我们进行json数据的解析,首先添加gson解析依赖 // goso解析 compile "com.google.code.gson:gson:2.4" 我们创建bean实体类包,在包下创建解析实体类Student,我们不需要像Java那样去生成get和set对象,因为这kotlin已经帮我们生成好啦! /** * Created by 舍长 on 2018/4/28. * 描述: 数据请求实体类 */ class Student { var name:String?=null var age:String?=null } 在按钮2的点击事件里面写一个gson方法,在gson方法里将网络请求到的数据转换成实体类,并且回到UI线程,显示在文字控件上 /** * 重写OnClickListener接口的onClick方法 */ override fun onClick(p0: View?) { when (p0!!.id) { R.id.btn_01 -> { // 只进行网络请求 network(); } R.id.btn_02 -> { // 进行网路请求,并且进行json数据解析 Toast.makeText(this, "按钮2", Toast.LENGTH_LONG).show() gson(); } R.id.btn_03 -> { Toast.makeText(this, "按钮3", Toast.LENGTH_LONG).show() } } } /** * 网络请求并使用gson解析数据 */ private fun gson() { // 声明要请求的网址,在kotlin中,var能声明一切类型,而后面的:String其实是可以不加的 var string: String = "http://www.wanandroid.com/tools/mockapi/2872/student" // 作用类似java在子线程中进行网络请求,但是async在kotlin中叫做协程 async() { val fore = URL(string).readText() var fromJson: Student = Gson().fromJson(fore, Student::class.java) // 回到UI线程中去更新数据,这里的${属性名}是字符串模板,作用于Java的+属性名+相同 uiThread { txt_01.setText("学生的名字是${fromJson.name},年龄是${fromJson.age}") } } } 运行程序,点击按钮二,可以看到文字确实变成了我们想要的json数据:学习的名字是tonjies,年龄是18 这一小节的完整代码: 布局文件activity_main: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.administrator.kotlin.MainActivity"> <TextView android:id="@+id/txt_01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试文本" /> <Button android:id="@+id/btn_01" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮1" /> <Button android:id="@+id/btn_02" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮2" /> <Button android:id="@+id/btn_03" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按钮3" /> </LinearLayout> MainActivity package com.example.administrator.kotlin import android.icu.lang.UCharacter.GraphemeClusterBreak.L import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.View import android.widget.Toast import com.example.administrator.kotlin.R.id.async import com.example.administrator.kotlin.bean.Student import com.google.gson.Gson import kotlinx.android.synthetic.main.activity_main.* import java.net.URL import org.jetbrains.anko.custom.async import org.jetbrains.anko.uiThread /** * : AppCompatActivity() :类名,表示继承与什么类 */ class MainActivity : AppCompatActivity(), View.OnClickListener, View.OnLongClickListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 为TextView设置值,koltin的语句后面是不需要;的,但是如果你加上也不会报错的 txt_01.setText("你好,世界") // 设置控件的回调监听 init() } /** * 设置控件的回调监听 */ private fun init() { btn_01.setOnClickListener(this) btn_02.setOnClickListener(this) btn_03.setOnClickListener(this) } /** * 重写OnClickListener接口的onClick方法 */ override fun onClick(p0: View?) { when (p0!!.id) { R.id.btn_01 -> { // 只进行网络请求 network(); } R.id.btn_02 -> { // 进行网路请求,并且进行json数据解析 Toast.makeText(this, "按钮2", Toast.LENGTH_LONG).show() gson(); } R.id.btn_03 -> { Toast.makeText(this, "按钮3", Toast.LENGTH_LONG).show() } } } /** * 网络请求并使用gson解析数据 */ private fun gson() { // 声明要请求的网址,在kotlin中,var能声明一切类型,而后面的:String其实是可以不加的 var string: String = "http://www.wanandroid.com/tools/mockapi/2872/student" // 作用类似java在子线程中进行网络请求,但是async在kotlin中叫做协程 async() { val fore = URL(string).readText() var fromJson: Student = Gson().fromJson(fore, Student::class.java) // 回到UI线程中去更新数据,这里的${属性名}是字符串模板,作用于Java的+属性名+相同 uiThread { txt_01.setText("学生的名字是${fromJson.name},年龄是${fromJson.age}") } } } /** * 网络请求 */ private fun network() { // 声明要请求的网址,在kotlin中,var能声明一切类型,而后面的:String其实是可以不加的 var string: String = "http://www.wanandroid.com/tools/mockapi/2872/student" // 作用类似java在子线程中进行网络请求,但是async在kotlin中叫做协程 async() { val fore = URL(string).readText() Log.d("tonjies", fore) } } /** * 重写OnLongClickListener接口的onLongClick方法 */ override fun onLongClick(p0: View?): Boolean { return false } } 好了,这一小节就到这里啦!在学习的过程中,参考开源项目和巧妙使用Java代码转kotlin的快捷键是挺有用的

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

Weex初体验

今年莫名其妙的被前端炒的特别火,混合式的开发让我们这些只会android native开发的人怎么办哟,要不,我们也学一点,跟着潮流走呗,看着工作室的人写的H5界面用的是bootstrap,咦,感觉很不错的样子,界面排版挺好的,但是感觉玩起来还是个网页,在移动端加载并没有体验特别棒的感觉,然后,就看了下vue.js的mvvm,确实挺强大的数据绑定,不过都是在摸索,之前玩过react native,把环境搭了一下,示例demo跑起来了,但是这个过程感觉好麻烦啊,然后搁置了一段时间,看见了阿里的weex,豪言要“Write once, run everywhere”,我这惊讶呀,看来我得玩玩你到底是个什么东西:weex首页 那接下来,先把环境搭建一下呗: 首先,安装个node环境,下图中箭头的版本 然后下载安装,解压后是这样的 看到node.exe没,以后学node.js开发的时候可以用到,最近也玩了一点node,感觉还不错,npm看到没,所有关于node模块开发的,都可以用这个npm去下载moudle,将这个路径配置到环境变量中去,以后就可以在任意环境下去node或npm了。 安装weex环境 我们在cmd窗口中输入npm install -g weex-toolkit安装weex环境,-g是全局,以后创建weex demo的时候可以在任意环境下面使用weex来创建 安装完成后,我们来看看安装的是啥东西,你一定找不到安装在哪了是吧,别急,在安装成功的上面会有很多的信息,会提示安装路径,跟着上面找就是了,如果没找到,那就是隐藏文件夹,把他显示出来就行了 安装的解压目录 好了,环境起来了,我们看看版本了,weex –version 接下来,我们来玩demo了,创建个demo,随便找个路径执行weex init 执行的时候他会让你输入项目的名称prompt: Project Name: ,我输入的是weexDemo,然后等他加载文件,加载完成后就是这样的一个目录文件 目录结构我还是小白,等会给你们参考资料,大家看看,我们进入src文件里面看看,里面是一个weex-bootstrap.we的文件,这个就是我们要运行的文件,ok,现在基本就是跑demo的时候了 我们在src目录下执行weex weex-bootstrap.we,等待他响应,他会打开你的浏览器显示页面效果 下面一大串是服务器的监听,是node这个服务支撑起来的。 好了,浏览器的效果看见了,现在我们想在手机端看效果怎么办呢,这时候,我们需要一个playground,类似于一个手机端的运行环境,这个环境是一个apk,我们在官网上面下载下来安装到手机就好了链接,android和ios版本的都有。 打开app是这样的: 下面都是demo示例,我们没事的时候可以看看他能做出什么效果出来,现在我们先不管,我们看看右上角的扫一扫图标,首先我们在控制台这样来运行demo 把原先的代码运行关掉,重心执行命令:weex weex-bootstrap.we –qr 他会生成一个二维码,然后用这个扫一扫功能,扫一下这个二维码就可以跑起来了 对了,几个细节要说,你这个手机端网络段必须是和电脑是同一网段,不然你是访问不到的,这个仅局域网可以访问,我是电脑开wifi给手机的。 最后,给大家一些参考资料: weex的中文文档 weex的几个小视频 weex android环境的playground源码 weex-pack初始化android和ios工程 weex-pack打包android和iso工程

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

MAUI初体验:爽

只是记录,只是Hello World体验,别期望太高。 1. 前言 经过几个小时折腾,Maui环境终于安装好了,先上Hello World截图: 1.1 MAUI Windows上 1.2 MAUI Android上 2. 今早看到一个群聊推送 点击链接可以看推送:爱奇艺 Preview 上架微软 Win11 应用商店:全新 WinUI 3 版本,软件界面大变(附下载地址) 爱奇艺使用的WinUI 3可能和MAUI Windows开发使用的WinUI不同?请知道的留言解惑: 3. MAUI环境安装前介绍 MAUI-Check:这是安装MAUI的检测工具,在安装的过程中可能会出现一些问题 这是安装过程: 可能会出现如下异常: 不要担心,下面是安装介绍文章(不翻译了,累),只要你有科学上网工具,多来几次,有可能会成功的,哈哈 3. 正式安装MAUI环境 Mac 参考链接:https://subscribe.packtpub.com/getting-started-with-microsoft-net-maui/ 站长卡在工作负载安装失败,多次都没成功,mac暂时放弃了,后面再研究 有兴趣的看看这些视频学习下: https://www.youtube.com/watch?v=eF5YcpyzQIo&t=350s https://xam.com.au/installing-net-maui-preview/ https://www.banditoth.hu/2021/12/29/setup-net-maui-project-on-macos/ Windows 站长主要看的这个链接安装环境,折腾了几个小时成功了 https://subscribe.packtpub.com/getting-started-with-microsoft-net-maui/ 4. 结束 上面的链接如果不行,你也可以多搜索谷歌其他文章,安装教程网上很多,最好用谷歌,看看油管视频。 昨天和今天只是体验下MAUI开发体验,热重载加载很快,MAUI大有可为,私下站长可能开发桌面应用就上MAUI了(当然移动APP也是),不过暂时就不研究MAUI了,下半年或者明年再研究MAUI。 今天发文只是报告一下体验MAUI hello world,完结。

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

Service Mesh 初体验

前言 计算机软件技术发展到现在,软件架构的演进无不朝着让开发者能够更加轻松快捷地构建大型复杂应用的方向发展。容器技术最初是为了解决运行环境的不一致问题而产生的,随着不断地发展,围绕容器技术衍生出来越来越多的新方向。 最近几年,云计算领域不断地出现很多新的软件架构模式,其中有一些很热门的概念名词如:云原生、函数计算、Serverless、ServiceMesh等等,而本文将初窥一下ServiceMesh的面纱。下面结合自己的理解尽量以通俗的话进行叙述。 背景和定义 微服务及服务治理 在微服务之前的软件开发中,往往通过一个应用的方式将所有的模块都包括进去,并一起编译、打包、部署、运维。这种方式存在很多问题,由于单个应用包含的东西太多,其中某个模块出现问题或者需要更新那么整个应用就需要重新部署。这种方式给开发和运维带来了很大的麻烦。随着应用的逐渐

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

MaxCompute用户初体验

作为一名初次使用MaxCompute的用户,我体会颇深。MaxCompute 开箱即用,拥有集成化的操作界面,你不必关心集群搭建、配置和运维工作。仅需简单的点击鼠标,几步操作,就可以在MaxCompute中上传数据,分析数据并得到分析结果。 作为一种快速、完全托管的 TB/PB 级数据仓库解决方案,MaxCompute不仅为我们提供了传统的命令行操作,而且提供了丰富的web端操作界面。对于数据开发,测试,发布,数据流,数据权限管理都非常好用,支持python,java的udf,对于复杂的逻辑查询也支持传统的MapReduce,同时也支持多种机器学习算法,非常好用。 MaxCompute为我们提供了统一的项目管理。实际开发中各个团队都有自己的项目,自己管理自己的项目, 通过项目隔离,有效的防止数据和任务被其他团队修改和删除等问题。除非是pro项目任务出错,否则不会影响到其他业务线的任务,最大程度降低各业务间的影响。 同时,大数据开发套件和 MaxCompute关系紧密,大数据开发套件为 MaxCompute 提供了一站式的数据同步,任务开发,数据工作流开发,数据管理和数据运维等功能。 当需要处理的数据变得非常多,并且数据发展到足够复杂的时候,这些数据往往需要用不同的模式进行处理,除此之外,当作业出现问题的时候也需要有足够好的工具进行分析和管理。这些其实都是对于开发者而言需要面对的问题,与此同时阿里云为我们提供了DATA IDE环境来解决上述的问题。 在进行数据分析的过程中DATA IDE可以支持SQL的语法以及语法的高亮,同时实现代码补全等功能。开发者即使对于SQL的语法并不熟悉,但是根据DATA IDE给出的关键词提示也可以轻松的进行操作。另外在DATA IDE中可以集成元数据,从而在开发人员进行SQL语句编写时,给予表格、字段以及函数的提示。 在任务执行过程中,我们通过IDE可以看到作业的执行状态以及详细信息,即便是作业出现问题IDE也可以很方便地对于问题进行定位,帮助开发者发现作业中哪一个是瓶颈。 Max Compute还为我们提供了一个基于云计算的灵活的轻量级的自助 BI 工具服务平台-----Quick BI。 Quick BI可以支持多种数据源的添加,以便于我们对不同的数据源进行实时在线分析。 Quick BI为我们提供了丰富的可视化图表,根据行业的不同需求我们可以随意选取,以便于给决策曾提供更清晰准确的报表。而其基于 WEB 页面的工作环境,拖拽式、类似于 EXCEL 的操作方式,一键导入、实时分析,可以灵活切换数据分析的视角,更是锦上添花。 对于完成后的报表图表,可以以接口方式将制作的报表嵌入到第三方软件,从而方便自己的分析查询。 总之,无论是用来学习,还是用来工作MaxCompute都是一个不错的选择。时代在进步,科技在发展,大数据的脚步已经离我们越来越近,更多是知识需要我们去学习,去实践,赶快行动起来加入其中吧。 作者:王艾军 北京青苔数据科技有限公司 大数据研发经理

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

JAVA 11 初体验

随着JAVA每半年发布一次新版本,前几天JAVA 11隆重登场。在JAVA 11中,增加了一些新的特性和api,同时也删除了一些特性和api,还有一些性能和垃圾回收的改进。 作为一名一线的开发人员,JAVA 11给我们带来哪些便利之处呢?下面我们来体验一下。 在Lambda表达式中使用var 本地变量类型var是java 10提出的新概念,它可以从上下文中推断出本地变量的类型,从而提高代码可读性。我们看看下面的例子: public class Main { public static void main(String[] args) throws Exception { URL url = new URL("http://www.oracle.com/"); URLConnection conn = url.openConnection(); Reader reader = new BufferedReader( new InputStreamReader(conn.getInputStream())); } } 使用var声明后,上面的代码可以改写成: public class Main { public static void main(String[] args) throws Exception { var url = new URL("http://www.oracle.com/"); var conn = url.openConnection(); var reader = new BufferedReader( new InputStreamReader(conn.getInputStream())); } } 我们使用var代替了URL、URLConnection、Reader,提高了代码的可读性,也方便了开发。但是在JAVA 10中,var变量不能在lambda表达式中声明,在JAVA 11中,解决了这个问题。我们可以在lambda表达式中使用var,如下: (var x, var y) -> x.process(y) 上面的例子等同于 (x, y) -> x.process(y) 但是我们不能混合使用,下面的两个例子都是错误的: //含蓄型的lambda表达式中,要么全使用var,要么全不使用var (var x, y) -> x.process(y) //在lambda表达式中,不能即使用含蓄型,又使用明确型 (var x, int y) -> x.process(y) 标准化HTTP Client API 以前我们在程序中使用HttpClient时,通常会引入apache的HttpClient工具包。在JAVA 11中,我们可以使用JDK原生的HttpClient了。 public class HttpTest { public static void main(String[] args) throws Exception { String uri = "http://www.baidu.com"; HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(uri)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); } } 上面的例子是同步的get请求,还有其他的方法HttpClient也是提供的,例如: 异步get post提交 并发请求 Get Json Post Json 这些例子这里不做详细介绍了,如有需要请参考官方例子。功能很强大吧,我们不用再引入其他的HttpClient的jar包了。 总结 对于一线开发者而言,JAVA 11的体验就这么多,如有遗漏,会在以后补充。

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

Julia语言初体验

最近MIT发布的julia 1.0.0版,据传整合了C、Python、R等诸多语言特色,是数据科学领域又一把顶级利器。 周末心血来潮赶快体验了一把,因为用习惯了jupyter notebook,安装完julia 1.0.0之后就配置好了jupyter notebook。 在安装配置环境阶段就遭遇了不少坑,吃了不少苦头,这里不得不吐槽级距,julia的安装配置一点儿也不比python简单,自己配置原生环境,结果下载包各种不兼容,想要导入本地数据,需要解决CSV包、xlsx包的接口问题,总之一路坎坷。 这里把自己走过的弯路总结一下,方便后来者学习! 1、环境选择: 强烈建议选择JuliaPro来安装,这里稍稍说明一下,julia虽然在8月8日更新了Julia 1.0.0版本,但是作为一门新兴语言,它的版本后向兼容实在是不敢恭维,原生环境里面一个包都不给配置,需要自己一个一个下载。所以选择了JuliaPro这个集成环境(主要集成了Atom+juno【julia的第三方IDE】、jupyter notebook【浏览器端的编辑器】)。主要是JuliaPro初始化就配置了好几十个常用的包,省的自己一个个下载还不一定能搞定各种路径配置。 下载JuliaPro并安装之后,会有三个主要入口: ●Juno for JuliaPro 0.6.4.1 ●JuliaPro - Command Prompt 0.6.4.1 ●Jupyter for JuliaPro 0.6.4.1 第一个是Atom+juno的环境,相当于PyCharm之于Python,第二个是julia的命令行,第三个是Jupyter notebook编辑环境。如果是要单独下载原生环境并手动配置的话,需要摸索各种难题(还不一定能在网上找到解决方案)。 2、常用文件管理工具: julia的包管理工具类似Pyrhon中的conda,叫做Pkg: Pkg.add("packages") #安装包 Pkg.build("packages") #配置包 Pkg.rm("packages") #卸载包 using packages #加载包 import PyCall #与using功能一样(和Python的导入相同) using IJulia #IJulia是julia与jupyter notebook之间的连接器 notebook() #启动jupyter环境 Pkg.status() #查看当前环境中的包列表 Pkg.installed() #查看已经安装的包信息 homedir() #获取当前用户目录 pwd() #获取当前工作目录 cd("D:/") #设定当前工作目录 cd("C:/Users/RAINDU/Desktop/") include("hello.jl") #脚本执行(julia环境中) julia script.jl arg1 arg2... #终端命令行执行 3、文件I/O常用环境: 3.1 TXT文件导入导出: Pkg.add("CSV") #如果没有安装需先安装 using CSV mydata = CSV.read("EyesAsia.txt") 可恶的中文乱码。最简单的办法就是手动修改编码为UTF-8然后再次导入。 CSV.write("out.csv", mydata) #数据导出 3.2 xlsx文件导入导出 Pkg.add("XLSXReader") Pkg.add("XLSX") using XLSXReader using XLSX cd("C:/Users/RAINDU/Desktop/") mydata = readxlsx("data.xlsx","Sheet1") #读入 XLSX.writetable("mydata.xlsx", DataFrames.columns(mydata), DataFrames.names(mydata)) 4、基本数据类型 4.1 字符串 char = "hello,world!" julia> char = "hello,world!" "hello,world!" julia> print(char) hello,world! julia> length(char) 12 julia> char[1] 'h': ASCII/Unicode U+0068 (category Ll: Letter, lowercase) julia> char[end] '!': ASCII/Unicode U+0021 (category Po: Punctuation, other) julia中字符串可以继续遍历(区别于R,与Python相同) Julia中区别标量和向量(区别于R,同Python) 4.2 列表 mylist = ["A"] 1-element Array{String,1}: "A" julia> mylist = ["A","B","C","D","E"] 5-element Array{String,1}: "A" "B" "C" "D" "E" julia> myarray = [["A","B","C","D","e"],[3,4,9,6,7]] 2-element Array{Array{Any,1},1}: Any["A", "B", "C", "D", "e"] Any[3, 4, 9, 6, 7] julia> getindex(myarray,1) 5-element Array{Any,1}: "A" "B" "C" "D" "e" julia> getindex(myarray,2) 5-element Array{Any,1}: 3 4 9 6 julia中不区分向量和数组,一维数组便是向量。 myarray[1,2] 4.3 元组 julia> my_tuple = ("hello","world") ("hello", "world") julia> typeof(my_tuple) Tuple{String,String} julia> getindex(my_tuple,2) "world" typeof()函数可以用于检查数据对象的类型结构(同R中的typeof,区别于Python中的type()) julia中的索引从1开始,区别于Python中的从0开始,与R相同。 4.4 字典 julia> dict = Dict("a" => 1, "b" => 2, "c" => 3) Dict{String,Int64} with 3 entries: "c" => 3 "b" => 2 "a" => 1 julia> dict Dict{String,Int64} with 3 entries: "c" => 3 "b" => 2 "a" => 1 julia> dict["a"] #字段索引 1 4.5 数据框 using DataFrames #julia的数据框并非内置类型,而是需要额外加载包 julia> DataFrame(A = 1:4, B = ["M", "F", "F", "M"]) 4×2 DataFrames.DataFrame │ Row │ A │ B │ ├-──┼─-┼─-┤ │ 1 │ 1 │ M │ │ 2 │ 2 │ F │ │ 3 │ 3 │ F │ │ 4 │ 4 │ M │ df = DataFrame() df[:A] = 1:8 df[:B] = ["M", "F", "F", "M", "F", "M", "M", "F"] 8×2 DataFrames.DataFrame │ Row │ A │ B │ ├-──┼-─┼-─┤ │ 1 │ 1 │ M │ │ 2 │ 2 │ F │ │ 3 │ 3 │ F │ │ 4 │ 4 │ M │ │ 5 │ 5 │ F │ │ 6 │ 6 │ M │ │ 7 │ 7 │ M │ │ 8 │ 8 │ F │ julia> size(df, 1) #数据框行数 8 julia> size(df, 2) #数据框列数 2 head(df) #预览指定行 tail(df) #预览指定列 julia> size(df) #数据框维度(包含行列) (8, 2) julia> df[1:3, :] #索引行列 3×2 DataFrames.DataFrame │ Row │ A │ B │ ├─-─┼-─┼-─┤ │ 1 │ 1 │ M │ │ 2 │ 2 │ F │ │ 3 │ 3 │ F │ julia> df[1:3, 2] 3-element Array{String,1}: "M" "F" "F" 在数据框索引这一点儿上,julia是吸收了R和Python的特点,即允许直接基于数据框 本身索引行列,使用 范围符号numA:numB,同时默认取所有列或行时用:。 当取单列时,自动降维为一维数组。 julia> describe(df) #描述性统计 A Summary Stats: Mean: 4.500000 Minimum: 1.000000 1st Quartile: 2.750000 Median: 4.500000 3rd Quartile: 6.250000 Maximum: 8.000000 Length: 8 Type: Int64 B Summary Stats: Length: 8 Type: String Number Unique: 2 关于数据合并: names = DataFrame(ID = [20, 40], Name = ["John Doe", "Jane Doe"]) jobs = DataFrame(ID = [20, 40], Job = ["Lawyer", "Doctor"]) join(names, jobs, on = :ID) 现实中数据合并的多种情况,julia中的DataFrames中的dataframe都能够很好地满足。 jobs = DataFrame(ID = [20, 60], Job = [“Lawyer”, “Astronaut”]) join(names, jobs, on = :ID, kind = :inner) join(names, jobs, on = :ID, kind = :left) join(names, jobs, on = :ID, kind = :right) join(names, jobs, on = :ID, kind = :outer) join(names, jobs, on = :ID, kind = :semi) join(names, jobs, on = :ID, kind = :anti) join(names, jobs, kind = :cross) rename!(b, :IDNew => :ID) #修改数据框指定列字段名称 5 简单的聚合运算 using DataFrames, CSV iris = CSV.read(joinpath(Pkg.dir("DataFrames"), "test/data/iris.csv")); julia> by(iris, :Species, size) #分类计数运算 3×2 DataFrames.DataFrame │ Row │ Species │ x1 │ ├─-─┼──────┼──-──┤ │ 1 │ setosa │ (50, 5) │ │ 2 │ versicolor │ (50, 5) │ │ 3 │ virginica │ (50, 5) │ by(iris, :Species, df -> mean(df[:PetalLength])) julia> by(iris, :Species, df -> mean(df[:PetalLength])) 3×2 DataFrames.DataFrame │ Row │ Species │ x1 │ ├──-┼──────┼-───┤ │ 1 │ setosa │ 1.462 │ │ 2 │ versicolor │ 4.26 │ │ 3 │ virginica │ 5.552 │ 这里:Species代表列引用,df -> mean(df[:PetalLength])这一句中的df并无实际意义,仅仅是julia中的匿名函数。所以df写成什么并无所谓。 julia> by(iris, :Species, x -> mean(x[:PetalLength])) 3×2 DataFrames.DataFrame │ Row │ Species │ x1 │ ├──-┼──────┼-───┤ │ 1 │ setosa │ 1.462 │ │ 2 │ versicolor │ 4.26 │ │ 3 │ virginica │ 5.552 │ 可以看到结果一模一样。 by(iris, :Species, df -> DataFrame(N = size(df, 1))) julia> by(iris, :Species, df -> DataFrame(N = size(df, 1))) 3×2 DataFrames.DataFrame │ Row │ Species │ N │ ├─-─┼──--───┼──┤ │ 1 │ setosa │ 50 │ │ 2 │ versicolor │ 50 │ │ 3 │ virginica │ 50 │ 分类计数的另一种写法。 by(iris, :Species,df -> DataFrame(m = mean(df[:PetalLength]), s² = var(df[:PetalLength]))) julia> by(iris, :Species,df -> DataFrame(m = mean(df[:PetalLength]), s² = var(df[:PetalLength]))) 3×3 DataFrames.DataFrame │ Row │ Species │ m │ s² │ ├──-┼──────┼─-----────────┤ │ 1 │ setosa │ 1.462 │ 0.0301592 │ │ 2 │ versicolor │ 4.26 │ 0.220816 │ │ 3 │ virginica │ 5.552 │ 0.304588 │ aggregate(iris, :Species, length) #聚合每一个类别的长度 aggregate(iris, :Species, [sum, mean]) #同时聚合汇总、均值 #长宽转换操作-由宽转长 d = melt(iris, :Species); 6. 日期&时间处理 Pkg.add("Dates") using Dates Date(2013) 2013-01-01 Date(2013,7) 2013-07-01 Date(2013,7,5) 2013-07-05 DateTime(2013) DateTime(2013,7) DateTime(2013,7,5) DateTime(2013,7,1,12) DateTime(2013,7,1,12,30) DateTime(2013,7,1,12,30,59) DateTime(2013,7,1,12,30,59,1) 取日期对应元素 t = Date(2014,1,31) Dates.year(t) Dates.month(t) Dates.week(t) Dates.day(t) 6.一些好用的魔法工具 6.1 函数 julia中的函数定义很有意思,如果是尊重语法规范,应该是这样定义 function f_jisaun(x) result = x^2 + 2x - 1 return result end julia> f_jisaun(5) 34 以上函数定义可简化为: f_jisaun(x) = x^2 + 2x - 1 34 几乎接近代数运算中对函数的定义。 6.1 匿名函数 匿名函数配合map高阶函数可以实现快速计算 n_fun = x -> x^2 + 2x - 1 #匿名函数 map(round, [1.2,3.5,1.7]) julia> map(round, [1.2,3.5,1.7]) 3-element Array{Float64,1}: 1.0 4.0 2.0 map(n_fun, [1.2,3.5,1.7]) julia> map(n_fun, [1.2,3.5,1.7]) 3-element Array{Float64,1}: 2.84 18.25 5.29 6.2 列表表达式 [i for i in 1:10] julia> [i for i in 1:10] 10-element Array{Int64,1}: 1 2 3 4 5 6 7 8 9 10 [(i^2,sqrt(i)) for i = 30:-2:10] julia> [(i^2,sqrt(i)) for i = 30:-2:10] 11-element Array{Tuple{Int64,Float64},1}: (900, 5.47723) (784, 5.2915) (676, 5.09902) (576, 4.89898) (484, 4.69042) (400, 4.47214) (324, 4.24264) (256, 4.0) (196, 3.74166) (144, 3.4641) (100, 3.16228) 7 控制流与逻辑判断 7.1 for 循环 function my_fun(h) i = [] for c in 1:h if c%3 == 0 push!(i,c) end end return i end julia> dd = my_fun(100) 33-element Array{Any,1}: 3 6 9 12 15 18 21 24 27 30 ⋮ 72 75 78 81 84 87 90 93 96 99 7.2 while 循环 function my_fun(h) i = [] range = 1 while range <= 100 if range%3 == 0 push!(i,range) end range += 1 end return i end julia> my_fun(100) 33-element Array{Any,1}: 3 6 9 12 15 18 21 24 27 30 33 36 39 ⋮ 66 69 72 75 78 81 84 87 90 93 96 99 以上便是初次体验julia学会的一些简单知识点,以后有时间还会继续学习julia~ 原文发布时间为:2018-08-26 本文作者:杜雨 本文来自云栖社区合作伙伴“数据小魔方”,了解相关信息可以关注“数据小魔方”。

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

Android Studio 初体验

Google在I/O2013大会上发布了Android新的开发工具Android Studio,趁周末时间做了一下尝试。有需要的可以 在http://developer.android.com/sdk/installing/studio.html下载,当前版本是V0.1。官方解释:Android Studio is a new Android development environment based on IntelliJ IDEA. Similar to Eclipse with the ADT Plugin。 Android Studio 和Eclipse+ADT还是很相似的,所以eclipse转移过去是没有难度的。 Android Studio是基于IntelliJ IDEA,除了IntelliJ功能,Android Studio还提供: 基于Gradle的构建支持; Android特定重构和快速修复; 提示工具更好地对程序性能、可用性、版本兼容和其他问题进行控制捕捉; 支持ProGuard和应用签名功能; 自带布局编辑器,可以让你拖放UI组件,并在多个屏幕配置上预览布局,等等。 Android Studio提供了Windows、Mac OS X、Linux版本,用户根据自己的系统选择下载。 下载完安装请参考:http://developer.android.com/sdk/installing/studio.html#Installing 安装完成,打开Android Studio,如图: 第一次使用,New Project时可能会报: Your Android SDK is out of date or is missing templates. Please ensure you are using SDK version 22 or later. 这需要你使用新的SDK,以前在Eclipse使用习惯了android SDK、ADT等,现在只需进入到eclipse更新SDK即可。或者找到SDK目录下的SDK Manager.exe升级。 升级完成,通过Android Studio的如下路径设置SDK,Configure--> Project Defaults --> Project Structure,如下图 设置完成就可以新建项目了.新建项目: 设置图标: 选择不同的Activity,上面的步骤和Eclipse一样。 新建的工程结构如下,这样就简单的创建了工程。 参考: http://developer.android.com/sdk/installing/studio.html; /** * @author 张兴业 * http://blog.csdn.net/xyz_lmn * 我的新浪微博: @张兴业TBOW * android开发进阶群: 241395671 */ 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230742 ,如需转载请自行联系原作者

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

Excel for IPAD 初体验

3月28日微软正式发布了Office for IPAD套件,强大的办公软件三剑客Word、Excel、PowerPoint和更新后的OneNote。原本IPAD比较倾向于娱乐方面,如今有了Office的这三个产品,使得在IPAD上移动办公变得更加容易,毕竟对文档、表格、PPT的兼容性是其他办公类app无法比拟的。我们可以通过App Store搜索下载它们,刚发布这几天你可以通过精品推荐找到它们。三个产品容量每个都有400M,让我16G的IPAD捉襟见肘。 本篇博文为大家预览一下Excel for IPAD的外观界面。 第一次进入Excel,就会发现此次微软将主推Office 365产品。对于Office大家肯定不陌生,但Office 365似乎很多人还不认识,或者接受不了。我们可以通过Office365订阅帐户登陆Excel。 通过微软帐户登陆,并可直接连接到OneDrive,也就是之前的SkyDrive云存储,文件可以保存在微软服务器中,对于我的16G的IPAD再好不过。 登陆成功后,发现还是需要购买订阅才可以,否则只能选择第二个“免费查看”,无法编辑表格。 关于价格,令人遗憾。怎么说呢,不知道微软是如何调查国内市场得出此价格的,还是根本不调查直接照搬国外的付费模式。其实我们国内的消费习惯还应该不适应,有些付费游戏做得不错。在国外付费了才能玩,在国内免费玩,但如需提升游戏可玩性就需要买道具。这就是消费习惯,期待未来免费的内容可以增加部分编辑功能。 进入Office直接连接OneDrive最近操作过的文档。 左边新建按键,可以看到Excel 2013风格的各类报表范例。 打开任意文件,选项卡下提示为“只读”文件。 Excel for IPAD选项卡功能区的功能还是非常多的,单元格样式、筛选、排序、冻结窗格,还有各类公式和Excel 2013新功能推荐图表,也可以在各个选项卡中找到。相比桌面版本,少了部分平时使用较少的功能。毕竟输入对于移动平板来说还是个软肋,复杂的操作没有鼠标键盘的帮助,还是有些困难。我认为移动办公主要还是用以展示和一般的数据数据修改,如需海量的操作PC端暂时无法被取代。 右上角是共享按钮,可以发电子邮件及OneDrive云存储链接地址。 右下角与PC端Excel类似,可以选择默认显示在底部状态栏的计算方式。 点击右上方的放大镜可以进入查找替换状态,功能如桌面版强大。 左上角保存,可以将表格保存在本地或者云端OneDrive中。 在编辑栏输入数据与公式时将会弹出公式键盘,方便对复杂公式的输入。针对平板的公式输入也有了很多提升,诸如单元格的选择也更加方便准确。之后的博文会逐一聊到。 Office for IPAD非常强大,终于可以让喊了好久的移动办公脚踏实地,与PC端无差异操作令人兴奋。当然除了价格。 本文转自kirin51CTO博客,原文链接:http://blog.51cto.com/kirin/1386782,如需转载请自行联系原作者

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

Android之初体验

没进实验室之前,听说过Android,但是不知道它是干什么的,进实验室之后,开始接触Android,然后做了一个HelloWorld程序,觉得原来Android是这样的,也不是很难嘛。但是是在后来的学习过程中,越来越发现知识是无穷的,自己学到的真的是九牛一毛都不到! 我遇到第一个令我头大的问题是在学习Activity的时候。刚开始学习这些前台进程,可见进程,服务进程,后台进程和空进程的时候,我有点疑惑,于是我就联系打开多个网页的情形来理解了这些进程。可是在后来学习Activity生命周期的时候,我把这两个内容糅合在了一起,我彻底凌乱了,,,,,,对于书上说的onCreate,onStart,onStop,onPause等等方法,我在想如果我把一个页面最小化了,这时我该调用哪些方法呢?如果我把页面还原了又要调用哪些方法呢?各种调用,各种乱!!!遇到这个问题的时候,我一方面看参考书,另一方面我也上网查资料,逛论坛,发帖子,但是仍然没有找到好的答案。于是我就不停地在想这个问题,这个Activity生命周期方法的调用一直困扰我了两天,到第三天的时候,学长问我这几天的学习有没有遇到困难,我就把这个困惑给他说了一下,结果他一句话就把我点醒了。他说:“Android页面和web网页不一样,它没有最小化,还原等功能!”我突然恍然大悟,,,原来我把两者弄混了,由此让我懂得在遇到困难的时候,先要学会自己思考,但是借助外力也是必须的!比如上网查找资料,让别人求助等。或许苦苦困惑你的问题别人也遇到过,这样自己也可以节省些时间,少走些弯路!聪明的人从别人的错误中吸取经验! 经过这段时间的学习,让我深有感触的是:切勿眼高手低!!!有时看资料书上的代码觉得看懂了,在看视频的时候也觉得当时听懂了,可是自己不去动手实践的话就只能是左耳朵进右耳朵出!当我写scheduler项目的时候,我想了好久,最后把大致要实现的思路,方法都确立了,就觉得这个不是也很随意的嘛!思路有了,用不了多长时间就可以完成了!于是就开始松懈了,但是当真正敲代码的时候才知道每一个方法,每一个细节不注意都回出错,后来再下一次开会的时候有同学都已经写出来了,而我的还没有完成,,,以后在写程序的时候,一定不会再眼高手低了。而且在思考的时候一定把要实现的项目的逻辑搞清楚,把每一个页面的跳转,传参都要考虑好,精确到每个方法中,这样在动手写程序的时候就思路清晰,不会被这些跳转,传参搞得头晕! 每一次犯错都是在为成功铺路,每一次反思都是在不断地进步,在以后的学习过程中要时时提醒自己不要犯同样的错误! 本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/1218179,如需转载请自行联系原作者

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

Swift初体验(三)

var sex: String? var identify: PersonIdentify? // 构造器中,第一个參数依旧会创建一个和局部參数名称同样的外部參数名称 init(name: String, sex: String, identify: PersonIdentify){ self.name = name; self.sex = sex; self.identify = identify } func description() -> String{ // 调用枚举值的toRaw()方法能够获取到枚举值的初值 return "name = \(name) sex = \(sex) course = \(identify!.toRaw())" } // 在类中假设实现协议中定义的mutating方法,那么不须要加"mutating"keyword func aMutatingMethod(){ } class func aTypeMethod(){ } } var person1 = Person(name:"humingtao",sex:"m",identify:.Student) var person2 = Person(name:"kebi",sex:"m",identify:.Teacher) switch(person1.identify!){ case .Teacher: println("I am a teacher") case .Student: println("student") } class Student:Person{ var number: String? // 在类中,类型属性仅仅能够是计算属性,可是在枚举和结构体中,既能够是计算属性,也能够是存值属性 // 在类中,声明一个类型属性的keyword是class,在结构体和枚举中是static class var attendClassTime: String{ return "9:30" } init(name: String, sex: String, number: String){ super.init(name: name, sex: sex, identify: .Student) self.number = number } } var student1 = Student(name: "hmt",sex: "m",number: "12345678") class Teacher:Person{ var course: String? init(name: String, sex: String, course: String){ super.init(name: name, sex: sex, identify: .Teacher) self.course = course } override func description() -> String{ return super.description() + "" + "course = \(course)" } } // 思考为什么加"?" class course{ var name: String? init(name: String){ self.name = name } } 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5209449.html,如需转载请自行联系原作者

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

Chromium OS 初体验

Chromium OS可是早有耳闻,但是一直没有尝试,最近很多评论甚至认为会对Windows和Mac都能够造成压力,于是迫不及待的想尝试一下了,百度下了官网,官网很贴心,不光给了用于写入U盘的镜像文件(最初是针对上网本的,所以自然不是刻录成光盘)还给了Vmware和Vitual Box的文件,因此只需要下载虚拟机文件就能够直接在虚拟机运行了。我下载了VMware的虚拟机文件,因此运行就比较简单了,直接双击就可以打开虚拟机,由于我上网需要认证,因此我将网络改为NAT的方式这样就可以直接共享主机的网络了。 运行后发现网络仍然不可选,自己查找了下资料,解决方法也很简单,在VMX文件中添加一句话就OK。下图的最后一句:ethernet0.virtualDev = "e1000" 关闭虚拟机重新开启即可运行了,简单设置就进入系统了。 简单体验了下,果然够简洁,鼠标有点迟缓的不习惯,习惯了雅黑的字体再看里面的字体也很别扭,设置啥的都是基于浏览器,尝尝鲜还可以,真正用一时半会估计很难习惯。 虎嗅网:对2014年:Chrome OS会成PC产业Android吗?一文的评论 废话不多说,自己去体验一把再来下结论,Chrome OS官网上就有Vmware和VirtualBox的文件,下载下来自己用虚拟机先体验一把在来看看这些结论。 我认为不会的原因有这几点: 1、Android 1.5产品出来的时候,在当时相对于普通手机来说哪些操作可以说是非常惊艳,界面华丽,操作流畅,更重要的是除了iPhone没有其他类似操作的机型,和同时期的诺基亚S60系统比一下就知道它的优势。 2、相比之下看下Chrome OS,一是概念有点超前,所有操作都在浏览器中完成,而且重度依赖网络,Win8的界面尚带来如此大的反弹,这样的一个操作和变化你觉得用户能够很快接受并适应么? 3、从产品体验本身来看,Android 1.5/1.6相对当时的塞班S40/S60,Chrome OS相对Windows,在竞争形势上可能有点近似,但是从产品本身的颠覆性来说远远不够。 4、Chrome OS不是一两年了,2008年就开始了,只是Chrome OS和上网本来说更加适合一些,上网本本身性能比较弱,多数用来只是访问网络和简单娱乐,定位上比较接近,而现在超极本的定位和上网本有本质区别,加上平板电脑的流行更没有Chrome OS的空间了。 5、相对Chrome OS我更推崇摩托罗拉和华硕类似的将手机与笔记本结合的产品,基于安卓平台实现手机到桌面的扩展,这个我觉得来的更为实际。 本文转自emouse博客园博客,原文链接:http://www.cnblogs.com/emouse/p/3493176.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Spring

Spring

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册