[转载]详解Vs2008下打包安装程序的一些技巧(含win7下提权限、卸载以及安装时定向到网页) - royen - 博客园

mikel阅读(1091)

[转载]详解Vs2008下打包安装程序的一些技巧(含win7下提权限、卸载以及安装时定向到网页) – royen – 博客园.

笔者才疏学浅,文中叙述不当之处还望各位园友指出~

1、怎么使得程序窗口左上角和任务栏有图标,如下图所示:

         

其实这个问题不应该放到程序打包这部分讲,只不过对于一些初学者而言,在这提下也许会有很大的帮助(想到自己刚学.net那会了,呵呵)。方法之一的话就 是先添加一个图标文件到项目中,然后切换到每个界面设计器,右键窗体的属性,在属性窗口有个Icon选项,下面的也就不用多说了吧~

2、 先新建一个空的解决方法,File->New->Project->Other Project Types->Visual Studio Solution->Blank Solution,这儿取个名称SetupDemo:

如图:

3、在解决方案中添加个项目工程,右键上图中的解决方案,点击 Add->New Project,选中Windows Form Application模板,输入SetupForm,结果如下:

4、给项目添加些基本信息:

在上图中,右键SetupForm后单击Property或者直接双击上图中的Properties,会出现下图

左侧很多选项卡,所以可以更改的东西很多,大家可以视需要而定制,这没必要赘述。大家可以点击上图中的Assembly Information 按钮,添加项目出品公司信息,如下图所示:

5、本来这应该讲添加安装部署项目了,但是对于在Windows7上开发的朋友们,还需要加上额外的一部,那就是关于程序安装后的权限问题。大家知道, 从Vista开始Windows操作系统便加入了UAC机制,所以问题就出现了:如果我们制作的程序被安装到了系统盘了会怎样?有心的会发现,当程序进行 一些诸如IO操作的时候,这些都会被操作系统要求以管理员权限运行,否则所有的操作会被系统拒绝。

如果直接进入安装部署项目的操作的话,这样打包出来的安装包即便你以管理员权限运行安装了。但是,出现在桌面上的图标快捷键右键时候却没有“以管理员权限运行这一选项”,除非你直接切换到安装目录,右键exe文件以管理员权限启动~

解决方法是,右键SetupForm项目,添加一个应用程序描述文件,如下图:

直接点击添加即可,这时候打开文件会出现以下内容:

想必不用多说了吧,把 level=”asInvoker” 按调用者权限 改成 level=”requireAdministrator”管理员权限就OK啦。

建议将该文件拖入Properties目录下,如下所示:

 

6、添加安装部署项目,右键解决方案后Add->New Project->Other Project Types->Setup and Deployment,输入MySetup后确定,结果如下:

7、右键上图中的MySetup->View->File System,确定后如下图

解释下上图中几个文件夹的意义:

Application Folder——所有的项目的Release文件夹或Debug文件夹下的资源文件、可执行程序以及描述性文件等都需要放到这

User‘s Desktop——用户桌面,在这下添加快桌面捷键,安装完了会在用户桌面产生快捷键

User’s Programs Menu——用户开始菜单,也是添加快捷键的地方,不过是在用户开始菜单,多个项目打包在一块的话,最好在该文件夹下建个文件夹

好了,一步步来

1)Application Folder

先是右键Application Folder->Add ->Project output,出现以下的窗口:

由于只有一个项目,所以上面的下拉菜单中只有SetupForm一个选项,这儿我们选择Primary output,即可。

当然,如果项目中的文件种类比较多,你也可以右键Application Folder->Add->File,然后浏览到项目的目录,将项目的Release或Debug文件夹里面的东西一股脑儿的添加进来~

2)User’s Desktop

在右侧分割的窗口中右键->Create New Shortcut,在出现的窗口中双击Application Folder,选中刚刚添加那个Project Output文件即可。这时候安装到桌面时候快捷键图标还是默认图标,如果定制自己的图标的话,则需要在右键刚刚建立的快捷键,到属性窗口有个Icon属 性,单击浏览,如下所示:

        

单击Browse                                                                    Icon选择窗体

 

双击Application Folder,如果在第 1)步骤中你添加了Icon文件的话,可以看到这些图标并可以选择,没有的话那就回到步骤1)添加呗~

3)User’s Programs Menu

