반응형

한양대학교는 2023년부터 Hanyang Popularity Exceeding Competition을 열게 되었다. 이 대회는 일정 기간 진행되며, 대회가 끝나는 시점에 인기도가 가장 높은 학생이 우승한다. 철민이는 Hanyang Popularity Exceeding Competition의 참가자이지만, 이제 막 학교에 다니기 시작한 철민이는 인기도가 밖에 되지 않는다.

철민이는 한양대학교 내의 유명인 명과 만난다는 우승 계획을 세웠다. 이를 위해 철민이는 번 유명인부터 번 유명인까지 차례대로 만날 계획을 세웠다.

하지만 현실은 생각보다 복잡해서, 유명인들과 만난다고 항상 인기도가 올라가지는 않는다. 한쪽의 유명도가 다른 한쪽에 비해 너무 높으면 한쪽의 인기에 다른 쪽이 묻혀버리기 때문이다. 엄밀히 말해서, 철민이의 현재 인기도를 라고 하고, 번 유명인의 인기도를 , 친화력을 라고 하자. 이때, 여야 철민이의 인기도가  올라간다. 라면 철민이의 인기도는 변하지 않는다.

그래서 철민이는 모든 유명인을 다 만나는 대신, 일부 유명인만을 골라 만나서 인기도를 최대화하려고 한다. 이때, 철민이가 도달할 수 있는 최대 인기도는 얼마일까?

유명인들은 바쁜 삶을 보내기 때문에, 유명인과 만나는 시간을 변경할 수는 없다. 즉, 번호가 더 높은 유명인을 먼저 만나도록 계획을 변경할 수는 없다.

제약조건

입력형식

첫 번째 줄에 한양대학교의 유명인들의 수 이 주어진다.

다음 개의 줄의 번째 줄에는 번 유명인의 인기도와 친화력을 의미하는 두 정수  가 공백으로 구분되어 주어진다.

출력형식

첫 번째 줄에 철민이가 도달할 수 있는 최대 인기도를 출력한다.

입력예제1
3 1 1 0 0 2 1
출력예제1
2

 

아래 방식으로 만남을 계획하면 인기도를 최대화할 수 있다.

  •  1번 유명인은 만나지 않고 건너뛴다.
  •  2번 유명인을 만난다. |0 − 0| ≤ 0이므로 철민이의 인기도가 1이 된다.
  •  3번 유명인을 만난다. |1 − 2| ≤ 1이므로 철민이의 인기도가 2가 된다.
입력예제2
5 0 0 0 1 0 2 0 3 0 4
출력예제2
5

 

모든 유명인을 만나면 인기도를 최대로 올릴 수 있다.

 

입력예제3
3 4 3 3 2 2 1
출력예제3
0

 

어떤 방식으로 만남을 계획해도 철민이의 인기도가 오를 수 없다.

 

 

[Solution]

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        int X = 0;
        
        for(int i=0; i<N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            int P = Integer.parseInt(st.nextToken());
            int C = Integer.parseInt(st.nextToken());

            int absoluteValue = 0 ;
            if((P-X) < 0){
                absoluteValue = (P-X)*-1;
            }else{
               absoluteValue = (P-X); 
            } 

            if(absoluteValue <= C){
                X++;
            }
            
        }

        System.out.println(X);
    }
}
반응형
블로그 이미지

Mr.비타민

,
반응형

현대자동차그룹은 주요 물류센터에 각종 자동화 기기를 도입하며 ‘스마트 물류’를 실현하고 있다. 최근에는 자동차 반조립 부품(KD, Knock-Down) 물류기지인 KD센터에 포장 관련 자동화 로봇 개발과 구축을 완료했다. 기존 수작업으로 진행하던 일부 작업 라인을 자동화 기기로 전환해 생산성을 높이기 위한 시도다. 기다란 작업 라인에 로봇과 부품이 아래 그림과 같이 단위 간격으로 놓여 있다. 로봇들의 위치에서 거리가 K 이하인 부품만 잡을 수 있다. 왼쪽 오른쪽은 상관 없다.



위 그림에서 K = 1인 경우를 생각해보자. 이 경우 모든 로봇은 그의 위치 바로 옆에 인접한 부품만 집을 수 있다.

* 10번 위치에 있는 로봇은 바로 왼쪽 11번 위치에 있는 부품을 집을 수 있다. 이 경우 다음과 같이 최대 5개의 로봇이 부품을 집을 수 있다.
* 2번 위치에 있는 로봇은 1번 위치에 있는 부품을 집을 수 있다.
* 4번 위치에 있는 로봇은 5번 위치에 있는 부품을 집을 수 있다.
* 6번 위치에 있는 로봇은 7번 위치에 있는 부품을 집을 수 있다.
* 9번 위치에 있는 로봇은 8번 위치에 있는 부품을 집을 수 있다.
* 10번 위치에 있는 로봇은 11번 위치에 있는 부품을 집을 수 있다.
* 12번 위치에 있는 로봇은 집을 수 있는 부품이 없다.

만약 K = 2라고 한다면 다음과 같이 6개 로봇 모두가 부품을 집을 수 있다.

* 2번 위치에 있는 로봇은 1번 위치에 있는 부품을 집을 수 있다.
* 4번 위치에 있는 로봇은 3번 위치에 있는 부품을 집을 수 있다.
* 6번 위치에 있는 로봇은 5번 위치에 있는 부품을 집을 수 있다.
* 9번 위치에 있는 로봇은 7번 위치에 있는 부품을 집을 수 있다.
* 10번 위치에 있는 로봇은 8번 위치에 있는 부품을 집을 수 있다.
* 12번 위치에 있는 로봇은 11번 위치에 있는 부품을 집을 수 있다.

라인의 길이 N, 부품을 집을 수 있는 거리 K, 그리고 로봇과 부품의 위치가 주어졌을 때 부품을 집을 수 있는 로봇의 최대 수를 구하는 프로그램을 작성하라.

 

제약조건

1 ≤ N ≤ 20,000

1 ≤ K ≤ 10

 

입력형식

입력의 첫 줄에는 두 정수 N과 K가 나온다.

다음 줄에는 로봇과 부품의 위치가 문자 P(로봇)와 H(부품)로 이루어지는 길이 N인 문자열로 주어진다.

 

출력형식

입력에 대해서 부품을 집을 수 있는 최대 로봇 수(정수)를 나타낸다.

 

입력예제1

20 1

HHPHPPHHPPHPPPHPHPHP

 

출력예제1

8

 
입력예제2

20 2

HHHHHPPPPPHPHPHPHHHP

 

출력예제2

7

 

 

 

[Solution]

로봇 왼쪽 먼 곳부터 오른쪽으로 순차적으로 차례대로 체크하면서 집는다고 생각하고 구현.

 

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
		
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        int count = 0;
        char[] str = br.readLine().toCharArray();
		
	for (int i = 0; i < N; i++) {
		if (str[i] == 'P') {
			for (int j = i - K; j <= i + K; j++) {
				if (j < 0 || j >= N){
					continue;
				}else if (str[j] == 'H') {
					str[j] = '*';
					count++;
					break;
				}
			}
		}
	}
        System.out.println(count);
    }
}
반응형
블로그 이미지

Mr.비타민

,

링크

2024. 9. 2. 13:59

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

Frontend와 Backend는 port가 다르기때문에 다른 주소로 판단을 하므로,

