延续上一个主题,主要是解决网站图片处理的问题。
1.在大的logo中添加图片和文字
canva
使用里面的custom size功能,设置需要照片的尺寸长和高,然后再往里里面填充照片和文字
2.照片需要去除背景,这样子在暗黑的模式下,看不到边框。canva下载的时候可以处理,不过付费,免费的网站为:
removebg
3.生成favicon的网站,可以批量生产一些适配图标,最好使用removebg先处理下。
favicon
这个主题的相关图片打包:图库
0.onenav是一个导航主题,需要进行付费进行激活,当然也有不付费的形式,但是功能会限制。
1.还是使用宝塔进行安装,网站-添加站点-一键部署-部署模板(wordpress)
2.域名中添加IP地址,域名添加ssl,添加伪静态
3.登陆网站,添加onenav插件
onenav-v4.1602
4.正版的购买进行激活就可以了;非正版的需要etc/hosts中添加如下内容,输入任何字符可以激活
43.134.51.171 auth.iotheme.cn
43.134.51.171 www.iotheme.cn
5.设置固定连接结构
分配和走势:5.7暗盘,5.8上市。先说下最终的认购和分配情况,总共申请人数为127637人,乙组申购人数为8143人,1手中签率10%,甲组抽签,乙头稳中2手。暗盘高开迅速低走,然后高开,走势非常强势,暗盘涨幅超过60%,首日高开,涨幅超过70%,午后跳水,PE超过了50,是同行业之最,名不副实,不适合持有。
收获::这个票在认购阶段还是多少有点分歧,主要还是发行的比较贵,从同行业的比较上来看,确实打新的水位有限,所以很多人选择不打或者少打,所以遇到意见一致需要allin的票,可以预测到的数据是打新人数会在150000左右,乙组人数在10000左右,新政策出来之后,乙组的门槛极大提高,即使这样,乙组还能保持在1万左右的个数,数据大大超过我之前的预期。
我的操作::暗盘的涨幅已经完全超过我的预期,所以我在暗盘已经全部出完(我的一般操作,暗盘1/3,首日竞价1/3,留下1/3首日择机出),根据今天的情况应该是按照一般操作收益更高。买卖股票是最容易达成认知变现的事情,不管是赚钱也好,还是亏钱也好。
1.源码修改
基于《使用Docker部署Stirling PDF》这篇文章展开说,主要是针对Stirling这个项目进行定制,在前述的文章中代码中
services:
stirling-pdf:
image: frooodle/s-pdf:0.32.0
ports:
- '8080:8080'
volumes:
- ./StirlingPDF/trainingData:/usr/share/tessdata # Required for extra OCR languages
- ./StirlingPDF/extraConfigs:/configs
- ./StirlingPDF/customFiles:/customFiles/
- ./StirlingPDF/logs:/logs/
- ./StirlingPDF/pipeline:/pipeline/
environment:
- DOCKER_ENABLE_SECURITY=false
- LANGS=en_GB
通过volumes的形式,来提供宿主机和容器内文件进行映射,extraConfigs中需要修改custom_settings.yml内容,这个文件内容会覆盖settings.yml内容。目前主要修改的方式是复制settings.yml到custom_settings.yml中,对特定内容进行修改。下面显示的都是需要修改的部分,其余的内容都保留就行了。
system:
customHTMLFiles: true # enable to have files placed in /customFiles/templates override the existing template HTML files
ui:
appName: 'Full PDF' # application's visible name
homeDescription: '' # short description or tagline shown on the homepage
appNameNavbar: 'Full PDF' # name displayed on the navigation bar
endpoints:
toRemove: ['pipeline','view-pdf','replace-and-invert-color-pdf','split-pdf-by-chapters', 'ocr-pdf'] # list endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
groupsToRemove: ['pipeline','view-pdf', 'replace-and-invert-color-pdf','split-pdf-by-chapters', 'ocr-pdf'] # list groups to disable (e.g. ['LibreOffice'])
customFiles文件夹中新建static和templates两个文件夹,其中static中添加的都是照片,templates文件夹中添加fragments文件夹和home.html文件,文件目录需要和github中的源码进行对应。源码目录
这个是本地已经修改的文件夹,里面包括修改的源码和照片fullpdf
2.项目部署
本地部署和线上部署有区别,本地部署docker restart 镜像id, 线上部署的需要重新pull,docker-compose up(ubuntu)。
3.todo
目前图片处理是使用付费的chatgpt在处理,需要寻找免费的图片处理工具;在暗黑的情况下,网站的logo显示有问题,这个需要解决。
0.注意问题:docker pull中网络会出现问题,需要设置下载地址
#/etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.1panelproxy.com",
"https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://your_preferred_mirror",
"https://dockerhub.icu",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"
]
}
1.dockerfile文件
services:
stirling-pdf:
image: frooodle/s-pdf:0.32.0
ports:
- '8080:8080'
volumes:
- ./StirlingPDF/trainingData:/usr/share/tessdata # Required for extra OCR languages
- ./StirlingPDF/extraConfigs:/configs
- ./StirlingPDF/customFiles:/customFiles/
- ./StirlingPDF/logs:/logs/
- ./StirlingPDF/pipeline:/pipeline/
environment:
- DOCKER_ENABLE_SECURITY=false
- LANGS=en_GB
2.启动和访问
docker-compose up
http:://ip:8080
3.域名中进行设置
4.设置反向代理和ssl
1.如果没有安装宝塔,那么使用npm nginx proxy manager
2.因为安装了宝塔,端口443和80端口,所以可以使用宝塔设置反向代理和ssl
1.为什么使用docker
docker使用的是container技术,比如部署rails过程中,最起码是需要服务器和数据库,其中服务器一般用nginx,数据库一般使用mysql,可以nginx使用一个独立容器,而mysql使用一个独立容器,这两个容器相互独立,又可以联通,容器本身是跨平台的,在部署的时候非常方便。
2.相关术语
镜像 image,是一个模板,容器是从镜像中生成的。
容器 container,应用运行在容器中。
仓库 repository:打包好的镜像是放置在仓库中的。
3.安装docker
1.需要提供镜像服务
需要提供镜像加速服务,这个在阿里云的[镜像加速器]这个服务模块中,用户有自己的加速链接(下面的registry-mirrors中的就是阿里云提供的)。这对mac的加速链接的方式是在docker客户端的Settings docker engine中进行修改。
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"registry-mirrors": [
"https://xx"
]
}
示例:
#拉取镜像
docker pull nginx #也可以是docker pull nginx:latest 最后这个是标签
#列出所有镜像
docker images #也可以是docker image ls
#启动容器
docker run -d --name web -p 8080:80 nginx:latest
#启动容器命令 docker run
#-d 在后台运行
#--name web 定义容器名称为web
# -p 8080:80 定义端口,其中宿主机(就是本地的mac)端口为8080,容器端口为80
#nginx:latest 容器所需要的镜像名称
docker ps #查看启动的容器
docker ps -a #查看所有容器
#进入容器
docker exec -it web /bin/bash #进入容器中,使用bash命令
apt update #更新源,如果没有更新源,那么vim安装不成功
apt install vim -y #安装vim工具,更新/usr/share/nginx/html/index.html文件
#访问这个容器项目
访问链接http://localhost:8080/,修改主页内容/usr/share/nginx/html,修改html文件
#使用容器生成镜像
docker commit web hello-world #web是目前容器的名称,hello-world是生成镜像的名称
#给镜像打tag,也可以理解是生成一份不同名字的拷贝
docker tag hello-world zhengjiajun/hello-world:latest
docker tag hello-world zhengjiajun/one
#将镜像提交到hub中需要将镜像的名称定义为user/name的形式,这也是上面tag的原因
#我的hub用户名称是zhengjiajun,所以将镜像命名为zhengjiajun/name的形式
#登录docker hub需要进行登录 登录和退出的命令分别是
docker login
docker logout
#docker上传到hub中
docker push zhengjiajun/one
使用docker-compose.yml文件
#启动 默认是docker-compose.yml文件,也可以使用自定义名称web.yml
docker-compose -f web.yml up -d
#文件结构,包括四个一级的key
version services networks volumes
version ,对应关系https://www.cnblogs.com/fengfengyang/p/16442146.html
version: 3
services
#services的关键字
image #从官方或者自己的hub中获取镜像
build #从Dockerfile中构建镜像
ports #端口映射(容器内的端口映射到宿主机端口) “8080:80” 左边是宿主机的端口,右边的容器端口
volumes #卷挂载,“dbdata:/var/lib/mysql” 左边是要映射的目录,右边是容器目录
environment #设置环境变量,供容器内应用使用
environment:
MYSQL_ROOT_PASSWORD:admin
depends_on :依赖关系,确保服务的前后启动顺序
command : 容器启动后执行的命令
networks : 网络设置
restart:always 随宿主机启动
networks
#常见驱动类型
bridge(默认模式) overlay host
#格式
drive:host
volumes
1.外部卷,docker外部创建和管理,可以被容器使用,示例是external:true
2.命名卷,有固定名称,在宿主机预定义的目录下面
volumes:
dbdata:
3.匿名卷
4.主机卷,宿主机的文件系统挂载到容器中
/path/in/host:/path/in/container
完整的docker-compose.yml文件
version: '3.8'
services:
db:
container_name: sqldb
image: mariadb
volumes:
- dbdata:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD: admin
- MYSQL_DATABASE: jayzen_db
- MYSQL_USER: my_user
- MYSQL_PASSWORD: my_password
networks:
- mynet
phpmyadmin:
image: phpmyadmin
restart: always
ports:
- 8080:80
environment:
-PMA_ARBITRARY: 1
networks:
- mynet
networks:
mynet:
volumes:
dbdata:
使用Dockerfile文件
#保存为文件Dockerfile
FROM ubuntu:latest
MAINTAINER jayzen <jayzen@foxmail.com>
RUN apt update #对镜像执行的命令
CMD ["echo", "hello world"] #镜像构建完成之后对容器执行的命令
#创建镜像, docker build创建镜像命令,-t name, 镜像名称, .当前文件夹下面
docker build -t myubuntu:1.0 .
#运行镜像,输出hello world表示成功运行
docker run b8df944a8864 #b8df944a8864是镜像的id
截止2025年5月2日10点,根据券商的认购数据,最新的认购倍数已经到达3099倍,乙组的获配金额预计为500x1.364/845=0.8万元。甲组1手的中签概率小于5%,甲组10手的中签概率小于10%。预计涨幅不会超过30%。
沪上阿姨的最新认购倍数:
以认购倍数超过1000的晶科电子为例:
该股的认购倍数,甲组1手的中签率为0.24%,甲组10手的中签概率为1.8%。乐观估计沪上阿姨的甲组1手的中签率为5%,甲组10手的中签率为10%,乐观预期涨幅为30%。
甲组1手的期望收益:3500x0.05x0.3=52.5元。甲组10手的期望收益:3500x0.1x0.3-88=17元(88元是融资手续费),参考期望收益来进行比较,现金认购是最划算的。
我的最终认购策略:甲组全部上现金(有优惠券上融资),资金满足的情况下融资上乙组(乙组融资手续费还是88,免收利息)。
0.购买服务器
1.安装docker
# 安装 Docker
sudo apt update
sudo apt install -y docker.io
# 安装 Docker Compose
sudo apt install -y docker-compose
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
2.创建 WordPress 项目目录,创建compose-docker.yml文件
mkdir wordpress-docker
cd wordpress-docker
3.编写compose-docker.yml文件
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
- wordpress_data:/var/www/html
depends_on:
- db
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- db_data:/var/lib/mysql
volumes:
wordpress_data:
db_data:
4.服务器中设置8080端口访问
5.启动容器
docker-compose up -d
#如果启动不了,需要更新docker安装源,国内pull数据很慢,需要替换国内的镜像
#增加/etc/docker/daemon.json
{
"registry-mirrors": [
"https://<你的阿里云加速器ID>.mirror.aliyuncs.com"
]
}
6.访问
http://ip:8080
认购倍数:公开认购倍数是115.14,国际认购倍数是13.52。已经在香港上市的未盈利生物科技公司的国际认购倍数都是在个位数1-3倍左右,映恩的国际认购倍数相对来说非常炸裂,说明机构非常认可。
甲组,一手中签率为80%,甲尾中9手。
乙组,乙头中22-23手。
我的操作:该股招股期间行情非常不稳定,中美间的贸易战正酣,观望的散户非常多,直到看到群里的消息,认购乙组的人数变多,中签的概率下降之后我才认购了两个账户。
我的总结:风浪越大鱼越贵,这个股本身是好股,同时新股有绿鞋拖一些低,在货源合适的情况下,应该大力申购。
事后总结:像B股的国配认购倍数我是在其他公众号的群里看到的,这个数据其实都是公开,只是需要积累,如果想在这个行业有确定性的积累,就应该建立这样的数据库。
作用:解决了rails中module之间的混入问题,参考如下代码示例
#代码示例
module SecondLevelModule
def self.included(base); base.extend ClassMethods; end
def second_level_instance_method; 'ok'; end
module ClassMethods
def second_level_class_method; 'ok'; end
end
end
module FirstLevelModule
def self.included(base); base.extend ClassMethods; end
def first_level_instance_method; 'ok'; end
module ClassMethods
def first_level_class_method; 'ok'; end
end
include SecondLevelModule
end
class BaseClass
include FirstLevelModule
end
上面的代码中,示例方法调用没有问题,FirstLevelModule中的类方法调用也没有问题,SecondLevelModule中的类方法不能被调用,这就是module的混入问题。
p BaseClass.new.first_level_instance_method #ok
p BaseClass.new.second_level_instance_method #ok
p BaseClass.first_level_class_method #ok
p BaseClass.second_level_class_method #error
Rails2中的解决方式
#只是修改included中方法
module FirstLevelModule
def self.included(base)
base.extend ClassMethods
base.send :include, SecondLevelModule
end
end
ActiveSupport::Concern的使用
require 'active_support'
module SecondLevelModule
extend ActiveSupport::Concern #add
def second_level_instance_method; 'ok'; end
module ClassMethods
def second_level_class_method; 'ok'; end
end
end
module FirstLevelModule
extend ActiveSupport::Concern #add
def first_level_instance_method; 'ok'; end
module ClassMethods
def first_level_class_method; 'ok'; end
end
include SecondLevelModule
end
class BaseClass
include FirstLevelModule
end
append_features的作用原理:是include的hook方法
#先于included方法执行,included方法默认是空的,append_features会检查模块是否包含在祖先链中,如果没有,添加进去
module M
def self.append_features(base)
return false
end
end
class Demo
include M
end
#改了append_features方法,是它不在祖先链中
p Demo.ancestors #[Demo, Object, PP::ObjectMixin, Kernel, BasicObject]
#如果要改写的同时要添加到祖先链中,需要在append_features中添加super方法
module M
def self.append_features(base)
super
end
end
#查看self和base
module M
def self.append_features(base)
p "self is #{self}"
p "base is #{base}"
end
end
class Demo
include M
end
#"self is M"
#"base is Demo"
ActiveSupport::Concern的源代码
module ActiveSupport
module Concern
class MultipleIncludedBlocks < StandardError #:nodoc:
def initialize
super "Cannot define multiple 'included' blocks for a Concern"
end
end
def self.extended(base) #:nodoc:
base.instance_variable_set(:@_dependencies, [])
end
def append_features(base)
if base.instance_variable_defined?(:@_dependencies)
base.instance_variable_get(:@_dependencies) << self
return false
else
return false if base < self
@_dependencies.each { |dep| base.include(dep) }
super
base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods)
base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block)
end
end
def included(base = nil, &block)
if base.nil?
raise MultipleIncludedBlocks if instance_variable_defined?(:@_included_block)
@_included_block = block
else
super
end
end
def class_methods(&class_methods_module_definition)
mod = const_defined?(:ClassMethods, false) ?
const_get(:ClassMethods) :
const_set(:ClassMethods, Module.new)
mod.module_eval(&class_methods_module_definition)
end
end
end
单单只是extend ActiveSupport::Concern
#only extend ActiveSupport::Concern
module SecondLevelModule
extend ActiveSupport::Concern #add
def second_level_instance_method; 'ok'; end
module ClassMethods
def second_level_class_method; 'ok'; end
end
end
#只执行下面 的代码,其中base是SecondLevelModule,这个模块设置实例变量
def self.extended(base) #:nodoc:
base.instance_variable_set(:@_dependencies, [])
end
#result, SecondLevelModule中包含实例变量@_dependencies,变量值为[]
<#SecondLevelModule, @_dependencies: []>
extend ActiveSupport::Concern的同时include SecondLevelModule
#extend ActiveSupport::Concern and include SecondLevelModule
module FirstLevelModule
extend ActiveSupport::Concern #add
def first_level_instance_method; 'ok'; end
module ClassMethods
def first_level_class_method; 'ok'; end
end
include SecondLevelModule
end
#执行下面的代码
def self.extended(base)
base.instance_variable_set(:@_dependencies, [])
end #result,FirstLevelModule中添加实例变量@_dependencies,将其设值为[]
def append_features(base) #这里的base还是FirstLevelModule
if base.instance_variable_defined?(:@_dependencies)
base.instance_variable_get(:@_dependencies) << self #这里是self是SecondLevelModule
return false
else
return false if base < self
@_dependencies.each { |dep| base.include(dep) }
super
base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods)
base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block)
end
end
#result
1.FirstLevelModule中设置实例变量,而且这个实例变量包含SecondLevelModule
<#FirstLevelModule, @_dependencies: [SecondLevelModule]>
2.return false表示不把SecondLevelModule添加到ancestors中
只是include FirstLevelModule
#only inclue no active_support::concern
class BaseClass
include FirstLevelModule
end
#只执行下面
def append_features(base) #这里的base是BaseClass
if base.instance_variable_defined?(:@_dependencies)
base.instance_variable_get(:@_dependencies) << self #这里是self是SecondLevelModule
return false
else
#base < self是用来判断FirstLevelModule是否在BaseClass的祖先链中
return false if base < self #这里的self是FirstLevelModule
#@_dependencies是self即FirstLevelModule的实例变量
@_dependencies.each { |dep| base.include(dep) }
super #调用super方法,实现默认的append_features方法
base.extend const_get(:ClassMethods) if const_defined?(:ClassMethods)
base.class_eval(&@_included_block) if instance_variable_defined?(:@_included_block)
end
end
总结:一般在插件中使用ActiveSupport::Concern,使用规则一般如下:
module SecondLevelModule
extend ActiveSupport::Concern #需要extend
included do #这里放实例方法
def second_level_instance_method; 'ok'; end
end
module ClassMethods #这里面放类方法
def second_level_class_method; 'ok'; end
end
end
class Demo
#进行include使用
include SecondLevelModule
end