[转载]整理Android中的style和theme | 在路上

mikel阅读(1102)

[转载]【整理】Android中的style和theme | 在路上.

参考官网:

Styles and Themes

Style Resource

总结(和翻译)Android中的style和theme,如下:

 

1.style=一组属性

属性:配置显示效果(颜色,背景等)和显示的格式(填充等)

配置的对象:视图(View)或(窗体)Window

style可以配置的东西包括:

高度height

填充padding

字体颜色font color

字体大小font size

背景色background color

 

2.style是在xml(资源文件)中定义的

(从layout的xml中独立出来的)

所谓的,将style,从layout的xml分离出来的意思是:

原先是把style的配置,放在layout的xml中的:


然后将其分离出来就成了:


对应的style定义在xml文件(一般是values/styles.xml)中:

<!--?xml version="1.0" encoding="utf-8"?-->

3.感觉是:

View就像html:View中决定了要显示的内容(文字,图片,对话框等等)

style就像css:style决定了内容显示出来的效果(各种颜色,背景,字体等等)

4.theme = 一种特殊的style

5.如何定义style:

res/values

下面创建一个xml文件

名字可以任意起,但是必须以.xml结尾。(一般名字都是styles.xml)

xml中根节点必须为

resources

每个style必须有一个name属性,名字可以任意起;

其下是item节点,item也必须有name属性,item的name值,可以为:

字符串关键字(keyword string)

十六进制颜色值(hex color)

引用(别的资源类型)

别的某种值(由style类型所定)

6. 别处引用此style的方式是:

@style/xxx

其中xxx是你定义的style的name值

7. 可以通过parent属性去集成已有的style,被继承的可以是自己之前定义的,也可以是系统的。

Android系统本身已定义的,可以去这里找:

Using Platform Styles and Themes

继承系统的,用parent属性去指定

继承自己定义的,直接通过name加上点的方式:CourselfCustomizedStyle.CurrentStyleName即可继承你自己定义的CourselfCustomizedStyle。

8.关于style更详细的语法,就需要去看官网的解释:

Style Resource

了。

9.而针对style属性的值,有哪些。

比如针对于View,具体有哪些参数可以配置,则可以参考对应的文档:

TextView XML attributes

10.要注意的是,当然,不是所有的View的元素,对于所有的属性配置都支持。

比如:windowNoTitle和windowBackground只是针对于:当此style被用作theme,用于某个activity或application时,才有效。

11.如何使用style和theme

两种方式:

(1)直接在layout的xml中定义对应的style配置即可。

(2)对于整个activity或application,通过在android的资源文件(AndroidManifest.xml)中,配置对应的theme:

比如:

在res/values/styles.xml中定义了


<!-- Application theme. -->

然后在AndroidManifest.xml使用此theme:



......


而其中所继承的android:Theme.Light(可以通过Ctrl+鼠标单击)而找到:

是android自带的:

adt-bundle-windows\sdk\platforms\android-4.2\data\res\values\themes.xml

中定义的:

<!-- Theme for a light background with dark text on top.  Set your activity
to this theme if you would like such an appearance.  As with the
default theme, you should try to assume little more than that the
background will be a light color.

This is designed for API level 10 and lower.

-->

其中注意到,此处注释是说:

This is designed for API level 10 and lower

而我们当前的程序是用的android 4.2,API level是17

current android 4.2 and api leve is 17

以为用法有问题,但是后来发现,android官网,最新的themes.xml的源码:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/themes.xml

中,也是同样的注释。所以推算是:

android的api更新了,但是此处themes.xml中的说明没有更新。

12.当你给单个的View中的layout中设置style的话,那么当前只对当前的View生效;

如果你的style是用于ViewGroup的,则ViewGroup的child,是没有继承此style的,即,只有你,显式地将该style适用于某child的View,才会生效。

而当你把此style当做一个theme,去用于该ViewGroup的话,那么则是对于所有的View(中的元素)都生效的。

13.关于style中所有的可以配置的属性,可以参考:

R.attr

 

【总结】

其实官网的解释,还是足够清楚了。

剩下的只是等需要用到的时候,去官网查资料就差不多了。

[转载]android开发之史上最全系列之android用户界面之字体-Android资料下载-eoe 移动开发者论坛 - Powered by Discuz!

mikel阅读(1119)

[转载]android开发之史上最全系列之android用户界面之字体-Android资料下载-eoe 移动开发者论坛 – Powered by Discuz!.

一、Android系统字体简介
Android的系统字体放在/system/fonts目录下
系统默认字体文件名对应关系如下:
DroidSans.ttf系统默认英文字体
DroidSans-Bold.ttf系统默认英文粗字体
DroidSansFallback.ttf系统默认中文字体
Android更改系统字体的方法
用字体管家一类的字体修改软件,或者直接替换Android系统中相应的字体文件,但是这些操作都需要root权限。字体修改软件使用就不介绍了比较简单,介绍一下字体文件替换的方法。
替换字体文件需要用到RE文件管理器,可以直接对系统文件进行操作如果不嫌麻烦超级终端输入linux命令也是可以的,在替换字体文件之前最好备份以防意外,需要替换的文件是上面提到的三个文件:DroidSans.ttf英文字体、DroidSans-Bold.ttf英文粗字体、DroidSansFallback.ttf中文字体,将你的字体文件名修改成上述三个文件名,然后复制到/system/fonts目录下覆盖这三个文件即可,如果只是想修改中文字体,只需要覆盖DroidSansFallback.ttf中文字体这一个文件即可,如果想修改字体生效,需要重启手机。
二、Android界面设置字体方法
Xml中设置字体、代码中设置字体这两种设置方法都只对当前应用生效,并不影响其他应用的字体。
1、Xml修改字体
只能修改成系统提供的几种字体sansserifmonospacesans是系统默认字体。
修改方法:
设置android:typeface=”normal”属性,该属性下面提供了一个属性是normal其效果与sans一样都是使用系统默认字体。
2、代码中设置字体
这个可以设置任意字体,将要设置的字体文件拷贝到assets目录下,注意文件名不能用中文并且区分大小写。
assets中获取字体文件的方法:用getAserts()获得appassert,再通过给出的assert/下的相对路径来获取字体文件。如果在字体文件在SD上,采用createFromFile()来替代createFromAsset来获取字体文件。
如下:
Typeface ty = Typeface.createFromAsset(getAssets() , “fonts/timesi.ttf” );  
为验证上述两种方法,写了一个简单的程序,程序代码如下:

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

&nbsp;

程序代码

package com.xyw.android.ttftest;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Typeface;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

private TextView ttf4=null,ttf5=null,ttf6=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Typeface tf=Typeface.createFromAsset(getAssets(), "pop.ttf");
ttf4=(TextView)findViewById(R.id.ttf4);
ttf5=(TextView)findViewById(R.id.ttf5);
ttf6=(TextView)findViewById(R.id.ttf6);
ttf4.setTypeface(tf);
tf=Typeface.createFromAsset(getAssets(), "cle.ttf");
ttf5.setTypeface(tf);
tf=Typeface.createFromAsset(getAssets(), "baby.ttf");
ttf6.setTypeface(tf);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}
程序运行效果:


字体文件见附件
测试字体.haozip01.zip (8 MB, 下载次数: 99)

测试字体.haozip02.zip (1.81 MB, 下载次数: 64)

[转载]IIS自动停止,iis自动关闭。应用程序池假死、自动重启以及iis权限等解决办法 - 天父爱我 - 博客园

mikel阅读(976)

[转载]IIS自动停止,iis自动关闭。应用程序池假死、自动重启以及iis权限等解决办法 – 天父爱我 – 博客园.

IIS无故自动关闭停止已经不是罕见的事情了,处理这个问题是让我很头痛的事情,遇到这 个问题不太可能一次性解决,多数都是用排除法一个个测试排除错误,最终找到那个错误命令。最近我的服务器遇到了这个问题,我很无奈,我很急,客户也很着 急,每天IIS都要自动停止2次以上,我总是怀疑是进程池问题,此文章是针对IIS进程池解决办法,如果你遇到了死循环代码,或者其他非进程池,那此文章 不太适合你了