步骤同上,不过需要提醒的是多个项目打成一个安装包的时候,这下面最好先建个文件夹然后再添加那几个快捷键~

8、到这一步,便可以右键MySetup后Build下,然后找到MySetup目录下的Release或者Debug文件下,便会有安装包啦~

 

9、没完呢,要想添加个卸载程序怎么办呢?

方法:在7中的第1)步骤,给Application Folder还得添加个东西,右键Application Folder->Add->File,然后在你的系统盘下的Windows/System32目录下添加 msiexec.exe,该文件是什么想必不用多说了把~添加了后,关键是在开始菜单下添加个删除的快捷键~于是,在7中的第3)步骤中添加的文件夹下, 再创建一个快捷键,命名为Uninstall,如下:

右键Uninstall快捷键,打开其属性窗口,有个Arguments属性,如下所示:

输入 /x 安装包的Productcode,这个ProductCode怎么获得呢,方法是左键单击MySetup安装包项目,然后点击属性窗口,会在该窗口找到Product code 属性,将该code复制到/x 后面即可,下图:

这时候卸载功能已经添加进去了~

 

10、还没完呢,如果想要安装程序在安装时候或者卸载的时候打开浏览器定位到指定的网址怎么办?

这个问题本人只在XP系统下解决了,win7系统下貌似不起作用,囧~期待园友的解决方案

说说在XP下怎么解决的把:

大家右键部署项目MySetup->View->Custom Actions 选项,如下所示:

出现Custom Actions编辑界面:

以上是程序安装部署到卸载的四个阶段,每个阶段都可以添加执行exe、dll或者vbs类型的命令,由此看来至少可以有三种方法实现~下面我便用后两种分别完成这个功能~

1)VBS脚本

新建个脚本,内容如下:

Set openWeb=CreateObject(“Wscript.shell”)

openWeb.run(“www.cnblogs.com/royenhome”)

保存为Internet.vbs,然后将该脚本添加到Application Folder,在Custom Actions编辑界面的相应阶段将该脚本添加进去~添加方法,呵呵,不用多说了把~

2)dll方法

在解决方案下新建个类库项目,取名为OpenWebDll,如图:

删除class1.cs,然后给类库添加个Intaller类,如下所示:

该类继承了Installer类,我们打开添加的类文件,在文件中override相应的方法,如希望在卸载时候打开网址,如下所示:

Build下该类库,然后在MySetup的Application Folder文件夹下添加该项目的Project Output,然后切换到Custom Actions编辑界面的Uninstall添加该Output,同时确保Install下也添加该Output文件,否则安装会提示找不到 xxx.installstate文件~具体操作见下图:

       

Build下就OK了

11、至此,本文真的完了~

[转载]c#winform中使用WebKit传递js对象实现与网页交互 - 博君一笑的窝窝 - 博客频道 - CSDN.NET

mikel阅读(2293)

[转载]c#winform中使用WebKit传递js对象实现与网页交互 – 博君一笑的窝窝 – 博客频道 – CSDN.NET.

有个项目要使用WebBroswer控件,并且要能传递一个js对象供前台调用,用C#的WebBroswer控件很容易实现:

  1. private void Form1_Load(object sender, EventArgs e)  
  2. {  
  3.     WebBrowser wb = new WebBrowser();                      
  4.     wb.ObjectForScripting = new myClass();              
  5. }  

要传递的js对象必须使用[ComVisibleAttribute]标记为COM 可见:

  1. [System.Runtime.InteropServices.ComVisibleAttribute(true)]  
  2. class myClass  
  3. {  
  4.     public void Test()  
  5.     {  
  6.         System.Windows.Forms.MessageBox.Show(“alert:Test”);  
  7.     }  
  8. }  

这样前台就能使用window.external调用myClass的方法: window.external.Test();

如果就这样那就简单了 ,可偏偏项目使用的网站对IE的兼容性极差(吐槽下:个人觉得是IE太烂了,对标准的支持太差),无奈之下想找寻其他类似的WebBrowser控件,发现几个不错的替换控件:

  1. GeokoFx:一个Firefox的Geoko引擎的Windows Forms包装,google上的下载地址:http://code.google.com/p/geckofx/ 官网:http://www.geckofx.org/
  2. WebKit.NET:webkit的.NET封装,下载地址:http://sourceforge.net/projects/webkitdotnet/

