navigation

[react] Hooks

[React from zero practice 01- background] code split [React from zero practice 02- background] permission control [React from zero practice 03- background] custom hooks [React from zero practice 04- background] docker-compose Deploy React + Egg +nginx+mysql [React From zero practice 05- background] Gitlab-CI using Docker automated deployment

[source code – Webpack01 – precompiler] AST abstract syntax tree [source code – Webpack02 – Precompiler] Tapable [source code – Webpack03] hand written webpack-compiler simple compilation process [source code] Redux React-redux01 [source] Axios [source] vuex [source -vue01] Data reactive and initialize render [source -vue02] Computed responsive – Initialize, access, Update Procedure [source -vue04] Watch Listening properties – Initialize and update [source -vue04] vue. set and vm.$set [source -vue05] vue.extend

[source -vue06] Vue. NextTick and VM.$nextTick [Deployment 01] Nginx [Deployment 02] Docker deployVUE project [Deployment 03] Gitlab-CI

[Data Structures and Algorithms 01] Binary search and sort

[Deep 01] Execution context [Deep 02] Prototype chain [Deep 03] Inheritance [Deep 04] Event loop [Deep 05] Curri Bias function [Deep 06] Function memory [Deep 07] Implicit conversions and operators [Deep 07] Browser caching mechanism (HTTP caching mechanism) [Deep 08] Front-end security [Deep 09] Deep copy [Deep 10] Debounce Throttle [Deep 10] Front-end routing [Deep 12] Front-end modularization [Deep 13] Observer mode Publish subscribe mode Bidirectional data binding [Deep 14] Canvas [Deep 15] webSocket Webpack HTTP and HTTPS CSS- Interview Handwriting Promise Data Structures and Algorithms – Binary Search and Sorting Js Design Patterns – Agents, policies, singletons

/ front-end learn java01 – SpringBoot combat environment configuration and the HelloWorld service [front-end learn java02 – SpringBoot combat] mybatis + mysql implementation song to add and delete [front-end learn java03 – SpringBoot combat] Lombok, logging, deployment

(1) Pre-knowledge

(1) Some words

Terminate permanent alter identify release release temporary // Stable repository // Stable repository firewall netstat Network statusCopy the code

(2) Some common Linux commands

(1) Enable firewall on startup: systemctl enable firewalld. Service (2) Disable firewall on startup: systemctl enable firewalld. (3) Enable the firewall: systemctl start firewalld (4) Disable the firewall: systemctl stop firewalld (5) Check the firewall status: (1) Enable nginx: systemctl enable nginx (2) Disable nginx: Nginx: nginx: nginx: nginx: nginx: nginx: nginx: nginx: nginx: nginx: Three see if service start (1) ps - ef - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- you can see the information such as PID PPID CMD, which can be based on PID close related process, Such as Java (2) ps - ef | grep mysql (3) ps - ef | grep Java four conditions (1) to check the server port occupied netstat TLPN view - t or - TCP server port occupied: -l or --listening: displays the socket-p of the server being monitored or --programs: displays the identifier and name of the program using the Socket. -n or --numeric: # yum install -y tree # yum install -y tree # yum install -y tree # yum install -y tree # yum install -y treeCopy the code

(3) After the newly purchased cloud server, specific environment and tool configuration and (Java Project deployment) (CentOS )

  • Current working pathpwd
  • Update packageyum update
  • Install GITyum install -y git
  • Install Mavenyum install -y maven
  • The detailed process is as follows (the entire server configuration process, including back-end and front-end projects)
(1) 连接服务器
- 工具方式:比如 FinalShell
- cmd方式: ssh -p 端口号 用户名@服务器ip地址
- 比如:ssh -p 22 [email protected] 然后会让输入密码,输入登陆即可
- 问题:为什么可以在cmd中可以直接输入ssh命令?
- 原因:windows中集成了OpenSSH客户端
- 如何查看是否有OpenSSH客户端:设置 => 应用 => 管理可选功能 => 看是否有OpenSSH客户端,没有就点击 => 添加功能
- 区分:登陆mysql 和 登陆服务器
  - mysql: mysql -u root -p 然后输入密码
  - 服务器:ssh -p 端口号 用户名@ip地址