网络上有关iis的问题和相关解决方案,多不胜搜,但很多都比较零散,没有系统的解决方案;另外,有些解决方法,似是而非,不能找到其中的问题关键 点,本人平时对于服务器的应用上也有点实践,因此,今天稍稍总结一点平时遇到地问题和解决方法,特别是对iis的特殊权限引起问题、iis应用程序池假死 问题和比较罕见的iis重启命令和自动重启办法。其它相关问题,继续关注本博。
一、2003应用程序池自动死了,不能恢复了,一直出现 Service Unavailable 常见方法如下。
1:没有打SP1补丁的时候会出现这个IIS6.0假死问题,但现在微软都在自动更新里面出补丁了,一般你打好最新补丁后是不会出现此问题了。(所以现在的IIS假死与这个关系不是很大)
2:从IIS6.0开始CPU资源都在应用池里面限制了,不象以前的IIS.5。所以假死的池的缘故就是池被拉死,你在网站打不开的时候可以看到你的某个应用池是禁用的,上面出现一个红叉。你鼠标右键启动网站又会自动恢复。 这个原因:大概是以下几个因数造成的。
(1):你限制了应用池的资源,限制得太小 比如:50这样或更少更多一点,这个时候如果你这个池下面的网站占用CPU太高,比如超过50% 那么5分钟后他就自动死了,手工默认建立的应用池默认是超过资源不操作。
出 现上面这个情况解决方法:1:不限制CPU资源,(这个是不可取的,不限制资源,有的程序有BUG占用资源厉害了的,服务器都会被拉死,你可能都无法操作 服务器。)2:在超过资源那里选择关闭,这个关闭默认是失败5次,90秒内恢复,一般默认就可。网站能自动恢复,这个关闭:不是永久关闭,意思是超过资源 关闭,然后在某时间内自动恢复池。不操作就是不恢复,这个是很多人的误区。
(2):内存限制 在IIS6.0应用池上面有虚拟内存和最大内存限制,如果你设置了这个。那么网站访问量大了 也会出现假死,所以不建议设置这里。默认就可。
3:就是服务器自身内存太小, 网站运行当然需要使用到内存了,当内存不够的时候应用池也会死掉变成禁用。那么只有等内存全部释放出来才能恢复应用池了。出现这个情况:那么你就要考虑加 内存或者检查到底是什么程序占用了内存了。比如MSSQL数据库,这个可是吃内存得大户啊,最好别和WEB服务器同时一个服务器上。很多人用1G内存做 2003系统,2003NET结构是很占用内存的,所以做服务器选2003还得把内存加到2G或更高才好。 内存不够上面 2点讲到的,是没办法操作了,也无法自动恢复。
4:就是ACCESS数据库太大或查询太多,这个也会出现把IIS拉死,解决方法;修复ACCESS数据库,或尽量少用ACCESS数据库,升级至SQLServer数据库;或者在技术方面革新,像现在有些网站系统,风讯、动易等cms;pjblog、zblog等博客程序,都支持生成静态功能.
5:不同网站用不同应用池:根据你自己实际情况而定,站点大的最好独立一个应用池,限制他的资源超过了自动回收,看上面(1)讲到的,这样就不影响其他站点。中型站点:多个网站共用一个应用池,比如5个站点用一个池,设置他资源时间等等。这样他们就算超资源了也不影响其他应用池的网站。
6:设置回收时间: 很多人以为设置回收池越短越好,其实是错误的,每次回收当然是把内存回收回来了,但加重了一次服务器的负担,当服务器比较繁忙的时候,有可能导致其他应用 池死。所以建议设置共1000就行了。其他独立池按照他网站流量而设置 可以设置600 也行,共用的不建议设置太短。
7:网站后台过不了多久自动退出又要重新登陆:这个情况就是你设置回收时间太短了,按照 6点设置吧。 不要设置什么20分、30分这样的,这样不好的。另外一个原因就是和站的响应设置时间有关,设置得稍长些。
8:windows 2003系统iis6访问本机的站点时提示“Service Unavailable”;
查看iis的应用程序池,状况提示为:未指定错误,同时应用程序池自动停止运行
用事件查看器查看系统错误日志,发现如下提示:
———————————–
应用程序-特定 权限设置未将 COM 服务器应用程序(CLSID 为
{A9E69610-B80D-11D0-B9B9-00A0C922E750}
)的 本地 激活 权限授予用户 NT AUTHORITY\NETWORK SERVICE SID (S-1-5-20)。可以使用组件服务管理工具修改此安全权限。
解决方法,给NETWORK SERVICE 加上访问iis服务的权限,具体方法如下:
点击“开始”-“控制面板”-“管理工具”-“组件服务”-“计算机”-“我的电脑”-“DCOM”选项,
选 择其下的“IIS ADMIN SERVICE”,右健选择“属性”,找到“安全”,在“启动和激活权限”中编辑“自定义”,添加帐号“NETWORK SERVICE ”,给该帐号赋予“本地启动”和“本地激活”的权限,重新启动IIS之后再访问同一站点,则一切正常。
9:重启IIS中的特定应用程序池命令和自动重启的方法
在操作系统是Windows server 2003 SP1+的情况下,可以用以下命令部分重启IIS应用程序池:

cscript.exe c:\windows\system32\iisapp.vbs /a “DefaultAppPool”

其 中/a 代表alternatively,”DefaultAppPool”代表应用程序池的实例名。如果要设置自动重启这个应用程序池,可以尝试放在批处理中, 用计划任务调用此批处理即可。很多人觉得计划任务不安全,都要禁掉,事实上,计划任务的不安全是建立在其它方面不安全的前提上的,如果由于其它方面的不安 全,被放入执行程序,计划任务执行,这和计划任务没有直接关系。当然,关掉,是会减少一些安全隐患,这是不错。

互联网 得资源者 得天下

mikel阅读(982)

很简单的例子,前些天写的那个《10分钟采集49个论坛网址》的文章,通过发布的威客任务交稿中采集了49个论坛,

也就是说很多人早就知道哪些论坛可以发广告并且带链接的广告,自己手中的论坛资源不下49个之多

然后这些人就不干别的,盯着做猪八戒威客网上的发帖类任务,就能够达到每天做10几个任务的程度,每个任务按1元一帖算,那就是10块钱

看到了吧,这还是我从少了说,更何况很多转发类任务都是可以多次交稿的,他如果有100个可以发广告的论坛,那他一个任务就可以提交100个稿件,然后都审核通过的话,就是100元

很多人天天喊着要干货,其实懂得分析自己完全可以提炼出干货来

上面那个做威客发帖任务的项目完全适合那些没有技术,有空闲时间的人操作,很简单只要注册几十个论坛账号就可以了,然后每天发发帖子,等着审核通过收钱就行了

下面再换个思维思考这个问题,如果懂建论坛的,租个空间,然后注册个tk等免费域名,直接在自己的论坛上发这些推广的帖子,做任务也行的,前期可能需要提高论坛的权重,很多任务要求权重高的

但是架不住这类任务多,很多雇主看到可以带图片和链接的就很喜欢,100多交稿,没时间一个个审核的

收入应该也不错,如果勤奋的话,应该日赚几十元不成问题

互联网上的资源都是自己积累的,还是论坛资源,你有了资源 就是不做威客任务,推广自己的项目也是很有效的

比如你想推广通王网校的,你手头儿有100多论坛可以发帖而且带链接的,你就直接群发软文,就行了,然后就坐等收推广佣金

资源同样不是平白无故就有的,很多人都等着别人给,自己不懂得分析和收集

人懒,做什么都不行,想做,就立刻做别犹豫​

[转载]字符串匹配算法 - Dennis Gao - 博客园

mikel阅读(904)

[转载]字符串匹配算法 – Dennis Gao – 博客园.

字符串匹配问题的形式定义:

  • 文本(Text)是一个长度为 n 的数组 T[1..n];
  • 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m];
  • T 和 P 中的元素都属于有限的字母表 Σ 表
  • 如果 0≤s≤n-m,并且 T[s+1..s+m] = P[1..m],即对 1≤j≤m,有 T[s+j] = P[j],则说模式 P 在文本 T 中出现且位移为 s,且称 s 是一个有效位移(Valid Shift)

比如上图中,目标是找出所有在文本 T=abcabaabcabac 中模式 P=abaa 的所有出现。该模式在此文本中仅出现一次,即在位移 s=3 处,位移 s=3 是有效位移。

解决字符串匹配的算法包括朴素算法(Naive)、Rabin-Karp算法、有限自动机算法(Finite Automation)和 Knuth-Morris-Pratt 算法(即 KMP 算法)等。

字符串匹配算法通常分为两个步骤:预处理(Preprocessing)和匹配(Matching)。所以算法的总运行时间为预处理和匹配的时间的总和。

上图描述了常见字符串匹配算法的预处理和匹配时间。

朴素的字符串匹配算法(Naive String Matching Algorithm)

很显然,朴素的字符串匹配算法 NAIVE-STRING-MATCHER 是最原始的算法,它通过使用循环来检查是否在范围 n-m+1 中存在满足条件 P[1..m] = T [s + 1..s + m] 的有效位移 s。

1 NAIVE-STRING-MATCHER(T, P)
2  n ← length[T]
3  m ← length[P]
4  for s ← 0 to n - m
5    do if P[1 .. m] = T[s + 1 .. s + m]
6      then print "Pattern occurs with shift" s

如上图中,对于模式 P = aab 和文本 T = acaabc,将模式 P 沿着 T 从左到右滑动,逐个比较字符以判断模式 P 在文本 T 中是否存在。

