porridgechen890的笔记

梦里不知身是客

文档

链接

Edge浏览器如果打不开,可以用谷歌浏览器。

集成

  1. 这里勾选需要的平台,把仓库地址拷贝到项目级build.gradle,把依赖拷贝到模块级build.gradle。

  2. 可能需要修改gradle的版本号,这里提供一组:

    classpath 'com.android.tools.build:gradle:7.0.3'

    distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip

  3. 可能需要删除旧的广告依赖和广告仓库。

  4. 需要使用Java8:

    android {
        compileOptions {
            sourceCompatibility = JavaVersion.VERSION_1_8
            targetCompatibility = JavaVersion.VERSION_1_8
        }
    }
  5. 需要收集谷歌广告ID:implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'

  6. 需要广告ID权限:<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>

  7. 添加sdk key:<meta-data android:name="applovin.sdk.key" android:value="YOUR_SDK_KEY_HERE"/>

  8. 初始化sdk:

    //读取缓存文件里的GDPR值
    String gdpr_config = "pub_gdpr_config";
    SharedPreferences sh = this.getSharedPreferences(gdpr_config, 0);
    SharedPreferences.Editor shedit = sh.edit();
    int gdpr_value = sh.getInt("gdpr_state", -1);
    Log.d("maxadlog", "gdpr value from cache = " + gdpr_value);
    
    AppLovinSdk.getInstance(this).setMediationProvider("max");
    AppLovinSdk.initializeSdk(this, new AppLovinSdk.SdkInitializationListener() {
        @Override
        public void onSdkInitialized(AppLovinSdkConfiguration appLovinSdkConfiguration) {
            Log.d("maxadlog", appLovinSdkConfiguration.toString());
    
            if (gdpr_value == -1) {
                if (appLovinSdkConfiguration.getConsentDialogState() == AppLovinSdkConfiguration.ConsentDialogState.APPLIES) {
                    Log.d("maxadlog", "gdpr APPLIES");
                    AppLovinUserService appLovinUserService = AppLovinSdk.getInstance(DreamPub._activity).getUserService();
                    appLovinUserService.showConsentDialog(DreamPub._activity, new AppLovinUserService.OnConsentDialogDismissListener() {
                        @Override
                        public void onDismiss() {
                            AppLovinPrivacySettings.setHasUserConsent(true, DreamPub._activity);
                            shedit.putInt("gdpr_state", 1);
                            shedit.commit();
                        }
                    });
                } else if (appLovinSdkConfiguration.getConsentDialogState() == AppLovinSdkConfiguration.ConsentDialogState.DOES_NOT_APPLY) {
                    Log.d("maxadlog", "gdpr DOES_NOT_APPLY");
                } else {
                    Log.d("maxadlog", "gdpr UNKNOWN");
                }
            }
            MaxAdHelper.init_max_ad(AppActivity.this);
        }
    });
    //AppLovinSdk.getInstance(this).showMediationDebugger();

其他

  1. adjust初始化

  2. 拷贝MaxAdHelper

  3. 修改视频、插屏、开屏ID

  4. 修改adltv点位

  5. 修改广告关控

统计每一关开始了多少次

select
count(事件名)
FROM test.例子表
where 事件名 = 'level_start'
group by 关卡号

统计每一关开始了多少次的另一种方法

select
SUM(case 事件名 when 'level_start' then 1 else 0 end) as 开始次数
FROM test.例子表
where 事件名 IN ('level_start', 'level_succ')
group by 关卡号

我疑惑的是,下面这种写法,多写一行就不行了:

select
SUM(case 事件名 when 'level_start' then 1 else 0 end) as 开始次数
SUM(case 事件名 when 'level_succ' then 1 else 0 end) as 成功次数
FROM test.例子表
where 事件名 IN ('level_start', 'level_succ')
group by 关卡号

count(1)是啥

查看SHA1

在 keytool.exe 所在的目录下打开终端,输入:

keytool.exe -list -v -keystore D:\AAA\BBB\xxx.jks

如果电脑上安装了 Android Studio,可以在 C:\Program Files\Android\Android Studio\jre\bin> 这个目录下找到 keytool.exe。

签名文件需要输入完整的路径,如 D:\AAA\BBB\xxx.jks。

然后会输出 SHA1。

导出

