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
+
+
+```
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
+⭐️
+//defer
+⭐️
+```
+
+### 行内式
+直接书写在标签身上,是一个简写的事件,所以又称之为事件属性。 onclick单击事件
+
+```js
+
+
+
+```
+
+### 内嵌式和外链式的区别
+
+1. 内嵌式:将js代码直接写在html页面中,当页面加载时,js代码也会被加载,执行,所以内嵌式的js代码会阻塞页面的加载,影响页面的性能。
+
+2. 外链式:将js代码写在单独的js文件中,通过script标签引入到html页面中,当页面加载时,js代码不会被加载,执行,只有当页面加载完成后,js代码才会被加载,执行,所以外链式的js代码不会阻塞页面的加载,不会影响页面的性能。
+
+## 数据类型
+Number、String、Boolean、Null、Undefined、Object、Symbol
+```js
+var num = 1;
+var str = 'hello';
+var bool = true;
+var nul = null;
+var und = undefined;
+var obj = {name:'zhangsan',age:18};
+var sym = Symbol();
+```
+
+#### Number
+```js
+var num = 1;
+var num = 1.1;
+var num = 1e2; //100
+var num = 1e-2; //0.01
+var num = 0xff; //255 - 16进制 ⭐️
+var num = 0b1111; //15 - 2进制
+var num = 0o17; //15 - 8进制 ⭐️
+var num = infinity; //无穷大
+```
+
+```js
+parseInt(..) //将某值转换成数字,不成功则NaN⭐️
+parseFloat(..) //将某值转换成浮点数,不成功则NaN
+isNaN(..) //判断某值是否为NaN
+isFinite(..) //判断某值是否为有限数
+```
+
+#### String
+```js
+var str = 'hello';
+var str = "hello";
+var str = `hello`;
+var words = 'hello' + 'world'; //helloworld
+var words = 'hello' + 1; //hello1
+```
+
+```js
+words = "hello world";
+words.length //11
+words[0] //h
+words.At(0) //h
+
+words.indexOf('wor') //6 搜索字符串中是否包含某个字符串,如果包含则返回第一个字符的索引,否则返回-1
+words.search('o') ⭐️//4 搜索字符串中是否包含某个字符串,如果包含则返回第一个字符的索引,否则返回-1
+words[6] //w
+words.charAt(6) //w
+
+words.slice(0,5) //hello 0-5⭐️
+words.slice(6) //world 6-end⭐️
+
+words = " hello world ";
+words.trim() // hello world
+words.trimLeft() //hello world
+words.trimRight() // hello world
+
+words.toUpperCase() // HELLO WORLD
+words.toLowerCase() // hello world
+words.split(' ') //["hello", "world"]⭐️ string to list
+words.split('') //["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"]
+words.replace('hello','hi') // hi world
+words.replace(/hello/g,'hi') // hi world
+
+words= "hello world";
+words.substr(0,5) //hello
+```
+
+#### Boolean
+```js
+var bool = true;
+var bool = false;
+```
+
+```
+== 比较值相等
+!= 不等于
+=== 比较值和类型相等 ⭐️
+!== 不等于
+|| 或
+&& 且
+```
+
+```js
+1 == '1'
+true
+1 === '1'
+false
+```
+
+### 判断类型
+typeof
+```js
+var num = 1;
+typeof num //number
+```
+
+### 数据结构
+list、dict
+```js
+list = [1,2,3,4,5]
+dict = {'name':'zhangsan','age':18}
+```
+
+## 数组
+```js
+var arr = [1,2,3,4,5];
+var arr=new Array();
+```
+
+* push():将一个或多个元素添加到数组末尾,并返回修改后的数组。
+* pop():删除并返回数组的最后一个元素。
+* shift():删除并返回数组的第一个元素。
+* unshift():将一个或多个元素添加到数组的开头,并返回新的长度。
+* slice(start, count):返回一个新数组,包含从起始位置到结束位置(不包括结束位置)的所有元素。
+* splice(start, deleteCount, item1, item2, ...):从指定位置开始修改数组,可以删除元素、插入新元素或替换现有元素,并返回一个包含被删除元素的数组。
+* concat(...arrays):连接两个或多个数组(返回新数组)。
+* reverse():反转数组中元素的顺序(操作源数组)。
+* sort():对数组中的元素进行排序。
+* indexOf(searchElement, fromIndex):返回指定元素在数组中第一次出现的位置。
+* lastIndexOf(searchElement, fromIndex):返回指定元素在数组中最后一次出现的位置。
+
+---
+
+`slice()` 方法返回一个新的数组,包含从原始数组中指定起始位置到结束位置(不包括结束位置)的所有元素。它接受两个参数:
+
+起始位置(可选):从哪个位置开始提取元素。如果省略,则默认从索引 0 开始。
+结束位置(可选):在哪个位置结束提取元素。如果省略,则默认提取到数组末尾。
+
+---
+
+`splice()` 可以删除或者替换,它可以用来修改数组。它接受三个参数:
+
+* 起始位置(必需):从哪个位置开始修改数组。
+* 删除数量(可选):要删除多少个元素。如果省略,则从起始位置开始删除剩余的所有元素。
+* 插入的元素(可选):要插入到数组中的新元素。
+
+`splice()` 方法将修改原始数组并返回一个包含被删除元素的数组,如果没有元素被删除则返回一个空数组。
+
+### 数组遍历
+
+```js
+var arr = [1,2,3,4,5];
+for(var i=0;i
+## 常用操作
+#### console log
+
+```js
+console.log('hello world');
+```
+
+#### 定时
+
+内置函数 setinterval()、settimeout()
+
+每秒钟打印一次hello world
+```js
+var timer = setInterval(function(){
+ console.log('hello world');
+},1000);
+
+//停止打印
+clearInterval(timer);
+```
+
+3秒钟后打印hello world
+```js
+setTimeout(function(){
+ console.log('hello world');
+},3000);
+```
+
+#### 弹窗等
+
+```js
+alert('hello world'); //弹窗
+confirm('hello world'); //弹窗,点击确定返回true,点击取消返回false
+prompt('hello world'); //弹窗,输入框
+```
+
+
+#### 重定向
+
+location 对象用于获得当前页面的地址(URL)并把浏览器重定向到新的页面。
+
+```js
+location.href //返回当前页面的URL
+location.href = 'https://cornradio.github.io'//重定向到新的页面
+location.reload() //重新加载当前文档
+```
+
+#### 通过js绑定onclick事件
+
+给btn绑定onclick事件,点击btn时打印 hello world
+
+```js
+//js 风格
+var btn = document.getElementById('btn');
+btn.onclick = function(){
+ console.log('hello world');
+}
+//老派java风格
+btn.addEventListener('click',function(){
+ console.log('hello world');
+})
+//执行
+btn.click();
+```
+
+注意需要将script标签放在body标签的最后面,否则会找不到元素。或者可以使用等待加载listener。
+
+```js
+//等待加载dom元素后再执行(较快速)
+document.addEventListener("DOMContentLoaded", function() {
+ const button = document.querySelector('button');
+ button.onclick = function(){
+ console.log('hello world');
+ }
+});
+
+//等待将图片加载后再执行(较好写)
+window.onload = function(){
+ const button = document.querySelector('button');
+ button.onclick = function(){
+ console.log('hello world');
+ }
+}
+```
+
diff --git a/content/post/old/2023-03-20-php-1.md b/content/post/old/2023-03-20-php-1.md
new file mode 100644
index 00000000..ecf732bb
--- /dev/null
+++ b/content/post/old/2023-03-20-php-1.md
@@ -0,0 +1,1187 @@
++++
+title = "PHP - 1 "
+description = ""
+date = 2023-03-23T14:02:18+08:00
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "php"
+]
+series = []
+images = []
++++
+
+学习一下上古语言,
+据说渗透测试用得到。
+
+
+
+## 环境搭建
+环境搭建推荐用这个:
+[php study(一件配环境)](https://www.xp.cn) ,这个东西支持macos,windows,linux,还有php的版本管理,很方便。
+
+写代码的话就vscode吧,简单写点不用复杂的ide。
+
+> 修改了php代码,网页没有实时效果的话,要在phpstudy环境中关闭”缓存插件“
+>
+> 选择apache 和 nginx 做中间件效果都差不多。
+
+## php介绍
+
+PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。
+在一个php文件中可以包括以下内容:
+PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
+PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器
+PHP 文件的默认文件扩展名是 ".php"
+php的使用:
+1. PHP 可以生成动态页面内容
+2. PHP 可以创建、打开、读取、写入、关闭服务器上的文件
+3. PHP 可以收集表单数据
+4. PHP 可以发送和接收 cookies
+5. PHP 可以添加、删除、修改您的数据库中的数据
+6. PHP 可以限制用户访问您的网站上的一些页面
+7. PHP 可以加密数据
+
+## php命名规范
+* 类名首字母大写 Person
+* 方法名首字母小写 say ,驼峰命名 sayHello
+* 属性名首字母小写 name
+* 常量名全部大写 PI
+
+## 变量作用域
+PHP 有三种不同的变量作用域:
+global(全局)
+local(局部)
+static(静态)
+
+### global
+global -- 全局变量。
+
+与其他语言不同,PHP 中的全局变量默认在函数内不能使用,需要使用 global 关键字。
+```php
+$a = "asdfsadf"
+function my_callback_function() {
+ echo 'hello world!'.$a;//报错
+}
+```
+如果想要在函数内部访问一个全局变量,需要使用 global 关键字:
+```php
+$a = "asdfsadf"
+
+function myfun() {
+ global $a;
+ echo 'hello world!'.$a;
+}
+myfun();
+```
+或者使用`$GLOBALS['a']`
+```php
+$a = "asdfsadf"
+
+function myfun() {
+ echo 'hello world!'.$GLOBALS['a'];
+}
+myfun();
+```
+### local:
+函数内部变量默认作用域就是local,函数执行结束后,该变量的值会消失。
+```php
+function myTest() {
+ $x=0;
+ echo $x."
";
+ $x++;
+}
+myTest();//0
+myTest();//0
+myTest();//0
+```
+
+### static 关键字:
+static关键字用于函数内部,即使函数执行结束后,该变量的值也不会消失,而是保持原来的值。
+```php
+function myTest() {
+ static $x=0;
+ echo $x."
";
+ $x++;
+}
+myTest();//0
+myTest();//1
+myTest();//2
+```
+
+
+## php的语法
+```php
+
+```
+
+php的变量
+```php
+
+```
+
+
+
+### php 数据类型
+
+
+php中的数据类型有以下几种:
+(变量前面的`$`符号是必须的)
+
+```php
+
+
+```
+
+
+### php 的 预定义常量
+```
+__FILE__ 文件的完整路径和文件名
+__LINE__ 文件中的当前行号
+PHP_VERSION PHP 的版本号
+PHP_OS 操作系统的名称
+```
+
+```php
+";
+echo __LINE__;// 3(当前代码所在行的行号)
+echo "
";
+echo PHP_VERSION;// 7.2.10
+echo "
";
+echo PHP_OS; //WINNT Linux Darwin
+echo "
";
+echo DIRECTORY_SEPARATOR;// win\ lin/
+$mydir = 'path' . DIRECTORY_SEPARATOR . 'to' . DIRECTORY_SEPARATOR . 'my' . DIRECTORY_SEPARATOR . 'directory';
+echo $mydir;
+?>
+```
+
+### php 的数字
+```php
+$a = 120 //十进制
+$a = 0b110 //二进制
+$a = 0120 //八进制
+$a = 0x120 //十六进制
+
+// 使用echo输出时。默认输出为十进制
+decbin() // 十进制转二进制
+decoct() // 十进制转八进制
+dechex() // 十进制转十六进制
+
+bindec() // 二进制转十进制
+bin2hex() //二进制转十六进制
+
+octdec() // 八进制转十进制
+hexdec() // 十六进制转十进制
+```
+### 循环
+```php
+for($i=0;$i";
+}
+```
+
+## php的字符串
+用单引号或者双引号括起来的内容都是字符串
+
+双引号中可以使用变量。
+
+字符串相加使用`.`
+
+
+常用函数:
+- strlen、strpos、explode、substr
+- 长度、位置、分割、截取
+```php
+$str = "Hello World";
+echo $str;
+echo $str[0];
+
+//str1 + str2
+echo $str." love ".$str;
+echo "
";
+
+echo "love $str";//变量解析
+echo "
";
+echo 'love $str';//变量不解析
+echo "
";
+```
+
+### 字符串 常用的函数
+
+strlen():此函数用于返回字符串的长度。例如:
+
+```php
+$str = "Hello World";
+echo strlen($str); // 输出 11
+```
+
+strpos():此函数在字符串中查找第一次出现指定字符或字符串的位置。例如:
+
+```php
+$str = "Hello World";
+echo strpos($str, "World"); // 输出 6
+```
+substr():此函数返回字符串的子串。例如:
+```php
+$str = "Hello World";
+echo substr($str, 0, 5); // 输出 Hello
+```
+str_replace():此函数用于替换字符串中的某些字符。例如:
+```php
+$str = "Hello World";
+echo str_replace("World", "PHP", $str); // 输出 Hello PHP
+```
+
+## 字符串加密函数
+好的,下面举例说明一下这几种加密函数的用法:
+
+md5()函数:
+
+```php
+$str = 'Hello World!';
+$encrypted_str = md5($str);
+echo $encrypted_str;
+// 输出结果:b10a8db164e0754105b7a99be72e3fe5
+
+```
+sha1()函数:
+
+```php
+$str = 'Hello World!';
+$encrypted_str = sha1($str);
+echo $encrypted_str;
+// 输出结果:0a4d55a8d778e5022fab701977c5d840bbc486d0
+
+```
+base64_encode()函数:
+
+```php
+$str = 'Hello World!';
+$encoded_str = base64_encode($str);
+echo $encoded_str;
+// 输出结果:SGVsbG8gV29ybGQh
+
+```
+
+password_hash()和password_verify()函数:
+```php
+$password = 'mypassword';
+$hashed_password = password_hash($password, PASSWORD_DEFAULT);
+echo $hashed_password; // 输出生成的哈希值
+
+// 验证输入密码是否与哈希值匹配
+
+$input_password = 'mypassword';
+if (password_verify($input_password, $hashed_password)) {
+ echo 'Password is valid!';
+} else {
+ echo 'Invalid password.';
+}
+```
+
+关于对称加密算法和非对称加密算法,它们的用法相对复杂,需要使用特定的算法和密钥进行加密和解密。
+
+
+
+
+## php特有的 @、define
+
+### 抑制符
+@ 符号是一个错误控制运算符,可以用来抑制代码中的错误或警告信息。使用 @ 符号会使 PHP 引擎忽略后面的表达式中的任何错误提示,并且不会将这些错误信息输出到浏览器端。
+
+@ 符号并不能完全屏蔽所有的错误提示,一些致命错误依然会导致 PHP 引擎停止执行。
+
+```php
+
+```
+
+### php的常量
+
+php 使用 define() 函数来定义常量。
+
+```php
+
+```
+
+## php引用 include
+include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。
+
+* require 会生成致命错误(E_COMPILE_ERROR)并停止脚本
+* include 只生成警告(E_WARNING),并且脚本会继续
+
+除了include php文件外,还可以include html文件,比如引入 header 、 footer之类的。
+
+### 语法
+两种都可以
+```php
+include 'filename';
+include('filename');
+```
+
+
+## php 函数
+使用关键字 function 来声明一个函数。
+```php
+function sayHi() {
+ echo "Hello world!";
+}
+sayhi();//函数名对大小写不敏感
+```
+
+### 参数、返回值
+```php
+function add($x, $y) {
+ $total = $x + $y;
+ return $total;
+}
+echo "1 + 16 = " . add(1,16);
+```
+
+### 匿名函数
+不写函数名称,而是直接附值到一个变量上
+```php
+$greet = function($name)
+{
+ echo "Hello $name
";
+};
+$greet('World');
+$greet('PHP');
+```
+
+### 回调函数
+和委托类似,回调函数是指在某个特定事件发生时由另外一个函数来“调用”的函数。
+```php
+function my_callback_function() {
+ echo 'hello world!';
+}
+call_user_func('my_callback_function');
+call_user_func('my_callback_function', 'parameter1', 'parameter2', 'parameter3');
+```
+
+## php的类
+
+### 关键字 public / protected / private
+* public 公有的,可以在类的内部或者外部被访问
+* protected 受保护的,只能在类的内部被访问,或者被继承的子类访问
+* private 私有的,只能在类的内部被访问,不能被继承的子类访问
+如果没有设置这些关键字,默认为public
+
+### 常量
+* const 常量,不能被修改
+* 可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
+
+### final
+PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
+
+
+### person类
+* __construct 构造函数
+* __destruct 析构函数(当对象被销毁时调用)
+```php
+class Person{
+ public $name;//public 或者 protected 或者 private
+ public $age;
+ public $sex;
+
+ public function __construct($name,$age,$sex){
+ $this->name = $name;
+ $this->age = $age;
+ $this->sex = $sex;
+ }
+
+ public function __destruct(){
+ echo "destruct";
+ }
+
+ public function say(){
+ echo "my name is ".$this->name.",i am ".$this->age." years old,i am ".$this->sex;
+ }
+}
+```
+
+### 实例化
+```php
+$person = new Person("zhangsan",18,"man");
+$person->say();
+```
+
+
+### php的继承
+
+```php
+class Student extends Person{
+ public $school;
+ public function __construct($name,$age,$sex,$school){
+ parent::__construct($name,$age,$sex);
+ $this->school = $school;
+ }
+ public function say(){
+ echo "my name is ".$this->name.",i am ".$this->age." years old,i am ".$this->sex.",i am in ".$this->school;
+ }
+}
+```
+
+### 子类调用父类方法
+子类可以通过`parent::方法名()`来调用父类的方法。
+
+```php
+class Student extends Person{
+ public $school;
+ public function __construct($name,$age,$sex,$school){
+ parent::__construct($name,$age,$sex);
+ $this->school = $school;
+ }
+ public function say(){
+ parent::say(); //调用父类的方法
+ echo ",i am in ".$this->school;
+ }
+}
+```
+
+### php的接口
+
+类实现接口时,必须实现接口中的所有方法。
+下面的例子中,Person类实现了PersonInterface接口,它必须实现getName和setName方法,否则会报错。
+
+```php
+interface PersonInterface{
+ const NAME = "zhangsan";
+ public function getName();
+ public function setName($name);
+}
+
+class Person implements PersonInterface{
+ private $name;
+ public $age;
+ public $sex;
+
+ public function __construct($name,$age,$sex){
+ $this->name = $name;
+ $this->age = $age;
+ $this->sex = $sex;
+ }
+ public function getName(){
+ return $this->name;
+ }
+ public function setName($name){
+ $this->name = $name;
+ }
+}
+
+$person = new Person("zhangsan",18,"man");
+var_dump($person);
+```
+
+### 类可以实现多个接口
+下面的例子中,Person类实现了PersonInterface和animalInterface接口,它必须实现接口中的所有方法。
+```php
+interface PersonInterface{
+ const NAME = "zhangsan";
+ public function getName();
+ public function setName($name);
+}
+
+interface animalInterface{
+ const NAME = "animal";
+ public function eat();
+ public function sleep();
+}
+
+class Person implements PersonInterface,animalInterface{
+ private $name;
+ public $age;
+ public $sex;
+
+ public function __construct($name,$age,$sex){
+ $this->name = $name;
+ $this->age = $age;
+ $this->sex = $sex;
+ }
+ public function getName(){
+ return $this->name;
+ }
+ public function setName($name){
+ $this->name = $name;
+ }
+ public function eat(){
+ echo "eat";
+ }
+ public function sleep(){
+ echo "sleep";
+ }
+}
+```
+### php的抽象类
+抽象类不能被new,只能被继承extend。
+抽象类中可以有抽象方法,也可以有普通方法。
+抽象方法(abstract)只能在抽象类中定义,抽象方法只有方法名和参数。
+抽象类中的抽象方法必须被子类实现,否则子类也必须声明为抽象类。
+
+抽象类`abstract·` 和接口`interface` 的区别
+* 抽象类可以有属性和方法,接口只能有方法
+* 抽象类可以有构造函数,接口不能有构造函数
+* 抽象类可以被继承,接口只能被实现
+* 类只能继承一个抽象类,可以实现多个接口
+
+```php
+abstract class Person{
+ public $name;
+ public $age;
+ public $sex;
+
+ public function __construct($name,$age,$sex){
+ $this->name = $name;
+ $this->age = $age;
+ $this->sex = $sex;
+ }
+ abstract public function say();
+ abstract public function eat();
+}
+```
+
+## php 命名空间
+### 命名空间的概念
+> 命名空间是一种为了解决命名冲突的机制,它允许你在一个脚本中定义多个同名的类、函数或常量,而不会产生冲突。
+
+使用 namespace 关键字
+
+```php
+namespace MyProject;
+const CONNECT_OK = 1;
+echo CONNECT_OK;
+
+namespace AnotherProject; //尝试注释掉这一行
+const CONNECT_OK = 2;
+echo CONNECT_OK;
+```
+
+### 引入命名空间
+#### 引用整个命名空间
+```php
+name = $name;
+ $this->color = $color;
+ $this->brand = $brand;
+ }
+ public function getCar() {
+ echo "My car is a " . $this->color . " " . $this->brand . " " . $this->name . ".";
+ }
+}
+```
+在 1.php 引用他
+
+```php
+include 't.php';
+use carcarplace\Car;
+$myCar = new Car("M3","Black","BMW");
+$myCar->getCar();
+```
+
+## php正则表达式
+//preg_match_all() 函数返回所有匹配的数组
+//preg_match() 函数返回第一个匹配的数组
+//preg_replace() 函数返回替换后的字符串
+//preg_split() 函数返回分割后的数组
+//preg_grep() 函数返回匹配的数组
+//preg_quote() 函数返回转义后的字符串
+//preg_last_error() 函数返回最后一个错误代码
+//preg_filter() 函数返回过滤后的数组
+
+//preg_match_all() 函数返回所有匹配的数组
+//preg_match() 函数返回第一个匹配的数组
+//preg_replace() 函数返回替换后的字符串
+//preg_split() 函数返回分割后的数组
+//preg_grep() 函数返回匹配的数组
+//preg_quote() 函数返回转义后的字符串
+//preg_last_error() 函数返回最后一个错误代码
+//preg_filter() 函数返回过滤后的数组
+
+### preg_match_all() 函数
+在双斜杠之间的内容是正则表达式模式,
+- i 修饰符用于执行不区分大小写的搜索。
+- g 用于执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
+- 括号是分组标记,用于在匹配中捕获子模式。
+
+```php
+
+```
+
+## php文件操作
+### 读取文件
+#### php 打开并读取文件
+```php
+$fp = fopen("test.txt", "r");
+echo fread($fp, filesize("test.txt"));
+fclose($fp);
+```
+#### 单行读取文件 - fgets()
+可以接受两个参数,文件指针,最大长度,如果不指定最大长度,将读取整行。
+> 下面例子中
+> - 使用 fgets() 函数来读取文件中的单行
+> - 使用 feof() 函数来检查是否已到达文件末尾
+> - 每一行都采用 md5() 函数进行加密,然后输出到浏览器中。
+>
+```php
+$fp = fopen("test.txt", "r");
+while(!feof($fp))
+{
+ // echo fgets($fp). "
";
+ echo md5(fgets($fp)). "
";
+}
+fclose($fp);
+```
+
+### 写入文件
+#### php 打开并写入文件
+```php
+$fp = fopen("test.txt", "w");
+fwrite($fp, "Hello World. Testing!\r\n");
+fwrite($fp, "Hello World. Testing!");
+fclose($fp);
+echo "写入成功";
+```
+
+### 复制、删除、重命名文件
+#### 复制文件 - copy()
+```php
+copy("test.txt", "test2.txt");
+echo "复制成功";
+```
+#### 删除文件 - unlink()
+```php
+unlink("test2.txt");
+echo "删除成功";
+```
+#### 重命名文件 - rename()
+```php
+rename("test.txt", "test3.txt");
+echo "重命名成功";
+```
+### 其他常用文件操作函数
+is_readable、is_writable、is_executable
+
+filectime、filemtime、fileatime
+(create、modify、access)
+```php
+$file = 'test.txt';
+file_exists($file) or die('文件不存在,程序退出!');
+
+echo $file.' 文件大小是:'.filesize($file).' 个字节
';
+if(is_readable($file)){
+ echo $file.' 文件是可读的。
';
+}else{
+ echo $file.' 文件是不可读的。
';
+}
+if(is_writable($file)){
+ echo $file.' 文件是可写的。
';
+}else{
+ echo $file.' 文件是不可写的。
';
+}
+if(is_executable($file)){
+ echo $file.' 文件是可执行的。
';
+}else{
+ echo $file.' 文件是不可执行的。
';
+}
+echo '文件的创建时间是:'.date('Y-m-d H:i:s',filectime($file)).'。
';
+echo '文件的修改时间是:'.date('Y-m-d H:i:s',filemtime($file)).'。
';
+echo '文件上次的访问时间是:'.date('Y-m-d H:i:s',fileatime($file)).'。
';
+```
+
+
+## PHP超级全局变量 - 以及表单
+### print_r函数:
+print_r 函数是 PHP 中一个功能强大的函数,可用于打印变量的易读信息。它对于调试代码、理解复杂的数据结构以及查找代码中的错误非常有用。
+
+如果要显示带有换行的内容,需要在输出的 HTML 代码中添加 `` 标签
+```php
+
+name = $name;
+ $this->age = $age;
+ $this->email = $email;
+ }
+ }
+
+ // 创建一个 Person 对象并打印信息
+ $person = new Person('John', 30, 'john@example.com');
+ print_r($person);
+
+ ?>
+
+```
+
+- PHP超级全局变量主要有:
+
+### * `$GLOBALS`:
+该变量用于引用脚本中的全局变量,在函数或方法中使用时非常有用。
+
+```php
+
+
+
+```
+
+### * `$_SERVER`:
+该变量包含与当前运行 PHP 的服务器相关的信息,例如 URL、文件路径、HTTP 头等。
+
+```
+Array
+(
+ [USER] => kasusa
+ [COMMAND_MODE] => unix2003
+ [__CFBundleIdentifier] => com.yourcompany.phpstudy-pro
+ [PATH] => /usr/bin:/bin:/usr/sbin:/sbin
+ [LOGNAME] => kasusa
+ [SSH_AUTH_SOCK] => /private/tmp/com.apple.launchd.hCvBqjuPFw/Listeners
+ [HOME] => /Users/kasusa
+ [SHELL] => /bin/zsh
+ [TMPDIR] => /var/folders/yr/zk0mghjs43l7b8qz_4mbdy480000gn/T/
+ [__CF_USER_TEXT_ENCODING] => 0x1F5:0x19:0x34
+ [XPC_SERVICE_NAME] => 0
+ [XPC_FLAGS] => 0x0
+ [HTTP_CONNECTION] => keep-alive
+ [HTTP_ACCEPT_ENCODING] => gzip, deflate
+ [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh-Hans;q=0.9
+ [HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15
+ [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
+ [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
+ [HTTP_HOST] => localhost
+ [REDIRECT_STATUS] => 200
+ [SERVER_NAME] => localhost
+ [SERVER_PORT] => 80
+ [SERVER_ADDR] => 127.0.0.1
+ [REMOTE_PORT] => 49565
+ [REMOTE_ADDR] => 127.0.0.1
+ [SERVER_SOFTWARE] => nginx/1.16.1
+ [GATEWAY_INTERFACE] => CGI/1.1
+ [REQUEST_SCHEME] => http
+ [SERVER_PROTOCOL] => HTTP/1.1
+ [DOCUMENT_ROOT] => /Applications/phpstudy/WWW
+ [DOCUMENT_URI] => /1.php
+ [REQUEST_URI] => /1.php
+ [SCRIPT_NAME] => /1.php
+ [CONTENT_LENGTH] =>
+ [CONTENT_TYPE] =>
+ [REQUEST_METHOD] => GET
+ [QUERY_STRING] =>
+ [PATH_TRANSLATED] => /Applications/phpstudy/WWW
+ [PATH_INFO] =>
+ [SCRIPT_FILENAME] => /Applications/phpstudy/WWW/1.php
+ [FCGI_ROLE] => RESPONDER
+ [PHP_SELF] => /1.php
+ [REQUEST_TIME_FLOAT] => 1679464788.7792
+ [REQUEST_TIME] => 1679464788
+)
+```
+
+### * `$_REQUEST` 、`$_POST` 、`$_GET`
+该变量包含了从 GET、POST 和 COOKIE 中收集到的用户提交的数据。它可以轻松地访问所有 HTTP 请求变量。
+
+```php
+
+
+
+
+
+
+```
+
+> Post 和 Get 是 HTTP 协议中的两种常见请求方法,用于向服务器发送请求并获取响应。
+>
+>Get 请求通常用于从服务器获取资源,如 Web 页面、图片、视频等。它通过 >URL 参数将数据传递给服务器,因此在浏览器地址栏中可以看到请求的参数。
+>
+>Post 请求则通常用于将数据发送给服务器,比如提交表单数据、上传文件等。
+>Post 请求将数据包含在请求体中,并且不会在 URL 中暴露数据,因此更安全。
+>
+>总体来说,Get 和 Post 的主要区别在于数据传输方式和用途。Get 请求适合请求少量数据,Post 请求适合传输大量数据和敏感数据。
+
+### * `$_FILES` :
+该变量用于上传文件类型的表单数据。
+```php
+
+
+
+
+
+```
+
+返回值示例:
+```
+(
+ [file] => Array
+ (
+ [name] => 52.jpg
+ [type] => image/jpeg
+ [tmp_name] => /private/var/folders/yr/zk0mghjs43l7b8qz_4mbdy480000gn/T/phpzC0q0A
+ [error] => 0
+ [size] => 1032252
+ )
+)
+```
+
+* $_FILES['name']:上传文件的原始名称。
+* $_FILES['type']:上传文件的 MIME 类型。
+* $_FILES['size']:上传文件的大小(以字节为单位)。
+* $_FILES['tmp_name']:上传文件的临时存储路径,通常在服务器的临时目录中。
+* $_FILES['error']:上传文件时可能发生的错误代码,例如文件过大或文件类型不支持等。如果没有发生错误,则该变量值为 0。
+
+
+### * `$_ENV` :
+
+$_ENV 变量是在服务器端设置的,通常由操作系统或 Web 服务器配置文件中的设置传递给 PHP 的。
+
+在 Linux 系统中,你可以使用 export 命令来设置环境变量。例如,要将名为 API_KEY 的环境变量设置为一个 API 密钥值,可以执行以下命令:
+
+```
+export API_KEY=your_api_key_value
+```
+
+在 Windows 系统中,可以通过控制面板的"系统"->"高级系统设置"->"环境变量"来设置环境变量。
+
+在 PHP 脚本中,你可以使用 $_ENV 数组来访问这些设置的变量。例如,要获取上面设置的 API 密钥,你可以使用以下代码:
+
+```php
+Copy Code
+$apiKey = $_ENV['API_KEY'];
+```
+
+需要注意的是,不同的 Web 服务器和操作系统可能有不同的方法来设置环境变量。
+
+
+### * `$_COOKIE` :
+该变量可用于读取用户在浏览器中存储的 cookie 数据。
+```php
+if (isset($_COOKIE['username'])) {
+ // do something with the cookie value
+ print_r($_COOKIE);
+}
+```
+
+### * `$_SESSION` :
+该变量可用于存储并访问会话数据,直到用户关闭浏览器为止。
+
+
+## php 目录操作
+### 创建目录mkdir()
+```php
+mkdir("test");
+echo "创建成功";
+```
+### 删除目录rmdir()
+```php
+rmdir("test");
+echo "删除成功";
+```
+### 遍历目录
+`opendir` 打开目录
+`is_dir()` 判断是否是目录
+`readdir()` 读取目录
+`closedir()` 关闭目录
+```php
+$dir = opendir("/");
+while($file = readdir($dir))
+{
+ $fullpath = "/".$file;
+ //输出是目录还是文件
+ if(is_dir($fullpath))
+ echo "📁dir: ";
+ else
+ echo "file: ";
+ //输出文件名
+ echo $file. "
";
+}
+closedir($dir);
+```
+
+### demo php文件浏览器:
+我让chatgpt帮我写的
+```php
+// 设置要浏览的目录路径
+$dir_path = "/";
+
+// 如果有文件夹名称参数,更新要浏览的目录路径
+if (isset($_GET['folder'])) {
+ $folder_path = $_GET['folder'];
+ // 将相对路径转换成绝对路径
+ $dir_path .= "/". ($folder_path == '.' ? '' : $folder_path);
+}
+
+// 遍历目录并获取文件名和大小
+$files = array();
+if ($handle = opendir($dir_path)) {
+ while (false !== ($entry = readdir($handle))) {
+ if ($entry != "." && $entry != "..") {
+ $fullpath = $dir_path . "/" . $entry;
+ if (is_dir($fullpath)) {
+ $files[] = array(
+ 'name' => $entry,
+ 'type' => 'dir'
+ );
+ } else {
+ $files[] = array(
+ 'name' => $entry,
+ 'type' => pathinfo($fullpath, PATHINFO_EXTENSION)
+ );
+ }
+ }
+ }
+ closedir($handle);
+}
+
+// 输出文件列表
+echo "";
+echo "pwd:$folder_path
";
+if ($folder_path != '') {
+ // 添加返回上一级目录链接(除了根目录)
+ echo "- ..
";
+}
+foreach ($files as $file) {
+ if ($file['type'] == 'dir') {
+ echo "- " . $file['name'] . "
";
+ } else {
+ echo "- " . $file['name'] ."
";
+ }
+}
+echo "
";
+```
+
+## php链接mysql数据库
+
+mysqli 和 mysql
+- 从 PHP 5.5.0 版本开始,mysql 扩展已经废弃,从 PHP 7.0.0 版本开始,mysql 扩展已被移除
+- mysqli 则是 MySQLi(MySQL improved)的缩写,是官方推荐的用于连接 MySQL 数据库的扩展
+
+
+### 面向过程方式
+面向过程方式下,连接 MySQL 数据库通常使用 mysqli_connect() 函数,该函数的参数分别为数据库服务器的地址、用户名、密码和数据库名,返回一个 MySQL 连接标识符,如果连接失败则返回 FALSE。
+```php
+";
+$result = mysqli_query($conn, $sql);
+
+// 处理查询结果
+while ($row = mysqli_fetch_assoc($result)) {
+ echo "User: " . $row["User"] . "
";
+}
+
+// 关闭数据库连接
+mysqli_close($conn);
+
+```
+
+> 使用 `fetch_assoc` 方法从 $result 结果集中获取一行数据,并将其赋值给 $row 变量,如果没有数据了,则返回 FALSE。(一行一行的获取,直到没有数据为止)
+>
+> 如果使用 `fetch_row` 方法,则返回的是一个索引数组,如果使用 `fetch_array` 方法,则返回的是一个关联数组和索引数组的结合
+
+
+### 面向对象方式
+
+面向对象方式下,连接 MySQL 数据库通常使用 mysqli 或者 PDO 类。这些类封装了数据库连接和操作,更加易于维护和扩展
+
+基本上就是,全都是调用属性和方法。
+
+#### 连接数据库,查询
+```php
+connect_error) {
+ die("Connection failed: " . $conn->connect_error);
+}
+
+// 执行查询语句
+$sql = "SELECT * FROM user";
+$result = $conn->query($sql);
+
+// 处理查询结果
+while ($row = $result->fetch_assoc()) {
+ echo "User: " . $row["User"] . "
";
+}
+
+// 关闭数据库连接
+$conn->close();
+```
+
+#### 建表
+```php
+$conn = new mysqli($host, $user, $password)
+$conn->select_db($database);
+// 执行查询语句
+$sql = "CREATE TABLE MyGuests (
+ id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
+ firstname VARCHAR(30) NOT NULL,
+ lastname VARCHAR(30) NOT NULL,
+ email VARCHAR(50),
+ reg_date TIMESTAMP
+ )";
+
+$conn->query($sql);
+```
+
+#### 与表单form联动
+```php
+
+
+connect_error) {
+ die("Connection failed: " . $conn->connect_error);
+}
+//if isset post
+if (isset($_GET['name'])) {
+ // 执行查询语句
+ $conn->select_db("test");
+ $sql = "select * from MyGuests where firstname = '" . $_GET['name']."'";
+ echo "sql:".$sql."
";
+ $result=$conn->query($sql);
+
+ // // 处理查询结果
+ while ($row = $result->fetch_assoc()) {
+ //id firstname lastname email
+ echo "id: " . $row["id"] . "; Name: " . $row["firstname"] . " " . $row["lastname"] . "
";
+ }
+}
+
+// 关闭数据库连接
+$conn->close();
+```
diff --git a/content/post/old/2023-03-20-php-2.md b/content/post/old/2023-03-20-php-2.md
new file mode 100644
index 00000000..07ebc582
--- /dev/null
+++ b/content/post/old/2023-03-20-php-2.md
@@ -0,0 +1,614 @@
++++
+title = "PHP - 2 "
+description = ""
+date = 2023-03-23T14:02:18+08:00
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "php"
+]
+series = []
+images = []
++++
+
+学习一下上古语言,
+据说渗透测试用得到。
+
+
+
+## 字符串加密函数
+好的,下面举例说明一下这几种加密函数的用法:
+
+md5()函数:
+
+```php
+$str = 'Hello World!';
+$encrypted_str = md5($str);
+echo $encrypted_str;
+// 输出结果:b10a8db164e0754105b7a99be72e3fe5
+
+```
+sha1()函数:
+
+```php
+$str = 'Hello World!';
+$encrypted_str = sha1($str);
+echo $encrypted_str;
+// 输出结果:0a4d55a8d778e5022fab701977c5d840bbc486d0
+
+```
+base64_encode()函数:
+
+```php
+$str = 'Hello World!';
+$encoded_str = base64_encode($str);
+echo $encoded_str;
+// 输出结果:SGVsbG8gV29ybGQh
+
+```
+
+password_hash()和password_verify()函数:
+```php
+$password = 'mypassword';
+$hashed_password = password_hash($password, PASSWORD_DEFAULT);
+echo $hashed_password; // 输出生成的哈希值
+
+// 验证输入密码是否与哈希值匹配
+
+$input_password = 'mypassword';
+if (password_verify($input_password, $hashed_password)) {
+ echo 'Password is valid!';
+} else {
+ echo 'Invalid password.';
+}
+```
+
+关于对称加密算法和非对称加密算法,它们的用法相对复杂,需要使用特定的算法和密钥进行加密和解密。
+
+
+## php正则表达式
+//preg_match_all() 函数返回所有匹配的数组
+//preg_match() 函数返回第一个匹配的数组
+//preg_replace() 函数返回替换后的字符串
+//preg_split() 函数返回分割后的数组
+//preg_grep() 函数返回匹配的数组
+//preg_quote() 函数返回转义后的字符串
+//preg_last_error() 函数返回最后一个错误代码
+//preg_filter() 函数返回过滤后的数组
+
+//preg_match_all() 函数返回所有匹配的数组
+//preg_match() 函数返回第一个匹配的数组
+//preg_replace() 函数返回替换后的字符串
+//preg_split() 函数返回分割后的数组
+//preg_grep() 函数返回匹配的数组
+//preg_quote() 函数返回转义后的字符串
+//preg_last_error() 函数返回最后一个错误代码
+//preg_filter() 函数返回过滤后的数组
+
+### preg_match_all() 函数
+在双斜杠之间的内容是正则表达式模式,
+- i 修饰符用于执行不区分大小写的搜索。
+- g 用于执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
+- 括号是分组标记,用于在匹配中捕获子模式。
+
+```php
+
+```
+
+## php文件操作
+### 读取文件
+#### php 打开并读取文件
+```php
+$fp = fopen("test.txt", "r");
+echo fread($fp, filesize("test.txt"));
+fclose($fp);
+```
+#### 单行读取文件 - fgets()
+可以接受两个参数,文件指针,最大长度,如果不指定最大长度,将读取整行。
+> 下面例子中
+> - 使用 fgets() 函数来读取文件中的单行
+> - 使用 feof() 函数来检查是否已到达文件末尾
+> - 每一行都采用 md5() 函数进行加密,然后输出到浏览器中。
+>
+```php
+$fp = fopen("test.txt", "r");
+while(!feof($fp))
+{
+ // echo fgets($fp). "
";
+ echo md5(fgets($fp)). "
";
+}
+fclose($fp);
+```
+
+### 写入文件
+#### php 打开并写入文件
+```php
+$fp = fopen("test.txt", "w");
+fwrite($fp, "Hello World. Testing!\r\n");
+fwrite($fp, "Hello World. Testing!");
+fclose($fp);
+echo "写入成功";
+```
+
+### 复制、删除、重命名文件
+#### 复制文件 - copy()
+```php
+copy("test.txt", "test2.txt");
+echo "复制成功";
+```
+#### 删除文件 - unlink()
+```php
+unlink("test2.txt");
+echo "删除成功";
+```
+#### 重命名文件 - rename()
+```php
+rename("test.txt", "test3.txt");
+echo "重命名成功";
+```
+### 其他常用文件操作函数
+is_readable、is_writable、is_executable
+
+filectime、filemtime、fileatime
+(create、modify、access)
+```php
+$file = 'test.txt';
+file_exists($file) or die('文件不存在,程序退出!');
+
+echo $file.' 文件大小是:'.filesize($file).' 个字节
';
+if(is_readable($file)){
+ echo $file.' 文件是可读的。
';
+}else{
+ echo $file.' 文件是不可读的。
';
+}
+if(is_writable($file)){
+ echo $file.' 文件是可写的。
';
+}else{
+ echo $file.' 文件是不可写的。
';
+}
+if(is_executable($file)){
+ echo $file.' 文件是可执行的。
';
+}else{
+ echo $file.' 文件是不可执行的。
';
+}
+echo '文件的创建时间是:'.date('Y-m-d H:i:s',filectime($file)).'。
';
+echo '文件的修改时间是:'.date('Y-m-d H:i:s',filemtime($file)).'。
';
+echo '文件上次的访问时间是:'.date('Y-m-d H:i:s',fileatime($file)).'。
';
+```
+
+
+## PHP超级全局变量 - 以及表单
+### print_r函数:
+print_r 函数是 PHP 中一个功能强大的函数,可用于打印变量的易读信息。它对于调试代码、理解复杂的数据结构以及查找代码中的错误非常有用。
+
+如果要显示带有换行的内容,需要在输出的 HTML 代码中添加 `` 标签
+```php
+
+name = $name;
+ $this->age = $age;
+ $this->email = $email;
+ }
+ }
+
+ // 创建一个 Person 对象并打印信息
+ $person = new Person('John', 30, 'john@example.com');
+ print_r($person);
+
+ ?>
+
+```
+
+- PHP超级全局变量主要有:
+
+### * `$GLOBALS`:
+该变量用于引用脚本中的全局变量,在函数或方法中使用时非常有用。
+
+```php
+
+
+
+```
+
+### * `$_SERVER`:
+该变量包含与当前运行 PHP 的服务器相关的信息,例如 URL、文件路径、HTTP 头等。
+
+```
+Array
+(
+ [USER] => kasusa
+ [COMMAND_MODE] => unix2003
+ [__CFBundleIdentifier] => com.yourcompany.phpstudy-pro
+ [PATH] => /usr/bin:/bin:/usr/sbin:/sbin
+ [LOGNAME] => kasusa
+ [SSH_AUTH_SOCK] => /private/tmp/com.apple.launchd.hCvBqjuPFw/Listeners
+ [HOME] => /Users/kasusa
+ [SHELL] => /bin/zsh
+ [TMPDIR] => /var/folders/yr/zk0mghjs43l7b8qz_4mbdy480000gn/T/
+ [__CF_USER_TEXT_ENCODING] => 0x1F5:0x19:0x34
+ [XPC_SERVICE_NAME] => 0
+ [XPC_FLAGS] => 0x0
+ [HTTP_CONNECTION] => keep-alive
+ [HTTP_ACCEPT_ENCODING] => gzip, deflate
+ [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh-Hans;q=0.9
+ [HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15
+ [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
+ [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
+ [HTTP_HOST] => localhost
+ [REDIRECT_STATUS] => 200
+ [SERVER_NAME] => localhost
+ [SERVER_PORT] => 80
+ [SERVER_ADDR] => 127.0.0.1
+ [REMOTE_PORT] => 49565
+ [REMOTE_ADDR] => 127.0.0.1
+ [SERVER_SOFTWARE] => nginx/1.16.1
+ [GATEWAY_INTERFACE] => CGI/1.1
+ [REQUEST_SCHEME] => http
+ [SERVER_PROTOCOL] => HTTP/1.1
+ [DOCUMENT_ROOT] => /Applications/phpstudy/WWW
+ [DOCUMENT_URI] => /1.php
+ [REQUEST_URI] => /1.php
+ [SCRIPT_NAME] => /1.php
+ [CONTENT_LENGTH] =>
+ [CONTENT_TYPE] =>
+ [REQUEST_METHOD] => GET
+ [QUERY_STRING] =>
+ [PATH_TRANSLATED] => /Applications/phpstudy/WWW
+ [PATH_INFO] =>
+ [SCRIPT_FILENAME] => /Applications/phpstudy/WWW/1.php
+ [FCGI_ROLE] => RESPONDER
+ [PHP_SELF] => /1.php
+ [REQUEST_TIME_FLOAT] => 1679464788.7792
+ [REQUEST_TIME] => 1679464788
+)
+```
+
+### * `$_REQUEST` 、`$_POST` 、`$_GET`
+该变量包含了从 GET、POST 和 COOKIE 中收集到的用户提交的数据。它可以轻松地访问所有 HTTP 请求变量。
+
+```php
+
+
+
+
+
+
+```
+
+> Post 和 Get 是 HTTP 协议中的两种常见请求方法,用于向服务器发送请求并获取响应。
+>
+>Get 请求通常用于从服务器获取资源,如 Web 页面、图片、视频等。它通过 >URL 参数将数据传递给服务器,因此在浏览器地址栏中可以看到请求的参数。
+>
+>Post 请求则通常用于将数据发送给服务器,比如提交表单数据、上传文件等。
+>Post 请求将数据包含在请求体中,并且不会在 URL 中暴露数据,因此更安全。
+>
+>总体来说,Get 和 Post 的主要区别在于数据传输方式和用途。Get 请求适合请求少量数据,Post 请求适合传输大量数据和敏感数据。
+
+### * `$_FILES` :
+该变量用于上传文件类型的表单数据。
+```php
+
+
+
+
+
+```
+
+返回值示例:
+```
+(
+ [file] => Array
+ (
+ [name] => 52.jpg
+ [type] => image/jpeg
+ [tmp_name] => /private/var/folders/yr/zk0mghjs43l7b8qz_4mbdy480000gn/T/phpzC0q0A
+ [error] => 0
+ [size] => 1032252
+ )
+)
+```
+
+* $_FILES['name']:上传文件的原始名称。
+* $_FILES['type']:上传文件的 MIME 类型。
+* $_FILES['size']:上传文件的大小(以字节为单位)。
+* $_FILES['tmp_name']:上传文件的临时存储路径,通常在服务器的临时目录中。
+* $_FILES['error']:上传文件时可能发生的错误代码,例如文件过大或文件类型不支持等。如果没有发生错误,则该变量值为 0。
+
+
+### * `$_ENV` :
+
+$_ENV 变量是在服务器端设置的,通常由操作系统或 Web 服务器配置文件中的设置传递给 PHP 的。
+
+在 Linux 系统中,你可以使用 export 命令来设置环境变量。例如,要将名为 API_KEY 的环境变量设置为一个 API 密钥值,可以执行以下命令:
+
+```
+export API_KEY=your_api_key_value
+```
+
+在 Windows 系统中,可以通过控制面板的"系统"->"高级系统设置"->"环境变量"来设置环境变量。
+
+在 PHP 脚本中,你可以使用 $_ENV 数组来访问这些设置的变量。例如,要获取上面设置的 API 密钥,你可以使用以下代码:
+
+```php
+Copy Code
+$apiKey = $_ENV['API_KEY'];
+```
+
+需要注意的是,不同的 Web 服务器和操作系统可能有不同的方法来设置环境变量。
+
+
+### * `$_COOKIE` :
+该变量可用于读取用户在浏览器中存储的 cookie 数据。
+```php
+if (isset($_COOKIE['username'])) {
+ // do something with the cookie value
+ print_r($_COOKIE);
+}
+```
+
+### * `$_SESSION` :
+该变量可用于存储并访问会话数据,直到用户关闭浏览器为止。
+
+
+## php 目录操作
+### 创建目录mkdir()
+```php
+mkdir("test");
+echo "创建成功";
+```
+### 删除目录rmdir()
+```php
+rmdir("test");
+echo "删除成功";
+```
+### 遍历目录
+`opendir` 打开目录
+`is_dir()` 判断是否是目录
+`readdir()` 读取目录
+`closedir()` 关闭目录
+```php
+$dir = opendir("/");
+while($file = readdir($dir))
+{
+ $fullpath = "/".$file;
+ //输出是目录还是文件
+ if(is_dir($fullpath))
+ echo "📁dir: ";
+ else
+ echo "file: ";
+ //输出文件名
+ echo $file. "
";
+}
+closedir($dir);
+```
+
+### demo php文件浏览器:
+我让chatgpt帮我写的
+```php
+// 设置要浏览的目录路径
+$dir_path = "/";
+
+// 如果有文件夹名称参数,更新要浏览的目录路径
+if (isset($_GET['folder'])) {
+ $folder_path = $_GET['folder'];
+ // 将相对路径转换成绝对路径
+ $dir_path .= "/". ($folder_path == '.' ? '' : $folder_path);
+}
+
+// 遍历目录并获取文件名和大小
+$files = array();
+if ($handle = opendir($dir_path)) {
+ while (false !== ($entry = readdir($handle))) {
+ if ($entry != "." && $entry != "..") {
+ $fullpath = $dir_path . "/" . $entry;
+ if (is_dir($fullpath)) {
+ $files[] = array(
+ 'name' => $entry,
+ 'type' => 'dir'
+ );
+ } else {
+ $files[] = array(
+ 'name' => $entry,
+ 'type' => pathinfo($fullpath, PATHINFO_EXTENSION)
+ );
+ }
+ }
+ }
+ closedir($handle);
+}
+
+// 输出文件列表
+echo "";
+echo "pwd:$folder_path
";
+if ($folder_path != '') {
+ // 添加返回上一级目录链接(除了根目录)
+ echo "- ..
";
+}
+foreach ($files as $file) {
+ if ($file['type'] == 'dir') {
+ echo "- " . $file['name'] . "
";
+ } else {
+ echo "- " . $file['name'] ."
";
+ }
+}
+echo "
";
+```
+
+## php链接mysql数据库
+
+mysqli 和 mysql
+- 从 PHP 5.5.0 版本开始,mysql 扩展已经废弃,从 PHP 7.0.0 版本开始,mysql 扩展已被移除
+- mysqli 则是 MySQLi(MySQL improved)的缩写,是官方推荐的用于连接 MySQL 数据库的扩展
+
+
+### 面向过程方式
+面向过程方式下,连接 MySQL 数据库通常使用 mysqli_connect() 函数,该函数的参数分别为数据库服务器的地址、用户名、密码和数据库名,返回一个 MySQL 连接标识符,如果连接失败则返回 FALSE。
+```php
+";
+$result = mysqli_query($conn, $sql);
+
+// 处理查询结果
+while ($row = mysqli_fetch_assoc($result)) {
+ echo "User: " . $row["User"] . "
";
+}
+
+// 关闭数据库连接
+mysqli_close($conn);
+
+```
+
+> 使用 `fetch_assoc` 方法从 $result 结果集中获取一行数据,并将其赋值给 $row 变量,如果没有数据了,则返回 FALSE。(一行一行的获取,直到没有数据为止)
+>
+> 如果使用 `fetch_row` 方法,则返回的是一个索引数组,如果使用 `fetch_array` 方法,则返回的是一个关联数组和索引数组的结合
+
+
+### 面向对象方式
+
+面向对象方式下,连接 MySQL 数据库通常使用 mysqli 或者 PDO 类。这些类封装了数据库连接和操作,更加易于维护和扩展
+
+基本上就是,全都是调用属性和方法。
+
+#### 连接数据库,查询
+```php
+connect_error) {
+ die("Connection failed: " . $conn->connect_error);
+}
+
+// 执行查询语句
+$sql = "SELECT * FROM user";
+$result = $conn->query($sql);
+
+// 处理查询结果
+while ($row = $result->fetch_assoc()) {
+ echo "User: " . $row["User"] . "
";
+}
+
+// 关闭数据库连接
+$conn->close();
+```
+
+#### 建表
+```php
+$conn = new mysqli($host, $user, $password)
+$conn->select_db($database);
+// 执行查询语句
+$sql = "CREATE TABLE MyGuests (
+ id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
+ firstname VARCHAR(30) NOT NULL,
+ lastname VARCHAR(30) NOT NULL,
+ email VARCHAR(50),
+ reg_date TIMESTAMP
+ )";
+
+$conn->query($sql);
+```
+
+#### 与表单form联动
+```php
+
+
+connect_error) {
+ die("Connection failed: " . $conn->connect_error);
+}
+//if isset post
+if (isset($_GET['name'])) {
+ // 执行查询语句
+ $conn->select_db("test");
+ $sql = "select * from MyGuests where firstname = '" . $_GET['name']."'";
+ echo "sql:".$sql."
";
+ $result=$conn->query($sql);
+
+ // // 处理查询结果
+ while ($row = $result->fetch_assoc()) {
+ //id firstname lastname email
+ echo "id: " . $row["id"] . "; Name: " . $row["firstname"] . " " . $row["lastname"] . "
";
+ }
+}
+
+// 关闭数据库连接
+$conn->close();
+```
diff --git a/content/post/old/2023-03-20epplus-excel.md b/content/post/old/2023-03-20epplus-excel.md
new file mode 100644
index 00000000..147d74a9
--- /dev/null
+++ b/content/post/old/2023-03-20epplus-excel.md
@@ -0,0 +1,335 @@
++++
+title = "csharp 使用 Epplus 读写 excel表格"
+description = "epplus是一个读写xlsx的csharp库"
+date = 2023-07-11T16:33:34+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "csharp","excel"
+]
+series = []
+images = []
++++
+> 📅 2023-03-20 首发
+>
+> 📅 2023-07-11 更新 - 从excel反序列化到内存 //
+
+epplus是一个读写excel表格的 csharp库。[官网教程](https://epplussoftware.com/zh/Developers/ )
+
+官方教程中使用 using 语法,我不喜欢多层级括号,[using不使用多层级括号参考](https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/using-statement)
+
+
+## 基础(写文件)
+> 基础的方法我已经提取成了库文件 myExcel.cs 放在最后面:
+> 包括读取excel、新建excel、新建sheet、修改cell内容、保存collectionx
+>
+
+### 新建excel
+
+传入 string 路径读取excel,如果传入的是空的就新建一个。
+
+```cs
+using var package = new ExcelPackage(@"myWorkbook.xlsx");
+```
+
+### 新建sheet
+
+```cs
+var sheet = package.Workbook.Worksheets.Add("My Sheet");
+```
+
+### 修改cell内容
+
+修改指定名字的sheet
+
+```cs
+package.Workbook.Worksheets["Worksheet1"].Cells["A3"].Formula = "SUM(A1:A2)"
+```
+
+修改上面提到的sheet,支持excel语法,框选范围,
+比如单个单元格、长方形范围、A列到B列等
+
+```cs
+sheet.Cells["A1"].Value = "Hello World!";
+sheet.Cells["A2:E8"].Value = "xxx";
+worksheet.Cells["A:B"].Value = "xxx";
+```
+
+### 修改style
+
+主要包括修改数字格式、修改字体
+
+```cs
+worksheet.Cells["A1:B3,D1:E57"].Style.NumberFormat.Format = "#,##0";
+//Sets the numberformat for a range containing two addresses.
+worksheet.Cells["A:B"].Style.Font.Bold = true; //Sets font-bold to true for column A & B
+worksheet.Cells["1:1,A:A,C3"].Style.Font.Bold = true; //Sets font-bold to true for row 1,column A and cell C3
+worksheet.Cells["A:XFD"].Style.Font.Name = "Arial"; //Sets font to Arial for all cells in a worksheet.
+worksheet.Cells.Style.Font.Name = "Arial"; //This is equal to the above.
+```
+
+### 保存
+
+例如保存到 `桌面/out/myWorkbook.xlsx`
+
+```cs
+var desktopurl = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + '/' + "out" + '/';
+workbook.SaveAs(@$"{desktopurl}myWorkbook.xlsx")
+```
+
+## 序列化和反序列化
+支持从下面的中导入
+
+* `csv`(其他的导出数据)
+
+* `List`(内存中的数据)
+
+* `datatable`(数据库中的数据)
+
+获取数据然后变成 `ExcelPackage`
+
+### 把collection(`List`) 存储到 excel
+首先创建一个class,并生成一些实例,保存到一个列表中。
+
+```cs
+public class MyClass
+{
+ public string Id { get; set; }
+ public string Name { get; set; }
+ public int Number { get; set; }
+}
+```
+
+```cs
+var items = new List()
+{
+ new MyClass(){ Id = "123", Name = "Item 1", Number = 3},
+ new MyClass(){ Id = "456", Name = "Item 2", Number = 6}
+};
+```
+
+然后把它变成一个`ExcelPackage`,这里例如以`C1`为左上角顶点。
+
+```cs
+using (var pck = new ExcelPackage())
+{
+ var sheet = pck.Workbook.Worksheets.Add("sheet");
+ var range = sheet.Cells["C1"].LoadFromCollection(items,c => {c.PrintHeaders = true;});
+}
+```
+
+可以打印表头,默认不打印
+可以设置主题,比如弄一额黑色主题
+可以设置表头,比如只要id、name两列
+
+```cs
+var tableRange = sheet.Cells["C1"].LoadFromCollection(items, c => {
+ c.PrintHeaders = true;
+ c.TableStyle = TableStyles.Dark1;
+ c.Members = new MemberInfo[]
+ {
+ t.GetProperty("Id"),
+ t.GetProperty("Name")
+ }
+});
+```
+
+### 反序列化excel到内存
+
+
+可以把指定sheet 的数据反序列化到内存中(表格数据 -> `list`)。
+
+> 为了正常识别,需要在excel中顶着左上角开始写表格。
+>
+> 常见错误是表格中有空行,会造成读取失败,程序闪退。 所以一定要保证xlsx内容正确。
+
+#### 例表(漏洞名称和简述)
+
+漏洞名称|漏洞类型| 漏洞危害| 修复方案|
+--- | --- | --- | ---
+SQL注入|注入攻击|数据泄露、数据篡改|使用参数化查询或ORM框架,避免直接拼接SQL语句
+跨站脚本攻击(XSS)|跨站攻击|窃取用户Cookie、会话劫持|过滤特殊字符,使用CSP、HttpOnly等安全头部,对用户输入进行转义
+文件包含漏洞|访问控制|读取任意文件、执行任意命令|对用户输入的路径进行限制,并增加白名单过滤,避免使用动态文件包含
+未授权访问漏洞|访问控制|窃取数据、篡改数据|对所有敏感操作进行身份验证与授权,禁止使用默认密码
+
+
+#### 创建数据结构class
+我创建了 `Vulnerability` class,包含了漏洞的信息。
+
+```cs
+public class Vulnerability
+{
+ public string Name { get; set; } // 漏洞名称
+ public string Type { get; set; }// 漏洞类型
+ public string Impact { get; set; }// 漏洞危害
+ public string Fix { get; set; }// 修复方案
+}
+```
+
+#### 遍历excel,把数据存储到list中
+
+注释位置的内容按照需要修改即可。
+`//修改下面,改成自己的类,赋值自己的数据。`
+
+```cs
+
+public list vulDB_list ; //数据会存储到这个外部list中
+
+///
+/// 从指定路径初始化漏洞数据库,将漏洞信息添加到vulDB_list中
+///
+///
+private void vulDB_init(String filePath = "漏洞数据库.xlsx")
+{
+ var 漏洞数据库xls = new myExcel(filePath);//使用了我的myExcel 库,获取package
+ var worksheet = 漏洞数据库xls.ReadSheet("Sheet1");//使用了我的myExcel 库,获取sheet
+ if (worksheet != null)
+ {
+ for (int i = worksheet.Dimension.Start.Row + 1; i <= worksheet.Dimension.End.Row; i++)
+ {
+ //修改下面,改成自己的类,赋值自己的数据。
+ vulDB_list.Add(new Vulnerability()
+ {
+ Type = worksheet.Cells[i, 1].Value.ToString(),
+ Name = worksheet.Cells[i, 2].Value.ToString(),
+ Impact = worksheet.Cells[i, 3].Value.ToString(),
+ Fix = worksheet.Cells[i, 4].Value.ToString()
+ });
+ }
+ }
+ if (vulDB_list.Count == 0)
+ {
+ ConsoleWriter.WriteRed("漏洞数据库为空,请检查漏洞数据库文件是否存在,请放在和exe同一目录下");
+ }
+}
+```
+
+
+## ExportData
+支持把`ExcelPackage`保存成csv、Datatable、json、html格式。
+
+## Encryption
+可以给文件加密!
+
+```cs
+//Set a password for the workbookprotection
+workbook.Protection.SetPassword("EPPlus");
+```
+
+
+## myExcel.cs
+这个类库可以方便我以后使用!
+```
+using System;
+using OfficeOpenXml;
+
+namespace reformat_report_console.mylibs
+{
+ public class myExcel
+ {
+ ExcelPackage package;
+ ExcelWorksheets? worksheets;
+
+ ///
+ /// 输入url,读取 excel,返回 ExcelPackage
+ ///
+ ///
+ public myExcel(string filepath)
+ {
+ ExcelPackage.LicenseContext = LicenseContext.NonCommercial;//设置为非商业使用
+ this.package = new ExcelPackage(filepath);//读取文件
+ this.worksheets = package.Workbook.Worksheets;//获取工作表
+ if (worksheets.Count == 0) ConsoleWriter.Writedebug($"这是一个空excel:{filepath}"); //如果工作表为空,输出提示
+ }
+ // 读取excel指定sheet到内存
+ public ExcelWorksheet ReadSheet(string sheetname)
+ {
+ ExcelWorksheet sheet = package.Workbook.Worksheets[sheetname];
+ return sheet;
+ }
+ ///
+ /// 添加一个sheet(输入sheet名)
+ ///
+ ///
+ ///
+ public ExcelWorksheet Addsheet(string sheetname)
+ {
+ ExcelWorksheet sheet = package.Workbook.Worksheets.Add(sheetname);
+ return sheet;
+ }
+ ///
+ /// 写入collection数据 到指定sheet
+ /// 同时展示表头,表头是类的属性名
+ ///
+ ///
+ ///
+ ///
+ public void WriteCollectionToSheet(ExcelWorksheet sheet, IEnumerable items)
+ {
+ var range = sheet.Cells["A1"].LoadFromCollection(items, c => c.PrintHeaders = true);
+ }
+
+ ///
+ /// 检查out文件夹是否存在,out用于输出
+ ///
+ ///
+ private string checkoutdir()//检查out文件夹是否存在,不存在则创建
+ {
+ string outpath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + '/' + "out";
+ if (!Directory.Exists(outpath))
+ Directory.CreateDirectory(outpath);
+ return outpath;
+ }
+ ///
+ /// excel保存到桌面out文件夹下
+ /// 默认指定保存到 out/finlename
+ /// 否则以filename为路径保存
+ ///
+ /// xxx.xlsx
+ /// url / file
+ public void Save(string filename, string savetype = "file")
+ {
+ try
+ {
+ if (savetype.Equals("file"))//file类型保存,保存到out文件夹下
+ {
+ string savepath = checkoutdir() + "/" + filename;//获得保存路径,如果已经存在则提示是否保存以防工作丢失
+ if (File.Exists(savepath))
+ {
+ ConsoleWriter.WriteCyan($"已经存在相同文件,{filename},确认要覆盖?(Y/n)");
+ if (Console.ReadLine() == "n")
+ {
+ Console.WriteLine("已经取消保存");
+ return;
+ }
+ else
+ {
+ Console.WriteLine("已经覆盖保存");
+ }
+ }
+ var desktopurl = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + '/' + "out" + '/';
+ this.package.SaveAs(desktopurl + filename);
+ ConsoleWriter.WriteGreen("[ok] 保存到桌面out文件夹/" + filename);
+ }
+ else if (savetype.Equals("url"))//url类型保存,保存到指定路径
+ {
+ this.package.SaveAs(filename);
+ ConsoleWriter.WriteGreen("[ok] 保存到:" + filename);
+ }
+ }
+ catch (Exception e)
+ {
+ ConsoleWriter.WriteRed($"[-] 无法保存:{e}");
+ }
+ }
+
+
+ }
+}
+
+```
\ No newline at end of file
diff --git "a/content/post/old/2023-03-22-\345\246\202\344\275\225\344\270\200\351\224\256\345\256\211\350\243\205\345\222\214\346\233\264\346\226\260pip\345\214\205.md" "b/content/post/old/2023-03-22-\345\246\202\344\275\225\344\270\200\351\224\256\345\256\211\350\243\205\345\222\214\346\233\264\346\226\260pip\345\214\205.md"
new file mode 100644
index 00000000..885edfb5
--- /dev/null
+++ "b/content/post/old/2023-03-22-\345\246\202\344\275\225\344\270\200\351\224\256\345\256\211\350\243\205\345\222\214\346\233\264\346\226\260pip\345\214\205.md"
@@ -0,0 +1,69 @@
++++
+title = "如何一键安装和更新pip包"
+description = ""
+date = 2023-03-22T09:42:16+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "python","pip"
+]
+series = []
+images = []
++++
+在把自己的项目分享给别人的时候,对方需要安装一些依赖包,但是每次等待报错然后手动 pip install 太麻烦了(尤其是包比较多的情况下),可以使用这种方式来一键安装和更新pip包。
+
+
+## 准备requirements.txt
+
+这个文件里面写上你需要安装的包
+
+```
+gradio
+mdtex2html
+pypinyin
+tiktoken
+socksio
+tqdm
+colorama
+duckduckgo_search
+Pygments
+llama_index
+langchain
+markdown
+
+```
+
+## 安装和更新
+安装
+```
+pip install -r requirements.txt
+```
+
+更新
+```
+pip install -r requirements.txt --upgrade
+```
+
+
+删除requirements.txt中的所有包
+```
+pip uninstall -r requirements.txt -y
+```
+
+## 额外提示
+获取当前电脑pip中所有的包
+```
+pip freeze > requirements.txt
+```
+
+删除当前电脑pip中所有的包
+```
+pip uninstall -y -r <(pip freeze)
+
+```
+
diff --git "a/content/post/old/2023-03-24-\345\233\275\345\206\205\346\265\213\351\200\237\347\275\221\347\253\231\346\216\250\350\215\220.md" "b/content/post/old/2023-03-24-\345\233\275\345\206\205\346\265\213\351\200\237\347\275\221\347\253\231\346\216\250\350\215\220.md"
new file mode 100644
index 00000000..96b6c94c
--- /dev/null
+++ "b/content/post/old/2023-03-24-\345\233\275\345\206\205\346\265\213\351\200\237\347\275\221\347\253\231\346\216\250\350\215\220.md"
@@ -0,0 +1,35 @@
++++
+title = "国内测速网站推荐"
+description = ""
+date = 2023-03-24T14:33:32+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "speed test"
+]
+series = []
+images = []
++++
+http://speedtest.im/
+
+
+适合国内用的测速站
+* http://speedtest.im/ (第三方的,能测节点速度,还卖gpt号,还有对多个网站链接速度的测试)
+* https://10000.gd.cn (广东电信)
+* http://speed.bj.10086.cn:3060 (移动业务测试)
+
+另外这是我最喜欢的ip测试站
+
+http://ip111.cn/ (可以同时显示国内ip和国外ip)
+
+
+> 很多测速网站都跑不满我的带宽,
+> 外国的测速服务直连难以使用
+>
+> 测速搜索第一名 [speedtest.cn](https://www.speedtest.cn) 是一个大垃圾
+>
diff --git "a/content/post/old/2023-03-25-iterm2\350\260\203\346\225\231\357\274\210\345\277\253\346\215\267\351\224\256\345\222\214\344\270\273\351\242\230\357\274\211 copy.md" "b/content/post/old/2023-03-25-iterm2\350\260\203\346\225\231\357\274\210\345\277\253\346\215\267\351\224\256\345\222\214\344\270\273\351\242\230\357\274\211 copy.md"
new file mode 100644
index 00000000..a5065914
--- /dev/null
+++ "b/content/post/old/2023-03-25-iterm2\350\260\203\346\225\231\357\274\210\345\277\253\346\215\267\351\224\256\345\222\214\344\270\273\351\242\230\357\274\211 copy.md"
@@ -0,0 +1,103 @@
++++
+title = "Iterm 调教(快捷键和主题)"
+description = ""
+date = 2023-03-25T11:28:25+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "iterm","tools"
+]
+series = []
+images = ["https://raw.githubusercontent.com/cornradio/imgs/main/20230325133822.png"]
+
++++
+Iterm 是广为流传的mac超强终端模拟器,
+下载 [iterm2](https://iterm2.com/)|
+[iterm2colorschemes](https://iterm2colorschemes.com/)
+
+本篇主要包括 常用操作、分屏模式、快捷键配置、主题下载和安装
+
+
+> 快捷键提示
+```
+终端常见的导航快捷键
+ctrl + e 到行末尾
+ctrl + a 到行首
+ctrl + u 删除到行首
+ctrl + k 删除到行末
+ctrl + w 删除到单词首
+```
+
+## why iterm2
+看看官方推荐自己的理由: https://iterm2.com/features.html
+
+
+- opt + 点击 移动到指定光标位置
+- esc + 退格键 = 删除整个单词
+- 有 雷电模式(自定义shortcut)
+- 有 分屏模式(cmd + d 纵向 / cmd + shift + d 横向 / cmd + w 关闭分屏)
+- 补全功能(cmd + ;)
+- 搜索功能(cmd + f 大多数终端模拟器都不能搜索………)
+- replay 功能 (可以回去找之前错过的输出 opt + cmd + b)
+
+
+## 设置
+### opt + 方向键
+> 打错命令和修改命令非常常见,如果不能以单词为单位来移动那可太慢了。
+- 目标是: opt + 左右 = 移动光标一个单词的距离
+
+这个功能在mac的terminal可以这样打开:
+#### ![terminal中打开](https://raw.githubusercontent.com/cornradio/imgs/main/20230325115105.png)
+
+
+
+
+> 为了使用这个功能,我已经看了很多的教程,但是他们大部分都有问题。
+
+在`iterm`中按下 cmd + i ,打开“迷你版”偏好设置,然后选择 Keys -> Presets , 选择 `Terminal.app Compatiblility`
+
+
+![选择preset](https://raw.githubusercontent.com/cornradio/imgs/main/20230325114647.png)
+
+### 雷电命令行
+效果图
+![效果图](https://raw.githubusercontent.com/cornradio/imgs/main/20230325113854.png)
+
+点击 Create a dedicated Hotkey Window…
+
+我设置成了 ctrl + cmd + shift + T
+
+![kuaijiejian](https://raw.githubusercontent.com/cornradio/imgs/main/20230325113800.png)
+
+
+## 主题
+
+首先,解决他的不协调的标题栏。
+> 默认的标题栏是和系统颜色一致的,iterm还提供了一个自动匹配主题背景的minimal标题栏
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230325120537.png)
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230325120007.png)
+
+
+主题 下载地址在这里,
+[iterm2colorschemes](https://iterm2colorschemes.com/)
+
+下载之后解压,里面只有一个文件夹(schemes)是相关的:其他文件夹里面都是很奇怪的东西。
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230325115451.png)
+
+打开iterm2,点击 Preferences -> Profiles -> Colors -> Color Presets -> Import (可以全选导入)
+
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230325121228.png)
+
+## 分屏模式
+ (cmd + d 纵向 / cmd + shift + d 横向 / cmd + w 关闭分屏)
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230325123036.png)
+- 分屏模式可以设置“不活跃”pane的变暗程度
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230325123446.png)
\ No newline at end of file
diff --git "a/content/post/old/2023-03-25-\345\246\202\344\275\225\344\275\277\347\224\250vscode\346\226\260\345\273\272\344\270\200\344\270\252donet\357\274\210csharp\357\274\211\351\241\271\347\233\256.md" "b/content/post/old/2023-03-25-\345\246\202\344\275\225\344\275\277\347\224\250vscode\346\226\260\345\273\272\344\270\200\344\270\252donet\357\274\210csharp\357\274\211\351\241\271\347\233\256.md"
new file mode 100644
index 00000000..c41a4533
--- /dev/null
+++ "b/content/post/old/2023-03-25-\345\246\202\344\275\225\344\275\277\347\224\250vscode\346\226\260\345\273\272\344\270\200\344\270\252donet\357\274\210csharp\357\274\211\351\241\271\347\233\256.md"
@@ -0,0 +1,94 @@
++++
+title = "如何使用vscode新建一个donet(csharp)项目"
+description = ""
+date = 2023-03-25T00:06:47+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "csharp","dotnet","vscode"
+]
+series = []
+images = []
++++
+
+通常情况下,使用 Visual Studio 来编写 C# 代码创建项目和管理非常的简单。但是,Visual Studio 是一个非常大的 IDE(而且visual studio mac版与win版并非同根同源,mac版本比较难用),如果您只是想编写一些简单的 C# 代码,安装一个巨大的vs是不适合的。
+
+- visual studio 来写c#(常规选择)
+- vs code + dotnet sdk (推荐选择)
+
+
+主要分成下列步骤:
+- 安装 .NET Core SDK
+- 安装 C# 插件
+- 配置插件
+- dotnet new 新建项目
+- dotnet run 跑代码
+
+## 安装 .NET Core SDK
+首先,需要安装 .NET Core SDK。可以在官网下载安装包进行安装:https://dotnet.microsoft.com/download ,我目前使用.NET 6.0。
+
+## 安装 C# 插件
+然后,在 Visual Studio Code 中搜索安装 C# 插件。按下 ctrl + Shift + x 打开扩展商店,搜索 "C#" 并点击安装。
+
+![第一个插件](https://raw.githubusercontent.com/cornradio/imgs/main/20230325000905.png)
+
+## 配置插件
+配置插件的作用是可以使用lint功能、对你的代码中的错误进行提示、自动补全等等。
+
+右键插件,选择 "Configure Extension Settings",在弹出的窗口中增加搜索关键词 sdk ,修改sdk位置(是上面你刚刚装好的路径)
+
+如果在mac下你可以这么查找到他的安装路径。
+```sh
+$ which dotnet
+/usr/local/share/dotnet/dotnet
+
+# 进入上面的文件夹找到sdk文件夹
+/usr/local/share/dotnet/sdk/6.0.407
+```
+![搜索并修改设置](https://raw.githubusercontent.com/cornradio/imgs/main/20230325001140.png)
+
+## 新建项目
+在终端中输入以下命令:
+
+```sh
+dotnet new console --name HelloWorld
+```
+在当前目录下创建一个名为 "HelloWorld" 的文件夹,并创建一个新的 .NET Core 控制台应用程序,
+
+跑代码:现在其实已经可以运行代码了,直接在终端输入
+```
+dotnet run
+```
+
+---
+
+## 创建vscode配置文件
+创建vscode配置文件,这样就可以在vscode中调试运行你的代码了,比如说打断点、查看变量值等等。
+以及程序运行错误的时候,会标记指定的代码行数、错误信息等等。
+
+要调试运行他还需要一个vscode配置文件。
+
+
+打开Debug侧边栏,有一个按钮:
+![按钮](https://raw.githubusercontent.com/cornradio/imgs/main/20230325001854.png)
+
+点击这个按钮造成的效果是,会在你的项目根目录下生成一个.vscode文件夹
+内容如下
+```
+.vscode
+├── launch.json
+└── tasks.json
+```
+
+### 配置launch.json
+这个设置你可以修改下,内置的terminal有时候 会存在没有办法输入的问题。
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230325004622.png)
+
+### vscode 调试运行代码
+在Debug侧边栏,点击绿色的箭头运行按钮。
+或者 F5
diff --git "a/content/post/old/2023-03-26-\345\246\202\344\275\225\346\213\267\350\264\235\344\270\200\344\270\252\345\257\271\350\261\241.md" "b/content/post/old/2023-03-26-\345\246\202\344\275\225\346\213\267\350\264\235\344\270\200\344\270\252\345\257\271\350\261\241.md"
new file mode 100644
index 00000000..53035c5a
--- /dev/null
+++ "b/content/post/old/2023-03-26-\345\246\202\344\275\225\346\213\267\350\264\235\344\270\200\344\270\252\345\257\271\350\261\241.md"
@@ -0,0 +1,152 @@
++++
+title = "如何拷贝一个对象"
+description = ""
+date = 2023-03-26T11:28:25+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "csharp"
+]
+series = []
+images = []
+
++++
+这是我工作中遇到的一个bug,困扰了我一个下午。
+
+但是我会用一个好理解的例子来说明。
+
+应该在所有面向对象编程语言中是通用的,这是关于”克隆一个实体“的问题。
+
+## 问题
+首先,我手上有两个类,一个是`Person`,另一个是`Car`。
+
+Person有一个属性叫做`car`,创建新Person时,要传入`Car`的实例。
+
+
+```csharp
+public static void test1()
+{
+ Car car = new Car("BMW", "Black", 100000);//brand , color, price
+ Person person = new Person("John", 20, car);
+ System.Console.WriteLine(person.ToString());
+ //Name: John, Age: 20, Car: Brand: BMW, Color: Black, Price: 100000
+ car.price = 200000;// if i change the price of the car
+ System.Console.WriteLine(person.ToString());
+ //Name: John, Age: 20, Car: Brand: BMW, Color: Black, Price: 200000
+ System.Console.WriteLine("===========");
+}
+```
+> 创建了一个价格为100000的`car`
+>
+> 然后创建了一个`person`,传入`car`
+>
+> 在外部改变了`car`的价格
+>
+> 已经创建的`person.car.price`的价格也改变了!
+
+`person`在创建的时候(假设他这时购买了这辆车),他的`car`的价格就是100000,不应该因为`car`涨价了而改变。
+
+或者想象一下,我又修改了一下car的属性,比如说`car.color = "red"`,那么`person.car.color`也会变成`red`,我未经同意给人家车子换了个喷漆。
+
+## 函数传递参数
+这涉及到一个原理:
+在函数传递参数的时候,如果用的是基础类型,比如`int`,`string`,那么传递的是值,如果是引用类型,比如`Car` class,那么传递的是引用。
+
+这也是为什么上面的例子中,当我改变了外面`car`的价格,已经创建的`person.car.price`的价格也会改变。(它引用了内存地址中同一个位置的`car`)
+
+在这里例子中,我们只需要不再动car就可以了
+
+但是实际情况是:这可能是**循环**中的一部分,那个car在下一次循环中可能还会被利用。从而导致car不可避免的被修改。
+
+## 解决方案
+其实解决方案也很简单,就是弄一个Car副本。
+
+有两种方式可以按照需求使用
+虽然我的问题中两种办法都用不了,不过我也另辟蹊径解决了)
+
+### 创建一个新的Car
+他的意识其实就是所谓的“深拷贝”,就是把一个对象的所有属性都拷贝一份,
+
+传入的参数从`car`变成了`new Car(car.brand, car.color, car.price)`。
+
+```csharp
+private static void test2()
+{
+ Car car = new Car("BMW", "Black", 100000);//brand , color, price
+ // if i want to copy the car(this is not a good way)
+ Person person = new Person("John", 20, new Car(car.brand, car.color, car.price));
+ System.Console.WriteLine(person.ToString());
+ //Name: John, Age: 20, Car: Brand: BMW, Color: Black, Price: 100000
+ car.price = 200000;// if i change the price of the car
+ System.Console.WriteLine(person.ToString());
+ //Name: John, Age: 20, Car: Brand: BMW, Color: Black, Price: 100000
+ System.Console.WriteLine("===========");
+}
+```
+> 这个办法挺好的,但是有一个大大的问题,如果`Car`类中有很多属性,写起来太复杂了。
+>
+> ❗️甚至有可能这个`Car`类是**别人提供的库**,还是个套娃,他里面层级深的可怕,还不给new。
+
+### 使用`MemberwiseClone`方法
+* 在c#中,`MemberwiseClone`方法
+* 在py中,`copy`函数
+* 在java中,`clone`方法
+
+`MemberwiseClone`这个方法是`Object`类中的一个方法,他的就是所谓的“浅拷贝”,就是把一个对象的所有属性都拷贝一份,但是如果属性是引用类型,那么只是拷贝了引用,而不是拷贝了引用的值。
+
+`MemberwiseClone`是私有属性,为了调用它,需要在car类中创建一个Clone方法
+
+Clone方法(在Car.cs中):
+
+```csharp
+internal Car Clone()
+{
+ return (Car)this.MemberwiseClone();
+}
+```
+
+这回传入的参数从`car`变成了`car.Clone()`。
+```csharp
+private static void test3()
+{
+ Car car = new Car("BMW", "Black", 100000);//brand , color, price
+ // "the better clone way"you will need to implement Clone() method,go see the colne method in Car.cs
+ Person person = new Person("John", 20, car.Clone());
+ System.Console.WriteLine(person.ToString());
+ //Name: John, Age: 20, Car: Brand: BMW, Color: Black, Price: 100000
+ car.price = 200000;// if i change the price of the car
+ System.Console.WriteLine(person.ToString());
+ //Name: John, Age: 20, Car: Brand: BMW, Color: Black, Price: 200000
+ System.Console.WriteLine("===========");
+}
+```
+
+### 另辟蹊径--我的办法
+我是用的是第三方的Docx库,他的`Paragraph`类就是我要复制的对象。
+
+
+
+- 他没有提供Copy方法
+- new Paragraph()也不行,会有很多属性是null(并且参数一大堆)
+- Paragraph对象是和文档绑定的,我需要一个Paragraph对象,总不能去复制下整个文档。
+
+⭐️我创建了一个`Clone_p`函数,他会专门返回一个Paragraph对象
+
+传入的确实是引用,但是使用了专门copy函数后,就不会不小心修改到他了,在内存中也是独立的一个位置(docx初始化完毕之后,所有paragraph都会读到内存中放置)完美解决问题!
+
+```csharp
+public Paragraph Clone_p(Paragraph p) {
+ return find_p_by_pid(Get_pid(p));
+}
+
+public Paragraph find_p_by_pid(string value) => Paragraphs.Where(p => p.Xml.FirstAttribute.ToString()==value).ToList()[0];
+
+public static string Get_pid(Paragraph p) {
+ return p.Xml.FirstAttribute.ToString();
+}
+```
\ No newline at end of file
diff --git "a/content/post/old/2023-03-30-mysql\346\270\227\351\200\217\345\237\272\347\241\200.md" "b/content/post/old/2023-03-30-mysql\346\270\227\351\200\217\345\237\272\347\241\200.md"
new file mode 100644
index 00000000..e6dff9db
--- /dev/null
+++ "b/content/post/old/2023-03-30-mysql\346\270\227\351\200\217\345\237\272\347\241\200.md"
@@ -0,0 +1,311 @@
++++
+title = "Mysql渗透基础"
+description = ""
+date = 2023-03-30T22:22:41+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "mysql"
+]
+series = []
+images = []
++++
+mysql 常用的命令行操作、新建删除数据库、新建删除表、修改表结构、操作表数据、表内的常用语法等。
+
+## mysql--for pentest
+
+先把 phpStudy 的 mysql 服务启动起来,然后保证`phpStudy\MySQL\bin` 在环境变量里面。
+
+### 登录
+
+```
+mysql -uroot -p -P3306
+```
+
+- -u: 用户名
+- -p: 密码
+- -P: 端口
+- -h: 主机
+- -D: 数据库
+
+### 帮助命令
+
+```
+mysql > ?
+mysql > help
+```
+
+### 查看 mysql 用户的密码
+
+ desc mysql.user;
+
+展示表结构,搜索`auth`,找到 `authentication_string`,就是密码。
+
+```
+select authentication_string,user from mysql.user;
+
++-------------------------------------------+---------------+
+| authentication_string | user |
++-------------------------------------------+---------------+
+| *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | root |
+| *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql.session |
+| *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql.sys |
++-------------------------------------------+---------------+
+```
+
+### 注释(在渗透中比较有用)
+
+有三种注释方式:
+```
+#注释
+-- 注释
+/*注释*/
+```
+
+注意第二种需要有个空格;
+
+### 增删改查(数据库)
+
+```
+增:create database db1;
+删:drop database db1;
+改:alter database db1 charset utf8
+查:show databases;#查看所有的数据库
+```
+
+### 基础操作实例(数据库新建表,查看表定义,删除库,引擎和编码)
+
+```sql
+create database if not exists moondata;
+#创建数据库moondata
+show databases;
+#展示所有数据库
+use mysql;
+#切换到mysql数据库
+show tables;
+#展示所有table
+desc user;
+#展示user表定义
+```
+
+```
++--------------------+
+| Database |
++--------------------+
+| information_schema |
+| moondata |
+| mysql |
+| performance_schema |
+| sys |
+| test |
++--------------------+
+```
+
+```sql
+CREATE TABLE user (
+ id INT NOT NULL AUTO_INCREMENT,
+ username VARCHAR(50) NOT NULL,
+ email VARCHAR(100) NOT NULL,
+ password CHAR(60) NOT NULL,
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (id)
+)engine=myisam default charset=utf8;
+
+```
+
+```
+drop database moondata;
+```
+
+
+#### myisam引擎和InnoDB引擎
+engine=myisam 表示使用 MyISAM 存储引擎创建表。MyISAM 是一种基于文件的存储引擎,它适合用于读密集型应用。与其他存储引擎相比,MyISAM 不支持事务和行级锁定,但它的独特设计使其能够快速执行大量查询。在早期版本的 MySQL 中,默认的存储引擎就是 MyISAM,但是在现代化的应用程序中,InnoDB 等更强大的存储引擎通常被视为首选。
+
+如果使用 MyISAM 存储引擎创建表,需要手动设置字符集和排序规则,如果在创建表时没有指定字符集,则可能会导致数据存储出现乱码等问题。
+
+default charset=utf8 表示使用 UTF-,MySQL 5.5 及以上版本的默认字符集确实是 UTF-8,在 MySQL 4.1 及更早版本中,默认字符集是 Latin1(ISO-8859-1),而不是 UTF-8。
+因此,如果使用较老的 MySQL 版本,则需要手动设置字符集。
+
+> InnoDB 和 MyISAM 这两个存储引擎的名称都有一定的历史渊源。
+
+> InnoDB 最初是由 Innobase Oy(一个芬兰的数据库软件公司)开发的,该公司于 2005 年被 MySQL AB(现在是 Oracle Corporation 的子公司)收购。因此,"Inno"代表了 Innobase 公司的名称,"DB"则代表数据库。
+
+> MyISAM 的名称也有一定的来源。在 MySQL 早期版本中,ISAM(Indexed Sequential Access Method)是一种基于文件的存储引擎,而 MyISAM 实际上是 ISAM 的一个改进版本。"My"则代表了 MySQL。因此,MyISAM 实际上是"My SQL Indexed Sequential Access Method"的缩写。
+
+
+
+### alter table 修改表(字段定义、表名、引擎)
+
+使用 alter,你可以做到:
+
+- 修改表名 table rename
+- 修改表的引擎 table engine
+- 修改表的字符集 table charset
+- 添加字段 table add column
+- 删除字段 table drop
+- 修改字段名称 table change
+- 修改字段类型 table modify
+
+
+下面是一些例子,推荐弄到datagrip里面执行感受感受;
+
+> datagrip 是 jetbrains 的数据库工具
+
+```sql
+# 创建person表,字段id , first_name , last_name , age
+create table person2(
+id int(11) not null auto_increment,
+first_name varchar(255) not null,
+last_name varchar(255) not null,
+age int(11) not null,
+primary key(id)
+)engine=innodb default charset=utf8;
+```
+
+```sql
+alter table person rename person2;#修改表格名称
+
+desc db1.person2; #展示表结构
+alter table person2 modify column id int(30) auto_increment;#修改id列类型为int(30) 默认int(11) ,auto_increment自增
+ALTER TABLE person2 AUTO_INCREMENT=1; #设置自增起始值
+
+alter table person2 drop last_name;#删除列
+alter table person2 change column first_name name varchar(255);#修改id列名称为uid
+alter table person2 add column password varchar(255);#添加列
+alter table person2 add column birthday datetime;
+alter table person2 engine = innodb;#修改表引擎
+```
+
+#### 关于auto_increment
+
+如果您删除了表中的行,则auto_increment值不会重置,而是会继续递增。
+
+这是因为MySQL在设计时就决定了auto_increment值应该是永久性的、唯一的、不可重复的。
+
+即使您删除了之前插入的所有行,下一个新插入的行的auto_increment值也会继续递增,确保值的唯一性。
+
+不过你可以通过 alter 重设 AUTO_INCREMENT ,不如重新设置成1。(如果删除了表中的id没有比1小的值,那么下一个插入的id值就是1,否则还是看表中最大的id值,然后id+1)
+```
+ALTER TABLE person2 AUTO_INCREMENT=1; #重设AUTO_INCREMENT为1
+
+TRUNCATE TABLE db1.person2; #清空表,速度及快,重置自增列的值
+```
+
+### 查询表
+为了查询,得先搞一点数据,我让gpt帮我生成了这些:
+```sql
+# 创建表person2,id为主键,自增,name为varchar(255),password为varchar(255),age为int(11)
+create table person2(
+id int(30) auto_increment primary key,
+name varchar(255),
+password varchar(255),
+age int(11)
+)engine=innodb default charset=utf8;
+```
+
+```
+insert into db1.person2(name,password, age) values('LandonHills','Ku$we12!id',24);
+insert into db1.person2(name,password, age) values('JasonGreen','Dr#8&7hjKl',31);
+insert into db1.person2(name,password, age) values('KennethJones','@kiow23!Gd',42);
+insert into db1.person2(name,password, age) values('SamanthaSmith','Rt%4^fEeD3',20);
+insert into db1.person2(name,password, age) values('NatalieAllen','^Hg6fDsE2$',28);
+insert into db1.person2(name,password, age) values('ChristopherWalker','*iop87Jk9#',26);
+insert into db1.person2(name,password, age) values('MelanieWilson','@plo5$asW1',29);
+insert into db1.person2(name,password, age) values('NicholasClark','Lm#90^kOp2',35);
+insert into db1.person2(name,password, age) values('AshleyRamirez','TgF$35lkPd',19);
+insert into db1.person2(name,password, age) values('JessicaTaylor','Wq@vbn45Rt',48);
+```
+
+#### 增
+
+```sql
+INSERT INTO 表名 VALUES(值1,值2,…);
+INSERT INTO 表名(字段1,字段2,…)VALUES(值1,值2,…);
+INSERT INTO 表名 SET 字段名1=值1[,字段名2=值2,…]
+# 同时添加多条数据
+INSERT INTO 表名[(字段名1,字段名2,…)]VALUES (值1,值2,…),(值1,值2,…),
+```
+
+#### 删
+
+```
+DELETE FROM 表名 [WHERE 条件表达式]
+```
+
+#### 改(更新)
+```
+UPDATE 表名 SET 字段名1=值1,[ ,字段名2=值2,…][ WHERE 条件表达式 ]
+
+update users set password='123456',username='moon' where id=1
+update users set password='aaaa' where id=1;
+update users set password=456789;
+```
+### 查
+
+#### 基础查询
+
+```sql
+select * from db1.person2; #展示表中所有数据
+delete from db1.person2 where id <= 10; #删除id为1的数据
+select * from person2 where name like 'J%'; #查询name以J开头的数据
+select * from person2 where name like '%n'; #查询name以n结尾的数据
+select * from person2 where name like '%Allen%'; #查询name中包含Allen的数据
+
+# and 和 or 的优先级是and > or
+SELECT * FROM person2 WHERE name = 'AshleyRamirez' AND password = 'TgF$35lkPd'; #一般的登录查询密码语句
+# 基于单引号的注入:在用户输入中插入单引号('),从而破坏SQL语句的完整性。or 1=1 为真,所以查询出所有数据
+SELECT * FROM person2 WHERE name = 'AshleyRamirez' AND password = '' OR 1=1 -- ' ; #这个语句会查询出所有数据
+# 基于分号的注入:在用户输入中添加分号(;)可以执行多个SQL语句。
+SELECT * FROM person2 WHERE name = 'AshleyRamirez' AND password = ''; DROP TABLE person2; -- '#这个语句会删除表
+```
+#### 联合查询
+
+```
+# COUNT() 返回某列的行数
+# SUM() 返回某列值的和
+# AVG() 返回某列的平均值
+# MAX() 返回某列的最大值
+# MIN() 返回某列的最小值
+```
+
+```
+select count(*) from person2; #查询表中数据总数
+select count(*) from person2 where age > 30; #查询表中年龄大于30的数据总数
+select avg(age) from person2; #查询表中年龄平均值
+select max(age) from person2; #查询表中年龄最大值
+select min(age) from person2; #查询表中年龄最小值
+```
+
+#### 分组查询 groupby
+```sql
+# groupby
+# 如果不能用,在my.ini/my.cnf中加入
+# sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
+SELECT * FROM person2 GROUP BY password;
+```
+
+
+### 快速备份一个表
+```
+drop table backup_table; CREATE TABLE backup_table AS SELECT * FROM ;
+```
+### 猛烈的删除一个表
+```sql
+delete from db1.person2; #清空表,一行行地删除表中数据,可以恢复
+TRUNCATE TABLE db1.person2; #清空表,速度及快,重置自增列的值,无法通过 transaction logs 恢复,并且自动删除所有外键约束
+drop table db1.person2; #删除表,无法恢复
+```
+
+### 退出mysql命令行
+
+```
+mysql > exit;
+mysql > quit;
+mysql > \q;
+```
diff --git "a/content/post/old/2023-03-30-\346\272\220\344\273\243\347\240\201\345\256\241\350\256\241-java.md" "b/content/post/old/2023-03-30-\346\272\220\344\273\243\347\240\201\345\256\241\350\256\241-java.md"
new file mode 100644
index 00000000..597997de
--- /dev/null
+++ "b/content/post/old/2023-03-30-\346\272\220\344\273\243\347\240\201\345\256\241\350\256\241-java.md"
@@ -0,0 +1,124 @@
++++
+title = "代码审计-Java"
+description = ""
+date = 2023-03-30T22:23:15+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "代码审计","java"
+]
+series = []
+images = []
++++
+
+
+## java源代码审计
+
+> 需要注意的方法和关键字
+
+常见危险方法:
+* getParameter()
+* getcookies()
+* getQueryString()
+* getheaders()
+* Runtime.exec()
+* logger.info
+
+常见危险关键字:
+• password
+• upload
+• download
+
+---
+
+`getParameter()`:该方法用于获取HTTP请求中的参数值。如果没有验证或过滤用户输入,则恶意用户可以通过构造特殊的请求来执行跨站脚本攻击(XSS)或SQL注入攻击。
+
+`getCookies()`:该方法可以返回客户端发送到服务器的所有cookie。如果应用程序没有正确设置安全cookie属性(例如HttpOnly和Secure),则恶意用户可以使用JavaScript访问这些cookie并窃取用户的身份验证令牌,从而发起会话劫持攻击。
+
+`getQueryString()`:类似于getParameter(),是一个用于获取HTTP请求参数的方法。具体来说,当客户端向服务器发送GET请求时,可以将请求参数附加到URL的查询字符串中(例如,在URL末尾添加“`?key1=value1&key2=value2`”),而服务器就可以使用`getQueryString()`方法从查询字符串中获取这些参数。如果没有正确过滤或编码用户输入,恶意用户可以在查询字符串中注入恶意代码,并对应用程序进行攻击。
+
+`getHeaders()`:如果没有正确验证或过滤头信息,攻击者可以通过修改请求头部内容,实施跨站脚本攻击或其他类型的攻击。
+
+`Runtime.exec()`:该方法允许应用程序执行系统命令。如果没有正确限制外部输入,则可能会导致恶意用户执行任意命令,包括删除文件、启动后门等。
+
+`logger.info()`:如果在日志记录器中记录了敏感信息,例如密码或其他机密数据,则攻击者可以利用此漏洞来获取敏感信息。
+
+`password`:如果明文存储密码,攻击者可以轻松地获取用户密码并进一步入侵应用程序或其他相关服务。
+
+`upload`:上传文件时,如果没有正确限制文件类型、大小和内容,则可能会导致恶意用户上传包含恶意代码的文件,例如web shell,实现远程命令执行攻击。
+
+`download`:如果下载文件时没有正确限制文件类型、大小和内容,则可能会导致恶意用户在下载过程中注入恶意代码,例如利用浏览器漏洞进行攻击
+
+---
+
+## sql注入的防范
+sql注入通常是因为使用了 `String sql = "select * from user where username = '" + username + "' and password = '" + password + "'";`这种拼接sql语句的方式,我们可以使用预编译的方式来防范sql注入,如下:
+```java
+String sql = "select * from user where username = ? and password = ?";
+PreparedStatement ps = conn.prepareStatement(sql);
+ps.setString(1, username);
+ps.setString(2, password);
+ResultSet rs = ps.executeQuery();
+```
+这样预编译会把 `?` 位置的参数当成字符串来处理,而不是当成sql语句的一部分,所以就不会出现sql注入的问题了。
+
+## xss的防范
+xss的防范主要是对用户输入的内容进行过滤,防止用户输入的内容中包含恶意的脚本代码,如下:
+```java
+String username = request.getParameter("username");
+username = username.replaceAll("<", "<").replaceAll(">", ">");
+```
+这样就可以把用户输入的内容中的 < 和 > 替换成 < 和 >,这样就可以防止用户输入的内容中包含恶意的脚本代码了。
+
+## 路径遍历的防范
+目录遍历漏洞,是一种常见的Web安全漏洞。攻击者通过利用该漏洞,可以访问应用程序中未经授权的文件和目录。
+
+当开发人员使用**用户提供的输入**构建文件路径时,没有对用户输入进行合法性验证和过滤,从而导致攻击者可以在访问文件时绕过应用程序的安全检查。例如,攻击者可以通过修改URL参数中的目录跳转符来访问系统文件或其他目录中的文件,甚至可以执行任意代码。
+
+错误的(使用字符串拼接得到路径)
+```java
+String fileName = request.getParameter("fileName");
+String filePath = "/opt/files/" + fileName;
+File file = new File(filePath);
+```
+
+修复的,使用 new File(baseDir, fileName) 的方式
+```java
+String fileName = request.getParameter("fileName");
+String baseDir = "/opt/files/";
+File file = new File(baseDir, fileName);
+```
+
+## 文件上传的防范
+ 文件上传漏洞是: 上传文件时,如果没有正确限制文件类型、大小和内容,则可能会导致恶意用户上传包含恶意代码的文件,例如web shell,实现远程命令执行攻击。
+通常是因为没有限制文件的大小和类型,我们可以通过 `file.getSize()` 和 `file.getContentType()` 来限制文件的大小和类型,如下:
+```java
+if (file.getSize() > 1024 * 1024) {
+ return "文件大小不能超过1M";
+}
+if (!file.getContentType().equals("image/jpeg")) {
+ return "文件类型只能是jpg";
+}
+byte[] bytes = file.getBytes();
+if (bytes[0] != (byte) 0xFF || bytes[1] != (byte) 0xD8) {
+ return "文件内容不是jpg";
+}
+```
+
+这样就可以限制文件的内容了。
+> 文件的魔数是一种用于识别文件格式的机制,通常是指文件开头固定位置的几个字节。不同类型的文件具有不同的魔数,操作系统会根据文件的魔数来确定文件的类型和打开方式。
+> 可以用16进制编辑器打开文件(比如命令行中:` certutil xxx.zip | more`),查看文件的前几个字节,就可以看到文件的魔数了。
+> 不同的文件类型有不同的魔数,比如说:
+
+```
+JPEG 图像文件的魔数为 FF D8 FF
+PNG 图像文件的魔数为 89 50 4E 47 0D 0A 1A 0A
+GIF 图像文件的魔数为 47 49 46 38 39 61 或者 47 49 46 38 37 61
+PDF 文件的魔数为 25 50 44 46
+ZIP 压缩文件的魔数为 50 4B 03 04
+```
\ No newline at end of file
diff --git "a/content/post/old/2023-03-30-\346\272\220\344\273\243\347\240\201\345\256\241\350\256\241-\345\237\272\347\241\200\346\246\202\345\277\265.md" "b/content/post/old/2023-03-30-\346\272\220\344\273\243\347\240\201\345\256\241\350\256\241-\345\237\272\347\241\200\346\246\202\345\277\265.md"
new file mode 100644
index 00000000..54b30c3a
--- /dev/null
+++ "b/content/post/old/2023-03-30-\346\272\220\344\273\243\347\240\201\345\256\241\350\256\241-\345\237\272\347\241\200\346\246\202\345\277\265.md"
@@ -0,0 +1,61 @@
++++
+title = "代码审计 基础概念"
+description = ""
+date = 2023-03-30T22:23:02+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "代码审计"
+]
+series = []
+images = []
++++
+
+
+## 源代码审计学习
+- 源代码审计主要分成人工和工具扫描两种
+- 代码审计的目的是为了发现代码中的安全漏洞
+- 代码审计人员需要具备一定的编程能力,并对安全漏洞有一定的了解,是比较难的一种安全工作
+
+## 工具
+* fortify 工具 业内常用 很贵几十万 ,附上盗版链接: https://www.ddosi.org/fortify/
+* seayphp 免费源代码审计工具
+
+fortify 我觉得不太好用,倒不是从技术的角度,而是中文注释在里面都变成乱码了。让审计变得麻烦。
+
+我推荐使用gpt作为源代码审计辅助工具!
+
+## 黑盒与白盒
+* 黑盒:不知道源代码的情况下,通过测试来发现漏洞(渗透测试)
+ * 速度快
+ * 渗透测试发现问题,代码审计确认原因
+* 白盒:知道源代码的情况下,通过阅读源代码来发现漏洞(源代码审计)
+ * 全面深入的发现漏洞
+ * 代码审计的问题,通过渗透测试来验证可利用性
+
+### 代码审计的基本流程
+* 配置分析环境-> 熟悉业务逻辑 -> 分析程序架构-> 工具自动扫描-> 人工代码审计 -> 代码审计报告
+
+---
+
+在审计过程中,可以主要观察以下内容:
+
+* **SQL注入**:检查是否存在使用不安全的SQL查询语句的地方,例如拼接字符串而不使用参数化查询。
+
+* **跨站点脚本攻击(XSS**):确保不会将未经转义的用户输入插入HTML或JavaScript中。
+
+* **不安全的文件上传**:验证上传的文件类型和内容,避免任意代码执行。
+
+* **认证和授权问题**:确保正确地实现了身份验证和授权策略,并限制敏感数据或操作的访问。
+
+* **敏感信息泄露**:确保不会以明文形式存储密码、令牌或其他敏感信息。
+
+* **内存泄漏和不安全对象引用**:确保没有未释放的资源或不安全的对象引用,以防止恶意方利用它们。
+
+* **密码破解和暴力攻击**:确保密码哈希和加密算法足够安全,以防止破解和暴力攻击。
+
diff --git "a/content/post/old/2023-04-13-win\345\210\207\346\215\242java\347\211\210\346\234\254.md" "b/content/post/old/2023-04-13-win\345\210\207\346\215\242java\347\211\210\346\234\254.md"
new file mode 100644
index 00000000..14221575
--- /dev/null
+++ "b/content/post/old/2023-04-13-win\345\210\207\346\215\242java\347\211\210\346\234\254.md"
@@ -0,0 +1,55 @@
++++
+title = "Win切换java版本"
+description = ""
+date = 2023-04-13T14:57:51+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "java","win"
+]
+series = []
+images = []
++++
+
+
+
+- [「下載java jdk」](https://www.oracle.com/technetwork/java/javase/downloads) ,
+有 jdk 20\17\11\8 和 jre 8
+
+## win
+为了避免oracle设置的变量影响,需要先手动删除Path中的下列变量:
+
+ C:\Program Files (x86)\Common Files\Oracle\Java\javapath
+
+可以在高级系统设置 - 环境变量 - 系统变量 - Path 中删除
+
+---
+
+修改全局变量
+* setx 代表设置全局变量
+* /m 代表设置**系统**全局变量,默认是用户全局变量
+
+使用 **管理员powershell** 执行下面的脚本
+> 如使用 cmd,`$env:Path` 需要替换成 `%Path%`,否则会造成系统变量永久性丢失,后果很严重。
+```bat
+setx JAVA_HOME "C:\Program Files\Java\jdk-17" /m
+setx CLASSPATH ".;%JAVA_HOME%\lib" /m
+setx Path "%JAVA_HOME%\bin;$env:Path" /m
+```
+
+---
+
+如果要修改不同版本的java,则设置javahome变量
+
+```bat
+setx JAVA_HOME "C:\Program Files\Java\jdk-20" /m
+```
+
+重新开启一个命令行并测试java
+
+ java -version
diff --git a/content/post/old/2023-04-15-mp3tag.md b/content/post/old/2023-04-15-mp3tag.md
new file mode 100644
index 00000000..bbb6c87f
--- /dev/null
+++ b/content/post/old/2023-04-15-mp3tag.md
@@ -0,0 +1,53 @@
++++
+title = "Mp3tag--给下载的无图音乐增加专辑图"
+description = ""
+date = 2023-04-15T12:17:42+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "mp3","youtube"
+
+]
+series = []
+images = []
++++
+
+
+## yt-dlp
+
+下载 youtube 的命令行工具有:you-get, youtube-dl, yt-dlp
+
+yt-dlp 是目前最好用的。
+
+```sh
+yt-dlp --extract-audio --audio-format mp3
+```
+
+但是下载的源文件咩有专辑封面图(都是无图mp3)
+
+
+## mp3tag
+https://www.mp3tag.de/en/download.html
+
+mp3tag 是一个用于编辑MP3文件标签的图形化工具,windows版本免费,mac版本`20$` ,所以我选择命令行平替工具。
+
+## eyeD3
+
+eyeD3 是一个用于编辑MP3文件标签的命令行工具,它可以显示、编辑MP3文件的标签信息。
+
+eyeD3
+ 1. 显示MP3文件的标签信息:eyeD3 filename.mp3
+ 2. 设置MP3文件的标题:eyeD3 --title="New Title" filename.mp3
+ 3. 设置MP3文件的艺术家名称:eyeD3 --artist="New Artist" filename.mp3
+ 4. 设置MP3文件的专辑名称:eyeD3 --album="New Album" filename.mp3
+ 5. 设置MP3文件的专辑封面: eyeD3 --add-image=cover.jpg:FRONT_COVER filename.mp3
+
+添加专辑图的代码:
+```sh
+eyeD3 --add-image=cover.jpg:FRONT_COVER filename.mp3
+```
\ No newline at end of file
diff --git "a/content/post/old/2023-04-15-\344\275\277\347\224\250Azure\350\207\252\345\273\272\350\212\202\347\202\271.md" "b/content/post/old/2023-04-15-\344\275\277\347\224\250Azure\350\207\252\345\273\272\350\212\202\347\202\271.md"
new file mode 100644
index 00000000..809bc197
--- /dev/null
+++ "b/content/post/old/2023-04-15-\344\275\277\347\224\250Azure\350\207\252\345\273\272\350\212\202\347\202\271.md"
@@ -0,0 +1,132 @@
++++
+title = "使用Azure自建节点"
+description = ""
+date = 2023-04-15T12:31:55+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "Azure","云服务","v2ray"
+]
+series = []
+images = []
++++
+
+Azure注册新账户,会赠送一个月的 200USD 免费额度,如果升级成“即用即付”,则这 200USD 可以延长使用期限到一年。(需要填写自己的信用卡信息)
+
+除此之外,还有至少有免费 1个月 的免费 vm 用。 可以在这里查看:[Azure免费服务](https://portal.azure.com/#view/Microsoft_Azure_Billing/FreeServicesBlade)
+
+
+[注册](https://portal.azure.com/),可以用假名字,地址的话选择中国就可以(这个是账单地址,你还是可以用全世界的服务器可用区),但是信用卡是必须的,他会从信用卡里取两次 1$ 来验证你是不是真人。
+
+注意别搞错了 `Azure` 和 `Azure 世纪互联运营 ` 第二个是国内专版的……
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415133957.png)
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415133859.png)
+
+## 创建虚拟机
+随便创建一个先:
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415124249.png)
+
+这里决定你的 vm ip 位置
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415124356.png)
+
+这里要选B1s,它有一个月免费额度。并且是最便宜的,而且足够了。
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415124505.png)
+
+起一个用户名,还有密钥文件名,这个密钥是用来登录 vm 的(用户名 + pem文件登陆,不用密码),一会儿创建的时候Azure会让你下载。
+
+保存好,这个文件只能下载一次。
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415124622.png)
+
+磁盘选64G,因为30G收费,64有两块的免费额度。
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415124813.png)
+
+网络方面保持默认设置,但是这里要打勾,方便到时候删除vm的时候把相关的资源一同删除。Azure的ip、磁盘、网络等都是分开收费的,删除时候记得检查。
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415124906.png)
+
+最后就是创建了,看看价格大概是 1 CNY / h,但是不用担心,我们还有 200 USD 免费额度呢。
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415125123.png)
+
+
+## 开启安全组
+
+服务器安全组是一种在服务器外部的防火墙,可以控制服务器的入站和出站流量。
+
+默认情况下,azure仅开启22端口,只有在安全组中打开端口后,才能访问其他端口。
+
+> 在这里添加一个入站规则,允许所有端口的流量进入(源端口和目标端口都设置`*`)。
+>
+> (这不安全,但是这很简单)
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415132408.png)
+
+## 远程登录vm
+
+在Azure虚拟机管理找到vm的ip
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415130912.png)
+
+如过是mac系统下载的key,权限会不对,需要修改一下,让group 和 other 没有读取的权限,否则无法远程到服务器。
+
+```shell
+13:01 ~/remote-ssh $ ll
+-rw-r--r--@ 1 kasusa staff 2.4K Apr 15 12:52 myub2_key.pem
+
+13:01 ~/remote-ssh $ chmod 600 myub2_key.pem
+
+13:01 ~/remote-ssh $ ll
+-rw-------@ 1 kasusa staff 2.4K Apr 15 12:52 myub2_key.pem
+```
+
+### ssh
+
+```
+ssh -i myub2_key.pem azureuser@
+```
+
+用root权限 跑一键脚本(会自动安装v2ray、关闭防火墙、配置好然后给你一个 vmess link)
+```
+sudo -i
+bash <(curl -s -L https://git.io/v2ray-setup.sh)
+```
+
+---
+
+跑好了一件脚本,会自动开始运行,可以:
+
+* `v2ray status` 确认状态
+
+* `v2ray start` 启动一下
+
+按照下面的例子找一个自己能导入的链接:
+
+* `v2ray link` 生成一个json格式的东东
+
+* `v2ray qr` 生成 vmess 二维码、链接
+
+* `v2ray ssqr` 生成 ss 二维码、链接
+
+对于ios用户:小火箭能导入单个vmess节点,Qx不支持vmess,需要生成一个ss节点再导入。
+
+---
+
+v2ray ssqr 命令执行结果如下。
+
+> 二维码可以直接扫一扫(我这个缺失定位点你扫不了的),然后下面的 link 前半部份是他们的网址,后半部份 `ss://` 开头的就是你的节点了(他们是指 [一键脚本](https://git.io/v2ray-setup.sh) 的作者)
+
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20230415133228.png)
+
+可以通过下面的网址,把ss节点连接转换成 clash 的 yaml 文件。
+
+转换订阅链接 https://v2rayse.com/node-convert/ (他声称自己采用纯前段转换)
+
diff --git "a/content/post/old/2023-04-24-xray\346\211\253\346\217\217\345\231\250--\345\246\202\344\275\225\347\231\273\345\275\225\346\211\253\346\217\217.md" "b/content/post/old/2023-04-24-xray\346\211\253\346\217\217\345\231\250--\345\246\202\344\275\225\347\231\273\345\275\225\346\211\253\346\217\217.md"
new file mode 100644
index 00000000..82255c63
--- /dev/null
+++ "b/content/post/old/2023-04-24-xray\346\211\253\346\217\217\345\231\250--\345\246\202\344\275\225\347\231\273\345\275\225\346\211\253\346\217\217.md"
@@ -0,0 +1,79 @@
++++
+title = "Xray扫描器-如何登录扫描"
+description = ""
+date = 2023-09-20T16:45:43+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "xray","扫描器"
+]
+series = []
+images = []
++++
+
+xray 就像是一台安检扫描器,让你透视整个网站的漏洞和安全问题。
+
+## xray 安装
+
+https://github.com/chaitin/xray/releases
+
+下载对应的版本,解压后,将 xray_windows_amd64.exe 文件放到系统环境变量文件夹中。
+
+
+
+### 证书安装
+ca证书生成命令
+```
+xray_windows_amd64.exe genca
+```
+
+安装ca证书到--受信任的证书颁发机构 (windows)
+
+安装ca证书, 在钥匙串访问.app 中搜:“x-ray” ,然后双击安装证书,选择“始终信任”(mac)
+
+### 配置文件
+第一次运行 xray_windows_amd64.exe ,他会生成 yaml 等配置文件 , `config.yaml` 需要关注。
+
+1. hostname_allowed 参数用于控制白名单,设置好要扫描的目标网站,控制扫描范围。
+2. hostname_disallowed 参数用于控制黑名单,防止越界扫描,默认存在 gov.cn 等,按需删除。
+
+
+
+
+### 静态页面扫描
+```
+xray ws --url http://xxx.com --html-output a.html
+```
+
+### 监听模式扫描
+
+静态扫描无法正确登陆、不能爬取到登陆后的界面。
+可以使用监听模式扫描。
+```
+xray ws --listen 127.0.0.1:7777 --html-output a.html
+```
+
+运行结束之后 `ctr-C` 停止程序即可。
+
+> 如果没有扫描到任何漏洞的话就不会生成扫描报告。
+
+
+### 代理使用(监听模式)
+
+1. 可以使用 proxyomega 等代理工具,设置成 https - 127.0.0.1:7777
+2. (可选)在burp设置中搜索 `upstream` ,把它的上游代理设置成 127.0.0.1:7777 , `destination host` 设置成要渗透的目标网站(如: `*target.com*` ),浏览器继续使用burp代理(8080)。
+3. 在网页中乱点,查询,xray会在后台扫描,扫描结果会生成到指定的文件中。
+
+### 便利使用
+
+在 `~/.zshrc` 中添加别名,方便使用。
+```
+alias xray="cd /Users/kasusa/PentestEnvMac/xray&&./xray_darwin_arm64 ws --listen 127.0.0.1:7777 --html-output /Users/kasusa/Desktop/xrayout.html"
+```
+
+关于windows下的alias,可以参考[本站另一篇文章](https://cornradio.github.io/hugo/posts/2023-09-19-zshrc_for_powershell/ )。
\ No newline at end of file
diff --git a/content/post/old/2023-06-13-csharp_dict_ignorecase.md b/content/post/old/2023-06-13-csharp_dict_ignorecase.md
new file mode 100644
index 00000000..7a339c0f
--- /dev/null
+++ b/content/post/old/2023-06-13-csharp_dict_ignorecase.md
@@ -0,0 +1,55 @@
++++
+title = "csharp 字典 key 不区分大小写"
+description = ""
+date = 2023-06-13T10:41:53+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+
+Csharp_dict_ignorecase
+参考链接:
+
+
+
+---
+
+今天遇到一个问题,需要在C#中使用字典,但是字典的key是不区分大小写的,所以需要自己实现一个不区分大小写的字典,好在 c# 提供这项功能。
+
+
+核心代码:
+
+ Dictionary dict = new Dictionary (StringComparer.OrdinalIgnoreCase);
+
+例子
+```csharp
+using System;
+using System.Collections.Generic;
+public class Program {
+ public static void Main() {
+ Dictionary dict = new Dictionary (StringComparer.OrdinalIgnoreCase);
+ dict.Add("cricket", 1);
+ dict.Add("football", 2);
+ foreach (var val in dict) {
+ Console.WriteLine(val.ToString());
+ }
+ // case insensitive dictionary i.e. "cricket" is equal to "CRICKET"
+ Console.WriteLine(dict["cricket"]);
+ Console.WriteLine(dict["CRICKET"]);
+ }
+}
+```
+
+输出
+
+ 1
+ 1
\ No newline at end of file
diff --git a/content/post/old/2023-06-13-hugo-commands.md b/content/post/old/2023-06-13-hugo-commands.md
new file mode 100644
index 00000000..887aa530
--- /dev/null
+++ b/content/post/old/2023-06-13-hugo-commands.md
@@ -0,0 +1,38 @@
++++
+title = "Hugo Commands"
+description = ""
+date = 2023-06-13T22:18:58+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+
+我写了一些 hugo 脚本,包括 win 和 mac(linux) 平台。
+
+方便写博客。
+
+下载: [hugo-commands](https://github.com/cornradio/hugo-commands)
+
+![Imgur](https://i.imgur.com/HpMRVQj.png)
+
+
+> 吐槽一下这个power shell的command我是真的不会写基本上就是靠gpt辅助。
+> 也好在是这个脚本比较简单。
+>
+> 推荐一下我用的gpt:
+---
+
+我以前还写过 win 的一个客户端,生成 hugo 文件啥的,但是感觉不如脚本方便。
+
+喜欢图形化界面可以试试: [hugoAuto1](https://github.com/cornradio/hugoAuto1)
+
+![Imgur](https://i.imgur.com/w9BmBBL.png)
\ No newline at end of file
diff --git a/content/post/old/2023-06-13-parallels_crack.md b/content/post/old/2023-06-13-parallels_crack.md
new file mode 100644
index 00000000..df26460c
--- /dev/null
+++ b/content/post/old/2023-06-13-parallels_crack.md
@@ -0,0 +1,25 @@
++++
+title = "Parallels crack"
+description = ""
+date = 2023-06-13T09:22:06+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+
+![Imgur](https://i.imgur.com/gUzw0Bt.png)
+
+Parallels Desktop Crack
+
+readme 中包含详细的破解步骤。
+
+以防原repo被删,我fork了一份,地址:
\ No newline at end of file
diff --git a/content/post/old/2023-06-28-CsahrpArgTest.md b/content/post/old/2023-06-28-CsahrpArgTest.md
new file mode 100644
index 00000000..e9e00656
--- /dev/null
+++ b/content/post/old/2023-06-28-CsahrpArgTest.md
@@ -0,0 +1,137 @@
++++
+title = "Csahrp Arg Test"
+description = "让 csharp 接受命令行参数的测试"
+date = 2023-06-28T12:00:40+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "csharp","命令行参数"
+]
+series = []
+images = []
++++
+
+## 前言
+命令行参数在csharp中有专门的类库, \
+
+不过这个文章从底部的原理开始,不使用这么多功能的类库,并实现简单的参数处理功能。
+
+## csharp 接受命令行参数(简单例子)
+csharp 接受的命令行参数其实就是一个 string 数组:
+
+这是一个简单接受参数输入的程序
+
+```cs
+static void Main(string[] args)
+{
+ // 判断是否有传入参数
+ if (args.Length > 0)
+ {
+ // 使用参数 args[0]
+ for (int i = 0; i < args.Length; i++)
+ {
+ Console.WriteLine($"传入的参数 {i} 是: " + args[i]);
+ }
+ }
+ else
+ {
+ Console.WriteLine("没有传入参数。");
+ }
+ Console.ReadLine();
+}
+```
+你可以如下方式使用它
+
+```bat
+.\CsahrpArgTest.exe -PentestReport "c:/a.docx"
+```
+
+输出结果如下
+
+ 传入的参数 0 是: -PentestReport
+ 传入的参数 1 是: c:/a.docx
+
+## 传参测试脚本
+
+为了方便测试,我编写了一个小脚本(powershell格式):
+
+他的功能是 build 项目,然后运行程序,传入参数
+
+```ps1
+$originalPath = Get-Location
+Set-Location CsahrpArgTest/
+dotnet build
+echo --runcode:--------------------------------
+Set-Location bin/Debug/net7.0
+.\CsahrpArgTest.exe -PentestReport "c:/a.docx"
+
+# 恢复原始工作目录
+Set-Location $originalPath
+```
+
+## 传参-更实际的的例子
+
+我们实际使用的程序中,更常见的是这样的参数传递方式:
+
+```
+.\CsahrpArgTest.exe --pentestreport "c:/a.docx"
+```
+
+我们使用 switch 语句来处理参数 arg0
+
+下面的例子函数中中包含:
+- -h 的处理
+- -p 的处理
+- 未知参数的处理
+
+```cs
+public static bool processArgs(string[] args)
+{
+ // 判断是否有传入参数
+ if (args.Length > 0)
+ {
+ string arg0 = args[0];
+ switch (arg0)
+ {
+ case "--help":
+ case "-h":
+ Console.WriteLine(@"帮助信息:
+ 本软件可以使用参数如下:
+ --help, -h: 打印帮助信息
+ --pentestreport ,-p : 指定渗透测试报告路径并转换");
+ return true;
+ break;
+
+ case "--pentestreport":
+ case "-p":
+ if (args.Length > 1)
+ {
+ string reportPath = args[1];
+ Console.WriteLine("渗透测试报告路径:" + reportPath);
+ return true;
+ }
+ else
+ {
+ Console.WriteLine("未指定渗透测试报告路径");
+ return false;
+ }
+ break;
+
+ default:
+ Console.WriteLine("未知参数:" + arg0);
+ return false;
+ break;
+ }
+ }
+ else
+ {
+ Console.WriteLine("没有传入参数");
+ return false;
+ }
+}
+```
\ No newline at end of file
diff --git "a/content/post/old/2023-06-28-\345\217\263\351\224\256\350\217\234\345\215\225\347\256\241\347\220\206.md" "b/content/post/old/2023-06-28-\345\217\263\351\224\256\350\217\234\345\215\225\347\256\241\347\220\206.md"
new file mode 100644
index 00000000..33ca73e2
--- /dev/null
+++ "b/content/post/old/2023-06-28-\345\217\263\351\224\256\350\217\234\345\215\225\347\256\241\347\220\206.md"
@@ -0,0 +1,43 @@
++++
+title = "windows 右键菜单管理"
+description = ""
+date = 2023-06-28T14:50:35+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+
+
+目前我正在开发一个命令行程序,用途是处理docx文件,我的用户想要增加 “右键点击docx文件就能处理文件” 的功能。
+
+
+## windows 右键菜单管理工具
+
+windows 右键菜在注册表中进行管理,不过我的程序不需要 “ 很好的安装体验 ” ,并且用户们也都有一定的动手能力。
+
+所以我选择使用一个第三方工具来实现这个功能:
+
+
+
+![程序的例图](https://i.imgur.com/fgrQVXP.png)
+
+## 使用方法
+
+
+- 左侧选择文件(在文件上右键时候会出现)
+- 点击右上角的加号 - 新建一个菜单项目
+- 类型选择Shell(默认的)
+- 浏览找到处理文件的程序
+- 修改命令参数 如改成:`-process "%1"` (这里的 `%1` 是文件的路径)
+- 点击确定 保存设置
+
+![添加的截图](https://i.imgur.com/o1b0hOj.png)
\ No newline at end of file
diff --git "a/content/post/old/2023-07-03-\345\234\250csharp\347\250\213\345\272\217\344\270\255\350\216\267\345\217\226\345\275\223\345\211\215\347\233\256\345\275\225.md" "b/content/post/old/2023-07-03-\345\234\250csharp\347\250\213\345\272\217\344\270\255\350\216\267\345\217\226\345\275\223\345\211\215\347\233\256\345\275\225.md"
new file mode 100644
index 00000000..9ba2563d
--- /dev/null
+++ "b/content/post/old/2023-07-03-\345\234\250csharp\347\250\213\345\272\217\344\270\255\350\216\267\345\217\226\345\275\223\345\211\215\347\233\256\345\275\225.md"
@@ -0,0 +1,33 @@
++++
+title = "在csharp程序中获取当前目录"
+description = ""
+date = 2023-07-03T10:13:05+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "csharp"
+]
+series = []
+images = []
++++
+
+## 在csharp程序中获取当前目录
+
+```cs
+string exeDirectory = AppDomain.CurrentDomain.BaseDirectory;
+```
+
+返回的是当前应用程序域的基目录,它通常是可执行文件所在的目录。
+
+通过这个方法获取到的路径可以用于加载资源文件、访问配置文件或其他相关操作。
+
+---
+
+我之前给我的程序加了右键功能,但是他会找不到我放在 exe 目录下的资源文件(一个漏洞数据库excel)。
+
+所以需要先获取 exe 文件目录,然后拼接一个资源文件目录,并指定加载这个文件。
\ No newline at end of file
diff --git a/content/post/old/2023-07-05-get-office.md b/content/post/old/2023-07-05-get-office.md
new file mode 100644
index 00000000..4f00fc2b
--- /dev/null
+++ b/content/post/old/2023-07-05-get-office.md
@@ -0,0 +1,33 @@
++++
+title = "Get Office / Windows and crack it"
+description = ""
+date = 2023-07-05T22:01:50+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "office"
+]
+series = []
+images = []
++++
+因为经常要给各种机器装office 已经麻了 所以写个小博客,方便后面用
+
+
+## 下载office
+- 在 [这里](https://www.office.com/?auth=1)下载 office ,需要用自己的账号登录
+
+## 下载windows
+- 在 [这里](https://msdn.itellyou.cn/)下载 windows 镜像,可以用[迅雷](https://www.xunlei.com/),速度很快
+
+## 激活office
+- 一键激活 , 用 prowershell(管理员)
+- 脚本需要翻墙才能使用
+- 这个脚本来源是:[github](https://github.com/massgravel/Microsoft-Activation-Scripts)
+```
+irm https://massgrave.dev/get | iex
+```
diff --git "a/content/post/old/2023-07-05-\345\210\266\344\275\234\344\270\200\344\270\2522G\345\244\247\347\232\204dummy\346\226\207\344\273\266.md" "b/content/post/old/2023-07-05-\345\210\266\344\275\234\344\270\200\344\270\2522G\345\244\247\347\232\204dummy\346\226\207\344\273\266.md"
new file mode 100644
index 00000000..9f9ba4df
--- /dev/null
+++ "b/content/post/old/2023-07-05-\345\210\266\344\275\234\344\270\200\344\270\2522G\345\244\247\347\232\204dummy\346\226\207\344\273\266.md"
@@ -0,0 +1,31 @@
++++
+title = "制作一个2G大的dummy文件"
+description = ""
+date = 2023-07-05T22:27:20+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "Mac"
+]
+series = []
+images = []
++++
+## 用途
+- 用于测试文件传输速度
+
+在 Mac 上想要测试文件传输速度时,因为 finder 没有提供速度值的显示,所以需要借助“活动监视器”,在传输文件时,"磁盘"栏下,会显示当前的读取和写入速度。
+
+很多时候恰好没有一个够大的文件,这个小代码可能会排上用场。
+
+## code
+创建一个2G大小的文件空文件 “hi.zip”
+
+```bash
+dd if=/dev/zero of=hi.zip bs=1G count=2
+```
+
diff --git a/content/post/old/2023-07-13-copyQ.md b/content/post/old/2023-07-13-copyQ.md
new file mode 100644
index 00000000..99126386
--- /dev/null
+++ b/content/post/old/2023-07-13-copyQ.md
@@ -0,0 +1,52 @@
++++
+title = "CopyQ"
+description = ""
+date = 2023-07-13T15:47:10+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+
+最近再寻找一个好用的clipboard manager软件,copyQ是一个选择。
+
+再windows上面的copyQ 界面非常古董,功能也不是那么显而易见,参看了下面的官网doc。
+
+
+
+我整理了下列用法:
+
+## 快捷键设置
+copyQ默认不设置快捷键,需要自行设置。
+- 打开copyQ - ctrl + P 打开设置菜单
+- 把【显示主窗口】、【显示托盘菜单】设置快捷键
+![Imgur](https://i.imgur.com/la6RJOS.png)
+
+## item 管理
+
+> 下面功能都是 主窗口 的功能,托盘菜单功能很少。
+- 按下回车粘贴,可以多选
+- 直接打字开始搜索
+- F2 编辑项目, 再次按下 F2 保存
+- ctrl+N 新建项目,把这里当作一个临时记事本 F2 保存
+- delete 删除项目, ctrl + A 全选后清空垃圾
+- ---
+- F7 放大查看图片
+- F4 可以修改格式,比如从code里面复制出来的代码,可以删除带颜色的html格式,从而变成纯text格式
+- ---
+- ctrl+E 用外置编辑器打开项目,再windows上默认是使用notepad。(我修改成了 `cmd /c code %1` 用 vscode打开文件)
+- 多选时按下 ctrl + shift + R 可以逆转顺序(这个功能很有趣)
+![Imgur](https://i.imgur.com/cXeZi74.png)
+## Tab 管理
+- ctrl+T 新建tab
+- tab 的名称可以使用`&`开头,比如`&my`,这样就可以使用 alt+M 快捷键切换tab了
+- 使用 ctrl+1...9 切换tab
+- 再设置中,可以给tab增加好看的图标
diff --git "a/content/post/old/2023-07-14-python-win-\345\256\211\350\243\205.md" "b/content/post/old/2023-07-14-python-win-\345\256\211\350\243\205.md"
new file mode 100644
index 00000000..2742aac2
--- /dev/null
+++ "b/content/post/old/2023-07-14-python-win-\345\256\211\350\243\205.md"
@@ -0,0 +1,47 @@
++++
+title = "Python Win 安装"
+description = ""
+date = 2023-07-14T15:12:50+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "python"
+]
+series = []
+images = []
++++
+
+
+
+当你在一台新的 windows 设备的 命令行 中输入 python / python3 时,会提示你安装 python ,并把你拐到**微软商店**下载。
+
+但是微软商店的版本python有坑!
+
+---
+
+## 对于已经被微软商店下毒的电脑
+
+- 关闭 **应用执行别名** 中的 python [例图](https://i.imgur.com/4nRyMIh.png)
+- 执行这些步骤[对于新电脑执行](#对于新电脑)
+
+---
+
+## 对于新电脑
+
+- 正确的下载地址 [python.org](https://www.python.org/downloads/)
+- 在安装时候要勾选 **Add to PATH** 选项 ![Imgur](https://i.imgur.com/Ea1cXXL.png)
+- 下图可以看到他安装程序添加的系统变量
+![Imgur](https://i.imgur.com/aAmq5Wx.png)
+
+---
+
+## 对于装了一堆垃圾的windows
+电脑有 3-4 个python环境的,只能去卸载python,然后手动清理掉之前的环境变量,再重新安装。
+
+## pip换源
+[参考](https://cornradio.github.io/hugo/posts/pip%E9%85%8D%E7%BD%AE%E6%BA%90/)
\ No newline at end of file
diff --git a/content/post/old/2023-07-27-firefox_burp_proxy.md b/content/post/old/2023-07-27-firefox_burp_proxy.md
new file mode 100644
index 00000000..0af3a0aa
--- /dev/null
+++ b/content/post/old/2023-07-27-firefox_burp_proxy.md
@@ -0,0 +1,33 @@
++++
+title = "Firefox 配置 burp_proxy 和 证书"
+description = ""
+date = 2023-07-27T12:39:49+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+
+## 安装代理拓展
+安装拓展:
+
+chrome : [switchomega](https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif?hl=zh-CN)
+
+firefox : [foxyproxy](https://addons.mozilla.org/zh-CN/firefox/addon/foxyproxy-standard/?utm_source=addons.mozilla.org&utm_medium=referral&utm_content=search)
+
+创建代理 : `127.0.0.1:8080`
+
+## 安装burp证书
+1. 先开启burp,然后切换到 burp 的代理
+2. 访问 https://burp/ 下载证书
+3. 打开firefox设置 - 搜索”证书“ - 查看证书 - 导入 - 选择刚刚下载的证书
+
+
diff --git a/content/post/old/2023-07-31-fileupload.md b/content/post/old/2023-07-31-fileupload.md
new file mode 100644
index 00000000..4a44a68f
--- /dev/null
+++ b/content/post/old/2023-07-31-fileupload.md
@@ -0,0 +1,548 @@
++++
+title = "文件上传漏洞笔记"
+description = ""
+date = 2023-07-31T20:59:37+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "渗透测试","upload-labs"
+]
+series = []
+images = []
++++
+
+## 00-文件上传简介
+upload-labs 靶场 [c0ny1/upload-labs](https://github.com/c0ny1/upload-labs)
+
+蚁剑 [第一个Shell (yuque.com)](https://www.yuque.com/antswordproject/antsword/qg3g73)
+
+文件上传通常要上传如 php asp 这种文件,服务器在你访问上传的文件后,对文件进行解析/执行。
+
+比如你上传了xxx.php ,然后你访问这个文件,这样服务器就会执行你的代码,配合蚁剑你就可以控制整个网站的文件内容。
+
+upload-labs 打法这里还有个博客,[(34条消息) upload-labs通关大全(已完结)_仙女象的博客-CSDN博客](https://blog.csdn.net/elephantxiang/article/details/120660685?spm=1001.2014.3001.5502)
+
+### php 例子
+
+为了理解文件上传,请搭建phpstudy环境,自己运行下面的 html 和 php
+
+```html
+
+```
+
+`
+```
+
+### 方法2 抓包替换后缀名
+
+1. 选择 1.jpg 文件上传(文件内容是php代码)
+2. 用抓包工具修改后post内容的文件后缀名(这时候payload 已经通过了js校验)
+
+![Imgur](https://i.imgur.com/ofmgpwh.png)
+
+---
+
+## 04-绕过content-type
+> 适用范围:网站后台代码对上传文件de content-type 进行校验
+
+
+关键语句(php会对content-type进行验证):
+
+```php
+if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))
+```
+
+### 使用burp绕过
+
+Pass-02
+
+为了方便观察,我们打开upload lab 的 上传存储文件夹 `C:\phpstudy_pro\WWW\upload`
+
+常见的媒体格式类型如下:
+更多参考 runoob [HTTP content-type | 菜鸟教程 (runoob.com)](https://www.runoob.com/http/http-content-type.html)
+
+ - text/html : HTML格式
+ - text/plain :纯文本格式
+ - text/xml : XML格式
+ - image/gif :gif图片格式
+ - image/jpeg :jpg图片格式
+ - image/png:png图片格式
+
+1. 上传1.php文件
+2. 开启抓包,修改文件的 content-type 字段为 image/jpeg
+3. 放行包
+![Imgur](https://i.imgur.com/w1QMd8h.png)
+
+---
+
+## 05-绕过简单黑名单
+> 适用范围:黑名单,后缀限制较少
+
+
+如果出现这种提示:不允许上传.asp,.aspx,.php,.jsp后缀文件,则可以判断是黑名单上传。
+
+对于iis:
+可以上传 asa \ cer \ cdx 这些
+
+对于apache:
+可以上传 phtml \ php3 这些
+
+Pass03
+
+```php
+$is_upload = false;
+$msg = null;
+if (isset($_POST['submit'])) {
+ if (file_exists(UPLOAD_PATH)) {
+ $deny_ext = array('.asp','.aspx','.php','.jsp');
+ $file_name = trim($_FILES['upload_file']['name']);
+ //这里开始下面一大块就是获取后缀名然后tolower
+ $file_name = deldot($file_name);//删除文件名末尾的点
+ $file_ext = strrchr($file_name, '.');
+ $file_ext = strtolower($file_ext); //转换为小写
+ $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
+ $file_ext = trim($file_ext); //收尾去空
+
+ if(!in_array($file_ext, $deny_ext)) {
+ $temp_file = $_FILES['upload_file']['tmp_name'];
+ $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
+ if (move_uploaded_file($temp_file,$img_path)) {
+ $is_upload = true;
+ } else {
+ $msg = '上传出错!';
+ }
+ } else {
+ $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
+ }
+ } else {
+ $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
+ }
+}
+```
+
+---
+
+## 06-.htaccess文件重写攻击
+
+> 适用范围:黑名单没有限制 .htaccess, Apache专用
+
+
+
+1. 上传 1.jpg 文件
+2. 上传 .htaccess 文件
+3. 访问 jpg 上传后的位置,发现已经执行了里面的php代码
+
+
+.htaccess 是一个apache的配置文件,可以修改apache服务器处理文件的行为
+
+比如我们制作一个攻击用 .htaccess 文件内容如下:
+
+```xml
+
+SetHandler application/x-httpd-php
+
+```
+
+这样你访问jpg文件目录的时候,他就会把你上传 的 jpg 当作 php 来执行了。
+
+---
+
+## 07-大小写绕过
+> 适用范围:黑名单,php早期版本,5.x
+
+
+有的上传使用黑名单,且未对大小写进行严格判断:
+
+这时候可尝试上传 `xxx .phP` , 但是貌似对于新的php版本无效。
+
+---
+
+## 08-空格绕过、windows服务器点绕过
+
+> 适用范围:黑名单,php5.x,后端未对空格过滤 ,服务器采用windows系统
+
+### 空格绕过
+
+Pass-06
+Pass-07
+1. 上传1.php
+2. 抓包,改写文件名为 `1.php<空格> `
+3. 放行,上传成功
+
+
+> 发现一个问题,就是我一开始用了 小皮面板,php版本:7.3.4 ,无法成功。
+>
+> 但是后面用了按月给的那个环境,php:5.2.17 可复现。
+>
+> 所以版本比较高的没用。
+
+### windows服务器点绕过
+
+如果对方的后端使用的是Windows, Windows系统会在把文件复制到上传文件夹的时候自动删除文件末尾的点 , 比如你传 `1.php.` 通过了验证 ,然后Windows把它给挪到上传文件夹后就自动变成 `1.php`
+
+1. 上传 `1.php`
+2. 抓包,改写文件名为 `1.php. `
+3. 放行,上传成功
+
+---
+
+
+## 09-NTFS数据流绕过 DATA
+
+> 适用范围:windows NTFS ,黑名单,对::$DATA 字符串未做限制
+
+ 我是win系统,但是硬盘使用了extFAT格式,所以一直不成功。
+ 然后我重启这个phpstudy环境,把整个WWW文件位置挪到了NTFS格式硬盘的桌面上,
+ 还是不行,最后发现要在phpStudy设置中-设置新的网站目录
+
+**Pass-08**
+
+**方法:**
+抓包,文件名+"::$DATA" 上传,可用绕过后缀检测
+
+### 数据流知识
+
+> 下面是经过我修改得的GPT回复,可用用来浅浅的了解下NTFS数据流。
+>
+
+NTFS数据流是指在NTFS文件系统中,一个文件可以包含多个数据流(Alternate Data Streams,ADS)。每个数据流可以存储额外的数据,与文件的主数据流相互独立,但在一般情况下是不可见的。
+
+对于普通用户而言,操作NTFS数据流可能需要一些高级的技术和工具。然而,以下是一种简单的方法来操作NTFS数据流:
+
+1. 创建一个新的文本文件,例如"test.txt"。
+2. 打开命令提示符(CMD)。
+3. 使用以下命令创建一个新的数据流并写入数据:
+ `echo This is a hidden message > test.txt:hidden.txt`
+ 这个命令将在"test.txt"文件中创建一个名为"hidden.txt"的数据流,并将"This is a hidden message"写入该数据流。
+4. 使用以下命令查看文件中的所有数据流:
+ `dir /r test.txt`
+ 这个命令将显示"test.txt"文件以及它的所有数据流。
+5. 使用以下命令读取数据流的内容:
+ `more < test.txt:hidden.txt`
+ 这个命令将显示"hidden.txt"数据流中的内容。
+
+请注意,以上方法仅适用于在Windows命令提示符下进行简单的操作。
+
+---
+
+我理解,数据流就是NTFS系统中的一种隐藏文件,这玩意可有一个宿主文件。宿主文件删了,数据流就跟着没了。
+
+---
+
+## 10-windows 叠加特征上传
+Pass-09
+
+> 适用范围:windows NTFS ,黑名单,对 尖括号没有限制的情况
+
+1. 上传 `s.jpg` 文件,文件名用 burp 修改:
+```
+s.php:s.jpg
+```
+> 这时候系统就会通过校验,因为后缀名是jpg,但是因为文件流,实际上 s.jpg 将会不可见。并且会新建一个 s.php 文件(空文件)
+
+2. 上传 1.php 文件,抓包修改名称 为 `s.>>>` 代表 `s.???` ,会正则匹配到刚才创建的 s.php 。 然后系统会把他的内容变成你新上传的内容。
+
+3. 打开 : http://localhost/upload/s.php 即可发现上传成功
+
+
+文件名匹配规则:
+```
+ 双引号" 等于 点号.
+ 大于符号> 等于 问号?
+ 小于符号< 等于 星号*
+
+```
+
+---
+
+## 11-双写文件名
+
+Pass-10
+> 适用范围:黑名单,上传后端使用关键字删除
+> 如上传 `1.php` , 实际会上传文件 `1.` 到目录的情况
+
+1. 抓包修改文件名称为 `1.pphphp` (在php外面夹着一个p hp,其他类型文件同理,只要过滤器做的比较垃圾就会成功绕过)
+2. 查看发现上传成功
+
+---
+
+## 12-上传参数目录可控
+
+> 适用范围:php<5.3.4 , 未开启gpc , 使用%00
+
+### Get 方式
+Pass-11
+
+> 客户端可以控制上传路径,如 url中有如下类似字串 `?save_path=../upload/`
+```php
+$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
+```
+> 正常上传会产生 一个上传目录:`../upload/039840198431.jpg`
+
+1. 上传jpg文件
+2. 抓包修改请求头为 `?save_path=../upload/1.php%00`
+3. 这样上传路径变成 `../upload/1.php%00039840198431.jpg` , 然后php 保存的时候把 %00 后面的东西都忽略了,就把文件保存成 1.php 了
+4. 访问 http://localhost/upload/1.php 成功
+
+### Post 方式
+Pass-12
+
+php后端源码改用了 post 方式获取 savepath,这时候同样可以使用 %00 但是要进行url解码。
+```php
+ $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
+```
+1. 上传jpg文件
+2. 抓包修改post 内容
+
+```
+Content-Disposition: form-data; name="save_path"
+
+../upload/2.php%00
+```
+
+4. 选择 `%00` 按下 `ctrl + shift + u` 进行俩 decode , 然后放行 (%00 会变成一个空的方框一样的东西)
+5. 访问 http://localhost/upload/1.php 成功
+
+---
+
+## 13-文件头检测绕过
+之前的章节一直是用后缀名限制,并且是黑名单,属于较容易绕过的上传漏洞。
+从这里开始的Pass基本上都是白名单了。
+
+
+Pass-13
+> 适用范围:采用文件魔数字(文件头的两个字节)判断文件类型的检测
+> 上传的图片木马需要借助 [文件包含漏洞](http://localhost/include.php) 才能正常运行
+
+常见的文件头参考表(HEX格式) [51CTO博客_](https://blog.51cto.com/u_2982693/3354695)
+- JPEG (jpg),文件头:FFD8FF
+- PNG (png),文件头:89504E47
+这些都是16进制文件头,可以使用 [From Hex - CyberChef](https://gchq.github.io/CyberChef/#recipe=From_Hex('Auto')) 尝试在线解码 ,比如 jpg 解码后是 `ÿØÿ` 但一般这种乱码都不好用,比较推荐利用gif文件,gif的头`47 49 46 38`解码后是 `GIF8` ,可以轻松使用burp上传。
+
+获取文件头还有一种简单的方式,就是找到一个文件,用记事本打开,然后复制第一个单词之类的
+
+制作图片马 有两种方式,一种是基于真正的图片,一种是抓包修改头部,让服务器以为自己收到的是图片。
+
+### 基于真正的图片法
+
+打开cmd ,准备好 1.gif 和 1.php ,执行下方代码:
+
+```c
+copy 1.gif/b+1.php ma.gif
+```
+
+制作好`ma.gif`之后,用记事本打开,可以发现,相当于在 原版的 `1.gif` 尾部,追加了 `` 。
+1. 上传`ma.gif`
+2. 获取上传后路径 http://localhost/upload/1020230731134955.gif , 路径为 `upload/1020230731134955.gif`
+3. 与文件包含漏洞 http://localhost/include.php 组合
+4. 访问 http://localhost/include.php?file=upload/1020230731134955.gif 图片马执行。
+
+### 抓包修改头部法
+
+1. 上传 1.php
+2. 抓包修改
+原包
+```
+-----------------------------30629768524726476051439622056
+Content-Disposition: form-data; name="upload_file"; filename="1.php"
+Content-Type: application/octet-stream
+
+
+```
+修改后(修改了文件后缀名和包内容前面部分)
+
+```
+-----------------------------30629768524726476051439622056
+Content-Disposition: form-data; name="upload_file"; filename="1.gif"
+Content-Type: application/octet-stream
+
+GIF8
+```
+3. 截获返回包,搜索`../upload` 搜索到上传位置 :/upload/8320230731140148.gif
+4. 与文件包含漏洞 http://localhost/include.php 组合
+5. 访问 http://localhost/include.php?file=upload/8320230731140148.gif 图片马执行。
+
+## 14-绕过图片二次渲染
+Pass-16
+> 适用范围:图片上传后会进行压缩,压缩后可能会损坏php后门的情况
+> 上传的图片木马需要借助 [文件包含漏洞](http://localhost/include.php) 才能正常运行
+
+解法:先正常上传文件(推荐gif,因为gif压缩比小),然获取压缩后文件,进行对比找到未压缩的部分,用php后门覆盖一小块未压缩部分的文件
+
+使用工具:HxD Hex Editor
+如果你不想要用这个win工具,可以试试网页版Hex编辑器,但是可能会很卡顿 https://hexed.it/
+
+1. 上传1.gif,获取上传后文件20161.gif
+2. 通过使用 HxD工具进行查看和对比,发现文件前部基本无区别,覆盖修改一部分内容为
+```
+
+```
+3. 另存为 3.gif
+4. 上传3.gif ,获取到上传后路径: upload/17173.gif
+5. 与文件包含漏洞 http://localhost/include.php 组合
+6. 访问 http://localhost/include.php?file=upload/17173.gif 图片马执行。
+
+## 15-文件名可控绕过
+
+
+适用范围:php<5.3.4 , 未开启gpc , 使用%00
+
+对于iis<6.0 : 使用分号 1.asp;1.jpg
+
+对于apache ,使用 .a 1.php.a (优先左解释)
+
+斜杠法 : 1.php/.
+
+## 17-文件上传其他漏洞
+
+nginx 0.83
+
+上传jpg文件,访问 `1.jpg%00php` ,会被当作php解析
+
+apahce 1.x 或者 2.x
+
+当 apache 遇见不认识的后缀名,会从后向前解析例
+如 1.php.rar 不认识 rar 就向前解析,直到知道它认识的后缀名。
+
+phpcgi 漏洞(nginx iis7 或者以上)
+
+上传图片1.jpg。访问 1.jpg/1.php 也会解析成 php。
+
+Apache HTTPD 换行解析漏洞(CVE-2017-15715)
+
+apache通过 mod_php来运行脚本,其 2.4.0-2.4.29中存在apache 换行解析漏洞,上传文件名为 `xxx.php\x0A`(x0A) 是换行符
+将被按照 PHP 后缀进行解析,导致绕过一些服务器的安全策略
\ No newline at end of file
diff --git "a/content/post/old/2023-08-04-git\347\231\273\345\275\225.md" "b/content/post/old/2023-08-04-git\347\231\273\345\275\225.md"
new file mode 100644
index 00000000..0e2e6605
--- /dev/null
+++ "b/content/post/old/2023-08-04-git\347\231\273\345\275\225.md"
@@ -0,0 +1,28 @@
++++
+title = "git 命令行登录"
+description = ""
+date = 2023-08-04T20:23:18+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "github","git"
+]
+series = []
+images = []
++++
+有时候登录命令行版本的git会出现这个错误
+```
+remote: Support for password authentication was removed on August 13, 2021.
+remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
+```
+
+原因是github不再支持密码验证,需要使用token验证,具体操作如下:
+1. 在github上生成token 网站:[github.com/settings/tokens](https://github.com/settings/tokens)
+2. 下次命令行要求输入密码时,输入token即可
+
+> 注意:token只会显示一次,所以要保存好,不然就要重新生成了,也可以用密码记录软件保存这个token,在多处使用,因为要一个一个勾选权限也挺麻烦的其实。
\ No newline at end of file
diff --git "a/content/post/old/2023-08-04-v2ray\350\207\252\345\273\272.md" "b/content/post/old/2023-08-04-v2ray\350\207\252\345\273\272.md"
new file mode 100644
index 00000000..bd7ce2ad
--- /dev/null
+++ "b/content/post/old/2023-08-04-v2ray\350\207\252\345\273\272.md"
@@ -0,0 +1,56 @@
++++
+title = "V2ray自建--客户端工具的选择"
+description = ""
+date = 2023-08-04T20:23:18+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "v2ray"
+]
+series = []
+images = []
++++
+
+> 之前写过一篇文章,使用azure的服务器搭建v2ray节点,但是白嫖结束之后我就没再用了,最近又开始用了起来(因为机场的节点真的非常“脏”很多网站都没法正常看了)。
+> 但是我发现clash的客户端对于我这个自建脚本的支持真的非常捉鸡,我又开始找其他的客户端了。
+
+## 前情提要
+
+这个一键脚本功能蛮少的,也不能配置域名啥的,但是他是一键的……
+
+```
+sudo -i
+bash <(curl -s -L https://git.io/v2ray-setup.sh)
+```
+
+确认状态
+
+```
+v2ray status
+```
+
+启动一下
+```
+v2ray start
+```
+
+生成 vmess 二维码、链接
+
+```
+v2ray qr
+```
+
+## 客户端
+
+下载客户端要连接github,先挂个代理确保网速。
+
+- ios : shadowrocket 直接扫码
+- android : [v2rayNG](https://github.com/2dust/v2rayNg/releases) ,下载那个最大的,兼容性好。
+- windows : [v2rayN](https://github.com/2dust/v2rayN/releases/) ,下载 v2rayN-With-Core.zip
+- macos : [v2rayU](https://github.com/yanue/V2rayU/releases) , 自己选x64、arm, cmd + P 从剪切板导入。
+
diff --git a/content/post/old/2023-08-05-x-ui.md b/content/post/old/2023-08-05-x-ui.md
new file mode 100644
index 00000000..11f4018e
--- /dev/null
+++ b/content/post/old/2023-08-05-x-ui.md
@@ -0,0 +1,148 @@
++++
+title = "X-Ui--一款V2ray管理面板"
+description = ""
+date = 2023-08-05T00:08:50+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "x-ui","v2ray"
+]
+series = []
+images = []
++++
+
+> credit: https://bulianglin.com/archives/nicename.html
+>
+## 准备服务器
+服务器:尽量在初始化的时候就选择关闭 `ipv6` ,并且选择`debian`系统,xui面版有自动绑定到ipv6的坏习惯,并且对`centos`支持差。
+
+服务器准备好(安装好系统)之后:`ping `,如果不能ping通,删除重新申请。
+
+服务器准备好之后可以使用 [termius](https://termius.com/) 之类的工具进行ssh连接。
+
+## 安装 x-ui
+
+使用root账户权限执行:
+
+```bash
+bash <(curl -Ls https://raw.githubusercontent.com/FranzKafkaYu/x-ui/956bf85bbac978d56c0e319c5fac2d6db7df9564/install.sh) 0.3.4.4
+```
+
+创建用户,选择端口,我选`10000`
+
+## 访问管理后台
+
+浏览器访问: `http://:10000`
+
+如果不能访问,试试关闭服务器的防火墙:
+
+```bash
+apt install ufw
+ufw disable
+```
+
+还是不行的话建议查看下 端口开放情况 应该有一条类似下面的行,代表服务器的10000端口已经开放
+```
+ss -nltp
+LISTEN 0 4096 *:10000 *:* users:(("x-ui",pid=11270,fd=7))
+```
+
+## 新建节点
+
+图形化的,非常简单易用~
+
+入站列表-添加入站
+
+### vmess + ws
+
+ 备注:随意
+ 协议:vmess
+ 用户:添加一个(加号)
+ 网络:ws
+ 路径:复制用户的id头,比如/0349f58b
+
+### vemss wechat
+
+ 备注:随意
+ 协议:vmess
+ 用户:添加一个(加号)
+ 网络:kcp
+ 伪装:wechat-video
+
+特点:比ws更快,但是兼容性没ws好
+
+### vless + vision
+
+这种方式需要证书,非常麻烦,也不知道有啥好处
+
+ 备注:随意
+ 协议:vless
+ 用户:添加一个(加号)
+ tls:打开开关
+ 用户-flow:xtls-rprx-vision
+ 域名:把ip的点换成 - ,最后面写 .nip.io
+ 填写:私钥、公钥(需要先申请好证书)
+
+用下面方法申请证书
+
+```bash
+#安装证书工具:
+curl https://get.acme.sh | sh; apt install socat -y || yum install socat -y; ~/.acme.sh/acme.sh --set-default-ca --server letsencrypt
+
+#三种方式任选其中一种,申请失败则更换方式(我测试第三种好用)
+#申请证书方式1:
+~/.acme.sh/acme.sh --issue -d 你的域名 --standalone -k ec-256 --force --insecure
+#申请证书方式2:
+~/.acme.sh/acme.sh --register-account -m "${RANDOM}@chacuo.net" --server buypass --force --insecure && ~/.acme.sh/acme.sh --issue -d 你的域名 --standalone -k ec-256 --force --insecure --server buypass
+#申请证书方式3:
+~/.acme.sh/acme.sh --register-account -m "${RANDOM}@chacuo.net" --server zerossl --force --insecure && ~/.acme.sh/acme.sh --issue -d 你的域名 --standalone -k ec-256 --force --insecure --server zerossl
+
+#安装证书:
+~/.acme.sh/acme.sh --install-cert -d 你的域名 --ecc --key-file /etc/x-ui/server.key --fullchain-file /etc/x-ui/server.crt
+```
+
+证书安装好之后,命令行会提示**证书所在位置**,cert是私钥,CA是公钥,把他们的路径写进x-ui的节点里面即可。
+
+ [Fri Aug 4 03:34:09 PM UTC 2023] Your cert is in: /root/.acme.sh/你的域名_ecc/你的域名.cer
+ [Fri Aug 4 03:34:09 PM UTC 2023] Your cert key is in: /root/.acme.sh/你的域名_ecc/你的域名.key
+ [Fri Aug 4 03:34:09 PM UTC 2023] The intermediate CA cert is in: /root/.acme.sh/你的域名_ecc/ca.cer
+ [Fri Aug 4 03:34:09 PM UTC 2023] And the full chain certs is there: /root/.acme.sh/你的域名_ecc/fullchain.cer
+
+## 一些?错误
+> 我发现在点击 x-ui 的`设置`之后,整个页面将会变得无法访问,一直显示404.
+
+临时解决方法:
+
+ 命令行输入:x-ui 进入管理脚本
+ 选择功能 5. 重置面板设置
+ 选择功能 6. 设置面板端口
+
+两个都执行完毕后就能恢复正常了。
+
+---
+
+仔细研究之后发现,他是在你访问设置界面时候,会自动给你生成新的url如:`http://:10000/1XiH/xui/` , 这个`1XiH` 是随机生成的,以后这个url才能访问面板,直接访问`ip:端口`会显示404,算是一种保护。
+
+## 配置https证书
+
+> 为啥要配置https证书:
+>
+> 因为x-ui默认http直连,在网络中明文传输,如果有有心之人抓包玩,完全可以看到了你的账号、密码、面板url和端口号,那你的面板就临被盗的危险。
+
+如果你完成了上面的 `vless + vision` 的配置,那么你就有https证书了。
+
+位置在这个文件夹里面:
+
+ /.acme.sh/.nip.io_ecc
+
+在x-ui面板-设置中填写下面两个东西:
+
+ 证书公钥文件路径:/root/.acme.sh/.nip.io_ecc/.nip.io.cer
+ 证书私钥文件路径:/root/.acme.sh/.nip.io_ecc/.nip.io.key
+
+> 配置之后浏览器会提示“不安全”,因为这个证书是自己生成的,不是权威机构颁发的,所以浏览器会提示不安全,但是不影响使用,也不影响加密效果。
\ No newline at end of file
diff --git "a/content/post/old/2023-08-05-\345\246\202\344\275\225\344\275\277\347\224\250vortex\345\256\211\350\243\2052077mod.md" "b/content/post/old/2023-08-05-\345\246\202\344\275\225\344\275\277\347\224\250vortex\345\256\211\350\243\2052077mod.md"
new file mode 100644
index 00000000..6a86e54e
--- /dev/null
+++ "b/content/post/old/2023-08-05-\345\246\202\344\275\225\344\275\277\347\224\250vortex\345\256\211\350\243\2052077mod.md"
@@ -0,0 +1,86 @@
++++
+title = "如何使用vortex安装2077mod"
+description = ""
+date = 2023-08-05T23:19:43+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "2077","game"
+]
+series = []
+images = []
++++
+
+## 如何使用vortex安装2077mod
+
+> [vortex](https://www.nexusmods.com) 是一个 mod 管理器,使用它可以方便你安装、卸载、管理mod。不用手动操作游戏文件夹。
+
+![Imgur](https://i.imgur.com/vb2tNKo.png)
+
+
+1. 下载 [vortex](https://www.nexusmods.com/site/mods/1 ) ,安装时选择游戏所在盘,如`D:\sofeware\vortex`,因为他需要和游戏在同一个盘符下才能建立硬链接。
+2. 安装 [2077插件 ](https://www.nexusmods.com/site/mods/196) (因为vortex原生不支持2077,所以需要这个插件)
+3. 设置2077mod缓存文件位置(setting-Mods-打开automatic开关)
+
+到此为止,vortex已经可以正常使用了
+
+## 安装一个mod
+
+安装mod有两种方式:
+1. 通过vortex的网页版点击下载,直接唤醒客户端,适合较小的包
+2. 通过vortex网页手动下载,最好挂个代理,适合较大的包
+
+3. 安装 [simplemenu](https://www.nexusmods.com/cyberpunk2077/mods/818)
+ 1. 根据提示,先安装依赖包 [Cyber Engine Tweaks](https://www.nexusmods.com/cyberpunk2077/mods/107)
+ 2. 然后安装[simplemenu](https://www.nexusmods.com/cyberpunk2077/mods/818)
+
+## 推荐的mod
+
+![Imgur](https://i.imgur.com/CwhXf67.png)
+
+### 作弊类
+必装依赖包 [Cyber Engine Tweaks](https://www.nexusmods.com/cyberpunk2077/mods/107)
+
+简单作弊器 [simplemenu](https://www.nexusmods.com/cyberpunk2077/mods/818)
+
+管理人物属性、搜索获取物品[Respector](https://www.nexusmods.com/cyberpunk2077/mods/1263)
+
+删除传送的加载动画,变成类似GTA的传送动画 [GTATRAVEL](https://www.nexusmods.com/cyberpunk2077/mods/2006)
+
+
+自由飞行 [freefly](https://www.nexusmods.com/cyberpunk2077/mods/780)
+
+随身衣柜 [Wardrobe Anywhere](https://www.nexusmods.com/cyberpunk2077/mods/5145)
+
+### 游戏提升类
+
+车辆操控提升 [Better Vehicle Handling](https://www.nexusmods.com/cyberpunk2077/mods/210)
+
+路上车辆AI优化 [Cyber Drift - Crowds and Traffic](https://www.nexusmods.com/cyberpunk2077/mods/3176)
+
+更好的天气 [Weather Probability Rebalance - Climate Change Edition](https://www.nexusmods.com/cyberpunk2077/mods/7007)
+
+### 界面类
+
+HUD 颜色更换 [Spicy HUDs](https://www.nexusmods.com/cyberpunk2077/mods/509)
+
+更少的glitch动画 [Fewer Annoying Glitch Effects](https://www.nexusmods.com/cyberpunk2077/mods/7875)
+
+删除进入游戏加载动画 [Load Begone](https://www.nexusmods.com/cyberpunk2077/mods/8144) (需要配合steam命令行参数使用)
+
+删除讨厌的绿色色调 [Vanilla Env Lighting - No More Green Tint](https://www.nexusmods.com/cyberpunk2077/mods/8745)
+
+### 皮肤类
+
+超棒4k 女V 模型,要安装多个包 [4k Complexion and Body for Female V](https://www.nexusmods.com/cyberpunk2077/mods/1873)
+
+更好看的皮肤反光 [Preem Skin](https://www.nexusmods.com/cyberpunk2077/mods/8157)
+
+更好看的头发材质 [Preem Hair](https://www.nexusmods.com/cyberpunk2077/mods/8223)
+
+拍照打光工具 [CharLi](https://www.nexusmods.com/cyberpunk2077/mods/8176)
\ No newline at end of file
diff --git "a/content/post/old/2023-08-06-win11\345\244\207\344\273\275\345\274\200\345\247\213\350\217\234\345\215\225\345\270\203\345\261\200.md" "b/content/post/old/2023-08-06-win11\345\244\207\344\273\275\345\274\200\345\247\213\350\217\234\345\215\225\345\270\203\345\261\200.md"
new file mode 100644
index 00000000..f635b0e0
--- /dev/null
+++ "b/content/post/old/2023-08-06-win11\345\244\207\344\273\275\345\274\200\345\247\213\350\217\234\345\215\225\345\270\203\345\261\200.md"
@@ -0,0 +1,88 @@
++++
+title = "win11 备份开始菜单布局"
+description = ""
+date = 2023-08-06T13:37:48+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "windows"
+]
+series = []
+images = []
++++
+
+> win11开始菜单有bug 我在删除图标的时候卡了bug,具体来说就是第一次删除没删掉,第二次删除这个图标,整个开始菜单都没了…… 图标布局都恢复默认了….
+
+tip: 用everything搜索 start2.bin,可以找到这个文件的位置。
+
+```
+C:\Users\kasus\AppData\Local\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState
+```
+
+这里可以找到 start2.bin 文件,这个文件存储了开始菜单的布局信息,经过我的尝试,这个二进制文件根本看不懂。
+
+可以通过备份这个文件来备份开始菜单布局。
+
+---
+
+如果想要恢复备份,就需要替换文件,然后重启explorer进程。
+
+在powershell中执行以下命令重启explorer:
+
+```ps1
+Stop-Process -Name explorer
+```
+
+## powershell脚本备份
+拜托gpt帮我写的备份脚本。
+
+backupStart2.ps1
+
+```ps1
+# 源文件路径
+$sourceFile = "C:\Users\kasus\AppData\Local\Packages\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\LocalState\start2.bin"
+# 目标文件夹路径
+$destinationFolder = "D:\AAA\scripts"
+# 获取当前日期和时间作为后缀
+$dateSuffix = Get-Date -Format "yyyyMMdd_HHmmss"
+# 构建新的文件名
+$newFileName = "start2.bin.$dateSuffix"
+# 构建目标文件路径
+$destinationFile = Join-Path -Path $destinationFolder -ChildPath $newFileName
+# 复制文件
+Copy-Item -Path $sourceFile -Destination $destinationFile
+
+```
+
+### 定时任务
+
+开启定时任务,自动执行备份操作,谁想手动备份呢?
+
+要在任务计划程序中运行一个 PowerShell 脚本(例如 "D:\AAA\scripts\backupStart2.ps1"),请按照以下步骤操作:
+
+---
+
+1. 打开 "任务计划程序"(在开始菜单中搜索)。
+2. "创建基本任务"。
+3. 点击 "浏览" 按钮,然后选择 "powershell.exe" 可执行文件的路径。通常情况下,它位于
+
+```
+C:\Windows\System32\WindowsPowerShell\v1.0\
+```
+
+4. 在 "添加参数(可选)" 字段中,输入以下内容:
+
+```
+-ExecutionPolicy Bypass -File "D:\AAA\scripts\backupStart2.ps1"
+```
+
+其中,"-ExecutionPolicy Bypass" 参数用于绕过执行策略,允许运行未签名的脚本。
+
+5. 选择触发时机、触发频率等。
+
+![Imgur](https://i.imgur.com/LNel5NV.png)
\ No newline at end of file
diff --git a/content/post/old/2023-09-19-zshrc_for_powershell.md b/content/post/old/2023-09-19-zshrc_for_powershell.md
new file mode 100644
index 00000000..c9060b77
--- /dev/null
+++ b/content/post/old/2023-09-19-zshrc_for_powershell.md
@@ -0,0 +1,46 @@
++++
+title = "powershell 设置别名 alias"
+description = ""
+date = 2023-09-19T09:32:55+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "pwsh"
+]
+series = []
+images = []
++++
+
+使用 zsh 之后,回到windows,我很怀念alias功能。 以及 zshrc 配置文件。
+
+但是 powershell 可以实现类似的功能:[参考](https://blog.csdn.net/lei_qi/article/details/106592404)
+
+---
+
+1. 打开管理员 powershell , 执行允许ps1脚本的命令:
+
+```
+Set-ExecutionPolicy RemoteSigned
+```
+
+2. 编辑配置文件(可以用任何自己喜欢的编辑器)
+
+```pwsh
+code $PROFILE
+```
+
+```powershell
+# 例如:
+# 快速移动到 hugo 工作目录:
+
+function hg { Set-Location -Path 'C:\Users\kasus\hugo-win' }
+
+# 执行多行命令
+
+function xxx { Set-Location -Path 'C:\github\xxx' ; git pull }
+```
\ No newline at end of file
diff --git a/content/post/old/2023-1-0xpython_beautiful_soup.md b/content/post/old/2023-1-0xpython_beautiful_soup.md
new file mode 100644
index 00000000..16d21f9b
--- /dev/null
+++ b/content/post/old/2023-1-0xpython_beautiful_soup.md
@@ -0,0 +1,23 @@
++++
+title = "python_beautiful_soup"
+description = ""
+date = 2023-03-20T15:50:22+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+还没写,先留着空位
+## 2023-03-20可恶啊,我又忘了
+好耶,留着留着,就忘了。。。
+现在不会了
+该死……
+
diff --git a/content/post/old/2023-10-07-dirsearch.md b/content/post/old/2023-10-07-dirsearch.md
new file mode 100644
index 00000000..cebd2559
--- /dev/null
+++ b/content/post/old/2023-10-07-dirsearch.md
@@ -0,0 +1,62 @@
++++
+title = "dirsearch"
+description = ""
+date = 2023-10-07T09:32:55+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "dirsearch"
+]
+series = []
+images = []
++++
+[maurosoria/dirsearch: Web path scanner (github.com)](https://github.com/maurosoria/dirsearch)
+
+
+扫描例句(win)
+```
+python dirsearch.py -u baidu.com -x400-500 -F --full-url
+python dirsearch.py -l urls.txt --headers-file headers.txt -x400-500 -F --full-url
+```
+
+扫描例句(kali)
+```
+dirsearch -u baidu.com -x400-500 -F --full-url
+dirsearch -l urls.txt --headers-file headers.txt -x400-500 -F --full-url
+```
+urls.txt 从burp中提取主要的url,headers.txt 从burp中拿登陆后的header
+
+urls.txt 和 headers.txt 要新建在原版 py 文件目录下,否则,dirsearch找不到。
+
+---
+
+--full-url:显示完整URL路径,包括协议和域名。
+
+-e 扫描后缀 如 `-e php,asp `
+
+-u 域名可以带不带 http:// 前缀都可
+
+---
+
+查找到dirsearch的位置
+```
+locate dirsearch.py
+/usr/lib/python3/dist-packages/dirsearch/dirsearch.py
+```
+
+你需要自行创建两个文件用来放置 url 和 headers
+```
+touch /usr/lib/python3/dist-packages/dirsearch/urls.txt
+touch /usr/lib/python3/dist-packages/dirsearch/headers.txt
+```
+
+字典文件(可以自己修改、添加):
+
+```
+/usr/lib/python3/dist-packages/dirsearch/db/dicc.txt
+```
diff --git a/content/post/old/2023-11-01-jupyternotebook.md b/content/post/old/2023-11-01-jupyternotebook.md
new file mode 100644
index 00000000..8bd9588b
--- /dev/null
+++ b/content/post/old/2023-11-01-jupyternotebook.md
@@ -0,0 +1,63 @@
++++
+title = "Jupyter notebook"
+description = ""
+date = 2023-11-01T13:40:05+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+
+安装 Jupyter Notebook 可以通过以下步骤完成:
+
+1. 确保你已经安装了 Python。
+2. 使用 pip 安装 Jupyter Notebook。
+
+```
+pip3 install jupyter
+```
+
+如果提示没有pip3:
+- 按下 Win + Pause/Break 键打开系统属性窗口,然后选择 "高级系统设置"
+- 增加一条类似 `C:\Users\kasus\AppData\Local\Programs\Python\Python310\Scripts` 的条目 这个目录里面有pip3
+- 确保重启
+
+安装完成后,可以运行以下命令来启动 Jupyter Notebook:
+
+```
+jupyter notebook
+```
+
+运行该命令后,Jupyter Notebook 服务器将在默认浏览器中打开,并显示 Jupyter Notebook 的界面。你可以在其中创建和运行 Python 代码的笔记本。
+
+## 操作
+- 运行当前单元格并将焦点移至下一个单元格:Shift + Enter 🌟
+- 运行当前单元格并在下方插入新单元格:Alt + Enter 🌟
+- 运行当前单元格并保持焦点在当前单元格:Ctrl + Enter 🌟
+- 把单元格移动到上方/下方: ctrl shift ⬆️
+
+- 将选定的单元格标记为 "Markdown" 模式:Esc + M 🌟
+- 将选定的单元格标记为 "Code" 模式:Esc + Y
+- 在选定的单元格上方插入新的单元格:Esc + A
+- 在选定的单元格下方插入新的单元格:Esc + B
+- 删除选定的单元格:Esc + D + D (按两次 D)
+- 将选定的单元格复制到上方:Esc + Shift + P
+- 将选定的单元格复制到下方:Esc + Shift + N
+- 合并选定的单元格:Shift + M 🌟
+- 切换选定单元格的折叠状态:Shift + O (按 O)
+- 将单元格切换为编辑模式:Enter
+- 退出单元格的编辑模式:Esc
+
+## 插件
+
+也推荐使用vscode插件来使用 jupyter
+
+https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter
diff --git a/content/post/old/2023-11-22-tkinter.md b/content/post/old/2023-11-22-tkinter.md
new file mode 100644
index 00000000..1b122861
--- /dev/null
+++ b/content/post/old/2023-11-22-tkinter.md
@@ -0,0 +1,291 @@
++++
+title = "tkinter"
+description = ""
+date = 2023-11-22T17:14:50+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+
+tkinter 是Python的一个默认GUI库,本教程从基础开始一直到做出一个好看的gui界面。
+我会根据教学内容把我所学到的一切整理在这里。
+
+[ The ultimate introduction to modern GUIs in Python [ with tkinter ] - YouTube](https://www.youtube.com/watch?v=mop6g-c5HEY)
+
+[Tkinter Hello, World! (pythontutorial.net)](https://www.pythontutorial.net/tkinter/tkinter-hello-world/)
+
+---
+
+## 入门例子
+
+示例代码包含以下几个方面:
+1. 使用的自带组件tkinter
+2. 设置窗体属性如大小标题
+3. 增加控件如label frame button entry
+4. pack 布局方式
+5. textvariable tk可绑定变量
+6. [ttkbootstrap 主题示例 ](https://ttkbootstrap.readthedocs.io/en/latest/themes/)
+
+程序的功能是:输入英里数,转换成公里数,显示在label上。
+
+
+![Imgur](https://i.imgur.com/dgF8oI1.png)
+
+```py
+import tkinter as tk
+# from tkinter import ttk
+import ttkbootstrap as ttk # 需要安装 pip install ttkbootstrap
+
+def convert():
+ mile_input = entry_int.get()
+ km_output = mile_input * 1.61
+ output_string.set(f'{km_output:.2f}') # f-string
+
+# 设置一些基础事项,实例、设置标题、设置大小
+window = ttk.Window (themename = 'darkly') # themes: darkly, flatly, journal, litera, lumen, lux, materia, minty, pulse, sandstone, simplex, sketchy, slate, solar, spacelab, superhero, united, yeti
+window.title('Demo')
+window.geometry('300x150') #width x height
+# 在Windows里面增加一个label
+# 设置label的母亲、文字内容和字体以及字体大小
+title_lable = ttk.Label(master=window,text='Mile to Kilometers',font='Calibri 26 bold')
+title_lable.pack() #pack 之后才能显示出来
+
+input_frame = ttk.Frame(master=window) # panel
+entry_int = tk.IntVar() # 变量绑定 int
+entry = ttk.Entry(master= input_frame, textvariable=entry_int) # textbox
+button = ttk.Button(master= input_frame , text='convert' , command=convert) # button , command: onclick
+entry.pack(side='left',padx=10) #side: left right top bottom , padx: padding x axis (left and right
+button.pack(side='left')
+input_frame.pack(pady=0) # pady: padding y axis
+
+# output
+output_string = tk.StringVar() # 变量绑定 string
+output_lable = ttk.Label(master=window,text='Output',font='Calibri 24',textvariable=output_string)
+output_lable.pack(pady=5)
+# run
+window.mainloop()
+```
+
+## 常用tk组件介绍
+- Text 大文本框
+- Label 标签
+- Button 按钮
+- Entry 小文本框
+
+![Imgur](https://i.imgur.com/7Vy6fVL.png)
+
+```py
+import tkinter as tk
+from tkinter import ttk
+
+def button_function():
+ print('btn pressed')
+
+window = tk.Tk()
+window.title('Window and Widgets') # 设置标题
+window.geometry('800x580')
+
+tk.Text(master=window).pack() # 文本框
+# ttk lable
+lable = ttk.Label(master=window,text='Hello World' ) # 标签
+lable.pack()
+# ttk entry
+entry = ttk.Entry(master=window) # 输入框
+entry.pack()
+# ttk button
+button = ttk.Button(master=window,text='Click Me',command= button_function) # 按钮
+button.pack()
+
+window.mainloop()
+```
+
+## 设置组件的内容(手动)
+
+getter and setter
+
+
+- entry.get()
+- entry['state'] = 'disabled'
+
+---
+
+- lable.config(text='aaa') 未来将会删除
+- lable.configure(text='aaa')
+- lable['text'] = 'aaa'
+
+---
+
+查看所有可用的config项:
+
+print(lable.configure())
+
+
+**程序的功能是**:在entry中输入内容,点击Click Me按钮后,显示在label上,并禁止entry输入。 点击reset按钮后,清空textbox,重新输入。
+
+![Imgur](https://i.imgur.com/PAmIsas.png)
+
+```py
+import tkinter as tk
+from tkinter import ttk
+
+def button_function():
+ lable.config(text=entry.get())
+ entry['state']='disabled'
+
+def reset_button_function():
+ entry['state']='enabled'
+ entry.delete(0,'end')
+
+window = tk.Tk()
+window.title('Getting and setting widgets') # 设置标题
+lable = ttk.Label(master=window,text='Hello World' ) # 标签
+lable.pack()
+entry = ttk.Entry(master=window) # 输入框
+entry.pack()
+button = ttk.Button(master=window,text='Click Me',command= button_function) # 按钮
+button.pack()
+
+reset_button = ttk.Button(master=window,text='Reset',command= reset_button_function ) # 按钮
+reset_button.pack()
+
+window.mainloop()
+```
+
+## 绑定变量 Tkiner Variable ⭐⭐⭐
+
+绑定可以 : 设置组件的内容(自动)
+
+
+绑定,是很重要的概念。
+
+```py
+string_var = tk.StringVar()
+string_var.set('type something')
+...
+
+lable = ttk.Label(master=window, textvariable=string_var) # textvariable / variable 取决于控件类型
+```
+
+下面的程序有两个entry一个label,输入框的值变化时,label的值也会变化,他们三个绑定了同一个变量。
+
+![Imgur](https://i.imgur.com/dgy0trR.png)
+
+```py
+import tkinter as tk
+from tkinter import ttk
+
+window = tk.Tk()
+window.title('Tkiner Variable') # 设置标题
+window.geometry('400x300')
+
+# tkinter variable
+string_var = tk.StringVar()
+string_var.set('test') # 设置默认值
+# alse have these types
+Int_var = tk.IntVar()
+Double_var = tk.DoubleVar()
+Boolean_var = tk.BooleanVar()
+
+
+lable = ttk.Label(master=window, textvariable=string_var) # 标签
+entry = ttk.Entry(master=window,textvariable=string_var) # 输入框
+lable.pack()
+entry.pack()
+
+entry2 = ttk.Entry(master=window,textvariable=string_var) # 输入框
+entry2.pack()
+
+
+window.mainloop()
+```
+
+# button类控件
+- button
+ - command 在每次点击时运行
+- checkbutton
+ - check box 通常用于多个选框都可以勾选 类似点菜
+ - command 在每次点击时运行
+ - 需要绑定 variable 到 tk.xxxVar() 上
+ - 可以设定的 onvalue 和 offvalue , 比如绑定tk.IntVar(),可以设定 onvalue=10, offvalue=0
+- radiobutton
+ - radiobutton 通常用于单选,类似性别选择
+ - 必须设定 value 属性,以区分所有的 radiobutton
+ - 同一组的 radio 需要绑定同一个 variable 上
+ - 选中的variable会被赋值到 variable 上
+
+示例程序:
+
+radioA\radioB 为一组,绑定radio_var,点击时候 print check_var 的值,并且取消勾选 checkbtn;
+checkbtn 绑定check_var, 勾选时候,print radio_var 的值
+
+![Imgur](https://i.imgur.com/xbc7vqU.png)
+
+```py
+import tkinter as tk
+from tkinter import ttk
+
+window = tk.Tk()
+window.title('Tkiner Variable') # 设置标题
+window.geometry('400x300')
+
+
+# test
+def radio_func():
+ print(check_var.get())
+ check_var.set(False)
+# data
+radio_str = tk.StringVar()
+check_var = tk.BooleanVar()
+# widgets
+radiobuttonA = ttk.Radiobutton(master=window,text='radio A',value='A',command=radio_func,variable=radio_str)
+radiobuttonB = ttk.Radiobutton(master=window,text='radio B',value='B',command=radio_func,variable=radio_str)
+Checkbutton_A = ttk.Checkbutton(master=window,text='A',variable=check_var,command=lambda:print(radio_str.get() ))
+# layout
+radiobuttonA.pack()
+radiobuttonB.pack()
+Checkbutton_A.pack()
+
+window.mainloop()
+```
+
+## button 执行 带参函数
+
+- 无参数函数
+ - command=myfunc
+- 有参数函数
+ - 传入 command=lambda: arg_func(your_arg)
+ - 不能传入 command= arg_func(your_arg) (会在开始时候执行一遍函数,然后点击按钮就无效了)
+
+
+```py
+import tkinter as tk
+from tkinter import ttk
+
+window = tk.Tk()
+window.title('Tkiner Variable') # 设置标题
+window.geometry('400x300')
+
+# test
+def arg_func(str):
+ print(str)
+# data
+entry_str = tk.StringVar(value='test')
+# widgets
+entry = ttk.Entry(master=window,textvariable=entry_str) # 输入框
+#button = ttk.Button(master=window,text='Click Me',command= arg_func(entry_str.get())) # 错误示例,会在开始时候执行一遍函数
+button = ttk.Button(master=window,text='Click Me',command= lambda: arg_func(entry_str.get())) # 正确示例1
+# layout
+entry.pack()
+button.pack()
+
+window.mainloop()
+```
\ No newline at end of file
diff --git a/content/post/old/2023-12-16-python json config.md b/content/post/old/2023-12-16-python json config.md
new file mode 100644
index 00000000..dbc36b57
--- /dev/null
+++ b/content/post/old/2023-12-16-python json config.md
@@ -0,0 +1,84 @@
++++
+title = "python json config"
+description = ""
+date = 2023-12-16T15:17:51+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "python","json"
+]
+series = []
+images = []
++++
+
+python 使用json存储自身配置的代码示例;
+包含配置缺少报错提示、初始化配置文件等功能,方便取用
+
+
+## 使用方法
+
+声明 `config_path` 作为json存放路径
+
+声明 `config_data` 作为全局变量(字典类型)
+
+代码中使用 `load_json_config()` 读取 config.json 的配置到内存
+
+> `load_json_config` 会调用 `try_create_config` 、 `check_config` , 功能包括把json读取到内存,如果没有配置文件则创建;如果读取到的 config 配置文件比 `config_data` 字典内容少会进行提示报错。
+
+使用 `config_data['xxx']` 访问即可
+
+## todo
+未完善保存相关功能,目前都是从外部加载配置文件,暂时没有保存需求!
+
+```python
+config_path = "assests\\config.json"
+config_data = {
+ "folder_root_path": "",
+ "open_floder_key": "enter",
+ "notifiction": "on",
+ "auto_hide": "on",
+ "playsound": "off",
+ "soundeffect": "effect2.wav",
+ "reload_key": "ctrl+f12",
+ "open_config_key": "ctrl+shift+f12",
+}
+
+def try_create_config():
+ '''尝试创建配置文件,仅在第一次运行时创建'''
+ try:
+ with open(config_path, encoding='utf-8') as file:
+ tmp = json.load(file)
+ except FileNotFoundError:
+ with open(config_path, "w", encoding='utf-8') as file:
+ json.dump(config_data, file, indent=4)
+ print("created config.json")
+
+def check_config():
+ '''检查配置文件'''
+ global config_data
+
+ with open(config_path, encoding='utf-8') as file:
+ json_config = json.load(file)
+ for k,v in config_data.items():
+ if k not in json_config:
+ print_red("Config Error",f"missing {k}")
+ print_red("example",f'"{k}": "{v}"')
+ print_red("try remove assests/config.json")
+ exit()
+
+
+def load_json_config():
+ '''加载配置文件'''
+ try_create_config()
+ global config_data
+ with open(config_path, encoding='utf-8') as file:
+ json_config = json.load(file)
+ check_config()
+ config_data.update(json_config) # 更新配置文件
+
+```
diff --git "a/content/post/old/2023-12-16-switch\347\233\227\347\211\210\346\270\270\346\210\217\345\256\211\350\243\205.md" "b/content/post/old/2023-12-16-switch\347\233\227\347\211\210\346\270\270\346\210\217\345\256\211\350\243\205.md"
new file mode 100644
index 00000000..7f371ec7
--- /dev/null
+++ "b/content/post/old/2023-12-16-switch\347\233\227\347\211\210\346\270\270\346\210\217\345\256\211\350\243\205.md"
@@ -0,0 +1,70 @@
++++
+title = "switch 盗版游戏安装"
+description = ""
+date = 2023-12-16T15:17:51+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "switch","crack"
+]
+series = []
+images = []
++++
+
+
+## wifi 装游戏
+Awoo: https://github.com/Huntereb/Awoo-Installer
+
+ns-usbloader: https://github.com/developersu/ns-usbloader/releases
+
+- 选择 net - 选择游戏 - 游戏机打开awoo , 然后上传。
+
+速度大概10m/s 平均
+
+## USB 装游戏
+电脑上: https://github.com/developersu/ns-usbloader/releases
+- 打开 ns-usbloader-设置-安装电脑usb驱动
+- 通过 netch 代理 javaw.exe
+- 安装驱动
+
+速度稳定 50m/s 平均
+
+## 游戏下载
+网站:
+https://www.gamer520.com/switchyouxi
+
+微信 **电玩联盟** 公众号 ,发名字就给百度云链接:
+
+
+
+
+---
+
+## XCI整合
+[整合版XCI游戏 整合教程 (qq.com)](https://mp.weixin.qq.com/s/a_GhDEFOm_aUtlMAmxTILw)
+
+- 运行 NSCB.bat
+- 选择: 2 多文件处理 , 选择文件夹,把游戏+dlc都整合成一个包。
+
+## 清理垃圾
+卸载游戏使用DBI
+浏览-选择-删除!
+
+
+
+---
+
+
+
+## moonlightNX
+https://github.com/rock88/moonlight-nx
+- 这里下载nro包 (release界面)
+- 在大气层根目录的switch目录下创建名为 Moonlight 的文件夹 ,放入 moonlight.nro
+- 桌面上随便开个游戏,按住R按键 ,进入hbmenu,用最右边的 BI 安装nro文件。
+
+但是我无法连接上。。。我的电脑。
diff --git "a/content/post/old/2023-12-16-\344\270\255\345\233\275\347\247\273\345\212\250\345\256\275\345\270\246-\350\247\243\351\231\220\351\200\237\350\204\232\346\234\254.md" "b/content/post/old/2023-12-16-\344\270\255\345\233\275\347\247\273\345\212\250\345\256\275\345\270\246-\350\247\243\351\231\220\351\200\237\350\204\232\346\234\254.md"
new file mode 100644
index 00000000..166d06c3
--- /dev/null
+++ "b/content/post/old/2023-12-16-\344\270\255\345\233\275\347\247\273\345\212\250\345\256\275\345\270\246-\350\247\243\351\231\220\351\200\237\350\204\232\346\234\254.md"
@@ -0,0 +1,45 @@
++++
+title = "中国移动宽带-解限速脚本"
+description = ""
+date = 2023-12-16T15:17:51+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "andorid","阅读"
+]
+series = []
+images = []
++++
+
+
+这个脚本可以模拟测速过程,挂在服务器上每小时执行,就可以解除移动定期降速了。
+
+
+
+模拟使用speedtest测速来让移动解除限速
+
+```sh
+#!/bin/bash
+
+# 定义文件下载链接
+download_link="https://speedtest2.niutk.com.prod.hosts.ooklaserver.net:8080/download?size=25000000"
+
+# 定义保存文件的路径
+save_path="/dev/null"
+
+# 使用curl命令下载文件
+curl -o "$save_path" "$download_link"
+
+```
+
+
+```sh
+crontab -e
+# 每小时执行一次
+0 * * * * cd /media/kasusa/hd4 && ./cleanDS.sh
+```
diff --git "a/content/post/old/2023-12-16-\345\274\200\346\272\220\351\230\205\350\257\273.md" "b/content/post/old/2023-12-16-\345\274\200\346\272\220\351\230\205\350\257\273.md"
new file mode 100644
index 00000000..d756ac86
--- /dev/null
+++ "b/content/post/old/2023-12-16-\345\274\200\346\272\220\351\230\205\350\257\273.md"
@@ -0,0 +1,39 @@
++++
+title = "开源阅读"
+description = ""
+date = 2023-12-16T15:17:51+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "andorid","阅读"
+]
+series = []
+images = []
++++
+
+开源阅读 是一款开源小说阅读器
+
+
+![pic](https://pic.fxxz.com/up/2021-7/202172941518932.jpg)
+
+开源阅读
+
+## github项目
+https://github.com/gedoor/legado
+
+## 下载
+[Releases · gedoor/legado (github.com)](https://github.com/gedoor/legado/releases)
+
+## 书源
+https://www.fxxz.com/gonglue/95397.html
+
+这里提供一个 2023-12 的书源
+
+```
+https://jihulab.com/aoaostar/legado/-/raw/release/cache/1b8256c78b385543b5e8aa6a0d7693c76f8e60d4.json
+```
diff --git a/content/post/old/2024-01-02-pandas.md b/content/post/old/2024-01-02-pandas.md
new file mode 100644
index 00000000..4edf8b00
--- /dev/null
+++ b/content/post/old/2024-01-02-pandas.md
@@ -0,0 +1,248 @@
++++
+title = "Pandas"
+description = "Pandas-python 数据处理库"
+date = 2024-01-02T09:56:40+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "python"
+]
+series = []
+images = []
++++
+本文介绍pandas基础知识
+提供代码示例
+
+
+https://www.youtube.com/watch?v=zmdjNSmRXF4&list=PL-osiE80TeTsWmV9i9c58mdDCSskIFdDS&index=2
+
+## 安装
+```
+pip install pandas
+```
+
+建议学习过程中使用 [[jupyter]] 能可视化看到数据
+
+教程使用数据: [Stack Overflow Insights - Developer Hiring, Marketing, and User Research](https://insights.stackoverflow.com/survey) (2019)
+
+
+```python
+# 导入pandas
+import pandas as pd
+# 读取数据
+df=pd.read_csv('data/survey_results_public.csv')
+
+```
+
+excel
+```py
+# 读取excel(已知sheetname时)
+df = pd.read_excel('ance.xlsx', sheet_name = '')
+
+# 读取Excel文件
+excel_file = pd.ExcelFile('ance.xlsx')
+# 获取所有工作表名称
+sheet_names = excel_file.sheet_names
+```
+
+## 查看基本信息、预览表
+```py
+df # 查看数据(jupyter) (展示20行)
+df.head() # 查看数据(默认前5行)
+df.head(10) # 查看数据(前10行)
+df.tail() # 查看数据(默认后5行)
+```
+
+```py
+pd.set_option('display.max_columns',85) # 设置最大列数85
+pd.set_option('display.max_rows',85) # 默认前5后5 设置最大行数85
+```
+
+```py
+df.shape # 查看数据大小 (88883, 85) 88883行 85列
+```
+
+```py
+df.info() # 查看数据信息 列名、非空数量、数据类型,object 一般是字符串
+df.columns # 查看列名 :Index(['first', 'last', 'email'], dtype='object')
+```
+
+ # Column Non-Null Count Dtype
+ --- ------ -------------- -----
+ 0 Respondent 88883 non-null int64
+ 1 MainBranch 88331 non-null object
+ 2 Hobbyist 88883 non-null object
+
+
+## 数据结构
+
+基本上,为了简单理解,可以把它当成字典 key 就是 lie头(headers)
+
+```py
+import pandas as pd
+person = {
+ "first" : ["fred","rose","rose"],
+ "last" : ["white","jojo","jojo"],
+ "email" : ["fred@gmail.com" , "rose@gmail.com","rose2@gmail.com"]
+}
+df = pd.DataFrame(person) # 通过字典创建数据结构
+```
+
+## 获取列
+
+```py
+df['email'] # 获取列
+df.email # 获取列 (不推荐,如果有如count类型的列名会执行相关函数)
+```
+
+ 0 fred@gmail.com
+ 1 rose@gmail.com
+ Name: email, dtype: object
+
+
+```py
+df[['email','last']] # 获取多列(注意两个中括号)
+```
+
+注意反回的是series类型 pandas 专用的数据结构
+```py
+type(df['email']) # pandas.core.series.Series
+```
+
+## 获取行
+
+iloc : interger location
+
+```py
+df.iloc[0] # 获取第一行
+df.iloc[[0,1]] # 获取第一行和第二行
+df.iloc[[0,1],2] # 获取第一行和第二行成一个表,在纵向获取第二列 (因为interger所以不能用名字)
+```
+
+loc : location , 在未建立索引的情况下,和iloc一样
+
+```py
+df.loc[[0,1],'email'] # 获取第一行和第二行成一个表,在纵向获取email列
+df.loc[[0,1],['email','last']] # 获取第一行和第二行成一个表,在纵向获取email和last列
+```
+
+loc- slicing
+```py
+df.loc[0:2,'MainBranch':'YearsCode'] # 获取第一行到第三行,MainBranch到YearsCode列(包括)
+```
+
+## 设置索引
+
+默认索引是数字(不在任何的列里),可以设置为其他列
+
+索引可以不唯一,比如设置人命为索引,loc的时候就会返回多行
+
+```py
+df.set_index('email') # 设置email为索引(返回设置的新表,不改变原表)
+df.set_index('email',inplace=True ) # 设置email为索引 (改变原表, email列消失)
+df.reset_index() # 重置索引
+```
+
+```py
+df.loc['fred@gmail.com','last'] # 获取索引为fred@gmail的last(姓名)
+```
+
+## filt
+
+ first last email
+ 0 fred white fred@gmail.com
+ 1 rose jojo rose@gmail.com
+ 2 rose jojo rose2@gmail.com
+
+```python
+filt = df['first'] == 'rose' # 返回mask
+df[filt] # 返回表格
+df.loc[filt] # 返回表格
+df.loc[filt,'email'] # 返回表格中的email列(loc专有高级写法)
+
+df[df['first'] == 'rose'] # 组合写法(返回表格)(不推荐)
+```
+
+mask :
+
+ 0 False
+ 1 True
+ 2 True
+ Name: first, dtype: bool
+
+`df[filt]` :
+
+ first last email
+ 1 rose jojo rose@gmail.com
+ 2 rose jojo rose2@gmail.com
+
+## and filt
+
+and 使用 & , or 使用 |
+```py
+filt = (df['first'] == 'rose') & (df['last'] == 'jojo') # 返回mask
+df.loc[filt] # 返回表格
+```
+
+## 取反 filt
+使用 ~
+```py
+filt = (df['first'] == 'rose') & (df['last'] == 'jojo') # 返回mask
+df.loc[~filt] # 返回表格(姓名不是 rose jojo 的行)
+```
+
+## isin filt
+
+```py
+countries = ['United States','Canada','India']
+filt = df['Country'].isin(countries)
+df.loc[filt,'Country']
+```
+
+## str filt
+https://zhuanlan.zhihu.com/p/30894133
+
+```py
+filt = df['LanguageWorkedWith'].str.contains('Python',na=False) # 字符串包含Python, na=False 不包含空值
+df.loc[filt,'LanguageWorkedWith']
+```
+
+ 0 HTML/CSS;Java;JavaScript;Python
+ 1 C++;HTML/CSS;Python
+ 3 C;C++;C#;Python;SQL
+
+非空字符串
+```
+filt = df['测试URL'].str.len()>0
+```
+
+空内容判断
+
+```py
+df.loc[filt].empty
+```
+
+
+## 合并df
+
+合并的前提:列名相同、列名数量相同
+
+```py
+concat_df = pd.concat([flited_df1,flited_df2])
+concat_df
+```
+
+建立空的dataframe 基底(循环concat可能用到)
+```py
+concat_df = pd.DataFrame() # 建立空的dataframe 基底
+```
+
+## 保存df
+```py
+ df.to_excel(excel_writer='xxx.xlsx', sheet_name='sheet1')
+```
\ No newline at end of file
diff --git a/content/post/old/2024-01-17-tmux.md b/content/post/old/2024-01-17-tmux.md
new file mode 100644
index 00000000..e00bab51
--- /dev/null
+++ b/content/post/old/2024-01-17-tmux.md
@@ -0,0 +1,76 @@
++++
+title = "Tmux"
+description = ""
+date = 2024-01-17T16:08:37+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "linux"
+]
+series = []
+image = "tmux.jpg"
+
++++
+
+> tmux 特点是可以有多个窗口(分割视图),非常方便
+
+![Imgur](https://i.imgur.com/BthfDxp.png)
+
+https://tmuxcheatsheet.com/
+
+## 这里是基础用法
+```
+tmux
+ctrl-B + D 离开(不退出)
+ctrl - D 离开(退出)
+
+tmux a 连接上次用的tmux
+tmux ls 查看所有 tmux session
+tmux a -t0 连接session0 (t = target)
+tmux kill-session -t0 关闭session0
+
+tmux new -s bob 创建一个名字叫bob的session
+```
+
+## 分割方法
+```
+ctrl-B + % 水平分割(%看着就代表一上一下)
+ctrl-B + " 垂直分割(双引号就像是两块屏幕)
+ctrl-B + 方向键 移动光标
+ctrl-B + o 移动光标到下一个窗口
+ctrl-B + q 显示窗口编号
+ctrl-B + q + 数字 跳转到指定窗口
+ctrl-D 关闭当前窗口
+```
+
+## 创建新window ( 下面绿色的部分是window指示)
+
+```
+ctrl-B + C 创建
+ctrl-B + , 重命名当前window (会自动用你的上一个命令命名,可以改)
+ctrl-B + N 跳到下一个
+ctrl-B + L 跳到最近用过的
+ctrl-B + W 窗口管理器!
+```
+
+## 管理配置文件
+
+```
+vim ~/.tmux.conf
+
+setw -g mode-keys vi
+set mouse on
+```
+
+## 终极命令:
+
+```
+ctrl-B + ?
+ctrl-B + /
+```
+
diff --git a/content/post/old/2024-01-17-wireguard.md b/content/post/old/2024-01-17-wireguard.md
new file mode 100644
index 00000000..643aeaef
--- /dev/null
+++ b/content/post/old/2024-01-17-wireguard.md
@@ -0,0 +1,100 @@
++++
+title = "Wireguard-管线卫士"
+description = ""
+date = 2024-01-17T15:46:23+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "linux"
+]
+series = []
+image = "wireguard.png"
+
++++
+
+
+
+## 简易安装:
+https://github.com/xubiaolin/wireguard-onekey
+使用run.sh之前可以按照需要 设置一下脚本里面的 WG_ALLOWED_IPS=10.0.8.0/24 ,改成 0.0.0.0/0 可以全流量走vpn
+
+```
+git clone https://github.com/xubiaolin/wireguard-onekey.git
+
+bash run.sh
+```
+
+![Imgur](https://i.imgur.com/raBKUVP.png)
+
+## wg-easy
+
+上面的onekey脚本实际上是用了另一个项目:[wg-easy](https://github.com/wg-easy/wg-easy)
+
+wg-easy 有一些奇怪的问题
+1. 使用vps时,联入wg vpn之后就不能上网了,详见这个 [issue](https://github.com/wg-easy/wg-easy/issues/562)。
+2. 默认镜像的位置是: ghcr.io/wg-easy/wg-easy , ghcr.io访问极慢(即使挂了代理),所以我用在线docker机器人重新拉取了一个放到了这里: togettoyou/my-wg-easy:nightly
+
+```sh
+docker run -d \
+ --name=wg-easy \
+ -e WG_HOST= \
+ -e PASSWORD= \
+ -v ~/.wg-easy:/etc/wireguard \
+ -e WG_DEVICE=eth0 \
+ -p :51820/udp \
+ -p :51821/tcp \
+ --cap-add=NET_ADMIN \
+ --cap-add=SYS_MODULE \
+ --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
+ --sysctl="net.ipv4.ip_forward=1" \
+ --restart unless-stopped \
+ togettoyou/my-wg-easy:nightly
+```
+访问这个链接来使用你的vpn管理台。
+```
+http://:
+```
+
+## 客户端下载
+安装好了之后我们就要使用它,首先我们需要下载客户端,这里提供了一些下载链接:
+
+win
+
+https://download.wireguard.com/windows-client/
+
+mac(外区商店)
+
+https://apps.apple.com/us/app/wireguard/
+
+linux
+
+```shell
+sudo apt install wireguard-tools
+sudo apt install resolvconf
+
+wg-quick up ./wg.conf
+```
+
+
+## 配置文件
+wg 的客户端配置中有一个非常方便的东西,AllowedIPs
+
+AllowedIPs 可以用作一个路由表。可以限定访问的范围
+
+```sh
+# 全局vpn
+0.0.0.0/0
+# 网段 192.168.1.x 和 10.0.1.x 走vpn
+192.168.1.0/24,10.0.1.0/24
+```
+
+
+```
+[Peer]
+AllowedIPs = 192.168.124.0/24
+```
diff --git "a/content/post/old/2024-02-24-burp\344\270\213\350\275\275\357\274\210\347\240\264\350\247\243\347\211\210\357\274\211.md" "b/content/post/old/2024-02-24-burp\344\270\213\350\275\275\357\274\210\347\240\264\350\247\243\347\211\210\357\274\211.md"
new file mode 100644
index 00000000..468bbf3a
--- /dev/null
+++ "b/content/post/old/2024-02-24-burp\344\270\213\350\275\275\357\274\210\347\240\264\350\247\243\347\211\210\357\274\211.md"
@@ -0,0 +1,27 @@
++++
+title = "Burp下载(破解版)"
+description = ""
+date = 2024-02-24T16:34:43+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "network security"
+]
+image = "burp.png"
++++
+ 再也不用去奇怪的网站和博客找破解版burp了。
+
+https://github.com/h3110w0r1d-y/BurpLoaderKeygen
+
+https://t.me/BurpLoaderKeygen
+
+这里下载最新的破解机(官方github指向)
+
+破解机提供官方链接(最上面一行字),从官方下载到最新的 burp.jar。
+
+然后你就可以永远获取最新的破解版了。
diff --git "a/content/post/old/2024-02-24-vscode\351\205\215\345\220\210wsl\347\274\226\347\250\213.md" "b/content/post/old/2024-02-24-vscode\351\205\215\345\220\210wsl\347\274\226\347\250\213.md"
new file mode 100644
index 00000000..2c9f0d19
--- /dev/null
+++ "b/content/post/old/2024-02-24-vscode\351\205\215\345\220\210wsl\347\274\226\347\250\213.md"
@@ -0,0 +1,37 @@
++++
+title = "vscode配合wsl编程"
+description = ""
+date = 2024-02-24T16:34:43+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "network security"
+]
+series = []
+image = "vscode.jpg"
+
++++
+
+使用wsl,用windows环境GUI + linux 高效地编程。
+
+
+https://code.visualstudio.com/docs/remote/wsl
+用wsl和windows vscode 进行开发 上面是官方教程
+
+准备:
+1. 安装wsl
+2. 安装vscode 插件 : Remote Development
+
+使用(多种方式):
+ 1. 在wsl ubuntu 中输入 `code .`
+ 2. 在 code中打开 `F1` - WSL: xxx distro ...
+ 3. 在windows用命令行启动code , 附带下列参数
+
+```
+code --remote wsl+Ubuntu /root/codes
+```
diff --git a/content/post/old/2burponmac_cracked.md b/content/post/old/2burponmac_cracked.md
new file mode 100644
index 00000000..ada0d71a
--- /dev/null
+++ b/content/post/old/2burponmac_cracked.md
@@ -0,0 +1,51 @@
++++
+title = "在macos上面安装burpsuite(crackverison)"
+description = "111"
+date = 2022-12-19T12:18:50+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "burp"
+]
+series = []
+images = []
++++
+
+> 下载:[java-jdk](https://www.oracle.com/java/technologies/downloads/) | [破解版 burpsuite](https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=burpsuite%20%E7%A0%B4%E8%A7%A3%E7%89%88%202023&oq=burpsuite%25E7%25A0%25B4%25E8%25A7%25A3%25E7%2589%2588%2520202%2526lt%253B&rsv_pq=95921bbe00081999&rsv_t=ef27GuFUOmyrbfwFDhdlPCtYjqy2aAuuaAKNGIB9hiok3BfZaI3I2lHSKPQ&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_btype=t&inputT=8287&rsv_sug3=18&rsv_sug1=16&rsv_sug7=100&rsv_sug2=0&prefixsug=burpsuite%2520%25E7%25A0%25B4%25E8%25A7%25A3%25E7%2589%2588%2520202%2526lt%253B&rsp=6&rsv_sug4=8309)
+
+## 正常顺序
+1. 打开:burploader.jar
+2. 通过: burploader 打开burp pro
+3. 输入 license 然后手动粘贴到 burploader,burploader 解密后给你返回一个 respond 字符串,粘贴进入,破解成功。
+4. 后续每次从 loader 中打开文件即可。
+
+## 实际情况
+1. 打开:burploader.jar
+2. 通过burploader 打开burp pro
+3. 打开失败,报错
+
+
+## 解决办法
+主要原因是burp不是很兼容java 17+,所以破解的步骤就是:
+
+1. 打开:burploader.jar
+2. 通过手工输入命令,打开 burp pro,并指定 burploader 作为-noverify参数
+```
+java -jar --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.desktop/javax.swing=ALL-UNNAMED loader.jar
+```
+1. 正常流程激活(因为我激活过了不能再来一遍所以没有截图了)
+2. 制作一个脚本(.bat / .sh)用于方便后面启动burp
+
+# mac快速启动脚本
+在zshrc中增加一条快速启动burp的命令/alias,(此时,你的burp应该已经完成了激活操作。
+其中分为两步骤:
+1. cd 到 burpsuite 目录。
+2. 执行命令,用loader 挡住 agent , 启动 burp.jar , 加入了一些java17的 flag。
+```sh
+alias bp="cd /Users/kasusa/BurpSuite_pro_v2023.3&&java -noverify -javaagent:burp-loader-keygen-2_1_06.jar -jar --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.desktop/javax.swing=ALL-UNNAMED burpsuite_pro_v2023.3.jar"
+```
\ No newline at end of file
diff --git "a/content/post/old/2sed-linux\345\221\275\344\273\244.md" "b/content/post/old/2sed-linux\345\221\275\344\273\244.md"
new file mode 100644
index 00000000..34ad522a
--- /dev/null
+++ "b/content/post/old/2sed-linux\345\221\275\344\273\244.md"
@@ -0,0 +1,45 @@
++++
+title = "sed Linux命令"
+description = ""
+date = 2022-12-06T20:14:59+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "linux"
+]
+series = []
+images = []
++++
+
+
+参考链接:
+https://www.youtube.com/watch?v=nXLnx8ncZyE
+
+# sed命令
+sed据我了解是linux中用于替换的一个命令。
+
+# 使用方法
+
+仅替换第一次出现的:
+```
+# 把a.txt中的 abc 换成 def 并打印出来。
+sed 's/abc/def/' a.txt
+
+# 把a.txt中的 abc 换成 def ,替换到源文件内
+sed -i 's/abc/def/' a.txt
+
+# 使用/之外的分隔符也可以搜索,只要你把分隔符放在s后面,比如这里用英文点号
+sed -i 's.abc.def.' a.txt
+
+```
+
+替换所有出现的:
+```
+# 把a.txt中的 abc 换成 def 并打印出来。
+sed 's/abc/def/g' a.txt
+```
\ No newline at end of file
diff --git a/content/post/old/3burpsuite_inturder.md b/content/post/old/3burpsuite_inturder.md
new file mode 100644
index 00000000..ab4c6f06
--- /dev/null
+++ b/content/post/old/3burpsuite_inturder.md
@@ -0,0 +1,79 @@
++++
+title = "burpsuite - 3 - inturder"
+description = ""
+date = 2022-12-21T16:00:59+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "burp"
+]
+series = []
+images = []
++++
+
+# inturder
+https://portswigger.net/burp/documentation/desktop/tools/intruder
+
+burpsuite的inturder用于自动化攻击web应用,可以更换http请求中指定位置的payload,不停的发送请求。并收集返回的结果。
+inturder 的天生特性可用于以下攻击范围:
+- Fuzz 类型的input漏洞
+- 进行暴力破解攻击
+- 枚举攻击
+- 快速收集有用的信息列表
+> Fuzz 本意是 “羽毛、细小的毛发、使模糊、变得模糊”,在渗透测试中指的是一种基于黑盒或灰盒的测试技术,通过自动化生成并执行大量的随机测试用例来发现产品或协议的未知漏洞
+
+# tutorial
+基础教程会教会你怎么用intruder进行简单的,单个位置的payload攻击。
+首先打开实验环境:
+https://portswigger.net/web-security/authentication/password-based/lab-username-enumeration-via-different-responses
+## http请求导入intruder
+然后我们进入lab,点击登陆账户,模拟不知道账户和密码的情况:
+![](https://i.imgur.com/7IKv51M.png)
+
+然后我们找到刚才这条登陆的http请求,发送到intruder:
+![](https://i.imgur.com/g80pcXZ.png)
+
+来到intruder,他会自动标记几个可能是注入点的地方,我们先clear掉。
+![](https://i.imgur.com/ACPEE8o.png)
+
+然后手动选择用户名,添加一个新点位
+![](https://i.imgur.com/XZf8hyA.png)
+
+然后选择模式,我们选择sniper(狙击手)模式。其他模式啥意思我也看不太懂,我感觉就是不同种类的排列组合方法吧。
+![](https://i.imgur.com/DVUAsF5.png)
+
+## 破解用户名字段
+然后我们到第二个页面,需要手动添加payload list,也就是字典,burp不提供字典。
+教程可以用这个字典: https://portswigger.net/web-security/authentication/auth-lab-usernames
+复制之后点击paste把我们的字典粘贴进来,然后点击右上角按钮,开始攻击
+![](https://i.imgur.com/Aet6Ggx.png)
+
+攻击过程中可以点击每一行查看发送的http请求,就是把你的标记位置*username*,变成了payload中的字符串。 通过Length排序,我们可以发现有一个返回值的长度和其他的不同,大家都是2984,他是2986。
+![](https://i.imgur.com/xzRmd06.png)
+
+点开respond发现,这里写着:“密码错误”,其他的请求都写着“用户名错误”,所以我们就找到一个可以用的用户名。用户名:alabama
+![](https://i.imgur.com/UBPAiHn.png)
+
+## 破解密码字段
+我们通过上面的方法获取到了一个用户名,接下来就需要破解密码字段,首先回到intruder,修改http请求,把用户名换成刚才得到的值,然后开始破解密码位置:
+![](https://i.imgur.com/vVXeyCb.png)
+
+破解密码位置可以用这个字典,字典由burp教学网站提供: https://portswigger.net/web-security/authentication/auth-lab-passwords
+
+破解过程很奇怪,有三种长度的返回值,2986 3073 170 ,2986和3073都是错误的,然后我就找到了密码:biteme
+![](https://i.imgur.com/7rj0j1C.png)
+
+最后就登陆成功,解决了这个lab。
+![](https://i.imgur.com/bJHjLGR.png)
+
+# 结尾
+虽然破解成功了,不过很明显重要的是字典。首先用户名的字典,然后就是密码字典,我觉得现实中的网站密码绝对不会设置的这么简单。跑字典估计还没跑100个,我的ip就要被封禁了。
+
+但是这个课程的重点是教你如何使用inturder工具,通过课程我觉得还是看的很清楚的。后续使用的话主要需要关注这几点:
+- 自己搞一份好用的字典
+- 后续可以研究一下不同的模式都是啥样的有什么特点,现在只用了sniper模式。
\ No newline at end of file
diff --git "a/content/post/old/3burpsuite\345\205\245\351\227\250.md" "b/content/post/old/3burpsuite\345\205\245\351\227\250.md"
new file mode 100644
index 00000000..d16d82d0
--- /dev/null
+++ "b/content/post/old/3burpsuite\345\205\245\351\227\250.md"
@@ -0,0 +1,85 @@
++++
+title = "burpsuite(入门教学课程)"
+description = ""
+date = 2022-12-20T16:14:59+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "linux"
+]
+series = []
+images = []
++++
+
+# burpsuite(入门教学课程)
+- Intercept and modify HTTP traffic with **Burp Proxy**.
+- Set the target scope to focus your work on interesting content.
+- Probe for vulnerabilities by reissuing requests with **Burp Repeater**.
+- Run automated vulnerability scans and generate reports with **Burp Scanner**.
+
+# intercept (拦截)流量
+ https://portswigger.net/burp/documentation/desktop/getting-started/intercepting-http-traffic
+ ![](https://i.imgur.com/CJyXrzi.png)
+ 拦截请求(intercept)之后,可以慢慢查看、修改请求,弄好了之后再点forward。
+ 如果你需要好多步骤之后才开始用burp,那应该先把intercept关闭,即便是这时http请求也会被记录。
+
+# hack 例子商店
+
+https://portswigger.net/burp/documentation/desktop/getting-started/modifying-http-requests
+
+商店地址:`https://portswigger.net/web-security/logic-flaws/examples/lab-logic-flaws-excessive-trust-in-client-side-controls`
+你需要先注册一个portswigger账号,因为这个东西是人家要给你生成一个实例给你黑,所以你得注册账号让他知道你是真人......
+
+登录用户名和密码:**Username:** `wiener` **Password:** `peter`
+然后你会发现你的账号里面有100\$可以用来买东西。
+
+开启intercept,购买一个这个1000\$ + 的jacket,然后你会收到一个POST /cart 请求。
+
+在请求的最下面有一个`productId=1&redir=PRODUCT&quantity=1&price=133700`,最后面是以美分为单位的价格,修改这个数字,改成1,然后我们就能有极低的价格(1美分)把这个商品加入购物车。
+在购物车结算(**Place order**)之后,这个lab就完成了。同时你也学会了intercept, review, manipulate HTTP traffic using Burp Proxy。真棒。
+
+# target scope
+
+修改目标范围,有时候网页会加载很多外链或者你不想要了解的目标,这时候需要自定义目标范围。
+https://portswigger.net/burp/documentation/desktop/getting-started/setting-target-scope
+打开这个实验室:
+https://portswigger.net/web-security/information-disclosure/exploiting/lab-infoleak-in-error-messages
+
+打开http请求,倒序,然后选择你想要的url,右键加入scope
+![](https://i.imgur.com/SlZKo9T.png)
+加入了scope的东西可以在这里修改:
+![](https://i.imgur.com/ipVDjO8.png)
+scope里面有东西了之后,可以在http请求里面使用filter,只查看scope内的相关url记录
+![](https://i.imgur.com/DNLxl8o.png)
+
+# Burp Repeater
+首先打开上一课的假的商店,设置好scope,然后我们会看到
+每次打开商品详情,会有这样的请求(Get /product?productId=xx):
+我们右键 - 发送到repeater
+![](https://i.imgur.com/BeFkPse.png)
+
+然后在repeater里面发送和查看respond,就是repeater的主要功能
+![](https://i.imgur.com/21dBy9v.png)
+我们修改一下productid为100试试:结果返回了notfound
+然后我们发送了好几次之后,可以通过这个按钮查看历史记录。
+![](https://i.imgur.com/6IAhcLJ.png)
+然后我们把这个productid改成一个非数字,看看会有什么反应:
+![](https://i.imgur.com/ctXIM6g.png)
+结果返回了一堆错误信息,而且是没有做删减的,我们可以看出来Apache的版本号,这对于渗透来说是有意义的,尤其是这个版本的apache有漏洞可以用。
+这里最后我们点击页面上的submit,把这个版本号填进去,这个lab就完成了 耶~
+
+# burp scan
+
+burp同样耶提供扫描的功能,他的扫描远离如下:
+1. 爬网页crawl(通过模拟用户操作的方式,比如点击链接等)
+2. 审计危险项audit(漏洞扫描)
+注:burpscan只有专业版能用;非授权扫描别人的网站应用是违法的各位注意。
+我们这里扫描他提供的例子站点:https://ginandjuice.shop/
+![](https://i.imgur.com/0xuOa32.png)
+scan的时候可以在target里面看看网站目录啥的
+![](https://i.imgur.com/v3STT83.png)
diff --git a/content/post/old/4clash-minxin-howtouse.md b/content/post/old/4clash-minxin-howtouse.md
new file mode 100644
index 00000000..62e44c86
--- /dev/null
+++ b/content/post/old/4clash-minxin-howtouse.md
@@ -0,0 +1,160 @@
++++
+title = "clash 中的 minxin 使用教程"
+description = "简单说,mixin是一种混合配置的方式,你可以把自己的配置注入到“配置文件”中 "
+date = 2022-12-26T22:57:21+08:00
+featured = false
+comment = true
+toc = true
+categories = [
+ ""
+]
+tags = [
+ "clash"
+]
+series = []
+images = []
++++
+
+# 什么是mixin
+mixin就是这个按钮,简单说,mixin是一种混合配置的方式,你可以把自己的配置注入到“配置文件”中,这样就可以在一定程度上的自定义配置了,比如加入一些你自己的规则之类的。
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20221226230540.png)
+为了理解mixin,我们需要先了解什么是“配置文件”,clash的配置文件一般可以通过下面的方法查看
+一般来说,从机场下载过来的配置中包含了规则相关内容,你可以通过下面的方式检视机场提供给你的配置。
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20221226230817.png)
+除了检查配置之外,你还可以做出修改,diff功能:比如原来“漏网之鱼”都是走proxy的,我把这条标记为删除之后,clash在每次下载这个配置之后,都会删除这条。这样我所有的“漏网之鱼”都会走direct了。
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20221226230927.png)
+
+# 使用mixin
+我这里举例我自己的使用办法,我比较喜欢让网络默认走直连,如果直连不上的网站再走代理。所以,我在上面的步骤中先删除了“漏网之鱼”全部走proxy的配置。
+
+这个取决于个人习惯,如果你日常上的网站都是没有办法直连的那么我推荐你直接默认代理,然后加一些直连规则
+
+mixin的设置位置在这里。
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20221226231515.png)
+他会默认使用自带的编辑器打开,我不喜欢,可以用外置vscode打开,使用外置编辑器的功能在这里开启:
+![](https://raw.githubusercontent.com/cornradio/imgs/main/20221226231635.png)
+
+配置文件的默认格式我建议直接删除,因为我到现在也看不出来它到底是做什么的…… 你可以参考我现在的配置来建立自己的mixin配置。mixin是有JavaScript和yaml两种版本的,我使用的是yaml,yaml要注意缩进,我是用它是因为比js要简单一点,尤其是你有vscode的时候对齐很简单。
+
+简单解释两条:
+
+```yaml
+- 'DOMAIN-SUFFIX,redditstatic.com,PROXY'
+ 全域名匹配模式,域名,走proxy
+- 'DOMAIN-SUFFIX,edu.tw,DIRECT'
+ 域名后缀匹配模式,域名,走direct
+```
+
+# 关于国内是否能够访问
+我这里推荐使用站长工具:多地ping,可以看到国内的ping值,如果ping值很高,那么就说明国内访问不了,就得加进代理。
+https://ping.chinaz.com/baidu.com
+
+# 通过chrome网络工具查看需要添加规则的域名
+一般来说,很大型的网站往往都有好多不一样的子域名,有的是站点内容,有的是图片存储。对于这种我们需要把所有的子域名都加进去,这个时候就需要用到chrome的网络工具了。
+
+如果你想要添加一个网站的规则,可以通过chrome的网络工具来查看这个网站的所有建立的连接,有连接不上的域名加入mixin配置中即可。
+
+
+# 我的例子
+```yaml
+rules:
+ # direct:
+ - 'DOMAIN,sub.godetia.xyz,DIRECT'
+ - 'DOMAIN,vpsgongyi.com,DIRECT'
+ - 'DOMAIN-SUFFIX,edu.tw,DIRECT'
+ #steam direct
+ - 'DOMAIN,steampowered.com,DIRECT'
+ - 'DOMAIN,steamcommunity.com,DIRECT'
+ #derpi
+ - 'DOMAIN,derpibooru.org,PROXY'
+ - 'DOMAIN,derpicdn.net,DIRECT'
+ # proxy:
+ - 'DOMAIN,docs.cfw.lbyczf.com,PROXY'
+ - 'DOMAIN,patreon.com,PROXY'
+ - 'DOMAIN,outlook.live.com,PROXY'
+ - 'DOMAIN,pony.town,PROXY'
+ - 'DOMAIN,gamepad-tester.com,PROXY'
+ - 'DOMAIN,stackoverflow.com,PROXY'
+ - 'DOMAIN,services.gradle.org,PROXY'
+ - 'DOMAIN,openuserjs.org,PROXY'
+ - 'DOMAIN,stackoverflow.com,PROXY'
+ - 'DOMAIN,gamepadviewer.com,PROXY'
+ - 'DOMAIN,go.microsoft.com,PROXY'
+ - 'DOMAIN,nginx.org,PROXY'
+ - 'DOMAIN,marketplace.visualstudio.com,PROXY'
+ - 'DOMAIN,musicnotes.com,PROXY'
+ - 'DOMAIN,fimfiction.net,PROXY'
+ - 'DOMAIN,softonic.com,PROXY'
+ - 'DOMAIN,zh.wikipedia.org,PROXY'
+ - 'DOMAIN,nordvpn.com,PROXY'
+ - 'DOMAIN,w3schools.com,PROXY'
+ - 'DOMAIN,cdn.jsdelivr.net,PROXY'
+ - 'DOMAIN,www.patreon.com,PROXY'
+ - 'DOMAIN,getrolan.com,PROXY'
+ - 'DOMAIN,cdnjs.cloudflare.com,PROXY'
+ - 'DOMAIN,cdn.jsdelivr.net,PROXY'
+ - 'DOMAIN,fonts.googleapis.com,PROXY'
+ - 'DOMAIN,hugothemesfree.com,PROXY'
+ - 'DOMAIN,ssltd.xyz,PROXY'
+ - 'DOMAIN,forums.terraria.org,PROXY'
+ - 'DOMAIN,c.biancheng.net,PROXY'
+ - 'DOMAIN,alcorart.com,PROXY'
+ - 'DOMAIN,uso.kkx.one,PROXY'
+ - 'DOMAIN,grabient.com,PROXY'
+ - 'DOMAIN,dollarexcel.com,PROXY'
+ - 'DOMAIN,vscode.dev,PROXY'
+ - 'DOMAIN,userstyles.world,PROXY'
+ - 'DOMAIN,npmjs.com,PROXY'
+ - 'DOMAIN,hath.network,PROXY'
+ - 'DOMAIN,www.emojiall.com,PROXY'
+ - 'DOMAIN,go.ezodn.com,PROXY'
+ - 'DOMAIN,cd.connatix.com,PROXY'
+ - 'DOMAIN,itch.io,PROXY'
+ - 'DOMAIN,coub.com,PROXY'
+ - 'DOMAIN,chaturbate.com,PROXY'
+ - 'DOMAIN,highwebmedia.com,PROXY'
+ - 'DOMAIN,diygod.me,PROXY'
+ - 'DOMAIN,*.fandom.com,PROXY'
+ - 'DOMAIN,www.dogfight360.com,PROXY'
+ - 'DOMAIN,www.screentogif.com,PROXY'
+ - 'DOMAIN,www.techworld-with-nana.com,PROXY'
+ # 开卡车游戏\openai
+ - 'DOMAIN,slowroads.io,PROXY'
+ - 'DOMAIN-SUFFIX,openai.com,PROXY'
+ - 'DOMAIN-SUFFIX,sentry.io,PROXY'
+ # reddit
+ - 'DOMAIN-SUFFIX,redditstatic.com,PROXY'
+ - 'DOMAIN-SUFFIX,redd.it,PROXY'
+ # from rocket
+ - 'DOMAIN-SUFFIX,nhentai.to,PROXY'
+ - 'DOMAIN-SUFFIX,chaturbate.com,PROXY'
+ - 'DOMAIN-SUFFIX,xvideos.com,PROXY'
+ - 'DOMAIN-SUFFIX,derpibooru.org,PROXY'
+ - 'DOMAIN-SUFFIX,pornhub.com,PROXY'
+ - 'DOMAIN-SUFFIX,sex.com,PROXY'
+ - 'DOMAIN-SUFFIX,www.sex.com,PROXY'
+ - 'DOMAIN-SUFFIX,equestria.social,PROXY'
+ - 'DOMAIN-SUFFIX,openai.com,PROXY'
+ - 'DOMAIN-SUFFIX,redditmedia.com,PROXY'
+ - 'DOMAIN-SUFFIX,chat.openai.com,PROXY'
+ - 'DOMAIN-SUFFIX,redd.it,PROXY'
+ - 'DOMAIN-SUFFIX,reddit.com,PROXY'
+ - 'DOMAIN-SUFFIX,netlify.app,PROXY'
+ - 'DOMAIN-SUFFIX,patreon.com,PROXY'
+ - 'DOMAIN-SUFFIX,sickipedia.net,PROXY'
+ - 'DOMAIN-SUFFIX,naver.com,PROXY'
+ - 'DOMAIN-SUFFIX,pstatic.net,PROXY'
+ - 'DOMAIN-SUFFIX,tenable.com,PROXY'
+ - 'DOMAIN-SUFFIX,e-hentai.org,PROXY'
+ - 'DOMAIN-SUFFIX,v2ex.com,PROXY'
+ - 'DOMAIN,www.ihezu.cn,PROXY'
+ - 'DOMAIN-SUFFIX,www.ihezu.cn,PROXY'
+ - 'DOMAIN-SUFFIX,mixkit.co,PROXY'
+ - 'DOMAIN-SUFFIX,tunemymusic.com,PROXY'
+ - 'DOMAIN-SUFFIX,soundcloud.com,PROXY'
+ - 'DOMAIN-SUFFIX,*.github.io,PROXY'
+ - 'DOMAIN-SUFFIX,*.github.com,PROXY'
+ - 'DOMAIN-SUFFIX,netflix.com,PROXY'
+ - 'DOMAIN-SUFFIX,nflximg.net,PROXY'
+
+```
\ No newline at end of file
diff --git a/content/post/old/CollionsDictForMac.md b/content/post/old/CollionsDictForMac.md
new file mode 100644
index 00000000..510d016a
--- /dev/null
+++ b/content/post/old/CollionsDictForMac.md
@@ -0,0 +1,87 @@
++++
+title = "柯林斯词典 On MAC"
+description = ""
+date = 2022-07-27T20:00:00+08:00
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
+
++++
+> 链接: https://pan.baidu.com/s/1MAu0cTODwGCIXydUK9zt5Q?pwd=t8q4 提取码: t8q4
+>
+> 也许存在会导致spotlight不能用的问题,可以尝试使用文中提到的下载链接,那个版本好像不会导致spotlight问题。
+# mac词典
+首先我可能需要简单介绍一下mac系统的大杀器:原生词典!
+图标是这样的:
+
+![image](https://tva2.sinaimg.cn/large/0083vuQJly1h4ltozpkm1j30me0ak3zv.jpg)
+
+你还需要开启这个功能(三指触摸或者重按触控板查询)
+
+这个功能可以直接打开terminal中的链接、查询生词。
+
+![image](https://tvax1.sinaimg.cn/large/0083vuQJly1h4ltsusagwj31140tcqdx.jpg)
+
+使用体验差不多是这样:
+
+![image](https://tva3.sinaimg.cn/large/0083vuQJly1h4ltv0rmmlj31r819ek7j.jpg)
+
+# 增加字典
+
+打开词典应用,然后通过快捷键 `command + ,` 开启偏好设置:
+
+![image](https://tvax4.sinaimg.cn/large/0083vuQJly1h4ltwqsauoj31ke14mdv1.jpg)
+
+在这里你可以选择一些Apple提供的词典,比较推荐把列表底部的New Oxford、Thesaurus等都选择上。
+
+但是有时候会遇到这种问题:**词典不说人话**
+
+![image](https://tva3.sinaimg.cn/large/0083vuQJly1h4lu0kugy2j319s0uo0wy.jpg)
+
+我在这里推荐用柯林斯词典的扩充包,我觉得这个词典说话很人性,很容易理解,比如下面就是通过Collins字典的解释,有例句,并且说人话!
+
+![image](https://tva1.sinaimg.cn/large/0083vuQJly1h4lu26ad5tj31640iogsx.jpg)
+
+# 安装Collions
+
+不过这个字典Apple不提供安装,网上的教程多是一些语言专业人士弄的教程,还要自己转换词典,我也不需要那么多词典,我只要我的**柯林斯**!于是我在互联网上面找到了这个!(选择mac版然后立即下载,下载后是一个**压缩包**。
+
+[柯林斯词典mac版](https://www.pc6.com/mac/146122.html)
+
+![image](https://tvax1.sinaimg.cn/large/0083vuQJly1h4lu4k7ftjj314w0bymzv.jpg)
+
+下载完毕后,首先打开词典-文件-打开词典文件夹
+
+![image](https://tvax3.sinaimg.cn/large/0083vuQJly1h4lu66fjyrj30ky0b4diz.jpg)
+
+然后把整个压缩包解压后丢进去
+
+![image](https://tvax1.sinaimg.cn/large/0083vuQJly1h4lu72bsz8j31f40psn3e.jpg)
+
+最后在词典中勾选上新出现的柯林斯!(勾选前你可能想要先看一下下一章节)
+
+# 更改字典的内置样式和字典名称
+
+> 你可以下载我现成的打包,下载位置在文章的顶部
+
+虽然你通过上面的步骤已经可以用Collins了但是他默认的样式真的很丑。
+
+首先字典名称很长,在小号查词窗口上面看着很占地方,然后就是字典的上古配色让人感觉非常难受,不过好在可以修改。
+
+在我们刚刚解压出来的文件夹中有这两个文件
+
+- plist中可以修改柯林斯字典的名称,比如我把`Bundle display name`改成`Collins`就不会显得太长了
+- 在css中我吧所有的`background-color`都改成了没有,这样就没有丑陋色块了!
+
+![image](https://tva2.sinaimg.cn/large/0083vuQJly1h4lubdq72pj30bq07idgp.jpg)
+
+![image](https://tva4.sinaimg.cn/large/0083vuQJly1h4lufesr1bj318g15odt0.jpg)
+
diff --git "a/content/post/old/Docx\347\232\204\346\220\234\347\264\242\345\256\236\347\216\260.md" "b/content/post/old/Docx\347\232\204\346\220\234\347\264\242\345\256\236\347\216\260.md"
new file mode 100644
index 00000000..aae04b00
--- /dev/null
+++ "b/content/post/old/Docx\347\232\204\346\220\234\347\264\242\345\256\236\347\216\260.md"
@@ -0,0 +1,233 @@
++++
+title = "Docx的搜索实现"
+description = ""
+date = 2022-01-07T22:19:49+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "c#","docx"
+]
+series = []
+images = []
+
++++
+
+我做了一个c#的docx函数库。
+
+python操作word实在是太垃了,尤其是涉及到多表、页眉页脚,甚至有时候好好的段落硬是搜不到。所以我转向了对于word操作支持更好的c#。
+
+说是讲实现,实际上只讲了使用。毕竟实现挺复杂的也不好讲,不如感兴趣的自己看源码吧。我这里直接讲讲怎么用我这个函数就好了。
+
+github resourcehere: [kasusa/Docx_Search](https://github.com/kasusa/Docx_Search)
+
+---
+
+## 简介
+
+本库主要适用于docx文件的修改、段落搜索、表格搜索等,填补了官方未提供的“搜索”功能的空白。
+
+功能主要包括:
+
+- word中所有图片提取为bitmap
+- 搜索段落
+- 搜索表格
+- 删除段落
+- 获取单元格(cell)的内容
+- 批量替换
+- 保存到桌面 out文件夹
+
+## 依赖
+
+本库是基于开源*非商用的docx库编写的。引用如下两个库,可以在这里下载:[xceedsoftware/DocX](https://github.com/xceedsoftware/DocX),这个项目提供了一些非常实用的例子,建议新手先看他们的例子来学习c#操作word的逻辑。
+
+```
+using Xceed.Document.NET;
+using Xceed.Words.NET;
+```
+
+## 创建对象
+
+我把官方的document对象又封装了一遍,这样使用函数的时候更加直观。
+
+```cs
+myutil tempo;//我的word对象
+//docx文件的路径
+string tempo_path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @$"\Sample\方案\方案A.docx";
+if (System.IO.Directory.Exists(tempo_path))
+{
+ //初始化对象
+ tempo = new myutil(a);
+}
+```
+
+## 搜索段落
+
+搜索段落如同word中一样,使用string作为关键字进行搜索,实现下来整体速度还不错。
+
+有的时候一篇word中搜索一个关键词可能有好几个结果,这种时候返回list的就派上用场了。
+
+有的时候可能要操作的段落不好定位,但是可以确定他在某个标题的下面,index搜索就派上用场了,返回的index+1差不多就是需要的段落位置了。
+
+注意:xceed.docx的实现比较完善,可以搜索到目录、表格中的段落,所以有时候搜索错了可能是搜索到目录里面了……
+
+我写了几种类型的搜索函数:
+
+```cs
+Find_Paragraph_for_p(string v) //搜索后返回paragraph
+Find_Paragraph_for_plist(string v) //搜索后返回paragraph列表
+Find_Paragraph_for_text(string v) //搜索后返回string(段落的文字内容)
+Find_Paragraph_for_i(string v) //搜索后返回段落的index
+Find_Paragraph_for_ilist(string v) //搜索后返回段落的index list
+```
+
+举一个实际的例子:
+
+```cs
+//搜索“本报告记录编号:”,返回段落的text
+tmpstr = doc.Find_Paragraph_for_text("本报告记录编号:");
+//获取到:本报告记录编号:P2021XXXXX-GB01。
+//处理切分一下字符串,获取到我需要的部分
+tmpstr = myutil.get_string_after(tmpstr, "本报告记录编号:", "P2021XXXXX".Length);//结果:P2021XXXXX
+```
+
+再举一个例子:
+
+```cs
+//搜索总体评价(一级标题),获取其后面段落的内容
+int i = doc.Find_Paragraph_for_ilist("总体评价")[0] + 1;
+a = doc.document.Paragraphs[i].Text;
+```
+
+搜索的时候如果得到的结果不是很正常,就要看看word中是不是又多个能搜到的位置了。
+
+## 搜索表格
+
+搜索表格是一个我自创的功能,他是利用表头(首行)的文字内容对整个word中的所有表标题进行检索,如果某一个表格的第一行和给的参数相同,就认为是查找到了这张表。
+
+经过我的实际测试,速度还算可以。
+
+```cs
+//寻找表头文字为“序号 机房名称 物理位置 重要程度”的第一张表
+//注意这里我没有删除空格和tab,这是为了从word中复制过来方便,实际在函数中会把空格、tab字符都删除后进行对比
+var table1 = doc.findTableList("序号 机房名称 物理位置 重要程度")[0];
+```
+
+下面是我实现的一个表格复制函数。从word1中把t1复制到t2,可以选择是否包含表头。
+
+```cs
+#region 表格复制函数
+/// table1 表头
+/// table1 所在index
+/// table2 表头
+/// table 2 所在index
+void CopyTable(string t1head, string t2head, int i1 = 0, int i2 = 0)
+{
+ bool toremove = false;
+ var table1 = doc.findTableList(t1head)[i1];
+ ConsoleWriter.WriteColoredText("table 报告中 ↑", ConsoleColor.Green);
+ var table2 = tempo.findTableList(t2head)[i2];
+ ConsoleWriter.WriteColoredText("table 模板中 ↑", ConsoleColor.Green);
+ //如果t1比t2更宽,增加一列临时列
+ if (table1.ColumnCount > table2.ColumnCount)
+ {
+ table2.InsertColumn();
+ toremove = true;
+ }
+ //如果t1比t2更窄,直接给t2瘦身
+ else if (table1.ColumnCount < table2.ColumnCount)
+ {
+ table2.RemoveColumn(table2.ColumnCount-1);
+ }
+ //删除所有空的内容行
+ while (table2.RowCount > 1)
+ {
+ table2.RemoveRow(table2.RowCount - 1);
+ }
+ //从内容行数开始复制
+ for (int i = 1; i < table1.RowCount; i++)
+ {
+ Xceed.Document.NET.Row row = table1.Rows[i];
+
+ table2.InsertRow(row);
+ }
+ //删除多复制过来的列
+ if (toremove)
+ {
+ table2.RemoveColumn(table2.ColumnCount - 1);
+ }
+ ConsoleWriter.WriteColoredText("复制表完毕;", ConsoleColor.Yellow);
+
+}
+
+///
+/// 复制表t1到表t2(包含表头)
+///
+/// table1 表头
+/// table1 所在位数
+/// table2 表头
+/// table 2 所在位数
+void CopyTable_withHead(string t1head, string t2head, int i1 = 0, int i2 = 0)
+{
+ bool toremove = false;
+ var table1 = doc.findTableList(t1head)[i1];
+ ConsoleWriter.WriteColoredText("table 报告中 ↑", ConsoleColor.Green);
+ var table2 = tempo.findTableList(t2head)[i2];
+ ConsoleWriter.WriteColoredText("table 模板中 ↑", ConsoleColor.Green);
+ //如果t1比t2更宽,增加一列临时列
+ if (table1.ColumnCount > table2.ColumnCount)
+ {
+ table2.InsertColumn();
+ toremove = true;
+ }
+ //如果t1比t2更窄,直接给t2瘦身
+ else if (table1.ColumnCount < table2.ColumnCount)
+ {
+ table2.RemoveColumn(table2.ColumnCount - 1);
+ }
+ //删除所有空的内容行
+ while (table2.RowCount > 1)
+ {
+ table2.RemoveRow(table2.RowCount - 1);
+ }
+ //从内容行数开始复制
+ for (int i = 0; i < table1.RowCount; i++)
+ {
+ Xceed.Document.NET.Row row = table1.Rows[i];
+
+ table2.InsertRow(row);
+ }
+ //删除多复制过来的列
+ if (toremove)
+ {
+ table2.RemoveColumn(table2.ColumnCount - 1);
+ }
+ //删除顶部的原始行(表头总是有问题服了)
+ table2.RemoveRow(0);
+ ConsoleWriter.WriteColoredText("复制表完毕;", ConsoleColor.Yellow);
+
+}
+
+#endregion
+```
+
+## 文字批量替换
+
+文字批量替换是我参考官方文档的例子写出来的,因为功能很常用所以把他包含到了库中。
+
+```csharp
+//向字典里面添加【被替换str】、【替换成str】
+doc._replacePatterns.Add("P2021xxxxx", "P202100001");
+doc._replacePatterns.Add("AAAAA", "可口可乐公司");
+
+doc.ReplaceTextWithText_all_noBracket();//自动搜索文档中所有在字典里面的内容并替换
+```
+
+---
+
+明天过生日啦~
diff --git "a/content/post/old/Docx\347\233\270\345\205\263\347\232\204\346\212\200\346\234\257\345\210\206\344\272\253.md" "b/content/post/old/Docx\347\233\270\345\205\263\347\232\204\346\212\200\346\234\257\345\210\206\344\272\253.md"
new file mode 100644
index 00000000..ea92a708
--- /dev/null
+++ "b/content/post/old/Docx\347\233\270\345\205\263\347\232\204\346\212\200\346\234\257\345\210\206\344\272\253.md"
@@ -0,0 +1,389 @@
++++
+
+title = "word小工具开发"
+description = ""
+date = 2022-03-31T15:44:16+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "c#","word","开发"
+]
+series = []
+images = []
+
++++
+
+> 本期是发到公众号上的技术分享,分享的内容就是之前我的Docx相关东东,但是本篇除了介绍代码方便、会更加全面的讲解程序搭建的思路、以及myutil(我写的关于Docx的库)的使用。
+
+# word小工具开发
+
+## 前情提要
+
+自从去年9月份至今,我已经做过很多的小工具了,从最开始的完全不涉及文档操作,到丰富的docx查询编辑,积累了不少的经验,如果你也有一些点子、想开发一些小程序简化自己的工作(特别是和word操作相关的),那么本文会对你有些许帮助!
+
+## 信心
+
+首先我们不要对开发这件事情抱有很大的抵触心理,不要认为这是一件很难的事情。
+
+如果是一个学习过C语言课程的人,那么他上手会是很简单的。
+
+如果是一个学过桌面程序开发的人,那么他应该可以秒上手!
+
+本文主要使用的编程语言是C#,相对于python他有如下优点:
+
+1. 拖拽式的界面设计非常简便
+2. 少量信息的存储甚至不需要学习操作文件
+3. C#操作Docx的库相对于python来说更加好用,且有丰富的官方例子(python-docx库会存在有无法读取到某些表或者段落、无法正常修改页眉内容等问题)
+
+一般来说在思路清晰清晰的,根据功能复制程度、实现难度区别,开发时间应该是 1天~2天,相对于后续他为你提供的便利来说,真的是“磨刀不误砍柴工”。
+
+## 主要原子功能
+
+- 多个文件的选择和排除
+- word文件的读取
+- word文件的段落内容搜索
+- word文件的表格内容搜索
+- word内容的批量替换
+- 少量数据的存储
+- 字符串操作
+
+## 例子“生成《出报告申请》”介绍
+
+> 首先我会讲解一下这个程序的使用方法,通过这个真实的例子来分解程序的制作过程和开发思路
+
+**使用方法:**
+
+1. 报告拖放到textbox内(自动获取路径)
+2. 通过自动模式/手动模式进行出报告申请的生成
+3. 手动输入项目经理、成员
+4. 检查输出是否有误 —— 完成
+
+![image](https://tva2.sinaimg.cn/large/006rgJELly1h0rqww221gj30aw07q75f.jpg)
+
+如上图所示,本程序有两种信息输入方式
+
+- 从报告中读取
+- 手工录入
+
+![image](https://tva1.sinaimg.cn/large/006rgJELly1h0rqvro6gfj30dg0bwabq.jpg)
+
+上图则是从报告中提取到的数据展示,展示后还需要手动输入“我方人员”,因为这些内容无法从源文件中读取到。
+
+最后生成的成品文件则会保存到桌面指定的文件夹中(由于有敏感信息不做展示)。
+
+## 界面设计
+
+![image](https://tvax4.sinaimg.cn/large/006rgJELly1h0rr4lb1msj30hq0hkjz6.jpg)
+
+对于不同功能的应用,要活用`radiobutton`、`listbox`等控件简化开发流程和用户的操作门槛,虽然界面可能看起来有些许“过时”,但是诸如`treeview`、`checkbox`、`radiobutton`、`listbox`等都是微软默认提供且非常强大且易用的控件。
+
+
+
+同时在界面展示也要做的合理,如锚点的设置、按钮的摆放等
+
+- 对于有大量内容的中心控件(如上图中的文件选取栏),推荐设置就是上下左右都配置锚点,这样用户在使用的时候可以通过手工把窗口拉大的方式来让选取栏变大,从而方便操作;
+
+![image](https://tvax2.sinaimg.cn/large/006rgJELly1h0rr8bg656j30cb0420te.jpg)
+
+- 对于底部的按钮则应该选择向下锚点,否则用户将窗体放大的时候就会变成这个样子
+
+![image](https://tvax2.sinaimg.cn/large/006rgJELly1h0rrdstb3aj30ox0lfwhj.jpg)
+
+
+
+## 程序思路
+
+一个程序的开发可以简单的分成这三个步骤:
+
+1. 需求的分析和程序开发可行性判断
+2. 程序开发
+3. 进行一些测试确保程序的可用性和稳定性
+
+### 需求的分析和程序开发可行性判断
+
+首先想让机器帮自己做某件麻烦事、或者是某些事情让机器做更好更快,这些想到的电子就是所谓的需求了。
+
+如果产生了一个点子,作为程序的开发人员首先就要大致的思考一下怎么样把这个点子变成现实——用什么方式、用什么现在自己会的技术来做这件事。
+
+从上面这个小程序的角度来看,脑内出现的过程是:
+
+```
+从报告中提取出信息 → 把信息存储到字典中 → 将字典中的对应字符串替换到新文件中 → 完成!
+```
+
+作为个人开发者,如果某些功能要实现可能需要耗费非常多的时间、精力,或者根本想不到实现的办法,那么可以认为开发可行性是不佳的,可以考虑放弃这个点子。
+
+### 程序开发
+
+1. 明确思路,制定操作LIST如:xxx → xxx (较小的项目可以略过这步)
+2. 通过搜索、表格定位等方式用程序获取所需数据
+3. 根据需要替换的位置制作模板
+4. 逐一实现
+5. 通过实际使用等方式进行测试
+
+写一个大号的程序经常会有无从下手的感觉,所以第一个任务是把任务分成最小的“分子”。
+
+如下图是另一个程序的操作LIST,它确实很有用,可以清晰的看到是否有遗漏,以及完成了哪些部分,可以对自己的进度有一个大概的掌握,后期还可以用于程序的功能描述。
+
+这里使用的是markdown语法,对于每一个操作,如果实现了就在左边打一个x,如果没有则是空白的。
+
+![image](https://tva1.sinaimg.cn/large/006rgJELly1h0s4rja7inj310a0nuaqq.jpg)
+
+### 语言和调用库文件
+
+读取文件方面,我采用了Docx开源库,可以在[xceedsoftware/DocX:(github.com)](https://github.com/xceedsoftware/DocX)上下载。他速度很快,仅支持C#语言,同时官方提供了详细的文档,可以在[/Xceed.Words.NET.Examples (github.com)](https://github.com/xceedsoftware/DocX/tree/master/Xceed.Words.NET.Examples/Samples)下载实验。
+
+在[ kasusa/archiver (github.com)](https://github.com/kasusa/archiver/blob/master/archiver/myutil.cs)有我编写一个实用库,注释较全,本文中会大量使用库中实现的函数。
+
+至于支持python的docx库,我使用过他们一段时间,提供的支持不好,如页眉页脚无法轻易修改、部分存在的段落无法读取、多个相连的表格无法读取到后面的表格等问题,如果有人想要用python开发一个操作word的程序可以适度参考和避坑。
+
+### 文件读入、结构理解
+
+文件读入是指把整个docx文件读到内存中,变成一个可以操作的对象:
+
+```csharp
+//使用工具类“myuitl”一句话读取文件
+//path为docx文件的目录
+doc = new myutil(path);
+```
+
+
+```cs
+public myutil(string str_path)
+{
+ …
+ var document = DocX.Load(path);//读取document
+ this.document = document;//document本体获取
+ this.tables = document.Tables;//主要元素之一:表格
+ this.Paragraphs = document.Paragraphs;//主要元素之一:段落
+ …
+}
+```
+
+一个word文件被读取之后,主要可以操作的部分分为三块:
+
+- 段落(paragraph)
+
+ - 段落在文档中是以类似链表的方式存储。
+
+ - 获取的结果是`paragraph`对象,它存储段落内容字符串、段落的样式(如字体、对其格式、字号等)。
+
+ - ```csharp
+ //获取段落的文字内容
+ string a = document.Paragraphs[0].Text;
+ //调整段落为两端对齐
+ document.Paragraphs[0].Alignment = Alignment.both;
+ //调整颜色
+ document.Paragraphs[0].Color(Color.Red);
+ ```
+
+- 表格(tables)
+
+ - 表格在文档中是以类似链表的方式存储。
+
+ - 表格的访问按照行、列进行,如果要访问指定表格,需要知道表格的索引、单元格相对于表格所在的行、列。
+
+ - 每个单元格中可以包含多个段落,对于单元格的内容提取其中包含的段落内容。
+
+ - ```csharp
+ //文章中 第一个表格 第一行 第二个单元格(第二列)的内容
+ document.Tables[0].Rows[0].Cells[1].Paragraphs;
+ //获取总列数
+ document.Tables[0].ColumnCount;
+ //还有更多如多个单元格融合、增加行/列等
+ ```
+
+- 图片(images)
+
+ - 图片分为Pictures、Images
+ - Images是真正的图片,如果你用zip打开word文件,可以发现存在一个文件夹放置所有图片的源文件
+ - Pictures是图片在word文档中的一种“引用”,他引用了Images中的图片,并显示在word文档的指定位置上
+ - ![image](https://tvax4.sinaimg.cn/large/006rgJELly1h0sv8sgajgj30le0ca43b.jpg)
+
+### 段落搜索
+
+段落的搜索是很必要的,我们毕竟不能直接根据段落的序号来获取数据,因为很多时候中间的段落数量是不确定的,所以绝对索引有很大的概率拿到错误的段落。
+
+搜索可以:
+
+- 直接搜索段落必然包含的内容来找到段落
+- 搜索段落附近的章节标题,通过段落相对序号来获取附近位置的段落
+- 对于会有多个搜索结果的,返回list,或者指定要求获得第几个搜索结果
+
+```csharp
+//列举一些实搜索现的例子
+public string Find_Paragraph_for_text(string v,int count = 1)
+public List Find_Paragraph_for_plist( string v)
+public List Find_Paragraph_for_ilist( string v)
+
+//用搜索的方式获取段落
+ tmpstr = doc.Find_Paragraph_for_text("本报告记录编号:");
+//用搜索的方式获取段落,附加找到的个数,下方例子为第二个
+tmpstr = doc.Find_Paragraph_for_text("记录编号:",2);
+```
+
+```cs
+foreach (var p in document.Paragraphs)
+{
+ if (p.Text.Contains(v))
+ {
+ //Console.WriteLine("【找到:】" + p.Text + Environment.NewLine);
+ return p;
+ }
+}
+return null;
+```
+
+### 表格搜索
+
+![image](https://tvax3.sinaimg.cn/large/006rgJELly1h0sy8718i9j30ux07rq4w.jpg)
+
+![image](https://tva4.sinaimg.cn/large/006rgJELly1h0syiq0z24j30lc02oglw.jpg)
+
+表格搜索功能是独创的,原理如下:
+
+将表格第一行的内容字符串化,如“被测对象”、“序号机房名称物理位置重要程度备注”。
+
+```csharp
+//搜索表头为“被测对象”
+var table = findTableList("被测对象")[0];
+//提供表格、行索引(row)、行内的单元格索引(cell),获取指定单元格内容
+string text = table_Get_cell_text(table, 0, 1);
+```
+
+表格搜索的实现如下
+
+```csharp
+public List findTableList(string v1)
+{
+ v1 = v1.Replace(" ", "").Replace("\t", "");
+ List tlist = new List();
+ //Console.WriteLine("开始寻找表头是 :"+v1+ "的表格");
+ for (int i = 0; i < tables.Count; i++)
+ {
+ string rowstring = "";
+ for (int j = 0; j < tables[i].ColumnCount; j++)
+ {
+ rowstring += cell_get_text(table_Get_cell(tables[i], 0, j));
+ }
+ if (rowstring== v1)
+ {
+ //Console.WriteLine("找到了table"+i);
+ tlist.Add(tables[i]);
+ }
+ }
+ ConsoleWriter.Writehiddeninfo("找到table个数:" + tlist.Count);
+ return tlist;
+}
+```
+
+### 内容处理
+
+能获取到的内容均以段落为最小单位,获取到了段落之后,由于段落的内容可能很多,不能直接使用,我们需要对其进行修改、删减、或者提取。
+
+- 直接摘取整段
+- 截取部分内容 (substring)
+- 提取有用的固定格式内容(regex)
+
+```csharp
+//获取的内容 本报告记录编号:P2022XXXXX-GB01 , 需要的部分是P2022XXXXX
+ string a = doc.Find_Paragraph_for_text("本报告记录编号");
+//本报告记录编号:P2022XXXXX-GB01
+//从序号8开始,取长度为10的字符串
+a = a.Substring(8,10);
+textBoxlog.Text = a;
+```
+
+如提取“测评准备过程的最后一天”时,因为存在多种书写格式、日期长短不一,需要使用正则表达式来提取内容、并且进行处理。
+
+```
+//多种情况例子
+1、2021年12月28日~2021年12月29日,测评准备过程。
+1、2021年12月28日~12月29日,测评准备过程。
+1、2021年1月9日,测评准备过程。
+```
+
+
+```csharp
+private string date_process(string a)
+{
+ //提取日期(结束日期)
+ ConsoleWriter.WriteCyan("在字符串中寻找日期:" + a);
+
+ string patternA = @"\d\d\d\d年(\d)*月(\d)*日";
+ string patternB = @"(\d)*月(\d)*日";
+ //如果获取的短日期个数为2,但是长日期仅有1个,那么就是如2021年12月1日~12月1日这种写法
+ //如果长短日期都只有一个,那么就是2021年12月1日这种写法(只有一天之类的)
+
+ int shortDcount = 0;
+ int LongDcount = 0;
+
+ Regex rg = new Regex(patternB);
+ MatchCollection matchedShortDate = rg.Matches(a);
+ shortDcount = matchedShortDate.Count;
+ //Console.WriteLine("shortDcount" + shortDcount);
+ rg = new Regex(patternA);
+ MatchCollection matchedLongDate = rg.Matches(a);
+ LongDcount = matchedLongDate.Count;
+ //Console.WriteLine("LongDcount"+ LongDcount);
+
+ if (shortDcount > LongDcount)
+ {
+ string year = matchedLongDate[LongDcount - 1].Value.Substring(0, 5);
+ string MandD = matchedShortDate[shortDcount - 1].Value;
+ a = year + MandD;
+ }
+ else if (shortDcount == LongDcount)
+ {
+ a = matchedLongDate[LongDcount - 1].Value;
+ }
+ Console.WriteLine(a);
+ return a;
+}
+```
+
+### 模板的制作和关键词替换
+
+一般来说应用场景分为两种
+
+- 修改源文件
+- 从源文件中提取信息,制作其他文件
+
+本次介绍的属于第二种,对于制作其他文件,首先需要制作一个模板。
+
+![image](https://tvax3.sinaimg.cn/large/006rgJELly1h0t3f85uj1j30sj0fddjl.jpg)
+
+然后我们只需要把【xxx公司】、【xxx系统】等内容替换为提取到的信息即可。
+
+```csharp
+//a是提取到的内容字符串,tempo是读进来的模板文档
+a = doc.table_Get_cell_text(doc.tables[2], 1, 1);
+str_公司 = a;
+tempo.write_dictionary("xxx公司", a);
+
+a = doc.table_Get_cell_text(doc.tables[1], 1, 1);
+str_系统 = a;
+tempo.write_dictionary("xxx系统", a);
+...
+ //写入
+ tempo.ReplaceTextWithText_all();
+//保存(myutil会默认保存到桌面 - out文件夹中)
+tempo.save($"出报告申请_{str_公司}_{str_系统}.docx");
+```
+
+## 程序测试
+
+程序编写完成后,需要进行测试,一般前几次的测试会发现很多的问题,大部分都很容易修复。
+
+同时经过了自己的测试后,还可以吧自己的程序分享给他人使用、测试,因为不同人使用的习惯不同,让他人使用更容易发现一些自己发现不了的bug。
+
+## 总结
+
+如果你也想开发操作Docx相关的桌面程序,经过阅读上面的文章,应该已经可以了解其大概开发方法。同时也欢迎参考我的源码、使用我的库文件:[github/kasusa/archiver](https://github.com/kasusa/archiver)
+
diff --git a/content/post/old/Windows10DPIFix.md b/content/post/old/Windows10DPIFix.md
new file mode 100644
index 00000000..d2ab3763
--- /dev/null
+++ b/content/post/old/Windows10DPIFix.md
@@ -0,0 +1,24 @@
++++
+
+title = "win10 DPI FIX"
+date = "2021-06-22"
+author = "kasusa"
+cover = ""
+tags = ["win10", "软件"]
+keywords = ["", ""]
+description = "修复win10 125%缩放下某些软件字体模糊的解决方法。"
+showFullContent = false
+
++++
+
+## Windows10 DPI Fix
+
+[http://windows10-dpi-fix.xpexplorer.com/](http://windows10-dpi-fix.xpexplorer.com/)
+
+这个软件的功能是修复win10在缩放125%的情况下产生的字体模糊。
+
+他的原理是调用win7/8.1的缩放DPI,这个老的DPI是专门为电脑设计的。而win10当时有向移动端发展的想法,便用了一个新的缩放dpi,为了照顾手机的性能,缩放之后还会变模糊,我想这才是我真正讨厌缩放的原因吧。但是不缩放15寸小屏幕很瞎眼。
+
+这个应用真的很好地解决了我的缩放问题,在此推荐给所有人。
+
+![程序截图](https://tva1.sinaimg.cn/large/006rgJELgy1grqsxs460dj30d1060q4e.jpg)
diff --git "a/content/post/old/chmod\347\232\204\347\224\250\346\263\225.md" "b/content/post/old/chmod\347\232\204\347\224\250\346\263\225.md"
new file mode 100644
index 00000000..59fd780d
--- /dev/null
+++ "b/content/post/old/chmod\347\232\204\347\224\250\346\263\225.md"
@@ -0,0 +1,166 @@
++++
+title = "chmod的用法"
+description = ""
+date = 2022-04-22T15:30:54+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "linux"
+]
+
++++
+
+# chmod的用法
+
+今天我们有一节技术分享,讲的是linux的文件和权限,学到了点有用的。
+
+然后由于我自己的一些思考,我就觉得比如我把自己写文件的权限去掉了,这个时候我为什么还能够通过chmod来修改这个文件的权限呢?搞了一会儿chmod搞懂了,分享一下:
+
+## ls -l:看权限
+
+![image](https://tva1.sinaimg.cn/large/006rgJELly1h1ijxlim8tj30r30c8gp2.jpg)
+
+这个权限一般是这样的 `rwx rwx rwx` 写了三遍是因为它对应着三个家伙的权限,分别是用户(文件拥有者)、组(文件拥有者的朋友们)、还有其他人。
+
+linux系统是由文件组成的,文件就像一个物品,他是有归属的,图中`me.txt`这个文件就是属于`k`的用户的。
+
+属于k的意思就是,`k`可以对这个文件使用`chmod`指令来改变文件的权限,就像你可以决定你的东西是否让别人使用一样。
+
+对于文件 r(read)、w(write)、x(Excute)都很好理解,但是目录呢?什么叫执行目录?下面这个表可以参考一下:
+
+| **-** | **r** | **w** | **x** |
+| ----- | ---------------- | ------------------ | ---------------- |
+| 文件 | 读到文件内容 | 修改文件内容 | 执行文件 |
+| 目录 | 读目录下的文件名 | 修改目录下的文件名 | 进入该目录的权限 |
+
+> 注意:要开放目录给任何人浏览时,应该至少也要给予 r-x的权限,w 权限不可随便给
+
+看了这个表你就能感觉到,目录的权限指的是你能不能看到、修改目录里面的文件名,文件的权限是管文件里的东西(文件的具体内容啥的),懂了这个道理你上面的表也就没有必要记了。
+
+## 修改文件所属
+
+修改文件所属就像物品的转让,但是只能由`root`强制执行……hhh
+
+```
+chgrp:修改文件所属用户组
+chown:修改文件拥有者()
+
+chgrp [-R] <用户组名称> <文件或目录>
+ chown [-R] <账号名称:用户组名称> <文件或目录>
+ chown [-R] <账号名称> <文件或目录>
+```
+
+## chmod
+
+chmod:修改文件的权限
+
+```
+chmod [-R] xyz 文件或目录
+(r:4 w:2 x:1)
+chmod 777 file1
+```
+
+但是这种操作多不直观!整几个数字看起来虽然非常极客,但是真的很不人性化。我还是更喜欢这种方式:
+
+```
+chmod a=rwx hi.txt
+
+a=rwx 意为:all(所有人)=(权限变成)rwx(读写执行)
+a/u/g/o (all/user/group/others)
+=/+/- (设置权限、增加某些权限、减少某些权限)
+```
+
+```
+k@VM-12-6-ubuntu:~$ ls -l
+----rwx--- 1 k k 0 Apr 22 15:24 hi.txt
+
+k@VM-12-6-ubuntu:~$ chmod a=rwx hi.txt
+
+k@VM-12-6-ubuntu:~$ ls -l
+-rwxrwxrwx 1 k k 0 Apr 22 15:24 hi.txt
+```
+
+如果用这个方式,看起来直观又容易记忆。
+
+附加: SUID:4 SGID:2 SBIT:1
+
+比如你要给一个目录的权限本来是774,但是你要给他加上SGID的特殊模式,你就直接赋权限 `chmod 2774 dir1`
+
+## 高级:SUID、SGID、SBIT
+
+有时候在`ls -l`的时候,你还会看到`s`、`t`这种奇葩的字母,不知为何意,下面就为你解惑。
+
+不废话版:
+
+符号:s(set xxx ID)
+
+- SUID - 执行二进制文件的时候短暂获取文件**所有者**的权限
+- SGID - 执行二进制文件的时候短暂获取文件**所属组**的权限
+- SGID - 在某目录下时候短暂获取目录**所属组**的权限
+
+符号:t (sticky)
+
+![SBIT](https://tva4.sinaimg.cn/large/006rgJELgy1h1ilajxmd0j30n403e3zt.jpg)
+
+![image](https://tva3.sinaimg.cn/large/006rgJELgy1h1illlnlslj30rb03775m.jpg)
+
+![image](https://tvax1.sinaimg.cn/large/006rgJELgy1h1ilhuem4sj30t902ot9k.jpg)
+
+### SUID
+
+> 当 **s** **这个标志出现在文件拥有者的** **x** **权限上**时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:【-rwsr-xr-x】,此时就被称为 Set UID,简称为 SUID 的特殊权限。
+>
+> 基本上 SUID 有这样的限制与功能:
+>
+> - SUID 权限仅对二进制程序 ( binary program ) 有效,不能用在 shell 脚本上;
+> - 执行者对于该程序需要具有 x 的可执行权限;
+> - 本权限仅在执行该程序的过程中有效;
+> - 执行者将具有该程序拥有者 ( owner ) 的权限。
+>
+> **举个例子:**
+>
+> Linux 系统中,所有账号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:【---------- 1 root root】,意思是这个文件仅有 root 可读且仅有 root 可以强制写入而已。既然这个文件仅有 root 可以修改,那么我们一般账号用户能否自行修改自己的密码?一般用户当然可以修改自己的密码。
+>
+> 可是明明 /etc/shadow 就不能让一般用户去读写的,为什么一般用户还能够修改这个文件内的密码?这就是 SUID 的功能。
+>
+> 借由前面提到的功能说明,我们可以知道:
+>
+> 1.一般用户对于 /usr/bin/passwd 这个程序来说是具有 x 的权限,表示一般用户能执行 passwd;
+>
+> 2.passwd 的拥有者是 root 这个账号;
+>
+> 3.一般用户执行 passwd 的过程中,会【暂时】获得 root 的权限;
+>
+> 4./etc/shadow 就可以被一般用户所执行的 passwd 所修改。
+>
+>
+>
+> 但如果一般用户使用 cat 去读取 /etc/shadow 时,它能够读取吗?因为 cat 不具有 SUID 的权限,所以一般用户执行【cat /etc/shadow】时,是不能读取 /etc/shadow 的。
+
+### **SGID**
+
+与 SUID 不同的是,**SGID** **可以针对文件或目录来设置**。
+
+> 除了二进制程序之外,事实上 SGID 也能够用在目录中,这也是非常常见的一种用途。当一个目录设置了 SGID 的权限后,它将具有如下的功能:
+>
+> - 用户若对于此目录具有 r 与 x 的权限时,该用户能够进入此目录;
+> - 用户在此目录下的有效用户组 (effective group) 将会变成该目录的用户组;
+> - 用途:若用户在此目录下具有 w 的权限(可以新建文件),则用户所建立的新文件,该新文件的用户组与此目录的用户组相同。
+
+### **SBIT**
+
+Sticky Bit ( SBIT ) 只针对目录有效
+
+> SBIT 对于目录的作用是:
+>
+> - 当用户对于此目录具有 w、x 权限,即具有写入的权限;
+> - 当用户在该目录下建立文件或目录时,仅有自己与 root 才有权力删除该文件。
+>
+> 举例:
+>
+> 我们的 /tmp 本身的权限是【drwxrwxrwt】,在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件或目录建立者与 root 能够删除自己的目录或文件。
diff --git "a/content/post/old/corntab \350\256\241\345\210\222\344\273\273\345\212\241.md" "b/content/post/old/corntab \350\256\241\345\210\222\344\273\273\345\212\241.md"
new file mode 100644
index 00000000..f06a5235
--- /dev/null
+++ "b/content/post/old/corntab \350\256\241\345\210\222\344\273\273\345\212\241.md"
@@ -0,0 +1,29 @@
++++
+
+title = "corntab计划任务"
+date = "2021-05-29"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "命令行"]
+keywords = ["hugo2", ""]
+description = "corntab的使用教程"
+showFullContent = false
+
++++
+
+# corntab
+
+设置corntab任务,使用默认编辑器
+```
+corntab -e
+```
+
+设置默认编辑器
+```
+select-editor
+```
+
+设置任务,每天2:00执行
+```
+0 2 * * * /home/saber/DDREPORT/ddrp.sh
+```
\ No newline at end of file
diff --git "a/content/post/old/csharp\344\277\235\345\255\230\350\256\276\347\275\256.md" "b/content/post/old/csharp\344\277\235\345\255\230\350\256\276\347\275\256.md"
new file mode 100644
index 00000000..03b52bcd
--- /dev/null
+++ "b/content/post/old/csharp\344\277\235\345\255\230\350\256\276\347\275\256.md"
@@ -0,0 +1,42 @@
++++
+title = "C# 保存程序设置"
+description = ""
+date = 2021-11-30T22:42:30+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "c#"
+]
+series = []
+images = []
+
++++
+
+一个可视化应用程序难免要保存一些数据,保存数据如果要自己手动操作文件的话就感觉很麻烦,好在微软提供一个很好用的保存功能,这就让我给你讲一下:
+
+这里是我写的一个小c#程序,需要保存的内容就是这上面4个textbox的东东。
+# 操作
+1. 右键项目属性,选择左侧的设置
+2. ![Snipaste_2021-11-30_22-39-43](https://tvax4.sinaimg.cn/large/006rgJELly1gx29nlfid0j31100mznbw.jpg)
+3. 增加一些变量名称,这里还能手动选择变量类型、默认值(范围选择用户即可,然后应该会保存到一个用户文件夹下面的一个不知道什么鬼地方)
+4. 访问:
+```csharp
+using hugoAuto1.Properties;
+
+textBox1.Text = Settings.Default.source;
+```
+4. 保存:
+```csharp
+using hugoAuto1.Properties;
+
+Settings.Default.source = textBox1.Text;
+Settings.Default.Save();
+```
+
+原理和操作就是这么简单,用起来也很方便!
diff --git "a/content/post/old/csharp\346\211\223\345\274\200\346\214\207\345\256\232\346\226\207\344\273\266\345\244\271\345\222\214\351\200\211\345\256\232\346\226\207\344\273\266.md" "b/content/post/old/csharp\346\211\223\345\274\200\346\214\207\345\256\232\346\226\207\344\273\266\345\244\271\345\222\214\351\200\211\345\256\232\346\226\207\344\273\266.md"
new file mode 100644
index 00000000..87d9764c
--- /dev/null
+++ "b/content/post/old/csharp\346\211\223\345\274\200\346\214\207\345\256\232\346\226\207\344\273\266\345\244\271\345\222\214\351\200\211\345\256\232\346\226\207\344\273\266.md"
@@ -0,0 +1,49 @@
++++
+
+title = "c#文件管理器、读取文件列表"
+date = "2021-06-04"
+author = "kasusa"
+cover = ""
+tags = ["csharp", "winform"]
+description = "c#打开文件管理器、选取文件、获取文件列表"
+showFullContent = false
+
++++
+
+打开文件夹和选择其中某一项
+
+```csharp
+private void openExplorer()
+{
+ string FilePath = Directory.GetCurrentDirectory();
+ //打开文件夹并选中文件
+ System.Diagnostics.Process.Start("Explorer", "/select," + FilePath + "\\" + "infolist.xml");
+ //仅打开文件夹
+ System.Diagnostics.Process.Start(FilePath);
+}
+```
+
+读取某位置的指定后缀文件(列表),把名字存入combobox
+
+```cs
+//读取xml文件,填充combobox列表
+public void getCombobox()
+{
+ comboBox1.Items.Clear();
+//获取当前程序目录,获取所有xml文件绝对地址
+ var files = Directory
+ .GetFiles(Directory.GetCurrentDirectory(), "*.xml");
+ //提取路径地址+/为了在后面把完整路径剔除
+ string pathstr = Directory.GetCurrentDirectory()+"\\" ;
+ int count = 0;
+ foreach (var file in files)
+ {
+ //逐个把文件名放在combox中
+ comboBox1.Items.Add(file.ToString().Replace(pathstr, ""));
+ count++;
+ }
+ toolStripStatusLabel1.Text = $"读取到了【{count}】个xml文件。";
+}
+
+```
+
diff --git "a/content/post/old/cs\346\211\247\350\241\214\345\221\275\344\273\244.md" "b/content/post/old/cs\346\211\247\350\241\214\345\221\275\344\273\244.md"
new file mode 100644
index 00000000..c607208a
--- /dev/null
+++ "b/content/post/old/cs\346\211\247\350\241\214\345\221\275\344\273\244.md"
@@ -0,0 +1,106 @@
++++
+title = "C#执行命令"
+description = "使用c#执行任何命令(模拟cmd的输入)"
+date = "2021-11-14"
+featured = false
+comment = true
+toc = true
+reward = true
+
+tags = [
+ "c#","编程"
+]
+
++++
+
+
+
+```csharp
+using System.Diagnostics;
+
+private void runincmd(string yourcommand)
+{
+string strCmdText;
+strCmdText = $"/C {yourcommand}";
+Process.Start("CMD.exe", strCmdText);
+}
+```
+
+Process.Start(string 程序, string 参数);
+
+程序最好是有完整的地址,如果不需要传入参数的话可以只传入一个参数。
+
+上面这个语句启动一个程序并且可以附带一些参数,本质上是把要执行的命令作为windows cmd 的参数传入了,所以只能传入一行,多行可能还需要写个bat脚本。
+
+如果需要“**静音启动**”的话写起来比较麻烦,可以这么做到:
+
+```csharp
+ProcessStartInfo processStartInfo =
+ new ProcessStartInfo(txtExecutable.Text.Trim(), txtParameter.Text.Trim());
+//保持静音
+processStartInfo.ErrorDialog = false;
+processStartInfo.UseShellExecute = false;
+//用于重定向输出
+processStartInfo.RedirectStandardError = true;
+processStartInfo.RedirectStandardInput = true;
+processStartInfo.RedirectStandardOutput = true;
+//用上面的设定新建一个进程
+Process process = new Process();
+process.StartInfo = processStartInfo;
+//以下是输出 output 或者 error msg
+if (processStarted)
+{
+ //Get the output stream
+ outputReader = process.StandardOutput;
+ errorReader = process.StandardError;
+ process.WaitForExit();//这局可能把人卡住
+
+ //展示
+ string displayText = "Output:" + Environment.NewLine;
+ displayText += outputReader.ReadToEnd();
+ displayText +="Error:" + Environment.NewLine ;
+ displayText += errorReader.ReadToEnd();
+ txtResult.Text = displayText;
+
+ //关闭stream
+ if(outputReader != null) outputReader.Close();
+ if(errorReader != null) errorReader.Close();
+}
+```
+
+
+
+> 我一开始打算把cmd搬到我的winform里面(可以实时更新输出的那种),但是我搜了好久也没有可以拷贝的代码,而且获取输出并且贴到textbox中会有时产生莫名其妙的死循环,于是我便放弃了于是就选择了功能相同但是弹出窗口的了。
+
+
+
+这个函数除了这些功能还可以做打开浏览器指定网页、打开文件夹等,是一个windows环境很常用的c#函数了
+
+```
+//打开浏览器指定网页
+private void openinbrowser(string link)
+{
+ string strCmdText;
+ strCmdText = $"{link}";
+ Process process = Process.Start(@"C:\Users\kasusa\AppData\Local\Google\Chrome\Application\Chrome.exe", strCmdText);
+}
+
+```
+
+```
+//打开文件夹
+Process.Start("explorer.exe", @"c:\test");
+```
+
+对了,这里我同时说两个好用的string用法,他们分别是@和$:(语法糖)
+
+```
+@ 可以输出源字符串而不做转义,这对于string写文件目录很有用:
+如果没有@ 系统会对\U \k \D \G 挨个转义,碰到转义失败的就报错了。
+string a = @"C:\Users\kasusa\Documents\Gitee";
+
+$ 可以快速的在一个字符串中插入一个变量而不需要用一堆的引号和加号
+string b = "cake";
+string c = $"i love eating {b}, and drink cola!";
+```
+
diff --git "a/content/post/old/e-h\346\217\222\344\273\266.md" "b/content/post/old/e-h\346\217\222\344\273\266.md"
new file mode 100644
index 00000000..7abd7723
--- /dev/null
+++ "b/content/post/old/e-h\346\217\222\344\273\266.md"
@@ -0,0 +1,38 @@
++++
+title = "e-H阅读插件/e-h下载插件"
+description = ""
+date = 2023-03-28T08:03:32+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "e-h"
+]
+series = []
+images = []
+
++++
+
+e-h是一个广为人知的网站,但是他的阅读体验很糟糕。
+
+这里有一个油猴脚本,名字叫做eHunter,可以让你的阅读体验究极升级!
+
+![e-hunter](https://raw.githubusercontent.com/hanFengSan/eHunter/master/github_image/github_preview_3.jpg)
+
+[ehunter-openuserjs](https://openuserjs.org/scripts/alexchen/eHunter)
+
+[e-hunter-github](https://github.com/hanFengSan/eHunter) (作者还提供ipad版哦,需要使用 ”Userscripts app“)
+
+---
+
+[E-Hentai-Downloader-github](https://github.com/ccloli/E-Hentai-Downloader)
+
+[E-Hentai-Downloader-sleazyfork](https://sleazyfork.org/scripts/10379-e-hentai-downloader)
+
+---
+
+[安装油猴](https://www.tampermonkey.net/)
diff --git "a/content/post/old/excel\350\275\254\346\215\242pdf.md" "b/content/post/old/excel\350\275\254\346\215\242pdf.md"
new file mode 100644
index 00000000..085b3ed3
--- /dev/null
+++ "b/content/post/old/excel\350\275\254\346\215\242pdf.md"
@@ -0,0 +1,91 @@
++++
+title = "Excel转换pdf"
+description = ""
+date = 2022-01-09T20:44:16+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "c#","excel","PDF"
+]
+series = []
+images = []
+
++++
+
+这个函数可是费我老大劲了。
+
+我可以保证,你无法在除了我发的——互联网任何一个地方找到这段代码。
+
+使用的dll需要在安装了ms office的电脑上才能找到。
+
+## 例子
+
+```cs
+//测试:转换为pdf
+//在下面两个文件夹中找到 office 和 Microsoft.Office.Interop.Excel 两个dll
+//C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c
+//C:\Windows\assembly\GAC_MSIL\office\15.0.0.0__71e9bce111e9429c
+private void button2_Click(object sender, EventArgs e)
+{
+ string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Sample\wb.xlsx";
+ string filePath2 = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Sample\wb.pdf";
+ //List files = new List();
+ //files.Add(filePath);
+ Application application = new ApplicationClass();
+ Workbook workbook = application.Workbooks.Open(filePath);
+ workbook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, filePath2, XlFixedFormatQuality.xlQualityStandard);
+}
+```
+
+## 封装函数
+```cs
+public static void ConvertExcelToPDF(string sourcePath,string targetPath)
+{
+ Application application ;
+ Workbook workbook ;
+ try
+ {
+ application = new ApplicationClass();
+ workbook = application.Workbooks.Open(sourcePath);
+ workbook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, targetPath, XlFixedFormatQuality.xlQualityStandard);
+ }
+ catch (Exception e)
+ {
+ ConsoleWriter.WriteErrorMessage("pdf输出 出错");
+ }
+}
+
+```
+
+那个叫做Spire的库可真是害惨我了。
+
+Spire.XLS提供了很简单的例子,但是报错却非常非常的诡异。网上没有任何相关信息。
+
+一看实现,好家伙,一堆`goto`
+
+而且Spire还有不支持excel默认编码的问题`IBM 472`
+
+Spire在读取xlsx的时候报编码错误可以用`nuget`安装这个包来解决:
+
+```
+system.text.encoding.codepages
+```
+
+```
+Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//增加编码支持。
+```
+
+Spire 我用来调整了一下表格列宽什么的,还是挺好用的,但是它内部肯定有问题。另存为PDF根本就是一坨屎。
+
+
+
+[更多代码可以参考我的github](https://github.com/kasusa/ExcelSignToPDF)
+
+
+
diff --git "a/content/post/old/excel\351\273\221\350\211\262\346\250\241\345\274\217.md" "b/content/post/old/excel\351\273\221\350\211\262\346\250\241\345\274\217.md"
new file mode 100644
index 00000000..9f5862a7
--- /dev/null
+++ "b/content/post/old/excel\351\273\221\350\211\262\346\250\241\345\274\217.md"
@@ -0,0 +1,125 @@
++++
+title = "Excel黑色模式"
+description = ""
+date = 2022-06-22T19:03:01+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+
+OFFICE系列在最近增加了黑色模式支持,对于word来说非常好,他有做颜色映射,可以让一个本来是白色的文档变成黑色之后颜色也不显得奇怪。(word是一个“所见即所得”软件,为了保证打印效果和视觉效果一致,一直都不愿意加入黑色模式…
+
+但是Excel就没有那么走运了,他的黑色模式只做了一半… 看看下图你就懂了,后面我用一种比较基础的方式教你怎么把他变成真正的“黑色模式”!
+![image](https://tvax4.sinaimg.cn/large/006rgJELly1h3h8a26rooj30ub0i7gq8.jpg)
+
+
+![image](https://tva3.sinaimg.cn/large/006rgJELly1h3h8cdw0kbj30uk0ihqal.jpg)
+
+# 原理
+本质上我们就是吧单元格颜色、文字颜色、线框颜色都修改掉。
+缺点是影响打印,并且不是很自动化。
+但是优点是你可以有非常高度的自定义效果!
+- 选中全文
+- 背景颜色
+- 文本颜色
+- 线框颜色
+
+# 操作步骤
+- 选中全文
+
+- ![image](https://tvax2.sinaimg.cn/large/006rgJELly1h3h8drhru2j30ea0b641a.jpg)
+
+- 背景颜色
+- ![image](https://tva2.sinaimg.cn/large/006rgJELly1h3h8e9ea2ij30bd0bx410.jpg)
+- 文本颜色
+- ![image](https://tva2.sinaimg.cn/large/006rgJELly1h3h8er3dicj30do0cq41l.jpg)
+- 线框颜色
+- ![image](https://tvax1.sinaimg.cn/large/006rgJELly1h3h8fcbj9qj30nj0ry7ec.jpg)
+
+# 用宏来操作
+
+当然每个表格这么改一下,命都没了。
+
+所以我还是推荐用宏来修改,一个表格点一下按钮就修改好了!
+
+宏的话,自己录制比较好(更加安全也更加方便),但是你也可以用我的宏(是录制转换的,所以有很多没用的代码):
+
+```vb
+Sub darkmode()
+ Cells.Select
+ With Selection.Interior
+ .Pattern = xlSolid
+ .PatternColorIndex = xlAutomatic
+ .ThemeColor = xlThemeColorLight1
+ .TintAndShade = 0.149998474074526
+ .PatternTintAndShade = 0
+ End With
+ With Selection.Font
+ .ThemeColor = xlThemeColorAccent1
+ .TintAndShade = 0.799981688894314
+ End With
+ Cells.Select
+ Selection.Borders(xlDiagonalDown).LineStyle = xlNone
+ Selection.Borders(xlDiagonalUp).LineStyle = xlNone
+ With Selection.Borders(xlEdgeLeft)
+ .LineStyle = xlContinuous
+ .ThemeColor = 2
+ .TintAndShade = 0.349986266670736
+ .Weight = xlThin
+ End With
+ With Selection.Borders(xlEdgeTop)
+ .LineStyle = xlContinuous
+ .ThemeColor = 2
+ .TintAndShade = 0.349986266670736
+ .Weight = xlThin
+ End With
+ With Selection.Borders(xlEdgeBottom)
+ .LineStyle = xlContinuous
+ .ThemeColor = 2
+ .TintAndShade = 0.349986266670736
+ .Weight = xlThin
+ End With
+ With Selection.Borders(xlEdgeRight)
+ .LineStyle = xlContinuous
+ .ThemeColor = 2
+ .TintAndShade = 0.349986266670736
+ .Weight = xlThin
+ End With
+ With Selection.Borders(xlInsideVertical)
+ .LineStyle = xlContinuous
+ .ThemeColor = 2
+ .TintAndShade = 0.349986266670736
+ .Weight = xlThin
+ End With
+ With Selection.Borders(xlInsideHorizontal)
+ .LineStyle = xlContinuous
+ .ThemeColor = 2
+ .TintAndShade = 0.349986266670736
+ .Weight = xlThin
+ End With
+End Sub
+```
+# 我的宏为什么不能运行?
+微软最近的更新对宏进行了许多的限制(基于安全性原因和微软认为没啥人用这个东西),所以如果你想要运行宏,需要开一些设置:
+
+1. 文件-选项-自定义功能区,勾选开启“开发工具功能区”
+![image](https://tvax3.sinaimg.cn/large/006rgJELly1h3h8oj6zvwj30n80iuwks.jpg)
+
+2. 文件 - 选项 - 信任中心 - 信任中心设置,然后勾选这样,然后重启软件。
+![image](https://tvax3.sinaimg.cn/large/006rgJELly1h3h8lf9rg4j30mv0iitc0.jpg)
+
+顺便玩了一会儿VisualBasic的开发界面,感觉上就像是一个上古时代的VisualStudio!
+![image](https://tvax2.sinaimg.cn/large/006rgJELly1h3h8myxdd1j30vq0spgzm.jpg)
+
+# 尾声
+其实我当时想要编程的最主要原因就是感觉各种编辑器好酷啊,颜色花花的好看,黑色背景好酷!
+虽然到目前位置也没去当一名全职开发,但是我对编辑器主题的爱永远不变!
\ No newline at end of file
diff --git a/content/post/old/funstuff.md b/content/post/old/funstuff.md
new file mode 100644
index 00000000..877874c7
--- /dev/null
+++ b/content/post/old/funstuff.md
@@ -0,0 +1,17 @@
++++
+
+title = "linux fun stuff"
+date = "2021-11-15"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "命令行"]
+keywords = ["hugo2", ""]
+description = "好玩的命令行工具"
+showFullContent = false
+
++++
+
+- cmatrix 黑客帝国命令行
+
+- Gow 让win可以用大部分linux常用命令
+
diff --git a/content/post/old/howtouseFRP.md b/content/post/old/howtouseFRP.md
new file mode 100644
index 00000000..7c3a48c9
--- /dev/null
+++ b/content/post/old/howtouseFRP.md
@@ -0,0 +1,148 @@
++++
+title = "如何使用FRP"
+description = ""
+date = 2022-03-12T08:56:19+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "frp"
+]
+series = []
+images = []
+
++++
+
+FRP是一个开源的内网穿透软件,本文将会介绍如何使用frp。
+
+[frp - github](https://github.com/fatedier/frp)
+
+# 原理解释
+
+**背景**
+
+- 我们有一台能访问公网,但是没有公网ip(不能为外部提供服务的server)
+- 我们有一台阿里云之类的**云服务器**,有公网ip
+
+**目的**
+
+- 让**不能为外部提供服务的server** 借用**云服务器**转发,从而为公网提供服务
+
+## 下载和安装
+
+从github下载之后我们会得到这些文件:
+
+```sh
+frpc 放在本地server上
+frpc.ini frpc的配置文件
+frpc_full.ini frpc的配置文件(有完整的注释和例子)
+```
+
+```sh
+frps 放在云服务器上
+frps.ini frps的配置文件
+frps_full.ini frps的配置文件(有完整的注释和例子)
+```
+
+![0F7357E41313BFC9B317E8F17213C134](https://tva3.sinaimg.cn/large/006rgJELly1h06twcbshjj31g10u2wmo.jpg)
+
+# 配置文件怎么写
+
+以防我写的不对,首先推荐看这里:[github官方例子](https://github.com/fatedier/frp/tree/dev/conf)
+
+## frps.ini
+
+```sh
+[common]
+#开一个端口,用于转发信息的接收
+bind_port = 7000
+#开一个监控台,可以在web上面直观的看到frp运行情况
+dashboard_addr = 0.0.0.0
+dashboard_port = 7500
+```
+
+然后把`frps`、`frps.ini` 放到服务器上,赋予执行权限(我就无脑chomd777)
+
+记得把云服务器的安全组策略(在云服务商的控制台界面里面)打开,然后就可以去编辑frpc了
+
+
+
+## frpc.ini
+
+```sh
+[common]
+#输入你服务器的ip、服务器的接收端口,进行frp链接
+server_addr = x.x.x.x
+server_port = 7000
+
+[ssh]
+#开启一些其他的转发,比如ssh,按照下面配置相当于把 127.0.0.1:22 转发到 x.x.x.x:6000
+type = tcp
+local_ip = 127.0.0.1
+local_port = 22
+remote_port = 6000
+
+# tcp和udp端口转发等
+[range:tcp_port]
+type = tcp
+local_ip = 127.0.0.1
+local_port = 6010-6020,6022,6024-6028
+remote_port = 6010-6020,6022,6024-6028
+use_encryption = false
+use_compression = false
+
+[range:udp_port]
+type = udp
+local_ip = 127.0.0.1
+local_port = 6010-6020
+remote_port = 6010-6020
+use_encryption = false
+use_compression = false
+
+```
+
+
+
+# 服务启动
+
+```sh
+# 在云上启动服务端(接受和转发)(推荐用screen)
+./frps -c ./frps.ini
+
+# 在本地启动客户端(发送)
+./frpc -c ./frpc.ini
+```
+
+本地成功的输出:
+
+```sh
+2022/03/12 08:54:09 [I] [service.go:178] [356c08cc36fd0fc1] try to reconnect to server...
+2022/03/12 08:54:09 [I] [service.go:325] [356c08cc36fd0fc1] login to server success, get run id [356c08cc36fd0fc1], server udp port [0]
+2022/03/12 08:54:09 [I] [proxy_manager.go:144] [356c08cc36fd0fc1] proxy added: [ssh]
+2022/03/12 08:54:09 [I] [control.go:181] [356c08cc36fd0fc1] [ssh] start proxy success
+
+```
+
+云端成功的输出:
+
+```sh
+root@VM-12-6-ubuntu:/home/frp# sudo ./frps -c ./frps.ini
+2022/03/12 08:53:51 [I] [root.go:200] frps uses config file: ./frps.ini
+2022/03/12 08:53:51 [I] [service.go:193] frps tcp listen on 0.0.0.0:7000
+2022/03/12 08:53:51 [I] [service.go:292] Dashboard listen on 0.0.0.0:7500
+2022/03/12 08:53:51 [I] [root.go:209] frps started successfully
+2022/03/12 08:54:06 [I] [dashboard_api.go:70] Http request: [/api/serverinfo]
+2022/03/12 08:54:06 [I] [dashboard_api.go:63] Http response [/api/serverinfo]: code [200]
+2022/03/12 08:54:09 [I] [service.go:449] [356c08cc36fd0fc1] client login info: ip [211.161.248.81:2910] version [0.40.0] hostname [] os [linux] arch [amd64]
+2022/03/12 08:54:09 [I] [tcp.go:64] [356c08cc36fd0fc1] [ssh] tcp proxy listen port [6000]
+2022/03/12 08:54:09 [I] [control.go:465] [356c08cc36fd0fc1] new proxy [ssh] success
+```
+
+# 检查frp控制台
+
+![image](https://tvax1.sinaimg.cn/large/006rgJELly1h06ueiqri1j310k0izwis.jpg)
+
diff --git a/content/post/old/hugo-newblog.md b/content/post/old/hugo-newblog.md
new file mode 100644
index 00000000..92f5de7d
--- /dev/null
+++ b/content/post/old/hugo-newblog.md
@@ -0,0 +1,132 @@
++++
+
+title = "hugo博客"
+date = "2021-05-29"
+author = "kasusa"
+cover = ""
+tags = ["博客", "hugo"]
+keywords = ["hugo2", ""]
+description = "今天我建立了我的hugo博客"
+showFullContent = false
+
++++
+
+![](https://tvax1.sinaimg.cn/large/0083vuQJgy1gqzlm00z45j30hs06z0sq.jpg)
+
+### 剧情介绍
+
+> 今天yr在我旁边弄新的hugo主题,我感觉他的新主题真的很清新,很不错,然后markdown记录之类的确实要比转化成html再放出来更加简单。不过可定制性没有那么好也是实话。
+>
+> 这个博客对于语法高亮支持很不错。交互和动画就只能限制于模板(这个语法蛮怪的,可能以后会研究一个自己的模板)所以暂时决定把这个弄成技术类博客。
+>
+> 我终于能把我的linux小知识都搬过来了!
+
+
+
+//简单说一下hugo的安装和使用:
+
+### pwershell安装hugo
+
+choco install hugo
+
+### 创建hugo工作目录
+
+hugo new site mysite
+
+### 进入themes文件夹并且git pull自己用的主题
+
+git clone https://github.com/panr/hugo-theme-terminal.git themes/terminal
+
+- [主题市场](https://themes.gohugo.io/)
+- [terminal主题(我现在用的)](https://github.com/panr/hugo-theme-terminal/)
+
+### 配置主题
+
+配置主题需要根据不同的主题情况,各有不同,对于我这个主题来说我要把博客官方的 `config.toml` 粘贴到hugo项目中,并且进行了一点修改。遇到了一点坑,我在后面注释,你可以看一下。
+
+toml文件:
+
+```toml
+baseurl = "" #这个要设为空,否则生成的东西css会找不到。
+languageCode = "en-us"
+theme = "terminal"
+# theme 原本github上提供的版本是 "hugo-theme-terminal",
+# 但是会造成编译错误,故修改
+paginate = 5
+
+[params]
+ contentTypeName = "post"
+ themeColor = "red" #选择主题
+ showMenuItems = 2
+ #选择显示在顶部的导航链接数目,超出的会折叠。
+ #链接具体目录可以在下面修改
+ fullWidthTheme = false
+ centerTheme = false
+
+[languages]
+ [languages.en]
+ title = "KASUSA"
+ subtitle = "kasusa的技术博客"
+ keywords = ""
+ copyright = ""
+ menuMore = "展开"
+ readMore = "品读"
+ readOtherPosts = "看看别的文章
+
+ [languages.en.params.logo]
+ logoText = "KASUSA"
+ logoHomeLink = "/"
+
+ [languages.en.menu] #顶部栏条目们(不知道顺序是按照什么计算的)
+ [[languages.en.menu.main]] #一个顶部栏条目
+ identifier = "about" #id
+ name = "About_theme" #顶部条目显示为什么文字
+ url = "/about" #点击后进入什么目录
+ [[languages.en.menu.main]]
+ identifier = "showcase"
+ name = "Showcase"
+ url = "/showcase"
+
+```
+
+### 写博客
+
+在 content - posts 内新建md文件,系统会用mdmd文件内容生成博客。
+
+对于md文件顶部的格式有着特殊的要求,这个也是因主体而异的,具体的话就要参考你的`theme`中`archetypes`文件夹内提供的模板了。我这个主题提供的模板如下:
+
+```md
++++
+title = "hugo博客"
+date = "2021-05-29"
+author = "kasusa"
+cover = "https://tvax1.sinaimg.cn/..."
+tags = ["博客", "hugo"]
+keywords = ["hugo2", ""]
+description = "今天我建立了我的hugo博客"
+showFullContent = false
++++
+```
+
+我感觉他已经很明白了,但是我遇到了一个坑就是日期,我打成了2021-5-29在预览的时候就会显示成00-01-00,要注意日期格式必须相同哦!
+
+### 实时预览
+
+`hugo server -t terminal -p 51000`
+
+`-t`是自定义主题,`-p`是自定义端口,开启成功之后他会根据你后台文件的变化不停的刷新,你可以在
+
+`localhost:51000` 实时的预览。
+
+### 编译生成HTML
+
+在你的项目的目录输入命令(生成到指定目录):
+
+`hugo -d C:\Users\kasusa\Documents\GitHub\kasusa.github.io\hugo`
+
+默认的话文件会生成在`public`文件夹。
+
+然后就把public文件夹的内容上传到github即可。以后也许会考虑 [使用action自动编译](https://yantree.github.io/posts/develop/2020-06-20-action-delopy-github-page/)
+
+
+
diff --git a/content/post/old/install pip (python).md b/content/post/old/install pip (python).md
new file mode 100644
index 00000000..2202960b
--- /dev/null
+++ b/content/post/old/install pip (python).md
@@ -0,0 +1,20 @@
++++
+
+title = "ubuntu安装pip3"
+date = "2021-05-29"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "命令行","python"]
+keywords = ["hugo2", ""]
+description = ""
+showFullContent = false
+
++++
+
+ubuntu安装python 的包管理器 pip3 :https://packaging.python.org/guides/installing-using-linux-tools/
+
+
+Python 3:
+sudo apt install python3-venv python3-pip
+
+安装之后要重新启动,否则在这次开机里面不能使用安装的包
\ No newline at end of file
diff --git "a/content/post/old/ipad\347\234\213TikTok.md" "b/content/post/old/ipad\347\234\213TikTok.md"
new file mode 100644
index 00000000..dbfb085d
--- /dev/null
+++ "b/content/post/old/ipad\347\234\213TikTok.md"
@@ -0,0 +1,30 @@
++++
+title = "Ipad看TikTok"
+description = ""
+date = 2022-03-30T18:51:07+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "tiktok"
+]
+series = []
+images = ["https://image.baidu.com/search/down?url=https://tva3.sinaimg.cn/large/006rgJELly1h0s3vougp5j307w04xq3c.jpg"]
+
++++
+
+https://www.youtube.com/watch?v=5tqzLUTLW-A
+
+这个频道主人做了好多期怎么在苹果上面用tiktok的影片,虽然他宣传机场,但是他讲的很清楚。
+
+目前来说,需要到设置-地区,把地区切换成美国就可以了。
+
+享受你的tiktok!
+
+![image](https://image.baidu.com/search/down?url=https://tvax3.sinaimg.cn/large/006rgJELly1h0s3vougp5j307w04xq3c.jpg)
+
diff --git "a/content/post/old/ipad\347\234\213\345\223\224\345\222\224\345\223\224\345\222\224.md" "b/content/post/old/ipad\347\234\213\345\223\224\345\222\224\345\223\224\345\222\224.md"
new file mode 100644
index 00000000..f83de866
--- /dev/null
+++ "b/content/post/old/ipad\347\234\213\345\223\224\345\222\224\345\223\224\345\222\224.md"
@@ -0,0 +1,70 @@
++++
+title = "Ipad看哔咔哔咔"
+description = ""
+date = 2023-04-21T16:56:54+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "ipad"
+]
+series = []
+images = ["https://tva2.sinaimg.cn/large/006rgJELly1h0s4l1spjvj30ff0am0ww.jpg"]
+
++++
+
+> 23-4-21 https://altstore.io/ 这个是一个更好用的自签名方法,主要是可以不用7天重装,在手机上可以进行自签名更新
+
+
+> 这是官方的教程: [IOS下载-PicAcg-哔咔漫画下载 (picacn.xyz)](https://image.baidu.com/search/down?url=https://download.picacn.xyz/page/ios-tip-simplified.php),这里是他们下载的官网:[PicAcg-哔咔漫画下载 (picacn.xyz)](https://image.baidu.com/search/down?url=https://download.picacn.xyz/)
+
+ 目前看来主要有两种办法:
+
+1. 自签名,用电脑安装
+2. 看网页版:https://ios.bikaa.xyz/
+
+我讲一下怎么用PC安装吧
+
+# 下载itunes
+
+下载了这个软件你的ipad才能被电脑识别。
+
+可以在微软商店直接搜索`itunes`
+
+![image](https://image.baidu.com/search/down?url=https://tva2.sinaimg.cn/large/006rgJELly1h0s44wqbfrj311q0nhdss.jpg)
+
+然后你可能要多插拔几次ipad,点击信任输入密码,直到它连上了为止。
+
+![image](https://image.baidu.com/search/down?url=https://tva2.sinaimg.cn/large/006rgJELly1h0s46k0zo1j30uk0k5dla.jpg)
+
+# 签名工具和下载
+
+[sideloadly安裝ios 嗶咔IPA – PICA Wiki](http://picawiki.xyz/164/)
+
+这个网站里面是签名的教程,里面也有个工具下载链接,123MB
+
+# 安装程序
+
+![image](https://image.baidu.com/search/down?url=https://tva3.sinaimg.cn/large/006rgJELly1h0s4gt984hj30gq0710u3.jpg)
+
+- 确保设备已经识别
+- 输入自己的apple账号
+- 点击start
+- 输入自己的appleid 密码(推荐用没开启两部验证的)
+
+# 信任自签证书
+
+来到ipad上面,进入 通用 - VPN与设备管理
+
+里面应该有一个没有信任的开发者证书,信任他。
+
+然后你的哔咔就能打开啦!
+
+> 注:签时效只有 7 天,但只有第一次比较麻烦,之后刷新需要重複一遍這個步驟……
+
+不过哔咔都不支持横屏,还不如去看e-h , e-h 可以用一个叫做Yealico的软件看……
+
diff --git a/content/post/old/itbook.md b/content/post/old/itbook.md
new file mode 100644
index 00000000..c33edc11
--- /dev/null
+++ b/content/post/old/itbook.md
@@ -0,0 +1,348 @@
++++
+title = "IT BOOKS"
+description = ""
+date = 2022-03-07T16:40:49+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "编程书籍"
+]
+series = []
+images = []
+
++++
+
+
+
+>在这个网站[五角钱的程序员/IT_book (gitee.com)](https://gitee.com/XiangLinPro/it_book) 转载的一些书籍下载链接,如果书挂了可能要去看一下。
+
+> 自己找还挺麻烦的,不如就copy一份出来(顺便删除了广告)
+
+> 顺便删掉一些自己不喜欢的书。
+
+
+# 数据结构与算法相关书籍
+
+- 漫画算法:小灰的算法之旅 [百度云下载链接](https://pan.baidu.com/s/17jMzGKdMzcyP4GD3CtFtjQ ) 密码:s9sb
+- 算法(第4版) [百度云下载链接](https://pan.baidu.com/s/1LWYHUd-gybF1AMkS_exymA ) 密码:1a4z
+- 剑指offer [百度云下载链接](https://pan.baidu.com/s/1BLSt2i_QrR_2jDmEeK2PPA) 密码:ttfn
+- Java数据结构和算法 [百度云下载链接](https://pan.baidu.com/s/1LmGhE83W4yzI7ZXcEi-cTw) 密码:a5am
+- 数据结构与算法分析——Java语言描述 [百度云下载链接](https://pan.baidu.com/s/1MuW73vGlGnIbCQ1A-ZVhPw ) 密码:iqi8
+- 数据结构与算法 Python语言描述_裘宗燕 [百度云下载链接](https://pan.baidu.com/s/1WZ3S1PKgc7eEoQYCUG4DmA ) 密码:qr8j
+- 挑战程序设计竞赛 [百度云下载链接](https://pan.baidu.com/s/1Tb1GOUR6LTz5s5BPA1psGg) 密码:byx1
+- 大话数据结构 [百度云下载链接](https://pan.baidu.com/s/1rRs2iS-arfsYB-FMXXnGAg) 密码:lpdq
+- 数据结构与算法分析--C语言描述 [百度云下载链接](https://pan.baidu.com/s/1y429aNjcWRsSiPcbWZ2qXA ) 密码:u0an
+- 啊哈算法 [百度云下载链接](https://pan.baidu.com/s/12_cpFx_8TP_ujKFRhXmbBA) 密码:swxv
+
+# 计算机基础
+
+### 计算机网络
+
+- HTTP权威指南 [百度云下载链接](https://pan.baidu.com/s/1uWxxIC-AEXM16YQEWojCVg) 密码:koaj
+- 计算机网络 [百度云下载链接](https://pan.baidu.com/s/10TA2eSZu8-e_pqpj9psrMQ) 密码:4519
+- 图解HTTP [百度云下载链接](https://pan.baidu.com/s/1LA7cvQC7cpuT4ODejh6o1Q) 密码:u3qi
+- UNIX网络编程 [百度云下载链接](https://pan.baidu.com/s/1_Gyj-_j6Oq8yKk3ets5zgQ ) 密码:dil7
+- 图解TCP-IP [百度云下载链接](https://pan.baidu.com/s/12zWs8w4Fla6esygC3jzEiw ) 密码:no3g
+- 网络是怎样连接的 [百度云下载链接](https://pan.baidu.com/s/1kUDEvSNaXLi1pdyzKlweKQ) 密码:l7iq
+
+### 计算机组成原理
+
+- 计算机是怎样跑起来的 [百度云下载链接](https://pan.baidu.com/s/1bbOJ1mOEldsgdGWs84xXYQ) 密码:z8vz
+- 隐匿在计算机软硬件背后的语言 [百度云下载链接](https://pan.baidu.com/s/1J5LP6gpOIat6jRH0Uw0lPA) 密码:9284
+- 大话计算机 [百度云下载链接](https://pan.baidu.com/s/1Lx4jN0cT5y6oEhcP-vPM5Q) 密码:6iuh
+- 隐匿在计算机软硬件背后的语言**英文版** [百度云下载链接](https://pan.baidu.com/s/1NF3T1khX2YT1SLULDNo_YA) 密码:jrvw
+
+
+### 汇编语言
+
+- 汇编语言【王爽,非常棒的一本书,通俗易懂】 [百度云下载链接](https://pan.baidu.com/s/1xswsOR4N7tzWznrqGOBDmA) 密码:urea
+
+### 操作系统
+
+- 深入理解计算机操作系统 [百度云下载链接](https://pan.baidu.com/s/1TKf45xXZyi0-SxhCSozR9A) 密码:pbvr
+- 30天填自制操作系统 [百度云下载链接](https://pan.baidu.com/s/1V78fbnrjKQpe9d2nHndpTw) 密码:z0zr
+- 操作系统之哲学原理 [百度云下载链接](https://pan.baidu.com/s/1KBVu0AkcOKWf3UEJ87aBrg) 密码:lfkd
+- 程序是怎样跑起来的 [百度云下载链接](https://pan.baidu.com/s/1fLCeujbZ9w5pIv1uVtIQVQ) 密码:i9go
+- 操作系统设计与实现 [百度云下载链接](https://pan.baidu.com/s/13fFS8939X9fdVnMIa27QBg) 密码:nut5
+
+# python系列
+
+- python操作word,excel,pdf [百度云下载链接](https://pan.baidu.com/s/10KTz_CPln20SK1z3h9nxng) 密码:7w6s
+
+### python基础
+
+- Python编程:从入门到实践 [百度云下载链接](https://pan.baidu.com/s/1yqPuGr5_Cbb7ByPpa6IneQ) 密码:dv8z
+- Python数据分析基础教程:NumPy学习指南 [百度云下载链接](https://pan.baidu.com/s/15XzJ9uHBVMO9oKEvYXZ9CQ) 密码:78u3
+- Python知识手册 [百度云下载链接](https://pan.baidu.com/s/1dhbfnwT2Q7tcGmF0tvV3Vw) 密码:zgrv
+- 机器学习numpy和pandas基础 [百度云下载链接](https://pan.baidu.com/s/19Nb0BUJrCdjUA0Epql4nIg) 密码:qb9a
+- Pandas Basics卡片 [百度云下载链接](https://pan.baidu.com/s/1nHPDupVzyNTpI5FVaZRS7A) 密码:l5e2
+- NumPy Basics卡片 [百度云下载链接](https://pan.baidu.com/s/1wx9O8hnt2qARXroa1RZ3TQ) 密码:zr3p
+- Python开发技术详解 [百度云下载链接](https://pan.baidu.com/s/1wyHdC8aaYL_pZf6rfvrfeA) 密码:b5ye
+- Python开发实战 [百度云下载链接](https://pan.baidu.com/s/1JUNFOiJb4DpZSkYeXgx1Lw) 密码:awp5
+- Python学习手册 [百度云下载链接](https://pan.baidu.com/s/14Fh0TqEixVQkSkpd-4NQ6Q) 密码:c0j9
+- Python编程初学者指南 [百度云下载链接](https://pan.baidu.com/s/19QElmLMR4yTZpjYQloIM6g) 密码:09xw
+- Python高级编程 [百度云下载链接](https://pan.baidu.com/s/1PJKJ4oQOdMXfWLEGwJ0tsQ) 密码:xq05
+- Python编程入门经典 [百度云下载链接](https://pan.baidu.com/s/1bQwIjpJB96GojQFK9Qz01A) 密码:67yk
+- Python灰帽子 [百度云下载链接](https://pan.baidu.com/s/1c2meTscVawXlJuHXgHZUZQ) 密码:3dhw
+- Python网络编程基础 [百度云下载链接](https://pan.baidu.com/s/1-XPbyorXtT-GK-ANE4LoPA) 密码:nhr6
+- 编程小白的第一本Python入门书 [百度云下载链接](https://pan.baidu.com/s/1mOd4uc4KA6YR-kgzzrm-fg) 密码:wetd
+
+### 数据分析与爬虫
+
+- 《Python For Data Analysis》 [百度云下载链接](https://pan.baidu.com/s/1wnMLGxG-36OpFyy-pcqjuA) 密码:i3qf
+- 《Python3网络爬虫数据采集》 [百度云下载链接](https://pan.baidu.com/s/12i25hBdN78J4enP7yzQ4Yg) 密码:twas
+- Data Structures and Algorithms in Python [百度云下载链接](https://pan.baidu.com/s/1PfnHX4fgHMoHkeLO9LdPVg ) 密码:qxfn
+- Python for Data Analysis [百度云下载链接](https://pan.baidu.com/s/1GZ9RtBCFJ2evxjSlTjd5rA ) 密码:9g28
+- 《Python数据分析基础》 [百度云下载链接](https://pan.baidu.com/s/1c8f4q_l_2yT8xKq5OnHIIg ) 密码:6q61
+- 利用python进行数据分析-第二版 [百度云下载链接](https://pan.baidu.com/s/16rFXmmNW9fQDkqT8YzsiSQ) 密码:2ekn
+- 利用Python进行数据分析 [百度云下载链接](https://pan.baidu.com/s/1EqIgxrYp_8n1gVvH3YGP3g) 密码:p4o3
+- Python数据分析实战 [百度云下载链接](https://pan.baidu.com/s/1ZLxV3rcc74Y1ofY1lqApkQ) 密码:rxaw
+- 精通Scrapy网络爬虫 [百度云下载链接](https://pan.baidu.com/s/1ErPU5u0jff4W5RmlP2wwzg) 密码:faxj
+- Python数据可视化编程实战 [百度云下载链接](https://pan.baidu.com/s/1Mqf-eIn_OJssFpdYmft7Kg) 密码:qtfp
+- Python数据处理 [百度云下载链接](https://pan.baidu.com/s/1CoR71pPdtsmXnv43swEutQ) 密码:d1cl
+- 数据科学入门 [百度云下载链接](https://pan.baidu.com/s/1LenwNtY_olKghtgsJnk9fw) 密码:gfvc
+- Python数据科学手册 [百度云下载链接](https://pan.baidu.com/s/1MKs9PwnctsM9PPWZWq4eEQ) 密码:m4q4
+- 用Python写网络爬虫 [百度云下载链接](https://pan.baidu.com/s/1wVbngJq3THdAYGtFXxnI5Q) 密码:ni0k
+
+
+# 人工智能AI系列
+
+### 计算机视觉
+
+- Computer vision [百度云下载链接](https://pan.baidu.com/s/1RWVTJMFLgOoZXpr7-bm1BA) 密码:8z7n
+- 图像处理分析与机器视觉(第二版)中译本 [百度云下载链接](https://pan.baidu.com/s/19cXcCHFyBcEf1giY_tyEwg) 密码:u6i6
+- python计算机视觉 [百度云下载链接](https://pan.baidu.com/s/13YYkO2XrLwrS9uzavQIDnA) 密码:6gx2
+
+### OpenCv
+
+- OpenCV-Python-Tutorial-中文版 [百度云下载链接](https://pan.baidu.com/s/1OyE0XoTQzJ_iQD3TziltZg) 密码:b3pn
+- 学习OpenCV 3 中文版 [百度云下载链接](https://pan.baidu.com/s/1ignJ07VCNLbMvJM3OWD3gA) 密码:3s4s
+
+
+### 深度学习框架-tensorflow
+
+- TensorFlow 实战_黄文坚(完整) [百度云下载链接](https://pan.baidu.com/s/1cdosRiSsP5lJ8f1bHdlP3g) 密码:j199
+- TensorFlow 面向机器智能的TensorFlow实践 (智能系统与技术丛书) [百度云下载链接](https://pan.baidu.com/s/1gSB9NQ9nS9cr7tSc357bBQ) 密码:t3z9
+- TensorFlow 斯坦福大学-深度学习基础教程 [百度云下载链接](https://pan.baidu.com/s/1LHLvixtDJz7yDotIHwPYcw) 密码:rmsj
+- TensorFlow 官方文档中文版 [百度云下载链接](https://pan.baidu.com/s/1wVbngJq3THdAYGtFXxnI5Q) 密码:ni0k
+- Tensorflow 实战Google深度学习框架(完整版pdf) [百度云下载链接](https://pan.baidu.com/s/1QkVL5VnGrBaNA4Py5iqsGA) 密码:oivb
+
+
+### 深度学习框架-pytorch
+
+- Programming-PyTorch-for-Deep-Learning [百度云下载链接](https://pan.baidu.com/s/19NF6mPrkeVnqrjAHaAGxvg) 密码:2v1c
+
+### 深度学习框架-keras
+
+- Python For Data Science Cheat Sheet Keras [百度云下载链接](https://pan.baidu.com/s/1ODoojrUQl8rPFV2kxM1cbg) 密码:b8ll
+- Keras中文手册 [百度云下载链接](https://pan.baidu.com/s/1t83iFvuIxJRJ6W_j77Bafw) 密码:w5df
+
+### 深度学习
+
+- deeplearning深度学习笔记 [百度云下载链接](https://pan.baidu.com/s/1LL4nBvQ09Idy-6IAWeZzig) 密码:aaxv
+- 深度学习_中文版 [百度云下载链接](https://pan.baidu.com/s/1xh5CIyelL2traBRPm-c6LA) 密码:nq4w
+- 深度学习入门:基于Python的理论与实现 [百度云下载链接](https://pan.baidu.com/s/10cquG__AurkTacnp6iKJcA) 密码:lvj7
+- 常用推荐算法(50页干货) [百度云下载链接](https://pan.baidu.com/s/1LU6UlFTiSUSjwCQq2XLXlA) 密码:wiqd
+- 动手学深度学习-李沐 [百度云下载链接](https://pan.baidu.com/s/1Ox8cTBwxUia2oZawvGMqsg) 密码:f33l
+- 深度学习(最全的中文版) [百度云下载链接](https://pan.baidu.com/s/1R5SvO6kACs16aMO3kV9MlA) 密码:cxxi
+
+
+### 机器学习实战
+
+- 机器学习实战(附所有代码) [百度云下载链接](https://pan.baidu.com/s/1to5tvBtfq6gnRU2Bmi4SAg) 密码:6o5p
+- PYTHON机器学习及实践-**从零开始通往KAGGLE竞赛之路** [百度云下载链接](https://pan.baidu.com/s/1qTGsUkhRCAbIeszRZzpnNg) 密码:z87v
+- 贝叶斯思维统计建模的Python学习法 [百度云下载链接](https://pan.baidu.com/s/1iok5j7-kABCtoid8YoEryA) 密码:6qby
+
+
+
+### 理论-周志华(机器学习)李航(统计学原理)等
+
+- 机器学习_周志华 [百度云下载链接](https://pan.baidu.com/s/1XabgcxQUp0udkn00b0uqfw) 密码:oug5
+- 统计学习方法-李航 [百度云下载链接](https://pan.baidu.com/s/1u1q37b8vQBwUOck5vTE1Uw) 密码:yu0u
+
+### 自然语言处理(NLP)
+
+- 斯坦福CS224n_自然语言处理与深度学习 [百度云下载链接](https://pan.baidu.com/s/1S5kBuHhtCKXlB3k6IuuDyw) 密码:n7rx
+- Writing Code for NLP Research [百度云下载链接](https://pan.baidu.com/s/1sT7kKilkXxedYv4Dog_adg) 密码:am91
+- 语音与语言处理Speech+and+Language+Processing [百度云下载链接](https://pan.baidu.com/s/1Zu_PUmLiB9n3nDcagCsv4Q) 密码:4ysu
+- deep_learning_for_nlp [百度云下载链接](https://pan.baidu.com/s/1hgmnPVKhpc8lxOp_Onfvng) 密码:r2ma
+- Embedding Methods for NLP emnlp tutorial [百度云下载链接](https://pan.baidu.com/s/1CaS0DWw5uSvHXCsz6VkfVA) 密码:g1oy
+- PYTHON自然语言处理中文翻译 NLTK 中文版 [百度云下载链接](https://pan.baidu.com/s/1xJHF99KX011C-KluEaNq7w) 密码:112z
+
+# AI面试系列
+
+- 机器学习 [百度云下载链接](https://pan.baidu.com/s/1qDqmFjRiOOPQ6nQO8ABFbA ) 密码:ikee
+- 机器学习常见面试题 [百度云下载链接](https://pan.baidu.com/s/1n53vfCNDbe8kWSTZdW7rNA) 密码:8w3r
+- 百面_机器学习 算法工程师带你去面试。高清版带书签 [百度云下载链接](https://pan.baidu.com/s/16PAgoNenlm4P6KlfHEmjNA ) 密码:nzqr
+
+
+# 大数据系列
+
+### Hadoop
+
+- Hadoop The Definitive Guide [百度云下载链接](https://pan.baidu.com/s/1fZohTOxScoH44_5LNETZsw) 密码:fz20
+
+### Spark
+
+- Spark大数据处理:技术、应用与性能优化(全) [百度云下载链接](https://pan.baidu.com/s/1YmOgV7N6UsxjsW27W_VcEg ) 密码:t4cn
+- Spark最佳实践 [百度云下载链接](https://pan.baidu.com/s/1WOAb6iOdrx-M1UzTrrIn0A) 密码:963f
+- 图解Spark++核心技术与案例实战 [百度云下载链接](https://pan.baidu.com/s/1Z3_v8G6PzQ6E6WUXvn6_KA) 密码:ju28
+- Spark快速大数据分析 [百度云下载链接](https://pan.baidu.com/s/1Xk9YSD7NCc_tofmyXIWI9A) 密码:9ai8
+- 深入理解Spark:核心思想与源码分析 [百度云下载链接](https://pan.baidu.com/s/1hdC0kvxFP_grpFRhj0qltQ) 密码:mopd
+- Spark机器学习 [百度云下载链接](https://pan.baidu.com/s/1AEYKo_bxwtOXG0HErGLXqg) 密码:jmib
+
+
+### Scala
+
+- Scala编程中文版(33章全) [百度云下载链接](https://pan.baidu.com/s/1YCVBnHp6ud0HYR8Cd5DNYQ) 密码:wkmi
+
+### 其他
+
+- 大数据架构师指南 [百度云下载链接](https://pan.baidu.com/s/14Rxan_IhRKCfpr7GJFeQ2Q) 密码:3dtd
+- 大数据之路:阿里巴巴大数据实践 [百度云下载链接](https://pan.baidu.com/s/1WTZjCmuwlaBUTxTAaBjgpg) 密码:5123
+- Apache+Kylin权威指南 [百度云下载链接](https://pan.baidu.com/s/1vVjn9tP-Z_QK7AaasyCj7A) 密码:0ypz
+- Kafka & Mafka技术分享及讨论 [百度云下载链接](https://pan.baidu.com/s/1BbNHZGFHioSoBQ4Zm3Jnfg) 密码:w7qs
+- 【高扬】白话深度学习姊妹篇--白话大数据与ML [百度云下载链接](https://pan.baidu.com/s/1O2lcJ-cvWTZjbKuGgLPdcw) 密码:d9yp
+
+
+# C语言
+
+- C Primer Plus [百度云下载链接](https://pan.baidu.com/s/1uKLaF1_TlHrcLZCe9Th5bw) 密码:njif
+- C和指针 [百度云下载链接](https://pan.baidu.com/s/1D1C93Y6qcwC3Z7lv3hpEeA) 密码:22lz
+- C专家编程 [百度云下载链接](https://pan.baidu.com/s/19cSD4k4d5cdu0nZWZq4MRg) 密码:eik1
+- C语言解析教程 [百度云下载链接](https://pan.baidu.com/s/1ARQBYbjWKgZq7jJVl8GPfw) 密码:o9ej
+- C程序设计语言-各种版本的C程序设计语言及其课后题答案 [百度云下载链接](https://pan.baidu.com/s/1ssyYVh0ZtSKko1hXYI2_pQ) 密码:5zl9
+- 经典C程序100例 [百度云下载链接](https://pan.baidu.com/s/1wj32oi-7pwjjGPamCzcdAw) 密码:ww8k
+- C语言编程精粹 [百度云下载链接](https://pan.baidu.com/s/1p6pZovi4UmQAdzO253nKKg) 密码:22df
+- C语言参考手册 [百度云下载链接](https://pan.baidu.com/s/1E4zVZDD-HFOkI9xVIEs9Fg) 密码:db3g
+- C语言函数大全 [百度云下载链接](https://pan.baidu.com/s/1GQfFi9qtN_cnykkFsv9Zjg) 密码:14cm
+- C语言深度剖析 [百度云下载链接](https://pan.baidu.com/s/1UL5R9cF3oipNXguQZ2xsCA) 密码:2lvj
+
+
+# C++
+
+- C++大学教程 [百度云下载链接](https://pan.baidu.com/s/1u0xKMjQyLeytrn0ZV7_amw) 密码:cuvn
+- STL源码剖析 [百度云下载链接](https://pan.baidu.com/s/1fLWhQnmVyksk3BpmG_zGfQ ) 密码:o9rv
+- C++编程思想 [百度云下载链接](https://pan.baidu.com/s/1Uyt9Uhv7Jy80ykzPwes9Yg) 密码:q97e
+- C++沉思录中文第2版 [百度云下载链接](https://pan.baidu.com/s/1VvGqaVso5eqIEMoeGkOpLA) 密码:xrxv
+- C++ Primer [百度云下载链接](https://pan.baidu.com/s/11uKddTH2DhpKMILljyh0bw) 密码:aeao
+- 深入探索C++对象模型 [百度云下载链接](https://pan.baidu.com/s/1wKHreRYK1ngSmAjU3LUjNQ) 密码:qltd
+- C++对象模型 [百度云下载链接](https://pan.baidu.com/s/1RhaifqkDc2D125yg1SmlmQ) 密码:6zpm
+- C++ Templates [百度云下载链接](https://pan.baidu.com/s/1xZXozU-d8dEOBzezqLf8Vg) 密码:rmt1
+- C++编程规范-101条规则准则与最佳实践 [百度云下载链接](https://pan.baidu.com/s/1ymum8hAGzObRG8stFYNddg) 密码:7f7s
+- C++设计新思维-泛型编程与设计之应用 [百度云下载链接](https://pan.baidu.com/s/1Ht1Ji11v52P_p4gY6osuvA) 密码:nail
+- Effective STL 中文版 [百度云下载链接](https://pan.baidu.com/s/16kaPHB9MgHVamNX6K84Z5w) 密码:86q5
+- More Effective C++中文版 [百度云下载链接](https://pan.baidu.com/s/13sO6Ct64A-SHBdCeL0JgsA) 密码:c7av
+
+# Java
+
+### Java基础
+
+- 码出高效 [百度云下载链接](https://pan.baidu.com/s/1Nu-r8G8EAIo62J4FzYoKVw) 密码:nedl
+- Head First Java [百度云下载链接](https://pan.baidu.com/s/16zkC7riCEo3Cnt-3BllUJg) 密码:f39y
+- Java并发编程实践 [百度云下载链接](https://pan.baidu.com/s/1gSyCcJl2OheOqkQhHtfTNg) 密码:fwhs
+- Java从小白到大牛 [百度云下载链接](https://pan.baidu.com/s/1FFxvNltEY34Pba_dRd_kqg) 密码:tolg
+- 深入理解Java虚拟机 [百度云下载链接](https://pan.baidu.com/s/1pYyEgyf5kl9tQB-XGd32EQ) 密码:vfzi
+- Java8实战 [百度云下载链接](https://pan.baidu.com/s/1rTV7cC382rUWxpb7U8WCRA) 密码:57bv
+- Java编程思想 [百度云下载链接](https://pan.baidu.com/s/1JITtexXMiLCwQlW5YI2GRQ) 密码:8xli
+- Java并发编程的艺术 [百度云下载链接](https://pan.baidu.com/s/1xhFNTE1ywJxmhvDuemqo5A) 密码:tauv
+- 阿里巴巴Java开发手册 [百度云下载链接](https://pan.baidu.com/s/1HYeuwkENhh2Nbfav1WI1lw) 密码:98zo
+
+### Java进阶
+
+- 代码大全 [百度云下载链接](https://pan.baidu.com/s/1dfRdyevYc7xVPjb0wcja6Q) 密码:o3zq
+- Java性能优化权威指南 [百度云下载链接](https://pan.baidu.com/s/1ClJMQlWPq6FDb_XJxleizQ) 密码:4tfv
+- 敏捷软件开发 [百度云下载链接](https://pan.baidu.com/s/1iYeZ5AqyQLBTDuug5_rnSA) 密码:8uqr
+- Effective Java [百度云下载链接](https://pan.baidu.com/s/1m7OVyyhgjbs6HSIt_zeRvw) 密码:74ba
+- 代码整洁之道 [百度云下载链接](https://pan.baidu.com/s/1ATMm0vmDURZqxMv9lIht_g) 密码:0jco
+- Effective Java(**英文版**) [百度云下载链接](https://pan.baidu.com/s/17VvfSKSdLWtezMcQYF7rqw) 密码:jk2z
+
+### JavaWeb
+
+- 轻量级JavaEE企业应用实战 [百度云下载链接](https://pan.baidu.com/s/1AZUULdcVFSArx1Jbiz1I8w) 密码:uwge
+- Head First Servlet and JSP [百度云下载链接](https://pan.baidu.com/s/1XQ4xBQvWxfhWhPp1y7WzMA) 密码:xlpu
+- Maven实战 [百度云下载链接](https://pan.baidu.com/s/1hpGhWnn7wZFrI3PDzfvrvg) 密码:zjt5
+- Spring实战 [百度云下载链接](https://pan.baidu.com/s/1SSFmd3KewFbouXQL6N19xQ) 密码:z32s
+- 深入分析JavaWeb技术内幕 [百度云下载链接](https://pan.baidu.com/s/1WuOFZuBdeui2gohif0c-2g) 密码:2gcd
+- 深入剖析Tomcat [百度云下载链接](https://pan.baidu.com/s/1Qr6WaBh_pkq-i8hIpu6f7A) 密码:o4tr
+- Camel in Action [百度云下载链接](https://pan.baidu.com/s/1dbp0zXE6xs3XMiJYq04uNw) 密码:itrz
+
+# 设计模式
+
+- 研磨设计模式 [百度云下载链接](https://pan.baidu.com/s/196JsKSEtDoKYZB3yYIigjg) 密码:a0xy
+- 图解设计模式 [百度云下载链接](https://pan.baidu.com/s/1JCX_9HtlWxHy9XcpXyoyTA) 密码:ba3z
+- Head First设计模式《important》 [百度云下载链接](https://pan.baidu.com/s/1v_7byjgNEwZCEisJltlzHA) 密码:v2rl
+
+# 数据库
+
+- SQL查询的艺术 [百度云下载链接](https://pan.baidu.com/s/1Fucoluf9TQn9a6Vq-XchPA) 密码:xfrz
+- MySQL必知必会 [百度云下载链接](https://pan.baidu.com/s/1xKPH21U4OJwWWqV4gWX0hQ) 密码:hwk3
+- 高性能MySQL [百度云下载链接](https://pan.baidu.com/s/1G1E-HucJYQ32lvtlIZJbPw) 密码:sjp8
+- MySQL技术内幕InnoDB存储引擎 [百度云下载链接](https://pan.baidu.com/s/1PKjeIt5Wrq9hRkYxA3YMtg) 密码:lsto
+- MongoDB权威指南 [百度云下载链接](https://pan.baidu.com/s/1pdCKtNdA2YLMzgmbfMs5kQ) 密码:cw6a
+- SQLite 权威指南 [百度云下载链接](https://pan.baidu.com/s/18ldoXc9cWyQ78UROeud-SQ) 密码:b58t
+
+# 前端
+
+- HTML5与CSS3基础教程 [百度云下载链接](https://pan.baidu.com/s/1uGoURdRyKOOspvHJSyor1w) 密码:7srp
+- Bootstrap实战 [百度云下载链接](https://pan.baidu.com/s/1Jw34Xuj2_2q9bICm3yFlkw) 密码:fnf0
+- jQuery高级编程 [百度云下载链接](https://pan.baidu.com/s/1Al0WLj-6tNKHfDr319XJ0w) 密码:zx8d
+- 疯狂aJax讲义 [百度云下载链接](https://pan.baidu.com/s/1Mc1fuKtqL-F9VYI4n3RxPQ) 密码:3szv
+- jQuery技术内幕 [百度云下载链接](https://pan.baidu.com/s/1tnr-VAMKqSDv0qjtu9rywA) 密码:crcu
+- JavaScript DOM编程艺术 [百度云下载链接](https://pan.baidu.com/s/1Un4NvZZ7x-HaOViCIcNNeA) 密码:rn2e
+- HTML5揭秘 [百度云下载链接](https://pan.baidu.com/s/1TfP15JglC7rgI_M1UaIimQ) 密码:g3av
+- 【JavaScript高级程序设计(第3版)】中文 高清 [百度云下载链接](https://pan.baidu.com/s/1-kWjkZ9taGTxnCdLRGqscg) 密码:2bnz
+- JavaScript高效图形编程 [百度云下载链接](https://pan.baidu.com/s/1yj4mh_aC8dXsIJn09UWPQQ) 密码:hxhk
+- jQuery权威指南 [百度云下载链接](https://pan.baidu.com/s/1e_bo4bQmBB1rrkAwB9xZ3Q) 密码:jgsq
+- Node.js开发指南 [百度云下载链接](https://pan.baidu.com/s/1GJ_dmgJMM6Bb2zBsOeH7hw) 密码:4bie
+- HTML5揭秘 [百度云下载链接](https://pan.baidu.com/s/1TfP15JglC7rgI_M1UaIimQ) 密码:g3av
+
+# Linux
+
+- Linux系统命令及shell脚本实践指南linuxunix技术丛书 [百度云下载链接](https://pan.baidu.com/s/1G1EI-amN7DN5Vuz8NLztKA ) 密码:9d27
+- 鸟哥的Linux私房菜 [百度云下载链接](https://pan.baidu.com/s/10tCGLa9y5G-VNefEexIDeQ) 密码:djoc
+- Linux高级程序设计 [百度云下载链接](https://pan.baidu.com/s/1oLBCW3lVBZLcSQnx5XbZMg) 密码:6d08
+- 汇编语言基于linux环境第3版 [百度云下载链接](https://pan.baidu.com/s/1fm7gt4qFiEMfNzAB5rfDfA) 密码:c7k8
+- Linux命令详解词典 [百度云下载链接](https://pan.baidu.com/s/18mp0g_eVLQPkhZSuvVBu1Q) 密码:ukq3
+- Linux防火墙 [百度云下载链接](https://pan.baidu.com/s/1i52MZc8FC9H8HKjL2uCfWA) 密码:14p6
+- 深入Linux内核架构 [百度云下载链接](https://pan.baidu.com/s/13TfK2DCWVxeMdV5Y40nDOw) 密码:h1k5
+- Linux环境编程 [百度云下载链接](https://pan.baidu.com/s/1BsPOjilroe6nHk3PXU-4Bg) 密码:fyrn
+- 精通正则表达式 [百度云下载链接](https://pan.baidu.com/s/1cP5pPjkSUyDUEdGeKbHHUw) 密码:jzgx
+- Linux常用命令大全 [百度云下载链接](https://pan.baidu.com/s/1t98pEifGrfUYqiLCMx5rgg) 密码:7v30
+
+
+
+
+# Go
+
+- Go语言实战 [百度云下载链接](https://pan.baidu.com/s/1v4LSutDDJgkm6Ag1GCnfQQ) 密码:3wmy
+- Go web编程 [百度云下载链接](https://pan.baidu.com/s/1mumaypjjR39ZzddL3IFYsg) 密码:3e3f
+- redis实战 [百度云下载链接](https://pan.baidu.com/s/1xJ9nJkeAsFF924uPEuMqqQ) 密码:ufxn
+- 学习Go语言 [百度云下载链接](https://pan.baidu.com/s/1vVCSRsMvaDwuTZi3iWtzQg) 密码:0hzt
+
+# Git
+
+- 《Pro Git》中文版 [百度云下载链接](https://pan.baidu.com/s/1-JIkWeIIRzJwP3h4-H2sQQ) 密码:1zrt
+- 快速入门Git [百度云下载链接](https://pan.baidu.com/s/1jRUzM5KwK94FFTS2e86lyw) 密码:0u6n
+- 专业git中文 [百度云下载链接](https://pan.baidu.com/s/1nx2_xQ71na8p7JYtL59J5A) 密码:lsdl
+- Git参考手册 [百度云下载链接](https://pan.baidu.com/s/18QC1-p_yGw4ILqB-v8XPHw) 密码:qq2v
+
+# 数字信号
+
+- 数字信号处理教程 第3版 by 程佩青 (z-lib.org) [百度云下载链接](https://pan.baidu.com/s/11xO0H9pWiADvM9435OmlKw ) 密码:tvmt
+
+
+
+# 提升能力
+
+- 重构:改善既有代码的设计(第2版) [百度云下载链接](https://pan.baidu.com/s/1ZDP7cMNQppfyogJ6X53LVg) 密码:7lve
+- 码农翻身 [百度云下载链接](https://pan.baidu.com/s/1blFwoNWdMmTfPyyvb_3s6w ) 密码:5c26
+- 浪潮之巅 [百度云下载链接](https://pan.baidu.com/s/11I2DZtrgJaY1OvRJZg6FqQ ) 密码:6416
+- 程序员面试宝典 [百度云下载链接](https://pan.baidu.com/s/1e9I4on3zsfNLE9WFqEZxhQ) 密码:ukzv
+- 奔跑吧,程序员:从零开始打造产品、技术和团队 [百度云下载链接](https://pan.baidu.com/s/1yZKsc1NoQgHrlI1eeOZFkw ) 密码:43ul
+
diff --git "a/content/post/old/linkedlist\345\210\240\351\231\244\346\214\207\345\256\232\345\200\274.md" "b/content/post/old/linkedlist\345\210\240\351\231\244\346\214\207\345\256\232\345\200\274.md"
new file mode 100644
index 00000000..d6bf2f0e
--- /dev/null
+++ "b/content/post/old/linkedlist\345\210\240\351\231\244\346\214\207\345\256\232\345\200\274.md"
@@ -0,0 +1,30 @@
++++
+
+title = "linkedlist删除指定值"
+date = "2021-06-01"
+author = "kasusa"
+cover = ""
+tags = ["csharp"]
+description = "如何删除linked list中的指定值"
+showFullContent = false
+
++++
+
+info是我自己定义的一个类。
+
+下面是如何删除linklist中指定item的办法。
+
+```cs
+LinkedList infolist = new LinkedList();
+
+string todelete = "1";
+
+info tmpitem = new info();
+foreach (var item in infolist)
+{
+ if (item.no == todelete)
+ tmpitem = item;
+}
+infolist.Remove(tmpitem);
+```
+
diff --git a/content/post/old/linux-v2ray setup.md b/content/post/old/linux-v2ray setup.md
new file mode 100644
index 00000000..69726dcb
--- /dev/null
+++ b/content/post/old/linux-v2ray setup.md
@@ -0,0 +1,19 @@
++++
+
+title = "ubuntu安装Qv2ray"
+date = "2021-05-29"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "Qv2ray"]
+keywords = ["hugo2", ""]
+description = ""
+showFullContent = false
+
++++
+> replace your source with tuna speed up apt-update : https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
+
+> this is for ubuntu , but igeuss it will working well on other linux machines too.
+1. download Qv2ray here: https://github.com/Qv2ray/Qv2ray/releases
+2. download v2ray-core here (linux-64 ver):https://github.com/v2ray/v2ray-core/releases
+3. before open Appimage file you should give it permission! : `chmod 777 *`
+4. set up subscribe follow this instruction :https://qv2ray.net/getting-started/step3.html#通过订阅地址导入
diff --git a/content/post/old/macos_essencials.md b/content/post/old/macos_essencials.md
new file mode 100644
index 00000000..dd2a4d65
--- /dev/null
+++ b/content/post/old/macos_essencials.md
@@ -0,0 +1,84 @@
++++
+title = "mac essencials"
+description = ""
+date = 2022-07-02T20:03:07+08:00
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+# mac必装软件
+- 粘贴版历史记录软件(AppleStore)
+
+![image](https://tvax1.sinaimg.cn/large/0083vuQJly1h3su6ef38mj30kk09amyk.jpg)
+- 快捷键设置软件(可以设置快捷键打开任何安装的应用)(AppleStore)
+
+![image](https://tva2.sinaimg.cn/large/0083vuQJly1h3su7a8wj3j307u096t9c.jpg)
+- 解压软件(如果碰到了rar之类的,就需要第三方软件了)(AppleStore)
+
+![image](https://tvax3.sinaimg.cn/large/0083vuQJly1h3su954sxkj309g0aa3zm.jpg)
+
+- 滚轮优化软件
+
+ 在macos中,你的触摸板和鼠标滚轮的方向只能是一样的,这让我非常不习惯,我比较喜欢触摸板反转,但是滚轮是正常方向。
+
+ - [ Scroll Reverser ](https://pilotmoon.com/scrollreverser/)
+ - [ Mos ](https://github.com/Caldis/Mos) ⬅️ 我更喜欢这个,还能让鼠标滚动更平滑
+
+![image](https://tvax2.sinaimg.cn/large/0083vuQJly1h3suamga44j30k009m40v.jpg)
+
+- [clashX]( https://github.com/yichengchen/clashX)
+
+![image](https://tva3.sinaimg.cn/large/0083vuQJly1h3susw0jtfj30bo09w3zu.jpg)
+
+- 微软远程桌面(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) (预览版免费,还支持m1)
+
+![image](https://tvax3.sinaimg.cn/large/0083vuQJly1h3sux0ldadj30cm09sgmr.jpg)
+
+- [VLC](https://www.videolan.org/vlc/) mac的Quicktime支持格式不全,所以我有装这个。(视频软件我其实更想要mpv但是mpv还么有原生支持m1的版本--要自己编译啥的,坑挺多的)
+
+![image](https://tvax3.sinaimg.cn/large/0083vuQJly1h3sv1jsbnoj30ag09k3zi.jpg)
+
+- [Snipaste](https://www.snipaste.com/) 截图软件--平常我都用自带的,但是有的时候需要钉住图片或者需要从剪切板预览的时候他还是很好用的。
+
+![image](https://tvax4.sinaimg.cn/large/0083vuQJly1h3sv6oesrdj30as08igm0.jpg)
+
+# mac常备脚本
+
+Mac 的网络硬件地址更换:
+```
+sudo /System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport -z
+sudo ifconfig en0 ether 2d:d4:e8:f8:e0:c6
+```
+
+在重启之后,mac会恢复成硬件默认值,不过我还是推荐备份一下
+
+---
+
+ ~/.zshrc
+```conf
+# path加入ptyhon pip
+export PATH=~/bin:/Users/kasusa/Library/Python/3.8/bin:$PATH
+# 增加ll功能
+alias ll='ls -lG'
+#显示有颜色的用户(不适合白色背景)
+export PS1="%10F%m%f:%11F%1~%f \$ "
+
+
+```
+
+---
+
+# 包管理器
+
+https://brew.sh/ 这是homebrew,可以像是apt一样用,但是可能需要先给shell挂代理。
+
+![image](https://tva4.sinaimg.cn/large/0083vuQJly1h3svdogcxyj31em0iin0u.jpg)
+
diff --git a/content/post/old/my-zsh.md b/content/post/old/my-zsh.md
new file mode 100644
index 00000000..785b9253
--- /dev/null
+++ b/content/post/old/my-zsh.md
@@ -0,0 +1,51 @@
++++
+
+title = "安装zsh和配置主题"
+date = "2021-05-29"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "命令行"]
+keywords = ["hugo2", ""]
+description = "实际上是抄袭主题"
+showFullContent = false
+
++++
+
+> zsh 有很多实用功能,下面安装和配置ohmyzsh的教程:
+# 安装zsh
+```
+sudo apt install zsh
+```
+
+# 提前安装所需的字体
+```
+sudo apt-get install fonts-powerline
+```
+[powerline-GitHub](https://github.com/powerline/fonts)
+
+# 抄国光的作业
+```
+sh -c "$(curl -fsSL https://github.com/Cabbagec/termux-ohmyzsh/raw/master/install.sh)"
+```
+
+# .zshrc配置
+1. 打开配置文件
+```
+code .zshrc
+```
+2. 在.zshrc中加入下面这行( 去掉每行的 username@host )
+```
+export DEFAULT_USER="$(whoami)"
+```
+
+# ubuntu terminal 配置
+
+1. profiles-colors 配置主题颜色,要让主题够好看,对比色都强烈
+2. profiles-command 吧zsh代替默认shell,这样每次打开terminal默认就是zsh了!
+
+## 常用快捷键:
+
+ 按键 | 功能 | 备注
+---------|----------|---------
+`ctrl` + `-` | 缩小terminal |
+`ctrl`+ `shift + `+` | 放大terminal |
\ No newline at end of file
diff --git "a/content/post/old/nessus \346\227\240\346\263\225\350\256\277\351\227\256\347\232\204\350\247\243\345\206\263\345\212\236\346\263\225 for mac.md" "b/content/post/old/nessus \346\227\240\346\263\225\350\256\277\351\227\256\347\232\204\350\247\243\345\206\263\345\212\236\346\263\225 for mac.md"
new file mode 100644
index 00000000..bc7c4103
--- /dev/null
+++ "b/content/post/old/nessus \346\227\240\346\263\225\350\256\277\351\227\256\347\232\204\350\247\243\345\206\263\345\212\236\346\263\225 for mac.md"
@@ -0,0 +1,77 @@
++++
+title = "nessus 无法访问的解决办法 for mac and win"
+description = ""
+date = 2023-06-05T13:00:07+08:00
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "nessus"
+]
+series = []
+images = []
++++
+> 本篇内容全程推荐使用chrome而不是safari,safari还是没有办法进入的。
+
+nessus 是一款漏洞扫描软件,在我开始使用mac之后,我尝试安装并使用它,但是出现了一些问题,下面来记录下:
+
+## 正常开启关闭的方法
+在mac设置里面,最下面有一个nessus按钮,进去,解锁,然后就可以开启/停止nessus了。
+nessus在不扫描的时候几乎没有负载,所以开机启动我也留着了。
+
+开启后,nessus会在此处运行:[https://localhost:8834/##/](https://localhost:8834/##/)
+
+![image](https://image.baidu.com/search/down?url=https://tva2.sinaimg.cn/large/0083vuQJly1h3wgdnrit6j311211mtia.jpg)
+
+![image](https://image.baidu.com/search/down?url=https://tva2.sinaimg.cn/large/0083vuQJly1h3wge5qo83j310m0iajtm.jpg)
+
+## 问题描述
+安装nessus后,chrome提示如下:
+
+![image](https://image.baidu.com/search/down?url=https://tva2.sinaimg.cn/large/0083vuQJly1h3wgcgzsytj31wg192b2a.jpg)
+
+## 解决办法
+
+在chrome这个错误界面直接输入: `thisisunsafe` ,然后chrome就明确你知道自己在做什么,然后放行你。
+
+![image](https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn/large/0083vuQJly1h3wgiwv4y9j31tq17g4qp.jpg)
+
+你要打开这个链接(可能需要先登陆):[https://localhost:8834/getcert](https://localhost:8834/getcert) , 会下载一个证书文件,接下来我们要手动信任这个证书
+
+![image](https://image.baidu.com/search/down?url=https://tvax4.sinaimg.cn/large/0083vuQJly1h3wgksfoc6j30dm050q4c.jpg)
+
+先打开“钥匙串访问”程序,然后双击这个证书文件,证书会自动安装,但是此时是不信任的状态(有个叉叉)
+
+![image](https://image.baidu.com/search/down?url=https://tvax3.sinaimg.cn/large/0083vuQJly1h3wgmol29dj31bk0ruzt1.jpg)
+
+接下来我们需要双击这个证书,然后点开信任菜单栏,并且勾选始终信任,修改后系统会要求sudo权限
+
+![image](https://image.baidu.com/search/down?url=https://tvax3.sinaimg.cn/large/0083vuQJly1h3wgoceajxj30rs0o24dk.jpg)
+
+## 对于 windows
+windows信任证书的操作和mac有些差别:
+1. 打开这个链接 :[https://localhost:8834/getcert](https://localhost:8834/getcert)
+2. 安装证书的时候,选择指定存储路径,浏览-受信任的根证书颁发机构
+![Imgur](https://i.imgur.com/XTwuUTL.png)
+
+## 结束
+这样应该就能正常访问了,以后也不会有问题了。
+
+主要学到了一招就是 `thisisunsafe` 大概能用在任何chrome信任失效界面上,可以去强制访问。
+
+不过我还是不理解,为啥电脑要不信任localhost……
+
+## HSTS 错误
+
+需要解决这个保存,除了打字: `thisisunsafe` ,还可以通过chrome设置来临时放行:
+
+首先打开chrome这个设置界面 [chrome://net-internals/##hsts](chrome://net-internals/##hsts)
+
+滚动到最下方,输入`localhost`,点击`delete`。
+
+![image](https://image.baidu.com/search/down?url=https://tva3.sinaimg.cn/large/0083vuQJly1h3wgy8tcjhj31su0qu11p.jpg)
+
+就可以访问 HSTS 不允许的网站了。
\ No newline at end of file
diff --git "a/content/post/old/pip\351\205\215\347\275\256\346\272\220.md" "b/content/post/old/pip\351\205\215\347\275\256\346\272\220.md"
new file mode 100644
index 00000000..4948333a
--- /dev/null
+++ "b/content/post/old/pip\351\205\215\347\275\256\346\272\220.md"
@@ -0,0 +1,53 @@
++++
+title = "pip配置源"
+description = ""
+date = 2022-05-19T10:21:58+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "python"
+]
+series = []
+images = []
+
++++
+
+如何给pip配置代理;
+
+# 将pip加入环境变量
+
+可以通过下面的指令来查看自己的python安装在什么位置:
+
+```shell
+python -c "import sys; print(sys.executable)"
+```
+
+![image](https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn/large/006rgJELly1h2di42uwzmj30ux0heah6.jpg)
+
+应该会存在这样一个目录:`...\Python310\Scripts\`,里面会有好多pip相关的exe,我们要把这scripts文件夹加到`环境变量(user)`里面去就好了!
+
+# pip 配置源
+
+你需要进入用户目录,然后建立一个pip文件夹,例如这样:`C:\Users\kasusa\pip`
+
+这个目录下,需要新建一个`pip.ini`文件
+
+```ini
+[global]
+index-url = http://mirrors.cloud.tencent.com/pypi/simple/
+[install]
+trusted-host=mirrors.cloud.tencent.com
+```
+
+# 速度测试
+
+![image](https://image.baidu.com/search/down?url=https://tva4.sinaimg.cn/large/006rgJELgy1h2dic1br59j30ux0dp49t.jpg)
+
+好快呀!
+
diff --git a/content/post/old/postspiponmac.md b/content/post/old/postspiponmac.md
new file mode 100644
index 00000000..07217858
--- /dev/null
+++ b/content/post/old/postspiponmac.md
@@ -0,0 +1,91 @@
++++
+title = "pip on mac"
+description = ""
+date = 2022-06-25T22:03:07+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+
+mac自带了python,但是竟然不带pip,这篇文章将会教你如何在mac上面安装pip包管理器。
+
+> 这个文章是在mac上面写的哦,因为环境很难搞所以也蛮折腾的,不过这也是乐趣~
+> 本文章用mac(m1)编写,环境可能与intel版mac不同,请提前注意这一点。
+
+
+# pip安装脚本获取
+
+https://bootstrap.pypa.io/pip
+使用浏览器访问这个地址,应该有一个 get-pip.py 脚本,由于我不熟悉crul之类的工具,我选择手动复制下来。
+
+cmd + A , cmd + C , 复制全文,存到一边一会儿要用。
+![image](https://tvax4.sinaimg.cn/large/0083vuQJly1h3kunji5jej313w0t8e0o.jpg)
+
+
+
+# pip脚本的安装
+
+使用vim新建一个pip.py脚本文件,内容就是上面网页中的内容,你可以选择任何位置,不知道的话就放到家目录吧(因为很好找),然后,使用python3运行这个脚本文件
+
+> 图片右上角是我新创建的文件 pip.py,他的内容是从网页复制的
+
+
+![image](https://tva3.sinaimg.cn/large/0083vuQJly1h3kuzs0ljoj312i0gfwzi.jpg)
+
+# 配置环境变量
+脚本用黄色高量字体提醒了我们:
+ > WARNING: The scripts pip, pip3, pip3.10 and pip3.8 are installed in '/Users/kasusa/Library/Python/3.8/bin' which is not on PATH.
+
+pip安装的位置不在path中,所以我们要手动的加个环境变量。
+
+首先打开用户根目录,然后新建个`.zshrc`文件,zsh是mac的terminal的默认shell,`.zshrc`是zsh的配置文件,但是默认情况并不存在!
+
+新建之后在添加这一行即可:
+
+```
+export PATH=~/bin:/Users/kasusa/Library/Python/3.8/bin:$PATH
+```
+
+![image](https://tva1.sinaimg.cn/large/0083vuQJly1h3kv8fwyn9j31yw0luwkz.jpg)
+
+这个例子中包含了三个path(使用冒号分割):
+- ~/bin
+- ~/Library/Python/3.8/bin
+- $PATH
+
+他们分别是:
+- 我的自设path目录
+- python pip目录
+- 从系统继承的path
+
+> 注:`~`是`/Users/kasusa`的缩写
+
+# 使配置生效
+有两种方式使配置生效:
+1. 重新开启一个terminal
+2. 执行命令
+
+```
+source ~/.zshrc
+```
+
+# 成功结果展示
+![image](https://tva4.sinaimg.cn/large/0083vuQJly1h3kvhhp942j30zl0sg1kx.jpg)
\ No newline at end of file
diff --git "a/content/post/old/python-xml\345\222\214\350\257\273\345\217\226excel.md" "b/content/post/old/python-xml\345\222\214\350\257\273\345\217\226excel.md"
new file mode 100644
index 00000000..7c7abe17
--- /dev/null
+++ "b/content/post/old/python-xml\345\222\214\350\257\273\345\217\226excel.md"
@@ -0,0 +1,541 @@
++++
+title = "Python Xml和读取excel"
+description = ""
+date = 2022-08-08T19:35:59+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "python"
+]
+series = []
+images = []
+
++++
+
+最近我接到了一个工作,就是把一份很长很长的漏洞扫描报告导入到单位的“测评能手”工具中,但是这个工具不支持导入这个excel表格,所以我要艰难的手动录入。
+
+表格的长度有16000行,是对主机和数据库的漏扫内容,每一行有用的信息如下:
+
+| 主机 | 漏洞名称 | 危险等级 | 漏洞简述 | 详细描述 |
+| ----------- | ---------- | -------- | -------- | -------- |
+| xx.xx.xx.xx | xx版本过旧 | 低 | -- | -- |
+
+主机有几百台,包括8个项目所有的主机,每个项目又有一些自己的服务器和DB,他们提供了服务器和DB的ip列表,我的任务就是先把不同的项目的漏洞条目分好,然后通过手工的方式一条一条的导入漏洞
+
+# 把excel数据导入python
+
+## 安装PANDAS
+
+通过pandas可以读取表格的sheet页了:
+
+首先安装pandas、以及读取需要表格依赖openpyxl库:
+
+```sh
+pip install pandas -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
+pip install openpyxl -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
+```
+
+# 读取sheet(s)
+
+excel读取的时候需要选定sheet页,所以我们需要先获取sheet名称,
+
+可以通过`for x in sheet_names`来loop整个excel文件。
+
+```py
+xpath = input("输入excel文件地址:")
+# get all sheet names
+sheep_name = pd.ExcelFile(xpath)
+sheet_names = sheep_name.sheet_names
+```
+
+# 读取XLSX表格
+
+导入pandas库、读取xlsx文件
+
+```python
+import pandas as pd
+data = pd.read_excel('1.xlsx', sheet_name='Sheet1') #选取文件、要读取的sheet名
+print(data)
+```
+
+![image](https://tva4.sinaimg.cn/large/006rgJELly1gx9t65s9y4j308703uq3j.jpg)
+
+为了能操作到指定元素,我们需要先了解一下pandas的数据存储格式是什么:
+
+```python
+data = {
+ '列头1': ['Akey1', 'Akey2','Akey3'],
+ '列头2': ['Bkey1','Bkey2','Bkey3'],
+ '列头3': [np.nan, np.nan, np.nan]
+ }
+```
+
+所以,pandas读取进来的我这个表就是这样的:
+
+```
+print(data)
+---
+ 列头1 列头2 列头3
+0 Akey1 Bkey1 NaN
+1 Akey2 Bkey2 NaN
+2 Akey3 Bkey3 NaN
+```
+
+获取第一列的值(通过列头名称选择):
+
+```
+print(data['列头1'])
+print(data.列头1)
+---
+0 Akey1
+1 Akey2
+2 Akey3
+```
+
+获取第一行的值(通过列序号选择):
+```
+print(data.iloc[0])
+---
+列头1 Akey1
+列头2 Bkey1
+列头3 NaN
+```
+
+获取第一行的、第一列的值:
+
+```
+print(data.iloc[0].列头1)
+print(data.iloc[0][0])
+---
+Akey1
+```
+
+获取指定列、第一行的值:
+
+```
+print(data['列头1'][0])
+print(data.列头1[0])
+---
+Akey1
+```
+
+获取列头2为指定值的列头1内容:
+
+这里比较绕,不过无脑复制就好啦!而且这个取数据方式还是比较有用的。
+
+```
+datarow = data.loc[data['列头2'] == 'Bkey1']
+print(datarow.列头1)
+---
+Akey1
+```
+
+因为我的excel是数据源,我没有对修改excel和保存做深入研究,只有一句保存语句:
+
+[参考](https://zhuanlan.zhihu.com/p/333560640)
+
+```
+data.to_excel(excel_writer='demo.xlsx', sheet_name='sheet_1')
+```
+
+
+
+## 了解pandas
+
+其实仅仅为了处理excel还是没必要了解pandas了,不过网上写的教学不是很清楚都,所以我还是搜索并了解了pandas才弄明白怎么用。
+
+[pandas c语言中文网](http://c.biancheng.net/pandas/loc-iloc.html)
+
+```python
+# 单维度的资料:
+import pandas as pd
+
+data = pd.Series([20, 10, 15])
+print(data)
+print('最大值', data.max())
+print('中位数', data.median())
+
+# 所有data*2
+data = data * 2
+print(data)
+
+# 判定所有的data和20相等
+data = data == 20
+print(data)
+```
+
+
+```python
+# 双维度的资料(表格读取后的效果):
+-------------------
+ name salary
+0 amy 3000
+1 jhon 5000
+2 bob 4000
+
+# 双维度的资料(自定义字典输入pandas)
+data2 = pd.DataFrame(
+ {
+ "name": ['amy', 'jhon', 'bob'],
+ "salary": [3000, 5000, 4000]
+ }
+)
+print(data2)
+# 取得name列内容
+print(data2['name'])
+print("=========")
+# 取得特定的横向
+print(data2.iloc[0])
+
+# data = pd.read_excel('www2.xlsx', sheet_name='Sheet1')
+data["name"] # 竖着来的
+data.iloc[0] # 横着来的(ilocation - 0,1,2,3,4……)
+
+
+```
+
+## 过滤
+
+但是有时候我们不知道自己想要的是第几行,比如想要知道amy的工资,要怎么办呢?
+
+`data.loc`可以解决这个问题,比方说你可以提取`1,2`行让表格变成一个更小的表,所以我就可以组合语句,比方说这个地方有10个amy,你接可以拉一个amy表,看看谁的工资比较高。
+
+```python
+data2.loc[[1,2]] #返回第2,3行变成的小的表格
+data2["name"]=="amy" #返回amy所在行
+data_amy = data2.loc[ data2["name"]=="amy" ] #返回amy所在行变成的小的表格
+```
+
+## 遍历
+
+```python
+#dataInip是我通过想要的ip过滤的漏洞集合,
+#获取了data之后我要导入到自己的数据结构中,vul是我的数据结构的一部分,我会作为log进行打印
+vulcount = len(list(dataInip['级别']))
+
+for i in range(vulcount):
+ vul = [dataInip.iloc[i]['漏洞名称'], dataInip.iloc[i]['简述'], mydict[dataInip.iloc[i]['级别']], dataInip.iloc[i]['描述'], dataInip.iloc[i]['解决方案']]
+ print(vul)
+```
+
+# 缓存数据
+
+好久没有用python了我就忘记了怎么存储数据了,只会用最简单的变量了,上网简单的查了一下,可以通过这种方式来新建一个自己需要的数据结构:
+
+```python
+class ip_and_vuls:
+ ip = "123.456.789.456"
+ vuls = []
+
+#访问
+p1 = ip_and_vuls
+p1.ip #123.456.789.456
+#唯一的缺点就是用的时候得手动初始化, 用完了最好传出去copy
+```
+
+为什么我不用 __init__`初始化函数呢,因为我懒得学,而且这个操作更灵活(也更容易出现自己发现不了的bug)
+
+其实如果写代码逻辑够好的话,这种也没问题,但是逻辑如果糟糕一点就是一坨屎了。
+
+# XML
+
+为什么又说到这里呢,因为我最终的目的就是要把表格的内容转换成有效的xml,就可以直接导入而不用手动粘贴了。
+
+python的各种操作文件是我感觉异常简单的地方,c语言、java开个文件要好几行好复杂,python一行开了,一行输入完成了,一行又关好了。
+
+xml这里我学的不精,能用为主嘛。
+
+```python
+import xml.etree.ElementTree as ET
+
+# 获取xml(从外部文件读取)
+tree = ET.parse("xmlLearn.xml")
+# 获取xml根元素
+root = tree.getroot()
+# 打印xml(人不可读)
+print(ET.tostring(root))
+# 为根节点添加值
+root.set("launched","2021-11-18 10:23:15")
+
+# 为所有的investor节点添加一个属性 id
+id = 1
+for investor in tree.findall('investor'):
+ investor.set('id',str(id))
+ id += 1
+
+# 删除所有investor节点下的id
+for investor in tree.findall('investor'):
+ del(investor.attrib['id'])
+ id += 1
+
+#添加一个节点investor(!重点!)
+investor2 = ET.Element('investor')
+investor2.text = 'Karl Amber'
+root.append(investor2)
+
+# 选择特定investor(xpath看不懂)
+investor = root.find(".//investor[@id='4']")
+print(investor.text)
+
+# 输出到文件(没有缩进)
+tree.write("xmlLearn.xml")
+
+```
+
+![](https://tvax3.sinaimg.cn/large/006rgJELly1gwjmtdp4urj30e307awhc.jpg)
+
+这里我放一个图片希望大家看了可以懂,xml是一个嵌套树的结构,investor是root下面的,然而investor可以自己再有一个子节点(只要append就行了),xml是层级分明的文件结构
+
+不过默认输出有很大的问题啊(我感觉)一是没有缩进,二是不支持中文,我很困扰所以我找到了下面的解决办法,虽然解决了但是要多加两个import了。这两个import都是python自带的,不用安装。
+
+```python
+import codecs
+from xml.dom import minidom
+
+# 美丽输出xml
+f = open("money.xml")
+xmlstr = minidom.parseString(ET.tostring(root)).toprettyxml(indent=" ")
+with codecs.open("money.xml", "w", "utf-8") as f:
+ f.write(xmlstr)
+```
+
+对于我来说,我就只要增加节点,给节点加内容、最后按照等保标准导入格式输出一个xml就好了
+
+# 附件
+
+我的成品(私人库主要是有点敏感信息所以就暂时不公开了)[kasusa/exceltodata: -- (github.com)](https://github.com/kasusa/exceltodata)
+
+等级保护漏洞导入用xml格式:
+
+```xml
+
+
+
+
+
+
+
+ WINDOWS
+ Windows Server 2008
+
+
+
+
+
+ 缓存区溢出
+ 6.4
+ 3389
+ 中
+
+
+
+
+
+
+
+
+
+
+ 设置不当
+ 6.4
+ 3389
+ 中>
+
+
+
+
+
+
+
+
+
+
+ LINUX
+ RED HAT 9
+
+
+
+
+
+ 缓存区溢出
+ 6.4
+ 3389
+ 中
+
+
+
+
+
+
+
+
+
+
+ 设置不当
+ 6.4
+ 3389
+ 中
+
+
+
+
+
+
+
+
+
+
+
+
+ 1433
+ Microsoft SQL Server
+ Microsoft SQL Server 2008 R2
+
+
+
+
+
+ 弱口令
+ 高
+
+
+
+
+
+
+
+
+
+
+ 设置不当
+ 中
+
+
+
+
+
+
+
+
+
+
+ 1433
+ Microsoft SQL Server
+ Microsoft SQL Server 2008 R2
+
+
+
+
+
+ 弱口令
+ 6.4
+ 高
+
+
+
+
+
+
+
+
+
+
+ 弱口令
+ 6.4
+ 中
+
+
+
+
+
+
+
+
+
+
+
+
+ Apache tomcat
+ Microsoft Windows 2008 R2
+ JSP
+
+
+
+
+
+ 注入类
+ 高
+
+
+
+
+
+
+
+ STRING
+
+
+
+
+
+
+
+
+ INT
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 跨站脚本类
+ 高
+
+
+
+
+
+
+
+ 反射性
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+---
+
+python能提取excel还能处理,我就很开心了,还学到了xml相关的内容。
+
+今天花了5小时把上面所有东东从0学完,到直接把工具做好我感觉也够神的了我)
diff --git "a/content/post/old/python\346\223\215\344\275\234word.md" "b/content/post/old/python\346\223\215\344\275\234word.md"
new file mode 100644
index 00000000..f5d4035e
--- /dev/null
+++ "b/content/post/old/python\346\223\215\344\275\234word.md"
@@ -0,0 +1,24 @@
++++
+title = "Python操作word"
+description = ""
+date = 2021-12-07T23:12:32+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "python"
+]
+series = []
+images = []
+
++++
+
+# 用python操作word::docx库的使用方法
+
+python-docx这个库,说好用不好用,但是他是python上面唯一的选择,这里我就来简单的讲解一下它的使用方法,让小白看了能明白,会用的人可以从我下面拷贝点现成的函数避免重复造轮子。
+
diff --git "a/content/post/old/python\347\247\273\345\212\250\346\226\207\344\273\266\343\200\201\346\226\260\345\273\272\347\233\256\345\275\225.md" "b/content/post/old/python\347\247\273\345\212\250\346\226\207\344\273\266\343\200\201\346\226\260\345\273\272\347\233\256\345\275\225.md"
new file mode 100644
index 00000000..3f36a7c6
--- /dev/null
+++ "b/content/post/old/python\347\247\273\345\212\250\346\226\207\344\273\266\343\200\201\346\226\260\345\273\272\347\233\256\345\275\225.md"
@@ -0,0 +1,46 @@
++++
+title = "Python移动文件、新建目录"
+description = ""
+date = 2021-12-11T12:23:30+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "python"
+]
+series = []
+images = []
+
++++
+
+使用python移动文件和新建目录主要是用于大量的文档分类工作,以下是代码部分:
+
+```python
+import os #新建目录
+import shutil #复制文件
+# 新建一个文件夹out 然后把f.txt复制到out文件夹中:
+# r字符串可以不需要写\\,对于windows目录操作比较实用
+original = r'f.txt'
+target = r'out\f.txt'
+
+if not os.path.exists('out'): #当文件已存在时,无法创建该文件所以需要先检查
+ os.mkdir(r'out')
+shutil.copyfile(original,target) #复制文件
+```
+
+下面来一个实用的例子,把一个文件夹中,文件名称包含了“xxx系统”的文件都放到指定文件夹中:
+
+```python
+mylist = os.listdir('文件目录') # 获取某个目录下的全部文件名称
+
+for item in mylist:
+ if item.__contains__('系统名称'):
+ shutil.copy('文件目录' + '\\' + item, '输出目录' + "\\" +item )
+```
+
+它最大的实用性就在对于多个文件的自定义命名。很方便。
diff --git a/content/post/old/shell.md b/content/post/old/shell.md
new file mode 100644
index 00000000..052b7e68
--- /dev/null
+++ b/content/post/old/shell.md
@@ -0,0 +1,184 @@
++++
+
+title = "shell"
+date = "2021-05-29"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "命令行"]
+keywords = ["", ""]
+description = "自学shell脚本"
+showFullContent = false
+
++++
+
+
+[菜鸟shell教程](https://www.runoob.com/linux/linux-shell-variable.html)
+
+# Shell 命令脚本
+
+Shell 脚本文件的名称可以任意,建议将.sh 后缀加上,以表示是一个脚本文件。
+
+1. 创建脚本:`vim example.sh`
+2. 写好脚本的内容(就是连串的shell语句)
+3. 执行脚本:(后面的是参数)
+ * ` bash example.sh`
+ * `sh example.sh`
+ * `./example.sh ` (一般会有权限不足的报错,升权限就好了)
+
+## 简单的脚本
+```sh
+#!/bin/bash
+#For Example BY linuxprobe.com
+pwd
+ls -al
+```
+
+在上面的这个 example.sh 脚本中实际上出现了三种不同的元素:
+* 第一行的脚本声明(#!)用来告诉系统使用哪种 Shell 解释器来执行该脚本;
+* 第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或他人在日后看到这个脚本内容时,可以快速知道该脚本的作用或一些警告信息;
+* 第三、四行的可执行语句也就是我们平时执行的 Linux 命令了。
+
+
+
+
+
+## 带参数的脚本-接收参数
+
+如何运行带参数的脚本:
+```
+sh example.sh one two three four five six
+```
+
+脚本内容:
+
+```sh
+#!/bin/bash
+echo "当前脚本名称为$0"
+echo "总共有$#个参数,分别是$*。"
+echo "第 1 个参数为$1,第 5 个为$5。"
+```
+
+~|~
+---|---
+$0 | 对应的是当前 Shell 脚本程序的名称,
+$# | 对应的是总共有几个参数
+$* | 对应的是所有位置的参数值
+$? | 对应的是显示上一次命令的执行返回值
+$1、$2、$3 | 则分别对应着第 N 个位置的参数值
+
+## 带参数的脚本-判断用户的参数
+
+运算符 | 作用
+----|---
+-d |测试文件是否为目录类型
+-e |测试文件是否存在
+-f |判断是否为一般文件
+-r |测试当前用户是否有权限读取
+-w |测试当前用户是否有权限写入
+-x |测试当前用户是否有权限执行
+---|0代表存在,否则不存在
+
+例子: 下面使用文件测试语句来判断/etc/fstab 是否为一个目录类型的文件,然后通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值。
+```
+root@KASUSA-cloud:~# [ -f mydir ]
+root@KASUSA-cloud:~# echo $?
+1
+```
+## `&&`符号,`||`符号
+> &&,它表示当前面的命令执行成功后才会执行它后面的命令
+
+判断目录是否存在:
+```sh
+[ -e mydir ] && echo "Exist"
+```
+> 表示当前面的命令执行失败后才会执行它后面的命令,
+
+因此可以用来结合系统环境变量 USER 来判断当前登录的用户是否为非管理员身份:
+```sh
+[ $USER = root ] || echo "user"
+```
+一个复杂一点的判断用户的例子:
+```sh
+ [ ! $USER = root ] && echo "user" || echo "root"
+```
+
+## 运算比较符
+运算符 |作用
+---|---
+-eq | 是否等于
+-ne | 是否不等于
+-gt | 是否大于
+-lt | 是否小于
+-le | 是否等于或小于
+-ge | 是否大于或等于
+
+## 流程控制语句
+### if 条件测试语句
+
+![if](http://ww1.sinaimg.cn/large/0083vuQJly1gbmzfmixtrj30eh05t3z5.jpg)
+![if else if](http://ww1.sinaimg.cn/large/0083vuQJly1gbmzhnsu8uj30g9074jsb.jpg)
+
+### for 条件循环语句
+![for1](http://ww1.sinaimg.cn/large/0083vuQJly1gbmzpen0wwj30ev05fmxp.jpg)
+
+批量创建用户脚本:
+创建 user.txt
+```
+vim users.txt
+```
+
+```
+andy
+barry
+carl
+duke
+eric
+george
+```
+
+创建脚本 Example.sh
+```
+ vim Example.sh
+```
+
+```sh
+#!/bin/bash
+read -p "Enter The Users Password : " PASSWD
+for UNAME in `cat users.txt`
+ do
+ id $UNAME &> /dev/null
+ if [ $? -eq 0 ]
+ then
+ echo "Already exists"
+ else
+ useradd $UNAME &> /dev/null
+ echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
+ if [ $? -eq 0 ]
+ then
+ echo "$UNAME , Create success"
+ else
+ echo "$UNAME , Create failure"
+ fi
+ fi
+done
+
+```
+> 需要多说一句,/dev/null 是一个被称作 Linux 黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。
+
+### while 条件循环语句
+执行前并不确定最终执行的次数
+
+![sshot-2020-02-15-[1].png](http://ww1.sinaimg.cn/large/006rgJELly1gbwy6ok0x4j306q04874d.jpg)
+
+例子:
+```sh
+#!/bin/bash
+#在CASE变量小于等于20的时候一直运行
+CASE=0 #初始化变量
+echo "case = $CASE" #显示变量
+while [ $CASE -le 20 ] #while条件
+do #while开始
+CASE=`expr $CASE + 1` #相当于CASE++
+echo "case = $CASE" #显示下CASE的值
+done #结束
+```
diff --git a/content/post/old/ssh2.md b/content/post/old/ssh2.md
new file mode 100644
index 00000000..ba3f2598
--- /dev/null
+++ b/content/post/old/ssh2.md
@@ -0,0 +1,60 @@
++++
+title = "Permission Denied (publickey,gssapi-keyex,gssapi-with-mic) 解决办法"
+description = ""
+date = 2022-02-14T09:56:15+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+ "centos","ssh"
+]
+tags = [
+ ""
+]
+series = []
+images = []
+
++++
+
+今天ssh登录阿里云远程的centos,出现了
+
+```
+Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
+```
+
+尝试使用生成的key(pem文件)没有成功。
+
+```
+ssh -i myvmubuntu.pem root@123.56.18.36
+```
+
+提示如下错误:
+
+```
+Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
+```
+
+# 解决方案
+
+修改这文件:
+
+```
+sudo vim /etc/ssh/sshd_config
+```
+
+搜索如下两项:并把后面修改成如下所示
+
+```
+PasswordAuthentication yes
+……
+ChallengeResponseAuthentication no
+```
+
+重启sshd:
+
+```
+sudo systemctl restart sshd
+```
+
diff --git a/content/post/old/sshtoparallels.md b/content/post/old/sshtoparallels.md
new file mode 100644
index 00000000..44d9f27c
--- /dev/null
+++ b/content/post/old/sshtoparallels.md
@@ -0,0 +1,71 @@
++++
+title = "ssh to parallels (kali)"
+description = ""
+date = 2022-08-06T10:00:00+08:00
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "Mac","kali"
+]
+series = []
+images = []
+
++++
+
+参考:
+
+https://wpguru.co.uk/2014/02/how-to-ssh-into-a-virtual-machine-in-parallels-desktop/
+
+## 使用ssh链接 parallels 虚拟机的 kali linux系统
+
+本教程基于PD17,m1 MacBook。
+
+首先你也直接在pd虚拟机中直接下载和安装kali,而不用自己下载镜像来安装。
+
+![安装助手](https://i.imgur.com/122vaYp.png)
+
+## 修改sshd配置
+
+默认情况下kali的sshd配置是无法被ssh的,我们需要首先修改sshd配置然后重新加载。
+
+````sh
+sudo vim /etc/ssh/sshd_config
+# 搜索以下关键词然后取消备注/改成yes
+PermitRootLogin yes
+PasswordAuthentication yes
+````
+
+修改后需要重启服务,加载刚更新配置:
+
+```bash
+/etc/init.d/ssh restart
+```
+
+增加开机自启动ssh的一个服务:
+```
+sudo update-rc.d ssh enable
+```
+
+## 查看虚拟机的ip
+
+```bash
+ifconfig
+```
+
+![查看虚拟机的ip](https://i.imgur.com/aHsiG9S.png)
+
+## 使用ssh工具链接虚拟机
+
+```bash
+ssh parallels@10.221.55.4
+```
+
+- parallels 是通过pd安装虚拟机自己创建的用户名,有root权限
+
+接下来你就可以正常远程进入虚拟机了,这样可以使用macOS的cmd+v粘贴之类的快捷键。
+
+![ssh工具链接虚拟机](https://i.imgur.com/bT52A7j.png)
diff --git "a/content/post/old/steam\345\245\275\345\217\213\345\267\262\346\226\255\345\274\200\350\277\236\346\216\245\344\277\256\345\244\215\345\212\236\346\263\225.md" "b/content/post/old/steam\345\245\275\345\217\213\345\267\262\346\226\255\345\274\200\350\277\236\346\216\245\344\277\256\345\244\215\345\212\236\346\263\225.md"
new file mode 100644
index 00000000..a28af458
--- /dev/null
+++ "b/content/post/old/steam\345\245\275\345\217\213\345\267\262\346\226\255\345\274\200\350\277\236\346\216\245\344\277\256\345\244\215\345\212\236\346\263\225.md"
@@ -0,0 +1,44 @@
++++
+title = "Steam好友已断开连接修复办法"
+description = ""
+date = 2022-03-05T11:32:35+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "steam"
+]
+series = []
+images = []
+
++++
+
+## 问题描述
+
+![image](https://image.baidu.com/search/down?url=https://tvax2.sinaimg.cn/large/006rgJELly1gzyumsvh64j3083074t9w.jpg)
+
+有时候会出现这种情况:像上图一样,steam的好友网络无法访问,更关键的是这个东西会不定期的跳出来,比如,在你和其他敌人激烈对线的时候。
+
+## 解决办法
+
+删除steam文件夹下的一些缓存文件来达到恢复使用的目的。
+
+1. 打开steam目录
+2. 找到package文件夹
+3. 删除内部所有文件
+
+## 傻瓜图示
+
+![](https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn/large/006rgJELly1gzyutadghoj30la0jnwlx.jpg)
+
+
+
+![](https://image.baidu.com/search/down?url=https://tva3.sinaimg.cn/large/006rgJELly1gzyuvcgrlaj30hq0jbjwd.jpg)
+
+![](https://image.baidu.com/search/down?url=https://tvax3.sinaimg.cn/large/006rgJELly1gzyuw4b6jzj30oh0he7ab.jpg)
+
+![](https://image.baidu.com/search/down?url=https://tvax2.sinaimg.cn/large/006rgJELly1gzyuwvsegyj30o10e9772.jpg)
diff --git "a/content/post/old/tar\347\232\204\347\224\250\346\263\225.md" "b/content/post/old/tar\347\232\204\347\224\250\346\263\225.md"
new file mode 100644
index 00000000..5ce3beb2
--- /dev/null
+++ "b/content/post/old/tar\347\232\204\347\224\250\346\263\225.md"
@@ -0,0 +1,105 @@
++++
+title = "Tar的用法、常见的linux压缩解包方法"
+description = ""
+date = 2022-05-22T16:45:55+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "linux","tar"
+]
+series = []
+images = []
+
++++
+
+# 常见的linux 压缩解包方法
+
+```
+gzip xxx
+gunzip xxx
+
+tar zcvf 压缩文件名 压缩文件
+tar zxvf 解压包名 解压文件
+
+tar jcvf renwolesshel.tar.bz2 打包
+tar jxvf renwolesshel.tar.bz2 解压
+
+zip -q a.zip a.txt
+unzip a.zip
+ -q “安静模式”
+```
+# tar的用法
+
+## 打包
+
+打包(多个文件):
+
+```bash
+tar -cf my.tar 1.txt 2.txt 3.txt
+```
+
+打包(文件夹):
+
+```bash
+tar -cf dir1.tar dir1
+```
+
+---
+
+## 看包
+
+看包/预览包内容:
+
+```bash
+tar -tvf dir1.tar
+```
+
+---
+
+## 解包
+
+解包:会自动解压到当前目录的同名文件夹下面
+
+```bash
+tar -xf dir1.tar
+```
+
+解包(到指定的位置):解压后会在`dir2`里面看到一个`dir1`
+
+```bash
+tar -xf dir1.tar -C dir2/
+```
+
+# tar与文件类型
+
+一般来说 `.tar` 就是我们说的打包的包了,用上述命令就可以操作。
+
+常见 `.tar.gz` 格式,它是打包后又进行了压缩。可以使用 `-zxf` 来解压。
+
+需要根据自己需要来决定要不要开`-v` ,不开的话,解压或者打包的时候系统看起来就像卡住了一样。
+
+# 常用参数解释
+
+- c create 创建
+- x extract 解包
+- v verbose 显示更多废话
+- f file=ARCHIVE 要操作的对象放在f后面
+- z zip 压缩功能
+
+## 官方的话
+
+> GNU 'tar' saves many files together into a single tape or disk archive, and can
+> restore individual files from the archive.
+
+```
+Examples:
+ tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.
+ tar -tvf archive.tar # List all files in archive.tar verbosely.
+ tar -xf archive.tar # Extract all files from archive.tar.
+```
+
diff --git a/content/post/old/ubuntu install java.md b/content/post/old/ubuntu install java.md
new file mode 100644
index 00000000..b59aa487
--- /dev/null
+++ b/content/post/old/ubuntu install java.md
@@ -0,0 +1,34 @@
++++
+
+title = "ubuntu上安装java"
+date = "2021-05-29"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "命令行"]
+keywords = ["", ""]
+description = "可以玩mc的java"
+showFullContent = false
+
++++
+ubuntu 安装 java 最好的教程:https://docs.datastax.com/en/jdk-install/doc/jdk-install/installOracleJdkDeb.html
+
+## steps
+1. 去oracle下载你要的java
+ ```
+ https://www.oracle.com/java/technologies/javase-downloads.html
+ ```
+ 1.1 一般来说你需要解压之后把文件放在 `/usr/lib/jvm` 这里是标准的java存放位置
+
+2. 让系统知道你新装了 java 还有他的位置 (更改后半句的目录为你的java解压路径 最后面的是java config编号)
+ ```
+ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk-15.0.1/bin/java" 1
+ ```
+3. 选择你的新java版本
+ ```
+ sudo update-alternatives --config java
+ ```
+4. 测试是否成功
+ ```
+ java -version
+ ```
+
diff --git "a/content/post/old/ubuntu\350\256\276\347\275\256ssh.md" "b/content/post/old/ubuntu\350\256\276\347\275\256ssh.md"
new file mode 100644
index 00000000..186a28d8
--- /dev/null
+++ "b/content/post/old/ubuntu\350\256\276\347\275\256ssh.md"
@@ -0,0 +1,71 @@
++++
+title = "ubuntu设置ssh、修改mac地址(home pc)"
+description = ""
+date = 2022-11-22T22:03:01+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+]
+tags = [
+"ubuntu","ssh","macaddress"
+]
+series = []
+images = []
+
++++
+> 本教程包含:开启ubuntu ssh server 功能(可以被远程)\修改ubuntu 的 网卡mac地址
+
+1. 安装ssh服务器
+```
+sudo apt update
+sudo apt install openssh-server
+```
+2. 查看ssh服务器启动状态
+```
+sudo systemctl status ssh
+```
+3. 使用内置的防火墙软件允许ssh通过
+```
+sudo ufw allow ssh
+```
+4. 查看你的ubuntu ip地址(这条命令会显示所有网卡的ip,选择你觉得最像的那个)
+```
+ip -f inet address
+```
+
+## 笔记本关闭盒盖休眠功能
+> ubuntu2204默认开启了笔记本盒盖,系统自动休眠功能,这显然不是我们想要的,因为需要让他在盒盖状态下当一个家庭服务器,所以需要关闭他的[盒盖休眠]功能
+> 下面是关闭[盒盖休眠]功能的指南,可以使用`/关键词` 在vi中搜索
+```
+sudo vi /etc/systemd/logind.conf
+```
+将其中的
+```#HandleLidSwitch=suspend```
+改成
+```HandleLidSwitch=ignore```
+
+
+## 修改ubuntu MAC地址
+> 单位的内网wifi开启了MAC地址认证功能,只有在清单中的MAC地址可以连接到内网WiFi,我有一个可用的内网mac地址,正好给他上上,然后自己搭建一个私人vpn
+1. 安装macchanger
+```
+apt install macchanger -y
+```
+2. 查看需要更改的王开名称
+```
+ip addr sh
+```
+3. 设定网卡指定ip地址
+```
+sudo macchanger -m e0:d4:e8:f8:e0:c6 wlp0s20f3
+```
+4. 查看网卡地址(是否修改成功)
+```
+macchanger --show wlp0s20f3
+```
+5. optional:恢复网卡mac地址(恢复成固件地址)
+```
+macchanger -p wlp0s20f3
+```
\ No newline at end of file
diff --git a/content/post/old/vim.md b/content/post/old/vim.md
new file mode 100644
index 00000000..9be3f5fa
--- /dev/null
+++ b/content/post/old/vim.md
@@ -0,0 +1,180 @@
++++
+
+title = "vim"
+date = "2021-05-29"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "命令行"]
+keywords = ["", ""]
+description = "vim的教程总结"
+showFullContent = false
+featured = true
++++
+[vimtutor-ch](https://blog.ihipop.info/2011/01/2026.html)
+
+
+快速使用vim:
+## 跳转
+行之间的跳转
+```sh
+[n] shift g #跳转到第n行
+gg #跳转到第一行
+shift g #跳转到最后一行
+```
+行内的跳转
+```sh
+~ #切换大小写
+w #到下一个单词头部
+0 #到行头
+$ #到行尾
+f <字母> #搜索并跳转到下一个匹配字母
+F <字母> #搜索并跳转到上一个匹配字母
+```
+---
+## 复制和粘贴
+
+* 普通模式中使用y复制
+ * 普通模式中,yy复制游标所在的整行(3yy表示复制3行)
+ * 普通模式中,y0 复制至行首。不含光标所在处字符。
+ * 普通模式中,y$ 复制至行尾。含光标所在处字符。
+ * 普通模式中,yw 复制一个单词。
+ * 普通模式中,y2w 复制两个单词。
+ * 普通模式中,yG 复制至文本末。
+ * 普通模式中,y1G 复制至文本开头。
+
+* 普通模式中使用 p 粘贴
+ * 普通模式中,p(小写)代表粘贴至光标后(下)
+ * 普通模式中,P(大写)代表粘贴至光标前(上)
+
+* 剪切 使用 d
+ * dd 剪切一行
+ * [n]dd 剪切n行
+
+## 替换和撤销(Undo)命令
+* 替换
+ * c 删除并重写一个字母
+ * C 删除并重写从[光标处到末尾]一个字母
+ * cc 删除并重写一行
+ * r 替换一个字母
+ * R 连续的替换字母
+ 撤销
+ u 一次撤销
+ U 撤销所有
+ 重做
+ ctrl + r 重做
+
+## 缩进
+
+```sh
+<< #向左侧缩进
+>> #向右侧缩进
+:set shiftwidth=10 #设置缩进大小为10个空格
+
+:ce #中心对齐
+:le #左侧对齐
+:ri #右侧对齐
+```
+---
+# 教程
+我是在实验楼看到的这个系统自带的教程的.
+感觉还不错的样子。
+
+## 第二讲小结
+
+
+ 1. 欲从当前光标删除至单字/单词末尾,请输入∶dw
+
+ 2. 欲从当前光标删除至当前行末尾,请输入∶d$
+
+ 3. 欲删除整行,请输入∶dd
+
+ 4. 在正常模式下一个命令的格式是∶
+
+```
+ [number] command object 或者 command [number] object
+其意是∶
+ number - 代表的是命令执行的次数
+ command - 代表要做的事情,比如 d 代表删除
+ object - 代表要操作的对象,比如 w 代表单字/单词,$ 代表到行末等等。
+
+```
+ 5. 欲撤消以前的操作,请输入∶u (小写的u)
+ 欲撤消在一行中所做的改动,请输入∶U (大写的U)
+ 欲撤消以前的撤消命令,恢复以前的操作结果,请输入∶CTRL-R
+
+## 第三讲小结
+
+
+ 1. 要重新置入已经删除的文本内容,请输入小写字母 p。该操作可以将已删除
+ 的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置
+ 于当前光标所在行的下一行。
+
+ 2. 要替换光标所在位置的字符,请输入小写的 r 和要替换掉原位置字符的新字
+ 符即可。
+
+ 3. 更改类命令允许您改变指定的对象,从当前光标所在位置直到对象的末尾。
+ 比如输入 cw 可以替换当前光标到单词的末尾的内容;输入 c$ 可以替换当
+ 前光标到行末的内容。
+
+ 4. 更改类命令的格式是∶
+
+```
+[number] c object 或者 c [number] object
+```
+下面我们继续学习下一讲。
+
+## 第四讲小结
+
+
+1. Ctrl-g 用于显示当前光标所在位置和文件状态信息。Shift-G 用于将光标跳
+ 转至文件最后一行。先敲入一个行号然后按 Shift-G 则是将光标移动至该行
+ 号代表的行。
+
+2. 输入 / 然后紧随一个字符串是则是在当前所编辑的文档中向后查找该字符串。
+ 输入问号 ? 然后紧随一个字符串是则是在当前所编辑的文档中向前查找该字
+ 符串。完成一次查找之后按 n 键则是重复上一次的命令,可在同一方向上查
+ 找下一个字符串所在;或者按 Shift-N 向相反方向查找下该字符串所在。
+
+3. 如果光标当前位置是括号(、)、[、]、{、},按 % 可以将光标移动到配对的
+ 括号上。
+
+4. * 在一行内替换头一个字符串 old 为新的字符串 new,请输入 :s/old/new
+ * 在一行内替换所有的字符串 old 为新的字符串 new,请输入 :s/old/new/g
+ * 在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
+ * 在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
+ * 进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc
+
+## 第五讲小结
+
+
+1. :!command 用于执行一个外部命令 command。
+
+ 请看一些实际例子∶
+ :!dir - 用于显示当前目录的内容。
+ :!rm FILENAME - 用于删除名为 FILENAME 的文件。
+
+2. :w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文
+ 件中。
+
+3. :#,#w FILENAME 可将当前编辑文件第 # 行至第 # 行的内容保存到文件
+ FILENAME 中。
+
+4. :r FILENAME 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置
+ 后面。
+
+## 第六讲小结
+
+
+1. 输入小写的 o 可以在光标下方打开新的一行并将光标置于新开的行首,进入
+ 插入模式。
+ 输入大写的 O 可以在光标上方打开新的一行并将光标置于新开的行首,进入
+ 插入模式。
+
+2. 输入小写的 a 可以在光标所在位置之后插入文本。
+ 输入大写的 A 可以在光标所在行的行末之后插入文本。
+
+3. 输入大写的 R 将进入替换模式,直至按 键退出替换模式而进入正常
+ 模式。
+
+4. 输入 :set xxx 可以设置 xxx 选项。
+
diff --git "a/content/post/old/windows\351\205\267\345\221\275\344\273\244--\347\275\221\347\273\234\346\226\271\351\235\242.md" "b/content/post/old/windows\351\205\267\345\221\275\344\273\244--\347\275\221\347\273\234\346\226\271\351\235\242.md"
new file mode 100644
index 00000000..0227a6a6
--- /dev/null
+++ "b/content/post/old/windows\351\205\267\345\221\275\344\273\244--\347\275\221\347\273\234\346\226\271\351\235\242.md"
@@ -0,0 +1,193 @@
++++
+title = "windows酷命令"
+description = ""
+date = 2022-10-29T23:00:17+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "cmd"
+]
+series = []
+images = []
+
++++
+> 如果你更喜欢看视频:https://www.youtube.com/watch?v=Jfvg3CS1X3A&t=1s
+
+有些命令需要使用到管理员权限。推荐直接打开一个拥有管理员权限的cmd窗口!
+
+--网络方面的命令比较多
+
+---
+
+ 检查一下网卡情况
+
+```bat
+ipconfig /all
+```
+
+ 清除网络
+
+```
+ipconfig /release
+```
+
+ 刷新获取ip
+
+```
+ipconfig /renew
+```
+
+ 展示所有已知dns(并复制到剪切板)
+
+```bat
+ipconfig /displaydns | clip
+```
+
+ 刷新dns(从dns服务器重新拉)
+
+```
+ipconfig /flushdns
+```
+
+
+ 查dns字典(域名获取ip)
+
+```
+nslookup networkchuck.com
+```
+
+ 你还可以指定dns服务器
+
+```
+nslookup baidu.com 8.8.8.8
+```
+
+ 不知道干啥的
+
+```
+nslookup -type=ptr baidu.com
+```
+
+
+❤ 获取mac地址
+
+```
+getmac /v
+```
+
+
+ 一些系统报告
+
+```
+powercfg /energy
+```
+
+
+```
+powercfg /batteryreport
+```
+
+
+ 检查一下文件默认启动关联
+
+```
+assoc
+```
+
+
+❤ 检查一下电脑的系统文件问题
+
+```
+sfc /SCANNOW
+```
+
+
+ 查看正在运行的程序 类似ps
+
+```
+tasklist |findstr QQ
+```
+
+ kill (强制、指定pid)
+
+```
+taskkill /f /pid 40232l
+```
+
+
+❤ 更高级的网络报告
+
+```
+netsh wlan show wlanreport
+```
+
+
+ 关闭、打开防火墙
+
+```
+netsh advfirewall set allprofiles state off
+```
+
+
+```
+netsh advfirewall set allprofiles state on
+```
+
+
+ ping 和 不停的ping
+
+```
+ping baidu.com
+```
+
+
+```
+ping -t baidu.com
+```
+
+
+ 路由追踪
+
+```
+tracert -d baidu.com
+```
+
+
+❤ 查看当前端口开放情况
+
+```
+ netstat -af
+```
+
+135的作用就是进行远程,可以在被远程的电脑中写入恶意代码,危险极大
+139、445文件和打印机共享,可以用于开启空会话
+3389端口是Windows远程桌面的服务端口
+1024端口一般不固定分配给某个服务,在英文中的解释是“Reserved”(保留)。之前,我们曾经提到过动态端口的范围是从1024~65535,而1024正是动态端口的开始
+
+ 展示电脑内路由表,可以修改
+
+```
+route print
+```
+
+
+```
+route add x.x.x.x mask 255.255.255.0 x.x.x.x
+```
+
+
+```
+route delete x.x.x.x
+```
+
+
+❤ 关机(完全重启 重启到bios 强制 时间0)
+
+```
+shutdown /r /fw /f /t 0
+```
diff --git "a/content/post/old/winform\351\200\202\351\205\215dpi.md" "b/content/post/old/winform\351\200\202\351\205\215dpi.md"
new file mode 100644
index 00000000..415438b9
--- /dev/null
+++ "b/content/post/old/winform\351\200\202\351\205\215dpi.md"
@@ -0,0 +1,28 @@
++++
+
+title = "winform适配dpi"
+date = "2021-06-02"
+author = "kasusa"
+cover = ""
+tags = ["csharp", "winform","dpi"]
+keywords = ["", ""]
+description = "winform程序应该高清的显示在笔记本上"
+
++++
+
+[https://zhuanlan.zhihu.com/p/128588859](https://zhuanlan.zhihu.com/p/128588859)
+
+在项目中添加一个:**应用程序清单文件**
+
+在清单文件`app.manifest`的 `` 标签下添加
+
+```xml
+
+
+ true
+
+
+```
+
+适配DPI之后,即便是电脑dpi为缩放的情况下, 仍然可以清晰的显示文字。
+
diff --git a/content/post/old/xypolyer.md b/content/post/old/xypolyer.md
new file mode 100644
index 00000000..65c524f1
--- /dev/null
+++ b/content/post/old/xypolyer.md
@@ -0,0 +1,76 @@
++++
+title = "Xypolyer 使用教学"
+description = ""
+date = 2022-02-17T10:24:20+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "文件管理"
+]
+series = []
+images = []
+
++++
+
+# xyployer 教程
+## 常用快捷键
+
+| | 功能 | 按键 |
+| ---- | ---------- | ---- |
+| | 开启树状图 | F8 |
+| | 开启双面板 | F10 |
+
+## 自定义按钮
+
+> 图床使用 imgur 如果无法看图请确保网络连通
+
+自定义按钮非常好用,可以把某个常用位置放到按钮上,需要一丢丢的“编程”
+
+![image-20220216163631453](https://i.imgur.com/ieV8O07.png)
+
+然后左边点击,选一个按钮,添加到右边。
+
+![image-20220216165135452](https://i.imgur.com/ZAtg8JM.png)
+
+然后再按钮栏里面就可以看到自己的按钮了,随便起个名字然后下面写:
+
+```
+goto "<文件路径>"
+```
+
+![image-20220216165233602](https://i.imgur.com/77pOh3v.png)
+
+然后下次单击这个按钮就可以到一个指定目录里面了,超级方便!
+
+实际上这个是写的“script”,更多例子可以看这里:[XYplorer - Tour - Scripting](https://www.xyplorer.com/tour.php?page=scripting)
+
+## 保存Pane
+
+默认打开了这个软件之后,会显示两个pane,每一个pane的标签页都是可以独立保存的(会保存你当前开启了那些标签页)。通过任务栏上面的“公文包”按钮就可以保存了。
+
+![image-20220216165637722](https://i.imgur.com/dcLezm8.png)
+
+这里我选择的是上面的pane,然后右键-另存为,新建一个
+
+![image-20220216165904402](https://i.imgur.com/jK1HyP5.png)
+
+新建之后就可左键公文包来选择保存过的标签了。
+
+![image-20220216170008736](https://i.imgur.com/pQYHO0x.png)
+
+有一点要注意的是,现在正在使用的标签(minecarft),默认会在最后的时候(会在关闭窗体的时候)保存一下当前开启的标签页。
+
+## 色彩标注
+非常棒的功能之一就是彩色标注功能,但是这个东西默认隐藏,我来教你如何打开它
+
+![image-20220217102627612](https://i.imgur.com/U6myAMM.png)
+
+只需要右键然后把这个标注列选出来,就可以标注文件了!
+
+![image-20220217102646083](https://i.imgur.com/O4xwC92.png)
diff --git "a/content/post/old/youtube proxychains\346\200\273\347\273\223.md" "b/content/post/old/youtube proxychains\346\200\273\347\273\223.md"
new file mode 100644
index 00000000..b26aad9b
--- /dev/null
+++ "b/content/post/old/youtube proxychains\346\200\273\347\273\223.md"
@@ -0,0 +1,30 @@
++++
+
+title = "proxychains 使用教程"
+date = "2021-05-29"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "命令行"]
+keywords = ["", ""]
+description = ""
+showFullContent = false
+
++++
+1. 安装proxychains sudo apt install proxychains4
+
+2. 配置他的配置文件:sudo vim /etc/proxychains4.conf
+ - 取消掉的注释 dynamic_chain
+
+ - 将底部的网络协议和代理端口和ip改成你翻墙软件提供的:
+
+ - ```
+ socks5 127.0.0.1 1089
+ http 127.0.0.1 8889
+ ```
+
+3. 通过proxychains4 来在bash启动其他程序:proxychains4 <程序名>
+
+ps:可以去 `/.bashrc` 给`proxychains`起一个别名,比较方便
+
+
+
diff --git "a/content/post/old/zshrc\347\232\204\344\270\200\344\272\233\351\205\215\347\275\256.md" "b/content/post/old/zshrc\347\232\204\344\270\200\344\272\233\351\205\215\347\275\256.md"
new file mode 100644
index 00000000..4e106eb4
--- /dev/null
+++ "b/content/post/old/zshrc\347\232\204\344\270\200\344\272\233\351\205\215\347\275\256.md"
@@ -0,0 +1,81 @@
++++
+title = "自定义终端标识符"
+description = ""
+date = 2022-09-15T23:03:01+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ "bash"
+]
+tags = [
+ "个性化"
+]
+series = []
+images = []
+
++++
+
+# zshrc
+
+zsh是macos目前默认的交互终端,如果要修改默认标识符有2中办法:
+
+在~/.zshrc文件中加入行来设置:
+
+你可以通过设置PS1这个变量,或者设置PROMPT(提示符)、RPROMPT(右侧提示符)来进行自定义。
+
+# 可视化例子
+
+苹果推荐:
+
+```sh
+export PS1="%10F%m%f:%11F%1~%f \$ "
+```
+
+![image](https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn/large/0083vuQJgy1h67plzn0rqj30bi02saa4.jpg)
+
+所以`%10Fxxx%f` 就是绿色的`xxx`,`%11Fxxx%f`就是黄色,其他的颜色我也没有实验所以不清楚,` \$` 就是输入$的意思(这个符号是转义符所以增加了 `\`),`%m`代表主机名称,`%~`则是你相对于你的home的位置。
+
+我喜欢用%B - %b、%T、%~这几个,非常干净简洁的组合。
+
+| 转义变量 | 描述 |
+| -------- | ------------------------------------------------------------ |
+| %T | 系统时间(时:分) |
+| %* | 系统时间(时:分:秒) |
+| %D | 系统日期(年-月-日) |
+| %n | 你的用户名 |
+| %B - %b | 开始到结束使用粗体打印 |
+| %~ | 你目前的工作目录相对于~的相对路径(可能在某些zsh版本可能造成乱码) |
+| %M | 计算机的主机名 |
+
+更完整详细的表格可以看这里,是zsh官方的:https://zsh.sourceforge.io/Doc/Release/Prompt-Expansion.html
+
+简洁样式1:
+
+```sh
+export PS1="%T %B%~%b \$ "
+```
+
+![image](https://tvax3.sinaimg.cn/large/0083vuQJly1h67qc96kcoj30a403et8j.jpg)
+
+
+
+自定义样式1:
+
+```sh
+#开启颜色
+autoload -U colors && colors
+#配置提示符模式
+PROMPT="%T %{$fg_bold[green]%}%1|%~ %{$reset_color%}\$ "
+#在行末显示
+RPROMPT="[%{$fg[green]%}%?%{$reset_color%}]"
+```
+
+![image](https://image.baidu.com/search/down?url=https://tvax3.sinaimg.cn/large/0083vuQJly1h67qd8ra1kj30lc03mwee.jpg)
+
+自定义样式中用到了不一样的颜色语法,更容易看懂(虽然超级乱),而且需要用到autoload,不顾你可以变得简单点,直接用上面学到的一行都配置在ps1里面。
+
+不过总的来说效果很棒!
+
+如果有意向高一些更自定义的可以看看这个文档,也许你会想开始用ohmyzsh,我是觉得那个有点花了…… >> [Zsh (简体中文) - ArchWiki (archlinux.org)](https://wiki.archlinux.org/title/Zsh_(简体中文)#.E5.BD.A9.E8.89.B2)
diff --git "a/content/post/old/\344\274\240\345\205\245\345\217\202\346\225\260argv.md" "b/content/post/old/\344\274\240\345\205\245\345\217\202\346\225\260argv.md"
new file mode 100644
index 00000000..f1628724
--- /dev/null
+++ "b/content/post/old/\344\274\240\345\205\245\345\217\202\346\225\260argv.md"
@@ -0,0 +1,67 @@
++++
+title = "传入参数ARGV"
+description = ""
+date = 2022-09-10T20:03:01+08:00
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
++++
+
+# 传入参数
+
+在使用linux命令的时候,很多命令都能传入参数比如 ls -l。
+
+这次使用的例子是我之前写过的me_in_jandan.py,他的功能是通过爬虫爬去取jandan的某一个用户的所有发帖,并返回相关的链接。
+
+但是这个用户名是写死在py脚本里面的,如果想要修改的话还要修改代码,不太方便,所以需要通过穿参数的方法可以直接临时更换要查询的用户名。
+
+这里介绍py脚本、shell脚本、bat脚本的参数,非常简单但是是一个小知识点!
+
+
+
+## python 命令行参数
+
+```
+if len(sys.argv) == 2:
+ TARGET_USER_NAME = sys.argv[1] #传入的第一个参数,设置为用户名
+```
+
+对于python来说,一号是脚本文件名称(很合理),二号开始参数字符串,更好的例子可以看看下面的简单脚本和执行结果:
+
+```
+import sys
+print(sys.argv)
+```
+
+```
+kasusadeMBP:me_in_jandan $ python3 args.py v1 v2
+['args.py', 'v1', 'v2']
+```
+
+
+
+## shell参数(.sh文件)
+
+```
+echo $1
+echo $2
+```
+
+```
+kasusadeMBP:me_in_jandan $ ./a.sh v1 v2
+v1
+v2
+```
+
+
+
+## bat参数
+
+```
+echo %1
+echo %2
+```
diff --git "a/content/post/old/\344\275\277\347\224\250Netch\345\212\240\351\200\237apex.md" "b/content/post/old/\344\275\277\347\224\250Netch\345\212\240\351\200\237apex.md"
new file mode 100644
index 00000000..98c8e166
--- /dev/null
+++ "b/content/post/old/\344\275\277\347\224\250Netch\345\212\240\351\200\237apex.md"
@@ -0,0 +1,138 @@
++++
+title = "使用Netch加速apex"
+description = ""
+date = 2022-05-28T14:36:11+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "game","加速器","windwos","Netch"
+]
+series = []
+images = ["https://tvax3.sinaimg.cn/large/006rgJELly1h2o5hxdsk2j305303ajrd.jpg"]
+
++++
+
+> 前段时间我没有续费我的uu加速器了,因为这个老鬼东西实在是价格太贵,并且也不是多好用。
+
+> 上次我为了和同学一些玩游戏又在网上买了个uu加速器(登录器),反正就类似卡uu加速器的bug加速游戏,但是uu很明显不想让他一直薅羊毛,所以我这边也加速不了了,找了店家,店家好像一个脑瘫问题不解决就阿巴阿巴的。
+
+> 一直都听说能用什么软件让节点给游戏加速,我今天就仔细研究了下,hey你别说人家这个开源的Netch真的做的不错,我加速了Apex并且玩起来和用uu加速没啥区别!
+>
+> 垃圾uu要的太黑!黑心商人!
+
+# 参考链接
+
+下载Netch:[https://github.com/NetchX/Netch](https://github.com/NetchX/Netch)
+
+[比SStap更优秀的Netch怎么用 - YouTube](https://www.youtube.com/watch?v=csUjrHjmIqA)
+
+[Netch使用指南(190627) | 冰灵的博客 | BingLing's Blog (binglinggroup.github.io)](https://binglinggroup.github.io/archives/Netch_guide.html)
+
+# 它与v2rayN、Clash的不同
+
+> 我希望你可以先看一下这里,你如果了解了它的原理,后边就很明白它到底是为什么这样操作了,对于折腾来说,可以减少你浪费的时间
+
+一般我们用v2rayN、Clash来对浏览器、系统全局进行代理,达到访问Google的目的
+
+但是即使开了全局,他们也不能连接上 PUBG 或者 APEX 这些游戏
+
+至于原因?
+
+ 因为他们的“全局”只是修改了windows这里的设置而已,很多游戏之类的程序并不会检查和使用系统的代理来建立网络链接。
+
+![image](https://tva1.sinaimg.cn/large/006rgJELgy1h2o4ag3dmwj30ts0gmwgg.jpg)
+
+那么从原理上来说的话这个Netch又有什么不同呢?
+
+Netch是对**进程**进行代理
+
+它是发现你的电脑开启了某个名称的进程后,就会从外部给它加上一个代理,并不需要程序本身兼容
+
+就能达到给一些不支持代理的程序进行加速的效果。
+
+![image](https://tva2.sinaimg.cn/large/006rgJELgy1h2o4xdulj6j30cp0bo40m.jpg)
+
+# Netch的使用
+
+## 添加订阅
+
+因为我一般都是使用的订阅,所以我就不讲单条节点如何导入了。
+
+这里的界面样式非常像V2rayN,第一个按钮可以添加删除订阅(支持同时有好几个),第二个是更新订阅列表。加入成功之后你就可以在服务器下拉列表中选择自己的服务器节点了。
+
+![image](https://tva1.sinaimg.cn/large/006rgJELly1h2o4i6fb6mj30al03sdgo.jpg)
+
+## 主界面功能简要介绍
+
+- 服务器
+
+ - 选择你的节点用的,右边四个按钮分别是 编辑(查看)、删除、测速、复制(复制之后可以贴到别的软件里)
+
+- 模式
+
+ - 模式可以理解成,预设的加速进程列表,预设提供的还是挺多的有steam、steam游戏、git、GTAv、Unity hub等,包括了很多工作、学习软件
+ - 模式是按照A-Z a-z 的顺序排序的,到时候你自己建立了模式需要起名字,然后就能在这里找到了。
+
+- 配置名
+
+ - 老版本没有这个,这个配置名就是给你当前选择好的服务器、模式的组合起名字,然后可以保存到下面的快速按钮里,下次开软件,点击按钮直接启动(加速)
+
+
+
+![image](https://tva2.sinaimg.cn/large/006rgJELly1h2o4gt3d7hj30qp08u78x.jpg)
+
+## 新建一个APEX模式
+
+模式可以理解成,预设的加速进程列表,进程是靠进程名称来识别的,所以即使他不知道程序本体的具体路径,只要知道名字就ok了。
+
+1. 去`steam`里面找到游戏的目录,然后复制一下路径
+2. 来到`Netch`,模式-创建进程模式,然后再打开的窗体中按“扫描“
+3. 扫描会让你选择一个文件夹,我们选择游戏的整个目录,可以参考我的截图
+4. 然后你会发现出现了一堆`xxx.exe`,他们就是程序再你制定好的目录下面找的程序列表,在程序启动之后,Netch可以根据这些东西找到相应的”进程“然后加速他们。
+5. 起名字保存(我起名为Apex-test)
+6. 保存之后,在模式的下拉框里面,你就可以找到自己新建的模式了!
+
+![image](https://tvax2.sinaimg.cn/large/006rgJELgy1h2o4ubg52kj30dj07t41a.jpg)
+
+![image](https://tvax4.sinaimg.cn/large/006rgJELgy1h2o4skj941j30bo042ab1.jpg)
+
+![image](https://tva3.sinaimg.cn/large/006rgJELgy1h2o4tqih87j30cp0bogmf.jpg)
+
+![image](https://tvax3.sinaimg.cn/large/006rgJELgy1h2o4wk8d3dj30nq0bjtdd.jpg)
+
+![image](https://tva2.sinaimg.cn/large/006rgJELgy1h2o4xdulj6j30cp0bo40m.jpg)
+
+![image](https://tvax1.sinaimg.cn/large/006rgJELgy1h2o50cnxyrj30kc08wdjb.jpg)
+
+## 加速、保存快速配置
+
+这里我选择了建立了两个快速配置,你可以自己随便建立自己的快速配置(本质上就是模式和服务器的组合)
+
+![image](https://tva4.sinaimg.cn/large/006rgJELgy1h2o51nhl4lj30kc08wq5a.jpg)
+
+## 同时加速steam和Apex(高级)
+
+我这边steam好友总是不好使,还有steam社区也打不开,在等待过程中看看社区好玩的图和吐槽也是乐趣呀。
+
+那么,如何建立这种模式呢?
+
+1. 找到它预设的steam模式,点击右边的编辑按钮,然后把他的规则都复制出来(其实就是一个大textbox,可以打字的还能选择退格之类的)
+2. 打开你的模式(Apex-test),然后把steam的模式规则都贴后面
+3. 保存你的修改后的模式(可以重命名再保存)
+
+![image](https://tvax3.sinaimg.cn/large/006rgJELly1h2o57l9qyhj30cp0boac5.jpg)
+
+![image](https://tvax1.sinaimg.cn/large/006rgJELly1h2o5a091g8j30cp0boq60.jpg)
+
+# 结语
+
+希望这个文章能帮到其他折腾的人,毕竟uu蛮贵的,而每个月都买的节点如果能用在游戏加速上面那当然很开心呀!谁不想省点钱呢?
+
+不过我仍然不知道怎么让Netch给主机加速,后面用得上再想吧…
+
+有啥问题请再评论区告诉我,错别字就算了…
diff --git "a/content/post/old/\344\275\277\347\224\250python\345\244\232\347\272\277\347\250\213\346\211\271\351\207\217ping.md" "b/content/post/old/\344\275\277\347\224\250python\345\244\232\347\272\277\347\250\213\346\211\271\351\207\217ping.md"
new file mode 100644
index 00000000..6003a7de
--- /dev/null
+++ "b/content/post/old/\344\275\277\347\224\250python\345\244\232\347\272\277\347\250\213\346\211\271\351\207\217ping.md"
@@ -0,0 +1,105 @@
++++
+title = "使用python多线程批量ping"
+description = ""
+date = 2022-06-18T19:53:02+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "python", "Network"
+]
+series = []
+images = []
++++
+
+
+
+> 批量ping是我的工作中常常需要用到的功能了,但是手动好麻烦!我在网上找到了一个脚本,经过了一些改进现在非常好用了,为了方便自己以后复制和互联网精神,我把它放在这里!
+
+# 特点
+- 多个IP并行扫描,速度很快
+- 扫描py代码所在目录下所有`.txt`文件,对每个txt文件内的所有IP进行扫描(会自动判断行内容是不是ip哦!目前只支持ipv4)
+- 输出上色,更容易看清
+- 输出使用tab分割,可以轻松复制到excel进行排序筛选之类的操作
+
+
+# 代码
+
+```py
+import subprocess
+import multiprocessing
+import time
+
+def check_alive(ip):
+ result = subprocess.call(f'ping -w 1000 -n 2 {ip}', stdout=subprocess.PIPE, shell=True)
+ # 等待超时时间1000ms , 测试次数 2次
+ if result == 0:
+ h = subprocess.getoutput('ping ' + ip)
+ returnnum = h.split('平均 = ')[1]
+ print(f'{ip}\t\033[32m[ok]\033[0m\t{returnnum}\t'.replace("\n","") )
+ else:
+ print(f'{ip}\t\033[31m[bad]\033[0m'.replace("\n",""))
+
+
+if __name__ == '__main__':
+ print('结果使用tab分隔,可以拷贝到excel中,通过数据透视进行ip排序等')
+ # 获取所有当前目录下的txt文件并存入 txtfile_list
+ import os
+ path = "."
+ file_name_list = os.listdir(path)
+ txtfile_list = []
+ for x in file_name_list:
+ if x.__contains__('.'):
+ if x.split('.')[1] == "txt":
+ txtfile_list.append(x)
+ print(txtfile_list)
+
+ MUTIPROCESS = True
+
+ for x in txtfile_list:
+ print(f"scaning {x} :")
+ # input("enter 开始ping")
+ with open(x, 'r') as f: # xxx.txt 内容应该包含ip地址,每行一个,可以写备注因为下面会
+ print(f'ipaddress\t[ok]\tlatency\t'.replace("\n", ""))
+ for line in f:
+ # 识别ip地址
+ if len(line.split('.')) == 4:
+ if MUTIPROCESS: # 多线程模式
+ p = multiprocessing.Process(target=check_alive, args=(line,))
+ p.start()
+ else: #单线程模式
+ check_alive(line)
+ # 展示非ip行内容
+ # else: print(line)
+
+ # 等待多线程数量为0(ping均结束)后开启下一个txt的扫描
+ while True:
+ if len(multiprocessing.active_children()) == 0:
+ # print('thread count: '+ str(len(multiprocessing.active_children())) +' ,scan complete\n\n')
+ print("------------")
+ break
+ time.sleep(3)
+
+```
+
+# 使用效果
+为了避免信息泄露,我这里放的都是一些网络上的服务器,很少……
+不过我正常使用这个工具的时候都是搞几十个ip来扫
+
+
+![image](https://tvax2.sinaimg.cn/large/006rgJELgy1h3cncasc0qj319g0raano.jpg)
+![image](https://tva2.sinaimg.cn/large/006rgJELgy1h3cnhgy70yj30fq0cjdi1.jpg)
+
+# 尾巴
+其实我是周末弄得啦,之前就是直接用的网上搜到的版本,但是总是感觉不好用,今天正好有空,就修改了一下。
+
+无论是输出的排版、还是多个txt的支持之类的,我的版本都是比较好的啦!
+
+如果说你有超级多个ip进行测试的话,你可能会发现有的时候一行输出了2个ip,然后下面还有个空行,那也是我很想解决(但是也不会弄)的东西,因为他们是并行开始ping的,没有办法知道他们测试结束的时间,如果他们的结束后print的时间正好卡在一起那就一行两个了。
+
+不过目前也可以通过复制到excel里面然后把很明显串行的结果剪切过去来解决……但是 一点也不优雅!
+
diff --git "a/content/post/old/\344\277\235\345\255\230\344\273\273\346\204\217object\345\210\260\346\226\207\344\273\266.md" "b/content/post/old/\344\277\235\345\255\230\344\273\273\346\204\217object\345\210\260\346\226\207\344\273\266.md"
new file mode 100644
index 00000000..d16198ee
--- /dev/null
+++ "b/content/post/old/\344\277\235\345\255\230\344\273\273\346\204\217object\345\210\260\346\226\207\344\273\266.md"
@@ -0,0 +1,107 @@
++++
+
+title = "保存object到xml"
+date = "2021-06-01"
+author = "kasusa"
+cover = ""
+tags = ["csharp"]
+description = "使用到了datacontract"
+showFullContent = false
+
++++
+
+
+
+## 对实体类做标记
+
+` [DataContract]` 标记在class前。
+
+` [DataMember]` 标记在需要保存的属性前。
+
+```cs
+ [DataContract]
+public class Car
+{
+ [DataMember]
+ public string name;
+
+ [DataMember]
+ double power;
+
+ [DataMember]
+ List wheels;
+}
+```
+
+
+
+## 拷贝这两个函数
+
+保存:保存文件到xml,文件目录和程序目录相同,文件名自定。
+
+读取:从指定文件名读取。
+
+```cs
+static void SaveViaDataContractSerialization(T serializableObject, string filepath)
+{
+ var serializer = new DataContractSerializer(typeof(T));
+ var settings = new XmlWriterSettings()
+ {
+ Indent = true,
+ IndentChars = "\t",
+ };
+ var writer = XmlWriter.Create(filepath, settings);
+ serializer.WriteObject(writer, serializableObject);
+ writer.Close();
+}
+
+
+static T LoadViaDataContractSerialization(string filepath)
+{
+ var fileStream = new FileStream(filepath, FileMode.Open);
+ var reader = XmlDictionaryReader.CreateTextReader(fileStream, new XmlDictionaryReaderQuotas());
+ var serializer = new DataContractSerializer(typeof(T));
+ T serializableObject = (T)serializer.ReadObject(reader, true);
+ reader.Close();
+ fileStream.Close();
+ return serializableObject;
+}
+```
+
+
+
+## 读取方法
+
+使用上面两个方法来读取和存储
+
+```csharp
+// Save single object
+Car bmw = new Car("BMW", 200, new List { "Left", "Right" }); // create object
+SaveViaDataContractSerialization(bmw, "bmw.xml"); // save object
+bmw = null; // delete object
+bmw = LoadViaDataContractSerialization("bmw.xml"); // reload object
+Console.WriteLine(bmw.ToString()); // print object
+
+
+// Save list of objects
+List carList = new List // create object list
+{
+new Car("Porsche", 250, new List { "Left" }),
+new Car("Mercedes", 150, new List { "Front", "Back" }),
+new Car("Aston Martin", 300, new List { "Front" })
+};
+SaveViaDataContractSerialization(carList, "cars.xml"); // save object list
+carList = null; // delete object list
+carList = LoadViaDataContractSerialization>("cars.xml"); // reload object list
+foreach (var a in carList) // print object list
+Console.WriteLine(a.ToString());
+
+Console.ReadLine();
+```
+
+
+
+原视频:[https://www.youtube.com/watch?v=GzZu3eYDBmM](https://www.youtube.com/watch?v=GzZu3eYDBmM)
+
+demo代码:[https://pastebin.com/mRTmdiK5](https://pastebin.com/mRTmdiK5)
+
diff --git "a/content/post/old/\345\205\263\344\272\216\346\210\221\344\273\216CLASH\345\210\207\346\215\242\345\210\260v2rayN\350\277\231\344\273\266\344\272\213.md" "b/content/post/old/\345\205\263\344\272\216\346\210\221\344\273\216CLASH\345\210\207\346\215\242\345\210\260v2rayN\350\277\231\344\273\266\344\272\213.md"
new file mode 100644
index 00000000..1ce12a83
--- /dev/null
+++ "b/content/post/old/\345\205\263\344\272\216\346\210\221\344\273\216CLASH\345\210\207\346\215\242\345\210\260v2rayN\350\277\231\344\273\266\344\272\213.md"
@@ -0,0 +1,112 @@
++++
+title = "关于我从CLASH切换到v2rayN这件事"
+description = ""
+date = 2022-03-10T18:40:24+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "代理"
+]
+series = []
+images = []
+
++++
+
+我从clash切换到使用v2rayN了,
+
+这件事情是因为steam,但是也因为clash是一个坏软件。
+
+# 起因
+
+我昨天晚上登录steam,借用朋友的账号要使用家庭共享来共享他的游戏“老头环”。
+
+但是我登录非常有问题,总是发生登录失败或者类似的事情
+
+在之前steam也是有问题的,有的时候他就会蹦出来“好友无法连接”之类的鬼东西。还会把我从游戏中弹出来。
+
+归根结底,这是steam的问题。也是代理软件的问题,代理软件虽然想要“智能”但是我只能说它太他吗傻逼了,让我的网易云走国外代理,让我的steam也走代理,我无法体验到喷薄如蒸汽般的下载速度,我还要付出好多好多的流量钱!
+
+我决定换一个软件,clash肯定是有问题!
+
+> steam一直在用我的流量下载东西
+
+![steam一直在使用我的代理进行网络通信](https://tvax2.sinaimg.cn/large/006rgJELly1h05265xqy9j30rw08fwkt.jpg)
+
+# 代理的原理
+
+![62301E4785F21D726F53429C72B1263F](https://tva4.sinaimg.cn/large/006rgJELly1h04zpqakv7j31d30l4te7.jpg)
+
+一般情况下,翻墙就是这样,借助一个没有被强。
+
+![3ABEDD24ECE7CD73DE4FDDFEC2E25A23](https://tvax3.sinaimg.cn/large/006rgJELly1h04zydp6srj31tm0qg10m.jpg)
+
+实际情况更像是这样,两个庞大的网络,里面都有好多的应用,而且他们基本上“不互通”
+
+你就是左边小小的电脑,连接到了右边蓝色的服务器上,然后可以愉快地上网!
+
+![16E8BC6CD7F2D4E4822949B675FA6F11](https://tvax2.sinaimg.cn/large/006rgJELly1h050ak4f3ij319g0mxdnj.jpg)
+
+但是你的代理软件也不是很智能,他手里拿着一个列表(Geoip.dat),但是他实际上也不是很清楚那些流量该怎么走,有时候就会弄错,对我来说经常有steam下载用代理、网易云听歌被代理、一些外网的名气小的网站却不被代理的情况发生。
+
+对我来说我经常需要代理的地方有
+
+- 谷歌搜索
+- github下载
+- youtube看视频
+- soundcloud听音乐
+- Pornhub 看视频……
+
+但是soundcloud好像并不是很出名,在很多机场的配置文件都没有配置,结果代理软件Clash就选择直连,后果就是我听不了歌。
+
+> clash是由节点提供商可以同时提供一份规则文件,根据规则文件对流量进行代理
+
+# 为什么用v2rayN
+
+其实我是一个clash老用户了,很喜欢他的外观;但是他的log和调试功能让人完全看不懂,如果是某些网站被错误代理,我也无法发现,只能感受到满速的链接和无尽的等待。
+
+但是v2rayN可以显示log他会会在后面用**[proxy]、[direct]**来表示是否有把这个链接或者数据包通过代理发送。
+
+配合上域名,很轻松就能看出来这个ip是不是转发的了。
+
+![image](https://tva1.sinaimg.cn/large/006rgJELly1h050p54ylkj30o709a7bo.jpg)
+
+对我来说,调试起来就很方便了
+
+而且使用规则也方便多了(表示一致没弄明白过规则集要怎么用)。
+
+## 系统代理
+
+对于代理软件来说,默认是不会开启系统代理的。
+
+开启系统代理之后,对于系统中产生的所有流量都要过滤一遍,也就是每个链接都要拿过去对着list算一遍在不在里面
+
+如果开启了系统代理,我的steam就会被代理,所有很不喜欢
+
+好处是github desktop也可以被代理了……
+
+## 路由规则设置
+
+这个东西我一致没有仔细研究过,说实话对我使用带来了很多不便,现在我下定决心研究一下并且把结果都写出来。
+
+我们可以看到路由规则有三种,
+
+| 别名 | 意义 |
+| -------- | ---------------------------------------------------------- |
+| 全局 | 所有流量都代理 |
+| | 适合完全不用国内网站、服务的人 |
+| 绕过大陆 | 只有名单内的国内ip、域名直连,如果有不在list里面的就代理, |
+| | 适合上很多国外网站,但是国内只上很出名的网站的人 |
+| 黑名单 | 仅代理list中的外国网站、被封的网站 |
+| | 适合上很多国内网站,国外小网站基本不去的人 |
+
+![image](https://tvax4.sinaimg.cn/large/006rgJELly1h0524a18ldj30u30lm130.jpg)
+
+没有最理想的方式,只有不断切换模式才能符合各种使用场景。
+
+> 未完待续…… 后面还会讲 v2rayN使用技巧 、 SocksCap64的使用、NoLsp等
+
diff --git "a/content/post/old/\345\217\213\351\223\276.md" "b/content/post/old/\345\217\213\351\223\276.md"
new file mode 100644
index 00000000..bba9c134
--- /dev/null
+++ "b/content/post/old/\345\217\213\351\223\276.md"
@@ -0,0 +1,46 @@
++++
+author = "kasusa"
+title = "友情链接"
+date = "2020-11-09"
+description = "三位友人"
+featured = true
+categories = [
+]
+tags = [
+]
+series = [
+ "友链"
+]
+aliases = ["migrate-from-jekyl"]
+images = [
+]
+
+toc = false
+
++++
+## 友链。
+
+
+
+
+- La Bibliothèque de Lumière
+
+ https://ble-m.ltgc.cc/ (卢米埃尔图书馆)
+
+- Xeterium
+
+
+
+ https://blog.izfsk.top/
+
+ https://bb.izfsk.top/ new!
+
+- Terrarum::异世界丨居正博客
+
+ https://blog.skyju.cc/
+
+- 颜树人
+
+ https://yantree.github.io/ (从不更新的死博客)
diff --git "a/content/post/old/\345\246\202\344\275\225\346\211\223\351\200\240\346\234\200\345\245\275\347\224\250\347\232\204\345\276\256\350\275\257\350\276\223\345\205\245\346\263\225.md" "b/content/post/old/\345\246\202\344\275\225\346\211\223\351\200\240\346\234\200\345\245\275\347\224\250\347\232\204\345\276\256\350\275\257\350\276\223\345\205\245\346\263\225.md"
new file mode 100644
index 00000000..8bca03f7
--- /dev/null
+++ "b/content/post/old/\345\246\202\344\275\225\346\211\223\351\200\240\346\234\200\345\245\275\347\224\250\347\232\204\345\276\256\350\275\257\350\276\223\345\205\245\346\263\225.md"
@@ -0,0 +1,152 @@
++++
+title = "如何打造最好用的微软输入法"
+description = "从词库、自定义短语、外观、快捷键方面介绍了微软输入法和他的优点,以及,为什么要使用它。"
+date = 2022-05-24T20:50:59+08:00
+
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "win","输入法"
+]
+series = []
+images = []
+
++++
+
+> 很多人都用搜狗输入法,但是在win11上面他显然不是一个最好的选择。
+
+在windows11上面,微软对中文输入发进行了全新的设计,支持了黑色模式,并且真的非常的好看,在使用过程中我还发现他有几个特别的优点:
+
+1. 它可以在各种游戏中打字,且不会出现不适配的情况
+2. 他所在的层级是比任何窗体都高的,甚至在全屏的游戏中,他都可以显示在其上方。
+3. 响应快,即便是在电脑开启了低能耗模式的时候也不会出现卡顿(搜狗就卡。
+
+![image](https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn/large/006rgJELgy1h2jsguw43aj306j037js3.jpg)
+
+那么这么好的输入法,为什么大家有不用呢,因为它真的太“傻“了,他的默认词库就像是一个智障的日常词典,你基本无法直接打出来任何你想要的字。这篇文章的接下来就教你如何配置这个输入法,让他有快速输入常用人名、并且词库更加智能!
+
+# 词库
+
+## 词库转换(搜狗→微软)
+
+我们需要借助一个第三方软件来把自己的常用词库转换给微软输入法使用:[Release imewlconverter-v2.9.0 · studyzy/imewlconverter (github.com)](https://github.com/studyzy/imewlconverter/releases/tag/v2.9.0)
+
+首先需要在搜狗中导出自己磨合已久的词库,然后通过深蓝词库转换器,把它转换成微软能用的词库。
+
+下拉选框可以参照我的例图:
+
+![image](https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn/large/006rgJELgy1h2jsnhukumj30fb0cmtau.jpg)
+
+转换成功后会自动把新生成的词库保存到这里转换器.exe的目录下
+
+![image](https://image.baidu.com/search/down?url=https://tva4.sinaimg.cn/large/006rgJELgy1h2jspiuviaj30iz0bc40t.jpg)
+
+## 打开”词库和自学习“
+
+然后我们需要去找到词库设置位置,快速的办法是右键单击输入法区域-设置:
+
+![image](https://image.baidu.com/search/down?url=https://tva4.sinaimg.cn/large/006rgJELgy1h2jsqzb5kfj30a40b7438.jpg)
+
+在设置中我们需要进入”词库和自学习“菜单
+
+![image-20220524210657631](C:\Users\kasusa\AppData\Roaming\Typora\typora-user-images\image-20220524210657631.png)
+
+## 导入词库、建立自定义短语
+
+在这里有很多的按钮,可以看看说明根据自己的需要来打开,我主要讲两个
+
+1. 自学习(导入搜狗的词库)
+ - 导入刚刚我们转换出来的 `Win10微软拼音自学习词库0.dat`
+2. 用户自定义短语(用于输入人名等)
+ - 点击 `添加或编辑自定义短语`
+ - 添加并且逐个输入,常用的比如人名啊、邮箱啊、都可以变成快捷短语(我这边人名是通过钉钉复制的还是挺快的,之前那个wcs的名字我一次都没打对过,这些终于可以打出来了…)。
+
+![image](https://image.baidu.com/search/down?url=https://tvax1.sinaimg.cn/large/006rgJELly1h2jstdx7v5j30m10ut78g.jpg)
+
+![image](https://image.baidu.com/search/down?url=https://tvax3.sinaimg.cn/large/006rgJELly1h2jsw5obooj30m90le0v3.jpg)
+
+全部弄好之后,你的输入法应该已经不再是”小弱智“了
+
+## 导出
+
+记得你的词库、短语都是可以导出的!应该可以轻松的导入到其他的PC上。
+
+(我存到了我的坚果云里面)
+
+# 外观
+
+在win11下的黑色主题微软输入法真的蛮好看的,一点也不输给macOS的默认输入法!
+
+![image](https://image.baidu.com/search/down?url=https://tva4.sinaimg.cn/large/006rgJELgy1h2jt2u7ygwj30ob09btfj.jpg)
+
+## 字体大小
+
+当然升级win11之后第一时间我就使用了下新的输入法,虽然很好看但是有一个巨大的缺点,就是字真的太小了……(才不是我老花眼),但是在后续乱研究的时候我发现他的字体大小是有挡位可以选择的!
+
+![image](https://image.baidu.com/search/down?url=https://tva2.sinaimg.cn/large/006rgJELgy1h2jt1z6cwqj30l60j340k.jpg)
+
+## 输入法工具栏
+
+它还有一个输入法工具栏,可以快速的在输入法位置开关,非常非常的简洁小巧。在编程时候,需要切换标点符号、查看自己是否在英文输入法、符号是中文符合还是英语符合都是很方便的。
+
+并且它还有一个很厉害的特点,就是我一开始说的,他能在独占全屏的游戏上悬浮!不知道微软用了什么办法做到的…… 我也想让我的程序有这个功能,感觉就好像是独立的一层,悬浮在整个界面之上一样。
+
+![image](https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn/large/006rgJELgy1h2jsguw43aj306j037js3.jpg)
+
+对了他右边那个设置按钮也有很多功能哦,能把这个烂变成数直的还可以自定义上面显示哪些图标。
+
+![image](https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn/large/006rgJELly1h2jte9vi11j305w05qwfx.jpg)
+
+# 更多强大功能
+
+## 快捷键
+
+我换成微软输入法的很大原因之一就是快捷键占用。搜狗默认占用了`ctrl + ./,/空格` 还有好多快捷键。在编程软件中真的非常常用。
+
+在微软里面你可以看到所有的快捷键配置,要比搜狗的清晰的多。
+
+![image](https://image.baidu.com/search/down?url=https://tva1.sinaimg.cn/large/006rgJELly1h2jtjdvye8j30m10uwq64.jpg)
+
+## U V 输入模式
+
+- U
+
+ - 快速的打出自己不会念的字,比如 u huo niao 䲴
+ - ![image](https://image.baidu.com/search/down?url=https://tva4.sinaimg.cn/large/006rgJELly1h2jtn478hyj30i101xjrh.jpg)
+ - ![image](https://image.baidu.com/search/down?url=https://tvax1.sinaimg.cn/large/006rgJELly1h2jto5dnkvj30ij02eaa5.jpg)
+ - ![image](https://image.baidu.com/search/down?url=https://tva3.sinaimg.cn/large/006rgJELly1h2jtokcbbnj30hh024t8u.jpg)
+
+- V
+
+ - `v1234565` 壹拾贰万叁仟肆佰伍拾陆
+ - `v2022-5-24` 2022年5月24日
+ - `v6*12+1` 6*12+1=73
+
+ 还有一个人名输入模式我不太会用。
+
+![image](https://image.baidu.com/search/down?url=https://tvax3.sinaimg.cn/large/006rgJELly1h2jtj7ztiaj30kr0hpad4.jpg)
+
+输入法我都讲了这么多了,windows对于输入的附带功能我也讲讲算了,下面有几个我很喜欢的:
+
+## 快速emoji
+
+`win + 分号`
+
+![image](https://image.baidu.com/search/down?url=https://tva2.sinaimg.cn/large/006rgJELgy1h2jtsjo3n3j30ap0bv77q.jpg)
+
+## 历史剪贴板
+
+`win + v` 甚至还能看到图片喔!
+
+> (突然发现上面有一个可以点击的栏,原来emoji和剪贴板可以通过点击上面的按钮切换!)
+
+![image](https://image.baidu.com/search/down?url=https://tvax2.sinaimg.cn/large/006rgJELly1h2ju07onq6j30ag0bqn0b.jpg)
+
+最后我在附赠一个搜狗词库吧,就是我的默认词库用深蓝转换来的,应该没有啥个人敏感信息,给超级懒人们用啦~
+
+[Release 搜狗词库 · kasusa/English-words (github.com)](https://github.com/kasusa/English-words/releases/tag/v0.1)
+
diff --git "a/content/post/old/\345\275\222\346\241\243\350\276\205\345\212\251\345\260\217\347\250\213\345\272\217.md" "b/content/post/old/\345\275\222\346\241\243\350\276\205\345\212\251\345\260\217\347\250\213\345\272\217.md"
new file mode 100644
index 00000000..f307368e
--- /dev/null
+++ "b/content/post/old/\345\275\222\346\241\243\350\276\205\345\212\251\345\260\217\347\250\213\345\272\217.md"
@@ -0,0 +1,21 @@
++++
+
+title = "归档辅助小程序"
+date = "2021-06-02"
+author = "kasusa"
+cover = ""
+tags = ["csharp", "winform"]
+keywords = ["", ""]
+description = "c#教程"
+showFullContent = false
+
++++
+
+最近写了一个工作用的小程序:[https://github.com/kasusa/archive_helper](https://github.com/kasusa/archive_helper)
+
+![](https://tva2.sinaimg.cn/large/0083vuQJgy1gr3z92ku8wj30mg0blq3h.jpg)
+
+然后从开始写到现在大概花了5小时左右。用到了系统剪切板、listbox、object序列化并存储为xml、打开指定文件夹并选中指定文件。还有就是一些winform上的设计。
+
+你可以看到右下角的按钮,我感觉把那几个按钮摆在那个位置真的是太天才了,而且那些个按钮都是emoji,并没有用图片,整个程序仍然很小巧。
+
diff --git "a/content/post/old/\346\210\230\345\234\2605\351\224\256\347\233\230\344\270\215\347\201\265\347\232\204\350\247\243\345\206\263\345\212\236\346\263\225.md" "b/content/post/old/\346\210\230\345\234\2605\351\224\256\347\233\230\344\270\215\347\201\265\347\232\204\350\247\243\345\206\263\345\212\236\346\263\225.md"
new file mode 100644
index 00000000..c7ecda61
--- /dev/null
+++ "b/content/post/old/\346\210\230\345\234\2605\351\224\256\347\233\230\344\270\215\347\201\265\347\232\204\350\247\243\345\206\263\345\212\236\346\263\225.md"
@@ -0,0 +1,25 @@
++++
+title = "战地5键盘不灵的解决办法"
+description = ""
+date = 2022-06-20T22:09:55+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
++++
+
+# 战地5键盘不灵的解决办法
+最近在玩战地5,游戏是origin出的,但是有个bug,一边前进一边开镜,就会站着不动,总之是输入冲突的问题,在网上找到了一个解决办法:
+
+`igo64.dll` 在Origin目录下`C:\Program Files (x86)\Origin`,只要随便改个名字,就不会出现按键冲突的问题了。
+
+![image](https://tva1.sinaimg.cn/large/006rgJELly1h3f2cmcxz0j30ry0jv15h.jpg)
+
diff --git "a/content/post/old/\346\212\212doc\346\226\207\344\273\266\350\275\254\346\215\242\346\210\220docx.md" "b/content/post/old/\346\212\212doc\346\226\207\344\273\266\350\275\254\346\215\242\346\210\220docx.md"
new file mode 100644
index 00000000..5280eb0c
--- /dev/null
+++ "b/content/post/old/\346\212\212doc\346\226\207\344\273\266\350\275\254\346\215\242\346\210\220docx.md"
@@ -0,0 +1,47 @@
++++
+title = "把doc文件转换成docx"
+description = ""
+date = 2022-05-12T16:52:49+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "docx"
+]
+series = []
+images = []
+
++++
+
+
+在word中开启开发者模式,新建一个宏(快捷键 alt F11),使用下面的代码,然后双击运行宏。
+
+会让你选择多个文件,然后系统会把他们都转换成docx文件,并保存到源文件夹!
+
+> 如果你只是单纯吧doc后缀改成docx的话,会出现打不开、文件损坏的问题哦。
+
+```vb
+Sub doc2docx() 'doc文件转docx文件
+Dim myDialog As FileDialog, oFile As Variant
+Set myDialog = Application.FileDialog(msoFileDialogFilePicker)
+With myDialog
+ .Filters.Clear '清除所有文件筛选器中的项目
+ .Filters.Add "所有 WORD97-2003 文件", "*.doc", 1 '增加筛选器的项目为所有WORD97-2003文件
+ .AllowMultiSelect = True '允许多项选择
+ If .Show = -1 Then '确定
+ For Each oFile In .SelectedItems '在所有选取项目中循环
+ With Documents.Open(oFile)
+ .SaveAs FileName:=Replace(oFile, ".doc", ".docx"), FileFormat:=12
+ .Close
+ End With
+ Next
+ End If
+End With
+End Sub
+```
+
+
diff --git "a/content/post/old/\346\215\242\346\272\220.md" "b/content/post/old/\346\215\242\346\272\220.md"
new file mode 100644
index 00000000..fcc98ac7
--- /dev/null
+++ "b/content/post/old/\346\215\242\346\272\220.md"
@@ -0,0 +1,18 @@
++++
+
+title = "ubuntu换源"
+date = "2021-05-29"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "命令行"]
+keywords = ["hugo2", ""]
+description = ""
+showFullContent = false
+
++++
+
+ps:也可以通过内置的software & update来测试和更换中国源
+
+清华: https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
+阿里: https://developer.aliyun.com/mirror/ubuntu
+
diff --git "a/content/post/old/\346\270\270\346\210\217\350\207\252\345\212\250\345\275\225\345\261\217\345\210\251\345\231\250-overwolf+medaltv.md" "b/content/post/old/\346\270\270\346\210\217\350\207\252\345\212\250\345\275\225\345\261\217\345\210\251\345\231\250-overwolf+medaltv.md"
new file mode 100644
index 00000000..aa4f159d
--- /dev/null
+++ "b/content/post/old/\346\270\270\346\210\217\350\207\252\345\212\250\345\275\225\345\261\217\345\210\251\345\231\250-overwolf+medaltv.md"
@@ -0,0 +1,40 @@
++++
+title = "游戏自动录屏利器 Overwolf + Medaltv"
+description = ""
+date = 2022-03-13T12:22:25+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "游戏"
+]
+series = []
+images = []
+
++++
+
+# 下载和安装
+
+在官网下overwolf (他是一个软件商店)[Overwolf Appstore](https://www.overwolf.com/appstore/)
+
+![image](https://tvax3.sinaimg.cn/large/006rgJELly1h0854q39kzj310e0gu18r.jpg)
+
+按照这个目录找,然后下载medal.tv
+
+![image](https://tva2.sinaimg.cn/large/006rgJELly1h0856ckxjwj314k0msnc4.jpg)
+
+下载安装好之后你就可以看到这个:
+
+![image](https://tvax3.sinaimg.cn/large/006rgJELly1h08586y5m6j30zw0n2gzs.jpg)
+
+# 文件的保存位置
+
+文件都保存在电脑的“视频”文件夹。
+
+可以直接copy出来用。
+
+![image](https://tvax1.sinaimg.cn/large/006rgJELly1h085anh5vfj30ug0i0q7g.jpg)
diff --git "a/content/post/old/\346\274\253\347\224\273\350\275\257\344\273\266\346\216\250\350\215\220.md" "b/content/post/old/\346\274\253\347\224\273\350\275\257\344\273\266\346\216\250\350\215\220.md"
new file mode 100644
index 00000000..7fff9b2d
--- /dev/null
+++ "b/content/post/old/\346\274\253\347\224\273\350\275\257\344\273\266\346\216\250\350\215\220.md"
@@ -0,0 +1,44 @@
++++
+title = "漫画软件推荐"
+description = ""
+date = 2022-05-20T13:27:25+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ ""
+]
+series = []
+images = []
+
++++
+
+> 最近我想看一拳超人漫画,我需要看高质量(清晰度)的并且不要bilibili漫画←它要钱而且差不多一章一块钱!最终我找到了下载版的,是汉化组的微信公众号里面提供的,(团子汉化组)感谢他们!
+>
+> 但是接下来我就需要面对一个问题,我已经好久没有看离线漫画了,我不知道什么软件看漫画最好~经过了一天的搜索和寻找我发现了下面这些好软件让我来一一说明:
+
+# IOS 平台
+
+![1BCBA746FDCA066B06603D25A3AD0FC1](https://tva2.sinaimg.cn/large/006rgJELgy1h2et75kgjgj30x60q2tkv.jpg)
+
+这个阅读器有着非常简介的界面(几乎像是一个原生APP),通过IOS文件App对漫画进行导入,支持快速的批量导入,记录阅读历史之类的都是必备技能啦。
+
+他还有一个亮点功能(虽然对我这种原图是2页的不太好用),就是自动放大阅读,他对一个漫画页进行只能切分,从上往下每一个个格子放大看,就像翻页一样。
+
+# Windows 平台
+
+win平台我推荐这个软件:[NeeView](https://bitbucket.org/neelabo/neeview/wiki/Home)
+
+我还给这个软件做了一个视频:[PC 电脑端看漫画软件 NeeView (windows)](https://www.bilibili.com/video/BV1N3411P78V)
+
+![image](https://tva4.sinaimg.cn/large/006rgJELly1h2etcdbbc1j31hc0sfx5y.jpg)
+
+可以说它是win平台唯一的选择了,windows上面的看漫画软件可以说基本没有了,只有它一个…
+
+同时我这里推荐一个开源的看图软件[qimgv](https://github.com/easymodo/qimgv/releases)(支持linux和win),这个看图软件不能打开压缩包,但是看文件夹里面的图却是很厉害,非常适合阅读大量图片,但是用这个软件你可能想要修改一下快捷键。
+
+![image](https://tva1.sinaimg.cn/large/006rgJELly1h2eteq4m48j30ud0kmwpc.jpg)
diff --git "a/content/post/old/\347\233\222\347\233\226\344\270\215\345\205\263\346\234\272.md" "b/content/post/old/\347\233\222\347\233\226\344\270\215\345\205\263\346\234\272.md"
new file mode 100644
index 00000000..88a2f4b2
--- /dev/null
+++ "b/content/post/old/\347\233\222\347\233\226\344\270\215\345\205\263\346\234\272.md"
@@ -0,0 +1,25 @@
++++
+
+title = "盒盖不关机"
+date = "2021-05-29"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "命令行"]
+keywords = ["hugo2", ""]
+description = ""
+showFullContent = false
+
++++
+
+1、编辑 logind.conf 文件,命令如下
+
+ sudo vim /etc/systemd/logind.conf
+
+2、把所有相关 HandleLidSwitch 的值都改成 ignore
+
+3、执行让修改的内容即时生效,输入命令:
+
+systemctl restart systemd-logind
+
+(实时生效命令可能不能用,我这边ubuntu20.04使用了之后不停卡登录界面)
+
diff --git "a/content/post/old/\350\207\252\345\255\246 linux \345\221\275\344\273\244.md" "b/content/post/old/\350\207\252\345\255\246 linux \345\221\275\344\273\244.md"
new file mode 100644
index 00000000..ca366f28
--- /dev/null
+++ "b/content/post/old/\350\207\252\345\255\246 linux \345\221\275\344\273\244.md"
@@ -0,0 +1,521 @@
++++
+
+title = "自学 linux 命令"
+date = "2022-08-18"
+author = "kasusa"
+cover = ""
+tags = ["ubuntu", "命令行"]
+keywords = ["", ""]
+description = "自学 linux 命令"
+showFullContent = false
+
++++
+
+[官方培训课程](https://www.linuxprobe.com/training)
+
+## 控制台常用快捷键
+按键 | 作用
+---|---
+Ctrl+d | 键盘输入结束或退出终端
+Ctrl+s | 暂停当前程序,暂停后按下任意键恢复运行
+Ctrl+z | 将当前程序放到后台运行,恢复到前台为命令fg
+Ctrl+a | 将光标移至输入行头,相当于Home键
+Ctrl+e | 将光标移至输入行末,相当于End键
+Ctrl+k | 删除从光标所在位置到行末
+Alt+Backspace | 向前删除一个单词
+Shift+PgUp | 将终端显示向上滚动
+Shift+PgDn | 将终端显示向下滚动
+
+## 一次性创建多个文件
+```
+#实际上是一个简单的shell loop
+$ touch love_{1..10}_shiyanlou.txt
+```
+
+## 常用通配符
+
+字符 |含义
+---|---
+* |匹配 0 或多个字符
+? | 匹配任意一个字符
+[list] | 匹配 list 中的任意单一字符
+[^list] | 匹配 除 list 中的任意单一字符以外的字符
+[c1-c2] | 匹配 c1-c2 中的任意单一字符 如:[0-9][a-z]
+{string1,string2,...} | 匹配 string1 或 string2 (或更多)其一字符串
+{c1..c2} | 匹配 c1-c2 中全部字符 如{1..10}
+
+# 用户管理
+
+创建用户(默认会让输入密码)
+```
+sudo adduser
+```
+修改密码
+```
+sudo passwd
+```
+切换用户
+```
+su
+```
+查看当前用户是谁
+```
+whoami
+```
+查看用户组
+```
+cat /etc/group | grep -E ""
+```
+给新建的用户sudo权限(第二条是centos里面的情况。)
+```
+usermod -G sudo
+usermod -aG wheel
+```
+删除用户(把它创建时自动创建的用户目录一并删除)
+```
+sudo deluser lilei --remove-home
+```
+ **adduser 和 useradd 的区别是什么**
+
+> 答:useradd 只创建用户,不会创建用户密码和工作目录,创建完了需要使用 passwd 去设置新用户的密码。adduser 在创建用户的同时,会创建工作目录和密码(提示你设置),做这一系列的操作。其实 useradd、userdel 这类操作更像是一种命令,执行完了就返回。而 adduser 更像是一种程序,需要你输入、确定等一系列操作
+查看所有登录的用户(都有谁,都在哪里登录)
+
+```
+who
+```
+
+# 常用东西
+
+## 配置主机名称
+
+`4.1.2 配置主机名称`
+
+1. 使用 Vim 编辑器修改“/etc/hostname”主机名称文件。
+2. 把原始主机名称删除后追加你想要起的名字。注意,使用 Vim 编辑器修改主机名称文件后,要在末行模式下执行:wq!命令才能保存并退出文档。
+3. 保存并退出文档,然后使用 hostname 命令检查是否修改成功。
+
+> 不好用的时候试着重新启动
+
+# 文件管理
+
+
+
+![图像权限](https://doc.shiyanlou.com/linux_base/3-10.png/wm)
+这个图是在使用`ls -l`时候前部的意义。
+
+chmod 修改权限。每一个数字代表对应权限
+```
+rwx|r-x|r-x
+111|101|101 = 755
+```
+
+chown 修改所有者
+```
+chown
+```
+## 在目录间移动
+
+```sh
+#去tmp目录
+cd /tmp
+#去上一层目录
+cd ..
+#去当前用户的home(无参数cd)
+cd
+```
+
+
+
+## 创建文件和目录
+
+touch 可以创建文件/更新文件时间戳。
+mkdir 可以创建目录
+mkdir -p 可以创建多级目录
+```
+ mkdir -p father/son/grandson
+```
+## 复制文件/目录
+复制文件
+```
+cp <文件> <目的地>
+```
+复制目录
+```writer
+cp <要复制的目录> <目的地>
+```
+
+## 删除文件
+```
+rm <文件>
+rm -r <目录>
+rm -f <文件> (包括有写保护的文件)
+rm -rf <任何东西>
+```
+
+## 移动和重命名
+
+```
+mv <原文件> <新位置>
+mv <原文件名> <新文件名字>
+```
+
+批量重命名
+
+```
+rename <'正则'> <通配符>
+```
+## linux文件目录结构
+![目录结构](https://doc.shiyanlou.com/linux_base/4-1.png/wm)
+
+# shell script
+
+
+
+## 变量
+
+声明变量
+```
+declare tmp
+```
+直接用=赋值同时也可以新建变量,注意不要在等号左右使用空格
+```
+tmp=helloyou
+```
+拿出变量tmp
+```
+echo $tmp
+```
+删除变量tmp
+```
+unset tmp
+```
+
+## 环境变量
+暂时设置一个环境变量
+```
+tmp=helloyuoman
+export tmp
+```
+永久设置一个环境变量
+```
+/etc/bashrc shell变量(有的 Linux 没有这个文件)
+/etc/profile 环境变量
+/home/usr/.profile 用户变量
+```
+shiyanlou的环境用的是zsh命令行,在根目录有一个`.zshrc`文件是初始化配置文件。
+可以使用这句来把 /home/shiyanlou/mybin 添加到path中
+
+> 注意,这里是用的 >> 它意味"追加" , > 是覆盖的意思
+```
+$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
+```
+直接刷新环境变量(无需开新的zsh)**两种等效**
+```
+source .zshrc
+. .zshrc
+```
+
+
+## 修改已有变量
+变量设置方式 | 说明
+---|---
+${变量名#匹配字串} | 从头向后开始匹配,删除符合匹配字串的最短数据
+${变量名##匹配字串} | 从头向后开始匹配,删除符合匹配字串的最长数据
+${变量名%匹配字串} | 从尾向前开始匹配,删除符合匹配字串的最短数据
+${变量名%%匹配字串} | 从尾向前开始匹配,删除符合匹配字串的最长数据
+${变量名/旧的字串/新的字串} | 将符合旧字串的第一个字串替换为新的字串
+${变量名//旧的字串/新的字串} | 将符合旧字串的全部字串替换为新的字串
+
+
+## 搜索文件
+whereis 简单快速
+
+> whereis 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)。如果想要获得更全面的搜索结果可以使用 locate 命令。
+
+locate快而全 使用要先安装,并且更新索引数据库
+```
+sudo apt-get update
+sudo apt-get install locate
+sudo updatedb
+```
+
+find 超强大
+> 寻找/etc中(包括子目录)名为的 sources.list文件
+```
+find /etc -name sources.list
+```
+
+
+## man 命令中常用按键以及用途
+
+按键 |用途
+---|---
+空格键 | 向下翻一页
+/ |从上至下搜索某个关键词,如“/linux”
+? |从下至上搜索某个关键词,如“?linux”
+n | 定位到下一个搜索到的关键词
+N | 定位到上一个搜索到的关键词
+
+# 系统状态
+## ps aux命令
+状态值|意义
+---|---
+R(运行)| 进程正在运行或在运行队列中等待。
+S(中断)| 进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该状态。
+D(不可中断)| 进程不响应系统异步信号,即便用 kill 命令也不能将其中断。
+Z(僵死)| 进程已经终止,但进程描述符依然存在, 直到父进程调用 wait4()系统函数后将进程释放。
+T(停止)| 进程收到停止信号后停止运行。
+
+如果我们在系统终端中执行一个命令后想立即停止它,可以同时按下 ` Ctrl + C` 组合
+键(生产环境中比较常用的一个快捷键),这样将立即终止该命令的进程。或者,如果
+有些命令在执行时不断地在屏幕上输出信息,影响到后续命令的输入,则可以在执
+行命令时在末尾添加上一个 `&` 符号,这样命令将进入系统后台来执行。
+
+## ifconfig 命令
+ifconfig 命令用于获取网卡配置与网络状态等信息,格式为“ifconfig [网络设备] [参数]”。使用 ifconfig 命令来查看本机当前的网卡配置与网络状态等信息时,其实主要查看的就是网卡名称、inet 参数后面的 IP 地址、ether 参数后面的网卡物理地址(又称为 MAC 地址)
+
+## uptime 命令
+uptime 用于查看系统的负载信息,格式为 uptime。
+
+uptime 命令真的很棒,它可以显示当前系统时间、系统已运行时间、启用终端数量以及平均负载值等信息。平均负载值指的是系统在最近 1 分钟、5 分钟、15 分钟内的压力情况(下面加粗的信息部分);负载值越低越好,尽量不要长期超过 1,在生产环境中不要
+超过 5。
+
+## uname -a
+查看计算机的系统类型
+## free -h
+查看内存
+## last 命令
+last 命令用于查看所有系统的登录记录,格式为“last [参数]”。
+## history
+查看历史命令记录。
+`history -c` 清空记录
+
+# 切换目录
+## pwd 命令
+pwd 命令用于显示用户当前所处的工作目录,格式为“pwd [选项]”。
+## cd 命令
+cd| 命令用于切换工作路径,格式为“cd [目录名称]”。
+---|---
+`cd -` |命令返回到上一次所处的目录
+`cd ..` |命令进入上级目录
+`cd ` |命令切换到当前用户的家目录
+`cd ~username` |切换到其他用户的家目录。
+
+## ls
+命令|~
+---|---
+ls -a | 查看隐藏文件
+ls -l | 查看文件详细信息
+ls -la | 查看隐藏文件以及显示详细
+
+# 查看文件
+## cat 命令
+用来查看比较小的文本文件
+
+`cat -n` 查看文本内容时还想顺便显示行号
+`tac` 可以倒序输出文件.
+
+## more 命令
+
+```
+more <文件名>
+```
+more更加适合阅读长文件
+
+可以使用
+* enter 向下一行
+* space 向下一屏
+> Less 比more强多了
+
+## head 和 tail
+默认查看文件头部/尾部的10行。参数 -n 可以控制行数。
+
+tail可以使用 -f 查看最新一行.
+```
+head -n 1 <文件名>
+tail -f <文件名>
+```
+## wc 命令
+wc 命令用于统计指定文本的行数、字数、字节数,格式为“wc [参数] 文本”。
+
+` file` 命令来查看文件类型
+
+## 压缩
+`tar -czvf 压缩包名称.tar.gz 要打包的目录`
+
+- 打包-压缩-显示废话-选择目录
+
+x:解包
+
+c:打包
+
+## 搜索
+`grep` 命令用于在文本中执行关键词搜索,并显示匹配的结果,通常和别的命令结合使用,如cat、ps等
+
+~|~
+---|---
+ -b |将可执行文件(binary)当作文本文件(text)来搜索
+ -c |仅显示找到的行数
+ -i |忽略大小写
+ -n |显示行号
+ -v |反向选择 — 仅列出没有“关键词”的行
+
+```
+root@iZ2ze1hf17j9hv44rdpmaaZ:~# grep -n Jan you
+2:-rw-r--r-- 1 root root 17 Jan 12 2000 kasusa
+3:drwxr-xr-x 2 root root 4096 Jan 30 10:15 mydir
+4:drwxr-xr-x 2 root root 4096 Jan 30 10:16 mydir2
+5:drwxr-xr-x 2 root root 4096 Jan 30 11:47 ooo
+6:-rw-r--r-- 1 root root 0 Jan 30 11:51 you
+
+# you是一个文件。用显示行号的模式在you里面寻找 Jan 关键字 。在控制台里面会有高亮显示
+
+```
+
+## 别名
+可以用 `alias` 命令来创建一个属于自己的命令别名,格式为“`alias 别名=命令`”。
+
+若要取消一个命令别名,则是用 unalias 命令,格式为“unalias 别名”。
+
+可以写入.bashrc文件,或者是.zshrc文件,取决于你用的是啥shell,然后就可以永久用这些别名了。
+
+下面是一个我在macos上面使用的例子:
+
+```
+#显示有颜色的用户(不适合白色背景)
+export PS1="%10F%m%f:%11F%1~%f \$ "
+#online
+alias f="top -l 1 | head -n 10 | grep PhysMem" # 查看可用内存
+alias p="sudo purge" # 整理释放内存
+alias v="export http_proxy=http://127.0.0.1:7890;export https_proxy=http://127.0.0.1:7890" # 终端设置翻墙
+alias nv="unset http_proxy; unset https_proxy;" # 终端设置不翻墙
+alias ip="curl cip.cc" # 查看ip和是否翻墙
+alias py=python3
+
+```
+
+
+
+## 变量和全局
+一般来说,变量都是用大写的。
+
+有一些|常用的全局变量:
+---|---
+HOME |用户的主目录(即家目录)
+SHELL| 用户在使用的 Shell 解释器名称
+HISTSIZE |输出的历史命令记录条数
+HISTFILESIZE |保存的历史命令记录条数
+MAIL |邮件保存路径
+LANG |系统语言、语系名称
+RANDOM |生成一个随机数字
+PS1 Bash |解释器的提示符
+PATH |定义解释器搜索用户执行命令的路径
+EDITOR |用户默认的文本编辑器
+
+自己创建一个变量/读取它:
+```
+root@iZ2ze1hf17j9hv44rdpmaaZ:~# MYVAR="hello"
+root@iZ2ze1hf17j9hv44rdpmaaZ:~# echo "$MYVAR"
+hello
+```
+
+提升位全局变量:
+```
+root@iZ2ze1hf17j9hv44rdpmaaZ:~# export MYVAR
+```
+
+# VIM
+
+## Vim 中常用的命令
+
+命令| 作用
+---|---
+dd |删除(剪切)光标所在整行
+5dd |删除(剪切)从光标处开始的 5 行
+yy |复制光标所在整行
+5yy |复制从光标处开始的 5 行
+n |显示搜索命令定位到的下一个字符串
+N |显示搜索命令定位到的上一个字符串
+u |撤销上一步的操作
+p |将之前删除(dd)或复制(yy)过的数据粘贴到光标后面
+
+
+
+## 末行模式中可用的命令
+**要想切换到末行模式,在命令模式中输入一个冒号就可以了。**
+末行模式主要用于保存或退出文件,以及设置 Vim 编辑器的工作环境,还可以让用户执
+行外部的 Linux 命令或跳转到所编写文档的特定行数。
+
+命令 |作用
+---|---
+:w |保存
+:q |退出
+:q!|强制退出(放弃对文档的修改内容)
+:wq!| 强制保存退出
+:set| nu 显示行号
+:set| nonu 不显示行号
+:命令| 执行该命令
+:整数| 跳转到该行
+:s/one/two |将当前光标所在行的第一个 one 替换成 two
+:s/one/two/g |将当前光标所在行的所有 one 替换成 two
+:%s/one/two/g |将全文中的所有 one 替换成 two
+?字符串 |在文本中从下至上搜索该字符串
+/字符串 |在文本中从上至下搜索该字符串
+
+# append
+
+查看命令的来源:type
+
+```
+kasusadeMacBook-Pro:~ $ type who
+who is /usr/bin/who
+kasusadeMacBook-Pro:~ $ type cd
+cd is a shell builtin
+```
+
+输入输出导向:
+
+其中输出分成 普通输出、错误输出
+
+```sh
+any command < infile
+any command > outfile #Create/overwrite outfile
+any command >> outfile #Append to outfile
+any command 2> errorfile
+#普通输出、错误输出 同时输出到两个文件
+any command > outfile 2> errorfile
+#普通输出、错误输出合并输出到1个文件
+any command >& outfile
+any command &> outfile
+```
+
+一行执行多个命令
+
+```
+# 直接按顺序执行
+command1 ; command2 ; command3
+# 按顺序执行但是如果遇到错误会停止
+command1 && command2 && command3
+# 按顺序执行但是如果遇到成功的直接退出
+command1 || command2 || command3
+```
+
+引号
+
+> 一般来说空格作为分隔符,如果输入中要带空格需要用单or双引号把它扩起来
+
+- 单引号:原样输出
+- 双引号:可以在其中加入变量等
+- 反引号(tilda):反引号之中的字符串会作为变量来执行
+
+```
+→ echo 'The variable HOME has value $HOME'
+The variable HOME has value $HOME
+→ echo "The variable HOME has value $HOME"
+The variable HOME has value /home/smith
+→ echo This year is `date +%Y`
+This year is 2021
+→ echo hello `expr $(date +%Y) + 1` # expr可以用来做运算,但是要在运算符号之间加空格
+This year is 2023
+```
+
diff --git "a/content/post/old/\350\207\252\345\256\232\344\271\211ls\345\220\216\345\220\204\347\247\215\346\226\207\344\273\266\345\244\271\347\232\204\351\242\234\350\211\262.md" "b/content/post/old/\350\207\252\345\256\232\344\271\211ls\345\220\216\345\220\204\347\247\215\346\226\207\344\273\266\345\244\271\347\232\204\351\242\234\350\211\262.md"
new file mode 100644
index 00000000..5079ca7b
--- /dev/null
+++ "b/content/post/old/\350\207\252\345\256\232\344\271\211ls\345\220\216\345\220\204\347\247\215\346\226\207\344\273\266\345\244\271\347\232\204\351\242\234\350\211\262.md"
@@ -0,0 +1,85 @@
++++
+title = "自定义ls后各种文件夹的颜色"
+description = ""
+date = 2022-05-22T16:14:26+08:00
+featured = false
+comment = true
+toc = true
+reward = true
+categories = [
+ ""
+]
+tags = [
+ "linux"
+]
+series = []
+images = ["https://tva2.sinaimg.cn/large/006rgJELgy1h2h9h5nahuj30qt0ewgwe.jpg"]
+
++++
+
+今天用WLS打开windows目录,一片亮瞎眼的绿色,再加上这个复古特效,真的字都看不清了:
+
+![image](https://tva3.sinaimg.cn/large/006rgJELgy1h2h94lpkckj30it047q5g.jpg)
+
+在网上搜了一圈修改办法,终于找到一个有用的文章:[在WSL环境下修改文件夹的颜色](https://sspai.com/post/39499)
+
+# 操作步骤
+
+回到主目录然后导出(新建)一个.dircolors文件
+
+```
+cd ~/
+dircolors -p > .dircolors
+```
+
+使用vim打开这个新文件(vim可以看见设置的颜色效果,搜索`OTHER_WRITABLE`
+
+```
+vim ~/.dircolors
+```
+
+把颜色修改成你想要的,有前景色、背景色、字体三种东西可以修改,具体的样式数字
+修改好了之后 :wq 保存退出
+
+最后用 `source ~/.bashrc` 重加载一下bash配置文件即可完成修改了
+
+![image](https://tva2.sinaimg.cn/large/006rgJELgy1h2h9h5nahuj30qt0ewgwe.jpg)
+
+
+
+# 颜色列表
+
+> 这个颜色列表应该在很多程序中都用得到,比如各种输出,他们的颜色应该都是用的同一种映射
+
+你可以修改成任何你要字体、前景色、背景色搭配,用`;`分开即可
+
+例如 **加粗 黑色字 Cyan背景** = `01;30;46`
+
+```bash
+# 字体
+00 //默认
+01 //加粗
+04 //下划线
+05 //闪烁
+07 //反显
+08 //隐藏
+# 文字颜色
+30 — Black //黑色
+31 — Red //红色
+32 — Green //绿色
+33 — Yellow //黄色
+34 — Blue //蓝色
+35 — Magenta //洋红色
+36 — Cyan //蓝绿色
+37 — White //白色
+# 背景颜色
+40 — Black
+41 — Red
+42 — Green
+43 — Yellow
+44 — Blue
+45 — Magenta
+46 — Cyan
+47 – White
+```
+
diff --git "a/content/post/old/\350\247\206\351\242\221\347\275\221\347\253\231\351\233\206.md" "b/content/post/old/\350\247\206\351\242\221\347\275\221\347\253\231\351\233\206.md"
new file mode 100644
index 00000000..a0153ffb
--- /dev/null
+++ "b/content/post/old/\350\247\206\351\242\221\347\275\221\347\253\231\351\233\206.md"
@@ -0,0 +1,42 @@
++++
+
+title = "视频网站集"
+date = "2021-07-18"
+author = "kasusa"
+cover = ""
+tags = ["web", "导航"]
+keywords = ["", ""]
+description = "快速跳转视频站点"
+showFullContent = false
+featured = true
++++
+
+### 正规站
+
+bilibili [https://www.bilibili.com/](https://www.bilibili.com/)
+
+netflix [https://www.netflix.com/browse](https://www.netflix.com/browse)
+
+
+
+### 正常剧
+
+- 低端影视 [https://ddrk.me/](https://ddrk.me/)
+- 奈飞影视 https://www.nfmovies.com/
+
+### 动画片
+
+- 紫可可 [http://zikeke.net/](http://zikeke.net/)
+- AGE FANS [https://www.agefans.cc/](https://www.agefans.cc/)
+
+## 短视频
+
+- Coub [https://coub.com/](https://coub.com/)
+- 开眼 [https://home.eyepetizer.net/](https://home.eyepetizer.net/)
+
+### emmm
+
+- X video [https://www.xvideos.com/](https://www.xvideos.com/)
+- Sex.com [https://www.sex.com/](https://www.sex.com/)
+- PornHub [https://cn.pornhub.com/](https://cn.pornhub.com/)
+
diff --git "a/content/post/old/\350\256\251steam\347\273\225\350\277\207Clash\347\263\273\347\273\237\344\273\243\347\220\206.md" "b/content/post/old/\350\256\251steam\347\273\225\350\277\207Clash\347\263\273\347\273\237\344\273\243\347\220\206.md"
new file mode 100644
index 00000000..a22a858d
--- /dev/null
+++ "b/content/post/old/\350\256\251steam\347\273\225\350\277\207Clash\347\263\273\347\273\237\344\273\243\347\220\206.md"
@@ -0,0 +1,131 @@
++++
+title = "steam如何绕过clash的全局代理"
+description = ""
+date = 2021-11-30T13:11:11+08:00
+featured = false
+draft = false
+comment = true
+toc = true
+reward = true
+categories = [
+""
+]
+tags = [
+ "clash","steam"
+]
+series = []
+images = []
+
++++
+我想要默认开启电脑的clash全局代理。但是要求steam这个东东登录和下载(尤其是游戏下载)不要走代理。下载太耗费流量了,还不能跑满网速。
+
+下载游戏的同时我还会上网。如果特意为了steam把clash关了我就不能上外网了。
+
+最后在github的一个issue里面看到了这个:
+[0.16.2 版,Steam 商店、社区无法加载 · Issue #2035 · Fndroid/clash_for_windows_pkg (github.com)](https://github.com/Fndroid/clash_for_windows_pkg/issues/2035)
+
+```ini
+bypass:
+# Steam中国大陆地区游戏下载
+ - "steampipe.steamcontent.tnkjmec.com" #华为云
+ - "st.dl.eccdnx.com" #白山云
+ - "st.dl.bscstorage.net"
+ - "st.dl.pinyuncloud.com"
+ - "dl.steam.clngaa.com" #金山云
+ - "cdn.mileweb.cs.steampowered.com.8686c.com" #网宿云
+ - "cdn-ws.content.steamchina.com"
+ - "cdn-qc.content.steamchina.com" #腾讯云
+ - "cdn-ali.content.steamchina.com" #阿里云
+# Steam非中国大陆地区游戏下载/社区实况直播
+ - "*.steamcontent.com"
+# Steam国际创意工坊下载CDN
+ - "steamusercontent-a.akamaihd.net" #CDN-Akamai
+# Origin游戏下载
+ - "ssl-lvlt.cdn.ea.com" #CDN-Level3
+ - "origin-a.akamaihd.net" #CDN-Akamai
+# Battle.net战网中国大陆地区游戏下载
+ - "client05.pdl.wow.battlenet.com.cn" #华为云
+ - "client02.pdl.wow.battlenet.com.cn" #网宿云
+# Battle.net战网非中国大陆地区游戏下载
+ - "level3.blizzard.com" #CDN-Level3
+ - "blzddist1-a.akamaihd.net" #CDN-Akamai
+ - "blzddistkr1-a.akamaihd.net"
+ - "kr.cdn.blizzard.com" #CDN-Blizzard
+ - "us.cdn.blizzard.com"
+ - "eu.cdn.blizzard.com"
+# Epic Games中国大陆地区游戏下载
+ - "epicgames-download1-1251447533.file.myqcloud.com"
+# Epic Games非中国大陆地区游戏下载
+ - "epicgames-download1.akamaized.net" #CDN-Akamai
+ - "download.epicgames.com" #CDN-Amazon
+ - "download2.epicgames.com"
+ - "download3.epicgames.com"
+ - "download4.epicgames.com"
+# Rockstar Launcher客户端更新/游戏更新/游戏下载
+ - "gamedownloads-rockstargames-com.akamaized.net"
+# GOG中国大陆游戏下载/客户端更新
+ - "gog.qtlglb.com"
+# GOG非中国大陆游戏下载/客户端更新
+ - "cdn.gog.com"
+ - "galaxy-client-update.gog.com"
+ - localhost
+ - 127.*
+ - 10.*
+ - 172.16.*
+ - 172.17.*
+ - 172.18.*
+ - 172.19.*
+ - 172.20.*
+ - 172.21.*
+ - 172.22.*
+ - 172.23.*
+ - 172.24.*
+ - 172.25.*
+ - 172.26.*
+ - 172.27.*
+ - 172.28.*
+ - 172.29.*
+ - 172.30.*
+ - 172.31.*
+ - 192.168.*
+ -
+
+```
+
+# 使用方法
+原理:在bypass列表中的域名、ip会直接跳过
+- 域名需要用英文双引号包起来
+- ip可以直接写
+- 可以使用【星号】作为通配符
+打开clash的设置,找到bypass,按照需要粘贴并保存:
+![[Pasted image 20211130132003.png]]
+![[Pasted image 20211130132122.png]]
+
+# 我的例子
+这个例子方便我后面自己取用。
+
+```ini
+bypass:
+ - "*.bing.com"
+ - "*.microsoft.com"
+# Steam中国大陆地区游戏下载
+ - "steampipe.steamcontent.tnkjmec.com" #华为云
+ - "st.dl.eccdnx.com" #白山云
+ - "st.dl.bscstorage.net"
+ - "st.dl.pinyuncloud.com"
+ - "dl.steam.clngaa.com" #金山云
+ - "cdn.mileweb.cs.steampowered.com.8686c.com" #网宿云
+ - "cdn-ws.content.steamchina.com"
+ - "cdn-qc.content.steamchina.com" #腾讯云
+ - "cdn-ali.content.steamchina.com" #阿里云
+# Steam非中国大陆地区游戏下载/社区实况直播
+ - "*.steamcontent.com"
+# Battle.net战网中国大陆地区游戏下载
+ - "client05.pdl.wow.battlenet.com.cn" #华为云
+ - "client02.pdl.wow.battlenet.com.cn" #网宿云
+# Epic Games中国大陆地区游戏下载
+ - "epicgames-download1-1251447533.file.myqcloud.com"
+# Rockstar Launcher客户端更新/游戏更新/游戏下载
+ - "gamedownloads-rockstargames-com.akamaized.net"
+
+```
diff --git a/static/burp.png b/static/burp.png
new file mode 100644
index 00000000..98a8fbf6
Binary files /dev/null and b/static/burp.png differ
diff --git a/static/cover.png b/static/cover.png
new file mode 100644
index 00000000..a7178de2
Binary files /dev/null and b/static/cover.png differ
diff --git a/static/favicon3.png b/static/favicon3.png
deleted file mode 100644
index e53125da..00000000
Binary files a/static/favicon3.png and /dev/null differ
diff --git a/static/tmux.jpg b/static/tmux.jpg
new file mode 100644
index 00000000..b96f2b63
Binary files /dev/null and b/static/tmux.jpg differ
diff --git a/static/vscode.jpg b/static/vscode.jpg
new file mode 100644
index 00000000..c3fb9d5d
Binary files /dev/null and b/static/vscode.jpg differ
diff --git a/static/wireguard.png b/static/wireguard.png
new file mode 100644
index 00000000..d4fa560b
Binary files /dev/null and b/static/wireguard.png differ