- 相关教程:https://www.bilibili.com/read/cv1420735/


(2) pwd
- 登陆后,可通过 pwd 命令查看当前工作路径


(3) yum update 
- 更新所有可以更新的包


(4) git 相关
- 1.下载安装git
  - yum install -y git
  - -y 的作用是下载过程中可能会有对话让你选择yes还是no, -y就会自动的选择yes
- 2.查看git版本号
  - git version
- 3.设置 ( user.name ) ( user.email )
  - git config --global user.name "your name"
  - git config --global user.email "your emial"
  - 设置成功后,通过 git config --global --list 来查看global相关信息
- 5.设置 ( ssh-key ), 并把设置成功后的 ( .ssh ) 文件夹中的公钥 ( id_rsa.pub ) 添加到github账号中
  - ssh-keygen -t rsa -C "your emai"
  - 公钥id_rsa.pub文件的路径:/root/.ssh/id_rsa.pub
  - 通过 ( cat id_rsa.pub ) 查看公钥的内容,并拷贝到 github => setting => SSH and GPG keys => new SSH key 中
- 6.通过git clone [email protected]:woow-wu7/7-react-admin-java.git 克隆我们的java项目到服务器
- 7.通过上面的123456步,已经把项目拉取到服务器中了



(5) maven 相关
- 1.下载安装maven
  - yum install -y maven
- 2.查看maven是否安装成功
  - mvn -version
- 3.使用maven命令清理编译打包java项目
  - mvn clean compile package  先删除target再编译再打包
  - mvn clean 清理target目录
  - mvn compile 编译,会编译到target目录下
  - mvn package 打包
  - 注意:
    - 工作目录是在maven项目的根目录,可以通过pwd查看当前的工作目录
    - 除了上面这样,也可以在本地打成jar包后,将整个 ( target ) 文件夹上传到服务器
- 4.通过上面123已经完成了对maven相关的设置



(6) mysql 相关
- 1.下载mysql的yum的repo源
  - 官网底部 => MySQL Community Server => MySQL Yum Repository => mysql80-community-release-el7-3.noarch.rpm
  - `问题:这么多版本,我到底选择哪个版本呢?`
  - `回答:要看自己的centos系统是什么版本,通过命令 cat /etc/redhat-release 可以看到centos版本`
  - `比如:我的centos版本是 CentOS Linux release 7.9.2009 (Core) `
  - `问题:什么是 .repo 文件?`
  - `回答:repo文件是yum仓库的配置文件`
  - `问题:在centos中 .repo 文件在哪里?`
  - `回答:/root/etc/yum.repos.d/ 中`
- 2.安装 mysql80-community-release-el8-1.noarch.rpm 包
  - sudo rpm -ivh mysql80-community-release-el8-1.noarch.rpm
  - 该命令需要在 mysql80-community-release-el8-1.noarch.rpm 所在的文件夹下执行
  - 安装后在 `/root/etc/yum.repos.d/ `中会多两个repo包
    - `mysql-community.repo`
    - `mysql-community-source.repo`
- 3.安装mysql
  - sudo yum install mysql-server
  - 查看:`systemctl list-unit-files|grep mysqld`
  - 设置成开机启动:**`systemctl enable mysqld.service`**
- 5.是否启动服务
  - 查看:`ps -ef|grep mysql` 
    - 对比
    - 查看java的后台进程:`ps -ef | grep java`
  - 启动服务:**`systemctl start mysqld.service`**
- 6.初始化mysql
  - `mysqld --initialize`
- 7.查看MySQL初始默认密码
  - **`grep 'temporary password' /var/log/mysqld.log`**
  - 注意:需要启动mysql服务后才能查看到
  - 注意:grep命令的作用是 查找文件里符合条件的字符串
- 8.修改mysql密码
  - 需要先登陆mysql 
  - `mysql -u root -p 然后输入密码进入mysql`
  - `alter user 'root'@'localhost' identified by '12345678';` 修改密码为12345678