keytool.exe -exportcert -alias key0 -keystore D:\AAA\BBB\xxx.jks > E:\key.txt

-alias 后边跟的是别名。

-keystore 后边跟的是签名文件的完整路径。

> 后边跟的是输出文件的完整路径,这个文件可以没有,会自动创建出来。

执行这条命令后,会需要输入签名文件的密码。

执行成功后,如果打开 key.txt,会看到里边是乱码。

可视化导出的文件

把生成的 key.txt 文件拷贝到 openssl.exe 所在目录下。

然后通过下面两条命令来生成 base64 字符串。

openssl sha1 -binary key.txt > key_sha.txt
openssl base64 -in key_sha.txt > key_base64.txt

源码注释

/** ClippingNode is a subclass of Node.
 * It draws its content (children) clipped using a stencil.
 * The stencil is an other Node that will not be drawn.
 * The clipping is done using the alpha part of the stencil (adjusted with an alphaThreshold).
 */
  • 翻译注释:

    • ClippingNode是Node的子类。

    • 它通过一个模板节点去裁剪添加到它的子节点们。

    • 模板节点不会被渲染出来。

    • 裁剪是通过Alpha通道来实现的。

  • 补充说明:

    • 模板可以是一张图(即一个Sprite),也可以是一个DrawNode,甚至可以是一个Node(这个Node再添加如Sprite一类的子节点)。

    • setInverted(true或者false)裁剪成模板里面还是外面。

    • setAlphaThreshold(GLfloat n)。n的取值范围是0到1,模板图片会被n给分割成大于n和小于n的,从而形成丢弃和保留的部分。

      如果一张图有三种alpha通道值,那么可以通过修改n值,来裁剪出不同的形状。

Alpha通道

关于Alpha通道,可以参考这篇文章:什么是Alpha通道?

  • 摘录其中几句话:

    • 一个使用每个像素16比特存储的位图,对于图形中的每一个像素而言,可能以5个比特表示红色,5个比特表示绿色,5个比特表示蓝色,最后一个比特是阿尔法。在这种情况下,它表示透明或者不透明,因为阿尔法比特只有0或1两种不同表示的可能性。又如一个使用32个比特存储的位图,每8个比特表示红绿蓝,和阿尔法通道。在这种情况下,就不光可以表示透明还是不透明,阿尔法通道还可以表示256级的半透明度,因为阿尔法通道有8个比特可以有256种不同的数据表示可能性。

    • Alpha通道储存一个值,其外在表现是透明度,Alpha通道和透明度没啥关系。

    • 真正让图片变透明的不是Alpha,而是Alpha所代表的数值和其他数值做了一次运算。比如你有一张图片你想抠出图片中间的一部分,在PS里你会建立一个蒙板,然后在蒙板里把不需要的地方填充成黑色,需要的留成白色,这个时候实际上是是做了一次乘法。用黑色所代表的数值0去乘以你所填充的地方,那么这个地方就变透明了。

典型用法

//第一种方法:通过Sprite去裁剪
//这张图的路径cocos2d-x-3.17/tests/cpp-tests/Resources/Images/hole_effect.png
auto stencil = Sprite::create("res/hole_effect.png");
auto clip = ClippingNode::create(stencil);
clip->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
clip->setAlphaThreshold(0.05);
clip->setInverted(true);
this->addChild(clip);
//这张图的路径cocos2d-x-3.17/tests/cpp-tests/Resources/Images/MagentaSquare.png
auto content = Sprite::create("res/MagentaSquare.png");
clip->addChild(content);
//第二种方法:通过DrawNode(多边形)去裁剪,这种方法不需要setAlphaThreshold
auto stencil = DrawNode::create();
const int cnt = 720;//用多少个点来画一个圆
int r = 10;//圆的半径
Vec2 arr[cnt];//组成圆的每个点的横纵坐标
for (int i = 0; i < cnt; i++)
{
    arr[i].x = r * cos( (360.0f/cnt) * i * (M_PI/180) );
    arr[i].y = r * sin( (360.0f/cnt) * i * (M_PI/180) );
}//不要写成360/cnt,脸一黑
stencil->drawPolygon(arr, cnt, Color4F::BLUE, 0, Color4F::ORANGE);
auto clip = ClippingNode::create(stencil);
clip->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
clip->setInverted(true);
this->addChild(clip);
auto content = Sprite::create("res/MagentaSquare.png");
clip->addChild(content);
//第三种方法:通过DrawNode(点)去裁剪,这种方法需要setAlphaThreshold
auto stencil = DrawNode::create();
//DrawNode还有drawDot()和drawCircle()两个方法。
stencil->drawDot(Vec2(0, 0), 10, Color4F::BLUE);
auto clip = ClippingNode::create(stencil);
clip->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2));
//如果不调用setAlphaThreshold(0.1)的话,裁剪出来是方的😂
clip->setAlphaThreshold(0.1);
clip->setInverted(true);
this->addChild(clip);
auto content = Sprite::create("res/MagentaSquare.png");
clip->addChild(content);
//第四种方法:模板节点可以是Node类型,下边再添加Sprite,这样也是可以的。
auto stencil = Node::create();
auto spr1 = Sprite::create("res/hole_effect.png");
stencil->addChild(spr1);
//同理,content也可以是空的Sprite,下边再添加Sprite。

