About Aimer Neige

中北大学学生,学习物联网专业。Linux 用户,热爱开源和分享。

The RSS's url is : https://aimerneige.com/zh/index.xml

Please copy to your reader or subscribe it with :

Preview of RSS feed of Aimer Neige

如何禁止电脑开机时自动连接蓝牙耳机

2023-04-17 17:49:10

前言 由于电子设备比较多,蓝牙耳机配对的设备也比较多,这就引起了一个问题,本来连着手机听歌听的好好的,电脑开机之后就会自动抢占蓝牙耳机的信号,导致我还得重新在手机上连接耳机,严重影响听歌体验,于是就查询了如何禁用电脑自动连接的行为,希望这篇文章对你也有用。 如何操作 编辑 /etc/bluetooth/main.conf 这个文件: sudo vim /etc/bluetooth/main.conf 找到这些内容: # AutoEnable defines option to enable all controllers when they are found. # This includes adapters present on start as well as adapters that are plugged # in later on. Defaults to 'true'. # AutoEnable=true 修改配置文件,禁用自动连接: AutoEnable=false 重启设备,测试效果。

在 PaperMod 博客中添加友链

2023-03-12 13:25:06

PaperMod 是一个非常棒的博客主题,但是它不支持友链,所以你要自己写一些代码。 完整代码 把下面的代码存储在 layouts/shortcodes/friends.html 用法 在 data/friends.yml 中添加你的友链数据,示例: - title: "伞" intro: "一只咸鱼的学习记录" link: "https://umb.ink/" image: "https://avatars.githubusercontent.com/u/53655863?v=4" - title: "HelloWorld的小博客" intro: "这里是一个小白的博客" link: "https://mzdluo123.github.io/" image: "https://avatars.githubusercontent.com/u/23146087?v=4"

在 PaperMod 博客中设置自定义字体

2023-03-02 20:54:06

下载字体 下载你需要的字体,并存储在 static/fonts 导入字体 @font-face { font-family: "LXGWWenKai-Regular"; src: url("/fonts/lxgw-wenkai/LXGWWenKai-Regular.ttf") format("truetype"); } 应用字体 body { font-family: LXGWWenKai-Regular; } 在 PaperMod 中应用 把你自己的 css 文件文件放在 assets/css/extended/custom_fonts.css 导入多字重的字体文件 @font-face { font-family: "LXGWWenKai"; src: url("/fonts/lxgw-wenkai/LXGWWenKai-Light.ttf") format("truetype"); font-weight: lighter; font-style: normal; } @font-face { font-family: "LXGWWenKai"; src: url("/fonts/lxgw-wenkai/LXGWWenKai-Regular.ttf") format("truetype"); font-weight: normal; font-style: normal; } @font-face { font-family: "LXGWWenKai"; src: url("/fonts/lxgw-wenkai/LXGWWenKai-Bold.ttf") format("truetype"); font-weight: bold; font-style: normal; } 使用 CDN @import url('https://cdn.jsdelivr.net/npm/[email protected]/css/jetbrains-mono.min.css'); code { font-family: 'JetBrains Mono'; } 参考链接 Sulv’s Blog - Hugo博客自定义字体 PaperMod - FAQs StackOverflow - Using custom fonts using CSS?

如何给 Go 的结构体添加多个 tag

2023-02-26 12:48:36

本来很简单的东西,但是老忘,干脆写个博客吧 错误写法 type Page struct { PageId string `bson:"pageId",json:"pageId"` Meta map[string]interface{} `bson:"meta",json:"pageId"` } 正确写法 type Page struct { PageId string `bson:"pageId" json:"pageId"` Meta map[string]interface{} `bson:"meta" json:"pageId"` } 很多 Tag Items []Item `gorm:"column:items,type:varchar(255);comment:'sample column'" json:"items"` 参考链接 StackOverflow - How to define multiple name tags in a struct

Golang Context

2023-02-03 23:29:21

