智能手机

数据挖掘:eBay上的Galaxy Note

  • Posted on: 18 November 2011
  • By: kzeng

Rplot01

从有Samsung  Galaxy Note 的消息开始,就很期待这款 5.3 寸屏的手机(5.3 寸啊!5.3 寸啊!5.3 寸啊!),但是不出所料,这款手机要很迟才能在北美上市(甚至连会不会上市都还是一个未知数),所以当 Galaxy Note 在欧洲和亚洲发布之后,就只能关注 eBay,等待它从亚欧流入北美。

当欧洲刚刚发布这款手机的时候,eBay 也同步有人开始售卖,一开始的价格大约在 $1000 左右,并且数量很少。等了一段时间,香港的发布会过后,随着大量香港卖家的加入,价钱开始迅速下跌,很快跌倒了$800左右。作为以数字为生的人,当然会“萌”任何时间序列的漂移、扩散和跳跃(不负责的翻译 drift,  diffusion, & jump),但是不断的刷新去查看eBay页面是在令人厌恶,于是就写了一个简单的 C# 程序,定时去“挖掘”eBay 页面上的价格。

但凡提及买卖/价格,就不能不考虑风险(风险也是钱啊),特别是在 eBay 这样高风险的地方。eBay 正好在推出一个新的 beta 产品页面,在 这个页面上 eBay 已经利用自己的算法选出了风险和价格最优的产品,这样一来,挖数据就简单多了,就像附在后面的 C# codes 里显示的那样,只要 request 页面数据,把数据转化成 string,然后利用 C# 自己的 string search/index method,找到相关数据 CSS class, 读入数据即可(数据量很小,所以任何优化都不用做)。然后把数据不断存入 txt 文本。

开始测试时是每两个小时 quote 一次,后来改成一个小时 quote 一次。屏幕上跳出的数字,很像交易所的证券,所以就干脆把它用 chartSeries (R 的 quantmod package)画出来,然后就从数据里发现了很有趣的规律:

  1. 首先总的价格趋势是下跌的,因为开始的高价格完全是因为 supply 的不足,再加上消费类电子产品本身的贬值以及与之相竞争的 HTC,Samsung Android 手机的推出(譬如在北美正式销售的 Galaxy SII skyRocket)

  2. 其次从 Nov 11 到 Nov 14 之间,在微观结构上是两个卖家相互竞争导致价格下跌。为了拿到 eBay 页面上的产品推荐,风险相同的卖家不得不通过降价来相互竞争,但是降价的幅度一般都比较小,特别是从 Nov 13 开始,基本上就是几毛几毛的降;

  3. Nov 15 左右出现了一段价格的稳定期,大约是一家放弃了价格的竞争;

  4. Nov 16 其中一家的货卖完了,剩下的一家觉得自己暂时处在低风险卖家的垄断地位,所以遽然的开始升价,我们看到了一个大大的 jump;

  5. 但是 jump 过后显然市场的反应冷淡,并且我们在上面说过价格的总体趋势是下跌的,如果不能及时卖出,卖家始终有一个 negative carry (也就说价格对于时间的一阶导数是负的),还有最重要的是差不多这个时候,Apple 开始 ship unlock 的 iPhone 4S ,价格大约在 $649 ,对于 Galaxy Note 的价格也是一个打击;

  6. 所以过了 Nov 17 同一卖家又开始降回比原来更低的价格水平

  7. 然后 Nov 18, 价格又开始大幅度的下调,因为有一个新的竞争者出现,而现在手里还攒有大量货的早期卖家基于自己的进货成本,不得不加大降价的力度, theta bleeds :)

当然数据有限,很多只是我的猜测,不过数据本身挺有趣的,不仅本身是一个很 behavior economics的测试,如果数据点足够的多,还能 fit 出一个 term structure 模型来。。。

。。。 所以到后来忘了,我只是来买手机的。。。

image