本来决定使用GeokoFx,因为项目使用的网站用火狐打开是很快的,但是我找了几天资料也没发现怎么传递个js对象给控件,当发现Qt的 webbroswer控件也是封装的WebKit控件时,遂决定使用WebKit,但WebKit.NET也没有直接提供传递对象的方法,后来发现又一个 好东西:

  1. open-webkit-sharp:对webkit.net的又一次封装,提供了很多新功能。google上下载地址:http://code.google.com/p/open-webkit-sharp/

下面的使用就非常简单了,下载open-webkit-sharp后,把Core文件夹和References文件夹下所有文件拷贝到你的工程目录 下,然后打开你的项目,添加引用OpenWebKitSharp.dll和WebKit.Interop.dll(如果你的项目运行在.NET Framework 2.0 或 3.5 引用 Binary_NET2文件夹下的这两个文件,NET4.0的话就引用Binary文件夹下的这两个dll);然后就是工具箱->选择项-> 选择OpenWebKitSharp.dll,然后从工具箱中把WebKitBrowser拖到你的窗体上.现在已经成功了一大步了,但是为了避免使用时 遇到各种错误,我们需要先安装两个支持文件:

  1. Microsoft C++ 2005 Redistributable http://www.microsoft.com/download/en/details.aspx?id=26347Windows XP/Vista/7 32/64 Bit
  2. Apple QuickTime (Optional – for better HTML5 Support)

Ready!开始传递对象:

  1. private void Form1_Load(object sender, EventArgs e)  
  2. {  
  3.     this.webKitBrowser1.Navigate(“http://yourWebSiteUrl”);  
  4.     this.webKitBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webKitBrowser1_DocumentCompleted);  
  5. }  
  6. void webKitBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)  
  7. {  
  8.     this.webKitBrowser1.GetScriptManager.ScriptObject = new myClass();  
  9. }  

前台调用方式类似IE的webbroswer,也使用window.external调用,你也可以自己定义一个对象:

  1. this.webKitBrowser1.GetScriptManager.EvaluateScript(“var obj=window.external;”);  

这样调用的时候就能用你自己定义的对象名访问了。

应该也有直接自己定义对象的方法,但是open-webkit-sharp中文的资料实在的不多,耐着性子看了几天老外的论坛,一水的全是吐槽,实际解决问题的不多。等有更好的方法,也请大家不吝赐教。

[转载]C# C/S程序获取MAC地址三种方法 - 澜紫癜青 - 博客园

mikel阅读(931)

[转载]C# C/S程序获取MAC地址三种方法 – 澜紫癜青 – 博客园.

之前为了自己的共享软件,曾萌生过靠共享软件发财的想法,从而考虑通过绑定注册用户的MAC地址,从而实现正版用户与盗版用户的验证

研究了很多次,在笔记本,台式机,老式台式机(2002年到2009年之间的老式机器)上试验自己的程序

发现读取客户端的MAC地址有三种方法比较靠谱,献给大家我的测试结果

1.通过System.Net命名空间获取客户端当前启用的网络连接的网卡地址

#region 返回当前系统所启用的网络连接的信息
       public static NetworkInterface[] NetCardInfo()
       {
           return NetworkInterface.GetAllNetworkInterfaces();
       }
       #endregion
       public static string[] GetMacString()
       {
           string strMac = "";
           NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
           foreach (NetworkInterface ni in interfaces)
           {
               if (ni.OperationalStatus == OperationalStatus.Up)
               {
                   strMac += ni.GetPhysicalAddress().ToString() + "|";
               }
           }
           return strMac.Split('|');
       }

2.通过WMI读取系统信息里的网卡MAC

public static string[] WMIGetMACString()
       {
               //获取网卡Mac地址  
               string mac = "";
               ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
               ManagementObjectCollection moc = mc.GetInstances();
               foreach (ManagementObject mo in moc)
               {
                   if ((bool)mo["IPEnabled"] == true)
                   {
                       mac+= mo["MacAddress"].ToString()+"|";
                   }
               }
               moc = null;
               mc = null;
               return mac.Split('|');
       }

3.注册表读取方法(那种没装360,从来不打补丁,盗版修改版系统的用户要排除掉)

有1个路径

常规用户通过Windows Genuine Advantage可以获取到物理网卡地址。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Genuine Advantage

