何を捨て何を残すかで人生は決まる

「身の回りをシンプルにする」と意気込んで2019年をスタートしてから早2ヶ月あまり。

bookmeter.com

今年はこのような目的意識もあって、書店で本書に目にして購入に至る。

とりあえず読み始めてみたものの著者の自慢気な感じ、押し付けがましい感じがして、中盤以降は斜め読み。

一応読みながらメモしてたもの(理解できたもの)だけ列挙しておく。

  • 物質的な幸せから精神的な幸せを求めるべし
  • 自分を形作るものにお金をかけるべし
  • 「足る」を「知る」
  • 自分で判断していく力(すぐにネットに頼らない・・・)
  • 自分の存在感(オーラ)を纏う
  • 相手の時間をリスペクトすべし
     メールの長文 ✗
     いきなりの添付ファイル ✗
      たまにやっちゃってるかも・・・

特に最後のは肝に命じておいてもいいのかも。

以上。

独学Ruby - 基礎(Arrayクラス)

配列クラス(Array)

  • 配列の作り方
  • インデックスの使い方
  • 集合としての配列
  • 列としての配列

配列の作り方

  • 基本
# 基本
my_array = [1, 2, 3, "1", "2", "3"]
p my_array
[1, 2, 3, "1", "2", "3"]
  • Array.new(要素数, 初期値)
#  Array.new
my_array = Array.new
p my_array

my_array = Array.new(6)
p my_array

my_array = Array.new(6, 0)
p my_array
[]
[nil, nil, nil, nil, nil, nil]
[0, 0, 0, 0, 0, 0]
  • %w
#  %w
lang = %w(RUby Perl Python Scheme Pke REBOL)
p lang
["RUby", "Perl", "Python", "Scheme", "Pke", "REBOL"]
  • to_aメソッド

    多くのクラスで定義されており、オブジェクトを配列に変換する

# to_aメソッド
color_table = {"block"=>"#000000", "white"=>"#FFFFFF"}
p color_table.to_a
[["block", "#000000"], ["white", "#FFFFFF"]]
  • splitメソッド

    カンマや空白で区切られた文字列から配列を作る

# splitメソッド
column = "2010/01/09 22:33 foo.html proxy.example.jp".split()
p column

column = "2010/01/09 22:33 foo.html proxy.example.jp".split(" ")
p column

column = "2010/01/09,22:33,foo.html,proxy.example.jp".split(",")
p column
["2010/01/09", "22:33", "foo.html", "proxy.example.jp"]
["2010/01/09", "22:33", "foo.html", "proxy.example.jp"]
["2010/01/09", "22:33", "foo.html", "proxy.example.jp"]

インデックスの使い方

要素を取り出す

  • 添え字指定
my_array = [1 ,2 ,3 ,4, 5, 6]
p my_array[0]

# マイナスインデックス
p my_array[-1]

# 範囲指定
p my_array[0..2]
p my_array[0, 3]
1
6
[1, 2, 3]
[1, 2, 3]
  • atメソッド
# atメソッド
p my_array.at(0)
p my_array[0]
  • sliceメソッド
# sliceメソッド
p my_array.slice(1)
p my_array[1]

p my_array.slice(-1)
p my_array[-1]

p my_array.slice(0..2) 
p my_array[0..2]

p my_array.slice(0, 3)
p my_array[0, 3]

要素を置き換える

alpha = ["a", "b", "c", "d", "e", "f"]
p alpha

alpha[2, 3] = ["C", "D", "E"]
p alpha

alpha[0..1] = ["A", "B"]
p alpha

alpha[-1] = "F"
p alpha
["a", "b", "c", "d", "e", "f"]
["a", "b", "C", "D", "E", "f"]
["A", "B", "C", "D", "E", "f"]
["A", "B", "C", "D", "E", "F"]

要素を挿入する

alpha = ["a", "b", "c", "d", "e", "f"]
p alpha

alpha[2, 0] = ["X", "Y"]
p alpha
["a", "b", "c", "d", "e", "f"]
["a", "b", "X", "Y", "c", "d", "e", "f"]

複数のインデックスから配列をつくる

  • values_atメソッド
alpha = %w(a b c d e f)
p alpha

