前言

默认安装完 semantic-ui 你会发现写个demo页 很慢,调试发现。

1
2
3
4
Request URL:https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic&subset=latin
Request Method:GET
Status Code:200  (from memory cache)
Remote Address:203.208.43.78:443

这是去 google 下载了,然后被墙…

啥也不说 按如下修改

动手修改

semantic-ui是模板机制的,打开目录

/semantic/src/themes

打开所需的模板文件

/semantic/src/themes/default/globals/site.variables

修改默认字体

  • 原来
1
@fontName          : 'Lato';
  • 修改为
1
@fontName          : 'Microsoft YaHei';

屏蔽从谷歌下载

  • 原来
1
@importGoogleFonts : true;
  • 修改为
1
@importGoogleFonts : false;

重新编译

源码方式使用,请参考我前一篇文

1
2
cd semantic/
gulp build

我的博客

Read More

安装

yum install screen

创建screen会话

screen -S xxx

暂时离开,保留screen会话中的任务或程序

可以用快捷键Ctrl+a d(即按住Ctrl,依次再按a,d)

恢复screen会话

screen -r xxx

当前screen列表

screen -ls

关闭screen的会话

exit

远程演示

screen -x xxx

常用快捷键

Ctrl+a c :在当前screen会话中创建窗口 Ctrl+a w :窗口列表 Ctrl+a n :下一个窗口 Ctrl+a p :上一个窗口 Ctrl+a 0-9 :在第0个窗口和第9个窗口之间切换

我的博客

Read More

配置

安装

  • 检查本机包版本
1
rpm -q cronie
  • 安装
1
yum install cronie

centos6 操作

1
2
3
4
5
启动、停止、重启服务和重新加载配置
/sbin/service crond start
/sbin/service crond stop
/sbin/service crond restart
/sbin/service crond reload

开机启动

1
chkconfig crond on

centos7 操作

1
2
3
4
5
6
7
8
检查服务状态
systemctl status crond.service

启动服务
systemctl start crond.service

重启服务
systemctl restart crond.service

加入系统启动

  • centos7
1
systemctl enable crond.service
  • centos6
1
2
vi /etc/rc.d/rc.local
/sbin/service crond start

检查服务

1
cat /etc/crontab

任务设置

权限

  • 允许

/etc/cron.allow

  • 限制

/etc/cron.deny

一个用户账号一行 allow 大于 deny 两个文件中有一个就行

添加个人任务

  • 任务会被写入这里

/var/spool/cron/

  • 命令
crontab [-u username] [-l -e -r]

-u 指定给某个用户派任务 -e 编辑工作内容 -l 查询工作内容 -r 清空任务

  • 指令格式
1
2
3
* * * * * 命令
分钟 小时 时间 月份 周 指令
0-59 0-23 1-31 1-12 0-7
  • 字符
1
2
3
4
5
6
7
8
9
10
11
*(星号)
	代表任何时刻都接受的意思!举例来说,范例一内那个日、月、週都是 * , 就代表著『不论何月、何日的礼拜几的 12:00 都执行后续指令』的意思!

,(逗号)
代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是:0 3,6 * * * command时间参数还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用!

-(减号)
代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作:20 8-12 * * * command仔细看到第二栏变成 8-12 喔!代表 8,9,10,11,12 都适用的意思!

/n(斜线)
那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则:*/5 * * * * command很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!

我的博客

Read More

必要性

nodejs+express 一旦err,整个进程就会挂了,所以需要一个守护进程来管理,发现挂了 自动重启~

pm2 就是一个不错的守护进程管理。

https://github.com/Unitech/pm2

安装

1
npm install pm2 -g

升级

1
pm2 update

基础命令

启动 nodejs 程序

1
pm2 start do.js

查看所有nodejs进程

1
2
3
4
5
6
7
8
pm2 lsit

┌──────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬──────────┬──────────┐
│ App name │ id │ mode │ pid   │ status │ restart │ uptime │ cpu │ mem      │ watching │
├──────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────┼──────────┼──────────┤
│ do       │ 0  │ fork │ 10854 │ online │ 0       │ 0s     │ 9%  │ 5.8 MB   │ disabled │
└──────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴──────────┴──────────┘

