如何使用golang实现一个redis的telnet交互程序

golang网站管理员 Published the article • 0 comments • 5 views • 4 天前 • 来自相关话题

该代码实例只是一个引子,并未实现交互,差一个循环输入,读取用户交互输入的实现。

### 实现步骤

1. 首先我们需要创建一个redis的连接`net.Dial`, 协议是`tcp`,端口6380。
2. `defer conn.Close()` 延迟关闭连接
3. 接下来我们需要做的事情就是发送数据和读取数据`func (conn RedisConn) Command(cmd []byte) ([]byte, error)`


### 代码实例

```go
package main

import (
"bufio"
"fmt"
"net"
"sync"
"unsafe"
)

type RedisConn struct {
RedisConn net.Conn
}

func (conn RedisConn) Command(cmd []byte) ([]byte, error) {
if _, err := conn.RedisConn.Write(cmd); err != nil {
panic(err)
}
reader := bufio.NewReader(conn.RedisConn)
buffer, _, err := reader.ReadLine()
if err != nil {
return nil, err
}
return buffer, nil
}

func main() {

conn, err := net.Dial("tcp", "192.168.1.18:6380")
if err != nil {
panic(err)
}
redis := RedisConn{
RedisConn: conn,
}

defer conn.Close()

if result, err := redis.Command([]byte("Ping\n")); err == nil {
fmt.Println(string(result))
}

if result, err := redis.Command([]byte("set test 2\n")); err == nil {
fmt.Println(string(result))
}

if result, err := redis.Command([]byte("get test\n")); err == nil {
fmt.Println(string(result))
}
}
``` 查看全部

该代码实例只是一个引子,并未实现交互,差一个循环输入,读取用户交互输入的实现。

### 实现步骤

1. 首先我们需要创建一个redis的连接`net.Dial`, 协议是`tcp`,端口6380。
2. `defer conn.Close()` 延迟关闭连接
3. 接下来我们需要做的事情就是发送数据和读取数据`func (conn RedisConn) Command(cmd []byte) ([]byte, error)`


### 代码实例

```go
package main

import (
"bufio"
"fmt"
"net"
"sync"
"unsafe"
)

type RedisConn struct {
RedisConn net.Conn
}

func (conn RedisConn) Command(cmd []byte) ([]byte, error) {
if _, err := conn.RedisConn.Write(cmd); err != nil {
panic(err)
}
reader := bufio.NewReader(conn.RedisConn)
buffer, _, err := reader.ReadLine()
if err != nil {
return nil, err
}
return buffer, nil
}

func main() {

conn, err := net.Dial("tcp", "192.168.1.18:6380")
if err != nil {
panic(err)
}
redis := RedisConn{
RedisConn: conn,
}

defer conn.Close()

if result, err := redis.Command([]byte("Ping\n")); err == nil {
fmt.Println(string(result))
}

if result, err := redis.Command([]byte("set test 2\n")); err == nil {
fmt.Println(string(result))
}

if result, err := redis.Command([]byte("get test\n")); err == nil {
fmt.Println(string(result))
}
}
```

如何将packages中的main.go自动编译安装包go bin目录下?

golang网站管理员 Published the article • 0 comments • 13 views • 2019-08-06 16:48 • 来自相关话题

在我的项目中有个main.go的入口文件,这是一个命令行脚本,编译之后可以生成一个二进制可执行文件。如何在安装该包之后,自动完成安装。

### 命令如下

```bash
go get -u github.com/deliangyang/huge-mysqldump
```

### go get -u命令参数详解

> The -u flag instructs get to use the network to update the named packages
> and their dependencies. By default, get uses the network to check out
> missing packages but does not use it to look for updates to existing packages.

从网络上下载或者更新包,及其依赖的时候,使用参数`-u`,默认情况下,get使用网络取检查丢失的包,但是查找更新已经存在的包。
下载完毕之后,会在`go bin`目录下生成一个package名的二进制可执行文件。 查看全部

在我的项目中有个main.go的入口文件,这是一个命令行脚本,编译之后可以生成一个二进制可执行文件。如何在安装该包之后,自动完成安装。

### 命令如下

```bash
go get -u github.com/deliangyang/huge-mysqldump
```

### go get -u命令参数详解

