CentOS7常见操作

1、通过CentOS光盘安装软件

#挂载光盘
mount -r /dev/sr0 /media/cdrom

#修改文件,将光盘查找路径定为/media/cdrom
vi /etc/yum.repos.d/CentOS-Media.repo

#刷新列表
yum --disablerepo=\* --enablerepo=c7-media repolist

#安装vim
yum --disablerepo=\* --enablerepo=c7-media install vim

#通过命令查找包并安装包
yum --disablerepo=\* --enablerepo=c7-media provides ifconfig
yum --disablerepo=\* --enablerepo=c7-media install net-tools

#卸载包
yum erase 包名

2、rpm安装及卸载软件

#安装
rpm -ivh rpm文件路径

#安装并不进行依赖检查
rpm -ivh --nodeps rpm文件路径

#更新
rpm -Uvh rpm文件路径

#删除
rpm -e 包名

#查看包的用途、版本等信息
rpm -qpi rpm文件路径

#查看包的文件清单
rpm -qpl rpm文件路径

#查看软件包文档位置
rpm -qpd rpm文件路径

#查看软件包的配置文件
rpm -qpc rpm文件路径

#查看软件包依赖关系
rpm -qpR rpm文件路径

3、rpm查看已安装软件包信息

#查看已经安装的软件
rpm -qa
 
#查看一个文件属于哪个软件包
rpm -qf 文件绝对路径

#查看安装软件包都安装到何处;
rpm -ql 包名

#查看包的信息
rpm  -qi 包名

#查看包配置文件
rpm -qc 包名

#查看包文档安装位置
rpm -qd 包名

#查看包的依赖
rpm -qR 包名

4、配置网络为静态地址

vim /etc/sysconfig/network-scripts/ifcfg-enp0s3
#修改或新增以下内容
BOOTPROTO=static
ONBOOT=yes
IPADDR=172.16.172.80
NETMASK=255.255.0.0
GATEWAY=172.16.172.2

#重启网络
service network restart

5、防火墙配置

#查看状态
systemctl status firewalld 

#启动
systemctl start firewalld

#关闭
systemctl stop firewalld

#开机启用
systemctl enable firewalld

#开机禁用 
systemctl disable firewalld

Debian默认命令行启动

由于Debian6和Debian8服务管理方式不同,很多旧方法不再适用于Debian8

1、Debian6之前:修改内核启动参数
1.1、修改文件/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet"

GRUB_CMDLINE_LINUX_DEFAULT="quiet text"

1.2、然后运行

update-grub

2、Debian8之后:systemctl

#切换为命令行登录
systemctl set-default multi-user.target
#退出GUI
gnome-session-quit

#切换为GUI登录
systemctl set-default graphical

3、Grub禁用图像模式
3.1、修改文件/etc/default/grub

#GRUB_TERMINAL=console

GRUB_TERMINAL=console

3.2、然后运行

update-grub

Hadoop Linux Native 编译说明

首先说明一下,如果要使用Linux Native的话,Hadoop是已经自带了哦

然后,如果要编译的话,建议直接从Hadoop源码按官方的说明进行编译,不要像我这样自己搞。。。

如果你喜欢折腾,请继续看:

1、按源码架构拷贝下面的文件及文件夹

hadoop-2.5.2-src\hadoop-common-project\hadoop-common\src\main\native
hadoop-2.5.2-src\hadoop-common-project\hadoop-common\src\CMakeLists.txt
hadoop-2.5.2-src\hadoop-common-project\hadoop-common\src\config.h.cmake
hadoop-2.5.2-src\hadoop-common-project\hadoop-common\src\JNIFlags.cmake
hadoop-2.5.2-src\hadoop-hdfs-project\hadoop-hdfs\src\main\native
hadoop-2.5.2-src\hadoop-hdfs-project\hadoop-hdfs\src\CMakeLists.txt(可能需要调整一下依赖文件JNIFlags.cmake的相对路径)
hadoop-2.5.2-src\hadoop-hdfs-project\hadoop-hdfs\src\config.h.cmake

2、编译libhadoop
2.1、检查并安装以来关系

#需要gcc、make、jdk,这些一般大家都有了
#需要zlib
apt-get install zlib1g-dev
#需要cmake
apt-get install cmake

