分类目录归档:互联网

让Phabricator支持中文的全文搜索

Phabricator是一款优秀的开源项目管理、代码评审和代码管理平台,然而,默认情况下,它对于中文搜索的支持存在问题。

例如,如果你新建了一个标题为“公司年会准备工作”的Maniphest Task,那么,你在Phabricator中用“公司”或者“年会”进行搜索,是搜不到“公司年会准备工作”。这是因为Phabricator默认安装的时候,使用的是MySQL的全文索引,而MySQL默认的分词器是按照空白字符进行分词的,因此,“公司年会准备工作”是作为一个词语进行索引,而不是按照“公司”“年会”“准备”“工作”四个词语进行索引。

解决的办法有不少,例如,我们可以使用ElasticSearch为Phabricator的搜索引擎。不过,其实MySQL的全文索引是支持中文分词的,从MySQL 5.7.6开始,MySQL增加了NGRAM分词器,当你设置ngram_token_size=2时,“公司年会”会被分词为“公司” “司年” “年会”。

Phabricator的MySQL全文索引建立在phabricator_search库的search_documentfield表上,索引名称为corpus,对应的表的列名为corpus。 索引名称为key_corpus,对应的列为corpus和stemmedCorpus。



CREATE TABLE `search_documentfield` (
`phid` varbinary(64) NOT NULL,
`phidType` varchar(4) COLLATE {$COLLATE_TEXT} NOT NULL,
`field` varchar(4) COLLATE {$COLLATE_TEXT} NOT NULL,
`auxPHID` varbinary(64) DEFAULT NULL,
`corpus` longtext CHARACTER SET {$CHARSET_FULLTEXT} COLLATE {$COLLATE_FULLTEXT},
KEY `phid` (`phid`),
FULLTEXT KEY `corpus` (`corpus`)
) ENGINE=MyISAM DEFAULT CHARSET={$CHARSET} COLLATE={$COLLATE_TEXT};

我们看到,DDL语句中,创建全文索引的部分为“FULLTEXT KEY `corpus` (`corpus`)”,这使用的是默认的MySQL分词器,如果我们要使用NGRAM分词器,这个语句应该写成“FULLTEXT KEY `corpus` (`corpus`) WITH PARSER NGRAM”。

我已经有了一个已经安装好的Phabricator实例,我并不想重新安装Phabricator,所以,我的做法是删除掉corpus索引,然后重新建立以NGRAM作为分词器的corpus索引。

SQL语句如下(之前的版本)

USE phabricator_search;
DROP INDEX `corpus` ON `search_documentfield`;
CREATE FULLTEXT INDEX `corpus` ON `search_documentfield`(`corpus`) WITH PARSER NGRAM;

SQL语句如下(最新的版本)

USE phabricator_search;
DROP INDEX `key_corpus` ON `search_documentfield`;
CREATE FULLTEXT INDEX `key_corpus` ON `search_documentfield`(`corpus`,`stemmedCorpus`) WITH PARSER NGRAM;

我设置MySQL的ngram_token_size为2,因为中文中两个字的词非常多。

我的my.cnf中添加了以下配置项

[mysqld]
ngram_token_size=2

2016年12月31日后,NSAllowsArbitraryLoads将被禁用,建议所有iOS App的Web API都升级为HTTPS

苹果的iOS 10正式版本马上就要发布了,而自iOS 10开始,苹果对于网络安全将更加重视,2016年12月31日以后,你将不能用NSAllowsArbitraryLoads来禁止App Transport Security了。

简单说,苹果坚持,你的所有的Web API请求都必须使用https,而如果你需要使用WebView加载外部的网页,考虑到你无法控制外部的网站,苹果引入了新的NSAllowsArbitraryLoadsInWebContent,允许WebView可以加载任意的网页。

The new NSAllowsArbitraryLoadsInWebContent key for your Info.plist file gives you a convenient way to allow arbitrary web page loads to work while retaining ATS protections for the rest of your app.