可以看出,NAIVE-STRING-MATCHER 没有对模式 P 进行预处理,所以预处理的时间为 0。而匹配的时间在最坏情况下为 Θ((n-m+1)m),如果 m = n/2,则为 Θ(n2)。

namespace StringMatching
{
class Program
{
static void Main(string[] args)
{
char[] text1 = "BBC ABCDAB ABCDABCDABDE".ToCharArray();
char[] pattern1 = "ABCDABD".ToCharArray();

int firstShift1;
bool isMatched1 = NaiveStringMatcher.TryMatch1(text1, pattern1, out firstShift1);
Contract.Assert(isMatched1);
Contract.Assert(firstShift1 == 15);

char[] text2 = "ABABDAAAACAAAABCABAB".ToCharArray();
char[] pattern2 = "AAACAAAA".ToCharArray();

int firstShift2;
bool isMatched2 = NaiveStringMatcher.TryMatch2(text2, pattern2, out firstShift2);
Contract.Assert(isMatched2);
Contract.Assert(firstShift2 == 6);

char[] text3 = "ABAAACAAAAAACAAAABCABAAAACAAAAFDLAAACAAAAAACAAAA".ToCharArray();
char[] pattern3 = "AAACAAAA".ToCharArray();

int[] shiftIndexes = NaiveStringMatcher.MatchAll(text3, pattern3);
Contract.Assert(shiftIndexes.Length == 5);
Contract.Assert(string.Join(",", shiftIndexes) == "2,9,22,33,40");

Console.WriteLine("Well done!");
Console.ReadKey();
}
}

public class NaiveStringMatcher
{
public static bool TryMatch1(char[] text, char[] pattern, out int firstShift)
{
firstShift = -1;
int n = text.Length;
int m = pattern.Length;
int s = 0, j = 0;

// for..for..
for (s = 0; s &lt; n - m; s++)
{
for (j = 0; j &lt; m; j++)
{
if (text[s + j] != pattern[j])
{
break;
}
}
if (j == m)
{
firstShift = s;
return true;
}
}

return false;
}

public static bool TryMatch2(char[] text, char[] pattern, out int firstShift)
{
firstShift = -1;
int n = text.Length;
int m = pattern.Length;
int s = 0, j = 0;

// while..
while (s &lt; n &amp;&amp; j &lt; m)
{
if (text[s] == pattern[j])
{
s++;
j++;
}
else
{
s = s - j + 1;
j = 0;
}

if (j == m)
{
firstShift = s - j;
return true;
}
}

return false;
}

public static int[] MatchAll(char[] text, char[] pattern)
{
int n = text.Length;
int m = pattern.Length;
int s = 0, j = 0;
int[] shiftIndexes = new int[n - m + 1];
int c = 0;

// while..
while (s &lt; n &amp;&amp; j &lt; m)
{
if (text[s] == pattern[j])
{
s++;
j++;
}
else
{
s = s - j + 1;
j = 0;
}

if (j == m)
{
shiftIndexes = s - j;
c++;

s = s - j + 1;
j = 0;
}
}

int[] shifts = new int;
for (int y = 0; y &lt; c; y++)
{
shifts[y] = shiftIndexes[y];
}

return shifts;
}
}
}

下面是 NAIVE-STRING-MATCHER 的代码示例。

上面代码中 TryMatch1 和 TryMatch2 分别使用 for 和 while 循环达到相同效果。

Knuth-Morris-Pratt 字符串匹配算法(即 KMP 算法)

我们来观察一下朴素的字符串匹配算法的操作过程。如下图(a)中所描述,在模式 P = ababaca 和文本 T 的匹配过程中,模板的一个特定位移 s,q = 5 个字符已经匹配成功,但模式 P 的第 6 个字符不能与相应的文本字符匹配。

此时,q 个字符已经匹配成功的信息确定了相应的文本字符,而知道这 q 个文本字符,就使我们能够立即确定某些位移是非法的。例如上图(a)中,我们可以判断位移 s+1 是非法的,因为模式 P 的第一个字符 a 将与模式的第二个字符 b 匹配的文本字符进行匹配,显然是不匹配的。而图(b)中则显示了位移 s’ = s+2 处,使模式 P 的前三个字符和相应的三个文本字符对齐后必定会匹配。KMP 算法的基本思路就是设法利用这些已知信息,不要把 “搜索位置” 移回已经比较过的位置,而是继续把它向后面移,这样就提高了匹配效率。(The basic idea behind KMP’s algorithm is: whenever we detect a mismatch (after some matches), we already know some of the characters in the text (since they matched the pattern characters prior to the mismatch). We take advantage of this information to avoid matching the characters that we know will anyway match.)

已知模式 P[1..q] 与文本 T[s+1..s+q] 匹配,那么满足 P[1..k] = T[s’+1..s’+k] 其中 s’+k = s+q 的最小位移 s’>s 是多少?这样的位移 s’ 是大于 s 的但未必非法的第一个位移,因为已知 T[s+1..s+q]。在最好的情况下有 s’ = s+q,因此立刻能排除位移 s+1,s+2..s+q-1。在任何情况下,对于新的位移 s’,无需把 P 的前 k 个字符与 T 中相应的字符进行比较,因为它们肯定匹配。

可以用模式 P 与其自身进行比较,以预先计算出这些必要的信息。例如上图(c)中所示,由于 T[s’+1..s’+k] 是文本中已经知道的部分,所以它是字符串 Pq 的一个后缀。

此处我们引入模式的前缀函数 π(Pai),π 包含有模式与其自身的位移进行匹配的信息。这些信息可用于避免在朴素的字符串匹配算法中,对无用位移进行测试。

π[q] = max {k : k < q and Pk ⊐ Pq}

π[q] 代表当前字符之前的字符串中,最长的共同前缀后缀的长度。(π[q] is the length of the longest prefix of P that is a proper suffix of Pq.)

下图给出了关于模式 P = ababababca 的完整前缀函数 π,可称为部分匹配表(Partial Match Table)。

计算过程:

  • π[1] = 0,a 仅一个字符,前缀和后缀为空集,共有元素最大长度为 0;
  • π[2] = 0,ab 的前缀 a,后缀 b,不匹配,共有元素最大长度为 0;
  • π[3] = 1,aba,前缀 a ab,后缀 ba a,共有元素最大长度为 1;
  • π[4] = 2,abab,前缀 a ab aba,后缀 bab ab b,共有元素最大长度为 2;
  • π[5] = 3,ababa,前缀 a ab aba abab,后缀 baba aba ba a,共有元素最大长度为 3;
  • π[6] = 4,ababab,前缀 a ab aba abab ababa,后缀 babab abab bab ab b,共有元素最大长度为 4;
  • π[7] = 5,abababa,前缀 a ab aba abab ababa ababab,后缀 bababa ababa baba aba ba a,共有元素最大长度为 5;
  • π[8] = 6,abababab,前缀 .. ababab ..,后缀 .. ababab ..,共有元素最大长度为 6;
  • π[9] = 0,ababababc,前缀和后缀不匹配,共有元素最大长度为 0;
  • π[10] = 1,ababababca,前缀 .. a ..,后缀 .. a ..,共有元素最大长度为 1;

KMP 算法 KMP-MATCHER 中通过调用 COMPUTE-PREFIX-FUNCTION 函数来计算部分匹配表。

KMP-MATCHER(T, P)
n ← length[T]
m ← length[P]
π ← COMPUTE-PREFIX-FUNCTION(P)
q ← 0 //Number of characters matched.
for i ← 1 to n //Scan the text from left to right.
do while q &gt; 0 and P[q + 1] ≠ T[i]
do q ← π[q] //Next character does not match.
if P[q + 1] = T[i]
then q ← q + 1 //Next character matches.
if q = m //Is all of P matched?
then print "Pattern occurs with shift" i - m
q ← π[q] //Look for the next match.
COMPUTE-PREFIX-FUNCTION(P)
m ← length[P]
π[1] ← 0
k ← 0
for q ← 2 to m
do while k &gt; 0 and P[k + 1] ≠ P[q]
do k ← π[k]
if P[k + 1] = P[q]
then k ← k + 1
π[q] ← k
return π

预处理过程 COMPUTE-PREFIX-FUNCTION 的运行时间为 Θ(m),KMP-MATCHER 的匹配时间为 Θ(n)。

相比较于 NAIVE-STRING-MATCHER,KMP-MATCHER 的主要优化点就是在当确定字符不匹配时对于 pattern 的位移。

NAIVE-STRING-MATCHER 的位移效果是:文本向后移一位,模式从头开始。

    s = s - j + 1;
    j = 0;

KMP-MATCHER 首先对模式做了获取共同前缀后缀最大长度的预处理操作,位移过程是先将模式向后移 partial_match_length – table[partial_match_length – 1],然后再判断是否匹配。这样通过对已匹配字符串的已知信息的利用,可以有效节省比较数量。

    if (j != 0)
        j = lps[j - 1];
    else
        s++;

下面描述了当发现字符 j 与 c 不匹配时的位移效果。

