Mixin: A Trait & Mixin Framework for Java using ASM

Mixin is a trait/mixin framework for Java using ASM and hooking into the runtime classloading process via a set of pluggable built-in or user-provided services. Built-in services currently support Mojang's LegacyLauncher system, though this is deprecated in favour of ModLauncher by cpw, which has greater extensibility and has support for Java 8 and later.

Documentation

The main documentation for Mixin can be found in the Wiki.

Additional documentation for individual features and annotations can be found in the extensive Javadoc. For additional help use the channel #mixin on the Sponge Discord Server.

Binaries

Mixin binaries are available via Jenkins and are published to the following maven repositories:

Tooling

For handling obfuscation tasks, Mixin provides an Annotation Processor which works at compile time to generate obfuscation mappings for your toolchain to apply. If using Gradle 5 or later, annotation processors are no longer automatically loaded from compile configurations and must be specified explicitly via annotationProcessor configurations. For this purpose, Mixin provides "fat jar" artefacts containing all required dependencies via the :processor classifier. For example if your build uses the dependency org.spongepowered:mixin:1.2.3 then your annotationProcessor configuration should specify dependency org.spongepowered:mixin:1.2.3:processor.

If you are using Mixin in a Minecraft Forge project then the MixinGradle plugin can be used to simplify the configuration of the Mixin Annotation Processor. It provides a simple syntax for configuring the Mixin AP for your project, see the MixinGradle README for how to configure MixinGradle.

Integration with Eclipse

When developing using Mixin, you can use the Mixin Annotation Processor within Eclipse to provide context-sensitive errors and warnings to help you more easily troubleshoot your mixins. To do so:

  1. Run the gradle build command to generate the mixin jar
  2. Open the properties of your eclipse project and navigate to Java Compiler -> Annotation Processing -> Factory Path
  3. Check the Enable project specific settings checkbox
  4. Click the Add External JARs button and select the generated mixin jar with the suffix -processor (hint: it should be in Mixin/build/libs)
  5. Navigate up one level to Java Compiler -> Annotation Processing
  6. Check the Enable project specific settings checkbox
  7. Check the Enable annotation processing checkbox
  8. Click the New... button next to the Processor options box
  • Set Key to reobfSrgFile
  • Set Value to the fully-qualified path to the mcp-srg.srg file (the location of the mapping file varies by platform, if you are unsure where to find it please follow the discord link below).

9.   Click OK to apply the changes

Integration with IntelliJ IDEA

Enhanced functionality for working with Mixin in IntelliJ IDEA is available via the Minecraft Development for IntelliJ IDEA plugin developed by DemonWav.

Version History

Specifying the minVersion property in your configurations is extrememly important. The following version history can be used to determine when features were introduced (and sometimes when major bugs are squashed) in order to help you determine which minVersion you should specify.

VersionDateFeatures / Changes
0.8.3February 2021
  • Added dynamic target selector support and @Desc target selector
  • Added pattern target selector
  • Added more expressive quantifier support to explicit target selectors
  • Facelift and overall improvements to javadoc
0.8.1 (0.8.2)September 2020
  • Hotfix for supporting ModLauncher 7.0
  • Fix critical issue with resolving obfuscated members in inherited interfaces
  • Updated to ASM 7.2
