<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一點一滴,編程人生

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      69 隨筆 :: 0 文章 :: 25 評論 :: 0 Trackbacks

    2012年4月27日 #

    今天為了這個問題了忙乎了一整天,特此記錄下,希望對有遇到同樣問題的同學有幫助。事情的經過是這樣的,原先使用atomikos一直把數據源用jndi配置到tomcat的context.xml下,一直這么用沒有出現問題,配置如下
        <Resource name="jdbc/cms" auth="Container"
            type
    ="com.atomikos.jdbc.AtomikosDataSourceBean" factory="com.atomikos.tomcat.EnhancedTomcatAtomikosBeanFactory"
            uniqueResourceName
    ="jdbc/cms" xaDataSourceClassName="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
            xaProperties.URL
    ="xxxx"
            xaProperties.user
    ="xxxx" xaProperties.password="xxxx"
            xaProperties.pinGlobalTxToPhysicalConnection
    ="true" maxLifetime="60" poolSize="4" />

    最近項目要遷移到maven下,所以把context.xml的數據源配置挪到了spring.xml下,配置如下
        <bean id="myDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
           
    <property name="uniqueResourceName" value="masterDB" />
           
    <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>  <!-- SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana]  -->  
           
    <property name="poolSize" value="0" /> 
           
    <property name="minPoolSize" value="0"/>    
           
    <property name="maxPoolSize" value="9"/>    
           
    <property name="borrowConnectionTimeout" value="60"/>    
           
    <property name="reapTimeout" value="20"/>    
           
    <property name="maxIdleTime" value="60"/>    
           
    <property name="maintenanceInterval" value="60"/>    
           
    <property name="loginTimeout" value="60"/>
           
    <property name="xaProperties">  
                
    <props>
                    
    <prop key="url">xxxx</prop>  
                    
    <prop key="user">xxxx</prop>
                    
    <prop key="password">xxxx</prop>
                
    </props>
            
    </property>  
        
    </bean>
    因為上面這個配置我是照搬網上的,所以覺得沒有問題,可是項目啟動后,用此數據源提交事務時確報以下錯誤:

    Raised -5: invalid arguments were given for the XA operation 或 XAER_INVAL: Invalid arguments (or unsupported command)

    一開始我以為maven配置的mysql-connector-java驅動版本不對,或是atomikos版本不對,可是不管如何換版本都不行,就快要瘋了的時候,我看到了原先jndi方式中有這么一行代碼
    xaProperties.pinGlobalTxToPhysicalConnection="true"
    就因為缺少上面這句話導致了問題,上網查資料,據說是mysql xa bug,有興趣的可以看如下連接,最后配置如下:
           <property name="xaProperties">  
                
    <props>
                    
    <prop key="pinGlobalTxToPhysicalConnection">true</prop>  <!-- mysql必須配置此參數,要不然無法提交事務 -->
                    
    <prop key="url">xxxx</prop>  
                    
    <prop key="user">xxx</prop>
                    
    <prop key="password">xxxx</prop>
                
    </props>
            
    </property> 



    posted @ 2017-06-28 19:32 writegull 閱讀(2485) | 評論 (0)編輯 收藏

    事情描述:
    本人在阿里云上創建了一個linux服務器,跑了一個自己的測試web項目。搭建了redis。想方便測試用,就沒有對redis進行任何安全防護并暴露在了公網上。期間阿里云發現了此問題,還發短信提醒我,由于最近在公司一直加班也沒有時間理會,沒想到就在今天真的被黑了,事后心想多虧是個測試服務器,如果是正式環境,也真危險,這個黑客也沒有停下腳步,通過redis強大的能力在/root/.ssh目錄下面上傳了公鑰,徹底攻破了服務器,免密碼登錄服務器,一般黑客到這步也就看看有沒有興趣的數據,這個黑客一看這就是個沒有價值的測試服務器,所以心一橫,在我這上面裝了個DDOS攻擊軟件,把我的機器當起肉雞。

    1.這就是黑完后留下的公鑰/私鑰,刪除authorized_keys,id_rsa, id_rsa.pub這三個文件吧,除非還想讓他繼續黑下去。。。。


    2.通過redis的key *命令可以看到有個叫crackit的key。這就是黑客在入侵后留下來的,原先set的值是公鑰,入侵成功之后就改成這個了,把這個key也刪除掉吧。


    3.修改redis默認端口吧,不讓黑客利用6379端口。在redis安裝目錄中,修改redis.config文件。修改完了別忘了重啟redis服務,

    # redis-server /etc/redis/redis.conf 開啟

    # redis-cli shutdown 關閉



    4.重啟后查看redis是否運行
    ps -x | grep redis
    5.通過指定端口訪問redis。
    redis-cli -p 6666

    6.給redis設置密碼或者干脆設置成只能內網訪問

    7.通過top命令發現了幾個可疑的程序



    8.minerd這個程序是個用來挖掘萊特幣的,這個黑客看來干了不少壞事啊。。我們用命令 ps -ef|grep minerd 查找一下這個進程,殺掉這個進程kill -9 18267,并且去/tmp目錄刪除minerd目錄


    9.黑客在tmp目錄留下了一個叫1.sh的腳本,是用來下載挖掘萊特幣程序的。也把它kill掉吧。以下是腳本內容。


    10.通過cat /etc/passwd命令可以看到有一個叫作syss的非法用戶,權限還很高,跟root一樣,刪掉他吧,這是黑客入侵后方便進入的。使用命令userdel -f syss 強制刪除一個用戶,哪怕他正在登錄。


    11.去/mnt目錄上,可以看到黑客掛載了很多程序,刪除他們吧。


    12.通過nethogs軟件可以按進程實時統計網絡帶寬利用率,這個用來看是否存在DDOS攻擊最好不過了。

    13.暫時解決對外DDOS攻擊,最快的辦法就是用防火墻,這個阿里云提供的腳本幫了大忙。直接上傳到服務器上,運行一下世界就清靜了。下載地址:
    https://help.aliyun.com/knowledge_detail/5973920.html?spm=5176.7618386.5.1.H8H33f

     
    posted @ 2015-12-15 01:13 writegull 閱讀(4122) | 評論 (4)編輯 收藏

    今天在修改server.xml調試程序時,遇到下面這個問題,clean,重啟都不好使。

                    Removing obsolete files from server..
                   Could not clean server of obsolete files: null
                    java.lang.NullPointerException
    解決方法是把.metadata\.plugins\org.eclipse.wst.server.core這個目錄下面的tmp0刪除掉,再clean下就可以了。可能是緩存問題。
    posted @ 2015-01-03 16:58 writegull 閱讀(7283) | 評論 (0)編輯 收藏

    有時候需要手動地去禁用一個uibutton,使用button.enabled = NO的時候雖然能夠達到目的但也會帶來副作用,那就是按鈕變的半透明了。有時候應用不需要這種副作用,可以嘗試使用button.userInteractionEnabled = NO來達到這個目的,在禁用按鈕的同時也不會使得按鈕變得半透明。
    posted @ 2013-12-23 10:29 writegull 閱讀(600) | 評論 (0)編輯 收藏

    裝win8后發現cpu占用率50%-60%,而且磁盤瘋狂讀寫,是com surrogate這個程序,還有幾個服務造成的,之后我把com surrogate結束進程了cpu使用率直接降低到10%以下,我就郁悶了。
    解決方案:
    1,在“更多電腦設置”那里的“用戶”改為“本地用戶”。
    2,“離開”家庭組(一般都是它的原因)
    3,“同步設置”關
    4,一般“共享”什么的不到需要都是“關”的狀態。
    5,做完以上幾點都不行,就真幫不了你了。
    posted @ 2013-03-18 22:47 writegull 閱讀(399) | 評論 (0)編輯 收藏

    這個問題似乎只有在手動改變系統狀態欄級別的情況才會出現

    例如:self.window.windowLevel = UIWindowLevelStatusBar+1;

    這樣設置的話相當于影響了彈出短信或郵件控制器頁面window的級別,所以造成不顯示鍵盤問題(不過此問題在ios6以下沒有)

    解決方法:在當前視圖控制器中加入下面的代碼,即可解決

    - (void) viewDidAppear:(BOOL)animated {

        [super viewDidAppear:animated];

        self.window.windowLevel = UIWindowLevelNormal;

    }

    posted @ 2012-10-30 21:08 writegull 閱讀(1576) | 評論 (1)編輯 收藏

    原文地址:http://blog.csdn.net/pjk1129/article/details/7255163

    最近在做Apple的IOS開發,有開發靜態庫的需求,本身IOS的開發,只允許靜態庫或者Framework。在Xcode上沒有找到允許編譯,如同Android上的*.so和Win32上的dll這樣的說法。不過Framework這樣的框架,估計也是類似動態庫的實現,不過沒有具體研究過,后續繼續深入研究。

    我這個文檔的靜態庫的開發是基于Xcode4.2和iOS SDK5.0編寫的。Xcode4跟之前的Xcode3還是有不少的差別的。

    下面就簡單寫一個靜態庫和一個調用靜態庫的例子。

    靜態庫的編寫:

    1.靜態庫工程的建立:

    Xcode New一個新的project,選擇IOS下面的Framework&Library,下面有一個Cocoa Touch Static Library。直接next去建立一個Print這樣的工程。


    2.工程建立

    我們添加很簡單的"- (void)printA;"和"+ (void)printB;"的方法,這個方法的實現也是很簡單的,在*.m文件中的實現就是一個"NSLog(@“”);"這樣我們編譯出來的libstaticlib就可以被其他的IOS工程進行調用了。這塊注意一下,目前我們的Print->iOS Device



    3.編譯前準備

    這里分release與debug版本,需要設置一下


    4.OK,編譯

    我們可以在Products下面找到我們編譯生成的libstaticlib.a這個文件。

    注意未編譯前為紅色:左                             編譯后為黑色: 右

           

    5.ok

    在右邊 這個文件上右鍵Open In Finder。這時候我們打開了一個文件夾,里面有一個libPrint.a。后面我們繼續編寫一個調用這個libPrint.a的App。但是這個App在編譯時候會出錯,通過這個錯誤的解決,說明Xcode的一些編譯相關的東西。這里,我們在command下面根據路徑找到這個文件,用這個非常重要的命令查看一下這個lib的信息!

    打開終端寫入如下命令:這是什么?這就是所在的路徑 

    以下均是在自己的mac上的路徑。你需要將/Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/ 替換成你的路徑。

    cd /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/  

    我們手動打開這個路徑:可以看到如下信息:Release-iphoneos


    這個是給真機用的,那我們要給模擬器和真機封裝的靜態庫應該都能用才好。這個下面介紹?。。。?!  


    然后再在終端 打開這個文件:cd /Users/user/Library/Developer/Xcode/DerivedData/UItab-dbvoszbzpavyglaboxgflvrnzfce/Build/Products/Debug-iphoneos

    命令是:lipo -info libPrint.a,可以看到顯示的結果是:Arch是  Arm7。下面我會具體介紹一下。


    6.建立一個調用這個libPrint.a的應用

    應用就很簡單了,我們添加剛才libPrint.a的*.h文件。 然后在這個工程的Build Phases的Link Binary With Library里面添加我們剛才拷貝出來的那個libPrint.a。



    7.插入了h和a文件后

    我們就可以在control里面調用這個libPrint.a 函數了。

    #import "AstroDiskAppDelegate.h"

    #import "Print.h"


    @implementation AstroDiskAppDelegate


    @synthesize window = _window;


    - (void)dealloc

    {

        [_window release];

        [_viewController release];

        [super dealloc];

    }


    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    {

        

        //調用libPrint.a

        [Print printB];

        Print  *print = [[[Print alloc] init] autorelease];

        [print printA];


        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

        [self.window makeKeyAndVisible];

        return YES;

    }


    8.OK,編譯運行這個應用程序。

    編譯出現錯誤了。這個就是這篇文檔的關鍵了。主要就是為了介紹編譯靜態庫相關的東西。



    9.可以看到undefine symbols for architecture i386這樣的錯誤。

    其實這個錯誤原因很簡單,就是因為,我們用錯了編譯出來的libUITab.a lib,在模擬器里面,我們需要的是基于i386構架編譯的static lib,但是這個a文件,大家還記得前面說的arm6 arm7構架的么。這個a其實是在iphone這個arm構架上運行的代碼。其實show in finder指向的是一個ios device的庫,并不是i386模擬器下的庫。那如何編譯i386的庫呢?看見第二張圖片的Print>IOS Device了么?我們將這個iOS Device修改成iPhone5.0 Simulator。在進行編譯,這樣就可以編譯出i386下面的庫。這個時候我們show in finder打開的文件夾還是ios device下的庫。我們最好自己去那個目錄下看一下。這里我們用command去查看了一下目錄情況,如下:可以看到一個iphoneos的目錄和一個simulator的目錄。


    然后我們再看看這個目錄與第4條所示的目錄有什么不同! 同樣也有一個libPrint.a文件。



    10.錯誤原因分析

    Release-iphoneos里面的是基于arm6 arm7編譯出來的庫文件。Release-iphonesimulator文件夾下面的是基于i386編譯出來的文件。

    11.合并.a文件,制作通用靜態庫

    這二個庫一個是用于真機運行的一個是用于模擬器運行的.其實我們可以利用lipo將這二個文件打包成一個通用的a文件。命令如下:

    /Users/user/Library/Developer/Xcode/DerivedData/UITab-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products替換成你的路徑。 

    /Users/user/Desktop/libPrint.a替換成合并后的路徑。 

    lipo -create /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphonesimulator/libPrint.a  /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphoneos/libPrint.a  -output /Users/pjk1129/Desktop/libPrint.a


    12.打包以后的庫文件,我們查看信息

    然后打入如下命令:lipo -info /Users/pjk1129/Desktop/libPrint.a 

    可以看到如下信息:


    如上,你已經看到了,它具備了i386和arm7的條件。 現在我們這個靜態庫,支持的構架已經是armv7 i386了。


    13.ok,經過上述步驟后

    這個通用庫生成后,我們將原來,調用這個庫進行替換一下,在進行編譯,成功編譯,運行結果如下所示:


    posted @ 2012-10-09 18:14 writegull 閱讀(647) | 評論 (0)編輯 收藏

    three20 wiki 地址:https://github.com/facebook/three20/wiki/Debugging

    You can use Three20's debugging facilities instead of NSLog() / assert(). This would give you an ability to turn off debugging messages without commenting out all NSLog's, sort log messages by importance (errorwarninginfo).

    Turn on debugging(打開調試)

    These instructions are for Xcode 3:

    • Right-click on project, choose "Get Info".
    • In the "Build" tab, choose "Configuration => Debug" (you probably want to enable this only for debug builds)
    • While in the "Build" tab, search for "Preprocessor Macros" under the "GCC 4.2 - Preprocessing" section.
      • Add a declaration that reads DEBUG. That way you enable debugging in general.
      • Add a declaration that reads TTMAXLOGLEVEL=TTLOGLEVEL_INFO. By doing this, you set the default debugging output to beTTLOGLEVEL_INFO, the most descriptive one.

    Debugging preprocessor macro

    Use debugging

    Logging

    Use these instead of NSLog(). Which level gets printed to the console and which doesn't depends on what's set in preprocessor macros asTTMAXLOGLEVEL (see above).

    TTDERROR(text, ...)    // Log level 1 TTDWARNING(text, ...)  // Log level 3 TTDINFO(text, ...)     // Log level 5 TTDPRINT(text, ...) 

    Example

    If I got this in AppDelegate.m of my project HelloWorld:

    - (void)applicationDidFinishLaunching:(UIApplication *)application {	     TTDINFO(@"Hello!"); } 

    ...the console output would look like this:

    2010-05-15 01:04:20.107 HelloWorld[65222:207] -[AppDelegate applicationDidFinishLaunching:](22): Hello! 

    Conditional logging

    This is a type of logging facility which only outputs something if a particular condition is met:

    TTDCONDITIONLOG(condition, text, ...); 

    Example

    TTDCONDITIONLOG(TTDFLAG_URLREQUEST, @"Request parameters: %@", request.parameters); 

    Debug-only assertions

    Three20 also provides support for assertions which only work in the debug build.

    TTDASSERT(condition_which_would_lead_to_application_termination_when_true); 

    Example

    // Not that implementing safeAddSubview: is a good idea - (void)safeAddSubview:(UIView*)view {     TTDASSERT(nil != view);     if (nil == view) {         return;     }     [self addSubview:view]; } 

    See also

    Links

    posted @ 2012-09-27 10:30 writegull 閱讀(403) | 評論 (0)編輯 收藏

    翻譯:http://www.joshsunshine.me.uk/2012/02/29/ios-development-remove-old-notifications-from-notification-center.html

    不逐字翻譯了,只是大體說一下。
    看作者的意思,應該是他經常收到N多通知,而通過其中一條通知打開一個app以后,發現那個app的其它通知還在通知中心。作者不喜歡這樣的情況。我以為我也存在的這樣的情況,馬上檢查了一下,發現沒有??磥硎巧贁礱pp的問題。但是也記錄一下。作者總結的從通知中心移除通知的三種方法:
    1.將app的BadgeNumber設為0,就是app圖標右上角那個

    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];


    2.如果BadgeNumber本身就是0的情況,可以先將其設1再設置成0

    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

    3.如果以上的辦法都不好使的話,那就用本地通知欺騙一下。

    UIApplication* application = [UIApplication sharedApplication];
    NSArray* scheduledNotifications = [NSArray arrayWithArray:application.scheduledLocalNotifications];
    application.scheduledLocalNotifications = scheduledNotifications;

    就這么多了,我仔細想了一下,為什么我的應用從其中一條通知打開的時候,其它的通知消失掉:
    因為我在程序啟動的時候就執行了第一條:)

    posted @ 2012-09-14 17:51 writegull 閱讀(2754) | 評論 (0)編輯 收藏

    使用MFMessageComposeViewController 編寫發短信模塊時界面是英文的情況下,用下面的方法可以解決問題

    在plist里面Localization native development region 選擇 china ,然后Localized resources can be mixed 選 YES,如果沒有Localized resources can be mixed,需手動添加
    posted @ 2012-09-10 18:12 writegull 閱讀(703) | 評論 (0)編輯 收藏

    1.圖標的圓角效果是系統自動加上的。

    2.光暈效果雖然也是系統加上的,但可以通過程序中設置參數來去掉內建光暈效果。

    方法:在info.plist里面添加一條記錄UIPrerenderedIcon,新版的XCODE 會自動識別為Icon already includes gloss effects 打上勾就OK了。如果沒有識別的右邊欄寫上YES就可以

    posted @ 2012-07-31 14:06 writegull 閱讀(627) | 評論 (0)編輯 收藏

         摘要:   閱讀全文
    posted @ 2012-07-25 11:14 writegull 閱讀(1969) | 評論 (1)編輯 收藏

    原文地址:http://blog.itotem.com.cn/?p=22

    - alloc, copy, retain會把引用計數+1

    - release會把引用計數-1

    - 局部變量如果初始化時不是autorelease的,要及時調用release釋放,并且賦值為nil否則引用仍然存在導致下次無法用nil做是否有值的判斷

    - 實例變量要在每次賦值時要先釋放當前引用的對象再賦值,并retain一下保證引用計數為1

    - 對于有retain參數的property,直接使用”.”賦值時系統會自動釋放當前引用對象再賦值,并自動retain一下

    - dealloc中要對所有實例變量調用release,對于有retain參數的property只需要調用self.theProperty = nil即可,系統會去做釋放

    - delegate的property通常設為assign,如果設為retain的話會有循環引用的問題,比如aView.delegate = self時會把self retain一下,在aView的dealloc中會把delegate release,但是由于self的引用永遠不會小于1,所以導致aView和self的dealloc永遠都不會被執行,都永遠駐留內存造成泄露。所以如果要設為retain的話一定要確保不會造成循環引用問題。

    - 在UIViewController中的viewDidUnload中要釋放掉局部變量,調用release并設為nil,有時系統收到內存警告時會自動調用這個函數來釋放一些內存空間

    - 系統內存警告的回調中要釋放掉內存中的緩存和其他可釋放的東西,以免造成crash

    - 使用UITableView時要把cell設置為重用的,并且要確保確實寫得是重用的,有的人寫完的結果相當于還是每次都重建cell,導致效率低下

    - 使用UIScrollView時要自己控制釋放掉目前不顯示的內容,尤其是圖片,考慮圖片大小和瀏覽效果可以加載當前顯示頁兩邊的3-5頁內容

    - 圖片需要做緩存,尤其是本地文件系統緩存,可以放到Library/Cache目錄中,這個目錄系統有專用的常量來獲取,比如:

    這里是一個小例子闡釋前幾條基本原則:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    - (void)aFunction{
    //創建一個局部變量view
    UIView *view = [[UIView alloc] init];
    // 賦值給實例變量theView
    [theView release]; //先釋放一下當前引用的變量
    theView = [view retain]; //給實例變量賦值時需要retain一下
    // 如果theView是一個有retain屬性的property
    self.theView = view; //不需要先釋放,也不需要調用retain,系統會自動做,所以一定不能這樣寫self.view = [[UIView alloc] init];,這樣的話創建的view會被retain兩次,造成泄露,對于這種可以先創建一個局部變量,給self.view賦值后再釋放
    [view release]; //要及時釋放局部變量
    }
    - (void)dealloc{
    //釋放局部變量
    [theView release];
    //如果theView是一個有retain屬性的property,也可以這樣寫
    self.theView = nil;
    [super dealloc];
    }
    posted @ 2012-07-05 17:05 writegull 閱讀(1236) | 評論 (1)編輯 收藏

    今天測試程序時發現一個奇怪的現象,我在關于頁面中想顯示圖片icon文件,可是怎么調試都不顯示。后來加載其它圖片則顯示正常。

    我分析原因是蘋果對程序訪問icon文件做了限制,所以不能正常顯示

    解決方案:把icon文件復制一份,改成其它名字,加載改名字的文件,問題成功解決!
    posted @ 2012-06-26 16:10 writegull 閱讀(354) | 評論 (0)編輯 收藏

    今天開發中使用字符串分割函數split(),發現:
            String s = "upload/20120416135915265.sql";
            System.out.println(s.split("."));
    輸出的并不是想要的結果,之后輸出:
            System.out.println(s.split(".").length);
    結果竟然是0?。。?/span>
    突然想到轉義字符,于是:  
            System.out.println(s.split("\\."));
    OK啦?。?!
    原來在java中函數split(".")必須是是split("\\.")。
    posted @ 2012-06-24 09:27 writegull 閱讀(31369) | 評論 (4)編輯 收藏

    感謝蚊帳的投遞
    新聞來源:伯樂在線
    很多人表面上看著老實巴交的,實際上內心比誰都好強、自負、虛榮、甚至陰險。工作中見的多了,也就習慣了。有一些人,什么事都寫在臉上,表面上經常得罪人,甚至讓人討厭。但是他們所表現的又未必不是真性情。

    我相信大多數人都看過《豪門夜宴》這部香港老電影。張學友、梁朝偉演的拍馬屁的場景太有意思了,其中有這樣一段:當兩馬屁精幫老板說出主意,老板馬上叫 停,然后拍一下腦門:“哦。。。我想到了。。。”,把別人的idea當成自己的說出來。我在工作中還真不止一次遇到這種事,我提出來的想法老被別人拿來當 作自己的原創,當然個別小偷洋洋得意的描述自己的‘原創’時還會偷偷的瞄我一下,看我有沒有不高興,,,我并沒有不高興,大概是因為想到那個電影段子被逗 樂了。天下學術都一大抄,更何況什么想法,什么創新,通通都是浮云!

    君不見創新項目一大堆,都被抄死化成灰
    ! 但是不能因此而放棄創新,大地不可以因為有畜牲吃草而不復生機,山泉也不會因為有王八偷水而不冒活水。第一點:保持有一顆生機靈動的心。因為這個東西是別 人偷不走的,也是最大的財富。如果你不俱備這個東西,那么請用一顆善心去培養它。人人都是耀眼的珍珠,只是被灰塵蒙蔽了眼。

    記得剛進公司那會踏踏實實工作,滿懷激情。不過第一周就把自己的頂頭上司給得罪了,我并沒有做錯什么,記得當時還有同事幫我說話,后來慢慢發現他是一個相 當自負的人。不過話說回來搞技術的在技術方面有幾個不自負。這次事之后我并沒有學乖。對于別人設計不合理的地方,我會指出來,并提出該如何做。對于語言基 礎薄弱,設計模式薄弱的同事,我會好心推薦一些書籍,,,,,,本是好心幫助別人,卻并沒有得到別人的感激。相反,大部分會覺得你看不起他們,更有甚者不但不會反思改進自己的弱點,反而打擊報復看不起他的人。所以千萬請記住第二點:不可以隨便提意見。特別是新人,請務必保持低調。這一點在日常生活中同樣實用。

    與第二點相對,第三點:經常肯定、稱贊同事的成果和進步。注意這里并不是要你去巴結討好。常??吹絼e人的優點并加以肯定也是比較正面和必要的行為。這樣不但可以增進關系,更重要的是可以鼓勵別人。

    我一直認為一個人沒有自知之明就等同于垃圾。要隨時隨地知道自己小名叫什么。話說我有一位同事,基礎相當薄弱,但又太愛去表現自己,經常到處指指點點,生怕別人不知道自己是“高手”。由于老開“黃腔”常被人背后偷笑而不自知。

    第四點:低調一些,謙虛一些不斷提高自己的實力。進公司時所在部門是剛成立的,工作一段時間后,我發現由于部門團隊開發的特殊性很有必要在公司通用編碼規范基礎上再制定內部的編碼和設計規范,于是向上司 提了我的想法,他同意了。于是我起草了一個內部規范手冊。但是執行過程中,有人按手冊來,有人不按手冊來。產生這種局面的根本原因是上司并沒有支持。

    在這 里沒有必要分析原因,直接給出要記住的第五點:不在其位,不言其事。做好本職工作就好。無論在什么地方,開明而大度的好上司并不多,所以這一點相當重要。

    經常在開會討論設計方案的時候,會發現一個非常有意思的事情。會議本來進行的正常而和諧,當輪到某個優秀的人上去講的時候,氣氛一下子不和諧了。大家都迫 不及待的想挑出他的毛病,就算沒理解別人的意思也會亂說一氣。秀才遇到兵了,,,,,,以前實習的公司中也時常見到這種情況。每當此時我都會在下面感嘆: 好一幅百鳥鳳圖。請記住第六點:木秀于林風必摧之,要懂得韜光養晦,不要時時鋒芒畢露。

    公司里有個老員工,實力比較強,算是一個獨擋一面的人。不過在一次部門改組中并沒有得到提升,被提升為經理的反而是一個能力不算太強,還比他晚來的人。在此之前我聽到過那個老員工在和其它公司接觸并準備跳槽的傳聞。第七點:不到最后一刻,自己離職的想法不可以和公司內部任何人分享。因 為站在公司的角度來看你已經不忠誠了,不愿意重用你了。但是在員工自己的立場來看,公司給的待遇與能力不成正比、不認同公司的文化、想換個環境、想要一個 更好的發展機會,這些都是合情合理的。我個人發現一個規律:在一般的公司里,凡是堅持到最后經受住了“考驗”的“忠誠”者,往往都是沒什么能力的庸才。如 果你是一個公司高層管理者,那么你會如何對待類似的“叛徒”呢?

    第八點:不得罪辦公室里的女人。此處女人定義如下:(1)國寶級的女程序員; (2)女測試,這個不稀罕 ;(3)女助理,到處都是;(4)女上司,這個最要命!   男的處在一起,有什么沖突矛盾吵吵過了就忘了。但女的不一樣,一不小心就得罪了,后邊一逮到機會就會擺你一道,還沒完沒了!最要命的是:背地里狠狠的陰 你,而當著面表現得像你溫馨的親人。

    我們研發中心有個領導很可愛,不太清楚上面給他灌了什么迷魂湯,以至于自己職位被降了,職權被銷了很大一部分,還整天手舞足蹈高興得很。事后一兩個月才反 應過來不對勁,然后整天愁眉苦臉、、、、、、以這種交際反應的速度,被撤是必然的事情,確實不適合搞管理。技術男大多腦袋是‘方’的,不太善與處理人際關 系。第九點:加強交際能力。程序員大多還算是聰明的,平常稍稍注意一下就沒什么大問題。不過不要自我感覺良好,我們公司有個工作了十多年的IT男,幾年前就開始被派除去和客戶溝通,丫的,至今那一口吞吞吐吐的蹩腳的普通話讓人聽了就傷心。

    第十點:若無特殊情況,一定不要跨級匯報。這一點 細節很重要。某種意義上你的頂頭上司就是你的老板,直接決定了你的發展,你就是他手下的兵。并不是誰官大就聽誰的,要不然歷史上那么多兵變都不可能成功, 因為大家都只聽皇帝的,呵呵。從另一個方面講,你‘忠于’你上司的上司,他也不敢用你,因為誰知道提拔你之后,你會不會再越一次級??。?br style="margin: 0px; padding: 0px; " />
    第十一點:要善于向上司匯報工作。國家干部是不是 人民的公仆本人不太清楚。但公司里那些大大小小的管理者一定是(如果不是這樣那他就不是一個好上司)!那群夾板男,看著是個官,其實過得很苦。既要應付好 上面的領導,又要充分調動下面群眾做出業績,整天搞得焦頭爛額。上面的唱白臉,那么夾板男就唱黑臉??傊Σ蝗菀?。他們的猜疑心很重!時常會懷疑下面的人 沒盡心工作。雖然一般公司都有什么任務分配管理系統,但是那東西遠遠不夠。你需要找準時機讓他清楚你工作進展,你所做出的努力。

    第十二點:不要輕易造成情緒污染。不要因為你一個人不高興,而讓別人都看你的臉色。要學會雪藏自己的情緒。你若是一個領導,那這一點就太要緊了。

    第十三點:一舉一動找準自己的位置、別人的位置。比如:吃飯時的座次,照相時的排列位置,群發郵件時收件人的排名順序,文檔作者的位置順序、、、、、、這些都很重要。《易經》中有講:明相位,立德業。要是你連自己在哪兒都不知道,你又如何到得了目的地。

    第十四點:沒有必要做一個憤青。剛畢業那會,我很憤青,看不慣這看不慣那。但是又能怎么樣呢?弱肉強食的本質從來沒有改變過,你要學會嘗試去理解這個社會,理解種種關系。到某個時候你會發現:一切理所當然。你若真的不滿意某個現狀,那么就去盡自己的能力去改變它。勢者,不均也!均則無勢。

    第十五點:記住別人的善,忘記別人的惡。一個人心 里不應該有太多仇恨,仇恨是別人扔給你的垃圾,你又不是垃圾桶,老裝著它做什么?在公司當算法工程師近三年了,別人怎么對我,我的心里跟明鏡似的一清二 楚。對我不好的人我并沒太在意,更別說去報復。相反,他們有事要我幫忙的時候,我總能真心實意的去幫,甚至主動幫忙解決問題。這是這幾年來,我對自己唯一 滿意的一點。我相信一句話:活著就是修行。但是你得清楚你修的是善行還是惡行。

    畢業三年了,看看走過的路,總覺的有點荒涼。確實真正明白了許多道理。感謝幫助過我的人,也感謝打擊過我的人。也許一個人只有親身經歷了困難才可能真正成長起來,由此我不得不感嘆造化的殘酷。

    posted @ 2012-06-20 10:03 writegull 閱讀(214) | 評論 (0)編輯 收藏

     感謝雷鋒網的投遞

    編者按:本文作者郭子威,前網易網站產品部總監,想要聯系的讀者可以在微博上@純銀V。其實,這篇文章是打算寫“大公司抄你腫么辦?”很明顯騰訊最典型嘛,以至于我還在網易的時候,Boss也問我,騰訊抄你怎么辦?此時屢屢有一股邪火在胸口燃燒著,想大吼一聲:騰訊抄我怎么辦?老子跳槽去騰訊!最后我還是選擇了創業。


    我在網易5年,一直帶業務部門,從內容總監轉職產品總監,算得上資深中層吧。網易做產品的環境,放在業內大約是中等偏上,它的好處別家未必有,弊端 則是寰球同此涼熱。年初跟VC談天使融資的時候,對方大統領換了一個問法:如果網易抄你怎么辦?我很吃驚地回答,如果留在網易就能把這個項目做出來,我還 創什么業?難道你以為我創業是為了發財、專權,或者給自己戴上SB風格的CEO頭銜?

    那么大公司到底是真老虎還是紙老虎?我得從大公司業務運作的常識說起。

    ▎部門背景
    大公司是一個籠統的概念,由若干個事業部>大部門>中小部門>項目組構成。其中戰斗力過硬的項目組是少數,王牌軍不足十分之一,而水貨項目組的占比至少超過一半。
    我們品頭論足說XX公司的產品做得很好,其實是某幾個項目組實力非凡。如果不與他們正面對抗,其他組做產品也就是60出頭的平均分。難道你連產品70分都沒有自信?沒這自信你還做個屁啊。

    所以在忌憚大公司之前,先摸摸底,和你競爭的大公司項目組歸屬在哪個部門下面,它又是什么背景。正如我以前對某大公司很是好奇,為什么一部分業務很爛,另一部分很贊?內部人士答:因為它們分屬于兩個不同的事業部,一隊落魄邊沿化,另一隊則是常勝王牌軍。

    ▎業務關聯
    有些時候,你發現某大公司和你進入了同一個競爭領域。別著急,先看看做這個項目的部門,主營業務是否和該項目在同一條中軸線上。

    由于野心的驅動,部門主管常常會批準一些和主營業務關系不大的,想象空間又很大的項目,妄想別錯過金礦。然而這只是投石問路,買張彩票,主要的資源 仍然在主營業務線集中,更不可能忍受平緩的增長曲線(掘金心態嘛,哪怕掘到銅礦也會斷然放棄)。外界看見“XX公司悍然進入XX領域”……屁嘞,只有做這 個項目的團隊甘苦自知,時間緊/期待高/投入少,不掛基本上不可能。
    緊接著上一條,對大公司對手的部門背景作詳細調查,或許能解除你對那個龐然大物的恐懼心。如我以前在網易門戶做攝影分享社區,第一年里,有8個月分到了1 位工程師的工時;接下來一年總算有3位工程師了,其中2位又是實習生。我熬了整整3年,3年吶,才熬到基本夠用的技術人員配置,那時市場機遇早已消失不 見。

    ▎公共資源
    大公司的公共資源往往包括如下部分:UED、QA、推廣位,集中調度以提高利用率。有時候運營人員也是公共資源,有時候更慘一點,連程序員都是公共資源。 雖然家底殷實,公共資源攤薄到每個項目上便很寒磣,所謂僧多粥少。項目經理可能把自己有招聘權的人給湊齊了,但他還得腆著臉找各個公共部門老大要資源,有 時是懇求,有時是苦苦哀求。

    跪下來舔鞋都提不上工單的時候,我以前還使過一茅招,搞點部門經費,請前端組的同事私底下幫忙切圖……當作付費外包來對待。那時視覺稿已經堆了個把月,沒法推進一步。類似的木桶效應多如牛毛,幾乎每個大公司項目都會遇到,偏偏使不上力,被短板卡得上氣不接下氣。

    即便搶到了(勉強夠用的)公共資源,你還得面對分配資源的隨機性問題。比如說小清新風格的產品,能分到擅長此風格的設計師嗎?不能,誰空下來分派 誰。擅長小清新的設計師當然也有,人家正在別的項目組,即便那個項目惡俗,設計師也很不開心,做到一半怎可能中途離場。所以我以前跟PM說:有人幫你做就 快去燒香還愿,有推廣位到手就感恩熱淚盈眶,你還挑啥子挑喃?十幾個部門幾十個項目都鬧著要最好的最合適的,你讓UED情何以堪喃?

    由于公共部門采用派單制,大部分人員缺乏項目歸屬感,榮譽感,他既無法全程參與,也很難真正融入項目組里邊。座位經常隔了幾百米,一周只能碰頭兩三 面,甚至因為參與時間短暫,就連對產品的理解也比較淺,應付完這個應付那個,“應付了事”的心態極為常見。往往只有項目經理把產品當兒子看,別人都當成牽 到自己家里來串門的鄰居小孩兒。

    更能理解的是,公共部門這個月做A項目的單,下個月做B的單,這個月A項目組請飯請求加班,下個月B請飯請求加班。項目上線你們倒是領功/打賞/休 假,下一個項目組又聲淚俱下說這單子特別重要,非得拉兄弟一把不可。這豈不是“無窮無盡的加班”“無窮無盡的拼這一仗”?你們少來誑老子……
    曾見以前合作的設計師,私底下為自己做了款玩票的APP,比當初花兩三個月為我們部門設計的APP,起碼高出兩個等級。當真刮目相看。

    ▎KPI

    KPI是萬惡的,沒有KPI又是萬萬不能的。

    所謂KPI,屬于體制的一部分,也是大企業病的一部分。這個世界上不靠譜的人和項目占多數,衡量創業團隊是否靠譜的標準很簡單——剩者為王。這是一款生存游戲。

    隨著公司活下來并且膨脹起來,自然淘汰的篩選法很快失了效。創業意味著高風險和高收益,當創業團隊成長為中型公司,大公司,則個人的風險降低(收入 增加,薪資職位穩定),收益也降低(期權減少甚至沒有),容易滋生更多輕浮的冒險,拿公司的錢去玩自己的票,修筑各種爛尾樓。如果不用KPI來制衡,十八 般瞎折騰便掏空公司資源。人家旱澇保收底薪很高的,人家從折騰中賺到了經驗值,就算引咎辭職,下一份工作還能拿到更高薪水的,而你老板呢,資產耗光只能去 擺地攤了。

    鑒定和約束各種瞎折騰的管理手段之一,我們稱之為項目KPI,即階段性的項目考核。在這個過程中證明自己靠譜,項目有戲,公司才會繼續支持你。以我 所見,雖有不少被KPI整死的好項目,但95%以上被涮掉的,確為次品,事后一齊流淚控訴KPI之惡貫滿盈,覺得失敗原因是“公司不給支持”。問題是怎么 證明你和這個項目值得更多的支持?怎么證明你是有可能成功那5%,而不是注定失敗的95%?

    老板畢竟不是天網,他不可能什么都懂,尤其對新拓展的業務,一旦超出了高層的成功經驗領域,只能靠KPI來判斷項目前景。這同時意味著[要命的]公 司對項目缺乏耐心和遠見。若不能看到短期數據利好,則支持度快速下降,資源供給減少,方向盤立刻打到一條名為“黃泉”的路上。預見到滅頂之災又會干擾項目 經理的判斷,往往使些目光短淺,飲鴆止渴的茅招出來,茍且保得眼前性命。

    ▎高層干預

    剛才提到大公司對新業務缺乏耐心和遠見,這根子還在公司高層身上。所謂高層,最低也是管轄幾百人的方面大員,通常從VP起計。能做到大公司高層必有 過人之能,不幸人過30歲后對新領域的學習能力直線下降,再加上行政事務纏身,無法專注于業務。故而對于市場拓展,大部分高層混合了視野狹窄與剛愎自用這 兩種特質,必然大量依賴KPI管理。

    反過來看,如果高層瞄準了某個項目,下決心賭上一把呢,它就會得到更多的資源和寬容,初期KPI有可能壓根不設,所有公共部門都圍著你打轉。高層力 挺可以解決掉60%的大企業病,作為創業團隊,遇到這樣的對手是件挺可怕的事情,還好它們只是極少數,占比不足5%。而你會因為大晴天也有可能下雨沾濕 鞋,就畏畏縮縮不敢出門嗎?

    何況高層的支持是一把雙刃劍,他會給你喂足糧草,釘好蹄鐵,同時也給你戴上嚼子,圈定方向甚至策略。那么高層指定的方向策略出錯呢?恭喜,貴項目掛了。長官意志令如山,最怕長官是外行。

    另一些情況下,大公司項目因為資源不足,資源錯位而做砸,其實還是高層的決策影響。他認為給這些支持已經足夠看清前景,若是敗局,又何必豪賭下去。畢竟主營業務還賺錢嘛,還有得選擇,反倒是“沒得選擇”轉化為創業團隊背水一戰的韌性所在。

    ▎齊心協力

    說句聽上去挺刺耳的話,大公司里很難談真正的齊心協力。按我的理解,齊心協力的基石不是個人素質,而是成員都適合這個項目,喜歡這個項目,自然努力 團結??赡慵尤肽骋患掖蠊?,往往受其光環/福利/資歷的吸引,有個坑就猛往里跳,其后轉崗不易。做什么項目亦受到部門限制,自主權有限得很。
    換句話說,參與大公司項目組的,并不是最適合,最喜歡這個項目的人,而是項目經理目前能搞到的人(調動、招聘以及公共部門派單)。甚至項目經理本人也是奉 命而為,或無奈抓鬮。驅動工作的動力是職業道德,季度考核,獎金與功名,卻非你對這款產品的愛。老實承認,我自己即是一例。哪怕在網易加班極多,直到辭職 出來做有愛的產品,方才覺得過去皆是行尸走肉。

    而我目前的創業團隊只有6個人,來自5家大公司(上市或即將上市)。你說大家放棄了高薪福利,穩定工作,來上海做一款前途未卜的產品是為什么?當然不是服了我的三尸腦神丸……

    于是我現在的項目速度比之前在網易快3倍,工作進展有規劃,無管理,隊員的主動性之強,內部合作的愉快與默契是過去從未經歷過的。兩個字:“開心”。換回大公司,那得打多少雞血開多少動員大會啊,最后有人還在會上睡著了。

    ▎人多嘴雜

    小團隊憑什么跟大公司競爭呢?有人說是“專注”,有人說是“耐心”,有人說是“遠見”。這些都對,我還要補充一點,小團隊一定要比大公司犯更少的錯。

    這句話聽上去挺莫名其妙的,大公司人才濟濟,小團隊憑什么跟人家比正確率?回答很簡單:人才濟濟,同時也人多嘴雜。給項目提意見的人越多,執行效率 越低,這是鐵一般的定律。尤其當建議者中包括各級領導的時候,決斷就更加飄忽不定。你非得考慮上司的立場,部門的立場,微妙的公司政治環境,固然不乏真知 灼見,合攏在一起便成噪音干擾。大量時間花費在報審/修改/開會/爭吵/寫文檔/走流程上面,行動遲緩舉棋難定,更增加誤入歧途的概率。

    相比之下,小團隊的快速決策,快速行動,正好擊中了大公司的軟肋。一款新產品出來,大公司實權派發現它起碼得2個月,看懂它2個月,立項組好隊還得 花2個月。再加上市場前景不明朗,在創新者大紅大紫之前,大公司愿意投入(冒險)的資源是極少的,試水而已,復制抄襲多于革新改良,保守跟隨多于銳意開 拓。結果一兩年過去了,創新者勇猛精進已成氣候,大公司才回過神來,欲與之全力一搏。人家的前期積累已領跑市場,后來者未必追趕得上。

    類似案例,多不勝數。創業者眼里唯一的好機會,大公司看來卻只是1000個模糊不清的機會之一,拿捏不定。由此逆向思維的話,創業團隊最好不要插入 大公司的主營業務去虎口奪食。人家苦心經營多年,憑借對這塊市場的理解力和戒備心,會更快發現你,重視你,然后高層吹響號角擊潰你。但你去開辟新戰場呢, 大公司跟還是不跟,用多大力跟,往哪個方向走,它就很難統一內部意見。

    ▎基因轉移

    人都艷羨大公司“資源多”,所謂資源,一半是人才資源,一半是海量用戶,即推廣資源。然而不常被提及的是,大平臺的團隊基因/用戶構成/用戶習慣,與新項目是否吻合?;蛘呋\統點說,大平臺的資源優勢是否能向新項目平滑過渡。

    我一直是“基因論”的支持者,公司實權派的個人偏好,決定了團隊構成與文化,進而決定了主場優勢與劣勢。正如APPLE在社交網絡幾戰皆敗,偉大如 Google也被Facebook壓得抬不起頭來。只是受到野心蠱惑,即便八字不合,大公司也會悍然進入新領域(憑什么我不行),隨后又慘然退出(原來我 真不行)。

    比團隊基因更令人惱火的,是用戶基因,即當前用戶群的構成與使用習慣。做產品經常遇到“跨域”這個問題,借勢推廣也一樣。新項目的產品訴求,用戶構 成,如果和母體在同一個域內,則資源優勢平滑過渡,對競爭者是致命的殺傷力。但其實……平滑過渡又是一件特別不多見的事情。有時新項目整個的跨域,比如騰 訊做拍拍,做朋友,導入損耗率驚人;有時大平臺向垂直市場細分,無法精準過濾推廣目標,導入用戶良莠不齊得厲害,對于重視“氣質、氛圍”的垂直市場則是拔 苗助長。

    以我之前做網易攝影為例,不推吧,在大公司做產品跟創業有多大區別,生怕浪費了資源。推吧,不搭邊的人路過都來踩一腳,各種低端用戶、自拍用戶、審 美低下熱情萬丈的中老年用戶蜂擁而入,氛圍混亂,運營成本指數級上升,最終受困多過受益。反倒是獨立攝影產品如圖蟲,用戶氣味相投而來,自然增長營造的社 區氣質遠勝從大平臺引流,氣質恰恰又是社區的核心競爭力。

    做產品,鮮有一夜暴富,尤其UGC,口碑帶動增長才是最穩健的方法。道理固然大路貨,KPI壓力下卻容易急于求成。母體供血一旦大量摻水,相當于修 煉邪道武功,起步快而后力不濟,很快會觸碰到天花板。這時大平臺所謂海量用戶,反倒成為盛滿鮮花的陷阱,涂抹蜜糖的慢性毒藥。好似小時候四環素治病,長大 后燦然一笑露出滿口黃牙。

    總之,在大公司里做產品的雷區多多。與內部環境作戰所使的力氣,往往占到血槽的2/3強,只留下不足1/3去對付市場。它抄你,不見得就打得過你。 它是個大家伙,但也喜歡把兩個腳拇指綁起來走路。在多數情況下,大公司的新項目只是全身掛滿鉆石鐐銬的,虛弱的巨人,被它抄死多半說明你太遜色,而不是大 家伙太兇惡。
    不過,這個行業的主流論調并不這么看。

    最近幾個月,各式各樣的人紛紛來問我,既然立志創新,大公司抄你怎么辦?

    對這個問題,我有各種具體的回答,但都不是真心話。只是面對某些人,比如投資人的時候,你跟他講虛的,會被當成噴子,得表示我有明確的對策……其實對策易變,反倒是“產品哲學”這類虛的東西更加恒定。

    我真心的態度可以用三次自問自答來概括。

    1、我的產品質量能不能打敗跟隨者,至少是與跟隨者各擅其長?

    如果做不到,這不是我被抄的問題,是我太挫,我認栽。競爭會刺激我提高產品質量,未必是一件壞事。

    2、假定產品通過創新,打開一個新的細分市場,這個市場是否足夠大,大到可以容納下多個競爭者同時生存?

    如此則對手亦是隊友,我們一邊互相作戰,一邊共同開墾荒地,聯手培育市場。即便最后我只拿到第三、第四的份額,也不錯啊,誰規定創新者就非得獨吞整個市場不可——初夜權不等于占有權,市場又不是從一而終的貞潔牌坊。

    3、除了用戶口碑之外,產品是否有具象化的的價值沉淀?

    比如黏性強的用戶關系,比如用戶留存的他看重的內容,比如有忠誠度的優質內容發布者,比如含金量與時效性較長的信息。這些沉淀即防御壁壘,從產品架構階段就應該提前考慮,決定了防守反擊的難度。

    所以別人來不來抄這種事情,我從來都是不大關心的,偶爾想想,從不憂慮。周鴻祎有句話說得很好,少盯著對手,多研究用戶。一天到晚擔心“騰訊抄我怎 么辦”?擔心有屁用啊,萬一產品做得不好,騰訊抄都不屑于抄,那得白白浪費多少腦能量。我只管埋頭做自己的產品,洪興罩我去戰斗~

    換個角度看,哪怕比較倒霉,很快被大公司看得起并臨幸了,對手在高層力挺下全力以赴地復制并改良,它的基因剛好又平滑過渡……那么,我掛了。但產品 創新若是如我所愿地打開某個細分市場,改善某類用戶體驗,作為始作俑者,老子傾家蕩產,雖敗猶榮。“小小改變世界”比“賺到一千萬”更值得追求。

    正如我在微博里所說:阻擋你創新的是“無能”而不是“抄襲”,鼓舞你創新的是內心驕傲而不是永遠獨占鰲頭。

    文/benimaru zhang

    posted @ 2012-06-14 10:08 writegull 閱讀(229) | 評論 (0)編輯 收藏

    openURL的使用方法:[[UIApplication sharedApplication] openURL:[NSURL URLWithString:appString]];
    其中系統的appString有:
    1.Map http://maps.google.com/maps?q=Shanghai 
    2.Email mailto://myname@google.com 
    3.Tel tel://10086 
    4.Msg sms://10086 


    openURL能幫助你運行Maps,SMS,Browser,Phone甚至其他的應用程序。這是iPhone開發中我經常需要用到的一段代碼,它僅僅只有一行而已。

    //打開地圖

    - (IBAction)openMaps {
    NSString*addressText = @"beijing"; //@"1Infinite Loop, Cupertino, CA 95014"; 
    addressText =[addressText stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
    NSString*urlText = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@",addressText]; 
    NSLog(@"urlText=============== %@", urlText); 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlText]];
    }

    //打開mail

    - (IBAction)openEmail { 

    [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"mailto://devprograms@apple.com"]];

     }


    //撥打電話 

    - (IBAction)openPhone {

     [[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"tel://8004664411"]]; 

    }

    使用這種方式撥打電話時,當用戶結束通話后,iphone界面會停留在電話界面。
    用如下方式,可以使得用戶結束通話后自動返回到應用:
    UIWebView*callWebview =[[UIWebView alloc] init];
    NSURL *telURL =[NSURL URLWithString:@"tel:10086"];// 貌似tel:// 或者 tel: 都行
    [callWebview loadRequest:[NSURLRequest requestWithURL:telURL]];
    //記得添加到view上
    [self.view addSubview:callWebview];

     還有一種私有方法:(可能不能通過審核)
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"telprompt://10086"]];


    //打開短信

    - (IBAction)openSms { 

    [[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"sms://466453"]];

    }


    //打開瀏覽器

    -(IBAction)openBrowser { 

    [[UIApplication sharedApplication] openURL:[NSURLURLWithString:@"http://itunesconnect.apple.com"]]; 

    }

    posted @ 2012-06-13 17:09 writegull 閱讀(597) | 評論 (0)編輯 收藏

    北京時間6月9日消息,據外國媒體報道,谷歌在招聘員工和工程師時,往往會問應聘者有關技術方面的問題。蘋果卻大不相同,總是會司會問一些腦筋急轉彎風格的問題,提出一些與硬件規格相關的問題,此舉似乎更多的是希望從潛在的員工身上挖掘更多的創造力。蘋果的這些問題不僅針對技術人員,甚至還針對銷售人員和其他特殊人員。以下就是美國網站GlassDoor提供的蘋果在面試應聘人員的最有趣味性的15道題目:

      1、桌上放置了一部舊iPhone,你能看到哪些材料?

      招聘職位:產品設計工程師。

      在蘋果公司工作的多數員工,都會了解供應鏈的成本事務,以確保盡可能地減少生產手機的產品成本。蘋果手機是極具價格競爭優勢的產品,所以你必須知道如何從事控制成本相關的工作。因此,具備專業的材料及其屬性相關的經驗將有助于你在生產手機設備時降低成本。

      2、描述使用蘋果產品的情況

      招聘職位:銷售員。

      如果你想銷售蘋果產品,最好已經是蘋果用戶。無論如何,蘋果不會聘用一個從未使用蘋果iPhone手機的人來擔任公司的銷售員工。

      3、如果測試部門否決了500臺洗衣機,那么你將如何查找根源并找到解決之道?

      招聘職位:產品質量工程師。如果在生產中發生了故障,就可能會導致數百部iPhone手機受損,甚至也可能會此起成千上萬的收入受損。如果你想管理產品質量,那么就必須確保你能夠發現所有產生的問題,特別是那些在供應鏈初期階段就出現的問題。

      4、你如何在資源非常有限的環境下將處理網絡、文件系統、用戶界面系統等的線程模型轉化成用戶空間框架?

      招聘職位:軟件工程師。

      編寫運營程序的代碼較為容易,但是要讓它有效的工作就會很難了,特別是當你為手機設計軟件時,你必須依賴低功率的芯片來確保電池壽命延長。

      5、你如何計算來自中國的蘋果供應量?

      招聘職位:材料項目經理。

      他們正在探討字面意義上的蘋果,如你所知,就是水果。不過,這也是一道非?;A的供應問題。如果你負責管理供應鏈,那么你就需要確切的知道供應 商供應何種產品、以及能夠提供什么樣的材料。蘋果公司幾乎為其生產的智能手機購買所有最好的元件,如果你能夠充分了解整個供應鏈,那就能夠減少成本。

      6、使用運營放大器來設計一個LED驅動

      招聘職位:硬件工程師。

      通常情況下,產品不會在非常優化的環境下運行。事實上,運行環境要么太熱、要么太冷、甚至還會在水中。因此,你必須確保你的產品能夠在非最優化的環境下運行。

      7、如何診斷緩沖溢出問題?

      招聘職位:軟件工程師。

      通常情況下,確定誰是最有才華工程師的最佳方法就是問他們如何去解決問題。緩沖溢出問題一旦產生,就可能會引發巨大災難,因此,如果你想測試你的工程師在極端復雜問題面前如何采取什么行動的話,那么這將是值得提問的好問題。

      8、你有100個編號的燈泡,在第一環節中都打開這些燈泡,然后再換上其它的新燈泡,依次類推,這樣100次過后,還有多少個燈泡在亮著?

      招聘職位:高級軟件工程師。

      實際上,蘋果的面試官并不是最傳統的人,他們會從Khan Academy網站引用一些腦經急轉彎風格的問題,但是,這些問題一般都是涉及一些數學技巧的復雜問題,因此,要想測試一個工程師解決問題的能力,這些問題都將是值得提出的好問題。

      9、你如何及時地關注科技新聞?

      招聘職位:Mac人才。

      如果你想運營蘋果零售商店,那么還需要確保你具備一種認知感覺——即了解人們如何從新聞中理解蘋果公司。蘋果的面試官想以此了解應聘人員是否會瀏覽TechCrunch、heck或Business Insider之類的網站。

      10、你從一個6×6的網格的左上方開始,可以向下或者向右移動,那么你會有多少種方法能夠到達網格的右下角?

      招聘職位:高級軟件工程師。

      這是一個叫作“路徑計算”的問題,也是最基本的一種腦筋急轉彎問題,這樣的問題旨在測試應聘人員如何思考問題,以及能否找到解決問題的方法。蘋 果會向他們的部分高級軟件工程師提出一些更加瘋狂的此類問題,這一點也不足為奇。這樣的問題也取自于Khan Academy。

      11、你如何檢驗表面曲率的連續性?

      招聘職位:CAD制圖員。

      蘋果為自己的設備繪制了大量的原型——例如iPhone和iPad的原型等。那些原型都需要進行測試,因此,你需要讓一些人快速的繪制出原型。但是,還要保證與蘋果的其它設備保持一致,因此,你需要確保你的制圖員和設計師具備完美的意識,甚至設計玻璃的形狀。

      12、找到鏈接列表的中間點

      招聘職位:Cocoa camp。

      蘋果會要求他們的軟件工程師提供一個更明智的解決方案。例如,你可能會獲得兩個“指示器”,一個指示器在鏈接列表中每次移動一步,另一個每次移動兩步。當另一指示器到達終點時,那么第一個指示器所處的位置就是鏈接列表的中間點。

      13、如果你可以帶一件科技產品到偏遠的地方,那會是什么?

      招聘職位:專員。

      這是一個帶有“欺騙性”的問題,蘋果可能是在測試你是否喜歡iPhone手機。在蘋果店的銷售人員(蘋果店專家就是干這個的)必須非常喜歡蘋果產品。

      14、在金屬片上打出5個洞眼的方法?

      招聘職位:產品設計工程師。

      蘋果需要確保其設計師和硬件工程師至少都具備一定的創造力,即使他們必須成為超級技術專家,因此,即使是讓你在金屬片上打洞這樣的簡單問題也可能會有很多的解決方法。事實上,蘋果是在測試應聘人員的創造力。

      15、你認為中學里什么樣的群體最好或最簡單?

      招聘職位:專員

      如果你想在蘋果商店中挑出那些更可能購買蘋果產品的專門用戶,你就需要具備了解這些用戶是什么樣的人,無論他們是否購買蘋果產品,你都需要作出記號,并盡可能快地區別出來。 

     

    posted @ 2012-06-09 14:23 writegull 閱讀(320) | 評論 (0)編輯 收藏


    屏幕快照 2010-12-27 上午10.20.03

    實現如下代碼:

    - (void)viewDidLoad {
    [super viewDidLoad];
    segmentedControl=[[UISegmentedControl alloc] initWithFrame:CGRectMake(80.0f, 8.0f, 70.0f, 25.0f) ];
    [segmentedControl insertSegmentWithTitle:@"T+" atIndex:0 animated:YES];
    [segmentedControl insertSegmentWithTitle:@"T-" atIndex:1 animated:YES];
    segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
    segmentedControl.momentary = YES;
    segmentedControl.multipleTouchEnabled=NO;
    [segmentedControl addTarget:self action:@selector(Selectbutton:) forControlEvents:UIControlEventValueChanged];
    UIBarButtonItem *segButton = [[UIBarButtonItem alloc] initWithCustomView:segmentedControl];
    [segmentedControl release];
    self.navigationItem.rightBarButtonItem = segButton;
    [segButton release];

    }

    -(void)Selectbutton:(int)sender{
    UISegmentedControl *myUISegmentedControl=(UISegmentedControl *)sender;
    NSLog(@”!!!!!!!!%d”,myUISegmentedControl.selectedSegmentIndex);
    switch (myUISegmentedControl.selectedSegmentIndex) {
    case 1:
    break;
    case 0:
    break;
    default:
    break;
    }
    }

    segmentedControl 中的字體也是可以改動的,代碼如下:

    -(void)ChangeSegmentFont:(UIView *)aView
    {
    if ([aView isKindOfClass:[UILabel class]]) {
    UILabel *lb = (UILabel    *)aView;
    [lb setTextAlignment:UITextAlignmentCenter];
    [lb setFrame:CGRectMake(0, 0, 80, 25)];
    [lb setFont:[UIFont systemFontOfSize:18]];
    }
    NSArray *na = [aView subviews];
    NSEnumerator *ne = [na objectEnumerator];
    UIView *subView;
    while (subView = [ne nextObject]) {
    [self ChangeSegmentFont:subView];
    }
    }

    在需要調用此方法的地方加入下面方法即可(分段控件中已經有分段按鈕時調用)

    [self ChangeSegmentFont:UISegmentedControl的對象];

    即可

    posted @ 2012-05-03 17:34 writegull 閱讀(4410) | 評論 (0)編輯 收藏

    文章出處:http://blog.csdn.net/iukey

    UIKit提供了一組控件:UISwitch開關、UIButton按鈕、UISegmentedControl分段控件、UISlider滑塊、UITextField文本字段控件、UIPageControl分頁控件。

    控件是對UIView派生類的實用增強及補充,并可以直接附著于導航欄、表格單元,甚至更大的對象。

    這些控件的基類均是UIControl,而UIControl派生自UIView類,所以每個控件都有很多視圖的特性,包括附著于其他視圖的能力。所有控件都擁有一套共同的屬性和方法。

    所以學習控件,我們先學習UIControl。

    屬性

    enabled

    控件默認是啟用的。要禁用控件,可以將enabled屬性設置為NO,這將導致控件忽略任何觸摸事件。被禁用后,控件還可以用不同的方式顯示自己,比如變成灰色不可用。雖然是由控件的子類完成的,這個屬性卻存在于UIControl中。

    selected

    當用戶選中控件時,UIControl類會將其selected屬性設置為YES。子類有時使用這個屬性來讓控件選擇自身,或者來表現不同的行為方式。

    contentVerticalAlignment

    控件如何在垂直方向上布置自身的內容。默認是將內容頂端對其,對于文本字段,可能會改成UIControlContentVerticalAlignmentCenter。對于這個字段,可以使用下列諸值:

    1. UIControlContentVerticalAlignmentCenter  
    2. UIControlContentVerticalAlignmentTop  
    3. UIControlContentVerticalAlignmentBottom  
    4. UIControlContentVerticalAlignmentFill  
    contentHorizontalAlignment

    水平對齊方式,可以只用下列值:

    1. UIControlContentHorizontalAlignmentCenter  
    2. UIControlContentHorizontalAlignmentTop  
    3. UIControlContentHorizontalAlignmentBottom  
    4. UIControlContentHorizontalAlignmentFill  

    事件通知

    UIControl類提供了一個標準機制,來進行事件登記和接收。這令你可以指定你的控件在發生特定事件時,通知代理類的一個方法。如果要注冊一個事件,可以使用addTarget方法:

    1. [ myControl addTarget: myDelegate   
    2.             action:@selector(myActionmethod:)  
    3.             forControlEvents:UIControlEventValueChanged ];  
    事件可以用邏輯OR合并在一起,因此可以再一次單獨的addTarget調用中指定多個事件。下列事件為基類UIControl所支持,除非另有說明,也適用于所有控件。

    UIControlEventTouchDown

    單點觸摸按下事件:用戶點觸屏幕,或者又有新手指落下的時候。

    UIControlEventTouchDownRepeat

    多點觸摸按下事件,點觸計數大于1:用戶按下第二、三、或第四根手指的時候。

    UIControlEventTouchDragInside

    當一次觸摸在控件窗口內拖動時。

    UIControlEventTouchDragOutside

    當一次觸摸在控件窗口之外拖動時。

    UIControlEventTouchDragEnter

    當一次觸摸從控件窗口之外拖動到內部時。

    UIControlEventTouchDragExit

    當一次觸摸從控件窗口內部拖動到外部時。

    UIControlEventTouchUpInside

    所有在控件之內觸摸抬起事件。

    UIControlEventTouchUpOutside

    所有在控件之外觸摸抬起事件(點觸必須開始與控件內部才會發送通知)。

    UIControlEventTouchCancel

    所有觸摸取消事件,即一次觸摸因為放上了太多手指而被取消,或者被上鎖或者電話呼叫打斷。

    UIControlEventTouchChanged

    當控件的值發生改變時,發送通知。用于滑塊、分段控件、以及其他取值的控件。你可以配置滑塊控件何時發送通知,在滑塊被放下時發送,或者在被拖動時發送。

    UIControlEventEditingDidBegin

    當文本控件中開始編輯時發送通知。

    UIControlEventEditingChanged

    當文本控件中的文本被改變時發送通知。

    UIControlEventEditingDidEnd

    當文本控件中編輯結束時發送通知。

    UIControlEventEditingDidOnExit

    當文本控件內通過按下回車鍵(或等價行為)結束編輯時,發送通知。

    UIControlEventAlltouchEvents

    通知所有觸摸事件。

    UIControlEventAllEditingEvents

    通知所有關于文本編輯的事件。

    UIControlEventAllEvents

    通知所有事件。

    除了默認事件以外,自定義控件類還可以用0x0F000000到0x0FFFFFFF之間的值,來定義他們自己的時間。

    要刪除一個或多個事件的相應動作,可以使用UIControl類的removeTarget方法。使用nil值就可以將給定事件目標的所有動作刪除:

    1. [ myControl removeTarget:myDelegate   
    2.                   action:nil  
    3.                   forControlEvents:UIControlEventAllEvents];  
    要取得關于一個控件所有指定動作的列表,可以使用allTargets方法。這個方法返回一個NSSet,其中包含事件的完整列表:

    1. NSSet* myActions = [myConreol allTargets ];  
    另外,你還可以用actionsForTarget方法,來獲取針對某一特定事件目標的全部動作列表:
    1. NSArray* myActions = [ myControl actionForTarget:UIControlEventValueChanged ];  

    如果設計了一個自定義控件類,可以使用sendActionsForControlEvent方法,為基本的UIControl事件或自己的自定義事件發送通知。例如,如果你的控件值正在發生變化,就可以發送相應通知,通過控件的代碼可以指定時間目標,這個通知將被傳播到這些指定的目標。例:

    1. [ self sendActionsForControlEvents:UIControlEventValueChanged ];  
    當委托類得到事件通知時,他將收到一個指向事件發送者的指針。下面的例子用于處理分段控件的事件,你的動作方法(action method)應遵循類似的處理方式:

    1. -(void) myAction:(id)sender{  
    2.        UISegmentedControl* control = (UISegmentedControl*)sender;  
    3.        if(control == myControl1){  
    4.         /*查詢控件得值*/  
    5.       /*響應myControl1的動作*/  
    6.        }  
    7. }  

    此文到此結束,如果你能耐心看看這篇文章,對你后面具體的控件會有事半功倍的效果。
    posted @ 2012-04-28 17:21 writegull 閱讀(2899) | 評論 (1)編輯 收藏

    保存你的私鑰,轉移到其它系統

    將你的私鑰安全的保存,如果你需要在多臺電腦上開發或者重裝你的操作系統的。如果沒有私鑰,那么將無法再Xcode簽名或者在apple設備上測試應用。當一個CSR被生成,Keychain Access應用在你的登錄keychain里面生成一個私鑰,這個私鑰是和你的用戶賬戶關聯的,如果在系統重裝的時候是無法重新生成的。如果你希望在多個系統上做開發或者測試,那么你需要在所有你工作的系統之上導入你的私鑰。

    1、 導出私鑰和數字證書是為安全保存和能夠在多臺電腦上進行工作。打開Keychain Access應用選擇’KEY’分類。

    2、 右鍵點擊和你iphone開發證書關聯的私鑰,并在彈出菜單中選擇導出選項。

    3、 使用(.p12)保存包含了你個人信息的鑰匙。

    4、 你將會被提示創建一個密碼。

    現在可以通過.p12文件在不同系統之間傳輸。雙擊.p12在其他系統上進行安裝。輸入你在step4輸入的密碼。

    posted @ 2012-04-27 10:40 writegull 閱讀(625) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 男女一边桶一边摸一边脱视频免费| 亚洲国产日韩在线成人蜜芽 | 亚洲精品美女久久久久久久| 最近免费最新高清中文字幕韩国| 亚洲高清在线播放| 免费A级毛片无码A∨中文字幕下载| 亚洲va国产va天堂va久久| 永久免费不卡在线观看黄网站| 亚洲一区无码中文字幕| 国产在线精品观看免费观看| 亚洲国产另类久久久精品黑人| 中文成人久久久久影院免费观看 | 亚洲国产精品嫩草影院| 日本高清免费不卡视频| 久久久久久久久无码精品亚洲日韩| 免费h成人黄漫画嘿咻破解版| 色爽黄1000部免费软件下载| 国产啪亚洲国产精品无码 | 亚洲欧洲日韩国产综合在线二区| 91av在线免费视频| 亚洲伊人精品综合在合线| 全免费A级毛片免费看网站| 高h视频在线免费观看| 亚洲精品国产成人片| 日本最新免费网站| 国产亚洲精品精品精品| 亚洲欧洲国产精品香蕉网| 91久久成人免费| 看免费毛片天天看| 亚洲AV日韩AV天堂一区二区三区| 动漫黄网站免费永久在线观看| 无码天堂va亚洲va在线va| 亚洲s色大片在线观看| 妞干网手机免费视频| eeuss影院www天堂免费| 亚洲欧洲日产v特级毛片| 国产乱子伦精品免费无码专区 | 久久精品国产免费观看三人同眠| 亚洲av中文无码乱人伦在线观看| 亚洲尤码不卡AV麻豆| 成人黄18免费视频|