解决xcode更新画菊花问题

按照xcode后,如果遇到更新,往往会出现各种问题,比如watch模拟器无法安装成功,或者就是更新的最后0.0001%总是完成不了,appstore里菊花转圈不断。

解决方法:

  1. 简单粗暴,删除xcode即可
  2. 去apple developer download下载离线安装版本,安装

我最近不太使用swift开发,所以决定删除xcode,顺便节省磁盘空间。

然而,删除xcode后,更新提示还是依然会出现,采取如下几步顺利接触更新提示。

关闭sip

  1. 重启mac,同时按住cmd+R启动恢复模式
  2. 进入恢复模式,启动terminal
csrutil disable
  1. 重启,进入如下目录,并删除和clt有关的系列文件
22-11-06/Users/xxxxx~%>cd Library/Apple/System/Library/Receipts
22-11-06/Users/XXXXX~%>sudo rm -rf com.apple.pkg.CLTools_*.*
  1. 再次进入恢复模式,启动terminal
  2. 启动sip
csrutil enable

重新定位clt工具

22-11-06/Users/xxxxx~%>sudo xcode-select -switch /
22-11-06/Users/XXXX~%>xcode-select -p
/Library/Developer/CommandLineTools

最后,更新brew

brew update

/etc/zshrc

用最简洁的方式,在prompt里实现git branch的信息

增加parse_git_branch函数

final version

