分类目录归档:科技

Workerman,PHP 高性能 socket 服务框架

Workerman 是一款开源高性能异步 PHP socket 即时通讯框架。支持高并发,超高稳定性,被广泛的用于手机app、移动通讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。拥有异步Mysql、异步Redis、异步Http、MQTT物联网客户端、异步消息队列等众多高性能组件。

官网:http://www.workerman.net/

Chromium(Chrome)命令行开关列表

原文:List of Chromium Command Line Switches

拓展:

macOS 命令行打开Chrome

# case 1
/Applications/Google\ Chrome.app/Contents/macOS/Google\ Chrome

# case 2
/Applications/Google\ Chrome.app/Contents/macOS/Google\ Chrome https://webclown.net

# case 3 app 模式
/Applications/Google\ Chrome.app/Contents/macOS/Google\ Chrome --app=https://webclown.net

git add -A 和 git add . 的区别

Ps:原文时间 2016-09-10 13:30

实践

git add -Agit add .git add -u在功能上看似很相近,但还是存在一点差别

  • git add .:他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
  • git add -u:他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add --update的缩写)
  • git add -A:是上面两个功能的合集(git add --all的缩写)

下面是具体操作例子,方便更好的理解(Git version 1.x):

git init
echo Change me > change-me
echo Delete me > delete-me
git add change-me delete-me
git commit -m initial

echo OK >> change-me
rm delete-me
echo Add me > add-me

git status
# Changed but not updated:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git add .
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
# Changed but not updated:
#   deleted:    delete-me

git reset

git add -u
git status

# Changes to be committed:
#   modified:   change-me
#   deleted:    delete-me
# Untracked files:
#   add-me

git reset

git add -A
git status

# Changes to be committed:
#   new file:   add-me
#   modified:   change-me
#   deleted:    delete-me

总结

  • git add -A:提交所有变化
  • git add -u:提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
  • git add .:提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件

git版本不同会有所区别

Git Version 1.x

New Files Modified Files Deleted files Description
git add -A
git add .
git add -u

Git Version 2.x

New Files Modified Files Deleted files Description
git add -A
git add .
git add –ignore-removal
git add -u

转自:https://www.cnblogs.com/skura23/p/5859243.html

macOS App如何打包成dmg?

第一步 打包项目

在 XCode 中打开项目,并打包(command + b),在项目的根目录的 Products:

项目根目录的 Products

然后在桌面上新建一个文件夹,随意取个名字(例如:项目名字),然后将Products目录中的.app文件复制进去,为了实现拖拽到Applications的效果,需要在这个文件夹里放一个Applications的替身。具体做法是cd到这个目录,建立一个软链接(用终端):

cd ~/Desktop/[刚刚创建的文件夹]
ln -s /Applications/ Applications

第二步 创建 .dmg 文件

创建.dmg文件需要用到Mac自带的磁盘工具 App。打开磁盘工具,菜单栏选择文件新建镜像来自文件的镜像,然后选择刚刚创建的文件夹,

20190226232906_gGX8S6_Screenshot.jpeg

20190226233118_f9bd3B_Screenshot.jpeg

20190226233346_ts7B5G_Screenshot.jpeg

20190226233330_g8XftH_Screenshot.jpeg

20190226233442_ohIHZk_Screenshot.jpeg

20190226233711_EtC54Z_Screenshot.jpeg

20190226234221_Bg6Bfh_Screenshot.jpeg

然后就OK了。

参考:

  1. MAC APP 打包dmg

PS:cuImage不是自己开发的,引用别人的。

Medium 主题图缩略图

