YoursafINside Hard hard study , day day up !

2十/110

vsftpd 设置

ASDF

chroot_local_user=YES  #将所有用户限制在家目录中,不能访问上级目录。

listen=<YES/NO> :设置为YES时vsftpd以独立运行方式启动,设置为NO时以xinetd方式启动(xinetd是管理守护进程的,将服务集中管理,可以减少大量服务的资源消耗)
listen_port=<port> :设置控制连接的监听端口号,默认为21
listen_address=<ip address> :将在绑定到指定IP地址运行,适合多网卡
connect_from_port_20=<YES/NO> :若为YES,则强迫FTP-DATA的数据传送使用port 20,默认YES
pasv_enable=<YES/NO> :是否使用被动模式的数据连接,如果客户机在防火墙后,请开启为YES
pasv_min_port=<n>
pasv_max_port=<m> :设置被动模式后的数据连接端口范围在n和m之间,建议为50000-60000端口
message_file=<filename> :设置使用者进入某个目录时显示的文件内容,默认为 .message
dirmessage_enable=<YES/NO> :设置使用者进入某个目录时是否显示由message_file指定的文件内容
ftpd_banner=<message> :设置用户连接服务器后的显示信息,就是欢迎信息
banner_file=<filename> :设置用户连接服务器后的显示信息存放在指定的filename文件中
connect_timeout=<n> :如果客户机连接服务器超过N秒,则强制断线,默认60
accept_timeout=<n> :当使用者以被动模式进行数据传输时,服务器发出passive port指令等待客户机超过N秒,则强制断线,默认60
accept_connection_timeout=<n> :设置空闲的数据连接在N秒后中断,默认120
data_connection_timeout=<n> : 设置空闲的用户会话在N秒后中断,默认300
max_client=<n> : 在独立启动时限制服务器的连接数,0表示无限制
max_per_ip=<n> :在独立启动时限制客户机每IP的连接数,0表示无限制(不知道是否跟多线程下载有没干系)
local_enable=<YES/NO> :设置是否支持本地用户帐号访问
guest_enable=<YES/NO> :设置是否支持虚拟用户帐号访问
write_enable=<YES/NO> :是否开放本地用户的写权限
local_umask=<nnn> :设置本地用户上传的文件的生成掩码,默认为077
local_max_rate<n> :设置本地用户最大的传输速率,单位为bytes/sec,值为0表示不限制
local_root=<file> :设置本地用户登陆后的目录,默认为本地用户的主目录
chroot_local_user=<YES/NO> :当为YES时,所有本地用户可以执行chroot
chroot_list_enable=<YES/NO>
chroot_list_file=<filename> :当chroot_local_user=NO 且 chroot_list_enable=YES时,只有filename文件指定的用户可以执行chroot
anonymous_enable=<YES/NO> :设置是否支持匿名用户访问
anon_max_rate=<n> :设置匿名用户的最大传输速率,单位为B/s,值为0表示不限制
anon_world_readable_only=<YES/NO> 是否开放匿名用户的浏览权限
anon_upload_enable=<YES/NO> 设置是否允许匿名用户上传
anon_mkdir_write_enable=<YES/NO> :设置是否允许匿名用户创建目录
anon_other_write_enable=<YES/NO> :设置是否允许匿名用户其他的写权限(注意,这个在安全上比较重要,一般不建议开,不过关闭会不支持续传)
anon_umask=<nnn> :设置匿名用户上传的文件的生成掩码,默认为077

==匿名用户==
先备份
<pre>sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.old
2十/110

FVWM鼠标设定

ASDF

FVWM 鼠标操作设定

在FVWM中,可以设定鼠标快捷键,即鼠标某个键按下时让FVWM执行指定的命令。配置的一般格式如下:

Mouse [(window)] Button Context Modifiers Function
  • Mouse: 是FVWM的关键字,表示这一行的内容是设定鼠标操作。
  • (window): 可选的窗口参数,表示对标题匹配的窗口进行设定。注意圆括号在配置文件中不能省。
  • Button: 鼠标按键编号。注意只有编号15是X11完全支持的,更大的编号可能只是部分支持,默认最大编号不超过9。编号 1 表示左键,编号 2 表示中键,编号 3 表示右键,编号 4 表示滚轮向上滚动,编号 5 表示滚轮向下滚动。另外,编号 0 表示任意一个鼠标键被按下。
  • Context: 按键事件发生的上下文。'R' 表示根窗口,'W' 表示应用程序窗口,'D' 表示桌面应用程序(例如 kdesktop 或 Nautilus 桌面),'T' 表示窗口的标题栏,'S' 表示窗口的上下左右边界,'[', ']', '-', '_' 四个字符分别表示窗口的左、右、上、下边界,'F' 表示窗口的框架四个角,'<', '^', '>', 'v' 四个字符分别表示窗口的左上、右上、右下和左下角,'I' 表示图标化的窗口,'0' 到 '9' 表示标题栏的按钮,'A' 表示任意上下文。这些字符是可以组合的,例如 "FST" 表示窗口的四周以及四角除去标题栏的按钮。注意,这里所谓的应用程序窗口是指获得焦点的窗口。
  • Modifiers: 表示控制键的按键情况。'N' 表示没有控制键按下,'C' 表示 Ctrl 键,'S' 表示 Shift 键,'M' 表示 Meta 键,'L' 表示 Caps Lock 键,'A' 表示任意控制键。这些字符是可以组合的,例如 "CM" 表示同时按下 Ctrl 键和 Meta 键。注意,默认情况下 'L' 是被忽略的,如果想打开它,使用IgnoreModifiers 命令。
  • Function: 执行的函数。如果这一项设置为'-',则取消先前绑定的键盘操作。

