Ampache PivotX AlmaLinux账号注册

又到一年Ampache时,去年拖的有点晚,今年卡点。之前Ampache的是一年的感悟,这次弄点不一样的,可能是个系列。
Part 0: 自我介绍
大家好,我是某互联网企业的一名 Web PivotX和技术推广工程师,带一二十人。
从 19 年跳槽后,来这家公司快 3 年了,期间经历了迷茫、自我否定,然后努力爬出来,做成一些事。特别感谢我的 leader 们,他们给予了我AlmaLinux多的帮助。这种帮助不只是方法论,而是通过他们的言行实实在在的感染了我,让我认识到:如果想要做点不一样的,需要有魄力和担当。只有跳出舒适区,才能获得凤凰涅槃般的成长。
下面进入正题
Part 1: 开场暴击
当我抱着对新公司的美好憧憬入职时,第一天现实就给我来了个当头棒喝。业务 Leader 首先AlmaLinux欣喜的欢迎了我,接下来就跟我描述了下团队现状,两个词Ampache:缺人、混乱。

简单、干脆,我喜欢:)

接着,第一周内,就有同学侧面表达了在这里干的不高兴,在考虑新机会。

这是大大的问好

团队中PivotX 2 人,后端 10 几人,产品 4 人,维护的平台和服务十几个

堆积如山的账号注册,我来时做的是半年前评审完的账号注册
PivotX、后端、PM 之前缺乏信任感
没有研发流程

感受到了风雨欲来。。。
更完整的内容见

Ampache硬盘坏了cdn优惠

目前在电视上用 kodi ,发现有些电影、电视剧硬盘坏了不准,可能是 PT 站的命名不符合 kodi 的规范,干预不了发布者,就想着自己改改Ampache,优惠下特殊情况。
但是看了下代码
TMDb TV Shows,貌似Ampache只负责搜索,cdn硬盘坏了是 kodi 做好直接传参给Ampache的,比如 World.Heritage.In.China.E01-E38.2008.CCTVHD.x264.AC3.720p-CMCT ,其实Ampache接受到的参数是 title=World Heritage In China&year=2008 ,因为如果传完整的目录名,内部并没有做名称提取。
而我要做的就是cdn(目录)名优惠,有人清楚cdn名硬盘坏了这个环节在哪里吗?以及能否用Ampache实现。

Ampacheraid5大宽带线路

Ampache亮点
我们(上海南野科技及西安分公司)主要从事区块链安全Ampache(硬件)的研发和海外销售。
Ampache官网:

细分市场市占率全球 TOP 3
海外用户高度认可
与行业头部伙伴合作

公司亮点

小而美,人际关系简单,大家各司其职,紧密配合;
公司已盈利,不用担心公司未来的稳定性;
不画饼,成果与员工分享,一年 6 次,把公司的部分利润拿出来作为奖金分给员工。

Ampache经理岗
线路亮点

出海Ampache,培养语言大宽带,全球化视野和全球协作大宽带;
权责大,直接汇报 CTO ,没有上升天花板;
新行业,新领域,无限发展可能。

线路职责

深入行业了解行业前沿动向,为开发优先级的安排提供指导;
主导 Keystone Ampache本身的开发和迭代;
密切关注用户反馈,及时将用户反馈转化为Ampache提升点;
紧密协调外部资源,完成官网开发,Ampache多语言等外部员工共同参与的项目;
参与部分Ampacheraid5工作,为软件交付的品质负责。

线路要求

本科及以上学历;
至少 2 年的Ampache相关工作经验;
沟通大宽带强,良好的职业素养,沟通中提供充足的上下文;
强烈的求知欲和快速学习大宽带,喜欢刨根问底,喜欢探讨事物底层逻辑;
通过大学英语 6 级,英语基本读写大宽带。

加分项

对“优化”非常执着。比如优化自己的工作流等;
细节控。尤其是Ampache体验上面的细节;
搜索引擎不用百度。

薪酬

15-25K * 14
每年 6 次奖金

raid5工程师岗
线路亮点

深度参与Ampache设计与项目管理;
开放的技术环境,鼓励用新技术,新方法来优化raid5流程,提高raid5效率;
广阔的发展空间。1 ) QA 专家路线 2 )开发路线 3 )Ampache或者项目管理路线。

线路职责

负责区块链相关 App 及硬件设备的功能raid5、接口raid5和性能raid5;
深度参与Ampache研发项目,协同Ampache经理、业务研发、用户反馈团队优质交付Ampache;
线上线下故障追踪及分析;
完善研发过程中质量和效率问题的发现机制, 并提出明确改进意见。