Column A Column B Column C
Art Art CryptocurrencyCryptocurrency ScienceScience
True True Personal FinancePersonal Finance JusticeJustice
Technology Technology ProgrammingProgramming Tvravel
Philosophy Philosophy ComicsComics WomenWomen
Basic Basic GamingGaming AddictionAddiction
Education Education MasculinityMasculinity StyleStyle
Psychology Psychology BusinessBusiness SpaceSpace
Privacy Privacy FictionFiction Data ScienceData Science
Blockchain Blockchain WorldWorld Visual DesignVisual Design
Spirituality Spirituality FamilyFamily WorkWork
Race Race RelationshipsRelationships MathMath
Media Media BooksBooks FilmFilm
TV TV PoetryPoetry EnvironmentEnvironment
Podcasts Podcasts FoodFood HealthHealth
Cities Cities MentalMental ProductivityProductivity
San San LanguageLanguage Machine LearningMachine Learning
LGBTQIA LGBTQIA HumorHumor ParentingParenting
History History PoliticsPolitics SelfSelf
Internet Culture Internet Culture SportsSports PetsPets
Music Music AccessibilityAccessibility SexualitySexuality
Design Design CultureCulture FutureFuture
Medium Magazine Medium Magazine WritingWriting EconomyEconomy
Creativity Creativity ReligionReligion GadgetsGadgets
Startups Startups SocialSocial PsychedelicsPsychedelics
Neuroscience Neuroscience iOSiOS Artificial IntelligenceArtificial Intelligence
Self Self Software EngineeringSoftware Engineering Android DevAndroid Dev
Wellness Wellness FreelancingFreelancing GunGun
Cybersecurity Cybersecurity MarketingMarketing DisabilityDisability
UX UX PhotographyPhotography LeadershipLeadership
Javascript Javascript TransportationTransportation EqualityEquality

macOS 中‘/usr/bin’目录内添加命令,出现‘Operation not permitted’

原由:

macOS 10.11 开始引入的系统完整性保护(Rootless),不再能够随心所欲的读写很多路径下了。设置 root 权限也不行。

Rootless机制将成为对抗恶意程序的最后防线

解决:

于是尝试关闭 Rootless。重启按住 Command+R,进入恢复模式,打开Terminal(终端)。

csrutil disable

重启即可。如果要恢复默认,那么

csrutil enable

附录:

csrutil命令参数格式:

csrutil enable [--without kext | fs | debug | dtrace | nvram][--no-internal]

禁用:csrutil disable

(等同于csrutil enable –without kext –without fs –without debug –without dtrace –without nvram)

其中各个开关,意义如下:

  • B0: [kext] 允许加载不受信任的kext(与已被废除的kext-dev-mode=1等效)
  • B1: [fs] 解锁文件系统限制
  • B2: [debug] 允许task_for_pid()调用
  • B3: [n/a] 允许内核调试 (官方的csrutil工具无法设置此位)
  • B4: [internal] Apple内部保留位(csrutil默认会设置此位,实际不会起作用。设置与否均可)
  • B5: [dtrace] 解锁dtrace限制
  • B6: [nvram] 解锁NVRAM限制
  • B7: [n/a] 允许设备配置(新增,具体作用暂时未确定)

【转】一文弄懂Nginx的location匹配

由于团队在进行前后端分离,前端接管了Nginx和node层,在日常的工作中,跟Nginx打交道的时候挺多的。之前对location的匹配规则是一知半解的,为了搞明白location是如何匹配的,查了些资料总结此文。希望能给大家带来帮助。

语法规则

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

语法规则很简单,一个location关键字,后面跟着可选的修饰符,后面是要匹配的字符,花括号中是要执行的操作。

修饰符

  • = 表示精确匹配。只有请求的url路径与后面的字符串完全相等时,才会命中。
  • ~ 表示该规则是使用正则定义的,区分大小写。
  • ~* 表示该规则是使用正则定义的,不区分大小写。
  • ^~ 表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找。

匹配过程

对请求的url序列化。例如,对%xx等字符进行解码,去除url中多个相连的/,解析url中的...等。这一步是匹配的前置工作。

location有两种表示形式,一种是使用前缀字符,一种是使用正则。如果是正则的话,前面有~~*修饰符。

具体的匹配过程如下:

