转自 静心梦工厂


[转]Android开源git40个App源码

Android开源git40个App源码

 
  • (F8)日程安排的软件
 
 
  • (Bitocle)可以在手机上查看自己github上的项目
 
  • (Amphitheatre)Android TV应用,数据来源于TMDb,没看运行效果,但感觉有JakeWharton参与的项目都是很棒的  

  • (ijiami.cn)app源码保护
 
 
  • (Iosched)为Google I/O提供的官方项目
 
 
  • (Flock)提供同步服务
 
 
 
  • (Photup)批量上传照片到facebook
  • (Philm)查看电影信息
  • (Standup-Timer)一个类似倒计时的应用,例如提醒,控制自己的演讲时间。
  • (muzei)定时更换壁纸的应用
  • (K-9)邮件客户端
 
               (ijiami.cn)app源码保护

作者:andyliulin 发表于 2018/03/04 17:11:39  原文链接 https://blog.csdn.net/andyliulin/article/details/79436865
阅读:111
 
[转]使用PowerDesinger将mysql中的数据库逆向生成为PDM文件 转载 2017年02月04日 12:44:11 1574 Part 1 PowerDesigner连接mysql逆向生成pd

使用PowerDesinger将mysql(oracle、sqlServer)中的数据库逆向生成为PDM文件

Part 1 

PowerDesigner连接mysql逆向生成pdm

转自:http://www.cnblogs.com/dennyzhangdd/p/5550868.html

常用的建模工具有:PowerDesigner和ERWin,后者已快被淘汰,但前者依然活跃。相信大家都遇到过项目组已经运营很很久,但是竟然连一个ER图都没有,今天就讲解一下PowerDesigner连接mysql逆向生成pdm。PS:网络上各种老版本,各种文不对题,按照本文去做,10分钟即可搞定,就是这么简单。

假设大家已经安装好PowerDesigner,本人使用版本号15.1破解汉化版。

1.安装mysql-connector-odbc-5.1.5-win32.msi这个是驱动必须安装,大概4M,百度搜即可。


2.打开powerdesigner,文件-》reverse engineer--》database   model name 自定义--》

选择dbms为mysql 5.0 --》using a据源点击图中


红圈,                       点击configure ,

                  点击红圈,添加新数据源。

                  ,下一步选择第一步安装的驱动,

                     下一步,确定。

 

                  

,填写相关数据,上面两行随便写,下面4行就是连接数据库的必须字段。点击OK,跳转到

               

下拉框选定刚配置好的数据源,点击connect,

                   

,点击确定筛选要导出的表(<All users>下拉筛选)--》OK 即可生成PDM。
注意:如果pdm需要注释(comment),那么mysql中要事先填写好才行。


Part 2

PowerDesigner 把Comment写到name中 和把name写到Comment中 pd7以后版本可用

转自:http://www.cnblogs.com/cxd4321/archive/2009/03/07/1405475.html

在使用PowerDesigner对数据库进行概念模型和物理模型设计时,一般在NAME或Comment中写中文,在Code中写英文。Name用来显 示,Code在代码中使用,但Comment中的文字会保存到数据库Table或Column的Comment中,当Name已经存在的时候,再写一次 Comment很麻烦,可以使用以下代码来解决这个问题:

  • 代码一:将Name中的字符COPY至Comment中

    Option   Explicit 
    ValidationMode   =   True 
    InteractiveMode   =   im_Batch

    Dim   mdl   '   the   current   model

    '   get   the   current   active   model 
    Set   mdl   =   ActiveModel 
    If   (mdl   Is   Nothing)   Then 
          MsgBox   "There   is   no   current   Model " 
    ElseIf   Not   mdl.IsKindOf(PdPDM.cls_Model)   Then 
          MsgBox   "The   current   model   is   not   an   Physical   Data   model. " 
    Else 
          ProcessFolder   mdl 
    End   If

    '   This   routine   copy   name   into   comment   for   each   table,   each   column   and   each   view 
    '   of   the   current   folder 
    Private   sub   ProcessFolder(folder) 
          Dim   Tab   'running     table 
          for   each   Tab   in   folder.tables 
                if   not   tab.isShortcut   then 
                      tab.comment   =   tab.name 
                      Dim   col   '   running   column 
                      for   each   col   in   tab.columns 
                            col.comment=   col.name 
                      next 
                end   if 
          next

          Dim   view   'running   view 
          for   each   view   in   folder.Views 
                if   not   view.isShortcut   then 
                      view.comment   =   view.name 
                end   if 
          next

          '   go   into   the   sub-packages 
          Dim   f   '   running   folder 
          For   Each   f   In   folder.Packages 
                if   not   f.IsShortcut   then 
                      ProcessFolder   f 
                end   if 
          Next 
    end   sub

--------------------------------------------

         另外在使用REVERSE ENGINEER从数据库反向生成PDM的时候,PDM中的表的NAME和CODE事实上都是CODE,为了把NAME替换为数据库中Table或Column的中文Comment,可以使用以下脚本:

  • 代码二:将Comment中的字符COPY至Name中


    Option   Explicit 
    ValidationMode   =   True 
    InteractiveMode   =   im_Batch

    Dim   mdl   '   the   current   model

    '   get   the   current   active   model 
    Set   mdl   =   ActiveModel 
    If   (mdl   Is   Nothing)   Then 
          MsgBox   "There   is   no   current   Model " 
    ElseIf   Not   mdl.IsKindOf(PdPDM.cls_Model)   Then 
          MsgBox   "The   current   model   is   not   an   Physical   Data   model. " 
    Else 
          ProcessFolder   mdl 
    End   If

    Private   sub   ProcessFolder(folder) 
    On Error Resume Next
          Dim   Tab   'running     table 
          for   each   Tab   in   folder.tables 
                if   not   tab.isShortcut   then 
                      tab.name   =   tab.comment
                      Dim   col   '   running   column 
                      for   each   col   in   tab.columns 
                      if col.comment="" then
                      else
                            col.name=   col.comment 
                      end if
                      next 
                end   if 
          next

          Dim   view   'running   view 
          for   each   view   in   folder.Views 
                if   not   view.isShortcut   then 
                      view.name   =   view.comment 
                end   if 
          next

          '   go   into   the   sub-packages 
          Dim   f   '   running   folder 
          For   Each   f   In   folder.Packages 
                if   not   f.IsShortcut   then 
                      ProcessFolder   f 
                end   if 
          Next 
    end   sub

-----------------------------------------------------------------------

以上两段代码都是VB脚本,在PowerDesigner中使用方法为:

    PowerDesigner->Tools->Execute Commands->Edit/Run Scripts

将代码Copy进去执行就可以了,是对整个CDM或PDM进行操作



Part 3

个人备注

直接使用 Part2 中的代码二:将Comment中的字符COPY至Name中 时,表名也会变成中文名,如果要保持表名为英文名则需要

删去 tab.name   =   tab.comment 以及 view.name   =   view.comment 这两行代码。

作者:andyliulin 发表于 2018/01/25 12:22:06  原文链接 https://blog.csdn.net/andyliulin/article/details/79160309
阅读:64
 
[译]让PIP源使用国内镜像,提升下载速度和安装成功率

让PIP源使用国内镜像,提升下载速度和安装成功率。

对于Python开发用户来讲,PIP安装软件包是家常便饭。但国外的源下载速度实在太慢,浪费时间。而且经常出现下载后安装出错问题。所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成功率。

国内源:

新版ubuntu要求使用https源,要注意。

清华:https://pypi.tuna.tsinghua.edu.cn/simple

阿里云:http://mirrors.aliyun.com/pypi/simple/

中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

华中理工大学:http://pypi.hustunique.com/

山东理工大学:http://pypi.sdutlinux.org/ 

豆瓣:http://pypi.douban.com/simple/

临时使用:

可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple

例如:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspider,这样就会从清华这边的镜像去安装pyspider库。
 

永久修改,一劳永逸:

Linux下,修改 ~/.pip/pip.conf (没有就创建一个文件夹及文件。文件夹要加“.”,表示是隐藏文件夹)

内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com

windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini。内容同上。

记录自己、分享公众、成就别人
作者:andyliulin 发表于 2018/01/02 16:48:00  原文链接 https://blog.csdn.net/andyliulin/article/details/78953325
阅读:176
 
[转]Spring Boot 中使用 Dubbo 详解

Spring Boot 中使用 Dubbo 详解

Dubbo 简介

Dubbo 是什么?

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架

其核心部分包含:

1.远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2.集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3.自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

Dubbo 能做什么?

1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3.服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

Dubbo 的架构

架构图架构图

节点角色说明

节点角色说明
Provider暴露服务的服务提供方
Consumer调用远程服务的服务消费方
Registry服务注册与发现的注册中心
Monitor统计服务的调用次调和调用时间的监控中心
Container服务运行容器

Dubbo提供三个关键功能,包括基于接口的远程呼叫,容错和负载平衡以及自动服务注册和发现

调用关系说明

1.服务容器负责启动,加载,运行服务提供者。
2.服务提供者在启动时,向注册中心注册自己提供的服务。
3.服务消费者在启动时,向注册中心订阅自己所需的服务。
4.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
6.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo 特点

Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性

连通性

  • 注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小
  • 监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示
  • 服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销
  • 服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销
  • 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
  • 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
  • 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
  • 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

健状性

  • 监控中心宕掉不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  • 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

伸缩性

  • 注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心
  • 服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者

升级性

当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力。下图是未来可能的一种架构:

未来可能的一种架构未来可能的一种架构

节点角色说明

节点角色说明
Deployer自动部署服务的本地代理
Repository仓库用于存储服务应用发布包
Scheduler调度中心基于访问压力自动增减服务提供者
Admin统一管理控制台
Registry服务注册与发现的注册中心
Monitor统计服务的调用次调和调用时间的监控中心

快速开始

Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于 Spring 的 Schema 扩展进行加载。

环境安装

任选其一

CentOs7.3 搭建 ZooKeeper-3.4.9 单机服务
CentOs7.3 搭建 ZooKeeper-3.4.9 Cluster 集群服务

Github 代码

代码我已放到 Github ,导入ymq-dubbo-spring-boot 项目

github github.com/souyunku/ym…

Maven依赖

在项目中添加 dubbo 依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.5.6</version>
</dependency>

定义服务接口

项目:ymq-dubbo-api

public interface DemoService {
    String sayHello(String name);
}

服务提供方

项目:ymq-dubbo-provider,在服务提供方实现接口

@Service("demoService")
public class DemoServiceImpl implements DemoService {

    @Override
    public String sayHello(String name) {
        System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return "Hello " + name + ", response form provider: " + RpcContext.getContext().getLocalAddress();
    }
}

加载 dubbo 配置

@Configuration
@PropertySource("classpath:dubbo.properties")
@ImportResource({"classpath:dubbo/*.xml"})
public class PropertiesConfig {
}

在提供方增加暴露服务配置 : <dubbo:service>

dubbo-provider.xml

<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="io.ymq.dubbo.api.DemoService" ref="demoService"/>

服务消费方

项目:ymq-dubbo-consumer ,消费消费远程方法

@Service("consumerDemoService")
public class ConsumerDemoService {

    @Autowired
    private DemoService demoService;

    public void sayHello(String name) {
        String hello = demoService.sayHello(name); // 执行消费远程方法
        System.out.println(hello); // 显示调用结果
    }

}

加载 dubbo 配置

@Configuration
@PropertySource("classpath:dubbo.properties")
@ImportResource({"classpath:dubbo/*.xml"})
public class PropertiesConfig {
}

在消费方增加引用服务配置: <dubbo:reference>

dubbo-consumer.xml

<!-- 增加引用远程服务配置 可以和本地bean一样使用demoService -->
<dubbo:reference id="demoService" check="false" interface="io.ymq.dubbo.api.DemoService"/>

远程服务 Dubbo 配置

项目:ymq-dubbo-provider ,ymq-dubbo-consumer 一样配置

dubbo.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="${spring.application.name}"  />

    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <dubbo:registry protocol="zookeeper" address="${zookeeper.connect}"  file="${dubbo.cache}"/>

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="${dubbo.protocol.port}"  threadpool="${dubbo.protocol.threadpool}"  threads="${dubbo.protocol.threads}"/>

    <!-- 提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值,可选。-->
    <dubbo:provider connections="${dubbo.provider.connections}" timeout="${dubbo.provider.timeout}" retries="${dubbo.provider.retries}" version="${dubbo.provider.version}" />

    <!-- 消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值,可选。-->
    <dubbo:consumer version="${dubbo.provider.version}" />

    <!-- 监控中心配置,用于配置连接监控中心相关信息,可选。-->
    <dubbo:monitor protocol="registry"/>

</beans>

dubbo.properties

#########################################################
# dubbo config
#暴露服务端口
dubbo.protocol.port=20880
#提供方超时时间
dubbo.provider.timeout=10000
#提供方版本
dubbo.provider.version=1.0
#表示该服务使用独的五条条长连
dubbo.provider.connections=5
# 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
dubbo.protocol.threadpool=fixed
# 线程数量
dubbo.protocol.threads=500
#配置重试次数,最好只用于读的重试,写操作可能会引起多次写入  默认retries="0"
dubbo.provider.retries=0
# dubbo缓存文件
dubbo.cache=/data/dubbo/cache/ymq-dubbo-provider
#########################################################
# zookeeper config
zookeeper.connect=127.0.0.1:2181

测试 Dubbo

  1. 该接口需单独打包,在服务提供方和消费方共享 ↩
  2. 对服务消费方隐藏实现 ↩
  3. 也可以使用 IoC 注入 ↩

启动 ZooKeeper

启动服务

/opt/zookeeper-3.4.9/bin/zkServer.sh start

启动提供方服务

package io.ymq.dubbo.provider.run;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

/**
 * 描述:启动提供方服务
 *
 * @author yanpenglei
 * @create 2017-10-27 11:49
 **/
@SpringBootApplication
@ComponentScan(value = {"io.ymq.dubbo"})
public class Startup {

    public static void main(String[] args) {
        SpringApplication.run(Startup.class, args);
    }
}

测试消费远程服务

package io.ymq.dubbo.test;

import io.ymq.dubbo.consumer.run.Startup;
import io.ymq.dubbo.consumer.service.ConsumerDemoService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * 描述: 测试消费远程服务
 *
 * @author yanpenglei
 * @create 2017-10-27 14:15
 **/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Startup.class)
public class ConsumerTest {

    @Autowired
    private ConsumerDemoService consumerDemoService;

    @Test
    public void sayHello(){
        consumerDemoService.sayHello("Peng Lei");
    }
}

响应:

[15:54:00] Hello Peng Lei, request from consumer: /10.4.82.6:63993

代码我已放到 Github ,导入ymq-dubbo-spring-boot 项目

github github.com/souyunku/ym…

作者:andyliulin 发表于 2017/10/30 11:57:33  原文链接 https://blog.csdn.net/andyliulin/article/details/78391627
阅读:287
 
[转]Android 开发资料便签

Android 开发资料便签

标签:Android

平台

控制





【阿里】【百度】【友盟】【微信】【腾讯】【微博】
应用【中心】【中心】【中心】【中心】【中心】【中心】
首页【支付】【首页】【首页】【首页】【首页】【首页】
分享 【分享】【分享】【分享】【分享】【分享】
统计【统计】【统计】【统计】 【统计】 
推送【推送】【推送】【推送】 【推送】 
地图【高德】【地图】  【地图】 
登录 【登录】 【登录】【登录】【登录】
测试【MQC】【MTC】【云测】   
云服【云】【云】  【云】 
托管阿里GtiHubGitLabCSDN码云Bitbucket

技术

文档     more
AndroidAPI英文API中文JDK1.6   
GradleAPI英文API中文插件指南   
网络OkhttpRetrofitVolleyNohttpandroid-async-httpmore
数据库GreenDaoOrmLitesqldelightSugarActiveAndroidmore
图片glidepicassofrescoAndroid-Universal-Image-Loader  
公共类AndroidUtilCodeTrinealitesuitsandroid-utilsh4de5ingmore
解析fastjsongsonorg.json   
注解androidannotationsdaggerbutterknife   
异步库RxjavaEventBusotto   
架构android-architectureAwesomeFragmentationT-MVPandroidmvpmore
MVPandroid-mvp-architecture     
组件化atlasARouterActivityRouter   
插件化      
日志logger     
版本      
Git廖雪峰git-tipsgit-recipes   
UI组件      
布局androidslidinguppanelInboxLayoutAndroidSwipeLayout   
刷新Android-PullToRefreshandroid-Ultra-Pull-To-RefreshBeautifulRefreshLayout   
侧滑MaterialDrawer     
对话框material-dialogs     
提示SuperToastsAlerterToasty   
选项卡SmartTabLayoutPagerSlidingTabStripNavigationTabBarFlycoTabLayoutPagerBottomTabStripmore

阅读

代码库     more
一梯队githubctolibandroid-gemsgank.iocodekk 
二梯队fossdroidapkbuslibraries   
三梯队diycodeandroidblog    
博客      
一梯队Trinea郭霖鸿洋胡凯Mr.Simplemore
一梯队任玉刚阿拉神农袭烽工匠若水兰亭风雨 
一梯队asce1885Freelanderinferjay张明云stormzhang 
二梯队 一叶飘舟刘望舒刘桂林亓斌 
周刊      
一梯队博客周刊技术周报androidweeklygoogleblog  
二梯队frontierrace604AndroidPubmindorks  
Github      
一梯队Googlefacebooksquarealibabagooglesamples 
二梯队JakeWhartonJesse WilsonTrineadaimajia胡凯 
三梯队CameloeAnthony     



权威导航

我的书签
第三方书签
其它书签

信息中心

1:社区网站
2:技术源码

工具利器

进阶书籍

  • Java编程思想
  • Android高级进阶
  • Android群英传
  • Android艺术探索
  • Android源码设计模式

开发规范

经验之谈


作者:andyliulin 发表于 2017/10/27 17:18:27  原文链接 https://blog.csdn.net/andyliulin/article/details/78367089
阅读:271
 
[译]iOS 收集的高仿项目

iOS 收集的高仿项目

GSD_WeiXin高仿微信

v2ex- v2ex 的客户端,新闻、论坛。

V2ex-Swift- 用 Swift 写的 V2EX 客户端。

iBBS-Swift- “新手开源一个用Swift(2.0)写的论坛客户端”。BBS 服务端

wikipedia-ios- wikipedia-ios 客户端。

