Mac点滴-三指拖拽窗口

之前一直以为三指拖拽窗口是触摸板设置的功能,其实是在辅助功能里设置,官方教程如下:

“三指拖移”是 OS X 中的一种 Multi-Touch 手势。通过这个手势,您能使用三个手指移动屏幕上的活跃窗口。

本文介绍了在您的 Mac 配备了 Force Touch 触控板的情况下,该如何开启“三指拖移”。

  1. 从 Apple 菜单中,选取“系统偏好设置”。
  2. 点按“辅助功能”图标。
  3. 从左侧的选项中选取“鼠标与触控板”。
  4. 点按“触控板选项”。
  5. 在“启用拖移”旁边勾选。
  6. 从相关的弹出式菜单中,选取“三指拖移”,这样该项旁边会显示一个勾号。
  7. 点按“好”。

learn-kylin解析

learn-kylin是Apache Kylin自带的一个示例,展示了数据组织、模型构建以及Cube构建的过程等。本文通过深入解析learn-kylin,希望能帮助大家学习Kylin的使用。

安装完Kylin后可通过./bin/sample.sh来初始化示例。该脚本主要完成创建hive数据库以及表、将数据导入到hive中、准备必要的目录、初始化模型以及cube等。

下边我们将详细学习一下数据以及kylin的工作过程。

1、关于数据

1.1、原始数据

原始数据包括如下5张表,用于记录销售信息。其中KYLIN_SALES为销售订单明细,为实体表,其他表为维度表,分表为KYLIN_CAL_DT(时间扩展表)、KYLIN_CATEGORY_GROUPINGS(商品类别表)、KYLIN_ACCOUNT(账户表)、KYLIN_COUNTRY(国家地理位置表)。

1.2、原始数据之间的关系


SELECT
KYLIN_SALES.TRANS_ID
,KYLIN_SALES.PART_DT
,KYLIN_SALES.LEAF_CATEG_ID
,KYLIN_SALES.LSTG_SITE_ID
,KYLIN_CATEGORY_GROUPINGS.META_CATEG_NAME
,KYLIN_CATEGORY_GROUPINGS.CATEG_LVL2_NAME
,KYLIN_CATEGORY_GROUPINGS.CATEG_LVL3_NAME
,KYLIN_SALES.LSTG_FORMAT_NAME
,KYLIN_SALES.SELLER_ID
,KYLIN_SALES.BUYER_ID
,BUYER_ACCOUNT.ACCOUNT_BUYER_LEVEL
,SELLER_ACCOUNT.ACCOUNT_SELLER_LEVEL
,BUYER_ACCOUNT.ACCOUNT_COUNTRY
,SELLER_ACCOUNT.ACCOUNT_COUNTRY
,BUYER_COUNTRY.NAME
,SELLER_COUNTRY.NAME
,KYLIN_SALES.OPS_USER_ID
,KYLIN_SALES.OPS_REGION
,KYLIN_SALES.PRICE
FROM DEFAULT.KYLIN_SALES as KYLIN_SALES
INNER JOIN DEFAULT.KYLIN_CAL_DT as KYLIN_CAL_DT
ON KYLIN_SALES.PART_DT = KYLIN_CAL_DT.CAL_DT
INNER JOIN DEFAULT.KYLIN_CATEGORY_GROUPINGS as KYLIN_CATEGORY_GROUPINGS
ON KYLIN_SALES.LEAF_CATEG_ID = KYLIN_CATEGORY_GROUPINGS.LEAF_CATEG_ID AND KYLIN_SALES.LSTG_SITE_ID = KYLIN_CATEGORY_GROUPINGS.SITE_ID
INNER JOIN DEFAULT.KYLIN_ACCOUNT as BUYER_ACCOUNT
ON KYLIN_SALES.BUYER_ID = BUYER_ACCOUNT.ACCOUNT_ID
INNER JOIN DEFAULT.KYLIN_ACCOUNT as SELLER_ACCOUNT
ON KYLIN_SALES.SELLER_ID = SELLER_ACCOUNT.ACCOUNT_ID
INNER JOIN DEFAULT.KYLIN_COUNTRY as BUYER_COUNTRY
ON BUYER_ACCOUNT.ACCOUNT_COUNTRY = BUYER_COUNTRY.COUNTRY
INNER JOIN DEFAULT.KYLIN_COUNTRY as SELLER_COUNTRY
ON SELLER_ACCOUNT.ACCOUNT_COUNTRY = SELLER_COUNTRY.COUNTRY

