teleren/devto huggingface dataset:
Adding Values to Lists with the append() and insert() Methods in Python.
Tags: programming, python, ubuntu, 100daysofcode
Published: 2023-08-05 12:36:31

To add new values to a list, use the append() and insert() methods. Enter the following into the interactive shell to call the append() method on a list value stored in the variable cars.

```
>>> cars = ['Benz','Audi','Lexus','Jeep']
>>> cars.append('BMW')
>>> cars
['Benz', 'Audi', 'Lexus', 'Jeep', 'BMW']
>>>
```
The previous append() method call adds the argument to the end ofthe list. The insert() method can insert a value at any index in the list.The first argument to insert() is the index for the new value, and the second argument is the new value to be inserted. Enter the following into the interactive shell.

```
>>> Languages = ['Python','Javascript','Php','Rust']
>>> Languages.insert(2,'Golang')
>>> Languages
['Python', 'Javascript', 'Golang', 'Php', 'Rust']
>>> 
```

InClusion.
Methods  belong to  a single data type .The append() and insert()  methods are  list methods and can be called on list values , not on other values such as strings or integers.
Create an EKS or GKE cluster in minutes
Tags: kubernetes, aws, gcp
Published: 2023-08-05 12:32:51

It is very easy to create a Kubernetes cluster nowadays. I wanted to share some convenient commands to create a cluster on your favorite Cloud provider (AWS or GCP).

Compared to creating it through the interface, the advantage of command lines is that you can reproduce it quickly and automate it.

## Create an EKS cluster (on AWS)

