SQL Server 笔记

列出数据库

SELECT name FROM master..sysdatabases ORDER BY name

列出表名

SELECT name FROM [database_name]..sysobjects WHERE xtype=’U’ ORDER BY name
xtype=’U':指用户表
xtype=’S':指系统表

列出字段

SELECT name FROM [database_name]..syscolumns WHERE id=Object_Id(‘table_name’)

Xcode 手动安装 iPhone simulator

随着 Xcode 的升级,在我们更新版本的同时,发现安装完后通常只有一个版本的 iPhone simulator。我们需要从网络下载其它版本的 iPhone simulator,在网速不给力的情况下是很浪费时间的。

当我们打开 Finder 窗口前往  /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs  时,可以发现该文件夹是用来存放所有 iPhone simulator 信息的,这样一来我们就有了其它解决方法了。

1. 如果以前版本的 Xcode 没有删除或其它电脑或同事有其它版本的 iPhone simulator 可以前往该文件夹直接将缺少的 iPhone simulator 复制到自己电脑的相应位置即可。

2. 如果您增加下载过其它版本的 iPhone simulator 并且没清缓存的话,可以前往 /Users/<用户名>/Library/Caches/com.apple.dt.Xcode/Downloads 文件里找着相应的安装包或在网上下载国内其它用户提供的 iPhone simulator 安装包(相对网速会比直接在 Xcode 上下载快)。注意:安装时需要选择安装位置,将位置指向 /Applications/Xcode.app/Contents 即可。

完成以上任意一个方法后,打开 Xcode 一般就能显示其它 iPhone simulator 了,如果还没显示的可以依次打开 Xcode => Preferences… => Downloads => Components 点击 Check and Install Now 按钮之后列表中相应的 iPhone simulator 状态会从 Install 变为 Installed,这时关闭 Downloads 窗口即可。

Mac OS X 笔记

# 桌面壁纸存储位置
/Library/Desktop Pictures

# 字体存放位置
/Library/Fonts

# Safari 插件位置
/Library/Internet Plug-Ins
~/Library/Internet Plug-Ins

# 文件的剪切操作
先在原目录 command+c 需要的文件,然后在目标目录 command+option+v

# 缓存位置
/Users/用户/Library/Caches

# 查看开机记录
last | grep reboot

# 查看关机记录
last | grep shutdown

Objective-C 的 @property 属性及参数

1. 关于 assign, copy, retain 的定义:

assign: 普通赋值(为基本数据类型准备的,只进行简单赋值)。
copy  : 拷贝对象(释放旧对象,克隆新对象并引用)。
retain : 引用对象(释放旧对象,引用新对象 )。

通常我们这样使用:

assign: 操作基本数据类型,如:NSInteger, CGFloat, int, float, double, char, …
copy  : 操作 NSString
retain : 操作 NSObject 及其子类

2. 关于属性的声明 @property:

一般形式:@property (参数1, 参数2) 类型 名称;

括号里的参数主要有以下三种:

1. 属性类型:getter=getterName, setter=setterName
2. 传递类型:assign(默认), copy, retain
3. 访问类型:readwrite, readonly
4. 原子类型:atomicity(默认), nonatomic

3. 关于属性的自动生成 @synthesize:

一般形式:@synthesize 成员变量;

Google 访问不了或访问慢的解决方案

今天上班时需要上 google 下载一些 SDK 开发包,可怎么也访问不上甚至显示“无法找到服务”。在网上搜了一下,发现有修改 hosts 解决访问不上或访问慢的问题。抱着试试的心态,将网上列的 google ip 在浏览器上访问,果真能访问上。

有了解决方案就好办了,于是我上几家网站把大部 google 对应的 ip 都抄下来写进 hosts 里保存即可。

203.208.46.146 www.google.com
203.208.46.146 id.google.com
203.208.46.146 encrypted.google.com
203.208.46.147 www.google.com.hk
203.208.46.132 clients1.google.com
203.208.46.132 webcache.googleusercontent.com
203.208.46.149 mail.google.com
203.208.46.157 0.docs.google.com
203.208.46.157 1.docs.google.com
203.208.46.161 docs.google.com
203.208.46.161 chatenabled.mail.google.com
203.208.46.161 mail-attachment.googleusercontent.com
203.208.46.161 encrypted-tbn0.google.com
203.208.46.162 encrypted-tbn1.google.com
203.208.46.163 encrypted-tbn2.google.com
203.208.46.164 encrypted-tbn3.google.com
203.208.46.174 dl.google.com
203.208.46.191 ssl.gstatic.com
74.125.31.93 dl-ssl.google.com

