diff --git a/config/_default/config.toml b/config/_default/config.toml index 73909528..b29c2f65 100644 --- a/config/_default/config.toml +++ b/config/_default/config.toml @@ -1,5 +1,5 @@ # Change baseurl before deploy -baseurl = "https://cornradio.github.io/hugo" +baseurl = "" languageCode = "en-us" paginate = 5 title = "CornRadio-Blog" diff --git a/content/post/abctest.md b/content/post/abctest.md index 40f22350..d1812310 100644 --- a/content/post/abctest.md +++ b/content/post/abctest.md @@ -1,10 +1,10 @@ --- title: abctest # 标题 date: 2024-02-26 00:00:00+0000 # 日期时间,如果时间未到,post 不会显示(注释掉 不显示日期) -# slug: abc # url(注释掉 和标题相同) +slug: abc # url(注释掉 和标题相同) # description: xxxx # 描述小字(注释掉 不显示描述) # weight: 1 # 权重越小,放到越前面 (注释掉 日期排序) -# image: 2.jpg # 头图,注释掉,否则会有一个难看的呃加载不出来的图片 +image: cover.png # 头图,注释掉,否则会有一个难看的呃加载不出来的图片 # tags: # 只能在侧面看到的标签,会显示在文章的底部 # - TAG A diff --git "a/content/post/old/1\345\246\202\344\275\225\345\210\240\351\231\244git\344\270\255\347\232\204\346\211\200\346\234\211\345\216\206\345\217\262\346\226\207\344\273\266.md" "b/content/post/old/1\345\246\202\344\275\225\345\210\240\351\231\244git\344\270\255\347\232\204\346\211\200\346\234\211\345\216\206\345\217\262\346\226\207\344\273\266.md" new file mode 100644 index 00000000..3f09b78a --- /dev/null +++ "b/content/post/old/1\345\246\202\344\275\225\345\210\240\351\231\244git\344\270\255\347\232\204\346\211\200\346\234\211\345\216\206\345\217\262\346\226\207\344\273\266.md" @@ -0,0 +1,49 @@ ++++ +title = "如何删除git中的所有历史文件" +description = "111" +date = 2022-12-03T12:18:50+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "git" +] +series = [] +images = [] ++++ + +# 需要工具 +- gitbash 用于快速操作 +- githubDesktop 用于查看文件历史等 + +# 注意 +此操作不可撤销,如果你的历史记录中有着不想要被删除的重要数据,请务必提前备份。 + +适用情况:清理git文件夹,让git每次clone下来更轻松。有可能项目中留存着一些没有用的垃圾,比如很大的图片、视频等。虽然目前已经删除。但这些内容实际上仍然保留在隐藏的`.git`文件夹中。 + +# 操作 +1. 从git平台下拉目前的全部代码,删除原repo。 + > 删除在repo - settings - dangerzone最下面 + + ![Imgur](https://i.imgur.com/a5zdkEs.png) +2. 进入本地repo,打开gitbash,执行下列指令 + ``` + rm -rf .git + git init + git add . + git commit -m "init" + git status + ``` +3. 使用github desktop检查是否有残留 + ![Imgur](https://i.imgur.com/X3R65UB.png) +4. 重新push repo到git平台 + +> 网上有一些很乱七八糟的方法,又要head,又要forcepush,又要orphan branch之类的,说实话我有些看不懂,我这个方式绝对简单又高效(粗暴rm -rf) 嘿嘿。 +> +## 其他提示 +`insights - traffic` 可以查看到public项目的所有访问记录。数据为0的话不会展示;对于github博客来说,这里还是很有用的。 +![Imgur](https://i.imgur.com/cVjIKyn.png) \ No newline at end of file diff --git a/content/post/old/2021.md b/content/post/old/2021.md new file mode 100644 index 00000000..d18f6de4 --- /dev/null +++ b/content/post/old/2021.md @@ -0,0 +1,50 @@ ++++ +title = "2021" +description = "我的2021(未完待续)" +date = 2021-11-15T23:24:17+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "生活" +] +series = [] +images = [] + ++++ + +# 毕业 + +2021年是我毕业的一年。也是我做了很多事情都失败了的一年。 + +失败事项: + +- 考研 +- 考公 +- 出国做交换项目 + +考研和考公我可以认为是准备不充分所以失败了,出国的话是担心疫情而且家里经济条件也没有那么可以……所以最终在大四毕业的时候,我面临两个选择:1 回家继续准备考研 2 直接开始工作 + +在大四准备考研的时候,我感觉自己实际上也付出了很多,花了很多时间学习、英语和政治考的都不错,可惜我的数学和专业课分数不太行,数学甚至没有及格。真的是超垃圾呢--后来总结下来我也没什么好说的,首先是之前没有做好准备,都已经到了夏天才堪堪开始准备,并且我的内心里面不是很想考研。 + +时间线是这样的 + +``` +|-2020.7-----2020.9-----2020.12-----2021.2------2021.3-----2021.4------2021.5-----2021.7----至今-| + 准备考研 考研报名 考研考试 考试出结果 准备考公 考公考试 工作实习 正式入职 工作数个月 +``` + +这个短短的时间里面我准备了两场大考试,准备不充分、再加上考试难度是较高的,所以结果不好是在我的预见范围之内的。找工作的话就比较神奇了,我一开始面试了一些开发的地方,我感觉他们的办公环境都不太好,而且面试的时候我当时还没有出考公成绩,而且心里还是想着继续准备考研二战,所以就没有面试成,到后面我也是差不多的心态,并没有相信有什么成功的面试的来着。这个入职可以说是偶然的巧合,或者是冥冥中的选择吧。 + +在实习的时候,我每天都要坐地铁坐好远,到这里(我现在就在单位附近租房子住了)每天都要花费两个小时在地铁上。 + +其实多少有点在手机上面的新闻的关系,说什么程序员中年危机呀,什么35岁被辞退,在被辞退之前就是人肉干电池从9点干到晚上12点呀,总之我怕了,我怕我变成一个麻木的只有工作的人,我也怕在我中年的时候突然天降一口大锅让我失去生活资金的来源;而且我还有一点,我怕我喜爱的打代码变成了我最厌烦的事情。所以我找工作的时候并没有往开发的方向去找,而是去找了一些和开发不是非常强相关的--比如现在:网络安全等级保护测评师。 + + + + + diff --git a/content/post/old/2022.md b/content/post/old/2022.md new file mode 100644 index 00000000..fa111a8e --- /dev/null +++ b/content/post/old/2022.md @@ -0,0 +1,62 @@ ++++ +title = "2022" +description = "" +date = 2022-01-04T21:31:54+08:00 +featured = false +draft = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "" +] +series = [] +images = [] + ++++ + +2022年的第一个帖子! + +今年的元旦我老妈从黑龙江过来看我。 + +在这之前,我一直有点嘴巴上火还是什么的,有好几个大大的溃疡,非常疼! + +直到31号,我妈到了这边,我早上从公交站把她接过来,看看我住的小房间。 + +第一天,是周五,我去上班,我妈在家里就收拾了屋子。我中午的午休的时候领着她去吃了一下我常吃的菜馆,结果她说好难吃呀!还那么贵,我平常到也都习惯了,没有感觉啥。 + +晚上开始,我妈给我做了一堆好吃的,小凉菜和红烧肉啥的。都是我爱吃的东北菜,然后教我自己做饭啥的。还把这边的洗手池什么的擦得亮晶晶的,非常干净! + +跨年夜的晚上我们挤在我的不大不小的双人床上,两个厚被子把整个床弄得非常拥挤。 + +这几天我大饱口福,反而体重还下降了一点。确实是不要吃外面的垃圾东东了。虽然会费时间一些,以后多多少少我也要自己做点菜啥的了。毕竟这次过来之后她还给我买好了调料,放好了电饭锅的位置啥的。以后我也不至于只有食用盐和酱油做菜吃了。 + +短短三天一下子就过去了。我在今年要考证书,cisp和等保初级必须考掉。 + +然后升级下工资,换个有自己卫生间和厨房的地方。 + +控制一下饮食*米饭啥的,重量控制控制。已经不能再继续重下去了~~~ + +--- + +今天4号,是第一天节后上班。 + +一早上我起床我妈就弄好了吃的,饺子和紫菜汤。吃完了就出去挤地铁了。 + +白天扫描扫描漏洞、看了个机房整理了下记录表一天就结束了。 + +晚上回家也有好吃的等着我,到家就吃饭了!开心。 + +--- + +倒也不一直非常愉快啦,有时候会有烦人的唠叨和半夜的扰人呼噜声。不过总的来说,我妈过来一趟我还是很开心的! + +过年回家的机票实在是太贵了,我感觉还有怕疫情影响啥的,所以今年就没有买票呢,也没有决定到底是否回家过年去。 + +感觉最快乐的就是在我一边打游戏,我妈妈在那里做饭,然后我打完了一起吃个饭了。 + +吃完饭在出去遛弯,最后再去休息一下,刷刷手机。最棒的日子。 + diff --git a/content/post/old/2023-01-05-Django-1.md b/content/post/old/2023-01-05-Django-1.md new file mode 100644 index 00000000..012f6121 --- /dev/null +++ b/content/post/old/2023-01-05-Django-1.md @@ -0,0 +1,577 @@ ++++ +title = "Django-tutorial 1" +description = "" +date = 2023-01-16T16:51:26+08:00 +featured = false +comment = true +reward = true +categories = [ + "" +] +tags = [ + "python","django" +] +series = [] +images = [] ++++ +Django 是一个 使用python作为后端语言的框架。 +学习 Django 源于我想要让我的 jandan 脚本可以提供在线服务…… 没想到这个东东这么复杂, 亏了呀! + +## 安装Django +https://docs.djangoproject.com/zh-hans/4.1/intro/install/ +如果在系统范围安装,安装前需要先装好python3.x。 +官方教程还建议使用venv虚拟环境的方式,不过我一直弄不太懂venv,就不尝试了。 +``` +python -m pip install Django +``` + +检查是否安装成功: + +``` +python -m django --version +``` + +## 新建项目 +### 创建 + +``` +django-admin startproject mysite +``` +项目会创建一个如下图的目录,关于这些文件都是干啥的可以参考这个链接: +https://docs.djangoproject.com/zh-hans/4.1/intro/tutorial01/ + +实际上一般只有 `urls`、`settings` 两个文件大概会用到 + +### 启动 + +启动项目,我们只要运行刚才生成的`manage.py` + +``` +python manage.py runserver +``` + +[http://127.0.0.1:8000/](http://127.0.0.1:8000/) 打开看看吧! + +可以通过下面的命令来自定义端口 + +``` +python manage.py runserver 8080 +``` + +刚才我们创建了一堆 `python` 文件,可以在运行时热重载,但如果添加了新文件,就要重新启动 `manage.py` 了。 + +## 新建APP + +### 创建投票应用 + +进入 `manage.py` 目录 + +刚才创建的是 `django` 的基础架构,我们现在添加一个 `polls app` (投票应用),自己添加 `app` 的时候可以随便命名。 + +``` +python manage.py startapp polls +``` + +### 创建视图 + +要在 `polls` 应用下面创建一个视图,`http://127.0.0.1:8000/polls/index` + +需要修改两个文件:`views.py` & `urls.py` + +在`views.py` + +```python +from django.http import HttpResponse + +def index(request): + return HttpResponse("Hello, world. You're at the polls index.") +``` + +`polls/urls.py`还不存在,新建一个`urls.py`如下: + +```python +from django.urls import path +from . import views + +urlpatterns = [ + path('', views.index, name='index'), +] +``` + +还要去`mysite/urls.py` ,指向一下这个新建的 `polls/urls.py` 。 + +(可以理解为这个是管根目录的,我们刚才那个是管`/polls`目录的) + +```python +from django.contrib import admin +from django.urls import include, path + +urlpatterns = [ + path('admin/', admin.site.urls), + path('polls/', include('polls.urls')), +] +``` + +然后访问: http://127.0.0.1:8000/polls/ 就可以了。 + +> 逻辑上,django 先请求 `mysite/urls.py` ,指向了 `polls/urls.py` 再指向 views.py 文件返回 respond 。 + +### path函数 + +函数 [`path()`](https://docs.djangoproject.com/zh-hans/4.1/ref/urls/#django.urls.path "django.urls.path") 具有四个参数, + +- 两个必须参数:`route` 和 `view` , 路径 / 对应的 py 函数 +- 两个可选参数:`kwargs` 和 `name`。传参用 / 全局引用、模板使用。 + +这部分我觉得官网讲的非常清晰简洁(再页面最下方): https://docs.djangoproject.com/zh-hans/4.1/intro/tutorial01/ + +## 设置-时区 + +时区在后面数据库中非常有用(比如数据插入时间), 推荐先设置成正确的时区。 + +在 `settings.py` 中修改这个 + +``` +TIME_ZONE = 'UTC' #美国时间(默认) +TIME_ZONE = 'Asia/Shanghai' #中国时间 +``` + +设置参考(这个网站包含所有的 `settings.py` 的项) +https://docs.djangoproject.com/zh-hans/4.1/ref/settings/#std-setting-TIME_ZONE + +## 设置-数据库 + +### 生成数据表 + +这个语句自动创建 `INSTALLED_APPS` 中的表。 + +```sh +python manage.py migrate +``` + +### 基础知识 + +数据库的配置在 `mysite/settings.py` 中,如下所示,可以使用各种数据库: + +``` +'django.db.backends.sqlite3' +'django.db.backends.postgresql' +'django.db.backends.mysql' +'django.db.backends.oracle' +``` + +默认使用sqlite,其他的可以看文档: https://docs.djangoproject.com/zh-hans/4.1/ref/settings/#std-setting-DATABASES + +下面是默认配置: + +```python +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', #换数据库修改这里 + 'NAME': BASE_DIR / 'db.sqlite3', + } +} +``` + + +django 提供一些自带的 APP,可以在 settings.py 里面看到 , 迁移时会自动根据已经安装的APP来创建数据表。: + +```python +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] +``` + +### 创建模型 + +上面 `INSTALLED_APPS` 能生成的数据表,不包括我们新创建的 `polls` APP ,这里开始逐步把它加入 + +需要创建两个模型:问题 `Question` 和选项 `Choice`。 +- `Question` 问题 +- `Choice` 选项和当前得票数,连接到`Question` + +修改 `polls/models.py`,内容如下: + +```python +from django.db import models + +class Question(models.Model): + question_text = models.CharField(max_length=200) #问题内容 + pub_date = models.DateTimeField('date published') #问题发布时间 + +class Choice(models.Model): + question = models.ForeignKey(Question, on_delete=models.CASCADE) #外链到问题 + choice_text = models.CharField(max_length=200) #选项内容 + votes = models.IntegerField(default=0) #选项票数 +``` + +- 主键(IDs)会被自动创建 +- 表名首字母大写 +- 字段小写英文,下划线相连 + +通过这个`polls/models.py`,django 可以得到创建数据库的信息。 + +我们需要把自己的app也加入`mysite/settings.py` 的`INSTALLED_APPS`列表中: + +```python +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'polls.apps.PollsConfig', #这一行 +] +``` + +### 激活模型 + +这个步骤是下面的创建表的前置步骤 + +运行 `makemigrations` 命令,Django 会检测你对模型文件的修改,在 `polls/migrations` 生成数据库表的 `schema` ,Django 通过`schema` 来创建数据表。我们刚才创建了 `polls/models.py` , 用这个语句“激活”它。 + +```shell +python manage.py makemigrations polls +``` + +(迁移用)生成建表语句,会根据你在 `mysite/settings.py`中选择的数据库种类,输出对应的建表语句: + +``` +python manage.py sqlmigrate polls 0001 +``` + +再次生成数据表 + +``` +python manage.py migrate +``` + +### 模型 的 `__str__` 函数 + +> 给模型增加`__str__`函数,在后面使用 python shell 添加数据时,可以更轻松的看懂、更易读。 + +给`polls/models.py`新增两个`def __str__(self):` + +```python +from django.db import models + +class Question (models.Model): + question_text = models.CharField(max_length=200) + pub_date = models.DateTimeField('date published') + def __str__(self): + return self.question_text + +class Choice(models.Model): + question = models.ForeignKey(Question,on_delete=models.CASCADE) + choice_text = models.CharField(max_length=200) + votes = models.IntegerField(default=0) + def __str__(self): + return self.choice_text +``` + +再添加一个`was_published_recently(self)`函数,可以给Question增加一个“最近发布”的功能: + +```python +from django.utils import timezone + +class Question(models.Model): + ... + def was_published_recently(self): + return self.pub_date >= timezone.now() - datetime.timedelta(days=1) +``` + +去 py shell里面看一下,刚刚写的函数有没有效果 + +```sh +python manage.py shell +``` + + +```python +from polls.models import Choice, Question +Question.objects.all() +#]> + +q = Question.objects.get(pk=1) +q.was_published_recently() +## True +``` + +## 尝试数据库API + +下面的语句都是在py shell中执行的 + +``` +python manage.py shell +``` + + `manage.py` 会设置 [`DJANGO_SETTINGS_MODULE`](https://docs.djangoproject.com/zh-hans/4.1/topics/settings/#envvar-DJANGO_SETTINGS_MODULE) 环境变量,这个变量会让 Django 根据 `mysite/settings.py` 文件来设置 Python 包的导入路径,(我发现这个python shell 有补全功能) + +### 增加条目 + +通过python 语句 增加条目,首先要引入我们刚才写的models + +```python +from polls.models import Choice, Question +``` + +新建一个 question,并保存到数据库中 + +```python +from django.utils import timezone #需要用到时区获取时间 +q = Question(question_text="What's new?",pub_date=timezone.now()) +q.save() #把新建的q实例存储到数据库中 +``` + +查看当前 Question 表所有的内容,看看是否添加成功 + +```python +Question.objects.all() +``` + +### 增加条目关联条目 + +给 question 增加 choice ,一般来说可以先给 choice 表增加一行,再绑定 question ,但是 django 推荐你使用下面这种方式。 + +> 通过 `q.choice_set.create` 创建 `choice`。 + +通过问题 id=1 获取 question + +```python +q = Question.objects.get(pk=1) +``` + +查看目前关联的所有 choice + +```python +q.choice_set.all() +``` + +增加一些choice + +```python +q.choice_set.create(choice_text='choice 1', votes=0) +q.choice_set.create(choice_text='choice 2', votes=0) +``` + +可以给新增加的 choice 赋值给对象 c + +```python +c = q.choice_set.create(choice_text='Just hacking again', votes=0) +``` + +通过 c 可以反向找到 question + +```python +c.question +# +``` + +查看所有的 choice 、 查看 choice 个数 的内置函数 + +```python +q.choice_set.all() +#, , ]> +q.choice_set.count() +#3 +``` + +### 删除条目 + +删除内容为 “Just hacking” 开头的 choice 。 + +```python +c = q.choice_set.filter(choice_text__startswith='Just hacking') +c.delete() +``` + + +### 查看字段内容 + +先选取一个问题(id = 1) + +```python +q = Question.objects.get(pk=1) +``` + +使用 python 访问他的字段内容 + +```python +q.id +q.question_text +q.pub_date +``` + +### 修改字段内容 + +```python +q.question_text = "What's up?" +q.save() +``` + +### 更多的查询API + +`all`、`filter` 返回列表、 `get` 返回一条 + +all 查看表中所有项目 + +```python +Question.objects.all() +``` + +get 查询,使用 get 返回的是单个元素, + +```python +Question.objects.get(pk=1) #pk会默认匹配表的主键,这里是id +``` + +filter 获取指定 id + +```python +Question.objects.filter(id=1) +``` + +filter 通过前缀过滤 ,使用 filter 会返回 列表 + +```python +Question.objects.filter(question_text__startswith='What') +``` + +filter 查询高级用法(查询最近一年的) +> filter 支持使用双下划线查询子内容: +> 比如这里使用 `choice.question.pub_date.year` 与 `current_year` 做比较 + +```python +from django.utils import timezone +current_year = timezone.now().year +Choice.objects.filter(question__pub_date__year=current_year) +``` + +## Admin 管理页面 + +django 可以给数据库自动生成管理页面(太棒啦!) + +创建一个用户 , 用于登陆管理页面 + +```sh +python manage.py createsuperuser +``` + +启动 + +``` +python manage.py runserver +``` + +但是里面没有我们创建的polls 应用!需要修改 `polls/admin.py` + +```python +from django.contrib import admin +from .models import Question,Choice +admin.site.register(Question) +admin.site.register(Choice) +``` + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230101231702.png) + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230101233249.png) + +## view 视图 + +在上面“新建APP”章节已经讲过了 创建视图,但是仅能返回简单的字符串。 + +### `views.py` + +在`polls/views.py`增加三个function,代表三个页面,投票详情、投票结果、投票动作。 + +```python +def detail(request, question_id): + return HttpResponse(f"You're looking at question {question_id}." ) + +def results(request, question_id): + return HttpResponse(f"You're looking at the results of question {question_id}.") + +def vote(request, question_id): + return HttpResponse(f"You're voting on question {question_id}." ) +``` + +函数写法: +- 在 `urls.py` 中会引用其函数名。 +- 至少包括 `request` 参数, +- 必须返回 `HttpResponse`对象 +- 可以加上自定义参数,比如这里的`question_id`作为输入。 + +### `urls.py` + +修改文件: `polls/urls.py` + +增加三个路由,`/id`投票详情、`/id/results`投票结果、`/id/vote`投票动作。 + +```python +from django.urls import path + +from . import views + +urlpatterns = [ + #ex: /polls/ + path('', views.index, name='index'), + #ex: /polls/5/ + path('/', views.detail, name='detail'), + #ex: /polls/5/results/ + path('/results/', views.results, name='results'), + #ex: /polls/5/vote/ + path('/vote/', views.vote, name='vote'), +] +``` + +参数: +- url 路径 +- 绑定的函数名称 +- 用于联动模板的 name (可以省略) +如果是有参数的 url 路径,末尾的斜杠不能删 + +### HTML 模板 + +我们要把 index 修改一下,让他显示最新的五个问题,并且能跳转到问题细节。 + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230117170352.png) + +在`polls` 下创建一个 `templates/polls` 文件夹,在里面新建一个 `index.html` + +```html +{% if latest_question_list %} + +{% else %} +