PS:

第一种方法有以下两种缺陷

a.如果当前的网卡是禁用状态(硬件处于硬关闭状态),取不到MAC地址,MAC地址会返回为空。

b.如果当前启用了多个网卡,返回的地址是最近启用的网络连接的信息,假如说你获取的是个USB网卡呢,那就o(╯□╰)o了

第二种方法有很严重的一个缺陷,那就是依赖WMI的系统服务,如果系统服务缺失或者出现问题,WMI获取恐怕就很难

第一种PK第二种,优点很明显那就是不依赖服务,返回的信息可以直接构造成为数据,比如图片中的dataGridView绑定。

第三种是利用微软的正版验证程序所获取的信息,信微软则可以考虑,但是经过我的实地测试,在台式机上获取好像不太准确,会有两个MAC地址(实际只有一个物理网卡)

再提到一些不太靠谱的方法,个人所见,也许有人不赞同,但是请您将您的测试发出来

1.协议方法,通过网络协议获取客户端的IP再通过ARP协议转换成为MAC地址,

2.通过command命令行,比如说IPCONFIG 之类的,

3.通过扩展协议,比如说抓包程序,分析报文之类的

4.通过WIN32 API

这些方法都存在通用性不强,

1,2,3依靠C#执行别的代码就要通过那个什么CLR转换,效率太低,感觉就是很卡,而且通过new Process之类,线程之类的话,又存在休眠,效率守护之类囧。

4,他只能通过WIN的操作系统核心函数去取,不同WIN操作系统很可能这些核心函数的参数或者语法就不一样。

[转载]js 获取多个mac地址(支持火狐与google) - 一天进步一点 - ITeye技术网站

mikel阅读(979)

[转载]js 获取多个mac地址(支持火狐与google) – 一天进步一点 – ITeye技术网站.

BS项目中要实现mac地址验证,只能在js获取mac地址,而网络上很多写法都是调用微软ActiveX,而此有几个缺点:

 

1: IE核心浏览器会弹出提示,很多客户会误以为是病毒,而点击否

2: 不支持非IE浏览器

3: 无法跨平台

所以只能采用别的处理办法,那能不能从别的地方下手呢?

 

答案是肯定的,一下是我的想法,大家可以在我的基础上进行拓展。

 

1:  js读取xml

2:  通过批处理获取mac地址并生成XML

 

以下是代码:

 

