代码相关:各种和代码有关的文章

php7的isset和empty的变化

php5.6我判断变量是这样if(empty($this->fields->d)){} if(isset($this->fields->d)){}而php7测试这样怎么判断都是Flase,后来通过查资料发现php7在这个判断上做了些变化。php7判断的时候会依次判断,php5.6则是预加载后判断!也就是说php5.6判断是先执行$this->fields->d然后在对结果进行判断。而php7则是把$this->fields->d当做一个变量进行判断,而没有执行它。知道原理后就可以很好的写出兼容的判断代码了。将$this->fields->d赋值于一个变量,然后对这个变量进行判断就可以了!。$d=$this->fields->d; if(empty($d)){} if(isset($d)){}参考https://learnku.com/laravel/t/3021/isset-is-not-right-after-upgrading-ph...

阅读文章
SQL笔记二(GROUP BY)

刚刚修复了typecho的CateFilter插件某种情况下会重复输出文章的bug,就是用的GROUP BY语法。我修的过程其实一点都不了解GROUP BY,因为百度搜索sql去重复的时候推荐了这个我就用了。然后想起来自己写过《SQL笔记一》的文章,而且文章过去挺久的了,所以我就想是时候再水一篇文章了。然后就百度查GROUP BY到底是干嘛的,搜到了各种优秀例子,各种说明,我都没看懂!然而,突然看到了个非常浅显的例子我就懂了。GROUP BY就是分组函数比如 现有 性别 男 3 人 体重 50KG/60KG/70 性别 女 2 人 体重 40KG/30KG 这时 你用到GROUP BY进行分组select sum(体重) ,性别 from 表明 group by 性别 ;则能得到结果 男 180女 70等于说 是按照你所GROUP BY的东西进行分组 ,然后再对分组内的东西进行操作就是这么个简单的例子,我们就可以理解这个函数的作用了,也能理解为什么他们够去除重复行。比如这个例子按某性别列的值分组,那么值相等的为一组,所以就排除掉了其他的上面是GROUP BY接单列的例子,那么多列又是什么样呢?姓名班级性别分数张11班男60张21班女70张31班男80张41班女80张52班男70张62班女60张72班男80select 班级,性别,AVG(分数) as 平均分 from test group 班级,性别得出的结果是班级性别平均分1班男701班女752班男752班女60这样就好理解多...

阅读文章
SQL笔记一(exists和not exists)

A列的值部分相同,根据B列的值的大小排除A列重复值SELECT * FROM `typecho_comments` t where not exists(select * from `typecho_comments` where cid = t.cid and created > t.created) //根据typecho,评论表实操,查询每篇文章的最新一条评论这个是根据百度的列子改的,然后就发现了个不熟悉的东西exists(翻译:存在)exists: (sql返回结果集,为真),说白了就是exists(条件),满足括号里面条件的结果就从里面返回结果not exists:(sql不返回结果集,为真)而not exists(条件),满足括号里面条件的结果就排除掉例子如下: 表A ID NAME 1 A1 2 A2 3 A3 表B ID AID NAME 1 1 B1 2 2 B2 3 2 B3 表A和表B是1对多的关系 A.ID => B.AIDSELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID) 执行结果为 1 A1 2 A2 原因可以按照如下分析 SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1) ---> SELECT * FROM B WHERE B.AID=1有值,返回真,所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2) ---> SELECT * FROM B WHERE B.AID=2有值,返回真,所以有数据SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3) ---> SELECT * FROM B WHERE B.AID=3无值,返回假,所以没有数据NOT EXISTS 就是反过来 SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID) 执行结果为 3 A3 =========================================================================== EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B) NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B) 例子来源:https://www.cnblogs.com/1234abcd/p/5525417.ht...

阅读文章
php查看B站互相关注的好友

B站跟微博越来越像了,被网友戏称“B博”,但是有个小细节跟微博还有点差异,在B站我的关注里,只能看到,xxx已关注,而看不到“互相关注”的字样!如下图,右侧那么如何自行的查下自己关注的人里哪些人也关注了我呢?在b站https://api.bilibili.com/x/web-interface/card?mid=7530883&jsonp=jsonp&article=true这个api里能够查询到,自己都关注了哪些人,所以利用这一点,挨个查询自己关注的人里是否有自己即可。上php代码<?php header('Access-Control-Allow-Origin:*'); $id=$_SERVER["QUERY_STRING"]; $reg = '/^[0-9][0-9]*$/'; if(preg_match($reg,$id)){ // 从文件中读取数据到PHP变量 $json_string = file_get_contents('https://api.bilibili.com/x/web-interface/card?mid='.$id.'&jsonp=jsonp&article=true'); // 把JSON字符串转成PHP数组 $data = json_decode($json_string); //定义我的关注数量,定义我关注的人的数组 $num=$data->data->card->attention; $att=$data->data->card->attentions; echo '<p>这些与你b站互关了:</p>'; //for循环挨个查询 for($i=0;$i<$num;$i++){ $json_string = file_get_contents('https://api.bilibili.com/x/web-interface/card?mid='.$att[$i].'&jsonp=jsonp&article=true'); $data = json_decode($json_string); $tatt=$data->data->card->attentions; if (in_array($id, $tatt)) { echo $att[$i].'-'.$data->data->card->name.'<br>'; } } }else{echo "非法参数";} ?>访问http://你的域名/hg.php?7530883即可,其中hg换成你的php的文件名,而7530883换成你的b站id即可。效果图如下:代码效率比较低,垃圾博主不会优化...请各位大佬指路....

阅读文章
php如何对preg_replace匹配的内容进行MD5/base64加密?

前言其实yodu模板友链页面很早就考虑直接写友链者的邮箱,然后模板自动输出gravatar头像,然而因为模板采用的是正则匹配输入的内容,然后进行替换格式,然而匹配的内容如何进行MD5加密呢?这个问题困扰我很久了,今天看到友链禾令奇的文章,瞬间解决了我的疑问,不愧是dalao代码base64的话同理,为了加强学习,代码部分用的是截图,建议你们手敲一遍如果想看专业点的解释,请点击下方的声明链接声明:文章关键代码转自https://www.helingqi.com/archives/website-outside-chain-transformation-record.ht...

阅读文章
php获取网易云音乐地址

网易云官方有个这个东西http://music.163.com/song/media/outer/url?id=id.mp3,将id换为歌曲id进行访问就会302到歌曲地址。其实这就可以拿来直接用了,但是他默认的都是http渠道的而非https,即使你访问https://music.163.com/song/media/outer/url?id=id.mp3最后他跳转到的也是http的音乐链接。其实他本身是支持https的,只是全都默认http,这就很难受,所以我用php写了个小工具。<?php $id=$_SERVER["QUERY_STRING"]; $reg = '/^[0-9][0-9]*$/'; if(preg_match($reg,$id)){ $url = 'http://music.163.com/song/media/outer/url?id='.$id.'.mp3'; $headers = get_headers($url, TRUE); //print_r($headers); $url = $headers['Location']; $url = str_replace("http:","https:",$url); if($url=="https://music.163.com/404"){ header("Location: https://music.163.com/song/media/outer/url?id=".$id.".mp3"); exit; }else{ header("Location: ".$url.""); exit; } }else{ echo "非法参数"; } ?>访问php?id即可302转到https渠道的音乐链接。大家可以看到里面有个if判断,判断是否是404的,因为部分音乐可能因为xx原因,用这个php获取不到,获取不到就会返回404地址,如果返回这个的话,就302跳转到原来默认的http渠道链接。00:...

阅读文章
Fusion app解决安卓8以上首页面长按卡死问题【原创】

前言截至2018年6月17日fusionapp首页面安卓8手机长按都会卡死那么如何从用户方面来解决这个问题呢?经过测试只有首页面长按会卡死,子页面并不会……所以我就有个思路,用子页面代替掉首页面,避开bug区域具体操作如下:步骤一:在首页面的启动项里面加入退出页面() 进入子页面("伪装首页")这样用户打开app后直接就跳到子页面了,看不到首页【如果你首页面用的和我一样都是标签栏模板,请务必在组件→标签栏项目保留至少一项,不要全部删除,全部删除会报错哈】步骤二:建一个子页面,名字为“伪装首页”,然后在这个伪装首页的启动项里面加入shijian=0 function onKeyDown(code,event) if string.find(tostring(event),"KEYCODE_BACK") ~= nil then if shijian+2 > tonumber(os.time()) then 退出程序() end 弹出消息("再按一下退出键退出程序") shijian=tonumber(os.time()) return true end end因为首页面点击两次返回键会退出程序,而“伪装首页”没这个功能,所以启动项里面加上这个,伪装成何首页一样的效果步骤三:在“伪装首页”中设计你的首页面即可哈,如果要程序启动图的话,在原本的首页上开启启动图功能就行,代码不会影响启动图功能的。总结下其实这个解决方案几个月前我就弄出来了,当时直接用到自己做的博客客户端上了,然后源码也发fusionapp群里了,今天比较无聊,就把这一块的代码抽出来,写个文章...