p alpha.values_at(1, 3 ,5)
["a", "b", "c", "d", "e", "f"]
["b", "d", "f"]

集合としての配列

  • 共通集合
  • 和集合
  • 差集合
# 共通集合 (AND, OR)
ary1 = ["a", "b", "c"]
ary2 = ["b"]
p (ary1 & ary2)
p (ary1 | ary2)
p ary1 + ary2
p ary1 - ary2

# 和差演算
ary1 = [1, 2, 3]
ary2 = [4, 3, 2]
p (ary1 & ary2)
p (ary1 | ary2)
p ary1 + ary2
p ary1 - ary2
["b"]
["a", "b", "c"]
["a", "b", "c", "b"]
["a", "c"]

[2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 3, 2]
[1]

列としての配列

  • キュー
  • スタック
機能 先頭に要素を追加する操作 末尾に要素を追加する操作
要素を加える unshift push
要素を取り除く shift pop
要素を参照する first last
alpha = ["a", "b", "c", "d", "e"]
p alpha

# 末尾に要素を追加する
p alpha.push("f")

# 末尾から要素を取り除く
p alpha.pop

# 末尾の要素を参照する
p alpha.last

# 先頭に要素を追加する
p alpha.unshift("F")

# 先頭から要素を取り除く
p alpha.shift

# 先頭の要素を参照する
p alpha.first
["a", "b", "c", "d", "e"]
["a", "b", "c", "d", "e", "f"]
"f"
"e"
["F", "a", "b", "c", "d", "e"]
"F"
"a"

配列操作メソッド

機能 メソッド
配列の先頭に新しい要素を付け加える a.unshift(item)
配列の末尾に新しい要素を付け加える a << item
a.push(item)
配列aに配列bを連結する a.concat(b)
a+b
配列から要素(nil)を取り除く a.compact
a.compact!
配列から要素(x)を取り除く a.delete(x)
配列からn番目の要素を取り除く a.delete_at(n)
配列から条件を満たす要素を取り除く a.delete_if{|item|...}
a.reject{|item|...}
a.reject!{|item|...}
# obj.unshift(item)
a = [1,2,3,4,5]
p a
a.unshift(0)
p a

p "-----------------"

# a << item
a = [1,2,3,4,5]
p a
a << 6
p a

p "-----------------"

# a.push(item)
a = [1,2,3,4,5]
p a
a.push(6)
p a

p "-----------------"

# a.concat(b)
a = [1,2,3]
b = [4,5,6]
print "a=", a, "b=", b , "\n"
c = a.concat(b)
print "c=", c, "\n"

p "-----------------"

# a+b
a = [1,2,3]
b = [4,5,6]
print "a=", a, "b=", b , "\n"
c = a + b
print "c=", c, "\n"

# a.compact
a = [1, nil, 3, nil, nil]
b = a.compact
print "a=", a, "b=", b,"\n"
a.compact!
print "a=", a, "b=", b,"\n"

p "-----------------"

# delete
a = [1, 2, 3, 2, 1]
p a
del_value = a.delete(2)
p del_value
p a


p "-----------------"

# delete_at
a = [1, 2, 3, 2, 1]
p a
del_value = a.delete_at(0)
p del_value
p a

p "-----------------"

# delete_if
a = [1, 2, 3, 2, 1]
b = a.delete_if{|i| i >= 2}
p b

p "-----------------"

# reject, reject!
a = [1, 2, 3, 2, 1]
b = a.reject{|i| i >= 2}
p b

a = [1, 2, 3, 2, 1]
b = a.reject!{|i| i >= 2}
p b

独学Ruby - 基礎(Numericクラス)

tanoshiiruby.github.io


数値クラス(Numeric)

  • Numeric
    • Integer
      • Fixnum
      • Bignum
    • Float
    • Rational (有理数)
    • Complex
# Rational(分子,分母)形式
require "rational"

r = Rational(2,5) + Rational(1,3)
p r
p r.to_f


# Complex(実部, 虚部)形式
require "complex"

c = Complex(1, 0.2) 
p c

数値リテラル