第一步:准备

  1. 一个之前没有注册过苹果ID的邮箱

  2. 一个能接收短信的国内手机号(之前注册过中国区的Apple ID的手机号也可以)

  3. 有美国节点的代理工具

第二步:注册ID

这里注册。

  1. 名字和姓氏都写英文

  2. 国家选美国

  3. 出生日期写一个大于18岁的日期

  4. 邮箱就用准备好的新邮箱,密码整得随机一点,不要包含名字、生日等信息

  5. 填上准备好的手机号,用短信验证就可以

  6. “公告”和“App、音乐、电视节目等”这两个可以不用勾

  7. 验证完邮箱和手机号之后,就算注册成功了

第三步:添加付款方式

添加付款方式那里点一下,有两个选项,一个是“信用卡”,一个是“PayPal”,我们需要的是第三种方式“无”。如何弄出这个第三种选项呢?

  1. 用iPhone或者iPad登录刚才注册好的账号,“设置”->“通用”->“语言”,把语言改成美国英语。

  2. 媒体与购买项目用你新注册的账号登陆,也就是设置最顶上那个账号。

  3. 苹果官网上,用你新注册的美国号登陆,管理账户里把语言换成英文。

  4. 打开代理软件,选择美国节点,设置全局模式。

  5. 进入App store,用你新注册的苹果号登陆App store,然后下载软件提示点选review(检查),之后就会跳出付款信息的填写,此时会看见强制填写的信用卡号等信息变成了选填,选择None就可以了。

  6. 这里生成美国地址:

    生成地址前,建议选以下五个免税州:蒙大拿州(Montana)俄勒冈州(Oregon)阿拉斯加州(Alaska)特拉华州(Delaware)新罕布什尔州(New Hampshire)。

  7. 国家选美国,付款方式选无,“街道地址”和“楼号单元号”都写生成器里生成的地址,城市选免税州里的一个,邮编按生成器里生成的写,手机号去这里随便找一个。

  8. 完善完城市街道等基本信息,点选next,就会跳出完成注册的提示了。

参考文章

https://zhuanlan.zhihu.com/p/367821925

https://zhuanlan.zhihu.com/p/514758062

去哪里下载软件

  1. 除 iOS 之外的平台,去这个网站下载。

  2. iOS 版本需要使用美区账号登录美区苹果商店,然后搜索 shadowrocket 安装。

    注意不要下错了,开发者是Shadow Launch Technology Limited。

去哪里弄美区账号

可以自己注册美区账号,也可以使用别人的账号。

参考这个网页

如何登录别人的账号

打开软件 App Store -> 点击右上角的头像,拉到底部,退出登录,再登录新账号。

有可能弹出一个安全性的页面,选择 其他选项 -> 不升级 。千万不要开启双重验证。

怎么使用软件

下下来后,参考这个文章来导入。

其他

Surfshark VPN 85%优惠+3个月畅享:https://bittly.cc/Surfshark

  1. PrivadoVPN:https://privadovpn.com/pricing

  2. Windscribe:https://windscribe.com/download

  3. AtlasVPN:https://atlasvpn.com/free-vpn

  4. zoogvpn:https://zoogvpn.com/free-vpn/

  5. ProtonVPN:https://protonvpn.com/free-vpn

  6. Hideme VPN:https://hide.me/en/free-vpn

  7. TunnelBear:https://www.tunnelbear.com/