附 C# codes:

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
 
 
/// <summary>
/// Fetch eBay Price 
/// </summary>
class WebFetch
{
    static void Main(string[] args)
    {
        while (true)
        {
        // used to build entire input
        StringBuilder sb = new StringBuilder();
 
        // used on each read operation
        byte[] buf = new byte[8192];
 
        // prepare the web page we will be asking for
        HttpWebRequest request = (HttpWebRequest)
            WebRequest.Create("http://www.ebay.com/ctg/Samsung-Galaxy-Note-32GB-Black-Unlocked-Smartphone-/110509414");
 
        // execute the request
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        
            // we will read data via the response stream
            Stream resStream = response.GetResponseStream();
 
            string tempString = null;
            int count = 0;
 
            do
            {
                // fill the buffer with data
                count = resStream.Read(buf, 0, buf.Length);
 
                // make sure we read some data
                if (count != 0)
                {
                    // translate from bytes to ASCII text
                    tempString = Encoding.ASCII.GetString(buf, 0, count);
 
                    // continue building the string
                    sb.Append(tempString);
                }
            }
            while (count > 0);
 
            string page = sb.ToString();
 
            //page = Regex.Replace(page, @"<(.|\n)*?>", "");
 
            // print out page source
            string targetString = "bbx2-pv";
            int first = page.IndexOf(targetString);
            string price = page.Substring(first + targetString.Length + 2, 7);
 
            targetString = "ship tfsp bbx2-s";
            first = page.IndexOf(targetString);
            string temp = page.Substring(first + targetString.Length + 2, 20);
            targetString = "</s";
            first = temp.IndexOf(targetString);
            string shipping = temp.Substring(0, first);
 
            if (shipping == "Free shipping") shipping = "$0";
 
            DateTime time = DateTime.Now;
 
            string path = @"C:\Users\Kai\Dropbox\Mis\Android App\GalaxyNote.txt";
 
            using (StreamWriter sw = File.AppendText(path))
            {
                sw.WriteLine("{0}\t{1}\t{2}", time.ToString(), price, shipping);
            }
 
            Console.WriteLine("{0}\t{1}\t{2}", time.ToString(), price, shipping);
 
           Thread.Sleep(1000 * 60 * 60);
        }
        
    }
}
Blog分类: 

HTC HD2 使用手记(三):最完美汉化

  • Posted on: 21 April 2010
  • By: kzeng

ScreenShot1

用过不少 Windows Mobile 的手机,但是很长时间以来汉化使用都是:CE-Star GBK 和 微软雅黑 6.0 这个组合。 CE-Star GBK 是从 CE-Star 中提取出来的汉化程序,微软雅黑 6.0 是字体文件。但是这个组合也有很多不便之处:首先, CE-Star 的汉化虽然稳定彻底,但是文件的尺寸太大,里面仍然包含了一个没有太大用处的中文输入法和宋体(UniSun)字体,其次就是微软雅黑在 Winodws Mobile 上的显示并不是特别的好看(特别是和 iPhone 使用的中文字体相比),所以最近改变了一下,改用:BlueFairy Chinese Support (no font) + Anakie LiHei Rendered By with GDI++ 这个组合——堪称用过的做好的汉化方案。

首先, 因为没有字体库,BlueFairy Chinese Support 的size非常小,并且也很稳定;其次, Anakie LiHei 用的就是 iPhone 上的丽黑中文字体,并且是用 GDI++ 渲染的,比 ClearType 渲染的微软雅黑效果好很多(同时也推荐在 Windows 电脑上用 GDI 渲染字体,非常漂亮),譬如左上图中日期的显示,如果用 ClearType 雅黑,“星”字的几条横道很容易就叠在一起了。下面是其他一些截屏的画面:

ScreenShot2上图显示了 Sense 2.5 的汉化,所有曲目无论繁体简体均可显示,并且文字效果很好。(btw,刘若英的这张新专辑不怎么样,最好听的是一首老歌《同桌的你》,但是刘若英没有改歌词,所以听起来很奇怪,因为原唱是男的,老狼唱:“谁为你作嫁衣” 无妨,但是刘若英唱同样的歌词,就有些怪了。)

ScreenShot5上图是目录的显示,目录的汉化也正常,没有出现乱码。

ScreenShot3

上图和下图是在电子书阅览器器里显示的结果,常用中文软件的中文菜单显示也没有丝毫问题。并且文字的显示效果要优于雅黑。

ScreenShot4 但事实上网络里流传的 Anakie LiHei   并不能直接汉化我用的 Rom(Energy Cookie HomeTab April 17版),因为 Energy rom 把系统的默认显示字体映射更改为 Calibri 了,而 Anakie LiHei 并没有考虑到这点,它 cab 包里只是对常用字体作了映射,所以我重新修改 Anakie LiHei 的安装文件,添加对对于 Calibri 字体的更换,所以现在显示没有任何的问题了。如果你使用别的 rom 发现文件目录下游汉字显示为方框,也很可能是同样的原因。

下面是上文提到的汉化文件和字体的下载,其中的 Anakie Lihei 是我修改过后的,因此如果你也是 Energy Rom 的粉丝,就可以省些时间了。这个汉化解决应该通用于各种 Windows Mobile 手机。

Blog分类: 

HTC HD2 使用手记 (1)

  • Posted on: 10 March 2010
  • By: kzeng

正值 Apple 起诉宏达电(HTC)侵犯专利之际,卖掉了用了一年多的 HTC Touch Pro,换了 HTC 的 HD2,用实际行动支持这家台湾的手机制造商。

