tag:blogger.com,1999:blog-54877268081648342702023-11-17T03:27:31.456+09:00NowDevelopingHirohttp://www.blogger.com/profile/09213111224176477652noreply@blogger.comBlogger119125tag:blogger.com,1999:blog-5487726808164834270.post-7862237336275058272017-04-27T12:41:00.000+09:002017-04-27T12:45:37.735+09:00ブログを引っ越しました。ブログですが、下記に引っ越ししました。<br />
RE:ENGINES <a href="https://re-engines.com/" target="_blank">https://re-engines.com/</a><br />
<br />
徐々にこちらのブログ記事の一部は引っ越しをすると思います。<br />
また、新しい記事の掲載や活動内容なども掲載をしておりますので、<br />
新しいブログサイトの<a href="https://re-engines.com/" target="_blank">RE:ENGINES</a>をよろしくお願いします。Hirohttp://www.blogger.com/profile/09213111224176477652noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-88279111975524027732017-02-10T18:11:00.000+09:002017-02-10T18:11:40.076+09:00Swift3でSCLAlertViewを使ってみたこんにちは、onukiです。<br />
<br />
今回はSwiftでフラットなデザインの<br />
アニメーション付きアラートビューが扱える<br />
SCLAlertViewを試してみたいと思います。<br />
<br />
<h3>
準備</h3>
<div>
おなじみCocoaPodでインストールします。</div>
<pre><code class="swift">pod 'SCLAlertView'
</code></pre>
<div>
<br /></div>
<h3>
実装</h3>
<div>
今回はボタン付きのアラートを表示したいと思います。</div>
<div>
まずはSCLAlertViewをインポートします。</div>
<pre><code class="swift">import SCLAlertView
</code></pre>
<div>
アラートビューを表示します、ボタンは二つ用意します。</div>
<pre><code class="swift">let alertView = SCLAlertView()
//ボタンの追加
alertView.addButton("ボタン1") {
//タップ時の処理
print("ボタン1をタップしました")
}
alertView.addButton("ボタン2") {
print("ボタン2をタップしました")
}
//表示実行
alertView.showSuccess("ボタン付きアラート", subTitle: "説明")
</code></pre>
<div>
そうするとこのように表示されます。</div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnsHYzjWqBbX3Bzy0-_qvUWbyMrrMwTbnuBOMA2AhxK8rbwYyjIi_MaVD92XcZwSD182l3-IFLrHIPfDxLF22v9PGcxLzpz7WRfchM4UzMx0HfrwPAlf67WSqd1xxoVb26_XTF8uMueCrJ/s1600/Simulator+Screen+Shot+2017.02.10+18.00.40.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnsHYzjWqBbX3Bzy0-_qvUWbyMrrMwTbnuBOMA2AhxK8rbwYyjIi_MaVD92XcZwSD182l3-IFLrHIPfDxLF22v9PGcxLzpz7WRfchM4UzMx0HfrwPAlf67WSqd1xxoVb26_XTF8uMueCrJ/s320/Simulator+Screen+Shot+2017.02.10+18.00.40.png" width="179" /></a></div>
<br /></div>
<div>
今回は基本的なボタン付きのアラートでしたが、</div>
<div>
他にもテキスト入力できるもの、ボタンなしで時間指定で閉じるもの等</div>
<div>
色々あるので、興味を持たれた方は作者のgithubを拝見してみてください。</div>
<div>
<a href="https://github.com/vikmeup/SCLAlertView-Swift">https://github.com/vikmeup/SCLAlertView-Swift</a></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/01328608252523142922noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-55515990068731095562017-02-09T21:35:00.000+09:002017-02-09T21:35:14.747+09:00はじめの一歩 -Rails ActiveRecord編- UPDATE2<br />
どうも、はじめです。<br />
前回はUPDATEについて書いてみました。<br />
<a href='https://nowdeveloping.blogspot.jp/2017/02/rails-activerecord-update.html'>はじめの一歩 -Rails ActiveRecord編- UPDATE</a><br />
今回はUPDATEの際readonlyやvalidationで更新ができなかった場合に関して書いていこうと思います。<br />
<br />
<br />
<h3>はじめに</h3>
<br />
今回も前回と同じテーブルを使用しようと思います。<br />
<b>usersテーブル</b><br />
<pre><code class='plaintext'>[id: 1, user_name: 'Aさん'],
[id: 2, user_name: 'Bさん'],
[Id: 3, user_name: 'Cさん']</code></pre>
<br />
<b>itemsテーブル</b><br />
<pre><code class='plaintext'>[id: 1, item_name: 'Rubyの本'],
[id: 2, item_name: 'Railsの本'],
[id: 3, item_name: 'PHPの本']</code></pre>
<br />
<b>user_itemsテーブル</b>(userが持っているitemを管理するテーブル)<br />
<pre><code class='plaintext'>[id: 1, user_id: 1, item_id: 1],
[id: 2, user_id: 1, item_id: 2],
[id: 3, user_id: 2, item_id: 3]</code></pre>
<br />
<b>関連性</b><br />
<pre><code class='plaintext'>user : user_item => 1 : n
item : user_item => 1 : n</code></pre>
<br />
<br />
ではまず【<b>readonly</b>】で更新できなかった場合の対処法を書いてみます。<br />
<br />
<h3>readonly</h3>
<br />
下のように更新をしてみます。<br />
<pre><code class='plaintext'>[id: 2, user_id: 1, item_id: 2]
↓
[id: 2, user_id: 1, item_id: 3]</code></pre>
手元でなかなかreadonlyになる状況を再現できなかったため<br />
以下の方法でreadonlyにしました。<br />
<pre><code class='ruby'>user_item = UserItem.readonly(true)</code></pre>
<br />
この状態で変更しようとしても更新できません。<br />
<pre><code class='ruby'>user_item.find(2).update(item_id: 3)
# ActiveRecord::ReadOnlyRecord: UserItem is marked as readonly</code></pre>
<br />
これだとreadonlyでrollbackされてしまいます。<br />
<br />
モデルからインスタンスを取得する際にreadonlyをfalseにしてあげれば更新が可能になります。<br />
<pre><code class='ruby'>user_item = UserItem.readonly(false)
user_item.find(2).update(item_id: 3)</code></pre>
<br />
<br />
次に【<b>validation</b>】でエラーになった場合です。<br />
<br />
<h3>validation</h3>
<br />
ユーザーの登録の際、user_nameを入力必須にしていたとします。<br />
入力必須のバリデーションを定義するにはUserモデルに対し以下のように定義します。<br />
<br />
<pre><code class='ruby'># app/models/user.rb
class User < ApplicationRecord
validates :user_name, presence: true
end</code></pre>
<br />
この状態でユーザー名を空で登録しようとするとエラーになります。<br />
<pre><code class='ruby'>user = User.new
user.save</code></pre>
<br />
次のように記述することで一時的にバリデーションを無効にすることができます。<br />
<pre><code class='ruby'>user = User.new
user.save(:validate => false)</code></pre>
<br />
<br />
<h3>最後に</h3>
<br />
validationを一時的に無効にすることは可能ですが、<br />
今回例としてあげたのケースの場合、<br />
DBでuser_nameにnot null制約がかかっているとバリデーションを無視することができても、<br />
DBへの登録時にエラーになってしまいますので気をつけましょう。<br />
<br />
次回はupdate_attributeとupdate_attributesを使ってみようと思います。<br />
<br />はじめhttp://www.blogger.com/profile/07858167086370707583noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-46576564120744204092017-02-08T21:53:00.000+09:002017-02-08T21:53:16.767+09:00アニメーション<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9gBHI0rJtM64B8A2hQKtULglh5s5Ni0CHS-V18AsPcUGXOHSaf7tF5HUt4Ktv489PXov1LgmuCtUGQHvmGsGBmGjNCQGlanhdTTgXYgFga5l4uGWOYWX2CvTJfZaMBHBzijm3p7b3y3w/s1600/hardware.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="119" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9gBHI0rJtM64B8A2hQKtULglh5s5Ni0CHS-V18AsPcUGXOHSaf7tF5HUt4Ktv489PXov1LgmuCtUGQHvmGsGBmGjNCQGlanhdTTgXYgFga5l4uGWOYWX2CvTJfZaMBHBzijm3p7b3y3w/s320/hardware.png" width="320" /></a><br />
<br />
<br />
<br />
<br />
<br />
<br />
どうもーデザイナーのnottyです。<br />
<br />
先日AirbnbDesignからAfter Effectsで作成したアニメーションをレンダリングして<br />
iOS・Android・React Native向けのアニメーションに変換してくれる、『<a href="http://airbnb.design/lottie/" target="_blank">Lottie</a>』が公開されました!<br />
<br />
<blockquote class="tr_bq">
<span style="background-color: white; color: #44484a; font-family: Georgia, serif; letter-spacing: 0.2px;"><span style="font-size: xx-small;">In the past, building complex animations for Android, iOS, and React Native apps was a difficult and lengthy process. You either had to add bulky image files for each screen size or write a thousand lines of brittle, hard-to-maintain code. Because of this, most apps weren’t using animation — despite it being a powerful tool for communicating ideas and creating compelling user experiences. One year ago, we set out to change that.</span></span></blockquote>
複雑なアニメーションを作るためには、保守が大変で大量のコードを書かないといけない必要だったが、Lottieによって、それは変わりました。的なことが書かれています。<br />
<br />
<a href="http://airbnb.design/introducing-lottie/" target="_blank">『Lottie introducing』</a><br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwNgbK0FKxR43Lw0mt7MeKhUCZqIDbMAQW6McRjP-75yZ17ejPN-UYtiVEMPa9h2tz6T9Zpl0sfOB12WRCkX7oQZ50FqoUTbaF_iR5dKsOwH184IcMMVP8nde4zIqA0z4CE-PD3N00xnM/s1600/screens_2.gif" imageanchor="1"><img border="0" height="152" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwNgbK0FKxR43Lw0mt7MeKhUCZqIDbMAQW6McRjP-75yZ17ejPN-UYtiVEMPa9h2tz6T9Zpl0sfOB12WRCkX7oQZ50FqoUTbaF_iR5dKsOwH184IcMMVP8nde4zIqA0z4CE-PD3N00xnM/s320/screens_2.gif" width="320" /></a><br />
<br />
現在、私が使用しているアプリで<br />
お気に入りや、ローディング、いいねボタンなど<br />
いたるところにアニメーションが使用されています。<br />
<br />
ユーザーにとって、ストレスにもなりうるウォークスルーなどに<br />
見てて気持ちの良いアニメーションを作成すると非常に効果的かもしれません。<br />
<br />
このライブラリがでて非常に良かったのですが、<br />
それ以上に事業会社からこういった技術(デザイン)をシェアするという事に<br />
毎回興奮します。日本からもこういうプロダクト(技術)などもっといっぱいでると良いなと思う次第でございます。Anonymoushttp://www.blogger.com/profile/14895742661134202372noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-68721462342750686832017-02-07T23:17:00.000+09:002017-12-22T01:00:25.219+09:00関連するレコードを一緒に作成する方法移転しました。<br />
<a href="http://re-engines.com/2017/12/22/rails/">http://re-engines.com/2017/12/22/rails/</a>h_ono_222http://www.blogger.com/profile/04208274059082199769noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-21726961576375547762017-02-06T18:00:00.000+09:002017-02-06T18:00:05.823+09:00配牌からあがれる可能性を予測する!(その5 実際にテストしてみる)<style>
.default-margin {
margin-left: 20px;
margin-top: 20px;
}
blockquote {
background-color: #f5f5f5;
}
table {
width:100%;
margin:0 0 0 1px; padding:0;
border:0;
border-spacing:0;
border-collapse:collapse;
}
th {
font:bold 11px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
color:#4f6b72;
border:1px solid #c1dad7;
letter-spacing:2px;
text-transform:uppercase;
text-align:left;
padding:6px 6px 6px 12px;
background:#cae8ea url(/content/img/css/bg_header.jpg) no-repeat;
}
td {
border:1px solid #c1dad7;
background:#fff;
padding:6px 6px 6px 12px;
color:#4f6b72;
}
td.alt {
background:#F5FAFA;
color:#797268;
}
</style>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://images-na.ssl-images-amazon.com/images/I/91LOp7zilgL.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://images-na.ssl-images-amazon.com/images/I/91LOp7zilgL.jpg" width="226" /></a>
</div>
<div class="default-margin">
こんにちは、Taroです。<br />
前回の記事の記事の続きになります。<br />
<a href="https://nowdeveloping.blogspot.jp/2017/01/blog-post_30.html">配牌からあがれる可能性を予測する!(その4 勾配を求める際に詰まったこと)</a><br />
今回は実際にテストしてみたいと思います。
</div>
<br />
<h2>テストに使用した配牌について</h2>
<hr>
<div class="default-margin">
Youtubeであがっていた○凰のプレイ動画を1半荘分試しました。
</div>
<br />
<h2>結果</h2>
<hr>
<pre><code class="python"># 第一要素があがれる方、第二要素があがれない方
# 重み
[[-0.09800755 0.09915648] # 順子
[ 0.15426824 -0.17342399] # 対子
[-0.61190551 0.61323983]] # 暗刻
# バイアス
[-0.84420447 0.84420447]</code></pre>
<div class="default-margin">
この結果だけ見ると、対子の数があがれる方に寄与しているように見えます。<br />
逆に暗刻があるとあがりにくいようです笑<br />
ちょっとリャンメンやカンチャンの形も要素に入れた方が良かったかな、と後悔し始めておりますが、とりあえずこのまま進めたいと思います。<br />
<br />
結果を記載しますが、配牌を記載するとおさまりきらないので、「あがれた」か「あがれなかった」を記載します。
</div>
<table>
<tr>
<th>局</th>
<th>結果</th>
<th>あがれる確率</th>
<th>あがれない確率</th>
</tr>
<tr>
<td>東1局</td>
<td>あがれない</td>
<td>17%</td>
<td>83%</td>
</tr>
<tr>
<td class="alt">東2局</td>
<td class="alt">あがれない</td>
<td class="alt">29%</td>
<td class="alt">71%</td>
</tr>
<tr>
<td>東3局</td>
<td>あがれない</td>
<td>7%</td>
<td>93%</td>
</tr>
<tr>
<td class="alt">東3局1本場</td>
<td class="alt">あがれない</td>
<td class="alt">17%</td>
<td class="alt">83%</td>
</tr>
<tr>
<td>東4局</td>
<td>あがれない</td>
<td>33%</td>
<td>67%</td>
</tr>
<tr>
<td class="alt">南1局</td>
<td class="alt">あがれる</td>
<td class="alt">20%</td>
<td class="alt">80%</td>
</tr>
<tr>
<td>南1局1本場</td>
<td>あがれない</td>
<td>26%</td>
<td>74%</td>
</tr>
<tr>
<td class="alt">南2局</td>
<td class="alt">あがれない</td>
<td class="alt">17%</td>
<td class="alt">83%</td>
</tr>
<tr>
<td>南3局</td>
<td>あがれる</td>
<td>26%</td>
<td>74%</td>
</tr>
<tr>
<td class="alt">南4局</td>
<td class="alt">あがれる</td>
<td class="alt">23%</td>
<td class="alt">77%</td>
</tr>
</table>
<br />
<div class="default-margin">
パッと見、ちゃんと予測できているようには見えないです。<br />
よく考えたら、麻雀は4人のうち1人があがれるゲームなので、単純計算でアガれる確率は25%です。<br />
教師データが足りないのかもしれないと思い、とりあえずプロの対局1局分追加してみました。
</div>
<br />
<h2>結果②</h2>
<hr>
<pre><code class="python"># 第一要素があがれる方、第二要素があがれない方
# 重み
[[ 0.17258578 -0.17396835] # 順子
[ 0.20088727 -0.20564398] # 対子
[-0.33262621 0.34681625]] # 暗刻
# バイアス
[-1.07893278 1.07893278]</code></pre>
<div class="default-margin">
先ほどとは重みが変わり、順子もアガれる確率に寄与するようになりました。<br />
それではこちらのパラメータをもとに同じテストデータで実験してみます。<br />
比較しやすいよう先ほど求めた結果を①とし、アガれない確率のみ記載します。
</div>
<table>
<tr>
<th>局</th>
<th>結果</th>
<th>結果①のアガれない確率</th>
<th>結果②のアガれない確率</th>
</tr>
<tr>
<td>東1局</td>
<td>あがれない</td>
<td>83%</td>
<td>73%</td>
</tr>
<tr>
<td class="alt">東2局</td>
<td class="alt">あがれない</td>
<td class="alt">71%</td>
<td class="alt">64%</td>
</tr>
<tr>
<td>東3局</td>
<td>あがれない</td>
<td>93%</td>
<td>92%</td>
</tr>
<tr>
<td class="alt">東3局1本場</td>
<td class="alt">あがれない</td>
<td class="alt">83%</td>
<td class="alt">80%</td>
</tr>
<tr>
<td>東4局</td>
<td>あがれない</td>
<td>67%</td>
<td>72%</td>
</tr>
<tr>
<td class="alt">南1局</td>
<td class="alt">あがれる</td>
<td class="alt">80%</td>
<td class="alt">85%</td>
</tr>
<tr>
<td>南1局1本場</td>
<td>あがれない</td>
<td>74%</td>
<td>79%</td>
</tr>
<tr>
<td class="alt">南2局</td>
<td class="alt">あがれない</td>
<td class="alt">83%</td>
<td class="alt">80%</td>
</tr>
<tr>
<td>南3局</td>
<td>あがれる</td>
<td>74%</td>
<td>79%</td>
</tr>
<tr>
<td class="alt">南4局</td>
<td class="alt">あがれる</td>
<td class="alt">77%</td>
<td class="alt">73%</td>
</tr>
</table>
<br />
<div class="default-margin">
結果の方も変化しました。<br />
10局のうち、6局の「アガれない確率」が下がっています。<br />
つまり「アガれる確率」が上昇しています。<br />
このことから、結果①の時点では、「アガれる」可能性を過少評価していることが考えられます。
</div>
<br />
<h2>おわりに</h2>
<hr>
<div class="default-margin">
今後の目標としては、<br />
<ul>
<li>教師データを増やす</li>
<li>レイヤーのノードを追加(リャンメン、カンチャン、ペンチャン)の数</li>
</ul>
<br />
とりあえず、まずは教師データを作成するのが楽になるインターフェースを実装したいと思います。<br />
参考のソースコードはこちらになります。<br />
<a href="https://github.com/naoki85/python_mahjong">https://github.com/naoki85/python_mahjong</a>
</div>Anonymoushttp://www.blogger.com/profile/07466674320324702503noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-52848795669447764712017-02-04T18:17:00.000+09:002017-02-04T18:17:33.733+09:00Swift3でLTMorphingLabelを使ってみたこんにちは、onukiです。<br />
<br />
今回はLTMorphingLabelというライブラリが<br />
面白そうなので使ってみました。<br />
<br />
<h3>
LTMorphingLabelとは</h3>
<br />
<div>
ラベルのテキスト変更時にエフェクトをつけてくれるライブラリです。</div>
<div>
<a href="https://github.com/lexrus/LTMorphingLabel">https://github.com/lexrus/LTMorphingLabel</a></div>
<div>
作者のgithubにエフェクトのサンプルがあるのですが、</div>
<div>
見ているだけで試してみたい欲に駆られますね。</div>
<div>
<br /></div>
<h3>
準備</h3>
<br />
<div>
今回はCocoaPodsで追加します。</div>
<div>
ただし、現在Swift3ではブランチの指定をしないと</div>
<div>
ビルドが通らないみたいなので気をつけて下さい。</div>
<pre><code class="swift">pod 'LTMorphingLabel', :git => 'https://github.com/lexrus/LTMorphingLabel.git', :branch => 'swift3'
</code></pre>
<div>
<br /></div>
<h3>
実装</h3>
<br />
<div>
まずはLTMorphingLabelをimportします。</div>
<pre><code class="swift">import LTMorphingLabel
</code></pre>
<div>
<br />
<div>
StoryboardにUILabelを適当に用意し</div>
<div>
ClassにLTMorphingLabelを指定してください。</div>
<div>
それをIBOutlet接続します。<br />
<pre><code class="swift">@IBOutlet weak var morphingLabel: LTMorphingLabel!
</code></pre>
<br />
エフェクトの定義を行います。<br />
<pre><code class="swift">morphingLabel.morphingEffect = .evaporate
</code></pre>
エフェクトの種類、サンプルに関しては作者のgithubを参照してください。<br />
<br />
これでmorphingLabelのtextを変更すると<br />
エフェクトがかかるようになります。<br />
<br />
これだけだとイマイチエフェクトの切り替わりを実感できないのでTimerで<br />
morphingLabelのtextを更新するようにしてみたいと思います。<br />
<pre><code class="swift"> @IBOutlet weak var morphingLabel: LTMorphingLabel!
//表示制御用タイマー
private var timer: Timer?
//String配列のindex用
private var index: Int = 0
//表示するString配列
private let textList = ["シンプルであることは、", "複雑であることよりも", "難しい"]
override func viewDidLoad() {
super.viewDidLoad()
// エフェクトの定義
morphingLabel.morphingEffect = .evaporate
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
//タイマーの追加
timer = Timer.scheduledTimer(timeInterval: 3.0,
target: self,
selector: #selector(update(timer:)), userInfo: nil,
repeats: true)
timer?.fire()
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
timer?.invalidate()
}
func update(timer: Timer) {
//ここでtextの更新
morphingLabel.text = textList[index]
index += 1
if index >= textList.count {
index = 0
}
}
</code></pre>
これでLTMorphingLabelのエフェクトを堪能できると思います。<br />
<br />
実装も簡単ですし、見た目も素晴らしいので色々使ってみたいですね。</div>
</div>
Anonymoushttp://www.blogger.com/profile/01328608252523142922noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-36971675951784673532017-02-03T22:37:00.000+09:002017-02-03T22:37:31.824+09:00Swift3でTTTAttributedLabelリンク表示の指定をやってみたこんにちは、onukiです。<br />
<br />
以前、TTTAttributedLabelでのリンク表示を紹介しましたが<br />
今回は応用でLabelにリンクを表示したくない時などに使える<br />
リンク表示の指定をやって見たいと思います。<br />
<br />
<h3>
準備</h3>
<div>
前回の記事を参照してください。</div>
<div>
<a href="https://nowdeveloping.blogspot.jp/2017/01/swift3tttattributedlabel.html" target="_blank">Swift3でTTTAttributedLabelの文字列からリンク表示をやってみた</a></div>
<div>
<br /></div>
<h3>
実装</h3>
<div>
今回は表示の文字列から「URL」の部分をタップできるようにします。</div>
<div>
<pre><code class="swift">//リンクをタップできるように設定
linkLabel.enabledTextCheckingTypes = NSTextCheckingResult.CheckingType.link.rawValue
//リンクのタップを制御するために設定
linkLabel.delegate = self
let label = "URLをタップできます。"
linkLabel.text = label
//labelから“URL”を部分を選択
let range = NSRange.init(location: 0, length: 3)
//タップした時の接続先
let url = URL(string: "https://www.google.co.jp/")
//TTTAttributedLabelにリンクを指定
linkLabel.addLink(to: url, with: range)
</code></pre>
<br />
実行するとこのような表示になります。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyoEd7xHhwrFjKMUPn5fJJRMI3KX3dCkhpmYuV3kEDDBgnSLdBA819fR98XCtYltrq1L0-obV-XYMbMctNODd3H7p2luWDpKhqgfN8EXkv6Ucb6OB6t1flyL1J73N3XTGYkxFBNKtzGh8j/s1600/Simulator+Screen+Shot+2017.02.03+22.05.08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyoEd7xHhwrFjKMUPn5fJJRMI3KX3dCkhpmYuV3kEDDBgnSLdBA819fR98XCtYltrq1L0-obV-XYMbMctNODd3H7p2luWDpKhqgfN8EXkv6Ucb6OB6t1flyL1J73N3XTGYkxFBNKtzGh8j/s320/Simulator+Screen+Shot+2017.02.03+22.05.08.png" width="179" /></a></div>
<br />
<br />
「URL」をタップすると以下のメソッドが呼ばれます。<br />
<pre><code class="swift">func attributedLabel(_ label: TTTAttributedLabel!, didSelectLinkWith url: URL!) {
print(url)//url => https://www.google.co.jp/
}
</code></pre>
<br />
遷移するURLを画面に表示しないので色々使えると思います。</div>
Anonymoushttp://www.blogger.com/profile/01328608252523142922noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-60422119898085325922017-02-02T20:24:00.000+09:002017-02-02T20:24:29.189+09:00はじめの一歩 -Rails ActiveRecord編- UPDATE<br />
どうも、はじめです。<br />
前回はJOINについて書いてみました。<br />
<a href='https://nowdeveloping.blogspot.jp/2017/01/rails-activerecord-select_26.html'>はじめの一歩 -Rails ActiveRecord編- SELECT4</a><br />
今回はUPDATEに関して書いていこうと思います。<br />
<br />
<br />
<h3>はじめに</h3>
<br />
今回も前回と同じテーブルを使用しようと思います。<br />
<b>usersテーブル</b><br />
<pre><code class='plaintext'>[id: 1, user_name: 'Aさん'],
[id: 2, user_name: 'Bさん'],
[Id: 3, user_name: 'Cさん']</code></pre>
<br />
<b>itemsテーブル</b><br />
<pre><code class='plaintext'>[id: 1, item_name: 'Rubyの本'],
[id: 2, item_name: 'Railsの本'],
[id: 3, item_name: 'PHPの本']</code></pre>
<br />
<b>user_itemsテーブル</b>(userが持っているitemを管理するテーブル)<br />
<pre><code class='plaintext'>[id: 1, user_id: 1, item_id: 1],
[id: 2, user_id: 1, item_id: 2],
[id: 3, user_id: 2, item_id: 3]</code></pre>
<br />
<b>関連性</b><br />
<pre><code class='plaintext'>user : user_item => 1 : n
item : user_item => 1 : n</code></pre>
<br />
<br />
UPDATEを行うには主に以下の二つの方法があります。<br />
<pre><code class='plaintext'>・saveメソッドを使用する。
・updateメソッドを使用する。</code></pre>
<br />
でははじめに【saveメソッド】を使用した方法から書いていきます。<br />
<br />
<br />
<h3>save</h3>
<br />
user_itemsを以下のように変更したいと思います。<br />
<pre><code class='plaintext'>[id: 3, user_id: 2, item_id: 3]
↓
[id: 3, user_id: 3, item_id: 3]</code></pre>
<br />
1.変更したいモデルインスタンスを取得<br />
<pre><code class='ruby'>user_item = UserItem.find(3)</code></pre>
<br />
2.変更したい値を代入<br />
<pre><code class='ruby'>user_item.user_id = 3</code></pre>
<br />
3.代入が完了したら登録<br />
<pre><code class='ruby'>user_item.save</code></pre>
<br />
以上の手順でupdateが完了します。<br />
2で複数のカラムを変更することも可能です。<br />
<br />
<br />
次に【updateメソッド】を使用した方法を書いてみます。
<br />
<br />
<h3>update</h3>
<br />
updateでも同様にuser_itemsを以下のように変更したいと思います。<br />
<pre><code class='plaintext'>[id: 3, user_id: 2, item_id: 3]
↓
[id: 3, user_id: 3, item_id: 3]</code></pre>
<br />
updateメソッドを使用する際も2つの方法があります。<br />
一つはsaveメソッドと同じように変更したいモデルインスタンスを取得し、<br />
updateという流れになります。<br />
<br />
<pre><code class='ruby'>user_item = UserItem.find(3)
user_item.update(user_id: 3)</code></pre>
<br />
もう一つは一度変数にインスタンスを取得するという工程を飛ばす方法です。<br />
<br />
<pre><code class='ruby'>UserItem.find(3).update(user_id: 3)</code></pre>
<br />
どれも結果は同じになります。<br />
<br />
<br />
<h3>まとめ</h3>
<br />
updateをする際変更したいレコードがreadonlyになっていた場合や、<br />
validation等の関係で更新が失敗する場合があります。<br />
その場合の対処法等を次回書いてみようと思います。<br />
<br />
はじめhttp://www.blogger.com/profile/07858167086370707583noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-85045221351454142282017-02-01T18:00:00.000+09:002017-02-01T18:00:22.960+09:00作業用BGMについて<span style="color: #666666;">デザイナーの nottyです。今日は普段、作業する際に聞く音楽を紹介したいと思います。</span><br />
<span style="color: #666666;">音楽を聴くと捗る場合や、逆に捗らない時もあります。<br />どんな時に聴いているかも記載するので、参考になればと思います。<br /></span><br />
<h3>
<span style="color: #444444;">ルーチンワーク系</span></h3>
<span style="color: #666666;">主にMIXをかけています。同じトーン,テンポが続く曲は繰り返し行う作業系に向いてると思います。またMIXなので変化があり、飽きずに聴くことができます。<br />こういう音楽は特に集中すると聴こえなくなります。</span><br />
<br />
<span style="background-color: white; font-family: "roboto" , "arial" , sans-serif;"><b><span style="color: #444444;">【日本語ラップ MIX】DJ KRO </span></b></span><br />
<span style="background-color: white; font-family: "roboto" , "arial" , sans-serif;"><b><span style="color: #444444;"><a href="https://www.youtube.com/watch?v=JdAYE6bnbhM" target="_blank">TOKYO AFTERNOON JAPANESE HIPHOP MIX</a></span></b></span><br />
<br />
<span style="background-color: white; font-family: "roboto" , "arial" , sans-serif;"><b><span style="color: #444444;"><a href="https://www.youtube.com/watch?v=WrO9PTpuSSs" target="_blank">Nujabes - Modal Soul</a></span></b></span><br />
<br />
<h3>
<span style="color: #444444;">クリエイティブ系</span></h3>
<span style="color: #666666;">製作する内容にあわせて音楽を変えています。クラブイベントのフライヤーを作成するときは、<br />出演するDJが流す曲、主にイベントで流れる曲を聴いて作成します。<br /><a href="https://soundcloud.com/" target="_blank">サウンドクラウド</a>でDJを検索するとMIXが上がっていたりします。</span><br />
<span style="color: #666666;"><br /><br />他にもゲームのデザインをした時は<a href="https://www.youtube.com/embed/VM-wrdSJxx0" target="_blank">名作ゲームの音楽</a>を聴いてました。</span><br />
<span style="color: #666666;"><span style="color: #444444;"><br /></span></span>
<span style="color: #666666;"><span style="color: #444444;"><br /></span></span>
<span style="color: #666666;"><span style="color: #444444;">ブレスト/資料作成系</span></span><br />
<span style="color: #666666;">気分をあげたり、リラックスしたり感情の浮き沈みがあるタスクの時は</span><br />
<a href="https://www.spotify.com/jp/]" target="_blank"><span style="color: #666666;">Spotify</span></a><br />
<span style="color: #666666;">・気分によってプレイリストを選択</span><br />
<span style="color: #666666;"><br /></span>
<span style="color: #666666;"><a href="https://music.amazon.co.jp/" target="_blank">Prime music</a><br />・プライムラジオで垂れ流し<br />と使い分けています。<br /><br />他にも<br />ジ・居酒屋サウンド<br /><a href="http://413tmks.s3.amazonaws.com/izakayasound/index.html">http://413tmks.s3.amazonaws.com/izakayasound/index.html</a></span><br />
<span style="color: #666666;"><br />おと風景<br /><a href="http://otofukei.com/">http://otofukei.com/</a><br />などの環境音を作業用BGMにします。</span><br />
<span style="color: #666666;">気分に合わせて、捗る音楽をチョイスできるのもスキルだと思うので、<br />普段聴かない音楽を聴いてタスクへ向かうのも良いのではないでしょうか。</span><br />
<span style="color: #999999; font-size: x-small;"><strike>個人的にはEDMをガンガンにかけて体を揺らしながらデザインがしたいものです。</strike></span><br />
<div style="font-family: HiraKakuProN-W3; font-size: 12px; line-height: 16px;">
<br /></div>
Anonymoushttp://www.blogger.com/profile/14895742661134202372noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-36334751208040352622017-01-31T20:00:00.000+09:002017-01-31T20:00:15.232+09:00Gemのバージョンをプロジェクトごとに分ける方法こんにちは。h_ono_222です。<br />
<br />
複数のアプリケーションを同時に開発している場合、同じGemでもそれぞれのアプリケーションごとにバージョンを分けたい場合があると思います。<br />
今回はその方法を紹介します。
<br />
<h3>
<br /></h3>
<h3>
1. 空のプロジェクトを作成する</h3>
<pre><code>$ mkdir test_app && cd test_app
$ bundle init
Writing new Gemfile to /Users/user_name/test_app/Gemfile</code></pre>
<h3>
<br /></h3>
<h3>
2. Gemfileを修正する</h3>
# gem "rails"のコメントアウトを外します。
<br />
<h3>
<br /></h3>
<h3>
3. インストール先を指定してbundle install</h3>
<pre><code>$ bundle install --path vendor/bundle
Fetching gem metadata from <a class="timelineLinkTrim" href="https://rubygems.org/" style="background: transparent; color: #0084b2; cursor: pointer; display: inline-block; margin: 0px; max-width: 80%; overflow: hidden; padding: 0px; text-decoration: none; text-overflow: ellipsis; vertical-align: bottom; white-space: nowrap; word-break: break-all;" target="_blank" title="https://rubygems.org/">https://rubygems.org/</a>
Fetching version metadata from <a class="timelineLinkTrim" href="https://rubygems.org/" style="background: transparent; color: #0084b2; cursor: pointer; display: inline-block; margin: 0px; max-width: 80%; overflow: hidden; padding: 0px; text-decoration: none; text-overflow: ellipsis; vertical-align: bottom; white-space: nowrap; word-break: break-all;" target="_blank" title="https://rubygems.org/">https://rubygems.org/</a>
Fetching dependency metadata from <a class="timelineLinkTrim" href="https://rubygems.org/" style="background: transparent; color: #0084b2; cursor: pointer; display: inline-block; margin: 0px; max-width: 80%; overflow: hidden; padding: 0px; text-decoration: none; text-overflow: ellipsis; vertical-align: bottom; white-space: nowrap; word-break: break-all;" target="_blank" title="https://rubygems.org/">https://rubygems.org/</a>
Resolving dependencies....
# 〜中略〜
Bundle complete! 1 Gemfile dependency, 38 gems now installed.
Bundled gems are installed into ./vendor/bundle.</code></pre>
<h3>
<br /></h3>
<h3>
4. アプリケーションを作成する</h3>
<pre><code>$ bundle exec rails new .
exist
create README.md
create Rakefile
create config.ru
create .gitignore
conflict Gemfile
Overwrite /Users/DevWork/Documents/test_app/Gemfile? (enter "h" for help) [Ynaqdh] Y # Yを入力してEnter
force Gemfile
# 〜中略〜
Bundle complete! 15 Gemfile dependencies, 62 gems now installed.
Bundled gems are installed into ./vendor/bundle.
run bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted</code></pre>
<br />
以上です。
h_ono_222http://www.blogger.com/profile/04208274059082199769noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-23042067577696981062017-01-30T18:00:00.000+09:002017-01-30T18:00:05.244+09:00配牌からあがれる可能性を予測する!(その4 勾配を求める際に詰まったこと)<style>
.default-margin {
margin-left: 20px;
margin-top: 20px;
}
blockquote {
background-color: #f5f5f5;
}
</style>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://images-na.ssl-images-amazon.com/images/I/91LOp7zilgL.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://images-na.ssl-images-amazon.com/images/I/91LOp7zilgL.jpg" width="226" /></a>
</div>
<div class="default-margin">
こんにちは、Taroです。<br />
前回の記事の記事の続きになります。<br />
<a href="https://nowdeveloping.blogspot.jp/2017/01/blog-post_23.html">配牌からあがれる可能性を予測する!(その3 学習の実装)</a><br />
本日は学習を実装する上で、すぐに理解できなかった勾配算出に関わる部分をまとめたいと思います。
</div>
<br />
<h2>前回の訂正</h2>
<hr>
<div class="default-margin">
損失値を算出して、グラフ化しておりましたが、1回ごとの平均値として算出しておりませんでした。<br />
そのため、実際にどれくらいの誤差が生じているか分かりづらかったため、平均値で図をプロットするよう修正しました。<br />
差分はこちらです。<br />
<a href="https://github.com/naoki85/python_mahjong/commit/1968607f8d535b19a44a3413e89eca74b664c36d#diff-44c51ddff56eff16ef4c9c8be9a259c5">https://github.com/naoki85/python_mahjong/commit</a><br />
</div>
<br />
<h2>勾配法について</h2>
<hr>
<div class="default-margin">
ある重み、バイアスパラメーターのときの、損失関数の勾配(傾き)を求め、<b>傾きが小さくなるようパラメーターを変化させる</b>手法とのことです。<br />
機械学習はこの最適パラメーターを求めるのが1つの命題となっています。<br />
ただ、パラメーターを決めると一口で言っても無限に近い数値の海から探さなければいけません。<br />
ここで本の中で使っていた例えは、思わずへ〜、と頷いてしまいました。<br />
文中ででてくる<b>SGD</b>は、<b>確率的勾配降下法</b>という手法の略です。
<blockquote>
<p>ここに風変わりな冒険家がいます。彼は広大な乾燥地帯を旅しながら、日々深い谷底を求めて旅を続けています。</p>
<p></p>
<p>~~中略~~</p>
<p></p>
<p>しかも、彼は、厳しい”制約”を2つ自分に課しています。ひとつは地図を見ないこと、もうひとつは目隠しをすることです。</p>
<p></p>
<p>~~中略~~</p>
<p></p>
<p>この困難な状況で重要となってくるのが、地面の「傾斜」です。</p>
<p></p>
<p>~~中略~~</p>
<p></p>
<p>そこで、今いる場所で一番傾斜がきつい方向に進もうというのが、SGDの戦略です。</p>
<p>「ゼロから作るDeep Learning」第6章より引用</p>
</blockquote>
</div>
<br />
<h2>勾配を算出する関数について</h2>
<hr>
<div class="default-margin">
さて、実際に勾配を算出する段になりまして、少し理解が追いつきませんでした。<br />
例えば、損失関数に対する微分は下記のようになります。(本の中の式)<br />
<pre><code class="python"># xはテストデータ、tは教師データです。
# lossは損失関数です。
def f(W):
return net.loss(x, t)</code></pre>
ここで関数fはxとtから求める損失関数、f(W)でWに関する関数になります。<br />
(Pythonではlambda式で一行で書けるようですが、あえてこちらで記載します。)<br />
fをWに関して微分して勾配を求めます。<br />
<br />
ここで、高校数学程度の知識しかない私はこう思いました。<br />
<b>あれ、fをWに関して微分しても、Wが要素になってないから0なんじゃないか</b>、と。<br />
とりあえずこの疑問は置いておいて、本を読み進めていくと、どう考えても勾配を0として計算しているようには見えませんでした。<br />
Wをどこかで関わらせているのかと思い、勾配を求める関数をちゃんと読んでみました。<br />
<pre><code class="python"># 実際に呼んでいるコード
# net.Wはネットワーククラスが持つ重みの値(クラスプロパティ)
dW = numerical_gradient(f, net.W)
def numerical_gradient(self, f, x):
h = 1e-4
grad = np.zeros_like(x)
it = np.nditer(x, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
idx = it.multi_index
tmp_val = x[idx]
# ここでプロパティの値を上書きしている!
x[idx] = float(tmp_val) + h
fxh1 = f(x)
x[idx] = tmp_val - h
fxh2 = f(x)
grad[idx] = (fxh1 - fxh2) / (2*h)
# ここで元に戻している!
x[idx] = tmp_val
it.iternext()
return grad</code></pre>
つまり、重みパラメーターをクラスに持たせることで、微分式内で値を暫定的に書き換えて処理をさせています。<br />
恥ずかしながら、ここで引っかかり、いまいち以降の処理を理解できておりませんでした。<br />
もし、こちらの本で勉強していて、同じような場所で詰まっているという方がいらっしゃれば、参考にしていただければ、と思います。
</div>
Anonymoushttp://www.blogger.com/profile/07466674320324702503noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-30134987590540399252017-01-28T18:00:00.000+09:002017-01-28T18:00:04.727+09:00iOS SwiftでS3への画像アップロード こんにちは、Hiroです。今回はSwiftでAWSのS3へ画像をアップロードする方法について、ブログを書きたいと思います。<br />
AWS Cognitoでの認証が本来は望ましいのですが、今回は簡単にIAMユーザを作成し、ACCESS KEYとSECRET ACCESS KEYを利用した方法で紹介したいと思います。アプリをリリースする場合は、AWS Cognitoを利用するか、IAMユーザの場合は、アクセス権限を十分に絞ってください。<br />
<br />
<br />
<h3>
AWS上での事前準備</h3>
<br />
AWS上での準備については、省略しますが下記の2つを準備してください。IAMユーザについては、作成したS3のバケットへアップロード(PutObject)できる権限を付与しておく必要があります。
<ul>
<li>S3にバケットを作成</li>
<li>IAMユーザの作成(上記のバケットへの「s3:PutObject」権限あり)</li>
</ul>
<br />
<h3>
CocoaPodsでAWS SDKをインストールをする</h3>
<br />
Podfileに下記を記載して、インストールします。
<br />
<pre><code class="ruby"> use_frameworks!
pod 'AWSS3'
</code></pre>
<pre><code class="bash">$ pod install</code></pre>
<br />
<br />
<h3>
認証の設定をする</h3>
<br />
冒頭で記載したとおり、今回はIAMユーザでの認証を行います。accessKeyとsecretKeyにはAWSで作成したIAMユーザのものを設定してください。<br/>
下記の処理は、S3で画像などをアップロードする前に1度だけ実行するようにします。
<br />
<pre><code class="swift">import AWSCore
...
...
func configureService() {
let credentialsProvider = AWSStaticCredentialsProvider(accessKey: "your access key", secretKey: "your secret key")
let serviceConfiguration = AWSServiceConfiguration(region: AWSRegionType.apNortheast1, credentialsProvider: credentialsProvider)
AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration
}
</code></pre>
<br />
<br />
<h3>UIImageを保存して、URLを取得する</h3>
<br />
S3へ投稿するファイルは、一時的に端末内に保存して、そのURLをS3のSDKに指定する必要があります。<br/>
下記のメソッドで、S3へのアップロードする画像が保存されているURLを取得できます。
<br />
<pre><code class="swift"> private func generateImageUrl(_ uploadImage: UIImage) -> URL {
let imageURL = URL(fileURLWithPath: NSTemporaryDirectory().appendingFormat("upload.jpg"))
if let jpegData = UIImageJPEGRepresentation(uploadImage, 80) {
try! jpegData.write(to: imageURL, options: [.atomicWrite])
}
return imageURL
}</code></pre>
<br />
<br />
<h3>S3へアップロードする</h3>
<br />
下記のメソッドでS3へアップロードができます。下記のメソッドを呼ぶ前には、上記で記載している認証の設定を事前に実行する必要があります。<br/>
また、「uploadRequest?.bucket」にはAWS上で作成したバケット名を指定し、「uploadRequest?.key」にはS3上に保存したいファイル名を指定します。
なお、ファイル名は「test/hello.jpg」とするとAWSコンソールなどから見た際にtestフォルダ内にhello.jpgファイルが保存されているように見えるので、ファイルをまとめて管理したい場合には、「test/」などのプレフィックスをつけるとよいでしょう。
<pre><code class="swift">import AWSS3
...
...
public func uploadImage(_ uploadImage: UIImage) {
let transferManager = AWSS3TransferManager.default()
let uploadRequest = AWSS3TransferManagerUploadRequest()
uploadRequest?.bucket = "your S3 bucket name"
uploadRequest?.key = "your file name on S3"
uploadRequest?.body = generateImageUrl(uploadImage)
transferManager?.upload(uploadRequest).continue({ (task: AWSTask<AnyObject>) -> Any? in
if task.error != nil || task.exception != nil {
// エラー
}
return nil
})
}</code></pre>
<br/>
<br/>
Hirohttp://www.blogger.com/profile/09213111224176477652noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-19093056724366071562017-01-27T22:09:00.000+09:002017-01-27T22:09:56.996+09:00Swift3でDateからその月の月末のDateを取得こんにちはonukiです。<br />
<br />
今回はSwift3でDateの月末が何日か取得したかったので<br />
備忘録がてら、私が行った方法を紹介したいと思います。<br />
<br />
<h3>
実装</h3>
<pre><code class="swift">var date = Date()
let calendar = NSCalendar(identifier: NSCalendar.Identifier.gregorian)!
// 年月日時分秒のNSComponents
var comp = calendar.components([.year, .month, .day, .hour, .minute, .second], from: date as Date)
// 月初の0時0分0秒に設定
comp.day = 1
comp.hour = 0
comp.minute = 0
comp.second = 0
// ここでcalendar.date(from: comp)!すれば月初のDateが取得できます
// その月が何日あるかを計算します
let range = calendar.range(of: .day, in: .month, for: date as Date)
let lastDay = range.length
// ここで月末の日に変えます
comp.day = lastDay
// Dateを作成
let retDate = calendar.date(from: comp)!
</code></pre>
<br />
上記では現在日時からDateを作成し、その月の月末にしてるので<br />
例えば2017年1月に実行した場合下記のフォーマットで整形しprintすると「20170131」になります。<br />
<pre><code class="swift">let formatter = DateFormatter()
formatter.dateFormat = "yyyyMMdd"
let dateStr: String = formatter.string(from: retDate as Date)
print(dateStr)
</code></pre>
Anonymoushttp://www.blogger.com/profile/01328608252523142922noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-17198047961815624262017-01-26T21:22:00.000+09:002017-01-26T21:22:10.679+09:00はじめの一歩 -Rails ActiveRecord編- SELECT4<br />
どうも、はじめです。<br />
前回はJOINについて書いてみました。<br />
<a href='https://nowdeveloping.blogspot.jp/2017/01/rails-activerecord-select_19.html'>はじめの一歩 -Rails ActiveRecord編- SELECT3</a><br />
今回も引き続きJOINに関する内容ですが、JOINでも3つ以上のテーブルの結合について書いていこうと思います。<br />
<br />
<br />
<h3>はじめに</h3>
<br />
3つ以上のテーブルの結合なので、結合できるテーブルを3つ用意します。<br />
<br />
<b>usersテーブル</b><br />
<pre><code class='plaintext'>[id: 1, user_name: 'Aさん'],
[id: 2, user_name: 'Bさん'],
[Id: 3, user_name: 'Cさん']</code></pre>
<br />
<b>itemsテーブル</b><br />
<pre><code class='plaintext'>[id: 1, item_name: 'Rubyの本'],
[id: 2, item_name: 'Railsの本'],
[id: 3, item_name: 'PHPの本']</code></pre>
<br />
<b>user_itemsテーブル</b>(userが持っているitemを管理するテーブル)<br />
<pre><code class='plaintext'>[id: 1, user_id: 1, item_id: 1],
[id: 2, user_id: 1, item_id: 2],
[id: 3, user_id: 2, item_id: 3]</code></pre>
<br />
関連を説明すると以下のようになります。<br />
<pre><code class='plaintext'>user : user_item => 1 : n
item : user_item => 1 : n</code></pre>
<br />
それでは前回使用したincludesを使用して書いていこうと思います。<br />
<br />
<br />
<h3>取得</h3>
<br />
・Aさんが持っているアイテムを全て取得したい場合<br />
<pre><code class='ruby'>user_items = User.includes(user_items: :item).find(1)</code></pre>
<br />
上記のように記述することで以下のようなSQLが実行されます。<br />
<pre><code class='sql'>SELECT `users`.* FROM `users` WHERE `users`.`id` = 1;
SELECT `user_items`.* FROM `user_items` WHERE `user_items`.`id` in (1,2);
SELECT `items`.* FROM `items` WHERE `items`.`id` in (1,2);</code></pre>
<br />
joinsの場合も同様の書き方となります。<br />
<br />
<br />
<h3>表示</h3>
<br />
アイテム名を表示したい場合は以下のようにします。<br />
<pre><code class='ruby'>user_items.user_items.each do |user_item|
p user_item.item.item_name
end
# => 'Rubyの本'
# => 'Railsの本'</code></pre>
<br />
<br />
<h3>さらにテーブルが増えた場合</h3>
<br />
itemsにcategoryテーブルを関連付けして色々なパターンで取得をしてみたいと思います。<br />
以下のような関連性でitemsに対し、categoriesテーブルを作成します。<br />
<pre><code class='plaintext'>items : category => n : 1</code></pre>
<br />
<b>itemsテーブル</b><br />
<pre><code class='plaintext'>[id: 1, item_name: 'Rubyの本', category_id: 1],
[id: 2, item_name: 'Railsの本', category_id: 1],
[id: 3, item_name: 'PHPの本', category_id: 2]</code></pre>
<br />
<b>categoriesテーブル</b><br />
<pre><code class='plaintext'>[id: 1, category_name: 'Ruby'],
[id: 2, category_name: 'PHP']</code></pre>
<br />
<b>パターン1</b><br />
・Aさんが持っているアイテムのカテゴリーまで取得したい場合<br />
<pre><code class='ruby'>User.includes(user_items: {item: :category}).find(1)</code></pre>
<br />
<b>パターン2</b><br />
・"Rubyの本"のカテゴリーと持っているユーザーを取得したい場合<br />
<pre><code class='ruby'>Item.includes(:category, {user_items: :user}).find(1)</code></pre>
<br />
<br />
<h3>まとめ</h3>
<br />
以下のような関連性だった場合<br />
<pre><code class='plaintext'>a:b:c => 1:n:1
c:d =>n:1</code></pre>
<br />
隣接しているテーブルを複数結合したい場合はのように「,」でつなげることができます。<br />
<pre><code class='ruby'>B.includes(:a, :c)</code></pre>
二つ隣のテーブルの情報を取得する場合は「:」を向かい合わせに記述をします。<br />
<pre><code class='ruby'>A.includes(b: :c)</code></pre>
さらに深いテーブルの情報を取得する場合は{}を使用します<br />
<pre><code class='ruby'>A.includes(b: {c: :d})</code></pre>
<br />
前回も記述をしたように<br />
3つ以上のテーブルを結合する場合でもテーブル名は<br />
複数系、単数系を意識しなければいけませんので注意してください。<br />
<br />
以上でSELECT系(JOIN系)を終了し、<br />
次回からはUPDATEに入ろうと思います。<br />
<br />はじめhttp://www.blogger.com/profile/07858167086370707583noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-60108178163134487352017-01-25T18:00:00.000+09:002017-01-25T18:00:19.213+09:00360度カメラ買いました<span style="color: #444444;">どうもー。デザイナーのnottyです。<br />今年から、NowDevelopingに参加しました。どうぞお見知り置きを
〜<br />さて、話は変わりまして、</span><span style="color: #444444;">最近360度カメラを購入しました。</span><span style="color: #444444; font-size: xx-small;">※この記事は360度カメラの模索中のメモです</span><br />
<div>
<span style="color: #444444;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUiTpAC9c11hv5rKXSXyfXjDJnm4xjy7ULcwZxnsGeufkO-_QdPL9EsyUgc6FnVjHM482nwciTPe2UV8UDcczq6v4NCZIdVFd9RWlG_lgKxwWLDy5P-jfL6rsNNK6e5Wbjb4FlBLlzCFQ/s1600/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A-1.jpg" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUiTpAC9c11hv5rKXSXyfXjDJnm4xjy7ULcwZxnsGeufkO-_QdPL9EsyUgc6FnVjHM482nwciTPe2UV8UDcczq6v4NCZIdVFd9RWlG_lgKxwWLDy5P-jfL6rsNNK6e5Wbjb4FlBLlzCFQ/s320/%25E5%2590%258D%25E7%25A7%25B0%25E6%259C%25AA%25E8%25A8%25AD%25E5%25AE%259A-1.jpg" width="320" /></a></span></div>
<div>
<span style="color: #444444;"><a href="https://theta360.com/ja/" target="_blank">THETA SC </a>という機種です。</span></div>
<div>
<h4>
<span style="color: #444444;">購入した経緯<br /><span style="font-weight: normal;">正直、何も考えずに買いました。<br />だから使い道を探るため毎日持ち歩き、撮影しています。</span></span></h4>
</div>
<div>
<span style="color: #444444;">自分の顔やいろんな人の顔が映ってしまうので、公式からですが、<br /><a href="https://theta360.com/spheres/samples/f005f706-aa4c-11e6-80f7-064087ff3472-1" target="_blank">こんな感じの写真</a>が撮れます。</span></div>
<div>
<span style="color: #444444;"><br /></span></div>
<div>
<span style="color: #444444;">撮った後、写真を見るのが楽しくなるプロダクトです。</span></div>
<div>
<span style="color: #444444;">技術的に相性が良いのはVRに当たるのかな?</span></div>
<div>
<span style="color: #444444;"><br /></span></div>
<div>
<span style="color: #444444;">360度カメラのコンテンツはまだまだ面白いのが生まれると感じています。</span></div>
<div>
<span style="color: #444444;">・<a href="https://aframe.io/" target="_blank">A-FRAME</a></span></div>
<div>
<span style="color: #444444;">みたいなWebVRフレームワークが登場したり<span style="font-size: x-small;">(2015年で古いですが...)</span></span></div>
<div>
<span style="color: #444444;"><br />・<a href="https://www.tiltbrush.com/" target="_blank">TiltBrush</a></span></div>
<div>
VRの空間?に絵を描いたり<span style="font-size: xx-small;">(これ半端ないす)</span></div>
<div>
<span style="color: #444444;"><br /></span></div>
<div>
<span style="color: #444444;">2017年となった今では情報がたくさんあって、デバイスの性能も良くなったので、利用する人、モノ作りする人は、VRへの参入障壁が低くなったと思います。</span></div>
<div>
<span style="color: #444444;"><br /></span></div>
<div>
<h4>
<span style="color: #444444;">今年はVRコンテンツが増えるのか</span></h4>
</div>
<h4>
<span style="font-weight: normal;"><span style="color: #444444;">正直、まだまだVRが普及するとは思えませんが、360度カメラはWebでコンテンツを見るときに全体の雰囲気や様子を掴めるので使いどころによっては、効果があると思います。<span style="font-size: x-small;">(旅行先,不動産,水族館,フェス,山頂,クラブetx...)<br /><br />世の中にあったコンテンツを提供できるように、先回りして技術を知っておく事によって、タイミング良く出せると思います。</span></span></span><br />
<span style="color: #444444;"><br />今年は研究も兼ねて360×◯◯のようなコンテンツに挑戦します。</span></h4>
<h4>
<span style="color: #444444; font-size: xx-small;">_以上</span></h4>
<br />Anonymoushttp://www.blogger.com/profile/14895742661134202372noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-86457991894565956912017-01-24T22:40:00.004+09:002017-01-24T22:41:45.960+09:00macOS SierraにDocker for Macをインストールしてみるこんにちは、h_ono_222です。<br />
今回はmacOS SierraにDocker for Macをインストールしてみました。<br />
<br />
<h3>
要求スペック</h3>
・2010年以降に製造されたMac<br />
・OS X El Capitan 10.11以降のOS(10.10.3 Yosemiteは限定的にサポート)<br />
・4GB以上のRAM<br />
・version 4.3.30より前のVirtualBoxがインストールされていないこと<br />
<br />
<h3>
1. Docker for Macのインストール</h3>
<div>
下記のサイトにアクセスし、Get Docker for Mac[stable]をクリックしてDocker.dmgをダウンロードします。<br />
<a href="https://docs.docker.com/docker-for-mac/">https://docs.docker.com/docker-for-mac/</a><br />
<br />
Docker.dmgをダブルクリックし、表示されたFinderのDockerアイコンをApplicationsにドラッグ&ドロップします。<br />
<br />
<h3>
2. Dockerを起動する</h3>
Dockerをダブルクリックするとポップアップが表示されるのでOKを選択し、自分のMacにログインする際のパスワードを入力します。<br />
<br />
Dockerが起動し、メニューバーにDockerのアイコンが表示されます。<br />
<br />
Terminalを起動し、Docker commandを入力してみます。</div>
<pre><code>Users-MacBook-Pro:Desktop User$ docker version
Client:
Version: 1.13.0
API version: 1.25
Go version: go1.7.3
Git commit: 49bf474
Built: Wed Jan 18 16:20:26 2017
OS/Arch: darwin/amd64
Server:
Version: 1.13.0
API version: 1.25 (minimum version 1.12)
Go version: go1.7.3
Git commit: 49bf474
Built: Wed Jan 18 16:20:26 2017
OS/Arch: linux/amd64
Experimental: true
</code></pre>
<div>
<br />
<h3>
3. サーバを起動する</h3>
</div>
<pre><code>Users-MacBook-Pro:Desktop user$ docker run -d -p 80:80 --name webserver nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
5040bd298390: Pull complete
d7a91cdb22f0: Pull complete
9cac4850e5df: Pull complete
Digest: sha256:33ff28a2763feccc1e1071a97960b7fef714d6e17e2d0ff573b74825d0049303
Status: Downloaded newer image for nginx:latest
61a7880cc6d001376f222cb3214c457c3d625720a5111a72dba14415a0d2d40f</code></pre>
<div>
<br />
無事にnginxが起動しました。<br />
<br />
今回は以上です。</div>
h_ono_222http://www.blogger.com/profile/04208274059082199769noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-65320158243518114492017-01-23T18:00:00.000+09:002017-01-23T18:00:13.015+09:00配牌からあがれる可能性を予測する!(その3 学習の実装)<style>
.default-margin {
margin-left: 20px;
margin-top: 20px;
}
</style>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://images-na.ssl-images-amazon.com/images/I/91LOp7zilgL.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://images-na.ssl-images-amazon.com/images/I/91LOp7zilgL.jpg" width="226" /></a>
</div>
<div class="default-margin">
前回の記事はこちらです。<br />
<a href="https://nowdeveloping.blogspot.jp/2017/01/blog-post_21.html">配牌からあがれる可能性を予測する!(その2 教師データの作成)</a></div>
<br />
<h2>
前回の訂正</h2>
<hr />
<div class="default-margin">
CSVファイルからの読み込み時、String型になってしまうので、Int型にキャストしなければなりませんでした。<br />
差分はこちらになりますが、その中でリスト内包記述というfor文を1行で書くように修正しております。<br />
<pre><code class="python"># 修正前
tmp_hand = []
for tile in range(0, 12):
tmp_hand.append(row[tile])
# 修正後
tmp_hand = [int(tile) for tile in row]</code></pre>
</div>
<br />
<h2>
学習の実装開始</h2>
<hr />
<div class="default-margin">
今回より学習機能をつけていきたいと思います。<br />
基本的には、「ゼロから作るディープラーニング」の手順で論理を進めています。<br />
(誤差を求め、その誤差の微分値からパラメータを求める。)<br />
ソースコードはこちらになります。<br />
<a href="https://github.com/naoki85/python_mahjong">https://github.com/naoki85/python_mahjong</a>
</div>
<br />
<h2>
matplotlib について</h2>
<hr />
<div class="default-margin">
その前に、グラフを描画する便利ライブラリであるmatplotlibの準備をしておきます。<br />
まだそこまで複雑なグラフはいらないので、基本的な書き方で大丈夫そうです。<br />
今回はX軸はループの回数、Yは誤差(教師データとの誤差とします。)<br />
<pre><code class="python"># xの値を1ずつ定義
x = range(0, 100)
# ループごとに誤差を格納しておく
y = loss_array
plt.xlabel("x")
plt.ylabel("loss")
plt.plot(x, y)
plt.show()</code></pre>
ためしに作ってみた図はこちらです。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl9jhGiHl1QjCafkUIB1TETpeunfzgdPIiXbg-Af146PaiBVeprAeX0PGBRJxfVmIJiNbVI73mFd-b7SGbxQclZ7BAh1h4tHTARZ1XfUnqrPLjoQ6S9TtYscML3Ng-dCw_hq15fUMyKYJg/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2017-01-22+17.49.40.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgl9jhGiHl1QjCafkUIB1TETpeunfzgdPIiXbg-Af146PaiBVeprAeX0PGBRJxfVmIJiNbVI73mFd-b7SGbxQclZ7BAh1h4tHTARZ1XfUnqrPLjoQ6S9TtYscML3Ng-dCw_hq15fUMyKYJg/s320/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2017-01-22+17.49.40.png" width="320" /></a></div>
<br /></div>
<div class="default-margin">
ループ回数を重ねるごとに、誤差がちいさくなっていることが分かります。<br />
ただし、こちらの正当性はまだ確認できていないので、実際に次回は学習後の重み、バイアスを使用してテストしてみます。<br />
</div>
<br />
<h2>学習結果の保存について(pickleモジュール)</h2>
<hr />
<div class="default-margin">
学習結果はpickle形式で保存しました。<br />
pickleは「漬物」という意味で、オブジェクトをそのまま保存してくれます。(ピクルスのことか、と覚えました。)<br />
はじめはCSV形式にしようと思ったのですが、いちいち分解して保存するのも、取り出すときに再度辞書型にするのも面倒です。<br />
例えば、下記の結果を保存するとします。<br />
<pre><code class="python">{'W': [1, 2, 3], 'b': [4, 5]}</code></pre>
これを特に前処理なしで下記のように保存(漬物)にしてしまいます。(基本的なファイルの読み書きと同じ感じです。)<br />
<pre><code class="python">with open(pickle_filepath, 'wb') as f:
writer = pickle.dump(results, f)</code></pre>
取り出すときも下記のようにかけば、なんとびっくりそのまま取り出せます。<br />
<pre><code class="python">with open(pickle_filepath, 'rb') as f:
params = pickle.load(f)
{'W': [1, 2, 3], 'b': [4, 5]}</code></pre>
そのため、重み、バイアスの値は教師データとは異なりpickleで管理することとしました。
</div>
<br />
<h2>おわりに</h2>
<hr />
<div class="default-margin">
まだ私自身、微分して最適な重みを求める「勾配法」について、 腑に落ちていないところがあるので、<br />
そちらを理解して、実装を踏まえて書きたいと思います。
</div>
Anonymoushttp://www.blogger.com/profile/07466674320324702503noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-5174602538654064782017-01-21T18:00:00.000+09:002017-01-23T21:51:10.600+09:00配牌からあがれる可能性を予測する!(その2 教師データの作成)<style>
.default-margin {
margin-left: 20px;
margin-top: 20px;
}
</style>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://images-na.ssl-images-amazon.com/images/I/91LOp7zilgL.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://images-na.ssl-images-amazon.com/images/I/91LOp7zilgL.jpg" width="226" /></a>
</div>
<div class="default-margin">
こんにちは、Taroです。<br />
前回の記事の記事の続きになります。<br />
<a href="https://nowdeveloping.blogspot.jp/">配牌からあがれる可能性を予測する!(その1 推論処理)</a><br />
次回は学習を実装する、と記載しましたが、その前に教師データを取得する方法を実装したいと思います。<br />
今回はDeep LearningというよりはPythonの勉強といった感じです。
</div>
<br />
<h2>教師データの選定</h2>
<hr>
<div class="default-margin">
麻雀のようなギャンブルにおいて、教師になるデータは何なのか?<br />
考え出すとキリがなさそうなので、ひとまずプロの対局からデータを作成しました。<br />
プロであれば、(もちろん技術や個性、状況で異なってくるとは思いますが)あがりやすい配牌は必ず仕上げてくれるはずです。<br />
そのため、Youtubeでプロの対局を見続けました(ある種これが苦行かもしれません笑)。<br />
余談ですが、個人的に好きなプロ雀士は土田浩翔プロです。
</div>
<br />
<h2>CSVファイルの作成</h2>
<hr>
<div class="default-margin">
教師データはCSVファイルにまとめます。<br />
今回必要なデータは、 <strong>配牌</strong> と <strong>結果</strong> なので、下記のようにまとめました。<br />
</div>
<div class="default-margin">
<table border="1">
<thead>
<tr>
<th style="text-align: center;">tile_1</th>
<th style="text-align: center;">tile_2</th>
<th style="text-align: center;">tile_3</th>
<th style="text-align: center;">tile_4</th>
<th style="text-align: center;">tile_5</th>
<th style="text-align: center;">tile_6</th>
<th style="text-align: center;">tile_7</th>
<th style="text-align: center;">tile_8</th>
<th style="text-align: center;">tile_9</th>
<th style="text-align: center;">tile_10</th>
<th style="text-align: center;">tile_11</th>
<th style="text-align: center;">tile_12</th>
<th style="text-align: center;">tile_13</th>
<th style="text-align: center;">win</th>
<th style="text-align: center;">loss</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">11</td>
<td style="text-align: center;">13</td>
<td style="text-align: center;">17</td>
<td style="text-align: center;">21</td>
<td style="text-align: center;">25</td>
<td style="text-align: center;">27</td>
<td style="text-align: center;">29</td>
<td style="text-align: center;">31</td>
<td style="text-align: center;">31</td>
<td style="text-align: center;">31</td>
<td style="text-align: center;">35</td>
<td style="text-align: center;">43</td>
<td style="text-align: center;">47</td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">0</td>
</tr>
</tbody>
</table>
</div>
<div class="default-margin">
このデータを読み込んでいきたいと思います。
</div>
<br />
<h2>CSVファイルの読み込み</h2>
<hr>
<div class="default-margin">
Pythonの<code>csv</code>モジュールを利用して簡単に実装します。<br />
(というよりこれくらいしか分からない。。。)
</div>
<div class="default-margin">
<pre><code class="python"> def load_trainig_data(self):
u"""
CSVファイルから教師データを読み込み、データを返します。
@return array
[0]で教師データの配牌、[1]で結果を返します
"""
with open('csv/training_data.csv', 'r', newline='') as csvfile:
reader = csv.reader(csvfile)
header = next(reader)
hand = []
results = []
for row in reader:
tmp_hand = []
for tile in range(0, 12):
tmp_hand.append(row[tile])
results.append([row[13], row[14]])
hand.append(tmp_hand)
return hand, results
</code></pre>
</div>
<div class="default-margin">
このメソッドをMyHandクラスに追加しました。
</div>
<div class="default-margin">
<pre><code class="python">from my_hand import *
my_hand = MyHand()
input_data, results = my_hand.load_trainig_data()
</code></pre>
</div>
<div class="default-margin">
<pre><code class="python">print(input_data)</code></pre>
</div>
<div class="default-margin">
<pre>[['47', '26', '17', '21', '47', '12', '42', '43', '34', '15', '45', '37'], ['42', '42', '41', '17', '39', '21', '39', '15', '37', '11', '11', '21'], ['47', '35', '22', '22', '23', '26', '12', '13', '17', '18', '39', '38'], ['22', '24', '24', '25', '28', '31', '32', '33', '13', '13', '14', '16'], ['41', '47', '31', '12', '29', '18', '45', '34', '19', '22', '18', '39'], ['46', '15', '15', '16', '16', '47', '45', '11', '43', '32', '34', '27'], ['41', '41', '43', '44', '44', '17', '14', '13', '13', '23', '23', '33'], ['35', '38', '39', '39', '23', '25', '26', '27', '28', '16', '42', '42'], ['45', '47', '39', '44', '43', '21', '36', '27', '13', '32', '39', '16'], ['21', '28', '32', '35', '21', '23', '35', '12', '18', '37', '45', '14'], ['12', '14', '15', '17', '41', '44', '34', '35', '22', '23', '23', '26'], ['24', '24', '29', '31', '32', '36', '37', '38', '39', '13', '17', '47']]</pre>
</div>
<div class="default-margin">
<pre><code class="python">print(results)</code></pre>
</div>
<div class="default-margin">
<pre>[['0', '1'], ['1', '0'], ['0', '1'], ['0', '1'], ['0', '1'], ['0', '1'], ['1', '0'], ['0', '0'], ['1', '0'], ['0', '0'], ['0', '0'], ['0', '0']]</pre>
</div>
<div class="default-margin">
これだとちょっと分かりづらいので、1つ目の要素だけ抜き出します。
</div>
<div class="default-margin">
<pre><code class="python">print(input_data[0])</code></pre>
</div>
<div class="default-margin">
<pre>['47', '26', '17', '21', '47', '12', '42', '43', '34', '15', '45', '37']</pre>
</div>
<div class="default-margin">
<pre><code class="python">print(results)</code></pre>
</div>
<div class="default-margin">
<pre>['0', '1']</pre>
</div>
<div class="default-margin">
これで、教師データが読み込めました。<br />
(これで正しいのかは置いておきます笑)<br />
</div>
<br />
<h2>Jupyter Notebookで書いてみたよ!</h2>
<hr>
<div class="default-margin">
<b>Jupyter</b>という単語は見たことがあったのですが、ずっとライブラリの1つだと思っていました笑。<br />
実はエディタのようで、データサイエンティストの人などが、実際に実行したプログラムを確認しながら文章を書いたりするもののようです。<br />
<b>Anaconda</b>をインストールすると一緒についてきます。<br />
詳しいことは諸先輩方が記述しておりますので、割愛しますが、本記事も下図のように書きました。<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZQ_ZNmXDtml4zjqXZ491kwdBiIPKf89X7zEbh-gAZkfd9ulEdh01qdQI6FIg9cIutg6pBL5afLtALAwz6vB82OlEbLhPrI3xN_sRQMA62rdiWe2cfOLqT2ocEB5jFiBSixUL_AONnA1ej/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2017-01-21+11.52.18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="498" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZQ_ZNmXDtml4zjqXZ491kwdBiIPKf89X7zEbh-gAZkfd9ulEdh01qdQI6FIg9cIutg6pBL5afLtALAwz6vB82OlEbLhPrI3xN_sRQMA62rdiWe2cfOLqT2ocEB5jFiBSixUL_AONnA1ej/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2017-01-21+11.52.18.png" width="640" /></a></div>
<div class="default-margin">
プロジェクト上に配置しておけば、自作のコードも読み込んで実行してくれます。<br />
Python以外の言語もサポートしているようなので、コードと実行結果をブログにのせたいときは使用を検討しても良いのではないでしょうか?
</div>
<br />
<h2>2017.01.21 追記</h2>
<hr>
<div class="default-margin">
何も考えずに、Jupyterが生成してくれたソースコードを貼り付けたら、Google bloggerのCSSなどを上書きしてしまったようで、不都合が生じました。<br />
急いで書き直したので、結局普通になってしまいました。。。笑<br />
ブログなどに貼り付けるときは事前に検討が必要です。
</div>
<br />
<h2>おわりに</h2>
<hr>
<div class="default-margin">
今回のソースコードは下記になります。<br />
Jupyter Notebookで作成したファイルは<b>.ipynb</b>拡張子で保存されています。<br />
<a href="https://github.com/naoki85/python_mahjong">https://github.com/naoki85/python_mahjong</a><br />
次回は、今度こそ学習ロジックの実装をしたいと思います!
</div>
<div class="default-margin">
第3回書きました!<br />
<a href="https://nowdeveloping.blogspot.jp/2017/01/blog-post_23.html">配牌からあがれる可能性を予測する!(その3 学習の実装)</a>
</div>Anonymoushttp://www.blogger.com/profile/07466674320324702503noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-977425789351925832017-01-20T22:58:00.000+09:002017-01-27T22:10:35.265+09:00Swift3でTTTAttributedLabelの文字列からリンク表示をやってみたこんにちはonukiです。<br />
<br />
今回はTTTAttributedLabelを使用し、<br />
文字列からリンクを表示、リンクタップ制御を<br />
Swiftでの実装方法を書いてこうと思います。<br />
<br />
<h3>
TTTAttributedLabelとは</h3>
<div>
リッチなテキストを表示するためのUILabelの機能を拡張するOSSです。</div>
<div>
その機能の一つに文字列からリンクを検出してくれる機能があるので</div>
<div>
今回は主にその部分の実装についてになります。</div>
<div>
<a href="https://github.com/TTTAttributedLabel/TTTAttributedLabel#tttattributedlabel">https://github.com/TTTAttributedLabel/TTTAttributedLabel#tttattributedlabel</a></div>
<div>
<br /></div>
<h3>
準備</h3>
<div>
インストールにはCocoaPodsを使用します。</div>
<pre><code class="swift">pod 'TTTAttributedLabel'
</code></pre>
<div>
それと、TTTAttributedLabelはObjective-Cで書かれているので</div>
<div>
Bridging-Header.hにimportしてください。</div>
<pre><code class="swift">#import <TTTAttributedLabel/TTTAttributedLabel.h>
</code></pre>
<div>
<br /></div>
<h3>
実装</h3>
<div>
まずはTTTAttributedLabelをimportします</div>
<pre><code class="swift">import TTTAttributedLabel
</code></pre>
<div>
StoryboardにUILabelを適当に用意し</div>
<div>
ClassにTTTAttributedLabelを指定してください。</div>
<div>
それをIBOutlet接続します。</div>
<pre><code class="swift">@IBOutlet weak var linkLabel: TTTAttributedLabel!
</code></pre>
<div>
テキストのリンクをタップできるように設定します。</div>
<pre><code class="swift">linkLabel.enabledTextCheckingTypes = NSTextCheckingResult.CheckingType.link.rawValue
</code></pre>
<div>
リンクを含むテキストをセットします。</div>
<pre><code class="swift">linkLabel.text = "URLにタップできます。\nhttps://www.google.co.jp/"
</code></pre>
<div>
そうするとこのような表示になります。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR8OzkwAIGUEgC7tacHjSHGPT4VC__4SwDOystkf-N6w4jVInPemgT48dB9r4pRFuOeYhEtJdhP0qs1fWXzobE-QGeNZeX0hIgp4sHYHpwot3S2bzItvVC2Sr7BfNhfoKYniaX-R8fEEES/s1600/Simulator+Screen+Shot+2017.01.20+22.21.33.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR8OzkwAIGUEgC7tacHjSHGPT4VC__4SwDOystkf-N6w4jVInPemgT48dB9r4pRFuOeYhEtJdhP0qs1fWXzobE-QGeNZeX0hIgp4sHYHpwot3S2bzItvVC2Sr7BfNhfoKYniaX-R8fEEES/s320/Simulator+Screen+Shot+2017.01.20+22.21.33.png" width="179" /></a></div>
<div>
<br /></div>
<div>
このままだとタップが検知できないので</div>
<div>
TTTAttributedLabelDelegateを設定します。</div>
<pre><code class="swift">class ViewController: UIViewController, TTTAttributedLabelDelegate {
</code></pre>
<div>
TTTAttributedLabelのDelegateを設定します。</div>
<pre><code class="swift">linkLabel.delegate = self
</code></pre>
<div>
テキスト内のリンクがタップされた場合、以下のメソッドが呼ばれます。</div>
<pre><code class="swift">func attributedLabel(_ label: TTTAttributedLabel!, didSelectLinkWith url: URL!) {
//処理
}
</code></pre>
<div>
これで、文字列からリンクを表示、リンクタップ制御ができたと思います。</div>
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>Anonymoushttp://www.blogger.com/profile/01328608252523142922noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-83372622763393286522017-01-19T21:26:00.000+09:002017-01-19T21:26:36.795+09:00はじめの一歩 -Rails ActiveRecord編- SELECT3<br />
どうも、はじめです。<br />
前回はActiveRecordのSELECTについて書いてみました。<br />
<a href='https://nowdeveloping.blogspot.jp/2017/01/rails-activerecord-select_10.html'>はじめの一歩 -Rails ActiveRecord編- SELECT2</a><br />
今回はActiveRecordのデータの取得(SELECT)の中でもJOIN系に関して書いていこうと思います。<br />
<br />
<br />
<h3>はじめに</h3>
<br />
booksテーブルに以下のデータが登録済みであることを前提とします。<br />
<pre><code class='ruby'>[id: 1, title: ‘Rubyの本’, publisher_id: 1],
[id: 2, title: ‘Railsの本’, publisher_id: 1],
[Id: 3, title: ‘PHPの本’, publisher_id: 2]</code></pre>
<br />
今回はJoin系のメソッドについて書いていくので、<br />
booksに対し多対1で紐づくpublishersテーブルを以下のように用意します。<br />
<pre><code class='ruby'>[id: 1, publisher_name: '出版社1'],
[id: 2, publisher_name: '出版社2']</code></pre>
<br />
<br />
<h3>joins</h3>
<br />
joinsはinner joinでの結合を行います。<br />
<pre><code class='ruby'>Books.joins(:publisher)
# SELECT `books`.* FROM `books` INNER JOIN `publishers` ON `publishers`.`id` = `books`.`publisher_id`</code></pre>
<br />
出版社名を表示したい場合は以下のように表示をすることができます。<br />
例としてbooksテーブルのID:1のレコードで取得してみます。<br />
<pre><code class='ruby'>book = Book.joins(:publisher).find(1)
p book.publisher.publisher_name
# '出版社1'</code></pre>
<br />
※joinsを使用するとreadonlyとなるため更新ができないと<br />
いろいろなところで目にしましたが、手元で確認をしたところreadonlyはfalseとなっていました。<br />
ちなみにRailsのバージョンは5.0.0.1です。<br />
バージョンによるものか環境によるものかはわかりませんが、<br />
実際に使用する場合は一度確認をしてみるべきだと思います。<br />
<br />
joinsを使用した状態でwhereを使用したい場合は以下のように書くことができます。<br />
<pre><code class='ruby'># Bookの情報で検索を行いたい場合
Book.joins(:publisher).where(title: ‘Railsの本’)
# Publisherの情報で検索を行いたい場合(以下の二つは同じ内容が実行されます)
Book.joins(:publisher).where(publishers: {publisher_name: '出版社1'})
Book.joins(:publisher).where("publishers.publisher_name = '出版社1'")</code></pre>
mergeを使用するとActiveRecord::Relationを使用して検索することもできます。<br />
<pre><code class='ruby'>Book.joins(:publisher).merge(Publisher.where(publisher_name: '出版社1'))</code></pre>
<b>※後で記述するincludesでは使用できませんでした。</b><br />
使用できない理由はこの後書かせていただきます。<br />
<br />
<br />
<h3>includes</h3>
<br />
includesは結合先のテーブルと結合元のテーブルに対し<br />
別々にクエリを実行してデータを取得します。<br />
<pre><code class='ruby'>Book.includes(:publisher)
# SELECT `books`.* FROM `books`
# SELECT `publishers`.* FROM `publishers` WHERE `publishers`.`id` IN (1, 2)</code></pre>
<br />
表示の仕方はjoinsと同じです。<br />
<pre><code class='ruby'>book = Book.joins(:publisher).find(1)
p book.publisher.publisher_name
# '出版社1'</code></pre>
<br />
それぞれに対して別々にクエリを実行していることから、<br />
指定したデータがBookに存在していない場合はPublisherに対するクエリは実行されません。<br />
<pre><code class='ruby'>Book.joins(:publisher).find(4)
# SELECT `books`.* FROM `books` WHEHE `books`.`id` = 4</code></pre>
<br />
<b>includesを使用した状態でwhereを使用したい場合は、<br />
どのカラムで検索するかによって実行されるSQLの内容が変わってくるので注意が必要です。</b><br />
<br />
実際に違いを見てみます。<br />
検索条件のパターンとして以下の2つをあげます。<br />
<pre><code class='ruby'>1.Book内の情報で検索をする
2.Publish内の情報で検索をする</code></pre>
実際に試してみます。<br />
<br />
1.Book内の情報で検索をする<br />
<pre><code class='ruby'>Book.includes(:publisher)where(title: ‘Railsの本’)
# SELECT `books`.* FROM `books` WHERE `books`.`title` = "Railsの本"
# SELECT `publishers`.* FROM `publishers` WHERE `publishers`.`id` = 1</code></pre>
こちらは条件指定をしない場合と変わりません。<br />
<br />
2.Publish内の情報で検索をする<br />
<pre><code class='ruby'>Book.includes(:publisher)where(publishers: {publisher_name: '出版社1'})
# SELECT `books`.`id, `books`.`title`, `books`.`publisher_id`, `publishers`.`id`, `publishers`.`publisher_name`
# FROM `books` LEFT OUTER JOIN `publishers` ON ``publishers`.`id` = `books`.`publisher_id`
# WHERE `publishers`.`publisher_name` = "出版社1"</code></pre>
このように結合先のテーブル情報で検索を行うと"LEFT OUTER JOIN"を使った結合が行われます。<br />
<br />
includesでmergeを使用した場合以下のようなSQLが実行されます。<br />
<pre><code class='ruby'>Book.includes(:publisher).merge(Publisher.where(publisher_name: '出版社1'))
# SELECT `books`.* FROM `books` WHERE `publishers`.`publisher_name` = "出版社1"</code></pre>
クエリが各テーブル毎に発行されているためこのようなクエリが生成されるのだと思います。<br />
<br />
<br />
<h3>最後に</h3>
<br />
今回のJOIN系に関して個人的に大変だと思ったのはテーブル名の記述です。<br />
joinsやincludesで指定するテーブル名ですが、<br />
自分から見て結合するテーブルがどのような関連性を持っているかによって<br />
記述するテーブル名が変わってきます。<br />
<br />
・自分から見て結合先のテーブルが一つしか存在しない場合(Bookから見たPublishのような関係)</br >
<b>単数系</b>のテーブル名で指定する。</br >
・自分から見て結合するテーブルのデータが複数存在する場合(Publishから見たBookのような関係)</br >
<b>複数形</b>のテーブル名で指定する。<br />
<br />
また、結合先のテーブル情報でwhereを使用する場合は<br />
<b>複数形</b>のテーブル名で指定をします。<br />
<br />
今回書ききれなかったこともあるので、次回もJOIN系の続きを書きます。<br />
<br />はじめhttp://www.blogger.com/profile/07858167086370707583noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-73973400159180800142017-01-17T23:26:00.001+09:002017-01-17T23:26:42.725+09:00サイバーセキュリティ入門 後編<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.amazon.co.jp/gp/product/4320009061/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1"></a><a href="https://images-na.ssl-images-amazon.com/images/I/31JOo5qRiRL._SX350_BO1,204,203,200_.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://images-na.ssl-images-amazon.com/images/I/31JOo5qRiRL._SX350_BO1,204,203,200_.jpg" width="225" /></a>
</div>
<br />
こんにちは、h_ono_222です。<br />
今回のドトール会のテーマは「サイバーセキュリティ入門: 私たちを取り巻く光と闇」の「4. インターネットにおけるサイバー攻撃」についてです。<br />
<br />
<h3>
4. インターネットにおけるサイバー攻撃</h3>
<div>
ここでは、有名な攻撃手法とその手口について書かれています。</div>
<div>
具体的には、</div>
<div>
<ul>
<li>DoS(DDoS)攻撃</li>
<li>標的型攻撃</li>
<li>クロスサイトスクリプティング(XSS)</li>
<li>SQLインジェクション</li>
<li>DNSキャッシュポイズニング</li>
<li>クロスサイトリクエストフォージェリ(CSRF)</li>
</ul>
</div>
<div>
など(個人的な観点に基づいて抜粋しました)です。</div>
<div>
上記の攻撃手法について簡単に説明します。</div>
<div>
<br /></div>
<div>
(1) DoS(DDoS)攻撃</div>
<div>
DOSはDenial of Serviceの略語です。</div>
<div>
攻撃目標(Webサイトなど)に対してリクエストを大量に送りつけ、サーバのメモリやCPUを浪費させて処理能力を低下させたり、</div>
<div>
ネットワークを過負荷にすることにより攻撃目標のサービスを妨害します。<br />
<br /></div>
<div>
DDoSはDistributed DoSの略語で、分散DoSとも呼ばれます。</div>
<div>
ボットネットワーク(ボットに感染した複数のホストにより構成されたネットワーク)から攻撃目標に対して一斉にリクエストを送りつける攻撃です。<br />
<br />
<br />
(2)標的型攻撃<br />
攻撃目標をある程度絞って行う攻撃で、一般的にはマルウェアやSPAMなどの迷惑メールを介して行われます。<br />
標的型攻撃でのメールは攻撃目標が関心をもっている、あるいは、関係あると思わせるような内容が記載されていることが多々あります。<br />
しかし、標的型攻撃では攻撃者がある程度攻撃対象の情報を持っていなければならず、送られたメールから攻撃者を特定できる場合もあるため、近年では減少傾向にあります。<br />
<br />
<br />
(3)クロスサイトスクリプティング(XSS)<br />
ウェブサイトに対する攻撃手法の代表とも言われるほどメジャーな攻撃方法です。<br />
攻撃者は文字列を入力させるフォーム(例えばコメント欄など)に対してJavaScriptコードを入力します。<br />
これにより、サニタイジング(入力された文字列をエスケープし無害な文字列に変換すること)がしっかりされていないサイトでは、任意のJavaScriptコードを実行できてしまいます。<br />
<br />
<br />
(4)SQLインジェクション<br />
フォームに対して不正な文字列を入力することで、攻撃対象のデータベースを制御する攻撃です。<br />
例えば、ログインフォームに下記のような入力を行います。</div>
<pre><code>user_name = hogehoge
password = 'OR'A' = 'A</code></pre>
<div>
これにより発行されるSQLは下記のようになります。</div>
<pre><code>SELECT * FROM users WHERE user_name = hogehoge AND password = ''OR 'A' = 'A'</code></pre>
<div>
ORの後ろの'A' = 'A'は真となるためログインに成功してしまいます。<br />
<br />
<br />
(6)DNSキャッシュポイゾニング<br />
DNSは大本であるルートサーバ、対象ドメインを管理する権威DNSサーバ(プライマリサーバ)、<br />
キャッシュサーバ(セカンダリサーバ)から構成されています。<br />
<br />
ユーザはまずキャッシュサーバに問い合わせを行います。<br />
問い合わせたドメインがキャッシュにない場合、キャッシュサーバはルートサーバに問い合わせを行い、その後、委任されたDNSサーバを辿って最終的な権威DNSサーバに問い合わせを行います。<br />
<br />
攻撃者はキャッシュサーバが問い合わせを行っている間に、キャッシュサーバに対して偽のDNSレスポンスを連続的に送ります。<br />
キャッシュサーバは送られてきた偽のレスポンスを正規のレスポンスとして受け入れます。<br />
その結果、そのドメインにアクセスしたユーザは偽のアドレスに誘導されてしまいます。<br />
<br />
<br />
(7)クロスサイトリクエスをフォージェリ(CSRF)<br />
攻撃者はまず、脆弱性を持つウェブサイトを見つけ出し、不正なプログラムを仕込むなどの改ざんを行います。<br />
次に、匿名掲示板やメールなどを通じて改ざんしたサイトに誘導します。<br />
改ざんしたサイトにアクセスが有ると、仕込んだ不正なプログラムをユーザ(ブラウザなど)に送り込み支配します。<br />
攻撃者の命令がインターネットを通じて発行されると、支配したブラウザなどを通し別のサイトなどへ不正なリクエストを送ります。<br />
<br />
本来被害者であるはずのユーザが加害者になってしまうところがこの攻撃の脅威です。<br />
<br />
<br />
本日は以上です。</div>
h_ono_222http://www.blogger.com/profile/04208274059082199769noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-76858812263680933812017-01-16T23:13:00.000+09:002017-01-22T12:45:37.718+09:00配牌からあがれる可能性を予測する!(その1 推論処理)<div class="separator" style="clear: both; text-align: center;">
<a href="https://images-na.ssl-images-amazon.com/images/I/91LOp7zilgL.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://images-na.ssl-images-amazon.com/images/I/91LOp7zilgL.jpg" width="226" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator"> <b>2017.01.21 更新</b><br />
その2を公開しました!<br />
<a href="https://nowdeveloping.blogspot.jp/2017/01/blog-post_21.html">https://nowdeveloping.blogspot.jp/2017/01/blog-post_21.html</a></div>
<hr>
<div class="separator" style="clear: both; text-align: left;">
こんにちは、Taroです。</div>
<div class="separator" style="clear: both; text-align: left;">
日増しに寒くなってきましたね。</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: left;">
<h2>ゼロから作るDeep Learningを読んでいます</h2></div>
<hr>
<div class="separator" style="clear: both; text-align: left;">
最近、趣味かつ独学ではありますが、Deep Learningの勉強をしています。</div>
<div class="separator" style="clear: both; text-align: left;">
「<a href="https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585/ref=cm_cr_arp_d_product_top?ie=UTF8" target="_blank">ゼロから作るDeep Learning</a>」は初心者でも分かりやすい本だと思います。</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: left;">
しかし、(私自身に知識がないためだとは思いますが)いまいちピンときません。</div>
<div class="separator" style="clear: both; text-align: left;">
ピンとこないというのは、意味が分からないということではなく、「<b>実際にこれをどうやって使うんだろう</b>」というところです。</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;">
せっかくなら自分の興味のある麻雀をベースに、</div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">配牌を入力して、あがれるかあがれないか予測する</span></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: left;">
ソースコードも公開していきますが、Deep LearningどころかPythonも初心者なので、ぜひご指導をお願いしますm(_ _)m</div>
<div class="separator" style="clear: both; text-align: left;">
麻雀は知らないけど、Deep Learningとか興味ある、という方でも読んでいただけるようにしていきます。</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<h2>とりあえず設計</h2></div>
<hr>
<div class="separator" style="clear: both; text-align: left;">
配牌(はじめに配られる手札のようなもの)から、アガリの確率を求めるために必要なファクターは何か、真剣に考えてみました(それはもう、プログラムを書いているとき以上に)。</div>
<div class="separator" style="clear: both; text-align: left;">
また、あまりに複雑すぎるファクターだと私が実装できない可能性があり、かつ本筋を見失いかねないので、以下の3つの要素としました。</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ol>
<li>配牌時に存在する順子の数</li>
<li>配牌時に存在する対子の数</li>
<li>配牌時に存在する暗刻の数</li>
</ol>
麻雀が分からない方は、トランプで7、8、9と階段で持っているか、7、7、7と同じ数字を複数枚持っているか、どちらがアガリやすいかという風に考えてください。<br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
これら3つの要素を算出し、それぞれに対して重み(W)を掛けて、最終的な総和からアガれるかアガれないか予測します。</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/AVvXsEjkSbkTgOs4rugcN9J9i79hYZTsp8_BGZJESa9S7dkYdd_ACfdzOkLncSoNk6a_2fdVlCdL-mevFHJsvatXkRUKqBHzCkfbrRB9pOLqzJ0mdYS_8whTDTDBUiweio4cCr_ZACCT0U8ldzCG/s1600/%25E5%259B%25B320170116.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkSbkTgOs4rugcN9J9i79hYZTsp8_BGZJESa9S7dkYdd_ACfdzOkLncSoNk6a_2fdVlCdL-mevFHJsvatXkRUKqBHzCkfbrRB9pOLqzJ0mdYS_8whTDTDBUiweio4cCr_ZACCT0U8ldzCG/s640/%25E5%259B%25B320170116.png" width="640" /></a></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;">
<h2>データの扱い</h2></div>
<div class="separator" style="clear: both; text-align: left;">
例えば、下記のような配牌があります(一番右の牌は無視してください笑)。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjickyQKsJZu9CDHwlQyB6h3iUx4Nd0xD9A9YkcFK233St5uObDJ7jQH2bk1146INLtQAYEdAOJqCWwhvSxm7VTjsVEkr0hluHG_C-p92ZaoGeVTc0FcrFJ89XVlE05PJMq1wyCzIlU_XIA/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2017-01-16+22.44.59.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="81" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjickyQKsJZu9CDHwlQyB6h3iUx4Nd0xD9A9YkcFK233St5uObDJ7jQH2bk1146INLtQAYEdAOJqCWwhvSxm7VTjsVEkr0hluHG_C-p92ZaoGeVTc0FcrFJ89XVlE05PJMq1wyCzIlU_XIA/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2017-01-16+22.44.59.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
このときの入力値はリスト型で、</div>
<pre><code class="python">input_data = [14, 15, 19, 23, 25, 25, 32, 37, 39, 39, 43, 43, 47]</code></pre>
<div class="separator" style="clear: both; text-align: left;">
と渡します。</div>
<div class="separator" style="clear: both; text-align: left;">
順子の数は0、対子の数が3つ、暗刻の数が0です。</div>
<div class="separator" style="clear: both; text-align: left;">
そのため、</div>
<pre><code class="python">X1 = 0
X2 = 3
X3 = 0</code></pre>
<div class="separator" style="clear: both; text-align: left;">
とします。</div>
<div class="separator" style="clear: both; text-align: left;">
ここで、それぞれに対して重みWを掛けます。</div>
<div class="separator" style="clear: both; text-align: left;">
重みは、それぞれのファクターがどれだけ寄与しているか示す値です。</div>
<div class="separator" style="clear: both; text-align: left;">
この重みを今後学習させて、最適な値を探していきます。</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: left;">
そして、最後にそれらを足し合わせて結論を導きます。</div>
<div class="separator" style="clear: both; text-align: left;">
結論を導く際に、バイアスで閾値を設定しますが、こちらも今後の学習で値を決めていくので、今回は適当な値を入れます。</div>
<div class="separator" style="clear: both; text-align: left;">
最終的には下記のように出力させたいと思います。</div>
<pre><code class="python">result = [0.50407631, 0.49592369]</code></pre>
<div class="separator" style="clear: both; text-align: left;">
第一要素がアガれる確率、第二要素がアガれない確率と考えます。</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: left;">
次回は、学習を実装していきたいと思います。</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: left;">
最後に、ソースコードはこちらになりますので、よろしければご覧ください。</div>
<a href="https://github.com/naoki85/python_mahjong">https://github.com/naoki85/python_mahjong</a>
<hr>
<div style="margin-top: 20px"> <b>2017.01.21 更新</b><br />
その2を公開しました!<br />
<a href="https://nowdeveloping.blogspot.jp/2017/01/blog-post_21.html">https://nowdeveloping.blogspot.jp/2017/01/blog-post_21.html</a></div>Anonymoushttp://www.blogger.com/profile/07466674320324702503noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-56840917660272431982017-01-14T20:00:00.000+09:002017-01-14T22:25:13.526+09:00Rails5 alias_method_chain is deprecated. こんにちは、Hiroです。<br />
直近のプロジェクトでは、Rails5を使っているのですが、利用しているgem関連で下記のような警告が大量に出力されるので、少し調べてみました。<br />
(「./bin/rails c」や「./bin/bundle exec rspec」を実行すると大量に出力されます。)
<pre><code class="sh">DEPRECATION WARNING: alias_method_chain is deprecated.</code></pre>
これは、Rails5からはActiveSupportの「alias_method_chain」がdeprecatedになり、代わりに「Module#prepend」を使うように促しています。<br />
<br />
<br />
<h3>alias_method_chainとは</h3>
<br />
まず、deprecatedになった「alias_method_chain」ですが、下記のように利用します。
<pre><code class="ruby">class HelloUser
def hello
puts 'Hello'
end
def hello_with_world
hello_without_world
puts 'World'
end
alias_method_chain :hello, :world
end</code></pre>
上記のコードは、「alias_method」を使った場合は、下記と同等になります。
<pre><code class="ruby">class HelloUser
def hello
puts 'Hello'
end
def hello_with_world
hello_without_world
puts 'World'
end
alias_method :hello_without_world, :hello
alias_method :hello, :hello_with_world
end</code></pre>
helloメソッドがhello_with_worldメソッドに置き換わり、元々のhelloメソッドはhello_without_worldメソッドとして使えるようになります。<br/>
実行結果を下記に記載しますが、置き換わっているのがわかると思います。
<pre><code class="ruby">[1] pry(main)> hello_user = HelloUser.new
[2] pry(main)> hello_user.hello
Hello
World
[3] pry(main)> hello_user.hello_without_world
Hello</code></pre>
<br />
<br />
<h3>Module#prependとは</h3>
<br />
早速、「Module#prepend」の使い方ですが下記のように使います。
<pre><code class="ruby">class HelloUser
def hello
puts 'Hello'
end
end
module HelloWithWorld
def hello
super
puts 'World'
end
end
HelloUser.prepend(HelloWithWorld)</code></pre>
prependされたHelloWithWorldモジュールは継承関係上で、HelloUserクラスより手前に位置することになり、helloメソッドを
オーバーライドしたような形になります。<br/>
そのため、HelloWithWorldモジュールのメソッド内でsuperを呼び出すことで元々のメソッドを呼び出すことができます。<br/>
実行結果とancestorsメソッドで継承関係を表示しておきます。HelloWithWorldがHelloUserの前にあるのがわかると思います。
<pre><code class="ruby">[1] pry(main)> hello_user = HelloUser.new
[2] pry(main)> hello_user.hello
Hello
World
[3] pry(main)> HelloUser.ancestors
=> [HelloWithWorld,
HelloUser,
ActiveSupport::ToJsonWithActiveSupportEncoder,
Object,
PP::ObjectMixin,
RequireAll,
ActiveSupport::Dependencies::Loadable,
JSON::Ext::Generator::GeneratorMethods::Object,
ActiveSupport::Tryable,
Kernel,
BasicObject]</code></pre>
モンキーパッチなどを書くときに利用することになると思います。(モンキーパッチなんて書かずに、githubにプルリクする方がよいですが)<br />
<br />
<br />
<h3>とりあえず、DEPRECATION WARNINGの出力をなくしたい</h3>
<br />
Rails5にしたものの、全てのgemに対して、この警告を消すための書き換えの対応をしていくのは大変。<br/>
ただ、この出力が目障りという方は、「config/application.rb」に下記を書けば、消すことができますが、自己責任でお願いしますね。
<pre><code class="ruby">require_relative 'boot'
require 'rails/all'
# TODO: DEPRECATION WARNING: alias_method_chain is deprecated
ActiveSupport::Deprecation.silenced = true
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
...
...</code></pre>
<br/>
<br/>
deprecatedなメソッドは、今後のアップデートで利用できなくなることもありますので、しっかりと理解した上で利用し、可能であれば、置き換えていくようにしましょう。<br/>Hirohttp://www.blogger.com/profile/09213111224176477652noreply@blogger.com0tag:blogger.com,1999:blog-5487726808164834270.post-19593088592206363892017-01-13T23:17:00.001+09:002017-01-13T23:17:26.507+09:00Swift3でMapKitの複数のピンを一括で表示・削除する方法こんにちは、onukiです。<br />
<br />
今回はMapKitでピンを一括で表示・削除する方法について、<br />
例えばカテゴリーごとにピンを表示したい、<br />
カテゴリー切り替え時にピンをごっそり入れ替えたいみたいな使い方がしたかったのですが<br />
以外と調べても出てこなかったので備忘録がてら書いておきます。<br />
<br />
<h3>
やり方</h3>
<div>
大体、ピンの表示方法を調べると以下のような書き方が出てきます。</div>
<pre><code class="swift">let annotation = MKPointAnnotation()
annotation.coordinate = CLLocationCoordinate2DMake(37.331652997806785, -122.03072304117417)
self.mapView.addAnnotation(annotation)
</code></pre>
<div>
これだと入れ替えが面倒なので今回は以下のようにします。</div>
<div>
まず、グローバル変数にMKAnnotationの配列を用意します。</div>
<pre><code class="swift">var annotationArray: [MKAnnotation] = []
</code></pre>
<div>
マップにMKAnnotationを追加します。</div>
<pre><code class="swift">for coordinate in coordinateArray! {
let annotation = MKPointAnnotation()
annotation.coordinate = CLLocationCoordinate2DMake(coordinate.latitude, coordinate.longitude)
annotationArray.append(annotation)
}
self.mapView.addAnnotations(annotationArray)
</code></pre>
<div>
設定したピンを削除したい時は、こうすると先ほど設定したピンを全削除できます。</div>
<pre><code class="swift">self.mapView.removeAnnotations(annotationArray)
</code></pre>
<div>
<br /></div>
<div>
これで複数のMKAnnotation配列を用意してやり、</div>
<div>
用途に応じてremoveとaddをしてやれば</div>
<div>
複数のピンの入れ替えが出来るようになります。</div>
<div>
<br /></div>
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #703daa}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>Anonymoushttp://www.blogger.com/profile/01328608252523142922noreply@blogger.com0