jetstream-ios- 一款 Uber 的 MVC 框架。它同时提供了多用户实时通讯支持,一旦启动 JetStream 后端服务,通过 WebSocket 协议可以分分钟建立多用户实时通讯应用。

DeckRocket- 在相同 WiFi 网络环境内,通过iPhone 控制并播放 Mac 中的 PDF 文档。

ScanBook- 扫扫图书:可以扫描条形码查询图书,也可以关键字搜索,遇到合乎你口味的书,还可以看看别人的读书笔记,不同角度去体会。

DesignerNewsApp- Swift 开发的 DesignerNews 客户端,看着美美的!

KYWeibo- 调用新浪API自己写的第三方微博客户端。

DouQu_IOS- 逗趣IOS手机端(一款笑话软件),拥有完整的功能的手机应用app 。

IT江湖iOS客户端- IT江湖iOS客户端。

Eidolon- 艺术品拍卖的投标亭平台,用swift与反应式编程框架 ReactiveCocoa。

CrazyPuzzle- 模仿“看图猜成语”App,功能齐全,配有音效,效果很不错。游戏使用cocoa框架完成,没有使用cocos2d的框架。

WhoCall- 谁CALL我,iOS来电信息语音提醒,无需越狱。(需要iOS 7.0及以上版本。)骚扰电话预警、来电归属地提醒、联系人姓名播报,这些有中国特色人性化的电话功能,iOS上也应该有。电话提醒、私有API。

仿iOS猎豹垃圾清理(实现原理+源码)-  仿iOS猎豹垃圾清理(实现原理+源码),用到私有API。

DSLolita- 模仿新浪微博做的一款app,有发送博文,评论,点赞,私聊功能。

STPhotoBrowser- 高仿新浪微博的图片浏览器,极佳的编写方式,易扩展,低耦合。

GSD_ZHIFUBAO- 支付宝高仿版。

Tropos- Tropos, 由 thoughtbot 推出的一款用 Objective-C 写的开源天气类应用, 截至今天, thoughtbot 已在 GitHub 上贡献了 174 个开源项目, 实在令人敬佩。

SmileWeather-开源天气类应用,天气图标很完整。

MVVMReactiveCocoa- GitBucket 2.0 通过审核啦,她是我在公司实践了一年多 MVVM 和 RAC 的基础上,利用业余时间开发的第三方 GitHub 客户端,旨在能够对想实践 MVVM 和 RAC 的 iOS 开发者有所帮助。AppStore地址,欢迎下载使用GitBucket和收藏MVVMReactiveCocoa。

Tomate- 这个圆盘式计时器让你更专注于工作或学习。P.S. App Store 上架收费应用(0.99 欧)。

StoveFireiOSMenu- 炉火餐饮系统iPad点餐端。

BaiduFM-Swift- 百度FM, swift语言实现,基于最新xcode6.3+swift1.2,初步只是为了实现功能,代码比较粗燥,后面有时间会整理,支持Apple Watch。

WNXHuntForCity- iOS高仿城觅项目(开发思路和代码)。

ZYChat- 关于聊天界面的可消息类型扩展,响应绑定设计。

meituan- 美团5.7iOS版(高仿),功能包括,团购首页,高德地图搜索附近美食并显示在地图上,上门服务,商家,友盟分享。

MeituanDemo- 造美团应用界面构建的 iOS 应用, 第一个是 @叶孤城_的 MeituanDemo。

JFMeiTuan- 造美团应用界面构建的 iOS 应用, 第二个是 @tubiebutu 的 JFMeiTuan。

chuanke- 高仿百度传课iOS版。

Tuan- 模仿MJ老师iPad版美团(swift版),偶有bug 见谅。

SXNews- 模仿网易新闻做的新闻软件,完成了主导航页,新闻详情页,图片浏览页,评论页。效果不错,比网上流传的各种和网易新闻UI架构有关的代码都要完整,都要好。

Monkey- Monkey for GitHub是一个GitHub开发者和仓库排名的开源App。这次主要增加了登录GitHub的功能,随手follow和star,并且增加发现模块,包括GitHub的trending,动态,showcases等。

Uther-  跟蠢萌的外星人聊天,还能帮你记事”。itunes下载

CocoaChinaPlus- CocoaChina+是一款开源的第三方CocoaChina移动端。整个App都用Swift2.0编写(除部分第三方OC代码外,比如JPush和友盟)。

高仿斗鱼TV- 高仿斗鱼TV,点击头部滚动视图可以播放视频。

LXZEALER- 模仿着做了zealer客户端,App里几乎所有请求都是Post,所以内容都是固定的URL加载的,登录功能只做了微博的第三方登录。

ShiXiSeng_ios- 完整app的UI框架。

Coding-iPad- Coding-iPad 是@Coding的官方 iPad 客户端, 又是一个完整的开源应用。

SimpleMemo- 易便签已经转到Swift2.0,全面适配iOS9和Watch OS2,并支持iPhone6s和iPhone6sPlus的3D Touch功能,包括图标快捷键和内容预览。

XXYAudioEngine.swift- 基于NSURLSession 和 AVAudoPlayer的在线音乐的工具,可以把音乐保存在本地,也可以支持后台播放,后台下载,最低支持iOS7,swift版本1.2。

furni-ios.swift- furni-ios.swift是由 Twitter 开发团队出品的一款用 Swift 写的 iOS 家居商城应用, 其主要目的在于让开发者从这款 Demo 应用中看出 Fabric 的强大。

SelectionOfZhihu.swift- 『看知乎』iOS 客户端,项目说明

WFZhiHu- WFZhiHu仿知乎日报客户端app。

NirZhihuDaily2.0_swift- 精仿了知乎日报iOS端练手,Swift2.0,注释相当详细。

Yep.swift- Yep 一个由天才开发给天才们使用的社交软件。

LoveFreshBeen.swift- 高仿爱鲜蜂 - Swift2.0

trySwiftApp.swift- trySwiftApp一款较为完整的会议原型应用。有需求的同学可以做为开发参考。

PinGo.swift- PinGo.swift:纯Swift编写的仿“随遇”App。

UmbrellaWeather.swift- UmbrellaWeather.swift使用 Swift 编写的一款天气应用,现已上架 AppStore。

SwiftWeather- SwiftWeather清新淡雅持续改进天气预报项目。

Phonetic.swift- Phonetic一个 iOS 版的 Phonetic Contacts,功能很多,其中昵称功能非常实用,已在 GitHub 开源并上架 App Store。

edhita.swift- edhita.swift支持Markdown, HTML预览的文本编辑器。

PilesSugar.swift- PilesSugar.swift:Swift高仿项目,堆糖。

react-native-gitfeed- 目前最实用简洁的github客户端了。

phphub-ios- PHPHub的iOS客户端,同时兼容iPhone和iPad。

SoundCloudSwift- SoundCloud的Swift版本,采用Swift2.0,Reactive API with ReactiveCocoa 4.0。

LeagueofLegends- 一个关于英雄联盟的完整iOS开源项目,接口均来自多玩,腾讯各大游戏平台。

Coderpursue.swift- 一款 Github 第三方客户端,使用最新 Swift 语言编写。

BTApp- BTApp 仿半糖 iOS App 的 Demo 应用。

iOS完整App资源收集- iOS开发学习者都希望得到实战训练,但是很多资料都是只有一小部分代码,并不能形成完成的App,笔者在此处收集了很多开源的完整的App,都有源代码哦!--标哥的技术博客

XCFApp-1- 高仿下厨房App,Objective-C,Xcode7.2,数据通过Charles抓的,有接口也有本地数据。说明:关于代码被清空,会用git的你肯定明白,教程

XCFApp-2- 高仿下厨房APP。

YoCelsius- 已经上线的一款天气预报的应用,几乎所有的交互动画效果,想学习动画的开发人员可以作为参考。

XiMaLaYa-by-HansRove-- 仿喜马拉雅FM, 对AVFoundation框架的一次尝试,采用MVVM模式,教程

作者:andyliulin 发表于 2017/10/27 15:00:11  原文链接 https://blog.csdn.net/andyliulin/article/details/78365021
阅读:882
 
[转]Python制作安卓游戏外挂

Python制作安卓游戏外挂

最近在玩一款背单词的手机游戏-单词英雄,是一个将背单词和卡牌游戏相结合的游戏,通过选择正确的单词意思进行有效攻击,边玩游戏就把单词给背了。

  游戏的界面是这样的:


Paste_Image.png


  通过选择单词的意思进行攻击,选对了就正常攻击,选错了就象征性的攻击一下。玩了一段时间之后琢磨可以做成自动的,通过PIL识别图片里的单词和选项,然后翻译英文成中文意思,根据中文模糊匹配选择对应的选项。
  查找了N多资料以后开始动手,程序用到以下这些东西:
PIL       Python Imaging Library 大名鼎鼎的图片处理模块
pytesser     Python下用来驱动tesseract-ocr来进行识别的模块
Tesseract-OCR  图像识别引擎,用来把图像识别成文字,可以识别英文和中文,以及其它语言
autopy     Python下用来模拟操作鼠标和键盘的模块。

安装步骤(win7环境):
  (1)安装PIL,下载地址:http://www.pythonware.com/products/pil/,安装PythonImaging Library 1.1.7 for Python 2.7。
  (2)安装pytesser,下载地址:http://code.google.com/p/pytesser/,下载解压后直接放在
C:\Python27\Lib\site-packages下,在文件夹下建立pytesser.pth文件,内容为C:\Python27\Lib\site-packages\pytesser_v0.0.1
  (3)安装Tesseract OCR engine,下载:https://github.com/tesseract-ocr/tesseract/wiki/Downloads,下载Windows installer of tesseract-ocr 3.02.02 (including English language data)的安装文件,进行安装。
  (4)安装语言包,在https://github.com/tesseract-ocr/tessdata下载chi_sim.traineddata简体中文语言包,放到安装的Tesseract OCR目标下的tessdata文件夹内,用来识别简体中文。
  (5)修改C:\Python27\Lib\site-packages\pytesser_v0.0.1下的pytesser.py的函数,将原来的image_to_string函数增加语音选择参数language,language='chi_sim'就可以用来识别中文,默认为eng英文。
改好后的pytesser.py:

"""OCR in Python using the Tesseract engine from Google
http://code.google.com/p/pytesser/
by Michael J.T. O'Kelly
V 0.0.1, 3/10/07"""

import Image
import subprocess
import util
import errors

tesseract_exe_name = 'tesseract' # Name of executable to be called at command line
scratch_image_name = "temp.bmp" # This file must be .bmp or other Tesseract-compatible format
scratch_text_name_root = "temp" # Leave out the .txt extension
cleanup_scratch_flag = True  # Temporary files cleaned up after OCR operation

def call_tesseract(input_filename, output_filename, language):
  """Calls external tesseract.exe on input file (restrictions on types),
  outputting output_filename+'txt'"""
  args = [tesseract_exe_name, input_filename, output_filename, "-l", language]
  proc = subprocess.Popen(args)
  retcode = proc.wait()
  if retcode!=0:
    errors.check_for_errors()

def image_to_string(im, cleanup = cleanup_scratch_flag, language = "eng"):
  """Converts im to file, applies tesseract, and fetches resulting text.
  If cleanup=True, delete scratch files after operation."""
  try:
    util.image_to_scratch(im, scratch_image_name)
    call_tesseract(scratch_image_name, scratch_text_name_root,language)
    text = util.retrieve_text(scratch_text_name_root)
  finally:
    if cleanup:
      util.perform_cleanup(scratch_image_name, scratch_text_name_root)
  return text

def image_file_to_string(filename, cleanup = cleanup_scratch_flag, graceful_errors=True, language = "eng"):
  """Applies tesseract to filename; or, if image is incompatible and graceful_errors=True,
  converts to compatible format and then applies tesseract.  Fetches resulting text.
  If cleanup=True, delete scratch files after operation."""
  try:
    try:
      call_tesseract(filename, scratch_text_name_root, language)
      text = util.retrieve_text(scratch_text_name_root)
    except errors.Tesser_General_Exception:
      if graceful_errors:
        im = Image.open(filename)
        text = image_to_string(im, cleanup)
      else:
        raise
  finally:
    if cleanup:
      util.perform_cleanup(scratch_image_name, scratch_text_name_root)
  return text


if __name__=='__main__':
  im = Image.open('phototest.tif')
  text = image_to_string(im)
  print text
  try:
    text = image_file_to_string('fnord.tif', graceful_errors=False)
  except errors.Tesser_General_Exception, value:
    print "fnord.tif is incompatible filetype.  Try graceful_errors=True"
    print value
  text = image_file_to_string('fnord.tif', graceful_errors=True)
  print "fnord.tif contents:", text
  text = image_file_to_string('fonts_test.png', graceful_errors=True)
  print text

  (6)安装autopy,下载地址:https://pypi.python.org/pypi/autopy,下载autopy-0.51.win32-py2.7.exe进行安装,用来模拟鼠标操作。

说下程序的思路:
 1. 首先是通过模拟器在WINDOWS下执行安卓的程序,然后用PicPick进行截图,将战斗画面中需要用到的区域进行测量,记录下具体在屏幕上的位置区域,用图中1来判断战斗是否开始(保存下来用作比对),用2,3,4,5,6的区域抓取识别成文字。


1485005-75900c16b01ca1f3.png


计算图片指纹的程序:

    def get_hash(self, img):
        #计算图片的hash值
        image = img.convert("L")
        pixels = list(image.getdata())
        avg = sum(pixels) / len(pixels)
        return "".join(map(lambda p : "1" if p > avg else "0", pixels))

图片识别成字符:

    #识别出对应位置图像成字符,把字符交给chose处理
    def getWordMeaning(self):
        pic_up = ImageGrab.grab((480,350, 480+300, 350+66))
        pic_aws1 = ImageGrab.grab((463,456, 463+362, 456+45))
        pic_aws2 = ImageGrab.grab((463,530, 463+362, 530+45))
        pic_aws3 = ImageGrab.grab((463,601, 463+362, 601+45))
        pic_aws4 = ImageGrab.grab((463,673, 463+362, 673+45))

        str_up = image_to_string(pic_up).strip().lower()

        #判断当前单词和上次识别单词相同,就不继续识别
        if str_up <> self.lastWord:
            #如果题目单词是英文,选项按中文进行识别
            if str_up.isalpha():
                eng_up = self.dt[str_up].decode('gbk') if self.dt.has_key(str_up) else ''
                chs1 = image_to_string(pic_aws1, language='chi_sim').decode('utf-8').strip()
                chs2 = image_to_string(pic_aws2, language='chi_sim').decode('utf-8').strip()
                chs3 = image_to_string(pic_aws3, language='chi_sim').decode('utf-8').strip()
                chs4 = image_to_string(pic_aws4, language='chi_sim').decode('utf-8').strip()
                print str_up, ':', eng_up
                self.chose(eng_up, (chs1, chs2, chs3, chs4))
            #如果题目单词是中文,选项按英文进行识别
            else:
                chs_up = image_to_string(pic_up, language='chi_sim').decode('utf-8').strip()
                eng1 = image_to_string(pic_aws1).strip()
                eng2 = image_to_string(pic_aws2).strip()
                eng3 = image_to_string(pic_aws3).strip()
                eng4 = image_to_string(pic_aws4).strip()

                e2c1 = self.dt[eng1].decode('gbk') if self.dt.has_key(eng1) else ''
                e2c2 = self.dt[eng2].decode('gbk') if self.dt.has_key(eng2) else ''
                e2c3 = self.dt[eng3].decode('gbk') if self.dt.has_key(eng3) else ''
                e2c4 = self.dt[eng4].decode('gbk') if self.dt.has_key(eng4) else ''
                print chs_up
                self.chose(chs_up, (e2c1, e2c2, e2c3, e2c4))
            self.lastWord = str_up
        return str_up

  2. 对于1位置的图片提前截一个保存下来,然后通过计算当前画面和保存下来的图片的距离,判断如果小于40的就表示已经到了选择界面,然后识别2,3,4,5,6成字符,判断如果2位置识别成英文字符的,就用2解析出来的英文在字典中获取中文意思,然后再通过2的中文意思和3,4,5,6文字进行匹配,匹配上汉字最多的就做选择,如果匹配不上默认返回最后一个。之前本来考虑是用Fuzzywuzzy来进行模糊匹配算相似度的,不过后来测试了下对于中文匹配的效果不好,就改成按汉字单个进行匹配计算相似度。
匹配文字进行选择:

    #根据传入的题目和选项进行匹配选择
    def chose(self, g, chs_list):
        j, max_score = -1, 0
        same_list = None
        #替换掉题目里的特殊字符
        re_list = [u'~', u',', u'.', u';', u' ', u'a', u'V', u'v', u'i', u'n', u'【', u')', u'_', u'W', u'd', u'j', u'-', u't']
        for i in re_list:
            g = g.replace(i, '')
        print type(g)

        #判断2个字符串中相同字符,相同字符最多的为最佳答案
        for i, chsWord in enumerate(chs_list):
            print type(chsWord)
            l = [x for x in g if x in chsWord and len(x)>0]
            score = len(l) if l else 0

            if score > max_score:
                max_score = score
                j = i
                same_list = l
        #如果没有匹配上默认选最后一个
        if j ==-1:
            print '1. %s; 2. %s; 3. %s; 4. %s; Not found choice.' % (chs_list[0], chs_list[1], chs_list[2], chs_list[3])
        else:
            print '1. %s; 2. %s; 3. %s; 4. %s; choice: %s' % (chs_list[0], chs_list[1], chs_list[2], chs_list[3], chs_list[j])
            for k, v in enumerate(same_list):
                print str(k) + '.' + v,
        order = j + 1
        self.mouseMove(order)
        return order

  3.最后通过mouseMove调用autopy操作鼠标点击对应位置进行选择。
程序运行的录像:
http://v.youku.com/v_show/id_XMTYxNTAzMDUwNA==.html
  程序完成后使用正常,因为图片识别准确率和字典的问题,正确率约为70%左右,效果还是比较满意。程序总体来说比较简单,做出来也就是纯粹娱乐一下,串联使用了图片识别、中文模糊匹配、鼠标模拟操作,算是个简单的小外挂吧,源程序和用到的文件如下:
http://git.oschina.net/highroom/My-Project/tree/master/Word%20Hero

作者:andyliulin 发表于 2017/10/26 16:30:56  原文链接 https://blog.csdn.net/andyliulin/article/details/78355503
阅读:780
 
[转]Python的自动操作(挂机)脚本相关1