如果你需要在App中加载任意的网页,那么,你可以在Info.plist中添加NSAllowsArbitraryLoadsInWebContent,这样,你可以加载非安全的http页面,同时保证你的app的其他方面仍然受到App Transport Security的保护。

对于许多公司来说,API团队近期有一项非常重要的工作,也就是,如果你们的Web API仍然是通过明文的http进行调用的,那么,你们需要尽快将API的endpoint升级为https。

如果大家真的来不及升级到https,那怎么办呢。我突然想到,苹果只是禁止了NSAllowsArbitraryLoads,但是我们还是可以NSExceptionDomains,将API对应的域名添加到例外列表中的。

The following listing represents the overall structure of the NSAppTransportSecurity dictionary, showing all possible keys, all of which are optional. Keep this structure in mind as you configure each element of the dictionary, as needed, for your app:
以下代码是NSAppTransportSecurity字典的结构模型。该模型列举了所有可能的键值对,这些键值对都是非必须的。您可以根据这个结构中所示的键值对的信息来编辑Info.plist中的NSAppTransportSecurity字典。

NSAppTransportSecurity : Dictionary {
    NSAllowsArbitraryLoads : Boolean
    NSAllowsArbitraryLoadsInMedia : Boolean
    NSAllowsArbitraryLoadsInWebContent : Boolean
    NSAllowsLocalNetworking : Boolean
    NSExceptionDomains : Dictionary {
         : Dictionary {
            NSIncludesSubdomains : Boolean
            NSExceptionAllowsInsecureHTTPLoads : Boolean
            NSExceptionMinimumTLSVersion : String
            NSExceptionRequiresForwardSecrecy : Boolean   // Default value is YES
            NSRequiresCertificateTransparency : Boolean
        }
    }
}

应用退出登录,数据丢失,原来是iOS系统的bug,NSUserDefaults内容随机消失

最近,我突然发现用着用着很多应用就要我重新登录了,我自己的app在调试的时候,也经常发现原来保存的登录状态也消失了。经过调查,我发现,原因在于保存在NSUserDefaults中的登录信息没了,而保存在keychain和文件中的信息还有。

经过查找,我发现了如下信息,原来是iOS 9.3的一个bug,应用用于保存信息的NSUserDefaults的内容会随机消失。
https://forums.developer.apple.com/thread/44264

iOS 9.3.1 NSUserDefaults Wiped Bug?

elementarteilchen
May 6, 2016 5:11 AM
(in response to staminajim_sg)
Yes. It seems that the iOS just “forgets” to load the data sometimes. If this happens in my own App while debugging, I can easily kill the App and prevent that it will change the userdefaults, and the next time I lanuch it again, the settings are usually loaded just fine. The big problem is that when you are not debugging your own Apps, you do not have a chance to kill an App before it save any settings, and when an App does this, the old settings are overwritten and lost forever.
(给staminajim_sg的回复)
是的。这看起来是iOS似乎有时候忘记及时加载数据了。我在调试的时候常常发现这个现象发生,在这种情况下,我可以用杀掉app的方式防止我的app执行对NSUserDefaults的修改操作,这样子,下一次我再启动app,原来的设置都还在而且也会正确加载。最大的问题是,如果你不是在调试你的App,你就没有办法像我一样杀死App,这就导致App会执行写操作,原有的设置就会被覆盖掉了。

Rygen
May 27, 2016 6:10 AM
(in response to elementarteilchen)
Also facing the same issue since 9.3, and now it persists on 9.3.2.
I’ve had this issue happen with a first party app as well – Weather. It lost all the saved cities, about one month ago.
Whatsapp is by far the worst in terms of data loss. You can’t avoid some of it even if you’re obsessively backing it up to iCloud every single time you use the app.
I know of one person which is not using the iPhone as a development device and is also having the same problem, so this NSUserDefaults issue is probably not related to that.
Which iPhone models are you seeing the issue on? Mine is a 5S.

