Comments

ember使用express做后台API服务

使用Ember CLI的ember generate server命令创建server,模块会生成server/index.js文件,该服务是基于Express框架

ember generate server

server/index.js默认内容

module.exports = function(app) {
  var globSync   = require('glob').sync;
  var mocks      = globSync('./mocks/**/*.js', { cwd: __dirname }).map(require);
  var proxies    = globSync('./proxies/**/*.js', { cwd: __dirname }).map(require);

  // Log proxy requests
  var morgan  = require('morgan');
  app.use(morgan('dev'));

  mocks.forEach(function(route) { route(app); });
  proxies.forEach(function(route) { route(app); });

};

从内容分析可以看出,其实这个服务可以让前端更好的mock API的数据做测试,这样在工作配合上前端不需要等后端API调式 可以使用server模拟数据;

也可以自定义API数据接口

// server/index.js
var bodyParser = require('body-parser');

module.exports = function(app) {

  app.use(bodyParser.json({ type: "application/json" }));

  app.get('/api/items/:item', function(req, res) {
    const item = localdb.find('item', req.params.item);
    res.send({ item: item });
  });
}

运行服务

ember server

我们就可以通过http://localhost:4200/api/items/1API获取数据

Comments

Ember容器注入对象

Ember注入是用来将一个对象注入到一个容器里面去,让容器可以访问对象,容器是指routecontrollerhelper

使用用例:

// app/services/session.js
export default Ember.Service.extend({
  isAuthenticated: false
});

// app/initializes/inject-session.js
export function initialize(application) {
  application.inject('route', 'service:session');
}

export default {
  name: 'session',
  initialize: initialize
}


// app/routes/products.js
export default Ember.Route.extend({

  model(){
    this.session
  },
  setupController(controller, model){
    this.session
    ...
  }
});
Comments

Intersection-of-two-arrays

Given two arrays, write a function to compute their intersection.

Example: Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].

Note: Each element in the result must be unique. The result can be in any order.

# @param {Integer[]} nums1
# @param {Integer[]} nums2
# @return {Integer[]}
def intersection(nums1, nums2)
  nums1 & nums2
end
Comments

Reverse Vowels of a String

Write a function that takes a string as input and reverse only the vowels of a string.

Example 1: Given s = “hello”, return “holle”.

Example 2: Given s = “leetcode”, return “leotcede”.

# @param {String} s
# @return {String}
def reverse_vowels(a)
  tmp = a.length.times.inject([]) do |s, i| 
    /(a|e|i|o|u)/i =~ a[i] ? s << i : s
  end
  tmp.length.fdiv(2).ceil.times.each do |i| 
    v, b = tmp[i], tmp[tmp.length-1-i]
    a[v], a[b] = a[b], a[v] if v && b
  end
  a
end
Comments

Devise Warden报错401

今天遇到一个特别的问题在项目里面使用devise应用到User与Admin, 因为User是可以用手机号码和Email登录的, 而Admin只能邮件登录,结果User可以正常登录,但是Admin应该也可以正常登录,但是就是报401密码错误,经过翻看源码发现一个很好的工具,找到出现问题的原因

(byebug) Devise::Models.check_fields!(Admin)
*** Devise::Models::MissingAttribute Exception: The following attribute(s) is (are) missing on your model: phone

因为我在devise.rb配置了

config.authentication_keys = [:email, :phone]

所以我要在Admin模型里面指定authentication_keys

devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable,
     :authentication_keys => [:email]
Comments

Ember-cli入门指南

ember-cli是什么?

ember-cli是一个ember.js提供的一个快速开发命令行工具,可以通过命令构建、运行、测试、部署,很方便 前后端分离,而且ember有很丰富的addon生态社区,把重用的东西组件化, 项目开发完成用build命令会输出一个index.html和编译好的js、css文件这个输出就是静态的,我们可以用nginx或node express服务器来展现编译好的静态资源,其实ember-cli的命令行工具设计的跟Rails相似,addon就是ruby的gem包可能 是因为ember的开发也是Rails核心贡献开发,所以很多设计思想互通。

命令介绍

//构建项目
$ ember new todo

//运行项目
$ ember s

//生成路由
$ ember generate route products/new

//运行测试
$ ember test

//安装addon
$ ember install <addon-name>

目录结构

