プログラミング

2019年12月19日

だいぶ前から作りたいと思っていてしばらく作業していたのですが、ようやく公開できるところまで持ってこられました。
maraigue/LTOList - GitHub

線形リスト(値を一列に並べるためのデータ構造)としては、配列や連結リストが有名ですが、
・配列は、ランダムアクセスが定数時間(速い)だが、挿入・削除は最悪線形時間(遅い)
・連結リストは、挿入・削除が定数時間(速い)だが、ランダムアクセスは最悪線形時間(遅い)
という性質があります。

LTOList(Logarithmic-Time-Operation List)は、その中間を取れるというものです。ランダムアクセスも挿入・削除も対数時間でできます。
実装としては、二分探索木に子孫のノード数情報を持たせることで実装しています。(英語のみですが、解説はGitHubのトップページで見られます)

【補足】

こうやれば対数時間が実現できる、というのは自力で思いついたのですが、調べてみると他にも取り組んでいる方はいました。私と違って二分探索木でなくスキップリストで実装していますが、それを除けば同じです。
要素の挿入、削除、ランダムアクセスが全部高速なリストを作った - kaisehのブログ

ただ、「ランダムアクセスも挿入・削除も対数時間でできる」という理論的に意味がありそうな性質を持つデータ構造ながら、決まったデータ構造の名前が付いているわけでもない、というのが気になったところだったのでした。
もしかしたら「実応用上の意義が薄い」ってのはあるのかもしれません…(そもそも二分探索木を使うことが単なる配列より遅くなる原因なうえ、この実装は単なる二分探索木以上にメモリを使うので。単なる二分探索木は1要素あたりポインタ変数が3つ必要なのですが、この構造だと5個必要)。

maraigue at 23:50コメント(0) 

2019年02月02日

以前に、C++標準で利用できるデータ構造、特にSTLのコンテナ型を使い分けることについてQiitaに書いたものを多くの方にご覧いただけていたのですが、これについて大幅加筆のうえ動画講座化したものを公開しました。

C++ STLのコンテナ型を動作効率を考えて使いこなす! | Udemy

有料講座ではありますが、一部の内容を無料でご覧いただけます。
また2月いっぱいについては、上記のリンクから辿っていただけると、購入される場合にキャンペーン価格(¥3600→¥1200)となります。※もし値引きの表示が出ていなければお問い合わせください(offkaiあっとまーくhhiro.net)。よろしければご利用ください。

【余談】
もともと動画講座化の提案を頂いたのは、上記Qiitaの内容を少しだけ含んだより広範な内容のほうだったのですが、講座としてまとまった量を書くなら上記Qiitaで扱っている「STLのコンテナ型」関連に絞ったほうがよいと思ったこと、また上記Qiitaの内容が多くの方に閲覧されているということから力を入れてまとめたいと思っていたこともあり、こちらの内容を取り扱うことにしました。

maraigue at 02:25コメント(0) 

2018年12月09日

2019年に終了予定のはてなダイアリー。こちらは、新規サービス・はてなブログへの一括移行の機能が提供されている

一方で、グループ機能を主軸としつつもはてなダイアリーと類似のブログ機能も提供しているはてなグループは、はてなブログへの一括移行の機能は提供されていない。 はてなグループは現時点で終了の予定こそないとのことだったが、はてなブログのほうが高機能化されていることもあり移行したいとは思っていた。

結局、力技で移行させた。

※以下にコードも提供しますが、あくまで「私の書いた記事がちゃんと移行できること」しか確認しておりません。利用される場合は、必ず問題なく移行できていることを確認して確定させてください。

前提

Rubyが必要です。なお私はWindowsのMSYS2上のRuby2.5.3で動かしました。古いRubyだと動かない可能性があります。また mswin32版のRubyでは動かないかもしれません。

