存档

‘日常’ 分类的存档

香蕉派环境配置(二)之合并分区

2014年8月14日 1 条评论

经过一段时间的运行,香蕉派里磁盘空间很快就满了。使用 df -lh 命令,可以看到 /dev/root 占用率已经达到 100%。这个现象让我很是迷惑,当初买SD卡时我买的是8G大小,难道这么快就用光光了?对于 Linux 我不懂,顿时慌了手脚,于是就在考虑是买一个更大容量的SD卡,还是考虑采用移动硬盘的方式,还是把香蕉派扔掉的犹豫中渡过了几个不眠夜。

目前我的香蕉派里就安装了Nginx、PHP、Mysql,加上系统本身的空间,内容应该没有特别大。

在一次偶然的过程中,我打开了Disks程序,突然发现SD卡,里面还有大约4G的空白空间。我的第一反应是还好自己放在购物车里的订单还没有支付。既然有剩余空间就比较好处理了,用一些工具应该可以实现。可惜我不会,只好求助网络。

网上搜索有帖子说,对于Linux系统一旦安装好,那么分区就是固定的了,一个处理不好连系统无法启动。我这边看到有2个分区,第一个分区不到100M,应该是引导分区,第二个分区就是实际用的。剩余4.3G是剩余空间,还没有分区。

以root登录系统,使用 Disks 工具,选中那个4.3G的空白空间,然后格式化并添加。记得是快速格式化,磁盘格式选择和主分区一致的Ext4格式。

现在就该使用解决问题的命令fdisk了,命令格式:fdisk <存储设备名>  //如: fdisk /dev/sda
进入fdisk 后,使用单键命令
m 显示Help

p  列出所有分区
d  删除分区
n  新建分区
w 存盘退出
q 不存盘退出

对主设备进行fdisk,对于香蕉派,命令是:sudo fdisk  /dev/mmcblk0。

按 p 键 列出所有分区,可见有三个分区。第一个分区是 FAT32分区,是引导用的,第二个分区是Linux 主分区,第三个分区是刚添加的那个4.3G的空白分区。记下Linux 主分区的Start Sector号 ,我的是102400。

按 d 键 Partition Number (分区号) 选 2, 删除linux主分区(第2个区)。再按d键, Partition Number (分区号) 选 3,  删除4.3G的空白分区(第3个区)

按 p 键 列出所有分区,可见只剩第一个分区了

按 n 键,重新创建linux主分区
Partition Type(分类类型) 选 P (Primary)
Partition Number (分区号) 选 2

First Sector(起始Sector) 一定要输入刚才记下来的Start Sector号(我的是102400),默认直接回车也可以。Last Sector (终止Sector)用默认值,直接回车。

按 p 键 列出所有分区,可见有两个分区,linux主分区在第2个,起始位置是原位置。 按 w 键 存盘退出fdisk。

接下来,立即重启,不要做任何其它事情

sudo reboot

重启并登录后,立即用以下命令sudo resize2fs /dev/mmcblk0p2 ,该命令将把第二个分区扩展到新的空间中。现在查看一下硬盘使用情况,OK了。无论是用 Disks 程序还是 df -lh 命令,都可以看到主分区有7G多了。

上述操作的原理是:首先删除了linux主分区和空白,重建的主分区起始Sector位置与原主分区一致,再resize2fs,则原主分区数据完全没变,但改变了主分区的大小。

至此,香蕉派的分区合并就完成了,衣服自己洗很是高兴,希望对手头上有树莓派/香蕉派的同学有帮助。

香蕉派环境配置(一)之用户修改

2014年8月14日 没有评论

上一篇,衣服自己洗为大家分享了香蕉派的基本知识。这是第二篇,关于环境配置的一些细节。

按照官方的流程,先格式化SD卡,然后写入系统镜像,完成后插入SD卡,开机引导即可进入系统,很是简单。我使用的是 Ubuntu 的镜像。

官方的镜像里的帐号是 Lemaker/bananapi,root/bananapi。我们先通过 Lemaker 用户进入系统,屎黄色的桌面背景很是醒目哟。

对于用户而言,第一个要做的就是添加自己喜欢的用户名,修改 Lemaker 貌似会出问题,可能是镜像的原因吧。开始菜单,设置,用户和群组,添加用户,设置自己喜欢的用户名和密码,设置类型为 Administrator,我有注意到官方的用户类型的 Customer,不太清楚这个区别有多大。

然后注销,以刚创建的用户名登录,进入到系统后,删除 默认的Lemaker用户。接下来就是修改主机名了,修改 /etc/hostname 文件,例如Lubuntu,保存退出,然后重启。

