开始->运行
dcpromo
Learn and share.
开始->运行
dcpromo
Android SDK超级大(我现在有26.5G),而连接Google的速度超级慢,一次下载要好久。
最近准备在MAC进行Android开发,别的都好下载,但Adroid SDK就有些太大了,于是考虑从WIN下直接复制到MAC。
Android SDK主要由下面几部分组成:
/add-ons:GoogleAPI,操作系统无关 /build-tools:构建工具,这个和操作系统相关的,要重新下载 /docs:文档,操作系统无关 /extras:扩展内容,是否需要重新下载与其功能有关 /extras/android:操作系统无关 /extras/google:操作系统无关 /extras/intel:intel的硬件加速驱动,操作系统相关,需重新下载 /platforms:android平台,早期操作系统相关,后期将操作系统相关内容放到了build-tools中,可以全部拷贝过去,系统相关内容会自动重新下载 /platform-tools:管理工具,这个和操作系统相关的,要重新下载 /samples:demo,操作系统无关 /sources:android源码,操作系统无关 /system-images:android系统映像,操作系统无关 /temp:下载缓存,不需要拷贝 /tools:管理工具,这个和操作系统相关的,要重新下载
1、从Oracle下载MAC版本的JDK7
http://www.oracle.com/technetwork/java/javase/downloads/index.html
2、从Google下载MAC版本Android Studio和Android SDK Manager
http://developer.android.com/sdk/index.html
3、安装JDK7、Android Studio、Android SDK Manager,并下载需要版本的Android SDK
4、此时双击Android Studio会报错:
Android Studio was unable to find a valid JVM.
这是因为Android Studio默认使用JDK1.6.*的原因
在Finder中打开Application文件夹,在“Android Studio.app”上右键,显示程序包内容 编辑Content/Info.plist,修改属性JVMOptions->JVMVersion一行,从1.6.*修改为1.7.*
5、此时双击Android Studio会尝试从Google获取最新的Android SDK信息
Fetching Android SDK component information
当然你读不到啦,只好屏蔽初始化方法:
编辑Content/idea.properties/bin/idea.properties文件,添加一行 disable.android.first.run=true
6、现在Android Studio可以启动了,但是不能新建项目
需要告诉Android Studio,Android SDK在哪里:
主界面-》Configure-》Project Defaults-》Project Structure-》Android SDK location 填写Android SDK的绝对路径,保存,然后就能新建应用了
7、那就新建一个简单应用测试一下吧,当然先是虚拟机:
Starting emulator for AVD 'new' emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is properly installed and usable. CPU acceleration status: HAX kernel module is not installed!
这是因为HAXM模块没有安装,前往Android SDK根目录
安装下面的软件: PATH_TO_SDK/extras/intel/Hardware_Accelerated_Execution_Manager/IntelHAXM_1.1.1_for_10_9_and_above.dmg
8、然后就是在设备上测试,Android SDK找不到我的设备
#添加adb路径 echo "export PATH=${PATH}:/PATH_TO_SDK/android-sdk-macosx/platform-tools/">>~/.bash_profile #然后刷新一下 source .bash_profile #添加设备厂商ID(我的是小米),可以在系统报告中看到设备厂商ID信息 echo"0x2717">>~/.android/adb_usb.ini #杀掉adb服务 adb kill-server #重启adb服务 adb sever #PTP模式连上手机,当然要开启手机调试咯,这样就能看到设备了 adb devices
9、连上设备了,运行时报错:
Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.neohope.testapp/.LoginActivity } from null (pid=29619, uid=2000) not exported from uid 10139
这个错误是因为Main Activity没有设置,在Manifest中对应的Activity中增加如下设置即可
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
由于服务程序授权与用户桌面授权互不影响,所以即使在用户桌面映射了NAS盘符,在Windows服务程序下仍然是不可以访问的。
一般来说有这样几种做法来访问NAS或共享盘:
1、加入域,通过“域用户认证”或“通过将NAS资源设置对某台计算机授权”来达到访问NAS的目的
2、不加域,在Windows中添加与NAS相同的用户名及密码,服务程序通过该用户名密码登录,可以访问NAS
3、不加域,通过调阅API的方式来获得访问NAS的权限
A、VC实现如下:
DWORD AcessNetDrtive(TCHAR* szRemotePath, TCHAR* szLocalDriver, const TCHAR* szUsername, const TCHAR* szPassword) { DWORD dwRetVal; DWORD dwFlags; NETRESOURCE nr; memset(&nr, 0, sizeof(NETRESOURCE)); nr.dwScope = RESOURCE_GLOBALNET; nr.dwType = RESOURCETYPE_ANY; nr.lpLocalName = szLocalDriver; nr.lpRemoteName = szRemotePath; nr.lpProvider = NULL; //CONNECT_REDIRECT;CONNECT_UPDATE_PROFILE; dwFlags = 0; dwRetVal = WNetAddConnection2(&nr, szPassword, szUsername, dwFlags); retrun dwRetVal; }
B、C#实现如下:
public class NetworkDrive { public enum ResourceScope { RESOURCE_CONNECTED = 1, RESOURCE_GLOBALNET, RESOURCE_REMEMBERED, RESOURCE_RECENT, RESOURCE_CONTEXT } public enum ResourceType { RESOURCETYPE_ANY, RESOURCETYPE_DISK, RESOURCETYPE_PRINT, RESOURCETYPE_RESERVED } public enum ResourceUsage { RESOURCEUSAGE_CONNECTABLE = 0x00000001, RESOURCEUSAGE_CONTAINER = 0x00000002, RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004, RESOURCEUSAGE_SIBLING = 0x00000008, RESOURCEUSAGE_ATTACHED = 0x00000010, RESOURCEUSAGE_ALL = (RESOURCEUSAGE_CONNECTABLE | RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_ATTACHED), } public enum ResourceDisplayType { RESOURCEDISPLAYTYPE_GENERIC, RESOURCEDISPLAYTYPE_DOMAIN, RESOURCEDISPLAYTYPE_SERVER, RESOURCEDISPLAYTYPE_SHARE, RESOURCEDISPLAYTYPE_FILE, RESOURCEDISPLAYTYPE_GROUP, RESOURCEDISPLAYTYPE_NETWORK, RESOURCEDISPLAYTYPE_ROOT, RESOURCEDISPLAYTYPE_SHAREADMIN, RESOURCEDISPLAYTYPE_DIRECTORY, RESOURCEDISPLAYTYPE_TREE, RESOURCEDISPLAYTYPE_NDSCONTAINER } [StructLayout(LayoutKind.Sequential)] private class NETRESOURCE { public ResourceScope dwScope = 0; public ResourceType dwType = 0; public ResourceDisplayType dwDisplayType = 0; public ResourceUsage dwUsage = 0; public string lpLocalName = null; public string lpRemoteName = null; public string lpComment = null; public string lpProvider = null; } [DllImport("mpr.dll")] private static extern int WNetAddConnection2(NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags); public static int MapNetworkDrive(string remotePath, string localDrive, string userName, string passWord) { NETRESOURCE myNetResource = new NETRESOURCE(); myNetResource.lpLocalName = localDrive; myNetResource.lpRemoteName = remotePath; myNetResource.lpProvider = null; int result = WNetAddConnection2(myNetResource, passWord, userName, 0); return result; } }
最近项目中用了COM控件,同时也用了多线程,在等待线程退出的地方,使用了
AutoResetEvent[] tEevents; //... WaitHandle.WaitAll(tEevents);
程序运行到这里,就会报错:
不支持一个STA线程上针对多个句柄的WaitAll
当时事情很急,将其调整为
AutoResetEvent[] tEevents; //... foreach(var tEvent in tEevents) { tEvent.WaitOne(); }
就将这个问题绕了过去。
后来,在Stackoverflow上面,查了STA和MTA的区别。COM线程模型称为Apartment模型,分为STA和MTA两种。
STA(Single Thread Apartment):
STA是非线程安全的,常用于UI界面,其他线程要访问STA模式的COM组件,需要通过STA线程进行访问(其实就变成了单线程调用)
MTA(Multi Thread Apartment):
MTA是线程安全的,COM的程序员自己处理了并发的问题,其他线程可以直接访问COM组件
等了一个月,MAC一直卡在“加密已暂停,连接电源适配器”,当然不管插不插电,结果是一样的。
重启到command+r,关闭FileVault,还是不行。
好吧,这是逼着我干掉你了。
1、将MAC备份为移动硬盘上的映像文件。
2、重启进入MAC,用Time Mashine同样备份到移动硬盘上。
3、重启到command+r
4、磁盘工具,干掉当前分区
5、重建分区(不带加密的那个)
6、Time Mashine还原
7、重启进入MAC
8、Bootcamp分区,安装Win7,搞定!
最近帮朋友在新买的MBA上分区安装widows,但无论是bootcamp还是磁盘管理工具,都提示无法分区。
用磁盘管理工具直接分区的时候,提示“不允许此Core Storage操作在稀疏逻辑宗卷组上进行”。
不知道为什么,打电话问了Apple的客服,发现是默认开启了“FileVault”功能,压力山大。
到选项-》安全与隐私-》FileVault里关掉就可以了(FileVault要加密完毕后,才能关闭,所以现在用的是虚拟机)。
鄙视Apple,一点儿提示都没有,不就是SSD盘吗,有啥了不起的,哼。
另外,这台新版MBA,重启后按option,没有Recovery选项,客服小妹妹说新版MBA要按住command+r才有这个选项。
压力山大。
这台电脑是定制的i7+8G+128G的定制版本,不知道是不是MAC OS安装时是否和普通版本是一样的,还是客服小妹妹在忽悠我啊。
//Form程序 private static String getExeFileFolder() { String strExeFolder = System.Reflection.Assembly.GetExecutingAssembly().Location; int nPos = strExeFolder.LastIndexOf("\\"); if (nPos >= 0) { strExeFolder = strExeFolder.Substring(0, nPos + 1); } else { strExeFolder = strExeFolder + "\\"; } return strExeFolder; } //IIS程序 String rootPath = Request.PhysicalApplicationPath; String strExeFolder = getExeFileFolder(rootPath); private static String getExeFileFolder(String strExeFolder) { int nPos = strExeFolder.LastIndexOf("\\"); if (nPos >= 0) { strExeFolder = strExeFolder.Substring(0, nPos + 1); } else { strExeFolder = strExeFolder + "\\"; } return strExeFolder; }
int nMaxThreadNum = 5; List<List<JobParam>> jobQueue = new List<List<JobParam>>(); //... for (int i = 0; i < nMaxThreadNum;i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncDoRetrieve), jobQueue[i]); } static void AsyncDoRetrieve(object state) { if (!(state == null && state is List<JobParam>)) return; List<JobParam> jobParams= state as List<JobParam> ; foreach(JobParam param in jobParams) { param.delegateDoSomeThing.BeginInvoke(param,null,null); } }
1.IDBHelper.cs
interface IDBHelper { void initDB(); void closeDB(); void ExecSQL(String execSql); DataTable ExecQuery(String querySql); }
2.ZDBHelperSQLLite.cs
class ZDBHelperSQLLite : IDBHelper { String dataSource = ""; SQLiteConnection connection = null; public void initDB(String dbPath) { dataSource = "Data Source =" + dbPath(); connection = new SQLiteConnection(dbFile); connection.Open(); initTables(); CreateFileInfoTable(); } public void closeDB() { connection.Close(); } private void initTables() { String sqlCreate01 = "CREATE TABLE IF NOT EXISTS visitlog(user_id varchar(64), visit_path varchar(256), visit_time integer);"; SQLiteCommand cmdCreateTable = new SQLiteCommand(connection); cmdCreateTable.CommandText = sqlCreate01; cmdCreateTable.ExecuteNonQuery(); } public void ExecSQL(String execSql) { SQLiteTransaction transaction = connection.BeginTransaction(); SQLiteCommand cmdExec = new SQLiteCommand(execSql, connection, transaction ); cmdExec.ExecuteNonQuery(); transaction.Commit(); } public DataTable ExecQuery(String querySql) { SQLiteCommand cmdQuery = new SQLiteCommand(querySql, connection); SQLiteDataReader reader = cmdQuery.ExecuteReader(); DataTable datatable = new DataTable(); DataTable schemaTable = reader.GetSchemaTable(); foreach (DataRow myRow in schemaTable.Rows) { DataColumn myDataColumn = new DataColumn(); myDataColumn.DataType = myRow.GetType(); myDataColumn.ColumnName = myRow[0].ToString(); datatable.Columns.Add(myDataColumn); } schemaTable = null; while (reader.Read()) { DataRow myDataRow = datatable.NewRow(); for (int i = 0; i < reader.FieldCount; i++) { myDataRow[i] = reader[i].ToString(); } datatable.Rows.Add(myDataRow); myDataRow = null; } reader.Close(); return datatable; } }