html 通过js获取xml文件

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<BODY>
</BODY>
</HTML>
<SCRIPT>
var progId, progIds = ["MSXML2.XMLHTTP.6.0" , "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];

function getXMLHttpRequest()
  {
   if (!window.ActiveXObject) {
    return new XMLHttpRequest();
   } else if (progId != null) {
    return new ActiveXObject(progId);
   } else {
    for (var i = 0; i < progIds.length; i++)
    {
     try {
      return new ActiveXObject(progId = progIds[i]);
     } catch (ex) {
      progId = null;
     }
    }
   }
  }
  function loadClass(src)
    {
     try
     {
      var xmlHttp = getXMLHttpRequest();
      xmlHttp.open("GET", src, false);
      xmlHttp.send(null);
      var stus = xmlHttp.status;
      if (stus == 200 || stus == 0 || stus == 304)
      {
       return xmlHttp.responseText;
      }
     }catch(ex){
        alert("error!");
     }
    }
var e =  loadClass("c:\\WINDOWS\\system32\\22.xml");

alert(e);

</SCRIPT>

通过bat 生成dos

@ECHO OFF
color 01a

@ECHO  系统启动中,请不要中断
C:
if not exist "c:\WINDOWS\system32\22.XML" (

for /f "delims=: tokens=1*" %%a in ('ipconfig/all^|find "Physical"')do echo %%b>>c:\WINDOWS\system32\22.xml

)
ping /n 2 127.1 >nul
rem 地址修改成需要的地址
 start http://localhost/
@ECHO 恭喜你 启动成功
pause

[转载]分享一套 CodeSmit 代码生成模板。 - JimHappy#真嗨皮#郑海滨 - 博客园

mikel阅读(881)

[转载]不再害羞,过程比结果更重要;分享一套 CodeSmit 代码生成模板。 – JimHappy#真嗨皮#郑海滨 – 博客园.

住博客园 5 年了,以前也发过一些博文,但都在 一天后 / 几周后 / 几年后 将它删了;因为感觉代码写得不好:不清晰或侵入太大,哪怕只有一句侵入。

可是最近重写一套 CodeSmith 代码生成模板的时候,发现自己编码能力长进不少:有能力删除大量代码了。删除得很顺利,即使不舍;看上去这是个好事,可也是个坏事:现已难以回忆起当初为什么删这些代码、更回忆不起来最初为什么加这些代码。

这些决策信息的丢失真是让人痛心疾首。

接下来,我要实现一个好玩的东西:维护对象在内存中的引用一致性。这一次,我可不想让那些左右决策的依据不翼而飞了;她们很珍贵:那是我的思路。

 

另外介绍一下上期成果吧,其实就是发个广告啦:

很多人、包括直到前不久离职的我,都在进行着 基于数据库且数据库优先 的简单应用开发。所幸的是大家都使用着相同的实现模式:Entity -(IDal、Dal)- Bll。
于是,我要写一套 CodeSmith 模板,让有缘人看到、使用 或 修改。

包括这套,一共编写了三套 CodeSmith 模板;
第一套实现了基本的可用功能,第二套添加了自认为有亮点的功能,这次重构并删除了那些自认为有亮点的功能;
所以也留下了一些心结:

  1. 枚举类型的字段。虽然可让代码强类型、可读性强,但使用字段注释和类型转换也可弥补。
  2. 视图中的唯一键。这个关系到分页性能,不过如果最多只返回 Top 500 之类的则也没啥差别。
  3. TransactionScope。SQLServer 2000 时需要启动 MsDtc 服务且影响性能,不过 SQLServer 2005 以上就不需要了。
    • 说明

      如果使用 CodeSmith 5.0,则在 CodeSmith 的 Template Explorer 的工具栏中点击第一个按钮(Create Template Folder Shortcut)指向 DatabaseBasedCodeGenerator 文件夹。

      打开 Main.cst,编译后在 Properties 设定必填属性就可运行 Main.cst 了,运行后会生成完整的解决方案。

      是否能编译则还要看你的数据库元素的命名是否重复。

      生成的主要是数据访问的实现:


      其中 Filter 和 Condition 是为了让查询条件强类型而引入的。

      Condition 弥补了 Filter 中条件只能与的缺陷。

      所以,Condition 蕴含的 SQL 是依靠数据库元数据生成的,因为使用 CodeSmith,所以参考了其 SchemaExplorer 命名空间中类的命名:

      下载点这里

[转载]Lambda表达式看到他我一下子就悟了 - 幕三少 - 博客园

mikel阅读(949)

[转载]看到他我一下子就悟了 – 幕三少 – 博客园.

一直对Lambda表达式似懂非懂,平常也用过,就是不太明白有时候还要百度。周六去图书馆看书,看到下面这几句话,一下子就悟了:

  • Lambda表达式(匿名函数),基本形式:

    (intput paramters)=〉expression
    a.只有一个参数时,括号是可选的,两个或者更多用逗号隔开
    b.编译器无法推断输入函数类型时,可以按一下实例中的方式显示指定类型

    int x,string s)=>s.Length>x

    其它参数举例:

    //两个参数
    (x,y)=>x==y
    //一个参数
    x=>x*x
    //零个参数
    ()=>somemethod()

 

  • Lambda语句(与Lambda表达式类似,只是语句在大括号中)

    基本形式:

    (input parametors)=>{ statement}

  • 哈哈,以后再Lambda表达式就不用翻书了,就这么个形式,记住万变不离其中,不管看多少书,做多少练习,最后还是他……

[转载]Visual Studio 2013 Preview - ASP.NET, MVC 5, Web API 2新功能搶先看 - 基点项目师 - 博客园

mikel阅读(892)

[转载]Visual Studio 2013 Preview – ASP.NET, MVC 5, Web API 2新功能搶先看 – 基点项目师 – 博客园.

來自TechEd North America 2013的第一手消息

以下資訊均來自 Channel9 目前於北美 TechEd 活動影片,主要記錄 DEV-B314 這一場 Microsoft ASP.NET, Web, and Cloud Tools Preview 的筆記。

Visual Studio 2013 Preview改良部分

以下將 Visual Studio 2013 Preview 相關內容整理如下:

單一對話視窗

