-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsearch.xml
More file actions
216 lines (102 loc) · 97.1 KB
/
search.xml
File metadata and controls
216 lines (102 loc) · 97.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Gazebo构建小车模型并通过ROS控制</title>
<link href="/2024/01/30/Gazebo%E6%9E%84%E5%BB%BA%E5%B0%8F%E8%BD%A6%E6%A8%A1%E5%9E%8B%E5%B9%B6%E9%80%9A%E8%BF%87ROS%E6%8E%A7%E5%88%B6/"/>
<url>/2024/01/30/Gazebo%E6%9E%84%E5%BB%BA%E5%B0%8F%E8%BD%A6%E6%A8%A1%E5%9E%8B%E5%B9%B6%E9%80%9A%E8%BF%87ROS%E6%8E%A7%E5%88%B6/</url>
<content type="html"><![CDATA[<h2 id="Gazebo构建小车模型并通过ROS控制"><a href="#Gazebo构建小车模型并通过ROS控制" class="headerlink" title="Gazebo构建小车模型并通过ROS控制"></a>Gazebo构建小车模型并通过ROS控制</h2><ul><li><a href="http://t.csdnimg.cn/g6ebw">参考博客</a></li></ul><blockquote><p>由于原博客中只给了可参考的代码文件,许多内容及命令都没有说清楚,所以此篇博客详细地记录一下构建的流程</p></blockquote><h3 id="一、编写小车的URDF文件"><a href="#一、编写小车的URDF文件" class="headerlink" title="一、编写小车的URDF文件"></a>一、编写小车的URDF文件</h3><ul><li>这段代码借鉴的是参考博客中的代码,需要注意的是在里面不能有中文,文件的后缀名称需要是<code>urdf</code>,例如:<code>model.urdf</code></li></ul><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?xml version='1.0'?></span></span><br><span class="line"><span class="tag"><<span class="name">robot</span> <span class="attr">name</span>=<span class="string">"dd_robot"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">name</span>=<span class="string">"base_link"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">visual</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">origin</span> <span class="attr">xyz</span>=<span class="string">"0.0 0.0 0.0"</span> <span class="attr">rpy</span>=<span class="string">"0.0 0.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">box</span> <span class="attr">size</span>=<span class="string">"0.5 0.5 0.25"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">material</span> <span class="attr">name</span>=<span class="string">"blue"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">color</span> <span class="attr">rgba</span>=<span class="string">"0.0 0.5 1.0 1.0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">material</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">visual</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">collision</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">origin</span> <span class="attr">xyz</span>=<span class="string">"0.0 0.0 0.0"</span> <span class="attr">rpy</span>=<span class="string">"0.0 0.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">box</span> <span class="attr">size</span>=<span class="string">"0.5 0.5 0.25"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">collision</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">inertial</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mass</span> <span class="attr">value</span>=<span class="string">"5"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">inertia</span> <span class="attr">ixx</span>=<span class="string">"0.13"</span> <span class="attr">ixy</span>=<span class="string">"0.0"</span> <span class="attr">ixz</span>=<span class="string">"0.0"</span> <span class="attr">iyy</span>=<span class="string">"0.21"</span> <span class="attr">iyz</span>=<span class="string">"0.0"</span> <span class="attr">izz</span>=<span class="string">"0.13"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">inertial</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">visual</span> <span class="attr">name</span>=<span class="string">"caster"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">origin</span> <span class="attr">xyz</span>=<span class="string">"0.2 0.0 -0.125"</span> <span class="attr">rpy</span>=<span class="string">"0.0 0.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">sphere</span> <span class="attr">radius</span>=<span class="string">"0.05"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">visual</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">collision</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">origin</span> <span class="attr">xyz</span>=<span class="string">"0.2 0.0 -0.125"</span> <span class="attr">rpy</span>=<span class="string">"0.0 0.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">sphere</span> <span class="attr">radius</span>=<span class="string">"0.05"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">collision</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">link</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">name</span>=<span class="string">"right_wheel"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">visual</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">origin</span> <span class="attr">xyz</span>=<span class="string">"0.0 -0.0 0.0"</span> <span class="attr">rpy</span>=<span class="string">"1.570795 0.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">cylinder</span> <span class="attr">length</span>=<span class="string">"0.1"</span> <span class="attr">radius</span>=<span class="string">"0.2"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">material</span> <span class="attr">name</span>=<span class="string">"black"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">color</span> <span class="attr">rgba</span>=<span class="string">"0.05 0.05 0.05 1.0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">material</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">visual</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">collision</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">origin</span> <span class="attr">xyz</span>=<span class="string">"0.0 0.0 0.0"</span> <span class="attr">rpy</span>=<span class="string">"1.570795 0.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">cylinder</span> <span class="attr">length</span>=<span class="string">"0.1"</span> <span class="attr">radius</span>=<span class="string">"0.2"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">collision</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">link</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">joint</span> <span class="attr">name</span>=<span class="string">"join_right_wheel"</span> <span class="attr">type</span>=<span class="string">"continuous"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parent</span> <span class="attr">link</span>=<span class="string">"base_link"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">child</span> <span class="attr">link</span>=<span class="string">"right_wheel"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">origin</span> <span class="attr">xyz</span>=<span class="string">"0.0 -0.30 0.0"</span> <span class="attr">rpy</span>=<span class="string">"0.0 0.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">axis</span> <span class="attr">xyz</span>=<span class="string">"0.0 1.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">joint</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">name</span>=<span class="string">"left_wheel"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">visual</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">origin</span> <span class="attr">xyz</span>=<span class="string">"0.0 0.0 0.0"</span> <span class="attr">rpy</span>=<span class="string">"1.570795 0.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">cylinder</span> <span class="attr">length</span>=<span class="string">"0.1"</span> <span class="attr">radius</span>=<span class="string">"0.2"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">material</span> <span class="attr">name</span>=<span class="string">"black"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">visual</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">collision</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">origin</span> <span class="attr">xyz</span>=<span class="string">"0.0 0.0 0.0"</span> <span class="attr">rpy</span>=<span class="string">"1.570795 0.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">cylinder</span> <span class="attr">length</span>=<span class="string">"0.1"</span> <span class="attr">radius</span>=<span class="string">"0.2"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">geometry</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">collision</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">link</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">joint</span> <span class="attr">name</span>=<span class="string">"join_left_wheel"</span> <span class="attr">type</span>=<span class="string">"continuous"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parent</span> <span class="attr">link</span>=<span class="string">"base_link"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">child</span> <span class="attr">link</span>=<span class="string">"left_wheel"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">origin</span> <span class="attr">xyz</span>=<span class="string">"0.0 -0.3 0.0"</span> <span class="attr">rpy</span>=<span class="string">"0.0 0.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">axis</span> <span class="attr">xyz</span>=<span class="string">"0.0 1.0 0.0"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">joint</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">gazebo</span> <span class="attr">reference</span>=<span class="string">"base_link"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">material</span>></span>Gazebo/Blue<span class="tag"></<span class="name">material</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">gazebo</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">gazebo</span> <span class="attr">reference</span>=<span class="string">"right_wheel"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">material</span>></span>Gazebo/Black<span class="tag"></<span class="name">material</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">gazebo</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">gazebo</span> <span class="attr">reference</span>=<span class="string">"left_wheel"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">material</span>></span>Gazebo/Black<span class="tag"></<span class="name">material</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">gazebo</span>></span></span><br><span class="line"><span class="tag"></<span class="name">robot</span>></span></span><br></pre></td></tr></table></figure><ul><li>编写启动launch文件,后缀名称是<code>launch</code>,如<code>start.launch</code>,该文件放在根目录下面即可</li></ul><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">launch</span>></span></span><br><span class="line"><span class="tag"><<span class="name">arg</span> <span class="attr">name</span>=<span class="string">"model"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">arg</span> <span class="attr">name</span>=<span class="string">"gui"</span> <span class="attr">default</span>=<span class="string">"False"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">param</span> <span class="attr">name</span>=<span class="string">"robot_description"</span> <span class="attr">textfile</span>=<span class="string">"$(find ros_robotics)/urdf/$(arg model)"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">param</span> <span class="attr">name</span>=<span class="string">"use_gui"</span> <span class="attr">value</span>=<span class="string">"$(arg gui)"</span>/></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">node</span> <span class="attr">name</span>=<span class="string">"joint_state_publisher"</span></span></span><br><span class="line"><span class="tag"><span class="attr">pkg</span>=<span class="string">"joint_state_publisher"</span></span></span><br><span class="line"><span class="tag"><span class="attr">type</span>=<span class="string">"joint_state_publisher"</span> /></span></span><br><span class="line"> </span><br><span class="line"><span class="tag"><<span class="name">node</span> <span class="attr">name</span>=<span class="string">"robot_state_publisher"</span></span></span><br><span class="line"><span class="tag"><span class="attr">pkg</span>=<span class="string">"robot_state_publisher"</span></span></span><br><span class="line"><span class="tag"><span class="attr">type</span>=<span class="string">"robot_state_publisher"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">node</span> <span class="attr">name</span>=<span class="string">"rviz"</span> <span class="attr">pkg</span>=<span class="string">"rviz"</span> <span class="attr">type</span>=<span class="string">"rviz"</span> </span></span><br><span class="line"><span class="tag"><span class="attr">args</span>=<span class="string">"-d $(find ros_robotics)/urdf.rviz"</span> </span></span><br><span class="line"><span class="tag"><span class="attr">required</span>=<span class="string">"true"</span> /></span></span><br><span class="line"><span class="tag"></<span class="name">launch</span>></span></span><br></pre></td></tr></table></figure><h3 id="二、运行启动文件"><a href="#二、运行启动文件" class="headerlink" title="二、运行启动文件"></a>二、运行启动文件</h3><ul><li>在运行启动文件之前,需要先进入到根目录下的<code>src</code>目录下,然后使用下列命令创建一个功能包<code>ros_robotics</code></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">catkin_create_pkg ros_robotics std_msgs roscpp</span><br></pre></td></tr></table></figure><ul><li>接着在该<code>ros_robotics</code>目录下面创建文件夹<code>urdf</code>用于存放上文提到的<code>urdf</code>文件</li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20240130175522.png"></p><ul><li>运行下列命令,确保 ROS 工作空间的变更被正确加载</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> devel/setup.bash</span><br></pre></td></tr></table></figure><ul><li>执行<code>launch</code>文件,当前目录中有<code>launch</code>文件时不用指定包路径</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">roslaunch start.launch model:=model.urdf</span><br></pre></td></tr></table></figure><ul><li>成功渲染出了该模型文件,注意:第一次执行的时候需要先点左边窗口的Add按钮,找到RobotModel和TF,然后将Fixed Frame设定为base_link即可</li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20240130180224.png"></p><h3 id="三、命令记录"><a href="#三、命令记录" class="headerlink" title="三、命令记录"></a>三、命令记录</h3><ul><li>列出ROS_PACKAGE_PATH中包含的路径,确保当前根目录在该路径下面</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="variable">$ROS_PACKAGE_PATH</span></span><br></pre></td></tr></table></figure><ul><li>返回你的ROS包<code>ros_robotics</code> 的路径</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rospack find ros_robotics</span><br></pre></td></tr></table></figure><ul><li>构建你的ROS工作区</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">catkin_make</span><br></pre></td></tr></table></figure><ul><li>查看当前log占用了多大空间</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rosclean check</span><br></pre></td></tr></table></figure><ul><li>清理ros日志文件</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rosclean purge</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> 智能小车 </category>
</categories>
</entry>
<entry>
<title>Beta冲刺3-3</title>
<link href="/2023/12/23/Beta%E5%86%B2%E5%88%BA3-3/"/>
<url>/2023/12/23/Beta%E5%86%B2%E5%88%BA3-3/</url>
<content type="html"><![CDATA[<h2 id="Beta冲刺3-x2F-3-进展及体会"><a href="#Beta冲刺3-x2F-3-进展及体会" class="headerlink" title="Beta冲刺3/3 进展及体会"></a>Beta冲刺3/3 进展及体会</h2><h3 id="一、项目进展"><a href="#一、项目进展" class="headerlink" title="一、项目进展"></a>一、项目进展</h3><ul><li>由于上周基本上完成了所有的项目部署方面的流程,并且这周我们也懒得新加其他的功能了,所以这周主要还是进行了前端界面的美化(但其实基本没怎么修改,所以还是就展示一下我们全部的界面吧</li><li>B站视频链接:<a href="https://www.bilibili.com/video/BV1yC4y1q7Qm/?spm_id_from=333.1365.list.card_archive.click&vd_source=b1991c33e80c4d1dc36099f18e1b76fe">软工小组作业 | iOcean_哔哩哔哩_bilibili</a></li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231215233305.png"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231230001040.png"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231230001529.png"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231230002055.png"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231230002135.png"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231230002151.png"></p><h3 id="二、心得体会"><a href="#二、心得体会" class="headerlink" title="二、心得体会"></a>二、心得体会</h3><p>团队合作是网页开发的要害,就像合伙开饭店一样,得密切合作才能让顾客满意。每个人需要互通消息、分工合理,一起审查代码,保证网站好用,最好能够记录下开发文档,有助于以后查阅。再说,持续部署和反馈很关键,保证工程质量。还有,团队合作需要尊重彼此,多交流,否则的话小组作业就会变成一个人的作业。到最后得总结开发的经验,改进不足。这些经验,以后项目中都能派上用场。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"><span class="keyword">import</span> csv</span><br><span class="line"></span><br><span class="line">url = <span class="string">"https://yss.mof.gov.cn/2022zyczys/202203/t20220324_3797801.htm"</span></span><br><span class="line">headers = {</span><br><span class="line"> <span class="string">"User-Agent"</span>: <span class="string">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">resp = requests.get(url, headers=headers)</span><br><span class="line"><span class="comment"># 网页数据的编码格式为'utf-8'</span></span><br><span class="line">resp.encoding = <span class="string">'utf-8'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">"./data/2022finance.csv"</span>, mode=<span class="string">"w"</span>, newline=<span class="string">""</span>, encoding=<span class="string">"utf-8-sig"</span>) <span class="keyword">as</span> f:</span><br><span class="line"> csvwriter = csv.writer(f)</span><br><span class="line"></span><br><span class="line"> page = BeautifulSoup(resp.text, <span class="string">"html.parser"</span>)</span><br><span class="line"> table = page.find(<span class="string">"table"</span>)</span><br><span class="line"></span><br><span class="line"> trs = table.find_all(<span class="string">"tr"</span>)[<span class="number">2</span>:]</span><br><span class="line"> <span class="keyword">for</span> tr <span class="keyword">in</span> trs:</span><br><span class="line"> tds = tr.find_all(<span class="string">"td"</span>)</span><br><span class="line"> name, num_20, num_20_1 = [td.text <span class="keyword">for</span> td <span class="keyword">in</span> tds[:<span class="number">3</span>]]</span><br><span class="line"> csvwriter.writerow([name, num_20, num_20_1])</span><br><span class="line"></span><br><span class="line"><span class="built_in">print</span>(<span class="string">"over!"</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> 软件工程 </category>
</categories>
</entry>
<entry>
<title>Vercel域名失效问题</title>
<link href="/2023/12/22/Vercel%E5%9F%9F%E5%90%8D%E5%A4%B1%E6%95%88%E9%97%AE%E9%A2%98/"/>
<url>/2023/12/22/Vercel%E5%9F%9F%E5%90%8D%E5%A4%B1%E6%95%88%E9%97%AE%E9%A2%98/</url>
<content type="html"><![CDATA[<h2 id="Vercel域名失效问题"><a href="#Vercel域名失效问题" class="headerlink" title="Vercel域名失效问题"></a>Vercel域名失效问题</h2><h3 id="一、问题说明"><a href="#一、问题说明" class="headerlink" title="一、问题说明"></a>一、问题说明</h3><h4 id="Vercel的作用"><a href="#Vercel的作用" class="headerlink" title="Vercel的作用"></a>Vercel的作用</h4><p>由于我的博客网站评论系统是利用twikoo进行搭建的,同时twikoo的搭建一般都是基于MongoDB数据库和Vercel云函数来运行。但是因为国内对于<code>vercel.app</code>的域名进行了墙,所以导致无法访问云函数网址,故在不开启梯子的情况下无法加载博客的评论,但这显然是不行的,所以需要另寻他路</p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231221020208.png"></p><h4 id="参考博客"><a href="#参考博客" class="headerlink" title="参考博客"></a>参考博客</h4><p>最开始我找的方法是在解析域名的时候添加一条A记录:<code>76.223.126.88</code>,但是添加了A记录之后会导致<code>iocean.site</code>直接指向云函数的界面了,无法解析到博客界面,这显然是丢了西瓜捡了芝麻。后来发现可以在我的域名下面添加二级域名,以此和原博客网址分开,成功解决了问题(<a href="https://blog.meta-code.top/2022/03/16/2022-42/">参考博客</a>)</p><h3 id="二、问题解决"><a href="#二、问题解决" class="headerlink" title="二、问题解决"></a>二、问题解决</h3><ul><li>第一步:在腾讯云进行DNS域名解析配置,添加一条新记录,具体取值如下<ol><li>记录类型:CNAME</li><li>主机记录:twikoo</li><li>解析线路:默认</li><li>记录值:vercel-dns.com</li><li>TTL:默认600s</li></ol></li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231221021320.png"></p><ul><li>第二步:在Vercel的twikoo项目下点击<code>settings > Domains</code>然后添加域名,具体的格式为:<code>twikoo-yourdomain.yourpostfix</code>,如果发现配置没有报错就可以使用新配置的域名进行云函数的访问了</li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231221021550.png"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231221021712.png"></p><ul><li>第三步:在<code>_config.butterfly.yml</code>文件中更改<code>envId</code>的值为我们的新域名即可</li><li>第四步:执行hexo三连,先在本地运行项目,观察效果是否发生了变化</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo c && hexo g && hexo d</span><br><span class="line">hexo s</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> BUG解决 </category>
</categories>
</entry>
<entry>
<title>Beta冲刺2-3</title>
<link href="/2023/12/15/Beta%E5%86%B2%E5%88%BA2-3/"/>
<url>/2023/12/15/Beta%E5%86%B2%E5%88%BA2-3/</url>
<content type="html"><![CDATA[<h2 id="Beta冲刺2-x2F-3-进展及体会"><a href="#Beta冲刺2-x2F-3-进展及体会" class="headerlink" title="Beta冲刺2/3 进展及体会"></a>Beta冲刺2/3 进展及体会</h2><h3 id="一、项目进展"><a href="#一、项目进展" class="headerlink" title="一、项目进展"></a>一、项目进展</h3><ul><li>首先,我记录了一下部署服务器的过程,<a href="https://shineahead.github.io/2023/12/15/%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2%E8%AE%B0%E5%BD%95/">点击查看</a>,上面详细地记录了在部署过程中遇到的问题以及如何解决的,所以接下来主要展示前端界面的变化</li><li>主页:在部署到服务器的过程中,我们需要把命名都改为英文格式的,否则在Centos上可能会乱码导致找不到文件</li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231215233305.png"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231215233350.png"></p><ul><li>技术简介:点击中间的文字,可以实现翻转效果</li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231215233511.png"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231215233621.png"></p><ul><li>关于我们:这个界面只是加了一些底部栏,跟之前没有太大的变化</li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231215233834.png"></p><h3 id="二、心得体会"><a href="#二、心得体会" class="headerlink" title="二、心得体会"></a>二、心得体会</h3><p>这周主要的任务就是把前后端的项目都部署到了服务器上,也增加了对于nginx和uwsgi的理解,重新熟悉了如何部署项目的流程,踩过了很多之前没有踩过的坑,增强了阅读日志Debug的能力,也让我对服务器更加感兴趣了。此外,这周我们小组的成员一起在实验室进行开发,增加了团队协作的能力,也让我意识到如何合理地分配给每个成员任务,才能最大化地发挥每个人的作用,聚沙成塔,积水成渊。</p>]]></content>
<categories>
<category> 软件工程 </category>
</categories>
</entry>
<entry>
<title>服务器部署记录</title>
<link href="/2023/12/15/%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2%E8%AE%B0%E5%BD%95/"/>
<url>/2023/12/15/%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%83%A8%E7%BD%B2%E8%AE%B0%E5%BD%95/</url>
<content type="html"><![CDATA[<h2 id="服务器部署记录"><a href="#服务器部署记录" class="headerlink" title="服务器部署记录"></a>服务器部署记录</h2><h3 id="零、写在前面"><a href="#零、写在前面" class="headerlink" title="零、写在前面"></a>零、写在前面</h3><p>距大一下部署过django项目已经过去了一年多了,所以在这次软工部署项目的过程中完全是从头学起。那段经历对于现在的我唯一作用就是让我不可能去半途放弃部署,因为曾经在知识储备非常匮乏的情况下都能够成功部署(虽然当时借助了乃子哥许多帮助),现在没有道理比过去还差劲。嗯,经过这次部署,对于每个步骤的理解实际上是更加深刻了,当时完全是借着教程懵懵懂懂地部署上去,连nginx和uwsgi的基本功能都没有弄明白。趁着刚部署完项目,脑子还比较清醒,记录一下部署的过程,免得浪费了这几天的付出。部署服务器的问题会出在各种意向不到的地方,所以这篇博客也可以积累一下解决问题的经验</p><ul><li><p>参考教程:<a href="https://zhuanlan.zhihu.com/p/137305167">知乎</a></p></li><li><p>本次部署所使用的环境如下,某些版本不同可能造成部分步骤存在差异</p><ol><li>云服务器:华为云</li><li>操作系统:Centos8.2 64bit</li><li>Django版本:Django3.2.23</li></ol></li><li><p><strong>注意:</strong>我们租赁的云服务器需要具有公网IP,否则无法通过SSH连接,只能使用内网穿透,这部分就不在此讨论了</p></li></ul><h3 id="一、部署过程"><a href="#一、部署过程" class="headerlink" title="一、部署过程"></a>一、部署过程</h3><p>首先可以大致把我们的部署给过程分为两部分:1.准备python的环境和各种工具 2.部署本地项目到服务器上</p><h4 id="1-1-环境准备"><a href="#1-1-环境准备" class="headerlink" title="1.1 环境准备"></a>1.1 环境准备</h4><p>在此之前,我们需要使用SSH连接访问我们的服务器,方便上传各种资源。这里推荐使用FinalShell或者XShell,因为在上传文件的时候可以可视化上传,否则需要使用SFTP等文件传输工具来上传文件,连接参数参考下图</p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231215165500.png"></p><h5 id="1-1-1-安装Python"><a href="#1-1-1-安装Python" class="headerlink" title="1.1.1 安装Python"></a>1.1.1 安装Python</h5><ul><li><p>连接成功之后,在系统中自动更新所有已安装软件包到最新版本,<code>-y</code>表示不需要用户确认操作</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum update -y</span><br></pre></td></tr></table></figure></li><li><p>安装软件管理包和可能使用的依赖</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum -y groupinstall "Development tools"</span><br><span class="line">yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel</span><br></pre></td></tr></table></figure></li><li><p>下载Pyhton3压缩包到/usr/local目录</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd /usr/local</span><br><span class="line">wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz</span><br></pre></td></tr></table></figure></li><li><p>解压该压缩包</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tar -zxvf Python-3.6.6.tgz</span><br></pre></td></tr></table></figure></li><li><p>编译安装到自己指定路径-/usr/local/python3</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./configure --prefix=/usr/local/python3</span><br></pre></td></tr></table></figure></li><li><p>安装Python3</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">make</span><br><span class="line">make install</span><br></pre></td></tr></table></figure></li><li><p>安装完成之后,建立软链接,添加变量,之后我们可以在终端中直接使用python3命令,类似于windows配置环境变量</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ln -s /usr/local/python3/<span class="built_in">bin</span>/python3<span class="number">.6</span> /usr/<span class="built_in">bin</span>/python3</span><br></pre></td></tr></table></figure></li><li><p>同理,这里建立pip3的软链接</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3</span><br></pre></td></tr></table></figure></li><li><p>查看是否成功安装Python</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">python3 -V</span><br><span class="line">pip3 -V</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231215171228.png"></p></li></ul><h5 id="1-1-2-安装virtualenv"><a href="#1-1-2-安装virtualenv" class="headerlink" title="1.1.2 安装virtualenv"></a>1.1.2 安装virtualenv</h5><p>安装virtualenv是为了方便不同的项目管理,因为不同的项目需要不同的依赖,如果都装在同一个环境里面的话会造成冗余以及会互相影响,不太优雅</p><ul><li><p>直接使用pip3安装</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip3 install virtualenv</span><br></pre></td></tr></table></figure></li><li><p>同理建立软链接</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv</span><br></pre></td></tr></table></figure></li></ul><h5 id="1-1-3-使用virtualenv创建环境"><a href="#1-1-3-使用virtualenv创建环境" class="headerlink" title="1.1.3 使用virtualenv创建环境"></a>1.1.3 使用virtualenv创建环境</h5><ul><li><p>创建并切换到虚拟环境集中管理的目录,这个任选你喜欢的目录即可,这里选择的是:<code>/data/env</code></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p /data/env</span><br><span class="line">cd /data/env</span><br></pre></td></tr></table></figure></li><li><p>为你的虚拟环境起一个名字,这里使用:<code>djangoenv</code>,<code>--python=</code>指明该虚拟环境复制自父环境</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">virtualenv --python=/usr/bin/python3 djangoenv</span><br></pre></td></tr></table></figure></li><li><p>进入并启动虚拟环境</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd djangoenv/bin</span><br><span class="line">source activate</span><br></pre></td></tr></table></figure></li><li><p>当路径前面出现djangoenv时,表示进入成功<br><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231215172245.png"></p></li></ul><h5 id="1-1-4-安装django和uwsgi"><a href="#1-1-4-安装django和uwsgi" class="headerlink" title="1.1.4 安装django和uwsgi"></a>1.1.4 安装django和uwsgi</h5><ul><li><p>使用pip3安装django和uwsgi,<strong>注意这里需要安装两次uwsgi:一次在虚拟环境中,一次在系统环境中</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip3 install django</span><br><span class="line">pip3 install uwsgi</span><br></pre></td></tr></table></figure></li><li><p>同样建立软链接</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi</span><br></pre></td></tr></table></figure></li></ul><h4 id="1-2-着手部署"><a href="#1-2-着手部署" class="headerlink" title="1.2 着手部署"></a>1.2 着手部署</h4><h5 id="1-2-1-前端文件部署"><a href="#1-2-1-前端文件部署" class="headerlink" title="1.2.1 前端文件部署"></a>1.2.1 前端文件部署</h5><p>由于这次是前后端分离的项目,所以一开始打算先部署前端到服务器上查看一下效果</p><ul><li><p>安装nginx网页web服务器,并启动nginx服务</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum install nginx</span><br><span class="line">nginx</span><br></pre></td></tr></table></figure></li><li><p>查看端口占用,可以看到nginx默认访问端口80已经开启</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">netstat -ntlp</span><br></pre></td></tr></table></figure></li><li><p>创建文件夹存放我们的前端文件</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p /home/shine/web</span><br><span class="line">cd /home/shine/web</span><br></pre></td></tr></table></figure></li><li><p>打包我们的前端文件到该文件夹中,这里我上传的是<code>frontend.zip</code>压缩包,故需要解压缩</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">unzip frontend.zip</span><br></pre></td></tr></table></figure></li><li><p>可以看到我们的网页文件成功上传到服务器了<br><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231215175420.png"></p></li></ul><p>由于已经安装了nginx服务器,所以直接在浏览器访问自己服务器的公网IP已经可以看到网页了,不过此时是nginx的默认页面,我们需要进行修改,让其显示我们的网页页面</p><ul><li><p>找到nginx的配置文件:<code>/etc/nginx/nginx.conf</code></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd /etc/nginx</span><br><span class="line">vim nginx.conf</span><br></pre></td></tr></table></figure></li><li><p>在修改文件之前,最好复制一份源文件防止自己修改出错</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cp nginx.conf nginx.conf.bak</span><br></pre></td></tr></table></figure></li><li><p>将<code>root</code>的值改为自己网页文件的路径,<code>index</code>是要首先展示的网页文件,<code>listen</code>是要监听的端口号</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">server {</span><br><span class="line"> listen 8080;</span><br><span class="line"> listen [::]:8080;</span><br><span class="line"> server_name xx.xx.xx.xx; #填写你自己服务器的IP</span><br><span class="line"> root /home/shine/web/frontend;</span><br><span class="line"></span><br><span class="line"> # Load configuration files for the default server block.</span><br><span class="line"> include /etc/nginx/default.d/*.conf;</span><br><span class="line"></span><br><span class="line"> location / {</span><br><span class="line"> index page_a.html;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>文件配置完成之后,先检查nginx语法是否无误,检查完成后重启nginx服务器。之后便可以成功在浏览器访问上传的网页文件了</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">nginx -t</span><br><span class="line">systemctl restart nginx</span><br></pre></td></tr></table></figure></li></ul><h5 id="1-2-2-后端文件部署"><a href="#1-2-2-后端文件部署" class="headerlink" title="1.2.2 后端文件部署"></a>1.2.2 后端文件部署</h5><ul><li><p>在本地项目中导出所有的环境依赖包</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip list --format=freeze > requirements.txt</span><br></pre></td></tr></table></figure></li><li><p>创建并进入自己的后端文件夹,打开虚拟环境,安装依赖</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p /home/shine/web/backend</span><br><span class="line">cd /data/env/djangoenv/bin</span><br><span class="line">source activate</span><br><span class="line">cd /home/shine/web/backend</span><br><span class="line">pip3 install -r req.txt</span><br></pre></td></tr></table></figure></li><li><p>如果项目中含有静态文件的话,还需要收集静态文件</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"># </span><span class="language-bash">这是在settings.py中配置的</span></span><br><span class="line">STATIC_ROOT = os.path.join(BASE_DIR, 'static') # 指定样式收集目录</span><br><span class="line">python3 manage.py collectstatic</span><br></pre></td></tr></table></figure></li><li><p>检查是否可以正常运行django项目,如果可以则进入下一步,否则检查上述步骤</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 manage.py runserver</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231215184449.png"></p></li><li><p><strong>配置uwsgi文件,重点!!!</strong>,每个名词具体解释如下</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[uwsgi]</span><br><span class="line"><span class="meta"># </span><span class="language-bash">django项目目录</span></span><br><span class="line">chdir=/home/shine/web/backend/software</span><br><span class="line"><span class="meta"># </span><span class="language-bash">端口号,用来和nginx进行内部通信,并不是外部端口</span></span><br><span class="line">socket=127.0.0.1:8888</span><br><span class="line"><span class="meta"># </span><span class="language-bash">module文件,django项目自带的wsgi文件</span></span><br><span class="line">module=software.wsgi</span><br><span class="line"><span class="meta"># </span><span class="language-bash">最多允许的进程数量</span></span><br><span class="line">processes=4</span><br><span class="line"><span class="meta"># </span><span class="language-bash">让uwsgi在后台运行,同时把日志文件记录在uwsgi.log中</span></span><br><span class="line">daemonize=uwsgi.log</span><br><span class="line"><span class="meta"># </span><span class="language-bash">所需虚拟环境的路径</span></span><br><span class="line">home=/data/env/djangoenv</span><br></pre></td></tr></table></figure></li><li><p>进行nginx和uwsgi通信的配置,需要注意的内容如下所示</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">server {</span><br><span class="line"> listen 80;</span><br><span class="line"> server_name 127.0.0.1:80; #改为自己的域名,没域名修改为127.0.0.1:80</span><br><span class="line"> charset utf-8;</span><br><span class="line"> location / {</span><br><span class="line"> include uwsgi_params;</span><br><span class="line"> uwsgi_pass 127.0.0.1:8888; #端口要和uwsgi里配置的一样</span><br><span class="line"> uwsgi_param UWSGI_SCRIPT software.wsgi; #wsgi.py所在的目录名+.wsgi</span><br><span class="line"> uwsgi_param UWSGI_CHDIR /home/shine/web/backend/software; #项目路径</span><br><span class="line"> }</span><br><span class="line"> location /static/ {</span><br><span class="line"> alias /home/shine/web/backend/software/static/; #静态资源路径</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li><li><p>配置好nginx和uwsgi之后,查看是否有语法配置错误,检查完重启nginx服务和uwsgi服务</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">nginx -t</span><br><span class="line">systemctl restart nginx</span><br><span class="line">killall -9 uwsgi</span><br><span class="line">uwsgi --ini /home/shine/web/backend/software/uwsgi.ini</span><br></pre></td></tr></table></figure></li><li><p>如果上述没有任何报错的话,就可以通过浏览器访问你的Django项目啦~</p></li></ul><h3 id="二、问题分析"><a href="#二、问题分析" class="headerlink" title="二、问题分析"></a>二、问题分析</h3><h4 id="2-1-问题1"><a href="#2-1-问题1" class="headerlink" title="2.1 问题1"></a>2.1 问题1</h4><ul><li><p>描述:在安装uwsgi的时候,弹出报错:<code>ERROR: Command errored out with exit status 1</code></p></li><li><p>解决:貌似安装一下python3-devel就可以解决</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install python3-devel</span><br></pre></td></tr></table></figure></li></ul><h4 id="2-2-问题2"><a href="#2-2-问题2" class="headerlink" title="2.2 问题2"></a>2.2 问题2</h4><ul><li>描述:nginx配置语法无误,并且路径正确但弹出报错:<code>[error] open() “/run/nginx.pid” failed (2: No such file or directory)</code></li><li>解决:最开始我的网页文件存放在root文件夹下面,访问这个文件夹路径需要授予root权限,否则就会报错<br><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//das.png"></li></ul><h4 id="2-3-问题3"><a href="#2-3-问题3" class="headerlink" title="2.3 问题3"></a>2.3 问题3</h4><ul><li>描述:<code>pip freeze</code>导出的依赖文件含有(@ file:///) </li><li>解决:改用命令:<code>pip list --format=freeze > requirements.txt</code></li></ul><h4 id="2-4-问题4"><a href="#2-4-问题4" class="headerlink" title="2.4 问题4"></a>2.4 问题4</h4><ul><li><p>描述:django后端返回504网络超时error</p></li><li><p>解决:uwsgi默认连接时间为60s,超时就会返回错误,所以需要在nginx.conf设置超时时间</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">uwsgi_send_timeout 600;</span><br><span class="line">uwsgi_connect_timeout 600;</span><br><span class="line">uwsgi_read_timeout 600;</span><br></pre></td></tr></table></figure></li></ul><h4 id="2-5-问题5"><a href="#2-5-问题5" class="headerlink" title="2.5 问题5"></a>2.5 问题5</h4><ul><li>描述:在nginx的服务器中配置6666端口无法访问</li><li>解决:某些端口浏览器认为不安全,会拒绝访问,例如:6666、6000等等端口</li></ul><h3 id="三、命令记录"><a href="#三、命令记录" class="headerlink" title="三、命令记录"></a>三、命令记录</h3><ul><li><p>查看端口运行情况</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">netstat -ntlp</span><br></pre></td></tr></table></figure></li><li><p>重启nginx服务</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart nginx</span><br></pre></td></tr></table></figure></li><li><p>查看uwsgi进程</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ps -ef|grep uwsgi</span><br></pre></td></tr></table></figure></li><li><p>杀死uwsgi进程</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">killall -9 uwsgi</span><br></pre></td></tr></table></figure></li><li><p>启动uwsgi进程</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uwsgi --ini uwsgi.ini</span><br></pre></td></tr></table></figure></li></ul>]]></content>
<categories>
<category> 编程学习 </category>
</categories>
</entry>
<entry>
<title>Beta冲刺1-3</title>
<link href="/2023/12/10/Beta%E5%86%B2%E5%88%BA1-3/"/>
<url>/2023/12/10/Beta%E5%86%B2%E5%88%BA1-3/</url>
<content type="html"><![CDATA[<h2 id="Beta冲刺1-x2F-3-进展及体会"><a href="#Beta冲刺1-x2F-3-进展及体会" class="headerlink" title="Beta冲刺1/3 进展及体会"></a>Beta冲刺1/3 进展及体会</h2><h3 id="一、项目进展"><a href="#一、项目进展" class="headerlink" title="一、项目进展"></a>一、项目进展</h3><ul><li>这周主要是前端重新绘制了页面以及把前端项目放在了云服务器上面,可以通过公网进行访问,<a href="http://124.70.219.54/%E4%B8%BB%E9%A1%B5.html">点击这里</a></li></ul><p><img src="https://s2.loli.net/2023/12/10/cFiYyhrv5anQ9Pb.jpg" alt="Snipaste_2023-12-10_18-10-49"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231210203336.png"></p><ul><li>记录一下部署项目所需要的关键命令</li></ul><ol><li><p>查看端口运行情况</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">netstat -ntlp</span><br></pre></td></tr></table></figure></li><li><p>安装web服务器(centos)</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install nginx</span><br></pre></td></tr></table></figure></li><li><p>如果是ubuntu的话</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install nginx</span><br></pre></td></tr></table></figure></li><li><p>nginx默认主页存放位置</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/share/nginx/html/index.html</span><br></pre></td></tr></table></figure></li><li><p>nginx配置目录</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/etc/nginx/nginx.conf</span><br></pre></td></tr></table></figure></li><li><p>nginx服务器主机配置文件</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/etc/nginx/sites-available/default</span><br></pre></td></tr></table></figure></li><li><p>删除文件</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rm -rf 记录.txt</span><br></pre></td></tr></table></figure></li><li><p>重启nginx</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo service nginx restart</span><br></pre></td></tr></table></figure></li></ol><h3 id="二、心得体会"><a href="#二、心得体会" class="headerlink" title="二、心得体会"></a>二、心得体会</h3><p>将项目成功地部署到云服务器需要多方面的准备和考量。在规划阶段,选择合适的云服务器(不要选择阿里云!!!)、定义所需资源和安全策略至关重要。自动化工具在部署过程中起到关键作用,简化流程、减少错误。建立监控系统是必不可少的,能够实时追踪性能并预防潜在问题。团队合作和有效沟通对于顺利部署也至关重要,同时详实记录部署过程和解决方案有助于日后维护。持续优化、更新和维护保证系统稳定性和安全性。最后,云端部署是一个动态的过程,需要不断适应新的需求和挑战,持续改进以满足项目的演进。这周由于很久没有部署过项目了,有点生疏,所以还能完全将后端项目部署到服务器上,下周应该可以完全将项目部署完成,之后可以专心于前端页面的编写</p>]]></content>
<categories>
<category> 软件工程 </category>
</categories>
</entry>
<entry>
<title>Alpha冲刺3-3</title>
<link href="/2023/12/03/Alpha%E5%86%B2%E5%88%BA3-3/"/>
<url>/2023/12/03/Alpha%E5%86%B2%E5%88%BA3-3/</url>
<content type="html"><![CDATA[<h2 id="Alpha冲刺2-x2F-3-进展及体会"><a href="#Alpha冲刺2-x2F-3-进展及体会" class="headerlink" title="Alpha冲刺2/3 进展及体会"></a>Alpha冲刺2/3 进展及体会</h2><h3 id="一、项目进展"><a href="#一、项目进展" class="headerlink" title="一、项目进展"></a>一、项目进展</h3><ul><li>接口文档</li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231203192529.png"></p><ul><li>后端接口的编写</li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231203192722.png"></p><ul><li>跨域问题的解决,在后端服务器添加一个header,允许所有的域名进行访问</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">headers = {</span><br><span class="line"> <span class="string">"Access-Control-Allow-Origin"</span>: <span class="string">"*"</span>,</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li>前后端接口的交互</li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231203193527.png"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231203193501.png"></p><h3 id="二、心得体会"><a href="#二、心得体会" class="headerlink" title="二、心得体会"></a>二、心得体会</h3><p>当编写后端接口和接口文档时,对系统的整体架构和设计起到了至关重要的作用。在这个过程中,我发现以下几点是非常重要的。1.接口的设计需要清晰简洁,易于理解和使用。良好的接口设计可以最大程度地降低前后端开发人员之间的沟通成本,提高开发效率。2.编写完善的接口文档对于团队协作和项目的可维护性非常重要。文档应包含接口的用途、参数、返回值、可能的错误码等信息,使其易于理解和使用。3. 在接口设计中需要考虑到各种异常情况和边界条件,并提供相应的错误处理机制。同时,保障接口的安全性也是必不可少的,包括数据加密、身份验证等方面。4.与前端开发人员的密切合作至关重要。及早解决可能出现的接口问题和异常,提前进行接口联调和测试,确保前后端的顺畅通信和系统的稳定性。5. 接口设计是一个持续优化和迭代的过程。根据实际使用情况和反馈,不断优化接口设计和文档,提高系统的性能和用户体验。总的来说,编写后端接口和接口文档是项目中非常重要的一环,它直接影响了用户对于网页功能的体验。</p>]]></content>
<categories>
<category> 软件工程 </category>
</categories>
</entry>
<entry>
<title>Alpha冲刺2-3</title>
<link href="/2023/11/25/Alpha%E5%86%B2%E5%88%BA2-3/"/>
<url>/2023/11/25/Alpha%E5%86%B2%E5%88%BA2-3/</url>
<content type="html"><![CDATA[<h2 id="Alpha冲刺2-x2F-3-进展及体会"><a href="#Alpha冲刺2-x2F-3-进展及体会" class="headerlink" title="Alpha冲刺2/3 进展及体会"></a>Alpha冲刺2/3 进展及体会</h2><h3 id="一、项目进展"><a href="#一、项目进展" class="headerlink" title="一、项目进展"></a>一、项目进展</h3><ul><li>本周的进展主要是前端界面进行了美化,并且重新设计了一下功能</li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231125163229.png"></p><ul><li><p>这我主要负责了把训练好的模型应用到后端,输入图片的路径就可以输出检测的结果</p><ol><li><p>首先,研究了SAFNet的模型训练代码</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">data_path = <span class="string">'./data/SAFNet'</span></span><br><span class="line">data_traingt = sio.loadmat(os.path.join(data_path, <span class="string">'mask_train.mat'</span>))[<span class="string">'mask_train'</span>]</span><br><span class="line">data_testgt = sio.loadmat(os.path.join(data_path, <span class="string">'mask_test.mat'</span>))[<span class="string">'mask_test'</span>]</span><br><span class="line">im1 = sio.loadmat(os.path.join(data_path, <span class="string">'data_1.mat'</span>))[<span class="string">'data'</span>]</span><br><span class="line">im2 = sio.loadmat(os.path.join(data_path, <span class="string">'data_2.mat'</span>))[<span class="string">'data'</span>]</span><br></pre></td></tr></table></figure><p>这里需要注意,读入数据时的通道数是1维,所以当在网页的后端读取bmp图片的格式,要注意把3通道的数据读入到一个通道里面</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">im1 = io.imread(os.path.join(origin, path1))[:, :, <span class="number">0</span>].astype(np.float32)</span><br><span class="line">im2 = io.imread(os.path.join(origin, path2))[:, :, <span class="number">0</span>].astype(np.float32)</span><br></pre></td></tr></table></figure><p>然后就是利用输入的图像来创建Patch,并利用创建的Patch来对模型进行训练,这里创建的Patch数量等于gt中元素大于1的个数</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建Patch:数量等于gt中元素大于1的个数</span></span><br><span class="line">train_1, labels ,_ = createImgCube(im1, data_traingt, createPosWithoutZero(im1, data_traingt), windowSize=windowSize)</span><br><span class="line">train_2, _ ,_ = createImgCube(im2, data_traingt, createPosWithoutZero(im2, data_traingt), windowSize=windowSize)</span><br></pre></td></tr></table></figure><p>再之后做的就是数据增强,并且按照一定的比例划分训练集和测试集,最后在生成检测图片的时候,同样也是按照Patch进行生成的,先对小的区域进行检测,最后再把小的区域总共合起来</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(height):</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(width):</span><br><span class="line"> <span class="comment"># if preclassify_lab[i, j]!= 1.5:</span></span><br><span class="line"> <span class="comment"># outputs[i, j] = preclassify_lab[i, j]</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># else:</span></span><br><span class="line"> patch1 = im1[i:i+windowSize, j:j+windowSize, :]</span><br><span class="line"> patch1 = patch1.reshape(<span class="number">1</span>, patch1.shape[<span class="number">0</span>], patch1.shape[<span class="number">1</span>], patch1.shape[<span class="number">2</span>])</span><br><span class="line"> X_test_image = torch.FloatTensor(patch1.transpose(<span class="number">0</span>, <span class="number">3</span>, <span class="number">1</span>, <span class="number">2</span>)).to(device)</span><br><span class="line"></span><br><span class="line"> patch2 = im2[i:i+windowSize, j:j+windowSize, :]</span><br><span class="line"> patch2 = patch2.reshape(<span class="number">1</span>, patch2.shape[<span class="number">0</span>], patch2.shape[<span class="number">1</span>], patch2.shape[<span class="number">2</span>])</span><br><span class="line"> X_test_image1 = torch.FloatTensor(patch2.transpose(<span class="number">0</span>, <span class="number">3</span>, <span class="number">1</span>, <span class="number">2</span>)).to(device)</span><br><span class="line"></span><br><span class="line"> _, _, prediction = model(X_test_image, X_test_image1)</span><br><span class="line"> prediction = np.argmax(prediction.detach().cpu().numpy(), axis=<span class="number">1</span>)</span><br><span class="line"> outputs[i][j] = prediction</span><br><span class="line"> <span class="keyword">if</span> i % <span class="number">20</span> == <span class="number">0</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">'... ... row '</span>, i, <span class="string">' handling ... ...'</span>)</span><br></pre></td></tr></table></figure></li><li><p>其次,利用保存的模型参数在本地编写了检测SAR图片的脚本,之后后端只需要调用该函数便可以得到检测出的结果</p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231125164738.png"></p></li></ol></li><li><ol start="3"><li>图片的检测结果如下所示</li></ol></li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231125165100.png"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231125165238.png"></p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231125165342.png"></p><h3 id="二、心得体会"><a href="#二、心得体会" class="headerlink" title="二、心得体会"></a>二、心得体会</h3><p>这周仔细研究了论文和代码之后,收获还是很大的,理解了大部分的代码,并且自己也利用了保存的模型实现了检测的效果。总而言之,下周继续加油吧。</p>]]></content>
<categories>
<category> 软件工程 </category>
</categories>
</entry>
<entry>
<title>Alpha冲刺1-3</title>
<link href="/2023/11/19/Alpha%E5%86%B2%E5%88%BA1-3/"/>
<url>/2023/11/19/Alpha%E5%86%B2%E5%88%BA1-3/</url>
<content type="html"><![CDATA[<h2 id="Alpha冲刺1-x2F-3-进展及体会"><a href="#Alpha冲刺1-x2F-3-进展及体会" class="headerlink" title="Alpha冲刺1/3 进展及体会"></a>Alpha冲刺1/3 进展及体会</h2><h3 id="一、项目进展"><a href="#一、项目进展" class="headerlink" title="一、项目进展"></a>一、项目进展</h3><ul><li>首先,本周开展了一次站立会议,给各个成员进行了分工,分工如下</li></ul><table><thead><tr><th align="center">小组成员</th><th align="center">分工</th></tr></thead><tbody><tr><td align="center">甘海</td><td align="center">模型训练</td></tr><tr><td align="center">孙延都</td><td align="center">后端开发</td></tr><tr><td align="center">檀宗晗</td><td align="center">后端开发</td></tr><tr><td align="center">安戈新</td><td align="center">前端开发</td></tr><tr><td align="center">韩翔</td><td align="center">前端开发</td></tr></tbody></table><ul><li><p>创建了<a href="https://github.com/shineahead/OUC_Software_2023_Group05">Github仓库</a>,并为每位同学创建了各自的分支,独立开发,互不干扰</p><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231119010719.png"></p></li><li><p>对于我来说,确定了项目所使用的神经网络模型——SAFNet,并进行了模型的训练和参数保存</p><ol><li><p>配置Pytorch环境</p><ul><li><p>创建虚拟环境(在anaconda prompt命令行中)</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda create -n yourname python=<span class="number">3.8</span></span><br></pre></td></tr></table></figure></li><li><p>进入到该虚拟环境</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda activate pytorch</span><br></pre></td></tr></table></figure></li><li><p>在该环境中下载pytorch包(在官网找到下载链接)</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118</span><br></pre></td></tr></table></figure></li><li><p>要检查是否安装成功,依次在命令行输入</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">python</span><br><span class="line"><span class="keyword">import</span> torch</span><br><span class="line">torch.cuda.is_available()</span><br></pre></td></tr></table></figure></li><li><p>当发现jupyter notebook打开没有所创建的虚拟环境的时候,安装如下的包即可解决</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda install nb_conda</span><br></pre></td></tr></table></figure></li></ul></li><li><p>模型训练及保存:由于该神经网络比较庞大,有很多细节等之后研读参考论文之后才能搞清楚,目前仅能掌握大概用法及思路<br><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231119011331.png"></p></li></ol></li><li><ol start="3"><li>将成果推送到Github仓库中<br><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//20231119011627.png"></li></ol></li></ul><h3 id="二、心得体会"><a href="#二、心得体会" class="headerlink" title="二、心得体会"></a>二、心得体会</h3><ul><li>在进行模型的训练的过程中,代码中的很多函数和模块的用法不清楚,所以导致在分析模型的时候懵懵懂懂。希望下周结合参考论文之后能够对神经网络的理解更加清晰。并且目前我尚不清楚如何在Django后端调用训练好的网络模型来进行SAR模型的预测,这也只能边做边学了</li><li>这一周由于作业要求出的较晚,所以准备地比较匆忙。但是经过站立会议之后,每个人都了解项目的概况,并且进行了项目的分工。此外,我们还确定了项目所使用到的技术路线,以及将要学习的方向。思路清晰了之后,每个人就都有了努力的方向,还要注意团队的沟通交流,有什么困难都可以提出来大家一块解决。事实上,在老师所给实验要求下,我们团队的协作流程已经趋于合理化、规范化了。万事开头难,确定好分工后,大家齐头并进,期间多沟通,多交流,我们一定能够实现目标!</li></ul>]]></content>
<categories>
<category> 软件工程 </category>
</categories>
</entry>
<entry>
<title>自我介绍</title>
<link href="/2023/09/22/%E8%87%AA%E6%88%91%E4%BB%8B%E7%BB%8D/"/>
<url>/2023/09/22/%E8%87%AA%E6%88%91%E4%BB%8B%E7%BB%8D/</url>
<content type="html"><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>其实此网站很早就建立了,但是由于本人非常懒,写博客又太麻烦了,所以一直没怎么动过。现在借着软件工程这门课慢慢修缮一下此网站吧……..如果我能坚持写的话</p><h3 id="一、基本信息"><a href="#一、基本信息" class="headerlink" title="一、基本信息"></a>一、基本信息</h3><ul><li>昵称:shineahead,为什么叫这个,是因为懒得取名字所以一直用这个</li><li>兴趣爱好:(洗澡算不算?)也会玩一些小游戏之类的,成分比较复杂,造梦西游3、塞尔达、LOL都沾点</li><li>常用的软件:还得是B站,大多数娱乐放松时间都投在上面了</li><li>喜欢的音乐:什么都听,听的比较杂,偏爱的还是古风一些的音乐吧</li><li>个性签名:少想多做</li><li>学校背景:海带人,海带魂,海带都是人上人(快run)</li></ul><p><img src="https://cdn.jsdelivr.net/gh/shineahead/imageBed@main//IMG_4193(20230923-112733).JPG" alt="111"></p><hr><h3 id="二、介绍自己的成就"><a href="#二、介绍自己的成就" class="headerlink" title="二、介绍自己的成就"></a>二、介绍自己的成就</h3><h4 id="具备的专业知识能力"><a href="#具备的专业知识能力" class="headerlink" title="具备的专业知识能力"></a>具备的专业知识能力</h4><p>其实我觉着现在自己的状态都是各方面知识都稍微懂那么一点点,但就到此为止了,没有选择一方面进行深挖下去,我觉得是很遗憾的一件事。这其中的原因是很复杂的,一方面平日里要卷绩点,本人也不是天赋型选手,做不到期末一周速通专业课,所以平日里就需要多积累积累了。另一方面也是缺乏一定的动力,因为研究许多东西吧有时候没有足够的正反馈,比如说学了好几个月的算法跟没学一样,在心里就会生出一种自己不适合算法的想法,然后就很难坚持下去了。</p><h4 id="获得的奖项"><a href="#获得的奖项" class="headerlink" title="获得的奖项"></a>获得的奖项</h4><blockquote><p>本人比较菜,所以获得的奖项都是一些水奖</p></blockquote><ul><li>数学建模国赛省二</li><li>数学建模美赛H奖</li><li>数学建模MathorCup国一:这个国一还是让我挺意外的,虽然是个水赛,但是是前5%也挺让人高兴的</li><li>蓝桥杯省三:鉴定为纯纯的菜鸡</li></ul><h4 id="缺少的能力"><a href="#缺少的能力" class="headerlink" title="缺少的能力"></a>缺少的能力</h4><p>这可多了去了,算法太菜,网站开发也生疏了,linux操作不熟悉,英语水平也垃圾……</p><hr><h3 id="三、未来三年的设想"><a href="#三、未来三年的设想" class="headerlink" title="三、未来三年的设想"></a>三、未来三年的设想</h3><p>本人是热衷于读研读博的,所以在接下来的一年内的首要目标还是要稳住rank排名,争取能够保研去到一个不错的学校。等到了大四,那时候就可以不需要卷绩点了,也就可以去做一些自己喜欢做的事情了,比如学一门乐器——想学吉他很久了。嗯~,也需要多注意运动运动,因为本人胃口不太行,吃饭都吃不太下。现在这篇博客相当于一个时空胶囊了,希望一年后的今天能够实现自己的设想</p>]]></content>
<categories>
<category> 杂谈 </category>
</categories>
</entry>
<entry>
<title>数组越界检测</title>
<link href="/2021/03/25/%E6%95%B0%E7%BB%84%E8%B6%8A%E7%95%8C%E6%A3%80%E6%B5%8B/"/>
<url>/2021/03/25/%E6%95%B0%E7%BB%84%E8%B6%8A%E7%95%8C%E6%A3%80%E6%B5%8B/</url>
<content type="html"><![CDATA[<h2 id="前言111"><a href="#前言111" class="headerlink" title="前言111"></a>前言111</h2><p>该文章用来记录一次简单的数组越界检测,<a href="http://222.195.149.139:20500/">查看实验手册</a> </p><p>用到的知识仅有c++基础语法和两个简单的STL容器:vector和map以及一颗耐心</p><hr><h1 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h1><h3 id="实验的一些小理解"><a href="#实验的一些小理解" class="headerlink" title="实验的一些小理解"></a>实验的一些小理解</h3><p>该实验主要可以分成两个部分:</p><ul><li>一是数组和变量的定义(都存储在VarDelList中)</li><li>二是数组和变量的使用(都存储在ArrayUseList中)</li><li>注:grammartype我在此实验中并没有用到</li></ul><hr><h3 id="实验的结构体解析"><a href="#实验的结构体解析" class="headerlink" title="实验的结构体解析"></a>实验的结构体解析</h3><ul><li><p>struct ArrExpr:</p><blockquote><p>std::string id: 表示该数组的名称</p><p>int dimension:表示该数组的维度</p><p>std::vector<struct Expression*> length:</p><blockquote><p>以我个人片面的理解来看,vector相当于一个加强版的数组,它可以在里面存各种类型的数据,比较好用</p><p>length[0]表示该数组的第一个维度的表达式。例如a[0],那么length[0]的值则为0</p><p>length[1]表示该数组的第二个维度的表达式。例如a(4)(5)(此处以()来代替[],避免关键符号),那么length[0]的值则为4,length[1]的值则为5</p><p>事实上,length[x]代表一个一个vector括号里的元素,即是struct Expression*</p></blockquote></blockquote></li><li><p>struct Expression:</p></li><li><blockquote><p>int grammartype:不同语法的种类(目前没有发现有什么特别大的用处)</p><p>std::string digitsequence:表示该表达式内的纯数字,一看就明白吧。例如:a[5],digitsequence的值为” 5 “ </p><blockquote><p>==要注意,这里的值都是字符串类型的,需要使用stoi()函数把它变成整型的==</p><blockquote><p><strong>!!!stoi函数不能用在一个空的字符串上,否则会报错</strong></p><p><img src="https://s2.loli.net/2022/03/25/8gpIblhLunzJOYv.png" alt="stoi.png"></p></blockquote></blockquote><p>std::string id: 表示该表达式内的变量名,一般是数组表达式里面的引用变量,例如a[n],id则等于n</p><p>std::string op:表示该表达式内的运算符号,例如:’ + ‘, ‘ - ‘, ‘ * ‘, ‘ / ‘;</p><p>srtuct ArrExpr*:表示该表达式有一个数组,例如:b[a[0]];</p><p>struct Expression* expr:表示该表达式内还有表达式,很好理解。一般此元素不会会单独出现,都会和其他的如数字和变量一起,例如:b[n + 65],那么后面这个数字65就是下一级的expression里的数字了;</p><blockquote><p>当表达式内有运算符号时,此时就比较麻烦了,需要考虑各种类型的混合运算,此处先略过,在下文讲解函数时细说;</p></blockquote></blockquote><ul><li><p>struct ArrayUse:</p></li><li><blockquote><p><strong>注:此结构体表示数组的赋值表达式</strong></p></blockquote><blockquote><p>int grammartype:不同语法的种类(目前没有发现有什么特别大的用处);</p><p>struct ArrExpr *arrexpr:表示数组的结构体,容易理解;</p><p>struct Expression *expression:表示一个赋值的表达式,例如:a[10] = n,那么n就是存储在expression里面的变量;</p><p>std::string id:表示变量的名称,一般用于给单变量赋值的,例如:n = 10;</p><p>std::string op:表示赋值的运算符号,在此实验中仅有” = “;</p></blockquote><ul><li><p>struct VarDef:</p></li><li><blockquote><p><strong>注:此结构体表示数组的声明表达式</strong></p></blockquote><blockquote><p>int grammartype:不同语法的种类(目前没有发现有什么特别大的用处);</p><p>std::string id:表示声明元素的名称,例如:int n;int a[100];</p><p>int dimension:表示数组的维度,单变量是没有该项的</p><p>std::vector<struct Expression*> length</p><blockquote><p>和前文所叙述的作作用一样</p></blockquote></blockquote></li></ul></li></ul></li></ul><hr><h3 id="实现思路"><a href="#实现思路" class="headerlink" title="实现思路"></a>实现思路</h3><ul><li>该实验的核心思想就是要算出expression里面的值,然后与存储在idmap里面的进行比较,判断是否出现了数组索引越界的情况,故问题就简化成了如何写int op_expression(Expression *expression);</li><li>而该函数内首要就是要判断expression里面的各种元素是否存在</li><li>该函数的返回值就应该是数组的索引值</li><li>这里为了便于处理expression里面存在数组的情况又写了一个int op_array(ArrExpr *arrexpr),</li><li>该函数的返回值是数组里面存储的值,例如:a[100] = 10, 那么这个函数的任务就是返回10</li><li><strong>这次实验我认为比较巧妙的地方就是这上面上个函数互相调用处理,互相递归,简化了问题处理</strong></li></ul><h3 id="实验的函数分析"><a href="#实验的函数分析" class="headerlink" title="实验的函数分析"></a>实验的函数分析</h3><ul><li><pre><code class="c++">int op_expression(Expression* expression)<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- > 1.判断表达式内的元素</span><br><span class="line"> ></span><br><span class="line"> > > ```c++</span><br><span class="line"> > > if (expression->digitsequence.empty())</span><br></pre></td></tr></table></figure>> >> > 判断里面是否有数字,empty函数用来判断容器是否为空,较于stoi和c_str()更加方便>> > <figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (expression->id.<span class="built_in">empty</span>())</span><br></pre></td></tr></table></figure>> >> > 判断里面是否存在变量n之类的>> > <figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (expression->op.<span class="built_in">empty</span>())</span><br></pre></td></tr></table></figure>> >> > 判断里面是否存在运算符号>> > <figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (expression->arrexpr)</span><br></pre></td></tr></table></figure>> >> > 判断里面是否存在数组元素> >> > > ==注:为了向下判断数组的时候方便,定义一个全局布尔型的变量checkflag==> >> > > 为了便于向下取数组的值的时候更加便利,定义此变量。一旦发现任何一个数组出现了越界行为,便把checkflag的值变成true。同时在op_experssion中判断一下checkflag,如果为true的话直接返回一个负值,然后在checker.cpp里面判断checkflag</code></pre></li><li><pre><code class="c++">int op_array(ArrExpr *arrexpr)<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- > 1.判断数组的维度</span><br><span class="line"> ></span><br><span class="line"> > > - ```c++</span><br><span class="line"> > > if (arrexpr->dimension == 1){</span><br><span class="line"> > > }</span><br><span class="line"> > > else if (arrexpr->dimension == 2){</span><br><span class="line"> > > }</span><br></pre></td></tr></table></figure>>> 2.判断该数组是否越界>> > - ```c++> > uselen1 = op_expression(arrexpr->length[0]);> > uselen2 = op_expression(arrexpr->length[1]);> >> > if (uselen1 >= idmap[id] || uselen2 >= idmap[id + "1"] || uselen1 < 0 || uselen2 < 0)> > <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"> 以二维数组为例,这里op_array函数调用了op_expression函数</span><br><span class="line"></span><br><span class="line">3.取出数组的赋值</span><br><span class="line"></span><br><span class="line">- ```c++</span><br><span class="line"> value = idmap[id + to_string(uselen1) + to_string(uselen2)]</span><br></pre></td></tr></table></figure>> >> > 以二维数组为例</code></pre></li><li><p>```c++<br>void checker()</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">> 1.声明数组</span><br><span class="line">></span><br><span class="line">> > 声明的时候注意判断该声明是单变量还是数组</span><br><span class="line">> ></span><br><span class="line">> > ```c++</span><br><span class="line">> > if (!def->dimension)</span><br></pre></td></tr></table></figure><blockquote><blockquote><p><strong>表示没有维度,说明是单变量</strong></p></blockquote><p>2.使用数组 </p><blockquote><p>每次使用数组的时候记得保存数组的值,以防之后可能会调用该值</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">value = <span class="built_in">op_expression</span>(arruse->expression);</span><br><span class="line">idmap[id + <span class="built_in">to_string</span>(uselen1) + <span class="built_in">to_string</span>(uselen2)] = value;</span><br></pre></td></tr></table></figure></blockquote></blockquote></li></ul><hr><h3 id="实验心得"><a href="#实验心得" class="headerlink" title="实验心得"></a>实验心得</h3><p>万事开头难,此言得之。刚开始也是反复看了好几遍实验手册才把各种结构体给弄清楚,各种嵌套啥的。其实这次实验的收获还是蛮大的,除了自己思考了实现代码的逻辑层之外,还发现和学会了几种函数的用法,最重要的让我明白了:某些东西看不懂是由于不熟悉而造成的,实际上的难度可能并没有那么大。总而言之,千万不要轻言放弃,放弃之后再想坚持就难了</p><hr><h1 id="感谢阅读"><a href="#感谢阅读" class="headerlink" title="感谢阅读"></a>感谢阅读</h1>]]></content>
<categories>
<category> 编程学习 </category>
</categories>
</entry>
</search>