- 9.开启Mysql远程连接 ------- 重要不然无法通过navicat远程连接,会报1130错误!!!
  - 登陆mysql后,输入以下命令
  - `use mysql;`
  - `update user set host = '%' where user = 'root';` 修改root账户权限
  - `flush privileges;` 刷新权限
- 10. 查看mysql的版本
  - 先登陆musql,然后输入 select version();
- 11.经过12345678910步完成了mysql的安装,具体下面有详细步骤和图文



(7) docker 相关
- 1.如果安装过Docker,先卸载 docker 或者 docker-engine 以及相关的依赖
  $ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
- 2.安装Docker需要的相关插件
  - yum-utils
  - device-mapper-persistent-data
  - lvm2
  $ sudo yum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2
- 3.设置稳定的存储库 - 仓库
  - 官方镜像 
  $ sudo yum-config-manager \
      --add-repo \
      https://download.docker.com/linux/centos/docker-ce.repo
  - 阿里云仓库:如果安装太慢,用阿里云镜像
  $ sudo yum-config-manager \
      --add-repo \
      http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 4.启用存储库(可选)
  $ sudo yum-config-manager --enable docker-ce-nightly
- 5.安装最新版本的Docker Engine-Community和containerd
  $ sudo yum install -y docker-ce docker-ce-cli  containerd.io
- 6.启动 - 安装完成后
  $ sudo systemctl start docker
- 7.验证 hello-world
  $ sudo docker run hello-world
- 8.镜像加速
  - 阿里云镜像加速
    - 阿里云登陆
    - 容器镜像服务 => 镜像加速器 => 操作文档 => centos 复制代码在服务器中输入红框部分代码即可
    - 问题:如何验证镜像源已经修改成功?
    - 回答:执行该命令cat /etc/docker/daemon.json 验证registry-mirrors的值
- 9.docker中使用nginx容器等,见下面 【 (7) docker 中安装 nginx 】
- 10.记一个知识点:
    - docker exec -it 容器ID|容器名 /bin/bash 
    - exec 可以进入正启动着的容器中


(8) nginx
- 1.安装epel
  - `sudo yum install -y epel-release`
- 2.安装nginx
  - `sudo yum install -y nginx`
- 3.卸载nginx
  - `sudo yum remove -y nginx`
- 4.把nginx设置成开机启动
  - `sudo systemctl enable nginx`
- 5.启动nginx
  - `sudo systemctl start nginx`
- 6.停止nginx
  - `sudo systemctl stop  nginx`
- 7.重新加载nginx
  - `sudo systemctl reload nginx`
- 8.重启nginx
  - `sudo systemctl restart nginx`
- 9.检查nginx的运行状态
  - `sudo systemctl status nginx`
- 10.如何设置了防火墙,需要开启80和443端口,分别对应http和https的默认端口
  - `sudo firewall-cmd --permanent --zone=public --add-service=http`
  - `sudo firewall-cmd --permanent --zone=public --add-service=https`
  - `sudo firewall-cmd --reload`
  - firewall 是防火墙的意思
  - permanent 是永久的意思
- 11.查看nginx的版本
  - `nginx -v`
- 12.查看服务器端口被占用情况
  - **`netstat -tlnp`**
- 13.**修改nginx的默认端口**
  - `whereis nginx.conf` 查看nginx.conf文件所在的路径 
  - nginx.conf所在的正确路径是:**`/root/etc/nginx/nginx.conf`**
  - 我们把nginx的默认端口修改成 **79**
  - 修改过后需要重启
    server {
        listen       79 default_server;
        listen       [::]:79 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        ...
     }  



(9) 在服务器中启动服务,运行jar包 ( 在服务器中运行java项目 )
- java -jar -Dspring.profiles.active=production target/7-react-admin-java-0.0.1-SNAPSHOT.jar
Copy the code
  • In the new Version of Windows, enter CMD directlySSH -p Port number Username @Ip address of the serverBecause of OpenSSH integration
  • The following figure is for viewing or adding OpenSSH

  • yum update

  • Id_rsa. pub is the public key of sshkey

  • Add an SSH key to the GibHub

  • mvn -version