First, you have to create an AWS account and [install the AWS cli](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Here are the commands to create the cluster :
```bash
brew install eksctl
eksctl --help
eksctl create cluster --name eks1 --region eu-west-1 --nodes 1
```

then delete it :
```bash
eksctl delete cluster --name eks1 --region eu-west-1
```

## Create a GKE cluster (on Google Cloud)

First, you need to create a Google Cloud account and follow these steps to install the client :
```bash
brew install gcloud
gcloud init

# Also install the plugin to authenticate with GKE :
gcloud components install gke-gcloud-auth-plugin
```

Here are the commands to create the cluster :
(Autopilot is easier to manage but VMs allow more configuration and reduce costs) 
```bash
# Option 1 : GKE on VMs :
gcloud container clusters create gke1 \
    --num-nodes=1 \
    --zone europe-west1-b \  # Specify 1 zone to have only 1 node in total
    --project=<myproject>

# Option 2 : GKE with Autopilot :
gcloud container clusters create-auto gke1 \
    --region europe-west1 \
    --project=<myproject>
```

then delete it :
```bash
gcloud container clusters delete gke1 \
    --region europe-west1 [--zone europe-west1-b] \
    --project=<myproject>
```

Be careful to delete the cluster when you are not using it, because it is not free, you must follow the billing section of your service provider according to the configuration you have requested.

Note that GKE in minimal configuration is cheaper than the EKS solution, and consider the price just for a day or two for example.

Anyway, with these commands, you will have clusters similar to production conditions where you can work on.

If you just want a little tool to work locally on Kubernetes, you can use a tool like [Kind](https://dev.to/jdxlabs/a-local-kubernetes-cluster-in-seconds-with-kind-31lc).
Running gitlab on windows [memorandum].
Published: 2023-08-05 12:32:51

*This article is an English translation of the following article.
[windowsでgitlabを動かす[覚書]](https://dev.to/shizimicode/windowsdegitlabwodong-kasujue-shu--18nc)

Translated using deepl.

---
## Introduction.
I wanted to implement gitlab at work, so I used wsl, which can run linux in a windows environment, to try it out.

## Installation of wsl2

1. Administrative execution of powershell.
1. Execute the following commands.
```
wsl --install
```
3\. Reboot after INSTALL.
4\. Create a new ubuntu user after rebooting.

## docker installation on ubuntu
Run the following command from ubuntu.

```
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```

Also install docker-compose.[Ubuntu 20.04にDockerとdocker-composeを導入する](https://zenn.dev/shimakaze_soft/articles/02aebaedeb43b6)
```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose
```

## Launching gitlab
Place the following docker-compose.yml in any directory and start docker-compose.
```
version: '3'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.0.4:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
        nginx['listen_port'] = 80 
    ports:
      - '8929:80'
      - '2224:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'


```

```
 sudo docker-compose up -d   
```

On the way, you will be warned that you have permission to drill holes in the firewall, so allow it.

This will get you up and running in the meantime.

## redundancy
It started up at one point, but my machine couldn't take it :(

![CPUs and disks are under pressure.](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/29duhip2s646vw4nct3z.png)



--- 
Reference website
[WSL2のインストールを分かりやすく解説【Windows10/11】](https://chigusa-web.com/blog/wsl2-win11/)

[docker-composeでGitLab](https://qiita.com/kujiraza/items/f87d2a9fb42ff227d3e6)

[WindowsにWSL2とDockerをインストールする手順](https://kahoo.blog/howto-wsl2-docker-install/)

[Ubuntu on WSL2でのDocker Engineの最短インストール手順](https://qiita.com/nujust/items/d7cd395baa0c5dc94fc5)
Finding a Value in a List with the index() Method in python.
Tags: programming, beginners, python, 100daysofcode
Published: 2023-08-05 12:20:44

A method is the same thing as a function, except it is “called on” a value.List values have an index() method that can be passed a value, and if that value exists in the list, the index of the value is returned. If the value isn’t
in the list, then Python produces a ValueError error. Enter the following into the interactive shell.

```
>>> teams = ['chelsea','RealMadrib','Barcelona','Juventus','Inter-Milano','Bayern-Munich']
>>> teams.index('Barcelona')
2
>>> teams .index('Manchester')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 'Manchester' is not in list
>>> 

```
what is CSR , SSR ,SSG, ISR
Tags: webdev, development, developer, web
Published: 2023-08-05 12:12:26

## Client Side Rendering(CSR)

![Client Side Rendering Diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zn7ac22u24texqmofmtb.png)

If you used React before you would have heard acronym CSR short for Client side rendering. Client side rendering means that our browser is responsible for creating a full interactive web pages.

CSR follows following step to generate the page. 

1) Client request for a page.
2) Server serves an empty html file along side with javascript and css
3) Client runs javascript code and renders the page and fetch necessary data to build the page.
4) Client output full page to a user.

CSR provides an APP like experience and provides high quality of user interactivity. However, CSR initially serve an empty html file which makes it hard for web crawlers to know what content the page has and thus bad for SEO. CSR is a good option for an application that doesn't concern about SEO and prioritize a smooth user experience.
  

## Server Side Rendering(SSR)

![Server Side Rendering Diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zfzzio2d4yx7990vqcj2.png)

In server side rendering, the web page is rendered on the server on every clients request.

1) Client request for a page
2) Server runs Javascript code and fetches data and Renders the page.
3) Server serves Client with Fully rendered page.

Server Side Rendering offers good SEO and data is always up to date as page is built on the server on every request. SSR can be a great option for E-commerce as data is frequently updated in E-commerce websites.


## Static Site Generation(SSG)

![Static Site Generation Diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/elm8h65q1bd1a2rl80pt.png)

Static site Generation in other hand, already has web page built in built time. When client request for a page from a server, server simply serves built page. This offers fast load time and also these static files can be cached which offers even faster load time. However, SSG is not so good for website that frequently updates because the page needs to be built again for updated contents. If you are looking to build landing pages, marketing pages, Documentations that doesn't require frequent update, SSG will be the go to option. 

## Incremental Static Regeneration (ISR)

![Incremental Static Regeneration Diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m6fhwy8cmex22ij5s2id.png)

Incremental Static Regeneration offers alternative to SSG if you require an update in your static page. ISR re-validates the static page periodically and updates the static files. This could be really handy if you want advantages of SSG but still want updated contents.
windowsでgitlabを動かす[覚書]
Published: 2023-08-05 12:09:42

## はじめに
仕事でgitlabを導入したかったので、試しにwindows環境でlinuxを動かせるwslを使ってみた。

## wsl2のインストール

1. powershellを管理者実行
1. 次のコマンドを実行 
```
wsl --install
```
3\. install後、再起動
4\. 再起動後、ubuntuのユーザを新規作成する

## ubuntuにdockerインストール
ubuntuから次のコマンドを実行する。

```
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```

docker-composeもインストールする。[Ubuntu 20.04にDockerとdocker-composeを導入する](https://zenn.dev/shimakaze_soft/articles/02aebaedeb43b6)
```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose
```

## gitlab立ち上げ
次のdocker-compose.ymlを任意のディレクトリにおいて、docker-composeを立ち上げる。
```
version: '3'
services:
  web:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.0.4:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
        nginx['listen_port'] = 80 
    ports:
      - '8929:80'
      - '2224:22'
    volumes:
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/gitlab/data:/var/opt/gitlab'


```

```
 sudo docker-compose up -d   
```

途中でファイアウォールの穴あけ許可の警告が出るので許可する

これで一応は立ち上がる

## 蛇足
一応立ち上がりはするが、私のマシンでは耐えきれなかった。。。

![CPUもディスクも逼迫している](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/29duhip2s646vw4nct3z.png)



--- 
参考サイト
[WSL2のインストールを分かりやすく解説【Windows10/11】](https://chigusa-web.com/blog/wsl2-win11/)

[docker-composeでGitLab](https://qiita.com/kujiraza/items/f87d2a9fb42ff227d3e6)

[WindowsにWSL2とDockerをインストールする手順](https://kahoo.blog/howto-wsl2-docker-install/)

[Ubuntu on WSL2でのDocker Engineの最短インストール手順](https://qiita.com/nujust/items/d7cd395baa0c5dc94fc5)
Augmented Assignment Operators in Python.
Tags: webdev, programming, python
Published: 2023-08-05 11:48:50

Augmented assignment operators have a special role to play in Python programming. It basically combines the functioning of the arithmetic or bitwise.
When assigning a value to a variable, you will frequently use the variable itself. For example, after assigning 42 to the variable spam, you would increase the value in spam by 1 with the following code:

```
>>> spam = 42
>>> spam = spam + 1
>>> spam
43
```
As a shortcut, you can use the augmented assignment operator += to do the same thing:

```
>>> spam = 42
>>> spam += 1
>>> spam
43
```
python环境-库概念
Published: 2023-08-05 11:41:40

解释器在windows中即为python.exe这个程序

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lcakstrvu7mznt3i1fmq.png)

不同版本的语言需要不同版本的解释器

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3qbkmu6j99kortyclqzq.png)


在虚拟环境文件夹下：有Lib文件夹和解释器
内置包/模块（文件）

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hjj67vx1e6skreuimuav.png)


第三方包：（文件夹）

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2efi7bbeztz124zxqyso.png)


Python专业版破解包：
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1ko8kqq84aqxa2y51jic.png)
刚出来的是当前项目的路径，第三方包要装在对应环境文件夹的Lib文件夹的site-packages文件夹下
What are Benefits of AWS?
Tags: programming
Published: 2023-08-05 11:37:11

Scalability: AWS allows businesses to scale resources up or down based on demand, accommodating fluctuations in traffic and workload.

Cost-Effectiveness: The pay-as-you-go pricing model ensures that businesses only pay for the resources they use, eliminating the need for upfront investments in physical hardware.

Reliability: With data centers located in multiple regions worldwide, AWS ensures high availability and fault tolerance, providing a reliable and robust infrastructure for businesses.

**[AWS Course in Pune
](https://www.sevenmentor.com/amazon-web-services-training-institute-in-pune.php)**

Security: AWS prioritizes security and compliance, offering robust identity and access management (IAM) tools, encryption, and compliance certifications to protect sensitive data.

Global Reach: AWS operates in multiple geographic regions, enabling businesses to reach a global audience with low latency and high performance.
The in and not in Operators in python.
Tags: beginners, programming, softwareengineering
Published: 2023-08-05 11:19:37

you can determine whether a value is or isn’t in a list with the in and not in operators. Like other operators, in and not in are used in expressions and connect two values: a value to look for in a list and the list where it may be found. These expressions will evaluate to a Boolean value. Enter the following into the interactive shell and see various outputs:


```
>>> 'howdy' in ['hello', 'hi', 'howdy', 'heyas']
True
>>> spam = ['hello', 'hi', 'howdy', 'heyas']
>>> 'cat' in spam
False
>>> 'howdy' not in spam
False
>>> 'cat' not in spam
True
```
PHP 8.2: why using read-only classes?
Tags: php, beginners, programming
Published: 2023-08-05 10:42:45

PHP 8.2 introduced read-only classes. In PHP 8.1, you can already define read-only properties that cannot be overwritten from outside.

Now, you can automatically declare all class properties as `readonly`. All the previous rules (read-only properties) will apply.

## Hum, why making all properties read-only?

To prevent dynamic properties (deprecated), even with the special attribute `#[AllowDynamicProperties]`, for example.

## PHP 8.2 syntax for read-only classes

```PHP
readonly class Test {
    public string $property;
}
```

## You can't use it for everything

Unless it's a standard class or an abstract, you cannot use the `readonly` keyword with the following structures:

* Interfaces
* Enums
* Traits

You would get a fatal error.

## Type safety vs. immutability

Whether it's for read-only properties or entire read-only classes, you can only use the `readonly` keyword with **typed** properties.

You also cannot circumvent this mechanism with inheritance. Child classes will have to be read-only too.

However, `read-only` does not mean immutable, as if your properties hold objects, these objects can still change. It's essential to keep that in mind.

## Wrap up

The classic usage would be for object values. You write less code, but it does not guarantee immutability everywhere.
Using for loops with Lists in Python.
Tags: productivity, python, development, coding
Published: 2023-08-05 10:36:45

A for loop is used for iterating over a sequence (that is either a list, a tuple, a dictionary, a set, or a string)in python. For example here Technically, a for loop repeats the code block once for each value in a list or list-like value. For example, if you ran
this code:

```
for i in range(4):
print(i)
```

```
output
0
1
2
3
```
This is because the return value from range(4) is a list-like value that Python considers similar to [0, 1, 2, 3].
PHP 8.1: why using read-only properties?
Tags: php, beginners, programming
Published: 2023-08-05 10:19:24

PHP 8.1 introduced read-only properties, which allows creating class properties that cannot be overwritten with less code.

## What are read-only properties?

Read-only properties are initialized once and are not supposed to change after.

PHP programmers have been using various techniques to create such properties before PHP 8.1, for example, using value objects with no setters and only public getters.

You may think that constants are even simpler, but it's a very specific type that cannot cover all cases.

With PHP 8.1, the language ensures such properties cannot be changed from outside.

## Read-only properties syntax in PHP 8.1

Using the `readonly` keywords and the constructor promotion, we can declare such properties in one line: 

```PHP
class Foo {
    public function __construct(public readonly string $property) {}
}
```

## Wrap up

Read-only properties are handy in value objects. If you combine it with constructor promotion, the code will be more readable.
map as props in DrawFToolbar does not work correctly
Published: 2023-08-03 11:47:56

hi
i tried to simplified my codes to get sooner a solution, I have a Map component and a DrawFToolbar component, I send map as props to DrawFToolbar component, there are some console lines in DrawFToolbar to check.so in console I get this messages: "DrawFToolbar rendered" and "DrawFToolbar useEffect hook triggered" and then map send to console, it seems to be a valid map element (<div class="leaflet-container leaflet-touch leaflet-retina leaflet-fade-anim" tabindex="0" style="height: 400px; position: relative;"></div>)         but when compiler reach to run any method of map , i get this error: "map.addLayer is not a function" . for example i want to add a marker to map and get mentioned error. following i put my codes it make easy solving this error :

import L from 'leaflet';
import 'leaflet/dist/leaflet.css';
import 'leaflet-draw/dist/leaflet.draw.css';
import 'leaflet-toolbar/dist/leaflet.toolbar.css';
import 'leaflet-draw/dist/leaflet.draw.js';
import 'leaflet-toolbar/dist/leaflet.toolbar.js';
import React, { useState, useEffect, useRef } from 'react';
import Axios from "axios";
import  DrawFToolbar from './DrawFToolbar';
import 'leaflet-toolbar';

 
function Map() {
  const mapRef = useRef(null);  
  const [drawToolbarLoaded, setDrawToolbarLoaded] = useState(false);

  useEffect(() => {

    if (mapRef.current) {
    const map = L.map(mapRef.current).setView([51.505, -0.09], 13);

    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
      attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors',
      maxZoom: 18,
    }).addTo(map);
  

    setDrawToolbarLoaded(true);
  
   return () => {
      map.remove();
    }
  }
  
  }, []);

  
  return (<div ref={mapRef} style={{ height: '400px' }} > 
            {drawToolbarLoaded && <DrawFToolbar mapRef={mapRef} />}
          </div>);
  
}