之前用了数个月VBS,受不了啦。听闻.py好使就试试看。 
这是用Py的第五天。 
爱搬码,非coder。 
工具:Python3.4.0 + PyCharm2016 3.2 + PyQt5.4.1 
工具:Notepad++ 
环境:Win7 
注:Notepad++写VBS时,防止代码中的中文乱码,必须设置“格式”—“以XXXX Little Endian 格式编码”。

1. 鼠标/键盘操作

从VBS过来的,先说用过的思路: 
——————————————.VBS 
请参考Demon的: 
用VBS控制鼠标(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击、鼠标右击) 
创建Excel对象,在VBA模块中调用WIN的API: 
SetCursorPos / GetCursorPos / mouse_event / keybd_event 
若要修改VBA模块中的代码,不够方便(人懒) 
——————————————.Py 
Python这边,安装对应版本的pywin32,就可调用win32api: 
(对应Python3.4.0,windows要先安装Python3.4 pywin32-2XX) 本机219 
pywin32 下载列表

# -*- coding: UTF-8 -*-
# Python version: 3.4.0
import win32api

def LeftClick(x, y):    # 鼠标左键点击屏幕上的坐标(x, y)
    win32api.SetCursorPos((x, y))    # 鼠标定位到坐标(x, y)
    # 注意:不同的屏幕分辨率会影响到鼠标的定位,有需求的请用百分比换算
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)    # 鼠标左键按下
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)    # 鼠标左键弹起
    # win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN + win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)    # 测试

def PressOnce(x):    # 模拟键盘输入一个按键的值,键码: x
    win32api.keybd_event(x, 0, 0, 0)

# 测试
LeftClick(30, 30)  # 我的电脑?
PressOnce(13)  # Enter
PressOnce(9)   # TAB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

keycode/组合键等:keybd_event使用方法

附:Python获取屏幕分辨率

import win32api
from win32api import GetSystemMetrics
def DisplaySize():
    return GetSystemMetrics(0), GetSystemMetrics(1)

a, b = DisplaySize()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

———————————————PyUserInput 
搜到PyUserInput,好家伙,GitHub: 
PyUserInput 
(安装PyUserInput之前必须先安装对应版本的pywin32和pyHook)

2. 屏蔽鼠标键盘输入

知道了能在VBS里调用api,于是听说BlockInput可以弄到死机。 
依样画葫芦,把这句塞到VBA模块代码里去,注意换行符: 
——————————————.VBS

"Public Declare Function BlockInput Lib ""user32""  (Byval fBlock As Long) As Long " & vbCrLf & _
  • 1

也该注意到了,用了user32.dll,哦也就是win的api这样。在VBS中使用:

oExcel.Run "BlockInput", True  '屏蔽鼠标键盘
wscript.Sleep 1000    '你-1s
oExcel.Run "BlockInput", False '记得解除锁定
  • 1
  • 2
  • 3

——————————————.Py 
Python3.4用user32.dll,就是windll,直接在ctypes里

from ctypes import *
user32 = windll.LoadLibrary('user32.dll')    # 加载动态链接库
user32.BlockInput(True)   # 锁
time.sleep(1)             # 你-1s
user32.BlockInput(False)  # 该解锁啦
  • 1
  • 2
  • 3
  • 4
  • 5

3. 检测/结束进程

——————————————.VBS

On Error Resume Next  
    for each ps in getobject("winmgmts:\\.\root\cimv2:win32_process").instances_
    if Ucase(ps.name)=Ucase("123.exe") then  
        ps.terminate  ' kill
        WScript.Echo "死了没"
    end if
    next 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

——————————————.Py

import os
# process_name:进程名 ;返回进程个数
def process_exit(process_name):
    p_checkresp = os.popen('tasklist /fo csv | find "' + process_name + '"').readlines()
    return len(p_checkresp)


if process_exit(123.exe) == 0:    # 未检测到
    print("=0")
elif process_exit(123.exe) >= 1:    # 检测到
    command = 'taskkill /F /IM 123.exe'  # kill
    os.popen(command)    # 执行cmd命令
    # os.system(command)    # 听说用popen更好
    print("=1")
else:
    win32api.MessageBox(0, "用api弹出窗口消息")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

4. 启动外部程序

Py和VBS都有几种方式启动外部的程序(.exe等)这里不列出了。 
VBS中运行应用程序的两种方式及WshShell对像浅析

而某些软件启动的时候会挂上其他东西… 
(非CS专业,不知道啊。是否环境变量不对、起始目录不对之类) 
wshell普通的run启动后登陆报错,用Exec也登陆后报错,各种改参数没有效果。

最后搜到个命令行用start,微软界面How to redirect command-Line output 
——————————————.VBS 
如:C:\Program Files\12345\我是中文名的程序来砍我吖.exe

WshShell.run("%comspec% /k c: & cd \Program Files\12345 & start 我是中文名的程序来砍我吖.exe&")   '稳
  • 1

命令行:”%comspec% /k 
切换到程序所在盘(c:); 
打开所在目录(cd \Program Files\12345),最后start,登陆再也没有报错! 
注意用“&”连接每条命令,也用“&”结束。 
——————————————.Py 
CreateProcess等方法不提,本例不适用。使用CreateProcess函数运行其他程序 
Python的cmd不认cd \Program Files\12345 里边的单个反斜杠换成转义“\\\\”(四条杠)也不行。 
路径有中英文符号等等,要对字符进行判断。python利用utf-8编码判断中文英文字符(转)

# alphabet or not 是否英文字母
def is_alphabet(uchar):
        if (uchar >= u'\u0041' and uchar<=u'\u005a') or (uchar >= u'\u0061' and uchar<=u'\u007a'):
            return True
        else:
            return False


# num or not 是否数字
def is_number(uchar):
        if uchar >= u'\u0030' and uchar<=u'\u0039':
            return True
        else:
            return False


# chinese or not 是否中文
def is_chinese(uchar):
        if uchar >= u'\u4e00' and uchar<=u'\u9fa5':
            return True
        else:
            return False


# 是否非中文非英文非数字
def is_other(uchar):
        if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)):
            return True
        else:
            return False
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

根据以上弄了个拆文件路径的玩意:

# get each dir 获得路径里每个文件夹的名字
# 传入path:文件的完整路径名+程序名
def part_path(path):
    if len(path) > 0:
        gang_arr = []       # 反斜杠位置数组
        gang_num = 0            # 反斜杠总数
        point = 0           # 点号位置
        for i in range(0, len(path)):
            if is_other(path[i]):       # 点号和反斜杠
                if path[i] == "/":      # 反斜杠
                    gang_arr.append(i)      # 每个反斜杠的位置
                    gang_num += 1
                elif path[i] == ".":
                    point = i  # 点号的位置
        # if is_alphabet(path[0]):
        #   print("disk: %s :" % path[0])
        # else:
        #   print("error disk!")
        # 每个反斜杠的位置
        # print("how many gangs = %d" % gang_num)
        # print("gang arr = %s" % str(gang_arr[0:path.count("/")]))
        # 获得每个子目录
        sub_arr = []
        for j in range(0, gang_num-1):
            sub_arr.append(path[gang_arr[j] + 1: gang_arr[j+1]])
        exe_name = path[gang_arr[gang_num-1] + 1:]
        # print("exe name: " + exe_name )   # exe name
        return path[0], exe_name, sub_arr
    else:
        win32api.MessageBox(0, "请选择文件!")

# 调用
disk_name, exe_name, dir_arr = part_path("C:\Program Files\12345\砍吖.exe")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

(path不是随便输入的,用了PyQt中的QFileDialog获得文件路径。后面会讲) 
学着VBS用start:

# 根据反斜杠数量,多次拼接cmd命令
cmd = "cd/ & " + disk_name + ": &"
        for i in range(0, len(dir_arr)):
            cmd += "cd " + dir_arr[i] + " & "
        cmd += "start " + exe_name
        # print(cmd)
        os.popen(cmd)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5. 补充

哦,用pyInstaller3.0打包成EXE(-w -F)调试的时候,发现前面有关检测/结束/启动进程用的所有os.popen(cmd)均没反应,不执行动作,搞不清原因,于是换subprocess.Popen(),顺带发现了”cwd=”这玩意,可以指定子进程工作路径了。参考: 
Python执行系统命令:使用subprocess的Popen函数 
先用个QPushbutton挂着QFileDialog来获取文件完整路径+文件名,内容放到LineEdit(类似文本框TextBox)里:

# 首先有一个文本框(LineEdit)的名字(objectName)为tb_line1
self.tb_line1 = QLineEdit()

# 按钮的内容、信号连接
self.btn_fileDiaLog = self.createButton("选择客户端文件", self.showDialog)

# 绑定的事件
def showDialog(self):
    filename = QFileDialog.getOpenFileName(self, "选取文件","F:/","EXE Files (*.exe);;All Files (*)")
    self.tb_line1.setText(filename[0])  # content 

# 创建按钮用的函数
def createButton(self, text, member):
    button = QPushButton(text)
    button.clicked.connect(member)
    return button
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
# 从文本框获得文件的工作路径
exe_dir = os.path.dirname(os.path.abspath(self.tb_line1.displayText()))         

# 启动命令
cmd = 'start '+ exe_name
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,cwd = exe_dir)
proc.stdin.write(cmd.encode())
proc.stdin.close()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

os.path.dirname(os.path.abspath(“文件名”)): 表示获取当前文件夹的所在的目录。 
Python中的绝对路径和相对路径 
比如完整文件路径:C:\Program Files\12345\砍吖.exe 
abs_path就得到:C:\Program Files\12345 
这样就不会报错啦,不用去拆文件路径的各个文件夹名。

作者:andyliulin 发表于 2017/10/26 16:27:24  原文链接 https://blog.csdn.net/andyliulin/article/details/78355448
阅读:351
 
[转]wxPython+Boa Constructor环境配置

配置之前先完成eclipse + Pydev的配置环境。详见http://www.cnblogs.com/dflower/archive/2010/05/13/1734522.html

1. 安装 wxPython 2.8  
  下载地址为http://sourceforge.net/projects/wxpython/files/,我用的版本是wxPython2.8-win32-unicode-2.8.10.1-py26.exe

  建议下载 Unicode 的,用 Ansi 版的话,组件标题不能写 Unicode 字符,代码包含 Unicode 字符也会出错。安装时注意,安装路径中不能有空格。
  
2. 下载 Boa Constructor
  Python 拥有非常多的开发环境,也就是 IDE。但是到现在为止,能完全支持可视开发的只有 Boa Constructor。使用它可以像使用 Delphi 那样,直接拖出控件进行快速的开发。
  下载地址为http://sourceforge.net/projects/boa-constructor/files/,目前最高版本是0.6.1  
  注意,Boa Constructor 的安装路径也不能有空格。

3.配置 Boa Constructor
  打开 Boa Constructor,如果你是中文的系统,IDE 的语言会变成中文,你必须把它修改成英文的,在 工具->语言设置菜单中将它换成英文。如果使用中文的 IDE,打开,保存文件时会发生错误
  点击 Tools->Python Interpreter Chooser,设置 Python.exe 的所在目录。
  关闭 Boa Constructor并重新启动它,配置即告完成。

 

用Boa Constructor可以很方便的设计界面,具体的入门教程在最后附上。

但是在Boa里直接写代码还是比较痛苦的,可以先在eclipse里面新建一个工程,然后用Boa constructor设计好GUI保存到工程文件夹里面,再到eclipse里面刷新一下就能载入设计好的py文件,然后就可以在eclipse里面编程和调试了。

 

--------------------------------------------------------你飘啊飘我摇啊摇无根的分隔线-------------------------------------------------------

 

附:一个Boa Constructor的入门教程

1、先创建一个wx.App,这样会自动创建wx.Frame,Boa constructor就是这样设置的,我也推荐这样,先有一个app(没有Frame),然后调用其他Frame。创建方法有两种:在最上方的 Palette中的New面板下面选择wx.app;或者在Editor中选择File菜单下面的New的wx.app。 

    我们可以在Editor中看到在Shell和Explorer旁边出来一个*(App1)*和*(Frame1)*。出现*表示还没有保存。这两项下面都有子面板Source,嗯,就是代码。好了,我们先保存一下。通过File-Save保存也可以,点击那个软盘图标保存也可以。 

2、然后我们可以在Frame中添加Panel(面板)或者Button(按钮)或者TextCtrl(文本控制)。Frame是框架的意思,有框架之后就可以添加任何东西进去。最先添加进去的是一个“底板”,通常会是Panel或者Windows之类的。这种“底板”添加进去之后就会自动填充满 Frame。 

    点击Frame,然后点击Editor中的Frame Desinger图标(快捷键是F12),看见深灰色的小格子,上面还有一个标题栏对不对?这个就是Frame!现在我们就可以往其中拖拽东西了。所有可以拖拽进去的东西都在上方的Palette中,有很多的哦,比如Containers/Layout(容器/布局)、Basic Controls(基本控件)、Buttons(按钮)、List Controls(列表控件)等等等等。 

    我们在Containers/Layout中选择第一个图标wx.Panel,左键点一下,嗯,变成按下状态了。然后再Frame中点一下,Yeah~添加进去了。为什么没充满整个Frame呢?别急,先点右上角的×关掉这个Frame,再点开这个Frame(F12忘了吗?),是不是填充满了呢?都是浅灰色的了。 

(关掉重新再开——这个技巧很重要,因为只有这样Boa Constructor才能识别出来。以后我们设置属性、调整大小等等操作也最好这样“关掉重新再开”一下) 

    我们把鼠标放到Frame上,能看到panel1,放到标题栏上能看到Frame1(或者你保存Frame的名字)。这个名字也可以改,左键点击,然后看看Inspector面板中的Constr属性页,Name一项就是名字。左键点击就可以修改,千万千万别改成中文、法文、日文、韩文,只能是英文!改好之后点击上面的刷新图标(Recreate selection)。也可以改位置,在Position下面修改;也也可以改大小,在Size下面修改;也也也可以改风格,在Style下面修改。 

    (其实这还是需要wxPython方面的知识的,看看wxPython in action这本书吧,可以还是英文的) 

    Inspector下面的Props属性页下面可以该更多的东西,比如背景颜色(BackgroundColour)、提示文字(ToolTipString)、字体(Font)等等。很有用的Sizer(大小管理器)也是在这个下面设置。 

   你发没发现很多关于文字设置前面都有一个u,这是unicode的缘故。也是我们安装wxPython-unicode版本的缘故,你可以在某些提示文字之类的地方输入中文,系统会自动转换成unicdoe码。 

   (关于unicode真是很复杂!!我曾经在windows下开发,没什么问题,但是放到Linux下,傻眼!所以如果你要做跨平台软件,好好了解一下unicode) 

    Inspector下面的Evts属性页就是“事件”。所有的可能的相关事件都在这下面。鼠标事件(MouseEvent)、KeyEvent(键盘事件)等等。通过这些事件,你可以调用其他函数,并完成其他功能(比如绘图、弹出提示框、跳转到其他页面等等等等)。“事件”对于wxPython很重要,因为它是“事件驱动型GUI”(这部分你不理解就不理解吧,呵呵,记住就行了,然后在开发中慢慢理解)。 

   Inspector下面的Objs属性页给出一个树状结构,告诉你什么包含什么,你可以选择其中的一个(比如Frame1),然后查看它对应的Constr/Props/Evts。 

3、下面让我们来添加一个按钮。点击最上面Palette中的Buttons,选择第一个图标wx.Button,按下,然后在Frame中的Panel中按下,看到Button1了吧。 

    然后我们可以修改其对应的各种属性。包括大小、位置、显示文字、样式等等。在什么地方改?刚才不是告诉你了吗?在左侧的Inspector下面改。 

    为什么Boa Constructor大家都感觉很容易呢?因为有些东西是可以直接拖拽所见即所得的。比如你可以试着直接用鼠标改变按钮的大小和位置 

    其他控件也基本类似,你可以试着添加各种各样的控件进去。其实Boa Constructor不包括所有wxPython中的控件,但是它包括了基本、普通、平常、我们大家会用到的控件。所以我们可以通过Boa Constructor来入门wxPython。 

4、让我们添加一个事件(Event)。还记得我说过“事件驱动型GUI”吗?让我们“驱动”一下我们的程序吧。 

    点击选中Button,在左侧的Inspector的Evts下面单击ButtonEvent,右侧出现wx.EVT_BUTTON,双击之,在下面出现一个wx.EVT_BUTTON——OnButton1Button。好了,点击上面的“对号”。 

   保存源文件。在源文件(Source面板下面)的最下方你能看到形如:   

def OnButton1Button(self, event): 
        event.Skip() 

这样的东东。在event.Skip()前面添加你想要的代码吧,比如:print u'haha',或者弹出一个提示面板:           

dlg = wx.MessageDialog(self,   u'yes', 
                                   u'You got it~', 
                                   wx.OK | wx.ICON_INFORMATION 
                                   ) 
dlg.ShowModal() 
dlg.Destroy() 

或者任何代码。 

(event.skip()表示将事件向下传递,你就别删它就行了) 

(我上面的弹出窗口代码其实也可以用Boa Constructor来创建一个wx.Dialog然后再调用之,但是我没有这么做,因为我觉得这样更方便。你以后也会发现更方便的一些东西,然后你会逐渐的跳出Boa Constructor了…………当然你跳不出wxPython的怀抱,呵呵) 

5、好了,万事大吉了!点击Editor页面下的Run Applictaion图标或者按下F9吧。运行下你的程序。当然,你必须在app为所选页面时才能运行程序。因为app是程序,frame不是。 

6、接下来我们可以添加其他frame,添加其他控件,添加其他module(模块),下面的路你自己走吧…… 

(我有个小建议,你试着去看一下Boa constructor的英文帮助,没有害处) 

目前我发现的Boa contructor会出现的问题: 

1、有时候Boa constructor会挂掉,只能强行关闭。通常这种情况都是程序有错误所造成的。 这个不能怪Boa constructor,你在IDLE中运行这些程序,也会假死。 有时候我也只能在命令行窗口中运行。 

2、Boa constructor不能实时刷新,我们必须点击刷新或提交按钮才能看到改动。 是的,就是这样。所以不要试图一次添加所有你能想到的东西,试着分几次来添加。 

3、中文目录的问题。 源程序文件无法运行、保存、

作者:andyliulin 发表于 2017/10/26 16:19:54  原文链接 https://blog.csdn.net/andyliulin/article/details/78355297
阅读:88
 
[转]使用Python开发windows桌面程序

使用Python开发windows桌面程序