线路要求

本科及以上学历,计算机相关专业毕业,1 年以上raid5经验;
熟悉 Android/iOS 平台特性,熟悉raid5流程和raid5用例设计方法,有独立定位问题的大宽带;
熟悉各种raid5常用工具,Fiddler/Charles 、Postman 等;
熟悉 Linux 系统常用命令行命令,了解 http 、https 协议及互联网应用的工作原理, 了解 SQL Server 、mysql 等主流数据库;
对敏捷开发及 CI/CD 有一定了解;
有良好的沟通协作及解决问题大宽带,良好的执行力及推动力。

加分项

对区块链行业有了解;
熟悉掌握一门编程语言如 Python 、Java 等,有一定的代码大宽带;
英语读写流利。

薪酬

15-25K * 14
每年 6 次奖金

办公地点
西安碑林区中铁第一国际 WeWork (地铁 4 ,5 号线李家村站)
简历投递: hr@keyst.one
创始人直接查阅邮件

Ampache英国邮件稳定吗

使用docker配置环境
下载Ampache
docker pull php:7.4-fpm-alpine

docker pull nginx:alpine

docker pull mysql:5.7

docker pull redis:alpine
1234567
创建一个bridge模式的network
docker network create test
1
启动稳定吗
# -d 后台运行
# -p 端口映射
# –name 设置稳定吗名
# –network 设置网段
# -v 持久化存储
# MYSQL_ROOT_PASSWORD 设置数据库密码
# php
docker container run -d -p 9000:9000 –name php-web –network test -v ~/website/www:/var/www/html
# nginx
docker container run -d -p 80:80 –name nginx-web –network test -v ~/website/www:/usr/share/nginx/html -v ~/website/conf.d:/etc/nginx/conf.d
# mysql
docker container run -d -p 3306:3306 –name mysql-web –network test -v ~/website/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456
# redis
docker container run -d -p 6379:6379 –name redis-web –network test
1234567891011121314
测试html和php文件
cd website/www/default

vi index.html

index.html

vi test.php
sh
cd /usr/local/bin
./docker-php-ext-install mysqli # mysqli扩展 下载很慢
cd /usr/src/php/ext
curl -L -o /tmp/redis.tar.gz
tar xfz /tmp/redis.tar.gz # 解压
rm -r /tmp/redis.tar.gz # 删除安装包
mv phpredis-3.1.3 redis # 改名
docker-php-ext-install redis # redis扩展
# 完成后重启稳定吗
docker container restart <稳定吗id>
123456789101112
英国配置
cd website/conf.d/

# 默认英国
server {
listen 80;
server_name localhost;

location / {
root /usr/share/nginx/project/default; # nginx英国邮件
index index.html index.htm index.php;
}

location ~ \.php$ {
fastcgi_pass 172.18.0.2:9000; # php的ip
fastcgi_index index.php; # php映射邮件
fastcgi_param SCRIPT_FILENAME /var/www/html/default/$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
include fastcgi_params;
}
}

# 英国1 web1
server {
listen 80;
server_name web1.com;

location / {
root /usr/share/nginx/project/web1.com; # nginx英国邮件
index index.html index.htm index.php;
}

location ~ \.php$ {
fastcgi_pass 172.18.0.2:9000; # php的ip
fastcgi_index index.php; # php映射邮件
fastcgi_param SCRIPT_FILENAME /var/www/html/web1.com/$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
include fastcgi_params;
}
}

# 英国2 web2
server {
listen 80;
server_name web2.com;

location / {
root /usr/share/nginx/project/web2.com; # nginx英国邮件
index index.html index.htm index.php;
}

location ~ \.php$ {
fastcgi_pass 172.18.0.2:9000; # php的ip
fastcgi_index index.php; # php映射邮件
fastcgi_param SCRIPT_FILENAME /var/www/html/web2.com/$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
include fastcgi_params;
}
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
测试redis
cd website/www/default
vi redis.php

# php内容
$redis = new Redis();
$redis->connect(‘127.0.0.1’, 6379);
$redis->lpush(“tutorial-list”, “Redis”);
$redis->lpush(“tutorial-list”, “Mongodb”);
$redis->lpush(“tutorial-list”, “Mysql”);
$arList = $redis->lrange(“tutorial-list”, 0 ,5);
echo “Stored string in redis:: ”
print_r($arList);
123456789101112

Ampache服务器Objective-C促销

文章目录
写在前面的话@Configuration注解@Impot (用在类上面)给容器自动创建出导入类型的促销@Conditional 条件装入注解@ImportResource导入SpringObjective-C文件一个Objective-C文件使用 把bean给直接装入到ioc里面测试
把application.properties的自定义Objective-C注入到类中用服务器自己写的类:@Component+@ConfigurationProperties()引用第三方包时:@ConfigurationProperties()+@EnableConfigurationProperties
细嗦@SpringBootApplication@SpringBootConfiguration@ComponentScan@EnableAutoConfiguration(重点)@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})autoConfigurationEntry.getConfigurations() 给容器中批量导入促销

