长尾效应
posted @ 2012-05-16 13:40 myphoebe 阅读(8) 评论(0) 编辑
posted @ 2012-05-16 13:40 myphoebe 阅读(8) 评论(0) 编辑
View Code
1 package com.cons.dcg.collect; 2 3 import java.io.File; 4 import java.text.SimpleDateFormat; 5 import java.util.*; 6 import android.app.*; 7 import android.content.Intent; 8 import android.database.Cursor; 9 import android.net.Uri; 10 import android.os.AsyncTask; 11 import android.os.Bundle; 12 import android.os.Environment; 13 import android.provider.MediaStore; 14 import android.view.*; 15 import android.widget.*; 16 17 public class RecordActivity extends Activity implements OnClickListener { 18 19 private static final int RESULT_CAPTURE_IMAGE = 1;// 照相的requestCode 20 private static final int REQUEST_CODE_TAKE_VIDEO = 2;// 摄像的照相的requestCode 21 private static final int RESULT_CAPTURE_RECORDER_SOUND = 3;// 录音的requestCode 22 23 private String strImgPath = "";// 照片文件绝对路径 24 private String strVideoPath = "";// 视频文件的绝对路径 25 private String strRecorderPath = "";// 录音文件的绝对路径 26 27 @Override 28 protected void onCreate(Bundle savedInstanceState) { 29 super.onCreate(savedInstanceState); 30 this.setContentView(R.layout.problem_report); 31 } 32 33 @Override 34 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 35 super.onActivityResult(requestCode, resultCode, data); 36 switch (requestCode) { 37 case RESULT_CAPTURE_IMAGE://拍照 38 if (resultCode == RESULT_OK) { 39 Toast.makeText(this, strImgPath, Toast.LENGTH_SHORT).show(); 40 } 41 break; 42 case REQUEST_CODE_TAKE_VIDEO://拍摄视频 43 if (resultCode == RESULT_OK) { 44 Uri uriVideo = data.getData(); 45 Cursor cursor=this.getContentResolver().query(uriVideo, null, null, null, null); 46 if (cursor.moveToNext()) { 47 /** _data:文件的绝对路径 ,_display_name:文件名 */ 48 strVideoPath = cursor.getString(cursor.getColumnIndex("_data")); 49 Toast.makeText(this, strVideoPath, Toast.LENGTH_SHORT).show(); 50 } 51 } 52 break; 53 case RESULT_CAPTURE_RECORDER_SOUND://录音 54 if (resultCode == RESULT_OK) { 55 Uri uriRecorder = data.getData(); 56 Cursor cursor=this.getContentResolver().query(uriRecorder, null, null, null, null); 57 if (cursor.moveToNext()) { 58 /** _data:文件的绝对路径 ,_display_name:文件名 */ 59 strRecorderPath = cursor.getString(cursor.getColumnIndex("_data")); 60 Toast.makeText(this, strRecorderPath, Toast.LENGTH_SHORT).show(); 61 } 62 } 63 break; 64 } 65 } 66 67 68 69 /** 70 * 照相功能 71 */ 72 private void cameraMethod() { 73 Intent imageCaptureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 74 strImgPath = Environment.getExternalStorageDirectory().toString() + "/CONSDCGMPIC/";//存放照片的文件夹 75 String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".jpg";//照片命名 76 File out = new File(strImgPath); 77 if (!out.exists()) { 78 out.mkdirs(); 79 } 80 out = new File(strImgPath, fileName); 81 strImgPath = strImgPath + fileName;//该照片的绝对路径 82 Uri uri = Uri.fromFile(out); 83 imageCaptureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 84 imageCaptureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 85 startActivityForResult(imageCaptureIntent, RESULT_CAPTURE_IMAGE); 86 87 } 88 89 /** 90 * 拍摄视频 91 */ 92 private void videoMethod() { 93 Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); 94 intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); 95 startActivityForResult(intent, REQUEST_CODE_TAKE_VIDEO); 96 } 97 98 /** 99 * 录音功能 100 */ 101 private void soundRecorderMethod() { 102 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 103 intent.setType("audio/amr"); 104 startActivityForResult(intent, RESULT_CAPTURE_RECORDER_SOUND); 105 } 106 107 /** 108 * 提示信息 109 * @param text 110 * @param duration 111 */ 112 private void showToast(String text, int duration) { 113 Toast.makeText(ProblemReport.this, text, duration).show(); 114 } 115 }
posted @ 2012-04-25 19:09 myphoebe 阅读(30) 评论(0) 编辑
View Code
1 package irdc.ex07_11; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.util.ArrayList; 6 7 import android.app.Activity; 8 import android.content.Intent; 9 import android.media.MediaRecorder; 10 import android.net.Uri; 11 import android.os.Bundle; 12 import android.os.Environment; 13 import android.view.View; 14 import android.widget.AdapterView; 15 import android.widget.ArrayAdapter; 16 import android.widget.CheckedTextView; 17 import android.widget.ImageButton; 18 import android.widget.ListView; 19 import android.widget.TextView; 20 import android.widget.Toast; 21 22 public class EX07_11 extends Activity 23 { 24 private ImageButton myButton1; 25 private ImageButton myButton2; 26 private ImageButton myButton3; 27 private ImageButton myButton4; 28 29 private ListView myListView1; 30 private String strTempFile = "ex07_11_"; 31 private File myRecAudioFile; 32 private File myRecAudioDir;// 得到Sd卡path 33 private File myPlayFile; 34 private MediaRecorder mMediaRecorder01; 35 36 private ArrayList<String> recordFiles; 37 private ArrayAdapter<String> adapter;// 用于ListView的适配器 38 private TextView myTextView1; 39 private boolean sdCardExit; 40 private boolean isStopRecord; 41 42 /** Called when the activity is first created. */ 43 @Override 44 public void onCreate(Bundle savedInstanceState) 45 { 46 super.onCreate(savedInstanceState); 47 setContentView(R.layout.main); 48 //主要是4个控制按钮(录制,停止,播放,删除) 49 myButton1 = (ImageButton) findViewById(R.id.ImageButton01); 50 myButton2 = (ImageButton) findViewById(R.id.ImageButton02); 51 myButton3 = (ImageButton) findViewById(R.id.ImageButton03); 52 myButton4 = (ImageButton) findViewById(R.id.ImageButton04); 53 //列表出指定文件夹中所有amr格式音频文件 54 myListView1 = (ListView) findViewById(R.id.ListView01); 55 myTextView1 = (TextView) findViewById(R.id.TextView01); 56 57 myButton2.setEnabled(false); 58 myButton3.setEnabled(false); 59 myButton4.setEnabled(false);
布局文件main.xml
View Code
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" android:layout_width="fill_parent" 4 android:layout_height="fill_parent" android:background="@drawable/white"> 5 <LinearLayout android:id="@+id/LinearLayout01" 6 android:layout_width="wrap_content" android:layout_height="wrap_content"> 7 <ImageButton android:id="@+id/ImageButton01" 8 android:layout_width="wrap_content" android:layout_height="wrap_content" 9 android:src="@drawable/record"> 10 </ImageButton> 11 <ImageButton android:id="@+id/ImageButton02" 12 android:layout_width="wrap_content" android:layout_height="wrap_content" 13 android:src="@drawable/stop"> 14 </ImageButton> 15 <ImageButton android:id="@+id/ImageButton03" 16 android:layout_width="wrap_content" android:layout_height="wrap_content" 17 android:src="@drawable/play"> 18 </ImageButton> 19 <ImageButton android:id="@+id/ImageButton04" 20 android:layout_width="wrap_content" android:layout_height="wrap_content" 21 android:src="@drawable/delete"> 22 </ImageButton> 23 </LinearLayout> 24 <TextView android:id="@+id/TextView01" android:layout_width="wrap_content" 25 android:layout_height="wrap_content" android:textColor="@drawable/black"> 26 </TextView> 27 <ListView android:id="@+id/ListView01" android:layout_width="wrap_content" 28 android:layout_height="wrap_content" android:background="@drawable/black"> 29 </ListView> 30 </LinearLayout>
my_simple_list_item.xml文件
View Code
1 <?xml version="1.0" encoding="utf-8"?> 2 <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 3 android:id="@+id/myCheckedTextView1" android:layout_width="fill_parent" 4 android:layout_height="fill_parent" android:textColor="@drawable/white" />
权限设置
<uses-permission android:name="android.permission.RECORD_AUDIO" />
posted @ 2012-04-25 19:08 myphoebe 阅读(127) 评论(1) 编辑
Google为android的开发者提供了一套相当完善的地图应用接口,开发者可以很方便的使用这些接口来做一些LBS应用程序。
我所使用的开发环境是eclipse,另外再用ADT工具安装Google Maps library组件(这个库是Google APIs add-on的一部分,要确保开发环境里已经安装了这个库)。
具体调用 google map 的流程为:网上申请Maps API Key=>创建一个MapActivity=>在地图上添加自定义图层
一.如何获得Maps API Key?
1.在命令行里用keytool命令生成一个MD5 certificate fingerprint
$ keytool -list -alias alias_name -keystore my-release-key.keystore
根据提示输入密码等信息,然后可以得到如下MD5 certificate fingerprint
Certificate fingerprint (MD5): 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98
只有获得了这个MD5 certificate fingerprint才可以在注册页面获取key.
2.注册Maps API Key
打开http://code.google. com/android/maps-api-signup.html
在这个页面输入你的MD5 certificate fingerprint就可以获取Maps API Key.这里我们得到的key为
08dkmLW5o********PgzGDxT9mb1JKOoV3Rhrlw
二、创建一个MapActivity
1.在eclipse中创建一个名字为HelloGoogleMaps的android工程。因为我们要调用地图API,所以在选择Build Target的时候一定要选择Google APIs。
2.编辑XML文件。
mail.xml
<?xml version="1.0" encoding="utf-8"?> <com.google.android.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" android:apiKey="08dkmLW5o********PgzGDxT9mb1JKOoV3Rhrlw" />
android:apiKey即是我们刚才申请得到的Maps Key,这里一定不能出错,否则可能会无法得到map tiles。
3.修改AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.HelloGoogleMaps" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.INTERNET" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".HelloGoogleMaps" android:theme="@android:style/Theme.NoTitleBar" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="com.google.android.maps" /> </application> <uses-sdk android:minSdkVersion="8" /> </manifest>
因为map tiles来自于google map server,所以我们需要加上
<uses-permission android:name="android.permission.INTERNET" /> 让application可以访问internet.
另外再application标签下面需要添加<uses-library android:name="com.google.android.maps" /> 指明我们要用到google map的library。
4.创建一个继承自MapActivity的类。
package com.HelloGoogleMaps; import android.os.Bundle; import com.google.android.maps.MapActivity; import com.google.android.maps.MapView; public class HelloGoogleMaps extends MapActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); MapView mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } }
完成了以上步骤,运行程序就可以看到自己的activity可以显示google map了。
三、添加自定义图层
我们调用google map的目的是为了在map上面显示自己想显示的内容,比如显示用户当前的位置(需要调用GPS) ,或是将某一个兴趣点(Point Of Interest)在地图上显示出来等。这样就需要在google map上面添加自定义的图层了。
1.创建一个继承自ItemizedOverlay的class
import java.util.ArrayList; import android.app.AlertDialog; import android.content.Context; import android.graphics.drawable.Drawable; import com.google.android.maps.ItemizedOverlay; import com.google.android.maps.OverlayItem; public class ZPoiItem extends ItemizedOverlay { private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); private Context mContext; public ZPoiItem(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); } public ZPoiItem(Drawable defaultMarker, Context context) { super(defaultMarker); mContext = context; } public void addOverlay(OverlayItem overlay) { mOverlays.add(overlay); populate(); } @Override protected OverlayItem createItem(int i) { // TODO Auto-generated method stub return mOverlays.get(i); } @Override public int size() { // TODO Auto-generated method stub return mOverlays.size(); } @Override protected boolean onTap(int index) { // OverlayItem item = mOverlays.get(0);//OverlayItem item = mOverlays.get(index); // AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); // dialog.setTitle(item.getTitle()); // dialog.setMessage(item.getSnippet()); // dialog.show(); return true; } }
创建好了ZPoiItem类,回到HelloGoogleMaps类,添加变量
private MapController mMapController
该变量用于控制地图的,比如设置地图中心点,设置地图比例尺等。
然后在onCreate函数的末尾添加如下代码:
mMapController = mapView.getController(); List<Overlay> mapOverlays = mapView.getOverlays(); Drawable drawable = this.getResources().getDrawable(R.drawable.star_big_on);//star_big_on is an icon id. ZPoiItem itemizedoverlay = new ZPoiItem(drawable); GeoPoint point = new GeoPoint(1288515,103853388); //a poi in Singapore mMapController.setCenter(point);//set map center mMapController.setZoom(12);//set map scale mMapController.animateTo(point); OverlayItem overlayitem = new OverlayItem(KeywordSearchResultActivity.mSelPoint, "Hola, Mundo!", "I'm in Mexico City!"); itemizedoverlay.addOverlay(overlayitem); mapOverlays.add(itemizedoverlay);
至此已完成了在google map上添加自定义图层。效果图如下:

后 记:值得一提的是,android的map软件需要签名以后才能发布给其他手机,这个签名过程用eclipse的GUI可以很方便的完成,右键工程根目录 选择Android Tools->Export signed application package...,进入签名设置界面,根据提示一步步完成签名。用签好名的.apk安装到手机里可以看到如上所示的结果。Google map的API非常丰富,开发者可以利用这些函数接口编写各种各样的LBS软件或是其他基于地图的应用软件。Foursuqare就是一个不错的调用 google map的LBS软件。
posted @ 2012-04-25 19:06 myphoebe 阅读(20) 评论(0) 编辑
posted @ 2012-04-25 19:02 myphoebe 阅读(17) 评论(0) 编辑
导读:习惯的力量是惊人的。习惯能载着你走向成功,也能驮着你滑向失败。如何选择,完全取决于你自己。
1.习惯的力量:35岁以前养成好习惯
你想成功吗?那就及早培养有利于成功的好习惯。
习惯的力量是惊人的,35岁以前养成的习惯决定着你是否成功。
有这样一个寓言故事:
可见,习惯对我们有着绝大的影响,因为它是一贯的,在不知不觉中,经年累月地影响着我们的行为,影响着我们的效率,左右着我们的成败。
一个人一天的行为中,大约只有5%是属于非习惯性的,而剩下的95%的行为都是习惯性的。即便是打破常规的创新,最终可以演变成为习惯性的创新。
根据行为心理学的研究结果:3周以上的重复会形成习惯;3个月以上的重复会形成稳定的习惯,即同一个动作,重复3周就会变成习惯性动作,形成稳定的习惯。
我想,人类之于环境也是如此。人类在适应外界大环境中,又创造出适合于自己的小环境,然后用习惯把自己困在自己所创造的环境中。所以,习惯决定着你的活动空间的大小,也决定着你的成败。养成好习惯对于你的成功非常重要。
心理学巨匠威廉·詹姆士说:"播下一个行动,收获一种习惯;播下一种习惯,收获一种性格;播下一种性格,收获一种命运。"
2.35岁以前成功必备的9大习惯
好习惯会使成功不期而至。我认为下面9个好习惯是成功必备的:
(1)积极思维的好习惯
可见,事物本身并不影响人,人们只受到自己对事物看法的影响,人必须改变被动的思维习惯,养成积极的思维习惯。
怎样才算养成了积极思维的习惯呢?当你在实现目标的过程中,面对具体的工作和任务时,你的大脑里去掉了"不可能"三个字,而代之以"我怎样才能"时,可以说你就养成了积极思维的习惯了。
(2)高效工作的好习惯
一个人成功的欲望再强烈,也会被不利于成功的习惯所撕碎,而溶入平庸的日常生活中。所以说,思想决定行为,行为形成习惯,习惯决定性格,性格决定命运。你要想成功,就一定要养成高效率的工作习惯。
确定你的工作习惯是否有效率,是否有利于成功,我觉得可以用这个标准来检验:即在检省自己工作的时候,你是否为未完成工作而感到忧虑,即有焦灼 感。如果你应该做的事情而没有做,或做而未做完,并经常为此而感到焦灼,那就证明你需要改变工作习惯,找到并养成一种高效率的工作习惯。
高效工作从办公室开始:
计划习惯,就等于计划成功。
凡事制定计划有个名叫约翰·戈达德的美国人,当他15岁的时候,就把自己一生要做的事情列了一份清单,被称做"生命清单"。在这份排列有序的清单 中,他给自己所要攻克的127个具体目标。比如,探索尼罗河、攀登喜马拉雅山、读完莎士比亚的著作、写一本书等。在44年后,他以超人的毅力和非凡的勇 气,在与命运的艰苦抗争中,终于按计划,一步一步地实现了106个目标,成为一名卓有成就的电影制片人、作家和演说家。
中国有句老话:"吃不穷,喝不穷,没有计划就受穷。"尽量按照自己的目标,有计划地做事,这样可以提高工作效率,快速实现目标。
(3)养成锻炼身体的好习惯
增强保健意识
计划习惯,就等于计划成功。如果你想成就一番事业,你就必须有一个健康的身体;要想身体健康,首先要有保健意识。
我认识一个大学教师,身体一直很健康。早些时候,我们经常在一起玩。在谈及各人身体状况时,他说肾部偶尔有轻微不适的感觉。我们曾劝他去医院检查 一下,但他自恃身体健康,不以为意。直至后来感觉比较疼痛,其爱人才强迫他去检查。诊断结果是晚期肾癌。虽经手术化疗的等治疗措施,但终未能保住生命,死 时才39 岁。此前,他曾因学校分房、评职称不如意,心情一直抑郁,他的病和情绪有关,但如果他保健意识强,及早去检查,完全有可以进行预防,消患于未萌。保健意识 差,让他付出了生命的代价。
如何落实保健意识呢?一是要有生命第一、健康第一的意识,有了这种意识,你就会善待自己的身体、自己的心理,而不会随意糟踏自己的身体。二是要注 意掌握一些相关的知识。三是要使自己有一个对身体应变机制:定期去医院做身体检查;身体觉得有不适的地方,应及早去医院检查;在有条件的情况下,可以请一 个保健医生,给自己的健康提出忠告。
▲有计划地锻炼身体
锻炼身体的重要性已经越来越多地为人们所接受,但我感觉很多人只停留在重视的意识阶段,而缺乏相应的行动。我认为锻炼既要针对特定工作姿势所能引发的相应疾病有目的地进行,以防止和治疗相应的疾病,更要把锻炼当作一种乐趣,养成锻炼的习惯。
因为工作需要,我经常与客户打交道,并因处理突发事情四处奔忙,这在一定程度起到了锻炼身体的作用,同时,我还每周坚持游泳一到两次,以保证有足够的精力去做工作,去享受生活。
身体锻炼,就像努力争取成功一样,贵在坚持。
除上述两点以,注意饮食结构,合理膳食,以及注意养成好的卫生习惯等,都是养成健康习惯的组成部分。
总之,健康是"革命"的本钱,是成功的保证。健康成就自己。
(4)不断学习的好习惯"万般皆下品,唯有读书高"的年代已经过去了,但是养成读书的好习惯则永远不会过时。
哈利·杜鲁门是美国历史上著名的总统。他没有读过大学,曾经营农场,后来经营一间布店,经历过多次失败,当他最终担任政府职务时,已年过五旬。但 他有一个好习惯,就是不断地阅读。多年的阅读,使杜鲁门的知识非常渊博。他一卷一卷地读了《大不列颠百科全书》以及所有查理斯·狄更斯和维克多·雨果的小 说。此外,他还读过威廉·莎士比亚的所有戏剧和十四行诗等。
杜鲁门的广泛阅读和由此得到的丰富知识,使他能带领美国顺利度过第二次世界大战的结束时期,并使这个国家很快进入战后繁荣。他懂得读书是成为一流 领导人的基础。读书还使他在面对各种有争议的、棘手的问题时,能迅速做出正确的决定。例如,在20世纪50年代他顶住压力把人们敬爱的战争英雄道格拉斯· 麦克阿瑟将军解职。
他的信条是:"不是所有的读书人都是一名领袖,然而每一位领袖必须是读书人。"
美国前任总统克林顿说:在19世纪获得一小块土地,就是起家的本钱;而21世纪,人们最指望得到的赠品,再也不是土地,而联邦政府的奖学金。因为他们知道,掌握知识就是掌握了一把开启未来大门的钥匙。"
每一个成功者都是有着良好阅读习惯的人。世界500家大企业的CEO至少每个星期要翻阅大概30份杂志或图书资讯,一个月可以翻阅100多本杂志,一年要翻阅1000本以上。
世界500家大企业的CEO至少每个星期要翻阅大概30份杂志或图书资讯,一个月可以翻阅100多本杂志,一年要翻阅1000本以上。如果你每天 读15分钟,你就有可能在一个月之内读完一本书。一年你就至少读过12本书了,10年之后,你会读过总共120本书!想想看,每天只需要抽出15分钟时 间,你就可以轻易地读完120本书,它可以帮助你在生活的各方面变得更加富有。如果你每天花双倍的时间,也就是半个小时的话,一年就能读25本书--10 年就是 250本!
我觉得,每一个想在35岁以前成功的人,每个月至少要读一本书,两本杂志。
(5)谦虚的好习惯
一个人没有理由不谦虚。相对于人类的知识来讲,任何博学者都只能是不及格。
谦虚不仅是一种美德,更是是一种人生的智慧,是一种通过贬低自己来保护自己的计谋。
(6)自制的好习惯
任何一个成功者都有着非凡的自制力。
三国时期,蜀相诸葛亮亲自率领蜀国大军北伐曹魏,魏国大将司马懿采取了闭城休战、不予理睬的态度对付诸葛亮。他认为,蜀军远道来袭,后援补给必定不足,只要拖延时日,消耗蜀军的实力,一定能抓住良机,战胜敌人。
抑制不住情绪的人,往往伤人又伤己如果司马懿不能忍耐一时之气,出城应战,那么或许历史将会重写。
现代社会,人们面临的诱惑越来越多,如果人们缺乏自制力,那么就会被诱惑牵着鼻子走,偏离成功的轨道。
(7)幽默的好习惯
有人说,男人需要幽默,就像女人需要一个漂亮的脸蛋一样重要。
男人需要幽默,就像女人需要一个漂亮的脸蛋一样重要。
没有幽默的男人不一定就差,但懂得幽默的男人一定是一个优秀的人,懂得幽默的女人更是珍稀动物。
(8)微笑的好习惯
微笑是大度、从容的表现,也是交往的通行证。
在欧美发达国家,人们见面都要点头微笑,使人们相互之间感到很温暖。而在中国,如果你在大街上向一个女士微笑,那么你可能被说成"有病"。向西方人学习,让我们致以相互的微笑吧。
从古至今,敬业是所有成功人士最重要的品质之一。
(9)敬业、乐业的好习惯
敬业是对渴望成功的人对待工作的基本要求,一个不敬业的人很难在他所从事的工作中做出成绩。
posted @ 2012-04-11 10:26 myphoebe 阅读(14) 评论(0) 编辑
①jQuery在其他库加载之后
这种情况下,将使用JQuery.noConflict()函数来将$变量的控制权移交给其他JavaScript库。
例如:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head> <script type="text/javascript" src="./prototypes.js"></script> <!--jQuery库在其他库加载之后--> <script type="text/javascript" src="./JQuery.js"></script> <!--通过noConflict函数--> <script type="text/javascript"> //使用noConflict()方法 JQuery.noConflict(); JQuery(function(){ JQuery("p").click(function(){ alert(JQuery(this).text)); }); }); </script> </head> <body> <p>Hello World!</p> </body> </html>
②JQuery在其他库导入之前
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <!--jQuery库在其他库加载之前--> <script type="text/javascript" src="./JQuery.js"></script>< script type="text/javascript" src="./prototypes.js"></script> <!--通过noConflict函数--> <script type="text/javascript"> JQuery(function(){ //直接使用jQuery对象,无需noConflict函数 JQuery("p").click(function(){ alert(JQuery(this).text()); }); }); </script> </head> <body> <p>Hello World!</p> </body> </html>
posted @ 2012-04-10 17:37 myphoebe 阅读(9) 评论(0) 编辑
在学习JS的面向对象过程中,一直对constructor与prototype感到很迷惑,看了一些博客与书籍,觉得自己弄明白了,现在记录如下:
我们都知道,在JS中有一个function的东西。一般人们叫它函数。比如下面的代码:
function Person(name) { alert(name); } Person('js');//js
上面的代码中,Person的表现的确跟一般的函数没有什么区别,接着看下面的代码
function Person(name) { this.name=name; this.showMe=function() { alert(this.name); } }; var one=new Person('JavaScript'); one.showMe();//JavaScript
很多人见到了久违的new操作符,于是就叫Person为“类”,可是又没有关键字class的出现,觉得叫“类”有点勉强。于是退而求其次叫 Person为类的构造函数。这些概念好像都没有错,之所以出现这样的情况,可能是因为大家都学习了传统的面向对象语言(c++,c#,java等),还 有一种思维定势吧。为了让javascript也面向对象,要在javascript中找到与传统面向对象语言的影子。
可是按照javascript的说法,function定义的这个Person就是一个Object(对象),而且还是一个很特 殊的对象,这个使用function定义的对象与使用new操作符生成的对象之间有一个重要的区别。这个区别就是function定义的对象有一个 prototype属性,使用new生成的对象就没有这个prototype属性。
prototype属性又指向了一个prototype对象,注意prototype属性与prototype对象是两个不同的东西,要注意区别。在prototype对象中又有一个constructor属性,这个constructor属性同样指向一个constructor对象,而这个constructor对象恰恰就是这个function函数本身。
有点头晕,看下图吧:
不相信可以看下面的代码:
function Person(name) { this.name=name; this.showMe=function() { alert(this.name); } }; var one=new Person('js'); alert(one.prototype)//undefined alert(typeof Person.prototype);//object alert(Person.prototype.constructor);//function Person(name) {...};
上面的代码证明了one这个对象没有prototype属性。
我们接着看代码:
function Person(name) { this.name=name; this.showMe=function() { alert(this.name); } }; Person.prototype.from=function() { alert('I come from prototype.'); } var one=new Person('js'); one.showMe();//js,这个结果没有什么好奇怪的 one.from();//I come from prototype.,这个结果有一点奇怪吧
要解释这个结果就要仔细研究一下new这个操作符了.var one=new Person('js');这个语句执行的过程可以分成下面的语句:
按照《悟透javascript》书中说的,new形式创建对象的过程实际上可以分为三步:
第一步是建立一个新对象(叫A吧);
第二步将该对象(A)内置的原型对象设置为构造函数(就是Person)prototype 属性引用的那个原型对象;
第三步就是将该对象(A)作为this 参数调用构造函数(就是Person),完成成员设置等初始化工作。
其中第二步中出现了一个新名词就是内置的原型对象,注意这个新名词跟prototype对象不是一回事,为了区别我叫它inobj,inobj就 指向了函数Person的prototype对象。在person的prototype对象中出现的任何属性或者函数都可以在one对象中直接使用,这个 就是javascript中的原型继承了。
又头晕了,上图吧!
这样one对象通过内置的原型对象inobj就可以直接访问Person的prototype对象中的任何属性与方法了。这也就解释了上面的代码 中为什么one可以访问form函数了。因为prototype对象中有一个constructor属性,那么one也可以直接访问 constructor属性。
function Person(name) { this.name=name; this.showMe=function() { alert(this.name); } }; Person.prototype.from=function() { alert('I come from prototype.'); } var one=new Person('js'); one.showMe();//js,这个结果没有什么好奇怪的 one.from();//I come from prototype.,这个结果有一点奇怪吧 alert(one.constructor);//function Person(name) {...} alert(Person.prototype.constructor);//function Person(name) {...}
接着看继承是如何实现的。
function Person(name) { this.name=name; this.showMe=function() { alert(this.name); } }; Person.prototype.from=function() { alert('I come from prototype.'); } function SubPerson() { } SubPerson.prototype=new Person(); var subOne=new SubPerson(); subOne.from();//I come from prototype. alert(subOne.constructor);//function Person(name) {...}; alert(SubPerson.prototype.constructor);//function Person(name) {...};
继承的实现很简单,只需要把子类的prototype设置为父类的一个对象即可。注意这里说的可是对象哦!
那么通过prototype属性实现继承的原理是什么呢?还是先看图形说明,然后编写代码进行验证。
注意:红色的方框就是把子类与父类链接起来的地方。这个就应该是传说中的prototype链了吧。下面有代码进行验证。
function Person(name) { this.name=name; this.showMe=function() { alert(this.name); } }; Person.prototype.from=function() { alert('I come from prototype.'); } var father=new Person('js');//为了下面演示使用showMe方法,采用了js参数,实际多采用无参数 alert(father.constructor);//查看构造函数,结果是:function Person(name) {...}; function SubPer() { } SubPer.prototype=father;//注意这里 SubPer.prototype.constructor=SubPer; var son=new SubPer(); son.showMe();//js son.from();//I come from prototype. alert(father.constructor);//function SubPer(){...} alert(son.constructor);//function SubPer(){...} alert(SubPer.prototype.constructor);//function SubPer(){...}
根据上图的prototype链,还有代码的结果,我想应该明白为什么使用prototype能够实现
JS中的继承了吧。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/niuyongjie/archive/2009/11/15/4810835.aspx
posted @ 2012-04-10 17:34 myphoebe 阅读(8) 评论(0) 编辑
不用我说,大家都知道Mysql是一个怎么样的数据库。虽然它的命运比较坎坷,但是丝毫没有影响到我们对Mysql的热情。不论是个人程序或者网站,还是 企业数据库,Mysql的身影无处不在。无论做什么数据库的开发,一款合适的客户端软件可以让你达到事半功倍的效果。下面就我自己使用mysql客户端的 经验,再参考其他人的情况做如下汇总,希望对你的数据开发有所帮助。
1. EMS MySQL Manager
强大的mysql管理工具,允许用户通过图形界面创建或编辑数据库对象,并提供通过sql语句管理用户和权限,通过图形界面建立sql语句,自动生成html格式的数据库文档,导入/导出数据,查看/编辑blob字段等功能。
官方网站:http://sqlmanager.net/products/mysql/manager
中文下载地址:http://download.pchome.net/development/database/download-10462.html
这款软件给我的感觉是简洁,实用,专业,我现在一直用的这个,强烈推荐你使用。
2. MySQL-Front
mysql数据库的图形工具,主要特性包括多文档界面,语法突出,拖拽方式的数据库和表格,可编辑/可增加/删除的域,可编辑/可插入/删除的记录,可显示的成员,可执行的SQL 脚本,提供与外程序接口,保存数据到CSV文件等。
中文下载地址:http://down.chinaz.com/soft/21500.htm
3. Navicat for MySQL
一套适用于MySQL数据库系统地图形化数据库管理、报告以及监控的工具。新版本具有高性能的、具有商业智能的、强大的备份功能,此外还有许多的改进。含简体中文文件。
官方网站:www.navicat.com
官方下载地址:http://www.navicat.com/en/products/navicat_mysql/mysql_overview.html中文下载地址:http://down.chinaz.com/soft/22655.htm
4. MySqlYog
MySqlYog软件是纯JAVA编写的软件,可以运行于WINDOWS,LINUX,UNIX系统,基本版本可以实现对数据库的基本管理,可视化创建表,视图,触发器,数据库的热备份,恢复,可远程管理系统等功能。
官方网站:http://www.webyog.com
官方下载地址:http://www.webyog.com/en/downloads.php
5. MySQL Browser
MySQL Browser的优点是简单,极其简单,安装之后能够立刻上手,马上就能使用的那种,布局也很简陋,功能也很简陋,简单使用没有问题,尤其是刚开始学习mysql的童鞋,可以尝试一下。
官方下载地址: http://dev.mysql.com/downloads/gui-tools/5.0.html
6. Workbench
MySQL Workbench是一款可视化的数据库设计工具,它将SQL开发、管理和数据库设计、创建和维护融合到一个简单的开发环境中,它源自 fabFORCE.net,是DBDesigner 4的接班人,并且更换了mysql GUI工具绑定。当前的版本是5.2,最开始的版本是5.0, 需要强调的是,MySQL Workbench是被视为DBDesinger 4的继承者来开发的。
下载地址:http://dev.mysql.com/downloads/workbench/
7. Sequel Pro
Sequel Pro是一款免费的开源项目,它是CocoaMySQL 数据库管理系统的继承者, CocoaMySQL是Lorenz Textor脑力劳动的产物, 而Lorenz Textor是从2003年开始,CocoaMySQL主要的开发者。
Sequel Pro用来管理MySQL数据库(本地或者internet),它允许你增加、删除数据库和表,更改字段、索引和视图,过滤table内容,增加、编辑和删除列,执行自定义查询和转存table和整个数据库
它兼容MySQL 3.x, 4 or 5.
官方网站:http://www.sequelpro.com/
8. HeidiSQL
HeidiSQL之前被称为mySQL-Front,是由德国程序员Ansgar Becker和一些在Delhi领域有突出贡献的人开发的一款免费的开源客户端。用HeidiSQL管理数据库, 用户必须通过验证登录一个本地或者远程的MySQL服务器,创建一个会话(session). 在这个会话里,用户可以通过连接MySQL服务器管理MySQL 数据库, 会话结束会断开与服务器的连接。它的特征集对于大部分普通和高级的数据库,表和数据操作来说已经足够了,但是为了让它趋向完美,它依然保持积极的开发状 态。
一个由Java, jHeidi编写的版本,被设计用来工作在Mac和Linux电脑上,不幸的是,这个项目在2010年三月被叫停了。
官方网站:http://www.heidisql.com/
9.phpMyAdmin
PhpMyAdmin是由PHP编写的,目的在于通过Internet管理MySQL, PhpMyAdmin支持对MySQL的大范围的操作,最频繁的使用是数据库的管理、表格、字段、关系、索引、用户、权限。你也可以直接执行SQL语句。
官方网站:http://www.phpmyadmin.net/home_page/
10. SQL Maestro MySQL Tools Family
SQL Maestro Group 提供了完整的数据库管理、开发和大部分流行数据库管理系统的管理工具,通过这个管理界面,你可以执行查询和SQL脚本,管理用户和他们的授权,导入、导出 以及备份数据。 此外,你可以为你选择的表格和查询生成PHP脚本,并且可以将任何兼容ADO的数据库转换成MySQL数据库。
此绑定包含如下组件:
SQL Maestro for MySQL
一个专业的MySQL GUI 管理工具, 支持所有最新的MySQL 5.0 and 5.1特性,比如:视图、存储过程,触发器和表划分。
Data Wizard for MySQL
MySQL数据转存,数据导出、导入工具等
Code Factory for MySQL
一套用来编辑SQL脚本和可视化建立SQL语句的工具。
Service Center for MySQL
方便MySQL数据库维护
PHP Generator for MySQL
生产出高质量的MySQL PHP脚本,有免费版本可用。
官方网站:http://www.sqlmaestro.com/products/mysql/
11. SQLWave
Nerocode SQLWave是一款MySQL GUI客户端工具,设计成自动化和简化数据库开发过程 。它也提供了一个简单的方式去浏览和维护存在的数据库,用不同的方法设计复杂的SQL语句,查询和操纵数据。兼容MySQL 4.x – 6.x。
30天试用版可用。
官方网站:http://www.nerocode.com/
12. dbForge Studio
DbForge Studio for MySQL 提供了可视化的MySQL开发和管理,
有三个版本: 快线版(Express), 标准版(Standard)和 专业 版(Professional).
快线版 是一个免费的应用,提供处理schema对象,用户账户,SQL脚本和查询语句等基本功能
标准版 为数据库管理人员和程序开发人员准备了额外的工具。比如调试器(debugger), 查询构造器(Query Builder), 代码模板(code templates), 对象搜索(object search), 变量导出和维护向导。
专业版是功能最全的版本,并且增加了以下功能:数据库工程,精确对比,数据库结构同步或者数据库内容同步,调试存储过程和脚本,建立复杂的查询 。
dbForge的其他工具包括:
• Schema Compare for MySQL
• Data Compare for MySQL
• Query Builder for MySQL
• Fusion for MySQL
官方网站:http://www.devart.com/dbforge/mysql/studio/
13. DBTools Manager
标准版
专门为个人设计,它拥有最小的特征集,这使得它成为新数据库用户执行基本数据管理最理想的工具,你可以免费使用这个版本,对于商业应用,你可以购买一个许可,它将为你提供更多额外的功能。
企业版
专门为企业使用设计,对于想要寻找一款集成的数据库管理系统的DBA和程序开发人员来说,这个非常合适。你可以在购买之前试用一下,企业版试用版将开放所有的功能,你有20天的时间来决定是否购买它。
两个版本都支持MySQL 3, 4 and 5.
官方网站:http://www.dbtools.com.br/EN/dbmanagerpro/
14. MyDB Studio
MyDB Studio包含MySQL服务器管理的完整工具集,开发人员将十分感激它能创建、编辑、移除数据库对象,数据库同步,数据导入和导出,DBA们也可以使 用MyDB Studio去执行数据库移植,以及数据备份和重新存储。它支持SSH隧道技术,使得您的连接更加安全。
官方网站:http://www.mydb-studio.com
posted @ 2012-04-10 17:29 myphoebe 阅读(11) 评论(0) 编辑
PHP现在已经是使用最为广泛的开源服务器端脚本语言之一,当然PHP并不是速度最快的,但它却是最常用的脚本语言。PHP100出品的 EclipsePHP Sutdio 也曾收到广大PHPer好评,但不可能每个人的习惯是一样的,尤其是对与探索的朋友,所以今天PHP100就在这里介绍50个有益的PHP工具,可以大大 提高你的编程工作,希望大家转载此文章时候注明来源





posted @ 2012-04-10 17:17 myphoebe 阅读(18) 评论(0) 编辑