碎碎念:智能手机 2015

首先是一则说明。工作生活日渐繁忙,打理博客的时间也越来越少。精力有限,今后原则上不会为索尼的每一次展会/新产品发布写摘要。这些交给专门(虽然很多并不专业)的媒体即可。自己感兴趣的产品或许会三言两语写写感想,例行的产品线更新之类则略过不提。例如新的 Walkman W 系列和 h.ear 耳机系列,小改款的新 VAIO Z/ S 系列等。

回到正题,最近很多网站都在讨论 2015 年各品牌智能手机的销量,长篇大论总结下来其实也就这么几句:

  • 苹果增长放缓
  • 三星颓势开始扭转,但依然被苹果逼近
  • 多个老牌国际大厂日趋边缘化(LG、索尼、HTC、Moto 等)
  • 华为为首的国产厂商进步显著
    • 小米遇到瓶颈
    • 步步高系闷声发财

相关的分析和讨论已经很多,这里不重复相近的观点,只想再次阐述几条自己认为很重要的因素:

  • 品牌影响力是最大因素
  • 中国大陆决定全球局势

关于第一点。又一年的实际观察让自己确信,『大多数』人并不关心也无法分辨产品的好坏。例如,他们不会用到 iPhone 的大部分功能,对 iPhone 的出色设计并不能明确感知,对 iPhone 的缺点也并不在意。此处的 iPhone 可以换成三星的 Galaxy,华为的 Mate,小米手机、Vivo/Oppo 等。屏幕大小、机身轻薄、续航长短,几乎就是普通人对手机的理解力的全部。前些天经历了这么一件事,同事一致觉得 Oppo 某中端手机和索尼 Xperia Z5 长得差不多,前者还更加轻薄,看似更好。

苹果被认为是最好的高端手机、三星被认为是最好的非苹果高端手机、小米被认为是便宜又不错的手机、华为被认为是国货里质量信号最好的、Oppo 好像到处能看到广告和实体店、HTC 是过气品牌现在都没人买……LG 和索尼也做手机?

充分商品化后的智能手机市场,难免陷入营销的苦战。

第二点不用多解释。不迎合国内市场的厂商已经全都被边缘化。国内二三四线城市的消费能力逐渐增强,他们可以提供压倒性的『销量』与『市场份额』。

除了很早就开始布局海外市场的华为,其他几家能否走出国内,短期内是否打算走出国内,都还要打个问号。不过纯看数字,今后的智能手机市场应该可以确定是中国厂商的天下了吧。

顺便,索尼昨天公布了最新一季度的财报,集团整体业绩尚可,更重要的是移动部门罕见地扭亏为盈。尽管2015年全年销量跌破3000万,不仅比前两年大减,甚至不如国内魅族等二线品牌,但依靠高端机型较高的利润率,反而盈利不少。毕竟,4999 的手机的销售额与利润都不是 699 的低端机可比。缩减产品线,减少不必要的开支,专心做旗舰产品,或许是一条正确的路。

写给程序员的 PHP 语法快速入门


