在这里让我们一起学习,一起提高!
1、安装flutter
创建
D:\java\flutter
下载安装包,解压复制到该目录,运行flutter_console.bat。
添加环境变量path ,
D:\java\flutter\bin
D:\java\flutter\bin\cache\dart-sdk
环境变量:
PUB_HOSTED_URL=https://pub.flutter-io.cn
FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
2、安装git
正常安装
3、安装chrome
谷歌浏览器,正常安装,ghost环境安装自带的不行。
4、Java环境
修改安装目录为
修改jre安装目录为
D:\java\jre1.8.0_431
修改系统变量
JAVA_HOME
D:\java\jdk-1.8
JRE_HOME
D:\java\jre1.8.0_431
CLASSPATH
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; //记得前面有个"."
Path
%JAVA_HOME%\bin
%JRE_HOME%\bin
5 安装amazon-corretto-17.0.14.7.1-windows-x64到
D:\Corretto
6、安装andorid studio
安装到
D:\androidstudio\androidSetup
其中选择自定义安装,选择安装SDK的目录
D:\androidstudio\SDK
无法下载 android SDk 配置服务器代理ip
网站检测 https://ping.chinaz.com/
在当前网站中输入 dl.google.com
host绑定比较快的地区
安装flutter和Dart插件
7、安装VisualStudioSetup
选择C++桌面开发和右侧的win10 SDK
创建
D:\java\flutter
下载安装包,解压复制到该目录,运行flutter_console.bat。
添加环境变量path ,
D:\java\flutter\bin
D:\java\flutter\bin\cache\dart-sdk
环境变量:
PUB_HOSTED_URL=https://pub.flutter-io.cn
FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
2、安装git
正常安装
3、安装chrome
谷歌浏览器,正常安装,ghost环境安装自带的不行。
4、Java环境
修改安装目录为
D:\java\jdk-1.8
修改jre安装目录为
D:\java\jre1.8.0_431
修改系统变量
JAVA_HOME
D:\java\jdk-1.8
JRE_HOME
D:\java\jre1.8.0_431
CLASSPATH
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; //记得前面有个"."
Path
%JAVA_HOME%\bin
%JRE_HOME%\bin
5 安装amazon-corretto-17.0.14.7.1-windows-x64到
D:\Corretto
6、安装andorid studio
安装到
D:\androidstudio\androidSetup
其中选择自定义安装,选择安装SDK的目录
D:\androidstudio\SDK
无法下载 android SDk 配置服务器代理ip
网站检测 https://ping.chinaz.com/
在当前网站中输入 dl.google.com
host绑定比较快的地区
安装flutter和Dart插件
7、安装VisualStudioSetup
选择C++桌面开发和右侧的win10 SDK
一、在Ubuntu服务器上部署DeepSeek模型
要在Ubuntu上通过Ollama安装和使用DeepSeek模型,可以按照以下步骤操作:
安装Ollama
1、使用命令安装Ollama
curl -sSfL https://ollama.com/install.sh | sh
2、验证安装是否成功
安装完之后,您可以通过以下命令验证Ollama是否安装成功
ollama --version
下载DeepSeek模型
ollama pull deepseek-r1:14b
运行模型
ollama run deepseek-r1:14b
远程访问:
sudo vi /etc/systemd/system/ollama.service
增加
Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_ORIGINS=*"
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
#Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
#EnVironment="OLTAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_ORIGINS=*"
[Install]
#WantedBy=default.target
WantedBy=multi-user.target
重启服务
systemctl daemon-reload
systemctl restart ollama
验证Ollama服务是否正常运行
sudo netstat -tulpn | grep ollama
如图所示,则为正常。