这里需要注意,KYLIN_ACCOUNT既是BUYER_ACCOUNT又是SELLER_COUNTRY,也就是说账户表里即存了购买者与销售者的账户信息。

web开发中各类缓存设计

1、缓存

缓存即指一种存储着数据的硬件或者软件组件,可加速数据请求;缓存中的数据可以是之前的运算结果,或者是其他地方存储的数据的备份。

In computing, a cache /ˈkæʃ/ KASH,[1] is a hardware or software component that stores data so future requests for that data can be served faster; the data stored in a cache might be the result of an earlier computation, or the duplicate of data stored elsewhere.

其实说白了缓存就是一个临时放数据地方。你可以放到本地缓存中、可以放到memcache、redis、tair等缓存系统中,也可以放到MySQL中等等。

缓存主要解决一个问题就是加速数据请求速度。每次从网络接口请求数据,改成在本地缓存一份,这个在APP开发中经常用到,从而可以减少网络请求耗时,还能节省用户流量,体验更好。每次从数据库通过SQL查数据,如果每次请求的结果是固定的,那就可以考虑将查询结果缓存到redis等缓存里,减少数据库压力。

2、缓存设计

2.1 考虑的问题

  • 数据量
  • 响应时间
  • 扩展性
  • 数据一致性
  • 更新策略

 

<未完待续>

Kotlin简明教程

Kotlin精简教程,包含基本数据类型、控制语句以及函数,并且包含面向对象的相关类、继承和接口的定义以及实现等。本文旨在帮助想快速体验Kotlin的同学快读上手,在最短的时间内掌握更多的知识。Kotlin成为Android的官方语言后,毕竟带来一场新的变革,让我们拭目以待吧,当然手来还是要有东西的,赶紧安装一个Kotlin,顺着本手册快速过一遍吧。

1 基础篇


1.1  数据类型

Kotlin基本数据类型: 数值、字符、布尔和数组。

1.1.1 数字类型

Type Bit width
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8

1.1.2 字符类型

字符类型用Char声明。例如 ‘1’。

1.1.3 布尔类型

Boolean声明布尔类型,布尔类型有两个值:true 和 false。内置运算符布包括 ||(或)、&&(与)、!(非)。

1.1.4 数组

在Kotlin中的数组通过Array类声明,并且具有getset方法,以及size属性。我们可以通过arrayOf(1, 2, 3)来创建一个数组。

1.1.5 字符串

字符串使用String来声明,字符串是不可变的。数组中的元素就是字符,可以通过s[i]访问。

var a : Int = 1000
var b : Char = 'b'
var c : IntArray = intArrayOf(1, 2, 3, 5)
var d : String = "Hello world!"
var e : Boolean = true

1.2 控制语句

1.2.1 IF表达式

在kotlin中,if是一个表达式,带返回值。

if (a < b) max = b 

if (a > b) {
    max = a
} else {
    max = b
}
 
val max = if (a > b) a else b

1.2.2 WHEN表达式

WHEN代替了SWITCH。

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> { // Note the block
        print("x is neither 1 nor 2")
    }
}

1.2.3 FOR循环

for (i in array.indices) {
    print(array[i])
}

1.2.4 WHILE循环

Kotlin支持while和do…while

while (x > 0) {
    x--
}

do {
    val y = retrieveData()
} while (y != null) // y is visible here!

1.3 函数

1.3.1 函数声明

在Kotlin中使用fun声明函数。这真是一件有趣的事情。

fun double(x: Int): Int {
}

1.3.2 函数调用

val result = double(2)

1.3.3 参数

函数的参数采用Pasical风格name:type。参数之间用逗号隔开。参数必须指定类型。参数可以指定默认值。

fun read(b: Array, off: Int = 0, len: Int = b.size()) {
...
}

可变参数可以通过vararg声明

fun read(vararg ts:Int) {
...
}

如果参数较多,可以通过命名参数来调用函数

fun reformat(str: String,
             normalizeCase: Boolean = true,
             upperCaseFirstLetter: Boolean = true,
             divideByCamelHumps: Boolean = false,
             wordSeparator: Char = ' ') {
...
}
//命名调用
reformat(str, wordSeparator = '_')

