[转载]android开发环境一些经验分享 - 露草 - 博客园

mikel阅读(1116)

[转载]android开发环境一些经验分享 – 露草 – 博客园.

一、Android环境准备

 

首先在机器上安装Android需要的环境,需要安装的软件,eclipse软件、JDK、SDK、NDK这几个现在网上下载然后安装。安装后环境配置,打开环境变量配置界面如图:

 

添加JAVA_HOME变量如图:

 

 

添加path环境变量如图:

 

 

需要添加环境变量:E:\Program Files\Java\jdk1.8.0_05\bin;E:\Android\sdk\tools;mingw\msys\1.0\bin;

 

然后测试环境是否配好:输入CMD;在命令行输入 javac;看看是否配置正确;

 

二、项目的导入和配置

 

  1) 打开eclipse选择文件,点击导入如图:

 

 

选择Existing Android codeinto workspace,然后点击Next,选择创建的项目所在的文件夹,选择好后点击完成,如图所示:

 

 

 

 

2)参数配置

 

找cocos2d-x所在的路径:E:\lenner\cocos2d-x-2.2\cocos2dx\platform \android\java\src,把这个路径的中的文件复制到你的项目中的SRC文件中:E:\lenner\cocos2d-x-2.2 \projects\HellRun\proj.android\src

 

在eclipse找到项目中的文件夹jni文件夹中的Android.mk文件打开添加两个文件路径如图:

 

 

在配置NDK,右键点击项目选择属性,点击C/C++ build 添加NDK路径如图所示:

 

 

 

根据自己的需要可以配置模拟器或者连真机测试,模拟器的配置可以参考下这篇文章:http://jingyan.baidu.com/article/cbcede07d41dc402f40b4d1f.html

 

连真机的话,首先把android手机连接电脑,打开USB调试,然后在电脑上测试是否成,没有配置adb的话 ,可以这样测试,打开dos如图:

 

 

进入你的sdk目录如上图所示,输入adb测试adb是否能用,能用的话,就输入adb devices,如果出现如下图所示就表示连接成功。

 

 

项目生成,如果使用模拟器的话,先打开配置好的模拟器,然后右键点击项目选择ruan as ,在选择在选择android application,这样项目就能安装到模拟器上运行了。

 

如果是连接真机的话,右键你的项目,选择run as—>run configurations,配置如图所示:

 

 

 

 

然后点击运行,这样项目就配置完了。我就是按照这样的配置一个helloworld就可以运行了,也许不同的电脑或者版本配置的时候出现的问题也可能不一样,如果我有写的不对的地方欢迎大牛指点拍砖。

 

发布后的效果如图所示:

 

谁有这方面的问题咱们可以一起讨论学习,这个是群号:215694215,或者联系本人也可以,本人qq:837138108

