最近那些事儿……

为了不耽误大家的时间,这里首先说一下下边文章中主要涉及的技术问题,如果有兴趣,大家可以一起研究一下,如果不喜欢,请绕道。写得不妥的地方,也希望大家指正。

本文主要说三个问题:

一、VS中跨工程调试,从一个工程进入另一个工程;

二、动态生成二维码和一维条形码;

三、前台页面直接访问图片流文件。

老规矩,先来点题外话。最近在园子里闲逛的时候,发现很多人都聊到了加班这个话题。其中有一哥们儿说是在京东,然后每天按时上下班,无不良记录,一个月后居然以工作不积极给开了……说到这里很多人就得有想法了,凭什么啊?说到程序员加班,似乎永远是个谈不完的话题,好像程序员就是为加班而生的。而这其中的辛酸血泪,也只有我们自己才知道。从去年进入公司以来,除了特殊情况(节假日,公司聚会),从来未按时下过班,大家都习惯磨磨蹭蹭,没事儿也在那儿耗着。我也问过比我先来的同事,为什么下班了还不走,原因很简单,上边的人都没走……

最近加班更是频繁,周一到周四住在公司,每天回寝室都是下半夜。其中的苦楚,说不清,道不明。我想说的是,我们一起,按时下班吧。工作和生活需要分开!

——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

一、跨工程调试

之前工作时发现要将项目中一部分的功能加以改造移动到另外一个项目去,本着DRY的原则,决定将项目生成一下,然后直接把dll复制过去。当复制过去直接使用时,发现程序报了空指针异常。而检查了一遍程也未发现有任何地方会导致空指针,唯一的办法就是打断点来调试一下,可是由于是引用的dll,所以没办法直接打断点,只能通过其他的方式。好在我有dll的源码,如何调试只是方法的问题了。这里说的跨工程调试,是指调试在不同的工程中的源代码。在同一个工程不同项目的代码是可以直接调试的。下面简单的介绍一下如何跨工程进行调试。

首先,找到需要调试的CS文件,然后将文件直接拖到正在运行的工程窗口中,将断点打在合适的位置上。再从原工程中找到此cs所在的项目的pdb文件,将pdb文件和dll一同复制到现工程的bin目录下,然后直接F5,接着,奇迹就发生了。

二、生成二维码和一维条形码

随着微信的兴起,二维码应用得越来越广泛。之前我们有个卖水果的客户说是要将二维码贴在水果上,通过手机一扫就能知道水果的产地,生长环境等信息。网上也有很多生成二维码的工具,但是希望大家慎用,有些会把您填写的信息秘密发回服务器,当然了,大多数还是可以用的。

文中提到的生成二维码和一维条形码,是通过开源的项目Zxing来实现的,其Github地址:https://github.com/zxing/zxing/,这是一个开源的项目,可以生成各种码。因为之前用了二维码和条形码,所以这里简单的说一下。

生成二维码和一维码只有细微的差别,体现在程序里相当于使用了不同类型的枚举。下面直接上代码:

在这里做这个示例用的是最传统的Web程序,直接添加了一个一般处理程序来处理这个生成二维码和一维条形码的逻辑。

首先通过context上下文获取传过来的一些参数:

            string content = context.Request.QueryString["content"];
if (string.IsNullOrWhiteSpace(content)) return;
content = HttpUtility.UrlDecode(content);

string level = context.Request.QueryString["level"];
level = string.IsNullOrWhiteSpace(level) ? "M" : level.ToUpper();

string format = context.Request.QueryString["format"];
format = string.IsNullOrWhiteSpace(format) ? "png" : format.ToLower();

int margin = Convert.ToInt32(context.Request.QueryString["margin"]);
int size = Convert.ToInt32(context.Request.QueryString["size"]);

获取传递的一些参数

然后通过前台传过来的参数生成相应的条码类型,这里仅仅只是生成了一维码和二维码,别的类似:

            ErrorCorrectionLevel errorCorrectionLevel;
