隐贞Blog


  • 首页

  • 技术栈

  • 风雨日记

  • 如果可以酿成一首诗

  • 归档

  • 标签

工作5年自我探讨

发表于 2020-09-27 | 分类于 工作日记 |

​ 在公司呆了一年多,抱着与世无争地姿态浑浑噩噩地为自己一亩三分地精细打理。领着微薄的工资、做着技术含量不高的活,时时刻刻得谨言慎行。

​ 当初手上拿了4、5个offer,每个都要比现在的高不少。因为对国际旅行帮带这一新领域的向往,便毅然决然来到了当前公司。不过没想到受到疫情的冲击,国际客运航班几乎没有来往,导致我们的业务线不能正常发展。于是乎,2020年的上半年我们工作开始转移到了国内,做溯源直播电商。

​ 技术团队内一开始就对直播电商没有好感,直到如今也是这样。毕竟,电商平台如今那么多,各家直播平台也各有大腿,除开一些带货大咖普通带货主出货量并不高。鉴于于此,在质疑与纠正的排异中老板艰难地前进。

​ 于是乎,09月25日被老板叫到了办公室训话。等不来国庆的中秋月饼,意外飞来了老板的苛责。不过也算是大家敞开了话,在某些方面自己确实做的不对。给老板的限制太高,老板现在认为只要是他的言论,我不是针对事情的本身而是针对他进行批判,并且我个人有比较消极的言论以及拒绝态度。某种方向上貌似确实展露如此,我个人也是嘴臭比较自我为中心,但伤害别人的话我还是说的不多。聊过后,我该端正自己的一些言行了。

​ 我一直期待着能够在规范的公司做规范的事情,并且同事之间能以低交流成本完成高质量、高效率工作。奈何这是创业公司,没有任何的规范可言,大家工作效率普遍低下。个人想提高整体劳动价值的想法被其他人生生打压,即使是有一些建议也被涉及方排斥。

​ 就好比今天,因为要做优惠口令我早上查看了一下设计图,估摸了具体流程。等到中午阿金(后端开发)过来上班后,询问他做的进度并且表明了自己已经做完等他接口。然后他随口一句,”不就加一个输入框而已“。我就开始和他分析我这边要做的以及他那边要做的东西,事实上他的编程经验太少、项目经验不足、没有优秀的指导员,我能容忍他做的效率低品质低,但我不能容忍他把我工作也理解为和他做的一样。大概是和他拿到的剧本不一样,然后目瞪着我说:”我是替你打工,还是替老板打工!!!!“。他说完这句话我就诧异了,也是产生这篇文章的原因,我为什么要留在这样的环境中?

​ 经历过几次的人事变迁,公司的倒闭、拖欠工资、失诺的奖金、同事之间的官僚,我体会过职场上的失意,以及每次找工作的失落。我不知道自己要往哪走,不是自己没有选择权,而是为自己感到害怕。害怕自己没有归宿,也安然于此,我没有敲名企的金砖,现在能力也止步不前,虽然一直在学习但那又如何?不过最让我害怕的还是自己没有为人处世之法,也是一路过来冲撞过家人、同学、朋友、老师、领导、同事。

​ 有些东西不改变,去到哪都一样。我还是多学习语言沟通方法吧,这方面确实感觉情商过低。几年前朋友来沪看我,送了本《沟通圣经》,是时候拿起来了。这么多年还像一个刚毕业的新生,也是不成熟。

PS:
  1. 没想到事隔这么些年,blog 的指令还能敲出来。好厉害啊~~
  2. 也是好久没写日记了。

iOS 正确嵌套 WKWebView 的 TableView 方式之一

发表于 2018-08-07 | 分类于 技术栈 |
  • 此文读者:iOS 开发者
  • 此文深度:粗浅
  • 此文目的:解决 TableView 嵌套 WKWebView 高度问题
  • 环境配置:Xcode10.0 & macOS10.13.6 & 弱网环境

前言