> The -u flag instructs get to use the network to update the named packages
> and their dependencies. By default, get uses the network to check out
> missing packages but does not use it to look for updates to existing packages.

从网络上下载或者更新包,及其依赖的时候,使用参数`-u`,默认情况下,get使用网络取检查丢失的包,但是查找更新已经存在的包。
下载完毕之后,会在`go bin`目录下生成一个package名的二进制可执行文件。

wepy如何使用typescript来开发自己的项目?

Wepy网站管理员 Published the article • 0 comments • 10 views • 2019-08-05 15:37 • 来自相关话题

how to create wepy applicate writen in typescript?

### install and config

```bash
npm install @wepy/compiler-typescript typescript --save-dev
```

in `wepy.config.js`
```js
const TypeScriptCompiler = require('@wepy/compiler-typescript');

module.exports = {
"plugins": [
TypeScriptCompiler()
]
};
```

### 如何在wepy的文件中引入ts文件和项目

```

{{age}}



```

### ts文件

```ts
import wepy from '@wepy/core'

wepy.page({
data: {
age: 1
},
created() {
console.log(this.age)
},
computed: {

},
hooks: {

},
methods: {

}
})
```


### 引用

1. [compiler-typescript](https://wepyjs.github.io/wepy- ... script) 查看全部

how to create wepy applicate writen in typescript?

### install and config

```bash
npm install @wepy/compiler-typescript typescript --save-dev
```

in `wepy.config.js`
```js
const TypeScriptCompiler = require('@wepy/compiler-typescript');

module.exports = {
"plugins": [
TypeScriptCompiler()
]
};
```

### 如何在wepy的文件中引入ts文件和项目

```



```

### ts文件

```ts
import wepy from '@wepy/core'

wepy.page({
data: {
age: 1
},
created() {
console.log(this.age)
},
computed: {

},
hooks: {

},
methods: {

}
})
```


### 引用

1. [compiler-typescript](https://wepyjs.github.io/wepy- ... script)

golang源代码分析之异步通信WaitGroup

golang网站管理员 Published the article • 0 comments • 10 views • 2019-08-05 14:56 • 来自相关话题

Golang source code analysis asynchronous communication WaitGroup.

### 常用方法介绍

WaitGroup主要是阻塞主线程,等待一组goroutine执行完毕。通常我们会用到sync.WaitGroup中的三个函数
```
Add() // 添加计数器
Done() // 减掉计数器,等价于Add(-1)
Wait() // 阻塞,知道计数器减为0
```
上面所述当计数器 Add adds delta, which may be negative, to the WaitGroup counter.
> If the counter becomes zero, all goroutines blocked on Wait are released.
> If the counter goes negative, Add panics.

Add的参数是一个整数,可能是负数,如果计数器变为0了,所有的goroutines会被阻塞等待释放,如果计数器变成负值,则会报错。
从方法`statep, semap := wg.state()`中拿到`statep`,它是一个原子计数器。

```go
func (wg *WaitGroup) Add(delta int) {
statep, semap := wg.state()
if race.Enabled {
_ = *statep // trigger nil deref early
if delta < 0 {
// Synchronize decrements with Wait.
race.ReleaseMerge(unsafe.Pointer(wg))
}
race.Disable()
defer race.Enable()
}
state := atomic.AddUint64(statep, uint64(delta) 32)
w := uint32(state)
if race.Enabled && delta > 0 && v == int32(delta) {
// The first increment must be synchronized with Wait.
// Need to model this as a read, because there can be
// several concurrent wg.counter transitions from 0.
race.Read(unsafe.Pointer(semap))
}
if v < 0 {
panic("sync: negative WaitGroup counter")
}
if w != 0 && delta > 0 && v == int32(delta) {
panic("sync: WaitGroup misuse: Add called concurrently with Wait")
}
if v > 0 || w == 0 {
return
}
// This goroutine has set counter to 0 when waiters > 0.
// Now there can't be concurrent mutations of state:
// - Adds must not happen concurrently with Wait,
// - Wait does not increment waiters if it sees counter == 0.
// Still do a cheap sanity check to detect WaitGroup misuse.
if *statep != state {
panic("sync: WaitGroup misuse: Add called concurrently with Wait")
}
// Reset waiters count to 0.
*statep = 0
for ; w != 0; w-- {
runtime_Semrelease(semap, false)
}
}
```

#### Wait()

```go
// Wait blocks until the WaitGroup counter is zero.
func (wg *WaitGroup) Wait() {
statep, semap := wg.state()
if race.Enabled {
_ = *statep // trigger nil deref early
race.Disable()
}
for {
state := atomic.LoadUint64(statep)
v := int32(state >> 32)
w := uint32(state)
if v == 0 {
// Counter is 0, no need to wait.
if race.Enabled {
race.Enable()
race.Acquire(unsafe.Pointer(wg))
}
return
}
// Increment waiters count.
if atomic.CompareAndSwapUint64(statep, state, state+1) {
if race.Enabled && w == 0 {
// Wait must be synchronized with the first Add.
// Need to model this is as a write to race with the read in Add.
// As a consequence, can do the write only for the first waiter,
// otherwise concurrent Waits will race with each other.
race.Write(unsafe.Pointer(semap))
}
runtime_Semacquire(semap)
if *statep != 0 {
panic("sync: WaitGroup is reused before previous Wait has returned")
}
if race.Enabled {
race.Enable()
race.Acquire(unsafe.Pointer(wg))
}
return
}
}
}
``` 查看全部
Golang source code analysis asynchronous communication WaitGroup.

### 常用方法介绍

WaitGroup主要是阻塞主线程,等待一组goroutine执行完毕。通常我们会用到sync.WaitGroup中的三个函数
```
Add() // 添加计数器
Done() // 减掉计数器,等价于Add(-1)
Wait() // 阻塞,知道计数器减为0
```
上面所述当计数器<=0之后,Add的参数不能为为负值,会出现如下错误`panic("sync: negative WaitGroup counter")`,`sync.WaitGroup`的源码在
如下两个文件中,包含源码和单元测试的源码:
```
src/sync/waitgroup.go
src/sync/waitgroup_test.go
```

### 如何使用

`sync.WaitGroup`主要配置`go func`来使用,阻塞主线程,等到`go func`执行完毕。
如下代码其实是没有任何输出的,因为主线程执行完成先于`go func`。所以里面的代码是不会被执行的。
```go
package main

func main() {

go func() {
for i := 0; i < 10; i++ {
fmt.Println("i: ", i)
}
}()
}
```

那么,我们需要如何解决这个问题呢?这里我们就需要用到`sync.WaitGroup`这个解决方案了。
```go
package main

func main() {
var wg = sync.WaitGroup{}
wg.Add(1)

go func() {
for i := 0; i < 10; i++ {
fmt.Println("i: ", i)
}
wg.Done()
}()

wg.Wait()
}
```


### 源码分析
结构体`WaitGroup`有两个字段,noCopy和state1的一个数组
```go
type WaitGroup struct {
noCopy noCopy

state1 [3]uint32
}
```

主要的方法是`Add()`和`Wait()`。函数`Done()`的实现如下,其实就是`wg.Add(-1)`。
```go
func (wg *WaitGroup) Done() {
wg.Add(-1)
}
```

#### state()

state()是一个私有方法,state()返回指向wg.state1中存储的state和sema字段的指针

```go
// state returns pointers to the state and sema fields stored within wg.state1.
func (wg *WaitGroup) state() (statep *uint64, semap *uint32) {
if uintptr(unsafe.Pointer(&wg.state1))%8 == 0 {
return (*uint64)(unsafe.Pointer(&wg.state1)), &wg.state1[2]
} else {
return (*uint64)(unsafe.Pointer(&wg.state1[1])), &wg.state1[0]
}
}
```

#### Add()

> Add adds delta, which may be negative, to the WaitGroup counter.
> If the counter becomes zero, all goroutines blocked on Wait are released.
> If the counter goes negative, Add panics.

Add的参数是一个整数,可能是负数,如果计数器变为0了,所有的goroutines会被阻塞等待释放,如果计数器变成负值,则会报错。
从方法`statep, semap := wg.state()`中拿到`statep`,它是一个原子计数器。

```go
func (wg *WaitGroup) Add(delta int) {
statep, semap := wg.state()
if race.Enabled {
_ = *statep // trigger nil deref early
if delta < 0 {
// Synchronize decrements with Wait.
race.ReleaseMerge(unsafe.Pointer(wg))
}
race.Disable()
defer race.Enable()
}
state := atomic.AddUint64(statep, uint64(delta)<<32)
v := int32(state >> 32)
w := uint32(state)
if race.Enabled && delta > 0 && v == int32(delta) {
// The first increment must be synchronized with Wait.
// Need to model this as a read, because there can be
// several concurrent wg.counter transitions from 0.
race.Read(unsafe.Pointer(semap))
}
if v < 0 {
panic("sync: negative WaitGroup counter")
}
if w != 0 && delta > 0 && v == int32(delta) {
panic("sync: WaitGroup misuse: Add called concurrently with Wait")
}
if v > 0 || w == 0 {
return
}
// This goroutine has set counter to 0 when waiters > 0.
// Now there can't be concurrent mutations of state:
// - Adds must not happen concurrently with Wait,
// - Wait does not increment waiters if it sees counter == 0.
// Still do a cheap sanity check to detect WaitGroup misuse.
if *statep != state {
panic("sync: WaitGroup misuse: Add called concurrently with Wait")
}
// Reset waiters count to 0.
*statep = 0
for ; w != 0; w-- {
runtime_Semrelease(semap, false)
}
}
```

#### Wait()

```go
// Wait blocks until the WaitGroup counter is zero.
func (wg *WaitGroup) Wait() {
statep, semap := wg.state()
if race.Enabled {
_ = *statep // trigger nil deref early
race.Disable()
}
for {
state := atomic.LoadUint64(statep)
v := int32(state >> 32)
w := uint32(state)
if v == 0 {
// Counter is 0, no need to wait.
if race.Enabled {
race.Enable()
race.Acquire(unsafe.Pointer(wg))
}
return
}
// Increment waiters count.
if atomic.CompareAndSwapUint64(statep, state, state+1) {
if race.Enabled && w == 0 {
// Wait must be synchronized with the first Add.
// Need to model this is as a write to race with the read in Add.
// As a consequence, can do the write only for the first waiter,
// otherwise concurrent Waits will race with each other.
race.Write(unsafe.Pointer(semap))
}
runtime_Semacquire(semap)
if *statep != 0 {
panic("sync: WaitGroup is reused before previous Wait has returned")
}
if race.Enabled {
race.Enable()
race.Acquire(unsafe.Pointer(wg))
}
return
}
}
}
```

微信小程序云开发可以上传php代码吗?

小程序网站管理员 Published the article • 0 comments • 33 views • 2019-08-04 12:45 • 来自相关话题

微信小程序云开发可以上传php代码吗?

这显然是`不可以的`。为什么这么说?之所以云开发是希望一套javascript代码搞定,所有的前端后端开发只需要你会javascript即可。后台数据库是mongodb,可以帮助我们存储字典对象的数据,对于javascript来说,前端上传什么数据,校验通过直接存储即可,不需要而外的sql或者防范sql注入之类的。

小程序的云开发其实很方便前端的同学,如果你了解MongoDB之类的数据库操作的话,前后端都可以搞定。 查看全部

微信小程序云开发可以上传php代码吗?

这显然是`不可以的`。为什么这么说?之所以云开发是希望一套javascript代码搞定,所有的前端后端开发只需要你会javascript即可。后台数据库是mongodb,可以帮助我们存储字典对象的数据,对于javascript来说,前端上传什么数据,校验通过直接存储即可,不需要而外的sql或者防范sql注入之类的。

小程序的云开发其实很方便前端的同学,如果你了解MongoDB之类的数据库操作的话,前后端都可以搞定。

wepy2.x回滚wepy1.x,wepy2.x从入门到弃坑

小程序网站管理员 Published the article • 0 comments • 100 views • 2019-08-01 15:42 • 来自相关话题

网上有很多开发小程序同学喜欢用官方的开发框架wepy,wepy现在有两个大版本,wepy1.x和wepy2.x。

但是这两个版本差异十分的大,我之前写了一篇文档介绍了,大家可以先看看这一篇[wepy1.x升级wepy2.x,wepy如何实现大的版本升级](https://www.sourcedev.cc/article/188)。

对比一下差异。你会发现当前把wepy的代码从wepy1.x升级到wepy2.x的时候,仿佛进入了新的世界,语法差异十分的大。如果不打算重构自己的代码,需要兼容wepy1.x的话,这将会是一个不小的工程。
我们需要耗费大量的时间重构和调试自己的代码。

那么升级了wepy2.x之后怎么办,我发现自己入坑,想回到wepy1.x怎么办? 这个时候我们也不用着急,应为我们的代码,即使有少量的改动我们也可以恢复的。
将修改的代码放入回收站内,回收站是一个栈。

### 修改的代码恢复保存

```bash
git stash save # 将代码压入栈

git stash pop # 弹出代码
```

### 重新安装wepy1.x的全局包:

```bash
npm install wepy@1.7.x -g
``` 查看全部
网上有很多开发小程序同学喜欢用官方的开发框架wepy,wepy现在有两个大版本,wepy1.x和wepy2.x。

但是这两个版本差异十分的大,我之前写了一篇文档介绍了,大家可以先看看这一篇[wepy1.x升级wepy2.x,wepy如何实现大的版本升级](https://www.sourcedev.cc/article/188)。

对比一下差异。你会发现当前把wepy的代码从wepy1.x升级到wepy2.x的时候,仿佛进入了新的世界,语法差异十分的大。如果不打算重构自己的代码,需要兼容wepy1.x的话,这将会是一个不小的工程。
我们需要耗费大量的时间重构和调试自己的代码。

那么升级了wepy2.x之后怎么办,我发现自己入坑,想回到wepy1.x怎么办? 这个时候我们也不用着急,应为我们的代码,即使有少量的改动我们也可以恢复的。
将修改的代码放入回收站内,回收站是一个栈。

### 修改的代码恢复保存

```bash
git stash save # 将代码压入栈

git stash pop # 弹出代码
```

### 重新安装wepy1.x的全局包:

```bash
npm install wepy@1.7.x -g
```

如何在vim中格式代码?

Linux网站管理员 Published the article • 0 comments • 18 views • 2019-08-01 10:50 • 来自相关话题

如何在vim中格式代码

如何在vim中格式化代码,格式化c/c++/golang/rust/php/js/javascript/css/html/等代码。

按照如下输入,然后回车

```
# 按下`Esc`,然后按下`:`,进入命令模式
gg=G
```
如何在vim中格式代码

如何在vim中格式化代码,格式化c/c++/golang/rust/php/js/javascript/css/html/等代码。

按照如下输入,然后回车

```
# 按下`Esc`,然后按下`:`,进入命令模式
gg=G
```

错误地认为他人的高情商,理所因当为自己服务

随想录网站管理员 Published the article • 0 comments • 22 views • 2019-08-01 10:08 • 来自相关话题

在我的认知里,高情商就是想他人所想,预先判断,做出响应,是对方获得意外惊喜,是无私奉献的“中央空调”。然而这是错误的认知。

凡个人都有自己的原则,所有的言行举止应该由心出发,不违背自己的意愿,我们不能强迫他人的付出大于自己的私欲,从而凸显他人的高情商,即强迫他人表现出高情商。所谓高情商其实很难判断,通常我们会认为利己的举动才算得上高情商,这种方式忽略的他人是否愿意。

在效果方面,高情商的表现有两种,利己和利他。利己属于有目的性的,有选择性的对象,表现虚伪,谋求回报,被高情商者可能当局者迷,有种被卖了还在数钱的感觉。利他者是无私的,处处为他人考虑,凡在场者皆可被顾及,如若没有,事后也会收到歉意和安慰,不求回报,甚至有时候会损失自己的利益,孤独的外向者。

高情商不能被判定,其表现是他人的主观意愿,我们不能强迫他人理所因当地顾及自己。应当有正确的认识,有些人本来就不具备这个能力,亦或是他意图隐藏对你表现出高情商。 查看全部
在我的认知里,高情商就是想他人所想,预先判断,做出响应,是对方获得意外惊喜,是无私奉献的“中央空调”。然而这是错误的认知。

凡个人都有自己的原则,所有的言行举止应该由心出发,不违背自己的意愿,我们不能强迫他人的付出大于自己的私欲,从而凸显他人的高情商,即强迫他人表现出高情商。所谓高情商其实很难判断,通常我们会认为利己的举动才算得上高情商,这种方式忽略的他人是否愿意。

在效果方面,高情商的表现有两种,利己和利他。利己属于有目的性的,有选择性的对象,表现虚伪,谋求回报,被高情商者可能当局者迷,有种被卖了还在数钱的感觉。利他者是无私的,处处为他人考虑,凡在场者皆可被顾及,如若没有,事后也会收到歉意和安慰,不求回报,甚至有时候会损失自己的利益,孤独的外向者。

高情商不能被判定,其表现是他人的主观意愿,我们不能强迫他人理所因当地顾及自己。应当有正确的认识,有些人本来就不具备这个能力,亦或是他意图隐藏对你表现出高情商。

PostgreSQL入门使用手册,pgsql登陆连接数据库

数据结构与算法网站管理员 Published the article • 0 comments • 21 views • 2019-07-31 18:27 • 来自相关话题

PostgreSQL Getting Started manual, pgsql login to connect to the database.


### pgsl命令解释,查看命令
```bash
psql --help
```
pgsql我们用的命令不多,常用的就那么几个参数,常用的,连接,输入格式和输出格式。
`PostgreSQL`远程或者本地ip,一般可以不用填写,默认就是`localhost`或者`127.0.0.1`。

```
General options:
-c, --command=COMMAND run only single command (SQL or internal) and exit
-d, --dbname=DBNAME database name to connect to (default: "dev")

Connection options:
-h, --host=HOSTNAME database server host or socket directory (default: "local socket")
-p, --port=PORT database server port (default: "5432")
-U, --username=USERNAME database user name (default: "dev")
-w, --no-password never prompt for password
-W, --password force password prompt (should happen automatically)
```

### 连接数据库

```bash
psql -h 127.0.0.1 -Udev -p 3433 -l

# output
List of databases
Name | Owner | Encoding | Collation | Ctype | Access privileges
------------+------------+----------+-----------+-------+---------------------------
logs | 123 | UTF8 | C | C |
postgres | 123 | UTF8 | C | C |

```


### pgsql命令行的命令

```pgsql
party_logs=> help
You are using psql, the command-line interface to PostgreSQL.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
party_logs=> \?
```

`help`可以查看所有的命令,`\?`可以查看`pgsql commands`,`\h`可以查看`SQL commands`。

#### \h

```
party_logs=> \h
Available help:
```
![eNe00K.png](https://s2.ax1x.com/2019/07/31/eNe00K.png)

```pgsql
party_logs=> \dp
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+-----------------+----------+---------------------------+--------------------------
public | logs | table | |
public | logs_log_id_seq | sequence | |
(2 rows)
``` 查看全部
PostgreSQL Getting Started manual, pgsql login to connect to the database.


### pgsl命令解释,查看命令
```bash
psql --help
```
pgsql我们用的命令不多,常用的就那么几个参数,常用的,连接,输入格式和输出格式。
`PostgreSQL`远程或者本地ip,一般可以不用填写,默认就是`localhost`或者`127.0.0.1`。

```
General options:
-c, --command=COMMAND run only single command (SQL or internal) and exit
-d, --dbname=DBNAME database name to connect to (default: "dev")

Connection options:
-h, --host=HOSTNAME database server host or socket directory (default: "local socket")
-p, --port=PORT database server port (default: "5432")
-U, --username=USERNAME database user name (default: "dev")
-w, --no-password never prompt for password
-W, --password force password prompt (should happen automatically)
```

### 连接数据库

```bash
psql -h 127.0.0.1 -Udev -p 3433 -l

# output
List of databases
Name | Owner | Encoding | Collation | Ctype | Access privileges
------------+------------+----------+-----------+-------+---------------------------
logs | 123 | UTF8 | C | C |
postgres | 123 | UTF8 | C | C |

```


### pgsql命令行的命令

```pgsql
party_logs=> help
You are using psql, the command-line interface to PostgreSQL.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
party_logs=> \?
```

`help`可以查看所有的命令,`\?`可以查看`pgsql commands`,`\h`可以查看`SQL commands`。

#### \h

```
party_logs=> \h
Available help:
```
![eNe00K.png](https://s2.ax1x.com/2019/07/31/eNe00K.png)

```pgsql
party_logs=> \dp
Access privileges
Schema | Name | Type | Access privileges | Column access privileges
--------+-----------------+----------+---------------------------+--------------------------
public | logs | table | |
public | logs_log_id_seq | sequence | |
(2 rows)
```

【2019-07-28】炎炎夏日的夜晚,我燥热的思绪

随想录网站管理员 Published the article • 0 comments • 26 views • 2019-07-28 20:48 • 来自相关话题

真正的夏天来了,随之而来的是自己消失的斗志和懒惰的病发。自己出现了毛病,自己应该是最清楚的,但是能医不能自救,不过是自己的托辞。自己除了编程貌似也没有其它兴趣爱好。自己编程水平自己也知道点,有点广度,深度不够。遇到瓶颈,束手无策,迟迟无法得到提升。前些日子的自律也停滞了。感叹,为什么人会间歇性的懒惰呢?

对于自己来说,年纪也不小了,应该成熟点了,三思而后行,所做之事也意味着责任。成年人的时间一样宝贵,该充电就充电,想玩就好好玩。正如鲁迅先生所说,学要学个踏实,玩要玩个痛快。不然,竹篮打水一场空,白搭了时间,也弄得自己身心疲惫。

这个年纪的我们,心智成熟,想做什么?什么该做,什么不该做,什么东西该舍弃,什么东西应该坚持到底,持之以恒,我们都应该了然于胸。

时常会给自己打鸡血,但是很少有详细而周全的计划,亦或是半途而废。这点真的不像以前的我。我知道我想了解这个世界的全部,但是我也应该明白自己精力有限,该抓重点,该有自己的特长。拿得出手,有点影响力,有自己的粉丝,有自己的仰慕者。

有点才华,但是经不起推敲。不善言谈。不能很好的把自己知道的描述给别人听。这就是自己的弱点,既然知道,为什么不抢救一下呢?

人一辈子最应该追求的是知识和健康。强壮的身体可以让我们走的更远,知识可以让我们更深入的了解这个自然宇宙。我所仰望的更远处,其实我根本无法触及,我不曾积跬步,无以至千里。不曾想过让自己颓废下去,正如此刻自己的座右铭一样,岂甘命运,有如蒿草。

那么我可能又要开始喊自己的口号了,做最好的自己,问心无愧。 查看全部
真正的夏天来了,随之而来的是自己消失的斗志和懒惰的病发。自己出现了毛病,自己应该是最清楚的,但是能医不能自救,不过是自己的托辞。自己除了编程貌似也没有其它兴趣爱好。自己编程水平自己也知道点,有点广度,深度不够。遇到瓶颈,束手无策,迟迟无法得到提升。前些日子的自律也停滞了。感叹,为什么人会间歇性的懒惰呢?

对于自己来说,年纪也不小了,应该成熟点了,三思而后行,所做之事也意味着责任。成年人的时间一样宝贵,该充电就充电,想玩就好好玩。正如鲁迅先生所说,学要学个踏实,玩要玩个痛快。不然,竹篮打水一场空,白搭了时间,也弄得自己身心疲惫。

这个年纪的我们,心智成熟,想做什么?什么该做,什么不该做,什么东西该舍弃,什么东西应该坚持到底,持之以恒,我们都应该了然于胸。

时常会给自己打鸡血,但是很少有详细而周全的计划,亦或是半途而废。这点真的不像以前的我。我知道我想了解这个世界的全部,但是我也应该明白自己精力有限,该抓重点,该有自己的特长。拿得出手,有点影响力,有自己的粉丝,有自己的仰慕者。

有点才华,但是经不起推敲。不善言谈。不能很好的把自己知道的描述给别人听。这就是自己的弱点,既然知道,为什么不抢救一下呢?

人一辈子最应该追求的是知识和健康。强壮的身体可以让我们走的更远,知识可以让我们更深入的了解这个自然宇宙。我所仰望的更远处,其实我根本无法触及,我不曾积跬步,无以至千里。不曾想过让自己颓废下去,正如此刻自己的座右铭一样,岂甘命运,有如蒿草。

那么我可能又要开始喊自己的口号了,做最好的自己,问心无愧。