这个时候,我们在使用需要 sudo 权限的命令时,界面上会每次都显示 sudo:unable to resolve host Lubuntu,出现这个的原因在于系统对于主机名的解析不识别。解决方法也很简单,修改 /etc/hosts 文件,添加对本地的映射,内容如下:

127.0.0.1    localhost  Lubuntu

保存退出即可。

 

分类: 日常 标签: , , ,

c#应用程序获取管理员权限

2014年8月12日 没有评论

从vista开始,微软对操作系统的安全性下足了功夫,对于敏感操作例如C盘文件、注册表打开等,都会弹出对话框让用户确认选择。

在这样的机制下,一些恶意程序就得到了抑制,不会再像XP那样,后台偷偷运行用户都不知道。今天衣服自己洗,要和大家分享的是,如何获取管理员权限。

对于敏感操作,如果没有管理员权限,那么操作会失败。为了避免这样的情况,有的时候主动要求管理员权限,对于正常的应用程序来说,是一个比较好的事情。

c#获取管理员权限,大致有2中方式:

1、代码方式。在应用程序的入口函数里添加下面的代码,思路是这样的,启动的时候,获取当前用户的身份,如果已经是管理员了,那么就直接运行对应的窗体。如果不是,那么通过新开进程的方式。代码很简单,就不加注释说明了,加粗的那行代码就是最关键的。

System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);

if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
{
Application.Run(new frmMain());
}
else
{
ProcessStartInfo info = new ProcessStartInfo();
info.UseShellExecute = true;
info.WorkingDirectory = Environment.CurrentDirectory;
info.FileName = Application.ExecutablePath;
info.Verb = “runas”;

Process.Start(info);
}

如果当前用户是普通用户,调试程序获取管理员权限,并不需要VS开发环境是管理员权限运行的,不需要退出VS再以管理员权限打开,是不是很方便呀?在这样的情况下,是无法断点调试的。衣服自己洗就碰到了这样的情况,如果想要断点调试,那么就要选择附加到进程的方式才可以。

对于C++其它语言来说,获取管理员权限,思路和这个差不多,所以这个方法算是大众思路了。

2、配置文件方式

.Net framework给予我们另外一种方式,通过添加manifest文件来实现获取管理员权限的需求。在项目中,添加一个manifest文件,menifest文件也叫做“应用程序清单文件”。

默认创建的清单文件里,requestedExecutionLevel节点即描述了程序运行需要的权限。修改为下面的内容即可:

<requestedExecutionLevel level=”requireAdministrator” uiAccess=”false” />

其实在里面的注释里也有,从注释里拷贝一下也是可以的。

分类: 日常 标签: , ,

一种mysql 无法登陆的解决办法

2014年7月8日 没有评论

由于工作需要,在内网里假设论坛,本来是打算使用windows系统的,可是下载数据库,很久都没有下载回来,只好放弃而改用linux服务器。

服务器居然是Redhat 的系统,一路各种安装,但是在安装mysql时出错了。

安装mysql后,使用命令登录mysql居然报错了,Mysql ERROR 1045 (28000): Access denied for user ‘root’@’localhost'(using password: NO),这个错误搞得很郁闷,可能是密码在配置mysql的时候异常,所以导致我们没有正确的密码,知道问题后,立即想到解决办法了,那就是重新设置一个密码,方法如下

1.先关闭mysql并设置密码
1.#sudo /etc/init.d/mysql stop
2.#sudo mysqld_safe –user=mysql –skip-grant-tables –skip-networking &
3.#sudo mysql -u root mysql
4.mysql> UPDATE user SET Password=PASSWORD(‘pas’) where USER=’root’;
5.mysql> FLUSH PRIVILEGES;
6.mysql> quit

2.重启mysql并尝试登录
1.#sudo /etc/init.d/mysql restart
2.#sudo mysql -u root -p
3.Enter password:
4.#输入密码,出现下面这个就表示登录正常了
5.mysql>

Mysql ERROR 1045 (28000): Access denied for user ‘root’@’localhost'(using password: NO)这个错误在使用phpmyadmin登录的时候只提示(28000),同时phpmyadmin也会提示密码出错,按以上方法设置之后就可以用新密码登录phpmyadmin了。

登陆成功,剩下的就是拷贝文件,然后进行论坛的初始化操作了,这里就不提了。

分类: 日常 标签: ,

inno setup初探

2014年6月10日 没有评论