在 HD2 和 iPhone 3GS 之间踌躇了很久,最终还是选择了不支持美国 3G的 HD2 (具体说是不支持 AT &T 3G),因为没有 Contract,想什么时候出手,就可以转手卖掉,特别是 Windows Mobile 7 即将上市,而 HD2 是否支持 WM 7 的仍是未知数。

简单的说一下 HD2 的优缺点:最大的缺点不得不说是 Windows Mobile 6.5,在刷了无数种 rom 之后,选择了潘多拉,这是最稳定的一个,以前在 Touch Pro 上中意的 Energy Rom的 HD2版本很不稳定,接电话的时候会死机;但是 Windows Mobile 6.5 毕竟不是给电阻屏的手机设计的,所以在没有触笔而只能用手指操作触屏的时候,WM 6.5 的问题就凸现出来了,特别是关闭窗口,或者是拖动滚动条的时候;

而 WM 6.5 也是 HD2 的优点之一,因为无数的已有 WM 程序都可以很好的运行,包括 GSP 软件,譬如 Garmin XT 和 iGo 8。最推荐的还是 iGo 8,在HD2 4.3寸屏 480x800 分辨率下性能显得更为卓越,TTS 仍然可以使用,并且没有 GPS Lag,现在想来,Touch Pro 上 iGO 8 的  lag 很可能是机器造成的。同时 HD2 锁定卫星的速度极其之快,不亚于 iPhone 3GS。冷启动,10秒以内肯定能锁定卫星,这种快速的反应也使得 HTC 的 footprint 和 twitter tab 有了实际的用途,记得用 TP 的时候,在时代广场想要留个足迹,都已经走到朵颐了,卫星都还没有锁定。。。

当然 HD2 最大的优点还是 4.3 寸的屏幕,超薄的机身,以及 1 GHz Qualcomm Snapdragon 的 CPU,记得我在大学里用的笔记本主频也不到 1G,所以不管是上网浏览速度,还是 GPS 导航,以及运行各种各样的程序,都速度飞快。

最后想到的一个不便利之处是 HD2 的 reset button,使用 WM 的同好都知道,WM的死机如同 Win 98 一样频繁, Touch Pro 的 reset button 就在手机的外部,需要重启一捅就可以了,而HD2的 reset button 必须把后盖扣开才能找到,更郁闷的是 HD2 已经不配备触笔了,而 reset button 仍然是像以往一样是凹陷下去的,如果正还走在马路上手机死机了,想重启一下都万难,刚拿到 HD2 的时候,因为不停的刷 rom,手机很不稳定,结果在车里 GPS 运行到一半手机死掉了,不得不停车到处去借曲别针。。。

Blog分类: 

Iphone 3G S v.s. Touch Pro:一点小比较

  • Posted on: 30 July 2009
  • By: kzeng

LD 再用最新的 Iphone 3G S,我还是在用晚一个generation的 HTC Touch Pro( Touch Pro 2 应该和 Iphone 3G S 是一个世代吧),并非一个全面的比较,而是刚才的一件小事儿:旋转一张照片。在黄石时的一张合影,LD 和我都想把它作为手机的墙纸。LD 首先把照片从信箱里下载到 Iphone 本地,但是发现照片的 orientation 不对(Iphone 的图片管理不能自动根据照片旋转正确的 orientation),需要旋转照片,但是 Iphone 并不具备照片旋转功能,想在电脑上旋转了再同步到 Iphone 上,可是又必须在 itune 中选择同步照片,而这种同步又会抹去 iphone 里本来就有的照片,我google了一下,发现可以用 Photo Rotate 这个 App 完成,但是需要 $.99 ,在 Iphone 的 App store 又搜索了一下,发现了免费的 Photo Utility 这个 App,终于完成了旋转,顺利设置为墙纸。

相比之下,在 Touch Pro 上,传照片只需要拿 USB 电线接驳一下,Touch Pro 就自动默认为移动硬盘(或者是 Windows Mobile Device),直接拷贝图片就行了,同样是 orientation 不对的照片,HTC Touch Pro 自带的 Manila 3D 的影集程序可以按照人像自动识别正确的朝向,所以很容易就设置好了。

不仅是照片旋转,还有无线网络,家里的 router 比较差劲,用 iphone 和 touch pro 都无法用默认设置获取网络,但是在 touch pro 理,只需要把网络的 power level 从 best battery 调整到 best performance 即可,而 iphone 中却没有这样的选择,即使在家也只能用 3G 的 data。

只是一点儿小小的比较,倒不是说 Touch Pro 的 Windows Mobile 平台一定优于 Iphone 的 OS 平台,但是这些小事上 iphone 确实更麻烦一些。

Blog分类: