Linux下查看文件编码,文件或文件名编码格式转换

Linux下查看文件编码,文件或文件名编码格式转换 http://blog.sina.com.cn/s/blog_6fe0d70d0101du41.html Vim 的多字符编码工作方式 Vim 启动,根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。 读取需要编辑的文件,根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。并设置 fileencoding 为探测到的,看起来是正确的 (注1) 字符编码方式。 对比 fileencoding 和 encoding 的值,若不同则调用 iconv 将文件内容转换为encoding 所描述的字符编码方式,并且把转换后的内容放到为此文件开辟的 buffer 里,此时我们就可以开始编辑这个文件了。注意,完成这一步动作需要调用外部的 iconv.dll(注2),你需要保证这个文件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的目录里。 编辑完成后保存文件时,再次对比 fileencoding 和 encoding 的值。若不同,再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式,并保存到指定的文件中。同样,这需要调用 iconv.dll由于 Unicode 能够包含几乎所有的语言的字符,而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式 (空间消耗比 UCS-2 小),因此建议 encoding 的值设置为utf-8。这么做的另一个理由是 encoding 设置为 utf-8 时,Vim 自动探测文件的编码方式会更准确 (或许这个理由才是主要的 。我们在中文 Windows 里编辑的文件,为了兼顾与其他软件的兼容性,文件编码还是设置为 GB2312/GBK 比较合适,因此 fileencoding 建议设置为 chinese (chinese 是个别名,在 Unix 里表示 gb2312,在 Windows 里表示cp936,也就是 GBK 的代码页)。 chinese-gb to utf8 ...

2015-05-04 · 2 min · 276 words · -

respberry pi error