项目做多了,难免会有些需要和富文本打交道地方。展示一个富文本可以使用多种技术方案,不过多个方案之间各有自己的特性,这就需要开发人员进行技术的筛选。因本司编辑员常用网页样式,故而一些长篇的图文当中就需要 WebView 作为容器进行展示了。

如果展示是单纯的H5介绍页,使用一个纯 WebView 进行展示是非常合适的。不过当展示界面混合了 Native 控件,事情就变得不太容易起来。通常这样的页面同新闻的详情页一样,一个 TableView 中嵌套了包含 WebView 的 Cell 或 TableHeaderView,且要求整个 TableView 滑动起来自然 & 连贯。

  • 连贯,即要求 TableView 整体内容不能有截断,所以 TableView 中的各个部分要求自适应其高度;
  • 自然,即要求 TableView 在滑动的时候内容随着操作手势明确地上下滚动 不能出现掉帧、卡顿现象,所以 耗时操作 & 响应事件 就需要格外关注;
  • 轻巧,即要求 实现方式较为简便,便于其他开发者的维护;

准备

我们需要创建一个类似新闻详情页的Demo:

  • 主页头部展示 HTML ,宽度与屏幕宽度一致,高度随内容需要完全展开;
  • 尾部是推荐文章的单元,点击该单元可以切换头部的内容,就像下图一样。

其详情页的层级如下:(已上传到GitHub,为了便于方案演变,本人随开发做了 commit 记录,读者可根据个人需求在各个 commit 版本中切换)

  • TableView
    • WebCell:用于 HTML 展示;
    • SectionCell:用于 模块标题 展示;
    • ArticleCell:用于 推荐单元 展示;
  • ToolView
    • 手势点击事件

基础版:

类型:纯文本

参考:《人间失格》单元

详情页展示的是纯文本,我们仅需在 WebViw 代理webView(_, didFinish)方法通过执行document.body.scrollHeight JS代码注入获取文档高度,再将高度反馈给 TableView 进行刷新即可,该高度即为文档渲染的正确高度。

1
2
3
4
5
6
7
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
// 获取 HTML 文档高度
webView.evaluateJavaScript("document.body.scrollHeight") { (heightValue, error) in
guard let height = heightValue as? CGFloat else { return }
self.heightAction?(height)
}
}

请参考Demo中「基础版」commit 节点。

观察者模式:

类型:少量图文混排

参考:《迟暮》单元

当详情页展示的是少量的图文混排后,因为图片的加载是一件耗时操作的事情,我们通常将其设定为懒加载模式,当页面内的资源加载完毕后我们再获取其高度,才为正确的文档高度。所以在webView(_, didFinish)里获取其高度也不是准确的,该代理方法是 WebView 载入 HTML 文档完成后的回调,并不等于该 HTML 完全渲染完后的回调。

  1. contentSize 方法

根据以上判断,我们需要捕捉 HTML 渲染变化的信号。而 HTML 渲染动作直接影响到的是 WebView scrollView.contentSize 属性,每当该值发生变化代表的是当前 HTML文档 已渲染到的位置。

我们可以使用观察者模式来监听这个属性的变化,当该属性发生变化时我们需要及时调整容器的高度并将其反映给 TableView 进行刷新。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fileprivate lazy var webView: WKWebView = {
let config = WKWebViewConfiguration()
let web = WKWebView(frame: CGRect(x: 0, y: 0, width: contentView.bounds.width, height: 100), configuration: config)
web.navigationDelegate = self
web.scrollView.isScrollEnabled = false
web.translatesAutoresizingMaskIntoConstraints = false
// 添加观察者监听 scrollView.contentSize 属性
web.addObserver(self, forKeyPath: "scrollView.contentSize", options: .new, context: nil)
return web
}()

/// 监听 scrollView.contentSize 属性
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "scrollView.contentSize", let newSize = change?[.newKey] as? CGSize {
print("new size: \(newSize)")
self.heightAction?(newSize.height)
}
}

deinit {
webView.stopLoading()
webView.removeObserver(self, forKeyPath: "scrollView.contentSize")
}
  1. loading 方法