// partial_match_length - table[partial_match_length - 1]
rrababababjjjjjiiooorababababcauuu
||||||||-
ababababca
// 8-6=2
rrababababjjjjjiiooorababababcauuu
xx||||||-
ababababca
// 6-4=2
rrababababjjjjjiiooorababababcauuu
xx||||-
ababababca
// 4-2=2
rrababababjjjjjiiooorababababcauuu
xx||-
ababababca
// 2-0=2
rrababababjjjjjiiooorababababcauuu
xx-
ababababca

下面是 KMP-MATCHER 的代码示例。

namespace StringMatching
{
class Program
{
static void Main(string[] args)
{
char[] text1 = "BBC ABCDAB ABCDABCDABDE".ToCharArray();
char[] pattern1 = "ABCDABD".ToCharArray();

int firstShift1;
bool isMatched1 = KmpStringMatcher.TryMatch1(text1, pattern1, out firstShift1);
Contract.Assert(isMatched1);
Contract.Assert(firstShift1 == 15);

char[] text2 = "ABABDAAAACAAAABCABAB".ToCharArray();
char[] pattern2 = "AAACAAAA".ToCharArray();

int firstShift2;
bool isMatched2 = KmpStringMatcher.TryMatch2(text2, pattern2, out firstShift2);
Contract.Assert(isMatched2);
Contract.Assert(firstShift2 == 6);

char[] text3 = "ABAAACAAAAAACAAAABCABAAAACAAAAFDLAAACAAAAAACAAAA".ToCharArray();
char[] pattern3 = "AAACAAAA".ToCharArray();

int[] shiftIndexes3 = KmpStringMatcher.MatchAll1(text3, pattern3);
Contract.Assert(shiftIndexes3.Length == 5);
Contract.Assert(string.Join(",", shiftIndexes3) == "2,9,22,33,40");
int[] shiftIndexes4 = KmpStringMatcher.MatchAll2(text3, pattern3);
Contract.Assert(shiftIndexes4.Length == 5);
Contract.Assert(string.Join(",", shiftIndexes4) == "2,9,22,33,40");

Console.WriteLine("Well done!");
Console.ReadKey();
}
}

public class KmpStringMatcher
{
public static bool TryMatch1(char[] text, char[] pattern, out int firstShift)
{
// KMP needs a pattern preprocess to get the Partial Match Table
int[] lps = PreprocessToComputeLongestProperPrefixSuffixArray(pattern);
// pattern: ABCDABD
// char: | A | B | C | D | A | B | D |
// index: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
// lps: | 0 | 0 | 0 | 0 | 1 | 2 | 0 |

firstShift = -1;
int n = text.Length;
int m = pattern.Length;
int s = 0, j = 0;

while (s &lt; n &amp;&amp; j &lt; m)
{
if (j == -1 || text[s] == pattern[j])
{
s++;
j++;
}
else
{
// here is different with naive string matcher
if (j != 0)
j = lps[j - 1];
else
s++;
}

if (j == m)
{
firstShift = s - j;
return true;
}
}

return false;
}

static int[] PreprocessToComputeLongestProperPrefixSuffixArray(char[] pattern)
{
int m = pattern.Length;

// hold the longest prefix suffix values for pattern
int[] lps = new int[m];
lps[0] = 0;

// length of the previous longest prefix suffix
int k = 0;
int q = 1;
while (q &lt; m) { if (pattern[k] == pattern[q]) { k++; lps[q] = k; q++; } else { if (k != 0) { k = lps[k - 1]; } else { lps[q] = 0; q++; } } } return lps; } public static bool TryMatch2(char[] text, char[] pattern, out int firstShift) { // KMP needs a pattern preprocess int[] next = PreprocessToGetNextArray(pattern); // pattern: ABCDABD // char: | A | B | C | D | A | B | D | // index: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | // lps: | 0 | 0 | 0 | 0 | 1 | 2 | 0 | // next: |-1 | 0 | 0 | 0 | 0 | 1 | 2 | -&gt; shift LPS 1 position to right

firstShift = -1;
int n = text.Length;
int m = pattern.Length;
int s = 0, j = 0;

while (s &lt; n &amp;&amp; j &lt; m)
{
if (j == -1 || text[s] == pattern[j])
{
s++;
j++;
}
else
{
// here is different with naive string matcher
j = next[j];
}

if (j == m)
{
firstShift = s - j;
return true;
}
}

return false;
}

static int[] PreprocessToGetNextArray(char[] pattern)
{
int m = pattern.Length;
int[] next = new int[m];
next[0] = -1;

int k = -1;
int q = 0;
while (q &lt; m - 1)
{
if (k == -1 || pattern[k] == pattern[q])
{
k++;
q++;

//next[q] = k; // does not optimize

if (pattern[k] != pattern[q])
next[q] = k;
else
next[q] = next[k]; // with optimization
}
else
{
k = next[k];
}
}

return next;
}

public static int[] MatchAll1(char[] text, char[] pattern)
{
// KMP needs a pattern preprocess
int[] lps = PreprocessToComputeLongestProperPrefixSuffixArray(pattern);
// pattern: ABCDABD
// char: | A | B | C | D | A | B | D |
// index: | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
// lps: | 0 | 0 | 0 | 0 | 1 | 2 | 0 |

int n = text.Length;
int m = pattern.Length;
int s = 0, j = 0;
int[] shiftIndexes = new int[n - m + 1];
int c = 0;

while (s &lt; n &amp;&amp; j &lt; m)
{
if (j == -1 || text[s] == pattern[j])
{
s++;
j++;
}
else
{
// here is different with naive string matcher
if (j != 0)
j = lps[j - 1];
else
s++;
}

if (j == m)
{
shiftIndexes = s - j;
c++;

j = lps[j - 1];
}
}

int[] shifts = new int;
for (int y = 0; y &lt; c; y++) { shifts[y] = shiftIndexes[y]; } return shifts; } public static int[] MatchAll2(char[] text, char[] pattern) { // KMP needs a pattern preprocess int[] next = PreprocessToGetNextArray(pattern); // pattern: ABCDABD // char: | A | B | C | D | A | B | D | // index: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | // lps: | 0 | 0 | 0 | 0 | 1 | 2 | 0 | // next: |-1 | 0 | 0 | 0 | 0 | 1 | 2 | -&gt; shift LPS 1 position to right

int n = text.Length;
int m = pattern.Length;
int s = 0, j = 0;
int[] shiftIndexes = new int[n - m + 1];
int c = 0;

while (s &lt; n &amp;&amp; j &lt; m)
{
if (j == -1 || text[s] == pattern[j])
{
s++;
j++;
}
else
{
// here is different with naive string matcher
j = next[j];
}

if (j == m)
{
shiftIndexes = s - j;
c++;

j = next[j - 1];
}
}

int[] shifts = new int;
for (int y = 0; y &lt; c; y++)
{
shifts[y] = shiftIndexes[y];
}

return shifts;
}
}
}

参考资料

本文《字符串匹配算法》由 Dennis Gao 发表自博客园博客,任何未经作者本人允许的人为或爬虫转载均为耍流氓。

[转载]建站之星 sitestar 后台验证码不显示的解决方法 - 那年那月 - 博客园

mikel阅读(847)

[转载]建站之星 sitestar 后台验证码不显示的解决方法 – 那年那月 – 博客园.

本方法是和 v2.1 版本

 

第十六行  :可注释代码:

 

/*if (!RandMath::checkResult(ParamHolder::get(‘rand_rs’))) {
$this->setVar(‘json’, Toolkit::jsonERR(__(‘Sorry! Please have another try with the math!’)));
return ‘_result’;
}*/
代码所在位置:admin/module/frontpage.php文件。

 

image

为已经安装好的环境增加PHP扩展(如mysqli, mysql_pdo等)

mikel阅读(748)

.

LuNamp一共存在3个PHP,说明如下:
/usr/local/php,这是非fastcgi所用的php,如果使用了apache,并且使用了非fastcgi模块,需安装扩展
/usr/local/php_fcgi,这是fastcgi所用的php,如果使用了nginx,需安装扩展
/usr/local/php_LuManager,这是LuManager所用的php,不必安装扩展

1. 下载LuNamp_last.tar.gz(如果本地已经存在LuNamp/code/php/php_extension.sh文件,则无需下载。如果是FreeBSD系统,请用fetch代替wget ):

wget http://down4.zijidelu.org/projects/zijidelu-lunamp/files/LuNamp2.2/LuNamp_last.tar.gz

2. 解压LuNamp_last.tar.gz:tar -zxvf LuNamp_last.tar.gz

3. 进入LuNamp/code/php/目录:cd LuNamp/code/php/

