Skip to content
Browse files

initial comment

  • Loading branch information...
1 parent fe9dbe2 commit 4c474cc18c73247b719ea16328577894c78a4e5d @MartianZ committed Jul 3, 2012
Showing with 2,913 additions and 1 deletion.
  1. +1 −0 .gitignore
  2. +23 −1 README.md
  3. +95 −0 blog.py
  4. +50 −0 posts/2010-12-05-musicdownloader.markdown
  5. +55 −0 posts/2011-01-03-lrc-is-a-must.markdown
  6. +229 −0 posts/2011-02-11-delphi-lrc-one.markdown
  7. +14 −0 posts/2011-02-11-pureplayer.markdown
  8. +18 −0 posts/2011-02-11-thunder7skin.markdown
  9. +287 −0 posts/2011-02-17-wpf-button.markdown
  10. +65 −0 posts/2011-03-05-musicseeker.markdown
  11. +72 −0 posts/2011-04-05-musicsorter-faq.markdown
  12. +78 −0 posts/2011-04-08-musicsorter-musicnamer.markdown
  13. +47 −0 posts/2011-05-07-kissxiami.markdown
  14. +85 −0 posts/2011-05-07-musicseeker2.markdown
  15. +41 −0 posts/2011-08-09-iyy-qqmusic.markdown
  16. +71 −0 posts/2011-08-13-dynamiclyrics.markdown
  17. +62 −0 posts/2011-08-28-musicseekerx.markdown
  18. +45 −0 posts/2011-12-08-project-lolilu.markdown
  19. +114 −0 posts/2011-12-10-lolilu-aria2c.markdown
  20. +18 −0 posts/2012-01-01-opensource-dynamiclyrics.markdown
  21. +39 −0 posts/2012-01-22-hello-octopress.markdown
  22. +22 −0 posts/2012-01-24-donate.markdown
  23. +117 −0 posts/2012-01-25-macbook-pro-ssd-optimize.markdown
  24. +98 −0 posts/2012-01-25-set-up-octopress.markdown
  25. +206 −0 posts/2012-01-27-use-applescript-to-set-itunes-lyrics.markdown
  26. +43 −0 posts/2012-02-02-matritunes.markdown
  27. +77 −0 posts/2012-02-12-use-sae-to-setup-uploading-system.markdown
  28. +40 −0 posts/2012-05-26-dynamiclyrics-2-dot-0.markdown
  29. +66 −0 posts/2012-05-26-use-sparkle-to-set-up-check-update-system.markdown
  30. +192 −0 posts/2012-05-27-ubuntu-apache.markdown
  31. +31 −0 posts/2012-06-10-buy-books-activity-first.markdown
  32. +63 −0 posts/2012-06-11-dynamiclyrics-2-dot-0-release.markdown
  33. BIN static/background.png
  34. +310 −0 static/style.css
  35. +69 −0 template/article.html
  36. +70 −0 template/index.html
View
1 .gitignore
@@ -1,4 +1,5 @@
*.py[co]
+.DS_Store
# Packages
*.egg
View
24 README.md
@@ -1,2 +1,24 @@
MartianZ-BLOG
-=============
+=============
+
+MartianZ - BLOG 是 MartianZ 同学在折腾过程中学习Python的产物,是一款轻量级的博客系统。演示:<http://blog.4321.la>
+
+依赖:
+
+ python 2.6 +
+
+ easy_install tornado
+ easy_install markdown
+
+使用:
+
+1. 将Markdown放在posts文件夹下,保证每个Markdown文件的开头有下面的标志区域
+
+ ---
+ title: "[320kbps MusicDownloader]高清音乐下载助手 1.4"
+ date: 2010-12-05 22:16
+ ---
+2. python blog.py 即可,默认端口8888
+
+详情请查看程序源代码即可
+
View
95 blog.py
@@ -0,0 +1,95 @@
+import tornado.ioloop
+import tornado.web
+import string, os, sys
+import markdown
+import codecs
+
+site_config = {
+ "title" : "MartianZ!",
+ "url" : """http://blog.4321.la""",
+ "post_dir": os.getcwd() + os.sep + 'posts',
+}
+
+settings = {
+ "static_path": os.path.join(os.path.dirname(__file__), "static")
+}
+
+def SingleFileHandler(file_path):
+ f = codecs.open(file_path, mode='r', encoding='utf8')
+ lines = []
+ try:
+ lines = f.readlines()
+ except:
+ pass
+ f.close()
+
+ ret = {}
+ title = ''
+ date = ''
+ index = 1
+
+ for line in lines[1:]:
+ index += 1
+ if line.find('title: ') == 0:
+ title = line.replace('title: "','')[0:-2]
+ if line.find('date: ') == 0:
+ date = line.replace('date: ','')[0:-1]
+ if line.find('---') == 0:
+ break
+
+ content = u'';
+ for line in lines[index:]:
+ content += line
+
+ if title:
+ ret['title'] = title
+ ret['date'] = date
+ ret['content'] = markdown.markdown(content)
+ ret['name'] = file_path.split(os.sep)[-1].split('.')[0]
+ return ret
+
+class MainHandler(tornado.web.RequestHandler):
+ def get(self):
+ articles = []
+ post_dir = site_config["post_dir"]
+ file_list = []
+ files = os.listdir(post_dir)
+
+ p = int(self.get_argument('p','0'))
@GreenFaith
GreenFaith added a note May 26, 2013