同 contentSize 一样,我们也可以使用更高效的 loading 来进行监控,该属性用于表达 WebView 的加载状态, Apple 文档中对 isLoading 属性的描述如下:

A Boolean value indicating whether the view is currently loading content.

@discussion @link WKWebView @/link is key-value observing (KVO) compliant for this property.

修改后的代码,如下:

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
fileprivate lazy var webView: WKWebView = {
let config = WKWebViewConfiguration()
let web = WKWebView(frame: CGRect(x: 0, y: 0, width: contentView.bounds.width, height: 100), configuration: config)
web.navigationDelegate = self
web.scrollView.isScrollEnabled = false
web.translatesAutoresizingMaskIntoConstraints = false
// 监听 webView 加载的动作
web.addObserver(self, forKeyPath: "loading", options: .new, context: nil)
return web
}()

/// 监听 scrollView.contentSize & loading
override func observeValue(forKeyPath keyPath: String?,
of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {

if keyPath == "loading"{
webView.evaluateJavaScript("document.body.scrollHeight")
{ (heightValue, error) in
guard let height = heightValue as? CGFloat else { return }
print("Web loading Height: \(height)")
self.heightAction?(height)
}
}
}

deinit {
webView.stopLoading()
webView.removeObserver(self, forKeyPath: "loading")
}

通过打印这两个观察者属性的调用动作,可以发现 contentSize 比 loading 调用的次数多,且在滚动 TableView 的时候 contentSize 是随即更新无论是否真有变化,而 loading 自加载完成后不再调用,两者计算的高度值一样。

如果使用观察者模式的话,建议选用 loading 模式:

其一 监听加载的动作更符合渲染状态发生这一事实;

其二 如果被认定为已加载完成 contentSize 就不会再变,无需持续观察。

虽然网络稍好的时候用以上方法均可以实现获取文档的正确高度,但一旦网络极差的情况下上面的方式都失效了。

请参考Demo中「观察者模式」commit 节点。

* JS 监听:

记得上周五下班回家在地铁上开开心心等待第二天的 ChinaJoy,拿起小手机看看资讯消息,然后一条老板的微信消息@me,老板给我截了图~某详情页展示不全。虽然对这个问题熟悉得不能再熟悉也清楚要做什么,但还是为之一怔,因为和老板交流的不多(有时候他看着我,但目光已经透过了我到达后面的同事),为了不打破被老板忽略的角落形象,决定好好想想策略。

类型:大量图文混排

参考:《它们一边鄙视,一边用自己的方式照顾我们》单元

经过了之前的技术探索,觉得从 WebView 中找到监察 HTML 页面渲染完成的状态并不可靠,如果 HTML能够主动发送消息给我就好了。

按照这种想法,搜索了 「HTML 加载完成事件、HTML 图片懒加载完成事件……」,最终查到,在 HTML DOM 中 Event 有个函数 onload 是用于一张页面或一幅图像完成加载时所执行的,我们需要监听所有的 img标签 或 body标签,然后在这个方法里发个消息给 WebKit 然后进行拦截即可。

接下来我们要做两件事:

  1. 在 WebView 里注册一个方法,用以接收 HTML DOM 的事件;
  2. 在 HTML 里补充 JS 脚本,用以发送消息给 WebView ;
1. 在 WebView 里注册一个方法
  1. 配置 WKWebViewConfiguration ,为其注册一个 ScriptMessageHandler ;
  2. 实现 WKScriptMessageHandler 代理方法,拦截 你所注册的 ScriptMessageHandler;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
fileprivate lazy var webView: WKWebView = {
let config = WKWebViewConfiguration()
config.preferences.javaScriptEnabled = true
// 在此注册 JS 发送对象的函数名
config.userContentController.add(self, name: "imagLoaded")
let web = WKWebView(frame: CGRect(x: 0, y: 0, width: contentView.bounds.width, height: 100), configuration: config)
web.navigationDelegate = self
web.scrollView.isScrollEnabled = false
web.translatesAutoresizingMaskIntoConstraints = false
return web
}()


func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "imagLoaded", let height = message.body as? CGFloat {
heightAction?(height)
}
}
2. 添加以下 JS 代码在 \</ body> 标签之后
  1. 使用 document.getElementsByTagName('img') 会获取 DOM 目录下所有的 img 标签;
  2. 使用 window.webkit.messageHandlers.<你所注册的方法名>.postMessage('数据消息') 给 webkit 发送消息;