parse_git_branch() {
     git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

PS1="%F{12}%D%d~%#>%f%F{red}\$(parse_git_branch)%f"

ZSH prompt的简单生成器

https://zsh-prompt-generator.site/

ZSH现实git branch的另外一种方法

autoload -Uz vcs_info
precmd_vcs_info() { vcs_info }
precmd_functions+=( precmd_vcs_info )
setopt prompt_subst
#RPROMPT=$vcs_info_msg_0_
PS1="%F{cyan}%D%d~%#>%f"$vcs_info_msg_0_

reference

add git branch name to bash prompt

https://scriptingosx.com/2019/07/moving-to-zsh-06-customizing-the-zsh-prompt/

Git删除文件或目录

我在watchlist上新开了一个分支,然后用这个分支模拟一个小团队内部的工作,这个团队有两个成员iMac和MacPro。

由于在iMac上的目录里包含了虚拟空间env,因此在同步到github上以后,我发现macpro里也多了env这个目录和其下的所有文件。

显而易见,这造成如下问题

  • 在github网站上,增加了没有任何用处的新目录env
  • 同步更新时,也要更新这些与主程序没有关系的虚拟环境的内容,而且这些虚拟环境的内容似乎更新的频率也挺高(我估计是日志什么的)

因此这个问题是必须要要解决的。

修改iMac的gitignore文件

  1. 首先在gitignore里,增加env目录,确保每次git add . 和git push不会更新这个目录的内容。
  2. 然后,删除已经提交到github上的文件。
  3. 把这些改变,同步到macpro这台电脑上

然后删除已经提交到github上的内容

最后,在macpro这台电脑的对应git目录里,执行git pull
下图就是执行git pull后,在本地删除env目录的情况

reference
使用git rm解决不应该提交的内容

强大的brew

brew doctor

当brew update无法使用时,运行brew doctor,一条条去修改就好。

brew config

Homebrew bottles (binary package) depend on Command Line Tools (CLT) for installation. After an upgrade, CLT should be reinstalled yet it does not mean xcode installation. To check if you have CLT installed?

brew config

If you found CLT: N\A. Follow @carlocab's answer. Run: xcode-select --install, ...

brew -v

检查目录

brew update

brew自身的升级

brew upgrade

各种package的升级

无法升级CLT时候

在公司网络,无法下载command line tools,可以直接从apple官网下载
https://developer.apple.com/download/all/

解决fatal: not in a git directory问题

使用如下命令

git config --global --add safe.directory /opt/homebrew/Library/Taps/homebrew/homebrew-services

参考
https://stackoverflow.com/questions/9329243/how-to-install-xcode-command-line-tools

https://github.com/Homebrew/discussions/discussions/2391

https://blog.csdn.net/qq_20349639/article/details/125069418

Python里的__name__究竟有啥用

由于在Pyhton里,并没有一个类似c或其他语言的main()函数,所以当我们把运行python程序的命令传递给所谓解释器,如CPython,或更常见的基于BSD开发的交互式解释器IPython。

比如,使用flask框架进行web编程:

export FLASK_APP = test1.py

通常,解释器会按照第一个没有缩近的代码来顺序执行。
不过,在执行前,解释器会定义一些特殊的变量,__name__就是这种变量。

如果被执行文件是自己被直接执行,那么解释器就会将__name__设置为__main__;如果被执行文件是被import的,那么__name__就会被设置为导入的模块名。

通过对__name__ 变量的检查,我们就可以知道被执行文件是否是被导入的。

下面举个例子:
一个test1.py的文件

print("test1 __name__ is %s"   %__name__)
if __name__ == "__main__":
    print("test1 is being run directly")
else:
    print("test1 is being imported")

输出结果如下

(venv) *****microblog/test/test1.py
test1 __name__ is __main__
test1 is being run directly

test2.py的文件

import test1

print("test2 __name__ is %s " %__name__)

输出结果如下

(venv) *****/microblog/test/test2.py
test1 __name__ is test1
test1 is being imported
test2 __name__ is __main__ 

flask小技巧

“(venv) $ export FLASK_APP=hello.py
(venv) $ export FLASK_DEBUG=1
(venv) $ flask run”

如下,当设置debug为1,允许reloader和debug两种模式,在reloader模式下,程序会自动检测code里的修改,非常方便的功能。

“(venv) $ flask run --help
Usage: flask run [OPTIONS]

  Runs a local development server for the Flask application.

  This local server is recommended for development purposes only but it can
  also be used for simple intranet deployments.  By default it will not
  support any sort of concurrency at all to simplify debugging.  This can be
  changed with the --with-threads option which will enable basic
  multithreading.

  The reloader and debugger are by default enabled if the debug flag of

Options:
  -h, --host TEXT                 The interface to bind to.
  -p, --port INTEGER              The port to bind to.
  --reload / --no-reload          Enable or disable the reloader.  By default
                                  the reloader is active if debug is enabled.
  --debugger / --no-debugger      Enable or disable the debugger.  By default
                                  the debugger is active if debug is enabled.
  --eager-loading / --lazy-loader
                                  Enable or disable eager loading.  By default
                                  eager loading is enabled if the reloader is
                                  disabled.
  --with-threads / --without-threads
                                  Enable or disable multithreading.
  --help                          Show this message and exit.”

解决公司电脑无法更新问题

公司发的mac book,是m1芯片,但因为数据安全问题,对于部分权限做了限制,如:无法进行系统更新,需要拿到it部门解决。

前几天我打算重启python编程训练,发现无法安装numpy。

过了两天,灵机一动,在虚拟环境下,venv里进行安装

首先激活虚拟环境

 . venv/bin/activate

然后,在虚拟环境下更新pip

  python -m pip install --upgrade pip
  Requirement already satisfied: pip in ./venv/lib/python3.8/site-packages (22.0.4)

最后,安装numpy

  pip3 install numpy  
  Requirement already satisfied: numpy in ./venv/lib/python3.8/site-packages (1.22.3)

退出虚拟环境

  deactivate 

如何做调研

调研的目的很重要,是了解客户的需求、核实自己的假设,还是搜寻证据以推动项目进展。甚至很不严肃的把交流、沟通等等活动统一命名为调研,是很常见的现象。这不仅偏离了调研的实质,而且影响了其他商务活动的正常进行。

衡量一次调研是否成功,可以从多个维度评估,例如著名的5W1H(why,who/whom,what,when,where and how),这6个维度还可以螺旋钻取,why之后接着why,触达问题本质。

去年我刚刚经历一次很糟糕的调研。调研对象是国内排名前列的某人口大县。虽然比不上全国第一人口大县安徽临泉(230万),也没法和脚踢北上广的华夏之都曹县相提并论(人口全国第8)。但是作为2020年刚刚摘掉贫困帽子,以猪大肠作为网红美食的湖南西北门户,这段调研经历还是颇为有趣。

首先,没有明确调研负责人

确定调研负责人,未经过任何讨论,很草率的由区域销售担任。她作为接口人,落实调研对象、落实调研计划和场所这类人物,这是胜任的。但是,要一个销售去策划一个5000万综合交通项目的调研工作,即超出她的能力,也超出其职责范围。

调研过程中,销售的话比调研对象多,比客户还清楚问题答案,而且要和客户抢话。全程处于自问自答的。混乱的局面无人把控,从销售的角度看,与客户的热烈讨论气氛,是良好客户关系的证明;而从一个专业调研负责人的角度看,只有确定、对口的问题与答案,才是调研需要的内容。

没有调研负责人,导致调研团队,不知道调研何时开始、何时结束(达到什么样的效果即可停止)。

其次,没有明确的调研目标

没有明确的调研目标。这次调研实际是来了解需求的,而不是接受一次县域交通业务的培训,更不是拉进客户感情的时候。

最后,没有预定调研问题

尽管临时列了若干问题,但没有调研负责人做全面评估,有些问题显得非常小白,问起来的效果似乎是让客户给我们做一次业务普及培训;还有就是没有提问技巧,什么时候问开放问题,什么时候是封闭问题都没有慎重考虑。


今日封控在家,健身小有心得:开始是最困难的,所以一定要让开始的阻力减少,比如不要开始就在脑袋里构思深蹲45个,或者俯卧撑100个。应该这样开始:站在墙角就是胜利✌️,或铺好瑜伽垫就是胜利✌️,剩下的95%随缘。

84岁格拉斯弹琴庆祝生日

Flask@002

“By default Flask looks for templates in a templates subdirectory 
located inside the main application directory. For the next version of 
hello.py, you need to create the templates subdirectory and store the 
templates defined in the previous examples in it as index.html and 
user.html, respectively.”

Excerpt From
Flask Web Development
Miguel Grinberg
This material may be protected by copyright.

按照狼书的说明,使用templates的好处是,把业务逻辑和代码的呈现逻辑进行了隔离,这样的好处是非常清晰,不会让程序员的思路混乱,当使用git checkout 3a后,检查目录结构如下:

(venv) MDMacPro/Users/madapapa/Study/madapapa.com/flaskr/flaskproject/
flaskygit:(e020af8) [12:20]ls
LICENSE     __pycache__ templates
README.md   hello.py

debug mode

“(venv) $ export FLASK_APP=hello.py
(venv) $ export FLASK_DEBUG=1
(venv) $ flask run”

Excerpt From
Flask Web Development
Miguel Grinberg
This material may be protected by copyright.

通过export FLASK_DEBUG=1开启debug模式,有两个好处

  • reloader模式可以在修改源代码的同时,自动重启服务器,代码的修改结果在运行环境下自动生效,对调试非常友好
  • debugger模式,可以让你的浏览器显示错误信息,不过在生产环境下绝对不能打开这个模式。

template和placeholder

template是包含了响应内容的文件,使用placeholder作为一个变量服务动态部分,这个动态部分包含在请求的文本里。使用实际值来代替变量,并且返回最终响应字符串的过程,就是渲染(rendering),flask使用一个非常强大的模版引擎:Jinja2。

Jinja是日语神庙的意思。

render_template函数

render_template函数使用Jinja2引擎,第一个参数是文件名“index.html”,第二个参数是一个key-values的键值对,其中na是user.html中的参数名称,name1是需要带入的真实参数值。

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/user/<name1>')
def user(name1):
    return render_template('user.html', na=name1)

user.html文件的内容

<h1>Hello, {{ na }}!</h1>

{{na}}这种结构,可以带入各种参数格式,比如字典、列表、方法等等。

“<p>A value from a dictionary: {{ mydict['key'] }}.</p>
“<p>A value from a list: {{ mylist[3] }}.</p>”
“<p>A value from a list with variable index:{{ mylist[myvar] }}.</p>”
“<p>A value from an object's method: {{ myobj.somemethod() }}.</p>”