This is a bold text.";

 // 变量
 $NAME = 'BREEZE';
 $name = 'breeze'; // 变量名对大小写敏感
 // 1ABC = 25; 变量名不能以数字起始
 $variable = 'name';
 echo $name;
 echo $name.$NAME; // breezeBREEZE
 echo $$variable; // breeze

 // 常量
 define("CASE_SENSITIVE_CONSTANT","CONSTANT_SAMPLE",true); // 定义一个具有大小写敏感的名称的常量
 define("CASE_INSENSITIVE_CONSTANT","CONSTANT_SAMPLE",false); // 定义一个具有大小写不敏感的名称的常量
 define("CONSTANT","CONSTANT_SAMPLE"); // 默认情况下,常量名称的大小写不敏感。然而,名称大小写敏感的常量依然以小写形式储存,因此在定义一个大小写敏感常量之后再定义一个同名小写常量将发生错误
 echo CASE_SENSITIVE_CONSTANT;

 $string1 = '9';
 $int1 = -42;
 $float1 = 42.09;
 $boolean1 = true; // 另一个布尔值为 false
 echo($string1+int1); // -33

 // 方法
 function getName() { // 方法名对大小写不敏感,且只能以字母或下划线(_)起始
  $name = 'Breeze';
  echo $name; // 将 echo 'Breeze' 而非之前定义的 'breeze' 
  return $name;
 }

 function getGlobalName() {
  global $name;
  echo $name; // 将 echo 之前定义的 'breeze' 
 } // 返回 NULL

 function echoName($name='Alice') {
  echo $name;
 }

 echoName('Alice'); // Alice
 echoName(); // Alice

 // 算术
 $num1 =4;
 $num2 =3;
 echo $num1/$num2; // 1.33333333333
 echo $num1%$num2; // 1
 $num1++;
 --$num2; 
 $num2 += $num1; // $num2 = 7
 $t = true;
 $f = false;

 // 逻辑运算
 $booleanResult = $t and $f or $t xor $f && $t || !$f
 
 if ($num1 > 1 and $num1 < 1 or $num1 >= 0 xor $num2 <= 5 && $num1 != $num2 || !($num1 <> $num2)) {
 } else if ($num1 == $num2) { // 相等
  echo $num1++;
 } else if ($num1 === $num2) { // 相等且类型相同 (全等)
  echo $num1--;
 } else if ($num1 !== $num2) { // 不等或类型不同 (不全等)
  echo $num2++;
 } else {
  echo $num2--;
 }

 // 数组
 $peopleNumeric = array("Alice","Bob");
 $peopleAssociative = array("Alice"=>"17","Bob"=>"18");
 $peopleMultiDimensional = array("Alice"=>array('C','Z'),"Bob"=>array('H','W','L'));
 echo $peopleNumber[0]; // Alice
 echo $peopleAssociative['Alice']; // 17
 echo $peopleMultiDimensional['Bob'][2]; // L

 // 循环
 $intForWhile = 1;
 while ($intForWhile<9) {
  echo "Current: ".$intForWhile;
  $intForWhile++;
 }

 do {
  echo "Current: ".$intForWhile;
  $intForWhile++;
 } while($intForWhile<20) 


 for ($i = 0;$i <9;$i++) {
  echo "Current: ".$i;
  if ($i==7) {
   continue;
  }   
 }

 foreach($peopleNumeric as $ $person) {
  echo $person; // Alice Bob
 }

 // switch
 switch ($peopleNumber[0]) {
  case "Alice":
   echo "Alice";
   break;
  case "bob":
  case "Bob":
   echo "Bob";
   break;
  default:
   echo "No match";
 }


 // superglobals
 echo $_SERVER['SCRIPT_NAME']; // including $GLOBALS, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE, $_SESSION
 echo $_SERVER['SCRIPT_FILENAME'];
 echo $_SERVER['SCRIPT_URL'];
 echo $_SERVER['HTTP_HOST'];
 echo $_SERVER['PHP_SELF'];
 echo $_SERVER['SERVER_ADDR'];
 echo $_SERVER['SERVER_NAME'];
 echo $_SERVER['SERVER_PORT'];
 echo $_SERVER['REMOTE_ADDR'];
 echo $_SERVER['REMOTE_HOST'];
 echo $_SERVER['REMOTE_PORT'];

 // 文件操作
 $file=fopen("file.txt", "w"); // mode: r, w, a, x, r+, w+, a+, x+. a mode won't erase data
 fwrite($file,"TEXT\n"); // the original content is erased
 fclose($file); // return true or false
 $file=fopen("file.txt", "a");
 fwrite($file,"TEXT\n"); // content of the file: TEST\nTEST\n
 fclose($file);
 $content=file("file.txt"); 
 $count=count($content); // get length of the array
 foreach ($content as $line) {
  echo $line."\n";
 }

?>

post.php 以 POST 方式提交表单


 
  
// data sent to main.php when the page is submitted. if action is not set, data will be sent to the file itself

Name:

main.php 接收 POST


 
Welcome 
 

session_cookie_get.php 将数据存至 session 与 Cookie

 tag
 if (isset($_COOKIE['user'])) { // check if the value has been set
  echo $_COOKIE['user']." is set in cookie";
 }
?>

 
  

data included in URL, e.g., actionGet.php?name=Alice

Name:

actionGet.php 接收 GET


 
Welcome 

 

写给程序员的 Python 语法快速入门

# 本文目的:总览 Python 的主要语法,并供日后备忘。
# 阅读指南:本文不是文档。通过通读本文,可以了解 Python 基本的语法及一些常用的方法。读者可以将其与其他语言比较,理解其意图与含义。
# 目标读者:具有程序设计基础知识,理解面向对象程序设计基本概念的程序员。

# 若使用 Python 2.X,需设定字符编码以支持中文字符
# -*- coding: UTF-8 -*-
# coding=utf-8

# 模块导入
from math import pi, sqrt # 同时导入多个模块
from re import match as re_match # 重命名

