作者归档:Daniel Sun

上海迪士尼园区BGM背景音乐原声音轨|巡游cue10,是刻在DNA里的旋律了!

很长时间没有再去上海迪士尼了,最近在油管(来源:DLP Welcome Music)上发现了这一宝贵资源。包含了你在园区商店/街边音响等一些地方最常听到的背景音乐(BGM)。这个视频下面的评论很少,难道还没有很多人发现么?

下面是播放列表,尤其是第一首简直太耳熟了。

01. Be Our Guest
02. Let’s Go Fly a Kite – 3:22​
03. Carnival of the Animals – 6:17​
04. So this is Love – 8:45​
05. I’le Got No Strings – 10:43​
06. Something There – 13:35​
07. Chim Chim Cher-ee – 16:25​
08. I’ve Got a Dream – 18:50​
09. Almost There – 22:02​
10. Treasure Cove Medley – 24:37​
11. Adventure Isle Medley – 37:04​
12. Volcanoes – 29:30​
13. For the First Time in Forever – 44:06​
14. You Can Fly! You Can Fly! You Can Fly! – 47:46​
15. Beauty and the Beast – 50:48​
16. You’ve Got a Friend in Me – 53:43

如果你没有梯子访问油管,这里提供一个已经转换好的mp3下载链接(仅供学习试听参考)

https://mydansun.lanzoui.com/i4Wg8lt14za

其实,在上海迪士尼,还有一个特别的bgm就是巡游cue10,在夏日狂欢的巡游时使用的。这个背景音乐以前在网易云是刘泉铨_MrQ发布过的原版音乐,现在网易云上已经没有了。刘老师在网易云上之前还有关于此歌曲的动态,现在也是查无此歌了。

经过千辛万苦的搜寻,终于收集到了这首歌的刘老师之前发布过的原始版本(非外部录音,非现场视频转录)在这里分享给大家:

https://mydansun.lanzoui.com/iHhdJmo65mj

