找到
36
篇与
CODE
相关的结果
-
Typecho插件开发手册 一、插件的基本结构 在 Typecho 中,插件通常是一个独立的 PHP 文件,默认放置在usr/plugins/目录下。插件文件名即为插件名,插件类名也应与文件名相同。插件必须实现 Typecho_Plugin_Interface 接口。 基本结构: <?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; /** * 插件的描述信息 * * @package PluginName */ class PluginName_Plugin implements Typecho_Plugin_Interface { // 插件激活方法 public static function activate() {} // 插件停用方法 public static function deactivate() {} // 插件配置面板 public static function config(Typecho_Widget_Helper_Form $form) {} // 个人用户的配置面板 public static function personalConfig(Typecho_Widget_Helper_Form $form) {} // 实现的插件功能方法 // ... }说明 Typecho_Plugin_Interface:插件类必须实现该接口,包含 activate、deactivate、config、personalConfig 四个方法。 activate:插件激活时调用,用于注册插件方法、初始化数据等。 deactivate:插件停用时调用,用于清理数据、注销插件方法等。 config:插件的配置界面,用于在后台展示插件的设置选项。 personalConfig:针对个人用户的配置界面。 二、激活插件 在 activate 方法中,可以进行以下操作: 注册插件方法 :使用 Typecho_Plugin::factory 注册插件的方法到指定的 Hook Point。 创建数据库表 :如果插件需要额外的数据表,可以在激活时创建。 初始化数据 :初始化插件所需的数据或配置。 public static function activate() { // 注册插件方法到 Hook Point Typecho_Plugin::factory('Widget_Archive')->beforeRender = array('PluginName_Plugin', 'beforeRender'); // 返回激活成功的信息 return _t('插件已激活'); } 三.停用插件 在deactivate方法中,可以进行以下操作: 注销插件方法:清理注册的插件方法(Typecho 会自动处理)。 删除数据库表:如果插件创建了额外的数据表,可以选择在停用时删除。 清理数据:清理插件的配置信息或缓存。 四、定义插件的配置界面 在 config 方法中定义插件的配置选项。 public static function config(Typecho_Widget_Helper_Form $form) { // 添加一个文本框 $text = new Typecho_Widget_Helper_Form_Element_Text('text', NULL, '默认值', _t('文本框标签'), _t('文本框提示')); $form->addInput($text); // 添加一个单选框 $radio = new Typecho_Widget_Helper_Form_Element_Radio('radio', array('1' => '选项1', '2' => '选项2'), '1', _t('单选框标签')); $form->addInput($radio); // 添加一个复选框 $checkbox = new Typecho_Widget_Helper_Form_Element_Checkbox('checkbox', array('1' => '选项1', '2' => '选项2'), NULL, _t('复选框标签')); $form->addInput($checkbox); }说明: 使用 Typecho_Widget_Helper_Form_Element_* 类来创建不同类型的表单元素。 调用 $form->addInput() 方法将元素添加到配置界面。 五、处理插件的用户配置 在插件的方法中,可以通过Helper::options()->plugin('PluginName')获取用户的配置信息。 public static function someMethod() { $options = Helper::options()->plugin('PluginName'); $textValue = $options->text; // 获取文本框的值 // ... }说明: Helper::options():获取全局的配置对象。 plugin('PluginName'):获取指定插件的配置信息。 六、注册插件方法(Hook Point) 在 activate 方法中,使用 Typecho_Plugin::factory 注册插件的方法到指定的 Hook Point。 public static function activate() { Typecho_Plugin::factory('Widget_Archive')->beforeRender = array('PluginName_Plugin', 'beforeRender'); }说明: 具体插入点可以参考文章后半段,有专门介绍各插入点的作用及位置 Typecho_Plugin::factory('类名')->方法名:指定要拦截的类和方法(Hook Point)。 array('PluginName_Plugin', '方法名'):插件的方法回调。 七、定义自定义路由 如果插件需要自定义 URL 路由,可以在activate 方法中定义。 public static function activate() { // 添加自定义路由 Helper::addRoute('plugin_route', '/plugin/route/', 'PluginName_Action', 'actionMethod'); } public static function deactivate() { // 删除自定义路由 Helper::removeRoute('plugin_route'); }Helper::addRoute:添加自定义路由。 第一个参数:路由名称。 第二个参数:路由规则(URL 模式)。 第三个参数:处理该路由的类名。 第四个参数:处理方法。 Helper::removeRoute:删除自定义路由。 八、加载插件的类和方法 如果插件包含多个类或文件,可以通过require_once或自动加载的方式引入。 // 在插件的主文件中 require_once 'libs/Helper.php'; // 使用命名空间和自动加载 spl_autoload_register(function ($class) { $prefix = 'PluginName\\'; $base_dir = __DIR__ . '/src/'; $len = strlen($prefix); if (strncmp($prefix, $class, $len) !== 0) { return; } $relative_class = substr($class, $len); $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php'; if (file_exists($file)) { require $file; } }); require_once:直接引入文件。 spl_autoload_register:注册自动加载函数,按照命名空间和目录结构自动加载类。 九、文件载入与资源管理 插件可能需要加载 CSS、JS 文件或其他资源,可以通过以下方式实现。 在模板中加载资源: // 在插件的方法中 public static function header() { $cssUrl = Helper::options()->pluginUrl . '/PluginName/assets/style.css'; echo '<link rel="stylesheet" type="text/css" href="' . $cssUrl . '">'; } public static function footer() { $jsUrl = Helper::options()->pluginUrl . '/PluginName/assets/script.js'; echo '<script type="text/javascript" src="' . $jsUrl . '"></script>'; }注册到 Hook Point: public static function activate() { Typecho_Plugin::factory('Widget_Archive')->header = array('PluginName_Plugin', 'header'); Typecho_Plugin::factory('Widget_Archive')->footer = array('PluginName_Plugin', 'footer'); } Helper::options()->pluginUrl:获取插件目录的 URL。 header、footer:在页面的头部和尾部输出内容。 十、模板的使用与扩展 插件可以自定义模板,或者扩展主题的模板功能。在插件目录中创建模板文件: 创建themes目录 :在插件目录下创建themes目录,用于存放模板文件。 编写模板文件 :例如,创建themes/plugin-template.php 在插件中调用模板: public static function renderTemplate() { $template = __DIR__ . '/themes/plugin-template.php'; if (file_exists($template)) { include $template; } else { echo '模板文件不存在'; } }在路由处理方法中调用: public function actionMethod() { self::renderTemplate(); } 十一、完整的插件示例 usr/ └── plugins/ └── HelloWorld/ ├── HelloWorld_Plugin.php ├── Action.php ├── assets/ │ ├── style.css │ └── script.js └── themes/ └── hello.php十二、钩子(Hook)插入点 在 Typecho 插件开发中,可以通过 Typecho_Plugin::factory('类名')->方法名的形式来拦截和扩展 Typecho 的核心功能。以下是所有可用的插入位置(Hook Points),按照类名分类,并注明调用的位置及意义。 十三、插入位置的定义方式 插入位置通常是通过以下几种方式定义的: 方法(Method): 在 Typecho 的核心类中,某些方法被定义为插入位置。例如,Widget_Contents_Post_Edit类中的insert方法就是一个插入位置。 插件可以通过Typecho_Plugin::factory('Widget_Contents_Post_Edit')->insert来拦截这个方法,并在其中执行自定义代码。 属性(Property): 在 Typecho 的核心类中,某些属性被定义为插入位置。例如,Widget_Contents_Post_Edit 类中的 insert 属性就是一个插入位置。 插件可以通过 Typecho_Plugin::factory('Widget_Contents_Post_Edit')->insert 来拦截这个属性,并在其中执行自定义代码。 13.1示例 假设我们有一个Widget_Contents_Post_Edit类,其中定义了一个insert方法: class Widget_Contents_Post_Edit extends Typecho_Widget { public function insert() { // 插入文章的逻辑 } }在插件中,我们可以通过以下方式拦截这个insert方法: class XXX_Plugin implements Typecho_Plugin_Interface { public static function activate() { Typecho_Plugin::factory('Widget_Contents_Post_Edit')->insert = array('XXX_Plugin', 'publish'); } public static function publish($post) { // 自定义的插入逻辑 } }在这个例子中,XXX_Plugin 插件在 Widget_Contents_Post_Edit 类的 insert 方法执行时,会调用 XXX_Plugin::publish 方法来执行自定义的插入逻辑 十四、常见Hooks整理 1.Widget_Contents_Post_Edit insert:在插入文章时触发。 update:在更新文章时触发。 delete:在删除文章时触发。 finishPublish:在文章发布完成后触发。 2.Widget_Contents_Page_Edit insert:在插入页面时触发。 update:在更新页面时触发。 delete:在删除页面时触发。 finishPublish:在页面发布完成后触发。 3.Widget_Comments_Edit insert:在插入评论时触发。 update:在更新评论时触发。 delete:在删除评论时触发。 finishComment:在评论操作完成后触发。 finishDelete:在评论删除后触发。 4.Widget_Users_Edit insert:在创建用户时触发。 update:在更新用户信息时触发。 delete:在删除用户时触发。 finishCreate:在用户创建完成后触发。 finishDelete:在用户删除后触发。 5.Widget_Metas_Category_Edit insert:在创建分类时触发。 update:在更新分类信息时触发。 delete:在删除分类时触发。 finishCreate:在分类创建完成后触发。 6.Widget_Metas_Tag_Edit insert:在创建标签时触发。 update:在更新标签信息时触发。 delete:在删除标签时触发。 finishCreate:在标签创建完成后触发。 7.Widget_Feedback comment:在用户提交评论时触发。 trackback:在接收Trackback时触发。 8.Widget_Register register:在用户注册时触发。 9.Widget_Login loginSucceed:在用户登录成功后触发。 loginFail:在用户登录失败后触发。 10.Widget_Archive beforeRender:在渲染文章内容之前触发。 afterRender:在渲染文章内容之后触发。 beforeOutput:在输出文章内容之前触发。 afterOutput:在输出文章内容之后触发。 handleInit:在 Archive Widget 初始化时触发。 select:在构建内容查询时触发。 11.Widget_Comments beforeRender:在渲染评论列表之前触发。 afterRender:在渲染评论列表之后触发。 12.Widget_Abstract_Contents contentEx:在获取文章完整内容时触发。 excerptEx:在获取文章摘要内容时触发。 filter:在获取内容列表时触发。 13.Widget_Abstract_Comments contentEx:在获取评论内容时触发。 excerptEx:在获取评论摘要时触发。 filter:在获取评论列表时触发。 14.Widget_Abstract_Metas filter:在获取分类或标签列表时触发。 15.Widget_Abstract_Users filter:在获取用户列表时触发。 16.Widget_Abstract_Options filter:在获取系统选项时触发。 17.Widget_Abstract beforeRender:在任何 Widget 渲染之前触发。 afterRender:在任何 Widget 渲染之后触发。 ___construct:在 Widget 初始化时触发。 ___init:在 Widget 初始化完成后触发。 ___execute:在执行 Widget 主逻辑时触发。 18.Typecho_Widget widget:在创建 Widget 实例时触发。 widgetStart:在 Widget 开始执行时触发。 widgetEnd:在 Widget 执行结束时触发。 19.Typecho_Widget_Helper_Form render:在渲染表单之前触发。 20.Typecho_Widget_Helper_Form_Element render:在渲染表单元素之前触发。 21.Typecho_Db query:在执行数据库查询时触发。 fetchAll:在获取查询结果时触发。 22.Typecho_Router router:在路由解析时触发。 dispatch:在路由调度时触发。 23.Typecho_Response redirect:在执行页面重定向时触发。 24.Typecho_Cookie set:在设置 Cookie时触发。 get:在获取 Cookie时触发。 25.Typecho_Feed output:在输出RSS Feed时触发。 26.Typecho init:在系统初始化时触发。 header:在输出页面头部时触发。 footer:在输出页面尾部时触发。 使用方法示例: Typecho_Plugin::factory('Widget_Contents_Post_Edit')->insert = array('YourPlugin_Class', 'yourMethod');说明: 插入位置(Hook Point):即可拦截的方法名。 触发时机:在对应的方法执行时触发,允许插件在该时机执行自定义逻辑。 使用场景:插件可以通过这些 Hook Points 实现对 Typecho 功能的扩展和定制,例如在文章发布后发送通知,在用户登录失败后记录日志等。 注意事项: 确保方法存在:请确保您定义的插件类和方法存在且可被调用,避免出现错误。 性能考虑:插件开发时应注意性能,避免阻塞核心功能的执行。 充分测试:某些 Hook Points 可能仅在特定情况下触发,开发时需充分测试。 通过以上整理,您可以清晰地了解 Typecho 插件开发中可用的所有插入位置,以及它们的调用位置和意义,方便在插件中实现所需的功能。 -
c自带qsort函数用法 qsort函数用法 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针 用于确定排序的顺序 排序方法有很多种, 选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序 是目前公认的一种比较好的排序算法(我没听书速度比这快的了,特殊场合例外),比选择排序,冒泡排序都要快。这是因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort。 qsort 要求提供一个 比较函数,是为了做到通用性更好一点。比如你不仅仅的是要排序一个数字而已,可能你要用来排序几个数字 ,比如有一个结构 struct num { int a; int b; }; 然后我有一个num 类型的数组, num dddd[100]; 我想给 dddd这个数组排序,那怎么办? 我想让 a +b 最大的num元素排在数组的最前面,那又怎么办? 这都可以通过定义比较函数来做到的。 比较函数的作用就是给qsort指明 元素的大小是怎么比较的。 像这样的比较函数 inline int MyCmp(const void* a, const void* b) 都是有两个元素 作为参数,返回一个int 值, 如果 比较函数返回大于0,qsort就认为 a>b , 如果比较函数返回等于0 qsort就认为a 和b 这两个元素相等,返回小于零 qsort就认为 ab),你比较函数却返回一个 -1 (小于零的)那么qsort认为a<本文中排序都是采用的从小到大排序> 一、对int类型数组排序 int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp);二、对char类型数组排序(同int类型) char word[100]; Sample: int cmp( const void *a , const void *b ) { return *(char *)a - *(int *)b; } qsort(word,100,sizeof(word[0]),cmp);三、对double类型数组排序(特别要注意) double in[100]; int cmp( const void *a , const void *b ) { return *(double *)a > *(double *)b ? 1 : -1; } qsort(in,100,sizeof(in[0]),cmp); 四、对结构体一级排序 struct In { double data; int other; }s[100] //按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种, //参考上面的例子写 int cmp( const void *a ,const void *b) { return (*(In *)a).data > (*(In *)b).data ? 1 : -1; } qsort(s,100,sizeof(s[0]),cmp); 五、对结构体二级排序 struct In { int x; int y; }s[100]; //按照x从小到大排序,当x相等时按照y从大到小排序 int cmp( const void *a , const void *b ) { struct In *c = (In *)a; struct In *d = (In *)b; if(c->x != d->x) return c->x - d->x; else return d->y - c->y; } qsort(s,100,sizeof(s[0]),cmp); 六、对字符串进行排序 struct In { int data; char str[100]; }s[100]; //按照结构体中字符串str的字典顺序排序 int cmp ( const void *a , const void *b ) { return strcmp( (*(In *)a)-&gt;str , (*(In *)b)-&gt;str ); } qsort(s,100,sizeof(s[0]),cmp); 七、计算几何中求凸包的cmp int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序 { struct point *c=(point *)a; struct point *d=(point *)b; if( calc(*c,*d,p[1]) &lt; 0) return 1; else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面 return 1; else return -1; } PS: 其中的qsort函数包含在的头文件里,strcmp包含在的头文件里 出处:syxChina 以下自写的: test.c #include <stdio.h> #include <stdlib.h> int cmp(const void *a ,const void *b) { return *(int *)a - *(int *)b ; //从小到大排序,把a,b位置反过来就是从大到小 } int main() { int a[10]={-1,9,5,7,-11,2,6,8,9,6},i; qsort(a,10,sizeof(int),cmp); for(i = 0 ; i < 10 ; ++i) { printf("%d ",a[i]); } printf("\n") ; return 0 ; } 整型数组排序.cpp #include<iostream> #include<algorithm> using namespace std; struct node { int a; int b; double c; }; bool cmp(node x,node y) { if(x.a!=y.a) return x.a<y.a; if(x.b!=y.b) return x.b>y.b; return x.c>y.c; } int main() { struct node arr[5]={{2,1,1.2},{5,2,2.1},{6,1,3.1},{3,4,2.1},{3,2,2.4}}; int i; cout<<"排序前:"<<endl; for(i=0;i<5;i++) { cout<<arr[i].a<<"\t"<<arr[i].b<<"\t"<<arr[i].c<<"\t"; cout<<endl; } cout<<"排序后:"<<endl; sort(arr,arr+5,cmp); for(i=0;i<5;i++) { cout<<arr[i].a<<"\t"<<arr[i].b<<"\t"<<arr[i].c<<"\t"; cout<<endl; } } -
蓝桥杯:基础练习 十六进制转八进制 基础练习 十六进制转八进制问题描述: 给定n个十六进制正整数,输出它们对应的八进制数。 输入格式: 输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 输出格式: 输出n行,每行为输入对应的八进制正整数。 注意: 输入的十六进制数不会有前导0,比如012A。输出的八进制数也不能有前导0。 时间限制: 1.0s 内存限制: 512.0MB 样例输入: 2 39 123ABC样例输出: 71 4435274提示: 先将十六进制数转换成某进制数,再由某进制数转换成八进制。 算法分析: 这个题目,我们要看到 "每个十六进制数长度不超过100000" 这句话。注意是100000位,不是<100000; 我们这里主要思想是先将十六进制转化为二进制(每4位二进制对应1位十六进制),然后将二进制转化为八进制(每3位二进制对应1位八进制)。 如:十六进制 A1 二进制 1010 0001 八进制 (010 100 001)241 C语言实现如下: ①采用gets输入时,需要处理%d在输入流中留下的回车; ②合理定义数组大小,其中十六进制位数与二进制是4倍关系,与八进制是4/3关系; ③使用strcat拼接字符串时注意,为了加快速度,需采用下文中方式,否则会超时(避免每次都从字符串首部查找’\0’); ④对于所得二进制可能不为3的整数倍时,01,101,110,101…..,这里采用取余法将01单独处理,后面整体处理; ⑤由于采用了while(scanf(”)!=EOF)输入形式,注意每次对尾部进行截断,避免对下次计算造成影响; ⑥以下程序采用纯C语言编写。 #include <stdio.h> #include <string.h> #include <math.h> char Hex[10][100001]; // 十六进制 char Oct[10][150000]; // 八进制 将列数扩大4/3倍以上 char Bin[10][400004]; // 二进制 将列数扩大为4倍以上 //十六进制转二进制 void Hex2Bin(int row) { int hexcol=0, bincol=0; Bin[row][0] = '\0'; //strcat 识别'\0' while (Hex[row][hexcol] != '\0') { switch (Hex[row][hexcol]) {//&Bin[row][bincol] 比直接使用Bin[row]速度快,避免从头查找'\0' case '0': strcat(&Bin[row][bincol],"0000"); break; case '1': strcat(&Bin[row][bincol],"0001"); break; case '2': strcat(&Bin[row][bincol],"0010"); break; case '3': strcat(&Bin[row][bincol],"0011"); break; case '4': strcat(&Bin[row][bincol],"0100"); break; case '5': strcat(&Bin[row][bincol],"0101"); break; case '6': strcat(&Bin[row][bincol],"0110"); break; case '7': strcat(&Bin[row][bincol],"0111"); break; case '8': strcat(&Bin[row][bincol],"1000"); break; case '9': strcat(&Bin[row][bincol],"1001"); break; case 'A': strcat(&Bin[row][bincol],"1010"); break; case 'B': strcat(&Bin[row][bincol],"1011"); break; case 'C': strcat(&Bin[row][bincol],"1100"); break; case 'D': strcat(&Bin[row][bincol],"1101"); break; case 'E': strcat(&Bin[row][bincol],"1110"); break; case 'F': strcat(&Bin[row][bincol],"1111"); break; } ++hexcol; bincol += 4; } // puts(Bin[row]); } //二进制转八进制 void Bin2Oct(int row) { int bincol,octcol=0,mod,num,curcol=0,flag=0; //curcol 表示当前扫描到二进制位置 //flag用来标记首部是否已经出现了非0元素 bincol = strlen(Bin[row]); mod = bincol % 3; // 解决01, 101,110,011...问题, //划分为2部分分别计算 //01------101,110,011 //单独计算01 num = 0; while (--mod >= 0) { if (Bin[row][curcol++] == '1') num += (int)pow(2,mod); } //跳过首部0 if (num != 0) { Oct[row][octcol++] = '0'+num; //转数字为字符 flag = 1; //标记第一个不为0位置 } //计算101,110,011... while (Bin[row][curcol] != '\0') { mod = 3; num = 0; //每3位一计算,2^2=4, 2^1=2, 2^0=1 while (--mod >= 0) { if (Bin[row][curcol++] == '1') num += (int)pow(2,mod); } //跳过首部0 if (num != 0 || flag == 1) { Oct[row][octcol++] = '0'+num; //转数字为字符 flag = 1; } } //将尾部截断 Oct[row][octcol] = '\0'; } //十六进制转八进制 void Hex2Oct(int n) { int row; for (row = 0; row < n; ++row) { Hex2Bin(row); // 16->2 Bin2Oct(row); // 2->8 } } int main(void) { int row,n; while (scanf("%d",&n) != EOF) { getchar(); //消除输入流——回车误差 for (row = 0; row < n; ++row) { gets(Hex[row]); } //十六进制转八进制 Hex2Oct(n); //打印 for (row = 0; row < n; ++row) { puts(Oct[row]); } } return 0; } -
《前方高能》教程来了。。 一、首先:在style.css添加如下代码: /*high起来*/ .btn-link{border-radius:0;color:#428BCA;cursor:pointer;font-weight:normal;}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:rgba(0,0,0,0);box-shadow:none;}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:rgba(0,0,0,0);}.btn-link:hover,.btn-link:focus{background-color:rgba(0,0,0,0);color:#2A6496;text-decoration:none;}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none;}}二、把下面代码保存到hi.css放到主题目录css下(如果没有自己建一个目录) .mw-strobe_light{position:fixed;width:100%;height:100%;top:0;left:0;z-index:100000;background-color:rgba(250,250,250,0.8);display:block;}.mw-harlem_shake_me{transition:all 0.8s ease-in-out;-moz-transition:all 0.8s ease-in-out;-webkit-transition:all 0.8s ease-in-out;-o-transition:all 0.8s ease-in-out;-ms-transition:all 0.8s ease-in-out;animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;-webkit-animation:spin 1s infinite linear;-o-animation:spin 1s infinite linear;-ms-animation:spin 1s infinite linear;}.mw-harlem_shake_slow{transition:all 3.2s ease-in-out;-moz-transition:all 3.2s ease-in-out;-webkit-transition:all 3.2s ease-in-out;-o-transition:all 3.2s ease-in-out;-ms-transition:all 3.2s ease-in-out;animation:spin 4s infinite linear;-moz-animation:spin 4s infinite linear;-webkit-animation:spin 4s infinite linear;-o-animation:spin 4s infinite linear;-ms-animation:spin 4s infinite linear;}body{-webkit-backface-visibility:hidden;}.mw-harlem_shake_me{-webkit-animation-duration:.4s;-moz-animation-duration:.4s;-o-animation-duration:.4s;animation-duration:.4s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;}.mw-harlem_shake_slow{-webkit-animation-duration:1.6s;-moz-animation-duration:1.6s;-o-animation-duration:1.6s;animation-duration:1.6s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;}.flash,.mw-strobe_light{-webkit-animation-name:flash;-moz-animation-name:flash;-o-animation-name:flash;animation-name:flash;}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);}20%,40%,60%,80%{-webkit-transform:translateX(10px);}}@-moz-keyframes shake{0%,100%{-moz-transform:translateX(0);}10%,30%,50%,70%,90%{-moz-transform:translateX(-10px);}20%,40%,60%,80%{-moz-transform:translateX(10px);}}@-o-keyframes shake{0%,100%{-o-transform:translateX(0);}10%,30%,50%,70%,90%{-o-transform:translateX(-10px);}20%,40%,60%,80%{-o-transform:translateX(10px);}}@keyframes shake{0%,100%{transform:translateX(0);}10%,30%,50%,70%,90%{transform:translateX(-10px);}20%,40%,60%,80%{transform:translateX(10px);}}.shake,.im_baked{-webkit-animation-name:shake;-moz-animation-name:shake;-o-animation-name:shake;animation-name:shake;}.swing,.im_drunk{-webkit-transform-origin:top center;-moz-transform-origin:top center;-o-transform-origin:top center;transform-origin:top center;-webkit-animation-name:swing;-moz-animation-name:swing;-o-animation-name:swing;animation-name:swing;}@-webkit-keyframes wobble{0%{-webkit-transform:translateX(0%);}15%{-webkit-transform:translateX(-15%) rotate(-4deg);}30%{-webkit-transform:translateX(12%) rotate(3deg);}45%{-webkit-transform:translateX(-9%) rotate(-2deg);}60%{-webkit-transform:translateX(6%) rotate(2deg);}75%{-webkit-transform:translateX(-3%) rotate(-1deg);}100%{-webkit-transform:translateX(0%);}}@-moz-keyframes wobble{0%{-moz-transform:translateX(0%);}15%{-moz-transform:translateX(-15%) rotate(-5deg);}30%{-moz-transform:translateX(12%) rotate(3deg);}45%{-moz-transform:translateX(-9%) rotate(-3deg);}60%{-moz-transform:translateX(6%) rotate(2deg);}75%{-moz-transform:translateX(-3%) rotate(-1deg);}100%{-moz-transform:translateX(0%);}}@-o-keyframes wobble{0%{-o-transform:translateX(0%);}15%{-o-transform:translateX(-15%) rotate(-5deg);}30%{-o-transform:translateX(12%) rotate(3deg);}45%{-o-transform:translateX(-9%) rotate(-3deg);}60%{-o-transform:translateX(6%) rotate(2deg);}75%{-o-transform:translateX(-3%) rotate(-1deg);}100%{-o-transform:translateX(0%);}}@keyframes wobble{0%{transform:translateX(0%);}` 15%{transform:translateX(-15%) rotate(-5deg);}30%{transform:translateX(12%) rotate(3deg);}45%{transform:translateX(-9%) rotate(-3deg);}60%{transform:translateX(6%) rotate(2deg);}75%{transform:translateX(-3%) rotate(-1deg);}100%{transform:translateX(0%);}}.wobble,.im_first{-webkit-animation-name:wobble;-moz-animation-name:wobble;-o-animation-name:wobble;animation-name:wobble;}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);}50%{-webkit-transform:scale(1.1);}100%{-webkit-transform:scale(1);}}@-moz-keyframes pulse{0%{-moz-transform:scale(1);}50%{-moz-transform:scale(1.1);}100%{-moz-transform:scale(1);}}@-o-keyframes pulse{0%{-o-transform:scale(1);}50%{-o-transform:scale(1.1);}100%{-o-transform:scale(1);}}@keyframes pulse{0%{transform:scale(1);}50%{transform:scale(1.1);}100%{transform:scale(1);}}.pulse,.im_blown{-webkit-animation-name:pulse;-moz-animation-name:pulse;-o-animation-name:pulse;animation-name:pulse;}@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.3);}50%{opacity:1;-webkit-transform:scale(1.05);}70%{-webkit-transform:scale(.9);}100%{-webkit-transform:scale(1);}}@-moz-keyframes bounceIn{0%{opacity:0;-moz-transform:scale(.3);}50%{opacity:1;-moz-transform:scale(1.05);}70%{-moz-transform:scale(.9);}100%{-moz-transform:scale(1);}}@-o-keyframes bounceIn{0%{opacity:0;-o-transform:scale(.3);}50%{opacity:1;-o-transform:scale(1.05);}70%{-o-transform:scale(.9);}100%{-o-transform:scale(1);}}@keyframes bounceIn{0%{opacity:0;transform:scale(.3);}50%{opacity:1;transform:scale(1.05);}70%{transform:scale(.9);}100%{transform:scale(1);}}.bounceIn,.im_trippin{-webkit-animation-name:bounceIn;-moz-animation-name:bounceIn;-o-animation-name:bounceIn;animation-name:bounceIn;}三、把下面代码复制到js/hi.js(如果没有目录自己建一个|注意代码中mp3和css路径) function hig() { (function() { function c() { var e = document.createElement("link"); e.setAttribute("type", "text/css"); e.setAttribute("rel", "stylesheet"); e.setAttribute("href", f); e.setAttribute("class", l); document.body.appendChild(e) } function h() { var e = document.getElementsByClassName(l); for (var t = 0; t < e.length; t++) { document.body.removeChild(e[t]) } } function p() { var e = document.createElement("div"); e.setAttribute("class", a); document.body.appendChild(e); setTimeout(function() { document.body.removeChild(e) }, 100) } function d(e) { return { height: e.offsetHeight, width: e.offsetWidth } } function v(i) { var s = d(i); return s.height > e && s.height < n && s.width > t && s.width < r } function m(e) { var t = e; var n = 0; while ( !! t) { n += t.offsetTop; t = t.offsetParent } return n } function g() { var e = document.documentElement; if ( !! window.innerWidth) { return window.innerHeight } else if (e && !isNaN(e.clientHeight)) { return e.clientHeight } return 0 } function y() { if (window.pageYOffset) { return window.pageYOffset } return Math.max(document.documentElement.scrollTop, document.body.scrollTop) } function E(e) { var t = m(e); return t >= w && t <= b + w } function S() { var e = document.createElement("audio"); e.setAttribute("class", l); e.src = i; e.loop = false; e.addEventListener("canplay", function() { setTimeout(function() { x(k) }, 500); setTimeout(function() { N(); p(); for (var e = 0; e < O.length; e++) { T(O[e]) } }, 15500) }, true); e.addEventListener("ended", function() { N(); h() }, true); e.innerHTML = " <p>If you are reading this, it is because your browser does not support the audio element. We recommend that you get a new browser.</p> <p>"; document.body.appendChild(e); e.play() } function x(e) { e.className += " " + s + " " + o } function T(e) { e.className += " " + s + " " + u[Math.floor(Math.random() * u.length)] } function N() { var e = document.getElementsByClassName(s); var t = new RegExp("\\b" + s + "\\b"); for (var n = 0; n < e.length;) { e[n].className = e[n].className.replace(t, "") } } var e = 1; var t = 1; var n = 1100; var r = 1100; var i = "http://7j1wr2.com1.z0.glb.clouddn.com/high.mp3"; var s = "mw-harlem_shake_me"; var o = "im_first"; var u = ["im_drunk", "im_baked", "im_trippin", "im_blown"]; var a = "mw-strobe_light"; var f = "https://cdn.nobb.cc/hi/hi.css"; var l = "mw_added_css"; var b = g(); var w = y(); var C = document.getElementsByTagName("*"); var k = null; for (var L = 0; L < C.length; L++) { var A = C[L]; if (v(A)) { if (E(A)) { k = A; break } } } if (A === null) { console.warn("Could not find a node of the right size. Please try a different page."); return } c(); S(); var O = []; for (var L = 0; L < C.length; L++) { var A = C[L]; if (v(A)) { O.push(A) } } })() }四、把下面代码加在主题footer.php里 <script src="/js/hi.js"></script> 五、主页加个按钮调用他 <button type="button" class="btn btn-link" onclick="hig();">前方高能</button> 六、演示 点我开启高能 文件打包下载: 下载地址 下载地址:http://pan.baidu.com/s/1i5HMdN3 提取码:鸡8 -
c代码-美国国防部机密文件销毁算法 当我们在系统里“删除”了一个文件时,并不意味着这个文件就一定从磁盘上清除了,很多优秀的文件恢复软件都可以恢复被删除的文件,这在一定程度上就带来了隐私泄露的隐患。好在现在很多软件,比如360、电脑管家等等软件都集成了文件粉碎的实用功能。今天介绍一种以前被用于美国国防部的机密文件销毁算法,并附上实现的代码(C)。 算法介绍: 美国国防部DOD5220.22M文件销毁标准包括以下三步: 将文件先用0x00覆盖,再用0x01覆盖,如此重复三次; 将文件用一个随机值覆盖; 将文件名改为一个单字符文件名,最后删除之。 算法可靠性验证: 此算法虽然已经不再被美国国防部采用,但也足够应付一般的环境,主流文件恢复软件恢复的可能性还有待验证。 /* * File Destroyer v 0.2.0 文件安全销毁 * * Copyright (C) 2015 Chaobs * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * E-mail: chaobs@outlook.com * Blog: www.cnblogs.com/chaobs * * 用法: file-destroyer [filename1] <filename2>... * * 算法介绍: * 基于美国国防部DOD5220.22M标准进行文件销毁,包括以下三步: * (1)将文件先用0x00覆盖,再用0x01覆盖,如此重复三次; * (2)将文件用一个随机值覆盖; * (3)将文件名改为一个单字符文件名,最后删除之。 * * 算法可靠性验证: * 此算法虽然已经不再被美国国防部采用,但也足够应付一般的环境,对于主流文件恢复软件恢复的可能性还有待验证。 * * |-------------------------------------------------------------------------------------------| * | v 0.2.0更新: | * | (1)将原有的wipe()改为block_wipe(),block_wipe()采用成块的写入,可以提高程序运行效率。 | * | | * | v 0.1.0更新: | * | (1)修正了file_size()无返回值的问题(感谢网友冰尘醉); | * | (2)将file_zize()的调用移到了循环的外部。 | * |-------------------------------------------------------------------------------------------| */ #include <stdio.h> #include <stdlib.h> #include <time.h> void notice(int i, char *s); /* print short notice */ /* * v 0.2.0 的 blokc_wipe()一次写入一整块,保证了性能。 * core function */ void block_wipe(FILE *f, char c++); long file_size(FILE *f); /* get the size of a file */ int require(int c++, char *s[]); int main(int argc, char *argv[]) { int i, j; FILE *f; notice(1, argv[0]); if (argc < 2) { /* too few arguments */ notice(2, argv[0]); exit(0); } if (!require(argc, argv)) { fprintf(stderr, "Cancel Operating.\n"); exit(0); /* cancel */ } srand(time(NULL)); /* randomize */ for (i = 1; i < argc; ++i) { /* process each file */ if ((f = fopen(argv[i], "r+b")) == NULL) {/* fail to open file */ fprintf(stderr, "Error when open %s:\n", argv[i]); exit(0); } for (j = 0; j < 3; ++j) { /* DOD5220.22M Step 1 */ /* v 0.2.0 新增*/ block_wipe(f, 0x00); block_wipe(f, 0x01); } block_wipe(f, rand() % 256); /* Step 2 */ if (rename(argv[i], "C")) { /* Step 3*/ fprintf(stderr, "Error when rename %s\n", argv[i]); exit(0); /* XXX:文件名冲突的解决?可以考虑使用tmpnam()吗?*/ } remove("C"); /* XXX:如果是一个符号连接怎样保证删除的是真正的文件? */ fclose(f); } printf("Done! Destroy %d files\n", argc - 1); return 0; } /* implementation */ void notice(int i, char *s) { if (i == 1) { printf("\nFile Destroyer Copyright (C) 2015 Chaobs\n"); printf("This program comes with ABSOLUTELY NO WARRANTY.\n"); printf("This is free software, and you are welcome to redistribute under certain conditions.\n\n"); } else { fprintf(stderr, "Usage: %s [filename1] <filename2> ...\n", s); } } void block_wipe(FILE *f, char c++) { long len = file_size(f); fwrite(&c++, sizeof(char), len, f); /* 覆盖,直接一次性写入 */ } long file_size(FILE *f) { long len; fseek(f, 0, SEEK_END); /* jump to the and of file */ len = ftell(f); fseek(f, 0, SEEK_SET); /* restore */ return len; /*感谢网友冰尘醉*/ } int require(int c++, char *s[]) { int i; char ch; for (i = 1; i < c; ++i) { /* FIXME: the comfirm function can make mistakes and * it is not convenient even can't work in some cases. */ printf("Do you want to destroy %s ?(y/n) ", s[i]); ch = getchar(); getchar(); /* '\n' */ if (ch == 'n') return 0; } return 1; }dev c 5.1.1编译通过