1
2
3
4
5
6
7
8
9
10
11
<script type="text/javascript">

let imgArr = document.getElementsByTagName('img');
for (var i = 0; i <= imgArr.length - 1; i++) {
(imgArr[i]).onload = function() { // 加载完成后给 webkit 发送通知
let height = document.body.scrollHeight;
window.webkit.messageHandlers.imagLoaded.postMessage(height);
}
}

</script>

本文仅作为实际工程的应用,不涉及任何知识体系,想了解更多,请查看 WebKit 的开源代码 ╮(╯_╰)╭。

iOS制作依赖Cocoapods且OC与Swift混编的framework

发表于 2017-10-06 | 分类于 技术栈 |

缘由

刚进公司,翻看以前的工程项目,项目没有按照一定的组织计划和标准进行构建。并且,直接在项目上进行重构会有很大的阻力和风险。领导层也知道相关问题的存在,如果项目还是以现在的方式继续进行代码堆叠,势必将来会更加难以接手和维护,所以重新进行两个工程项目的重写得到支持。

风险

虽然已经确定对两个项目进行重写,但是业务方面也停下来是挺危险的一件事情,毕竟我们是因为架构的优化而重新写了一遍。我原计划的是,自己先编写基础公共的模块,其他两位开发人员继续业务代码上的开发。等到我这边工作完成的时候,他们可以很快切入进来,并且也不耽误现有的需求计划。不过鉴于领导层的鼎力支持,好吧~项目的优化成为了当前工作的重中之重,然后自己作为实践人,肩上也少不了压力。

思路

因为两个项目只是同一款应用做 iPhone 和 iPad 版的区分,业务大体上相同。所以萌生了制作基础公共库的想法。然后两个版本分别依赖这个基础库,就可以免了相关模块的重复开发和维护。又鉴于该库还依赖于一些三方的支持,所以在此基础上添加了Cocoapods的依赖包管理。当时设计的方案是:framework、 一样作为独立的project添加到 workspace 中去,不过由于多个工程之间的版本管理方案没有达到合理的程度,所以作罢。

合理的版本管理方案:

要求:每个工程之间应该是独立的;

问题:

  • 通常我们是在每个工程目录的文件夹下为创建 Git 管理,正常的逻辑是一个workspace包含 framework、iPhone、iPad、cocoapods,然后每个 project 都包含一个git管理,所以我们应不应该为了workspace这个总目录来创建一个新的git仓库?亦或者将workspace这个工作台放在其中的某个project中?
  • 如果创建一个版本控制去单独维护 workspace 的话,那么此刻这个git仓库将会包含所有 project 项目上的改动,将会重复。
  • 如果只配置一个总git仓库,那么其它 project 不免失去了独立性的意义。

也因为创建不同 project 没能协调好 cocoapods 引入导致的一些问题,所以采取了另外一种方案,那就是创建多个target而不是project,这样保持了一个project意义的完整性。

方法

公司切换到 swift 的开发洪流当中,首先我们新创一个 swift 语言的 project:因为是制作 framework 为目的,所以选择iOS平台下的Cocoa Touch Framework 框架,然后依次填写工程的相关信息,最后生成该project。
创建新的 Target —— iPhone 和 iPad,并为其添加本地创建的依赖库支持;
最后为工程配置cocoapods:终端进入project目录,键入pod init来生成 podfile 文件,打开 podfile 文件输入自己需要的依赖库,因为标题是OC与Swift 混编,所以也引入两个不同的开发语言,看出现什么意外的效果;
配置好 Cocoapods 之后,我们来为自己创建的 frame 添加相关的代码吧。首先打开工程的 workspace,在 自己创建的 framework 中创建 OC 类,然后编写相应的实例方法,并在工程的头文件中导入需要暴露给其它 targetd的OC头文件(swift文件可以忽略这步),最后对该framework进行编译,在你需要的 target 中导入 framework 即可使用。