阅读文章
php抓取一言数据

本来我博客的一言,都是来自https://github.com/kokororin/hitokoto/blob/master/hitokoto.json的,400多条的样子。刚刚自己有点不满足这些了,于是就像自己能不能试着扒一下一言的数据呢。从https://hitokoto.cn/status这个页面发现一言数目1461,应该就是一共的数量吧???直接请求https://v1.hitokoto.cn就可以获得一条一言的json然后开始弄$nr='[<br>'; //用于拼接内容,使其变成json格式 //设置超时参数 $opts=array( "http"=>array( "method"=>"GET", "timeout"=>3 ), ); $context = stream_context_create($opts); //超时这个部分我不懂,在网上随便复制的 for($i=0;$i<1461;$i++){ //设置循环变量,让其循环1461次 $json_string =file_get_contents('https://v1.hitokoto.cn/', false, $context); //抓取一条一言的json内容 $data = json_decode($json_string); //对JSON数据进行解码,转换为PHP变量 $id = $data->id; //定义id为一言json的id $a= array(); //创建一个空数组 $isin = in_array($id,$a); //判断一言id是否存在数组中,用来过滤重复抓取的一言数据 if($isin){ $i--; //如果存在,则i-1,然后重新执行for循环 }else{ array_push($a,$data->id); //不存在,将一言id存在数组里 $data_json = json_encode($data); //转为json格式 $dh=',<br>'; if($i==0){$dh='';} $nr=$nr.$dh.$data_json; //拼接内容,使其跟json格式对应 } } echo $nr.'<br>]'; //循环结束,输出最终内容刚写完的瞬间,内心只剩下了“完美”二字,然而我一运行,转圈圈...转圈圈...然后就404了。然后我内心依旧剩下两个字“垃圾”。然后我就将循环次数由1461改成了300,准备分批抓取,手动将抓取结果存txt,同时将这300条的数据id都输出出来,然后手动添加到原本建立的空数组中,然后进行第二批抓取...然后第三批...等等...最后我抓了1500条数据,我就不抓了累了,不过官方不是说就1461条数据吗?好奇怪!然后用https://www.bejson.com/验证了下格式,没啥问题就o...

阅读文章
css两端对齐布局

先上个Demo<!DOCTYPE html><html><head><title>两端对齐</title></head> <style type="text/css"> *{margin: 0;padding: 0;font-size: 18px;} .zuoyou{text-align:justify;text-align-last:justify;} ul{text-align:justify; text-align-last:justify;} li{display:inline-block;} </style> <body> <div class="zuoyou">这是一段测试文字</div> <ul> <li>第一</li> <li>第二</li> <li>第三</li> </ul> </body></html>实际效果一、div下的文本左右两端对齐让<div class="zuoyou">这是一段测试文字</div>这段文字左右端对齐,最开始只用text-align:justify;发现并没有效果,后来查资料说这个东西要求文字超过一行,于是就又加了句text-align-last:justify;。text-align:justify;→句子除了倒数第一句外,其他句子两端对齐text-align-last:justify;→句子的倒数第一句两端对齐二、列表元素的两端对齐这里那ul li举例,其中text-align:justify;和text-align-last:justify;同上,li的display:inline-block;是让三个li标签在同一行。display:inline-block;→不独占一行的块级元素注意li标签和li标签之间需要有回车或者空格,demo中三个li标签,用了一个空格和一个回车,测试都没问题。也就是说不能这么写<li>第一</li><li>第二</li><li>第三</li>要这么写<li>第一</li> <li>第二</li> <li>第三</li>不仅如此,对于IE8浏览器,列表元素不能处在font-size:0的环境下,至少code>font-size:1px,因为IE8浏览器font-size:0或直接把换行空格或普通空格抹掉而无法实现两端对齐效果。如果纠结ie6/7的话,可以看看真正大佬的文章http://www.zhangxinxu.com/wordpress/2011/03/displayinline-blocktext-alignjustify%E4%B8%8B%E5%88%97%E8%A1%A8%E7%9A%84%E4%B8%A4%E7%AB%AF%E5%AF%B9%E9%BD%90%E5%B8%83%E5%B1%8...

阅读文章
最近痴迷Fusion app,于是给自己博客搞了个app

Fusion appFusion App 是一款将网页转成应用的app,而又不同于一般的转换,他具有丰富的模板,全面的图标仓库,还支持插入JavaScript,同时还可以用alua语言编写事件,函数之类的,还有元素删减功能。app作者还在b站演示了定制的酷安客户端...还有就是兼容性,貌似是安卓5.0起步酷安地址:https://www.coolapk.com/apk/cn.coldsong.fusionapp作者b站地址:https://space.bilibili.com/37644610其实我是在typecho群看到有人提到的这个app的,当时是测试版,就着手研究了下,挺有意思的,折腾了几个晚上。现在已经发布正式版了,功能更加强大了,于是乎决定发个文章分享下成果。QQ爹客户端如上图,这个app仿照了b站客户端的配色,支持博客的搜索功能,检查更新功能,分享功能,捐赠功能,联系作者qq功能等等。下载地址:https://qqdie.com/areyouok/qqdie1.4.5.apk过程皮肤:因为觉得在客户端中,点击文章下一页会很不文雅,所以专门用插件为了客户端写了个皮肤,支持滚动无限加载的,原理很简单,就是针对特定的ua开放插件皮肤【参考bufannaowap插件】,然后配合fusion app的ua自定义功能来实现的。因为是自己针对性写的皮肤,所以fusion app的元素删减功能,我都没用上哈哈哈。检查更新功能:参考了fusion app群里面的代码,然后自己写了一份,不得不说群里人的思路确实清奇,居然利用qq收藏链接来写,更新检测地址,腾讯的东西必然稳定的一逼哈哈哈!返回顶部按钮:悬浮的返回顶部按钮本来我是用默认的语法写的,后来发现他并没有平滑滚动,于是直接用JavaScript写的,毕竟我的皮肤还是加载了jq的,所以也就几行代码就ok了!捐赠功能和联系QQ:这两个功能直接在appdemo中超改的,就不叙述原理了QAQ。彩蛋功能:我不知道为啥痴迷彩蛋功能,于是也写了个简单的彩蛋,是一段音频,音频放到了drawable文件夹下,然后通过代码放出来,具体怎么触发,就不赘述了。体会:这玩意用来做视频解析app客户端真是绝配,虽然在自身app中全屏播放视频还是有点问题的,但是我相信未来会更好总结我觉得你们下我客户端概率很低,但是下载fusion app的概率会很高,欢迎喜欢折腾的人入坑!还有就是要说,仿照了b站客户端的配色后,我的app真的很好看!!!ps:该文章已得到fusion app作者同意发布【寒歌:随...

阅读文章
至顶至底 (雷姆拉姆)z-blog插件