一、开发前期准备

          1. boa-constructor-0.6.1.bin.setup.exe    

           #一个wxWidges的集成开发环境,简单如Delphi,可以直接拖拽控件,并且和其他集成环境不一样,   #它不与集成开发环境的MainLoop冲突,用pythonwin,pyScripter都会冲突,典型报错就是运行第二次 #程序的时候,直接导致集成开发环境的强制退出,因为MainLoop冲突了

          2. wxPython3.0-win64-3.0.2.0-py27.exe

wxPython2.8-win32-unicode-2.8.10.1-py26.exe   

          #wxPython库,提供了用C++写的windows组件库wx

          3. py2exe-0.6.9.win32-py2.6.exe      

          #打包发布工具,将python写的windows程序或控制台程序直接打包成exe可执行文件,供用户使用

          上述三个软件都是基于python2.6的,软件版本一定要配套,因为他们默认的安装路径和python版本有关系,否则会找不到相关库的存在。

二、开发

        软件安装完以后,打开BOA,哇塞,拖控件真简单,而且属性啥的和Dephi差不多,你只要改改属性,代码会自动生成,它生成的控件很漂亮,记得以前用 

        C++6.0开发软件的时候,那个控件真丑,都需要我重新用控件库去绑定优化,现在不用了,BOA生成的控件,视觉效果相当好,开发软件速度相当快,再也

        不用为了软件界面而写太多代码,也不用为了生成一个小程序而生成了很多的文件,python开发的程序,没有多余的文件,而且文件很小。

三、发布

       很多人都想在自己的软件程序写好以后,发布给其他人使用,一方面不希望自己的代码泄露,一方面以此显出一点成就感,呵呵,可以使用py2exe将你的

       windows程序打包发布了!当然,首先你得写个如下的setup.py文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from  distutils.core  import  setup
   import  py2exe
  includes  =  [ "encodings" "encodings.*" ]
  options  =  { "py2exe" :
              {    "compressed" 1 ,
                  "optimize" 2 ,
                  "includes" : includes,
                  "bundle_files" 1
              }
            }
  setup(
      version  =  "0.1.0" ,
      description  =  "windows program" ,
      name  =  "winsetup" ,
      options  =  options,
      zipfile = None ,
      windows = [{ "script" "myscript.py" "icon_resources" : [( 1 "PyCrust.ico" )] }],
   )

你可以在命令行下运行: python setup.py py2exe,那么你就会发现你的应用程序出现在dist文件夹里了,恭喜你,完成了windows应用程序的开发!

作者:andyliulin 发表于 2017/10/26 15:10:52  原文链接 https://blog.csdn.net/andyliulin/article/details/78354128
阅读:390
 
[转]一步步用python制作游戏外挂

一步步用python制作游戏外挂

玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下如何用python来制作一个外挂。。。。


我打开了4399小游戏网,点开了一个不知名的游戏,唔,做寿司的,有材料在一边,客人过来后说出他们的要求,你按照菜单做好端给他便好~ 为啥这么有难度?8种菜单记不清,点点就点错,鼠标还不好使肌肉劳损啥的伤不起啊……


首先要声明,这里的游戏外挂的概念,和那些大型网游里的外挂可不同,不能自动打怪,不能喝药不能躲避GM…… 那做这个外挂有啥用?问的好,没用,除了可以浪费你一点时间,提高一下编程技术,增加一点点点点点点的做外挂的基础以外,毫无用处,如果您是以制作一个惊天地泣鬼神不开则已一开立刻超神的外挂为目标过来的话,恐怕要让您失望了,请及早绕道。我的目的很简单,就是自动玩这款小游戏而已。


工具的准备


这篇文章需要您有Python基础,我不会讲解Python语法啥的~


Python

需要安装autopy和PIL以及pywin32包。autopy是一个自动化操作的python库,可以模拟一些鼠标、键盘事件,还能对屏幕进行访问,本来我想用win32api来模拟输入事件的,发现这个用起来比较简单,最厉害的是它是跨平台的,请搜索安装;而PIL那是大名鼎鼎了,Python图像处理的No.1,下面会说明用它来做什么;pywin32其实不是必须的,但是为了方便(鼠标它在自己动着呢,如何结束它呢),还是建议安装一下,哦对了,我是在win平台上做的,外挂大概只有windows用户需要吧?

截屏和图像处理工具

截屏是获取游戏图像以供分析游戏提示,其实没有专门的工具直接Print Screen粘贴到图像处理工具里也可以。我用的是PicPick,相当好用,而且个人用户是免费的;而图像处理则是为了获取各种信息的,我们要用它得到点菜图像后保存起来,供外挂分析判断。我用的是PhotoShop… 不要告诉Adobe,其实PicPick中自带的图像编辑器也足够了,只要能查看图像坐标和剪贴图片就好饿了,只不过我习惯PS了~

编辑器

这个我就不用说了吧,写代码得要个编辑器啊!俺用VIM,您若愿意用写字板也可以……

原理分析


外挂的历史啥的我不想说啦,有兴趣请谷歌或度娘(注:非技术问题尽可以百度)。


看这个游戏,有8种菜,每种菜都有固定的做法,顾客一旦坐下来,头顶上就会有一个图片,看图片就知道他想要点什么菜,点击左边原料区域,然后点击一下……不知道叫什么,像个竹简一样的东西,菜就做完了,然后把做好的食物拖拽到客户面前就好了。


顾客头上显示图片的位置是固定的,总共也只有四个位置,我们可以逐一分析,而原料的位置也是固定的,每种菜的做法更是清清楚楚,这样一来我们完全可以判断,程序可以很好的帮我们做出一份一份的佳肴并奉上,于是钱滚滚的来:)


autopy介绍


github上有一篇很不错的入门文章,虽然是英文但是很简单,不过我还是摘几个这次用得到的说明一下,以显示我很勤劳。


移动鼠标


import autopy

autopy.mouse.move(100, 100) # 移动鼠标

autopy.mouse.smooth_move(400, 400) # 平滑移动鼠标(上面那个是瞬间的)

这个命令会让鼠标迅速移动到指定屏幕坐标,你知道什么是屏幕坐标的吧,左上角是(0,0),然后向右向下递增,所以1024×768屏幕的右下角坐标是……你猜对了,是(1023,767)。


不过有些不幸的,如果你实际用一下这个命令,然后用autopy.mouse.get_pos()获得一下当前坐标,发现它并不在(100,100)上,而是更小一些,比如我的机器上是(97,99),和分辨率有关。这个移动是用户了和windows中mouse_event函数,若不清楚api的,知道这回事就好了,就是这个坐标不是很精确的。像我一样很好奇的,可以去读一下autopy的源码,我发现他计算绝对坐标算法有问题:


point.x *= 0xFFFF / GetSystemMetrics(SM_CXSCREEN);

这里先做除法再做乘法,学过一点计算方法的就应该知道对于整数运算,应该先乘再除的,否则就会产生比较大的误差,如果他写成:


point.x = point.x * 0xffff / GetSystemMetrics(SM_CXSCREEN);

就会准多了,虽然理论上会慢一点点,不过我也懒得改代码重新编译了,差几个像素,这里对我们影响不大~咱要吸取教训呀。


点击鼠标


import autopy

autopy.mouse.click() # 单击

autopy.mouse.toggle(True) # 按下左键

autopy.mouse.toggle(False) # 松开左键

这个比较简单,不过记得这里的操作都是非常非常快的,有可能游戏还没反应过来呢,你就完成了,于是失败了…… 所以必要的时候,请sleep一小会儿。


键盘操作


我们这次没用到键盘,所以我就不说了。

怎么做?分析顾客头上的图像就可以,来,从获取图像开始吧~




打开你钟爱的图像编辑器,开始丈量吧~ 我们得知道图像在屏幕的具体位置,可以用标尺量出来,本来直接量也是可以的,但是我这里使用了画面左上角的位置(也就是点1)来当做参考位置,这样一旦画面有变动,我们只需要修改一个点坐标就好了,否则每一个点都需要重新写一遍可不是一件快乐的事情。


看最左边的顾客头像上面的图像,我们需要两个点才可确定这个范围,分别是图像的左上角和右下角,也就是点2和点3,。后面还有三个顾客的位置,只需要简单的加上一个增量就好了,for循环就是为此而生!


同样的,我们原料的位置,“竹席”的位置等等,都可以用这种方法获得。注意获得的都是相对游戏画面左上角的相对位置。至于抓图的方法,PIL的ImageGrab就很好用,autopy也可以抓图,为什么不用,我下面就会说到。


分析图像


我们这个外挂里相当有难度的一个问题出现了,如何知道我们获得的图像到底是哪一个菜?对人眼……甚至狗眼来说,这都是一个相当easy的问题,“一看就知道”!对的,这就是人比机器高明的地方,我们做起来很简单的事情,电脑却傻傻分不清楚。

autopy图像局限


如果你看过autopy的api,会发现它有一个bitmap包,里面有find_bitmap方法,就是在一个大图像里寻找样品小图像的。聪明的你一定可以想到,我们可以截下整个游戏画面,然后准备所有的菜的小图像用这个方法一找就明白哪个菜被叫到了。确实,一开始我也有这样做的冲动,不过立刻就放弃了……这个方法查找图像,速度先不说,它有个条件是“精确匹配”,图像上有一个像素的RGB值差了1,它就查不出来了。我们知道flash是矢量绘图,它把一个点阵图片显示在屏幕上是经过了缩放的,这里变数就很大,理论上相同的输入相同的算法得出的结果肯定是一致的,但是因为绘图背景等的关系,总会有一点点的差距,就是这点差距使得这个美妙的函数不可使用了……


好吧,不能用也是好事,否则我怎么引出我们高明的图像分析算法呢?


相似图像查找原理


相信你一定用过Google的“按图搜图”功能,如果没有,你就落伍啦,快去试试!当你输入一张图片时,它会把与这张图相似的图像都给你呈现出来,所以当你找到一张中意的图想做壁纸又觉得太小的时候,基本可以用这个方法找到合适的~


我们就要利用和这个相似的原理来判断用户的点餐,当然我们的算法不可能和Google那般复杂,知乎上有一篇很不错的文章描述了这个问题,有兴趣的可以看看,我直接给出实现:


   def get_hash(self, img):

       image = img.resize((18, 13), Image.ANTIALIAS).convert("L")

       pixels = list(image.getdata())

       avg = sum(pixels) / len(pixels)

       return "".join(map(lambda p : "1" if p > avg else "0", pixels))

因为这是类的一个方法,所以有个self参数,无视它。这里的img应该传入一个Image对象,可以使读入图像文件后的结果,也可以是截屏后的结果。而缩放的尺寸(18,13)是我根据实际情况定的,因为顾客头像上的菜的图像基本就是这个比例。事实证明这个比例还是挺重要的,因为我们的菜有点儿相似,如果比例不合适压缩后就失真了,容易误判(我之前就吃亏了)。


得到一个图片的“指纹”后,我们就可以与标准的图片指纹比较,怎么比较呢,应该使用“汉明距离”,也就是两个字符串对应位置的不同字符的个数。实现也很简单……


   def hamming_dist(self, hash1, hash2):

       return sum(itertools.imap(operator.ne, hash1, hash2))

好了,我们可以用准备好的标准图像,然后预先读取计算特征码存储起来,然后再截图与它们比较就好了,距离最小的那个就是对应的菜,代码如下:


   def order(self, i):

       l, t = self.left + i * self.step, self.top

       r, b = l + self.width, t + self.height

       hash2 = self.get_hash(ImageGrab.grab((l, t, r, b)))

       (mi, dist) = None, 50

       for i, hash1 in enumerate(self.maps):

           if hash1 is None:

               continue

           this_dist = self.hamming_dist(hash1, hash2)

           if this_dist < dist:

               mi = i

               dist = this_dist

       return mi

这里有一个50的初始距离,如果截取图像与任何菜单相比都大于50,说明什么?说明现在那个位置的图像不是菜,也就是说顾客还没坐那位置上呢,或者我们把游戏最小化了(老板来了),这样处理很重要,免得它随意找一个最相近但又完全不搭边的菜进行处理。


自动做菜


这个问题很简单,我们只需要把菜单的原料记录在案,然后点击相应位置便可,我把它写成了一个类来调用:


class Menu:

   def __init__(self):

       self.stuff_pos = []

       self.recipes = [None] * 8

       self.init_stuff()

       self.init_recipe()

   def init_stuff(self):

       for i in range(9):

           self.stuff_pos.append( (L + 102 + (i % 3) * 42, T + 303 + (i / 3) * 42) )

   def init_recipe(self):

       self.recipes[0] = (1, 2)

       self.recipes[1] = (0, 1, 2)

       self.recipes[2] = (5, 1, 2)

       self.recipes[3] = (3, 0, 1, 2)

       self.recipes[4] = (4, 1, 2)

       self.recipes[5] = (7, 1, 2)

       self.recipes[6] = (6, 1, 2)

       self.recipes[7] = (8, 1, 2)

   def click(self, i):

       autopy.mouse.move(self.stuff_pos[i][0] + 20, self.stuff_pos[i][1] + 20)

       autopy.mouse.click()

   def make(self, i):

       for x in self.recipes[i]:

           self.click(x)

       autopy.mouse.move(L + 315, T + 363)

       autopy.mouse.click()


这是本外挂中最没技术含量的一个类了:)请原谅我没有写注释和doc,因为都很简单,相信你懂得。

作者:andyliulin 发表于 2017/10/26 11:51:41  原文链接 https://blog.csdn.net/andyliulin/article/details/78352027
阅读:490
 
[转]Python Boa-constructor的使用

上篇介绍了Python的环境搭建,主要是开发环境的介绍,本篇主要介绍Python的GUI开发工具Boa-constructor的使用和我们的程序开发完毕后的打包问题,本篇还会介绍在Python中我们如何使用第三方扩展库。

 

一、如何选择GUI开发工具

Python的gui开发工具有很多,有Thiner,WxPython,PyQt,pyGtk,Jython,MFC,IronPython,PythonCard,Dabo,AnyGui,Wpy等,简直有太多了,选几种用的比较多的简单介绍一下,目前我用的是WxPyton。

Tkinter

Tkinter 似乎是与tcl语言同时发展起来的一种界面库。tkinter是python的配备的标准gui库,也是opensource的产物。Tkinter可用 于windows/linux/unix/macintosh操作系统,而且显示风格是本地化的。Tkinter用起来非常简单,python自带的 IDLE就是采用它写的。除此外,tkinter的扩展集pmw和Tix功能上都要相对它强大,但tkinter却是最基本的。我认为,在用python 做gui开发,tkinter是最基本的知识,所以这个环节是必须要学习的。你或许在以后的开发中并不常用tkinter,但是一些小型的应用上面,他还 是很有用的,而且开发速度也很快。

WxPython

WxWidgets应该算是近几年了比较流行的GUI跨平台开发技术了。 wxWidgets有不同的版本应用,有c++的,也有basic的,现在在python上面也有较好的移植。wxpython的功能上面要强于 tkinter,她提供了超过200个类,面向对象的编程风格,设计的框架类似于MFC。对于大型GUI应用上面,wxPython还是具有很强的优势 的。boa constructor可以帮助我们快速可视地构建wxwidgets界面。

Jython

尝试过用python访问java类库吗,那么就用jython吧。jython其实可以认为是另外一个python开发环境,基于java的,但是大多数 的CPython调用jython下还是可以的。你可以在jython环境下像使用java一样来通过python的语法来调用java语言,真的很酷。

MFC

Windows Pywin32允许你像VC一样的形式来使用PYTHON开发win32应用。代码风格可以类似win32 sdk,也可以类似MFC,由你选择。如果你仍不放弃vc一样的代码过程在python下,那么这就是一个不错的选择。

WPY

MFC风格的Gui开发库,代码风格也类似于MFC,仅管如此,你依旧可以使用这个库来开发GUI应用,而不用担心平台移植的问题。

IronPython

如果你要想开发.net下面的应用的话,那么IronPython就是你的选择,与jython有点类似,他同样支持标准的python模块,但同样增加了 对.net库的支持。你也可以理解为他是另一个python开发环境。你可以非常方便地使用python语法进行.net应用的开发,这一点听起来真的挺 有意思。

  上面的内容是Google找的,总之,介绍了这么多,我个人意见是,如果你是java用户,你可以选择用jython;如果你是.net用户,那么就用ironPython吧。如果你对Visual C++很熟悉,那么你可以使用MFC,WPY或是wxPython,当然我更建议wxPython了。当然,我认为对于tkinter是每一个原来搞C的 人都应该了解和学习的GUI库,因为她很轻便,小型应用就可以使用她来搞定,而对于较大型应用可以采用pyGtk,pyQt,WxPython或 PythonCard来搞定,这样的话,既可以注重知识的衔接性,也可以快速进行开发了。

 

二、Python扩展库

  如果说强大的标准库奠定了python发展的基石,丰富的第三方库则是python不断发展的保证,随着python的发展一些稳定的第三库被加入到了标准库里面,可以在http://pypi.python.org/pypi?%3Aaction=index找到非常多的Python扩展库,其中下面讲的wxPython就是其中之一。我猜你喜欢Python的其中一个理由一定是它的非常多的拓展库,下面列出了常用的Python第三方库。

Django    开源web开发框架,它鼓励快速开发,并遵循MVC设计,我以前用过很多次,比较好用,开发周期短。

ActiveGrid  企业级的Web2.0解决方案。

Karrigell     简单的Web框架,自身包含了Web服务,py脚本引擎和纯python的数据库PyDBLite 。

webpy    一个小巧灵活的Web框架,虽然简单但是功能强大 。

CherryPy    基于Python的Web应用程序开发框架 。

Pylons    基于Python的一个极其高效和可靠的Web开发框架 。

Zope     开源的Web应用服务器。

TurboGears   基于Python的MVC风格的Web应用程序框架。

Twisted     流行的网络编程库,大型Web框架。

Quixote     Web开发框架。

Matplotlib  用Python实现的类matlab的第三方库,用以绘制一些高质量的数学二维图形 。

SciPy     基于Python的matlab实现,旨在实现matlab的所有功能 。

NumPy     基于Python的科学计算第三方库,提供了矩阵,线性代数,傅立叶变换等等的解决方案 。

PyGtk      基于Python的GUI程序开发GTK+库。

PyQt     用于Python的QT开发库。

WxPython     Python下的GUI编程框架,与MFC的架构相似。

Tkinter      Python下标准的界面编程包。

BeautifulSoup 基于Python的HTML/XML解析器,简单易用。