很多坑

也许你以为跟着这些步骤就好了,其实还有不少坑。

比如你在 framework 中写OC与swift混编的东西,就得多注意这两者语言的特性了。

  1. OC 调用 swift 的属性:你得将 swift 中的属性用 @objc 声明为对象,并且赋予 open 权限;
  2. 关于 swift4.0 的 json 转换对象特性: Codable协议,如果你是打算在 OC 中直接使用 swift 的 Json 编解码特性的话,找到了方法一定要告诉我。我查了下关于这部分的内容,OC语言并没有这方面的文档资料,所以它们之间并不互相直接支持,你得编写个 swift 模型的编解码包装,然后暴露给 OC 使用;
  3. 很多 swift 过于强大的新特性,你不能在 OC 中使用 enum、struct 中的方法、协议,不能使用元组 等等。

初次编写技术文,如果写的不对就是误人子弟了。所以有遇到问题、纠正或建议的希望能和我联系,不胜感激。

ReactiveSwift的中文翻译

发表于 2017-03-15 | 分类于 技术栈 |

项目开源

从学习编程以来,很羡慕为开源社区做工作的那些科技者。很多时候自己也想拥有开源项目,不过在编程遇到的问题很多都有完善的解决方案了,所以也不想在旧有的问题上再插上一脚~

这次因为想要深入学习,所以看了关于『响应式编程』的概念,然后对ReactiveSwift的框架产生了兴趣。虽然英文文档能看懂,不过本着如果有相关的详细中文介绍那就更好了。所以搜索了下中文方面的相关资料,这方面还是挺少的~所以趁此机会建了个开源项目,邀请好友一同来完成。不过,翻译这事对于技术类的要求也不低,很多专业术语是需要对应的,还有一些奇怪的用词。

例如:stream of value over time , 这句话断的位置点不一样很奇怪的效果就会出现,概意是随时间而变化的数据流 ,但是这么这样翻译就很变扭了,查找专业术语也没匹配上这句话的含义,所以有些词也得自己造了~于是想翻译成 泛时数据流,意思是数据在时间里流动。还是希望能够有同学能够帮忙校对下,毕竟这类文章真的需要正确。

在此感谢小伙伴小侯帮忙负责Signal模块的翻译工作。小侯是一名还在上学的研究生,平常对技术也是十分热心,对周围人也真诚、关心。当我寻求周围朋友的帮助时,他毫不犹豫地奉献给了这个项目。

当前我负责序言模块,尽量在每句话上都锱铢必较了。受于知识和能力的限制还有不少语不达意的地方,看到的朋友就告知下,在此感激不敬。

联系方式:

  • QQ: 493246157
  • Email: zohar_zeng@163.com
  • Github: https://github.com/YinZhenJob/ReactiveSwift_Chinese_Guide

Blog诞生日

发表于 2017-02-17 | 分类于 风雨日记 |

缘起

自从小时候接触互联网,就一直希望拥有自己的个人主站。然而时间过去了那么久,曾经的愿望也忘得一干二净,忽然的前几天又萌生出建站的念头。于是乎,搜索教程、购买域名、搭建网站、部署服务,虽然作为新手有很多地方磕磕碰碰,但这也是Geek的乐趣之一吧~

大学毕业之前一直都有写些文学相关的东西、心灵的笔录,在别人言语之间多以文艺青年形象自居。然而毕业之后,话语越来越少,逐渐沉默转而变成一个IT编程奋斗男。工作的压力是往常北漂人民所能感受到的,在要求自立自强自学的同时似乎每日的时间都被挤弄得一滴不剩。趁着在离职公司的这段时间好好自我省视,也把相关的技能补充加强,规划将来的方向。

兴趣

兴趣爱好之多,以至于我好像没有不感兴趣的。现在能做到保持有的兴趣主要有:科技、手工、烹饪、旅游、动漫、音乐、歌剧、文学、RPG,我几乎都想要在以上领域有所交叉接触。