2.2、用cmake生成Makefile

cmake ./src/ -DGENERATED_JAVAH=~/Build/hadoop-2.5.2-src/build/hadoop-common-project/hadoop-common/native/javah -DJVM_ARCH_DATA_MODEL=64 -DREQUIRE_BZIP2=false -DREQUIRE_SNAPPY=false

2.3、用javah生成头文件
需要三个jar包,hadoop-common,hadoop-annotations,guava

javah org.apache.hadoop.io.compress.lz4.Lz4Compressor
javah org.apache.hadoop.io.compress.lz4.Lz4Decompressor
javah org.apache.hadoop.io.compress.zlib.ZlibCompressor
javah org.apache.hadoop.io.compress.zlib.ZlibDecompressor
javah org.apache.hadoop.io.nativeio.NativeIO 
javah org.apache.hadoop.io.nativeio.SharedFileDescriptorFactory
javah org.apache.hadoop.net.unix.DomainSocket
javah org.apache.hadoop.net.unix.DomainSocketWatcher
javah org.apache.hadoop.security.JniBasedUnixGroupsMapping
javah org.apache.hadoop.security.JniBasedUnixNetgroupsMapping
javah org.apache.hadoop.util.NativeCrc32

将生成的文件,拷贝到对应的c文件夹中

2.3、生成

make

3、编译libhdfs
3.1、用cmake生成Makefile

cmake ./src/ -DGENERATED_JAVAH=~/Build/hadoop-2.5.2-src/build/hadoop-common-project/hadoop-common/native/javah -DJVM_ARCH_DATA_MODEL=64 -DREQUIRE_LIBWEBHDFS=false -DREQUIRE_FUSE=false

3.2、生成

make

4、将生成的文件拷贝到HADOOP_HOME/lib/mynative

5、修改/etc/profile,增加下面一行

export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/mynative"

6、刷新配置

source /etc/profile

搞定!

Hadoop Windows Native 编译说明

1、首先,下载hadoop-2.5.2-src源码

拷贝文件夹hadoop-2.5.2-src\hadoop-common-project\hadoop-common\src\main\native
拷贝文件夹from hadoop-2.5.2-src\hadoop-common-project\hadoop-common\src\main\winutils

2、设置JAVA_HOME及PATH环境变量

3、生成javah的头文件
解压hadoop-common-2.5.1.jar,然后运行

javah org.apache.hadoop.util.NativeCrc32
javah org.apache.hadoop.io.compress.lz4.Lz4Compressor
javah org.apache.hadoop.io.compress.lz4.Lz4Decompressor
javah org.apache.hadoop.io.nativeio.NativeIO
javah org.apache.hadoop.security.JniBasedUnixGroupsMapping
javah org.apache.hadoop.security.JniBasedUnixGroupsMapping

4、打开winutils.sln,修改输出路径到../bin,编译

5、打开native.sln,修改输出路径到../bin,修改winutils.lib引用地址,编译

6、拷贝exe及dll文件到HADOOP_HOME/bin,搞定

常见问题:
1、编译的硬件平台要与java位数一致(x86,x64),否则dll无法加载
2、出问题时,先运行winutils.exe,无法运行时,要安装对应VS版本的vcredist可再发行包就好了
3、如果提示”unable to load native hadoop-library for your platform”的话,那只需要在JVM启动参数中制定native library的路径,就可以了

如果比较着急的话,可以到我的github上下载2.5.2版本的native binary:hadoop-windows-native

Xcode7文档下载地址

具体的下载地址,可以在这里查到
https://developer.apple.com/library/downloads/docset-index.dvtdownloadableindex

对于Xcode7,对应文档的下载地址为
watchOS 2.0 Documentation
iOS 9.0 Documentation
OS X 10.11 Documentation
Xcode 7 Documentation

已知问题
1、文档下载安装后可以使用,但Xcode无法识别。
2、从apple官网下,还是太慢了

从BootCamp中提取HFS驱动

一、说明:
1、如果你是MAC,那直接安装Bootcamp就好了,别瞎折腾

2、如果你只想用这个驱动,来这里下载https://forums.macrumors.com/threads/apple-hfs-windows-driver-download.1368010/

3、即使你折腾成功了,也是只读,无法写入