No polls are available.

+{% endif %} +``` + +> 这里为了代码简短,展示核心代码功能,未为添加完整的 html 结构和 css ,这些都是很好修改和添加的。 + +然后更新一下 `views.py` , 让他使用这个模板 + +```python +from .models import Question + +def index(request): + latest_question_list = Question.objects.order_by('-pub_date')[:5] + template = loader.get_template('polls/index.html') + context = { + 'latest_question_list': latest_question_list, + } + return HttpResponse(template.render(context, request)) +``` + +- 用 `数据库api` 来获取 `list` ,选取最新的 +- 用 `context` 将 `latest_question_list` 传递给 HTML 模板 +- 用 `render` 方法生成 `HttpResponse` \ No newline at end of file diff --git "a/content/post/old/2023-01-05vscode\346\212\200\345\267\247.md" "b/content/post/old/2023-01-05vscode\346\212\200\345\267\247.md" new file mode 100644 index 00000000..b8d34abc --- /dev/null +++ "b/content/post/old/2023-01-05vscode\346\212\200\345\267\247.md" @@ -0,0 +1,75 @@ ++++ +title = "vscode技巧" +description = "" +date = 2023-01-05T16:38:27+08:00 +featured = false +draft = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "vscode" +] +series = [] +images = [] ++++ +# csharp 程序不能输入 + +用vscode运行csharp默认使用的terminal是不支持输入的,输入没反应 + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230103144139.png) + +需要修改 launch.json 增加这两行我估计是关闭了什么东西,并且调用系统的terminal,具体就不懂了。 + +```json +"configurations": [ + { + // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + }, +``` + +# Inlay hints + +这个东西会在你的变量前面提示变量的类型、提示形参名称等,打开的话就代码看起来非常长。 +类似图片中这样: + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230103155204.png) + +所以我用这个“快捷键启用”模式,当我按下`option + ctrl`的时候才会显示这些提示 + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230103151454.png) + +# snippets +cmd + P 搜索 `>snippet` +可以新建一个全局的代码片段文件,默认提供了配置示例 + +```json +"console ReadLine": { //提示中会显示的全名 + "scope": "csharp", //仅在csharp代码中显示 + "prefix": "cr", //输入cr触发 + "body": [//要输入的代码本体,支持多行但很麻烦,$1,$2等标注位置可以进行快速修改 + "Console.ReadLine();" + ], + "description": "Log output to console"//提示中会显示的详细解释 +}, +``` + +可以用这个网站: https://snippet-generator.app + +是某个大佬专门给vscode写snippet开发的,代码粘进去,body部分的多行就会自己转换了,还有引号什么的都会自己转换。 + +# Vibrancy Continued +这是一个vscode插件,会让你的vscode拥有毛玻璃效果。 + +默认毛玻璃效果是整个窗体都是半透明,我个人觉得类似mac那种边栏半透明效果比较酷,可以在这里设置: + +注意毛玻璃插件开启后 vscode会觉得自己损坏,不要管他。 + +而且这个插件虽然声称自己仅支持 默认的 Dark + 主题,但是实际上商店里面的xcode主题也可以用。 + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230105164623.png) \ No newline at end of file diff --git a/content/post/old/2023-01-06-Regex.md b/content/post/old/2023-01-06-Regex.md new file mode 100644 index 00000000..dc18b7d6 --- /dev/null +++ b/content/post/old/2023-01-06-Regex.md @@ -0,0 +1,252 @@ ++++ +title = "Regex 101" +description = "" +date = 2023-01-06T16:10:14+08:00 +featured = false +draft = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "regex" +] +series = [] +images = [] ++++ + +最近工作终于闲了下来,可以上班研究代码。遇到一些需要正则表达式的编程问题,无法解决所以决定个学一下。 + +[Regex 101 - ZH-CN (regexlearn.com)](https://regexlearn.com/zh-cn/learn/regex101) + +[Regex Learn - 练习场](https://regexlearn.com/zh-cn/playground) + +[Regex Learn - cheatsheet](https://regexlearn.com/zh-cn/cheatsheet) + +[练习题](https://regexone.com/lesson/capturing_groups?) + +## 简单 + +匹配单词 + +he is in `black`. + +``` +black +``` + +`.` 允许匹配任何字符,包括特殊字符和空格 + +`A` `B` `C` `D` `E` + +``` +. +``` + +肯定字符集 `[abc]` 匹配字母可以用`[a-z]` 匹配数字可以用`[0-9]` 或者 `\d` + +`bar` `ber` `bir` `bor` `bur` + +``` +b[aeiou]r +``` + +否定字符集`[^abc]` + +`bar` ber bir `bor` `bur` + +``` +b[^ei]r +``` + +字母范围`[a-z]` + +## 重复`? + *` + +`?` 加在字母后代表出现0次或1次 + +`color`, `colour` + +``` +colou?r +``` + +`+` 加在字母后代表出现1次或多次 + +br `ber` `beer` + +``` +be+r +``` + + `*` 加在字母后代表出现0次或多次 + +`br` `ber` `beer` + +``` +be*r +``` + + +## 大括号 + +`{x}`加在字母后代表出现x次 + +ber `beer` beeer beeeer + +``` +be{2}r +``` + +`{n, }`加在字母后代表出现n到正无穷次,类似集合,`[n,∞)` + +ber beer `beeer` `beeeer` + +``` +be{3,}r +``` + +## 分组`()` + +分组可以只抓取匹配到的字符中的一部分。(通常也可以全都获取到再replace) + +`file_record_transcript`.pdf + +``` +(.*).pdf$ +``` + +在python种可以这样使用 + +```python +import re +txt = "The rain in Spain.pdf" +x = re.match("(^The.*).(pdf)$", txt) +print(x.group(1)) #The rain in Spain +print(x.group(2)) #pdf +``` + +--- + + +`()` 分组可以把上面的重复符号给组用。而不只是一个字母。 + +`\1`,`\2` 分组引用,可以把组像变量一样引用。第一组就是`\1` + +`ha-ha,haa-haa` + +``` +(ha)-\1,(haa)-\2 +``` + +像当于是: + +``` +(ha)-(ha),(haa)-(haa) +``` + +`(?: )`: 非捕获分组 (不能被引用) + +`ha-ha,haa-haa` + +``` +(?:ha)-ha,(haa)-/1 +``` + +## 转义字符 \ + +`{ } [ ] / \ + * . $^ | ?` 如果要这些特殊字符,需要在前面加上反斜杠匹配 + +## 匹配开头 `^` + +`1`. 3 eggs, beaten + +`2`. 1 tsp sunflower oil + +`3`. 1 tsp butter + +``` +^[0-9] +``` + +## 匹配尾巴 `$`  + +html.html.html-da-sdf`html` + +``` +html$ +``` + +## 匹配字符 `\w` + +字母、数字和下划线 `\w`,其他各种不在这范围内的 `\W` (匹配中文和中文标点可以使用`\W`) + +数字`\d`,非数字`\D` + +空白符`\s`,非空白`\S` + +## Lookarounds + +官方中文翻译:零宽断言,我觉得这个翻译真的是误导人,“断言”:极其肯定地说,断言你妈,还零宽,就不说人话是吧。 +应该叫:附近匹配/左右匹配。 + +其实我觉得如果后缀前缀不变的话,可以吧这段比如`3PM`一起给match出来,然后再replace `PM` 就可以了,比这个奇怪的语法看起来要好一些。 + +看看后面(指定尾缀) + +Date: 4 Aug `3`PM + +``` +\d+(?=PM) +``` + +后面不要!(指定不要的尾缀) + +Date: `4` Aug 3PM + +``` +\d+(?!PM) +``` + +看看前面 + +Product Code: 1064 Price: $`5` + +``` +(?<=\$)\d+ +``` + +前面不要! + +Product Code: `1064` Price: $5 + +``` +(? 我已经想要把我的小工具打包成单个程序很久了。但是一直不知道怎么操作 +> +> 今天看到reddit里面给我推送:[how_to_build_my_console_app_as_single_exe_file](https://www.reddit.com/r/csharp/comments/107juxi/how_to_build_my_console_app_as_single_exe_file/) +> +> 但是进去看了一圈都是垃圾回答,所以我自己研究了一下(因为也确实需要) +> +> 最后在youtube视频评论里找到了答案。 +> +> 使用了 dotnet 命令行,官方文档在这里: +> https://learn.microsoft.com/zh-cn/dotnet/core/tools/dotnet-publish + +# 打包方法 + +1. 用vs2019 + 打开你的项目 +2. 打开视图 - 终端 +3. 输入需要的命令,有两种 + +打包成单个文件的命令: + +``` +dotnet publish -r win-x64 -p:PublishSingleFile=True --self-contained false --output "C:\abc" +``` + +打包成单个文件(带.net core环境)的命令: +> 包比较大,但是兼容性会好,因为不需要客户端安装环境 +> 我没有测试过.net frame work的打包功能,据说那个不能连同环境一起打包 + +``` +dotnet publish -r win-x64 /p:PublishSingleFile=true /p:IncludeNativeLibrariesForSelfExtract=true /p:PublishTrimmed=true --output "C:\abc" +``` + +--- + +打包这里面的 pdb 文件可以删除,他是用来调试的 + +可以看出来那个带了环境的的打包文件就大很多。 + +我用 windows sandbox 测试了,真的有用,sandbox 里面没有安装过.net环境也可以运行那个带环境的打包版本。 + +![示例图](https://raw.githubusercontent.com/cornradio/imgs/main/20230110174158.png) \ No newline at end of file diff --git a/content/post/old/2023-01-16-Docker.md b/content/post/old/2023-01-16-Docker.md new file mode 100644 index 00000000..fff70e7c --- /dev/null +++ b/content/post/old/2023-01-16-Docker.md @@ -0,0 +1,234 @@ ++++ +title = "Docker" +description = "" +date = 2023-01-16T14:25:02+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "Docker" +] +series = [] +images = [] ++++ + +要想使用docker,需要正确的了解一些基础信息,比如 image 是啥、容器是啥、 docker hub 是啥 、 为什么pull等等,我这里先给出一些简单的解释,但是详细可能还是得亲身体验才能理解: +- image 镜像,可以pull镜像然后运行它 +- 容器 ,运行中的 image 我们叫它 容器,类似虚拟机,但是更轻量级。 +- docker hub , docker的官方 image 仓库,在这里我们可以下载到很多别人做的 image 来使用 + +## 总结/常用命令 + +完成了以上的tutorial,我感觉自己对docker已经有了初步的了解,可以正常使用它了。 + +查看一下本地现有的 image + +```sh +docker image ls +``` + +启动 getting-started 镜像,后台模式,映射 3000 端口, + +```sh +docker run -dp 3000:3000 getting-started +``` + +🌟 查看运行中的容器 + +```sh +docker ps +docker ps -a #包括未运行的 +docker ps -s #显示大小 +docker ps -q #仅显示容器id +``` + +🌟 进入容器(选择bash 、 sh 、 zsh、cmd ,看容器内部基于什么操作系统) + +``` +docker exec -it sh +``` + +- `-i` 交互模式 +- `-t` 终端 + +启动容器 + +```sh +docker start +``` + +停止容器 + +```sh +docker stop +docker kill #强行退出 +``` + +删除容器(删除前需要先停止容器) + +```sh +docker rm +docker rm -f #强制删除 +``` + +查看端口映射(正在运行的容器) + +```sh +docker port +``` + +查看运行状态(cpu、内存实时使用情况等) + +``` +docker container stats +``` + + +## install + +### windows +1. 安装好wsl(在win商店搜ubuntu) +2. 下载docker : [docker](https://www.docker.com) +3. 卡在starting的解决办法: + +使用管理员权限的 powershell: + +``` +net stop com.docker.service +net start com.docker.service + +wsl --unregister docker-desktop +wsl --unregister docker-desktop-data +``` + +## 1-把应用程序容器化 + +https://docs.docker.com/get-started/02_our_app/ + +Docker Hub 是一个官方网站,上面可以下载很多 images。 + +运行中 image 的叫做 container (容器),他们运行的时候都是和你的电脑隔离的,就好像开了一堆小号的虚拟机。 + +而实际上,在docker hub 下载的 images 是别人打包好的应用程序,比如 dvwa (渗透靶场)、oracle 11g 等,在第一个教程里,我们要自己把本地的示例 Node.js 程序变成一个容器。 + +## 下载程序 + +``` +git clone https://github.com/docker/getting-started.git +``` + +## Dockerfile + +本教程是 Node js 的构建,其他的也可以参考官方教程写 `Dockerfile` , 比如 `python` +https://docs.docker.com/language/python/build-images/ + +我们关注 `getting-started/app` 这个目录,在这个目录下创建一个 `Dockerfile` 文件,并编辑内容如下: + +```dockerfile +## syntax=docker/dockerfile:1 +FROM node:18-alpine +WORKDIR /app +COPY . . +RUN yarn install --production +CMD ["node", "src/index.js"] +EXPOSE 3000 +``` + +> 指示构建器从`node:18-alpine` `image` 开始。但是,由于机器上没有它,Docker 需要下载 image。 +> `Docker` 下载 `image` 后,根据 `Dockerfile` 中的说明把整个目录的文件复制到您的应用程序中,并使用`yarn`安装应用程序的依赖项。`CMD` 指令指定从此映像启动容器时要运行的默认命令。 + +- `FROM` 定义基础 image ,`Dockerfile` 必须以 `FROM` 开头。 +- `WORKDIR` 是为后续命令提供执行目录,如 `COPY`、 `RUN`、 `CMD` ,如果没有指定,默认工作目录是 `/`。 +- `COPY` 指令从 `` 复制新文件或目录,并将其添加到路径 `` 的容器文件系统中,这里 `src` 和 `dest` 都是 `.` 。 +- `RUN` 执行 shell 命令,`FROM` 是 `windows` 的话就是执行 `cmd`。 +- `CMD ["executable","param1","param2"]` +- `EXPOSE` 把容器内部的端口开放到外部,也可以指定 tcp 、 udp , 但无论 `EXPOSE` 设置如何,您都可以在运行时使用`-p` 标志覆盖它们,如 `docker run -p 80:80` + +``` +EXPOSE 80/tcp +EXPOSE 80/udp +``` + +## 构建容器 image + +还是回到 `getting-started/app` 目录,执行: + +```sh +docker build -t getting-started . +``` +- `-t getting-started` 给镜像设置一个昵称。 +- `docker build . ` 在当前目录下寻找 `Dockerfile` 。 + +## 启动容器 + +```sh +docker run -dp 3000:3000 getting-started +``` + +- `-d` 标志在“分离”模式下(在后台)运行新容器 +- `-p` 标志在主机的端口`3000`和容器的端口`3000`之间创建映射 + +打开您的网页浏览器到[http://localhost:3000](http://localhost:3000/)。您应该会看到您的应用。 + +## 修改和更新image + +修改和更新这里还是不包含原数据的 + +修改文件: `app/src/static/js/app.js` +修改第 56 行 ,把 `No items yet! Add one above!` 修改成你的字符串。 + +然后重新 build + +``` +docker build -t getting-started . +``` + +> ps 我在这里失败了好多次,我把原来的 image 删除之后才build 成功 + +重新启动一个容器 + +``` +docker run -dp 3000:3000 getting-started +``` + +## 停止和删除容器 + +- `docker ps`命令获取容器的ID +- `docker stop `命令停止容器 +- `docker rm ` 删除容器 + +## 分享 image + +经过刚才的操作,我们已经成功的制作了一个自己的 image , 现在我们看看怎么把它分享到 docker hub。 + +首先得登陆一下 https://hub.docker.com + +``` +docker login -u +``` + +查看一下本地现有的 image + +``` +docker image ls +``` + +给 getting-started 增加 `tag` 方便推送 + +``` +docker tag getting-started /getting-started +``` + +推送 image + +``` +docker push /getting-started +``` + +## 最佳实践 + +关于如何让 docker 文件尽量更小、怎么让数据永久保存等内容,参考: https://docs.docker.com/develop/dev-best-practices/ \ No newline at end of file diff --git a/content/post/old/2023-01-29MrGaoMsMo.md b/content/post/old/2023-01-29MrGaoMsMo.md new file mode 100644 index 00000000..e52616e8 --- /dev/null +++ b/content/post/old/2023-01-29MrGaoMsMo.md @@ -0,0 +1,60 @@ ++++ +title = "喜欢的老高视频|老高與小茉视频推荐" +description = "" +date = 2023-01-29T23:37:58+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "" +] +series = [] +images = [] ++++ + +[老高與小茉 Mr & Mrs Gao](https://www.youtube.com/@laogao) 在我感觉人生无聊的时候给了我新的观点和信念! + +我还记得我第一个看到的是“29号宇宙”,讲述的是一个养老鼠实验模拟人类社会。 + +我喜欢看的类型: + +- 寿命、基因、奇特的地球生物 +- 灵魂、濒死经历、轮回、死后世界、精神分裂、心理学 +- 外星人、地底人、古代高科技人类文明、 +- 圣经、希腊神话、中国古神话、、苏美尔人 +- 极端地理环境、沙漠、金字塔、南北极 +- 特斯拉、图灵、马斯克等超级牛的任务专辑 + +--- + +- [女科学家的三次濒死体验](https://www.youtube.com/watch?v=3QS5hyXpNyw&t=35s) 濒死体验 +- [南極和北極,地球上最不可思議的兩個地方](https://www.youtube.com/watch?v=jSSIeOlIqu0) 南极空洞和外星人 +- [共济会和光明会](https://www.youtube.com/watch?v=RF8dbGVvycY) 古老的石匠组织 +- [曼德拉效应](https://www.youtube.com/watch?v=5x9mNMnG9lY) 可能是平行宇宙~ +- [癌症悖論,鯨魚超長壽命的秘密](https://www.youtube.com/watch?v=hVmNVv83FEs) 鲸鱼竟然不会得癌症! +- [類人,黑猩猩為什麼像人卻永遠無法成為人](https://www.youtube.com/watch?v=A-adUADPCFI&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=2) 进化论 +- [“我”其實根本不存在,“被動意識”假說](https://www.youtube.com/watch?v=vu1H39yi1Pc&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=4) 群体潜意识 +- [人爲什麽一定要死?其實“不死”比“死”更為可怕](https://www.youtube.com/watch?v=AK4l017rTt4&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=6) 基因和寿命 +- [ 【震撼】瀕死體驗中看到好多人在排隊,領取一樣非常重要的東西](https://www.youtube.com/watch?v=2V9tF2ngPn8&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=8) 濒死体验 +- [地球上最常見的外星人,蟲](https://www.youtube.com/watch?v=VJtGz1XTQDE&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=13) 虫子就像是完全另一个星球的物种对不对…… +- [沒想到居然是上海](https://www.youtube.com/watch?v=hFKSeFjTZM4&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=17) 轮回和前世记忆 +- [過去可以被改變的真正原因,被討厭的勇氣](https://www.youtube.com/watch?v=5cZxZCbcOQw&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=21) 阿德勒心理学--世界上没有心理创伤 +- [世界正在無限循環,你要做的只有這件事](https://www.youtube.com/watch?v=QfJG_Yoy2sM&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=23) 尼彩心理学:永恒轮回:强大的心 +- [二十分鐘講完宇宙的一生,從一切的開始到結束](https://www.youtube.com/watch?v=iMntG5KjUmM&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=24) 宇宙的诞生:大爆炸和宇宙背景辐射 +- [雖然被警告不要說】但是我還是決定公開這一期](https://www.youtube.com/watch?v=QMsbQ97Ah_M&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=27) 孟照国事件--中国的外星人接触(性交)事件 +- [天堂的證明,一個你這輩子都看不到的世界](https://www.youtube.com/watch?v=L8SZQPyB1c8&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=28) 濒死体验~ 死后世界 +- [千萬不要去!世界十大人類禁地](https://www.youtube.com/watch?v=6SwJpgNLvTk&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=25) 地球上的特殊地点、极寒、极热、核辐射 +- [引起抑鬱的真正原因](https://www.youtube.com/watch?v=EYV9Pjk8cRA&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=29) +- [地球上智商最高的九種動物,第一名就快變成人了](https://www.youtube.com/watch?v=mjk1Huc_FoY&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=27) 猩球崛起 +- [你每天都做這件事,但你真的知道自己在做什麽嗎](https://www.youtube.com/watch?v=GmkPHh2wVmQ&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=27) 睡眠可以修复人的大脑 +- [千萬不要碰,帶來短暫幸福和永恆災難的植物](https://www.youtube.com/watch?v=37bIDXBGvEs&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=29) 罂粟、大麻、海洛因 +- [人類不能知道的秘密,人族的故事](https://www.youtube.com/watch?v=JVOzntXOGRc&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=28) 外星人外星人! +- [夢究竟是什麼?人為什麼要做夢](https://www.youtube.com/watch?v=tA-Zw-uvyvY&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=27) 做梦、鬼压床、清明梦、控制你的梦 +- [世間萬物的壽命,地球上唯一“永生”的生命](https://www.youtube.com/watch?v=z7_3A3FuKKc&list=RDCMUCMUnInmOkrWN4gof9KlhNmQ&index=29) 各种动物的寿命大集合 + +太多了,但是也并不是所有的视频都好看就是了…… + diff --git a/content/post/2023-01-29zlib.md b/content/post/old/2023-01-29zlib.md similarity index 100% rename from content/post/2023-01-29zlib.md rename to content/post/old/2023-01-29zlib.md diff --git a/content/post/old/2023-01-31python-json.md b/content/post/old/2023-01-31python-json.md new file mode 100644 index 00000000..0a891e2d --- /dev/null +++ b/content/post/old/2023-01-31python-json.md @@ -0,0 +1,109 @@ ++++ +title = "Json读写(Python)" +description = "" +date = 2023-01-31T15:34:37+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "" +] +series = [] +images = [] ++++ +使用 python 读写 json,或者使用 json5 处理一些格式“不太正确”的 json string,比如js代码的格式。 + +把 python 对象编码成 json string + + +```python +import json + +data = { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } +data_str = json.dumps(data, indent=4, separators=(',', ': ')) +print(data_str) +``` + +解码 json string 到 python 对象 + +loads() 和 dumps() 函数 处理字符串 + +load() 和 dump() 函数 处理文件 + + +```python +import json +# jsonstr = '{a:1,b:2,"c":3,"d":4,"e":5}' +jsonstr = '{"a":1,"b":2,"c":3,"d":4,"e":5}' +json_obj = json.loads(jsonstr) +json_obj['a'] +``` + + + + + 1 + + + +## 第三方库:Demjson + + +``` +pip install demjson3 +``` + + +```python +import demjson3 +data = { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } +demjson3.encode(data) +``` + + + + + '{"a":1,"b":2,"c":3,"d":4,"e":5}' + + + +Demjson 可以处理一些格式“不太正确”的 json string + + +```python +jsonstr = '{a:1,b:2,"c":3,"d":4,"e":5}' +demjson3.decode(jsonstr) +``` + + + + + {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5} + + + +# json5 + +``` +pip install json5 +``` + +json5也可以处理一些格式“不太正确”的 json string ,并且语法要和 json 标准库一样 + + +```python +import json5 +jsonstr = '{a:1,b:2,"c":3,"d":4,"e":5}' +myobj = json5.loads(jsonstr) +``` + +json5 保存到文件 + + +```python +json5.dump(myobj, open('test.json5', 'w'), indent=4) +``` diff --git a/content/post/old/2023-01-31python-path.md b/content/post/old/2023-01-31python-path.md new file mode 100644 index 00000000..4cb9c3fb --- /dev/null +++ b/content/post/old/2023-01-31python-path.md @@ -0,0 +1,122 @@ ++++ +title = "使用标准的path处理方法 (Python)" +description = "" +date = 2023-01-31T15:26:05+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "python" +] +series = [] +images = [] ++++ + + +标准方法可以兼容不同系统,并且有一定的容错性(比如在目录末尾写不写/) + +* `os.path.split(path)` 分割路径和文件名 +* `os.path.join()` 合并路径和文件名 +* `os.path.dirname()` 方法可以获取目录名 +* `os.path.basename()` 方法可以获取文件名 +* `os.path.splitext()` 方法可以分离文件名和扩展名 + + +--- + + +* `os.path.split(path)` 分割路径和文件名 +* `os.path.join()` 合并路径和文件名 + +```python +import os + +path = '/home/User/Desktop/file.txt' +os.path.split(path) +``` + + + + + ('/home/User/Desktop', 'file.txt') + + + + +```python +path = '/home/User/Desktop' +file = 'file.txt' +os.path.join(path,file) +``` + + + + + '/home/User/Desktop/file.txt' + + + +`os.path.normpath()` 可以规范化路径,比如把多个/合并成一个,把.和..去掉 + + +```python +path = '/home/User/Desktop//..//file.txt' +os.path.normpath(path) +``` + + + + + '/home/User/file.txt' + + + +# 路径、文件名、扩展名 + +* `os.path.dirname()` 方法可以获取目录名 +* `os.path.basename()` 方法可以获取文件名 + * `os.path.splitext()` 方法可以分离文件名和扩展名 + + +```python +path = '/home/User/Desktop/file.txt' +os.path.dirname(path) +``` + + + + + '/home/User/Desktop' + + + + +```python +path = '/home/User/Desktop/file.txt' +os.path.basename(path) +``` + + + + + 'file.txt' + + + + +```python +path = '/home/User/Desktop/file.txt' +os.path.splitext(path) +ext = os.path.splitext(path)[1] +``` + + + + + ('/home/User/Desktop/file', '.txt') + + diff --git a/content/post/old/2023-02-06Fix dual system time problem copy.md b/content/post/old/2023-02-06Fix dual system time problem copy.md new file mode 100644 index 00000000..b4041a6d --- /dev/null +++ b/content/post/old/2023-02-06Fix dual system time problem copy.md @@ -0,0 +1,38 @@ ++++ +title = "Fix dual system time problem" +description = "" +date = 2023-02-06T14:21:50+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "ubuntu" +] +series = [] +images = [] ++++ +## Fix dual system time problem + +fix a dual system bug : windows time not right everytime after using ubuntu. + +run this in ubuntu +``` +sudo timedatectl set-local-rtc 1 --adjust-system-clock +``` + + +## why having this problem + +there a hardware called RTC in your computer: + +if RTC time is 00:00 , and you are in UTC+8:00 time zone , + +`windows think `: ok ,RTC time is just right : now is 00:00 + +`ubuntu think `: RTC time is UTC+0:00 so i have to add 8 hours and now is 08:00 + +command make ubuntu think in windows way. \ No newline at end of file diff --git a/content/post/old/2023-02-06Qv2ray on ubuntu.md b/content/post/old/2023-02-06Qv2ray on ubuntu.md new file mode 100644 index 00000000..92f12b6d --- /dev/null +++ b/content/post/old/2023-02-06Qv2ray on ubuntu.md @@ -0,0 +1,33 @@ ++++ +title = "install Qv2ray on ubuntu" +description = "" +date = 2023-02-06T14:21:50+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "ubuntu" +] +series = [] +images = [] ++++ +## install Qv2ray +install `qv2ray` in snap store. + +## get core of Qv2ray +go to this link on git hub to download [>this link<](https://github.com/v2fly/v2ray-core/releases/tag/v4.31.0) + +unzip core to whatever floder, set up the core path in `Qv2ray - Preferences - Kernel Settings` and it's all done! + +>use your phone as a proxy router , speed up download process. + +## settings +after you get your servers into Qv2ray , you have to goto ubuntu settings and set up` system proxy ` to make it work + +go to `system proxy - Network Proxy` set `127.0.0.1:1089` for socks(this is default port), then it will work. + +> rember some application doesn't follow this setting. \ No newline at end of file diff --git a/content/post/old/2023-02-06grub.md b/content/post/old/2023-02-06grub.md new file mode 100644 index 00000000..ad4a47b7 --- /dev/null +++ b/content/post/old/2023-02-06grub.md @@ -0,0 +1,64 @@ ++++ +title = "grub settings for noobies" +description = "" +date = 2023-02-06T14:21:50+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "ubuntu" +] +series = [] +images = [] ++++ +## turn on grub menu + +if your grub menu don't show when you boot up your system , you can follow this : + +edit grub config +```sh +sudo vim /etc/default/grub +``` + +```conf +# GRUB_TIMEOUT_STYLE=hidden +GRUB_TIMEOUT=10 +``` + +commit +```sh +sudo update-grub +``` + +## get a theme + +[gnome grub themes store](https://www.gnome-look.org/browse?cat=109&ord=rating) + +[deadsec theme](https://github.com/VandalByte/dedsec-grub2-theme) + +## change some grub settings + +edit grub config +```sh +sudo vim /etc/default/grub +``` +find and change: +``` +GRUB_DEFAULT=saved +``` + +add this line +``` +GRUB_SAVEDEFAULT=true +``` + +> this 2 line make grub rember your choice + +commit +```sh +sudo update-grub +``` \ No newline at end of file diff --git a/content/post/old/2023-02-06sougouforubuntu copy.md b/content/post/old/2023-02-06sougouforubuntu copy.md new file mode 100644 index 00000000..05397008 --- /dev/null +++ b/content/post/old/2023-02-06sougouforubuntu copy.md @@ -0,0 +1,46 @@ ++++ +title = "install sougou for ubuntu" +description = "" +date = 2023-02-06T14:21:50+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "ubuntu" +] +series = [] +images = [] ++++ + +## install sougou for ubuntu +[you can follow this guide](https://shurufa.sogou.com/linux/guide) + +## download and install +download sougou [here](https://shurufa.sogou.com/linux) + +fix every thing sougou need +``` +sudo apt install fcitx +sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ +sudo apt purge ibus +sudo apt install libqt5qml5 libqt5quick5 libqt5quickwidgets5 qml-module-qtquick2 +sudo apt install libgsettings-qt1 +``` + +install the package again +``` +sudo dpkg -i sougou...deb +``` +reboot + + +## settings and stuff +goto`ubuntu settings` - `Region & Language` - `Manage installed Languages` + +choose fcitx + +goto `fcitx configuration` , search for sougoupinyin and add it diff --git "a/content/post/old/2023-02-09-dbdiagram.io,\346\225\260\346\215\256\345\272\223\345\210\233\345\273\272\347\232\204\345\245\275\351\200\211\346\213\251.md" "b/content/post/old/2023-02-09-dbdiagram.io,\346\225\260\346\215\256\345\272\223\345\210\233\345\273\272\347\232\204\345\245\275\351\200\211\346\213\251.md" new file mode 100644 index 00000000..ec425bcb --- /dev/null +++ "b/content/post/old/2023-02-09-dbdiagram.io,\346\225\260\346\215\256\345\272\223\345\210\233\345\273\272\347\232\204\345\245\275\351\200\211\346\213\251.md" @@ -0,0 +1,39 @@ ++++ +title = "Dbdiagram.io,数据库设计的好选择" +description = "" +date = 2023-02-09T16:01:23+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "database","free" +] +series = [] +images = [] ++++ + +说到数据库设计软件,之前上学的时候用过 powerdesigener 、 navicat设计数据库。 + +但是都是付费软件,今天找到了一个免费的数据库设计工具 [dbdiagram.io](https://dbdiagram.io)。 + + +首先,以防你看完了文章才发现自己不喜欢这个,先来看一下截图: + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230209160353.png) + +一般操作就是左边写语句,右边可以拖拽生成外键,设计好了之后可以生成各种数据库的 sql 语句,也可以PDF导出。 + + +这里使用的语句叫做 `dbml` 语句,语法类似sql建表语句,具体语法参考[这个链接](https://www.dbml.org/home/?utm_source=dbdiagram),这个语言是 `dbdiagram.io` 自己的,可能需要小小的学习一下。 + +> 我这里在 `vscode` 中安装了一个 `dbml` 插件,可以在 vscode 中写设计语句,通过 `copilot` (AI插件),我只要写好备注,就可以自动生成大段的语句。 + +关于外键的用法其实也非常的符合直觉:你只需要使用 `-` `>` 之类的富豪榜,就能轻松的表示一对一、一对多的关系。 + +最后用 datagrip 导入生成的 sql 语句到 mysql,简直不要太爽!导出操作比我之前用过的那些软件方便得多! + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230209161253.png) \ No newline at end of file diff --git "a/content/post/old/2023-02-09-\344\275\277\347\224\250simple_term_menu\345\210\233\345\273\272\346\233\264\345\245\275\347\232\204python\350\217\234\345\215\225.md" "b/content/post/old/2023-02-09-\344\275\277\347\224\250simple_term_menu\345\210\233\345\273\272\346\233\264\345\245\275\347\232\204python\350\217\234\345\215\225.md" new file mode 100644 index 00000000..72e4ab67 --- /dev/null +++ "b/content/post/old/2023-02-09-\344\275\277\347\224\250simple_term_menu\345\210\233\345\273\272\346\233\264\345\245\275\347\232\204python\350\217\234\345\215\225.md" @@ -0,0 +1,84 @@ ++++ +title = "用 simple_term_menu 创建更好的python菜单" +description = "" +date = 2023-02-09T16:25:24+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "python","menu" +] +series = [] +images = [] ++++ + +安装 + +```sh +pip install simple_term_menu +``` +⚠️ 不支持windows +这个菜单库使用非常简单,只需要传入一个列表,就可以生成一个菜单,返回值就是选择的菜单项的索引。 + +- 支持`J` `K`/⬆️ ⬇️ 键移动 +- 支持`/`斜杠搜索 +- 支持快捷键(传入的 string 如 `[q] 退出` ,q 就变成快捷键了) +- 好看! +- 还有更多功能,我没有仔细研究,参考[>这里<](https://github.com/IngoMeyer441/simple-term-menu) + +封装成函数,方便调用 + +```python +from simple_term_menu import TerminalMenu +def menu(choices:list): + terminal_menu = TerminalMenu(choices,title="扫描结果转换XML工具 v1.0 (230208)\n---",show_search_hint=True) + index = terminal_menu.show() + + print("执行", choices[index]) + if choices[index] == "[h] 文档": + import webbrowser + webbrowser.open('http://example.com') + return 0 + if choices[index] == "[q] 退出": + exit() + return index + 1 # 返回结果,从1开始 +``` + + +main 函数调用 + +```python +if __name__ == '__main__': + while True: + # 获取功能列表,显示菜单 + choices_str = open('menu.md', 'r', encoding='utf-8').read() + choices =choices_str.splitlines() + choice_index = menu(choices) +``` + + +> 其实一开始选择用md是因为写序号的话可以自动排序,但是加了序号和快捷键之后,就不美观了,所以把序号删除了。 + +加载菜单 menu.md + +```md +长亭xray(主机+应用) html 1->1 +长亭xray(主机+应用) html 多->1 +绿盟(主机) .html 1->1 +绿盟(主机) .html 多->1 +安恒新版 (应用) html 1->1 +Nessus csv(utf-8) 1->1 +Nessus csv(gb18030) 1->1 +[h] 文档 +[q] 退出 +``` + +效果图: +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230209163535.png) + +对了这个东西还有个坑的地方,在pycharm运行的时候需要设置一下才能正常使用(要开启模拟终端): +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230209163631.png) diff --git "a/content/post/old/2023-02-18-python\346\211\223\345\214\205.md" "b/content/post/old/2023-02-18-python\346\211\223\345\214\205.md" new file mode 100644 index 00000000..e0cf50b3 --- /dev/null +++ "b/content/post/old/2023-02-18-python\346\211\223\345\214\205.md" @@ -0,0 +1,91 @@ ++++ +title = "Python打包和上传到pypi" +description = "" +date = 2023-02-18T21:59:09+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "python" +] +series = [] +images = [] ++++ +## 教程 + +用 python 的人都用 pip 安装过包。那么有着开源精神的你,是否也想把自己写的包上传到 pypi 呢? + +[官方中文教程地址](https://python-packaging-zh.readthedocs.io/zh_CN/latest/minimal.html#id2) + +[一个视频教程](https://www.youtube.com/watch?v=tEFkHEKypLI) + + +## 更新/发布步骤: + +1. 修改完善 `setup.py` +2. 进行本地测试 `python setup.py develop` +3. 编译 `python3 setup.py sdist` +4. 上传到 pypi `twine upload dist/*` + +## 新手注意事项 + +你需要先去 [pypi](https://pypi.org/) 注册一个账号,给你的包起一个名字(搜一搜没有被占用就行),然后用 pip 在本地安装 twine,这个是用来上传到 pypi 的工具。 + +目录结构需要注意,你的项目目录结构应该是这样的,要把 setup.py 放在外面: + +![目录](https://raw.githubusercontent.com/cornradio/imgs/main/20230218220613.png) + +setup.py 的内容大致如下;可以抄我的,改改`名称`、`版本`、`描述`就行,非常简单。 + +```python +import codecs +import os +from setuptools import setup, find_packages + +# these things are needed for the README.md show on pypi (if you dont need delete it) +here = os.path.abspath(os.path.dirname(__file__)) + +with codecs.open(os.path.join(here, "README.md"), encoding="utf-8") as fh: + long_description = "\n" + fh.read() + +# you need to change all these +VERSION = '1.0.2' +DESCRIPTION = 'a ligh weight menu , support both win and mac ' +LONG_DESCRIPTION = 'dumb_menu is a ligh weight menu ,support hot key, support both win and mac' + +setup( + name="dumb_menu", + version=VERSION, + author="clever chen", + author_email="", + description=DESCRIPTION, + long_description_content_type="text/markdown", + long_description=long_description, + packages=find_packages(), + install_requires=[], + keywords=['python', 'menu', 'dumb_menu','windows','mac','linux'], + classifiers=[ + "Development Status :: 1 - Planning", + "Intended Audience :: Developers", + "Programming Language :: Python :: 3", + "Operating System :: Unix", + "Operating System :: MacOS :: MacOS X", + "Operating System :: Microsoft :: Windows", + ] +) +``` + +编译成功的话会生成 dist 和 egg-info 两个文件夹,egg-info 是用来记录包的信息的,dist 是用来存放打包好的包的。 + +![编译后的目录结构](https://raw.githubusercontent.com/cornradio/imgs/main/20230218222043.png) + +然后就可以上传到 pypi 了,最好测试好了再发,因为你不能发重复的版本号。 +``` +twine upload dist/* +``` + +然后后面再修改和更新的话,参考 [更新/发布步骤](#更新发布步骤) 即可。 \ No newline at end of file diff --git "a/content/post/old/2023-02-18-python\346\211\223\345\214\205\346\210\220exe.md" "b/content/post/old/2023-02-18-python\346\211\223\345\214\205\346\210\220exe.md" new file mode 100644 index 00000000..31d0d0d0 --- /dev/null +++ "b/content/post/old/2023-02-18-python\346\211\223\345\214\205\346\210\220exe.md" @@ -0,0 +1,63 @@ ++++ +title = "如何把 Python 程序打包成 exe" +description = "" +date = 2023-02-18T22:27:09+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "python" +] +series = [] +images = [] ++++ + +我需要把我写的程序分给很多没有装 `python` 环境的人用(即使撞上了 `python` 环境,也会因为网络原因无法 `pip` 下载依赖),所以我需要把它打包成 `exe` ,这样使用门槛就可以很低了。 + +我主要参考了[这篇文章](https://blog.csdn.net/chichu261/article/details/106392385)。 + + +## 我的场景 +我的程序比较复杂,虽然是命令行程序,但是有很多依赖,并且程序文件分散在几个文件夹里。 + +## 如何打包 +### 1. 安装 `pyinstaller` +```bash +pip install pyinstaller +``` +### 2. 在命令行打包 + +我的主程序从main2.py开始,并且使用了三个库,采用自动覆盖不提示模式打包,命令如下: + +我没有采用打包成单个exe的方式,听说打包成 **单个exe** 影响性能,本来程序性能就不太好…… + +``` +pyinstaller -c main2.py --noconfirm --hidden-import pandas,bs4,json5 + +``` + +pyinstaller: +* -c 命令行模式 +* --noconfirm 不需要确认,直接覆盖文件 +* --hidden-import 导入库 + +### 3. 复制配置文件 + +workdir下有一个config文件夹,里面有一些配置文件会在程序运行时动态加载,需要复制到打包后的文件夹里,这里我用了 `xcopy` 命令,如果你用的是 `linux` ,可以用 `cp` 命令。 + +这里其实完全可以手动复制,但是如果从 Devops 的角度来看,这个过程应该是自动化的。 + +```bat +xcopy config dist\main2\config\ /S /c /y +xcopy config\xml转换工具.bat dist\ /S /c /y +``` + +### 4. 检查打包结果 + +默认打包后的位置是 `dist\main2\main2.exe` + +推荐使用[windows沙盒](https://learn.microsoft.com/zh-cn/windows/security/threat-protection/windows-sandbox/windows-sandbox-overview)测试,如果测试使用没有问题,就可以把整个目录打包给别人用了。 diff --git "a/content/post/old/2023-02-18-\346\210\221\345\206\231\344\272\206\344\270\200\344\270\252python\345\272\223dumb_meun.md" "b/content/post/old/2023-02-18-\346\210\221\345\206\231\344\272\206\344\270\200\344\270\252python\345\272\223dumb_meun.md" new file mode 100644 index 00000000..32b113ea --- /dev/null +++ "b/content/post/old/2023-02-18-\346\210\221\345\206\231\344\272\206\344\270\200\344\270\252python\345\272\223dumb_meun.md" @@ -0,0 +1,146 @@ ++++ +title = "我写了一个python库:dumb_meun" +description = "" +date = 2023-02-18T16:19:07+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "python" +] +series = [] +images = [] ++++ +> 我之前再我的程序里面 用了一个第三方库:`simple_term_menu`,提供菜单功能。但是当我再windows上尝试跑一下终于写好的程序时,竟然不能用。原因是它依赖于 `termios` 库, 不支持 win 。 +> 因为我的功能需求比较简单,我决定自己下一个代替品,就是这个 `dumb_meun` 了。 + +主要要实现的功能: +- 传入一个 list ,显示菜单, 返回选中的 index + - 上下键选择 + - enter建确认 + - *支持快捷键 + +因为python没有提供类似于c语言中的`getchar`函数,再 linux 上用 `termios` 库可以实现,但是在windows上使用的是 `msvcrt` 库。所以实际上在 python 中实现起来不是很容易。 + +```python +def get_key(): #get keypress using getch , msvcrt = windows or termios = linux + try : + import getch + first_char = getch.getch() + if first_char == '\x1b': #arrow keys + a=getch.getch() + b=getch.getch() + return {'[A': 'up', '[B': 'down', '[C': 'right', '[D': 'left' }[a+b] + if ord(first_char) == 10: + return 'enter' + if ord(first_char) == 32: + return 'space' + else: + return first_char #normal keys like abcd 1234 + except : + pass + try: + import msvcrt + key = msvcrt.getch() # get keypress + if key == b'\x1b': # Esc key to exit + return 'esc' + elif key == b'\r': # Enter key to select + return 'enter' + elif key == b'\x48': # Up or Down arrow + return 'up' + elif key == b'\x50': # Up or Down arrow + return 'down' + else: + return key.decode('utf-8') + except: + pass + +while True: + key = get_key() + print("You pressed: ", key) +``` + +这个函数可以获取键盘输入,返回值是一个字符串,比如`up` `down` / `enter` / `a` `b` `c` / `1` `2` `3`,这样统一一下,可以兼容linux 和 win。 + +测试结果: + ``` + Press a key to test out! + You pressed: down + You pressed: up + You pressed: a + ... + ``` + +## menu代码 +> 我拷问了chatgpt老半天,他才给我编好 + +![后补充的流程图](https://raw.githubusercontent.com/cornradio/imgs/main/20230218215102.png) + +- 提取快捷键是用 `re` 库的正则表达式 + +- 显示菜单通过 `os.system("cls" if os.name == "nt" else "clear")` 清屏,再打印出来,每次给菜单传入 list 和选中的 index ,这样用户可以看到自己正在选择哪个。 + +```python +import os +import re +def get_menu_choice(options): + shortcuts = scan_short_cuts(options) # scan for shortcuts + selected_index = 0 + print(shortcuts) + while True: + show_menu(options, selected_index) + key = get_key() + if key == 'enter': # Enter key to select + return selected_index + elif key in ('up','down'): # Up or Down arrow + selected_index = (selected_index + (1 if key == 'down' else -1) + len(options)) % len(options) + elif key in shortcuts: # Shortcut key + show_menu(options, shortcuts[key]) #show selected option when using shortcut + return shortcuts[key] + +def scan_short_cuts(options): + shortcuts = {} + for i, option in enumerate(options): + match = re.match(r"\[(.*)\](.*)", option) + if match: + shortcut, text = match.group(1, 2) + shortcuts[shortcut] = i + return shortcuts + + +def show_menu(options, selected_index): + os.system("cls" if os.name == "nt" else "clear") + print("Menu","current option:",selected_index) + for i, option in enumerate(options): + if i == selected_index: + print(f"> {option}") + else: + print(f" {option}") + print("\nUse the arrow keys to move, Enter/Hotkey to select.") + +``` + +使用方法非常直白: + +```python +options = ["[1]Option 1", "[2]Option 2", "[3]Option 3","[q]quit"] +index = get_menu_choice(options) +print(f"You selected option {index + 1}: {options[index]}") +``` + +看看效果: + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230214163952.png) + +## 代码地址 +> 其实我一开始想要参考一下 `simple_term_menu` 的源码,但是我发现我太菜了,根本看不懂他们的贼复杂的源代码(还用了信号啥的,我都不会),所以我就自己写了一个简单的。 + +使用的话就: +``` +pip install dumb-menu +``` +可以看看我在 pypi 写的[简明教程](https://pypi.org/project/dumb-menu/) \ No newline at end of file diff --git a/content/post/old/2023-02-23macos_essencials2.md b/content/post/old/2023-02-23macos_essencials2.md new file mode 100644 index 00000000..2512b994 --- /dev/null +++ b/content/post/old/2023-02-23macos_essencials2.md @@ -0,0 +1,83 @@ ++++ +title = "mac essencials 3" +description = "" +date = 2023-09-18T08:03:07+08:00 +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "mac" +] +series = [] +images = [] ++++ +经过了半年的使用,这是最新的软件推荐列表! + +PS:最近在装机(mac mini),正好整理一下。 +## mac必装软件 +- 解压软件 [fastzip](https://apps.apple.com/cn/app/fastzip/id1565629813?mt=12) +- 滚轮和鼠标优化软件 [ Mos ](https://github.com/Caldis/Mos) +- 视频软件 [iina](https://www.iina.io) +- 截图软件 [Snipaste](https://www.snipaste.com/) +- 显示器亮度调节 [Monitor Control](https://github.com/MonitorControl/MonitorControl) +- 粘贴版历史记录软件 [Paste Now](https://pastenow.app) + +## 稍微个性化一点 +- 微软远程桌面(RDP) [microsoft-remote-desktop](https://install.appcenter.ms/orgs/rdmacios-k2vy/apps/microsoft-remote-desktop-for-mac/distribution_groups/all-users-of-microsoft-remote-desktop-for-mac) +- 看书软件 [calibre](https://calibre-ebook.com) +- 密码管理软件 [keepassxc](https://keepassxc.org) +- 触控板 [swish ](https://highlyopinionated.co/swish/) +- 触控板 [BetterTouchTool](https://folivora.ai) + +## 动手动脑 +[Raycast](https://www.raycast.com) +| [clashX]( https://github.com/yichengchen/clashX) +| [ShadowRocket](https://apps.apple.com/us/app/shadowrocket/id932747118) +| [homebrew](https://brew.sh/) +| [warp](https://www.warp.dev) + + + [hammerspoon](https://www.hammerspoon.org/) > [我的例子](https://gist.github.com/cornradio/e46fc1fefa769833e6cfdeb3fbb54f3b) +| [one-key-hidpi](https://github.com/xzhih/one-key-hidpi) + + + +## 开发人员专属 + [vscode](https://code.visualstudio.com) +| [jetbrains-toolbox](https://www.jetbrains.com/toolbox-app/) +| [python](https://www.python.org) +| [java](https://www.oracle.com/java/technologies/downloads/) +| [docker](https://www.docker.com/products/docker-desktop) + + [hugo](https://gohugo.io/installation/) +| [iterm2](https://iterm2.com) +| [ohmyzsh](https://ohmyz.sh) > [zshrc配置](https://cornradio.github.io/hugo/posts/zshrc的一些配置/) + + +## 浏览器 + [edge](https://www.microsoft.com/zh-cn/edge/download?form=MA13DC) +| [chrome](https://www.google.cn/chrome/index.html) + + +## cracked software +[downie4](https://appstorrent.ru/?story=downie&do=search&subaction=search) +| [PDF expert](https://appstorrent.ru/122-pdfexpert.html) +| [Photoshop](https://appstorrent.ru/91-adobe-photoshop.html) +| [parallels](https://cornradio.github.io/hugo/posts/2023-06-13-parallels_crack/) +| [burpsuite](https://cornradio.github.io/hugo/posts/2burponmac_cracked/) +## mac常备脚本 + +[github 私人库](https://github.com/cornradio/myshellfiles) + +## 手工配置 +code 命令加入命令行:vscode 中按下 `cmd+shift+p`,选择 `Shell Command: Install 'code' command in PATH` + +git 配置 目前命令行的 git 不能通过密码登陆了,需要 [token](https://github.com/settings/tokens) + + + + + diff --git "a/content/post/old/2023-02-24windows\345\274\200\345\220\257WebDAV.md" "b/content/post/old/2023-02-24windows\345\274\200\345\220\257WebDAV.md" new file mode 100644 index 00000000..38944c6b --- /dev/null +++ "b/content/post/old/2023-02-24windows\345\274\200\345\220\257WebDAV.md" @@ -0,0 +1,96 @@ ++++ +title = "windows开启WebDAV" +description = "" +date = 2023-02-24T19:56:44+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "windows" +] +series = [] +images = [] ++++ +开启 WebDAV 可以让你的 windows 设备变成家庭媒体服务器。 + +这是一个替代选项,毕竟ftp已经过时(无安全性)、文件夹共享简直是太烂了 + +## 开启系统功能 +- 搜索:启用或关闭 Windows 功能 +- 勾选并开启下列功能 +``` +- Internet Information Services 功能(全选) + + (Internet Information Services 中下列功能需要手动打勾,默认不选) + - 万维网服务功能 + - 安全性 + - 基本身份验证 + - 常见HTTP功能 + - Webdav发布 +``` + +## 创建 webDAV 站点 +1. 添加网站 + + ![](https://raw.githubusercontent.com/cornradio/imgs/main/20230224201122.png) +2. 开启下列功能 + + ![](https://raw.githubusercontent.com/cornradio/imgs/main/20230224201149.png) +3. webdav - 右侧 - 启用`webdav` +4. webdav - 添加创作功能 - 允许所有用户,分配读写权限 +5. 目录浏览 - 打开功能 +6. 身份验证 - 基本身份验证 - 启用(其他选项禁用) + +- ✨右键重启网站 + +## 准备要分享的文件夹 + +> 针对错误:无权访问`web.config` + +- 在任何目录下新建一个文件夹,比如:`e:本地影视` +- 确保添加`everyone`用户组的完全控制权限 + ![](https://raw.githubusercontent.com/cornradio/imgs/main/20230224201314.png) + + +## 打通网络 +> 针对问题:在其他电脑上无法连接到 8090 端口 + + +搜索并打开:防火墙 + +新增一条入站规则、一条出站规则,允许端口8090的所有通信。 + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230224202305.png) + + +## 设置mime类型 + +> 解决特殊格式视频403错误 + +可以手动添加一条mime类型 + +![](https://raw.githubusercontent.com/cornradio/imgs/main/20230224204437.png) + +或者可以在 `web.config` (会自动的在根文件夹生成)添加如下配置 + +```xml + + + + + + + + + + + +``` + +## 登录用的账号 + +微软账号:邮箱 + 密码 \ No newline at end of file diff --git "a/content/post/old/2023-02-28-\345\246\202\344\275\225\351\201\277\345\205\215timemachine\345\215\240\347\224\250\345\256\235\350\264\265\347\232\204mac\347\243\201\347\233\230\347\251\272\351\227\264.md" "b/content/post/old/2023-02-28-\345\246\202\344\275\225\351\201\277\345\205\215timemachine\345\215\240\347\224\250\345\256\235\350\264\265\347\232\204mac\347\243\201\347\233\230\347\251\272\351\227\264.md" new file mode 100644 index 00000000..b6be7119 --- /dev/null +++ "b/content/post/old/2023-02-28-\345\246\202\344\275\225\351\201\277\345\205\215timemachine\345\215\240\347\224\250\345\256\235\350\264\265\347\232\204mac\347\243\201\347\233\230\347\251\272\351\227\264.md" @@ -0,0 +1,69 @@ ++++ +title = "如何避免timemachine占用宝贵的mac磁盘空间" +description = "" +date = 2023-02-28T16:47:50+08:00 +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "" +] +series = [] +images = [] ++++ + +因为我买的MacBook只有512G的容量,所以我一直对容量使用比较在意,今天打开磁盘工具,发现我的MacBook的磁盘空间已经不足了。 + +![](https://i.imgur.com/vqpRmHX.png) + +我一直使用 OmniDiskSweeper 来清理空间,他能直接显示你所有文件夹占用的空间,一层一层的往下看,并手动删除不需要的文件是我的清理方式 (比用清理工具比如CleanMyMac要好用多了)。 + +但是今天在清理之后发现,mac的磁盘空间还是不足,我感到非常奇怪。。。因为系统的磁盘管理工具和 OmniDiskSweeper 的磁盘空间使用数据对不上,差了几百G,经过一些搜索发现是因为:TimeMachine(时间机器)。 + +## 时间机器 + +时间机器除了在插上硬盘的时候备份到外置硬盘,还会平常偷偷摸摸的自动备份,在Mac内置存储空间里存放快照,并且他会在空间不足时自动删除最旧的快照。 + +其实合理的使用时间机器,不会占用太多的空间(因为他是增量保存,仅记录修改,不是复制整个文件),但是如果你使用了虚拟机软件,你在虚拟机里面修改了内容之后,整个虚拟机映像都会被重新备份一遍,,这是非常不合理的。 + +## 如何避免 + +把虚拟机文件之类的排除time machine 备份。至于虚拟机备份的话,PD本身就有照功能,vmware之类的也有类似的功能提供,不需要借助 timemachine。 + +![](https://i.imgur.com/sQHzg8x.png) + +## 如何删除正在占用磁盘空间的快照 +我们需要使用时间机器的命令行工具,打开终端,输入以下命令: + +推荐用vscode之类的可以多光标编辑的软件,这样可以一次性写好多条命令! + +```bash +tmutil listlocalsnapshots / +``` + +Snapshots for disk /: +com.apple.TimeMachine.2023-02-11-102036.local +com.apple.TimeMachine.2023-02-28-092630.local +com.apple.TimeMachine.2023-02-28-102633.local +com.apple.TimeMachine.2023-02-28-143433.local + +```bash +sudo tmutil deletelocalsnapshots 2023-02-11-102036 +sudo tmutil deletelocalsnapshots 2023-02-28-092630 +sudo tmutil deletelocalsnapshots 2023-02-28-102633 +sudo tmutil deletelocalsnapshots 2023-02-28-143433 +``` + +Deleted local snapshot '2023-02-11-102036' +Deleted local snapshot '2023-02-28-092630' +Deleted local snapshot '2023-02-28-102633' +Deleted local snapshot '2023-02-28-143433' + + +![删除之后](https://i.imgur.com/nfVWYE9.png) + +## 参考 +https://appleinsider.com/articles/21/06/26/how-to-delete-time-machine-local-snapshots-in-macos \ No newline at end of file diff --git "a/content/post/old/2023-03-03-\347\247\273\345\212\250\345\205\211\347\214\253\346\224\271\346\241\245\346\216\245\347\232\204\344\270\200\346\254\241\347\273\217\351\252\214.md" "b/content/post/old/2023-03-03-\347\247\273\345\212\250\345\205\211\347\214\253\346\224\271\346\241\245\346\216\245\347\232\204\344\270\200\346\254\241\347\273\217\351\252\214.md" new file mode 100644 index 00000000..f8a93406 --- /dev/null +++ "b/content/post/old/2023-03-03-\347\247\273\345\212\250\345\205\211\347\214\253\346\224\271\346\241\245\346\216\245\347\232\204\344\270\200\346\254\241\347\273\217\351\252\214.md" @@ -0,0 +1,82 @@ ++++ +title = "移动光猫改桥接" +description = "" +date = 2023-03-03T23:04:09+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "network" +] +series = [] +images = [] ++++ +## 0. 为什么要做教程 + +改成桥接之后,可以把游戏主机放到DMZ区域,NAT类型可能得到改善。还有软路由的一些好玩功能都可以试试看。 + +打电话中国移动客服不给我改,还说要么让师傅上门,我真的很讨厌上门操作,还要等。而且影响我正常上网了(微信不知道为啥老爱转圈,怀疑是两层路由的锅) + +网上相关改桥接的教程很多,但是都很老的(从截图上就看得出来),对我的机器来说一点帮助都没有,而且我在搞的时候也发现了一些坑,我要发教程以帮助别人。 + +![改桥街到底是改了啥](https://i.imgur.com/ZS4SdBh.png) + +为什么要改桥接呢,因为光猫很弱,虽然自带天线并且可以当作路由器,但是相应的设置和管理功能都太弱了。 + +而且专业的设备做专业的事情,光猫还是仅仅做光电转换比较好! + +当然,更重要的是我想要自己对网络的完全控制权。 + +## 1. 了解光猫 + 我推荐你在看教程之前先确定一下你的光猫是否和我的是同样的款(H2-2)。 + +![照片](https://raw.githubusercontent.com/cornradio/imgs/main/20230303233946.png) + +![型号](https://raw.githubusercontent.com/cornradio/imgs/main/%E6%88%AA%E5%B1%8F2023-03-03%2023.42.48.png) + +这款光猫后面有四个wan口,推荐1号接路由器,234空着(4号是默认IPTV的接口),因为1号是高速的千兆口,其他的是百兆口。 + +## 2. 获取超级密码 + +超级密码不推荐自己花时间破解,网上能找到的方法基本被封了。 + +在闲鱼买一个就可以了,关键词“光猫超级密码”。 + +> 上海移动据说每个机器在初始化的时候密码都不一样,我买的价格是10元,需要提供宽带账号,宽带账号密码可以给中国移动发送`kdmm`获取。 + +``` +CMCCAdmin +CMCCAdminDx1H#4Sd +``` + +## 3.登陆光猫 + +可以先直接连到光猫的wifi信号、或者通过网线连接到光猫。 + +如果通过二级路由器连接光猫,当前二级路由器需要使用DHCP模式,而且等下使用`PPPOE`拨号模式就无法使用ip登录到光猫了。 + +然后打开浏览器输入 [192.168.1.1](192.168.1.1) 就可以进入光猫的管理界面了,用刚才买的高权限账号登陆。 + +![登录截图](https://i.imgur.com/G7xqUe4.jpg) + +## 4.光猫操作 +- 状态-网络侧信息-IPV4连接信息:可以看到网络的当前状态 +- 提前截图/导出配置文件,避免玩坏了上不了网(配置导出位置:管理-设备管理-usb备份配置) +![最重要的就是记录vlanid](https://i.imgur.com/1x7IWgg.png) + +> 配置是同时开启的,`1_TR069_R_VID_110`是运营商的配置,他们可以通过这种方式远程控制光猫、下发策略,并且这个配置不能删除。`2_INTERNET_R_VID_1101`这个是我的光猫的拨号配置,光猫拨号成功后作为路由。我们要删除这个配置,然后利用这个vlanid新建一个桥接配置。这个`1101`就是vlanid。(需要在光猫上配置好`vlanid` + 正确的宽带账号密码才能拨号成功) +- 新建一个`bridge`桥接配置,设置其使用高速的`wan1`端口,vlan模式为“改写”,并设置vlanid。创建成功后多了一个`3_INTERNET_B_VID_1101`配置文件。 +![新建配置](https://i.imgur.com/uiEDJ0I.png) +- 删除当前的`PPPOE`拨号配置,我这里是`2_INTERNET_R_VID_1101`(或者修改成错误的vlanid,这样就不会拨号成功,还可以保留这个配置方便后面用) +> 如果你还用iptv的话,不要动`iptv`的配置,光猫是多个配置并行启用的,iptv配置从名字上看不出,但是它的业务模式那里应该是iptv,我当时没有备份就全部删掉了配置(很傻的操作)。 + +## 5.路由器操作 +- 把模式从`DHCP`改成`pppoe`拨号,这方面相信大家都很熟悉了,每人路由器也都不一样,就不截图了。 + +![测速图](https://i.imgur.com/akl0csq.png) + +经验就是以上这些了,改了之后网速也不会有啥变化,但是我的微信不转圈圈了。 diff --git "a/content/post/old/2023-03-20-javascript-\345\205\245\351\227\250-DOM.md" "b/content/post/old/2023-03-20-javascript-\345\205\245\351\227\250-DOM.md" new file mode 100644 index 00000000..a9d6a71a --- /dev/null +++ "b/content/post/old/2023-03-20-javascript-\345\205\245\351\227\250-DOM.md" @@ -0,0 +1,188 @@ ++++ +title = "Javascript 入门-DOM" +description = "" +date = 2023-03-20T21:50:30+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "js" +] +series = [] +images = [] ++++ + +dom 元素的定位、修改、创建、删除、指定位置插入等操作 + + +### dom +```js +// 获取id为myDiv的元素 +var myDiv = document.getElementById("myDiv");⭐️ + +// 修改元素文本内容 +myDiv.innerHTML = "

Hello, DOM!

"; + +// 创建新元素并添加到myDiv中 +var newElement = document.createElement("p"); +newElement.innerHTML = "This is a new paragraph."; +myDiv.appendChild(newElement); + +``` + + + +#### 定位 + +以下是一些常用的getElementBy...()方法: + +`getElementById() `- 通过元素ID获取某个元素节点 + + +``` +var element = document.getElementById("myElementId"); +``` + + +`getElementsByClassName()` - 通过class名称获取一组元素节点 + + +``` +var elements = document.getElementsByClassName("myClassName"); +``` + + +`getElementsByTagName() `- 通过标签名获取一组元素节点 + + +``` +var elements = document.getElementsByTagName("div"); +``` + + +⭐️`querySelector()` - 通过CSS选择器查找第一个匹配的元素节点 + + +``` +var element = document.querySelector(".myClass"); +``` + + +`querySelectorAll() `- 通过CSS选择器查找所有匹配的元素节点 + + +``` +var elements = document.querySelectorAll("p.myClass"); +``` + + +这些方法可以帮助我们在页面中快速地获取需要操作的元素节点。它们在JavaScript编程中非常常见,掌握它们可以提高我们的开发效率。 + + +#### 获取内容 + +获取元素文本内容⭐️ + +```js +var element = document.getElementById("myElementId"); +var text = element.innerHTML; +``` + +获取元素属性值⭐️ + +```js +var image = document.getElementById("myImageId"); +var src = image.src; +``` + +#### 修改操作 +以下是一些常用的JavaScript操作HTML内容的代码示例: + +修改元素文本内容 `innerHTML`⭐️ + +```js +var element = document.getElementById("myElementId"); +element.innerHTML = "Hello, World!"; +``` + +修改元素属性值 + +```js +var image = document.getElementById("myImageId"); +image.src = "new-image.png"; +//oneliner +document.getElementById("myImageId").setAttribute("src", "new-image.png"); + +``` + +删除元素的某个属性⭐️ + +```js +var image = document.getElementById("myImageId"); +image.removeAttribute("src"); +``` + + +设置元素的css + +```js +var element = document.getElementById("myElementId"); +element.style.color = "red"; +element.style.fontSize = "20px"; +//onliner +document.getElementById("myElementId").style.color = "red"; +``` + + +创建新元素并添加到成子节点⭐️ + +```js +var newElement = document.createElement("div"); +newElement.innerHTML = "This is a new element."; +document.body.appendChild(newElement); + +``` + +移除某个元素⭐️ + +```js +var elementToRemove = document.getElementById("removeMe"); +elementToRemove.parentNode.removeChild(elementToRemove); +``` + +#### insert Adjacent HTML⭐️ + +`insertAdjacentHTML()`方法可以在指定位置插入HTML代码。它接收两个参数,第一个参数是指定的位置,第二个参数是要插入的HTML代码。它有以下几个位置参数: + +`beforebegin` - 在元素之前插入HTML代码 + +`afterbegin` - 在元素内部的开始位置插入HTML代码 + +`beforeend` - 在元素内部的结束位置插入HTML代码 + +`afterend` - 在元素之后插入HTML代码 + +```js +var element = document.getElementById("myElementId"); +element.insertAdjacentHTML("beforebegin", "

Hello, World!

"); +element.insertAdjacentHTML("afterbegin", "

Hello, World!

"); +element.insertAdjacentHTML("beforeend", "

Hello, World!

"); +element.insertAdjacentHTML("afterend", "

Hello, World!

"); +``` + +一个例子(点击按钮,插入Paragraph) + +```js +function a(){ + var img = document.getElementsByTagName("img")[0]; + img.insertAdjacentHTML("afterend", "

Hello, World!

"); +} + +// html + +asdfsadf +``` diff --git "a/content/post/old/2023-03-20-javascript-\345\205\245\351\227\250-for-pentest.md" "b/content/post/old/2023-03-20-javascript-\345\205\245\351\227\250-for-pentest.md" new file mode 100644 index 00000000..94a19ac5 --- /dev/null +++ "b/content/post/old/2023-03-20-javascript-\345\205\245\351\227\250-for-pentest.md" @@ -0,0 +1,402 @@ ++++ +title = "Javascript 入门-for Pentest" +description = "" +date = 2023-03-20T21:53:22+08:00 +featured = false +comment = true +toc = true +reward = true +categories = [ + "" +] +tags = [ + "js" +] +series = [] +images = [] ++++ + +js基础(for pentest) 真的很基础。 + + + +## JS for pentest + +## tag 放置位置 + +### 内嵌式 + +理论上js可以写在任何第一个地方 但是一般写在`head`标签里或者`body`标签里 + +```js + +``` + +```js + +``` + +### 外链式 + +首先新建一个文件类型为.js的文件,然后在该文件中写js语句,通过script标签对引入到html页面中。 +指定关键字延迟加载js:defer + +```js +