tag:blogger.com,1999:blog-27507847556252920012024-02-22T01:07:43.878+09:00Untitled blogAnonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.comBlogger183125tag:blogger.com,1999:blog-2750784755625292001.post-35155768997853494592014-09-30T00:57:00.001+09:002014-10-01T22:38:15.642+09:00delphi IDE ライブラリサーチパスの優先順位プロジェクトのサーチパス -> IDEのサーチパス の順で見る<br>
<iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?t=kuni255-22&o=9&p=8&l=as1&asins=4774104272&ref=qf_sp_asin_til&fc1=000000&IS2=1<1=_blank&m=amazon&lc1=0000FF&bc1=000000&bg1=FFFFFF&f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-26990370404930779972014-09-28T04:34:00.001+09:002014-09-28T22:03:34.684+09:00クロスプラットフォームなC/C++ IDE CLion を使ってみた標題通り Windows<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2e51e478-dbeb-483b-8e98-a9e15c76a803" id="9129cde7-4975-46d6-b488-e5f7b9005715"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="d46b0c0a-aff2-4fe9-a251-a6c71b486634" id="ed33a160-244b-4c96-bac9-9a3ce50b1117"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c7be727e-9f2e-4594-a4f1-2dbb6e62118c" id="aca6b60f-8e58-47c2-a48e-379c564df7c6">,</span></span></span>Linux<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2e51e478-dbeb-483b-8e98-a9e15c76a803" id="b8ca616c-e09d-4d80-9ee1-2b103b281aec"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="d46b0c0a-aff2-4fe9-a251-a6c71b486634" id="0f831d9c-c2ba-45ee-a10c-c60555b24148"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c7be727e-9f2e-4594-a4f1-2dbb6e62118c" id="1bbf07ec-a9cf-4c0b-99bb-f83abc223305">,</span></span></span>Mac で使えるC/C++のIDE <a href="http://www.jetbrains.com/clion/" target="_blank">CLion</a>をMac OS X (10.9<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2e51e478-dbeb-483b-8e98-a9e15c76a803" id="c0c2a5e8-da24-4e90-8525-d74906432cbb"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="d46b0c0a-aff2-4fe9-a251-a6c71b486634" id="60c5cd39-9c5a-4470-b718-aa6230bc0db2"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c7be727e-9f2e-4594-a4f1-2dbb6e62118c" id="19c2b42e-72bb-45bf-8976-69cd39d02680">)</span></span></span>で使ってみた。<br />
<div>
現在のところβ版扱いで60日間に限り無料で使える。</div>
<div>
<br /></div>
<div>
以下CLionのスクリーンショット。</div>
<div>
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX1dIkaEpKs7tGYm95EyNjHFoBXps6BZGdhuEIetcGoAr7uON6vtmhGfx-AULJcLkJ7no4Q0nQb911ej-VjRk9TFYlRUwTvUOBDfKCuBawrN9R8FLWABEMCPqJXe_Xms1ZrX-BZV6svvx6/s1600/Screen+Shot+2014-09-28+at+4.14.42.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX1dIkaEpKs7tGYm95EyNjHFoBXps6BZGdhuEIetcGoAr7uON6vtmhGfx-AULJcLkJ7no4Q0nQb911ej-VjRk9TFYlRUwTvUOBDfKCuBawrN9R8FLWABEMCPqJXe_Xms1ZrX-BZV6svvx6/s1600/Screen+Shot+2014-09-28+at+4.14.42.png" height="228" width="320" /></a></div>
<br />
特徴としては、以下2点が挙げられる。<br />
・コンパイル関係の設定をCMakeList.txtに書いていく<br />
・Vim Emulator<br />
<br />
試しにOpenCVを使ってMBAのiSightのキャプチャをしてみた。OpenCVはVer.2.4.9をソースからコンパイルして/opt/OpenCV/2.4.9配下にインストールしたものを利用する。<br />
以下main.cpp<br />
<pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: 'Menlo'; font-size: 12pt;"><span style="color: #80b000;">#include</span><span style="color: #6a8759;"> <<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="34ae1983-11d1-4b77-8d95-2e03853f433b" id="527f721e-aeb2-4a17-9f54-f586b61598a4">iostream</span>></span><span style="color: #80b000;">#include</span><span style="color: #6a8759;"> "opencv2/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="5b85c98d-3f5e-42e5-8557-e2fa2a31aae7" id="61720e2c-4abe-4210-8926-2c41558b6bf9">objdetect</span>/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="5b85c98d-3f5e-42e5-8557-e2fa2a31aae7" id="f8ea1811-37b7-41db-937a-130b394cff4b">objdetect</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="5b85c98d-3f5e-42e5-8557-e2fa2a31aae7" id="6104e550-9915-4ebc-85be-8f41531e6642">.</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="5b85c98d-3f5e-42e5-8557-e2fa2a31aae7" id="58fcf44d-2562-4764-a62b-22352b8939ab">hpp</span>"</span><span style="color: #80b000;">#include</span><span style="color: #6a8759;"> "opencv2/highgui/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="b668c136-027a-4f8c-9d45-383ac10507c4" id="5947569d-ac9b-4817-a1a6-ea9892ec744d">highgui</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="b668c136-027a-4f8c-9d45-383ac10507c4" id="082ca7fc-db19-4f44-a9b6-581a7cad4ee5">.</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="b668c136-027a-4f8c-9d45-383ac10507c4" id="76e1b0b0-a7cb-4003-8c39-1479d44ddb99">hpp</span>"</span><span style="color: #80b000;">#include</span><span style="color: #6a8759;"> "opencv2/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="19dfa507-9b6e-473a-a895-f0f7b10d0f08" id="0152d613-aa35-435f-b3d4-598d56c7c3db">imgproc</span>/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="19dfa507-9b6e-473a-a895-f0f7b10d0f08" id="48b55d82-e443-42cc-abdb-9b126ff25484">imgproc</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="19dfa507-9b6e-473a-a895-f0f7b10d0f08" id="fd52d193-1dab-4ebf-9165-01a64e67e310">.</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="19dfa507-9b6e-473a-a895-f0f7b10d0f08" id="ee7dc794-8465-4726-80a6-143990e02fbc">hpp</span>"</span><span style="color: #6a8759;">
</span><span style="color: #cc7832;"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="60d9b7fb-ca75-43b7-9413-1324a4587f64" id="d94b6298-ccb8-4d57-83f4-74e21e067e97">using</span> namespace </span><span style="color: #c7c8f5;"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="60d9b7fb-ca75-43b7-9413-1324a4587f64" id="c6479e4b-8cd5-4b49-a075-e85f0beb0481">std</span></span><span style="color: #cc7832;">;</span><span style="color: #cc7832;"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="dc926eaa-dd70-430b-aedd-8caf33d2f696" id="57605ddc-0570-4353-acef-63ef1344b35c">using</span> namespace </span><span style="color: #c7c8f5;"></span><span style="color: #c7c8f5;"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="dc926eaa-dd70-430b-aedd-8caf33d2f696" id="0f0300c1-8787-4d8a-91ab-870ca36df759">cv</span></span><span style="color: #cc7832;">;</span><span style="color: #cc7832;">
</span><span style="color: #cc7832;">
</span><span style="color: #cc7832;"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="205ddb74-6da6-4a2a-aafd-113e803311d5" id="aeadc5bf-ea14-462b-9305-80f3144f2367">int</span> </span>main<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="205ddb74-6da6-4a2a-aafd-113e803311d5" id="95ee4859-6862-4ec3-8994-b23ee13bfb73">(</span>) {
<span style="color: #c7c8f5;"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="b823af0f-f81c-4f5d-8012-7a6e0b7e52e7" id="3c9fd139-803e-4da9-9cc4-c5ba07090d64">CvCapture</span> </span>*capture<span style="color: #cc7832;">;</span><span style="color: #cc7832;"> </span><span style="color: teal;">Mat </span>frame<span style="color: #cc7832;">, </span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e254b057-3b9c-420b-aa0d-ec78cc34b2af" id="32429faa-5c17-4503-afe1-a427d0d840d8">frameCopy</span><span style="color: #cc7832;">,</span><span style="color: #cc7832;"></span><span style="color: #cc7832;"> </span>image<span style="color: #cc7832;">;</span><span style="color: #cc7832;">
</span><span style="color: #cc7832;"> </span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="eef270c8-65de-4701-8f5f-5a85e958315c" id="e40778dd-ec7a-4a6d-9b88-5977f228f25f">capture</span> = <span style="color: #908b25;"></span><span style="color: #908b25;">cvCaptureFromCAM</span><span style="color: #9373a5;">CV_CAP_ANY</span><span style="color: #cc7832;">;</span>()<span style="color: #cc7832;">
</span><span style="color: #cc7832;"> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f3e5f193-98c2-4e72-8b1e-fed1ea52d3be" id="a9c3e332-e42a-4453-924d-f00e44892bde">if</span></span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f3e5f193-98c2-4e72-8b1e-fed1ea52d3be" id="77171173-b4fb-4439-af01-1e083ec707ee">(</span>capture== <span style="color: #908b25;">NULL</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f3e5f193-98c2-4e72-8b1e-fed1ea52d3be" id="f7c30107-433b-414c-be52-b6756e5d1f09">)</span>{
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="ecd90eca-37f4-425b-bf5b-6918d2f3f133" id="a3cee746-5e97-4eda-9de9-f1e5a88a6444">cout</span> <span style="color: teal;"><< </span><span style="color: #6a8759;">"Failed to open camera" </span><<<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="ecd90eca-37f4-425b-bf5b-6918d2f3f133" id="85a403d2-237f-4db9-b2d8-c1f29ed77ee6">endl</span><span style="color: #cc7832;">;</span><span style="color: #cc7832;">
</span><span style="color: #cc7832;"> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="15af2483-6eeb-43be-ae25-5b8238baee58" id="1ec42035-d9b7-4471-bfaa-7f9bdc36b20a">return</span> </span>-<span style="color: #6897bb;">1</span><span style="color: #cc7832;">;</span><span style="color: #cc7832;"> </span>}
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2984ca79-837d-48c9-8b57-eef336c38fa1" id="71a340f4-ae89-43b7-b5d1-5c7ff12e9aa2">cvNamedWindow</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2984ca79-837d-48c9-8b57-eef336c38fa1" id="1efe6e86-c6d4-42bd-af12-a76096e06c83">(</span><span style="color: #6a8759;">"Result"</span><span style="color: #cc7832;">,</span><span style="color: #cc7832;"></span><span style="color: #cc7832;"> </span><span style="color: #9373a5;">CV_WINDOW_AUTOSIZE</span>)<span style="color: #cc7832;">;</span><span style="color: #cc7832;"> </span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="601aeeb6-f6b0-4614-9b32-aefd966a160f" id="647711c7-9a11-4393-984b-9f79d74060d0">cout</span> <span style="color: teal;"><< </span><span style="color: #6a8759;">"Captureing... " </span><< <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8571dc96-6930-4573-a502-b99e19d61e13" id="dd8ca4d6-07ba-4bbf-95b6-1fd7d2e815a6">endl</span><span style="color: #cc7832;">;</span><span style="color: #cc7832;"></span><span style="color: #cc7832;">
</span><span style="color: #cc7832;"> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="11b38c74-1963-41a6-ada7-c40794a7212a" id="0938cc6a-8b37-4091-a973-26d23de6165e">while</span> </span>(<span style="color: #6897bb;">1</span>) {
<span style="color: #c7c8f5;"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="93abe8c4-2387-40f4-a894-363862adbec2" id="4e26e6a2-e196-4360-bf11-2c2c55bd587d">IplImage</span> </span>*iplImage = cvQueryFrame<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="93abe8c4-2387-40f4-a894-363862adbec2" id="823ad3c8-0358-4d76-b2c4-cb9b674743b5">(</span>capture)<span style="color: #cc7832;">;</span><span style="color: #cc7832;"> </span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8e795258-3c27-4bff-9080-ad33436ae63e" id="d3a26db6-f2d3-4cc9-ad91-ff7fc9334af7">frame</span> <span style="color: teal;">= </span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8e795258-3c27-4bff-9080-ad33436ae63e" id="04987100-7b5e-4dae-8624-b1d8946faa27">iplImage</span><span style="color: #cc7832;">;</span><span style="color: #cc7832;"> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f248be18-d0c0-493e-a747-a1071d3665eb" id="1868b27a-3e31-42fe-ab70-1a51be4fe8db">if</span> </span>(frame<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f248be18-d0c0-493e-a747-a1071d3665eb" id="ed4c3edb-cd4a-4960-95a7-1f37736c6593">.</span>empty<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f248be18-d0c0-493e-a747-a1071d3665eb" id="538c6eb6-92f2-4dd9-ab1d-3dd58247d427">(</span>)) <span style="color: #cc7832;">break;</span><span style="color: #cc7832;"> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="854ec9a5-9a8c-48ca-9588-aa5baa560015" id="d56d9d3f-86b1-466f-bc61-18f2f29eff90">if</span> </span>(<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="854ec9a5-9a8c-48ca-9588-aa5baa560015" id="7289f14e-cc38-408a-a275-584e37780e7e">iplImage</span>-><span style="color: #9373a5;">origin </span>== <span style="color: #908b25;">IPL_ORIGIN_TL</span>) {
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="fe2ca498-3fa8-4eea-82c3-e7101536d298" id="155ad865-10bb-43da-902c-298e0e81281d">frame</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="fe2ca498-3fa8-4eea-82c3-e7101536d298" id="0c3ed63f-3eb9-422a-a407-3152abe903ba">.</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="fe2ca498-3fa8-4eea-82c3-e7101536d298" id="67c2d83e-ef63-443b-91cc-58aaa8dc67b3">copyTo</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="fe2ca498-3fa8-4eea-82c3-e7101536d298" id="7aff349f-c880-4954-8c5b-393407bb0702">(</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="fe2ca498-3fa8-4eea-82c3-e7101536d298" id="8854c232-0ef0-46b8-974b-87638b9a0e23">frameCopy</span>)<span style="color: #cc7832;">;</span><span style="color: #cc7832;"> </span>} <span style="color: #cc7832;"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="052e0d6f-38cc-422d-8e01-cb7b4d5716c8" id="a0d0368c-0af5-4410-badb-2513c40bad53">else</span> </span>{
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="915ee65e-5e56-4c7c-aa7e-f7737d5bf994" id="739ce60c-daa2-4d86-b028-cbf11bc6f265">flip</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="915ee65e-5e56-4c7c-aa7e-f7737d5bf994" id="cf12ca00-4217-4a9b-9d5f-ee10e983b75e">(</span>frame<span style="color: #cc7832;">, </span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="915ee65e-5e56-4c7c-aa7e-f7737d5bf994" id="74971a4f-9063-44cd-8870-d5f999a43471">frameCopy</span><span style="color: #cc7832;">,</span><span style="color: #cc7832;"></span><span style="color: #cc7832;"> </span><span style="color: #6897bb;">0</span>)<span style="color: #cc7832;">;</span><span style="color: #cc7832;"> </span>}
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8f47ade1-2fde-4de3-8712-7521deff933d" id="cfbc69da-d146-4f75-99c2-531ac56ffcd1">cvShowImage</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8f47ade1-2fde-4de3-8712-7521deff933d" id="2e3a9a83-8444-4fd9-95c7-a100b89daee2">(</span><span style="color: #6a8759;">"result"</span><span style="color: #cc7832;">, </span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8f47ade1-2fde-4de3-8712-7521deff933d" id="50090adb-b36a-4823-a09f-1f6b7e52821e">iplImage</span>)<span style="color: #cc7832;">;</span><span style="color: #cc7832;"> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2ac4cfcf-16ae-4e98-91cc-1f88981b873c" id="07c21497-8f61-4400-9e49-f1a7cef810c6">if</span> </span>(<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2ac4cfcf-16ae-4e98-91cc-1f88981b873c" id="bc7e2c21-46cf-4716-b1a8-a101d43fcb83">waitKey</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2ac4cfcf-16ae-4e98-91cc-1f88981b873c" id="57bd8bc1-7c54-4832-a646-e67a73aafa04">(</span><span style="color: #6897bb;">10</span>) >= <span style="color: #6897bb;">0</span>) <span style="color: #cc7832;">break;</span><span style="color: #cc7832;"> </span>}
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="6e696c5d-e251-44dc-a531-c09329862437" id="768373a0-0a1b-463d-96b1-6dc7b70655fd">cvReleaseCapture</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="6e696c5d-e251-44dc-a531-c09329862437" id="41b149f0-3384-437f-a99c-e0d10c02408c">(</span>&capture)<span style="color: #cc7832;">;</span><span style="color: #cc7832;"> </span>cvDestroyWindow(<span style="color: #6a8759;">"Result"</span>)<span style="color: #cc7832;">;</span><span style="color: #cc7832;"> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="78e88e8b-be46-4967-b1f9-e9966c86a7b3" id="0ce556e5-1506-4a96-9fe0-6aeae35f5eec">return</span> </span><span style="color: #6897bb;">0</span><span style="color: #cc7832;">;</span>}</pre>
そして、以下がCMakeList.txt<br />
<pre style="background-color: #2b2b2b; color: #a9b7c6; font-family: 'Menlo'; font-size: 12pt;">cmake_minimum_required<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="d2af506b-d859-4e0d-9274-b3f90b7912fe" id="53493516-0b14-4dbc-9b89-a7823d3b7be7">(</span><span style="color: #6a8759;">VERSION 2.8.4</span>)
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f2a30c43-e239-4bc9-a23c-04163bba31d5" id="ba3cdbe5-b969-48f3-ab0c-12222d880fa9">project</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f2a30c43-e239-4bc9-a23c-04163bba31d5" id="9fea9410-e310-49fa-8b06-a14b8617e2e9">(</span><span style="color: #6a8759;"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f2a30c43-e239-4bc9-a23c-04163bba31d5" id="bc4da9ae-faef-484b-823b-138bd0738c81">helloCLion</span></span>)
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c1c110ea-098b-462f-8831-e8dfb8777866" id="951e1360-d233-4f0e-8879-c60315a402dd">set</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c1c110ea-098b-462f-8831-e8dfb8777866" id="fd116d98-4435-4cbd-b908-8bb545ee7cd9">(</span><span style="color: #6a8759;">SOURCE_FILES main.cpp</span>)
add_executable<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8a4cb705-cca2-4a43-a9a3-bce70735efd1" id="eb24662f-bd39-4bb3-a3dd-80e8d27a390c">(</span><span style="color: #6a8759;"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8a4cb705-cca2-4a43-a9a3-bce70735efd1" id="5120f0cb-052e-4d74-89b5-d98caf967420">helloCLion</span> $<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8a4cb705-cca2-4a43-a9a3-bce70735efd1" id="9dc7a472-de7c-4e25-887f-6655366eccc0">{</span>SOURCE_FILES}</span>)
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e57a8719-eabe-4de0-8a4f-e0c53241b060" id="3a941362-912f-4104-9a51-df8c265cbbc0">set</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e57a8719-eabe-4de0-8a4f-e0c53241b060" id="ecb51b1b-5584-43c1-99db-c6028d2b3ec1">(</span><span style="color: #6a8759;">OPENCV_PREFIX_PATH /opt/OpenCV/2.4.9</span>)
set(<span style="color: #6a8759;">OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui</span>)
FIND_PACKAGE<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="ccb339a9-5ba6-4047-a872-26c27181f281" id="ed2e68f5-8dea-4e6b-a3bc-0560fe51b17e">(</span><span style="color: #6a8759;">OpenCV REQUIRED</span>)
INCLUDE_DIRECTORIES<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="fbb855a4-d65a-46fd-ab9e-ae4c3281dca4" id="048bfbc1-cf00-470d-8044-fa17b32ac429">(</span><span style="color: #6a8759;">$<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="fbb855a4-d65a-46fd-ab9e-ae4c3281dca4" id="9731d505-72c0-4e6d-8e1d-6830c5ec9212">{</span>OPENCV_PREFIX_PATH<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="fbb855a4-d65a-46fd-ab9e-ae4c3281dca4" id="b432f51f-dece-4b3a-b71b-52dd4e71d86f">}</span>/include</span>)
LINK_DIRECTORIES<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="15c81b60-e064-4c76-9004-8ec8f0f2ee4f" id="68dc7ade-d5d8-4116-b263-16b9cdb9f415">(</span><span style="color: #6a8759;">$<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="15c81b60-e064-4c76-9004-8ec8f0f2ee4f" id="be9a3caa-576e-4d82-be81-f51d44f1c8a7">{</span>OPENCV_PREFIX_PATH<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="15c81b60-e064-4c76-9004-8ec8f0f2ee4f" id="fc2038eb-9985-44e3-bc48-5cc9669399e7">}</span>/lib</span>)
TARGET_LINK_LIBRARIES<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="7217e909-93ec-49ec-87b0-591744c10747" id="4a013336-08a3-4951-9f0e-4ded54628165">(</span><span style="color: #6a8759;"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="7217e909-93ec-49ec-87b0-591744c10747" id="96227d0a-2b72-440f-a3e6-3bc0ba85ed8e">helloCLion</span> $<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="7217e909-93ec-49ec-87b0-591744c10747" id="49414035-dc20-46a4-9432-555541e3921e">{</span>OpenCV_LIBS}</span>)</pre>
7行目以降がOpenCV関係の設定<br />
<br />
問題は、デバッグしようとするとコンソールに下記が出力されデバッグできない。<br />
/Users/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="56b428e8-8cc6-4563-bd64-b153fa6ece31" id="dda7b15d-fd01-468c-b8e4-ed3ae389fb67"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8da4de99-d0d1-4411-bf63-c086b3951729" id="c0a26c43-24d2-478a-ab69-b2f2fde23cf4">hayato</span></span>/Library/Caches/clion10/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="56b428e8-8cc6-4563-bd64-b153fa6ece31" id="c8270603-69b8-4558-abd0-c0f50fc613cd"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8da4de99-d0d1-4411-bf63-c086b3951729" id="0c2daa97-3d90-44cb-9c90-7142bd71ea1b">cmake</span></span>/generated/6982c880/6982c880/Debug/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="56b428e8-8cc6-4563-bd64-b153fa6ece31" id="c85b0138-916a-4ba3-a4df-16067051fedd"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8da4de99-d0d1-4411-bf63-c086b3951729" id="5f22779b-8b16-4e33-b1bf-42d5d7be5e46">helloCLion</span></span><br />
During <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="ce0a9784-6af6-4054-9a75-d02e8b8b06fc" id="6c137fd2-f060-4cfc-b261-72c581c51436"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="5593408e-8b0b-4cf1-ae06-de8ccc65e9ca" id="036d31d3-b605-4658-adc0-23b64083f871">startup program</span></span> exited with code 1.<br />
<br />
Process finished with exit code 0<br />
<br />
CLionはデバッガとして同梱の(/Applications/CLion EAP.app/Contents/bin/gdb/bin/gdb)を使っているらしく、この<a href="http://qiita.com/takahashim/items/204ffa698afe09bd4e28" target="_blank">gdbにコード証明書があたっていないのが原因か</a>と考えコード証明書をあててみたが現象は改善せず。<br />
<br /></div>
Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-74798341410321397832014-08-17T19:07:00.001+09:002014-08-17T19:07:29.863+09:00Windows の共有ライブラリロード時のサーチパスの優先順位Linux の場合LD_LIBRARY_PATHに依るけどWindowsの場合は、<br />
[1] アプリケーションがロードされたディレクトリ<br />
[2] System directory<br />
[3] 16bit system directory<br />
[4] Windows directory<br />
[5] カレントディレクトリ<br />
[6] 環境変数PATH<br />
<br />
の順らしいです。ということで検証してみた。今回は、検証用の自分自身が配置されている場所を返すプロシージャを含む"studyTest.dll"とそれを用いるコードを書いて確認してみた。<br />
<br />
dllを使用する側のプロセス生成時のカレントディレクトリを起点としたディレクトリとファイルツリーは、下記のようになっている。<br />
<br />
.\ <br />
├─bin<br />
│ studyTest.dll<br />
│ useDll.exe<br />
│ <br />
├─lib<br />
│ studyTest.dll<br />
│ <br />
└─sub<br />
studyTest.dll<br />
<br />
[コマンドプロンプトにおける実行履歴]<br />
> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8486fd61-c25a-4c3f-8108-fea829b09a9f" id="20d5fcb6-f3f7-4f35-ada0-f4fc3a96b173"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="b97b2304-c3d9-4918-b2f0-5ec5cac55568" id="92a1b742-8816-4d95-a523-4af60bf2841e">set</span></span> PATH=%CD%\lib;%PATH%<br />
> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="3e34e751-d602-4a99-aca7-ec504818e6f5" id="a8e83d3e-3c3a-4158-b93e-091447af02fc"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="25ea1c9c-46dd-4303-bb54-83cd3fb8b1e1" id="c4af9f18-ef37-427f-a83a-f32ae89b6d7e">.</span></span>\bin\useDLL.exe<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheYCmZnylzCF2q4LPA5ywl6YsS9j8RuuTDSxt7lGf1i3k_ikVkdgaaOL8pFjx2H3UZpe-7UYCkSrGiwkFXlr1V4c3HT6inhzKQ5R14_PbFXMB_5yu3m2cQQLQ4Z1z899q9BOit-GClrvsL/s1600/01_dllSearchPath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheYCmZnylzCF2q4LPA5ywl6YsS9j8RuuTDSxt7lGf1i3k_ikVkdgaaOL8pFjx2H3UZpe-7UYCkSrGiwkFXlr1V4c3HT6inhzKQ5R14_PbFXMB_5yu3m2cQQLQ4Z1z899q9BOit-GClrvsL/s1600/01_dllSearchPath.png" height="77" width="320" /></a></div>
<br />
"call_Proc"ボタンを押下。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGSYqQmi26XjBrfOLG3c740YqCdS7sJAiQ2lC2PzWuDDxZOWz4xBUmoRdRXJ8gLOiKONegVentOTqliQnTnE0csdkmV68_Jn_dnHkrSKS3QY-8f6FuUwvHL0TwQ3d_c-g_jovF_x5d1RlF/s1600/02_dllSearchPath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGSYqQmi26XjBrfOLG3c740YqCdS7sJAiQ2lC2PzWuDDxZOWz4xBUmoRdRXJ8gLOiKONegVentOTqliQnTnE0csdkmV68_Jn_dnHkrSKS3QY-8f6FuUwvHL0TwQ3d_c-g_jovF_x5d1RlF/s1600/02_dllSearchPath.png" height="110" width="320" /></a></div>
<br />
><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="5003bbe9-1b3c-4120-b666-fac767e7265a" id="d8b9f448-fc26-44e8-a894-9878d53db037">move</span> .\bin\studyTest.dll<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="5003bbe9-1b3c-4120-b666-fac767e7265a" id="494a0949-4e27-485f-ab46-c5f74e64f5e0"> .</span>\bin\studyTest_A.dll<br />
"call_Proc"ボタンを押下。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKtmWcJ_UqJmW7yPtYoDfGYcllbsb7a6ycB5C7IBpUV9vUWfG3NuM3tbKFD8uwZKjuUeG0HmVTADZb8WCMKpPLsNvx12BCOUw2tnk-fxO2orb0vIqEuyZlpUTwouiwVb0J5mA3YXqnp7UT/s1600/03_dllSearchPath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKtmWcJ_UqJmW7yPtYoDfGYcllbsb7a6ycB5C7IBpUV9vUWfG3NuM3tbKFD8uwZKjuUeG0HmVTADZb8WCMKpPLsNvx12BCOUw2tnk-fxO2orb0vIqEuyZlpUTwouiwVb0J5mA3YXqnp7UT/s1600/03_dllSearchPath.png" height="110" width="320" /></a></div>
<br />
><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f05a9a10-5f8f-41e8-95f5-d4b6c6f67467" id="86ae5566-70db-4af7-a40d-8658e200d05d">move</span> C:\Windows\SysWOW64\studyTest.dll C:\Windows\SysWOW64\studyTest_A.dll<br />
"call_Proc"ボタンを押下。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEvrj-ZuFw4c7DXVK2I9s45iS72SxKhRx7rNS2K7sFo7DlzDsqd2JRfikmnp6ScK2zS09LfSbmwVS-CcqutxOa-5hQoYkQHFkx7OPY95MHO1QNEGz2jj43LQqi-R5oS2ECF3qRpao7dHnB/s1600/04_dllSearchPath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEvrj-ZuFw4c7DXVK2I9s45iS72SxKhRx7rNS2K7sFo7DlzDsqd2JRfikmnp6ScK2zS09LfSbmwVS-CcqutxOa-5hQoYkQHFkx7OPY95MHO1QNEGz2jj43LQqi-R5oS2ECF3qRpao7dHnB/s1600/04_dllSearchPath.png" height="110" width="320" /></a></div>
<br />
><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="d960f6c6-0e46-413a-83a8-5392718f98ab" id="57e6157b-0b6c-4695-b912-d6aeb70220a0">move</span> C:\Windows\studyTest.dll C:\Windows\studyTest_A.dll<br />
"call_Proc"ボタンを押下。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP03xo9X_9JicvdFwcfynVQAb1FGukay9anJ23CHEOq9X7r5SUcxXhyxpxH9GFmw1AsOZJdP-eLTREKVT6r9rpRQEpCvWU8kwTmeJSdyjvLivBE7e4FqmWnsZMAYocxj8J9-WoXRgmSTeE/s1600/05_dllSearchPath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP03xo9X_9JicvdFwcfynVQAb1FGukay9anJ23CHEOq9X7r5SUcxXhyxpxH9GFmw1AsOZJdP-eLTREKVT6r9rpRQEpCvWU8kwTmeJSdyjvLivBE7e4FqmWnsZMAYocxj8J9-WoXRgmSTeE/s1600/05_dllSearchPath.png" height="110" width="320" /></a></div>
<br />
><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="35b240d5-0ad1-41c5-8700-9a5b5e832757" id="76e0bcf8-6b9f-4fc7-9d17-adf61c011339">move</span> .\sub\studyTest.dll<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="35b240d5-0ad1-41c5-8700-9a5b5e832757" id="10dc5107-e4e0-4ded-a900-2e9b2a6059e5"> .</span>\sub\studyTest_A.dll<br />
"call_Proc"ボタンを押下。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXoEZQNQ62UR612FQrlfyoZAcKW3ZtHN1vXvChGid3dsp4X00VfQatiksOiI8tzClCZOpI7VYhlY7AgfplMHILLx9me9AVanNyfCjSuHvPXLdLDkvxQE1E4Uh9hOE_oboc0TRIEAKzEh9s/s1600/06_dllSearchPath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXoEZQNQ62UR612FQrlfyoZAcKW3ZtHN1vXvChGid3dsp4X00VfQatiksOiI8tzClCZOpI7VYhlY7AgfplMHILLx9me9AVanNyfCjSuHvPXLdLDkvxQE1E4Uh9hOE_oboc0TRIEAKzEh9s/s1600/06_dllSearchPath.png" height="110" width="320" /></a></div>
<br />
<br />
<br />
<br />
<a name='more'></a><br /><br />
<span style="font-size: large;">DLLを使うコード</span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2443f573-3bdb-478a-863d-9251060ec1ac" id="3b9ca66b-8c59-4e5a-a991-f60818cb382b">unit</span> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2443f573-3bdb-478a-863d-9251060ec1ac" id="e32ba113-1f60-4bea-8c88-ffa256aa0099">dllStudy</span>;<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="38ea30e9-1ca8-47d1-b096-a86e81177671" id="d539731a-9786-4d15-bc3c-68fa855334b4">interface</span><br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="48aa92c4-19f9-402b-ac84-0b37cc0c62f6" id="a391cd7d-9852-4a0d-a4c4-3acc792ae76f">uses</span><br />
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,<br />
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="14d50663-a931-4b90-920b-f3c070107e95" id="b456ac8f-1d6f-4176-a846-9e28ffff8991">shlObj</span>;<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="d32210e4-fc57-4fd6-b3c2-768c4e04b436" id="b3ab844d-a7bb-49cc-9891-20c1b48ed7b2">type</span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="0aafcc44-b7cc-446e-9733-7c9517f5691a" id="288b6a9e-4861-4586-97cf-8133c6715775">TuseDLL</span> = class<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="0aafcc44-b7cc-446e-9733-7c9517f5691a" id="88209715-bf58-40cf-8ec3-8e9eadca2d67">(</span>TForm)<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="03bbc83b-a19d-4ce8-9106-a48fa1349866" id="8a0de871-6b4f-4c1d-8f6e-a0fb5db95450">callProc</span>: TButton;<br />
Edit1: TEdit;<br />
Label1: TLabel;<br />
Label2: TLabel;<br />
Edit2: TEdit;<br />
Edit3: TEdit;<br />
Label3: TLabel;<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f93e4782-90b8-4234-b180-698e797e5495" id="e83b6700-3239-4113-b536-477c24a92a15">procedure</span> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f93e4782-90b8-4234-b180-698e797e5495" id="a8b7f381-54b6-4c08-9ef1-44f56f94d047">callProcClick</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f93e4782-90b8-4234-b180-698e797e5495" id="5239a2b1-d4b3-45f8-bab3-79660d2b8898">(</span>Sender: TObject);<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="56159d45-ffb0-4d22-9c6c-90fb87920e48" id="65233863-c3e3-4416-b8d7-75fee48e70a9">procedure</span> FormShow<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="56159d45-ffb0-4d22-9c6c-90fb87920e48" id="5400e726-7fb8-4808-8018-dc131dbe30a7">(</span>Sender: TObject);<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="b25794ca-a7df-49ff-ac52-b1f3f7e971ab" id="c41ba943-0260-4c88-90bc-57873ebf7a66">private</span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f848b154-ed6e-4b3d-bed4-da8978b5dbc3" id="c30a06c9-5d1a-4bfc-84b8-195ddf16a0fc">{ </span>Private 宣言<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="f848b154-ed6e-4b3d-bed4-da8978b5dbc3" id="e27a7d7b-0cee-428b-8f92-a2419cb0c4a8"> }</span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e8682095-55cd-4963-bc02-8fb967132a95" id="fbeb735d-ab12-413b-a904-c0328b94e04d">procedure</span> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e8682095-55cd-4963-bc02-8fb967132a95" id="2f7736dc-37a2-40e1-bc45-b3fb6fa8c2df">updateCurDir</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e8682095-55cd-4963-bc02-8fb967132a95" id="0110b24a-a7c1-41f4-b8e2-4cd221804600">(</span>);<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="5fbbc697-8e1e-44c8-9b7a-6706a8405a82" id="b80a8402-2343-4233-8f71-2a10a8cde2ba">public</span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2364990d-ee05-49fb-a94e-8c3293b04c54" id="44b9c11a-d423-4317-b418-9964a88ad4cf">{ </span>Public 宣言<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="2364990d-ee05-49fb-a94e-8c3293b04c54" id="8206f8c9-7c42-496d-b7b0-e52fa9bcef6e"> }</span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c396d674-2422-4611-b3f9-20ac18f566d1" id="0c40bb50-1bc8-40a2-9773-160908488dde">end</span>;<br />
<br />
Type TWhereAreYou = procedure<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="b869ba96-98b4-4f05-8234-0f2a52755ddc" id="9e6032a3-6b5a-4ca9-ad73-733a6bb2a5cf">(</span>); <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="b869ba96-98b4-4f05-8234-0f2a52755ddc" id="7bed87a8-132c-4965-843d-f7fdf448c8c1">stdcall</span>;<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="570b3491-a4e4-4d2c-8f18-3cdaaec944f7" id="ae323ce4-80e4-439a-ba14-b8097548d065">var</span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="1d758db4-e481-46a3-8c32-8022f9e20e2f" id="8edc082f-df7c-4459-b89b-3cf534951724">useDLL</span>: TuseDLL;<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="919ea25d-b33f-48f2-be58-c531515262b8" id="d878ad06-fcc7-43e8-9712-a1959206b288">whereAreYou</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="919ea25d-b33f-48f2-be58-c531515262b8" id="a823f433-1380-4138-a54d-1a21a239fca6"> :</span> TWhereAreYou;<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8ceb4da1-8f7e-47ac-90d3-70afd132cc51" id="939f4de3-00aa-48c4-a42d-f06a0bac5020">implementation</span><br />
<br />
{$R *<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e2cb9127-2e84-471f-8b73-5258555ccb83" id="eccafd94-9134-4b12-833a-3d0abf045e76">.</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e2cb9127-2e84-471f-8b73-5258555ccb83" id="0b44848f-e108-485b-a76f-75c14361b2ee">dfm</span>}<br />
<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="4a3981c1-d082-42cc-958c-12b75303facb" id="fb633aa7-eb9e-4560-b5ec-8910cc1b2312">procedure</span> TuseDLL<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="4a3981c1-d082-42cc-958c-12b75303facb" id="1b241721-d2ac-4970-9c6f-b30d6b6dc219">.</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="4a3981c1-d082-42cc-958c-12b75303facb" id="a8d715bc-ac54-4c34-b05b-f06f52a02926">callProcClick</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="4a3981c1-d082-42cc-958c-12b75303facb" id="fdf5151a-6956-4084-bc51-d69975f51dad">(</span>Sender: TObject);<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="fec99377-4861-4967-a260-f22d2665afe0" id="da37e150-bb22-4926-9a04-12065390b76c">var</span><br />
Handle<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e50621d3-10a8-4200-beb2-3c20a1ad0444" id="b36bea78-272b-4ea8-8ee3-6e2c0d0c7e1e"> :</span> THandle;<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="404e7b74-7a08-4910-84c1-dc8281ed3e84" id="6759c80b-9d25-4edf-9ca0-e3476ce69e26">begin</span><br />
Handle<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c03e8e97-6cbe-42a0-aa0f-548111260394" id="f7c07b2d-e61d-479d-bfd1-0f6e6338546b"> :</span>= LoadLibrary<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c03e8e97-6cbe-42a0-aa0f-548111260394" id="607d847c-a6df-4363-acbf-11a282feb116">(</span>'studyTest.dll');<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e7ee5aab-3bab-4454-ab74-ea5827c8bb2f" id="d7edb4ab-31dc-42f8-a7a4-c8e9a824d3e0">if</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e7ee5aab-3bab-4454-ab74-ea5827c8bb2f" id="bb039c5d-c9e3-49ad-a891-94503294aa52">(</span>Handle<>0) then begin<br />
@whereAreYou<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="26ae76aa-53b7-4802-af9f-47b7e2b69d78" id="8503b9f6-acc4-4fa3-a1d8-98a741d1ec72"> :</span>= GetProcAddress<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="26ae76aa-53b7-4802-af9f-47b7e2b69d78" id="ca939efd-bd29-446a-bdd2-fdb2e507e371">(</span>Handle, '<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="26ae76aa-53b7-4802-af9f-47b7e2b69d78" id="a9ef9fb2-323f-4a8b-af16-ee670ef0c45f">whereAreYou</span>');<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="bdac3b80-16f0-467b-b000-44775aebbd5a" id="04075003-3112-4a5b-bf7a-1d4bd277f03f">if</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="bdac3b80-16f0-467b-b000-44775aebbd5a" id="7ec13ac5-09eb-4011-bdd6-1f1b48291282">(</span>@whereAreYou<>nil) then <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="bdac3b80-16f0-467b-b000-44775aebbd5a" id="93d556f2-3c5f-468a-8cbe-66fc9f21a7db">whereAreYou</span>;<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="030d18e5-00f2-484f-b8b6-636ce3eb3410" id="71fed578-cab5-424f-83b5-c1a640d8d7cc">FreeLibrary</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="030d18e5-00f2-484f-b8b6-636ce3eb3410" id="5ab5dbad-cf1f-42ab-a3bf-95840759884d">(</span>Handle);<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="92cdad8e-705e-4d31-a663-6efc04c2ccb4" id="fdb2fbad-ca2b-4c9e-bcf0-474318b30f77">end</span>;<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="6c3be7e0-9ca2-4643-ab39-7d69f69558cc" id="382a604e-20a4-4e39-9856-bb936273d74f">end</span>;<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="3f87ff80-0f06-461b-ab80-73e4b7d8278d" id="98eb067d-46c6-4e58-94c1-a7eb85f94801">procedure</span> TuseDLL<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="3f87ff80-0f06-461b-ab80-73e4b7d8278d" id="74ed3b50-b1ec-4f54-aa29-f34e3b7a4458">.</span>FormShow<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="3f87ff80-0f06-461b-ab80-73e4b7d8278d" id="0538e629-b06d-41e0-ab2d-bc3aeafcf536">(</span>Sender: TObject);<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e5faeb85-d821-44ed-8106-d7fc484de552" id="30efb515-be0a-4ced-a24b-1a96abadf9f4">var</span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="3763579b-7cdc-4592-b646-df3f3645e5a8" id="5319b950-2912-4b01-b772-b677be504ff2">cSysDir</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="3763579b-7cdc-4592-b646-df3f3645e5a8" id="da65baeb-ea66-4544-8a28-2bb7ec90f316"> :</span> array<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="3763579b-7cdc-4592-b646-df3f3645e5a8" id="e0c2cfe2-4404-4172-9897-cb7e45ac5919">[</span>0.<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="3763579b-7cdc-4592-b646-df3f3645e5a8" id="04c474fe-61bf-40dd-b436-2fb2b8f5e7ac">.</span>MAX_PATH] of char;<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="ebfe555b-5b95-43ea-86dd-af991ea444f5" id="46895ffa-7e65-400e-987a-5ad51c4a5865">cWinsDir</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="ebfe555b-5b95-43ea-86dd-af991ea444f5" id="e75095cb-bc0d-4228-bd67-60fbbb201430"> :</span> array<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="ebfe555b-5b95-43ea-86dd-af991ea444f5" id="67830700-afe7-4ce4-b0e4-d87be29d1b8e">[</span>0.<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="ebfe555b-5b95-43ea-86dd-af991ea444f5" id="128d4f9c-8382-4e60-a482-1c84e8d337c6">.</span>MAX_PATH] of char;<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="65e3386c-2ae0-472f-bfc1-a1ee6cace3c5" id="a3c0550c-8f06-408d-857f-283a44462c9a">begin</span><br />
// <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="562fbb0e-1cd3-48af-8f3e-83569405a937" id="2cfaa6d6-bb72-4b35-9cc5-946ecbadda94">change</span> current directory<br />
ChDir('.\Sub');<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="779c2ed3-cddc-4266-a49d-fd617f030a86" id="0bc1e46a-ee4a-4d2a-ae1c-e9189d22c2b9">updateCurDir</span>;<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c6a5beeb-f0bd-4e4e-9d22-5e9dfd5fc46f" id="aa3c38fd-51cb-47b3-bed3-1b395b8a1ec7">GetSystemDirectory</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c6a5beeb-f0bd-4e4e-9d22-5e9dfd5fc46f" id="cf9439dd-6ce6-4483-b66e-a6af26b6e20a">(</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c6a5beeb-f0bd-4e4e-9d22-5e9dfd5fc46f" id="371f3c29-d9cf-4f8a-8d8f-1373530cf9fc">cSysDir</span>, GetSystemDirectory<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c6a5beeb-f0bd-4e4e-9d22-5e9dfd5fc46f" id="d63482bb-9501-4fde-89ec-696d59f73067">(</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c6a5beeb-f0bd-4e4e-9d22-5e9dfd5fc46f" id="9290bb56-9abb-4a58-a3d4-8812a0671aff">cSysDir</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c6a5beeb-f0bd-4e4e-9d22-5e9dfd5fc46f" id="2c3d7dc0-23fc-4910-8623-fb73925ee467">,</span>1)+1);<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="9003edc6-dfc7-42dc-80b5-4ba33ac6bbc6" id="07d40a81-a2c2-4831-b236-acc7ed49e4f5">SHGetSpecialFolderPath</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="9003edc6-dfc7-42dc-80b5-4ba33ac6bbc6" id="f6ba7de7-fd5e-4488-899c-c4c6a2b3a9c3">(</span>Handle, <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="9003edc6-dfc7-42dc-80b5-4ba33ac6bbc6" id="27ee4e77-8dbf-4b16-a734-f08376c28edd">cSysDir</span>, CSIDL_SYSTEMX86, False);<br />
Edit2.Text<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="aced599e-593f-4715-b607-705c2716819c" id="509d0def-fecf-4173-a3ba-9e9f56a19147"> :</span>= String<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="aced599e-593f-4715-b607-705c2716819c" id="931f33f8-cec9-43ff-a180-3a3447cdf7a8">(</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="aced599e-593f-4715-b607-705c2716819c" id="609a2561-00be-410c-b815-dd2df7d06f12">cSysDir</span>);<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="a1d33343-c8d0-4f07-aebe-8ec8ca9989aa" id="a766a364-0f7a-4dcd-a9a0-329f46dc9589">GetWindowsDirectory</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="a1d33343-c8d0-4f07-aebe-8ec8ca9989aa" id="93b993b1-6162-448e-b2eb-fb6b20d0610d">(</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="a1d33343-c8d0-4f07-aebe-8ec8ca9989aa" id="c548ecd8-d121-4ab2-9595-b21e0c63360a">cWinsDir</span>, GetWindowsDirectory<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="a1d33343-c8d0-4f07-aebe-8ec8ca9989aa" id="f74b90ff-2962-4124-ad72-3b4ffb2815b7">(</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="a1d33343-c8d0-4f07-aebe-8ec8ca9989aa" id="e8fa771a-4545-49ab-83b0-4e41242939e7">cWinsDir</span>, 1)+1);<br />
Edit3.Text<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="357d75e9-5e8e-43d3-bc86-e02beee2f8b7" id="046561ef-961d-4fc6-8289-615dbc0a6b6f"> :</span>= String<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="357d75e9-5e8e-43d3-bc86-e02beee2f8b7" id="3c8cd8f3-9e00-4df8-81f4-00b42e91b40b">(</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="357d75e9-5e8e-43d3-bc86-e02beee2f8b7" id="d9092719-9401-49db-8015-0b2437cb7d0b">cWinsDir</span>);<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="1cb7a3ae-3fa0-4833-82a5-5b5d8caaa9d4" id="1dd77249-3e3e-4d00-b22a-d75c766ab8e4">end</span>;<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="56a3123b-c957-4857-a857-18f2451d3bcb" id="a5d9b98f-0890-45f3-a490-4257f4e4228b">procedure</span> TuseDLL<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="56a3123b-c957-4857-a857-18f2451d3bcb" id="dfbd2fc8-bc78-4edf-9458-f58a7fc6aa31">.</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="56a3123b-c957-4857-a857-18f2451d3bcb" id="a59a8367-6e90-4039-a17a-82dd4579f12e">updateCurDir</span>;<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="b9b600ea-b031-47e7-b575-67f720d63a4f" id="c28daf69-e86b-401f-95a2-351520854eb4">begin</span><br />
Edit1.Text<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c50e8343-900a-4937-973e-de022e758ae0" id="f824a01a-ced5-4ac9-83a9-31d90e110e62"> :</span>= GetCurrentDir;<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="887a463e-ea43-47dc-9fe7-5225022417c0" id="595a1f26-9e35-4be8-a919-8bdc7271aa1f">end</span>;<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="0ea7bcbb-1d15-4e50-9e58-44f489270379" id="75aa669e-eadc-4158-8b97-e9a9d88f203c">end</span>.<br />
<br />
<br />
<span style="font-size: large;">References</span><br />
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx#standard_search_order_for_desktop_applications<br />
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com1tag:blogger.com,1999:blog-2750784755625292001.post-58194470608396989272014-07-29T00:56:00.000+09:002014-07-29T00:56:10.993+09:00PLEX Multimedia Server の構築 on FreeBSD 9.1 STABLE<a href="https://plex.tv/" target="_blank">PLEX Multimedia Server</a> を構築する。なお、FreeBSDは、サポートはされていないので自己責任で。。。<br />
<br />
[1] ローカルからのアクセスまで<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="0727337f-e82a-4af4-99fe-95f68cfe372e" id="c6acece7-e634-4e7a-92c7-08c7f065a0ac">ports</span> にてサーバーソフトウェアをインストールする。<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="ae9846fd-f44a-43c0-b590-75d77fbed4c5" id="210e5dfe-8b2e-4853-94b8-38e32089e90e">cd /usr</span>/ports/multimedia/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="ae9846fd-f44a-43c0-b590-75d77fbed4c5" id="e9d3710b-200e-4410-b93e-5450e70659cc">plexmediaserver</span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="d3759038-064b-4723-8616-b6dd13fcef06" id="4ea185fb-4605-40bd-81c8-83aa259b8603">make</span> config-recursive<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="ccd6e75c-2ee2-4ada-b15d-324b4b574372" id="ba04569c-fa6a-47a3-ae09-e80fcac5ec9b">make</span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8b1f60cc-dbcd-44dd-ac1e-27a0b27b18a7" id="f19f2c0c-fc90-4d97-9227-dc9d12c7a7fa">make</span> install<br />
<br />
起動時にデーモンが起動するように/etc/rc.confに下記を追記<br />
<br />
plexmediaserver_enable="YES"<br />
<br />
サーバーの起動<br />
/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="93757a55-4a1a-47d5-bbaa-e9a7ca273b86" id="7926600a-2b1b-4e80-b289-d074ea9de620">usr</span>/local/etc/rc.d/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="93757a55-4a1a-47d5-bbaa-e9a7ca273b86" id="55ded5a8-f0de-4f8e-b363-d6203edc6267">plexmediaserver</span> start<br />
<br />
ブラウザにて 下記アドレスにアクセス<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c1952fd0-89d7-4124-9f3d-87a4d43b72f6" id="e919e320-b4db-4889-8e62-c20a7c802bff">http</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c1952fd0-89d7-4124-9f3d-87a4d43b72f6" id="23d0e3c8-354f-4215-b15e-3ff77e7a1ffb">:</span>//[server-address]<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c1952fd0-89d7-4124-9f3d-87a4d43b72f6" id="40d16bab-ce04-44b4-a377-78a7b65682c1">:</span>32400/manage<br />
<br />
下記のようなページが表示されればここまではOK<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9tWci4B6oJfJMpwyE_cTFCEarBhfmL3fNXh2y9D7xqe0tliGajwGKw8VIjr9RI6vVvH8OcaxgUF5LknLY_uzWmK50kuVfDqbnsDjr80QaodoR70w_pL2p6faI0tz7QB8FNgoEV3tOwz1N/s1600/accessLocal.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9tWci4B6oJfJMpwyE_cTFCEarBhfmL3fNXh2y9D7xqe0tliGajwGKw8VIjr9RI6vVvH8OcaxgUF5LknLY_uzWmK50kuVfDqbnsDjr80QaodoR70w_pL2p6faI0tz7QB8FNgoEV3tOwz1N/s1600/accessLocal.png" height="184" width="320" /></a></div>
<br />
[2] 外からのアクセス<br />
(1) ルーターの設定<br />
PLEX Multimedia Serverは、TCPの32400番ポートを使うのでルーターの外からサーバーの32400番ポート宛のパケットを通すようにルーターのファイヤーウォールの設定を変更しておく。<br />
また、NATを使っている場合は、ルーターの外側のIPアドレスの32400番ポートへの接続要求をサーバーの32400番ポートへ転送するように静的NATのエントリを追加しておく。 <a href="http://www.rtpro.yamaha.co.jp/RT/manual/nvr500/nat/nat_descriptor_masquerade_static.html" target="_blank">参考</a><br />
<br />
(2) PLEXの設定<br />
次に、https://plex.tv/ にアクセスしてplexのアカウントを作成。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPxApuGjux2pIF41zw5Wu7NEpxKTwaU8-ZZLJaqqh8_zwHNZhUoLLDxkAN5fRmcNDlppL6LubDl_6JPeIYhtA7XxsKw7xYrIwpw3c0-aoyP8CLs-hz82jWVC_PNILnM_uPCOX9tbfR1ace/s1600/02_plex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPxApuGjux2pIF41zw5Wu7NEpxKTwaU8-ZZLJaqqh8_zwHNZhUoLLDxkAN5fRmcNDlppL6LubDl_6JPeIYhtA7XxsKw7xYrIwpw3c0-aoyP8CLs-hz82jWVC_PNILnM_uPCOX9tbfR1ace/s1600/02_plex.png" height="184" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
"[1] ローカルからのアクセスまで"にてアクセスしたローカルに建てたサーバーのページの右上のサインインをクリックして作成したアカウントでログインする。サインインできたら右上の歯車の設定アイコンをクリックして、同アイコンより下に表示される"Server"をクリック。</div>
<div class="separator" style="clear: both; text-align: left;">
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="6218cb04-3a36-4205-b17b-7ddd9edba923" id="b5fc0f1e-156b-4ef0-b0e9-27bbad7bb7bf">Friendry</span> name がホスト名になっている場合は、FQDNに変更しておく。</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ-aU6TLDkjkG342M0EOaLFPGTS9oFqnx9oVJQVmST5DO0ys8PiP3Jd5ts_JeUasx2HsqO4-pSdGuZv_524uiqKzjbALebL7d0S0M5Llffs5MHsi8FcNzAYxbpZ9e48wFCMYDQ1hlewNcj/s1600/03_plex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZ-aU6TLDkjkG342M0EOaLFPGTS9oFqnx9oVJQVmST5DO0ys8PiP3Jd5ts_JeUasx2HsqO4-pSdGuZv_524uiqKzjbALebL7d0S0M5Llffs5MHsi8FcNzAYxbpZ9e48wFCMYDQ1hlewNcj/s1600/03_plex.png" height="217" width="320" /></a></div>
<br />
さらに、右側の"Connect"をクリックして、"Manually specify port"にチェック、テキストボックス"32400"が入力されていることを確認して、"Retry"ボタンを押下。下記画像のように2つのチェックが付けばOK。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpmf6ukAdvF101_SurbmW7hhMg53yU_0fTP74i7pVlnqayxUrddlNghhccjuyrwor7oUj7vywV5yHA5DxsNldQ7M6P91gg_lhEaDmVefJ4SAi2XCW6OO2t4LBK0mz1D1vmUryRKrHPR265/s1600/04_plex.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpmf6ukAdvF101_SurbmW7hhMg53yU_0fTP74i7pVlnqayxUrddlNghhccjuyrwor7oUj7vywV5yHA5DxsNldQ7M6P91gg_lhEaDmVefJ4SAi2XCW6OO2t4LBK0mz1D1vmUryRKrHPR265/s1600/04_plex.png" height="217" width="320" /></a></div>
<br />
<br />
実際に外からアクセスできるかどうか試してみる。<br />
<br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-65027500013722256372014-07-17T23:52:00.000+09:002014-07-22T20:46:52.133+09:00Mercurial reporitory server[0] Ubuntu 14.04 のインストール + sshログインの準備<br />
<br />
<a href="https://wiki.ubuntu.com/LTS" target="_blank">2019年までサポートされる</a>140.04のイメージをを<a href="http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/14.04/" target="_blank">ダウンロード</a>する。<br />
ダウンロードしたイメージでインストール。スキップできるところはスキップして後からリポジトリサーバーを変更しインストール。<br />
<br />
公開鍵を利用してsshでリポジトリサーバーにログインできるようにしておく。クライアント側にて公開鍵を生成(Unixライクな環境では ssh-keygen、Windows ならPuTTYgen等を用いて)。公開鍵をサーバーの~/.ssh/authorized_keys に追記する。<br />
<br />
[1] Mercurial のインストール<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e522eb7b-8586-4087-b00d-cd4cc60d2e66" id="7922c1f5-8da1-46b7-b825-0a6810828646"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="093d6c92-e9d7-4403-8484-5845fa2f2bdb" id="b5827347-b192-4f7a-8143-5367562f8091">sudo</span></span> apt-get install mercurial<br />
<br />
試しに使ってみる<br />
ユーザー名の設定 ~/.hgrc を作成して下記を記入。<br />
[<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="15a9a0ca-399c-4204-a2ae-07267a066785" id="cdd0e34a-4721-4521-920a-c38d970b9398"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="7292e9a3-9170-44da-b214-d2af8afd45d6" id="1a6424cd-c6fd-49ca-8ac8-76584e3c7b9c">ui</span></span>]<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="a00746c2-56d3-4955-ac6a-a5938492bc44" id="048232cc-2a02-487c-99ef-1ea32605c1b2"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="93ce245f-f8ed-43d1-84e0-ac583d2244e6" id="fe61b214-df85-4d47-93ca-0ffc89e2597c">username</span></span> = FORUM TARO <forum@foo.bar><br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e1b320c5-c14b-445e-bf9d-6085ea5ccdc2" id="3ecad609-c9bd-4e4c-90a0-f777f21b3b2e"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="3f609c41-25a5-40fa-9ce8-8efd0287fe24" id="56ebdc7c-539d-4583-8d99-04e72df77115">mkdir</span></span> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e1b320c5-c14b-445e-bf9d-6085ea5ccdc2" id="ff3e05cc-4b1f-4502-ad7d-bf4b627bd065"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="3f609c41-25a5-40fa-9ce8-8efd0287fe24" id="47f2e6c8-7d86-4d2f-8bac-d2a780b8819d">tmp</span></span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e9291042-26d4-4c7c-97de-43e92b0ace2f" id="5bb8245a-8560-441f-bb0a-cfe4696322d2"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="08c51f07-c918-4dee-b707-04429a30e111" id="820e1862-e7b2-456d-b244-0656ffa9c4a2">hg</span></span> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e9291042-26d4-4c7c-97de-43e92b0ace2f" id="0be317db-b565-4c34-ade7-912214fc0f55"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="08c51f07-c918-4dee-b707-04429a30e111" id="61e5ea49-23e9-44cf-9b4e-ecc291c3b07b">init</span></span> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e9291042-26d4-4c7c-97de-43e92b0ace2f" id="20d25dd1-76bb-4e47-8605-51e2de82def3"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="08c51f07-c918-4dee-b707-04429a30e111" id="25d47316-a865-4d55-8664-dc30489be0f8">tmp</span></span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e292b924-d1e7-4e09-8a19-68a8d22154b3" id="75aa5eac-4597-4545-8741-b6a21e5aed4a"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="b1f2797c-d721-4db7-91e3-c1312effaf46" id="7fbedd98-7c10-4914-89b7-8e37af007b30">cd</span></span> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e292b924-d1e7-4e09-8a19-68a8d22154b3" id="50cf1c92-3a67-4c88-a993-ec9293ad2c19"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="b1f2797c-d721-4db7-91e3-c1312effaf46" id="d610ac03-5da4-4377-9244-df258ba18bea">tmp</span></span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="14f83842-e3b1-45e7-a695-fb1449e31941" id="8f58a009-7b96-49f7-a0cc-6580c1f2d3f7"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="373f64ad-d632-4114-b000-b27b030cac1b" id="b040437c-9974-47be-887d-9c7da0896ee3">touch</span></span> test<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="14f83842-e3b1-45e7-a695-fb1449e31941" id="bdeb09b5-6286-4adb-ba75-7c1bdafa3c0d"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="373f64ad-d632-4114-b000-b27b030cac1b" id="46a9a352-80f6-42d1-ae0c-f83e89b0d7f5">.</span></span>c<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="6e66a4ba-823b-4cb7-96ba-7aff64599be6" id="53483cec-4d67-4fb3-bad4-2778e7d73a64"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="531336f4-ed69-4263-8298-8dad09f21a21" id="2d290e79-e182-4864-a9ba-bfc59286db90">hg</span></span> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="6e66a4ba-823b-4cb7-96ba-7aff64599be6" id="da39fed7-03c7-4dc9-88e2-ec95feb3672f"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="531336f4-ed69-4263-8298-8dad09f21a21" id="98538634-bd67-487c-b60d-5dfa03145c59">add</span></span><br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="6a3d8792-3e9d-45e2-8ee0-129b6d213c84" id="0f043061-bfff-4880-9a73-b79b57bec5d9"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="7d4a66d4-ec97-4a05-acac-6c172c594680" id="e1cb7827-b8e0-4673-9cb7-592c9f1177dc">hg</span></span> commit -m '<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="6a3d8792-3e9d-45e2-8ee0-129b6d213c84" id="6a4d8b07-c975-4dd2-918c-99cbc97667c9"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="7d4a66d4-ec97-4a05-acac-6c172c594680" id="08148c84-a192-4bc6-9706-3e53e5f15b61">first commit</span></span>'<br />
<br />
<br />
[2] <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="275e2c11-f9a1-4452-a15a-d0652fc4f995" id="4ba2e1cd-0b00-4487-9b33-76dbade947b6"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="3331194f-163c-411c-bffc-f14299414d31" id="f50b1bbc-2118-46f6-bb71-f2e0b66d6d9c">mercurial</span></span>-server のインストール<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="be4bc9f7-d32c-4613-8d0d-0c9c93b39835" id="48457c15-c512-4c47-ad58-f91a47b9edbf"><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="d8e4c1e2-d44e-44a0-83bf-1dae29886af6" id="2bd017eb-5ca3-45c0-b2fd-855c38cfad5e">sudo</span></span> apt-get install mercurial-server<br />
<br />
[3]<br />
<a href="http://dev.lshift.net/paul/mercurial-server/docbook.html" target="_blank">こちら</a>を参考にリポジトリのrootユーザーの公開鍵の登録とリポジトリの作成を行う<br />
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-30018242338109986482014-07-16T02:07:00.000+09:002014-07-16T02:07:04.433+09:00デフォルトのLANGの変更Ubuntu でシステム全体のデフォルトのLANGの変更は、<br />
/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="e6f042e4-4a00-4439-a78c-30e3787204b2" id="bc0fdd35-41b3-4bc5-b900-b4f609d0c81a">etc</span>/default/locale<br />
に対して行う。Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-15511309599856539622014-06-16T00:23:00.002+09:002014-06-16T00:23:49.157+09:00OpenLDAP サーバー構築でハマった点"<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8f33f006-1d13-46dd-bcf6-8bd61ade588d" id="9d034da1-d905-4d20-9751-4413db54a64e">failed</span> to start slapd"と言われてデーモンのスタートが失敗する場合は、"<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8f33f006-1d13-46dd-bcf6-8bd61ade588d" id="0babb19a-884d-4018-922b-219dcf6695ad">slapd</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8f33f006-1d13-46dd-bcf6-8bd61ade588d" id="d62a9678-8ae1-43df-a4e3-98b85705124f">.</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8f33f006-1d13-46dd-bcf6-8bd61ade588d" id="bfd92db5-87ad-4935-9fec-72a0d6b19c9d">conf</span>"の構文を間違えていないかslaptest<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="8f33f006-1d13-46dd-bcf6-8bd61ade588d" id="79fbc84f-18af-4f81-884d-7b664700e3db">(</span>BC) をj実行してみる。<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c4dd74a0-2c09-472a-a1cb-363474c1253e" id="8c229e2e-de8f-430e-b8bb-da5442f3b5f0">objectClass</span> <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c4dd74a0-2c09-472a-a1cb-363474c1253e" id="02479912-6f09-4925-afd1-6444f13c063e">organizationalUnit</span> を用いる場合は、下記2つのスキーマをslapd<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="c4dd74a0-2c09-472a-a1cb-363474c1253e" id="442b456e-abe8-4980-b646-5645d6f77786">.</span>confでインクルードする。<br />
<br />
/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="bb30853b-dc32-4785-92c5-0691abb89773" id="60530702-c11b-4bde-a810-11a6e0d5d58a">usr</span>/local/etc/openldap/schema/cosine<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="bb30853b-dc32-4785-92c5-0691abb89773" id="37a145ea-c45b-4b32-b74b-676d1ec0999e">.</span>schema<br />
/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="136ceba4-b0b0-4cd7-91d8-5295dcdb837b" id="5740069d-b3c6-4230-8859-b2793edaa0ac">usr</span>/local/etc/openldap/schema/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="136ceba4-b0b0-4cd7-91d8-5295dcdb837b" id="9d3c8052-fef0-4556-a956-5963ed3a4b93">inetorgperson</span><span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="136ceba4-b0b0-4cd7-91d8-5295dcdb837b" id="a17d1078-afb9-4099-b023-b7e9a8767ede">.</span>schema<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-64707552123462722862014-06-05T00:27:00.001+09:002014-06-05T00:27:07.460+09:00Unmask floating point exception #2<a href="http://kuni255.blogspot.jp/2014/05/unmask-floating-point-exception.html" target="_blank">この投稿</a>の追加投稿。<br />
<br />
Gcc 4.4.7 にて下記の除算のみを行うソースをコンパイルして逆アセンブルすると除算は、SSE2の命令である"DIVSD" (*1 p.728)が出力されていることが確認できます。<br />
<br />
-div.c-<br />
#include <stdio.h><br /><br />int<br />main(void)<br />{<br /> double a,b,c;<br /><br /> a=3.0;<br /> b=0.0;<br /> c=a/b;<br /><br /> return 0;<br />}<br />
<br />
$ gcc -o div div.c<br />
$ objdump -d div > div.d<br />
<br />
-div.d のmainの一部-<br />
40048f: f2 0f 10 45 e8 movsd -0x18(%rbp),%xmm0<br /> <span style="color: red;">400494: f2 0f 5e 45 f0 divsd -0x10(%rbp),%xmm0</span><br /> 400499: f2 0f 11 45 f8 movsd %xmm0,-0x8(%rbp)<br /><br />
<br />
<br />
前回投稿したコードは、x87 FPUのFPE(Floating Point Exception)のマスクを解除するものであり、当たり前ですがSSE2のFPEを解除しているわけではないので、mainの最後でdouble同士の除算をしてもSSE2の命令が出力されているのでFPEは発生しません。<br />
<br />
今回は、SSE2のFPEのマスクを外すコードをメモ。<br />
- sse2.c -<br />
1 #include <stdio.h><br /> 2 <br /> 3 int<br /> 4 main(void)<br /> 5 {<br /> 6 double a,b,c;<br /> 7 unsigned char buff[512] __attribute__((aligned(16)));<br /> 8 <br /> 9 a=3.0;<br /> 10 b=0.0;<br /> 11 c=1.0;<br /> 12 <br /> 13 c = a/b;<br /> 14 <br /> 15 asm volatile(<br /> 16 "fxsave %0" // get valueof mxcsr register <br /> 17 :"=m"(buff):);<br /> 18 <br /> 19 printf("SSE2 FPE bit mask= %X\n", buff[25]);<br /> 20 buff[25] = buff[25] ^ 0x2;<br /> 21 printf("SSE2 FPE bit mask= %X\n", buff[25]);<br /> 22 <br /> 23 asm volatile(<br /> 24 "fxrstor %0" // set operand to mxcsr register<br /> 25 : :"m"(*buff));<br /> 26 <br /> 27 c = a/b;<br /> 28 <br /> 29 return 0;<br /> 30 }<br /> <br />
<br />
fxsave(*1 P.846)/fxstor(*1 P.843) は、指定されたメモリ領域から/にMXCSR(*1 P.230)というSSE2の浮動小数点演算時に用いる情報を保持するレジスターに/の値を保存する。<br />
20行目で該当するビットをクリアすることで、ゼロ割によるFPEのマスクを外している。<br />
<br />
$ gcc --o sse2 sse2.c<br />
$ ./sse2<br />
SSE2 FPE bit mask= 1F<br />SSE2 FPE bit mask= 1D<br />Floating exception (core dumped) <br />
<br />
[補足]<br />
ちなみに、-mfpmath=387 というオプションをつけてコンパイルするとx87 FPUの除算命令を出力する。<br />
<br />
<br />
<br />
<br />
*1 Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B, and 3C Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-4610995877822993302014-05-30T01:01:00.002+09:002014-05-30T01:01:46.840+09:00[Windows 8.1] UEFI設定画面の確実な入り方Windows 8.1がインストールされたPCで用があってUEFIの下記設定変更を行い。<br />
・ディバイスの起動順の変更<br />
・UEFIのセキュアブートの無効化<br />
別のディバイスからブートして作業。作業終了後UEFIの設定を元にもどそうと設定画面に入るためのキーを押すが設定画面が表示されないし、Windowsも起動しない。<br />
<br />
しょうがなく、電源ボタン長押しで電源断後、再度電源ボタンを押して暫くするとWindowsは起動した。<br />
<br />
そんな事があったので対処法をメモ。<br />
管理者権限のあるコマンドプロンプトで<br />
<br />
<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="bcf727d8-b19b-4742-8153-92490d8bc99b" id="8b546cc5-a23a-4c05-9643-1cc48753e362">shutdown</span> /r /o<br />
/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="529c12e3-8016-4b7a-82bf-8fe222048d43" id="162488f6-6822-4f1c-8c74-2cdd74ce812d">r</span> - Full shutdown and restart <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="529c12e3-8016-4b7a-82bf-8fe222048d43" id="a168a92f-d3a6-467a-bf09-b37a1e2b1d03">computer</span><br />
/<span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="7e37c7c8-6f4d-49f9-ba5f-401593f6f487" id="9dbccf6f-9ede-4f92-876c-5730e72241d2">o</span> - Go to the advanced options <span class="GINGER_SOFTWARE_mark" ginger_software_uiphraseguid="7e37c7c8-6f4d-49f9-ba5f-401593f6f487" id="a13559c5-c28d-4f61-b267-c811bb2ed8ec">menu and</span> restart computer. Must be used with /r option.<br />
<br />
すると再起動後に"オプションの選択"という画面が表示されるので、トラブルシューティング]-[詳細オプション]-[UEFI ファームウェアの設定]の順にクリックする。<br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-14788162589398175482014-05-22T21:56:00.001+09:002014-05-22T21:56:30.797+09:00Unmask floating point exception <br />
x86 なプロセッサ上のLinuxでは、浮動小数点同士の除算でゼロ割を行ってもSIGFPEは普通発生しない。これは、FPU control word*1 というFPUのレジスタ中のFloating point exception のマスク状態を表すフラグが立っているためである。<br />
<br />
gfortran -ffpe-trap=zero というオプションを指定すると浮動小数点のゼロ割でSIGFPEが発生するようになる。今回は、gcc インラインアセンブラでFloating point exception のマスクを解除してみた。<br />
<br />
<br />
<br />
#include <stdio.h><br /><br />int<br />main(void)<br />{<br /> double a,b,c;<br /> unsigned short int fctr;<br /><br /> a=3.0;<br /> b=0.0;<br /> c=1.0;<br /><br /> asm volatile(<br /> "fstcw %w1\n\t" // get FPU control word<br /> "fdiv %3,%2"<br /> :"=&t"(c):"m"(fctr),"f"(a),"f"(b));<br /> printf("c= %f FPU control word= %X\n", c, fctr);<br /><br /> fctr = fctr ^ 0x4;<br /> printf("Value for FPU control word= %X\n", fctr);<br /><br /> asm volatile(<br /> "fldcw %w1\n\t" // set operand to FPU control word<br /> "fdiv %3,%2"<br /> :"=&t"(c):"m"(fctr),"f"(a),"f"(b));<br /> printf("c= %f FPU control word= %X\n", c, fctr);<br /><br /> return 0;<br />}<br />
<br />
<br />
[実行結果]<br />
$ ./a.out <br />c= inf FPU control word= 37F<br />Value for FPU control word= 37B<br />Floating exception (core dumped)<br />
<br />
<br />
*1 Intel® 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B, and 3C p.p.189-190<br />
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-69138225576999755952013-12-02T21:46:00.000+09:002013-12-02T21:46:11.493+09:00[webGL] DEM データビュワー by webGL<a href="http://www.gsi.go.jp/GIS/jpgis-jpgidx.html" target="_blank">地理情報プロファイル Ver.2.X</a>でフォーマットされたDEMデータのビュワーを作ってみた。<br />
というか手段(webGL)が完璧に目的化しているけど。。。<br />
<br />
とりあえず形には、なったので公開。<br />
<br />
本当は、file apiでクライアント側のテキスチャ画像を選択できる様にしたかったが、サーバー上の画像ファイルしか貼れないのがthree.jsの仕様らしく断念。<br />
<br />
いや違うまたは、別の方法があればどなたか教えてください。<br />
<br />
<br />
<script src="http://jsdo.it/blogparts/mVPJ/js?width=512&height=496&view=screenshot" type="text/javascript"></script>Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-2025378430647459942013-11-09T19:20:00.001+09:002013-11-09T19:23:34.248+09:00[UNIX] ELFの全体像についてまとめてみたELFの全体像と readelfコマンドとの対応をまとめてみた<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj95WshiNgMUOtYHBsRxz8R2swfnK3gtkk8XsZkks5XY8Fg-NN6AdSpaazK_nzfQMNHXEaVSzn4IdqDGkTemeRLK9QuEFoldX0MmlLmMN-HGFbyWYJKSe_inzn9blGVSGIAWG8JBgUvrsUN/s1600/general.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj95WshiNgMUOtYHBsRxz8R2swfnK3gtkk8XsZkks5XY8Fg-NN6AdSpaazK_nzfQMNHXEaVSzn4IdqDGkTemeRLK9QuEFoldX0MmlLmMN-HGFbyWYJKSe_inzn9blGVSGIAWG8JBgUvrsUN/s320/general.png" width="247" /></a></div>
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-42842257582315638732013-10-22T23:23:00.000+09:002013-10-22T23:28:42.483+09:00[c] (広義の)コンパイルの工程分かっていなかった事が分かったので<br />
コンパイルの工程を復習するために hello.cに依存しているtest.cのコンパイル過程を<br />
FreeBSD 9.1 RELEASE で出力してみた。<br />
<br />
-hello.h-<br />
#ifndef HELLO_H<br />
#define HELLO_H<br />
<br />
int sayHello(void);<br />
<br />
#endif<br />
<br />
-hello.c-<br />
#include "stdio.h"<br />
#include "hello.h"<br />
<br />
int<br />
sayHello(void)<br />
{<br />
printf("hello\n");<br />
return 0;<br />
}<br />
<br />
-test.c-<br />
#include <stdio.h><br />
#include "hello.h"<br />
<br />
int<br />
main(int argc, char **argv)<br />
{<br />
sayHello();<br />
return 0;<br />
}<br />
<br />
<br />
なお、あらかじめhello.cは中間ファイル(オブジェクトコード)hello.oを生成済み。<br />
<br />
$ gcc -o test -save-temps -v hello.o test.c<br />
<br />
-save-temps … 通常は、削除される中間ファイルをカレントディレクトリに残す<br />
-v … 途中コマンドを標準エラー出力にコマンドのバージョン情報も含めて出力する<br />
<br />
以下が出力したコマンド<br />
<br />
Using built-in specs.<br />
Target: amd64-undermydesk-freebsd<br />
Configured with: FreeBSD/amd64 system compiler<br />
Thread model: posix<br />
gcc version 4.2.1 20070831 patched [FreeBSD]<br />
<b><span style="color: red;"> /usr/libexec/cc1 -E -quiet -v -D_LONGLONG test.c -fpch-preprocess -o test.i #1</span></b><br />
#include "..." search starts here:<br />
#include <...> search starts here:<br />
/usr/include/gcc/4.2<br />
/usr/include<br />
End of search list.<br />
<b><span style="color: red;"> /usr/libexec/cc1 -fpreprocessed test.i -quiet -dumpbase test.c -auxbase test -version -o test.s #2</span></b><br />
GNU C version 4.2.1 20070831 patched [FreeBSD] (amd64-undermydesk-freebsd)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>compiled by GNU C version 4.2.1 20070831 patched [FreeBSD].<br />
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072<br />
Compiler executable checksum: a8daf30220ba0c32c21af96787b683e6<br />
<span style="color: red;"><b> /usr/bin/as -V -Qy -o test.o test.s #3</b></span><br />
GNU assembler version 2.17.50 [FreeBSD] 2007-07-03 (x86_64-unknown-freebsd) using BFD version 2.17.50 [FreeBSD] 2007-07-03<br />
<span style="color: red;"><b> /usr/bin/ld --eh-frame-hdr -V -dynamic-linker /libexec/ld-elf.so.1 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib -L/usr/lib hello.o test.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/crtend.o /usr/lib/crtn.o #4</b></span><br />
GNU ld 2.17.50 [FreeBSD] 2007-07-03<br />
Supported emulations:<br />
elf_x86_64_fbsd<br />
elf_i386_fbsd<br />
<br />
<br />
<span style="color: #38761d; font-size: large;">#1 プリプロセス</span><br />
cc1 がコンパイラ本体らしい<br />
以下が出力されたtest.i の一部<br />
マクロ展開とインクルードファイルの中身の出力が行われていることが確認できる。<br />
<br />
# 1 "test.c"<br />
# 1 "<built-in>"<br />
# 1 "<command-line>"<br />
# 1 "test.c"<br />
# 1 "/usr/include/stdio.h" 1 3 4<br />
# 39 "/usr/include/stdio.h" 3 4<br />
# 1 "/usr/include/sys/cdefs.h" 1 3 4<br />
# 40 "/usr/include/stdio.h" 2 3 4<br />
# 1 "/usr/include/sys/_null.h" 1 3 4<br />
# 41 "/usr/include/stdio.h" 2 3 4<br />
# 1 "/usr/include/sys/_types.h" 1 3 4<br />
# 33 "/usr/include/sys/_types.h" 3 4<br />
# 1 "/usr/include/machine/_types.h" 1 3 4<br />
# 51 "/usr/include/machine/_types.h" 3 4<br />
typedef signed char __int8_t;<br />
typedef unsigned char __uint8_t;<br />
typedef short __int16_t;<br />
typedef unsigned short __uint16_t;<br />
typedef int __int32_t;<br />
<br />
=中略=<br />
<br />
# 2 "test.c" 2<br />
# 1 "hello.h" 1<br />
<br />
<br />
<br />
int sayHello(void);<br />
# 3 "test.c" 2<br />
<br />
int<br />
main(int argc, char **argv)<br />
{<br />
sayHello();<br />
return 0;<br />
}<br />
<br />
<span style="color: #38761d; font-size: large;">#2 アセンブリコード生成</span><br />
<br />
<br />
-test.s-<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.file<span class="Apple-tab-span" style="white-space: pre;"> </span>"test.c"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.text<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.p2align 4,,15<br />
.globl main<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.type<span class="Apple-tab-span" style="white-space: pre;"> </span>main, @function<br />
main:<br />
.LFB3:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pushq<span class="Apple-tab-span" style="white-space: pre;"> </span>%rbp<br />
.LCFI0:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>movq<span class="Apple-tab-span" style="white-space: pre;"> </span>%rsp, %rbp<br />
.LCFI1:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>subq<span class="Apple-tab-span" style="white-space: pre;"> </span>$16, %rsp<br />
.LCFI2:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>movl<span class="Apple-tab-span" style="white-space: pre;"> </span>%edi, -4(%rbp)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>movq<span class="Apple-tab-span" style="white-space: pre;"> </span>%rsi, -16(%rbp)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><b><span style="color: red;">call<span class="Apple-tab-span" style="white-space: pre;"> </span>sayHello</span></b><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>movl<span class="Apple-tab-span" style="white-space: pre;"> </span>$0, %eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>leave<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>ret<br />
.LFE3:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.size<span class="Apple-tab-span" style="white-space: pre;"> </span>main, .-main<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.section<span class="Apple-tab-span" style="white-space: pre;"> </span>.eh_frame,"a",@progbits<br />
.Lframe1:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.long<span class="Apple-tab-span" style="white-space: pre;"> </span>.LECIE1-.LSCIE1<br />
.LSCIE1:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.long<span class="Apple-tab-span" style="white-space: pre;"> </span>0x0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.byte<span class="Apple-tab-span" style="white-space: pre;"> </span>0x1<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.string<span class="Apple-tab-span" style="white-space: pre;"> </span>"zR"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.uleb128 0x1<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.sleb128 -8<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.byte<span class="Apple-tab-span" style="white-space: pre;"> </span>0x10<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.uleb128 0x1<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.byte<span class="Apple-tab-span" style="white-space: pre;"> </span>0x3<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.byte<span class="Apple-tab-span" style="white-space: pre;"> </span>0xc<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.uleb128 0x7<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.uleb128 0x8<br />
=以下略=<br />
<br />
<br />
<span style="color: #38761d; font-size: large;">#3 アセンブル</span><br />
アセンブルのコードを機械語に変換 オブジェクトファイル(*.o)を出力する<br />
<br />
<br />
<span style="color: #38761d; font-size: large;">#4 リンク</span><br />
必要なライブラリをリンクして、最終的な実行形式ファイル(ELF)を出力する。<br />
以下は、出力されたバイナリに依存する共有ライブラリを表示<br />
<br />
$ ldd test<br />
<br />
test:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>libc.so.7 => /lib/libc.so.7 (0x800819000)<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-17512298895418341732013-10-20T00:11:00.001+09:002013-10-20T00:11:09.972+09:00[FreeBSD] style(9) 単語man style(9) の翻訳で分からなかった単語の意味を列挙します。<br />
<br />
implicit 暗に示す<br />
assume 思い込む<br />
silent on 言及しないで<br />
History is silent on this event. 歴史は、この事件に関しては何も記していない。<br />
brevity 簡潔な<br />
trim 削減する<br />
onlike in this one これとは違って<br />
obtain B from A AからBを得る<br />
elsewhre そのほかの場所では、<br />
(a) applicable 適用可能である<br />
enclose 囲む<br />
okay to A Aして大丈夫です。<br />
side effect 副作用<br />
either どちらか一方<br />
parentheses 確固<br />
expantion 拡張<br />
right-justigy 右寄せにする<br />
encapsulate 要約する<br />
compound statement 複合ステートメント<br />
invocation 呼び出し<br />
conditionally 条件的に<br />
discern がわかる。はっきりと認める。<br />
subjectively 主観的に<br />
corresponding 一致する、対応する<br />
preceding 先行する、前述の、上記の、先立つ<br />
abbreviate 略して書く<br />
identifier 識別子<br />
in preference to A Aに勇戦して。 Aよりはむしろ。<br />
overiding 他の全てに優先する<br />
qualifier 修飾語句<br />
suffice 満足させる<br />
know if A is B AがBであるかどうかを知る<br />
whereas であるのに ところが に反して<br />
convention 慣習 しきたり、<br />
elsewhere ほかの場所<br />
relevant a 関連のある<br />
preferably なるべく むしろ 好んで<br />
compelling 強制的な むりやりの<br />
precedent 慣例<br />
either A or B AまたはB A,Bのどちらでも A,Bのいづれかを<br />
preferable より好ましい<br />
line up 整列する<br />
briefly 簡単に<br />
consistency 一貫性<br />
obvioud 明白な<br />
complicate 複雑にする<br />
unary 単項の<br />
binary operator 二項演算子<br />
precedence 先行、上位<br />
obvious 明白な<br />
desire 強く願う<br />
elicit 誘い出す、引き出す<br />
complaint 不平、ぐち<br />
whatever〜 どんな〜でも<br />
compliant with に従う<br />
consistent with 調和して、矛盾しないで<br />
apporoximately ほぼ<br />
diverge 分岐する、離れる<br />
desire 要望<br />
practice 実践<br />
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-85432476672892313032013-10-20T00:08:00.000+09:002013-10-20T00:15:32.898+09:00[FreeBSD] style(9) 難訳箇所についてman style(9) の翻訳で訳すのが難しいと感じた箇所について<a href="http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=style&dir=jpman-5.4.0%2Fman&sect=0" target="_blank">日本語翻訳マニュアル</a>の訳を見てみます。<br />
<br />
<span style="font-size: large;">1)</span> Be careful to check the examples before <b><span style="color: red;">assuming that style is silent on an issue.</span></b><br />
<br />
-> styleがこれらの<b><span style="color: red;">例について言及していないと決めつける</span></b>前に、注意して例を確認してください。<br />
<br />
assume: 決め付ける<br />
<br />
<span style="font-size: large;">2)</span> All VCS (version control system) revision identification in files obtained form else where should be maintained.<br />
<br />
-> 全てのVCS(バージョン官吏システム)リビジョン識別子は、存在すれば維持します。<br />
<br />
obtain: 手に入れる<br />
maintain: 維持する、持続する<br />
<br />
<br />
<span style="font-size: large;">3)</span> In declarations, do not put any whitespace between asterisks and adjacent tokens, <b><span style="color: red;">except for</span></b> tokens that are indentifiers related to types.<br />
<br />
-> 宣言の中では、型に関係づけられたトークン<b><span style="color: red;">を除いて</span></b>、アスタリスクと隣接したトークンの間には空白文字を置きません。<br />
<br />
<span style="font-size: large;">4)</span> for example you <b><span style="color: red;">need to know if</span></b> the typedef is the structure itself or a pointer to the structure.<br />
<br />
-> 例えば、typedefが構造体そのものであるか、構造体へのポインタ<b><span style="color: red;">であるのか</span></b>、あなたか<span style="color: red;"><b>知る必要があります</b>。</span><br />
<br />
A need to know if B.: Aは、Bであるかを知る必要がある。<br />
<br />
<span style="font-size: large;">5)</span> In general code can be considered "new code" when <b><span style="color: red;">it makes up about 50% or more of the file(s) involved.</span></b><br />
<br />
-> <span style="color: red;"><b>ファイルの50%以上かそれ以上を巻き込んだ修正の場合は</b>、</span>一般にコードは、”新しいコード"とみなすことができます。<br />
<br />
involve: 巻き込む<br />
<br />
<span style="font-size: large;">6)</span> ANSI C says that such declarations have file scope <b><span style="color: red;">regardless of</span></b> the nesting of the declaration.<br />
<br />
-> ANSI Cによるとこの様な宣言は、宣言のネスティング<b><span style="color: red;">によらず</span></b>、ファイルスコープになります。<br />
<br />
regardless of A: Aにもかかららず<br />
<br />
<br />
<span style="font-size: large;">7)</span> Code that is approximately FreeBSD KNF style compliant in the repository must not <b><span style="color: red;">diverse from</span></b> compliance.<br />
<br />
-> リポジトリの中のおおよそFreeBSD KNF style に適合しているコードは、この適合<b><span style="color: red;">から離れては</span></b>なりません。<br />
<br />
compliant: 準拠している<br />
diverse: 別種の、異なった<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-36185007576931837562013-10-15T23:40:00.003+09:002013-10-15T23:40:56.167+09:00[FreeBSD] styleの自力和訳英語の鍛錬のためにstyle(9)を自力で英訳してみた。<br />
<br />
FreeBSD カーネル開発者用マニュアル<br />
<br />
#NAME#<br />
style -- カーネルソースファイル書式ガイド<br />
<br />
#DESCRIPTION#<br />
<br />
このファイルでは、FreeBSDソース群の中でもカーネルソースファイルの推奨される<br />
書式を規定している。またこれは、ユーザー向けのプログラムのコードの書式<br />
ガイドでもある。多くの書式規則が例文とともに示されている。その書式が<br />
重要な点について記していないと思う前によく例をチェックされい。<br />
<br />
/*<br />
* FreeBSDの書式ガイド。CSRGのカーネル標準書式(KNF)に基づいた。<br />
* @(#)style 1.14 (Barkeley) 4/28/95<br />
* $FreeBSD release/9.1.0/share/man.style.9 217807 2011-01-07 08:34:12Z trasz $<br />
*/<br />
<br />
/*<br />
* "とても"重要な1行のコメントは、この様に書く。<br />
*/<br />
<br />
/*<br />
* 複数行のコメントは、この様に書く。普通の文章と同じように。普通の文章の<br />
* 段落分けと同じように記述する。<br />
*/<br />
<br />
著作権の表示は、複数行であるべきだ。一行目は、アスタリスクの後にダッシュを続け<br />
次の様に書く。<br />
<br />
/*-<br />
* Copyright (c) 1982-2025 John Q. Public<br />
* All rights reserved.<br />
*<br />
* 長く退屈なライセンスは、ここに書く。しかし、完結かつ短く。<br />
*/<br />
<br />
スクリプトは、ソースツリーから"/*-"から始まるコメントの全てをライセンス情報として収集する。<br />
もし、indent(1)の1文字目から始まるライセンスや著作権表示ではないコメントを再整形しないフラグ<br />
を立てることを望む場合は、そのコメントのダッシュをアスタリスクに変更せよ。1行目以外の<br />
コメントは、ライセンス文として考慮されない。<br />
<br />
著作権ヘッダーの後に、空行を入れる。そして、C/C++以外のソースファイルのための$FreeBSD$。<br />
バージョンコントロールIDタグ一つのファイルに1つのみ含まれるべきである(これとは違い)。<br />
C/C++以外のソースファイルは、上記の例の様にあるべきである。C/C++のソースファイルにおいては、<br />
以下の1つに準拠する。ファイルの全てのVCS(Version control system) の版は、<br />
その他のファイルでは、メンテナンスされ、含まれ、適用可能で、複数のIDがファイルの履歴を<br />
示す。総じて、外部のIDとインフラを編集すべきではない。ラップされることなしに("#if<br />
defined(#LIBC_SOCS)")、非互換のビットを隠し、IDをオブジェクト<br />
ファイルに含ませないために"#if 0... #nedif"で囲む。ファイル名が変更された<br />
場合、外部のVCSIDの直前にのみ"From: "を追加する。<br />
<br />
#if 0<br />
#ifndef lint<br />
static char sccsid[] = "@(#)style<span class="Apple-tab-span" style="white-space: pre;"> </span>1.14 (Barkeley) 4/28/95":<br />
#endif /* not lint */<br />
<br />
#endif<br />
<br />
#include <sys/cdefs.h><br />
<br />
__FBSID("#FreeBSD: release/9.1.0/share/man/man9/style.9 217087 2011-01-07 08:34:12Z trasz $"):<br />
<br />
ヘッダーファイルの前のその他の空行は、そのままにしておく。<br />
<br />
通常は、カーネルのインクルードファイル(例: sys/*.h)が最初に来る。<br />
<sys/types.hと<sys/param.h>の両方ではなく、どちらか一方をインクルードする。<br />
<sys/types.h>は<sys/coefs.h>インクルードする。そして、<sys/types.h>は、<br />
<sys/coefs.h>に依存して問題ない。<br />
<br />
#include <sys/types.h> /* ローカルではないインクルードは、<>で囲む */<br />
<br />
ネットワークプログラムにおいては、次にネットワーク関係のインクルードファイルを次に書く。<br />
<br />
#include <net/if.h><br />
#include <net/if_dl.H><br />
#include <net/route.h><br />
#include <netinet/in.h><br />
#include <[protocolos/wrhod.h><br />
<br />
カーネルのソースに/usr/includeにあるファイルを使ってはいけない。<br />
<br />
次のグループの前に空行を置く。/usr/includeにあるファイルは、アルファベット順で<br />
ソートされていなければいけない。<br />
<br />
#include <stdio.h><br />
<br />
グローバルなパスは、<paths.h>で定義されている。プログラム固有のローカルパスは、<br />
ローカルの"pathnames.h"に記述する。<br />
<br />
#include <paths.h><br />
<br />
ユーザー固有のインクルードファイルの前に空行を置く。<br />
<br />
#include "pathnames.h" /* ローカルのインクルードファイルは、ダブルクオートでくくる*/<br />
<br />
実装名前空間でアプリケーションインターフェースを実装する場合を除いて#define したり名前<br />
を宣言してはいけない。<br />
<br />
"unsafe"マクロの名前(副作用を伴う)と内容が明白なマクロの名前は、全て大文字にする。<br />
語句のようなマクロの拡張は、一つのトークンか括弧の外を持つ。#defineと<br />
マクロ名の間には、タブ一つを置く。もしマクロがインライン関数の拡張ならば、関数名は、全て小文字<br />
にする。読みやすくするためにバックスラッシュを右寄せにする。もし、マクロが複合ステートメント<br />
ならば、それをdoループで囲む。そうすればif文の中で安全に使うことができる。文章の終端の<br />
セミコロンは、華奢なプリンターやエディタのパースを簡単にするべくマクロよりむしろ<br />
マクロの呼び出しによっておかれるべきだ。<br />
<br />
#define MACRO(x, y) do {<span class="Apple-tab-span" style="white-space: pre;"> </span>\<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>variable = (x) + (y);<span class="Apple-tab-span" style="white-space: pre;"> </span>\<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>(y) += 2;<span class="Apple-tab-span" style="white-space: pre;"> </span>\<br />
} while(0)<br />
<br />
コードが#ifdefや#ifを使い条件的にコンパイルされる時、マッチする#endifや<br />
#elseに続き、読み手が容易に条件付きコンパイルのコード部分の終わりが<br />
分かるようにコメントを追加するかもしれない。そのコメントは、<br />
(主観的に)当該コード部分が長いと思われる場合、20行を越える場合、#ifdef<br />
のネストが読み手を混乱させる可能性がある場合にのみ用いられるべきである。<br />
例外は、lint(1)の目的のために条件付きコンパイルされない複数のケースのために作られるかもしれ<br />
ない。これは、コンパイルされるコードが少ない場合においてさえそうである。コメントは、<br />
1つのスペースで#endifや#elseと離すべきである。短い条件付きコンパイル部分に対しては、<br />
近接したコメントは、つけるべきではない。<br />
<br />
#endifへのコメントは、対応する#if、#fidefと表現を一致させるべきである。#else,#elif<br />
へのコメントは、先行する#if、#elif文と逆の表現とすべきである。コメントにおける、<br />
"defined(FOO)"のような準表現は、"FOO"と略される。コメントの目的は、"#ifndef FOO"は、<br />
"#if !defined(FOO)"として扱われる。<br />
<br />
#ifdef KTRACE<br />
#include <sys/ktrace.h><br />
#endif<br />
#ifdef COMPAT_43<br />
/*A large region here, or other condional code. */<br />
#else /* !COMPAT_43 */<br />
/* Or here. */<br />
#endif /* COMPAT_43 */<br />
<br />
#ifndef COMPAT_43<br />
/* Yet another large region here, or other conditional code. */<br />
#else /* COMPAT_43 */<br />
/* Or here */<br />
#endif /* !COMPAT_43 */<br />
<br />
プロジェクトは、古いBSDスタイルのu_intxx_t式の整数識別子よりむしろISOIEC 9899:1999<br />
("ISO C99") uintxx_t式の符号無し整数の識別子を使うべくゆっくり動いている。新しい<br />
コードは、後者を使うべきである。そして、もし、他の主要な作業が終わり格別の理由がなければ<br />
そのエリアにある古い様式を、新しい様式に変換すべきである。何もないコミットの様に、ケアは、uintxx_tのみのコミットにすべきである。<br />
<br />
列挙型の値は、全て大文字である。<br />
<br />
enum enumtype {ONE, TWO} et;<br />
<br />
識別子における内側の_アンダースコアの使用は、cammelCaseやTitleCaseにもまして<br />
好まれる。<br />
<br />
宣言部においては、トークンが型に関連した識別子である場合を除いて隣接したトークンと<br />
アスタリスクの間にスペースを開けてはいけない。(それら識別子は、基底型の名前、修飾子、<br />
独立して宣言されるものと言うよりむしろtypedefで定義されるものである。)<br />
それら識別子は、スペース一つでアスタリスクと分けなさい。<br />
<br />
構造体のメンバを宣言する時、使用する順番、サイズ(大きいものから小さいもの)<br />
、アルファベット順でソートして宣言しなさい。最初のカテゴリは、通常適用されない。<br />
しかし、例外がある。1つのメンバーは、1行で宣言しなさい。可読性を向上させるため<br />
メンバー名をあなたの裁量で1つまたは2つのタブで整列するよう努めなさい。一つのタブは、<br />
少なくともメンバーの90%が揃う場合にのみ使用するべきである。とても長い型に続く<br />
名前は、スペース1つで分離すべきである。<br />
<br />
主要な構造体は、構造体が使われるファイルの先頭で宣言するすべきである。<br />
また、構造体が複数のソースで使われる場合は、ヘッダーファイルに分離すべきである。<br />
構造体の使用部と宣言部は、分離すべきであり、ヘッダーファイルで宣言されている<br />
場合は、externすべきである。<br />
<br />
struct foo {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct foo<span class="Apple-tab-span" style="white-space: pre;"> </span>*next;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* List of active foo */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct mumblue<span class="Apple-tab-span" style="white-space: pre;"> </span>amumble;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* mumble のコメント */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int<span class="Apple-tab-span" style="white-space: pre;"> </span>bar;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* コメントを揃えるように */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>strcut verylongtypename *baz<span class="Apple-tab-span" style="white-space: pre;"> </span>/* 2つのタブで揃わない場合 */<br />
};<br />
struct foo *foohead;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* グローバルなfooリストの先頭 */<br />
<br />
可能な時は常に、自分でリストを回すのではなくてquese(3)マクロを用いよ。<br />
従って、前述の例は、次の様に書くのが好ましい。<br />
<br />
#include <sys/queue.h><br />
<br />
struct foo {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>LIST_ENTRY(foo) link;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* fooリストには、queueマクロを用いる */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct mumble<span class="Apple-tab-span" style="white-space: pre;"> </span>amumble;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* mumbleのコメント */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int<span class="Apple-tab-span" style="white-space: pre;"> </span>bar;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* コメントを揃えるように。 */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct verylongtypename *baz;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* 2つのタブで揃わない場合 */<br />
};<br />
LIST_HEAD(, foo) foohead;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* グローバルなfooリストの先頭 */<br />
<br />
構造体の型にtypedefsを用いるのは、避けなさい。Typedefsは、元の型を適切に<br />
隠さないので、問題を抱えがちである。例えば、typedefが構造体自身もしくは構造体への<br />
ポインターかどうかを知る必要がある。加えてそれらは、正確に1回宣言しなければいけない。<br />
ところが、不完全な構造体の型は、不必要であるにもかかわらず何回も記述することができる。<br />
Typedefsは、独立したヘッダーファイルで用いいるのが難しい。typedefを定義するヘッダーは、<br />
用いられるヘッダーより以前に、用いられるヘッダによって(名前空間の汚染をもたらす)インクルード<br />
されなければいけない。また、それらは、typedefを含むことに対するバックドアでなければいけない。<br />
<br />
慣習がtypedefを必要とするとき、その名前は、構造体のタグ名と一致させるべきである。Standard C<br />
もしくはPOSIXで指定されている場合を除いてtypedefの最後を"_t"とするのは避けなさい。<br />
<br />
/* 構造体の名前は、タグ名と一緒にせよ */<br />
typedefi struct bar {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int<span class="Apple-tab-span" style="white-space: pre;"> </span>level;<br />
} BAR;<br />
typedef int<span class="Apple-tab-span" style="white-space: pre;"> </span>foo;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* これは、foo */<br />
typedef const long<span class="Apple-tab-span" style="white-space: pre;"> </span>baz;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* これは、baz */<br />
<br />
全ての関数は、どこかでプロトタイプ宣言されている。<br />
<br />
(ほかの場所から使われない)プライベートな関数のプロトタイプ宣言は、ソースコードの<br />
一番最初に持っていくべきである。ソースコード内のみで使われる関数は、staticと<br />
宣言すべきである。<br />
<br />
カーネルの別の部分から使われる関数は、関連のあるインクルードファイルでプロトタイプ宣言される。<br />
関数のプロトタイプ宣言は、論理的順序で列挙するべきである。他の順番を使う<br />
明白な理由がない場合は、なるべく、アルファベット順を使うべきである。<br />
<br />
一つ以上のモジュールから使用されるローカルな関数は、"extern.h"のような別のヘッダーファイルに<br />
含めるべきである。<br />
<br />
__Pマクロを用いるべからず。<br />
<br />
総じて、50%以上ファイルが影響を受けるコードは、"新しいコード"と認識される。これは、<br />
既存のコードの慣例を崩すのに十分である。現在のstyleガイドラインに従いなさい。<br />
<br />
カーネルは、パラメータの型にに関連付けられた名前を持つ。以下カーネルでの使用例。<br />
<br />
void<span class="Apple-tab-span" style="white-space: pre;"> </span>function(int fd);<br />
<br />
ヘッダーファイルにおいては、ユーザーランドのアプリケーションに対して見えるようにせよ。<br />
見えるプロトタイプ宣言は、(アンダーバーから始まる)"protected"な名前か名前のない型のどちらか<br />
を用いなければいけない。purotectedな名前を使う方が好まれる。<br />
<br />
void<span class="Apple-tab-span" style="white-space: pre;"> </span>function(int);<br />
<br />
か<br />
<br />
void<span class="Apple-tab-span" style="white-space: pre;"> </span>function(int _fd);<br />
<br />
プロトタイプ宣言は、関数の名前を揃えるためにタブの後に多くのスペースを含むかもしれない。<br />
<br />
static char<span class="Apple-tab-span" style="white-space: pre;"> </span>*function(int _argc, const char *_arg2, struct foo *_arg3,<br />
struct bar *_arg4);<br />
static void<span class="Apple-tab-span" style="white-space: pre;"> </span>*usage(void);<br />
<br />
/*<br />
* 全ての主要なルーチンには、何をするかということを簡単に説明したコメントをつけるべきである。<br />
* mainルーチンの前のコメントは、このプログラムが何をするかを説明すべきである。<br />
*/<br />
int<br />
main(int argc, char *argv[])<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>char *ep;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>long num;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int ch;<br />
<br />
一貫性のために、オプションをパースするときは、getopt(3)を用いるべきである。<br />
オプションは、switch文の一連の流れの一部ではなく、getopt(3)の呼び出しとswitch文の中で<br />
ソートされるできである。switch文の中の要素であるcascadeには、FALLTHROUGHコメントを<br />
つけるべきである。数の引数に対しては、精度をチェックすべきである。明白な理由に到達不可能な<br />
コードは、/* NOTREACHED */とマークされるかもしれない。<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>while((ch = getopt(arc, argv, "abNn:")) != -1)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>switch (ch) {<span class="Apple-tab-span" style="white-space: pre;"> </span>/* switch文をインデントせよ */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case 'a':<span class="Apple-tab-span" style="white-space: pre;"> </span>/* case文はインデントしない */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>aflag = 1;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* case文本体は、1つのタブでインデント */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>/* FALLTHROUGH */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case 'b':<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>bflag = 1;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case 'N':<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Nflag = 1l<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case 'n':<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>num = strtol(optarg, &ep, 10);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (num<= 0 || *ep != '\0') {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>warnx("illegal number, -n argument -- %s",<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> optarg);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>usage();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>break;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>case '?':<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>default:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>usage();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>argc -= optind;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>argv += optind;<br />
<br />
(if, while, for, return, switch)の後には、スペースをいれよ。ステートメントが<br />
一行以上になる許される場合の除いてゼロもしくは1ステートメントと共にブレース("{""}")を<br />
ステートメントを制御するために用いてはいけない。無限ループは、whileではなく、forを用いよ。<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>for (p = buf; *p != '\0'; ++p)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>/* nothing */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>for (; :)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>stmt;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>for (; :) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>z = a + really + long + statement + that + needs +<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> two + lines + gets + indented + for + spaces +<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> on + the + second + and + subsequent + lines;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>for (; ;) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (cond)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>stmt;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (val != NULL)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>val = realloc(val, newsize);<br />
<br />
forループの一部は、空になるかもしれない。ルーチンが特殊で複雑な場合を除いてブロック内で<br />
宣言をしてはいけない。<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>for (; cnt < 15l cnt++) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>stmt1;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>stmt2;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
インデントは、8文字のタブにすること。2段目のインデントは、4つのスペースにすること。もし、<br />
長いステートメントとなる場合は、演算子を行の最後に書くこと。<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>while (cnt < 20 && this_variable_name_is_too_long &&<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> ep != NULL)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>z = a + really + long + statement + that + needs +<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> two + lines + gets + indented + four + spaces +<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> on + the + second + and + subsequent + lines;<br />
行末に空白を入れては、いけない。タブは、空白の後ろにインデントを揃えるためにのみ使いなさい。<br />
タブよりも多くのスペースを使ってはいけない。タブの前にスペースを入れてはいけない。<br />
<br />
ブロックの始まりと終わりのブレースは、elseと同じ行に書きなさい。不必要なブレースは、<br />
いれない。<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (test)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>stmt;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>else if (bar) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>stmt;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} else<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>stmt;<br />
<br />
関数名の後にスペースを入れない。コンマの後には、スペースを入れよ。'('や'["の後に<br />
スペースを入れない。')'や']'の前にスペースを入れない。<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>error = function(a1, a2);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if (error != 0)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>exit(error);<br />
<br />
単項演算子にスペースは、必要ない。二項演算子には、スペースが必要である。優先させる必要がある<br />
場合や複雑なステートメントの場合を除いて()を使ってはいけない。他人は、自分より<br />
混乱しやすいかもしれないということを覚えておこう。下記のコードが理解できるか?<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>a = b->c[0] + ~b == (e || f) || g && h ? i : j >>1;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>k = !(l & FLAGS);<br />
<br />
処理に成功した場合は、0を返し、失敗した場合は、1を返せ。<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>exit(0); /*<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> * "処理成功時は、0を返す"の様な<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> * 明白なコメントは、避けよ。<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> */<br />
}<br />
<br />
関数の返り値の型は、"function"の前の行に書きなさい。関数の中身を書くための右ブレースは、<br />
1行に書きなさい。<br />
<br />
satic char *<br />
function(int a1, int a2, float fl, int a4)<br />
{<br />
<br />
関数内で変数を宣言する時、サイズ順->アルファベット順で宣言しなさい。複数の変数を<br />
1行でまとめて宣言するのは、OK。もし、一つの型の変数が1行に収まらない時は、複数行に<br />
分けて、型名を行頭に書きなさい。宣言部で変数を初期化することによってコードが<br />
分かりにくくなることのない様に気を付けなさい。このことについては、あまりシビアに<br />
ならなくても良い。初期化部において関数の呼び出しをしてはいけない。<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>struct foo one, *two;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>double three;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int *four, five;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>char *six, seven, eight, nine, ten, elven, twelve;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>for = myfunction();<br />
<br />
関数の中で関数を宣言しては、いけない。ANSI Cにおいては、そのような<br />
不注意な入れ子の宣言は、ファイルスコープを持つ。ローカルスコープに現れる<br />
ファイルスコープは、思わぬ不平を良いコンパイラから引き出す。<br />
<br />
キャストとsizeofの後にスペースを入れては、いけない。ちなみに、indent(1)は、<br />
このルールに依らない。sizeofは、丸括弧とともにかかれる。sizeof(var)インスタンスに<br />
冗長な丸括弧のルールを適用しては、いけない。<br />
<br />
NULLは、空のポインタ定数を好む。アサイメント等コンパイラが型を知っているコンテキストにおい<br />
ては、(type *)0や(type *)NULLの代わりにNULLを使え。その他のコンテキスト、特に全ての関数の<br />
引数においては、(type *)NULLを使え。(もし、関数のプロトタイプ宣言がスコープにない場合、キャ<br />
ストは、可変長引数においては必要であるが、その他の引数に対しては、不必要である。)<br />
ポインタのNULLチェックの例<br />
<br />
(p=f()) == NULL<br />
<br />
悪い例:<br />
<br />
!(p = f())<br />
<br />
論理型でないにもかかわらず、チェックに!を使うな。次の様にすべきである。<br />
<br />
IF (*p == '\0')<br />
<br />
悪い例:<br />
<br />
if (!*p)<br />
<br />
void *を返すルーチンは、返り値を勝手にキャストして返してはいけない。<br />
return文における値は、丸括弧で囲むべきである。<br />
<br />
err(3)やwarn(3)を使え。自分で実装するな。<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if ((four = malloc(sizeof(struct foo))) === NULL)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>err(1, (char *)NULL);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if ((six = (int *)overflow()) == NULL)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>errx(1, "number overflowwed")'<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return (eight);<br />
}<br />
<br />
この様な古い様式の関数宣言。<br />
<br />
static char *<br />
function(a1, a2, f1, a4)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int a1, a2;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* 整数型の宣言。これらをデフォルトにしてはいけない。*/<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float f1;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* floatとdoubleのプロトタイプの違いに注意せよ。 */<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>int a4;<span class="Apple-tab-span" style="white-space: pre;"> </span>/* 順番が宣言されたリスト */<br />
{<br />
<br />
明白にK&Rとの互換性が必要な場合を除いて、ANSIの関数宣言を使いなさい。長いパラメータの<br />
リストは、4つの普通のスペースでインデントしなさい。<br />
<br />
可変長の引数は、次の様にすべきである。<br />
<br />
#include <stdarg.h><br />
<br />
void<br />
vaf(const char *fmt, ...)<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>vs_list ap;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>va_start(ap, fmt);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>STUFF;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>vs_end(ap);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>/* void型を返す関数においては、return文は不要である */<br />
}<br />
<br />
<br />
static void<br />
usage()<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>/* 関数に、ローカル変数がない場合は、空行を入れる。 */<br />
<br />
どんなにそれが、早くきれいだとしても、おろかなバグに気を使わなくても良いように<br />
fputs(3),puts(3),putchar(3)ではなくて、printf(3)を使いなさい。<br />
<br />
Usage文は、マニュアルページのSYNOPSISのようにあるべきである。そして、<br />
下記順番になっているべきである。<br />
<br />
1. オペラントの必要ないオプションを一番最初仁1組のラケット"[]"の内側にアルファベット順<br />
で書く。<br />
2. オペランドが必要なオプションを次に、同じくアルファベット順でブラケットの内側に書く。<br />
3. 必要な引数があれば、次にコマンドラインで指定すべき順序で書く。<br />
4. 最後に、残りの任意の引数をブラケットの内側に同じくコマンドラインで指定すべき<br />
順序で列挙する。<br />
<br />
バーは、"どちらか一方の"オプション、引数を分離する。共に指定すべき複数のオプション、引数は、<br />
一組のブラケットの内側に書く。<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"usage: f [-aDde] [-b b_arg] -m m_arg] req1 req2 [opt1 [opt2]]\n"<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>"usage: f [-a | -b] [-c [-dEe] [-n number]]\n"<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>(void)fprintf(stderr, "usage" f [ab]\n");<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>exit(1);<br />
}<br />
<br />
マニュアルのオプションの説明は、純粋にアルファベット順であるべきだ。これは、オプションが<br />
引数を取る/取らないにかかわらない。また、大文字小文字の順で示すべきだ。<br />
<br />
現在、カーネルコードは、styleガイドに従うべきである。サードパーティによるモジュールや<br />
ディバイスドライバのガイドラインは、より緩和的である。しかし、最低限内面的に<br />
それらのstyleと矛盾しないようにすべきである。<br />
<br />
様式的な変化(空白の変化も含め)は、ソースリポジトリにとって重大であり、良い理由を除いて<br />
避けなければいけない。リポジトリにおけるFreeBSD KNF style規則のコードは、コンプライアンス<br />
から逸脱してはいけない。可能な時は、いつでもコードをコードチェッカー(lint(1)やgcc -Wall<br />
にかけ、警告を最小限に減らすべきである。<br />
<br />
#SEE ALSO#<br />
indent(1), lint(1), err(3), warn(3), style.Makefile(5)<br />
<br />
#HISTORY#<br />
このマニュアルページのほとんどは、4.4BSD-Lite2 release の src/admin/style/styleの<br />
ファイルに基づき、日々の更新は、現在のFreeBSDプロジェクトの要望と実践に反映されている。<br />
src/admin/style/style は、Ken ThompsonとDenis RitchieのAT&T UNIX Version 6に<br />
おけるプログラミング様式のCSRGである。Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-32184534158329445172013-09-28T10:57:00.000+09:002013-09-28T10:57:17.012+09:00[xfce] uim-anthy-gtk-systray をログイン時に実行表記の件について<br />
<br />
[Applications Menu - Settings - Session and Startup] をクリック。<br />
<br />
「Seccion and Startup」ダイアログの「Application Auotstart」タブを選択して。<br />
<br />
「uim-toolbar-gtk-systray」を追加します。<br />
<br />
<br />
<br />
ちなみに、設定ファイル弄る方法を初め模索しましたが「uim-toolbar-gtk-systray」が実行されるタイミングが悪く(ファイルの編集方法が悪く)諦めました。Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-29598657396350127292013-09-24T23:51:00.001+09:002013-09-24T23:51:07.367+09:00[FreeBSD] Installing flash pluginEnvironmente: FreeBSD 9.1-RELEASE<br />
<br />
<br />
If you installed emulators/linux_base-f10<br />
<br />
You only to run<br />
<br />
kldload linux<br />
<br />
And add following line to /etc/rc.conf<br />
<br />
linux_enable="YES"<br />
<br />
<br />
And reference<br />
<br />
<a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/desktop-browsers.html" target="_blank">7.2.1.2. Firefox and Adobe® Flash™ Plugin</a>Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-60325219380902044262013-09-24T22:36:00.001+09:002013-09-24T22:36:55.006+09:00[FreeBSD] compiling chromium browserI compiled chromium browser(<span style="color: #303942; font-family: 'Bitstream Vera Sans', Arial, sans-serif; font-size: 12px;">Version 29.0.1547.76</span>) on FreeBSD 9.1-RELEASE.<br />
<br />
<br />
[Point of compiling chromium browser]<br />
<b>compile with out debug symbol</b><br />
When I compiled chromium with debug symbol. chrome aborted by signal 16.<br />
<br />
<br />
$ cd /usr/ports/www/chromium/<br />
$ make config-recursive<br />
$ make<br />
$ make install<br />
<br />
<br />
And add follwoing line to /etc/syctl.conf<br />
<br />
kern.ipc.shm_allow_removed=1<br />
<br />
So you can run chromium browser.<br />
<br />
$ chrome # not chromiumAnonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-39740275980256149262013-09-23T21:11:00.000+09:002013-09-23T21:11:25.348+09:00[Office Suite] docx pptx xlsx について「docx pptx xlsx」という一連の<a href="http://ja.wikipedia.org/wiki/Office_Open_XML" target="_blank">「*x」というフォーマット</a>は、zipでxmlファイル群圧縮しているらしい。<br />
PyCon 2013 の <a href="http://www.slideshare.net/KazufumiOhkawa/python-26202075" target="_blank">kzfmさんの資料</a>を参考にさせて頂き実践してみた。<br />
<br />
まず、サンプルのパワーポイントスライドを作って「sample.pptx」で保存する。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP-XaahaO1dvKOk6OSs-U3uX_BXdviV5YJ30GOh825wch91Mf1FXeEoY8XNZbzUSUCZje6cBjgxGBF-xVXih2QwiLRFM_5HLHtVxMuDG1eaybJAn4JEPYJJa-OXyyAN2noblUazGR_ptOP/s1600/WS000022.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhP-XaahaO1dvKOk6OSs-U3uX_BXdviV5YJ30GOh825wch91Mf1FXeEoY8XNZbzUSUCZje6cBjgxGBF-xVXih2QwiLRFM_5HLHtVxMuDG1eaybJAn4JEPYJJa-OXyyAN2noblUazGR_ptOP/s320/WS000022.JPG" width="320" /></a></div>
<br />
そして、sample.pptxを解凍する。<br />
$ unzip sample.pptx<br />
解凍すると下記のようなファイルが出てくる。<br />
その中の「ppt/slides/slide1.xml」がスライドの内容となるので、適当なエディタで編集する。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8s9tXHYNn2-yCyKwoywaFtIMLY8s-OnFLsnQ1-KGnx3u-HZxd8kfkccT-3vcBM_uELRfMxB470m66FbJKD1PMlA_MrmBZeao2ZHXn8XMpUxMLTQGOyZirQ8xz1-SYQZLQntHzoDu5JvBJ/s1600/editSlide.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8s9tXHYNn2-yCyKwoywaFtIMLY8s-OnFLsnQ1-KGnx3u-HZxd8kfkccT-3vcBM_uELRfMxB470m66FbJKD1PMlA_MrmBZeao2ZHXn8XMpUxMLTQGOyZirQ8xz1-SYQZLQntHzoDu5JvBJ/s320/editSlide.png" width="320" /></a></div>
<br />
<br />
再びZipで圧縮して、「after.pptx」とする。<br />
$ zip -r after.pptx \[Content_Types].xml docProps/ ppt/ _rels/<br />
Power Pointで圧縮したafter.pptxを開いてみる。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNl25DP5ZoYYVAzuHWa6Uupk4fzDTw83Pl5XNhWRBgSeMiCqwZvpX6gxlQ0R4bTEgg9B8HZ8sgowQgKq8D-dyvToWafR40S9XRJ-CmXHYjTnjRFixTlohpQrne7qVZpBEc1sa3ieD2gaEy/s1600/WS000023.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNl25DP5ZoYYVAzuHWa6Uupk4fzDTw83Pl5XNhWRBgSeMiCqwZvpX6gxlQ0R4bTEgg9B8HZ8sgowQgKq8D-dyvToWafR40S9XRJ-CmXHYjTnjRFixTlohpQrne7qVZpBEc1sa3ieD2gaEy/s320/WS000023.JPG" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
[pptxを解凍して出てきたファイル群]<br />
$ tree<br />
|-- [Content_Types].xml<br />
<br />
|-- _rels<br />
<br />
|-- docProps<br />
<br />
| |-- app.xml<br />
<br />
| |-- core.xml<br />
<br />
| `-- thumbnail.jpeg<br />
<br />
|-- file.lst<br />
<br />
|-- ppt<br />
<br />
| |-- _rels<br />
<br />
| | `-- presentation.xml.rels<br />
<br />
| |-- presProps.xml<br />
<br />
| |-- presentation.xml<br />
<br />
| |-- slideLayouts<br />
<br />
| | |-- _rels<br />
<br />
| | | |-- slideLayout1.xml.rels<br />
<br />
| | | |-- slideLayout10.xml.rels<br />
<br />
| | | |-- slideLayout11.xml.rels<br />
<br />
| | | |-- slideLayout2.xml.rels<br />
<br />
| | | |-- slideLayout3.xml.rels<br />
<br />
| | | |-- slideLayout4.xml.rels<br />
<br />
| | | |-- slideLayout5.xml.rels<br />
<br />
| | | |-- slideLayout6.xml.rels<br />
<br />
| | | |-- slideLayout7.xml.rels<br />
<br />
| | | |-- slideLayout8.xml.rels<br />
<br />
| | | `-- slideLayout9.xml.rels<br />
<br />
| | |-- slideLayout1.xml<br />
<br />
| | |-- slideLayout10.xml<br />
<br />
| | |-- slideLayout11.xml<br />
<br />
| | |-- slideLayout2.xml<br />
<br />
| | |-- slideLayout3.xml<br />
<br />
| | |-- slideLayout4.xml<br />
<br />
| | |-- slideLayout5.xml<br />
<br />
| | |-- slideLayout6.xml<br />
<br />
| | |-- slideLayout7.xml<br />
<br />
| | |-- slideLayout8.xml<br />
<br />
| | `-- slideLayout9.xml<br />
<br />
| |-- slideMasters<br />
<br />
| | |-- _rels<br />
<br />
| | | `-- slideMaster1.xml.rels<br />
<br />
| | `-- slideMaster1.xml<br />
<br />
| |-- slides<br />
<br />
| | |-- _rels<br />
<br />
| | | `-- slide1.xml.rels<br />
<br />
| | `-- slide1.xml<br />
<br />
| |-- tableStyles.xml<br />
<br />
| |-- theme<br />
<br />
| | `-- theme1.xml<br />
<br />
| `-- viewProps.xml<br />
<br />
`-- sample.pptx<br />
<br />
<br />
<br />
11 directories, 38 files<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-14089745542949119482013-09-23T00:25:00.001+09:002013-09-23T20:30:22.385+09:00[D3] SVG Path D3を用いたSVGのPathの描画<div>
<br /></div>
<div>
<br /><br /></div>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script type="text/javascript">
function initPath(){
var path = new Path();
document.getElementById('runButton').disabled=true;
}
Path.prototype = {
constructor: Path,
readNodesData: function()
{
this.lineNodes = [
{"x": 1, "y": 5}, {"x": 20, "y": 20},
{"x": 40, "y": 10}, {"x": 60, "y": 40},
{"x": 80, "y": 5}, {"x": 100, "y": 60}
];
return;
}
};
function Path()
{
this.lineNodes;
this.svg = d3.select("#drawArea").append("svg")
.attr("width", 100)
.attr("height", 100);
this.lineFunction = d3.svg.line()
.x(function(d){return d.x;})
.y(function(d){return d.y;})
.interpolate("linear");
this.readNodesData();
this.line = this.svg.append("path")
.attr("d", this.lineFunction(this.lineNodes))
.attr("stroke", "blue")
.attr("stroke-width", 2)
.attr("fill", "none");
return;
}
</script>
<div id="drawArea" style="width:550px; height:350px; border-width: 2px; border-style: solid; border-color: #000000;"></div>
<input type="button" id="runButton" value="Run" onclick="initPath();" >
<input type="button" id="updateButton" value="Update" onclick="scatterSample.changeCirclesPos();" disabled="true"><br><br>
ソースは、こちら
<pre>
Path.prototype = {
constructor: Path,
readNodesData: function()
{
this.lineNodes = [
{"x": 1, "y": 5}, {"x": 20, "y": 20},
{"x": 40, "y": 10}, {"x": 60, "y": 40},
{"x": 80, "y": 5}, {"x": 100, "y": 60}
];
return;
}
};
function Path()
{
this.lineNodes;
this.svg = d3.select("#drawArea").append("svg")
.attr("width", 100)
.attr("height", 100);
this.lineFunction = d3.svg.line()
.x(function(d){return d.x;})
.y(function(d){return d.y;})
.interpolate("linear");
this.readNodesData();
this.line = this.svg.append("path")
.attr("d", this.lineFunction(this.lineNodes))
.attr("stroke", "blue")
.attr("stroke-width", 2)
.attr("fill", "none");
return;
}
</pre>Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-58346042409807582392013-09-19T00:07:00.003+09:002013-09-19T00:07:44.050+09:00[Python] Memo about list記憶の定着を図るためのメモ<br />
<br />
#del について<br />
>>> list = [0,1,2]<br />
>>> del list[1]<br />
>>> list<br />
[0, 2]<br />
>>> list [0]<br />
0<br />
>>> list [1]<br />
2<br />
# リストに対する <complete id="goog_952708681">+= 演算子</complete><br />
>>> slots = []<br />
>>> slots += [0,0]<br />
>>> print slots<br />
[0, 0]<br />
>>> slots += [1,1]<br />
>>> print slots<br />
[0, 0, 1, 1]<br />
>>>Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-51422115337321867632013-09-18T00:13:00.003+09:002013-09-18T00:13:57.440+09:00[Python] Difference between list and tuplePython初心者の自分としては、よく分からなかった。<br />
記述方法の違いしか分からなかった。(大括弧囲みか丸カッコ囲みか)<br />
<br />
しかし、違いがもう一つわかった。<br />
リスト(List) -> 値の再代入ができる<br />
タプル(Tuple) -> 値の再代入ができない<br />
<br />
試しに、、、<br />
<br />
>>> vec = [2,4,6]<br />
>>> list = [[x,x*2] for x in vec] # リストの生成<br />
>>> print list<br />
[[2, 4], [4, 8], [6, 12]]<br />
>>> tuple = [(x,x*3) for x in vec] #タプルの生成<br />
>>> print tuple<br />
[(2, 6), (4, 12), (6, 18)]<br />
>>> list[0][1] = 5 # リストに値を再代入してみる<br />
>>> print list<br />
[[2, 5], [4, 8], [6, 12]] #代入できている<br />
>>> tuple[0][1] = 7 #タプルに再代入してみる<br />
Traceback (most recent call last): # タプルは、アイテムのアサインをサポートしていないとおっしゃてる<br />
File "<stdin>", line 1, in <module><br />
TypeError: 'tuple' object does not support item assignment<br />
>>> print tuple<br />
[(2, 6), (4, 12), (6, 18)]<br />
>>><br />
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-34149257133215800072013-09-16T10:12:00.001+09:002013-09-17T00:00:39.217+09:00[D3] 事始め<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<script type="text/javascript">
var scatterSample;
function initGraph(){
scatterSample = new ScatterSample();
document.getElementById('runButton').disabled=true;
document.getElementById('updateButton').disabled=false;
}
</script>
<script type="text/javascript">
ScatterSample.prototype = {
constructor: ScatterSample,
circleFillColor: function(d)
{
var color = d3.scale.linear().domain([0,30]).range(['blue','red']);
return color(d);
},
mkCirclePosData: function()
{
var random = Math.random();
random = (random - 0.5) * 2.0;
return random;
},
changeCirclesPos: function()
{
svg = d3.selectAll('svg');
circles = svg.selectAll('circle');
circles.attr("cx", function(){
pos = ScatterSample.prototype.mkCirclePosData();
return ScatterSample.xScale(pos);
})
.attr("cy", function(){
pos = ScatterSample.prototype.mkCirclePosData();
return ScatterSample.yScale(pos);
})
return;
}
};
function ScatterSample()
{
var dataset = [5, 10, 15, 20, 25];
this.width = 500;
this.height = 300;
ScatterSample.xScale = d3.scale.linear()
.domain([-1, 1])
.range([50, this.width-50]);
ScatterSample.yScale = d3.scale.linear()
.domain([-1, 1])
.range([50, this.height-50]);
var svg = d3.select("#drawArea")
.append("svg")
.attr("width" , this.width)
.attr("height", this.height);
var circles = svg.selectAll("circle")
.data(dataset)
.enter()
.append("circle");
circles.attr("cx", function(){
pos = ScatterSample.prototype.mkCirclePosData();
return ScatterSample.xScale(pos);
})
.attr("cy", function(){
pos = ScatterSample.prototype.mkCirclePosData();
return ScatterSample.yScale(pos);
})
.attr("r", function(d){
return d;
})
.style("fill", function(d){
return ScatterSample.prototype.circleFillColor(d);
});
var yAxis = d3.svg.axis()
.scale(ScatterSample.yScale)
.ticks(5)
.orient("left");
svg.append("g")
.attr("transform", "translate(50,0)")
.call(yAxis)
.selectAll("path,line")
.attr("fill","none").attr("stroke","black")
.attr("shape-redering","crispEdges");
var xAxis = d3.svg.axis()
.scale(ScatterSample.xScale)
.ticks(5)
.orient("bottom");
svg.append("g")
.attr("transform", "translate(0,250)")
.call(xAxis)
.selectAll("path,line")
.attr("fill","none").attr("stroke","black")
.attr("shape-redering","crispEdges");
}
</script>
<a href="http://d3js.org/" target="_blank">D3</a> (Data-Driven Documents) を試した。今回の着目点は、<br />
1.SVGに要素を追加<br />
2.追加した要素に読み込んだデータをアサインする data(<i>dataset</i>)<br />
3.アサインしたデータに基づいた要素属性の設定(特に色<br />
4.描画系とデータという異なる座標値を変換する scale<br />
5.軸の追加<br />
<br />
参考ページ: <a href="http://alignedleft.com/tutorials/d3">http://alignedleft.com/tutorials/d3</a><br />
上記ページは、D3の概要を知るには、よくまとめられていて大変参考にさせて頂きました。<br />
<br />
サンプルついて<br />
散布図の描画をイメージしたものでRunボタンを押すとランダムな位置に大きさの異なる。5つの円が描画されます。円の色については、色のrangeを使って自身の大きさが小さいほど青、大きいほど赤になるようにしています([A])。<br />
Updateボタンを押すとその都度円の位置が変わります([B])。<br />
<br />
<div id="drawArea" style="border-color: #000000; border-style: solid; border-width: 2px; height: 350px; width: 550px;">
</div>
<input id="runButton" onclick="initGraph();" type="button" value="Run" />
<input disabled="true" id="updateButton" onclick="scatterSample.changeCirclesPos();" type="button" value="Update" />
<br />
<br />
ソース<br />
ScatterSample.prototype = {<br />
constructor: ScatterSample,<br />
<br />
circleFillColor: function(d)<br />
{<br />
var color = d3.scale.linear().domain([0,30]).range(['blue','red']); //[A]<br />
return color(d);<br />
},<br />
<br />
mkCirclePosData: function()<br />
{<br />
var random = Math.random();<br />
random = (random - 0.5) * 2.0;<br />
return random;<br />
},<br />
<br />
changeCirclesPos: function() // [B]<br />
{<br />
<br />
svg = d3.selectAll('svg');<br />
circles = svg.selectAll('circle');<br />
circles.attr("cx", function(){<br />
pos = ScatterSample.prototype.mkCirclePosData();<br />
return ScatterSample.xScale(pos);<br />
})<br />
.attr("cy", function(){<br />
pos = ScatterSample.prototype.mkCirclePosData();<br />
return ScatterSample.yScale(pos);<br />
})<br />
<br />
return;<br />
}<br />
<br />
};<br />
<br />
function ScatterSample()<br />
{<br />
<br />
var dataset = [5, 10, 15, 20, 25];<br />
<br />
this.width = 500;<br />
this.height = 300;<br />
<br />
ScatterSample.xScale = d3.scale.linear()<br />
.domain([-1, 1])<br />
.range([50, this.width-50]);<br />
<br />
ScatterSample.yScale = d3.scale.linear()<br />
.domain([-1, 1])<br />
.range([50, this.height-50]);<br />
<br />
var svg = d3.select("#drawArea")<br />
.append("svg") // 1.<br />
.attr("width" , this.width)<br />
.attr("height", this.height);<br />
<br />
var circles = svg.selectAll("circle")<br />
.data(dataset) // 2.<br />
.enter()<br />
.append("circle");<br />
circles.attr("cx", function(){<br />
pos = ScatterSample.prototype.mkCirclePosData();<br />
return ScatterSample.xScale(pos); // 4.<br />
})<br />
.attr("cy", function(){<br />
pos = ScatterSample.prototype.mkCirclePosData();<br />
return ScatterSample.yScale(pos);<br />
})<br />
.attr("r", function(d){<br />
return d;<br />
})<br />
.style("fill", function(d){ // 3.<br />
return ScatterSample.prototype.circleFillColor(d);<br />
});<br />
<br />
var yAxis = d3.svg.axis()<br />
.scale(ScatterSample.yScale)<br />
.ticks(5)<br />
.orient("left");<br />
svg.append("g") // 5.<br />
.attr("transform", "translate(50,0)")<br />
.call(yAxis)<br />
.selectAll("path,line")<br />
.attr("fill","none").attr("stroke","black")<br />
.attr("shape-redering","crispEdges");<br />
<br />
var xAxis = d3.svg.axis()<br />
.scale(ScatterSample.xScale)<br />
.ticks(5)<br />
.orient("bottom");<br />
<br />
svg.append("g")<br />
.attr("transform", "translate(0,250)")<br />
.call(xAxis)<br />
.selectAll("path,line")<br />
.attr("fill","none").attr("stroke","black")<br />
.attr("shape-redering","crispEdges");<br />
}<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0tag:blogger.com,1999:blog-2750784755625292001.post-21152253928397557472013-09-15T21:48:00.000+09:002013-09-15T22:17:21.608+09:00[Qt] 事始めC++ で記述されたクロスプラットフォームフレームワーク<a href="http://qt.digia.com/" target="_blank">Qt</a>を試してみた。<br />
<br />
URLを入力してアクセスするだけの超簡易Webブラウザを作ってみた。作ってみたと言っても書いたコードは、数行。FreeBSD 、Windows 7, Windows XP で動かしてみた。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeyzX_KIr2om8r7NexHzBLwTd4_vw6WUA27q9c2INx5WQK8Pwm_SIVU-vMEwKvlLXtT9tVP6P9S1AD-36kJsNrSWEOYyAFEoFIYQDu7MIQVAdsREppfPsveNxb-74pzzINh6F9GXtfSE0z/s1600/QtFreeBSD.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeyzX_KIr2om8r7NexHzBLwTd4_vw6WUA27q9c2INx5WQK8Pwm_SIVU-vMEwKvlLXtT9tVP6P9S1AD-36kJsNrSWEOYyAFEoFIYQDu7MIQVAdsREppfPsveNxb-74pzzINh6F9GXtfSE0z/s200/QtFreeBSD.bmp" width="200" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp-xAudzdW_mAzKvSOlM5CoCnqzdfqAPoR14XJQK6URvT3HhVQmSJnULK8VzrpRW0s7s_s28VWymd5LqlKz_sS3r0gVp-4cIQXnMaLKx60jqNutbvXU0wyDIAOuVJEhj5JovPKJ7GtRvyo/s1600/QtWin7.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp-xAudzdW_mAzKvSOlM5CoCnqzdfqAPoR14XJQK6URvT3HhVQmSJnULK8VzrpRW0s7s_s28VWymd5LqlKz_sS3r0gVp-4cIQXnMaLKx60jqNutbvXU0wyDIAOuVJEhj5JovPKJ7GtRvyo/s200/QtWin7.bmp" width="200" /></a> </div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmZZCPYi6xpIcropRLUVX5Dgf9Lbuv8b1AWrzYxd1CrU5HhTIyVQxI9VOMxXA3eYE-So84LnggVoQw5TomgancLcYgrBLlN2VXeWqbbBdSILEeMyDsE4AZYXh4hYzq0PQjSPt0wcTByWjA/s1600/QtWinXP.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmZZCPYi6xpIcropRLUVX5Dgf9Lbuv8b1AWrzYxd1CrU5HhTIyVQxI9VOMxXA3eYE-So84LnggVoQw5TomgancLcYgrBLlN2VXeWqbbBdSILEeMyDsE4AZYXh4hYzq0PQjSPt0wcTByWjA/s200/QtWinXP.bmp" width="200" /></a></div>
<br />
<br />
<br />
まずは、FreeBSD(xfce)にて<br />
Qt 関連のライブラリが含まれる「Qt」本体(Ver.4.8.2)とQt のIDEである「Qt Creator」(Ver.2.5.0)をコンパイル&インストールする。<br />
<br />
cd /usr/ports/devel/qt4<br />
make config-recursive<br />
make<br />
make install<br />
<br />
cd /usr/ports/devel/qtcreator<br />
make config-recursive<br />
make<br />
make install<br />
<br />
<br />
以下がQt Creatorを起動したことろ<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCEbTtWzC5mKfr412swHmseAkSxcvtwr5p_OAleUFgCdHdaW0mnyXjzeuKv2FNRBgoUXbXAFXJGqf1pgigygHXJ5trmxEIyTrWdY4_7cAy1igd7aPiXgx5NMAQ_QcqbiVvLNbad2-oYknE/s1600/qtcreator.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="219" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCEbTtWzC5mKfr412swHmseAkSxcvtwr5p_OAleUFgCdHdaW0mnyXjzeuKv2FNRBgoUXbXAFXJGqf1pgigygHXJ5trmxEIyTrWdY4_7cAy1igd7aPiXgx5NMAQ_QcqbiVvLNbad2-oYknE/s320/qtcreator.bmp" width="320" /></a></div>
<br />
まず、コンパイラ関連の設定をする。メインウィンドウの[Tools-Options]でオプションダイアグを開き、ダイアログ左の一覧から「Build & Run」を選択して、「Qt versions」タブを選択。ダイアログ右にある「Add」ボタンをクリックして、先ほどインストールしたQt4本体に含まれる、「qmake-qt4」のPATHを指定します。デフォルトなら、「/usr/local/bin/qmake-qt4」です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBubk_tngr86cgxaxkAx29gTEHRXHZ6n6TvFwnXyI1_op9FWA8DhyG2vMUNa41IWY1Cs6qTTfpWZ96B1ImwCJT9JmyhlU-9tkCsE-aLQdUaYVXA-ZFsDbCbAJcRAP_89rC6VAOhVW-9kwC/s1600/qtpath.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="184" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBubk_tngr86cgxaxkAx29gTEHRXHZ6n6TvFwnXyI1_op9FWA8DhyG2vMUNa41IWY1Cs6qTTfpWZ96B1ImwCJT9JmyhlU-9tkCsE-aLQdUaYVXA-ZFsDbCbAJcRAP_89rC6VAOhVW-9kwC/s320/qtpath.png" width="320" /></a></div>
<br />
<br />
次にどダイアログの「Tool Chains」タブでgcc と gdb のPATHを指定する。ウィンドウ右の「Add」ボタンから「Gcc」を選択。「Compiler path」にgcc(Ver.4.2.1)へのpathを「Debugger」にgdbへのpathを指定する。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinmG3XUwa8p8pZBf4lPhu5JmTIGh2DhrEsnR8ORzNYyioioeIRTuXYYbFqLu6ortWkydOBj4P1NI2OPPFiR34RKjtzEJSwuH7t_B9my7SlXyMYzQ4TKjDWm0wwfWRs_F7QDNyTkn1yqSBM/s1600/WS000017.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinmG3XUwa8p8pZBf4lPhu5JmTIGh2DhrEsnR8ORzNYyioioeIRTuXYYbFqLu6ortWkydOBj4P1NI2OPPFiR34RKjtzEJSwuH7t_B9my7SlXyMYzQ4TKjDWm0wwfWRs_F7QDNyTkn1yqSBM/s320/WS000017.JPG" width="320" /></a></div>
<br />
これで下準備は、完了。<br />
新しいプロジェクトを作ってコンポーネントをペタペタ貼っていく。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh62yNrkmDTuHV_NHpMqZfdLdiDO_W1s6fyaL_RW0e0aq-d4w12Xhvzvxw8gpjDYYfWaxdj3MVXykOf7dW_AvwYcNW4fgZrQUpejIDbZaARZ-dazMn1fFDg5bkHWefo8XHBAFeMKTbtIiCl/s1600/WS000019.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh62yNrkmDTuHV_NHpMqZfdLdiDO_W1s6fyaL_RW0e0aq-d4w12Xhvzvxw8gpjDYYfWaxdj3MVXykOf7dW_AvwYcNW4fgZrQUpejIDbZaARZ-dazMn1fFDg5bkHWefo8XHBAFeMKTbtIiCl/s320/WS000019.JPG" width="320" /></a></div>
<br />
WebブラウザのコンポーネントQWebViewを使った。<br />
コードを数行書く。<br />
-mainwindow.h-<br />
#ifndef MAINWINDOW_H<br />
#define MAINWINDOW_H<br />
<br />
#include <QMainWindow><br />
#include <QDebug><br />
<br />
namespace Ui {<br />
class MainWindow;<br />
}<br />
<br />
class MainWindow : public QMainWindow<br />
{<br />
Q_OBJECT<br />
<br />
public:<br />
explicit MainWindow(QWidget *parent = 0);<br />
~MainWindow();<br />
<br />
private:<br />
Ui::MainWindow *ui;<br />
<br />
public slots:<br />
void updateWebPage();<br />
};<br />
<br />
#endif // MAINWINDOW_H<br />
<div>
<br /></div>
<div>
<br /></div>
<div>
-mainwindow.cpp-</div>
<div>
<br /></div>
<div>
<div>
#include "mainwindow.h"</div>
<div>
#include "ui_mainwindow.h"</div>
<div>
<br /></div>
<div>
#include "mywebview.h"</div>
<div>
<br /></div>
<div>
MainWindow::MainWindow(QWidget *parent) :</div>
<div>
QMainWindow(parent),</div>
<div>
ui(new Ui::MainWindow)</div>
<div>
{</div>
<div>
ui->setupUi(this);</div>
<div>
<br /></div>
<div>
connect(ui->goButton, SIGNAL(clicked()), this, SLOT(updateWebPage()));</div>
<div>
}</div>
<div>
<br /></div>
<div>
MainWindow::~MainWindow()</div>
<div>
{</div>
<div>
delete ui;</div>
<div>
}</div>
<div>
<br /></div>
<div>
void MainWindow::updateWebPage()</div>
<div>
{</div>
<div>
ui->webView->setUrl(QUrl(ui->lineEdit->text()));</div>
<div>
}</div>
</div>
<div>
<br /></div>
Qtの場合イベントを「Signal」といいイベントハンドラを「Slot」という。メインウィンドウのコンストラクタにて、connect関数にて、clicked()というSignalのスロットとしてupdateWebPage()というインプットボックスに入力されたURLをロードする関数を登録する。詳しくは、<a href="http://blog.qt.digia.com/jp/2010/06/17/signals-and-slots-2/" target="_blank">こちら</a>を参照されたし。<br />
<br />
そして、IDE左下の「Run」または、Ctrl+Rで実行できる。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpPiG13KSnNms7iiYpqV6O7601JFnIUMrXVBG1O6zJOtlbpQrqQnq12AqsKM6MlUroqXnMEaLdlRl6E0aSSzRUsPglpFPrgZgorLqrTndbxA1dyt6QIf47QNSZ7KsPWhH5z9E4lZFrt9cm/s1600/QtFreeBSD.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpPiG13KSnNms7iiYpqV6O7601JFnIUMrXVBG1O6zJOtlbpQrqQnq12AqsKM6MlUroqXnMEaLdlRl6E0aSSzRUsPglpFPrgZgorLqrTndbxA1dyt6QIf47QNSZ7KsPWhH5z9E4lZFrt9cm/s320/QtFreeBSD.bmp" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
次は、Windows 7で実行してみる。環境がウィンドウズに変わるので再コンパイルが必要です。</div>
<div class="separator" style="clear: both; text-align: left;">
C++のコンパイラには、Visual Studio C++付属のclを用います。よってVisua C++ 2010 Expressをインストールしておきます。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
さらに<a href="http://download.qt-project.org/archive/qt/4.8/4.8.2/qt-win-opensource-4.8.2-vs2010.exe" target="_blank">Qt本体</a>(こちらはバイナリ) (Ver.4.8.2) と <a href="http://download.qt-project.org/archive/qtcreator/2.5/qt-creator-win-opensource-2.5.2.exe" target="_blank">Qt Creator</a> (Ver.2.5.2)をDLして、インストールする。</div>
<div class="separator" style="clear: both; text-align: left;">
FreeBSDの場合と同様Qt Creatorを起動して、qmakeのpathを指定します。デフォなら「C:\Qt\4.8.2\bin」です。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
つぎに、C++コンパイラですが「ツールチェイン」タブにて自動検出されているはずですので手動指定する必要はありません。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
FreeBSDで作成した、プロジェクトファイルとコードをWindowsマシンに持ってきて「*.pro」のプロジェクトファイルを開きます。そして、ビルドします。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
コンパイルが通ったら早速exeを直接実行したいところですが、Qt関連のライブラリのPATHが通っていないので環境変数PATHにqmakeと同じPATH(C:\Qt\4.8.2\bin\)を追加します。</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7AL39wc4L0PqFvJutCi_qnbTpsRzIjLbaft23L3B-kvJFzdpzXR_xF9oIKoSF2jg7vWtQ3HscOO5Qj8rb7CRKNiCIVAGneuXzLjmU9NX2M-nEan4TiyZKDsZnEvWeWQFubzJ0fG3vAXMl/s1600/WS000020.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="310" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7AL39wc4L0PqFvJutCi_qnbTpsRzIjLbaft23L3B-kvJFzdpzXR_xF9oIKoSF2jg7vWtQ3HscOO5Qj8rb7CRKNiCIVAGneuXzLjmU9NX2M-nEan4TiyZKDsZnEvWeWQFubzJ0fG3vAXMl/s320/WS000020.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
追加が終わったら直接exeを実行することができます。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFRTAanG4CHrmODEyuB9qOt4BTDMzZ6aLOvG8aRFRDVSTEYgga9Ve3VzCWPOEq-1utDrj3j4DOTw5iif5E9QaTb4mEVXxg4Y8s3fPE8xhPazuGvckvKmNyVZ7e6yDtn5eiVdbKB-msr9W7/s1600/QtWin7.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="294" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFRTAanG4CHrmODEyuB9qOt4BTDMzZ6aLOvG8aRFRDVSTEYgga9Ve3VzCWPOEq-1utDrj3j4DOTw5iif5E9QaTb4mEVXxg4Y8s3fPE8xhPazuGvckvKmNyVZ7e6yDtn5eiVdbKB-msr9W7/s320/QtWin7.bmp" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
次は、先ほどWIndows 7でビルドしたexeをWindows XPで実行します。Qt4のライブラリは、必要なので<a href="http://download.qt-project.org/archive/qt/4.8/4.8.2/qt-win-opensource-4.8.2-vs2010.exe" target="_blank">Qt本体</a>をDLしてインストール、qmakeへのパスを環境変数PATHに追加しておきます。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
これで実行可能になりました。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP_UueoGkSyf9H4LJDoBvYzMrBTZhJeOkhVJSjHAkqwewzTbjnZq2yzxj1P4ewxE9Gb5cs-Qyy-5_Ts47OePunIohcgQvKn6Y3AgAm1hpzIM6ynWl4AKjrXtR0hpZDm8vFOGt0A70s7tov/s1600/QtWinXP.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="295" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjP_UueoGkSyf9H4LJDoBvYzMrBTZhJeOkhVJSjHAkqwewzTbjnZq2yzxj1P4ewxE9Gb5cs-Qyy-5_Ts47OePunIohcgQvKn6Y3AgAm1hpzIM6ynWl4AKjrXtR0hpZDm8vFOGt0A70s7tov/s320/QtWinXP.bmp" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />Anonymoushttp://www.blogger.com/profile/00547610093653346650noreply@blogger.com0