Windows编译pdfium

确定 Visual Studio 和 Windows SDK 版本

  • 需要Visual Studio2017 及以上
  • Windows SDK 10.0.19041 及以上(需要Debugging Tools For Windows)
  • 安装Desktop development with C++
  • 安装MFC/ATL support

设置全局代理

set DEPOT_TOOLS_WIN_TOOLCHAIN=0
set DEPOT_TOOLS_UPDATE = 0
set http_proxy=127.0.0.1:1080
set https_proxy=127.0.0.1:1080
set GYP_MSVS_VERSION=2022

安装 depot_tools

  • 下载 depot_tools ,并解压缩到d:\sdk\depot_tools目录
  • 系统path环境变量添加d:\sdk\depot_tools
  • 将然后设置vs2022_install环境变量为D:\Program Files\Microsoft Visual Studio\2022\Community
  • 运行gclient

验证Python安装

命令行输入where python,确保D:\sdk\depot_tools\python.bat在第一条,
如果不是则修改PATH环境变量顺序

下载 pdfium 代码

以管理员身份打开命令提示符,进入D:\cproject\pdfium目录

gclient config --unmanaged https://pdfium.googlesource.com/pdfium.git
gclient sync

生成构建文件

cd pdfium
gn args --ide=vs out\Default

out\Default\args.gn如下

# Set build arguments here. See `gn help buildargs`.

use_goma = false

clang_use_chrome_plugins = false

pdf_is_standalone = true

pdf_use_skia = false
pdf_use_skia_paths = false

is_debug = false

is_component_build = false

pdf_is_complete_lib = false

pdf_enable_xfa = false

pdf_enable_v8 = false

target_cpu = "x86"

is_clang = false

开始构建

ninja -C out\Default pdfium_test # 构建测试文件

测试

pdfium_test --ppm path/to/myfile.pdf

参考

企业招聘10倍程序员和0.5倍程序员的区别

首先,10倍只能是偶尔某些任务,并不是所有任务类型能10倍效率。

其次,编程是一项需要协作的工作,很多时候是流水线试操作的。且小组的一个10倍程序员可能没法让整个小组效率都能10倍,真正10倍程序员也不太好鉴别,或者不存在(干每项工作都10倍?)。而一个0.5倍程序员,却通常可以让整个小组的效率都变为0.5倍甚至更慢,而这通常非常容易鉴别。当我们在谈论10倍程序员时,通常我们只是想找一个1倍的,是因为大部分都还没有达到1倍;

所以,想招聘10倍程序员,成立10倍团队是不现实的,收益和成功可能性远少于踢掉团队0.x的程序员,木桶定律才是优先需要考虑的,企业不要企图花费太大精力企图去招聘10倍程序员,而是要防止招聘到0.x倍程序员,要时刻警惕0.x倍程序员。

对于个人来说,哪怕你真成为10倍程序员,公司不会给你10倍工资,要想成为10倍效率程序员,可能不太行得通,那么价值上的10倍可行性怎么样呢,可能更值得探讨?

MySQL分段统计函数INTERVAL和ELT

需求

期末考试成绩出来了,结果需要分为不及格(0-59),合格(60-84),优秀(80+)三个段,老师需要统计每个段成绩的分布情况。

分数表score结构如下:

id int
user_id int
score int

使用INTERVAL函数对学生成绩分段

SELECT user_id,score,INTERVAL(score,60,85) as step from score

INTERVAL函数会根据score返回0(少于60),1(60-74),2(85以及以上)

INTERVAL返回的结果进行分组:

SELECT INTERVAL(score,60,85),COUNT(*) AS num as step from score GROUP BY INTERVAL(score,60,85)

得到:

0, 5
1, 80
2, 15

使用ELT函数为阶段命名

ETL方法会建立重命名,将1,2,3分别转化为不及格,合格,优秀,但是etl不能是从0开始的,所以我们可以在INTERVAL分组时加一个0,将0分以下的划分为0,0-59的划为1,依次类推

SELECT INTERVAL(score,0,60,85),COUNT(*) AS num as step from score GROUP BY INTERVAL(score,60,85)

得到:

1, 5
2, 80
3, 15

最终SQL:

SELECT ELT(INTERVAL(score,0,60,85),"不及格","合格","优秀"),COUNT(*) AS num as step from score GROUP BY ELT(INTERVAL(score,0,60,85),"不及格","合格","优秀")

