AngularJS和Polymer双向绑定支持
Web组件使编写封装的视图片段
和独立于任何框架的逻辑
成为可能. 目前支持核心元素(core
)和paper
元素.
例如, 下面的代码把<paper-input>
元素的inputValue
属性和Angular
作用域的myText
属性进行双向绑定
1 | <paper-input ng-model="myText"></paper-input> |
Web组件使编写封装的视图片段
和独立于任何框架的逻辑
成为可能. 目前支持核心元素(core
)和paper
元素.
例如, 下面的代码把<paper-input>
元素的inputValue
属性和Angular
作用域的myText
属性进行双向绑定
1 | <paper-input ng-model="myText"></paper-input> |
文本国际化支持在angular社区中又很多开源的模块, 我筛选出一个比较好用的模块作为项目提供国际化支持
下面介绍如何使用angular-gettext
为你的项目提供国际化支持
1 | bower install angular-gettext --save |
1 | mkdir project1 && cd project1 npm init |
命令执行完成,会在当前目录下生成package.json
文件, 这是编写一个公共模块的基本步骤, 像普通项目一样,可以npm install $package_name
安装依赖的其他模块
最近报了一个川外的英语培训班, 中教25小时, 外教25小时, 中教的课程现在完毕算是能开口说话了.中教是一个重庆妹子, 在美国某个大学(忘了)留学回来,一口流利美式英语, 她给我们说关于美国梦, 关于gay, lesbian的成人话题, 猜词游戏, 用英文描述, 用英文思考.
老师和其他学员都是女生, 就我一个男的, 而且我又使一个技术宅男,貌似很多话题我比较难参与. 前天开始上外教的课程, Bill(非洲裔), 老妈是法国的, 老爸是英国的. 上课嘻嘻哈哈的蛮好玩.他给我们说他的major是体育, 在什么地方教我忘了,教足球的. 顺带的教点英语整点零花钱么?
每周一,三,四的课. 下班就要往教室赶, 坐地铁大概需要40分钟. 2个小时的课, 8点半结束, 回家大概9点多. 这样的过程持续了一个月, 感觉生活还是比较充实.
说起来我为什么要参加口语培训:
- 如果有可能去一个外资公司, 我还是比较期待的, 可以和很多外国人工作,交流.
- 可以在专业上帮助我获取国外的一手资料
- 通过口语培训认识了一些人,知道了一些事.
总之, 参加这次口语培训还是不亏的, 原因嘛,就是我现在看到什么想到什么都向用英文去表达和思考, 这是这次口语培训的结果, 欣喜.
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) }) |
在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> |
为了提高安装npm包的速度, 之前按照npm官方的教程搭建过一个本地npm镜像仓库, 安装配置过程太过繁琐,明显不适用与敏捷的要求. 包文件存储在couchdb
数据库中, 500多G的数据太过庞大. 管理起来巨麻烦.
reggie
是一个基于文件系统目录的超轻量级的npm本地仓库, 用于私有模块的版本管理, 部署还是很好用的, 下面只需要简单的几个命令行就可以跑起来. 使用感觉很Nice, 不会消耗过多的时间,简单实用.
通过如下命令安装完成CUPS
后,登陆http://localhost:631/admin
出现403 Forbidden
错误.
1 | sudo apt-get install cups |
以前开发项目都是找现成的模板, 经历多个项目后, 总是达不到理想的效果. 为了完全能够定制Web页面的外观,又不会把Bootstrap本身的文件改的面目全非,因此需要创建自定义文件结构
1 | sudo npm install -g bower sudo npm install -g lessc |
本文所展示的示例是在phpstorm下完成的, 要自动编译less文件,需要用到lessc
编译器, 打开less文件时,phpstrom会自动提示安装less插件,按提示安装即可,需要重启phpstrom.
DevTools Terminal 是一个Chrome DevTools扩展, 它把操作系统终端功能带入到Chrome浏览器中. 你可以在Chrome DevTools开发者工具中使用操作系统终端来完成需要执行的shell命令和操作.
caption-wrapper
caption-wrapper
中包含两个子元素 img
和 div.caption-description
div.caption-description
中包含一个p.caption-text
nodemailer
是一个 node.js
的邮件客户端库, 常用语服务器端发送邮件.
项目地址:
http://www.nodemailer.com
nodemailer
支持的功能:
Unicode
SSL/STARTTLS
Blockies
是一个随机生成头像的javascript库, 基于随机数和色彩
点击率
来自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 | 移动富媒体广告接口定义 |
swagger-codegen 项目地址
1 | https://github.com/wordnik/swagger-codegen |
安装依赖软件
swagger-codegen
是用Scala语言开发的,首先需要下载一些必要的软件:
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 |