FarBox Editor编辑器发布

就在春节前 Farbox 放出了 Mac 版的编辑器测试版,自己没有水果也就没去体验,刚上微博发现 Win 平台的也在下午发布了。

FarBox Editor是专为 Farbox 定制的 MarkDown 语法的编辑器,从某种角度来说,也是 FarBox.com 的客户端。

打开编辑器会自动获取到你的网盘目录,并且建立一个新文件,文件以当前日期为名,并且在文件头部也会自动标注当前的时间,值得一提的是,编辑器会自动保存文件,让你更专注于写作!

FarBox Editor的其他特性,来自官网介绍

1.双语版,简体中文+英文版

2.双系统, Mac+Windows

3.FarBox.com同源的MarkDown解析,支持代码高亮

4.支持图片直接拖入

5.博客目录文件的直接管理,快捷的目录(分类)调整

6.可自定制HTML模板文件以及CSS文件

7.绑定FarBox上的域名

获取虾米音乐下载链接

今天在博客园看到的,通过反编译播放器找到解码音乐资源的地址的算法。

算法这里就不多解释了,原文有分析,这里说一下获取“加密”地址的过程:

1.进入单首歌曲介绍页,比如 http://www.xiami.com/song/1768914936 ,地址后面的数字就是歌曲的 id
<!--more-->

2.根据 id 找到包含歌曲相关信息的 xml 文件地址,例如 http://www.xiami.com/song/playlist/id/1768914936/object_name/default/object_id/0

3.载入 xml ,获取 location 节点的内容,就是“加密”的地址

第二步里把最后的 0 换成其他数字会得到不同的加密地址,但是解码后资源真实地址还是一样的。

原文是用 java 实现的,这里改成了 javascript,使用起来更方便~

function loadXMLDoc(dname) 
{
try //Internet Explorer
  {
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  }
catch(e)
  {
  try //Firefox, Mozilla, Opera, etc.
    {
    xmlDoc=document.implementation.createDocument("","",null);
    }
  catch(e) {alert(e.message)}
  }
try 
  {
  xmlDoc.async=false;
  xmlDoc.load(dname);
  return(xmlDoc);
  }
catch(e) {alert(e.message)}
return(null);
}
//获取歌曲 id
var patt1=new RegExp("[0-9].*");
var songId=patt1.exec(location.href);
//载入 xml
var xmlDoc=loadXMLDoc("http://www.xiami.com/song/playlist/id/"+songId+"/object_name/default/object_id/0");
//解码地址
function getLocation(xlocation){
        var _local10;
        var _local2 = parseInt(xlocation.substring(0, 1));
        var _local3 = xlocation.substring(1, xlocation.length);
        var _local4 = Math.floor(_local3.length / _local2);
        var _local5 = _local3.length % _local2;
        var _local6 = new Array();
    _local6.length = _local2;
        var _local7 = 0;
        while (_local7 < _local5) {
            if (_local6[_local7] == null) {
                _local6[_local7] = "";
            }
            _local6[_local7] = _local3.substring((( _local4 + 1) * _local7),
                    (( _local4 + 1) * _local7) + ( _local4 + 1));
            _local7++;
        }
        _local7 = _local5;
        while (_local7 < _local2) {
            _local6[_local7] = _local3.substring((( _local4 * (_local7 - _local5)) + (( _local4 + 1) * _local5)),(( _local4 * (_local7 - _local5)) + ((_local4 + 1) * _local5))+ _local4);
            _local7++;
        }
        var _local8 = "";
        _local7 = 0;
        while (_local7 < ( _local6[0]).length) {
            _local10 = 0;
            while (_local10 = _local6[_local10].length) {
                    break;
                }
                _local8 = (_local8 + _local6[_local10].charAt(_local7));
                _local10++;
            }
            _local7++;
        }
        _local8 = decodeURIComponent(_local8);
        var _local9 = "";
        _local7 = 0;
        while (_local7 < _local8.length) {
            if (_local8.charAt(_local7) == '^'){
                _local9 = (_local9 + "0");
            } else {
                _local9 = (_local9 + _local8.charAt(_local7));
            };
            _local7++;
        }
        _local9 = _local9.replace("+", " ");
        alert( _local9);
    }
