在Apache2里怎样redirect URL? | How to redirect URL using Apache2?

在Apache2里怎样redirect URL?

原来以为这个问题很简单, Google了一下发现网上的答案五花八门, 而且版本很混乱 有httpd的, ASP.net, url redirect的, url rewrite的. 经过多次尝试各种组合, 终于试出了一个可行的解决方案, 值得在此记录一下, 相信一定能帮到有类似需求的人. 本文例子为Ubuntu + apache2, 2020年, 2021年左右.

普通URL redirect到另一个网站

编辑/etc/apache2/sites-available里面的一个site, 比如mysite, 需要redirect到anothersite.com, 那么可以加上一行Redirect

<VirtualHost *:80>
ServerAdmin webmaster@localhost
...
         ServerName mysite.com
         ServerAlias www.mysite.com
         DocumentRoot /var/www/html/mysite
         Redirect / http://anothersite.com
...         

修改完成后保存, 重启apache2

sudo service apache2 restart

Redirect到一个子目录

上面的方法可以redirect到不同的URL, 但是如果想redirect mysite.com到mysite.com/blog就不行. 我试了一下, 如果像上面那样改动, 在浏览器输入mysite.com就会被不停的改成mysite.com/blog/blog/blog… 无限循环. 很明显, 改写是recursive的. 那么就不要用Redirect而是用RedirectMatch

<VirtualHost *:80>
ServerAdmin webmaster@localhost
...
         ServerName mysite.com
         ServerAlias www.mysite.com
         DocumentRoot /var/www/html/mysite
         RedirectMatch ^/$ /blog/
...       

我也不太清楚apache2配置的语法细节, 但是以上是试过可行的方法. 最后一样是重启apache2让配置生效

sudo service apache2 restart

2020-12-26 比特币定投实验更新 | 2020-12-26 Update on Dollar average plan for buying bitcoin

2020-12-26 比特币定投实验更新

牛年还没到, 最近比特币就已经气冲天, 今天单价已经过了$26,000. 因为Concoinbase Pro有一次交易最少要买0.001个比特币的限制, 入场门槛越来越高了, 现在最少一次也要买入$26.xx以上了. 今天以前总投入$60, holding总价值$86.xx, 不到一个月总回报43%! 如果把全部资产买入真的是有机会改变阶级. 不过能赚到不正是因为赌注下少, 不在乎它的短期波动, 所以才能拿的住吗?我觉得还是继续执行定投计划, 也许会适量增加一点投入, 但注码量要控制在即使输光也不会让自己难受的范围内, 毕竟这还是有可能归零的高风险投资, 而自己对比特币还并不是很熟悉, 有时间的时候还是要多学习, 或者能做为程序员参与到相关项目开发中, 这样才有信心下比较重的注码投入. 不然就还是以娱乐为主吧.

今天新投入$30, 买入0.00111758, 均价$26,710.00. 总投入$90, holding现价值116.10.

照顾新生儿的经验总结

照顾新生儿的经验总结

现代社会, 尤其生活在湾区这种竞争激烈并且高物价的地方. 当父母不容易. 本文为宝妈总结的照顾小宝宝经验, 希望对其他新手父母有帮助.

照顾新生儿的关键就是要照顾小宝宝的吃睡玩.

我这里主要谈谈胸喂常遇到的问题. 胸喂最大的问题是宝宝是否能以正确的姿势吸奶. 大宝出生的时候没有经验,而且大宝天生舌筋可能有点紧,所以刚开始几天母乳没吃好,黄疸有点严重.二宝还好没有遇到这个问题,而且在医院遇到的护士教了我很有用的经验,所以二宝吸奶很好. 如果你担心你的宝宝吸奶是否正确,可以在医院的时候请教护士, 医院还有免费的母乳喂养指导lactation consultant. 我学到的经验是如果宝宝吸奶发出很大的咂咂声,那就说明宝宝吸奶舌头姿势不对, 有很多空气进去. 如果姿势正确,还是发出这样的声音,那你要怀疑宝宝舌筋有问题, 你可以找儿医做个简单的检查.检查很简单, 宝宝张开嘴, 儿医就可以通过观察宝宝舌头下的舌筋,和宝宝舌头的一些简单动作就可以大概看出来.