一些简单的配置:

######### Mouse Binding #########
#Mouse [(window)] Button Context Modifiers Function
###############################

#   window op menu
Mouse 1 1 A FuncFvwmWindowOpsOrAction Delete

#   title bindings
Mouse 1 T N FuncFvwmTitleBindings

有两种类型的绑定,绑定至鼠标,或绑定到键盘。要想理解这是怎么回事,先看只拥有一个窗口,二个图标化窗口的典型屏幕。在下面的图中,注意屏幕是如何被分 割成以下几部分的:R - 根窗口,I - 图标,F - 窗口边角,S - 窗口边缘,T - 标题栏,W - 程序窗口,还有0-9 这些是按钮。注意:A代表任意地方,即不管鼠标在哪里。绑定需如此设定。你可以绑定到键盘,用'Key X Context Modifier Action',或者用'Mouse X Context Modifier Action' 绑定至鼠标。Context 是指如上所示的当前鼠标位置,Modifier 是如下任意组合:(A)ny, (C)ontrol, (S)hift, (M)eta, (N)othing, 或1-5, 代表X Modifiers mod1-mod5 (man xmodmap)。绑定的例子:

代码:
##### # Basic Bindings ########### Key F1 A M Menu MenuFvwmRoot Key Tab A M WindowList Root c c NoDeskSort, SelectOnRelease Meta_L Key Super_L A A FvwmATerm Mouse 1 R A Menu FvwmRootMenu Mouse 3 R A Menu FvwmWindowOpsMenu Mouse 1 1 A FvwmDeleteOrDestroy Mouse 1 3 A FvwmIconifyOrShade Mouse 1 5 A FvwmMaximize 100 100 Mouse 2 5 A FvwmMaximize 0 100 Mouse 3 5 A FvwmMaximize 100 0 Mouse 1 W M FvwmMoveOrIconify Mouse 1 I A FvwmMoveOrIconify Mouse 4 T A FvwmWindowShade True Mouse 5 T A FvwmWindowShade False

从上到下的绑定分别做以下这些事:

1. 任何地方按下 alt-f1 时显示根菜单
2. 按下 alt-tab 时显示 WindowList - 列出运行着的程序,松开 alt 键时切换到你选中的程序
3. 按下左边的 win 键时启动 aterm
4. 当鼠标左键在根窗口上点击时,打开根菜单
5. 当鼠标右键在根窗口上点击时,打开窗口选项菜单
6. 当按钮 1 被单击或双击时删除或销毁窗口
7. 当按钮 3 被单击或双击时图标化或卷起窗口
8. 当鼠标按键一(左键)点击按钮 5 时,最大化窗口至充满整个屏幕
9. 当鼠标按键二(中键)点击按钮 5 时,垂直最大化窗口
10. 当鼠标按键三(右键)点击按钮 5 时,水平最大化窗口(译者注:鼠标按键可人为定义,因此可能不同的机器上不一样,如果你不是左撇子的话就没必要自定义默认的鼠标按键。像我有时用左手就要自定义了!;-)
11. alt+按着左键并移动鼠标可拖动窗口,而 alt+双击会图标化窗口
12. 将 FvwmMoveOrIconify 函数绑定至 'Icons',以便能进行移动和图标化
13. 向上滚动两次滚轮卷起活动窗口(这个函数要求双击,因此要滚两下)
14. 向下滚动两次滚轮放下活动窗口

20九/110

一些CSS样式

ASDF
附注:一些CSS样式的含义

.has-js {
	background:#fff;
	width:75%;
	padding:0px 0px 2px 0px;
	height:18px;
	margin-bottom:5px;
	float:left;
	border-bottom:1px solid #999;
}//外框设置

.news1 em {
	color:blue;
	padding:0 0 0 5px;
	font-style:normal;
} //">>"符号的定义

#ticker-content A{
	text-decoration:none;
	color:red;
} //打字效果的文字定义

#ticker-swipe{
	padding-top:5px;
	position:absolute;
	top:0;
	left:80px;
	background-color:#fff;
	display:block;
	width:800px;
	height:23px
}//光标设置

20九/110

WordPress 打字特效显示最新帖子的实现

ASDF

1、编辑header.php,在最下边一行添加

<?php require_once TEMPLATEPATH . '/news_ticker/news_ticker.php' ; ?>
2、创建news_ticker.php,内容如下:
<script type="text/javascript" src="<?php echo get_template_directory_uri(); ?>/news_ticker/newsticker_jquery.ticker.js"></script>
<script type="text/javascript" src="<?php echo get_template_directory_uri(); ?>/news_ticker/newsticker_ticker-style.css"></script>
<?php
  $cat_id = '';
  $cat_name = '';
  $cat_link = '';

  $args = array( 'cat' => $cat_id,
                'orderby'=>'ID',
                'order' => 'DESC',
                'posts_per_page' => 5,//控制可以显示最新文章的数目
                'ignore_sticky_posts' => 1
              );
  $the_query = new WP_Query($args);
 ?>
     <div id="ticker-wrapper" class="has-js">
       <b class="news1">
         <a href="<?php echo $cat_link; ?>"><?php
          if (strlen($cat_name) > 10) {
            echo substr($cat_name, 0, 10) . '..';
          } else {
            echo $cat_name;
          } ?>
          </a>
            </b>
       <ul id="js-news" class="js-hidden"> <?php
         while ($the_query->have_posts()) {
           $the_query->the_post();?>
           <li class="news-item"><a href="<?php the_permalink(); ?>"><?php echo the_title(); ?></a></li><?php
         } ?>
       </ul>
     </div>
