月度归档:2010年07月

“狗日的”的腾讯?

这两天估计在互联网圈子里头较为热的一个词就是这个了,当然还有我们男性同胞人见人爱的ChinaJoy的众多ShowGirl大阅兵啦。

来看看这张杯具的图吧,微博中已经成为“河蟹”的笑料了,甚至有童鞋强烈要求腾讯推出QQ正腐,并推出QQ公安、QQ拆迁办和QQ发改委进行系列配套。当然这是一些个戏谑和调侃的文字,这些个童鞋虽然是在调侃QQ,但是他们在调侃之时,尚在享受着QQ提供给大家的服务。这难道就是传说中的亦爱亦恨?我想作为一个互联网从业人士,每个人都曾是QQ的中毒用户,甚至至今依然会有很多QQ的铁杆粉丝,当然大家同吃一碗饭,难免会有利益之纷争,有道是只有“永恒的利益”啊。就在昨天通过“狗日的”腾讯 搅局者还是终结者?才算是了解到了腾讯这些年来的诸多业务转型,以及腾讯旗下小游戏主题站3366.com。

作为一个QQ的非中毒用户,绝对腾讯粉丝的我来说,我对于QQ这个聊天工具一直没有太大的感觉,因为自己聊天的需求非常之小,跟同学聊天一般都是直接电话聊,其他时间偶尔上上QQ也就是碰碰同学等等,对于IM工具,从易用性上来讲,QQ绝对是世界一流的。虽然自身对于QQ没有什么依赖,不过对于腾讯其他的产品体验得不少,从最早的QZone开始,我认为QZone就是一个垃圾,不过现在变得好多了,到之后QQ音乐,再到后来的QQ医生,再到QQ Live,这些个产品都曾深入体验过,给我的感觉是从2006年开始,腾讯整体的产品设计上开始统一起来,产品的设计性较功能性更强,同类的产品中,我们随口就能说出很多个来,但是当你真正安装上开始使用的时候,你就会发现其实QQ系列产品在功能之外做了很多的功课,对于产品易用性以及UI的友好性上面尤其花功夫。

不过从QQ这样“一直在模仿,从未被超越的”的形态来看,这对于国内诸多互联网初创公司来说确实不是一个很好的消息,特别是之前看到有人说到国内创业环境跟美国的不同,硅谷的企业之间有一个不成文的规定,大企业不抄袭小企业的产品和模式,如何涉足一般选择直接收购,在收购产品和专利的同时将优秀的人才收入囊中,这对于初创企业来讲,其实是一件非常有利的事情,不用担心哪天那个大灰狼直接跑到你家中实施暴行,还满嘴仁义的说“其实我们只是打酱油的”。去你妈的,什么玩意儿啊?

[pullquote]“有什么业务是腾讯不做的吗?”美团网CEO王兴的语气中难掩郁闷。[/pullquote]

我想中国互联网创新的先锋人士(同时也是互联网山寨人士)王兴老大哥在饭否关闭之后,重新创业瞬间引得团购业里,天下赢粮而影从,引多少英雄竞折腰啊。可惜我们可爱又可恨的小企鹅又一次露出了他那淫邪的笑容,那么这次谁又会笑到最后呢?我想大量蛋疼的QQ用户,能给腾讯带来的不会少吧。届时大家应该就能看到某个办公室里头,坐着一队人,看着屏幕上的小企鹅,不停的刷团购信息,蛋疼得紧啊。

《黄金矿工喜讯特别版》发布了

从加入喜讯到今天整整两个月了,期间做了一个小产品,就是《黄金矿工喜讯特别版》。

游戏的创意来源于PC上flash版本的黄金矿工,不过重新结构了游戏的可玩性和关卡的设置,并新增了一些游戏模式的东西,加入了更多的设计性的要素,特别是画面感的增强,我个人认为应该是最大的。游戏发布并没有正式的在Google的Market上发布,只是选择性的在国内的一些知名的论坛上发了一些帖子。效果还算不错,在安卓网上的帖子,下载量已经达到了1383,在机锋网的帖子 下载量目前是874,感觉都还不错,然后今天下午放上了安卓市场里面,目前下载量是141,感觉还不错。跟之前自己的预期相比,目前的结果还是比较喜人的。