如果宝宝吸奶正常, 那下来还可能会遇到宝宝吐奶和呛奶的问题. 我家宝宝一般会在吃完奶过一会后吐奶, 我的解决办法是, 喂完后竖起来抱宝宝来拍嗝. 顺利的话, 稍微一拍,宝宝的嗝就出来, 但有时候拍很久都没嗝, 这时候我误以为没嗝, 把宝宝放下一会后, 她却吐奶了. 后来我发现, 如果喂奶的时候尽量让宝宝竖起来的姿势吸奶, 吃完奶后嗝很快就可以拍出来. 但是有时候拍完嗝后还是会有少量奶吐出来, 那么我怀疑有两个原因,一个是喂完奶后竖抱的时间不够长(一般的话要半个小时), 还有一个可能是宝宝吃的太多溢出来了, 那这种情况的话, 我的解决办法是少量多次, 我参考了网上的EASY程序3小时循环图.

但是这个schedule对我来说要做个小调整,因为我发现到宝宝睡觉的时候,我抱着她哄睡,她却哭闹, 我不知道她是因为没吃饱呢,还是不是真饿只是为了奶睡. 为了判断,我一般是这样, 首先每次喂宝宝的话保证宝宝吸的时间在10-15分钟, 中间可能要休息拍嗝(休息拍嗝时间不算),那么可能分2-3次喂. 但是时间够了,不代表宝宝一定吃饱了, 因为胸喂的话不知道奶的速度,所以仅靠时间判断奶量并不准确. 喂完后, 等一会看看,如果宝宝哭闹很久, 放倒胸前抱的话, 作出找奶的动作,那么可能是没吃饱, 如果只是稍微哭闹不持久的话, 那就可能不是真饿. 下来我们说下呛奶的问题. 我的宝宝一般只有在胸喂的时候奶速太急的时候会呛奶, 吐奶的时候她一般不会呛, 只是突然哭一下,然后奶从嘴角涌出来, 所以我看到她吐奶的第一反应是擦拭掉奶,防止流进耳朵. 呛奶的时候,宝宝一般会咳嗽, 然后休息几秒就好了, 我会保持她倾斜吃奶的姿势面朝上,不会去立刻竖抱起来拍, 网上也是不建议立即竖抱, 这样的话会容易把奶吸入呼吸道, 建议让宝宝侧着脸,然后轻拍宝宝背部. 但最好的话还是要避免呛奶的出现, 我的方法是, 如果知道奶速很急, 那就靠在椅子或者墙上,身体后倾, 让宝宝趴着吃, 这样宝宝就不会呛了.

大部分宝宝不能像大人那样自主入睡, 所以大人会比较辛苦. 我现在的偷懒办法是, 睡前让宝宝多消耗体力, 比如tummy time. 然后关灯放固定的催眠音乐, 抱累的话, 大人可以坐在椅子上靠后, 让宝宝趴在胸上, 身体有个角度, 这样大人也不累, 宝宝也舒服不用担心吐奶, 这样等宝宝睡着后, 就可以放下了. 我最近发现了个问题就是, 用普通的毯子给宝宝打包的话, 在抱的过程中, 尤其是竖抱的时候, 毯子会上移,遮住宝宝的口鼻, 所以我建议还是用睡袋. 为了防止宝宝睡觉过程中吐奶, 然后醒来, 我把宝宝的小床的床垫一头抬高一点,这样宝宝的床有个坡度. 等过些时间后, 再把床放平.

一个月左右的小宝宝活动能力还很有限, 能玩的东西不多, 我们家用的是下图这个可以让宝宝躺着踢上面琴键的小玩具, 踢到了就会响音乐. 上面还有些小动物造型的小挂件. 她高兴的时候还挺喜欢玩的.

最后推荐两个好用的apple watch功能, 一个是track 喂奶的时间, 一个是照明功能, 晚上胸喂的话不用起来开灯.

怎样用apache2设置多个网站? | How to set up multiple websites using apache2?

怎样用apache2设置多个网站

添加网站内容

Ubuntu里apache2的网站内容在

/var/www/html/

我们可以把网站内容(php, html files)放在上面路径的子路径中, 比如

/var/www/html/site1
/var/www/html/site2

设置Apache2

本文以Ubuntu为例子. 我们需要设置的文件在

/etc/apache2

首先要在sites-available里添加新的网站, 比如叫site1

cd /etc/apache2/sites-available
vim site1.conf

