Another good way to avoid duplicated declaration in C/C++ header files besides #ifdef

Since I prefer to declare everything in the .h file instead of .c/.cpp to make the whole program more readable, I am always dealing with duplicated definitions because of wrong insertion of them.

Using #ifndef macro is the traditional way to do that, but I simply hate adding #endif at the end of my code.

Now, I found a new way to do that. Adding key word extern before declaring them and declare them again in the .c/.cpp file can also do the trick. Since the compiles simple replace the .h file at the place where the macro #include is, using extern can solve all the conflicts.

A Script That Might Crush Ubuntu Without Root

Name the script something.sh and write ./something.sh inside it. This is a infinite loop that takes up all the cores of cpu instead of just one like the traditional loops do. It will cause the computer stop resonponding till it lost power.

Now I wonder I to solve this problem.

2017/2/6

Update: Just use ulimit

Allow scripts and other programs to boot with Linux

There are a few ways to do that.

  1. add your script or program in th form of absolute pass inside the /etc/rc.local before exit 0.

2.Use sys-rc-config to set a suitable start up level.
==Remember to disable your script before installing new software if you are using this way. Unregistered scripts will confuse the installation program and stop it.==

3.register the program as a service in the system.

Useful Methods from Bukkit

  1. ChatColor.[ColorCode]
    Change the color of the following chat.
    Reminding: what follows after with a “+” and must be a String. Even if it getLogger().info or print will automatically change non-String objects into string with the toString method, this one won’t work. We need to manually use object.toString if it’s after this method and connect with “+”.

  2. Block.setType(Material.material)
    Use Material.air to set to blank.
    Use Location.getBlock to get Block or Bukkit.getBlock to get block.

  3. playEffect(Location loc, Effect effect, int data)

  4. List<Entity> near = location.getWorld().getEntities();
    Get all entities in the world

  5. e.getLocation().distance(location) <= radius
    Get distance between two location

  6. entity.setVelocity(new Vector(5.0D, e.getBlock().getLocation().getY(), 5.0D));
    Push entity

  7. for(Entity entity : e.getPlayer().getNearbyEntities(20.0D, 20.0D, 20.0D))
    A cycle for each entity nearby

  8. ((CraftPlayer) player).getHandle().a(true, false, false)
    Eject player from a bed by opening a box to him.

A Huge Vulnerability on Most of the Multicraft Panel Hosting Service

2016/12/13
Multicraft: http://www.multicraft.org/

When a customer purchases a web-panel Minecraft Server, it’s actually one of the server applications runs on a server. Most of the time, the operating system is Windows server (at least at here…). These kind of services will usually go with an account on the web-panel and an account for a FTP file server with limited accessibility. The web-panel is used to manage the input and output of the application log. The ftp server is used to manage the files belongs to the application including plugins and maps.

So I believe that there will be multiple server appilication on the actual server because 2 application might share the same subdomain/ip address but just in different ports. Since accessing other dictionaries on the FTP server is prohibited, I believe that no dockers/virtual machines are present.

Also, I found that although users don’t have permission to edit other dictionaries, the application do have the permission to access the dictionaries of the other users. Since it’s not under linux, we don’t need to care about file owner’s issue. At the same time, we can easily access the application server through ftp server which is a compiled jar file. By reverse and recompile it, we can control the whole server.

Then I found that java codes in ./plugin and ./mod which is the application’s plugins and mods can be customized with your own code and will be executed by the application. In that, we can even execute shell command directly through runtime. Till now, I tried shutdown it and it works.

2016/12/14
Demo code:https://github.com/D0048/CraftPlugins/tree/master/ShellController

2016/12/17
I tested in my server, it’s working.

A Good Post I Found about basic Linux (In Chinese)

==Credit:http://tieba.baidu.com/p/3348166457?share=9105&fr=share ==


Linux的安装

Virtual box & CentOS(Community Enterprise OS)

Basic Storage Devices(存储盘柜)
SpecializedStorage Devices(使用以太网存储设备/FCoE卡集成网络环境10G+/IBM zFCP Server)
Use All Space(小白)
Replace Existing Linux System(s)
Shrink Current System
Use Free Space
CreateCustom Layout(自己分区)

分区界面sda(串行磁盘):sda1, sda2
Swap(虚拟内存)交换分配、无挂载点(需要升级)
/ 其他分在/下,除非有特定要求

Ext4(linux下的文件系统格式)
Standard Partition(标准分区)
RAID Partition
LVM Physical Volume(逻辑卷)

Fixed Size
Fill all space up to MB
Fill to maximum allowable size

Force to be a primary partition
Encrypt(加密、失性能、物理安全)

Install boot loader on /dev/sda
change Device ->
Master Boot Record (MBR)
First Sector of boot partition
BIOS Drive Order <-
Use a boot loader password