3、编辑functions.php,加入以下代码:
  function newsticker_custom_theme_scripts() {

     wp_enqueue_script( 'jquery');

    wp_enqueue_script( 'jquery.ticker.min', get_template_directory_uri() . '/news_ticker/newsticker_jquery.ticker.js' );

  }
  function newsticker_print_styles() {
  	    wp_register_style('newsticker_tickerstyle', get_template_directory_uri() . 'news_ticker/newsticker_ticker-style.css');
     wp_enqueue_style('newsticker_tickerstyle');

  }
  function newsticker_myheader() {
 { ?>
					<script type="text/javascript">
						jQuery(function () {
							jQuery('#js-news').ticker({speed: 0.100});
						});
					</script> <?php
				}

}
add_action( 'wp_print_scripts', 'newsticker_custom_theme_scripts');
add_action( 'wp_print_styles', 'newsticker_print_styles');
add_action( 'wp_head', 'newsticker_myheader');
4、编辑style.css,加入以下内容
.has-js {
	background:#fff;
	width:75%;
	padding:0px 0px 6px 0px;
	height:18px;
	margin-bottom:5px;
	float:left;
	border-bottom:1px solid #999;
}
.news1 {
	float: left;
	color:#333;
}
.news1 a {
	color:#333;
}
.news1 em {
	color:#005C91;
	padding:0 0 0 0px;
	font-style:normal;
	font-size:13px;
	position:relative;top:2px;
}
5、创建/news_ticker/newsticker_jquery.ticker.js文件,内容如下:
(function($){
  $.fn.ticker = function(options) {
    // Extend our default options with those provided.
    // Note that the first arg to extend is an empty object -
    // this is to keep from overriding our "defaults" object.
    var opts = $.extend({}, $.fn.ticker.defaults, options);

    /* Get the id of the UL to get our news content from */
    var newsID = '#' + $(this).attr('id');

    /* Get the tag type - we will check this later to makde sure it is a UL tag */
    var tagType = $(this).get(0).tagName;
    return this.each(function() {
      /* Internal vars */
      var settings = {
        position: 0,
        time: 0,
        distance: 0,
        newsArr: {},
        play: true,
        paused: false,
        contentLoaded: false,
        dom: {
          contentID: '#ticker-content',
          titleID: '#ticker-title',
          titleElem: '#ticker-title SPAN',
          tickerID : '#ticker',
          wrapperID: '#ticker-wrapper',
          revealID: '#ticker-swipe',
          revealElem: '#ticker-swipe SPAN',
          controlsID: '#ticker-controls',
          prevID: '#prev',
          nextID: '#next',
          playPauseID: '#play-pause'
        }
      };

      // if we are not using a UL, display an error message and stop any further execution
      if (tagType != 'UL' && opts.htmlFeed === true) {
        debugError('Cannot use <' + tagType.toLowerCase() + '> type of element for this plugin - must of type <ul>');
        return false;
      }

      // lets go...
      initialisePage();
      /* Function to get the size of an Object*/
      function countSize(obj) {
          var size = 0, key;
          for (key in obj) {
              if (obj.hasOwnProperty(key)) size++;
          }
          return size;
      };
      /* Function for handling debug and error messages */
      function debugError(obj) {
        if (opts.debugMode) {
          if (window.console && window.console.log) {
            window.console.log(obj);
          }
          else {
            alert(obj);
          }
        }
      }
      /* Function to setup the page */
      function initialisePage() {
        // add our HTML structure for the ticker to the DOM
        $(settings.dom.wrapperID).append('<div id="' + settings.dom.tickerID.replace('#', '') + '"><div id="' + settings.dom.titleID.replace('#', '') + '"><span style="display: none;"><!-- --></span></div><p id="' + settings.dom.contentID.replace('#', '') + '"></p><div id="' + settings.dom.revealID.replace('#', '') + '"><span style="display: none;"><!-- --></span></div></div>');
        $(settings.dom.wrapperID).removeClass('no-js').addClass('has-js');
        // hide the ticker
        $(settings.dom.tickerElem + ',' + settings.dom.titleElem + ',' + settings.dom.contentID).hide();
        // add the controls to the DOM if required
        if (opts.controls) {
          // add related events - set functions to run on given event
          $(settings.dom.controlsID).live('click mouseover mousedown mouseout mouseup', function (e) {
            var button = e.target.id;
            if (e.type == 'click') {
              switch (button) {
                case settings.dom.prevID.replace('#', ''):
                  // show previous item
                  settings.paused = true;
                  $(settings.dom.playPauseID).addClass('paused');
                  changeContent(button);
                  break;
                case settings.dom.nextID.replace('#', ''):
                  // show next item
                  settings.paused = true;
                  $(settings.dom.playPauseID).addClass('paused');
                  changeContent(button);
                  break;
                case settings.dom.playPauseID.replace('#', ''):
                  // play or pause the ticker
                  if (settings.play == true) {
                    settings.paused = true;
                    $(settings.dom.playPauseID).addClass('paused');
                    pauseTicker();
                  }
                  else {
                    settings.paused = false;
                    $(settings.dom.playPauseID).removeClass('paused');
                    restartTicker();
                  }
                  break;
              }
            }
            else if (e.type == 'mouseover' && $('#' + button).hasClass('controls')) {
              $('#' + button).addClass('over');
            }
            else if (e.type == 'mousedown' && $('#' + button).hasClass('controls')) {
              $('#' + button).addClass('down');
            }
            else if (e.type == 'mouseup' && $('#' + button).hasClass('controls')) {
              $('#' + button).removeClass('down');
            }
            else if (e.type == 'mouseout' && $('#' + button).hasClass('controls')) {
              $('#' + button).removeClass('over');
            }
          });
          // add controls HTML to DOM
          $(settings.dom.wrapperID).append('<ul id="' + settings.dom.controlsID.replace('#', '') + '"><li id="' + settings.dom.playPauseID.replace('#', '') + '"></li><li id="' + settings.dom.prevID.replace('#', '') + '"></li><li id="' + settings.dom.nextID.replace('#', '') + '"></li></ul>');
        }
        // add mouse over on the content
        $(settings.dom.contentID).mouseover(function () {
          if (settings.paused == false) {
            pauseTicker();
          }
        }).mouseout(function () {
          if (settings.paused == false) {
            restartTicker();
          }
        });
        // start the first ticker item
        updateTicker();
      }
      /* Start the ticker */
      function updateTicker() {
        // check to see if we need to load content
        if (settings.contentLoaded == false) {
          // construct content
          if (opts.ajaxFeed) {
            // to do - add ajax options (json, remote url)
            debugError('Code Me!');
          }
          else if (opts.htmlFeed) {
            if($(newsID + ' LI').length > 0) {
              $(newsID + ' LI').each(function (i) {
                // maybe this could be one whole object and not an array of objects?
                settings.newsArr['item-' + i] = { type: opts.titleText, content: $(this).html()};
              });
            }
            else {
              debugError('Couldn\'t find any content for the ticker to use!');
              return false;
            }
          }
          else {
            debugError('Couldn\'t find any content for the ticker to use!');
            return false;
          }
          settings.contentLoaded = true;
        }

        // insert news content into DOM
        $(settings.dom.titleElem).html(settings.newsArr['item-' + settings.position].type);
        $(settings.dom.contentID).html(settings.newsArr['item-' + settings.position].content);

        // set the next content item to be used - loop round if we are at the end of the content
        if (settings.position == (countSize(settings.newsArr) -1)) {
          settings.position = 0;
        }
        else {
          settings.position++;
        }

        // get the values of content and set the time of the reveal (so all reveals have the same speed regardless of content size)
        distance = $(settings.dom.contentID).width();
        time = distance / opts.speed;

        // start the ticker  - have to fade both element here because of IE strangeness - needs further investigation
        $(settings.dom.wrapperID)
          .find(settings.dom.titleID).fadeIn()
            .end().find(settings.dom.titleElem).fadeIn('slow', revealContent);
      }

      //slide back cover
      function revealContent() {
        if(settings.play) {
          // get the width of the title element to offset the content and reveal
          var offset = $(settings.dom.titleElem).width() + 20;
          $(settings.dom.revealID).css('left', offset + 'px');
          // show the reveal element and start  the animation
          $(settings.dom.revealElem).show(0, function () {
            $(settings.dom.contentID).css('left', offset + 'px').show();
            $(settings.dom.revealID).css('margin-left', '0px').delay(20).animate({
              marginLeft: distance + 'px'
            }, time, 'linear', postReveal);
          });
        }
        else {
          return false;
        }
      };

      function postReveal() {
        // here we hide the current content and reset the ticker elements to a default state ready for the next ticker item
        if(settings.play) {
          // we have to separately fade the content out here to get around an IE bug - needs further investigation
          $(settings.dom.contentID).delay(opts.pauseOnItems).fadeOut('slow');
          // deal with the rest of the content, prepare the DOM and trigger the next ticker
          $(settings.dom.revealID).hide(0, function () {
            $(settings.dom.tickerID).delay(opts.pauseOnItems).fadeOut(opts.fadeOutSpeed, function () {
              $(settings.dom.wrapperID)
                .find(settings.dom.titleElem +',' + settings.dom.revealElem + ',' + settings.dom.contentID)
                  .hide()
                .end().find(settings.dom.tickerID + ',' + settings.dom.revealID + ',' + settings.dom.titleID)
                  .show()
                .end().find(settings.dom.tickerID + ',' + settings.dom.revealID + ',' + settings.dom.titleID)
                  .removeAttr('style');
              updateTicker();
            });
          });
        }
        else {
          $(settings.dom.revealElem).hide();
        }
      }

      function pauseTicker() {
        // pause ticker
        settings.play = false;
        // stop animation and show content - must pass true, true to the stop function, or we can get some funky behaviour
        $(settings.dom.tickerID + ',' + settings.dom.revealID + ',' + settings.dom.titleID + ',' + settings.dom.titleElem + ',' + settings.dom.revealElem + ',' + settings.dom.contentID).stop(true, true);
        $(settings.dom.revealID + ',' + settings.dom.revealElem).hide();
        $(settings.dom.wrapperID)
          .find(settings.dom.titleID + ',' + settings.dom.titleElem).show()
            .end().find(settings.dom.contentID).show();
      }

      function restartTicker() {
        // play ticker
        settings.play = true;
        settings.paused = false;
        // start the ticker again
        postReveal();
      }

      function changeContent(direction) {
        pauseTicker();
        switch (direction) {
          case 'prev':
            if (settings.position == 0) {
              settings.position = countSize(settings.newsArr) -2;
            }
            else if (settings.position == 1) {
              settings.position = countSize(settings.newsArr) -1;
            }
            else {
              settings.position = settings.position - 2;
            }
            //console.log(settings.position);
            $(settings.dom.titleElem).html(settings.newsArr['item-' + settings.position].type);
            $(settings.dom.contentID).html(settings.newsArr['item-' + settings.position].content);
            break;
          case 'next':
            $(settings.dom.titleElem).html(settings.newsArr['item-' + settings.position].type);
            $(settings.dom.contentID).html(settings.newsArr['item-' + settings.position].content);
            break;
        }
        // set the next content item to be used - loop round if we are at the end of the content
        if (settings.position == (countSize(settings.newsArr) -1)) {
          settings.position = 0;
        }
        else {
          settings.position++;
        }
      }
    });
  };
  // plugin defaults - added as a property on our plugin function
  $.fn.ticker.defaults = {
    speed: 0.10,
    ajaxFeed: false,
    htmlFeed: true,
    debugMode: true,
    controls: true,
    titleText: '&nbsp;',
    pauseOnItems: 2000,
    fadeInSpeed: 300,
    fadeOutSpeed: 300
  };
})(jQuery);

