golang MySQL

golang MySQL http://www.cnblogs.com/hupengcool/p/4143238.html Golang操作数据库 基本概念 Open() – creates a DB Close() - closes the DB Query() - 查询 QueryRow() -查询行 Exec() -执行操作,update,insert,delete Row - A row is not a hash map, but an abstraction of a cursor Next() Scan() 注意: DB并不是指的一个connection 连接到数据库 我们以MySQL为例,使用github.com/go-sql-driver/MySQL,首先我们需要导入我们需要的包 import ( “database/sql” _ “github.com/go-sql-driver/MySQL” ) 注意我们导入github.com/go-sql-driver/MySQL 前面用了一个"_",_操作其实是引入该包,而不直接使用包里面的函数,而是调用了该包里面的init函数,import的时候其实是执行了该包里面的init函数,初始化了里面的变量,_操作只是说该包引入了,我只初始化里面的 init函数和一些变量,但是往往这些init函数里面是注册自己包里面的引擎,让外部可以方便的使用,就很多实现database/sql的包,在 init函数里面都是调用了sql.Register(name string, driver driver.Driver)注册自己,然后外部就可以使用了。 我们用Open()函数来打开一个database handle db, err := sql.Open(“MySQL”, “user:password@tcp(ip:port)/database”) 写一个完整的: import ( “database/sql” _ “github.com/go-sql-driver/MySQL” “log” ) func main() { db, err := sql.Open(“MySQL”, “user:password@tcp(ip:port)/database”) ...

2016-11-23 · 4 min · 824 words · -

Cython

Cython https://moonlet.gitbooks.io/cython-document-zh_cn/content/ch1-basic_tutorial.html Cython 的本质可以总结如下: Cython 是包含 C 数据类型的 Python。 Cython 是 Python: 几乎所有 Python 代码都是合法的 Cython 代码。 (存在一些限制,但是差不多也可以。) Cython 的编译器会转化 Python 代码为 C 代码,这些 C 代码均可以调用 Python/C 的 API。 Cython 可不仅仅包含这些,Cython 中的参数和变量还可以以 C 数据类型来声明。代码中的 Python 值和 C 的值可以自由地交叉混合 (intermixed) 使用, 所有的转化都是自动进行。Python 中的引用计数维护 (Reference count maintenance) 和错误检查 (error checking) 操作同样是自动进行的,并且全面支持 Python 的异常处理工具 (facilities) ,包括 try-except 和 try-finally,即便在其中操作 C 数据都是可以的。

2016-11-22 · 1 min · 58 words · -

ansible module

ansible module systemd - name: restart telegraf systemd: state: restarted daemon_reload: yes name: telegraf shell ansible-playbook显示执行shell的模块的返回结果 - name: who am i shell: "whoami" register: shell_result - debug: var: shell_result.stdout_lines local_action local_action 需要 sudo 密码 export ANSIBLE_ASK_SUDO_PASS=true --extra-vars "ansible_sudo_pass=xxx" - name: "Create an empty directory (locally)" local_action: module: file path: "/tmp/empty" state: directory tags: tag0 批量删除文件 - name: Ansible delete file glob find: paths: /etc/Ansible patterns: *.txt register: files_to_delete - name: Ansible remove file glob file: path: "{{ item.path }}" state: absent with_items: "{{ files_to_delete.files }}" lineinfile 用于改变一个文件的一行。如果想要改变文件中相似的多行,可以使用 replace模块 ...

2016-11-18 · 5 min · 983 words · -

Juc中的同步辅助类, CountDownLatch,CyclicBarrier,Semaphore

