Giter Club home page Giter Club logo

ios-exposition-universelle's Introduction

πŸ›οΈλ§Œκ΅­λ°•λžŒνšŒ

πŸ€ μ†Œκ°œ

yyss99 kyungmin이 λ§Œλ“  λ§Œκ΅­λ°•λžŒνšŒ μ•±μž…λ‹ˆλ‹€. JSON데이터λ₯Ό Decodeν•΄μ„œ TableView 와 ScrollViewλ₯Ό μ΄μš©ν•΄ λ°•λžŒνšŒμ— λŒ€ν•œ 정보λ₯Ό λ³΄μ—¬μ£ΌλŠ” μ•±μž…λ‹ˆλ‹€.

πŸ“– λͺ©μ°¨

  1. νŒ€μ›
  2. κ·ΈλΌμš΄λ“œλ£°
  3. 일일 슀크럼
  4. νƒ€μž„λΌμΈ
  5. μ‹€ν–‰ ν™”λ©΄
  6. μ‹œκ°ν™”λœ ν”„λ‘œμ νŠΈ ꡬ쑰
  7. νŠΈλŸ¬λΈ” μŠˆνŒ…
  8. ν”„λ‘œμ νŠΈ 회고
  9. 참고 링크

πŸ‘¨β€πŸ’» νŒ€μ›

yyss99(와이) kyungmin(κ²½λ―Ό)
Github Profile Github Profile

πŸ“ κ·ΈλΌμš΄λ“œλ£°

🌻 일일 슀크럼

⏰ νƒ€μž„λΌμΈ

λ‚ μ§œ λ‚΄μš©
2023.06.27.(ν™”) - MVC λ‹¨μœ„λ‘œ κ·Έλ£Ήν™”
- ExpoInformation νƒ€μž… 생성 및 κ΅¬ν˜„
- DataTransferObject κ·Έλ£Ή 생성
- ExpoEntry νƒ€μž… κ΅¬ν˜„
2023.07.02.(일) - expo_assets μΆ”κ°€
- ExpoViewController μΆ”κ°€ 및 κΈ°λŠ₯ κ΅¬ν˜„
- EntryViewController μΆ”κ°€ 및 κΈ°λŠ₯ κ΅¬ν˜„
- Entry TableCell κΈ°λŠ₯ κ΅¬ν˜„
- EntryDetailViewController 파일 μΆ”κ°€
2023.07.03.(μ›”) - μŠ€ν† λ¦¬λ³΄λ“œ autolayout μ œμ•½ μˆ˜μ •
- EntryDetailViewController entry 사진 및 μ„€λͺ… μΆ”κ°€
- ExpoViewController λ„€λΉ„κ²Œμ΄μ…˜ λ°” 숨기기 κΈ°λŠ₯ μΆ”κ°€
- DecodeError κ΅¬ν˜„
- ν”„λ‘œνΌν‹° μ ‘κ·Όμ œν•œ 및 λ¦¬νŒ©ν† λ§
- NumberFormatter κΈ°λŠ₯ κ΅¬ν˜„
- λ„€μž„μŠ€νŽ˜μ΄μŠ€ μΆ”κ°€ 및 뢄리
2023.07.05(ν™”) - CommaFormatter μˆ˜μ • 및 μΆ”κ°€
- EntryTableViewCell에 super.prepareForReuse()μΆ”κ°€
- decode 였λ₯˜ Alert κ΅¬ν˜„
-EntryDetailViewController μ˜μ‘΄μ„± μ£Όμž…
- ViewController 둜직 뢄리 및 String, Int ν™•μž₯
2023.07.06(ν™”) - 슀크둀 λ·° μ œμ•½ μˆ˜μ •
- ContainerViewController ν™”λ©΄ κ³ μ • κΈ°λŠ₯ μΆ”κ°€

πŸ“± μ‹€ν–‰ ν™”λ©΄

첫 ν™”λ©΄ ν…Œμ΄λΈ” λ·° ν™”λ©΄
상세 ν™”λ©΄ λ‹€μ΄λ‚˜λ―Ή νƒ€μž… 적용
SE ν™”λ©΄μœΌλ‘œ μ‹€ν–‰ SE ν™”λ©΄ λ‹€μ΄λ‚˜λ―Ή νƒ€μž… 적용

πŸ‘€ μ‹œκ°ν™”λœ ν”„λ‘œμ νŠΈ ꡬ쑰

🌟 Class Diagram

reference link

πŸ—‚ 폴더 ꡬ쑰

