精华内容
下载资源
问答
  • 当Finder最重要时,将列出最近使用的文件夹。 当使用TextEdit应用程序时,最新的rtf文本文件将被列出。 最新的* .sketch文件将在“草图”应用程序居首时列出。 Xcode应用程序优先时,将列出最新的* .xcodeproj...
  • 这个小终端命令增加了一个有用但隐藏功能:一键式菜单,可直接从扩展坞访问您最近的应用程序和文档。 There are a lot of ways to customize and tweak your Mac’s dock, but while checking out an ...
    mac 快速打开文档目录

    mac 快速打开文档目录

    recent-applications-featured

    You probably have a lot of apps and documents on your Mac, but access a few very frequently. This little terminal command adds a useful, but hidden, feature: a one-click menu to access your recent apps and documents right from your dock.

    Mac上可能有很多应用程序和文档,但访问频率很高。 这个小的终端命令增加了一个有用的但隐藏的功能:一键式菜单,可直接从扩展坞访问您最近的应用程序和文档。

    There are a lot of ways to customize and tweak your Mac’s dock, but while checking out an amazing list of OS X command line prompts, we found a hidden gem. This command adds an icon designed to show you recently closed applications or documents. Yes, macOS offers something like this by default, but it’s buried in the menu bar.

    有很多方法可以自定义和调整Mac的底座 ,但是在查看OS X命令行提示惊人列表时 ,我们发现了一个隐藏的宝石。 此命令添加一个图标,旨在向您显示最近关闭的应用程序或文档。 是的,macOS默认情况下提供了类似的功能,但是它被埋在菜单栏中。

    recents-menu-menubar

    I’m personally way too lazy to use this menu, so if you’re like me, and want to see these lists with a single click, here’s how to add them to your dock.

    我个人太懒了,无法使用此菜单,因此,如果您像我一样,并且想要单击一下即可查看这些列表,这是将它们添加到扩展坞中的方法。

    第一步:使用终端添加功能 (Step One: Add the Feature With Terminal)

    To get started, press Command+Space and type “terminal” to open the Terminal. You can also open a Finder window and head to Applications > Utilities > Terminal. Once you’ve got the Terminal open, you can past this command and hit Enter:

    首先,按Command + Space并键入“ terminal”以打开终端。 您也可以打开Finder窗口并转到“应用程序”>“实用程序”>“终端”。 打开终端后,可以跳过此命令并按Enter:

    defaults write com.apple.dock persistent-others -array-add '{ "tile-data" = {"list-type" = 1; }; "tile-type" = "recents-tile";}' && \killall Dock

    defaults write com.apple.dock persistent-others -array-add '{ "tile-data" = {"list-type" = 1; }; "tile-type" = "recents-tile";}' && \killall Dock

    terminal-command

    That’s a pretty long command, so here’s what it all means:

    这是一个相当长的命令,所以这就是所有的意思:

    • defaults is an Apple-provided program that changes hidden preferences on your Mac.

      defaults是Apple提供的程序,可更改Mac上的隐藏首选项。

    • write tells that program that you’d like to make a change.

      write告诉该程序您要进行更改。

    • com.apple.dock persistent-others refer to the sub-set of settings you’re changing

      com.apple.dock persistent-others是指您要更改的设置的子集

    • -array-add instructs defaults to add an icon to your dock.

      -array-add指示defaults将图标添加到扩展坞。

    • The text after this outlines the kind of icon to add.

      此后的文本概述了要添加的图标的类型。
    • \killall Dock restarts your dock so the settings can apply.

      \killall Dock重新启动您的Dock,以便可以应用设置。

    After you run the command, you’ll see a new stack on your dock:

    运行命令后,您将在扩展坞上看到一个新堆栈:

    recent-applications-dock-mac

    Neat, right? This folder will always show the last five applications you’ve opened recently.

    整洁吧? 该文件夹将始终显示您最近打开的最后五个应用程序。

    第二步:自定义堆栈 (Step Two: Customize Your Stack)

    Right click your new stack and you’ll see some options:

    右键单击新堆栈,您将看到一些选项:

    recent-items-dock-mac

    You can, for example, set this stack to show you recent documents, instead of recent applications:

    例如,您可以设置此堆栈以显示最近的文档,而不是最近的应用程序:

    recent-documents-mac-dock

    You can also set it to show your list of “Favorites” found in Finder, or set the stack to show as a simple list instead of a fan:

    您也可以将其设置为显示在Finder中找到的“收藏夹”列表,或将堆栈设置为简单列表而不是风扇显示:

    mac-dock-favorites-finder

    If you want stacks for all these things, simply run the command above a second, third, forth, and fifth time. You can add as many stacks as you like, then right-click to customize them.

    如果要为所有这些事情使用堆栈,只需在第二,第三,第四和第五次以上运行命令。 您可以根据需要添加任意数量的堆栈,然后右键单击以自定义它们。

    By default, your Mac will show five recent applications or documents in these stacks. If that’s not enough, head to System Preferences > General. You’ll find the option near the bottom of the window.

    默认情况下,您的Mac将在这些堆栈中显示五个最近的应用程序或文档。 如果这还不够,请转到“系统偏好设置”>“常规”。 您会在窗口底部附近找到该选项。

    mac-recent-items

    Turn that up and your stacks will grow even bigger, potentially making them a lot more useful. Enjoy!

    打开它,您的堆栈将变得更大,有可能使它们变得更加有用。 请享用!

    翻译自: https://www.howtogeek.com/273187/quickly-open-recent-apps-and-documents-with-this-hidden-mac-feature/

    mac 快速打开文档目录

    展开全文
  • XAppSearch Quickly App Search use T9 使用T9搜索应用 从右边滑出 显示最近应用 随着用户使用,优化出现app
  • 结果是高质量图像,它使用较少带宽并加载得更。 演示: : 您可以单击任何小图像,或从文件资源管理器或浏览器中拖动图像,然后拖放到“原始”下区域,或将URL复制到剪贴板,然后粘贴到演示页面上。 用法...
  • 使用Spring Boot快速构建应用

    千次阅读 2015-08-06 10:19:12
    最近项目使用Spring Boot做微服务架构,开始学习下Spring Boot 随着Spring 4新版本发布,Spring Boot这个新子项目得到了广泛关注,因为不管是Spring 4官方发布新闻稿还是针对首席架构师Adrian Colyer...

    最近项目使用Spring Boot做微服务架构,开始学习下Spring Boot

    随着Spring 4新版本的发布Spring Boot这个新的子项目得到了广泛的关注,因为不管是Spring 4官方发布的新闻稿还是针对首席架构师Adrian Colyer的专访,都对这个子项目所带来的生产率提升赞誉有加。

    Spring Boot充分利用了JavaConfig的配置模式以及“约定优于配置”的理念,能够极大的简化基于Spring MVC的Web应用和REST服务开发。

    Spring 4倡导微服务的架构,针对这一理念,近来在微博上也有一些有价值的讨论,如这里这里。微服务架构倡导将功能拆分到离散的服务中,独立地进行部署,Spring Boot能够很方便地将应用打包成独立可运行的JAR包,因此在开发模式上很契合这一理念。目前,Spring Boot依然是0.5.0的里程碑版本,因此相关的文档尚不完善,本文将会以一个简单的样例来介绍基于这个项目的开发过程。

    要Spring Boot进行功能开发,需要使用Gradle或者Maven作为构建工具。在本例中,我们会使用Eclipse和Maven插件进行开发。要使用Spring Boot,首先创建一个Maven工程,并修改Maven主要的配置文件pom.xml,如下所示:

    <parent>
           <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>0.5.0.M7</version>
     </parent>
      <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.thymeleaf</groupId>
                <artifactId>thymeleaf-spring3</artifactId>
            </dependency>
        </dependencies>
    
        <properties>
            <start-class>com.levin.Application</start-class>
        </properties>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <repositories>
            <repository>
                <id>spring-milestone</id>
                <url>http://repo.spring.io/libs-milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
        <pluginRepositories>
            <pluginRepository>
                <id>spring-milestone</id>
                <url>http://repo.spring.io/libs-milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    

    在上面的配置中,需要将工程的parent设置为spring-boot-starter-parent,并添加对spring-boot-starter-web的依赖,这样我们就无需设置各个依赖项及其版本信息了。并且在构建中要声明使用spring-boot-maven-plugin这个插件,它会对Maven打包形成的JAR进行二次修改,最终产生符合我们要求的内容结构。

    在我们的应用中将要发布一个REST服务,显示一个基本的用户信息,首先定义一个简单的模型类:

    	
    	package com.levin;
    
    public class Person {
    	private String name;
    	private String email;
    	
    	public Person(String name, String email) {
    		this.name = name;
    		this.email = email;
    	}
    	
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	
    }
    

    接下来,我们需要声明一个Spring MVC的Controller,响应对实体的请求:

    @Controller
    public class ShowPersonController {
        @RequestMapping("/showPerson")
        public @ResponseBody Person showPerson() {
            return new Person("levinzhang","levinzhang1981@gmail.com");
        }
    }
    

    这个类与我们在使用Spring MVC定义Controller时并无任何差别。接下来,我们需要声明一个主类启动这个应用程序:

    @ComponentScan
    @EnableAutoConfiguration
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    这个类的main方法中使用了SpringApplication帮助类,并以Application这个类作为配置来启动Spring的应用上下文。在这个类中使用了ComponentScan以及EnableAutoConfiguration注解,其中ComponentScan注解会告知Spring扫描指定的包来初始化Spring Bean,这能够确保我们声明的Bean能够被发现。EnableAutoConfiguration将会启动自动配置模式,在我们的配置中会将对Tomcat的依赖级联进来,因此在应用启动时将会自动启动一个嵌入式的Tomcat,因为在样例中使用了Spring MVC,所以也会自动注册所需的DispatcherServlet,这都不需要类似web.xml这样的配置。

    在Eclipse中要运行这个应用的话,可以直接以Java Application的形式来运行这个main函数,此时会启动应用,我们在浏览器中可以看到如下的运行效果,这就是我们想要的REST服务:

    在开发调试完成之后,可以将应用打成JAR包的形式,在Eclipse中可以直接使用Maven插件的package命令,最终会形成一个可运行的JAR包。我们使用java –jar命令就可以运行这个JAR包了。所呈现出的效果与在调试期是一样的。现在看一下这个JAR包解压后的目录结构:

    这个JAR包与传统JAR包的不同之处在于里面有一个名为lib的目录,在这个目录中包含了这个简单应用所依赖的其他JAR包,其中也包含内置的嵌入式Tomcat,正是使用它,才能发布服务和访问Web资源。除了我们编写的源码所编译形成的CLASS以外,在org目录下还有许多Spring所提供的CLASS,正是依赖这些CLASS,才能够加载位于lib目录下JAR中的类。这样的加载机制与在OSGi bundle中声明Bundle-Classpath很类似,不过在OSGi中会由容器来负责加载指定路径下的类。这大致阐述了这样一个JAR包能够发布服务的原因。

    如果我们想要使用HTML、JSP等Web资源的话,在Controller中直接返回对应的视图就可以了。

    如果我们想要将这个JAR包转换成可以在Servlet容器中部署的WAR的话,就不能依赖于Application的main函数了,而是要以类似于web.xml文件配置的方式来启动Spring应用上下文,此时我们需要声明这样一个类:

    public class HelloWebXml extends SpringBootServletInitializer {
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(Application.class);
        }
    
    }
    

    这个类的作用与在web.xml中配置负责初始化Spring应用上下文的监听器作用类似,只不过在这里不需要编写额外的XML文件了。

    如果要将最终的打包形式改为WAR的话,还需要对pom.xml文件进行修改,除了需要将packaging的值修改为war以外,还需要对依赖进行适当的配置(这一部分在Spring Boot的样例和文档中均未提及,提醒大家注意):

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId> 
               <exclusions>
               	<exclusion>
               		<groupId>org.springframework.boot</groupId>
            		<artifactId>spring-boot-starter-tomcat</artifactId>
               	</exclusion>
               </exclusions> 
    </dependency>
    

    在这里需要移除对嵌入式Tomcat的依赖,这样打出的WAR包中,在lib目录下才不会包含Tomcat相关的JAR包,否则将会出现启动错误。另外,在移除对Tomcat的依赖后,为了保证编译正确,还需要添加对servlet-api的依赖,因此添加如下的配置:

    		
    <dependency>
            	<groupId>org.apache.tomcat</groupId>
            	<artifactId>tomcat-servlet-api</artifactId>
            	<version>7.0.42</version>
            	<scope>provided</scope>
    </dependency>
    

    在这里将scope属性设置为provided,这样在最终形成的WAR中不会包含这个JAR包,因为Tomcat或Jetty等服务器在运行时将会提供相关的API类。此时,执行mvn package命令就会得到一个WAR文件,我们可以直接将其放到Tomcat下运行(需要7.0.42版本以上)。

    以上介绍了基于Spring Boot开发应用的过程,目前它的文档尚不完善,但是在GitHub上有不少的样例,包括与Spring Data集成访问数据库(关系型以及非关系型)、安全、WebSocket等,读者感兴趣可以下载运行,需要注意的是有些样例中使用的是0.5.0.M6版本,这个版本有问题,运行时会出错,建议手动修改为0.5.0.M7或快照版本。

    基于以上的介绍,希望读者能够对Spring Boot这个新项目有所了解。它简化了JAR包管理和相关基础设施环境的配置,能够帮助我们快速开发Web应用或构建REST服务,希望它能够尽快完善成熟,更多地用于实践,提升开发效率。

    参考资料

    http://projects.spring.io/spring-boot/

    http://projects.spring.io/spring-boot/docs/README.html

    http://spring.io/guides/gs/spring-boot/

    http://spring.io/guides/gs/actuator-service/

    http://spring.io/guides/gs/convert-jar-to-war/


    展开全文
  • 这篇文章讲述了如何快速构建一个vue程序...我最近研究了一些公用API,发现有很多很酷东西可以用在这些获取到数据上。 我将演示如何构建一个简单新闻app,它将显示当天热门新闻,还允许用户通过感兴趣类别...
        

    这篇文章讲述了如何快速构建一个vue程序,并使用axios从远程获取数据。
    这是原文章的直通门

    通常情况下,在构建JavaScript应用程序时,会从远程获取数据或使用API。我最近研究了一些公用API,发现有很多很酷的东西可以用在这些获取到的数据上。

    我将演示如何构建一个简单的新闻app,它将显示当天的热门新闻,还允许用户通过感兴趣的类别进行过滤。我们将从纽约时报API获取数据。可以在这里找到本教程的完整代码。

    下面是最终app的效果:
    图片描述

    要使用本教程,你将需要了解基本的Vue.js知识。这是一个vue教程直达。教程将使用ES6语法。

    项目结构

    我们将只用2个文件来保持项目简洁:

    ./app.js
    ./index.html

    app.js包含整个app的逻辑,index.html包含整个app的界面。

    我们从index.html开始:

    <!DOCTYPE html>
    <html lang='en'>
        <head>
            <meta charset="utf-8">
            <title>最伟大的新闻app</title>
        </head>
        <body>
            <div class="container" id="app">
                <h3 class="text-center">Vue新闻</h3>
            </div>
        </body>
    </html>

    然后,在index.html的底部,在</body>标签之前,引入Vue.jsapp.js

    <script src="https://unpkg.com/vue"></script>
    <script src="app.js"></script>

    可选地,可以引入Foundation,以利用一些预制样式,使我们的界面看起来更好一点。 将其包含在<head>标签中:

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.3.1/css/foundation.min.css">

    创建一个简单Vue应用程序

    首先,我们将在元素div#app上创建一个新的Vue实例,并使用一些测试数据来模拟新闻API的响应:

    // ./app.js
    const vm = new Vue({
        el: '#app',
        data: {
            results: [
                {title: '第一条新闻', abstract: '我是第一条新闻'},
                {title: '接着是第二条', abstract: '我是第二条新闻'},
                {title: '然后是第三条', abstract: '我是第三条新闻'},
                {title: '我是最后一条了', abstract: '我是第四条新闻'}
            ]
        }
    });

    我们通过el参数告诉Vue要挂载的元素,并通过data参数指定我们的app将使用哪些数据。

    要在我们的应用程序中显示模拟数据,可以在#app元素中写入:

    <!-- ./index.html -->
    <div class="columns medium-3" v-for="result in results">
        <div class="card">
            <div class="card-divider">
                {{ result.title }}
            </div>
            <div class="card-section">
                <p>{{ result.abstract }}.</p>
            </div>
        </div>
    </div>

    v-for指令用于渲染我们的列表。我们还使用双花括号来显示每一个result的内容。

    我们现在有一个基本的布局结构了:
    图片描述

    从API获取数据

    要使用纽约时报API,需要获得一个API密钥。所以如果你没有的话,点击这里,注册以获取Top Stories API的API密钥(注册时API一栏选择Top Stories API)。

    使用Ajax请求和处理响应

    Axios是一个基于promise的HTTP客户端,用于发送Ajax请求。它提供了简单而丰富的API。它与fetch API非常相似,但不需要为旧版浏览器添加一个polyfill,还有一些其他的细微之处。

    引入axios:

    <!-- ./index.html -->
    <script src="https://cdn.bootcss.com/axios/0.16.0/axios.min.js"></script>

    现在,一旦我们的Vue应用程序挂载(mounted),我们就发送请求获取top stories的列表:

    // ./app.js
    const vm = new Vue({
        el: '#app',
        data: {
            results: []
        },
        mounted() {
            axios.get("https://api.nytimes.com/svc/topstories/v2/home.json?api-key=your_api_key")
            .then(response => {
                this.results = response.data.resultes})
        }
    });

    注意:将your_api_key替换为之前注册获得的API key。

    现在我们可以在我们的主页上看到新闻列表。不要担心不美观的界面,我们会在后面处理:
    图片描述

    通过Vue Devtools来看看API的响应:
    图片描述

    为了使我们的项目更加整洁,可复用,我们将做一些小的重构,并介绍一个帮助函数来构建我们的URL。 我们还将注册getPosts作为我们应用程序的一个方法((将其添加到vue对象的method参数中):

    // ./app.js
    const NYTBaseUrl = "https://api.nytimes.com/svc/topstories/v2/";
    const Apikey = "your_api_key";
    
    function buildUrl(url) {
        return NYTBaseUrl + url + ".json?api-key=" + Apikey;
    }
    
    const vm = new Vue ({
        el: '#app',
        data: {
            results: []
        },
        mounted () {
            this.getPosts('home');
        },
        methods: {
            getPosts(section) {
                let url = buildUrl(section);
                axios.get(url).then((response) => {
                    this.results = response.data.results;
                }).catch(error => {
                    console.log(error);
                });
            }
        }
    });

    我们可以通过引入计算属性(computed property)对API获得的原始结果进行一些修改,从而对我们的视图的外观进行一些更改。

    const vm = new Vue ({
        el: '#app',
        data: {
            results: []
        },
        mounted () {
            this.getPosts('home');
        },
        methods: {
            getPosts(section) {
                let url = buildUrl(section);
                axios.get(url).then((response) => {
                    this.results = response.data.results;
                }).catch(error => {
                    console.log(error);
                });
            }
        },
        computed: {
            processedPosts() {
                let posts = this.results;
                
                //添加image_url属性
                posts.map(post => {
                    let imgObj = post.multimedia.find(media => media.format === "superJumbo");
                    post.image_url = imgObj ? imgObj.url : "http://placehold.it/300x200?text=N/A";
                });
                
                //将数据分组
                let i, j, chunkedArray = [], chunk = 4;
                for (i = 0, j = 0; i < posts.length; i += chunk, j++) {
                    chunkedArray[j] = posts.slice(i, i + chunk);
                }
                return chunkedArray;
            }
        }
    });

    在上述代码中,在计算属性processedPosts中,我们附加一个image_url属性给每个新闻对象:
    我们通过循环遍历API的results,并通过在multimedia数组中对单个元素搜索来查找所需格式的媒体,然后将该媒体的URL赋值给image_url属性。在媒体不可用的情况下,我们将默认图片地址设置为来自Placehold.it的图像。

    我们还写了一个循环来将我们的results数组分为四个一组,这将会处理我们前面看到的不美观界面。

    Note: 你也可以使用像Lodash这样的库进行分块。

    计算属性非常适合操纵数据。每当我们需要将results数组分组时,我们可以将它定义为一个计算属性,按照我们的意愿使用它,因为Vue会在results改动时自动更新processedPosts

    计算属性也基于它们的依赖关系进行缓存,因此只要results不改变,processedPosts属性将返回自身的缓存值。这将有助于性能,特别是在进行复杂的数据操作时。

    接下来,我们在index.html中修改我们的html标签,以显示我们的计算结果:

    <!-- ./index.html -->
    <div class="row" v-for="posts in processedPosts">
        <div class="columns large-3 medium-6" v-for="post in posts">
            <div class="card">
                <div class="card-divider">
                    {{ post.title }}
                </div>
                <a :href="post.url" target="_blank">
                    <img :src="post.image_url">
                </a>
                <div class="card-section">
                    <p>{{ post.abstract }}</p>
                </div>
            </div>
        </div>
    </div>

    现在我们的app看起来美观一些了:
    图片描述

    新闻列表组件

    组件用于将应用程序模块化。“新闻列表”可以重构为一个组件,例如,如果我们的app成长起来,并且决定在别的地方也使用新闻列表,组件将会使这变得很容易。

    // ./app.js
    Vue.component('news-list', {
        props: ['results'],
        template: `
            <section>
                <div class="row" v-for="posts in processedPosts">
                    <div class="columns large-3 medium-6" v-for="post in posts">
                        <div class="card">
                            <div class="card-divider">
                            {{ post.title }}
                            </div>
                            <a :href="post.url" target="_blank"><img :src="post.image_url"></a>
                            <div class="card-section">
                                <p>{{ post.abstract }}</p>
                            </div>
                        </div>
                    </div>
                </div>
            </section>
        `,
        computed: {
            processedPosts() {
                //...
            }
        }
    });

    在上面的代码中,我们注册了一个全局组件:
    Vue.component(tagName,options)。建议在定义tagName时使用连字符,这样它们不会与标准HTML标签发生冲突。

    我们来简单看一下其他几个参数:

    • props:这是一个我们希望从父作用域传递给组件的数组。 我们传递了results,因为我们从主应用程序实例加载组件。

    • template:在这里我们定义新闻列表的html。注意,我们将列表包装在<section>标签中。这是因为组件需要有一个单独的根元素,而不是多个元素。

    调整我们的html代码以使用我们的新闻列表组件,并传递results数据:

    <!-- ./index.html -->
    <div class="container" id="app">
        <h3 class="text-center">Vue新闻</h3>
        <news-list :results="results"></news-list>
    </div>

    注意:组件也可以创建为单个文件(.vue文件),然后由构建工具(如webpack)解析。虽然这超出了本教程的范围,但建议用于更大或更复杂的应用程序。

    实现类别过滤

    为了使我们的应用程序更加丰富,我们现在可以引入类别过滤器,以允许用户仅显示某些类别的新闻。

    首先,我们注册现在应用程序里展示的以及即将会展示的类别列表:

    const SECTIONS = "home, arts, automobiles, books, business, fashion, food, health, insider, magazine, movies, national, nyregion, obituaries, opinion, politics, realestate, science, sports, sundayreview, technology, theater, tmagazine, travel, upshot, world";
    
    const vm = new Vue({
        el: '#app',
        data: {
            results: [],
            //设置展示的类别数组
            sections: SECTIONS.split(', '),
            //设置默认的展示类别
            section: 'home',
        },
        mounted () {
            this.getPosts(this.section);
        },
        //...
    });

    接下来,我们在div#app容器中添加:

    <!-- ./index.html -->
    <section class="callout secondary">
        <h5 class="text-center">分类</h5>
        <form>
            <div class="row">
                <div class="large-6 columns">
                    <select v-model="section">
                        <option v-for="section in sections" :value="section">
                            {{ section }}
                        </option>
                    </select>
                </div>
                <div class="medium-6 columns">
                    <a @click="getPosts(section)" class="button expanded">我要看新闻</a>
                </div>
            </div>
        </form>
    </section>

    当单击“我要看新闻”按钮时,触发所选分类的getPosts方法。

    最终demo

    我决定添加一些小的(可选的)交互,使应用程序体验更好一些,如引入加载图像。

    可以看看如下效果:
    https://codepen.io/mengmengpr...

    也可以在此处查看实时版本。

    结尾

    在本教程中,我们已经学会了如何从头开始创建一个Vue.js项目,如何使用axios从API获取数据,以及如何使用组件和计算属性去处理数据。

    现在我们有一个功能齐全的基于API服务构建的Vue.js 2.0应用程序。通过引入其他API可以进行大量的改进。例如,我们可以:

    • 使用Buffer API从分类中自动排列社交媒体。

    • 使用Pocket API标记文章稍后阅读。

    • 等等

    该项目的整个代码也托管在Github上,因此你可以克隆,运行并进行改进。

    这篇文章对于vue初学者是一个不错的教程,它讲述了如何快速的搭建起一个vue应用程序,其他详细的vue特性,可以去官网学习之后基于本项目进行改进。

    展开全文
  • Android L 上,长按Home键可以显示最近使用的应用,以便用户可以快速回到之前使用的应用。 现在项目需要用程序把栈信息清空=_= 下面是实现过程,分析源码的实现过程: @Override public boolean onKeyDown(int ...

    Android L 上,长按Home键可以显示最近使用的应用,以便用户可以快速回到之前使用的应用。

    现在项目需要用程序把栈信息清空=_=

    下面是实现过程,分析源码的实现过程:

       @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
    
            final boolean handled = super.onKeyDown(keyCode, event);
    
            if (keyCode==KeyEvent.KEYCODE_ENTER && event.isLongPress()) {
                    // index is reverse since most recent appears at the bottom...
                    int taskSize = mRecentTaskDescriptions.size();
    
                    for(int ii=0;ii<taskSize;ii++){
                            TaskDescription ad = mRecentTaskDescriptions.get(0);
                            if (ad == null) {
                                    return true;
                            }
    
                            mRecentTaskDescriptions.remove(ad);
                            mRecentTasksLoader.remove(ad);
    
                            // Handled by widget containers to enable LayoutTransitions properly
                            // mListAdapter.notifyDataSetChanged();
    
                            if (mRecentTaskDescriptions.size() == 0) {
                                dismissAndGoBack();
                            }
    
                            // Currently, either direction means the same thing, so ignore direction and remove
                            // the task.
                            final ActivityManager am = (ActivityManager)
                                    mContext.getSystemService(Context.ACTIVITY_SERVICE);
                            if (am != null) {
                                am.removeTask(ad.persistentTaskId, ActivityManager.REMOVE_TASK_KILL_PROCESS);
    
                                // Accessibility feedback
                                setContentDescription(
                                        mContext.getString(R.string.accessibility_recents_item_dismissed, ad.getLabel()));
                                sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED);
                                setContentDescription(null);
                            }
                    }
                    return true;
            }
            return handled;
        }





    源码应用到了ActivityManager的removeTask()方法来清除,获取是应用RecentTask类。

    在网上找了下资料,资料不多,找到一篇很有用http://blog.csdn.net/yanbin1079415046/article/details/8026613,谢谢作者。

    他分析了系统的处理过程,并模拟系统给出了一个获取历史栈的方法。

    		// 得到包管理器和activity管理器
    		final Context context = this;
    		final PackageManager pm = context.getPackageManager();
    		final ActivityManager am = (ActivityManager) context
    				.getSystemService(Context.ACTIVITY_SERVICE);
    		// 从ActivityManager中取出用户最近launch过的 MAX_RECENT_TASKS + 1 个,以从早到晚的时间排序,
    		// 注意这个 0x0002,它的值在launcher中是用ActivityManager.RECENT_IGNORE_UNAVAILABLE
    		// 但是这是一个隐藏域,因此我把它的值直接拷贝到这里
    		final List<ActivityManager.RecentTaskInfo> recentTasks = am
    				.getRecentTasks(MAX_RECENT_TASKS + 1, 0x0002);
    
    		// 这个activity的信息是我们的launcher
    		ActivityInfo homeInfo = new Intent(Intent.ACTION_MAIN).addCategory(
    				Intent.CATEGORY_HOME).resolveActivityInfo(pm, 0);
    		int numTasks = recentTasks.size();
    		for (int i = 0; i < numTasks && (i < MAX_RECENT_TASKS); i++) {
    			HashMap<String, Object> singleAppInfo = new HashMap<String, Object>();// 当个启动过的应用程序的信息
    			final ActivityManager.RecentTaskInfo info = recentTasks.get(i);
    
    			Intent intent = new Intent(info.baseIntent);
    			Log.e("", "###" + info.persistentId);
    			appIds.add(info.persistentId);
    			if (info.origActivity != null) {
    				intent.setComponent(info.origActivity);
    			}
    			// TODO 测试用,无意义代码
    			String currentInfo = "PackageName=="
    					+ intent.getComponent().getPackageName() + ",ClassName=="
    					+ intent.getComponent().getClassName();
    			/**
    			 * 如果找到是launcher,直接continue,后面的appInfos.add操作就不会发生了
    			 */
    			if (homeInfo != null) {
    				if (homeInfo.packageName.equals(intent.getComponent()
    						.getPackageName())
    						&& homeInfo.name.equals(intent.getComponent()
    								.getClassName())) {
    					MAX_RECENT_TASKS = MAX_RECENT_TASKS + 1;
    					continue;
    				}
    			}
    
    			// 设置intent的启动方式为 创建新task()【并不一定会创建】
    			intent.setFlags((intent.getFlags() & ~Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
    					| Intent.FLAG_ACTIVITY_NEW_TASK);
    			// 获取指定应用程序activity的信息(按我的理解是:某一个应用程序的最后一个在前台出现过的activity。)
    			final ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
    			if (resolveInfo != null) {
    				final ActivityInfo activityInfo = resolveInfo.activityInfo;
    				final String title = activityInfo.loadLabel(pm).toString();
    				Drawable icon = activityInfo.loadIcon(pm);
    				if (title != null && title.length() > 0 && icon != null) {
    					singleAppInfo.put("title", title);
    					singleAppInfo.put("icon", icon);
    					singleAppInfo.put("tag", intent);
    				}
    			}
    			appInfos.add(singleAppInfo);
    		}
    		MAX_RECENT_TASKS = repeatCount;
    		for (HashMap<String, Object> map : appInfos) {
    			Log.e("", "@" + map.get("title"));
    		}
    	

    (1)通过Activity的getRecentTasks方法获取近来历史栈的信息。

    (2)根据ActivityManager.RecentTaskInfo 获取对应Activity以及对应的应用信息。



    接下来是如何清除的问题。

    阅读ActivityManager源码,am.removeTask(ad.persistentTaskId, ActivityManager.REMOVE_TASK_KILL_PROCESS);

    是一个系统隐藏方法,所以我们通过反射调用这个方法。

    需要传入两个字段。

    第一个字段:可以通过getRecentTasks获取

    第二个字段:ActivityManager.REMOVE_TASK_KILL_PROCESS是个隐藏字段,直接把值从源码中读出传入。

    	private void removeTasks() {
    		
    		ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    		
    		Class<ActivityManager> clazz = ActivityManager.class;
    		Method method;
    		for (int id : appIds) {
    			try {
    				method = clazz.getDeclaredMethod("removeTask", int.class,
    						int.class);
    				method.setAccessible(true);
    				try {
    					method.invoke(am, id, 0x0001);
    				} catch (IllegalAccessException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (IllegalArgumentException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (InvocationTargetException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			} catch (NoSuchMethodException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    
    	}

    perfect!测试会出现异常:没有remove_Tasks权限。

    这个权限需要系统级别的权限才能实现。

    因而manifest.xml里配置如下:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.gi.test"
        android:versionCode="1"
        android:versionName="1.0"
        android:sharedUserId="android.uid.system" >
    
        <uses-permission android:name="android.permission.GET_TASKS" />
        <uses-permission android:name="android.permission.REMOVE_TASKS" />

    设置sharedUserId=Android.uid.system

    并设置权限需要的权限

    然后将它和目标系统共同编译,并放到系统分区,这样就有了系统权限,就可以运行了。本方法只适用于定制。如果想要做一个app在普通的设备上实现这个功能,恐怕就不行了,主要是remove_Tasks这个系统级别权限的问题。








    展开全文
  • 使用Ray进行调试以更地解决问题 可以将该软件包安装在Laravel应用程序中,以将消息发送到。 文献资料 您可以在上找到完整文档。 测验 composer test 变更日志 有关最近更改更多信息,请参阅 。 贡献 请参阅。...
  • rd 是一种用于在不同应用程序中最近使用的目录之间快速导航的工具。 rd 持续监视活动进程的当前目录并维护一个经常使用的数据库。 这使它能够自动了解您在不同应用程序中经常/最近使用的目录 - 有点像 Firefox/...
  • 使用Ray进行调试以更地解决问题 该软件包可以安装在Yii2应用程序中,以将消息发送到。 文献资料 您可以在上找到完整文档。 测验 composer test 变更日志 有关最近更改更多信息,请参阅 。 贡献 请参阅。 安全...
  • 我通过各种途径,终于联系到了华为快应用技术人员,得知他们有自己的快应用开发工具和应用加载器,调试的话需要使用华为的快应用加载器! 这就意味着开发一套快应用:开发工具要用两个,调试器也得两个。一个是快...
  • 最近使用快应用做IM相关开发,与后端使用时遇到了使用 protobuf 问题,顺便介绍下Protobuf 之快应用接入教程和踩过坑。 问题 **主要有2点: ** 前端常用protobufjs集成进快应用时会遇到XMLHTTPRequest ...
  • 初学快应用

    2018-11-02 16:31:20
    1、似乎只要用到document的外部模块都不可以用,在快应用中,获得某个dom元素使用的是this.$element(),然而如果引用外部的js库什么的,里面含有document.什么的就会报错,所以只能自己用原生js来实现相关的功能。 ...
  • APP 简介公司使用的请假及写周报系统一直都是网页版的,之前我们也有想过出一个移动端版本,但因为一些原因没有付诸行动。刚好最近 LeanCloud 新发布了 Flutter SDK,就决...
  • 在大多数情况下,存储桶只是向量列表,它是这些应用程序中使用的术语。 这对于查找查询向量的最近邻居没有任何用处。 因此,此机制的“秘密”是使用所谓的位置敏感哈希LSH。 这些散列考虑了空间性,因此它们倾向
  • 有关最近更改更多信息,请参阅 。 贡献 请参阅。 安全漏洞 请查看以了解如何报告安全漏洞。 维护人员发布说明 更新spatie /射线composer.json与包最高版本号 用新发行版号更新readme.txt和wp-ray 运行rm -rf ...
  • kNN搜索处理时间在许多应用领域,尤其是在高维空间中,仍然是瓶颈。 在这项工作中,我们尝试通过使用GPU执行kNN搜索来解决此处理时间问题。 作者 文森特·加西亚(Vincent Garcia) 埃里克·德布鲁夫(É...
  • 在以往Web服务Docker镜像构建主要包含以下一个主要步骤: 1.拉取基本镜像; 2.将所拉取镜像形成容器;...整体步骤比较麻烦,最近google开源了一个镜像构建工具Jib(https://github.com/Goog...
  • 很多mac的应用都有最近打开文件一个窗口功能,这款Recents for mac将这些软件全部整合到了一起,如果你想打开最近开启过文件可以试试使用这款软件快速打开。 recents是专为Mac设计文件启动器。它将您最近的...
  • 在Microsoft Office 2010中,进一步加强了该功能,可以通过快速访问工具栏更地访问最近使用的文档列表和最近的位置,还可以轻松地将常用文档列表定制在后台视图的导航栏中,以便更直观、更快速地访问。 (1)启动...
  • TensorFlow是开发深度学习算法主流框架,近来随着keras和pytorch等框架崛起,它受到了不小挑战,为了应对竞争它本身也在进化,最近新出2.0版本使得框架的应用更加简易和容易上手,本节我们就如何使用它2.0版本...
  • 最近在本地做开发,使用到了nacos,每次用时候,都需要去指定目录下运行bat文件,太麻烦了,所以想找一个类似于mac上alias功能,通过在cmd运行一个别名就可以启动和停用nacos。 在windows下一些软件快速...
  • 原文地址:关于最近很火用苹果助手”和“pp助手”使用正版软件闪退问题说明  怕谁谁说我是忽悠骗人,我先说在前面,以下内容均为推测,纯属推测,好吧,至少我认为推测很有逻辑。    IOS6出来后...
  • nQuant.android 一种基于快速成对最近邻算法的端口,可在Android上使用... 如果您使用的是Java,则可以按以下方式调用nQuant: try { PnnQuantizer pnnQuantizer = new PnnLABQuantizer(filePath); return pnnQuant
  • 快应用UI组件整理

    千次阅读 2019-01-30 15:50:01
    最近,在学习快应用开发东西,感受到快应用还是有很多好处理,例如性能接近原生APP能力、具有很多APP原生能力,页面简介清爽同时开发简单,使用体验也不错。刚开始找了几个demo练手,也在尝试写一个简单应用,...
  • 最近在测试嵌入式开发板时遇到指令记录如下: 1.查看网关:(显示/控制IP路由表) route -n:显示数值地址而不是试图确定象征性主机名。 这是有用,如果你试图确定为什么路线命名服务器已经消失了。 加-n参数会比...
  • 最近有需求获取快应用的摘要值,但是发现快应用规范并未提供相关接口。有幸是,经过一番搜索,我发现可以使用第三方库crypto-js获取,以下对获取方式进行分享。 安装依赖 检查快应用项目目录下是否已经有第三方...
  • Docker 开箱即用功能,给运维带来极大便利,公司线上环境也大量地使用了 Docker,弹性计算思想应用得淋漓尽致。 最近只要是涉及服务器环境安装操作(如安装 MySQL、ElasticSearch…),笔者都会下意思地先...
  • 最近很多人在问快应用到底在哪里能看到,具体支持哪些机型,这里为大家总结了目前各大厂商目前支持手机机型,后续会持续更新哦~机型覆盖序号厂商快应用支持机型1华为使用华为应用市场8.0.3以上版本支持2金立...
  • 使用LoopBack快速开发支持CRUDweb应用简介缘起LoopBack简介开发环境准备Node JSExpressLoopBackMySQL开发记录项目设计开发步骤生成APP读取数据库schema 生成model生成repository生成controller编译运行添加友善...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,048
精华内容 819
关键字:

最近使用的快应用