Notes of python interface to pythia, the event generator, on macOS

简介 Pythia是基于蒙特卡罗方法制作的Event Generator,最近的一个课题会需要使用到它。它是采用C++编写的,但却通过SWIG支持了Python的调用。其官方的指引写的略微模糊,下面我会以macOS系统+VSCODE编辑器为例,简单讲一下如何实现Python调用。 配置编译选项 我们需要在编译pythia的时候加入额外的选项,以获取python的支持,我们需要获得两个信息: python include path python-config --includes 返回值例如:/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 python path echo $(dirname $(which python))/ 返回值例如:/usr/bin/ 注意,这里最后的"/“是必须的,不然你等等在编译的时候会出错(作者用的直接是+号拼接字符串) compile 最后,在pythia的根目录,我们重新配置再进行编译,将以下命令行里的两个path替换为你上面自己获取到的两个path,最后编译完了记得查看以下log,是否存在error,例如: # 确保你在本地pythia的根目录 ./configure --with-python-include=/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 --with-python-bin=/usr/bin/ # 编译它! make 注:以上方案也适用于Linux,注意下如果你电脑里同时存在了python(2.7)和python3(3.7),例如在macOS里就是这样,则要选择其中一个版本进行编译。但要注意,作者默认是采用了"python"作为调用指令的(而不是python3,所以很不友好),若想使用python3,则要先将python3制作一个软链接为python,然后将–with-python-bin指向到这个软连接的位置。(我更建议大家直接使用python,无论是版本2.7还是版本3.7都是可以的) 智能补全与DEBUG auto-completion 在VSCODE里,我们是通过pylint来进行代码补全的。我们需要在~/.bashrc里增加两个环境变量,使用你喜欢的编辑器打开它,在最后增加以下内容(注:将"your_pythia_lib_path"替换为你的pythia目录下,lib文件夹的绝对路径,例如: $HOME/Code/clang/pythia8244/lib): # added by pythia, the event generator PREFIX_LIB="your_pythia_lib_path" export PYTHONPATH=$PYTHONPATH:$PREFIX_LIB export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:$PREFIX_LIB 最后在终端里重新加载~/.bashrc即可(所有开着的终端都需要,或者把所有终端重启),最后使用vscode打开pythia根目录,在example目录下存在文件:main01.py,尝试运行它并且测试以下智能补全是否可用。 source ~/.bashrc 一般而言到这里就可以了,如果依然不能够使用pylint的智能补全,不妨在~/.pylintrc里增加以下内容: [MASTER] init-hook='import sys; sys.path.append("your_pythia_lib_path")' debug 由于本身作者提供的python interface不是原生的python代码,所以给debug和变量监视带来了一些困难。在打好断点,进入debug以后,我们可以在debug console里使用dir(object)方法来查看所有object里提供的attribute和method,例如dir(pythia.event[0])等等。

May 8, 2020 · 1 min · Bruce Yip

浙江大学有线网和树莓派路由器(二)

简介 在设置完无线热点以后,其实在宿舍里wifi信道干扰严重,主要是体现在极高的丢包率(over 50%)和延迟上。如果你的设备刚好支持通过以太网(有线)连接的话,可以和我一样购买usb->rj45的有线网卡给树莓派进行扩展。 注意!这不是一个step-by-step的教程,而是作为系列一的补充启到抛砖引玉的作用,所以请不要copy-paste,也不要做全文件的替换! 网卡选择 我为rpi3选择了rtl8152芯片的usb有线网卡,它能够免驱在rasbian(debian10)下工作,非常方便。这里多说一句,对于rpi4以下机型请选择百兆usb网卡,因为受限于usb2.0的通道速度,千兆网卡根本发挥不出它的性能,并且会存在兼容性问题。如果是rpi4以上机型,通道改为了usb3.0那么可以选择rtl8153芯片(网上说也免驱,我没有测试)。 在购买得到有线网卡以后,接上以后可以通过lsusb来查看rasbian是否成功识别了它,以下是rtl8152芯片的样例输出: Bus 001 Device 006: ID 0bda:8152 Realtek Semiconductor Corp. RTL8152 Fast Ethernet Adapter 组网 方案设想 我购买了两个usb有线网卡,算上树莓派自身的无线和有线,那么总计有:eth0, eth1, eth2, wlan0,四个物理网卡。我组网设想的方案是将eth0作为wan口,然后搭建一个br0的网桥,将eth1, eth2, wlan0桥接在一起,为br0启用dhcp服务。最后,在完成浙大l2tp拨号后,通过iptables为ppp0设置nat(这一步其实在系列一里已经完成了)。 具体实现 首先更新软件包列表后安装依赖:bridge-util,我们要利用brctl建立网桥和管理br0中的interfaces(自己用apt安装即可)。 # 建立br0网桥 brctl addbr br0 有些不太一样的是,之前我们在/etc/dhcpcd.conf中是为wlan0设置了静态ip的,此时我们要将设备名改为br0,即: interface br0 static ip_address=192.168.11.1/24 其次是在/etc/dnsmasq.conf中,设备名也要修改为br0,即: interface=br0 dhcp-range=192.168.11.10,192.168.11.30,255.255.255.0,24h 最后,也要告诉hostapd使用br0网桥,即在/etc/hostapd/hostapd.conf中,要追加一行: bridge=br0 OK,所有配置文件修改完毕,这里我建议大家先重启树莓派以让所有配置生效。重启完毕后,使用ifconfig查看应该会看到多出了一个br0的interface(同时你应该还要看到你的usb网卡,就是eth1)。那么先根据系列一提供的脚本拨号,让pi能够上网(这时会多出一个ppp0的interface),接着我们就要开始进行网络桥接: brctl addif br0 eth1 # 若你没有第二张usb网卡,那么这行不要执行 brctl addif br0 eth2 至此,此时给你的设备接上网线,设备上设置dhcp自动获取ip地址,你就可以通过有线上网啦! 其他技术细节 开机自动组建网桥 每次手动都要组建网桥是非常麻烦的一件事,这部分我还在研究。难点主要是会牵扯网卡启动顺序,所以需要寻找一种合适的方案。此部分留空,后续我会更新。 参考资料 Differences between /etc/dhcpcd.conf and /etc/network/interfaces? Linux Advanced Routing & Traffic Control HOWTO