既《至顶至底 (雷姆拉姆)emlog插件》,《至顶至底 (雷姆拉姆)WordPress插件》,特此发布z-blog版本的插件。网页左右下角分别是拉姆和雷姆,点击就会触发至顶至底功能,插件需要加载jquery,因为貌似z-blog博客程序默认就加载了jquery所以插件并没有内置jquery下载链接: https://pan.baidu.com/s/1dGkmfzN 密码: tenh插件源码include.php<?php #注册插件 RegisterPlugin("lamuleimu","ActivePlugin_lamuleimu"); function InstallPlugin_lamuleimu() {} function UninstallPlugin_lamuleimu() {} function ActivePlugin_lamuleimu() { Add_Filter_Plugin('Filter_Plugin_Zbp_MakeTemplatetags', 'lamuleimu_js'); } function lamuleimu_js(&$template) { global $zbp; $zbp->header .= "<link rel=\"stylesheet\" href=\"{$zbp->host}zb_users/plugin/lamuleimu/style.css\" type=\"text/css\">\r\n"; $zbp->footer .= "<div id=\"updown\"> <div class=\"sidebar_wo\" id=\"leimu\"> <img src=\"{$zbp->host}zb_users/plugin/lamuleimu/leimu_1.png\" alt=\"雷姆\" onmouseover=\"this.src='{$zbp->host}zb_users/plugin/lamuleimu/leimu_2.png'\" onmouseout=\"this.src='{$zbp->host}zb_users/plugin/lamuleimu/leimu_1.png'\" id=\"audioBtn\"> </div> <div class=\"sidebar_wo\" id=\"lamu\"> <img src=\"{$zbp->host}zb_users/plugin/lamuleimu/lamu_1.png\" alt=\"拉姆\" onmouseover=\"this.src='{$zbp->host}zb_users/plugin/lamuleimu/lamu_2.png'\" onmouseout=\"this.src='{$zbp->host}zb_users/plugin/lamuleimu/lamu_1.png'\" id=\"audioBtn\"> </div> <script src=\"{$zbp->host}zb_users/plugin/lamuleimu/ud.js\"></script>\r\n"; }效果图吐槽 插件打包后居然是zba格式,应该是为了保护付费插件源码吧,感觉好腻害,其实zip压缩包也通用吧23...

阅读文章
至顶至底 (雷姆拉姆)WordPress插件

既《至顶至底 (雷姆拉姆)emlog插件》插件发布后,特此发布WordPress版本的插件。链接: https://pan.baidu.com/s/1dGkScvR 密码: fppk下载解压后将文件夹名字改成lamuleimu,然后传到插件目录启用插件即可。插件默认加载了 jq,如果你的模板本身就加载了 jq,可以到插件设置中关闭加载。插件源码index.php<?php /* Plugin Name: 拉姆雷姆至顶至底插件 Plugin URI: https://qqdie.com/archives/top-to-bottom-rem-ram-wp-plugin.html Description: 网页左右下角分别是拉姆和雷姆,点击就会触发至顶至底功能 Author: Jrotty Version: 1.1 Author URI: https://qqdie.com */ define('LL_VERSION', '1.1'); define('LL_URL', plugins_url('', __FILE__)); define('LL_PATH', dirname(__FILE__)); require LL_PATH . '/leimu.php'; //添加设置页面 add_action('admin_menu', 'll_options'); function ll_options() { add_menu_page('拉姆雷姆', '拉姆雷姆', 'manage_options', __FILE__, 'll_options_code'); } //注册设置 add_action('admin_init','ll_setting'); function ll_setting(){ register_setting('ll_setting_group','ll_options'); } function ll_options_code(){ ?> <div style=" margin: 20px 10px 5px 0; border: 2px solid #707070; padding: 10px; "> <form method="post" action="options.php"> <?php settings_fields('ll_setting_group'); $jqq = get_option('ll_options'); $input = isset($_POST['mid'])?$_POST['mid']:''; $type = isset($_POST['select'])?$_POST['select']:''; ?> <div> <input type="checkbox" name="ll_options[jq]" class="autoplay" value="1" <?php checked('1',$jqq['jq']); ?> /><span>加载jq</span> <p><b>当前状态:</b><?php if($jqq['jq']==1){echo"已加载jq";}else{echo"已关闭加载jq";}; ?></p> </div> <p> 该插件需要加载jq,如果你的模板已经引用了jq,则可以取消勾选!!!</p> <input type="submit" name="save" class="button" value="保存设置" /> </form> </div> <?php if ( isset($_REQUEST['settings-updated']) ){ echo '<div id="message" class="updated"><p>保存成功了哦!</p></div>'; }?> <?php } ?>leimu.php<?php add_action('wp_enqueue_scripts', 'll_scripts'); function ll_scripts() { wp_enqueue_style('yodu-bgm', LL_URL . '/style.css', array(), LL_VERSION, 'all'); } add_action('wp_footer', 'll_bar'); function ll_bar(){ $jqq = get_option('ll_options'); echo '<div id="updown"> <div class="sidebar_wo" id="leimu"> <img src="'.LL_URL .'/leimu_1.png" alt="雷姆" onmouseover="this.src=\''.LL_URL .'/leimu_2.png\'" onmouseout="this.src=\''.LL_URL .'/leimu_1.png\'" id="audioBtn"> </div> <div class="sidebar_wo" id="lamu"> <img src="'.LL_URL .'/lamu_1.png" alt="雷姆" onmouseover="this.src=\''.LL_URL .'/lamu_2.png\'" onmouseout="this.src=\''.LL_URL .'/lamu_1.png\'" id="audioBtn"> </div>'; if($jqq['jq']==1){ echo'<script src="'.LL_URL .'/jquery.js" type="text/javascript"></script>'; } echo'<script src="'.LL_URL .'/ud.js"></script> '; }因为之前搞过YoduBGM的WordPress版插件,所以这次就在YoduBGM的代码中魔改出来了,这样能到达快速成品的效果!(其实就是懒)效果图吐槽相比emlog版本的插件来说,这个更走心一点,多了个插件设置功能,通过设置可以选择是否加载J...

阅读文章
至顶至底(雷姆拉姆)emlog插件

