首页 文章 精选 留言 我的

精选列表

搜索[骁龙8至尊版],共10000篇文章
优秀的个人博客,低调大师

Tensorflow快餐教程(8) - 深度学习简史

深度学习简史 从机器学习流派说起 如果要给机器学习划分流派的话,初步划分可以分为『归纳学习』和『统计学习』两大类。所谓『归纳学习』,就跟我们平时学习所用的归纳法差不多,也叫『从样例中学习』。归纳学习又分为两大类,一类是像我们归纳知识点一样,把知识分解成一个一个的点,然后进行学习。因为最终都要表示成符号,所以也叫做『符号主义学习』;另一类则另辟蹊径,不关心知识是啥,而是模拟人脑学习的过程,人脑咋学咱们就照着学。这类思路模拟人的神经系统,因为人的神经网络是连接在一起的,所以也叫『连接主义学习』。『统计学习』,则是上世经90年代才兴起的新学派。是一种应用数学和统计学方法进行学习的新思路。就是我既不关心学习的内容,也不是模拟人脑,而主要关心统计概率。这是一种脱离了主观,基本全靠客观的方式。 连接主义学派 连接主义学派的初心是模拟人脑的学习方式。我

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

Debian 8 使用 Apache 部署 Ruby on Rails

Ruby on Rails 是一个快速开发的Web框架,Web设计人员和开发人员利用它能实现动态的全功能Web应用程序。 本文使用 Phusion Passenger 或mod_rails 方法部署 Rails 应用程序。 Passenger 允许您直接在Apachen应用程序中嵌入 Rails 应用程序,而无需使用FastCGI或复杂的Web服务器代理。 安装Passenger和依赖关系 1.安装使用Ruby,构建Ruby模块和运行Rails应用程序所需的系统包 sudo apt-get install build-essential libapache2-mod-passenger apache2 ruby ruby-dev libruby zlib1g-dev libsqlite3-dev 2.使用gem模块的gem包管理器,安装fastthread gem: sudo gem install fastthread 3.安装Ruby On Rails: sudo gem install rails 4.(可选)为您的应用程序安装其他依赖项,例如 MySQL 支持: sudo apt-get install mysql-server libmysqlclient-dev mysql-client mysql-common sudo gem install mysql 5.将rails添加到$PATH环境变量。 请确保用正在运行的Ruby版本替换VERSION: ls /var/lib/gems PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/var/lib/gems/VERSION/bin" 6.在您的网站的公共文件夹中启动一个新的rails项目,以确保一切正常配置。 替换为你的应用程序名称: sudo rails new /var/www/html/example.com/public_html/application 配置Apache以使用Passenger 1.打开配置文件,调整DocumentRoot /etc/apache2/sites-available/example.com.conf: DocumentRoot /var/www/html/example.com/application/public 2.重启Apache sudo systemctl restart apache2 部署多个Rails应用程序 有许多方法可以使用Passenger部署多个Rails应用程序。 最简单的方法是运行如上配置的多个不同的虚拟主机来托管单个Rails应用程序。 或者,您可以在单个虚拟主机中托管多个Rails应用程序。 本节介绍一个。 1.添加RailsBaseURI指令,指定虚拟主机配置中Rails应用程序的路径,如以下示例所示, /etc/apache2/sites-available/example.com.conf: DocumentRoot /var/www/html/example.com/public_html/ RailsBaseURI /app1 RailsBaseURI /app2 RailsBaseURI /app3 这些指令配置Passenger在example.com站点上指定的三个位置运行三个Rails应用程序。 2.将应用程序的public/目录链接到public_html/的子目录: ln -s /var/www/html/example.com/app1/public/ /var/www/html/example.com/public_html/app1/ ln -s /var/www/html/example.com/app1/app2/ /var/www/html/example.com/public_html/app2/ ln -s /var/www/html/example.com/app1/app3/ /var/www/html/example.com/public_html/app3/ 原文发布时间:2017-06-12 本文来自云栖社区合作伙伴“ Debian社区”,了解相关信息可以关注“ Debian社区”。

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

Java-学习笔记-8-接口

不足之处,欢迎专家、同行、读者批评指正。 Java在设计的时候为了求简,是舍弃了多继承机制的。但是,实际开发中有时候又需要用。于是,开发者们就曲线救国,通过接口来变相地实现多继承。 其实我个人也比较赞同单继承。接口和继承,是两个不同层次的概念,本来不应该相提并论的。不过在使用时,比较接近。 今天太晚了,先写到这里。如果有人关注的话,稍后我会补上更多的理解。

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