ImageFormat imgFormat;
BarcodeFormat barcodeFormat = GetImageFormat(context.Request.QueryString["mod"]);

#region 获取生成图片类型
private static BarcodeFormat GetImageFormat(string mod)
{
switch (mod)
{
case "QR_CODE":
return BarcodeFormat.QR_CODE;
case "CODE_128":
return BarcodeFormat.CODE_128;
default:
return BarcodeFormat.CODE_128;
}
}
#endregion

获取生成条码类型

接着,再初始化一些参数:

            #region ErrorCorrectionLevel
switch (level)
{
case "L":
errorCorrectionLevel = ErrorCorrectionLevel.L;
break;
case "M":
errorCorrectionLevel = ErrorCorrectionLevel.M;
break;
case "Q":
errorCorrectionLevel = ErrorCorrectionLevel.Q;
break;
case "H":
errorCorrectionLevel = ErrorCorrectionLevel.H;
break;
default:
errorCorrectionLevel = ErrorCorrectionLevel.M;
break;
}
#endregion

#region ImageFormat
switch (format)
{
case "jpeg":
imgFormat = ImageFormat.Jpeg;
break;
case "gif":
imgFormat = ImageFormat.Gif;
break;
case "bmp":
imgFormat = ImageFormat.Bmp;
break;
default:
imgFormat = ImageFormat.Png;
break;
}
#endregion

EncodingOptions options = new QrCodeEncodingOptions
{
DisableECI = true, //禁用ECI编码段: use UTF-8 encoding and the ECI segment is omitted
CharacterSet = "UTF-8", //使用UTF-8编码
Width = 200, //设置宽度
Height = 80, //设置高度
Margin = 20, //设置间隙
ErrorCorrection = errorCorrectionLevel,//容错等级
PureBarcode = false//底部显示内容
};

初始化参数

最后,直接生成二维码或一维码图片:

            BarcodeWriter writer = new BarcodeWriter();
writer.Format = barcodeFormat; //采用QR编码
writer.Options = options;

context.Response.Clear();
context.Response.ContentType = imgFormat.GetMimeType(); //设置输出流ContentType

using (Bitmap image = writer.Write(content)) //输出二维码图像
{
using (MemoryStream ms = new MemoryStream())
{
image.Save(ms, imgFormat);
ms.WriteTo(context.Response.OutputStream);
}
}
context.Response.Output.Flush();
context.Response.End();

生成条码

至此,生成一维码或二维码告一段落。

三、输出图片到前台

看完生成条码的童鞋会发现,最后是将流输出了,是的,这是为了直接将图片输出到前台。这样,可以根据实时的动态请求,将需要生成的一维码或者二维码直接输出到前台,而前台的页面也非常简单,只需写一个<image>标签,将src指向后台的一般处理程序即可。这样就能将内容输出到前台。如图:当然了,您也可以根据自己的需要,在二维码中间穿插上自己的一些Logo或者图片信息,由于本文重在抛砖引玉,所以这里就不细说了。

最近那些事儿……,布布扣,bubuko.com

时间: 2024-08-09 22:00:19

最近那些事儿……的相关文章

有些事儿,工程师可能今生仅此一次

郑昀 创建于2016/9/15 最后更新于2016/9/18 关键词:深度思考,碎片化阅读,做论文,深入研究, 早先在<技术高手如何炼成>一文中提到,我会问面试者,你日常如何构建自己的知识体系.有人会觉得你怎么就问出这么宏大的问题?知识体系,这是什么鬼? 面试时的交谈 工作之后你做过这样的事情吗? 面试是一个谁主张谁举证的过程,有时候需要面试者举出实例,自我证明. 而我认为问一些我们工作中遇到的难题和业务场景是在“欺负”面试者,所以我喜欢问开放型问题: 在你工作之后,你有没有像做毕业论文一样对

医疗时鲜(Running)资讯(ZSSURE):移动医疗不算事儿