export default Map

import { useEffect } from 'react';
import L from 'leaflet';
import 'leaflet-draw/dist/leaflet.draw.css';
import 'leaflet-toolbar/dist/leaflet.toolbar.css';
import 'leaflet-draw/dist/leaflet.draw.js';
import 'leaflet-toolbar/dist/leaflet.toolbar.js';
import 'leaflet/dist/leaflet.css';


function DrawFToolbar(props) {

  console.log('DrawFToolbar rendered');
  useEffect(() => {
     
    console.log('DrawFToolbar useEffect hook triggered');
    const map = props.mapRef.current;
    
    console.log(map)
      if (map) {
      L.marker([51.6, -0.09]).addTo(map);
    }
  
  }, [props.mapRef]);

  return null;
   
}

export default DrawFToolbar;
I expect to know why leaflet map's methods in DrawFToolbar do not work whereas map exist and apparently is a valid leaflet map. thanks
Thi công nội thất chung cư
Tags: thicongnoithatchungcu, noithatnhaviet, thietkenoithat
Published: 2023-08-05 09:42:40

"Công Ty Cổ Phần Xây Dựng Nội Thất Nhà Việt tự hào là đơn vị thi công nội thất chung cư, biệt thự, nhà phố,... uy tín, chất lượng bao trọn gói cho khách hàng
Hotline: 0902189939
Địa chỉ:
Hữu Bằng - Thạch Thất - Hà Nội
Tân Thới Hiệp - Quận 12 - TP HCM
https://noithatnhaviet.org/
Chuyên thi công nội thất:
https://noithatnhaviet.org/thiet-ke-noi-that-chung-cu.html
https://noithatnhaviet.org/thiet-ke-noi-that-nha-pho.html
https://noithatnhaviet.org/thiet-ke-noi-that-biet-thu.html
https://noithatnhaviet.org/thiet-ke-noi-that-van-phong-tin.html
https://noithatnhaviet.org/thiet-ke-noi-that-nha-hang.html
https://noithatnhaviet.org/thiet-ke-noi-that-showroom.html
#thicongnoithat #noithatnhaviet #thicongnoithatchungcu #thicongnoithatcanho #noithatbietthu #tuvanthietke #thietkenhao #cuagocongnghiep #baogianoithat"
BẠN THẤY KHÓA HỌC NÀO MANG LẠI LỢI ÍCH LỚN NHẤT ĐỂ TRỞ THÀNH 1 DEV JAVA?
Tags: lnxtrans, quora, beginners
Published: 2023-08-05 09:11:02