0.8January 2020
  • Updated to ASM 6.2
  • Support for ModLauncher
  • Added recognition for Java 9 and 10
  • Support for ForgeGradle 3+ tsrg obfuscation tables
  • Configs can now inherit from other configs
  • @Invoke can now be used to expose constructors
  • Dramatically improved context reporting of unexpected applicator and preprocessor exceptions, making it easier to diagnose when an agent chokes on a specific opcode
  • Bug fixes for
    • Calling members of accessor mixins from inside mixin code
    • Incorrect handling of spaces in explicit target declarations
    • Unexpected behaviour when attempting to redirect a ctor
    • Properly detect incompatible accessor overlap and ignore valid ones (don't warn)
    • Interface static accessors now correctly conform target if interface is classloaded before target class
    • Staticness mismatch for accessor correctly detected and reported instead of causing crash
    • Fixed generator and injector errors relating to double-word operands on the stack needing DUP2
    • Fixed issue in LVT generator folded in from FabricMC
    • Fail-fast when a final method is accidentally hidden by a mixin
    • Fix the appearance of stray CallbackInfo instances in local capture injector LVTs
  • Apache Commons-IO Dependency removed
  • Renamed shaded ASM removed
  • Improved resolution of local variables for local variable capture injections
  • @Coerce on callback injectors and redirects can now resolve super interfaces including mixed-in interfaces
0.7.11July 2018
  • Fixes for 3 minor bugs: handling of maxShiftBy fixed, improved BeforeInvoke permissive search, disable generic signature merging unless decompiler is active.
0.7.10June 2018
  • Log an error when a mixin class is subject to classloader restrictions
0.7.9April 2018
  • Allow certain injectors to target mixin methods.
0.7.8April 2018
  • Bug fixes for member declaration validation, non-wild ctor redirects, and internal errors in Args subclass generator
0.7.7March 2018
  • Fixes for handling of log message triggers for INIT phase and error when running with unexpected logger configurations
  • Add warnings for invalid slice points and narrowing conversion in ModifyConstant handlers
0.7.6November 2017
  • Fix inheritance for string system properties
0.7.5October 2017
  • Add support for @Coerce on redirect injectors.
0.7.4September 2017
  • Added @Dynamic annotation for decorating mixin elements with dynamically-injected targets.
0.7.3August 2017
  • Internal changes to provide for support modlauncher and java 9
0.7.2August 2017
  • Add profiler for inspecting mixin performance.
0.7.1August 2017
  • Fixes and improvements to the Mixin AP, fixing handling of multi- dimensional arrays and resolving methods in superclasses of derived types of obfuscated classes
  • Add runtime refmap remapping to support using deobfCompile dependencies with different mapping versions.
0.7July 2017
  • All official binaries are now signed
  • Upgrade to ASM 5.2
  • Add support for inner classes in Mixins
  • Injectors can now have multiple explicit targets
  • @At annotations can now have their own id
  • Add support for using @Overwrite on non-obfuscated methods as a way of verifying that an overwrite target exists
  • Improve support for synthetic bridges, detect conflicting bridge methods
  • Detect and warn of excessive At.Shift.BY values
  • ModifyConstant can now support multiple slices
  • Add allow to injectors to detect over-injection
0.6.15July 2017
  • Add support for multiple constants in ModifyConstant
  • Add CONSTANT as general-purpose injection point
  • Add support for redirecting array length access in field redirectors
0.6.14July 2017
  • Add support for using @Coerce on reference types in Callback Injectors to support derived types.
0.6.13July 2017
  • Add support for conforming visibility of overwrite methods to match target class. Fixes issues where a target class method has been modified by an Access Transformer to have higher visibility
0.6.12June 2017
  • Add slice argument to @ModifyConstant
  • Add @ModifyArgs injector which can change multiple method call arguments with a single handler.
0.6.11June 2017
  • Fix handling of @Unique when the same unique method exists in more than one mixin targetting the same class
  • Fix handling of merged lambdas so that lambdas from mixins are applied correctly when lambdas already exist in the target class (both in the original class and when applied by earlier mixins)
0.6.10May 2017
  • (0.6.9) Minor fix to remove dependence on deprecated helper
  • Respect remap on Mixin for contained @At
  • Require redirectors which occur before call to superctor to be static
0.6.8February 2017
  • Allow @ModifyConstant to hook implicit zero in comparisons
0.6.7January 2017
  • Add support for @Redirect on array access
0.6.6January 2017
  • Allow static methods in accessor mixins in Java 8 and above
0.6.5January 2017
  • Add support for injector slices
0.6.4January 2017
  • Allow descriptors on NEW injection points
0.6.3December 2016
  • SourceDebugExtension support
0.6.2December 2016
  • Add support for @Pseudo (virtual target) mixins
0.6.1November 2016
  • Process soft-implements annotations in the AP
0.6October 2016
  • Accessor Mixin support
0.5.17October 2016
  • Allow @Redirect injectors to target NEW opcodes for constructor redirection
0.5.16October 2016
  • Annotation Processor improvements. Support shadows and overrides in multi-target mixins
  • Support pluggable obfuscation environments in AP
0.5.14September 2016
  • Add async decompilation support
0.5.13September 2016
  • Add alternative strategy for injecting field initialisers
0.5.10June 2016
  • Support @Unique on fields
0.5.9June 2016
  • Hard fail if a required mixin target was already transformed
0.5.8June 2016
  • Support constraints on injectors
0.5.7June 2016
  • Add @Unique annotation
0.5.6May 2016
  • Environment changes, support environment via agents
0.5.5April 2016
  • Add @ModifyConstant injector
  • Add @Debug annotation
  • Allow static @ModifyArg handlers in instance methods
0.5.4April 2016
  • Error handlers also receive mixin prepare errors
0.5.3February 2016
  • Conform injectors
  • Enable hotswapper automatically if agent is active
  • Fix multiple issues with generics in Annotation Processors
0.5.2February 2016
  • Support ID on injectors
  • Support priority for injectors
0.5.1February 2016
  • Overhaul injectors, injectors from all mixins now scan before any injectors are actually processed. Makes injectors more deterministic.
0.4.19February 2016
  • Add support for @Redirect on fields as well as methods
0.4.18February 2016
  • Add @ModifyLocal injector
0.4.17January 2016
  • Support ExtraSRGs in Annotation Processor
  • Include constructors in reference map
  • Add @Mutable annotation to suppress @Final warnings
0.4.15January 2016
  • Include soft targets in refmap
0.4.14January 2016
  • Add support for interface mixins
0.4.13January 2016
  • Add @Final annotation
0.4.11January 2016
  • Add support for injector grouping and config-wide require value
0.4.10December 2015
  • Runtime remapping support using RemapperChain
  • Ignore class transformers decorated with @Resource
  • Support @reason and @author validation on overwrites
0.4.8December 2015
  • Annotation Processor improved to support MixinGradle
  • Support multiple target obfuscation environments in refmaps
0.4.6September 2015
  • Add INIT phase for handling early FML startup
  • Add support for lambdas in mixins
  • Add support for hot code replacement in mixins
  • Improve Java 8 feature support
0.4.4July 2015
  • Add constraints for overwrites
0.4.3May 2015
  • Add INVOKE_ASSIGN injection point
  • Support injector callbacks without args
  • Support coercion of covariant parameter types in callbacks
  • Support truncating local-capturing injector handlers
  • Runtime decompilation of exported classes using fernflower
  • Add export filter
0.4May 2015
  • Shade relocated ASM package and use throughout
0.3.2April 2015
  • Error handler support
0.3.1April 2015
  • Annotation Merging
  • Allow Overwrite methods to be aliased
0.3March 2015
  • Implemented Environments
  • Intrinsic method support
  • Enabled local variable capture
  • Alias support
0.2March 2015
  • Added supermixin support (mixins inheriting from other mixins)
0.1January 2015
  • Basic Mixin Support
  • Basic Injector Support
  • Annotation Processor

Download Details:
Author: SpongePowered
Source Code: https://github.com/SpongePowered/Mixin
License: MIT license

#framework  #java 

What is GEEK

Buddha Community

Mixin: A Trait & Mixin Framework for Java using ASM
Tyrique  Littel

Tyrique Littel

1600135200

How to Install OpenJDK 11 on CentOS 8

What is OpenJDK?

OpenJDk or Open Java Development Kit is a free, open-source framework of the Java Platform, Standard Edition (or Java SE). It contains the virtual machine, the Java Class Library, and the Java compiler. The difference between the Oracle OpenJDK and Oracle JDK is that OpenJDK is a source code reference point for the open-source model. Simultaneously, the Oracle JDK is a continuation or advanced model of the OpenJDK, which is not open source and requires a license to use.

In this article, we will be installing OpenJDK on Centos 8.

#tutorials #alternatives #centos #centos 8 #configuration #dnf #frameworks #java #java development kit #java ee #java environment variables #java framework #java jdk #java jre #java platform #java sdk #java se #jdk #jre #open java development kit #open source #openjdk #openjdk 11 #openjdk 8 #openjdk runtime environment

Chloe  Butler

Chloe Butler

1667425440

Pdf2gerb: Perl Script Converts PDF Files to Gerber format

pdf2gerb

Perl script converts PDF files to Gerber format

Pdf2Gerb generates Gerber 274X photoplotting and Excellon drill files from PDFs of a PCB. Up to three PDFs are used: the top copper layer, the bottom copper layer (for 2-sided PCBs), and an optional silk screen layer. The PDFs can be created directly from any PDF drawing software, or a PDF print driver can be used to capture the Print output if the drawing software does not directly support output to PDF.

The general workflow is as follows:

  1. Design the PCB using your favorite CAD or drawing software.
  2. Print the top and bottom copper and top silk screen layers to a PDF file.
  3. Run Pdf2Gerb on the PDFs to create Gerber and Excellon files.
  4. Use a Gerber viewer to double-check the output against the original PCB design.
  5. Make adjustments as needed.
  6. Submit the files to a PCB manufacturer.

Please note that Pdf2Gerb does NOT perform DRC (Design Rule Checks), as these will vary according to individual PCB manufacturer conventions and capabilities. Also note that Pdf2Gerb is not perfect, so the output files must always be checked before submitting them. As of version 1.6, Pdf2Gerb supports most PCB elements, such as round and square pads, round holes, traces, SMD pads, ground planes, no-fill areas, and panelization. However, because it interprets the graphical output of a Print function, there are limitations in what it can recognize (or there may be bugs).

See docs/Pdf2Gerb.pdf for install/setup, config, usage, and other info.


pdf2gerb_cfg.pm

#Pdf2Gerb config settings:
#Put this file in same folder/directory as pdf2gerb.pl itself (global settings),
#or copy to another folder/directory with PDFs if you want PCB-specific settings.
#There is only one user of this file, so we don't need a custom package or namespace.
#NOTE: all constants defined in here will be added to main namespace.
#package pdf2gerb_cfg;

use strict; #trap undef vars (easier debug)
use warnings; #other useful info (easier debug)


##############################################################################################
#configurable settings:
#change values here instead of in main pfg2gerb.pl file

use constant WANT_COLORS => ($^O !~ m/Win/); #ANSI colors no worky on Windows? this must be set < first DebugPrint() call

#just a little warning; set realistic expectations:
#DebugPrint("${\(CYAN)}Pdf2Gerb.pl ${\(VERSION)}, $^O O/S\n${\(YELLOW)}${\(BOLD)}${\(ITALIC)}This is EXPERIMENTAL software.  \nGerber files MAY CONTAIN ERRORS.  Please CHECK them before fabrication!${\(RESET)}", 0); #if WANT_DEBUG

use constant METRIC => FALSE; #set to TRUE for metric units (only affect final numbers in output files, not internal arithmetic)
use constant APERTURE_LIMIT => 0; #34; #max #apertures to use; generate warnings if too many apertures are used (0 to not check)
use constant DRILL_FMT => '2.4'; #'2.3'; #'2.4' is the default for PCB fab; change to '2.3' for CNC

use constant WANT_DEBUG => 0; #10; #level of debug wanted; higher == more, lower == less, 0 == none
use constant GERBER_DEBUG => 0; #level of debug to include in Gerber file; DON'T USE FOR FABRICATION
use constant WANT_STREAMS => FALSE; #TRUE; #save decompressed streams to files (for debug)
use constant WANT_ALLINPUT => FALSE; #TRUE; #save entire input stream (for debug ONLY)

#DebugPrint(sprintf("${\(CYAN)}DEBUG: stdout %d, gerber %d, want streams? %d, all input? %d, O/S: $^O, Perl: $]${\(RESET)}\n", WANT_DEBUG, GERBER_DEBUG, WANT_STREAMS, WANT_ALLINPUT), 1);
#DebugPrint(sprintf("max int = %d, min int = %d\n", MAXINT, MININT), 1); 

#define standard trace and pad sizes to reduce scaling or PDF rendering errors:
#This avoids weird aperture settings and replaces them with more standardized values.
#(I'm not sure how photoplotters handle strange sizes).
#Fewer choices here gives more accurate mapping in the final Gerber files.
#units are in inches
use constant TOOL_SIZES => #add more as desired
(
#round or square pads (> 0) and drills (< 0):
    .010, -.001,  #tiny pads for SMD; dummy drill size (too small for practical use, but needed so StandardTool will use this entry)
    .031, -.014,  #used for vias
    .041, -.020,  #smallest non-filled plated hole
    .051, -.025,
    .056, -.029,  #useful for IC pins
    .070, -.033,
    .075, -.040,  #heavier leads
#    .090, -.043,  #NOTE: 600 dpi is not high enough resolution to reliably distinguish between .043" and .046", so choose 1 of the 2 here
    .100, -.046,
    .115, -.052,
    .130, -.061,
    .140, -.067,
    .150, -.079,
    .175, -.088,
    .190, -.093,
    .200, -.100,
    .220, -.110,
    .160, -.125,  #useful for mounting holes
#some additional pad sizes without holes (repeat a previous hole size if you just want the pad size):
    .090, -.040,  #want a .090 pad option, but use dummy hole size
    .065, -.040, #.065 x .065 rect pad
    .035, -.040, #.035 x .065 rect pad
#traces:
    .001,  #too thin for real traces; use only for board outlines
    .006,  #minimum real trace width; mainly used for text
    .008,  #mainly used for mid-sized text, not traces
    .010,  #minimum recommended trace width for low-current signals
    .012,
    .015,  #moderate low-voltage current
    .020,  #heavier trace for power, ground (even if a lighter one is adequate)
    .025,
    .030,  #heavy-current traces; be careful with these ones!
    .040,
    .050,
    .060,
    .080,
    .100,
    .120,
);
#Areas larger than the values below will be filled with parallel lines:
#This cuts down on the number of aperture sizes used.
#Set to 0 to always use an aperture or drill, regardless of size.
use constant { MAX_APERTURE => max((TOOL_SIZES)) + .004, MAX_DRILL => -min((TOOL_SIZES)) + .004 }; #max aperture and drill sizes (plus a little tolerance)
#DebugPrint(sprintf("using %d standard tool sizes: %s, max aper %.3f, max drill %.3f\n", scalar((TOOL_SIZES)), join(", ", (TOOL_SIZES)), MAX_APERTURE, MAX_DRILL), 1);

#NOTE: Compare the PDF to the original CAD file to check the accuracy of the PDF rendering and parsing!
#for example, the CAD software I used generated the following circles for holes:
#CAD hole size:   parsed PDF diameter:      error:
#  .014                .016                +.002
#  .020                .02267              +.00267
#  .025                .026                +.001
#  .029                .03167              +.00267
#  .033                .036                +.003
#  .040                .04267              +.00267
#This was usually ~ .002" - .003" too big compared to the hole as displayed in the CAD software.
#To compensate for PDF rendering errors (either during CAD Print function or PDF parsing logic), adjust the values below as needed.
#units are pixels; for example, a value of 2.4 at 600 dpi = .0004 inch, 2 at 600 dpi = .0033"
use constant
{
    HOLE_ADJUST => -0.004 * 600, #-2.6, #holes seemed to be slightly oversized (by .002" - .004"), so shrink them a little
    RNDPAD_ADJUST => -0.003 * 600, #-2, #-2.4, #round pads seemed to be slightly oversized, so shrink them a little
    SQRPAD_ADJUST => +0.001 * 600, #+.5, #square pads are sometimes too small by .00067, so bump them up a little
    RECTPAD_ADJUST => 0, #(pixels) rectangular pads seem to be okay? (not tested much)
    TRACE_ADJUST => 0, #(pixels) traces seemed to be okay?
    REDUCE_TOLERANCE => .001, #(inches) allow this much variation when reducing circles and rects
};

#Also, my CAD's Print function or the PDF print driver I used was a little off for circles, so define some additional adjustment values here:
#Values are added to X/Y coordinates; units are pixels; for example, a value of 1 at 600 dpi would be ~= .002 inch
use constant
{
    CIRCLE_ADJUST_MINX => 0,
    CIRCLE_ADJUST_MINY => -0.001 * 600, #-1, #circles were a little too high, so nudge them a little lower
    CIRCLE_ADJUST_MAXX => +0.001 * 600, #+1, #circles were a little too far to the left, so nudge them a little to the right
    CIRCLE_ADJUST_MAXY => 0,
    SUBST_CIRCLE_CLIPRECT => FALSE, #generate circle and substitute for clip rects (to compensate for the way some CAD software draws circles)
    WANT_CLIPRECT => TRUE, #FALSE, #AI doesn't need clip rect at all? should be on normally?
    RECT_COMPLETION => FALSE, #TRUE, #fill in 4th side of rect when 3 sides found
};

#allow .012 clearance around pads for solder mask:
#This value effectively adjusts pad sizes in the TOOL_SIZES list above (only for solder mask layers).
use constant SOLDER_MARGIN => +.012; #units are inches

#line join/cap styles:
use constant
{
    CAP_NONE => 0, #butt (none); line is exact length
    CAP_ROUND => 1, #round cap/join; line overhangs by a semi-circle at either end
    CAP_SQUARE => 2, #square cap/join; line overhangs by a half square on either end
    CAP_OVERRIDE => FALSE, #cap style overrides drawing logic
};
    
#number of elements in each shape type:
use constant
{
    RECT_SHAPELEN => 6, #x0, y0, x1, y1, count, "rect" (start, end corners)
    LINE_SHAPELEN => 6, #x0, y0, x1, y1, count, "line" (line seg)
    CURVE_SHAPELEN => 10, #xstart, ystart, x0, y0, x1, y1, xend, yend, count, "curve" (bezier 2 points)
    CIRCLE_SHAPELEN => 5, #x, y, 5, count, "circle" (center + radius)
};
#const my %SHAPELEN =
#Readonly my %SHAPELEN =>
our %SHAPELEN =
(
    rect => RECT_SHAPELEN,
    line => LINE_SHAPELEN,
    curve => CURVE_SHAPELEN,
    circle => CIRCLE_SHAPELEN,
);

#panelization:
#This will repeat the entire body the number of times indicated along the X or Y axes (files grow accordingly).
#Display elements that overhang PCB boundary can be squashed or left as-is (typically text or other silk screen markings).
#Set "overhangs" TRUE to allow overhangs, FALSE to truncate them.
#xpad and ypad allow margins to be added around outer edge of panelized PCB.
use constant PANELIZE => {'x' => 1, 'y' => 1, 'xpad' => 0, 'ypad' => 0, 'overhangs' => TRUE}; #number of times to repeat in X and Y directions

# Set this to 1 if you need TurboCAD support.
#$turboCAD = FALSE; #is this still needed as an option?

#CIRCAD pad generation uses an appropriate aperture, then moves it (stroke) "a little" - we use this to find pads and distinguish them from PCB holes. 
use constant PAD_STROKE => 0.3; #0.0005 * 600; #units are pixels
#convert very short traces to pads or holes:
use constant TRACE_MINLEN => .001; #units are inches
#use constant ALWAYS_XY => TRUE; #FALSE; #force XY even if X or Y doesn't change; NOTE: needs to be TRUE for all pads to show in FlatCAM and ViewPlot
use constant REMOVE_POLARITY => FALSE; #TRUE; #set to remove subtractive (negative) polarity; NOTE: must be FALSE for ground planes

#PDF uses "points", each point = 1/72 inch
#combined with a PDF scale factor of .12, this gives 600 dpi resolution (1/72 * .12 = 600 dpi)
use constant INCHES_PER_POINT => 1/72; #0.0138888889; #multiply point-size by this to get inches

# The precision used when computing a bezier curve. Higher numbers are more precise but slower (and generate larger files).
#$bezierPrecision = 100;
use constant BEZIER_PRECISION => 36; #100; #use const; reduced for faster rendering (mainly used for silk screen and thermal pads)

# Ground planes and silk screen or larger copper rectangles or circles are filled line-by-line using this resolution.
use constant FILL_WIDTH => .01; #fill at most 0.01 inch at a time

# The max number of characters to read into memory
use constant MAX_BYTES => 10 * M; #bumped up to 10 MB, use const

use constant DUP_DRILL1 => TRUE; #FALSE; #kludge: ViewPlot doesn't load drill files that are too small so duplicate first tool

my $runtime = time(); #Time::HiRes::gettimeofday(); #measure my execution time

print STDERR "Loaded config settings from '${\(__FILE__)}'.\n";
1; #last value must be truthful to indicate successful load


#############################################################################################
#junk/experiment:

#use Package::Constants;
#use Exporter qw(import); #https://perldoc.perl.org/Exporter.html

#my $caller = "pdf2gerb::";

#sub cfg
#{
#    my $proto = shift;
#    my $class = ref($proto) || $proto;
#    my $settings =
#    {
#        $WANT_DEBUG => 990, #10; #level of debug wanted; higher == more, lower == less, 0 == none
#    };
#    bless($settings, $class);
#    return $settings;
#}

#use constant HELLO => "hi there2"; #"main::HELLO" => "hi there";
#use constant GOODBYE => 14; #"main::GOODBYE" => 12;

#print STDERR "read cfg file\n";

#our @EXPORT_OK = Package::Constants->list(__PACKAGE__); #https://www.perlmonks.org/?node_id=1072691; NOTE: "_OK" skips short/common names

#print STDERR scalar(@EXPORT_OK) . " consts exported:\n";
#foreach(@EXPORT_OK) { print STDERR "$_\n"; }
#my $val = main::thing("xyz");
#print STDERR "caller gave me $val\n";
#foreach my $arg (@ARGV) { print STDERR "arg $arg\n"; }

Download Details:

Author: swannman
Source Code: https://github.com/swannman/pdf2gerb

License: GPL-3.0 license

#perl 

Joseph  Murray

Joseph Murray

1621492530

7 Test Frameworks To Follow in 2021 for Java/Fullstack Developers

It is time to learn new test frameworks in 2021 to improve your code quality and decrease the time of your testing phase. Let’s explore 6 options for devs.

It is time to learn new test frameworks to improve your code quality and decrease the time of your testing phase. I have selected six testing frameworks that sound promising. Some have existed for quite a long time but I have not heard about them before.

At the end of the article, please tell me what you think about them and what your favorite ones are.

Robot Framework

Robot Framework is a generic open-source automation framework. It can be used for test automation and robotic process automation (RPA).

Robot Framework is open and extensible and can be integrated with virtually any other tool to create powerful and flexible automation solutions. Being open-source also means that Robot Framework is free to use without licensing costs.

The RoboFramework is a framework** to write test cases and automation processes.** It means that it may replace** your classic combo Selenium + Cucumber + Gherkins**. To be more precise, the Cucumber Gherkins custom implementation you wrote will be handled by RoboFramework and Selenium invoked below.

For the Java developers, this framework can be executed with Maven or Gradle (but less mature for the latter solution).

#java #testing #test #java framework #java frameworks #testing and developing #java testing #robot framework #test framework #2021

Joseph  Murray

Joseph Murray

1623304800

Why We Need Collection Framework in Java?

A framework is a set of classes and interfaces which provide a ready-made architecture. In order to implement a new feature or a class, there is no need to define a framework. However, an optimal object-oriented design always includes a framework with a collection of classes such that all the classes perform the same kind of task. Before Collection Framework(or before JDK 1.2) was introduced, the standard methods for grouping Java objects (or collections) were Arrays or Vectors, or Hash tables. All of these collections had no common interface. Therefore, though the main aim of all the collections is the same, the implementation of all these collections was defined independently and had no correlation among them. And also, it is very difficult for the users to remember all the different methods, syntax, and constructors present in every collection class.

Collection Framework is a powerful framework in java. This framework defines the most common methods that can be used for any collection of objects. But the question arises that we have an array concept in java then why we need collection framework in java? Now let’s see that why we need collection framework in java with some valid points of difference between array and collection.

#java #java-collections #why we need collection framework in java #java collections framework #framework in java

Mixin: A Trait & Mixin Framework for Java using ASM

Mixin is a trait/mixin framework for Java using ASM and hooking into the runtime classloading process via a set of pluggable built-in or user-provided services. Built-in services currently support Mojang's LegacyLauncher system, though this is deprecated in favour of ModLauncher by cpw, which has greater extensibility and has support for Java 8 and later.

Documentation

The main documentation for Mixin can be found in the Wiki.

Additional documentation for individual features and annotations can be found in the extensive Javadoc. For additional help use the channel #mixin on the Sponge Discord Server.

Binaries

Mixin binaries are available via Jenkins and are published to the following maven repositories:

Tooling

For handling obfuscation tasks, Mixin provides an Annotation Processor which works at compile time to generate obfuscation mappings for your toolchain to apply. If using Gradle 5 or later, annotation processors are no longer automatically loaded from compile configurations and must be specified explicitly via annotationProcessor configurations. For this purpose, Mixin provides "fat jar" artefacts containing all required dependencies via the :processor classifier. For example if your build uses the dependency org.spongepowered:mixin:1.2.3 then your annotationProcessor configuration should specify dependency org.spongepowered:mixin:1.2.3:processor.

If you are using Mixin in a Minecraft Forge project then the MixinGradle plugin can be used to simplify the configuration of the Mixin Annotation Processor. It provides a simple syntax for configuring the Mixin AP for your project, see the MixinGradle README for how to configure MixinGradle.

Integration with Eclipse

When developing using Mixin, you can use the Mixin Annotation Processor within Eclipse to provide context-sensitive errors and warnings to help you more easily troubleshoot your mixins. To do so:

  1. Run the gradle build command to generate the mixin jar
  2. Open the properties of your eclipse project and navigate to Java Compiler -> Annotation Processing -> Factory Path
  3. Check the Enable project specific settings checkbox
  4. Click the Add External JARs button and select the generated mixin jar with the suffix -processor (hint: it should be in Mixin/build/libs)
  5. Navigate up one level to Java Compiler -> Annotation Processing
  6. Check the Enable project specific settings checkbox
  7. Check the Enable annotation processing checkbox
  8. Click the New... button next to the Processor options box
  • Set Key to reobfSrgFile
  • Set Value to the fully-qualified path to the mcp-srg.srg file (the location of the mapping file varies by platform, if you are unsure where to find it please follow the discord link below).

9.   Click OK to apply the changes

Integration with IntelliJ IDEA

Enhanced functionality for working with Mixin in IntelliJ IDEA is available via the Minecraft Development for IntelliJ IDEA plugin developed by DemonWav.

Version History

Specifying the minVersion property in your configurations is extrememly important. The following version history can be used to determine when features were introduced (and sometimes when major bugs are squashed) in order to help you determine which minVersion you should specify.

VersionDateFeatures / Changes
0.8.3February 2021
  • Added dynamic target selector support and @Desc target selector
  • Added pattern target selector
  • Added more expressive quantifier support to explicit target selectors
  • Facelift and overall improvements to javadoc
0.8.1 (0.8.2)September 2020
  • Hotfix for supporting ModLauncher 7.0
  • Fix critical issue with resolving obfuscated members in inherited interfaces
  • Updated to ASM 7.2
0.8January 2020
  • Updated to ASM 6.2
  • Support for ModLauncher
  • Added recognition for Java 9 and 10
  • Support for ForgeGradle 3+ tsrg obfuscation tables
  • Configs can now inherit from other configs
  • @Invoke can now be used to expose constructors
  • Dramatically improved context reporting of unexpected applicator and preprocessor exceptions, making it easier to diagnose when an agent chokes on a specific opcode
  • Bug fixes for
    • Calling members of accessor mixins from inside mixin code
    • Incorrect handling of spaces in explicit target declarations
    • Unexpected behaviour when attempting to redirect a ctor
    • Properly detect incompatible accessor overlap and ignore valid ones (don't warn)
    • Interface static accessors now correctly conform target if interface is classloaded before target class
    • Staticness mismatch for accessor correctly detected and reported instead of causing crash
    • Fixed generator and injector errors relating to double-word operands on the stack needing DUP2
    • Fixed issue in LVT generator folded in from FabricMC
    • Fail-fast when a final method is accidentally hidden by a mixin
    • Fix the appearance of stray CallbackInfo instances in local capture injector LVTs
  • Apache Commons-IO Dependency removed
  • Renamed shaded ASM removed
  • Improved resolution of local variables for local variable capture injections
  • @Coerce on callback injectors and redirects can now resolve super interfaces including mixed-in interfaces
0.7.11July 2018
  • Fixes for 3 minor bugs: handling of maxShiftBy fixed, improved BeforeInvoke permissive search, disable generic signature merging unless decompiler is active.
0.7.10June 2018
  • Log an error when a mixin class is subject to classloader restrictions
0.7.9April 2018
  • Allow certain injectors to target mixin methods.
0.7.8April 2018
  • Bug fixes for member declaration validation, non-wild ctor redirects, and internal errors in Args subclass generator
0.7.7March 2018
  • Fixes for handling of log message triggers for INIT phase and error when running with unexpected logger configurations
  • Add warnings for invalid slice points and narrowing conversion in ModifyConstant handlers
0.7.6November 2017
  • Fix inheritance for string system properties
0.7.5October 2017
  • Add support for @Coerce on redirect injectors.
0.7.4September 2017
  • Added @Dynamic annotation for decorating mixin elements with dynamically-injected targets.
0.7.3August 2017
  • Internal changes to provide for support modlauncher and java 9
0.7.2August 2017
  • Add profiler for inspecting mixin performance.
0.7.1August 2017
  • Fixes and improvements to the Mixin AP, fixing handling of multi- dimensional arrays and resolving methods in superclasses of derived types of obfuscated classes
  • Add runtime refmap remapping to support using deobfCompile dependencies with different mapping versions.
0.7July 2017
  • All official binaries are now signed
  • Upgrade to ASM 5.2
  • Add support for inner classes in Mixins
  • Injectors can now have multiple explicit targets
  • @At annotations can now have their own id
  • Add support for using @Overwrite on non-obfuscated methods as a way of verifying that an overwrite target exists
  • Improve support for synthetic bridges, detect conflicting bridge methods
  • Detect and warn of excessive At.Shift.BY values
  • ModifyConstant can now support multiple slices
  • Add allow to injectors to detect over-injection
0.6.15July 2017
  • Add support for multiple constants in ModifyConstant
  • Add CONSTANT as general-purpose injection point
  • Add support for redirecting array length access in field redirectors
0.6.14July 2017
  • Add support for using @Coerce on reference types in Callback Injectors to support derived types.
0.6.13July 2017
  • Add support for conforming visibility of overwrite methods to match target class. Fixes issues where a target class method has been modified by an Access Transformer to have higher visibility
0.6.12June 2017
  • Add slice argument to @ModifyConstant
  • Add @ModifyArgs injector which can change multiple method call arguments with a single handler.
0.6.11June 2017
  • Fix handling of @Unique when the same unique method exists in more than one mixin targetting the same class
  • Fix handling of merged lambdas so that lambdas from mixins are applied correctly when lambdas already exist in the target class (both in the original class and when applied by earlier mixins)
0.6.10May 2017
  • (0.6.9) Minor fix to remove dependence on deprecated helper
  • Respect remap on Mixin for contained @At
  • Require redirectors which occur before call to superctor to be static
0.6.8February 2017
  • Allow @ModifyConstant to hook implicit zero in comparisons
0.6.7January 2017
  • Add support for @Redirect on array access
0.6.6January 2017
  • Allow static methods in accessor mixins in Java 8 and above
0.6.5January 2017
  • Add support for injector slices
0.6.4January 2017
  • Allow descriptors on NEW injection points
0.6.3December 2016
  • SourceDebugExtension support
0.6.2December 2016
  • Add support for @Pseudo (virtual target) mixins
0.6.1November 2016
  • Process soft-implements annotations in the AP
0.6October 2016
  • Accessor Mixin support
0.5.17October 2016
  • Allow @Redirect injectors to target NEW opcodes for constructor redirection
0.5.16October 2016
  • Annotation Processor improvements. Support shadows and overrides in multi-target mixins
  • Support pluggable obfuscation environments in AP
0.5.14September 2016
  • Add async decompilation support
0.5.13September 2016
  • Add alternative strategy for injecting field initialisers
0.5.10June 2016
  • Support @Unique on fields
0.5.9June 2016
  • Hard fail if a required mixin target was already transformed
0.5.8June 2016
  • Support constraints on injectors
0.5.7June 2016
  • Add @Unique annotation
0.5.6May 2016
  • Environment changes, support environment via agents
0.5.5April 2016
  • Add @ModifyConstant injector
  • Add @Debug annotation
  • Allow static @ModifyArg handlers in instance methods
0.5.4April 2016
  • Error handlers also receive mixin prepare errors
0.5.3February 2016
  • Conform injectors
  • Enable hotswapper automatically if agent is active
  • Fix multiple issues with generics in Annotation Processors
0.5.2February 2016
  • Support ID on injectors
  • Support priority for injectors
0.5.1February 2016
  • Overhaul injectors, injectors from all mixins now scan before any injectors are actually processed. Makes injectors more deterministic.
0.4.19February 2016
  • Add support for @Redirect on fields as well as methods
0.4.18February 2016
  • Add @ModifyLocal injector
0.4.17January 2016
  • Support ExtraSRGs in Annotation Processor
  • Include constructors in reference map
  • Add @Mutable annotation to suppress @Final warnings
0.4.15January 2016
  • Include soft targets in refmap
0.4.14January 2016
  • Add support for interface mixins
0.4.13January 2016
  • Add @Final annotation
0.4.11January 2016
  • Add support for injector grouping and config-wide require value
0.4.10December 2015
  • Runtime remapping support using RemapperChain
  • Ignore class transformers decorated with @Resource
  • Support @reason and @author validation on overwrites
0.4.8December 2015
  • Annotation Processor improved to support MixinGradle
  • Support multiple target obfuscation environments in refmaps
0.4.6September 2015
  • Add INIT phase for handling early FML startup
  • Add support for lambdas in mixins
  • Add support for hot code replacement in mixins
  • Improve Java 8 feature support
0.4.4July 2015
  • Add constraints for overwrites
0.4.3May 2015
  • Add INVOKE_ASSIGN injection point
  • Support injector callbacks without args
  • Support coercion of covariant parameter types in callbacks
  • Support truncating local-capturing injector handlers
  • Runtime decompilation of exported classes using fernflower
  • Add export filter
0.4May 2015
  • Shade relocated ASM package and use throughout
0.3.2April 2015
  • Error handler support
0.3.1April 2015
  • Annotation Merging
  • Allow Overwrite methods to be aliased
0.3March 2015
  • Implemented Environments
  • Intrinsic method support
  • Enabled local variable capture
  • Alias support
0.2March 2015
  • Added supermixin support (mixins inheriting from other mixins)
0.1January 2015
  • Basic Mixin Support
  • Basic Injector Support
  • Annotation Processor

Download Details:
Author: SpongePowered
Source Code: https://github.com/SpongePowered/Mixin
License: MIT license

#framework  #java