teleren/devto huggingface dataset:
Pareja recuperó la "velocidad de crucero" en un 2022 para la ilusión y el futuro
Published: 2023-01-03 04:49:22

El escritor José Gallart, autor de obras como 'Ecos de otra era', 'Nadie puede escapar' y la saga de fantasía 'El éxodo de los Arcanos', entre otras, regresa al panorama literario con 'La gema de Firén. El secreto perdido'. Esta novela de ciencia ficción es el primer volumen de una bilogía que apasionará a los amantes del género.

En esta obra sumerge a los lectores en dos mundos distintos en los que se mezcla la realidad contemporánea con la ciencia ficción o la fantasía; mundos en los que todo es posible.

El primero, ambientado en el presente, muestra el peligroso experimento con un reactor de antimateria en una instalación secreta por parte del Gobierno estadounidense y la visita de una nave espacial a la Tierra, tras la que se avecina una terrible catástrofe. El segundo, ambientado en el futuro, transcurre casi ochenta años más tarde del relato principal, y en él se observan las consecuencias de la ambición de poder del hombre para la humanidad.
[https://www.enlineanoticias.mx/](https://www.enlineanoticias.mx/)
[https://www.riodejaneiro-24h.com/](https://www.riodejaneiro-24h.com/)
[https://www.acordasalvador.com/](https://www.acordasalvador.com/)
Pareja recuperó la "velocidad de crucero" en un 2022 para la ilusión y el futuro
Published: 2023-01-03 04:48:37

Pareja en el último año ha ido recuperando de forma paulatina la actividad normal mediatizada por los efectos sanitarios y económicos del coronavirus. No obstante durante  toda la pandemia el Ayuntamiento estuvo "al pie del cañón, atendiendo a todos los vecinos desde el primer minuto". De hecho el año 2022 comenzó con la realización de test por parte de personal sanitario contratado por el consistorio a todos los vecinos el día de Nochevieja.

Al margen de la pandemia, una de los principales objetivos del gobierno municipal es la de potenciar el Turismo, "por las enormes potencialidades que tenemos en el municipio y como principal palanca para la creación de empleo y desarrollo económico", tal como señala Javier del Río, alcalde de la localidad desde 1999.

Por tal motivo han sido numerosas las iniciativas desarrolladas en este ámbito por el consistorio durante el último año. Como la creación de visitas turísticas guiadas que recorre los principales lugares de Pareja: plaza Mayor, puerta del Sol, Museo de las Brujas, eremitorio o plaza de toros. La actividad se ha completado con la edición de un folleto explicativo. Los interesados pueden concertar la visita cualquier día del año, llamando al propio Ayuntamiento con al menos 48 horas de antelación. La actividad se realiza a través de una empresa de ocio activo recién radicada en Pareja.
[https://www.enlineanoticias.mx/](https://www.enlineanoticias.mx/)
[https://www.riodejaneiro-24h.com/](https://www.riodejaneiro-24h.com/)
[https://www.acordasalvador.com/](https://www.acordasalvador.com/)
OpenBSD Disk Encryption: Change passphrase
Tags: openbsd, disk, encryption, password
Published: 2023-01-03 04:33:04

Is it possible to change the passphrase after applying [Full Disk Encryption](https://obsd.solutions/en/blog/2022/12/14/openbsd-full-disk-encryption-on-virtualbox/index.html) by it to your OpenBSD server ?

Yes !! This post shows how. It's a really simple way with [bioctl](https://man.openbsd.org/bioctl).

First, login to your server. Then run:

```console
$ doas bioctl -P sd1
```

Well, in this example, `sd1` is CRYPTO volume introduced by [softraid](https://man.openbsd.org/softraid). (Moreover, `sd0` is the origin disk.) In other words, `sd1` here is where OpenBSD was actually installed via the installer.

You will be asked:

```console
Old passphrase: 
New passphrase: 
Re-type passphrase:
```

Enter them. That's it !!!

When reboot it, you will be accepted with the new passphrase.
What is Your Dream Programming Language Like?
Tags: programming, productivity, discuss, compiler
Published: 2023-01-03 04:17:54

Every programmer has different preferences in their code. Some like strict-logical OOP, some like bug-free functional languages. Some tried to create a language that resembles Python's flexibility and C's efficiency, while some stay conservative and favor archaic, old-fashion code style. In this period of unpredictability, new technology emerge, yet the older generations phased out and never came back. What is your dream programming language like? A language that can solve the problems or bugs that you are currently facing? A language that can make your life easier? What features does it have? It is not about implementability, it is only about your imagination! We can talk about everything under this post.
From any to unknown: A Guide to Upgrading Your TypeScript Typing
Tags: typescript, codequality, javascript, cleancode
Published: 2023-01-03 04:13:28

In TypeScript, the `unknown` type is used to represent values that are not known at compile time. This is in contrast to the `any` type, which represents values that can be of any type, including values that are not known at compile time.

One advantage of using `unknown` over `any` is that it provides a level of type safety. When a value is of type `unknown`, the TypeScript compiler will require the programmer to perform type checks before performing certain operations on that value. This helps to prevent unintended type errors at runtime.

For example, consider the following code:

```js
function printLength(x: any) {
  console.log(x.length);
}

printLength("hello"); // Output: 5
printLength([1, 2, 3]); // Output: 3
printLength({ key: "value" }); // Output: undefined

```

In this code, the *printLength* function takes a value of type `any` and attempts to access the length property on that value. However, not all values have a length property, so this code will produce an error when passed an object like: 

```json
{ key: "value" }
```

If we change the type of the parameter *x* to `unknown`, the TypeScript compiler will require us to perform a type check before accessing the *length* property:

```js
function printLength(x: unknown) {
  if (typeof x === "string" || Array.isArray(x)) {
    console.log(x.length);
  } else {
    console.log("Cannot determine length");
  }
}

printLength("hello"); // Output: 5
printLength([1, 2, 3]); // Output: 3
printLength({ key: "value" }); // Output: Cannot determine length
```

In this revised version of the *printLength* function, we perform a type check using the typeof operator and the **Array.isArray()** function before attempting to access the length property. This ensures that the code will only attempt to access the length property on values that are known to have it, and will handle other values gracefully.

Another advantage of using `unknown` over `any` is that it forces the programmer to be explicit about the type of a value. This can make the code easier to understand and maintain, as it clearly communicates the programmer's intentions and assumptions about the types of values being used.

In summary, the `unknown` type is a useful tool in TypeScript for representing values that are not known at compile time, and provides a level of type safety and explicitness that is not available with the `any` type. It is often a good idea to use `unknown` instead of `any` whenever possible in order to make the code more robust and maintainable.

<a href="https://www.buymeacoffee.com/ailifidaach" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
Troubleshooting: "UNPREDICTABLE_GAS_LIMIT" thrown when calling a readonly contract method.
Tags: troubleshooting, blockchain, ethereum, smartcontracts
Published: 2023-01-03 03:37:30

## Symptom

When a calling to a smart contract readonly method happened, a "UNPREDICTABLE_GAS_LIMIT" exception was thrown:

```text
ERROR Error: Uncaught (in promise): Error: cannot estimate gas; transaction may fail or may require manual gas limit (error={"code":-32000,"message":"execution reverted"}, method="call", transaction={"to":"0xE6183d3094b9r360B121Ec1330afAE76A74d1cbF","data":"0xdb699765000000000000000000000000b2b7bedd7d7fc19804c7dd4a4e8174c4c73c220d0000000000000000000000000000000000000000000000000de0b6b3b7640000000000000000000000000000000000000000000000000000000000006c915aef"}, code=UNPREDICTABLE_GAS_LIMIT, version=providers/5.0.24)
    at d.makeError (main.a577643548eb15e6832e.js:1)
    at d.throwError (main.a577643548eb15e6832e.js:1)
    at Z (main.a577643548eb15e6832e.js:1)
    at $e.<anonymous> (main.a577643548eb15e6832e.js:1)
    at Generator.throw (<anonymous>)
    at a (main.a577643548eb15e6832e.js:1)
    at l.invoke (polyfills.797d13e303959ed8dd77.js:1)
    at Object.onInvoke (main.a577643548eb15e6832e.js:1)
    at l.invoke (polyfills.797d13e303959ed8dd77.js:1)
    at a.run (polyfills.797d13e303959ed8dd77.js:1)
    at Z (polyfills.797d13e303959ed8dd77.js:1)
    at polyfills.797d13e303959ed8dd77.js:1
    at a (main.a577643548eb15e6832e.js:1)
    at l.invoke (polyfills.797d13e303959ed8dd77.js:1)
    at Object.onInvoke (main.a577643548eb15e6832e.js:1)
    at l.invoke (polyfills.797d13e303959ed8dd77.js:1)
    at a.run (polyfills.797d13e303959ed8dd77.js:1)
    at polyfills.797d13e303959ed8dd77.js:1
    at l.invokeTask (polyfills.797d13e303959ed8dd77.js:1)
    at Object.onInvokeTask (main.a577643548eb15e6832e.js:1)
```

> NOTE
> 
> It is READONLY here.

## Cause

If we are calling a write method and get this error, that's understandable. However, for a readonly method invocation, no transaction will be sent, so no gas limit estimation should happen at all!

In this case, it is highly probable that you are calling a non existent method in the contract. Especially, it is not uncommon when you are using "human readable abi" with ethers.js, such as a typo.

## Solution

So, to solve this, you can check if the target contract includes the method you are calling:

- wrong method names?
- wrong method arguments?
- wrong abis? Note, when you are using "human readable abi", please make sure the punctuation is not included. Fox example:
  - √: `function testMethod(uint256) public view returns (uint256)`
  - X: `function testMethod(uint256) public view returns (uint256);`

> The only difference between these two abis is the ";" at the end.
What is DevOps?
Tags: devops, devjournal
Published: 2023-01-03 03:31:00

- For evangelists, it is a culture and a transformation
- For engineers, it is a set of agile tools and techniques
- For managers, it is a methodology
- For others is just a buzzword
- For recruiters, it is a job


![DevOps](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9srqfd4j8tvxlg2iriy8.png)


Thanks for reading this.

If you have an idea and want to build your product around it, schedule a call with [me](https://calendly.com/pragyanatvade).

If you want to learn more in DevOps and Backend space, [follow me](https://dev.to/pragyanatvade).

If you want to connect, reach out to me on [Twitter](https://twitter.com/pragyanatvade) and [LinkedIn](https://www.linkedin.com/in/pragyanatvade/).
Easily create UUIDs without a package
Tags: webdev, beginners, javascript, node
Published: 2023-01-03 03:27:24

So you want to create UUIDs but you don't want to download `node-uuid` or some other UUID generating library. Then I think you'll like the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Crypto).

See, this API comes with a method called [randomUUID](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/randomUUID) which generates a random and valid version 4 UUID.

Example:

```javascript
const uuid = window.crypto.randomUUID(); // returns '5ac3544a-2c5e-4428-b948-41762b123e11'
```

Hopefully, this comes in handy for you. And before you ask, browser support is amazing!

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w8eu4aseqe1pyksp8tt4.png)
API Testing using Postman: Part 2 ( Understanding HTTP Methods and Authentication )
Tags: webdev, beginners, programming, tutorial
Published: 2023-01-03 03:17:30

Buy the Full course Here - ►► https://learnapitesting.com

{% embed https://youtu.be/YazDWUPh_xs %}

In this series of API Testing using Postman - Part 2, You are going to learn What is HTTP  and What are different type of HTTP Methods like GET,POST, PUT , PATCH AND DELETE,OPTIONS ? and What is authentication and How to perform the different type of authentication in postman like basic authorization, digest authorization and aws , hawk and Oauth 1.0, 2.0 in postman.

You are going to learn the concepts of API, API testing, web services and HTTP Methods basics which are helpful in API testing interview questions

#API #APITesting #Postman  #APITestingTutorials.

Join Facebook Group :  http://bit.ly/learntesting2019

Website:   https://scrolltest.com

Website:   https://thetestingacademy.com

Twitter: https://twitter.com/itstechmode
 🚀 Tools and services I recommend:
Some of the courses that I recommend to become better Automation Tester 🙌🙌

✅Selenium Training and Certification -
https://scrolltest.com/go/edureka


✅Learn Jenkins for QA -
https://bit.ly/learnjenkins-p1


✅Programming Java -
https://bit.ly/learnjava2020-p1


✅Test Automation - 
https://bit.ly/learnautomation2020


✅API Testing - 
https://www.learnapitesting.com


✅Cypress Tutorial with LIVE Projects -
http://cypresstutorial.com
Cách Thay Đổi Tên Hiển Thị Và Tên Người Dùng Của Bạn Trên Twitter Thật Dễ Dàng
Published: 2023-01-03 02:42:59


Giống như các ứng dụng mạng xã hội khác, Twitter cũng cho phép người dùng tự do thay đổi tên người dùng và tài khoản đăng nhập. Bạn có thể sử dụng tính năng này để đặt cho mình một cái tên dễ nhớ và độc đáo hơn.
Xem thêm:[twitter trai 2005](https://tokyotower.com.vn/twitter/)
Bạn muốn đổi tên hiển thị và tên người dùng thành một cái gì đó dễ nhớ, hoặc có một tên người dùng độc và lạ trên ứng dụng mạng xã hội Twitter nhưng không biết làm thế nào? Đừng lo, bài viết dưới đây sẽ hướng dẫn bạn cách đổi tên hiển thị và tên đăng nhập Twitter trên điện thoại, máy tính một cách nhanh chóng và dễ dàng nhất.
Xem thêm:[Cách Tắt Hiệu Ứng Âm Thanh Của Twitter Trên Điện Thoại Đơn Giản](https://tokyotowervn.simdif.com/page-10290771.html)
1. Thay đổi tên hiển thị và tên người dùng Twitter trên điện thoại của bạn
Hướng dẫn đổi tên hiển thị trên Twitter

Bước 1: Vào ứng dụng Twitter > bấm vào ảnh đại diện của bạn > chọn Hồ sơ.



Bước 2: Nhấn vào Chỉnh sửa hồ sơ > Tại đây bạn có thể thay đổi tên hiển thị nếu muốn > Nhấn vào Lưu để hoàn tất việc chỉnh sửa.
Xem thêm:[Cách Bỏ Chặn Người Dùng Twitter Qua Điện Thoại Di Động Và Máy Tính Rất Đơn Giản](https://hackmd.io/@tokyotowercomvn/B1TDEMb9s)

Hướng dẫn đổi tên người dùng trên Twitter
Bước 1: Bấm vào ảnh đại diện của bạn > chọn Cài đặt và quyền riêng tư.

Bước 2: Nhấp vào Tài khoản của bạn > Chọn Thông tin tài khoản.



Bước 3: Nhấn vào Tên đăng nhập > Thay đổi tên người dùng mới nếu được yêu cầu > Nhấn vào Kết thúc.


2. Đổi tên hiển thị và tên người dùng Twitter trên máy tính
Hướng dẫn đổi tên hiển thị trên Twitter

Bước 1: Vào Twitter trên máy tính tại đây > bấm vào Profile.

Bước 2: Chọn Chỉnh sửa hồ sơ.

Bước 3: Nhập tên hiển thị mới của bạn và nhấn Lưu để hoàn tất chỉnh sửa.

Hướng dẫn đổi tên người dùng trên Twitter

Bước 1: Click vào biểu tượng 3 dấu chấm.

Bước 2: Chọn Cài đặt và Quyền riêng tư.

Bước 3: Trong Tài khoản của bạn > Nhấp vào Thông tin tài khoản.

Bước 4: Bấm vào tên người dùng.

Bước 5: Chỉnh sửa tên đăng nhập mới và nhấn Lưu.

Bài viết trước đã hướng dẫn các bạn cách đổi tên hiển thị và tên đăng nhập Twitter trên điện thoại, máy tính cực dễ dàng. chúc bạn thành công!

Bạn vừa xem:[Cách Thay Đổi Tên Hiển Thị Và Tên Người Dùng Của Bạn Trên Twitter Thật Dễ Dàng](https://dev.to/tokyotowervn/cach-thay-doi-ten-hien-thi-va-ten-nguoi-dung-cua-ban-tren-twitter-that-de-dang-2e1h)
Mọi thông tin xin vui lòng liên hệ với  [Tokyo Tower VN](https://tokyotower.com.vn/)
F# Tutorial (3) - Tuple
Tags: fsharp
Published: 2023-01-03 02:40:54

이번 글에선 F#에서의 Tuple에 대해 알아보겠습니다.

#### Definition

Tuple은 1개 이상 type으로 이루어진 이름없는 값들의 그룹입니다.
```fsharp
(1, 2)
("one", "two", "three")
(a, b)
("one", 1, 2.0f)
(a + 1, b + 1)
```
위의 예시들에서 볼 수 있듯이 각 원소들의 type이 달라도 상관없습니다.
또한 FP에서 '값'이란 것은 결국 함수이기 때문에 안에 함수가 들어가도 상관없고요.

또한 값을 여러 개 입력받을때도 유용하지만, 여러 개 출력할 때도 유용합니다.
```fsharp
let divRem a b =
    let x = a / b
    let y = a % b
    (x, y)		// x와 y를 동시에 리턴
```

#### Type of tuple

Tuple의 type은 `*`를 사용해서 표기합니다.
뒤에서 볼 struct tuple의 경우 기존 type을 `struct( )`로 감싸주면 그게 곧 struct tuple의 type이 됩니다.
```fsharp
let a = (1, 2.0f, "three")		// int * float * string
let b = struct (1, 2.0f, "three")	// struct (int * float * string)
```

#### 개별 원소에 접근하기

이러한 tuple의 각 원소에 접근하는 방법엔 여러 가지가 있습니다.

먼저 `let` Binding을 사용할 수 있겠군요.
```fsharp
let (a, b) = (1, 2)	// a = 1, b = 2   
```

다음으론 내장 함수인 `fst`, `snd`를 사용하는 방법도 있습니다. `fst`함수는 해당 tuple의 첫 번째 원소를, `snd`함수는 두 번째 원소를 리턴해줍니다.
```fsharp
let c = fst (1, 2, 3)	// c = 1
let d = snd (1, 2, 3)	// d = 2
```
그런데 세번째 이후의 원소를 리턴하는 함수는 없습니다. 만일 필요하다면 아래와 같이 직접 만들 수는 있죠.
```fsharp
let third (_, _, c) = c
```

나중에 알아볼 Pattern Matching을 이용해도 됩니다.
```fsharp
let print tuple1 = 
    match tuple1 with
    	| (a, b) -> printfn "Pair %A %A" a b
```

함수의 인자로 쓰는 거라면 아래처럼 명시적으로 각 원소로 분해해서 받아도 되고요.
```fsharp
let distance ((x1, y1): float * float) ((x2, y2): float * float)) =
    (x1 * x2) - (y1 * y2)
```

Tuple 내에서 관심이 없는 원소가 있다면, `_`를 사용해 받으면 해당 원소에 대한 새 할당을 피할 수 있습니다.
```fsharp
let (a, _) = (1, 2)	// 2는 버려집니다.
```

#### Struct tuple

지금까지 사용한 tuple은 모두 reference tuple입니다. 이와는 반대로 struct tuple도 존재합니다. Struct tuple은 Reference tuple과 달리 value type이며, heap이 아닌 stack에 저장되어서 약간의 성능 향상을 꾀할 수 있습니다.

Struct tuple은 다음과 같이 tuple 앞에 `struct`가 붙는다는 것 외에 다른 모든 점이 동일합니다. 적어도 사용에 있어서는요.
```fsharp
let str_a = struct (1, 2, 3)
let struct (a, b) = struct (1, 2)	// a = 1, b = 2
```

하지만 내부 구현은 전혀 다르기 때문에 reference tuple과 struct tuple 간의 암시적인 컨버팅은 불가능합니다.
```fsharp
let (a, b) = struct (1, 2)	// Compile error!
let struct (c, d) = (1, 2)	// Compile error!

// 이런 꼼수도 불가능합니다.
let convert (tpl: struct(int * int)): int * int = tpl
```

Reference tuple과 struct tuple 간에 컨버팅을 하고 싶다면, 다음과 같이 명시적으로 각각의 원소들을 새로 집어넣어서 새 tuple을 만들어야 합니다.
```fsharp
let (a, b) = (1, 2)
let struct (c, d) = struct (a, b)
```

그러면 언제 struct tuple을 써야 할까요? 저는 크게 다음과 같은 케이스에서 사용을 고려할 수 있다고 생각합니다.

- 사용하고자 하는 tuple의 원소 개수가 많거나 개별 원소가 복잡한 type을 가지고 있을 때, 성능 향상을 위해 사용
- C#과의 interop가 필요한 경우

이 중 후자의 경우에 대해 더 알아보겠습니다. C# 7.0 이후 버전에서 tuple은 System.ValueTuple로 컴파일되며 이는 value type입니다. 그리고 F#에서의 struct tuple 역시 System.ValueTuple로 컴파일됩니다.
즉, C#의 Tuple과 F#의 struct tuple은 완전히 동일한 타입이기 때문에 C#과의 interop를 고려하고 있다면 struct tuple을 사용해야만 합니다.

```csharp
namespace Interop
{
    public static class Sample
    {
        public static (int, int) AddOne((int x, int y) tpl)
        {
            return (tpl.x + 1, tpl.y + 1);
        }
    }
}
```
```fsharp
open Interop

let struct (x, y) = Sample.AddOne(struct (1, 2))	// x = 2, y = 3
```
위와 같이 C# Tuple과 F# struct tuple은 근본적으로 동일하기 때문에 별다른 과정 없이 자연스럽게 interop가 가능합니다.

다음 글에선 Collection을 다루도록 하겠습니다.
F# Tutorial (2) - Basics
Tags: fsharp
Published: 2023-01-03 02:38:55

본격적으로 F#을 시작해봅시다.

먼저 F#은 닷넷 위에서 돌아가는 언어이기 때문에 닷넷 개발환경을 갖추시면 그게 곧 F#의 개발환경이 됩니다. 보통은 Visual Studio겠지만 Rider 혹은 VSCode 등의 텍스트 에디터를 사용하셔도 됩니다. 이도저도 다 귀찮다면 [Try F#](https://try.fsharp.org/)에서 온라인으로 실행시켜 볼 수 있습니다.

### `let` Binding
F#은 함수형 언어입니다. 이 말은 모든 것을 함수로 취급하고 관리한다는 의미입니다. 따라서 엄밀히 말해서 함수형 언어에서는 변수라는 개념이 존재하지 않습니다.

F#에서 함수를 선언할 때는 `let`을 사용합니다.
```fsharp
let square x = x * x	// square(x) = x * x
let result = square 3	// 9
let a = 3		// 3
```
첫번째 줄의 `square`는 인자 1개를 `x`라는 이름으로 받아 `x * x`를 리턴하는 함수입니다.
두번째 줄의 `result`는 인자를 받지 않고 `square 3`을 리턴하는 함수입니다.
세번째 줄의 `a`는 인자를 받지 않고 `3`을 리턴하는 함수입니다.

`square`는 누가 봐도 함수라고 생각하겠지만, `result`와 `a`는 변수가 아닌가? 라는 생각이 드실 겁니다. 하지만 이들 또한 인자가 없고 해당 값을 리턴하는 함수로 봐야 함수형 언어를 쉽게 이해할 수 있습니다.

또한 모든 것이 함수로 취급되기 때문에, 함수 뒤에 별다른 연산식 없이 값만 나열된 것은 자연히 그 함수의 인자로 취급됩니다. 그 때문에 인자를 굳이 `()`로 감쌀 필요가 없죠. 물론 우선순위를 바꿔야 할 필요가 있다면 괄호를 써도 상관없습니다.
```fsharp
let temp = square (a + 3)	// 36
```
이 코드에서는 `a + 3`을 먼저 계산한 뒤 그 값인 `6`을 `square` 함수에 넘겨줍니다.

저번 글에서 잠깐 언급했지만, F#을 비롯한 함수형 언어에서는 기본적으로 모든 함수가 immutable입니다.
만일 이미 기존에 존재한 함수에 새 값을 할당하고자 할 경우, 아예 새 메모리를 할당하여 그 값을 바인딩합니다.
이 과정에서 기존에 정의된 값은 가려지기 때문에 다시는 접근이 불가능합니다.

하지만 F#은 순수한 FP 언어가 아니기 때문에 함수를 mutable하게 만들 수 있는 키워드를 제공합니다.
```fsharp
let mutable mutableVar = 2
mutableVar <- mutableVar + 1	// 3
```
mutable한 함수를 선언하고자 한다면, `let mutable`을 사용하면 됩니다. 이렇게 만들어진 mutable 함수는 `<-`를 사용해서 값을 변경할 수 있습니다. (`=`는 `let`으로 바인딩할 때를 제외하면 값이 같은지를 확인하는 함수이므로 여기서 `=`를 사용해서는 안 됩니다.)

**mutable은 그 자체로 FP의 패러다임을 깨기 때문에 사용을 신중하게 고려해야 합니다. 대부분의 상황에서는 mutable 없이도 충분히 구현이 가능합니다.**

### Primitive Types
위에서 정의한 `square` 함수를 보면 인자 `x`에 딱히 타입을 정해두지 않은 것을 알 수 있습니다. 하지만 이것이 F#에선 타입이 존재하지 않는다는 것을 의미하진 않습니다. F#은 컴파일 시에 type이 결정되는 Statically Typed Language이며, 강력한 타입 추론을 지원합니다. F#에서 지원하는 primitive type은 다음과 같으며 `unit`을 제외하고 전부 .NET에서의 type에 대응됩니다.
(좌측이 F# type, 우측이 .NET type입니다.)
* **bool = Bool**
* **byte = Byte**
* **sbyte = SByte**
* **int16 = Int16**
* **uint16 = UInt16**
* **int = Int32**
* **uint = UInt32**
* **int64 = Int64**
* **uint64 = UInt64**
* **nativeint = IntPtr**
* **unativeint = UIntPtr**
* **decimal = Decimal**
* **float, double = Double**
* **float32, single = Single**
* **char = Char**
* **string = String**
* **unit :** '값이 없음'을 나타내는 F#만의 타입입니다.

C#에서는 `float`과 `double`이 다르지만, F#에서는 둘 다 동일한 type, 정확히는 `double`로 취급됩니다.
또한 C#에서 사용하는 대부분의 연산자 역시 F#에서 동일하게 사용 가능합니다.
```fsharp
let boolean1 = true
let boolean2 = false
let boolean3 = not boolean1 && (boolean2 || false)	// false

let string1 = "Hello"
let string2 = "world"
let string3 = @"C:\Program Files\"			// @은 F#에서도 verbatim을 뜻합니다.
let string4 = """Triple quote "string" literal"""	// Triple quote도 가능합니다.
let string5 = string1 + " " + string2			// "Hello world"
let string6 = string5.[0..6]				// Substring - "Hello w"

```
위에서도 언급했듯이 F#은 타입 추론을 하기 때문에 명시적으로 지정해줄 필요는 없지만, 필요하다면 지정하는 것도 가능합니다.
```fsharp
let sampleFunc (x:Int) : Int = square x - x + 1
```

다음 글에선 Tuple에 대해 알아보겠습니다.
CSS display properties
Tags: css, beginners, programming
Published: 2023-01-03 02:36:39

How can I make display properties I set to none visible on hovering?

HTML part

<htnl>
    <head>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
      <nav>
        <ul>
          <li><a href="#">home</a>
            <ul><li>Coffee</li><li>Tea</li><li>Milk</li> </ul>
          </li>
          <li><a href="#">home</a></li>
           <li><a href="#">home</a></li>
            <li><a href="#">home</a></li>
                  
           
        </ul>
      </nav>
    </body>
    
   </html>



css part



ul li{
    float: right;
    list-style: none;
    position: relative;
    right: 100px;
  }
  ul li a{
    margin:20px;
    text-decoration: none;
    text-align: center;
  }
  /* ul li a ul li{
    position: absolute;
    bottom: 100px;
  } */
  body > htnl > nav > ul > li> ul{
    position: absolute;
    top: 25px; 
    display: none;

  }
  body > html > nav > ul > li > a:hover + ul li{
    display: block;
  }