I’ve submitted a bug report to Apple.
(给elementarteilchen的回复)
我从iOS 9.3版本开始就遇到这样的问题,现在已经升级到9.3.2了,问题依旧存在。
我最开始遇到这个问题,是一个月以前,在我的天气应用上,我的天气应用中保存的城市列表都消失了。
Whatsapp则是受到影响最大的,即便你经常通过iClound备份,你的数据也会丢失。
我知道一个案例,一个用户并不是将他的/她的iPhone作为开发设备,而他/她也遇到了类似的现象,这表明NSUserDefaults问题并不是因为iPhone被设置为开发设备的缘故。
大家在那些iPhone型号上遇到这个问题了?我的是iPhone 5S

ChaoticBox
Jun 19, 2016 1:06 AM
(in response to NeilFau)
I’ve been seeing this as well but figured out a workaround for my own apps: If my keys aren’t found, call resetStandardUserDefaults and try again. It shouldn’t hurt to repeat that a few times before bailing and assuming it’s a first-run, but so far it has always worked after the first reset.
(给NeilFau的回复)
我也遇到了相同的问题,不过我找到了一个变通的方法。如果我的应用在启动的时候发现某个键值对应的值不存在,那么我会首先调用resetStandardUserDefaults,然后接着再试着获取该值。重复几次resetStandardUserDefaults的操作,如果这样仍然无法取到相应的值,那么可以认定这是首次运行。这样的操作并不繁琐复杂,但是截至到目前位置,我发现这个方案是有效的。

alexfit
Jul 6, 2016 12:30 AM
(in response to NeilFau)
This has been happening to me for the last few months. By FAR, the most distressing bug I’ve encountered on iOS as a user. Can’t use What’s App, as I’m constantly losing chat history. Have to log in again to Evernote, Instagram. Settings and tips for many apps reset and I’m sent back to onboarding screens.

For the first time, I’ve lost all trust in my iPhone. A thought of getting a “reliable” Android phone crossed my mind…

I hope this is getting fixed, soon.
(给NeilFau的回复)
这个问题在最近几个月一直困扰着我。到目前为止,这是我见过的最令人烦恼的一个iOS的bug。我不能用Whatsapp,因为我经常会丢失聊天记录。我不得不重复登录Evernote,Instagram。许多应用的设置和提示都被重置了,这导致我每次启动都见到欢迎界面。

这是我首次丧失了对iPhone的信任,我已经开始考虑买一个可靠的安卓手机了。

希望这个bug能够被尽快修复。

在OSX 10.11 El Captain上安装pybonjour时遇到dlopen(libSystem.B.dylib, 6): image not found错误

上一篇讲到,我需要安装PonyDebugger,而安装PonyDebugger需要安装pybonjour,然而,安装pybonjour时,又遇到了错误,错误信息如下,
Traceback (most recent call last):
File “setup.py”, line 32, in
import pybonjour
File “/Users/huangshaojun/Downloads/Eichhoernchen-pybonjour-c63b48c/pybonjour.py”, line 109, in
_libdnssd = ctypes.cdll.LoadLibrary(_libdnssd)
File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py”, line 443, in LoadLibrary
return self._dlltype(name)
File “/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py”, line 365, in __init__
self._handle = _dlopen(self._name, mode)
OSError: dlopen(libSystem.B.dylib, 6): image not found

我到github上也找到了对应的Issue 192 https://github.com/square/PonyDebugger/issues/192
Issue提到的解决方法是

well, okay i had to do a brew install python

即,不要用OSX内置的python,而用brew新安装一个python。

我并不想再新安装一个新的python,我还是希望用OSX内置的python,为此,我根据
http://stackoverflow.com/questions/32905322/oserror-dlopenlibsystem-dylib-6-image-not-found
的提示,修改了pybonjour.py

if sys.platform == 'darwin':
        _libdnssd = 'libSystem.B.dylib'
    else:

改为

if sys.platform == 'darwin':
        _libdnssd = '/usr/lib/libSystem.B.dylib'
    else:

这样用OSX内置的python就可以正确安装pybonjour了。

PonyDebugger安装错误:Could not find a version that satisfies the requirement pybonjour==1.1.1

之前一直用Reveal,不过Reveal只能查看View Hierarchy,而我听说PonyDebugger不仅仅可以查看View Hierarchy,还能debug network traffic和view core data,所以决定也集成PonyDebugger。