‘Juc中的同步辅助类, CountDownLatch,CyclicBarrier,Semaphore’ CountDownLatch CyclicBarrier Semaphore Phaser Exchanger CountDownLatch 在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待/阻塞 Java的concurrent包里面的CountDownLatch其实可以把它看作一个计数器,只不过这个计数器的操作是原子操作,同时只能有一个线程去操作这个计数器,也就是同时只能有一个线程去减这个计数器里面的值。 你可以向CountDownLatch对象设置一个初始的数字作为计数值,任何调用这个对象上的await()方法都会阻塞,直到这个计数器的计数值被其他的线程减为0为止。 CountDownLatch的一个非常典型的应用场景是: 有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调用同一个CountDownLatch对象上的countDown()方法,这个调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值减到0为止。 http://www.wiloon.com/?p=7869 CyclicBarrier 一种可重置的多路同步点, 在某些并发编程场景很有用. 它允许一组线程互相等待, 直到到达某个公共的屏障点 (common barrier point). 在涉及一组固定大小的线程的程序中, 这些线程必须不时地互相等待, 此时 CyclicBarrier 很有用.因为该 barrier在释放等待线程后可以重用, 所以称它为循环的barrier. CyclicBarrier类似于CountDownLatch也是个计数器, 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数, 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。 CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。 CyclicBarrier初始时还可带一个Runnable的参数,此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。 Semaphore 信号量是一类经典的同步工具. 信号量通常用来限制线程可以同时访问的 (物理或逻辑) 资源数量. 一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。拿到信号量的线程可以进入代码,否则就等待。通过acquire()和release()获取和释放访问许可。 Phaser 一种可重用的同步屏障, 功能上类似于 CyclicBarrier 和 CountDownLatch, 但使用上更为灵活. 非常适用于在多线程环境下同步协调分阶段计算任务 (Fork/Join框架中的子任务之间需同步时, 优先使用 Phaser) http://www.wiloon.com/?p=11214 Exchanger 允许两个线程在某个汇合点交换对象, 在某些管道设计时比较有用. Exchanger提供了一个同步点, 在这个同步点, 一对线程可以交换数据. 每个线程通过exchange()方法的入口提供数据给他的伙伴线程, 并接收他的伙伴线程提供的数据并返回. 当两个线程通过Exchanger交换了对象, 这个交换对于两个线程来说都是安全的. Exchanger可以认为是 SynchronousQueue 的双向形式, 在运用到遗传算法和管道设计的应用中比较有用. ...

2016-11-18 · 1 min · 73 words · -

locale command

locale command sudo vim /etc/locale.conf locale 是 Linux 系统中多语言环境的设置接口,在 Linux 中,使用 locale 命令来设置和显示程序运行的语言环境,locale 会根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统定义一个软件运行时的语言环境。 通过 locale 来设置程序运行的不同语言环境,locale 由 ANSI C 提供支持。locale 的命名规则为<语言>_<地区>.<字符集编码>,如 zh_CN.UTF-8,zh 代表中文,CN 代表大陆地区,UTF-8 表示字符集。在locale环境中,有一组变量,代表国际化环境中的不同设置。 locale 设置规则 <语言>_<地区>.<字符集编码><@修正值> zh_CN.utf8 zh:表示中文 CN:表示大陆地区 Utf8:表示字符集 de_DE.utf-8@euro de:表示德语 DE:表示德国 Utf-8:表示字符集 euro:表示按照欧洲习惯加以修正 使用详解 设置locale的根本就是设置一组总共12个LC开头的变量,不包括LANG和LC_ALL locale默认文件存放位置: /usr/share/i18n/locales (一)查看当前 locale 设置 列出所有启用的 locale: locale LANG=zh_CN.UTF-8 LC_CTYPE=“zh_CN.UTF-8” LC_NUMERIC=“zh_CN.UTF-8” LC_TIME=“zh_CN.UTF-8” LC_COLLATE=“zh_CN.UTF-8” LC_MONETARY=“zh_CN.UTF-8” LC_MESSAGES=“zh_CN.UTF-8” LC_PAPER=“zh_CN.UTF-8” LC_NAME=“zh_CN.UTF-8” LC_ADDRESS=“zh_CN.UTF-8” LC_TELEPHONE=“zh_CN.UTF-8” LC_MEASUREMENT=“zh_CN.UTF-8” LC_IDENTIFICATION=“zh_CN.UTF-8” LC_ALL= 分别介绍下: LANG:LANG 的优先级是最低的,它是所有 LC_* 变量的默认值,下方所有以 LC_ 开头变量(LC_ALL除外)中,如果存在没有设置变量值的变量,那么系统将会使用 LANG 的变量值来给这个变量进行赋值。如果变量有值,则保持不变 ...

