penguin-statistics / backend-next Goto Github PK
View Code? Open in Web Editor NEWThe refactored Penguin Statistics v3 Backend. Built with Go, fiber, bun and go.uber.org/fx. Uses NATS as MQ and Redis as state synchronization.
License: MIT License
The refactored Penguin Statistics v3 Backend. Built with Go, fiber, bun and go.uber.org/fx. Uses NATS as MQ and Redis as state synchronization.
License: MIT License
For example: fail to connect to pg
For an activity that is just opened, the users care more about how will the drop rates of this item in the current activity be. To give them the fastest way to understand this and also give a better way of how the samples finally rest around a particular rate.
Besides only reporting the count of accumulated quantity
, an accumulated standard_deviation
should also be calculated so that visualization on confidence intervals could be easily visualized, assuming the drop rate across different stage clears is a binomial distribution.
/PenguinStats/api/v2/result/advanced
should override the startTime
in responses, so that drop results can fit the startTime
rounded by the backend.
Currently this uses an auto incrementing primary key and simply, deletes all staled rows then inserts all fresh rows. It just looks nasty because the sequence will not reset on cache reset and it's just eventually gonna go wild.
Composited Primary Key or simply ON CONFLICT UPDATE
in a transaction shall solve this easily.
When NATS encountered a slow consumer it will drop the message, losing the report content. This has happened before extremely rarely but still have a huge potential to go wrong in the future, especially when we migrate to the k8s cluster
To avoid DDoS vulnerability advanced query shall be rate limited. General usage shall be far from triggering limitation.
This limit could be placed either on nginx or on the application side, while personally I prefer to just place it on the application side as more complex logic could be added with ease, while still maintaining a pretty low latency due to we are short-circuiting the request if it triggered the rate limit mechanism (of course).
Because Mr. G created a fake end time which is around year 3939, it gives a really huge number as interval section number.
This is to ensure ID generation consistency across different k8s Pods.
Go 1.18 has been released 8 hours ago (https://go.dev/blog/go1.18). Migrate to use the terrific Generics and Fuzzing features and 20% Performance Improvements (says the article)!
We should provide GitHub Issue Templates to help new contributors to fill the required information when creating an issue.
Also we could open up the discussions tab, if that is needed.
Vary
header currently errornously only contains Accept-Encoding
but it should also contain Origin
for correct CORS header generation. This could break third party apps and even our own frontend if not mitigated.
The element_id
just rolls indefinitely lol
It is using the time when MQ handles the message, not the time when the user submitted it.
To detect anomaly and also produce more fancy ways of visualizing the data (including having a top source
panel for providers to see the rate of their provider usage, etc) here's a proposed method that uses X-dimension tuple to describe all attributes of the drop report data:
item_id
, stage_id
, range_id
, server
, account_id
, source_name
, source_version
, ip_address
. Those identifiers could be used as GROUP BY
keys to aggregate drop matrix data in various forms of filtering.GROUP
on, e.g. times
, quantity
, standard_deviation
.This could help in various ways, including improving performance of advanced query, enabling much easier forms of visualizing the dataset, and centralizing & pre-aggregating potential wanted filtering on various conditions.
Furthermore, periodically check this table with different sets of GROUP
aggregations can let us find and detect anomaly way easier than before, and is also a more advanced way comparing to full-table aggregations. Also, this could even potentially be the fallback data source of StatHouse
in where it delivers real-time dataset changes to users. By dedicating such usage cases and combine them into this table we can unlock much more potentials to deliver more trusty statistics and can also start to deliver insightful data breakdowns fairly easily starting from here.
backend_1 | 2022-03-09T22:00:33.097330775Z ERR panic: reflect: Call using *types.Drop as type types.ArkDrop
backend_1 | goroutine 6389880 [running]:
backend_1 | github.com/penguin-statistics/backend-next/internal/server/httpserver.Create.func2(0xde4000, {0xdf22e0, 0xc004df9ce0})
backend_1 | /app/internal/server/httpserver/http.go:92 +0x50
backend_1 | github.com/gofiber/fiber/v2/middleware/recover.New.func1.1()
backend_1 | /go/pkg/mod/github.com/gofiber/fiber/[email protected]/middleware/recover/recover.go:33 +0x7a
backend_1 | panic({0xdf22e0, 0xc004df9ce0})
backend_1 | /usr/local/go/src/runtime/panic.go:1038 +0x215
backend_1 | reflect.Value.call({0xe05720, 0xfaae58, 0x7f2ccb9745b8}, {0xf4714f, 0x4}, {0xc004387b48, 0x1, 0x10000c004e01380})
backend_1 | /usr/local/go/src/reflect/value.go:411 +0x19ff
backend_1 | reflect.Value.Call({0xe05720, 0xfaae58, 0xc00463e150}, {0xc004387b48, 0x1, 0x1})
backend_1 | /usr/local/go/src/reflect/value.go:339 +0xc5
backend_1 | github.com/ahmetb/go-linq/v3.(*genericFunc).Call(0xc000131460, {0xc0050f0c18, 0x1, 0xd})
backend_1 | /go/pkg/mod/github.com/ahmetb/go-linq/[email protected]/genericfunc.go:35 +0x70
backend_1 | github.com/ahmetb/go-linq/v3.Query.SelectT.func1({0xdd0040, 0xc002b337c0})
backend_1 | /go/pkg/mod/github.com/ahmetb/go-linq/[email protected]/select.go:47 +0x47
backend_1 | github.com/ahmetb/go-linq/v3.Query.Select.func1.1()
backend_1 | /go/pkg/mod/github.com/ahmetb/go-linq/[email protected]/select.go:24 +0x3e
backend_1 | github.com/ahmetb/go-linq/v3.Query.SumInts({0xddb940})
backend_1 | /go/pkg/mod/github.com/ahmetb/go-linq/[email protected]/result.go:477 +0x2f
backend_1 | github.com/penguin-statistics/backend-next/internal/utils/reportutils.AggregateGachaBoxDrops(0xc002ccac00)
backend_1 | /app/internal/utils/reportutils/merge_drops.go:34 +0x54
backend_1 | github.com/penguin-statistics/backend-next/internal/service.(*ReportService).PreprocessAndQueueSingularReport(0xc0004dd260, 0xc002a9d340, 0xc00463e0e0)
backend_1 | /app/internal/service/report.go:180 +0x174
backend_1 | github.com/penguin-statistics/backend-next/internal/controllers/shims.(*ReportController).SingularReport(0xc0003d7d40, 0xc00184c840)
backend_1 | /app/internal/controllers/shims/report.go:48 +0x65
(investigate today)
This happens on US, JP, and KR servers, but not on CN.
These items cannot be disabled in excludes or options either.
Planner also shows some synthesis that doesn't make any sense, as I have more than needed, and it's not used in other synthesis either.
For example: Bipolar Nanoflakes (have: 4, required: 0)
The export of the request I'm trying to send:
{"@type":"@penguin-statistics/planner/config","items":[{"id":"30135","have":1,"need":4},{"id":"30125","have":4},{"id":"30115","have":1,"need":4},{"id":"30074","have":27},{"id":"30073","have":130},{"id":"30084","have":10,"need":4},{"id":"30083","have":2,"need":3},{"id":"30093","have":24},{"id":"30104","need":2},{"id":"30103","have":84},{"id":"30013","need":6},{"id":"30012","have":62},{"id":"30011","have":20},{"id":"30064","have":6,"need":5},{"id":"30063","have":2},{"id":"30062","have":46},{"id":"30061","have":33},{"id":"30034","have":5},{"id":"30033","have":53},{"id":"30032","have":113},{"id":"30031","have":104},{"id":"30024","have":4},{"id":"30023","have":6},{"id":"30022","have":114},{"id":"30021","have":83},{"id":"30044","have":19,"need":8},{"id":"30043","have":17},{"id":"30042","have":69},{"id":"30041","have":16},{"id":"30054","have":3},{"id":"30053","have":10},{"id":"30052","have":42},{"id":"30051","have":29},{"id":"31014","need":3},{"id":"31013","have":10},{"id":"31024","have":20,"need":5},{"id":"31023","have":5},{"id":"30145","have":2},{"id":"31034","have":3},{"id":"31033","have":31},{"id":"31044","have":16},{"id":"31043","have":37},{"id":"31054","have":19},{"id":"31053","have":24}],"options":{"byProduct":false,"requireExp":false,"requireLmb":false},"excludes":[]}
Request that gets sent:
{"required":{"30013":6,"30044":8,"30064":5,"30083":3,"30084":4,"30104":2,"30115":4,"30135":4,"31014":3,"31024":5},"owned":{"30011":20,"30012":62,"30021":83,"30022":114,"30023":6,"30024":4,"30031":104,"30032":113,"30033":53,"30034":5,"30041":16,"30042":69,"30043":17,"30044":19,"30051":29,"30052":42,"30053":10,"30054":3,"30061":33,"30062":46,"30063":2,"30064":6,"30073":130,"30074":27,"30083":2,"30084":10,"30093":24,"30103":84,"30115":1,"30125":4,"30135":1,"30145":2,"31013":10,"31023":5,"31024":20,"31033":31,"31034":3,"31043":37,"31044":16,"31053":24,"31054":19},"extra_outc":false,"exp_demand":false,"gold_demand":false,"input_lang":"id","output_lang":"id","server":"US"}
Server response:
{"cost":11342,"gcost":79133,"gold":136114,"exp":0,"stages":[{"stageId":"randomMaterialRune_0","stage":"randomMaterialRune_0","count":"115","items":{"30013":"14","30063":"8","30033":"9","30023":"9","30043":"9","30053":"8","30073":"12","30083":"9","30093":"8","30103":"8","31013":"8","31023":"11"}}],"syntheses":[{"target":"30135","count":"3","materials":{"30084":"3.0","30094":"3.0","30104":"3.0"}},{"target":"30125","count":"1","materials":{"30064":"0.7","30074":"1.3"}},{"target":"30115","count":"3","materials":{"30014":"3.0","30044":"3.0","30054":"3.0"}},{"target":"30104","count":"5","materials":{"30103":"5.0","30013":"10.0","30053":"5.0"}},{"target":"30094","count":"17","materials":{"30093":"16.5","30043":"16.5","30063":"16.5"}},{"target":"30084","count":"3","materials":{"30083":"5.3","30033":"2.6","30073":"2.6"}},{"target":"30074","count":"46","materials":{"30073":"45.6","30023":"45.6","30103":"45.6"}},{"target":"30062","count":"10","materials":{"30061":"29.4"}},{"target":"30063","count":"14","materials":{"30062":"53.0"}},{"target":"30052","count":"9","materials":{"30051":"25.5"}},{"target":"30053","count":"12","materials":{"30052":"47.7"}},{"target":"30054","count":"1","materials":{"30053":"1.8","30023":"0.9","30083":"0.9"}},{"target":"30042","count":"5","materials":{"30041":"12.3"}},{"target":"30043","count":"17","materials":{"30042":"68.2"}},{"target":"30044","count":"5","materials":{"30043":"8.9","30063":"4.5","30033":"4.5"}},{"target":"30032","count":"33","materials":{"30031":"97.4"}},{"target":"30033","count":"35","materials":{"30032":"138.2"}},{"target":"30034","count":"23","materials":{"30033":"44.8","30053":"22.4","30073":"22.4"}},{"target":"30022","count":"26","materials":{"30021":"78.3"}},{"target":"30023","count":"34","materials":{"30022":"136.4"}},{"target":"30024","count":"1","materials":{"30023":"1.1","30043":"0.6","30083":"0.6"}},{"target":"30012","count":"7","materials":{"30011":"20.0"}},{"target":"30013","count":"14","materials":{"30012":"68.7"}},{"target":"30014","count":"3","materials":{"30013":"12.0"}},{"target":"31024","count":"1","materials":{"30063":"1.0","30093":"1.0","31023":"1.0"}},{"target":"31014","count":"12","materials":{"30043":"11.3","31013":"11.3","31023":"11.3"}},{"target":"30145","count":"4","materials":{"31034":"3.4","31014":"6.8","31024":"3.4"}},{"target":"31034","count":"3","materials":{"31033":"4.8","31013":"2.4","31023":"2.4"}},{"target":"31044","count":"3","materials":{"31043":"2.2","31053":"2.2","31013":"2.2"}},{"target":"31054","count":"21","materials":{"31053":"20.2","31033":"20.2","30103":"20.2"}}],"values":[{"level":"5","items":[{"name":"30115","value":"3180.25"},{"name":"30135","value":"1590.12"},{"name":"30155","value":"379.88"},{"name":"30125","value":"0.00000"},{"name":"30145","value":"0.00000"}]},{"level":"4","items":[{"name":"30014","value":"3180.25"},{"name":"30104","value":"1590.12"},{"name":"31064","value":"379.88"},{"name":"30064","value":"0.00001"},{"name":"30034","value":"0.00000"},{"name":"30024","value":"0.00000"},{"name":"30044","value":"0.00000"},{"name":"30054","value":"0.00000"},{"name":"30074","value":"0.00000"},{"name":"30084","value":"0.00000"},{"name":"30094","value":"0.00000"},{"name":"31014","value":"0.00000"},{"name":"31024","value":"0.00000"},{"name":"31034","value":"0.00000"},{"name":"31044","value":"0.00000"},{"name":"31054","value":"0.00000"}]},{"level":"3","items":[{"name":"30013","value":"795.06"},{"name":"31063","value":"379.88"},{"name":"30063","value":"0.00000"},{"name":"30033","value":"0.00000"},{"name":"30023","value":"0.00000"},{"name":"30043","value":"0.00000"},{"name":"30053","value":"0.00000"},{"name":"30073","value":"0.00000"},{"name":"30083","value":"0.00000"},{"name":"30093","value":"0.00000"},{"name":"30103","value":"0.00000"},{"name":"31013","value":"0.00000"},{"name":"31023","value":"0.00000"},{"name":"31033","value":"0.00000"},{"name":"31043","value":"0.00000"},{"name":"31053","value":"0.00000"}]},{"level":"2","items":[{"name":"30012","value":"159.01"},{"name":"30062","value":"0.00000"},{"name":"30032","value":"0.00000"},{"name":"30022","value":"0.00000"},{"name":"30042","value":"0.00000"},{"name":"30052","value":"0.00000"}]},{"level":"1","items":[{"name":"30011","value":"53.00"},{"name":"30061","value":"0.00000"},{"name":"30031","value":"0.00000"},{"name":"30021","value":"0.00000"},{"name":"30041","value":"0.00000"},{"name":"30051","value":"0.00000"}]}]}
Just do: UPDATE properties SET value = ? WHERE key = 'formula'
, where ?
is the following:
[{"id":"3131","name":"基础加固建材","goldCost":800,"costs":[{"id":"3112","name":"碳","rarity":1,"count":2}],"extraOutcome":[{"id":"3112","name":"碳","rarity":1,"count":1,"weight":100}],"totalWeight":100},{"id":"3132","name":"进阶加固建材","goldCost":2400,"costs":[{"id":"3113","name":"碳素","rarity":2,"count":2}],"extraOutcome":[{"id":"3113","name":"碳素","rarity":2,"count":1,"weight":100}],"totalWeight":100},{"id":"3133","name":"高级加固建材","goldCost":7200,"costs":[{"id":"3114","name":"碳素组","rarity":3,"count":2}],"extraOutcome":[{"id":"3114","name":"碳素组","rarity":3,"count":1,"weight":100}],"totalWeight":100},{"id":"3113","name":"碳素","goldCost":0,"costs":[{"id":"3112","name":"碳","rarity":1,"count":3}],"extraOutcome":[{"id":"3113","name":"碳素","rarity":2,"count":1,"weight":100}],"totalWeight":100},{"id":"3114","name":"碳素组","goldCost":0,"costs":[{"id":"3113","name":"碳素","rarity":2,"count":3}],"extraOutcome":[{"id":"3114","name":"碳素组","rarity":3,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":200,"costs":[{"id":"3112","name":"碳","rarity":1,"count":1}],"extraOutcome":[{"id":"3112","name":"碳","rarity":1,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":200,"costs":[{"id":"3113","name":"碳素","rarity":2,"count":1}],"extraOutcome":[{"id":"3113","name":"碳素","rarity":2,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":200,"costs":[{"id":"3114","name":"碳素组","rarity":3,"count":1}],"extraOutcome":[{"id":"3114","name":"碳素组","rarity":3,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":0,"costs":[{"id":"3131","name":"基础加固建材","rarity":1,"count":1}],"extraOutcome":[{"id":"3112","name":"碳","rarity":1,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":0,"costs":[{"id":"3132","name":"进阶加固建材","rarity":2,"count":1}],"extraOutcome":[{"id":"3113","name":"碳素","rarity":2,"count":1,"weight":100}],"totalWeight":100},{"id":"3401","name":"家具零件","goldCost":0,"costs":[{"id":"3133","name":"高级加固建材","rarity":3,"count":1}],"extraOutcome":[{"id":"3114","name":"碳素组","rarity":3,"count":1,"weight":100}],"totalWeight":100},{"id":"30135","name":"D32钢","goldCost":400,"costs":[{"id":"30084","name":"三水锰矿","rarity":3,"count":1},{"id":"30094","name":"五水研磨石","rarity":3,"count":1},{"id":"30104","name":"RMA70-24","rarity":3,"count":1}],"extraOutcome":[{"id":"30014","name":"提纯源岩","rarity":3,"count":1,"weight":84},{"id":"30024","name":"糖聚块","rarity":3,"count":1,"weight":63},{"id":"30034","name":"聚酸酯块","rarity":3,"count":1,"weight":63},{"id":"30044","name":"异铁块","rarity":3,"count":1,"weight":56},{"id":"30054","name":"酮阵列","rarity":3,"count":1,"weight":56},{"id":"30064","name":"改量装置","rarity":3,"count":1,"weight":42},{"id":"30074","name":"白马醇","rarity":3,"count":1,"weight":72},{"id":"30084","name":"三水锰矿","rarity":3,"count":1,"weight":63},{"id":"30094","name":"五水研磨石","rarity":3,"count":1,"weight":63},{"id":"30104","name":"RMA70-24","rarity":3,"count":1,"weight":56},{"id":"31014","name":"聚合凝胶","rarity":3,"count":1,"weight":72},{"id":"31024","name":"炽合金块","rarity":3,"count":1,"weight":63},{"id":"31034","name":"晶体电路","rarity":3,"count":1,"weight":56},{"id":"31044","name":"精炼溶剂","rarity":3,"count":1,"weight":63},{"id":"31054","name":"切削原液","rarity":3,"count":1,"weight":63}],"totalWeight":935},{"id":"30125","name":"双极纳米片","goldCost":400,"costs":[{"id":"30064","name":"改量装置","rarity":3,"count":1},{"id":"30074","name":"白马醇","rarity":3,"count":2}],"extraOutcome":[{"id":"30014","name":"提纯源岩","rarity":3,"count":1,"weight":84},{"id":"30024","name":"糖聚块","rarity":3,"count":1,"weight":63},{"id":"30034","name":"聚酸酯块","rarity":3,"count":1,"weight":63},{"id":"30044","name":"异铁块","rarity":3,"count":1,"weight":56},{"id":"30054","name":"酮阵列","rarity":3,"count":1,"weight":56},{"id":"30064","name":"改量装置","rarity":3,"count":1,"weight":42},{"id":"30074","name":"白马醇","rarity":3,"count":1,"weight":72},{"id":"30084","name":"三水锰矿","rarity":3,"count":1,"weight":63},{"id":"30094","name":"五水研磨石","rarity":3,"count":1,"weight":63},{"id":"30104","name":"RMA70-24","rarity":3,"count":1,"weight":56},{"id":"31014","name":"聚合凝胶","rarity":3,"count":1,"weight":72},{"id":"31024","name":"炽合金块","rarity":3,"count":1,"weight":63},{"id":"31034","name":"晶体电路","rarity":3,"count":1,"weight":56},{"id":"31044","name":"精炼溶剂","rarity":3,"count":1,"weight":63},{"id":"31054","name":"切削原液","rarity":3,"count":1,"weight":63}],"totalWeight":935},{"id":"30115","name":"聚合剂","goldCost":400,"costs":[{"id":"30014","name":"提纯源岩","rarity":3,"count":1},{"id":"30044","name":"异铁块","rarity":3,"count":1},{"id":"30054","name":"酮阵列","rarity":3,"count":1}],"extraOutcome":[{"id":"30014","name":"提纯源岩","rarity":3,"count":1,"weight":84},{"id":"30024","name":"糖聚块","rarity":3,"count":1,"weight":63},{"id":"30034","name":"聚酸酯块","rarity":3,"count":1,"weight":63},{"id":"30044","name":"异铁块","rarity":3,"count":1,"weight":56},{"id":"30054","name":"酮阵列","rarity":3,"count":1,"weight":56},{"id":"30064","name":"改量装置","rarity":3,"count":1,"weight":42},{"id":"30074","name":"白马醇","rarity":3,"count":1,"weight":72},{"id":"30084","name":"三水锰矿","rarity":3,"count":1,"weight":63},{"id":"30094","name":"五水研磨石","rarity":3,"count":1,"weight":63},{"id":"30104","name":"RMA70-24","rarity":3,"count":1,"weight":56},{"id":"31014","name":"聚合凝胶","rarity":3,"count":1,"weight":72},{"id":"31024","name":"炽合金块","rarity":3,"count":1,"weight":63},{"id":"31034","name":"晶体电路","rarity":3,"count":1,"weight":56},{"id":"31044","name":"精炼溶剂","rarity":3,"count":1,"weight":63},{"id":"31054","name":"切削原液","rarity":3,"count":1,"weight":63}],"totalWeight":935},{"id":"30104","name":"RMA70-24","goldCost":300,"costs":[{"id":"30103","name":"RMA70-12","rarity":2,"count":1},{"id":"30013","name":"固源岩组","rarity":2,"count":2},{"id":"30053","name":"酮凝集组","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30094","name":"五水研磨石","goldCost":300,"costs":[{"id":"30093","name":"研磨石","rarity":2,"count":1},{"id":"30043","name":"异铁组","rarity":2,"count":1},{"id":"30063","name":"全新装置","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30084","name":"三水锰矿","goldCost":300,"costs":[{"id":"30083","name":"轻锰矿","rarity":2,"count":2},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1},{"id":"30073","name":"扭转醇","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30074","name":"白马醇","goldCost":300,"costs":[{"id":"30073","name":"扭转醇","rarity":2,"count":1},{"id":"30023","name":"糖组","rarity":2,"count":1},{"id":"30103","name":"RMA70-12","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30062","name":"装置","goldCost":100,"costs":[{"id":"30061","name":"破损装置","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30063","name":"全新装置","goldCost":200,"costs":[{"id":"30062","name":"装置","rarity":1,"count":4}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30064","name":"改量装置","goldCost":300,"costs":[{"id":"30063","name":"全新装置","rarity":2,"count":1},{"id":"30013","name":"固源岩组","rarity":2,"count":2},{"id":"30093","name":"研磨石","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30052","name":"酮凝集","goldCost":100,"costs":[{"id":"30051","name":"双酮","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30053","name":"酮凝集组","goldCost":200,"costs":[{"id":"30052","name":"酮凝集","rarity":1,"count":4}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30054","name":"酮阵列","goldCost":300,"costs":[{"id":"30053","name":"酮凝集组","rarity":2,"count":2},{"id":"30023","name":"糖组","rarity":2,"count":1},{"id":"30083","name":"轻锰矿","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30042","name":"异铁","goldCost":100,"costs":[{"id":"30041","name":"异铁碎片","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30043","name":"异铁组","goldCost":200,"costs":[{"id":"30042","name":"异铁","rarity":1,"count":4}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30044","name":"异铁块","goldCost":300,"costs":[{"id":"30043","name":"异铁组","rarity":2,"count":2},{"id":"30063","name":"全新装置","rarity":2,"count":1},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30032","name":"聚酸酯","goldCost":100,"costs":[{"id":"30031","name":"酯原料","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30033","name":"聚酸酯组","goldCost":200,"costs":[{"id":"30032","name":"聚酸酯","rarity":1,"count":4}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30034","name":"聚酸酯块","goldCost":300,"costs":[{"id":"30033","name":"聚酸酯组","rarity":2,"count":2},{"id":"30053","name":"酮凝集组","rarity":2,"count":1},{"id":"30073","name":"扭转醇","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30022","name":"糖","goldCost":100,"costs":[{"id":"30021","name":"代糖","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30023","name":"糖组","goldCost":200,"costs":[{"id":"30022","name":"糖","rarity":1,"count":4}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30024","name":"糖聚块","goldCost":300,"costs":[{"id":"30023","name":"糖组","rarity":2,"count":2},{"id":"30043","name":"异铁组","rarity":2,"count":1},{"id":"30083","name":"轻锰矿","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30012","name":"固源岩","goldCost":100,"costs":[{"id":"30011","name":"源岩","rarity":0,"count":3}],"extraOutcome":[{"id":"30011","name":"源岩","rarity":0,"count":1,"weight":15},{"id":"30021","name":"代糖","rarity":0,"count":1,"weight":10},{"id":"30031","name":"酯原料","rarity":0,"count":1,"weight":10},{"id":"30041","name":"异铁碎片","rarity":0,"count":1,"weight":8},{"id":"30051","name":"双酮","rarity":0,"count":1,"weight":8},{"id":"30061","name":"破损装置","rarity":0,"count":1,"weight":6}],"totalWeight":57},{"id":"30013","name":"固源岩组","goldCost":200,"costs":[{"id":"30012","name":"固源岩","rarity":1,"count":5}],"extraOutcome":[{"id":"30012","name":"固源岩","rarity":1,"count":1,"weight":15},{"id":"30022","name":"糖","rarity":1,"count":1,"weight":10},{"id":"30032","name":"聚酸酯","rarity":1,"count":1,"weight":10},{"id":"30042","name":"异铁","rarity":1,"count":1,"weight":8},{"id":"30052","name":"酮凝集","rarity":1,"count":1,"weight":8},{"id":"30062","name":"装置","rarity":1,"count":1,"weight":6}],"totalWeight":57},{"id":"30014","name":"提纯源岩","goldCost":300,"costs":[{"id":"30013","name":"固源岩组","rarity":2,"count":4}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"3302","name":"技巧概要·卷2","goldCost":0,"costs":[{"id":"3301","name":"技巧概要·卷1","rarity":1,"count":3}],"extraOutcome":[{"id":"3302","name":"技巧概要·卷2","rarity":2,"count":1,"weight":100}],"totalWeight":100},{"id":"3303","name":"技巧概要·卷3","goldCost":0,"costs":[{"id":"3302","name":"技巧概要·卷2","rarity":2,"count":3}],"extraOutcome":[{"id":"3303","name":"技巧概要·卷3","rarity":3,"count":1,"weight":100}],"totalWeight":100},{"id":"3231","name":"重装芯片","goldCost":0,"costs":[{"id":"3261","name":"医疗芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3261","name":"医疗芯片","goldCost":0,"costs":[{"id":"3231","name":"重装芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3241","name":"狙击芯片","goldCost":0,"costs":[{"id":"3251","name":"术师芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3251","name":"术师芯片","goldCost":0,"costs":[{"id":"3241","name":"狙击芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3211","name":"先锋芯片","goldCost":0,"costs":[{"id":"3271","name":"辅助芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3271","name":"辅助芯片","goldCost":0,"costs":[{"id":"3211","name":"先锋芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3221","name":"近卫芯片","goldCost":0,"costs":[{"id":"3281","name":"特种芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3281","name":"特种芯片","goldCost":0,"costs":[{"id":"3221","name":"近卫芯片","rarity":2,"count":3}],"extraOutcome":[{"id":"3231","name":"重装芯片","rarity":2,"count":1,"weight":100},{"id":"3261","name":"医疗芯片","rarity":2,"count":1,"weight":100},{"id":"3241","name":"狙击芯片","rarity":2,"count":1,"weight":100},{"id":"3251","name":"术师芯片","rarity":2,"count":1,"weight":100},{"id":"3211","name":"先锋芯片","rarity":2,"count":1,"weight":100},{"id":"3271","name":"辅助芯片","rarity":2,"count":1,"weight":100},{"id":"3221","name":"近卫芯片","rarity":2,"count":1,"weight":100},{"id":"3281","name":"特种芯片","rarity":2,"count":1,"weight":100}],"totalWeight":800},{"id":"3232","name":"重装芯片组","goldCost":0,"costs":[{"id":"3262","name":"医疗芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3262","name":"医疗芯片组","goldCost":0,"costs":[{"id":"3232","name":"重装芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3242","name":"狙击芯片组","goldCost":0,"costs":[{"id":"3252","name":"术师芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3252","name":"术师芯片组","goldCost":0,"costs":[{"id":"3242","name":"狙击芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3212","name":"先锋芯片组","goldCost":0,"costs":[{"id":"3272","name":"辅助芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3272","name":"辅助芯片组","goldCost":0,"costs":[{"id":"3212","name":"先锋芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3222","name":"近卫芯片组","goldCost":0,"costs":[{"id":"3282","name":"特种芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"3282","name":"特种芯片组","goldCost":0,"costs":[{"id":"3222","name":"近卫芯片组","rarity":3,"count":3}],"extraOutcome":[{"id":"3232","name":"重装芯片组","rarity":3,"count":1,"weight":100},{"id":"3262","name":"医疗芯片组","rarity":3,"count":1,"weight":100},{"id":"3242","name":"狙击芯片组","rarity":3,"count":1,"weight":100},{"id":"3252","name":"术师芯片组","rarity":3,"count":1,"weight":100},{"id":"3212","name":"先锋芯片组","rarity":3,"count":1,"weight":100},{"id":"3272","name":"辅助芯片组","rarity":3,"count":1,"weight":100},{"id":"3222","name":"近卫芯片组","rarity":3,"count":1,"weight":100},{"id":"3282","name":"特种芯片组","rarity":3,"count":1,"weight":100}],"totalWeight":800},{"id":"31024","name":"炽合金块","goldCost":300,"costs":[{"id":"30063","name":"全新装置","rarity":2,"count":1},{"id":"30093","name":"研磨石","rarity":2,"count":1},{"id":"31023","name":"炽合金","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"31014","name":"聚合凝胶","goldCost":300,"costs":[{"id":"30043","name":"异铁组","rarity":2,"count":1},{"id":"31013","name":"凝胶","rarity":2,"count":1},{"id":"31023","name":"炽合金","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"30145","name":"晶体电子单元","goldCost":400,"costs":[{"id":"31034","name":"晶体电路","rarity":3,"count":1},{"id":"31014","name":"聚合凝胶","rarity":3,"count":2},{"id":"31024","name":"炽合金块","rarity":3,"count":1}],"extraOutcome":[{"id":"30014","name":"提纯源岩","rarity":3,"count":1,"weight":84},{"id":"30024","name":"糖聚块","rarity":3,"count":1,"weight":63},{"id":"30034","name":"聚酸酯块","rarity":3,"count":1,"weight":63},{"id":"30044","name":"异铁块","rarity":3,"count":1,"weight":56},{"id":"30054","name":"酮阵列","rarity":3,"count":1,"weight":56},{"id":"30064","name":"改量装置","rarity":3,"count":1,"weight":42},{"id":"30074","name":"白马醇","rarity":3,"count":1,"weight":72},{"id":"30084","name":"三水锰矿","rarity":3,"count":1,"weight":63},{"id":"30094","name":"五水研磨石","rarity":3,"count":1,"weight":63},{"id":"30104","name":"RMA70-24","rarity":3,"count":1,"weight":56},{"id":"31014","name":"聚合凝胶","rarity":3,"count":1,"weight":72},{"id":"31024","name":"炽合金块","rarity":3,"count":1,"weight":63},{"id":"31034","name":"晶体电路","rarity":3,"count":1,"weight":56},{"id":"31044","name":"精炼溶剂","rarity":3,"count":1,"weight":63},{"id":"31054","name":"切削原液","rarity":3,"count":1,"weight":63}],"totalWeight":935},{"id":"31034","name":"晶体电路","goldCost":300,"costs":[{"id":"31033","name":"晶体元件","rarity":2,"count":2},{"id":"31013","name":"凝胶","rarity":2,"count":1},{"id":"31023","name":"炽合金","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"31044","name":"精炼溶剂","goldCost":300,"costs":[{"id":"31043","name":"半自然溶剂","rarity":2,"count":1},{"id":"31053","name":"化合切削液","rarity":2,"count":1},{"id":"31013","name":"凝胶","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609},{"id":"31054","name":"切削原液","goldCost":300,"costs":[{"id":"31053","name":"化合切削液","rarity":2,"count":1},{"id":"31033","name":"晶体元件","rarity":2,"count":1},{"id":"30103","name":"RMA70-12","rarity":2,"count":1}],"extraOutcome":[{"id":"30013","name":"固源岩组","rarity":2,"count":1,"weight":60},{"id":"30023","name":"糖组","rarity":2,"count":1,"weight":50},{"id":"30033","name":"聚酸酯组","rarity":2,"count":1,"weight":50},{"id":"30043","name":"异铁组","rarity":2,"count":1,"weight":40},{"id":"30053","name":"酮凝集组","rarity":2,"count":1,"weight":40},{"id":"30063","name":"全新装置","rarity":2,"count":1,"weight":30},{"id":"30073","name":"扭转醇","rarity":2,"count":1,"weight":45},{"id":"30083","name":"轻锰矿","rarity":2,"count":1,"weight":40},{"id":"30093","name":"研磨石","rarity":2,"count":1,"weight":36},{"id":"30103","name":"RMA70-12","rarity":2,"count":1,"weight":30},{"id":"31013","name":"凝胶","rarity":2,"count":1,"weight":36},{"id":"31023","name":"炽合金","rarity":2,"count":1,"weight":40},{"id":"31033","name":"晶体元件","rarity":2,"count":1,"weight":40},{"id":"31043","name":"半自然溶剂","rarity":2,"count":1,"weight":36},{"id":"31053","name":"化合切削液","rarity":2,"count":1,"weight":36}],"totalWeight":609}]
It is generated by the following script, with building_data.json
and item_table.json
.
const fs = require("fs");
const building_data_json = JSON.parse(fs.readFileSync("./building_data.json", "utf8"));
const item_table_json = JSON.parse(fs.readFileSync("./item_table.json", "utf8"));
const items = item_table_json.items;
const rawFormulas = building_data_json.workshopFormulas;
const newFormulas = Object.entries(rawFormulas).map(([, formula]) => {
let costs = formula.costs.map((costItem) => ({
id: costItem.id,
name: items[costItem.id].name,
rarity: items[costItem.id].rarity,
count: costItem.count,
}));
let extraOutcome = formula.extraOutcomeGroup.map((extraOutcomeItem) => ({
id: extraOutcomeItem.itemId,
name: items[extraOutcomeItem.itemId].name,
rarity: items[extraOutcomeItem.itemId].rarity,
count: extraOutcomeItem.itemCount,
weight: extraOutcomeItem.weight,
}));
let totalWeight = extraOutcome.map((extraOutcomeItem) => extraOutcomeItem.weight).reduce((a, b) => a + b, 0);
let newFormula = {
id: formula.itemId,
name: items[formula.itemId].name,
goldCost: formula.goldCost,
costs: costs,
extraOutcome: extraOutcome,
totalWeight: totalWeight,
};
return newFormula;
});
fs.writeFileSync("./formulas.json", JSON.stringify(newFormulas, null, null));
Add instructions and briefs on how to contribute to this project so new contributors know where to start.
This is to consider that third party tools might not and nor we should expect to, have a consistent record of all items not presenting in Penguin Statistics DB but is presenting in the data file of Arknights. Such items shall be simply stripped away and the original, "recognizable" items shall be kept.
In internal/util/validator.go
This is the cronjob implementation part of #46
Currently the overall Cache TTL on average, existing on the backend is too long. As the architectural performance now could easily handle queries like those, we could and should shorten cache TTLs to about 15
~60
minutes on a majority of them to mitigate potential dirty cache issues occurred in #62.
It's better to handle it when preprocessing the drop report instead of doing it in the worker.
Expiry can be 1 hrs or some? TBD.
This project uses different forms of noun. e.g., controllers
and utils
are plural, but service
is singular. I suggest renaming them all into singular form, because Golang standard library uses singular noun as its package names (e.g.: encoding/...
instead of encodings/...
).
You can find more discussions at:
Also, I suggest following the naming guidelines here and here. Meaning that generic packages such as utils
should be broken up. However I understand it's a hard work to re-organize the code, especially that this project is migrated from an existing Java backend. How do you think?
Due to various external or internal reasons, sometimes we need to do report invalidations or changes based on the issue lays on the dataset, for a more easy-to-interpret dataset there has. However, those changes are currently not transparent to the external users and even sometimes causing problems for ourselves to keep track of exact records in which have been edited. Therefore there's a proposed transparency log of changes made to the dataset, in an effort of keeping the track and to the community.
The log consists of several features:
DropInfo
defined in a specific stage, the report will be automatically flagged as non-reliable, effectively invalidating the record. Other than that, there's no other on-going continuous invalidations.Kubernetes provides a great orchestration for relatively fractured services, just like what Penguin Stats is currently in. We've got a huge wide range of services to monitor status with, and to scale some of them when needed, e.g. Planner when there's a high demand on farm planning.
We have implemented several stages to move forward to K8S, and eventually running all of our services on it, providing a more structured and organized orchestration on our services.
This is to just simplify and streamline the whole maintenance progress.
This shall purge both the CloudFlare cache and as well the UPYun CDN cache.
This is to distinguish different types of validation error on reliability notations.
backend-next
: Website Next Backendfrontend-v2
: Website v2 Frontendwidget-backend
: Widget Backend
widget-docs
: Widget Docswidget-frontend
: Widget Frontendplanner
: Planner Backendprobe
: Probe Service
prometheus
: Prometheus DBgrafana
: Grafana DashboardThis issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.
These updates are currently rate-limited. Click on a checkbox below to force their creation now.
github.com/aws/aws-sdk-go-v2
, github.com/aws/aws-sdk-go-v2/config
, github.com/aws/aws-sdk-go-v2/credentials
, github.com/aws/aws-sdk-go-v2/service/s3
)go.opentelemetry.io/otel
, go.opentelemetry.io/otel/exporters/jaeger
, go.opentelemetry.io/otel/exporters/otlp/otlptrace
, go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
, go.opentelemetry.io/otel/exporters/stdout/stdouttrace
, go.opentelemetry.io/otel/sdk
, go.opentelemetry.io/otel/trace
)These updates have all been created already. Click a checkbox below to force a retry/rebase of any.
Dockerfile
golang 1.21.6-alpine
.github/workflows/build-check.yml
actions/checkout v3
.github/workflows/build-release.yml
actions/checkout v3
.github/workflows/codeql.yml
actions/checkout v3
actions/cache v3
github/codeql-action v2
github/codeql-action v2
.github/workflows/pr-auto-upsert.yml
actions/checkout v3
actions/github-script v6
.github/workflows/release-dispatcher.yml
actions/checkout v3
actions/github-script v6
go.mod
go 1.19
exusiai.dev/gommon v0.0.9
github.com/ahmetb/go-linq/v3 v3.2.0
github.com/ansrivas/fiberprometheus/v2 v2.6.1
github.com/antonmedv/expr v1.12.7
github.com/avast/retry-go/v4 v4.3.4
github.com/aws/aws-sdk-go-v2 v1.23.5
github.com/aws/aws-sdk-go-v2/config v1.25.11
github.com/aws/aws-sdk-go-v2/credentials v1.16.9
github.com/aws/aws-sdk-go-v2/service/s3 v1.47.2
github.com/aws/smithy-go v1.18.1
github.com/davecgh/go-spew v1.1.1
github.com/dchest/uniuri v1.2.0
github.com/felixge/fgprof v0.9.3
github.com/gabstv/go-bsdiff v1.0.5
github.com/getsentry/sentry-go v0.22.0
github.com/go-playground/locales v0.14.1
github.com/go-playground/universal-translator v0.18.1
github.com/go-playground/validator/v10 v10.16.0
github.com/go-redsync/redsync/v4 v4.9.4
github.com/goccy/go-json v0.10.2
github.com/gofiber/contrib/fibersentry v1.0.4
github.com/gofiber/contrib/otelfiber v1.0.10
github.com/gofiber/fiber/v2 v2.50.0
github.com/gofiber/helmet/v2 v2.2.26
github.com/gofiber/swagger v0.1.14
github.com/jinzhu/copier v0.3.5
github.com/joho/godotenv v1.5.1
github.com/kelseyhightower/envconfig v1.4.0
github.com/nats-io/nats.go v1.24.0
github.com/oklog/ulid/v2 v2.1.0
github.com/oschwald/geoip2-golang v1.9.0
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.16.0
github.com/redis/go-redis/v9 v9.0.5
github.com/rs/xid v1.5.0
github.com/rs/zerolog v1.31.0
github.com/samber/lo v1.38.1
github.com/stretchr/testify v1.8.4
github.com/swaggo/swag v1.16.2
github.com/tidwall/gjson v1.16.0
github.com/tidwall/sjson v1.2.5
github.com/uptrace/bun v1.1.14
github.com/uptrace/bun/dialect/pgdialect v1.1.14
github.com/uptrace/bun/driver/pgdriver v1.1.14
github.com/uptrace/bun/extra/bundebug v1.1.14
github.com/uptrace/bun/extra/bunotel v1.1.14
github.com/urfave/cli/v2 v2.25.7
github.com/vmihailenco/msgpack/v5 v5.3.5
github.com/zeebo/xxh3 v1.0.2
go.opentelemetry.io/otel v1.16.0
go.opentelemetry.io/otel/exporters/jaeger v1.16.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0
go.opentelemetry.io/otel/sdk v1.16.0
go.uber.org/fx v1.19.2
golang.org/x/mod v0.14.0
golang.org/x/sync v0.5.0
golang.org/x/text v0.14.0
google.golang.org/protobuf v1.30.0
gopkg.in/DataDog/dd-trace-go.v1 v1.48.0
gopkg.in/guregu/null.v3 v3.5.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
github.com/patrickmn/go-cache v2.1.0+incompatible
github.com/valyala/fasthttp v1.50.0
go.opentelemetry.io/otel/trace v1.16.0
We cannot know the real σ (Standard Deviation), because the standard deviation we get is from the data we get from users. Then we have to consider df (Degree of Freedom) to the test for σ-hat. T-test could make the result more accurate because it make df into consideration while z-test only exist when df tends to infinity or σ is ideally known.
Thus, the adoption of T-test is better then Z-test.
Currently there's only several simple and, if not naive, approaches on report validation. Previously we've proposed Z-test mechanism, and implemented on the previous backend. However, due to the MongoDB evaluation bottleneck existing on the previous backend, we unfortunately have to disable such feature due to high performance drawbacks.
The backend-next project now has the capability on both flexibility and performance extensibility to allow us relaunch such mechanism on checking the reports.
Moreover, currently the DropInfo
section is somewhat artificially decided and might not be suitable for the first several hundred reports, due to the nature that we can't predict what is actually the finite set of drop possibilities, so there previously have existed several issues related to DropInfo
not being applied properly at the first, causing potentially deviations for the dataset. Although we've been fixing those actively manually, those are time-consuming and as well not an optimal solution at all. Therefore, there could also be a mechanism where DropInfo
itself could adopt continuously with the growth of the report dataset. However the implementation detail of the adoption is still a huge topic to discuss.
Just to note down here that, those statistics-based tests are all pretty susceptible to attacks where the attacker could aim to report several hundred or about a thousand of false reports after the very first moments the stage opens, causing the dataset to converge to a skewed result. Any results afterwards would consider invalid and therefore rejecting the true reports. Such attack could be mitigated by either randomly picking reports across different accounts, IPs, and carefully designing the threshold when Z-test kicks in, to minimize the effect such attack could bring.
Move services out of the obsolete AWS EC2.
penguin-production
: Serves as the main server. Containing the PS website frontend, website backend, planner frontend, planner backend, and the v1 frontend.penguin-meta
: Monitors server status and act as a server containing side-services. Containing the probe service, grafana, prometheus.backend-next
: Website Next Backendfrontend-v2
: Website v2 Frontendwidget-backend
: Widget Backend
widget-docs
: Widget Docswidget-frontend
: Widget Frontendplanner
: Planner Backendprobe
: Probe Service
prometheus
: Prometheus DBgrafana
: Grafana DashboardIn https://penguin-stats.io/PenguinStats/api/v2/zones
. The word "intermezzi" is the plural form of "intermezzo".
The latest activity in CN, opened last day (2022-05-01 16PM GMT+8) have empty DropInfos served on API for a whole 5 hours until a member @FlandiaYingman found such issue and informed us last night (2022-05-01 21PM GMT+8) and fixed in several minutes by manually purging the server-side cache. This has caused reports only starting from after 21PM GMT+8 and have caused some of the reports being flagged due to DropInfo mismatch.
In the future we should've been able to mitigate this by properly purging the cache after an update via Admin API have been performed (#58), but also we could add an additional end-to-end check via the real API on the soracli
, so that consistency of API response is guaranteed. Further, this logic could've been abstracted and added to the server side too, creating autonomous monitoring tasks to continuously guard the service from serving dirty caches anymore in the future.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.