BẠN THẤY KHÓA HỌC NÀO MANG LẠI LỢI ÍCH LỚN NHẤT ĐỂ TRỞ THÀNH 1 DEV JAVA? 

trả lời bởi Chris Nash, bán code dc 30 năm (1993 - nay) 

cái khóa học Kỹ thuật phần mềm (Software Engineering) 4 năm ở DH. 

Chú không học khóa nào về Java cả. Java thậm chí còn chưa tồn tại lúc chú nhận bằng. Thay vào đó, hồi đấy chú học các khái niệm nền tảng của Kỹ thuật phần mềm qua 4 năm DH. Hồi đó chú học Pascal, Assembly, C & C++ 

Khi thế giới chuyển sang thời đại của Java, chú mua 1 quyển "Java in a Nutshell" khoảng 99-2000 gì đó, trong cuốn đấy giảng giải về Java 1.0 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gyfba4csv6xa7j3i6v3s.png)



Vì chú đã rất quen thuộc với C++, nên chú hiểu dc nó (java) khá là nhanh chóng. Java sử dụng các khái niệm tương tự về Hướng Đối Tượng, dc cái là mấy khái niệm đó dc thực hiện trong java rành mạch hơn trong C++ nhiều, đơn giản vậy thôi. 

Nền tảng về kỹ thuật phần mềm khiến cho việc hiểu 1 ngôn ngữ mới dễ dàng hơn nhiều, bất kể là Java, C++, C# hoặc các ngôn ngữ khác. 