得到:

不及格, 5
合格, 80
优秀, 15

PHP编译配置实例

./configure --prefix=/usr/local \
--enable-fpm \
--with-fpm-user=ning \
--with-fpm-group=ning \
--with-fpm-systemd \
--enable-debug \
--with-openssl \
--with-zlib \
--enable-bcmath \
--enable-calendar \
--with-curl \
--with-enchant \
--enable-exif \
--with-ffi \
--enable-gd \
--with-avif \
--with-webp \
--with-jpeg \
--with-xpm \
--with-freetype \
--enable-gd-jis-conv \
--with-mhash \
--enable-intl \
--enable-mbstring \
--with-pdo-mysql \
--with-zlib-dir \
--with-pdo-pgsql \
--enable-sockets \
--with-sodium \
--with-xsl \
--with-zip \
--enable-mysqlnd \
--with-pear

Linux Shell清除过期文件

find $log_path -cmin +1 -type d | xargs rm -rf {} # 1分钟前创建的
find $log_path -mmin +1 -type d | xargs rm -rf {} # 1分钟前修改的
find $log_path -ctime +1 -type d | xargs rm -rf {} # 1天前创建的
find $log_path -mtime +1 -type d | xargs rm -rf {} # 1天前修改的
find $log_path/* -mtime +1 -type d | xargs rm -rf {} # 30天钟前修改的,不包括当前目录

nginx的多条件and配置

set $match_host '0';
set $match_url '0';
if ($host ~ "192.168.1.105") {
    set $match_host '1';
}
if ($request_uri ~* "test") {
    set $match_url '${match_host}1';
}
if ($match_url = '11'){
   return 404;
}

什么是全能程序员?全能程序员怎么来的?

最近看到阮一峰的《全能程序员 vs 特长程序员》提到观点,结合自身经历,发表一点不同的看法。

  • “软件行业"全能程序员"的出路,明显不如"特长程序员"”

  • "全能程序员"在这个行业是不受待见的,被视为"万金油"。

什么是全能程序员?全能程序员怎么来的?

一个程序员,如果长期在某一领域工作,可能会发现原有的知识不够用,这时候需要学习新的知识,恰好你乐意去学习,你也能挤出活创造时间和机会,然后你就去学习并掌握了,你运用和掌握的学习的知识,在使用的过程中你逐步发现他们的原理,了解新知识与旧知识的联系和异同,久而久之,你掌握了解的新知识越来越多,能解决的问题越来越多,虽然随着时间的迁移许多新知识也变成了旧知识,但是在别人眼里,你成了他们眼中各方面问题都能解决的“全能程序员”。所以:

  • 全能程序员的定义应该是:在某一领域,能够解决大多数别人不能解决问题。而不是能解决别能解决的问题的大多数。

  • 全能程序员是怎么来的:全能程序员是遇到问题后不断追根究底,在别人已经停止研究情况下,仍然不断学习和探索,直到到最终解决问题或者找到问题的最优解,在这个过程中不断积累成长起来的。

全能程序员的优势

  • 成为全能程序员是很多职位的最佳途径,如:CTO, devops, 架构师

  • 更好的解决问题的办法:如果将程序员比做木工,在全能手里,永远不止有锤子,全能程序员不可能只会干钉钉子的活,他们抛光会用狍子,打眼会用锉子,电锯和电转也是最先掌握的

  • 最快找到问题的解决办法:他们清楚整件事情的来龙去脉和原理,找问题不用开IDE,在心里就能完成DEBUG和需求分析,开IDE只是为了验证和最终解决问题

  • 最高效的解决问题方式:他们从架构上,组织上找到最有效率的协作方法,他们明白每多一道沟通就是浪费

  • 最节省资源:好比电脑CPU没在空耗,老板付一份工资找了一个需要几个人干的活

全能程序员的缺陷

  • 个人的精力是有限的,你不能一个解决所有问题,你仍然需要一个靠谱的团队,电脑可以不休息人需要休息

  • 思维切换需要时间,电脑可以多任务人往往不可以

  • 你个人的能力会被其他人平均,老板可能愿意付你2倍工资,往往没法付你10倍工资,即使你是10倍程序员

  • 你需要付出的比别人多,除非你乐意,否则没法坚持

全能程序员/全能非程序员的现实例子

全能非程序员的例子:

  • 毛泽东不仅会打仗,诗的气势普通人恐怕也很难达到;
  • 本杰明富兰克林不仅能当好总统还会发明创造;
  • 达芬奇不仅能画好蛋;
  • 马斯克创Paypal、造车、造火箭和造星链。。。

全能程序员的例子:

  • 几乎所有编程语言发明者都精通其他一门到多门语言
  • 合格的devops或者架构师都精通一门语言+数据库+非关系存储+linux+分布式

事情的本质

  • Python、C++是全能的,PHP、Go、R、Lisp是特长的,他们都是成功的
  • 罗技、格力专注成功,联想、华为、小米、通用不那么专注也很成功
  • 马云不会编程能带领阿里成为技术性领先的公司,马化腾、王兴、张小龙搞技术的也不会因此管理和产品能力就差一点

总结:全能和特长本不矛盾,各阶段选取合理的发展方向。作为技术人在一个学习好英语,掌握几门编程语言、几种数据库、学习下devops,学习管理、产品和运营,先成为一个领域专家,然后架构师,CTO,再自己创立公司,仍然不失为一条明确的路径。

linux(ubuntu/manjaro)让JetBrains(Phpstorm/Pycharm/Intellij)支持ibus中文

目前的解决方法:

  • 下载这个https://cache-redirector.jetbrains.com/intellij-jbr/jbr_jcef-11_0_7-linux-x64-b765.53.tar.gz JRE 并解压。
  • 然后Help | Find Action在IDE主菜单中点击,输入Choose Boot Java Runtime for the IDE,回车,然后点击New下拉,向下滚动,找到Add Custom Runtime选项,选择这个解压后的JRE运行,重启IDE。
  • 对于 2020.3.x 版本,您需要使用此步骤切换到此 JRE:https ://www.jetbrains.com/help/idea/2020.3/switching-boot-jdk.html#switch-jdk
  • 或者尝试使用上述步骤切换到 OpenJDK 11(AdoptJDK 11、OracleJDK 11)。

参考

Ubuntu下PHP 7和PHP 8多版本共存以及composer指定版本

修改更新源

sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt upgrade

安装PHP7以及常用扩展

sudo apt install php7.4-common php7.4-cgi php7.4-gd php7.4-mysql php7.4-xml php7.4-cli php7.4-json php7.4-sqlite3 php7.4-xmlrpc php7.4-bcmath php7.4-enchant
php7.4-opcache php7.4-readline php7.4-xsl php7.4-bz2 php7.4-curl  php7.4-fpm php7.4-mbstring php7.4-pgsql php7.4-tidy php7.4-zip

安装PHP8以及常用扩展

sudo apt install php8.0-common php8.0-cgi php8.0-gd php8.0-mysql php8.0-xml php8.0-cli php8.0-sqlite3 php8.0-xmlrpc php8.0-bcmath php8.0-enchant php8.0-opcache php8.0-readline php8.0-xsl php8.0-bz2 php8.0-curl  php8.0-fpm php8.0-mbstring php8.0-pgsql php8.0-tidy php8.0-zip

composer安装以及使用

安装composer

php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer

配置composer使用镜像

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

运行composer时指定PHP版本

php8.0 /usr/local/bin/composer
php7.4 /usr/local/bin/composer
alias composer7='php7.4 /usr/local/bin/composer'
alias composer8='php8.0 /usr/local/bin/composer'

使用symfony composer以及.php_version文件指定PHP版本

查看本地所有PHP版本

symfony local:php:list

显示结果

┌─────────┬────────────┬────────────┬─────────┬─────────┬─────────┬─────────┐
│ Version │ Directory  │  PHP CLI   │ PHP FPM │ PHP CGI │ Server  │ System? │
├─────────┼────────────┼────────────┼─────────┼─────────┼─────────┼─────────┤
│ 7.4.14  │ /usr/local │ bin/php    │         │         │ PHP CLI │ *       │
│ 7.4.16  │ /usr       │ bin/php7.4 │         │         │ PHP CLI │         │
└─────────┴────────────┴────────────┴─────────┴─────────┴─────────┴─────────┘

指定symfony composer使用PHP7

echo 7 > .php-version

指定symfony composer使用PHP8

echo 8 > .php-version

使用symfony composer安装或者更新包

symfony composer install

参考