到PonyDebugger的主页(https://github.com/square/PonyDebugger)一看,发现README中有一个Quick Start,这个Quick Start提到首先要运行如下代码安装ponyd

curl -s https://cloud.github.com/downloads/square/PonyDebugger/bootstrap-ponyd.py | \
  python - --ponyd-symlink=/usr/local/bin/ponyd ~/Library/PonyDebugger

我运行了以后,遇到如下错误

Collecting pybonjour==1.1.1 (from ponyd)
  Could not find a version that satisfies the requirement pybonjour==1.1.1 (from ponyd) (from versions: )
No matching distribution found for pybonjour==1.1.1 (from ponyd)
Traceback (most recent call last):
  File "", line 2462, in 
  File "", line 946, in main
  File "", line 1794, in after_install
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 540, in check_call
    raise CalledProcessError(retcode, cmd)

随后,我用关键字

Could not find a version that satisfies the requirement pybonjour==1.1.1 

进行搜索,发现了Issue #186 https://github.com/square/PonyDebugger/pull/186,此issue表明pybonjour的问题已经于2016年2月27日解决了。可是,我为什么仍然遇到了这个问题呢。

接下来,Issue 185解决了我的疑惑 https://github.com/square/PonyDebugger/issues/185,其中 justinseanmartin 在3月15日提到

I was able to clone and then install using python setup.py install. It isn't as convenient as the command from the readme, will look into getting the script fixed up as well.

Issue 188 https://github.com/square/PonyDebugger/issues/188 中,justinseanmartin也提到了,

Dupe of #100. You should be unblocked by:

git clone git@github.com:square/PonyDebugger.git
cd PonyDebugger
python setup.py install

Please confirm this works for you. I've logged #189 to track fixing the install script and/or instructions.

这说明,pybonjour问题的解决方案,还没有应用到https://cloud.github.com/downloads/square/PonyDebugger/bootstrap-ponyd.py,所以,用Quick Start的方式安装仍然有问题,我们目前还是需要把PonyDebugger的git库clone到本地,再进行安装。

iOS应用的糟糕例子:口碑外卖的用户体验越来越糟,这是把用户往饿了么赶

最近几年,O2O,特别是外卖,已经形成了白热化的砸钱补贴营销的战场,外卖市场上,饿了么,美团,口碑和百度四家基本上成为外卖的主流平台了,外卖配送方面,百度自己做了配送,美团也有自己的专送,饿了么做了蜂鸟配送,此外,还有一个达达,也是做了配送,同时达达也做了一个叫做派乐趣的外卖平台。

大战已经进行了快两年了,百度外卖,饿了么,美团和口碑这四家,现在也变成了三家,即口碑和饿了么合并,口碑外卖事实上被阿里巴巴抛弃了。

为什么说口碑事实上已经被抛弃了呢。

打开了最新更新的口碑外卖客户端,第一个感觉就是,怎么全都变成H5页面了?口碑外卖底部的tab bar,只有“外卖”、“订单”和“我的”三个按钮,我在这三个tab之间切换的时候,明显感觉到tab bar会闪一下,然后整个app中间有一个浏览器在加载某个页面。这样的感受让人感到非常糟糕。

到口碑外卖的某个店里一看,发现这个店在口碑只有三个宝贝在卖,而在饿了么里,却有几十个,明显感觉到商家要放弃口碑的样子。

再看看近期的新闻
口碑APP订餐出现平台即将关闭提示 官方回应:商家理解有误 2016-05-03 http://www.admin5.com/article/20160503/661207.shtml
饿了么开送口碑外卖:被收购进入倒计时 2016-04-21 http://www.mnw.cn/keji/mi/1159677.html

在5月3日的新闻中,饿了么方面回应称,“商户的理解不太正确。口碑外卖的业务目前都由饿了么提供,只是如此而已。”

然而,从口碑外卖的最新的app的交互体验,以及口碑外卖在苹果的App Store的差评来看,其实饿了么和阿里巴巴都已经把口碑当成了一个弃儿,就让口碑自生自灭吧。

既然口碑外卖已经是一个弃儿,一个不值得投入资源的产品,那么,自然产品、研发、运营和测试等团队就应该从口碑撤离了。这也是为什么口碑外卖更新以后,居然成了完全的H5应用的原因。

口碑当年被阿里巴巴收购后,已经死了一次,后来做外卖,业界以为口碑又会活过来,没想到,其实口碑从来没有活过,只不过被阿里打了强心剂,回光返照一下,作了一回饿了么的陪练而已,而阿里巴巴仅仅是做了个口碑和饿了么打了一架,然后趁机投资饿了么而已。

阿里做口碑,不是为了把口碑做好,而是把口碑当做为了投资饿了么的一个资本布局的一个小棋子罢了。

CDN导致的App内图片有时候无法显示

最近,我发现了一个之前都没有发生过的问题。时不时就发现某个应该显示某张图片的地方,显示着placeholder image。难道我的代码哪里没写好吗?

调试后发现,应该是CDN的问题。

我在下载图片的代码处添加了一个条件断点,一旦error对象不为nil,就触发断点,最后发现,error对象的code都是404。

随后,我将image url复制出来,用curl -vvv命令进行下载。我发现,一般来说,第一次curl命令会输出404错误,往往第二次或者多次以后的curl,才会下载到正确的image数据。

通过观察curl返回的header数据,我发现了“Power-by-ChinaCache”字样,这说明,我司的CDN用的是ChinaCache的服务。

自此,真相大白了,首次下载的时候,CDN不知为何,直接给了404错误,而多次重试后,CDN更新了数据,就返回了200代码和image数据。

解决微信登录 “Scope 参数错误或没有Scope 权限” 问题

目前,微信,微博登录已经成为各个手机应用不可或缺的登录方式之一了,如果谁的app还没有添加这两种登录方式,那么您就落后于市场主流了。

然而,微信登录功能增加后,还是要经常维护的,比如每年需要进行公众号的年检,如果您没有及时年检,那么,微信登录就会出现很多问题。

笔者近期在调试app的时候,就发现,点击app的微信登录按钮,跳转到微信后,微信提示“Scope 参数错误或没有Scope 权限”,这让我感到莫名其妙啊。怎么可能scope参数错误呢,微信的Api中,用于登录的是SendAuthReq这个class,我很确定我设置了SendAuthReq的scope属性,并且是正确的。这么看来,真实的原因就是没有scope权限了。

多试验了几次,发现,有几次不会出现这个“Scope 参数错误或没有Scope 权限”错误,微信也会正确跳转回app,并且也可以获取code,然而,这时候调用微信的sns/oauth2/access_token API就会出现48001, api unauthorized错误。

最开始,我通过bing和google搜索了以上错误信息,结果,这个错误的根本原因多重多样。

  1. 2014年微信增加了“网页授权”,如果不开启这个选项,那么就会出现本错误。http://www.w-nn.cn/jiaocheng/423.html
  2. 还有人发现,scope参数在url中的位置不一样也会导致scope参数错误,http://my.oschina.net/u/202293/blog/387513。不过,笔者这里是iOS app用微信登录,所以可以排除这种可能
  3. 还有一些论坛中开发者求助,然后过了一会,求助的人自问自答道:“解决”。http://bbs.youzan.com/forum.php?mod=viewthread&tid=1113。 笔者看到这里感到,既然解决了,为什么不把原因和解决方案共享出来呢。
  4. mob.com的ShareSDK论坛也有人求助:http://bbs.mob.com/thread-20961-1-1.html,这个最后没有提到怎么解决的。
  5. 此外,还发现了http://tieba.baidu.com/p/4081677132,其中提到 乐动力 微信登录异常,原因就是微信公众号年审还没通过。而这里面所说的登录异常,就是“Scope 参数错误或没有Scope 权限”

我这次遇到的问题,根源就在于公众号没年审,所以微信登录被停掉了。我找运营部门的同事进行以下公众号年审就行了。

以前都及时年审了,所以没遇到这个问题,近年来,微信公众号申请的越来越多,这下子每个人要负责很多个微信号,这导致很容易就会有某个微信号维护不及时。

在UITabBar上识别长按(long press)操作

大家或许都知道,现在的智能手机都支持各种手势操作,如长按,单手指或者多手指滑动或点击,随着技术的发展,屏幕还可以识别按压的力度。

在iOS上,我们可以通过Tap/Pan/Pinch/Swipe/Rotate/LongPress Gesture Recognizer来识别各种手势,所以,在UITabBar上识别Long Press(长按)手势其实并不困难,只需要在tab bar上添加一个Long Press Gesture Recognizer就好了。

然而,以上的方案存在一个小小的瑕疵。iOS默认的tab bar,在你点击某一个tab bar button后,就会选中该button对应的item,而如果是tab bar controller的话,就会切换到对应的view controller。实际上,UITabBar在检测到用户按下以后,而不是按下然后拿起手指之后,就选中了对应的bar item,所以,tab bar在识别long press之前,就已经认为用户进行了一次tap。

实际上,更好的方案是,识别long press的话,就不要识别tap了。这就要求,我们需要修改tab bar识别tap的逻辑,即,用户必须touch down(按下)然后touch up(手指离开屏幕),才算一次,而非tab bar默认的行为,touch down就开始处理tap事件。

我采取的措施是,扩展UITabBar,在Tab Bar的view里添加一个overlay view,即这个view确保在Tab Bar的其他subviews的上面,由这个overlay view去识别Tap Gesture,当识别到Tap操作后,根据点击的坐标识别用户点击了哪一个tab bar item。

_overlayView = [[UIView alloc] init];
_overlayView.backgroundColor = [UIColor clearColor];
[self addSubview:_overlayView];
self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
[_overlayView addGestureRecognizer:self.overlayGestureRecognizer];
- (void)tapGesture:(UIPanGestureRecognizer*)gestureRecognizer{
    CGPoint point = [gestureRecognizer locationInView:self];
    switch (gestureRecognizer.state) {
        case UIGestureRecognizerStateEnded:
        {
            NSInteger touchUpItemIndex = [self barButtonItemIndexAtPoint:point];
            if (touchUpItemIndex != NSNotFound) {
                //touch up inside event
                UITabBarItem *item = [self.items objectAtIndex:touchUpItemIndex];
                //接下来,将selectedItem设置为item,并调用享用的delegate方法。
            }
        }
        break;
    }
}

 
以上代码的重点,就在于barButtonItemIndexAtPoint的实现。一个比较简单的实现就是,

CGFloat itemWidth = self.view.frame.size.width / self.items.count;
NSInteger index = point.x / itemWidth;

					

给技术员工的建议:从0到1,赚取第一桶金与提高财商

发家致富是每一个人的梦想,然而,在诸多书籍,网络报道中,发家致富的方法虽然介绍了很多,唯独没有人愿意好好说说他/她是如何赚取第一桶金的,这也就导致了大部分人只知道成功以后的成功学(即从1到100的过程),而对于第一桶金(从0到1,从无到有)的过程几乎毫不了解。

From Zero to One

From Zero to One 本图来源于互联网

对于从无到有的过程,大家只是知道靠工资是不行的,但是靠什么行,却没有一个标准答案。谢百三教授的一篇博客 扛钱扛到肩膀红,倒是转述了一位投资人士的从0到1的过程。从这位成功人士的过程中,我们不难看到,他和很多平庸人士的区别:

  1. 80年代去深圳,工资一个月500元人民币,当时内地很多人一个月才50,他的工资是大多数人的10倍
  2. 业余时间帮香港人打工,三天三夜换来了1万3千多元人民币,三天挣了两年的工资。
  3. 80年代末开始做股票,到了93年,几万元做到二十几万,笔者认为,这完成了从0到1的过程

总结下来,我们不难发现,从0到1的过程中,你必须要有以下特点 1 工资比普通人高很多 2 要有赚取超额收益的机会 3 要有突然爆发的过程

最近十多年,很多互联网人士其实也有类似的过程

  1. 2000年大多数人一个月两三千的时候,他们一个月最低1万(工资比普通人高)
  2. 公司发展好了,常常发好几个月甚至十几个月工资(赚取超额收益)
  3. 股份均沾,IPO后大部分人最低也有几百万收益(突然爆发)
  4. 赶上北京房地产的增值,家庭普遍都有两套房产,最普通的到今天都值1000万。(时代机遇,完成了从0到1的过程)

到了今天,以上情况有一些发生了变化,例如,北京的房子已经很贵了,便宜的房子那都在过去,一些公司IPO后发生了员工的股权值不了几万元的离奇的事情,那么,当今我们该如何行动呢?如何再一次从0到1呢?

首先,我们必须努力工作,实现1 比普通人工资高很多 2 公司发展好了,奖金多,这一点是毫无疑义的。

其次,提高财商,不要仅仅满足于当一个技术专家,同时也要成为一个宏观经济学家,一个财务家,在选择公司的时候全面考虑,最终选择一家处于爆发前夜的公司,快速实现突然爆发的收益。

第三,省吃俭用,即便有了百万年薪,也不要享乐,不要买豪华车,不要买贵的包,不要买东西不看价钱,尽可能省下每一分每一厘。有一篇博文我建议大家读读 給八年級的建議:晚10年買車,晚5年買名牌包,改變你下半生,里面有句话特别摘录出来,供大家参考“你所看到的「美好生活」,是在金字塔頂端的人過的,以台灣大部分人民都是受薪階級來看,絕大部分面臨各行各業薪資未調、甚至倒退的情況。在全球化浪潮和M化的社會裡,還有我們不知道的社會弱勢,每天都為下一頓發愁。”如果你不是二代,不是家里特有钱,你要记住,你的每一分工资,都是你从0到1的本金,不要轻易的过优渥的生活而花掉,而二代他们已经完成了从0到1,要继续从1到无穷大,自然在吃穿用度上可以有品位。所以,如果你不省吃俭用,而想要享受生活,二十年后你就会发现,你的下一代依然没有积蓄,依然要重复你的为生存而打工的生活。

第四,反思你过往对待钱的态度,我相信很多人都有这种想法,现在真的是物价高,每个月存不下钱,而如果你问他们是不是太浪费,我又相信很多人说:“不,我很节约的,但是就是不知道钱花到哪里去了”。这其实是一个矛盾,作为中华民族的传人,我们内心中都很节约,可是,媒体上充斥的是大量人叫嚣物价高,就算年薪50万都存不下钱。问题出在哪里了呢?我认为,问题出在人们没有正确对待自己的钱,同时没有克服自己的弱点,反而把一切存不下钱的愤怒发泄到房价高上。

要知道你有没有认真对待你的钱,请大家按照以下列表检视自己:

  1. 你是否记账,是否按照权责发生制进行记账
  2. 记账后,你是否时不时根据过往的消费记录对自己的消费进行反思,想想哪些消费是可以省下的,哪些消费是完全多余的
  3. 是否为自己每年的消费做预算
  4. 你存下的钱是存活期,定期,还是进一步的投资了?你是否对自己的余钱花费了足够精力
  5. 你的花费,有多少是为自己而花,有多少是为家人而花,有多少为了朋友而花,如果预算不够了,你如何取舍?我相信如果你没有做预算的话,很容易尽量为自己而花钱,缩减其他的花费
  6. 你是否充分利用了金融工具,具体点来说就是买房贷款是不是贷30年,贷款额尽可能多。
  7. 你是否对信用卡有正确的认识,如果你要么把信用卡当做洪水猛兽,坚决抵制,要么把信用卡当成不需要还或者很久以后才需要还的现金,那么你对信用卡的认识很肤浅,你亟需提高你的财商。还记得1中我提到你是否按照权责发生制记账了吗?如果你按照现金收复制记账,这也是现阶段大多数没有会计知识的家庭记账的方式,你基本上不可能超越前面我提到的两种极端的看待信用卡的认识。