量子コンピュータは、量子力学を計算過程に用いることで圧倒的な処理能力を持つ次世代コンピュータ
「量子力学特有の物理状態を積極的に用いて高速計算を実現するコンピュータ」
量子計算は古典計算の上位互換であり、古典コンピュータで解ける問題はすべて量子コンピュータで解くことができる
1.万能量子コンピュータ
L 「回路」や「論理ゲート」の代わりに「量子回路」や「量子ゲート」を用いて計算を行うモデル
2.非万能量子コンピュータ
3.非古典コンピュータ
随机应变 ABCD: Always Be Coding and … : хороший
量子コンピュータは、量子力学を計算過程に用いることで圧倒的な処理能力を持つ次世代コンピュータ
「量子力学特有の物理状態を積極的に用いて高速計算を実現するコンピュータ」
量子計算は古典計算の上位互換であり、古典コンピュータで解ける問題はすべて量子コンピュータで解くことができる
1.万能量子コンピュータ
L 「回路」や「論理ゲート」の代わりに「量子回路」や「量子ゲート」を用いて計算を行うモデル
2.非万能量子コンピュータ
3.非古典コンピュータ
ECS PluginはDockerの拡張機能
ECSのFargate上にデプロイすることができる
$ git clone https://github.com/docker/ecs-plugin.git
$ cd ecs-plugin/example/
$ docker build app -t example
$ docker images –filter reference=example
REPOSITORY TAG IMAGE ID CREATED SIZE
example latest 31ac32e7e8dd 18 seconds ago 52.9MB
$ docker run -t -i -p 5000:5000 example

OK(※redisが起動していない為)
### AWS ECS
DockerHubの様なもの
作成したDockerイメージをECRにpushし、docker-compose使用時にpull
$ docker context use default
$ docker context ls
### ECS用のIAM作成
こちらを参考にECSのユーザを作成する
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/get-set-up-for-amazon-ecr.html
accound_id, access_key_id, secret_access_keyをメモ
### AWS CLI install
$ dnf install python3-pip
$ pip3 install awscli –upgrade –user
$ aws –version
aws-cli/1.19.28 Python/3.6.8 Linux/4.18.0-193.19.1.el8_2.x86_64 botocore/1.20.2
$ aws configure
-> Administratorのaccess_key_id, secret_access_keyと ap-northeast-1を入力
$ timedatectl set-timezone Asia/Tokyo
$ aws ecr get-login-password –region ap-northeast-1 | docker login –username AWS –password-stdin hoge.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded
// レポジトリ作成
$ aws ecr create-repository \
–repository-name example \
–image-scanning-configuration scanOnPush=true \
–region ap-northeast-1
// タグ付け
$ docker tag example:latest hoge.dkr.ecr.ap-northeast-1.amazonaws.com/example:latest
// imageをpush
$ docker push hoge.dkr.ecr.ap-northeast-1.amazonaws.com/example:latest
$ aws ecr list-images –repository-name example
{
“imageIds”: [
{
“imageDigest”: “sha256:75260261d397dd588f43bd4fc16118cb2763c55c46caa313a9a2caf0202636f9”,
“imageTag”: “latest”
}
]
}
AWS console

イマイチよくわってないが、なんか出来とるな。。。
$ sudo curl -L “https://github.com/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose –version
docker-compose version 1.28.5, build c4eb3a1f
Dockerfile
FROM alpine RUN apk add bash procps curl CMD sh -c "(while :; do date; sleep 1; done) >&2"
docker-compose.yml
version: "3"
services:
myalpine:
build: "."
tty: true
$ docker images
$ docker-compose up -d
$ docker ps
$ docker-compose stop
version: '3.7'
services:
nginx:
image: nginx
ports:
- 8080:80
$ docker-compose up -d
複数のコンテナ起動に威力を発揮する

