From java to kotlin beyond alt+shift+cmd+k - Droidcon italyFabio Collini
Kotlin is a first-class language for Android development since Google I/O 2017. And it’s here to stay!
Thanks to Android Studio it’s really easy to introduce Kotlin in an existing project, the configuration is trivial and then we can convert Java classes to Kotlin using a Alt+Shift+Cmd+K. But the new syntax is the just beginning, using Kotlin we can improve our code making it more readable and simpler to write.
In this talk we’ll see how to use some Kotlin features (for example data classes, collections, coroutines and delegates) to simplify Android development comparing the code with the equivalent “modern” Java code. It’s not fair to compare Kotlin code with plain Java 6 code so the Java examples will use lambdas and some external libraries like RxJava and AutoValue.
Do you want to learn Kotlin programming language from scratch? This is the 2nd episode of a simple course, focused on function and functional programming
We aren't sure about you, but working with Java 8 made one of the speakers lose all of his hair and the other lose his sleep (or was it the jetlag?). If you still haven't reached the level of Brian Goetz in mastering lambdas and strings, this talk is for you. And if you think you have, we have some bad news for you, you should attend as well.
From java to kotlin beyond alt+shift+cmd+k - Droidcon italyFabio Collini
Kotlin is a first-class language for Android development since Google I/O 2017. And it’s here to stay!
Thanks to Android Studio it’s really easy to introduce Kotlin in an existing project, the configuration is trivial and then we can convert Java classes to Kotlin using a Alt+Shift+Cmd+K. But the new syntax is the just beginning, using Kotlin we can improve our code making it more readable and simpler to write.
In this talk we’ll see how to use some Kotlin features (for example data classes, collections, coroutines and delegates) to simplify Android development comparing the code with the equivalent “modern” Java code. It’s not fair to compare Kotlin code with plain Java 6 code so the Java examples will use lambdas and some external libraries like RxJava and AutoValue.
Do you want to learn Kotlin programming language from scratch? This is the 2nd episode of a simple course, focused on function and functional programming
We aren't sure about you, but working with Java 8 made one of the speakers lose all of his hair and the other lose his sleep (or was it the jetlag?). If you still haven't reached the level of Brian Goetz in mastering lambdas and strings, this talk is for you. And if you think you have, we have some bad news for you, you should attend as well.
Помните легендарные Java Puzzlers? Да-да, те самые, с Джошом Блохом и Нилом Гафтером? Ну, по которым ещё книжку написали? Так вот, в Groovy всё ещё веселее.
В смысле — задачки ещё более странные, и ответы ещё более поразительные. Этот доклад для вас, Groovy-разработчики, мы покажем вам настоящие, большие и красивые подводные камни! И для вас, Java-разработчики, потому что таких вещей на Java-подобном синтакисе вы точно никогда не видели! И для вас, PHP-разработчики… хотя, нет, не для вас :)
Всем точно будет весело — ваши ведущие Женя и Барух будут зажигать, шутить, спорить, бросаться футболками в публику, и самое главное — заставят вас офигевать от Groovy.
Functional Patterns for the non-mathematicianBrian Lonsdorf
Fluentconf 2014 talk:
Functional design patterns such as lenses, arrows, functors, and monads all come from category theory. To fully grok them, you’ll probably have to wade through the whitest white papers, fighting the mathematical syntax and abstract examples.
I’m hoping to demonstrate the ideas into javascript. I’ll be showing direct and practical applications for every day programming.
Stanfy MadCode Meetup #9: Functional Programming 101 with SwiftStanfy
This time Alexander Voronov (@aleks_voronov), iOS Developer at Stanfy talked about Functional Programming 101 with Swift
Key points:
- Why do we need Functional Programming?
- The power of Swift
- Functors, Applicatives and Monads
- Pipes & Railways
- Functional Swift in real life
Links Mentioned:
- Functors, Applicatives and Monads in Pictures: http://adit.io/posts/2013-04-17-funct...
- Railway Oriented Programming: http://fsharpforfunandprofit.com/post...
- Functional Programming in Swift (Objc.io): http://www.objc.io/books/fpinswift/
- Moya: https://github.com/Moya/Moya
- Argo: https://github.com/thoughtbot/Argo
- Swiftz: https://github.com/typelift/Swiftz
- RxSwift: https://github.com/ReactiveX/RxSwift
- ReactiveCocoa-3.0: https://github.com/ReactiveCocoa/Reac...
- Haskell: https://www.haskell.org
- F#: http://fsharp.org
- Erlang: http://www.erlang.org
- Elm: http://elm-lang.org
Watch video from the presentation (rus): https://youtu.be/w6zyGylS4Wk
Join our MadCode group on FB(rus): https://www.facebook.com/MadCodeMeetup/
Find more videos from MadCode Meetups (rus): https://www.youtube.com/playlist?list=PLrplqd3YJvBvUygFkx4Xvx1p3zyiCgB9Q
Free Monads are a powerful technique that can separate the representation of programs from the messy details of how they get run.
I'll go into the details of how they work, how to use them for fun and profit in your own code, and demonstrate a live Free Monad-driven tank game.
Supporting code at https://github.com/kenbot/free
public class Person { private String name; private int age;.pdfarjuncp10
public class Person
{
private String name;
private int age;
public Person()
{
name=\"\";
age=0;
}
/**
Create a person with a given name and age.
@param name the name
@param age the age
*/
public Person(String name, int age)
{
this.name = name;
this.age = age;
}
/**
Get the name.
@return the name
*/
public String getName()
{
return name;
}
/**
Change the name.
@param name the name
*/
public void setName(String name)
{
this.name = name;
}
/**
Get the age.
@return the age
*/
public int getAge()
{
return age;
}
/**
Change the age.
@param age the age
*/
public void setAge()
{
this.age = age;
}
/**
Convert person to string form.
*/
public String toString()
{
return \"Name: \" + name + \"\\t\" + \"Age: \" + age;
}
}
OUTPUT should look like this!
Solution
solution
package com.prt.test;
public class Person
{
protected String name;
protected int age;
public Person()
{
name=\"\";
age=0;
}
/**
Create a person with a given name and age.
@param name the name
@param age the age
*/
public Person(String name, int age)
{
this.name = name;
this.age = age;
}
/**
Get the name.
@return the name
*/
public String getName()
{
return name;
}
/**
Change the name.
@param name the name
*/
public void setName(String name)
{
this.name = name;
}
/**
Get the age.
@return the age
*/
public int getAge()
{
return age;
}
/**
Change the age.
@param age the age
*/
public void setAge()
{
this.age = age;
}
/**
Convert person to string form.
*/
public String toString()
{
return \"Name: \" + name + \"\\t\" + \"Age: \" + age;
}
}
package com.prt.test;
public class Student extends Person implements Comparable{
private int studentId;
private String major;
/**
* @return the studentId
*/
public int getStudentId() {
return studentId;
}
/**
* @param studentId the studentId to set
*/
public void setStudentId(int studentId) {
this.studentId = studentId;
}
/**
* @return the major
*/
public String getMajor() {
return major;
}
/**
* @param major the major to set
*/
public void setMajor(String major) {
this.major = major;
}
public Student(String name, int age, int studentId, String major) {
super(name, age);
this.studentId = studentId;
this.major = major;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return \"name:\" + name+ \"\\t\"+\"\\t\"+\"age:\"+ age+\"\\t\"+ \"studentId :\"+ studentId +
\"\\t\" +\" major:\"+ major;
}
public int compareTo(Student st){
if(studentId==st.studentId)
return 0;
else if(studentId>st.studentId)
return 1;
else
return -1;
}
}
package com.prt.test;
public class Instructor extends Person implements Comparable {
private double salary;
public Instructor(String name, int age, double salary) {
super(name, age);
this.salary = salary;
}
/**
* @return the salary
*/
public double getSalary() {
return salary;
}
/**
* @param salary
* the salary to set
*/
public void setSalary(double salary) {
this.salary = salary;
}
public int compareTo(Instructor is) {
if (salary == is.salary)
return 0;
else if (salary > is.salary)
return 1;
else
ret.
Помните легендарные Java Puzzlers? Да-да, те самые, с Джошом Блохом и Нилом Гафтером? Ну, по которым ещё книжку написали? Так вот, в Groovy всё ещё веселее.
В смысле — задачки ещё более странные, и ответы ещё более поразительные. Этот доклад для вас, Groovy-разработчики, мы покажем вам настоящие, большие и красивые подводные камни! И для вас, Java-разработчики, потому что таких вещей на Java-подобном синтакисе вы точно никогда не видели! И для вас, PHP-разработчики… хотя, нет, не для вас :)
Всем точно будет весело — ваши ведущие Женя и Барух будут зажигать, шутить, спорить, бросаться футболками в публику, и самое главное — заставят вас офигевать от Groovy.
Functional Patterns for the non-mathematicianBrian Lonsdorf
Fluentconf 2014 talk:
Functional design patterns such as lenses, arrows, functors, and monads all come from category theory. To fully grok them, you’ll probably have to wade through the whitest white papers, fighting the mathematical syntax and abstract examples.
I’m hoping to demonstrate the ideas into javascript. I’ll be showing direct and practical applications for every day programming.
Stanfy MadCode Meetup #9: Functional Programming 101 with SwiftStanfy
This time Alexander Voronov (@aleks_voronov), iOS Developer at Stanfy talked about Functional Programming 101 with Swift
Key points:
- Why do we need Functional Programming?
- The power of Swift
- Functors, Applicatives and Monads
- Pipes & Railways
- Functional Swift in real life
Links Mentioned:
- Functors, Applicatives and Monads in Pictures: http://adit.io/posts/2013-04-17-funct...
- Railway Oriented Programming: http://fsharpforfunandprofit.com/post...
- Functional Programming in Swift (Objc.io): http://www.objc.io/books/fpinswift/
- Moya: https://github.com/Moya/Moya
- Argo: https://github.com/thoughtbot/Argo
- Swiftz: https://github.com/typelift/Swiftz
- RxSwift: https://github.com/ReactiveX/RxSwift
- ReactiveCocoa-3.0: https://github.com/ReactiveCocoa/Reac...
- Haskell: https://www.haskell.org
- F#: http://fsharp.org
- Erlang: http://www.erlang.org
- Elm: http://elm-lang.org
Watch video from the presentation (rus): https://youtu.be/w6zyGylS4Wk
Join our MadCode group on FB(rus): https://www.facebook.com/MadCodeMeetup/
Find more videos from MadCode Meetups (rus): https://www.youtube.com/playlist?list=PLrplqd3YJvBvUygFkx4Xvx1p3zyiCgB9Q
Free Monads are a powerful technique that can separate the representation of programs from the messy details of how they get run.
I'll go into the details of how they work, how to use them for fun and profit in your own code, and demonstrate a live Free Monad-driven tank game.
Supporting code at https://github.com/kenbot/free
public class Person { private String name; private int age;.pdfarjuncp10
public class Person
{
private String name;
private int age;
public Person()
{
name=\"\";
age=0;
}
/**
Create a person with a given name and age.
@param name the name
@param age the age
*/
public Person(String name, int age)
{
this.name = name;
this.age = age;
}
/**
Get the name.
@return the name
*/
public String getName()
{
return name;
}
/**
Change the name.
@param name the name
*/
public void setName(String name)
{
this.name = name;
}
/**
Get the age.
@return the age
*/
public int getAge()
{
return age;
}
/**
Change the age.
@param age the age
*/
public void setAge()
{
this.age = age;
}
/**
Convert person to string form.
*/
public String toString()
{
return \"Name: \" + name + \"\\t\" + \"Age: \" + age;
}
}
OUTPUT should look like this!
Solution
solution
package com.prt.test;
public class Person
{
protected String name;
protected int age;
public Person()
{
name=\"\";
age=0;
}
/**
Create a person with a given name and age.
@param name the name
@param age the age
*/
public Person(String name, int age)
{
this.name = name;
this.age = age;
}
/**
Get the name.
@return the name
*/
public String getName()
{
return name;
}
/**
Change the name.
@param name the name
*/
public void setName(String name)
{
this.name = name;
}
/**
Get the age.
@return the age
*/
public int getAge()
{
return age;
}
/**
Change the age.
@param age the age
*/
public void setAge()
{
this.age = age;
}
/**
Convert person to string form.
*/
public String toString()
{
return \"Name: \" + name + \"\\t\" + \"Age: \" + age;
}
}
package com.prt.test;
public class Student extends Person implements Comparable{
private int studentId;
private String major;
/**
* @return the studentId
*/
public int getStudentId() {
return studentId;
}
/**
* @param studentId the studentId to set
*/
public void setStudentId(int studentId) {
this.studentId = studentId;
}
/**
* @return the major
*/
public String getMajor() {
return major;
}
/**
* @param major the major to set
*/
public void setMajor(String major) {
this.major = major;
}
public Student(String name, int age, int studentId, String major) {
super(name, age);
this.studentId = studentId;
this.major = major;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return \"name:\" + name+ \"\\t\"+\"\\t\"+\"age:\"+ age+\"\\t\"+ \"studentId :\"+ studentId +
\"\\t\" +\" major:\"+ major;
}
public int compareTo(Student st){
if(studentId==st.studentId)
return 0;
else if(studentId>st.studentId)
return 1;
else
return -1;
}
}
package com.prt.test;
public class Instructor extends Person implements Comparable {
private double salary;
public Instructor(String name, int age, double salary) {
super(name, age);
this.salary = salary;
}
/**
* @return the salary
*/
public double getSalary() {
return salary;
}
/**
* @param salary
* the salary to set
*/
public void setSalary(double salary) {
this.salary = salary;
}
public int compareTo(Instructor is) {
if (salary == is.salary)
return 0;
else if (salary > is.salary)
return 1;
else
ret.
Kotlin for Android Developers - Victor Kropp - Codemotion Rome 2018Codemotion
Kotlin is a programming language developed by JetBrains that targets multiple platforms including the JVM, JavaScript, and native binaries. A year ago it has been adopted as an officially supported language for Android development. Kotlin offers clean and concise syntax, interoperability, both object-oriented and functional code constructs, and a lot of other cool features with little or no overhead. Let's find out together why developers love this language and how it helps them to be productive and have fun!
4Developers 2015: Testowanie ze Spockiem - Dominik PrzybyszPROIDEA
Czy można pisać testy bez takich bibliotek jak JUnit, TestNG i festAssert? Mockować bez Mockito? Łapać wyjątki bez catch-exception? Oczywiście, że można. Odpowiedzią jest Spock.
Podczas prezentacji przyjrzymy się możliwościom Spocka w testowaniu kodu javowego i grooviowego. Zobaczymy jak pisać w stylu given-when-then, sprawdząć warunki nie używając słowa "assert", jak zasilać testy danymi, udawać, że mamy zależności testowanego obiektu i pisać testy integracyjne z podniesionym kontekstem springa.
Ever wonder what this "new" Kotlin thing is? Curious what the syntax looks like? Unsure how to implement this at your own company? Or do you just want to know what Nick and Cody's favorite things are about this language?
All that and (maybe) more are revealed in Privet Kotlin.
Presentation in Portuguese (Brazilian) about Kotlin basics. Can be used as reference to the basics of the language. It is specially focused on people with prior development experience, specially in Java.
From java to kotlin beyond alt+shift+cmd+kFabio Collini
Kotlin is a first-class language for Android development since Google I/O 2017. And it’s here to stay! Thanks to Android Studio it’s really easy to introduce Kotlin in an existing project, the configuration is trivial and then we can convert Java classes to Kotlin using a Alt+Shift+Cmd+K. But the new syntax is the just beginning, using Kotlin we can improve our code making it more readable and simpler to write. In this talk we’ll see how to use some Kotlin features (for example data classes, collections, coroutines and delegates) to simplify Android development comparing the code with the equivalent “modern” Java code. It’s not fair to compare Kotlin code with plain Java 6 code so the Java examples will use lambdas and some external libraries like RxJava and AutoValue.
자프링(자바 + 스프링) 외길 12년차 서버 개발자가 코프링(코틀린 + 스프링)을 만난 후 코틀린의 특징과 스프링의 코틀린 지원을 알아가며 코프링 월드에서 살아남은 이야기…
코드 저장소: https://github.com/arawn/kotlin-support-in-spring
Meetup di GDG Italia - Leonardo Pirro - Codemotion Rome 2018 Codemotion
I Google Developer Group (GDG) sono una community internazionale di appassionati delle tecnologie: sviluppatori, designer e startupper. Sono suddivisi per città, e GDG Italia è la famiglia che rappresenta tutti i gruppi presenti sul territorio locale. Mike Trizio e Carmelo Ventimiglia introdurranno i GDG, le loro attività e perchè è utile e divertente farne parte. Leonardo Pirro invece ci introdurrà Kotlin, un linguaggio di programmazione che ha avuto un crescente successo negli ultimi anni. Analizzeremo le caratteristiche principali del linguaggio e i suoi vantaggi/benefici rispetto a Java.
Simple class and object examples in java
classes
objects
fields
properties
variables
instance variables
local variables
class variables
methods
members of class
data members
UML representation of class
instance methods
static methods
create object
instantiate object
object qualifier
reference to object
allocate memory to object
class naming conventions
fields naming conventions
GDG DevFest 2017 - Inspections of Kotlin implementations by Bytecode.
세션 이후 "Kotlin은 Java의 wrapper인가요?" 라는 질문을 몇번 받았습니다.
—
답변: 그렇지 않습니다.
특정한 언어로 구현된 코드는 파싱을 거쳐 추상화된 형태(AST)와 추가 정보들을 가지는 1차적인 결과물로 처리됩니다. 보통 이런 역할을 하는 것은 컴파일러에서 전단부(frontend)라고 호칭하며 이러한 AST 등의 결과물은 대상 머신이나 플랫폼에 맞추어 처리됩니다.
이를 바로 실행하면 인터프리터라고 하지만, 실행 가능한 형태(Executable)로 생성하는 경우라면 컴파일러 후단부(Backend)가 이를 수행합니다.
백엔드의 타겟 코드는 충분히 다양한 대상을 다룰 수 있으므로, 우리가 다양한 백엔드 구현을 통해 동일 코드를 멀티 플랫폼을 대상으로 실행할 수 있도록 할 수 있는 것입니다.
코틀린 역시 대상으로 하는 플랫폼(과 머신)은 현재 다음과 같은 실행 가능한 형태를 지원하고 있습니다. (물론 아직 모든 타겟이 완벽하지는 않겠죠.)
1. Bytecode 포맷에 따른 JVM(안드로이드 포함)
2. JavaScript에 의한 브라우저나 Node.js
3. llvm을 이용하여 여러 타겟의 네이티브 코드
이 자료는 이 중 1번을 기반으로 디컴파일된 코드를 살펴보고 코틀린의 코드 생성 목적이나 언어 설계의 원인(어떤 painpoint)를 찾아보는 과정의 일부였을 뿐입니다.
언어는 항상 요구되는 표현을 위해 가장 적합한 형태로 변화해나갑니다. 프로그래밍 언어는 비교적 단기간에 만들어지는 언어이고, 그에 따라 특정 사람과 집단의 목적에 충실합니다. 다만, 이 관점에서 봤을 때도 Kotlin이 Java의 wrapper로써 설계되었을 것보다는 다양한 타겟 플랫폼이 고려되고 있는 하나의 프로그래밍 언어로 받아들여 주시기를 바랍니다. :)
Are you stuck in the Java world? I’ll share my story about convincing my team and the client of the benefits of Kotlin. Furthermore I’ll delve into how we migrated an existing Java Android app, with 300k active users, to Kotlin. Even if you have never seen Kotlin before, come and see how you will create better apps with this modern and elegant language. At the end of this talk you’ll be able to convince your team / client why it’s a great to use Kotlin. The power of Kotlin can be leveraged everywhere you use Java, since it compiles to JVM bytecode. So even if you’re not an Android developer, check out this session to get acquainted with Kotlin! No excuses: switch to Kotlin :)
Developing Distributed High-performance Computing Capabilities of an Open Sci...Globus
COVID-19 had an unprecedented impact on scientific collaboration. The pandemic and its broad response from the scientific community has forged new relationships among public health practitioners, mathematical modelers, and scientific computing specialists, while revealing critical gaps in exploiting advanced computing systems to support urgent decision making. Informed by our team’s work in applying high-performance computing in support of public health decision makers during the COVID-19 pandemic, we present how Globus technologies are enabling the development of an open science platform for robust epidemic analysis, with the goal of collaborative, secure, distributed, on-demand, and fast time-to-solution analyses to support public health.
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...Juraj Vysvader
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I didn't get rich from it but it did have 63K downloads (powered possible tens of thousands of websites).
Quarkus Hidden and Forbidden ExtensionsMax Andersen
Quarkus has a vast extension ecosystem and is known for its subsonic and subatomic feature set. Some of these features are not as well known, and some extensions are less talked about, but that does not make them less interesting - quite the opposite.
Come join this talk to see some tips and tricks for using Quarkus and some of the lesser known features, extensions and development techniques.
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus
As part of the DOE Integrated Research Infrastructure (IRI) program, NERSC at Lawrence Berkeley National Lab and ALCF at Argonne National Lab are working closely with General Atomics on accelerating the computing requirements of the DIII-D experiment. As part of the work the team is investigating ways to speedup the time to solution for many different parts of the DIII-D workflow including how they run jobs on HPC systems. One of these routes is looking at Globus Compute as a way to replace the current method for managing tasks and we describe a brief proof of concept showing how Globus Compute could help to schedule jobs and be a tool to connect compute at different facilities.
Check out the webinar slides to learn more about how XfilesPro transforms Salesforce document management by leveraging its world-class applications. For more details, please connect with sales@xfilespro.com
If you want to watch the on-demand webinar, please click here: https://www.xfilespro.com/webinars/salesforce-document-management-2-0-smarter-faster-better/
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Globus
The U.S. Geological Survey (USGS) has made substantial investments in meeting evolving scientific, technical, and policy driven demands on storing, managing, and delivering data. As these demands continue to grow in complexity and scale, the USGS must continue to explore innovative solutions to improve its management, curation, sharing, delivering, and preservation approaches for large-scale research data. Supporting these needs, the USGS has partnered with the University of Chicago-Globus to research and develop advanced repository components and workflows leveraging its current investment in Globus. The primary outcome of this partnership includes the development of a prototype enterprise repository, driven by USGS Data Release requirements, through exploration and implementation of the entire suite of the Globus platform offerings, including Globus Flow, Globus Auth, Globus Transfer, and Globus Search. This presentation will provide insights into this research partnership, introduce the unique requirements and challenges being addressed and provide relevant project progress.
Listen to the keynote address and hear about the latest developments from Rachana Ananthakrishnan and Ian Foster who review the updates to the Globus Platform and Service, and the relevance of Globus to the scientific community as an automation platform to accelerate scientific discovery.
Essentials of Automations: The Art of Triggers and Actions in FMESafe Software
In this second installment of our Essentials of Automations webinar series, we’ll explore the landscape of triggers and actions, guiding you through the nuances of authoring and adapting workspaces for seamless automations. Gain an understanding of the full spectrum of triggers and actions available in FME, empowering you to enhance your workspaces for efficient automation.
We’ll kick things off by showcasing the most commonly used event-based triggers, introducing you to various automation workflows like manual triggers, schedules, directory watchers, and more. Plus, see how these elements play out in real scenarios.
Whether you’re tweaking your current setup or building from the ground up, this session will arm you with the tools and insights needed to transform your FME usage into a powerhouse of productivity. Join us to discover effective strategies that simplify complex processes, enhancing your productivity and transforming your data management practices with FME. Let’s turn complexity into clarity and make your workspaces work wonders!
GraphSummit Paris - The art of the possible with Graph TechnologyNeo4j
Sudhir Hasbe, Chief Product Officer, Neo4j
Join us as we explore breakthrough innovations enabled by interconnected data and AI. Discover firsthand how organizations use relationships in data to uncover contextual insights and solve our most pressing challenges – from optimizing supply chains, detecting fraud, and improving customer experiences to accelerating drug discoveries.
Enterprise Resource Planning System includes various modules that reduce any business's workload. Additionally, it organizes the workflows, which drives towards enhancing productivity. Here are a detailed explanation of the ERP modules. Going through the points will help you understand how the software is changing the work dynamics.
To know more details here: https://blogs.nyggs.com/nyggs/enterprise-resource-planning-erp-system-modules/
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns
Unlocking Business Potential: Tailored Technology Solutions by Prosigns
Discover how Prosigns, a leading technology solutions provider, partners with businesses to drive innovation and success. Our presentation showcases our comprehensive range of services, including custom software development, web and mobile app development, AI & ML solutions, blockchain integration, DevOps services, and Microsoft Dynamics 365 support.
Custom Software Development: Prosigns specializes in creating bespoke software solutions that cater to your unique business needs. Our team of experts works closely with you to understand your requirements and deliver tailor-made software that enhances efficiency and drives growth.
Web and Mobile App Development: From responsive websites to intuitive mobile applications, Prosigns develops cutting-edge solutions that engage users and deliver seamless experiences across devices.
AI & ML Solutions: Harnessing the power of Artificial Intelligence and Machine Learning, Prosigns provides smart solutions that automate processes, provide valuable insights, and drive informed decision-making.
Blockchain Integration: Prosigns offers comprehensive blockchain solutions, including development, integration, and consulting services, enabling businesses to leverage blockchain technology for enhanced security, transparency, and efficiency.
DevOps Services: Prosigns' DevOps services streamline development and operations processes, ensuring faster and more reliable software delivery through automation and continuous integration.
Microsoft Dynamics 365 Support: Prosigns provides comprehensive support and maintenance services for Microsoft Dynamics 365, ensuring your system is always up-to-date, secure, and running smoothly.
Learn how our collaborative approach and dedication to excellence help businesses achieve their goals and stay ahead in today's digital landscape. From concept to deployment, Prosigns is your trusted partner for transforming ideas into reality and unlocking the full potential of your business.
Join us on a journey of innovation and growth. Let's partner for success with Prosigns.
Providing Globus Services to Users of JASMIN for Environmental Data AnalysisGlobus
JASMIN is the UK’s high-performance data analysis platform for environmental science, operated by STFC on behalf of the UK Natural Environment Research Council (NERC). In addition to its role in hosting the CEDA Archive (NERC’s long-term repository for climate, atmospheric science & Earth observation data in the UK), JASMIN provides a collaborative platform to a community of around 2,000 scientists in the UK and beyond, providing nearly 400 environmental science projects with working space, compute resources and tools to facilitate their work. High-performance data transfer into and out of JASMIN has always been a key feature, with many scientists bringing model outputs from supercomputers elsewhere in the UK, to analyse against observational or other model data in the CEDA Archive. A growing number of JASMIN users are now realising the benefits of using the Globus service to provide reliable and efficient data movement and other tasks in this and other contexts. Further use cases involve long-distance (intercontinental) transfers to and from JASMIN, and collecting results from a mobile atmospheric radar system, pushing data to JASMIN via a lightweight Globus deployment. We provide details of how Globus fits into our current infrastructure, our experience of the recent migration to GCSv5.4, and of our interest in developing use of the wider ecosystem of Globus services for the benefit of our user community.
Understanding Globus Data Transfers with NetSageGlobus
NetSage is an open privacy-aware network measurement, analysis, and visualization service designed to help end-users visualize and reason about large data transfers. NetSage traditionally has used a combination of passive measurements, including SNMP and flow data, as well as active measurements, mainly perfSONAR, to provide longitudinal network performance data visualization. It has been deployed by dozens of networks world wide, and is supported domestically by the Engagement and Performance Operations Center (EPOC), NSF #2328479. We have recently expanded the NetSage data sources to include logs for Globus data transfers, following the same privacy-preserving approach as for Flow data. Using the logs for the Texas Advanced Computing Center (TACC) as an example, this talk will walk through several different example use cases that NetSage can answer, including: Who is using Globus to share data with my institution, and what kind of performance are they able to achieve? How many transfers has Globus supported for us? Which sites are we sharing the most data with, and how is that changing over time? How is my site using Globus to move data internally, and what kind of performance do we see for those transfers? What percentage of data transfers at my institution used Globus, and how did the overall data transfer performance compare to the Globus users?
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Globus
The Earth System Grid Federation (ESGF) is a global network of data servers that archives and distributes the planet’s largest collection of Earth system model output for thousands of climate and environmental scientists worldwide. Many of these petabyte-scale data archives are located in proximity to large high-performance computing (HPC) or cloud computing resources, but the primary workflow for data users consists of transferring data, and applying computations on a different system. As a part of the ESGF 2.0 US project (funded by the United States Department of Energy Office of Science), we developed pre-defined data workflows, which can be run on-demand, capable of applying many data reduction and data analysis to the large ESGF data archives, transferring only the resultant analysis (ex. visualizations, smaller data files). In this talk, we will showcase a few of these workflows, highlighting how Globus Flows can be used for petabyte-scale climate analysis.
We describe the deployment and use of Globus Compute for remote computation. This content is aimed at researchers who wish to compute on remote resources using a unified programming interface, as well as system administrators who will deploy and operate Globus Compute services on their research computing infrastructure.
Globus Connect Server Deep Dive - GlobusWorld 2024Globus
We explore the Globus Connect Server (GCS) architecture and experiment with advanced configuration options and use cases. This content is targeted at system administrators who are familiar with GCS and currently operate—or are planning to operate—broader deployments at their institution.
2. Class
/* Java */
public class PersonJava {
private final String name;
public PersonJava(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
3. Class
/* Java */
Person person = new Person("myeonginWoo");
System.out.println(person.getName());
8. Property
class Person(firstName: String, lastName: String, age: Int)
class Person2(val firstName: String, val lastName: String, val age: Int)
val person = Person("myeongin", "woo", 32 )
val person2 = Person2("myeongin", "woo", 32 )
9. Property
class Person(firstName: String, lastName: String, age: Int)
class Person2(val firstName: String, val lastName: String, val age: Int)
val person = Person("myeongin", "woo", 32 )
val person2 = Person2("myeongin", "woo", 32 )
println(person.firstName) // Error
println(person2.firstName) // Ok
10. Property
class Person(firstName: String, lastName: String, age: Int)
class Person2(val firstName: String, val lastName: String, val age: Int)
• Java의 class 내부에 선언되는 field와 비슷하지만 다릅니다.
• field는 별도로 getter, setter를 선언해줘야 합니다.
• propertry는 getter와 setter를 자동으로 생성해 줍니다.
• public, private, protected 와 같은 접근제어자만 잘 사용한다면 보일러플레이트들이 많
이 제거되어 실제 로직에 더 집중 할 수 있습니다.
11. Property
/* Java */
public class PersonJava {
String firstNam;
String lastName;
int age;
public PersonJava(String firstName, String lastName, int age) {
this.firstNam = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstNam() {
return firstNam;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public void setFirstNam(String firstNam){
this.firstNam = firstNam;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public void setAge(int age){
this.age = age;
}
12. Property
/* Java */
public class PersonJava {
String firstNam;
String lastName;
int age;
public PersonJava(String firstName, String lastName, int age) {
this.firstNam = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstNam() {
return firstNam;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public void setFirstNam(String firstNam){
this.firstNam = firstNam;
}
public void setLastName(String lastName){
this.lastName = lastName;
}
public void setAge(int age){
this.age = age;
}
/* kotlin */
class PersonKotlin(
var firstName: String,
var lastName: String,
var age: Int)
13. Property
class Person {
var name: String = ""
get() = field.toUpperCase()
set(value) {
field = "Name : " + value
}
}
14. Property
class Person {
var name: String = ""
get() = field.toUpperCase()
set(value) {
field = "Name : " + value
}
}
person.name = "test"
15. Property
class Person {
var name: String = ""
get() = field.toUpperCase()
set(value) {
field = "Name : " + value
}
}
person.name = "test"
println(person.name) //NAME : TEST
16. Constructor
class Person(firstName: String, lastName: String, age: Int)
class Person constructor(firstName: String, lastName: String, age: Int)
val person = Person(“myeongin”, “woo”, 32)
17. Constructor
class Person(firstName: String, lastName: String, age: Int)
class Person constructor(firstName: String, lastName: String, age: Int)
val person = Person(“myeongin”, “woo”, 32)
class 이름 뒤에 constructor을 붙이는 것을 primary constructor 이라고 합니다.
기본적으로 생략해도 되지만 어노테이션을 붙여야 할 필요가 있을 경우에는 primary constructor
를 사용하고 constructor 앞에 annotation을 붙입니다.
18. Constructor
class Person(firstName: String, lastName: String, age: Int)
class Person constructor(firstName: String, lastName: String, age: Int)
val person = Person(“myeongin”, “woo”, 32)
class 이름 뒤에 constructor을 붙이는 것을 primary constructor 이라고 합니다.
기본적으로 생략해도 되지만 어노테이션을 붙여야 할 필요가 있을 경우에는 primary constructor
를 사용하고 constructor 앞에 annotation을 붙입니다.
class Persion @Inject constructor(firstName: String, lastName: String, age: Int)
23. Constructor
class Person(val name: String) {
constructor(name: String, parent: Person) : this(name)
}
firstConstructor 호출
Java에서 생성자가 여러개인 경우를 Kotlin 에서는 위와 같이 표현합니다.
24. Data class
/* Java */
public class JavaPerson {
private String firstName;
private String lastName;
private int age;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
JavaPerson that = (JavaPerson) o;
if (age != that.age) {
return false;
}
if (firstName != null ? !firstName.equals(that.firstName) : that.firstName !=
return false;
}
return lastName != null ? lastName.equals(that.lastName) : that.lastName
}
@Override
public int hashCode() {
int result = firstName != null ? firstName.hashCode() : 0;
result = 31 * result + (lastName != null ? lastName.hashCode() : 0);
result = 31 * result + age;
return result;
}
}
25. Data class
data class dataClassPerson(val firstName: String,
val lastName: String,val age: Int)
26. Data class
/* Kotlin */
class Person(val firstName: String, val lastName: String, val age: Int)
data class DataClassPerson(val firstName: String, val lastName: String,
val age: Int)
27. Data class
/* Kotlin */
class Person(val firstName: String, val lastName: String, val age: Int)
data class DataClassPerson(val firstName: String, val lastName: String,
val age: Int)
val person = Person("myeongin", "woo", 24)
val person2 = Person("myeongin", "woo", 24)
val dataClassPerson = DataClassPerson("myeongin", "woo", 24)
val dataClassPerson2 = DataClassPerson("myeongin", "woo", 24)
28. Data class
/* Kotlin */
class Person(val firstName: String, val lastName: String, val age: Int)
data class DataClassPerson(val firstName: String, val lastName: String,
val age: Int)
val person = Person("myeongin", "woo", 24)
val person2 = Person("myeongin", "woo", 24)
val dataClassPerson = DataClassPerson("myeongin", "woo", 24)
val dataClassPerson2 = DataClassPerson("myeongin", "woo", 24)
println(person == person2) //false
println(dataClassPerson == dataClassPerson2) //true
println(person.toString()) //Main$Person@76ed5528
println(dataClassPerson.toString()) //DataClassPErson(
firstName=myeongin, lastName=woo, age=24)
29. Data class
/* Kotlin */
data class Person(val firstName: String, val lastName: String, val age: Int)
val person = Person("myeongin", "woo", 24)
println(person.component1()) // myeongin
println(person.component2()) // woo
println(person.component3()) // 24
30. Data class
/* Kotlin */
data class Person(val firstName: String, val lastName: String, val age: Int)
val person = Person("myeongin", "woo", 24)
println(person.component1()) // myeongin
println(person.component2()) // woo
println(person.component3()) // 24
val (firstName, lastName, age) = person
31. Data class
/* Kotlin */
data class Person(val firstName: String, val lastName: String, val age: Int)
val person = Person("myeongin", "woo", 24)
println(person.component1()) // myeongin
println(person.component2()) // woo
println(person.component3()) // 24
val (firstName, lastName, age) = person
println(firstName) // myeongin
println(lastName) // woo
println(age) // 24
32. Data class
/* Kotlin */
data class Person(val firstName: String, val lastName: String, val age: Int)
val person = Person("myeongin", "woo", 24)
println(person.component1()) // myeongin
println(person.component2()) // woo
println(person.component3()) // 24
val (firstName, lastName, age) = person
println(firstName) // myeongin
println(lastName) // woo
println(age) // 24
val copyPerson = person.copy(age = 19)
33. Data class
/* Kotlin */
data class Person(val firstName: String, val lastName: String, val age: Int)
val person = Person("myeongin", "woo", 24)
println(person.component1()) // myeongin
println(person.component2()) // woo
println(person.component3()) // 24
val (firstName, lastName, age) = person
println(firstName) // myeongin
println(lastName) // woo
println(age) // 24
val copyPerson = person.copy(age = 19)
println(copyPerson) // Person(firstName=myeongin, lastName=woo, age=19)
34. Data class
• 제약사항
• primary constructor가 있어야 합니다.
• 1개 이상의 파라미터가 있어야 합니다.
• 파라미터는 모두 프로퍼티 이어야 합니다. (val or var)
• abstract, open, sealed, inner 가 아니어야 합니다.
• 장점
• 컴파일러가 equals(), hashCode()를 생성해줍니다.
• toString()을 만들어 줍니다.
• componentN() 함수를 제공합니다. (Destructuring)
• copy() 메소드도 만들어 줍니다.
35. DefaultValue
/* Java */
class JavaPerson {
private JavaPerson(JavaPersonBuilder builder) {
name = builder.name;
age = builder.age;
email = builder.email;
isAdult = builder.isAdult;
}
private String name;
private int age;
private String email;
private boolean isAdult;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getEmail() {
return email;
}
public boolean isAdult() {
return isAdult;
}
@Override
public String toString() {
return "name : " + name + ", age : " + age +
", email : " + email + ", isAdult : "+ isAdult;
}
public static class JavaPersonBuilder {
private String name = "Lezhin";
private int age = 3;
private String email = null;
private boolean isAdult = false;
public JavaPersonBuilder setName(String name) {
this.name = name;
return this;
}
public JavaPersonBuilder setAge(int age) {
this.age = age;
return this;
}
public JavaPersonBuilder setEmail(String email) {
this.email = email;
return this;
}
public JavaPersonBuilder setIsAdult(boolean isAdult) {
this.isAdult = isAdult;
return this;
}
public JavaPerson build() {
return new JavaPerson(this);
}
}
}
38. DefaultValue
data class Person(val name: String = "Lezhin", val age: Int = 3,
val email: String? = null, val isAdult: Boolean = false)
val person = Person()
println(person)
39. DefaultValue
data class Person(val name: String = "Lezhin", val age: Int = 3,
val email: String? = null, val isAdult: Boolean = false)
val person = Person()
println(person)
//Person(name=Lezhin, age=3, email=null, isAdult=false)
40. DefaultValue
data class Person(val name: String = "Lezhin", val age: Int = 3,
val email: String? = null, val isAdult: Boolean = false)
val person = Person()
println(person)
//Person(name=Lezhin, age=3, email=null, isAdult=false)
val person2 = Person("myeongin", 32)
println(person2)
41. DefaultValue
data class Person(val name: String = "Lezhin", val age: Int = 3,
val email: String? = null, val isAdult: Boolean = false)
val person = Person()
println(person)
//Person(name=Lezhin, age=3, email=null, isAdult=false)
val person2 = Person("myeongin", 32)
println(person2)
//Person(name=myeongin, age=32, email=null, isAdult=false)
42. DefaultValue
data class Person(val name: String = "Lezhin", val age: Int = 3,
val email: String? = null, val isAdult: Boolean = false)
val person = Person()
println(person)
//Person(name=Lezhin, age=3, email=null, isAdult=false)
val person2 = Person("myeongin", 32)
println(person2)
//Person(name=myeongin, age=32, email=null, isAdult=false)
val person3 = Person(age=32, isAdult = true)
println(person3)
43. DefaultValue
data class Person(val name: String = "Lezhin", val age: Int = 3,
val email: String? = null, val isAdult: Boolean = false)
val person = Person()
println(person)
//Person(name=Lezhin, age=3, email=null, isAdult=false)
val person2 = Person("myeongin", 32)
println(person2)
//Person(name=myeongin, age=32, email=null, isAdult=false)
val person3 = Person(age=32, isAdult = true)
println(person3)
//Person(name=Lezhin, age=32, email=null, isAdult=true)
46. Class(enum)
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
val green: Color = Color.GREEN
val red: Color = Color.valueOf("RED")
val colorList: Array<Color> = Color.values()
47. Class(inheritance)
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}
49. Class(inheritance)
• Kotlin의 class는 기본적으로 final 입니다.
• final class는 상속이 되지 않습니다.
• override 할 메소드에는 override 키워드를 붙여줍니다.(Java의
@Override와 동일)
50. Class(inheritance)
• Kotlin의 class는 기본적으로 final 입니다.
• final class는 상속이 되지 않습니다.
• override 할 메소드에는 override 키워드를 붙여줍니다.(Java의
@Override와 동일)
• 상속 가능한 class를 만드려면 open, abstract키워드를 사용합
니다.
• open과 abstract 모두 자바의 abstract와 비슷합니다.
• open class는 instance를 생성 할 수 있지만 abstract class는
instance를 생성 할 수 없습니다.
51. Class(open)
open class Foo {
open val x: Int get { ... }
}
class Bar1 : Foo() {
override val x: Int = ...
}
52. Class(open)
open class Foo {
open val x: Int get { ... }
}
class Bar1 : Foo() {
override val x: Int = ...
}
• property 도 override가 가능합니다.
53. Class(open)
open class Base {
open fun v() {}
fun nv() {}
}
class Derived() : Base() {
override fun v() {}
}
54. Class(open)
open class Base {
open fun v() {}
fun nv() {}
}
class Derived() : Base() {
override fun v() {}
}
• open이 없는 property와 function은 final 이기 때문에
override 할 수 없습니다.
55. Class(open)
interface Foo {
val count: Int
}
class Bar1(override val count: Int) : Foo
class Bar2 : Foo {
override var count = 0
}
56. Class(open)
interface Foo {
val count: Int
}
class Bar1(override val count: Int) : Foo
class Bar2 : Foo {
override var count = 0
}
• val 을 var 로도 override 할 수 있습니다. 반대는 안됩니다.
61. Interface
interface say {
fun hello()
}
class Person(val name: String, val age: Int) : Say{
override fun hello() {
println("Hello")
}
}
62. Interface
interface say {
fun hello()
fun hi() { println("Hi") }
}
class Person(val name: String, val age: Int) : Say{
override fun hello() {
println("Hello")
}
}
63. Interface
• Kotlin은 Interface의 body도 구현 가능합니다.
interface say {
fun hello()
fun hi() { println("Hi") }
}
class Person(val name: String, val age: Int) : Say{
override fun hello() {
println("Hello")
}
}
64. Interface
interface Korean {
fun hello() { println("안녕") }
}
interface Newyorker {
fun hello() { println("Hello")}
}
class Person(val name: String, val age: Int) : Korean, Newyorker {
override fun hello() {
super<Korean>.hello()
super<Newyorker>.hello()
}
}
65. Interface
• Kotlin은 서로 다른 interface들이 같은 method 정의 및 구현
이 가능하며, 각각 호출 할 수 있습니다.
interface Korean {
fun hello() { println("안녕") }
}
interface Newyorker {
fun hello() { println("Hello")}
}
class Person(val name: String, val age: Int) : Korean, Newyorker {
override fun hello() {
super<Korean>.hello()
super<Newyorker>.hello()
}
}
66. Class(sealed)
/* Sealed classes */
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
67. Class(sealed)
• enum class와 매우 유사합니다.
• enum은 각 object들이 같은 생성자와 같은 함수들을 갖지만, sealed
class는 object의 hierarchies 제한만 갖고 별도의 생성자와 프로퍼티를 갖
을 수 있습니다.
/* Sealed classes */
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
68. Class(sealed)
/* Interface */
interface Expr
data class Const(val number: Double) : Expr
data class Sum(val e1: Expr, val e2: Expr) : Expr
object NotANumber : Expr
/* Sealed classes */
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
69. Class(sealed)
• interface 로도 같은 효과를 낼 수 있습니다.
/* Interface */
interface Expr
data class Const(val number: Double) : Expr
data class Sum(val e1: Expr, val e2: Expr) : Expr
object NotANumber : Expr
/* Sealed classes */
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
70. Class(sealed)
/* Sealed classes */
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
}
71. Class(sealed)
/* Sealed classes */
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
}
/* interface */
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
else -> throw IllegalArgumentException("error")
}
72. Class(sealed)
/* Sealed classes */
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
// the `else` clause is not required because we've covered all the cases
}
/* interface */
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
else -> throw IllegalArgumentException("error")
// the `else` clause is not required because we've covered all the cases
}
• 비슷한 효과를 낼 수 있지만 when 표현식을 사용할 때 else를 작성 하냐 마냐 하는 차이가 있습니다.
• Sealed나 enum 을 사용 하게 되면 case 들이 명확해집니다. 따라서 생각 하지 않은 케이스(사전에 정의하지 않은 케이스
)를 사전에 방지해 주고, 사전에 정의한 case 에 대해 실수로 인한 누락을 컴파일 타임에 잡아줍니다. 즉 훨씬 안전하고
명확한 코딩을 할 수 있습니다.