Author Archives: alex

My Olympus Gears

  • Olympus PEN E-PL2
  • Olympus PEN E-P3
  • Olympus PEN E-P5
  • Olympus OM-D E-M5 Mark II
  • Olympus M.Zuiko Digital ED 12-40mm f/2.8 PRO
  • Olympus M.Zuiko Digital ED 40-150mm f/2.8 Pro

未出镜的还有:

  • Olympus M.Zuiko Digital MC-14 1.4x Teleconverter
  • Olympus M.Zuiko Digital ED 9-18mm f/4-5.6
  • Olympus M.Zuiko Digital ED 45mm f/1.8
  • Olympus M.Zuiko Digital ED 12-50mm f/3.5-6.3 EZ
  • Olympus M.Zuiko Digital ED 40-150mm f/4.0-5.6 R
  • Panasonic Lumix G 20mm f/1.7 II
  • Panasonic Lumix G 14mm f/2.5 II

折腾WordPress的Media Library在迁移后不显示图片的故障

用WordPress自带的migration tool迁移到新服务器,会遇到这样的问题:虽然之前上传的照片都已经拷贝到wp-content/uploads目录下,但是在Media Library下,这些照片都无法正常显示,原因是有两张表的数据没有导过来:wp_posts和wp_postmeta。

搞了半天,才找出解决办法。

首先,在旧服务器,导出所有attachment类型的posts:

sudo mysqldump wordpress wp_posts --where="post_type='attachment'" > wp_posts.sql

导出所有与attachment有关的wp_postmeta记录:

sudo mysqldump wordpress wp_postmeta --single-transaction --where="post_id in (select id from wp_posts where post_type='attachment')" > wp_postmeta.sql

之后,将两个sql文件上传到新服务器,并导入对应数据库:

mysql -u root -p wordpress < /home/wp_posts.sql

mysql -u root -p wordpress < /home/wp_postmeta.sql

这个方法存在一个问题:导出的记录的id可能在新实例中的表里已经存在了,这就很麻烦了,一个办法是,在sql文件里手动改掉冲突的id;另一种就是放弃所有冲突的id(在sql文件手动删掉对应的脚本)。我在wp_posts里使用手动改id的方法,因为一共只有四五条记录冲突;而在wp_postmeta表,我采用了批量修改新插入记录的ID后导入。具体方法是,首先在新实例的数据库上执行

select max(meta_id) from wp_postmeta;
+--------------+
| max(meta_id) |
+--------------+
| 15840 |
+--------------+
1 row in set (0.00 sec)