测试远程访问
curl http://192.168.2.150:11434
返回
Ollama is running
则正常
要在Ubuntu上通过Ollama安装和使用DeepSeek模型,可以按照以下步骤操作:
安装Ollama
1、使用命令安装Ollama
curl -sSfL https://ollama.com/install.sh | sh
2、验证安装是否成功
安装完之后,您可以通过以下命令验证Ollama是否安装成功
ollama --version
下载DeepSeek模型
ollama pull deepseek-r1:14b
运行模型
ollama run deepseek-r1:14b
远程访问:
sudo vi /etc/systemd/system/ollama.service
增加
Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_ORIGINS=*"
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
#Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
#EnVironment="OLTAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_ORIGINS=*"
[Install]
#WantedBy=default.target
WantedBy=multi-user.target
重启服务
systemctl daemon-reload
systemctl restart ollama
验证Ollama服务是否正常运行
sudo netstat -tulpn | grep ollama
如图所示,则为正常。
测试远程访问
curl http://192.168.2.150:11434
返回
Ollama is running
则正常
引言
作为使用最广泛的Web服务器之一,Nginx的安全配置显得尤为重要。本文将从多个维度详细介绍如何增强Nginx的安全性,帮助开发运维人员构建一个更安全的Web服务环境。
一、基础安全配置
1. 隐藏版本号信息
默认情况下,Nginx会在响应头中显示版本号,这可能会给攻击者提供服务器信息。攻击者可以根据版本号查找对应版本的已知漏洞进行定向攻击。
作为使用最广泛的Web服务器之一,Nginx的安全配置显得尤为重要。本文将从多个维度详细介绍如何增强Nginx的安全性,帮助开发运维人员构建一个更安全的Web服务环境。
一、基础安全配置
1. 隐藏版本号信息
默认情况下,Nginx会在响应头中显示版本号,这可能会给攻击者提供服务器信息。攻击者可以根据版本号查找对应版本的已知漏洞进行定向攻击。
前言
SSH(Secure Shell)是用于安全远程登录和管理服务器的协议,但其广泛使用也使其成为攻击者暴力破解的目标。SSH爆破攻击是指攻击者通过不断尝试用户名和密码组合,试图破解服务器的登录凭证。这种攻击不仅会消耗服务器资源,还可能导致系统被入侵。因此,采取有效的措施防止SSH爆破攻击至关重要。
实现方式
在Linux系统中,/etc/hosts.allow和/etc/hosts.deny文件用于控制对服务的访问权限。这两个文件的规则基于TCP Wrapper机制,允许系统管理员定义哪些IP地址或主机可以访问特定服务(如SSH)。
SSH(Secure Shell)是用于安全远程登录和管理服务器的协议,但其广泛使用也使其成为攻击者暴力破解的目标。SSH爆破攻击是指攻击者通过不断尝试用户名和密码组合,试图破解服务器的登录凭证。这种攻击不仅会消耗服务器资源,还可能导致系统被入侵。因此,采取有效的措施防止SSH爆破攻击至关重要。
实现方式
在Linux系统中,/etc/hosts.allow和/etc/hosts.deny文件用于控制对服务的访问权限。这两个文件的规则基于TCP Wrapper机制,允许系统管理员定义哪些IP地址或主机可以访问特定服务(如SSH)。
在Ubuntu 20.04上安装NVIDIA CUDA Toolkit的步骤如下:
确保你的系统已经安装了NVIDIA的官方驱动。
打开终端,并且添加NVIDIA的CUDA存储库的公钥:
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
添加CUDA存储库到你的系统:
echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64 /" | sudo tee /etc/apt/sources.list.d/cuda.list
更新软件包列表:
sudo apt update
安装CUDA Toolkit(你可以根据需要安装特定版本的CUDA Toolkit,例如cuda-11-2):
sudo apt install cuda-toolkit-11-2
配置环境变量。将以下内容添加到你的.bashrc或.profile文件中:
export PATH=/usr/local/cuda-11.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
重新加载环境变量:
source ~/.bashrc
或者使用.profile文件的话使用source ~/.profile。
验证安装:
nvcc --version
以上步骤会安装CUDA Toolkit以及NVIDIA驱动,如果你已经安装了驱动,则不需要再次安装。请确保在执行这些步骤之前你已经备份了重要数据,并且你有足够的权限来修改系统设置。
确保你的系统已经安装了NVIDIA的官方驱动。
打开终端,并且添加NVIDIA的CUDA存储库的公钥:
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub
添加CUDA存储库到你的系统:
echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64 /" | sudo tee /etc/apt/sources.list.d/cuda.list
更新软件包列表:
sudo apt update
安装CUDA Toolkit(你可以根据需要安装特定版本的CUDA Toolkit,例如cuda-11-2):
sudo apt install cuda-toolkit-11-2
配置环境变量。将以下内容添加到你的.bashrc或.profile文件中:
export PATH=/usr/local/cuda-11.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
重新加载环境变量:
source ~/.bashrc
或者使用.profile文件的话使用source ~/.profile。
验证安装:
nvcc --version
以上步骤会安装CUDA Toolkit以及NVIDIA驱动,如果你已经安装了驱动,则不需要再次安装。请确保在执行这些步骤之前你已经备份了重要数据,并且你有足够的权限来修改系统设置。
最近在使用 apt-install 命令安装一些包时发现巨卡顿,一个原因肯定是自己家的网速有点慢了,当然最重要的原因还是 apt 源是国外的。网上看到了许多博主的换源过程,但发现他们的操作稍微有点复杂,而且需要修改 source 源文件,为了防止手残导致源文件出错,我直接使用 echo (输出命令)在终端修改源文件,添加源。
依次输入下面几行命令就可以成功将 apt 的源更换为国内的了,
sudo su
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
apt-get update
apt-get upgrade
依次输入下面几行命令就可以成功将 apt 的源更换为国内的了,
sudo su
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
apt-get update
apt-get upgrade
创建配置目录和文件
docker pull是由守护进程dockerd执行,因此代理需添加在dockerd的systemd配置中。
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf
编辑proxy.conf文件
[Service]
Environment="HTTP_PROXY=socks5://192.168.2.103:10808"
Environment="HTTPS_PROXY=socks5://192.168.2.103:10808"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
socks5://192.168.2.103:10808替换为你的本地代理
重载systemd并重启docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
参考
https://zhuanlan.zhihu.com/p/678307663
https://blog.csdn.net/qf0129/article/details/135729862
docker pull是由守护进程dockerd执行,因此代理需添加在dockerd的systemd配置中。
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf
编辑proxy.conf文件
[Service]
Environment="HTTP_PROXY=socks5://192.168.2.103:10808"
Environment="HTTPS_PROXY=socks5://192.168.2.103:10808"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
socks5://192.168.2.103:10808替换为你的本地代理
重载systemd并重启docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
参考
https://zhuanlan.zhihu.com/p/678307663
https://blog.csdn.net/qf0129/article/details/135729862
下载源码
wget https://nodejs.org/dist/v8.11.4/node-v8.11.4-linux-x64.tar.xz
解压源码
tar xvf node-v8.11.4-linux-x64.tar.xz
创建node目录
cd /usr/local/
mkdir node
复制程序
cd node-v8.11.4-linux-x64/
mv * /usr/local/node/
建立连接
ln -s /usr/local/node/bin/node /usr/local/bin/node
ln -s /usr/local/node/bin/npm /usr/local/bin/npm
测试一下
node -v
npm -v
wget https://nodejs.org/dist/v8.11.4/node-v8.11.4-linux-x64.tar.xz
解压源码
tar xvf node-v8.11.4-linux-x64.tar.xz
创建node目录
cd /usr/local/
mkdir node
复制程序
cd node-v8.11.4-linux-x64/
mv * /usr/local/node/
建立连接
ln -s /usr/local/node/bin/node /usr/local/bin/node
ln -s /usr/local/node/bin/npm /usr/local/bin/npm
测试一下
node -v
npm -v
示例一:
namespace service.threads;
//服务主线程
main = function(serviceName){
import service;
import thread.event;
import fsys.log;
import console;
import sys.volume;
import process;
import fsys.dirWatcher;
import fsys.dlg.dir;
service.msgbox("服务已启动");
console.open();
//取所有分区信息
var drives = sys.volume.getLogicalDrives()
for(i,drv in drives){
var info = sys.volume.getInfo( drv );
if(info){
var watchDir = info.drive;
watcher = fsys.dirWatcher( watchDir )
for( filename,action in watcher.eachChanges() ){
fsys.log.print( watchDir + "\" + filename," -> ",action,'\r\n')
console.log( watchDir + "\" + filename," -> ",action,'\r\n')
}
}
}
}
//注意这也是一个独立的线程,用户控制服务停止或启动时都会触发此函数
control = function(control,eventType,pEventData){
import service;
import thread.event;
var evtTask = thread.event("NT.SERVICE.CONTROL." + owner.serviceName,false);
if( control == 0x1/*_SERVICE_CONTROL_STOP*/ ){
//控制线程中更新srvStatus,第一个参数只要指定需要更新的字段就行了
service.updateStatus({currentState = 0x3/*_SERVICE_STOP_PENDING*/},owner.serviceName);
evtTask.set();//使事件对象切换为有信号状态,使wait函数退出
}
return 0x0/*_NOERROR*/
}
示例二:
namespace service.threads;
//服务主线程
main = function(serviceName){
import service;
import thread.event;
import fsys.log;
import console;
import win.ui;
import fsys.dirWatcher;
import fsys.dlg.dir;
//用win.form创建一个线程外包对象
var winform = win.form();
winform.messageOnly();//告诉他不需要显示窗口,只保留能处理消息的功能
var watchDir = "C:";
//创建监视线程
winform.thrdWatcher = fsys.dirWatcher.thread(
function(filename,action,actionText){
fsys.log.print( watchDir + "\" + filename," -> ",action,'\r\n')
console.log( watchDir + "\" + filename," -> ",action,'\r\n')
}, watchDir);
win.loopMessage();
}
//注意这也是一个独立的线程,用户控制服务停止或启动时都会触发此函数
control = function(control,eventType,pEventData){
import service;
import thread.event;
var evtTask = thread.event("NT.SERVICE.CONTROL." + owner.serviceName,false);
if( control == 0x1/*_SERVICE_CONTROL_STOP*/ ){
//控制线程中更新srvStatus,第一个参数只要指定需要更新的字段就行了
service.updateStatus({currentState = 0x3/*_SERVICE_STOP_PENDING*/},owner.serviceName);
evtTask.set();//使事件对象切换为有信号状态,使wait函数退出
}
return 0x0/*_NOERROR*/
}
namespace service.threads;
//服务主线程
main = function(serviceName){
import service;
import thread.event;
import fsys.log;
import console;
import sys.volume;
import process;
import fsys.dirWatcher;
import fsys.dlg.dir;
service.msgbox("服务已启动");
console.open();
//取所有分区信息
var drives = sys.volume.getLogicalDrives()
for(i,drv in drives){
var info = sys.volume.getInfo( drv );
if(info){
var watchDir = info.drive;
watcher = fsys.dirWatcher( watchDir )
for( filename,action in watcher.eachChanges() ){
fsys.log.print( watchDir + "\" + filename," -> ",action,'\r\n')
console.log( watchDir + "\" + filename," -> ",action,'\r\n')
}
}
}
}
//注意这也是一个独立的线程,用户控制服务停止或启动时都会触发此函数
control = function(control,eventType,pEventData){
import service;
import thread.event;
var evtTask = thread.event("NT.SERVICE.CONTROL." + owner.serviceName,false);
if( control == 0x1/*_SERVICE_CONTROL_STOP*/ ){
//控制线程中更新srvStatus,第一个参数只要指定需要更新的字段就行了
service.updateStatus({currentState = 0x3/*_SERVICE_STOP_PENDING*/},owner.serviceName);
evtTask.set();//使事件对象切换为有信号状态,使wait函数退出
}
return 0x0/*_NOERROR*/
}
示例二:
namespace service.threads;
//服务主线程
main = function(serviceName){
import service;
import thread.event;
import fsys.log;
import console;
import win.ui;
import fsys.dirWatcher;
import fsys.dlg.dir;
//用win.form创建一个线程外包对象
var winform = win.form();
winform.messageOnly();//告诉他不需要显示窗口,只保留能处理消息的功能
var watchDir = "C:";
//创建监视线程
winform.thrdWatcher = fsys.dirWatcher.thread(
function(filename,action,actionText){
fsys.log.print( watchDir + "\" + filename," -> ",action,'\r\n')
console.log( watchDir + "\" + filename," -> ",action,'\r\n')
}, watchDir);
win.loopMessage();
}
//注意这也是一个独立的线程,用户控制服务停止或启动时都会触发此函数
control = function(control,eventType,pEventData){
import service;
import thread.event;
var evtTask = thread.event("NT.SERVICE.CONTROL." + owner.serviceName,false);
if( control == 0x1/*_SERVICE_CONTROL_STOP*/ ){
//控制线程中更新srvStatus,第一个参数只要指定需要更新的字段就行了
service.updateStatus({currentState = 0x3/*_SERVICE_STOP_PENDING*/},owner.serviceName);
evtTask.set();//使事件对象切换为有信号状态,使wait函数退出
}
return 0x0/*_NOERROR*/
}