Visual Studio 2013 Preview簡化一開始的新增專案的對話視窗,只區兩大類,進入後也只區分為Empty、Web Forms、MVC、Web API、SPA、Facebook、Mobile。

測試伺服器

測試伺服器不在局限於IIS Express,也可以設置為外部伺服器。

Browser Link

當我們修改頁面文字、Layout、CSS等,可快速重整所有已連接至Visual Studio測試頁面的瀏覽器。

認證組態

在新增專案時即可設置認證組態,目前可結合其他外部Microsoft Live Id、Facebook、Google+、twitter等。

Web Forms改良部分

以下將 Web Forms 相關內容整理如下:

Web Forms引入Bootstrap架構頁面

以 Web Forms 專案為例,開啟 Webform 專案後可以看到新專案範本整合使用了Bootstrap來架構頁面。

另外可使用bootswatch.com來快速改變Bootstrap預設顏色。

Web Forms加入MVC的Scaffold功能

現在 Web Forms 也可以和 MVC 一樣使用 Scaffold 技術快速產生 CRUD 的頁面。

Web Forms新會員系統 – Code first架構

採用新的會員系統,而且預設使用 Entity Faemwork Code first 來進行,這讓我們不在被 Database schema 綁死,可自由擴充與修改。

SignalR v2

內含 SignalR v2 版本。

ASP.NET MVC 5功能增強與改良

以下將 ASP.NET MVC 5 相關內容整理如下:

MVC 5引入Bootstrap架構頁面

與 Web Forms 相同。

MVC 5 Scaffold

MVC 5 Scaffold選項。

MVC 5 – Web API v2 – Attribute Routing

以屬性方式來設置Web API的路由,細節可參考 Attribute routing in Web API

MVC 5 – Web API v2 – CORS

細節可參考 ASP.NET WEB API CORS預覽功能完整剖析

簡報重點

以下將簡報重點相關內容整理如下:

  • Entity Framework 6 新功能有
  • 關於ASP.NET 新範本與 Bootstrap 的使用
  • Visual Studio 2013 Preview功能改良
  • ASP.NET 身分認證改良
  • ASP.NET MVC 5 必須使用 .NET Framework 4.5,.NET Framework 4.0 以下不支援。也就是說,如果你的專案不能升級或使用 .NET Framework 4.5,那麼 ASP.NET MVC 5 和你無緣份了。
  • 新整合的 Scaffolding 系統。
  • ASP.NET SignalR 2.0 必須使用 .NET Framwork 4.5,.NET Framework 4.0 以下不支援。也就是說,如果你的專案不能升級或使用 .NET Framework 4.5,那麼 ASP.NET SignalR 2.0 和你無緣份了。
  • ASP.NET Web API 2.0 必須使用 .NET Framwork 4.5,.NET Framework 4.0 以下不支援。也就是說,如果你的專案不能升級或使用 .NET Framework 4.5,那麼 ASP.NET Web API 2.0 和你無緣份了。
  • OWIN 和 Katana 

 

更多可参见:http://browse.feedreader.com/c/KingKong_Bruce/439476817

[转载]分享.NET单元测试电子书 - ily1322 - 博客园

mikel阅读(965)

[转载]分享.NET单元测试电子书 – ily1322 – 博客园.

引言:

   平时没有项目压力时候,首先想到的是充电学习,要系统学习都会想到购买书籍,或者向同事借阅。买的书多了烦恼 也来了,因为大学到现在5-6年陆续买了上百本开发书籍,面对堆积如山的书,每每搬家,排队,等公车都无法做到便捷。于是想到把这些纸质的书全部转行为电 子书,刚好上次一位好友索要,于是第一次动手自己做了一个PDF电子书,这样每次用Galaxy Note2或Ipad看书,真是太爽了,实在是居家旅行 杀人灭口 必备良药!分享如下:

书籍首页

书籍目录

  

备注:

由于博客园目前文件大小不支持超过10M,所以这边不能提供下载链接。

      

 

 

制作电子书,要扫描每一页为图片,然后再次用PDF进行编辑,制作完一本书真感觉有点自虐,但想到园子里有千千万万这样的学子,所谓我不入地狱谁入地狱。本人制作方式比较老土,如果您有好的快速的制作方法,希望您能提出宝贵意见

后期会陆续提供其他类型开发电子书,敬请期待。

下载方式:

百度网盘支持创建公开链接,但是,百度网盘感觉很不稳定,上传过程老是报服务器出错,如下图所示:

我目前使用的是115网盘,115使用这么久感觉很给力,美中不足的是115不支持创建公开链接,如下图:

所以您如果想下载的话,可能需要注册115账号,给您带来的下载不便,请多理解: 下载 

[转载]网页前端优化之滚动延时加载图片 - 林宇 - 博客园

mikel阅读(994)

[转载]网页前端优化之滚动延时加载图片 – 林宇 – 博客园.

做web开发的朋友都应该掌握前端优化这个技巧,其中一个就是滚动延时加载。这个技巧应用在了很多地方,比如新浪微博网页版。

为什么要延时加载呢?页面加载的时候就显示全部的图片不就得了?有必要多此一举吗?答案是肯定的。当要加载的图片或者内容很多时,如果一次性加载完 毕,那么整个页面将会加载很久,意味着要用户等待很久,这是对用户不友好的。或许你还会问,那不就做个分页不就得了?其实这种滚动延时加载的技巧正是用来 代替手动点击下一页的分页技术。每换一页都要用户点击一次,这也是对用户不友好的。所以才有了滚动延时加载。

我这里把加载图片作为例子,就好像百度图片里的一样,你往下滚动,它就会继续显示下一页的图片。

要求是这样的,比如我要加载20张图片,在页面加载完毕后我先加载5张(前提是5张已经占满浏览器窗口高度),当滚动条滚动到浏览器底部的时候再加载5张,一共加载4次。

原理是这样的,先获取当前浏览器的窗口高度a,然后给页面绑定一个滚动条滚动事件,当滚动条滚动的时候,首先判断时候已经加载了20张,如果小于20张,再获取当前文档距离顶部的高度b以及图片内容的高度c,如果a+b>=c,继续加载5张图片。

我说过,我喜欢以尽可能少的代码以及尽可能简单的demo来为有需要的人展示一些强大的功能,因为所有的东西原理其实都很简单,越简单的demo越容易让人理解和接受。所以代码很少,直接上代码:





页面滚动延迟加载图片

<script type="text/javascript" src="jquery-1.7.2.min.js"></script><script type="text/javascript">// <![CDATA[
        var n = 0;
        var winHeight = $(window).height();
        $(function () {
            loadimg();
            $(window).scroll(function () {
                if (n < 20) {                     var docTop = $(document).scrollTop();                     var contentHeight = $("#content").height();                     if (docTop + winHeight >= contentHeight - 10) {
                        loadimg();
                    }
                }
            });
        });
        function loadimg() {
            for (i = 0; i < 5; i++) {
                $("#content").append("
	<li><img src='1.jpg'/></li>

");
            }
            n += 5;
        }

// ]]></script>


这里使用了jqury框架是为了让代码更少更简单,如果你可以手写纯js代码来实现这个功能当然最好不过,毕竟是优化,这个小小的功能也不需要使用 到任何js框架。不过个人比较喜欢JQuery框架,毕竟在大项目中,手写纯js代码将会严重拖慢整个项目的进度,有一个强大的js框架摆在面前,合理运 用还是能提高开发效率的,而且在一个大项目中,JQuery不是仅仅能帮你实现这个小小的功能而已,像Ajax,它是能轻轻松松就能帮你搞定的。另外我这 里只是写死了加载这一张图片,事实上它应该是使用Ajax来请求新的图片,然后加载到页面里的,因为想尽量简单,就没有涉及后台逻辑,所以只加载这一张图 片。

你可能会注意到这句代码:docTop + winHeight >= contentHeight – 10,这里我为什么要-10呢?如果不-10在IE、Firefox下测试时通过的,但是在Chrome下就不行了,因为在Chrome下,docTop + winHeight是永远比contentHeight小1的,而在前两个浏览器里,docTop + winHeight是比contentHeight大1的,这个是浏览器的问题,我们只能去兼容它们,最简单的方法就是不一定要滚动到底部,滚动到距离底 部还有10个像素的时候就可以加载新的图片了。

习惯了晚睡晚起,知道这样对身体不好,可是就是很难改过来。以后尽量早点睡,早睡早起身体好,头脑也灵活一点。各位也是,莫把生命都给了coding,你的生活里还有更美好的事与人。

需要源工程代码