不过现在方向是往科技偏移,毕竟科技能够明显推动对社会的进步。虽然还不是领跑科技界的人,不过相关知识和经验的积累,对于我这种处于平凡的生活环境中的人是必不可少的过程。

都毕业了 秘密还是秘密

发表于 2015-06-28 |

​ 今晚夜是晴空,几日前的雾气散去。直至此刻,参加了许许多多的聚会,却始终没能和每一个见过的朋友说声“再见”。

小部员发来张信哲的歌曲《信仰》,原先没心没肺的我现在也五味杂陈,而且夜晚的夜总是显得那么孤寂。说感谢的话俗可泛滥,而不言真是我浑身上下的歉意、遗憾和浑蛋。很多心底事累堆放在了珍珠贝里,用自己的胆汁、泪水包裹着,虽然日复一日逐渐圆润,没有当初刺痛自己的那种感觉,却将包裹的事物越积越深,越养越大,一个房间只留下一个小小的地方给自己,像秘密那样,挥不去,打不开。

喜欢映衬不到眼瞳里存在的影子,
等待没有张开怀里微醺的温度,
靠近却又做出相反的步调,
秘密了,还是秘密。

毕业,知不知足:
把记录烦恼的课本埋葬;
清空躺了多年的被窝;
捐赠淘来的折叠桌;
捐赠磕碰的滑板;
捐赠捡来的自行车;
藏好送别你的礼物;
剪去刚及肩膀的小马扎;
把一柜子的衣物折叠,寄回遥远的家;

要出发了, 那些我告别和来不及告别的人;

谢谢二楼西七号的炸酱面,三楼西的臊子面、朝鲜冷面和一号窗口的菜食,百来人的澡堂;
再见,我喜欢的你。

三月的霾

发表于 2015-03-29 | 分类于 风雨日记 |

三月底的天,灰霾霾的。远方翻滚的黄尘在天空之际往下弥漫,午后的暖日成了片状的白光。歇斯底里地来到拥挤的教室格局,三月的霾是一个粗暴的强盗。

昨日去参加“开源大会”,在大会上无意一瞥发现许久不见的“猴子”和“胖子”,在讶异和欣喜之时走了过去,不得不说一些因缘是解不开的结。当然我不知道是什么样的巧合会在另外一个城市遇到相熟的故人,走在城市的任何地方都不会遇到一样的你们。大学的日子对我来说已经是半剩不剩,常常有人感慨大学的时光是多麽美好,让人留恋不舍。也许我的大学活得不够拼劲,青春的张力没有把我带向理想的高堂,梦想不过成了我拿来糊弄别人感觉的“单纯”。

每次一些事情失败之后,总想离开这已经熟悉再不能熟悉的环境,总以为离开重新开始才是最好的办法。烂摊子什么的自己不想要了,但是命运像根缚着身体的操线,我离不开控制我活动的这根线。于是,那些人和事都因为时间而合适地发生了。沉浸在自己的世界太久,是自己给自己造的牢笼。我从小就一直在寻找或制造有别与他人的奇特特点,总觉得独一无二的自己是世界上最珍贵的,也许由于这种想法造成了以后异样的行动和思维。当初熟不知道,一个独特的人在一个平衡的世界是那么格格不入,自己所想的世界只能自己一步步去造,许诺的理想越美好,要挣扎的世界也就越血淋漓。也不知是什么在召唤,最近在熟睡的时候总能感受着一些生命的流逝,感受万物的命运,感受别人从活到死的瞬息。人最无力的是千钧一发时抓不准时机,在力挽狂澜时手无缚鸡之力。受够了……三月的霾,是给自己的毒,最爱的是将自己沉醉在无奈的命运。

从天白到天黑,路程遥遥,我不能阻止白天变黑夜,我更不能阻止自己在凌晨两点前就睡着 ,而只能早点起床,在要过去的一天里汲取能够让自己能够千钧一发、力挽狂澜时该有的本领。所以一个人走着,一个人吃饭,一个人在练习,不要问我为什么又是一个人,因为一个人最容易做到自己想做的事。我除了幻想,也该活得像要奋斗的人一样。霾留给其他人的毒