公式ガイドに沿って作っていきます。
1. リポジトリセットアップ
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
$ sudo yum-config-manager \
–add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce
$ sudo systemctl start docker
$ docker –version
Docker version 20.10.5, build 55c4c88
$ sudo docker run hello-world
Unable to find image ‘hello-world:latest’ locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
$ sudo docker pull centos
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 9 days ago 13.3kB
centos latest 300e315adb2f 3 months ago 209MB
$ sudo docker inspect 300
$ sudo docker run 300 echo “hello world”
hello world
$ sudo docker ps -a -n=5
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79f86705caf2 300 “echo ‘hello world'” 42 seconds ago Exited (0) 40 seconds ago exciting_newton
3a66b7697532 hello-world “/hello” 16 minutes ago Exited (0) 16 minutes ago laughing_wu
// ハイフンdでバックグラウンドで走らせる
$ sudo docker run -d centos free -s 3
// コンテナの中に入って操作する -iはインタラクティブモード、-tはターミナル
$ sudo docker run -i -t centos /bin/bash
// image作成 username/${name}
$ sudo docker commit 646 hpscript/hello
$ sudo docker run -i -t hpscript/hello /bin/bash
// image -> container -> image はdocker build
vi Dockerfile
FROM centos MAINTAINER hpscript <hoge@gmail.com> # RUN build execute RUN echo "now building..." CMD ["echo", "now running..."]
// dockerfileによるbuild
$ sudo docker build -t hpscript/echo .
$ sudo docker run hpscript/echo
now running…
$ sudo docker build -t hpscript/httpd .
http://192.168.34.10:8000/
$ sudo docker login
// imageをpushする
$ sudo docker push ddddocker/test
ok
これをecsでec2にデプロイしたい
最初からやりたいと思います。
$ vagrant init ubuntu/focal64
$ vagrant up
$ vagrant ssh
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 5.4.0-51-generic x86_64)
$ python3 –version
Python 3.8.5
$ sudo apt update
$ sudo apt install python3-dev python3-pip python3-venv
$ pip3 –version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
### 仮想環境構築
$ python3 -m venv –system-site-packages ./venv
$ source ./venv/bin/activate
$ pip install –upgrade pip
$ pip install –upgrade tensorflow
$ pip install jupyter
$ python -c “import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))”
-> no moduleで上手くいかない
$ free -h
total used free shared buff/cache available
Mem: 981Mi 129Mi 787Mi 0.0Ki 63Mi 745Mi
Swap: 0B 0B 0B
### swap追加
$ sudo fallocate -l 1G /swapfile
$ ls -lh /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ sudo swapon –show
$ free -h
total used free shared buff/cache available
Mem: 981Mi 130Mi 778Mi 0.0Ki 71Mi 740Mi
Swap: 1.0Gi 0B 1.0Gi
$ pip install –upgrade tensorflow
launchpadlib 1.10.13 requires testresources, which is not installed.
$ sudo apt install python3-testresources
$ sudo apt install python3-cairo-dev
$ pip check
No broken requirements found.
$ python -c ‘import tensorflow as tf; print(tf.__version__)’
2021-03-15 09:34:53.575432: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library ‘libcudart.so.11.0’; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory
2021-03-15 09:34:53.575530: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2.4.1
1. 仮想環境に作る事
2. swapメモリを追加する事
出来たっぽいな。
さあ、Dockerやるか^^
TensorFlowとは?
->エンドツーエンドのオープンソース機械学習プラットフォーム
$ uname -a
Linux ubuntu-focal 5.4.0-56-generic #62-Ubuntu SMP Mon Nov 23 19:20:19 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
### cudaインストール
cudaとは?
-> NVIDIAが開発・提供している、GPU向けの汎用並列コンピューティングプラットフォーム(並列コンピューティングアーキテクチャ)およびプログラミングモデル
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
$ nvidia-smi
Command ‘nvidia-smi’ not found, but can be installed with:
$ sudo apt-get –purge remove nvidia-*
$ sudo apt-get –purge remove cuda-*
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
$ sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
$ wget http://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda-repo-ubuntu1804-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1804-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-10-1-local-10.1.243-418.87.00/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get -y install cuda
なんかdependencyで上手くいかんな。。
もう一回環境作り直すか。。
### Entity
com.example.demo.account
package com.example.demo.account;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import javax.persistence.*;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.GrantedAuthority;
@Entity
@Table(name="accounts")
public class Account implements UserDetails{
private static final long serialVersionUID = 1L;
public enum Authority {ROLE_USER, ROLE_MANAGER, ROLE_ADMIN}
@Id
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false, unique = true)
private String mailAddress;
@Column(nullable = false)
private boolean mailAddressVerified;
@Column(nullable = false)
private boolean enabled;
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;
@ElementCollection(fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private Set<Authority> authorities;
protected Account() {}
public Account(String username, String password, String mailAddress) {
this.username = username;
this.password = password;
this.mailAddress = mailAddress;
this.mailAddressVerified = false;
this.enabled = true;
this.authorities = EnumSet.of(Authority.ROLE_USER);
}
@PrePersist
public void prePersist() {
this.createdAt = new Date();
}
public boolean isAdmin() {
return this.authorities.contains(Authority.ROLE_ADMIN);
}
public void setAdmin(boolean isAdmin) {
if(isAdmin) {
this.authorities.add(Authority.ROLE_MANAGER);
this.authorities.add(Authority.ROLE_ADMIN);
} else {
this.authorities.remove(Authority.ROLE_ADMIN);
}
}
public boolean isManager() {
return this.authorities.contains(Authority.ROLE_MANAGER);
}
public void setManager(boolean isManager) {
if(isManager) {
this.authorities.add(Authority.ROLE_MANAGER);
} else {
this.authorities.remove(Authority.ROLE_MANAGER);
this.authorities.remove(Authority.ROLE_ADMIN);
}
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> authorities = new ArrayList<>();
for (Authority authority : this.authorities) {
authorities.add(new SimpleGrantedAuthority(authority.toString()));
}
return authorities;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public boolean isEnabled() {
return this.enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getMailAddress() {
return mailAddress;
}
public void setMailAddress(String mailAddress) {
this.mailAddress = mailAddress;
}
public boolean isMailAddressVerified() {
return mailAddressVerified;
}
public void setMailAddressVerified(boolean mailAddressVerified) {
this.mailAddressVerified = mailAddressVerified;
}
public Date getCreatedAt() {
return createdAt;
}
}
Repository
package com.example.demo.account;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface AccountRepository extends CrudRepository<Account, Long>{
public Account findByUsername(String username);
}
Service
package com.example.demo.account;
import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.transaction.annotation.Transactional;
@Service
public class AccountService implements UserDetailsService {
@Autowired
private AccountRepository repository;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public Account loadUserByUsername(String username) throws UsernameNotFoundException {
if(username == null || "".equals(username)) {
throw new UsernameNotFoundException("Username is empty");
}
Account user = repository.findByUsername(username);
if(user == null) {
throw new UsernameNotFoundException("User not found: " + username);
}
return user;
}
@Transactional
public void registerAdmin(String username, String password, String mailAddress) {
Account user = new Account(username, passwordEncoder.encode(password), mailAddress);
user.setAdmin(true);
repository.save(user);
}
@Transactional
public void registerManager(String username, String password, String mailAddress) {
Account user = new Account(username, passwordEncoder.encode(password), mailAddress);
user.setManager(true);
repository.save(user);
}
@Transactional
public void registerUser(String username, String password, String mailAddress) {
Account user = new Account(username, passwordEncoder.encode(password), mailAddress);
repository.save(user);
}
}
AuthoController.java
package com.example.demo.account;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class AuthController {
@RequestMapping("/")
public String index() {
return "redirect:/top";
}
@GetMapping("/login")
public String login() {
return "login";
}
@PostMapping("/login")
public String loginPost() {
return "redirect:/login-error";
}
@GetMapping("/login-error")
public String loginError(Model model) {
model.addAttribute("loginError", true);
return "login";
}
@RequestMapping("/top")
public String top() {
return "/top";
}
}
WebSecurityConfig.java
package com.example.demo;
import com.example.demo.account.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AccountService userService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login", "/login-error").permitAll()
.antMatchers("/**").hasRole("USER")
.and()
.formLogin()
.loginPage("/login").failureUrl("/login-error");
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userService)
.passwordEncoder(passwordEncoder());
userService.registerAdmin("admin", "secret", "admin@localhost");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
login.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>Login page</title>
<style>
.alert-danger{color:red;}
</style>
</head>
<body>
<h2>ログイン画面</h2>
<form th:action="@{/login}" method="post">
<div th:if="${session['SPRING_SECURITY_LAST_EXCEPTION']} != null" class="alert-danger">
<span th:text="ユーザ名またはパスワードに誤りがあります"></span>
</div>
<div style="width:160px;"><label for="username">ユーザ名:</label></div>
<input type="text" name="username" autofocus="autofocus">
<br>
<div style="width:160px;"><label for="password">パスワード:</label></div>
<input type="password" name="password" />
<br>
<p><input type="submit" value="ログイン"></p>
</body>
</html>
top.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head>
<meta charset="UTF-8" />
<title>メニュー画面</title>
</head>
<body>
<h2>ログイン画面</h2>
<div th:fragment="logout" sec:authorize="isAuthenticated()">
<p>こんにちは:
<span sec:authentication="name"></span>さん</p>
<p>mail:
<span sec:authentication="principal.mailAddress"></span></p>
<p>権限:
<span sec:authentication="principal.authorities"></span></p>
<form action="#" th:action="@{/logout}" method="post">
<input type="submit" value="ログアウト">
</form>
</div>
</body>
</html>
application.properties
spring.jpa.database=POSTGRESQL spring.datasource.url=jdbc:postgresql://localhost:5432/test spring.datasource.username=root spring.datasource.password= spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.format_sql=true logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
hibernate.properties
hibernate.jdbc.lob.non_contextual_creation = true
test=> select * from accounts;
username | created_at | enabled | mail_address | mail_address_verified | password
———-+————+———+—————–+———————–+————————————————————–
admin | | t | admin@localhost | f | $2a$10$19UBN8MoIHBihXXDs2uyreHU4DlAow7jNfUwtChyAw6pp5THYM8N.
(1 row)
あああああああああああ
AccountService.javaで登録してんのか。
@Transactional
public void registerAdmin(String username, String password, String mailAddress) {
Account user = new Account(username, passwordEncoder.encode(password), mailAddress);
user.setAdmin(true);
repository.save(user);
}
なるほど、
spring.jpa.hibernate.ddl-auto=update で、自動でテーブルが作成されんのか。。
insert into accounts (username, enabled, mail_address, mail_address_verified, password) values
(‘user1′,TRUE,’user1@gmail.com’, FALSE,’$2a$10$BuoyNf/vQZB5cS.eCEtW7uHtFTMq0SwLKXblcOeGCIJCpqeCnQH2S’),
(‘user2′,TRUE,’user2@gmail.com’, FALSE,’$2a$10$BuoyNf/vQZB5cS.eCEtW7uHtFTMq0SwLKXblcOeGCIJCpqeCnQH2S’);
insert into account_authorities (account_username, authorities) values
(‘user1′,’ROLE_USER’);

やべえええええええええええええ
Spring Securityできたやんか🔥🔥🔥🔥
他にやりたい事もあるけど、Javaでなんか作るかー。
WebSecurityConfig.java
package com.example.demo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/css/**", "/resources/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/login")
.usernameParameter("username")
.passwordParameter("password")
.successForwardUrl("/home")
.failureUrl("/login?error")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.permitAll()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
}
}
DemoController.java
L UserModelは後から作ります
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.security.core.Authentication;
@Controller
public class DemoController {
@RequestMapping(value = {"/", "/home"})
public String home() {
return "home";
}
@RequestMapping(value = "/hello")
public String hello(Authentication authentication, Model model) {
UserModel userModel = (UserModel)authentication.getPrincipal();
model.addAttribute("name", userModel.getUsername());
return "hello";
}
}
pom.xml
L jdbcとpostgres追加
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency>
application.properties
L jdbc, postgres追加
spring.jpa.database=POSTGRESQL spring.datasource.url=jdbc:postgresql://localhost:5432/test spring.datasource.username=root spring.datasource.password=
$ psql -U root test
test=> \d
create table t_user (
id serial primary key,
name varchar(255),
password varchar(255),
enabled boolean DEFAULT true
);
insert into t_user (name, password) values
('user1','password'),
('user2','password');
select * from t_user;
UserModel.java
package com.example.demo;
import java.util.Collection;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.GrantedAuthority;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class UserModel implements UserDetails{
private String id;
private String name;
private String password;
private boolean enabled;
@Override
public Collection<? extends GrantedAuthority> getAuthorities(){
return null;
}
@Override
public String getPassword() {
return this.password;
}
@Override
public String getUsername() {
return this.name;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return this.enabled;
}
}
UserRepository.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.UserRepository">
<select id="selectByUser" parameterType="com.example.demo.UserRepository" resultType="com.example.demo.UserModel">
SELECT id, name, password, enabled FROM t_user where id = #{id};
</select>
</mapper>
UserRepository.java
package com.example.demo;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserRepository {
public UserModel selectByUser(String username);
}
UserDetailsServiceImpl.java
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
@Component
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if(StringUtils.isEmpty(username)) throw new UsernameNotFoundException("");
UserModel userModel = userRepository.selectByUser(username);
if(userModel == null) throw new UsernameNotFoundException("");
if(!userModel.isAccountNonExpired() || !userModel.isAccountNonLocked() ||
!userModel.isCredentialsNonExpired() || !userModel.isEnabled())
throw new UsernameNotFoundException("");
return userModel;
}
}
Description:
Field userRepository in com.example.demo.UserDetailsServiceImpl required a bean of type ‘com.example.demo.UserRepository’ that could not be found.
なんでや。。。なんでや。。。。
もう一回やるか、次ラストで。
WebSecurityConfig.java
L .defaultSuccessUrl(“/test1/index”)でログイン後のURLを指定する
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/","/home").permitAll()
// 上記以外は認証が必要
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.defaultSuccessUrl("/test1/index")
.and()
.logout()
.permitAll();
}
@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("user")
.password("pass")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}


なるほど。
ログイン認証をpostgresでやりたいな。
/src/Model/Table/PostsTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
class PostsTable extends Table
{
public function initialize(array $config) : void {
$this->addBehavior('Timestamp');
}
}
/templates/Posts/index.php
L 拡張子はctpではなくphpにする
https://book.cakephp.org/4/ja/views.html
<h1>Blog Posts</h1> <ul> <?php foreach($posts as $post) : ?> <li><?= h($post->title); ?></li> <?php endforeach;?> </ul>
/src/Controller/PostsController.php
// /posts/index
// /(controller)/(action)/(options)
namespace App\Controller;
class PostsController extends AppController{
public function index(){
$posts = $this->Posts->find('all');
$this->set('posts', $posts);
}
}

config/routes.php
$builder->connect('/', ['controller' => 'Posts', 'action' => 'index']);
controller
$posts = $this->Posts->find('all')->order(['title'=>'DESC'])->limit(2)->where(['title like'=> '%3']);
3系と4系だと、大分書き方が変わってるな。特にctpからphpに変わってるのは驚きだな。