《Java编程思想》读书笔记(8)

前面的几篇笔记都写得太古板了,今天就换个新的写作风格来试试,暂且叫“案例导向式”吧,希望能对自己和别人的学习有所帮助。 第一部分 问题场景描述 某日,小菜跑来问我:“phinecos,我真是快被java逼疯了,你可得帮帮我呀!!“ 我转过头,“怎么了,小菜?“。 “是这样的,我现在在学习swing,每次用一个控件吧,如果想知道它能处理的事件的话,就得去查jdk文档,可sun那该死的文档总是把人搞得头晕,我只不过是想看看有什么事件可以处理而已,它那乱七八糟的文档反而把我快逼疯了,你给我出出主意吧。。。“小菜着急地摇着我的手说。 “哦,原来是这样啊,恩,可为什么你不用eclipse哪?它有提供你所需要的功能啊。”我不解的问。 “。。。这个,我不是不想用啊,可听人说,高手都是只用记事本和jdk的,我想成为高手,所以不敢用呀。”小菜支支唔晤的说。 “。。。。。。” 第二部分 分析与设计 需求是软件的关键。碰到上面小菜的问题了,我们就开始进行分析吧。小菜到底有什么需求哪?他是想查看一个swing控件类能够处理的事件列表,也就是它的所有addXXXListener方法。怎么办哪?看来只有两个解决方案了:一,劝小菜用eclipse,这样就可以直接利用eclipse的功能满足他的需求。(可这个已经被否定了,因为小菜要成为“高手”,^o^).二,那就只有为他开发一个小实用工具,让他可以查看各个Swing控件能够处理的事件,也就是把它的所有addXXXListener方法都列出来。 好了,东西比较小,那就先从GUI界面开始,至于核心的事件处理先不管,如下图: 6-6-1.GIF 用户界面代码如下: package com.vitamin.UI; import java.awt.ActiveEvent; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Event; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import com.vitamin.Console.console; public class ShowAddListeners extends JFrame { private JLabel lbName = null; private JTextField tfName = null; private JTextArea tResult = null; private JPanel pName = null; public ShowAddListeners() { super(); this.initForm(); } public ShowAddListeners(String title) { super(title); this.initForm(); } private void initForm() { this.lbName = new JLabel("请输入Swing控件的类名:"); this.tfName = new JTextField(20); this.tResult = new JTextArea(40,50); this.pName = new JPanel(); pName.add(this.lbName); pName.add(this.tfName); Container con = this.getContentPane(); con.add(BorderLayout.NORTH,pName); con.add(new JScrollPane(this.tResult)); tfListener tf1 = new tfListener(); this.tfName.addActionListener(tf1); console.run(this,600,600); } class tfListener implements ActionListener { public void actionPerformed(ActionEvent e) {//核心处理代码处 if(tfName.getText().length()==0) { JOptionPane.showMessageDialog((JTextField)e.getSource(),"请输入控件类名称!!!","错误信息",JOptionPane.DEFAULT_OPTION); return; } JOptionPane.showMessageDialog((JTextField)e.getSource(),"OK","信息",JOptionPane.DEFAULT_OPTION); } } /** * @param args */ public static void main(String[] args) { ShowAddListeners sl = new ShowAddListeners("事件查看器"); } } 在这里我对用户引发的键盘事件还只是简单地进行一个测试用的显示处理,还没有添加进用来完成所需功能的代码,但提早让用户体验到模型,哪怕是一个没有具体功能的虚模型也是一件好事情。 恩,问题来了,接收到用户输入的swing控件类名以后,该怎么去读取它所有的方法,并且能把adeeXXXListener()这样类型的方法给显示在TextArea控件里给用户哪?我第一反应是:要想获取一个类的所有方法,应该用RTTI,先用类名构造一个Class,再去尝试获取其方法。至于想从读出来的所有方法中只选出adeeXXXListener()类型的方法,应该要使用正则表达式来进行模式匹配吧。现有的思路是这样的,可对RTTI, 正则表达式,我都不熟悉,该怎么办哪?看来得靠jdk文档和google了。 好吧,打开jdk文档开始看Class的知识吧: public static Class<?> forName(String className) throws ClassNotFoundException 返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于: Class.forName(className, true, currentLoader) 其中 currentLoader 表示此类的定义类加载器。 例如,以下代码片段返回 java.lang.Thread 类的运行时 Class 描述符。 Class t = Class.forName("java.lang.Thread") 调用 forName("X") 将导致名为 X 的类被初始化。 恩,正是我要的,仿上面给的例子,我应该这样做:先获取用户输入的swing控件名称,如JButton,然后:] Class t= Class.forName("java.swing."+name); 现在有了运行时的类了,接下来就是获取它的所有方法了 那我就应该这样:Method[] mt = t. getMethod();这样就把所有的方法读取到数组mt中了。 修改后的效果: 6-6-3.GIF 修改后的事件处理代码: class tfListener implements ActionListener { public void actionPerformed(ActionEvent e) { String name = tfName.getText().trim(); Class clName = null; if(name.length()==0) { JOptionPane.showMessageDialog((JTextField)e.getSource(),"请输入控件类名称!!!","错误信息",JOptionPane.DEFAULT_OPTION); return; } else { try { clName = Class.forName("javax.swing."+name); Method[] mt = clName.getMethods(); for(int i=0;i<mt.length;i++) { tResult.append(mt[i].toString()+"\n"); } } catch(ClassNotFoundException ex) { tResult.setText("没有找到匹配的方法名!!!"); } } } } 现在已经初具雏形了,可获取的是全部方法,并不是我们原本想要的东西,还得从这个方法列表中进行一些筛选工作才行。 要选出只含有addXXXListener的方法,就应该尝试构造一个能够识别这样方法的正则表达式。翻阅jdk文档后,我写了这样一个正则表达式: private static String StrReg = "add\\w+?Listener";其中\\w+?表示一个或多个字符 为了学习如何编写识别一个简单模式的程序,我写了一个简单的测试程序: package com.vitamin.Console; import java.util.regex.*; public class regTest { public static void main(String[] args) { Pattern p = null; Matcher m = null; p = Pattern.compile("a*b"); m = p.matcher("aaaaab"); if(m.matches()==true) { System.out.println("模式匹配成功"); } else { System.out.println("匹配失败"); } } } 现在就来完成剩余的工作,代码如下: package com.vitamin.UI; import java.awt.ActiveEvent; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Event; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.lang.reflect.Method; import java.util.regex.*; import javax.swing.*; import com.vitamin.Console.console; public class ShowAddListeners extends JFrame { private JLabel lbName = null; private JTextField tfName = null; private JTextArea tResult = null; private JPanel pName = null; private static String StrReg = "add\\w+?Listener"; private static Pattern pt = Pattern.compile(StrReg); private static Matcher mc = null; public ShowAddListeners() { super(); this.initForm(); } public ShowAddListeners(String title) { super(title); this.initForm(); } private void initForm() { this.lbName = new JLabel("请输入Swing控件的类名:"); this.tfName = new JTextField(20); this.tResult = new JTextArea(40,50); this.pName = new JPanel(); pName.add(this.lbName); pName.add(this.tfName); Container con = this.getContentPane(); con.add(BorderLayout.NORTH,pName); con.add(new JScrollPane(this.tResult)); tfListener tf1 = new tfListener(); this.tfName.addActionListener(tf1); console.run(this,600,600); } class tfListener implements ActionListener { public void actionPerformed(ActionEvent e) { String name = tfName.getText().trim(); Class clName = null; if(name.length()==0) { JOptionPane.showMessageDialog((JTextField)e.getSource(),"请输入控件类名称!!!","错误信息",JOptionPane.DEFAULT_OPTION); return; } else { try { clName = Class.forName("javax.swing."+name); Method[] mt = clName.getMethods(); for(int i=0;i<mt.length;i++) { mc = pt.matcher(mt[i].toString()); if(mc.find()) { tResult.append(mt[i].toString()+"\n"); } } } catch(ClassNotFoundException ex) { tResult.setText("没有找到匹配的方法名!!!"); } } } } /** * @param args */ public static void main(String[] args) { ShowAddListeners sl = new ShowAddListeners("事件查看器"); } } 结果如下,虽然还有很多地方不成熟,但也算是我的一个小作品吧,^o^ 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/06/06/418261.html,如需转载请自行联系原作者

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

8 个最好的 Java RESTful 框架

过去的每一年,涌现出越来越多的Java框架。就像JavaScript,每个人都认为他们知道一个好的框架的功能应该是怎么样的。连我的老祖母现 在也使用 一个我从来没有听说过而且可能永远不会使用的框架。玩笑归玩笑,可以做几乎任何事的臃肿的框架市场已经饱和,,但是如何评判呢?这篇文章旨在提供目前最好 的 Java RESTfulful 框架。我只介绍轻量级的产品, 略过了那些臃肿的过度设计的框架。同时,我只想要他们稳定和成熟,提供简单,轻量级的特点。我只在介绍Play frameworks时打破这条规则,理由稍后给出。在将来的项目中使用哪个 Java RESTful框架完全取决于你当前的需求。为了便于你取舍,我将列出最突出的框架功能,希望这能节省一些你的时间。 Dropwizard 诞生时间: 2011 评分: 4.5/5 Dropwizard 提供了稳定成熟的Java库, 并封装成一个简单的轻量级的包。 Dropwizard 介于框架和库之间。它提供了一个开发web应用程序的全部所需。由于内置模块化,一个应用程序可以保持小而精干的特点,减少开发和维护的时间,减少负担。 Dropwizard 使用已有的 Jetty HTTP 库,嵌入到你的项目中,无需外部的server。所有的Dropwizard项目都有一个 main 方法来管理内建的 HTTP server. 链接 官方站点 GITHUB 文档 优点 快速的项目构建和启动 模块化 不可思议的快(至少根据内建的 metric 测得的结果) Jetty for HTTP, Jersey for REST, 以及 Jackson for JSON 也支持其它的库, 比如 Mustache, Logback, JDBI, Hibernate Validator, Guava, … 使用Metrics支持监控 Main方法启动 Jetty server,可以容易地调试和维护 社区力度强 缺点 Dropwizard文档是主要的知识来源,但谈不上优秀。你可能需要搜索和发掘第三方类库的文档。 因为某些原因错误被当作普通文本, 如果你希望响应结果总是JSON,这可能有问题 确保使用最新的Dropwizard, 一些老版本使用了废弃的第三方库。 而且早期的Dropwizzard也很难升级 例子 package com.example.helloworld; import io.dropwizard.Application; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; import com.example.helloworld.resources.HelloWorldResource; import com.example.helloworld.health.TemplateHealthCheck; public class HelloWorldApplication extends Application<HelloWorldConfiguration> { public static void main(String[] args) throws Exception { new HelloWorldApplication().run(args); } @Override public String getName() { return "hello-world"; } @Override public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) { // nothing to do yet } @Override public void run(HelloWorldConfiguration configuration, Environment environment) { // nothing to do yet } } 注解 个人不想为大的项目推荐这个框架。不过如果你想尝试的话,你不会失望的。主要是这个框架使用最好的现代的Java web 组件,组装成一个简单易用的框架。 不幸的是这也带来了它的问题。 将这些库糅合起来可能导致不可预见的问题。这也是我为什么给它减掉0.5颗星,而没有评为满分5颗星。 Jersey 诞生时间: 2012 (Jersey 2.X) 评分: 5/5 Jersey RESTful 框架是开源的RESTful框架, 实现了JAX-RS (JSR 311 & JSR 339) 规范。它扩展了JAX-RS 参考实现, 提供了更多的特性和工具, 可以进一步地简化 RESTful service 和 client 开发。尽管相对年轻,它已经是一个产品级的 RESTful service 和 client 框架。 链接 官方站点 GITHUB 文档 优点 优秀的文档和例子 快速 超级容易的路由 平滑的 JUnit 集成 就个人而言, 当开发 RESTful service 时, JAX-RS 实现要好于 MVC 框架。 可以集成到其它库/框架 (Grizzly, Netty). 这也可能是很多产品使用它的原因。 支持异步链接 不喜欢 servlet container? 使用Jersey的时候可以不用它们。 WADL, XML/JSON support 包含在Glassfish中 缺点 Jersey 2.0+使用了有些复杂的依赖注入实现 可能不是一件坏事。Jersey 1.X 使用较老的 JAX-RS 实现 一大堆第三方库只支持 Jersey 1.X, 在 Jersey 2.X 不可用 例子 package org.glassfish.jersey.examples.helloworld; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @Path("helloworld") public class HelloWorldResource { public static final String CLICHED_MESSAGE = "Hello World!"; @GET @Produces("text/plain") public String getHello() { return CLICHED_MESSAGE; } } 注解 Jersey 是我的选择, 5颗星。 Ninja Web Framework 诞生时间: 2012 评分: 3.5/5 Ninja Web Framework是全栈的 java web framework。稳定, 快速, 可靠, 产品级. 它提供了开发,测试,发布,维护 RESTful web应用的一切(Servlets, Guice, JPA, Flyway migrations, Maven, etc.). 就像 DropWizzard, Ninja Web Framework 是一个集成的软件栈。你不必建立你自己的,只需使用 Maven archetype生成一个新的项目,导入到IDE中就可以开始编码了。 链接 官方站点 GITHUB 文档 优点 快 快速的项目构建和启动 模块化 XML, HTML, JSON渲染 也支持其它的库 (如 Guice, Logback, Guava, etc.) 很好的数据持久化和缓存 不喜欢 servlet container? U可以选择你喜欢的容器 如果根本就不喜欢容器,可以使用 standalone 模式, 使用Jetty作为一个自执行的jar 缺点 同样,就像DropWizzard, 文档有但是不够好。我花了好长时间去了解它。这个框架也依赖很多其它的库,有时候想得到所需的信息很麻烦。 不怎么出名,社区小。 有谣言说这个框架是由那些切换到Scala的 Play 2.X 用户创建的 例子 package controllers; public class ApplicationController { public Result index() { Person person = new Person(); person.name = "John Johnson"; return Results.json().render(person); } } 注解 看起来不错,但是在它成熟之前我还是把它丢在一边吧。 Play Framework 诞生时间: 2011 评分: 4/5 使用Play Framework 很容易地创建,构建和发布 web 应用程序,支持 Java & Scala。它使用Akka, 基于一个轻量级的无状态的架构。它应该应用于大规模地低CPU和内存消耗的应用。 链接 官方站点 GITHUB 文档 优点 易于开发 快,但是没有其它的一些框架快 基于 Netty, 支持非阻塞的 I/O. 并行处理远程调用的时候很优秀 社区很大 快速的项目构建和启动 模块化 MVC REST, JSON/XML, Web Sockets, non-blocking I/O 只需刷新浏览器就可以看到最新的改变 支持Async 有出版的书 缺点 版本2.0 是最有争议的Java框架。 切换至Switch to Scala made some Java developers outraged. 不向后兼容; Play 2.X 重写了 号称轻量级,但有些臃肿 SBT构建工具. 号称 Maven 杀手, 但是从没有优秀到替换它。难以学习和配置 非 servlet Breaking changes across releases 例子 package controllers import play.api._ import play.api.mvc._ class Application extends Controller { def hello(name: String) = Action { Ok("Hello " + name + "!") } } 注解 抱怨归抱怨,我还是一直喜欢和首选这个框架。不幸的是,我只能给它4颗星。我坚信 基于JAX-RS的框架更适合 RESTful web services. RestExpress 诞生时间: 2009 评分: 3/5 RestExpress是一个非容器的轻量级的 Netty HTTP栈的包装, 以便更容易地创建 Java RESTful services. RestExpress 目标是支持最好的 RESTful 实践。 链接 GITHUB 优点 真正的微框架 顶级的性能,快,可靠 XML/JSON 最老的也是最稳定的 RESTful 框架之一 缺点 没有文档 几乎没有支持 很小的社区 例子 package com.example; import java.io.IOException; import io.netty.handler.codec.http.HttpMethod; import org.restexpress.RestExpress; public class Main { public static RestExpress startServer(String[] args) throws IOException { RestExpress server = new RestExpress(); MyResource r = new MyResource(); server.uri("/myapp/myresource", r) .method(HttpMethod.GET) .noSerialization(); server.uri("/myapp/myresource", r) .method(HttpMethod.POST); server.bind(8080); return server; } public static void main(String[] args) throws Exception { RestExpress server = startServer(args); System.out.println("Hit enter to stop it..."); System.in.read(); server.shutdown(); } } 注解 尽管这个框架超级快,我也不想推荐它。文档缺乏以及没有支持使它成为一个欠佳的框架。看在速度的份上给它3颗星。 Restlet 诞生时间: 2005 评分: 4.5/5 Restlet 帮助Java程序员建立大规模的快速的符合 RESTful 架构模式的web api。 它提供了强大的路由和 filtering 系统。统一的client/server Java API. 满足所有主要的平台 (Java SE/EE, Google AppEngine, OSGi, GWT, Android) 以及提供了无数的扩展以满足程序员的需求。 据我说知,它是第一个 java RESTful web 框架。很多公司都在用它,但是你可能从未听说过它,好像它已经不可见了。 链接 官方站点 GITHUB 文档 优点 强大 企业级的框架 多平台 Java SE, Java EE, Google Web Toolkit, Google AppEngine, Android, OSGi environments 支持JAX-RS (就像 Jersey) 大部分高级 RESTful 支持 模块化 支持其它库 开发一直活跃 智能的url绑定, 全功能的 URI 路由 有相关的书籍 缺点 非常陡峭的学习曲线 关闭的社区,尽管 StackOverflow 上还是开放的 不再流行,更多的是因为 Play Framework 和 Jersey 例子 public class Part03 extends ServerResource { public static void main(String[] args) throws Exception { // Create the HTTP server and listen on port 8182 new Server(Protocol.HTTP, 8182, Part03.class).start(); } @Get("txt") public String toString() { return "hello, world"; } } 注解 尽管这个框架还一直流行,考虑到它的年纪和当前的完成度,我不能给它5颗星。 Restx 诞生时间: 2013 评分: 3.5/5 Restx 是一个轻量级的,模块化的,特性众多的,超快的开源 Java REST 框架。 链接 官方站点 GITHUB 文档 优点 快速,轻量级 容易搭建 真正的微框架 模块化 支持其它库 支持MongoDB 缺点 不友好的令人迷惑的文档。对于这类框架我期望能有好一点的文档 太年轻 目前还不支持异步Async 例子 @GET("/message/{id}") public Message sayHello(String id, // path param String who // query param ) { return new Message().setMessage(String.format( "hello %s, it's %s", who, DateTime.now().toString("HH:mm:ss"))); } @POST("/message/{id}") public Message sayHello(String id, // path param Message msg // body param ) { return msg.setMessage(String.format( "%s @ %s", msg.getMessage(), DateTime.now().toString("HH:mm:ss"))); } 注解 真心来讲我没有在这个框架上花费太多时间。不值得在另一个框架上花费太多精力,我意思是说,Java框架市场已经越来越碎片化了,就像 JavaScript 市场,应该停止这种趋势了。 Spark Framework 诞生时间: 2011 评分: 3.5/5 不要和 Apache 的大数据框架 Spark 弄混, 这里的 Spark 框架是一个轻量级的 Java web 框架,用来进行快速的开发(50% Spark用户使用 Spark 创建 REST APIs)。 它受 Ruby 框架 Sinatra 启发。 它有一个不到1M的最小化的内核, 提供了所有基本的特性, 用来构建 RESTful 或者传统的 web 应用程序。 链接 官方站点 GITHUB 文档 优点 快,轻量级 优秀的快速原型 易于搭建 经常和AngularJS搭配使用 真正的微框架 使用 Jetty 可以用在容器中或者独立运行 缺点 文档可以更好,它不适合初学者 不适合大型项目 社区小 例子 import static spark.Spark.*; public class HelloWorld { public static void main(String[] args) { get("/hello", (req, res) -> "Hello World"); } } 注解 这个框架适合初始开发。主要用作小小项目或者原型。 来源:51CTO

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

oracle点知识8——索引组织表

关于索引的入门参照博客:http://blog.csdn.net/changyanmanman/article/details/7097318 索引组织表(index organizedtable, IOT)就是存储在一个索引结构中的表。存储在堆中的表是无组织的(也就是说,只要有可用的空间,数据可以放在任何地方),IOT中的数据则按主键存储和排序。对你的应用来说,IOT表和一个“常规”表并无二致。 IOT有什么意义呢?使用堆组织表时,我们必须为表和表主键上的索引分别留出空间。而IOT不存在主键的空间开销,因为索引就是数据,数据就是索引,二者已经合二为一。 但是,IOT带来的好处并不止于节约了磁盘空间的占用,更重要的是大幅度降低了I/O,减少了访问缓冲区缓存(尽管从缓冲区缓存获取数据比从硬盘读要快得多,但缓冲区缓存并不免费,而且也绝对不是廉价的。每个缓冲区缓存获取都需要缓冲区缓存的多个闩,而闩是串行化设备,会限制应用的扩展能力)IOT适用的场合有: 1、完全由主键组成的表。这样的表如果采用堆组织表,则表本身完全是多余的开销,因为所有的数据全部同样也保存在索引里,此时,堆表是没用的。 2、代码查找表。如果你只会通过一个主键来访问一个表,这个表就非常适合实现为IOT. 3、如果你想保证数据存储在某个位置上,或者希望数据以某种特定的顺序物理存储,IOT就是一种合适的结构。 IOT提供如下的好处: ·提高缓冲区缓存效率,因为给定查询在缓存中需要的块更少。 ·减少缓冲区缓存访问,这会改善可扩缩性。 ·获取数据的工作总量更少,因为获取数据更快。 ·每个查询完成的物理I/O更少。 如果经常在一个主键或唯一键上使用between查询,也是如此。如果数据有序地物理存储,就能提升这些查询的性能。 索引组织表的创建格式如下: createtableindexTable( IDvarchar2(10), NAMEvarchar2(20), constraintpk_idprimarykey(ID) ) organizationindex; 注意两点: ● 创建IOT时,必须要设定主键,否则报错。 ● 索引组织表实际上将所有数据都放入了索引中。 索引组织表属性 1、OVERFLOW子句(行溢出) 因为所有数据都放入索引,所以当表的数据量很大时,会降低索引组织表的查询性能。此时设置溢出段将主键和溢出数据分开来存储以提高效率。溢出段的设置有两种格式: PCTTHRESHOLD n:制定一个数据块的百分比,当行数据占用大小超出时,该行的其他列数据放入溢出段 INCLUDING column_name:指定列之前的列都放入索引块,之后的列都放到溢出段 ● 当行中某字段的数据量无法确定时使用PCTTHRESHOLD。 ● 若所有行均超出PCTTHRESHOLD规定大小,则考虑使用INCLUDING。 createtablet88( IDvarchar2(10), NAMEvarchar2(20), constraintpk_idprimarykey(ID) ) organizationindex PCTTHRESHOLD20 overflowtablespaceusers INCLUDINGname; ● 如上例所示,name及之后的列必然被放入溢出列,而其他列根据PCTTHRESHOLD规则。 2、COMPRESS子句(键压缩) 与普通的索引一样,索引组织表也可以使用COMPRESS子句进行键压缩以消除重复值。 具体的操作是,在organization index之后加上COMPRESSn子句 ● n的意义在于:指定压缩的列数。默认为无穷大。 例如对于数据(1,2,3)、(1,2,4)、(1,2,5)、(1,3,4)、(1,3,5)时 若使用COMPRESS则会将重复出现的(1,2)、(1,3)进行压缩 若使用COMPRESS 1时,只对数据(1)进行压缩 索引组织表的维护 索引组织表可以和普通堆表一样进行INSERT、UPDATE、DELETE、SELECT操作。 可使用ALTER TABLE ... OVERFLOW语句来更改溢出段的属性。 alter tablet88add overflow;--新增一个overflow ● 要ALTER任何OVERVIEW的属性,都必须先定义overflow,若建表时没有可以新增 alter tablet88pctthreshold 15 including name;--调整overflow的参数 alter tablet88initrans 2 overflow initrans 4;--修改数据块和溢出段的initrans特性 ● 关于initrans的概念参考http://space.itpub.net/265709/viewspace-166534 索引组织表的应用 Heap Table 就是一般的表,获取表中的数据是按命中率来得到的。没有明确的先后之分,在进行全表扫描的时候,并不是先插入的数据就先获取。数据的存放也是随机的,当然根据可用空闲的空间来决定。 IOT就是类似一个全是索引的表,表中的所有字段都放在索引上,所以就等于是约定了数据存放的时候是按照严格规定的,在数据插入以前其实就已经确定了其位置,所以不管插入的先后顺序,它在那个物理上的那个位置与插入的先后顺序无关。这样在进行查询的时候就可以少访问很多blocks,但是插入的时候,速度就比普通的表要慢一些。 适用于信息检索、空间和OLAP程序。 索引组织表的适用情况:1、 代码查找表。 2、 经常通过主码访问的表。 3、 构建自己的索引结构。 4、 加强数据的共同定位,要数据按特定顺序物理存储。 5、 经常用between…and…对主码或唯一码进行查询。数据物理上分类查询。如一张订单表,按日期装载数据,想查单个客户不同时期的订货和统计情况。 经常更新的表当然不适合IOT,因为oracle需要不断维护索引,而且由于字段多索引成本就大。 如果不是经常使用主键访问表,就不要使用IOT 索引组织表中的二次索引: 在索引表上建立二次索引(secondary index)访问索引组织表的非主键列或者非主键前缀列的性能将得到提高。 oracle为索引组织表建立的二次索引是建立在逻辑ROWID上面的,什么是逻辑rowid呢?其实就是根据索引组织表的主键生成的rowid,它不是存储位置的实际rowid,oracle能够根据这个逻辑rowid进行 物理推测 找到索引项在索引块中的实际(物理)位置。(捋一下思路:二次索引建立在逻辑rowid上,rowid能推测出数据在索引块的实际位置)这样就能访问索引块了。可以省略通过索引主键来访问的步骤,减少I/O. 但是有一个很明显的问题,就是因为索引组织表的数据行没有固定的物理地址,当索引项被移动到新的物理块时,就还需要再执行主键搜索。 对一个常规表来说,通过间接索引(secondary index)访问表数据意味着先扫描间接索引再获取包含所需数据行的数据块(data block)。而对于索引表(index-organized table)来说,通过间接索引访问表数据的步骤依据是否使用物理推测(physical guess),及物理推测的准确度而有所不同: 如不使用物理推测,数据访问需要两次索引扫描:首先扫描间接索引,再依据其结果扫描主键索引(primary key index)。 如使用物理推测且推测结果准确,数据访问需要首先扫描间接索引,再进行 I/O 操作获取包含所需数据行的数据块。 如使用物理推测且推测结果不准确,数据访问需要首先扫描间接索引,并根据物理推测执行 I/O 操作获取了错误的数据块,之后再进行主键索引扫描。 索引组织表的位图索引: Oracle 支持在分区的(partitioned)或非分区的(nonpartitioned)索引表(index-organized table)上创建位图索引(bitmap index)。为索引表创建位图索引时需要使用一个映射表(mapping table)。 映射表:这个表的存储结构式按照堆组织表存储的,它用来存储索引组织表的逻辑ROWID,具体说来,就是映射表在每一行中存储一个索引组织表的逻辑rowid,这一映射表自己的每一行的物理rowid与索引组织表的逻辑rowid就建立了一一对应的关系。 建立在索引组织表上的位图索引与建立在堆表上的位图索引十分相似,只不过这里索引组织表使用了映射表中的物理rowid,而堆表直接直接使物理rowid与实际数据对应,IOT中间多了一层映射表,每个iot只需一个映射表就把所有的逻辑rowid存储到物理的映射表中。建立在IOT中的上的多个位图可以共用一个映射表。(这里我在想,不管是IOT还是堆组织表,都是根据索引键的值做的位图索引,比如用性别列做索引,有男,女两个位图,搜索的时候不管是IOT还是堆表,都是一样的根据搜索条件去位图置位表里选择,然后堆表直接找到置位对应的物理rowid,IOT通过映射找到逻辑rowid进行访问) 无论是堆表(heap-organized)还是索引表(index-organized),都会使用搜索键(search key)来检索位图索引(bitmap index)。如果在位图索引中找到了符合条件的记录,这个位图索引项(bitmap index entry)将被转换为物理 rowid(physical rowid)。对于堆表,Oracle 将使用此物理 rowid 访问基表(base table)。而对于索引表,Oracle 将使用此物理 rowid 访问映射表(mapping table)得到逻辑 rowid(logical rowid),再通过逻辑 rowid 访问索引表。 索引表(index-organized table)的数据行发生了移动后,不会导致建立在其上的位图索引(bitmap index)失效。数据行移动后会导致使用映射表(mapping table)中某些逻辑 rowid(logical rowid)进行物理推测(physical guess)时不准确。但是索引表仍旧可以通过主键(primary key)访问。 数据段和索引段:http://blog.csdn.net/changyanmanman/article/details/7270361 索引总结:http://blog.csdn.net/changyanmanman/article/details/7337020

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

WebStorm

WebStorm

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

用户登录
用户注册