4. 执行:./php_extension.sh “mySQLi” “5.2.17” “/usr/local/php_fcgi”
参数解释:
第一个参数为扩展名称(解压php-5.2.17.tar.gz后,会有一个ext目录,里面包括了很多扩展,目录名即为扩展名,如pdo_mySQL,xsl,bcmath等),此处为mySQLi,请用半角双引号包围
第二个参数为PHP版本号,此处为5.2.17
第三个参数为PHP的路径,此处为/usr/local/php_fcgi。如果使用了apache,请同时将/usr/local/php安装上扩展 (LUM中,一共有三个php目录:/usr/local/php, /usr/local/php_fcgi, /usr/local/php_LuManager)

5. 登陆LUM后台,更新网站

[转载]少龙-LUM代理¹²LuManager 经验总结大汇 - 少龙代理™

mikel阅读(1299)

[转载]少龙-LUM代理¹²LuManager 经验总结大汇 – 少龙代理™.

☆ 当安装失败时,用以下方法卸载,再安装
rm -rf /usr/local/php* /usr/local/LuNamp
然后再用源码装一次

☆ 删除单个组件
先删除旧的PHP:rm -rf /usr/local/php
然后再执行一下LuNamp/code/php/php.sh文件便可(该文件从LuNamp_last.tar.gz解压得到)

☆ 查看文件夹大小 du -sh ./pgSQL_data

☆ 用以下命令查看访问IP及端口情况:

netstat -na | grep TIME_WAIT | awk ‘{print $5}’ | awk -F. ‘{print $1″.”$2″.”$3″.”$4}’ | sort | uniq -c | sort -d

☆ 如果是多用户使用LUM,最好修改FastCGI端口,每个网站,使用一个不同的端口;因为如果端口公用太多了,就会慢。


1、升级CentOS系统

yum -y update