CORS에 대한 처리를 해줘야한다.

우선 Backend에서 허용하는 URL에 대한 예외처리와 HTTP Method 허용을 해줘야 Backend에서 전달받아서 처리를 할 수 있다.

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("http://localhost:3000","http://example.com:9000")
                .allowedMethods("GET", "POST", "PUT", "DELETE");
    }
}
반응형
블로그 이미지

Mr.비타민

,
반응형

Session을 사용하지않고 Token 방식으로 현 사용자에 대한 인증 및 처리를 하기위해 JWT를 사용한 로그인을 작성한다.

1. build.gradle

implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'

Spring Security를 사용하여 JWT를 구현한다.(implementation 추가)

2. JwtToken DTO추가

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Builder
@Data
@AllArgsConstructor
public class JwtToken {
    private String grantType;
    private String accessToken;
    private String refreshToken;
}

Frontend에서 사용 할 Token을 전송하기 위한 DTO를 생성한다.

 

3. 암호키설정

커맨드명령어 : openssl rand -hex 32
생성된 키를 application.properties에 저장하고 사용한다.

jwt.secret=34075631b07f8f57d88b1a63d00148709f3f11cc7227d50e3c8a8db687a772a1

 

4. JwtTokenProvider 생성

import java.security.Key;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

import com.expetdia.common.domain.JwtToken;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.UnsupportedJwtException;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Component
public class JwtTokenProvider {
    private final Key key;

    // application.yml에서 secret 값 가져와서 key에 저장
    public JwtTokenProvider(@Value("${jwt.secret}") String secretKey) {
        byte[] keyBytes = Decoders.BASE64.decode(secretKey);
        this.key = Keys.hmacShaKeyFor(keyBytes);
    }

    // Member 정보를 가지고 AccessToken, RefreshToken을 생성하는 메서드
    public JwtToken generateToken(Authentication authentication) {
        // 권한 가져오기
        String authorities = authentication.getAuthorities().stream()
                .map(GrantedAuthority::getAuthority)
                .collect(Collectors.joining(","));

        long now = (new Date()).getTime();

        // Access Token 생성
        Date accessTokenExpiresIn = new Date(now + 86400000);
        String accessToken = Jwts.builder()
                .setSubject(authentication.getName())
                .claim("auth", authorities)
                .setExpiration(accessTokenExpiresIn)
                .signWith(key, SignatureAlgorithm.HS256)
                .compact();

        // Refresh Token 생성
        String refreshToken = Jwts.builder()
                .setExpiration(new Date(now + 86400000))
                .signWith(key, SignatureAlgorithm.HS256)
                .compact();

        return JwtToken.builder()
                .grantType("Bearer")
                .accessToken(accessToken)
                .refreshToken(refreshToken)
                .build();
    }

    // Jwt 토큰을 복호화하여 토큰에 들어있는 정보를 꺼내는 메서드
    public Authentication getAuthentication(String accessToken) {
        // Jwt 토큰 복호화
        Claims claims = parseClaims(accessToken);

        if (claims.get("auth") == null) {
            throw new RuntimeException("권한 정보가 없는 토큰입니다.");
        }

        // 클레임에서 권한 정보 가져오기
        Collection<? extends GrantedAuthority> authorities = Arrays.stream(claims.get("auth").toString().split(","))
                .map(SimpleGrantedAuthority::new)
                .collect(Collectors.toList());

        // UserDetails 객체를 만들어서 Authentication return
        // UserDetails: interface, User: UserDetails를 구현한 class
        UserDetails principal = new User(claims.getSubject(), "", authorities);
        return new UsernamePasswordAuthenticationToken(principal, "", authorities);
    }

    // 토큰 정보를 검증하는 메서드
    public boolean validateToken(String token) {
        try {
            Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(token);
            return true;
        } catch (SecurityException | MalformedJwtException e) {
            log.info("Invalid JWT Token", e);
        } catch (ExpiredJwtException e) {
            log.info("Expired JWT Token", e);
        } catch (UnsupportedJwtException e) {
            log.info("Unsupported JWT Token", e);
        } catch (IllegalArgumentException e) {
            log.info("JWT claims string is empty.", e);
        }
        return false;
    }


    // accessToken
    private Claims parseClaims(String accessToken) {
        try {
            return Jwts.parserBuilder()
                    .setSigningKey(key)
                    .build()
                    .parseClaimsJws(accessToken)
                    .getBody();
        } catch (ExpiredJwtException e) {
            return e.getClaims();
        }
    }

}

 

5. JwtAuthenticationFilter 구현

import java.io.IOException;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.GenericFilterBean;

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class JwtAuthenticationFilter extends GenericFilterBean {
    private final JwtTokenProvider jwtTokenProvider;


    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 1. Request Header에서 JWT 토큰 추출
        String token = resolveToken((HttpServletRequest) request);

        // 2. validateToken으로 토큰 유효성 검사
        if (token != null && jwtTokenProvider.validateToken(token)) {
            // 토큰이 유효할 경우 토큰에서 Authentication 객체를 가지고 와서 SecurityContext에 저장
            Authentication authentication = jwtTokenProvider.getAuthentication(token);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }
        chain.doFilter(request, response);
    }

    // Request Header에서 토큰 정보 추출
    private String resolveToken(HttpServletRequest request) {
        String bearerToken = request.getHeader("Authorization");
        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer")) {
            return bearerToken.substring(7);
        }
        return null;
    }
}

 

6. SecurityConfig 구현

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import lombok.RequiredArgsConstructor;

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
    private final JwtTokenProvider jwtTokenProvider;
    
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                // REST API이므로 basic auth 및 csrf 보안을 사용하지 않음
                .httpBasic().disable()
                .csrf().disable()
                // JWT를 사용하기 때문에 세션을 사용하지 않음
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeHttpRequests()
                // 해당 API에 대해서는 모든 요청을 허가
                .requestMatchers("/v1/mem/login").permitAll()
                .requestMatchers("/v1/mem/check-dup-id").permitAll()
                .requestMatchers("/v3/api-docs/**").permitAll()
                .requestMatchers("/swagger-ui/**").permitAll()
                // USER 권한이 있어야 요청할 수 있음
                //.requestMatchers("/v1/com/*").hasRole("USER")
                // 이 밖에 모든 요청에 대해서 인증을 필요로 한다는 설정
                .anyRequest().authenticated()
                .and()
                // JWT 인증을 위하여 직접 구현한 필터를 UsernamePasswordAuthenticationFilter 전에 실행
                .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class)
                .build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        // BCrypt Encoder 사용
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }


}

 

7. UserDetails Interface 구현

import java.util.ArrayList;
import java.util.Collection;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;


@Data
@AllArgsConstructor
@Builder
@SuppressWarnings("serial")
public class CustomUserDetails implements UserDetails {
	
	private String username;
	private String password;
	private String usrNo;
	private String name;
	private String auth;
	private int enabled;
	
	@Override
	public Collection<? extends GrantedAuthority> getAuthorities() {
		ArrayList<GrantedAuthority> authList = new ArrayList<GrantedAuthority>();
		authList.add(new SimpleGrantedAuthority(auth));
		return authList;
	}

	@Override
	public String getPassword() {
		return password;
	}

	@Override
	public String getUsername() {
		return username;
	}

	@Override
	public boolean isAccountNonExpired() {
		return true;
	}

	@Override
	public boolean isAccountNonLocked() {
		return true;
	}