添加文件内容如下

<VirtualHost *:80>
	# The ServerName directive sets the request scheme, hostname and port that
	# the server uses to identify itself. This is used when creating
	# redirection URLs. In the context of virtual hosts, the ServerName
	# specifies what hostname must appear in the request's Host: header to
	# match this virtual host. For the default virtual host (this file) this
	# value is not decisive as it is used as a last resort host regardless.
	# However, you must set it for any further virtual host explicitly.
	#ServerName www.example.com

	ServerAdmin webmaster@localhost
	ServerName site1.com
	ServerAlias www.site1.com
	DocumentRoot /var/www/html/site1

	# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
	# error, crit, alert, emerg.
	# It is also possible to configure the loglevel for particular
	# modules, e.g.
	#LogLevel info ssl:warn

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	# For most configuration files from conf-available/, which are
	# enabled or disabled at a global level, it is possible to
	# include a line for only one particular virtual host. For example the
	# following line enables the CGI configuration for this host only
	# after it has been globally disabled with "a2disconf".
	#Include conf-available/serve-cgi-bin.conf
</VirtualHost>

然后添加第二个网站, 比如叫site2

cd /etc/apache2/sites-available
vim site2.conf

给site2添加内容

<VirtualHost *:80>
	# The ServerName directive sets the request scheme, hostname and port that
	# the server uses to identify itself. This is used when creating
	# redirection URLs. In the context of virtual hosts, the ServerName
	# specifies what hostname must appear in the request's Host: header to
	# match this virtual host. For the default virtual host (this file) this
	# value is not decisive as it is used as a last resort host regardless.
	# However, you must set it for any further virtual host explicitly.
	#ServerName www.example.com

	ServerAdmin webmaster@localhost
	ServerName site2.com
	ServerAlias www.site2.com
	DocumentRoot /var/www/html/site2

	# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
	# error, crit, alert, emerg.
	# It is also possible to configure the loglevel for particular
	# modules, e.g.
	#LogLevel info ssl:warn

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	# For most configuration files from conf-available/, which are
	# enabled or disabled at a global level, it is possible to
	# include a line for only one particular virtual host. For example the
	# following line enables the CGI configuration for this host only
	# after it has been globally disabled with "a2disconf".
	#Include conf-available/serve-cgi-bin.conf
</VirtualHost>

最后需要给以上两个site的conf file创建symbolic link, 放在sites-enabled里

ln -s /etc/apache2/sites-available/site1.conf /etc/apache2/sites-enabled/site1.conf
ln -s /etc/apache2/sites-available/site2.conf /etc/apache2/sites-enabled/site2.conf

可能需要重启apache2

sudo service apache2 restart

更新域名指向

以Namecheap为例子, 到所选域名, 比如site1.com里, 点击Manage, 然后在Advanced DNS里, 如下设置

Namecheap Advanced DNS setup

给site2也做类似的配置, 因为都在同一台服务器上, host ip是一样的, 把site1.com换成site2.com就可以

最后在浏览器打开site1.com和site2.com看看是否正常工作.

怎样给wordpress网站创建XML sitemap?

how to create a wordpress sitemap

XML sitemap是什么?

简单来说, XML sitemap是一个网站包含网页的列表. 它的目的是让搜索引擎, 主要是Google的爬虫能发现这个站点并把站点内的网页添加到搜索索引里. 一个新建的网站几乎是网络里的孤岛, 没有任何其他网站指向它, 所以如果想被Google收录并索引的话, sitemap是很重要的.

怎样创建一个XML sitemap?

如果使用Wordpress的话, 可以使用Yoast SEO插件生成一个XML sitemap.

安装Yoast SEO插件

在Wordpress管理后台选择Plugins, 然后Add new

搜索Yoast SEO, 然后点击Yoast SEO结果上的Install Now, 完成后, 点击Active, 如下图

用Yoast SEO生成XML sitemap

在Wordpress后台选择SEO, 然后general

选择Features tab, 确保XML sitemaps是ON的, 然后Save Changes

确认Sitemap成功生成

做完以上步骤以后, Sitemap的URL应该是<my site>/index.php/sitemap_index.xml. 比如本站feellikelearning.com/index.php/sitemap_index.xml 如下图

2020-12-16 比特币定投实验更新 | 2020-12-16 Update on Dollar average plan for buying bitcoin