// get html from ajax call or json object

// make whole thing events based

// background customisation (a la bbc)

// truncate long strings?
6、创建/news_ticker/newsticker_ticker-style.css,内容如下:
<script type="text/javascript">
#ticker-wrapper *{
	margin:0
}
#ticker-wrapper .has-js{
	width:800px;
	height:30px;
	display:block;
	font-family:Arial;
	font-size:.75em;
	margin:0px 0 0 20px
}
#ticker{
	width:500px;
	height:18px;
	display:block;
	float:left;
	position:relative;
	overflow:hidden;
	background-color:#fff;
	padding:0 0 0 0px
}
#ticker-title{
	padding-top:0px;
	float:left;
	color:#900;
	font-weight:700;
	background-color:#fff;
	text-transform:uppercase
}
#ticker-content{
	height:18px;
	padding-top:0px;
	float:left;
	position:absolute;
	color:#1F527B;
	font-weight:700;
	background-color:#fff;
	margin:0
}
#ticker-content A{
	text-decoration:none;
	color:#333;
	font-size:16px;
	font-family: Georgia, "Bitstream Charter", serif;
}
#ticker-content A:hover{
	text-decoration:none;
	color:#005C91;
}
#ticker-swipe{
	padding-top:5px;
	position:absolute;
	top:0;
	left:80px;
	background-color:#fff;
	display:block;
	width:800px;
	height:23px
}
#ticker-swipe SPAN{
	margin-left:1px;
	background-color:#fff;
	border-bottom:1px solid #1F527B;
	height:12px;
	width:7px;
	display:block
}
#ticker-controls{
	list-style-type:none;
	float:right;
	padding:7px 10px 0 0;
}
#ticker-controls LI{
	margin-left:5px;
	float:left;
	cursor:pointer;
	height:16px;
	width:16px;
	display:block;
	padding:0
}
#ticker-controls LI#play-pause{
	background-position:32px 16px
}
#ticker-controls LI#play-pause .over{
	background-position:32px 32px
}
#ticker-controls LI#play-pause .down{
	background-position:32px 0
}
#ticker-controls LI#play-pause .paused{
	background-position:48px 16px
}
#ticker-controls LI#play-pause .paused .over{
	background-position:48px 32px
}
#ticker-controls LI#play-pause .paused .down{
	background-position:48px 0
}
#ticker-controls LI#prev{
	background-position:0 16px
}
#ticker-controls LI#prev .over{
	background-position:0 32px
}
#ticker-controls LI#prev .down{
	background-position:0 0
}
#ticker-controls LI#next{
	background-position:16px 16px
}
#ticker-controls LI#next .over{
	background-position:16px 32px
}
#ticker-controls LI#next .down{
	background-position:16px 0
}
.js-hidden{
	display:none
}
.current-time{
	margin-top:5px;
}
</script>

