这几天业界最引人注目的新闻无疑是《每日经济新闻》刊发的《360 黑匣子》,在这篇长达 24128 字的“调查性报道”中,匿名记者“秦俑”为大家展示了一个为了自己的商业利益,罔顾用户的安全和权益的几乎无恶不作的 360 的形象。
但是在这场声势浩大的批判狂潮中,仍然不乏一些人保持了理智和冷静。纯银(@纯银V)在微博上表示:
有两件“政治不正确”的事情,我跟主流舆论有些分歧:1、我不认同抄袭扼杀(非游戏类的互联网产品)的创新,扼杀创新的只是“创新低能”而已。2、我对 360 的产品体验始终有一分产品经理的敬意。
另外又有某人表示:
年度最差文章備選之一,沒有足夠的調查和證據,沒有嚴密的論證,只有『某』,只有第三方的說法,記者的匿名報導是對新聞真實和尊嚴的最大傷害,真是有夠諷刺。
曾经任职新浪、现在作为约瑟网络有限公司产品总监的资深产品经理吴伟(@何必PM2_5)也在文章中表达了自己的看法:
如果是客观的讨论,指出错误和不足以期改进,这是学术行为;但是要用耸人听闻的词汇,颇具煽动性的口吻影响用户的决策,那就只能认为是一种竞争手段了。
作者授权刊载,TECH2IPO 对原文有删改。
前两天,我的一位朋友丢给我一个连接,然后飞快的说:
矮马!赶紧看看这篇文章!!吓死我了!以后再也不敢用 360浏览器了!!隐私啊!!我的隐私啊!!你说,我换什么浏览器好?啊?要不就猎豹吧?猎豹挺好的吧?!买票还能快点儿!恩恩!就换猎豹了!!
然后,他!就!走!了!瞬间我心中万兽奔腾啊,尼玛这是来跟我探讨浏览器的事儿么?不是你练口才准备给凉茶播广告吧?好歹你喘口气让我说句话啊。
于是我打开了朋友丢给我的链接,这一看不得了,怪不得能把我朋友吓成这样,图文并茂数据丰富,堪称高级黑的典范,不仅对于普通用户杀伤力极大,就是对于从业人员来说要敬畏三分,稍有反对意见,弄不好就要落个“不懂装懂”的悲惨下场。
但是,作为一名产品经理,不懂装懂是我的日常工作;把内行的话翻译给外行听更是我的职业素养。今天就发挥一下我的长项,把这篇非常专业的枪稿给大家解读解读(以下就把《360 黑匣子》这篇报道简称为报道吧)。
为什么说这是一篇枪稿?
这篇报道的倾向性太过明显,在语言上喜欢使用“癌细胞”、“毒瘤”、“切除”这样感情色彩强烈的词汇,恨不得生啖汝肉笑谈渴饮。
如果这是在微博上的一场骂战倒也痛快;偏偏是刊登在标榜中立公正的纸媒上!《每经》的编辑们真的是当新闻稿件审的么?还是当卖出去三个整版广告所以随便写啊?
既然你一口气采访了三个周鸿祎的敌人,好歹也要采访几个周鸿祎的朋友吧,所谓兼听则明;就算周鸿祎把互联网业得罪光了,一个朋友没有,至少也可以采访一下周鸿祎本人吧。
这么一边儿倒的采访我倒是在新闻联播里经常见。
360泄漏隐私是真老虎还是纸老虎?
这篇报道最大的问题是把可能发生的事情当做已经发生的事情来吓唬用户。
我们就用报道里打的那个比方解释一下:360 就像小区保安,用户就像小区业主,保安以“保护业主安全”为名拿到了业主家的钥匙。这的确是个安全隐患,保安可能会趁业主不在家偷偷溜进屋干坏事。但这只能说保安“有能力”干坏事,不能证明保安真的就干了坏事,更不能号召业主一起打死这个保安。
报道说 360 浏览器秘密的、未经用户允许的情况下向服务器传递数据,甚至下载dll文件。这只能证明 360 确实有能力泄露用户隐私;而 360 是不是真的泄露了用户隐私,那要看他究竟传了什么数据上来,但文章自己也承认“没有人知道答案”。
再退一步讲,360 即使上传了用户的隐私,他究竟是怎样使用这些数据的也是我们要考察的。(注:是否得到用户许可,也是另一个值得关注的)
百度、Google 也会记录用户的搜索习惯,以便能提供更好的搜索结果;QQ 也会保存用户的聊天记录乃至用户关系,否则“圈子”这个神奇的产品是怎么出来的呢?淘宝会记住用户的每一笔消费,到年底的时候还会告诉你比别人多花了多少钱。
对于互联网公司来说,用户个人资料收集的边界在哪里,本来就是存在争议的伦理问题:做好了可以改善服务质量,稍不留神就侵犯了隐私。
如果是客观的讨论,指出错误和不足以期改进,这是学术行为;但用耸人听闻的词汇,聚集一些片面的内容,作为一个知名媒体,这一做法值得商榷。
编者:相比两万多字的长文,这篇不到二千字的短文在证据和逻辑方面无疑存在着一些细节上的缺陷,我们能够质疑每经在这篇报道上的专业性和新闻态度,也能够对其中的疑点提出质疑,但是这究竟是否确定为一篇枪稿以及笼罩着360的安全疑云,依旧是一个无法得到肯定答案的谜题。
更值得我们思考的是,为什么会出现这样水准的报道,以及事实的最终真相究竟如何?这样的探究或许还会一直进行下去。
使用横向滚动栏HorizontalScrollView。利用加载一个透明的View占位置,然后使用scrollView.smoothScrollTo(left, 0);来滚动,监听手势动作。
获取水平滚动栏直接子View
LinearLayout parent=(LinearLayout) getChildAt(0); parent.addView(children[0], 410, 880); parent.addView(children[1], 536, 880);
一、MainActivity布局文件
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="2px" android:background="#00ffffff" android:padding="0px" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <RelativeLayout android:id="@+id/menu" android:layout_width="fill_parent" android:background="@drawable/desktop_list_item" android:layout_height="wrap_content" > <ImageView android:id="@+id/head" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitStart" android:src="/blog_article/@drawable/acount_head_photo/index.html" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignBottom="@+id/head" android:layout_marginLeft="10dip" android:layout_toRightOf="@+id/head" android:text="沈阳师范大学" android:textColor="@color/white" android:textSize="17dip" /> </RelativeLayout> <ListView android:id="@+id/HomeListView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:cacheColorHint="@android:color/transparent" android:divider="#000" /> </LinearLayout> <grimbo.android.demo.slidingmenu.MyHorizontalScrollView android:id="@+id/myScrollView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="0px" android:background="#00ffffff" android:fadingEdge="none" android:fadingEdgeLength="0px" android:padding="0px" > <LinearLayout android:id="@+id/top" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="0px" android:background="#00ffffff" android:orientation="horizontal" android:padding="0px" > </LinearLayout> </grimbo.android.demo.slidingmenu.MyHorizontalScrollView> </FrameLayout>
二、监听手势
public class MyGestureDetector extends SimpleOnGestureListener { //滑动 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { float touchLength = Math.abs(e1.getY() - e2.getY()); System.out.println("touchLength="+touchLength); if (touchLength > SWIPE_MAX_OFF_PATH) return false; // 从右向左滑动 if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { System.out.println("SSSSSSSSSSSleftS"); int menuWidth = menu.getMeasuredWidth(); menu.setVisibility(View.VISIBLE); int left = menuWidth; scrollView.smoothScrollTo(left, 0); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { int left = 0; scrollView.smoothScrollTo(left, 0); System.out.println("SSSSSSSSSSSleftS"+left); } } catch (Exception e) { Log.e("detector", "excetpion:" + e.getMessage()); } return false; } } @Override public boolean onTouchEvent(MotionEvent event) { if (gestureDetector.onTouchEvent(event)) return true; else return false; }
三、侧边栏布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/app" android:layout_width="1dp" android:layout_height="1dp" android:orientation="vertical" android:background="#ffffffff" android:padding="2px" android:layout_margin="2px"> <LinearLayout android:id="@+id/tabBar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/BtnSlide" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="0px" android:layout_margin="0px" android:src="/blog_article/@drawable/ic_launcher/index.html" /> <TextView android:text="<- Press icon" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ff00ff00" android:cacheColorHint="#ff00ff00"> </ListView> </LinearLayout>
2010-05-10 11:13 如何生成Oracle AWR报告 AWR报告的产生方法如下:
1,登陆Oracle数据库:
sqlplus / as sysdba
2, 在sqlplus中,以sys用户运行下面的命令,生成第一份性能数据快照:
exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT (flush_level=>'ALL');
3,运行你找到的所有或很多性能较差的应用或SQL,让系统压力始终处于比较高的状态(如CPU或IO的使用),并保持此状态达到半小时到1小时
4,在sqlplus中,以sys用户再次运行下面的命令,生成第二份性能数据快照:
exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT (flush_level=>'ALL');
5,在sqlplus中,以sys用户运行下面的命令,以产生性能报告:
@?/rdbms/admin/awrrpt.sql
根据提示,选择上面生成的2个性能数据快照,最后会生成一个最终的AWR性能报告。
======================
即:
首先进入$ORACLE_HOME/rdbms/admin目录,在sqlplus下运行@awrrpt脚本,按照提示一步一步就可以达成,导出的格式有两种,txt格式和html格式。