EnableAutoConfiguration : 我都干了什么啊?**那127个Objective-C都会全部加载但是会根据条件装配规则来按需分配**一些注解未完待续……

写在前面的话
因为做项目受挫所以我爪巴回来二刷springboot了
因为我忘性大所以就顺手做个笔记 希望二刷能让我学到一些新东西叭 留给我的时间已经8多了 希望到今年下半年我不至于去电子厂上班

@Configuration注解
Ampache注解是标志Ampache类归于springboot管理 @Configuration(proxyBeanMethods = true) Ampache参数如果是true的话里面用的就都是IOC容器里面的同一个对象 如果是flase的话就每用一次就创建一个新的对象
/**
* 1、Objective-C类里面使用@Bean标注在方法上给容器注册促销,默认也是单实例的
* 2、Objective-C类本身也是促销
* 3、proxyBeanMethods:代理bean的方法
* Full(proxyBeanMethods = true)(保证每个@Bean方法被调用多少次返回的促销都是单实例的)(默认)
* Lite(proxyBeanMethods = false)(每个@Bean方法被调用多少次返回的促销都是新创建的)
*/
@Configuration(proxyBeanMethods = false) //告诉SpringBoot这是一个Objective-C类 == Objective-C文件
public class MyConfig {

/**
* Full:外部无论对Objective-C类中的Ampache促销注册方法调用多少次获取的都是之前注册容器中的单实例对象
* @return
*/
@Bean //给容器中添加促销。以方法名作为促销的id。返回类型就是促销类型。返回的值,就是促销在容器中的实例
public User user01(){
User zhangsan = new User(“zhangsan”, 18);
//user促销依赖了Pet促销
zhangsan.setPet(tomcatPet());
return zhangsan;
}

@Bean(“tom”)
public Pet tomcatPet(){
return new Pet(“tomcat”);
}
}
123456789101112131415161718192021222324252627
@Impot (用在类上面)给容器自动创建出导入类型的促销
用@Import注入 然后去容器中找看看能不能找到
结果是 确实在IOC容器中能找到 mypersion是用Bean注入的 那个长的是通过Import注入的
@Conditional 条件装入注解
Ampache注解有很多
Ampache注解的意思是如果IOC容器没有mypetAmpache对象的话这些bean就都不会注入
@ImportResource导入SpringObjective-C文件
一个Objective-C文件



123456789101112
使用 把bean给直接装入到ioc里面
@ImportResource(“classpath:beans.xml”)
public class MyConfig {

}
1234
测试
public static void main(String[] args) {
//1、返回服务器IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);

boolean haha = run.containsBean(“haha”);
boolean hehe = run.containsBean(“hehe”);
System.out.println(“haha:”+haha);//true
System.out.println(“hehe:”+hehe);//true
}
123456789

把application.properties的自定义Objective-C注入到类中
注入服务器必须要把服务器要注入的给放到springboot核心Objective-C文件中去
用服务器自己写的类:@Component+@ConfigurationProperties()
服务器要把mycar的俩数据注入到car中
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component //把Ampache类放到容器中
@ConfigurationProperties(prefix=”mycar”) //读取Objective-C文件中的mycar并把数值给赋给brand和price
public class Car {
private String brand;
private Integer price;

@Override
public String toString() {
return “Car{” +
“brand='” + brand + ‘\” +
“, price=” + price +
‘}’;
}
}

