# 第 95 期：第五级领导者

> @Author : Lewis Tian (taseikyo@gmail.com)
>
> @Link : github.com/taseikyo
>
> @Range : 2024-12-29 - 2025-01-04

## Weekly #95

[readme](../readme) | [previous](../shi-er-yue/202412w4) | [next](202501w2)

本文总字数 9863 个，阅读时长约： 11 分 28 秒，统计数据来自：[算筹字数统计](http://www.xiqei.com/tools?p=tj)。

![](https://3093055548-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MMdedjHJjq-FX7CAnHy%2Fuploads%2Fgit-blob-4169387d6a1a7f5c568bc7cf35a19f6884e27eaa%2Fneom-_tDdlCJIwOA-unsplash.jpg?alt=media)

\*_Photo by_ [_NEOM_](https://unsplash.com/@neom) _on_ [_Unsplash_](https://unsplash.com/photos/a-scuba-diver-swims-over-a-colorful-coral-reef-_tDdlCJIwOA)

### Table of Contents

* [algorithm](#algorithm-)
  * 爬楼梯
  * 有效的括号
* [review](#review-)
* [tip](#tip-)
  * js 实现各种复制到剪贴板
  * javascript 转颜文字
  * PyQt5监听系统粘贴板并提取时间
  * psutil 模块
* [share](#share-)
  * 第五级领导者

### algorithm [🔝](#weekly-95)

#### 1. [70. 爬楼梯](https://leetcode.cn/problems/climbing-stairs/description/?envType=study-plan-v2\&envId=top-100-liked)

**题目**

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？

示例 1：

输入：n = 2\
输出：2\
解释：有两种方法可以爬到楼顶。

1. 1 阶 + 1 阶
2. 2 阶\
   示例 2：

输入：n = 3\
输出：3\
解释：有三种方法可以爬到楼顶。

1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

* 1 <= n <= 45

**解法**

最直观的方法就是递归了，结果超时了，于是加了个 map 作为缓存，然后就过了：

> [70.climbing-stairs.go](https://github.com/taseikyo/arts/blob/master/code/leetcode/70.climbing-stairs.go)

```go
var cache = map[int]int{
    1: 1,
    2: 2,
}

func climbStairs(n int) int {
    if v, ok := cache[n]; ok {
        return v
    }
    cache[n] = climbStairs(n-1) + climbStairs(n-2)

    return cache[n]
}
```

数据：0ms 100%; 3.73MB 72.9%

#### 2. [20. 有效的括号](https://leetcode.cn/problems/valid-parentheses/description/?envType=study-plan-v2\&envId=top-100-liked)

**题目**

给定一个只包括 '('，')'，'{'，'}'，'\['，']' 的字符串 s ，判断字符串是否有效。

有效字符串需满足：

* 左括号必须用相同类型的右括号闭合。
* 左括号必须以正确的顺序闭合。
* 每个右括号都有一个对应的相同类型的左括号。

提示：

* 1 <= s.length <= 104
* s 仅由括号 '()\[]{}' 组成

**解法**

> [20.valid-parentheses.go](https://github.com/taseikyo/arts/blob/master/leetcode/20.valid-parentheses.go)

```go
func isValid(s string) bool {
    n := len(s)
    if n % 2 == 1 {
        return false
    }
    pairs := map[byte]byte{
        ')': '(',
        ']': '[',
        '}': '{',
    }
    stack := []byte{}
    for i := 0; i < n; i++ {
        if pairs[s[i]] > 0 {
            if len(stack) == 0 || stack[len(stack)-1] != pairs[s[i]] {
                return false
            }
            stack = stack[:len(stack)-1]
        } else {
            stack = append(stack, s[i])
        }
    }
    return len(stack) == 0
}
```

数据：0ms 100%; 6.37MB 99.96%

### review [🔝](#weekly-95)

### tip [🔝](#weekly-95)

#### 1. [js 实现各种复制到剪贴板](https://www.cnblogs.com/huijieoo/articles/5569990.html)

一、实现点击按钮，复制文本框中的的内容

```js
<script type="text/javascript">
function copyUrl2()
{
var Url2=document.getElementById("biao1");
Url2.select(); // 选择对象
document.execCommand("Copy"); // 执行浏览器复制命令
alert("已复制好，可贴粘。");
}
</script>
<textarea cols="20" rows="10" id="biao1">用户定义的代码区域</textarea>
<input type="button" onClick="copyUrl2()" value="点击复制代码" />
```

二、复制专题地址和 url 地址，传给 QQ/MSN 上的好友

```js
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>Js复制代码</title>
</head>
<body>
<p>
<input type="button" name="anniu1" onClick='copyToClipBoard()' value="复制专题地址和url地址，传给QQ/MSN上的好友">
<script language="javascript">
function copyToClipBoard(){
var clipBoardContent="";
clipBoardContent+=document.title;
clipBoardContent+="";
clipBoardContent+=this.location.href;
window.clipboardData.setData("Text",clipBoardContent);
alert("复制成功，请粘贴到你的QQ/MSN上推荐给你的好友");
}
</script>
```

三、直接复制 url

```js
<input type="button" name="anniu2" onClick='copyUrl()' value="复制URL地址">
<script language="javascript">
function copyUrl()
{
var clipBoardContent=this.location.href;
window.clipboardData.setData("Text",clipBoardContent);
alert("复制成功!");
}
</script>
```

四、点击文本框时，复制文本框里面的内容

```js
<input onclick="oCopy(this)" value="你好.要copy的内容!">
<script language="javascript">
function oCopy(obj){
obj.select();
js=obj.createTextRange();
js.execCommand("Copy")
alert("复制成功!");
}
</script>
```

五、复制文本框或者隐藏域中的内容

```js
<script language="javascript">
function CopyUrl(target){
target.value=myimg.value;
target.select();
js=myimg.createTextRange();
js.execCommand("Copy");
alert("复制成功!");
}
function AddImg(target){
target.value="[IMG]"+myimg.value+"[/ img]";
target.select();
js=target.createTextRange();
js.execCommand("Copy");
alert("复制成功!");
}
</script>
```

六、复制 span 标记中的内容

```js
<script type="text/javascript">
</script>
<br />
<br />
<script type="text/javascript">function copyText(obj)
{
var rng = document.body.createTextRange();
rng.moveToElementText(obj);
rng.scrollIntoView();
rng.select();
rng.execCommand("Copy");
rng.collapse(false);
alert("复制成功!");
}
</script>
```

七、浏览器兼容 copyToClipboard("拷贝内容")

```js
function copyToClipboard(txt) {
  if (window.clipboardData) {
    window.clipboardData.clearData();
    clipboardData.setData("Text", txt);
    alert("复制成功！");

  } else if (navigator.userAgent.indexOf("Opera") != -1) {
    window.location = txt;
  } else if (window.netscape) {
    try {
      netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    } catch (e) {
      alert("被浏览器拒绝！\n请在浏览器地址栏输入'about:config'并回车\n然后将 'signed.applets.codebase_principal_support'设置为'true'");
    }
    var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
    if (!clip)
      return;
    var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
    if (!trans)
      return;
    trans.addDataFlavor("text/unicode");
    var str = new Object();
    var len = new Object();
    var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
    var copytext = txt;
    str.data = copytext;
    trans.setTransferData("text/unicode", str, copytext.length * 2);
    var clipid = Components.interfaces.nsIClipboard;
    if (!clip)
      return false;
    clip.setData(trans, null, clipid.kGlobalClipboard);
    alert("复制成功！");
  }
}
```

八、兼容各大浏览器的复制代码（结合 ZeroClipboard.js）

```html
<html>
<head>
<title>Zero Clipboard Test</title>
<script type="text/javascript" src="ZeroClipboard.js"></script>
<script language="JavaScript">
 var clip = null;
 function $(id) { return document.getElementById(id); }
 function init() {
     clip = new ZeroClipboard.Client();
     clip.setHandCursor(true);    
     clip.addEventListener('mouseOver', function (client) {
  // update the text on mouse over
  clip.setText( $('fe_text').value );
     });
      
     clip.addEventListener('complete', function (client, text) {
  //debugstr("Copied text to clipboard: " + text );
  alert("该地址已经复制，你可以使用Ctrl+V 粘贴。");
     });
     clip.glue('clip_button', 'clip_container' );
 }
</script>
</head>
<body onLoad="init()">
<input id="fe_text" cols=50 rows=5 value=复制内容文本1 >
<span id="clip_container"><span id="clip_button"><b>复制</b></span></span>
</body>
</html
```

#### 2. [javascript 转颜文字](https://utf-8.jp/public/aaencode.html)

#### 3. [PyQt5监听系统粘贴板并提取时间](https://blog.csdn.net/yanzi1225627/article/details/76736361)

核心代码段：

```python
def addClipbordListener(self):
    clipboard = QApplication.clipboard()
    clipboard.dataChanged.connect(self.widget.onClipboradChanged)

def onClipboradChanged(self):
    clipboard = QApplication.clipboard()
    text = clipboard.text()
    ...
```

源码：[qt5-clipboard.7z](https://github.com/taseikyo/arts/blob/master/code/qt5-clipboard.7z)

#### 4. [psutil 模块](https://www.cnblogs.com/liu-yao/p/5678157.html)

1 CPU 相关

查看 cpu 信息

```python
import psutil

>>> psutil.cpu_times()
scputimes(user=11677.09, nice=57.93, system=148675.58, idle=2167147.79, iowait=260828.48, irq=7876.28, softirq=0.0, steal=3694.59, guest=0.0, guest_nice=0.0)
```

显示 cpu 所有逻辑信息

```python
>>> psutil.cpu_times(percpu=True)
[scputimes(user=11684.17, nice=57.93, system=148683.01, idle=2168982.08, iowait=260833.18, irq=7882.35, softirq=0.0, steal=3697.3, guest=0.0, guest_nice=0.0)]
```

查看用户的 cpu 时间比

```python
>>> psutil.cpu_times().user
11684.4
```

查看 cpu 逻辑个数

```python
>>> psutil.cpu_count()
1
```

查看 cpu 物理个数

```python
>>> psutil.cpu_count(logical=False)
1
```

3.2 查看系统内存

```python
>>> import psutil
>>> mem = psutil.virtual_memory()
>>> mem
#系统内存的所有信息
svmem(total=1040662528, available=175054848, percent=83.2, used=965718016, free=74944512, active=566755328, inactive=59457536, buffers=9342976, cached=90767360)
```

系统总计内存

```python
>>> mem.total
1040662528
```

系统已经使用内存

```python
>>> mem.used
965718016
```

系统空闲内存

```python
>>> mem.free
112779264
```

获取 swap 内存信息

```python
>>> psutil.swap_memory()
sswap(total=0, used=0, free=0, percent=0, sin=0, sout=0)
```

读取磁盘参数

磁盘利用率使用 psutil.disk\_usage 方法获取，

磁盘 IO 信息包括 read\_count(读 IO 数)，write\_count(写 IO 数)\
read\_bytes(IO 写字节数)，read\_time(磁盘读时间)，write\_time(磁盘写时间), 这些 IO 信息用

```python
psutil.disk_io_counters()
```

获取磁盘的完整信息

```python
psutil.disk_partitions()
```

获取分区表的参数

```python
psutil.disk_usage('/')   #获取/分区的状态
```

获取硬盘 IO 总个数

```python
psutil.disk_io_counters()
```

获取单个分区 IO 个数

```python
psutil.disk_io_counters(perdisk=True)    #perdisk=True参数获取单个分区IO个数
```

读取网络信息

网络信息与磁盘 IO 信息类似, 涉及到几个关键点，包括 byes\_sent(发送字节数),byte\_recv=xxx(接受字节数),\
pack-ets\_sent=xxx(发送字节数),pack-ets\_recv=xxx(接收数据包数), 这些网络信息用

获取网络总 IO 信息

```python
psutil.net_io_counters()  
```

输出网络每个接口信息

```python
psutil.net_io_counters(pernic=True)     #pernic=True
```

获取当前系统用户登录信息

```python
psutil.users()
```

获取开机时间

```python
psutil.boot_time() #以 linux 时间格式返回

datetime.datetime.fromtimestamp(psutil.boot_time ()).strftime("%Y-%m-%d %H: %M: %S") #转换成自然时间格式
```

系统进程管理\
获取当前系统的进程信息, 获取当前程序的运行状态, 包括进程的启动时间, 查看设置 CPU 亲和度, 内存使用率, IO 信息\
socket 连接, 线程数等\
获取进程信息

查看系统全部进程

```python
psutil.pids()
```

查看单个进程

```python
p = psutil.Process(2423) 
p.name()   #进程名
p.exe()    #进程的bin路径
p.cwd()    #进程的工作目录绝对路径
p.status()   #进程状态
p.create_time()  #进程创建时间
p.uids()    #进程uid信息
p.gids()    #进程的gid信息
p.cpu_times()   #进程的cpu时间信息,包括user,system两个cpu信息
p.cpu_affinity()  #get进程cpu亲和度,如果要设置cpu亲和度,将cpu号作为参考就好
p.memory_percent()  #进程内存利用率
p.memory_info()    #进程内存rss,vms信息
p.io_counters()    #进程的IO信息,包括读写IO数字及参数
p.connectios()   #返回进程列表
p.num_threads()  #进程开启的线程数
听过psutil的Popen方法启动应用程序，可以跟踪程序的相关信息
from subprocess import PIPE
p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"],stdout=PIPE)
p.name()
p.username()
```

### share [🔝](#weekly-95)

#### 1. [第五级领导者](https://wiki.mbalib.com/wiki/%E7%AC%AC%E4%BA%94%E7%BA%A7%E9%A2%86%E5%AF%BC%E8%80%85)

第五级领导者是指拥有极度的个人谦逊和强烈的职业意志的领导者。拥有这种看似矛盾的复合特性的领导者往往在一个企业从平凡到伟大的飞跃中起着催化剂似的促进作用。第五级领导者位于能力层次的顶部。任何人并不需要从下往上依次经过每一个阶层才能到达顶部，但一名真正意义上的第五级领导者必须具备其他四个更低层次的技能和能力。

第五级领导（Level 5 Leadership）所依据的理论思想是，一个品行无私的、尊重下属、且具有顽强意志的领导者，必能带领同仁勇往直前，实现最佳的组织绩效。第五级领导是谦逊的个性（Personal Humility）与强烈的专业意志（Professional Will）看似矛盾的混合，他们是顽固的、无情的，然而，他们又是谦逊的。他们对自己的公司充满热情，雄心勃勃，但是又绝不允许丝毫个人的自负成为公司发展的桎梏。对于公司来说他们功勋卓著，但是，他们自己却将所有的贡献归功于同仁、属下以及外部帮助，或者用他们的话说，“纯粹是运气”。第五级领导率领的是一支训练有素的队伍，在这支队伍中，员工们思想统一，行动一致，积极配合他的决策和领导。

第五级领导理论的研究发展轨迹是相当独立的，吉姆·柯斯林（Collins）与他的研究人员通过对有15年持续成长历史的公司进行研究，最终“发现”了它。比较：[Servant-Leadership 仆人式领导](https://wiki.mbalib.com/wiki/Servant-Leadership)

第五级领导的计算（公式）

合适人选（文化背景以及人格特征，而非个人能力） + 谦逊 + 强烈的专业意志 （结合组织目标） = 成功

第五级领导的运用（应用）

通过试用与实践发现，第五级领导的作用是明显的。 它强调更多的是领导者的人格特征，而不是个人能力。 能力并非成功的绝对因素，但是，在成功面前，优秀的品质是不能打折扣的。

第五级领导的步骤（流程）

1. 发现、雇用合时的人选。
2. 将他们安排到他们“想要”干的工作岗位上。
3. 制定一个真正的高标准的 [长期目标](https://wiki.mbalib.com/wiki/%E9%95%BF%E6%9C%9F%E7%9B%AE%E6%A0%87)， 如 [BHAG目标](https://wiki.mbalib.com/wiki/BHAG%E7%9B%AE%E6%A0%87)（即Big,Hairy,Audacious Goal）。

五级层级架构中的领导者特质

* 第五级：五级执行官：通过个人谦逊性格和职业意志的复杂结合，建立企业长期的持续健康发展。
* 第四级：高效的领导者：对于目的的工作可以投入充沛的精力，显示出专业的职业素质，激励整个集体追求的绩效标准。
* 第三级：能干的经理：组织人力、物力，并使其得到充分，有效的利用，以实现既定目标。
* 第二级：具有奉献精神的团队成员：投身集体项目和其他成员高效合作。
* 第一级：高素质的员工：用才智、知识、技能以及良好的工作习惯为公司创造价值。

由此可见，第五级领导者位于能力层次的顶部。第五级领导与中级管理者和普通员工在承担的责任、企业中的作用和贡献大小是无法比拟的。经营者以企业整体业绩向董事会负责，而普通职工的收入多少取决于其劳动效率，二者属于两个不同的层级，其收入具有不可比性。因而不能单纯以薪酬数量来评定CEO高薪的合理性。

从五级领导的特性分析发现，谦逊+职业意志=5级，五级领导者具有双重性格：谦虚而执著，羞怯而无畏。吉列公司1975年至1991年期间的首席执行官科尔曼·默克勒是典型代表之一。他保守而和蔼，彬彬有礼，极具贵族风度。在位期间，吉列公司三次面临被收购。在经历多次史诗般的商业战役中，默克勒始终保持谦逊有礼的风度。在危急关头，他仍然保持平和的态度，每次在被收购之前都成功地扭转了乾坤。　

[readme](../readme) | [previous](../shi-er-yue/202412w4) | [next](202501w2)