	@Override
	public boolean isCredentialsNonExpired() {
		return true;
	}

	@Override
	public boolean isEnabled() {
		return enabled==1?true:false;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public String getUsrNo() {
		return usrNo;
	}

	public void setUsrNo(String usrNo) {
		this.usrNo = usrNo;
	}

}

 

8. UserDetailsService Interface 구현

import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import com.expetdia.member.application.port.out.LoginOutPort;
import com.expetdia.member.domain.CustomUserDetails;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {

    private final LoginOutPort loginOutPort;

    private final PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    	
    	CustomUserDetails user = loginOutPort.findByUsername(username);
    	
    	if(user == null) {
    		throw new UsernameNotFoundException("username " + username + " not found");
    	}
    	
        return User.builder()
                .username(user.getUsername())
                .password(user.getPassword())
                .roles(user.getAuth())
                .build();
    }

}

 

9. 최종적으로 인증을 사용할 Service 구현

    @Override
    public JwtToken userLogin(String username, String password) {
    	// 1. ID / PASSWORD 확인
    	UserVO vo = loginOutPort.checkUserInfo(CustomUserDetails.builder().username(username).build());
    	    	
    	if(vo == null || !passwordEncoder.matches(password, vo.getLgnPwd())) {
    		throw new LoginAuthenticationException("");
    	}
    	
    	UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password);
        // 2. 실제 검증. authenticate() 메서드를 통해 요청된 Member 에 대한 검증 진행
        // authenticate 메서드가 실행될 때 CustomUserDetailsService 에서 만든 loadUserByUsername 메서드 실행
        Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
        // 3. 인증 정보를 기반으로 JWT 토큰 생성
        JwtToken jwtToken = jwtTokenProvider.generateToken(authentication);
		return jwtToken;
	}
반응형
블로그 이미지

Mr.비타민

,

협력사 다운로드 URL

2024. 7. 24. 11:12

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

GCP

카테고리 없음 2022. 9. 21. 17:56
반응형

C. Use Stackdriver Debugger to review the execution of logic within each application to instrument all applications.
A. Instrument all applications with Stackdriver Profiler.
B. Instrument all applications with Stackdriver Trace and review inter-service HTTP requests.
D. Modify the Node.js application to log HTTP request and response times to dependent applications. Use Stackdriver Logging to find dependent applications that are performing poorly.

C. Click ג€Share chart by URLג€ and provide the URL to the SRE team. Assign the SRE team the Monitoring Viewer IAM role in the workspace project.
A. Share the workspace Project ID with the SRE team. Assign the SRE team the Monitoring Viewer IAM role in the workspace project.
B. Share the workspace Project ID with the SRE team. Assign the SRE team the Dashboard Viewer IAM role in the workspace project.
D. Click ג€Share chart by URLג€ and provide the URL to the SRE team. Assign the SRE team the Dashboard Viewer IAM role in the workspace project.

D. Develop a postmortem that includes the root causes, resolution, lessons learned, the list of people responsible, and a list of action items for each person. Share it on the engineering organization's document portal.
A. Develop a postmortem that includes the root causes, resolution, lessons learned, and a prioritized list of action items. Share it with the manager only.
C. Develop a postmortem that includes the root causes, resolution, lessons learned, the list of people responsible, and a list of action items for each person. Share it with the manager only.
B. Develop a postmortem that includes the root causes, resolution, lessons learned, and a prioritized list of action items. Share it on the engineering organization's document portal.

A. Use the default Stackdriver Kubernetes Engine Monitoring agent configuration.
B. Deploy a Fluentd daemonset to GKE. Then create a customized input and output configuration to tail the log file in the application's pods and write to Stackdriver Logging.
C. Install Kubernetes on Google Compute Engine (GCE) and redeploy your applications. Then customize the built-in Stackdriver Logging configuration to tail the log file in the application's pods and write to Stackdriver Logging.
D. Write a script to tail the log file within the pod and write entries to standard output. Run the script as a sidecar container with the application's pod. Configure a shared volume between the containers to allow the script to have read access to /var/log in the application container.

A. Look for the agent's test log entry in the Logs Viewer.
B. Install the most recent version of the Stackdriver agent.
C. Verify the VM service account access scope includes the monitoring.write scope.
D. SSH to the VM and execute the following commands on your VM: ps ax | grep fluentd.

A. Add logic to each Cloud Build step to HTTP POST the build information to a webhook.
B. Add a new step at the end of the pipeline in Cloud Build to HTTP POST the build information to a webhook.
C. Use Stackdriver Logging to create a logs-based metric from the Cloud Build logs. Create an Alert with a Webhook notification type.
D. Create a Cloud Pub/Sub push subscription to the Cloud Build cloud-builds PubSub topic to HTTP POST the build information to a webhook.

A. Compare the canary with a new deployment of the current production version.
B. Compare the canary with a new deployment of the previous production version.
C. Compare the canary with the existing deployment of the current production version.
D. Compare the canary with the average performance of a sliding window of previous production versions.

A. Bucketize the request latencies into ranges, and then compute the percentile at 100 ms.
B. Bucketize the request latencies into ranges, and then compute the median and 90th percentiles.
C. Count the number of home page requests that load in under 100 ms, and then divide by the total number of home page requests.
D. Count the number of home page request that load in under 100 ms, and then divide by the total number of all web application requests.

A. Before merging new code, require 2 different peers to review the code changes.
B. Adopt the blue/green deployment strategy when releasing new code via a CD server.
C. Integrate a code linting tool to validate coding standards before any code is accepted into the repository.
D. Require developers to run automated integration tests on their local development environments before release.
E. Configure a CI server. Add a suite of unit tests to your code and have your CI server run them on commit and verify any changes.

D. ג€¢ Install the gsutil command line tool on your application servers. ג€¢ Write a script using gsutil to upload your application log to a Cloud Storage bucket, and then schedule it to run via cron every 5 minutes. ג€¢ Give the developers the IAM Object Viewer access to view the logs in the specified bucket.
A. ג€¢ Deploy the Stackdriver logging agent to the application servers. ג€¢ Give the developers the IAM Logs Viewer role to access Stackdriver and view logs.
B. ג€¢ Deploy the Stackdriver logging agent to the application servers. ג€¢ Give the developers the IAM Logs Private Logs Viewer role to access Stackdriver and view logs.
C. ג€¢ Deploy the Stackdriver monitoring agent to the application servers. ג€¢ Give the developers the IAM Monitoring Viewer role to access Stackdriver and view metrics.

A. Configure the VPC as a Shared VPC Host project.
B. Configure your network services on the Standard Tier.
C. Configure your Kubernetes cluster as a Private Cluster.
D. Configure a Google Cloud HTTP Load Balancer as Ingress.

B. Develop a post-mortem to be distributed to stakeholders.
A. Call individual stakeholders to explain what happened.
C. Send the Incident State Document to all the stakeholders.
D. Require the engineer responsible to write an apology email to all stakeholders.

A. Verify the maximum node pool size, enable a horizontal pod autoscaler, and then perform a load test to verify your expected resource needs.
B. Because you are deployed on GKE and are using a cluster autoscaler, your GKE cluster will scale automatically, regardless of growth rate.
D. Proactively add 60% more node capacity to account for six months of 10% growth rate, and then perform a load test to make sure you have enough capacity.
C. Because you are at only 30% utilization, you have significant headroom and you won't need to add any additional capacity for this rate of growth.

