刷新 DNS

using (System.Diagnostics.Process process = new System.Diagnostics.Process())
{
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "ipconfig /flushdns";
process.StartInfo = startInfo;
process.Start();
}

ReaderMX:不仅仅是 RSS 订阅阅读

最近偶然发现一个很酷的东西—— ReaderMX —— RSS 订阅。实际上打动我的是它简洁的界面。在 Google Reader 宣布关闭后,一批 RSS 在线阅读的产品开始发力了,ReaderMX 的订阅功能和其他产品也大同小异,就不详细介绍了,一张图看过就会明白。

ReaderMX

这里我要介绍的是另一个功能——文章收藏,稍后阅读
<!--more-->

添加文章

鼠标放在Logo右边的加号上就会出现“输入文章或RSS源地址”,就是在这里添加。

ReaderMX-添加文章

阅读文章

添加文章后就可以在内容区域看到文章列表了,点击链接就可以阅读。文章内容页保持了原网页中文章的基本格式,去除了网页多余的部分,十分清新啊。

ReaderMX-阅读文章

文章分类

左边的那个加号是添加分类的作用,拖拽文章链接到左边就会把文章归类到对应分类。

ReaderMX-添加分类

在分类的文章列表里文章是以标题+摘要的形式。

ReaderMX-分类阅读

可以编辑分类信息和删除分类,删除分类不会删除文章。

RreaderMX-分类删除

文章分享

ReaderMX 每一个用户有一个个性域名,可以在设置公开。公开后其他人又能访问你收藏的文章列表了。当然你也可以只分享单个分类下的文章,这需要在编辑分类里设置。

ReaderMX-分享文章

ReaderMX 官网可以看到除了 Web 外还将提供多平台的支持。还有就是各个浏览器的扩展已经陆续推出,有了扩展就能方便的添加文章了。

ReaderMX 无论是设计还是支持都十分强大,作为一款国内产品,真心希望能持久强大下去。友情提示,ReaderMX 全程都是 Https 安全阅读哦:)

Wordpress 主题:顶部模板(header.php)

本文主要通过分析 WordPress 官方主题 twentytwelve 的中的“顶部模板”来了解 WordPress 主题顶部制作需要用到的函数。

顶部模板的代码将应用于 Wordpress 所有的页面,其他页模板需要通过 get_header() 来调用。

<!DOCTYPE html>
<!--[if IE 7]>
<html class="ie ie7" <?php language_attributes(); ?>>
<![endif]-->
<!--[if IE 8]>
<html class="ie ie8" <?php language_attributes(); ?>>
<![endif]-->
<!--[if !(IE 7) | !(IE 8)  ]><!-->
<html <?php language_attributes(); ?>>
<!--<![endif]-->
<head>
<meta charset="<?php bloginfo( 'charset' ); ?>" />
<meta name="viewport" content="width=device-width" />
<title><?php wp_title( '|', true, 'right' ); ?></title>
<link rel="profile" href="http://gmpg.org/xfn/11" />
<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />
<?php // Loads HTML5 JavaScript file to add support for HTML5 elements in older IE versions. ?>
<!--[if lt IE 9]>
<script src="<?php echo get_template_directory_uri(); ?>/js/html5.js" type="text/javascript"></script>
<![endif]-->
<?php wp_head(); ?>
</head>
阅读全文

Wordpress 主题:首页模板(index.php)

本文主要通过分析 Wordpress 官方主题 twentytwelve 的中的“首页模板”来了解 Wordpress 主题首页制作需要用到的函数。

首页大概可以分为四个个部分,头部,主体,侧边栏,底部。

<?php get_header(); ?>

get_header():获取头部模板(header.php)文件中的内容,头部模板主要包含的是首页中导航栏的代码,以后再详细分析。
<!--more-->

接下来是首页主体内容的代码,主要获取文章相关的信息。

<div id="primary" class="site-content">
    <div id="content" role="main">
    <?php if ( have_posts() ) : ?>
    <?php while ( have_posts() ) : the_post(); ?>
        <?php get_template_part( 'content', get_post_format() ); ?>
    <?php endwhile; ?>
    <?php twentytwelve_content_nav( 'nav-below' ); ?>

have_posts():判断是否有文章,如果有则返回 true。
the_post():获取当前文章对象。
get_post_format():获取当前文章的类型,比如日志(aside)、图像(image)或链接(link)。
get_template_part():获取指定模板文件的内容,有两个参数,$slug(通用模板名称) 和 $name(自定义名称),得到的模板文件名就是 $slug-$name.php。这里的模板存储的是显示文章的详细代码。
twentytwelve_content_nav():这个是在 function.php 中自定义的一个函数,获取分页导航。

首先判断是否有文章,如果有则循环获取文章对象并显示,如果没有,则执行下面的代码。

<?php else : ?>
    <article id="post-0" class="post no-results not-found">
        <?php if ( current_user_can( 'edit_posts' ) ) : ?>
            <header class="entry-header">
                <h1 class="entry-title"><?php _e( 'No posts to display', 'twentytwelve' ); ?></h1>
            </header>
            <div class="entry-content">
                <p><?php printf( __( 'Ready to publish your first post? <a href="%s">Get started here</a>.', 'twentytwelve' ), admin_url( 'post-new.php' ) ); ?></p>
            </div>

current_user_can():判断当前用户是否有某个权限,比如编辑文章(edit_posts)。

_e():简单理解为获取字符串在当前语言下显示的内容,一般你的主题不做多语言版本的话不会用这个。
__():和上面作用一样,只不过只获取值,不打印出来。
admin_url():获取当前站点 Wordpress 后台的地址,比如“http://sxlf.org/wp-admin/”,带一个参数代表后台的具体页面,这里 post-new.php 是新建文章的页面。

没有文章,如果你登录了且有编辑权限就显示一个新建文章的链接,否则执行下面的代码。

<?php else : ?>
    <header class="entry-header">
       <h1 class="entry-title"><?php _e( 'Nothing Found', 'twentytwelve' ); ?></h1>
    </header>
    <div class="entry-content">
       <p><?php _e( 'Apologies, but no results were found. Perhaps searching will help find a related post.', 'twentytwelve' ); ?></p>
       <?php get_search_form(); ?>
    </div>
 <?php endif; ?>
 </article>
 <?php endif; ?>
 ```

`get_search_form()`:获取搜索表单的内容。如果想主题有搜索功能的话就用它。

主体部分到此结束,最后就是获取侧边栏模板(sidebar.php)和底部模板(footer.php)的内容了。
```php
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Opera15 扩展:自定义右键菜单

本文根据 Opera 官方文档编写,介绍如何使用扩展添加右键菜单。

通过 Opera 扩展,可以给网页上下文菜单添加选项,例如给链接右键菜单添加复制链接文本的菜单项,这样就可以方便的复制链接标题了。

要自定义菜单首先得在 manifest.json 文件里声明 contextMenus 权限,同样也可以在其中定义菜单前的图标。
<!--more-->

{
  "name": "Context Menu Extension",
  ...
  "permissions": [
    "contextMenus"
  ],
  "icons": {
    "16": "icon-small.png"
  },
  ...
}

注意,有关扩展图标的设置都是在 icons 里声明,不同地方的图标大小不同,右键菜单的是 16x16。

创建菜单项

在后台脚本里通过 create() 方法创建菜单项,并在参数里定义菜单的相关属性。

chrome.contextMenus.create({
    title: "Google 搜索: %s",
    contexts: ["selection"],
    onclick: searchText
})

title 定义菜单项显示的文本;

contexts 定义菜单项在哪种情况下出现,这里的 selection 代表选中文字后的右键菜单。你肯定注意到 title 里的"%s"了,它代表的就是选中的文字。contexts 默认值是 page,页面空白处右键菜单,当然还有其他的值,image、video、page 等,更多请查看官方 API

onclick 定义点击菜单触发的函数。

控制点击菜单后的结果

这里,一但用户点击菜单,就会执行 serchText 函数,当然你必须定义它。

function searchText(info){
    var myQuery = encodeURI("https://www.google.com/search?q="+info.selectionText);
    chrome.tabs.create({url: myQuery});
}

当点击菜单时会产生一个 info 对象,存储了一系列的信息,我们这里 info.selectionText 就是获取选中的文字啦。

上面是一个在新标签 Google 搜索选中文字的里例子,你可以从 Opera 官网下载这个扩展。

Opera15 扩展:扩展内脚本间消息传递

本文根据 Opera 官方文档编写,介绍扩展中各脚本消息传递相关的内容。

消息传递有两种方式,一种是简单的通信,一种是高级的通信。

简短的通信

直接通过 runtime.sendMessage()tabs.sendMessage() 方法发送消息,通过用 runtime.onMessage() 方法接收消息。

后台脚本消息发送消息用 tabs.sendMessage(),内容脚本发送消息用 runtime.sendMessage()
<!--more-->

一个简单的例子:

点击按钮发送消息给当前标签

chrome.browserAction.onClicked.addListener(function() {
    chrome.tabs.query({currentWindow: true, active: true}, function(tab) {//选择当前浏览的标签
       chrome.tabs.sendMessage(tab[0].id, {hi: 'hi,content'}); //发送消息
    });
});

内容脚本接收到消息,并发送消息给后台脚本

chrome.runtime.onMessage.addListener(//监听消息
    function (request, sender){
        alert(request.hi);      chrome.runtime.sendMessage({hello:'hello,background'});//发送消息
});

同样的方法,后台脚本接受消息

chrome.runtime.onMessage.addListener(//监听消息
    function (request, sender) {
        chrome.browserAction.setBadgeText({text: "ok"}); //在按钮徽章上显示ok
});

更高级的通信

首先需要用 runtime.connect()tabs.connect() 建立一个连接,和简单的通信一样,前者用于内容脚本,后者用于后台脚本。作为连接的另一方则需要通过 runtime.onConnect.addListener()监听是否有连接被创建。

一个简单的例子

内容脚本建立连接

var port = chrome.runtime.connect({name: "敲门"});//建立连接
port.postMessage({joke: "敲门"});
port.onMessage.addListener(function(msg) {
  if (msg.question == "是谁?")
    port.postMessage({answer: "小白兔"});
  if (msg.question == "请进")
    port.postMessage({answer: "谢谢"});
});

后台脚本接受消息

chrome.runtime.onConnect.addListener(function(port) {//监听是否有连接
    port.onMessage.addListener(function(msg) {
      if (msg.joke == "敲门")
        port.postMessage({question: "是谁?"});
      else if (msg.answer == "小白兔")
        port.postMessage({question: "请进"});
    });
}

Opera15 扩展:浏览器按钮(button-popups-badges)

本文根据 Opera 官方文档编写,介绍扩展中“浏览器按钮”相关的内容。

Opera 扩展中按钮有两种形式,一种是 Browser Action,一种是 Page Action。

Browser Action 针对的是整个浏览器,可以控制窗口内的所有标签。Page Action 则只对当前显示的标签有效,所以它是显示在地址栏内的。
<!--more-->

创建按钮

只需在 manifest.json 文件中声明

"browser_action": {
  "default_icon": "icon.png",//图标
  "default_title": "my button",//提示
  "default_popup": "popup.html"//弹出内容
}
"page_action": {
  "default_icon": "icon.png",
  "default_title": "My Sample Extension", 
  "default_popup": "popup.html"
},

按钮徽章(badges)

在按钮右下角可以显示一些文字,相关属性应该在后台脚本(background.js)中设置,Page Action 没有这个特性。

Chrome.browserAction.setBadgeBackgroundColor({"#ff0000"}): //设置背景颜色
Chrome.browserAction.setBadgeText("hell")//设置文字,最多4个字符

按钮点击事件

监听按钮点击事件的代码同样需要写在在后台脚本中

chrome.browserAction.onClicked.addListener(function(){
  console.log('This button was clicked!');
});

按钮弹出内容(popups)

弹出内容显示的就是一个 html 页,在 manifest.json 文件中声明就可以了

显示 Page Action

Page Action 默认是不显示的,通过 show() 方法显示,隐藏则是 hide() 方法。虽然它只对当前显示的标签有效,但要显示/隐藏还是需要传入当前标签的ID

//如果地址中包含123则显示 Page Action
function checkURL(tabID, changeInfo, tab){
    if (tab.url.indexOf('123')> -1){
    chrome.pageAction.show(tabID);
  }
}
chrome.tabs.onUpdated.addListener(checkURL);//监听当前显示标签改变