Model : μ•± ꡬ동 λ‘œμ§μ— ν•„μš”ν•œ λͺ¨λΈ View : 화면을 κ΅¬μ„±ν•˜λŠ” λ·° Controller : ν™”λ©΄μ˜ μ΄λ²€νŠΈμ™€ μ „ν™˜μ„ μ»¨νŠΈλ‘€ν•˜λŠ” 컨트둀러 App : AppDelegate, SceneDelegate

Expo1900 project
└── Expo1900
   β”œβ”€β”€ App
   β”‚   β”œβ”€β”€ AppDelegate
   β”‚   └── SceneDelegate
   β”œβ”€β”€ Model
   β”‚   β”œβ”€β”€ DataTransferObject
   β”‚   β”‚   │── ExpoInformation
   β”‚   β”‚   └── ExpoEntry
   β”‚   β”œβ”€β”€ NameSpace
   β”‚   β”‚   │── StoryBoardNameSpace
   β”‚   β”‚   │── AssetsNameSpace
   β”‚   β”‚   └── ExpoInformationNameSpace
   β”‚   β”œβ”€β”€ AlertController
   β”‚   β”œβ”€β”€ CommaFormatter
   β”‚   β”œβ”€β”€ DecodeError
   β”‚   β”œβ”€β”€ Decoder
   β”‚   └── ExpoInformationSetter
   │── Controller ContainerViewController
   β”‚   β”œβ”€β”€ EntryTableViewCell
   β”‚   β”œβ”€β”€ ExpoViewController
   β”‚   β”œβ”€β”€ EntryViewController
   β”‚   β”œβ”€β”€ EntryDetailViewController
   β”‚   └── ContainerViewController
   β”œβ”€β”€ View
   β”‚   β”œβ”€β”€ Main
   β”‚   └── LaunchScreen
   └── Resource
       β”œβ”€β”€ Assets
       └── Info

🧨 νŠΈλŸ¬λΈ” μŠˆνŒ…

1️⃣ Data의 μƒμˆ˜λͺ… λ°”κΎΈκΈ°

short_descλ‚˜ image_name 같은 μŠ€μœ„ν”„νŠΈ 넀이밍과 λ‹€λ₯Έ μƒμˆ˜λͺ…을 λ°”κΎΈκΈ° μœ„ν•΄μ„œ CodingKeyλ₯Ό μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

struct ExpoEntry: Decodable {
    let name: String
    let imageName: String
    let shortDescription: String
    let description: String
    
    private enum CodingKeys: String, CodingKey {
        case name
        case imageName = "image_name"
        case shortDescription = "short_desc"
        case description = "desc"
    }
}

2️⃣ Codable κ³Ό Decodable μ–΄λ–€ 것을 채택 ν•  것인가

Codable은 Decodableκ³Ό Encodableν”„λ‘œν† μ½œμ„ λ‘˜ λ‹€ 가지고 μžˆμ–΄μ„œ 데이터λ₯Ό μΈμ½”λ”©ν•˜κ³  λ””μ½”λ”©ν•˜λŠ”λ°μ— μ‚¬μš©λ©λ‹ˆλ‹€. λ°˜λ©΄μ— Decodableν”„λ‘œν† μ½œμ€ 데이터λ₯Ό λ””μ½”λ”©ν•˜λŠ”λ°λ§Œ μ‚¬μš©λ©λ‹ˆλ‹€. 이번 ν”„λ‘œμ νŠΈμ—μ„œλŠ” JSON데이터λ₯Ό λ””μ½”λ”© ν•˜λŠ” κ²ƒλ§Œ ν•„μš”ν•  것이라고 μƒκ°ν•΄μ„œ Decodable을 μ±„νƒν–ˆμŠ΅λ‹ˆλ‹€.

3️⃣ νŠΉμ • ν™”λ©΄λ§Œ μ„Έλ‘œ ν™”λ©΄ κ³ μ •ν•˜κΈ°

첫 ν™”λ©΄λ§Œ μ„Έλ‘œλ‘œ κ³ μ •ν•˜κΈ° μœ„ν•΄μ„œ UIViewController에 μžˆλŠ” supportedInterfaceOrientationsλΌλŠ” propertyλ₯Ό μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