[转载][c#]asp.net开发微信公众平台(8)微信9大高级接口,自定义菜单 - 沫尘 - 博客园

mikel阅读(1258)

[转载]asp.net开发微信公众平台(8)微信9大高级接口,自定义菜单 – 沫尘 – 博客园.

前7篇把最基础的消息接收和回复全做完了,  也把高级接口的入口和分拆处理写好了空方法,  此篇接着介绍微信的9大高级接口, 并着重讲解其中的自定义菜单。

微信9大接口为:

1.语音识别接口

2.客服接口

3.OAuth2.0 网页授权接口

4.生成带参数的二维码接口

5.获取用户地理位置接口

6.获取用户基本信息接口

7.获取关注者列表接口

8.用户分组接口

9.上传下载多媒体文件接口

 

具体介绍:

1. 语音识别

 

功能描述:通过语音识别接口,用户发送的语音,将同时给出语音识别出的文本内容。

 

实用意义:第三方可以调用微信自主研发的语音识别技术。意味着微信向第三方开放语音识别技术,直接调用语音识别接口,对语音识别结果进行互动或根据识别的内容进行自动答复。

 

2. 客服接口

功能描述:通过客服接口,公众号可以在用户发送过消息的 12 小时内,向用户回复消息。

 

实用意义:以前公众帐号跟订户只能被动响应,比如用户触发了需求,如发送关键字给公众帐号,后者才可以与用户对话。如今,如果订户跟公众帐号对话过一次,公众帐号就可以在 12 个小时内持续给用户下发消息。这提高了公众帐号发送消息的能力。

 

3. OAuth 2.0 网页授权

 

功能描述:通过网页授权接口,公众号可以请求用户授权。

 

实用意义:这就像微博、QQ的帐号授权功能。这意味着微信帐号正式成为一个帐号系统。

 

4. 生成带参数二维码

 

功能描述:通过该接口,公众号可以获得一系列携带不同参数的二维码,在用户扫描关注公众号后,公众号可以根据参数分析各二维码的效果。

 

实用意义:举例来说,以前放一个二维码在网站或者线下的广告牌,效果都是一样的:获得关注用户。现在可以分析订户来自哪里。开发者可以在链接里设置特殊信息,做更多的数据分析。这一功能也可以用来做帐号绑定,

 

5. 获取用户地理位置

 

功能描述:通过该接口,公众号能够获得用户进入公众号会话时的地理位置。

 

实用意义:两种情况可以获得用户地理位置:一是与公众帐号“会话时”,二是在会话界面“每隔 5 秒”。在用户同意下,这就可以做微信导航或地理围栏方面的服务。

 

6. 获取用户基本信息

 

功能描述:通过该接口,公众号可以根据加密后的用户 OpenID,获取用户基础信息,包括头像、名称、性别、地区。

 

实用意义:以前这是一个非常高的权限。获得用户基本信息后,可以做 CRM 管理后台,方便商家管理用户。

 

7. 获取关注者列表

 

功能描述:通过该接口,用户可以获取所有关注者的 OpenID

 

实用意义:以前不能知道有多少人关注你,是谁在关注你。如今你可以知道谁在关注你。

 

8. 用户分组接口

 

功能描述:通过分组接口,公众号可以在后台为用户移动分组,或创建、修改分组。

实用意义:可以对用户进行分组,比如乐思享组织一场“听众交流会”,现场来了 1000 人,可以把它归为一组,后续的活动花絮照片只发给这 1000 人。这对于商家来说,就是一个 VIP 会员管理,是 CRM 管理平台。

 

9. 上传下载多媒体文件

 

功能描述:通过该接口公众号可以在需要时在微信服务器上传下载多媒体文件。

实用意义:可以下发图片、视频。比如搞笑视频,上传到微信公众账号后台,可以向听众推送出来,相当于视频网站的一个业务。

 

以上就是微信9大高级接口的介绍,   其实现在应该是10个了,还有1个支付功能。

 

 

下面着重写自定义菜单。

 

自定义菜单只需要创建一次,之后都会存在,每次更改需要等待几分钟才可看到,创建:

创建好之后:

 

 

我这里是全部添加好之后,点击创建到微信,代码:

public void SetMenu()
{

dbHome=Factory.FContext.WeiXinDbContext();
var listP = DAL.ListWhere<tb_PersonalMenu, int>(dbHome, a => a.ParentId == 0&& a.State==1, a => a.ID, 3);
List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
foreach (var row in listP)
{
var listC = DAL.ListWhere<tb_PersonalMenu, int>(dbHome, a => a.ParentId == row.ID && a.State==1, a => a.ID, 5);
List<Dictionary<string, object>> list2 = new List<Dictionary<string, object>>();
Dictionary<string, object> dic2m = new Dictionary<string, object>();
Dictionary<string, object> dic1 = new Dictionary<string, object>();

if (listC.Count > 0)
{
foreach(var row2 in listC)
{
//2级菜单内容
Dictionary<string, object> dic2c = new Dictionary<string, object>();

dic2c.Add("type", row2.Type.ToString().Replace("1", "click").Replace("2","view"));
dic2c.Add("name", row2.Name);
if(row2.Type==1)
dic2c.Add("key", row2.ID);
if (row2.Type ==2)
dic2c.Add("url", row2.LinkUrl);

list2.Add(dic2c);
}
//--
//2级菜单组装
dic2m.Add("name", row.Name);
dic2m.Add("sub_button", JsonHelper.ListDicToJsonVals(list2));
//------
list.Add(dic2m);
}
else
{
//1级菜单
dic1.Add("type", row.Type.ToString().Replace("1", "click").Replace("2", "view"));
dic1.Add("name", row.Name);
if (row.Type == 1)
dic1.Add("key", row.ID);
if (row.Type == 2)
dic1.Add("url", row.LinkUrl);

//----------
list.Add(dic1);
}
//1级和2级装成list

//-----------

}

string m=JsonHelper.ListDicToJsonVals(list);//将list转成json的值 下面赋值给button

//赋值给button
Dictionary<string, object> dicAll = new Dictionary<string, object>();
dicAll.Add("button", m);
//---------

string jsonResult = JsonHelper.GetJsonStr(dicAll);//将dic转成json
//转换出来的 [{},{}]也会被“”包围,要去掉“”

jsonResult = jsonResult.Replace("\"[", "[").Replace("]\"", "]");
string html = HttpHelper.HttpPost("https"+"://api.weixin.qq.com/cgi-bin/menu/create?access_token="+Common.Config.SystemConfig.access_token+"", jsonResult, Encoding.UTF8);

dbHome.Dispose();
Response.Write(JsonHelper.JsonToVal(html, "errmsg"));
Response.End();

}

最终是如下格式的json数据post到微信:

{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"type":"click",
"name":"歌手简介",
"key":"V1001_TODAY_SINGER"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"view",
"name":"视频",
"url":"http://v.qq.com/"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}

这样就可以在微信中看到结果:

以上是属于后台管理中的创建菜单, 创建之后我们公号服务入口处对应的方法也完善下, 之前已经写好了一个空方法

public void DoMenuClick(DbContext dbHome, RMenuClick mMenuClk)
{

}

现在完善下:

//自定义菜单点击
public void DoMenuClick(DbContext dbHome, RMenuClick mMenuClk)
{
SText mStxtA = new SText();
mStxtA.ToUserName = mMenuClk.FromUserName;
mStxtA.FromUserName = mMenuClk.ToUserName;
mStxtA.CreateTime = mMenuClk.CreateTime;
int id = 0;
mStxtA.Content = "欢迎使用,输入任意关键字开始体验";
if(int.TryParse(mMenuClk.EventKey,out id))
{
var me = DALWei.InfoEntities<tb_PersonalMenu>(dbHome, a => a.ID == id);
if(me!=null)
mStxtA.Content = "欢迎使用【"+me.Name+"】,介绍、说明、链接等等; 也可以是图文消息";
}

Often.ResponseToEnd(DALWei.SendText(mStxtA));
}

这个是点击类型的菜单处理,  需要说明的是,view类型的菜单点击就会直接跳转你所写的链接去,  1级菜单如果设置成view类型则不会跳转依旧执行点击事件;

效果:

 

我这里直接返回了一段文字, 实际应用中可以返回任何消息。

 

 

 

 

源码下载,新建的QQ群,提供源码下载,有问题也可以问我:群号183695596

[转载]c# linq的一些运用 - EcitGis - 博客园

mikel阅读(1129)

[转载]c# linq的一些运用 – EcitGis – 博客园.

最近在学习xml.linq 网上也找了一些资料都不大全面,因此在这写了一点东西和大家分享,由于本人知识有限,如有错误请指证

可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自 己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。(百度)
学习xml.linq,首先要了解xml的几个定义。

1.XDeclaration—– XML 声明用于声明 XML 版本、编码以及 XML 文档是否独立,如果想新建一个xml文件需要在xml文件的最前面声明xml的一些信息

1     XDeclaration m_XDexlaration = new XDeclaration("1.0", "utf-8", "yes"); //初始化   XDeclaration
2             XDocument m_Xdocument = new XDocument(m_XDexlaration, new XElement("person")); //初始化 XDocument 初始化一个文档时 记得要有一个根节点不然报错
3             m_Xdocument.Save("person.xml");//文档保存

结果:

<?xml version=”1.0″ encoding=”utf-8″ standalone=”yes”?>
<person />

2. XElement , XElement 是指包含在尖括号里面的有开始结束标签的标记语言,比如<item> person</item> ,item就是一个元素

3.XAttribute 属性,比如<item color=”red”> person</item>中的color就是item的属性

4.node 节点,节点是一个比较抽象的定义,在xml文档中 node可以是 元素和其他的一些东西

二.xml.linq一些方法的运用

1.初始化一个xml文档

 

            XDeclaration xs = new XDeclaration("1.0", "utf-8", "yes");
            XDocument  xdoc=new XDocument(xs,new XElement ("person",new XAttribute("color","red"),new XAttribute("size","big"),new XElement("name","刘清"),new XElement("age","18")));
            xdoc.Save("p.xml");
            Console.WriteLine(xdoc);

初始化文档时注意一下几点:

1.首先应有 XDeclaration ,就是xml的定义比如版本,编码方式登

2.初始化xml时要有一个根节点,比如上面的person就是一个根节点。上面定义了根节点的两个属性,color,size;在person下面有两个子节点 name和age

复制代码

<?xml version=”1.0″ encoding=”utf-8″ standalone=”yes”?>
<person color=”red” size=”big”>
<name>刘清</name>
<age>18</age>
</person>

复制代码

2.xml文件的遍历

比如有一个xml文档时这样的

<?xml version=”1.0″ encoding=”UTF-8″?>
<Menu>
<strip menu=”文件”>
<item name=”文件” 快捷键=”alt+o”> 打开工作空间 </item>
<item name=”文件” 快捷键=”alt+p”> 关闭工作空间 </item>
<item name=”文件” 快捷键=”alt+q”> 保存工作空间 </item>
<item name=”文件” 快捷键=”alt+m”> 退出工作空间 </item>
<item name=”文件” 快捷键=”alt+n” > 打印 </item>
</strip>

<strip menu=”编辑”>
<item name=”编辑”> 复制 </item>
<item name=”编辑”> 剪切 </item>
<item name=”编辑”> 粘贴 </item>
<item name=”编辑”> 菜单管理器 </item>
</strip>
</Menu>

现在我要遍历它所有的项,并根据读取元素strip 的menu属性

 

复制代码
 1             ArrayList name=new ArrayList();
 2             ArrayList s_name;
 3             XDocument m_Xdocument = XDocument.Load("MenuXml.XML");//使用xdocument类的静态方法读取文档
 4             XElement m_Xlement = m_Xdocument.Element("Menu"); //读取根元素
 5             IEnumerable<XElement> sdf = m_Xlement.Elements("strip");//读取strip元素下的节点(有两个strip节点元素和若干item元素)
 6             int i = 0;
 7             foreach (XElement sld in sdf)
 8             {
 9              name.Add( sld.Attribute("menu").Value);//得到strip的属性menu
10              Console.WriteLine(name[i++]);
11             }
12             IEnumerable<XElement> i_XElment = m_Xlement.Elements();//获得根元素(Menu)下面的所有节点元素
13             foreach (XElement x in i_XElment)
14             {
15                  IEnumerable<XElement> p_xelment = x.Elements("item");
16                 s_name = new ArrayList();
17                 foreach (XElement e in p_xelment)
18                 {
19                 
20                     Console.Write(e.Value.ToString());
21                 }
22 
23 
24             }
复制代码
文件
编辑
 打开工作空间  关闭工作空间  保存工作空间  退出工作空间  打印  复制  剪切  粘贴
 菜单管理器 请按任意键继续. . .

3.删除特定的节点

假定有个xml文档为MenuXml 其内容为

复制代码
<?xml version="1.0" encoding="utf-8"?>
<Menu>
  <strip menu="文件">
    <item name="文件" 快捷键="alt+p"> 关闭工作空间 </item>
    <item name="文件" 快捷键="alt+q"> 保存工作空间 </item>
    <item name="文件" 快捷键="alt+m"> 退出工作空间 </item>
    <item name="文件" 快捷键="alt+n"> 打印 </item>
  </strip>
</Menu>
复制代码

现在我要删除其中一个元素名为“关闭工作空间” 代码如下

复制代码
 1   XDocument m_Xdocument = XDocument.Load("MenuXml.XML");//使用xdocument类的静态方法读取文档
 2             XElement m_Xlement = m_Xdocument.Element("Menu"); //读取根元素
 3          
 4                 IEnumerable<XElement> xe = m_Xlement.Elements();//得到根元素下的集合
 5                 foreach (XElement x in xe)
 6                 {
 7                     IEnumerable<XElement> xes = x.Elements("item");//得到item的集合
 8                     foreach (XElement ds in xes)
 9                     {
10                         if (ds.Value.ToString().Trim() == "关闭工作空间")//对比
11                         {
12                             ds.Remove();
13                             m_Xdocument.Save("MenuXml1.XML");//保存为新的xml
14                         }
15                     }
16                 }
17                 XDocument a1 = XDocument.Load("MenuXml.XML");
18                 XDocument a2 = XDocument.Load("MenuXml1.XML");
19             Console.WriteLine(a1);
20             Console.WriteLine(a2);
复制代码

结果如下

<Menu>
<strip menu=”文件”>
<item name=”文件” 快捷键=”alt+p”> 关闭工作空间 </item>
<item name=”文件” 快捷键=”alt+q”> 保存工作空间 </item>
<item name=”文件” 快捷键=”alt+m”> 退出工作空间 </item>
<item name=”文件” 快捷键=”alt+n”> 打印 </item>
</strip>
</Menu>
<Menu>
<strip menu=”文件”>
<item name=”文件” 快捷键=”alt+q”> 保存工作空间 </item>
<item name=”文件” 快捷键=”alt+m”> 退出工作空间 </item>
<item name=”文件” 快捷键=”alt+n”> 打印 </item>
</strip>
</Menu>
请按任意键继续. . .

在学习linq xml时要注意的是,通过方法.Element()得到的只是只是第一组标签(如果该标签存在多对时)

[转载]IIS 配置PHP环境HTTP 500错误处理方法_百度经验

mikel阅读(1042)

[转载]IIS 配置PHP环境HTTP 500错误处理方法_百度经验.

IIS使用FastCGI方式配置PHP以后,在编写PHP程序时,经常会出现HTTP 500错误

  • HTTP 500(Internal Server Error):服务器尝试执行请求时遇到了意外情况。研究了下,发现时PHP没有开启错误提示,这样IIS无法处理PHP的语法错误等,所以任何错误都会显示出HTTP 500错误。

解决方法很简单,打开PHP.ini,设置显示错误

display_errors = On

然后打开IIS,重新启动FastCGI。

  • HTTP 500服务器内部错误。这个问题的原因在于phpmyadmin和wordpress等程序的index.php文件中都用到了require(./xxx.php)这样的语句,一般是文件或数据库权限问题。

解决办法,把里面的require(./xxx.php)改成 require(xxx.php)。

解决办法2,给网站的上级目录赋予iis用户读权限。

  • 检测到在集成的托管管道模式下不适用的 ASP.NET 设置。

打开IIS管理器,选择应用程序池——你的网站应用程序池(自己的创建)——单击右侧的“设置应用程序池默认设置”,打开,在常规中,将“启用32位应用程序”设置为“True”,将“托管管道模式”改为Classic,最后单击“确定”就一切OK了。

解决方法3:应用程序池设置的“进程模式”的“标识”改为“LocalSystem

 

[转载]Android摄像头测量尺(Advanced Ruler Pro)使用方法 - sinojelly - 博客园

mikel阅读(1248)

[转载]Android摄像头测量尺(Advanced Ruler Pro)使用方法 – sinojelly – 博客园.

Advanced Ruler Pro是一个Android手机应用程序,可以通过摄像头量出比手机尺寸大得多的物体的长度。
它支持三种测量方式,距离、高度、长度,前两种都非常容易使用,长度测量比较难用一些。
一、Distance Ruler
用距离尺测量房间的长:
(1)测量自己站立时眼睛距离地面的高度(一般是身高*92%)
(2)点击Camera Height设置摄像头高度。(测量时,身体站直,摄像头放在右边眼睛前面,便于瞄准)
(3)倾斜摄像头,使得瞄准器对准被测位置,点击瞄准器,Distance显示的就是被测位置距离站立位置的水平距离。
同样方法测量房间的宽:
二、Height Ruler
用高度尺测量房间的长:
(1)点击Camera Height设置摄像头高度。(测量时,身体站直,摄像头放在右边眼睛前面,便于瞄准,与前面相同)
(2)向下倾斜摄像头,使得瞄准器对准被测物体底部,点击瞄准器。
(3)再向上倾斜摄像头,使得瞄准器对准被测物体顶部,点击瞄准器。
三、Length Ruler
长度尺比较复杂,先来认识一下屏幕元素:
注:点击测量尺的任意一端,变成红色,之后它就可以拖动了。
测量步骤如下:
1、选择一个参照物(比如:我选择名片,长度9cm),把它放到要测量的物体处,它和被测量物体到摄像头的距离一致。
(注:如果距离已知,或者用Distance先测出来,则可以以距离为标准来测量物体长度,就可以不用参照物了)
2、远离被测物体,使得被测物体整体纳入摄像头镜头。
3、用镜头中的测量尺(Measuring tape)测量参照物。(如果被测物体是垂直,那么保持水平球在中央可提高精度)
4、滑动长度滑动器(Length slider),使得下面的Length读数为9cm,右边的Distance读数就是被测物体距离摄像头的距离。
5、用镜头中的测量尺测量要测量的长度,Length的读数就是测量出来的读数。(Distance在测量过程中是不会变的)
(1)测量笔记本电脑的屏幕长度。(35.77cm)
(2)测量笔记本电脑的屏幕宽度。(20.85cm)
(3)测量笔记本电脑的屏幕对角线长度。(40.34cm)

[转载]如何成为一个伟大的开发者(三) | 雷锋网

mikel阅读(965)

[转载]如何成为一个伟大的开发者(三) | 雷锋网.

作者简介:Peter Nixey,Ruby on Rails程序员,前计算机视觉学者、企业家,Clickpass公司CEO,YC孵化器的企业规划导师,Brojure公司CTO。

重视产品的生命周期成本

新手开发者们热衷探索和折腾。他们热爱那些最新最闪亮的技术,不管是No-SQL数据库还是高并发的移动服务器,总是恨不得把所有新工具新特性全部使用起来,但这往往给后来的开发者留下一堆烂摊子。

功能和架构的选择会影响到建于其上的一切。潜在的抽象泄露风险,引发的后果将不堪设想。除非你有足够的理由,否则千万不要使用那些尚处于测试中的功 能。所有主要项目的开发,都应该小心翼翼。如果非要尝试这些新特性,最好在那些辅助项目上尝试,这样保险得多。为了将来不把大量的时间都用来弥补前期捅的 娄子,要谨慎使用新特性。

理解技术负债

技术负债是指那些混乱糟糕,但还能工作的代码。比如一个本应该用面向服务的架构,却单独开发了的APP;或者一个重构后只需要十分之一执行时间的Cron任务脚本。

技术负载不仅会累加,还会带来复合效应。爱因斯坦说过,“世界上最强大的力量是复利”。类比到软件开发上,技术负载的复合效应也最具有毁灭性。多数 开发者遭遇过这样的项目:哪怕是一点轻微改变,都不得不花费几个月的时间。这种情况下,你会失去保持代码整洁优雅的兴趣和耐心,只求不要把整个服务弄崩 掉。

技术负债还有一个特点是:你不需要偿还。当开发的一个功能最后发现是错误的、不工作的,你会直接放弃它,同时也放弃所有的优化、测试及重构。所以,如果不是真正需要的话,那就不要去开发。将效用最大化,忽略错误。

技术负债,就像一个蛙跳游戏。最初的代码都只是尝试,只要能实现目标快速推进就好。这让我们有足够的时间来提出解决方案,足够的空间来建立基础设施。产品的生命周期越长,投入在基础设施上的时间就越长。有了稳固可靠的基础设施架构,才能支撑起一个高质量的产品。

总结并分享所完成的工作

不管用什么样的风格来注释文档,不管是用邮件还是Wiki,一定要花时间记录开发流程以及所用到的资料,并分享给其他团队成员。他们和你一样,也会 遇到各种安装和调试的问题。软件开发中,最令人头疼的事情就是花费大量的时间来解决bug和安装调试。如果你用一点时间来制作文档或者教程的话,将为团队 省下更多的宝贵时间。

via: peter nixey

相关:

如何成为一个伟大的开发者(一)

如何成为一个伟大的开发者(二)

[转载]静电的设计教室(2):零基础,你也可以设计一个抓人眼球的app登录界面 | 微价值

mikel阅读(1212)

[转载]静电的设计教室(2):零基础,你也可以设计一个抓人眼球的app登录界面 | 微价值.

     hi,这是静电为大家带来的设计教室第二篇. 在上一期中,静电和大家一起讨论了如何来设计一枚高大上的图标(查看上期内容可以点这里: 静电的设计教室(1):为你的应用做一个高大上的图标) 那么本期,我们来进行下一步的设计.  大家知道, 登录是很多应用必备的功能之一,登录界面关乎你的使用者是否想进一步来与程序互动.所以,我们要步步为营,吸引浏览者来做更深入的使用. 静电在之前的文章中,和大家分享过一些优秀的登录界面设计,大家是不是看的眼馋呢?那么,现在,我们继续来使用上一期静电推荐的adobe fireworks来实现这个设计.

     什么?你已经打开fireworks了? 别急,先等一等,记得,我们第一步,是思考.
     有以下几个点需要考虑:
     1.我们要设计的应用,是一定需要登录才能使用的吗? 如果不是,那么不必一打开应用就要求登录,这会将很多潜在用户拒之门外.
     2.如果一打开应用就要登录,那么如何设计才能更好的吸引更多用户登录和注册?
     3.如何简化用户登录和注册的成本?
     4.如何设计能更好的符合我们应用的”气质”?让用户第一眼就爱上我们的应用
     先看一眼设计好的界面吧!第一个是登录页面的表单,第二个是点击登录后的动态效果.
0102
我们首先分析下这个界面使用了什么元素.
1.一个logo,这个我们在上一节的设计教室中讲过如何来做.
2.一个深灰色的圆角矩形
3.一个绿色圆角矩形登录按钮
4.两个图标(邮箱和锁的icon)
5.背景图片
6.忘记密码和新用户注册的文字
03
logo我们在上一节中讲过设计过程,所以我们这里可以直接拿来用.继续观察,我们发现登录按钮还有登录框都使用同样形状的圆角矩形, 只不过颜色有差异而已,那么,我们先来画一个圆角矩形.

画一个圆角矩形

 
先新建一个画布,你可以使用快捷键ctrl+n,或者在文件中选择新建, 画布尺寸设置为640-1136px,分辨率为72dpi,背景设置为白色,然后点击确定
04
接下来,我们会看到一片白色区域,这就是我们要绘制图片的画布, 首先使用鼠标选择左侧的05
诶?怎么是椭圆工具呢?有同学可能要问,那么这里,我们仔细观察,看到这个图标下面,有个箭头,那就表示,这个图标其实是有并行选项的,保持鼠标放在这个图标上,然后按住左键,
06
这个时候我们看到了什么? 哇,别有洞天是吧,现在,知道要怎么做了吧? 选择”矩形工具”就可以了,当然,机灵的同学们可以多练练手,里边有很多方便的图形,大家可以自己发掘.
选择矩形工具后,我们拖动鼠标,在白色画布上画一个矩形,就像下图,然后,我们根据下图来操作.就可以得到一个圆角的矩形了.
07
这里我们提一下fireworks的基本操作方式,首选创造一个形状,然后选中这个形状,接着调节这个形状的属性(属性面板一般在屏幕最下方),怎么样,大家都会了吧?
好的,现在,我们完成了一个矩形了,接着,我们要做一个按钮, 因为按钮形状和登录框形状一样,所以,我们这里可以直接复制, 选中这个灰色框,复制和粘贴神马的,我就不用说了吧?
然后,我们将这个矩形移到下方,按照下图,将这个矩形的颜色设置为#0BD28A. 透明度设置为100(即全透明)
08

设计一个华丽的背景

 
1.我们从网上找到一副壁纸作为素材.大家可以直接使用,也可以选择自己喜欢的壁纸来练习.对于壁纸的选择,我这里建议,要找一些留白比较多的, 如果这个壁纸太过复杂,那么登录界面的主视觉(按钮,文字,输入框等)辨识度就会变的很低.
09
2.这次,我们使用键盘上的ctrl+r,导入这张壁纸到我们的画布中,导入后,选择这幅图,选择菜单, 滤镜>模糊>高斯模糊,在弹出的对话框中,将高斯模糊的数值调整为34
10
接下来,我们看到,壁纸变的模糊了,我们可以用鼠标移动这幅图片,选择你认为理想的位置来放置. 完成后如下图.
11

使用图标素材来为设计增加细节

 
接 下来,我们发现,图片中需要两个图标,一个邮箱图标,一个锁图标. 这里,因为涉及到比较复杂的路径操作,我们选择求助于网上的素材, 网上的图标素材很多, 静电推荐的素材网站是站酷(http://www.zcool.com.cn),大家可以去搜索合适的图标来使用,图标格式一般为透明的png,或者是矢 量的ai格式.这些都可以在fireworks中直接打开,非常方便.
好的,我们这里先复制一个灰色的圆角矩形,放到合适的位置,然后将合适的图标放到图中.(同样使用ctrl+r,导入下载好的图标图片文件), 摆放到合适的位置,如果觉得图标大小不合适,我们同样选中图标,选择
12缩放工具来将图标调整到合适的大小.
13
接下来,我们继续导入logo. ctrl+r,导入logo文件,调整好尺寸和位置, 然后,我们将图标透明度调整为76.
14

为我们的设计添加文字

我们的登录界面不可能少了文字,所以,这一步,我们将在合适的地方来摆放文字.使我们的设计趋于完美.
选择左侧工具栏的文本工具,这时,我们会发现,鼠标变成了输入光标,我们在需要的地方打上文字.
15
16
输入后,我们可能觉得文字大小和颜色都不合适,我们首先条件email和密码位置,选择你要更改的文字, 看屏幕最下方的属性栏,调整为如下数值(字体,字号,透明度).
17
接着,选中文字”登录”,调整为如下数值
18
下方的新用户注册和忘记密码选项做同样处理即可.

细节调整及效果预览

 
最后,我们来做收尾工作,通过鼠标调整各个元素的位置,大小,颜色到你认为满意的程度.接下来. 我们就可以保存这幅图了. 选择 文件>保存 选择存储为fireworks png文件,记得,一定要是这个选项哦.否则下次打开这个文件,各个元素就无法编辑了.
因为是手机界面,我们一定会想在手机上直接预览效果,怎么做呢? 有同学可能会说,通过usb传到手机,然后打开…..这个这个…当然可以….
但,没有更简单的方法了吗? 好,静电先卖个关子,
下一期,为大家送上效果图预览神器,另外,为大家讲一下如何来将我们设计的效果图用于app的开发.
好,本次课程先到这里,请大家持续关注静电的设计教室吧! 下期见!

转载请注明:微价值 » 静电的设计教室(2):零基础,你也可以设计一个抓人眼球的app登录界面

[转载]改变手机IMEI的方法 - yadwbhh的博客 eoe 移动开发者论坛

mikel阅读(1254)

[转载]改变手机IMEI的方法 – yadwbhh的博客 eoe 移动开发者论坛.

    某些移动应用会通过技术手段阻止用户使用,例如被陌陌封号了以后,使用者会注意到,自己的手机再也无法使用陌陌了,即便是再注册一个帐号也无济于事。本文给出一个办法:即通过PDroid修改app所能见到的IMEI,来合法安全地解决这个问题。

产生这种状况的原因:

1,通过在Android Package的Androidmanifest.xml文件中添加Android.permission.READ_PHONE_STATE对 象,android应用程序可以通过Android提供的API获取访问蜂窝设备的IMEI号码的权限。

2,在Android手机上,陌陌会索取手机的IMEI号码,并且把它当作用户校验的手段。当你试图在别的手机上登陆你的陌陌账户时,会被拒绝。同样,陌陌的运营者可以决定阻止带有特定IMEI的设备登陆。

3,每个手机都有一个独一无二的IMEI号码,这意味着IMEI和用户高度相关,和手机号码一样是一个可以精确追踪到用户的标记,只要不换手机,无论你使用什么帐号,IMEI都是不变的。

——有一个例外,山寨机的IMEI号码往往会不符合以上情况

问题出在哪里:

显然,陌陌是无权封禁设备的。因为它不可以具备追踪到设备的能力。换个说法,只要用户希望,用户就应当能获得阻断陌陌追踪到用户设备的能力。

IMEI与用户的高度相关决定了它是用户的隐私,只有用户的蜂窝网络运营商以及一些直接的利益相关者(如负责公共安全的政府部门,厂商在维修设备时)才可以无条件知晓特定IMEI与用户之间的联系。除此以外,用户理应可以自行决定哪些应用程序可以知晓自己设备的串号。

而陌陌将IMEI作为了用户登陆的必要条件。如果陌陌无法从Android.permission.READ_PHONE_STATE获得IMEI,它就不会登陆。

所以?

就像越狱苹果手机那样,我们需要一个由用户可行的,剥夺这种(可能是非法的)追踪到具体设备能力的手段。在罕见的情况下,使用二手设备的用户不得不通过这样的方法来绕过自己手机的前一个使用者被封禁,导致自己也不能用陌陌的故障。

简单地说:

既然形式上陌陌需要一个IMEI,那么就如其所愿,公平地给它一个李鬼IMEI吧。如果陌陌一旦获得了IMEI,只要内容不为空,它就会允许注册/登陆

以下介绍的内容无法改变手机本身的IMEI(这个东西是固化在更底层的地方,不是通过修改系统就能做到的),所以没有法律或安全上的问题;相反的,它会 给android用于向app提供IMEI的API做点手脚,让你可以自行决定,是否向应用程序提供IMEI,或者提供一个自定义/随机的IMEI。

实践以前,请检查一下是不是满足以下条件:

最重要的:因为接下来介绍的方法是公开的,涉及到的代码也是开源(PDroid patch的代码本体以GPLv3授权)的,因此以下的方法以“原样”提供,没有任何保证,实践者需要自行承担操作带来的一切后果(比如,包含且不限于设备损坏,被封号等状况)

1,设备需要满足的基本条件:

设备的bootloader必须解开(对于HTC设备,需要处于s-off状态)

仅可在这些系统实行Android 2.3(Gingerbread)/4.0(Ice Cream Sandwitch)/4.1(Jelly Bean)

Android必须允许root权限(意味着你可以通过superuser/superSU/LBE授权管理等为需要的app提供root权限),以使得PDroid patch可以工作,实际上PDroid app本身并不需要root权限。

Android必须deodexed

2,开发环境

对于Android 2.3,你需要:

一个安装了JDK1.6/1.7的windows环境,
.Net Framework 2.0虚拟机,
设备的recovery环境需要clockwork recovery(TWRP recovery可能不被支持)

对于Android 4.0,你需要:

一个安装了JDK1.6/1.7的linux、MAC或cygwin环境

或者:
在有足够java,Android开发能力的前提下,你可以按照XDA-developers论坛上给出的源代码,指示,自行编译。

3,你需要掌握的知识

会给android手机刷机,某些情况下需要知道怎么解锁bootloader,以及通过fastboot
安装linux内核;可能需要知道最基本的linux终端(terminal)的使用方法

4,其它

如果是android 2.3,设备的framework.jar必须没有改动过
如果是android 4.0/4.1,只有特定的rom种类被支持。支持名单包括(到2012年8月25日为止):CM7,CM9,CM10,AOSP(Jelly Bean以及部分低级版本),AOKP,ParanoidAndroid,以及其它某些未指明的版本。

——CM是Cyanogen Mod的缩写,AOSP是Android Open Source Project的缩写,AOKP是Android Open Kang Project的缩写。

实际操作:

将会做什么?

通过给android系统打一个叫PDroid patcher的权限管理补丁,配合上专用的app(也就是PDroid app)后,可以给陌陌的app提供一个自定义IMEI号码,从而绕过它的IMEI检测系统。

具体步骤?

对于Android 2.3

1,下载PDroid作者svyat编译好的自动补丁制作工具PDroid Patcher

2,在recovery环境中将当前的ROM进行nandroid备份并导出。当然,也可以用全新的刷机包(aroma installer格式的可能不被支持)

3,启动PDroid Patcher,选择上一步准备好的备份/刷机包(.zip文件),点击patch后,软件会针对当前的.zip制作一对补丁,一个是用于打上PDroid补丁的,另一个是恢复包,用于打完补丁后的还原(在出故障,或不希望继续使用等场合下)

4,把上一步制作好的两个补丁复制到设备的SD卡(对于不支持SD卡的设备,则放在/sdcard分区),如果是安装全新系统,不要忘了刷机包。

5,进入recovery环境,安装PDroid补丁。新安装系统的,则先安装系统后再安装PDroid补丁。

6,到Google Play Store安装PDroid app;如手机没有Gapps,或因众所周知的原因而无法访问Play Store时,则可以到作者在XDA-developer的页面获取。

7,打开PDroid app,给陌陌指定一个IMEI号码即可——同样的,这个IMEI号码会和你新注册的陌陌帐号绑定。

对于Android 4.0/4.1

原作者svyat提供的补丁工具只适用于Android 2.3,因此我们需要mateorod的帖子中,适用于4.0/4.1的工具。这个工具只能在Linux、Mac,以及Cygwin环境下运行。所以实践 者可能需要一台安装了JDK(OpenJDK和Oracle开发的JDK都可以)的linux电脑/虚拟机,或者按照作者提供的方法自行配置cygwin 环境。

1,下载专用的补丁制作工具,解压至实践者自行指定的工作目录

2,在terminal中进入前面所说的工作目录,以”./autopatcher ROM.zip pdroid”的形式运行,稍等一会,补丁(以及恢复包)就会制作完成。也可以” ./autopatcher ROM.zip pdroid,v6supercharger”的形式运行,这样补丁就会同时包括pdroid与supercharger V6(一个调整了默认Android系统内存管理的脚本)

接下来的步骤和前面相同。

iOS系统怎么办:

在iOS系统下(需要越狱),也有类似的应对方法。有一个叫UDIDFaker的工具可以为指定的app更改UDID,也可以用来绕过陌陌(可能是非法) 的限制。

类似的方法也可以用于whatsapp等强制要求IMEI才可工作的app,如果你不希望它们知晓你的IMEI的话。

可能需要的相关XDA-developers内容的地址以及参考:

mateorod  —  [Script][8-08][JB] Auto-Patcher
http://forum.xda-developers.com/showthread.php?t=1719408

svyat  –  [APP] PDroid – The Better Privacy Protection [2012-03-18: Bugfixes in Patch 1.32]
http://forum.xda-developers.com/showthread.php?t=1357056

[App] PDroidAddon Camera and Microphone Permission [Update: v1.2, 2012-08-08]
http://forum.xda-developers.com/showthread.php?t=1794411

IMEI
http://baike.baidu.com/view/90099.htm

[转载]伪静态Your trial license has expired_VPS.GL_Good Luck! VPS

mikel阅读(1290)

[转载]伪静态Your trial license has expired_VPS.GL_Good Luck! VPS.

故障描述:
今天有个美国VPS的用户向我们救助,说他的网站昨晚还好好的,早上起来就发现404了,但是后台却可以正常登陆。经过我们检查后发现原来是伪静态失效 了,查看日志,发现许多ISAPI_Rewrite发出的错误信息:Your trial license has expired。

故障分析:
查阅后才发现ISAPI_Rewrite原来是一个收费组件来的,而客户ISAPI_Rewrite 2.9 Full 原来是完全破解版,而且KEY也过期。根据根据一些技术高手的说法,破解版的ISAPI在未重启IIS前,ISAPI_Rewrite还是可以用的,但重 启了IIS以后,URL重写的功能就完全失效了。
有经验的网友分析,ISAPI_Rewrite主要的验证还是通过ISAPI_Rewrite.dll,ISRWConfig.exe的作用仅仅是一个配 置工具而已,让用户输入序列号,设置一些参数。而当你输入了序列号以后,就会生成一个ISAPI_Rewrite.lic,将用户名以及序列号保存在里 面,然后每次调用ISAPI_Rewrite.dll时,就会去验证这个序列号。

解决办法:
通过正版的序列号激活使用
Longshui Chen
7Z3NU-7MAP5-JZDPH-PR9GK

[转载]Windows主机IIS安装ISAPI_Rewrite配置 - 聪明的傻瓜 - 博客园

mikel阅读(932)

[转载]主机安装ISAPI_Rewrite配置 – 聪明的傻瓜 – 博客园.

ISAPI_Rewrite是一个功能强大的网址操纵发动机的基础上正则表达式。它的行为是像Apache的 mod_Rewrite ,但专为微软的Internet信息服务( IIS ) 。 ISAPI_Rewrite是一个ISAPI筛选器的书面纯的C / C + +所以速度极快。 ISAPI_Rewrite让您的自由,超出标准网址计划和发展自己的计划。

第一。首先到官方网站下载ISAPI_Rewrite

我的机子是32位的就下32位免费版的,链接地址如下:

http://www.helicontech.com/download/isapi_rewrite/ISAPI_Rewrite3_0064_Lite.msi

可以选择不同版本:http://www.helicontech.com/download.asp

第二:安装

安装ISAPI_Rewrite3,一路next,默认安装到了服务器的 C:\ISAPI_Rewrite3(目录自由设置,但需保证有iis浏览的权限),接着打开IIS-web服务扩张-右键-添加一个新的web服务扩 展,扩展名字写ISAPI_Rewrite,要求文件C:\ISAPI_Rewrite3\ISAPI_Rewrite.dll,并且设置为允许。

配置IIS

打开iis,右键你的站点属性–ISAPI 筛选器–添加–筛选器名称是ISAPI_Rewrite3 –可执行文件就是ISAPI_Rewrite.dll的路径,比如C:\ISAPI_Rewrite3\ISAPI_Rewrite.dll

给用户网站主机头加上“network service”的读权限,其实就是该用户网站的文件夹的网络读写权限。

安装IIS Rewrite3后,会在全局的网站下 “iis> 网站 》属性> isapi 筛选器”选项里面,删除 isapi_rewrite3这个ISAPI筛选器,必须去掉这个isapi_rewrite3筛选器,否则其它的网站(除首页外)的页面无法访问!

最后重启iis
当然你可以把ISAPI_Rewrite3目录放入站点根目录下,但记得要给一个users和”network  service”的读权限。

注意:有些服务器或者vps有做权限的,安装后httpd.conf可能只有everyone和system的权限,如果修改不了文件就添加一个administrator的权限

注意:如果服务器上网站较多,而仅仅要设置其中的一个,重新打开IIS-网站-右键属性 -ISAPI筛选器,把里面的ISAPI_Rewrite删除,到需要设置防盗链的网站-右键属性-ISAPI筛选器-添加一个新的筛选,筛选名称 ISAPI_Rewrite,可执行文件C:\ISAPI_Rewrite3\ISAPI_Rewrite.dll。这样就仅对一个网站设置伪静态了。

第三步:设置

开始菜单-所有程序-Helicon-ISAPI_Rewrite3-ISAPI_Rewrite Manager打开,点击edit加入如下规则:

# Helicon ISAPI_Rewrite configuration file
# Version 3.1.0.64

#伪Html部份
RewriteRule /test-(\d*)-(\d*).html /test.aspx\?id=$1&amp;aa=$2

(写法请参照正则表达式)

因为使用的是免费版,所以只能对整个站点进行设置,这个设置将对你服务器上的所有网站生效,如果是正式版的话,将会对所有不同的网站进行单独的设置。

原test.aspx的代码为:


<form method="post">  id号为:&lt;%=id%&gt;,name号为&lt;%=name%&gt;</form>

test.aspx.cs的代码为:

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&gt; protected int id = 0;
protected int name = 0;

private void Page_Load(object sender, System.EventArgs e) {
if (!Page.IsPostBack) {
try {
id = int.Parse(Request.QueryString["id"].ToString());
}
catch { id = 0; }
try {
name = int.Parse(Request.QueryString["name"].ToString());
}
catch { name = 0; }
}
}

第四步,测试:

在地址栏输入:http://localhost/test-4-1000.html

网页显示结果为:id号为:4,name为1000

测试通过。