ToCode
Kanalga Telegramโda oโtish
ืืืคืื ืงืฆืจืื ืืืชืื ืชืื ืืืช ืื ืื ืคืจืง
Ko'proq ko'rsatish1 420
Obunachilar
Ma'lumot yo'q24 soatlar
+27 kunlar
-230 kunlar
Postlar arxiv
1 420
# ืฉืืืฉ ืกืืืืช ืืืืืจ ื Tauri ืืื ืืืช ืืคืืืงืฆืืืช ื Desktop ืืืื ืฉืืื
ืืืืจื ืืื ืืื ืฉืืืคืฉืจ ืืืชืื ืืคืืืงืฆืืืช Desktop ืืืื ืืืืืืืช ืืื. ืืื ืืืฉืคื ืืื ืืืืืจ ืืื ืืื ืืืจ ืฉืืชืืจื ืขื "ืขืคืจืื", ืื ื ืฉืืืฉ ืกืืืืช ืฉืืืืื ืื ื ืืชืื ื ืืืืืจ ืืืืืจื ืืคืจืืืงื ื Desktop ืืื ืฉืื:
1. ืืืื ืืงืืืฅ - ืืืฉืื ืืืงืืจืื ืคืฉืื ืืชืืื ื 50 ืืื ืืืืื ืืืืืข ืืงืืืช ืืืื ืืืืช. ืืืืจื ืื ืืืื ืืช ืืจืืืืื ืืืฉืชืืฉ ื Web View ืฉืืืจ ืงืืื ืืืขืจืืช ืืืคืขืื, ืืื ืืืฉืืืื ืคืฉืืืื ืืืงืืื ืืกื ืืื 3-4 ืืื.
2. ืจืืกื - ืืืืจื ืืฉืชืืฉ ื Rust ืืฉืืื ืืชืงืฉืจ ืขื ืืขืจืืช ืืืคืขืื ืืื ืื ืขื ืชืืืื Rust ืฉืืคืขืื ืืช ื Web View ืฉื ืืขืจืืช ืืืคืขืื ืืฉื ืคืืชื ืืช ืงืืฆื ื HTML/CSS/JS ืฉืืื.
3. ืืืืืช ืืืืข - ืืืขืืืช XSS ืืืคืืืงืฆืืืช ืืืงืืจืื ืืื ืืฉืืืืช ืืจืกื ืืืช, ืืืืื ืฉืงืื ื JavaScript ืงืืื ืืืฉื ืืืื ืืืืฉื (ืืจื APIs ืฉื ืืืงืืจืื). ืืืืจื ืืืงื ืืืฉื ืืืชืจ ืืืืืืืช ืื ืืชื ืืงืื ื JavaScript ืืืฉื ืจืง ื APIs ืฉืืืจื ื ืืฆืืจื ืืคืืจืฉืช.
ืจืืฆืื ืืจืืืช ืืื ืืืคืืืงืฆืื ืฉืืื ืชืขืืื ืืชืืจ Desktop App? ืืืืจืื ืืื ืืกืืืจ ืืื ืืืืกืืฃ ืืช ืืืืจื ืืื Web Application ืืื ืืืคืื ืืืชื ืืืคืืืงืฆืืืช Desktop, ืืืืขืชื ืืื ืืงืื ืืื ืืืชืืื ืืฉืืง ืขื ืืืื:
https://tauri.app/v1/guides/getting-started/setup/integrate
1 420
# ืฉืชื ืืืืืืฆืืืช
ืืฉ ืืืืืืฆืื ืฉื ืืฆืจืช ืืคืื- ืืืืืื ืืจืื ืื ืฉืื ืืืจื ืจืืืื ืขืืืื ืืืฆืืื ืขื ืืจืืฉื ืฉื "ืื ื ืื ืืืืข ืืืื", ืืื ืืื ืืงืืืื ืืจืืงืช ืืจืฅ ืืืืื ืืื ืฉืืืชืจ ืืื ืืืื ืืืื ืื ืืจืืืื ืืื.
ืืืขืื ืฉืืจืืงืช ืืืจืฅ ืืืืช ืื ืืืืืงื ืืขืื ืืจืื ืืื. ืืืืืืฆืื ืฉื ืืืขืช ืืคืื ื ืืืจืช ืืฉืืคืื ื ืืืจ, ืืคืื ืืื ืจืืฉ ืืื ื.
(ืืฉืืคืื ืืืคื ืืืจืื ื ืืื ืืืจ ื ืงืจื ืืจืื, ืืืจืื ืื ืื ืืขื ืืฃ ืืื ืืคืขืืื).
ืืกืื ืืฉื ื ืฉื ืืืืืืฆืื ื ืืฆืจ ืืืฉืจืื (Inspiration)- ืื ืฉืื ืืืื ื ืขืืฉืื ืืืจืื ืืฆืืจื ืืืืช. ืืืืืจื ืฉื ืืชืื ืชืื ืจืืื ืืืืื ืืื ืืืืืื ืืืฉื ืื "ืื ืืขื ืืื" ืื "ืื ืืื ืฉืืฉืื ืืืืืจ" ืืื ืกืื ืืื ืฉื ืืืืืืฆืื. ืืฃ ืืื ืื ืืคืืจ ืืืชื ืื ืื ืชืืื Web Assembly, ืืื ืืจืื ืืชืื ืชื ืืื ืืืจ ืจืืืื ืืช ืืคืืื ืฆืืื ืืืชืืืืื ืืืืื ืืช ืืืื ืืืืืื.
ืฉื ื ืืกืืืื ืืฉืืืื ืืื ืจืง ืืช ืืกืื ืืฉื ื ืื ืื ื ืฆืจืืืื ืืืคืฉ ืืืืคื ืืงืืืื. ืืฉืืชื ืจืืฆืื ืืืชืงืื, ืฉืืื ืืืชืืืฅ ืืืืฆืื ืืฉืจืื ืืื ืืืชืจ.
1 420
import textReducer from './slices/text';
import saveForLaterReducer from './slices/save_for_later';
import { actions } from './slices/save_for_later';
import { actions as textActions } from './slices/text';
export const store = configureStore({
reducer: {
text: textReducer,
saveForLater: saveForLaterReducer,
},
})
setTimeout(() => {
store.dispatch(actions.enqueue(textActions.change("New text from server")));
}, 5000);
// Infer the `RootState` and `AppDispatch` types from the store itself
export type RootState = ReturnType<typeof store.getState>
// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}
export type AppDispatch = typeof store.dispatch
ืืฉืืื ืืืืืื ืืืงืื ืืืฆืืจ Web Socket ืืกื ืืื ืืคืขืืชื Timer, ืืื ืืชืืื ืืช ืืืืชืืช ื setTimeout ืืืืืฃ ื Web Socket.
ืืืืง ืืืืจืื ืืคืืื ืืื ืืงืืืฅ App.tsx ืฉืืฆืื ืืช ืืืืฉืง. ืืืืฉืง ืฉืื ืืฉ ืืกื ืืื ืชืืืช ืืงืกื ืฉืืฉืชืืฉ ืืืื ืืฉื ืืช ืื ืืช ืืืงืกื:
import './App.css'
import { useSelector, useDispatch } from 'react-redux'
import { RootState, AppDispatch } from './redux/store';
import { actions } from './redux/slices/text';
import { runPending } from './redux/slices/run_pending_thunk';
const useApplicationDispatch: () => AppDispatch = useDispatch;
function App() {
const dispatch = useApplicationDispatch();
const text = useSelector((state: RootState) => state.text.value);
const hasPendingActions = useSelector((state: RootState) => state.saveForLater.pending.length > 0);
const sync = () => {
dispatch(runPending());
}
return (
<div className="App">
{hasPendingActions && (
<p>
New text from server available.
<button onClick={sync}>Click To Sync</button>
</p>)}
<input type="text" value={text} onChange={(e) => dispatch(actions.change(e.target.value))} />
</div>
)
}
export default App
ืืฉืืฉ Actions ืืชืืจ ืืืคืืข ืืฉืคื ืฉืืืืจ ืฉืืฉ ืืืืข ืืืฉ ืืืฉืจืช ืืืคืชืืจ ืกืื ืืจืื. ืืืืฆื ืขื ืืืคืชืืจ ืชืคืขืื ืืช ื thunk ืฉืืขืฉื dispatch ืืื ื actions ืืชืืจ ืืืืืง ืืืชื.
ื .ื. ืืจืื ืคืขืืื ืื ื ืจืฆื ืืฉืืืจ ืืช ืื ื Actions ืืืฉืจืช ืืื ืจืง ืืช ื Action ืืืืจืื ืฉืืืืข ืืกืื ืืกืืื, ืื Action ืืืฉ ืืืชืจ ืืืคื ืืช ืืื ืฉืืคื ืื ืืื ืจืืืื ืืืื. ืืืืืงื ืืืืช ืชืืืชื ืืชืื ื saveForLater Reducer ืืคืื ืงืฆืื enqueue:
enqueue(state, action: PayloadAction<Action>) {
state.pending.push(action.payload);
}
ืคืื ืงืฆืื ืื ืชืืื ืืืืืง ืื ื Action ืฉืืืืข ืืืืชืจ Action-ืื ืืฉื ืื ืืืชืจ ืืืขืืื ืืช ืืืขืจื.1 420
# ืขืืืืื ืืคืืืงืฆืืืช ืจืืืงื ืืืจื ืงืืืช ืืืจืืข ืืืฉืจืช
ืืขืจืืืช ืืื ืืกืืจืชืืืช ืืื ืฆืจืืืืช ืืืชืืืื ืจืง ืขื ืืืจืืขืื ืฉืืืืขืื ืืืืฉืชืืฉ ืฉืขืืฉืื ืืืืฉ ืืืชืจ. ืืขืืื ืืืืืจื ื ืืืืกืืื ืจื ืฉืื ื, ืืขืจืืืช ืืื ืืืจ ืฆืจืืืืช ืืืชืืืื ืื ืขื ืคืขืืืืช ืืฉืชืืฉ ืืื ืขื ืืืจืืขืื ืฉืืืืขืื ืืจืืืง, ืืจืื ืคืขืืื ืืืฉืจืช, ืืืกื ืืจื ืืื ืืฉื ืืื. ืืืื ื ืจืื ืืื ืื ืงืฉื ืืืจื ืืืช ืืืชืืืื ืขื ืืืชืืจ ืืืคืืืงืฆืืืช ืจืืืงื.
## ืืื ืื ืงืฉื
ืืขืืจ ืืจืื ืืืื ืืช ืฉื ืืืฉืืืจ Web Socket ืคืชืื ืฉืืงืื ืืืืขืืช ืืืฉืจืช, ืืชืืจ ืืืชืจ ืืืื ืืื ืืืชืืจ ืืืืฉืงื: ืืจืืข ืฉืืฉ ืฉื ื ืืงืืจืืช ืฉื ืืืจืืขืื, ืืฉืชืืฉ ืืืื ืืืชืืืื ืื ืืืจืื ืืฉืชื ืื ืขื ืืืกื ืืฆืืจื ืืืืืืืืช.
ืืืื ืืืจื ืืืฉื ืคืืชืจืื ืืช ืืืขืื ืืืืฆืขืืช ืืฆืืช ืกืื ื ืขืืืจ ืืื ืืืฉืชืืฉืื ืฉืขืืฉืื ืขืืืืื ืขื ืืืชื ืืืกืื. ืืฉืื ื ืืขืืื ืืช ืืืกืื ืืืื ืืฉืชื ื ืื ืืื ืืขืื ืืื, ืื ื ืืืื ืฉืื ื ืขืืื ืขื ืขืื ืืืฉืื ืืืฉืื ืื ืืืืข ืืืื ืืื ืืฉื ื.
ืื'ืืืืื ืืืชื ืืืืช ืฉืื ื - ืื ืื ื ืืืชื ืชืืืื ืืืืื ืืืืืฆืข ืืืชืืื ืืืืขื ืชืืืื ืืืฉื ืืืืฉืื ืืืจ ืืืืชื ืืืื, ื'ืืืืื ืืกืื ืื ืฉืืฉ ืชืืืื ืืืฉื ืืืืงืฉ ืืื ื ืืืืืฅ ืขื ืืคืชืืจ ืืื ืืืขืื ืืืชื. ืื ืืืื ืื ืฉืฉืื ืื ืืืกื ืืฉืื ื ืื ืืฆืคื ืืฉืื ืื ืขืืื ืืืืืช ืืืืื ืืืื ืืืจื ืืืืฉ ืืช ืืฉืื ืื ืจืง ืืืจื ืคืขืืื ืืืืื.
## ืืื ืขืืฉืื ืืช ืื ืืจืืืงื
ืืืคืืืงืฆืืืช React ื Redux, ืืืืืฉ ืื ืื ืื ืืืื ืืื ืืืื ืคืฉืื. ืื ืื ืฉื ืขืฉื ืืืืื:
1. ื ืืฆืืจ Web Socket ืฉืืงืฉืื ืืืืืขืืช ืืืฉืจืช.
2. ืื ืคืขื ืฉื ืงืื ืืืืขื ื ืงืจื ื dispatch, ืืื ืืืงืื ืืฉืืื ืืช ื Action ืฉืืื ืืฉื ื ืืช ืืืกื, ื ืฉืื Action ืืืจ ืฉืขืืืฃ ืืืชื ืืฉืืืจ ืืืชื ืืชืืจ ืืืืขืืช.
3. ืืืคืืืงืฆืื ืืืืื ืืืกืชืื ืื ืืฉ Actions ืืชืืจ, ืืื ืื ืืืฆืื ืืืฉืชืืฉ ืืืืขื ืฉืืืืจืช ืฉืืฉ ืืืืข ืืืฉ ืืืฉืจืช ืืฆืจืื ืืืืืฅ ืืื ืืจืขื ื. ืืืืืฆื ืขื ืืืคืชืืจ ืื ืื ื ืคืืชืืื ืืช ืืขืืืคื ืืืคืขืืืื dispatch ืขื ืื ื Actions ืฉืฉืืืจืื ืืชืืจ.
## ืงืื ืืืืืื
ืื ื ืืืฆืจ ืืคืืืงืฆืืืช React/Redux ืืืฉื ืืืชืืื ืืืฆืจ ืฉื ื ืกืืืืกืื. ืืกืืืืก ืืจืืฉืื ืืืืืง ืืช ืืืืืข ืฉื ืืืคืืืงืฆืื, ืื ื ืงืืจื ืื text ืืื ืืงืื ืฉืื:
// file: src/redux/slices/text
import { createSlice } from '@reduxjs/toolkit'
import type { PayloadAction } from '@reduxjs/toolkit'
export interface TextState {
value: string
}
const initialState: TextState = {
value: "Hello World",
}
export const slice = createSlice({
name: 'text',
initialState,
reducers: {
change(state, action: PayloadAction<string>) {
state.value = action.payload;
}
},
})
// Action creators are generated for each case reducer function
export const actions = slice.actions
export default slice.reducer
ืืกืืืืก ืืฉื ื ืืืจืื ืขื ืฉืืืจืช Actions ืฉืืืืขืื ืืืฉืจืช ืืฆื ืืื ืฉืืคืฉืจ ืืืื "ืืืจืืฅ" ืืืชื ืืืืืจ ืืืชืจ. ืื ื ืืงืจื ืื save_for_later ืืื ืืงืื ืืงืืืฅ:
// file: src/redux/slices/save_for_later.ts
import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import type { Action } from '@reduxjs/toolkit'
import { clearPending } from './run_pending_thunk';
export interface SaveForLaterState {
pending: Array<Action>;
}
const initialState: SaveForLaterState = {
pending: [],
}
export const slice = createSlice({
name: 'saveForLater',
initialState,
reducers: {
enqueue(state, action: PayloadAction<Action>) {
state.pending.push(action.payload);
}
},
extraReducers: (build) => {
build.addCase(clearPending, () => {
return initialState;
})
}
})
// Action creators are generated for each case reducer function
export const actions = slice.actions
export default slice.reducer
ืื ืืกืฃ ืื ื ืืืฆืจ ืงืืืฅ ืขื Thunk ืฉืืืื ืืืจืื ืขื ืคืชืืืช ืื ื Actions ืืชืื ืืชืืจ ืืฉืืืฉืชืืฉ ืืืืฅ ืขื ืืคืชืืจ ืืกืื ืืจืื:
// file: src/redux/slices/run_pending_thunk.ts
import { createAction, createAsyncThunk } from "@reduxjs/toolkit";
import { RootState } from "../store";
export const clearPending = createAction('saveForLater/clearPending');
export const runPending = createAsyncThunk<void, void, {state: RootState }>('saveForLater', async (arg: void, { getState, dispatch }) => {
const pending = getState().saveForLater.pending;
pending.forEach(dispatch);
dispatch(clearPending());
});
ืืงืืืฅ store.ts ื ืจืื ืื:
// file: src/redux/store.ts
import { configureStore } from '@reduxjs/toolkit'1 420
# ืืืฉ ื Ruby: ืืืืืงื ืืืืข
ืจืืื 3.2 ืืฆืื ืื ืืืื ืืืืื ืืืืจืื ืขื ืืชืืืื ื Web Assembly ืฉืืื ืืืกืืคื - ืืื ืืืืช ืคืืฆ'ืจ ืืืืืง ืฉืคืืชื ืืจืื ืืคืฉืจืืืืช, ืืื ืื ืืืื ืืื ืืื ืืืื ืืขืืืจ ืื ืืืชืืืช ืงืื ืืืื ืืื.
ืคืืฆ'ืจ ืืืจ ืฉืืื ืืงืฆืช ืคืืืช ืืืชืจืืช ื ืจืื ืื ืืจืื ืืืชืจ ืฉืืืืฉื ืืขืืื ืืคืืกื ืืืื ืืืื ื ืงืจื ืคืฉืื Data. ืื ืืืื ืืืื ื Data Class ืฉื ืคืืืชืื.
ืืื ืื ืขืืื? ืื Data ืืกืคืง ืืจื ืืืืืืจ ืืืืืงื ืืืืข ืฉืื ื ืืชื ืืฉืื ืื, ืืคืฉืจ ืืืฉืืืช ืืื ืืืืืงืื ืืืืข ืืืื ืืืื ืฉืืืจ ืขื ืืืืฆืื ืฉืื ืืื ืืงืื. ืื ืงืฆืช ืืืื ื Struct ืืื ืขื ืคืืืช ืืคืฉืจืืืืช ืืืืฉืง ืงื ืืืชืจ.
ืืืืืื ืื ืื ื ืจืืฆื ืืืืฆื ืืืขืจืืช ืืฉืชืืฉ ืฉืืฉ ืื ืืืื ืืกืคืจื ืืืชืืืช ืืืืืื ืืื ืืืขืืืจ ืืื ืืื ืืงืืืืช ืืืขืจืืช ืื ื ืืืื ืืจืืื 3.2 ืืืชืื ืืฉืื ืืื:
User = Data.define(:name, :email)
u1 = User.new(name: 'dave', email: 'dave@e.com')
u2 = User.new(name: 'john', email: 'john@e.com')
puts u1.email
puts "u1 == u2 ? #{u1 == u2}"
ืขื ืืคื ืืื ืงื ืืืืื ื Struct, ืืื ืืฉ ืฉื ื ืืืืืื ืืจืืืืื:
1. ืืืืืงืื Data ืื ืืืืืจืื ืืช to_a ืืื ืื ืืคืฉืจ ืืืืืจ Data Object ืืืขืจื ืฉื ืื ืืขืจืืื ืฉืื (ืืืืื ืฉืืื ืืขืื ืืืคืขืื to_h ืืื ืืงืื Hash)
2. ืืืืืงืื Data ืื ื ืืชื ืื ืืฉืื ืื, ืืื ืฉืืืจืื ืขืืื ื ืฉืื ื ืขืฉื ืืขืืืืช ืืืืจืืช - ืืืฉื ื ืงืื ืืืืืงื Data ืืืืื ืคืื ืงืฆืื, ื ืฉื ื ืืืชื ืืื ื ืืจืื ืื ืืง ืืืงืื ืืืจ ืืงืื.
ืกื ืืื ืฉืื ืื ืงืื ืฉืืืื ืืืคืื ืงืื ืจืืื ืืงืฆืช ืืืชืจ ื ืขืื.1 420
# ื ืืฉืืชื ืืืืื ืคืืฉืื ื (ืื: ืืื ืืื ืงืื ืืืืื ืื ืื ืื ืืกืืื)
ืืืืงืจืืกืืคื ืืืืืื ืืขืฉืืช ืื ืืืื ืคืืฉืื ื ืืฉืืื ืื ืืืื ืฉืืกืคืจ ืื ืฉืืืจ ืฉืืชืฃ ืืืชื ืืขืจืืช ืขื ืคืจืืืงื. ืืืจืชื ืืช ืฉื ืืืืจ ืืื ืืื ื ืจืื ืื ืืืืจ ืฉืืื ืืฉืชืฃ ืืขืจืืช ืขื ืคืจืืืงื ืื ืื ืื ื ืื ืขืืืืื ืขื ืืฃ ืคืจืืืงื ืืื ืขืืฉืื, ืืื ืืืฆืชื ืขื ืืงืืฉืืจ ืืื ืืจืืืช ืขื ืื ืืืืืจ ืืืืขืชื ืืืฃ ืฉืืกืืืจ ืฉืื ืืื ืจืง ืชืจืืื ืคืืฉืื ื ืืืขืฆื ืืฃ ืืื ืื ืฉืืชืฃ ืืืชื ืืืื.
ืืงื ืืื ืจืืขืื ืืืชืืืฉืฉ ืืืืืืื, ืืืจืืื ื ืืกืืชื ืืฉืืืจ ืืื ืื ืงืจื ืืืื ืืื ืงืื ืืืืื ืื ืื ืื ืืกืืื. ื ืชืืื ืืืืช ืืคืฉืืื - ืืื ืงืื ืืืืื ืืืืช ืืืืืื ืืืืืช ืืกืืื ืื. ืืื ืืืืจืื ืืจืขืื ืืืจืืืืื ืฉืืืืืื ืืงืจืืช ืืฉืื ืื ื ืืืืฆืื ืขื ืืื ืง ืืื ืืืขืช ืืื ืืื ืืืืื:
1. ืืฉ ืื ืฉืื ืฉืคืฉืื ืจืืฆืื ืืืขืช ืฉืืืฉืื ืงืืจื ืืช ืืืืืืื ืฉืืื, ืืื ืฉืืืืื ืืฉืืื ืขืื ืืขืื ืืืืืื. ืืืืฆื ืขื ืืื ืง ืืืฉืจืช ืืืืชื ืื ืฉืื ืฉืืชืืืช ืืืืื ืฉืืื ืืืืชืืช ืืืชื ืื ืฉืื ืืืืชืืื ืฉืงืืจืืื ืืืืจ ืืืชืืืช ืืืืช.
2. ืืฉ ืืชืจืื ืขื ืืืืื, ืืืืืื ืืืืื ืืื XSS ื CSRF. ืืื ืืืืื ื ืืื ืืืื ืืืจืื ืืื ืืขืฉืืช ืืื ืืืื ื ืคืขืืื ืืืชืจ ืฉืืชื ืืืจ ืืืืืจืื ืืืื ืืืื ืืืจ. ืืืืืื ื ืืืืื ืฉืื ื ืืืืืจ ืืคืืืคืื ืฉืื ืืืื ืืืจ, ืืืคืืืคืื ืืฉ ืืคืชืืจ ืฉืฉืืื ืืกืฃ ืืืืจ, ืื ืืืื ืืื ืืืชืจ ืชืืงืฃ ืืืื ืืฉืืื ืืืื ืืื ืง ืืืฃ ืืืืื ืืคืืืคืื ืฉืืฉืื ื ืืื ืก ืืืื ืืชืจ ืคืืืคืื ืืืฉืื ืฉืืืฆืชื ืขื ืืคืชืืจ ืืฉืืืืช ืืกืฃ ืืืืชื ืชืืงืฃ.
3. ืืฉ ืืืืื ืืืคืืคื ืื. ืืจืืจ ืฉืื ืืืจืช ืืืื ืื ืืืืงืจืืกืืคื ืืฉืืขื ืขื ืืื ืืืคืืคื ืฉืืื ืื ืืคืืฆื ืืื ืชืืงืื, ืืื ืืจืื ืคืขืืื ืืชื ืื ืืฉืืจืืื ืืืจืกื ืืืคืืคื ืืื ืืฉืืื ืืืงืฉ ืืฉืืจื, ืืขืื ืืืชืจ ืืจืื ืคืขืืื ืื ืฉืื ืฉืืืจืื ืืกืื ืืช ืืืืืื ืืื ืืกืคืจืื ืขืืืื ืืืฆืจื ืืืช ืืืคืืคื ืื. ืืื ืืืคืืคื ืืืื ืืืจืื ืืืคืืคื ืฉืืื ืืืจืืฅ ืชืืื ืืช ืืืื ืืช ืจืง ืืืื ืฉืืืฆืชื ืขื ืืื ืง.
ืืืชืืฉื ืืื ืืกืื ืืช ืืืื ืืคืฉืจ ืืื ืืืืืื ืฉื ืืื ืืืชืจ ืืืืจืื ืืืืืฆืืช ืขื ืืื ืงืื, ืืื ืืฉ ืืขืื - ืืืืฆื ืขื ืืื ืงืื ืขืืืื ืืืืื ืืืง ืืจืืื ืืขืืืื ืืืื ืืืืืช ืฉืื ื ืืืืื ืืจืงืฆืื ืขื ืืืืฉื. ืืื ืืืืืืืช ืืชืืืช ืืืืื ืฉืื:
1. ืืืื ื ืืฉืืืืช ืขืืืื ืืืื ืื ืืืืืก ืืืืขืืช ืืืืื, ืื ืื ืกืื ืืืืื ืืืืฆืขืืช ืืืืฆื ืขื ืืืื ืง.
2. ืขืืืื ืื ืขื PR ืืืืืืื ืืืืขืื ืืืืื ืขื ืืื ืง ื PR.
3. ื ืืืืืืจืื ืฉื ืฉืืืื ืืืืื ืืืืขืื ืืืืื ืืืื ืงืื, ืืื ืื ื ืจืืืืื ืืืืืฅ ืขื ืืื ืงืื ืืืืืจืื ืฉืืขื ืืื ืื ืืืชื ื.
4. ืืืจื ืงื ืื ืืืืืื ืชืงืืื ืืืื ืขื ืคืจืื ืืืื ื ืืืคืฉืจืืช ืืืืืฅ ืขื ืืื ืง ืืื ืืืืื ืก ืืืฃ ืืืืื ื ืฉืืจืืข ืืืฆืขืชื.
5. ืืืจืืช ืจืืืช ืืฉืืื ืืฉืืื ืืช ืืชืืจ ืงืืืฅ ืืฆืืจืฃ, ืืื ืืืจืืช ืจืืืช ืืืจืืช ืืฉืืื ืืืชื ืืชืืจ ืืื ืง ืืงืืืฅ PDF ืืจืฉืช.
ื ืกื ืืื ืืื ืืจืฉืื ืืช ืื ืืืื ืงืื ืฉืืชื ืืืืฆืื ืขืืืื ืืืืืื ืืชืืื ืฉืื ืื ืืฉืื ืฉืืคืฉืจ ืืขืฆืืจ. ืื ืืกืฃ ืื ืื ื ืืืืขืื ืฉืืชืืืช ืืืื ืฉืืื ืืื ืื ืืจื ืืืื ื ืืืืช ืืช ืืงืืจ ืืืืื, ืืืืืืื ืืืื ืืื ืืืืืื ืืืืืข ืื ืืชืืืืช ืืืืจ ืฉื ืื ืฉืื ืฉืื ืื ื ืกืืืืื ืขืืืื. ืื ืืกืฃ ืืคืืื ืื ืืืืื ืืชืื ืืคืืจืืฉ ืืืื ืง, ืืืืืฆื ืขืืื ืืืืื ืืืืืื ืืืงืื ืืืจ ืืื ืฉืืชืื (ืื ืืืงืกื ืฉื ืืืื ืง ืืืื ืืืืืช ืฉืื ื ืืืชืืืช ืืืขื) ืืื ื ืจืื ืืช ืื ืขื ืฉื ืืืฅ.
ืืคืืื ืื ื ื ืกื ืืืขืชืืง ืืช ืืืื ืง ืืฆืืื ืืืกืจืืง ืืืชื ืืขืื ืืคื ื ืฉื ืืื ืก ืืืชืจ ืื ืื ืืกืคืืง ืืื, ืื ืืื ืง ืืืชืจ ืืืื ื ืืืื ืืืืจืืืช ืืืืืง ืืื ืืื ืง ืืืชืจ ืจืืื, ืื ืฉืืืื ืง ืืืื ืฉืืืืช ืืชืื ืงืื ื ืฉืืงืจืืื ืจืืืื ืื ื ืฉืื ืื ืืืื. ืืืืืื ืืื ืงืื ืืืืืืื ืืจืื ืคืขืืื ืฉืืืืื ืืชืื ืืจื "ืืื ืง ืืชืืื" ืฉื ืืืจืช ืืืืืืจ ืืื ืฉืืืืื ืืืขืช ืื ืืืฅ ืขื ืืืื ืืื ืง.
ืคืืชืจืื? ืื ื ืื ืจืืื ืืืืคืง. ืืจืื ืืคืจืงืืืช ืืขืฆืืช ืื ืคืืฆืืช ืขืืืื ื ืืื ืืช - ืื ืืืืืฅ ืขื ืืื ืงืื ืืืจืื, ืื ืืคืชืื ืืืื ืืื ืฉืื ืฉืื ืืืืจืื ืืื', ืืื ืืจืืช ืืืืืื ืื ืจืืืง ื 100%. ืืฉ ืื ืื ืืขื ืชืืื ืืช ืฉืชืคืงืืื ืืืืืช ืคืืฉืื ื ืื ืืื ืงืื ืืฉืืืื, ืืื ืงืฉื ืืจืืืช ืืช ืจืืื ื ืขืืืจืื ืืืชืงืื ืืืฉืื ืขื ืคืืชืจืื ืืช ืืืื. ืคืืชืจืื ืืจืืช ืกืคืง ืืืืื ืืืื ืืขืืืจ ืืื ืื ืื ืื ืืืฉืื ืื ืืื ืงืื ืืืืขืื ืื ืืจื ืืืืืกืืค ืื ืืืืจื.
1 420
[?dir :entry/name ?name]
[?dir :entry/type :entry-dir]
(inside ?child ?dir)
[?child :entry/size ?size]] (d/db conn) rules)1 420
2. ืืฉ ืืืก ืืืขืจืืช ืฉื ืงืจื
inside. ืืฉืืฉืื inside ืืฉืื ืืืจ ืื ืืืืจ ืฉืืื belongs-to ืืืืจ ืืืืจ, ืื ืฉื parent ืฉืื ืืื inside ืืืืจ ืืืืจ.
ืืื ืืืืืจื ืจืงืืจืกืืืืช ืืืื ืืกืืจ.
ืขืืฉืื ืืฉืืืืชื ืืฉืชืืฉืช ืืืืืจื ืืื ืืืฆืื ืืช ืื ืืชืืงืืืช ืืืืืืื ืฉืืื:
(d/q '[:find ?name (sum ?size)
:in $ %
:where
[?dir :entry/name ?name]
[?dir :entry/type :entry-dir]
(inside ?child ?dir)
[?child :entry/size ?size]] (d/db conn) rules)
;; returns [["" 48381165] ["a" 94853] ["d" 24933642] ["e" 584]]
ืืืืื ืืคืฉืจ ืืงืืช ืืช ืืจืฉืืื ืืืืฉืชืืฉ ืืงืื ืืื ืืขื ืืช ืขื ืืฉืืืืช.
ืงืื ืืชืืื ืืช ืืืื ืืงืืื'ืจ ืืื:
(ns main
(:require [datomic.api :as d]))
(def db-uri "datomic:mem://fs99")
(d/create-database db-uri)
(def conn (d/connect db-uri))
(def schema
[
{:db/ident :entry/type
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one}
{:db/ident :entry/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}
{:db/ident :entry/link-to
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one}
{:db/ident :entry-link}
{:db/ident :entry-file}
{:db/ident :entry-dir}
{:db/ident :entry/parent
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one}
{:db/ident :entry/size
:db/valueType :db.type/long
:db/cardinality :db.cardinality/one}
{:db/ident :fs/id
:db/cardinality :db.cardinality/one
:db/unique :db.unique/identity
:db/valueType :db.type/string}
{:db/ident :fs/cwd
:db/cardinality :db.cardinality/one
:db/valueType :db.type/ref}
])
@(d/transact conn schema)
(defn cwd []
(let [db (d/db conn)]
(d/q '[:find ?cwd .
:where
[?fs :fs/id "/"]
[?fs :fs/cwd ?cwd]] db)))
(defn file [name size]
@(d/transact conn [
{:entry/type :entry-file
:entry/name name
:entry/size size
:entry/parent (cwd)}
]))
(defn dir [name]
@(d/transact conn [
{:entry/type :entry-link
:entry/parent "d"
:entry/name ".."
:entry/link-to (cwd)}
{:entry/type :entry-link
:entry/parent "d"
:entry/name "."
:entry/link-to "d"}
{:db/id "d"
:entry/type :entry-dir
:entry/name name
:entry/parent (cwd)}
]))
(defn cd [name]
(let [db (d/db conn)
to (d/q '[:find ?e .
:in $ ?cwd ?name
:where
[?e :entry/name ?name]
[?e :entry/parent ?cwd]]
db
(cwd) name)
toe (d/entity db to)
tod (if (= (:entry/type toe) :entry-link)
(:db/id (first (filter #(= (:entry/type %1) :entry-dir) (iterate :entry/link-to toe))))
to)]
@(d/transact conn [{:fs/id "/"
:fs/cwd tod}])))
(def data [
{:db/id "root" :entry/name "" :entry/type :entry-dir}
{:fs/id "/" :fs/cwd "root"}
])
@(d/transact conn data)
(dir "a")
(file "b.txt" 14848514)
(file "c.dat" 8504156)
(dir "d")
(cd "a")
(dir "e")
(file "f" 29116)
(file "g" 2557)
(file "h.lst" 62596)
(cd "e")
(file "i" 584)
(cd "..")
(cd "..")
(cd "d")
(file "j" 4060174)
(file "d.log" 8033020)
(file "d.ext" 5626152)
(file "k" 7214296)
(d/q '[:find ?name :where
[?e :entry/type :entry-file]
[?e :entry/name ?name]] (d/db conn))
(def rules
'[[(belongs-to ?entry ?parent)
[?entry :entry/parent ?parent]]
[(inside ?entry ?parent)
(belongs-to ?entry ?parent)]
[(inside ?entry ?parent)
(belongs-to ?entry ?middle)
(inside ?middle ?parent)]])
(d/q '[:find ?name (sum ?size)
:in $ %
:where1 420
[?fs :fs/cwd ?cwd]] db)))ืืื ื ืืื ืืจืงืฆืื ืจืืฉืื ื ืขื Datomic. ืืชืืงืื ืื ืืืืืช ื ืฉืืจืช ืืืกืืก ืื ืชืื ืื ืืชืืจ ืืขืจื ืฉื ืืืคืืื
:fs/cwd. ืืกืืก ืื ืชืื ืื ืชืืื ืืืกืคืจ ืืขืจืืืช ืงืืฆืื ืืืงืืื ืืื ืืชืืื ืืช ืฉืื ืืฉืชืืฉืชื ืจืง ืืืขืจืืช ืงืืฆืื ืืืช ืื ืชืชื ืื ืืช ืืืืื /. ืืืืฉื ื ืฆืืจื ืืจืืืช ืืื ืืืื ืืก ืืช ืืขืจืืช ืืงืืฆืื ืืื ืืืกืืก ืื ืชืื ืื.
ืืคืื ืงืฆืื ืืืื ืืื file ืืืื ืืืฆืจืช ืงืืืฅ ืืชืืงืื ืื ืืืืืช:
(defn file [name size]
@(d/transact conn [
{:entry/type :entry-file
:entry/name name
:entry/size size
:entry/parent (cwd)}
]))
ืืคืงืืื transact ืฉื Datomic ืืืืืจื ืืจื ืืืงืฆืื ืืื ืืขืฆื ืขืืืื ืืืฉื ืฉืื ื ืืื ืืก ืืืกืืก ืื ืชืื ืื - ืืขืืืื ืฉืืฉ ืืืจ ืืฉื name, ืฉื parent ืฉืื ืืื ืืชืืงืื ืื ืืืืืช, ืฉืืืืื ืฉืื ืืื size ืืฉืืกืื ืฉืื ืืื :entry-file.
ืืคืื ืงืฆืื ืืืื ืืื dir ืืืื ืงืฆืช ืืืชืจ ืืกืืืืช ื file, ืืืื ืฉืืื ืชืืงืื ืืฉ ืื ื ืฉื ื ืืื ืงืื ืืืืืืื - ืืงืืฉืืจ . ืฉืืืืจ ืืืชื ืืขืฆืื ืืืงืืฉืืจ .. ืฉืืืืจ ืืืชื ืืชืืงืื ืฉืืขืืื:
(defn dir [name]
@(d/transact conn [
{:entry/type :entry-link
:entry/parent "d"
:entry/name ".."
:entry/link-to (cwd)}
{:entry/type :entry-link
:entry/parent "d"
:entry/name "."
:entry/link-to "d"}
{:db/id "d"
:entry/type :entry-dir
:entry/name name
:entry/parent (cwd)}
]))
ืืื ืืืจื ืืืงืฆืื ืืคืขื ืืกืคืจืช ืฉืืืฉ ืขืืืืืช ืืืฉืืช:
1. ืืฉ ืชืืงืื ืืฉื name ืืืืืจื ืฉืื ืืื parent
2. ืืฉ ืืื ืง ืืฉื . ืืืืืจื ืฉืื ืืื ืืชืืงืื ืืืืฉื ืฉืชืืืืฆืจ. ืืืื ืง ืืืืื ืืืืชื ืชืืงืื ืืืฉื.
3. ืืฉ ืืื ืง ืืฉื .. ืืืืืจื ืฉืื ืืื ืืชืืงืื ืืืืฉื ืฉืชืืืืฆืจ. ืืืื ืง ืืืืื ื parent.
ืืืืจืช ืืืืื d ืืชืื ืืืจื ืืืงืฆืื ืืื ืฉืืืคืฉืจืช ืืงืืืช ืืืื ืขืืืืืช ืืืชืืืก ืืืืชื ืืฉืืช.
ืืืคืื ืงืฆืื ืืืกืืืืช ืืืืชืจ ืืงืื ืืื ืคืื ืงืฆืืืช cd. ืืงืืจ ืืกืืืื ืืื ืืชืืืื ืืืื ืงืื, ืื ืื ืื ื ืขืืฉื cd ืืืื ืง ืื ื ืืฆืคื ืืืืืข ืืืืจ ืฉืืืื ืง ืืฆืืืข ืืืื. ืืงืื ืืืืืื ืชืืื ืื ืืืื ืง ืฉืืคื ื ืืืื ืง, ืืื ืืืืฉื ืืฆืืจื ืืืืืื ืขื ืืขืืืื:
(defn cd [name]
(let [db (d/db conn)
to (d/q '[:find ?e .
:in $ ?cwd ?name
:where
[?e :entry/name ?name]
[?e :entry/parent ?cwd]]
db
(cwd) name)
toe (d/entity db to)
tod (if (= (:entry/type toe) :entry-link)
(:db/id (first (filter #(= (:entry/type %1) :entry-dir) (iterate :entry/link-to toe))))
to)]
@(d/transact conn [{:fs/id "/"
:fs/cwd tod}])))
ื Datomic, ืืฉืืื ืืงืืช ืืฉืื ืฉืืืืจ ื find ืืืืคืฉ ืืืคืืื ืื ื ืืกืคืื ืฉืื ืื ื ืฆืจืื ืืืฉืชืืฉ ืืคืื ืงืฆืื ืฉื ืงืจืืช entity. ืืคืื ืงืฆืื ืืืืืจื ืืืืืงื ืืืืข ืืื ืืืกืืก ืื ืชืื ืื ืฉืืืจ ืืืื ืื ืืช ืื ืืืืืืงืืื ืฉืืงืืฉืจืื ืืืื, ืืื ืืคืฉืจ "ืืืืื" ืืขืฅ ืขื ืฉืืืคืืื link-to ืืืื ืืืชื ืืชืืงืื.
ืืืจื ืฉืืืืจื ื ืืช ืคืืงื ืฆืืืช ืืขืืจ ืืคืฉืจ ืืืชืื ืืช ืืขืจืืช ืืงืืฆืื ืขื:
(def data [
{:db/id "root" :entry/name "" :entry/type :entry-dir}
{:fs/id "/" :fs/cwd "root"}
])
@(d/transact conn data)
ืืืืคืขืื ืืช ืืชืืื ืืช.
## ืืฆืืช ืื ืืชืืงืืืช ืืืืืืื ืืฆืืจื ืจืงืืจืกืืืืช
ืื ืืขืืืื ืืงืฉื ืขื ืืคื ืืืืื ืืืชื ื ืืฉืืืืชื ืืืืจืื ื ืืืืขื ืืื ืช ืืืืื. ืื ื ืจืืฆื ืืืฆืื ืืช ืื ืืชืืงืืืช ืืืื ืชืืงืื ืืช ืืืืื ืฉืื, ืฉืืืจืื ืืืืืื ืฉื ืื ืืืืืื ืฉืื. ืืฉืืื ืื ืื ื ืฆืจืื ืืืืืืจ ื Datomic ืื ืื ื ืงืจื ืฉืืฉืื ื ืืฆื ืจืงืืจืกืืืืช ืืชืื ืชืืงืื:
(def rules
'[[(belongs-to ?entry ?parent)
[?entry :entry/parent ?parent]]
[(inside ?entry ?parent)
(belongs-to ?entry ?parent)]
[(inside ?entry ?parent)
(belongs-to ?entry ?middle)
(inside ?middle ?parent)]])
ืืืืืื rules ืืืืฆื ืกื ืฉื ืดืืืงืืืด ืฉืืืชื ืืคืฉืจ ืืืืืจ ืืืืข ืืืฉ ืืืขืืืืืช ืฉืื ื. ืืฉืืขืืช ืืืืงืื ืฉืืืืจืชื ืืื:
1. ืืฉ ืืืก ืืืขืจืืช ืฉื ืงืจื belongs-to. ืืฉืืฉืื belongs-to ืืฉืื ืืืจ ืื ืืืืจ ืฉืืฉืื ืืืจ ืืื ื parent ืฉื ืืฉืื.1 420
# ืคืืชืจืื ืชืจืืื Advent Of Code ืืื 7 ืืขืืจืช Datomic
ืืคื ื ืืื ืืืื ืกืืคืจืชื ืืื ืขื Datomic, ืืกืืก ื ืชืื ืื ืฉืืืืกื "ืขืืืืืช" ืืืฆืืข ืฉืคืช ืฉืืืืชืืช ืืฉื Datalog ืืื ืืืคืฉ ืืืืข ืืืกืงื ืืช ืฉืงืฉืืจ ืืขืืืืืช ืืื. ืืื ืืฉืืืืฉืื ืืืืืืงืื ื Datomic ืืื ืืืืืืช ืืืคืฉ ืืฆืืจื ืจืงืืจืกืืืืช ืืืื ื ื ืชืื ืื ืืงืืฉืจืื ืืื ืืจืคืื ืื ืขืฆืื. ืืืืืช Datalog, ืฉืืืืชืืช ืฉืืื ืืืืืืช ืืืืืช ืืกืืืืืช ืืืื ื SQL ืืืคืืืช ืืืื ืฉืืจืืช. ืืคืืกื ืื ื ืจืื ืืืืื ืืืืกืื ืืืืข ืขื ืืขืจืืช ืงืืฆืื ื Datomic, ืืืื ืืืกืื ืืื ืขืืืจ ืื ื ืืืฉื ืืืจ ืืืืื ืืฆืืจื ืจืงืืจืกืืืืช.
## ืืืชืืจ
ืืงืืชื ืืช ืืชืจืืื ืฉืคืืจืกื ื Advent Of Code Day 7 ืืฉืืื ืืืืื ืืืฉืืื ืขื ืืจืคืื. ืืชืจืืื ืืืืื ื ืืชื ืื ื ืืืืข ืขื ืงืืฆืื, ืชืืงืืืช ืืืืืื ืืืืจื ืื ืฉืืื ืืืชื ื ืืืคืฉ ืชืืงืืืช ืืืืืื ืืกืืืืื. ืืืืืข ืืืืข ืืคืืจืื ืืื:
$ cd /
$ ls
dir a
14848514 b.txt
8504156 c.dat
dir d
$ cd a
$ ls
dir e
29116 f
2557 g
62596 h.lst
$ cd e
$ ls
584 i
$ cd ..
$ cd ..
$ cd d
$ ls
4060174 j
8033020 d.log
5626152 d.ext
7214296 k
ืฉื ืจืื ืืื ืืงืื ืืฉืืจืช ืคืงืืื ืืืื ืืงืก. ืืฉ ืื ื ืืื ืฉืืจืืช ืืืื ืกืืืื:
1. ืฉืืจืืช ืฉืืชืืืืืช ืืืืืจ ืืกืื ืืช ืฉืคื ืืฉ "ืคืงืืื" ืืืืจืื ืืืืื ืืฉืืจืืช ืฉืืชืืืืืช ืืคืื ืฉืื. ืืืจื ืคืงืืืช ls ื ืงืื ืืช ืจืฉืืืช ืืงืืฆืื ืืืชืืงืืืช ืืชืืงืื ืื ืืืืืช, ืืืจื ืคืงืืืช cd ืืื ืคืื ืืื ืืชืืงืื ืชืฉืชื ื.
2. ืฉืืจืืช ืฉืืชืืืืืช ืืืกืคืจ ืืกืื ืืช ืฉืืฉ ืงืืืฅ ืืืืื ืืกืืื ืืชืืงืื ืื ืืืืืช. ืืืกืคืจ ืืื ืืืืื ืืืืงืกื ืืื ืฉื ืืงืืืฅ.
3. ืฉืืจืืช ืฉืืชืืืืืช ืืืืื dir ืืืืจืืช ืฉืืฉ ืชืืงืื ืืฉื ืืกืืื ืืชืืงืื ืื ืืืืืช.
ืืืจื ืฉื ืคืขื ื ืืช ืืงืื ื ืฆืืจื ืืขื ืืช ืขื ืฉืชื ืฉืืืืช ืฉืงืฉืืจืืช ืืืืืื:
1. ื ืจืฆื ืืืฆืื ืืช ืกืืื ืืืืืื ืืื ืืชืืงืืืช ืฉืืืืื ืงืื ืื ืฉืืื ื 100000
2. ื ืจืฆื ืืืฆืื ืืช ืืชืืงืื ืืงืื ื ืืืืชืจ ืฉืืืืื ืืืื ื 8381165
ืืฉืืื ืืืชืืงื ื Datomic ืืื ืืคืืขื ืื ืงืื ืื ืืืืืืช, ืื ื ืืขืฉื ืืื ืื ืืืช ืืชืจืืื: ืืช ืืงืื ืื ื ืืืชืื ืืฉืืจืืช ืืชืื ืืชืืื ืืช ืืื ื ืืกืชืคืง ืืืืฆืื ืืช ืื ืืชืืงืืืช ืืืช ืืืืื (ืืจืงืืจืกืืื) ืฉื ืื ืชืืงืื, ืืืืืจ ืืืืื ืฉื ืืชืืงืื ืืฉื ืื ืืงืืฆืื ืืืชืืงืืืช ืฉืืชืืื.
## ืกืืืื ืืืืฆืื ืืืืืข
ืืกืืก ื ืชืื ืื Datomic ืืฉืชืืฉ ืืกืืืื ืืื ืืืืื ืืืื ืขืืืืืช ืืคืฉืจ ืืืื ืืก ืืืขืจืืช. ืืกืืืื ืฉืื ื ืจืืืช ืื:
(def schema
[
{:db/ident :entry/type
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one}
{:db/ident :entry/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one}
{:db/ident :entry/link-to
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one}
{:db/ident :entry-link}
{:db/ident :entry-file}
{:db/ident :entry-dir}
{:db/ident :entry/parent
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/one}
{:db/ident :entry/size
:db/valueType :db.type/long
:db/cardinality :db.cardinality/one}
{:db/ident :fs/id
:db/cardinality :db.cardinality/one
:db/unique :db.unique/identity
:db/valueType :db.type/string}
{:db/ident :fs/cwd
:db/cardinality :db.cardinality/one
:db/valueType :db.type/ref}
])
ืืืขืจืืช ืืฉ ืฉื ื ืกืืืื ืฉื "ืืืจืื", ืืืืจ ืืื ืืคืฉืจ ืืงืจืื "ืืขืจืืช ืงืืฆืื", ืืื ืืฉืื ืฉืฉืืืจ ืืช ืืชืืงืื ืื ืืืืืช. ืืืืจ ืืฉื ื ืงืจืืชื entry ืืื ืืืื ืืืืืช ืงืืืฅ, ืชืืงืื ืื ืืื ืง ืืชืื ืืขืจืืช ืืงืืฆืื. ืืื entry ืืฉ ืฉื, ืืฉ ืืช ืืกืื ืฉืื ืืืฉ parent ืฉืื ื entry ืฉืืืื ืืืชื.
## ืืื ืกืช ืืืืข ืืืกืืก ืื ืชืื ืื
ืืืจื ืฉืืฉ ืื ื ืกืืืื ืืคืฉืจ ืื ืกืืช ืืืื ืืก ืืช ืืืืืข. ืืืจ ืืืจืชื ืฉืื ื ืขืืฉื ืคื ืื ืื ืืื ืืืชืื ืืช ืืงืื ืฉืืคืขื ื ืืช ืืงืื ืืืืืชื, ืืื ืื ืจืฆืืชื ืฉืชืืื ืืช ืืงืืื'ืจ ืฉืืืชืื ืืื ืืืื ืืก ืืช ืืืืืข ืชืืื ืืื ืฉืืืชืจ ืืืื ืืงืื ืืืืืชื, ืืจืื ืฉื ืืฉืื ืฉืืคืฉืจ ืืืฆืืจ ืืืืืืืืช ืขื sed. ืืืจื ืืืฉืื ืืืืชื ืขื ืืืื ื ืืื:
(dir "a")
(file "b.txt" 14848514)
(file "c.dat" 8504156)
(dir "d")
(cd "a")
(dir "e")
(file "f" 29116)
(file "g" 2557)
(file "h.lst" 62596)
(cd "e")
(file "i" 584)
(cd "..")
(cd "..")
(cd "d")
(file "j" 4060174)
(file "d.log" 8033020)
(file "d.ext" 5626152)
(file "k" 7214296)
ืืฉืืื ืฉืื ืืขืืื ืฆืจืื ืืืืืืจ ืืช ืืคืื ืงืฆืืืช dir, file ื cd. ืืฉืืืื ืืืืืชื ืฉืืืื ืขืืืจ ืืืืืืจ ืคืื ืงืฆืื ืืฉื cwd ืฉืืืืืจื ืืช ืืชืืงืื ืื ืืืืืช. ื ืชืืื ืขื ืืงืื ืฉืื ืื ืื ืืคืื ืงืฆืืืช ืืืืจืืช ืืฉืชืืฉื ืื:
(defn cwd []
(let [db (d/db conn)]
(d/q '[:find ?cwd .
:where
[?fs :fs/id "/"]1 420
# ืืฉืืฉ ืื ืคืืืฉ
ืืืื ืชื ืืขืื, ืืื ืืขืืืื ืฉืื ืื ื ืืืืจืื ืืืื ืืืขื ืชืืื ืืชืื ืกื ืืืืื ืฉืื ืื ื ืืืืจืื. ืืื ืืืฉืคื ืืืคืืจืกื ืืืื ื ืืื ืืืชืจ ืื ื ื ืกื "ืืฉืจืืืช ืจืง ืคืืืฉืื ืืขืืจ, ืื ืืืจ ื ืจืื ืืื ืืกืืจ".
ืืืื ืืฉ ืื ืฉืชื ืืืืื ืืืืช ืืืืืื-
1. ืืืื ืืืคืฉ ืื ืฉืื ืฉืจืื ืืืจืื ืืืจืื ืืื. ืืื ืฉื ืืฆื ืืืื ืื ื ืืืจ ืฉืืืืช ืืืฉืืช ืืคืชืืจ ืืขืืืช ืืืจืื ืืืฉืื ืฉืืืื ืื ืืฉืื ื ืขืืืื.
2. ืืืื ืืืืื ืืืื ืืืฉืื, ืื ืื ืื ืื ืืชื ื ืืช ืืคืืชืจืื ืืืื ืืืืชืจ ืืืขืื, ืืืคืืื ืฉืืื ืืคืชืืจ ืืช ืืืชื ืืขืื ืืื ืคืขืืื ืขื ืืืื ืืืจืื. ืื ืื ืกื ืืืืื ืฉืื ืื ื ืืืืจืื ืงืืืข ืืช ืกื ืืคืืชืจืื ืืช ืฉื ืืื ืืืฆืืข, ืืืชืจ ืืืื ืืืืืืื ืืฉืืจืืช ืืคืืชืจืื ืืช ืืืชืจ ืืขื ืืื ืื.
1 420
ืืืขื ืืื ืืฉืื ืื ืฉืื ืืกืืืื ืืื ืคืฉืื ืืืกืฃ ืฉื ืขืืืืืช, ืืืื ืืืื ืืื ืืฉืืจ ืืช ืืขืืืืืช ืืืื ืืคืืกืืื ืื ืืื ืืืื ืืืื ืฉืืืืจ ืืขืืืืืช ืฉื ืืกืืืื.
ืขืืฉืื ืืืื ื ืจืื ืงืฆืช ืฉืืืืชืืช. ืืฉืืืืชื ืืจืืฉืื ื ืืืืืจื ืืช ืืืืชืจืืช ืฉื ืื ืืคืืกืืื:
(d/q '[:find ?title :where [_ :post/title ?title]] (d/db conn))
;; returns: #{["second post"] ["rust"] ["first post"]}
ืืคืฉืจ ืื ืืงืื ืืช ืื ืืคืืกืืื ืืื ืขื ื slug ืฉื ืื ืคืืกื:
(d/q '[:find ?title ?slug :where
[?p :post/title ?title]
[?p :post/slug ?slug]] (d/db conn))
;; returns #{["rust" "rust"] ["second post" "second"] ["first post" "first"]}
ืืคื ืืืื ืืฉืื ืื ืืฉืืืืฉ ืืืฉืชื ื ?p - ืืขืฆื ืืืงืฉืชื ืืืืืืืง ืืืืืืจ ืืืืข ืขื ืืฉืืืืช ืืคื ืฉืชื ืขืืืืืช ืขื ืืืฉืืืืช, ืื ืฉืืืฉืืช ืืฉ :post/title ืืื ืฉืืฉ ืื :post/slug. ืืืื ืฉืฉื ื ืืชื ืืื ืืชืืืกืื ืืืืชื ืืฉืชื ื ?p ืงืืืืชื ืจืง ืืฉืืืืช ืฉืืืืืงืืช ืขืืืืืช ืืฉื ื ืืกืืืื. ืื ืืืืชื ืืฉืชืืฉ ืฉื ื _ ืืืงืื, ืืืืชื ืืงืื ืืฉืื ืฉืืืื ื Outer Join ื SQL, ืืืืืจ ืืช ืื ื title-ืื ืฉื ืื ืืืฉืืืืช ืืืืจื ืื ืืช ืื ื slug-ืื ืฉื ืื ืืืฉืืืืช, ืืืืืจ ืืช ืืจืฉืืื:
(d/q '[:find ?title ?slug :where
[_ :post/title ?title]
[_ :post/slug ?slug]] (d/db conn))
;; returns
;; #{["rust" "first"] ["rust" "rust"] ["first post" "second"] ["second post" "rust"] ["first post" "rust"] ["second post" "first"] ["second post" "second"] ["rust" "second"] ["first post" "first"]}
ืฉืืืืชื ืืืชืจ ืืขื ืืื ืช ืชืืืืจ ืืช ืื ืืคืืกืืื ืฉืืขื ืืื ืื ืืฉืชืืฉ ืืกืืื:
(d/q '[:find ?title :where
[?p :post/title ?title]
[?p :post/categories ?c]
[?s :subscriber/email "all@demomail.com"]
[?s :subscriber/categories ?c]] (d/db conn))
;; returns #{["second post"] ["rust"] ["first post"]}
ืื ืขืืื ืื ืืืฉืชื ื ?c ืืืคืืข ืื ืืจืฉืืืช ืืงืืืืจืืืช ืฉื ืืคืืกื ืืื ืืจืฉืืืช ืืงืืืืจืืืช ืฉื ืืื ืื. ืืืืืืง ืืืื ืฉืื ืืืชื ืืฉืชื ื ืืืื ืืืคืฉ ืคืืกืืื ืฉืฉืืืฉืืืช ืืงืืืืจืืืช ืฉืืื ืืืืืช ืืืืืฉืื ืงืืืืจืื ืืืื ืืงืืืืจืืืช ืฉื ืืื ืื.
ืืฉืืื ืืกืื ืฉืื ืื ืืกืืื ืงืืื ืคืืกื ืืกืืื ืื ื ืืฉืชืืฉ ืืืจื ืืืงืฆืื ืืืื:
@(d/transact conn [
{:subscriber/email "clojure@demomail.com"
:subscriber/received {:db/id [:post/slug "first"]}}])
ืืืืื ื Cardinality ืฉื ืืืืคืืื received ืืืืืืง ืืืืข ืืืืกืืฃ ืืช ืืคืืกื ืฉืืืงืฉืชื ืืจืฉืืื ืฉื ืืืงืื ืืืืืืฃ ืขืจื ืืืื.
ืขืืฉืื ืืคืฉืจ ืืืืฉืื ืืืฉืืื ืืืื ืคืืกืืื ืืฉืชืืฉ ืืกืืื ืืืจ ืงืืื:
(d/q '[:find ?title :where
[?p :post/title ?title]
[?s :subscriber/email "clojure@demomail.com"]
[?s :subscriber/received ?p]] (d/db conn))
;; #{["first post"]}
ืืืืชืจ ืืขื ืืื, ืืืื ืคืืกืืื ืฉืืืฉืชืืฉ ืจืฉืื ืืงืื ืืื ืขืืืื ืื ืงืืื:
(d/q '[:find ?post-slug
:where
[?subscriber :subscriber/email "clojure@demomail.com"]
[?subscriber :subscriber/categories ?cat]
[?post :post/categories ?cat]
(not-join [?subscriber ?post]
[?subscriber :subscriber/received ?post])
[?post :post/slug ?post-slug]] (d/db conn))
;; returns #{["second"]}
ืฉืคืช ืืฉืืืืชืืช datalog ืืชืืื ืืฉืคื ืืืื ืืืืืืชืืช ืืงืจืืื, ืืืืืื ืืืฉืืืื ื SQL. ืืื ืื ืฉืคื ืืืฉื ืืฆืจืื ืืืืื ืืืชื, ืืื ืื ื ืืงืืื ืฉืืืจ ืืืืืืืืืช ืืงืื ืืช ืืื ืืคืฉืจ ืืจืืืช ืืช ืืื ืฉืื.
## ืื ืืืื
ืืืงืื ืืื ืืื ืืืืื ืื ืขืื ืขื Datomic ืืื ืืชืืขืื ืฉืืื, ืฉืงืฆืช ืงืฆืจ ืืืืืืืืช ืืื ืืืื ืืื ืกืืฃ ืืกืืจืื ืืงืืคืื:
https://docs.datomic.com/on-prem/getting-started/brief-overview.html.
ืื ืืชื ืืขื ืืื ืืจืฆืืืช ืืืืืืื ืื ืืื ืจืืง ืืืงื ืืกืืืจ ืขื ืืืืืืง:
https://www.youtube.com/watch?v=9TYfcyvSpEQ
ืืืื ืืฉ ืืจืฆืื ืืืชืจ ืืื ืืช ืขื ืืื ืขืืืืื ืืืชื ืืืื ืื ืืืื ืืืืข:
https://www.youtube.com/watch?v=yWdfhQ4_Yfw
ืืืืจืื ื ืขื ืฉืคืช ืืฉืืืืชืืช datalog:
https://www.youtube.com/watch?v=bAilFQdaiHk
Endi mavjud! Telegram Tadqiqoti 2025 โ yilning asosiy insaytlari 