4、Bootcamp的版本是通过下面的条件划分的
A、MAC硬件版本
B、Windows操作系统版本(win7、win8、win10、x86、x64)
C、发布版本
从而,直接查找Bootcamp,本身就成了一件很痛苦的事情

5、Bootcamp的HFS驱动文件的默认安装位置为
C:\Windows\System32\drivers\AppleHFS.sys
C:\Windows\System32\drivers\AppleMNT.sys
而文件系统驱动是与MAC硬件版本无关的,所以我们只需要考虑B、C两个问题就好了

二、然后说HFS驱动提取的方式:
1、按上面所说的,驱动提取只需要考虑Windows操作系统版本和Bootcamp发布版本就可以了,是不需要考虑MAC硬件版本的
2、下载后,解压文件
3、将AppleHFS.sys、AppleMNT.sys拷贝出来
4、备份注册表(这一步一般来说是可以省掉的)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\AppleHFS
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\AppleMNT

一般来说用下面的文件进行安装和卸载就好了:
Add_AppleHFS.reg

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\AppleHFS]
"Type"=dword:00000002
"ErrorControl"=dword:00000001
"Start"=dword:00000000
"Group"="File System"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\AppleMNT]
"Group"="System Bus Extender"
"Type"=dword:00000001
"ErrorControl"=dword:00000001
"Start"=dword:00000000

Remove_AppleHFS.reg

Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\AppleHFS]

[-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\AppleMNT]

5、这样驱动提取就完成了

三、HFS驱动的安装方式:
1、一定要核对windows版本与驱动提取的版本信息是一致的才可以(win7、win8、win10、x86、x64)
2、将驱动拷贝到指定路径
C:\Windows\System32\drivers\AppleHFS.sys
C:\Windows\System32\drivers\AppleMNT.sys
3、双击Add_AppleHFS.reg
4、重启即可

四、HFS驱动的卸载方式:
1、双击Remove_AppleHFS.reg
2、重启
3、删除驱动文件
C:\Windows\System32\drivers\AppleHFS.sys
C:\Windows\System32\drivers\AppleMNT.sys

五、兼容Win10方式:
1、按上面的方式安装驱动
2、打开磁盘管理器,从磁盘0的第一个卷,一直数到你想挂在的HFS卷,记录卷的序号,比如我有几块硬盘,我想挂载的卷是第10个卷(要注意,没有挂载的卷也是要计算的)
3、修改注册表

#位置
HKEY_LOCAL_MACHINE/system/CurrentControlSet/Control/Session Manager/DOS Devices/
#新建String类型的键值对
#左边的Key就是你想挂在的盘符,比如
#N:
#右边的Value就是卷的序号
#\Device\HarddiskVolume序号
#比如你是第10个卷,那就是
#\Device\HarddiskVolume10

4、重启,如果卷号错了,就调整一下再重启
5、只是一个临时方案,不太适合移动设备,有些太麻烦了

为什么Bootcamp只允许windows用一个盘

MAC笔记本中,用EFI替代了传统的BIOS,其引导方式也由MBR调整为GPT。

但实际上,为了兼容性要求,MAC下的分区有两个分区表,一个是GPT(GUID Partition Table),一个是hybrid MBR(Master Boot Record)。
而hybrid MBR其实是为了兼容只支持MBR的操作系统,在GPT中划分了一块作为MBR用。

MAC OS默认分区方式为GPT,主要也是在读GPT。
Windows只会读MBR。

1、为什么Bootcamp只允许windows用一个盘
MBR只允许四个主分区,而MAC占掉了三个:
1个引导分区
1个MAC分区
1个恢复分区
所以只留给了Windows一个主分区。

为什么MAC的硬盘分区要在MAC OS下进行呢?
MAC下分区的话,MAC OS会同时更新GPT与MBR,这样MAC与Windows读取的分区信息都是对的。
Windows下分区的话,Windows只会改写MBR,这样GPT与MBR的分区信息就不匹配了,MAC与Windows读取的信息就不一样了,是否相互覆盖全凭运气,你懂的。

QT实现自动启动(Windows)

