心之所向

后端开发


  • Home

  • Tags

  • Archives

阿里云ecs配置ftp服务及mysql远程连接

Posted on 2017-05-19

ftp服务

  • 使用filezilla server软件搭建
    参考文章:http://www.5xiaobo.com/?id=528
  • 记得配置filezillaserver 的passive mode ,由于filezilla搭建的ftp服务器将命令与数据使用不同的端口进行传输,所以只打开配置允许21,23端口访问是不够的

mysql 远程连接配置

  • 打开安全组策略,在公网规则下新建允许3306端口的访问
  • 在mysql中执行sql语句,解除用户只能在本地访问的限制,(以root用户为例)

    1
    2
    update user set host='%' where user='root' and host='localhost';
    flush privileges; #刷新权限表,使配置生效

    或者新建一个用户

    1
    2
    grant all on *.* to 'yourname'@'%' identified by 'password';
    flush privileges;
  • 如发现已打开端口3306的情况下依然不能访问,可以检查是否在ecs主机中打开了防火墙,如果打开了,则需要在防火墙中添加允许3306端口访问的规则

然后就可以远程连接到ecs中的mysql服务了

关于mysql中的enum类型

Posted on 2016-11-09

最近对mysql的enum数据类型很感兴趣,但是也发现一些问题,就是自己设置enum的可选值中有中文时,会出现乱码,甚至在phpmyadmin中设置完enum字段后表结构的页面就打不开了,后来发现其实是字符集的问题,记得一定要设置为utf8_general_ci ,因为归根到底,enum属于字符串类型的数据,需要设置编码的,其他的enum的一些问题在下面这篇文章里有详细介绍。

说起这个ENUM,它倒是mysql的一个特色字段,在以前很多人喜欢用它,因为他可以设置字段的区间范围,会让值可以被数据库所控制,不至于出现意料不到的值(比如,字段只想有0和1,结果出现了2,那2就是赃数据了)

但ENUM带来的问题也不少,比如数据迁移的时候,他几乎不可能被其他数据库所支持,如果enum里面是字符串,对于其他数据库来说就更郁闷了,还不能设为tinyint等类型的字段(enum虽然可以存储字符串,但对于内部来说,还是以顺序进行索引,比如’a’,’b’,’c’,我们也可以用索引值来获取值select from tbl_name whre enum = 2,这与select from tbl_name where enum = ‘b’等义)如果你看明白了这两句SQL为什么等义,那么你也就可以了解为什么不主张用enum字段了。

因为,如果一个设计不合理的ENUM字段,给程序员带来的就完全是梦魇了,比如一个enum字段的范围是(‘0’,’1’,’2’,’3’,’4’,’5’),我想这时候,你会不会哭呢?要知道enum的枚举值对应的索引是从1开始的,因此,insert into table (enum)values(1),你知道是插的什么值吗?你select from table一下,你就会发现,你插入的并不是1,而是0。

更有甚者,由于enum的区间也是可以变动的,如果你在enum的枚举字段范围中加一个值,并且不是加在最后,那么也就相当于,你把原来的范围都改变了索引值,试想这又是多么一个恐怖的事情?

因此,如果你的系统中真的已经使用了mysql的enum字段类型,请在查询的时候直接查询值(并加上单引号),这样就不会使用enum自身隐藏的索引值来获取结果了。【顺便说一下,enum的默认索引是从NULL开始,如果你允许NULL并default NULL】

之所以提起这个,是在用shopnc系统的时候发现大量这样的字段,让人非常郁闷,几乎没有办法优化(如果是纯数值型,还是建议采用tinyint字段吧,毕竟它也只占一个字节,即使出现赃数据,也可以被接受,不象enum,如果纯数字型范围,更改了索引,你就不知道你查询的值是否正确了)

因此建议,如果字段是字符串,并且长度固定,可以尝试用char,如果是数值型,还是用tinyint吧,比较安全稳定,而且即使迁移,问题也不大。
以上转载自https://my.oschina.net/u/234530/blog/68275

HTML5 Canvas的一些坑

Posted on 2016-11-04

当使用canvas渲染多张图片时,很多同学喜欢使用image对象的onload事件来确保图片的渲染,但是由于图片大小,格式等原因可能造成图片加载完成的先后并不是代码里写的次序,所以会产生本来要在上层的图片渲染在下层,甚至可能被遮挡,完全看不见。代码如改动前。

因此,可以从加载次序上着手,使用onload事件的回调函数强制性决定图片的加载顺序。代码如改动后。

改动前:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
var img = new Image();
var img2 = new Image();
img.onload = function() {
c.width = this.width;
c.height = this.height;
ctx.drawImage(img,10,10);
console.log("load1");

}
img2.onload = function() {
ctx.drawImage(img2,50,50);
console.log("load2");
}
img.src = '../img/test1.png';
img2.src = '../img/test2.jpg';