A. Use Cloud Build to trigger a Spinnaker pipeline.
C. Use a custom builder in Cloud Build to trigger Jenkins pipeline.
B. Use Cloud Pub/Sub to trigger a Spinnaker pipeline.
D. Use Cloud Pub/Sub to trigger a custom deployment service running in Google Kubernetes Engine (GKE).

C. MTTD: 5 MTTR: 10 MTBF: 90 Impact: 50%
D. MTTD: 5 MTTR: 20 MTBF: 90 Impact: 50%
B. MTTD: 5 MTTR: 20 MTBF: 90 Impact: 33%
A. MTTD: 5 MTTR: 10 MTBF: 90 Impact: 33%

D. Set up the Kubernetes Engine clusters with Binary Authorization.
C. Set up the Kubernetes Engine clusters as private clusters.
B. Enable Vulnerability Analysis on the Container Registry.
A. Enable Cloud Security Scanner on the clusters.

C. Use the Stackdriver Monitoring API to create custom metrics, and then organize your containers using groups.
A. Use Stackdriver Kubernetes Engine Monitoring.
D. Use Stackdriver Logging to export application logs to BigQuery, aggregate logs per container, and then analyze CPU and memory consumption.
B. Use Prometheus to collect and aggregate logs per container, and then analyze the results in Grafana.

A. Create an automated testing script in production to detect failures as soon as they occur.
D. Create a development environment for writing code and a test environment for configurations, experiments, and load testing.
C. Secure the production environment to ensure that developers can't change it and set up one controlled update per year.
B. Create a development environment with smaller server capacity and give access only to developers and testers.

A. flex/connections/current
D. flex/instance/connections/current
C. tcp_ssl_proxy/open_connections
B. tcp_ssl_proxy/new_connections

B. Use Stackdriver Profiler to visualize the resources utilization throughout the application.
C. Determine whether there is an increased number of connections to the Cloud SQL instance.
D. Use Cloud Security Scanner to see whether your Cloud SQL is under a Distributed Denial of Service (DDoS) attack.
A. Check the serial port logs of the Compute Engine instance.

B. Supply the source control tag as a parameter within the image name.
A. Reference the image digest in the source control tag.
D. Use GCR digest versioning to match the image to the tag in source control.
C. Use Cloud Build to include the release version tag in the application image.

A. Look for ways to mitigate user impact and deploy the mitigations to production.
D. Start a postmortem, add incident information, circulate the draft internally, and ask internal stakeholders for input.
B. Contact the affected service owners and update them on the status of the incident.
C. Establish a communication channel where incident responders and leads can communicate with each other.

D. Create a new GCP monitoring project and create a Stackdriver Workspace inside it. Attach the production projects to this workspace. Grant relevant team members read access to the Stackdriver Workspace.
B. Grant relevant team members the Project Viewer IAM role on all GCP production projects. Create Stackdriver workspaces inside each project.
A. Grant relevant team members read access to all GCP production projects. Create Stackdriver workspaces inside each project.
C. Choose an existing GCP production project to host the monitoring workspace. Attach the production projects to this workspace. Grant relevant team members read access to the Stackdriver Workspace.

C. 1. Export VM utilization logs from Stackdriver to BigQuery. 2. From BigQuery, export the logs to a CSV file. 3. Import the CSV file into Google Sheets. 4. Build a dashboard in Google Sheets and share it with your stakeholders.
D. 1. Export VM utilization logs from Stackdriver to a Cloud Storage bucket. 2. Enable the Cloud Storage API to pull the logs programmatically. 3. Build a custom data visualization application. 4. Display the pulled logs in a custom dashboard.
B. 1. Export VM utilization logs from Stackdriver to Cloud Pub/Sub. 2. From Cloud Pub/Sub, send the logs to a Security Information and Event Management (SIEM) system. 3. Build the dashboards in the SIEM system and share with your stakeholders.
A. 1. Export VM utilization logs from Stackdriver to BigQuery. 2. Create a dashboard in Data Studio. 3. Share the dashboard with your stakeholders.

A. Purchase Committed Use Discounts.
B. Migrate the instances to a Managed Instance Group.
C. Convert the instances to preemptible virtual machines.
D. Create an Unmanaged Instance Group for the instances used to run the workload.

D. Bring the service into production with no SLOs and build them when you have collected operational data.
A. Adjust the SLO targets to be achievable by the service so you can bring it into production.
B. Notify the development team that they will have to provide production support for the service.
C. Identify recommended reliability improvements to the service to be completed before handover.

A. Roll back the experimental canary release.
D. Trace the origin of 500 errors and the root cause of increased latency.
C. Record data for the postmortem document of the incident.
B. Start monitoring latency, traffic, errors, and saturation.

A. ג€¢ Store your code in a Git-based version control system. ג€¢ Establish a process that allows developers to merge their own changes at the end of each day. ג€¢ Package and upload code to a versioned Cloud Storage basket as the latest master version.
B. ג€¢ Store your code in a Git-based version control system. ג€¢ Establish a process that includes code reviews by peers and unit testing to ensure integrity and functionality before integration of code. ג€¢ Establish a process where the fully integrated code in the repository becomes the latest master version.
C. ג€¢ Store your code as text files in Google Drive in a defined folder structure that organizes the files. ג€¢ At the end of each day, confirm that all changes have been captured in the files within the folder structure. ג€¢ Rename the folder structure with a predefined naming convention that increments the version.
D. ג€¢ Store your code as text files in Google Drive in a defined folder structure that organizes the files. ג€¢ At the end of each day, confirm that all changes have been captured in the files within the folder structure and create a new .zip archive with a predefined naming convention. ג€¢ Upload the .zip archive to a versioned Cloud Storage bucket and accept it as the latest version.

A. A quality SLI: the ratio of non-degraded responses to total responses.
B. An availability SLI: the ratio of healthy microservices to the total number of microservices.
D. A latency SLI: the ratio of microservice calls that complete in under 100 ms to the total number of microservice calls.
C. A freshness SLI: the proportion of widgets that have been updated within the last 10 minutes.

C. Metrics exported from the application servers.
D. GKE health checks for your application servers.
E. A synthetic client that periodically sends simulated user requests.
B. Instrumentation coded directly in the client.
A. Your application servers' logs.

A. Publish various metrics from the application directly to the Stackdriver Monitoring API, and then observe these custom metrics in Stackdriver.
B. Install the Cloud Pub/Sub client libraries, push various metrics from the application to various topics, and then observe the aggregated metrics in Stackdriver.
D. Emit all metrics in the form of application-specific log messages, pass these messages from the containers to the Stackdriver logging collector, and then observe metrics in Stackdriver.
C. Install the OpenTelemetry client libraries in the application, configure Stackdriver as the export destination for the metrics, and then observe the application's metrics in Stackdriver.

A. File a bug with the development team so they can find the root cause of the crashing instance.
D. Create a Stackdriver Monitoring dashboard with SMS alerts to be able to start recreating the crashed instance promptly after it was crashed.
C. Add a Load Balancer in front of the Compute Engine instance and use health checks to determine the system status.
B. Create a Managed instance Group with a single instance and use health checks to determine the system status.

