读取和写入文本文件 Read a Text File 的这篇文章部分描述如何使用 StreamReader 类来读取文本的文件。Write a Text File (Example 1),和 Write a Text File (Example 2) 在各节说明了如何使用 StreamWriter 类来向文件写入文本。
读取文本文件 若要打开、 读取,和来关闭文本文件,下面的代码使用 StreamReader 类。您可以将文本文件的路径传递给 StreamReader 构造函数自动打开该文件。ReadLine 方法读取的每一行文本,并读取递增到下一行将文件指针。当 ReadLine 方法到达文件结尾时, 它将返回空引用。 在记事本中创建示例文本文件。若要这样做,请按照下列步骤操作: 在记事本中粘贴以下文本: hello world 将文件另存为 Sample.txt。启动 Microsoft Visual Studio。 在 文件 菜单上指向 新建,然后单击 项目。 在 项目类型 框中,单击 Visual C# 项目,然后单击 模板 下的 控制台应用程序
注意在 Visual Studio 2005 或 Visual Studio 2008 中在 项目类型 框中,单击 Visual C#,然后单击在 模板 下的 控制台应用程序。 Class1.
需要安装的软件: VirtualBox 5.1.4 Genymotion 2.7.2
Android Studio 2.1.2
安装步骤:
使用安装版安装Android Studio 1. 执行android-studio-bundle-143.2915827-windows.exe,可以看到欢迎页:
2. 在选择安装组件中,虚拟机可以不用安装
3. 接下就一直Next直到安装完成
使用绿色版安装Android Studio 1. 用解压工具将zip压缩包解压,解压后的目录结构:
2. 执行bin目录下的studio64.exe
第一次启动Android Studio的相关配置 1. 在启动过程中可能会弹出一个请求设置代理的提示:
点击”Setup Propxy”按钮设置代理:
Host name:mirrors.neusoft.edu.cn
Port number: 80
2. “欢迎页”告诉我们可以开发平板、手机、手表、TV、车载和眼睛的相关应用。
3. 点击“Next”按钮,在选项窗口中选择”Custom“选项
4. UI主题可以选择目前比较流行的“Darcula”主题,据说这个主题有保护眼睛的功效
Android Stuido基本配置 可以通过快捷键Ctrl+Alt+S或点击“Configure”后弹出菜单项的Settings打开设置窗口。
主题配置 可以设置成目前比较流行的Darcula主题,通过Appearance & Bahavior > Apperance下的UI Options选项设置。
字体配置 默认字体偏小个了,可以根据需要配置合适自己的字体大小,通过Editor->Color & Fonts > Font设置。默认方案是只读的,在修改字体大小前需要先Save As..一下再去修改字体:
显示代码行数 默认Android Studio不显示代码行数,这样对于一些提示XX行的错误我们定位就不方便了,在配置的查询窗口中输入line num关键字查询需要配置的项目,然后选择Appearance选项,可以看到Show line numbers选项,打钩后就可以了。
模拟器安装 Android Stuido里面的AVD Manager可以创建模拟器,使用起来也比较简单,缺点就是性能不行,现在比较流行使用Genymotion,号称史上最快的Android模拟器。下面我们就来装Genymontion。
安装Virtual Box 点击这里打开Virtual Box下载页面并点击x86/amd64下载:
http://www.ibm.com/developerworks/cn/web/wa-lo-comet/
转载于:https://www.cnblogs.com/sunfb/p/4601786.html
Android开发带来新一轮热潮让很多移动开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用。其中也有许许多多的开发者提供了应用开 源项目,贡献出他们的智慧和创造力。学习开源代码是掌握技术的一个最佳方式。下面推荐几个应用开源项目,这些项目不仅提供了优秀的创意,也可以直接掌握 Android内核的接口使用:
1.Android团队提供的示例项目
如果不是从学习Android SDK中提供的那些样例代码开始,可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项目,包含了游戏、图像处理、时间显示、开始菜单快捷方式等。
地址:http://code.google.com/p/apps-for-android/
2.Remote Droid
RemoteDroid是一个Android应用,能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触摸屏手指运动等很好的样例。
地址:http://code.google.com/p/remotedroid/
3.TorProxy和Shadow
TorProxy应用实现了Android手机无线电电传通讯(TOR),和Shadow应用一起使用,可以使用手机匿名上网。从该项目源代码中,可以掌握socket连接、管理cookie等方法。
地址:http://www.cl.cam.ac.uk/research/dtg/code/svn/android-tor/
4、 Android SMSPopup
SMSPopup可以截获短信内容显示在一个泡泡形状的窗口中。从这个项目中可以掌握到如何使用内置的短信SMS接口。
地址:http://code.google.com/p/android-smspopup/
5、 Standup Timer
Standup Timer应用用于控制站立会议时间,类似秒表倒计时,可以提醒每个人的讲话时间已到,从而保证每个与会者使用时间一样。从该项目的代码中,可以学会如何使用时间函数。另外,这个项目的代码是采用视图view、模型model严格分离的设计思路。
地址:http://github.com/jwood/standup-timer
6、 Foursquare
是Foursquare.com的一个客户端应用,该应用主要分为两个模块:API(com.joelapenna.foursquare)和 界面前端(com.joelapenna.foursquared)两部分。从该项目代码中,可以学会如何同步、多线程、HTTP连接等技术。
地址:http://code.google.com/p/foursquared/
7、 Pedometer
Pedometer应用用于记录你每天走路步数的。尽管记录不一定精准,但是从这个项目中,可以学习几个不同的技术:加速器交互、语音更新、后台运行服务等。
地址:http://code.google.com/p/pedometer/
8、 OpenSudoku-android
OpenSudoku是一个简单的九宫格数独游戏。从代码中可以学习到如何在视图中显示表格数据,以及如何和一个网站交互等技术。
地址:http://code.google.com/p/opensudoku-android/
9、 ConnectBot
ConnectBot是Android平台的一个客户端安全壳应用。从该项目代码中,可以学习到很多Android安全方面的内容,这些是你在开发应用时经常需要考虑的安全问题。
地址:http://code.google.com/p/connectbot/
10、 WordPress的Android应用
当然在最后不能不提Wordpress的Android应用了,这是Wordpress官方开发团队提供的一个项目。从代码中可以学习到XMLRPC调用(当然还有更多的优秀内容)。
地址:http://android.svn.wordpress.org/trunk/
原文链接:http://www.fly3q.com/2010/06/android-developers-must-thoroughly-study-the-10-applications-open-source-projects.html
转载于:https://www.cnblogs.com/sunfb/p/3332759.html
glut下载地址: http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
1. 把解压得到的glut.h放到"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include\gl"(与具体安装位置有关,应该是 安装目录\microsoft sdks\windows\v7.0A\include\gl)
2. 把解压得到的glut.lib和glut32.lib放到"“Programfiles(x86)\Microsoft Visual studio 10.0\VC\lib" 中(与具体安装位置有关,同上)
3. 把解压得到的glut.dll放到"C:\Windows\System32"
4. 把glut32.dll放到“Programfiles(x86)\Microsoft Visual studio 10.0\VC\bin”下(注意这个,网上有人说放到system32里,但是我试过,会报错)(与具体安装位置有关,同上)
5. 打开vs2010,随便打开或新建一个项目。 选择 project->project property-> Configuration Properties->Linker->Input->Additional Dependencies 在其中添加opengl32.lib glu32.lib glut32.lib
新建Win32 Console Application,(不是win32 application).选择一个名字,然后按OK。在谈出的对话框左边点Application Settings,找到Empty project并勾上,选择Finish。然后向该工程添加一个代码文件,取名为“OpenGL.c”,注意用.c来作为文件结尾。(其实不必一定以.c结尾,.cpp也可)
搞定了,就跟平时的工程没什么两样的。
#include <gl\glut.h> void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glRectf(-0.5f, -0.5f, 0.5f, 0.5f); glFlush(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("第一个OpenGL程序"); glutDisplayFunc(&myDisplay); glutMainLoop(); return 0; } 该程序的作用是在一个黑色的窗口中央画一个白色的矩形。下面对各行语句进行说明。
我们大家都知道Microsoft Office Word 2007的文档可以另存为只读的PDF格式文件,但必须预先安装加载插件项。
今天电脑软件技术博客就在这里详细讲解下Microsoft Office Word 2007 文档另存为PDF格式文件的详细步骤:
第一:首先,您肯定得安装上Microsoft Office Office 2007组件中的Word 2007,确定安装好。
第二:因为安装Microsoft Office Office 2007组件中的Word 2007的时候,默认的没有给你安装上“Microsoft Save as PDF 或XPS”插件选项,所以,你先到微软官方网站上去下载下就可以了。
Microsoft Office Word 2007 加载项是:“Microsoft Save as PDF 或 XPS”,其微软官方下载地址:
http://download.microsoft.com/download/6/2/5/6259b99f-1abf-4f27-b2a0-ad018b04f0a6/SaveAsPDFandXPS.exe Microsoft Office Word 2007 加载项:“Microsoft Save as PDF - 简体中文”,其微软官方下载地址:
http://download.microsoft.com/download/3/8/8/388812b2-0d3f-474e-a7ef-b095d3d0d3cd/SaveAsPDF.exe
Microsoft Office Word 2007 加载项: “Microsoft Save as XPS - 简体中文”,其微软官方下载地址:
http://download.microsoft.com/download/2/4/0/240dfc61-7bdd-43df-b89d-d84cc23c0853/SaveAsXPS.exe 第三:下载好后,你就安装加载SaveAsPDFandXPS.exe或者SaveAsPDF.exe或者SaveAsXPS.exe程序文件,按照屏幕上的说明完成安装。
第四:打开要发布或者另存的文档,从“Office”或“文件”菜单上选择“另存为 PDF 或XPS”。有关详细信息,请在“Office 帮助”中搜索“将文件保存为 PDF 格式”或“以 XPS 格式保存文件” 第五:删除加载的程序文件
在“开始”菜单上,指向“设置”,然后单击“控制面板”,双击“添加/删除程序”。
在“当前安装的程序”列表中,选择“Microsoft Office Word 2007 加载项 - Microsoft Save as PDF 或 XPS”,然后单击“删除”或“添加/删除”。如果出现对话框,请按照说明删除此程序,单击“是”或“确定”,以确认要删除该程序。
Case具有两种格式。简单Case函数和Case搜索函数。
-- 简单Case函数 CASE sex
WHEN ' 1 ' THEN ' 男 ' WHEN ' 2 ' THEN ' 女 ' ELSE ' 其他 ' END -- Case搜索函数 CASE WHEN sex = ' 1 ' THEN ' 男 ' WHEN sex = ' 2 ' THEN ' 女 ' ELSE ' 其他 ' END 这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。 还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。 -- 比如说,下面这段SQL,你永远无法得到“第二类”这个结果 CASE WHEN col_1 IN ( ' a ' , ' b ' ) THEN ' 第一类 ' WHEN col_1 IN ( ' a ' ) THEN ' 第二类 ' ELSE ' 其他 ' END 转载于:https://www.
打开文档后,按Alt+F11,在左边Porject下找到ThisDocument,右键插入模块,贴上下面的
Sub Macro()
For Each iShape In ActiveDocument.InlineShapes
iShape.Height = iShape.Height * 0.25
iShape.Width = iShape.Width * 0.25
Next iShape
End Sub
按F5运行一次就可以了。 转载于:https://www.cnblogs.com/qiangshu/p/4532683.html
1 <span style="font-size:14px;font-weight: normal;"> 2 private static final double EARTH_RADIUS = 6378137;//赤道半径(单位m) 3 4 /** 5 * 转化为弧度(rad) 6 * */ 7 private static double rad(double d) 8 { 9 return d * Math.PI / 180.0; 10 } 11 12 /** 13 * 基于余弦定理求两经纬度距离 14 * @param lon1 第一点的精度 15 * @param lat1 第一点的纬度 16 * @param lon2 第二点的精度 17 * @param lat3 第二点的纬度 18 * @return 返回的距离,单位km 19 * */ 20 public static double LantitudeLongitudeDist(double lon1, double lat1,double lon2, double lat2) { 21 double radLat1 = rad(lat1); 22 double radLat2 = rad(lat2); 23 24 double radLon1 = rad(lon1); 25 double radLon2 = rad(lon2); 26 27 if (radLat1 < 0) 28 radLat1 = Math.
数值转换为字符: data; x=2557898; y=put(x, $8.); put y; run; 字符转换为数值: data; x=2557898; y=put(x, 8.); 或y=x-0; put y; run; 转载于:https://www.cnblogs.com/qiangshu/archive/2012/07/03/2574058.html
3个重要的正则式命令: B 在正则表达式中有3种类型的括号
方括号 “[“和花括号“{“ 。
方括号"["内是需要匹配的字符,花括号"{"内是指定匹配字符的数量。
圆括号“(“ 则是用来分组的。
C插入符号 “^” 表示正则式的开始。D美元符号“$” 表示正则式的结束。 转载于:https://www.cnblogs.com/tutuyforever/p/3454302.html
释放资源到文件
有时候程序运行时需要调用某些DLL或者其他程序,而为了发布时方便将这些DLL或者EXE添加到了资源中一起编译。运行时再把这些资源释放到文件中即可。那如何释放资源到文件中呢?用下面这个函数:
BOOL CXXXDlg::ReleaseResFile(CString strFileName, UINT wResID, CString strFileType) { // 资源大小 DWORD dwWrite=0; // 创建文件 HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE,FILE_SHARE_WRITE,NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); if ( hFile == INVALID_HANDLE_VALUE ) { return false; } // 查找资源文件中、加载资源到内存、得到资源大小 HRSRC hrsc = FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType); HGLOBAL hG = LoadResource(NULL, hrsc); DWORD dwSize = SizeofResource( NULL, hrsc); // 写入文件 WriteFile(hFile,hG,dwSize,&dwWrite,NULL); CloseHandle( hFile ); return true; } 转载于:https://www.cnblogs.com/rogee/archive/2010/12/17/1909204.html
NI文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以可视化的编程一族,如VB、VC、VFP、Delphi等都提供了读写INI文件的方法,其中Delphi中操作INI文件,最为简洁,这是因为Delphi提供了一个TInifile类,使我们可以非常灵活的处理INI文件。
一、有必要了解INI文件的结构: ;注释 [小节名] 关键字=值 ... INI文件允许有多个小节,每个小节又允许有多个关键字,“=”后面是该关键字的值。 值的类型有三种:字符串、整型数值和布尔值。其中字符串存贮在INI文件中时没有引号,布尔真值用1表示,布尔假值用0表示。 注释以分号“;”开头。 二、定义 1、在Interface的Uses节增加IniFiles; 2、在Var变量定义部分增加一行: myinifile:Tinifile; 然后,就可以对变量myinifile进行创建、打开、读取、写入等操作了。 三、打开INI文件 myinifile:=Tinifile.create('program.ini'); 上面这一行语句将会为变量myinifile与具体的文件program.ini建立联系,然后,就可以通过变量myinifile,来读写program.ini文件中的关键字的值了。 值得注意的是,如果括号中的文件名没有指明路径的话,那么这个Program.ini文件会存储在Windows目录中,把Program.ini文件存储在应用程序当前目录中的方法是:为其指定完整的路径及文件名。下面的两条语句可以完成这个功能: Filename:=ExtractFilePath(Paramstr(0))+'program.ini'; myinifile:=Tinifile.Create(filename); 四、读取关键字的值 针对INI文件支持的字符串、整型数值、布尔值三种数据类型,TINIfiles类提供了三种不同的对象方法来读取INI文件中关键字的值。假设已定义变量vs、vi、vb分别为string、integer、boolean类型。 vs:=myinifile.Readstring('小节名','关键字',缺省值); vi:=myinifile.Readinteger('小节名','关键字',缺省值); vb:=myinifile.Readbool('小节名','关键字',缺省值); 其中缺省值为该INI文件不存在该关键字时返回的缺省值。 五、写入INI文件 同样的,TInifile类也提供了三种不同的对象方法,向INI文件写入字符串、整型数及布尔类型的关键字。 myinifile.writestring('小节名','关键字',变量或字符串值); myinifile.writeinteger('小节名','关键字',变量或整型数值); myinifile.writebool('小节名','关键字',变量或True或False); 当这个INI文件不存在时,上面的语句还会自动创建该INI文件。 六、删除关键字 除了可用写入方法增加一个关键字,Tinifile类还提供了一个删除关键字的对象方法: myinifile.DeleteKey('小节名','关键字'); 七、小节操作 增加一个小节可用写入的方法来完成,删除一个小节可用下面的对象方法: myinifile.EraseSection('小节名'); 另外Tinifile类还提供了三种对象方法来对小节进行操作: myinifile.readsection('小节名',TStrings变量); 可将指定小节中的所有关键字名读取至一个字符串列表变量中; myinifile.readsections(TStrings变量);可 将INI文件中所有小节名读取至一个字符串列表变量中去。 myinifile.readsectionvalues('小节名',TStrings变量); 可将INI文件中指定小节的所有行(包括关键字、=、值)读取至一个字符串列表变量中去。 八、释放 在适当的位置用下面的语句释放myinifile: myinifile.distory; 转载于:https://www.cnblogs.com/rogee/archive/2010/09/14/1827242.html
((原文发表于CSDN我的Blog: http://blog.csdn.net/happyhippy/archive/2006/10/29/1356088.aspx) 先看下Reflector.exe反汇编.net framework 2.0中Mscorlid.dll,得到String.ToCharArray ()源码: // .net framework 2.0 public unsafe char [] ToCharArray()
... {
int num1 = this.Length;
char[] chArray1 = new char[num1];
if (num1 > 0)
...{
fixed (char* chRef1 = &this.m_firstChar)
...{
//使用fixed,防止gc执行垃圾回收后移动堆上的对象而造成无效指针
fixed (char* chRef2 = chArray1)
...{
string.wstrcpyPtrAligned(chRef2, chRef1, num1);
chRef1 = null;
}
}
}
return chArray1;
} private static unsafe void wstrcpyPtrAligned( char * dmem, char * smem, int charCount)
引用别人的。有时间整体整理下。
引用地址:http://www.cnblogs.com/wenjl520/archive/2012/08/24/2654412.html
锁的概述
一. 为什么要引入锁
多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:
丢失更新
A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统
脏读
A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致
不可重复读
A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致
并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致
二 锁的分类
锁的类别有两种分法:
1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁
MS-SQL Server 使用以下资源锁模式。
锁模式 描述
共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。
更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。
意向锁 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。
架构锁 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。
大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。
共享锁
共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。
更新锁
更新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。
http://blog.csdn.net/xiaanming/article/details/12684155
转载于:https://www.cnblogs.com/zwliuxing/p/3877616.html
忙不忙可能就是相对于个人承受能力来说的吧,最近一直在为大学生电子设计大赛个初赛努力着。
一直以来,还没做过那么复杂的电路,刚开始做,课程还排得满满的,还真有点招架不住的感觉呢。还好是团队合作,大家互通有无,三个臭皮匠,总算抵得一个诸葛亮了。
下面谈谈我们遇到的麻烦吧,以便像我这样的新手可以借鉴。
选择题目的时候,由于时间问题,选得很仓促,导致后面的设计环节关卡重重,主要是无线发射模块和单片机。由于才上了一年多的大学,涉掠不多,单片机的相关知识知道的很少。大家磨了几天从图书馆借来的书,终于才把要用到的东西弄清楚了。知识海洋的浩瀚已经不言而喻了,所以呀,学无止境啊~在空闲的时候,一定一定要多去学一学相关的知识。
制作的时候,我们因为没有相关的机器来制作电路板,于是我们决定,采取笨办法——用万用板做,这也是造成往后困难的起因(也许越是复杂的电路,使用覆铜板制作电路板就越有好处吧)。万用板的焊盘太过于接近,焊接时很容易短接;还有就是要制作适合的导线,非常的麻烦,而且很浪费时间;在制作开始后,我们慢慢的才发现,不同的电路用不同颜色的导线来连接,既容易分辨电路,又美观,于是中途时采取了这个方案。
到现在为止,我们的作品还没有完成。后天和大后天就是交作品的时候了,我们会继续努力的。即使我们不能通过初赛,我们也要继续完成它,自己制作一块电路板,争取把它做得令自己满意,就当是一次学习好了,这样,明年我们就会做得更好的。
希望我的经历能对一些人有所帮助,这将是我的最大的收获了。
转载于:https://www.cnblogs.com/alicetang/archive/2011/03/25/newcomer.html
我想你们已经有了Enterprise Library.是个很有用的代码集合,可以节省很多时间。
转载于:https://www.cnblogs.com/yangbin990/archive/2005/07/11/190442.html
2017-11-19 02:19
Mnist手写数字数据库是著名的神经网络入门级训练集,它图像文件的后缀名一般为idx3-ubyte,图像标签文件后缀名为idx1-ubyte。它分为两种图像集,一个训练集,一个测试集。它内置的图像大小为28*28,可以在这里下载:http://yann.lecun.com/exdb/mnist/
一共四个文件,训练集和它的标签集,测试集和它的标签集,解析规则在页面中有说明。
这里通过python的struct库进行解析:
#需要导入的库,struct是一个很常用的二进制解析库 import numpy as np import struct def decode_idx3_ubyte(idx3_ubyte_file):#此函数用来解析idx3文件,idx3_ubyte_filec指定图像文件路径 #读取二进制数据 bin_data=open(idx3_ubyte_file,'rb').read() #解析文件头信息,依次为魔数、图片数量、每张图片高、每张图片宽 offest=0 fmt_header='>iiii' magic_number,num_images,num_rows,num_cols=struct.unpack_from(fmt_header,bin_data,offest) print('魔数:%d,图片数量:%d,图片大小:%d%d' % (magic_number,num_images,num_rows,num_cols)) #解析数据集 image_size=num_rows*num_cols offest += struct.calcsize(fmt_header) fmt_image='>'+str(image_size)+'B' images=np.empty((num_images,num_rows,num_cols)) for i in range(num_images): if (i+1)%10000==0: print('已解析%d'%(i+1)+'张') images[i]=np.array(struct.unpack_from(fmt_image,bin_data,offest)).reshape((num_rows,num_cols)) offest+=struct.calcsize(fmt_image) return images '''images是一个三维数组,images[i][a][b]表示第i张图片的倒数第a行,b列的像素''' def decode_idx1_ubyte(idx1_ubyte_file):#解析idx1文件函数,idx1_ubyte_file指定标签文件路径 #读取二进制数据 bin_data=open(idx1_ubyte_file,'rb').read() #解析文件头信息,依次为魔数和标签数 offest=0 fmt_header='>ii' magic_number,num_images=struct.unpack_from(fmt_header,bin_data,offest) print('魔数:%d,图片数量:%d张' % (magic_number,num_images)) #解析数据集 offest+=struct.calcsize(fmt_header) fmt_image='>B' labels=np.empty(num_images) for i in range(num_images): if (i+1)%10000==0: print('已解析:%d'%(i+1)+'张') labels[i]=struct.unpack_from(fmt_image,bin_data,offest)[0] offest+=struct.calcsize(fmt_image) print(labels[0]) return labels '''labels是一个一维数组,每个元素都一一对应images[i]''' 运行结果如下:
2017-11-18 00:31
前言:本文章中的一部分代码写得比较仓促,虽然比原来写的结构性更强,但仍有缺陷,下一篇中的代码经过了稍微修改。
Sobel算子是整像素图像边缘检测中最重要的算子之一,该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像
作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘
检测的图像,其公式如下:
图像的每一个像素的横向及纵向梯度近似值可用以下的公式结合,来计算梯度的大小。
可用以下公式计算梯度方向。
用sobel算子进行卷积的方法:
将图像转化成矩阵后,首先设计卷积核,多数情况下是3*3的矩阵,这里把sobel算子作为卷积核,如下,依次在图
像矩阵中移动卷积核。
把被卷积核覆盖的区域中的对应元素相乘,然后9个值相加作为一个像素的值,赋给输出的矩阵。
但这样做会导致图片变小,因此有一种做法就是在图片矩阵四周加上0,再运算。
例:
这里有一张小狗的图片,大小为1024px * 991px,原图是以jpeg格式储存的,我们需要读取每一个像素的RGB值,由于我还
没搞清jpeg的压缩方式,这里先使用windows的画图软件将它转化为24位的bmp位图。下面的代码使用的是python语言。
这里以对这张图片进行边缘检测为例:
1.首先,第一步读取图片信息:代码如下
上面代码可以读出图片的大小,同时为输出图像写入了24位bmp位图前面共54字节的文件头。
执行以上代码后,width=1024,height=991
2.把图片的每个像素作为一个元素储存在1024*991的矩阵中,便于计算
运算结果:
3.在2.中我们获得了图像的矩阵,然后给周围加上0.
输出结果:
4.通常边缘检测前会使用高斯滤波对图片进行处理,高斯滤波的作用就是消除图片中的噪点,是图片更平滑。下面是公式,其中是sigma需要自己设置值。
用这些代码可以将图片进行平滑处理,sigma用来设置平滑的程度。
Sigma=1时:(左为原图,右为经过平滑处理后的图片,没有考虑颜色,导致图片成了黑白的,后者看着会比前者模糊,这是高斯滤波后的正常现象)
5.进行高斯滤波处理后就可以使用sobel算子了,使用原理与4.一样 左为经过高斯滤波后的图像,右为将该图像边缘检测后的图像,可以明显的看出小狗的轮廓,这就是边缘检测。
后记:为了编写这些代码,3天的不眠不休,最终成功了。
Latex 设置字体大小命令由小到大依次为:
\tiny
\scriptsize
\footnotesize
\small
\normalsize
\large
\Large
\LARGE
\huge
\Huge
转载于:https://www.cnblogs.com/gaoqichao/p/3404934.html
(1) 基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
(2)实例:
(3) java实现
public class quickSort { inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; public quickSort(){ quick(a); for(int i=0;i<a.length;i++) System.out.println(a[i]); } public int getMiddle(int[] list, int low, int high) { int tmp = list[low]; //数组的第一个作为中轴 while (low < high) { while (low < high && list[high] >= tmp) { high--; } list[low] = list[high]; //比中轴小的记录移到低端 while (low < high && list[low] <= tmp) { low++; } list[high] = list[low]; //比中轴大的记录移到高端 } list[low] = tmp; //中轴记录到尾 return low; //返回中轴的位置 } public void _quickSort(int[] list, int low, int high) { if (low < high) { int middle = getMiddle(list, low, high); //将list数组进行一分为二 _quickSort(list, low, middle - 1); //对低字表进行递归排序 _quickSort(list, middle + 1, high); //对高字表进行递归排序 } } public void quick(int[] a2) { if (a2.
一般如果用到中文或者其它特殊字符,我就会使用n开头的类型,否则的话直接使用var开头的。 sql server中的varchar和Nvarchar有什么区别?
varchar(n)
长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。
nvarchar(n)
包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。
char 100 8个字节,92个空格
varchar 100 8个字节,无空格,最长为1-8000
nvarchar 100 10个字节,无空格,每个汉字为一个字符(适合中文,韩文),但如果是英文的话也是占两个位置,双字节来存储数,最长1-4000,可变长度 Unicode 数据,如果存储数据如果存在单字节时,它也是以双字节来占用存储空间的。 varchar 对每个英文(ASCII)字符都占用2个字节,对一个汉字也只占用两个字节
char 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节 Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian"
而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格,就是把它填满为100个字节)。
由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉! varchar(4) 可以输入4个字线,也可以输入两个汉字 nvarchar(4) 可以输四个汉字,也可以输4个字母,但最多四个 数据库定义到char类型的字段时 char、nchar、varchar、nvarchar、text、ntext中哪一种呢。 数据库定义到char类型的字段时,不知道大家是否会犹豫一下,到底选char、nchar、varchar、nvarchar、text、ntext中哪一种呢?结果很可能是两种,一种是节俭人士的选择:最好是用定长的,感觉比变长能省些空间,而且处理起来会快些,无法定长只好选用定长,并且将长度设置尽可能地小;另一种是则是觉得无所谓,尽量用可变类型的,长度尽量放大些。
鉴于现在硬件像萝卜一样便宜的大好形势,纠缠这样的小问题实在是没多大意义,不过如果不弄清它,总觉得对不起劳累过度的CPU和硬盘。
总结陈词: 1、如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么char 2、能确定长度又不一定是ansi字符或者,那么用nchar; 3、不确定长度,要查询且希望利用索引的话,用nvarchar类型吧,将它们设到400; 4、不查询的话没什么好说的,用nvarchar(4000) 5、性格豪爽的可以只用3和4,偶尔用用1,毕竟这是一种额外说明,等于告诉别人说,我一定需要长度为X位的数据 转载于:https://www.cnblogs.com/Eleanore/archive/2012/05/25/2518182.html
SQL Server多表查询的优化方案是本文我们主要要介绍的内容,本文我们给出了优化方案和具体的优化实例,接下来就让我们一起来了解一下这部分内容。
1.执行路径
ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就
可能要几十秒了.这是因为ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询..数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然 被共享的可能性也就越大了.
2.选择最有效率的表名顺序(记录少的放在后面)
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个 表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.
例如:
表 TAB1 16,384 条记录
表 TAB2 1条记录
选择TAB2作为基础表 (最好的方法)
select count(*) from tab1,tab2 执行时间0.96秒
选择TAB2作为基础表 (不佳的方法)
select count(*) from tab2,tab1 执行时间26.09秒
如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
例如: EMP表描述了LOCATION表和CATEGORY表的交集.
SELECT * FROM LOCATION L , CATEGORY C, EMP E WHERE E.EMP_NO BETWEEN 1000 AND 2000 AND E.CAT_NO = C.CAT_NO AND E.LOCN = L.LOCN 将比下列SQL更有效率
SELECT * FROM EMP E , LOCATION L , CATEGORY C WHERE E.
打开设置 -- 高级 -- 内容管理 -- cookie 然后将 “阻止第三方Cookie” 的选项关闭
日期:2014.7.23
PartⅢ The Standard Libraries 20 The Table Library table库包含一些辅助函数用以类似与数组一样操作table。提供了从list内插入和删除元素的操作,对数组的元素进行排序的操作,将table中所有的string连接起来的操作。 20.1 Insert and Remove Insert table的insert操作有三个参数:要被插入数据的table;插入的位置;插入的值。如果插入的位置不是最后一个,那么lua会将该位置至最后一个位置的元素的位置后移一位,如:当前table的t = {10,20,30},此时执行table.insert(t,1,25),即在t的第一个位置插入数据25,得到的结果为 t = {25,10,20,30},位置1及之后的数据位置后移,然后将新的元素插入至1号位置。假如没有提供要插入的位置这个参数,那么默认插入的位置是table的最后的位置,此时不需要移动其他的元素。 Remove table的remove操作将会移除table中给定位置的一个元素,在这位置之后的元素位置前移,如果没有提供需要移除的位置这个参数,则默认移除最后一个元素。 使用这两个运算函数便可以直观的实现栈、队列、双端队列。使用table初始化一个数据结构,t = {},在尾部添加元素:table.insert(t,x);删除尾部的元素:table.remove(t);由于table库是以c语言来实现这两个函数的,所以在效率上是有保障的。 20.2 Sort table.sort函数。该函数的参数有两个,一个为需要排序的table,另一个是提供排序规则的函数。排序函数需要有两个参数,并且当第一个参数达到了排序规则的要求(假如递增排序的情况,第一个参数大于了第二个参数),那么此时就需要返回true。 遍历数组的时候推荐使用ipairs而不是pairs,因为前者以1、2、3的顺序遍历,而后者是以任意的顺序来遍历的。 当我们需要对table的目录进行排序的时候,需要将这些目录首先存储至一个数组,然后再对数组进行排序。因为table中的目录没有顺序可言。 e.g. lines = { luaH_set = 10, luaH_get = 23, luaH_present = 48, } table.sort( lines ) for n in pairs(lines) do print(n) end 此时打印出来的是:luaH_set、luaH_present、luaH_get,并没有按照顺序来排列 e.g. a = {} for n in pairs(lines) do a[#a + 1] = n end table.
帧动画就是很多张png的序列图实现轮流播放产生动画效果。
那么首先我们要一套动画的序列图,没有图的可以看引擎例子里面的图。很多张图我们可以采用TP工具将它们压缩到一张png里面去,这样程序只需要读取一次就行了,提高效率。
动画是打地鼠地鼠出洞的表现,代码如下:
//新的游戏动画: //创建cache CCSpriteFrameCache* cache=CCSpriteFrameCache::sharedSpriteFrameCache(); char strPlist[64]={0}; char strPng[64]={0}; sprintf(strPlist,"Game/Game_Resource.plist"); sprintf(strPng,"Game/Game_Resource.png"); cache->addSpriteFramesWithFile(strPlist,strPng); //创建动画每一帧,从cache中读取 CCArray* animFrams=new CCArray(8); char str[64]={0}; for (int i=0;i<3;i++) { sprintf(str,"mole_a%d.png",i); CCLog(str); CCSpriteFrame* frame=cache->spriteFrameByName(str); animFrams->addObject(frame); } CCAnimation* animation=CCAnimation::createWithSpriteFrames(animFrams,0.5f); animation->setDelayPerUnit(0.2f); CCAnimate* animate=CCAnimate::create(animation); shrew->runAction(CCRepeatForever::create(animate)); 代码参考了这位作者 的文章,并针对2.0版引擎做了一点修改主要是文章中用的数组CCMutableArray改为了CCArray等。把代码写下来备忘。同时感谢原作者。
转载于:https://www.cnblogs.com/zhong-dev/p/4044617.html
参考https://blog.csdn.net/iteye_21199/article/details/82230824的解决方法,并未解决
遇到新的问题:
W: The repository 'http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian wheezy Release' does not have a Release file. N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. N: See apt-secure(8) manpage for repository creation and user configuration details. W: The repository 'http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian wheezy-updates Release' does not have a Release file. N: Data from such a repository can't be authenticated and is therefore potentially dangerous to use. N: See apt-secure(8) manpage for repository creation and user configuration details.
在java中,我们常用的就是replace、replaceAll这两个替换的方式,通过直接输入“ ”或者“\s”来代表空格,默认是清除所有一样的空格,还有的表示方式是“ +”,除此之外,还可以使用substring来进行处理,因为其中两个参数,可以快速定位到我们需要截取的位置,截取的内容中没有空格,就可以使用这个方式。
但今天在去除数组中字符串的空格时,以上方式除了substring,都使用无效,然而substring有个问题,它是根据第一个条件出现的位置来判断的,那么当首字符出现变更,不就失效了?所以在此,强力去除字符串数组中,元素里出现的空格,就可以使用stringUtils.deleteWhitespace(str),这个方法很霸道很好用,直接清除所有空格不带解释的,强推。
心得:从前做内存释放,只是觉得应该,没体会到这个的重要性,如果不及时释放就会有很多内存泄露,就像我早期遇到的前赴后继的崩溃,比如:没使用完,就释放会崩溃等明显的release问题。
作为全局的变量释放 ,要按栈的顺序释放。否则又不知何时会崩溃。
虽然现在有自动控制释放机制了,但是本人也觉得有必要知道这些方法,毕竟代码更新、兼容什么的仍然还要考虑到内存问题的。 Objective-c 语言中最头疼的事就是内存释放, 申明一个变量后记得一定要释放这个变量, 我们定义的全局变量都是在 - (void)dealloc 函数中释放的; 里面继承了一个 [super dealloc] 方法, 有些同学平时自己释放内存都是写在 [super dealloc]的后面 , 但是在Objective-c 中不能这样写, 所有的释放都必须写在 [super dealloc]的前面 。 -------错误的写法-------- - (void)dealloc
{
[super dealloc];
[XXX release];
......
}
-------正确的写法--------
- (void)dealloc
{
[XXX release];
[super dealloc];
......
}
原 因是:“你所创建的每个类都是从父类,根类继承来的,有很多实例变量也会继承过来,这部分变量有时候会在你的程序内使用,它们不会自动释放内存,你需要调 用父类的 dealloc方法来释放,然而在此之前你需要先把自己所写类中的变量内存先释放掉,否则就会造成你本类中的内存积压,造成泄漏”.不过在IOS6有了ARC后就不用手动去释放了,也没有此函数了!
转载于:https://www.cnblogs.com/someonelikeyou/p/3389272.html
通常,我们使用字体 都是系统默认的字体. 有时候 从阅读体验,美观度 设计师都会考虑用一些 更高大尚的字体. 系统字体库 给英文 各种style的发挥空间很大,但是 中文则不然. 但是苹果 给使用中文的字体的开发者提供了 动态下载字体库的福利,这个真是好,并且下载到/private/var/mobile/Library/Assets/com_apple_MobileAsset_Font/ 这样不会增加app本身的大小. 不失为一种好的选择.
前提: 你首先 要知道 你要使用的字体的官方名字, 用这个名字 当索引下载.
官方竟然有文档和demo 真是方便的不要不要的:
https://developer.apple.com/library/ios/samplecode/DownloadFont/Listings/DownloadFont_ViewController_m.html
操作基本步骤
1. 首先判断 是否有这种字体 无则用默认的
(如果 要使用一些 iOS8,iOS9才有的字体 一定要考虑低版本用户的情况,会闪退,在 font 类别里面也要做预判断,没有这个字体 就用默认的呗)
+ (UIFont *)normalHfFontWithSize: (CGFloat)fontSize { return [UIFont isFontDownloaded:@"FZLTXHK--GBK1-0"] ? [UIFont fontWithName:@"FZLTXHK--GBK1-0" size:fontSize] : [UIFont systemFontWithSize:fontSize]; } + (BOOL)isFontDownloaded:(NSString *)fontName { UIFont* aFont = [UIFont fontWithName:fontName size:12.0]; if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.
Given an circular integer array (the next element of the last element is the first element), find a continuous subarray in it, where the sum of numbers is the biggest. Your code should return the index of the first number and the index of the last number.
If duplicate answers exist, return any of them.
Example Give [3, 1, -100, -3, 4], return [4,1].
很有意思的题目,是Continuous Subarray Sum的follow up.主要区别在这里是将普通数组变化为了circular integer array.
Given k sorted integer arrays, merge them into one sorted array.
Given 3 sorted arrays:
[ [1, 3, 5, 7], [2, 4, 6], [0, 8, 9, 10, 11] ] return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].
这题和merge k sorted lists 一脉相承,但是处理起来要复杂些,即linked list可以非常容易的从当前结点通过.next找到它的下一个结点。但是arrays本身不可以,所以需要知道当前处理的是第几个数组,是这个数组中的什么位置。所以每次push进heap时同时要push进该元素来自第几个数组。但是这还不够,不知道具体在这个数组中是第几个位置。这里可以采取非常类似于Super Ugly Number的做法,维护一个times数组,表示当前处理到该数组的哪里了。代码如下:
class Solution: # @param {int[][]} arrays k sorted integer arrays # @return {int[]} a sorted array def mergekSortedArrays(self, arrays): import heapq if not arrays: return [] heap = [] indexs = [0] *len(arrays) for i in xrange(len(arrays)): if arrays[i]: heap.
《oracle大型数据库系统在AIX/unix上的实战详解》讨论28:两台机器间Oracle迁移的方法和过程 文平
大家新年好!
新年期间没有更新日志,也没有查收大家发来的邮件。今天回到工作岗位,一看,邮件若干未恢复,头大了…
抱歉,没有来得及恢复,千万别耽误大家的事情啊…
每天回复几封,争取周末完成!
总结问题一:关于数据库迁移
“我想请教一下,如何做数据库迁移,从一台AIX主机和存储,迁移到另一台AIX主机和存储。都需要做那些工作,谢谢。”
“两台新AIX主机双机,ORACLE软件是否应安装到AIX的主机硬盘,数据库在存储上,ORALCE软件不做RAC” 。
答复如下:
1:迁移
方法一:可以冷迁移:
RMAN备份,在另一台恢复。这要求二台机器的版本一致。
可以热迁移:
方法二:导出(exp/expdp、imp/ompdp)实现。二台机器的版本可与不一致。
各有优缺点
2:两台新AIX主机双机,ORACLE软件是否应安装到AIX的主机硬盘,数据库在存储上?
最好这样,使系统能保证最高的可恢复性!
祝:顺利
文平
转载于:https://www.cnblogs.com/dbserver/articles/1676765.html
如题 转载于:https://www.cnblogs.com/xtsong/archive/2008/06/21/1227248.html
用foxit reader 打印pdf 直接设置为双面打印并且一张2页打印,发现正反面刚好倒着来的,其实说的正反面倒着是从左右翻的角度来讲的,如果上下翻会发现刚好是这个顺序的,这个是要在双面打印设置里头去设置那个长边和短边的方向。在foxit reader 这里面 选择打印在弹出来的打印属性框中那个不是有个选择打印机的框,其后面有个属性按钮,点击这个属性按钮进去在这里可以设置双面打印, 设置完双面打印之后其下方刚好有个双面打印设置按钮, 单击这个双面打印设置进去就可以进行长边和短边的方向设置了。
转载于:https://www.cnblogs.com/AI-Algorithms/p/3840750.html
http://blog.163.com/yinhexiwen@126/blog/static/6404826620122942057214/
% figure 窗口最大化,坐标轴也随着窗口变大而相应变大 scrsz = get(0,'ScreenSize'); set(gcf,'Position',scrsz);
或者
set(gcf,'outerposition',get(0,'screensize'));
get(0,'ScreenSize'); 是为了获得屏幕大小,Screensize是一个4元素向量[left, bottom, width, height],然后用获得的screensize向量设置fig的position属性; get(0) 获取root object(根对象),根对象的所有属性和属性值见:http://www.baisi.net/viewthread.php?tid=6020
例: To create a figure window that is one quarter the size of your screen and is positioned in the upper left corner, use the root object's ScreenSize property to determine the size. ScreenSize is a four-element vector: [left, bottom, width, height]: scrsz = get(0,'ScreenSize'); figure('Position',[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2])
其实就是用来获得显示器的尺寸,然后确定新建窗口的位置和大小。
代替subplot:
1: /* 2: * We use the same basic approach as the old NTFS driver, i.e. we parse the 3: * index root entries and then the index allocation entries that are marked 4: * as in use in the index bitmap. 5: * 6: * While this will return the names in random order this doesn't matter for 7: * ->readdir but OTOH results in a faster ->readdir. 8: * 9: * VFS calls ->readdir without BKL but with i_mutex held.
在websevrice 中,soap header是十分重要的哦,主要是安全性的考虑,在asp.net 2.0中,可以简单地应用soap header来
进行傻瓜式的应用,更复杂的应用当然要更深入地去看了,
首先,我们写个简单的helloworld的webservice
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public ValidationSoapHeader Authentication;
private const string DEV_TOKEN = "12345";
public Service()
{
//Uncomment the following line if using designed components //InitializeComponent(); }
[SoapHeader("Authentication")]
[WebMethod]
public string HelloWorld()
{
if (Authentication != null && Authentication.DevToken == DEV_TOKEN)
{
return "Hello World";
}
else
很感谢creativepeter(头皮屑)提供的本连接地址( http://www.connectionstrings.com/) SQL Server ODBC Standard Security:
"Driver={SQL Server};Server=Aron1;Database=pubs;Uid=sa;Pwd=asdasd;" Trusted connection:
"Driver={SQL Server};Server=Aron1;Database=pubs;Trusted_Connection=yes;" Prompt for username and password:
oConn.Properties("Prompt") = adPromptAlways oConn.Open "Driver={SQL Server};Server=Aron1;DataBase=pubs;" OLE DB, OleDbConnection (.NET) Standard Security:
"Provider=sqloledb;Data Source=Aron1;Initial Catalog=pubs;User Id=sa;Password=asdasd;" Trusted Connection:
"Provider=sqloledb;Data Source=Aron1;Initial Catalog=pubs;Integrated Security=SSPI;" (use serverName\instanceName as Data Source to use an specifik SQLServer instance, only SQLServer2000) Prompt for username and password:
oConn.Provider = "sqloledb" oConn.Properties("Prompt") = adPromptAlways oConn.Open "Data Source=Aron1;Initial Catalog=pubs;" Connect via an IP address:
Ubuntu上的输入法主要有小小输入平台(支持拼音/二笔/五笔等),Fcitx,Ibus,Scim等。其中Scim和Ibus是输入法框架。 在Ubuntu的中文系统中自带了中文输入法,通过Ctrl+Space可切换中英文输入法。这里我们主要说下Ubuntu英文系统中,中文输入法的安装。 安装输入法的第一步,是安装语言包。我们选择System Settings-->Language Support-->Install/Remove Languages,将弹出以下窗口: 输入密码后,系统会安装简体中文语言包。 第二步,安装IBus框架,在终端输入以下命令: sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 启动IBus框架,在终端输入: im-switch -s ibus 安装完IBus框架后注销系统,保证更改立即生效。 第三步:安装拼音引擎 有下面几种常用选择: IBus拼音:sudo apt-get install ibus-pinyin IBUS五笔:sudo apt-get install ibus-table-wubi 谷歌拼音输入法:sudo apt-get install ibus-googlepinyin Sun拼音输入法:sudo apt-get install ibus-sunpinyin 第四步:设置IBus框架 ibus-setup 此时,IBus Preference设置被打开。我们在Input Method选项卡中,选择自己喜欢的输入方式,并配置自己喜欢的快捷键即可。如下图所示: 第五步:通常情况下,IBus图标(一个小键盘)会出现在桌面右上角的任务栏中。有时候这个图标会自行消失,可使用以下命令,找回消失的IBus图标: ibus-daemon -drx 转载于:https://www.cnblogs.com/kungfupanda/archive/2012/09/16/2687454.html
所谓的洗牌算法,大概意思就是将一组数随机打乱,说到随机,很容易就想到C里面的rand函数,en...说到这个函数,看看该函数如何使用
#include <stdio.h> #include <time.h> #include <stdlib.h> int main(int argc, char *argv[]) { srand(time(NULL)); for(int i=1;i <= 10;++i) { printf("%d\r\n",rand()); } return 0; } 这里我打印了10个数,可以快速的运行几组程序,其实可以发现每组程序出来的结果会很接近或者相似,为啥呢,可以跟进去看看源码
// Seeds the random number generator with the provided integer. extern "C" void __cdecl srand(unsigned int const seed) { __acrt_getptd()->_rand_state = seed; } // Returns a pseudorandom number in the range [0,32767]. extern "C" int __cdecl rand() { __acrt_ptd* const ptd = __acrt_getptd(); ptd->_rand_state = ptd->_rand_state * 214013 + 2531011; return (ptd->_rand_state >> 16) & RAND_MAX; } 可以看出,其算法之简陋,其代码中的_rand_state也就是种子,所以当srand传人一个固定值的话,每次随机出来的值也会一样。我们使用时间当种子,当快速运行几组程序后,其结果当然也会近似。所以在一些重要的工作场合中,要慎用rand函数随机,毕竟可能可以预测哦。
这两天打不开,不晓得怎么了。
论文初稿果然是一堆问题。编号级别,图片大小,字体等等等等。 转载于:https://www.cnblogs.com/yidinghe/archive/2005/05/30/164952.html
关于QString转string的堆异常
IDE是基于QT4.7(其他平台暂时没有测试)。在进行字符串转换时调用toStdString()进行转换出现了堆异常,代码如下:
QString Q_str("hello"); string S_str; S_str = Q_str.toStdString(); 程序运行到这里就会崩溃,提示说可能是堆被损坏。于是在网上寻找其出现错误的原因,然后结合自己的理解分享出来,如果有不对的地方还请解惑。
通过查找资料发现toStdString()在进行QString转换到string时会构建临时对象来存储数据,也就是说toStdString()返回的时临时地址,临时地址只在本行有效,程序往下运行之后就被释放了。那么程序提示堆错误的原因也就在这里:可以发现在执行赋值语句之前,S_str对象已经被创建了,它已经被系统分配空间,然后执行下面的赋值语句。string类型的变量在进行赋值时会delete之前的空间,重新new一个空间。这样就很好理解了:
S_str = Q_str.toStdString();会执行三个步骤:首先进行delete,然后进行new,最后把数据放到new的内存里。而toStdString()只是临时对象,在S_str搬运数据的时候,该地址已经被系统回收了,因此S_str访问的是非法内存地址,就会出现堆错误信息了。
基于以上原因,只需要对程序做稍微的修改即可,在创建S_str的构造函数里进行赋值:
QString Q_str("hello"); string S_str = Q_str.toStdString(); 这样虽然toStdString()是临时地址,但是在S_str构造函数里会创建局部变量来复制该地址里的数据,相当于toStdString()的生命周期延续到S_str构造函数结束的时候,这样就可以避免上述的bug了。
使用的STM32CubeMX版本为:
首先是串口配置:
补充DMA配置,之前漏了,这里用最新版本的CUBEMX的截图补充一下:
中断配置
DMA的模式选择NORMAL就行
这里默认就好~
大功告成之后生成工程代码~
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1,RxDMABuf_1,RXBUF_1_SIZE);
需要自行添加在void MX_USART1_UART_Init(void)内。其中RxDMABuf_1与RXBUF_1_SIZE是自定义的接收缓冲数组与数组大小。
void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//使能idle中断 HAL_UART_Receive_DMA(&huart1,RxDMABuf_1,RXBUF_1_SIZE);//打开DMA接收,数据存入rx_buffer数组中。 } void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct; if(uartHandle->Instance==USART1) { /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ /* USART1 clock enable */ __HAL_RCC_USART1_CLK_ENABLE(); /**USART1 GPIO Configuration PA9 ------> USART1_TX PA10 ------> USART1_RX */ GPIO_InitStruct.
先说结果:sql条件查询时 AND 优先。
sql 条件查询时 AND OR 是有优先级的。之前一直没注意,以为是同一优先级的,所以我平时写sql都会明确的在 and or 条件里边添加括号来表示作用域: (a=1 and b=1) or (a=2 and b=2)... 实际上等价于 a=1 and b=1 or a=2 and b=2
纠正我这个错误的契机是 我接手其他团队的一个项目,在看sql的过程中 ,优化了我认为是“存在重复、无用条件” 的一条sql,却导致结果输出错误,然后在调试过程中认识到的。
select * from user where name = "a" and age = 10 and gender=2 or gender = 1 and weight = 100 and name = "a" and age = 10 ##错误优化,我之前以为 and or 是同一优先级,把重复的条件去掉了。 select * from user where name = "
案例:Map集合若有key(键)与User类中的私有属性相同,就把对应的value值赋值给该私有属性。
User类
public class User { private int id; private String name; private String sex; private String address; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.
说明:
本文原创作者『strongerHuang』
首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop
标签:printf、 SWD、 SWO、 SWV、 ITM、 JLink-RTT、 ST-Link、 J-Link、 仿真、 重定义、 串口映射
一、写在前面 在MCU项目中,printf主要用于打印输出一些调试信息。比如:程序执行出错,输出相关错误提示信息。
前面在我公众号『strongerHuang』分享文章《基于STM32的多种printf用法》之后,大家反响还不错。
不过那篇文章只是简单写了一下,很多人觉得可以,索性就整理成更加详细的专栏文章。
目前整理了几篇文章:
二、printf输出方式 本系列教程主要是针对MCU的printf打印输出,常见的方式:
1.UART打印输出
2.仿真打印输出
3.SWO打印输出
4.JLink-RTT打印输出
除仿真之外,其它三种都是基于MCU硬件打印输出。
从打印效率来说:UART < SWO < JLink-RTT。
每一种printf打印输出方式应用场景不同,也各有各的特点。
三、实验现象 先让大家从实验现象了解一下printf的内容,后面文章讲述具体的配置。
3.1 UART打印输出 这种printf是最常见的使用UART串口输出方式,需要占用一个硬件UART串口。
3.2 仿真打印输出 只在集成开发环境中模拟printf仿真输出,不需要连接开发板(硬件MCU)即可实现。
3.3 SWO打印输出 SWO:Serial Wire Output,串行线输出
SWD:Serial Wire Debug,串行线调试
SWV:Serial Wire Viewer,串行线查看器
SWO输出,需要多一根SWO(引脚)线,同时需要借助SWV(查看器)查看数据,我打算整理4种查看方法:
·基于Keil的『Debug(printf)Viewer』
·基于IAR的『Terminal IO』
·基于ST-LINK Utility的『Serial Wire Viewer』
·基于J-Link的『SWO Viewer』
1.基于Keil的『Debug(printf)Viewer』
2.基于IAR的『Terminal IO』
3.基于ST-LINK Utility的『Serial Wire Viewer』
4.基于J-Link的『SWO Viewer』
前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。
1. PADS Logic 1.1 PADS LAYOUT 封装、元件库简介 1.2 PADS LAYOUT 常用功能界面介绍 感谢原作者详细地注释。
点击上方“蓝字”
技术的故事还有很多 只想与你 静静分享 N
和
我
公众号后台回复“java”,获得作者Java 知识体系/面试必看资料
背景
做过 JavaWeb 开发的对过滤器和拦截器肯定不会陌生,而且也会熟练的使用,但是关于过滤器和拦截器具体的区别和差异可能不是特别的了解,这篇文章就跟大家介绍下过滤器和拦截器的区别。
过滤器 Filter 首先介绍下什么是过滤器,过滤器英文叫 Filter,是 JavaEE 的标准,依赖于 Servlet 容器,使用的时候是配置在 web.xml 文件中的,可以配置多个,执行的顺序是根据配置顺序从上到下。常用来配置请求编码以及过滤一些非法参数,垃圾信息或者是网站登录验证码。
<!-- filter --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- filter end -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- filter end -->
参考实现 public class CaptchaFilter implements Filter { public void init(FilterConfig config) throws ServletException { } public void destroy() { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; String servletPath = request.