リテラル 意味
123 整数の10進表記
0o123 整数の8進表記
0d123 整数の10進表記
0x123 整数の16進表記
?a 文字aのASCIIコード(97)
123.45 浮動小数点数
1.23e4 1.23 x 10の4乗
1.23e-4 1.23 x 10の-4乗
?\t タブのASCIIコード(9)

など

数値リテラルのアンダースコアは無視される。

123456 = 123_456 ... 見やすくするための区切り文字として使える

算術演算

演算子 演算
+ 加算
- 減算
* 乗算
/ 除算
% 剰余(あまり)
** べき乗

見慣れないのは、べき乗「**」くらいかな。

x.divmod(y)メソッド

/ や % 以外にもdivmodメソッドが使える。

divmodは商と余りを配列にする。

ans = x.divmode(y)のとき、x = ans[0] * y + ans[1]が成立。

# divmodメソッド
ans = 10.divmod(3)
print ans , "=>" , "ans[0]=", ans[0] , " ans[1]=", ans[1] , "\n"

ans = -10.divmod(3)
print ans , "=>" , "ans[0]=", ans[0] , " ans[1]=", ans[1] , "\n"
[3, 1]=>ans[0]=3 ans[1]=1
[-4, 2]=>ans[0]=-4 ans[1]=2

xx.modulo(y)メソッド

x % yと同じ。

# moduloメソッド
ans = 10 % 3
p ans
ans = 10.modulo(3)
p ans
ans = -10 % 3
p ans
ans = -10.modulo(3)
p ans
1
1
2
2

x.remainder(y)メソッド

moduloと似ているが得られる値の符号はxの符号に一致する。

# remainderメソッド
ans = 10.remainder(3)
p ans
ans = -10.remainder(3)
p ans
-1

Mathモジュール

三角関数や対数関数などの演算モジュールが提供されている。

# Mathモジュール名を明示して使う
f = 2
p Math.sqrt(f)

# Mathモジュールをインクルードして使う
include Math
p sqrt(f)

メソッド各種(一部)

  • cos
  • sin
  • tan
  • log (自然対数 底e)
  • log2 (底2)
  • log10 (常用対数 底10)
  • sqrt など

定数

  • PI = 3.141592 ...
  • E = 2.718...

数値型の変換

メソッド名 意味
to_f Floatオブジェクトへの変換
to_i Integerオブジェクトへの変換
round 小数点以下を四捨五入
ceil レシーバより大きくて最も小さい整数を返す
floor レシーバより小さくて最も大きい整数を返す
to_r Rationalオブジェクトへの変換
to_i Complexオブジェクトへの変換
# Integer -> Float
p 10.to_f

# Float -> Integer
p 10.2.to_i

# roundメソッドで四捨五入
p 10.2.round

# ceilメソッドでレシーバより大きくて最も小さい整数
p 10.2.ceil

# floorメソッドでレシーバより小さくて最も大きい整数
p 10.2.floor

# Rationalへの変換
p 1.5.to_r

# Complexへの変換
p 1.5.to_c

実行結果。

10.0
10
10
11
10
(3/2)
(1.5+0i)

ビット演算

演算子 演算
~ ビット反転(NOT)
& 積(AND)
| 和(OR)
^ 排他的論理和(XOR)
>> 右ビットシフト
<< 左ビットシフト

乱数

  • rand
  • srand
  • (Randomモジュールとしても提供されている)
# randメソッド
p rand
p rand
p rand(100)
p rand(100)

# srandメソッドで擬似乱数初期化
srand(1)
p [rand, rand, rand]

srand(1)
p [rand, rand, rand]

srand(2)
p [rand, rand, rand]


p Random.rand
p Random.srand(1)
p [rand, rand, rand]
0.9308480165924842
0.46835315268923006
21
0
[0.417022004702574, 0.7203244934421581, 0.00011437481734488664]
[0.417022004702574, 0.7203244934421581, 0.00011437481734488664]
[0.43599490214200376, 0.025926231827891333, 0.5496624778787091]
0.4353223926182769
2
[0.417022004702574, 0.7203244934421581, 0.00011437481734488664]

数え上げ

  • n.times{|i}...}
# timesメソッド
ary = []
10.times do |i|
    ary << i
end
p ary
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  • from.upto(to){|i}...}
# uptoメソッド
ary = []
1.upto(10) do |i|
    ary << i