首先先检查使用前缀字符定义的location,选择最长匹配的项并记录下来。

如果找到了精确匹配的location,也就是使用了=修饰符的location,结束查找,使用它的配置。

然后按顺序查找使用正则定义的location,如果匹配则停止查找,使用它定义的配置。

如果没有匹配的正则location,则使用前面记录的最长匹配前缀字符location。

基于以上的匹配过程,我们可以得到以下两点启示:

  1. 使用正则定义的location在配置文件中出现的顺序很重要。因为找到第一个匹配的正则后,查找就停止了,后面定义的正则就是再匹配也没有机会了。
  2. 使用精确匹配可以提高查找的速度。例如经常请求/的话,可以使用=来定义location。

示例

接下来我们以一个例子来具体说明一下匹配过程。

假如我们有下面的一段配置文件:

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /user/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

请求/精准匹配A,不再往下查找。

请求/index.html匹配B。首先查找匹配的前缀字符,找到最长匹配是配置B,接着又按照顺序查找匹配的正则。结果没有找到,因此使用先前标记的最长匹配,即配置B。

请求/user/index.html匹配C。首先找到最长匹配C,由于后面没有匹配的正则,所以使用最长匹配C。
请求/user/1.jpg匹配E。首先进行前缀字符的查找,找到最长匹配项C,继续进行正则查找,找到匹配项E。因此使用E。

请求/images/1.jpg匹配D。首先进行前缀字符的查找,找到最长匹配D。但是,特殊的是它使用了^~修饰符,不再进行接下来的正则的匹配查找,因此使用D。这里,如果没有前面的修饰符,其实最终的匹配是E。大家可以想一想为什么。

请求/documents/about.html匹配B。因为B表示任何以/开头的URL都匹配。在上面的配置中,只有B能满足,所以匹配B。

location @name的用法

@用来定义一个命名location。主要用于内部重定向,不能用来处理正常的请求。其用法如下:

location / {
    try_files $uri $uri/ @custom
}
location @custom {
    # ...do something
}

上例中,当尝试访问url找不到对应的文件就重定向到我们自定义的命名location(此处为custom)。

值得注意的是,命名location中不能再嵌套其它的命名location。

URL尾部的/需不需要

关于URL尾部的/有三点也需要说明一下。第一点与location配置有关,其他两点无关。

  1. location中的字符有没有/都没有影响。也就是说/user//user是一样的。
  2. 如果URL结构是https://domain.com/的形式,尾部有没有/都不会造成重定向。因为浏览器在发起请求的时候,默认加上了/。虽然很多浏览器在地址栏里也不会显示/。这一点,可以访问baidu验证一下。
  3. 如果URL的结构是https://domain.com/some-dir/。尾部如果缺少/将导致重定向。因为根据约定,URL尾部的/表示目录,没有/表示文件。所以访问/some-dir/时,服务器会自动去该目录下找对应的默认文件。如果访问/some-dir的话,服务器会先去找some-dir文件,找不到的话会将some-dir当成目录,重定向到/some-dir/,去该目录下找默认文件。可以去测试一下你的网站是不是这样的。

总结

location的配置有两种形式,前缀字符和正则。查找匹配的时候,先查找前缀字符,选择最长匹配项,再查找正则。正则的优先级高于前缀字符。

正则的查找是按照在配置文件中的顺序进行的。因此正则的顺序很重要,建议越精细的放的越靠前。

使用=精准匹配可以加快查找的顺序,如果根域名经常被访问的话建议使用=

拓展

转自:https://segmentfault.com/a/1190000013267839

mongoose 连接 MongoDB 数据库的 useNewUrlParser 警告解决办法

useNewUrlParser

用下面这段代码连接MongoDB数据库出现了警告提示:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/test');

警告提示:

(node:10626) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.

更改为一下代码即可:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true }, (err,res) => {
    if (!err) {
        console.log('连接数据成功!')
    } else {
        console.log('连接数据失败!');
    }
})