官方网址是:http://m.xixun.com/hjkg

目前提供了Android和Symbian版本,支持Android 1.5及以上版本和S60 V3版本

给一些截图吧:

下载地址: http://m.xixun.com/hjkg

Android上如何正确实现程序的联网,事关WIFI/CMWAP/CMNET

我想很多Android程序开发者都曾碰到过这样的问题,那就是如何让自己的程序在国内如此复杂的网络环境下顺利的接上网络,给我们的用户一个更好的体验。
从网络上一些已有的数据来看,Android手机用户群体的联网率普遍比较高,联网的方式非常多样,最多的还是使用WIFI,当然WIFI速度和资费上的优势让她成为了每一个玩机者的首选网络接入方式,但是很多的时候我们的条件并不是那么的尽如人意。例如在公车或地铁上,我们这些诸多支付不起3G资费的人士,首选的接入方式依然是CMWAP/CMNET,而由于国内网络的一些个问题,选择这两个或者其他的APN会有一些问题,问题就是我们可能需要设置代理才可以顺利登录网络。

以下是我自己在网络上寻找解决方案的时候,收集的一些信息,记录如下:

WAP是一中手机上网的协议。CTWAP是中国电信的WAP接入名称(China Telecom WAP),CMWAP是中国移动的WAP接入名称(China Mobile WAP),  UNIWAP是联通的WAP接入名称(china Unicom WAP),  另外CTNET/CMNET/UNINET同上。
CTWAP的上网网关:10.0.0.200:80
CMWAP的上网网关:10.0.0.172:80
UNIWAP使用的网关与CMWAP一致
我们可以通过MCC+MNC码的方式来进行简单的判断,但是实际上这种方式并不是完全正确的方法(自己在项目上碰到了该问题,因为实际情况中我们总是需要面对多种网络的情况)。这个时候其实我们可以稍微Hack一下,虽然Android并没有提供非常好的API,不过我们可以通过一些方法绕过去这里有一篇非常不错的文章http://www.javaeye.com/topic/565662 ,讲解得还算全面。
下面给出我自己的解决方案:
WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
  HttpClient httpClient = new DefaultHttpClient();
  if(!wifiManager.isWifiEnabled()){
   Uri uri = Uri.parse("content://telephony/carriers/preferapn"); //获取当前正在使用的APN接入点
   Cursor mCursor = this.getContentResolver().query(uri, null, null, null, null);
   if(mCursor != null){
    mCursor.moveToNext(); //游标移至第一条记录,当然也只有一条
    String proxyStr = mCursor.getString(mCursor.getColumnIndex("proxy"));
    if(proxyStr != null && proxyStr.trim().length() > 0){
     HttpHost proxy = new HttpHost(proxyStr, 80);
     httpClient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, proxy);
    }
   }
  }
  HttpConnectionParams.setConnectionTimeout(httpClient.getParams(), 20 * 1000);
        HttpConnectionParams.setSoTimeout(httpClient.getParams(), 20 * 1000);
        HttpGet httpGet = new HttpGet(wrapGetUrl());
 try
        {
            HttpResponse response =httpClient.execute(httpGet);
            if(response.getStatusLine().getStatusCode() == 200){
             HttpEntity entity = response.getEntity();
             InputStream content = entity.getContent();
             BufferedInputStream bis = new BufferedInputStream(content);
             StringBuilder builder = new StringBuilder();
             int b;
             while((b=bis.read()) != -1){
              builder.append((char)b);
             }
             String resultStr = builder.toString();
               Log.v("result", resultStr);
}catch(Exception e){
}finally{
httpClient.getConnectionManager().shutdown();
}
该方案在打开WIFI/CMWAP/CMNET的情况下均单独测试成功。
同理HttpPost也可以如法炮制,下面附上一段代码:
int version = 3;
  Class versionClass = VERSION.class;
  TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
  WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
  String manufacturer = "";
  String device = "";
  String networkOperatorName = tm.getNetworkOperatorName();
  String IMEI = tm.getDeviceId();
  try {
   Field field = versionClass.getField("SDK_INT");
   version = (Integer) field.get(new VERSION());
   Class buildClass = Build.class;
   Field manu_field = buildClass.getField("MANUFACTURER");
   manufacturer = (String) manu_field.get(new android.os.Build()) + " ";
   Field deviceField = buildClass.getField("DEVICE");
   device = (String) deviceField.get(new Build());
  } catch (Exception e) {

  }
  HttpClient httpclient = new DefaultHttpClient();
  try {
   if(!wifiManager.isWifiEnabled()){
    Uri uri = Uri.parse("content://telephony/carriers/preferapn");
    Cursor mCursor = this.getContentResolver().query(uri, null, null, null, null);
    if(mCursor != null){
     mCursor.moveToNext();
     String proxyStr = mCursor.getString(mCursor.getColumnIndex("proxy"));
     if(proxyStr != null && proxyStr.trim().length() > 0){
      HttpHost proxy = new HttpHost(proxyStr, 80);
      httpclient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY, proxy);
     }
    }
   }
   HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 20 * 1000);
            HttpConnectionParams.setSoTimeout(httpclient.getParams(), 20 * 1000);
   HttpPost httppost = new HttpPost("YOUR_POST_URL");
   List nameValuePairs = new ArrayList();
   nameValuePairs.add(new BasicNameValuePair("os", "Android"));
   nameValuePairs.add(new BasicNameValuePair("os_version",String.valueOf(version)));
   nameValuePairs.add(new BasicNameValuePair("device", manufacturer+device));
   nameValuePairs.add(new BasicNameValuePair("uuid", md5(IMEI)));
   nameValuePairs.add(new BasicNameValuePair("network", networkOperatorName));
   httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
   HttpResponse response;
   response = httpclient.execute(httppost);
   httpclient.execute(httppost);
   StatusLine statusLine = response.getStatusLine();
   if(statusLine.getStatusCode() == 200){
Toast.makeText(this, R.string.updatesucceed, Toast.LENGTH_SHORT).show();
   }else{
Toast.makeText(this, R.string.updatefailed, Toast.LENGTH_SHORT).show();
   }
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  } catch (ClientProtocolException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }finally{
   updateFlag = true;
   httpclient.getConnectionManager().shutdown();
  }