QString NMyUtils::getExeFullPathWithArgs()
{
    QString exePath = QCoreApplication::applicationFilePath().replace("/","\\").replace("Reminder.exe","QTLoader.exe");
    QString argPath = "\""+exePath+"\" TrayIcon";
    qDebug()<<argPath;
    return argPath;
}

bool NMyUtils::isAutoStart()
{
    QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat);
    QString val = reg.value("NReminder").toString();
    if(val.length()>0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

void NMyUtils::setAutoStart()
{
    QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat);
    reg.setValue("NReminder",NMyUtils::getExeFullPathWithArgs());
}

void NMyUtils::removeAutoStart()
{
    QSettings reg("HKEY_LOCAL_MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN", QSettings::NativeFormat);
    reg.remove("NReminder");
}

Winform多行标题TabControl

今天写示例程序的时候,遇到了需要多行标题TabControl的情况。
整体流程很简单,就是将标题拆分,然后根据行数和最大行宽设置每一Page标题的高度及宽度即可。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace UITabControlTest
{
    public partial class SubForm : Form
    {
        private Dictionary<TabPage, TabPageInfo> allTabMap = new Dictionary<TabPage, TabPageInfo>();

        public SubForm()
        {
            InitializeComponent();
            tabMain.DrawMode = TabDrawMode.OwnerDrawFixed;
        }

        private void SubForm_Load(object sender, EventArgs e)
        {
            tabPage1.Text = "line1\nline2\nline3\nline4\nlin5";
            tabPage2.Text = "line1\nline2\nline3\nline4";
            tabPage3.Text = "line1\nline2\nline3";
            tabPage4.Text = "line1\nline2";

            int lineNum = 0;
            foreach (TabPage tab in this.tabMain.TabPages)
            {
                TabPageInfo pInfo = new TabPageInfo(tab.Text,"\n");
                allTabMap.Add(tab, pInfo);
                lineNum = lineNum>pInfo.LineNum?lineNum:pInfo.LineNum;
            }

            foreach (TabPage tab in this.tabMain.TabPages)
            {
                TabPageInfo pInfo = allTabMap[tab];
                tab.Text = pInfo.MaxLine;
            }

            //some thing is wrong, the font height is 14, the padding height is around 9, why?
            tabMain.Padding = new Point(0, Convert.ToInt32(tabMain.Font.Height * (lineNum - 1) * 0.65));
        }

        private void tabMain_DrawItem(object sender, DrawItemEventArgs e)
        {
            TabControl tabControl = (TabControl)sender;
            TabPage currentTab = tabControl.TabPages[e.Index];
            TabPageInfo info = allTabMap[currentTab];
            string tabText = info.AllLine;
            
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;
            sf.LineAlignment = StringAlignment.Center;
            RectangleF tabRect = (RectangleF)e.Bounds;
            RectangleF textRect = tabRect;
            if (e.Index == tabControl.SelectedIndex)
            {
                tabRect.Inflate(1, 1);
            }

            Graphics g = e.Graphics;
            g.Clip = new Region(tabRect);
            g.Clear(Control.DefaultBackColor);
            g.ResetClip();
            g.DrawString(tabText, e.Font, SystemBrushes.ControlText, textRect, sf);
        }
    }

    class TabPageInfo
    {
        public int LineNum
        {
            get
            {
                return nLineNum;
            }
        }

        public String MaxLine
        {
            get
            {
                //prevent auto wrap
                return szMaxLine+"  ";
            }
        }

        public String getLine(int index)
        {
            if (index < nLineNum)
            { 
                return szLines[index];
            }
            else
            {
                return "";
            }
        }

        public String AllLine
        {
            get
            {
                return szAllLine;
            }
        }

        private int nLineNum = 0;
        private String[] szLines;
        private String szAllLine;
        private String szMaxLine;

        public TabPageInfo(String pageTitle, String splitString)
        {
            szAllLine = pageTitle.Replace(splitString, "\n");
            String [] separators = new String[]{splitString};
            szLines = pageTitle.Split(separators,StringSplitOptions.RemoveEmptyEntries);
            nLineNum = szLines.Length;

            int nMaxLineWidth = 0;
            foreach(String line in szLines)
            {
                if (nMaxLineWidth < line.Length)
                {
                    nMaxLineWidth = line.Length;
                    szMaxLine = line;
                }
            }
        }
    }
}