app/    => 主要包含了models、controller、minxin、routes、template、index.html、application所有项目相关逻辑代码多会在这里面
dist/   => 编译输出目录里面index.html和js、css
public/   => 存放一些静态文件例如:图片、字体
tests/    => 测试逻辑
bower_components/    => bower包依赖源文件
node_modules/     => npm包依赖源文件
vendor/   => 自己扩展依赖
ember-cli-build.js  => 指定编译配置文件
bower.json   => bower依赖配置
package.json    => npm依赖配置

config/environment.js

module.exports = function(environment) {
  var ENV = {
    modulePrefix: 'todo',
    environment: environment,
    baseURL: '/',
    locationType: 'hash',  
    contentSecurityPolicy: {
      'connect-src': "'self' * localhost:3000",
      'img-src': "'self' * data:",
      'style-src': "'self' 'unsafe-inline'"
    }
  };

  if(environment === 'development') {
  }

  if (environment === 'test') {
    ENV.APP.rootElement = '#ember-testing';
  }

  if (environment === 'production') {
  }

  return ENV;
};

bower与npm区别

bower是管理前端库、npm是管理nodo开发使用库,前者是扁平化后者是树形结构。

Comments

检测服务器网络traceroute工具收集

traceroute追踪网络路由工具,可以很详细的看到与服务器之间的每跳路由与访问状态与时间

网关出现问题

$ traceroute 10.1.2.5                                               
traceroute to 10.1.2.5 (10.1.2.5), 64 hops max, 52 byte packets
 1  192.168.1.1 (192.168.1.1)  1.265 ms  0.643 ms  0.660 ms
 2  10.1.1.1 (10.1.1.1)  1.166 ms  1.250 ms  1.115 ms
 3  218.19.177.1 (218.19.177.1)  3.438 ms  5.116 ms  2.960 ms
 4  58.62.222.33 (58.62.222.33)  5.073 ms  3.072 ms  3.620 ms
 5  * * *
 6  * * *
 7  * * *
 8  * * *

追踪当前电脑与10.1.2.5之间的每一跳路由,从上面信息可以看到了第5步时候变成星号说明 问题出在网关,你需要检查这条路线,排查不能再两个网络中传递数据包的原因。

连接网关超时

$ traceroute 10.1.2.5                                               
traceroute to 10.1.2.5 (10.1.2.5), 64 hops max, 52 byte packets
 1  192.168.1.1 (192.168.1.1)  1.265 ms  0.643 ms  0.660 ms
 2  10.1.1.1 (10.1.1.1)  3006.47 ms !H  3006.77 ms !H  3007 ms

这个例子中连接网关超时,所有主机可能已经宕机

诊断网路慢

$ traceroute yohoo.cn
traceroute to 212.82.102.24 (212.82.102.24), 64 hops max, 52 byte packets
 1  192.168.1.1 (192.168.1.1)  2.370 ms  1.435 ms  0.616 ms
 2  10.1.1.1 (10.1.1.1)  1.140 ms  3.270 ms  1.317 ms
 3  218.19.177.1 (218.19.177.1)  3.620 ms  3.441 ms  5.840 ms
 4  183.56.38.189 (183.56.38.189)  17.443 ms  2.369 ms  3.142 ms
 5  121.8.223.5 (121.8.223.5)  5.467 ms  8.928 ms
    61.144.3.10 (61.144.3.10)  4.603 ms
 6  * 202.97.35.246 (202.97.35.246)  106.464 ms  113.461 ms
 7  202.97.91.234 (202.97.91.234)  107.816 ms
    202.97.60.42 (202.97.60.42)  109.543 ms
    202.97.34.90 (202.97.34.90)  105.858 ms
 8  202.97.58.38 (202.97.58.38)  613.035 ms  408.620 ms  314.500 ms

这是yahoo服务器,我们可以通过看每一跳之间的时间得出假设,当你到达第6跳时从4ms跳跃到113ms这说明已经离开本区域了是从中国 雅虎服务器到美国雅虎服务器跳跃。

Comments

服务器性能问题检测工具收集

通过下面这些工具更好的对机器问题进行诊断

uptime

$ uptime                                                        
21:07:48 up 16 days,  7:04,  1 user,  load average: 5.34, 4.70, 4.43

这个命令可以快速查看机器的负载情况,这些数据表示等待CPU资源的进程和堵塞不可以中断IO进程(进程状态为D)的数量 这些数据可以让我们对系统有一个宏观的了解。

