tag:blogger.com,1999:blog-37523528127339150742024-03-06T07:18:49.678+09:00THE JOTTERrsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.comBlogger24125tag:blogger.com,1999:blog-3752352812733915074.post-43702499898030423622016-01-03T11:58:00.001+09:002016-01-03T12:00:12.223+09:00WindowsでVagrantのインストールから起動までのメモ<h4>
まずはVagrantをインストール</h4>
<a href="http://www.vagrantup.com/downloads.html" target="_blank">Vagrantのダウンロードページ</a>からmsiファイルを選択してインストール<br />
<br />
以下のように動作確認できればOK.<br />
<br />
<pre class="brush: shell;">
> vagrant --version
Vagrant 1.8.1
</pre>
<br />
<h4>
BOXのダウンロード</h4>
<div>
<a href="http://www.vagrantbox.es/" target="_blank">vagrantboxのサンプル配布サイト</a>からboxファイルを探す。今回はCentOS6.3 の64bit版を使用する。<br />
<br />
<pre class="brush: shell;">
> vagrant box add Centosh63_x64 https://s3.amazonaws.com/itmat-public/centos-6.3-chef-1
0.14.2.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'Centos63_x64' (v0) for provider:
box: Downloading: https://s3.amazonaws.com/itmat-public/centos-6.3-chef-10.14.2.box
box:
==> box: Successfully added box 'Centos63_x64' (v0) for 'virtualbox'!
> vagrant box list
Centos63_x64 (virtualbox, 0)
</pre>
<pre class="brush: shell;">
> rvagrant init Centos63_x64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
</pre>
<br />
Vagrantfileを編集して、以下の内容をコメントアウト
<br />
<blockquote>
config.vm.network :private_network, ip: "192.168.33.10"
</blockquote>
<br /></div>
<div>
<br /></div>
vagrant up を実行すればVMが立ち上がる。<br />
<pre class="brush: shell;">
> vagrant up
</pre>
<br />
<div>
<br />
ちなみに、Virtual Boxのバージョンが4.2.0のときは、以下のエラーが出て起動できなかった。<br />
Virtual Boxのバージョンを上げて解決。
<br />
<pre class="brush: shell;">
Stderr: VBoxManage.exe: error: Shared folder named 'vagrant' already exists
VBoxManage.exe: error: Details: code VBOX_E_OBJECT_IN_USE (0x80bb000c), component SessionMachine, interface IMachine, callee IUnknown
VBoxManage.exe: error: Context: "CreateSharedFolder(Bstr(name).raw(), Bstr(hostpath).raw(), fWritable, fAutoMount)" at line 978 of file VBoxManageMisc.cpp
</pre>
<blockquote>
</blockquote>
<br /></div>
rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-27041705760751659812015-12-30T08:31:00.005+09:002016-01-03T10:40:08.050+09:00サラリーマンのための確定申告ガイドライン 確定申告のシーズンなので、サラリーマンのための確定申告したほうが良いかどうかの基準を整理することにする。<br />
<br />
<h4>
1.前提</h4>
以下のような人を対象とする。<br />
<ul>
<li>サラリーマンで会社で年末調整を行っている。</li>
<li>株式の売買を行っており、数万~数十万程度売買益(損)や配当収入がある。</li>
</ul>
<div>
<br /></div>
<h4>
2. そもそも何故確定申告をやるのか</h4>
<div>
サラリーマンは会社側で税金の調整をしてくれており、株式の売買も特定口座源泉徴収ありにしておけば確定申告は行わなくても良い。確定申告する理由は、払いすぎた税金を取り戻す(来年以降に取り戻す)から。税金の計算方法は、後述のように何通りか選べる場合がある。デフォルトの源泉徴収よりほかの計算で税額が小さくなるのであれば、小さいほうを申告して、差額の税金を還付してもらう、ということができる。</div>
<div>
<br /></div>
<div>
<h4>
3. 国内株式の売買損益について</h4>
<div>
特定口座源泉徴収なしを選択している場合・・・ 売買益20万以上の場合は確定申告が必要。但し、売買益含む給与以外の所得が20万以下の場合、<b>確定申告が免除</b>されるので、この場合<b>確定申告しないほうが良い。</b></div>
<div>
<br /></div>
<div>
特定口座源泉徴収ありを選択している場合・・・ 確定申告したほうがよい場合を以下に挙げる。</div>
<div>
<br /></div>
<div>
<ul>
<li>複数の口座があり、かつ売却損が出ている口座がある・・・口座間の損益を通算することで、税額を減らせる。</li>
<li>トータルで売却損になっている・・・損失を申告することで、翌3年間に出た利益と損益通算することができる。(その際にはまた確定申告が必要)</li>
</ul>
<div>
<br /></div>
</div>
<div>
<h4>
4. 国内株式の配当金について</h4>
<div>
配当金は売買損益と異なり以下の課税パターンを選択できる。</div>
<div>
<ul>
<li>源泉徴収(デフォルト) ・・・ 最初から20%引かれている。</li>
<li>申告分離課税 ・・・ 株式の売買損益の枠と合わせて計算する。</li>
<li>総合課税 ・・・ 給与所得含む所得と合算して計算する。またこの場合配当控除が受けられる。</li>
</ul>
</div>
確定申告することで税金を減らせるのは以下のパターンが考えられる。<br />
<br />
<ul>
<li>株式の売却損が出ていた場合 ・・・ 配当金を申告分離課税で損益通算することで、配当金の課税を減らす。</li>
<li>年間所得が695万以下の場合 ・・・ 給与所得と配当所得を合算して課税額を計算し、源泉徴収で引かれた税金の一部を戻す。</li>
</ul>
<div>
<br /></div>
<h4>
5.外国株式の配当金について</h4>
外国株式の配当金の扱いも原則として国内株式と同じだが、アメリカ株など二重で税金を徴収されている場合がある。外国税額控除を行えば、二重で課税された一部を減額することが可能。<br />
<br /></div>
<h4>
参考 </h4>
<h4>
<ul>
<li><a href="http://www.daiwa.jp/money/tax/knowledge/">大和証券のページ</a></li>
<li><a href="http://www.riocompany.jp/kakutei_portal/p64.html" target="_blank">確定申告ポータル</a></li>
</ul>
</h4>
</div>
<div>
<br /></div>
rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-24103523070203237442015-10-20T08:27:00.001+09:002015-12-29T22:15:39.036+09:00EWS(Exchange Web Service)接続仕様解説<h1 id="はじめに">
はじめに</h1>
本ドキュメントはEWS(Exchange Web Service)を使用して、 <br />
スケジュールの取得、更新、削除の方法を解説する。<br />
また、スケジュールのカスタムフィールドを埋め込んで予定を作成する方法も解説する。<br />
EWSではスケジュールの他に連絡先、メールなどの取得機能がありますが、スケジュールに関するに機能にのみに絞って説明する。<br />
Exchange Server 2010以降を対象とする。<br />
<h1 id="基本的な方針">
基本的な方針</h1>
EWSはSOAP通信によってリクエストをPOSTで送ることで、Exchangeに持つ情報を操作可能。 <br />
また、httpsを使用するためSSL証明書をインストールする必要がある。 <br />
今回は通信時にBasic認証を行って認証するものとする。<br />
EWSで使用できる命令一覧は以下を参照<br />
<ul>
<li><a href="https://msdn.microsoft.com/en-us/library/office/bb409286(v=exchg.140).aspx">https://msdn.microsoft.com/en-us/library/office/bb409286(v=exchg.140).aspx</a></li>
</ul>
<h1 id="スケジュール取得finditem-getitem">
スケジュール取得(FindItem, GetItem)</h1>
<h2 id="入力例1時間を指定してスケジュールを取得">
入力例1(時間を指定してスケジュールを取得)</h2>
FindItemによるスケジュール取得方法を示す。<br />
<pre class="brush: xml;">
<?xml version="1.0" encoding="utf-8"?>
<!--
時間を指定してスケジュールを取得するサンプル
-->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Body>
<FindItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
Traversal="Shallow">
<ItemShape>
<t:BaseShape>Default</t:BaseShape>
</ItemShape>
<CalendarView MaxEntriesReturned="10" StartDate="2015-04-01T00:00:00+09:00" EndDate="2015-05-20T00:00:00+09:00"/>
<ParentFolderIds>
<t:DistinguishedFolderId Id="calendar"/>
</ParentFolderIds>
</FindItem>
</soap:Body>
</soap:Envelope>
</pre>
BaseShape, CalendarView の値を変えることで、以下のように結果を指定できる。<br />
<table>
<thead>
<tr>
<th align="left">BaseShape</th>
<th align="left">意味</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">IdOnly</td>
<td align="left">IDのみを返す</td>
</tr>
<tr>
<td align="left">Default</td>
<td align="left">デフォルトで規定されているプロパティを返す</td>
</tr>
<tr>
<td align="left">AllProperties</td>
<td align="left">Exchange Business Logic レイヤで規定されているすべてのプロパティを返す</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th align="left">CalendarView</th>
<th align="left">意味</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">MaxEntriesReturned</td>
<td align="left">取得するスケジュールの最大件数を指定する。</td>
</tr>
<tr>
<td align="left">StartDate</td>
<td align="left">開始日時を指定する。表記はタイムゾーン(YYYY-MM-DDThh:mm:ss+09:00)</td>
</tr>
<tr>
<td align="left">EndDate</td>
<td align="left">終了日時を指定する。表記はタイムゾーン(YYYY-MM-DDThh:mm:ss+09:00)</td>
</tr>
</tbody></table>
<h2 id="応答例1">
応答例1</h2>
<pre class="brush: xml;">
"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : 2414b9a2-3098-4a78-afea-13ca70b8d541
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=e1c788bc304a4876a75a8ceb9a15818e; expires=Mon, 07-Mar-2016 19:27:29 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M/I387GxczIxc3G; expires=Sat, 07-Mar-2015 19:37:29 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Sat, 07 Mar 2015 19:27:28 GMT
connection : close
"--------------BODY SECTION-------------------"
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="0" MajorBuildNumber="516" MinorBuildNumber="29"/>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:FindItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:FindItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootFolder TotalItemsInView="2" IncludesLastItemInRange="false">
<t:Items>
<t:CalendarItem>
<t:ItemId Id="AQAWAHRlc3QwMUBob2dlaG9nZW5ldC5jb20ARgAAA+d6AQR1hVZLtUu7f6x+bGIHAMoLTK8fdLhFnpEriAzsIZ4AAAMPAAAAygtMrx90uEWekSuIDOwhngAAAA1oZV8AAAA=" ChangeKey="DwAAABYAAADKC0yvH3S4RZ6RK4gM7CGeAAANaHBP"/>
</t:CalendarItem>
</t:Items>
</m:RootFolder>
</m:FindItemResponseMessage>
</m:ResponseMessages>
</m:FindItemResponse>
</s:Body>
</s:Envelope>
</pre>
<h2 id="入力例2getitemによる取得">
入力例2(GetItemによる取得)</h2>
スケジュールの固有ID, ChangeKeyが分かっていれば、GetItemでIDを指定して取得することが可能。 <br />
IDはオブジェクトに一意に付与される。ChangeKeyはオブジェクトのある特定の状態を表すもので、オブジェクトが更新されると、ChangeKeyも変化する。<br />
<pre class="brush: xml;">
<?xml version="1.0" encoding="utf-8"?>
<!--
IDを指定してスケジュールを取得するサンプル
-->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Body>
<GetItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">
<ItemShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:AdditionalProperties>
<t:FieldURI FieldURI="item:Subject"/>
</t:AdditionalProperties>
</ItemShape>
<ItemIds>
<t:ItemId Id="AQAWAHRlc3QwMUBob2dlaG9nZW5ldC5jb20ARgAAA+d6AQR1hVZLtUu7f6x+bGIHAMoLTK8fdLhFnpEriAzsIZ4AAAMPAAAAygtMrx90uEWekSuIDOwhngAAAA1oZV8AAAA=" ChangeKey="DwAAABYAAADKC0yvH3S4RZ6RK4gM7CGeAAANaHBP"/>
</ItemIds>
</GetItem>
</soap:Body>
</soap:Envelope>
</pre>
<h2 id="応答例2">
応答例2</h2>
<pre class="brush: xml;">
"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : e04c54a3-d851-4a91-aa57-4ff707bf57cb
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=ada4db7f7ca448458f78c9a5cefb8b0e; expires=Mon, 07-Mar-2016 22:42:49 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M/I383NxcrNxcvG; expires=Sat, 07-Mar-2015 22:52:49 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Sat, 07 Mar 2015 22:42:49 GMT
connection : close
"--------------BODY SECTION-------------------"
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="0" MajorBuildNumber="516" MinorBuildNumber="29"/>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:CalendarItem>
<t:ItemId Id="AQAWAHRlc3QwMUBob2dlaG9nZW5ldC5jb20ARgAAA+d6AQR1hVZLtUu7f6x+bGIHAMoLTK8fdLhFnpEriAzsIZ4AAAMPAAAAygtMrx90uEWekSuIDOwhngAAAA1oZV8AAAA=" ChangeKey="DwAAABYAAADKC0yvH3S4RZ6RK4gM7CGeAAANaHBP"/>
<t:Subject>4月の予定</t:Subject>
</t:CalendarItem>
</m:Items>
</m:GetItemResponseMessage>
</m:ResponseMessages>
</m:GetItemResponse>
</s:Body>
</s:Envelope>
</pre>
<h1 id="スケジュール新規作成createitem">
スケジュール新規作成(CreateItem)</h1>
CreateItemを使用してスケジュールが新規作成できる。<br />
<h2 id="入力例3">
入力例3</h2>
<pre class="brush: xml;">
<?xml version="1.0" encoding="utf-8"?>
<!--
予定を新規作成するサンプル
-->
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Body>
<CreateItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
SendMeetingInvitations="SendToAllAndSaveCopy" >
<SavedItemFolderId>
<t:DistinguishedFolderId Id="calendar"/>
</SavedItemFolderId>
<Items>
<t:CalendarItem xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
<Subject>テスト予定(Powered by EWS)</Subject>
<Body BodyType="Text">This is test meeting</Body>
<Start>2015-04-04T14:00:00</Start>
<End>2015-04-04T15:00:00</End>
<IsAllDayEvent>false</IsAllDayEvent>
<LegacyFreeBusyStatus>Busy</LegacyFreeBusyStatus>
</t:CalendarItem>
</Items>
</CreateItem>
</soap:Body>
</soap:Envelope>
</pre>
<h3 id="応答例3">
応答例3</h3>
<pre class="brush: xml;">
"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : 809f50a6-f346-4d80-9695-6af66379c8d1
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=573595eeeb4d498bb0102f09e8ef26a1; expires=Mon, 07-Mar-2016 22:51:22 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M/I383Mxc/Oxc3M; expires=Sat, 07-Mar-2015 23:01:23 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Sat, 07 Mar 2015 22:51:22 GMT
connection : close
"--------------BODY SECTION-------------------"
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="0" MajorBuildNumber="516" MinorBuildNumber="29"/>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:CreateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:CreateItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:CalendarItem>
<t:ItemId Id="AQAWAHRlc3QwMUBob2dlaG9nZW5ldC5jb20ARgAAA+d6AQR1hVZLtUu7f6x+bGIHAMoLTK8fdLhFnpEriAzsIZ4AAAMPAAAAygtMrx90uEWekSuIDOwhngAAAA1oZWoAAAA=" ChangeKey="DwAAABYAAADKC0yvH3S4RZ6RK4gM7CGeAAANaHB/"/>
</t:CalendarItem>
</m:Items>
</m:CreateItemResponseMessage>
</m:ResponseMessages>
</m:CreateItemResponse>
</s:Body>
</s:Envelope>
</pre>
DeleteItemでIDを指定することで、削除可能。<br />
<h2 id="入力例4">
入力例4</h2>
<pre class="brush: xml;">
<?xml version="1.0" encoding="utf-8"?>
<!--
予定を削除するサンプル
-->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Body>
<DeleteItem DeleteType="HardDelete" SendMeetingCancellations="SendToNone" xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">
<ItemIds>
<t:ItemId Id="AQAWAHRlc3QwMUBob2dlaG9nZW5ldC5jb20ARgAAA+d6AQR1hVZLtUu7f6x+bGIHAMoLTK8fdLhFnpEriAzsIZ4AAAMPAAAAygtMrx90uEWekSuIDOwhngAAAA1oZWQAAAA="/>
</ItemIds>
</DeleteItem>
</soap:Body>
</soap:Envelope>
</pre>
DeleteTypeを指定することで以下のように削除方法を指定できる。<br />
<table>
<thead>
<tr>
<th align="left">DeleteType</th>
<th align="left">意味</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">MaxEntriesReturned</td>
<td align="left">物理的に消去する。</td>
</tr>
<tr>
<td align="left">SoftDelete</td>
<td align="left">回復可能な削除領域に移動させる(削除済みアイテムの保持が有効な場合)</td>
</tr>
<tr>
<td align="left">MoveToDeletedItems</td>
<td align="left">アイテムを削除済みフォルダに移動させる。</td>
</tr>
</tbody></table>
</pre>
<h2 id="応答例4">
応答例4</h2>
<pre class="brush: xml;">
--------------HEADER SECTION-------------------
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : e08d3acf-3ee2-4a9b-b39e-28ac0229527b
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=7070dbf7a6ef43938b076150169c3d3b; expires=Mon, 07-Mar-2016 17:57:21 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M/I387Hxc/Ixc3O; expires=Sat, 07-Mar-2015 18:07:21 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Sat, 07 Mar 2015 17:57:20 GMT
connection : close
--------------BODY SECTION-------------------
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="0" MajorBuildNumber="516" MinorBuildNumber="29"/>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:DeleteItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:DeleteItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
</m:DeleteItemResponseMessage>
</m:ResponseMessages>
</m:DeleteItemResponse>
</s:Body>
</s:Envelope>
</pre>
<h1 id="スケジュール更新updateitem">
スケジュール更新(UpdateItem)</h1>
UpdateItemを使用することで、既存のスケジュールを更新可能。 <br />
IDとChangeKeyの両方を指定する必要がある。<br />
<h2 id="入力例5">
入力例5</h2>
<pre class="brush: xml;">
<?xml version="1.0" encoding="utf-8"?>
<!--
既存のスケジュールを更新するサンプル
-->
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Body>
<UpdateItem MessageDisposition="SaveOnly" ConflictResolution="AutoResolve" SendMeetingInvitationsOrCancellations="SendToNone"
xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">
<ItemChanges>
<t:ItemChange>
<t:ItemId Id="AAAWAHRlc3QwMUBob2dlaG9nZW5ldC5jb20ARgAAAAAA53oBBHWFVku1S7t/rH5sYgcAygtMrx90uEWekSuIDOwhngAAAAAADwAAygtMrx90uEWekSuIDOwhngAADWhlZQAA" ChangeKey="DwAAABYAAADKC0yvH3S4RZ6RK4gM7CGeAAANaHBn"/>
<t:Updates>
<t:SetItemField>
<t:FieldURI FieldURI="item:Subject"/>
<t:CalendarItem>
<t:Subject>Modified</t:Subject>
</t:CalendarItem>
</t:SetItemField>
</t:Updates>
</t:ItemChange>
</ItemChanges>
</UpdateItem>
</soap:Body>
</soap:Envelope>
</pre>
更新内容が競合した場合、ConflictResolutionの指定により以下のような挙動となる。<br />
<table>
<thead>
<tr>
<th align="left">ConflictResolution</th>
<th align="left">意味</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">NeverOverwrite</td>
<td align="left">競合が発生したら上書きしない。</td>
</tr>
<tr>
<td align="left">AutoResolve</td>
<td align="left">競合が発生したら自動的に解決を試みる。</td>
</tr>
<tr>
<td align="left">AlwaysOverwrite</td>
<td align="left">競合が発生しても常に上書きする。</td>
</tr>
</tbody></table>
<h2 id="応答例5">
応答例5</h2>
<pre class="brush: xml;">
--------------HEADER SECTION-------------------
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : 0b9bccc5-c440-468a-8b40-cd2b186a583a
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=f5fd2b1f008d45d3a0668b5c5dffebc3; expires=Mon, 07-Mar-2016 20:04:12 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M/I383Pxc7Lxc7N; expires=Sat, 07-Mar-2015 20:14:12 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Sat, 07 Mar 2015 20:04:12 GMT
connection : close
--------------BODY SECTION-------------------
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="0" MajorBuildNumber="516" MinorBuildNumber="29"/>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:UpdateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:UpdateItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:CalendarItem>
<t:ItemId Id="AAAWAHRlc3QwMUBob2dlaG9nZW5ldC5jb20ARgAAAAAA53oBBHWFVku1S7t/rH5sYgcAygtMrx90uEWekSuIDOwhngAAAAAADwAAygtMrx90uEWekSuIDOwhngAADWhlZQAA" ChangeKey="DwAAABYAAADKC0yvH3S4RZ6RK4gM7CGeAAANaHBo"/>
</t:CalendarItem>
</m:Items>
</m:UpdateItemResponseMessage>
</m:ResponseMessages>
</m:UpdateItemResponse>
</s:Body>
</s:Envelope>
</pre>
<h1 id="カスタム項目を追加する場合">
カスタム項目を追加する場合</h1>
以下のようにExtendedPropertyを指定することで、カスタム項目を追加して <br />
予定を新規作成できる。 <br />
PropertyNameに任意の名前を記述でき、PropertyTypeはデータの型を表す。 <br />
(以下の例ではAccountNoというカスタム項目を追加している)<br />
<h2 id="入力例6">
入力例6</h2>
<pre class="brush: xml;">
<?xml version="1.0" encoding="utf-8"?>
<!--
カスタム項目を持つ予定を新規作成するサンプル
-->
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Body>
<CreateItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
SendMeetingInvitations="SendToAllAndSaveCopy" >
<SavedItemFolderId>
<t:DistinguishedFolderId Id="calendar"/>
</SavedItemFolderId>
<Items>
<t:CalendarItem xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
<Subject>CUSTOMテスト予定2(Powered by EWS)</Subject>
<Body BodyType="Text">This is test meeting</Body>
<t:ExtendedProperty>
<t:ExtendedFieldURI DistinguishedPropertySetId="CalendarAssistant"
PropertyName="AccountNo"
PropertyType="String"/>
<t:Value>320</t:Value>
</t:ExtendedProperty>
<Start>2015-04-06T14:00:00+09:00</Start>
<End>2015-04-06T15:00:00+09:00</End>
<IsAllDayEvent>false</IsAllDayEvent>
<LegacyFreeBusyStatus>Busy</LegacyFreeBusyStatus>
</t:CalendarItem>
</Items>
</CreateItem>
</soap:Body>
</soap:Envelope>
</pre>
<h2 id="応答例6">
応答例6</h2>
<pre class="brush: xml;">
"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : c40b2b35-4aa8-4940-8548-3ea19ccede2a
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=141d265651ac42aeab68137b65067650; expires=Sat, 12-Mar-2016 23:14:20 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M7N383Mxc3Lxc3I; expires=Thu, 12-Mar-2015 23:24:27 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Thu, 12 Mar 2015 23:14:26 GMT
connection : close
"--------------BODY SECTION-------------------"
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="0" MajorBuildNumber="516" MinorBuildNumber="29"/>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:CreateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:CreateItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:CalendarItem>
<t:ItemId Id="AQAWAHRlc3QwMUBob2dlaG9nZW5ldC5jb20ARgAAA+d6AQR1hVZLtUu7f6x+bGIHAMoLTK8fdLhFnpEriAzsIZ4AAAMPAAAAygtMrx90uEWekSuIDOwhngAAABEhS30AAAA=" ChangeKey="DwAAABYAAADKC0yvH3S4RZ6RK4gM7CGeAAARIVyF"/>
</t:CalendarItem>
</m:Items>
</m:CreateItemResponseMessage>
</m:ResponseMessages>
</m:CreateItemResponse>
</s:Body>
</s:Envelope>
</pre>
<br />
カスタム項目が付与されたレコードを取得するには、カスタム項目で指定したPropertyNameを以下のように指定する必要がある。<br />
<h2 id="入力例7">
入力例7</h2>
<pre class="brush: xml;">
<?xml version="1.0" encoding="utf-8"?>
<!--
カスタム項目を指定してスケジュールを取得するサンプル
-->
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Body>
<GetItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">
<ItemShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:AdditionalProperties>
<!-- <t:FieldURI FieldURI="item:Subject"/> -->
<t:ExtendedFieldURI DistinguishedPropertySetId="CalendarAssistant"
PropertyName="AccountNo"
PropertyType="String"/>
</t:AdditionalProperties>
</ItemShape>
<ItemIds>
<t:ItemId Id="AQAWAHRlc3QwMUBob2dlaG9nZW5ldC5jb20ARgAAA+d6AQR1hVZLtUu7f6x+bGIHAMoLTK8fdLhFnpEriAzsIZ4AAAMPAAAAygtMrx90uEWekSuIDOwhngAAABEhS30AAAA=" ChangeKey="DwAAABYAAADKC0yvH3S4RZ6RK4gM7CGeAAANaHBP"/>
</ItemIds>
</GetItem>
</soap:Body>
</soap:Envelope>
</pre>
<h2 id="応答例7">
応答例7</h2>
<pre class="brush: xml;">
"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : c98ce9a5-70d6-42bc-acfb-28f809617b43
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=c2e612b25a6a495491dbb61db49a7e25; expires=Sat, 12-Mar-2016 23:19:35 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M7N383Mxc3GxczJ; expires=Thu, 12-Mar-2015 23:29:36 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Thu, 12 Mar 2015 23:19:36 GMT
connection : close
"--------------BODY SECTION-------------------"
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="0" MajorBuildNumber="516" MinorBuildNumber="29"/>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:CalendarItem>
<t:ItemId Id="AQAWAHRlc3QwMUBob2dlaG9nZW5ldC5jb20ARgAAA+d6AQR1hVZLtUu7f6x+bGIHAMoLTK8fdLhFnpEriAzsIZ4AAAMPAAAAygtMrx90uEWekSuIDOwhngAAABEhS30AAAA=" ChangeKey="DwAAABYAAADKC0yvH3S4RZ6RK4gM7CGeAAARIVyF"/>
<t:ExtendedProperty>
<t:ExtendedFieldURI DistinguishedPropertySetId="CalendarAssistant" PropertyName="AccountNo" PropertyType="String"/>
<t:Value>320</t:Value>
</t:ExtendedProperty>
</t:CalendarItem>
</m:Items>
</m:GetItemResponseMessage>
</m:ResponseMessages>
</m:GetItemResponse>
</s:Body>
</s:Envelope>
</pre>
<pre class="brush: xml;">
"--------------HEADER SECTION-------------------"
cache-control : private
transfer-encoding : chunked
content-type : text/xml; charset=utf-8
vary : Accept-Encoding
server : Microsoft-IIS/8.5
request-id : c40b2b35-4aa8-4940-8548-3ea19ccede2a
x-targetbeserver : win-t79tuft08l9.hogehogenet.com
x-diaginfo : WIN-T79TUFT08L9
x-aspnet-version : 4.0.30319
set-cookie : exchangecookie=141d265651ac42aeab68137b65067650; expires=Sat, 12-Mar-2016 23:14:20 GMT; path=/; HttpOnly, X-BackEndCookie=S-1-5-21-2274913595-3117749821-1060021795-1135=u56Lnp2ejJqBx82bysedms7SxsfJmtLLms7I0sfLmsnSy87Im5rJms6dxs7OgYHNz87K0M/M0M7N383Mxc3Lxc3I; expires=Thu, 12-Mar-2015 23:24:27 GMT; path=/EWS; secure; HttpOnly
x-powered-by : ASP.NET
x-feserver : WIN-T79TUFT08L9
date : Thu, 12 Mar 2015 23:14:26 GMT
connection : close
"--------------BODY SECTION-------------------"
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="0" MajorBuildNumber="516" MinorBuildNumber="29"/>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:CreateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:CreateItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:CalendarItem>
<t:ItemId Id="AQAWAHRlc3QwMUBob2dlaG9nZW5ldC5jb20ARgAAA+d6AQR1hVZLtUu7f6x+bGIHAMoLTK8fdLhFnpEriAzsIZ4AAAMPAAAAygtMrx90uEWekSuIDOwhngAAABEhS30AAAA=" ChangeKey="DwAAABYAAADKC0yvH3S4RZ6RK4gM7CGeAAARIVyF"/>
</t:CalendarItem>
</m:Items>
</m:CreateItemResponseMessage>
</m:ResponseMessages>
</m:CreateItemResponse>
</s:Body>
</s:Envelope>
</pre>
<h1 id="参考資料">
参考資料</h1>
<ul>
<li>(FindItem) <a href="https://msdn.microsoft.com/en-us/library/office/aa566107(v=exchg.140).aspx">https://msdn.microsoft.com/en-us/library/office/aa566107(v=exchg.140).aspx</a></li>
<li>(GetItem) <a href="https://msdn.microsoft.com/en-us/library/office/aa565934(v=exchg.140).aspx">https://msdn.microsoft.com/en-us/library/office/aa565934(v=exchg.140).aspx</a></li>
<li>(CreateItem) <a href="https://msdn.microsoft.com/en-us/library/office/aa564690(v=exchg.140).aspx">https://msdn.microsoft.com/en-us/library/office/aa564690(v=exchg.140).aspx</a></li>
<li>(DeleteItem) <a href="https://msdn.microsoft.com/en-us/library/office/aa580484(v=exchg.140).aspx">https://msdn.microsoft.com/en-us/library/office/aa580484(v=exchg.140).aspx</a></li>
<li>(UPdateItem) <a href="https://msdn.microsoft.com/en-us/library/office/aa581084(v=exchg.140).aspx">https://msdn.microsoft.com/en-us/library/office/aa581084(v=exchg.140).aspx</a></li>
</ul>
<a href="http://www.amazon.co.jp/gp/product/4822298221/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=4822298221&linkCode=as2&tag=rso-22"><img alt="参考文献" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4822298221&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=rso-22" title="ひと目でわかる Exchange Server 2013" /></a><br />
<a href="http://www.amazon.co.jp/gp/product/4822298221/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4822298221&linkCode=as2&tag=rso-22%22">ひと目でわかる Exchange Server 2013</a><br />
<h3 id="変更履歴">
変更履歴</h3>
<ul>
<li>1.0 初版作成</li>
</ul>
<h3 id="間違いなどありましたら指摘いただけると幸いです">
間違いなどありましたら指摘いただけると幸いです。</h3>
<blockquote>
Written with <a href="https://stackedit.io/">StackEdit</a>.</blockquote>rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-21491433611434416822015-10-14T00:22:00.000+09:002015-12-29T22:16:04.987+09:00<h4>
ISUCON5のベンチを動かすメモ</h4>
<br />
ISUCON5の予選問題を動かしてみたいけどどうやったらいいのかよくわからん人用のメモ。<br />
<br />
GCPアカウント作成~イメージ作成までは<a href="https://gist.github.com/tagomoris/1a2df5ab0999f5e64cff" target="_blank">レギュレーション</a>に書いてあるので省略。<br />
<br />
<pre class="brush: shell;">$ sudo su - isucon
$ vi .bashrc
//以下を追記
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
alias ll="ls -la"
alias vi="vim"
//.bashrc反映
$ . .bashrc
// リポジトリをクローン
$ git clone https://github.com/isucon/isucon5-qualify.git
$ cd isucon5-qualify/bench
//ビルド
$ gradle compileJava
//jq入れる
$ sudo apt-get install jq
//ベンチ実行
$ ( curl localhost/initialize;cd ~/isucon5-qualify/bench; cat ~/isucon5-qualify/webapp/script/testsets/testsets.json | jq .[0] | gradle run )
</pre>
自分の環境ではなぜかベンチがJSTの時刻を取得できなくてうまく動いてなかったので、<br />
以下の修正を入れた。<br />
<br />
<pre class="brush: shell;">$vi ./bench/src/main/java/net/isucon/isucon5q/bench/scenario/BootstrapChecker.java
LocalDateTime beforeUpdates = LocalDateTime.now().withNano(0);
LocalDateTime afterUpdates = LocalDateTime.now().withNano(0);
=> 以下のようにZoneIdを指定
//ZoneIdをインポート
import java.time.ZoneId;
ZoneId zoneId = ZoneId.of("Asia/Tokyo");
LocalDateTime beforeUpdates = LocalDateTime.now(zoneId).withNano(0);
LocalDateTime afterUpdates = LocalDateTime.now(zoneId).withNano(0);
</pre>
<br />
<br />
以上。rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-78885666834678398302015-09-27T22:38:00.001+09:002015-12-29T22:16:13.025+09:00Excel系SEがISUCON5に参加してみた<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/AVvXsEjxdIPCfscNvoaSXNWoZHCn6DziW0BI9-GmiKjnKl8Phzb57jqWUb511uM6XkN6SIsr4NJYwEU1m-3XWV32qn3Z14MQuxmr3kD3-C-NWDglp-seZsCTQpo_KHM5dqEXOqoy57Qg_HXl1yB8/s1600/ISUCON.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="73" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxdIPCfscNvoaSXNWoZHCn6DziW0BI9-GmiKjnKl8Phzb57jqWUb511uM6XkN6SIsr4NJYwEU1m-3XWV32qn3Z14MQuxmr3kD3-C-NWDglp-seZsCTQpo_KHM5dqEXOqoy57Qg_HXl1yB8/s200/ISUCON.png" width="200" /></a></div>
<br />
<div>
ISUCONなる面白そうなコンテストがあったので、同僚を誘って計三人で参加してみた。</div>
<div>
やったこと、感想などを残しておく。</div>
<div>
<br /></div>
<div>
<h4>
1.ISUCONとは</h4>
</div>
<div>
お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル。
詳しくは<a href="http://isucon.net/archives/44132090.html" target="_blank">こちら</a>。</div>
<div>
<br /></div>
<h4>
2.準備編</h4>
<div>
今年6月ぐらいからISUCONが開催されることを知ったので、三週間に1回ぐらいみんなで過去門をやるぐらいのまったりペースで練習開始。普段こういうチューニングはやらいので、みんな手探りの状態からとりあえずスタート。最終的に5回ぐらい集まって練習会を実施し、行ったのは大体以下の内容。</div>
<div>
<br /></div>
<div>
<ul>
<li>1回目・・・ とりあえずISUCON4予選過去問をやってみる。AWSの設定やら試行錯誤でみんな好き勝手にいじる。模範解答を参考にnginxやRedisを入れてスコアをあげてみる。</li>
<li>2回目,3回目・・・ ISUCON4予選問題を各自でいじってみて、結果を持ち寄る。node + Redis構成にしてMySQLを完全に取っ払うことで、当時の予選通過スコアぐらいまで出せて満足。</li>
<li>4回目・・・ ISUCON3予選問題をみんなでやる。そろそろ本番はどういう構成で望むのかを議論。みんなそれほど得意な言語はなかったので、最大公約数的にRubyを選択し、DBは部分的にRedisかもしくはSQLite(インメモリ)で行こうという方針で検討。</li>
<li>5回目・・・ ISUCON4予選問題をRuby+Redis+nginx で構成するように模擬本番形式で実施。Google Cloud Platformで動くISUCON4予選イメージが配布されていたので、そちらを使用する。スコア送信用本番サーバ1台と、各自の開発用サーバ1台*3の構成で実施。ファイルの受け渡しはGithub上のリポジトリでやり取りするように取り決め。SSH鍵の作成やRuby, Redis, nginx の設定ファイルテンプレをリポジトリに登録。</li>
</ul>
<div>
# レギュレーションを見て、予選終了までリポジトリ公開は禁止だったので、慌ててgithubアカウントをプライベートに変更(合わせてGithubアカウントをアップグレード)<br />
<br />
また、予選をチーム名"本業:Excel職人" で登録。</div>
</div>
<div>
<br /></div>
<div>
<h4>
3.本番当日編</h4>
<div>
10開始予定だったので、9時に集合して買出しなど済ませ、準備に入る。</div>
</div>
<div>
その後アナウンスがあり11時開始に変更となったので、それまで待機。ISUCON4のイメージを上げて復習。</div>
<div>
<br /></div>
<div>
11時からポータルサイトにアクセスが解禁され、VMイメージが公開されたので、早速展開して接続。その際に"uname -a" を打ったときに衝撃が走る。</div>
<div>
<br /></div>
<div>
Linux isucon5-production 3.19.0-21-generic #21-<b>Ubuntu</b> SMP</div>
<div>
Ubuntuだと・・・(´゚д゚`)</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
ISUCON4予選も3予選もCentOSだったので、Ubuntuはノーマークだった。しかも普段CentOSしか触っていなく、Ubuntuをサーバ用途でいじったのは何年ぶりかわからない。</div>
<div>
しかもサービスはsystemdで管理されているし。。これログどうやってみるんだっけ。。</div>
<div>
※(追記) レギュレーションにUbuntuって追記されてましたね。。恥ずかしい。。<br />
<br /></div>
<div>
学生のころの期末テスト開始直後で問題用紙を裏返して見た直後に"ここ出すんかい"</div>
<div>
と試験勉強範囲を外されたときと似た思いだった。</div>
<div>
<br /></div>
<div>
お題はSNS系のサイトだった。過去の予選に比べかなり複雑な印象を受けた。</div>
<div>
DBのテーブルも今まで2~3個だったけど、今回は7つ。</div>
<div>
<br /></div>
<div>
とりあえず1時間半程度かけてみんなでコードリーディングしながら、改善点を洗い出していく。</div>
<div>
最終的に変更できたのは以下の内容。</div>
<div>
<br /></div>
<div>
<ul>
<li>nginxでの静的ファイルのキャッシュ。nginxやunicornの稼動プロセス数の変更。通信のgzip化</li>
<li>tcp接続からunixドメインソケットを使用するよう変更</li>
<li>足跡の処理をMySQL -> Redisに変更</li>
<li>日記のentryテーブルのbodyカラムにタイトルと本文が入っているために、分離</li>
<li>usersとsaltsテーブルの統合</li>
<li>いけてないMySQLクエリを粛々と改善。インデックスの検討</li>
<li>不要なサービスの停止</li>
</ul>
</div>
<div>
上記のことをやっていたらいつの間にか8時間たってしまった。</div>
<div>
スコアは上位陣とは程遠いもので、初期スコアよりはまあ改善は見られるものの、もう少し出せればよかった。。上位陣の模範解答が気になる。</div>
<div>
<br /></div>
<div>
練習でやろうとしていたことは最低限できたような気がしたが、修正スピードが遅かった。</div>
<div>
もう少し多くの部分をRedisに置き換えたかったが、ベンチに怒られて最終的にコミットできず。</div>
<div>
また練習ではベンチマークがまわし放題だったが、本番ではベンチの実行リクエストがキューに</div>
<div>
たまるので好き放題まわせなくて、修正に戸惑う場面もあった。</div>
<div>
<br /></div>
<div>
今回の練習でsinatoraとかnodeとかRedisとかnginxとか普段触らないものを勉強できたのでいい機会だった。</div>
<div>
前回よりお題が複雑で、運営さんも大変そうだった。</div>
<div>
<br /></div>
<div>
似たようなイベントがあればまた参加したい。</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
※上記ロゴ画像は本家より拝借しております。問題ありましたら削除しますのでご連絡下さい</div>
<div>
<br /></div>
<div>
</div>
<div>
<br /></div>
<div>
<br /></div>
rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-3520969207672727282014-06-09T08:23:00.001+09:002015-12-29T22:16:26.266+09:00AndEngineの使い方(インストールメモ)Andoridの2Dゲームエンジン"AndEngine"が面白そうなので、使い方をメモ<br />
<br />
<div style="text-align: center;">
<img src="data:image/jpeg;base64,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" /></div>
<br />
<br />
<br />
当方の実行環境は以下の通り。<br />
<br />
<ul>
<li>IntelliJ IDEA Community Edition 13.1.2</li>
<ul>
<li>Android開発用のプラグインを入れておくこと</li>
</ul>
<li>以下のバージョンの<a href="https://github.com/nicolasgramlich/AndEngine">AndEngine</a></li>
<ul>
<li>commit: 720897f99d2c56ba357e8fe361454bd8d88c37ed</li>
</ul>
<li>AneEngineExample</li>
<ul>
<li>commit: 75b657b2cd7e1153e005a917753b6d0390e034d5</li>
</ul>
<li>その他GitHubに公開されているExtension全て</li>
</ul>
<br />
<h4>
1.ソースコードの入手</h4>
Githubにソースコードが公開されているので、AndEngine本体に加えて、サンプルコードをExtensionをすべてcloneする。<br />
同一のディレクトリにまとめてcloneしておくと便利。<br />
<br />
<h4>
2.プロジェクトの作成</h4>
IntelliJの"import project"でAndEngineExampleのプロジェクトをインポートする。<br />
参照するライブラリはInnteliJが自動で解決してくれるみたい。便利。<br />
<br />
<h4>
3.サンプルプログラムの実行</h4>
<div>
ExampleLauncherを実行すればさまざまサンプルが実行できる。</div>
<div>
<br /></div>
<div>
そのままビルドすると、いくつかエラーが発生したので、以下のように修正<br />
<br />
<br />
<br />
<br />
<br />
<li>java: シンボルを見つけられません[シンボル: クラス DrawMode</li>
</div>
<blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;">
<br />
<br />
<br />
<br />
<li>インポートするディレクトリを変更 </li>
</blockquote>
<div>
<br /></div>
import org.andengine.entity.primitive.vbo.DrawMode; <br />
→ import org.andengine.entity.primitive.DrawMode;<br />
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: 'Meiryo UI'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">
<br />
<br />
<br />
<br />
<li>TextBreakExampleのTextOptionの引数が逆になっているので修正</li>
</div>
<div>
<br />
<br />
<br />
<li>BoundCameraExampleのAnimatedSprite作成時に、animateの実行を別の文に分ける。</li>
</div>
final AnimatedSprite face = new AnimatedSprite(pX, pY, this.mBoxFaceTextureRegion, this.getVertexBufferObjectManager()).animate(100);<br />
<div>
<br /></div>
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: 'Meiryo UI'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">
</div>
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: 'Meiryo UI'; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">
<div style="margin: 0px;">
これでビルドできるようになり、</div>
<div style="margin: 0px;">
これらのサンプルを参考にすればすぐにある程度ゲームが作れそう。<br />
<br />
<br /></div>
</div>
<div>
<a href="http://www.amazon.co.jp/gp/product/4798130516/ref=as_li_qf_sp_asin_il?ie=UTF8&camp=247&creative=1211&creativeASIN=4798130516&linkCode=as2&tag=rso-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4798130516&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=rso-22" /></a><img alt="" border="0" src="http://ir-jp.amazon-adsystem.com/e/ir?t=rso-22&l=as2&o=9&a=4798130516" height="1" style="border: none !important; margin: 0px !important;" width="1" />
</div>
rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-74530496239242857962013-12-21T21:38:00.000+09:002015-12-29T22:18:07.053+09:00ブラックジャックのシミュレータをjavascriptで書いてみた<h4>
</h4>
ブラックジャックのシミュレータは以前も作ったことがあるけど、今回はブラウザでも実行できるようjavascriptで作ってみた。
途中で力尽きしまったので、ディーラーのシミュレーション部分のみ作成。
概要は以下のとおり
<br />
<br />
<ul>
<li>ディーラーのアップカードを2~10, Aceのいずれかを選択する</li>
<li>17以上になるまでカードを引く</li>
<li>最終的なディーラーハンドの出現回数と割合を計算する</li>
</ul>
<a href="http://stress-free.sakura.ne.jp/bj/bjdealersimulator.html"></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://stress-free.sakura.ne.jp/bj/bjdealersimulator.html"><img alt=" ss" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7ourPmAlGOxDGTdgxxx-OLdhgyuR1oVX3od_FSdGkcJGVdbC_wOpdeHq-mOXWz76n5hF-D8QM9qIsH59ruPJTA1PZbhADNMqNASTHcECESKFABW_YiHY9HOC_wEFkwwCSVe7dHOWdnYLu/s320/simu2.png" /></a><a href="http://stress-free.sakura.ne.jp/bj/bjdealersimulator.html"> </a></div>
<br />
<h4>
結果の見方</h4>
たとえば、ディーラーのアップカードが10のとき、バーストする確率は約22~23%というが分かる。
ということは、プレイヤーカードが16であったとしてもスタンドすればほぼ8割方負けしまうので、引いた方がまだましという判断になる。
<br />
<br />
<h4>
シミュレータの場所</h4>
シミュレータのページは<a href="http://stress-free.sakura.ne.jp/bj/bjdealersimulator.html">こちら</a>
rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-47543852612017183812013-10-10T19:39:00.000+09:002015-12-29T23:49:49.369+09:00文字コード体系に関するメモrsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-76511719252244023972013-08-31T17:02:00.002+09:002015-12-29T22:18:29.261+09:00BlackJackシミュレータ作ってみた<h4>
</h4>
ブラックジャックのそれぞれの手の場合にどれくらいの期待値で<br />
勝てるのかを調べるために、Scalaでモンテカルロシミュレーションプログラムを作ってみた。<br />
<br />
<br />
<ul>
<li>プレイヤーの手札が8~20の時に対して、ディーラーのアップカードが2~Aのそれぞれに対して、HIT/STAND/DOUBLEDOWNを500000回繰り返したときの期待値を求める。</li>
<li>カードは無限にあるものとする(カウンティングの要素は含まない)</li>
<li>乱数は擬似乱数を使用する</li>
<li>サレンダーは考慮しない(アーリーサレンダーとレイトサレンダーを分けるのがしんどいので)</li>
<li>ディーラーはソフト17スタンドとする</li>
</ul>
<div>
<br /></div>
<h4>
結果</h4>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://stress-free.sakura.ne.jp/data/Result.htm"><img alt="" border="0" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5xH5hyphenhyphen_0f-V2Uwtg-937YKlAPpewGhBVXb5ERnfDekMGgHjisrsD7Ib7m6WhNRym9awrD0A5Kid6DWz3Y3XZpgczsCPATm2Xq-3TXH491coWHo6qHAxv22qduDpxAOo654xn80sVBbxHF/s400/ss.png" style="margin-left: auto; margin-right: auto;" title="結果" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><a href="http://stress-free.sakura.ne.jp/data/Result.htm"><br /></a></td></tr>
</tbody></table>
<div>
<br /></div>
<div>
<a href="http://stress-free.sakura.ne.jp/data/Result.htm">こんな感じ</a>になった。表の各数値はHIT / STAND / DOUBLE DOWN をずっと繰り返したときの期待値です。各セル内の最大値となるものが、最適戦略となる。</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
他のサイトとの比較</h4>
<div>
<a href="http://www.sunrain.jp/casino/black_jack.html">このあたり</a>に掲載されているベーシックストラテジーと比較すると、一部微妙に違いがあるが、このあたりは乱数の性能の限界なのかもしれない。<br />
<br />
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<h4>
作成したプログラム</h4>
<br />
<a href="https://github.com/rsooo/BlackJackSimulator">GitHub</a>に置いています。</div>
rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-81293027509253124632013-04-13T21:49:00.000+09:002015-12-29T22:17:09.672+09:00<h4>
家に帰ってブログ書くまでがシェル芸</h4>
<br />
<br />
<a href="http://kokucheese.com/event/index/78710/">春爛漫シェル芸人撩乱勉強会</a>に参加してきた。<br />
本日はwget, curl, sedさんたちが活躍する内容。
curlなんて入ってたっけ?と思うぐらい何もしない状態での参加をしてしまった。<br />
前回と同じく以下、自分の知らなかったことの(断片的な)まとめ。
<br />
<br />
<h4>
curl, wget で画像URL収集</h4>
curl, wgetでhtmlファイルを持ってきて、そこからは必要なデータを切り出すという作業。<br />
以下はimgタグにある画像データを取ってくる場合。<br />
<br />
<pre class="brush: shell;">$ curl http://www.yahoo.co.jp | sed -e 's/<img src/\n&/g' | grep "img src" | grep http | sed -e 's/^[^"]*"//' | sed -e 's/".*$//'
http://k.yimg.jp/images/clear.gif
http://k.yimg.jp/images/clear.gif
http://k.yimg.jp/images/clear.gif
http://k.yimg.jp/images/clear.gif
・・・以下略
</pre>
<br />
上のコマンドを見て気持ち悪いと持った人は正常な感性を持ってると思う。オレならこう書けるとか思った人は変態やと思う。<br />
<br />
ひたすらsedでテキストをいじってるけど、このURL抜き出しに必要なsedイディオムは以下のようだった。
<br />
<ul>
<li>img srcタグ1つにつき1行にするように抜き出したいタグ(この場合img)の前に改行をぶちこむ</li>
<li>先頭からURLの直前の'"'までと、URL以降を削除する。</li>
</ul>
正規表現は普通に書くと最長一致となり意図しない部分まで削られてしまうので、
^[^"]*"のような気持ち悪い書き方になる。これは何とかならない物なのか。<br />
<br />
grep -oオプションを使えばもう少し簡単にかけて、以下のような感じになった。<br />
<pre class="brush: shell;">$ curl http://www.yahoo.co.jp | sed -e 's/<img src/\n&amp//g' | grep "img src" | grep -o 'http://[^"]*"' | tr -d \"
</pre>
-oオプションは行単位ではなく、マッチした部分のみ出力する。これは一番明日から使える内容かもしれない。
<br />
<br />
いずれにしろ、こういう書き方はワンライナーだから許されるものであってこんなのがスクリプトとして残っていたら見るほうが発狂しそう。<br />
<div>
<br /></div>
あと便利なgrepオプションついでに-A -B -C (NUM)オプションも素晴らしい。これはマッチした行の前後もあわせて表示すると言うもの。<br />
<br />
<pre class="brush: shell;">% seq 1 10 | sort -R
% seq 100 110
100
101
102
103
104
105
106
107
108
109
110
# マッチした次の行も表示
% seq 100 110 | grep -A 1 105
105
106
# マッチした前の行も表示
% seq 100 110 | grep -B 1 105
104
105
# マッチした前後の行も表示
% seq 100 110 | grep -C 1 105
104
105
106
</pre>
<h4>
</h4>
<h4>
<br />
curl, wgetでPOSTリクエスト</h4>
以下のようにすれば、wget, curlでもPOSTリクエストが送れる。
cronで定期的にリクエスト投げたいときに使えるかもしれない。
<br />
<pre class="brush: shell;">$ wget -O - --post-data=test http://www.usptomo.com/XXXXXXX
$ curl -d test http://www.usptomo.com/XXXXXX
</pre>
<br />
他にもいろいろあったけど、とりあえず酒が入ってものすごい眠いので今日はここまで!
rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-27655544215413304382013-01-27T16:46:00.003+09:002015-12-29T22:19:17.653+09:00<h4>
Windows環境へPython, easy_installインストール手順</h4>
<br />
Linux環境ならすぐできたけど、Windows環境では環境変数の<br />
設定などが多少必要だったのでメモ<br />
<br />
環境:Windows 7<br />
入れるもの: python2.7, easy_install<br />
<br />
<ol>
<li><a href="http://www.python.org/download/">Python公式サイト</a>からpython2.7インストーラをダウンロード・実行</li>
<li>すべてデフォルトでインストールすると、C:\Python27以下にディレクトリ・ファイルが生成される。</li>
<li>環境変数PATHに"C:\Python27"と"C:\Python27\Scripts"を追加。</li>
<li>環境変数PYTHON_HOMEにも"C:\Python27"追加。</li>
<li>コマンドプロンプトから<span style="font-family: Courier New, Courier, monospace;">python</span>と実行すると反応があることを確認。</li>
</ol>
<div>
以上でpythonインストール完了。</div>
<div>
ついでにeasy_installも入れる。</div>
<div>
<ol>
<li><a href="http://pypi.python.org/pypi/setuptools">このWebサイト</a>から<a class="reference external" href="http://peak.telecommunity.com/dist/ez_setup.py" style="background-color: white; color: #551a8b; font-family: Arial, Verdana, Geneva, 'Bitstream Vera Sans', Helvetica, sans-serif; font-size: 15px; line-height: 17.8125px; text-decoration: initial;">ez_setup.py</a>をダウンロード</li>
<li><span style="font-family: Courier New, Courier, monospace;">python ez_setup.py</span> でインストール</li>
<li>コマンドプロンプトから<span style="font-family: Courier New, Courier, monospace;">easy_install</span>と実行すると反応があることを確認。</li>
</ol>
<div>
以上</div>
</div>
<div>
<br /></div>
<br />
<br />
<br />rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-51235666921264034512013-01-02T00:51:00.001+09:002015-12-29T22:19:30.113+09:00cmdおみくじ正月で暇だからコマンドプロンプトで貼り付けたらおみくじの結果を表示するワンライナー書いてみた。
シェルだとすぐにできるけどDOSのコマンドだとどうやっていいのかなかなか分からなかったので、メモ代わりに残しておく。
<pre class="brush: shell;">
SET /A R=%RANDOM% % 6+1 >null & for /f "tokens=%R%" %i in ("大吉 中吉 小吉 末吉 凶 大凶") do echo おみくじの結果は"%i"です。
おみくじの結果は"中吉"です。
</pre>
rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-41683793028657556942012-12-08T22:55:00.002+09:002015-12-29T22:19:39.132+09:00<h4>
シェル芸人への道</h4>
<br />
<a href="http://kokucheese.com/event/index/61379/">第2回シェル芸人養成勉強会</a>に参加してきた。<br />
<a href="http://rsooo.blogspot.jp/2012/10/blog-post.html">hbsstudyハンズオン</a>にも参加していたので、なんとなく雰囲気が掴めていて前回よりついていけたような気がする。
前回と同じく以下、自分の知らなかったことの(断片的な)まとめ。
<br />
<br />
<h4>
パイプステータス</h4>
パイプを何個もつなげると、最後の終了ステータスしか分からないと思っていたが、<br />
実はPIPESTATUSに最後のステータス以外も配列として格納されている。<br />
<pre class="brush: shell;">% echo hoge | cat
hoge
% echo hoge | cat | cat | cat | cat
hoge
% echo ${PIPESTATUS[@]}
0 0 0 0 0
% echo hoge | cat | cat error | cat | cat
cat: error: No such file or directory
% echo ${PIPESTATUS[@]}
0 0 1 0 0</pre>
<br />
<h4>
フィールドを指定したソート</h4>
-kn,m (nは開始フィールド、mは終了フィールド)オプションでソートに使用する基準を指定できる。<br />
-kオプションを使うことは知っていたけど、このあたりの理解が曖昧になっていた。<br />
<pre class="brush: shell;">% cat hoge
a 12
a 13
b 13
a 432
b 111
b 43
# フィールド1番目、2番目の順でそれらをキーとしてソート
% sort hoge | sort -k1,1 -k2,2nr
a 432
a 13
a 12
b 111
b 43
b 13
</pre>
<br />
<h4>
ランダムソート</h4>
要素をランダム(ハッシュに応じて)ソートする。<br />
これはソートと言っていいのか?という疑問はある。<br />
<pre class="brush: shell;">% seq 1 10 | sort -R
5
9
1
2
6
3
10
8
4
7
</pre>
<br />
<h4>
grep検索パターンをファイルから指定</h4>
-fオプションを使うことにより、検索するパターンをファイルから取得できる。これは便利。<br />
<pre class="brush: shell;">% cat fuga
hoge
fuga
piyo
% cat fuga2
fuga
piyo
piyopiyo
# fuga2の内容をパターンとしてfugaからgrep
% grep -f fuga2 fuga
fuga
piyo
</pre>
<br />
<h4>
プロセス置換</h4>
<strike>これを一般的になんて表現したらいいのか分からないけど、以下のようにするとファイルに出力を意識することなく、ファイル出力されたものとして他のコマンドに結果を渡せる。</strike><br />
<strike># 裏側ではファイル出力してるのやろうけど、使用者からは意識しなくて言いと言う意味</strike><br />
(ご指摘を受けたので修正)<br />
<br />
以下のようにすると、プロセスの入出力をファイルのように取り扱うことができる(ファイルは出力していない)。
<br />
<pre class="brush: shell;">% cat hoge
a 12
a 13
b 13
a 432
b 111
b 43
% wc <(cat hoge)
6 12 32 /dev/fd/63
</pre>
<br />
どれも明日使える内容ばかりですね!!<br />
<br />
しかしこれくらいで感心しているようでは、シェル芸人の道のりはまだまだ遠い。。
<br />
<br />rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-2194854558641491062012-11-20T00:39:00.000+09:002015-12-29T22:19:51.060+09:00[Android] AVDの作成時に"Error: null"と表示されて作成失敗する。 <h2>
<br /></h2>
Androidのエミュレータを作成するときに作成ボタンを押しても反応せずに、
"Error:null"とだけログに表示される。<br />
<br />
<br />
困ったときのStackOverFlowがやはり役に立って、<a href="http://stackoverflow.com/questions/4810478/android-sdk-and-avd-manager-cant-create-avd-in-correct-file-location">このあたり</a>の回答と参考にすると、
結局のところ環境変数ANDROID_SKD_HOMEに.androidの上のディレクトリ(\Users\toyuserなど)を指定してやればこのエラーは出なくなった。<br />
<br />
<br />
問題はなんで今まで作成できたものが出来なくなったのかは分からないけど、とりあえず解決したらかクローズ。rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-27828355203058036972012-11-09T00:03:00.001+09:002015-12-29T22:20:00.777+09:00[Android]スライドで大きさを変えられる可変ビュー作ってみた<br />
Androidっていわゆるスライドバーみたいな感じでビューの大きさを変えることって<br />
標準のウィジェットでは用意されていない。<br />
<br />
やからスライド(ドラッグ)で大きさを可変にできるビューを作ってみた。<br />
<br />
なまえは適当にSlideBarDrugViewControllerとしてみた。<br />
ソースは<a href="https://github.com/rsooo/SlideBarWidget/tree/master/src/rsooo/app/jp">コチラ(Github)</a>。以下は使い方の簡単なメモ。<br />
<br />
<h3>
レイアウト</h3>
<div>
スライドバー用のビューと、その上下にビューを用意する。</div>
<div>
今回は例なのでビューの種類は何でもいい。</div>
<div>
<br /></div>
<div>
<pre class="brush:xml" name="code121109000705"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:id="@+id/view0"
android:gravity="center" />
<TextView
android:id="@+id/view1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SlideBar"
android:background="#6090ef"
android:gravity="center" />
<Button
android:id="@+id/view2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="BottomView" />
</LinearLayout>
</pre>
</div>
<div>
<br />
<br />
<h3>
MainActivity</h3>
Mainのアクティビティにレイアウトを読み込ませる。<br />
以下の2点を使用する。<br />
<ul>
<li>(1)で書かれている4つの引数を与える</li>
<li>(2)のようにonTouchイベントをcontrollerに渡す</li>
</ul>
<br /></div>
<pre class="brush:java" name="code121109001030">public class SlideBarWidgetActivity extends Activity {
Context context;
SlideBarDrugViewController controller;
View upperView;
View slidebarView;
View bottomView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
upperView = (View)this.findViewById(R.id.view0);
slidebarView = (View)this.findViewById(R.id.view1);
bottomView = (View)this.findViewById(R.id.view2);
context = this;
}
public void onWindowFocusChanged(boolean hasFocus) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
final int screenHeight = display.getHeight();
Rect r = new Rect();
this.upperView.getGlobalVisibleRect(r);
if(controller == null){
/**
* (1)以下の4つの引数を与える
* drugView 可変ビュー(スライドバーの上部ビュー)
* slideBarView スライドバーとなるビュー
* minpx 可変ビューの上部(top)の絶対座標
* maxHeight スライドバーが下に動く最大サイズ。画面全体の大きさを入れると最下端まで移動させられる
*/
controller = new SlideBarDrugViewController(upperView, slidebarView, r.top, screenHeight);
}
}
@Override
public boolean onTouchEvent(MotionEvent event){
// (2) onTouchイベントをcontrollerに委譲
return controller.onTouchEvent(event);
}
}
</pre>
<H3>実行結果</h3>
<div>
画像では分かりにくいけど、ScrollBarをスライドさせるとそれにあわせて上下のビューの大きさが変化する。</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhijKkALtrBtwHc3UM4E1etYmkE59VlyVzQ2tE8wrLzSgrsiBGrqVYG7m5mUHgnxYhzLbqg1QVB3BxXh_3GTti2NzK3sLtfmzh9o5Yz6Z9KXr3hTI9HNC2B1XKn0CM3E2zdBabJaa_kHA3p/s1600/1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhijKkALtrBtwHc3UM4E1etYmkE59VlyVzQ2tE8wrLzSgrsiBGrqVYG7m5mUHgnxYhzLbqg1QVB3BxXh_3GTti2NzK3sLtfmzh9o5Yz6Z9KXr3hTI9HNC2B1XKn0CM3E2zdBabJaa_kHA3p/s320/1.png" width="195" /></a></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyVqSPzpWcp5RXG-0LIiqCC9f1zHFdgV_gCx1OnQ8Cm2aV3kRZUzQOHQShE4qBvDtQqoWD56i-13hpEkgujy9rhCfiIfD4zgOkAUhJBwszT5EFXlp-0nUoRG8WkR6-YtiBtCFULnjoXPWe/s1600/2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyVqSPzpWcp5RXG-0LIiqCC9f1zHFdgV_gCx1OnQ8Cm2aV3kRZUzQOHQShE4qBvDtQqoWD56i-13hpEkgujy9rhCfiIfD4zgOkAUhJBwszT5EFXlp-0nUoRG8WkR6-YtiBtCFULnjoXPWe/s320/2.png" width="197" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0jDkw-DKsin6XiwbfXfxXd5R2phadiMW3BNPqR-lnaLOYFpRJ0Ef94OQ5-y-ckRIuFjIqCBLTUZqIwhqQprAImJJXSRJnicY0VrixwarvfuiyL0TUAGs0xNfjIt8nrlHjtM0V2q3IEJF8/s1600/3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0jDkw-DKsin6XiwbfXfxXd5R2phadiMW3BNPqR-lnaLOYFpRJ0Ef94OQ5-y-ckRIuFjIqCBLTUZqIwhqQprAImJJXSRJnicY0VrixwarvfuiyL0TUAGs0xNfjIt8nrlHjtM0V2q3IEJF8/s320/3.png" width="192" /></a></div>
rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-45007049449247445662012-10-28T00:14:00.000+09:002015-12-29T22:20:37.000+09:00<h4>
<a href="http://heartbeats.jp/hbstudy/">#hbstudy</a>ハンズオン</h4>
<br />
10問お題が出されてそれをbashワンライナーで解けという内容でした。<br />
<div>
普段からのコマンド習熟度が問われるわけですね。<br />
・・・と思ったらawk習熟度が思いっきり問われました。<br />
<br />
以下は自分が知らなかったことの(断片的な)まとめ。<br />
<br /></div>
<div>
<h4>
標準入力をcatで受け取るには</h4>
</div>
<div>
<br /></div>
<div>
ハイフンを引数に取ればいける。知らなかった。<br />
もちろん複数の引数をとればcatの出力は連結される。</div>
<div>
<br /></div>
<pre class="brush: shell;">$ echo "hoge" | cat -
</pre>
<div>
<br />
<br />
<h4>
bashでデータをランダムにシャッフルするには</h4>
慣れている人がやればawkでもうこれは慣用句らしい。<br />
<br />
以下は1~10の数字をランダムにシャッフルする例<br />
<br />
<br />
<pre class="brush: shell;">$ seq 1 10 | awk '{print rand()" "$1}' | sort | awk '{print $2}'
10
4
8
6
1
2
9
5
7
3
</pre>
awkでの切った貼ったはお手のものですね。
<br />
<br />
<h4>
欠けているデータを探すには</h4>
お題では1~10までのどれか一つの数字が欠けていてさらにシャッフルされたデータがあるとき、その欠けている数字のみを表示するというもの。<br />
diffはそれ以外のものも表示されてしまうので禁止。<br />
<br />
<br />
<pre class="brush: shell;">$ cat num
10
8
6
1
2
9
5
7
3
$ seq 1 10 | cat - num | sort -n | uniq -u
4
</pre>
<br />
ここの問題のミソは比較したいデータをまとめてソートしてuniqで一行しかないものをとってくると言うこと。-uオプションとかこういう風に使えるのね。
<br />
<br />
<h4>
FizzBuzz問題</h4>
できるだけエレガント?に<br />
<br />
<pre class="brush: shell;">$ seq 1 100 | awk '$1%15==0{printf "FizzBuzz "} $1%5==0{printf "Buzz "} $1%3==0{printf "Fizz "} {print $1" "}' | awk '{print $1}' | tr "\n" " "
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buz
</pre>
<br />
まあこれはいろんな方法がありそう。自分は最初bashのtestコマンドで頑張っていたがawkの方が短くなるね。<br />
<br />
<br />
<h4>
所感?</h4>
印象深かったことは、玄人(バイニン)の人たちは息をするかの如くawkを書きなぐっていたこと。<br />
自分はawkほとんど慣れていなかったので、後半はついていけなかった。。<br />
<br />
あの時間から3時間シェルと遊ぶのはなかなかエネルギーが必要やったけど、いい勉強になった。<br />
<br /></div>
rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-43519848080804213862012-10-14T01:51:00.000+09:002015-12-29T22:20:48.893+09:00MongoDBメモMongoDBのインポートコマンドのメモ
<pre class="brush: shell;">
mongoimport -v -d Document名 -c Collection名 --file JSONファイル
</pre>
上記のコマンドで、JSONファイルで書かれたデータをMongoDBにインポートできる。rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-13539328167731610602012-10-02T00:42:00.000+09:002015-12-29T22:20:56.651+09:00Scala体験記_2Scalaのifは文(statement)じゃ無くて式(expression)なんだぜ。だから以下のように書けたりする。<br />
<br />
<pre class="brush: scala;"> val a = if (1 < 2 ) {10} else {20}
println(a)
</pre>
まぁこれだけやと三項演算子と何が違うの?っていわれそうやけども。<br />
<br />
if式でハマってしまったのは、if式の評価順が予想よりも低いこと。<br />
以下の例の出力結果はどうなるやろうか。<br />
<br />
<br />
<pre class="brush: scala;">
val a = if (1 < 2 ) {
10
} else {
20
}
+ 5
println(a)
</pre>
<br />
意味もなくネストして書いてみたけど、こいつの出力結果は10となる。
これはifよりも{20} + 5が先に評価されたせい。
これに気づかずに1時間ぐらい悩んでたら良くある誤解として取り上げられていたのでメモ。rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-50710148787098163692012-10-01T00:56:00.000+09:002015-12-29T22:21:04.177+09:00Scala体験記<h2>
<br /></h2>
Scalaを使って何か書いてみようと思ったけど、基本的なループの書き方すらよく分かってなかったので復習がてら内容をメモ<br />
<br />
以下Int型リストの総和を求めるというものすごく簡単な例<br />
<br />
<h4>
関数型っぽく書いたとき</h4>
<br />
<pre class="brush: scala;">def calcsum(list:List[Int]) : Int = {
if (list.isEmpty)
0
else
list.head + calcsum(list.tail)
}
</pre>
<br />
<h4>
Java(手続き型)っぽく書いたとき</h4>
<br />
<pre class="brush:scala" name="code"> def calcsum2(list:List[Int]) : Int = {
var sum = 0
for( value <- list) sum += value
sum
}
</pre>
<br />
こういう風に関数型と手続き型の両方で書けるのがScalaのいいところ。
その気になれば全部Javaっぽく書くのも可能。rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-77988814104548859332012-09-20T01:00:00.000+09:002015-12-29T22:21:16.186+09:001つのプロジェクトにJavaとScalaを混在させてビルドする方法もうすでに詳細なやり方が他の記事で書かれていたので、メモ代わりにリンクを張っておく<br />
<br />
Scala Eclipseプラグインの導入からビルドまでの手順<br />
<ul>
<li> <a href="http://d.hatena.ne.jp/mazinlabs/20100128/1264691562">EclipseにScala環境を設定する</a> </li>
</ul>
<br /><ul>
</ul>
JavaプロジェクトでScalaコードを含めてビルドする手順<br />
<ul>
<li> <a href="http://xawa99.blogspot.jp/2012/09/Scala-JavaProject2ScalaProject.html">[Scala] Eclipse の Java プロジェクトで Scala を使えるようにする</a> </li>
</ul>
<br />
思ったより簡単にJavaプロジェクトにScalaコードを書いて実行することができた。<br />
Scalaで定義したメソッドの定義をJava側のコードで補完とかもできるので一部だけScalaを混ぜても
違和感無く使用できそうな感じがした。<br />
<br />
<br />
<br />
Androidコードもこの調子でさくっとビルドできればいいんやけど。。rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-63027865732827341412012-09-19T00:20:00.001+09:002012-09-19T00:20:04.432+09:00Eclipse4.2(JUNO)でScalaプラグインインストール時のエラーEclipse4.2からScalaトップページのプラグインを入れたら以下のようなエラーが出た。
<blockquote>
Cannot complete the install because one or more required items could not be found.
Software currently installed: Scala IDE for Eclipse 2.0.2.v-2_09-201207120929-81d0972 (org.scala-ide.sdt.feature.feature.group 2.0.2.v-2_09-201207120929-81d0972)
Missing requirement: Scala Plugin 2.0.2.v-2_09-201207120929-81d0972 (org.scala-ide.sdt.core 2.0.2.v-2_09-201207120929-81d0972) requires 'bundle org.eclipse.jdt.core [3.6.0,3.7.10)' but it could not be found
Cannot satisfy dependency:
From: Scala IDE for Eclipse 2.0.2.v-2_09-201207120929-81d0972 (org.scala-ide.sdt.feature.feature.group 2.0.2.v-2_09-201207120929-81d0972)
To: org.scala-ide.sdt.core [2.0.2.v-2_09-201207120929-81d0972]
</blockquote>
JUNO用のプラグインは別に用意されているようで、
<a href="http://scala-ide.org/download/nightly.html#scala_ide_helium_nightly_for_eclipse_42_juno">ここ</a>からJUNO用のプラグインをダウンロードできる。
rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-37014498189072954912012-09-18T00:51:00.000+09:002012-09-18T00:51:30.389+09:00Ubuntu/Linux Mintでsun jdkを入れる手順Ubuntu/MintではデフォルトではopenJDKが入っている。
sun JDKは手動でインストールしないといけない。
手順をメモ廊下と思ったけど、<a href="http://stuetzpunkt.wordpress.com/2011/12/25/installing-jdk-7-on-linux-mint-12-lisa-ubuntu-11-10-oneiric-64-bit/">このページ</a>が非常に参考になるため、割愛rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-19849711148490633302012-09-17T16:56:00.000+09:002012-09-17T16:56:49.032+09:00GithubのGistで投稿したコードの掲載テスト
<script src="https://gist.github.com/3736073.js?file=test gist code"></script>rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0tag:blogger.com,1999:blog-3752352812733915074.post-30366663741745275292012-09-14T23:16:00.004+09:002012-09-14T23:57:11.303+09:00blogger投稿テスト<br />
<br />
<br />
<pre class="brush: java;">
// ココにソースを記述
</pre>rsooohttp://www.blogger.com/profile/06500677129747639676noreply@blogger.com0