Desktop
Minimal Desktop
Minimal
Basic Server
Database Server (SQL)
Web Server (Apacher)
Virtual Host
Software Development Workstation

Enablekdump(内存环境分析Crash)

基本操作GNOME图形界面 (仿苹果风格,其他如KDE)
打开文件夹窗口edit->preferences->behavior->always open in browser windows
主要管理方式CLI:BASH基本操作
Shell分为GUI(GraphicalUser Interface): Gnome和CLI (Command Line Interface): BASH两种
命令行终端控制system(控制面板)->terminal
模拟终端运行在图形界面中多个桌面环境workspace
命令一般由三个部分组成: 命令、选项、参数
提示符:#->root、$->user、~->用户家目录命令通配符正则表达式
用到的其他命令:

su 切换到root权限

su - 切换到root用户

exit 退出用户登录

hostname 显示主机名

ls 列出文件清单

uname 显示系统名称

uname -a 完整的系统名

uname –all 同上(无差别)

Ctrl+c 终止当前进程

命令& 在后台执行此命令

用到的其他命令:

列出所有命令

自动补全命令

自动补全文件名

无法自动补全参数
clear 清除屏幕显示内容
Bash会保存你输入命令的历史记录,可以通过上下按键或者history命令来查看

!! 重复前一个命令

!字符 重复前一个以”字符”开头的命令

!num 按照历史记录的序号执行命令

!?abc 重复之前包含”abc”的命令

!-n 重复倒数第n个命令