解读输出:以逗号隔开第一部分是系统运行的时间,第二部分是登录用户,第三部分是负载平均量。负载量越低意味着你的系统性能越好

dmesg

$ dmesg                                                        
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.2.0-24-generic (buildd@komainu) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #38-Ubuntu SMP Tue May 1 16:18:50 UTC 2012 (Ubuntu 3.2.0-24.38-generic 3.2.16)
[    0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.2.0-24-generic root=/dev/mapper/Apollo-root ro quiet rootdelay=35
[    0.000000] KERNEL supported cpus:
[    0.000000]   Intel GenuineIntel
[    0.000000]   AMD AuthenticAMD
[    0.000000]   Centaur CentaurHauls
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e820: 0000000000000000 - 00000000000a0000 (usable)
[    0.000000]  BIOS-e820: 0000000000100000 - 00000000cf379000 (usable)
[    0.000000]  BIOS-e820: 00000000cf379000 - 00000000cf38f000 (reserved)
[    0.000000]  BIOS-e820: 00000000cf38f000 - 00000000cf3ce000 (ACPI data)
[    0.000000]  BIOS-e820: 00000000cf3ce000 - 00000000d0000000 (reserved)
[    0.000000]  BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
[    0.000000]  BIOS-e820: 00000000fe000000 - 0000000100000000 (reserved)
[    0.000000]  BIOS-e820: 0000000100000000 - 0000000430000000 (usable)
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] DMI 2.6 present.
[    0.000000] DMI: Dell Inc. PowerEdge R410/0WWR83, BIOS 1.9.0 10/21/2011
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usable) ==> (reserved)
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (usable)
[    0.000000] No AGP bridge found.....

命令显示linux内核的环形缓冲区信息,我们可以从中获得诸如系统架构、cpu、挂载的硬件,RAM等多个运行级别的大量的系统信息。当计算机启动时,系统内核(操作系统的核心部分)将会被加载到内存中。在加载的过程中会显示很多的信息,在这些信息中我们可以看到内核检测硬件设备。

vmstat

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
4  0 2546312 255760 147032 610412    2    2     9    76    1    7 61  4 33  2

每行会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。后面跟的参数1,表示每秒输出一次统计信息,表头提示了每一列的含义,这几介绍一些和性能调优相关的列

r:等待在CPU资源的进程数。这个数据比平均负载更加能够体现CPU负载情况,数据中不包含等待IO的进程。如果这个数值大于机器CPU核数,那么机器的CPU资源已经饱和。
free:系统可用内存数(以千字节为单位),如果剩余内存不足,也会导致系统性能问题。下文介绍到的free命令,可以更详细的了解系统内存的使用情况。
si, so:交换区写入和读取的数量。如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足。
us, sy, id, wa, st:这些都代表了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)、IO等待时间(wait)和被偷走的时间(stolen,一般被其他虚拟机消耗)。

mpstat

$ mpstat -P ALL 1    
Linux 3.2.0-24-generic  01/28/2016  _x86_64_  (4 CPU)

09:29:33 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
09:29:34 PM  all   76.69    0.00    3.51    5.51    0.00    0.00    0.00    0.00   14.29
09:29:34 PM    0   99.01    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00
09:29:34 PM    1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
09:29:34 PM    2   48.98    0.00    6.12   13.27    0.00    0.00    0.00    0.00   31.63
09:29:34 PM    3   57.58    0.00    7.07   10.10    0.00    0.00    0.00    0.00   25.25

该命令可以显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的

pidstat

$ pidstat 1                                                 
Linux 3.2.0-24-generic   01/28/2016  _x86_64_  (4 CPU)

09:31:23 PM       PID    %usr %system  %guest    %CPU   CPU  Command
09:31:24 PM      1046    0.00    0.99    0.00    0.99     2  kworker/2:2
09:31:24 PM      2513    0.99    2.97    0.00    3.96     2  node
09:31:24 PM     18578  200.99    0.00    0.00  200.99     1  java
09:31:24 PM     21124    0.99    0.00    0.00    0.99     2  java
09:31:24 PM     27197    0.00    1.98    0.00    1.98     2  pidstat
09:31:24 PM     27228    2.97    0.00    0.00    2.97     3  node