19九/110

WordPress 设定显示页面

ASDF

最后说一下不同的页面载入不同的内容的代码写法

常用设置参数

对于WordPress Widget Logic插件同样适用

  • is_home() 主页
  • is_single() 文章页
  • is_page() 页面
  • is_category() 文章分类页
  • is_tag() 文章标签页
  • is_archive() 归档页
  • is_404() 404页
  • is_search() 搜索结果页
  • is_feed() 订阅页
  • is_admin() 后台

语法

||”表示”或”,”&&”表示”和”,”!”表示”非”

例如:
  • is_home() 仅主页显示
  • !is_home() 除主页以外的页面显示
  • !is_category(8) 仅在ID非8的分类显示
  • is_home() || is_category(‘host’) 在主页或名称为host的分类显示
  • is_page(‘about’) 仅在关于页显示

然后写一个例子以供参考:

<?php if (is_single()||is_page(guestbook)) { ?>
e.g. code
<?php } ?>

这个例子的意思是,在文章页和留言板显示 e.g. code

18九/110

在WordPress中添加“上一篇”和“下一篇”功能

ASDF
<div class="nearbypost">
  <div class="alignleft"><?php previous_post_link('&larr;上一篇: %link'); ?></div>
  <div class="alignright"><?php next_post_link('下一篇%link &rarr; '); ?></div>
 </div>