可以通过Ctrl+r来在历史记录中搜索命令(reverse-i-search)`*:
重新调用前一个命令中的参数Esc + .
Bash shell支持以下通配符

  • 匹配零个或多个

? 匹配任意一个字符

[0-9] 匹配一个数字范围

[abc] 匹配列表里任何字符

[^abd] 匹配列表以外字符
通过su命令切换用户

su - 切换到root用户并使用一个新的运行环境

sudo 使用管理员身份运行命令

显示当前用户信息id
修改当前用户密码passwd
用到的其他命令:

su - 用户 切换到”用户”账号

logout 退出当前shell

exit 退出当前账号身份

暂停某个程序:通过Ctrl+z命令或者发送信号17
管理后台作业

jobs 查看后台作业列表

bg 1 继续执行后台任务1

fg 1 将后台任务调1到前台运行

Linux文件系统结构
Linux文件系统为一个倒转的单根树状结构
文件系统的根为”/“
文件系统严格区分大小写
路径使用”/“分割(windows使用”\”)
image1
每个shell或系统进程都有一个当前工作目录
使用pwd命令可以显示当前的工作目录

文件的名称大小写敏感
名称最多可以为255个字符
除了正斜线”/“以外,都是有效字符
通过touch命令可以创建一个空白文件或者更新已有文件的时间
以”.”开头的文件为隐藏文件

“ls”命令用来列出目录内容
ls -a 显示所有文件(包括隐藏文件)
ls -l 显示详细信息
ls -R 递归显示子目录结构
ls -ld 显示目录和链接信息

通过”file”命令可以查看文件类型

绝对路径: 以”/“开头,递归每级目录直到目标的路径
不受当前所在工作目录限制
相对路径: 以当前目录为起点,到达目标的路径
受当前所在工作目录限制

“cd”命令可以用来切换目录
cd .. 切换到上一级目录
cd . 切换到当前目录
cd ~ 切换到用户”home”目录(/home/user)
cd - 切换到上一个工作目录

相对路径: ../../var/log/sa
绝对路径: /var/log/sa

使用”cp”命令复制文件或目录
cp 源文件/文件夹目标文件/文件夹
-r 递归复制整个目录树
-v 显示详细信息

通过”mv”命令移动或者重命名文件或目录
mv 文件(文件夹) 目标目录
如果指定文件名,则可以重命名文件
mv 文件新文件名

通过”touch”命令可以创建一个空文件或更新文件时间
使用”rm”命令可以删除文件或目录
-i 交互式(删除之前需确认)
-r 递归的删除包括目录中的所有内容
-f 强制删除,没有警告提示(使用时需十分谨慎)
-v 显示详细信息
通过”mkdir”命令创建一个目录
通过”rmdir”命令删除一个空目录
通过”rm -r[f]”命令删除一个非空目录

/dev 存放设备抽象文件
/lib 存放系统库文件,库文件程序.iso .dll
/sbin 存放特权级二进制文件
/var 一般存放经常变化的数据服务器日志
/home 用户家目录,私有数据,用户名相同的文件夹
/etc 系统配置文件存放目录.conf .cnf
/media 自动挂载设备目录 U盘、光盘
/lost+found ext系统文件
/srv
/tmp 临时文件目录(系统会自动删除其中的文件)
/boot 存放内核与启动程序相关文件,引导启动目录内核引导模块
/bin 存放二进制文件(可执行命令)常用命令
/usr 一般存放安装程序
/proc 内存中的实时信息虚拟目录
/root 特权用户(root)家目录
/opt 大型软件存放目录(非强制)oracle
/mnt 正常文件挂载目录
/selinux 安全机制相关文件
/sys 系统底层信息目录
image2
命令”date”可以查看、设置当前系统时间
格式化显示日期: +%Y–%m–%d
显示UTC时间: date -u
修改系统时间: date -s
命令”hwclock(clock)”用以显示硬件时钟时间
命令”cal”用以查看日历
命令”uptime”用以查看系统运行时间

命令”echo”用以显示输入的内容
命令”cat”用以显示文件内容
命令”head”可以显示文件的头几行(默认10行)
-n 指定显示的行数

命令”tail”用以显示文件的末尾几行(默认10行)
-n 指定显示的行数
-f 追踪显示文件更新(一般用于查看日志,命令不会退出,而是持续显示新加入的内容)

命令”more”用于翻页显示文件内容(只能向下翻)
命令”less”用于翻页显示文件内容(可上下翻)

命令”lspci”用以查看PCI设备
-v 查看详细信息

命令”lsusb”用以查看USB设备
-v 查看详细信息

命令”lsmod”用以查看加载的模块(驱动)

*注:lspci、lsusb等命令系统最小化安装未安装,可自行安装相关程序

命令”shutdown”用以关闭、重启计算机
shutdown [-h|-r] 时间
-h 关闭计算机
-r 重新启动
如:
shutdown -h now 立即关机
shutdown -h +10 10分钟后关机
shutdown -h 23:30 晚上十一点半关机
shutdown -r now 立即重启

命令”poweroff”可以立即关闭计算机
命令”reboot”可以立即重启计算机

命令”zip”用以压缩文件
zip filename.zip file1 fiel2 …
命令”unzip”可以解压缩zip文件
unzip filename.zip
命令”gzip”可以压缩文件
gzip filename
命令”tar”可以归档文件
tar -cvf out.tar file1 file2 …
tar -xvf filename.tar
tar -cvzf out.tar.gz file file1 …
-z 参数将归档后的归档文件进行gzip压缩以减少大小

命令”locate”用以快速查找文件、文件夹
locate keyword
此命令需预先建立数据库,数据库默认每天更新一次,可以使用”updatedb”命令手工建立、更新数据库

命令”find”可以高级查找文件、文件夹:
find . -name keyword 在当前目录查找文件名中包含”keyword”的文件
find / -name .conf 在根目录中查找文件名以”.conf”结尾的文件
find / -perm 777 在根目录中查找权限为”777”的文件
find / -type d 在根目录中查找类型为”d”(目录)的文件
find . -name “a
“ -exec ls -l {} \; 立即重启

“find”支持很多种查找条件,常用的如下:
-name 按名称查找
-perm 按权限查找
-user 按所有者查找
-group 按所属用户组查找
-ctime 按创建时间查找
-type 按文件类型查找
-size 按文件大小查找

vim三种模式
IDE设备的名称hd[a-z]
SATA\SCSI\SAS\USB则为sd[a-z]
分区:将一个磁盘逻辑分为几个区
/dev/sda /dev/sda1 /dev/sda2
主流分区机制分为MBR和GPT两种软件功能
MBR是传统的分区机制,应用于绝大多数使用BIOS的PC设备(苹果EFI引导)
MBR支持32和64位系统分区数量有限只支持不超过2T的硬盘超过将只能使用2T 有第三种解决办法企业P级
占用446+4*16+2=512
Bootstrap Code Area
Partition table for primary pav
Boot Signature 55h,AAh永久标记
主分区:最多4个分区
扩展分区:一个扩展分区会占一个主分区位置
逻辑分区:最多支持63个IDE和15个SCSI分区
GPT GUID Partition Table是一个较新的分区机制,解决了MBR很多缺点,支持超过2T磁盘,寻址空间32M,64M,向后兼容MBR,但必须在支持UEFI的硬件上才能使用,必须使用64bit,MAC和Linux系统都能支持GPT分区格式windows 7 64和windows server 2008 64bit支持 Z单位
FDISK分区工具是来自IBM的老牌分区工具,支持绝大多数操作系统,几乎所有的LINUX的发行版本都装有FDISK,包括在LINUX的RESCUE模式下依然能够使用
FDISK只能用于MBR
FDISK命令只有具有超级用户权限才能够运行使用FIDK–I可以列出所有安装的磁盘及其分区信息
使用fdisk/dev/sda可以对目标磁盘进行分区操作
分区后需要使用partprobe命令让内核更新分区信息,否则需要重启才能识别新的分区
/proc/partitions文件也可用来查看分区信息
逻辑分区从5开始

文件系统
系统通过文件系统管理文件已数据,磁盘或分区需要创建文件系统之后才能够为系统使用,创建文件系统的过程有称之为格式化
没有文件系统的设备为又称之为裸设备
常见的文件系统有fat32 NTFS ext2 ext3 ext4 xfs HFS
其他有fat(msdos) vfat(fat32) nfs iso9660(光盘) proc(虚拟) gfs(全面文件系统) jfs(带日志) ntfs(装驱动)
文件系统之间的区别:日志,支持的分区大小,支持的单个文件大小,性能等

MKE2FS命令用来创建文件系统
Mke2fs –t ext4 /dev/sda3
常用参数
-b blocksize指定文件系统块大小文件读写性能默认4k
-c check建立文件系统时检查坏损块
-L label指定卷标
-j 建立文件系统日志默认带(exe3 exe4)
MKFS命令也可用于,但参数少,不能精细化控制
mkfs ext4 /dev/sdb/

DUMPE2FS命令&UUID分区号可查看文件系统详细信息微调用

JOURNAL日志
带日志的文件系统拥有较强的稳定性,在出现错误时可以进行恢复
使用带日志的文件系统,会使用一个叫做“两阶段提交”的方式进行磁盘操作,当进行磁盘操作时,文件系统进行一下操作:
1文件系统将准备执行的事务的具体内容写入日志
2文件系统进行操作
3操作成功后将食物的具体内容从日志中删除

意外故障

E2LABEL命令
可以用来为文件系统添加标签

FSCK命令
用来检查并修复损坏的文件系统
-y不提示而直接进行修复
会自动判断文件系统类型,损坏严重,则加参数-t
对于识别为损坏的数据,文件系统无记录,会放入lost+found目录
系统启动时会对磁盘进行FSCK操作

Linux系统挂载使用文件系统
挂载操作
磁盘或分区创建好文件系统后,需要挂载到一个目录才能够使用
Windows或MAC系统会进行自动挂载,一旦创建好文件系统后悔自动挂载到系统上,Windows上称之为C盘、D盘等
Linux需要手动进行挂载操作或配置系统进行自动挂载
/mnt
Mount
在Linux中,我们通过mount命令将格式化好的磁盘或分区挂载到一个目录上
Mount /dev/sda3 /mnt
常用参数
不带参数的mount命令会显示所有专辑挂载的文件系统
-t指定文件系统的类型
-o指定挂载选项
ro,rw以只读或读写形式挂载,默认是rw
sync代表不使用缓存,而是对所有操作直接写入磁盘
async代表使用缓存,默认是async
noatime代表每次访问文件时不更新文件的访问时间
atime代表每次访问文件时更新文件的访问时间
remount重新挂载文件系统
-ro只读就无法touch或rm命令
umount命令
用来卸载已挂载的文件系统,相当于windows中的弹出
umount 文件系统/挂载点
如果出现device is busy报错,则表示该文件系统正在被使用,无法卸载,可以使用以下命令查看使用文件系统的进程
fuser –m /mnt 或者 lsof /mnt查看正在使用的文件

配置文件 /etc/fstab 用来定义需要自动挂载的文件系统,fstab中每一行代表一个挂载配置
格式如下:
双击打开fstab

#开头是注释
分为五个部分
需要挂载的设备/dev/sda3
挂载点 /mnt
文件系统 /ext4
挂载选项defaults
Dump fsck相关选项 00
也可以用label取代路径进行识别
Mount –a 挂载fstab中的选项
先 umount /mnt/ label=…或uuid=…
w3m links wget less

1 -h 或 –help
2 man命令最多最详细
manls
1 用户命令
2 内核系统调用
3 库函数
4 特殊文件和设备
5 文件格式和规范
6 游戏
7 规范、标准和其他页面
8 系统管理命令
9linux内核api
-k关键字
3 info类似网页的形式
4 doc 很多程序的txt,html,pdf等保存在/usr/share/doc目录中

用户基础用户、组
需要以一个用户的身份登入,一个进程也需要以一个用户的身份运行,用户限制使用者或进程可以使用,不可以使用哪些组方便组织参观用户
每个用户拥有一个userid
每个用户属于一个主组,属于一个或多个附属组
每个组拥有一个groupid
每个进程以一个用户身份运行,并受该用户可访问的资源限制
每个可登陆用户拥有一个制定的shell

用户id为32位,从0开始,但是为了和老式系统兼容,用户id限制在60000以下
用户分为以下三种
root用户 id为0
系统用户 id为1到499
普通用户500+
系统中的文件都有一个所属用户及所属组
使用id命令与passwd
/etc/passwd 用户信息 /etc/shadow用户密码/etc/group 组信息
查看登陆用户
命令whoami显示当前用户
命令who显示有哪些用户已经登陆系统并在干什么
命令w显示有哪些用户
创建一个用户
命令useradd用以创建一个新用户
建立一个与用户用户名相同的组,默认于这个组/skel
-d家目录
-s登陆shell
-u userid
-g 主组
-G附属组,最多31个,用,分割

修改用户信息
usermod参数username
-I 新用户名
-u新用户id
-d用户家目录位置
-g用户所属主组
-G用户所属附属组
-L锁定用户使其不能登陆
-U解除锁定

删除用户
userdel –r xxx同时删除家目录
每个组有一个组id,使用部门、职能或地理区域的分类形式
组信息保存在 /etc/group中
每个用户组拥有一个主组,同时还可以拥有最多31个附属组
groupadd
groupmod –n
groupmod –g
groupdel

权限
限制对资源访问
读写执行目录必须拥有x权限否则无法浏览ugo模型
user group other (rwx) 分别设置9个权限
每一个文件拥有一个所属用户和所属组,对应UG,不属于该文件所属用户或所属组的使用o的权限
drwxr–xr- -z xxx training 208 oct/13:50 xxx.net
d文件类型 rwx:U权限 r-x:G权限 r–:O权限

chown命令改变文件的所属用户
-R参数递归修改
命令chgrp用以改变文件的所属组
命令chmod用以修改文件的权限
格式如下:ugo/a +- rwx
Chmod u+rw xxx.net
g-x go+r a-x
也支持数字方式修改
-r=4
-w=2
-x=1
rw=4+2=6
rwx=4+2+1=7
r-x=4+1=5

扩展权限
默认特殊权限
每一个终端都拥有一个umask属性,来确定新建文件,文件夹的默认权限
Umask使用数字权限方式表示,如:022
目录默认 777-umask
文件默认 666-umask
普通用户002
Root 022
新建文件权限:666-002=664
新建目录权限:777-002=775

umask命令
除了普通权限外还有三个特殊权限
权限 对文件的影响 对目录的影响
suid 以文件的所属用户身份执行而非执行文件的用户 无
sgid 以文件所属组身份执行 与该目录中创建的任意新文件的所属组于该目录的所属组相同
sticky 无 对ultimate拥有写入权限的用户仅可以删除其拥有的文件,无法删除其他用户所拥有的文件

设置suid:chmod u+s xxx.net
设置sgid:chmod g+s xxx.net
设置sticky:chmod o+s xxx.net
特殊权限也可以使用数字方式表示–SUID=4 SGID=2 STICKY=1 chmod 4755 xxx.net

网络原理网络编址(唯一定位)
ip编址是一个双层编址方案
一个ip标识一个主机(或一个网卡接口)
ipv4 32位 ipv6 128位地址不够用
网络部分和主机部分(几位并不固定)
所属区域和区域中的哪个主机
点分十进制4个部分、每个部分8位
192.168.1.1 三层地址
子网掩码来确定网络部分的位数
与ip地址一样,拥有32bit一一对应
ip地址中相对应子网掩码中为1的部分为网络部分255=1111111
255.255.255.0 /24
Mac地址用来在同一个网络内主机之间通信
固化地址网卡硬件地址二层地址
ARP地址解释协议
网关/路由器在不同网络之间传输数据的功能叫做路由功能
一般有多个接口,链接到不同的网络中,并且通过路由表进行数据转发
出接口etho 1 2 3..目标网络
主机名+域名+类型
DNS服务就是用来在ip于域名之间进行转换的
环回接口127.0.0.1
由DNS服务器提供解析域名
局域网跨网段可上网
以太网连接通过lspci命令可以查看网卡硬件信息
如果是USB网卡,则可能需要使用kusb命令
命令ifconfig命令用来查看接口信息
ifconfig –a 所有 etho特定
命令ifup ifdown用来启用、禁用一个接口
ifup eth0
ifdown eth0
setup命令配置网络信息
network configuration
device configuration
网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0
DNS /etc/resolv.conf
主机名 /etc/sysconfig/network
静态主机名 /etc/hosts

网络测试命令
ping 192.168.1.1 连通性
测试DNS解析host http://www.xxx.com
显示路由表 ip roote
追踪到达目标地址 trace route
使用mtr进行网络质量测试
修改主机名
实时 hostname xxx.net
永久性/etc/sysconfig/network hostname=…
故障排查:从底层到高层,从自身到外部
先看网络配置网关 DNS ip host
Mount -0 remote rw/
Passwd …
启动grub引导管理程序进入修复
不同模式Stop shift recovery mode root

Linux多买了协作:管重定向及文本处理
开源不要重复发明轮子很少出现复杂功能的命令
Linux中几乎命令返回数据为纯文本,多命令协作就是通过管道和重定向完成的
命令行shell的数据流有以下定义
名称 说明 编号 默认
STDIN 标准输入 0 键盘
STDOUT 标准输出 1 终端
STDERR 标准错误 2 终端
命令通过STDIN接受参数或数据,通过STDOUT输出结果或通过STDERR输出错误。

分类 关键字 定义 例子
重定向 > 将STDOUT重定向到文件(覆盖) echo”…”>outfile ls>outfile
>> 将STDOUT重定向到文件(追加) echo”…”>>outfile date>>outfile
2> 将STDERR重定向到文件(覆盖) ls nowhere 2> errorout
2>&1 将STDERR与STDOUT结合 ls nowhere 2>&1 alloutput
< 重定向STDIN grep …< /etc/passwd
管道 | 将一个命令的STDOUT作为另一个命令的STDIN ls -1 | grep …
find /-user… | grep video

命令行文本处理工具
命令grep用以基于关键字搜索文本
grep ‘…’ /etc/passwd
find / -user …| grep video
-i在搜索的时候忽略大小写
-n显示结果所在行数
-v输出不带关键字的行
-Ax在输出的时候包含结果所在行之后的指定行数
-Bx在输出的时候包含结果所在行之前的指定行数

基于列处理文本
命令cut用以基于列处理文本内容
cut –d: -f1 /etc/passwd
grep … /etc/passwd | cut –d: -f3

-d指定分割字符(默认是TAB)
-f指定输出的列号
-c基于字符进行切割 cut –c2-6/etc/passwd

文本统计
命令WC用以统计文本信息 wc …
-l 只统计行数
-w 只统计单词
-c 只统计字节数
-m 字符数

文本排序
命令sort用以对文本内容进行排序
-r 进行倒序排序
-n 基于数字进行排序
-f 忽略大小写
-v 产出重复行
-tc 使用c作为分隔符分割为列进行排序
-kx当进行基于指定字符分割为列的排序时,指定基于那个列排序

命令uniq用以删除重复的相邻行

文本比较
命令diff用以比较两个文件的区别
-I 忽略大小写
-b 忽略空格数量的改变
-u 统一显示比较信息(一般用以生成patch补丁文件)
diff –u … …-new > final .patch

检查拼写
命令aspell用以显示检查英文拼写
aspell check …
aspell list < …

处理文本内容
命令tr用以处理文本内容
删除关键字
tr –d ‘TMD’ < …
转换大小写
tr ‘a-z’ ‘A-Z’ < …

搜索替换
命令sed用以搜索并替换文本
sed ‘s/linux/unix/g’ …
sed ‘1,50s/linux/unix/g’ …
sed –e ‘s/linux/unix/g’ –e ‘s/jimmy/g’ …
sed –f sededit …

Linux系统启动
BIOS:基本输入输出系统负责检查硬件并查找可启动设备(USB、CDROM、HD)
MBR:BIOS找到设备后执行其引导代码BOOT CODE55AA前446字节EFI查找引导程序
GRUB:主流引导程序执行引导程序/boot/grub/grub.conf对应的配置文件,微软NTLDI
加载内核
执行init
Runlevel

stage1第一阶段512同MBR大小只是镜像可回写
_stage1_5 文件系统驱动e2fs,fat,ffs,jfs,minix,reiserfs,iso9660,ufs2,ustafs,xfs
stage2 timeout=3 splashimage= hidden menutitle root(hd0,1)
内核kernel…
initrd

MBR的引导代码将负责找到并加载linux内核
Linux内核保存在/boot/vmlinuz-2.6.32-279.el6.i686
一般还会加载内核模块打包文件/boot/initramfs-2.6.32-279.el6.i686.img
Linux为何保持kernal的精简将一些不常用的驱动功能编译成为模块,在需要的时候动态加载,而这些模块被打包保存为一个initramfs文件
早期版本linux使用initrd文件,initramfs是initrd的替代优化,更节省空间,更灵活
命令dmesg可以查看本次启动时内核的输出信息
Init
Init是linux OS中的第一个进程,PID接启动顺序排,一直存在,是所有进程的父进程
调用/ect/rc.d/rc.sysinit负责对系统进行初始化,挂载文件系统并且根据运行级别启动相应服务-0关机-1单用户模式-2不带网络的多用户模式-3多用户模式-4未使用-5XII图形化模式-6重新启动,可以通过/etc/inittab配置文件修改默认的运行级别,每个级别对应的启动服务保存在/etc/rc.d/rc[0123456].d中
命令runlevel可现实当前及上一个运行级别
命令init可用以改变当前运行级别

单用户修改root密码
为内核传递参数’1’或’single’可系统进入单用户模式
单用户模式下不启动任何服务
单用户模式直接以root用户登录,并且不需要密码 e,1,b
可以使用passwd修改root密码 exit
Grub加密
通过在grub.conf中的启动配置中加入如下参数即可对grub进行加密
Password –md5$1$aoWpTe$/MWUUYbBIF.2RUZK8nbWUo
加密后的密码可以通过grub-md5-crypt生成

Linux软件管理RPM、YUM
源代码形式
绝大多数开源软件都是直接以源代码形式发布
源代码一般会被打包成tar.gz归档压缩文件
程序源代码需要编译成为二进制形式之后才能够运行使用
源代码基本编译流程
1./configure检查编译环境,相关库文件以及配置参数并生成makefile
2make源代码进行编译,生成可执行文件
3make install将生成的可执行文件安装到当前计算机中源代码形式的软件使用起来较为麻烦,但是兼容性及可控制性较好
开源软件一般都会大量使用其他开源软件的功能,所以开源软件会有大量的依赖关系(使用某软件需要先安装其他软件)

RPM
源代码形式的缺点:操作复杂,编译时间较大,极容易出错
源代码形式的优点:适用所有系统,可定制
为了方便使用,Erik Troan 和Marc Ewing开发有Redhat Package Manager通过将源代码基于特定平台系统编译为可执行文件,并保存依赖关系,来简化开源软件的安装管理
RPM设计目标如下:使用简单;使用单一软件包格式文件发布(.rpm文件);可升级;追踪软件依赖关系;基本信息查询;软件验证功能;支持多平台
基础命令
安装rpm –i software.rpm 卸载rpm –e software 升级rpm –U software-new.rpm
rpm支持通过http,ftp协议安装软件:
rpm –ivh http://www...net/software.rpm
可以加入一下参数–v显示释放信息–h显示进度条
rpm查询
rpm –qa 列出所有安装的rpm软件
rpm –qf filename查询目标文件属于哪个包
rpm –qi packagename查询指定已安装rpm软件的信息
rpm –ql packagename查询指定已安装rpm软件包含的文件
rpm –qip software.rpm查询rpm文件的信息
rpm –qlp software.rpm查询rpm文件包含的文件
rpm验证:软件在传播过程中可能会被恶意地修改所以为了安全起见现代系统都加入也对软件的验证功能,一般使用非对称加密算法,送一需要一个密钥验证rpm文件rpm –k software.rpm,验证已安装的软件rpm –vsoftware

YUM
rpm软件包形式管理软件虽方便,但需要手工解决软件包的依赖关系,很多时候安装一个软件需要首先安装一个或多个(又是多达上百个)其他软件,手工解决时很复杂使YUM可以解决这个问题。
Yellowdog Updater Modified是一个rpm的前端程序,主要目的是设计用来自动解决rpm的依赖关系问题,其特点如下:自动解决依赖关系;可以对rpm进行分组,并基于组织进行安装操作;引入仓库概念,支持多个仓库;配置简单
YUM引入了仓库的概念,仓库用来存放所有现有的rpm的软件包,当使用yum安装一个rpm软件的时候,会自动在仓库中查找依赖软件并安装,仓库可以是本地的,也可以通过http,ftp或nfs形式使用集中的,统一的网络仓库
YUM使用仓库保存管理rpm软件包,仓库的配置文件保存在/etc/yum.repos.d/目录下,格式如下:
[…]
Name=This is … rpm soft repo
Baseurl=http://www…net/yum/centos/6/i386/rpms
Enabled=1
gpgcheck=1
仓库可以使用file,http,ftp,nfs方式
Yum配置文件必须以.repo结尾
一个配置文件内可以保存多个仓库的配置信息
/etc/yum.repos.d/目录下可以存在多个配置文件

YUM基本命令
安装yum install software-name
卸载yum remove software-name
升级yum update software-name
YUM查询
搜索yum search keyword
yum list (all|installed|recent|updates)
yum info packagename
yum whatprovides /etc/inittab

创建YUM仓库
可以通过以下手工创建
1将所有rpm文件拷贝到一个文件夹中
2通过rpm命令手工安装createrepo软件
3运行命令createrepo –v/rpm-directory
4如果有分组信息,则在运行命令的时候使用-g参数指定分组文件
Createrepo –g /tmp/*comps.xml/rpm-directory
CentOS/RHEL的分组信息保存在光盘repodata/目录下,文件名以comps.xml结尾的xml文件
创建好之后本机可以通过file方式直接使用,如果需要作为对外的yum仓库服务器,可以通过http,ftp或nfs协议共享出去
yum cache 为了提高速度会通过缓存很多信息,但是有时候缓存会造成一些故障,可以通过以下命令来清除缓存:yum clean all
每次运行安装或查询类命令会重建yum缓存

Reminding on onCommand method when developing plugins for Bukkit.

  1. args.length can replace argc in C.

  2. Args.length will return a value of the length of a array but when using it at the end of the array, instead of array[length], do array[length-1] .

  3. Unlike C that we can use arg[0] to get the command, when doing OnCommand method, args[0] directly refers to the first parameter. This way, reading args[0] when there are no parameters will cause a NullPointerException.

  4. To get the command name, use Command.getName or use the label parameter.
    Use (sender instanceof Player) to see whether if a player or a console issued the command.

2016/12/5

1.Remember to check if a method works correctly before using it to prevent a NullPointerException.
2.If a player is offline, getting that player may result in NullPointerException.
2016/12/6

Unsolved problem list

  1. This works:
     public boolean addtoPlayerList(Player player){
    String name=player.getName();
     if (PlayerNumber>=MaximumPlayer) {return false;}//人数超过则返回错误
    else {
        if(isInList(name)==false){
            this.PlayerList[PlayerNumber]=name;
            getLogger().info("玩家:"+name+"已被添加至游戏列表。");
            //Bukkit.getPlayer(name).sendMessage("玩家:"+name+"已被添加至游戏列表。");
            PlayerNumber++;
            return true;
        }//不然就把名单上面下一位给加上传过来的玩家
        else{
           getLogger().info("玩家"+name+"已存在列表中");
           Bukkit.getPlayer(name).sendMessage("玩家"+Bukkit.getPlayer(name)+"已存在列表中");
          return false;
        }
    }
    
    }

    This don’t:
    public boolean addtoPlayerList(Player player){
    if (PlayerNumber>=MaximumPlayer) {return false;}//人数超过则返回错误
    else {
        if(isInList(player)==false){
            PlayerList[PlayerNumber]=(String)player.getName();//这个方法和下面那个是重载关系,都会出错,出错相同
            getLogger().info("玩家:"+player.getName()+"已被添加至游戏列表。");
            player.sendMessage("玩家:"+player.getName()+"已被添加至游戏列表。");
            return true;
        }//不然就把名单上面下一位给加上传过来的玩家
        else{
           getLogger().info("玩家"+player.getName()+"已存在列表中");
           player.sendMessage("玩家"+player.getName()+"已存在列表中");
           return false;
        }
    }
    
    }

    Why?


    2016/12/5: As I believed, this is the same problem with the one below.

  2. ~~Bukkit.getPlayer(name) will report a NullPointerException when using. Why?

2016/12/15:
Let me simple this down to this:
Using Bukkit.getPlayer(args[0]) itself as a player instance will give a NullPointerException when using. But when I use

Player player=Bukkit.getPlayer(args[0]);
first and then use the player instance instead, everything works. Why?(I asked a few friends but still unsolved)
~~
==Solved: When I was calling the method, the player was offline so it returns a null pointer. Also, I foget to check it so the error occurs. ==

  1. When I access a text file on my website generated by the pipeline or redirected output of a command or a program, all the \n have to be replaces with
    to keep the form. How to make it more convenient?
    ==Possible solution: use view:sourcecode when browsing==


2016/12/12
4.When using any types of audio players in my raspberry pi to play music, I found when I keep playing in a terminal, it will report a “audio device stuck” error and just stop. Even ^C don’t work on it. Why?


2016/12/19
5.I am trying to install Ubuntu on the second disk of my computer. But I think the boot priority is locked on my computer so I cannot boot from the second disk as long as I have a system on the first one. I have to go to recovery mode to manually make the computer boot from the second disk.
What should I do…
2016/12/20
Possible soluction from @Superboot:
== d0048: Install grub onto the MBR of the first disk, and it will give you a list of OSs to boot at boot time.

d0048: To be more specific, I would boot into your ubuntu install (you said you could from recovery mode), and run: sudo grub-install /dev/sdb. Be sure to check that /dev/sda.==
2016/12/22
Looks like my computer locked my start up sequence. I tried to install a lower version bios as the custom service guy. But not working. Also, trying on installing grub on each disk and each partition is not working to. So I ask the service guy again and this time he told me that the booting partition is loaded on the second disk and need to be erased manually. Till now, I don’t feels like worth to do it so I guess I will just press F9 before actually start booting.

==Solved:== Install a software called easyuefi. It couldn’t delete but do successfully disabled the windows loader. Now grub will be entered at first. 2017/2/13

6.The school will shutoff the Internet access after 10:30 pm. But if it’s connected beforehand with Ethernet, it won’t be shut as long as the device keeps connected. But if the device disconnected after 10:30 pm, it cannot connect again.

######why?

7.What’s the relationship between android build tool version, android sdk version, android api level, grandle version, grandle plugin version and those version of dependencies.
2017/3/14

#####If you have any solution, please comment below or contact me through d0048@china.com.cn#####