前言 有时我们要通过第三方服务获取数据,它可以是外部提供的 API,也可以是微服务的接口等等,总之,它们有相同的问题:“获取数据可能需要大量时间”。如果在代码中同步地获取这些数据,程序就会花时间等待这些服务响应,而这些等待会严重影响程序的运行效率,而且一旦这些服务崩溃,我们的程序就会陷入无休止的等待中,那么如何解决这个问题呢?可以使用 Go 的 context 包。 问题 我们用这个函数来替代那些第三方服务。我们直接使用 time.Sleep() 函数来模拟一个耗时过程,在现实场景中,它可能是在执行一个非常复杂的 SQL 查询,也可以是调用一个人工智能服务接口。当然,这个耗时是不确定的,甚至有可能是无穷大(卡死)。 func fetchThirdPartyStuffWhichCanBeSlow() (int, error) { time.Sleep(time.Millisecond * 500) return 64, nil } 如果我们不做任何处理,直接调用这个函数,就像这样: func foo() { // some code here ... val, err := fetchThirdPartyStuffWhichCanBeSlow() if err != nil { log.Fatal(err) } // some code here ... } 上面的代码如果用在一些只执行一次的脚本、工具中,并不会带来严重后果,无非多等一下就好了,即使有问题也可以关掉程序检查一下第三方服务。但是如果上面的代码用在一个承载大流量的 web 服务中,程序在执行完耗时代码后还要继续执行一些重要的业务功能,那么这样直接调用而不加考虑的代码很可能是致命的。一旦第三方服务出现问题,程序没有任何机制检查和处理,而是直接陷入无休止的等待。这显然是不合理的。 解决方案 要解决上述的问题,比较常见的思路是引入一个主动停止耗时服务的功能,这样如果耗时函数花了太多时间执行,程序就可以感知到,并主动干预。 在后文中,我们假设我们要使用用户的 ID 访问用户的数据,且调用三方服务的代码被单独封装为 fetchUserData()。 使用 Channel 如果不使用本文要介绍的 Context,传统的思路是使用 Channel + Select 来处理: type Response struct { value int err error } func fetchUserData(userID int) (int, error) { stop := make(chan bool) respch := make(chan Response) go func() { val, err := fetchThirdPartyStuffWhichCanBeSlow() respch <- Response{ value: val, err: err, } }() go func() { time.

如何搭建 Minecraft Mod 服务器

2023-01-26 16:24:34

使用 PaperMC 安装 PaperMC 下载 PaperMC 提供的 jar 包,存储在恰当位置即可。 启动 PaperMC java -Xms2G -Xmx2G -jar paper.jar --nogui 下面是官方提供的优化后的启动脚本: java -Xms10G -Xmx10G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar paper.jar --nogui 安装 datapack 关掉已启动的服务器,将 datapack 存储在 papermc/world/datapacks 文件夹下,重启服务器即可。(如果不存在就新建一个) 安装插件 关掉已启动的服务器,将下载好的插件存储在 papermc/plugins 文件夹下,重启服务器即可。(如果不存在就新建一个) 配置服务器 PaperMC 提供了非常多的服务器修改配置,具体请查阅 官方文档。 对于 mod 的说明 PaperMC 并不兼容 Fabric 的 mod。如果需要使用 Fabric 的 mod,请参考下面的内容使用 Fabric 服务器。

如何编写 .desktop 文件

2023-01-25 14:41:12

前言 在 Linux 系统中,经常会遇到一些软件只提供了可执行文件,而并没有提供可以通过包管理安装的途径,常见于 AppImage 封装的软件,这时候每次需要运行软件都需要通过终端来执行,非常麻烦。不过这个问题可以通过手动编写 .desktop 文件来解决,这样这些可执行文件就可以和其他软件一样拥有桌面图标。 用法 使用 vim 或其他文本编辑器直接编写 .desktop 文件后将其置于如下路径之一即可: /usr/share/applications/ /usr/local/share/applications/ ~/.local/share/applications/ 示例 来自 Arch Linux Wiki 的示例 [Desktop Entry] # The type as listed above Type=Application # The version of the desktop entry specification to which this file complies Version=1.0 # The name of the application Name=jMemorize # A comment which can/will be used as a tooltip Comment=Flash card based learning tool # The path to the folder in which the executable is run Path=/opt/jmemorise # The executable of the application, possibly with arguments.

如何搭建你自己的 Minecraft 服务器

2023-01-12 21:00:37

阅前须知 本文章面向具有一定运维经验的用户,不面向小白 本文章介绍的 Minecraft 是 Java 版本的 Minecraft 本文章只介绍纯净服的搭建,不会说明如何安装 mod 如非特殊说明,本文中出现的 “我的世界” 均指代 Minecraft 的中文翻译,而不是由网易代理的 “我的世界” 准备 可供外部连接的服务器 基础 Linux 知识 安装 首先要确定你的服务器是否可以被外部连接 有公网 IP 如果你有公网 IP,可以直接使用你的主机作为服务器,相当于你有一台私有的云服务器。 没有公网 IP 如果你没有公网 IP,你需要购买一台云服务器,这样,你就拥有了一个可供外部连接的公网 IP。 如果你对服务器配置要求较高,本地也有闲置主机可以用来跑 Minecraft 服务器,可以通过 frp 将本地的主机穿透出去,以供外部连接。这样云服务器的配置就可以很低,只负责转发网络数据。 如果你对服务器的配置要求不高,也不想本地 24 小时开着一台机器,可以直接使用云服务器来跑 Minecraft 服务器。 至于你需要多高的配置来运行 Minecraft 服务器,可以参考 Wiki 的内容: 确保服务器可以被外部连接后,安装 Minecraft 下载服务器文件 在 官网 下载服务器运行所需的 jar 文件。 官方只提供最新版的文件,如果你需要历史版本,使用官方启动器下载。 运行服务器 直接使用官网的示例指令运行 jar 文件: java -Xmx1024M -Xms1024M -jar minecraft_server.1.19.3.jar nogui 如果你有更高的内存,可以修改 -Xmx1024M -Xms1024M 这一部分。

在 Ubuntu 服务器上安装 qBittorrent-nox

2022-11-11 15:34:47

在 Ubuntu 服务器上安装 qBittorrent-nox 更新系统 sudo apt update && sudo apt upgrade -y 导入 qBittorrent-nox 稳定版本的源 sudo add-apt-repository ppa:qbittorrent-team/qbittorrent-stable -y 导入 qBittorrent-nox 非稳定版本的源(每夜版) sudo add-apt-repository ppa:qbittorrent-team/qbittorrent-unstable -y 更新源 sudo apt update 安装 qBittorrent-nox sudo apt install qbittorrent-nox -y 创建用户和用户组 sudo adduser --system --group qbittorrent-nox # on fedora sudo groupadd qbittorrent-nox 将你添加到用户组中 sudo adduser your-username qbittorrent-nox # on fedora sudo usermod -aG qbittorrent-nox your-username 创建 service 文件 sudo vim /etc/systemd/system/qbittorrent-nox.service [Unit] Description=qBittorrent Command Line Client After=network.

在 Fedora 系统上安装微信

2022-11-10 12:03:27

在 Fedora 系统上运行微信 安装 wine sudo dnf install wine 调整缩放比例 输入下面的指令打开 winecfg winecfg 在 Graphics 一栏中调整合适的 dpi 以保证有舒适的使用体验。(4k 屏幕,192 dpi) 下载并配置字体 依次执行如下指令即可 sudo dnf install cabextract sudo dnf install winetricks winetricks corefonts gdiplus riched20 riched30 下载并安装微信 直接下载官方的 exe 安装包(在网页下载也是一样的) wget https://dldir1.qq.com/weixin/Windows/WeChatSetup.exe 使用 wine 启动微信 wine ./WeChatSetup.exe 接下来按照 Windows 的安装逻辑点击下一步安装好微信 安装结束后可以删除安装包 修改语言设置 修改这个文件 vim ~/.local/share/applications/wine/Programs/WeChat/WeChat.desktop 调整 Exec 这一部分,添加如下环境变量 env LC_ALL="zh_CN.UTF8" 最终结果应该是这样(注意路径) [Desktop Entry] Name=WeChat Exec=env LC_ALL="zh_CN.UTF8" env WINEPREFIX="/home/aimer/.wine" wine C:\\\\ProgramData\\\\Microsoft\\\\Windows\\\\Start\\ Menu\\\\Programs\\\\WeChat\\\\WeChat.lnk Type=Application StartupNotify=true Path=/home/aimer/.

Golang embed

2022-08-13 23:57:11

前言 在写项目的时候,有时候不可避免地要处理静态文件,如果将源码直接作为软件提供问题不大,使用相对路径读取这些静态文件就可以了。但是如果项目作为库向外公布显然不可行,使用相对路径是读取不到文件的,而使用绝对路径却会带来更大的问题:因为不同的人使用,路径绝对不可能完全一致的。如果要求用户在指定路径下放置这些依赖的静态文件,虽然可行但是会给用户带来很大的困扰,而且这样的实现方式显然不够优雅。这时候,将这些静态文件一起打包进可执行文件似乎是一个完美的解决方案,那么如何实现呢?最简单的方法是硬编码,将静态文件以文本或字节数组的形式直接编入源代码,go 也有一些库帮你自动生成代码,比如 go-bindata。很明显,这个库已经终止维护了,这是因为在 go 1.16 版本,官方发布了 embed 完美地解决了这个问题。本文简要介绍 embed 的一些基础用法。 embed 假设我们有一个文件 hello.txt Hello World! Hello go embed! 我们要写一个程序读取其中的内容并输出到终端: // file: main.go package main import ( "fmt" "os" ) func main() { s, err := os.ReadFile("./hello.txt") if err != nil { panic(err) } fmt.Println(string(s)) } 很简单,不是吗? ➜ tree . . ├── go.mod ├── hello.txt └── main.go 0 directories, 3 files ➜ go build main.go ➜ ./main Hello World! Hello go embed!

Go 图像处理基础

2022-08-12 22:40:28

前言 Go 语言的官方包 image 和 image/color 定义了非常多的类型,涵盖了很多的图像处理基础内容,本文简单介绍这些库中的基本概念和使用方法。 常见类型介绍 Colors Colors 是一个接口,它的代码如下: type Color interface { // RGBA returns the alpha-premultiplied red, green, blue and alpha values // for the color. Each value ranges within [0, 0xffff], but is represented // by a uint32 so that multiplying by a blend factor up to 0xffff will not // overflow. // // An alpha-premultiplied color component c has been scaled by alpha (a), // so has valid values 0 <= c <= a.

[转载] Rust 大佬给初学者的学习建议

2022-06-29 07:57:57

本文章转载自 Rustt 简介 当我开始学习 Rust 的时候,我犯了一个错误,那就是先读《The Rust Programming Language》。虽然这是一本非常好的资料,但让新手一开始就阅读这本 20 个章节的书籍,简直令人望而生畏,大多数人还没开始就放弃了。没有人会让一个刚开始学习 JavaScript 或者 Python 的人去阅读一本 20 个章节的书籍。Rust 学习曲线非常陡峭的,但只要循序渐进的学习一定也能学有所成。 摘要 如果你是一个完完全全的 Rust 小白,想要在一天中尽可能多的学习 Rust,那我推荐你去阅读 fasterthanlime 的《半小时快速了解 Rust》,然后完成 Rustlings 项目中的练习。 如果你已经学过 Rust 的基本语法,你可以试着做一下 Exercism.io 网站上的 Rust 部分。如果你遇到了问题,你可以在 Google 或者 StackOverflow 上寻求帮助。我推荐你花点时间来简单的阅读和浏览一下《Rust Standard Library Docs》,它是一个很棒的学习资料,里面有一些简单且实用例子去帮助你更好的使用 Rust 的标准库。《Rust by Example》也是一本高质量的参考资料,你可以通过他快速的学习 Rust 的语法和特性。如果你想要更深入的理解 Rust 的某一个概念,那么我推荐你在《The Rust Programming Language》这本书中寻找相关的章节去阅读。尤其推荐在 Exercism.io 上进行练习。在完成每个题目之后,你可以查看其他所有人的题解,可以按点赞数排序来找到通俗易懂并且巧妙的题解。这是一种很棒的学习方式。 此时,你可能已经是一个高级的初学者,能够找到属于自己的学习路线。但,如果你还需要更多的指导并想要尝试用 Rust 来写一些简单的程序,我推荐你试一着做一下 Advent of Code 2018 Calendar 上的练习。为什么推荐你做 2018 年的题目呢?因为当你做完了这个练习,你可以和 BurntSushi 提供的答案( BurntSushi’s Advent of Code 2018 Rust solutions)进行对比。BurntSushi 写的 Rust 代码整洁、可读性强、通俗易懂。阅读一个有经验的 Rustacean 的代码将会使你受益无穷。

如何配置新购置的 Linux 服务器

2022-05-17 22:09:41

更新系统 # Debian apt update # Fedora dnf update 安装常用工具 # Debain apt install -y neofetch htop tree ncdu ranger zsh vim neovim git curl wget net-tools # Fedora dnf install -y neofetch htop tree ncdu ranger zsh vim neovim git curl wget util-linux-user 创建 sudo 用户 # Debian adduser aimer usermod -aG sudo aimer # Fedora useradd -G wheel aimer passwd aimer 测试 root 权限 su - aimer sudo cat /etc/shadow 配置 SSH 连接密钥 快速上传本地密钥 # 在你的本地环境执行这条指令 ssh-copy-id aimer@server 导入托管的密钥 # 导入你自己的密钥! wget https://aimerneige.

在 wsl 下安装 fedora 35

2022-04-09 22:22:44

安装 wsl2 使用管理员身份开启 windows terminal. 执行如下指令: wsl.exe --install 等待安装完成后在开始菜单执行重启(Restart) Warning 注意是在开始菜单选择 Restart 而不能是选择 Shut Down 关机之后手动开机。 安装过程中系统会自动下载 Ubuntu 的子系统,重启后会弹出 ubuntu 的命令行初始界面,输入用户名和密码即可开始使用 ubuntu 子系统。 执行下面的指令设置 wsl 默认版本为 wsl2: wsl --set-default-version 2 安装其他版本的子系统 如果你想要其他版本的子系统,可以执行如下指令获取可通过 wsl 指令直接安装的发行版列表: wsl --list --online 返回数据类似下面这样: The following is a list of valid distributions that can be installed. Install using 'wsl --install -d <Distro>'. NAME FRIENDLY NAME Ubuntu Ubuntu Debian Debian GNU/Linux kali-linux Kali Linux Rolling openSUSE-42 openSUSE Leap 42 SLES-12 SUSE Linux Enterprise Server v12 Ubuntu-16.

find 指令的基本用法

2022-03-12 19:36:29

什么是 find 正如它的名字一样,find 指令用于查找文件。 Linux find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。 来源: 菜鸟教程 The find command in UNIX is a command line utility for walking a file hierarchy. It can be used to find files and directories and perform subsequent operations on them. It supports searching by file, folder, name, creation date, modification date, owner and permissions. By using the ‘-exec’ other UNIX commands can be executed on files or folders found.

使用 vscode 开发 Spring 项目

2021-12-28 15:37:39

前言 毫无疑问,idea 是最好的 Java IDE 之一,它对 Spring 也有很好的支持,但是由于某高校的 JetBrains 授权被拉入黑名单,导致我无法继续使用正版授权,虽然可以通过给 JetBrains 写邮件,证明自己高校学生的身份后继续获取授权,但是实在是懒,而且我也不是很喜欢使用 IDE,于是就就打算使用 vscode 进行开发。 Visual Studio Code 作为一款优秀的代码编辑器,有非常多的插件,经过配置后完全可以胜任大部分 IDE 的功能,本文章简要介绍如何构建 spring 的开发环境。 配置 安装配置 Java 和 Maven Tip 正常流程配置 Java 和 Maven,如果你已经配置过可以直接跳过 下载所需的 JDK 并解压。 在环境变量中配置 JAVA_HOME 在系统环境变量 PATH 中添加 JAVA_HOME/bin 下载 Maven 并解压 在环境变量中配置 MAVEN_HOME 在系统环境变量 PATH 中添加 MAVEN_HOME/bin 安装必要插件 Extension Pack For Java Gradle Extension Pack Spring Boot Extension Pack SonarLint Java Code Generators XML Dependency Analytics 在 settings.

配置 go 开发环境

2021-08-24 21:31:05

本篇文章简要介绍如何配置 go 的开发环境

对于某实验平台的吐槽

2021-08-19 21:44:21

今天学校不知道哪搞了个平台,让我们去上面做模拟实验,我点开一看,好嘛,没啥用的机器人、电焊,继续看下去还有题目,又懒得上网查答案,但是学校给的通知里有一行话引起了我的注意: 温馨提示:需要从实验空间进入实验,不可直接输入网址进入 不可直接输入网址?我仔细看了下,发现实验空间的作用就是添加一个 token,如果直接进去就是游客,没有办法登录。 这下就好办了啊,虽然是游客,但是游客也可以做题啊,我用游客帐号先做了不就拿到答案了吗? 这个系统果然把正确答案显示在前端了,但是不太好看,于是我就跑去 F12 看了。 结果我在后台找到了下面的代码: $.ajax({ url: "/webApi/experimen/rig/getData", type: "GET", data: { courseId: courseId }, dataType: "JSON", success: function (res) { // 省略的大量代码逻辑 }); 下面的注释是原来就有,不是我加的。 对,这个系统没有对 js 做混淆甚至在代码里有详细的注释。 // 单选 var answer = $('.afterTesting .topic1 form'); for (var k = 0; k < answer.length; k++) { var question1 = $(answer[k]).find(".question1"); var questionAnswer = question1.attr("data-answer"); var userAnswer = question1.find("input[type='radio']:checked").val(); var score = parseFloat(question1.attr("data-score")); if (questionAnswer.length > 1) { var userdAnswer = question1.

定制你的 rime 提升编程体验

2021-08-19 01:50:11

平时在使用 Linux 写代码的时候,总有一点让我很难受,那就是当我准备写中文注释的时候,输入 // 的时候,输入法总是希望我手动选择是要输入 / 还是中文的 、,随之弹出来的框非常影响代码编辑,经常打断我的思路,类似的还有反引号等符号,不厌其烦的我去查找了一些资料,终于彻底解决了这个问题。 准备 阅读本文前,你要保证你在使用 rime 输入法。遇到任何问题请多查阅 rime 提供的文档。 本文所提到的内容在 fedora34 系统下,ibus-rime 包测试通过。 找到 rime 用户资料夹 不同的平台下,rime 用户资料夹的位置会有所不同 平台 rime 用户资料夹位置 ibus ~/.config/ibus/rime fcitx ~/.config/fcitx/rime fcitx5 ~/.local/share/fcitx5/rime 创建你的配置文件 如果你从来没有配置过 rime,那么你可以直接在 rime 用户资料夹下创建名为 default.custom.yaml 的配置文件,写入如下内容: patch: punctuator/full_shape: "`": "`" "~": "~" "!": "!" "@": "@" "#": "#" "$": "¥" "%": "%" "^": "……" "&": "&" "*": "×" "(": "(" ")": ")" "_": "——" "+": "+" "-": "-" "=": "=" "[": "【" "]": "】" "{": "{" "}": "}" "|": "|" "\\": "、" "/": "、" ";": ";" "'": "‘" ",": "," ".

Hello Hugo

2021-08-17 07:16:04

安装和配置 hugo

使用 nodejs 快速为 Android 程序构建 API

2021-01-30 20:17:30

使用 nodejs 开发简单后端

利用 EditorConfig 定义代码格式,统一代码风格

2021-01-29 16:37:25

EditorConfig 的简要介绍

Linux 下安装 fcitx5 与 Rime

2020-12-13 19:35:18

Linux 下中文输入法安装

每天一个 Linux 指令

2020-11-10 10:41:51

ifconfig ➜ ~ ifconfig enx2c16dba37d18: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.117.154 netmask 255.255.255.0 broadcast 10.0.117.255 inet6 2001:250:c00:218:5bd6:795c:5b92:e787 prefixlen 64 scopeid 0x0<global> inet6 fe80::2224:6ee:2527:f54d prefixlen 64 scopeid 0x20<link> inet6 2001:250:c00:218:44fc:ad73:aeb8:b07d prefixlen 64 scopeid 0x0<global> ether 2c:16:db:a3:7d:18 txqueuelen 1000 (Ethernet) RX packets 110382 bytes 150904005 (150.9 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 30811 bytes 3569027 (3.5 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.

这不是 Bug,而是语言特性

2020-11-05 14:37:41

C 语言中 goto 带来的奇怪问题

C 函数指针

2020-11-04 21:00:39

函数指针用法

C 语言多线程基础

2020-11-01 18:21:23

线程于进程的对比 thread 线程 有共享内存 process 进程 没有共享内存 gcc file.c -lpthread 创建线程 #include <stdio.h> #include <pthread.h> void *myfunc(void *args) { for (int i = 0; i < 50; i++) { printf("%d\n", i); } return NULL; } int main() { pthread_t th1; pthread_t th2; pthread_create(&th1, NULL, myfunc, NULL); pthread_create(&th2, NULL, myfunc, NULL); pthread_join(th1, NULL); pthread_join(th2, NULL); return 0; } 传入参数 #include <stdio.h> #include <pthread.h> void *myfunc(void *args) { char *name = (char *)args; for (int i = 0; i < 50; i++) { printf("%s %d\n", name, i); } return NULL; } int main() { pthread_t th1; pthread_t th2; pthread_create(&th1, NULL, myfunc, "th1"); pthread_create(&th2, NULL, myfunc, "th2"); pthread_join(th1, NULL); pthread_join(th2, NULL); return 0; } 分部计算

C 语言静态函数

2020-10-31 20:31:36

在 C 语言中,函数默认是全局的。在函数前加“static”关键字可以使一个函数变成静态函数。例如,下面的函数 fun() 是静态的: static int fun(void) { printf("I am a static funciton.\n"); } 与 C 语言中的全局函数不同,对静态函数的访问仅限于声明它们的文件。因此,当我们想要限制函数的访问时,我们可以将函数定义为静态的。另外,如果我们想要在其他文件中使用相同的函数名,我们也可以将函数定义为静态的。 例如,我们在文件 file.c 中存储了下面的程序: // in file `file1.c` #include <stdio.h> static void fun1() { printf("fun1 called.\n"); } 然后,我们在文件 file2.c 中存储了这样的程序: // in file `file2.c` #include <stdio.h> int main(void) { fun1(); return 0; } 接下来,如果我们按照如下的命令编译: gcc file2.c file1.c 你会得到这样的链接错误: undefined reference to `fun1' 这是因为 fun1() 函数在 file1.c 中被定义为静态,因而不能在 file2.c 中引用。

在 Windows10 安装和配置 alacritty

2020-10-22 15:15:19

注意将本文章提到的路径中 AimerNeige 修改为自己的用户名,之后不再赘述。 安装 alacritty 按照自己的喜好 在 GitHub 下载最新版 release 或自己编译。 本次演示中可执行文件存储目录: C:\Tools\Alacritty\alacritty.exe 配置 alacritty 将配置文件放置在如下目录: C:\Users\AimerNeige\AppData\Roaming\alacritty\alacritty.yml 配置方法和 Linux 下类似。 我的配置文件 将 alacrity 注册为右键菜单启动 新建文本文件,填入如下内容,修改后缀为 .reg 运行,将配置写入注册表。 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\Background\shell\alacritty] @="Alacritty terminal here" "Icon"="C:\\Tools\\Alacritty\\alacritty.ico" [HKEY_CLASSES_ROOT\Directory\Background\shell\alacritty\command] @="C:\\Tools\\Alacritty\\alacritty.exe" 当然,你也可以按照自己的喜好手动编辑注册表。 其中 Icon 这一行中使用的的图标文件可以在 GitHub 官方仓库 下载,或者也可以使用自己喜欢的内容。 你也可以将 @="Alacritty terminal here" 修改为自己喜欢的内容。

GCC 基础

2020-10-17 22:37:01

GCC 简介 GCC 是 Linux 下的编译工具集,是 GNU Compiler Collection 的缩写,包含 gcc 、 g++ 等编译器。这个工具集不仅包含编译器,还包含其他工具集,例如 ar 、 nm 等。 GCC 工具集不仅能编译 C/C++ 语言,其他例如 Objective-C 、 Pascal 、 Fortran 、 Java 、 Ada 等语言均能进行编译。 GCC 在可以根据不同的硬件平台进行编译,即能进行交叉编译,在 A 平台上编译 B 平台的程序,支持常见的 X86 、 ARM 、 PowerPC 、 mips 等,以及 Linux 、 Windows 等软件平台。 GCC 的 C 编译器 是 gcc,其命令格式为 : Usage: gcc [options] file... GCC 下默认文扩展名的含义: 文件扩展名 GCC 所理解的含义 *.c 该类文件为 C 语言的源文件 *.

使用 Nginx 搭建静态网页服务

2020-10-04 01:18:44

使用 Nginx 搭建静态网页服务本身是一件非常简单的事,但是我之前在 CSDN 找了几篇教程,弄了一下午也没弄好(不愧是屎山淘金),学了一段时间后端和 Linux 后,我大概只用了五分钟就弄好了,这里写一篇文章来帮助一下小白。 阅读须知 在阅读本文章前,你需要准备以下内容 掌握基础的 Linux 命令行操作 (本文章将介绍如何在 Linux 服务器上部署静态网页,需要进行终端操作,因此你必须掌握命令行的使用。如果你打算使用 Windows ,请查阅其他文章。) 拥有一台 Linux 服务器 (可以购买 VPS 也可以使用 虚拟机 本文章以 VPS 为例,并购置了域名 (域名非必须) ) 拥有一个静态网站的源码 (如果仅仅作为学习目的,你可以写一个简单的 HTML 文件,这里以使用 hexo 生成的静态网站为例。) 知道 Nginx 是什么,有什么用 (不需要掌握 Nginx) 不同 Linux 发行版下命令会有所区别,本文章以 Ubuntu20.04 为例 准备服务器 如果你已经有了一台服务器并安装好了 Nginx ,你可以直接跳过这一部分,但是如果你的服务器是新的,没有经过任何配置,请参阅以下内容进行配置。 升级系统 sudo apt update && sudo apt upgrade 安装 Nginx sudo apt install nginx 启动 Nginx sudo systemctl start nginx # 开机自动启动 sudo systemctl enable nginx 测试服务 直接在浏览器访问你服务器的 ip,如果你部署了 DNS 服务的话,你也可以直接使用域名。如果哦看到 Nginx 的欢迎界面,服务器准备成功!

写给小白的 win10 使用技巧

2020-08-26 22:46:52

本文章项目地址 https://github.com/AimerNeige/Tutorial.git 计算机使用技巧 如果你是一个几乎没有接触过电脑但是却打算入门计算机专业,这篇文章将为你介绍一些基本的计算机使用技巧。 主要介绍 Windows10 的一些使用技巧,如果你是 mac 用户,请自行查阅其他文章,但是如果你是 Linux 用户,我觉得你应该不需要看我的文章。 杀毒软件 或许你会在较旧的电脑上见到诸如360 安全卫士,金山毒霸,电脑管家等杀毒软件,受其影响,你或许也会在电脑上安装这些软件,但是,对于计算机专业来说,这些软件不仅无用而且会给你的学习带来很多麻烦。请 务必 立即 删除它们。 但是,没有杀毒软件的话,电脑中毒怎么办啊? 如果你的电脑是刚到手的笔记本,我相信你的预装系统是 Windows10。 而 windows 本身会预装 Windows Defender ,对于一般的病毒,Windows Defender 完全可以保护你的电脑,而且如果使用习惯良好,不下载使用来源不明的文件的话,即使没有任何杀毒软件也是可以的。但是你非要有双保险才放心,一定要安装杀毒软件的话,我推荐 火绒杀毒 https://www.huorong.cn/ 。这款软件的个人版完全免费而且没用任何广告弹窗。 删了它们我怎么清理电脑垃圾啊? 在旧电脑上用的硬盘是机械硬盘,而机械硬盘的磁盘碎片会影响电脑系统运行速度,在旧电脑上清理垃圾确实有用且会提升电脑运行速度,但是现在的电脑用的都是固态硬盘,这些磁盘垃圾并不会影响电脑性能,不会影响系统的运行速度,最多只是占一些存储空间,如果你非要清理的话,我推荐你使用 CCleaner https://www.ccleaner.com/。 没有软件管家我不会下载软件了怎么办? 要养成去官网下载软件的好习惯,比如我们想要安装 QQ 就使用搜索引擎搜索 QQ 的官网,找到 QQ 的官网 http://im.qq.com/ ,然后在官网下载安装包。类是地,我们同样可以在 Visual Studio Code 的官网 https://code.visualstudio.com/ 上下载 Visual Studio Code 的安装包。如果一个软件没有官网,你也可以在一些受信任的网站上下载它,不过大部分软件都会有官网的,除非你在下载破解软件或者其他上古软件。 没有电脑管家我如何管理系统自启动啊? 禁用开机自启动: 启动任务管理器,点击 启动 找到想要禁用的自启项,右击,选择禁用。 设置开机自启动: 按住 Win 键(左下角有 windows 徽标的按键)然后按 R, 在弹出的运行框中输入 shell:startup 将软件的 快捷方式 放在这个目录下即可。

优雅地使用 GitHub

2020-08-01 07:15:56

官方文档 较常用的检索限制 项目名称 in:name <keyword> 项目 README in:readme <keyword> 项目描述 in:description <keyword> 语言 language: java star 数 stars:>1000 fork 数 forks:>500 更新时间 pushed:>2020-08-01 使用示例 in:name marp in:description theme stars:>5 pushed:>2020-01-01 参考链接: https://www.youtube.com/watch?v=Uj6WWAqg0NY

每天一个 Python 小知识 isinstance

2020-05-29 09:38:41

首先来看下 w3schools 的解释: Example Check if the number 5 is an integer: x = isinstance(5, int) Definition and Usage The isinstance() function returns True if the specified object is of the specified type, otherwise False. If the type parameter is a tuple, this function will return True if the object is one of the types in the tuple. Syntax isinstance(object, type) Parameter Values Parameter Description object Required. An object. type A type or a class, or a tuple of types and/or classes More Examples Example Check if “Hello” is one of the types described in the type parameter:

每天一个 Python 小知识 assert

2020-05-28 23:10:07

首先来看下 w3schools 的解释 Example Test if a condition returns True: x = "hello" #if condition returns True, then nothing happens: assert x == "hello" #if condition returns False, AssertionError is raised: assert x == "goodbye" Definition and Usage The assert keyword is used when debugging code. The assert keyword lets you test if a condition in your code returns True, if not, the program will raise an AssertionError. You can write a message to be written if the code returns False, check the example below.

使用 PicGo 搭建便捷的图片上传服务

2020-05-28 00:13:47

在平时使用 markdown 的时候,图片一般是一个痛点,在本地引用图片后转到其他平台就有可能失效,尤其是上传到自己的博客的时候就很麻烦,在线图片可以解决这个问题,但是手动上传也是一件麻烦事,不过,已经有一些好心的程序员写了一个软件来解决这个问题,这里我推荐 PicGo 这款应用。 这款应用完全开源、免费,支持跨平台特性。 GitHub 主页 官方文档 软件的配置也十分简单,按照官方的教程新建一个 GitHub 仓库并连接软件就好了。 官方的文档就很棒了,没必要提供更详细的教程。(话说这篇文章也太水了)

使用 pillow 库快速将漫画转化为 pdf 便于转发与阅读

2020-05-27 23:36:38

介绍 使用安卓手机阅读一些漫画的时候,因为屏幕较小,查看文字的时候需要放大,很麻烦。博主虽然有一个 iPad4,屏幕够大,但是把这么多图片文件发送到 iPad 上面十分的麻烦,一天,偶然看到了一个 pdf 格式的漫画,在 iPad 上面的阅读体验十分棒,于是博主就打算写一个程序来将大量的漫画图片转化为 pdf 来方便在 iPad 上阅读。 查阅资料,我们会发现 Pillow 这个第三方 python 库可以来处理图片,同时也可以将大量的图片转化为 pdf 文档。 简单地查看下 官方文档 。 emmm,官方文档的东西有点多,为了快速解决问题还是直接查找下有没有相关代码把。 随便查了下,发现了这个: from PIL import Image image1 = Image.open(r'C:\Users\Ron\Desktop\Test\image1.png') image2 = Image.open(r'C:\Users\Ron\Desktop\Test\image2.png') image3 = Image.open(r'C:\Users\Ron\Desktop\Test\image3.png') image4 = Image.open(r'C:\Users\Ron\Desktop\Test\image4.png') im1 = image1.convert('RGB') im2 = image2.convert('RGB') im3 = image3.convert('RGB') im4 = image4.convert('RGB') imagelist = [im2,im3,im4] im1.save(r'C:\Users\Ron\Desktop\Test\myImages.pdf',save_all=True, append_images=imagelist) 来源: https://datatofish.com/images-to-pdf-python/ 不需要仔细看又臭又长的官方文档了,nice! 了解了如何使用这个强大的库,就可以开始写代码了,vsc 一条龙服务! 代码很简单,直接上源码了: 源码 项目文件目录: - comic/ # 包含了漫画的图片 - example_001.

20 个 Python 进阶技巧

2020-04-13 20:27:22

本来是在查资料,无意间看到了这个知乎文章,感觉内容值得学习,但是排版实在难受,代码和注释混在一起,没有换行,同时解释也很奇怪(感觉是机翻的),当我无法忍受想关闭网页的时候,发现这篇文章是翻译自Medium的文章,但是原文章是英语写的,为了帮到那些英语不太好的 Python 学习者,同时方便自己之后看,于是写了这篇博文(算是笔记吧) 基于 Medium 的文章 《20 Python Snippets You Should Learn Today》 ,除了翻译外添加了自己的解释。水平有限,如果有错误欢迎读者指正。 大部分示例代码均引用自 Medium 《20 Python Snippets You Should Learn Today》 1 反转字符串 下面的代码使用 Python 切片操作来反转字符串。 # Reversing a string using slicing my_string = "ABCDE" reversed_string = my_string[::-1] print(reversed_string) # Output # EDCBA 这里用到的是 Python切片 切片某种意义上就是对如下代码的书写进行了简化(不考虑 Python 中-1 的情况) // [a🅱️c] for (int i = a, i < b; i = i + c) { // do something } 推荐阅读: 《How to reverse a string in Python?

使用 DataBinding 精简代码

2020-02-22 00:43:15

在构建布局的时候,是不是感到要写很多的 findViewById 很浪费时间呢?尤其是布局文件变化的时候,也要在 Activity 中更改很多内容,极大的降低了开发效率,而谷歌在 JetPack 中提供了一种十分有效的方法来精简代码结构,提升开发效率,那就是 DataBinding 下面来介绍 DataBinding 的使用 用到的依赖 implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' 开启 dataBinding 在 app 的 build.gradle 文件中添加以下内容 dataBinding { enabled true } 位置参考 android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "com.aimerneige.databindingdemo" minSdkVersion 24 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" dataBinding { enabled true } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } 为布局文件提供 dataBinding 支持 在布局文件开头点击黄色灯泡(或按ALT + Enter),选择以下操作将布局文件转换为 data binding layout ,获取 data binding 支持

使用 ProgressDialog 实现加载提示

2020-02-20 23:40:51

在进行一些耗时操作的时候,经常需要加载提示框来提醒用户当前在进行耗时操作,需要等待。 而实现这样一个加载框十分简单。 构建 ProgressDialog 对象 你可以在耗时操作开始前临时建立新的 ProgressDialog 对象,你也同样可以在 Activity 中构建 ProgressDialog 的引用,并在 OnCreate 方法内构建实体,在需要的时候直接显示和隐藏。 其中前者相对灵活,但是使用范围有限,后者使用范围较广,但是可以会使得 OnCreate 中的代码较为繁琐。 但是,不管使用那种方法,ProgressDialog 的构建都是非常简单。 ProgressDialog progressDialog; progressDialog = new ProgressDialog(MainActivity.this); // ProgressDialog progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setTitle("This is Title"); progressDialog.setMessage("This is Message"); progressDialog.setCancelable(true); 其他属性可自行探索或者查阅官方文档 显示加载框 在耗时操作开始前(或者任何你想要显示提示框的地方),通过以下操作显示加载框: progressDialog.show(); 关闭提示框 在耗时操作关闭时(或者任何你想要关闭提示框的地方),通过以下操作关闭加载框: progressDialog.hide(); 很简单不是吗又水了一期,不过好像没人看我的博客

使用 LiveData 优雅地管理布局显示的数据

2020-02-20 22:22:21

ViewModel 提供了一个可以管理数据的优雅的容器,但是它也只是存储数据而已,并不能对数据进行处理,只是存储数据而已,但是如果使用 LiveData 来辅助, ViewModel 不再只是存储数据,它本身也能处理界面内容,就像它的名字一样,能让数据活起来。 在 ViewModel 中构建 LiveData 对象 与 ViewModel 不同, LiveData 不需要构建类,直接在 ViewModel 中创建对象即可。 首先创建 ViewModel 对象,然后在 ViewModel 对象中创建 LiveData 字段 package com.aimerneige.livedatatest; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; public class ViewModelWithLiveData extends ViewModel { private MutableLiveData<Integer> LikedNumber; } 然后为 LiveData 对象构建 get 方法 // May Cause Error public MutableLiveData<Integer> getLikedNumber() { return LikedNumber; } 要注意的是构建的对象如果没有构建的话是为空的,直接返回会有空指针错误,所以要对空指针进行处理。 在构造方法中解决 // One possible wey to make the LikedNumber not null ViewModelWithLiveData () { LikedNumber = new MutableLiveData<>(); LikedNumber.

使用 ViewModel 管理布局上的数据

2020-02-20 22:21:25

如果不进行处理的话,布局上的临时数据可能会因为屏幕反转,切换系统语言等而消失,但是处理过程略微繁琐,较为麻烦,但是谷歌为我们提供了一种更加简洁的方式来管理界面数据,那就是 ViewModel。 构建自己的 ViewModel 类 新建 Java 类,继承至ViewModel,名字自定义,这里以MyViewModel为例。 package com.aimerneige.viewmoudeltest; import androidx.lifecycle.ViewModel; public class MyViewMoude extends ViewModel { } 新建好类之后,直接将需要用到的数据填写在内部,可以直接使用 public 的数据类型(不推荐),或者使用 private 数据加 get 方法。 package com.aimerneige.viewmoudletest; import androidx.lifecycle.ViewModel; public class MyViewMoude extends ViewModel { public int number = 0; public String test = "Test for 100"; private int age = 0; public int getAge() { return age; } public void setAge(int age) { this.age = age; } } 然后把ViewModel当成一个智能地存储数据的结构体使用即可。

ToolBar

2020-02-18 00:05:23

MaterialDesign 依赖库 implementation 'com.google.android.material:material:1.1.0' 在布局文件中加入 TooBar <androidx.appcompat.widget.Toolbar android:id="@+id/toolBar" android:layout_width="match_parent" android:layout_height="wrap_content" <!--其他属性设置--> /> 关于旧版的说明 旧版需要使用兼容包 compile 'com.android.support:appcompat-v7:23.1.1' 使用以下布局方法 <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="标题" android:textSize="20sp"/> </android.support.v7.widget.Toolbar> 很多文章都是这么写的,此处代码也是拷贝的,但是在开发中出了一些问题,博主是没有成功运行,仅供参考,挂了请自行查阅资料,不做解释。这里主要介绍新版 ToolBar 的使用 在 MainActivity 中引用 Toolbar Toolbar toolbar = findViewById(R.id.toolBar); 使用 ToolBar 作为界面布局 toolbar.setTitle("AppBarLayoutTest"); setSupportActionBar(toolbar); 导包的时候导这个,不要导错了,否则会报错 import androidx.appcompat.widget.Toolbar; 添加自定义属性 按需添加自定义属性,可以修改的内容包括标题的文字、图标、颜色等。不详细介绍,官方文档里很详细。 官方文档:https://developer.android.com/reference/android/widget/Toolbar 添加菜单 构建菜单的布局文件 这里添加的 item 会按顺序显示在 ToolBar 上面。 showAsAction 属性: always:总是显示 ifRoom:空间足够时显示 never:永不显示(收纳在右侧的三条横线那个更多按钮里) <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/toolbar_setting" android:icon="@drawable/ic_setting" android:title="@string/toolbar_setting" app:showAsAction="always" /> <item android:id="@+id/toolbar_about" android:title="@string/toolbar_about" app:showAsAction="never" /> <item android:id="@+id/toolbar_exit" android:title="@string/toolbar_exit" app:showAsAction="never" /> </menu> 在主菜单中引用菜单的布局文件 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().

使用 Gson 解析 Json 数据

2020-02-17 00:26:02

新建项目 导入 Gson 依赖 implementation 'com.google.code.gson:gson:2.8.5' 设计布局 这里设计俩个 TextView 和一个 Button,点击 Button 后发送 Http 请求获取 Json 数据,并且通过 Gson 进行解析,将解析结果显示在 TextView 上,以此验证解析成功。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="nodata"/> <TextView android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="nodata"/> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test"/> </LinearLayout> 代码很简单就不多解释了。另外 在 Activity 中注册控件 的内容也省略。 发送 Http 请求并获取数据 操作同一般的 HTML 源码获取,这里不多解释。由于保存在网络上的 Json 数据其源码就是合法的 Json 字符串,因此通过解析网页源码的方法获取的内容就是 Json 数据。这里有一个网页保存了 Json 数据,可用于测试。 https://user.moecraft.net:8443/API/Mc/authlib/ 获取源码之后将其保存在一个字符串内即可继续进行下一步操作。此处命名为 jsonData。 利用 GsonFormat 插件生成映射对象 具体操作方法不解释了,具体看之前发布的博客文章。这里新建的类命名为 ApiTest 。

Ubuntu 19.10 配置 Kotlin 开发环境

2020-02-16 01:25:45

Ubuntu 19.10 配置 Kotlin 开发环境 使用工具 VSCode 安装 Kotlin 编译器 sudo snap install kotlin --classic 如果出现错误,执行以下命令: sudo apt install snap 这条指令执行后,系统安装的内容有: kotlinc kotlinc-jvm kotlinc-js kotlin-dce-js 可以通过以下指令查看版本,如果有输出证明安装成功。 俩条指令都可以,建议使用上面的。 kotlin -version kotlinc -version 安装插件 这俩个貌似安装一个就可以了,也可以都安装。 Kotlin Kotlin Language 安装下面这个插件后在 文件 -> 首选项 -> 设置 -> 扩展 -> Run Code Configuration 中找到并勾选 Run In Terminal Code Runner 测试 建立新文件 HelloWorld.kt fun main(args: Array<String>) { println("Hello, World!") } 通过点击右上角三角形(由 Code Runner 提供的快捷方式)来编译运行,查看输出。 如果看到终端输出 Hello, World!

设置网络图片

2020-02-16 01:24:30

通过网络连接获取图片信息,并将其设为软件的 ImageView 图片属性 介绍: 与获取 HTML 类似,首先需要建立网络连接并获取数据,只是这次不通过 String 获取保存数据,而是使用 Bitmap 保存。 与获取 HTML 数据类似,联网操作同样需要新建线程,要注意的是在子线程不能操作 UI,需要通过外部函数设置图片或者在函数返回 Bitmap 对象使用。 核心代码: 建立网络连接,这里使用 HttpURLConnection URL url = new URL("https://www.example.com.img") HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // ...... // 诸如超时时间等的设置 处理返回数据 InputStream is = connection.getInputStream(); Bitmap bitmap = BitmapFactory.decodeStream(is); 设置控件,注意该操作不能在子线程中进行 imageView.setImageBitmap(bitmap); 完整代码 代码很烂,有很多可以优化的地方 //设置网络图片 public void setUrlImage(final int ImageViewId, final String address) { //开启一个线程用于联网 new Thread(new Runnable() { @Override public void run() { try { //把传过来的路径转成URL URL url = new URL(address); //获取连接 HttpURLConnection connection = (HttpURLConnection) url.

使用 GsonFormat 插件快速构建 Json 映射对象

2020-02-16 01:21:07

插件安装 File Settings Plugins Marketplace 在搜索框输入 GsonFormat 搜索 安装相应插件 根据提示重启 IDE 使用方法 新建实体类 ALT + Insert 或者 右键->Generate 选择 GsonFormat 将待解析 Json 字符串输入弹出的对话框 OK

Swiperefreshlayout

2020-02-01 01:45:42

GoogleDoc GoogleGithub 声明依赖项 直接复制官方文档,不多解释了(懒 在应用或模块的 build.gradle 文件中添加所需工件的依赖项: dependencies { implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" } 如需详细了解依赖项,请参阅添加编译依赖项。 添加布局 在 xml 布局文件中添加 SwipeRefreshLayout,并将 WebView 内嵌在 SwipeRefreshLayout 中。 布局这里拷贝了别人的代码,结果软件闪退,搞了半天找不到原因,重开了一个项目,根据代码提示写了一份居然可以运行,分明代码一样的,好迷啊。。。。。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <androidx.swiperefreshlayout.widget.SwipeRefreshLayout android:id="@+id/swipe_refresh" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/web_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> </LinearLayout> SwipeRefreshLayout 类似 ScrollView,内部只能有一个部件,但是你可以这样玩、(手动滑稽 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test_scroll" android:textSize="16sp" /> </LinearLayout> </ScrollView> 编写代码部分 先放一个完整的源码,看不懂直接跳过,下面介绍关于 Swiperefreshlayout 的核心代码

如何安装 Ubuntu

2020-01-24 16:11:30

前言 之前由于感兴趣而涉足 Linux 领域,在虚拟机内尝试了 Ubuntu,可惜虚拟机内性能有限,于是以双系统的形式安装了 Ubuntu18.04。 经过一段时间的使用后,感觉 Ubuntu 完全可以作为日常系统使用,于是放弃了 bug 不断的 Windows 系统,做好备份后直接全盘安装了 Ubuntu 系统,Windows 下的软件找不到替代品就转向虚拟机使用。 个人感觉 Ubuntu 是完全可以替代 Windows 日常使用的,以下是 Ubuntu 相比于 Windows 的一些优点和不足 优点 更加稳定 更加安全 不会整天提醒你更新系统 配置开发环境仅需几行终端指令 忘记恼人的弹窗广告和流氓软件吧 不足 很多软件不支持 Linux,只能在 Windows 上运行 几乎 90% 的游戏都不支持 Linux 需要学习命令行 界面丑 对策: Windows 下的软件可以直接在虚拟机下运行,不想挂个虚拟机的话也可以考虑使用 Wine 游戏还是不要玩了,装个 Ubuntu 学 Linux 顺带还能帮你戒游戏,实在需要玩游戏的可以使用双系统 命令行也不是特别难,遇到问题谷歌一下就行了 至于界面丑,我指的是 Ubuntu18.04 及 之前的版本,这些问题可以通过安装主题和图标包来解决,而最新的 Ubuntu19.10 界面还是十分惊艳的 Ubuntu 的安装 访问 Ubuntu 官网下载最新的镜像文件 使用 Etcher 写入 U 盘作为启动盘 通过 U 盘启动系统

面向小白的 C 语言随机数详解

2020-01-24 15:58:19

函数指针用法

Friends 🧑‍🤝‍🧑

0001-01-01 08:00:00

friends

关于我 👨‍💻

0001-01-01 08:00:00

about

捐赠 ☕

0001-01-01 08:00:00

donate

项目 💻

0001-01-01 08:00:00

projects