larr和rarr是向左和向右的箭头。
&laquo;和&raquo分别是<和>
添加到single.php文件中即可。
18九/110

Twenty Ten Post Calendar Icon

ASDF
16九/110

一些小故事

ASDF

一、女浴室起火,里面人乱作一团,赤身往外跑,只见大街上白花花一大群,一老者大喊“快捂住”,众裸女突然醒悟,但身上要紧部位有三处,手忙脚乱捂不过来,不知所措。这时老者又大喊:“捂脸就行,下面都一样!”

【此事的重要启示:在特殊情况下抓工作不可能面面俱到,要抓住重点。】­

二、某日,女秘书神色凝重地说:王总,我怀孕了。 王继续低头看文件,然后淡淡一笑:我早结扎了。 女秘书楞了一会媚笑道:我和您开玩笑呢! 王抬起头看了她一眼,喝了口茶说:我也是。­

【此事的重要启示:在江湖上混的人,遇事不要慌,先让子弹飞一会。】

­ 三、男子去提亲,女方家长:请自我介绍。­ A说:我有一千万;­ B说:我有一栋豪宅,价值两千万;­ 家长很满意。就问C,你家有什么?­ C答:我什么都没有,只有一个孩子,在你女儿肚子里。­ AB无语,走了。­

【此事的重要启示:核心竞争力不是钱和房子,是在关键的岗位有自已的人。】­

四、7年前他为了出国抛弃了未婚妻,现在事业有成,他开始愧疚,听说她过的不好,他想去弥补。­ 他去到了她的鱼摊,她在刮鳞,边上蹲着一个男娃,模样有几分像他,他心里一震。­ 她突然停下,指着隔壁摊的男人:你咋还不给孩子做饭呢!他松了口气,转身走了。­ 她递根烟给隔壁摊男人:刚才不好意思­

【 不愿意做你的累赘 不愿意让你带着愧疚过一身 】­

五、父亲在洗车, 儿子拿起小石头在车门上划起来. 父亲见此大怒, 拿起扳手就打了下去, 后来儿子被送到医院, 证实手指骨折. 面对父亲, 儿子轻声说道: 爸爸, 手指会好的, 不要担心了. 父亲内心无比自责. 一怒之下, 冲回去要把自己的汽车给砸了. 他看见儿子划的痕迹: 爸爸, 我爱你.­

【 有些事是否在看清之后再做决定更好呢 】­

 六、草原上有对狮子母子。小狮子问母狮子:“妈,幸福在哪里?”母狮子说:“幸福就在你的尾巴上。”­ 于是小狮子不断追着尾巴跑,但始终咬不到。母狮子笑道:“傻瓜!幸福不是这样得到的!只要你昂首向前走,幸福就会一直跟随着你!”。

【 刻意的追寻 不如勇敢的往前走 成功又有多远呢 】­

七、有一个盲了的女孩,她一无所有,只剩下她男朋友,男朋友问她:“如果你眼睛好了,能和我结婚吗?”女孩答应了。­ 很快,女孩可以移植新视角膜,也很快回复视力,但她发现她男朋友也是盲的。男朋友向她求婚,女孩拒绝了,最后男孩只说了一句话:“take care of my eyes.”­ 【 照顾好我的眼睛 】­

八、他向她求婚时,只说了三个字:相信我;­ 她为他生下第一个女儿的时候,他对她说:辛苦了;­ 女儿出嫁那天,他搂着她的肩说:还有我;­ 他收到她病危的那天,重复的对她说:我在这;­ 她要走的那一刻,他亲吻她的额头轻声说:你等我。­ 这一生,他没有对他说过一次“我爱你”,但爱,从未离开过。

【 这个世界有不会表白的人 但谁说他们一定缺少爱 】

­ 九、儿子养不起年迈的母亲,决定把她背上山丢下去。傍晚,儿子说要背母亲上山走走,母亲吃力地爬上他的背。­ 他一路都在想爬高点再丢下她,当看到母亲在他背上偷偷往路上洒豆子,他很生气地问:“你洒豆子干什么?”结果母亲的回答让他泪流满面:“傻儿子,我怕你等会儿一个人下山会迷路。”

【父母的爱伴随着你一生 哪怕他们已经年迈 】

16九/110

/etc/fstab 教程

ASDF

可能玩Linux的朋友都知道fstab这个文件,如果要用好linux,熟悉linux的一些核心配置文件是必要的,而fstab则是其中之一。这个文 件描述系统中各种文件系统的信息,应用程序读取这个文件,然后根据其内容进行自动挂载的工作。因此,我们需要理解其中的内容,了解它如何与 mount命令配合工作,并能够针对自己的情况进行修改。

作为系统配置文件,fstab通常都位于/etc目录下,它包括了所有分区和存储设备的信息,以及它们应该挂载到哪里,以什么样子的方式挂载。如 果遇到一些类似于无法挂载你的windows分区阿,无法使用你的光驱阿,无法对某个分区进行写入操作阿什么的,那么基本上可以断定,你的fstab内容 有问题了。也就是说,你可以通过修改它来搞定这些问题,而不用去论坛冰天雪地裸体跪求答案了。