背景 最近在看Dr.2的书<移动医疗那点事儿>,所以此次博文就厚颜无耻的叫做"移动医疗不算事儿".新的一年,新的积累与进步,继续关注医疗行业的最新动态.此次主要介绍吐槽一下关于"自由执业"和"电子病例"的新闻.Running-- 自由执业 在<移动医疗那点事儿>中,Dr.2开篇问了一个问题"什么样的医生会出来自由执业?刚毕业的孩子会出来自由执业么?",其观点认为:会从体制内出来的医生通常都是一些在临床业

《Java编程那点事儿》读书笔记(七)——多线程

1.继承Thread类 通过编写新的类继承Thread类可以实现多线程,其中线程的代码必须书写在run方法内部或者在run方法内部进行调用. public class NewThread extends Thread { private int ThreadNum; public NewThread(int ThreadNum){ this.ThreadNum = ThreadNum; } public void run(){ try{ for(int i = 0;i < 10;i ++){ T

安装kali之后那些事儿

完全是自己学习后的笔记,和基本的linux配置命令 输入的命令    输入的内容 1.更新软件源:修改sources.list文件: leafpad /etc/apt/sources.list #官方源 deb http://http.kali.org/kali kali main non-free contribdeb-src http://http.kali.org/kali kali main non-free contribdeb http://security.kali.org/kal

XSS与字符编码的那些事儿

目录 0x00:基本介绍 0x01:html实体编码 0x02:新增的实体编码 实体编码变异以及浏览器的某些工作原理! 0x03:javascript编码 0x04:base64编码 0x05:闲扯 0x00基本介绍 提起XSS 想到的就是插入字符字符编码与各种解析了! 这也就是各种xss编码插件跟工具出世的原因!之前不懂浏览器是如何对我们编码过的代码进行解析的时候就是一顿乱插! 各种编码 各种插 没把编码还原就算了 还原了就算运气好!后来到PKAV经过二哥和短短的调教后才算是弄清楚了一点编码与

TCP 的那些事儿(上)

http://coolshell.cn/articles/11564.html TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是推荐你去看W.Richard Stevens的<TCP/IP 详解 卷1:协议>(当然,你也可以去读一下RFC793以及后面N多的RFC).另外,本文我会使用英文术语,这样方便你通过这些英文关键词来查找相关的技术文档. 之所以

【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿

[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据.否则的话,你就要考虑你的场景是否有必要用 RSA 了. 2. 可以通过修改生成密钥的长度来调整密文长度 生成密文的长度等于密钥长度.密钥长度越大,生成密文的长度也就越大,加密的速度也就越慢,而密文也就越难被破解掉.著名

MySQL日志审计 帮你揪出内个干坏事儿的小子

MySQL日志审计 帮你揪出内个干坏事的小子 简介 Part1:写在最前 MySQL本身并不像MariaDB和Percona一样提供审计功能,但如果我们想对数据库进行审计,去看是谁把我的数据库数据给删了,该怎么办呢?我们主要利用init-connect参数,让每个登录的用户都记录到我们的数据库中,并抓取其connection_id(),再根据binlog就能够找出谁干了那些破事儿. MariaDB如何审计,可移步: http://suifu.blog.51cto.com/9167728/1857

从街边星探到互联网投资者 龌蹉那些事儿已经没有了?

近几日最热闹的就是支付宝圈子上线大尺度照片引起王思聪回复的话题.就如一夜成名天下知.一夜暴富成土豪的"神话"总是让人向往,而能够快速实现这两个愿望的,似乎也就娱乐圈和互联网两个行业了.相比蹿红.暴富"神话"在几十年内都层出不穷的娱乐圈,互联网在近二十年无疑也更具吸引力.不过需要需要注意的是,在一人蹿红.暴富的背后,隐藏的是太多几经挣扎却默默无闻的人,或者龌龊的事情层出不穷. 不管是此前流行的在街边遇到口吐莲花的星探,还是现在一茬接一茬让无数创业者憧憬其带来融资的投资

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格