(4) Install Mysql8 on CentOS7 server

Mysql install Mysql install Mysql install Mysql install Mysql install Mysql install Mysql install Mysql install Mysql install Mysql install Mysql install Mysql install Mysql install Mysql install Mysql

  • 1. Download the repo source of mysql yum
    • MySQL Community Server => MySQL Yum Repository => mysql80-community-release-el7-3.noarch.rpm
    • Connect to mysql-yum
    • Question: There are so many versions, which one should I choose?
    • Answer: To check the version of your centos system, run the cat /root/etc/redhat-release command to view the centos version
    • My centos version is centos Linux Release 7.9.2009 (Core)
    • Question: What is a.repo file?
    • Answer: The repo file is the configuration file for the YUM repository
    • Question: Where is the.repo file in centos?
    • Answer: /root/etc/yum
  • 2. Install the mysql80-community-release-el8-1.noarch. RPM package
    • sudo rpm -ivh mysql80-community-release-el8-1.noarch.rpm
    • Run this command in the mysql80-community-release-el8-1.noarch. RPM folder
    • After the installation/root/etc/yum.repos.d/ There will be two more repo packages
      • mysql-community.repo
      • mysql-community-source.repo
  • 3. The installation of mysql
    • sudo yum install mysql-server
  • 4. Check whether to start the mysql database
    • To view:systemctl list-unit-files|grep mysqld
    • Set it to boot on startup: systemctl enable mysqld.service
  • 5. Check whether to start the service
    • To view:ps -ef|grep mysql
    • Start the service: systemctl start mysqld.service
  • 6. Initialize mysql
    • mysqld --initialize
  • 7. Check the default password of MySQL
    • grep 'temporary password' /var/log/mysqld.log
    • Note: You need to start the mysql service to view this
    • Note: the grep command is used to find the string in the file that matches the criteria
  • 8. Change the password of mysql
    • You need to log in to mysql first
    • Mysql -u root -p
    • alter user 'root'@'localhost' identified by '12345678';Change the password to 12345678
  • 9. Start Mysql remote connection ——- important, otherwise you cannot connect to navicat remotely.
    • Log in to mysql and enter the following command
    • use mysql;
    • update user set host = '%' where user = 'root';Example Change the permission of user root
    • flush privileges;Refresh the permissions
  • 10. Check the mysql version
    • Log in to musQL and enter select version();
  • Mysql installation tutorial
    • www.jianshu.com/p/224a89193…
    • www.cnblogs.com/yaowen/p/94…
  • The mysql community version of yum repository is shown below





  • Log in mysql

  • Navicat connects to mysql in the remote server centos



(5) CentOS install Docker

  • Centos-community Edition (Free)
  • 1. See (7) in (3) for details.
  • 2. My previous article about installing Docker
  • 3. Ali Cloud image acceleration
    • Ali Cloud landing
    • Container Image service => Image accelerator => Operation document => centos Copy code Enter the code in the red box on the server
    • Question: How do I verify that the image source is modified successfully?
    • Answer:Run the cat /etc/docker/daemon.json command to verify the value of registry-mirrors



(6) Install nginx on CentOS

  • 1. Install the epel
    • sudo yum install -y epel-release
  • 2. Install nginx
    • sudo yum install -y nginx
  • 3. The unloading nginx
    • sudo yum remove -y nginx
  • 4. Set nginx to boot upon startup
    • sudo systemctl enable nginx
  • 5. Start the nginx
    • sudo systemctl start nginx
  • 6. Stop nginx
    • sudo systemctl stop nginx
  • 7. Reload nginx
    • sudo systemctl reload nginx
  • 8. Restart nginx
    • sudo systemctl restart nginx
  • 9. Check the running status of Nginx
    • sudo systemctl status nginx
  • 10. If the firewall is configured, enable ports 80 and 443, which correspond to the default HTTP and HTTPS ports, respectively
    • sudo firewall-cmd --permanent --zone=public --add-service=http
    • sudo firewall-cmd --permanent --zone=public --add-service=https
    • sudo firewall-cmd --reload
    • Firewall means firewall
    • Sometimes the weakness was permanent
  • 11. Check the nGINX version
    • nginx -v
  • 12. Check whether the server port is occupied
    • netstat -tlnp
  • 13.Change the default port of nginx
    • whereis nginx.confCheck the path where the nginx.conf file is stored
    • Nginx. Conf’s path is right: / root/etc/nginx/nginx. Conf
    • We changed the default port for nginx to 79
    • After the modification, restart the system