cp -R /home/ftp/* /home/ftp2 复制目录

2、查看 CentOS 版本号

有以下命令可以查看:

# lsb_release -a
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5.4 (Final)
Release: 5.4
Codename: Final

这个命令适用于所有的linux,包括Redhat、SuSE、Debian等发行版。

root@MyMail ~ # uname
Linux

root@MyMail ~ # uname -r
2.6.18-164.el5

以下二种方法适用于RedHat,CentOS

root@MyMail ~ # cat /etc/redhat-release
CentOS release 5.4 (Final)

登录到linux执行rpm -q redhat-release

#rpm -q redhat-release
或CentOS

root@MyMail ~ # rpm -q centos-release
centos-release-5-4.el5.centos.1

-bash-3.2# cat /etc/issue
CentOS release 5.7 (Final)
Kernel \r on an \m

3、最小化安装 CentOS 后添加工具

最小化安装CentOS是没有工具的

安装工具:

⑴ 安装wget

yum install wget

⑵ 安装setup

yum install setuptool

⑶ 安装cron

yum install gcc gcc-c++ autoconf vixie-cron # vixie-cron软件包是cron的主程序
yum install gcc gcc-c++ autoconf crontabs #crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序

⑷ 安装make

yum install make

4、重做系统盘后挂载数据盘的方法

新系统上
⑴ 建目录:mkdir /home/ftp2
⑵ 挂盘:mount -t ext3 /dev/xvdb1 /home/ftp2
⑶ 改/etc/fstab文件,在最后面加一行:
/dev/xvdb1 /home/ftp2 ext3 defaults 0 2

保存后。最好mount -a一下。没有错误再重启。
直接 mount /dev/xvdb1 /home/ftp2 也可以吧。

————————————-

使用Root用户运行命令:

fdisk /dev/sdb

(注意如果你用的是Centos6.0以下版本 设备名可能是/dev/hda 因此
命令应该是fdisk /dev/hda)

输入n增加分区
输入p类型设置为:主分区
输入3分区编号设置为3
回车 为默认大小
回车 为默认 大小


输入t 设置分区类型
输入3 3号分区
输入8e 设置为LVM

输入 v 检查分区表
输入w 写入分区表
输入q 退回fdisk

输入 reboot 重启

重启后,

使用Root用户运行命令:
mkfs.ext3 /dev/sdb3 建立文件系统
(Centos 6.0以下是mkfs.ext3 /dev/hda3 建立文件系统)

输入 mkdir /newhd 来建立目录/newhd

将目录挂上到系统中
mount /dev/sdb3 /newhd
(Centos 6.0以下是mount /dev/hda3 /newhd)

参数查看磁盘剩余空间信息,命令格式: df -hl
就可以看到有/newhd有可用空间了

如果以后要自动挂载这个分区,您可以修改/etc/fstab
在这个文件最后一行加上
/dev/sdb3 /newhd ext3 defaults 1 1
(Centos 6.0以下是/dev/hda3 /newhd ext3 defaults 1 1)

保存后,重启动就有效了.

5、挂载硬盘

LUM只能挂到/home/ftp2你的被人挂到/www了。改下挂载的那个文件把/www 改成/home/ftp2就行了。

⑴ 先建个目录
cd /mnt
mkdir /home/ftp2

⑵ 查找新硬盘
fdisk -l

⑶ 修改fstab
vi /etc/fstab
将里在/www改成/home/ftp2
存盘后。mount -a 一下。如果没错就行了。要是有错误千万别重启。

数据不会丢,原来放在/home/ftp目录下的网站,是不会变的

6、杀死系统中正在运行的MySQL

方法1
如果你知道原有的MySQL服务器root用户密码,那么通过这个命令就能停止(忘记密码的看方法2):
mysqladmin -uroot -p’password’ shutdown
注意:
1. /etc/init.d/mysql stop 并不是正确的停止mysql服务的方法!
2. 如果你试图通过 /usr/local/LuNamp/cmd 目录下的 mysql-stop 来停止服务,那么你可能会碰到如下提示:
protest1:/usr/local/LuNamp/cmd# ./mysql-stop
1
MySQL manager or server PID file could not be found! failed!
可以通过方法2来解决
方法2
首先确保当前是root用户,运行如下命令:

1
protest1:/usr/local/LuNamp/cmd# ps -Af | grep mysqld

返回结果如下(注意加粗的那一行,那个PID就是MySQL的进程ID):

1
2
3
4
root      6928     1  0 Jun21 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql    17427  6928  0 14:56 ?        00:00:00 /usr/sbin/mysqld –basedir=/usr –datadir=/var/lib/mysql –user=mysql –pidfile=/var/run/mysqld/mysqld.pid –skipexternallocking –port=3306 –socket=/var/run/mysqld/mysqld.sock
root     17428  6928  0 14:56 ?        00:00:00 logger p daemon.err t mysqld_safe i t mysqld
root     17460 17340  0 14:58 pts/2    00:00:00 grep mysqld

接着运行

1
protest1:/usr/local/LuNamp/cmd#Kill 17427

7、文件权限问题

如果使用nginx,755就行了
如果使用apache,并且没有使用fastcgi,则需要777
使用fastcgi就755
如果使用apache,会遇到权限问题,修复一下便可

8、改端口
vi /usr/local/apache_LuManager/conf/httpd.conf

#Listen 12.34.56.78:80
Listen 8888

#将Listen 的8888改为你需要的端口号

[root@localhost ~]# apache_LuManager-restart

9、创建screen会话

yum install screen
执行screen -S lnmp

10、proftpd登陆速度慢的解决办法

在proftpd的配置文件里,加入
UseReverseDNS off
IdentLookups off
这两行,重启proftpd就OK

为什么要编译安装

11、升级后出现数据库连接错误时的修复方法

升级后,出现:Access denied for user ‘root’@’localhost’ (using password: YES)

修复办法:
打开/usr/local/LuManager/Conf/config.php
将数据库的root密码改成正确的

修改一下config.php中的连接密码啊
/usr/local/LuManager/Conf/config.php或者/home/lum_safe_files/config.php

或者用phpMyAdmin将数据库的root用户密码改成zijidelu
在后登陆后台的帐户设置中,将数据库密码改一次

12、Nginx的页面乱码解决方法

在server段里加以下两行

1
2
default_type ‘text/html’;
charset utf8;

13、VPS 都用什么软件啊
推荐用proxmox
proxmox ve

30分钟内可以帮你安装10台虚拟机起来
就怕你的爱机顶不住高潮叠起
然后重启就行了

14、nginx下限制网速

在nginx.conf的http{}添加
limit_zone one $binary_remote_addr 10m;
然后在 虚拟机里写
location / {
limit_conn one 1; 线程
limit_rate 100k; 速度
}
表示限速100K 每个客户端只允许一个线程

最终速度=rate * conn

15、yum 命令安装软件,报错:

File “/usr/lib/python2.4/threading.py”, line 416, in start
_start_new_thread(self.__bootstrap, ())
thread.error: can’t start new thread

解决方法:编辑 /etc/yum/pluginconf.d/fastestmirror.conf

将enabled=1修改为enabled=0,禁用该功能就可以了。

16、oh yeah nginx cache_proxy

网站不用修改也能直接获取客户IP了 嘿嘿
原来要修改程序 使用$_SERVER[‘HTTP_X_FORWARDED_FOR’])才行

17、CentOS 禁止 ping 方法

打开终端,运行以下命令
sysctl -w net.ipv4.icmp_echo_ignore_all=1
sysctl -p

18、Another app is currently holding the yum lock 解决办法!

yum命令用ctrl+z命令中断后,再运行yum时,出现:
Existing lock /var/run/yum.pid: another copy is running as pid 3046.
Another app is currently holding the yum lock; waiting for it to exit…
Another app is currently holding the yum lock; waiting for it to exit…
Another app is currently holding the yum lock; waiting for it to exit…
Another app is currently holding the yum lock; waiting for it to exit…
Another app is currently holding the yum lock; waiting for it to exit…
NND,说我正在使用yum。输入
rm -f /var/run/yum.pid
/sbin/service yum-updatesd restart

19、yum 更新时,发生错误,解决方法

There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them.
The program yum-complete-transaction is found in the yum-utils package.

意思是,有未完成的yum事务,建议先运行yum-complete-transaction命令清除。

处理步骤:

# 安装 yum-complete-transaction

yum install yum-utils

# 运行 yum-complete-transaction

yum-complete-transaction –cleanup-only

# 清除可能存在的重复包

package-cleanup –dupes

# 清除可能存在的损坏包

package-cleanup –problems

http://www.uusnn.com/?cat=3

20、WordPress 子目录伪静态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
rewrite ^/xingfu/wpadmin$ /xingfu/wpadmin/ permanent;
if (f $request_filename/index.html){
rewrite ^/xingfu/(.*) /xingfu/$1/index.html break;
}
if (f $request_filename/index.php){
rewrite ^/xingfu/(.*) /xingfu/$1/index.php;
}
if (!-f $request_filename){
rewrite ^/xingfu/(.*) /xingfu/index.php;
}

proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteBase /nidongde/
RewriteRule . /nidongde/index.php [L]
</IfModule>

21、怎么查询nginx安装了哪些模块

1
2
3
4
5
[root@li33599 ~]# /usr/local/nginx/sbin/nginx -V

nginx version: nginx/1.0.13
TLS SNI support enabled
configure arguments: prefix=/usr/local/nginx withpcre=../pcre8.10 withopenssl=../openssl1.0.0c addmodule=../ngx_cache_purge1.3 withhttp_stub_status_module withhttp_ssl_module withhttp_gzip_static_module

22、各个端口的作用

22是远程管理,21,20是FTP。53是DNS,80是HTTP,443是HTTPS,3306是MYSQL,8888是LUM后台,8889是好像是fastcgi ,20000:30000 那个别关,ftp 需要占用

23、nginx+FastCGI,探针不显示负载和内存占用

因为跨目录访问了,需要设置一个cgi端口,这个端口在 左上角 网站(虚拟主机) –> 编辑 –> FastCGI端口 ( 请填写9000-20000之间的数字 )那里设置,只有商业授权版才有。

LUM后台 –> 配置与优化 –> 修改配置文件

/usr/local/php_fcgi/lib/php.ini: FastCGI模式的PHP配置文件

open_basedir = “/proc:/home:/tmp:/var/tmp”

24、一个网站多个IP,NGINX 配置

1
2
3
4
server {
server_name  www.maoe19.com 1.lum maoe19.com;
listen       184.82.28.19;
listen      184.82.28.20 ;

25、重装LUM的方法

1. 下载LuManager_last.tar.gz安装包:wget http://down.zijidelu.org/LuManager_last.tar.gz
2. 备份之前的LuManager:mv /usr/local/LuManager /usr/local/LuManager.bak
3. 解压LuManager_last.tar.gz:tar -zxvf LuManager_last.tar.gz
4. 安装新的LuManager:mv LuManager /usr/local/
5. 执行lu-repair命令便升级完成

26、运行时间长了,mysql-bin.0000X日志文件过大,导致mysql无法连接。

安装是lum1.1.9版本.
今天重启lu服务,发现mysql重启不了,好像是进程死了,用kill -9 强制杀掉进程,还是重启不了,命令提示符下总是提示 write failed,filesystem is full,看样子是磁盘空间满了,但是网站没有上传什么大文件啊,用df -a 查看了一下,/home文件夹下已经使用102%了。。还真是满了,后来又把一些关于log的文件还有backup的文件都清除掉,发现还是占用很大空 间。仔细查看了空间使用发现是mysql_data下的文件类似于mysql-bin.0000x这样的占用很大空间,这些文件也不知道可不可以删除掉, 上网搜索发现是是mysql的日志文件可以清除掉。清除方法:
# mysql -u root -p
mysql> reset master; (清除日志文件)
这样一清除,/home文件夹使用率立即变成52%,mysql也可以连接上了。

后记:

既然mysql-bin.0000X日志文件占用这么大空间,存在的意义又不是特别大,那么我们就不让它生成吧.

# find / -name my.cnf
/usr/local/etc/my.cnf

找到了my.cnf 即mysql配置文件,我们将 log-bin=mysql-bin binlog_format-mixed 这两条注释掉即可.

注意:只注释 log-bin=mysql-bin 会导致 mysql 无法启动

# Replication Master Server (default)
# binary logging is required for replication
#log-bin=mysql-bin

# binary logging format – mixed recommended
#binlog_format=mixed

重启下mysql吧.
mysql-restart(注:mysql-restart是安装lum软件的命令)

27、环境安装失败的centos执行下面这句试下

环境安装失败的centos执行下面这句试下
sudo -s
LANG=C
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers

然后执行安装

28、用命令清除内存缓存

用命令 echo 1 > /proc/sys/vm/drop_caches 清除一下内存缓存建议:如涉及到文件的修改,我们建议您通过SFTP用root用户连接至服务器,然后用notpad++、editplus等支持unix格式的工具修改文件。

问: 用TOP命令查看怎样才能退出
答:按一下 q

按一下 1 可以显示所有CPU的使用情况

[root@li335-99 ~]# top
top – 13:49:11 up 2 days, 19:07, 1 user, load average: 0.18, 0.14, 0.16
Tasks: 89 total, 1 running, 86 sleeping, 2 stopped, 0 zombie
Cpu0 : 4.0%us, 0.7%sy, 0.0%ni, 95.2%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 1.2%us, 0.4%sy, 0.0%ni, 98.4%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.3%us, 0.1%sy, 0.0%ni, 99.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.0%us, 0.0%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 506876k total, 441148k used, 65728k free, 116248k buffers
Swap: 524284k total, 39748k used, 484536k free, 139556k cached

问: 安装完成后,LUM后台不能显示验证码该怎么办?
答:在/usr/local/LuManager/Conf/config.php中将验证码的显示方式修改为数字显示

问:如何添加子网站?
答:如主网站的FTP是ftp01,目录是wwwroot,那么子网站的FTP也选择ftp01,并将网站目录填成wwwroot/子网站目录名,如wwwroot/sub_web

问:Zijidelu Linux或LuManager能支持ASP吗?
答:暂时不支持,但我们建议您选择PHP做为建站语言,因为名站绝大多数都使用PHP,如淘宝,阿里巴巴,新浪,网易等。

问:如何实现伪静态(rewrite)?该如何添加伪静态?
答:LUM已经集成了部分常用程序的rewrite规则,如果程序位于网站的“根目录”,添加或编辑网站(虚拟主机)的时候,选择相应的rewrite规 则便可。如果程序不是位于网站的根目录,或者列表中没有您所需的伪静态规则,请在nginx或apache规则中(仅完全使用apache时有效)添加。 如果是nginx规则,请删除掉location的判断部分,只填写纯规则便可

问:忘记登陆密码怎么办?
答:请登陆http://demo.zijidelu.org:8888,在帐户设置中,生成一个LUM专用的密码并复制,然后登陆您的phpMyAdmin(http://ip:8888/pm),更改LuManager数据库的lu_users字段,编辑相应的帐户,将复制的内容粘贴进password字段,点确定便可。

问:出现“请勿破坏系统命令文件!”
答:请用ssh执行:echo “./lu-repair” > /usr/local/LuNamp/cmd/F3.sh,然后关闭浏览器(或者换一个浏览器也行),再打开

问:出现“目录 [ .//Runtime/ ] 不可写”错误
答:请用ssh执行lu-repair命令

问:忘记后台登陆密码怎么办?
答:用请phpMyAdmin用root用户登陆,然后找到LuManager数 据库的lu_users表,再找到相应的用户,如zijidelu,然后修改password字段内容为 dd8eb031789b6a0664709455e7d512ce即可,即将密码还原为zijidelu。如果有设置问题验证,请将question和 hash_answer字段清空

问: 忘记问题验证的答案怎么办?
答:用请phpMyAdmin用root用户登陆,然后找到LuManager数据库的lu_users表,再找到相应的用户,如zijidelu,然后清空question和hash_answer的值便可

问: 网站经常出现502和504错误,该怎么办?
答:这是由于页面执行时间超过1分钟造成的(正常情况下是不会发生的),如果要加大时间长,请在Nginx的扩展里(location段)添加以下三行

1
2
3
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;

问: 如何加大mysql的连接数?
答:在“系统管理与优化”中,编辑my.cnf配置文件,在[mysqld]段,添加以下代码(其中的1500是连接数,可以根据内存适当修改):

1
setvariable = max_connections=1500

问: 提示与官方授权服务器断开,怎么办?
答:请用ssh登陆服务器,ping www.zijidelu.org,如果ping不通,请换一个dns:修改/etc/resolv.conf文件,将其中的内容修改成

1
2
3
4
5
6
7
8
servername 208.67.222.222
servername 4.4.4.4
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 204.74.208.2
nameserver 204.74.213.254

后面别忘记了重启网络,service network restart 命令。

问: centos 64位安装完lum后8888打开空白或者出错,怎么办?
答:解决办法是 编辑 /usr/local/php_LuManager/lib/php.ini 找到最后把eaccelerator 这段整个去掉 或者注释掉就行。

问:Warning: Unknown: open_basedir restriction in effect. File() is not within the allowed path(s): (/:/tmp/:/var/tmp/) in Unknown on lin e 0

答:这个是 eaccelerator 的问题,从 discuz 官方得到的消息称 eaccelerator 从0.9.5.3 之后不支持神马缓存。将 php.ini 里的 eaccelerator 注释掉或删除。

问:进入系统时出错,提示:Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’(2)


答:首先参考5、杀死系统中正在运行的MySQL的方法1或者方法2来杀死当前正在运行的MySQL服务,然后以root用户身份进入
/usr/local/LuNamp/cmd
运行当前目录的mysql-start
protest1:/usr/local/LuNamp/cmd#./mysql-start
然后刷新LuManager的Web界面应该就能顺利进入了:-)

另一种方法: ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

问:安装提示成功,但输入http:// IP:888打不开 ,应该怎么做?
答:做了一下2步操作:
1)请用ssh执行yum -y install freetype
2) ssh -> lu-restart 查看是否启动正常
3)启动成功了,http://IP:8888出现登录界面了

问:Pure-ftpd启动失败,新安装的,怎么解决,错误代码在里面

1
2
Running: /usr/local/pureftpd/sbin/pureftpd A c50 B C5 D E fftp H I15 lmysql:/usr/local/pureftpd/pureftpdmysql.conf lunix L50000:12 m4 p20000:30000 s U000:000 u100 Ostats:/var/log/pureftpd.log j g/var/run/pureftpd.pid k99 Z /usr/local/pureftpd/sbin/pureftpd: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or y Running: /usr/local/pureftpd/sbin/pureftpd A c50 B C5 D E fftp H I15 lmysql:/usr/local/pureftpd/pureftpdmysql.conf lunix L50000:12 m4 p20000:30000 s U000:000 u100 Ostats:/var/log/pureftpd.log j g/var/run/pureftpd.pid k99 Z /usr/local/pureftpd/sbin/pureftpd: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or y
Pureftpd 启动失败! Pureftpd was started failed

答:删除pureftpd(rm -rf /usr/local/pureftpd)然后,再执行LuNamp/code/pureftpd目录下的pureftpd.sh

问:安装LUM到一半,ssh断开了,怎么才能接着安装
答:重新执行命令系统会自动进行检测已安装然后执行未安装

问: LUM理论支持所有的linux and unix我们推荐centos和debian
答: LUM已经做了最大兼容,各种客户均有,但是我们不建议过分纠结某个系统或版本,你的硬件也给你带来了杯具。

问:爱洞大是在火狐下调试开发的LUM面板,管理lum用浏览器时注意
答:搜狗浏览器会导致后台个别编辑时报错,其他暂无反馈,个别错误记得清理浏览器缓存。

问:不管是新安装还是升级lum,偶经验推荐你先执行几个命令检查环境
答:ssh下执行lu-restart 查看有无异常,后台更新缓存,更新网站,检查网站错误,查看各个软件状态

问:全新安装的LUM登陆提示:数据库lumanager不存在
答: lu-repair -y 然后lu-restart 或请重新用zijidelu_install.sh装一下.极少这种情况。

问: LuManager 怎么设置某些FTP用户只有下载而没有删除和上传的权限
答:直接在后台建FTP,在建的时候指定绝对目录到网站目录下,然后通过winscp上传文件(用root用户上传,不受权限影响),然后更改每一个 FTP目录的属主为daemon,用户权限为544(网站可以读文件和FTP用户都不能删除文件,只有daemon和root用户可以删除文件了)

问: LUM如何实现按天或者按周进行自动分割?
答: LUM的日志分割是任意配置的,请在任务计划中进行配。

问: LUM忘记了mysql密码或者数据库异常如何处理?
答: 依然首先建议重启mysql,ssh下用mysql-restart看是否有错误提示,若正常检查改一下home/lum_safe_files/config.php or /usr/local/LuManager/Conf/config.php中的数据库连接密,当然你可以选择命令一键初始或者http://www.zijidelu.org/thread-2300-1-1.html。

问: 在LUM和Linux下如何查看内存?
答:在lum后台有内存状态显示,linux我们一般用free命令和cat /proc/meminfo。

问: LUM提示nginx未启动等常规处理方法?
答:nginx-restart,更新缓存—更新网站—检查网站错误—查找错误的内容—修改错误—ok,通常是配置的规则错误等引起。

问:取消了其中一个域名的绑定 跟着网站就打不开了,LUM中重启了一下系统 现在先控制面板都进入不了
答:用ssh执行lu-restart 即可

问:服务器的网络配置和DNS服务器修改
答:1、网卡配置vi /etc/sysconfig/network-scripts/ifcfg-eth0
2、DNS服务器修改vi /etc/resolv.conf.

问: LUM取消绑定还解析正常以及xx问题?
答:我建议安装lum后新建一个空站排序设置少于默认2000保持排序首位,这个十分必要,或者你设置下未绑定不然访问

问:安装好lum后装探针为何不显示cpu和内存等参数?
在LUM的系统管理中,编辑php.ini文件,将disable_functions参数的值去掉,变成
disable_functions = 或者切换到apahce下。(在LUM的后台,把禁用的函数去掉便可)

问:忘记系统root密码怎么办?
1、lum后台密码管理可以修改root密码
2、以root身份登陆,执行:passwd修改密码。useradd 用户名,添加用户。
具体的如下:
#passwd root
输入root密码,输入两便。
#useradd 用户名
#passwd 用户名
密码,输入两便

问:如何备份重装lumanager和重装系统后如何还原?
1. 备份/home(可以用tar打包)
2. 在新机器上装上LUM(mysql数据库版本必须相同)
3. 将新机器上的/home重命名为/home.bak(mv /home /home.bak)
4. 创建/home目录(mkdir /home)
5. 将备份的文件解压,并移动到/home目录下

问:FTP无法链接
答:ssh登录执行pureftpd-restart重启,同时刷新查看lum后台首页下方提示的ftpd的状态
1. mysql或者pgsql的密码,不能是zijidelu
2. 保证FTP的密码正确(建议重新修改一次)
3. 在LUM后台重启一下pureftpd
4. 如果还是不行,请手动重启pureftpd(pureftpd-restart)

问:LuManager登陆很慢
答:更换DNS,在LUM后台,配置linux系统,修改resolv.conf
nameserver 8.8.8.8
nameserver 208.67.222.222

后面别忘记了重启网络,service network restart 命令。

问: 访问域名出现类似以下错误:Error messages: [Type] 查询语句错误[1036] Table ‘common_block’ is read only [Query] UPDATE common_block SET `dateline`=’1328099475′ WHERE `bid`=’65’
答:lu-repair如果不能解决,重启服务器应该可以解决了

问:CDN加速是不是就是反向代理?
答:CDN可以说是反向代理和缓存的结合.

问:查看FastCGI进程数
答:执行命令netstat -anpo | grep “php-cgi” | wc -l 查看进程数

问:使用nginx和完全使用nginx,出现502

答:编辑网站,在nginx扩展的location段中,加入以下三行

1
2
3
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;

问:Ningx 不支持Url不支持中文,如何解决

1
2
3
vi /etc/profile
在最下面加入
export LANG=en_US.UTF8

NGINX配置文件里添加一句 “charset utf-8″,设置为类似下面的

1
2
3
4
5
6
7
server
{
listen 80;
server_name www.xxx.net;
index index.html index.htm index.php;
root /home/wwwroot;
charset utf8;

然后重启试试

问:我的VM能PING,但不能上网

答:

1
2
3
4
5
6
7
8
9
10
11
12
13
yum y install ssh

vi /etc/sysconfig/networkscripts/ifcfgeth0

DEVICE=“eth0”
HWADDR=“00:E0:66:34:E9:B6”  #你的网卡的物理地址
NM_CONTROLLED=“yes”
ONBOOT=“yes”   #是否启动网卡
IPADDR=10.20.5.248  #IP地址
NETMASK=255.255.254.0  #网络掩码
GATEWAY=10.20.4.1  #网关
BROADCAST=10.20.5.255   #广播地址
BOOTPROTO=static  #启动类型 dhcp表示自动获取  static表示静态地址

根据环境来改呀

问:nginx 日志记录信息不全的问题

答:编辑网站,不要使用简洁记录法

问:Wordpress 网站伪静态失败

1
2
3
4
5
6
7
8
9
10
11
12
rewrite ^/xingfu/wpadmin$ /xingfu/wpadmin/ permanent;
if (f $request_filename/index.html){
rewrite ^/xingfu/(.*) /xingfu/$1/index.html break;
}
if (f $request_filename/index.php){
rewrite ^/xingfu/(.*) /xingfu/$1/index.php;
}
if (!-f $request_filename){
rewrite ^/xingfu/(.*) /xingfu/index.php;
}

/xingfu是二级目录 根目录的话 直接/就可以

问:如何增加自定义的系统管理员

答:编辑/usr/local/LuManager/Conf/config.php文件,设置一下SYSTEM_ADMIN_ID参数

问:采集时出现 502

答:升级到最新版,如果还不能解决,就试一下这个:由于某些程序设置不够科学(一直占用线程,不释放)采集时超时,请换用apache,并且使用8889端口访问
如www.zijidelu.org:8889,然后再进行采集操作

问:mysql-bin.000009,这什么鸟东西

答:mysql的二进制日志,数字序号最大那个不可以删除,其它的可以删除

可以通过以下操作禁止掉
/etc/my.cnf
把下面这两行注释掉
log-bin=mysql-bin
binlog_format=mixed

问:升级内核后,iptables 防火墙无法启动

答:手工执行一下

1
2
modprobe ip_tables
modprobe iptable_filter

然后再 service iptables start 试试!

参考这里:http://bbs.chinaunix.net/thread-2185039-1-1.html

问:FTP总是读取目录列表失败

答:方法如下:
1、连接模式改为主动
2、强制UTF-8编码

问:备份进程如何结束

答:把/home/lum_tmp_files/bkinfo_1520.txt这个文件删除掉

问:忘记mysql的root用户密码怎么办

答:

1
2
3
4
5
6
7
8
9
10
11
12
13
#停止mysql
mysqlstop
#用–skip-grant-tables参数启动mysql
/usr/local/mysql/bin/mysqld_safe user=lu_mysql datadir=/home/mysql_data skipgranttables &
#由于使用了–skip-grant-tables,可不用密码直接登陆mysql
/usr/local/mysql/bin/mysql
#切换到mysql数据库
use mysql
#更新密码为zijidelu
update user set password=password(“zijidelu”) where user=“root”;
#刷新权限
flush privileges;
到此,密码更改完成,按ctrl+c退出,然后执行mysqlrestart重启mysql

问:域名、IP均无法访问控制面板如何搞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
进入SSH,用命令修改LUM后台设置里的 deny_ip_access  为 0

1[root@linode ~]# /usr/local/mysql/bin/mysql -u root -p
Enter password:

2、mysql> show databases;
+——————–+
| Database           |
+——————–+
| information_schema |
| LuManager          |
| mysql              |
| performance_schema |
| test               |
+——————–+
5 rows in set (0.08 sec)

3、mysql> use LuManager
Database changed

4、mysql> select * from LuManager.lu_settings;

5、mysql> UPDATE lu_settings SET deny_ip_access = ‘0’;

修改LUM后台登录密码。
select * from LuManager.lu_users;

UPDATE lu_users SET password = ‘dd8eb031789b6a0664709455e7d512ce’;

即将密码还原为zijidelu

问:服务器wget使用正常 ping正常 但php忽然无法解析外网IP

答:执行chmod 755 /etc/resolv.conf

问:bringing up interface eth0: device eth0 does not seem to be present, delaying initialization.

刚装就显示这个错误,请问各位我改怎么做,才可以搞好?我是新手,第一次用httpOS2.0,所以完全不懂,请各位帮忙~

(我的机器配置是华擎P67 pro3 SE 主板集成的显卡, cpu E-1230,安装HTTPOS2.0时选择的是2实体机+LUM)板载的网卡应该自己装好网卡驱动了吧?这个错误谁能帮帮我,告诉我怎么解决呢?

答:需要自己装网卡手动解决

1
2
3
4
5
6
7
载入U盘 mount t vfat /dev/sdb1 /mnt
cp /mnt/AR81Familylinuxv1.0.1.14.tar.gz /usr/local/src
# tar zxvf AR81Family-linux-v1.0.1.14.tar.gz
# cd src/
# make install
# modprobe atl1e
# lsmod |grep atl1e

问:无法添加 中文.com域名,有办法解决吗?

如果是中文域名,请将域名转码后再填入
转码地址:http://www.cnnic.net.cn/html/Dir/2003/10/29/1112.htm

要学会讲故事

mikel阅读(895)

同样的产品,有故事的产品容易让人相信和产生购买欲望,要学会讲故事

晚上给女儿讲睡前故事,那些简单的故事单独说,女儿都听腻了,于是我就给她串联起来讲,结果她听得津津有味儿,总期待着下一个情节是哪个故事

做营销也是一样,老故事没人爱听,换个讲法估计就能够吸引人了,让人预料不到下面会是什么,总是好奇心趋势一探究竟

给女儿讲睡前故事,我还讲出想法了,如果将多个故事串联起来讲然后写成连载的故事,按天排下去,合乎逻辑的连载下去,成了一个有情节的动画片了,女儿还是给起来名字《小白兔历险记》

完蛋了,这是当作家的节奏,灵感来了挡不住啊!

[转载]wifidog认证接口_sgwyj515_新浪博客

mikel阅读(826)

[转载]wifidog认证接口_sgwyj515_新浪博客.

wifidog是搭建无线热 点认证系统的解决方案之一,他比nocat更适合互联网营销思路。目前支持openwrt系统,他实现了路由器和认证服务器的数据交互,在路由器方是用C 语言代码,通过wifidog程序和linux iptables防火墙实现接入用户的认证跳转和控制,在认证服务器方是通过php实现用户的认证流程和管理。
优点:有开源代码,可以很方便的搭建认证系统。

缺点:通过iptables方式实现,性能比较差,整体拉低了路由器的数据包处理速度,协议比较繁琐,对认证服务器的造成性能损耗比较大,在安全方面都是明文传输,有一定的安全隐患。
以集客盒子为例画个流程图:
001p3DsGgy6InC68vm1f1&690

网关心跳协议

Wifidog将ping协议作为心跳机制向认证服务器发送当前状态信息。实现认证服务器和每个节点的状态双向健康监测的机制。

请求信息:

http://auth_sever/ping/?
gw_id=%s
sys_load=%lu
sys_memfree=%u
sys_load=%.2f
wifidog_uptime=%lu

回复格式:

Pong

例子:

GET/ping/? gw_id=001217DA42D2&sys_uptime=742725&sys_memfree=2604&sys_load=0.03&wifidog_uptime=3861HTTP/1.0
User-Agent:cnrouterwifidog
Host:auth.cnrouter.com

用户状态心跳协议

请求格式:

http://auth_server/auth/?
stage=
ip=
mac=
token=
incoming=
outgoing=

注意:

ip,mac,token为用户的基本信息,incoming/outgoing为用户的连接计数信息。
stage=counter|login|logout,分别表示:已认证,新认证用户,超时需要删除的用户。

回复格式:

Auth:状态码(注意中间冒号和状态码之间有个空格)

状态码:

0-AUTH_DENIED-Userfirewallusersaredeletedandtheuserremoved.
1-AUTH_ALLOWED-Userwasvalid,addfirewallrulesifnotpresent

例子:

GET/auth/?stage=counters&ip=7.0.0.107&mac=00:40:05:5F:44:43&token=4f473ae3ddc5c1c2165f7a0973c57a98&incoming=6031353&outgoing=827770HTTP/1.0
User-Agent:cnrouterwifidog
Host:auth.cnrouter.com

跳转协议

对于新连接用户,路由器将其产生的任意url请求通过302重定向到认证平台。

请求格式:

http://auth_server/login/?
gw_id=
gw_address=
gw_port=
mac=
url=

例子:

GET/login/?
gw_id=808100949391&gw_address=192.168.81.1&gw_port=80&mac=aa:bb:cc:dd:cc:ee&url=http://www.sina.com.cn/HTTP/1.0
User-Agent:cnrouterwifidog
Host:auth.cnrouter.com

注册协议

平台确定成功注册用户,开通互联网权限,将用户请求重定向到路由器,完成注册。

请求格式:

http://gw_ip/wifidog/auth?
token=

例子:

GETwifidog/auth?token=12312412124
User-Agent:iphone
Host:路由器ip
注册请求成功,以307的方式跳转平台的portal/?gw_id=