说了半天,/etc/fstab其实就是一个文本文件,用gedit或者vi都可以打开,当然,前提是root权限。在这个文件中,每个文件系统 (包括分区或者设备)用一行来描述,在每一行中,用空格或TAB符号来分隔各个字段,文件中以*开头的行是注释信息。Fstab文件中的纪录的排序十分重 要。因为 fsck,mount或umount等程序在做它们的工作时会按此顺序进行本。下面进行详细的讲解,本文假设读者已经有挂载文件系统和分区的基础知识。

在讲解之前要说一下,每个人所使用的系统情况都是不同的,包括硬件种类,所用系统等,因此fstab文件肯定是有所差异的。但是其基本结构,如上所述,都不会变。所以我们先以一个fstab内容作为模板进行讲解。

首先请看下面这个例子:
/dev/hda2 / ext2 defaults 1 1
/dev/hdb1 /home ext2 defaults 1 2
/dev/cdrom /media/cdrom auto ro,noauto,user,exec 0 0
/dev/fd0 /media/floppy auto rw,noauto,user,sync 0 0
proc /proc proc defaults 0 0
/dev/hda1 swap swap pri=42 0 0

这些看起来毫无意义的字符代表了什么?在对应相应分区或者存储设备信息的每一行中,每一列又是什么意思?先大体讲一下,第一列表示设备的名称,第 二列表示该设备的挂载点,第三列是文件系统,第四列是挂载选项,第五列是dump选项(用一个数字表示),第六列(接下来的数字)表示文件系统检查选项。 好了,接下来,就要详细介绍这些参数的具体含义了。

第一、二列:设备和默认挂载点

说实话,第一列和第二列的内容是最简单最直接的,它们的作用就是告诉mount命令,我想挂载什么分区或者什么设备,以及我所希望的挂载点在哪 里。在fstab中为某一个设备指定的挂载点是其默认挂载点,也就是当你在挂载目录的时候没有手工指定其他目录的话,系统就将该设备挂载到这个目录。大多 数 Linux发行版都会为挂载点创建专门的目录,大多数是在/mnt下,但是一些发行版(比如SUSE或者ubuntu)是在/media下。笔者使用的是 ubuntu,所以示例信息中也是用的/media目录。

按照我们给出的fstab示例,如果你敲入命令

$ mount /dev/fd0

你的软驱就将挂载到/media/floppy,因为这是你告诉系统的软驱默认挂载点。如果没有这个信息,当你敲入mount命令时,mount 会感到很困惑:该死的,你想让我把这玩意挂载到哪里去呢?当然,如果你看fstab中发行版给你指定的默认挂载点不顺眼,也可以自由修改它,修改成任何一 个你希望的目录都可以。如果还不存在,就首先创建这个目录。要知道,fstab是不会把所有工作都给你包干的哦。

另外,有一些分区和存储设备是在Linux系统启动的时候就自动挂载的,比如,让我们看看刚才列出来的fstab示例信息,有两行是这样的:
/dev/hda2 / ext2 defaults 1 1
/dev/hdb1 /home ext2 defaults 1 2

正如刚才我们讲到的那样,这两行表示/dev/hda2默认挂载到/根目录,而 /dev/hdb1则默认挂载到/home目录,。这些工作在你Linux系统启动的时候就会通过读取fstab自动完成,否则的话……想象你会遭受什么 样的折磨吧,所有的程序都在/根目录下,而你却无法使用,因为你没有挂载/根目录!恩,我保证,这将是一次让人沮丧的系统使用经历。

除了显示的使用设备名,你可以使用设备的UUID或设备的卷标签,例如,你可以在这个字段写成“LABAL=root”或“UUID= 3e6be9de- 8139-11d1-9106-a43f08d823a6”,这将使系统更具伸缩性。例如,如果你的系统添加或移除了一个SCSI硬盘,这有可以改变你的 设备名,但它不会修改你的卷标签。

对于NFS mount操作,这个字段应该包含host:dir格式的信息,例如:knuth.aeb.nl:/,对于进程文件系统procfs,使用proc。

第三列:文件系统类型

fstab中的第三列指示了设备或者分区的文件系统类型。它支持很多种类的文件系统,我们在这里只介绍最为常用的。如果想了解你的kernel目 前支持哪些文件系统,可以查看/proc/filesystems的内容。如果这个字段定义为swap,这条纪录将关联到一个用于交换目的的文件或分区。 如果这个字段定义为ignored,这行将被忽略。这对于显示目前没有使用的分区非常有用。

ext2 和 ext3: Linux下的Ext2文件系统,是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。至于Ext3文件系统,它属于一 种日志文件系统,是对ext2系统的扩展。日志式文件系统的优越性在于,它会将整个磁盘的写入动作完整记录在磁盘的某个区域上,以便有需要时可以回朔追 踪。由于详细纪录了每个细节,故当在某个过程中被中断时,系统可以根据这些记录直接回朔并重整被中断的部分,而不必花时间去检查其他的部分,故文件系统检 测不一致时,重整的工作速度相当快,几乎不需要花时间。

reiserfs: ReiserFS是一个非常优秀的文件系统。也是最早用于Linux的日志文件系统之一,其机制比Ext3要先进得多,风雷小弟一直使用的就是它,很多发 行版现在也把它作为默认文件系统了。可惜其作者前段时间出事了……具体情况就不说了,也不知道下一代reiserfs4还能不能出来,因为ext4都有 了。

swap: Swap,即交换区,把它想象成虚拟内存就行了。