PIL        基于Python的图像处理库,功能强大,对图形文件的格式支持广泛。

MySQLdb      用于连接MySQL数据库。

cElementTree高性能XML解析库,Py2.5应该已经包含了该模块,因此不算一个第三方库了。

PyGame       基于Python的多媒体开发和游戏软件开发模块。

Py2exe     将python脚本转换为windows上可以独立运行的可执行程序。

pefile       Windows PE文件解析器

 

三、boa-constructor的使用

我是一个.Net开发人员,我之所以不选择IronPython的原因是不想再让客户端去安装.net framework这么庞大的库,所以我选择了wxPython。wxPython的介绍上面有,我个人觉得wxPython还是比较容易学习的。因为有API可以供我们查阅,它和MFC有很多相同或者相似的地方,我个人还是比较喜欢,或者可以我没有去尝试其他的库吧,因为我发现我已经喜欢上它了。

和wxPython库搭配的开发IDE 也有很多,spe, boa-constructor,eclipse+pydev. 个人建议选择boa-constructor 和 Eclipse+Pydev 搭配。其中boa-constructor用来开发界面,Eclipse+Pydev 用来编写代码。

boa-constructor个人感觉还是非常不错的,刚开始可能会不懂,比较吃力一点,但是等你学会使用了以后相信你会喜欢上它的。下载地址:点击此处下载。  安装boa-constructor之前请确定你的机器上已经安装了wxPython 和Python。目前需要wxPython 2.4.0.7 or higher and Python 2.1 or higher.

boa-constructor 安装完毕后桌面或者开始菜单并没有它的启动快捷方式或者是目录。你需要在你的Python安装目录下找到Python26\Lib\site-packages\boa-constructor 这个路径下Boa.py文件。Boa.py为boa-constructor启动文件。

1.双击Boa.py文件加载完毕后会出现如下界面。

                     

  1. 其中1中的最上方一个窗口为boa-constructor的工具条,里面有基本的一些控件等。见下图:

 

其中Python,wxPython, boa-constructor 的帮助文档你也会在这个工具条中找到,这几个文档能为你后面的开发工作起到很大的作用。

  1. 下面的为检视器窗口,它的主要作用相当于VS中的属性窗口,包括一些控件的属性,事件等。

 

  1. 主工作区域窗口就不进行介绍了,都是中文显示。如下图:

 

 

 

下面简单介绍一下如何新建工程。

 

  1. 点击最上方工具条视图中的第五个图标。

 

 

  1. 点击之后,主编辑器窗口会出来2个未保存的新建文件(*App1*,*Frame1*),其中App1为程序的启动文件,里面包含应用程序初始化的一些信息以及Main函数,Frame1为生成的一个新页面,接下面我们需要做的就是绘制界面了。

 

 

  1. 切换到Frame1选项卡,然后按快捷键F12或者点击框架设计器按钮(),此时会弹出Frame1的设计界面,如下图:

 

 

  1. 从工具条拖拉我们需要的控件到设计器区域,我拖拽了一个Button和一个Label,另外我修改了程序的标题。如下图:

 

 

  1. WxPython也是采用的事件驱动的模型,在左边的检视器窗口我们可以看到某一个控件的信息等,包括该控件的基本属性信息,以及构造该空间所需的必须属性和可设置属性,另外还有就是该控件所拥有的事件,如下图:

 

 

  1. 如何在wxPython中添加事件?其实很简单,打开检视器窗口,切换到Evts选项卡,左边菜单栏会列出该控件所具有的事件,然后右边双击就可以了,最后,别忘了对你的更改进行提交(上面对号),如下图:

 

 

  1. 下面为Boa为我们生成的界面代码,我们的后台逻辑代码可以在Eclipse中利用其更好的代码提示为我们提供便利。
复制代码
  1 # -*- coding: gb2312 -*-
  2 
  3 #Boa:Frame:Frame1
  4 
  5  
  6 
  7 import wx
  8 
  9  
 10 
 11 def create(parent):
 12 
 13     return Frame1(parent)
 14 
 15  
 16 
 17 [wxID_FRAME1, wxID_FRAME1BUTTON1, wxID_FRAME1LABEL1,
 18 
 19 ] = [wx.NewId() for _init_ctrls in range(3)]
 20 
 21  
 22 
 23 class Frame1(wx.Frame):
 24 
 25     def _init_ctrls(self, prnt):
 26 
 27         # generated method, don't edit
 28 
 29         wx.Frame.__init__(self, id=wxID_FRAME1, name='', parent=prnt,
 30 
 31               pos=wx.Point(426, 280), size=wx.Size(400, 250),
 32 
 33               style=wx.DEFAULT_FRAME_STYLE,
 34 
 35               title=u'\u6211\u7684\u7b2c\u4e00\u4e2aWxPython\u7a0b\u5e8f')
 36 
 37         self.SetClientSize(wx.Size(384, 212))
 38 
 39  
 40 
 41         self.Label1 = wx.StaticText(id=wxID_FRAME1LABEL1,
 42 
 43               label=u'\u6211\u559c\u6b22BOA', name=u'Label1', parent=self,
 44 
 45               pos=wx.Point(64, 24), size=wx.Size(97, 25), style=0)
 46 
 47         self.Label1.SetBackgroundColour(wx.Colour(228, 252, 230))
 48 
 49         self.Label1.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.NORMAL, False,
 50 
 51               u'\u5fae\u8f6f\u96c5\u9ed1'))
 52 
 53  
 54 
 55         self.button1 = wx.Button(id=wxID_FRAME1BUTTON1,
 56 
 57               label=u'\u70b9\u51fb\u6309\u94ae', name='button1', parent=self,
 58 
 59               pos=wx.Point(192, 24), size=wx.Size(75, 24), style=0)
 60 
 61         self.button1.Bind(wx.EVT_BUTTON, self.OnButton1Button,
 62 
 63               id=wxID_FRAME1BUTTON1)
 64 
 65  
 66 
 67     def __init__(self, parent):
 68 
 69         self._init_ctrls(parent)
 70 
 71  
 72 
 73     def OnButton1Button(self, event):
 74 
 75  
 76 
 77         fileDlg = wx.FileDialog(self,u'FileDialog',u'choose file')
 78 
 79         re = fileDlg.ShowModal()
 80 
 81         if re==5100:
 82 
 83             sr= fileDlg.GetFilename()
 84 
 85             print sr
 86 
 87             self.ShowDlg(sr)
 88 
 89             #todo:
 90 
 91         event.Skip()
 92 
 93        
 94 
 95     def ShowDlg(self,content=""):
 96 
 97         dlg = wx.MessageDialog(self,content,
 98 
 99                                    '确认框',
100 
101                                    wx.OK | wx.ICON_INFORMATION
102 
103                                    )
104 
105         dlg.ShowModal()
复制代码

 

 

至此,BOA的使用简单介绍到这里,后面更多的探索还要自己去慢慢摸索。

作者:andyliulin 发表于 2017/10/26 11:46:20  原文链接 https://blog.csdn.net/andyliulin/article/details/78351958
阅读:162
 
[转]Memcached和Memcache安装(64位win7)
Memcached和Memcache安装(64位win7)一、Memcached和Memcache的区别: 网上关于Memcached和Memcache的区别的理解众说纷纭,我个人的理解是:Memcached是一个内存缓存系统,而Memcache是php的一个扩展,是php用于操作和管理Memcached的工具。如果安装了Memcached但没有安装Memcache,php无法操控Memcached,但是可以使用命令行来操控Memcached;如果安装了Memcache却没安装Memcached,则无法使用。只有同时安装了Memcached和Memcache,才能在PHP中使用Memcached。 以上仅代表个人观点。 网上关于Memcached和Memcache的安装教程有很多,下面是我参考网上教程并动手操作后总结出来的方法,注意,我的操作是基于64位win7系统的。 二、安装memcached:1. 下载地址:http://pan.baidu.com/s/1gdKbp8R (这是在网上找的下载地址,我试过,可以下载)2. 解压下载后的文件,把它放到一个目录中,如D:\memcached。3. 打开cmd,进入memcached解压后存放的目录,运行命令: memcached.exe -d install 如果没有意外的话已经安装成功了。 (目录中应该有memcached.exe这个文件)4. 测试是否安装成功: 打开cmd,进入memcached解压后存放的目录,运行命令: memcached -h,若安装成功,会出现如下界面: 5. 启动memcached: 打开cmd,进入memcached解压后存放的目录,运行命令: memcached.exe -d start 这时memcached已经启动,在任务管理器中可以看到这个进程: 6. 连接Memcached: 打开cmd,运行命令: telnet 127.0.0.1 11211 即可连接Memcached。 注:win7中可能会出现“telnet’不是内部或外部命令”的错误,这是因为系统中默认没有安装telnet的缘故,可在“控制面板”->“程序”->“程序和功能”->“打开或关闭Windows功能”中打开“Telnet客户端”。 三、安装memcache的php扩展:1. 下载地址:http://windows.php.net/downloads/pecl/releases/memcache/3.0.8/ (注意:要下载对应php版本和系统位数的dll文件)2. 把php_memcache.dll放到php的ext目录下,如: D:\wamp\bin\php\php5.5.12\ext3. 打开php.ini,在extension处添加一行代码: extension=php_memcache.dll4. 重启服务器。5. 查看php的extensions服务,php_memcache现在应该可以使用了,即处于打钩状态,之 前是处于叹号状态的,若还处于叹号状态,用鼠标在上面点击一下就好了。6. 通过代码测试php是否已经可以使用memcached: $memcache = new Memcache; $memcache->connect("127.0.0.1",11211); echo "Memcached's version: " . $memcache->getVersion() . "
"; $data = array( 'url' => "http://www.cnblogs.com/wujuntian/", 'name' => "编程人,在天涯" ); $memcache -> set("info",$data,0,10); $info = $memcache->get("info"); echo '
';

  print_r($info);

 

若能打印出memcache中的信息,则说明php的memcache扩展已安装成功且能使用了!

 

注意:运行代码时若出现错误Fatal error: Class 'Memcache' not found,有可能是下载的 

      php_memcache.dll文件与php版本不符,或者与系统位数不符。

      我的是64位系统,php版本是5.5.12,下载的是php_memcache-3.0.8-5.5-ts-vc11-x64.zip

      这个文件。

 
作者:andyliulin 发表于 2017/10/24 18:03:26  原文链接 https://blog.csdn.net/andyliulin/article/details/78332562
阅读:102
 
[转]在windows下安装运行disconf

在windows下安装运行disconf


一.环境准备

  1.下载disconf源码 (本文以2.6.36为例)

    https://github.com/knightliao/disconf 

  2.下载nginx1.10.2(windows版)

    http://nginx.org/download/nginx-1.10.2.zip

  3.安装好tomcat

  4.安装好redis

  5.安装好zookeeper,可参见http://www.cnblogs.com/mrluo735/p/5345879.html

 

二.修改配置

  1.disconf配置修改

      1).jdbc-mysql.properties  修改数据库连接

      2).redis-config.properties  修改redis连接

      3).zoo.properties      修改zookeeper连接

      4).将application-demo.properties 改名为 application.properties

  2.打包disconf-web

    生成的最终target应当如下

      

  3.构建war包

    新建war文件夹,然后分别将war包和相关文件夹从disconfig-web及生成的target下copy出来,最终结果如下,tmp文件夹可以忽略

    

  4.修改tomcat配置

    打开/conf/server.xml文件

    在Host节点里增加

1
<Context path= ""  docBase= "D:\\javaspace\\apache-tomcat\\apache-tomcat-8.0.36\\webapps\\disconfig-rd\\war" ></Context>

    重启tomcat

  5.修改nginx配置

    打开/conf/nginx.conf文件

    将nginx默认端口改为8000(因为默认端口被iis占用)

    增加server节点如下    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
     listen          8082;
     server_name     localhost;
     
     location / {
         root D:\javaspace\apache-tomcat\apache-tomcat-8.0.36\webapps\disconfig-rd\war\html;
         if  ($query_string) {
             expires max;
         }
     }
     
     location ~ ^/(api|export) {
         proxy_pass_header Server;
         proxy_set_header Host $http_host;
         proxy_redirect off;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Scheme $scheme;
         proxy_pass http: //127.0.0.1:8080;
     }
}

    重启nginx

 

三.安装disconf数据库

  可以参考disconf-web/sql/readme.md

  注意顺序执行 0-init_table.sql,1-init_data.sql,201512/20151225.sql,20160701/20160701.sql

作者:andyliulin 发表于 2017/10/21 17:53:05  原文链接 https://blog.csdn.net/andyliulin/article/details/78305230
阅读:361
 
[转]disconf-web在windows下的部署
disconf,全称 Distributed Configuration Management Platform(分布式配置管理平台),是java下的一个开源项目,其地址为:https://github.com/knightliao/disconf

因为作者关于disconf-web项目的部署部分说明完全基于linux,笔者本机不想装个虚拟机再装Linux,所以折腾了N长时间,还找了Java方面的相关人员帮助,好不容易才在windows上成功的部署了web项目,故而在此记录下

disconfig_web的部署说明地址为:https://github.com/knightliao/disconf/tree/master/disconf-web#how-to-deploy

必须软件安装

1、Tomcat ,下载地址:http://tomcat.apache.org/ ,安装及配置(含java):http://jingyan.baidu.com/article/624e7459a7d6e734e9ba5a70.html

2、Nginx,下载地址:http://nginx.org/en/download.html,安装及配置:http://blog.163.com/njut_wangjian/blog/static/1657964252013327103716818/,这里因为本机已经装了IIS,所以配置上将Nginx的端口设置成了8081

3、zookeeeper,下载地址:https://zookeeper.apache.org/releases.html#download,安装及配置:中文版英文版,这里我部署了三个服务端,配置如下:

物理结构如下:


4、mysql,本机已安装,忽略此步

5、redis,局域网服务器已安装,忽略此步


项目配置修改

此处按帮助说明修改成你实际的配置即可,这里忽略说明


将disconf-web打包成war包

因为没Linux,这里就跟文档上描述的不一样了,下载IdeaIU,安装后,在IDE中打开disconf-master下的pom.xml,当项目加载完成后,选择disconfig-web项目,在工具栏选择  Build -- Build Artifacts...,单击All,之后就是等着maven下载,以及war包生成了

生成的最终target应当如下


生成的结果看起来跟帮助说明中的不一样,但没关系,我们手工调整,先建立个war文件夹,然后分别将war包和相关文件夹从disconfig-web及生成的target下copy出来,最终结果如下,tmp文件夹可以忽略


将你修改的项目配置文件复制并覆盖 WEB-INF\classes 下的同名文件,然后修改Tomact的配置,在Host下增加Context配置,其docBase配置为你的war文件夹物理路径,举例来说我本机是配置成了 C:\\apache-tomcat-8.0.35\\webapps\\disconfig-rd\\war,注意这里反斜杠在xml中要配置成双反斜杠,Tomact端口部分我没变动,还是8080


MySql数据还原

按帮助说明一步步还原即可,此处忽略


Nginx部署

与帮助文档不同的地方在于:去掉了 upstream disconf,将listen端口设置成了8082(因为8081被我设置给了nginx自身),将root修改成了自己的物理路径,最重要的是将proxy_pass修改成了 http://127.0.0.1:8080

[html]  view plain  copy
  1. listen       8082;  
  2. server_name  localhost;  
  3.   
  4. #charset koi8-r;  
  5.   
  6. #access_log  logs/host.access.log  main;  
  7.   
  8. location / {  
  9.     root C:\apache-tomcat-8.0.35\webapps\disconfig-rd\war\html;  
  10.     if ($query_string) {  
  11.         expires max;  
  12.     }  
  13. }  
  14.   
  15. location ~ ^/(api|export) {  
  16.     proxy_pass_header Server;  
  17.     proxy_set_header Host $http_host;  
  18.     proxy_redirect off;  
  19.     proxy_set_header X-Real-IP $remote_addr;  
  20.     proxy_set_header X-Scheme $scheme;  
  21.     proxy_pass http://127.0.0.1:8080;  
  22. }  
依照上述步骤做完之后,依次开启各种服务,然后在地址栏中输入 http://localhost:8082 即可看到disconfig-web的界面了
作者:andyliulin 发表于 2017/10/21 17:51:34  原文链接 https://blog.csdn.net/andyliulin/article/details/78305219
阅读:319
 
[转]nodejs破解验证码

nodejs破解验证码


说明

node项目,实现了从pc网站抓取登录接口,获得验证码,并自动破解验证码,最终实现用手机自动登录pc网站。简单点就是
用手机重新定义UI,调用爬来的pc接口。接口验证码都好获取,验证如何自动破解呢?

实现

设计到验证码破解,网上node能搜出来的结果很少,都是java之类的,主流的组件叫 tesseract
但是nodejs项目里如何引用呢?我们走起

  • install(linux centos 6.5)

我们的运行环境是linux centos 6.5,首先谷歌了一个tesseract的安装教程,教程有坑,下面分享实际安装步骤

1、install gcc

 
          
1
 
          
yum install gcc gcc-c++ make

2、install dependent packages 依赖包

 
          
1
2
 
          
yum install autoconf automake libtool
yum install libjpeg-devel libpng-devel libtiff-devel zlib-devel

3、install leptonica

 
          
1
2
3
4
5
6
 
          
wget http://www.leptonica.org/source/leptonica-1.68.tar.gz
tar -xvzf leptonica-1.68
cd leptonica-1.68
./configure
make
make install

4、install tesseract 需要翻墙

 
          
1
2
3
4
5
6
7
8
 
          
wget http://tesseract-ocr.googlecode.com/files/tesseract-3.01.tar.gz
tar -xvzf tesseract-3.01.tar.gz
cd tesseract-3.01
./autogen.sh
./configure
make
make install
ldconfig