方法

  1. text-hatenaのダウンロード
    Ruby版text-hatenaをダウンロードします。「Clone or download」ボタンから、git cloneするかZIPでダウンロードします。なお私は2013年3月20日最終更新のcommit「5798e7b」を使いました。
  2. text-hatenaを修正
    上記のtext-hatenaのファイルについて、以下の修正を加えます。
    • lib/text/hatena/auto_link/asin.rb について、
      <%- item.manufacturer.each do |manufacturer| -%>
      <%- item.manufacturer.each_line do |manufacturer| -%> に修正
    • lib/text/hatena/html_filter.rb について、
      @html << text
      @html << text.force_encoding("ASCII-8BIT") に修正
    • lib/text/hatena/utils/htmlsplit.rb について、
      def initialize(html = nil, encoding = $KCODE)
      def initialize(html = nil, encoding = "ASCII-8BIT") に修正
  3. text-hatenaをインストール
    ダウンロードしたファイルがあるディレクトリ(README等があるディレクトリ)にて、以下のコマンドを実行します。
    rake gem
    gem install pkg/text-hatena-0.12.20080627.0.gem
  4. MovableType形式に変換するスクリプトを実行
    hatenagroup2movabletype.rbをダウンロードし実行します。実行方法は以下の通りです。
    hatenagroup2movabletype.rb エクスポートしたXMLファイル > 適当なファイル名.txt
  5. はてなブログでインポートする
    ブログの設定画面(ブログが複数あるならばその設定画面)にて、インポート→一般のブログ を選び、「ブログデータをアップロード」を「MovableType形式」で行います。これで基本的には対応できるかと思います。