1.3.4 单行函数

如果函数只是返回一个表达式,那就可以直接用等号

fun double(x: Int): Int = x * 2

1.3.5 返回值

函数可返回Unit(即什么都不返回)或者准确数据类型。

fun printHello(name: String?): Unit {
    if (name != null)
        println("Hello ${name}")
    else
        println("Hi there!")
    // `return Unit` or `return` is optional
}

//等价于
fun printHello(name: String?) {

}

 

2、面向对象


2.1 类与继承

2.1.1 类

在Kotlin中类通过class来声明

class Invoice {
}
2.1.1.1 类的构造方法

Kotlin的构造方法有主构造方法和多个副构造方法。在类名后边的为主构造方法,此处可以省略constructor关键字,类中的constructor为副构造方法。

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}
2.1.1.2 类的实例化

Kotlin没有new关键字,所以如下实例化。

val customer = Customer("Joe Smith")

2.1.2 继承

Kotlin的所有类都有一个公共的超类Any

class Example // 隐式继承自Any

继承一个类,只需要将父类放到子类的后边即可,有点类似于定义方法的返回值。

open class Base(p: Int)

class Derived(p: Int) : Base(p)

如果父类有主构造方法,需要正确的初始化;如果父类有副构造方法,需要使用super关键字初始化。

class MyView : View {
    constructor(ctx: Context) : super(ctx)

    constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs)
}

open关键字和java中的final关键字相反,它允许其他类继承此类。在Kotlin中所有的类默认均为final类型。

2.1.2.1 重写方法

重写方法时,子类类的方法必须是通过open关键字限定的,并且子类的相应方法也默认被继承为open类型,如果需要禁止,可以通过final关键字来限定。重写方法使用关键字overwrite。

open class Base {
    open fun v() {}
    fun nv() {}
}
class Derived() : Base() {
    override fun v() {} //此处可以在开始加上final,来禁止次方法被重写
}
2.1.2.2 重写属性

重写属性和重写方法类似。

open class Foo {
    open val x: Int get { ... }
}

class Bar1 : Foo() {
    override val x: Int = ...
}
2.1.2.3 重写规则

Kotlin,实现继承的规则是: 如果类继承自多个相同成员的实现,子类必须重写这些成员并提供自己的实现(或者是继承其中一个)。此处可以使用super关键字,例如super<Base>

open class A {
    open fun f() { print("A") }
    fun a() { print("a") }
}

interface B {
    fun f() { print("B") } // interface members are 'open' by default
    fun b() { print("b") }
}

class C() : A(), B {
    // The compiler requires f() to be overridden:
    override fun f() {
        super<A>.f() // call to A.f()
        super<B>.f() // call to B.f()
    }
}

2.1.3 抽象类

抽象类用abstract声明。由于抽象类不涉及到具体实现,所以抽象类及其方法不需要用open限定就可以重写。此外我们也可以将一个非抽象类中的open成员写成抽象的。

open class Base {
    open fun f() {}
}

abstract class Derived : Base() {
    override abstract fun f()
}

2.2 接口

可以使用interface定义接口

interface MyInterface {
    fun bar()
    fun foo() {
      // optional body
    }
}

2.2.1 接口实现

类或者对象都可以显示类。

class Child : MyInterface {
    override fun bar() {
        // body
    }
}

更多内容请参考手册

Centos搭建LAMPP环境(极速)

在Centos上安装Apache、PHP、MySQL是每个PHP程序员的基本技能,下边的方法可以快速便捷地帮你完成搭建:

sudo yum install httpd mysql mysql-devel mysql-server php php-devel php-mysql php-gd libjpeg* php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-bcmath php-mhash libmcrypt -y

执行完上述命令,我们的环境就搭建完成了。
执行启动命令即可让apache、MySQL、PHP跑起来:

sudo service mysqld start
sudo service httpd start

此时在浏览器访问:http://localhost,就可以看到It works!了。大功告成。

关于这个博客

开通这个博客,只为了记录自己在“搬砖”过程中的点滴收获。

作为一个码农,需要摸索很多东西,如果不记录下来,很快就会忘记,过后找起来也比较费劲,这个博客就是为了帮助我记录这些东西,然后我就能拿着这个博客吹牛逼了。

当然,如果自己的点滴经验能够分享或者帮助到别人,那就更好不过了。