server { listen 79 default_server; listen [::]:79 default_server; server_name _; root /usr/share/nginx/html; . }Copy the code
  • 14. Nginx data
    • Common commands
    • Segmentfault.com/a/119000001…


(7) Install nginx in Docker

  • Pull the mirror
    • docker pull nginx
  • Look at mirror
    • docker images -a
  • Check the container
    • docker ps -a
  • Deleting an Image
    • Mirror docker rmi -f ID | image name
  • Deleting all mirrors
    • docker rmi -f $(docker images -qa)
  • Deleting a container
    • Docker rm -f container ID | vessel name
  • Delete all containers
    • docker rm -f $(docker ps -qa)
  • Into the container
    • Docker exec – it container ID | container name/bin/bash
    • The feature of Docker exec is that it can enter a starting container
  • Container log
    • Docker logs container ID | vessel name
  • Create folders recursively
    • mkdir -p a/b/c
  • Create a file
    • touch index.html
  • Generate tree file tree diagram
    • yum install -y tree
    • tree -a
    • Linux tree command tutorial
  • Pay attention, pay attention, pay attention, pay attention, pay attention, pay attention, pay attention, pay attention, pay attention
    • Nginx container to map four files, respectively in the container path is
    • /etc/nginx/conf.d/default.conf
    • /usr/share/nginx/html
    • /etc/nginx/nginx.conf
    • /var/log/nginx