September 13, 2019 · 1 min · Bruce Yip

浙江大学有线网和树莓派路由器(一)

简介 虽然对于校园网不能要求太多,不过依然要吐槽一下浙江省的校园网,连我浙都不能够幸免。万幸的是,玉泉校区并没有采用电信的闪讯方案(啊啊啊!),而是采用了标准的l2tp代理服务,故我等linux用户得以救赎。其实作为国内最高学府之一,linux用户要是不能够上网那也太可笑了。 进入正题,本文并不是step-by-step的教程(所以不要看到命令行就copy/paste),所以也不会做多发行版兼容,但作为综述并旨在讲解一些整体细节和遇到的坑,可以帮你节省不少的时间。我会假设你拥有linux的系统基础,并以debian系为例讲解,大概率适用于macos用户(cheer up!) 在最后有线网络连接上以后,还会将树莓派(pi3b+)中的无线网卡改为AP模式,散出热点供多设备使用。 大家都有自己遇到的问题,如果Google后无解那么当然可以邮件给作者我,你可以在本站找到我的邮箱,只要你是ZJUer我会尽力帮助你。 有线连接 安装xl2tpd 首先更新软件包列表,仅想要连接有线的同学需要依赖:xl2tpd,其实这部分在信息网上能够找到linux的配置手册。需要注意,本文均略去了sudo,若出现权限问题大家酌情加上即可。 # 更新软件包列表 apt update # 安装xl3tpd apt install xl2tpd -y 这里着重说一下树莓派如何在有线网卡离线的情况下安装,我采用的方法是手机共享出热点后用pi3b+的内置无线网卡连接。若是低于此版本的pi,那么你只能采用离线依赖包手动安装了。无线配置方法有两种,如下: 使用raspi-config自带的network选项连接(推荐) 手动通过配置或者命令行来连接,注意iw是不能够连接wpa/psk2类型加密的无线网络的,所以我们要使用wpa_supplicant命令来连接到手机热点,你可以从google中搜索到配置如何写 编写配置文件 需要修改的配置文件比较多,内容就直接贴出了,不做说明,它们有: /etc/xl2tpd/xl2tpd.conf,主配置文件,仅在更改账户时需重新修改 /etc/ppp/options.xl2tpd.zju,模拟拨号的配置,基本一次配置后无需修改 /etc/ppp/chap-secrets,VPN拨号时用的账户密码,仅在更改账户或者密码时需修改 以下是主配置文件,位于/etc/xl2tpd/xl2tpd.conf。其中,USERNAME@TYPE是你的学号@类型,类型有a, c, d,分别对应10/30/50的套餐。 [lac ZJU_VPN] ; Example VPN LAC definition lns = 10.5.1.7 redial = yes ; * Redial if disconnected? redial timeout = 15 ; * Wait n seconds between redials max redials = 5 ; * Give up after n consecutive failures require pap = no ; * Require PAP auth....

September 10, 2019 · 2 min · Bruce Yip

如何优雅地让Python程序在后台运行

