映恩生物新股复盘

认购倍数:公开认购倍数是115.14,国际认购倍数是13.52。已经在香港上市的未盈利生物科技公司的国际认购倍数都是在个位数1-3倍左右,映恩的国际认购倍数相对来说非常炸裂,说明机构非常认可。

甲组,一手中签率为80%,甲尾中9手。

乙组,乙头中22-23手。

我的操作:该股招股期间行情非常不稳定,中美间的贸易战正酣,观望的散户非常多,直到看到群里的消息,认购乙组的人数变多,中签的概率下降之后我才认购了两个账户。
我的总结:风浪越大鱼越贵,这个股本身是好股,同时新股有绿鞋拖一些低,在货源合适的情况下,应该大力申购。
事后总结:像B股的国配认购倍数我是在其他公众号的群里看到的,这个数据其实都是公开,只是需要积累,如果想在这个行业有确定性的积累,就应该建立这样的数据库。

ActiveSupport::Concern的作用和实现原理

作用:解决了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

使用宝塔快速搭建wordpress

1.购买服务器

2.服务器中安装宝塔

#ubuntu 命令
wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh && sudo bash install_panel.sh ed8484bec

3.安装成功之后,命令行显示如下的内容

外网面板地址: http://ip:8888/c62d6af5
内网面板地址: http://ip:8888/c62d6af5
username: name
password: password

#备注8888端口默认是没有开的,需要自己添加开通

4.面板设置

[面板设置]中修改面板账号和面板密码
[面板设置]中重新设置安全入口
[面板设置]修改端口,需要在ECS中添加安全组的地址

5.安装的软件

nginx 1.20
mysql 5.6
phpmyadmin 4.9
php 7.3
pure-ftpd

6.创建站点

[网站]中[添加站点],添加ftp和数据库的账号和密码
通过ecs后台域名添加域名解析
点击站点,添加wordpress为伪静态

7.上传wordpress

1./www/wwwroot/xiangtec.com文件夹下面放wordpress内容,删除原来的404和index文件
输入数据库的名称和密码
2.使用上文提到的域名解析对应的域名进行访问

8.缓存设置

安装主题2012
宝塔在php中[安装扩展],安装opcache和memcached
wordpress中插件安装 memcached is you friend 并且启动

9.插件安装

WP Githuber MD   #一个使用marddown的文本编辑器

10.外观-主题文件编辑器

修改footer  [外观]-[主题编辑器]-修改printf函数内容

11.优化设置

日志分割 [计划任务]
数据库备份  可以从[计划任务]中进行备份,也可以从[数据库]中进行备份
ssl  [网站]-[ssl]-[let's Encrypt]
恶意解析,通过ip进行访问   [网站]-[默认站点]-选择站点
php版本切换 [网站]-[网站名]-[PHP版本]

沪上阿姨新股认购分析

从新股认购分析的下面几个维度来分析:1.新股质地2.筹码分析3.做多意图4.市场行情
1.新股品质
同行比较,截止4月30日开市前PE:蜜雪冰城39.9, 古茗36.81,茶百道24.93。
沪上阿姨(按照招股最高市值计算)36,发行较贵,给二级市场留的水位很少。
2.筹码分析
截止4月30日开市前,市场公开认购倍数已经超过600倍,并且新股认购的大户辉立券商还未发力,预计公开认购倍数会超过1000倍,招股最高市值为118.6亿港币,发行比例为2.3%,基石认购比例为28.42%,市场的流通值为1.9526亿,按照一般的分配规律,散户分配1.364亿,国际配售0.5886亿(散户获得公开认购的50%,国家配售获得公开认购的50%中扣除基石认购部分)。
目前市场参与公开认购的金额为167.84亿(600倍),参与分配1.364亿,那么乙组(500万)按照比例金额分配为500x1.364/167.84=4万元,如果超过1000倍,那么乙组预计分配2万左右。甲组一手获配比例小于10%。
新政策出来之后,有资格参与乙组的人数大幅度减少,上述分配是在认为甲组和乙组认购金额相同的情况下给出分配金额,参考映恩生物乙组的认购人数为1137人,考虑目前奶茶行业认知度比较高,以乙组1500人来计算,1.364x10000/2/1500=4.5万。那么在乙组平均分配的前提下,获配为4.5万,实际上当然更少。
3.做多意图
发行比例少,2.3%,就是保发行。选择中信证券来保荐,中信里昂来稳价,中信的套路回拨的概率大。
做多的意图比较明显。
4.市场行情
贸易纠纷已经到底,未来不会更差。
截止4月30日开市,今年上市的蜜雪冰城、古茗、霸王茶姬分别累计上涨151%,148%,26.43%。

综合分析:标的一般,但是打新的风险很小,保发行和做多的意图明显,同类型股票行情好。作为打新是一个不错的标的。但是不适合持有,暗盘有收益就走。