有需要的可以去我网盘下载([链接:]http://pan.baidu.com/s/1o8gCD1g 密码:ngno)

5、intall tesseract language package 语言包,需要翻墙

 
          
1
2
3
4
5
6
 
          
wget http://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.01.eng.tar.gz
tar -xvzf tesseract-ocr-3.01.eng.tar.gz
cd tesseract-ocr
sudo cp -r tessdata/* /usr/local/share/tessdata/
ln -fs /usr/local/bin/tesseract /usr/bin/tesseract
export TESSDATA_PREFIX=/usr/local/share/

有需要的可以去我网盘下载([链接:]http://pan.baidu.com/s/1o8gCD1g 密码:ngno)

6、测试

test

 
          
1
 
          
tesseract test.jpg out

如果输出:Tesseract Open Source OCR Engine v3.01 with Leptonica就说明安装没有问题了。

out

 
          
1
 
          
vim out.text

6152 完全正确

  • node调用

经过查找我们找到了tesseract的node包,node-tesseract

1、install

 
          
1
 
          
npm install node-tesseract --save

2、引用

 
          
1
 
          
const tesseract = require('node-tesseract');

3、调用

 
          
1
2
3
4
5
6
7
8
9
10
 
          
/// gif is converted by a gif which getted from a pc website
tesseract.procsss(gif,
function (err, text) {
console.log('the qrcode is ',text)
if (err) {
cb('error');
} else {
cb(text.replace(/\n/g, '')); // 去除空白
}
});

说明下,tesseract破解的时候建议用gif,或者png,不要用gif,因为gif会提示你报错(no pix returned)。
所以最好破解前将图片格式转换下,比如使用imagemagick

4、测试

和单独执行tesseract命令结果一样

最后

由于这个pc站的验证码纹理少干净,所以破解率很高,如果是有纹理干扰的就会下降,当然也不是没有办法提升,
可以通过机器训练来提高,具体教程可参考这位同学的博客

作者:andyliulin 发表于 2017/10/18 16:34:28  原文链接https://blog.csdn.net/andyliulin/article/details/78274535
阅读:166
 
[转]docker+jenkins+seneca构建去集中化微服务架构

前言

在微服务架构中,服务发现一直是一件比较复杂的事。而且服务发现式的架构处理不好,容易产生集中化。同时,微服务的提供,不可避免的需要一些负载均衡方案,实现服务的高可用和可扩展,这无疑增加了很多复杂度。

笔者认为,使用异步、基于消息的方式,可能更适合微服务架构。

基于消息的微服务架构,对于所有微服务的部署条件非常简单,只需要能访问到消息服务即可。同时微服务节点的移除和增加不会影响到服务的提供。相比服务发现的架构,简单太多了,简单即是美。

在这次实践中,使用到了seneca,一个nodejs 微服务框架。seneca,使用seneca-amqp-transport插件,可以轻松构建基于消息的微服务。

下面是架构图:



www.processon.com/view/link/5…

在这个架构中,我们使用的是标准的seneca定义的命令规范,这可能是所有微服务都需要遵守的一个规范,至于说使用其他语言,也很简单。封装一个seneca命令规范的库即可。不知道官方有没开发,开发起来难度也不会太大。

接口层比较灵活,可以根据上层应用特性,来决定如何封装传输协议,最后将转化成标准命令发送到消息服务。不建议直接访问消息服务,上层应用应保持灵活。

完整的实践代码:github.com/luaxlou/mic…

1 前期准备

使用docker-machine创建虚拟机。

关于docker的一些基本用法,可以读上一篇文章:docker+consul基于服务发现的极简web架构实践,这里就不再赘述。

依次创建3台虚拟机:

$ dm create -d "virtualbox” node1
$ dm create -d "virtualbox” node2
$ dm create -d "virtualbox" node3

2 开始构建

搭建Rabbitmq消息服务

消息队列服务,已经成为高并发应用的必备基础服务。我们选用Rabbitmq,你可以换成任意的,遵循amqp协议即可。

使用docker安装很方便,但是生产环境不建议使用docker安装。更推荐的是使用云服务,这样能保证足够高的高可用和扩展性。虽然价格贵点,但是这是唯一的单点,花点钱还是值得的。

直接安装在宿主机上:

$ docker search rabbitmq

NAME                                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
rabbitmq                                   RabbitMQ is an open source multi-protocol ...   1466      [OK]
tutum/rabbitmq                             Base docker image to run a RabbitMQ server      11
frodenas/rabbitmq                          A Docker Image for RabbitMQ                     11                   [OK]
sysrun/rpi-rabbitmq                        RabbitMQ Container for the Raspberry Pi 2 ...   6
aweber/rabbitmq-autocluster                RabbitMQ with the Autocluster Plugin            5
gonkulatorlabs/rabbitmq                    DEPRECATED: See maryville/rabbitmq              5                    [OK]
letsxo/rabbitmq                            RabbitMQ with Management and MQTT plugins.      4                    [OK]
bitnami/rabbitmq                           Bitnami Docker Image for RabbitMQ               3                    [OK]
$ docker run -d --name rabbit -p   5672:5672  rabbitmq

这样就启动了一个消息队里服务,并且开放5672端口

安装jenkins

jenkins用于自动集成,不然每次构建是个很麻烦的事。

下面的实践是笔者掉了不少坑之后完成的,jenkins在安装过程中会有不少麻烦,而且在mac下安装也会遇到麻烦。

将jenkins 安装到 node1

$ dm ssh node1
 
$ mkdir /mnt/sda1/var/jenkins_home
$ sudo chown 1000 /mnt/sda1/var/jenkins_home
$ sudo chown 1000 /var/run/docker.sock

$ docker run -d -v /var/run/docker.sock:/var/run/docker.sock \
                -v /mnt/sda1/var/jenkins_home:/var/jenkins_home \
                -v $(which docker):/usr/bin/docker -p 8080:8080 jenkins

查看初始密码: $ cat /mnt/sda1/var/jenkins_home/secrets/initialAdminPassword

安装私有的Registry

在mac上安装即可

$ docker run -d -p 5000:5000 registry

文档参考:docs.docker.com/registry/sp…

准备代码

代码使用的是seneca官方的例子,完整的Dockerfile也已经写好。

FROM node:alpine

RUN npm install pm2 -g
WORKDIR /usr/src/app

COPY package.json ./
RUN npm install
COPY . .

CMD ["pm2-docker","process.yml"]

为了让nodejs能使用到多核cpu,Dockerfile 集成了pm2,使用pm2来管理node进程。

完整代码:
github.com/luaxlou/mic…

配置自动集成

这里使用了最新版的jenkins,新版的jenkins使用了pipline。一种新的构建方式,使用groovy语法。

写起来是挺优雅的,但是学习成本颇高。因为文档不全及有些文档失效,笔者不得已反编译了pipeline插件,才得以调通。

使用pipeline script

node {
    stage('Preparation') {
        def r = git('https://github.com/luaxlou/micro-service-practice.git')
   }
   stage('Build') {
       dir('seneca-listener') {
          withEnv(["DOCKER_REGISTRY_URL=http://192.168.99.1:5000"]) {

              docker.build("seneca-listener").push("latest")
            
          }
            
       }
               
   }
   
}

开始构建,顺利的话,会看到如下的结果:

image.png
image.png

这是pipeline的特性,可以可视化看到各个阶段的执行情况,算是不小的进步吧。

访问私有Registy的API,就可以看到生成的tag。

curl http://192.168.99.1:5000/v2/seneca-listener/tags/list

最后一步,试试我们的程序

在宿主机发布消息:

$ git clone https://github.com/luaxlou/micro-service-practice.git

seneca-clinet 代码是接口层代码的示意,可以根据自己的喜好封装。 同时直接发送了命令代码用于测试。

进入seneca-clinet 目录

$  AMQP_URL=192.168.99.1:5672 node index.js

这个程序会每隔两秒发送一个命令:

#!/usr/bin/env node
'use strict';

const client = require('seneca')()
    .use('seneca-amqp-transport')
    .client({
        type: 'amqp',
        pin: 'cmd:salute',
        url: process.env.AMQP_URL
    });

setInterval(function() {
    client.act('cmd:salute', {
        name: 'World',
        max: 100,
        min: 25
    }, (err, res) => {
        if (err) {
            throw err;
        }
        console.log(res);
});
}, 2000);

虽然一直在发命令,你很快就会发现命令全部超时了。这是因为还没有消费者,当然这些命令也没有丢失,只不过接口层没有得到及时返回。如果应用层支持异步的模式,每个command都有独立的id,可以保留id后,以后再过来取。这就很灵活了,一切看需求去封装接口层即可。

进入node2

$ docker run 192.168.99.1:5000/seneca-listener:latest
0|seneca-l | {"kind":"notice","notice":"hello seneca fwunhukrcmzn/1507605332382/16/3.4.2/-","level":"info","seneca":"fwunhukrcmzn/1507605332382/16/3.4.2/-","when":1507605332661}

启动后,回到seneca-clinet,发现之前超时的命令,全部接收到了。

{ id: 86,
  message: 'Hello World!',
  from: { pid: 16, file: 'index.js' },
  now: 1507605332699 }
{ id: 44,
  message: 'Hello World!',
  from: { pid: 16, file: 'index.js' },
  now: 1507605332701 }
{ id: 56,
  message: 'Hello World!',
  from: { pid: 16, file: 'index.js' },
  now: 1507605332703 }
{ id: 57,
  message: 'Hello World!',
  from: { pid: 16, file: 'index.js' },
  now: 1507605332706 }
{ id: 58,
  message: 'Hello World!',
  from: { pid: 16, file: 'index.js' },
  now: 1507605332707 }

至此,完整架构已经构建完毕。

一些未完的事项

1.自动集成,只需要配置webhook即可。
2.自动部署,因为docker运转的方式,当服务升级时需要重启docker进程。方式有很多,比较粗暴的是直接控制宿主机,或者类似salt这样的工具。
目前来说,没有找到太好的开源方案。个人倾向于自己开发agent,发布有限的API,用于常规的部署或者其他任务,以及可以定时收集服务器的信息,用于监控。这可能会是笔者的下一个开源项目。

总结

这篇文章算是一个新的里程碑,实践的成果将用于后期的架构。docker让我从传统的架构模式中脱离出来,同时也让我吃了不少苦头。但这一切都是值得的。

同时也是一个新的开始,终于从之前的公司出来。未来何去何从,有很多的未知,但我相信都是美好的。

这也许就是人生的魅力。

Hello World!!

作者:andyliulin 发表于 2017/10/18 09:37:44  原文链接 https://blog.csdn.net/andyliulin/article/details/78269385
阅读:493
 
[转]Centos7 搭建最新 Nexus3 Maven 私服

Centos7 搭建最新 Nexus3 Maven 私服

Maven 介绍

Apache Maven 是一个创新的软件项目管理和综合工具。
Maven 提供了一个基于项目对象模型(POM)文件的新概念来管理项目的构建,可以从一个中心资料片管理项目构建,报告和文件。

Maven 最强大的功能就是能够自动下载项目依赖库。
Maven 提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven 使用标准的目录结构和默认构建生命周期。
在多个开发团队环境时,Maven 可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven 让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。
Maven 项目的结构和内容在一个 XML 文件中声明,pom.xml 项目对象模型(POM),这是整个 Maven 系统的基本单元。

Maven 提供了开发人员的方式来管理:
1)Builds
2)Documentation
3)Reporting
4)Dependencies
5)SCMs
6)Releases
7)Distribution
8)mailing list
概括地说,Maven 简化和标准化项目建设过程。处理编译,分配,文档,团队协作和其他任务的无缝连接。
Maven 增加可重用性并负责建立相关的任务。
Maven 最初设计,是以简化 Jakarta Turbine 项目的建设。在几个项目,每个项目包含了不同的 Ant 构建文件。 JAR 检查到 CVS。
Apache 组织开发 Maven 可以建立多个项目,发布项目信息,项目部署,在几个项目中 JAR 文件提供团队合作和帮助。

Maven 主要目标是提供给开发人员:
1)项目是可重复使用,易维护,更容易理解的一个综合模型。
2)插件或交互的工具,这种声明性的模式。

私服介绍

私服是指私有服务器,是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构建。有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库;否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。

Nexus 介绍

Nexus 是一个强大的 Maven 仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问。
如果使用了公共的 Maven 仓库服务器,可以从 Maven 中央仓库下载所需要的构件(Artifact),但这通常不是一个好的做法。
正常做法是在本地架设一个 Maven 仓库服务器,即利用 Nexus 私服可以只在一个地方就能够完全控制访问和部署在你所维护仓库中的每个 Artifact。
Nexus 在代理远程仓库的同时维护本地仓库,以降低中央仓库的负荷, 节省外网带宽和时间,Nexus 私服就可以满足这样的需要。
Nexus 是一套 “开箱即用” 的系统不需要数据库,它使用文件系统加 Lucene 来组织数据。
Nexus 使用 ExtJS 来开发界面,利用 Restlet 来提供完整的 REST APIs,通过 m2eclipse 与 Eclipse 集成使用。
Nexus 支持 WebDAV 与 LDAP 安全身份认证。
Nexus 还提供了强大的仓库管理功能,构件搜索功能,它基于 REST,友好的 UI 是一个 extjs 的 REST 客户端,它占用较少的内存,基于简单文件系统而非数据库。

为什么要构建 Nexus 私服?如果没有 Nexus 私服,我们所需的所有构件都需要通过 maven 的中央仓库和第三方的 Maven 仓库下载到本地,而一个团队中的所有人都重复的从 maven 仓库下载构件无疑加大了仓库的负载和浪费了外网带宽,如果网速慢的话,还会影响项目的进程。很多情况下项目的开发都是在内网进行的,连接不到 maven 仓库怎么办呢?开发的公共构件怎么让其它项目使用?这个时候我们不得不为自己的团队搭建属于自己的 maven 私服,这样既节省了网络带宽也会加速项目搭建的进程,当然前提条件就是你的私服中拥有项目所需的所有构件。

总之,在本地构建 nexus 私服的好处有:
1)加速构建;
2)节省带宽;
3)节省中央 maven 仓库的带宽;
4)稳定(应付一旦中央服务器出问题的情况);
5)控制和审计;
6)能够部署第三方构件;
7)可以建立本地内部仓库;
8)可以建立公共仓库
这些优点使得 Nexus 日趋成为最流行的 Maven 仓库管理器。

1. 安装 jdk1.8

关于 jdk1.8 的安装, 在这里就不做赘述了

2. 安装 maven

关于 maven 的安装, 本文在这里就不详细写了

3. 安装 nexus3

1. 下载 NEXUS-3.6.0-02-UNIX.TAR.GZ

官网链接地址:www.sonatype.com/download-os… 下载 linux 最新版本,直接下载速度可能很慢,建议用迅雷下载会快很多的。

2. 解压

tar -zxvf nexus-3.6.0-02-unix.tar.gz -C /usr/local/

3. 启动 NEXUS3

cd /usr/local/nexus-3.6.0-02/bin/
./nexus run &

稍等一会 (首次启动会比较慢), 当出现以下日志的时候表示启动成功!

-------------------------------------------------
Started Sonatype Nexus OSS 3.6.0-02
-------------------------------------------------

4. 开启远程访问端口

关闭防火墙,并开启远程访问端口 8081

vim /etc/sysconfig/iptables
添加
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8081 -j ACCEPT

5. 测试

nexus3默认端口是:8081
nexus3默认账号是:admin
nexus3默认密码是:admin123

6. 设置开机自启动

ln -s /usr/local/nexus-3.6.0-02/bin/nexus /etc/init.d/nexus3
chkconfig --add nexus3
chkconfig nexus3 on

7. 修改 NEXUS3 的运行用户为 ROOT

vim nexus.rc
//设置
run_as_user="root"

8. 修改 NEXUS3 启动时要使用的 JDK 版本

vim nexus

第 14 行:

INSTALL4J_JAVA_HOME_OVERRIDE=/usr/local/java/jdk1.8.0_144

9. 修改 NEXUS3 默认端口 (可选)

cd /usr/local/nexus-3.6.0-02/etc/
vim nexus-default.properties

默认端口: 8081

application-port=8081

10. 修改 NEXUS3 数据以及相关日志的存储位置 (可选):

[root@MiWiFi-R3-srv bin]# cd /usr/local/nexus-3.6.0-02/bin/
[root@MiWiFi-R3-srv bin]# vim nexus.vmoptions

-XX:LogFile=./sonatype-work/nexus3/log/jvm.log
-Dkaraf.data=./sonatype-work/nexus3
-Djava.io.tmpdir=./sonatype-work/nexus3/tmp

出现上面 5 中的测试页面,说明配置 nexus 成功! 点击右上角 “Log in”, 输入默认用户名 (admin) 和默认密码(admin123)登录

至此, nexus3_maven 的私服就搭建完成了!!!

可以点击上面的 “设置” 图标,在 “设置” 里可以添加用户、角色,对接 LDAP 等的设置,如下:

可以在 “管理” 里查看 nexus 的系统信息

注意:

1.component name 的一些说明:
1)maven-central:maven 中央库,默认从 repo1.maven.org/maven2 / 拉取 jar
2)maven-releases:私库发行版 jar
3)maven-snapshots:私库快照(调试版本)jar
4)maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地 maven 基础配置 settings.xml 中使用。

2.Nexus 默认的仓库类型有以下四种:

1)group(仓库组类型):又叫组仓库,用于方便开发人员自己设定的仓库;

2)hosted(宿主类型):内部项目的发布仓库(内部开发人员,发布上去存放的仓库);

3)proxy(代理类型):从远程中央仓库中寻找数据的仓库(可以点击对应的仓库的 Configuration 页签下 Remote Storage Location 属性的值即被代理的远程仓库的路径);

4)virtual(虚拟类型):虚拟仓库(这个基本用不到,重点关注上面三个仓库的使用);

3.Policy(策略): 表示该仓库为发布 (Release) 版本仓库还是快照 (Snapshot) 版本仓库;

4.Public Repositories 下的仓库

1)3rd party: 无法从公共仓库获得的第三方发布版本的构件仓库,即第三方依赖的仓库,这个数据通常是由内部人员自行下载之后发布上去;

2)Apache Snapshots: 用了代理 ApacheMaven 仓库快照版本的构件仓库

3)Central: 用来代理 maven 中央仓库中发布版本构件的仓库

4)Central M1 shadow: 用于提供中央仓库中 M1 格式的发布版本的构件镜像仓库

5)Codehaus Snapshots: 用来代理 CodehausMaven 仓库的快照版本构件的仓库

6)Releases: 内部的模块中 release 模块的发布仓库,用来部署管理内部的发布版本构件的宿主类型仓库;release 是发布版本;

7)Snapshots: 发布内部的 SNAPSHOT 模块的仓库,用来部署管理内部的快照版本构件的宿主类型仓库;snapshots 是快照版本,也就是不稳定版本所以自定义构建的仓库组代理仓库的顺序为:Releases,Snapshots,3rd party,Central。也可以使用 oschina 放到 Central 前面,下载包会更快。

5.Nexus 默认的端口是 8081,可以在 etc/nexus-default.properties 配置中修改。

6.Nexus 默认的用户名密码是 admin/admin123

  • 当遇到奇怪问题时,重启 nexus,重启后 web 界面要 1 分钟左右后才能访问。

8.Nexus 的工作目录是 sonatype-work(路径一般在 nexus 同级目录下)

[root@master-node local]# pwd
/usr/local
[root@master-node local]# ls nexus/
bin deploy etc lib LICENSE.txt NOTICE.txt public system
[root@master-node local]# ls sonatype-work/
nexus3
[root@master-node local]# ls sonatype-work/nexus3/
backup blobs cache db elasticsearch etc generated-bundles health-check instances keystores lock log orient port tmp

Nexus 仓库分类的概念:

1)Maven 可直接从宿主仓库下载构件, 也可以从代理仓库下载构件, 而代理仓库间接的从远程仓库下载并缓存构件

2)为了方便, Maven 可以从仓库组下载构件, 而仓库组并没有时间的内容 (下图中用虚线表示, 它会转向包含的宿主仓库或者代理仓库获得实际构件的内容).

Nexus 的 web 界面功能介绍

1.BROWSE SERVER CONTENT

1.1 Search

这个就是类似 Maven 仓库上的搜索功能,就是从私服上查找是否有哪些包。

注意:

1)在 Search 这级是支持模糊搜索的,如图所示:

2)如果进入具体的目录,好像不支持模糊搜索,如图所示:

1.2 Browse

1)Assets
这是能看到所有的资源,包含 Jar,已经对 Jar 的一些描述信息。
2)Components
这里只能看到 Jar 包。

2.SERVER ADMINSTRATION AND CONFIGURATION

看到这个选项的前提是要进行登录的,如上面已经介绍登陆方法,右上角点击 “Sign In” 的登录按钮,输入 admin/admin123, 登录成功之后,即可看到此功能,如图所示:

2.1 Blob Stores

文件存储的地方,创建一个目录的话,对应文件系统的一个目录,如图所示:

2.2 Repositories

1)Proxy

这里就是代理的意思,代理中央 Maven 仓库,当 PC 访问中央库的时候,先通过 Proxy 下载到 Nexus 仓库,然后再从 Nexus 仓库下载到 PC 本地。

这样的优势只要其中一个人从中央库下来了,以后大家都是从 Nexus 私服上进行下来,私服一般部署在内网,这样大大节约的宽带。

创建 Proxy 的具体步骤

1 点击 “Create Repositories” 按钮

2 选择要创建的类型

3 填写详细信息

Name:就是为代理起个名字

Remote Storage: 代理的地址,Maven 的地址为: repo1.maven.org/maven2/

Blob Store: 选择代理下载包的存放路径

2)Hosted

Hosted 是宿主机的意思,就是怎么把第三方的 Jar 放到私服上。

Hosted 有三种方式,Releases、SNAPSHOT、Mixed

Releases: 一般是已经发布的 Jar 包

Snapshot: 未发布的版本

Mixed:混合的

Hosted 的创建和 Proxy 是一致的,具体步骤和上面基本一致。如下:

注意事项:

Deployment Pollcy: 需要把策略改成 “Allow redeploy”。

3)Group能把两个仓库合成一个仓库来使用,目前没使用过,所以没做详细的研究。

2.3 Security这里主要是用户、角色、权限的配置(上面已经提到了在这里添加用户和角色等)

2.4 Support

包含日志及数据分析。

2.5 System
主要是邮件服务器,调度的设置地方
这部分主要讲怎么和 Maven 做集成, 集成的方式主要分以下种情况:代理中央仓库、Snapshot 包的管理、Release 包的管理、第三方 Jar 上传到 Nexus 上。

代理中央仓库

只要在 PMO 文件中配置私服的地址(比如 http://192.168.1.14:8081)即可,配置如下:

<repositories>
	<repository>
		<id>maven-central</id>
		<name>maven-central</name>
		<url>http://192.168.1.14:8081/repository/maven-central/</url>
		<snapshots>
			<enabled>true</enabled>
		</snapshots>
		<releases>
			<enabled>true</enabled>
		</releases>
	</repository>
</repositories>

SNAPSHOT 包的管理

1)修改 Maven 的 settings.xml 文件,加入认证机制

<servers>
	<server><id>nexus</id>
	<username>admin</username>
	<password>admin123</password>
</server>

2)修改工程的 Pom 文件

<distributionManagement>
	<snapshotRepository>
		<id>nexus</id>
		<name>Nexus Snapshot</name>
		<url>http://192.168.1.14:8081/repository/maven-snapshots/</url>
	</snapshotRepository>
	<site>
		<id>nexus</id>
		<name>Nexus Sites</name>
		<url>dav:http://192.168.1.14:8081/repository/maven-snapshots/</url>
	</site>
</distributionManagement>

注意事项:

上面修改的 Pom 文件如截图中的名字要跟 / usr/local/maven/conf/settings.xml 文件中的名字一定要对应上。

3)上传到 Nexus 上

1– 项目编译成的 jar 是 Snapshot(POM 文件的头部)

<groupId>com.zhisheng</groupId>
<artifactId>test-nexus</artifactId>
<version>1.0.0-SHAPSHOT</version>
<packaging>jar</packaging>

2– 使用 mvn deploy 命令运行即可(运行结果在此略过)

3– 因为 Snapshot 是快照版本,默认他每次会把 Jar 加一个时间戳,做为历史备份版本。

RELEASES 包的管理

1)与 Snapshot 大同小异,只是上传到私服上的 Jar 包不会自动带时间戳2)与 Snapshot 配置不同的地方,就是工程的 PMO 文件,加入 repository 配置

<distributionManagement>
	<repository>
		<id>nexus</id>
		<name>Nexus Snapshot</name>
		<url>http://192.168.1.14:8081/repository/maven-releases/</url>
	</repository>
</distributionManagement>

3)打包的时候需要把 Snapshot 去掉

<groupId>com.zhisheng</groupId>
<artifactId>test-nexus</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging> |

第三方 JAR 上传到 NEXUS

[root@master-node src]# mvn deploy:deploy-file -DgroupId=org.jasig.cas.client -DartifactId=cas-client-core -Dversion=3.1.3 -Dpackag
注意事项:
-DrepositoryId=nexus 对应的就是 Maven 中 settings.xml 的认证配的名字

作者:andyliulin 发表于 2017/10/18 09:34:45  原文链接 https://blog.csdn.net/andyliulin/article/details/78269349
阅读:449
 
[转]github上实用、常用的插件和库

本文整合罗列一些平时工作或者练手项目中很可能用到的、github上实用、轻量级、无依赖的插件和库,包括功能插件、UI组件、炫酷动画、前沿技术等,让你在少造轮子的同时,享受快速开发的畅快体验。

我会在 github 上持续更新此列表,感兴趣的可以点我star


Echo.js – 简单易用的图片延迟加载插件

github:https://github.com/toddmotto/echo

官方网站:https://toddmotto.com/echo-js-simple-javascript-image-lazy-loading/

star: 3K+

size:2KB

功能介绍:

Echo.js 是一个独立的延迟加载图片的 JavaScript 插件。Echo.js 不依赖第三方库,压缩后不到1KB大小。 延迟加载是提高网页首屏显示速度的一种很有效的方法,当图片元素进入窗口可视区域的时候,它就会改变图像的 src 属性,从服务端加载所需的图片,这也是一个异步的过程。

Lazyr.js – 延迟加载图片(Lazy Loading)

github:https://github.com/callmecavs/layzr.js

官方网站:http://callmecavs.com/layzr.js/

star: 5K+

size:2.75KB

功能介绍:

Lazyr.js 是一个小的、快速的、现代的、相互间无依赖的图片延迟加载库。通过延迟加载图片,让图片出现在(或接近))视窗才加载来提高页面打开速度。这个库通过保持最少选项并最大化速度。

infinite-scroll – 一款滚动加载按需加载的轻量级插件

github:https://github.com/infinite-scroll/infinite-scroll

官方网站:http://www.infinite-scroll.com/

star:5k+

功能介绍:

infinite-scroll是一款滚动加载,滚动到最下到自动加载的轻量级JavaScript插件,简单实用,按需加载提高用户体验,非常适合移动端使用,配合上面的图片懒加载如虎添翼。这个东西不是完全开源的,自己用的话无所谓,但如果想要在商业项目中使用,就必须要购买使用许可。

iscroll - 在网页上实现平滑滚动

github:https://github.com/cubiq/iscroll

官方网站:http://iscrolljs.com

star:9K+

功能介绍:

iScroll是一个高性能,小尺寸,无依赖关系,适用于 移动端 和 pc多平台JavaScript的滚动插件库,并且不仅仅是滚动,还可以缩放、平移、无线滚动、视差滚动、旋转滚动等,做到移动web与原生APP的完美结合,此系列还被细分出了许多其他专注于某个领域的插件,可以根据需要选择使用。

better-scroll.js – 小巧,灵活的 JavaScript 模拟滚动条的插件

github:https://github.com/ustbhuangyi/better-scroll

官方网站:https://ustbhuangyi.github.io/better-scroll/

star:1.7K+

size: 24KB

功能介绍:

better-scroll 是一个只有24.8KB的 JavaScript 模拟浏览器自带滚动条的插件,是在iscroll开源的基础上进行优化的一款插件,简单好用,轻巧高性能,功能强大,API通俗易懂,有完善详细的官方文档,并且仓库中示例DEMO丰富详细,全都有对应的 vue实现,结合vue使用这款插件,简直不能再得心用手。

better-picker – 一款轻量级IOS风格的JavaScript选择器

github:https://github.com/ustbhuangyi/picker

官方网站:http://ustbhuangyi.github.io/picker/

star: 500+

size: 46.5KB

功能介绍:

移动端最好用的的筛选器组件,高仿 ios 的 UIPickerView ,非常流畅的体验,原生 JS 实现,不依赖任何插件和第三方库

showpicture

nativeShare.js - 调起移动端浏览器自带分享功能

github: https://github.com/fa-ge/NativeShare

star: 60+

size: 4KB

功能介绍:

移动端浏览器大多都有自带的调起分享功能,不过因为这种功能并没有统一的规范,所以每种浏览器的实现方法都不一样,此库整合了大部分浏览器的调起方法,让调起浏览器的 native分享功能的操作变的 so easy

Share.js - 纯网页端一键分享

github: https://github.com/overtrue/share.js

star: 1.4k+

功能介绍:

一键分享到微博、QQ空间、QQ好友、微信、腾讯微博、豆瓣、Facebook、Twitter、Linkedin、Google+、点点等社交网站,主要是调起这些网站对外开放的分享 api

showpicture

Sortable – 一款用于实现元素拖拽排序的功能的插件

github:https://github.com/RubaXa/Sortable

官方网站:http://rubaxa.github.io/Sortable/

star:11k+

size: 5KB

功能介绍:

现代浏览器上用于实现元素拖拽排序的功能,支持 Meteor, AngularJS, React

react-sortable-hoc - react 拖拽排序

github: https://github.com/clauderic/react-sortable-hoc

star:2.8K+

功能介绍:

基于react 的拖拽实现

showpicture

Draggabilly – 轻松实现拖放功能(Drag & Drop)

github:https://github.com/desandro/draggabilly

官方网站:http://draggabilly.desandro.com/

star:2.9k+

size: 5KB

功能介绍:

Draggabilly 是一个很小的 JavaScript 库,专注于拖放功能。只需要简单的设置参数就可以在你的网站用添加拖放功能。兼容 IE8+ 浏览器,支持多点触摸。可以灵活绑定事件,支持 RequireJS 以及 Bower 安装。

slick – 功能异常强大的一个图片滑动切换效果库

github:https://github.com/kenwheeler/slick

官方网站:http://kenwheeler.github.io/slick/

star: 19K+

size: 40KB

功能介绍:

slick 是一个功能异常强大的一个图片滑动切换效果库,接口丰富,支持各种动画和各种样式的切换滑动,唯一的缺点就是基于jQuery,基本废了,因为 jQuery没办法装逼,所以应该没人会在新项目用了,支持 RequireJS 以及 Bower 安装

react-slick - 基于 slick 打造的 react-slick组件

github: https://github.com/akiran/react-slick

官网:http://neostack.com/opensource/react-slick

star: 3.3K+

功能介绍:

基于 slick的 react-slick组件,支持无限轮播、垂直轮播、自动轮播等多种轮播方式

swipe – 非常轻量级的一个图片滑动切换效果库

github:https://github.com/lyfeyaj/Swipe

官方网站:http://lyfeyaj.github.io/swipe/

star:390+

size: 5KB

功能介绍:

非常轻量级的一个图片滑动切换效果库, 性能良好, 尤其是对手机的支持, 压缩后的大小约 5kb。可以结合 jQuery、RequireJS 使用

showpicture

Slideout.js – 触摸滑出式 Web App 导航菜单

github:https://github.com/mango/slideout

官方网站:https://slideout.js.org/

star:6.7k+

size: 4KB

功能介绍:

Slideout.js 是为您的移动 Web 应用开发的触摸滑出式的导航菜单。它没有依赖,自由搭配简单的标记,支持原生的滚动,您可以轻松地定制它。它支持不同的 CSS3 转换和过渡。最重要的是,它只是4KB 。

showpicture

SweetAlert – 替代 Alert 的漂亮的提示效果

github:https://github.com/t4t5/sweetalert

官方网站:http://t4t5.github.io/sweetalert/

star:16k+

功能介绍:

Sweet Alert 是一个替代传统的 JavaScript Alert 的漂亮提示效果。SweetAlert 自动居中对齐在页面中央,不管您使用的是台式电脑,手机或平板电脑看起来效果都很棒。另外提供了丰富的自定义配置选择,可以灵活控制。

这里写图片描述

push.js - 桌面通知 Notification框架库

github: https://github.com/Nickersoft/push.js

star: 6.1k+

功能介绍:Push 是 BrowserStack 出品的,快速实现基于 HTML5 API Notification 的桌面消息推送工具;Push 能够自动利用 Chrome、Safari、Firefox、IE9+ 这些现代浏览器提供的底层接口,为开发者提供跨平台的统一调用,如果浏览器不支持此 API,则启动回退机制,支持 Chrome, Safari, Firefox, and IE 9+

pushjs

tracking.js - web端图像追踪引擎

github:https://github.com/eduardolundgren/tracking.js

官网:https://trackingjs.com/

star:5.4K+

功能介绍:

完成各种追踪类的图像处理任务,例如人脸识别、五官追踪等

trackingjs

AlloyImage - 堪称前端PS的前端图像处理类库

github:https://github.com/AlloyTeam/AlloyImage

官网:http://alloyteam.github.io/AlloyImage/

star:1.7K+

功能介绍:

腾讯前端出品,基于html5的JS图片图像处理库,堪称前端PS,简单易用,官方文档齐全,支持多图层操作,与PS对应的17种图层混合模式,多种基本滤镜处理效果,多种组合风格效果,另有 AlloyPhoto,基于此类库开发,AlloyImage的强势Demo。

gm - 基于nodeJS操作图片的库

github:https://github.com/aheckmann/gm

官网:http://aheckmann.github.io/gm/

star:4.3K+

功能介绍:

基于node操作图片的库,可以获取图片尺寸(size)、路径(orientation )、类型(format)、色值(depth)、颜色(color)、分辨率(res)、体积(filesize)等信息,可以对图像进行拼合、水印、自适应、模糊、压缩、旋转等多种操作,功能很强大。

star:4.3K+

Awesomplete.js - 比datalist更强大更实用,零依赖的简单自动补全插件

github:https://github.com/leaverou/awesomplete/

官方网站:http://leaverou.github.io/awesomplete/

star: 5.6K+

size: 5KB

功能介绍:

Awesomplete 是一款超轻量级的,可定制的,简单的自动完成插件,零依赖,使用现代化标准构建。你可以简单地添加 awesomplete 样式,让它自动处理(你仍然可以通过指定 HTML 属性配置更多选项),您可以用几行 JS 代码,提供更多的自定义

awesomplete

Cleave.js – 自动格式化表单输入框的文本内容

github:https://github.com/nosir/cleave.js/

官方网站:http://nosir.github.io/cleave.js/

star: 7.2K+

size: 11.1KB

功能介绍:

Cleave.js 有一个简单的目的:帮助你自动格式输入的文本内容。 这个想法是提供一个简单的方法来格式化您的输入数据以增加输入字段的可读性。通过使用这个库,您不需要编写任何正则表达式来控制输入文本的格式。然而,这并不意味着取代任何验证或掩码库,你仍应在后端验证数据。它支持信用卡号码、电话号码格式(支持各个国家)、日期格式、数字格式、自定义分隔符,前缀和块模式等,提供 CommonJS/AMD 模式以及ReactJS 组件端口。

Cleave

Immutable.js – JavaScript 不可变数据集合(Facebook出品)

github:https://github.com/facebook/immutable-js

官方网站:http://facebook.github.io/immutable-js/

star: 20K+

size: 60KB

功能介绍:

不可变数据是指一旦创建就不能被修改的数据,使得应用开发更简单,允许使用函数式编程技术,比如惰性评估。Immutable JS 提供一个惰性 Sequence,允许高效的队列方法链,类似 map 和 filter ,不用创建中间代表。Immutable.js 提供持久化的列表、堆栈、Map, 以及 OrderedMap 等,最大限度地减少需要复制或缓存数据。

howler.js - 为现代web浏览器打造的 javascript音频库

github:https://github.com/goldfire/howler.js

官网:https://howlerjs.com/

star: 8.4K+

size: 28.3KB

功能介绍:

为现代web浏览器打造的跨浏览器 javascript音频库,默认使用 HTML5 Audio API,回退为 HTML Audio,统一所有浏览器的 Audio API接口, 
自动缓存、音频控制(快进、快退、速度等)、混合、裁剪、3D音效等众多功能,纯净无依赖、压缩后仅有 28.3Kb、gzip之后仅有 7KB大小,支持 IE9.0+

showpicture

Popmotion.js – 小巧,灵活的 JavaScript 运动引擎

github:https://github.com/Popmotion/popmotion

官方网站:https://popmotion.io/

star:3.9k+

size: 12KB

功能介绍:

Popmotion 是一个只有12KB的 JavaScript 运动引擎,可以用来实现,物理效果和输入跟踪。原生的DOM支持:CSS,SVG,SVG路径和DOM属性的支持,开箱即用。Popmotion 网站上有很多很赞的效果,赶紧去体验一下。

Dynamics.js - 创建逼真的物理动画的 JS 库

github:https://github.com/michaelvillar/dynamics.js

官方网站:http://dynamicsjs.com/

star:6.5k+

size: 20KB

功能介绍:

创建逼真的物理动画的 JS 库

dynamics

Snabbt.js – 极简性能的 JavaScript 动画库

github:http://daniel-lundin.github.io/snabbt.js/

star:5k+

功能介绍:

Snabbt.js 是一个简约的 JavaScript 动画库。它会平移,旋转,缩放,倾斜和调整你的元素。通过矩阵乘法运算,变换等可以任何你想要的方式进行组合。最终的结果通过 CSS3 变换矩阵设置。

animate.css - 经典的 cs动画库

github: https://github.com/daneden/animate.css

star: 44k+

功能介绍:

类似于上面的 Snabbt.js,不过动画效果是由 css实现的,支持多种动画效果。

velocity.js - javascript动画库,专注于动画的渲染速度

github: https://github.com/julianshapiro/velocity

官网:http://velocityjs.org/

star:13.3K+

功能介绍:

javascript动画库,专注于动画的渲染速度,具有和 Jquery $.animate()相同的动画引擎,不过其并不依赖 Jquery

mojs - web端图形运动算法库,用于制作复杂的炫酷动画效果

github:https://github.com/legomushroom/mojs

star: 11.9K+

功能介绍:

web端图形运动算法库,用于制作复杂的炫酷动画效果,官网有详细的 api文档以及示例

tween.js - javascript tweening engine

github: https://github.com/tweenjs/tween.js

star: 4.5k+

功能介绍:

一款根据给定的初始坐标和结束坐标进行运动动画的动画库,包括 Linear、Quadratic、cubic、Quartic、Quintic、Sinusoidal、Exponential等形式的动画效果,还包括在动画过程中增删更新元素等的操作,便于实现简单的两点动画。

Rainyday.js – 使用 JavaScript 实现雨滴效果

github:https://github.com/maroslaw/rainyday.js

官方网站:http://maroslaw.github.io/rainyday.js/

star:5.2k+

size: 10KB

功能介绍:

Rainyday.js 背后的想法是创建一个 JavaScript 库,利用 HTML5 Canvas 渲染一个雨滴落在玻璃表面的动画。Rainyday.js 有功能可扩展的 API,例如碰撞检测和易于扩展自己的不同的动画组件的实现。它是一个使用 HTML5 特性纯 JavaScript 库,支持大部分现代浏览器。

showpicture

vx react + D3

github: https://github.com/hshoff/vx

官网:https://vx-demo.now.sh/

star:2.6K+

功能介绍:

react结合 D3实现的图标库

showpicture

vue-svg-icon - 轻量的Vue2多色动态svg图标方案

github: https://github.com/cenkai88/vue-svg-icon

star: 230+

功能介绍:

不需要 inject注册 svg,可以自行调整大小、颜色,没有冗余的初始图标库,你需要什么图标就自己添加,完全按需加载,不用担心额外图标库带来的体积增加。

pasition - 轻量级Path过渡库,渲染到任何地方

github: https://github.com/AlloyTeam/pasition

star:700k+

功能介绍:

在两个 svg path将设置过渡渲染效果,让两个 path间的变化显得更加平滑

showpicture

scrollReveal.js – 使元素以非常酷帅的方式进入画布 (Viewpoint)

github:https://github.com/jlmakes/scrollreveal

官方网站:https://scrollrevealjs.org/

star:12k+

size: 8KB

功能介绍:

scrollReveal.js 是一个用于使元素以非常酷帅的方式进入画布的 JavaScript 工具库,常见于整屏的 H5动画,当元素进入或者离开可视范围时,进行一系列的动画效果,轻量级,高性能,无依赖的一个小巧酷炫的库。

scrollreveal

Swiper – 经典的移动触摸滑块轮播插件

github:https://github.com/nolimits4web/Swiper

官方网站:http://idangero.us/swiper/

star:13.3k+

功能介绍:

Swiper 是移动 Web 开发中最常用的滑块插件,是一款免费的,最现代化的移动触摸滑块,支持硬件加速的转换和惊人的原生表现。它的目的是在移动网站,移动 Web 应用程序和 Hygrid 混合应用程序中使用。最初的设计主要是为 iOS,但同时也支持最新的 Android,Windows Phone 8 和现代的桌面浏览器。

imagesLoaded – 检测网页中的图片是否加载完成

github:https://github.com/desandro/imagesloaded

官方网站:http://imagesloaded.desandro.com/

star:6.6k+

size: 1.9KB

功能介绍:

imagesLoaded 是一个用于来检测网页中的图片是否载入完成的 JavaScript 工具库。支持回调的获取图片加载的进度,还可以绑定自定义事件。可以结合 jQuery、RequireJS 使用(不是必须的)。

Fort.js – 时尚、现代的表单填写进度提示效果

github:https://github.com/idriskhenchil/Fort.js

官方网站:https://github.com/idriskhenchil/Fort.js

star:900+

size: 6KB

功能介绍:

Fort.js 是一款用于时尚、现代的表单填写进度提示效果的 JavaScript 库,主要就是在浏览器顶部增加一个进度条,随着表单内的 input框被填写的比例进行进度条的长度变化,进度条支持多种变化的样式,例如渐变、从两边朝中间合并、变色等,你需要做的就是添加表单,剩下的任务就交给 Fort.js 算法了,使用非常简单。提供了Default、Gradient、Sections 以及 Flash 四种效果,满足开发的各种场合需要。

MagicSuggest – Bootstrap 主题的多选组合框

github:https://github.com/nicolasbize/magicsuggest

官方网站:http://nicolasbize.com/magicsuggest/

star:1.2k+

size: 21.8KB

功能介绍:

MagicSuggest 是专为 Bootstrap 主题开发的多选组合框,即允许在一个输入框中输入多个下拉选择,它支持自定义呈现,数据通过 Ajax 异步获取,使用组件自动过滤。它允许空间免费项目,也有动态加载固定的建议,

Numeral.js – 格式化和操作数字的 JavaScript 库

github:https://github.com/adamwdraper/Numeral-js

官方网站:http://numeraljs.com/

star:5.3k+

size: 10KB

功能介绍:

Numeral.js 是一个用于格式化和操作数字的 JavaScript 库。数字可以格式化为货币,百分比,时间,甚至是小数,千位,和缩写格式,功能十分强大。支持包括中文在内的17种语言。

Quill – 可以灵活自定义的开源的富文本编辑器

github:https://github.com/quilljs/quill/

官方网站:https://quilljs.com

star:14k+

功能介绍:

Quill 的建立是为了解决现有的所见即所得(WYSIWYG)的编辑器本身就是所见即所得(指不能再扩张)的问题。如果编辑器不正是你想要的方式,这是很难或不可能对其进行自定义以满足您的需求。 
Quill 旨在通过把自身组织成模块,并提供了强大的 API 来构建额外的模块来解决这个问题。它也并没有规定你用样式来定义编辑器皮肤。Quill 还提供了所有你希望富文本编辑器说用于的功能,包括轻量级封装,众多的格式化选项,以及广泛的跨平台支持。

request - 让 http请求变得更简单

github: https://github.com/request/request

star: 16.7K+

size: 500K+

功能介绍:

基于 node.js http模块,为浏览器打造易用的 http请求库,默认支持 https和重定向,支持文件流和表单的传输、HTTP认证、OAuth登录、定制HTTP header、cookies(默认禁止,需要自动开启)、代理、promise、async/await、HAR 1.2等多种 http请求。

r2 - 参考 request打造的轻量级、高可用的 http客户端

github: https://github.com/mikeal/r2

size: 66K

功能介绍:

与 request为同一个作者打造,相比于 request更加轻量、专注,基于现代浏览器的 fetch API,基于 promise, 与 asynv/await搭配更佳。

basket.js – 基于 LocalStorage 的资源加载器

github:https://github.com/addyosmani/basket.js

官方网站:https://addyosmani.com/basket.js/

star:2.9k+

size: 4KB

功能介绍:

basket.js是一款基于 LocalStorage 的资源加载器,可以用来缓存 script 和 css, 手机端使用速度快于浏览器直接缓存。

moment.js – 一款轻量级的Javascript日期处理类库

github:https://github.com/moment/moment/

官方网站:http://momentjs.com/

star:32k+

size: 16.6KB

功能介绍:

moment.js是一个轻量级的JavaScript库日期解析、验证操作,格式化日期的库。

hammerjs

github:https://github.com/hammerjs/hammer.js/

star: 16k+

功能介绍:

hammer.js是一个轻量级的手势库,支持各种手势的事件。

ityped - 模拟打字效果

github: https://github.com/luisvinicius167/ityped

官网:https://ityped.surge.sh/

star: 1.7K+

size: 1.9KB

功能介绍:

模拟打字机效果

showpicture

favico.js - 动态变换网站图标

github:https://github.com/ejci/favico.js

star: 7.6K+

功能介绍:

动态改变网站的 favico图标,可以是图片、html视频等,支持改变颜色、字体、背景颜色等。

move.js - js动态设置 css3动画

github: https://github.com/visionmedia/move.js

star: 4.1K+

功能介绍:

为元素设置css3动画

notie - 网页提示弹窗

github:https://github.com/jaredreich/notie

star: 5.6K+

功能介绍:

平滑出现在网页内的弹窗,类似于 modal窗

notie

particles.js - 粒子动画库

github:https://github.com/VincentGarreau/particles.js

star: 11.1k+

功能介绍:

炫酷的粒子动画

showpicture

popper.js

github:https://github.com/FezVrasta/popper.js

官网:https://popper.js.org/

star: 5.5K+

size: 6KB

功能介绍:

纯 JS 写的轻量级位置计算引擎,零依赖;可用她定制诸如 tooltips等工具,比如 Tippy.js、tooltip.js 就是基于该库打造而成的。

lightgallery.js - 图片&视频展示的gallery

github: https://github.com/sachinchoolur/lightgallery.js

官网:https://sachinchoolur.github.io/lightgallery.js/

star: 3.5k+

功能介绍:

纯 JS 写的图片&视频展示的gallery,提供丰富的API、响应式功能、HTML5特性支持等,功能强大,用于网站的图片专门的浏览页面;

showpicture

APlayer - 快速创建音乐播放器

github:https://github.com/MoePlayer/APlayer

star: 1.8K+

功能介绍:

只需配置参数即可快速创建音乐播放器

showpicture

fabric.js - 简单而强大的 JavaScript Canvas 库

github: https://github.com/kangax/fabric.js

官网:http://fabricjs.com/

star: 8.5K+

功能介绍:

支持 canvas 与 svg、json之间的转换,支持图像形状、过渡色、颜色、角度、字体、动画、手势拖放等

showpicture

intro.js - 向用户一步步介绍网站的新功能

github: https://github.com/usablica/intro.js

官网:http://introjs.com/

star:15K+ 
showpicture

功能介绍:

使用动画来一步步引导用户熟悉网站功能

whatwg-fetch - fetch 的 polyfill

github: https://github.com/github/fetch

star: 15.6k+

功能介绍:

fetch 的 polyfill,支持 IE10+

isomorphic-fetch - 基于 whatwg-fetch 实现的前后端同构 fetch,同时支持 node 与 浏览器

github:https://github.com/matthew-andrews/isomorphic-fetch

star: 4.8K+

功能介绍:

基于 whatwg-fetch 实现的前后端同构 fetch,同时支持 node 与 浏览器

detector - 识别客户端环境

github: https://github.com/hotoo/detector

star: 600+

功能介绍:

用于自动识别用户使用的客户端环境。包括硬件设备、操作系统、浏览器、浏览器渲染引擎

aframe.js - web端 VR引擎

github: https://github.com/aframevr/aframe/

官网:https://aframe.io/

star:6.2K+

功能介绍:

在 web端实现 VR效果,包括 360°全景图片、视频等

Babylon.js - 使用 HTML 5 and WebGL构建 3D 的 javascript引擎

github: https://github.com/BabylonJS/Babylon.js

官网:http://www.babylonjs.com/

star: 5.3K+

功能介绍:

使用 HTML 5 and WebGL构建 3D 的 javascript引擎

AlloyTouch 移动端触摸滑动方案

github: https://github.com/AlloyTeam/AlloyTouch

star: 1.4K

功能介绍:

触摸滑动,可用根据此插件扩展上拉和下拉刷新、轮播、VR等

highlight.js - javascript web高亮

github:https://github.com/isagalaev/highlight.js

star:10k+

功能介绍:

在网页中显示 javascript代码时,自动高亮语法

clipboard.js - 现代浏览器复制到粘贴板的解决方案

github: https://github.com/zenorocha/clipboard.js

star: 18K+

size: 3KB

功能介绍:

浏览器端复制到粘贴板的方法存在着各种兼容性问题,此插件提供了开箱即用的解决方案,支持到 IE9+

showpicture

iview - vue UI组件库

github: https://github.com/iview/iview

star: 8.5K+

功能介绍:

高质量的 vue UI组件库

ant-design - 阿里巴巴开源的 react组件库

github: https://github.com/ant-design/ant-design

star: 16K+

功能介绍:

阿里巴巴开源的 react组件库,支持现代浏览器和 IE9 及以上,支持服务端渲染,支持Electron

awesome-react-components - react UI库列表

github:https://github.com/brillout/awesome-react-components

官网:https://devarchy.com/react

star:9.7K+

功能介绍:

这并不是一个具备什么功能或者效果的技术库,而是一个整合了 github上几乎所有可用的 react UI组件库的列表,在这个列表中,你可以找到几乎所有的 react UI组件,以及众多优秀或者小众的 react UI组件库项目

video.js - HTML5 & Flash 视频播放器

github: https://github.com/videojs/video.js

官网:http://videojs.com/

star: 17k+

功能介绍:

基于 HTML5的网络视频播放器,支持 HTML和 Flash,支持 PC和移动端

sizzy - 网站响应式一键测试

github:https://github.com/kitze/sizzy

star:4.5K+

功能介绍:

同时展现出一个网页在多种设备下显示效果,包括 iphone4、5、6、7、7plus、iPad Air、Nexus6P等

Next.js - React服务端渲染应用框架

github: https://github.com/zeit/next.js

官网: https://zeit.co/blog/next3

star:16K+

功能介绍:

React服务端渲染 SSR应用框架,支持可选的服务端与客户端渲染功能,简单易用,安装这个框架会搭建一个基于React、Webpack和Babel的构建过程,也就是说脚手架已经预设了配置,开发人员不必在搭建Webpack或Babel配置上花费时间了。以往,这两个步骤就会耗费开发人员很多的时间。要运行某个站点的开发版本,只需运行npm run dev。

Nuxt.js - Vue的服务端渲染应用框架

github: https://github.com/nuxt/nuxt.js

官网: https://nuxtjs.org/ 中文:https://zh.nuxtjs.org/

star: 6.3K+

功能介绍:

Vue的服务端渲染应用框架,类别上面的 Next.js,发布时间紧随在 Next.js后面几个小时,同样预设了利用Vue.js开发服务端渲染的应用所需要的各种配置,并且还提供了一种命令叫:nuxt generate,为基于 Vue.js 的应用提供生成对应的静态站点的功能,作为框架,Nuxt.js 为 客户端/服务端 这种典型的应用架构模式提供了许多有用的特性,例如异步数据加载、中间件支持、布局支持等,最美妙的是,与 Vue一样,这东西有中文版,看着就亲切。

react-native-vector-icons - react-native 图标库

github: https://github.com/oblador/react-native-vector-icons

star:5.8K+

功能介绍:

react-native 图标库,整合了 Entypo、EvilIcons、FontAwesome、Foundation、Ionicons、MaterialCommunityIcons等图标库,支持 IOS和 Android

react-native-snap-carousel - react-native的 swiper组件

github:https://github.com/archriss/react-native-snap-carousel

star: 800+

功能介绍:

react-native的 swiper组件

showpicture

react-native-fs - react-native 文件操作插件

github:https://github.com/itinance/react-native-fs

star:1.3K+

功能介绍:

react-native 文件操作插件,兼容 IOS 和 Android

react-navigation - react-native 导航插件

github:https://github.com/react-community/react-navigation

star:6.4K+

功能介绍:

react-native 导航插件,react-native 社区出品,易用,统一 IOS 和 Android间的导航操作,用于替代 react-native官方提供的导航API

react-native-action-view

github:https://github.com/wix/react-native-action-view

star: 50+

功能介绍:

react-native类似于 微信 和 QQ好友列表的删除、置顶的操作,多种样式可选

showpicture

react-native-svg - 在react-native中使用 svg

github:https://github.com/react-native-community/react-native-svg

star:1.5K+

功能介绍:

react-native社区出品,在react-native中使用 svg

showpicture


后续更多实用插件和库将在 github 上持续更新

作者:andyliulin 发表于 2017/10/16 10:15:56  原文链接 https://blog.csdn.net/andyliulin/article/details/78246906
阅读:1166
 
[译]阿里巴巴Java开发规约插件使用

就在今天 10月14日上午9:00 阿里巴巴于在杭州云栖大会《研发效能峰会》上,正式发布《阿里巴巴Java开发手册》扫描插件,该插件在扫描代码后,将不符合《手册》的代码按Blocker/Critical/Major三个等级显示在下方,甚至在IDEA上,还基于Inspection机制提供了实时检测功能,编写代码的同时也能快速发现问题所在。对于历史代码,部分规则实现了批量一键修复的功能。--两个字牛逼
git地址为这里写链接内容
https://github.com/alibaba/p3c

IDea的安装方式:

IDEA版的插件发布到了IDEA官方仓库中(最低支持版本14.1.7,JDK1.7+),
只需打开

 Settings >> Plugins >> Browse repositories 

输入 Alibaba 搜索一下便可以看到对应插件了,点击安装等待安装完成。
如图


这里写图片描述
这里写图片描述

Eclipse的安装方式:

Eclipse版插件支持4.2(Juno,JDK1.8+)及以上版本,提供Update Site,通过

 Help >> Install New Software

然后输入https://p3c.alibaba.com/plugin/eclipse/update 即可看到安装列表,安装即可。

插件的更新,可以通过 Help >> Check for Udates 进行新版本检测。

怎么用

呵呵 右键,,看图 --

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

还有自动提示的效果

这里写图片描述
这里写图片描述

可以说是非常棒了


这里写图片描述
这里写图片描述

文章如有侵权地方,请告知删除


作者:andyliulin 发表于 2017/10/15 23:50:29  原文链接 https://blog.csdn.net/andyliulin/article/details/78245550
阅读:124
 
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值