继续执行比特币定投计划. 昨晚睡觉前挂了个19,400的单子, 今天早上起来发现BTC已经涨到涨到2万多一个了. 应该是历史新高了吧. 写作的时候已经是2万1千多. 幸好昨晚的单子居然能买到, 比较幸运. 挂的价格要比当时市场价格低不少, 没想到在横盘很久后起飞前赶上.

目前三次买入, 每次$20, 成本$60, 目前持有的BTC市场价格$68.39, 六个星期的总投入盈利为13.98%. 其实价格波动对定投来说是无所谓, 涨得慢了能在便宜的价格多买点, 涨了呢, 至少目前持有的增值了, 什么样都有高兴或不高兴的理由. 我也知道靠这种买入的资金量很难发财, 没有闲钱也就只能在自己能承担的风险内量力而行了. 没有很多本金的情况下, 投资现阶段只是辅助, 主要还是需要提高自己身价和场外赚钱能力.

怎样解决PHP找不到mb_convert_encoding函数? | How to solve the problem of php can’t find mb_convert_encoding function?

问题描述

本来想解决Wordpress不支持中文URL问题的. 网上大部分的帖子都是大同小异, 比如知乎这篇. 简单来说就是在wp-includes/class-wp.php里把url的encoding从UTF-8换成GBK. 我照着修改后并不行. 先遇到PHP找不到mb_convert_encoding这个函数, 后来解决了. 虽然最后中文URL还是没搞定, 这里记录一下怎么解决mb_convert_encoding找不到的问题的解决方法.

PHP 里找不到 mb_convert_encoding 函数的解决方法

首先安装 php-mbstring, 比如Ubuntu里

sudo apt-get install php-mbstring

然后重启web server, 比如 Apache2

sudo service apache2 restart

验证 mb_convert_encoding 安装成功

用PHP的REPL

$ php -a
php > $s = mb_convert_encoding('abc', 'UTF-8', 'GBK');
php > print $s;
鎮ㄥソ

php > $s = mb_convert_encoding($s, 'GBK', 'UTF-8');
php > print $s;
您好

可见 mb_convert_encoding 函数可以在PHP里正常使用了.

怎样解决WordPress需要ftp账号问题 | how to solve the “ftp account” problem in WordPress

问题描述

WordPress没设置好的时候, 如果直接安装插件, 主题都会提示需要输入ftp账号, 密码之类. 如下图所示

当然, 手动安装是一直可以的, 就是下载好然后上传到后台文件系统, 比如用sftp, 然后用ssh登陆后解压, 把文件目录拷贝到相应的路径里, 比如插件在wp-content/plugins里, 主题在wp-content/themes里. 就是比较麻烦, 每次更新都要重复操作. 其实只要修改一下设置, 就可以完全在Dashboard用图形界面完成升级, 安装等操作.

怎样修改设置?

在Wordpress安装目录下的wp-config.php里加入这么一行.

define('FS_METHOD' , 'direct');

这个文件基本都是一堆define(…); 加哪里无所谓, 和其他define平行就行.

然后修改Wordpress安装目录文件系统权限

chmod -R 777 <wordpress install path>

做了以上修改以后, 应该就可以不用看到提示需要ftp account的提示了.

算法练习 Leetcode 力扣 416. Partition Equal Subset Sum 使用0-1背包问题 2维dp模版的 Python 解法

问题描述

这题的最优解是使用Bottom up DP, 题目描述和详细解法可以参考这篇文章. 本文示范一下这题也可以直接使用这篇文章总结的0-1背包问题2维dp模版一字不改直接解

0-1背包问题2维度dp模版解法

Continue reading “算法练习 Leetcode 力扣 416. Partition Equal Subset Sum 使用0-1背包问题 2维dp模版的 Python 解法”

动态规划算法 – 0-1 背包问题 Python 讲解| Dynamic Programming Algorithm – 0-1 knapsack problem explained in Python

0-1 背包问题 Python讲解

问题描述

有N个物品, 每个物品Cost为C[i], Value为W[i], 其中 i 属于 [0, …, N-1]
有一个书包, 容量为V
求书包能装下的最大Value

为什么叫0-1背包?

Continue reading “动态规划算法 – 0-1 背包问题 Python 讲解| Dynamic Programming Algorithm – 0-1 knapsack problem explained in Python”