supportedInterfaceOrientationsλŠ” κΈ°κΈ°λ°©ν–₯이 λ³€κ²½λ˜λ©΄ 루트 λ·° 컨트둀러 λ˜λŠ” 창을 μ±„μš°λŠ” μ΅œμƒμœ„ λͺ¨λ‹¬ λ·° μ»¨νŠΈλ‘€λŸ¬μ—μ„œ 이 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€κ³  κ³΅μ‹λ¬Έμ„œμ— λ‚˜μ™€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. view controllerμ—Β μƒμœ„Β view controllerκ°€ μžˆλ‹€λ©΄Β κ·Έ μƒμœ„Β view controller의 porpertyλ₯Ό λ”°λ₯Έλ‹€κ³  μ΄ν•΄ν–ˆμŠ΅λ‹ˆλ‹€. UINavigationControllerκ°€Β all이라면 κ·Έ μ•ˆμ— μžˆλŠ”Β viewController듀은 UINavigationControllerλ₯Ό 따라 all이 λ©λ‹ˆλ‹€.

final class ContainerViewController: UINavigationController {
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        guard let supportedInterfaceOrientations = self.topViewController?.supportedInterfaceOrientations else {
            return self.supportedInterfaceOrientations
        }
        
        return supportedInterfaceOrientations
    }
}

ν™”λ©΄λ§ˆλ‹€ λ°”κΎΈμ–΄μ£ΌκΈ° μœ„ν•΄μ„œ UINavigationController μƒμ†λ°›λŠ” classλ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. 그런 뒀에 κ°€μž₯ μ΅œμƒμœ„ viewController의 supportedInterfaceOrientations 속성을 returnν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.

//  μƒˆλ‘œλ‘œ κ³ μ • ν•  첫 ν™”λ©΄
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
}

// νšŒμ „μ΄ κ°€λŠ₯ν•˜κ²Œ ν•  κ·Έ λ‹€μŒ ν™”λ©΄
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .all
}

4️⃣ λ„€λΉ„κ²Œμ΄μ…˜ λ°” 색상 λ³€κ²½

μŠ€ν¬λ‘€μ„ 내리지 μ•Šμ•„λ„ Navigation Bar의 색상이 defaultμƒ‰μœΌλ‘œ λ³΄μ΄κ²Œν•˜λŠ” 방법에 λŒ€ν•΄ κ³ λ―Όν–ˆμŠ΅λ‹ˆλ‹€.

μŠ€ν† λ¦¬λ³΄λ“œ 상 inspector에 μžˆλŠ” Navigation Bar Appearancesμ†μ„±μ—λŠ” λ‹€μŒκ³Ό 같이 넀가지가 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  • Standard: 일반적인 μƒνƒœμ˜ Navigation Barλ₯Ό λ‚˜νƒ€λ‚΄κ³  Navigation Bar의 높이가 일반적인 크기둜 ν‘œμ‹œλ˜λ©°, λ„€λΉ„κ²Œμ΄μ…˜ μ•„μ΄ν…œκ³Ό 타이틀을 ν¬ν•¨ν•©λ‹ˆλ‹€.
  • Compact: λ„€λΉ„κ²Œμ΄μ…˜ λ°”μ˜ 크기λ₯Ό μΆ•μ†Œν•˜μ—¬ ν‘œμ‹œν•©λ‹ˆλ‹€. Navigation Bar의 높이가 쀄어듀고, μ•„μ΄ν…œκ³Ό 타이틀이 더 μž‘μ€ 곡간에 ν‘œμ‹œλ©λ‹ˆλ‹€.
  • Scroll Edge: λ„€λΉ„κ²Œμ΄μ…˜ λ°”κ°€ 슀크둀 κ°€μž₯μžλ¦¬μ— 뢙도둝 μ§€μ •ν•©λ‹ˆλ‹€. μŠ€ν¬λ‘€ν•  λ•Œ Navigation Barκ°€ ν™”λ©΄ μœ„μͺ½μœΌλ‘œ μ΄λ™ν•˜μ—¬ 사라지지 μ•Šκ³  κ³ μ •λ©λ‹ˆλ‹€.
  • Compact Scroll Edge: Compactλͺ¨λ“œμ—μ„œ Scroll Edgeλͺ¨λ“œλ‘œ 변경될 λ•Œ μ μš©λ˜λŠ” μ†μ„±μž…λ‹ˆλ‹€. Compactλͺ¨λ“œμ—μ„œ Navigation Barκ°€ μΆ•μ†Œλœ 크기둜 ν‘œμ‹œλ˜λ‹€κ°€ μŠ€ν¬λ‘€μ‹œ Scroll Edgeλͺ¨λ“œλ‘œ μ „ν™˜λ˜λ©΄μ„œ Navigation Bar의 크기와 λ ˆμ΄μ•„μ›ƒμ΄ λ³€κ²½λ©λ‹ˆλ‹€.

이 속성듀 쀑 λͺ©μ μ— 맞게 Scroll Edge에 λŒ€ν•œ μ†μ„±λ§Œ μ μš©ν•˜μ—¬μ„œ λ„€λΉ„κ²Œμ΄μ…˜ λ°”μ˜ 색상이 κ³ μ •μ‹œμΌ°μŠ΅λ‹ˆλ‹€.