end
p ary
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  • from.downto(to){|i|...}
# downtoメソッド
ary = []
10.downto(1) do |i|
    ary << i
end
p ary
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
  • from.step(to, step){|i|...}
# stepメソッド
ary = []
1.step(10, 0.5) do |i|
    ary << i
end
p ary
[1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]

以上。

自律するスマート工場への取り組み

自律するスマート工場実現へ向け、IoTプラットフォーム連携が加速!

monoist.atmarkit.co.jp

製造業のIoT化の加速はとどまらない。特に工場の現場では人手不足によりスマート工場化の取り組みが活発化している。しかし現状では「見える化」にとどまっているため、収集したデータを活用するための仕組みがもっかの課題となっている。そこで情報活用を推し進める希望の星が「IoTプラットフォーム」。独自性の強い工場同士をつなげるためのプラットフォーム間の連携が「見える化」から一歩抜け出すための打開策だ。

スマート工場EXPO(第4回)の案内

www.sma-fac.jp

スマート工場実現への6ステップ

  1. コンピュータ化
  2. コネクティビティ
  3. 可視性、現状の把握(何が起きているか?)
  4. 原因の理解(なぜ起きているか?)
  5. 予測可能性、未来への備え(将来何が起こりうるか?)
  6. 適応性、自己最適化(どのように自律的な対応を実現するか?)

ステップ1~2は、インダストリー3.0に位置づけらる。

ステップ3~6が、インダストリー4.0に位置づけられる。

IoTプラットフォームへの注目

ステップ3が「見える化」に相当する。その先のデータ活用のための基盤やサイクルを容易にしてくれる(期待)がIoTプラットフォームに注目が集まる理由の一つ。

現在どのようなものがあるのか・・・

www.fanuc.co.jp

www.edgecross.org

www.siemens.com


FIELD system

特徴

  • 見える化だけでなく自動制御なでを含めて実行力の高い情報基盤を目指している
  • 「つなぐ」「見える」「考える」の先に「動かす」(by ファナックCEO)
    • 効率的に動かす
    • 高精度に動かす
    • 安全に動かす
    • 熟練者のように動かす を実現するのが目標と位置づけている

Edgecross

特徴

MindSphere

特徴

  • Paas (Platform as a Service)

本格化へ

現状、多くのソリューションやサービスがあり、ユーザがどれを選択すべきか見定めが難しい。

ベンダーから別ベンダーへの乗り換えの難しさも選択の壁となる。

プラットフォーム間の連携がユーザを後押しする。

旗振り役の経産省の動き

  先述のFIELD systemやEdgecrossなどを連携させるための製造プラットフォームオープン連携事業

  共通辞書を策定し、それを参照することで動作や作業などを定義し、

  プラットフォーム間のデータ連携を容易に行えるようにする仕組み。

iv-i.org

https://iv-i.org/wp/wp-content/uploads/2018/10/symposium2018autumn_8.pdf

異種プロトコルを通すTSNが注目される

 TSN:Time Sensitive Networking。

 イーサネットをベースに時間の同期性を保証かつリアルタイム性を確保できるようにしたネットワーク規格。

 例) CC-Link IE TSN

ednjapan.com

 以上。

プロジェクト管理ツール(JIRA Software/Confluence/Bitbucket Server/FishEve)

Jira Software

www.ricksoft.jp

プロジェクト管理において次のような課題を解決。

  • 業務プロセスやソフトウェア開発の生産性を向上したい
  • Excelでプロジェクト管理するのをやめたい(メール中心のコミュニケーションの限界)
  • アジャイル開発を導入したい、かんばんスクラムによる仕事の効率化を図りたい

チケットによる情報共有

 チケット(課題)で作業のワークフローを管理。

ダッシュボードで情報共有

 ダッシュボードで進捗状況を見える化

レポート機能で情報共有

 様々なレポート形式で情報を見える化

www.ricksoft.jp

  • バーンダウンチャート

  • スプリントレポート

  • ベロシティグラフ

  • 累積フローダイアグラム

  • バージョンレポート

  • エピックレポート

  • コントロールチャート

  • エピックバーンダウン

  • リリースバーンダウン などなど