B. Store secrets in a separate configuration file on Git. Provide select developers with access to the configuration file.
A. Prompt developers for secrets at build time. Instruct developers to not store secrets at rest.
D. Encrypt the secrets and store them in the source code repository. Store a decryption key in a separate repository and grant your pipeline access to it.
C. Store secrets in Cloud Storage encrypted with a key from Cloud KMS. Provide the CI/CD pipeline with access to Cloud KMS via IAM.

A. Focus on responding to internal stakeholders at least every 30 minutes. Commit to ג€next updateג€ times.
C. Delegate the responding to internal stakeholder emails to another member of the Incident Response Team. Focus on providing responses directly to customers.
D. Provide all internal stakeholder emails to the Incident Commander, and allow them to manage internal communications. Focus on providing responses directly to customers.
B. Provide periodic updates to all stakeholders in a timely manner. Commit to a ג€next updateג€ time in all communications.

A. Assign the Container Developer role to the Cloud Build service account.
C. Create a new service account with the Container Developer role and use it to run Cloud Build.
D. Create a separate step in Cloud Build to retrieve service account credentials and pass these to kubectl.
B. Specify the Container Developer role for Cloud Build in the cloudbuild.yaml file.

B. Configure Stackdriver Profiler to identify and visualize when the cache misses occur based on the logs.
D. Configure BigQuery as a sink for Stackdriver Logging. Create a scheduled query to filter the cache miss logs and write them to a separate table.
C. Create a logs-based metric in Stackdriver Logging and a dashboard for that metric in Stackdriver Monitoring.
A. Link Stackdriver Logging as a source in Google Data Studio. Filter the logs on the cache misses.

D. Deploy the service in one region and use a global load balancer to route traffic to this region.
B. Monitor results of Stackdriver Trace to determine the required amount of resources.
A. Use the n1-highcpu-96 machine type in the configuration of the MIG.
C. Validate that the resource requirements are within the available quota limits of each region.

B. Use a Fluentd filter plugin with the Stackdriver Agent to remove log entries containing userinfo, and then copy the entries to a Cloud Storage bucket.
C. Create an advanced log filter matching userinfo, configure a log export in the Stackdriver console with Cloud Storage as a sink, and then configure a log exclusion with userinfo as a filter.
D. Use a Fluentd filter plugin with the Stackdriver Agent to remove log entries containing userinfo, create an advanced log filter matching userinfo, and then configure a log export in the Stackdriver console with Cloud Storage as a sink.
A. Create a basic log filter matching userinfo, and then configure a log export in the Stackdriver console with Cloud Storage as a sink.

A. Disable the CI pipeline and revert to manually building and pushing the artifacts.
D. Run a Git compare between the previous and current Cloud Build Configuration files to find and fix the bug.
B. Change the CI pipeline to push the artifacts is Container Registry instead of Docker Hub.
C. Upload the configuration YAML file to Cloud Storage and use Error Reporting to identify and fix the issue.

B. Ensure that test cases that catch errors of this type are run successfully before new software releases.
C. Follow up with the employees who reviewed the changes and prescribe practices they should follow in the future.
D. Design a policy that will require on-call teams to immediately call engineers and management to discuss a plan of action if an incident occurs.
A. Identify engineers responsible for the incident and escalate to their senior management.

D. Create new synthetic clients to simulate a user journey using the application.
A. Review current application metrics and add new ones as needed.
B. Modify the code to capture additional information for user interaction.
C. Analyze the web proxy logs only and capture response time of each request.
E. Use current and historic Request Logs to trace customer interaction with the application.

C. Create and grant a custom IAM role with the permissions logging.sinks.list and logging.sink.get.
A. Grant the team members the IAM role of logging.configWriter on Cloud IAM.
D. Create an Organizational Policy in Cloud IAM to allow only these members to create log exports.
B. Configure Access Context Manager to allow only these members to export logs.

B. Use a Binary Authorization policy that includes the whitelist name pattern gcr.io/altostrat-images/.
A. Create a custom builder for Cloud Build that will only push images to gcr.io/altostrat-images.
D. Add a tag to each image in gcr.io/altostrat-images and check that this tag is present when the image is deployed.
C. Add logic to the deployment pipeline to check that all manifests contain only images from gcr.io/altostrat-images.

D. Expose the NGINX stats endpoint and configure the horizontal pod autoscaler to use the request metrics exposed by the NGINX deployment.
C. Install the Stackdriver custom metrics adapter and configure a horizontal pod autoscaler to use the number of requests provided by the GCLB.
A. Configure the horizontal pod autoscaler to use the average response time from the Liveness and Readiness probes.
B. Configure the vertical pod autoscaler in GKE and enable the cluster autoscaler to scale the cluster as pods expand.

C. Communications Lead
A. Operations Lead
E. External Customer Communications Lead
B. Engineering Lead
D. Customer Impact Assessor

A. Download and configure a third-party integration between Stackdriver Monitoring and an SMS gateway. Ensure that your team members add their SMS/phone numbers to the external tool.
D. Configure a Slack notification for each alerting policy. Set up a Slack-to-SMS integration to send SMS messages when Slack messages are received. Ensure that your team members add their SMS/phone numbers to the external integration.
C. Ensure that your team members set their SMS/phone numbers in their Stackdriver Profile. Select the SMS notification option for each alerting policy and then select the appropriate SMS/phone numbers from the list.
B. Select the Webhook notifications option for each alerting policy, and configure it to use a third-party integration tool. Ensure that your team members add their SMS/phone numbers to the external tool.

B. ג€¢ In your application, create a metric with a metricKind set to CUMULATIVE and a valueType set to DOUBLE. ג€¢ In Stackdriver's Metrics Explorer, use a Line graph to visualize the metric.
D. ג€¢ In your application, create a metric with a metricKind set to METRIC_KIND_UNSPECIFIED and a valueType set to INT64. ג€¢ In Stackdriver's Metrics Explorer, use a Stacked Area graph to visualize the metric.
A. ג€¢ In your application, create a metric with a metricKind set to DELTA and a valueType set to DOUBLE. ג€¢ In Stackdriver's Metrics Explorer, use a Stacked Bar graph to visualize the metric.
C. ג€¢ In your application, create a metric with a metricKind set to GAUGE and a valueType set to DISTRIBUTION. ג€¢ In Stackdriver's Metrics Explorer, use a Heatmap graph to visualize the metric.

D. Install an Application Performance Monitoring (APM) tool in both locations, and configure an export to a central data storage location for analysis.
B. Import the Stackdriver Debugger package, and configure the application to emit debug messages with timing information.
A. Import the Stackdriver Profiler package, and configure it to relay function timing data to Stackdriver for further analysis.
C. Instrument the code using a timing library, and publish the metrics via a health check endpoint that is scraped by Stackdriver.

B. The organization's public-facing website.
C. A distributed, eventually consistent NoSQL database cluster with sufficient quorum.
D. A GPU-accelerated video rendering platform that retrieves and stores videos in a storage bucket.
A. A scalable in-memory caching system.

A. Configure the build system with protected branches that require pull request approval.
C. Leverage Kubernetes Role-Based Access Control (RBAC) to restrict access to only approved users.
B. Use an Admission Controller to verify that incoming requests originate from approved sources.
D. Enable binary authorization inside the Kubernetes cluster and configure the build pipeline as an attestor.

A. Change the specified SLO to match the measured SLI
D. Set up additional service instances in other zones and use them as a failover in case the primary instance is unavailable
B. Move the service to higher-specification compute instances with more memory
C. Set up additional service instances in other zones and load balance the traffic between all instances