2016-11-17 · 1 min · 191 words · -

sudo 命令自动补全

命令自动补全 sudo pacman -S bash-completion echo "source /usr/share/bash-completion/bash_completion" >>/home/$USER/.bashrc

2016-11-15 · 1 min · 9 words · -

CUnit

CUnit http://blog.csdn.net/scucj/article/details/4385630 CUnit下载地址: http://sourceforge.net/projects/cunit/ CUnit 在线文档帮助:http://cunit.sourceforge.net/doc/index.html 关于CUnit, 本文主要从介绍三方面的内容: 1.CUnit的介绍。 1.1 介绍如何使用CUnit。 CUnit是一个对C语言编写的程序进行单元测试的框架,在线文档说它作为一个静态链接库被链接到用户的测试代码中。它提供了一种简洁的框架来建立测试架构,并提供丰富的断言(Assertion)来测试通用数据类型。除此之外,它还提供了许多不同的结构来运行测试用例和报告测试结果。

2016-11-14 · 1 min · 12 words · -

git server

git server 在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。 GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。 搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。 假设你已经有sudo权限的用户账号,下面,正式开始安装。 安装git: $ sudo pacman -S git 创建一个git用户,用来运行git服务: sudo useradd git 创建证书登录: 收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。 初始化Git仓库: 先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令: $ sudo git init -bare sample.git Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git: $ sudo chown -R git:git sample.git 禁用shell登录: 出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行: git:x:1001:1001:,,,:/home/git:/bin/bash 改为: git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell 这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。 克隆远程仓库: 现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行: $ git clone git@server:/path/to/sample.git Cloning into ‘sample’… warning: You appear to have cloned an empty repository. 剩下的推送就简单了。 管理公钥 如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。 这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。 管理权限 有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子 (hook) ,所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。 这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。 小结 搭建Git服务器非常简单,通常10分钟即可完成; 要方便管理公钥,用Gitosis; ...

2016-11-09 · 1 min · 101 words · -

DevOps

DevOps 由 Atlassian 提出的 DevOps (英文Development和Operations的组合) 是一组过程、方法与系统的统称,用于促进开发 (应用程序/软件工程) 、技术运营和质量保障 (QA) 部门之间的沟通、协作与整合。它的出现是由于软件行业日益清晰地认识到: 为了按时交付软件产品和服务,开发和运营工作必须紧密合作。[1]

2016-11-08 · 1 min · 12 words · -

rfkill

rfkill https://linux.cn/article-5957-1.html 很多计算机系统包含无线电传输,其中包括Wi-Fi、蓝牙和3G设备。这些设备消耗电源,在不使用这些设备时是一种能源浪费。 RFKill 是Linux内核中的一个子系统,它可提供一个接口,在此接口中可查询、激活并取消激活计算机系统中的无线电传输。当取消激活传输时,可使其处于可被软件重新激活的状态 ( 软锁定 ) 或软件无法重新激活的位置 ( 硬锁定 ) 。 RFKill 为内核子系统提供应用程序编程界面 (API) 。内核驱动程序被设计为支持RFKill使用这个API注册内核,并包含启用和禁用这个设备的方法。另外,RFKill提供用户程序可解读的通知以及用户程序查询传输状态的方法。 RFKill接口位于 /dev/rfkill,其中包含系统中所有无线电传输的当前状态。每个设备都在 sysfs 中注册当前RFKill状态。另外,在启用了RFKill的设备中每当状态更改时,RFKill会发出 uevents。 rfkill 是一个命令行工具,您可使用它查询和更改系统中启用了RFKill的设备。要获得这个工具,请安装 rfkill 软件包。 如果开机时在可以搜索到无线网络且输入密码正确但仍然无法接入的情况下,就可能是rfkill这个程序阻拦了接入,它是个用来控制无线网络及蓝牙的使用的软开关。 使用命令 rfkill list 获得设备列表,每个都包含与之关联的索引号 ,从 0 开始。 rfkill list 您可以使用这个索引号让 rfkill 停使或者使用某个设备,例如: rfkill block 0 停用系统中第一个启用RFKill的设备。 您还可以使用 rfkill 阻断某一类设备,或者所有启用了RFKill的设备。例如: rfkill block wifi 停用系统中的所有Wi-Fi设备。要停用所有启用了RFKill的设备,请运行: rfkill block all 要重新使用设备,请运行 rfkill unblock。要获得 rfkill 可停用的完整设备类别列表,请运行 rfkill help。