这篇短小的文章简单介绍了如何利用nohup将python脚本置于后台运行,即便你断开ssh连接也可以。另一方面也包含了如何利用I/O重定向保存日志文件、如何停止该后台程序等内容。 nohup and & nohup是linux的一个内置工具,能够使某条命令免疫挂起,并且将stdout保存到某个文件中。你还需要在末尾加上&符号,这是linux中的一种标准写法,意为:将这条命令置于后台运行。随后该进程可以简单地使用ps来看到。 # 后台运行,将stdout输出到nohup.out文件 nohup python scripts.py & output buffering 这是一个极容易遇到的坑!如果你细心观察,会发现如果python程序没有执行完毕(比如简单的http服务器开启监听),那么nohup.out文件中是一片空白的!WTF?怎么回事?这是python自己的标准输出机制,若想要关闭输出缓存则需要使用-u的flag,如下: # 关闭输出缓存,实时记录到nohup.out中 nohup python -u scripts.py & I/O重定向 现在我们希望将stdout记录到某个指定的文件中,而不只是nohup.out,该如何处理?如果你没有I/O重定向的相关知识,我推荐你首先阅读I/O Redirection。 # 将标准输出放到name.log中 nohup python -u scripts.py > name.log 2>&1 & 这里我做进一步的解释,首先它将stdout重定向到了name.log中,其次又将stderr重定向到了stdout中,最后置于后台运行。这样无论是标准输出还是错误输出,都会进入到name.log文件中。 查看并关闭后台进程 OK,在成功创建了后台任务以后,我们可以简单地使用ps和kill来管理这些进程(多说几句,再推荐两个内置工具:pgrep和pkill,大家自己去看man page)。但是在此我们谈一些稍微复杂点的情况,如果你是将上述的nohup命令写在了某份bash脚本中,自动化执行的话(非交互式地运行),你通过简单的ps命令是根本找不到它的! 这个时候我们就要在执行nohup的时候,将它的输出(也就是该进程的pid)保存到文件中,最后在想要关闭该进程的时候读取它。 # 将标准输出放到name.log中,并且记录该进程的pid到run.pid中 nohup python -u scripts.py > name.log 2>&1 & echo $! > run.pid 这里再做一些补充:首先是echo,因为之前的命令已经置于后台运行了,所以从echo开始已经算作是一条新命令了,故不需要任何的前缀。其次是echo中的$!,它代表上一条命令的执行进程ID,所以我们将这个pid直接写入到run.pid即可。 加载run.pid并向该进程发送terminate信号也很容易,如下,不再详细说明。 # 若存在run.pid文件,则加载它并杀掉该进程 [[ -f run.pid ]] && kill $(cat run.pid) 结束语 linux中将程序置于后台运行,虽然看起来繁复,但是其实它设计的很合理,学会了以后也的确是非常高效。在知道原理和一些I/O重定向基础后,现在我们可以将任何一个可执行程序放在后台运行,并用ps就可以管理它们。最后,希望本文能够给你带来一些收获和思考,以上。

August 21, 2019 · 1 min · Bruce Yip

linux常用工具和软件

引言 一直在Linux上工作,当更换新电脑或者发行版时,往往会忘记曾经在背后稳定默默工作着的“好家伙”们。我希望把这些好的开源项目工具都收录起来,甚至编写成一键安装脚本。我的系统是基于ArchLinux的,所以许多包会采用AUR的方式记录在此。我相信即便是其他发行版,你也能够找到相应的办法编译安装的。最后,这里也顺便推荐一下基于Arch的发行版Manjaro with XFCE,我非常喜欢它的高效和稳定。 系统工具 v2ray Project V,相当现代化的梯子,同时可以作为客户端和服务端,甚至是一个总的网络代理分发程序。服务端搭建详情可以参考博文博客系统构建(二):V2ray 。 Package: v2ray(Arch官方仓库带有此软件,可以直接使用pacman安装) Github: https://github.com/v2ray/v2ray-core motrix motrix,很漂亮的下载工具,底层是调用了aria2的。支持magnet和torrent。但是因为是基于electron制作的,编译稍显繁琐(又是npm,我的天),值得一提的是作者还给国内IP加入了NPM镜像加速功能。 AUR: https://aur.archlinux.org/motrix.git Github: https://github.com/agalwood/Motrix proxychains proxychains-ng,能够使某一行命令全部走http(或者socks)代理。相当取巧好用的玩意儿,配合下面的privoxy食用更加舒适。 Package: proxychains-ng Github: https://github.com/rofl0r/proxychains-ng privoxy privoxy,能将socks协议代理转换成http协议并监听。配合bash环境变量,这样做能让你在终端里挂起全局代理,十分推荐的东西。 Package: privoxy virtual box virtual box,当你需要运行一个windows虚拟机的时候(希望不会有这种时刻),你会需要用到它。它比vmware更加轻量稳定,记得若需要安装64位系统则需要在主板里打开处理器的虚拟化服务。 Package: virtualbox 编辑器 vim vim大法好,大法好,好!多的不说了,我日常的编辑工具。哦对了,你最好安装gvim因为这样能提供系统级的剪切板,重要! Package: gvim vscode Uh-huh,每次使用微软家的东西就让我很纠结。不喜欢使用vim的朋友,推荐给你们吧,号称宇宙第二的IDE(第一当然是VisualStudio,这玩意儿很贵并且只能运行在win上)。vscode开源免费,使用MIT许可。我只有在调试很复杂的程序的时候才会打开它。 Package: code AUR: https://aur.archlinux.org/visual-studio-code-bin.git Github: https://github.com/microsoft/vscode 国外主流服务 onedrive OneDrive Free Client,一个onedrive的命令行版。需要用你微软ID生成的KEY授权后使用,详见Github的项目主页。 AUR: https://aur.archlinux.org/onedrive-abraunegg.git Github: https://github....

July 4, 2019 · 1 min · Bruce Yip