5️⃣ ScrollView의 autoLayout μ„€μ •

처음 ScrollView에 λŒ€ν•œ μ œμ•½μ„ 섀정해쀄 λ•ŒλŠ” VerticalStackViewλ₯Ό λ°”λ‘œ ScrollView에 λ‹΄μ•„μ€¬μŠ΅λ‹ˆλ‹€. autoLayout은 μž‘ν˜”μ§€λ§Œ κΈ°κΈ°λ₯Ό λ³€κ²½ν•΄μ„œ ν…ŒμŠ€νŠΈν•΄μ€„λ•Œ κ°€λ‘œλ°©ν–₯μœΌλ‘œλ„ 슀크둀이 λ˜λŠ” λ¬Έμ œκ°€ μƒκ²ΌμŠ΅λ‹ˆλ‹€.

WorkingwithScrollViewsμ—μ„œ Add a view to the scroll view. Set the view’s Xcode specific label to Content View.λΌλŠ” λ¬Έμž₯을 λ³΄κ³ λ‚˜μ„œ ScrollView에 컨텐츠듀을 담기전에 ContentViewλ₯Ό λ¨Όμ € 담은 뒀에 κ·Έ ContentView에 컨텐츠듀을 λ„£μ–΄μ€˜μ•Ό λ˜λŠ”κ²ƒμ„ μ•Œκ²Œ λμŠ΅λ‹ˆλ‹€.

κ°€λ‘œλ°©ν–₯으둜만 슀크둀이 되게 ν•  λ•ŒλŠ” ConteneView의 heightλ₯Ό ScrollView의 FrameLaout height와 κ°™κ²Œ ν•΄μ£Όλ©΄ 됐고, μ„Έλ‘œλ°©ν–₯으둜만 슀크둀이 되게 ν• λ•ŒλŠ” ConteneView의 widthλ₯Ό ScrollView의 FrameLaout width와 κ°™κ²Œ ν•΄μ£Όλ©΄ λœλ‹€λŠ” 것도 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

6️⃣ Decoder 파일의 μœ„μΉ˜

JSON파일λͺ…을 μž…λ ₯λ°›μ•„ λ””μ½”λ”©ν•΄μ£ΌλŠ” Decoder객체의 파일의 μœ„μΉ˜λŠ” Model에 μžˆμ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ NSDataAsset 클래슀λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ UIKitλͺ¨λ“ˆμ„ import ν•΄μ€˜μ•Ό ν•΄μ„œ Modelμ•ˆμ˜ 파일이 UIKit을 importν•΄μ€˜λ„ λ˜λŠ”μ§€ 의문점이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€. μ—¬λŸ¬ λ¬Έμ„œλ₯Ό 찾아보고 Model은 Viewλ₯Ό λͺ°λΌμ•Ό ν•œλ‹€λŠ” 것을 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. 그런데 이건 μ–΄λ””κΉŒμ§€λ₯Ό View둜 볼것이냐뢀터 μ •ν•΄μ•Ό ν•œλ‹€λŠ” 기쀀에 μ˜ν•΄μ„œ μ •ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. MVCλ₯Ό λ‚˜λˆŒλ•Œμ˜ λ‚˜λ¦„μ˜ 기쀀을 μ„Έμš°λŠ” 것이 λ§žλ‹€κ³  νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€.

7️⃣ ν™”λ©΄ κ°„ κ°’ 전달 μ‹œ μ˜μ‘΄μ„± μ£Όμž…

//EntryDetailViewController
final class EntryDetailViewController: UIViewController {
    @IBOutlet private weak var entryImageView: UIImageView!
    @IBOutlet private weak var entryDescription: UILabel!

    var expoEntry: ExpoEntry?
		...
}

//EntryViewController
final class EntryViewController: UIViewController {
    ....
}

extension EntryViewController: UITableViewDataSource, UITableViewDelegate {
		func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let expoEntry = self.expoEntries[indexPath.row]
        guard let entryDetailViewController = storyboard?.instantiateViewController(withIdentifier: StoryBoardNameSpace.entryDetailViewController) as? EntryDetailViewController else { return }
        entryDetailViewController.expoEntry = expoEntry
        navigationController?.pushViewController(entryDetailViewController, animated: true)
    }
}