《博客被人丢进了雷姆》,《左雷姆右拉姆至顶至底源码》在发布这两篇文章后,其实很多网友已经给自己博客加上了这个萌化插件,甚至有人做出了Discuz插件(http://addon.discuz.com/?@dye_tbm.plugin)其实我之前的文章也说了有时间抽空做个插件版本的,于是今天搞出来了emlog版本的插件链接: https://pan.baidu.com/s/1kWRtqsv 密码: mduv下载解压后将文件夹名字改成lamuleimu,然后传到插件目录启用插件即可。插件默认加载了jq,如果你的模板本身就加载了jq,可以到插件的lamuleimu.php文件16行中,根据里面的提示删除jq加载。插件源代码<?php /* Plugin Name: 拉姆雷姆至顶至底插件 Version: 1.0 Plugin URL: http://qqdie.com Description: 网页左右下角分别是拉姆和雷姆,点击就会触发至顶至底功能 ForEmlog:5.3.x Author: Jrotty Author Email: bssf@qq.com Author URL: http://qqdie.com */ !defined('EMLOG_ROOT') && exit('access deined!'); function lamu(){ echo '<link rel="stylesheet" href="'.BLOG_URL.'content/plugins/lamuleimu/lamu.css" type="text/css">'."\r\n"; echo '<script src="'.BLOG_URL.'content/plugins/lamuleimu/jquery.js" type="text/javascript"></script>'."\r\n";//如果模板加载了jq,此行就可以删除了 } function leimu(){ echo ' <div id="updown"> <div class="sidebar_wo" id="leimu"> <img src="'.BLOG_URL.'content/plugins/lamuleimu/leimu_1.png" alt="雷姆" onmouseover="this.src=\''.BLOG_URL.'content/plugins/lamuleimu/leimu_2.png\'" onmouseout="this.src=\''.BLOG_URL.'content/plugins/lamuleimu/leimu_1.png\'" id="audioBtn"> </div> <div class="sidebar_wo" id="lamu"> <img src="'.BLOG_URL.'content/plugins/lamuleimu/lamu_1.png" alt="雷姆" onmouseover="this.src=\''.BLOG_URL.'content/plugins/lamuleimu/lamu_2.png\'" onmouseout="this.src=\''.BLOG_URL.'content/plugins/lamuleimu/lamu_1.png\'" id="audioBtn"> </div> <script src="'.BLOG_URL.'content/plugins/lamuleimu/ud.js"></script> '."\r\n"; } addAction('index_head', 'lamu'); addAction('index_footer', 'leimu');开头写明插件名字,插件版本,插件发布地址,插件描述,插件适合的版本,作者名字,邮箱,链接。然后写了两个函数,一个插在头部,一个插在尾部。效果图如下吐槽emlog程序官网居然必须登陆才能下载,注册需要邀请码,邀请码要钱!还有就是居然不兼容php7及以上!...

阅读文章
只对支持amp加速的搜索引擎开放amp功能

在上篇文章《Typecho 添加 AMP 支持》说了给博客加amp功能,但是我没说弊端233,这次说下优缺点。优点:1,amp确实很快捷2,支持amp功能的搜索引擎(比如谷歌),会优先amp页面,也就是说对seo有利缺点:1,对于不支持amp的搜索引擎来说,amp页面内容与原文重复,属于重复文章,可能反而不利于seo。2,amp页面会被缓存到支持amp功能的搜索引擎上,也就是说文章被收录后,如果再次被修改amp页面可能反应迟钝。3,移动端搜索引擎带来的ip会减少,毕竟别人浏览搜索引擎上的amp页面,实际是缓存到搜索引擎服务器上的,所以并不会直接产出ip。其实只有缺点1比较致命,所以本次就提出两个方案,着重讲第一个方案。方案一:网站端判断来源,如果是谷歌的蜘蛛或者百度的蜘蛛就允许amp功能开启(谷歌搜索引擎和百度搜索引擎支持amp)用百度搜索了下两家搜索引擎的特征,分别是Googlebot和Baiduspider。而谷歌用来测试amp是否生效的ua信息被我抓出来了Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Google-AMPHTML)百度的用来缓存amp页面的ua不知道,但是肯定包含Baidu所以只要往简单了判断也就行了有了这些就万事俱备了,开始写判断<?php $ua=$_SERVER['HTTP_USER_AGENT']; $ua=strtolower($ua); $ampok=strpos($ua,"baidu");$ampko=strpos($ua,"googlebot");$ampo=strpos($ua,"google-amphtml"); if($ampok !== false || $ampko !== false || $ampo !== false){ //此处为amp页的功能实现代码 } ?>在调试过程中你可以安个Chrome插件User-Agent Switcher调试过程中来回切换UA会方便许多.感谢尚寂新提到的插件,省了好多力气。方案二:使用robots.txt来禁止所有搜索引擎来收录amp页面,然后只允许百度或者谷歌来收录amp页面(谷歌搜索引擎和百度搜索引擎支持amp)[只是一种思考,不知道对于seo是否真的有作用]题外话雅虎也支持amp,但是雅虎好像废了,搜狗也说支持amp,但是站长平台下,并没有看到amp的影子。故此文只提到谷歌and百...

阅读文章
续instantclick实现的全站无刷新

上次在《instantclick 实现的全站无刷新》中大致说了一下实现方式,但是随着大家对文章的关注,我发现有些细节被我遗漏了,同时也发现了存在的问题,下面就接着上篇文章在说一说。搜索功能这样的非超链接怎么实现不刷新上篇文章的代码不兼容火狐浏览器,所以将上篇文章中提到的这个代码$.extend({ getKey: function() { if(event.keyCode==13){ $('#soux').get(0).click(); } }, })改为$.extend({ getKey: function() { var theEvent = window.event || arguments.callee.caller.arguments[0]; var code = theEvent.keyCode; if(code == 13){ $('#soux').get(0).click(); } }, })instantclick的情况添加ajax评论需要将typecho的模板header.php中的<?php $this->header('); ?>改成<?php $this->header('commentReply='); ?>干掉模板自动输出的评论相关的js代码然后手动将刚刚屏蔽的代码加入到comments.php里面<script type="text/javascript"> (function () { window.TypechoComment = { dom : function (id) { return document.getElementById(id); }, create : function (tag, attr) { var el = document.createElement(tag); for (var key in attr) { el.setAttribute(key, attr[key]); } return el; }, reply : function (cid, coid) { var comment = this.dom(cid), parent = comment.parentNode, response = this.dom('<?php echo $this->respondId(); ?>'), input = this.dom('comment-parent'), form = 'form' == response.tagName ? response : response.getElementsByTagName('form')[0], textarea = response.getElementsByTagName('textarea')[0]; if (null == input) { input = this.create('input', { 'type' : 'hidden', 'name' : 'parent', 'id' : 'comment-parent' }); form.appendChild(input); } input.setAttribute('value', coid); if (null == this.dom('comment-form-place-holder')) { var holder = this.create('div', { 'id' : 'comment-form-place-holder' }); response.parentNode.insertBefore(holder, response); } comment.appendChild(response); this.dom('cancel-comment-reply-link').style.display = ''; if (null != textarea && 'text' == textarea.name) { textarea.focus(); } return false; }, cancelReply : function () { var response = this.dom('<?php echo $this->respondId(); ?>'), holder = this.dom('comment-form-place-holder'), input = this.dom('comment-parent'); if (null != input) { input.parentNode.removeChild(input); } if (null == holder) { return true; } this.dom('cancel-comment-reply-link').style.display = 'none'; holder.parentNode.insertBefore(response, holder); return false; } }; })(); </script&g...

阅读文章
YoduBGM一款WordPress背景音乐插件

YoduBGM 1.1.0是一款简洁 (简陋) 风格的背景音乐播放器,需要主题支持 pjax 技术,否则页面切换歌曲会断掉。背景音乐播放器那么多了为什么还要开发呢?而且还这么丑?答:其他的背景音乐播放器只能支持常规的 pjax 模板,而这个还支持使用instantclick.js的网站介绍:音乐默认不自动播放,需要点击音乐图标才会播放,第二次点击则暂停,首次播放是随机播放列表中的一首歌曲,然后顺序播放。>这个图标点击后会播放列表的下一首歌曲。插件后台可以设置音乐自动播放,可以添加歌曲,并且附带网易云音乐的解析器。下载地址:WordPress:yodubgm.ziptypecho版:https://github.com/jrotty/YoduBGMtypecho发布页面:《YoduBGM 一款 typecho 背景音乐插件》常见问题问:为什么有的时候只有两个框框而没有图标?(typecho可能遇到的问题,wp博客未知)答:图标载入的字体文件,只有用后台绑定的域名访问才会显示,比如程序后台绑定的是 qqdie.com, 那么用 www.qqdie.com 进行访问就会出现没有图标的情况,建议将 www.qqdie.com 的域名重定向到 qqdie.com 上。这样怎么访问都会访问到程序绑定的域名上,图标也会完美显示了。题外话:这是我的第一个WordPress博客程序的插件,其实本人对于wp真的不怎么了解,于是采用了拆蜜汁路易的音乐插件来学习的,过程中感觉最迷糊的就是wp插件设置那里,起初我怎么写都存不到数据库中,后来发现自己写错个字母233,也是醉...

阅读文章
APlayer Typecho插件兼容instantclick.js

超级推荐用这个大佬写的aplayer插件地址:https://github.com/MoePlayer/APlayer-Typecho然后在预加载重载函数里写上loadMeting();即可如果遇到切换页面音乐不停止的问题,再重载函数里再补充这条语句if (typeof aplayers !== 'undefined'){ for (var i = 0; i < aplayers.length; i++) { try {aplayers[i].destroy()} catch(e){} } }↓以下文章内容已弃用APlayer Typecho插件https://github.com/FaithPatrick/APlayer-Typecho-Plugininstantclick 3.0.1版兼容方法来自https://muguang.me/php/typecho-theme-apollo.html将预加载的执行代码<script data-no-instant> InstantClick.init(); </script>改为<script data-no-instant> if (!window.audios) { audios = []; for (var i = 0; i < APlayers.length; i++) { audios[i] = APlayers[i].audio; } } InstantClick.on('change', function (isInitialLoad) { for (var i = 0; i < APlayers.length; i++) { audios.push(APlayers[i].audio); } for(var i = 0; i < audios.length; i++) {if(audios[i]){audios[i].pause()}}; }); InstantClick.init(); </script> <script>var APlayerOptions = [];</script>//如果无效果尝试删掉这行instantclick 3.1.0版兼容[不完美]这个是我参考上边的瞎弄弄出来的,虽然完全看不懂QAQ。。。打开插件的plugin.php将里面的<script> var len = APlayerOptions.length; for(var i=0;i<len;i++){ if(document.getElementById('player' + APlayerOptions[i]['id'])) { APlayers[i] = new APlayer({ element: document.getElementById('player' + APlayerOptions[i]['id']), narrow: false, preload: APlayerOptions[i]['preload'], mutex: APlayerOptions[i]['mutex'], autoplay: APlayerOptions[i]['autoplay'], showlrc: APlayerOptions[i]['showlrc'], music: APlayerOptions[i]['music'], theme: APlayerOptions[i]['theme'] }); //APlayers[i].init(); } } </script>改为<script data-no-instant>//就是这里有修改,其他都没动 var len = APlayerOptions.length; for(var i=0;i<len;i++){ if(document.getElementById('player' + APlayerOptions[i]['id'])) { APlayers[i] = new APlayer({ element: document.getElementById('player' + APlayerOptions[i]['id']), narrow: false, preload: APlayerOptions[i]['preload'], mutex: APlayerOptions[i]['mutex'], autoplay: APlayerOptions[i]['autoplay'], showlrc: APlayerOptions[i]['showlrc'], music: APlayerOptions[i]['music'], theme: APlayerOptions[i]['theme'] }); //APlayers[i].init(); } } </script>将预加载的执行代码<script data-no-instant> InstantClick.init(); </script>改为<script data-no-instant> if (!window.audios) { audios = []; for (var i = 0; i < APlayers.length; i++) { audios[i] = APlayers[i].audio; } } InstantClick.on('change', function(isInitialLoad) { if (isInitialLoad === false) { var len = APlayerOptions.length; for(var i=0;i<len;i++){ if(document.getElementById('player' + APlayerOptions[i]['id'])) { APlayers[i] = new APlayer({ element: document.getElementById('player' + APlayerOptions[i]['id']), narrow: false, preload: APlayerOptions[i]['preload'], mutex: APlayerOptions[i]['mutex'], autoplay: APlayerOptions[i]['autoplay'], showlrc: APlayerOptions[i]['showlrc'], music: APlayerOptions[i]['music'], theme: APlayerOptions[i]['theme'] }); //APlayers[i].init(); } } for (var i = 0; i < APlayers.length; i++) {audios.push(APlayers[i].audio);} for(var i = 0; i < audios.length; i++) {if(audios[i]){audios[i].pause()}}; } }); InstantClick.init();</script&g...

阅读文章
instantclick实现的全站无刷新

instantclick是什么?instantclick是一个预加载的js文件,就是能提前加载网页内容的东西,他有几种模式,第一种就是鼠标放在超链接上就开始预加载,第二种就是鼠标放上去xx毫秒后(时间可自定义)进行预加载,第三种就是鼠标点击后进行预加载。项目官网:http://instantclick.io/项目地址:https://github.com/dieulot/instantclick使用这个预加载js因为前两种方式可能比较浪费资源,所以我们使用鼠标点击后进行预加载方式,代码类似如下<script src="instantclick.min.js" data-no-instant></script> <script data-no-instant>InstantClick.init('mousedown');</script>注:我使用的是instantclick3.1.0的版本。这里不着重讲instantclick的使用方法,建议去官网查阅搜索功能这样的非超链接怎么实现不刷新在香菇的点拨之下,我们强行将搜索功能表单模式变成了超链接,效果如下因为搜索结果地址一般为是站点地址加search加搜索内容如https://qqdie.com/search/搜索的内容/所以如上图所示,我们将搜索图标的超链接写为搜索地址https://qqdie.com/search/然后用js获取这个地址A,再将图标上的超链接清空,防止没有搜索内容却直接点击图标的情况。随后在事实获取输入框的内容B,然后将A和B拼接,就获得了最终地址C,然后将地址C添回图标的超链接地址上,这是我们点击图标就可以在预加载的条件下实现搜索内容了,代码如下:var bb=$("#soux").attr("href");//获取搜索地址 $("#soux").attr("href",""); //清空默认地址 $('#keyword').bind('input propertychange', function () { var aa=$("input[name=s]").val();//获取输入框内容 $("#soux").attr("href",bb+aa); //将拼接好的地址重新添加 });当然,这还不太完美,万一喜欢按回车呢,在监控下回车,在input上加上 onkeypress="$.getKey();",然后js代码上写上这个监控函数$.extend({ getKey: function() { if(event.keyCode==13){ $('#soux').get(0).click(); } }, })至此结束评论也不兼容呢然后找到了个可用的ajax评论的js,自己改了改就用上了,然后在友人C的帮助下,修复了评论嵌套的问题,然后他又提出个问题如果你启用了评论分页功能,由于typecho显示最新评论总是在第一页,所以当用户不在第一页发出了母评论,用户是看不到评论的,因为评论是在第一页最后我根据上边搜索功能的原理,用了几行代码修复了这个问题,最终ajax的评论js代码如下function ajaxc() { var txt_1 = '必须填写用户名', txt_2 = '必须填写电子邮箱地址', txt_3 = '邮箱地址不合法', txt_4 = '必须填写评论内容'; $body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html') : $('body')) : $('html,body'); var comments_order = 'DESC', comment_list = '.comment-list', comments = '.comment-num', comment_reply = '.comment-reply', comment_form = '#comment-form', respond = '#comments', textarea = '#textarea', submit_btn = '.submit', new_id = '', parent_id = ''; click_bind(); $(comment_form).submit(function() { // 提交 $(submit_btn).attr('disabled', true).fadeTo('slow', 0.5); /* 预检 */ if ($(comment_form).find('#author')[0]) { if ($(comment_form).find('#author').val() == '') { toastr.info(txt_1); msg_effect('#error'); return false; } if ($(comment_form).find('#mail').val() == '') { toastr.info(txt_2); msg_effect('#error'); return false; } var filter = /^[^@\s<&>]+@([a-z0-9]+\.)+[a-z]{2,4}$/i; if (!filter.test($(comment_form).find('#mail').val())) { toastr.info(txt_3); msg_effect('#error'); return false; } } var textValue = $(comment_form).find(textarea).val().replace(/(^\s*)|(\s*$)/g, ""); //排除空格 if (textValue == null || textValue == "") { toastr.info(txt_4); msg_effect('#error'); console.log("内容为空"); return false; } $(submit_btn).addClass("active"); $('#loading').show(); $.ajax({ url: $(this).attr('action'), type: $(this).attr('method'), data: $(this).serializeArray(), error: function() { toastr.info("提交失败,请重试!"); msg_effect('#error'); return false; }, success: function(data) { //成功取到数据 //console.log(data); $(submit_btn).removeClass("active"); $('#loading').slideUp(); try { if (!$(comment_list, data).length) { toastr.info("提交失败,可能输入内容不符合规则!"); msg_effect('#error'); return false; } else { new_id = $(comment_list, data).html().match(/id=\"?comment-\d+/g).join().match(/\d+/g).sort(function(a, b) { return a - b }).pop(); // TODO:找新 id,如果在第二页评论的话,找到的ID是有问题的! if ($('.page-navigator .prev').length && parent_id == ""){ new_id = ''; var dd=$(".prev a").attr("href");//获取上页地址 $(".prev a").attr("href",""); //将地址清空 dd=dd.replace(/comment-page-(.*?)#comments/, "comment-page-1#comments");//将获取的地址页码改为1 $(".prev a").attr("href",dd); //将地址放回去 $('.prev a').get(0).click(); //点击这个超链接 }//判断当前评论列表是否在第一页,并且只会在母评论时候才会生效 console.log("new id " + new_id); msg_effect("#success"); //插入评论内容到当前页面 if (parent_id) { data = $('#li-comment-' + new_id, data).hide(); // 取新评论 if ($('#' + parent_id).find(".comment-children").length <= 0) { $('#' + parent_id).append("<div class='comment-children'><ol class='comment-list'></ol></div>"); } if (new_id)//new_id不为空的时候才会插入 $('#' + parent_id + " .comment-children .comment-list").prepend(data); console.log('该评论为子评论,parent_id:' + parent_id); parent_id = ''; //console.log(data); } else { data = $('#li-comment-' + new_id, data).hide(); // 取新评论 //console.log('该评论为母评论'); if (!$(comment_list).length) //如果一条评论也没有的话 $(respond).append('<div class="info-com">仅有<span class="comment-num">0<\/span>条评论<\/div><ol class="comment-list"><\/ol>'); // 加 ol $(comment_list).prepend(data); //console.log('评论内容:'); //console.log(data); } $('#li-comment-' + new_id).fadeIn(); // 显示 var num; $(comments).length ? (num = parseInt($(comments).text().match(/\d+/)), $(comments).html($(comments).html().replace(num, num + 1))) : 0; //console.log($('#comments h4').length); // 评论数加一 TypechoComment.cancelReply(); $(textarea).val(''); $(comment_reply + ' a, #cancel-comment-reply-link').unbind('click'); click_bind(); // 新评论绑定 $(submit_btn).attr('disabled', false).fadeTo('slow', 1); if (new_id){ $body.animate({scrollTop: $('#li-comment-' + new_id).offset().top - 50}, 500); }else{ $body.animate({scrollTop: $('#comments').offset().top - 50}, 500); } } } catch(e) { //alert('评论ajax错误!请截图并联系主题制作者!\n\n' + e); window.location.reload(); } } // end success() }); // end ajax() return false; }); // end $(comment_form).submit() function click_bind() { // 绑定 $(comment_reply + ' a').click(function() { // 回复 //$body.animate({scrollTop: $(respond).offset().top - 180}, 400); //console.log($(this).parent().parent().parent().parent()); parent_id = $(this).parent().parent().parent().parent().parent().parent().attr("id");//parent()数量根据模板而定,否则评论嵌套可能有问题 console.log("parent_id:" + parent_id); $(textarea).focus(); }); $('#cancel-comment-reply-link').click(function() { // 取消 parent_id = ''; }); } function msg_effect(id) { // 出错 $(submit_btn).attr('disabled', false).fadeTo('', 1); } } ajaxc();注:上述代码中提示功能使用了jquery通知插件toastr,如果你不想使用可将上述代码中的 toastr.info改成alert代码参考文章:原作者文章:http://www.iyanlei.com/typecho_ajax_comment.html友人C文章:https://www.ihewro.com/archives/691/注意本文中的所有代码都依靠jquery,且本文内容预加载模式只有选择第三种方法才能实现全站无刷新。相关文章已经有了更新《续 instantclick 实现的全站无刷...

阅读文章
instantclick兼容Prismjs插件

最近yodu模板的用户要求我兼容typecho的Prismjs代码高亮插件,其实在《pjax(InstantClick) 常用的重载函数》中我就提到了Prismjs的pjax重载代码,但是经测试,还是有问题,于是今早又折腾了下,找到了方法。插件方面改动打开Prismjs代码高亮插件的Plugin.php文件在第58行找到<script>var pres = document.getElementsByTagName('pre');改成<script data-no-instant>var pres = document.getElementsByTagName('pre');在第64行找到<script src="' . $jsUrl . '"></script>改成<script src="' . $jsUrl . '" data-no-instant></script在第66行找到<script defer="defer" src="' . Helper::options()->pluginUrl . '/Prismjs/line-number-wrap-fix.js' . '"></script>改成<script defer="defer" src="' . Helper::options()->pluginUrl . '/Prismjs/line-number-wrap-fix.js' . '" data-no-instant></script>就是挨个加data-no-instantinstantclick模板方面调整在重载函数里添加 if (typeof Prism !== 'undefined') { Prism.highlightAll(true,null);}这样,代码高亮就完全好使了但是随后又发现行号会不显示,于是想在重载下行号的函数,整理下就是如下代码 if (typeof Prism !== 'undefined') {<?php if (Helper::options()->plugin('Prismjs')->showln): ?> var pres = document.getElementsByTagName('pre'); for (var i = 0; i < pres.length; i++){ if (pres[i].getElementsByTagName('code').length > 0) pres[i].className = 'line-numbers';}<?php endif; ?> Prism.highlightAll(true,null); }php部分判断插件是否使用了显示行号,使用就重载行号函数;因为是对插件进行了判断,所以如果没启用插件,直接用上面代码会导致网站错误50...

阅读文章
获取QQ头像地址,并且不暴露QQ号

需求因为最近回归原生评论,所以评论头像如果单纯的引用gravatar头像,会有一部分low bee们头像会变成gravatar默认头像,为了解决这个问题,我想对于qq号@qq.com这样的邮箱地址就行个处理来提取QQ头像,然后问题是怎么获取QQ头像地址。尝试最初想到获取QQ头像地址就是下面这样https://q.qlogo.cn/g?b=qq&nk=腻的扣扣号&s=100当随之而来的问题就是暴露了别人的QQ号码,这点对于保护他人隐私上来说不太好。于是想到了这样的QQ头像地址https://q1.qlogo.cn/g?b=qq&k=0n5AZ9Ne4h3em8iboKu3sHg&s=100上面的地址,中没有QQ号,却获取了某人的qq头像,里面的重要参数就是K的值,那么如何获取K值呢?探索上各种搜索利器,百度30分钟无果,必应一下就找到了线索。访问下面的地址就能得到一个jsonhttp://ptlogin2.qq.com/getface?appid=101382166&imgtype=1&encrytype=0&devtype=0&keytpye=0&uin=扣扣号&r=0.17780657206333406简化下无用参数,变成http://ptlogin2.qq.com/getface?&imgtype=1&uin=扣扣号访问上述地址得到的jsonpt.setHeader({"扣扣号":"http:\/\/q3.qlogo.cn\/g?b=qq&k=对应的K值&s=40&t=1483323281"});解决知道怎么获取就好处理了,上全世界最好的语言php$qq = '你的扣扣号码'; $geturl = 'http://ptlogin2.qq.com/getface?&imgtype=1&uin='.$qq; $qquser = file_get_contents($geturl); $str1 = explode('&k=', $qquser); $str2 = explode('&s=', $str1[1]); $k = $str2[0]; $qqimg = 'https://q1.qlogo.cn/g?b=qq&k='.$k.'&s=100'; echo $qqimg由于我php渣,不会解析json,所以用了个简单粗暴的方法来获取想要的字符串。扩展typechotypecho函数,其实和上边的php没啥区别。function qqgravatar ($qq){ $geturl = 'http://ptlogin2.qq.com/getface?&imgtype=1&uin='.$qq; $qquser = file_get_contents($geturl); $str1 = explode('qq&k=', $qquser); $str2 = explode('&s=', $str1[1]); $k = $str2[0]; $qqimg = 'https://q1.qlogo.cn/g?b=qq&k='.$k.'&s=100'; return $qqimg; }需要提取qq头像地址时调用<?php echo qqgravatar('QQ号'); ?>最后Hran说影响效率,测试了下,有评论里有QQ头像的文章,加载确实慢了,所以,可能弃坑20170808规则稍有变动,文章已修正php部分...

阅读文章
简单仿腾讯TIM界面

昨天下午,突然想用css写出个腾讯TIM的界面,于是开始搞,只写了个单页,没有javascript。预览地址:https://qqdie.com/areyouok/tim/为了保证美观度我限制了屏幕尺寸宽度低于800px或者高于1920px不会显示,大屏幕的需要调小窗口才能看哈。断断续续的撸了五个小时才撸出来的,并没有严格按照tim的比例来仿,只是单纯用肉眼来仿。一些小细节的地方我真的暂时做不出来。以上一个来自渣渣的作品,后续可能完善也可能弃坑,因为发现并无卵...

阅读文章
用js让网站屏蔽移动端uc浏览器

if(navigator.userAgent.indexOf('UCBrowser') > -1) { var ua = navigator.userAgent.toLowerCase(); if (/iphone|ipad|ipod/.test(ua) || /android/.test(ua)) { window.location.href = "https://qqdie.com/areyouok/uc-fuck.html"; } }就是上面的js代码,首先是判断是不是uc浏览器,如果是继续判断,如果是苹果或者安卓端,那么页面跳转至屏蔽页面,然后屏蔽页面可以做成如下图。额,其实我也没太怎么测试,应该可以哈,虽然安卓和苹果大概几乎就代表移动端了吧23...

阅读文章
pjax(InstantClick)常用的重载函数

pjax(InstantClick)一般需要重载的函数,希望这篇文章能让大家少浪费点时间多说评论if (typeof DUOSHUO !== 'undefined'){ DUOSHUO.EmbedThread('.ds-thread');} /网易云跟贴if (typeof Tie !== 'undefined') { Tie.loader("", true); }畅言(代码来自http://www.neurallinker.com/94.misaka)if($("#SOHUCS").length==1){ window.changyan = undefined;window.cyan = undefined; $.getScript("https://changyan.sohu.com/upload/changyan.js", function(){window.changyan.api.config({appid: "你的appid参数",conf: "你的conf参数"});}); }百度统计 if (typeof _hmt !== 'undefined'){ _hmt.push(['_trackPageview', location.pathname + location.search]); } 谷歌统计if (typeof ga !== 'undefined'){ ga('send', 'pageview', location.pathname + location.search); } piwik统计 _paq.push(['setDocumentTitle', document.title]); _paq.push(['trackPageView']);SynatxHighlighter SyntaxHighlighter.highlight();google code prettify if (typeof prettyPrint !== 'undefined'){ prettyPrint(); } MathJaxif (isInitialLoad === false) { if (typeof MathJax !== 'undefined'){ MathJax.Hub.Queue(["Typeset",MathJax.Hub]); } Prism.js语法高亮 if (typeof Prism !== 'undefined') { Prism.highlightAll(true,null);}如果有问题,可以参考《instantclick兼容Prismjs插件》欢迎...

阅读文章
用C语言做出小学生数学应用题的感觉

首先咱们得出道题,直接沿用香菇的幻想吧!香菇说:模板一份1元,每卖出一份就涨价1元,于是香菇卖出了1000000份,问香菇最终获得了多少人民币?解答如下图:代码如下图:#include <stdio.h> int main(void) { double a=0; int i; printf("香菇说:模板一份1元,每卖出一份就涨价1元,于是香菇卖出了1000000份,问香菇最终获得了多少人民币?\n"); for(i=1;i<=1000000;i++) { a=a+i; } printf("\n答题区:\n (1+1000000)x(1000000÷2)\n =1000001x500000\n =%.lf(元)\n\n 答:香菇最终获得了 %.lf 元人民币。",a,a); }结束语刚开始写的时候,定义a我用的是int,结果和正确答案不符合,后来经过香菇提醒,应该用double,int长度不够,才恍然大悟,两年前学的几节c语言,感觉已经全还回去了233。还有就是这种答题步骤真的很怀念哈,小学时不知道做了多少这样的题23...

阅读文章
JS实现按下F12/审查元素关闭当前页面

目前来源不详。只要按下那审查元素、按下F12键,网页就会自动关闭233,可谓杀Bug放火必备佳品![只测试了360安全浏览器233,谷歌,火狐貌似不好使]function fuckyou(){ window.close(); //关闭当前窗口(防抽) window.location="about:blank"; //将当前窗口跳转置空白页 } function ck() { console.profile(); console.profileEnd(); //我们判断一下profiles里面有没有东西,如果有,肯定有人按F12了,没错!! if(console.clear) { console.clear() }; if (typeof console.profiles =="object"){ return console.profiles.length > 0; } } function hehe(){ if( (window.console && (console.firebug || console.table && /firebug/i.test(console.table()) )) || (typeof opera == 'object' && typeof opera.postError == 'function' && console.profile.length > 0)){ fuckyou(); } if(typeof console.profiles =="object"&&console.profiles.length > 0){ fuckyou(); } } hehe(); window.onresize = function(){ if((window.outerHeight-window.innerHeight)>200) //判断当前窗口内页高度和窗口高度,如果差值大于200,那么呵呵 fuckyou(); }对于谷歌浏览器可以根据空樱酱提供的代码就行简单的修改哈(function () { var re = /x/; var i = 0; console.log(re); re.toString = function () { return '第 ' + (++i) + ' 次打开控制台'; }; })(...

阅读文章
instantclick中文文档

instantclick 中文文档文档官网:http://instantclick.io/documentation文档基于:instantclick 3.1.0版本翻译感谢;有道云翻译/谷歌翻译细节说明;部分基于自己理解有所改动,其中部分我没有接触过的位置,并没有进行翻译,以免误导特殊声明;文章允许转载,但是必须保留原文超链接出处,放置文章底部或者顶部方便查看位置!入门指南1,开始下载InstantClick,公布的最新稳定版本是3.1.0 2014/12/25版本(日志)下载压缩的版本2.7kb 或者 下载未压缩的版本21kb其他下载选项最新的开发板在github上面Bower: bower install instantclick初始化 InstantClick包括InstantClick和初始化它的页面:<script src="instantclick.min.js" data-no-instant></script> <script data-no-instant>InstantClick.init();</script> </body> </html>InstantClick现在在你的网站上激活了。阅读以下内容会更好的有助于你使用InstantClick2,InstantClick是如何工作的从传统的web开发InstantClick几乎没有差异,但重要的是要了解他们。InstantClick避开浏览器的页面变化周期可以这样的理解:InstantClick技术使你的网站一个单页面应用程序;这意味着浏览器不会改变页面了。注意事项:你不能依靠DOMContentLoaded或内jQuery.ready()来触发代码(相反可以使用文章事件和脚本的重新加载中的方法)。第三方脚本,想要兼容InstantClick可能需要一些调整(看文章下面:事件和脚本的重新加载)在页面变化上浏览器不会显示加载痕迹(看下文的自定义进度条).第二个最重要的理解是InstantClick只改变body和title,这样你的js脚本是只会加载一次(这带来能一个不错的明显的速度提升)。这所有的一切意味着什么:你的css样式和js脚本的head应该是一样的在页面InstantClick上。如果在你的head取决于页面的内容(像把一些js脚本或者css运行在页面里),它需要一点调整。InstantClick增强:如果访问者的浏览器不支持InstantClick站点,那么链接将像往常一样工作(补充翻译:就是没有预加载效果正常的浏览),只是没有速度上的提高了。3,预加载InstantClick有不同的预压的选择,使用一个或另一个取决于你的服务器将允许。In any case, not recalculating scripts and styles on every page change will already make your pages up to twice as fast (measured with Turbolinks, another project using this technique).【没看懂部分,故不翻译,好像就是个介绍】默认值:on mouseover (hover)鼠标移到超链接上就进行预加载,如果页面内容不是特别多,用户点击链接进入文章会立即显示。代码按照初始化中提到的代码即可。没有额外的服务器上的负载:on mousedown在用户鼠标点击的瞬间来预加载页面,让服务器开销几乎为零,同时还有个不错的速度提升。使用,将“mousedown”作为参数传递给InstantClick.init。InstantClick.init('mousedown');在两者之间: on mouseover with a delay如果用户将鼠标悬停你的超链接后,InstantClick将根据你设置的时间延迟预加载。建议延迟是100 ms和50 ms。超过100 ms实际上可能比on mousedown慢,小于50 ms和on mouseover (hover)几乎无差异让InstantClick预加载延迟后,通过延迟毫秒InstantClick.init作为参数InstantClick.init(50);移动端会怎样预加载会在用户手触摸超链接的一瞬间开始如果你的网站优化的移动(设备宽度视窗在Android上,使用FastClick iOS),“点击”当游客从链接,发布他的手指给大约100毫秒的延迟预加载如果你的网站不是优化了手机,这取决于操作系统。Android给300 ms,iOS给450 ms。3 g请求在同一网站通常大约需要200 ms。该怎样去选择如果你的站点可以处理额外的负载:on mouseover (hover)如果你的站点服务器不能有太多额外负载,那么用on mousedown,您的网站仍然会快于99%的网站。If you’d like to determine if your server can, start with mousedown which will put virtually zero additional stress on your server. Then use mouseover with a 100 ms delay. Then with a 50 ms delay (or go by smaller decrements, if you’re patient). Then with mouseover directly.If server-side analytics are important you are limited to mousedown, as using anything else would skew the data.【又一段翻译不好的,不太重要】4,黑名单如果一些链接不需要InstantClick预加载。黑名单可以做到。什么事黑名单什么样的连接需要设置黑名单,并且不能用白名单:链接指向一个动作,如注销和切换语言。链接指向html内容,需要一段时间来加载。链接指向页面<head>部分有不同css/js脚本在JavaScript链接触发一个动作。一些内部链接已经列入黑名单,不能白名单:含有target或者download属性的超链接上。在不同的域名上或者协议上。在相同的页面上链接指向一个#锚。黑名单的链接这样设置黑名单的链接,添加一个data-no-instant属性。<a href="/blog/" data-no-instant>Blog</a>如何设置一组黑名单有的时候为了方便,我们需要给一整组设置黑名单,这样的话就不是挨个超链接加data-no-instant属性了。只需要给父级元素添加data-no-instant属性即可例如<div data-no-instant> 无数个需要加黑名单的超链接 </div>白名单的链接或一组链接如果上述无数个需要加黑名单的超链接中有那么几个不需要添加黑名单的,可以额外为这几个链接添加白名单属性data-instant在幕后发生了什么是InstantClick穿过所有的父元素,从当前链接< html >,如果发现data-no-instant属性它认为列入黑名单并停止遍历的联系父母。如果找到一个data-instant它认为白名单的超链接。如果你想黑名单默认情况下所有的链接,然后白名单链接一个接一个的加,或白名单只有链接在一个容器,那么添加data-no-instant属性到<body>,并且将data-instant属性添加到需要预加载的容器/链接。白名单模式The following is deprecated and will likely be removed in 4.0. It’s only useful to know if you’re dealing with a website that has it activated (the true argument is passed to InstantClick.init).The Correct Way™: If you want to accomplish the same as the whitelist mode, just add data-no-instant to your , as described in “Whitelist a link or group of links”.启用白名单模式通过true来InstantClick.initInstantClick.init(true); /* or */ InstantClick.init(50, true); /* or */ InstantClick.init('mousedown', true);5,事件和脚本的重新加载InstantClick技术让你的网站成为一个单页面应用程序,所以没有DOMContentLoaded开始页面内的变化了。正因为如此,其他的js脚本可能需要调整与InstantClick正常工作。InstantClick 4个事件提供钩子为页面的生命周期:change:页面更改完毕,即click触发fetch:页面开始预加载receive:页面预加载完毕,即:hover或mousedown触发的预加载,但不一定会change,因为用户不一定click。wait:用户点击一个链接,但是还没有加载的页面。只有立即触发页面时不显示。如不在body中有个脚本不希望被重新加载,那么给他加上黑名单属性即可<script data-no-instant>alert("I’m only run once.");</script>如果你的脚本与预加载冲突,你需要一个一个的找出来,并解决他为例,这是如何让Google Analytics(2013年底代码)工作:<script src="instantclick.min.js" data-no-instant></script> <script data-no-instant> /* Google Analytics code here, without ga('send', 'pageview') */ InstantClick.on('change', function() { ga('send', 'pageview', location.pathname + location.search); }); InstantClick.init(); </script>改变内容receive【这部分我不熟悉,故不翻译】Sometimes it’s simpler to alter pages on the fly than to rearchitect your back end for InstantClick. receive allows you to do that.It gets three arguments: url, body and title.url is the address of the page received, it includes the hash. It’s read-only.body is the body object and title is the title text. You can modify those two and return an object with them (or with just one of them to modify only one) if you want to alter pages before they’re displayed.Here’s an example.InstantClick.on('receive', function(url, body, title) { var dont_display = body.querySelector('#dont_display_me_when_loaded_with_instantclick') if (dont_display) { dont_display.setAttribute('hidden', ''); } title += ' (loaded with InstantClick)'; return { body: body, title: title }; });Keep in mind the body object here is body and not document.body!When you have more than one callback listening to receive, each subsequent callback will get the last altered content.If you don’t want to alter the page on receive, either don’t return anything or return false.进一步1,跟踪资源的变化现在跟踪资产的方式改变目前有点笨拙。它可能会在InstantClick 4.0上有所改变。检查当样式表或脚本(外部或内联)被更新时,将其添加data-instant-track属性:<link rel="stylesheet" href="style.css" data-instant-track> <script src="script.js" data-instant-track></script> <style data-instant-track>body { background: aliceblue; }</style> <script data-instant-track>window.timingStart = performance.now();</script>InstantClick将检查更改href或src属性是否存在,表明一个文件被更新,修改其属性:<link rel="stylesheet" href="style.css?20140308" data-instant-track> <script src="script.js?20140308" data-instant-track></script>如果是内联js脚本或css风格,InstantClick将检查改变元素的内容<style data-instant-track>body { background: midnightblue; font: 13px Helvetica; }</style> <script data-instant-track>var timingStart = performance && performance.now();</script>当检测到任何变化,InstantClick将重新加载页面,从而使浏览器重新评估所有脚本和样式。2,自定义进度条这个进度条进度条是假的,只是让用户意识到将要发生什么。在未来可能会展示真正的进度条在未来的改变中,The bar is displayed even if the page has been loaded instantly。在GitHub上讨论。默认情况下,进度条的颜色是#29d,你可以用CSS改变:#instantclick-bar { background: white; }你也可以让他消失:#instantclick { display: none; }目标RoadmapChangel...

阅读文章
appinventor安卓壁纸设置(下)

继《appinventor 安卓壁纸设置(上)》文章,这次加入联网获取图片功能前台加入一个web客户端组件。逻辑上在屏幕初始化时,设置web客户端组件地址为一个图片地址,然后GET请求这个地址。当请求完成时,设置画布背景图为请求的图片。综合上篇...

阅读文章
appinventor安卓壁纸设置(上)

初步功能需求打开安卓app,然后会看到一张内置好的图片,点击下方的设置壁纸,实现让这个图片成为壁纸的功能,实现方法调用安卓系统内置的壁纸设置工具。问题明确1,使用android.intent.action.ATTACH_DATA调用安卓系统默认的图片设置工具2,不能直接将软件内置的图片设置为壁纸,需要先将图片存到手机本地中,然后进行调用,调用目录为file:///mnt/sdcard/布局设计:界面背景色会浅灰,然后一个画布组件,画布宽度100%,高度充满,背景图为内置的图片,画布下方一个按钮,按钮背景颜色为白色,文字为粉色,形状为圆角矩形,文字为“设为壁纸”,最后在增加两个非可视组件:对话框和活动启动器对话框:用来显示提示信息的活动启动器:调用系统壁纸设置工具的编程设计:按钮被点击后依次执行:将画布图片保存至本地,然后定义活动启动器,数据类型为图片,调用安卓内置工具,数据地址为本地图片地址,启动活动启动器。当活动启动器活动完成时:调用对话框组件,发出提示信息。运行后壁纸设置没有问题,但是使用画布来保存图片,图片原始尺寸发生变化,画面清晰度差为什么要写这篇文章突发奇想的想试试appinventor能否设置壁纸,然后到群里问了下,然后接触到了活动启动器这个东西,但是自己还是没有琢磨出来,百度搜不到,结果谷歌搜到了个油管的视频教程,于是看了后记录下,以免忘...

阅读文章
OneinStack配置linux主机的笔记

笔记其实不是这个样子哒,但是因为我误删了,笔记就没了,于是翻出了和大大的聊天记录,复制之,然后删除大大的名字和我的名字,然后就有了这个,之所以发出了是怕我再次误删顺便水文下载Xshell,Xftp打开xshell,新建一个连接输入ip,输入密码登录到主机输入 sudo su root进入root模式apt-get update apt-get -y install wget screen curl python wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz tar xzf oneinstack-full.tar.gz cd oneinstack screen -S oneinstack ./install.sh22或者直接回车1装nginx3不安装4不安装,Tomcat是用来跑Java程序的y安装数据库3安装5.5哒ynn,ioncube加密没多少程序用nn,因为用xftp所以不用安装y用来管理数据库的y以后会用到y以后做缓存会用到n等待安装30分钟左右./addons.sh选择7再选择1安装let证书其他操作参考https://oneinstack.com/install/即可最后每次传完网站文件后运行chown -R www:www /data/wwwroot/ chmod -R 755 /data/wwwroot/chown 是给文件设置所有者网站的文件所有者为www,用户组为www,就可以让web服务器软件有权限读取,写入了其他网站目录在 /data/wwwroot//usr/local/nginx/conf/vhost/这里是网站的nginx配置文件/usr/local/nginx/conf/ssl证书所在...

阅读文章
javascript函数

前言继《初探 javascript》之后的,进一步学习的成果,有成果则记录之,水文也。内容函数的基本格式//定义一个函数 function 函数名字(这里是参数根据需要写与不写){ 执行的语句 } //运行一个函数 函数名字(里是参数根据需要写与不写);**举个没有参数的函数的例子:** function abc(){ alert('你好'); } abc(); //这个函数的结果就是弹出个提示框,上面显示着“你好”。**举1个带参数的函数的例子:** function abc(num){ alert(num); } abc(12); //这个函数的结果就是弹出个提示框,上面显示着“12”。运行abc();时abc的括号中带的什么就弹出什么。**举2个带参数的函数的例子:** function abc(a,b){ alert(a+b); } abc(1,2); //这个函数的结果就是弹出个提示框,上面显示着“3”。匿名函数,就是没有名字的函数 一个事件=function(){ 执行的语句 } //触发这个事件,就执行这个函数内的语句。暂时性成果YoduBGM背景音乐插件0.5.0版采用了匿名函数的写...

阅读文章
1/3