C. Enable VPC Flow Logs on the testing and production VPC network frontend and backend subnets with a volume scale of 0.5. Apply changes in testing before production.
B. Enable VPC Flow Logs on the production VPC network frontend and backend subnets only with a sample volume scale of 1.0.
A. Enable VPC Flow Logs on the production VPC network frontend and backend subnets only with a sample volume scale of 0.5.
D. Enable VPC Flow Logs on the testing and production VPC network frontend and backend subnets with a volume scale of 1.0. Apply changes in testing before production.

B. Store the Terraform code in a network shared folder with child folders for each version release. Ensure that everyone works on different files.
D. Store the Terraform code in a shared Google Drive folder so it syncs automatically to every team member's computer. Organize files with a naming convention that identifies each new version.
A. Store the Terraform code in a version-control system. Establish procedures for pushing new versions and merging with the master.
C. Store the Terraform code in a Cloud Storage bucket using object versioning. Give access to the bucket to every team member so they can download the files.

A. Confirm that the Stackdriver agent has been installed in the hosting virtual machine.
D. Confirm that the application is using the required client library and the service account key has proper permissions.
C. Confirm that port 25 has been opened in the firewall to allow messages through to Stackdriver.
B. Confirm that your account has the proper permissions to use the Stackdriver dashboard.

D. Implement static code analysis tooling against the Docker files used to create the containers.
C. Reconfigure the existing operating system vulnerability software to exist inside the container.
B. Configure the containers in the build pipeline to always update themselves before release.
A. Set up Container Analysis to scan and report Common Vulnerabilities and Exposures.

D. Use larger Cloud Build virtual machines (VMs) by using the machine-type option.
C. Use multiple smaller build steps to minimize execution time.
B. Run multiple Jenkins agents to parallelize the build.
A. Use Cloud Storage to cache intermediate artifacts.

C. Upsize the virtual machines running the login services.
A. Roll back the recent release.
B. Review the Stackdriver monitoring.
D. Deploy a new release to see whether it fixes the problem.

C. Integrate the application with a Single sign-on (SSO) system and do not expose secrets to the application.
B. Inject the secret at the time of instance creation via an encrypted configuration management system.
A. Store the encryption keys in Cloud Key Management Service (KMS) and rotate the keys frequently
D. Leverage a continuous build pipeline that produces multiple versions of the secret for each instance of the application.

C. Distribute the alerts to engineers in different time zones.
D. Redefine the related Service Level Objective so that the error budget is not exhausted.
B. Create an incident report for each of the alerts.
A. Eliminate unactionable alerts.

C. Pre-provision double the compute power used last season, expecting growth.
A. Load teat the application to profile its performance for scaling.
D. Create a runbook on inflating the disaster recovery (DR) environment if there is growth.
B. Enable AutoScaling on the production clusters, in case there is growth.

A. Upgrade the GCS buckets to Multi-Regional.
B. Enable high availability on the CloudSQL instances.
C. Move the application from App Engine to Compute Engine.
D. Modify the App Engine configuration to have additional idle instances.

B. Implement Jenkins on Kubernetes on-premises.
A. Implement Jenkins on local workstations.
D. Implement Jenkins on Compute Engine virtual machines.
C. Implement Jenkins on Google Cloud Functions.

C. Create an export in Stackdriver and configure Cloud Pub/Sub to store logs in permanent storage for seven years.
A. Create a Cloud Storage bucket and develop your application to send logs directly to the bucket.
B. Develop an App Engine application that pulls the logs from Stackdriver and saves them in BigQuery.
D. Create a sink in Stackdriver, name it, create a bucket on Cloud Storage for storing archived logs, and then select the bucket as the log export destination.

B. Install the Stackdriver Error Reporting library for Python, and then run your code on Google Kubernetes Engine.
D. Use the Stackdriver Error Reporting API to write errors from your application to ReportedErrorEvent, and then generate log entries with properly formatted error messages in Stackdriver Logging.
C. Install the Stackdriver Error Reporting library for Python, and then run your code on App Engine flexible environment.
A. Install the Stackdriver Error Reporting library for Python, and then run your code on a Compute Engine VM.

A. 90 percentile ג€" 100ms th 95 percentile ג€" 250ms th
B. 90 percentile ג€" 120ms th 95 percentile ג€" 275ms th
D. 90 percentile ג€" 250ms th 95 percentile ג€" 400ms th
C. 90 percentile ג€" 150ms th 95 percentile ג€" 300ms th

A. Develop an appropriate error budget policy in cooperation with all service stakeholders.
C. Negotiate with the development team to reduce the release frequency to no more than once a week.
D. Add a plugin to your Jenkins pipeline that prevents new releases whenever your service is out of SLO.
B. Negotiate with the product team to always prioritize service reliability over releasing new features.

C. Create a Development and a Production GKE cluster in separate projects. In each cluster, create a Kubernetes namespace per team, and then configure Identity Aware Proxy so that each team can only access its own namespace.
B. Create one GCP Project per team. In each project, create a cluster with a Kubernetes namespace for Development and one for Production. Grant the teams IAM access to their respective clusters.
A. Create one GCP Project per team. In each project, create a cluster for Development and one for Production. Grant the teams IAM access to their respective clusters.
D. Create a Development and a Production GKE cluster in separate projects. In each cluster, create a Kubernetes namespace per team, and then configure Kubernetes Role-based access control (RBAC) so that each team can only access its own namespace.

D. Push the images to a private image registry running on a Compute Engine instance in the eu-west-1 region.
B. Push the images to Google Container Registry (GCR) using the us.gcr.io hostname.
C. Push the images to Google Container Registry (GCR) using the eu.gcr.io hostname.
A. Push the images to Google Container Registry (GCR) using the gcr.io hostname.

C. Enrich all instances with metadata specific to the system they run. Configure Stackdriver Logging to export to BigQuery, and query costs based on the metadata.
A. In the Google Cloud Platform Console, use the Cost Breakdown section to visualize the costs per system.
D. Name each virtual machine (VM) after the system it runs. Set up a usage report export to a Cloud Storage bucket. Configure the bucket as a source in BigQuery to query costs based on VM name.
B. Assign all instances a label specific to the system they run. Configure BigQuery billing export and query costs per label.

D. Use Cloud Key Management Service (Cloud KMS) to encrypt the secrets and include them in your Cloud Build deployment configuration. Grant Cloud Build access to the KeyRing.
C. Use client-side encryption to encrypt the secrets and store them in a Cloud Storage bucket. Store a decryption key in the bucket and grant Cloud Build access to the bucket.
B. Encrypt the secrets and store them in the application repository. Store a decryption key in a separate repository and grant Cloud Build access to the repository.
A. Create a Cloud Storage bucket and use the built-in encryption at rest. Store the secrets in the bucket and grant Cloud Build access to the bucket.

C. Add an extra node pool that consists of high memory and high CPU machine type instances to the cluster.
A. Reroute the user traffic from the affected region to other regions that don't report issues.
B. Use Stackdriver Monitoring to check for a spike in CPU or memory usage for the affected region.
D. Use Stackdriver Logging to filter on the clusters in the affected region, and inspect error messages in the logs.

D. Your opinion of the incident's severity compared to past incidents
E. Copies of the design documents for all the services impacted by the incident
B. A list of employees responsible for causing the incident
C. A list of action items to prevent a recurrence of the incident
A. An explanation of the root cause of the incident.