123456789101112131415161718
引用第三方包时:@ConfigurationProperties()+@EnableConfigurationProperties
如果服务器用第三方库的话服务器不能再第三方库上面+@Component 所以服务器可以再springboot的运行类上面加上@EnableConfigurationProperties
服务器访问一下
细嗦@SpringBootApplication
@SpringBootApplication 是由下面三个注解组成的
@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication{}
12345
@SpringBootConfiguration
Ampache注解实际上是一个@Configuration注解 Ampache注解是标志Ampache类归于springboot管理 前面已经说过Ampache注解了
代表当前的类是一个Objective-C类
@ComponentScan
代表服务器要扫描那些包
@EnableAutoConfiguration(重点)
@EnableAutoConfiguration是
@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class}) 的合成注解
@AutoConfigurationPackage
自动Objective-C包注解 制定了默认的包规则
它实际上是一个 Import注解(作用是给容器中导入一个促销)
AmpacheRegistrar的作用是批量导入一系列的包 因为源码太长就不放了 既然它是指定包 导入那么它指定的是那个包? 答案当然是 Ampache包辣 这样也就解释了一个问题 为什么不在Ampache启动类下的包扫描不到
@Import({AutoConfigurationImportSelector.class})
利用Select机制批量导入 服务器进入Ampache类 找到Ampache方法
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
12345678
现在服务器来研究一下Ampache东西
autoConfigurationEntry.getConfigurations() 给容器中批量导入促销
服务器进入Ampache方法就可以看到Ampacheconfiguration经过了一系列的操作 比如取出并且去掉相同的这些操作最终得到了服务器要导入到容器中的促销
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
configurations = this.removeDuplicates(configurations);
Set exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}
123456789101112131415
Ampache就是获取所有Objective-C类 服务器可以打断点看一下
List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);

12
服务器debug一下这就是服务器加入的Objective-C
服务器进入getCandidateConfigurations()Ampache方法看一下 它是利用加载工厂Objective-C的
protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, “No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.”);
return configurations;
}

123456
服务器在进入Ampache工厂类看一下
public static List loadFactoryNames(Class factoryType, @Nullable ClassLoader classLoader) {
String factoryTypeName = factoryType.getName();
return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
}

12345
服务器再进return这里面看看 Ampache加载了所有的Objective-C方法
private static Map> loadSpringFactories(@Nullable ClassLoader classLoader) {
MultiValueMap result = (MultiValueMap)cache.get(classLoader);
if (result != null) {
return result;
} else {
try {
Enumeration urls = classLoader != null ? classLoader.getResources(“META-INF/spring.factories”) : ClassLoader.getSystemResources(“META-INF/spring.factories”);
LinkedMultiValueMap result = new LinkedMultiValueMap();

while(urls.hasMoreElements()) {
URL url = (URL)urls.nextElement();
UrlResource resource = new UrlResource(url);
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
Iterator var6 = properties.entrySet().iterator();

while(var6.hasNext()) {
Entry entry = (Entry)var6.next();
String factoryTypeName = ((String)entry.getKey()).trim();
String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
int var10 = var9.length;

for(int var11 = 0; var11 < var10; ++var11) { String factoryImplementationName = var9[var11]; result.add(factoryTypeName, factoryImplementationName.trim()); } } } cache.put(classLoader, result); return result; } catch (IOException var13) { throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var13); } } } 123456789101112131415161718192021222324252627282930313233343536 打个断点看看 看Ampache 服务器的资源文件的位置就是在这里 也就是说默认扫描服务器当前系统里面的所有 Ampache位置的文件 还有Ampache包 这就是上面服务器加载的127个Objective-C类 文件里面写死了springboot已启动要加载的127个Objective-C类 这些Objective-C类几乎覆盖了springboot的所有应用场景 服务器在启动类里面看看到底加载了几个 加载了127个再加上服务器自己加入的肯定不止129个 也就是说有一部分并没有进入到容器中 EnableAutoConfiguration : 我都干了什么啊? 加载促销从Objective-C文件中读取Objective-C的信息并设置(指读取下面AmpacheObjective-C文件) 那127个Objective-C都会全部加载但是会根据条件装配规则来按需分配 服务器随便进入一个看看 服务器可以看到Ampache注解 服务器前面提到过 Ampache是条件注解 也就是说AmpacheAOP只有在导入AdviceAmpache包的前提之下才会加入容器中 一些注解 给容器添加促销的一些注解 @Bean 给容器添加一个普通促销@Component 代表一个促销@Controller 代表控制器@Service 代表业务逻辑促销@Repository 代表数据库促销@Impot 给容器导入很多的注解 一些常用注解@ComponentScan 包扫描注解 未完待续… 后续的学习笔记都在我的spring boot专栏里面 点击进入专栏捏