Linux学习-SRPM 的使用 : rpmbuild (Optional)
新版的 rpm 已经 将 RPM 与 SRPM 的指令分开了,SRPM 使用的是 rpmbuild 这个指令,而不是 rpm 喔!
利用默认值安装 SRPM 文件 (--rebuid/--recompile)
假设我下载了一个 SRPM 的文件,又不想要修订这个文件内的原始码与相关的设定值, 那么我可 以直接编译并安装吗?当然可以!利用 rpmbuild 配合选项即可。选项主要有底下两个:
|--|--|
|--rebuild|这个选项会将后面的 SRPM 进行『编译』与『打包』的动作,最后会产生 RPM 的文件,但是产 生的 RPM 文件并没有安装到系统上。当你使用 --rebuild 的时候,最后通常会发现一行字体: Wrote: /root/rpmbuild/RPMS/x86_64/pkgname.x86_64.rpm这个就是编译完成的 RPM 文件啰!这个文件就可以用来安装啦!安装的时候请加绝对路径来安 装即可!|
|--recompile|这个动作会直接的『编译』『打包』并且『安装』啰!请注意, rebuild 仅『编译并打包』而已,而 recompile 不但进行编译跟打包,还同时进行『安装』了!|
安装流程:
- 先下载软件
wget http://vault.centos.org/7.1.1503/updates/Source/SPackages/ntp-4.2.6p5-19.el7.centos.1.src.rpm
- 再尝试直接编译看看
rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
- 上面的动作会告诉我还有一堆相依软件没有安装~所以我得腰安装起来才行:
yum install libcap-devel openssl-devel libedit-devel pps-tools-devel autogen autogen-libopts-devel
- 再次尝试编译的行为:
rpmbuild --rebuild ntp-4.2.6p5-19.el7.centos.1.src.rpm
- 最终的软件就会被放置到:
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-19.el7.centos.1.x86_64.rpm
SRPM 使用的路径与需要的软件
所以首先我们必需要知道,这个 SRPM 在进行编译的时候会使用到哪些目录呢?这样一来才能够来修改嘛!不过从 CentOS6.x 开始 (当然 包含我们的 CentOS 7.x 啰),因为每个用户应该都有能力自己安装自己的软件,因此 SRPM 安装、 设定、编译、最终结果所使用的目录都与操作者的家目录有关~鸟哥假设你用 root 的身份来进行 SRPM 的操作, 那么你应该就会使用到下列的目录喔:
|--|--|
|/root/rpmbuild/SPECS|这个目录当中放置的是该软件的配置文件,例如这个软件的信息参数、设定项目等等都放置在这里;|
| /root/rpmbuild/SOURCES|这个目录当中放置的是该软件的原始文件 (*.tar.gz 的文件) 以及 config 这个配置文件;|
|/root/rpmbuild/BUILD|在编译的过程中,有些暂存的数据都会放置在这个目录当中;|
|/root/rpmbuild/RPMS|经过编译之后,并且顺利的编译成功之后,将打包完成的文件放置在这个目录当 中。里头有包含了 x86_64, noarch.... 等等的次目录。|
|/root/rpmbuild/SRPMS|与 RPMS 内相似的,这里放置的就是 SRPM 封装的文件啰!有时候你想要将你 的软件用 SRPM 的方式释出时, 你的 SRPM 文件就会放置在这个目录中了。|
此外,在编译的过程当中,可能会发生不明的错误,或者是设定的错误,这个时候就会在 /tmp 底下 产生一个相对应的错误档,你可以根据该错误档进行除错的工作呢!等到所有的问题都解决之后, 也编译成功了,那么刚刚解压缩之后的文件,就是在 /root/rpmbild/{SPECS, SOURCES, BUILD} 等等 的文件都会被杀掉,而只剩下放置在 /root/rpmbuild/RPMS 底下的文件了!
尝试将上个练习下载的 ntp 的 SRPM 软件直接安装到系统中 (不要编译),然后查阅一下所有用到的目录为何?
# 1. 鸟哥这里假设你用 root 的身份来进行安装的行为喔!
[root@study ~]# rpm -ivh ntp-4.2.6p5-19.el7.centos.1.src.rpm
Updating / installing...
1:ntp-4.2.6p5-19.el7.centos.1 ################################# [100%]
warning: user mockbuild does not exist - using root
warning: group mockbuild does not exist - using root
# 会有一堆 warning 的问题,那个不要理它!可以忽略没问题的!
# 2. 查阅一下 /root/rpmbuild 目录的内容!
[root@study ~]# ll -l /root/rpmbuild
drwxr-xr-x. 3 root root 39 Sep 8 16:16 BUILD
drwxr-xr-x. 2 root root 6 Sep 8 16:16 BUILDROOT
drwxr-xr-x. 4 root root 32 Sep 8 16:16 RPMS
drwxr-xr-x. 2 root root 4096 Sep 9 09:43 SOURCES
drwxr-xr-x. 2 root root 39 Sep 9 09:43 SPECS # 这个家伙最重要!
drwxr-xr-x. 2 root root 6 Sep 8 14:51 SRPMS
[root@study ~]# ll -l /root/rpmbuild/{SOURCES,SPECS}
/root/rpmbuild/SOURCES:
-rw-rw-r--. 1 root root 559 Jun 24 07:44 ntp-4.2.4p7-getprecision.patch
-rw-rw-r--. 1 root root 661 Jun 24 07:44 ntp-4.2.6p1-cmsgalign.patch
.....(中间省略).....
/root/rpmbuild/SPECS:
-rw-rw-r--. 1 root root 41422 Jun 24 07:44 ntp.spec # 这就是重点!
配置文件的主要内容 (*.spec)
我们知道在 /root/rpmbuild/SOURCES 里面会放置原始档 (tarball) 以及相关的 修补档 (patch file), 而我们也知道编译需要的步骤大抵就是 ./configure, make, make check, make install 等,那这些动作写入在哪里呢? 就在 SPECS 目录中啦!让我们来瞧一瞧 SPECS 里面的文 件说些什么吧!
[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# vim ntp.spec
# 1. 首先,这个部分在介绍整个软件的基本相关信息!不论是版本还是释出次数等。
Summary: The NTP daemon and utilities # 简易的说明这个软件的功能
Name: ntp # 软件的名称
Version: 4.2.6p5 # 软件的版本
Release: 19%{?dist}.1 # 软件的释出版次
# primary license (COPYRIGHT) : MIT # 底下有很多 # 的批注说明!
.....(中間省略).....
License: (MIT and BSD and BSD with advertising) and GPLv2
Group: System Environment/Daemons
Source0: http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2/ntp-%{version}.tar.gz
Source1: ntp.conf # 写 SourceN 的就是原始码!
Source2: ntp.keys # 原始码可以有很多个!
.....(中間省略).....
Patch1: ntp-4.2.6p1-sleep.patch # 接下来则是补丁文件,就是 PatchN 的目的!
Patch2: ntp-4.2.6p4-droproot.patch
.....(中間省略).....
# 2. 這部分則是在設定相依屬性需求的地方!
URL: http://www.ntp.org # 底下则是说明这个软件的相依性,
Requires(post): systemd-units # 还有编译过程需要的软件有哪些等等!
Requires(preun): systemd-units
Requires(postun): systemd-units
Requires: ntpdate = %{version}-%{release}
BuildRequires: libcap-devel openssl-devel libedit-devel perl-HTML-Parser
BuildRequires: pps-tools-devel autogen autogen-libopts-devel systemd-units
.....(中間省略).....
%package -n ntpdate # 其实这个软件包含有很多次软件喔!
Summary: Utility to set the date and time via NTP
Group: Applications/System
Requires(pre): shadow-utils
Requires(post): systemd-units
Requires(preun): systemd-units
Requires(postun): systemd-units
.....(中間省略).....
# 3.编译前的预处理,以及编译过程当中所需要进行的指令,都写在这里
# 尤其 %build 底下的数据,几乎就是 makefile 里面的信息!
%prep # 这部分大多在处理补丁的动作!
%setup -q -a 5
%patch1 -p1 -b .sleep # 这些 patch 当然与前面的 PatchN 有关!
%patch2 -p1 -b .droproot
.....(中間省略).....
%build # 其实就是 ./configure, make 等动作!
sed -i 's|$CFLAGS -Wstrict-overflow|$CFLAGS|' configure sntp/configure
export CFLAGS="$RPM_OPT_FLAGS -fPIE -fno-strict-aliasing -fno-strict-overflow"
export LDFLAGS="-pie -Wl,-z,relro,-z,now"
%configure \ # 不就是 ./configure 的意思吗!
--sysconfdir=%{_sysconfdir}/ntp/crypto \
--with-openssl-libdir=%{_libdir} \
--without-ntpsnmpd \
--enable-all-clocks --enable-parse-clocks \
--enable-ntp-signd=%{_localstatedir}/run/ntp_signd \
--disable-local-libopts
echo '#define KEYFILE "%{_sysconfdir}/ntp/keys"' >> ntpdate/ntpdate.h
echo '#define NTP_VAR "%{_localstatedir}/log/ntpstats/"' >> config.h
make %{?_smp_mflags} # 不就是 make 了吗!
.....(中間省略).....
%install # 就是安装过程所进行的各项动作了!
make DESTDIR=$RPM_BUILD_ROOT bindir=%{_sbindir} install
mkdir -p $RPM_BUILD_ROOT%{_mandir}/man{5,8}
sed -i 's/sntp\.1/sntp\.8/' $RPM_BUILD_ROOT%{_mandir}/man1/sntp.1
mv $RPM_BUILD_ROOT%{_mandir}/man{1/sntp.1,8/sntp.8}
rm -rf $RPM_BUILD_ROOT%{_mandir}/man1
.....(中間省略).....
# 4. 这里列出,这个软件释出的文件有哪些的意思!
%files # 这软件所属的文件有哪些的意思!
%dir %{ntpdocdir}
%{ntpdocdir}/COPYRIGHT
%{ntpdocdir}/ChangeLog
.....(中间省略).....
# 5. 列出这个软件的更改历史纪录文件!
%changelog
* Tue Jun 23 2015 CentOS Sources <bugs@centos.org> - 4.2.6p5-19.el7.centos.1
- rebrand vendorzone
* Thu Apr 23 2015 Miroslav Lichvar <mlichvar@redhat.com> 4.2.6p5-19.el7_1.1
- don't step clock for leap second with -x option (#1191122)
.....(后面省略).....
要注意到的是 ntp.sepc 这个文件,这是主要的将 SRPM 编译成 RPM 的配置文件,他的基本规则可 以这样看:
- 整个文件的开头以 Summary 为开始,这部份的设定都是最基础的说明内容;
- 然后每个不同的段落之间,都以 % 来做为开头,例如 %prep 与 %install 等;
我们来谈一谈几个常见的 SRPM 设定段落:
- 系统整体信息方面:
参数 | 参数意义 |
---|---|
Summary | 本软件的主要说明,例如上表中说明了本软件是针对 NTP 的软件功能与工具等啦! |
Name | 本软件的软件名称 (最终会是 RPM 文件的档名构成之一) |
Version | 本软件的版本 (也会是 RPM 档名的构成之一) |
Release | 这个是该版本打包的次数说明 (也会是 RPM 档名的构成之一)。由于我们想要动点手脚,所以请将 『 19%{?dist}.1 』修改为『 20.vbird 』看看 |
License | 这个软件的授权模式,看起来涵盖了所有知名的 Open source 授权啊!! |
Group | 这个软件在安装的时候,主要是放置于哪一个软件群组当中 (yum grouplist 的特点!); |
URL | 这个原始码的主要官方网站; |
SourceN | 这个软件的来源,如果是网络上下载的软件,通常一定会有这个信息来告诉大家这个原始档的来源! 此外,如果有多个软件来源,就会以 Source0, Source1... 来处理原始码喔! |
PatchN | 就是作为补丁的 patch file 啰!也是可以有好多个! |
BuildRoot | 设定作为编译时,该使用哪个目录来暂存中间文件 (如编译过程的目标文件/链接文件等档)。 |
上述为必须要存在的项目,底下为可使用的额外设定值
|--|--|
|Requires|如果你这个软件还需要其他的软件的支持,那么这里就必需写上来,则当你制作成 RPM 之后,系统 就会自动的去检查啦!这就是『相依属性』的主要来源啰!|
|BuildRequires|编译过程中所需要的软件。Requires 指的是『安装时需要检查』的,因为与实际运作有关,这个 BuildRequires 指的是『编译时』所需要的软件,只有在 SRPM 编译成为 RPM 时才会检查的项目。|
上面几个资料通常都必需要写啦!但是如果你的软件没有相依属性的关系时,那么就可以不需要那个 Requires 啰! 根据上面的设定,最终的档名就会是『{Name}-{Version}-{Release}.{Arch}.rpm』的样 式, 以我们上面的设定来说,档名应该会是『ntp-4.2.6p5-20.vbird.x86_64.rpm』的样子啰!
- %description:
将你的软件做一个简短的说明!这个也是必需要的。还记得使用『 rpm -qi 软件名称 』会出现一些 基础的说明吗? 上面这些东西包括 Description 就是在显示这些重要信息的啦!所以,这里记得要 详加解释喔!
- %prep:
pre 这个关键词原本就有『在...之前』的意思,因此这个项目在这里指的就是『尚未进行设定或安装之前,你要编译完成的 RPM 帮你事先做的事情』,就是 prepare 的简写啰!那么他的工作事项主 要有:
- 进行软件的补丁 (patch) 等相关工作;
- 寻找软件所需要的目录是否已经存在?确认用的!
- 事先建立你的软件所需要的目录,或者事先需要进行的任务
- 如果待安装的 Linux 系统内已经有安装的时候可能会被覆盖掉的文件时,那么就必需要进行备份(backup)的工作了!
- %build:
build 就是建立啊!所以当然啰,这个段落就是在谈怎么 make 编译成为可执行的程序啰! 你会发 现在此部分的程序代码方面,就是 ./configure, make 等项目哩!一般来说,如果你会使用 SRPM 来 进行重新编译的行为, 通常就是要重新 ./configure 并给予新的参数设定!于是这部份就可能会修改到!
- %install:
编译完成 (build) 之后,就是要安装啦!安装就是写在这里,也就是类似 Tarball 里面的 make install 的意思啰!
- %files:
这个软件安装的文件都需要写到这里来,当然包括了『目录』喔!所以连同目录请一起写到这个段落当中!此外,你也可以指定每个文件的类型,包括文件档 (%doc 后面接的) 与 配置文件 (%config 后面接的) 等等。
- %changelog:
这个项目主要则是在记录这个软件曾经的更新纪录啰!星号 (*) 后面应该要以时间,修改者, email 与软件版本来作为说明, 减号 (-) 后面则是你要作的详细说明啰!在这部份鸟哥就新增了两行,内 容如下:
SRPM 的编译指令 (-ba/-bb)
要将在 /root/rpmbuild 底下的数据编译或者是单纯的打包成为 RPM 或 SRPM 时,就需要 rpmbuild 指令与相关选项的帮忙了!我们只介绍两个常用的选项给您了解一下:
[root@study ~]# rpmbuild -ba ntp.spec <==编译并同时产生 RPM 与 SRPM 文件
[root@study ~]# rpmbuild -bb ntp.spec <==仅编译成 RPM 文件
这个时候系统就会这样做:
先进入到 BUILD 这个目录中,亦即是: /root/rpmbuild/BUILD 这个目录;
依照 *.spec 文件内的 Name 与 Version 定义出工作的目录名称,以我们上面的例子为例,那么系统就会 在 BUILD 目录中先删除 ntp-4.2.6p5 的目录,再重新建立一个 ntp-4.2.6p5 的目录,并进入该目录;
在新建的目录里面,针对 SOURCES 目录下的来源文件,也就是 .spec 里面的 Source 设定的那个文件, 以 tar 进行解压缩,以我们这个例子来说,则会在 /root/rpmbuild/BUILD/ntp-4.2.6p5 当中,将 /root/rpmbuild/SOURCES/ntp- 等等多个原始码文件进行解压缩啦!
再来开始 %build 及 %install 的设定与编译!
最后将完成打包的文件给他放置到该放置的地方去,如果你的系统是 x86_64 的话,那么最后编译成功的 *.x86_64.rpm 文件就会被放置在 /root/rpmbuild/RPMS/x86_64 里面啰!如果是 noarch 那么自然就是 /root/rpmbuild/RPMS/noarch 目录下啰!
整个步骤大概就是这样子!最后的结果数据在 RPMS 那个目录底下就对啦!我们这个案例中 想要同时打包 RPM 与 SRPM , 因此请您自行处理一下『 rpmbuild -ba ntp.spec 』吧!
[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# rpmbuild -ba ntp.spec
.....(前面省略).....
Wrote: /root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/sntp-4.2.6p5-20.vbird.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.xZh6yz
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd ntp-4.2.6p5
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/ntp-4.2.6p5-20.vbird.x86_64
+ exit 0
[root@study SPECS]# find /root/rpmbuild -name 'ntp*rpm'
/root/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntpdate-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/x86_64/ntp-debuginfo-4.2.6p5-20.vbird.x86_64.rpm
/root/rpmbuild/RPMS/noarch/ntp-perl-4.2.6p5-20.vbird.noarch.rpm
/root/rpmbuild/RPMS/noarch/ntp-doc-4.2.6p5-20.vbird.noarch.rpm
/root/rpmbuild/SRPMS/ntp-4.2.6p5-20.vbird.src.rpm
# 上面分别是 RPM 与 SRPM 的文件档名!
一个打包自己软件的范例
- 制作原始码文件 tarball 产生:
并没有直接释出 main-0.2,所以假设官网提供的是 main-0.l 版本之外,同时提供了 一个 patch 文件~ 那我们就得要这样作:
main-0.1.tar.gz 放在 /root/rpmbuild/SOURCES/
main_0.1_to_0.2_patch 放在 /root/rpmbuild/SOURCES/
main.spec 自行撰写放在 /root/rpmbuild/SPECS/
# 1. 先来处理原始码的部份,假设你的 /root/rpmbuild/SOURCES 已经存在了喔!
[root@study ~]# cd /root/rpmbuild/SOURCES
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main-0.1.tgz
[root@study SOURCES]# wget http://linux.vbird.org/linux_basic/0520source/main_0.1_to_0.2.patch
[root@study SOURCES]# ll main*
-rw-r--r--. 1 root root 703 Sep 4 14:47 main-0.1.tgz
-rw-r--r--. 1 root root 1538 Sep 4 14:51 main_0.1_to_0.2.patch
接下来就是 spec 文件的建立啰!
- 建立 *.spec 的配置文件
这个文件的建置是所有 RPM 制作里面最重要的课题!你必须要仔细的设定他,不要随便处理!仔 细看看吧!
[root@study ~]# cd /root/rpmbuild/SPECS
[root@study SPECS]# vim main.spec
Name: main
Version: 0.1
Release: 1%{?dist}
Summary: Shows sin and cos value.
Group: Scientific Support
License: GPLv2
URL: http://linux.vbird.org/
Source0: main-0.1.tgz # 这两个档名要正确喔!
Patch0: main_0.1_to_0.2.patch
%description
This package will let you input your name and calculate sin cos value.
%prep
%setup -q
%patch0 -p1 # 要用来作为 patch 的动作!
%build
make clean main # 编译就好!不要安装!
%install
mkdir -p %{buildroot}/usr/local/bin
install -m 755 main %{buildroot}/usr/local/bin # 这才是顺利的安装行为!
%files
/usr/local/bin/main
%changelog
* Wed Sep 09 2015 VBird Tsai <vbird@mail.vbird.idv.tw> 0.2
- build the program
- 编译成为 RPM 与 SRPM
老实说,那个 spec 文件建置妥当后,后续的动作就简单的要命了!开始来编译吧!
[root@study SPECS]# rpmbuild -ba main.spec
.....(前面省略).....
Wrote: /root/rpmbuild/SRPMS/main-0.1-1.el7.centos.src.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/main-debuginfo-0.1-1.el7.centos.x86_64.rpm
- 安装/测试/实际查询
[root@study ~]# yum install /root/rpmbuild/RPMS/x86_64/main-0.1-1.el7.centos.x86_64.rpm
[root@study ~]# rpm -ql main
/usr/local/bin/main <==自己尝试执行 main 看看!
[root@study ~]# rpm -qi main
Name : main
Version : 0.1
Release : 1.el7.centos
Architecture: x86_64
Install Date: Wed 09 Sep 2015 04:29:08 PM CST
Group : Scientific Support
Size : 7200
License : GPLv2
Signature : (none)
Source RPM : main-0.1-1.el7.centos.src.rpm
Build Date : Wed 09 Sep 2015 04:27:29 PM CST
Build Host : study.centos.vbird
Relocations : (not relocatable)
URL : http://linux.vbird.org/
Summary : Shows sin and cos value.
Description :
This package will let you input your name and calculate sin cos value.
# 看到没?属于你自己的软件喔!真是很愉快的啦!
Linux学习-SRPM 的使用 : rpmbuild (Optional)的更多相关文章
- Linux学习日记-使用EF6 Code First(四)
一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是 请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...
- Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码
在上一篇随笔里面详细讲解了Linux系统的启动过程 (Linux学习之CentOS(二十一)--Linux系统启动详解),我们知道Linux系统的启动级别一共有6种级别,通过 /etc/inittab ...
- Linux学习笔记之兄弟连
systemctl --user enable pulseaudio说明:安装完成后系统没有声音,用该命令可以打开.ifconfig eth0 192.168.118.1说明:给网卡设置IP地址.ap ...
- Linux学习内容
Linux学习要点(转载自红联) 一.学习Linux的基本要求1. 掌握至少50个以上的常用命令. 2. 熟悉Gnome/KDE等X-windows桌面环境操作 . 3. 掌握.tgz..rpm等软件 ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- Linux学习心得之 Linux下命令行Android开发环境的搭建
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下命令行Android开发环境的搭建 1. 前言2. Jav ...
- Linux学习心得之 Linux下ant安装与使用
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下ant安装与使用 1. 前言2. ant安装3. 简单的a ...
- 实验楼 linux 学习
实验楼 linux 学习 一.Linux 用户管理 1.查看用户 who am i // who mom likes whoami ====--------====== 输入的第一列表示打 ...
- linux学习网站分享
http://www.zhihu.com/question/19895288 http://linux.vbird.org/ 两个linux学习的网页存起来,以后学习.
随机推荐
- oracle 列转行
with temp as( as S3 from dual union all as S3 from dual ) select * from temp unpivot(Qty for Sizes i ...
- 移动端之js控制rem,适配字体
方法一:设置fontsize 按照iphone 5的适配 1em=10px 适配320 // “()()”表示自执行函数 (function (doc, win) { var docEl = ...
- 5.类型、值和变量-JavaScript权威指南笔记
开始变得有意思起来了,然而第三章还是以基础知识了解的角度阐释相关的概念,并没有深入到结合代码以及要实现的功能讲用法和原理的程度. 1.概论. value:程序的运行是对值的操作. type:能够表示并 ...
- linux下指定特定用户执行命令
虽然很简单但是百度找的大部分不能用,我是没找到,后来从google找到的 sudo -H -u www bash -c 'nohup /home/web/ke/upfileserver /home/w ...
- 不小心踩到的XMAPP的N种问题
1.在win10上的xampp集成环境中安装mongo扩展 按照网上搜索的下载对应文件后,在phpinfo里面还是找不到mongo的扩展信息,后面也是请教同事帮忙解决: http://www.theg ...
- 【extjs6学习笔记】Mastering Ext JS, 2nd Edition
我不知道在别人看来,我是什么样的人:但在我自己看来,我不过就象是一个在海滨玩耍的小孩,为不时发现比寻常更为光滑的一块卵石或比寻常更为美丽的一片贝壳而沾沾自喜,而对于展现在我面前的浩瀚的真理的海洋,却全 ...
- Linux中gzip、bzip2、zip、unzip、tar使用介绍
压缩解压缩命令介绍.gz 压缩为gzip文件.bz2 压缩为bzip2文件.tar 打包文件,将多个文件合并成一个目录.tar.gz 先打成tar包,再压缩为gzip文件.tar.bz2 先打成tar ...
- Spoj REPEATS 后缀自动机+set
REPEATS - Repeats 链接:http://www.spoj.com/problems/REPEATS 题意:求S串中某个子串连续循环次数最多的次数. 想法: 从暴力开始,枚举所有串,求出 ...
- 使用ABAP代码返回S/4HANA Material上维护的Attachment明细
在事务码 MM02里为ID为16的material维护附件: 如何使用ABAP代码获得如下附件的名称和文件内容? REPORT zgos_api. DATA ls_appl_object TY ...
- UVA 11627 Slalom(二分)
二分,判断的时候,一个点一个点的考虑肯定是不行啦,考虑的单位是一个区间, 每次左端点尽量向左边移动,右端点尽量向右,得到下次可以达到的范围,检查一下和下一个区间有没有交集. #include<b ...