getLocation(xmlDoc.getElementsByTagName("location")[0].textContent);

实际上无论是否登录在虾米音乐网站上下载的都是低码率的音乐,如果要高码率的话只能用虾歌哦。

Farbox 让网盘变成博客

【本文已经不适用了】

嗯,你只需要一个网盘就能搭建属于自己的博客。

Farbox 其实是一个网盘应用(应该没理解错吧),目前支持 Dropbox 和金山快盘。

你的文件同步到 Dropbox 等云端后,FarBox 会去获取它们;然后文章、图片、HTML页各自归档。比如.txt .md .markdown .docx四种后缀的文档,会当做博客的日志来归档。

注册 Farbox

这里用金山快盘演示:在 Farbox 网站上点击“开始 FarBox”,选择“快盘登陆”,登陆成功后会在你的快盘的我的应用里建立一个“FarBox”文件夹,和你博客相关的文件都放在这里面,FarBox 会自动去获取他们。
<!--more-->

如何发表文章

文件即文章!将文件放入网盘里的“快盘/我的应用/FarBox/[你的网站名]/”目录下就可以了。目前支持 .txt .md .markdown .docx 四种格式。文件名就是文章的标题,文件内容就是文章的正文。

如何更好的控制文章

在文章的第一行开始,可以进行标注,格式如下:

Title: 文章标题,默认为文件名

Date: 文章的发表时间,默认为文本文件的最后修改时间

Status: Draft(draft的文章不会被别人看到, 默认为public)

Tags:标签,默认为空。 Tag1 Tag2(也可以是“Tag1,Tag2”)

Url: 文章被访问的地址,默认为文件名的拼音

以上这些都是非必须的,未设置的就是默认值。

域名绑定

以金山快盘为例,“快盘/我的应用/FarBox/”这个目录下面的每一个直属的文件夹,都等同于一个网站,称之为站点目录。

绑定域名则要在站点目录中创建(或修改)domains.config文件,输入需要绑定的域名即可。你可以免费使用,farbox.com的3位以上二级域名。

如果是独立域名,请通过CNAME的方式,指向 park.farbox.com 后才能访问。

数据会丢失吗

你的所有数据都是保持在你的网盘上的,只要网盘在数据就不会丢失,话说金山快盘作为国内最早的网盘服务,好像好久都没发力了。至于 FarBox 本身的持久性就有待观察了。

写在最后

FarBox 是一个很新很新的事物,正在不断完善中,但持久性还有待观察,希望作者坚持下去,特别是最近有突然开始测试什么客户端(突然想到播放器 Airplay ,在 Win 平台没完善的时候,就去和其它媒体合作做了一堆在线电台...后来又突然什么都没更新了...),不管怎样还是对 FarBox 的未来非常期待的,希望越来越好吧:)

Opera 扩展:消息

Opera 扩展包括有“后台脚本”、“注入脚本”、“弹窗脚本”等,所谓“消息”,各脚本间的数据传递就是通过消息实现的。

Opera 扩展发送消息的方式有3种,postMessage()/broadcastMessage()/消息通道。

例如在后台脚本和注入脚本之间传递数据:

可以使用 broadcastMessage() 来发送消息。你可以在后台脚本中这样写:
<!--more-->

opera.extension.broadcastMessage("Hello there");

注入脚本需要接收消息,像这样:

var thecatch;
opera.extension.onmessage = function(event){
thecatch = event.data; // event.data 在这个实例中将包含字符串 "Hello there"
}

需要注意的是,broadcastMessage() 方法会将消息发送到所有的注入脚本,例如你让注入脚本改变网页的字体,那么浏览器所有包含注入脚本的标签页都会改变。如果想只对一个注入脚本发消息应该使用 postMessage() 或者“消息通道”。