ν•΄λ‹Ήμ½”λ“œμ—μ„œ expoEntryλŠ”μƒμ„±μžλ₯Ό 톡해 μ£Όμž…ν•΄μ£Όλ©΄ μ™ΈλΆ€μ—μ„œ λͺ°λΌλ„ λ˜λŠ” 정보라고 νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ˜΅μ…”λ„μ΄ μ•„λ‹ˆμ–΄λ„ 될 것 κ°™μ•„ instantiateViewController(identifier:creator:)λ₯Ό ν™œμš©ν•΄ λ΄€μŠ΅λ‹ˆλ‹€.

//EntryDetailViewController
final class EntryDetailViewController: UIViewController {
    private var expoEntry: ExpoEntry
    
    @IBOutlet private weak var entryImageView: UIImageView!
    @IBOutlet private weak var entryDescription: UILabel!
    
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .all
    }
    
    init?(expoEntry: ExpoEntry, coder: NSCoder) {
        self.expoEntry = expoEntry
        super.init(coder: coder)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
		....
}

//EntryViewController
final class EntryViewController: UIViewController {
    ....
}

extension EntryViewController: UITableViewDataSource, UITableViewDelegate {
			...    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let expoEntry = self.expoEntries[indexPath.row]

        guard let entryDetailViewController = storyboard?.instantiateViewController(identifier: StoryBoardNameSpace.entryDetailViewController, creator: {
            coder in EntryDetailViewController(expoEntry: expoEntry, coder: coder)}) else { return }
        
        navigationController?.pushViewController(entryDetailViewController, animated: true)
    }
}

πŸ‘₯ ν”„λ‘œμ νŠΈ 회고

μž˜ν•œ λΆ€λΆ„ πŸ‘πŸ»

  • κ·ΈλΌμš΄λ“œ 룰을 잘 μ§€μΌ°μŠ΅λ‹ˆλ‹€.
  • μ„œλ‘œμ— λŒ€ν•œ 배렀와 쑴쀑을 μ§€μΌœμ£Όμ—ˆμŠ΅λ‹ˆλ‹€.
  • μ£Όμž₯κ³Ό 논리에 ν™•μ‹€ν•œ κ·Όκ±°κ°€ 있으면 μ„œλ‘œμ˜ μ˜κ²¬μ„ ν†΅ν•©ν•˜κ³  더 쒋은 λ°©ν–₯으둜 μ΄λŒμ–΄ λ‚˜κ°”μŠ΅λ‹ˆλ‹€.
  • 이해가 가지 μ•ŠλŠ” 뢀뢄은 μ„œλ‘œκ°€ μ„œλ‘œμ—κ²Œ μ§ˆλ¬Έν•˜κ³  λ‹΅ν•˜κΈ°λ₯Ό λ°˜λ³΅ν•˜λ©° κ³΅λΆ€ν–ˆμŠ΅λ‹ˆλ‹€.
  • 기얡보단 기둝에 포컀슀λ₯Ό λ‘μ–΄μ„œ μ΅œλŒ€ν•œ κΈ°λ‘ν•˜λ € λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€.
  • λ„νλ¨ΌνŠΈμ˜ λ‚΄μš©μ„ μ΄ν•΄ν•˜κ³  μ μš©ν•˜λ„λ‘ λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€.

λΆ€μ‘±ν•œ λΆ€λΆ„ 🫣

  • μ˜€ν† λ ˆμ΄μ•„μ›ƒμ— λŒ€ν•œ κ°œλ…μ΄ ν™•μ‹€ν•˜κ²Œ μž‘ν˜€μžˆμ§€ μ•Šμ€ μƒνƒœλ‘œ ν”„λ‘œμ νŠΈμ— λ„μž…ν•˜λ € ν–ˆμ§€λ§Œ, 후에 λ‹€μ‹œ μ œλŒ€λ‘œ κ³΅λΆ€ν•˜κ³  λ„νλ¨ΌνŠΈ κ°€μ΄λ“œλΌμΈμ— 따라 μ˜€ν† λ ˆμ΄μ•„μ›ƒμ„ μ μš©ν•˜λ €κ³  λ…Έλ ₯ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ“š μ°Έκ³  링크

🍎Apple Docs: JSONDecoder

🍎Apple Docs: Using JSON with Custom Types

🍎Apple Docs: Encoding and Decoding Custom Types

🍎Apple Docs: UINavigationController

🍎Apple Docs: UITableViewDelegate

🍎Apple Docs: UITableViewDataSource

🍎Apple Docs: supportedInterfaceOrientations

🍎Apple Docs: UIInterfaceOrientationMask

🍎Apple Docs: WorkingwithScrollViews

🍎Apple Docs: Customize the Navigation Bar Appearance

ios-exposition-universelle's People

Contributors

yarkyungmin avatar yy-ss99 avatar yagom avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.