デモのお試し

www.ricksoft.jp

Confluence

www.ricksoft.jp

プロジェクト管理において次のような課題を解決。

  • 文書の書式、粒度がバラバラ
  • メールやファイルに情報が埋もれてしまう
  • 検索時間を減らしたい、より効率化したい
  • 情報が多すぎて新しい情報をキャッチできない

情報を発信する

 コンテンツをページ単位で階層構造で管理。

情報を整理する

 情報は親ページから子ページへと階層構造で管理。

 ページにはラベル付けして情報分類。

情報を探す

 あいまい検索、変更日付け検索など検索方法が多種に渡る

情報更新に気づく

 ウォッチ機能で気になるページの更新の通知を受け取れる

マクロによる拡張

 マクロで機能追加。動的コンテンツの組み込み。豊富なアドオン。

Bitbucket Server

www.ricksoft.jp

Gitリポジトリを一元管理。

JIRAと連携。

リポジトリ管理機能

 Gitリポジトリの作成、一元管理。

ユーザとアクセス権限管理 

コードアクティビティの見える化

 コミットログの閲覧、履歴分析などなど

マージ前のチェック機能(プルリクエスト)

 コードレビューをワークフローに組み込み。

 レビューアにメール通知。

JIRAとの連携

 JIRAの課題キーとの連携が可能。

 チケットとコード変更の結びつきを把握できる。

SVNからBitBucketへの以降 qiita.com

FishEye

www.ricksoft.jp

ソースコード閲覧ツール。

以上。

機械学習と深層学習 - C言語によるシミュレーション①

www.ohmsha.co.jp

ディープラーニングにより実現された知的処理システムの例

システム名 説明
DQN(Deep Q-Network)
ConvNet VGG
CD-DNN-HMM

学習

検査

機械学習の分類(処理の原理に基づく分類)

分類 説明
記号処理 記号処理・記号操作の技術を基礎とした学習手法 機能学習
教示学習
進化的計算 など
統計的処理 学習データを確率的なデータであると仮定し、
これに主として数学的な処理を施すことで学習する手法
統計的手法
ニューラルネットワーク
深層学習 など

機械学習の分類(学習方法に基づく分類)

分類 説明
教師あり学習 ある事例とそれに対する正解がペアで与えられて
学習項目の一つ一つについて先生から教えを受けるような学習
画像認識
音声認識
教師なし学習 正解不正解を先生に教えてもらうのではなく、
与えられた学習データを機械学習システム自身が判断することで学ぶ
入力データの自動分類
強化学習 一つ一つの事項についての正解不正解は与えられないが
最後の結果評価のみが与えられる環境での学習
Q学習
DQN

機械学習の基礎

演繹的学習と帰納的学習

前者はある基礎的抽象的な概念から具体的な知識を得るような学習方法。

後者は複数の具体的な事実から具体的な知識を得るような学習方法。

帰納的学習の例題「株価の予想」

X社の株価は、X社の関連企業A社~J社の株価変動によって決定されるものとする。

まずは学習データセットを用意する。

学習データの番号 前日の関連会社の株価変動(1:上昇、0:下降)
左からA,B,C,D,E,F,G,H,I,J社
翌日のX社の株価変動
1 1000001001 1
2 0101011101 1
3 0100011010 0
4 1001101001 1
5 1001101111 0
6 0000001100 1
7 1111001101 0
8 0111011101 0
9 0011011100 0
10 1110000110 0

次に知識の表現方法を検討する。

(例)

  • パターンマッチングによる
  • 論理式による
  • if-then形式のプロダクションルールによる など

今回は関連会社A~J社の株価動向パターンを表現し、そのパターンにマッチするかどうかで予測する。

学習データセットには正例と負例がある。

正例とは正解として選び出さなければならないデータ

負例とは不正解とすべきデータ

学習データ(正例)を上昇と予想できれば、得点+1

学習データ(負例)を下降と予想できれば、得点+1

学習データ(正例)を下降と予想してしまったら、得点0

学習データ(負例)を上昇と予想してしまったら、得点0

最後に処理フローについて。

  1. 学習データセットの読み込み(学習データと教師データの組)

  2. 乱数による解候補パターンの生成

  3. 解候補パターンを用いて、1つの学習データに対するX社株価の予想

  4. 予想値と教師データを比較し得点をつける

