在Angular项目中提供国际化支持

文本国际化支持在angular社区中又很多开源的模块, 我筛选出一个比较好用的模块作为项目提供国际化支持

下面介绍如何使用angular-gettext为你的项目提供国际化支持

安装模块

1
bower install angular-gettext --save

NPM常用命令

1. 初始化一个全新的模块

1
mkdir project1 && cd project1
npm init

命令执行完成,会在当前目录下生成package.json文件, 这是编写一个公共模块的基本步骤, 像普通项目一样,可以npm install $package_name安装依赖的其他模块

关于英语口语培训

最近报了一个川外的英语培训班, 中教25小时, 外教25小时, 中教的课程现在完毕算是能开口说话了.中教是一个重庆妹子, 在美国某个大学(忘了)留学回来,一口流利美式英语, 她给我们说关于美国梦, 关于gay, lesbian的成人话题, 猜词游戏, 用英文描述, 用英文思考.

老师和其他学员都是女生, 就我一个男的, 而且我又使一个技术宅男,貌似很多话题我比较难参与. 前天开始上外教的课程, Bill(非洲裔), 老妈是法国的, 老爸是英国的. 上课嘻嘻哈哈的蛮好玩.他给我们说他的major是体育, 在什么地方教我忘了,教足球的. 顺带的教点英语整点零花钱么?

每周一,三,四的课. 下班就要往教室赶, 坐地铁大概需要40分钟. 2个小时的课, 8点半结束, 回家大概9点多. 这样的过程持续了一个月, 感觉生活还是比较充实.

说起来我为什么要参加口语培训:

  • 如果有可能去一个外资公司, 我还是比较期待的, 可以和很多外国人工作,交流.
  • 可以在专业上帮助我获取国外的一手资料
  • 通过口语培训认识了一些人,知道了一些事.

总之, 参加这次口语培训还是不亏的, 原因嘛,就是我现在看到什么想到什么都向用英文去表达和思考, 这是这次口语培训的结果, 欣喜.

Sequelize 查询

sequelize.query()方法以及参数

1
sequelize.query('your query', [, callee], [, options], [, replacements])

简单查询

1
sequelize.query("SELECT * FROM users").success(function(users) {
  console.log(users)
})

映射到模型定义

1
sequelize
  .query('SELECT * FROM users', Users)
  .success(function(users){
    console.log(users)
  })

用户模型定义如下:

1
var moment = require('moment');
module.exports = function (sequelize, DataTypes) {
    var user = sequelize.define('user', {
        id: {
            type: DataTypes.INTEGER(11).UNSIGNED,
            primaryKey: true,
            autoIncrement: true,
            unique: true,
            allowNull: false,
            comment: '用户ID',
            description: '用户ID'
        },
        username: {
            type: DataTypes.STRING,
            allowNull: false,
            comment: '用户名',
            description: '用于登陆的用户名称',
            search: true
        },
        hashed_password: {
            type: DataTypes.STRING,
            allowNull: false,
            comment: '密码,可为明文,也可以为密码的SHA1值,如果是HASH值,长度必须等于40',
            description: '密码HASH',
            search: false
        },
        mail: {
            type: DataTypes.STRING,
            allowNull: true,
            comment: '邮件地址',
            defaultValue: '',
            search: true
        },
        admin: {
            type: DataTypes.BOOLEAN,
            allowNull: false,
            defaultValue: 0
        },
        status: {
            type: DataTypes.INTEGER(11).UNSIGNED,
            allowNull: false,
            defaultValue: 0,
            comment: '用户状态'
        },
        last_login: {
            type: DataTypes.DATE,
            allowNull: true,
            comment: '上次登录时间,时间格式为 YYYY-MM-DD HH:mm:ss',
            defaultValue: null,
            get: function(){
                return moment(this.getDataValue('updated_at')).format('YYYY-MM-DD HH:mm:ss');
            }
        },
        salt: {
            type: DataTypes.STRING,
            allowNull: true,
            defaultValue: null
        }
    }, {
        comment: '用户基本数据表',
        getterMethods: {
            created_at: function () {
                return moment(this.getDataValue('created_at')).format('YYYY-MM-DD HH:mm:ss');
            },
            updated_at: function () {
                return moment(this.getDataValue('updated_at')).format('YYYY-MM-DD HH:mm:ss');
            }
        },
        classMethods: {
            associate: function (models) {
                user.hasMany(models.device);
                user.hasMany(models.business);
                user.hasMany(models.billing);
                user.hasMany(models.favorite);
                user.belongsTo(models.payment_type);
                user.belongsTo(models.payment_method);
                user.hasOne(models.box);
            }
        }
    });
    return user;
};

选项是一个又如下keys的对象:

1
sequelize
  .query('SELECT 1', null, {
    // 一个函数(或为false) 用于记录每次发送到数据库服务器的SQL查询
    logging: console.log,
    // 如果plain设置为true,那么sequelize只返回结果集的第一行记录. 如果为false返回查询的所有记录
    plain: false,
    // 如果查询没有关联的模型定义,设置为true
    raw: false
  })

第二个参数为空,当我们设置{raw:true},第二个参数将被忽略, 改查询任然返回一个原始对象