pidstat命令输出进程的CPU占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态。如上的输出,可以看见一个JAVA进程占用了将近200%的CPU时间,既消耗了大约2个CPU核心的运算资源。

iostat

$ iostat -xz 1                                                                  
Linux 3.2.0-24-generic  01/28/2016  _x86_64_  (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          60.65    0.01    4.03    2.38    0.00   32.92

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.85    19.84    4.07   32.00    35.01   300.28    18.60     0.70   19.37    4.74   21.23   5.05  18.20
dm-0              0.00     0.00    2.92   50.06    26.91   293.12    12.08     1.07   20.23    6.97   21.01   3.42  18.13
dm-1              0.00     0.00    2.02    1.79     8.09     7.16     8.00     1.75  459.97    6.14  972.71   0.70   0.27

iostat命令主要用于查看机器磁盘IO情况。该命令输出的列,主要含义是:

r/s, w/s, rkB/s, wkB/s:分别表示每秒读写次数和每秒读写数据量(千字节)。读写量过大,可能会引起性能问题。
await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。
avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。
%util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。

free

$ free -m
         total       used       free     shared    buffers     cached
Mem:      16420044   16166340     253704          0     146060     611384
-/+ buffers/cache:   15408896    1011148
Swap:     11878396    2545148    9333248

free命令可以查看系统内存的使用情况

sar

$ sar -n DEV 1
Linux 3.2.0-24-generic   01/28/2016  _x86_64_  (4 CPU)

09:39:12 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
09:39:13 PM        lo     47.00     47.00      5.09      5.09      0.00      0.00      0.00
09:39:13 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:39:13 PM      eth0     26.00     36.00      3.23      3.01      0.00      0.00      1.00
Comments

El Capitan Ruby-oci8 2.1.4 安装报错

升级MacOS El Capitan后安装oracle的ruby-oci8 2.1.4版本gem包报错信息如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  Installing ruby-oci8 2.1.4 with native extensions

  Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

  /Users/huxinghai/.rvm/rubies/ruby-2.0.0-p643/bin/ruby -r ./siteconf20151231-1172-1r9gor0.rb extconf.rb
  checking for load library path...
  DYLD_LIBRARY_PATH is not set.
  checking for cc... ok
  checking for gcc... yes
  checking for LP64... yes
  checking for sys/types.h... yes
  checking for ruby header... ok
  Get the version of Oracle from SQL*Plus... 1120
  try  -I/opt/oracle/instantclient_11_2/rdbms/public
  checking for oci.h... no
  try  -I/opt/oracle/instantclient_11_2/rdbms/public -I/opt/oracle/instantclient_11_2/rdbms/demo
  checking for oci.h... no
  try  -I/opt/oracle/instantclient_11_2/rdbms/public -I/opt/oracle/instantclient_11_2/rdbms/demo -I/opt/oracle/instantclient_11_2/network/public
  checking for oci.h... no
  try  -I/opt/oracle/instantclient_11_2/rdbms/public -I/opt/oracle/instantclient_11_2/rdbms/demo -I/opt/oracle/instantclient_11_2/network/public -I/opt/oracle/instantclient_11_2/plsql/public
  checking for oci.h... no
  *** extconf.rb failed ***
  Could not create Makefile due to some reason, probably lack of necessary
  libraries and/or headers.

这里面有一个重要的信息DYLD_LIBRARY_PATH is not set但是我在~/.bash_profile文件里面配置了DYLD_LIBRARY_PATH路径,我在终端env | grep DYLD_LIBRARY_PATH但是为空,后来我在终端export DYLD_LIBRARY_PATH=/opt/oracle/instantclient_11_2还是为空,但是export其它的环境变量都有值,后来查资料看到一个El Capitan SIP(System Integrity Protection)这个词,google了一个SIP才明白是El Capitan版本的一个安全策略, SIP把DYLD_LIBRARY_PATH保护起来了,所以的把SIP关闭才可以正常设置DYLD_LIBRARY_PATH, 关闭SIP后export DYLD_LIBRARY_PATH变量就成功了。

关闭SIP步骤

  1. 重启系统, 在启动时候按Command+R进入恢复模式图形界面
  2. 点击使用工具 > Terminal
  3. 在终端输入csrutil disable命令按回车,会提示是否成功
  4. 重启系统
Copyright © 2016 kaka