一直搞不懂这个p是哪里来的- -求解释

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+
+ for f in files:
+ file_list.append(post_dir + os.sep + f)
+ file_list.sort(reverse=True)
+ for single_file in file_list[p:p+3]:
+ article = SingleFileHandler(single_file)
+ if article: articles.append(article)
+
+ if p > 2:
+ prev = True
+ else:
+ prev = False
+
+ if p + 4 < len(file_list):
+ pnext = True
+ else:
+ pnext = False
+
+
+ self.render("template/index.html", title=site_config['title'], url=site_config["url"], articles = articles, prev=prev, pnext=pnext, prevnum=p-3, nextnum=p+3)
+
+class ArticleHandler(tornado.web.RequestHandler):
+ def get(self, article_id):
+ post_path = site_config["post_dir"] + os.sep + article_id.replace('.','') + '.markdown'
+ article = SingleFileHandler(post_path)
+
+ self.render("template/article.html", title=site_config['title'], url=site_config["url"], article = article)
+
+application = tornado.web.Application([
+ (r"/", MainHandler),
+ (r"/article/(.*)", ArticleHandler),
+], **settings)
+
+if __name__ == "__main__":
+ application.listen(8888)
+ print "MartianZ Burogu Sutato!"
+ tornado.ioloop.IOLoop.instance().start()
View
50 posts/2010-12-05-musicdownloader.markdown
@@ -0,0 +1,50 @@
+---
+layout: post
+title: "[320kbps MusicDownloader]高清音乐下载助手 1.4"
+date: 2010-12-05 22:16
+comments: true
+categories: ideas
+---
+![MusicDownloader](http://i.imgur.com/bDcY0.png)
+
+软件名称:[320kbps MusicDownloader]高清音乐下载助手
+
+软件版本:1.4
+
+最后更新:2010年12月5日
+
+####**MusicDownloader已经被MusicSeeker所替代,目前MusicDownloader已经停止开发,请下载更加完善的MusicSeeker!**
+
+<!-- more -->
+版本更新内容:
+
+1、修正搜索算法,完美运行
+
+2、添加试听功能,打开下载目录功能
+
+软件说明:
+
+1、程序采用众所周知的接口开发,下载高清320kbpsMP3音乐。
+
+2、采用豆瓣音乐API,自动获取专辑图片并保存在音乐的ID3标签中。
+
+截图与功能一览:
+
+![MusicDownloader](http://i.imgur.com/h8AYa.png)
+
+由于搜索算法问题,无法搜索除中文、英文之外的关键字。所以如果您搜索其他语言(如日文),可以尝试输入歌名中的中文字符而忽略假名等,同时输入歌手来精确定位,或者仅输入歌手。(如上图所示)
+
+![MusicDownloader](http://i.imgur.com/6iC8l.png)
+
+![MusicDownloader](http://i.imgur.com/ohftM.png)
+
+
+**下载地址:(支持迅雷等下载工具)**
+
+<http://down.4321.la/320kbps-MusicDownloader-1.4.rar>
+
+MusicDownloader已经被MusicSeeker所替代,目前MusicDownloader已经停止开发,请下载更加完善的MusicSeeker!
+
+软件基于.Net FrameWork3.5平台,如果您的系统是Windows7/Vista,则已经自带,如果是XP,您可以先下载软件试一下,如果不能运行,请到http://www.crsky.com/soft/21819.html下载.Net FrameWork3.5后安装!
+
+如果您觉得软件不错的话,希望您能推荐给您的朋友,这对我们来说是最大的支持!
View
55 posts/2011-01-03-lrc-is-a-must.markdown
@@ -0,0 +1,55 @@
+---
+layout: post
+title: "LRC IS A MUST! —— LRC歌词下载器"
+date: 2011-01-03 22:23
+comments: true
+categories: ideas
+---
+![LRC](http://i.imgur.com/dP4p5.png)
+
+软件名称:Lrc is a must!
+软件版本:1.0
+最后更新:2011年1月3日10:58:56
+
+**优点:相对于其它同类软件,方便易用不敢说,但是歌词库相当全!**
+
+<!-- more -->
+
+最近从某知名听歌软件换到了华丽的AirPlay……但是AirPlay的LRC歌词下载部分非常的不给力。
+
+所以就分析了之前那个软件的LRC下载算法,然后开发了这款软件。
+
+使用方法:
+
+第一步:下载并启动软件
+第二步:找到需要下载的歌曲所在目录,然后把歌曲选中,支持多选,拖拽到软件界面中。
+(仅支持MP3格式)
+![LRC](http://i.imgur.com/nHnab.png)
+
+软件的三个区域分别是:
+
+① 你拖拽进来的歌曲列表
+② 双击一个歌曲,出来的搜索结果
+③ 双击一个搜索结果,出来的歌词
+
+拖拽进去歌曲后,软件会自动读取ID3标签,如果没有问题的话,双击歌曲就可以搜索
+
+如果读取失败的话,可以在下面的Search区域进行相关修改后单击[Click]按钮
+
+![LRC](http://i.imgur.com/zxhW0.png)
+
+找到中意的歌词后,就可以单击SaveToFile按钮,LRC歌词将自动保存到与歌曲同文件夹的位置,并且与歌曲文件同文件名。效果如下:
+
+![LRC](http://i.imgur.com/dtSjW.png)
+
+**下载地址:**
+
+<http://down.4321.la/LRC-Downloader.rar>
+
+软件采用Delphi XE开发,所以不用装什么.net库了,软件制作的时候比较仓促,因为我还有其他的项目,所以界面比较搓,希望大家谅解。
+
+有任何意见建议请在下面提出,您的支持是我们最大的鼓励
+
+免责声明:
+所有的代码、程序仅供研究学习用,没有任何盈利目的,请各位用户下载后及时删除。
+开发者对软件的使用产生的任何法律问题及连带责任概不负责。
View
229 posts/2011-02-11-delphi-lrc-one.markdown
@@ -0,0 +1,229 @@
+---
+layout: post
+title: "[Delphi]Lrc歌词模块实现 Part1——格式化Lrc歌词文件"
+date: 2011-02-11 22:29
+comments: true
+categories: notes
+---
+最近闲来无事,于是准备开发适合一款播放器,必不可少的就是Lrc歌词显示部分
+
+从网上找了一些现成的算法,不是做得很搓,就是做得太霸气,一点都看不懂,于是自己想了一个思路。
+
+1、按行读取LRC歌词,分析每一行的标签 procedure Anylize(s:string)
+2、将所有标签整理出来,歌词的时间标签换算成Longint (ToTime),存到一个动态数组中
+
+ Lyric=record
+ Time:Longint; //时间
+ Content:string; //内容
+ Line:Integer; //第几行,为以后的GDI+滚动显示做准备
+ end;
+ var
+ Lrc:array of Lyric;
+
+3、进行快速排序,按照Time升序排序。
+
+4、播放时不停进行二分查找,将查找出来的结果显示即可。
+
+<!-- more -->
+
+根据这个思路,我们来编写代码
+
+首先来看一段LRC歌词,了解一下LRC歌词的结构:
+[ti:Crawling]
+
+[ar:Linkin Park]
+
+[al:Hybrid Theory]
+
+[00:00.00]Linkin Park – Crawling
+
+[00:11.50]
+
+[02:23.74][01:26.89][00:23.40]Crawling in my skin
+
+[02:28.11][01:31.31][00:27.74]These wounds they will not heal
+
+[02:32.58][01:35.70][00:32.35]Fear is how I fall
+
+[02:37.11][01:40.27][00:36.60]Confusing what is real
+
+[00:41.90]
+
+………………
+
+[03:00.99]There’s something inside me that pulls beneath the surface
+
+[03:05.49]Consuming, confusing what is real
+
+[03:09.78]This lack of self control I fear is never ending
+
+[03:14.42]Controlling, confusing what is real
+
+[03:22.93][03:21.08]
+
+[03:26.09]****END****
+
+上面的[ti:Crawling]等等是标识标签(ID-Tags),用来标示艺人名、歌曲名、专辑名、LRC编者、时间补偿等,对我们来说最有用的是时间补偿,处理也相对简单,不过经过我的测试这个东西实际应用起来不是很多,尤其是从网上下载的歌词,所以暂时不考虑,有兴趣的朋友可以在算法上加上这个时间补偿的处理。
+
+形式为"[mm:ss.ff]"或"[mm:ss.fff]"的标签为时间标签(Time-Tags),数字都是非负整数,形式也很简单,但是需要注意的是后面毫秒的位数,如果是小于三位的话需要从后面补零。
+
+准备工作完毕,开工!
+
+
+第一步:
+
+读入Lrc歌词文件。
+
+这个毫无技术含量,与普通文本文件读取方式一样,放到String里即可。
+
+我使用的是TFileStream类读入的文件,不再赘述,大家可以直接谷歌搜索delphi读取文本文件的例子就可以。
+
+第二步:
+
+使用正则表达式,每行每行的分析Lrc文件。
+
+参考正则表达式的手册(- – 每次写正则必须看,那语法简直……),写了一个正则表达式
+
+
+ ^((\[\d+:\d+\.\d+\])+)(.*?)$
+
+
+这个正则表达式能够一行一行(preMultiLine)的(^$)的匹配含有时间标签的Lrc歌词,同时将正则匹配结果的分组[1]和分组[3]即时时间标签的内容和当前行的歌词内容提取出来,非常方便。需要注意的是每行歌词中可能含有多个时间标签,在正则中使用+限定符即可正常匹配。
+
+实现代码如下:
+
+ procedure Anylize(s:string); //通过正则表达式解析歌词
+ const
+  RegEx:string='^((\[\d+:\d+\.\d+\])+)(.*?);' //正则表达式
+ var
+  Reg:TPerlRegEx;
+  a,b:String;
+  I,ACount:Integer;
+  AStrings: TStringList;
+ begin 
+ Reg:=TPerlRegEx.Create();
+ Reg.Options:=[preMultiLine,preCaseLess]; //重要:设置匹配模式:多行
+ Reg.Subject:=s;
+ Reg.RegEx:=RegEx;
+  try
+    while Reg.MatchAgain do
+    begin
+     a:=Reg.Groups[1]; //时间标签
+     b:=Reg.Groups[3]; //歌词内容
+      AStrings:=TStringList.Create;
+     try
+       ACount:=ExtractStrings(['[',']'], [], PChar(a), AStrings);
+       //将时间标签的[]括号替换掉,同时进行文本分割,将多个时间标签分分割成TStringList
+       for I := 0 to ACount-1 do
+       begin
+         SetLength(Lrc,Length(Lrc)+1);
+         //加入成员
+         Lrc[Length(Lrc)-1].Time:=ToTime(AStrings[I]);
+         Lrc[Length(Lrc)-1].Content:=b;
+         //对于单行多个时间标签的情况 自动拆开处理
+         //例如:[02:37.11][01:40.27][00:36.60]Confusing what is real
+         //将识别为三句 即每句分别是
+         //[02:37.11]Confusing what is real
+         //[01:40.27]Confusing what is real
+         //[00:36.60]Confusing what is real
+       end;
+     finally
+       AStrings.Free;
+     end;
+    end;
+  finally
+    Reg.Free;
+  end;
+
+ QuickSort(0, Length(Lrc)-1); //快排
+ //Lrc歌词大多数已经局部有序,除非是单行多标签情况或者编写者故意找事,所以使用快排时间复杂度不会很高
+ Lrc[0].Line:=3;
+ //设置首行为第三行 这样进行滚动显示时 第一行歌词显示在中间,在以后的篇章中会详细说明
+  LrcInAll:=Lrc[0].Content;
+  for I := 1 to Length(LRC) - 1 do
+  begin
+   Lrc[I].Line:=Lrc[I-1].Line+CalculateLines(I-1);
+   LrcInAll:=LrcInAll+ #13#10 + Lrc[I].Content;
+  end; //将所有歌词都保存一遍
+ end;
+
+第三步:
+
+关于将时间标签转换成Longint,只需要将各个部分做乘法然后想加即可
+
+具体实现代码:
+
+ function ToTime(s:string):Longint;
+ const
+  RegEx:string='^(\d+):(\d+)(\.(\d+))?;'
+  //使用正则表达式将每部分分别取出来,当然也可以进行字符串分割,我这里比较懒就直接用正则了
+ var
+  Reg:TPerlRegEx;
+  ans:Integer;
+  ms:string;
+ begin
+  Reg:=TPerlRegEx.Create();
+  try
+    Reg.Options:=[preCaseLess];
+    Reg.Subject:=s;
+    Reg.RegEx:=RegEx;
+    if Reg.Match then
+    begin
+      ms:=Reg.Groups[4];
+      if Length(ms)=1 then ms:=ms+'00';
+      if Length(ms)=2 then ms:=ms+'0'; //对于毫秒,进行补零操作
+      ans:=(StrToInt(Reg.Groups[1]) * 60 * 1000)+(StrToInt(Reg.Groups[2])*1000)+StrToInt(ms);
+    end;
+  finally
+    Reg.Free;
+    Result:=ans;
+  end;
+ end;
+
+第四步:
+
+快速排序算法,这个实在是没有什么好说的,排序的目的是为了将歌词按正常顺序全部输出,方便做滚动字幕,同时也方便二分查找。
+
+ procedure QuickSort(const left, right: Integer);
+ //QSort 不解释
+   procedure swap(const i, j: Integer);
+   var
+     vT: Integer;
+     vS: String;
+   begin
+     if i = j then Exit;
+     vT := Lrc[i].Time;
+     Lrc[i].Time := Lrc[j].Time;
+     Lrc[j].Time := vT; 
+     vS := Lrc[i].Content;
+     Lrc[i].Content := Lrc[j].Content;
+     Lrc[j].Content := vS;
+   end;
+ var
+   vL, vR: Integer;
+ begin
+   if left >= right then Exit;
+   vL := left;
+   vR := right + 1;
+   while True do
+   begin
+     while vL + 1 < Length(Lrc) do
+     begin
+       Inc(vL);
+       if Lrc[vL].Time >= Lrc[left].Time then Break;
+     end;
+     while vR - 1 < Length(Lrc) do
+     begin
+       Dec(vR);
+       if Lrc[vR].Time <= Lrc[left].Time then Break;
+     end;
+     if vL >= vR then Break;
+     swap(vL, vR);
+   end;
+   swap(left, vR);
+   QuickSort(left, vR - 1);
+   QuickSort(vR + 1, right);
+ end;
+
+
+这样,我们就已经成功地解析了Lrc歌词,并将它存放在内存(动态数组)里
View
14 posts/2011-02-11-pureplayer.markdown
@@ -0,0 +1,14 @@
+---
+layout: post
+title: "蛋疼的开发了一个PurePlayer音乐播放器"
+date: 2011-02-11 22:48
+comments: true
+categories: notes
+---
+![PurePlayer](http://i.imgur.com/TVlzw.png)
+
+<!-- more -->
+
+如图所示,基于基于Win32控制台,基本实现了LRC歌词等功能,当然了,不准备发布出来,自己用用就可以了
+
+准备将歌词部分整理出来,将思路写下来
View
18 posts/2011-02-11-thunder7skin.markdown
@@ -0,0 +1,18 @@
+---
+layout: post
+title: "WPF仿迅雷7简易文本框焦点移动特效"
+date: 2011-02-11 22:45
+comments: true
+categories: notes
+---
+![Thunder7](http://i.imgur.com/QLV64.png)
+
+
+实现原理:
+
+在主窗体上绘制一个Border,然后每次文本框获得或者失去焦点的时候启动一个StoryBoard来移动Border。
+<!-- more -->
+
+源代码下载:
+
+<http://down.4321.la/Thunder7Textbox.rar>
View
287 posts/2011-02-17-wpf-button.markdown
@@ -0,0 +1,287 @@
+---
+layout: post
+title: "使用WPF创建具有渐变效果的按钮特效"
+date: 2011-02-17 22:50
+comments: true
+categories: notes
+---
+对于我这样的不会C++,不会GDI+,不精通Photoshop的悲催人士来说,想实现华丽的界面,唯有使用WPF,虽然它属于托管平台,运行效率也非常低,但是在UI设计上确实是非常的给力。
+
+先放一张效果图:
+
+正常状态效果:![WPF](http://i.imgur.com/ubqSI.png)
+
+鼠标悬停效果:![WPF](http://i.imgur.com/eBe4B.png)
+
+<!-- more -->
+
+同时这期间含有的渐变外发光特效,图片上看不出来效果,大家可以下载我的320Kbps音乐下载助手即可看到效果,或者将下文的代码自己调试出来即可。
+
+{% blockquote %}
+转载请注明 http://www.4321.la
+{% endblockquote %}
+
+第一步,使用Microsoft Expression Blend 4新建一个WPF 3.5工程,如下图所示:
+
+![WPF](http://i.imgur.com/eBe4B.png)
+
+第二步,使用左侧工具栏添加一个Button到客户区中
+![image](http://i.imgur.com/XX26G.png)
+
+![image](http://i.imgur.com/SFaaS.png)
+
+第三步,选中按钮,以此单击菜单对象 – 编辑样式 – 编辑副本
+
+![image](http://i.imgur.com/vMyRj.png)
+
+为了方便以后将相同的样式应用到别的按钮中,推荐选择定义位置为“应用程序”,同时起一个好记的名字:
+
+![image](http://i.imgur.com/pSMiG.png)
+
+单击确定按钮以后,程序会自动打开App.xaml文件,如下图所示:
+
+![image](http://i.imgur.com/anP8m.png)
+
+第四步,切换到XAML编辑模式,通过敲代码来实现一个绚丽的按钮,先实现更改默认的颜色
+
+![image](http://i.imgur.com/DNKaf.png)
+
+切换到XAML模式,顿时就会出现很多的代码(如图),不过微软还是比较仗义的,刷子、属性的名称都是用的比较通俗的英语……没有什么mov啊pop啊push啊什么的……
+
+![image](http://i.imgur.com/4YnYm.png)
+
+首先,先修改ButtonNormalBackground这个LinearGradientBrush(线性渐变刷子,更多信息参考MSDN,传送门),把Windows7/Vista自带的那种灰黑渐变的按钮改成白灰渐变。
+
+系统自动生成的代码是:
+
+ <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
+   <GradientStop Color="#F3F3F3" Offset="0"/>
+   <GradientStop Color="#EBEBEB" Offset="0.5"/>
+   <GradientStop Color="#DDDDDD" Offset="0.5"/>
+   <GradientStop Color="#CDCDCD" Offset="1"/>
+ </LinearGradientBrush>
+
+将他修改成:
+
+
+ <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
+    <GradientStop Color="#fefefe" Offset="0"/> <!--非鼠标Hover的背景颜色-->
+    <GradientStop Color="#fefefe" Offset="0.5"/>
+    <GradientStop Color="#efefef" Offset="0.5"/>
+    <GradientStop Color="#efefef" Offset="1"/>
+ </LinearGradientBrush>
+
+(当然如果有自己喜欢的颜色也可以更改上去,或者也可以多加几个颜色渐变,Color是颜色,Offset是位置)
+
+到这里可以F5运行一下,非鼠标Hover的时候,就已经生效了!
+
+第五步,修改鼠标Hover时候的颜色以及渐变效果
+
+这时候发现下面的代码不给力了,微软没有Hover啊什么的这样的敏感关键词在里面,只能自己原创了……
+
+首先在
+
+ <Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
+
+里面添加
+
+ <Style.Resources>
+
+再添加两个Storyboard,用来显示渐变效果(这种时候还是敲代码最好,不推荐用什么可视化设计器):
+
+![image](http://i.imgur.com/b6K9I.png)
+
+ <Style.Resources>
+   <Storyboard x:Key="ButtonHover">
+     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)">
+     <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="5" />
+     </DoubleAnimationUsingKeyFrames>
+   </Storyboard>
+   <Storyboard x:Key="ButtonWithoutHover">
+     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)">
+     <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="0" />
+     </DoubleAnimationUsingKeyFrames>
+   </Storyboard>
+ </Style.Resources>
+
+关于上面的代码的作用,大家可以对照MSDN理解一下,<http://www.microsoft.com/china/MSDN/library/windev/longhorn/storyboardstory.mspx?mfr=true>
+
+然后我们在下面添加两个触发器(Style.Triggers),第一个触发器同时实现两个功能:启动Storyboard,修改按钮颜色;第二个触发器绑定的是IsPressed事件,让按钮按住的时候修改背景颜色为灰色,这样就有按下的感觉。
+
+![image](http://i.imgur.com/a3nO9.png)
+
+
+ <Style.Triggers>
+ <Trigger Property="IsMouseOver" Value="True">
+ <Trigger.ExitActions>
+ <BeginStoryboard x:Name="ButtonWithoutHover_BeginStoryboard" Storyboard="{StaticResource ButtonWithoutHover}"/>
+ </Trigger.ExitActions>
+ <Trigger.EnterActions>
+ <BeginStoryboard Storyboard="{StaticResource ButtonHover}"/>
+ </Trigger.EnterActions>
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
+ <GradientStop Color="White" Offset="0"/> <!--鼠标Hover的背景颜色-->
+ <GradientStop Color="#fbfcfe" Offset="0.5"/>
+ <GradientStop Color="#d4e8fe" Offset="0.5"/>
+ <GradientStop Color="#fbfcfe" Offset="1"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="Foreground" Value="#FF34AFF6"/>
+ </Trigger>
+ <Trigger Property="IsPressed" Value="True">
+ <Trigger.ExitActions>
+ <StopStoryboard BeginStoryboardName="ButtonWithoutHover_BeginStoryboard"/>
+ </Trigger.ExitActions>
+ <Trigger.EnterActions>
+ <BeginStoryboard x:Name="ButtonWithoutHover_BeginStoryboard1" Storyboard="{StaticResource ButtonWithoutHover}"/>
+ </Trigger.EnterActions>
+ <Setter Property="Background" Value="#eaeaea" />
+ <Setter Property="Foreground" Value="Gray"/>
+ </Trigger>
+ </Style.Triggers>
+
+再回头看看两个Storyboard,修改了按钮的OuterGlowBitmapEffect(外发光)特性,注意是修改,所以如果原来不存在这个属性的话,会出错,所以再在Triggers后面添加一个Setter
+
+![image](http://i.imgur.com/0VIsb.png)
+
+ <Setter Property="BitmapEffect">
+   <Setter.Value>
+     <OuterGlowBitmapEffect GlowColor="#9ecaf4" GlowSize="0" />
+   </Setter.Value>
+ </Setter>
+
+这时候可以按下F5运行一下看一下效果了。
+
+第六步,修复BUG
+
+这时大家会发现,辛苦自己写的外发光、渐变、背景修改等特效全部又被Windows自带的效果给覆盖了。
+
+其实正是因为我们之前选择编辑样式的时候选择了编辑副本,微软自动把默认的按钮样式给Copy进来了,方便进一步修改,所以新建样式的同时也需要删除掉不需要的样式。
+
+首先将<Setter Property="Template">中的<ControlTemplate.Triggers>删掉,删掉默认的触发器。
+
+![image](http://i.imgur.com/LgBpr.png)
+
+再将Microsoft_Windows_Themes:ButtonChrome里的RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RenderDefaulted="{TemplateBinding IsDefaulted}"这部分删掉即可。
+
+此时整个
+
+ <Setter Property="Template">
+
+的代码为
+
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="{x:Type Button}">
+ <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
+ <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
+ </Microsoft_Windows_Themes:ButtonChrome>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+
+
+完成!
+
+这样我们就实现了一个比较漂亮的按钮的样式,F5运行一下,已经没有BUG了。
+
+扩展,将已有的样式应用到新添加的按钮中
+
+如果需要把新建按钮同时应用这个样式的话,很简单,只需要设置Button的Style="{DynamicResource ButtonStyle}"
+
+如下图所示:
+
+![image](http://i.imgur.com/zO3z0.png)
+
+至此就全部完成了,没手工写API,不用自己搞神马HDC,连Photoshop也没开,敲代码就可以实现非常漂亮的按钮样式。
+
+附录 完工后的XAML按钮样式部分代码:
+
+ <Style x:Key="ButtonFocusVisual">
+ <Setter Property="Control.Template">
+ <Setter.Value>
+ <ControlTemplate>
+ <Rectangle Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1" Margin="2" SnapsToDevicePixels="true"/>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
+ <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
+ <GradientStop Color="#fefefe" Offset="0"/> <!--非鼠标Hover的背景颜色-->
+ <GradientStop Color="#fefefe" Offset="0.5"/>
+ <GradientStop Color="#efefef" Offset="0.5"/>
+ <GradientStop Color="#efefef" Offset="1"/>
+ </LinearGradientBrush>
+ <SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>
+ <Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
+ <Style.Resources>
+ <Storyboard x:Key="ButtonHover">
+ <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)">
+ <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="5" />
+ </DoubleAnimationUsingKeyFrames>
+ </Storyboard>
+
+ <Storyboard x:Key="ButtonWithoutHover">
+ <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)">
+ <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="0" />
+ </DoubleAnimationUsingKeyFrames>
+ </Storyboard>
+ </Style.Resources>
+ <Style.Triggers>
+ <Trigger Property="IsMouseOver" Value="True">
+ <Trigger.ExitActions>
+ <BeginStoryboard x:Name="ButtonWithoutHover_BeginStoryboard" Storyboard="{StaticResource ButtonWithoutHover}"/>
+ </Trigger.ExitActions>
+ <Trigger.EnterActions>
+ <BeginStoryboard Storyboard="{StaticResource ButtonHover}"/>
+ </Trigger.EnterActions>
+ <Setter Property="Background">
+ <Setter.Value>
+ <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
+ <GradientStop Color="White" Offset="0"/> <!--鼠标Hover的背景颜色-->
+ <GradientStop Color="#fbfcfe" Offset="0.5"/>
+ <GradientStop Color="#d4e8fe" Offset="0.5"/>
+ <GradientStop Color="#fbfcfe" Offset="1"/>
+ </LinearGradientBrush>
+ </Setter.Value>
+ </Setter>
+ <Setter Property="Foreground" Value="#FF34AFF6"/>
+ </Trigger>
+ <Trigger Property="IsPressed" Value="True">
+ <Trigger.ExitActions>
+ <StopStoryboard BeginStoryboardName="ButtonWithoutHover_BeginStoryboard"/>
+ </Trigger.ExitActions>
+ <Trigger.EnterActions>
+ <BeginStoryboard x:Name="ButtonWithoutHover_BeginStoryboard1" Storyboard="{StaticResource ButtonWithoutHover}"/>
+ </Trigger.EnterActions>
+ <Setter Property="Background" Value="#eaeaea" />
+ <Setter Property="Foreground" Value="Gray"/>
+ </Trigger>
+ </Style.Triggers>
+ <Setter Property="BitmapEffect">
+ <Setter.Value>
+ <OuterGlowBitmapEffect GlowColor="#9ecaf4" GlowSize="0" />
+ </Setter.Value>
+ </Setter>
+ <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
+ <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
+ <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
+ <Setter Property="BorderThickness" Value="1"/>
+ <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
+ <Setter Property="FontFamily" Value="微软雅黑" />
+ <Setter Property="HorizontalContentAlignment" Value="Center"/>
+ <Setter Property="VerticalContentAlignment" Value="Center"/>
+ <Setter Property="Padding" Value="1"/>
+ <Setter Property="Template">
+ <Setter.Value>
+ <ControlTemplate TargetType="{x:Type Button}">
+ <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" >
+ <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/>
+ </Microsoft_Windows_Themes:ButtonChrome>
+ </ControlTemplate>
+ </Setter.Value>
+ </Setter>
+ </Style>
View
65 posts/2011-03-05-musicseeker.markdown
@@ -0,0 +1,65 @@
+---
+layout: post
+title: "MusicSeeker——歌曲、专辑图片、歌词全自动下载工具"
+date: 2011-03-05 23:08
+comments: false
+categories: ideas
+---
+
+MusicSeeker是一款基于MusicDonwloader设计思想的,为iPhone、iPod Touch、Android等大屏幕触摸手机、MP4开发的音乐下载软件。
+
+软件名称:MusicSeeker
+
+软件特性:自动选择最高码率(320Kbps)、自动下载导入专辑图片、自动下载LRC歌词、自动下载支持iTunes的静态歌词、自动添加到iTunes音乐库。
+
+最后更新:2011年3月20日13:30:04
+
+![image](http://i.imgur.com/M8LbA.png)
+
+<!-- more -->
+
+软件介绍:介于很多朋友对我的MusicDownloader的支持,以及旧版遗留的诸多问题,这次我专门抽时间进行了全新的开发,旨在解决问题和更好的给大家提供服务。新版MusicSeeker在MusicDownloader的基础上添加了码率显示、低码率文件下载支持、LRC歌词及静态歌词下载支持。
+
+全新设计的UI: 皮肤设计 – 恋星(<http://yistring.com/ifun/>),感谢恋星对软件的开发提供界面设计。
+
+![image](http://i.imgur.com/FAvLo.png)
+
+新版的MusicSeeker添加了对歌曲信息的编辑功能的支持,如果您想要下载的歌曲的名称过于繁冗,或者专辑名称错误导致无法找到正确的专辑图片,均可以在添加下载任务的时候进行修改。PS:单击“应用”的同时程序会重新根据专辑来获取专辑图片。
+
+![image](http://i.imgur.com/ZTIDI.png)
+
+歌曲会自动下载到 我的文档 – 我的音乐 目录,当然您也可以通过双击下载列表来迅速定位到文件
+
+LRC歌词自动下载,并保存到音乐所在目录,与音乐文件同文件名:
+
+![image](http://i.imgur.com/m6Pff.png)
+
+如果勾选了“自动下载专辑图片”“自动下载歌词”等功能,下载下来的图片是完全兼容iTunes的:
+
+![image](http://i.imgur.com/UFico.png)
+
+在我的iPod Touch里面的播放效果:
+
+![image](http://i.imgur.com/qr3lU.png)
+
+最重要的是,歌词、专辑图片全部都是一键下载,完全不需要手动再去搜索资源!
+
+要运行MusicSeeker,您的PC必须安装有Microsoft .Net Framework 3.5 SP1以及微软雅黑字体,如果您使用的Windows 7/Vista系统,则系统已经自带,无需再次安装,如果您用的是Windows Xp系统,则也请下载我们的软件进行运行,如果缺少以上组件,程序会给出提示,同时给出具体的解决方案。
+
+下载地址:
+
+直接下载 – <http://down.4321.la/MusicSeeker20110320.zip> (支持迅雷等下载工具)
+
+最后更新:2011年3月20日13:30:37
+
+更新版本:0.11
+
+更新内容:
+
+1、修复已知崩溃问题、歌词匹配不准的问题
+
+2、增加韩文搜索支持
+
+
+
+**(MusicSeeker目前仅是从MusicDownloader上继续开发而来的第一个版本,在停止MusicDownloader项目的同时,MusicSeeker后续版本将会给大家带来更全的歌曲曲库、试听等更加实用的功能,敬请期待。)**
View
72 posts/2011-04-05-musicsorter-faq.markdown
@@ -0,0 +1,72 @@
+---
+layout: post
+title: "MusicSorter使用教程"
+date: 2011-04-05 23:15
+comments: false
+categories: ideas
+---
+首先,感谢您选用MusicSorter作为您的音乐整理软件,推荐您仔细阅读下面的教程,以获得更加的用户体验。
+
+<!-- more -->
+
+教程一:添加歌曲
+
+启动软件,等待Loading画面结束,单击软件左下角的“![image](http://i.imgur.com/1XHS8.png)”按钮即可
+
+在添加对话框中,您可以多选文件,或者按Ctrl+A全选一个文件夹内的所有文件
+
+![image](http://i.imgur.com/b1sqP.png)
+
+当前版本仅支持MP3类型的文件,其它类型的文件会自动忽略,无需手动排除
+
+教程二:选中歌曲、自动下载专辑图片、歌曲歌词
+
+![image](http://i.imgur.com/s7DLX.png)
+
+添加歌曲之后,如果歌曲本身已经带有专辑图片、歌词的话,软件右面就会有![image](http://i.imgur.com/Xl4vC.png)的提示
+
+选中一款不含专辑图片或者歌词的歌曲,程序就会自动开始搜索,并在右边显示出来搜索出来的专辑封面的结果
+
+![image](http://i.imgur.com/U9uRD.png)
+
+
+专辑封面的两侧有时候有“<“”>”的按钮,意味着有多个专辑图片供您选择。
+
+如果搜索不到结果,请在下面的”歌曲信息“里面进行修改,然后按回车键重新调用软件自动搜索
+
+对于专辑图片错误的歌曲,也可以通过对歌曲信息修改并按回车键的方法来重新激活软件搜索
+
+![image](http://i.imgur.com/qjLI5.png)
+
+当歌曲专辑图片OK后,就可以单击“保存”按钮保存修改到歌曲了!
+
+这时歌曲列表的左边对应的歌曲也会显示出歌曲已经包含专辑图片了。
+
+![image](http://i.imgur.com/iB6vu.png)
+
+教程三:手动编辑歌词、删除歌词或专辑图片
+
+右键单击歌曲项目,会弹出快捷菜单,支持编辑、删除歌曲歌词,删除专辑图片。
+
+方便在专辑图片或歌曲歌词错误的时候进行人工修改。
+
+![image](http://i.imgur.com/6i8De.png)
+
+![image](http://i.imgur.com/h99Zk.png)
+
+教程四:批量下载
+
+批量下载适用于歌曲较多、歌曲ID3已经比较整齐的情况,如果您的歌曲大多都是百度下载的,ID3标签并不是非常准确,则批量下载的体验会因此大大折扣。
+
+另外软件处于测试阶段,强烈推荐您在批量下载之前备份您的歌曲,如果遇到任何批量下载过程中软件崩溃、歌曲损坏的问题,请及时联系我们。
+
+批量下载的方法非常简单,添加歌曲、单击”下载全部歌曲歌词“即可!
+
+下载前推荐您关闭迅雷等占用带宽的软件,以加快软件下载专辑图片的速度。
+
+![image](http://i.imgur.com/Tcwmu.png)
+
+
+软件的大概使用方法就是这样了,有任何的问题请从软件发布帖内留言回复或者通过E-Mail、微博联系我,这篇文章关闭回复,不然实在是忙不过来,呵呵。
+
+再次感谢您的支持
View
78 posts/2011-04-08-musicsorter-musicnamer.markdown
@@ -0,0 +1,78 @@
+---
+layout: post
+title: "MusicSorter + MusicNamer – 整理音乐?No Problem!"
+date: 2011-04-08 23:18
+comments: true
+categories: ideas
+---
+MusicSeeker发布以后有很多的朋友支持我,同时有很多人提出开发一款整理现有音乐的软件,断断续续的开发了一个月,基本完工了,就是您现在正在看的软件——MusicSorter。
+
+MusicSorter是一款整理已有音乐、自动下载专辑图片、下载静态歌词保存到iTunes等软件可以识别的标签中的软件,非常适合iPhone、iPod Touch等大屏幕等支持专辑图片显示的手机、MP4。
+
+<!-- more -->
+
+最后更新:2011年6月7日 16:01:54
+
+更新内容:1、修复歌词算法的一处BUG 2、添加手动选择歌词 手动搜索歌词的功能
+
+![image](http://i.imgur.com/aNNoS.png)
+
+
+首先感谢恋星同学(http://yistring.com/ifun/)软件开发提供的皮肤设计,超赞!
+
+软件启动界面如下:
+
+![image](http://i.imgur.com/2Eap1.png)
+
+批量下载截图:
+
+![image](http://i.imgur.com/rUo4p.png)
+
+整理效果截图:
+
+歌曲的专辑图片已经井然有序,这时候导入iTunes等软件就非常方便省事了。
+
+![image](http://i.imgur.com/ifskJ.png)
+
+
+
+2011年6月7日 更新内容说明:
+
+
+![image](http://i.imgur.com/fnX0S.jpg)
+
+
+歌曲右键 – 编辑歌曲歌词中,添加功能,方便手动搜索歌词。
+
+————————————————————————————————————
+
+补充说明:
+
+1、要运行MusicSorter,您的PC必须安装有Microsoft .Net Framework 3.5 SP1以及微软雅黑字体,如果您使用的Windows 7/Vista系统,则系统已经自带,无需再次安装,如果您用的是Windows XP系统,则也请下载我们的软件进行运行,如果缺少以上组件,程序会给出提示,同时给出具体的解决方案。
+
+(如果您的电脑已经成功运行MusicSeeker,则运行MusicSorter就不会有任何问题,同时MusicSorter针对64位系统进行了专门优化,支持原生64位模式下运行!)
+
+2、软件当前处于测试阶段,强烈推荐您在开启批量下载前备份您的歌曲!
+
+3、关于软件的使用教程,请查看MusicSorter的软件使用教程,因为我对UI交互不是很在行,希望大家多多谅解,耐心读一下教程,有任何使用上的问题请直接回复该文章或者给我发E-Mail,收到邮件的第一时间会回复大家的!
+
+教程传送门:http://blog.4321.la/2011/04/318.html
+
+————————————————————————————————————
+
+MusicNamer:
+
+MusicSorter的开发离不开Shindo同学的支持,本次发布中联合发布MusicSorter与MusicNamer这两款软件,MusicNamer是一款根据歌曲ID3标签自动重命名软件的轻量级工具,基于Windows SDK开发:
+
+![image](http://i.imgur.com/D3Ddq.jpg)
+
+更多信息,请访问MusicNamer发布页:<http://sdou.net/2011/04/133.html>
+
+
+————————————————————————————————————
+
+下载地址(MusicSorter + MusicNamer)
+
+直接下载地址:<http://down.4321.la/MusicSorterNamer20110607.zip>
+
+感谢各位的支持,欢迎大家提出意见建议,您的支持是我们最大的动力!
View
47 posts/2011-05-07-kissxiami.markdown
@@ -0,0 +1,47 @@
+---
+layout: post
+title: "KissXiami – 轻量级在线虾米音乐下载网站上线"
+date: 2011-05-07 23:31
+comments: true
+categories: ideas
+---
+KissXiami.com是我在开发MusicSeeker和MusicSorter这样的.NET WPF架构的东西时的业余作品,主要是想练练PHP,网站非盈利,无广告,简洁的界面……
+
+如果你直接打开KissXiami.com的话,估计会失望……是的,网站简陋到连个首页都木有……
+
+那如何使用呢?
+
+方法很简单:
+
+第一步:上虾米网站上找到自己中意的单曲、专辑、歌手页面、精选集页面。
+
+第二步:从浏览器打开页面。
+
+以上两步做不好的人请自觉去书店买一本老年人学电脑……
+
+例如此时打开的页面的网址是:http://www.xiami.com/song/1769196206
+
+然后,把鼠标放在地址栏上,对,就是显示地址的那东西(据说有一个O开头的浏览器会把地址后面部分隐藏,点一下就可以了……)
+
+![image](http://i.imgur.com/TBsO2.png)
+
+然后更改网址,把www.xiami.com改成www.kissxiami.com,其实说明白了,就是在xiami前面加上一个kiss
+
+![image](http://i.imgur.com/jlaRL.png)
+
+然后,按下亲爱的回车键,就是键盘上标有Enter的那个按键
+
+![image](http://i.imgur.com/9ywms.png)
+
+
+网页载入完毕以后就会自动探测歌曲的下载地址,音质是虾米的试听音质,很搓,但是总比没有好……
+
+如果你想追求更完美的音质,还是推荐您看看我老早就发布了的那一款软件:MusicSeeker
+
+至于下载,虽然说迅雷也不是不可以,但是我测试还是用目标另存为下载的效果最好,迅雷有时候有速度有时候没有的挺麻烦的……
+
+就写这么多吧,目前KissXiami支持单曲、专辑、歌手页面、精选集,使用的方法都一样,都是把网址里的xiami.com前面加上kiss即可
+
+
+
+感谢您的支持,有任何问题或者意见建议请从下面评论,或者给我发E-Mail。
View
85 posts/2011-05-07-musicseeker2.markdown
@@ -0,0 +1,85 @@
+---
+layout: post
+title: "MusicSeeker – 歌曲、专辑图片、歌词全自动下载工具 Version 2.0"
+date: 2011-05-07 23:27
+comments: true
+categories: ideas
+---
+MusicSeeker 2.0 是一款基于MusicDonwloader设计思想的,为iPhone、iPod Touch、Android等大屏幕触摸手机、MP4开发的音乐下载软件,基于MusicSeeker第一个版本完善改进而来。
+
+
+
+MusicSeeker 2.0软件特性:
+
+0 自动选择最高码率MP3音质(320Kbps)、自动下载导入专辑图片、自动下载LRC歌词、自动下载支持iTunes的静态歌词
+
+1 采用全新的UI设计,基于Windows Aero思想。
+
+2 添加无损音乐(FLAC\APE)源(仅支持部分歌曲)。
+
+3 添加对Windows-64Bit的原生支持(非WOW64)。
+
+4 添加音乐视听功能、音乐分享功能。
+
+5 添加下载目录设置功能。
+
+6 添加全局异常捕获,一定程度防止软件崩溃。
+
+7 修复歌曲下载歌词混乱的BUG。
+
+8 修复下载歌曲重名的BUG,采用“歌曲名 – 歌手名.扩展名”的命名方式。
+
+9 去除部分繁冗的选项,删除自动添加到iTunes的功能(多占用磁盘空间)。
+
+10 删除部分软件特效动画,增加软件运行流畅度。
+
+11 添加对低码率音乐的搜索支持,完善搜索算法,音乐库资源更加全面!
+
+12 进一步完善对日文、韩文搜索优化
+
+![image](http://i.imgur.com/Z4htO.png)
+
+
+软件介绍:MusicSeeker第一版发布以来,着实解决了许多网友下载音乐的问题,虽然软件是从MusicDownloader上完善而来,但是仍然存在着一些问题,这个版本在修复问题的同时,也进一步的加强了软件的易用性。
+
+<!-- more -->
+
+
+全新设计的UI: 皮肤设计 – 恋星(http://yistring.com/ifun/),感谢恋星对软件的开发提供界面设计。
+
+![image](http://i.imgur.com/yyIVx.png)
+
+添加了搜索智能提示功能,方便搜索歌曲
+
+![image](http://i.imgur.com/8Bami.png)
+
+添加了歌曲试听功能、复制歌曲试听地址、分享微博功能
+
+![image](http://i.imgur.com/0M04y.png)
+
+MusicSeeker添加了对歌曲信息的编辑功能的支持,如果您想要下载的歌曲的名称过于繁冗,或者专辑名称错误导致无法找到正确的专辑图片,均可以在添加下载任务的时候进行修改。PS:单击“应用”的同时程序会重新根据专辑来获取专辑图片。
+
+![image](http://i.imgur.com/tcIwk.png)
+
+下载列表中添加了右键菜单,同时通过双击下载列表也可以来迅速定位到文件。
+
+![image](http://i.imgur.com/ijNh7.png)
+
+Version2.0里面添加了软件设置,支持设置音乐下载保存路径、无损音乐格式(FLAC或APE)
+
+![image](http://i.imgur.com/FvH2R.png)
+
+下载下来的歌曲均已经含有歌词和专辑图片,是完全兼容iTunes的,上图是在我的iTouch里的播放效果。
+
+最重要的是,歌词、专辑图片全部都是一键下载,完全不需要手动再去搜索资源!
+
+要运行MusicSeeker,您的PC必须安装有Microsoft .Net Framework 3.5 SP1以及微软雅黑字体,如果您使用的Windows 7/Vista系统,则系统已经自带,无需再次安装,如果您用的是Windows Xp系统,则也请下载我们的软件进行运行,如果缺少以上组件,程序会给出提示,同时给出具体的解决方案。
+
+下载地址:
+
+<http://down.4321.la/MusicSeekerPlus.zip>
+
+(支持迅雷等下载工具)
+
+最后更新:2011年5月9日
+更新内容: 修复无损音乐部分下载地址错误的BUG
View
41 posts/2011-08-09-iyy-qqmusic.markdown
@@ -0,0 +1,41 @@
+---
+layout: post
+title: "MusicSeeker Plug-in for iYY 1.0"
+date: 2011-08-09 23:33
+comments: true
+categories: ideas
+---
+年初的时候入手了MacBook Pro,开始了解Mac OS X系统。
+
+发现常用的软件基本都有可替代方案,但是播放音乐、显示歌词始终找不到完美的程序。
+
+最近发现了iYY这款音乐软件,软件的界面非常华丽,同时支持歌词搜索与显示功能,类似于Windows下的千千静听。
+
+![image](http://www.beyondcow.com/iyy/plugin/img/qqmusic.png)
+
+<!-- more -->
+
+软件的功能恰好满足大部分人的需求,发现的几款软件BUG我也很快就找到作者,并联系他解决了问题。
+
+于是我就开工开发了一款插件,将MusicSeeker的部分功能做到插件里面,实现高品质音乐的无损下载与搜索,使用iYY的用户能方便地下载音乐。
+
+
+
+![image](http://i.imgur.com/FZlzx.jpg)
+
+
+
+
+插件特性:
+
+1、支持高码率MP3下载,搜索时候自动显示最高码率的音质
+
+2、支持FLAC无损下载,同时不喜欢FLAC的朋友也可以选择下载320Kbps的MP3
+
+这款插件只能在iYY里面运行,如果有需要的朋友可以到iYY的官方网站下载。
+
+另外独立运行的MusicSeekerX与MusicSorterX正在开发计划中,敬请各位期待!
+
+iYY官方网站:http://beyondcow.com/iyy/
+
+iYY官方插件下载:http://beyondcow.com/iyy/#tab4
View
71 posts/2011-08-13-dynamiclyrics.markdown
@@ -0,0 +1,71 @@
+---
+layout: post
+title: "DynamicLyrics – 在菜单栏显示iTunes歌曲歌词的插件[1.1发布]"
+date: 2011-08-13 23:36
+comments: true
+categories: ideas
+---
+
+{% blockquote %}
+2011年10月29发布1.1版本
+更新内容如下:
+
+1、歌词切换添加渐隐、渐显特效,更加平滑
+
+2、修正软件运行过程中不能退出iTunes的BUG
+
+3、添加全部歌词复制、LRC内容复制功能
+
+4、优化部分核心算法,调整界面文字提示细节
+
+下载地址请见文章结尾,如果您是第一次使用本软件,推荐您耐心阅读一下下面的介绍。
+ {% endblockquote %}
+
+Martian是一位喜欢听各种鸟语的歌的人,听不懂也不知道歌是不是高雅,虽说周围人也没几个听懂的,但是天天没事听那些歌词比国产爱情歌还二的歌实在是有损苹果电脑声卡。
+
+于是Martian决定写一个蛋疼的插件,用来支持iTunes的歌词显示
+
+<!-- more -->
+
+但是Martian发现,Windows遗留下来的最大化习惯挥之不去,没事就把Safari的窗口拉到全屏的Matian发现,屏幕一点空都木有了,( ̄▽ ̄”)
+
+所以,我就决定,这个软件一定要顺带把标题栏那点空间给挡住
+
+![image](http://i.imgur.com/T44rX.png)
+
+
+老规矩,再废话一下软件的特性吧:
+
+1、软件启动后没有界面,不要以为软件是什么木马或者病毒之类的坏东西,在Unix系统下没弹窗让你输密码我可是连个系统文件都读取不到。( ̄_ ̄|||)
+
+2、软件会自动启动iTunes,但是不会自动播放,进去找一首你喜欢的歌,然后播放即可
+
+3、我相信各位用iTunes听歌的果粉应该不会把ID3标签弄得一塌糊涂吧,只要歌曲名里面不带括号之类的符号,没有繁体中文的话,DynamicLyrics都会帮你自动搜索歌词,然后显示在标题栏上
+
+4、如果无法自动找到歌词,单击菜单,选择搜索歌词,就会有个框出来让你选择歌词,搜索后双击就可以
+
+![image](http://i.imgur.com/2uZXu.jpg)
+
+5、电信线路的朋友请注意,不管软件自动匹配歌词成功与否,推荐您都打开搜索歌词窗口,选择电信服务器以后搜索一次歌词,这样软件会记录你的服务器,自动搜索歌词会自动选择电信服务器。
+
+6、单击菜单里面的退出退出软件,当然你也可以去结束进程。
+
+然后,顺带说一下软件的缺点:
+
+1、无法识别内置的Lrc歌词或者是同文件目录的Lrc歌词,只支持服务器上的歌词。这个缺点我会慢慢改进的,但是Martian蛋疼的技术让他进展缓慢,所以请各位理解。
+
+2、无法导出Lrc歌词,下个版本会支持的。
+
+3、可能有一些无法预知的错误,比如内存泄漏。( ̄▽ ̄”)
+
+
+
+总之就是这样,作为一位刚接触Cocoa开发模式的苦逼的程序员,希望大家能够谅解。
+
+另外,Martian的周围很少有用Mac的人,所以希望大家测试以后如果有什么问题,请向我的博客反馈一下,方便我进行处理解决。
+
+嗯~就是这样~(。TωT)ノ☆・゚:*:
+
+好,下面放出下载地址:
+
+<http://down.4321.la/DynamicLyrics.zip>
View
62 posts/2011-08-28-musicseekerx.markdown
@@ -0,0 +1,62 @@
+---
+layout: post
+title: "MusicSeekerX – 搜索与下载音乐"
+date: 2011-08-28 23:47
+comments: true
+categories: ideas
+---
+
+
+好吧,写歌词软件写得有些吐血,我就顺带完善一下之前的软件——给MusicSeeker开发了Mac版本,拉着Madimo一块开发了一下,两天的时间就完工了。
+
+MusicSeekerX是一款仿MusicSeeker的软件(废话),用来辅助Mac用户在Mac系统下(还是废话)下载音乐。
+
+![image](http://i.imgur.com/eXcFL.png)
+
+软件的特性还是啰嗦一下吧:
+
+1、支持无损音乐(flac)的搜索下载,支持下载无损音乐后自动转换为iTunes可识别的无损格式(alac m4a)
+
+2、支持下载MP3音乐后自动添加专辑封面、添加歌词
+
+3、优先选择高码率,音乐质量一目了然,适合各种无损控。
+
+软件的下载保存目录、软件的一些设置都在菜单 – 偏好设置里面,推荐大家先进行设置。
+
+软件的缺点我也不多说了,毕竟是两天就完工的作品,我在软件里面加入了比较完善的自动更新机制(废话,别人的现成的库),后续的功能还有BUG的修复软件会自动检查更新的。
+
+如果您在使用过程中发现什么问题的话,别忘了反馈一下,谢谢支持~
+
+如果软件确实对您起到了帮助,可以考虑捐赠作者以平衡域名、空间支出费用,捐赠地址:http://blog.4321.la/2011/09/474.html
+
+
+
+再次感谢各位的支持!
+
+<!-- more -->
+
+下载地址:
+<http://dl.4321.la/MusicSeekerX.zip>
+
+
+非Lion用户请尝试通过下面的方法修改以运行软件:
+
+经简单修改即可在Mac OS X 10.6下运行,解压后,右键单击MusicSeeker.app,选择显示包内容
+
+方法是将原Contents/Info.plist里的
+
+LSMinimumSystemVersion
+
+10.7
+
+改为
+
+LSMinimumSystemVersion
+
+10.6
+
+在10.6.6下测试通过。
+
+(由G+上面的朋友H Liang提供,10.6的朋友可以试一下,我会在下个版本完美支持10.6版本)
+
+出现全部音乐不能下载情况的朋友,请尝试将DNS改为Google Public Dns:8.8.8.8/8.8.4.4后重试。
View
45 posts/2011-12-08-project-lolilu.markdown
@@ -0,0 +1,45 @@
+---
+layout: post
+title: "【Project-LOLI】Loli.lu 免费迅雷离线下载分享计划"
+date: 2011-12-08 00:06
+comments: true
+categories: ideas
+---
+
+![image](http://i.imgur.com/WBRYk.png)
+
+<http://Loli.lu>是由 足兆叉虫 和 Martian 共同开发的免费的、非商业的、有爱的迅雷离线下载分享系统。(其实主要是足兆叉虫在开发,我表示完全不会Python)
+
+旨在提供一个完善(以后会实现~)、简洁、高速的下载分享平台
+
+<!-- more -->
+
+网站特性如下:
+
+1、采用Google OpenID用户系统,GMail帐户直接登陆,无需重复注册
+
+2、网站支持已上传的资源地址分享功能与标签功能,您可以即刻搜索其他用户已经分享的资源,或者上传新的资源再发布在各大论坛网站中进行分享。
+
+3、支持Chrome、Safari、FireFox浏览器下载,速度与迅雷VIP离线速度相同(暂不支持Opera,永远不会支持IE与非Chromium核心的其他国产浏览器),支持aria2c、wget批量下载(designed for Linux/Mac users)
+
+4、登录后,您可以直接添加下载任务并获取离线下载地址,全部过程完全免费,并且可以享受迅雷VIP用户的下载速度,非常适合冷门资源。
+
+
+![image](http://i.imgur.com/GYJDR.png)
+
+
+补充说明:
+
+1、资源均为网友上传,由迅雷离线服务器提供下载资源
+
+2、网站不支持IE浏览器,如果您是Windows用户,建议您更换浏览器(推荐Chrome)
+
+3、Chrome、Safari、Firefox用户通过浏览器下载需要安装游猴脚本,详情请访问Loli.lu参见左栏(lolilu已更新,无需脚本!)
+
+4、aria2c是一款轻量级的多线程多协议下载工具,您可能需要从这里下载并进行编译安装:<http://aria2.sourceforge.net/>
+
+5、Project-LOLI目前还是一个发展中的项目,网站还在完善之中,如果Loli.lu不能满足你们的需要,如果您有任何的建议或问题请及时联系我们
+
++Martian Z :<https://plus.google.com/100204491389909955903/posts>
+
++足兆叉虫:<https://plus.google.com/109559563687025213768/>posts
View
114 posts/2011-12-10-lolilu-aria2c.markdown
@@ -0,0 +1,114 @@
+---
+layout: post
+title: "使用aria2c+loli.lu实现高速免费迅雷离线下载"
+date: 2011-12-10 23:57
+comments: true
+categories: notes
+---
+众所周知,Windows下有一款经典的下载软件,叫迅雷,下载速度一直是非常理想的
+
+但是这款软件没有Linux版本,Mac版本也非常的烂并且没有离线下载功能
+
+这篇教程旨在帮助大家动手打造一个方便的高速下载平台,下载工具采用aria2c,中转网站采用loli.lu(迅雷离线分享)
+
+<!-- more -->
+
+教程在Mac OS X Lion 10.7.2下编写,Linux用户操作方法大同小异,Windows用户请自主研究。
+
+
+前期准备:下载并编译aria2c(只需进行一次即刻,以后可以直接调用~)
+
+第一步:登录 <http://aria2.sourceforge.net/> 下载aria2c
+
+或者,你可以通过这个地址直接下载(推荐还是去sourceforge下载最新版本):<http://superb-sea2.dl.sourceforge.net/project/aria2/stable/aria2-1.13.0/aria2-1.13.0.tar.gz>
+
+![image](http://i.imgur.com/2t8HQ.png)
+
+![image](http://i.imgur.com/tNAcz.png)
+
+
+第二步:解压下载的文件,放到一个你记住的位置
+
+![image](http://i.imgur.com/4nd8d.png)
+
+第三步:编译aria2c
+
+进入应用程序 - 实用工具 - 终端
+
+输入命令: cd 文件夹位置(右键 - 查看简介可以看到)/文件夹名
+
+比如按照第二步所示,我的文件夹放在/Users/Martian/Documents,文件夹名是aria2-1.13.0,就输入 cd /Users/Martian/Documents/aria2-1.13.0,然后按下回车键
+
+![image](http://i.imgur.com/2q6Go.png)
+
+第四步:输入命令“./configure; make; make install”(不含引号),然后回车,就会自动配置、编译、安装aria2c
+
+备注:编译aria2c需要安装g++,如果您已经安装了xcode套装则已经自动安装,否则请查阅相关教程先安装g++,这里不再赘述
+
+或者参阅这篇教程,独立安装gcc:<http://www.memoryz.info/install-gcc-on-mac.html>
+
+
+![image](http://i.imgur.com/i9AeI.png)
+
+![image](http://i.imgur.com/QoJM7.png)
+
+![image](http://i.imgur.com/WcDKq.png)
+
+
+
+
+这样,我们就编译安装好了一款多线程、轻量级的下载工具:aria2c
+
+下面开始使用loli.lu实现迅雷离线下载
+
+第一步:登录http://loli.lu ,选择一个您要下载的资源,单击
+
+![image](http://i.imgur.com/4fM96.png)
+
+第二步:在弹出的悬浮框中,选择批量下载 - aria2c
+
+![image](http://i.imgur.com/5TiAE.png)
+
+
+第三步:在出来的文本框中,按Command+C复制下载地址
+
+![image](http://i.imgur.com/gGRwy.png)
+
+第四步:启动终端,cd到一个你要下载保存的目录,比如下载到桌面,输入 cd ~/Desktop
+
+然后,把刚才的下载地址粘贴进去(Command+V),按回车键开始下载
+
+出现如下图所示的内容代表已经开始下载了!
+
+
+![image](http://i.imgur.com/tqnCz.png)
+
+
+备注:aria2c支持断点续传,下次下载的话cd到下载保存目录,然后重新运行之前的下载命令即可
+
+这样,我们就实现了通过迅雷离线服务器高速下载文件。当然Loli.lu不仅可以让用户下载与分享其他用户上传好的资源,同样可以发布资源
+
+比如,我从极影的BT站找到了一个动漫的种子然后想要下载
+
+![image](http://i.imgur.com/uvcYc.png)
+
+首先我要做的就是把种子的地址复制下来,比如 http://bt.ktxp.com/down/1323442938/065d7936de1b6cd5351688b8841bef62835562ab.torrent
+
+然后打开http://loli.lu,选择右上角的登录,输入用户名密码登录
+
+(Loli.lu采用Google Open ID系统,与Gmail同步登录,无需重复注册,您的资料会被保密)
+
+登录后,您可以选择右上角的发布资源(推荐),或者选择“我要直接获得资源下载地址”(需要任务即时被迅雷秒杀才可以,推荐选择发布资源)
+
+
+![image](http://i.imgur.com/cAuz6.png)
+
+![image](http://i.imgur.com/mD0pa.png)
+
+稍等片刻,任务提交成功后,会自动跳到下载地址,然后按照教程前面所叙述的方法下载即可!
+
+![image](http://i.imgur.com/mD0pa.png)
+
+教程到此结束,如果大家有任何问题,欢迎到Google Plus里+Martian Z(博客留言由于近期比较繁忙,暂时不能回复,抱歉)
+
+Loli.lu目前是一个发展中的项目,我们回在后期增加对Mac、Linux系统的专门优化(譬如客户端添加资源),同时也会增加用户RSS订阅功能,推送订阅下载地址等,希望您能支持并关注我们的发展。
View
18 posts/2012-01-01-opensource-dynamiclyrics.markdown
@@ -0,0 +1,18 @@
+---
+layout: post
+title: "[开源计划]DynamicLyrics"
+date: 2012-01-01 00:10
+comments: true
+categories: notes
+---
+Github:
+
+<https://github.com/6708539/DynamicLyrics>
+
+因为现在开发时间很少,准备把项目逐一开源,让更多的朋友参与进来开发!
+<!-- more -->
+有任何问题:
+
+1、E-Mail我:fzyadmin在gmail.com
+
+2、Google Plus里面+我:<https://plus.google.com/100204491389909955903/posts>
View
39 posts/2012-01-22-hello-octopress.markdown
@@ -0,0 +1,39 @@
+---
+layout: post
+title: "Hello Octopress"
+date: 2012-01-22 14:23
+comments: true
+categories: notes
+---
+![Octopress](http://i.imgur.com/x1UiS.png)
+
+#Hello Octopress!
+
+
+**[Octopress](http://octopress.org/)**, 是一个各种新技术结合起来的博客系统。
+
+[4321.La](http://4321.La)所在的服务器机房最近线路一直抽风,尤其是我自己访问起来必须挂VPN,不然速度难以忍受,而且服务器上512MB内存近一半被我原来那个[WordPress](http://wordpress.org/)博客给占用了,各种不爽。
+<!-- more -->
+于是就体验了一下Octopress(章鱼发布系统=。=),这个东西跟WordPress这样的传统博客有着显著不同:
+
+**WordPress:**
+
+1. PHP + MYSQL,适合主流的LAMP、LNMP等环境运行。
+2. HTML写作,同时拥有所见即所得编辑器
+3. 插件、风格安装简易且较为丰富
+4. 评论系统为每个博客独立
+5. 只需要apt-get/yum几下,配置好服务器,即可运行。
+6. 平民向
+
+**Octopress:**
+
+1. Ruby在本地运行,生成纯HTML再Deploy到服务器。
+2. MarkDown语法写作
+3. 插件较少,而且不会Ruby也木法开发=。=,网站风格带一套HTML5,自己修改相当相当费劲。(至少对我这个前端技术菜鸟来说是这样)
+4. 评论系统采用Disqus,解决HTML的局限性
+5. 你需要有一定的Linux/Ruby/HTML(5)/Javascript/CSS知识
+6. Geek向(at least now)
+
+由于章鱼本身也是个很好玩的动物。章鱼Press也就更耐玩了⋯⋯这套系统总归来说,如果你能把他玩透了,能学到Ruby知识,学习Markdown语法(顺带可以看看TeX),实战HTML/CSS/JavaScript⋯⋯
+
+至于Octopress的使用方法,准备最近发布出来一套教程,包含基本的配置。嘛,春节几天光从这里折腾这章鱼了,等两天再说吧~
View
22 posts/2012-01-24-donate.markdown
@@ -0,0 +1,22 @@
+---
+layout: post
+title: "捐赠 4321.La - Support future development of 4321.La"
+date: 2012-01-24 22:55
+comments: true
+categories: notes
+---
+非常高兴看到我制作的软件能够帮助到您!
+
+如果您喜欢我的作品,可以捐赠4321.La以支持我们后续的开发。
+
+<!-- more -->
+
+
+
+#捐赠方式:
+##1.[Donate via PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=fzyadmin%40gmail%2ecom&item_name=Support%20future%20development%20of%204321.La%20app&no_shipping=1&no_note=1&tax=0&currency_code=USD&lc=US&bn=PP%2dDonationsBF&charset=UTF%2d8)
+##2.[Donate via 支付宝](https://me.alipay.com/martian)
+##3.[Donate via Amazon.cn](http://www.amazon.cn/registry/wishlist/1JUEM4PZIL82C)
+
+
+###Thanks for being awesome!
View
117 posts/2012-01-25-macbook-pro-ssd-optimize.markdown
@@ -0,0 +1,117 @@
+---
+layout: post
+title: "MacBook Pro + Mac OS X Lion SSD优化总结[基于镁光M4]"
+date: 2012-01-25 18:25
+comments: true
+categories: notes
+---
+我在买来这台MacBook Pro还是11年的事情,买来以后我就感觉被坑得很彻底——显卡性能渣到集显程度、开机速度太慢、发热、Flash太渣看Bilibili太不爽⋯⋯
+
+Lion出来以后上述问题更加明显,甚至连Chrome都不好用了。于是只能在再次掏腰包升机硬件了,先把内存4G升级到8G,结果发现几乎没有改善,尤其是Xcode,超级吃内存,于是一狠心,我就买了个镁光M4的SSD。
+
+我买的SSD只有64GB,因为这东西的单位储存成本实在是太高了。SSD对我来说是个新鲜物,买来以后听 [+Shadowmourne G](https://plus.google.com/106587986552086492432/posts) 忽悠一阵子,才知道这东西还得优化,于是谷歌了半天,加上也用了一段时间了,总结一下,方便以后自己用还有其他朋友参考。
+
+<!-- more -->
+
+##性能优化:
+
+1、 关闭紧急运动传感器:
+
+这个东西就是在瞬间移动的时候给HDD一个信号,让他停止读写拿开磁头。对于SSD是完全没必要的,可以通过下面的命令完全关闭:
+
+ $ sudo pmset -a sms 0
+
+**需要特别说明的是,我把SSD更换上以后,把光驱拆下来,把原来的HDD放到了光驱上,经过查询资料,MBP的光驱位是没有紧急运动传感器的。**
+
+2、 **Trim**
+
+Trim这东西,很坑爹。网上几乎所有人都说要开启Trim,为了减少性能衰减和延长SSD的寿命。我当时看了我朋友的MacBook Air,SSD的Trim是默认开启的,但是我换上M4以后,Lion下并没有自动开启。
+
+在几个论坛上搜索了一下,有一个软件叫Tri Enabler可以强制开启,后来发现[M4还有垃圾回收机制](http://hardforum.com/showthread.php?p=1037771689),于是我又纠结了。
+
+最后我找到了这篇文章:
+
+<http://digitaldj.net/2011/07/21/trim-enabler-for-lion/>
+
+这篇文章中提到:
+
+> DO NOT USE TRIM ENABLER (VERSION 1.1 OR 1.2) TO ENABLE TRIM ON LION.(可以通过终端开启)
+
+> There has also been some confusion about garbage collection and TRIM. TRIM is ALWAYS preferred over Garbage Collection and will likely yield better results. If you have garbage collection, you don’t necessarily need TRIM, but it’ll probably offer better performance and there’s always a chance there’ll be a degradation of speed over time. Therefore, when using Garbage Collection, you may have to take the drive out and do a secure erase so that everything is re-marked as free space.
+
+> Running garbage collection and TRIM at the same time is NOT a problem. They’re designed to work together. You can look at it like so: TRIM is called by your OS each time space is freed up. Garbage Collection is run by the drive’s firmware when idle and determines which parts of the drive can be cleaned up and rearranged. TRIM is obviously more efficient and obviously the drive’s firmware is aware of the TRIM commands and accounts for this.
+
+> While it’s true that using TRIM and garbage collection at the same time is essentially using two mechanisms to do the same thing, the firmware on your SSD drive is designed to handle these things. All SSD manufacturers, GC or not, recommend the use of TRIM.
+
+作者在文中说明了关于垃圾回收和Trim的关系,**所以你的SSD不管有没有GC**,都推荐开启Trim。综上,我们所做的就是开启Trim,但是**不要通过那个TRIM ENABLER软件**。方法仍然可以参照那篇文章所说的在命令行里面开启,这里不再赘述。
+
+3、用noatime方式挂载SSD系统盘
+
+> 用 noatime 方式挂载系统盘,这样可以减少不必要的 I/O 次数,虽然 SSD 做这些操作非常快速,但考虑到最后访问时间这个属性其实很少用到,大家关心的一般都是最后修改时间和创建时间,所以完全可以关闭这个属性,这在 Unix/Linux 下是非常常见的文件系统优化选项。
+
+在**/Library/LaunchDaemons**里面创建一个**noatime.plist**,内容为:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
+ "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+ <plist version="1.0">
+ <dict>
+ <key>Label</key>
+ <string>noatime</string>
+ <key>ProgramArguments</key>
+ <array>
+ <string>mount</string>
+ <string>-vuwo</string>
+ <string>noatime</string>
+ <string>/</string>
+ </array>
+ <key>RunAtLoad</key>
+ <true/>
+ </dict>
+ </plist>
+
+然后修改权限:
+
+ $ sudo chown root:wheel /Library/LaunchDaemons/noatime.plist
+
+重启,查看是否生效,可以输入:
+
+ mount | grep " / "
+
+如果看到返回下面的信息,说明OK(注意有noatime):
+
+ /dev/disk0s2 on / (hfs, local, journaled, noatime)
+
+##榨干空间:
+
+1、关闭休眠:
+
+> 默认的在 MB/MBP 上, 系统会在磁盘上维护一个和内存等大的 sleepimage 文件, 当电量耗尽时将内存中所有数据写入磁盘, 系统进入深度休眠状态, 下次唤醒时再从磁盘文件恢复状态. SSD 寸土寸金, 保留一个 8GB 大小又很少被用到的文件是很奢侈的行为.
+
+ $ sudo pmset -a hibernatemode 0
+ $ sudo rm /var/vm/sleepimage*
+
+2、关闭Time Machine本地备份
+
+ $ sudo tmutil disablelocal
+
+3、清理垃圾:
+
+推荐下载[CleanMyMac](http://macpaw.com/)或者[Disk Diet](http://itunes.apple.com/cn/app/disk-diet/id445512770?l=en&mt=12)这两块软件进行清理。
+
+
+这样,我们就搞定了大部分的优化。有任何问题请在下面询问,或者Google一下。(>_<)
+
+参考文章:
+
+[分享下 SSD for Macbook Pro 的优化](http://hi.baidu.com/omys/blog/item/67fc8a0e3a7d84fd37d1220b.html)
+
+[Mac下优化SSD](http://davidx.me/2011/09/24/optimize-ssd-on-mac/)
+
+[TRIM Enabler for Lion](http://digitaldj.net/2011/07/21/trim-enabler-for-lion/)
+
+[Mac OS X 下与 SSD 相关的优化](http://blog.jjgod.org/2010/04/17/macosx-ssd-tweaks/)
+
+[Macbook Pro SSD 优化小结](http://yuzhuohui.info/blog/2011/12/19/macbook-pro-ssd-optimize/)
+
+[M4 Garbage Collection?](http://hardforum.com/showthread.php?p=1037771689)
View
98 posts/2012-01-25-set-up-octopress.markdown
@@ -0,0 +1,98 @@
+---
+layout: post
+title: "在Mac OS X上架设属于你的Octopress"
+date: 2012-01-25 16:09
+comments: true
+categories: notes
+---
+终于,耗时N天,把我的博客从WordPress转到了Octopress,并且很无耻的托管到GitHub上面,免费高速~
+
+这篇文章教大家简单的Octopress的安装与使用。
+
+(如果你用的Windows,你可能会碰到一堆雷⋯⋯强烈推荐Linux或者Mac OS X)
+
+<!-- more -->
+
+##1.安装
+
+Octopress的安装不同于WordPress,WordPress是安装到服务器上面的,Octopress是安装在你本地的(如果选择Deploy到GitHub上)。首先需要准备的是Ruby环境:(下面教程均在Mac OS X Lion 10.7.2测试通过)
+
+1、 参考这篇文章,安装GCC:<http://www.memoryz.info/install-gcc-on-mac.html> 如果你已经安装了Xcode,则无需重负安装GCC
+
+2、 安装[Homebrew](http://mxcl.github.com/homebrew/)(或者你可以参考:<https://github.com/mxcl/homebrew/wiki/installation>):
+
+ $ /usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"
+ $ brew update
+
+3、 安装Git:
+
+ $ brew install git
+
+4、 安装[RVM](http://beginrescueend.com/)(或者参考:<http://beginrescueend.com/rvm/install/>):
+
+ $ bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
+
+5、 安装Ruby 1.9.2
+
+ $ rvm install 1.9.2
+ $ rvm 1.9.2 --default
+
+6、 安装Pow
+
+ $ curl get.pow.cx | sh
+
+7、 先cd到一个好的目录,比如Desktop,然后下载Octopress:
+
+ $ git clone git://github.com/imathis/octopress.git octopress
+ $ cd octopress
+
+8、 安装一些东西:
+
+ $ gem install bundler
+ $ rbenv rehash
+ $ bundle install
+ $ rake install
+
+
+这样,就安装好了Octopress了,输入**rake preview**,从localhost:4000可以预览结果
+
+##2.发布
+
+1、 在GitHub名为 “http://你的GitHub用户名.github.com” 的repository。
+
+2、 在Octopress目录里面设定资料:
+
+ $ rake setup_github_pages
+
+3、 生成HTML:
+
+ $ rake generate
+
+4、 发布:
+
+ $ rake deploy
+
+这样等待几分钟,就可以通过 http://你的GitHub用户名.github.com 查看你的全新的Octopress BLOG!
+
+##3.绑定域名
+
+ $ echo '你要绑定的域名' >> source/CNAME
+然后,将你要绑定的域名CNAME到 http://你的GitHub用户名.github.com,如果是@纪录,需要加入207.97.227.245。
+
+##4.发布文章
+
+ $ rake new_post['title']
+
+运行上面的命令,Octopress会在source/_posts生成一个markdown(推荐阅读:<http://markdown.tw/>)文件
+
+更多的如何编辑文档,请参阅:<http://octopress.org/docs/>
+
+在Mac下,Markdown编辑器推荐一款国产的小软件:Mou <http://mouapp.com/>
+
+当你把Markdown文档编辑好以后再运行rake generate和rake deploy发布到GitHub上面
+
+##5.总结
+
+很多的技巧,比如修改模板,Octopress官方上有详细的说明,于是我不再赘述。经过几天使用,这东西确实是Geek向,包括修改模板、导入评论等等已经让我无奈了N次⋯⋯
+
+如果你对PHP+MYSQL的WordPress的臃肿和那难用后台编辑器不能忍受,不妨尝试一下Octopress。同时,托管到GitHub上面也无需再支出高昂的空间费用。
View
206 posts/2012-01-27-use-applescript-to-set-itunes-lyrics.markdown
@@ -0,0 +1,206 @@
+---
+layout: post
+title: "使用AppleScript来自动获取填充iTunes歌曲歌词"
+date: 2012-01-27 19:31
+comments: true
+categories: ideas
+---
+Martian真的是懒死了⋯⋯Martian既不想开搜索引擎搜歌词,也不想开那内存吃货Xcode来帮忙⋯⋯
+
+于是我就用PHP和AppleScript写了一个小脚本来实现自动获取iTunes的歌曲歌词~
+
+<!-- more -->
+
+脚本源代码:
+
+
+ --AppleScript By Martian
+ --Ver 1.1
+ --http://blog.4321.la
+ --https://plus.google.com/100204491389909955903/
+ --http://twitter.com/martian_zhu
+ --http://about.me/martian_z
+
+ property myProgram : "4321.La"
+ property baseURL : "http://lyrics.sinaapp.com/"
+
+ --因为我实在是不想操心AppleScript的语法,所以一部分代码采用PHP编写
+ --为了获得最好的整理效果,PHP脚本挂在SAE上面,大陆用户的访问速度应该非常不错
+ --但是SAE的价格是按照请求次数计费,实在是不便宜,如果您能自己架设PHP服务器并且提供分流服务,我会非常感激!
+ --PHP源代码可以见我的博客帖子,里面有说明
+
+ --使用说明:
+ --1、打开iTunes,选择要添加歌词的歌曲,可以批量选择
+ --2、点击脚本上的“运行”即可,整理结束时iTunes会有提示
+ --3、虽然脚本支持批量整理,但是程序自动化整理永远不可能那么智能,不能保证歌曲歌词全部正确,可能需要您后期再次加工
+ --4、如果您的歌曲中含有繁体汉字,程序无法自动搜索歌词,这会在后续版本中修正
+
+ tell application "iTunes"
+ if selection is not {} then
+ set k to count (item of selection)
+ else
+ return
+ end if
+ set i to 1
+ repeat
+ set theTrack to (item i of selection)
+ set this_artist to (get artist of theTrack)
+ set this_title to (get name of theTrack)
+
+ set requestData to "title=" & this_title & "&artist=" & this_artist
+ set songLyrics to do shell script "curl -d '" & requestData & "' " & baseURL
+ if length of songLyrics > 1 then
+ set lyrics of theTrack to songLyrics
+ end if
+ set i to i + 1
+ if i > k then exit repeat
+ end repeat
+ display dialog return & "整理结束!" buttons {"确定"} default button 1 with icon 1 giving up after 15 with title myProgram
+ end tell
+
+
+
+
+###使用说明:
+
+1、打开 应用程序 - 实用工具 - AppleScript编辑器.app
+
+2、将上述代码粘贴进去
+
+**3、然后去看脚本里面的说明进一步操作**
+
+
+
+
+
+附录:PHP服务端源代码(只在自己搭建服务端需要):
+
+
+ <?
+
+ function SingleDecToHex($dec) {
+ $tmp="";
+ $dec=$dec%16;
+ if($dec<10) return $tmp.$dec;
+ $arr=array("A","B","C","D","E","F");
+ return $tmp.$arr[$dec-10];
+ }
+ function SetToHexString($str) {
+ if(!$str) return false;
+ $tmp="";
+ for($i=0;$i<strlen($str);$i++)
+ {
+ $ord=ord($str[$i]);
+ $tmp.=SingleDecToHex(($ord-$ord%16)/16);
+ $tmp.=SingleDecToHex($ord%16);
+ }
+ return $tmp;
+ }
+ function qianqian_code($str) {
+ $s=strtolower($str);
+ $keys = array(" ","'","(",")","[","]",",",".","'","\""," ", "`", "~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", ",", "<", ".", ">", "/", "?", ";", ":", "\"", "[", "{", "]", "}", "\\", "|", "€"," ", "。", ",", "、", ";", ":", "?", "!", "…", "—", "·","ˉ", "¨", "‘", "’", "“", "”", "々", "~", "‖", "∶", """, "'","`", "|", "〃", "〔", "〕", "〈", "〉", "《", "》", "「", "」", "『", "』", ".", "〖", "〗", "【", "】", "(", ")", "[", "]","{", "}", "≈", "≡", "≠", "=", "≤", "≥", "<", ">", "≮", "≯", "∷", "±","+", "-", "×", "÷", "/", "∫", "∮", "∝", "∞", "∧", "∨", "∑", "∏", "∪","∩", "∈", "∵", "∴", "⊥", "∥", "∠", "⌒", "⊙", "≌", "∽", "√", "§", "№","☆", "★", "○", "●", "◎", "◇", "◆", "□", "℃", "‰", "■", "△", "▲", "※", "→","←", "↑", "↓", "〓", "¤", "°", "#", "&", "@", "\", "︿", "_", " ̄", "―","♂", "♀", "Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ", "Ⅹ", "Ⅺ","Ⅻ", "⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓","⒔", "⒕", "⒖", "⒗", "⒘", "⒙", "⒚", "⒛", "㈠", "㈡", "㈢", "㈣", "㈤","㈥", "㈦", "㈧", "㈨", "㈩", "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩","⑴", "⑵", "⑶", "⑷", "⑸", "⑹", "⑺", "⑻", "⑼", "⑽", "⑾", "⑿", "⒀","⒁", "⒂", "⒃", "⒄", "⒅", "⒆", "⒇", "┌", "┍", "┎", "┏", "┐", "┑", "┒","┓", "─", "┄", "┈", "└", "┕", "┖", "┗", "┘", "┙", "┚", "┛", "━", "┅", "┉","├", "┝", "┞", "┟", "┠", "┡", "┢", "┣", "│", "┆", "┊", "┤", "┥", "┦", "┧", "┨","┩", "┪", "┫", "┃", "┇", "┋", "┬", "┭", "┮", "┯", "┰", "┱", "┲", "┳", "┴", "┵","┶", "┷", "┸", "┹", "┺", "┻", "┼", "┽", "┾", "┿", "╀", "╁", "╂", "╃", "╄", "╅","╆", "╇", "╈", "╉", "╊", "╋");
+ foreach ($keys as $key)
+ {
+ $s=str_replace($key,"",$s);
+ }
+ return SetToHexString(iconv('UTF-8','UTF-16LE',$s));
+}
+
+ function conv($num) {
+ $tp = bcmod($num,4294967296);
+
+ if(bccomp($num,0)>=0 && bccomp($tp,2147483648)>0)
+ $tp=bcadd($tp,-4294967296);
+ if(bccomp($num,0)<0 && bccomp($tp,2147483648)<0)
+ $tp=bcadd($tp,4294967296);
+
+ return $tp;
+ }
+ function CodeFunc($Id,$artist,$title) {
+ $Id=(int)$Id;
+ $utf8Str=SetToHexString($artist.$title);
+ $length=strlen($utf8Str)/2;
+ for($i=0;$i<=$length-1;$i++)
+ eval('$song['.$i.'] = 0x'.substr($utf8Str,$i*2,2).';');
+ $tmp2=0;
+ $tmp3=0;
+ $tmp1 = ($Id & 0x0000FF00) >> 8; //右移8位后为0x0000015F
+
+ if ( ($Id & 0x00FF0000) == 0 ) {
+ $tmp3 = 0x000000FF & ~$tmp1; //CL 0x000000E7
+ }else {
+ $tmp3 = 0x000000FF & (($Id & 0x00FF0000) >> 16); //右移16位后为0x00000001
+ }
+ $tmp3 = $tmp3 | ((0x000000FF & $Id) << 8); //tmp3 0x00001801
+ $tmp3 = $tmp3 << 8; //tmp3 0x00180100
+ $tmp3 = $tmp3 | (0x000000FF & $tmp1); //tmp3 0x0018015F
+ $tmp3 = $tmp3 << 8; //tmp3 0x18015F00
+ if ( ($Id & 0xFF000000) == 0 ) {
+ $tmp3 = $tmp3 | (0x000000FF & (~$Id)); //tmp3 0x18015FE7
+ } else {
+ $tmp3 = $tmp3 | (0x000000FF & ($Id >> 24)); //右移24位后为0x00000000
+ }
+ $i=$length-1;
+ while($i >= 0){
+ $char = $song[$i];
+ if($char >= 0x80) $char = $char - 0x100;
+ $tmp1 = ($char + $tmp2) & 0x00000000FFFFFFFF;
+ $tmp2 = ($tmp2 << ($i%2 + 4)) & 0x00000000FFFFFFFF;
+ $tmp2 = ($tmp1 + $tmp2) & 0x00000000FFFFFFFF;
+ $i -= 1;
+ }
+ $i=0;
+ $tmp1=0;
+ while($i<=$length-1){
+ $char = $song[$i];
+ if($char >= 128) $char = $char - 256;
+ $tmp7 = ($char + $tmp1) & 0x00000000FFFFFFFF;
+ $tmp1 = ($tmp1 << ($i%2 + 3)) & 0x00000000FFFFFFFF;
+ $tmp1 = ($tmp1 + $tmp7) & 0x00000000FFFFFFFF;
+ $i += 1;
+ }
+ $t = conv($tmp2 ^ $tmp3);
+ $t = conv(($t+($tmp1 | $Id)));
+ $t = conv(bcmul($t , ($tmp1 | $tmp3)));
+ $t = conv(bcmul($t , ($tmp2 ^ $Id)));
+
+ if(bccomp($t , 2147483648)>0)
+ $t = bcadd($t , -4294967296);
+ return $t;
+ }
+ header("Content-Type:text/html;charset=UTF-8");
+ $artist = $_POST["artist"];
+ $title = $_POST["title"];
+
+ $doc = new DOMDocument();
+ $doc->load("http://lrccnc.ttplayer.com/dll/lyricsvr.dll?sh?Artist=".qianqian_code($artist)."&Title=".qianqian_code($title)."&Flags=0");
+
+ $lrcNode = $doc->getElementsByTagName("lrc");
+ $code = 0;
+ foreach($lrcNode as $lrc)
+ {
+
+ $artist=$lrc->getAttribute("artist");
+ $title=$lrc->getAttribute("title");
+ if ( ($code == 0) || strpos($title,"中") || strpos($artist,"中") )
+ {
+ $id=$lrc->getAttribute("id");
+ $code=CodeFunc($id,$artist,$title);
+
+ }
+
+ }
+
+ if ($code != 0) {
+ $lrcstr=file_get_contents("http://lrccnc.ttplayer.com/dll/lyricsvr.dll?dl?Id=".$id."&Code=".$code);
+ $lrcstr=preg_replace("/\[(.+?)\]/","",$lrcstr); //替换掉时间标签
+ $lrcstr=preg_replace("/((.*)QQ:(.*))/","",$lrcstr); // 替换联系QQ什么的广告
+ $lrcstr=preg_replace("/((.*)QQ:(.*))/","",$lrcstr);
+ echo trim($lrcstr);
+ }
+
+
+ ?>
+
+
+###本文作者:Martian http://blog.4321.la 转载请注明
View
43 posts/2012-02-02-matritunes.markdown
@@ -0,0 +1,43 @@
+---
+layout: post
+title: "MatriTunes 自动整理填充iTunes歌曲专辑图片、歌词辅助工具"
+date: 2012-02-02 15:08
+comments: true
+categories: ideas
+---
+今天早上有一位朋友给我发评论,晓之以理动之以情,说MXiTunes这款软件不能用了什么什么什么,我的MusicSorter不好用什么什么(我承认那是个败笔之作,我投入了大量精力在界面设计上,导致软件的功能欠缺太多)。
+
+
+于是我就去看了一下MXiTunes是什么东西,原来是一款Windows下的整理iTunes列表的软件,很不错的样子。不过原作者的官方网站打不开,经过检查是因为cn域名被暂停解析的缘故(让你用cn域名,你不找事吗?!),而且在我的英文版Windows 7 64Bit上也死活无法打开……
+
+然后我就又去敲代码了,三个小时搞定了这款软件——MatriTunes。
+
+<!-- more -->
+
+
+![MatriTunes](http://i.imgur.com/KjbTV.png)
+
+
+###软件介绍、使用说明:
+
+1. 因为时间紧张,采用.Net Framework 2.0开发,如果你的系统古老到连这个框架也没安装……我实在是无语……(Windows 7自带)
+
+2. 支持自动歌曲搜索
+
+3. 支持批量获取歌词、专辑图片,支持手动设置专辑图片
+
+4. 批量搜索效果与您当前的MetaData关系很大,如果批量搜索效果不佳推荐您一个一个慢慢来
+
+5. 软件开发仓促,有任何问题请给我发Mail或者从这个post下面留言
+
+6. 我实在是懒得开多线程了,所以批量下载的时候尽量一次不要选择太多歌曲,同时软件工作时不要乱去戳它=。=
+
+7. 尽量把DNS改成本地的DNS,不然豆瓣下载专辑图片速度会很慢
+
+8. 修改软件版权、加木马二次发布者自重,问候你们全家
+
+
+###下载地址:
+
+
+115网盘下载:<http://115.com/file/c2bcyhk9#MatriTunes.zip>
View
77 posts/2012-02-12-use-sae-to-setup-uploading-system.markdown
@@ -0,0 +1,77 @@
+---
+layout: post
+title: "使用SAE和Automator在Mac OS X上创建截图并自动上传的小应用"
+date: 2012-02-12 17:25
+comments: true
+categories: ideas
+---
+先说点题外话……
+
+大家都知道有一个很好用的IM,叫腾讯QQ……
+
+没错,这东西确实是好用,至少在Windows和Mac OS X下很好用,在各个主流手机平台上也不错,唯独在Linux下比较可悲,官方的解决方案就是让我们用那个为了技术而技术、为了平台而平台的臃肿的WebQQ,当然也有第三方的一些开源项目,来分析QQ的协议实现客户端,但是总归腾讯QQ的协议是封闭的,实际效果也难尽如人意。
+
+跟妹子们聊天用QQ足矣,我Mac党表示很舒坦,但是跟各位Linuxer技术宅聊天就蛋疼了,只能用其他的IM,比如Google Talk或者Skype。
+
+这些IM虽然有在Linux下提供客户端,但是实在是让人郁闷的要死,最憋人的就是不能随时发送图片。之前我是通过Cloud、YunIO这些应用解决,但是还是觉得不够舒服,而且Cloud的服务器还被墙了,别人看图片也不方便。
+
+于是,我就敲了几行代码来解决这个问题,采用Sina App Engine搭建服务端,本地采用Automator,如果你是Linux系统,也可以写一个很小的bash脚本解决。
+
+<!-- more -->
+
+第一步:从Sina App Engine上新建一个项目,然后从项目的管理里面启用Storage服务,新建一个domain,我这里给domain命名叫h,然后关闭domain的防盗链。具体操作不再赘述。
+
+第二步:将下面的php代码部署上去:
+
+ <?php
+
+ function extend($file_name)
+ {
+ $extend = pathinfo($file_name);
+ $extend = strtolower($extend["extension"]);
+ return $extend;
+ }
+
+ $target_path = SAE_TMP_PATH;
+ $basename = basename( $_FILES['file']['name']);
+ $domain = 'h';
+ $uuid = md5(uniqid(rand(), true));
+ $target_path = $target_path.$uuid;
+
+ if(move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {
+ } else{
+ echo "There was an error uploading the file, please try again!\n";
+ }
+
+
+ $s = new SaeStorage();
+
+ echo $s->upload($domain, $uuid.".".extend($basename),$target_path)."\n";
+
+
+ //echo $url;
+
+ ?>
+
+
+php代码很简单,就是接受post请求然后把文件保存到Storage里面,之后输出文件的访问地址
+
+第三步:从终端里面测试
+
+使用curl命令我们来上传一个图片试试:
+
+ curl http://项目地址.sinaapp.com/php.php -F file="@1.jpg"
+
+其中1.jpg是当前目录下面的一张图片
+
+如果没有错误的话就可以看到终端里面输出了上传后的文件地址:
+
+![img](http://i.imgur.com/8Nx42.png)
+
+第四步:建立新的Automator应用程序项目,如图所示:
+
+其中两个Growl Notification分别提示开始上传和上传结束。
+
+![automator](http://i.imgur.com/mDGbI.png)
+
+之后将Automator项目保存即可,放到Dock上,以后可以随时运行截图然后自动上传。
View
40 posts/2012-05-26-dynamiclyrics-2-dot-0.markdown
@@ -0,0 +1,40 @@
+---
+layout: post
+title: "开源的DynamicLyrics 2.0欢迎您的参与"
+date: 2012-05-26 18:20
+comments: true
+categories: ideas
+---
+
+好久没更新博客了……实在是没有多少闲余的时间,大家关于软件的评论我都看到了,没有回复大家实在是抱歉。
+
+先说点题外话,Windows版本的MusicSeeker将停止更新,旧版本也不再开放使用,我目前的开发平台为OS X,暂时只提供OS X软件的更新。
+
+言归正传,DynamicLyrics 2.0是DynamicLyrics的一个主版本更新,这次的更新带来了以下特性:
+
+* 标题栏歌词
+* 桌面歌词
+* 专辑封面搜索
+
+细节方面也有所改进:
+
+* 添加随着iTunes启动和退出的功能
+* 添加写入歌词的功能
+* 优化整个软件的逻辑
+* 导出歌词、专辑封面的功能
+
+<!-- more -->
+
+同时,DynamicLyrics是一款开源的软件(<https://github.com/MartianZ/DynamicLyrics>),您可以随时fork,然后修改获得您自己需要的特性。
+
+目前软件还没有正式版本提供下载,各位可以联系我(E-Mail/GTalk: fzyadmin[AT]gmail.com)获得Alpha版本,或者clone项目使用Xcode编译。
+
+
+截图预览:
+
+![Imgur](http://i.imgur.com/QupHK.png)
+![Imgur](http://i.imgur.com/QwRQG.jpg)
+![Imgur](http://i.imgur.com/gv9FK.png)
+
+
+
View
66 posts/2012-05-26-use-sparkle-to-set-up-check-update-system.markdown
@@ -0,0 +1,66 @@
+---
+layout: post
+title: "使用Sparkle为OS X App添加自动更新功能"
+date: 2012-05-26 21:01
+comments: true
+categories: notes
+---
+如果你细心的话,会发现OS X下面的很多应用的自动更新机制都非常相似,没错,他们都用的是**Sparkle**这个framework。(App Store里面的应用除外,因为苹果禁止使用第三方更新系统)
+
+同类的framwork还有Google的[Update Engine](http://code.google.com/p/update-engine/),相比较要强大一些,不过对于一般的应用来说Sparkle就足够了。
+
+![Sparkle](http://sparkle.andymatuschak.org/Screenshot.jpg)
+
+如何为我的程序添加自动更新系统?
+
+### 基本设定
+
+1. **在你的项目中添加 Sparkle framwork**
+
+ * 下载Sparkle <http://sparkle.andymatuschak.org/>,解压
+ ***Sparkle.framework** 拖拽到项目的Framework folder中,同时确定勾选Xcode提示框中的“Copy items into the destination group’s folder”
+ * 在Project Navigator中单击你的项目,选择你的Target,切换到Build Phases选项卡
+ * 单击右下角的Add Build Phase,选择Copy Files
+
+ ![Imgur](http://i.imgur.com/ji1h0.png)
+
+ * 在Destination中选择Frameworks,然后把Sparkle.framwork拖拽进去
+ ![Imgur](http://i.imgur.com/dcQBu.png)
+
+
+2. **设置 Sparkle Updater Object**
+
+ * 打开你的MainMenu.nib
+ * 选择 View → Utilities → Object Library,找到Object,双击添加
+ * 单击刚刚添加的Object
+ * 在Custom Class里面输入SUUpdater
+ * 如果需要,你也可以创建一个Menu Item,然后把它的taeget设置到SUUpdater实例的checkForUpdates:方法
+
+3. **数字签名**
+
+ 为了确保更新是来自开发者的服务器并经过开发者的授权,不被第三方篡改,Sparkle添加了数字签名机制。
+
+ * 打开终端,cd到Sparkle目录的Extras/Signing\ Tools文件夹下
+ * ruby generate_keys.rb
+ 稍等片刻就可以看到如下提示:
+ ![Imgur](http://i.imgur.com/7eJuV.png)
+
+ 这时目录中就会出现dsa_pub.pem和dsa_priv.pem两个文件,保存好dsa_priv.pem这个似有的密钥。
+ * 将Public Key (dsa_pub.pem) 添加到项目的资源文件夹中
+ * 在项目的Info.plist中添加一个SUPublicDSAKeyFile Key,然后将它的值设置为Public Key的文件名称(默认dsa_pub.pem)
+
+
+4. **设置更新通知服务、发布新更新**
+
+ * 通知采用一个RSS Feed,具体格式及发布更新的方法参见:<https://github.com/andymatuschak/Sparkle/wiki/publishing-an-update>
+ * 在项目的Info.plist中添加一个SUFeedURL Key,然后把它的值设置成RSS的URL。
+ * 确保在Info.plist里面有一个合适的CFBundleVersion
+
+5. **如果需要,测试整个系统**
+
+ * 确保要新程序的CFBundleVersion要比旧版本的CFBundleVersion值大
+ * 程序会在第二次运行的时候提示是否自动检查更新,不在第一次启动的时候就提示是给用户为了留下一个好印象
+
+
+这样,整个过程就完成了,后续发布更新可以参照第四步中的引用的URL中的说明进行。
+
View
192 posts/2012-05-27-ubuntu-apache.markdown
@@ -0,0 +1,192 @@
+---
+layout: post
+title: "Ubuntu Server下配置Apache Web服务器"
+date: 2012-05-27 08:52
+comments: true
+categories: notes
+---
+其实相关的文章已经很多了,今天配置一台VPS拿来做软件的更新通知服务器以及一些Api,所以记录一下。其中一些比较难记忆资料来自网上的介绍。细节的配置,例如虚拟主机的参数不再说了,因为官方都有详细的文档,只说说整体的思路,如果有错误欢迎拍砖。
+
+----
+
+1. ##Apache介绍
+
+ Apache在Web服务器上有着不少的份额,我个人觉得拿来跑PHP之类的服务要比nginx稳定的多,当然如果做反向代理的话还是首选nginx。
+
+ Apache的httpd服务器目前有两个分支,Apache 1.3系列和2.x系列,前者已经被Ubuntu自7.1版本开始剔除。在Ubuntu和Debian中,Apache的主要功能模块(Multi-Processing Module,MPM,多道处理模块)被分成了不同的软件包,分别是:
+
+ * apache2-mpm-event——事件驱动
+ * apache2-mpm-perchild——过渡软件包,依赖worker
+ * apache2-mpm-prefork——传统MPM,兼容1.3,无多线程
+ * apache2-mpm-worker——多线程、多进程混合模型的高速MPM
+ * apache2-mpm-itk——基于prefork实现的多用户MPM
+
+
+2. ##Apache MPM选择
+
+ Ubuntu提供Apache 2的三个软件包分别是event、prefork、worker。要想让Apache的性能最佳,第一步要做的就是选择合适的MPM。
+
+ * event:这个MPM适用于需要有大量持续连接的(KeepAlive)的情况,KeepAlive的好处相信大家都知道,可以在同一个TCP连接中响应多次请求,这种请求方式可以使一个包含很多元素(图片,CSS,etc)的HTML网页加速一半以上。在配置文件中设置KeepAlive为On,就可以开启KeepAlive。
+ * perfork:实现了一个非线程的MPM,兼容1.3,虽然速度不是很快,但是非常稳定,能够隔离每一个请求。perfork顾名思义,就是主进程先派生出一堆子进程,这样新的请求来了以后不需要等待服务器产生子进程所花的时间。使用perfork最重要的是设置MacClients的值,要足够大以发挥很好的性能,但是不能太高防止内存爆掉。
+ * worker:Apache 2的新MPM。多进程+多线程,资源占用小的同时也比perfork要高效的多,是未来Apache 2的发展趋势吧。该MPM重要的是两个选项:MaxClients和ThreadsPerChild。ThreadsPerChild用来每个子进程允许建立的线程数,MaxClients用来控制允许建立的总线程数。
+
+ * 综上所述,如果需要更好的伸缩性,选择worker或event,如果需要更好的稳定性和兼容性,选择perfork。如果无法评估自己的需要,不妨直接选择worker。
+
+
+3. ##安装和配置Apache 2
+
+ 这里以worker为例,worker也是Apache 2推荐的MPM,在Ubuntu中,使用下面的命令安装软件包,事实上安装的就是apache2-mpm-worker:
+
+ $ sudo apt-get install apache2
+
+ 需要注意的是,Apache的软件包是由Ubuntu官方核心开发组维护的。他们在编译的时候只编译了很少的模块。如果需要其他模块则需要手动添加。默认编译进去的模块有:
+
+ $ apache2 -l
+ Compiled in modules:
+ core.c
+ mod_log_config.c
+ mod_logio.c
+ worker.c
+ http_core.c
+ mod_so.c
+
+ 下面说一下Apache 2的配置文件说明(Ubuntu ONLY)
+
+ /etc/apache2
+ apache2.conf —— 全局配置文件
+ conf.d/ —— 一般性配置
+ envvars —— 环境变量
+ httpd.conf —— 用户配置文件
+ mods-available/ —— 已经安装的可用模块
+ mods-enabled/ —— 已经启用的模块
+ (你可以使用a2enmod和a2dismod命令来查看可用和已经启用的模块)
+ ports.conf —— httpd服务的端口
+ sites-available —— 可用的虚拟主机
+ sites-enabled —— 已经启用的虚拟主机
+
+ Apache网页文件存放位置:
+
+ 默认Apache把网站存放在/var/www目录下,你可以通过DocumentRoot更改这一设置,对于个人而言我觉得还是不要修改,然后使用类似下列的结构安排会获得比较好的效果:
+
+ /var/www/www.4321.la
+ /var/www/blog.4321.la
+ /var/www/martianlaboratory.com
+
+ 这样存放的好处是显而易见的,当然如果你要开虚拟主机,存放在/home下面是更好的选择,因为用户需要登陆到自己的目录进行管理。
+
+4. ##Apache 虚拟主机
+
+ 安装Apache以后,访问IP地址如果出现**It Works!**这样的字样说明Apache已经在提供服务了。
+
+ 下面来说明如何创建一个新的虚拟主机:
+
+ * 先将默认的虚拟主机复制一份,在此基础上修改
+
+ $ cp /etc/apache2/sites-available/default /etc/apache2/sites-available/martianlaboratory.com
+ vim /etc/apache2/sites-available/martianlaboratory.com
+
+ * 打开的vim编辑中,将DocumentRoot改为DocumentRoot /var/www/martianlaboratory.com/,Directory同时也要修改。**添加ServerName martianlaboratory.com**,绑定到域名。
+ * 如果有很多虚拟主机,建议修改ErrorLog和CustomLog的路径。
+ * 保存配置文件。
+ * 创建 /var/www/martianlaboratory.com 目录,然后重启一下Apache即可看到新的虚拟主机生效了。
+
+ sudo mkdir /var/www/martianlaboratory.com
+ cd /var/www/martianlaboratory.com
+ echo "<h1>Hello</h1>" | sudo tee index.html
+ sudo a2ensite martianlaboratory.com
+ sudo /etc/init.d/apache2 restart
+
+ 这样一个Apache的虚拟主机就配置完成了,虚拟主机的配置参数还有很多就不赘述了,网上还有官方有很多参数的详细解释。
+
+5. ##Apache HTTPS实现
+
+ 待续……
+
+6. ##优化Apache性能
+
+ 1. 关闭DNS查询
+
+ 默认的HostnameLookups在默认情况下已经被设置为off,请保持该设置。如果开启这个设置,每次客户请求的时候都会花时间去获取客户的域名。默认记录IP地址其实已经足够。
+
+ 2. 优化MaxClients
+ 对于MacClients的设置是和MPM相关的,在/etc/apache2/e2.conf文件中。以work为例,默认的配置为:
+
+ <IfModule mpm_worker_module>
+ StartServers 2
+ MinSpareThreads 25
+ MaxSpareThreads 75
+ ThreadLimit 64