B. Use Node taints with NoExecute.
C. Use a replica set in the deployment specification.
D. Use a stateful set with parallel pod management policy.
A. Use a partitioned rolling update.

D. As the reporting backend PD throughout capacity compared to a known-good threshold
B. As the proportion of report generation requests that result in a successful response
C. As the application's report generation queue size compared to a known-good threshold
A. As the I/O wait times aggregated across all report generation backends

C. Create a Dataflow pipeline to analyze service metrics in real time.
A. Analyze VPC flow logs along the path of the request.
D. Use a distributed tracing framework such as OpenTelemetry or Stackdriver Trace.
B. Investigate the Liveness and Readiness probes for each service.

C. Assign collaborators but no individual owners to the items to keep the postmortem blameless.
D. Assign the team lead as the owner for all action items because they are in charge of the SRE team.
B. Assign multiple owners for each item to guarantee that the team addresses items quickly.
A. Assign one owner for each action item and any necessary collaborators.

A. Introduce the new version of the API. Announce deprecation of the old version of the API. Deprecate the old version of the API. Contact remaining users of the old API. Provide best effort support to users of the old API. Turn down the old version of the API.
C. Announce deprecation of the old version of the API. Contact remaining users on the old API. Introduce the new version of the API. Deprecate the old version of the API. Provide best effort support to users of the old API. Turn down the old version of the API.
D. Introduce the new version of the API. Contact remaining users of the old API. Announce deprecation of the old version of the API. Deprecate the old version of the API. Turn down the old version of the API. Provide best effort support to users of the old API.
B. Announce deprecation of the old version of the API. Introduce the new version of the API. Contact remaining users on the old API. Deprecate the old version of the API. Turn down the old version of the API. Provide best effort support to users of the old API.

B. Use the fluent-plugin-record-reformer Fluentd output plugin to remove the fields from the log entries in flight.
D. Stage log entries to Cloud Storage, and then trigger a Cloud Function to remove the fields and write the entries to Stackdriver via the Stackdriver Logging API.
A. Use the filter-record-transformer Fluentd filter plugin to remove the fields from the log entries in flight.
C. Wait for the application developers to patch the application, and then verify that the log entries are no longer exposing PII.

C. Plan individual meetings with all the engineers involved. Determine who approved and pushed the new release to production.
A. Focus on developing new features rather than avoiding the outages from recurring.
D. Use the Git history to find the related code commit. Prevent the engineer who made that commit from working on production services.
B. Focus on identifying the contributing causes of the incident rather than the individual responsible for the cause.

E. Announce planned downtime to consume more error budget, and ensure that users are not depending on a tighter SLO.
D. Implement and measure additional Service Level Indicators (SLIs) fro the application.
A. Add more serving capacity to all of your application's zones.
B. Have more frequent or potentially risky application releases.
C. Tighten the SLO match the application's observed reliability.

C. Shift engineering time to other services that need more reliability.
B. Increase the service's deployment velocity and/or risk.
A. Make the service's SLO more strict.
E. Change the implementation of your Service Level Indicators (SLIs) to increase coverage.
D. Get the product team to prioritize reliability work over new features.

 

1. B 2. C 3. B 4. B 5. D 6. D 7. A 8. C 9. BE 10. A 11. D 12. B 13. A 14. B 15. B 16. D -- 17. A 18. D 19. A 20. B -- 21. C 22. C 23. D 24. A 25. A 26. C 27. A 28. B 29. A 30.BE 31. A 32. B 33. C 34. B 35. A 36. C 37. C  38. B 39. D 40. B 41. DE 42. A 43. B 44. C 45. AC 46. C 47. C  48. A 49. D 50. D  51. C 52. B 53. A 54. A 55. A  56. A 57. A 58. A 59. A 60. A 61. D 62. D  63. D 64. C 65. C 66. A 67. D 68. C 69. B 70. D 71. A 72. AC 73. A 74. B 75. D 76. A 77. A 78. A 79. B 80. DE 81. BC

 

반응형
블로그 이미지

Mr.비타민

,

맛집

카테고리 없음 2019. 9. 26. 16:45
반응형

[서울] 

강남 : 봉우이층집 (이베리코) 

구의 : 롱테이블 (스테이크) 

논현동 : 리북집 (족발) 

마포구 : 원조마포껍데기집(껍데기) 

모현읍 : 천서리막국수(막국수) 

문래 : 소문난 식당(고등어김치찜) 

문래 : 송원 돼지갈비(돼지갈비) 

부암동 : 자하손만두(만두) 

분당 : 코이라멘(라멘) 

분당 : 평가옥(평양냉면) 

분당 : 춘천닭갈비(닭갈비) 

분당 : 서울24시감자탕(감자탕) 

분당 : 최가돈가스(돈가스) 

분당 : 지글(고기뷔페) 

분당 : 돈멜(삼겹살) 

선릉 : 육미당당 (삼겹살) 

숙대입구역 : 구복만두(만두) 

시청(태평로) : 농민백암순대 

신림 : 서울갈비 (우삼겹) 

여의도 : 불타는이기자곱창(곱창) 

영등포 : 대한옥(꼬리찜) 

용산 : 야스노야 지로 (양갈비) 

용산 : 북천 돈까스(돈까스) 

왕십리 : 제일곱창(곱창) 

우면 : 소나무집(청국장 닭볶음탕) 

익선동 : 오죽이네(닭매운탕) 

을지로 : 우래옥 평양냉면(냉면) 

종각 : 후니도니 (돈까스) 

종로 : 계림닭볶음탕 (닭볶음탕) 

충무로 : 성원식품(LA 갈비) 

혜화 : 정돈(일본식 돈까스) 



[경기] 

광교 : 지아니스나폴리(피자) 

광교 : 스월 (스테이크) 

남양주 : 동동국수집(육계장 칼국수) 

남양주 : 장어의꿈(장어) 

산본동 : 산본대성곱창(곱창) 

성우동 : 성동관(고기짬뽕) 

송내 : 호미불닭발 

송탄 : 김씨네, 최씨네(부대찌개) 

송탄 : 홍태루(매운고기짬뽕) 

송탄 : 지성원(매운탕수육) 

수원역앞 : 짱이네(분식) 

수원역앞 로데오거리 : 부추삼겹살 (삼겹살) 

신불당 : 육화미(돼지) 

신불당 : 화곡집(돼지) 

신불당 : 족발야시장(돼지) 

신불당 : 우심(소) 

신불당 : 하누연(소) 

신불당 : 라무라쿠(양) 

신불당 : 한가네숯불닭갈비(닭) 

신불당 : 인근주민(닭) 

신불당 : 택이네 조개전골(해산물) 

신불당 : 밥통문어(해산물) 

신불당 : 어사출또(회) 

신불당 : 기꾸(참치) 

신불당 : 삼다별장(새우) 

아주대삼거리 : 보영만두(만두) 

아주대삼거리 : 할머니부대찌개(부대찌개) 

아주대삼거리 : 상그릴라(인도요리) 

용두동 : 반구정민물장어(장어) 

원동 : 장인족발608(족발) 

원동 : 운암명가(부대찌개) 

인계동 : 마포본가 (양념갈비) 

인계동 : 백년한우(한우) 

인계동 : 1인자감자탕(감자탕) 

인덕원 : 연탄불막창(막창) 

지동 : 추억의장날만두(만두) 