vfat 和 ntfs:一看就知道是Windows分区格式了,呵呵。98,me等系统都是使用的vfat,也就是最流行的fat32格式,而NT系列则多使用 NTFS,当然也不是固定的,因此2000或者XP系统要具体情况具体分析。当初Linux对NTFS的写入支持不好,所以大多数资料都建议用户使用 vfat格式,但是现在支持已经很好了,即使不重新编译内核,也可以通过ntfs-3g来进行写入支持(具体方法请参考这篇文章),因此不用太在意这个 了。

auto:当然,这不是一个文件系统类型。auto只是表示,文件系统的类型将被自动检测。在上面的示例中,你会发现软驱和光驱的文件系统类型都 是auto,为什么呢?因为它们的文件系统类型随时都可能改变,比如软驱,优盘这种设备,可能今天是vfat格式,明天你就把它格式化成了ntfs,因 此,最明智的做法就是告诉系统,我没法确定这东西的当前类型,还是你自己检测吧。

udf: 由于刻录光驱越来越流行,现在很多发行版自带的fstab中,光驱的文件格式类型是UDF,UDF是Universal Disc Format的缩写,与ISO 9660格式相容。它采用标准的封装写入技术(PW,Packet Writing)将CD-R/CD-RW当作硬盘使用,用户可以在光盘上修改和删除文件。利用UDF格式进行刻录时,刻录软件将数据打包,并在内存中临时 建立一个特殊文件目录表,同时接管系统对光盘的访问。

iso9660: 很多光驱也使用的这个选项。ISO9660是一种描述适合CD盘片的电脑文件结构的国际标准。采用此标准的盘片可以在不同的操作系统上使用,如MAC和Windows。

第四列:挂载选项

fstab中的第四列表示设备或者分区所需要的挂载选项。这一列也是fstab中最复杂最容易出错的一列,当然,只要你能知道一些最常用的选项是 什么意思,就可以让你从头疼中解脱出来。如果要把可用的选项一项一项介绍……恩,我估计我会写到明天,所以,我还是只是分析最常用的一些选项,如果你想知 道更多的东西,还是求助于man吧。

auto 和 noauto: 这是控制设备是否自动挂载的选项。auto是默认选择的选项,这样,设备会在启动或者你使用mount -a命令时按照fstab的内容自动挂载。如果你不希望这样,就使用noauto选项,如果这样的话,你就只能明确地通过手工来挂载设备。

user 和 nouser:这是一个非常有用的选项,user选项允许普通用户也能挂载设备,而nouser则只允许root用户挂载。nouser是默认选项,这也 是让很多 Linux新手头疼的东西,因为他们发现没有办法正常挂载光驱,Windows分区等。如果你作为普通身份用户遇到类似问题,或者别的其他问题,就请把 user属性增加到fstab中。

exec 和 noexec: exec允许你执行对应分区中的可执行二进制程序,同理,noexec的作用刚好相反。如果你拥有一个分区,分区上有一些可执行程序,而恰好你又不愿意, 或者不能在你的系统中执行他们,就可以使用noexec属性。这种情况多发生于挂载Windows分区时。exec是默认选项,理由很简单,如果 noexec变成了你/根分区的默认选项的话……

ro: 以只读来挂载文件系统。

rw: 以可读可写的属性来挂载系统。

sync 和 async:对于该文件系统的输入输出应该以什么方式完成。sync的意思就是同步完成,通俗点讲,就是当你拷贝一个东西到设备或者分区中时,所有的写入 变化将在你输入cp命令后立即生效,这个东西应该立马就开始往设备或者分区里面拷贝了。而如果是async,也就是输入输出异步完成的话,当你拷贝一个东 西到设备或者分区中时,可能在你敲击cp命令后很久,实际的写入操作才会执行,换句话说,就是进行了缓冲处理。

有时候这种机制蛮不错的,因为sync会影响你系统的运行速度,但是这也会带来一些问题。想一想,当你希望将一个文件拷贝到u盘上时,你执行了 cp 命令,却忘记执行umount命令(它会强行将缓冲区内容写入),那么你拷贝的文件实际上并没有在u盘上面。如果你是使用的mv命令,而你又很快将u盘拔 出……恭喜你,文件会从这个星球上消失的。因此,虽然async是默认属性,但是对于u盘,移动硬盘这种可移动存储设备,最好还是让他们使用sync选 项。

defaults: 所有选项全部使用默认配置,包括rw, suid, dev, exec, auto, nouser, 和 async。

一般用户没有特殊需求,直接使用defaults就可以了。看完介绍,我们再回过头去看看前面的示例内容,以光驱为例,主要关注挂载选项这里,可以看到,光驱和其他分区设备的不同是ro,因为普通光驱是只读的。而exec则让你可以从光驱上直接执行某些程序。

第五、六列:dump和fsck选项

Dump和fsck?这是什么东西?恩,dump是一个备份工具,而fsck是一个文件系统扫描检查工具。我不会在这里详细介绍它们,因为用man或者google都可以获得更加详细的信息。

fstab的第五列是表示dump选项,dump工具通过这个选项位置上的数字来决定文件系统是否需要备份。如果是0,dump就会被忽略,事实 上,大多数的dump设置都是0。而第六列是fsck选项,fsck命令通过检测该字段来决定文件系统通过什么顺序来扫描检查,根文件系统/对应该字段的 值应该为1,其他文件系统应该为2。若文件系统无需在启动时扫描检查,则设置该字段为0。

16九/110

Linux启动等级

ASDF
0    Halt
1(S) Single-user
2    Not used
3    Multi-user
 4    Not used
5    X11
6    Reboot
   下一页