zoukankan      html  css  js  c++  java
  • linux基础学习6

    daemon
    可以理解成为service
     
    两大类:
    stand_alone:此 daemon 可以自行单独启动服务,加载到内存后就一直占用内存与系统资源;如 www的httpd ,ftp的vsftpd;
     
    super daemon: 统一daemon负责唤醒其他服务;当没有客户请求的时候,各项服务都是未启动,等到有客户端请求时,super daemon才唤醒相对应的服务,请求结束后,被唤醒的服务也会关闭并释放系统资源;常见的服务如 Telnet;
     
    服务各文件位置
    /etc/service
    各服务的端口号
     
    /etc/init.d/* :        启动脚本放置处
    /etc/sysconfig/* :   各服务的初始化环境配置文件
    /etc/* :                 各服务各自的配置文件
    /var/lib/* :            各服务产生的数据库
     
    启动方式
    stand_alone:
    1.    [root@www ~]#  /etc/init.d/syslog  start
    2.    [root@www ~]#  service  syslog  start
     
    [root@www ~]# service --status-all
    将系统所有的stand_alone的服务状态通通列出来
     
    检查服务是否启动:如atd 
    service --status-all  atd
     
    chkconfig
    管理系统服务默认开机启动与否
    [root@www ~]# chkconfig --list [服务名称]
    [root@www ~]# chkconfig [--level [0123456]] [服务名称] [on|off]
    选项与参数:
    --list : 仅将目前的各项服务状态栏出来
    --level:设定某个服务在该 level 下启动 (on) 或关闭 (off)
     
    开机自启动:
    chkconfig atd on;
     
    chkconfig: 设定自己的系统服务
    [root@www ~]# chkconfig [--add|--del] [服务名称]
    选项与参数:
    --add :增加一个服务名称给 chkconfig 来管理,该服务名称必须在/etc/init.d/ 内
    --del : 删除一个给 chkconfig 管理的服务
    如何让自己的程序成为系统服务让chkconfig来管理:
    只要将该服务加入 init 可以管理的 script 当中,亦即是 /etc/init.d/ 当中即可。
    举个例子,我们在 /etc/init.d/ 里面建立一个 myvbird 档案,该档案仅是一个简单的服务范例,基本上,没有任何用途....对于该档案的必须性是这样的:
     myvbird 将在 run level 3 及 5 启动;
     myvbird 在 /etc/rc.d/rc[35].d 当中启动时,以 80 顺位启动,以 70 顺位结束。顺位在后面会讲到;
    [root@www ~]# vim /etc/init.d/myvbird
    #!/bin/bash
    # chkconfig: 35 80 70
    # description: 没啥!只是用来作为练习用的一个范例
    echo "Nothing"
    #注意:第一,二,三行的格式均要有哦,少一个都不行;
     
    [root@www ~]# chkconfig --list myvbird
    service myvbird supports chkconfig, but is not referenced in any
    runlevel (run 'chkconfig --add myvbird')
    # 尚未加入 chkconfig 的管理机制中!所以需要再动点手脚
    [root@www ~]# chkconfig --add myvbird; chkconfig --list myvbird
    myvbird 0:off 1:off 2:off 3:on 4:off 5:on 6:off
    # 看吧!加入了 chkconfig 的管理当中了!
    # 很有趣吧!如果要将这些数据都删除的话,那举就下达这样的情况:
    [root@www ~]# chkconfig --del myvbird
    [root@www ~]# rm /etc/init.d/myvbird
     
    chkconfig --list | grep atd
    等级说明:
          等级0表示:表示关机
          等级1表示:单用户模式
          等级2表示:无网络连接的多用户命令行模式
          等级3表示:有网络连接的多用户命令行模式
          等级4表示:不可用
          等级5表示:带图形界面的多用户模式
          等级6表示:重新启动
    ps aux | grep atd
     
    netstart 
    这个网络观察指令来检查我们的port,
     
     
    Super daemon :
    服务必须在super daemon配置文件(/etc/xinetd.d)中设定启动该服务才行;
     
    如启动rsync这个服务
    # 1. 先修改配置文件成为启动的模样:
    [root@www ~]# vim /etc/xinetd.d/rsync
    # 请将 disable 那一行改成如下的模样 (原本是 yes 改成 no 就对了)
    service rsync
    {
    disable = no
    ....(后面省略)....
    # 2. 重新启动xinetd 这个服务
    [root@www ~]# /etc/init.d/xinetd restart
    正在停止 xinetd: [ 确定 ]
    正在激活 xinetd: [ 确定 ]
    # 3. 观察启动的端口号
    [root@www ~]# grep 'rsync' /etc/services <==先看看端口号
    rsync 873/tcp # rsync
    rsync 873/udp # rsync
     
    xinetd, TCP Wrappers
    服务的防火墙管理
     
    防火墙分析主要可以透过封包过滤或者是透过软件分析
    linux默认提供一个软件分析的工具:/etc/hosts.deny,/etc/hosts.allow这两种配置文件。另外如果安装 tcp wrappers 还可以增加额外的追踪功能;
     
    /etc/hosts{allow|deny}
    管理默写程序接受或者拒绝来自互联网的联机;任何以xinetd管理的服务都可以透过以上两个文件来设定防火墙。
     
    防火墙
    简单来说就是针对来源IP或者网域进行允许或拒绝的设定
     
    /usr/sbin/tcpd
    用来分析进入系统的 TCP 网络封包的一个软件
    其实/etc/hosts.{allow|deny}这两个也是/usr/sbin/tcpd的配置文件
    TCP 封包的文件头主要记录了来源与目主机的 IP 与 port ,因此 TCP封包并搭配 /etc/hosts.{allow,deny} 的规则比对,就可以决定该联机是否能够进入我们的主机
     
    TCP Wrappers 来控管的就是:
    1. 来源 IP 或/与 整个网域的 IP 网段;
    2. port (就是服务啦,前面有谈到启动某个端口是 daemon 的责任啊)
     
    这么来说只要某个服务受到xinetd管理,或者TCP Wrappers,时就可以 /etc/hosts.{allow,deny} 来处理;
     
    查看是否支持Wrappers:
    范例一:测试一下达成 sshd 及 httpd 这两个程序有无支持 TCP Wrappers 的功

    [root@www ~]# ldd $(which sshd httpd)
    /usr/sbin/sshd:
    libwrap.so.0 => /usr/lib64/libwrap.so.0 (0x00002abcbfaed000)
    libpam.so.0 => /lib64/libpam.so.0 (0x00002abcbfcf6000)
    ....(中间省略)....
    /usr/sbin/httpd:
    libm.so.6 => /lib64/libm.so.6 (0x00002ad395843000)
    libpcre.so.0 => /lib64/libpcre.so.0 (0x00002ad395ac6000)
    ....(底下省略)....
    # 重点在与软件有没有支持 libwrap.so 那个函式库啰
    ldd (library dependency discovery)
    一般用法:主要是查libwrap.so有没有支持这个库
    [root@www ~]# ldd $(which sshd ) | grep libwrap.so
     
    配置文件语法
    这两个档案的设定语法都是一样的,基本上,看起来应该像这样:
    <service(program_name)> : <IP, domain, hostname> : <action>
    <服务 (亦即程序名称)> : <IP  ,领域 或主机名> : < 动作 >
    # 上头的 < > 是不存在与配置文件中的喔!
    第一个是找出你想要管理的那个程序的文件名
    第二个才是写下来你想要放行或者是抵挡的 IP或网域
     
    范例一: rsync 服务,我们将抵挡 127.0.0.100, 127.0.0.200, 及放行140.116.0.0/16
    [root@www ~]# vim /etc/hosts.deny
    rsync : 127.0.0.100 127.0.0.200 : deny
    或:
    [root@www ~]# vim /etc/hosts.deny
    rsync : 127.0.0.100 : deny
    rsync : 127.0.0.200 : deny
     
    需要注意的是:
     写在 hosts.allow 当中的 IP 与网段,为预设『可通行』的意思,亦即最后一个字段 allow 可以不用写;
     而写在 hosts.deny 当中的 IP 与网段则预设为 deny ,第三栏的 deny 亦可省略;
     这两个档案的判断依据是: (1) 以 /etc/hosts.allow 为优先,而 (2) 若分析到的 IP 与网段并没有记录在/etc/hosts.allow ,则以 /etc/hosts.deny 来判断。
     
    特殊参数在第一及第二个字段:
     ALL:代表全部的 program_name 或者是 IP 都接受的意思,例如 ALL: ALL: deny
     LOCAL:代表来自本机的意思,例如: ALL: LOCAL: allow
     UNKNOWN:代表不知道的 IP 或者是 domain 或者是服务时;
     KNOWN:代表为可解析的 IP, domain 等等信息时;
     
    再强调一次,那个 service_name 其实是启动该服务的程序,举例来说, /etc/init.d/sshd 这个 script 里面, 实际上启动ssh 服务的是 sshd 这个程序,所以,你的 service_name 自然就是 sshd;
     
    范例二:
    以 rsync 为例子1. 只允讲 140.116.0.0/255.255.0.0 与 203.71.39.0/255.255.255.0 这两个网域,及 203.71.38.123 这个主机可以进入我们的 rsync 服务器;2. 此外,其他的 IP 全部都挡掉!
    [root@www ~]# vim /etc/hosts.allow
    rsync: 140.116.0.0/255.255.0.0
    rsync: 203.71.39.0/255.255.255.0
    rsync: 203.71.38.123
    rsync: LOCAL
    [root@www ~]# vim /etc/hosts.deny
    rsync: ALL <==利用 ALL 设定让所有其他来源不可登入
     
    TCP Wrappers 特殊功能:
    更加细部的主要动作则有:
     spawn (action)可以利用后续接的 shell 来进行额外的工作,且具有变量功能,主要的变量内容为: %h (hostname), %a(address), %d (daemon)等等;
     twist (action)立刻以后续的指令进行,且执行完后终止该次联机的要求 (DENY)
     
    追踪扫描者IP,并警告扫描者:
    1. 利用 safe_finger 去追踪出对方主机的信息 (包括主机名、用户相关信息等);2. 将该追踪到的结果以 email 的方式寄给我们本机的 root ;3. 在对方屏幕上面显示不可登入且警告他已经被记录的讯息
    由于是抵挡的机制,因此我们这个 spawn 与 twist 的动作大多是写在 /etc/hosts.deny 档案中的。我们将上述的动作写成类似如下的东东:
    [root@www ~]# vim /etc/hosts.deny
    rsync : ALL: spawn (echo "security notice from host $(/bin/hostname)" ;
    echo; /usr/sbin/safe_finger @%h ) |
    /bin/mail -s "%d-%h security" root &
    : twist ( /bin/echo -e " WARNING connection not allowed. " )
    可见safe_finger是一个可执行的程序;
     
    解析:
    1. rsync:指的就是 rsync 这个服务的程序啰;
    2. ALL: 指的是来源,这个范围指的当然是全部的所有来源啰,因为是 ALL
    3. spawn (echo "security notice from host $(/bin/hostname)" ; echo ; /usr/sbin/safe_finger @%h ) | /bin/mail-s "%d-%h security" root &: 由于要将一些侦测的数据送给 root 的邮件信箱,因此需要使用数据流汇整的括号( ),括号内的重点在于 safe_finger 的项目,他会侦测到客户端主机的相关信息,然后使用管线命令将这些数据送给 mail 处理, mail 会将该信息以标头为 security 的字样寄给 root 啦!由于spawn 只是中间的过程,所以还能够有后续的动作
    4. twist ( /bin/echo -e " WARNING connection not allowed. " ): 这个动作会将 Warning 的字样传送到客户端然后中断联机;
     
     
     
    认识与分析登陆档
    简单来说就是记录系统在什么时候由哪个程序做了什么样的行为时,发生了何种的事件
     
    登陆档的重要性:
    1.解决系统方面的错误    举例来说 某些硬件侦测不到导致某些程序无法启动,那么可以查询登陆文件,来查看该硬件到底出了什么问题;
    2.解决网络服务的问题    举例来说 无法启动邮件服务 那么查询一下/var/log/maillog通常可以得到不错的解答
    3. 过往事件记录簿         举例来说  WWW服务 (apache 软件) 在某个时刻流量特别大, 可以透过登录档去找出该时段是哪些 IP 在联机与查询的网页数据为何,就能够知道原因
     
    Linux 常见的登录档名
    /var/log/cron               crontab 排程有没有实际被进行? 进行过程有没有发生错误?/etc/crontab 是否撰写正确?
    /var/log/dmesg            记录系统在开机的时候核心侦测过程所产生的各项信息。
    /var/log/lastlog            可以记录系统上面所有的账号最近一次登入系统时的相关信息。
    /var/log/maillog 或/var/log/mail/*   记录邮件的往来信息,其实主要是记录 sendmail (SMTP 协议提供者) 与 dovecot (POP3 协议提供者) 所产生的讯息啦。 SMTP 是发信                                                    所使用的通讯协议, POP3 则是收信使用的通讯协议。 sendmail 与 dovecot 则分别是两套达成通讯协议的软件。
    /var/log/messages        档案相当的重要,几乎系统发生的错误讯息 (或者是重要的信息) 都会记录在这个档案中; 如果系统发生莫名的错误时,这个档案是一定要查阅的登录档
    /var/log/secure            基本上,只要牵涉到『需要输入账号密码』的软件,那举当登入时 (不管登入正确或错误) 都会被记录在此档案中。 包括系统的 login 程序、图形接口登                                  入所使用的 gdm 程序、 su, sudo 等程序、还有网络联机的 ssh,telnet 等程序, 登入信息都会被记载在这里;
    /var/log/wtmp, /var/log/faillog        这两个档案可以记录正确登入系统者的帐户信息 (wtmp) 与错误登入时所使用的帐户信息 (faillog) ! 我们在第十一章谈到的 last 就是读                                                    取 wtmp 来显示的, 这对与追踪一般账号者的使用行为很有帮助!
    /var/log/httpd/*, /var/log/news/*, /var/log/samba/*
                                                       不同的网络服务会使用它们自己的登录档案来记载它们自己产生的各项讯息!上述的目录内则是个别服务所制订的登录档。
     
    登陆档的产生
    1. 由软件开发商自行定义写入的登录档与相关格式, 例如 WWW 软件 apache 就是这样处理的;
    2. 由 Linux distribution 提供的登录档管理服务来统一管理。 你只要将讯息丢给这个服务后,他就会自己分门别类的将各种讯息放置到相关的登录档去!CentOS 提供 syslogd 这个服务来统一管理登录档
    klogd:专门记录核心信息的登录文件服务。
    所以说,登录档所需的服务主要就是 syslogd 与 klogd 这两者。
     
    logrotate
    登录档轮替    自动化处理登录文件容量与更新的问题
     
    总结一下,针对登录文件所需的功能,我们需要的服务与程序有:
     syslogd:  主要登录系统与网络等服务的讯息;
     klogd:     主要登录核心产生的各项信息;
     logrotate:主要在进行登录文件的轮替功能。
     
    规划使用上述三个文档:
    syslogd :记录登录文件的服务
    登录档内容的一般格式:
     事件发生的日期与时间;
     发生此事件的主机名;
     启动此事件的服务名称 (如 samba, xinetd 等) 或函式名称 (如 libpam ..);
     该讯息的实际数据内容。
    举例:登陆记载账户信息的/var/log/secure
     
    [root@www ~]# cat /var/log/secure
    1 Mar 14 15:38:00 www atd[18701]: pam_unix(atd:session): session opened for user root by (uid=0)
    2 Mar 14 15:38:00 www atd[18701]: pam_unix(atd:session): session closed for user root
    我们拿第一笔数据来说明好了,该资料是说:『 在三月 14 日 (Mar 14) 的下午 15:38 分,由 www 这部主机的 atd[PID 为 18701] 传来的消息,这个消息是透过 pam_unix 这个模块所提出的。讯息内容为 root (uid=0) 这个账号已经开启 atd 的活动了。 』
     
    /var/log/messages 作为一个系统管理员一定要关注,尤其是发生以下情况时:
     当你觉得系统似乎不太正常时;
     某个 daemon 老是无法正常启动时;
     某个使用者老是无法登入时;
     某个 demon 执行过程老是不顺畅时;
     
    /etc/syslog.conf
    syslogd的配置文件
    这个档案规定了『 (1)什么服务 (2)的什么等级讯息 (3)需要被记录在哪里(装置或档案)』
     
    登录档的安全性设置
    设置隐藏属性lsattr与chattr,将登陆文档设置成【 只能增加,不能删除的属性】
    注意: syslog 的登录档只要『被编辑过,如vim查看以:wq离开』就无法继续记录! 所以才会导致不能记录的问题。此时你得要重新启动syslog让他再继续提供服务;
    [root@www ~]# chattr +a /var/log/messages
    [root@www ~]# lsattr /var/log/messages
    -----a------- /var/log/messages
    root 以『chattr  -a /var/log/messages 』取消这个 a 的参数后,才能被删除或移动;
    当我们进行登录档案轮替时 (logrotate) ,将会无法移动该登录档的档名呢!所以会造成很大的困扰。这个困扰虽然可以使用 logrotate 的配置文件来解决
     
    登录档服务器的设定
    让某一部主机当成 『登录文件朋务器』,用他来记录所有的linux 主机信息;这样既备份了各主机的登陆档,也方便查看每一部主机的登陆档;
     
    CentOS 5.x 预设的 syslog 本身就已经具有这个登录文件服务器的功能了, 只是默认并没有启动该功能而已。你可以透过 man syslogd 去查询一下相关的选项就能够知道啦! 既然是登录档服务器,那么我们的 Linux 主机当然会启动一个端口来监听了,那个预设的端口就是 UDP 的 514 ;
    登录档服务器的架构
    如上图所示,服务器会启动监听的端口,客户端则将登录档再转出一份送到服务器去。 而既然是登录档『服务器』,所以当然有服务器与客户端 (client) 啰!这两者的设定分别是这样的:
    # 1. Server 端:修改 syslogd 的启动配置文件,通常在 /etc/sysconfig 内!
    [root@www ~]# vim /etc/sysconfig/syslog
    # 找到底下这一行:
    SYSLOGD_OPTIONS="-m 0"
    # 改成底下这样子!
    SYSLOGD_OPTIONS="-m 0 -r"
    # 2. 重新启动与观察 syslogd 喔!
    [root@www ~]# /etc/init.d/syslog restart
    [root@www ~]# netstat -lunp | grep syslog
    Proto Recv-Q Send-Q Local Address Foreign Address State
    PID/Program name
    udp 0 0 0.0.0.0:514 0.0.0.0:* 13981/syslogd
    # 嘿嘿!你的登录文件主机已经设定妥当啰!很简单吧!
    client 端的设定就简单多了!只要指定某个信息传送到这部主机即可! 举例来说,我们的登录档服务器 IP 为192.168.1.100 ,而 client 端希望所有的数据都送给主机, 所以,可以在 /etc/syslog.conf 里面新增这样的一行:
    [root@www ~]# vim /etc/syslog.conf
    *.* @192.168.1.100
    再重启syslogd这个服务就可以了;
     
    logrotate
    登录档的轮替
    在规定的时间到了之后才来进行登录档的轮替,所以当然是挂在cron底下的;
     
    logrotate 的配置文件
     /etc/logrotate.conf
     /etc/logrotate.d/
    logrotate.conf 才是主要的参数档案,至于 logrotate.d 是一个目录, 该目录里面的所有档案都会被主动的读入 /etc/logrotate.conf 当中来进行!另外,在 /etc/logrotate.d/ 里面的档案中,如果没有规定到的一些细部设定,则以 /etc/logrotate.conf 这个档案的规定来设定为默认值
    logrotate 的主要功能就是将旧的登录档案移动成旧档, 并且重新建立一个新的空的档案来记录,他的执行结果有点类似底下的图示:
     
    如果遇到 chattr +a 的文档则在 配置文档中加入指令的具体参数如下:
    o prerotate:在启动 logrotate 之前进行的指令,例如修改登录文件的属性等动作;
    o postrotate:在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务!
    o Prerotate 与 postrotate 对与已加上特殊属性的档案处理上面,是相当重要的执行程序!
    当然也可以将自定义文档设置自动轮替功能;
     
    logwatch
    分析登录档程序
    鸟哥写的登录档分析工具:
    这支程序分析的登录文件数据其实是固定的,包括有:
     /var/log/secure
     /var/log/messages
     /var/log/maillog
    还有包括各个主要常见的服务,如 pop3, mail, ftp, su 等会使用到 pam 的服务, 都可以透过鸟哥这个小程序来分析与处理~整个数据还会输出一些系统信息。如果你想要使用这个程序的话, 欢迎下载:
     http://linux.vbird.org/download/index.php?action=detail&fileid=69
    安装的方法:只要将上述档案下载并解压缩后,就会得到一个名为 logfile 的目录, 将此目录移动到/usr/local/virus/ 目录下并修改一下: /usr/local/virus/logfile.sh 档案, 里面的 email相关的信息要修改一下
     
     
    总结
    • 服务两大类
      • stand_alone
        • 独自启动,加载到内存后一直占用资源
        • 如httpd,vsftpd
        • 服务的启动,状态
          • /etc/init.d/atd start/restart/stop
          • service --status-all 服务名(atd)
        • chkconfig,管理系统服务默认开机与否
          • chkconfig --list [服务名称]
          • chkconfig [--level [0123456]] [服务名称] [on|off]
          • 增加或删除一个服务让chkconfig管理
            •   chkconfig [--add|--del] [服务名称]
          • 将自己的服务交给chkconfig管理
            • 在 /etc/init.d 建立自己服务脚本 如my
            • 将my添加到chkconfig中
          • chkconfig等级说明
            • 0:表示关机
            • 1:单用户模式
            • 2:无网络连接的多用户命令行模式
            • 3:有网络连接的多用户命令行模式
            • 4:不可用
            • 5:带图形界面的多用户模式
            • 6:重新启动
      • super daemon
        • super daemon 负责唤醒其他服务,相当于一个服务管理员
        • 客户端请求时,super daemon 才会去唤醒想要服务,如Telnet请求
        • 服务必须在super daemon(/etc/xinetd.d)配置文件中设定启动该服务才行,如配置Telnet 则在/etc/xinetd.d/telnet
        • super daemon 的服务是/etc/xinetd.d
    • 服务的防火墙管理
      • 简单来说就是针对来源IP或网域或封包请求进行允许或拒绝;
      • Linux默认封包过滤
        • /etc/hosts.deny,/etc/hosts.allow
          • 管理程序接受或拒绝来自互联网的联机
          • 任何以super daemon 即 使用xinetd管理的服务都可以用这个配置文件来设定防火墙
          • 配置文件运行规则
            • 先检查deny,再检查allow,allow可以越过deny的限制;
            • 所以deny,allow都没有的是可以予以放行的。
            • 与/etc/at.allow 的/etc/at.deny原理区别
              • /etc/at.allow 存在则以它为准,不存在才参照/etc/at.deny;两文件都没有,就只有root能使用。
              • /etc/hosts.deny与/etc/hosts.allow都需存在且都会检测到。先deny,在allow两者有冲突,以allow为准;IP不存在两个文件中,则会放行的;
      • TCP Wrappers
        • 可用于追踪
          • safe_finger追踪对方主机的信息
          • twist,spawn(action),接shell进行额外工作
        • 管控
          • 来源IP或整个网域的IP网段
          • port(就是服务)
        • 同样是利用/etc/hosts.deny /etc/hosts.allow,且服务也应该是super daemon 服务。
      • 认识与分析登录档
        • 简单来说就是记录系统在什么时候由那个程序做了什么样的行为,发生了何种事情
        • 常见登录档名
          • /var/log/cron       crontab相关信息
          • /var/log/dmesg    开机时核心侦测过程所产生的信息
          • /var/log/lastlog    系统所有账号最近一次登录系统时的相关信息
          • /var/log/maillog   邮件往来信息
          • /var/log/messages  相当重要,系统发生错误都会记录;包括服务运行不顺等等。
          • /var/log/secure       涉及到需要输入账号密码的软件,正确或错误都会记录,如su ,sudo ,ssh,telnet,等等;
        • 产生登录档的服务syslogd,klogd(核心信息登录文件)
        • logrotate
          • 登录档轮替,自动化处理登录文件容量与更新问题
        • 登录档的安全性设置
          • 设置隐藏属性,设置成只能增加,不能删除的属性
          • lsatter,chattr
          • chattr +a  /var/log/messages
        • 注意:syslog的登录档只要被编辑过,如vim查看以:wq离开就无法记录;需要重新启动syslog服务才能继续记录;
      • 登录档服务器的设定
        • 让某部主机当成登录档服务器,用他来记录所有的Linux主机信息,这样既备份了个主机的登录档,也方便查看每一部主机的登录档。
     
  • 相关阅读:
    程序员通过什么渠道接外包项目
    中小型软件项目开发一般流程建议
    DevExpress GridControl功能总结
    页面UI注意事项,你在乎吗?
    加密,解密
    本地化(国际化)
    AutoLayout(自动布局)
    UItableView与UICollectionView
    分享iOS开发常用(三方类库,工具,高仿APP,实用网站,技术干货)
    NSPredicate
  • 原文地址:https://www.cnblogs.com/Aiapple/p/4910526.html
Copyright © 2011-2022 走看看