首页
复制
搜索
前进
后退
重载网页
和我当邻居
给我留言吧
首页
统计
关于
WOW怀旧
友链
更多
留言
壁纸
直播
Search
1
关于《杀死那个石家庄人》背后的故事
3,799 阅读
2
沈阳故宫之旅
609 阅读
3
摄影记录|鸿恩寺
562 阅读
4
赤壁赋| 知不可乎骤得,托遗响于悲风
423 阅读
5
Laravel-admin 删除行|删除回调
366 阅读
编程技术
GoLang
Vue
PHP
Linux
Redis
网络安全
生活杂记
登录
Search
标签搜索
PHP
随笔
Mysql
Laravel-Admin
Laravel
摄影
设计模式
Ab
Linux
Javascript
MAC
支付
CentOs
sh
嘉陵江
南滨路
蓝易云
redis
万能青年
累计撰写
60
篇文章
累计收到
145
条评论
首页
栏目
编程技术
GoLang
Vue
PHP
Linux
Redis
网络安全
生活杂记
页面
统计
关于
WOW怀旧
友链
留言
壁纸
直播
搜索到
60
篇与
的结果
2022-03-06
PHP函数eval:一句话木马
前景1.在一个系统文件上传逻辑处理不严谨时2.php危险函数未禁用我是谁含义: eval — 把字符串作为PHP代码执行警告 函数eval()语言结构是 非常危险的,因为它允许执行任意 PHP 代码。它这样用是很危险的。如果您仔细的确认过,除了使用此结构以外 别无方法,请多加注意, 不要允许传入任何由用户 提供的、未经完整验证过的数据文件上传漏洞首先这里我用docker搭建了一个简单的bWAPP 实验环境文件上传漏洞是什么?关键词:绕过 文件上传(File Upload)是大部分应用都具备的功能, 例如用户上传附件、改头像、分享图片等 文件上传漏洞是开发者没有做充足验证(包括前端、后端)的情况下,允许用户上传恶意文件,这里上传的文件可以是木马、病毒、恶意脚本或者webshell等这里我编写了一个php文件并上传到了这个实验环境<?php @eval($_POST['hack']); ?>这里通过点击我们轻松访问到了上传的文件,并发现后端并没有去检测处理这个文件这个时候我们就可以通过curl去访问这个文件,由于之前写入的是POST请求,所以我们这里入参也是通过POST的形式get_current_user() 函数返回当前 PHP 脚本所有者名称。getcwd() 函数取得当前工作目录{message type="info" content="所以,在渗透过程中,如果系统逻辑性不是很严谨,我们可以通过这种方式来进行网络渗透,获取对方数据信息。当然,在我们的日常开发中,也是需要规避此类风险的。"/}
2022年03月06日
277 阅读
0 评论
1 点赞
2022-03-06
PHP八大设计模式
单例模式{callout color="#f0ad4e"}$_instance必须声明为静态的私有变量构造函数和析构函数必须声明为私有,防止外部程序new 类从而失去单例模式的意义getInstance()方法必须设置为公有的,必须调用此方法 以返回实例的一个引用::操作符只能访问静态变量和静态函数new对象都会消耗内存使用场景:最常用的地方是数据库连接。使用单例模式生成一个对象后, 该对象可以被其它众多对象所使用。私有的__clone()方法防止克隆对象单例模式,使某个类的对象仅允许创建一个。构造函数private修饰,申明一个static getInstance方法,在该方法里创建该对象的实例。如果该实例已经存在,则不创建。比如只需要创建一个数据库连接。{/callout}{message type="info" content="示例"/}<?php namespace App\Http\Controllers\Admin; use Lcobucci\JWT\Builder; use Lcobucci\JWT\Parser; use Lcobucci\JWT\Signer\Hmac\Sha256; use Lcobucci\JWT\ValidationData; class JwtAuth { private $token; private $user_id; private $secrect="#awadakvcabzijvjvsuvr"; private $aud="www.test.com"; private $iss="www.test.com"; private $decodeToken; /** * JTW句柄 * @var */ private static $instance; public static function getInstance(){ if (is_null(self::$instance)){ self::$instance =new self(); } return self::$instance; } private function __construct() { } private function __clone(){ } public function getToken(){ return (string)$this->token; } public function setToken($token){ $this->token = $token; return $this; } public function setUid($user_id){ $this->user_id =$user_id; return $this; } public function encode(){ $time= time(); $this->token = (new Builder()) ->setHeader('alg','HS256') ->setIssuer($this->iss) ->setAudience($this->aud) ->setIssuedAt($time) ->setExpiration($time+3600) ->set('user_id',$this->user_id) ->sign(new Sha256(), $this->secrect) ->getToken(); return $this; } /** * @return \Lcobucci\JWT\Token */ public function decode(){ if (!$this->decodeToken){ $this->decodeToken = (new Parser())->parse((string)$this->token); $this->user_id = $this->decodeToken->getClaim('user_id'); } return $this->decodeToken; } /** * @return bool */ public function validate(){ $data = new ValidationData(); $data->setIssuer($this->iss); $data->setAudience($this->aud); return $this->decode()->validate($data); } /** * @return bool */ public function verify(){ $result = $this->decode()->verify(new Sha256() , $this->secrect); return $result; } public function getUid(){ return (new Parser())->parse((string)$this->token)->getClaim('user_id'); } }{message type="info" content="调用"/}$jwtAuth = JwtAuth::getInstance(); $token = $jwtAuth->setUid($id)->encode()->getToken();工厂模式{callout color="#f0ad4e"}工厂模式,工厂方法或者类生成对象,而不是在代码中直接new。 使用工厂模式,可以避免当改变某个类的名字或者方法之后,在调用这个类的所有的代码中都修改它的名字或者参数。{/callout}{message type="info" content="示例"/} // 最基本的工厂模式 class Myname{ public function OutPutMyName(){ return 'hello world~'; } } class NameFactory{ public static function Namefunc(){ return new Myname(); } } $obj=NameFactory::Namefunc(); echo $obj->OutPutMyName(); ?> {message type="warning" content="抽象工厂模式"/}{callout color="#f0ad4e"}抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。{/callout}<?php //定义一个抽象类 abstract class operation { protected $_numA = 0; protected $_numB = 0; protected $_result = 0; public function __construct($a, $b) { $this->_numA = $a; $this->_numB = $b; } //抽象方法所有子类必须实现该方法 protected abstract function getResult(); } //加法运算 class operationAdd extends operation { public function getResult() { $this->_result = $this->_numA + $this->_numB; return $this->_result; } } //减法运算 class operationSub extends operation { public function getResult() { $this->_result = $this->_numA - $this->_numB; return $this->_result; } } //乘法运算 class operationMul extends operation { public function getResult() { $this->_result = $this->_numA * $this->_numB; return $this->_result; } } //除法运算 class operationDiv extends operation { public function getResult() { $this->_result = $this->_numA / $this->_numB; return $this->_result; } } //定义工厂类 class operationFactory { //创建保存示例的静态成员变量 private static $obj; //创建实例的静态方法 public static function CreateOperation($type, $a, $b) { switch ($type) { case '+': self::$obj = new operationAdd($a, $b); break; case '-': self::$obj = new operationSub($a, $b); break; case '*': self::$obj = new operationMul($a, $b); break; case '/': self::$obj = new operationDiv($a, $b); break; } //最后返回这个实例 return self::$obj; } } //最后我们使用工厂模式 $obj = operationFactory::CreateOperation('+', 100, 20); echo $obj->getResult(); 如果还是理解不了这两者的区别,可以看看这个帖子: https://www.zhihu.com/question/20367734注册模式{callout color="#f0ad4e"}单例模式保证了一个类中只有一个实例被全局访问,当你有一组全局对象被全局访问时可能就需要用到注册者模式 (registry),它提供了在程序中有条理的存放并管理对象 (object)一种解决方案。一个“注册模式”应该提供get() 和 set()方法来存储和取得对象(用一些属性key)而且也应该提供一个isValid()方法来确定一个给定的属性是否已经设置。 注册模式通过单一的全局的对象来获取对其它对象的引用{/callout}{message type="info" content="示例"/}class Registry { protected static $store = array(); private static $instance; public static function instance() { if(!isset(self::$instance)) { self::$instance = new self(); } return self::$instance; } public function isValid($key) { return array_key_exists($key,Registry::$store); } public function get($key) { if (array_key_exists($key,Registry::$store)) return Registry::$store[$key]; } public function set($key, $obj) { Registry::$store[$key] = $obj; } } //数据库链接类 class ConnectDB { private $host; private $username; private $password; private $conn; public function __construct($host, $username, $password){ $this->host = $host; $this->username = $username; $this->password = $password; } public function getConnect() { return mysql_connect($this->host,$this->username,$this->password); } } $reg = Registry::instance(); $reg->set('db1', new ConnectDB('localhost', 'root', '123456')); $reg->set('db2', new ConnectDB('127.0.0.2', 'test', 'test')); print_r($reg->get('db1')); print_r($reg->get('db2'));{callout color="#f0ad4e"}注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候,直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。{/callout}{message type="info" content="示例"/}class Register { //定义全局属性 protected static $objects; //将对象注册到全局的树上 function set($alias,$object) { //将对象放到树上 self::$objects[$alias]=$object; } static function get($name){ //获取某个注册到树上的对象 return self::$objects[$name]; } function _unset($alias) { //移除某个注册到树上的对象。 unset(self::$objects[$alias]); } }适配器模式(interface){callout color="#f0ad4e"}将各种截然不同的函数接口封装成统一的API。 PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式统一成一致,使不同的数据库操作,统一成一样的API。类似的场景还有cache适配器,可以将memcache,redis,file,apc等不同的缓存函数,统一成一致。 首先定义一个接口(有几个方法,以及相应的参数)。然后,有几种不同的情况,就写几个类实现该接口。将完成相似功能的函数,统一成一致的方法。{/callout}{message type="info" content="示例"/}// 接口 IDatabase <?php namespace IMooc; interface IDatabase { function connect($host, $user, $passwd, $dbname); function query($sql); function close(); }MySQL <?php namespace IMooc\Database; use IMooc\IDatabase; class MySQL implements IDatabase { protected $conn; function connect($host, $user, $passwd, $dbname) { $conn = mysql_connect($host, $user, $passwd); mysql_select_db($dbname, $conn); $this->conn = $conn; } function query($sql) { $res = mysql_query($sql, $this->conn); return $res; } function close() { mysql_close($this->conn); } }PDO <?php namespace IMooc\Database; use IMooc\IDatabase; class PDO implements IDatabase { protected $conn; function connect($host, $user, $passwd, $dbname) { $conn = new \PDO("mysql:host=$host;dbname=$dbname", $user, $passwd); $this->conn = $conn; } function query($sql) { return $this->conn->query($sql); } function close() { unset($this->conn); } }{message type="info" content="示例二"/}/** * 目标角色 */ interface Target { /** * 源类也有的方法1 */ public function sampleMethod1(); /** * 源类没有的方法2 */ public function sampleMethod2(); } /** * 源角色 */ class Adaptee { /** * 源类含有的方法 */ public function sampleMethod1() { echo 'Adaptee sampleMethod1 <br />'; } } /** * 类适配器角色 */ class Adapter extends Adaptee implements Target { /** * 源类中没有sampleMethod2方法,在此补充 */ public function sampleMethod2() { echo 'Adapter sampleMethod2 <br />'; } } class Client { /** * Main program. */ public static function main() { $adapter = new Adapter(); $adapter->sampleMethod1(); $adapter->sampleMethod2(); } }策略模式{callout color="#f0ad4e"}策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境。 eg:假如有一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有的广告位展示不同的广告。在传统的代码中,都是在系统中加入各种if else的判断,硬编码的方式。如果有一天增加了一种用户,就需要改写代码。使用策略模式,如果新增加一种用户类型,只需要增加一种策略就可以。其他所有的地方只需要使用不同的策略就可以。 首先声明策略的接口文件,约定了策略的包含的行为。然后,定义各个具体的策略实现类。{/callout}{message type="info" content="示例"/}UserStrategy.php <?php /* * 声明策略文件的接口,约定策略包含的行为。 */ interface UserStrategy { function showAd(); function showCategory(); }FemaleUser.php <?php require_once 'Loader.php'; class FemaleUser implements UserStrategy { function showAd(){ echo "2016冬季女装"; } function showCategory(){ echo "女装"; } }MaleUser.php <?php require_once 'Loader.php'; class MaleUser implements UserStrategy { function showAd(){ echo "IPhone6s"; } function showCategory(){ echo "电子产品"; } }Page.php//执行文件 <?php require_once 'Loader.php'; class Page { protected $strategy; function index(){ echo "AD"; $this->strategy->showAd(); echo "<br>"; echo "Category"; $this->strategy->showCategory(); echo "<br>"; } function setStrategy(UserStrategy $strategy){ $this->strategy=$strategy; } } $page = new Page(); if(isset($_GET['male'])){ $strategy = new MaleUser(); }else { $strategy = new FemaleUser(); } $page->setStrategy($strategy); $page->index();php策略模式和适配器模式的区别{callout color="#c5d54d"}PHP中策略模式和适配器模式的区别是:策略模式是通过定义算法,并将算法封装起来,使算法独立于客户而独立变化;适配器模式是使用已经存在的类,将其适配成自己需要的形式。{/callout}观察者模式(Observer){callout color="#f0ad4e"}(Observer),首先要有一个被观察的角色,但ta是【唯一的】。虽然"表演者"只有一个但是"观众"有很多,既一群"人"围观一个"人"。既然有无数个观察者,那么我们需要知道都有哪一些"人"。所以我们需要一个“容器”来记录这些"人",一个类似于数组一样来储存所有观察者的容器。一个"演员"(被观察者),一群"观众"(观察者),一台"摄影机"(记录容器){/callout}1.抽象主题(Subject)角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以有任意多个观察者。 抽象主题提供了增加和删除观察者对象的接口。2.抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在观察的主题发生改变时更新自己。3.具体主题(ConcreteSubject)角色:存储相关状态到具体观察者对象,当具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。4.具体观察者(ConcretedObserver)角色:存储一个具体主题对象,存储相关状态,实现抽象观察者角色所要求的更新接口,以使得其自身状态和主题的状态保持一致主题接口interface Subject{ public function register(Observer $observer); public function notify(); }观察者接口interface Observer{ public function watch(); }{message type="info" content="Subject就是被观察者,Observer就是观众,也就是观察者"/}被观察者class Action implements Subject{ public $_observers=array(); public function register(Observer $observer){ $this->_observers[]=$observer; } public function notify(){ foreach ($this->_observers as $observer) { $observer->watch(); } } }{message type="info" content="Action实现了被观察者接口,他现在就是被观察者,再定义一个$_observers数组,他就是记录观众的容器了。首先实现register方法,用它传入一个观察者,然后塞到数组里,再实现notify()方法,它会遍历容器数组,执行每个观察者的watch()方法。"/}观察者class Cat implements Observer{ public function watch(){ echo "Cat watches TV<hr/>"; } } class Dog implements Observer{ public function watch(){ echo "Dog watches TV<hr/>"; } } class People implements Observer{ public function watch(){ echo "People watches TV<hr/>"; } }{message type="info" content="这里定义了三个观察者,全都实现了Observer接口,前面的Subject会循环调用每个观察者的watch()方法,所以我们需要实现每个观察者的watch()方法。"/}调用$action=new Action(); $action->register(new Cat()); $action->register(new People()); $action->register(new Dog()); $action->notify();{message type="info" content="首先new被观察者对象,执行它的register()方法,把每个观察者都放入容器数组,最后执行notify()方法,通知所有观察者执行自己的方法。"/}原型模式{callout color="#f0ad4e"}为了避免创建对象的成本,使用标准方法 new foo() 创建一个原型并克隆它。{/callout}场景大数据量 ( 例如:通过 ORM 模型一次性往数据库插入 1,000,000 条数据 ) 。 {message type="info" content="示例"/}<?php abstract class BookPrototype { /* * @var string */ protected $title; /* * @var string */ protected $category; abstract public function __clone(); public function getTitle(): string { return $this->title; }// getTitle() end public function setTitle($title) { $this->title = $title; }// setTitle() end }// BookPrototype{} end class BarBookPrototype extends BookPrototype { /* * @var string */ protected $category = 'Bar'; public function __clone() { } }// BarBookPrototype{} end class FooBookPrototype extends BookPrototype { /* * @var string */ protected $category = 'Foo'; public function __clone() { } }// FooBookPrototype{} end $fooPrototype = new FooBookPrototype(); $barPrototype = new BarBookPrototype(); for ($i = 0; $i < 10; $i++) { $book = clone $fooPrototype; $book->setTitle('Foo Book No ' . $i); echo $book->getTitle() . PHP_EOL; } for ($i = 0; $i < 5; $i++) { $book = clone $barPrototype; $book->setTitle('Bar Book No ' . $i); echo $book->getTitle() . PHP_EOL; }结果<?php Foo Book No 0 Foo Book No 1 Foo Book No 2 Foo Book No 3 Foo Book No 4 Foo Book No 5 Foo Book No 6 Foo Book No 7 Foo Book No 8 Foo Book No 9 Bar Book No 0 Bar Book No 1 Bar Book No 2 Bar Book No 3 Bar Book No 4{message type="info" content="PHP 对象复制 : 对象复制可以通过 clone 关键字来完成"/}装饰器模式{callout color="#f0ad4e"}动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活{/callout}{message type="info" content="例子"/}短信模板接口 <?php interface MessageTemplate { public function message(); }假设有很多模板实现了上面的短信模板接口// 下面这个是其中一个优惠券发送的模板实现 class CouponMessageTemplate implements MessageTemplate { public function message() { return '优惠券信息:我们是全国第一的牛X产品哦,送您十张优惠券!'; } }我们来准备好装饰上面那个过时的短信模板abstract class DecoratorMessageTemplate implements MessageTemplate { public $template; public function __construct($template) { $this->template = $template; } } 过滤新广告法中不允许出现的词汇class AdFilterDecoratorMessage extends DecoratorMessageTemplate { public function message() { return str_replace('全国第一', '全国第二', $this->template->message()); } } 使用我们的大数据部门同事自动生成的新词库来过滤敏感词汇,这块过滤不是强制要过滤的内容,可选择使用class SensitiveFilterDecoratorMessage extends DecoratorMessageTemplate { public $bigDataFilterWords = ['牛X']; public $bigDataReplaceWords = ['好用']; public function message() { return str_replace($this->bigDataFilterWords, $this->bigDataReplaceWords, $this->template->message()); } } 客户端,发送接口,需要使用模板来进行短信发送 class Message { public $msgType = 'old'; public function send(MessageTemplate $mt) { // 发送出去咯 if ($this->msgType == 'old') { echo '面向内网用户发送' . $mt->message() . PHP_EOL; } else if ($this->msgType == 'new') { echo '面向全网用户发送' . $mt->message() . PHP_EOL; } } } $template = new CouponMessageTemplate(); $message = new Message(); // 老系统,用不着过滤,只有内部用户才看得到 $message->send($template); // 新系统,面向全网发布的,需要过滤一下内容哦 $message->msgType = 'new'; $template = new AdFilterDecoratorMessage($template); $template = new SensitiveFilterDecoratorMessage($template); // 过滤完了,发送吧 $message->send($template);引用:https://zhuanlan.zhihu.com/p/102420902 及 https://www.cnblogs.com/yuanwanli/p/8796402.html
2022年03月06日
291 阅读
0 评论
1 点赞
2022-03-06
ab压力测试工具
压力测试的概念{message type="info" content="吞吐率(Requests per second)"/}{callout color="#f0ad4e"}服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。计算公式:总请求数 / 处理完成这些请求数所花费的时间,即 Request per second = Complete requests / Time taken for tests{/callout}{message type="info" content="并发连接数(The number of concurrent connections)"/}{callout color="#f0ad4e"}某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。{/callout}{message type="info" content="并发用户数(The number of concurrent users,Concurrency Level)"/}{callout color="#f0ad4e"}要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。{/callout}{message type="info" content="用户平均请求等待时间(Time per request)"/}{callout color="#f0ad4e"}计算公式:处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数),即Time per request = Time taken for tests /( Complete requests / Concurrency Level){/callout}{message type="info" content="服务器平均请求等待时间(Time per request: across all concurrent requests)"/}{callout color="#f0ad4e"}计算公式:处理完成所有请求数所花费的时间 / 总请求数,即Time taken for / testsComplete requests可以看到,它是吞吐率的倒数。同时,它也=用户平均请求等待时间/并发用户数,即Time per request / Concurrency Level{/callout}简介ab(apache bench)ab是Apache超文本传输协议(HTTP)的性能测试工具。其设计意图是描绘当前所安装的Apache的执行性能,主要是显示你安装的Apache每秒可以处理多少个请求。下载进入apache官网 http://httpd.apache.org/ 下载apache即可启动以windows环境下,apache安装路径为C:\apache\Apache24\为例打开终端,输入命令cd C:\apache\Apache24\bin测试输入命令ab -n 100 -c 10 http://blog.shmilyi.cn/其中-n表示请求数,-c表示并发数1.首先这里是展示的服务器信息服务器采用的是nginx,域名是blog.shmilyi.cn,端口是802.这段是关于请求的文档的相关信息所在位置"/",文档的大小为51648 bytes(此为http响应的正文长度)3.这段展示了压力测试的几个重要指标并发请求数:Concurrency Level: 10整个测试持续的时间:Time taken for tests: 4.536 seconds完成的请求数:Complete requests: 100失败的请求数:Failed requests: 41整个场景中的网络传输量:Total transferred: 5186121 bytes整个场景中的HTML内容传输量:HTML transferred: 5164821 bytes吞吐率:Requests per second: 22.04 [#/sec] (mean)相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值用户平均请求等待时间:Time per request: 453.640 [ms] (mean)相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值服务器平均请求处理时间:Time per request: 45.364 [ms] (mean, across all concurrent requests)平均每秒网络上的流量:Transfer rate: 1116.43 [Kbytes/sec] received可以帮助排除是否存在网络流量过大导致响应时间延长的问题4.网络上消耗的时间的分解5.这段是每个请求处理时间的分布情况,50%的处理时间在413ms内,66%的处理时间在446ms内...,重要的是看90%的处理时间。转自简书:https://www.jianshu.com/p/43d04d8baaf7
2022年03月06日
182 阅读
0 评论
0 点赞
2022-03-01
2021年总结&新年计划
前言这一年,口罩 36.5 遇见 获得 失去成长 释怀2021年,对于我来说是一个不平凡的一年。辗转了六个城市(辽宁沈阳、江苏泰兴、黑龙江哈尔滨、广西贺州、黑龙江佳木斯、重庆),了解到了各色的当地文化习俗、也在旅途中不断成长...生活这一年,在饮食上可算是随心所欲了,导致了我的健身计划也得跟上排期了。还有那就是健康方面了,这一年,因为工作的原因很少锻炼所以身体一直处于一个亚健康状态,好在年底做了一次体检,把我多余了担心消除了。2022年,也得注重健康了,加强锻炼,跑跑步...工作对于我的想法,就是在能拼搏的年纪好好拼搏一把,干出了一些许业绩,对于人情世故也感触良多。想了许久,还是想稳定一下自己。其实这一年,感觉也没有提升太多,我认为最佳的学习是应用于实践.所以我还是想把更多精力和心思花费在代码上。感觉到每天都很迷茫...计划1.考完专升本2.锻炼身体3.继续研究PHP和前端知识
2022年03月01日
91 阅读
0 评论
0 点赞
2022-03-01
关于《杀死那个石家庄人》背后的故事
前言80年代出生的人亲身经历了这种从繁荣转向衰弱的历程,他们所受的教育是单纯的理想和浪漫主义,而满眼所见的,全都是金钱至上和欲望崇拜。-- 生于理想,死于欲望。是这一代人最真实的写照。歌词傍晚六点下班 换掉药厂的衣裳妻子在熬粥 我去喝几瓶啤酒如此生活三十年 直到大厦崩塌云层深处的黑暗啊 淹没心底的景观在八角柜台 疯狂的人民商场用一张假钞 买一把假枪保卫她的生活 直到大厦崩塌夜幕覆盖华北平原 忧伤浸透她的脸河北师大附中 乒乓少年背向我沉默的注视 无法离开的教室生活在经验里 直到大厦崩塌一万匹脱缰的马 在他脑海中奔跑如此生活30年 直到大厦崩塌一万匹脱缰的马 在他脑海中奔跑如此生活30年 直到大厦崩塌云层深处的黑暗啊 淹没心底的景观一个不知名的故事壮年一个石家庄药厂的职工,每天6点下班。因为没有房子,直到工作了十年才轮到他分到了住房,娶了一个自己并不太喜欢的、没工作的妻子。他们很快就生了个孩子,日子过得马马虎虎,因为他毕竟算体制内吧。妻子每天帮他洗衣做饭带娃,孩子还小每天哭哭啼啼,他劳累了一天,并不想理会这些烦心事,毕竟他的工作就在药厂泵房,每天吵的耳朵疼。他回家,一进门就看到老婆又在煮稀饭。吃惯了公家食堂丰盛午餐的他,并不想晚上喝稀饭,于是他谎称就跟老婆说自己出去一趟办点事,他老婆倒是很关心他,劝他早点回来。换了衣服就出门来到小店,买了两瓶啤酒,看一帮同事打斗地主,就这样到了夜里十点半,大家伙都散去了。就这样,他以为自己就能这样度过三十年,直到自己能够退休。想到这,十一点已经洗漱完毕的他,就这样安然地睡着了。孩子已经一岁半了,正是需要奶粉的时候,石家庄本地的三鹿奶粉一直是家中的必需品,他也挤出钱来供给孩子吃奶,已经把晚上的那顿啤酒给戒了,从此也紧巴巴的过日子。他逐渐才体会妻子的好,也是因为自己妻子的勤俭持家,才换得了这个温馨的小家。他也知道珍惜,毕竟三十多得子还是挺不容易的。直到药厂关门。中年他亲眼目睹了药厂在爆破声中,倒掉的烟囱。倒掉的,还有烟囱旁泵房中他的工位。和他和他的家人唯一的收入来源。他来到人才市场,满眼尽是自己的同事,但他自己,已经35了,没有几个单位愿意要他。孩子已不在是一岁时令人烦人的状态,三岁的孩子,他非常喜爱,令他无法割舍。他尝试过清洁工、建筑工、搬运工……但收入只有药厂的50%,更加劳累,而且还要工作到晚上8点,令他身心俱疲。他无法适应,感到迷茫无助。毕竟二十多岁的他,每天夜里都在喝啤酒,看下棋,打扑克,而且这么一浑浑噩噩就是十几年,大把的光阴从手缝中溜走,却没有珍惜。突然的失业让他知道自己是一个没有多少能力的男人,甚至连家都养不起。好在其他企业还没倒,他觉得他应该像药厂同事老唐那样,开始做生意。机床厂因为效益还行,依旧存在着。他们的职工还有工资。以前骑自行车同行的时候,天天上下班的路上,总能看到这帮人停下来,到路边买点菜。这天他凌晨三点半,趁着华北平原的夜色,他带着两块钱出发了,从郊区弄到一批蔬菜,准备拿到以前上下班的地方卖。他从早上一直卖到了下午七点,一共卖了五块零八毛。回家的路上,他觉得马马虎虎,毕竟不用出太大的体力活了,还能勉强度日。他准备第二天租个三轮车,毕竟上下班自行车去运堆起来一个人高的菜,太危险,左摇右晃的不安全。然而租车老板却告诉他,五元是假的。他觉得不应该,那些机床厂的人还没有下岗,日子总比他好过的多,怎么能用假钱欺骗他?毕竟家里还有他的老婆和他的孩子。他需要钱,然而进菜的两元是他唯一的积蓄他走在路上崩溃了...他路过百货商店,并看了看隔壁的银行。突然他的脑海里突然涌现了一个疯狂的念头。他决定抱着试试看的心态,把这钱花出去。收银员和同事笑着、漫不经心的吹着牛,接过了他的假钞看都没看就放进了抽屉里。他买到了一把玩具手枪,走进了隔壁的银行。"都别动,把抽屉里十块的都给我"他怒吼着银行柜台的人傻了,把整个抽屉拽出来,扔给了他,并举起双手站在桌旁。其他人也呆若木鸡,不敢说话。他一只手举着枪,另一只手疯狂的把钱往自己裤子口袋里装,然后撒腿就跑。他跑进一个巷子里,脱掉了外套,扯掉了头上的头套,扔进了不知道是谁的自行车篓子里,然后转身出来,装作什么事都没发生一样走在路上。他知道有警察在追他,他还故意在家周围转了好几圈,最后在菜场买了点肉,回到了家。他把钱藏在自己另一双鞋里,并用鞋垫盖好。这一夜他没有睡着,风声鹤唳草木皆兵,就连隔壁人回家敲门,他都吓得从床上坐起来。第二天他强撑自己的身体,起床准备去进菜。然而刚来到自行车旁,他就被警察按倒在地。他脸贴着地,他看到了妻子忧伤的脸,以及看到无数双鞋踏步在地面上扬起的尘土。仿佛就像药厂烟囱被爆破一样。倒下那个烟囱砸在旁边的工房上。还有他的人生。老年十二年后他出狱了。他得知他的儿子在上中学。他来到儿子的学校,他慢脑海想着儿子三岁时的模样,那样的可爱。他在狱中最忘不了的,就是儿子睡着时的包子脸。想着想着,他欣慰的笑了。根据班主任的指引,他找到了正在上体育课打乒乓球的儿子。欢笑的儿子认识他,看了他一眼,就变了脸色,冷冷的说:"你来干什么?你知不知道,我就算考上大学了,毕业了也没法找工作,就因为我是抢劫犯的儿子!我恨你,我没有你这个爹,你走吧。"儿子头也不回的躲进了教室,任由他在楼下叫喊儿子的名字始终没有回应。直到他被逐出了学校...他回头看了一眼学校大门。"河北师范大学附属中学"的金字招牌,他想的是儿子熟睡的面庞,以及他改嫁的老婆。还有自己,五十多岁,不太听使唤的身体。他想起自己还会挥动煤铲烧锅炉,控制水泵。然而找工作时却发现都是自动控制的锅炉,电脑如何操作,他一点也不知道。他想去卖菜,人们却告诉他需要用微信和支付宝付款,他不会操作这些东西。他面对这个高速发展的世界,显得力不从心。身体也不好,也找不到工作,他大概只能孤独的死去。他走在石家庄的路上,想起了药厂烟囱爆破时的场景:"尘土中烟囱倒下去的残骸,压塌了他曾工作的工房。"十一月底的华北,他躺在石家庄的广场上的躺椅上,睡着了。没有人知道他的姓名,和他的故事。完结{message type="info" content=" 这首歌,主要反映的是当时80年代末90年代初期的一种经济转型现象。北方重工业城市在经历过了时代变迁,从计划经济到市场经济的的变轨所经历的阵痛,和那些被遗忘或者是被抛弃的群体的失落和愤怒的感受。"/}一个人走的路会很平静 耳机里的音乐盖过噪音 看川流不息 炊烟消了又起 方圆百里都藏匿着动人故事
2022年03月01日
3,799 阅读
16 评论
16 点赞
1
...
9
10
11
12