与考试无关的夜晚

发表于 2014-01-15 | 分类于 如果可以酿成一首诗 |

离别的风 憔悴的夜色
光秃秃的树干 时光捻过的颜容
走过的石板 没有留下的脚印

路过的水果铺 逐渐散去的灯光
遇不上的人 奇怪的人
上链的门口 没有人的值班室
悄悄地 翻过篱笆

感冒的暖气 坚硬的绿花床
落下的玻璃杯 破碎的祝福
一些些的情绪 一些些的道理
讲给自己听

风语消消黑人墓

发表于 2013-06-10 | 分类于 如果可以酿成一首诗 |

一些音乐静静的
像下着小雨那样
小到撑伞也不是,不撑也不是
就这样微妙着
一阵阵阴云下的凉风
今天是那么惬意地吹着
音乐像小雨,在这风动的天气一直下着
记录是种回忆,却来不及保存,消失不见

也许,忘怀

删掉如若是彻底的
是否已安然
再见如果是种可能,是否打个照面而过
歌颂也已停止,
心已坦荡,一种相识,不过半年
美好的不美好
忘掉忘不掉的
走去没走过的

谢谢你 ,两季没闲过的日月

今年的大四一条街

发表于 2013-06-03 | 分类于 风雨日记 |

学校大四一条街卖着些书,生活品,和配件类物品。也许是有点商人的资质,就打算去瞎逛着,砍砍价,当做是种乐趣。

于是~

昨天差点忽悠成功一哥们买个滑板陪我玩,今天我再次带上另外一人,打算买点专业书籍(学校订的书贵)类的,首家一帅哥,起价100元,我唠叨了大半天80底盘,我本着60元处理,帅哥委屈状 :“你怎么不尊重一下市场规律,现在才摆摊没几天,你怎么能这样随随便便就砍价这么厉害,好歹也要过几天啊~(过几天这价就对不起我自己了)”。于是就作离开状~居然还真不肯往下掉价(好吧,我就先去其他家逛逛);

第二家一气质美女,起价130元(全新包括各种笔记和大四书籍),也唠叨了半天100元底盘,此刻见书不错本着80元处理的,再做离开状 ,唉~现在的学姐要求太高了,现在卖得那么贵到时候也得几毛钱论斤卖的份都有;

然后到了第三家我就说了,你看你隔壁那家帅哥卖给我80元我还嫌贵了,你们就不能往下降了么?然后学姐就说了:“我们都统一商量好了,一律卖130,你说的是隔壁那家么?(指了指)你看我都卖了好几套了,你看用我的书没错,又有笔记,书还很新,关键是我都有得奖学金,用了我的你也能一样的~(可是我能说之前那几家也是这么向我推销的么?)那我给你看看我的成绩单吧~”本着不甘心~,打算这几天都出来遛弯,看看有什么新的内容,转身呆在一旁思考状。那学姐就不讲究了,很不淡定地去到了隔壁摊那家帅哥店里,作教育状:“你怎么能这么不讲究呢?卖的书旧了点也就算了,转手几次也就算了,你还80元卖出去,有你这样的么!(学姐教育的是啊~)”接着:“我们不是都说好统一卖130元的么!(晕,这么回事啊)”你们这样也不尊重市场规律啊!而且是垄断价格的啊!好吧,我还是过几天再出来瞧瞧了。

回想一下去年,路见一大妈走到一学姐前买蚊帐,问几元,学姐伸出了五个手指头!大妈果断往摊上扔下五毛钱飞快的跑了,留下凌乱的学姐。然后再发生什么有趣的事呢,后载吧。

12
隐贞

隐贞

南方二月明媚天~如果心情是有颜色的,那么一定是春草发芽的嫩绿色。关注iOS领域,正打算往游戏、动漫方向发展。

14 日志
4 分类
17 标签
RSS
GitHub Wechat Email
© 2020 隐贞
由 Hexo 强力驱动
主题 - NexT.Mist
博客共8.6k字