# 类的定义与继承
class Animal:
 __character = "Positive" # 不会经过 "from module_name import *" 导入
 _gender = "Unknown" # 仅表示建议不访问
 """
 文档注释,将在运行时输出
 """
 def __init__(self, name, age):
  self.name = name
  self.age = age

 def shout(self): # 定义类的方法
  print("Sound")

 def live(self):
  print("Alive!")

 def train(behavior): # 修饰器
  def wrap():
   behavior()
  return wrap

 @property # 属性,常用于实现只读特性
 def gender(self):
  return self._gender

 @gender.setter # 实现属性的赋值
 def gender(self, value):
  if value:
   self._gender = value
  else:
   print("Gender not set")

class Wolf(Animal): # 继承于 Animal 类
 def shout(self, default = "Woof!", *sounds, **tones):
  print(default)
  if len(sounds) > 0:
   print(sounds[0])
  print(tones) # {'key':value,}

 def bite(self):
  print("Bite!")

class Dog(Wolf):
 def shout(self):
  print("Woo")

 def bite(self):
  print("Bite?")
  super().shout()

 def __add__(self, other): # 改写 + 运算符。其他运算符也可以类似形式改写
  return Dog(self.name + " and " + other.name, self.age + other.age)

 def __special_behavior(self): # 该方法不会经过 "from module_name import *" 导入
  print("Read books!")

 @classmethod # 定义类方法
 def find_a_puppy(cls, name):
  return cls(name, 0)

 @staticmethod # 定义静态方法
 def find(times)
  print((self.name + "!") * 3)

 @train
 def run():
  print("train running")

# 访问类
puppy = Dog("Puppy", 5)
print(puppy.age) # 5
puppy.live() # Alive!
puppy.shout() # Woo
puppy.bite() # Bite? Woof!
print(_Animal__character) # Positive

# 数组相关
def add_one(x):
 return x + 1

nums = [1,2,3]
result_map = list(map(add_one,nums)) # [2,3,4]
result_filter = list(filter(lambda x:x%2==0,nums)) # [1,3]
nums[0:2:1] # [1,2,3]
nums[1:-1] # [2,3]
first = nums[0]
print(list(range(3))) # [0,1,2]

# Generator 与循环
def infinitive_loop():
 i = 1
 while True:
  yield i
  if True:
   i += 1
  elif False:
   i = 0
  else
   i = 1

for i in infinitive_loop():
 print(i) # 1 2 3...
 if False:
  break
else:
 print("finished without break")

# 集合
num_set = {1,2,3}
print(3 in num_set) # True