1
sequelize
  .query('SELECT * FROM projects', null, { raw: true })
  .success(function(projects) {
    console.log(projects)
  })

把Hubspot messaging 库作为Angular服务使用

第一步

HTML文件中引入依赖库

1
<link rel="stylesheet" href="./components/messenger/build/css/messenger.css"/>
<link rel="stylesheet" href="./components/messenger/build/css/messenger-theme-air.css"/>
<link rel="stylesheet" href="./components/messenger/build/css/messenger-theme-flat.css"/>
<link rel="stylesheet" href="./components/messenger/build/css/messenger-theme-future.css"/>
<script type="text/javascript" src="./components/messenger/build/js/messenger.min.js"></script>
<script type="text/javascript" src="./components/messenger/build/js/messenger-theme-future.js"></script>
<script type="text/javascript" src="./components/messenger/build/js/messenger-theme-flat.js"></script>

使用node-reggie搭建超轻量级的私有npm仓库

为了提高安装npm包的速度, 之前按照npm官方的教程搭建过一个本地npm镜像仓库, 安装配置过程太过繁琐,明显不适用与敏捷的要求. 包文件存储在couchdb数据库中, 500多G的数据太过庞大. 管理起来巨麻烦.

reggie 是一个基于文件系统目录的超轻量级的npm本地仓库, 用于私有模块的版本管理, 部署还是很好用的, 下面只需要简单的几个命令行就可以跑起来. 使用感觉很Nice, 不会消耗过多的时间,简单实用.

定制Bootstrap3

以前开发项目都是找现成的模板, 经历多个项目后, 总是达不到理想的效果. 为了完全能够定制Web页面的外观,又不会把Bootstrap本身的文件改的面目全非,因此需要创建自定义文件结构

安装前端工具包

1
sudo npm install -g bower
sudo npm install -g lessc

本文所展示的示例是在phpstorm下完成的, 要自动编译less文件,需要用到lessc编译器, 打开less文件时,phpstrom会自动提示安装less插件,按提示安装即可,需要重启phpstrom.

图片底部字幕效果

要点:

  • 一个容器DIV, 类名称为caption-wrapper
  • caption-wrapper中包含两个子元素 imgdiv.caption-description
  • div.caption-description 中包含一个p.caption-text

效果

图片底部字幕效果

nodemailer

nodemailer

简介

nodemailer 是一个 node.js 的邮件客户端库, 常用语服务器端发送邮件.

项目地址:
http://www.nodemailer.com

nodemailer 支持的功能:

  • Unicode
  • HTML 内容, 纯文本内容
  • 附件
  • 在HTML中嵌入图片
  • SSL/STARTTLS
  • transport methods (传输方法)
  • 自定义插件
  • XOAUTH2

广告统计参数和指标

点击率

来自Google的定义

点击率是指您的广告所获得的点击次数除以其展示次数所得的比值。

简介:点击率是指用户看到广告后点击该广告的频率:
点击率 = 广告点击次数
展示次数(广告获得的观看次数)
示例:如果您获得了 5 次点击和 1000 次展示,点击率就是 0.5%。

下面的链接是Google关于CTR的解释
https://support.google.com/adxbuyer/answer/1082461?hl=zh-Hans

广告请求点击率 (CTR) 的计算方法是:用广告点击次数除以广告请求的数量.

1
Ad request CTR = Clicks / Ad requests

例如,如果您通过 1000 次广告请求获得了 7 次点击,则您的广告请求 CTR 为 0.7%.(7/1000 = 0.7%)

点击率 来自于英文 Click-through Rate(点进率) 以及 Clicks Ratio(点击率),是指网站页面上某一内容被点击的次数与被显示次数之比,即 clicks/views,它是一个百分比.反映了网页上某一内容的受关注程度,常常用来衡量广告的吸引程度.

$$
点击率(CTR) = \frac{点击数(Clicks)}{查看数(Views)}*100 \%
$$

互联网交互广告技术-规范和实现

规范

缩写 全称 中文
VAST Video Ad Serving Template 数字视频广告服务(投放)模板
VPAID Video Player Ad Interface Definition 数字视频播放器广告接口定义
VMAP Video Multiple Ad Playlist 数字视频多广告播放列表
N/A Digital Video Ad Format Guidelines and Best Practices 数字视频广告格式指导原则和最佳实践
N/A Digital Video In-Stream Ad Metrics Definitions 数字视频插播广告指标定义
IAB Interactive Advertising Bureau 交互式广告署
Preroll 前置广告: 在视频/电视/电影开始播放内容前的15秒或30秒或60秒广告
MRAID Mobile Rich-media Ad Interface Definition 移动富媒体广告接口定义

Markdown Chart, 一个基于Markdown语法的聊天工具

克隆项目仓库

1
git clone https://github.com/developerworks/markdown-chat

这里为了能对该项目进行定制,我把他克隆到了自己的github仓库.

安装依赖库

在执行这一步的时候确保以及安装好了bower前端包管理工具

1
sudo npm install -g bower

切换到markdown-chat目录, 安装项目依赖库

1
cd /path/to/markdown-chat
npm install
bower install