Ngôn ngữ chỉ là công cụ. các nguyên lý của kỹ thuật phần mềm mới là kỹ năng. 

Lời người dịch: 
2007 - 2011 tui học Kỹ thuật phần mềm, trong 4 năm đó tui cũng học Pascal, C, Assembly, C++, VB 6, rồi C#, cả SQL nữa, nếu tính nó vào. 
mặc dù bây giờ tui là 1 "cái quạt" của C# cơ mà thú thật hồi đó tui đã thi lại C# 1 lần. 
và rồi tui khởi nghiệp bằng Java, rồi lẩn quẩn 1 vòng đến giờ tui đi dạy người ta kỹ thuật phần mềm (Software Engineering) vẫn thấy người ta cãi nhau về "ngôn ngữ nào" vô tri như tui hồi 2007 :D 

cho nên, NẾU BẠN LÀ SINH VIÊN, ngôn ngữ nào không quan trọng, quan trọng là bạn có hiểu dc cái khái niệm về kỹ thuật phần mềm đằng sau đó không? 

còn đi làm, thì thằng bạn tui hồi 2011 nói 1 câu mà giờ ngẫm lại tui thấy chí lí "người ta trả tiền cho mình code bằng ngôn ngữ nào thì mình gõ ngôn ngữ đấy, ý kiến thì tự mở công ty mà làm" 😎

thứ hai, nếu là "lập trình viên chuyển nghề" không lẽ cũng phải học hết 4 năm như lời ông với ông kia?. 

không cần phải học hết 4 năm, nhưng bạn phải học hết dc các khái niệm về software engineering, chứ đừng kì vọng học xong cái course Java 6 tháng là ra làm lương ngàn Biden  🤔 kẻo thất vọng đó 💀 

các khái niệm nền tảng của kỹ thuật phần mềm là gì? 

dài lắm, 1 post nói không hết, nếu rảnh tui sẽ viết thêm, chỉ là không biết khi nào tui rảnh :D 

căn bản nhất là cái vòng đời WRSPM. Google cũng miễn phí, bạn có thể tự gúc theo key word đó trước, rồi đặt câu hỏi thông minh, nếu có thể trả lời, tui sẽ trả lời :D 

link quora: https://qr.ae/pyJWi1