这是个什么工具?

AI作图。

如何安装

  • 仓库地址:https://github.com/AUTOMATIC1111/stable-diffusion-webui
  • 仓库的README里边写了,需要安装Python 3.10.6 和Git。并且显卡不能太差劲。
  • 安装过程中的注意点:Python版本必须是这个,并且加到环境变量里,并且卸载掉其他的Python版本。
  • 我在安装过程中遇到的问题一:gfpgan安装不了。解决办法是修改launch.py,把https://github.com改成https://ghproxy.com/https://github.com
  • 我在安装过程中遇到的问题二:显存不够用,提示CUDA out of memory。解决办法是修改webui-user.bat,改成set COMMANDLINE_ARGS= --lowvram并且在下面加一行set PYTORCH_CUDA_ALLOC_CONF=garbage_collection_threshold:0.6,max_split_size_mb:128

如何汉化

https://github.com/VinsonLaro/stable-diffusion-webui-chinese

参考文章

https://www.freedidi.com/8474.html

在 DBeaver 连接到 MySQL 时提示错误 Public Key Retrieval is not allowed

在 DBeaver 里右键连接不上的数据库,点“编辑连接”,“主要”->“Sever”->“数据库”。在数据库名字后边加上 ?allowPublicKeyRetrieval=true

使用 Windows 命令行运行 SQL 脚本来创建表

在目录C:\Program Files\MySQL\MySQL Server 8.0\bin下打开CMD。

将写好的sql脚本拷贝到这个目录下。假设这个文件的名字叫xxx.sql

执行命令 mysql -u root -p < xxx.sql,然后输入密码就可以了。

如果不支持中文,就在脚本的顶部加上 set names gbk;,并且将脚本保存成 gbk 编码。

例如:

set names gbk;

CREATE DATABASE IF NOT EXISTS test;

USE test;

DROP TABLE IF EXISTS 表名X;

CREATE TABLE 表名X (
    序号 BIGINT NOT NULL AUTO_INCREMENT,
    班级号 BIGINT NOT NULL,
    学生名字 VARCHAR(100) NOT NULL,
    事件名 VARCHAR(100) NOT NULL,
	日期 VARCHAR(100) NOT NULL,
    PRIMARY KEY (序号)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (1, 1, '杨过', '打豆豆', '昨天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (2, 2, '郭靖', '吃饭', '昨天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (3, 2, '郭靖', '睡觉', '昨天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (4, 1, '小龙女', '睡觉', '今天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (5, 2, '黄蓉', '吃饭', '今天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (6, 2, '黄蓉', '打豆豆', '今天');
INSERT INTO 表名X (序号, 班级号, 学生名字, 事件名, 日期) VALUES (7, 1, '杨过', '打豆豆', '今天');

SELECT 'ok' as 'result:';

group by 的用法

假设有两个班,1班里的同学是杨过和小龙女,2班里的同学是郭靖和黄蓉。他们做的事分别吃饭、睡觉、打豆豆。他们每次做这些事的时候都会在表格里留下一条记录。

序号 班级号 学生名字 事件名 日期
1 1 杨过 打豆豆 昨天
2 2 郭靖 吃饭 昨天
3 2 郭靖 睡觉 昨天
4 1 小龙女 睡觉 今天
5 2 黄蓉 吃饭 今天
6 2 黄蓉 打豆豆 今天
7 1 杨过 打豆豆 今天
  1. 豆豆一共被打了多少次?
select count(*) as 打豆豆总次数 from test.表名X where 事件名 = '打豆豆'
select sum(case when 事件名 = '打豆豆' then 1 else 0 end) as 打豆豆总次数 from test.表名X
  1. 各个班分别打了多少次豆豆?
    -- 不用 group by 的写法
    select count(*) as 各个班级的打豆豆次数 from test.表名X where 班级号 = 1 and 事件名 = '打豆豆'
    select count(*) as 各个班级的打豆豆次数 from test.表名X where 班级号 = 2 and 事件名 = '打豆豆'
    -- 用 group by 的写法
    select sum(case when 事件名 = '打豆豆' then 1 else 0 end) as 各个班级的打豆豆次数 from test.表名X group by 班级号

从上面的例子可以看出,如果想要统计1班和2班分别一共打了多少次豆豆,如果用group by更方便。

0%