Docker pull nginx (2) create folder CD ~/work-frontend mkdir -p nginx/conf.d CD.. mkdir html.d /root |---work-frontend |----nginx |----nginx.conf |----conf.d |----default.conf |----html.d | | - index. The HTML - log. | - access log | -- error. The log in the conf. D create the default folder. The conf file, Inside is the configuration for nginx and in the html.d folder create the index. HTML file, Inside is to display the UI content + + + + + + + + + + + + + + + + + + + + +. The default conf the following + + + + + + + + + + + + + + + + + + + + + server {# note: This must only be 80, the latter port can be modified by docker container port mapping, pay attention!! BaseURL: "listen 80"; baseURL: "listen 80"; listen [::]:80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; Rewrite ^/ API /(.*)$/$1 break; # remove API prefix proxy_pass http://120.53.220.141:7777; }} + + + + + + + + + + + + + + + + + + + + + index. The HTML content below + + + + + + + + + + + + + + + + + + + + + <! DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta  name="viewport" content="width=device-width, Word-wrap: break-word! Important; word-wrap: break-word! Important; word-wrap: break-word! Important; word-wrap: break-word! Important; word-wrap: break-word! Important; word-wrap: break-word! Important; word-wrap: break-word! Important; word-wrap: break-word! Important; "> < span style = "box-sizing: border-box; < / HTML > + + + + + + + + + + + + + + + + + + + + + nginx. Conf the following + + + + + + + + + + + + + + + + + + + + + user nginx. worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } sudo docker run -d --name=nginx_81 -p 81:80 \ v ~/work-frontend/nginx/conf.d/default.conf/:/etc/nginx/conf.d/default.conf \ -v ~/work-frontend/nginx/html.d:/usr/share/nginx/html \ -v ~/work-frontend/nginx/log.d:/var/log/nginx \ -v ~/work-frontend/nginx/nginx.conf:/etc/nginx/nginx.conf \ f6d0b4767a6c // docker run -it --name=nginx-8080 -p 8080:80 Mirror ID -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- according to the mirror create execution container / / note that tencent cloud can be accessed here, because nginx the default port is 80 don't write other port / / close container: docker stop container ID | vessel name / / note: Do not add /bin/bash, otherwise nginx mapped ports will not be able to access some file locations in nginx (container) : -------------------------- /var/log/nginx/ -configuration file location: /etc/nginx/ -project location: Rewrite ^/ API /(.*)$/$1 break; rewrite ^/ API /(.*)$/$1 break; # remove API prefix proxy_pass http://120.53.220.141:7777; }Copy the code

(二) LomBok

  • 1. Add pom. XML to dependency
    • Lombokscope=provided.Note It takes effect only during compilation and does not need to be included in the package.
<! -- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> < version > 1.18.16 < / version > < scope > provided < / scope > < / dependency >Copy the code
  • 2. Used in classes such as beans (DTo or Model)
@data is lombok's annotation // @data will automatically generate @getter @setter @toString @equalSandHashCode @requiredargsconstructor @data public class PaginationDTO { public List<MusicModel> musics; public Integer total; public Integer current; public Integer pageSize; }Copy the code
  • 3. Lombok is automatically supported in idea

(3) Log function

  • Springboot-logging official documentation
  • 1. By default, logs are only typed in the console. If you want to write to a file, you need to set this in application.properties
    • logging.file.name
      • Name of the log file
    • logging.file.path
      • Log file path, you can create a log folder, such aslogging.file.path=logs
    • logging.level.root = info
    • logging.level.com.example.demo.mapper = debug
      • Logging.level.com.example.demo.mapper = debug this role is only to print mapper related the debug log
      • Logger.level. XXX on the top line where XXX indicates (the path of the mapper folder starting with Java folder)
    • logging.file.max-size=1mb
      • When the file size exceeds 1MB, a new log file is created
    • logging.file.max-history=3
      • Indicates a maximum of three historical log files, which are dynamic dates
    • spring.output.ansi.enabled = ALWAYS
      • Enable output for ANSI colors

(4) Deploy the Java project to the server

2021/05/16 Update – Single-module package deployment

(1) application – production. The properties set

Application -production. Properties ------- # (1) # Define data source component # deprecated Spring. The datasource. The driver - class - name = com. Mysql.. JDBC driver # note that spring. The datasource. Url = "JDBC: mysql: / / localhost: 3306 / database name? Time zone information "# are respectively (url) database (database driver) (user name) (password) # note: the address of the remote server (JDBC: mysql: / / 120.53.220.141:3306) don't forget to port # note: React-admin-java is a database name UseSSL =false; serverTimezone=UTC; useUnicode=true; The user name and password If your user name and password of the remote server. Spring datasource. Url = JDBC: mysql: / / 120.53.220.141:3306/7 - the react - admin - Java? useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.username=root spring.datasource.password=rootCopy the code

(3) Start the Java program service in the server

  • Java jar - Dspring. Profiles. The active = production target / 7 to react - admin - Java - 0.0.1 - the SNAPSHOT. The jar

(4) the persistence

  • As long as finalShell is closed in (3) above, the Java service is not accessible, so we need to persist
  • Nohup java-jar-dspring.profiles. Active =production target/7-react-admin- java-0.0.1-snapshot. jar >temp.txt &
  • Nohup is running the command without hanging up, and it runs when the account exits or the terminal is closed, so the Java program is still running when we exit

(5) View the background process of the deployed Java code

  • ps -ef
    • The ps command displays a process
    • Grep command: indicates the search
    • ps -ef | grep javaCheck whether the Java process exists
    • You can see PID, PPID, CMD and other information, that is, according to the PID can be shut down related processes, such as Java

(6) How to stop running Java code deployed on the server

  • Just kill the process
  • Kill the process,
    • The process ID can passps -efOr to be more preciseps -ef | grep javaTo view the
  • The tutorials

Program source code

  • Program source code
  • Online access to address – song additions and deletes to check