cpu / 内存 状态

1
2
3
4
5
6
7
8
pm2 monit

⌬ PM2 monitoring (To go further check o[                              ] 0 %
                                       [|||||||||||||||||||||||||||   ] 87.430 MB  B  M2 monitoring (To go further check out https://app.keymetrics.io) 

 ● do
[0] [fork_mode]

停止

1
pm2 stop 0

重启

1
pm2 restart 0

移除

1
pm2 delete 0

所有命令

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# General
$ npm install pm2 -g            # Install PM2
$ pm2 start app.js              # Start, Daemonize and auto-restart application (Node)
$ pm2 start app.py              # Start, Daemonize and auto-restart application (Python)
$ pm2 start npm -- start        # Start, Daemonize and auto-restart Node application

# Cluster Mode (Node.js only)
$ pm2 start app.js -i 4         # Start 4 instances of application in cluster mode
                                # it will load balance network queries to each app
$ pm2 reload all                # Zero Second Downtime Reload
$ pm2 scale [app-name] 10       # Scale Cluster app to 10 process

# Process Monitoring
$ pm2 list                      # List all processes started with PM2
$ pm2 monit                     # Display memory and cpu usage of each app
$ pm2 show [app-name]           # Show all informations about application

# Log management
$ pm2 logs                      # Display logs of all apps
$ pm2 logs [app-name]           # Display logs for a specific app
$ pm2 logs --json               # Logs in JSON format
$ pm2 flush
$ pm2 reloadLogs

# Process State Management
$ pm2 start app.js --name="api" # Start application and name it "api"
$ pm2 start app.js -- -a 34     # Start app and pass option "-a 34" as argument
$ pm2 start app.js --watch      # Restart application on file change
$ pm2 start script.sh           # Start bash script
$ pm2 start app.json            # Start all applications declared in app.json
$ pm2 reset [app-name]          # Reset all counters
$ pm2 stop all                  # Stop all apps
$ pm2 stop 0                    # Stop process with id 0
$ pm2 restart all               # Restart all apps
$ pm2 gracefulReload all        # Graceful reload all apps in cluster mode
$ pm2 delete all                # Kill and delete all apps
$ pm2 delete 0                  # Delete app with id 0

# Startup/Boot management
$ pm2 startup                   # Detect init system, generate and configure pm2 boot on startup
$ pm2 save                      # Save current process list
$ pm2 resurrect                 # Restore previously save processes
$ pm2 unstartup                 # Disable and remove startup system

$ pm2 update                    # Save processes, kill PM2 and restore processes
$ pm2 generate                  # Generate a sample json configuration file

# Deployment
$ pm2 deploy app.json prod setup    # Setup "prod" remote server
$ pm2 deploy app.json prod          # Update "prod" remote server
$ pm2 deploy app.json prod revert 2 # Revert "prod" remote server by 2

# Module system
$ pm2 module:generate [name]    # Generate sample module with name [name]
$ pm2 install pm2-logrotate     # Install module (here a log rotation system)
$ pm2 uninstall pm2-logrotate   # Uninstall module
$ pm2 publish                   # Increment version, git push and npm publish

视图化管理器

https://app.keymetrics.io/

我的博客

Read More

常见错误

gradle 没有正确下载

  • 运行命令 cordova platform add android –save 提示错误
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
34
35
36
37
38
hansdeMacBook-Pro:Jd-mobile-app hans$ cordova platform add android --save
Adding android project...
Creating Cordova project for the Android platform:
	Path: platforms/android
	Package: com.itcast.jd.mobile
	Name: JdMobileApp
	Activity: MainActivity
	Android target: android-24
Subproject Path: CordovaLib
Android project created with cordova-android@6.0.0
Installing "cordova-plugin-inappbrowser" for android
ANDROID_HOME=/Users/hans/Documents/Eclipse/sdk/
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home
Subproject Path: CordovaLib
Unzipping /Users/hans/.gradle/wrapper/dists/gradle-2.14.1-all/53l0mv9mggp9q5m2ip574m21oh/gradle-2.14.1-all.zip to /Users/hans/.gradle/wrapper/dists/gradle-2.14.1-all/53l0mv9mggp9q5m2ip574m21oh
Exception in thread "main" java.lang.RuntimeException: java.util.zip.ZipException: error in opening zip file
	at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:78)
	at org.gradle.wrapper.Install.createDist(Install.java:47)
	at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
	at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: java.util.zip.ZipException: error in opening zip file
	at java.util.zip.ZipFile.open(Native Method)
	at java.util.zip.ZipFile.<init>(ZipFile.java:219)
	at java.util.zip.ZipFile.<init>(ZipFile.java:149)
	at java.util.zip.ZipFile.<init>(ZipFile.java:163)
	at org.gradle.wrapper.Install.unzip(Install.java:160)
	at org.gradle.wrapper.Install.access$400(Install.java:29)
	at org.gradle.wrapper.Install$1.call(Install.java:70)
	at org.gradle.wrapper.Install$1.call(Install.java:47)
	at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
	... 3 more
Failed to install 'cordova-plugin-inappbrowser':Error: /Users/hans/Documents/itcast-project/电商网站/Jd-mobile-app/platforms/android/gradlew: Command failed with exit code 1
    at ChildProcess.whenDone (/Users/hans/Documents/itcast-project/电商网站/Jd-mobile-app/platforms/android/cordova/node_modules/cordova-common/src/superspawn.js:169:23)
    at emitTwo (events.js:87:13)
    at ChildProcess.emit (events.js:172:7)
    at maybeClose (internal/child_process.js:821:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:211:5)
Error: /Users/hans/Documents/itcast-project/电商网站/Jd-mobile-app/platforms/android/gradlew: Command failed with exit code 1

错误信息很多,这是java堆栈方式抛出错误,我从顶部开始看 Unzipping /Users/hans/.gradle/wrapper/dists/gradle-2.14.1-all/53l0mv9mggp9q5m2ip574m21oh/gradle-2.14.1-all.zip to /Users/hans/.gradle/wrapper/dists/gradle-2.14.1-all/53l0mv9mggp9q5m2ip574m21oh Exception in thread “main” java.lang.RuntimeException: java.util.zip.ZipException: error in opening zip file 有这两行描述,我们打开文件夹浏览 /Users/hans/.gradle/wrapper/dists/gradle-2.14.1-all/53l0mv9mggp9q5m2ip574m21oh/gradle-2.14.1-all.zip

  • 方法一: 删除 gradle-2.14.1-all.zip 下载失败的文件

去官网下载正确的 https://services.gradle.org/distributions

  • 方法二: 删除 gradle-2.14.1-all.zip , 删除 /platforms/android/ 文件夹 ,重新运行 命令 cordova platform add android –save

会自动重新下载gradle-2.14.1-all.zip,并执行后续操作

#

我的博客

Read More

前言

helloworld!的意义重要,就无需我多说了吧。按步骤来就行。

1. 安装 eclipse for ee

2. 配置 tomcat 服务

3. 下载 spring jar

http://maven.springframework.org/release/org/springframework/spring/

我这里选择 4.3.5.RELEASE

http://maven.springframework.org/release/org/springframework/spring/4.3.5.RELEASE/

4. 下载 Commons Logging jar

http://commons.apache.org/proper/commons-logging/download_logging.cgi

5. 新建项目 springMVC01

  • 项目类型 Dynamic Web project

  • 输入项目名称 及 配置

  • 完成后项目结构

6. 加入所需的 jar 文件

7. 编辑 web.xml

/WEB-INF/web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    
    <!-- 配置DispatchcerServlet -->
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置Spring mvc下的配置文件的位置和名称 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
</web-app>

mvc的配置都在文件 springmvc.xml 中 servlet-mapping 表示拦截模式,

1
/
表示对所有请求

8. springmvc.xml 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
        
        
        <!-- 配置自动扫描的包 -->
        <context:component-scan base-package="com.yuu.springmvc"></context:component-scan>
        
        <!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name = "prefix" value="/WEB-INF/views/"></property>
            <property name = "suffix" value = ".jsp"></property>
        </bean>
</beans>

9. 编写 HelloWorld.java

  • 新建包

com.yuu.springmvc.controller

  • HelloWorld.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.yuu.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloWorld {
	
    /**
     * 1. 使用RequestMapping注解来映射请求的URL
     * 2. 返回值会通过视图解析器解析为实际的物理视图, 对于InternalResourceViewResolver视图解析器,会做如下解析
     * 通过prefix+returnVal+suffix 这样的方式得到实际的物理视图,然后会转发操作
     * "/WEB-INF/views/success.jsp"
     * @return
     */
    @RequestMapping("/helloworld")
    public String hello(){
        System.out.println("hello world");
        return "success";
    }
}

我的博客

Read More

tomcat安装

下载

http://tomcat.apache.org/download-90.cgi http://mirrors.cnnic.cn/apache/tomcat/tomcat-9/v9.0.0.M15/bin/apache-tomcat-9.0.0.M15.zip

解压到 /Library

/Library/Tomcat/

设置 755 sh 权限

sudo chmod 755 /Library/Tomcat/bin/*.sh

启动

sudo sh /Library/Tomcat/bin/startup.sh

关闭

sudo sh /Library/Tomcat/bin/shutdown.sh

浏览

http://localhost:8080/

eclipse 下配置

我的博客

Read More

插件库

https://projects.eclipse.org/search/projects

语法提示

Preferences->Java->Editor->Content Assist

Auto Activeion triggers for Java: abcdefghijklmnopqrstuvwxyz.

快捷键

command

命令 操作
Command+1 快速修复
Command+d 删除当前行
Command+Option+↓ 复制当前行到下一行
Command+Option+↑ 复制当前行到上一行
Command+← 移动光标至当前行的行首
Command+→ 移动光标至当前行的行尾
Command+t 快速显示当前类的结构
Command+w 关闭当前编辑页
Command+Option+← 前一个编辑的页面
Command+Option+→ 后一个编辑的页面
Command+k 参考当前编辑页选中的关键字向下搜索
Command+e 显示当前编辑页面列表可选择页面进行切换
Command+/ 注释或反注释当前行
Command+Shift+e 显示Editor管理器,可选择切换editor
Command+j 正向查找,在当前编辑页中查找录入的字符,注意Eclipse状态栏的提示
Command+Shift+J 反向查找,使用方式与正向查找类似
Command+Shift+W 关闭所有打开的Editor
Command+Shift+P 定位匹配符,适用于代码规模比较大的场景,如在while(){}循环体的末尾}处,想要跳转到while(){处。
Command+[ 向后导航到上一个编辑的文件
Command+] 向前导航到下一个编辑的文件

option

命令 操作
Option+↓ 向下移动当前行
Option+↑ 向上移动当前行
Option+回车 显示当前选择资源的属性
Option+/ 代码助手“智能提示”
Option+Command+R 重命名
Option+Command+C 修改函数结构,适用重构
Option+Command+L 抽取本地变量

shift

命令 操作
Shift+Command+↑ 选中光标至全部文本的开头
Shift+Command+↓ 选中光标至全部文本的结尾
Shift+Command+→ 选中光标至当前行的结尾
Shift+Command+← 选中光标至当前行的开头

我的博客

Read More

适用范围

大批量数据并行处理,比如批量插入数据库、批量下载资源。 程序流程控制 可用于浏览器

手册

https://www.npmjs.com/package/async http://caolan.github.io/async/

当前版本 v2.1.4 由三部分组成

  1. Collections 集合
  2. Control Flow 流程
  3. Utils 工具

安装

1
npm install --save async

函数规则

xxxLimit 控制并行处理的数量

xxxSeries 按顺序执行

Collections 集合

名称 说明
concat 将多个异步操作的结果合并为一个数组。
concatSeries  
detect 用于取得集合中满足条件的第一个元素。
detectLimit  
detectSeries  
each 如果想对同一个集合中的所有元素都执行同一个异步操作。
eachLimit  
eachSeries  
eachOf key value 方式迭代
eachOfLimit  
eachOfSeries  
every 如果集合里每一个元素都满足条件,则传给最终回调的result为true,否则为false
everyLimit  
everySeries  
filter 使用异步操作对集合中的元素进行筛选, 需要注意的是,iterator的callback只有一个参数,只能接收true或false。
filterLimit  
filterSeries  
map 对集合中的每一个元素,执行某个异步操作,得到结果。所有的结果将汇总到最终的callback里。与each的区别是,each只关心操作不管最后的值,而map关心的最后产生的值。
mapLimit  
mapSeries  
mapValues key value 方式遍历
mapValuesLimit  
mapValuesSeries  
reduce 可以让我们给定一个初始值,用它与集合中的每一个元素做运算,最后得到一个值。reduce从左向右来遍历元素,如果想从右向左,可使用reduceRight。
reduceRight 从右侧开始
reject reject跟filter正好相反,当测试为true时则抛弃
rejectLimit  
rejectSeries  
some 当集合中是否有至少一个元素满足条件时,最终callback得到的值为true,否则为false.
someLimit  
someSeries  
sortBy 对集合内的元素进行排序,依据每个元素进行某异步操作后产生的值,从小到大排序。
transform 对集合内元素加工 并返回最终结果

Control Flow 流程

名称 说明
applyEach 实现给一数组中每个函数传相同参数,通过callback返回。如果只传第一个参数,将返回一个函数对象,我可以传参调用。
applyEachSeries 按函数先后返回
auto 用来处理有依赖关系的多个任务的执行。
autoInject  
cargo 一个串行的消息队列,类似于queue,通过限制了worker数量,不再一次性全部执行。不同之处在于,cargo每次会加载满额的任务做为任务单元,只有任务单元中全部执行完成后,才会加载新的任务单元。
compose 创建一个包括一组异步函数的函数集合,每个函数会消费上一次函数的返回值。把f(),g(),h()异步函数,组合成f(g(h()))的形式,通过callback得到返回值。
during  
doDuring  
until until与whilst正好相反,当test为false时循环,与true时跳出。其它特性一致。
doUntil doUntil与doWhilst正好相反,当test为false时循环,与true时跳出。其它特性一致。
whilst 相当于while,但其中的异步调用将在完成后才会进行下一次循环。
doWhilst 相当于do…while, doWhilst交换了fn,test的参数位置,先执行一次循环,再做test判断。
forever 无论条件循环执行,如果不出错,callback永远不被执行。
parallel 并行执行多个函数,每个函数都是立即执行,不需要等待其它函数先执行。传给最终callback的数组中的数据按照tasks中声明的顺序,而不是执行完成的顺序。
parallelLimit  
priorityQueue  
queue 是一个串行的消息队列,通过限制了worker数量,不再一次性全部执行。当worker数量不够用时,新加入的任务将会排队等候,直到有新的worker可用。
race  
retry  
retryable  
seq  
series 串行执行,一个函数数组中的每个函数,每一个函数执行完成之后才能执行下一个函数。
times 异步运行,times可以指定调用几次,并把结果合并到数组中返回
timesLimit  
timesSeries  
waterfall 按顺序依次执行一组函数。每个函数产生的值,都将传给下一个。

Utils 工具

名称 说明
apply 创建函数表达式 async.apply(函数, 参数1, 参数2),
asyncify  
constant  
dir 与log类似,不同之处在于,会调用浏览器的console.dir()函数,显示为DOM视图。
ensureAsync  
log 执行某异步函数,并记录它的返回值,日志输出。
memoize 让某一个函数在内存中缓存它的计算结果。对于相同的参数,只计算一次,下次就直接拿到之前算好的结果。
nextTick  
reflect  
reflectAll  
setImmediate  
timeout  
unmemoize 让已经被缓存的函数,返回不缓存的函数引用。

我的博客

Read More