改动后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
var img = new Image();
var img2 = new Image();
img.onload = function() {
c.width = this.width;
c.height = this.height;
ctx.drawImage(img,10,10);
console.log("load1");
img2.src = '../img/test.png';
}

img2.onload = function() {
ctx.drawImage(img2,50,50);
console.log("load2");
}
img.src = '../img/test2.jpg';

jquery中使用delegate绑定scroll事件却捕捉不到的问题

Posted on 2016-10-12
1
function delegate(selector, type, data, func);

主要是因为delegate的绑定是绑定到自身的,但是事件的触发却是由子元素(selector指定的),而且是必须由该子元素触发(其他子元素就不行),触发的原理是事件的冒泡机制,
即使该父元素本身发生该事件了,或者父元素的其他子元素发生该事件了也不会触发该,就是这么特殊。

由于scroll不是冒泡类型的事件,所以不会触发。
要想达到绑定scroll到一个元素监控其滚动,可以使用on,或者bind,或者scroll

1
2
3
window.scroll(func);
window.on(null, 'scroll', func);
window.bind('scroll', func);

也就是说,想绑定到子元素,同时能触发父元素的滚动事件是不可能的。

远程连接到mysql包10038错误的问题

Posted on 2016-09-18

错误原因是没有将远程主机中的3306端口打开,因此将远程主机的3306端口开放即可

windows主机

可参考这篇文章

ubuntu

可参考这篇文章

对于ubuntu主机,只要在mysql的配置文件中打开3306的绑定即可,文中提到的路径
/etc/mysql/mysql.conf.d/mysqld.cnf
如果没找到,可以找一下
/etc/mysql/conf.d/my.cnf
将其中的bind address行注释即可。

一个vagrant配置文件的例子

Posted on 2016-09-04

如下是一个vagrant配置文件的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu-14.04"
config.vm.synced_folder ".", "/var/www/http", id: "vagrant-root",
owner: "www-data",
group: "www-data",
mount_options: ["dmode=775,fmode=664"]

config.vm.synced_folder "./etc/nginx/nginx_config", "/etc/nginx", id: "nginx-sites-enabled",
owner: "root",
group: "root",
mount_options: ["dmode=644,fmode=644"]


config.vm.synced_folder ".", "/vagrant"

config.vm.network :private_network, ip: "192.168.56.100", bridge: "vboxnet0"
#config.vm.network "forwarded_port", guest: 80, host: 80
#config.vm.network "forwarded_port", guest: 80, host: 8000
config.vm.network "forwarded_port", guest: 22, host: 2201
#config.vm.provision "shell", path: "bootstrap.sh"

config.vm.provider "virtualbox" do |v|
v.memory = 2048
v.cpus = 2
end
end

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.

# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
config.vm.box = "ubuntu-14.04"
config.vm.network :forwarded_port, guest: 80, host: 4567

# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false

# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# config.vm.network "forwarded_port", guest: 80, host: 8080

# Create a private network, which allows host-only access to the machine
# using a specific IP.
# config.vm.network "private_network", ip: "192.168.33.10"

# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"

# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
# config.vm.synced_folder "../data", "/vagrant_data"

# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
# config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
# vb.memory = "1024"
# end
#
# View the documentation for the provider you are using for more
# information on available options.

# Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
# such as FTP and Heroku are also available. See the documentation at
# https://docs.vagrantup.com/v2/push/atlas.html for more information.
# config.push.define "atlas" do |push|
# push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
# end

# Enable provisioning with a shell script. Additional provisioners such as
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
# documentation for more information about their specific syntax and use.
# config.vm.provision "shell", inline: <<-SHELL
# apt-get update
# apt-get install -y apache2
# SHELL
end

在linux上安装psysh

Posted on 2016-08-24

按照这篇文章PsySH——PHP交互式控制台中的方法安装psysh,但是在设置全局调用时发现不可用,在添加路径到path全局变量时 的格式问题

1
echo 'export PATH="/Users/{用户名}/.composer/vendor/psy/psysh/bin:$PATH"' >> ~/.bashrcfile:/D:/vagrant-prometheus/mjjshouse/README

Git官方文档阅读笔记

Posted on 2016-08-10

高级命令

  • git rm –cached filename

只从git的track列表中删除

  • git rm filename

从git的track列表以及硬盘中删除

  • git rm -f filename

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f

  • git diff

查看未加入暂存区的修改

  • git diff –cached(or staged)

查看已经加入暂存区的修改

  • git mv old_name new_name

rename操作

  • git reset HEAD filename

把一个已经暂存的文件标记为未暂存状态,便于分开提交,工作区修改不会丢失

  • git checkout filename

丢弃工作区的修改

  • git commit –amend

修改上一次的提交信息,并把暂存区的未提交的修改都提交到这个commit

  • git remote add