2016-11-08 · 1 min · 60 words · -

maven repo

maven repo aliyun https://maven.aliyun.com/mvn/view https://maven.aliyun.com/repository/public repo1 https://repo1.maven.org/maven2/ maven { url 'http://repo.grails.org/grails/repo' } maven { url 'http://repo.grails.org/grails/plugins' } http://maven.aliyun.com/nexus/content/groups/public/

2016-11-06 · 1 min · 18 words · -

gradle maven snapshot

gradle maven snapshot configurations.all { // check for updates every build resolutionStrategy.cacheChangingModulesFor 0, ‘seconds’ } dependencies { compile group: “group”, name: “projectA”, version: “1.1-SNAPSHOT”, changing: true } https://discuss.gradle.org/t/how-to-get-gradle-to-download-newer-snapshots-to-gradle-cache-when-using-an-ivy-repository/7344 gradle maven plugin https://docs.gradle.org/current/userguide/publishing_maven.html#header gradle v5.3.1 group = “com.wiloon.group0” version = “0.0.1-SNAPSHOT” plugins { java-library maven-publish id(“com.gradle.build-scan”) version “2.2.1” } tasks.register(“sourcesJar”) { from(sourceSets.main.get().allJava) archiveClassifier.set(“sources”) } tasks.register(“javadocJar”) { from(tasks.javadoc) archiveClassifier.set(“javadoc”) } publishing { publications { create(“maven”) { from(components[“java”]) artifact(tasks[“sourcesJar”]) artifact(tasks[“javadocJar”]) } } repositories { maven { val releasesRepoUrl = “http://nexus.wiloon.com/repository/maven-releases" val snapshotsRepoUrl = “http://nexus.wiloon.com/repository/maven-snapshots" url = uri(if (version.toString().endsWith(“SNAPSHOT”)) snapshotsRepoUrl else releasesRepoUrl) credentials { username = “admin” password = “password” } } } } ...

2016-11-06 · 1 min · 100 words · -

archlinux hostapd

archlinux hostapd system: archlinux interface: eth2, wlan1 无线网卡必须支持AP模式 iw list 配置 接入点的设置包含两个主要部分: 设置Wi-Fi链路层,这样无线客户端可以与电脑的"软件接入点"建立连接,从而同电脑进行通信。 配置电脑上的网络, 使电脑可以在 Internet 和无线客户端之间有效地转发IP包。 hostapd能够使得无线网卡切换为master模式,模拟AP (路由器) 功能 systemd-networkd config cd /etc/systemd/network/ vim 05-eth0.network [Match] Name=enp1s0 [Network] DHCP=yes vim 07-br0.netdev [NetDev] Name=br0 Kind=bridge vim 10-eth1.network [Match] Name=enp3s0 [Network] Bridge=br0 vim 15-wlan0.network [Match] Name=wlp2s0b1 [Network] Bridge=br0 vim 20-br0.network [Match] Name=br0 [Network] DNS=192.168.50.1 Address=192.168.97.1/24 iptables sudo iptables -vnL sudo iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE hostapd config #edit /etc/hostapd/hostapd.conf interface=wlp2s0b1 # if wlan0 already added to br0, uncomments this line bridge=br0 # 驱动接口类型 driver=nl80211 # 国家或地区代码 (ISO/IEC 3166-1) country_code=CN # 热点名 ssid=test2 # hostapd日志设置 logger_syslog=-1 logger_syslog_level=2 logger_stdout=-1 logger_stdout_level=2 ctrl_interface=/run/hostapd ctrl_interface_group=0 # 工作模式 (a = IEEE 802.11a (5 GHz), b = IEEE 802.11b (2.4 GHz) # a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g, ad = IEEE 802.11ad (60 GHz) hw_mode=g # 使用信道 channel=5 beacon_int=100 dtim_period=2 # 允许最大连接数 max_num_sta=5 # Bit 字段: bit0 = WPA, bit1 = WPA2 wpa=2 rts_threshold=-1 fragm_threshold=-1 macaddr_acl=0 auth_algs=1 # 1: hide ssid, 0: default ignore_broadcast_ssid=0 wmm_enabled=1 wmm_ac_bk_cwmin=4 wmm_ac_bk_cwmax=10 wmm_ac_bk_aifs=7 wmm_ac_bk_txop_limit=0 wmm_ac_bk_acm=0 wmm_ac_be_aifs=3 wmm_ac_be_cwmin=4 wmm_ac_be_cwmax=10 wmm_ac_be_txop_limit=0 wmm_ac_be_acm=0 wmm_ac_vi_aifs=2 wmm_ac_vi_cwmin=3 wmm_ac_vi_cwmax=4 wmm_ac_vi_txop_limit=94 wmm_ac_vi_acm=0 wmm_ac_vo_aifs=2 wmm_ac_vo_cwmin=2 wmm_ac_vo_cwmax=3 wmm_ac_vo_txop_limit=47 wmm_ac_vo_acm=0 eapol_key_index_workaround=0 eap_server=0 own_ip_addr=127.0.0.1 wpa_passphrase=hostapd0 # 加密算法 wpa_key_mgmt=WPA-PSK # 加密协议;禁用不安全的 TKIP wpa_pairwise=TKIP rsn_pairwise=CCMP start hostapd on boot systemctl enable hostapd dnsmasq #vim /etc/dnsmasq.conf interface=wlp2s0b1 listen-address=192.168.97.1 #no-dhcp-interface= dhcp-range=192.168.97.10,192.168.97.20,12h # route dhcp-option=3,192.168.97.1 # dns dhcp-option=6,192.168.97.1 #打开Linux主机网络数据转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward sudo hostapd /etc/hostapd/hostapd.conf related command sudo pacman -S iw #check is support AP mode iw list ip link add name br0 type bridge ip link set br0 up ip link set eth0 up ip link set eth0 master br0 # show bridge info bridge link sudo ip addr add 192.168.49.1/24 dev wlp2s0b1 sudo ip link set wlp3s0 up sudo systemctl start dnsmasq.service sudo nft add rule nat post ip saddr 192.168.49.0/24 oif enp2s0 snat 172.16.xxx.xxx sudo hostapd /etc/hostapd/hostapd.conf sudo hostapd -B /etc/hostapd/hostapd.conf sudo systemctl start hostapd.service #设置无线接入点IP地址,命令如下: sudo ip addr add 192.168.49.1/24 dev wlp2s0b1 sudo ip link set wlp2s0b1 up #启动 hostapd和dnsmasq hostapd /etc/hostapd/hostapd.conf hostapd -B /etc/hostapd/hostapd.conf #or systemctl start hostapd.service systemctl start dnsmasq.service https://wiki.archlinux.org/index.php/software_access_point#Wi-Fi_device_must_support_AP_mode ...

2016-10-31 · 2 min · 340 words · -

ANTLR

ANTLR http://blog.csdn.net/dc_726/article/details/45399371 当我们实现一种语言时,我们需要构建读取句子 (sentence) 的应用,并对输入中的元素做出反应。如果应用计算或执行句子,我们就叫它解释器 (interpreter) ,包括计算器、配置文件读取器、Python解释器都属于解释器。如果我们将句子转换成另一种语言,我们就叫它翻译器 (translator) ,像Java到C#的翻译器和编译器都属于翻译器。不管是解释器还是翻译器,应用首先都要识别出所有有效的句子、词组、字词组等,识别语言的程序就叫解析器 (parser) 或语法分析器 (syntax analyzer) 。我们学习的重点就是如何实现自己的解析器,去解析我们的目标语言,像DSL语言、配置文件、自定义SQL等等。 1.2 元编程 手动编写解析器是非常繁琐的,所以我们有了ANTLR。只需编写ANTLR的语法文件,描述我们要解析的语言的语法,之后ANTLR就会自动生成能解析这种语言的解析器。也就是说,ANTLR是一种能写出程序的程序。在学习LISP或Ruby的宏时,我们经常能接触到元编程的概念。而用来声明我们语言的ANTLR语言的语法,就是元语言 (meta-language) 。 1.3 解析过程 为了简单起见,我们将解析分为两个阶段,对应我们的大脑读取文字时的过程。当我们读到一个句子时,在第一阶段,大脑会下意识地将字符组成单词,然后像查词典一样识别出它们的意思。在第二阶段,大脑会根据已识别的单词去识别句子的结构。第一阶段的过程叫词法分析 (lexical analysis) ,对应的分析程序叫做lexer,负责将符号 (token) 分组成符号类 (token class or token type) 。而第二阶段就是真正的parser,默认ANTLR会构建出一棵分析树 (parse tree) 或叫语法树 (syntax tree) 。如下图,就是简单的赋值表达式的解析过程: 语法树的叶子是输入token,而上级结点时包含其孩子结点的词组名 (phase) ,线性的句子其实是语法树的序列化。最终生成语法树的好处是: 树形结构易于遍历和处理,并且易被程序员理解,方便了应用代码做进一步处理。 多种解释或翻译的应用代码都可以重用一个解析器。但ANTLR也支持像传统解析器生成器那样,将应用处理代码嵌入到语法中。 对于因为计算依赖而需要多趟处理的翻译器来说,语法树非常有用!我们不用多次调用解析器去解析,只需高效地遍历语法树多次。

2016-10-26 · 1 min · 45 words · -

MySQL事务autocommit自动提交

MySQL事务autocommit自动提交 http://www.qttc.net/201208175.html MySQL默认操作模式就是autocommit自动提交模式。这就表示除非显式地开始一个事务,否则每个查询都被当做一个单独的事务自动执行。我们可以通过设置autocommit的值改变是否是自动提交autocommit模式。 通过以下命令可以查看当前autocommit模式 MySQL> show variables like ‘autocommit’; +—–+—+ | Variable_name | Value | +—–+—+ | autocommit | ON | +—–+—+ 1 row in set (0.04 sec) 从查询结果中,我们发现Value的值是ON,表示autocommit开启。我们可以通过以下SQL语句改变这个模式 MySQL> set autocommit = 0; 值0和OFF都是一样的,当然,1也就表示ON。通过以上设置autocommit=0,则用户将一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务重新开始一个新的事务。 举个例子: 张三给李四转账500元。那么在数据库中应该是以下操作: 1,先查询张三的账户余额是否足够 2,张三的账户上减去500元 3,李四的账户上加上500元 以上三个步骤就可以放在一个事务中执行提交,要么全部执行要么全部不执行,如果一切都OK就commit提交永久性更改数据;如果出错则rollback回滚到更改前的状态。利用事务处理就不会出现张三的钱少了李四的账户却没有增加500元或者张三的钱没有减去李四的账户却加了500元。 MySQL默认的存储引擎是MyISAM,MyISAM存储引擎不支持事务处理,所以改变autocommit没有什么作用。但不会报错,所以要使用事务处理的童鞋一定要确定你所操作的表示支持事务处理的,如InnoDB。如果不知道表的存储引擎可以通过查看建表语句查看建表的时候有没有指定事务类型的存储引擎,如果没有指定存储引擎默认则是MyISAM不支持事务的存储引擎。 当然,事务处理是为了保障表数据原子性、一致性、隔离性、持久性。这些都是要消耗系统资源的,要谨慎选择。

2016-10-26 · 1 min · 43 words · -

tprofiler

tprofiler git clone https://github.com/alibaba/TProfiler.git #compile mvn assembly:assembly #create tprofiler.properties

2016-10-25 · 1 min · 9 words · -

MySQL 时区

MySQL 时区 default-time-zone = ‘+8:00’ http://blog.csdn.net/mchdba/article/details/9763521

2016-10-24 · 1 min · 6 words · -

async await

async await async/await 是以更舒适的方式使用 promise 的一种特殊语法,同时它也非常易于理解和使用。 async function 让我们以 async 这个关键字开始。它可以被放置在一个函数前面,如下所示: async function f() { return 1; } 在函数前面的 async 这个单词表达了一个简单的事情:即这个函数总是返回一个 promise。其他值将自动被包装在一个 resolved 的 promise 中。 例如,下面这个函数返回一个结果为 1 的 resolved promise,让我们测试一下: async function f() { return 1; } f().then(alert); // 1 ……我们也可以显式地返回一个 promise,结果是一样的: async function f() { return Promise.resolve(1); } f().then(alert); // 1 所以说,async 确保了函数返回一个 promise,也会将非 promise 的值包装进去。很简单,对吧?但不仅仅这些。还有另外一个叫 await 的关键词,它只在 async 函数内工作,也非常酷。 await 语法如下: // 只在 async 函数内工作 let value = await promise; 关键字 await 让 JavaScript 引擎等待直到 promise 完成(settle)并返回结果。 这里的例子就是一个 1 秒后 resolve 的 promise: ...

2016-10-19 · 1 min · 118 words · -

linux 监控 glances

’linux 监控 glances' http://glances.readthedocs.io/en/latest/index.html #filter process glances -f process-name #server mode glances -s #client glances -c xxx.xxx.xxx.xxx:xxxx Glances 还是有些值得关注的,和那些常用的老牌监控工具比起来,比如 top/vmstat/iostat 只能监控本机系统,Glances 可以监控本机也可以通过客户端服务器模式监控其他机器;Glances 提供了基于 XML/RPC 的 API 便于其他程序调用,可编程;Glances 可以将数据输出保存到 csv 或 html 格式的文件方便其他程序处理 (报告或绘制图形) 。 Glances 是用 Python 开发的,使用 psutil 库来采集系统数据,在用户的终端上实时动态的显示重要的系统数据和变化。显示的数据包括: CPU、内存、磁盘、网络等使用情况,内核、运行队列、负载、I/O 状态、消耗资源最多的进程等等。 安装 Glance 支持 Linux, Mac OS X, FreeBSD, Windows 等多个系统,安装也很方便。在 Ubuntu 上安装: $ sudo apt-get update $ sudo apt-get install python-pip build-essential python-dev ...

2016-10-18 · 1 min · 186 words · -

AGPS

AGPS http://www.cnblogs.com/magicboy110/archive/2010/12/12/1903927.html AGPS定位基本原理浅析 2010-12-12 21:03 by MagicBoy110, 34759 阅读, 18 评论, 收藏, 编辑位置服务已经成为越来越热的一门技术,也将成为以后所有移动设备 (智能手机、掌上电脑等) 的标配。随着人们对BLS(Based Location Serices,基于位置的服务)需求的飞速增长,无线定位技术也越来越得到重视。AGPS (Assisted GPS,A-GPS,网络辅助GPS) 定位技术结合了GPS定位和蜂窝基站定位的优势,借助蜂窝网络的数据传输功能,可以达到很高的定位精度和很快的定位速度,在移动设备尤其是手机中被越来越广泛的使用。本文以GSM网络辅助GPS定位为例对AGPS的定位原理进行简单介绍。 AGPS定位基本机制 根据定位媒介来分,定位技术基本包含基于GPS的定位和基于蜂窝基站的定位两类 (阅读本文前,建议先阅读《GPS定位基本原理浅析》和《GSM蜂窝基站定位基本原理浅析》两篇文章) 。GPS定位以其高精度得到更多的关注,但是其弱点也很明显: 一是硬件初始化 (首次搜索卫星) 时间较长,需要几分钟至十几分钟;二是GPS卫星信号穿透力若,容易受到建筑物、树木等的阻挡而影响定位精度。AGPS定位技术通过网络的辅助,成功的解决或缓解了这两个问题。对于辅助网络,有多种可能性,以GSM蜂窝网络为例,一般是通过GPRS网络进行辅助。 如上图所示,直接通过GPS信号从GPS获取定位所需的信息,这是传统GPS定位的基本机制。AGPS中,通过蜂窝基站的辅助来解决或缓解上文提到的两个问题: 对于第一个问题,首次搜星慢的问题,根据《GPS定位基本原理浅析》一文的介绍,我们知道是因为GPS卫星接收器需要进行全频段搜索以寻找GPS卫星而导致的。在AGPS中,通过从蜂窝网络下载当前地区的可用卫星信息 (包含当地区可用的卫星频段、方位、仰角等信息) ,从而避免了全频段大范围搜索,使首次搜星速度大大提高,时间由原来的几分钟减小到几秒钟。 对于第二个问题,GPS卫星信号易受干扰的问题,这是由GPS卫星信号本身的性质决定的,我们无法改变。但是APGS中,通过蜂窝基站参考GPS的辅助,或是借助GSM定位中Cell-ID定位 (COO定位) 方法的辅助,缓解了在GPS信号不良的情况下定位的问题,有效提高了在此情况下的定位精度。 AGPS定位基本流程 1.搜索卫星 AGPS定位仍然是基于GPS的,因此定位的首要步骤还是先搜索到当前地区的可用GPS卫星。在传统GPS定位中需要全频段搜索以找到可用卫星因而耗时较长,而AGPS通过网络直接下载当前地区的可用卫星信息,从而提高了搜星速度。同时,也减小了设备的电量消耗。 如上图所示,AGPS中从定位启动到GPS接收器找到可用卫星的基本流程如下: (1) 设备从蜂窝基站获取到当前所在的小区位置 (即一次COO定位) (2) 设备通过蜂窝网络将当前蜂窝小区位置传送给网络中的AGPS位置服务器 (3) APGS位置服务器根据当前小区位置查询该区域当前可用的卫星信息 (包括卫星的频段、方位、仰角等相关信息) ,并返回给设备 (4) GPS接收器根据得到的可用卫星信息,可以快速找到当前可用的GPS卫星 至此,GPS接收器已经可正常接收GPS信号,GPS初始化过程结束。AGPS对定位速度的提高就主要体现在此过程中。 2.计算位置 GPS接收器一旦找到四颗以上的可用卫星,就可以开始接收卫星信号实现定位。接下来的过程根据位置计算所在端的不同,通常有两种方案: 在移动设备端进行计算的MS-Based方式和在网络端进行计算的MS-Assisted方式。 MS-Based方式中,接下来过程与传统GPS定位完全相同,GPS接收器接收原始GPS信号,解调并进行一定处理,根据处理后的信息进行位置计算,得到最终的位置坐标。 MS-Assisted方式中,解调并处理后,接下来的过程如下图所示: (5) 设备将处理后的GPS信息 (伪距信息) 通过蜂窝网络传输给AGPS位置服务器 (6) AGPS服务器根据伪距信息,并结合其他途径 (蜂窝基站定位、参考GPS定位等) 得到的辅助定位信息,计算出最终的位置坐标,返回给设备。 在此过程中可以看到,在使用MS-Assisted方式时,由于辅助定位信息的加入,可以取得更高的定位精度;同时,可以很大程度上克服弱GPS信号情况下的无法定位或精度降低的问题;将复杂计算转移到网络端,也可以很大程度上减小设备的电量消耗。 AGPS定位优劣分析 与传统GPS定位相比,APGS定位有如下的优势: 首次搜星速度快 有效减少设备的电量消耗 对于采用MS-Assisted方式的AGPS系统而言,除了以上优势外,还有: 定位精度更高 ...

2016-10-18 · 1 min · 110 words · -