text:
from __future__ import unicode_literals

from django.contrib.contenttypes.fields import GenericRelation
from django.db import models
from django.urls import reverse
from django.utils.encoding import python_2_unicode_compatible

from dcim.fields import ASNField
from extras.models import CustomFieldModel, CustomFieldValue
from tenancy.models import Tenant
from utilities.utils import csv_format
from utilities.models import CreatedUpdatedModel
from .constants import *

def humanize_speed(speed):
    """
    Humanize speeds given in Kbps (e.g. 10000000 becomes '10 Gbps')
    """
    if speed >= 1000000000 and speed % 1000000000 == 0:
        return '{} Tbps'.format(speed / 1000000000)
    elif speed >= 1000000 and speed % 1000000 == 0:
        return '{} Gbps'.format(speed / 1000000)
    elif speed >= 1000 and speed % 1000 == 0:
        return '{} Mbps'.format(speed / 1000)
    elif speed >= 1000:
        return '{} Mbps'.format(float(speed) / 1000)
    else:
        return '{} Kbps'.format(speed)

@python_2_unicode_compatible
class Provider(CreatedUpdatedModel, CustomFieldModel):
    """
    Each Circuit belongs to a Provider. This is usually a telecommunications company or similar organization. This model
    stores information pertinent to the user's relationship with the Provider.
    """
    name = models.CharField(max_length=50, unique=True)
    slug = models.SlugField(unique=True)
    asn = ASNField(blank=True, null=True, verbose_name='ASN')
    account = models.CharField(max_length=30, blank=True, verbose_name='Account number')
    portal_url = models.URLField(blank=True, verbose_name='Portal')
    noc_contact = models.TextField(blank=True, verbose_name='NOC contact')
    admin_contact = models.TextField(blank=True, verbose_name='Admin contact')
    comments = models.TextField(blank=True)
    custom_field_values = GenericRelation(CustomFieldValue, content_type_field='obj_type', object_id_field='obj_id')

    csv_headers = ['name', 'slug', 'asn', 'account', 'portal_url']

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('circuits:provider', args=[self.slug])

    def to_csv(self):
        return csv_format([
            self.name,
            self.slug,
            self.asn,
            self.account,
            self.portal_url,
        ])

@python_2_unicode_compatible
class CircuitType(models.Model):
    """
    Circuits can be organized by their functional role. For example, a user might wish to define CircuitTypes named
    "Long Haul," "Metro," or "Out-of-Band".
    """
    name = models.CharField(max_length=50, unique=True)
    slug = models.SlugField(unique=True)

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return "{}?type={}".format(reverse('circuits:circuit_list'), self.slug)

@python_2_unicode_compatible
class Circuit(CreatedUpdatedModel, CustomFieldModel):
    """
    A communications circuit connects two points. Each Circuit belongs to a Provider; Providers may have multiple
    circuits. Each circuit is also assigned a CircuitType and a Site. A Circuit may be terminated to a specific device
    interface, but this is not required. Circuit port speed and commit rate are measured in Kbps.
    """
    cid = models.CharField(max_length=50, verbose_name='Circuit ID')
    provider = models.ForeignKey('Provider', related_name='circuits', on_delete=models.PROTECT)
    type = models.ForeignKey('CircuitType', related_name='circuits', on_delete=models.PROTECT)
    tenant = models.ForeignKey(Tenant, related_name='circuits', blank=True, null=True, on_delete=models.PROTECT)
    install_date = models.DateField(blank=True, null=True, verbose_name='Date installed')
    commit_rate = models.PositiveIntegerField(blank=True, null=True, verbose_name='Commit rate (Kbps)')
    description = models.CharField(max_length=100, blank=True)
    comments = models.TextField(blank=True)
    custom_field_values = GenericRelation(CustomFieldValue, content_type_field='obj_type', object_id_field='obj_id')

    csv_headers = ['cid', 'provider', 'type', 'tenant', 'install_date', 'commit_rate', 'description']

    class Meta:
        ordering = ['provider', 'cid']
        unique_together = ['provider', 'cid']

    def __str__(self):
        return '{} {}'.format(self.provider, self.cid)

    def get_absolute_url(self):
        return reverse('circuits:circuit', args=[self.pk])

    def to_csv(self):
        return csv_format([
            self.cid,
            self.provider.name,
            self.type.name,
            self.tenant.name if self.tenant else None,
            self.install_date.isoformat() if self.install_date else None,
            self.commit_rate,
            self.description,
        ])

    def _get_termination(self, side):
        for ct in self.terminations.all():
            if ct.term_side == side:
                return ct
        return None

    @property
    def termination_a(self):
        return self._get_termination('A')

    @property
    def termination_z(self):
        return self._get_termination('Z')

    def commit_rate_human(self):
        return '' if not self.commit_rate else humanize_speed(self.commit_rate)
    commit_rate_human.admin_order_field = 'commit_rate'

@python_2_unicode_compatible
class CircuitTermination(models.Model):
    circuit = models.ForeignKey('Circuit', related_name='terminations', on_delete=models.CASCADE)
    term_side = models.CharField(max_length=1, choices=TERM_SIDE_CHOICES, verbose_name='Termination')
    site = models.ForeignKey('dcim.Site', related_name='circuit_terminations', on_delete=models.PROTECT)
    interface = models.OneToOneField(
        'dcim.Interface', related_name='circuit_termination', blank=True, null=True, on_delete=models.PROTECT
    )
    port_speed = models.PositiveIntegerField(verbose_name='Port speed (Kbps)')
    upstream_speed = models.PositiveIntegerField(
        blank=True, null=True, verbose_name='Upstream speed (Kbps)',
        help_text='Upstream speed, if different from port speed'
    )
    xconnect_id = models.CharField(max_length=50, blank=True, verbose_name='Cross-connect ID')
    pp_info = models.CharField(max_length=100, blank=True, verbose_name='Patch panel/port(s)')

    class Meta:
        ordering = ['circuit', 'term_side']
        unique_together = ['circuit', 'term_side']

    def __str__(self):
        return '{} (Side {})'.format(self.circuit, self.get_term_side_display())

    def get_peer_termination(self):
        peer_side = 'Z' if self.term_side == 'A' else 'A'
        try:
            return CircuitTermination.objects.select_related('site').get(circuit=self.circuit, term_side=peer_side)
        except CircuitTermination.DoesNotExist:
            return None

    def port_speed_human(self):
        return humanize_speed(self.port_speed)
    port_speed_human.admin_order_field = 'port_speed'

    def upstream_speed_human(self):
        return '' if not self.upstream_speed else humanize_speed(self.upstream_speed)
    upstream_speed_human.admin_order_field = 'upstream_speed'


text:
(function () {

    function addAccordionFunctionality() {

        // collapse h1 level if not on print view
        if(window.location.href.indexOf("printView") == -1) {
            $('.h1NestedLevel ol').each(function () {
                $(this).hide();
            });

            // expand all on click
            $('.h1NestedLevel li[data-sectiontype="HEADING1"]  > div[id^=linkClick]').click(function() {
                $(this).parent().find('ol').slideToggle();
                var image =  $('#' + this.id.replace('linkClick', 'toggleImg')).get(0);

                if( image.src.indexOf("/library/image/sakai/white-arrow-right.gif")!=-1 ) {
                    image.src = "/library/image/sakai/white-arrow-down.gif";
                } else {
                    image.src = "/library/image/sakai/white-arrow-right.gif";
                }
            });
        }
    }

    $(document).ready(function(){
        addAccordionFunctionality();
    });
}());

redpajama_set_name: RedPajamaGithub


text:
+++
title = ""
date = "1-01-01"
categories = ["mind-and-iron"]
original_url = "http://ctlente.com/pt/teaching/stringr-lubridate/"
+++

