php.iniのファイルをApacheで上書きする
使い方例
php_value auto_prepend_file /path/to/my_prepend.php php_value memory_limit 512M
なるほど、面白いですね。
随机应变 ABCD: Always Be Coding and … : хороший
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)
}
}
}

そりゃできるよね。
クラスはオブジェクトの仕様を定義したもの
L どんな属性と機能を持ち合わせたオブジェクトを作るのかを定義した設計書
L クラス定義に基づいて作ったオブジェクトをインスタンスと言う
classの書き方
class className {
var variable:type = initial
init(引数:type) {
self.variable = 引数
}
function fun(引数:type) -> void {
return x
}
}
playground
import UIKit
var greeting = "Hello, playground"
class MyFriend {
var name:String
var age:Int
init(name:String, age:Int){
self.name = name
self.age = age
}
func hello() -> String {
let message = "Hello! \(name)です。\(age)歳です。"
return message
}
}
let friend1 = MyFriend(name: "植木", age: 31)
let friend2 = MyFriend(name: "桜", age: 26)
let str1 = friend1.name + "と" + friend2.name + "は友達です。"
let str2 = friend1.name + "は" + String(friend1.age) + "歳です。"
friend2.age += 1
let str3 = friend2.name + "は誕生日で" + String(friend2.age) + "歳になりました。"
print(str1)
print(str2)
print(str3)
### 継承
class GoodFriend: MyFriend {
let fortune = ["大吉", "吉", "小吉", "凶"]
func uranai() -> String {
let index = Int.random(in: 0 ..<fortune.count)
let result = "今日の運勢は" + fortune[index] + "です!"
return result
}
func who() -> String {
return name + "です。よろしく!"
}
}
### スーパークラス初期化
var nickname:String
init(name: String, age: Int, nickname: String){
self.nickname = nickname
super.init(name: name, age:age)
}
### extensionを使ってクラス拡張
class Player {
var name: String = ""
func hello() {
print("やあ!" + name)
}
}
extension Player {
var who: String {
get {
return name
}
set(value){
name = value
}
}
func bye(){
print("またね!" + name)
}
}
let user = Player()
user.who = "賢治"
user.hello()
user.bye()
これは数重ねるだけだなー
クラス、メンバー、プロトコル、継承、クラス拡張などを知る
ShareData.swift
class ShareData: ObservableObject {
@Published var isOn = false
@Published var num = 1
}
SettingView.swift
struct SettingView: View {
@EnvironmentObject var setData: ShareData
@Binding var isPresented: Bool
var body: some View {
NavigationView {
VStack {
Toggle(isOn: $setData.isOn){
Text("設定: \(setData.isOn ? "ON": "OFF")")
}.frame(width: 250)
Stepper(value: $setData.num, in: 1...5){
Text("★ :\(setData.num)")
}
.frame(width: 250)
.font(.title2)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(red: 0.9, green: 0.9, blue: 0.5))
.toolbar {
ToolbarItem(placement: .navigationBarTrailing){
Button("閉じる"){
isPresented = false
}
}
}
}
}
}
}
struct SettingView_Previews: PreviewProvider {
static var previews: some View {
SettingView(isPresented: Binding.constant(false))
.environmentObject(ShareData())
}
}
ContentView.swift
struct ContentView: View {
@EnvironmentObject var setData: ShareData
@State var isShow: Bool = false
var body: some View {
VStack{
GroupBox(label: Label("設定", systemImage: "gearshape")){
Text("\(setData.isOn ? "ON" : "OFF")")
if setData.isOn {
Text(String(repeating: "★", count: setData.num))
}
}.frame(width: 300)
Button (action: {
isShow = true
}) {
Label("設定を変える", systemImage: "ellipsis.circle")
}
.padding()
.sheet(isPresented: $isShow){
SettingView(isPresented: $isShow)
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.environmentObject(ShareData())
}
}
@main
struct LinkURLSampleApp: App {
var body: some Scene {
WindowGroup {
ContentView().environmentObject(ShareData())
}
}
}

なんかよくわからんくなってきた。
かなり修行が必要やな
@StateObjectを利用することで親ビューの再描画でオブジェクトが初期化されなくなる
ContentView.swift
struct ContentView: View {
@State var isShow = true
var body: some View {
VStack (alignment: .leading, spacing: 20){
ValueView1()
ValueView2()
Toggle(isOn: $isShow){
}.frame(width: 50).padding(.top, 30)
if isShow {
Text("Hello, World!").font(.largeTitle)
}
Spacer()
}
.padding()
}
}
struct ValueView2: View {
@StateObject var maker = ValueMaker()
var body: some View {
VStack (alignment: .leading, spacing: 10){
Text("\(maker.value)")
.font(.title)
.foregroundColor((maker.value > 0.8) ? .white : .gray)
.background((maker.value > 0.8) ? Color.red : Color.white)
HStack {
Text("カウンタ:")
Text("\(maker.counter)").font(.largeTitle)
}
}
.background(Color.blue.opacity(0.3))
.frame(width: 200, height: 80)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
ValueView1()
ValueView2()
}
}
ValueMarker.swift
class ValueMaker: ObservableObject {
@Published var value: Double
@Published var counter: Int = 0
private var timer: Timer
init() {
value = 0.0
timer = Timer()
start()
}
func start(){
timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) {
_ in
self.value = Double.random(in: 0 ... 1)
if self.value > 0.8 {
self.counter += 1
}
}
}
}
struct ValueView1: View {
@ObservedObject var maker = ValueMaker()
var body: some View {
VStack (alignment: .leading, spacing: 10){
Text("\(maker.value)")
.font(.title)
.foregroundColor((maker.value > 0.8) ? .white : .gray)
.background((maker.value > 0.8) ? Color.red : Color.white)
HStack {
Text("カウンタ:")
Text("\(maker.counter)").font(.largeTitle)
}
}
.background(Color.yellow.opacity(0.3))
.frame(width: 200, height: 80)
}
}
なんかうまくいかんなー