注意点

  • コメントは保存しません。(やろうと思えば出来たのだが)
  • 1日に複数の記事がある場合は、それぞれを個別のブログ記事として保存します。その際、記事IDから投稿時刻が判断できる場合はその時刻で保存しますが、判断できない場合は23:59:59(複数ある場合は、次が23:59:58、もう一つあれば23:59:57、…)として保存します。
  • 日付に対してタイトルが付いている場合は無視されます。記事単位のタイトルのみが残ります。
  • HTMLタグは、text-hatenaで事前に規定されたもののみ維持されます。維持されてほしいのだけど維持されていないタグがある場合、lib/text/hatena/html_filter.rb 中の「@allowtag」「@allallowattr」「@allowattr」を書き加えることで対応できます。私は以下のようにしました。
    @allowtag = Regexp.union(/^(a|abbr|acronym|address|b|base|basefont|big|blockquote|br|col|em|caption|center|cite|code|div|dd|del|dfn|dl|dt|fieldset|font|form|hatena|h\d|hr|i|iframe|img|input|ins|kbd|label|legend|li|meta|noscript|ol|optgroup|option|p|pre|q|rb|rp|rt|ruby|s|samp|script|select|small|span|strike|strong|sub|sup|table|tbody|td|textarea|tfoot|th|thead|tr|tt|u|ul|var)$/, /^#{@additional_allowtag.keys.join('|')}$/)
    @allowattrは以下の行を追加::iframe => 'frameborder|scrolling|marginheight|marginwidth|src', ならびに :script => 'src|data-id|data-size|data-border|charset|async',

方針

はてな記法をそのまま残したインポートができれば一番よかったのだが、それが難しそうだったので、一度HTML化することにした。このためにtext-hatenaというライブラリを使うことにしたのだが、Rubyの新しいバージョンに対応していない箇所がところどころあったので修正して使っている。

MovableType形式への変換は完全に手作業である。仕様が単純なので何とかなった。仕様は Movable Type のブログ記事インポートフォーマット | CMSプラットフォーム Movable Type ドキュメントサイト を参照。



maraigue at 19:12コメント(0) 

2017年03月25日

でじぽろ#13 & 札幌C++勉強会 - connpass

3月19日(日)に開催しました。
でじぽろが開催を検討していたところに、札幌C++勉強会も加わらせていただく形で開催しました。

でじぽろとは

  • 初心者に優しく
  • 他の勉強会への踏み台
  • 発表者が話したいことを話す
を三本の柱として、
  • 「IT技術に興味はあるけど、北海道の勉強会ってよくわかんないしハードルが高い」と感じてる方や、
  • 「Linuxには触ったことがあるけど、武器にできる言語がまだない」方や、
  • 「Linuxを触ったことがないけど、興味がある」
といったレベルの方に照準を合わせて行います。

でじぽろ - connpass

もっと初心者向けな勉強会が欲しくない?ということで立ち上げられた勉強会、と聞いていました。
ということ自体は話として知っていたのですが、普段札幌にいない身としては、雰囲気を実際に感じ取ることができたのはよかったなと思いました。やっぱり、勉強会に参加しないと勉強会の…もっといえばその地域のコミュニティに対する肌感覚って得られないなあというのは感じました。
初心者でもどんどん発表していこう、という雰囲気を作っているのだなというのが感じられました。

私の発表

これまでC++勉強会ではライブラリの活用等について話すことが多かった私ですが、C++はそれを話すとどうしても込み入った話になってしまうことが多い(計算時間とかメモリとか)ため、初心者向けというでじぽろのコンセプトも考慮し、今回は「C++で〜をしたければ標準ライブラリの〜を使おう」ということを紹介していくという内容にしました。
C++を初めて使う方には他の言語の比較になるように、またC++をすでに使っている方も「知らないライブラリに出会えるかもしれない」ということを目指した内容にしました。

C++11以降ではスマートポインタ・スレッド・関数オブジェクト関連など標準化されたライブラリも増えたので、このあたりもちゃんと紹介しました。併せて、「今の最新のコンパイラならC++11の機能はだいたい使えるよ」ということも強調しておきました。



maraigue at 18:14コメント(0)トラックバック(0) 

2017年02月12日

名古屋Ruby会議03

2月11日、地域Ruby会議の「名古屋Ruby会議03」が開催された。
私はスタッフとしてお手伝いさせていただいた。

私は名古屋に移ってきてから、Ruby東海に参加できるときは参加するようにしていた。
そんなことで、名古屋Ruby会議が開催されるとなれば出なければ!…と思っていたのだが、仕事の繁忙期にぶつかるため参加は不透明に。
ただその後、仕事の状況から参加できそうになったため参加することに。

いくつかピックアップしてレポートを。

全体として

今回の会場は、大須演芸場という、普段は落語等で利用している会場。そんなこともあって、発表者の表示はめくりで、めくりや幟のフォントも寄席文字。発表は座布団に正座。
また、発表内容も落語を意識した構成(マクラ・オチ)にしていた人がいた。

IMG_-giz2q8

小芝敏明さん「Ruby/Railsはじめてチームの力をメキメキつけた!」

氏が、すでに動いているチームに対して開発力を高めるための施策を行ったときの話。
行ったこととしては「issueを終わらせる」「ペア作業習慣を付ける」「デプロイ方法の統一(開発と本番)」「開発環境の統一」「ドキュメンテーション」。精神的に作業しやすいことも重要とのこと。ちなみに、そのチームはすでにテストやCIを利用していたこともあり、氏はこれは改善はしやすそうかな?と感じたとのこと。
結果、開発の進展が6倍程度よくなったとのこと。それなりに開発のための環境を整えていても、やり方次第でここまでよくできるんだな…と。

須藤功平さん「Apache ArrowのRubyバインディングをGObject Introspectionで

メモリ上の異なるデータフォーマットのデータをやり取りするためのシステム「Apache Arrow」をRubyから利用するためのライブラリ。
Rubyで用意したデータ(Rroonga)をPythonの機械学習ライブラリに与え、その結果をさらにRubyに戻して結果を表示…ということをデモで示されていた。

三浦英樹さん「mrubyのJIT」
奥村晃弘さん「Dynamic certificate internals with ngx_mruby」(参考:2016年10月のGMO HosCon 2016での発表資料
近藤宇智朗さん「未来のサーバ基盤へのHaconiwa/mrubyの関わり - コンテナ仮想化のその先へ

怒涛のmruby(組み込みなどを想定したRuby)3連続。
ここを聞いて思ったのは、mrubyは単にパフォーマンスに制約がある場合のためのものではなく、CRubyよりパフォーマンスを出すためにも利用できるということ。またHaconiwaにおいては、システムコールを利用することとの兼ね合いでCRubyよりもmrubyのほうが有利であるという理由でmrubyを利用しているとのことであった。

antimon2さん「RubyでTensorFlow

結論:「RubyでTensorFlowは辛い」………(´・ω・`)
バインディングが簡単に作れないライブラリは辛い。

クックパッド様(スポンサーLT)

クックパッドの悩みは、世界最大のRailsによるサービスでないかと言われるくらいに肥大化してしまったこと、とのこと。静的解析もまともにできないとのことで、デプロイは何とかできるようにしているが、今後は分割していきたいとのことだった。

大喜利

つまりはパネルディスカッションである。須藤さん・mzpさん・咳さんが参戦。
即答するのが難しい話題が増えてきたところに、会場から一人がさらに参戦させられることになり、結局竜之介さんが途中から参戦することに。
須藤さんとmzpさんで二度も意見が対立したのが個人的なハイライト。(collect派の須藤さん vs map派のmzpさん、「次にRuby会議をしたい場所」という質問に対して「青森出身だから東北でやりたい」という須藤さんに対して「名古屋から東北行きづらい」と言ったmzpさん)



maraigue at 02:40コメント(0)トラックバック(0) 

2017年01月05日

公開した。Ruby CGIで動くソフトです。

maraigue/lastupdatelist: タスクを最後に実施した日を記録/表示する

作った経緯

もともと、一人暮らしするようになって「いつ最後に●●●を洗濯/掃除したっけ…」ってのを覚えておくのが難しかったので、それを管理するためのソフトとして作ったのであった。
タスクを実施した直近2回の日時を記録しておくことができるようになっている。

このソフトの原型は1年近く前に作っていて、非公開で個人的に使っていたのだが、思い立ってこの年末年始休みを使って公開可能な形に持っていった。
公開するにあたって改良したのはこんなところ。

  • 認証に対応していなかった(非公開の当時はBASIC認証をかけていた)ため、Cookieを利用したパスワード認証を可能にした。RubyのCGIライブラリにはその辺をすべてラップしてくれる機能があるので(CGI::Session)、(楽とまではいかないけど)一から書くのに比べればだいぶ簡単に作れた。
  • 簡易Webサーバのスクリプトを追加し、別途Webサーバにアップしなくても動かせるようにした。
  • 言語の切り替えを可能にした。

同じような悩みをお持ちの方、使ってみていただけると幸いです。

Last Update List スクリーンショット



maraigue at 23:11コメント(0)トラックバック(0) 

2016年12月10日

この記事は、Kawaz Advent Calendar 2016の12/7ぶんです。Kawazのサイト内で公開されている記事と同じものです。

担当の日を勘違いして2日遅刻した。

概要

今年に入って、sapporo.cppの企画においてopenFrameworksという、ゲーム向きなマルチプラットフォームフレームワークを使い始めたのですが、そんなこともあって最近は個人的な制作物にも使い始めるようになった。
ということで、openFrameworksを使っての感想とか気づいたことを紹介するとともに、最近作ったもの「スクロールバー」を紹介する。

経緯をもう少し詳しく

昨年のKawaz Advent CalendarにてオセロAIを作ったという話を書いたのだが、こういったものをGUIで動くようにすればもっと目を引くのでは?ということで作ったのであった。

こちらで、作成した「4目並べ」を公開しています(sapporo.cppとしての制作物です)。sapporocpp/4moku: 4目並べ

使ってみての感想

  • 基本的には、よくありそうなゲーム向けフレームワークという雰囲気。
  • 割と便利だと思ったもの
    • 最小限のフォントが組み込まれている。デバッグ表示したいときとかに便利。
    • 画面表示に限らず、ファイル読み込みとかスレッドといったものに対しても、プラットフォームに依存せずコードを書くためのラッパーが提供されている。ファイルを開くとかのダイアログも提供されていたのだが、非ASCII文字が正常に扱えない(もしかしたらWindowsの場合のみ?)という問題があって利用を断念した。
  • WindowsとAndroidのマルチプラットフォームを対応したかったのですが、そもそもAndroid向けサンプルプログラムのビルドを通すことすらできず断念しました…。なお開発環境としてWindowsのほかUbuntuで試してもだめでした。
    • 結局現在は、Windows向けアプリ制作のために使っています。Visual Studioから使うのがすごく楽なので。(公式サイト内に掲載の手順に従えば簡単に動く)
  • この手のフレームワークではよくあることではありますが、グローバルな状態管理(例:描画色を指定する関数ofSetColorはグローバルに機能する)が多い。
    • 最近罠にはまったのは、ofSetColorが読み込んだ画像の描画にも適用されるということ(例えば、ofSetColorで赤を指定したら、読み込んだ画像を描画する際に赤みがかかる。元の色で表示したければofSetColor(255)を事前に呼んでおかないとならない)。

作ったもの:スクロールバー

openFrameworks向けスクロールバー

openFrameworksにスクロールバーが欲しくなって作った、というもの。
まあWindows APIを呼んで生成してもよかったのだが、他に何かに使えるかもということで自分で作ってみた。作って公開している人が他に見当たらなさそうだったし(いるのかもしれないけど)。

ソースコード/サンプルプログラムはこちら。GitHub - maraigue/ScrollBar4OF

なぜこれを作ったのか

もともとは某音楽ゲームの譜面シミュレータを作りたかったのだが、その過程でスクロールバーがないと操作しにくい、ということで作成することにした。

じゃあ何で某音楽ゲームの譜面シミュレータを作りたかったかというと、「音楽ゲームの難易度表示が妥当か機械学習的に判断したい」という構想があって、それをするためには譜面が入力できないとどうしようもない、という事情があったのである。また、(自分が作ろうとしている件の音楽ゲームについて)そういうツールを作っている人もいなさそうなのでじゃあ作ろうかな、という気持ちもあった。
これはこれで、出来上がったらどこかで記事にします。

実装のポイント
  • 座標計算は工夫した。スクロールバーは縦と横の両方を出せるようにしたかったのだが、その両者でなるべくソースコードを共通化したかったのである。そのため、
    • 縦横のスクロールバーで共通のコードについては、座標計算に縦横という概念を用いず、「スクロールバーの長さ方向の座標」「スクロールバーの幅方向の座標」というものを導入した。
    • 上記の座標と、普通の(画面表示における)縦横の座標を変換するクラスを作り、それをテンプレートの引数に与えることで、縦スクロールバー・横スクロールバーを出せるようにした。
  • 境界条件(取りうる値の最大値/最小値を超過しないか、など)は結構気を使った。
  • スクロールバー内部の状態管理を行う変数が増えてしまうのは、仕方ないとはいえ面倒だった。例えば「現在ツマミをドラッグしている途中である」とか「マウスをクリックしてから押しっぱなしにしている」とか。

(割と)汎用的に作ったつもりなので、openFrameworksで必要な方はもちろん、他のプラットフォームに対する移植もしやすいほうじゃないか…と思っています。



maraigue at 01:58コメント(0)トラックバック(0) 

2016年11月10日

Boost.勉強会 #21 札幌

開催しました。
前回が2014年5月だったので、2年半ぶりです。
今回もまた、北海道外からも多数の参加者がありました。
そして地元の方にとっても、これによってC++に対する意識、意欲が高まってくれていれば幸いです。

まとめとか

発表資料(すでに公開されているもののみ) Boost.勉強会 #21 札幌 - 資料一覧 - connpass

睦月さんがTwitter投稿をまとめてくださってました。Boost.勉強会 #21 札幌 - Togetterまとめ

私の発表

C++1zで標準化が濃厚となったライブラリ「string_view」について話しました。

2012年11月の勉強会で、私が作成したライブラリ「fundoshi.hpp」を紹介したのですが、その後になって同様のライブラリがBoostに入っていたBoost.string_ref)ことを知り、さらに2016年になって次期のC++標準規格「C++1z」(「C++17」とも)で標準化されることが有力となったため、今回紹介することにしたものです。

他の発表を簡単に紹介

ignisさん「Boost.GILではじめる画像修復 & Pythonから利用してみる」
画像修復(例:ところどころが塗りつぶされたような画像について、その部分を検出して本来あったと思われる内容を補完する)の考え方とC++による実装の話。
画像修復の基本的な考え方は、(1)画像がどのように変形させられるかを定式化し、(2)その変形を関数とみたとき、逆関数を求めて適用し画像を復元する、というものになる。ただ逆関数といっても単純に計算できなかったり、一意に値が定まらない場合もあるので、そこはもちろん何らかの対策を考えないとならない。という話がなされた。
Boost.GILでの実装についての話としては、テンプレートを活用することで画像の特性(モノクロなのかカラーなのか、など)を問わない処理が容易に書けること、また私の発表でも示した「ビュー」(文字列なら文字列、画像なら画像の一部を参照するためのクラス)がBoost.GILでも多用されていることなどが説明された。
最後に、C++で書いたコードをPythonから利用するための方法についての話。これまでにもBoost.Pythonというものはあったが、それよりも使いやすい「PyBind11」というものがあり、こちらがいいよ!ということを力説。なお名前の通り、C++11に対応したコンパイラを利用する必要がある。
redboltzさん「CppCon2016 参加報告」「急速に進化するBoost.SML」
前半は、C++の国際会議「CppCon」の参加報告。氏はこれまでにも「C++Now」という別の会議に出たことはあったものの、CppConには今回初めて参加したとのこと。CppConはC++Nowと違って、運営がプロの手によるものであり(C++Nowはコミュニティ的)、仕事の早さなどを感じたとのこと。また今回のCppConでは「ゼロオーバーヘッド抽象化」がちょくちょく扱われていたとのこと。
後半は、Boost.SMLという、コンパイル時に行える状態遷移の表現を記述する(状態遷移の表現を実行時に構築する必要がなく、バイナリに組み込まれるようにできる)ライブラリの紹介。すでにBoost.MSMというものもあったものの、こちらのほうがかなり高速とのこと。ただしC++14に対応したコンパイラが必要である。
なお、この発表に向けてredboltzさんは、Wandbox(ブラウザ上でコードを書いて実行できる)の中の人・めるぽんさんに、Boost.SMLに対応するよう依頼していたとのこと。結果、Wandboxでサンプルコードが動いていた。
Flastさん「Boost.Fusion/Phoenixのメンテナになったのでその記念的ななにか in 札幌」
メインで話されたのは、スレッドやプロセスを抽象化するライブラリについての紹介(なお、Boost.FusionやBoost.Phoenixはそういうライブラリというわけではない)。Boost.Fiber(途中で動きを止めることで複数のFiberにある処理を代わる代わる進めることができる。完全に並列で動かせるわけではない)の紹介、Boost.Process(プロセスの新規起動など)が入るかもしれないという話をされていた。また氏は「(Boost.Hanaが登場したことで)Boost.Fusion終わるのですか?」という質問を受けたとのことで、それに対し「まだサポートは続くよ」ということを話していた。
【LT】hiyohiyoさん「C++でNVMeと(*´Д`)ハァハァ 戯れていたら一年経ってた。」
NVMe(NVM express、ハードドライブを接続する際の物理インターフェイスでSSDにも適した高速規格)について。CrystalDiskMark(ストレージのデータ転送速度測定ソフト)をWindows 10 Appとして公開した話や、他者からもらったコードがDelphiで書かれていて移植に苦戦したため「ステップ実行して挙動を確かめた」という話が。
【LT】egtraさん「Visual C++コンパイラのコードの注釈機能について」
引数に _In_, _Out_ などを付けることで、意図しない挙動が発生する場合に警告を出す機能の紹介。自分で書けないこともないがなかなか大変とのこと。今回は未初期化変数の警告、nullptrの可能性がある値に対する警告、配列の添字に対する警告を出すことについて紹介されていた。


maraigue at 22:57コメント(0)トラックバック(0) 

2016年04月03日

去る3月19日(土)に、札幌C++勉強会 #11 - connpassを開催しました。

現在、主に運営をしているメンバーが札幌にいない状況ではありますが(私と@ignis_fatuusさん)、二人が時折札幌に戻るときに実施しています。その前の第10回(2015年12月26日)も、二人が帰省するタイミングを狙って計画したものでした。
※なお、「札幌やその周辺に住んでいて、C++勉強会を計画したい!」という方がいましたら歓迎ですのでご一報ください。

私の発表

名古屋に移って研究の内容が大きく変わったわけなのですが、そこで行うようになったことをテーマに話しました。

「関数の最小化」は、中学や高校を含め、数学ではよく出る問題です。これはより一般には「最適化」と呼ばれる問題にあたり、機械学習の分野でもこれは非常に重要な考え方であるという話です。

最近「ビッグデータ」などと呼ばれるように、データがたくさん手に入るようになったことから、それを分析する手段の開発も重要となっています。人間は「事例を見て、行うべき判断などを知る」という「学習」を行いますが、コンピュータ上で手段は違えど「事例を見て、行うべき判断などを知る」ということを行わせる、というのが「機械学習」です。例えば迷惑メールフィルタを作ることを例に取ると、迷惑メールになる条件を人手で記述するのではなく、ユーザの迷惑メール報告をもとに構築するのが機械学習の考え方ということになります。

機械学習の実際の計算においては、手法によって違いはありますが、簡略化して書くと以下のような手順を踏むことになります。

  • 結果(上記の例でいえば「迷惑メールであるか否か」)を表現する関数やデータ構造の形(例えば、「データを x, y としたとき、 p(x, y) = ax + by + c の形で書ける関数」)を決める。
  • 関数 p(x, y) が、すでに持ち合わせているデータ(訓練データという。上記の例でいえば「すでに報告されている迷惑メール」)からどれだけ離れているかを表す関数 f(a, b, c) を作る。
  • f(a, b, c) を最小化するような a, b, c を求め、p(x, y) に適用する。これが「訓練データをもっともよく反映した、結果を表現する関数」となる。

特に機械学習を行うという観点では、その関数 f(a, b, c) の最小化が実際に計算できないのでは、学習結果も得られないことになってしまうため、どんな関数であれば計算が容易なのか判断することは非常に大事です。詳細は資料中で解説していますが、この問題を考えるにあたって重要なキーワードとして、「極小値」や「凸関数」というものがあります。

C++のソースコードも用意しています(github: maraigue/sapporocpp-20160319)。簡単な実装ではありますが、機械学習の簡単な例である線形分類(「男性と女性」など2種類に分けられるデータ点を、2次元なら直線、3次元なら平面…で分ける最良のものを出力する)のサンプルも用意しています。



maraigue at 01:52コメント(0)トラックバック(0) 

2015年10月21日

知っている方には何のことはないのでしょうけど、「ぐぐれなくて困った案件」として。

PHPでは通常、<?phpで始まって?>で終わる部分をPHPのプログラムが書かれた部分として実行し、残りの部分(典型的にはHTMLを書く)をそのまま出力するのだが、以前使っていたPHPの設定では、それに加えて<??>でもPHPのプログラムと扱っていたのである。

VPSでPHPを別途インストールした際、この後者の方法が使えなくなっており、本来PHPプログラムであるものがそのまま出力されたりなど困ったことになった。

その際、最初は「PHP クエスチョン」などでぐぐってみたのだが(「<?php」でぐぐっても「php」とみなされてしまう)それらしい答えは見つからなかった。ではどうしようと次に見たのがPHPの公式マニュアルだったのだが、そこで「言語リファレンス」→「PHP タグ」を開くとちゃんと書いてあった。
PHP では、短い形式の開始タグ <? も使えます (しかしこれはおすすめしません。というのも、この形式のタグは php.ini で short_open_tag を有効にするか --enable-short-tags オプションつきで PHP を configure した場合でないと使えないからです)。
PHP: PHP タグ - Manual
ということで、php.ini中に「short_open_tag = On」という一行を加えて解決。

maraigue at 00:40コメント(0)トラックバック(0) 
livedoor プロフィール

H. Hiro

  • ライブドアブログ