再见轩尼诗

这次重看《月满轩尼诗》应该是进入大学以来惟一一次主动重看一部电影了,因为有了互联网,有了BT,我们有了太多太多廉价而高质量的电影选择,重看一部电影对每个人来说都不是一个很容易做的决定,当然我们不排除有些人对某部电影或者对大部分好电影是多看不厌的。不过对于自己来说,虽然有很多自己喜欢的电影,看完之后甚至都能写下一些文字来记录自己的感受,不过能让我有急切的重看的欲望的电影,到目前为止只有《月满轩尼诗》,我对电影懂得非常少,不知道什么情节的转乘之间的关系,也不知道电影如何去阐述人性和生活才叫有深度,更不知道一个电影的后台制作的种种微妙之处,我看电影图的就是一个简单,故事的单纯或者精妙。

《月满轩尼诗》就是一部剧情简单,演出杰出的影片。从片头到片尾都是一副简单的琐碎的小市民生活的气息,香港的街道因为小,因为有山道,因为有电车,所以才显得那么的有味道。街道上空的天气总是一股南方城市固有的阴霾,让人觉得很安逸。阿来到位的懒散,以及爱莲那种坚强而不失小女人的味道十足,让整个影片都充满了小人物闲散而坚强的生命力。老板娘,姨妈,青书的角色更是让这对恋人的生活更显真实和湿润。摄影师和阿旭的出现是一个必然,但是绝对没有给影片带来任何伤痕,即便是情感线条上的歪曲都不曾有。

喜欢张学友颓废而有趣的扮相,更喜欢汤唯那种超脱的释然和内里的倔强,真的很喜欢。呵呵