# 字典
age_dictionary = {"Alice":17, "Bob":18}
print(age_dictionary["Alice"]

# 多元组
immutable_tuple = ("A","B") # tuple 始终无法被更改
simple_tuple = 1,2,3
a,b = immutable_tuple
a, *b, c = [1,2,3,4] # a 为 1, b 为 [2,3],c 为 4
b = 5 if a == 2 else 3 # b 为 3 

# 字符串格式
string_format_sample = "String: {0} {1} {x}".format("A","B",x="C")

# 异常处理
try:
 print(1/0)
 assert (2 + 2 == 6), "wrong answer" # AssertionError:wrong answer
 with open("file.txt") as f:
  print(f.read())
 file = open(file.txt)
 print("A" * 3) # AAA
 n = int("9")
except ZeroDivisionError:
 print("Devided by zero"
except (ValueError, TypeError):
 print("Error")
finally:
 file.close()
 print("Finally")
 raise

input("Enter a number: ")

if __name__=="__main__":
 print("Won't be printed if it is imported")

Android 中在代码运行时为 Activity 动态设置主题

代码与范例:

setTheme(android.R.style.Theme_Dialog);

说明:为使该方法生效,需要在 setContentView(…) 与 super.oncreate() 之前调用。系统内置主题可以通过 android.R.Style 查找。部分主题对 Android API level 有要求,例如,material 系主题要求 API level 至少为19。

Web 开发笔记

作为分类目录的一个补充,在这里按照功能类别对 Web 开发中的一点心得和笔记作一个索引。其中部分是根据自己在查找网络资料时找到的内容的整理与演绎,在此感谢所有那些无私分享经验的人们。

HTML & CSS
Angular
Web App
JavaScript & jQuery & JSON & AngularJS
Python
PHP
正则表达式

常用字符 HTML 代码

使用时需要去除 & 与 # 或单词之间的空格。

™ 商标& #8482; 或 & trade;

字符名称 HTML 代码
• 圆点/加重号 & #8226; 或 & bull;
… 水平省略号 & #8230; 或 & hellip;
— Em 破折号 & #8212; 或 & mdash;
≠ 不等于 & #8800; 或 & ne;
← 左箭头 & #8592; 或 & larr;
→ 右箭头 & #8594; 或 & rarr;
↑ 上箭头 & #8593; 或 & uarr;
↓ 下箭头 & #8595; 或 & darr;
 更多代码参见:
http://unicode-table.com/cn/

Android 用记事本程序 Techo记事帐+ 版本升级 1.6.2

值 Techo 记事帐下载量突破30万次之际,Techo 记事帐+ 1.6.2 版本现已发布。

1.5.1-1.6.1 更新包含以下内容:

  • 修正了特定机型的潜在错误。
  • 修复了必要权限问题。
  • 修复了库引用问题。
  • 修正了外接键盘右键翻页时数据丢失的问题。
  • 优化了包生成。
  • 新增 流畅滑动 功能。
  • 新增 自动弹出键盘设定 功能。
  • 新增 内容清除提醒 功能。
  • 新增 延时发送功能。
  • 增强了兼容性。
  • 修正了长时间的延时发送功能的潜在问题。
  • 更新了小工具的图标。

1.6.2 更新包含以下内容:

  • 增加了快捷键功能。
  • 改善了列表模式的易用性,增加了上下文菜单。
  • 改善了延时发送功能的易用性,增加了使用习惯记忆。
  • 改善了其他功能的易用性。

更多功能与易用性改善锐意开发中。

Techo记事帐 的 Google Play 页面:

https://play.google.com/store/apps/details?id=org.breezesoft.techoplus

2015年 Best Buy

离开校园后,私人时间越来越少,积攒的事情越来越多。就像是在与命运挣扎一般,自己始终还是希望能挤出点时间来做些有趣的事情。在积累了五篇没有完成的草稿,和数不清的想写却没有起笔的文章的情况下,写这么一篇 Best Buy 也许有些不合时宜。不过转念一想,这些新添置的设备确确实实改变了自己的日常,也是自己今年状态的一种侧面写照,费点笔墨倒也顺理成章。

下列每一件设备都从(该级别的)性能、功能(丰富与便捷)、使用频率与整体满足度四个维度打分,并做简单小结。

1 – 无线扬声器 SRS-X88

  • 性能 – 9
  • 功能 – 9
  • 频率 – 9
  • 满足度 – 9

尽管 X88 体积不大,重量也是能够随意搬动位置的级别,却提供了令人感动的声音效果。支持 HiRes 的它低音浑厚有力,高音清澈明了,人声清晰温暖,声音细节悉数展现。虽然自己平时听的耳机并不粗糙,X88 仍让那些早已了然于心的歌曲焕发了新生。“这位歌手的嗓音原来是这样的有层次感?”、“这里的伴奏其实是两种鼓合奏的!”、“相比之下,过去听的鼓点就好象是在敲击塑料片…”。不同于耳机,音箱可以让整间房间的空气活跃起来,身心仿佛都融入旋律与节奏之中。

X88 支持标准蓝牙音频/LDAC 高音质蓝牙音频协议、WLAN、LAN、USB、3.5mm 线缆等多种输入方式。回到家中,只需将 Xperia 与机身轻轻一碰,就能借助 NFC 实现配对连接,立即开始享受高品质的音乐。PC 中保存的 HiRes 音频也能通过 WLAN 以每秒数 MB 的码率流向 X88。对于一款蓝牙音箱,X88 的功能与易用性无可挑剔。没有满分是因为 LDAC 在手机高负荷运行时偶有卡顿,WLAN 播放在换曲时会有数秒的缓冲。

用 X88 听音乐已经成为了生活的一部分,几乎每天使用,频率自然能有9分。满足度少了1分的理由说来惭愧,自己本打算入手更高一阶的 X99,没料想冲绳消费水平有限,跑遍整个那霸市硬是没有 X99 的库存(同样地,也没有 A7M2,更别提 A7R…),便只好背回一台 X88。或许自己并不能在没有比较的情况下区分 X88 与 X99 的音质,但始终是留下了一份遗憾。

2 – 智能手机 Xperia Z5 Premium

  • 性能 – 8
  • 功能 – 8
  • 频率 – 10
  • 满足度 – 8

性能虽然一流却依然不拔尖,屏幕、散热与续航优秀,拍照与音质在同级别中平庸,上市一个半月,软件依然存在一些或大或小的问题(例如双卡双待时短信应用对 SIM 卡的标识是反的…)。做工方面,尽管选择了上质的材料,组装的质量却硬是欠火候。虽然是业界普遍情况,但指纹识别对湿手束手无策的确严重影响了使用体验——一旦识别错误五次,就不得不通过软键盘输入数字与字母结合的密码,而不是 iOS 那样提供了大型9宫格键盘以便输入。

作为随身携带的设备,以及迄今为止完成度最高的 Xperia,频率10分满足度8分或许是恰当的评价。

3 – 平板电脑 Xperia Z4 Tablet

  • 性能 – 8
  • 功能 – 8
  • 频率 – 8
  • 满足度 – 9

和 Xperia Z3+/Z4 难兄难弟的,被抛弃的一代——目前仍然停留在问题众多、性能低下的 Android 5.0.1 版本。幸好 Xperia Z4 Tablet 散热极佳,处理器不必频繁降频,系统卡顿才不算严重。

这台 Xperia Z4 Tablet 几乎只有两个用途,看书与浏览照片。素质上佳的屏幕、世界最轻薄的机身,还有长时间的续航,几乎就是为此而生。10.1 寸的高清晰度大屏幕无论是展示文字还是漫画都游刃有余,大部分的杂志可以在不局部放大的情况下阅读,391g 的轻量机身甚至与不少8寸平板相当,长时间单手使用也不成问题。标称17小时的电池续航能经得起一整天的折腾,使用至今,没电从来没有成为一个问题。

作为电子书与电子相框,Z4 Tablet 的表现近乎完美。如果它可以得到令人满意的系统更新,整体满足度应该可以更高吧。

顺带一提,据说明年索尼不会再推出平板设备,Z4 Tablet 说不定是索尼最后的平板电脑。这并不令人惊讶,从索尼的宣传策略来看,Z4 Tablet 的销量应该不甚理想。高端被 iPad 独占,低端被 Nexus 之类的瓜分,定位高端却又没有足够的品牌影响力与性能支撑的 Xperia Tablet 退出舞台也在情理之中。

4 – 蓝牙耳机 SBH54

  • 性能 – 7
  • 功能 – 7
  • 频率 – 9
  • 满足度 – 7

SHB52 的后继型号。体积更小巧,质感更好。取消外置扬声器与 USB 盖(改为裸露防溅水)的同时增加了震动与超距提醒。

SBH54 与前任一样,主要是在外出时解决耳机线的烦恼。满足度较低的原因,一方面是电池续航略有下降,一方面是目前客户端的稳定性不是很好,经常不会在启动后自动完成连接,依然需要手动操作,不太方便。

5 – 闹钟收音机 ICF-C1

  • 性能 – 7
  • 功能 – 4
  • 频率 – 10
  • 满足度 – 8

作为闹钟,C1 的性能没有问题,作为收音机,C1 虽然音量足够,音质却很平庸,在被 X88 惯坏后,对它的音质更加不满。另外,C1 的外形质感也和官网渲染图有较大差距,实在遗憾。

频道只能以模拟方式切换、不能设置多个闹钟、天线外露……功能设计如此粗糙,在这款收音机上完全看不到索尼的 DNA。

不过,考虑到每天听着广播节目起床时根本不会在意这些细节,满足度也不算很低。

6 – 智能手机 Xperia Z3+/Z4

  • 性能 – 6
  • 功能 – 8
  • 频率 – 10
  • 满足度 – 5

迄今最轻薄、屏幕最明亮的 Xperia,也是发热最巨大、卡顿最严重、屏幕色温偏差最大、续航最孱弱、系统升级最迟的 Z 系…

老实说,是比较不满意的一款产品。

7 – 入耳式降噪耳机 MDR-NW750N

  • 性能 – 7
  • 功能 – 6
  • 频率 – 3
  • 满足度 – 7

音质尚可,降噪效果尚可,算是中规中距。Y 型线较为不便,听诊器效应明显,加上一直就习惯蓝牙耳机出街,导致入手后几乎没怎么用。

特别提名 – 智能手机 Xperia Z Ultra

  • 性能 – 7
  • 功能 – 8
  • 频率 – 8
  • 满足度 – 9

两年多前入手的 Z Ultra 至今仍活跃在第一线。

作为当时世界最薄、屏幕尺寸最大、首款采用最新高通 Snapdragon 800 处理器、少数率先采用3000mAh大容量电池、唯一的大尺寸防水智能手机,Z Ultra 在升级至 Android 5.1 后依然保持了相当流畅的系统性能。6.4寸的轻薄机身十分趁手,对自己来讲,恰好是可以方便单手使用的最大尺寸,外出时看书、浏览网页、查阅地图等场景都是 Z Ultra 的强项。 Z Ultra 的 IPS 液晶屏显示效果现在看来有些落伍,亮度不高,对比度不强,色域不广,但满足基本的日常使用绰绰有余。摄像头和扬声器素质很低,好在自己平时并不需要使用它们。

Z Ultra 在一部分用户中的口碑极佳,回顾两年,自己恰好也是这部分用户的一员(笑)。