在后台脚本和弹窗脚本之间传递数据:

后台脚本和弹窗脚本之间传递实际上和后台脚本和注入脚本之间传递数据是一样的。

在注入脚本和弹窗脚本之间传递数据:

注入脚本和弹窗脚本无法直接传递数据,而需要一个专有的“消息通道(MessageChannel)”来通信,这个消息通道是由注入脚本建立的,并且需要后台脚本把这个消息通道告诉给弹窗脚本,然后弹窗脚本就能和注入脚本通过这个消息通道直接通信了。

过程是这样:

1.注入脚本发消息给后台脚本

2.后台脚本发消息给弹窗脚本

3.弹窗脚本和注入脚本建立连接,可直接传递数据了

首先,我们有一个叫 port 的全局变量,晚些的时候会用到.让我们看到 onconnect 事件这里:

opera.extension.onconnect = function( event ){
if( port )
event.source.postMessage( "响应通道", [port] );
}

详细过程:

注入脚本载入时创建一个新的消息通道.一个消息通道将包含两个端口来收发消息.在这里,我们确保确保第2个端口发送数据,第1个端口收数据.然后我们使用postMessage()通过这个消息通道发送给后台脚本

var channel = new MessageChannel();
opera.extension.postMessage( "我通过这个消息通道发消息", [channel.port2] );

这时,后台脚本接收到了注入脚本的消息--注入脚的消息通道,存储到变量 port 中

opera.extension.onmessage = function( event ) {
if (event.ports)
port = event.ports[0];
}

当弹窗脚本载入后,后台脚本给它发送消息:

opera.extension.onconnect = function( event ){
if( port ){
event.source.postMessage( "Respond to the port", [port] );
}
}

然而,这次,port变量的值不在是空的.它包含了注入脚本第2个通道的引用。

这时弹窗脚本接受到了后台脚本的消息--注入脚本的消息通道。所以可以通过消息通道给注入脚本发消息了:

opera.extension.onmessage = function( event ){
if( event.ports ){
event.ports[0].postMessage( "Hi from popups side!" );
}
}

同时,注入脚本也可以通过这个通道接受后台脚本的消息了:

channel.port1.onmessage = function( event ){
opera.postError("Here is what i got in the injected script for port1: " + event.data);
}

这里,注入脚本监听消息通道的port1端口.当接收到消息的时候,那么发送一个包含了来自弹窗脚本消息的句子到错误控制台.

概述,下列的事情发生了:

注入脚本载入

在后台脚本中, onconnect 事件被触发,发送消息到注入脚本

注入脚本收到消息然后设置一个消息通道

注入脚本使用第2个端口发送消息到后台脚本

后台脚本监听消息,但更重要的是保存这个端口的引用

现在弹窗脚本连接后台脚本

后台脚本中的onconnect的事件再次被触发,这次使用从注入脚本接收消息的端口发送消息.

弹窗端口监听消息,检查消息是否有一个端口的引用(是否是通过端口发送过来的).如果是,发送自己的消息到这个端口(这个端口是消息通道的 port2)

注入脚本的消息通道监听消息!将收到的消息写入到错误控制台.

在这种情况下,后台脚本就是媒人,首先媒人找到第一个人(注入脚本).第一个人给出他的编号(第2个端口)给媒人,媒人记下这个.然后另外一个人(弹窗脚本)联系到媒人:媒人立刻发送第一个人(注入脚本)的编号给第2个人(弹窗脚本).现在两个人可以直接进行那个更详细的交谈了.而不需要媒人(后台脚本)了.

C#:正则表达式测试工具

功能:输入正则表达式即时匹配出结果

reg
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace RegexTool
{
    public partial class Form1 : Form
    {
        Regex reg;
        public Form1()
        {
            InitializeComponent();
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            richTextBox1.SelectAll();
            richTextBox1.SelectionBackColor = Color.White;
            regIt();
        }
        private void regIt()
        {
            try
            {
                if (textBox1.Text == "")
                {
                    label1.Text = "";
                }
                else
                {
                    reg = new Regex(textBox1.Text);
                    MatchCollection mc = reg.Matches(@richTextBox1.Text);
                    int count = 0;
                    for (int i = 0; i < mc.Count; i++)
                    {
                        richTextBox1.Select(mc[i].Index, mc[i].Length);
                        if ((i + 2) % 2 == 0)
                        {
                            richTextBox1.SelectionBackColor = ColorTranslator.FromHtml("#FFF000");
                        }
                        else
                        {
                            richTextBox1.SelectionBackColor = ColorTranslator.FromHtml("#D2F854");
                        }
                        if (mc[i].Length != 0)
                        {
                            count++;
                        }
                    }
                    label1.Text = "结果:" + count + "个";
                }
            }
            catch (Exception ex)
            {
                label1.Text = "错误:" + ex.Message;
            }
        }
        private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Control && e.KeyCode == Keys.V)
            {
                e.Handled = true;
                richTextBox1.Paste(DataFormats.GetFormat(DataFormats.Text));
            }
        }
        private void textBox1_MouseClick(object sender, MouseEventArgs e)
        {
            if (textBox1.Text == "在此输入正则表达式")
            {
                textBox1.Clear();
            }
        }
        private void textBox1_Leave(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            {
                textBox1.Text = "在此输入正则表达式";
            }
        }
    }
}

C#:刷新 DNS 缓存

之前的自动更新 Smarthosts 到本地 hosts最后需要刷新 DNS 缓存,刷新 DNS 缓存首先想到的就是“ipconfig /flushdns” 命令,直接调用 cmd.exe 就可以了。不知道 .net 里是否提供了直接刷新 DNS 的方法,于是搜索了一下,很奇怪搜索“ C# 刷新 DNS 缓存”竟然找不到想要的结果,搜索“c# flush dns cache”一下就有答案了。方法大概有两种,一种就是调用 cmd.exe,一种就是调用系统 API:dnsapi.dll,其实 cmd 里方法也是调用 dnsapi.dll 实现的,为了不那么麻烦,这里就直接调用 cmd.exe 了。
<!--more-->

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();
}

Photoshop:模仿iphone里的布纹背景图

网上教程太多了已经分辨不出是谁原创的了,用自己的话写一遍

新建白色背景画布

新建图层“布纹颜色”,填充你想要的颜色

新建图层“深色横纹”,填充白色

选择“滤镜-杂色-添加杂色”,数量99%,平均分布,单色
<!--more-->

选择“滤镜-模糊-动感模糊”,角度0度,距离25像素

更改图层混合模式为叠加,不透明度25%

新建图层“深色竖纹”,和上面一样,不同的是把动感模糊角度设为90度

新建图层“浅色横纹”和“浅色竖纹”,和上面一样,不同的是图层填充为黑色,把杂色数量变为101%,图层混合模式为滤色,透明度20%

你会发现画布的边缘部分的效果和其他地方不一样,剪裁掉即可~

iphone布纹

Photoshop:模仿iphone里的布纹背景图

网上教程太多了已经分辨不出是谁原创的了,用自己的话写一遍

新建白色背景画布

新建图层“布纹颜色”,填充你想要的颜色

新建图层“深色横纹”,填充白色

选择“滤镜-杂色-添加杂色”,数量99%,平均分布,单色
<!--more-->

选择“滤镜-模糊-动感模糊”,角度0度,距离25像素

更改图层混合模式为叠加,不透明度25%

新建图层“深色竖纹”,和上面一样,不同的是把动感模糊角度设为90度

新建图层“浅色横纹”和“浅色竖纹”,和上面一样,不同的是图层填充为黑色,把杂色数量变为101%,图层混合模式为滤色,透明度20%

你会发现画布的边缘部分的效果和其他地方不一样,剪裁掉即可~

iphone布纹