<body>
<textarea id="source">
class: center, middle, inverse, title-slide \# Introdução ao R:
Stringr/Lubridate \#\#\# Caio Lente + Curso-R \#\#\# 2018-01-22 --- \#
Índice O que veremos hoje: -- - Stringr - O que são strings? 🎻 - Mexer
com strings é fácil 😄 - Regex 🤢 - Mexer com strings é dífícil 😞 -- -
Lubridate - O que são datas? 📆 - Criando datas 🤕 - Mexer com datas é
fácil 😄 - Mexer com datas é difícil 😞 --- \# Nossa motivação "Por que
vamos aprender a mexer com strings e datas?" e "Por que tem que ser com
esses pacotes dos quais eu nunca ouvi falar?" Porque: - Variáveis que
trazem textos ou datas são extremamente **importantes** - Raramente
encontramos tabelas que contém somente números e valores binários - O R
`base` tem funções muito <s>ruins</s> pouco consistentes para lidar com
esses tipos de dados - Os pacotes `lubridate` e `stringr` são excelentes
opções que já vêm embutidas no **tidyverse** - Ambos foram idealizados
por <s>um anjo que roubou meu coração</s> Hadley Wickham ---
background-image:
url("<https://images.unsplash.com/photo-1505218795627-2b9746a5343f?dpr=1&auto=format&fit=crop&w=1000&q=80&cs=tinysrgb%22>)
background-position: 50% 50% class: center, middle, inverse \# STRINGR
--- class: inverse, center, middle \# O que são strings? --- \# O básico
Strings não passam de sequências de caracteres! Em português o termo é
literalmente traduzido como *cadeia de caracteres*.
`r minha_primeira_string <- "Eu adoro o IME!" minha_primeira_string`
`#> [1] "Eu adoro o IME!"` -- Strings aceitam praticamente
qualquer coisa que está entre aspas, então podemos ir à loucura:
`r minha_segunda_string <- "こんにちは! Está 40\u00BAC na lá ɐɹoɟ" minha_segunda_string`
`#> [1] "こんにちは! Está 40ºC na lá ɐɹoɟ"`
-- **EX:** Rode a função `class()` em uma string. O que ela realmente é?
--- \# Escapando pela tangente O que acontece se tentarmos colocar uma
expressão entre aspas dentro de uma string?
`r "Meu nome é "Caio Lente""` -- O R não nos
permite fazer isso! Temos duas alternativas:
`r "Meu nome é 'Caio Lente'" "Meu nome é \"Caio Lente\""`
-- A segunda estratégia usa o que chamamos de *escaping*: um símbolo
(`\`) que indica que o próximo caractere não é o que parece.
`r cat("Meu nome é \"Caio Lente\"")`
`#> Meu nome é "Caio Lente"` -- **EX:** Verifique as
diferenças entre o comportamento entre `print()` e `cat()`. --- \#
Caracteres especiais Usando a nossa nova ferramenta, podemos descrever
uma infinitude de caracteres não tradicionais.
`r cat("Uma lista feita à mão:\n\t-Item 1;\n\t-Item dois.")`
`#> Uma lista feita à mão: #> -Item 1; #> -Item dois.`
Os caracteres especiais `\n` e `\t` indicam respectivamente uma nova
linha e uma tabulação. -- Se não pudermos usar caracteres não-ASCII
(como é com o CRAN), podemos usar a barra oblíqua aliada a códigos
Unicode para descrever qualquer caractere imaginável:
`r "\u03b1\u03b2\u03b3"`
`#> [1] "αβγ"` --- \# Vetores de strings
Em outras linguagens (como C), strings são vetores, o que quer dizer que
cada posição de uma string corresponde a um caractere! Já no R,
`character` é uma **classe atômica** e então isso não acontece.
`r c("Um", "vetor", "de", "strings")[4]`
`#> [1] "strings"` -- Isso pode ser um pouco difícil de
entender se você já programou em alguma linguagem diferente de R, mas
não demora pra pegar o jeito. A única coisa com que precisamos tomar
cuidado é **fechar todas as aspas**! Mesmo que estejamos em um vetor,
deixar uma aspa aberta vai fazer o console ficar esperando pelo final da
string:
`r > c("Estou declarando", "um vetor", "de strings + + + SOCORRO!`
--- \# Até agora - `character` (genericamente conhecido como "string") é
um tipo de dado que serve para amazenar textos - Podemos incluir
praticamente qualquer coisa em uma string - Usando a barra oblíqua para
a esquerda, espapamos o caractere que a segue - Podemos criar vetores de
strings como com qualquer outro tipo de dado -- \#\#\# Exercício Crie um
vetor que carrega dois pequenos textos. Cada texto deve ter dois
parágrafos cada e cada parágrafo deve ter pelo menos 3 linhas. Cada
parágrafo deve começar com uma tabulação e nenhuma linha pode passar de
80 caracteres. Pelo menos um dos textos deve ter uma citação. **Dicas:**
Para saber quantos caracteres tem cada linha, use o contador na esquerda
inferior do RStudio. Escreva cada linha separadamente e depois junte-as
com caracteres especiais.d --- class: inverse, center, middle \# Mexer
com strings é fácil --- \# O pacote stringr Todas as funções do
`stringr` começam com o prefixo `str_`. Isso facilita muito quando
precisamos buscar buscar alguma coisa no nosso environment!
`r library(stringr)` -- **EX:** Carregue o `stringr` e procure por suas
funções usando a tecla TAB. -- A função mais básica do pacote é
`str_length()`, que retorna o número de caracteres em uma string. Como
todas as funções do `stringr` são vetorizadas, o primeiro argumento
delas pode ter tanto uma única string quando um vetor de strings.
`r str_length(c("Um", "Dois", "Três ", "Quatro", "Cinco"))`
`#> [1] 2 4 5 6 5` -- **EX:** Verifique como são contados caracteres
escapados. --- \# As maravilhas da formatação Uma das tarefas mais
comuns que precisamos executar quando se trata de strings é transformar
um texto de formatação duvidosa em um texto com a formatação que
desejamos:
`r s <- "nAh uNIaUM xOvIeHtIkA, U MiGuXeixxXXxx ixXxKreVi vC" str_to_lower(s)`
`#> [1] "nah uniaum xoviehtika, u miguxeixxxxxx ixxxkrevi vc"`
`r str_to_upper(s)`
`#> [1] "NAH UNIAUM XOVIEHTIKA, U MIGUXEIXXXXXX IXXXKREVI VC"`
`r str_to_title(s)`
`#> [1] "Nah Uniaum Xoviehtika, U Miguxeixxxxxx Ixxxkrevi Vc"`
Agora o texto está muito mais compreensível! --- \# Tirando pedaços
Outra utilidade importante é retirar fatias indesejadas de strings. Se
tivermos um texto com espaços extras no início e no final, podemos
recorrer à função `str_trim()`:
`r str_trim(c("M", "F", "F", " M", " F ", "M"))`
`#> [1] "M" "F" "F" "M" "F" "M"`
-- **EX:** Tabulações são consideradas espaços? -- Já a função
`str_sub()` usa as posições dos caracteres nas strings para determinar o
que remover:
`r str_sub(c("__SP__", "__MG__", "__RJ__"), start = 3, end = 4)`
`#> [1] "SP" "MG" "RJ"` -- **EX:**
Teste `str_sub()` dando valor só para `start` ou só para `end`. O que
acontece se passarmos números negativos para ambos os parâmetros? --- \#
Concatenação Assim como temos `length()` e `str_length()`, temos `c()` e
`str_c()`: `r str_c("O valor p é: ", "0.03")`
`#> [1] "O valor p é: 0.03"` -- **EX:** E se
passássemos uma variável numérica para essa função? -- Vetorização
também não é um problema para a `str_c()`:
`r s1 <- c("O R", "O Java") s2 <- c("bom", "ruim") str_c(s1, " é muito ", s2)`
`#> [1] "O R é muito bom" "O Java é muito ruim"`
-- **EX:** Use o argumento `sep` para remover a repetição de espaços.
Use o argumento `collapse` para juntar as duas frases em uma. --- \# Até
agora - Com `str_length()` podemos contar quantos caracteres tem uma
string - Com `str_to_*()` podemos formatar uma string facilmente - Com
`str_trim()` e `str_sub()` podemos retirar pedaços de strings - Com
`str_c()` podemos concatenar strings -- \#\#\# Exercício Partindo do
vetor de strigs `vs`, obtenha o texto `s`:
`r vs <- c("***O número " , "de caRACTeres", " nEste TexTO", "é") s <- "o número de caracteres neste texto é 36"`
**Dicas:** Use pipes (você só precisará de uma pipeline) e lembre-se do
*placeholder*. Para saber se ambos os textos obtidos são iguais, use o
operador de igualdade (`=`) normalmente. ??? vs %>% str\_trim()
%>% str\_c(collapse = " ") %>% str\_to\_lower() %>%
str\_sub(start = 4) %>% str\_c(str\_length(.), sep = " ") --- class:
inverse, center, middle \# Regex --- \# Expressões regulares *Regular
expressions* ou somente "regex" são uma ferramenta que usamos para
capturar padrões em strings. Veja um pequeno exemplo com a função
`str_detect()` (que detecta se uma determinada string apresenta um certo
padrão):
`r str_detect(c("banana", "BANANA", "maca", "nona"), pattern = "na")`
`#> [1] TRUE FALSE FALSE TRUE` -- Alguns caracteres tem significados
especiais dentro de expressões regulares para que possamos fazer
casamentos (*matchings*) mais interessantes. Os caracteres `.`, `^` e
`$` casam respectivamente com qualquer caractere, o início de uma string
e o final de uma string. -- **EX:** Mude o valor do argumento `pattern`
no código acima para que a expressão dê match com qualquer string que
tenha como segunda letra um `a` minúsculo. --- \# Caracteres especiais
(o retorno) Mas o que acontece se quisermos dar match em um ponto? Ou em
um cifrão? Assim como fizemos na primeira parte da aula, usando a `\`
podemos escapar um caractere também em regex! Mas tem um problema... Se
usarmos `\.` para tentar dar match em um ponto, o R vai escapar a barra
e assim obter somente um ponto (concluíndo erroneamente que falta alguma
coisa no padrão). Precisamos então escapar **duas vezes**!
`r str_detect(c("ba.ana", "BANA.A", "ma.a", "n.na"), pattern = "a\\.a")`
`#> [1] TRUE FALSE TRUE FALSE` -- **EX:** Como faríamos para dar
match em um padrão já escapado (como "\\\\.")? Dê match em um caractere
de nova linha e em um caractere de tabulação. -- **REGRA GERAL**: Quando
em dúvida, divida ou multiplique o número de barras por 2... Não é
elegante, mas com o tempo você vai pegando o jeito. --- \# Quantos e
quais Outra funcionalidade interessante do regex é a possibilidade de
passar um número de vezes para um padrão se repetir. `+` indica que um
padrão se repete uma ou mais vezes, `*` indica que um padrão se repete
zero ou mais vezes, e `{m,n}` indica que um padrão se repete entre `m` e
`n` vezes (variações importantes são `{m}`, `{,n}` e `{m,}`).
`r str_detect(c("oi", "oii", "oiii", "oiiii"), pattern = "oi{3,}e*")`
`#> [1] FALSE FALSE TRUE TRUE` -- Também importante são os marcadores
de conjuntos. Tudo que estiver dentro de um `()` vai ser tratado como
uma unidade indivisível; já colocando caracteres dentro de um `[]`,
casamos com qualquer um deles.
`r str_detect(c("banana", "baNANA", "BAnana"), ".[Aa](na){2}")`
`#> [1] TRUE FALSE TRUE` --- \# Miscelânea Alguns outros padrões de
regex que podem se fazer úteis: - `[a-z]`, `[A-Z]` e `[0-9]` casam com
letras minúsculas, letras maiúsculas e números (é possível usá-los
juntos) - `[^abc]` casa com qualquer coisa **menos** `a`, `b` e `c` -
`a?` casa com 0 ou 1 `a`
`r str_detect(c("ba ana", "BANANA", "maca", "nona"), "[^Bn]a ?[ca]")`
`#> [1] TRUE FALSE TRUE FALSE` -- Se você estiver se sentindo um
pouco perdido, não se preocupe: regex não é um assunto simples. Não
fique com medo de consultar tutoriais ou *cheat sheets* na hora que
bater uma dúvida! O melhor recurso ao qual temos acesso quando
programando em R é o comando a seguir, que mostra todos os padrões que o
`stringr` aceita: `r ?stringi::stringi-search-regex` --- \# Até agora -
Regex é uma ferramenta que nos permite detectar padrões em strings -
Caracteres como `.`, `^` e `$` casam em situações especiais -
Quantificadores como `?`, `+`, `*` e `{m,n}` determinam quantas vezes um
padrão casa - `[]` e `()` determinam conjuntos de padrões -- \#\#\#
Exercício Dado o corpus presente em `stringr::words`, crie expressões
regulares que casem com as palavras que: - Começam com 3 consoantes -
Têm 3 ou mais vogais em sequência - Têm duas ou mais ocorrências onde
uma vogal precede uma consoante **Dica:** Usem `str_view()` com
`match = TRUE` para ver todas as palavras retornadas pelo matching. ---
class: inverse, center, middle \# Mexer com strings é dífícil --- \# Não
entre em pânico Essa seção tem "difícil" no nome, mas ela não é tão
difícil assim. Não vou ensinar praticamente nenhum outro comando de
regex, mas aqui você vai precisar entender como o regex se encaixa com
as funções mais importantes do stringr. Também não perca de vista que,
apesar de os exemplos até agora terem sido em vetores de strings, na
vida real você proavavelmente estaria aplicando essas funções nas
colunas de uma tabela. -- E se você precisar de um incentivo... ---
class: center, middle
![](https://media.giphy.com/media/100QWMdxQJzQC4/giphy.gif) --- \#
Substituição Uma das tarefas mais comuns no tratamento de strings é a
substituição de um padrão por outro. Para isso temos as funções
`str_replace()` e `str_replace_all()` que substituem, respectivamente, o
primeiro ou todos os padrões encontrados.
`r str_replace("banana", pattern = "na", replacement = "XX")`
`#> [1] "baXXna"` -- Uma funcionalidade destas (e outras)
funções é a possibilidade de usar o padrão procurado na substituição
usando referências. Simplesmente use padrões da forma `\\N` no
`replacement` onde `N` é o índice de um `()`:
`r str_replace_all("banana", pattern = "(na)", replacement = "XX\\1")`
`#> [1] "baXXnaXXna"` -- **EX:** Dado um número de 11
dígitos, transforme-o em um CPF da forma `544.916.518-84`. --- \#
Extração Com `str_extract()` e `str_extract_all()`, extraímos padrões de
strings. Podemos usar isso para tirar de uma string apenas a parte de
casa com um padrão:
`r pessoas <- c("João Silva", "Joana Lima", "Madonna") str_extract(pessoas, pattern = "[:alpha:]+$")`
`#> [1] "Silva" "Lima" "Madonna"`
`r str_extract_all(pessoas, pattern = "[A-Z]")`
`#> [[1]] #> [1] "J" "S" #> #> [[2]] #> [1] "J" "L" #> #> [[3]] #> [1] "M"`
--- \# Matching Com `str_match()` e `str_match_all()` conseguimos
quebrar strings em matrizes onde cada coluna é uma parte do match. No
caso abaixo, a primeira coluna é o match todo, a segunda é o primeiro
`()` e a terceira é o segundo `()`.
`r pessoas <- c("Silva, João", "Lima, Joana", "Madonna") str_match(pessoas, pattern = "(.*), ([:alpha:]+)")`
`#> [,1] [,2] [,3] #> [1,] "Silva, João" "Silva" "João" #> [2,] "Lima, Joana" "Lima" "Joana" #> [3,] NA NA NA`
-- No código acima, `:alpha:` representa o conjunto dos caracteres
alfabéticos (tanto com quanto sem acento). Isso resolve o problema no
qual `[a-zA-Z]` não casaria com `João`. -- **EX:** O que acontece
quando quebramos as strings do vetor `pessoas` em todas as letras
(usando `str_match_all()`)? --- \# Quebra Se quisermos quebrar uma
string em certos pontos podemos usar `str_split()`. Essa função usa um
padrão e divide uma string em um vetor de strings quebrando-a exatamente
onde encontrar o padrão.
`r str_split("Você quer um vetor @?", pattern = " ")`
`#> [[1]] #> [1] "Você" "quer" "um" "vetor" "@?"`
-- Através de `str_split_fixed()` podemos limitar o número máximo de
quebras (mas aí voltamos a obter uma tabela):
`r str_split_fixed("Você quer um vetor @?", pattern = " ", n = 3)`
`#> [,1] [,2] [,3] #> [1,] "Você" "quer" "um vetor @?"`
--- \# Até agora - Para substituir um padrão por um texto, podemos usar
`str_replace()` - Para extrar um padrão de uma string, podemos usar
`str_extract()` - Para casar um padrão com um texto, podemos usar
`str_match()` - Para quebrar uma string onde ocorre um padrão, podemos
usar `str_split()` -- \#\#\# Exercício Partindo de `stringr::sentences`,
crie o vetor `no_the`, onde todas as ocorrências da palavra "the" (ou
"The") são removidas (mas tendo em mente que as frases devem continuar
começando com letra maiúscula) **Dica:** Tente criar uma tabela com
`stringr::sentences` para poder operar em colunas usando
`dplyr::mutate()`. É possível resolver esse problema com apenas uma
pipeline. ??? ss %>% str\_replace\_all("\[Tt\]he ?", "") %>%
dplyr::tibble(sentence = .) %>% dplyr::mutate( first =
str\_extract(sentence, "[1]"), first = str\_to\_upper(first), sentence =
str\_replace(sentence, "[2]", first)) %>% dplyr::pull(sentence) ---
background-image:
url("<https://images.unsplash.com/photo-1435527173128-983b87201f4d?dpr=1&auto=format&fit=crop&w=1000&q=80&cs=tinysrgb%22>)
background-position: 50% 50% class: center, middle, inverse \# LUBRIDATE
--- class: inverse, center, middle \# O que são datas? --- \# O básico
Quando tratamos de datas e horários em liguagens de programação,
geralmente estamos falando sobre um **número** que será expresso como
uma **string**. `r library(lubridate) now()`
`#> [1] "2018-01-29 20:35:19 -02"` -- Acima vemos que
`now()` retorna o *datetime* (data-hora) atual*, incluindo o fuso
horário no qual estamos. Mas se convertermos essa pseudo-string para
`integer`, vemos que o número retornado não faz muito sentido...
`r as.integer(now())` `#> [1] 1517265319` .footnote\[\[\*\] Ele era
atual quando eu fiz os slides...\] --- \# Unix time *Unix time\* é a
forma como todos os aparelhos eletrônicos modernos sabem que horas são.
O número enorme que vimos no slide anterior represente quantos
**segundos** se passaram desde o início do dia 01/01/1970.
`r as.integer(as_datetime("1970-01-01 00:00:00"))`
`#> [1] 0` -- **EX:** O que acontece quando convertemos uma data-hora
anterior a 1970? -- Agora que você sabe como datas e horas são
armazenadas, já é possível deduzir por que esse é um tipo de dado
problemático: nós pensamos em datas como um texto mas na verdade estamos
trabalhando com um número! `r now() + 2592000`
`#> [1] "2018-02-28 19:35:19 -03"` -- **EX:** O que de
interessante aconteceu quando adicionamos 1 mês a `now()`? --- \# ISO
8601 Como você já deve ter notado, todas as funções até agora retornavam
as datas e horários na forma `AAAA-MM-DD HH:MM:SS`. Isso não é à toa!
Este formato é... > ... definido pela *Organização Internacional para
Padronização* no padrão "ISO 8601" que define "elementos de dados e
formatos de intercâmbio para representação e manipulação de datas e
horas". -- Desta forma, todos os outros formatos (inclusive o que usamos
no dia-a-dia) precisa ser convertido antes de poder ser interpretado
pelos aparelhos eletrônicos. `r as_date("20/01/2018")`
`#> [1] NA` -- Agora já temos todos os ingredientes para um
problemão... Datas e horas são escritos como strings, mas representados
internamente como números e existe um padrão internacional para escrever
datas, mas nenhum país o usa. --- \# Até agora - Existem dois tipos
principais para trabalhar com datas e horários: `date` e `datetime` -
Com `today()` e `now()` podemos obter informações sobre a data-hora
atual (incluindo fuso horário) - Com `as_date()` e `as_datetime()`
conseguimos converter uma data ou data-hora no padrão ISO 8601 para o
formato compreendido pelo R -- \#\#\# Exercício Analise 3 conjuntos de
funções: `as_date()` e `as_datetime()`, `make_date()` e
`make_datetime()`, `date()`. O que diferencia esses grupos de funções?
Por que não existe uma função `datime()`? **Dica:** Para ler a
documentação de uma função, execute um comando da forma
`?nome_da_funcao`. Não se preocupe com os conceitos que você ainda não
viu, você não precisa deles para entender essas funções. --- class:
inverse, center, middle \# Criando datas --- \# Com datas bem formatadas
O jeito mais simples de criar uma data ou uma data-hora é com as
primeiras funções que vimos: `as_date()` e `as_datetime()`. Para que
elas funcionem, a entrada precisa estar praticamente 100% formatada no
ISO 8601. `r as_datetime("2018-01-20 00:02:05")`
`#> [1] "2018-01-20 00:02:05 UTC"` -- **EX:** Passe uma
data para `as_datetime()` e uma data-hora para `as_date()`. -- Como
também vimos na seção anterior, outro jeito de criar datas é passando
seus componentes individuais para `make_date()` e `make_datetime()`.
Este método é particularmente útil quando tratando tabelas!
`r make_date(2018, 01, 20)` `#> [1] "2018-01-20"` --- \#
Fugindo do ISO 8601 Se quisermos criar uma data (sem horário), podemos
usar a família `dmy()`, `ymd()`, `mdy()` e assim por diante... Elas
procuram os campos (*day*, *month* e *year*) na ordem em que a
respectiva letra aparece no nome da função.
`r dmy("20/01/2018")` `#> [1] "2018-01-20"` --
**EX:** O que acontece se passarmos o número `20012018` para a função
acima? -- Para data-horas, a lógica é a mesma: `dmy_hms()`, `ymd_hms()`,
etc. Agora as letras depois do sublinhado representam *hour*, *minute* e
*second*. `r dmy_hms("20/01/2018 12:02:50")`
`#> [1] "2018-01-20 12:02:50 UTC"` -- **EX:** E se não
quisermos especificar os minutos ou segundos de um datetime? --- \#
Fusos horários Um componente importante de datetimes que ainda não
abordamos diretamente são os fusos horários. Praticamente todas as
funções de criação de datas têm um argumento `tz` que nos permite
especificar o fuso.
`r t1 <- dmy_hms("01/06/2015 12:00:00", tz = "America/New_York") t2 <- dmy_hms("01/06/2015 13:00:00", tz = "America/Sao_Paulo") t1 == t2`
`#> [1] TRUE` -- **EX:** Crie um vetor `c(t1, t2)`. O que acontece
quando você o imprime? -- Para trocar o fuso de um datetime, basta usar
`with_tz()`: `r with_tz(t1, tzone = "Australia/Lord_Howe")`
`#> [1] "2015-06-02 02:30:00 +1030"` -- **EX:** Dê uma
olhada na lista de fusos presentes em `OlsonNames()`. --- \# Até agora -
Com `as_date()` e `as_datetime()` podemos criar datas a partir do ISO
8601 - Com `make_*()` podemos criar datas a partir de seus componentes -
Com as famílias `ymd()` e `ymd_hms()` podemos criar datas a partir de
qualquer formato - Podemos atribuir fusos a data-horas com o argumento
`tz` -- \#\#\# Exercício Partindo do vetor de strigs `vt`, obtenha a
data-hora `t`. Você deve fazer isso de duas formas diferentes: uma deve
usar somente o pacote `lubridate` e a outra deve usar o pacote `stringr`
também.
`r vt <- c("2015", "31", "03", "02", "59") t <- ymd_hm("2015-03-31 02:59")`
--- class: inverse, center, middle \# Mexer com datas é fácil --- \#
Componentes Depois que aprendemos a construir datas, entender seus
componentes é uma tareafa razoavelmente simples. Usando os nomes em
inglês das diferentes unidades de medida de uma data-hora, podemos
extrair cada unidade separadamente.
`r dt <- ymd_hms("2016-07-08 12:34:56") c(year(dt), month(dt), day(dt), hour(dt), minute(dt), second(dt))`
`#> [1] 2016 7 8 12 34 56` -- Além destas funções básicas, também
temos acesso a algumas variações. `yday()` nos dá o dia do ano, enquanto
`wday()` nos dá o dia da semana (1 = domingo e 7 = sábado).
`r c(yday(dt), wday(dt))` `#> [1] 190 6` -- **EX:** Para que servem
os argumentos de `wday()`? --- \# Componentes (cont.) Uma propriedade
interessante dos componentes é que podemos atribuir valores diretamente
a eles. Basta usar o operador de atribuição (`<-`) na seleção de um
componente: `r year(dt) <- 2020 dt`
`#> [1] "2020-07-08 12:34:56 UTC"` -- **EX:** Tente
atribuir um valor inválido (maior que `31`) para `day(dt)` -- Também é
possível arredondar uma data-hora para o componente mais próximo: use
`roud_date()` e passe o nome de um componente para o argumento `unit`.
Se você precisar dos operadores de teto e chão, eles também estão
disponíveis (`floor_date()` e `ceiling_date()`).
`r round_date(dt, "day")`
`#> [1] "2020-07-09 UTC"` --- class: inverse, center,
middle \# Mexer com datas é difícil --- \# Talvez entre em pânico Como
você deve ter notado, a seção passada foi bastante curta e nem teve uma
recapitulação... Foi esse o caso porque a utilidade real do pacote
lubridate não está em extrair os componentes das data-horas (apesar de
as vezes isso vir a calhar). O que veremos nesta seção é a real vantagem
do pacote, mas infelizmente não é um assunto tão simples, então pode ser
que você fique meio perdido. Isso é normal e demora um bom tempo até que
as coisas comecem a fazer sentido. -- E se você precisar de um
incentivo... --- class: center, middle
![](https://media.giphy.com/media/bkKvvzE9PEcTK/giphy.gif) --- \#
Durações No R tradicional, mexer com a diferença entre dois objetos
data-hora pode ser algo muito complicado e de comportamento
imprevisível, mas o `lubridate` nos fornece uma interface consistente
com `duration` que sempre retorna a duração em segundos.
`r as.duration(today() - dmy("28/12/1995"))`
`#> [1] "697075200s (~22.09 years)"` -- Se quisermos
construir uma duração, basta utilizar as funções de componente que já
aprendemos no plural e com um `d` na frente:
`r dyears(1) + dweeks(12) + dhours(15)`
`#> [1] "38847600s (~1.23 years)"` -- **EX:** Encontre a
data de amanhã usando `today()` e um construtor de duração. --- \#
Períodos Como nem sempre queremos diferenças de tempo e aritmética com
datas resumidas a uma duração em segundos, o `lubridate` nos fornece o
conceito de `periods` (durações que são legíveis para um humano). Seus
contrutures são os componentes no plural:
`r years(1) + weeks(12) + hours(15)`
`#> [1] "1y 0m 84d 15H 0M 0S"` -- A maior diferença entre
durações e períodos aparece quando lidamos com as variações naturais no
comprimento das unidades temporais. Veja por exemplo o que acontece
quando adicionamos `dyears(1)` e `years(1)` a um ano bissexto:
`r c(ymd("2016-01-01") + dyears(1), ymd("2016-01-01") + years(1))`
`#> [1] "2016-12-31" "2017-01-01"` -- **EX:**
Onde mais esse tipo de diferença poderia aparecer? ??? Mudança no
horário de verão --- \# Intervalos Para complicar ainda mais o que
acabamos de ver, imagine que precisamos determinar quantos dias cabem em
um mês. Isso naturalmente depende porque tem todo mês tem o mesmo número
de dias... `r months(1) / days(1)`
`#> estimate only: convert to intervals for accuracy`
`#> [1] 30.4375` -- Para isso temos o conceito de `interval`, uma
duração com um ponto de início. Usando o operador infixo `%--%`,
determinamos um intervalo e assim fica fácil de obter um resultado
preciso: `r (today() %--% (today() + months(1))) / days(1)`
`#> [1] NA` -- **EX:**
`(today() %--% (today() + years(1))) / months(1)` funciona? --- \# Até
agora - Usando componentes (`day()`, `month()`, `year()`, etc.) podemos
trabalhar com as partes de uma data-hora - Com durações podemos realizar
operações com diferenças de tempo - Com períodos temos acesso a durações
em uma forma mais legível e interpretável - Com intervalos podemos dar
um ponto inicial a uma operação temporal -- \#\#\# Exercício Partindo de
`lubridate::lakers`, determine, em média, quanto tempo o Lakers
(`team == "LAL"`) demora para arremessar a primeira bola
(`etype == "shot"`) no primeiro período (`period == 1`).
**Dicas:** Lembre-se da aula de `dplyr`! É possível resolver esse
exercício com apenas uma pipeline (na qual precisa haver apenas um
`mutate()`). Entenda a função `ms()` (ela não é o que parece). ???
lakers %>% dplyr::filter(etype == "shot", period == 1, team == "LAL")
%>%::mutate(time = as.duration(ms(time))) %>%
dplyr::group\_by(date) %>% dplyr::summarise(first = min(time)) %>%
dplyr::pull(first) %>% mean() --- class: center, middle, inverse \#
OBRIGADO!
</textarea>
</body>

[1] :alpha:

[2] :alpha:


text:
package hu.progtech.cd2t100.game.util;

import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import hu.progtech.cd2t100.computation.InstructionRegistry;
import hu.progtech.cd2t100.computation.Node;
import hu.progtech.cd2t100.computation.NodeBuilder;

import hu.progtech.cd2t100.computation.io.*;

import hu.progtech.cd2t100.emulator.Emulator;
import hu.progtech.cd2t100.emulator.EmulatorBuilder;
import hu.progtech.cd2t100.emulator.EmulatorObserver;

import hu.progtech.cd2t100.game.model.Puzzle;
import hu.progtech.cd2t100.game.model.NodeDescriptor;
import hu.progtech.cd2t100.game.model.CommunicationPortDescriptor;
import hu.progtech.cd2t100.game.model.InputPortDescriptor;
import hu.progtech.cd2t100.game.model.OutputPortDescriptor;
import hu.progtech.cd2t100.game.model.RegisterDescriptor;
import hu.progtech.cd2t100.game.model.PortNameMapping;

/**
 *  {@code EmulatorFactory} is a utility class for instantiating
 *  an {@code Emulator} according to a {@code Puzzle} instance.
 */
public class EmulatorFactory {
  private static final Logger logger =
    LoggerFactory.getLogger(EmulatorFactory.class);

  private static long defaultClockFrequency = 1000;

  private final InstructionRegistry registry;

  private EmulatorFactory(InstructionRegistry registry) {
    this.registry = registry;
  }

  /**
   *  Returns an {@code EmulatorFactory} instance using the specified
   *  {@code InstructionRegistry}. {@code Emulator}s constructed by
   *  the returned factory will have the instruction set contained
   *  in the registry.
   *
   *  @param registry the registry
   *
   *  @return a new {@code EmulatorFactory}
   */
  public static EmulatorFactory newInstance(InstructionRegistry registry) {
    return new EmulatorFactory(registry);
  }

  /**
   *  Gets the default clock frequency used when instantiating {@code Emulator}s.
   *
   *  @return the default clock frequency
   */
  public static long getDefaultClockFrequency() {
    return defaultClockFrequency;
  }

  /**
   *  Sets the default clock frequency used when instantiating {@code Emulator}s.
   *
   *  @param frequency the frequency (in milliseconds)
   */
  public static void setDefaultClockFrequency(long frequency) {
    defaultClockFrequency = frequency;
  }

  /**
   *  Constructs an {@code Emulator} using the specified {@code Puzzle}. The passed
   *  observer will be bound to the newly created {@code Emulator} instance.
   *
   *  @param puzzle the puzzle
   *  @param observer the observer
   *
   *  @return a new {@code Emulator} instance
   */
  public Emulator emulatorFromPuzzle(Puzzle puzzle, EmulatorObserver observer) {
    EmulatorBuilder emulatorBuilder = new EmulatorBuilder();

    logger.info("Building emulator from puzzle.");

    emulatorBuilder.setObserver(observer)
                   .setClockFrequency(defaultClockFrequency);

    Map<String, CommunicationPort> ports =
      createPorts(puzzle);

    logger.debug("Ports created: {}", ports);

    for (CommunicationPort port : ports.values()) {
      emulatorBuilder.addCommunicationPort(port);
    }

    List<Node> nodes = createNodes(puzzle, ports);

    logger.debug("Nodes created: {}", nodes);

    for (Node node : nodes) {
      emulatorBuilder.addNode(node);
    }

    Emulator emulator = emulatorBuilder.build();

    logger.info("Emulator succesfully built.");

    return emulator;
  }

  private Map<String, CommunicationPort> createPorts(Puzzle puzzle) {
    Map<String, CommunicationPort> ports = new HashMap<>();

    for (CommunicationPortDescriptor port :
          puzzle.getCommunicationPortDescriptors())
    {
      String globalName = port.getGlobalName();

      ports.put(globalName, new CommunicationPort(globalName));
    }

    for (OutputPortDescriptor port :
          puzzle.getOutputPortDescriptors())
    {
      String globalName = port.getGlobalName();

      ports.put(globalName, new OutputPort(globalName));
    }

    for (InputPortDescriptor port :
          puzzle.getInputPortDescriptors())
    {
      String globalName = port.getGlobalName();

      /*
       *  Function.indentity() is not useful here sadly because of the
       *  difference between the types (boxed and unboxed type).
       */
      ports.put(globalName,
                new InputPort(globalName, port.getContents()
                                              .stream()
                                              .mapToInt(x -> x)
                                              .toArray()));
    }

    return ports;
  }

  private List<Node> createNodes(Puzzle puzzle,
                                 Map<String, CommunicationPort> ports)
  {
    List<Node> nodes = new ArrayList<>();

    for (NodeDescriptor descriptor : puzzle.getNodeDescriptors()) {
      NodeBuilder nodeBuilder = new NodeBuilder();

      nodeBuilder.setGlobalName(descriptor.getGlobalName())
                 .setMaximumSourceCodeLines(descriptor.getMaximumSourceCodeLines())
                 .setInstructionRegistry(registry);

      for (RegisterDescriptor register : descriptor.getRegisterDescriptors()) {
        nodeBuilder.addRegister(new Register(register.getCapacity(),
                                             register.getName()));
      }

      for (PortNameMapping mapping : descriptor.getReadablePorts()) {
        nodeBuilder.addReadablePort(mapping.getLocalName(),
                                    ports.get(mapping.getGlobalName()));
      }

      for (PortNameMapping mapping : descriptor.getWriteablePorts()) {
        nodeBuilder.addWriteablePort(mapping.getLocalName(),
                                     ports.get(mapping.getGlobalName()));
      }

      nodes.add(nodeBuilder.build());
    }

    return nodes;
  }
}


text:
package org.apache.kylin.source.jdbc;

import org.apache.kylin.engine.mr.IMRInput;
import org.apache.kylin.job.execution.DefaultChainedExecutable;
import org.apache.kylin.metadata.model.IJoinedFlatTableDesc;
import org.apache.kylin.metadata.model.ISegment;
import org.apache.kylin.metadata.model.TableDesc;
import org.apache.kylin.source.hive.HiveMRInput;

public class JdbcHiveMRInput extends JdbcHiveInputBase implements IMRInput {

    @Override
    public IBatchCubingInputSide getBatchCubingInputSide(IJoinedFlatTableDesc flatDesc) {
        return new JdbcMRBatchCubingInputSide(flatDesc);
    }

    @Override
    public IBatchMergeInputSide getBatchMergeInputSide(ISegment seg) {
        return new IMRBatchMergeInputSide() {
            @Override
            public void addStepPhase1_MergeDictionary(DefaultChainedExecutable jobFlow) {
                // doing nothing
            }
        };
    }

    @Override
    public IMRTableInputFormat getTableInputFormat(TableDesc table, String uuid) {
        return new HiveMRInput.HiveTableInputFormat(getTableNameForHCat(table, uuid));
    }

    public static class JdbcMRBatchCubingInputSide extends JdbcBaseBatchCubingInputSide implements IMRBatchCubingInputSide {

        public JdbcMRBatchCubingInputSide(IJoinedFlatTableDesc flatDesc) {
            super(flatDesc);
        }

        @Override
        public IMRTableInputFormat getFlatTableInputFormat() {
            return new HiveMRInput.HiveTableInputFormat(getIntermediateTableIdentity());
        }
    }

}


text:
//
//  HCDExtensionConst.h
//  HCDExtension
//
//  Created by 黄成都 on 15/9/20.
//  Copyright (c) 2015年 黄成都. All rights reserved.
//

#import <Foundation/Foundation.h>
/**
 *  所有能处理的类型
 */
extern NSString *const MJPropertyTypeInt;
extern NSString *const MJPropertyTypeShort;
extern NSString *const MJPropertyTypeFloat;
extern NSString *const MJPropertyTypeDouble;
extern NSString *const MJPropertyTypeLong;
extern NSString *const MJPropertyTypeLongLong;
extern NSString *const MJPropertyTypeChar;
extern NSString *const MJPropertyTypeBOOL1;
extern NSString *const MJPropertyTypeBOOL2;
extern NSString *const MJPropertyTypePointer;

extern NSString *const MJPropertyTypeIvar;
extern NSString *const MJPropertyTypeMethod;
extern NSString *const MJPropertyTypeBlock;
extern NSString *const MJPropertyTypeClass;
extern NSString *const MJPropertyTypeSEL;
extern NSString *const MJPropertyTypeId;


text:
class AddAdminFlagToUser < ActiveRecord::Migration
  def change
    add_column :users, :admin, :boolean, null: false, default: false
  end
end


text:
alt.loader.alert = function(){
    if(typeof alt.modules.alert !== 'undefined')
        return alt.modules.alert;

    alt.modules.alert = angular.module('alt-alert', [])
        .factory('$alert', ['$log', '$timeout', '$rootScope', function($log, $timeout, $rootScope){
            return {
                items: [],
                warning: 'warning',
                danger: 'danger',
                info: 'info',
                success: 'success',
                ismultiple: true,
                timer: 4000,
                add: function(message, type, skip){
                    message = message || '';
                    type = type || this.warning;
                    skip = skip || 0;

                    if(!this.ismultiple)
                        this.items = [];

                    var self = this,
                        i = this.items.length,
                        item = {
                            id: i,
                            type: type,
                            message: message,
                            skip: skip,
                            isshow: skip == 0,
                            hide: function(){
                                this.isshow = false;
                                var index = self.items.indexOf(this),
                                    items = [];

                                angular.forEach(self.items, function(val, key){
                                    if(key != index) items.push(val);
                                });

                                self.items = items;
                            },
                            onload: function(){
                                var scope = this;
                                $timeout(function(){
                                    scope.hide();
                                }, self.timer);
                            }
                        };
                    this.items.push(item);
                }
            };
        }])
        .run(['$log', '$timeout', '$rootScope', '$alert', function($log, $timeout, $rootScope, $alert){
            $rootScope.$alert = $alert;
        }]);

    alt.module('alt-alert', alt.modules.alert);

};

if(typeof define !== 'undefined') {
    define([], function () {
        alt.loader.alert();
    });
}else{
    alt.loader.alert();
}


text:
using System;
using FluentNHibernate.Automapping;
using Web.Models;

namespace Web.Infrastructure.Repositories.Config
{
    /// <summary>
    /// This is an example automapping configuration. You should create your own that either
    /// implements IAutomappingConfiguration directly, or inherits from DefaultAutomappingConfiguration.
    /// Overriding methods in this class will alter how the automapper behaves.
    /// </summary>
    class SiteAutomappingConfiguration : DefaultAutomappingConfiguration
    {
        public override bool ShouldMap(Type type)
        {
            // specify the criteria that types must meet in order to be mapped
            // any type for which this method returns false will not be mapped.
            return type.Namespace == "Web.Models";
            //return type == typeof(User);
        }

        public override bool IsComponent(Type type)
        {
            // override this method to specify which types should be treated as components
            // if you have a large list of types, you should consider maintaining a list of them
            // somewhere or using some form of conventional and/or attribute design
            //return type == typeof(Location);
            return false;
        }
    }
}


text:
title: Removing Promotion
section: promotions
---

To remove a promotion, click the "Delete" icon next to the promotion in the Promotions list.

![Delete Promotion Icon](../../../images/user/promotions/delete_promotion_icon.jpg)


text:
layout: page
title: gn-Guinea
---
{% include postbycat key="gn" %}


text:
<ion-view view-title="About">
  <ion-content padding="true" ng-class="{expanded:isExpanded}" class="animate-fade-slide-in">

Money tracker {{ moneytracker.version }}

    	Author: duyetdev

    	Homepage: http://moneytracker.duyetdev.com

  </ion-content>
</ion-view>


text:
// -----------------------------------------------------------------------
// <copyright file="Geometry.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------

namespace Perspex.Media
{
    using System;
    using Perspex.Platform;

    /// <summary>
    /// Defines a geometric shape.
    /// </summary>
    public abstract class Geometry : PerspexObject
    {
        /// <summary>
        /// Defines the <see cref="Transform"/> property.
        /// </summary>
        public static readonly PerspexProperty<Transform> TransformProperty =
            PerspexProperty.Register<Geometry, Transform>("Transform");

        /// <summary>
        /// Initializes static members of the <see cref="Geometry"/> class.
        /// </summary>
        static Geometry()
        {
            TransformProperty.Changed.Subscribe(x =>
            {
                ((Geometry)x.Sender).PlatformImpl.Transform = ((Transform)x.NewValue).Value;
            });
        }

        /// <summary>
        /// Gets the geometry's bounding rectangle.
        /// </summary>
        public abstract Rect Bounds
        {
            get;
        }

        /// <summary>
        /// Gets the platform-specific implementation of the geometry.
        /// </summary>
        public IGeometryImpl PlatformImpl
        {
            get;
            protected set;
        }

        /// <summary>
        /// Gets or sets a transform to apply to the geometry.
        /// </summary>
        public Transform Transform
        {
            get { return this.GetValue(TransformProperty); }
            set { this.SetValue(TransformProperty, value); }
        }

        /// <summary>
        /// Clones the geometry.
        /// </summary>
        /// <returns>A cloned geometry.</returns>
        public abstract Geometry Clone();

        /// <summary>
        /// Gets the geometry's bounding rectangle with the specified stroke thickness.
        /// </summary>
        /// <param name="strokeThickness">The stroke thickness.</param>
        /// <returns>The bounding rectangle.</returns>
        public Rect GetRenderBounds(double strokeThickness)
        {
            return this.PlatformImpl.GetRenderBounds(strokeThickness);
        }
    }
}


text:
<?php

namespace Orchestra\Foundation\Http\Controllers\Extension;

use Illuminate\Support\Fluent;
use Orchestra\Support\Facades\Publisher;

abstract class ActionController extends Controller
{
    /**
     * Setup controller middleware.
     *
     * @return void
     */
    protected function onCreate()
    {
        $this->middleware([
            'orchestra.auth',
            'orchestra.can:manage-orchestra',
            'orchestra.csrf',
        ]);
    }

    /**
     * Queue publishing asset to publisher.
     *
     * @param  \Illuminate\Support\Fluent  $extension
     *
     * @return mixed
     */
    protected function queueToPublisher(Fluent $extension)
    {
        Publisher::queue($extension->get('name'));

        return $this->redirect(\handles('orchestra::publisher'));
    }
}


text:
(function () {
    'use strict';

    // dataservice factory
    angular
        .module('app.core')
        .factory('dataService', ['$http', '$location', '$q', function dataService($http, $location, $q) {

                var isPrimed = false;
                var primePromise;

                var service = {
                    getEvents: getEvents,
                    getSessions: getSessions,
                    getSpeakers: getSpeakers,
                    addEvent: addEvent,
                    deleteEvent: deleteEvent,
                    ready: ready
                };

                return service;

                function getEvents() {
                    var events = [];
                    return getCorporateEvents()
                        .then(getCorporateEventsComplete)

                    function getCorporateEventsComplete(data) {
                        events = data;
                        return $q.when(events);
                    }
                }

                function getCorporateEvents() {

                    //// implementation details go here
                    //var deferred = $q.defer();

                    var selectableSources = [];
                    var currentIndex = 0;

                    // Read from SharePoint List for migration sources
                    var hostweburl =
                        decodeURIComponent(
                            getQueryStringParameter("SPHostUrl")
                    );
                    var appweburl =
                       decodeURIComponent(
                           getQueryStringParameter("SPAppWebUrl")
                    );

                    // resources are in URLs in the form:
                    // web_url/_layouts/15/resource
                    var scriptbase = hostweburl + "/_layouts/15/";

                    // Load the js files and continue to the successHandler
                    $.getScript(scriptbase + "SP.Runtime.js",
                        function () {
                            $.getScript(scriptbase + "SP.js",
                                function () {
                                    $.getScript(scriptbase + "SP.RequestExecutor.js",
                                         function () {
                                             var context = new SP.ClientContext(appweburl);
                                             var factory = new SP.ProxyWebRequestExecutorFactory(appweburl);
                                             context.set_webRequestExecutorFactory(factory);
                                             var appContextSite = new SP.AppContextSite(context, hostweburl);
                                             var web = appContextSite.get_web();
                                             context.load(web);

                                             var list = web.get_lists().getByTitle('Corporate Events');
                                             //var camlQuery = SP.CamlQuery.createAllItemsQuery();
                                             var camlQuery = new SP.CamlQuery();
                                             camlQuery.set_viewXml(
                                              '<View><Query><Where><Geq><FieldRef Name="ID"/>' +
                                              '<Value Type="Number">1</Value></Geq></Where></Query>' +
                                              '<RowLimit>10</RowLimit><ViewFields>' +
                                              '<FieldRef Name="ID" />' +
                                              '<FieldRef Name="RegisteredEventID" />' +
                                              '<FieldRef Name="Title" />' +
                                              '<FieldRef Name="EventDescription" />' +
                                              '<FieldRef Name="EventCategory" />' +
                                              '<FieldRef Name="EventDate" />' +
                                              '<FieldRef Name="EventLocation" />' +
                                              '<FieldRef Name="EventContactEmail" />' +
                                              '<FieldRef Name="EventStatus" />' +
                                              '<FieldRef Name="EventImageUrl" />' +
                                              '</ViewFields></View>');

                                             this.listItems = list.getItems(camlQuery);
                                             context.load(this.listItems);

                                             context.executeQueryAsync(
                                                 Function.createDelegate(this, function () {
                                                     var ListEnumerator = this.listItems.getEnumerator();
                                                     while (ListEnumerator.moveNext()) {
                                                         var currentItem = ListEnumerator.get_current();

                                                         var spEventDate = new Date(currentItem.get_item('EventDate'));
                                                         var month = spEventDate.getMonth() + 1;
                                                         var day = spEventDate.getDate();
                                                         var year = spEventDate.getFullYear();
                                                         var shortStartDate = month + "/" + day + "/" + year;

                                                         selectableSources.push({
                                                             'id': currentItem.get_item('ID'),
                                                             'registeredeventid': currentItem.get_item('RegisteredEventID'),
                                                             'title': currentItem.get_item('Title'),
                                                             'description': currentItem.get_item('EventDescription'),
                                                             'category': currentItem.get_item('EventCategory'),
                                                             'eventdate': shortStartDate,
                                                             'location': currentItem.get_item('EventLocation'),
                                                             'contactemail': currentItem.get_item('EventContactEmail'),
                                                             'status': currentItem.get_item('EventStatus'),
                                                             'imageurl': currentItem.get_item('EventImageUrl'),
                                                             'isSelected': false
                                                         });

                                                     }

                                                     $q.all(selectableSources);

                                                 }),
                                                  Function.createDelegate(this, function (sender, args) {
                                                      //deferred.reject('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
                                                  })
                                             );
                                         }
                                    );
                                }
                            );
                        }
                    );

                    return $q.when(selectableSources);
                }

                function addEvent(eventItem) {
                    var events = [];
                    return addCorporateEvents(eventItem)
                        .then(addCorporateEventsComplete)

                    function addCorporateEventsComplete(data) {
                        events = data;
                        return $q.when(events);
                    }
                }

                function addCorporateEvents(eventItem) {

                    //// implementation details go here
                    //var deferred = $q.defer();

                    var updatedEvents = [];
                    var currentIndex = 0;

                    // Read from SharePoint List for migration sources
                    var hostweburl =
                        decodeURIComponent(
                            getQueryStringParameter("SPHostUrl")
                    );
                    var appweburl =
                       decodeURIComponent(
                           getQueryStringParameter("SPAppWebUrl")
                    );

                    // resources are in URLs in the form:
                    // web_url/_layouts/15/resource
                    var scriptbase = hostweburl + "/_layouts/15/";

                    // Load the js files and continue to the successHandler
                    $.getScript(scriptbase + "SP.Runtime.js",
                        function () {
                            $.getScript(scriptbase + "SP.js",
                                function () {
                                    $.getScript(scriptbase + "SP.RequestExecutor.js",
                                         function () {
                                             var context = new SP.ClientContext(appweburl);
                                             var factory = new SP.ProxyWebRequestExecutorFactory(appweburl);
                                             context.set_webRequestExecutorFactory(factory);
                                             var appContextSite = new SP.AppContextSite(context, hostweburl);
                                             var web = appContextSite.get_web();
                                             context.load(web);

                                             var list = web.get_lists().getByTitle('Corporate Events');

                                             // create the ListItemInformational object
                                             var listItemInfo = new SP.ListItemCreationInformation();
                                             var listItem = list.addItem(listItemInfo);
                                             listItem.set_item('Title', eventItem.title);
                                             listItem.set_item('EventDescription', eventItem.eventdesc);
                                             listItem.set_item('EventCategory', eventItem.category);
                                             listItem.set_item('EventDate', eventItem.eventdate);
                                             listItem.set_item('EventContactEmail', eventItem.contact);
                                             listItem.set_item('EventStatus', eventItem.status);
                                             listItem.set_item('RegisteredEventID', eventItem.eventid);
                                             listItem.set_item('EventImageUrl', eventItem.eventimageurl);
                                             listItem.set_item('EventLocation', eventItem.eventlocation);

                                             listItem.update();

                                             // Now retrieve all the events including the new events and populate array
                                             // Get the updated events list
                                             var camlQuery = new SP.CamlQuery();
                                             camlQuery.set_viewXml(
                                              '<View><Query><Where><Geq><FieldRef Name="ID"/>' +
                                              '<Value Type="Number">1</Value></Geq></Where></Query>' +
                                              '<RowLimit>10</RowLimit><ViewFields>' +
                                              '<FieldRef Name="ID" />' +
                                              '<FieldRef Name="RegisteredEventID" />' +
                                              '<FieldRef Name="Title" />' +
                                              '<FieldRef Name="EventDescription" />' +
                                              '<FieldRef Name="EventCategory" />' +
                                              '<FieldRef Name="EventDate" />' +
                                              '<FieldRef Name="EventLocation" />' +
                                              '<FieldRef Name="EventContactEmail" />' +
                                              '<FieldRef Name="EventStatus" />' +
                                              '<FieldRef Name="EventImageUrl" />' +
                                              '</ViewFields></View>');

                                             this.listItems = list.getItems(camlQuery);
                                             context.load(this.listItems);

                                             context.executeQueryAsync(
                                                 Function.createDelegate(this, function () {
                                                     var ListEnumerator = this.listItems.getEnumerator();
                                                     while (ListEnumerator.moveNext()) {
                                                         var currentItem = ListEnumerator.get_current();

                                                         var spEventDate = new Date(currentItem.get_item('EventDate'));
                                                         var month = spEventDate.getMonth() + 1;
                                                         var day = spEventDate.getDate();
                                                         var year = spEventDate.getFullYear();
                                                         var shortStartDate = month + "/" + day + "/" + year;

                                                         updatedEvents.push({
                                                             'id': currentItem.get_item('ID'),
                                                             'registeredeventid': currentItem.get_item('RegisteredEventID'),
                                                             'title': currentItem.get_item('Title'),
                                                             'description': currentItem.get_item('EventDescription'),
                                                             'category': currentItem.get_item('EventCategory'),
                                                             'eventdate': shortStartDate,
                                                             'location': currentItem.get_item('EventLocation'),
                                                             'contactemail': currentItem.get_item('EventContactEmail'),
                                                             'status': currentItem.get_item('EventStatus'),
                                                             'imageurl': currentItem.get_item('EventImageUrl'),
                                                             'isSelected': false
                                                         });

                                                     }

                                                     $q.all(updatedEvents);
                                            }),
                                                  Function.createDelegate(this, function (sender, args) {
                                                      //deferred.reject('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
                                                  })
                                             );
                                         }
                                    );
                                }
                            );
                        }
                    );

                    return $q.when(updatedEvents);
                }

                function deleteEvent(eventItem) {
                    var events = [];
                    return deleteCorporateEvents(eventItem)
                        .then(deleteCorporateEventsComplete)

                    function deleteCorporateEventsComplete(data) {
                        events = data;
                        return $q.when(events);
                    }
                }

                function deleteCorporateEvents(eventItem) {

                    var updatedEvents = [];
                    var currentIndex = 0;

                    // Read from SharePoint List
                    var hostweburl =
                        decodeURIComponent(
                            getQueryStringParameter("SPHostUrl")
                    );
                    var appweburl =
                       decodeURIComponent(
                           getQueryStringParameter("SPAppWebUrl")
                    );

                    // resources are in URLs in the form:
                    // web_url/_layouts/15/resource
                    var scriptbase = hostweburl + "/_layouts/15/";

                    // Load the js files and continue to the successHandler
                    $.getScript(scriptbase + "SP.Runtime.js",
                        function () {
                            $.getScript(scriptbase + "SP.js",
                                function () {
                                    $.getScript(scriptbase + "SP.RequestExecutor.js",
                                         function () {
                                             var context = new SP.ClientContext(appweburl);
                                             var factory = new SP.ProxyWebRequestExecutorFactory(appweburl);
                                             context.set_webRequestExecutorFactory(factory);
                                             var appContextSite = new SP.AppContextSite(context, hostweburl);
                                             var web = appContextSite.get_web();
                                             context.load(web);

                                             var list = web.get_lists().getByTitle('Corporate Events');

                                             // Get the item to delete and then delete it
                                             var listItem = list.getItemById(eventItem);
                                             listItem.deleteObject();

                                             // Get the updated events list
                                             var camlQuery = new SP.CamlQuery();
                                             camlQuery.set_viewXml(
                                              '<View><Query><Where><Geq><FieldRef Name="ID"/>' +
                                              '<Value Type="Number">1</Value></Geq></Where></Query>' +
                                              '<RowLimit>10</RowLimit><ViewFields>' +
                                              '<FieldRef Name="ID" />' +
                                              '<FieldRef Name="RegisteredEventID" />' +
                                              '<FieldRef Name="Title" />' +
                                              '<FieldRef Name="EventDescription" />' +
                                              '<FieldRef Name="EventCategory" />' +
                                              '<FieldRef Name="EventDate" />' +
                                              '<FieldRef Name="EventLocation" />' +
                                              '<FieldRef Name="EventContactEmail" />' +
                                              '<FieldRef Name="EventStatus" />' +
                                              '<FieldRef Name="EventImageUrl" />' +
                                              '</ViewFields></View>');

                                             this.listItems = list.getItems(camlQuery);
                                             context.load(this.listItems);

                                             context.executeQueryAsync(
                                                 Function.createDelegate(this, function () {
                                                     var ListEnumerator = this.listItems.getEnumerator();
                                                     while (ListEnumerator.moveNext()) {
                                                         var currentItem = ListEnumerator.get_current();

                                                         var spEventDate = new Date(currentItem.get_item('EventDate'));
                                                         var month = spEventDate.getMonth() + 1;
                                                         var day = spEventDate.getDate();
                                                         var year = spEventDate.getFullYear();
                                                         var shortStartDate = month + "/" + day + "/" + year;

                                                         updatedEvents.push({
                                                             'id': currentItem.get_item('ID'),
                                                             'registeredeventid': currentItem.get_item('RegisteredEventID'),
                                                             'title': currentItem.get_item('Title'),
                                                             'description': currentItem.get_item('EventDescription'),
                                                             'category': currentItem.get_item('EventCategory'),
                                                             'eventdate': shortStartDate,
                                                             'location': currentItem.get_item('EventLocation'),
                                                             'contactemail': currentItem.get_item('EventContactEmail'),
                                                             'status': currentItem.get_item('EventStatus'),
                                                             'imageurl': currentItem.get_item('EventImageUrl'),
                                                             'isSelected': false
                                                         });

                                                     }

                                                     $q.all(updatedEvents);
                                                 }),
                                                  Function.createDelegate(this, function (sender, args) {
                                                      //deferred.reject('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
                                                  })
                                             );
                                         }
                                    );
                                }
                            );
                       }
                    );

                    return $q.when(updatedEvents);
                }

                function getSessions(eventId) {
                    var sessions = [];
                    return getSessionsByEventId(eventId)
                        .then(getSessionsComplete)

                    function getSessionsComplete(data) {
                        sessions = data;
                        return $q.when(sessions);
                    }
                }

                function getSessionsByEventId(eventId) {
                    //// implementation details go here
                    //var deferred = $q.defer();

                    var selectableSessions = [];
                    var currentIndex = 0;

                    // Read from SharePoint List for migration sources
                    var hostweburl =
                        decodeURIComponent(
                            getQueryStringParameter("SPHostUrl")
                    );
                    var appweburl =
                       decodeURIComponent(
                           getQueryStringParameter("SPAppWebUrl")
                    );

                    // resources are in URLs in the form:
                    // web_url/_layouts/15/resource
                    var scriptbase = hostweburl + "/_layouts/15/";

                    // Load the js files and continue to the successHandler
                    $.getScript(scriptbase + "SP.Runtime.js",
                        function () {
                            $.getScript(scriptbase + "SP.js",
                                function () {
                                    $.getScript(scriptbase + "SP.RequestExecutor.js",
                                         function () {
                                             var context = new SP.ClientContext(appweburl);
                                             var factory = new SP.ProxyWebRequestExecutorFactory(appweburl);
                                             context.set_webRequestExecutorFactory(factory);
                                             var appContextSite = new SP.AppContextSite(context, hostweburl);
                                             var web = appContextSite.get_web();
                                             context.load(web);

                                             var list = web.get_lists().getByTitle('Event Sessions');
                                             //var camlQuery = SP.CamlQuery.createAllItemsQuery();
                                             var camlQuery = new SP.CamlQuery();
                                             camlQuery.set_viewXml(
                                              '<View><Query><Where><Eq><FieldRef Name="RegisteredEventID"/>' +
                                              '<Value Type="Text">' + eventId + '</Value></Eq></Where></Query>' +
                                              '<RowLimit>10</RowLimit><ViewFields>' +
                                              '<FieldRef Name="ID" />' +
                                              '<FieldRef Name="RegisteredEventID" />' +
                                              '<FieldRef Name="SessionID" />' +
                                              '<FieldRef Name="Title" />' +
                                              '<FieldRef Name="SessionDate" />' +
                                              '<FieldRef Name="SessionDescription" />' +
                                              '<FieldRef Name="SessionImageUrl" />' +
                                              '<FieldRef Name="SpeakerID" />' +
                                              '</ViewFields></View>');

                                             this.listItems = list.getItems(camlQuery);
                                             context.load(this.listItems);

                                             context.executeQueryAsync(
                                                 Function.createDelegate(this, function () {
                                                     var ListEnumerator = this.listItems.getEnumerator();
                                                     while (ListEnumerator.moveNext()) {
                                                         var currentItem = ListEnumerator.get_current();

                                                         var spSessionDate = new Date(currentItem.get_item('SessionDate'));
                                                         var month = spSessionDate.getMonth() + 1;
                                                         var day = spSessionDate.getDate();
                                                         var year = spSessionDate.getFullYear();
                                                         var shortSessionDate = month + "/" + day + "/" + year;

                                                         selectableSessions.push({
                                                             'id': currentItem.get_item('ID'),
                                                             'registeredeventid': currentItem.get_item('RegisteredEventID'),
                                                             'title': currentItem.get_item('Title'),
                                                             'sessionid': currentItem.get_item('SessionID'),
                                                             'description': currentItem.get_item('SessionDescription'),
                                                             'sessiondate': shortSessionDate,
                                                             'sessionimageurl': currentItem.get_item('SessionImageUrl'),
                                                             'speakerid': currentItem.get_item('SpeakerID'),
                                                             'isSelected': false
                                                         });

                                                     }

                                                     $q.all(selectableSessions);

                                                 }),
                                                  Function.createDelegate(this, function (sender, args) {
                                                      //deferred.reject('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
                                                  })
                                             );
                                         }
                                    );
                                }
                            );
                        }
                    );

                    return $q.when(selectableSessions);
                }

                function getSpeakers(speakerId) {
                    var speakers = [];
                    return getSpeakersBySpeakerId(speakerId)
                        .then(getSpeakersComplete)

                    function getSpeakersComplete(data) {
                        speakers = data;
                        return $q.when(speakers);
                    }
                }

                function getSpeakersBySpeakerId(speakerId) {
                    //// implementation details go here
                    //var deferred = $q.defer();

                    var selectableSpeakers = [];
                    var currentIndex = 0;

                    // Read from SharePoint List for migration sources
                    var hostweburl =
                        decodeURIComponent(
                            getQueryStringParameter("SPHostUrl")
                    );
                    var appweburl =
                       decodeURIComponent(
                           getQueryStringParameter("SPAppWebUrl")
                    );

                    // resources are in URLs in the form:
                    // web_url/_layouts/15/resource
                    var scriptbase = hostweburl + "/_layouts/15/";

                    // Load the js files and continue to the successHandler
                    $.getScript(scriptbase + "SP.Runtime.js",
                        function () {
                            $.getScript(scriptbase + "SP.js",
                                function () {
                                    $.getScript(scriptbase + "SP.RequestExecutor.js",
                                         function () {
                                             var context = new SP.ClientContext(appweburl);
                                             var factory = new SP.ProxyWebRequestExecutorFactory(appweburl);
                                             context.set_webRequestExecutorFactory(factory);
                                             var appContextSite = new SP.AppContextSite(context, hostweburl);
                                             var web = appContextSite.get_web();
                                             context.load(web);

                                             var list = web.get_lists().getByTitle('Event Speakers');
                                             //var camlQuery = SP.CamlQuery.createAllItemsQuery();
                                             var camlQuery = new SP.CamlQuery();
                                             camlQuery.set_viewXml(
                                              '<View><Query><Where><Eq><FieldRef Name="SpeakerID"/>' +
                                              '<Value Type="Text">' + speakerId + '</Value></Eq></Where></Query>' +
                                              '<RowLimit>10</RowLimit><ViewFields>' +
                                              '<FieldRef Name="ID" />' +
                                              '<FieldRef Name="Title" />' +
                                              '<FieldRef Name="SpeakerID" />' +
                                              '<FieldRef Name="SpeakerFirstName" />' +
                                              '<FieldRef Name="SpeakerLastName" />' +
                                              '<FieldRef Name="SpeakerEmail" />' +
                                              '</ViewFields></View>');

                                             this.listItems = list.getItems(camlQuery);
                                             context.load(this.listItems);

                                             context.executeQueryAsync(
                                                 Function.createDelegate(this, function () {
                                                     var ListEnumerator = this.listItems.getEnumerator();
                                                     while (ListEnumerator.moveNext()) {
                                                         var currentItem = ListEnumerator.get_current();

                                                         selectableSpeakers.push({
                                                             'id': currentItem.get_item('ID'),
                                                             'title': currentItem.get_item('Title'),
                                                             'speakerid': currentItem.get_item('SpeakerID'),
                                                             'speakerfirstname': currentItem.get_item('SpeakerFirstName'),
                                                             'speakerlastname': currentItem.get_item('SpeakerLastName'),
                                                             'speakeremail': currentItem.get_item('SpeakerEmail'),
                                                             'isSelected': false
                                                         });

                                                     }

                                                     $q.all(selectableSpeakers);

                                                 }),
                                                  Function.createDelegate(this, function (sender, args) {
                                                      //deferred.reject('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
                                                  })
                                             );
                                         }
                                    );
                                }
                            );
                        }
                    );

                    return $q.when(selectableSpeakers);
                }

                function prime() {
                    if (primePromise) {
                        return primePromise;
                    }

                    primePromise = $q.when(true).then(success);
                    return primePromise;

                    function success() {
                        isPrimed = true;

                    }
                }

                function ready(nextPromises) {
                    var readyPromise = primePromise || prime();

                    return readyPromise
                        .then(function () {
                            return $q.all(nextPromises);
                        })

                }

                function getQueryStringParameter(paramToRetrieve) {
                    var params =
                        document.URL.split("?")[1].split("&");
                    var strParams = "";
                    for (var i = 0; i < params.length; i = i + 1) {
                        var singleParam = params[i].split("=");
                        if (singleParam[0] == paramToRetrieve)
                            return singleParam[1];
                    }
                }
        }]);
})();


text:
package scalan.examples

import scalan.{ScalanCommunityDsl, ScalanCommunityDslSeq, ScalanCommunityDslExp}

/**
 * Created by Viktor Smirnov on 29.03.15.
 */
trait ExampleDsl extends ScalanCommunityDsl with MyArraysDsl

trait ExampleDslSeq extends ScalanCommunityDslSeq with ExampleDsl with MyArraysDslSeq

trait ExampleDslExp extends ScalanCommunityDslExp with ExampleDsl with MyArraysDslExp


text:
ACCEPTED

#### According to
Index Fungorum

#### Published in
null

#### Original name
Antilyssa gandogeriana M. Choisy

### Remarks
null


text:
package org.kuali.kra.proposaldevelopment.service;

import org.kuali.kra.proposaldevelopment.bo.ProposalPerson;
import org.kuali.kra.proposaldevelopment.bo.ProposalPersonBiography;
import org.kuali.kra.proposaldevelopment.document.ProposalDevelopmentDocument;

import java.util.List;

public interface ProposalPersonBiographyService {
    /**
     *
     * This method to add personnel attachment
     * @param proposaldevelopmentDocument
     * @param proposalPersonBiography
     */
    public void addProposalPersonBiography(ProposalDevelopmentDocument proposaldevelopmentDocument,ProposalPersonBiography proposalPersonBiography);

    /**
     *
     * This method to delete personnel attachment when the key personnel is deleted
     * @param proposaldevelopmentDocument
     * @param person
     */
    public void removePersonnelAttachmentForDeletedPerson(ProposalDevelopmentDocument proposaldevelopmentDocument, ProposalPerson person);

    /**
     *
     * This method to delete personnel attachment from the list.  ALso, remove it from DB.
     * @param proposaldevelopmentDocument
     * @param lineToDelete
     */
    public void deleteProposalPersonBiography(ProposalDevelopmentDocument proposaldevelopmentDocument, int lineToDelete);

    /**
     *
     * This method is to set up timestamp and upload user for personnel attachments.
     * @param proposalPersonBios
     */

    public void setPersonnelBioTimeStampUser(List<ProposalPersonBiography> proposalPersonBios);

}


text: docker build -t saltatory/blog `pwd`


text:
using System.Collections.Generic;
using System.Dynamic;
using Frapid.DataAccess;
using Frapid.DataAccess.Models;

namespace Frapid.Account.DataAccess
{
    public interface IConfigurationProfileRepository
    {
        /// <summary>
        /// Counts the number of ConfigurationProfile in IConfigurationProfileRepository.
        /// </summary>
        /// <returns>Returns the count of IConfigurationProfileRepository.</returns>
        long Count();

        /// <summary>
        /// Returns all instances of ConfigurationProfile.
        /// </summary>
        /// <returns>Returns a non-live, non-mapped instances of ConfigurationProfile.</returns>
        IEnumerable<Frapid.Account.Entities.ConfigurationProfile> GetAll();

        /// <summary>
        /// Returns all instances of ConfigurationProfile to export.
        /// </summary>
        /// <returns>Returns a non-live, non-mapped instances of ConfigurationProfile.</returns>
        IEnumerable<dynamic> Export();

        /// <summary>
        /// Returns a single instance of the ConfigurationProfile against profileId.
        /// </summary>
        /// <param name="profileId">The column "profile_id" parameter used on where filter.</param>
        /// <returns>Returns a non-live, non-mapped instance of ConfigurationProfile.</returns>
        Frapid.Account.Entities.ConfigurationProfile Get(int profileId);

        /// <summary>
        /// Gets the first record of ConfigurationProfile.
        /// </summary>
        /// <returns>Returns a non-live, non-mapped instance of ConfigurationProfile.</returns>
        Frapid.Account.Entities.ConfigurationProfile GetFirst();

        /// <summary>
        /// Gets the previous record of ConfigurationProfile sorted by profileId.
        /// </summary>
        /// <param name="profileId">The column "profile_id" parameter used to find the previous record.</param>
        /// <returns>Returns a non-live, non-mapped instance of ConfigurationProfile.</returns>
        Frapid.Account.Entities.ConfigurationProfile GetPrevious(int profileId);

        /// <summary>
        /// Gets the next record of ConfigurationProfile sorted by profileId.
        /// </summary>
        /// <param name="profileId">The column "profile_id" parameter used to find the next record.</param>
        /// <returns>Returns a non-live, non-mapped instance of ConfigurationProfile.</returns>
        Frapid.Account.Entities.ConfigurationProfile GetNext(int profileId);

        /// <summary>
        /// Gets the last record of ConfigurationProfile.
        /// </summary>
        /// <returns>Returns a non-live, non-mapped instance of ConfigurationProfile.</returns>
        Frapid.Account.Entities.ConfigurationProfile GetLast();

        /// <summary>
        /// Returns multiple instances of the ConfigurationProfile against profileIds.
        /// </summary>
        /// <param name="profileIds">Array of column "profile_id" parameter used on where filter.</param>
        /// <returns>Returns a non-live, non-mapped collection of ConfigurationProfile.</returns>
        IEnumerable<Frapid.Account.Entities.ConfigurationProfile> Get(int[] profileIds);

        /// <summary>
        /// Custom fields are user defined form elements for IConfigurationProfileRepository.
        /// </summary>
        /// <returns>Returns an enumerable custom field collection for ConfigurationProfile.</returns>
        IEnumerable<Frapid.DataAccess.Models.CustomField> GetCustomFields(string resourceId);

        /// <summary>
        /// Displayfields provide a minimal name/value context for data binding ConfigurationProfile.
        /// </summary>
        /// <returns>Returns an enumerable name and value collection for ConfigurationProfile.</returns>
        IEnumerable<Frapid.DataAccess.Models.DisplayField> GetDisplayFields();

        /// <summary>
        /// Inserts the instance of ConfigurationProfile class to IConfigurationProfileRepository.
        /// </summary>
        /// <param name="configurationProfile">The instance of ConfigurationProfile class to insert or update.</param>
        /// <param name="customFields">The custom field collection.</param>
        object AddOrEdit(dynamic configurationProfile, List<Frapid.DataAccess.Models.CustomField> customFields);

        /// <summary>
        /// Inserts the instance of ConfigurationProfile class to IConfigurationProfileRepository.
        /// </summary>
        /// <param name="configurationProfile">The instance of ConfigurationProfile class to insert.</param>
        object Add(dynamic configurationProfile);

        /// <summary>
        /// Inserts or updates multiple instances of ConfigurationProfile class to IConfigurationProfileRepository.;
        /// </summary>
        /// <param name="configurationProfiles">List of ConfigurationProfile class to import.</param>
        /// <returns>Returns list of inserted object ids.</returns>
        List<object> BulkImport(List<ExpandoObject> configurationProfiles);

        /// <summary>
        /// Updates IConfigurationProfileRepository with an instance of ConfigurationProfile class against the primary key value.
        /// </summary>
        /// <param name="configurationProfile">The instance of ConfigurationProfile class to update.</param>
        /// <param name="profileId">The value of the column "profile_id" which will be updated.</param>
        void Update(dynamic configurationProfile, int profileId);

        /// <summary>
        /// Deletes ConfigurationProfile from  IConfigurationProfileRepository against the primary key value.
        /// </summary>
        /// <param name="profileId">The value of the column "profile_id" which will be deleted.</param>
        void Delete(int profileId);

        /// <summary>
        /// Produces a paginated result of 10 ConfigurationProfile classes.
        /// </summary>
        /// <returns>Returns the first page of collection of ConfigurationProfile class.</returns>
        IEnumerable<Frapid.Account.Entities.ConfigurationProfile> GetPaginatedResult();

        /// <summary>
        /// Produces a paginated result of 10 ConfigurationProfile classes.
        /// </summary>
        /// <param name="pageNumber">Enter the page number to produce the paginated result.</param>
        /// <returns>Returns collection of ConfigurationProfile class.</returns>
        IEnumerable<Frapid.Account.Entities.ConfigurationProfile> GetPaginatedResult(long pageNumber);

        List<Frapid.DataAccess.Models.Filter> GetFilters(string catalog, string filterName);

        /// <summary>
        /// Performs a filtered count on IConfigurationProfileRepository.
        /// </summary>
        /// <param name="filters">The list of filter conditions.</param>
        /// <returns>Returns number of rows of ConfigurationProfile class using the filter.</returns>
        long CountWhere(List<Frapid.DataAccess.Models.Filter> filters);

        /// <summary>
        /// Performs a filtered pagination against IConfigurationProfileRepository producing result of 10 items.
        /// </summary>
        /// <param name="pageNumber">Enter the page number to produce the paginated result. If you provide a negative number, the result will not be paginated.</param>
        /// <param name="filters">The list of filter conditions.</param>
        /// <returns>Returns collection of ConfigurationProfile class.</returns>
        IEnumerable<Frapid.Account.Entities.ConfigurationProfile> GetWhere(long pageNumber, List<Frapid.DataAccess.Models.Filter> filters);

        /// <summary>
        /// Performs a filtered count on IConfigurationProfileRepository.
        /// </summary>
        /// <param name="filterName">The named filter.</param>
        /// <returns>Returns number of ConfigurationProfile class using the filter.</returns>
        long CountFiltered(string filterName);

        /// <summary>
        /// Gets a filtered result of IConfigurationProfileRepository producing a paginated result of 10.
        /// </summary>
        /// <param name="pageNumber">Enter the page number to produce the paginated result. If you provide a negative number, the result will not be paginated.</param>
        /// <param name="filterName">The named filter.</param>
        /// <returns>Returns collection of ConfigurationProfile class.</returns>
        IEnumerable<Frapid.Account.Entities.ConfigurationProfile> GetFiltered(long pageNumber, string filterName);

    }
}