Linux 用户将以上地址映射添加到 /etc/hosts 文件末尾保存即可。

Windows 用户将地址映射添加到 c:\windows\system32\drivers\etc\hosts 里。

SensorEventListener

监视传感器事件

要监视原始的传感器数据,你需要实现两个通过 SensorEventListener 接口暴露的回调方法:onAccuracyChanged() 和 onSensorChanged()。Android 系统在任何发生下列事情的时候都会调用这两个方法:

1. 传感器精度的改变:

这种情况中,系统会调用 onAccuracyChanged() 方法,它提供了你要引用的发生精度变化的 Sensor 对象。精度使用以下四个状态常量之一来代表的:

SENSOR_STATUS_ACCURACY_LOW
SENSOR_STATUS_ACCURACY_MEDIUM
SENSOR_STATUS_ACCURACY_HIGH
SENSOR_STATUS_UNRELIABLE

2. 传感器报告新的值:

这种情况中,系统会调用onSensorChanged()方法,它提供了一个SensorEvent对象。SensorEvent对象包含了有关新的传感器数据的信息,包括:数据的精度、产生数据的传感器、产生数据时的时间戳、以及传感器记录的新的数据。

下列代码显示了如何使用 onSensorChanged() 方法来监视来自亮度传感器的数据。这个例子在一个 TextView 中显示原始的传感器数据:

public class SensorActivity extends Activity implements SensorEventListener{
  private SensorManager mSensorManager;
  private Sensor mLight;

  @Override
  public final void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mSensorManager=(SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
  }

  @Override
  public final void onAccuracyChanged(Sensor sensor,int accuracy){
    // Do something here if sensor accuracy changes.
  }

  @Override
  publicfinalvoid onSensorChanged(SensorEventevent){
    // The light sensor returns a single value.
    // Many sensors return 3 values, one for each axis.
    float lux =event.values[0];

    // Do something with this sensor value.
  }

  @Override 
  protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL); 
  }

  @Override 
  protected void onPause() { 
    super.onPause(); 
    mSensorManager.unregisterListener(this); 
  }
}

在这个例子中,在调用 registerListener() 方法时,指定了默认的数据延迟 SENSOR_DELAY_NORMAL。数据延迟(或采样率)控制着传感器事件通过 onSensorChanged() 回调方法发送给你的应用程序的时间间隔。默认的数据延迟适用于监视典型的屏幕方向的变化,它所使用的时间延迟是200,000毫秒。你能够指定其他的数据延迟类型,如 SENSOR_DELAY_GAME(20,000毫秒延迟)、SENSOR_DELAY_UI(60,000毫秒延迟)、或者是SENSOR_DELAY_FASTEST(0毫秒延迟)。Android3.0(API Level 11)以后,你也能够使用一个绝对值(以毫秒的形式)来指定延迟。

你所指定的延迟只是建议性的延迟。Android系统和其他应用程序都能够修改这个延迟。作为最好的实践,你应该指定你所需要的最大延迟,因为系统通常会使用比你指定的要小的延迟(也就是说,你应该选择你的应用所需要的最低的采样率)。使用较大的延迟会降低处理器的负载,同时也因此降低了电量的损耗。

没有公开的方法用于判断传感器框架把传感器事件发送给你的应用程序的频率;但是,你能够使用前后两个传感器事件的时间戳来计算采样率。一旦你设置了采样率(延迟)就不要改变。如果因为某些原因需要改变,那么就必须先注销然后在重新注册传感器监听器。

在这个例子中还要重点关注的是:使用 onResume() 和 onPause() 回调方法来注册和注销传感器监听事件。作为最好的实践,你始终应该在不需要的时候禁用传感器,尤其是在 Activity 被挂起的时候。如果不这样做,因为有些传感器有很大的电量需求,因此会很快的消耗掉电池电量。在屏幕关闭的时候,系统不会自动的禁用传感器。