由于工作的原因,需要对应用程序制作安装包。在以前的项目中,都是使用的 InstallShield  来做的安装包,最近的一个项目是从一个日本开发团队的项目中新建的一个分支,他们原本的安装包都是使用 Inno Setup 来创建的,结合项目背景和安装包的复杂度,我们就踏上了inno setup的路。

inno setup 相对于 InstallShield 轻量了很多,也是使用了 iss 作为安装脚本文件的后缀。常量的定义也大大方便了开发人员。

下面描述下常见的常量

AppId 应用程序唯一ID
AppName 应用程序名称
AppVersion 应用程序版本号
AppPublisher 应用程序制造商
AppSupportURL 应用程序厂商的URL

DefaultDirName 默认的安装路径
OutputDir exe安装包的输出路径
UninstallDisplayIcon 卸载程序的图标

上面的几个变量中,第一部分的信息会显示在添加删除程序中,尤其以AppId最为重要,操作系统以此来区分不同的应用程序。如果是同一个应用程序不同的版本,请保证该变量始终是相同的。inno setup可以帮助生成GUID格式的AppId。

而[Files]段是描述了拷贝文件的路径和方式,例如下面的

Source : “{#SourcePath}\WinGather.exe”; DestDir: “{app}”; Flags: ignoreversion

意思就是把 SourcePath 定义的目录下的 WinGather.exe 程序拷贝到程序的安装目录下。{app} 是一个系统变量,表示程序在用户机器上的安装目录。ignoreversion 是在拷贝的过程中忽略版本的不同。

如果一个应用中有很多个文件需要拷贝,有的还包括子目录,都这样写就会很琐碎。于是就有这样的版本:

Source: “{#SourcePath}\ccprompt\*”; DestDir: “{app}\ccprompt”; Flags:ignoreversion recursesubdirs

从这里我们可以看到通配符*的使用,这样就会方便很多哟。此外,recursesubdirs 参数表示如果包含子目录的话,那么连同子目录也一起拷贝。这样 [Files] 就会少很多,尽管有通配符的支持,但是实际应用中要看情况而定,目的是为了避免安装包拷贝时的准确性,如果安装不对劲,也方便查找定位原因。

[run]段的作用是描述在安装的最后一步所要做的操作,多用于启动服务或者清理等操作,例如下面的:

Filename:”net.exe”; Parameters:”stop ccsdk”; Flags:waituntilterminated runhidden runascurrentuser;

这个例子就是调用 net 来停止一个叫做 ccsdk 的服务,同时有3个额外的选项,分别表示等这个操作完成后再进行后续的安装,不显示界面,以当前用户即管理员权限运行。如果运行一个命令行或者批处理,如果不使用 runhidden,那么在界面上就会看到有一个窗口一闪而过,体验不是很好。

[uninstallDelete]段的作用是描述在卸载的时候,要删除的文件,多用于程序在运行期间产生的文件例如日志、临时文件等,例如:

Type:filesanddirs; Name:”{app}\log.txt”

上面就是简单的描述了一下,inno setup其实非常简单,环境本身也提供了安装想到和帮助文档,文档里写的是非常的详细。所以我这里几乎没有什么内容可写。对于E文不懂的同学,可以在网上下一个中文版的帮助手册。最后说一下,inno setup的安装脚本是不区分大小写的。

分类: 日常 标签: , ,

为网站添加https支持

2014年5月22日 没有评论

在ququ的日志里,有提及到使用https,当时看到后,很是动心,由于某些原因,最终只是看一看罢了。

前不久苹果发布了 iOS7.1正式版,这个更新有很多功能改进,其中包括对于app的在线安装的要求提示,文件的url地址必须为使用了ssl 的url,否则应用会安装失败。

开始我并不知道,在给客户发布app新版本的时候,发现无法安装。得,这最后还是要使用https 了。于是我马上就想到了ququ 的那个日志,重温下日志后就去了他们的官网 http://www.thawte.com/。

这个供应商提供ssl 证书和应用程序签名。我们这里只需要使用 ssl 证书。其实呢,我一共交易了2次,第一次域名输错了,好在供应商服务很不错,30天内可以退款的。

对于windows 服务器而言,首先需要在 IIS 里设置,打开服务器证书选项,然后选择“创建证书申请”,按照向导一步步地填写下去,需要注意的是,里面涉及的网址就是需要使用ssl证书的网址。此外还有一点是选择加密长度,长度越大,安全性越高,但是解析的时间也越长。衣服自己洗第一次交易就是由于没有填写带 www 前缀的网址,不过好在thawte很厚道,30天内可以随时revoke掉这个证书。

通过这一步,我学会了revoke这个单词,是不是很神奇的样子?好处就是后来我经常revoke苹果的证书。

按照向导创建完申请后,我们进入到 thawte 的网站,开始完成支付流程,并上传刚才创建的证书,输入验证邮箱。如果顺利的话,一天不到输入的验证邮箱里就可以收到他们的邮件了,邮件里还会附加证书内容。然后进入服务器,导入证书。最后选择网站,设置证书就可以了。这几个步骤就非常简单,衣服自己洗就略过不提啦。

很简单,对不对。

顺利的话当然简单,衣服自己洗就不顺利。在验证邮箱的时候,网页里提示你选择验证邮箱,比如说网站是 withonly.com,那么就有 admin、administraotr、webmaster 这样的前缀可以选择,同时,网页还提供了自定义的文本框。没有想到的是这里居然是一个大坑。衣服自己洗由于是使用的 me 前缀,就选择了自定义模式。结果后面就完全思密达了,邮箱里收不到邮件,交易处于pending 状态,只好找他们的客服,客服很是严谨,各种认证。我和客服说我不会英文,客服居然说她可以说中文,然后要了我的电话给我打过来,诶哟喂,是个妹子的声音你们晓得不啦。

现实生活中屌丝久了,连和妹子说话的机会都没有,所以很高兴有没有。呃,扯远了。所以到时候大家可千万不要选择邮箱的自定义模式,估计这里是他们网站的bug。

到这里证书的是就算完成了,但是整个事情,还没有完成。我们输入 https://www 这样的网址,是可以看到地址栏上的锁出现,但是现在一般网站会把没有www前缀的也自动跳转到 www 上。所以还需要额外做一些重定向,把 http 的请求给重定向到 https 上面来。我这人比较偷懒,在服务器上直接使用了 IIRF 组件实现的。

最后,说下价格,我买的应该最便宜的那种 149美元一年。有需要的同学,可以去看看。

 

分类: 日常 标签: , , ,

.Net程序实现多语言

2014年5月8日 没有评论

最近工作中要用到一个小工具,出于快速开发的目的,使用c#作为开发语言,放弃了c++,功能简单,当然是怎么方便怎么来。其它的功能这里就不说了,衣服自己洗这里要分享的就是其中的一个功能,对全球化多语言的支持。

.Net中要实现全球化,是把不同的语言放在不同的字典中,然后运行时动态选择。具体实现来说,可以有2种方式:

1、系统自带的Resources.resx文件

Resources.resx 是.Net提供的一个资源文件,可以提供对字符串,图片、二进制数据的存储,Resources.resx 本质上是一个xml 文件。比如,我们通过 VS 在文件中添加一个字符串,键为 Name,值为 唠叨下。

接下来,是考虑如何在程序中调用,非常简单,我们可以这样写 string name = Properties.Resources.Name;

注意这里的Name即为我们在Resources.resx里定义的键。之所以可以这么来调用,是由于VS自动帮助我们在 Resources.Designer.cs文件中定义了相关的方法。如果细心点,你会发现还可以使用Resources.ResourceManager 的GetString()方法和GetObject()方法,也可以达到相同的目的。拿到了值后,我们就可以做对应的显示了。

上面是第一步,接着我们来进行第二步。我们直接复制Resources.resx文件,并粘贴后改名,例如Resources.en-US.resx。这里需要说2点,一个是文件名格式,en-US是语言。另外一个是重命名后,Resources.en-US.Designer.cs里的内容给清空了,这个是没有关系的。事实上如果不清空,编译会报错。

这个时候,编译我们的工程,会发现在bin目录下生成一个en-US目录,里面有一个dll文件。默认的Resources.resx不会生存额外的文件夹,会直接编译到主程序中。

最后,我们需要添加显示,不然程序运行始终显示的是里的字符串。在程序的入口添加下面的代码,表示以当前系统的显示语言作为程序的语言。
Thread.CurrentThread.CurrentUICulture = new CultureInfo(System.Globalization.CultureInfo.CurrentUICulture.Name);

有的软件可能想要提供一个菜单,供用户主动选择语言,那么在初始化的时候,可以传入语言参数,例如 new CultureInfo(“zh-CN”)等等。

经过上面的处理,程序在运行的时候,就会得到我们需要的语言。

2、自定义的方式

上面的方式在编译后,会根据不同的语言生成对应的文件夹。例如我要做的小工具,就要生成28个国家的文件夹。看起来是不是很猥琐?我这里做过尝试,把所有的语言文件夹移动同目录下的一个新文件夹中,例如 Language 是不可行的。

还比如说,多语言的翻译和开发是同步进行的,希望以后再不重新编译版本的情况下新增别的语言等等各种需求,我们可以自定义。

不想要那么多文件夹,可以把所有的多语言翻译都放在Resources.resx文件里,并添加语言前缀,例如zh-cn_Name等等,利用Resources.resx会被编译到主程序的原理,就解决了过多的文件夹的问题。

对于想要动态新增语言,就只好将多语言放到数据库或者xml配置文件里,按语言取名,程序读取的时候来解析数据库或者xml。好处是只要新增了xml,程序不需要编译就支持了。缺点是由于可以修改,如果用户手动修改的话,可能会导致一些意外产生,不过额外做一些加密操作应该可以过滤掉大部分误操作。

衣服自己洗在上面介绍了2种方式,各位同学可以根据实际情况灵活采用不同的方式。满足了老板的需求,剩下的就是喝啤酒泡妹子去了。

分类: 日常 标签: ,

c++程序窗口不在任务栏上显示

2014年4月18日 没有评论

一般说来,程序在运行的时候,会在任务栏上显示图标,当然XP系统还是会一起显示程序的标题。虽然加班是不变的,而需求是一定变化的。出于某些需要,要实现程序在运行时不显示窗体。对于c#程序而言,只用设置 ShowInTaskbar = false 即可。而对于c++程序,还不能这么简单的使用。

今天衣服自己洗分享的是使用 ITaskbarList 接口来实现c++程序窗口不在任务栏上显示的目的。

从IE4开始,window提供了ITaskbarList 接口,我们可以简单地调用即可。

首先我们需要添加头文件的引用    #include “ShObjIdl.h”

然后,我们在代码里添加这样一个方法:
void ShowInTaskbar(HWND hWnd, BOOL bshow){
HRESULT hr;
ITaskbarList *pList;
hr = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER,
IID_ITaskbarList, (void **)&pList);

pList->HrInit();

if (bshow){
pList->AddTab(hWnd);
}
else{
pList->DeleteTab(hWnd);
}

pList->Release();
}

最后一步,在窗口初始化的时候,调用这个方法即可。两个参数分别为窗体的句柄,是否显示。

分类: 日常 标签: , ,

桌面程序调用metro/modern应用

2014年3月17日 没有评论

在我的上一篇文章《自定义协议及其在metro中的应用》中,描述了如何在metro应用程序中调用桌面程序。当然,现在微软为了避免版权的问题,已经把metro改名为modern了。今天,项目的需求恰好和这个相反,是由桌面应用程序来调用metro应用。

在以前的文章中,我提到了自定义协议,这次我也寻思着是不是可以一样通过自定义协议来解决。网上狂搜索了一把,还是google给力,在msdn上找到了解决方法,这里给记录下来,方便国内的用户。

首先,我们打开项目,找到Package.appxmanifest文件,然后切换到“声明”选项卡,添加一个协议,同时设置一个名称,例如sgy,其它的信息都是可选的,看着输入好了。

接下来,我们找到App.xaml的代码文件,找到 OnActivated方法,在这个方法里添加代码即可。

protected override void OnActivated(IActivatedEventArgs args){
if(args.Kind == ActivationKind.Protocol){
ProtocolActivatedEventArgs eventArgs = args as ProtocolActivatedEventArgs;
//eventArgs.Uri.AbsoluteUri 就是我们要的数据了,剩下的就是字符串参数操作了
}
}

到这里就差不多完成啦,是不是很简单~

接下来就是程序调用部分了,比如说我们想调用程序并传递一个 wifilist 参数,可以这么来调用:sgy://wifilist,就和打开一个网页是一样样的。操作系统会在安装app的时候帮我们建立sgy协议和metro程序的关联,不需要我们操心在注册表里设置关联了。略有遗憾的是参数只能是字符串形式,如果参数是对象的话,就需要实例化转换成字符串了。

分类: 日常 标签: , ,

win8.1清理无线网络连接信息

2014年3月15日 没有评论

从XP开始,一直到win8,都可以对本机曾经连接过的无线网络信息进行管理。以win8为例,只需要在网络连接上面点击右键,选择“忘记网络”即可。

但是win8.1居然没有,我想删除掉曾经使用过的无线网络连接,洁癖嘛你懂的。找了很久都没有找到,一个偶然的机会让我给发现了。

打开命令行,输入netsh wlan show profile,然后会显示所有的曾经连接网络连接,当然也包括现在正在使用的。一行一条记录,并且会把网络连接的名称显示出来。

接着再输入netsh wlan delete profile name=”网络连接” 回车即可。英文双引号是必须的。要知道解决了这个问题,心里很是舒坦。

分类: 日常 标签: , ,