ldata.txt

1 0 0 0 0 0 1 0 0 1     1
0 1 0 1 0 1 1 1 0 1     1
0 1 0 0 0 1 1 0 1 0     0
1 0 0 1 1 0 1 0 0 1     1
1 0 0 1 1 0 1 1 1 1     0
0 0 0 0 0 0 1 1 0 0     1
1 1 1 1 0 0 1 1 0 1     0
0 1 1 1 0 1 1 1 0 1     0
0 0 1 1 0 1 1 1 0 0     0
1 1 1 0 0 0 0 1 1 0     0
0 0 1 1 1 0 0 0 1 0     0
1 0 0 0 1 0 1 0 1 1     0
0 1 0 0 1 0 0 0 1 1     0
0 1 1 0 1 0 0 1 1 1     0
0 0 1 0 1 0 1 0 1 0     0
/*
 * learnstock.c
 *
 *  Created on: 2019/01/26
 */

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define NUMBER_OF_TEST                 (10000)
#define NUMBER_OF_ASSOCIATED_COMPANY   (10)
#define MAXCHAR_OF_LEARNING_DATA_SET   (32)

typedef struct
{
    uint16_t learning_data;
    bool    teacher_data;
} tLEARNING_DATA_SET;

static int16_t readLearningDataSetFile(char* file_name, tLEARNING_DATA_SET** learning_data_set_table);
static tLEARNING_DATA_SET retrieveLearningDataSet(char* learning_data_set_str);
static uint16_t createCandidateAnswerPattern(void);
static int16_t calculateScore(int number_data_set, tLEARNING_DATA_SET* learning_data_set_table, uint16_t answer_pattern);

int main(int args, char* argv[])
{
    tLEARNING_DATA_SET* learning_data_set_table;

    int16_t    number_of_learning_data_set;
    uint16_t   answer_pattern;
    uint16_t    best_answer_pattern;
    int16_t     score = 0;
    int16_t     best_score = -1;
    int16_t    i;

    if(args != 2)
    {
        printf("Usage: <*.exe> <infile>\n");

        return -1;
    }

    if((number_of_learning_data_set = readLearningDataSetFile(argv[1], &learning_data_set_table)) == -1)
    {
        printf("readLearningDataSetFile fail.");
        return -2;
    }

#if 0
   printf("number_of_learning_data_set = %d\n", number_of_learning_data_set);
   for(i = 0; i < number_of_learning_data_set; i++)
   {
       printf("[%d] 0x%x 0x%x\n", i, learning_data_set_table[i].learning_data, learning_data_set_table[i].teacher_data);
   }
#endif

    for(i = 0; i < NUMBER_OF_TEST; i++)
    {
        answer_pattern = createCandidateAnswerPattern();
        score = calculateScore(number_of_learning_data_set, learning_data_set_table, answer_pattern);
        if(best_score < score)
        {
            best_score = score;
            best_answer_pattern = answer_pattern;
        }
    }

    printf("Best Score : %d\n", best_score);
    printf("Best Answer Patter : 0x%x\n", best_answer_pattern);

    return 0;
}


static int16_t readLearningDataSetFile(char* file_name, tLEARNING_DATA_SET** learning_data_set_table)
{
    int32_t number_of_data_set;
    int32_t i;
    char    data_set[MAXCHAR_OF_LEARNING_DATA_SET];
    FILE*   fp;

    fp = fopen(file_name, "r");
    if(fp == NULL)
    {
        return -1;
    }

    number_of_data_set = 0;
    while(fgets(data_set, sizeof(data_set), fp) != NULL)
    {
        number_of_data_set++;
    }

    printf("Number of dataset : %d\n", number_of_data_set);

    fseek(fp, 0, SEEK_SET);

    *learning_data_set_table = (tLEARNING_DATA_SET*)malloc(sizeof(tLEARNING_DATA_SET) * number_of_data_set);
    //printf("%p\n", *learning_data_set_table);

    for(i = 0; i < number_of_data_set; i++)
    {
        tLEARNING_DATA_SET learning_data_set;

        fgets(data_set, sizeof(data_set), fp);

        learning_data_set = retrieveLearningDataSet(data_set);

        (*learning_data_set_table)[i].learning_data = learning_data_set.learning_data;
        (*learning_data_set_table)[i].teacher_data = learning_data_set.teacher_data;
    }

    return number_of_data_set;
}