통진읍 : 꼬꼬오리주물럭(오리주물럭) 



[강원] 

속초 : 춘선네 (물곰치) 

양양 : 영광정 메밀국수 (편육,막국수) 

원주 : 보릿고개(보리밥) 

정선 : 전영진어가(향어숙회) 



[경북] 

김천 : 중국만두(만두) 

구미 : 신상철 선상곱창(곱창) 

구미 : 대한곱창(곱창) 



[대전] 

대흥동 : 서울치킨(치킨) 정부청사앞 : 열도(우동) 

중리동 : 오문창 순대(순대) 



[대구] 

공평동 : 원주 통닭(치킨) 

대현동 : 수봉반점(중화비빔밥) 

범어동 : 신천토스트(분식) 

삼덕동 : 미야꼬 우동(우동) 



[광주] 

노대동 : 쌍교숯불갈비, 수북회관(숯불갈비) 

명화동 : 명화식육식당(애호박찌개) 

벽진동 : 행복한 임금님(떡갈비) 

봉선동 : 남해가든(한우) 

봉선동 : 오리의집(오리 로스) 

쌍촌동 : 마중물추어탕(추어탕) 

운림동 : 나비야청산가자(삼겹살) 

유촌동 : 백년미가(한정식) 

월곡동 : 별미추어탕(추어탕) 

장동 : 새벽달 (짬뽕/계란볶음밥) 

중흥동 : 뼈대있는집(뼈해장국) 

충장로 : 궁전제과(제과) 

풍향동 : 밤실마을(육회비빔밥) 



[전북] 

고창 : 나래궁(짬짜면) 



[전남] 

구례 : 부부식장(다슬기수제비) 

구례 : 새수궁가든(참게메기탕) 

나주 : 송현불고기(불고기) 

나주 : 하얀집(곰탕) 

담양 : 절라도 떡갈비(떡갈비) 

담양 : 달빛뜨락(닭) 

여수 : 해물나라(삼치회) 

영광 : 지산장어(풍천장어) 



[부산] 

서면 : 춘하추동 (밀면) 

장전역 부근 : 오륙도낙지 (낙곱새)

반응형
블로그 이미지

Mr.비타민

,
반응형

최근 노트북이 필요해서 수소문끝에 서피스냐 그램이냐라는 갈림길에서서

최종적으로 그램으로 선택.

15인치로 할지 17인치로 할지도 갈림길에 섰으나,

휴대성을 동반한 15인치로 Pick!!!

 

위메프에서 구입당시에 품절로인해 재입고까지 일주일이라는 시간을 기다려 그램을 받았다!

깔끔한 박스포장!!!

 

 

윈도우 미설치 버전이라, 

바로 USB로 윈도우를 설치까지완료.

 

현재 잘사용중!!!

 

무엇보다도 가벼움과 휴대성이 극대화 되어있어 평소에도 편하게 쓸수있을것같다.

 

이제 열심히 스터디를 시작해야지 ㅠㅠ!

반응형

'취미생활 > 포토' 카테고리의 다른 글

머니볼툰4화  (0) 2014.11.12
머니볼툰 1화  (0) 2014.11.04
헝게에요~  (2) 2011.10.07
블로그 이미지

Mr.비타민

,
반응형

이번에는 Statement가 아닌 PreparedStatement를 활용하여 

데이터를 핸들링하는 예제를 작성해보자.


JdbcConnector.java

package com.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import com.bean.UserBean;


public class JdbcConnector {
	
	public static Connection getConnection() throws ClassNotFoundException, SQLException{
		
		//DB 종료에 따른 JDBC DRIVER 클래스
		Class.forName("com.mysql.jdbc.Driver");
		
		//DB접속 url
		String url = "jdbc:mysql://localhost/test";
		//DB접속 ID
		String id = "root";
		//DB접속 패스워드
		String pw = "1234";
		
		//접속정보로 JDBC 연결 커넥션 생성
		Connection conn = DriverManager.getConnection(url,id,pw);
		
		return conn;
	}
	public static void main(String args[]) throws ClassNotFoundException, SQLException {
		//커넥션생성
		Connection conn = getConnection();
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		UserBean user = new UserBean();
		user.setId("pby0716");
		user.setName("박병영");
		user.setEmail("pby0716@naver.com");
		
		String sql1 = "INSERT INTO MEMBER(ID,NAME,EMAIL) VALUES (?,?,?)";
		
		//PreaparedStatement 생성 후 실행할 쿼리정보 등록
		pstmt = conn.prepareStatement(sql1);
		
		//?에 대한 하는 가변부분 셋팅
		pstmt.setString(1, user.getId());
		pstmt.setString(2, user.getName());
		pstmt.setString(3, user.getEmail());
		
		int count = pstmt.executeUpdate();
		if(count > 0) {
			System.out.println("Insert 성공");
		}else {
			System.out.println("Insert 실패");
		}
		
		/*Insert 한 데이터를 조회하는 예제*/
		
		//받아올 id를 담으면 된다. 지금은 예제로써 임의로 담아두었다.
		String id = "pby0716";
		
		//실행 쿼리
		String sql2 = "SELECT ID, NAME, EMAIL FROM MEMBER WHERE ID = ?";
		//PreaparedStatement 생성 후 실행할 쿼리정보 등록
		pstmt = conn.prepareStatement(sql2);
		//위 sql에 담겨있는 쿼리에 가변하는 변수(id)를 세팅하는 부분
		pstmt.setString(1, id);
		
		//결과를 담을 ResultSet 생성 후 결과 담기
		rs = pstmt.executeQuery();
		
		//결과를 담을 ArrayList생성
		ArrayList<UserBean> list = new ArrayList<UserBean>();
		
		//ResultSet에 담긴 결과를 ArrayList에 담기
		while(rs.next()) {
			UserBean bean = new UserBean();
			bean.setId(rs.getString("ID"));
			bean.setName(rs.getString("NAME"));
			bean.setEmail(rs.getString("EMAIL"));
			list.add(bean);
		}
		//결과물 출력
		for(int i=0; i<list.size(); i++) {
			System.out.println("회원아이디:"+list.get(i).getId());
			System.out.println("회원이름:"+list.get(i).getName());
			System.out.println("회원이메일:"+list.get(i).getEmail());
		}
	}
}

이전에 사용했던 Statement와 PreparedStatement의 차이가 무엇일까?


Statement의 경우에는 완성형 쿼리를 담아서 실행을 하게되지만,

PreparedStatement의 경우에는 가변처리되어야하는 부분에 대해서 ?로 처리하여 쿼리를 바인딩한 후에도 핸들링하여 사용할 수 있다.


완전한 쿼리가 실행될때는 Statement객체를 사용하는 것이 속도측면에서 빠르며,

불완전한 쿼리를 가변처리를 하며 반복적으로 사용할 경우에는 PreparedStatement객체를

사용하는 것이 빠르다.


예제소스에서도 보듯이 Statement의 경우에는 실행하기직전에 쿼리를 담아서 컴파일처리를 하며, PreparedStatement의 경우에는 객체 생성시에 쿼리를 미리 담아서 ?에 대한부분을 미리 처리한 후 컴파일해놓고 처리를 한다.


때에 따라서 해당 두가지를 적절히 사용하면, DB속도 및 소프트웨어 속도 면에서 향상된 프로그램을 개발할 수 있다.!


반응형
블로그 이미지

Mr.비타민

,