respberry pi error omxplayer.bin: SubtitleRenderer.cpp:154: SubtitleRenderer::load_glyph(SubtitleRenderer::InternalChar)::<lambda(FT_Face, VGFont, bool)>: Assertion `!vgGetError()’ failed. /usr/bin/omxplayer: line 67: 5199 Aborted LD_LIBRARY_PATH="$OMXPLAYER_LIBS${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" $OMXPLAYER_BIN “$@” run raspi-config and up the gpu mem to 128 https://www.raspberrypi.org/forums/viewtopic.php?f=35&t=19979&start=25

2015-05-04 · 1 min · 29 words · -

linux emacs 乱码

linux emacs 乱码 其实就是编码字符不是utf-8的问题导致。什么年代了,这么多软件也不往通用标准靠,非要使用所谓的中文编码。射手网下载的东西几乎都是这个毛病。 在Ubuntu下用Emacs打开的时候看到的也是乱码,不过好解决,在~/.emacs.d/init.el文件中添加一行设置: (set-language-environment “Chinese-GB”) 重新启动Emacs,打开文件,中文正确显示了。 如果只是想临时用一下,运行命令: M-x set-language-environment 然后输入Chinese-GB,最后刷新缓冲区即可。 alt + x revert-buffer http://stackoverflow.com/questions/10500323/how-to-see-the-files-encoding-in-emacs

2015-05-04 · 1 min · 17 words · -

systemd, systemctl basic, command

systemd, systemctl basic, command Systemd 是 Linux 系统中最新的初始化系统 (init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度 –now # enable and start service0 systemctl --now enable service0 Systemd 特性 系统引导时实现服务并行启动 按需启动守护进程 自动化的服务依赖关系管理 同时采用socket式与D-Bus总线式激活服务 系统状态快照 # 查看配置文件位置 systemctl status service0 # 修改配置之后重新加载配置文件 systemctl daemon-reload 配置文件主要放在 /usr/lib/systemd/system 目录, 也可能在/etc/systemd/system 目录 /lib/systemd/system:系统默认的单元文件 /etc/systemd/system:用户安装的软件的单元文件 /usr/lib/systemd/system:用户自己定义的单元文件 systemd-analyze 查看启动耗时 systemd-analyze # 查看每个服务的启动耗时 systemd-analyze blame # 显示瀑布状的启动过程流 # 打印严重消耗时间的服务树状表,按照启动消耗的时间进行排序,时间消耗越多,越排到前面。 @之后是服务激活或者启动的时间, +号之后是服务启动消耗的时间。 个人理解 @ 是从系统引导到服务启动起来的时间,是一个相对时间消耗,+是服务启动消耗的时间,是一个绝对时间消耗。 systemd-analyze critical-chain # 显示指定服务的启动流 比如 docker.service systemd-analyze critical-chain docker.service systemd 版本/version systemctl --version # 生成一张启动详细信息矢量图, .svg可以用chrome打开 sudo systemd-analyze plot > /home/wiloon/tmp/boot3.svg timedatectl # 查看当前时区设置 $ timedatectl # 显示所有可用的时区 $ timedatectl list-timezones # 设置当前时区 $ sudo timedatectl set-timezone America/New_York $ sudo timedatectl set-time YYYY-MM-DD $ sudo timedatectl set-time HH:MM:SS ## timedatectl ntp timedatectl set-ntp true loginctl # 列出当前session loginctl list-sessions # 列出当前登录用户 loginctl list-users # 列出显示指定用户的信息 loginctl show-user wiloon ## 查看 session 类型, 是 X server 还是 wayland, x or wayland loginctl show-session <SESSION_ID> -p Type cat systemctl cat bluetooth|grep Condition mask systemctl mask service0 systemctl unmask service0 check the boot performance systemd-analyze blame systemctl list-timers --all # 查看是否启用 systemctl is-enabled service0 # to see which units have failed. systemctl --failed # 退出系统并关闭电源 systemctl poweroff systemctl reboot # CPU 停止工作 $ sudo systemctl halt # 待机 systemctl suspend systemctl hibernate # 混合休眠模式 (同时休眠到硬盘并待机) : systemctl hybrid-sleep # list all service systemctl systemctl list-unit-files | grep enabled # 查看所有单元 $ systemctl list-unit-files # 查看所有 Service 单元 $ systemctl list-unit-files --type service # 查看所有 Timer 单元 $ systemctl list-unit-files --type timer 显示所有已启动的服务 systemctl list-units --type=service systemctl is-active httpd.service (仅显示是否 Active) # check service enabled systemctl list-unit-files |grep enabled # 查看服务是否开机启动 systemctl is-enabled foo.service # 禁止 foo.service 开机启动 systemctl disable foo.service # 禁止 foo.service 开机启动, 同时停掉服务 systemctl --now disable foo.service journalctl -f systemd-analyze blame systemctl --type=service systemctl status xxx systemctl status Loaded行: 配置文件的位置,是否设为开机启动 Active行: 表示正在运行 Main PID行: 主进程ID Status行: 由应用本身 (这里是 httpd ) 提供的软件当前状态 CGroup块: 应用的所有子进程 日志块: 应用的日志 # 打印完整的控制台日志, 不加 -l 的话, 默认会截断. systemctl status service0 -l http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html ...

2015-05-04 · 4 min · 665 words · -

debian command

debian command # list installed package dpkg --list # remove package apt-get remove foo # ping, command not found apt-get install inetutils-ping dpkg-reconfigure tzdata

2015-05-03 · 1 min · 24 words · -

chkdsk

chkdsk chkdsk磁盘修复工具怎么用? 可以通过以下方法打开: 单击"开始",点击"运行",输入cmd并回车打开命令提示符窗口; 在此窗口输入以下命令: 例如检查并修复D分区: chkdsk D: /f 回车就会启动chkdsk磁盘检查工具扫描D分区了,检查其他分区类似。 详细的参数说明如下: CHKDSK [volume[[path]filename]]] [/F] [/V] [/R] [/X] [/I] [/C] [/L[:size]] volume 指定驱动器(后面跟一个冒号)、装入点 或卷名。 filename 仅用于 FAT/FAT32: 指定要检查是否有碎片的文件。 /F 修复磁盘上的错误。 /V 在 FAT/FAT32 上: 显示磁盘上每个文件的完整路径和名称。 在 NTFS 上: 如果有清除消息,将其显示。 /R 查找不正确的扇区并恢复可读信息(隐含 /F)。 /L:size 仅用于 NTFS: 将日志文件大小改成指定的 KB 数。 如果没有指定大小,则显示当前的大小。 /X 如果必要,强制卷先卸下。 卷的所有打开的句柄就会无效(隐含 /F)。 /I 仅用于 NTFS: 对索引项进行强度较小的检查。 /C 仅用于 NTFS: 跳过文件夹结构的循环检查。 /I 和 /C 命令行开关跳过卷的某些检查,减少运行 Chkdsk 所需的时间。 怎样运行chkdsk工具修复?【案例实操分享】 电脑右下角出现损坏文件。请运行chkdsk修复工具提示,该如何解决呢? 病例如图: 解决方案: ...

2015-05-03 · 1 min · 123 words · -

Arch Linux 自动连接可用无线网络

Arch Linux 自动连接可用无线网络 本文来自依云’s Blog,转载请注明。 Arch Linux 连接网络可以使用其官方开发的 netctl 系列命令行工具。要想在开机 (以及从挂起/休眠状态唤醒) 时自动连接到可用的无线网络,以下是设置步骤。 首先,你得告诉 Arch Linux 你知道哪些无线热点。Arch Linux 不会自动帮你破解别人的 Wi-Fi 密码的。就算 Wi-Fi 热点没有加密,你不说 Arch Linux 怎么知道它应当连接到那个热点呢,也许那是个钓鱼用的热点也说不定哦。 cd 到 /etc/netctl 目录下,可以看到 examples 目录下有一堆示例配置。复制你所需要的配置文件到上一层目录 (/etc/netctl) 。比如绝大多数 Wi-Fi 热点使用的是 WPA 加密,那就复制 examples/wireless-wpa 文件。目标文件名比较随意,起个方便自己的名字就行,比如 work、home 之类的。复制完成之后记得 chmod 600 禁止非 root 用户访问,因为配置文件里会包含你的 Wi-Fi 热点密码。 然后编辑配置文件,修改 ESSID 和 Key 为你的 Wi-Fi 热点 ID 和密码就可以了。之所以要先更改权限再编辑,是因为某些编辑器 (如 Vim) 会生成同权限的备份文件;那里有可能也会包含密码。可以放多份配置文件在这里,netctl-auto 默认会去找一个可用的连接。有多个可用的时候不太清楚它会连上哪一个,可以使用更复杂的配置文件来指定优先级 (参见 examples/wireless-wpa-configsection 示例配置) 。 配置文件写好之后,当然是启动相应的服务啦。Arch Linux 一贯的传统是不启动不必要的服务,除非用户说要启动之。netctl-auto 的 systemd 服务名是 netctl-auto@interface.service (当然 .service 后缀还是可以省略的) 。interface 部分写你的无线网络接口的名字,可以通过 ip link、ifconfig、iwconfig 等命令看到。我禁用了 systemd 的可预测网络接口名称,所以我的无线网络接口名唤 wlan0。我使用如下命令启动服务: ...

2015-05-02 · 1 min · 175 words · -

Linux /etc/init.d /etc/rc.local

Linux /etc/init.d /etc/rc.local http://blog.csdn.net/acs713/article/details/7322082 本文英语版本来自: http://www.ghacks.net/2009/04/04/get-to-know-linux-the-etcinitd-directory/ 以下内容是作者自己的翻译版本,如需转载到CSDN外其他网站,请注明本文链接。 一、关于/etc/init.d 如果你使用过linux系统,那么你一定听说过init.d目录。这个目录到底是干嘛的呢?它归根结底只做了一件事情,但这件事情非同小可,是为整个系统做的,因此它非常重要。init.d目录包含许多系统各种服务的启动和停止脚本。它控制着所有从acpid到x11-common的各种事务。当然,init.d远远没有这么简单。 (译者注: acpid 是linux操作系统新型电源管理标准 ;X11也叫做X Window系统,X Window系统 (X11或X)是一种位图显示的 视窗系统 。它是在 Unix 和 类Unix 操作系统 ,以及 OpenVMS 上建立图形用户界面 的标准工具包和协议,并可用于几乎已有的现代操作系统) 。 当你查看/etc目录时,你会发现许多rc#.d 形式存在的目录 (这里#代表一个指定的初始化级别,范围是0~6) 。在这些目录之下,包含了许多对进程进行控制的脚本。这些脚本要么以"K"开头,要么以"S"开头。以K开头的脚本运行在以S开头的脚本之前。这些脚本放置的地方,将决定这些脚本什么时候开始运行。在这些目录之间,系统服务一起合作,就像运行状况良好的机器一样。然而,有时候你希望能在不使用kill 或killall 命令的情况下,能干净的启动或杀死一个进程。这就是/etc/init.d能够派上用场的地方了! 如果你在使用Fedora系统,你可以找到这个目录: /etc/rc.d/init.d。实际上无论init.d放在什么地方,它都发挥着相同的作用。 为了能够使用init.d目录下的脚本,你需要有root权限或sudo权限。每个脚本都将被作为一个命令运行,该命令的结构大致如下所示: /etc/init.d/command 选项 comand是实际运行的命令,选项可以有如下几种: start stop reload restart force-reload 大多数的情况下,你会使用start,stop,restart选项。例如,如果你想关闭网络,你可以使用如下形式的命令: /etc/init.d/networking stop 又比如,你改变了网络设置,并且需要重启网络。你可以使用如下命令: /etc/init.d/networking restart init.d目录下常用初始化脚本有: networking samba apache2 ftpd sshd dovecot MySQL 当然,你可能有其他更多常用的脚本,这个取决于你安装了什么linux操作系统。 二、关于/etc/rc.local rc.local也是我经常使用的一个脚本。该脚本是在系统初始化级别脚本运行之后再执行的,因此可以安全地在里面添加你想在系统启动之后执行的脚本。常见的情况是你可以再里面添加nfs挂载/mount脚本。此外,你也可以在里面添加一些调试用的脚本命令。例如,我就碰到过这种情况: samba服务总是无法正常运行,而检查发现,samba是在系统启动过程中就该启动执行的,也就是说,samba守护程序配置保证了这种功能本应该正确执行。碰到这种类似情况,一般我也懒得花大量时间去查为什么,我只需要简单的在/etc/rc.local脚本里加上这么一行: /etc/init.d/samba start 这样就成功的解决了samba服务异常的问题。 三、总结 Linux是灵活的。正因为它的灵活性,我们总是可以找到许多不同的办法来解决同一个问题。启动系统服务的例子就是一个很好的佐证。有了/etc/init.d目录下的脚本,再加上/etc/rc.local这个利器,你可以放心的确保你的服务可以完美的启动和运行。

2015-05-02 · 1 min · 67 words · -

C大調D大調F大調G大調

C大調D大調F大調G大調 http://tw.everyonepiano.com/Article-103-C%E5%A4%A7%E8%AA%BFD%E5%A4%A7%E8%AA%BFF%E5%A4%A7%E8%AA%BFG%E5%A4%A7%E8%AA%BF%E6%98%AF%E4%BB%80%E9%BA%BD%E6%84%8F%E6%80%9D%EF%BC%9F.html 浏览次数: 1722 次 主音不同。 “C"表示調式一級音的音位,“大調"則表示它的性質。 系統地說: 簡單的說C大調中的C是指這個調式中的穩定因爲C,然後將C當作1 (大調中的一級音) ,構成音階1234567,這就是C大調的調式音階,在C大調的音樂中,樂曲是以那7個音位基本音級而構成的。 c小調,同樣的調式中的穩定因爲c,然後把c當作6 (小調中的一級音) ,構成音階6712345,在c小調的音樂中,樂曲是以那7個音位基本音級而構成的。 大調的色彩明亮,堅定,小調的色彩,柔和,暗淡。 以上說的只是自然大調和自然小調,這兩種是比較常見的。 和聲大調,6 (六級音) 要降低半音,旋律大調,但旋律位下行時6,7 (六,七級音) 都要見的半音。 和聲小調,5 (七級音) 要升高半音,旋律小調,4,5 (六七級音) 要升高半音。 自然大小調的特征: 一級音與三級音的大小: 大調中,一級音與三級音的關系是大三度,小調中,一級音與三級以的關系是小三度。 音階體現調式,調式規定音階。 這裏說的音階必須要和調式結合來,比如說: C自然大調: 1234567 a自然小調: 6712345 而我們通常所說的音階就是指C自然大調。 更多相關: 關于大小調: 簡單的說C大調中的C是指這個調式中的穩定因爲C,然後將C當作1 (大調中的一級音) ,,構成音階1234567,這就是C大調的調式音階,在C大調的音樂中,樂曲是以那7個音位基本音級而構成的。 c小調,同樣的調式中的穩定因爲c,然後把c當作6 (小調中的一級音) ,構成音階6712345,在c小調的音樂中,樂曲是以那7個音位基本音級而構成的。 大調的色彩明亮,堅定,小調的色彩,柔和,暗淡。 以上說的只是自然大調和自然小調,這兩種是比較常見的。 和聲大調,6 (六級音) 要降低半音,旋律大調,但旋律位下行時6,7 (六,七級音) 都要見的半音。 和聲小調,5 (七級音) 要升高半音,旋律小調,4,5 (六七級音) 要升高半音。 自然大小調的特征: 一級音與三級音的大小: 大調中,一級音與三級音的關系是大三度,小調中,一級音與三級以的關系是小三度。 大調式的音樂在曲中的時候通常會以1位結束音,比如《義勇軍進行曲》,所以的音階的I級是1。小調的的穩定音機6,所以小調歌曲通常結束在6音上,如《莫斯科郊外的晚上》。 如果還不明了,可以做個表 自然大調: do re mi fa sol la si do 自然小調: la si do re mi fa sol la ...

2015-05-02 · 1 min · 153 words · -

D大调

D大调 D大调是一个基于D(re)音的大调,英文为D major。由D、E、#F、G、A、B、#C和D组成,调号有两个升号。 相对小调是b小调,并行小调是d小调。

2015-05-02 · 1 min · 4 words · -

raspberry source list

raspberry source list vi /etc/apt/sources.list deb https://mirrors.aliyun.com/raspbian/raspbian stretch main contrib non-free rpi http://blog.csdn.net/loveaborn/article/details/12224841 https://www.raspbian.org/RaspbianMirrors https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/

2015-05-02 · 1 min · 15 words · -

NAS, RAID

NAS, RAID http://www.zhihu.com/question/19786074 NAS - Network Attached Storage: 是一种存储类型,说白了就是主机通过Ethernet网络访问存储数据的一种类型存储。 与之相对的是 SAN (storage area network) storage: 主机通过Fibre Channel访问存储数据的一种类型存储 通过Ethernet网络访问存储数据,采用的协议当前有NFS、SMB、iSCS NFS和SMB都是基于文件系统访问的运行在ethernet网络的协议,NFS用于Unix操作系统平台 (比如: AIX,HP-UX,各种Linux) 的访问协议;SMB协议用于windows系统平台的文件系统访问协议。 而iSCSI又称为IP-SAN, 是一种基于ethernet网络下的SCSI-3协议,它是基于块设备(block)的数据访问协议。 NAS storage 支持 NFS、SMB、iSCSI 协议 更传统的性能更高,但是成本也更高的是基于 Fibre Channel 的 SCSI-3 访问协议, 它是基于块设备 (block)的数据访问协议 SAN storage 使用基于 Fibre Channel 的 SCSI-3 访问协议 NFS是一种网络文件系统,也可以理解为网络文件传输协议。就是定义文件数据如何在网络中传输,通过怎样的协议去访问网络端的文件。 NAS指的是在网络中提供文件服务的设备。 一般的NAS都支持NFS这种协议,当然还会支持CIFS、FTP等多种网络文件传输协议。 RAID RAID, 全称是 Redundant Array of Inexpensive/Independent Disks, 也就是磁盘冗余阵列, 这里的 I 有两种说法, 一种是 Inexpensive, 廉价, 另一种是 Independent, 独立。所谓 RAID 就是将多块磁盘组合在一起, 对外抽象成一个容量大, 读写速度高, 容错性好的大型磁盘。 ...

2015-05-02 · 3 min · 429 words · -

journey、voyage、trip、tour、travel

journey、voyage、trip、tour、travel http://www.jxenglish.com/Article/vocabulary/10518.html http://www.learn-english-today.com/lessons/lesson_contents/grammar/travel-trip-journey.html TravelThe word ’travel’ is used to talk about going from one place to another. It can be a verb, a noun or an adjective : Verb : Paul travels a lot in his job. Noun : Travel nowadays is faster than before. Adjective : There is a travel agency beside the bank. TripThe word trip is used to talk about a short journey somewhere for a purpose, business or pleasure. ...

2015-05-01 · 2 min · 371 words · -

L N 火线零线?

L N 火线零线? http://wenwen.sogou.com/z/q177519752.htm L代表零线,N代表火线 火线 (英文LIVE) L 一般为红色或黄色或绿色 零线 (英文NEUTRAL) N (中性线) 一般为蓝色 地线 (英文EARTH) E 一般为黄绿色或黑色

2015-05-01 · 1 min · 18 words · -

java 并发 测试 JCStress

‘java 并发 测试 JCStress’ http://openjdk.java.net/projects/code-tools/jcstress/ http://www.oschina.net/translate/concurrency-torture-testing-your-code-within-the-java-memory-model https://wiki.openjdk.java.net/display/CodeTools/jcstress

2015-04-27 · 1 min · 7 words · -

golang 数据类型

golang 数据类型 常量 const ROOT_PATH = "/" Boolean 布尔值的类型为 bool,true或false,默认false var isActive bool // 全局变量声明 var enabled, disabled = true, false // 忽略类型的声明 func test() { var available bool // 一般声明 valid := false // 简短声明 available = true // 赋值操作 } 数值类型 整数类型 整数类型有无符号和带符号两种。 Go 同时支持 int 和 uint, 这两种类型的长度相同, 但具体长度取决于不同编译器的实现。 Go 里面也有直接定义好位数的类型: rune, int8, int16, int32, int64 和 byte, uint8, uint16, uint32, uint64。 整数 int8 (-128 -> 127) int16 (-32768 -> 32767) int32 (-2,147,483,648 -> 2,147,483,647) int64 (-9,223,372,036,854,775,808 -> 9,223,372,036,854,775,807) 无符号整数 uint8 (0 -> 255) uint16 (0 -> 65,535) uint32 (0 -> 4,294,967,295) uint64 (0 -> 18,446,744,073,709,551,615) 其中rune是int32的别称 byte是uint8的别称 浮点数 浮点数的类型有float32和float64两种 (没有float类型) ,默认是float64。 (IEEE-754 标准) ...

2015-04-27 · 3 min · 584 words · -

苹果公司开发者账号注册流程

苹果公司开发者账号注册流程 http://www.cnblogs.com/xilinch/p/4037164.html http://blog.csdn.net/totogo2010/article/details/8854879 http://wenku.baidu.com/link?url=2ib_WwmKsadzm3sj3Ts6scAEti98IroFeBrY5eP68y_8UPtLTez6skh2folvVD8r6AbIlokfccMdnbLax3I-aSJXl1La_R4PjtBEeoigwJ3 个人开发者账号 用于个人开发者上传和发布应用,在apptore上显示个人开发者信息。 1.只能有一个开发者; 2.100个IOS设备UDID测试 否 688 http://developer.apple.com/programs/iOS/ 团体账号 用于团体、公司开发者上传和发布应用,在apptore上显示团体名称。 1.允许多个账号管理; 2.100个IOS设备UDID测试 是 688 http://developer.apple.com/programs/iOS/ 公司账号 用于公司发布应用,使用该证书的应用不需要审核,但是也不能发布到appstore 1.不能上传到appstore; 2.无IOS设别UDID数量限制 是 1988 https://developer.apple.com/programs/iOS/enterprise/ 教育账号 不能对外正式发布应用 苹果特批 -- 企业账号: 一般是公司规模在500人以上的企业,用于内部测试发布的账号,该账号发布的应用不发布在appstore上。$299。 2.企业账号三大好处: 发布内部App Distribute In-house Apps Distribute proprietary, in-house iOS apps to your employees. You can also securely host and wirelessly distribute or update in-house apps to employees, keeping them current anywhere, anytime. 在各个设备上测试 Test on iPad, iPhone, and iPod touch ...

2015-04-27 · 1 min · 167 words · -

golang bufio 处理 TCP 粘包

golang bufio 处理 TCP 粘包 http://feixiao.github.io/2016/05/08/bufio/ 我们经常需要自定义协议,然后将自己定义的协议打包成二进制数据发送到对端,然后对端根据协议解包,TCP是流式传输所以我们需要自己从数据中找到数据的分隔点, 解析我们的数据包。 经常看到自定义的协议设计类似这样: 第一和第二个字节表示版本号,如V1, 第三、四字节表示数据的大小(不包括前面的四个字节),后面的就是这个数据包的大小。 // 类似这种结构 type Package struct { Version [2]int8 Datalen int16 Data []byte } Golang里面处理这个包的方式之一如下: 1: 一直阻塞读取第一个第二个字节,获取版本号(如果错误就做错误处理); 2: 然后读取第三、四个字节,获取数据的大小; 3: 然后根据第二步中的数据大小,后面下面的数据; 4: 重复上面的过程; NSQ 就是采取这种方式。 还有一种方式是我下面介绍的,我遇到的问题是这样: 我解析RTP Over RTSP数据,一个数据流里面有两种协议数据,所以我刚开始想到的方式就是,先从conn里面读取数据然后缓存,然后不断peek数据拿来分析(我不能拿走数据,因为数据可能不完整,所以一直做peek),自己管理buffer,其实这种方式很傻,golang的标准库其实已经给我们提供了实现。 使用Scanner就可以完成我们的需求, 实现如下: scanner, 分离函数, 分割函数, split func main() { // 创建一个包,版本是V1,数据是ABCDEFGHIJK,大小是11 var pkg Package pkg.Version[0] = 'V' pkg.Version[1] = 1 pkg.Data = []byte("ABCDEFGHIJK") pkg.Datalen = int16(len(pkg.Data)) fmt.Println(&pkg) // 打包成二进制数据 var buf bytes.Buffer pkg.Pack(&buf) // 从二进制数据里面获取数据 var pkg1 Package pkg1.Unpack(&buf) fmt.Println(&pkg1) // 模拟数据流,打包三个数据包 pkg.Pack(&buf) pkg.Pack(&buf) pkg.Pack(&buf) // 创建Scanner,分析buf数据流(r io.Reader,换成net.Conn对象就是处理tcp数据流,自己连数据都不需要去收取) scanner := bufio.NewScanner(&buf) // 数据的分离规则,根据协议自定义 split := func(data []byte, atEOF bool) (advance int, token []byte, err error) { if !atEOF && data[0] == 'V'{ if len(data) > 4 { var dataLen int16 binary.Read(bytes.NewReader(data[2:4]),binary.BigEndian,&dataLen) if int(dataLen) + 4 <= len(data) { return int(dataLen) + 4, data[:int(dataLen)+4],nil } } } return } // 设置分离函数 scanner.Split(split) // 获取分离出来的数据 for scanner.Scan() { fmt.Println(scanner.Bytes()) } if err := scanner.Err(); err != nil { fmt.Printf("Invalid input: %s", err) } } // 自定义协议的组包和拆包 type Package struct { Version [2]int8 Datalen int16 Data []byte } func (p *Package) String() string { return fmt.Sprintf("Version:%d DataLen:%d Data:%s", p.Version,p.Datalen,p.Data) } func (p *Package)Pack(w io.Writer) { binary.Write(w, binary.BigEndian,p.Version) binary.Write(w, binary.BigEndian,p.Datalen) binary.Write(w,binary.BigEndian,p.Data) } func (p *Package)Unpack(r io.Reader) { binary.Read(r,binary.BigEndian,&p.Version) binary.Read(r,binary.BigEndian,&p.Datalen) if p.Datalen > 0 { p.Data = make([]byte,p.Datalen) } binary.Read(r,binary.BigEndian,&p.Data) }

2015-04-27 · 2 min · 215 words · -

drill、exercise、practice、training与discipline

drill、exercise、practice、training与discipline drill : 侧重进行有系统的,严格和重复的练习,尤指军事训练。 In some of these schools, army-style drills are used to instil a sense of discipline. 这些学校中有一些利用军训来培养纪律观念。 a spelling/pronunciation drill 拼写/发音练习 exercise : 主要指为强壮体魄而进行的锻炼,也可指进行练习以保持已经获得的技巧。 Swimming is my favourite form of exercise. 我最喜欢的锻炼方式是游泳。 You really should take more exercise. 你真的应该多进行体育锻炼。 I do stomach exercises most days. 大多数时候我做锻炼腹肌的运动。 practice : 指把所学的理论或知识用于实践以获得技艺与技巧。 I need to get some more practice before I take my driving test. 考驾照前我还得再练练。 Are you coming to choir practice this evening? 今晚的合唱训练你来吗? She’s never at home because she spends all her free time at hockey practices. 她从来都不在家,因为她把所有的空闲时间都用在练习曲棍球上了。 You’ll gradually get better at it - it’s just a question of practice. 你慢慢会更熟练的——这只是个练习问题。 I’m a little out of practice (= I haven’t had any recent experience) but I’d love to play. 我最近没怎么练习,但我愿意参加。 Do you mind if I have a few practice shots before we start the game? 开赛前我练几下投篮你介意吗? training : 普通用词,泛指为从事某种职业而进行的身体或智力方面的训练。 ...

2015-04-27 · 1 min · 188 words · -

archlinux wireless

archlinux wireless https://wiki.archlinux.org/index.php/Wireless_network_configuration ip link set wlp3s0 up wifi-menu -o netctl start profile netctl enable profile netctl start wlp0s26f7u5-w1100n ——deleted sudo wpa_supplicant -i wlp0s26f7u5 -c /etc/wpa_supplicant/wpa_supplicant.conf -d sudo dhcpcd wlp0s26f7u5

2015-04-26 · 1 min · 30 words · -