$ sudo dnf -y install httpd
$ sudo systemctl enable –now httpd.service
$ systemctl status –no-pager httpd.service
OKOK
随机应变 ABCD: Always Be Coding and … : хороший
$ sudo dnf -y install httpd
$ sudo systemctl enable –now httpd.service
$ systemctl status –no-pager httpd.service
OKOK
コンソール上でRHEL8のEC2を起動する
$ ssh ec2-user@* -i ~/.ssh/*.pem
$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.5 (Ootpa)
### リポジトリの追加
$ sudo yum -y localinstall https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
$ sudo yum -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
### postgresqlインストール
$ yum install postgresql postgresql-server
– バージョン確認
$ rpm -qa | grep postgres
postgresql-server-10.19-1.module+el8.6.0+13642+78853f5a.x86_64
postgresql-10.19-1.module+el8.6.0+13642+78853f5a.x86_64
– アカウントが作成されていることを確認
$ cat /etc/passwd | grep postgres
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
### DBセットアップ
$ sudo su – postgres
$ postgresql-setup initdb
### 起動及び自動起動の設定
– プロセス確認
$ ps -ef | grep postgres
$ systemctl status postgresql -l –no-pager
$ sudo systemctl start postgresql
$ systemctl status postgresql -l –no-pager
$ sudo systemctl enable postgresql
### Postgresへログイン
$ su – postgres
$ sudo su – postgres
$ psql
postgres=#
OKKKKKKKKKKKK
postgresqlのバージョンが気になるので要確認
Apacheで基本認証を行うためのユーザ/パスワードの作成/削除等を行うコマンド
BASIC認証のID/Passwordを格納するファイルのことね。OK
php.iniのファイルをApacheで上書きする
使い方例
php_value auto_prepend_file /path/to/my_prepend.php php_value memory_limit 512M
なるほど、面白いですね。
async / awaitの組み合わせで非同期処理を行う
ContentView.swift
func getWho() async -> String {
await Task.sleep(5 * 1000 * 1000 * 1000)
return "山本さん"
}
func getMessage() async -> String {
await Task.sleep(3 * 1000 * 1000 * 1000)
return "ハロー"
}
class StopWatch: ObservableObject {
@Published var elapsedTime: Double = 0.0
private var timer = Timer()
func start() {
guard !timer.isValid else { return }
self.elapsedTime = 0.0
timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) {
_ in
self.elapsedTime += 0.01
}
}
func stop() {
timer.invalidate()
}
}
struct ContentView: View {
@State var message:String = ""
@ObservedObject var watch = StopWatch()
var body: some View {
VStack {
Button(action: {
Task {
watch.start()
message = "_ _ _"
async let who = getWho()
async let msg = getMessage()
message = await who + "," + msg + " ! "
watch.stop()
}
}) {
Label("async TEST", systemImage: "testtube.2")
.background(
Capsule()
.stroke(lineWidth: 1)
.frame(width: 180, height: 40)
)
}.padding(30)
Text("\(message)").font(.title2)
let milliSeconds = Int((watch.elapsedTime) * 100)%100
let seconds = Int(watch.elapsedTime)
Text("\(seconds).\(milliSeconds)").padding()
Spacer()
}
}
}

OK, もう一声
複数の画像をダウンロードできたものから表示
AsyncImage, placeholder, List, LazyVGrid, NavigationView, NavigationLink
ContentView.swift
struct Photo: Identifiable {
var id: URL{url}
var url: URL
}
class PhotoSource {
var photos: [Photo] = []
init() {
photos = makePhotos()
}
}
extension PhotoSource {
func makePhotos() -> [Photo] {
let path = "https://oshige.xsrv.jp/samples/photos/"
let photoNames: [String] = [
"IMG_1159.jpg", "IMG_1326.jpg", "IMG_1384.jpg", "IMG_1475.jpg",
"IMG_1476.jpg", "IMG_1478.jpg", "IMG_1635.jpg", "IMG_1643.jpg",
"IMG_1739.jpg", "IMG_1840.jpg", "IMG_1889.jpg", "IMG_2233.jpg",
"IMG_2325.jpg", "IMG_2406.jpg", "IMG_2408.jpg", "IMG_4008.jpg"
]
var photos: [Photo] = []
for name in photoNames {
photos.append(Photo(url: URL(string: path + name)!))
}
return photos
}
}
struct ContentView: View {
private var myPhotoSource = PhotoSource()
var body: some View {
NavigationView {
List(myPhotoSource.photos) {
photo in
AsyncImage(url: photo.url) {
image in
image.resizable()
.aspectRatio(contentMode: .fit)
} placeholder: {
Color.orange
.overlay(Image(systemName: "photo").scaleEffect(2.0))
}
.mask(RoundedRectangle(cornerRadius: 16))
.frame(height: 160)
}
.navigationTitle("お気に入り")
}
}
}

なるほど、非同期というとJSって感じだが、Swiftでもあるのね。
LocationManager.swift
class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {
let manager = CLLocationManager()
@Published var region = MKCoordinateRegion()
override init() {
super.init()
manager.delegate = self
manager.requestWhenInUseAuthorization()
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.distanceFilter = 2
manager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){
locations.last.map {
let center = CLLocationCoordinate2D(
latitude: $0.coordinate.latitude,
longitude: $0.coordinate.longitude
)
region = MKCoordinateRegion(
center: center,
latitudinalMeters: 1000.0,
longitudinalMeters: 1000.0
)
}
}
}
ContentView.swfit
import SwiftUI
import MapKit
struct ContentView: View {
@ObservedObject var manager = LocationManager()
@State var trackingMode = MapUserTrackingMode.follow
var body: some View {
Map(coordinateRegion: $manager.region,
showsUserLocation: true,
userTrackingMode: $trackingMode)
.edgesIgnoringSafeArea(.bottom)
}
}
まずまず
ContentView.swift
import SwiftUI
import MapKit
struct Spot: Identifiable {
let id = UUID()
let latitude: Double
let longitude: Double
var coordinate: CLLocationCoordinate2D {
CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
}
}
struct ContentView: View {
let spotlist = [
Spot(latitude: 35.6834843, longitude: 139.7644207),
Spot(latitude: 35.6790079, longitude: 139.7675881),
Spot(latitude: 35.6780057, longitude: 139.7631035)
]
@State var region = MKCoordinateRegion(
center: CLLocationCoordinate2D(
latitude: 35.6805702,
longitude: 139.7675359
),
latitudinalMeters: 1000.0,
longitudinalMeters: 1000.0
)
var body: some View {
Map(coordinateRegion: $region,
annotationItems: spotlist,
annotationContent: {spot in MapMarker(coordinate: spot.coordinate, tint: .orange)})
.edgesIgnoringSafeArea(.bottom)
}
}

この辺はGoogleMapAPIと似てるなー
Map()で地図を表示する
import SwiftUI
import MapKit
struct ContentView: View {
@State var region = MKCoordinateRegion(
center: CLLocationCoordinate2D(
latitude: 35.6805702,
longitude: 139.7675359
),
latitudinalMeters: 1000.0,
longitudinalMeters: 1000.0
)
var body: some View {
Map(coordinateRegion: $region)
.edgesIgnoringSafeArea(.bottom)
}
}

地図機能はいつ見ても興奮します。
ContentView.swift
extension Color {
static var hagiiro: Color {
return Color(red: 223/255, green: 87/255, blue: 143/255, opacity: 1.0)
}
}
struct ContentView: View {
var body: some View {
ZStack{
Circle()
.foregroundColor(.hagiiro)
.frame(width: 200, height:200)
Text("萩色")
.foregroundColor(.white)
.font(.title)
}
}
}

そりゃできるよね。