添加远程库

  • git remote rename <old_name> <new_name>

  • git remote show

这个命令列出了当你在特定的分支上执行 git push 会自动地推送到哪一个远程分支。 它也同样地列出了哪些远程分支不在你的本地,哪些远程分支已经从服务器上移除了,还有当你执行 git pull 时哪些分支会自动合并。

  • git remote -v

展示各remote详细链接

  • git tag命令相关

  • git fetch remote branch

git fetch操作会拉取远程库到本地,如果本地存在关联的分支,两个分支也不会合并,git pull相当于git fetch与git merge,大牛的操作都是使用fetch然后merge而不是直接pull,因为这样可以把合并的过程掌握在自己的手里

  • git fetch –all

抓取所有远程库

  • git pull –rebase

解决push操作时,本地无法提交,因为远程有新的提交,而又无法pull,因为远程的提交里面有晚于本地提交的情况,加入–rebase参数,可以把pull的基点调整为最新的远程仓库,而非本地的版本,将远程代码pull下来后,再将本地未提交的commit放在远程代码commit的后面

  • git stash list

列出已经暂存的东西

  • git config –global alias.

eg:git config --global alias.co checkout(为git checkout操作设置别名为git co)
一个比较有用的别名设置 git config --global alias.unstage 'reset HEAD --'; git config --global alias.visual '!gitk'

  • git checkout -b

在指定的分支(branch based on)基础上新建一个名称为new branch name的分支

  • git checkout –track

创建一个跟踪远程分支的本地分支

  • git branch -u remote/branch

设置当前分支跟踪的远程分支.
当设置好跟踪分支后,可以通过 @{upstream} 或 @{u} 快捷方式来引用它。 所以在 master 分支时并且它正在跟踪 origin/master 时,如果愿意的话可以使用 git merge @{u} 来取代 git merge origin/master。

  • git branch -vv

关于分支的更多信息

  • git push origin –delete branch

删除远程分支

  • git rebase master

变基操作,它的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master)的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。详情

  • git rebase –onto master server client

以上命令的意思是:“取出 client 分支,找出处于 client 分支和 server 分支的共同祖先之后的修改,然后把它们在 master 分支上重演一遍”

  • git rebase [basebranch] [topicbranch]

不切换的目标分支,直接执行变基命令,直接将特性分支topicbranch变基到目标分支basebranch

  • git merge branch

合并一个分支到当前分支,fast-forward merge(快进合并)

文件 .gitignore 的格式规范如下:

  • 所有空行或者以 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。
星号()匹配零个或多个任意字符;
[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
问号(?)只匹配一个任意字符;
如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
使用两个星号(
) 表示匹配任意中间目录,比如a/**/z 可以匹配 a/z, a/b/z 或 a/b/c/z等。

git log 后可跟很多参数,不过大多数都属于定制显示日志的样式或者限制日期,描述长短等,具体参考:点我

  • git log –graph

不懂git文件快照存储原理?看这篇

细解php文件写入

Posted on 2016-06-15

img
最近在学习composer的原理,其中有一步是将根据命名空间解析好的文件加载路径统一写入到一个文件里,这样以后只要检测到这个文件没有变化,那么就可以通过这个文件里面的记录直接进行文件加载了。在这一步里就牵涉到了文件写入的问题,在php中,针对文件写入功能,提供了很多相关的函数。之前自己一直都理解的很笼统,所以打算认真的归纳一下。
php中操作文件分三步。
先上一段示例代码。

1
2
3
4
5
6
7
8
9
10
//打开文件名为test.txt的文件
$fp=fopen('test.txt','w+');
//锁定文件,避免多个程序同时对文件进行操作
flock($fp,LOCK_EX);
//将“Hello world”写入到test.txt中
fwrite($fp,'Hello world');
//解锁文件
flock($fp,LOCK_UN);
//关闭文件,释放资源
fclose($fp);

下面开始细解。

​第一步,打开文件,调用fopen();

1
resource  fopen ( string  $filename , string  $mode [, bool $use_include_path = false [, resource $context ]] )

​例如,打开一个名为a.txt的文件,只需调用fopen('a.txt','r+');函数会返回一个资源类型的变量。其中传入的第二个参数是打开文件选用的模式,有r,r+,w,w+等,具体的可以参考php.net中的定义。

第二步,操作文件,调用fwrite,fread,feof,fgets等函数进行操作

写入文件–fwrite
读取文件–fread
读取文件内容的一部分–fgets
锁定文件–flock

第三步,关闭文件,调用fclose;

我应该坚持更新博客,坚持读书

Posted on 2016-05-19

今天开始要坚持读书和更新博客,只有认真努力生活的人才有生活的权利!

123

Martin

27 posts
30 tags
© 2022 Martin
Powered by Hexo
|
Theme — NexT.Pisces v5.1.3