static tLEARNING_DATA_SET retrieveLearningDataSet(char* learning_data_set_str)
{
    tLEARNING_DATA_SET data_set;

    uint16_t learning_data;
    bool     teaching_data;
    char*    token;

    uint16_t i;

    token = strtok(learning_data_set_str, " ");
    learning_data = (uint16_t)atoi(token);

    for(i = 1; i < NUMBER_OF_ASSOCIATED_COMPANY; i++)
    {
        token = strtok(NULL, " ");
        learning_data = ((learning_data << 1) + (uint16_t)atoi(token));
    }
    data_set.learning_data = learning_data;

    token = strtok(NULL, " ");
    teaching_data = (uint16_t)atoi(token);
    data_set.teacher_data = teaching_data;

    return data_set;

}

static uint16_t createCandidateAnswerPattern(void)
{
    uint16_t pattern = 0;
    uint16_t i;

    srand((unsigned)time(NULL));
    pattern = rand() % 2;

    for(i = 1; i < NUMBER_OF_ASSOCIATED_COMPANY; i++)
    {
        pattern = (pattern << 1) + (uint16_t)(rand() % 2);
    }

    return pattern;
}

static int16_t calculateScore(int number_data_set, tLEARNING_DATA_SET* learning_data_set_table, uint16_t answer_pattern)
{
    uint16_t learning_data;
    bool     teaching_data;

    uint16_t count_of_match;
    uint16_t score;

    uint16_t i, j;

    uint16_t wild_card_bit_pos;

    //printf("Answer Pattern = 0x%x\n", answer_pattern);
    srand((unsigned)time(NULL));

    score = 0;
    for(i = 0; i < number_data_set; i++)
    {
        learning_data = learning_data_set_table[i].learning_data;
        teaching_data = learning_data_set_table[i].teacher_data;

        count_of_match = 0;
        for(j = 0; j < NUMBER_OF_ASSOCIATED_COMPANY; j++)
        {
            wild_card_bit_pos = rand() % NUMBER_OF_ASSOCIATED_COMPANY;

            if(j == wild_card_bit_pos)
            {
                count_of_match += 2;
                continue;
            }

            if((answer_pattern & (1 << j)) == (learning_data & (1 << j)))
            {
                printf("+");
                count_of_match++;
            }
        }

        if((count_of_match == NUMBER_OF_ASSOCIATED_COMPANY) &&
           (teaching_data == 1))
        {
            score++;
        }
        else if((count_of_match == NUMBER_OF_ASSOCIATED_COMPANY) &&
           (teaching_data == 0))
        {
            score++;
        }

        printf("\n");
    }

    return score;
}

独学Ruby -基礎④-

tanoshiiruby.github.io

Contents


モジュール

モジュールの提供するメソッドは「モジュール名.メソッド名」で参照。

外部に公開するために、module_functionを使う。

module MyModule
    # 定数の定義
    Version = "1.0"
    
    def hello(name)
        print "Hello" , name, "\n"
    end
    
    # helloモジュールをモジュール関数として公開する
    module_function :hello
    
end

使用方法1

  • モジュール名:: でアクセス
require_relative "module_sample"

p MyModule::Version
MyModule::hello("Hoge")

使用方法2

  • includeする
require_relative "module_sample"

include MyModule
p Version
hello("Hoge")

Mix-inによる機能提供

モジュールをクラスに混ぜ合わせることをMix-inという。

クラス定義の中でincludeするとモジュールを取り込むことができる。

module MyModule
    # 提供したいメソッド
    def hello()
        print "Hello", "\n"
    end
end

class MyClass1
    # モジュールを取り込む
    include MyModule
end

class MyClass2
    # モジュールを取り込む
    include MyModule
end

呼出し元。

require_relative "mix-in_sample"

obj1 = MyClass1.new()
obj1.hello()

obj2 = MyClass2.new()
obj2.hello()

以上。