博主这里该是上面这首歌的全网唯一资源了(大概吧

ngrok1.x 静态编译服务端/客户端amd64/macos/openwrt下载

最近搭建反代需要使用ngrok反向代理,查了很多地方都需要手动编译, 并且repo中的代码已经存在一些问题,直接编译有困难。这里提供静态编译好的版本,不需要额外依赖,平台对应代码即可运行。经过测试,ngrok性能比frp要强很多。

如果使用动态编译的版本,在缺少对应动态链接库的情况下会报下面的错误。

No such file or directory

amd64服务端(动态编译)

ngrokd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, stripped

https://drive.google.com/file/d/1Ihbmb5ZLuNjjEBJpG1rG-7G0uTarf6Re/view?usp=sharing

链接: https://pan.baidu.com/s/10FgUEmnhWau08z–p1Pw5A 提取码: rp29

amd64服务端(静态编译,推荐)

ngrokd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped

https://drive.google.com/file/d/1GUWa5DUuGzk-ZohGnHDEnuz1jozfFJwA/view?usp=sharing

链接: https://pan.baidu.com/s/1rm0SSyyPT5n8kOgzh_gzfA 提取码: 9u3m

amd64客户端(动态编译)

ngrok: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped

https://drive.google.com/file/d/18ft5G-xUGoCXs3mhFpLUjklgpG2i0UIL/view?usp=sharing

链接: https://pan.baidu.com/s/1rEQ-1ZWBzlBjD267bgemCw 提取码: h3kf

amd64客户端(静态编译,推荐)

ngrok: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped

可以放在软路由,Openwrt-amd64上

https://drive.google.com/file/d/1D6vcpDif8MPm3bG7UAt1lCDHNvozJn6n/view?usp=sharing

链接: https://pan.baidu.com/s/1yGP-c9VP7A-9ieAckG881Q 提取码: 54cg

macOS-x64客户端

ngrok: Mach-O 64-bit executable x86_64

https://drive.google.com/file/d/10IBGQIcoRLx_4LaoEigVGQISuoJXnLJH/view?usp=sharing

链接: https://pan.baidu.com/s/1KrolVlEy0CdiwSAmkb9ARA 提取码: puxh

Laravel查询在死锁发生时返回空集合

想象一下,您有两个进程同时执行以下PHP代码,将显示什么结果?

\DB::transaction(function (){
   dump(User::where('id',1)->lockForUpdate()->first());
});

令人惊讶的是,一个进程打印正常的查询结果,而另一个进程打印一个空集合(数组)。 返回空集合的代码并未按照我们想的那样触发死锁异常!然而,如果您查阅了transaction方法的源代码,则会发现在发现死锁之后,该方法会自动重试事务。 而且当死锁的数量达到设定值时,最终死锁将被作为异常抛出。 但是,当前这个实际发生死锁的查询看起来却很正常,因为它返回了一个空集合!

这个意外返回的空数组和未抛出的死锁异常实际上是一个古老且棘手的PHP-PDO bug。 在7.4.13发布之前,它已经广泛存在于许多PHP版本中。 有许多与此相关的讨论,例如:

  1. https://bugs.php.net/bug.php?id=76742
  2. https://github.com/php/php-src/pull/5937
  3. https://github.com/php/php-src/pull/6203
  4. https://github.com/php/php-src/commit/b03776adb5bbb9b54731a44377632fcc94a59d2f

在PHP7.4.13之前,你几乎没有办法直接检测到此错误。 切勿尝试打开PDO :: ATTR_EMULATE_PREPARES来解决此问题! 因为此选项将使您所有的PDO查询结果都变成字符串,数据类型的丢失将会导致更严重的后果。

因此,唯一可行的方法是手动编译已修复的PHP源代码,或安装新的预编译版本的PHP7.4.13。

转载:OPENWRT 使用iptables屏蔽p2p下载

编辑/etc/firewall.user,加入以下代码:

# Log会drop的包

iptables -N LOGDROP > /dev/null 2> /dev/null
iptables -F LOGDROP
iptables -A LOGDROP -j LOG --log-prefix "LOGDROP "
iptables -A LOGDROP -j DROP

# 屏蔽种子下载的关键词

iptables -I FORWARD -m string --algo bm --string "BitTorrent" -j LOGDROP
iptables -I FORWARD -m string --algo bm --string "BitTorrent protocol" -j LOGDROP
iptables -I FORWARD -m string --algo bm --string "peer_id=" -j LOGDROP
iptables -I FORWARD -m string --algo bm --string ".torrent" -j LOGDROP
iptables -I FORWARD -m string --algo bm --string "announce.php?passkey=" -j LOGDROP
iptables -I FORWARD -m string --algo bm --string "torrent" -j LOGDROP
iptables -I FORWARD -m string --algo bm --string "announce" -j LOGDROP
iptables -I FORWARD -m string --algo bm --string "info_hash" -j LOGDROP

# 屏蔽DHT网络
iptables -I FORWARD -m string --string "get_peers" --algo bm -j LOGDROP
iptables -I FORWARD -m string --string "announce_peer" --algo bm -j LOGDROP
iptables -I FORWARD -m string --string "find_node" --algo bm -j LOGDROP


# 网上找到貌似上面就够了,但是目测p2p已深入ipv6,所以可以再屏蔽一下ipv6,操作都是一样的

ip6tables -N LOGDROP > /dev/null 2> /dev/null
ip6tables -F LOGDROP
ip6tables -A LOGDROP -j LOG --log-prefix "LOGDROP "
ip6tables -A LOGDROP -j DROP
ip6tables -I FORWARD -m string --algo bm --string "BitTorrent" -j LOGDROP
ip6tables -I FORWARD -m string --algo bm --string "BitTorrent protocol" -j LOGDROP
ip6tables -I FORWARD -m string --algo bm --string "peer_id=" -j LOGDROP
ip6tables -I FORWARD -m string --algo bm --string ".torrent" -j LOGDROP
ip6tables -I FORWARD -m string --algo bm --string "announce.php?passkey=" -j LOGDROP
ip6tables -I FORWARD -m string --algo bm --string "torrent" -j LOGDROP
ip6tables -I FORWARD -m string --algo bm --string "announce" -j LOGDROP
ip6tables -I FORWARD -m string --algo bm --string "info_hash" -j LOGDROP
ip6tables -I FORWARD -m string --string "get_peers" --algo bm -j LOGDROP
ip6tables -I FORWARD -m string --string "announce_peer" --algo bm -j LOGDROP
ip6tables -I FORWARD -m string --string "find_node" --algo bm -j LOGDROP

保存之后,执行:

/etc/init.d/firewall restart

即生效。

文章转载来源:https://xintun.lofter.com/post/1dcd13e8_c8fb947

解决vue-echarts的dataZoom在更新后丢失已选位置的问题 | How to solve dataZoom of vue-echarts loses the selected position after updating options

vue-echarts在启用了dataZoom后如果options被更新,dataZoom的start和from会被重置。解决这个问题可以采用下面的方法。

假设你之前是这么配置组件的

<e-charts
  :options="options"
  v-if="options"
  class="chart"
  autoresize
></e-charts>

首先,在组件上监听dataZoom事件

<e-charts
  :options="options"
  class="chart"
  @datazoom="dataZoom"
  autoresize
></e-charts>

在data中添加zoomStart和zoomEnd

dataZoom(action) {
  if (
    "batch" in action &&
    Array.isArray(action.batch) &&
    action.batch.length > 0
  ) {
    this.zoomStart = action.batch[0].start;
    this.zoomEnd = action.batch[0].end;
  } else if ("start" in action && "end" in action) {
    this.zoomStart = action.start;
    this.zoomEnd = action.end;
  }
}

dataZoom事件有两种触发方式,第一个if分支将在使用滚轮时触发,第二个分支将在拖动手柄时触发。

在data中添加realOptions。然后,在watch下面监听options的变化,将zoomStart和zoomEnd重新赋值。

options(newValue) {
  if (newValue) {
    for (let i = 0; i < newValue.dataZoom.length; i++) {
      newValue.dataZoom[i].start = this.zoomStart;
      newValue.dataZoom[i].end = this.zoomEnd;
    }
    this.realOptions = newValue;
  }
}

最后,修改组件的属性

<e-charts
  :options="realOptions"
  v-if="realOptions"
  class="chart"
  @datazoom="dataZoom"
  autoresize
></e-charts>

 


If the options are updated after dataZoom has enabled in vue-echarts, the start and from of dataZoom will be reset. The following methods can be used to solve this problem.

Suppose your component looks like this

<e-charts
  :options="options"
  v-if="options"
  class="chart"
  autoresize
></e-charts>

First, listen to the dataZoom event on the component

<e-charts
  :options="options"
  class="chart"
  @datazoom="dataZoom"
  autoresize
></e-charts>

Create zoomStart and zoomEnd fields to data.

dataZoom(action) {
  if (
    "batch" in action &&
    Array.isArray(action.batch) &&
    action.batch.length > 0
  ) {
    this.zoomStart = action.batch[0].start;
    this.zoomEnd = action.batch[0].end;
  } else if ("start" in action && "end" in action) {
    this.zoomStart = action.start;
    this.zoomEnd = action.end;
  }
}

There are two ways to trigger the dataZoom event. The first if branch will be triggered when the scroll wheel is used, and the second branch will be triggered when the handle is dragged.

Create a realOptions field to data. Then, watch the changes of options and assign zoomStart and zoomEnd.

options(newValue) {
  if (newValue) {
    for (let i = 0; i < newValue.dataZoom.length; i++) {
      newValue.dataZoom[i].start = this.zoomStart;
      newValue.dataZoom[i].end = this.zoomEnd;
    }
    this.realOptions = newValue;
  }
}

Finally, modify the properties of your component

<e-charts
  :options="realOptions"
  v-if="realOptions"
  class="chart"
  @datazoom="dataZoom"
  autoresize
></e-charts>

 

Compile HATP planner under Ubuntu 16 | Ubuntu 16 编译 HATP

Recently, my project needs the HATP planner. Compiling under Ubuntu 16 encountered the following problems. Here I wrote down some solutions.

Error: Could not find Antlr

This problem is caused by not installing Antlr2.7.7, so we need compile and install Antlr.

First, download the source package from https://www.antlr2.org/download/antlr-2.7.7.tar.gz

You may meet the following problem during compiling, caused by CharScanner.cpp

make[3]: Entering directory '/home/mydansun/antlr-2.7.7/lib/cpp/src'
*** compiling /home/mydansun/antlr-2.7.7/lib/cpp/src/../../../lib/cpp/src/CharScanner.cpp
In file included from /home/mydansun/antlr-2.7.7/lib/cpp/src/../../../lib/cpp/src/CharScanner.cpp:10:0:
/home/mydansun/antlr-2.7.7/scripts/../lib/cpp/antlr/CharScanner.hpp:474:30: error: ‘EOF’ was not declared in this scope
  static const int EOF_CHAR = EOF;
                              ^
/home/mydansun/antlr-2.7.7/scripts/../lib/cpp/antlr/CharScanner.hpp: In member function ‘bool antlr::CharScannerLiteralsLess::operator()(const string&, const string&) const’:
/home/mydansun/antlr-2.7.7/scripts/../lib/cpp/antlr/CharScanner.hpp:565:41: error: ‘strcasecmp’ was not declared in this scope
   return (strcasecmp(x.c_str(),y.c_str())<0);

The solution is to modify the CharScanner.hpp file manually, add the following code at the beginning.

#include <stdio.h>
#include <strings.h>

The above modification refers to the following two posts

  1. https://stackoverflow.com/questions/4577453/fcgio-cpp50-error-eof-was-not-declared-in-this-scope
  2. https://stackoverflow.com/questions/7248509/strcasecmp-was-not-declared-in-this-scope

After the compilation and installation, when I tried to execute the antlr command, I got this error: Could not find or load main class antlr.Tool

Then I found that there is no antlr.jar file in the /usr/local/lib directory, just copy this file (in the source code directory) to /usr/local/lib.

Important: When compiling HATP later, please use the following command to declare the executable path of Antlr. Otherwise, you may get this error: Unable to find Antlr executable!

catkin_make -DAntlr_BIN=/usr/local/bin/antlr

Error: No rule to make target /usr/lib/libantlr.a

Execute the following command.

sudo ln -s /usr/local/lib/libantlr.a /usr/lib/libantlr.a

Error: toaster_msgs/GetInfoDB.h: No such file or directory

This is because toaster is not installed, please visit the following link

https://github.com/laas/toaster/wiki/Installation

Toaster.git can be cloned into the same workspace as HATP and compile together.

Error: No rule to make target ‘/lib/libtoaster.so’

Execute the following command.

sudo ln -s /usr/local/lib/libtoaster.so /lib/libtoaster.so

最近项目需要HATP规划器,在Ubuntu 16下编译遇到了下面的问题,这里记录一下解决方案。

错误:Could not find Antlr

这个问题是没有安装Antlr2.7.7导致的,我们先编译安装Antlr

首先,下载源码包https://www.antlr2.org/download/antlr-2.7.7.tar.gz

在编译过程中遇到下面的问题,CharScanner.cpp编译失败

make[3]: Entering directory '/home/mydansun/antlr-2.7.7/lib/cpp/src'
*** compiling /home/mydansun/antlr-2.7.7/lib/cpp/src/../../../lib/cpp/src/CharScanner.cpp
In file included from /home/mydansun/antlr-2.7.7/lib/cpp/src/../../../lib/cpp/src/CharScanner.cpp:10:0:
/home/mydansun/antlr-2.7.7/scripts/../lib/cpp/antlr/CharScanner.hpp:474:30: error: ‘EOF’ was not declared in this scope
  static const int EOF_CHAR = EOF;
                              ^
/home/mydansun/antlr-2.7.7/scripts/../lib/cpp/antlr/CharScanner.hpp: In member function ‘bool antlr::CharScannerLiteralsLess::operator()(const string&, const string&) const’:
/home/mydansun/antlr-2.7.7/scripts/../lib/cpp/antlr/CharScanner.hpp:565:41: error: ‘strcasecmp’ was not declared in this scope
   return (strcasecmp(x.c_str(),y.c_str())<0);

解决方案就是手动修改CharScanner.hpp 文件,在开头加上下面的代码

#include <stdio.h>
#include <strings.h>

上面的修改参考了下面两篇文章

  1. https://stackoverflow.com/questions/4577453/fcgio-cpp50-error-eof-was-not-declared-in-this-scope
  2. https://stackoverflow.com/questions/7248509/strcasecmp-was-not-declared-in-this-scope

编译安装结束后,尝试执行antlr 命令,却提示Error: Could not find or load main class antlr.Tool

然后发现在/usr/local/lib 目录里没有antlr.jar 文件,将源码目录中的同名文件拷贝到该目录即可。

非常重要:后面编译HATP的时候,请使用下面的命令执行Antlr的可执行文件路径。否则会出现Unable to find Antlr executable!的问题

catkin_make -DAntlr_BIN=/usr/local/bin/antlr

错误:No rule to make target /usr/lib/libantlr.a

执行下面的命令

sudo ln -s /usr/local/lib/libantlr.a /usr/lib/libantlr.a

错误:toaster_msgs/GetInfoDB.h: No such file or directory

这是因为没有安装toaster导致的,参考下面的链接https://github.com/laas/toaster/wiki/Installation

其中toaster.git可以克隆到和HATP相同的workspace,一起编译即可。

错误:No rule to make target ‘/lib/libtoaster.so’

执行下面的命令

sudo ln -s /usr/local/lib/libtoaster.so /lib/libtoaster.so

Ubuntu16 and ROS Kinetic安装ROSPlan | Install ROSPlan with Ubuntu16 and ROS Kinetic

该文章首次编写于2020年1月24日,在该时间点后可能会有新的改变导致安装失败,如果有问题请查看官方文档的更新或给我评论。

我假设你已经安装了ROS核心组件

首先,安装依赖

sudo apt install flex bison freeglut3-dev libbdd-dev python-catkin-tools ros-$ROS_DISTRO-navigation ros-$ROS_DISTRO-tf2-bullet
sudo apt-get install python-pymongo mongodb scons

然后创建一个存放ROSPlan包的工作空间,我假设你使用~/ros_playground .

打开这个工作空间的src目录,克隆所需要的文件

cd ~/ros_playground/src
git clone https://github.com/KCL-Planning/ROSPlan.git
git clone https://github.com/KCL-Planning/rosplan_demos.git
git clone https://github.com/clearpathrobotics/occupancy_grid_utils.git
git clone -b kinetic-devel https://github.com/strands-project/mongodb_store.git

 

然后,返回上一级目录,编译

cd ../
catkin_make

 

使用下面的命令为数据库创建一个文件夹,否则你后面会遇到类似下面的错误

Can’t find database at supplied path ~/ros_playground/src/ROSPlan/rosplan_knowledge_base/common/mongoDB/. If this is a new DB, create it as an empty directory

mkdir -p ~/ros_playground/src/ROSPlan/rosplan_knowledge_base/common/mongoDB/

 

现在,你可以返回官网继续教程了,在启动tutorial_01.launc 之前别忘了运行roscore


This article is written on 24 Jan 2020. Some materials may be expired after that time, please check the latest related documents.

Install the following dependencies.

sudo apt install flex bison freeglut3-dev libbdd-dev python-catkin-tools ros-$ROS_DISTRO-navigation ros-$ROS_DISTRO-tf2-bullet
sudo apt-get install python-pymongo mongodb scons

 

Select or create a workspace for the ROSPlan package. I assume you are using ~/ros_playground .

Go to the source folder of your workspace and clone all the necessary packages by using Git.

cd ~/ros_playground/src
git clone https://github.com/KCL-Planning/ROSPlan.git
git clone https://github.com/KCL-Planning/rosplan_demos.git
git clone https://github.com/clearpathrobotics/occupancy_grid_utils.git
git clone -b kinetic-devel https://github.com/strands-project/mongodb_store.git

 

Go to the parent directory and compile these packages

cd ../
catkin_make

 

Create an empty directory for the new database or you will get an error such like Can’t find database at supplied path ~/ros_playground/src/ROSPlan/rosplan_knowledge_base/common/mongoDB/. If this is a new DB, create it as an empty directory

mkdir -p ~/ros_playground/src/ROSPlan/rosplan_knowledge_base/common/mongoDB/

 

Now, you can try to back to the official tutorial. Please remind before you execute the tutorial_01.launch  you need to run a ROS master node at first. For example, try to execute

roscore