找出当前wp_postmeta表最大ID,然后用文本编辑器打开wp_postmeta.sql,查找”),(“,替换为”),(15840+”,也就是在原ID的基础上自增15840,以保证新ID不存在。当然,脚本第一条记录由于不符合”),(“的格式,所以需要手动修改为(15840+”。完成以后,放到服务器上导入,问题顺利解决。

继续折腾:Piwigo相册

前阵子,趁迁移blog的机会,把计划了很久的相册给建了起来。最早用的是Flickr的免费相册,无限容量,而且画质优化也特别棒,可是几年前,免费用户的容量被限制到了1000张照片,远低于我希望管理的照片数,所以就慢慢地放弃了Flickr。之前也试用过其他一些免费云端相册,总有这样那样的限制,还用了一阵子QNAP自带的Photo Station,始终没法习惯他的管理模式,所以也放弃了。

这次试用了一下selfhost的Piwigo相册,出人意料的满意。Selfhost意味着可以为所欲为,不用为容量或者照片数量担心,于是便慢慢的将自己过去几年拍的一些照片,传到了Piwigo里。经过一个月左右的摸索,感觉已经达到了一个比较理想的状态了。

Piwigo的相簿管理非常简单,而且支持子相簿,相簿的封面照片可以自选。同时,每张照片都能看到拍摄时的exif信息,并且支持添加GPS坐标(如果拍摄时自动添加了坐标,则无需手动添加),并显示在地图插件上。

另一个比较有意思的功能是Piwigo支持标签功能,每张照片可以添加多个标签,便于管理。比如我,就创建了彩虹、瀑布、极光、野生动物、湖面倒影的几个标签,方便检索同一类型的照片。

不过,我平时管理的照片,基本都是用相机拍摄的,然而每次出游,Mei都会用自己的手机拍不少照片,其中也不乏一些蛮有意思的作品,我现在还没想好该用什么样的一种方式去管理这些相片。

Raspberry Pi – 继续折腾FlightAirMap

PiAware最大的问题是没办法记录曾经检测过的飞机,于是我又开始折腾起了功能更强大的FlightAirMap

安装过程

Install git, mariadb, apache and PHP with needed modules:

sudo apt-get install git mariadb-server apache2 php5 php5-curl php5-mysql php5-gd php-pclzip

Or this on Stretch:

sudo apt-get install git mariadb-server apache2 php7.0-common php7.0-cgi php7.0-mysql php7.0-curl php7.0 php7.0-xml php7.0-zip php7.0-gd php7.0-json

Get FlightAirMap from git:

cd /var/www
sudo git clone --recursive --depth=1 http://github.com/ysurac/flightairmap

Edit Apache conf /etc/apache2/site-available/000-default.conf, add this in VirtualHost section:

<VirtualHost *:8088>
        ServerName 192.168.68.128/flightairmap
        DocumentRoot "/var/www/flightairmap"
        <Directory /var/www/flightairmap>
                Options Indexes FollowSymLinks
                AllowOverride All
                Require all granted
        </Directory>
</VirtualHost>

Enable mod rewrite:

sudo a2enmod rewrite

Restart apache2:

sudo service apache2 restart

Fix permissions:

cd /var/www/flightairmap
sudo chmod 666 require/settings.php
sudo chmod 777 install/tmp
sudo chmod 777 data

Create database and user, may skip if already created:

mysql -u root -p
update mysql.user set password=password('YOUR_DB_PASSWORD') where user='root';

Then:

CREATE DATABASE `flightairmap`;
GRANT ALL ON `flightairmap`.* TO 'youruser'@'localhost' IDENTIFIED BY 'yourpass';
FLUSH PRIVILEGES;

Now use your browser to go to http://127.0.0.1/install/ (or ip of your server) Run scripts/update_db.php in a shell.

cd /var/www/flightairmap/
php scripts/update_db.php

Add FlightAirMap service:

sudo cp /var/www/flightairmap/install/init/flightairmap.service.systemd /etc/systemd/system/flightairmap.service

Alter paths to match your path, may skip i no change to the installation folder:

sudo nano /etc/systemd/system/flightairmap.service
sudo chmod 644 /etc/systemd/system/flightairmap.service

Then you can run flightairmap daemon:

sudo systemctl enable flightairmap.service

Add update_db.php in /etc/crontab:

sudo 5 * * * * root php /var/www/flightairmap/scripts/update_db.php >/dev/null 2>&1

运行效果:

折腾Raspberry Pi:安装PiAware

PiAware是什么鬼?

官方解释:

您的地面站可以运行 FlightAware 的 PiAware 软件,用于跟踪在 100-300 miles (视线内,取决于天线的安装范围) 内的飞行,并自动将数据传送给 FlightAware。 您可以直接从您的 PiAware 设备或通过 FlightAware.com 跟踪航班。为了表达FlightAware的谢意,发送ADS-B数据的用户将享受以下优待:

  • flightaware.com上的实时数据(存在最多两分钟的标准数据处理延迟)
  • 访问本地设备最近一秒接收的最新实时数据(可通过本地网络连接在统计信息页面访问)
  • 来自本地设备的数据在FlightAware航迹上突出显示
  • 站点性能详细统计
  • 一个免费Enterprise Account (价值每月89.95美刀)

安装过程:

硬件:

将amazon购买的ADS-B接收器连上天线,并插入RasPi的USB口。

软件:

wget https://flightaware.com/adsb/piaware/files/packages/pool/piaware/p/piaware-support/piaware-repository_3.8.1_all.deb
sudo dpkg -i piaware-repository_3.8.1_all.deb

sudo apt-get update
sudo apt-get install piaware

sudo piaware-config allow-auto-updates yes
sudo piaware-config allow-manual-updates yes

sudo apt-get install dump1090-fa

sudo reboot

安装完毕后,登录flighwaware网站激活刚安装完毕的客户端

https://flightaware.com/adsb/piaware/claim

激活以后,就能在本地局域网看到本地地图以及正在追踪的飞机了。

还有一个问题,由于我这个RasPi,之前已经安装了Apache运行wordpress和piwigo相册,而PiAware默认使用的是lighttpd服务器,两者(Apache和lighttpd)同时运行,会造成端口监听冲突,同时也会加重主机的负荷,所以我又多做了几个步骤,把dump1090-fa的服务迁移到了Apache上。

具体步骤很简答,只需要改动两个文件:

第一个是在/etc/apache2/ports.conf中加入对8080端口的监听 :

Listen 8080

其次,将8080端口的服务加入到/etc/apache2/sites-available/000-default.conf:

<VirtualHost *:8080>
        ServerAdmin [email protected]
       DocumentRoot /usr/share/dump1090-fa/html/
       Alias  "/dump1090-fa/data/" "/run/dump1090-fa/"
       Alias  "/data/" "/run/dump1090-fa/"
       Alias  "/dump1090-fa/" "/usr/share/dump1090-fa/html/"
       Alias  "^/dump1090-fa$" "/dump1090-fa/"
        #SetEnvIf Request_URI "/dump1090-fa/data/.*\.json$" Header set "Access-Control-Allow-Origin" "*"
        <Directory "/usr/share/dump1090-fa/html/">
        Require all granted
        Options All
        AllowOverride All
        SetEnvIf Request_URI "/dump1090-fa/data/.*\.json$" Header set "Access-Control-Allow-Origin" "*"
        </Directory>
        <Directory "/run/dump1090-fa/">
        Require all granted
        Options All
        AllowOverride All
        SetEnvIf Request_URI "/dump1090-fa/data/.*\.json$" Header set "Access-Control-Allow-Origin" "*"
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>


重启Apache服务

sudo service apache2 restart

禁用lighttpd

sudo systemctl disable lighttpd

sudo update-rc.d -f lighttpd remove

将Apache服务设为自动启动

sudo systemctl enable --now apache2

实际运行效果:

下一步:

Amazon买的ADS-B自带的天线信号有点弱,只能接收到周围25NM左右的范围,接下来可能另外买一个信号强一点的天线,同时需要调整一下摆放位置。

参考资料:

https://flightaware.com/adsb/piaware/install
https://discussions.flightaware.com/t/migrate-dump1090-fa-to-apache/34053/11

F1 70th Anniversary GP @ Silverstone

本周,再次开闹钟六点起来看比赛。

本周的比赛是银石背靠背两场的第二场。从上周的表现来看,我本以为这又会是一场Mercedes AMG一二带回的无聊比赛,没想到Red Bull的轮胎策略发挥了奇效,让Verstappen在赛车性能不占优的情况下,出人意料的拿下了冠军,这才是我原本印象中的F1,可以靠进站,加油的策略左右比赛的进程,而最近几年的比赛,由于取消了加油,又统一了轮胎供应商,令比赛的不确定性减少了很多,也让比赛少了很多看点。

除了Max的夺冠,Racing Point的代打车手Hulkenberg也有出色的表现,排位赛跑入前四三,正赛也一度位列第四,只是最后运气不佳,因为车胎的缘故被迫多进一次站而位列第七。不过下周巴塞罗那站,如果Perez不能及时康复,那他应该还有一场表现的机会,祝他好运。

另外,就是Vettel,延续了最近的恶劣表现,发车没多久就自己失误spin,后来又在team radio里和车队发脾气,最后落到一分没得,和队友Leclerc的第三形成了鲜明对比。

这场比赛,Team Radio也有许多亮点,有些也挺搞笑的,我截了几个图大家一起乐呵乐呵。

Max Verstappen, during the race, when asked to back off and manage tires

Hamilton is obviously worried about his tires

Vettel…

Verstappen on final lap

2020 F1 Silverstone Grand Prix

这场比赛真是太戏剧化了,前51圈基本上就是半看半打瞌睡,直到倒数第二圈,博塔斯爆胎了。没想到这还不是全场最高潮的,最后一圈,整场领跑的汉密尔顿也爆胎了,眼看着维斯塔潘从差20多秒一点点追进,最后还是功亏一篑,汉密尔顿拖着一条爆胎冲过了格子旗终点线。维斯塔潘最后回场圈的时候在team radio里气的破口大骂,如果不是倒数第二圈回去换了个胎刷最快圈速,本场冠军就是他的了。。。

另外有一点遗憾的是我今年特别欣赏的年轻车手诺里斯,老老实实跟在队友塞恩斯后面开了大半场,最后被里卡多慢慢追近,并利用DRS的优势超越,白白丢了一个位置。不过我还是很看好他的,希望下一场比赛能继续延续这个赛季的出色表现。

 

 

Continue reading

折腾Raspberry Pi:Migrating WordPress to Raspberry Pi

Preparation

Take full backup of existing system

Copy files to USB drive (extFat format)

 

On Raspberry Pi:

Update system

sudo apt-get update
sudo apt-get upgrade

Mount USB Drive

sudo apt install exfat-fuse exfat-utils

Install Apache

sudo apt install apache2 -y

Install MariaDB

sudo apt-get install mariadb-server -y

Install PHP

sudo apt-get install php php-mysql -y

Install PHPMyAdmin

sudo apt install phpmyadmin
select "apache2" option by pressing SPACE and then ENTER
select "Yes" at the next prompt
Set a password for PHPMyAdmin

Create a new user to create and access data tables within PHPMyadmin

sudo mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password_set_in_previous_step' WITH GRANT OPTION;
exit out of MySQL cmd line by typing “quit” in the terminal

Configuring Apache for PHPMyAdmin

sudo nano /etc/apache2/apache2.conf
Add the following line to the bottom of the file:
Include /etc/phpmyadmin/apache.conf
Save and exit by pressint CTRL + X and then pressing Y then ENTER.

Restart Apache service

sudo service apache2 restart

Accessing PHPMyAdmin

Type http://localhost/phpmyadmin in browser
User Name and Password are the ones set in previous step.

Install GEdit

sudo apt install gedit -y

Increase import file size of PHPMyAdmin

sudo gedit /etc/php/7.3/apache2/php.ini
update the following values:
memory_limit: 256M (default = 128)
post_max_size: 64M
upload_max_filesize: 40M
Save and exit.
Restart apache
sudo /etc/init.d/apache2 restart

Import Database

Create new database (match the database name in the backup sql file)
Go to Import tab (ignore errors), select backup sql file and import

“Install” WordPress

Copy from USB drive (files and folders under public_html folder/) to /var/www/html/ folder

Edit “wp-config.php”

Open “wp-config.php” with Text Editor.
Update the following values:
DB_USER
DB_PASSWORD
Also, add the following values:
define(‘WP_SITEURL’, ‘http://www.hi-alex.com/’);
define(‘WP_HOME’, ‘http://www.hi-alex.com/’);

Done

 

Fixing phpmyadmin “phpmyadmin – count(): Parameter must be an array or an object that implements Countable” error:

sudo nano +613 /usr/share/phpmyadmin/libraries/sql.lib.php
replace code

((empty($analyzed_sql_results['select_expr']))
    || (count($analyzed_sql_results['select_expr'] == 1)
        && ($analyzed_sql_results['select_expr'][0] == '*')))

with

((empty($analyzed_sql_results['select_expr']))
    || (count($analyzed_sql_results['select_expr']) == 1)
        && ($analyzed_sql_results['select_expr'][0] == '*'))

Ctrl + O
Enter
Ctrl + X
sudo service apache2 restart
sudo nano +613 /usr/share/phpmyadmin/libraries/sql.lib.php
replace code

if ($options != null && count($options) > 0) {

with

if ($options != null && count((array)$options) > 0) {

Ctrl + O
Enter
Ctrl + X
sudo service apache2 restart
 

Securing phpmyadmin, block access from internet

Open it in a text editor (sudo nano /etc/phpmyadmin/apache.conf) and find the block that looks like:

<Directory /usr/share/phpmyadmin>
...
</Directory>

Inside the block, add the following lines:

Order Deny,Allow
Deny from all
Allow from localhost
Allow from 127.0.0.1
Allow from 192.168.68.0/24

Ctrl + O
Enter
Ctrl + X
sudo service apache2 restart
 

Map www.hi-alex.com to a sub folder under /var/www/html/

sudo nano /etc/apache2/sites-enabled/000-default.conf
Add the following lines:
ServerAdmin [email protected]
DocumentRoot /var/www/html/blog
ServerName www.hi-alex.com
Ctrl + O
Enter
Ctrl + X
 

References:

How to Install WordPress on Raspberry Pi
How to Install phpmyadmin on Raspberry Pi
Increase phpmyadmin import file size
Mount ExFat disk on Raspberry Pi
Copy or Move WordPress to Another Server
Fix phpmyadmin error
Fix phpmyadmin error on Import tab

伦敦一周游有感

在伦敦呆了一周,感觉与美国颇有不同。
伦敦人:
1. 洋气,穿衣考究,名牌多,特别是男的
2. 路上抽烟非常普遍,女的抽烟也很多
3. 爱乱穿马路,不管红灯绿灯,见缝插针
4. 开车不让行人,即便你在过马路,他依然会朝着你冲过来
5. 遍地豪车,这一周看到的劳斯莱斯比我这辈子加起来的还多,此外AMG, M, RS也非常常见
6. 好吃的比美国(湾区)多太多


两个不靠谱的T-Mobile员工

前阵子网上看到T-Mobile新推出了一个$65两条线,无限通话,短信和流量的预付费套餐,考虑到目前我一个人的花费就将近$80,和Mei商量了一下,决定把我俩的号码转进这个套餐。
星期天下午,我们来到离家不远的T-Mobile门店,开门见山地跟柜员小哥James说明来意,他也很确定的说没问题,可以帮我们搞。于是我就把我的手机号码 (下称404) 和在ATT的账户号码以及PIN写在纸上给了他。他在电脑上操作了一通,抬起头告诉我搞不定,说什么我的号码不eligible,他的同事也凑过来问我最近有没有尝试把号码port out to其他运营商,我很确定地告诉他说没有,我这个号码用了8年了,从来没转过运营商。小哥低头又搞了一阵子,抬起头告诉我说应该不是我的问题,他试了另一个他确定是eligible的号码(下称415),也出现了同样的错误,可能是他们的系统出了故障,我可以先用临时号码(下称650)应急,第二天早上他再尝试帮我操作。于是我就高高兴兴地回家了。
第二天一早,我的650临时号码莫名接到一个明州打来的电话,说是找一个叫Gerald的人。我告诉她你打错了。过了一会她又打来了,我问她你打的什么号码,她说是415 blah blah,我告诉她我的号码是650的区号,昨天才从T-Mobile搞来的。她说不可能啊,我手机里存了这个号码好久了,之前都没问题的。我又问她,是不是你朋友设置了call forward,把他那个415的号码forward到我这个号码上了?要不你发个短信问他一下?没多久,我手机上收到了她发的短信。这下我也懵逼了,只听说电话能forward,难不成短信也能forward🙄?懵逼间,James给我来电话了,一接通就兴奋的告诉我Hey I have just successfully ported in your number 415 blah blah。我懵逼X2🙄。什么415的号码?老子明明是404的号码啊!你再去瞧瞧我昨天写的那张纸?沉默了一会,他说他搞错了,但是don’t worry, I’ll fix it for you.我又顺代问了一句,我刚才接到几个莫名的电话,你是不是把别人的号码转给我了?他支支吾吾了一下,又reassure我会帮我搞定。过了半小时,又接到了James的电话,告诉我这次应该没问题了。挂了电话,我自己试了一下,的确是404的号码了,于是长舒了一口气。这可是我跟Mei的情侣号好吗!我可不想丢。
接下来相安无事两三天,直到星期三早上,平静被打破了。
十点多,我接到Mei的微信,问我为什么她的号码被改掉了。手机上还有两个T-Mobile的语音留言。我试了一下,的确,她原先415的号码接不通了,变成了另一个650的新号码。搞什么飞机啊。我操起手机,拨通了T-Mobile的客服电话。接线小哥听了我的描述,也是一脸懵逼,反复问我Mei是不是换了新的sim卡,我也再三确认她没有收到新的sim卡,我没必要骗你啊,你不信的话可以联系当初给我们转套餐的柜员James。T-Mobile还挺高级的,他当即帮我联系上了James,电话里James也比较迷,再三和我确认他没有改动过Mei的号码,但是他会联系他们负责转号的team,查明真相。通话间,我google了一下类似的情况,发现也有人遇到过类似的问题,是黑客获取了他的PIN,然后将号码转入自己手中,用来接收银行的2 factor authentication的验证码。看到这里,我背后起了一阵冷汗,赶紧登陆网银(我和Mei用的Joint Account),确保存款没有被转走。在等待James的同时,我又让Mei将她不怎么听得懂的三哥的语音留言发给我。仔细听了一下,大致意思就是”we received a complaint from an ATT customer that his number was ported out without his authorization. Therefore I have returned it back to him,and have assigned a temporary number to you”。尼玛什么鬼,Mei用这个号码已经四五年了好嘛!于是我又一次拨通了T-Mobile的客服,这次是另一个小哥接的电话。我再一次向他描述了具体情况,请他查看一下早上的操作记录。他很快就找到了那条记录,并读给我听:An ATT customer complaint that his 415 blah blah number was ported 。。没等他念完,我打断了他,what? what 415 number? Can you read that again? That’s not my wife’s phone number! 他没给我重复那个号码,只是说I need to transfer you to our xxxx (记不清了) team。电话转了过去,我又描述了一遍情况,刚说完,又被告知 since this is a prepaid number, I have to transfer you to our xxxx (记不清了)  team。电话转了过去,我抱怨了一下I’m not satisfied at all. I’ve been transferred three times, and no one understands the problem。当然,我又表述了一遍情况。对方一边浏览操作日志,一遍发出Oh! What? Hold on! I see!的感叹。可能这时候James和他联络的Team的沟通产生了效果,和我通话的客服向我保证,早上的port out request has been cancelled just now. It will take up to 24 hours to take effect。挂完电话,我又拨通了James的号码,他也同样和我保证,早上的操作已经取消了,如果第二天这个时候还是有问题,可以再联系他。
今早(周四)一早,我又试了一下Mei之前的415号码,结果已经能够接通了。Problem solved!
TL;DR:
周日:

  • James试图转入我的404号码,出错。
  • James用一个415的号码(Jared’s number)测试,同样出错。
  • 猜测:James忘了把这个415测试号码删除。

周一:

  • James错误的将Gerald的415号码转入我的名下。
  • James修正错误,将我的404号码重新转入我的名下。
  • 猜测:James可能没有把之前的415号码“还给”Gerald。

周三:

  • Gerald发现他的号码失效了,向T-Mobile提出要回他的415号码。
  • 猜测:T-Mobile操作员三哥Joe没有搞清楚情况,只听了415三个数字,就误以为Mei原来的号码(同样是415区号)就是Gerald claim的号码。
  • 三哥Joe自作主张将Mei的号码错误的转给了Gerald。
  • 三哥Joe语音留言Mei,告知该操作。
  • James联系了T-Mobile负责转号的部门,将早上的port out操作cancel。

 
 两个不靠谱的T-Mobile员工(James和Joe),联手制造了这起乌龙事件。不同的是,James是由于粗心(可能忘了删除第一天的测试号码,第二天误以为就是我的号码),但是Joe,根本没有核对对方claim的号码,就自作主张将Mei的号码转出,这也太缺乏责任心了吧!😡
 
那么问题来了——Gerald有没有拿回他的那个号码呢?🤪