Help
RSS
API
Feed
Maltego
Contact
Domain > blog.beam2d.net
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2024-02-10
188.114.96.11
(
ClassC
)
2026-02-11
172.67.190.245
(
ClassC
)
Port 80
HTTP/1.1 200 OKDate: Wed, 11 Feb 2026 04:43:33 GMTContent-Type: text/html; charsetUTF-8Transfer-Encoding: chunkedConnection: keep-aliveExpires: Wed, 11 Feb 2026 04:43:33 GMTCache-Control: private, max-age0Last-Modified: Tue, 24 Sep 2024 18:10:57 GMTNel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Report-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?s%2B91jJIGWbIJ%2FcFE4aTKjrEf2mOQ45m74imvlFSuMcB5SghOnYWAa2Cs0KFohdhU7s035u5GEDL%2BhPg5c0SwGtOV5CftFawF8dRa8fdE%3D}}X-Content-Type-Options: nosniffX-XSS-Protection: 1; modeblockServer: cloudflarecf-cache-status: DYNAMICvary: accept-encodingCF-RAY: 9cc12f9cc99bcb5f-PDXalt-svc: h3:443; ma86400 !DOCTYPE html>html classv2 dirltr langja>head>link hrefhttps://www.blogger.com/static/v1/widgets/335934321-css_bundle_v2.css relstylesheet typetext/css/>meta contentwidth1100 nameviewport/>meta contenttext/html; charsetUTF-8 http-equivContent-Type/>meta contentblogger namegenerator/>link hrefhttp://blog.beam2d.net/favicon.ico relicon typeimage/x-icon/>link hrefhttp://blog.beam2d.net/ relcanonical/>link relalternate typeapplication/atom+xml titleビームの報告書 - Atom hrefhttp://blog.beam2d.net/feeds/posts/default />link relalternate typeapplication/rss+xml titleビームの報告書 - RSS hrefhttp://blog.beam2d.net/feeds/posts/default?altrss />link relservice.post typeapplication/atom+xml titleビームの報告書 - Atom hrefhttps://www.blogger.com/feeds/8241445299985430179/posts/default />link relme hrefhttps://www.blogger.com/profile/16450714075725786395 />!--Cant find substitution for tag blog.ieCssRetrofitLinks-->meta contenthttp://blog.beam2d.net/ propertyog:url/>meta contentビームの報告書 propertyog:title/>meta content propertyog:description/>title>ビームの報告書/title>style idpage-skin-1 typetext/css>!--/*-----------------------------------------------Blogger Template StyleName: Awesome Inc.Designer: Tina ChenURL: tinachen.org----------------------------------------------- *//* Variable definitionsVariable namekeycolor descriptionMain Color typecolor default#ffffff/>Group descriptionPage selectorbody>Variable namebody.font descriptionFont typefontdefaultnormal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namebody.background.color descriptionBackground Color typecolor default#000000/>Variable namebody.text.color descriptionText Color typecolor default#ffffff/>/Group>Group descriptionLinks selector.main-inner>Variable namelink.color descriptionLink Color typecolor default#888888/>Variable namelink.visited.color descriptionVisited Color typecolor default#444444/>Variable namelink.hover.color descriptionHover Color typecolor default#cccccc/>/Group>Group descriptionBlog Title selector.header h1>Variable nameheader.font descriptionTitle Font typefontdefaultnormal bold 40px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable nameheader.text.color descriptionTitle Color typecolor default#333333 />Variable nameheader.background.color descriptionHeader Background typecolor defaulttransparent />/Group>Group descriptionBlog Description selector.header .description>Variable namedescription.font descriptionFont typefontdefaultnormal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namedescription.text.color descriptionText Color typecolordefault#333333 />/Group>Group descriptionTabs Text selector.tabs-inner .widget li a>Variable nametabs.font descriptionFont typefontdefaultnormal bold 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable nametabs.text.color descriptionText Color typecolor default#333333/>Variable nametabs.selected.text.color descriptionSelected Color typecolor default#333333/>/Group>Group descriptionTabs Background selector.tabs-outer .PageList>Variable nametabs.background.color descriptionBackground Color typecolor default#141414/>Variable nametabs.selected.background.color descriptionSelected Color typecolor default#444444/>Variable nametabs.border.color descriptionBorder Color typecolor default#aab123/>/Group>Group descriptionDate Header selector.main-inner .widget h2.date-header, .main-inner .widget h2.date-header span>Variable namedate.font descriptionFont typefontdefaultnormal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namedate.text.color descriptionText Color typecolor default#666666/>Variable namedate.border.color descriptionBorder Color typecolor default#aab123/>/Group>Group descriptionPost Title selectorh3.post-title, h4, h3.post-title a>Variable namepost.title.font descriptionFont typefontdefaultnormal bold 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namepost.title.text.color descriptionText Color typecolor default#333333/>/Group>Group descriptionPost Background selector.post>Variable namepost.background.color descriptionBackground Color typecolor default#fefdfa />Variable namepost.border.color descriptionBorder Color typecolor default#aab123 />Variable namepost.border.bevel.color descriptionBevel Color typecolor default#aab123/>/Group>Group descriptionGadget Title selectorh2>Variable namewidget.title.font descriptionFont typefontdefaultnormal bold 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namewidget.title.text.color descriptionText Color typecolor default#333333/>/Group>Group descriptionGadget Text selector.sidebar .widget>Variable namewidget.font descriptionFont typefontdefaultnormal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namewidget.text.color descriptionText Color typecolor default#333333/>Variable namewidget.alternate.text.color descriptionAlternate Color typecolor default#666666/>/Group>Group descriptionGadget Links selector.sidebar .widget>Variable namewidget.link.color descriptionLink Color typecolor default#d52a33/>Variable namewidget.link.visited.color descriptionVisited Color typecolor default#7d181e/>Variable namewidget.link.hover.color descriptionHover Color typecolor default#d52a33/>/Group>Group descriptionGadget Background selector.sidebar .widget>Variable namewidget.background.color descriptionBackground Color typecolor default#141414/>Variable namewidget.border.color descriptionBorder Color typecolor default#222222/>Variable namewidget.border.bevel.color descriptionBevel Color typecolor default#000000/>/Group>Group descriptionSidebar Background selector.column-left-inner .column-right-inner>Variable namewidget.outer.background.color descriptionBackground Color typecolor defaulttransparent />/Group>Group descriptionImages selector.main-inner>Variable nameimage.background.color descriptionBackground Color typecolor defaulttransparent/>Variable nameimage.border.color descriptionBorder Color typecolor defaulttransparent/>/Group>Group descriptionFeed selector.blog-feeds>Variable namefeed.text.color descriptionText Color typecolor default#333333/>/Group>Group descriptionFeed Links selector.blog-feeds>Variable namefeed.link.color descriptionLink Color typecolor default#d52a33/>Variable namefeed.link.visited.color descriptionVisited Color typecolor default#7d181e/>Variable namefeed.link.hover.color descriptionHover Color typecolor default#d52a33/>/Group>Group descriptionPager selector.blog-pager>Variable namepager.background.color descriptionBackground Color typecolor default#fefdfa />/Group>Group descriptionFooter selector.footer-outer>Variable namefooter.background.color descriptionBackground Color typecolor default#fefdfa />Variable namefooter.text.color descriptionText Color typecolor default#333333 />/Group>Variable nametitle.shadow.spread descriptionTitle Shadow typelength default-1px/>Variable namebody.background descriptionBody Background typebackgroundcolor#fcfbf5default$(color) none repeat scroll top left/>Variable namebody.background.gradient.cap descriptionBody Gradient Cap typeurldefaultnone/>Variable namebody.background.size descriptionBody Background Size typestring defaultauto/>Variable nametabs.background.gradient descriptionTabs Background Gradient typeurldefaultnone/>Variable nameheader.background.gradient descriptionHeader Background Gradient typeurl defaultnone />Variable nameheader.padding.top descriptionHeader Top Padding typelength default22px />Variable nameheader.margin.top descriptionHeader Top Margin typelength default0 />Variable nameheader.margin.bottom descriptionHeader Bottom Margin typelength default0 />Variable namewidget.padding.top descriptionWidget Padding Top typelength default8px />Variable namewidget.padding.side descriptionWidget Padding Side typelength default15px />Variable namewidget.outer.margin.top descriptionWidget Top Margin typelength default0 />Variable namewidget.outer.background.gradient descriptionGradient typeurl defaultnone />Variable namewidget.border.radius descriptionGadget Border Radius typelength default0 />Variable nameouter.shadow.spread descriptionOuter Shadow Size typelength default0 />Variable namedate.header.border.radius.top descriptionDate Header Border Radius Top typelength default0 />Variable namedate.header.position descriptionDate Header Position typelength default15px />Variable namedate.space descriptionDate Space typelength default30px />Variable namedate.position descriptionDate Float typestring defaultstatic />Variable namedate.padding.bottom descriptionDate Padding Bottom typelength default0 />Variable namedate.border.size descriptionDate Border Size typelength default0 />Variable namedate.background descriptionDate Background typebackground colortransparentdefault$(color) none no-repeat scroll top left />Variable namedate.first.border.radius.top descriptionDate First top radius typelength default5px />Variable namedate.last.space.bottom descriptionDate Last Space Bottom typelengthdefault20px />Variable namedate.last.border.radius.bottom descriptionDate Last bottom radius typelength default5px />Variable namepost.first.padding.top descriptionFirst Post Padding Top typelength default0 />Variable nameimage.shadow.spread descriptionImage Shadow Size typelength default0/>Variable nameimage.border.radius descriptionImage Border Radius typelength default0/>Variable nameseparator.outdent descriptionSeparator Outdent typelength default15px />Variable nametitle.separator.border.size descriptionWidget Title Border Size typelength default1px />Variable namelist.separator.border.size descriptionList Separator Border Size typelength default1px />Variable nameshadow.spread descriptionShadow Size typelength default0/>Variable namestartSide descriptionSide where text starts in blog language typeautomatic defaultleft/>Variable nameendSide descriptionSide where text ends in blog language typeautomatic defaultright/>Variable namedate.side descriptionSide where date header is placed typestring defaultright/>Variable namepager.border.radius.top descriptionPager Border Top Radius typelength default5px />Variable namepager.space.top descriptionPager Top Space typelength default1em />Variable namefooter.background.gradient descriptionBackground Gradient typeurl defaultnone />*/pre.prettyprint { font-size: 85%; }/* Content----------------------------------------------- */body {font: normal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #333333;background: #fcfbf5 none repeat scroll top left;}html body .content-outer {min-width: 0;max-width: 100%;width: 100%;}a:link {text-decoration: none;color: #d52a33;}a:visited {text-decoration: none;color: #7d181e;}a:hover {text-decoration: underline;color: #d52a33;}.body-fauxcolumn-outer .cap-top {position: absolute;z-index: 1;height: 276px;width: 100%;background: transparent none repeat-x scroll top left;_background-image: none;}/* Columns----------------------------------------------- */.content-inner {padding: 0;}.header-inner .section {margin: 0 16px;}.tabs-inner .section {margin: 0 16px;}.main-inner {padding-top: 30px;}.main-inner .column-center-inner,.main-inner .column-left-inner,.main-inner .column-right-inner {padding: 0 5px;}*+html body .main-inner .column-center-inner {margin-top: -30px;}#layout .main-inner .column-center-inner {margin-top: 0;}/* Header----------------------------------------------- */.header-outer {margin: 0 0 0 0;background: transparent none repeat scroll 0 0;}.Header h1 {font: normal normal 48px Georgia, Utopia, Palatino Linotype, Palatino, serif;color: #333333;text-shadow: 0 0 -1px #000000;}.Header h1 a {color: #333333;}.Header .description {font: normal normal 20px Georgia, Utopia, Palatino Linotype, Palatino, serif;color: #908d6a;}.header-inner .Header .titlewrapper,.header-inner .Header .descriptionwrapper {padding-left: 0;padding-right: 0;margin-bottom: 0;}.header-inner .Header .titlewrapper {padding-top: 22px;}/* Tabs----------------------------------------------- */.tabs-outer {overflow: hidden;position: relative;background: #b3ca88 url(http://www.blogblog.com/1kt/awesomeinc/tabs_gradient_light.png) repeat scroll 0 0;}#layout .tabs-outer {overflow: visible;}.tabs-cap-top, .tabs-cap-bottom {position: absolute;width: 100%;border-top: 1px solid #908d6a;}.tabs-cap-bottom {bottom: 0;}.tabs-inner .widget li a {display: inline-block;margin: 0;padding: .6em 1.5em;font: normal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #333333;border-top: 1px solid #908d6a;border-bottom: 1px solid #908d6a;border-left: 1px solid #908d6a;}.tabs-inner .widget li:last-child a {border-right: 1px solid #908d6a;}.tabs-inner .widget li.selected a, .tabs-inner .widget li a:hover {background: #63704b url(http://www.blogblog.com/1kt/awesomeinc/tabs_gradient_light.png) repeat-x scroll 0 -100px;color: #ffffff;}/* Headings----------------------------------------------- */h2 {font: normal bold 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #333333;}/* Widgets----------------------------------------------- */.main-inner .section {margin: 0 27px;padding: 0;}.main-inner .column-left-outer,.main-inner .column-right-outer {margin-top: 0;}#layout .main-inner .column-left-outer,#layout .main-inner .column-right-outer {margin-top: 0;}.main-inner .column-left-inner,.main-inner .column-right-inner {background: transparent none repeat 0 0;-moz-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 0 rgba(0, 0, 0, .2);box-shadow: 0 0 0 rgba(0, 0, 0, .2);-moz-border-radius: 5px;-webkit-border-radius: 5px;-goog-ms-border-radius: 5px;border-radius: 5px;}#layout .main-inner .column-left-inner,#layout .main-inner .column-right-inner {margin-top: 0;}.sidebar .widget {font: normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #333333;}.sidebar .widget a:link {color: #d52a33;}.sidebar .widget a:visited {color: #7d181e;}.sidebar .widget a:hover {color: #d52a33;}.sidebar .widget h2 {text-shadow: 0 0 -1px #000000;}.main-inner .widget {background-color: #fefdfa;border: 1px solid #aab123;padding: 0 15px 15px;margin: 20px -16px;-moz-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 20px rgba(0, 0, 0, .2);box-shadow: 0 0 20px rgba(0, 0, 0, .2);-moz-border-radius: 5px;-webkit-border-radius: 5px;-goog-ms-border-radius: 5px;border-radius: 5px;}.main-inner .widget h2 {margin: 0 -0;padding: .6em 0 .5em;border-bottom: 1px solid transparent;}.footer-inner .widget h2 {padding: 0 0 .4em;border-bottom: 1px solid transparent;}.main-inner .widget h2 + div, .footer-inner .widget h2 + div {border-top: 1px solid #aab123;padding-top: 8px;}.main-inner .widget .widget-content {margin: 0 -0;padding: 7px 0 0;}.main-inner .widget ul, .main-inner .widget #ArchiveList ul.flat {margin: -8px -15px 0;padding: 0;list-style: none;}.main-inner .widget #ArchiveList {margin: -8px 0 0;}.main-inner .widget ul li, .main-inner .widget #ArchiveList ul.flat li {padding: .5em 15px;text-indent: 0;color: #666666;border-top: 0 solid #aab123;border-bottom: 1px solid transparent;}.main-inner .widget #ArchiveList ul li {padding-top: .25em;padding-bottom: .25em;}.main-inner .widget ul li:first-child, .main-inner .widget #ArchiveList ul.flat li:first-child {border-top: none;}.main-inner .widget ul li:last-child, .main-inner .widget #ArchiveList ul.flat li:last-child {border-bottom: none;}.post-body {position: relative;}.main-inner .widget .post-body ul {padding: 0 2.5em;margin: .5em 0;list-style: disc;}.main-inner .widget .post-body ul li {padding: 0.25em 0;margin-bottom: .25em;color: #333333;border: none;}.footer-inner .widget ul {padding: 0;list-style: none;}.widget .zippy {color: #666666;}/* Posts----------------------------------------------- */body .main-inner .Blog {padding: 0;margin-bottom: 1em;background-color: transparent;border: none;-moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0);-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0);-goog-ms-box-shadow: 0 0 0 rgba(0, 0, 0, 0);box-shadow: 0 0 0 rgba(0, 0, 0, 0);}.main-inner .section:last-child .Blog:last-child {padding: 0;margin-bottom: 1em;}.main-inner .widget h2.date-header {margin: 0 -15px 1px;padding: 0 0 0 0;font: normal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #908d6a;background: transparent none no-repeat scroll top left;border-top: 0 solid #aab123;border-bottom: 1px solid transparent;-moz-border-radius-topleft: 0;-moz-border-radius-topright: 0;-webkit-border-top-left-radius: 0;-webkit-border-top-right-radius: 0;border-top-left-radius: 0;border-top-right-radius: 0;position: static;bottom: 100%;right: 15px;text-shadow: 0 0 -1px #000000;}.main-inner .widget h2.date-header span {font: normal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif;display: block;padding: .5em 15px;border-left: 0 solid #aab123;border-right: 0 solid #aab123;}.date-outer {position: relative;margin: 30px 0 20px;padding: 0 15px;background-color: #fefdfa;border: 1px solid #aab123;-moz-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 20px rgba(0, 0, 0, .2);box-shadow: 0 0 20px rgba(0, 0, 0, .2);-moz-border-radius: 5px;-webkit-border-radius: 5px;-goog-ms-border-radius: 5px;border-radius: 5px;}.date-outer:first-child {margin-top: 0;}.date-outer:last-child {margin-bottom: 20px;-moz-border-radius-bottomleft: 5px;-moz-border-radius-bottomright: 5px;-webkit-border-bottom-left-radius: 5px;-webkit-border-bottom-right-radius: 5px;-goog-ms-border-bottom-left-radius: 5px;-goog-ms-border-bottom-right-radius: 5px;border-bottom-left-radius: 5px;border-bottom-right-radius: 5px;}.date-posts {margin: 0 -0;padding: 0 0;clear: both;}.post-outer, .inline-ad {border-top: 1px solid #aab123;margin: 0 -0;padding: 15px 0;}.post-outer {padding-bottom: 10px;}.post-outer:first-child {padding-top: 0;border-top: none;}.post-outer:last-child, .inline-ad:last-child {border-bottom: none;}.post-body {position: relative;}.post-body img {padding: 8px;background: #ffffff;border: 1px solid #cccccc;-moz-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);box-shadow: 0 0 20px rgba(0, 0, 0, .2);-moz-border-radius: 5px;-webkit-border-radius: 5px;border-radius: 5px;}h3.post-title, h4 {font: normal normal 22px Georgia, Utopia, Palatino Linotype, Palatino, serif;color: #d52a33;}h3.post-title a {font: normal normal 22px Georgia, Utopia, Palatino Linotype, Palatino, serif;color: #d52a33;}h3.post-title a:hover {color: #d52a33;text-decoration: underline;}.post-header {margin: 0 0 1em;}.post-body {line-height: 1.6;}.post-outer h2 {color: #333333;}.post-footer {margin: 1.5em 0 0;}#blog-pager {padding: 15px;font-size: 120%;background-color: #fefdfa;border: 1px solid #aab123;-moz-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 20px rgba(0, 0, 0, .2);box-shadow: 0 0 20px rgba(0, 0, 0, .2);-moz-border-radius: 5px;-webkit-border-radius: 5px;-goog-ms-border-radius: 5px;border-radius: 5px;-moz-border-radius-topleft: 5px;-moz-border-radius-topright: 5px;-webkit-border-top-left-radius: 5px;-webkit-border-top-right-radius: 5px;-goog-ms-border-top-left-radius: 5px;-goog-ms-border-top-right-radius: 5px;border-top-left-radius: 5px;border-top-right-radius-topright: 5px;margin-top: 1em;}.blog-feeds, .post-feeds {margin: 1em 0;text-align: center;color: #333333;}.blog-feeds a, .post-feeds a {color: #d52a33;}.blog-feeds a:visited, .post-feeds a:visited {color: #7d181e;}.blog-feeds a:hover, .post-feeds a:hover {color: #d52a33;}.post-outer .comments {margin-top: 2em;}/* Footer----------------------------------------------- */.footer-outer {margin: -20px 0 -1px;padding: 20px 0 0;color: #333333;overflow: hidden;}.footer-fauxborder-left {border-top: 1px solid #aab123;background: #fefdfa none repeat scroll 0 0;-moz-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 20px rgba(0, 0, 0, .2);box-shadow: 0 0 20px rgba(0, 0, 0, .2);margin: 0 -20px;}/* Mobile----------------------------------------------- */*+html body.mobile .main-inner .column-center-inner {margin-top: 0;}.mobile .main-inner .widget {padding: 0 0 15px;}.mobile .main-inner .widget h2 + div,.mobile .footer-inner .widget h2 + div {border-top: none;padding-top: 0;}.mobile .footer-inner .widget h2 {padding: 0.5em 0;border-bottom: none;}.mobile .main-inner .widget .widget-content {margin: 0;padding: 7px 0 0;}.mobile .main-inner .widget ul,.mobile .main-inner .widget #ArchiveList ul.flat {margin: 0 -15px 0;}.mobile .main-inner .widget h2.date-header {right: 0;}.mobile .date-header span {padding: 0.4em 0;}.mobile .date-outer:first-child {margin-bottom: 0;border: 1px solid #aab123;-moz-border-radius-topleft: 5px;-moz-border-radius-topright: 5px;-webkit-border-top-left-radius: 5px;-webkit-border-top-right-radius: 5px;-goog-ms-border-top-left-radius: 5px;-goog-ms-border-top-right-radius: 5px;border-top-left-radius: 5px;border-top-right-radius: 5px;}.mobile .date-outer {border-color: #aab123;border-width: 0 1px 1px;}.mobile .date-outer:last-child {margin-bottom: 0;}.mobile .main-inner {padding: 0;}.mobile .header-inner .section {margin: 0;}.mobile .blog-posts {padding: 0 10px;}.mobile .post-outer, .mobile .inline-ad {padding: 5px 0;}.mobile .tabs-inner .section {margin: 0 10px;}.mobile .main-inner .widget h2 {margin: 0;padding: 0;}.mobile .main-inner .widget h2.date-header span {padding: 0;}.mobile .main-inner .widget .widget-content {margin: 0;padding: 7px 0 0;}.mobile #blog-pager {border: 1px solid transparent;background: #fefdfa none repeat scroll 0 0;}.mobile .main-inner .column-left-inner,.mobile .main-inner .column-right-inner {background: transparent none repeat 0 0;-moz-box-shadow: none;-webkit-box-shadow: none;-goog-ms-box-shadow: none;box-shadow: none;}.mobile .date-posts {margin: 0;padding: 0;}.mobile .footer-fauxborder-left {margin: 0;border-top: inherit;}.mobile .main-inner .section:last-child .Blog:last-child {margin-bottom: 0;}.mobile-index-contents {color: #333333;}.mobile .mobile-link-button {background: #d52a33 url(http://www.blogblog.com/1kt/awesomeinc/tabs_gradient_light.png) repeat scroll 0 0;}.mobile-link-button a:link, .mobile-link-button a:visited {color: #fefdfa;}body.mobile {background-size: auto;}-->/style>style idtemplate-skin-1 typetext/css>!--body {min-width: 890px;}.content-outer, .content-fauxcolumn-outer, .region-inner {min-width: 890px;max-width: 890px;_width: 890px;}.main-inner .columns {padding-left: 260px;padding-right: 0px;}.main-inner .fauxcolumn-center-outer {left: 260px;right: 0px;/* IE6 does not respect left and right together */_width: expression(this.parentNode.offsetWidth -parseInt(260px) -parseInt(0px) + px);}.main-inner .fauxcolumn-left-outer {width: 260px;}.main-inner .fauxcolumn-right-outer {width: 0px;}.main-inner .column-left-outer {width: 260px;right: 100%;margin-left: -260px;}.main-inner .column-right-outer {width: 0px;margin-right: -0px;}#layout {min-width: 0;}#layout .content-outer {min-width: 0;width: 800px;}#layout .region-inner {min-width: 0;width: auto;}body#layout div.add_widget {padding: 8px;}body#layout div.add_widget a {margin-left: 32px;}-->/style>link hrefhttps://www.blogger.com/dyn-css/authorization.css?targetBlogID8241445299985430179&zx0f7a6dda-c51f-4067-98ae-c9430d403700 medianone onloadif(media!'all')media'all' relstylesheet/>noscript>link hrefhttps://www.blogger.com/dyn-css/authorization.css?targetBlogID8241445299985430179&zx0f7a6dda-c51f-4067-98ae-c9430d403700 relstylesheet/>/noscript>meta namegoogle-adsense-platform-account contentca-host-pub-1556223355139109/>meta namegoogle-adsense-platform-domain contentblogspot.com/>!-- data-ad-clientca-pub-3074158404074723 -->/head>body classloading>div classnavbar section idnavbar nameNavbar>div classwidget Navbar data-version1 idNavbar1>script typetext/javascript> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener(load, function(){ objectattribute val; }, false); } else { window.attachEvent(onload, function(){ objectattribute val; }); } } /script>div idnavbar-iframe-container>/div>script typetext/javascript srchttps://apis.google.com/js/platform.js>/script>script typetext/javascript> gapi.load(gapi.iframes:gapi.iframes.style.bubble, function() { if (gapi.iframes && gapi.iframes.getContext) { gapi.iframes.getContext().openChild({ url: https://www.blogger.com/navbar/8241445299985430179?origin\x3dhttp://blog.beam2d.net, where: document.getElementById(navbar-iframe-container), id: navbar-iframe }); } }); /script>script typetext/javascript>(function() {var script document.createElement(script);script.type text/javascript;script.src //pagead2.googlesyndication.com/pagead/js/google_top_exp.js;var head document.getElementsByTagName(head)0;if (head) {head.appendChild(script);}})();/script>/div>/div>div itemscopeitemscope itemtypehttp://schema.org/Blog styledisplay: none;>meta contentビームの報告書 itempropname/>/div>div classbody-fauxcolumns>div classfauxcolumn-outer body-fauxcolumn-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/div>div classcontent>div classcontent-fauxcolumns>div classfauxcolumn-outer content-fauxcolumn-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/div>div classcontent-outer>div classcontent-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left content-fauxborder-left>div classfauxborder-right content-fauxborder-right>/div>div classcontent-inner>header>div classheader-outer>div classheader-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left header-fauxborder-left>div classfauxborder-right header-fauxborder-right>/div>div classregion-inner header-inner>div classheader section idheader nameヘッダー>div classwidget Header data-version1 idHeader1>div idheader-inner>div classtitlewrapper>h1 classtitle>ビームの報告書/h1>/div>div classdescriptionwrapper>p classdescription>span>/span>/p>/div>/div>/div>/div>/div>/div>div classheader-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/header>div classtabs-outer>div classtabs-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left tabs-fauxborder-left>div classfauxborder-right tabs-fauxborder-right>/div>div classregion-inner tabs-inner>div classtabs no-items section idcrosscol nameCross-Column>/div>div classtabs no-items section idcrosscol-overflow nameCross-Column 2>/div>/div>/div>div classtabs-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>div classmain-outer>div classmain-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left main-fauxborder-left>div classfauxborder-right main-fauxborder-right>/div>div classregion-inner main-inner>div classcolumns fauxcolumns>div classfauxcolumn-outer fauxcolumn-center-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>div classfauxcolumn-outer fauxcolumn-left-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>div classfauxcolumn-outer fauxcolumn-right-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>!-- corrects IE6 width calculation -->div classcolumns-inner>div classcolumn-center-outer>div classcolumn-center-inner>div classmain section idmain nameメイン>div classwidget Blog data-version1 idBlog1>div classblog-posts hfeed> div classdate-outer> h2 classdate-header>span>2012年3月5日月曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name3547211439776906717>/a>h3 classpost-title entry-title>a hrefhttp://blog.beam2d.net/2012/03/my-campus-life.html>大学生活/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-3547211439776906717>今日,製本用の修士論文を提出しました. 6年つづいた学生生活も終わりが近づいてきました.br />br />この6年間にはいろんなことがありました.br />br />前半の4年間は駒場へ通っていました. 2007 年 10 月からは数学科にいました. そこにはガチでやばい数学erがいて,そうでない人も段々頭を書き換えられて数学語ばかり喋るようになっていくやばい場所でした. 特別ガチでやばい二人と輪読した結び目理論の本は飛び抜けて難しかったですが,あれはワクワクしました. 僕は数学科生として結局は中途半端な感じになり,コンピューターを前からやってみたかったのもあって,情報理工に進むことにしました.br />br />少し戻って,2007 年の駒場祭の帰り,友人と2人でゲームをつくる学内サークルを作りました(現a hrefhttps://n-linear.org/>ノンリニア/a>). はじめの頃に集まった十数人のメンバーに全力で支えられた1年間のことを,今でもよく覚えています. 思いつきと勢いで始めたサークルがこんなに大きくなって今でも回っていて,不思議な気分です. 先日の追い出しコンパ,とても楽しかったです!br />br />後半の2年間は本郷へ通っていました. 情報理工に進み,今月まで中川研に所属しています. 最初の一年は機械学習の勉強でした. パーセプトロンや SVM すら聞いたことのない状態からはじめて,いつも頭の中がフワフワしている気分でした. 系列学習をやっていましたが,ちょっと理解がフワフワすぎで,うまくいきませんでした. 去年の2月ごろからは近傍探索のハッシュを勉強し始めました. こちらは割と性に合っていました. 機械学習に対する認識も少しずつこなれてきて,気分的には今やっとスタートラインに立てたかなってくらいの感じです.br />br />インターンやバイトもしました (僕にしては珍しく積極的です). おととしの夏には Google に通いました. Mozc チームは技術レベルが半端なく高くて,そこでの仕事は貴重な体験でした. 作ったものが OSS で公開されたのが嬉しかったです. そこで知り合った iwiwi くんに (しつこくお願いして) 紹介してもらって,直後の 11 月からは a hrefhttp://preferred.jp/>PFI/a> でアルバイトをしています. こちらは密で濃くて尖っていて,とても楽しく刺激的です. 去年の3月には pixiv のインターンに参加しました. 僕が会ってこなかったタイプの人がたくさんいて,新しい刺激をたくさんもらいました.br />br />今年に入って,初めての論文 (修論) を書き,初めて会議論文を投稿しました. 結果がどうなるかドキドキですが,ともかく大学生活はほぼ終わりました. 今やっと羽をのばしはじめたところ,あと一ヶ月も残っていません.小旅行的サムシングの予定が2つほどありますが,他の時間何しようかなあとぼんやり考えています.br />br />4月からは社会人です. PFI で研究開発メンバーとしてがんばっていきます. よろしくお願いいたしますっ!div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttp://blog.beam2d.net/2012/03/my-campus-life.html relbookmark titlepermanent link>abbr classpublished title2012-03-05T23:59:00+09:00>23:59/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.beam2d.net/2012/03/my-campus-life.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID3547211439776906717&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID3547211439776906717&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID3547211439776906717&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID3547211439776906717&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID3547211439776906717&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID3547211439776906717&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div>div classinline-ad>script typetext/javascript>!--google_ad_clientpub-3074158404074723;google_ad_hostpub-1556223355139109;google_ad_width300;google_ad_height250;google_ad_format300x250_as;google_ad_typetext_image;google_ad_host_channel0001;google_color_borderFFFFFF;google_color_bgFFFFFF;google_color_link2288BB;google_color_url666666;google_color_text222222;//-->/script>script typetext/javascript srchttps://pagead2.googlesyndication.com/pagead/show_ads.js>/script>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年12月24日土曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name7753304012530348822>/a>h3 classpost-title entry-title>a hrefhttp://blog.beam2d.net/2011/12/eigenarpack.html>Eigenの実対称行列の固有値問題をARPACKで解く/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-7753304012530348822>p>ハイパーお久しぶりです. 修論に追われていて,先輩方に言われた「正月はもう一週間前に終わった」という言葉をかみしめています (とてもにがい)./p>p>今日は,a hrefhttp://www.caam.rice.edu/software/ARPACK/>ARPACK/a> を使って a hrefhttp://eigen.tuxfamily.org/>Eigen/a> の実対称行列の固有値・固有ベクトルを求めるために薄いラッパーを書いたので,ご紹介いたします./p>p>a hrefhttps://github.com/beam2d/arpaca>beam2d/arpaca - GitHub/a>/p>p>基本的な使い方は README に書いてあります. 求めたい固有値の数と種類 (実数 (or 絶対値) の意味で大きい (or 小さい) 方からいくつか,あるいは次数の意味で両側から合わせていくつか) を指定して,行列を渡すだけです. 行列は掛け算にだけ用いられるので,Eigen の Expression Template を直接渡すこともできます. また README の 2 番目の例のように,対象となる行列をベクトルにかける演算を自分で書いて渡せば,その固有値を求めることができます. これは複数の大規模疎行列の和や積の形をした行列をそのまま扱う場合などに有効です./p>p>中身の話をすると,基本的には ARPACK の関数 dsaupd, dseupd, ssaupd, sseupd のラッパーです. これらの使い方についてはソースコード (dsaupd.f, ..., sseupd.f) の先頭に詳しく書かれていますが,a hrefhttp://www.mlab.ice.uec.ac.jp/~ej-sib/numerical/numerical_arpack.html>数値計算マニュアル:線型代数 (3)/a> にこれの翻訳と解説が書かれていて,わかりやすいです (と言っても ARPACK 自体は Fortran で書かれた古のコードなので,いろいろはまって苦労しました). ARPACK の C++ ラッパーとしては公式に ARPACK++ というものがありますが,これがいかんせん古く,今のコンパイラーで通るように直すのが大変そうだったので,今回欲しかった実対称行列の固有値問題に絞ってラッパーを書いたものが arpaca です./p>p>最近は,大規模固有値問題を解くためのライブラリーは ARPACK 以外にもあるようです. 特に有力そうなのは a hrefhttp://www.grycap.upv.es/slepc/>SLEPc/a> ですが,これは MPI を用いた並列計算が前提のようで,本当に巨大な疎行列の固有値問題を解く場合には使えそうですが,お手軽さはなさそうです. 他にも a hrefhttp://trilinos.sandia.gov/packages/anasazi/>anasazi/a> は Krylov-Schur アルゴリズムや Davidson アルゴリズムのブロック化版などを実装しています. これは Trilinos という大きなパッケージの一部らしく,今回はあまり見ていません./p>p>アルゴリズムの話をします. ARPACK (ARnoldi PACKage の略) が実装しているのは Implicitly Restarted Arnoldi (IRA) method という手法です. Arnoldi method は一般の行列をa hrefhttp://>ヘッセンベルグ行列/a>に変換する手法ですが,実対称行列やエルミート行列に対しては対称三重対角行列となり効率が良く,特に Lanczos method の名前で知られています. Lanczos method は対象となる行列 A の Krylov 部分空間 {q, Aq, Asup>2/sup>q, ...} を求めることで三重対角化を行いますが,implicit restart を行うことでこのうち必要となる固有ベクトルを含む低次元の部分空間を効率よく求めることができて,出てきた小さな三重対角行列の固有値分解は高速に求めることができる,というのが IRA の方法です. ここらへんの話は a hrefhttps://www.amazon.co.jp/gp/product/0801854148/refas_li_tf_tl?ieUTF8&tagbeamrainbowcr-22&linkCodeas2&camp247&creative1211&creativeASIN0801854148>Matrix Computations/a> や a hrefhttps://www.amazon.co.jp/gp/product/0470528338/refas_li_tf_tl?ieUTF8&tagbeamrainbowcr-22&linkCodeas2&camp247&creative1211&creativeASIN0470528338>Fundamentals of Matrix Computations/a> が詳しいです. まだ詳しく読んでいませんが,二つ目の本には IRA のさらに変形版である Krylov-Schur アルゴリズムや,中途半端な位置にある固有値も求めることができる Jacobi-Davidson method なども載っています./p>p>時間があったらここらへん自分でも実装してみたいです. 実装の際には,Eigen::SelfAdjointEigenSolver の中に三重対角行列の固有値ソルバーが書かれていて,参考になりそうです. これは internal なので直接呼び出すのはアレかもしれませんが…… (a hrefhttp://eigen.tuxfamily.org/bz/show_bug.cgi?id326>外に露出させろというバグ/a>も提出されていますが,対応されるかどうか). Eigen の疎行列モジュールは,a hrefhttp://eigen.tuxfamily.org/index.php?titleChangeLog#Eigen_3.1.0-alpha1>3.1.0-alpha1/a> で今まで unsupported/SparseExtra にあったソルバーがたくさんメイン入りするなどしているので,将来的に大規模固有値問題もサポートされないかなあと期待はしています./p>p>というわけで,メリクリさまでした!/p>div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttp://blog.beam2d.net/2011/12/eigenarpack.html relbookmark titlepermanent link>abbr classpublished title2011-12-24T20:41:00+09:00>20:41/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.beam2d.net/2011/12/eigenarpack.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID7753304012530348822&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID7753304012530348822&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID7753304012530348822&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID7753304012530348822&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID7753304012530348822&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID7753304012530348822&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年8月19日金曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name2866826318272431678>/a>h3 classpost-title entry-title>a hrefhttp://blog.beam2d.net/2011/08/suffix-array-sa-is.html>Suffix Array を作る - SA-IS の実装/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-2866826318272431678>a hrefhttps://ja.wikipedia.org/wiki/%E6%8E%A5%E5%B0%BE%E8%BE%9E%E9%85%8D%E5%88%97>Suffix Array/a> は今若者の間で人気のデータ構造です. マイ suffix array を実装することで,オシャレ度がアップしてモテ系になり,女子力も上がると言われています. その中でも今特に,手軽でクールな SA-IS (アルファベットサイズ固定の下で線形時間で省メモリで suffix array が作れる今最強のアルゴリズム) の実装がブームです. 僕もブームに便乗して,実装してみました.br />br />ところで,SA-IS は流行っているので,日本語でもすでに様々なところで記事が書かれています (日付順).br />br />ul>li>a hrefhttp://d.hatena.ne.jp/echizen_tm/20100325/1269533804>SAIS(Suffix Array - Induced Sorting) - EchizenBlog-Zwei/a>/li>li>a hrefhttp://d.hatena.ne.jp/sile/20101213/1292190698>SA-IS: SuffixArray線形構築 - sileの日記/a>/li>li>a hrefhttp://topcoder.g.hatena.ne.jp/iwiwi/20110720/1311168147>SA-IS - (iwi) { 反省します - TopCoder部/a>/li>li>a hrefhttp://d.hatena.ne.jp/xxxxxeeeee/20110810/1312996441>接尾辞配列(Suffix Array)の効率的な実装手法について - xxxxxeeeeeの日記/a>/li>/ul>br />仕掛けが気になる人はまずここら辺を眺めて,え,そこどうなってんの,ってなったら下の論文を読むのが良いです.br />br />ul>li>G. Nong, S. Zhang and W. H. Chan, Two Efficient Algorithms for Linear Time Suffix Array Construction, IEEE Transactions on Computers, To Appear/li>/ul>br />SA-IS の元論文は 2009 年ですが,上の論文 (まだドラフト,a hrefhttp://www.cs.sysu.edu.cn/nong/>PDF が G. Nong さんのページにある/a>) に C のコードがついてるので,それを見ながらがわかりやすいです (というかソース読まないとわかんない).br />br />br />h4>実装と実験/h4>br />この論文についている実装ですが,\0 を番兵に使うのでバイナリとかだと使えません. ちゃんとした実装は a hrefhttps://sites.google.com/site/yuta256/sais>sais/a> が良さそうで,上の G. Nong さんのページからも refer されています. a hrefhttps://code.google.com/p/esaxx/>esaxx - C++ enhanced suffix array template library - Google Project Hosting/a> でもこれが使われています.br />br />僕が書いた実装はbr />br />a hrefhttps://github.com/beam2d/sara>beam2d/sara - GitHub/a>br />br />にあります. 本体はヘッダー sara.h 一個です. 使い方は簡単で,文字列 code>str/code> に対して code>sara::make(str, ch_max)/code> で suffix array が返ってきます.br />br />上の論文にある C のコード (100 行弱) よりは長い (160 行強) ですが,番兵なしで,入力と出力がテンプレート化されてます (sais もそうですが). 文字の型は組み込み整数型ならなんでもいいですが,値の範囲は 0 から指定した値 ch_max までに収まっている必要があります.br />br />検証と評価用のサンプルが sara_main.cc (sara) です. 今回僕が唐突に SA-IS を実装し始めたのはレポートのためなんですが (冒頭の件? 何の話ですか?),その中では a hrefhttp://corpus.canterbury.ac.nz/descriptions/>The Canterbury Corpus/a> にあるデータを使って検証と実行時間の計測を行い,code>std::lexicographical_compare/code> と code>std::sort/code> を使うだけの単純な suffix array 構築と比較しました. 詳細は省きますが,普通の文書だと 4 倍くらいの差しかなくて,割とクイックソート速いのねという感じです. 一方,似たパターンが連続するバイナリデータだと愚直な文字列比較ソートは激遅で,例えば第一世代 Core i5 2.67GHz で, ptt5 (FAX, 501KB) は code>std::sort/code> だと 28.1 秒, code>sara::make/code> だと 0.040 秒でした. 繰り返しを多く含む人工データではさらに差が広がります.br />br />br />h4>適当な解説/h4>br />アルゴリズムをひと通り説明します. が,正直がんばってわかりやすく説明するげんきが残っていないので,適当です!!! わからなくなったら上のブログとか論文とかついてるソースコードとかを見るのが良いです.br />br />各 suffix に対して,右隣の suffix より (辞書式順序で) 大きいか小さいかで L-type と S-type というラベルを振ります. L/S を並べると例えば mmiissiissiippii$ という文字列 ($ は終端文字で最小の文字で必ず S-type とする) なら LLSSLLSSLLSSLLLLS となります. 最終的な suffix array はまず先頭文字についてソートされているので,先頭文字ごとのバケツを作ります. suffix 同士の先頭文字が等しい場合,L-type の方が S-type より必ず先に来ることに注意します. つまり各バケツはさらに前半・後半で L-type / S-type にわかれます.br />br />SA-IS ではまず L-type だけをソートします. 先頭文字と type が等しい場合,右隣の suffix の大小がそのままもとの suffix の大小になることを利用して,「まだ見ていない L-type の右隣の suffix の中で最小のものを含むソートされたリスト」を持っておき,最小のものを取り出し,左隣の suffix が L-type なら対応するバケツに入れて,リストに加える,という操作をリストが空になるまで繰り返します. このリストは,後述する初期値を除いて構築中の suffix array そのものが使えます (まだ埋まっていない部分は飛ばしながら見ます). 次に S-type では逆向きに,今できたソートされた L-type suffix を大きい方から順に見て,左隣の suffix が S-type ならバケツの後端から順に加える,という操作を繰り返します.br />br />これをやるためには,L-type をソートするときに「まだ見ていない L-type の右隣の suffix の中で最小のものを含むソートされたリスト」を常に持っている必要があります. これは,L の右隣にいる S (LMS: Left Most S-type という) 全部のソートされたリストをはじめに作り,上の方法で最小のものを取り出しては左隣の L-type を入れる,という操作を繰り返せばできます.br />br />理由ですが,L-type が並んでいるところ (...LLLLLS... みたいな. この S が LMS) では右の suffix ほど小さくなります. 特にこれらの L-type の直後に来る LMS の suffix はこの L-type suffix のどれよりも小さいです. 同じように,S-type が並んでいるところでは右に行くほど大きくなります. つまり LMS は suffix の大小という意味で谷になっています. なので谷を全部持っておけば,必ず最小のものが含まれるし,取り出した最小の suffix の一個前 (山を後ろに一歩登ったところ) を加えていけば「まだ見ていない L-type の右隣の suffix の中で最小のものを含むリスト」が常に保たれることになります. S-type のソートでも同じように,今度は山のてっぺんから左に下っていく感じで進めていけばよく,これは単純にソート済みの L-type suffix とすでにソートされた S-type suffix を後ろから順に見ていけばよいです.br />br />そのためにはじめにソートされた LMS-suffix のリストを作るのですが,ここが SA-IS 最大のポイントになります. 各 LMS 文字に対して,そこから次の LMS 文字までの substring を LMS-substring と呼びます (右端の LMS 文字を含みます). LMS-substring は各文字と L/S-type とのペアに関する辞書式順序で比較します. LMS-substring をソートして,各 LMS-substring に対して LMS-substring 同士の大小と一致するような整数を振り,それを出現順に並べた文字列 S1 を考えます. すると,各 LMS-suffix の順序と対応する S1 の suffix の順序が一致します. なので S1 の suffix array を作れば LMS-suffix のソートされたリストが得られます. S1 の suffix array は,重複する文字がない場合にはただ文字をソートすればよいです (これは実は LMS-substring を整数に変換するところですでにやっています). S1 に重複する文字がある場合には SA-IS を再帰的に適用します. LMS 文字は全体の半分以下しかないので,問題サイズは半分以下になっており,再帰させても線形時間で終了します.br />br />まだ続きます. 上でサラっと LMS-substring のソートと書いた部分です. ここでも四段落上で書いたのとほとんど同じやり方が使えます. 今度は LMS-substring ごとの suffix を考え,それを全部集めたものをソートします. L/S-type はもとのと同じものが使えます. この場合,最初の「左隣が L-type な suffix のうち最小のものを含むソート済みリスト」の初期値として,LMS 文字一文字からなる suffix をバケツに入れたものが使えます. あとは上と同じように L-type,S-type の順でソートすれば,全 LMS-substring の suffix のソートが完了します. LMS-substring に対応する部分だけを取り出せば,LMS-substring のソートが得られます.br />br />まとめると,br />ul>li>各 suffix に対して L/S-type のラベルを振る (ここは文字列を後ろから前へ一回走査するだけでできます)./li>li>LMS-substring をソートする. これはまず LMS 文字一文字からなる LMS-substring の suffix をバケツに入れ,そこから上記の方法で L-type,S-type の順にソートする./li>li>ソートされた LMS-substring に整数値を振る. 等しい LMS-substring 同士は同じ値になるように,小さい方から順に 0, 1, 2, ... と振る. これをもとの文字列での LMS の出現順と同じ順序で並べて S1 を作る./li>li>整数値が被らなければ ( 重複する LMS-substring がなければ) すでに作った LMS-substring のソートが LMS-suffix のソートを与える. そうでなければ S1 に対して SA-IS を再帰的に適用して S1 の suffix array を作り,対応する LMS-suffix のソートを得る./li>li>LMS-suffix のソートされたものを対応する各バケツの後端に入れる. これを初期状態として,上記の方法で L-type,S-type の順にソートする./li>/ul>となります.br />br />アルゴリズムの概要はこんな感じです. 何言ってるのかわからない部分もあると思いますが,上のリンクとか論文とかを参考にしてください. 本当は山と谷の図をたくさん書いて,具体的な文字列で手でアルゴリズムを回してみるとわかりやすいです. 論文は,ソースと本文を行ったり来たりしてればわかると思います. やってることはシンプルで,ソースも短くて (100 行弱),コメントもたくさん入っています.div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttp://blog.beam2d.net/2011/08/suffix-array-sa-is.html relbookmark titlepermanent link>abbr classpublished title2011-08-19T10:59:00+09:00>10:59/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.beam2d.net/2011/08/suffix-array-sa-is.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID2866826318272431678&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID2866826318272431678&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID2866826318272431678&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID2866826318272431678&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID2866826318272431678&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID2866826318272431678&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年7月31日日曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name6006738173895222105>/a>h3 classpost-title entry-title>a hrefhttp://blog.beam2d.net/2011/07/blog-post.html>正則な確率行列の逆行列/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-6006738173895222105>確率行列とは,行和が 1 な非負の正方行列のことです.確率行列 X に対して,Xsub>i j/sub> を状態 i から状態 j への遷移確率と見なせば,X はマルコフ連鎖の遷移確率と見なすこともできます.br />br />今正則な確率行列 X が与えられたとします.X の逆行列 Xsup>-1/sup> は行和が 1 です.証明は簡単で,全成分が 1 である列ベクトルを b>1/b> と書くことにすると,X の行和が 1 であることから b>1/b> Xb>1/b> で,この式の両辺に左から Xsup>-1/sup> をかければ Xsup>-1/sup>b>1/b> b>1/b> となります.br />br />これだけでは Xsup>-1/sup> が確率行列とは言えません.一般に成分が負になる場合があるからです.逆行列が確率行列になるための条件は何でしょうか? とりあえず考えつく方法として 3 つの解法があるようです.br />br />一番簡単なのは,X と Xsup>-1/sup> を遷移確率行列だと思うことです.X が非決定的な遷移確率行列 (i に対して複数の j で正な値を取ることがある) の場合,X で遷移したあと,Xsup>-1/sup> で遷移すると,確率 1 でもとの場所に戻ってくる,などという奇妙なことは絶対に起こりません.つまり,逆行列が確率行列になるのは,X が決定的な遷移確率行列の場合だけです.行列の言葉で言い換えると X が置換行列ということになります.br />br />正面から証明する方法もあります.Xsup>-1/sup> が非負行列で,X のある行 i に対して 2 つの列 j, j で正の値をとっていると仮定します.XXsup>-1/sup> は単位行列なので,i 以外のすべてのインデックス i に対して,X の i 行目と Xsup>-1/sup> の i 列目は内積が 0 です.これらは共に非負ベクトルなので,Xsup>-1/sup> の (j, i), (j, i) 成分はともに 0 となります.つまり Xsup>-1/sup> の j, j 行目は第 i 成分を除いて 0 となり,この 2 行は一次従属になります.これは Xsup>-1/sup> が正則であることに反します.よって X はどの行も 1 つの成分を除いてゼロであり,置換行列になります.br />br />最後に,固有値からも証明できるようです.確率行列はスペクトル半径が 1 です.Xsup>-1/sup> は X の固有値の逆数を固有値に持つので,これらが共に確率行列となるためには,両方ともすべての固有値が長さ 1 である必要があります.つまり X は等長変換を表す行列 (直交行列) ということです.第 i 成分だけが 1 の行ベクトル v を考えると,vX のユークリッドノルムが 1 である必要があります.つまり X の第 i 行はユークリッドノルムが 1 となりますが,行和が 1 な非負ベクトルでユークリッドノルムも 1 となるのは,ある一つの成分だけが 1 というベクトル,しかありません.よって X は置換行列となります.br />br />br />とまあ,きっかけがあってそんなことをちょっと考えていました.div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttp://blog.beam2d.net/2011/07/blog-post.html relbookmark titlepermanent link>abbr classpublished title2011-07-31T00:15:00+09:00>0:15/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.beam2d.net/2011/07/blog-post.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID6006738173895222105&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID6006738173895222105&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID6006738173895222105&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID6006738173895222105&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID6006738173895222105&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID6006738173895222105&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年7月2日土曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name590125630145334082>/a>h3 classpost-title entry-title>a hrefhttp://blog.beam2d.net/2011/07/elog-c.html>eLog - C++ で簡易ログと簡単時間計測/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-590125630145334082>C++ で使える簡単なロガーを書きました.ロガーと書いてしまいましたが,そんな大げさなものではなくて,ほとんど std::cerr の代わりみたいなものです.見た目はほとんど google-glog です.br />br />a hrefhttps://github.com/beam2d/elog>beam2d/elog - GitHub/a>br />br />ヘッダーだけなので,すぐ使えます./usr/local/include へのインストールは ./waf install でできます.もちろん,自分のコードツリーにコピーしてきてもいいです.MIT License です.br />br />使い方.br />br />pre classprettyprint>#include <elog/elog.h>class ModuleA {};class ModuleB {};class MyLogger : public LOG::Logger { ... };int main() { LOG(INFO) << 基本は google-glog と同じ; LOG(ERROR) << LogLevel (severity) は INFO, WARN, ERROR, FATAL; try { LOG(FATAL) << FATAL は; } catch (const LOG::FatalLogError&) { LOG(ERROR) << 例外を投げる; } LOG() << INFO は省略できる; // ロガーのレベルを変更できる // LOG は括弧を付けなければ名前空間 LOG::SetDefaultLoggerLevel(LOG::ERROR); LOG(INFO) << 出力されない; LOG(WARN) << 出力されない; LOG::SetDefaultLoggerLevel(LOG::INFO); LOG(ModuleA, 0) << 型ごとに verbosity をつけてログを吐ける; // 型ごとに異なる verbosity を設定できる (初期値は 0) LOG::SetDefaultLoggerVerbosity<ModuleA>(2); // verbosity 2 以下を有効に LOG(ModuleA, 2) << 出力される; LOG(ModuleA, 3) << 出力されない; LOG(ModuleB, 1) << 出力されない; unsigned char uc 65; LOG() << (un)signed char は整数として出力される: << uc; LOG() << char は普通のストリームと同様: << A; // アサートもある CHECK(true) << 出力されない; try { CHECK(false) << 出力され,そして; } catch (const LOG::CheckError&) { LOG(ERROR) << 例外を投げる; } // デフォルトのロガーは std::clog に吐くが,他のストリームに変えるには: std::ostream& ostream std::cout; LOG::StreamLogger cout_logger(ostream); LOG::SetLogger(cout_logger); // この場合 SetDefaultLoggerLevel 等は使わない cout_logger.set_level(LOG::WARN); cout_logger.SetTypeVerbosity<ModuleA>(1); // ロガーの実装は自分で作って差し替えられる (Logger の定義は logger.h) MyLogger my_logger; LOG::SetLogger(my_logger);}/pre>br />ファイル名と行数も出力します.そのうち日付時刻とかも入れたいです.br />br />あと簡単なベンチマーク機能があります.アルゴリズムをパパっと実装して速度を見るのに便利です.こっちは a hrefhttp://d.hatena.ne.jp/iwiwi/20100221/1266682598>iwiwi くんの benchmark/a> を参考にしています.br />br />pre classprettyprint>#include <elog/benchmark.h>// BENCHMARK のログ出力はすべて INFO レベルですint main() { // タイトルを出してから経過時間を計測して,最後に出力 BENCHMARK(my_bench) { for (int i 0; i < 100000; ++i); LOG() << 途中でも出力できる: << my_bench.GetTime() << sec; for (int i 0; i < 100000; ++i); } // 複数の計測結果をまとめる LOG::BenchmarkSuite suite(title); BENCHMARK(suite, case_1) { for (int i 0; i < 100000; ++i); LOG() こっちも同じく: case_1.GetTime() sec; for (int i 0; i < 100000; ++i); } BENCHMARK(suite, case_2, 開始時にメッセージを出力できる) { for (int i 0; i < 200000; ++i); } // 計測結果を表にして出力 suite.LogChart();}/pre>とすると出力はpre classprettyprint>my_bench: ...INFO bench.cc(8): 途中でも出力できる: 0.000623941 secmy_bench: 0.00120592 seccase_1: ...INFO bench.cc(17): こっちも同じく: 0.000519037 seccase_1: 0.00106406 seccase_2: 開始時にメッセージを出力できる...case_2: 0.00103211 sectitle | time (sec)--------+-----------case_1 | 0.00106case_2 | 0.00103--------+-----------(other) | 0.00006total | 0.00216/pre>br />ログの構文は,周りの邪魔にならない簡素なものがいいと思っていて,google-glog はその意味で好きですが,マクロです.マクロは名前空間代わりのプレフィックスを付けた方が親切ですが,ログの構文は簡素な方がいいので,上のようになっています.その代わり,そういうグローバルスコープの単純な名前は極力減らす方針で書いています.br />br />あと google-glog はリンクがいるし,最初に Init なんたらを呼ばなきゃいけないし,gflags との関係がややこしいので,何も考えずに使えるものが欲しかったということもあります.br />br />型ごとに verbosity を設定するのはほぼ思いつきなので,便利なのかどうかわからないです.br />br />というわけで,大したものではないですが,ぜひ.div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttp://blog.beam2d.net/2011/07/elog-c.html relbookmark titlepermanent link>abbr classpublished title2011-07-02T00:03:00+09:00>0:03/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.beam2d.net/2011/07/elog-c.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID590125630145334082&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID590125630145334082&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID590125630145334082&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID590125630145334082&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID590125630145334082&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID590125630145334082&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年6月24日金曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name8445278548287749777>/a>h3 classpost-title entry-title>a hrefhttp://blog.beam2d.net/2011/06/anchor-graph-hashing.html>数理輪講で Anchor Graph Hashing の紹介をしてきました/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-8445278548287749777>今日、大学の数理情報学輪講で発表してきました。br />br />div stylewidth:425px id__ss_8412276>strong styledisplay:block;margin:12px 0 4px>a hrefhttp://www.slideshare.net/beam2d/rinko2011-web titlerinko2011-agh>rinko2011-agh/a>/strong> iframe srchttp://www.slideshare.net/slideshow/embed_code/8412276 width425 height355 frameborder0 marginwidth0 marginheight0 scrollingno>/iframe> div stylepadding:5px 0 12px>View more a hrefhttp://www.slideshare.net/>presentations/a> from a hrefhttp://www.slideshare.net/beam2d>beam2d/a> /div>/div>br />今回は来週開催される ICML 2011 の論文 a hrefhttp://www.icml-2011.org/papers/6_icmlpaper.pdf>Hashing with Graphs/a> の紹介です。Anchor Graph Hashing (AGH) という近傍探索のための最新のハッシング手法を提案しています (なんでアルゴリズム名をタイトルにしなかったんだろう……)。一応スライドを読めばなんとなくわかるんじゃないかと思います。br />br />AGH は Spectral Hashing (SH) と同じ最適化問題を考えていて、それを解いてから out-of-sample extension の話に持っていくという流れも同じです。違うのは最適化問題を低ランク近似して解くところと、そのおかげで Nyström method という手法が使えて、SH みたいに分布に変な仮定を置いて固有関数問題をガリガリ解かなくて済むところ。データの次元、データ数のそれぞれについて線形時間のアルゴリズムになっています。br />br />低ランク近似は、第一著者の Liu が ICML2010 提案している Anchor Graph に基づいています。この Anchor Graph が良い性質をたくさん持っていて、アンカーを用いたマルコフ連鎖的な解釈もあって、ハッシング以外にもいろいろ使えるんじゃないかと思います。br />br />スライドでは論文の後半で述べられている階層的手法 (2-AGH) を紹介できませんでしたが、これは半分のビットは AGH で作って、残りは前半の各ビットに対して、うまく分けられなかった・分けるべきでなかった部分を補正するようなビットを入れる、という手法です。AGH は SH と同じく PCA みたいな手法なので、ビット数を増やすと固有値の低い (ノイズの多い) 主成分まで使うことになり、結果として MAP 精度が低下してしまう問題があります。階層的ハッシングでは半分のビットだけ AGH にして、後半はアドホックに作ることで、この問題をある程度回避しようとしています。が、半分は AGH で作るので、実験では 2-AGH でも下がったりしてます。br />br />SH と同じ問題なので、多様体学習的な要素が入ってきています。なので与えられた距離関数についての最近傍探索ではないです。実際、実験結果では単純に全比較をした場合よりも精度が高いです。面白いのは、Spectral Embedding したあとに単純な全比較をする方法 (SE l_2 Scan) よりも階層的ハッシング (2-AGH) の方が精度が良いということ。近傍探索については、遠い点同士の類似度はざっくりゼロに落としちゃう方が精度が上がるということなんでしょうか。br />br />Nyström method のあたりはちょっと難しいですが、SH に出てくる Laplace-Beltrami 作用素の固有関数問題のあたりに比べればだいぶわかりやすいと思います。Bengio+, 04 をパラパラ読めば結構分かるんではないかと。固有ベクトルから固有関数を近似する方法として、結構使われている?みたいです。br />br />ともかく Anchor Graph Hashing は面白いので、気になる方はぜひ論文も読むといいと思います。div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttp://blog.beam2d.net/2011/06/anchor-graph-hashing.html relbookmark titlepermanent link>abbr classpublished title2011-06-24T23:24:00+09:00>23:24/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.beam2d.net/2011/06/anchor-graph-hashing.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID8445278548287749777&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID8445278548287749777&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID8445278548287749777&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID8445278548287749777&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID8445278548287749777&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID8445278548287749777&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年5月28日土曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name4846875704901488528>/a>h3 classpost-title entry-title>a hrefhttp://blog.beam2d.net/2011/05/pca.html>PCA の練習/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-4846875704901488528>練習に a hrefhttp://archive.ics.uci.edu/ml/datasets/Iris>http://archive.ics.uci.edu/ml/datasets/Iris/a> のデータをさくっと PCA してみました。br />br />div>pre classprettyprint>#include <iostream>#include <string>#include <utility>#include <vector>#include <boost/algorithm/string.hpp>#include <boost/lexical_cast.hpp>#include <eigen3/Eigen/Dense>// #include <redsvd/redsvd.hpp>using namespace std;using namespace boost;int main() { vector<pair<string, vector<float>>> data; for (string line; getline(cin, line); ) { vector<string> row; split(row, line, is_any_of(",")); if (row.size() < 2) continue; auto p make_pair(move(row.back()), vector<float>()); row.pop_back(); for (const auto& val : row) p.second.push_back(lexical_cast<float>(val)); data.push_back(move(p)); } Eigen::MatrixXf data_matrix(data.size(), data0.second.size()); for (size_t i 0; i < data.size(); ++i) { for (size_t j 0; j < datai.second.size(); ++j) { data_matrix(i, j) datai.secondj; } } Eigen::JacobiSVD<Eigen::MatrixXf> svd( data_matrix, Eigen::ComputeThinU | Eigen::ComputeThinV); const auto& pca_dat svd.matrixU() * svd.singularValues().asDiagonal(); // const auto& pca_dat REDSVD::RedPCA(data_matrix, 2).scores(); for (int i 0; i < pca_dat.rows(); ++i) { cout << datai.first; for (int j 0; j < pca_dat.cols(); ++j) cout << ',' << pca_dat(i, j); cout << endl; }}/pre>/div>br />g++4.6 -stdc++0x でコンパイルできます。RedSVD を使う方はコメントアウトしてあります (svd, pca_dat の定義を消してコメントを戻せば RedSVD 版になる)。RedSVD の方は上位 2 次元だけ出力しています。Eigen は魔法ですね。チュートリアルも親切。でもリファレンス読むのは難しい。div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttp://blog.beam2d.net/2011/05/pca.html relbookmark titlepermanent link>abbr classpublished title2011-05-28T18:23:00+09:00>18:23/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.beam2d.net/2011/05/pca.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID4846875704901488528&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID4846875704901488528&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID4846875704901488528&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID4846875704901488528&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID4846875704901488528&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID4846875704901488528&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> /div>div classblog-pager idblog-pager>span idblog-pager-older-link>a classblog-pager-older-link hrefhttp://blog.beam2d.net/search?updated-max2011-05-28T18:23:00%2B09:00&max-results7 idBlog1_blog-pager-older-link title前の投稿>前の投稿/a>/span>a classhome-link hrefhttp://blog.beam2d.net/>ホーム/a>/div>div classclear>/div>div classblog-feeds>div classfeed-links>登録:a classfeed-link hrefhttp://blog.beam2d.net/feeds/posts/default target_blank typeapplication/atom+xml>コメント (Atom)/a>/div>/div>/div>/div>/div>/div>div classcolumn-left-outer>div classcolumn-left-inner>aside>div classsidebar section idsidebar-left-1>div classwidget AdSense data-version1 idAdSense1>div classwidget-content>script typetext/javascript>!--google_ad_clientpub-3074158404074723;google_ad_hostpub-1556223355139109;google_alternate_ad_urlhttp://img2.blogblog.com/img/blogger_ad.html;google_ad_width200;google_ad_height200;google_ad_format200x200_as;google_ad_typetext_image;google_ad_host_channel0001;google_color_borderFFFFFF;google_color_bgFFFFFF;google_color_link000000;google_color_url2288BB;google_color_text222222;//-->/script>script typetext/javascript srchttps://pagead2.googlesyndication.com/pagead/show_ads.js>/script>div classclear>/div>/div>/div>div classwidget Followers data-version1 idFollowers1>h2 classtitle>フォロワー/h2>div classwidget-content>div idFollowers1-wrapper>div stylemargin-right:2px;>div>script typetext/javascript srchttps://apis.google.com/js/platform.js>/script>div idfollowers-iframe-container>/div>script typetext/javascript> window.followersIframe null; function followersIframeOpen(url) { gapi.load(gapi.iframes, function() { if (gapi.iframes && gapi.iframes.getContext) { window.followersIframe gapi.iframes.getContext().openChild({ url: url, where: document.getElementById(followers-iframe-container), messageHandlersFilter: gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER, messageHandlers: { _ready: function(obj) { window.followersIframe.getIframeEl().height obj.height; }, reset: function() { window.followersIframe.close(); followersIframeOpen(https://www.blogger.com/followers/frame/8241445299985430179?colors\x3dCgt0cmFuc3BhcmVudBILdHJhbnNwYXJlbnQaByMzMzMzMzMiByNkNTJhMzMqByNmY2ZiZjUyByMzMzMzMzM6ByMzMzMzMzNCByNkNTJhMzNKByM2NjY2NjZSByNkNTJhMzNaC3RyYW5zcGFyZW50\x26pageSize\x3d21\x26hl\x3dja\x26origin\x3dhttp://blog.beam2d.net); }, open: function(url) { window.followersIframe.close(); followersIframeOpen(url); } } }); } }); } followersIframeOpen(https://www.blogger.com/followers/frame/8241445299985430179?colors\x3dCgt0cmFuc3BhcmVudBILdHJhbnNwYXJlbnQaByMzMzMzMzMiByNkNTJhMzMqByNmY2ZiZjUyByMzMzMzMzM6ByMzMzMzMzNCByNkNTJhMzNKByM2NjY2NjZSByNkNTJhMzNaC3RyYW5zcGFyZW50\x26pageSize\x3d21\x26hl\x3dja\x26origin\x3dhttp://blog.beam2d.net); /script>/div>/div>/div>div classclear>/div>/div>/div>div classwidget BlogArchive data-version1 idBlogArchive1>h2>ブログ アーカイブ/h2>div classwidget-content>div idArchiveList>div idBlogArchive1_ArchiveList>ul classhierarchy>li classarchivedate expanded>a classtoggle hrefjavascript:void(0)>span classzippy toggle-open> ▼ /span>/a>a classpost-count-link hrefhttp://blog.beam2d.net/2012/>2012/a>span classpost-count dirltr>(1)/span>ul classhierarchy>li classarchivedate expanded>a classtoggle hrefjavascript:void(0)>span classzippy toggle-open> ▼ /span>/a>a classpost-count-link hrefhttp://blog.beam2d.net/2012/03/>3月/a>span classpost-count dirltr>(1)/span>ul classposts>li>a hrefhttp://blog.beam2d.net/2012/03/my-campus-life.html>大学生活/a>/li>/ul>/li>/ul>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.beam2d.net/2011/>2011/a>span classpost-count dirltr>(7)/span>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.beam2d.net/2011/12/>12月/a>span classpost-count dirltr>(1)/span>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.beam2d.net/2011/08/>8月/a>span classpost-count dirltr>(1)/span>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.beam2d.net/2011/07/>7月/a>span classpost-count dirltr>(2)/span>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.beam2d.net/2011/06/>6月/a>span classpost-count dirltr>(1)/span>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.beam2d.net/2011/05/>5月/a>span classpost-count dirltr>(1)/span>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.beam2d.net/2011/02/>2月/a>span classpost-count dirltr>(1)/span>/li>/ul>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.beam2d.net/2010/>2010/a>span classpost-count dirltr>(2)/span>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.beam2d.net/2010/12/>12月/a>span classpost-count dirltr>(2)/span>/li>/ul>/li>/ul>/div>/div>div classclear>/div>/div>/div>div classwidget Profile data-version1 idProfile1>h2>自己紹介/h2>div classwidget-content>dl classprofile-datablock>dt classprofile-data>a classprofile-name-link g-profile hrefhttps://www.blogger.com/profile/16450714075725786395 relauthor stylebackground-image: url(//www.blogger.com/img/logo-16.png);>Seiya Tokui/a>/dt>/dl>a classprofile-link hrefhttps://www.blogger.com/profile/16450714075725786395 relauthor>詳細プロフィールを表示/a>div classclear>/div>/div>/div>div classwidget HTML data-version1 idHTML1>h2 classtitle>Google Code Prettify/h2>div classwidget-content>style typetext/css>@import http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css;pre.prettyprint { font-size: 93%;}/style>script srchttps://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js typetext/javascript>/script>script typetext/javascript>function prettify() { prettyPrint();}if (window.addEventListener) { window.addEventListener(load, prettify, false);} else if (window.attachEvent) { window.attachEvent(onload, prettify);} else { window.onload prettify;}/script>/div>div classclear>/div>/div>/div>/aside>/div>/div>div classcolumn-right-outer>div classcolumn-right-inner>aside>/aside>/div>/div>/div>div styleclear: both>/div>!-- columns -->/div>!-- main -->/div>/div>div classmain-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>footer>div classfooter-outer>div classfooter-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left footer-fauxborder-left>div classfauxborder-right footer-fauxborder-right>/div>div classregion-inner footer-inner>div classfoot no-items section idfooter-1>/div>table border0 cellpadding0 cellspacing0 classsection-columns columns-2>tbody>tr>td classfirst columns-cell>div classfoot no-items section idfooter-2-1>/div>/td>td classcolumns-cell>div classfoot no-items section idfooter-2-2>/div>/td>/tr>/tbody>/table>!-- outside of the include in order to lock Attribution widget -->div classfoot section idfooter-3 nameフッター>div classwidget Attribution data-version1 idAttribution1>div classwidget-content styletext-align: center;>Powered by a hrefhttps://www.blogger.com target_blank>Blogger/a>./div>div classclear>/div>/div>/div>/div>/div>div classfooter-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/footer>!-- content -->/div>/div>div classcontent-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/div>script typetext/javascript> window.setTimeout(function() { document.body.className document.body.className.replace(loading, ); }, 10); /script>script typetext/javascript srchttps://www.blogger.com/static/v1/widgets/2028843038-widgets.js>/script>script typetext/javascript>window__wavt AOuZoY7FaziWryKVY_C_HQk98UriwCRpFg:1770749177631;_WidgetManager._Init(//www.blogger.com/rearrange?blogID\x3d8241445299985430179,//blog.beam2d.net/,8241445299985430179);_WidgetManager._SetDataContext({name: blog, data: {blogId: 8241445299985430179, title: \u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8, url: http://blog.beam2d.net/, canonicalUrl: http://blog.beam2d.net/, homepageUrl: http://blog.beam2d.net/, searchUrl: http://blog.beam2d.net/search, canonicalHomepageUrl: http://blog.beam2d.net/, blogspotFaviconUrl: http://blog.beam2d.net/favicon.ico, bloggerUrl: https://www.blogger.com, hasCustomDomain: true, httpsEnabled: false, enabledCommentProfileImages: true, gPlusViewType: FILTERED_POSTMOD, adultContent: false, analyticsAccountNumber: , encoding: UTF-8, locale: ja, localeUnderscoreDelimited: ja, languageDirection: ltr, isPrivate: false, isMobile: false, isMobileRequest: false, mobileClass: , isPrivateBlog: false, isDynamicViewsAvailable: true, feedLinks: \x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22\u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8 - Atom\x22 href\x3d\x22http://blog.beam2d.net/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22\u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8 - RSS\x22 href\x3d\x22http://blog.beam2d.net/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22\u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8 - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/8241445299985430179/posts/default\x22 /\x3e\n, meTag: \x3clink rel\x3d\x22me\x22 href\x3d\x22https://www.blogger.com/profile/16450714075725786395\x22 /\x3e\n, adsenseClientId: ca-pub-3074158404074723, adsenseHostId: ca-host-pub-1556223355139109, adsenseHasAds: true, adsenseAutoAds: false, boqCommentIframeForm: true, loginRedirectParam: , view: , dynamicViewsCommentsSrc: //www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js, dynamicViewsScriptSrc: //www.blogblog.com/dynamicviews/a61ea7faac3eb272, plusOneApiSrc: https://apis.google.com/js/platform.js, disableGComments: true, interstitialAccepted: false, sharing: {platforms: {name: \u30ea\u30f3\u30af\u3092\u53d6\u5f97, key: link, shareMessage: \u30ea\u30f3\u30af\u3092\u53d6\u5f97, target: }, {name: Facebook, key: facebook, shareMessage: Facebook \u3067\u5171\u6709, target: facebook}, {name: BlogThis!, key: blogThis, shareMessage: BlogThis!, target: blog}, {name: \xd7, key: twitter, shareMessage: \xd7 \u3067\u5171\u6709, target: twitter}, {name: Pinterest, key: pinterest, shareMessage: Pinterest \u3067\u5171\u6709, target: pinterest}, {name: \u30e1\u30fc\u30eb, key: email, shareMessage: \u30e1\u30fc\u30eb, target: email}, disableGooglePlus: true, googlePlusShareButtonWidth: 0, googlePlusBootstrap: \x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27ja\x27};\x3c/script\x3e}, hasCustomJumpLinkMessage: false, jumpLinkMessage: \u7d9a\u304d\u3092\u8aad\u3080, pageType: index, pageName: , pageTitle: \u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8}}, {name: features, data: {}}, {name: messages, data: {edit: \u7de8\u96c6, linkCopiedToClipboard: \u30ea\u30f3\u30af\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\u3002, ok: OK, postLink: \u6295\u7a3f\u306e\u30ea\u30f3\u30af}}, {name: template, data: {isResponsive: false, isAlternateRendering: false, isCustom: false}}, {name: view, data: {classic: {name: classic, url: ?view\x3dclassic}, flipcard: {name: flipcard, url: ?view\x3dflipcard}, magazine: {name: magazine, url: ?view\x3dmagazine}, mosaic: {name: mosaic, url: ?view\x3dmosaic}, sidebar: {name: sidebar, url: ?view\x3dsidebar}, snapshot: {name: snapshot, url: ?view\x3dsnapshot}, timeslide: {name: timeslide, url: ?view\x3dtimeslide}, isMobile: false, title: \u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8, description: , url: http://blog.beam2d.net/, type: feed, isSingleItem: false, isMultipleItems: true, isError: false, isPage: false, isPost: false, isHomepage: true, isArchive: false, isLabelSearch: false}});_WidgetManager._RegisterWidget(_NavbarView, new _WidgetInfo(Navbar1, navbar, document.getElementById(Navbar1), {}, displayModeFull));_WidgetManager._RegisterWidget(_HeaderView, new _WidgetInfo(Header1, header, document.getElementById(Header1), {}, displayModeFull));_WidgetManager._RegisterWidget(_BlogView, new _WidgetInfo(Blog1, main, document.getElementById(Blog1), {cmtInteractionsEnabled: false, lightboxEnabled: true, lightboxModuleUrl: https://www.blogger.com/static/v1/jsbin/616846968-lbx__ja.js, lightboxCssUrl: https://www.blogger.com/static/v1/v-css/828616780-lightbox_bundle.css}, displayModeFull));_WidgetManager._RegisterWidget(_AdSenseView, new _WidgetInfo(AdSense1, sidebar-left-1, document.getElementById(AdSense1), {}, displayModeFull));_WidgetManager._RegisterWidget(_FollowersView, new _WidgetInfo(Followers1, sidebar-left-1, document.getElementById(Followers1), {}, displayModeFull));_WidgetManager._RegisterWidget(_BlogArchiveView, new _WidgetInfo(BlogArchive1, sidebar-left-1, document.getElementById(BlogArchive1), {languageDirection: ltr, loadingMessage: \u8aad\u307f\u8fbc\u307f\u4e2d\x26hellip;}, displayModeFull));_WidgetManager._RegisterWidget(_ProfileView, new _WidgetInfo(Profile1, sidebar-left-1, document.getElementById(Profile1), {}, displayModeFull));_WidgetManager._RegisterWidget(_HTMLView, new _WidgetInfo(HTML1, sidebar-left-1, document.getElementById(HTML1), {}, displayModeFull));_WidgetManager._RegisterWidget(_AttributionView, new _WidgetInfo(Attribution1, footer-3, document.getElementById(Attribution1), {}, displayModeFull));/script>/body>/html>
Port 443
HTTP/1.1 200 OKDate: Wed, 11 Feb 2026 04:43:33 GMTContent-Type: text/html; charsetUTF-8Transfer-Encoding: chunkedConnection: keep-aliveExpires: Wed, 11 Feb 2026 04:43:33 GMTCache-Control: private, max-age0Last-Modified: Tue, 24 Sep 2024 18:10:57 GMTNel: {report_to:cf-nel,success_fraction:0.0,max_age:604800}Report-To: {group:cf-nel,max_age:604800,endpoints:{url:https://a.nel.cloudflare.com/report/v4?sqg3l6%2FC%2BV6g8jkWoF5VnR48NpKz75I0Du2%2BqjHrPMmwQz9VjKJ1AS9A4Ik74kYkxJYd%2F%2Fbhfl1%2F9ozOHaWPfvC3ni8XEx97hc5P7ypo%3D}}X-Content-Type-Options: nosniffX-XSS-Protection: 1; modeblockServer: cloudflarecf-cache-status: DYNAMICvary: accept-encodingCF-RAY: 9cc12f9deef7abbf-PDXalt-svc: h3:443; ma86400 !DOCTYPE html>html classv2 dirltr langja>head>link hrefhttps://www.blogger.com/static/v1/widgets/335934321-css_bundle_v2.css relstylesheet typetext/css/>meta contentwidth1100 nameviewport/>meta contenttext/html; charsetUTF-8 http-equivContent-Type/>meta contentblogger namegenerator/>link hrefhttps://blog.beam2d.net/favicon.ico relicon typeimage/x-icon />link hrefhttps://blog.beam2d.net/ relcanonical />link relalternate typeapplication/atom+xml titleビームの報告書 - Atom hrefhttps://blog.beam2d.net/feeds/posts/default />link relalternate typeapplication/rss+xml titleビームの報告書 - RSS hrefhttps://blog.beam2d.net/feeds/posts/default?altrss />link relservice.post typeapplication/atom+xml titleビームの報告書 - Atom hrefhttps://www.blogger.com/feeds/8241445299985430179/posts/default />link relme hrefhttps://www.blogger.com/profile/16450714075725786395 />!--Cant find substitution for tag blog.ieCssRetrofitLinks-->meta contenthttp://blog.beam2d.net/ propertyog:url/>meta contentビームの報告書 propertyog:title/>meta content propertyog:description/>title>ビームの報告書/title>style idpage-skin-1 typetext/css>!--/*-----------------------------------------------Blogger Template StyleName: Awesome Inc.Designer: Tina ChenURL: tinachen.org----------------------------------------------- *//* Variable definitionsVariable namekeycolor descriptionMain Color typecolor default#ffffff/>Group descriptionPage selectorbody>Variable namebody.font descriptionFont typefontdefaultnormal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namebody.background.color descriptionBackground Color typecolor default#000000/>Variable namebody.text.color descriptionText Color typecolor default#ffffff/>/Group>Group descriptionLinks selector.main-inner>Variable namelink.color descriptionLink Color typecolor default#888888/>Variable namelink.visited.color descriptionVisited Color typecolor default#444444/>Variable namelink.hover.color descriptionHover Color typecolor default#cccccc/>/Group>Group descriptionBlog Title selector.header h1>Variable nameheader.font descriptionTitle Font typefontdefaultnormal bold 40px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable nameheader.text.color descriptionTitle Color typecolor default#333333 />Variable nameheader.background.color descriptionHeader Background typecolor defaulttransparent />/Group>Group descriptionBlog Description selector.header .description>Variable namedescription.font descriptionFont typefontdefaultnormal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namedescription.text.color descriptionText Color typecolordefault#333333 />/Group>Group descriptionTabs Text selector.tabs-inner .widget li a>Variable nametabs.font descriptionFont typefontdefaultnormal bold 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable nametabs.text.color descriptionText Color typecolor default#333333/>Variable nametabs.selected.text.color descriptionSelected Color typecolor default#333333/>/Group>Group descriptionTabs Background selector.tabs-outer .PageList>Variable nametabs.background.color descriptionBackground Color typecolor default#141414/>Variable nametabs.selected.background.color descriptionSelected Color typecolor default#444444/>Variable nametabs.border.color descriptionBorder Color typecolor default#aab123/>/Group>Group descriptionDate Header selector.main-inner .widget h2.date-header, .main-inner .widget h2.date-header span>Variable namedate.font descriptionFont typefontdefaultnormal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namedate.text.color descriptionText Color typecolor default#666666/>Variable namedate.border.color descriptionBorder Color typecolor default#aab123/>/Group>Group descriptionPost Title selectorh3.post-title, h4, h3.post-title a>Variable namepost.title.font descriptionFont typefontdefaultnormal bold 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namepost.title.text.color descriptionText Color typecolor default#333333/>/Group>Group descriptionPost Background selector.post>Variable namepost.background.color descriptionBackground Color typecolor default#fefdfa />Variable namepost.border.color descriptionBorder Color typecolor default#aab123 />Variable namepost.border.bevel.color descriptionBevel Color typecolor default#aab123/>/Group>Group descriptionGadget Title selectorh2>Variable namewidget.title.font descriptionFont typefontdefaultnormal bold 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namewidget.title.text.color descriptionText Color typecolor default#333333/>/Group>Group descriptionGadget Text selector.sidebar .widget>Variable namewidget.font descriptionFont typefontdefaultnormal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif/>Variable namewidget.text.color descriptionText Color typecolor default#333333/>Variable namewidget.alternate.text.color descriptionAlternate Color typecolor default#666666/>/Group>Group descriptionGadget Links selector.sidebar .widget>Variable namewidget.link.color descriptionLink Color typecolor default#d52a33/>Variable namewidget.link.visited.color descriptionVisited Color typecolor default#7d181e/>Variable namewidget.link.hover.color descriptionHover Color typecolor default#d52a33/>/Group>Group descriptionGadget Background selector.sidebar .widget>Variable namewidget.background.color descriptionBackground Color typecolor default#141414/>Variable namewidget.border.color descriptionBorder Color typecolor default#222222/>Variable namewidget.border.bevel.color descriptionBevel Color typecolor default#000000/>/Group>Group descriptionSidebar Background selector.column-left-inner .column-right-inner>Variable namewidget.outer.background.color descriptionBackground Color typecolor defaulttransparent />/Group>Group descriptionImages selector.main-inner>Variable nameimage.background.color descriptionBackground Color typecolor defaulttransparent/>Variable nameimage.border.color descriptionBorder Color typecolor defaulttransparent/>/Group>Group descriptionFeed selector.blog-feeds>Variable namefeed.text.color descriptionText Color typecolor default#333333/>/Group>Group descriptionFeed Links selector.blog-feeds>Variable namefeed.link.color descriptionLink Color typecolor default#d52a33/>Variable namefeed.link.visited.color descriptionVisited Color typecolor default#7d181e/>Variable namefeed.link.hover.color descriptionHover Color typecolor default#d52a33/>/Group>Group descriptionPager selector.blog-pager>Variable namepager.background.color descriptionBackground Color typecolor default#fefdfa />/Group>Group descriptionFooter selector.footer-outer>Variable namefooter.background.color descriptionBackground Color typecolor default#fefdfa />Variable namefooter.text.color descriptionText Color typecolor default#333333 />/Group>Variable nametitle.shadow.spread descriptionTitle Shadow typelength default-1px/>Variable namebody.background descriptionBody Background typebackgroundcolor#fcfbf5default$(color) none repeat scroll top left/>Variable namebody.background.gradient.cap descriptionBody Gradient Cap typeurldefaultnone/>Variable namebody.background.size descriptionBody Background Size typestring defaultauto/>Variable nametabs.background.gradient descriptionTabs Background Gradient typeurldefaultnone/>Variable nameheader.background.gradient descriptionHeader Background Gradient typeurl defaultnone />Variable nameheader.padding.top descriptionHeader Top Padding typelength default22px />Variable nameheader.margin.top descriptionHeader Top Margin typelength default0 />Variable nameheader.margin.bottom descriptionHeader Bottom Margin typelength default0 />Variable namewidget.padding.top descriptionWidget Padding Top typelength default8px />Variable namewidget.padding.side descriptionWidget Padding Side typelength default15px />Variable namewidget.outer.margin.top descriptionWidget Top Margin typelength default0 />Variable namewidget.outer.background.gradient descriptionGradient typeurl defaultnone />Variable namewidget.border.radius descriptionGadget Border Radius typelength default0 />Variable nameouter.shadow.spread descriptionOuter Shadow Size typelength default0 />Variable namedate.header.border.radius.top descriptionDate Header Border Radius Top typelength default0 />Variable namedate.header.position descriptionDate Header Position typelength default15px />Variable namedate.space descriptionDate Space typelength default30px />Variable namedate.position descriptionDate Float typestring defaultstatic />Variable namedate.padding.bottom descriptionDate Padding Bottom typelength default0 />Variable namedate.border.size descriptionDate Border Size typelength default0 />Variable namedate.background descriptionDate Background typebackground colortransparentdefault$(color) none no-repeat scroll top left />Variable namedate.first.border.radius.top descriptionDate First top radius typelength default5px />Variable namedate.last.space.bottom descriptionDate Last Space Bottom typelengthdefault20px />Variable namedate.last.border.radius.bottom descriptionDate Last bottom radius typelength default5px />Variable namepost.first.padding.top descriptionFirst Post Padding Top typelength default0 />Variable nameimage.shadow.spread descriptionImage Shadow Size typelength default0/>Variable nameimage.border.radius descriptionImage Border Radius typelength default0/>Variable nameseparator.outdent descriptionSeparator Outdent typelength default15px />Variable nametitle.separator.border.size descriptionWidget Title Border Size typelength default1px />Variable namelist.separator.border.size descriptionList Separator Border Size typelength default1px />Variable nameshadow.spread descriptionShadow Size typelength default0/>Variable namestartSide descriptionSide where text starts in blog language typeautomatic defaultleft/>Variable nameendSide descriptionSide where text ends in blog language typeautomatic defaultright/>Variable namedate.side descriptionSide where date header is placed typestring defaultright/>Variable namepager.border.radius.top descriptionPager Border Top Radius typelength default5px />Variable namepager.space.top descriptionPager Top Space typelength default1em />Variable namefooter.background.gradient descriptionBackground Gradient typeurl defaultnone />*/pre.prettyprint { font-size: 85%; }/* Content----------------------------------------------- */body {font: normal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #333333;background: #fcfbf5 none repeat scroll top left;}html body .content-outer {min-width: 0;max-width: 100%;width: 100%;}a:link {text-decoration: none;color: #d52a33;}a:visited {text-decoration: none;color: #7d181e;}a:hover {text-decoration: underline;color: #d52a33;}.body-fauxcolumn-outer .cap-top {position: absolute;z-index: 1;height: 276px;width: 100%;background: transparent none repeat-x scroll top left;_background-image: none;}/* Columns----------------------------------------------- */.content-inner {padding: 0;}.header-inner .section {margin: 0 16px;}.tabs-inner .section {margin: 0 16px;}.main-inner {padding-top: 30px;}.main-inner .column-center-inner,.main-inner .column-left-inner,.main-inner .column-right-inner {padding: 0 5px;}*+html body .main-inner .column-center-inner {margin-top: -30px;}#layout .main-inner .column-center-inner {margin-top: 0;}/* Header----------------------------------------------- */.header-outer {margin: 0 0 0 0;background: transparent none repeat scroll 0 0;}.Header h1 {font: normal normal 48px Georgia, Utopia, Palatino Linotype, Palatino, serif;color: #333333;text-shadow: 0 0 -1px #000000;}.Header h1 a {color: #333333;}.Header .description {font: normal normal 20px Georgia, Utopia, Palatino Linotype, Palatino, serif;color: #908d6a;}.header-inner .Header .titlewrapper,.header-inner .Header .descriptionwrapper {padding-left: 0;padding-right: 0;margin-bottom: 0;}.header-inner .Header .titlewrapper {padding-top: 22px;}/* Tabs----------------------------------------------- */.tabs-outer {overflow: hidden;position: relative;background: #b3ca88 url(http://www.blogblog.com/1kt/awesomeinc/tabs_gradient_light.png) repeat scroll 0 0;}#layout .tabs-outer {overflow: visible;}.tabs-cap-top, .tabs-cap-bottom {position: absolute;width: 100%;border-top: 1px solid #908d6a;}.tabs-cap-bottom {bottom: 0;}.tabs-inner .widget li a {display: inline-block;margin: 0;padding: .6em 1.5em;font: normal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #333333;border-top: 1px solid #908d6a;border-bottom: 1px solid #908d6a;border-left: 1px solid #908d6a;}.tabs-inner .widget li:last-child a {border-right: 1px solid #908d6a;}.tabs-inner .widget li.selected a, .tabs-inner .widget li a:hover {background: #63704b url(http://www.blogblog.com/1kt/awesomeinc/tabs_gradient_light.png) repeat-x scroll 0 -100px;color: #ffffff;}/* Headings----------------------------------------------- */h2 {font: normal bold 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #333333;}/* Widgets----------------------------------------------- */.main-inner .section {margin: 0 27px;padding: 0;}.main-inner .column-left-outer,.main-inner .column-right-outer {margin-top: 0;}#layout .main-inner .column-left-outer,#layout .main-inner .column-right-outer {margin-top: 0;}.main-inner .column-left-inner,.main-inner .column-right-inner {background: transparent none repeat 0 0;-moz-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 0 rgba(0, 0, 0, .2);box-shadow: 0 0 0 rgba(0, 0, 0, .2);-moz-border-radius: 5px;-webkit-border-radius: 5px;-goog-ms-border-radius: 5px;border-radius: 5px;}#layout .main-inner .column-left-inner,#layout .main-inner .column-right-inner {margin-top: 0;}.sidebar .widget {font: normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #333333;}.sidebar .widget a:link {color: #d52a33;}.sidebar .widget a:visited {color: #7d181e;}.sidebar .widget a:hover {color: #d52a33;}.sidebar .widget h2 {text-shadow: 0 0 -1px #000000;}.main-inner .widget {background-color: #fefdfa;border: 1px solid #aab123;padding: 0 15px 15px;margin: 20px -16px;-moz-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 20px rgba(0, 0, 0, .2);box-shadow: 0 0 20px rgba(0, 0, 0, .2);-moz-border-radius: 5px;-webkit-border-radius: 5px;-goog-ms-border-radius: 5px;border-radius: 5px;}.main-inner .widget h2 {margin: 0 -0;padding: .6em 0 .5em;border-bottom: 1px solid transparent;}.footer-inner .widget h2 {padding: 0 0 .4em;border-bottom: 1px solid transparent;}.main-inner .widget h2 + div, .footer-inner .widget h2 + div {border-top: 1px solid #aab123;padding-top: 8px;}.main-inner .widget .widget-content {margin: 0 -0;padding: 7px 0 0;}.main-inner .widget ul, .main-inner .widget #ArchiveList ul.flat {margin: -8px -15px 0;padding: 0;list-style: none;}.main-inner .widget #ArchiveList {margin: -8px 0 0;}.main-inner .widget ul li, .main-inner .widget #ArchiveList ul.flat li {padding: .5em 15px;text-indent: 0;color: #666666;border-top: 0 solid #aab123;border-bottom: 1px solid transparent;}.main-inner .widget #ArchiveList ul li {padding-top: .25em;padding-bottom: .25em;}.main-inner .widget ul li:first-child, .main-inner .widget #ArchiveList ul.flat li:first-child {border-top: none;}.main-inner .widget ul li:last-child, .main-inner .widget #ArchiveList ul.flat li:last-child {border-bottom: none;}.post-body {position: relative;}.main-inner .widget .post-body ul {padding: 0 2.5em;margin: .5em 0;list-style: disc;}.main-inner .widget .post-body ul li {padding: 0.25em 0;margin-bottom: .25em;color: #333333;border: none;}.footer-inner .widget ul {padding: 0;list-style: none;}.widget .zippy {color: #666666;}/* Posts----------------------------------------------- */body .main-inner .Blog {padding: 0;margin-bottom: 1em;background-color: transparent;border: none;-moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0);-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0);-goog-ms-box-shadow: 0 0 0 rgba(0, 0, 0, 0);box-shadow: 0 0 0 rgba(0, 0, 0, 0);}.main-inner .section:last-child .Blog:last-child {padding: 0;margin-bottom: 1em;}.main-inner .widget h2.date-header {margin: 0 -15px 1px;padding: 0 0 0 0;font: normal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #908d6a;background: transparent none no-repeat scroll top left;border-top: 0 solid #aab123;border-bottom: 1px solid transparent;-moz-border-radius-topleft: 0;-moz-border-radius-topright: 0;-webkit-border-top-left-radius: 0;-webkit-border-top-right-radius: 0;border-top-left-radius: 0;border-top-right-radius: 0;position: static;bottom: 100%;right: 15px;text-shadow: 0 0 -1px #000000;}.main-inner .widget h2.date-header span {font: normal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif;display: block;padding: .5em 15px;border-left: 0 solid #aab123;border-right: 0 solid #aab123;}.date-outer {position: relative;margin: 30px 0 20px;padding: 0 15px;background-color: #fefdfa;border: 1px solid #aab123;-moz-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 20px rgba(0, 0, 0, .2);box-shadow: 0 0 20px rgba(0, 0, 0, .2);-moz-border-radius: 5px;-webkit-border-radius: 5px;-goog-ms-border-radius: 5px;border-radius: 5px;}.date-outer:first-child {margin-top: 0;}.date-outer:last-child {margin-bottom: 20px;-moz-border-radius-bottomleft: 5px;-moz-border-radius-bottomright: 5px;-webkit-border-bottom-left-radius: 5px;-webkit-border-bottom-right-radius: 5px;-goog-ms-border-bottom-left-radius: 5px;-goog-ms-border-bottom-right-radius: 5px;border-bottom-left-radius: 5px;border-bottom-right-radius: 5px;}.date-posts {margin: 0 -0;padding: 0 0;clear: both;}.post-outer, .inline-ad {border-top: 1px solid #aab123;margin: 0 -0;padding: 15px 0;}.post-outer {padding-bottom: 10px;}.post-outer:first-child {padding-top: 0;border-top: none;}.post-outer:last-child, .inline-ad:last-child {border-bottom: none;}.post-body {position: relative;}.post-body img {padding: 8px;background: #ffffff;border: 1px solid #cccccc;-moz-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);box-shadow: 0 0 20px rgba(0, 0, 0, .2);-moz-border-radius: 5px;-webkit-border-radius: 5px;border-radius: 5px;}h3.post-title, h4 {font: normal normal 22px Georgia, Utopia, Palatino Linotype, Palatino, serif;color: #d52a33;}h3.post-title a {font: normal normal 22px Georgia, Utopia, Palatino Linotype, Palatino, serif;color: #d52a33;}h3.post-title a:hover {color: #d52a33;text-decoration: underline;}.post-header {margin: 0 0 1em;}.post-body {line-height: 1.6;}.post-outer h2 {color: #333333;}.post-footer {margin: 1.5em 0 0;}#blog-pager {padding: 15px;font-size: 120%;background-color: #fefdfa;border: 1px solid #aab123;-moz-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 20px rgba(0, 0, 0, .2);box-shadow: 0 0 20px rgba(0, 0, 0, .2);-moz-border-radius: 5px;-webkit-border-radius: 5px;-goog-ms-border-radius: 5px;border-radius: 5px;-moz-border-radius-topleft: 5px;-moz-border-radius-topright: 5px;-webkit-border-top-left-radius: 5px;-webkit-border-top-right-radius: 5px;-goog-ms-border-top-left-radius: 5px;-goog-ms-border-top-right-radius: 5px;border-top-left-radius: 5px;border-top-right-radius-topright: 5px;margin-top: 1em;}.blog-feeds, .post-feeds {margin: 1em 0;text-align: center;color: #333333;}.blog-feeds a, .post-feeds a {color: #d52a33;}.blog-feeds a:visited, .post-feeds a:visited {color: #7d181e;}.blog-feeds a:hover, .post-feeds a:hover {color: #d52a33;}.post-outer .comments {margin-top: 2em;}/* Footer----------------------------------------------- */.footer-outer {margin: -20px 0 -1px;padding: 20px 0 0;color: #333333;overflow: hidden;}.footer-fauxborder-left {border-top: 1px solid #aab123;background: #fefdfa none repeat scroll 0 0;-moz-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 20px rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 20px rgba(0, 0, 0, .2);box-shadow: 0 0 20px rgba(0, 0, 0, .2);margin: 0 -20px;}/* Mobile----------------------------------------------- */*+html body.mobile .main-inner .column-center-inner {margin-top: 0;}.mobile .main-inner .widget {padding: 0 0 15px;}.mobile .main-inner .widget h2 + div,.mobile .footer-inner .widget h2 + div {border-top: none;padding-top: 0;}.mobile .footer-inner .widget h2 {padding: 0.5em 0;border-bottom: none;}.mobile .main-inner .widget .widget-content {margin: 0;padding: 7px 0 0;}.mobile .main-inner .widget ul,.mobile .main-inner .widget #ArchiveList ul.flat {margin: 0 -15px 0;}.mobile .main-inner .widget h2.date-header {right: 0;}.mobile .date-header span {padding: 0.4em 0;}.mobile .date-outer:first-child {margin-bottom: 0;border: 1px solid #aab123;-moz-border-radius-topleft: 5px;-moz-border-radius-topright: 5px;-webkit-border-top-left-radius: 5px;-webkit-border-top-right-radius: 5px;-goog-ms-border-top-left-radius: 5px;-goog-ms-border-top-right-radius: 5px;border-top-left-radius: 5px;border-top-right-radius: 5px;}.mobile .date-outer {border-color: #aab123;border-width: 0 1px 1px;}.mobile .date-outer:last-child {margin-bottom: 0;}.mobile .main-inner {padding: 0;}.mobile .header-inner .section {margin: 0;}.mobile .blog-posts {padding: 0 10px;}.mobile .post-outer, .mobile .inline-ad {padding: 5px 0;}.mobile .tabs-inner .section {margin: 0 10px;}.mobile .main-inner .widget h2 {margin: 0;padding: 0;}.mobile .main-inner .widget h2.date-header span {padding: 0;}.mobile .main-inner .widget .widget-content {margin: 0;padding: 7px 0 0;}.mobile #blog-pager {border: 1px solid transparent;background: #fefdfa none repeat scroll 0 0;}.mobile .main-inner .column-left-inner,.mobile .main-inner .column-right-inner {background: transparent none repeat 0 0;-moz-box-shadow: none;-webkit-box-shadow: none;-goog-ms-box-shadow: none;box-shadow: none;}.mobile .date-posts {margin: 0;padding: 0;}.mobile .footer-fauxborder-left {margin: 0;border-top: inherit;}.mobile .main-inner .section:last-child .Blog:last-child {margin-bottom: 0;}.mobile-index-contents {color: #333333;}.mobile .mobile-link-button {background: #d52a33 url(http://www.blogblog.com/1kt/awesomeinc/tabs_gradient_light.png) repeat scroll 0 0;}.mobile-link-button a:link, .mobile-link-button a:visited {color: #fefdfa;}body.mobile {background-size: auto;}-->/style>style idtemplate-skin-1 typetext/css>!--body {min-width: 890px;}.content-outer, .content-fauxcolumn-outer, .region-inner {min-width: 890px;max-width: 890px;_width: 890px;}.main-inner .columns {padding-left: 260px;padding-right: 0px;}.main-inner .fauxcolumn-center-outer {left: 260px;right: 0px;/* IE6 does not respect left and right together */_width: expression(this.parentNode.offsetWidth -parseInt(260px) -parseInt(0px) + px);}.main-inner .fauxcolumn-left-outer {width: 260px;}.main-inner .fauxcolumn-right-outer {width: 0px;}.main-inner .column-left-outer {width: 260px;right: 100%;margin-left: -260px;}.main-inner .column-right-outer {width: 0px;margin-right: -0px;}#layout {min-width: 0;}#layout .content-outer {min-width: 0;width: 800px;}#layout .region-inner {min-width: 0;width: auto;}body#layout div.add_widget {padding: 8px;}body#layout div.add_widget a {margin-left: 32px;}-->/style>link hrefhttps://www.blogger.com/dyn-css/authorization.css?targetBlogID8241445299985430179&zx0f7a6dda-c51f-4067-98ae-c9430d403700 medianone onloadif(media!'all')media'all' relstylesheet/>noscript>link hrefhttps://www.blogger.com/dyn-css/authorization.css?targetBlogID8241445299985430179&zx0f7a6dda-c51f-4067-98ae-c9430d403700 relstylesheet/>/noscript>meta namegoogle-adsense-platform-account contentca-host-pub-1556223355139109/>meta namegoogle-adsense-platform-domain contentblogspot.com/>!-- data-ad-clientca-pub-3074158404074723 -->/head>body classloading>div classnavbar section idnavbar nameNavbar>div classwidget Navbar data-version1 idNavbar1>script typetext/javascript> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener(load, function(){ objectattribute val; }, false); } else { window.attachEvent(onload, function(){ objectattribute val; }); } } /script>div idnavbar-iframe-container>/div>script typetext/javascript srchttps://apis.google.com/js/platform.js>/script>script typetext/javascript> gapi.load(gapi.iframes:gapi.iframes.style.bubble, function() { if (gapi.iframes && gapi.iframes.getContext) { gapi.iframes.getContext().openChild({ url: https://www.blogger.com/navbar/8241445299985430179?origin\x3dhttp://blog.beam2d.net, where: document.getElementById(navbar-iframe-container), id: navbar-iframe }); } }); /script>script typetext/javascript>(function() {var script document.createElement(script);script.type text/javascript;script.src //pagead2.googlesyndication.com/pagead/js/google_top_exp.js;var head document.getElementsByTagName(head)0;if (head) {head.appendChild(script);}})();/script>/div>/div>div itemscopeitemscope itemtypehttp://schema.org/Blog styledisplay: none;>meta contentビームの報告書 itempropname/>/div>div classbody-fauxcolumns>div classfauxcolumn-outer body-fauxcolumn-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/div>div classcontent>div classcontent-fauxcolumns>div classfauxcolumn-outer content-fauxcolumn-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/div>div classcontent-outer>div classcontent-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left content-fauxborder-left>div classfauxborder-right content-fauxborder-right>/div>div classcontent-inner>header>div classheader-outer>div classheader-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left header-fauxborder-left>div classfauxborder-right header-fauxborder-right>/div>div classregion-inner header-inner>div classheader section idheader nameヘッダー>div classwidget Header data-version1 idHeader1>div idheader-inner>div classtitlewrapper>h1 classtitle>ビームの報告書/h1>/div>div classdescriptionwrapper>p classdescription>span>/span>/p>/div>/div>/div>/div>/div>/div>div classheader-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/header>div classtabs-outer>div classtabs-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left tabs-fauxborder-left>div classfauxborder-right tabs-fauxborder-right>/div>div classregion-inner tabs-inner>div classtabs no-items section idcrosscol nameCross-Column>/div>div classtabs no-items section idcrosscol-overflow nameCross-Column 2>/div>/div>/div>div classtabs-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>div classmain-outer>div classmain-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left main-fauxborder-left>div classfauxborder-right main-fauxborder-right>/div>div classregion-inner main-inner>div classcolumns fauxcolumns>div classfauxcolumn-outer fauxcolumn-center-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>div classfauxcolumn-outer fauxcolumn-left-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>div classfauxcolumn-outer fauxcolumn-right-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>!-- corrects IE6 width calculation -->div classcolumns-inner>div classcolumn-center-outer>div classcolumn-center-inner>div classmain section idmain nameメイン>div classwidget Blog data-version1 idBlog1>div classblog-posts hfeed> div classdate-outer> h2 classdate-header>span>2012年3月5日月曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name3547211439776906717>/a>h3 classpost-title entry-title>a hrefhttps://blog.beam2d.net/2012/03/my-campus-life.html>大学生活/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-3547211439776906717>今日,製本用の修士論文を提出しました. 6年つづいた学生生活も終わりが近づいてきました.br />br />この6年間にはいろんなことがありました.br />br />前半の4年間は駒場へ通っていました. 2007 年 10 月からは数学科にいました. そこにはガチでやばい数学erがいて,そうでない人も段々頭を書き換えられて数学語ばかり喋るようになっていくやばい場所でした. 特別ガチでやばい二人と輪読した結び目理論の本は飛び抜けて難しかったですが,あれはワクワクしました. 僕は数学科生として結局は中途半端な感じになり,コンピューターを前からやってみたかったのもあって,情報理工に進むことにしました.br />br />少し戻って,2007 年の駒場祭の帰り,友人と2人でゲームをつくる学内サークルを作りました(現a hrefhttps://n-linear.org/>ノンリニア/a>). はじめの頃に集まった十数人のメンバーに全力で支えられた1年間のことを,今でもよく覚えています. 思いつきと勢いで始めたサークルがこんなに大きくなって今でも回っていて,不思議な気分です. 先日の追い出しコンパ,とても楽しかったです!br />br />後半の2年間は本郷へ通っていました. 情報理工に進み,今月まで中川研に所属しています. 最初の一年は機械学習の勉強でした. パーセプトロンや SVM すら聞いたことのない状態からはじめて,いつも頭の中がフワフワしている気分でした. 系列学習をやっていましたが,ちょっと理解がフワフワすぎで,うまくいきませんでした. 去年の2月ごろからは近傍探索のハッシュを勉強し始めました. こちらは割と性に合っていました. 機械学習に対する認識も少しずつこなれてきて,気分的には今やっとスタートラインに立てたかなってくらいの感じです.br />br />インターンやバイトもしました (僕にしては珍しく積極的です). おととしの夏には Google に通いました. Mozc チームは技術レベルが半端なく高くて,そこでの仕事は貴重な体験でした. 作ったものが OSS で公開されたのが嬉しかったです. そこで知り合った iwiwi くんに (しつこくお願いして) 紹介してもらって,直後の 11 月からは a hrefhttp://preferred.jp/>PFI/a> でアルバイトをしています. こちらは密で濃くて尖っていて,とても楽しく刺激的です. 去年の3月には pixiv のインターンに参加しました. 僕が会ってこなかったタイプの人がたくさんいて,新しい刺激をたくさんもらいました.br />br />今年に入って,初めての論文 (修論) を書き,初めて会議論文を投稿しました. 結果がどうなるかドキドキですが,ともかく大学生活はほぼ終わりました. 今やっと羽をのばしはじめたところ,あと一ヶ月も残っていません.小旅行的サムシングの予定が2つほどありますが,他の時間何しようかなあとぼんやり考えています.br />br />4月からは社会人です. PFI で研究開発メンバーとしてがんばっていきます. よろしくお願いいたしますっ!div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttps://blog.beam2d.net/2012/03/my-campus-life.html relbookmark titlepermanent link>abbr classpublished title2012-03-05T23:59:00+09:00>23:59/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttps://blog.beam2d.net/2012/03/my-campus-life.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID3547211439776906717&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID3547211439776906717&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID3547211439776906717&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID3547211439776906717&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID3547211439776906717&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID3547211439776906717&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div>div classinline-ad>script typetext/javascript>!--google_ad_clientpub-3074158404074723;google_ad_hostpub-1556223355139109;google_ad_width300;google_ad_height250;google_ad_format300x250_as;google_ad_typetext_image;google_ad_host_channel0001;google_color_borderFFFFFF;google_color_bgFFFFFF;google_color_link2288BB;google_color_url666666;google_color_text222222;//-->/script>script typetext/javascript srchttps://pagead2.googlesyndication.com/pagead/show_ads.js>/script>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年12月24日土曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name7753304012530348822>/a>h3 classpost-title entry-title>a hrefhttps://blog.beam2d.net/2011/12/eigenarpack.html>Eigenの実対称行列の固有値問題をARPACKで解く/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-7753304012530348822>p>ハイパーお久しぶりです. 修論に追われていて,先輩方に言われた「正月はもう一週間前に終わった」という言葉をかみしめています (とてもにがい)./p>p>今日は,a hrefhttp://www.caam.rice.edu/software/ARPACK/>ARPACK/a> を使って a hrefhttp://eigen.tuxfamily.org/>Eigen/a> の実対称行列の固有値・固有ベクトルを求めるために薄いラッパーを書いたので,ご紹介いたします./p>p>a hrefhttps://github.com/beam2d/arpaca>beam2d/arpaca - GitHub/a>/p>p>基本的な使い方は README に書いてあります. 求めたい固有値の数と種類 (実数 (or 絶対値) の意味で大きい (or 小さい) 方からいくつか,あるいは次数の意味で両側から合わせていくつか) を指定して,行列を渡すだけです. 行列は掛け算にだけ用いられるので,Eigen の Expression Template を直接渡すこともできます. また README の 2 番目の例のように,対象となる行列をベクトルにかける演算を自分で書いて渡せば,その固有値を求めることができます. これは複数の大規模疎行列の和や積の形をした行列をそのまま扱う場合などに有効です./p>p>中身の話をすると,基本的には ARPACK の関数 dsaupd, dseupd, ssaupd, sseupd のラッパーです. これらの使い方についてはソースコード (dsaupd.f, ..., sseupd.f) の先頭に詳しく書かれていますが,a hrefhttp://www.mlab.ice.uec.ac.jp/~ej-sib/numerical/numerical_arpack.html>数値計算マニュアル:線型代数 (3)/a> にこれの翻訳と解説が書かれていて,わかりやすいです (と言っても ARPACK 自体は Fortran で書かれた古のコードなので,いろいろはまって苦労しました). ARPACK の C++ ラッパーとしては公式に ARPACK++ というものがありますが,これがいかんせん古く,今のコンパイラーで通るように直すのが大変そうだったので,今回欲しかった実対称行列の固有値問題に絞ってラッパーを書いたものが arpaca です./p>p>最近は,大規模固有値問題を解くためのライブラリーは ARPACK 以外にもあるようです. 特に有力そうなのは a hrefhttp://www.grycap.upv.es/slepc/>SLEPc/a> ですが,これは MPI を用いた並列計算が前提のようで,本当に巨大な疎行列の固有値問題を解く場合には使えそうですが,お手軽さはなさそうです. 他にも a hrefhttp://trilinos.sandia.gov/packages/anasazi/>anasazi/a> は Krylov-Schur アルゴリズムや Davidson アルゴリズムのブロック化版などを実装しています. これは Trilinos という大きなパッケージの一部らしく,今回はあまり見ていません./p>p>アルゴリズムの話をします. ARPACK (ARnoldi PACKage の略) が実装しているのは Implicitly Restarted Arnoldi (IRA) method という手法です. Arnoldi method は一般の行列をa hrefhttp://>ヘッセンベルグ行列/a>に変換する手法ですが,実対称行列やエルミート行列に対しては対称三重対角行列となり効率が良く,特に Lanczos method の名前で知られています. Lanczos method は対象となる行列 A の Krylov 部分空間 {q, Aq, Asup>2/sup>q, ...} を求めることで三重対角化を行いますが,implicit restart を行うことでこのうち必要となる固有ベクトルを含む低次元の部分空間を効率よく求めることができて,出てきた小さな三重対角行列の固有値分解は高速に求めることができる,というのが IRA の方法です. ここらへんの話は a hrefhttps://www.amazon.co.jp/gp/product/0801854148/refas_li_tf_tl?ieUTF8&tagbeamrainbowcr-22&linkCodeas2&camp247&creative1211&creativeASIN0801854148>Matrix Computations/a> や a hrefhttps://www.amazon.co.jp/gp/product/0470528338/refas_li_tf_tl?ieUTF8&tagbeamrainbowcr-22&linkCodeas2&camp247&creative1211&creativeASIN0470528338>Fundamentals of Matrix Computations/a> が詳しいです. まだ詳しく読んでいませんが,二つ目の本には IRA のさらに変形版である Krylov-Schur アルゴリズムや,中途半端な位置にある固有値も求めることができる Jacobi-Davidson method なども載っています./p>p>時間があったらここらへん自分でも実装してみたいです. 実装の際には,Eigen::SelfAdjointEigenSolver の中に三重対角行列の固有値ソルバーが書かれていて,参考になりそうです. これは internal なので直接呼び出すのはアレかもしれませんが…… (a hrefhttp://eigen.tuxfamily.org/bz/show_bug.cgi?id326>外に露出させろというバグ/a>も提出されていますが,対応されるかどうか). Eigen の疎行列モジュールは,a hrefhttp://eigen.tuxfamily.org/index.php?titleChangeLog#Eigen_3.1.0-alpha1>3.1.0-alpha1/a> で今まで unsupported/SparseExtra にあったソルバーがたくさんメイン入りするなどしているので,将来的に大規模固有値問題もサポートされないかなあと期待はしています./p>p>というわけで,メリクリさまでした!/p>div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttps://blog.beam2d.net/2011/12/eigenarpack.html relbookmark titlepermanent link>abbr classpublished title2011-12-24T20:41:00+09:00>20:41/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttps://blog.beam2d.net/2011/12/eigenarpack.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID7753304012530348822&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID7753304012530348822&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID7753304012530348822&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID7753304012530348822&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID7753304012530348822&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID7753304012530348822&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年8月19日金曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name2866826318272431678>/a>h3 classpost-title entry-title>a hrefhttps://blog.beam2d.net/2011/08/suffix-array-sa-is.html>Suffix Array を作る - SA-IS の実装/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-2866826318272431678>a hrefhttps://ja.wikipedia.org/wiki/%E6%8E%A5%E5%B0%BE%E8%BE%9E%E9%85%8D%E5%88%97>Suffix Array/a> は今若者の間で人気のデータ構造です. マイ suffix array を実装することで,オシャレ度がアップしてモテ系になり,女子力も上がると言われています. その中でも今特に,手軽でクールな SA-IS (アルファベットサイズ固定の下で線形時間で省メモリで suffix array が作れる今最強のアルゴリズム) の実装がブームです. 僕もブームに便乗して,実装してみました.br />br />ところで,SA-IS は流行っているので,日本語でもすでに様々なところで記事が書かれています (日付順).br />br />ul>li>a hrefhttp://d.hatena.ne.jp/echizen_tm/20100325/1269533804>SAIS(Suffix Array - Induced Sorting) - EchizenBlog-Zwei/a>/li>li>a hrefhttp://d.hatena.ne.jp/sile/20101213/1292190698>SA-IS: SuffixArray線形構築 - sileの日記/a>/li>li>a hrefhttp://topcoder.g.hatena.ne.jp/iwiwi/20110720/1311168147>SA-IS - (iwi) { 反省します - TopCoder部/a>/li>li>a hrefhttp://d.hatena.ne.jp/xxxxxeeeee/20110810/1312996441>接尾辞配列(Suffix Array)の効率的な実装手法について - xxxxxeeeeeの日記/a>/li>/ul>br />仕掛けが気になる人はまずここら辺を眺めて,え,そこどうなってんの,ってなったら下の論文を読むのが良いです.br />br />ul>li>G. Nong, S. Zhang and W. H. Chan, Two Efficient Algorithms for Linear Time Suffix Array Construction, IEEE Transactions on Computers, To Appear/li>/ul>br />SA-IS の元論文は 2009 年ですが,上の論文 (まだドラフト,a hrefhttp://www.cs.sysu.edu.cn/nong/>PDF が G. Nong さんのページにある/a>) に C のコードがついてるので,それを見ながらがわかりやすいです (というかソース読まないとわかんない).br />br />br />h4>実装と実験/h4>br />この論文についている実装ですが,\0 を番兵に使うのでバイナリとかだと使えません. ちゃんとした実装は a hrefhttps://sites.google.com/site/yuta256/sais>sais/a> が良さそうで,上の G. Nong さんのページからも refer されています. a hrefhttps://code.google.com/p/esaxx/>esaxx - C++ enhanced suffix array template library - Google Project Hosting/a> でもこれが使われています.br />br />僕が書いた実装はbr />br />a hrefhttps://github.com/beam2d/sara>beam2d/sara - GitHub/a>br />br />にあります. 本体はヘッダー sara.h 一個です. 使い方は簡単で,文字列 code>str/code> に対して code>sara::make(str, ch_max)/code> で suffix array が返ってきます.br />br />上の論文にある C のコード (100 行弱) よりは長い (160 行強) ですが,番兵なしで,入力と出力がテンプレート化されてます (sais もそうですが). 文字の型は組み込み整数型ならなんでもいいですが,値の範囲は 0 から指定した値 ch_max までに収まっている必要があります.br />br />検証と評価用のサンプルが sara_main.cc (sara) です. 今回僕が唐突に SA-IS を実装し始めたのはレポートのためなんですが (冒頭の件? 何の話ですか?),その中では a hrefhttp://corpus.canterbury.ac.nz/descriptions/>The Canterbury Corpus/a> にあるデータを使って検証と実行時間の計測を行い,code>std::lexicographical_compare/code> と code>std::sort/code> を使うだけの単純な suffix array 構築と比較しました. 詳細は省きますが,普通の文書だと 4 倍くらいの差しかなくて,割とクイックソート速いのねという感じです. 一方,似たパターンが連続するバイナリデータだと愚直な文字列比較ソートは激遅で,例えば第一世代 Core i5 2.67GHz で, ptt5 (FAX, 501KB) は code>std::sort/code> だと 28.1 秒, code>sara::make/code> だと 0.040 秒でした. 繰り返しを多く含む人工データではさらに差が広がります.br />br />br />h4>適当な解説/h4>br />アルゴリズムをひと通り説明します. が,正直がんばってわかりやすく説明するげんきが残っていないので,適当です!!! わからなくなったら上のブログとか論文とかついてるソースコードとかを見るのが良いです.br />br />各 suffix に対して,右隣の suffix より (辞書式順序で) 大きいか小さいかで L-type と S-type というラベルを振ります. L/S を並べると例えば mmiissiissiippii$ という文字列 ($ は終端文字で最小の文字で必ず S-type とする) なら LLSSLLSSLLSSLLLLS となります. 最終的な suffix array はまず先頭文字についてソートされているので,先頭文字ごとのバケツを作ります. suffix 同士の先頭文字が等しい場合,L-type の方が S-type より必ず先に来ることに注意します. つまり各バケツはさらに前半・後半で L-type / S-type にわかれます.br />br />SA-IS ではまず L-type だけをソートします. 先頭文字と type が等しい場合,右隣の suffix の大小がそのままもとの suffix の大小になることを利用して,「まだ見ていない L-type の右隣の suffix の中で最小のものを含むソートされたリスト」を持っておき,最小のものを取り出し,左隣の suffix が L-type なら対応するバケツに入れて,リストに加える,という操作をリストが空になるまで繰り返します. このリストは,後述する初期値を除いて構築中の suffix array そのものが使えます (まだ埋まっていない部分は飛ばしながら見ます). 次に S-type では逆向きに,今できたソートされた L-type suffix を大きい方から順に見て,左隣の suffix が S-type ならバケツの後端から順に加える,という操作を繰り返します.br />br />これをやるためには,L-type をソートするときに「まだ見ていない L-type の右隣の suffix の中で最小のものを含むソートされたリスト」を常に持っている必要があります. これは,L の右隣にいる S (LMS: Left Most S-type という) 全部のソートされたリストをはじめに作り,上の方法で最小のものを取り出しては左隣の L-type を入れる,という操作を繰り返せばできます.br />br />理由ですが,L-type が並んでいるところ (...LLLLLS... みたいな. この S が LMS) では右の suffix ほど小さくなります. 特にこれらの L-type の直後に来る LMS の suffix はこの L-type suffix のどれよりも小さいです. 同じように,S-type が並んでいるところでは右に行くほど大きくなります. つまり LMS は suffix の大小という意味で谷になっています. なので谷を全部持っておけば,必ず最小のものが含まれるし,取り出した最小の suffix の一個前 (山を後ろに一歩登ったところ) を加えていけば「まだ見ていない L-type の右隣の suffix の中で最小のものを含むリスト」が常に保たれることになります. S-type のソートでも同じように,今度は山のてっぺんから左に下っていく感じで進めていけばよく,これは単純にソート済みの L-type suffix とすでにソートされた S-type suffix を後ろから順に見ていけばよいです.br />br />そのためにはじめにソートされた LMS-suffix のリストを作るのですが,ここが SA-IS 最大のポイントになります. 各 LMS 文字に対して,そこから次の LMS 文字までの substring を LMS-substring と呼びます (右端の LMS 文字を含みます). LMS-substring は各文字と L/S-type とのペアに関する辞書式順序で比較します. LMS-substring をソートして,各 LMS-substring に対して LMS-substring 同士の大小と一致するような整数を振り,それを出現順に並べた文字列 S1 を考えます. すると,各 LMS-suffix の順序と対応する S1 の suffix の順序が一致します. なので S1 の suffix array を作れば LMS-suffix のソートされたリストが得られます. S1 の suffix array は,重複する文字がない場合にはただ文字をソートすればよいです (これは実は LMS-substring を整数に変換するところですでにやっています). S1 に重複する文字がある場合には SA-IS を再帰的に適用します. LMS 文字は全体の半分以下しかないので,問題サイズは半分以下になっており,再帰させても線形時間で終了します.br />br />まだ続きます. 上でサラっと LMS-substring のソートと書いた部分です. ここでも四段落上で書いたのとほとんど同じやり方が使えます. 今度は LMS-substring ごとの suffix を考え,それを全部集めたものをソートします. L/S-type はもとのと同じものが使えます. この場合,最初の「左隣が L-type な suffix のうち最小のものを含むソート済みリスト」の初期値として,LMS 文字一文字からなる suffix をバケツに入れたものが使えます. あとは上と同じように L-type,S-type の順でソートすれば,全 LMS-substring の suffix のソートが完了します. LMS-substring に対応する部分だけを取り出せば,LMS-substring のソートが得られます.br />br />まとめると,br />ul>li>各 suffix に対して L/S-type のラベルを振る (ここは文字列を後ろから前へ一回走査するだけでできます)./li>li>LMS-substring をソートする. これはまず LMS 文字一文字からなる LMS-substring の suffix をバケツに入れ,そこから上記の方法で L-type,S-type の順にソートする./li>li>ソートされた LMS-substring に整数値を振る. 等しい LMS-substring 同士は同じ値になるように,小さい方から順に 0, 1, 2, ... と振る. これをもとの文字列での LMS の出現順と同じ順序で並べて S1 を作る./li>li>整数値が被らなければ ( 重複する LMS-substring がなければ) すでに作った LMS-substring のソートが LMS-suffix のソートを与える. そうでなければ S1 に対して SA-IS を再帰的に適用して S1 の suffix array を作り,対応する LMS-suffix のソートを得る./li>li>LMS-suffix のソートされたものを対応する各バケツの後端に入れる. これを初期状態として,上記の方法で L-type,S-type の順にソートする./li>/ul>となります.br />br />アルゴリズムの概要はこんな感じです. 何言ってるのかわからない部分もあると思いますが,上のリンクとか論文とかを参考にしてください. 本当は山と谷の図をたくさん書いて,具体的な文字列で手でアルゴリズムを回してみるとわかりやすいです. 論文は,ソースと本文を行ったり来たりしてればわかると思います. やってることはシンプルで,ソースも短くて (100 行弱),コメントもたくさん入っています.div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttps://blog.beam2d.net/2011/08/suffix-array-sa-is.html relbookmark titlepermanent link>abbr classpublished title2011-08-19T10:59:00+09:00>10:59/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttps://blog.beam2d.net/2011/08/suffix-array-sa-is.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID2866826318272431678&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID2866826318272431678&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID2866826318272431678&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID2866826318272431678&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID2866826318272431678&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID2866826318272431678&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年7月31日日曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name6006738173895222105>/a>h3 classpost-title entry-title>a hrefhttps://blog.beam2d.net/2011/07/blog-post.html>正則な確率行列の逆行列/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-6006738173895222105>確率行列とは,行和が 1 な非負の正方行列のことです.確率行列 X に対して,Xsub>i j/sub> を状態 i から状態 j への遷移確率と見なせば,X はマルコフ連鎖の遷移確率と見なすこともできます.br />br />今正則な確率行列 X が与えられたとします.X の逆行列 Xsup>-1/sup> は行和が 1 です.証明は簡単で,全成分が 1 である列ベクトルを b>1/b> と書くことにすると,X の行和が 1 であることから b>1/b> Xb>1/b> で,この式の両辺に左から Xsup>-1/sup> をかければ Xsup>-1/sup>b>1/b> b>1/b> となります.br />br />これだけでは Xsup>-1/sup> が確率行列とは言えません.一般に成分が負になる場合があるからです.逆行列が確率行列になるための条件は何でしょうか? とりあえず考えつく方法として 3 つの解法があるようです.br />br />一番簡単なのは,X と Xsup>-1/sup> を遷移確率行列だと思うことです.X が非決定的な遷移確率行列 (i に対して複数の j で正な値を取ることがある) の場合,X で遷移したあと,Xsup>-1/sup> で遷移すると,確率 1 でもとの場所に戻ってくる,などという奇妙なことは絶対に起こりません.つまり,逆行列が確率行列になるのは,X が決定的な遷移確率行列の場合だけです.行列の言葉で言い換えると X が置換行列ということになります.br />br />正面から証明する方法もあります.Xsup>-1/sup> が非負行列で,X のある行 i に対して 2 つの列 j, j で正の値をとっていると仮定します.XXsup>-1/sup> は単位行列なので,i 以外のすべてのインデックス i に対して,X の i 行目と Xsup>-1/sup> の i 列目は内積が 0 です.これらは共に非負ベクトルなので,Xsup>-1/sup> の (j, i), (j, i) 成分はともに 0 となります.つまり Xsup>-1/sup> の j, j 行目は第 i 成分を除いて 0 となり,この 2 行は一次従属になります.これは Xsup>-1/sup> が正則であることに反します.よって X はどの行も 1 つの成分を除いてゼロであり,置換行列になります.br />br />最後に,固有値からも証明できるようです.確率行列はスペクトル半径が 1 です.Xsup>-1/sup> は X の固有値の逆数を固有値に持つので,これらが共に確率行列となるためには,両方ともすべての固有値が長さ 1 である必要があります.つまり X は等長変換を表す行列 (直交行列) ということです.第 i 成分だけが 1 の行ベクトル v を考えると,vX のユークリッドノルムが 1 である必要があります.つまり X の第 i 行はユークリッドノルムが 1 となりますが,行和が 1 な非負ベクトルでユークリッドノルムも 1 となるのは,ある一つの成分だけが 1 というベクトル,しかありません.よって X は置換行列となります.br />br />br />とまあ,きっかけがあってそんなことをちょっと考えていました.div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttps://blog.beam2d.net/2011/07/blog-post.html relbookmark titlepermanent link>abbr classpublished title2011-07-31T00:15:00+09:00>0:15/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttps://blog.beam2d.net/2011/07/blog-post.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID6006738173895222105&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID6006738173895222105&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID6006738173895222105&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID6006738173895222105&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID6006738173895222105&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID6006738173895222105&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年7月2日土曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name590125630145334082>/a>h3 classpost-title entry-title>a hrefhttps://blog.beam2d.net/2011/07/elog-c.html>eLog - C++ で簡易ログと簡単時間計測/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-590125630145334082>C++ で使える簡単なロガーを書きました.ロガーと書いてしまいましたが,そんな大げさなものではなくて,ほとんど std::cerr の代わりみたいなものです.見た目はほとんど google-glog です.br />br />a hrefhttps://github.com/beam2d/elog>beam2d/elog - GitHub/a>br />br />ヘッダーだけなので,すぐ使えます./usr/local/include へのインストールは ./waf install でできます.もちろん,自分のコードツリーにコピーしてきてもいいです.MIT License です.br />br />使い方.br />br />pre classprettyprint>#include <elog/elog.h>class ModuleA {};class ModuleB {};class MyLogger : public LOG::Logger { ... };int main() { LOG(INFO) << 基本は google-glog と同じ; LOG(ERROR) << LogLevel (severity) は INFO, WARN, ERROR, FATAL; try { LOG(FATAL) << FATAL は; } catch (const LOG::FatalLogError&) { LOG(ERROR) << 例外を投げる; } LOG() << INFO は省略できる; // ロガーのレベルを変更できる // LOG は括弧を付けなければ名前空間 LOG::SetDefaultLoggerLevel(LOG::ERROR); LOG(INFO) << 出力されない; LOG(WARN) << 出力されない; LOG::SetDefaultLoggerLevel(LOG::INFO); LOG(ModuleA, 0) << 型ごとに verbosity をつけてログを吐ける; // 型ごとに異なる verbosity を設定できる (初期値は 0) LOG::SetDefaultLoggerVerbosity<ModuleA>(2); // verbosity 2 以下を有効に LOG(ModuleA, 2) << 出力される; LOG(ModuleA, 3) << 出力されない; LOG(ModuleB, 1) << 出力されない; unsigned char uc 65; LOG() << (un)signed char は整数として出力される: << uc; LOG() << char は普通のストリームと同様: << A; // アサートもある CHECK(true) << 出力されない; try { CHECK(false) << 出力され,そして; } catch (const LOG::CheckError&) { LOG(ERROR) << 例外を投げる; } // デフォルトのロガーは std::clog に吐くが,他のストリームに変えるには: std::ostream& ostream std::cout; LOG::StreamLogger cout_logger(ostream); LOG::SetLogger(cout_logger); // この場合 SetDefaultLoggerLevel 等は使わない cout_logger.set_level(LOG::WARN); cout_logger.SetTypeVerbosity<ModuleA>(1); // ロガーの実装は自分で作って差し替えられる (Logger の定義は logger.h) MyLogger my_logger; LOG::SetLogger(my_logger);}/pre>br />ファイル名と行数も出力します.そのうち日付時刻とかも入れたいです.br />br />あと簡単なベンチマーク機能があります.アルゴリズムをパパっと実装して速度を見るのに便利です.こっちは a hrefhttp://d.hatena.ne.jp/iwiwi/20100221/1266682598>iwiwi くんの benchmark/a> を参考にしています.br />br />pre classprettyprint>#include <elog/benchmark.h>// BENCHMARK のログ出力はすべて INFO レベルですint main() { // タイトルを出してから経過時間を計測して,最後に出力 BENCHMARK(my_bench) { for (int i 0; i < 100000; ++i); LOG() << 途中でも出力できる: << my_bench.GetTime() << sec; for (int i 0; i < 100000; ++i); } // 複数の計測結果をまとめる LOG::BenchmarkSuite suite(title); BENCHMARK(suite, case_1) { for (int i 0; i < 100000; ++i); LOG() こっちも同じく: case_1.GetTime() sec; for (int i 0; i < 100000; ++i); } BENCHMARK(suite, case_2, 開始時にメッセージを出力できる) { for (int i 0; i < 200000; ++i); } // 計測結果を表にして出力 suite.LogChart();}/pre>とすると出力はpre classprettyprint>my_bench: ...INFO bench.cc(8): 途中でも出力できる: 0.000623941 secmy_bench: 0.00120592 seccase_1: ...INFO bench.cc(17): こっちも同じく: 0.000519037 seccase_1: 0.00106406 seccase_2: 開始時にメッセージを出力できる...case_2: 0.00103211 sectitle | time (sec)--------+-----------case_1 | 0.00106case_2 | 0.00103--------+-----------(other) | 0.00006total | 0.00216/pre>br />ログの構文は,周りの邪魔にならない簡素なものがいいと思っていて,google-glog はその意味で好きですが,マクロです.マクロは名前空間代わりのプレフィックスを付けた方が親切ですが,ログの構文は簡素な方がいいので,上のようになっています.その代わり,そういうグローバルスコープの単純な名前は極力減らす方針で書いています.br />br />あと google-glog はリンクがいるし,最初に Init なんたらを呼ばなきゃいけないし,gflags との関係がややこしいので,何も考えずに使えるものが欲しかったということもあります.br />br />型ごとに verbosity を設定するのはほぼ思いつきなので,便利なのかどうかわからないです.br />br />というわけで,大したものではないですが,ぜひ.div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttps://blog.beam2d.net/2011/07/elog-c.html relbookmark titlepermanent link>abbr classpublished title2011-07-02T00:03:00+09:00>0:03/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttps://blog.beam2d.net/2011/07/elog-c.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID590125630145334082&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID590125630145334082&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID590125630145334082&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID590125630145334082&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID590125630145334082&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID590125630145334082&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年6月24日金曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name8445278548287749777>/a>h3 classpost-title entry-title>a hrefhttps://blog.beam2d.net/2011/06/anchor-graph-hashing.html>数理輪講で Anchor Graph Hashing の紹介をしてきました/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-8445278548287749777>今日、大学の数理情報学輪講で発表してきました。br />br />div stylewidth:425px id__ss_8412276>strong styledisplay:block;margin:12px 0 4px>a hrefhttp://www.slideshare.net/beam2d/rinko2011-web titlerinko2011-agh>rinko2011-agh/a>/strong> iframe srchttps://www.slideshare.net/slideshow/embed_code/8412276 width425 height355 frameborder0 marginwidth0 marginheight0 scrollingno>/iframe> div stylepadding:5px 0 12px>View more a hrefhttp://www.slideshare.net/>presentations/a> from a hrefhttp://www.slideshare.net/beam2d>beam2d/a> /div>/div>br />今回は来週開催される ICML 2011 の論文 a hrefhttp://www.icml-2011.org/papers/6_icmlpaper.pdf>Hashing with Graphs/a> の紹介です。Anchor Graph Hashing (AGH) という近傍探索のための最新のハッシング手法を提案しています (なんでアルゴリズム名をタイトルにしなかったんだろう……)。一応スライドを読めばなんとなくわかるんじゃないかと思います。br />br />AGH は Spectral Hashing (SH) と同じ最適化問題を考えていて、それを解いてから out-of-sample extension の話に持っていくという流れも同じです。違うのは最適化問題を低ランク近似して解くところと、そのおかげで Nyström method という手法が使えて、SH みたいに分布に変な仮定を置いて固有関数問題をガリガリ解かなくて済むところ。データの次元、データ数のそれぞれについて線形時間のアルゴリズムになっています。br />br />低ランク近似は、第一著者の Liu が ICML2010 提案している Anchor Graph に基づいています。この Anchor Graph が良い性質をたくさん持っていて、アンカーを用いたマルコフ連鎖的な解釈もあって、ハッシング以外にもいろいろ使えるんじゃないかと思います。br />br />スライドでは論文の後半で述べられている階層的手法 (2-AGH) を紹介できませんでしたが、これは半分のビットは AGH で作って、残りは前半の各ビットに対して、うまく分けられなかった・分けるべきでなかった部分を補正するようなビットを入れる、という手法です。AGH は SH と同じく PCA みたいな手法なので、ビット数を増やすと固有値の低い (ノイズの多い) 主成分まで使うことになり、結果として MAP 精度が低下してしまう問題があります。階層的ハッシングでは半分のビットだけ AGH にして、後半はアドホックに作ることで、この問題をある程度回避しようとしています。が、半分は AGH で作るので、実験では 2-AGH でも下がったりしてます。br />br />SH と同じ問題なので、多様体学習的な要素が入ってきています。なので与えられた距離関数についての最近傍探索ではないです。実際、実験結果では単純に全比較をした場合よりも精度が高いです。面白いのは、Spectral Embedding したあとに単純な全比較をする方法 (SE l_2 Scan) よりも階層的ハッシング (2-AGH) の方が精度が良いということ。近傍探索については、遠い点同士の類似度はざっくりゼロに落としちゃう方が精度が上がるということなんでしょうか。br />br />Nyström method のあたりはちょっと難しいですが、SH に出てくる Laplace-Beltrami 作用素の固有関数問題のあたりに比べればだいぶわかりやすいと思います。Bengio+, 04 をパラパラ読めば結構分かるんではないかと。固有ベクトルから固有関数を近似する方法として、結構使われている?みたいです。br />br />ともかく Anchor Graph Hashing は面白いので、気になる方はぜひ論文も読むといいと思います。div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttps://blog.beam2d.net/2011/06/anchor-graph-hashing.html relbookmark titlepermanent link>abbr classpublished title2011-06-24T23:24:00+09:00>23:24/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttps://blog.beam2d.net/2011/06/anchor-graph-hashing.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID8445278548287749777&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID8445278548287749777&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID8445278548287749777&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID8445278548287749777&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID8445278548287749777&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID8445278548287749777&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>2011年5月28日土曜日/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry>a name4846875704901488528>/a>h3 classpost-title entry-title>a hrefhttps://blog.beam2d.net/2011/05/pca.html>PCA の練習/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-4846875704901488528>練習に a hrefhttp://archive.ics.uci.edu/ml/datasets/Iris>http://archive.ics.uci.edu/ml/datasets/Iris/a> のデータをさくっと PCA してみました。br />br />div>pre classprettyprint>#include <iostream>#include <string>#include <utility>#include <vector>#include <boost/algorithm/string.hpp>#include <boost/lexical_cast.hpp>#include <eigen3/Eigen/Dense>// #include <redsvd/redsvd.hpp>using namespace std;using namespace boost;int main() { vector<pair<string, vector<float>>> data; for (string line; getline(cin, line); ) { vector<string> row; split(row, line, is_any_of(",")); if (row.size() < 2) continue; auto p make_pair(move(row.back()), vector<float>()); row.pop_back(); for (const auto& val : row) p.second.push_back(lexical_cast<float>(val)); data.push_back(move(p)); } Eigen::MatrixXf data_matrix(data.size(), data0.second.size()); for (size_t i 0; i < data.size(); ++i) { for (size_t j 0; j < datai.second.size(); ++j) { data_matrix(i, j) datai.secondj; } } Eigen::JacobiSVD<Eigen::MatrixXf> svd( data_matrix, Eigen::ComputeThinU | Eigen::ComputeThinV); const auto& pca_dat svd.matrixU() * svd.singularValues().asDiagonal(); // const auto& pca_dat REDSVD::RedPCA(data_matrix, 2).scores(); for (int i 0; i < pca_dat.rows(); ++i) { cout << datai.first; for (int j 0; j < pca_dat.cols(); ++j) cout << ',' << pca_dat(i, j); cout << endl; }}/pre>/div>br />g++4.6 -stdc++0x でコンパイルできます。RedSVD を使う方はコメントアウトしてあります (svd, pca_dat の定義を消してコメントを戻せば RedSVD 版になる)。RedSVD の方は上位 2 次元だけ出力しています。Eigen は魔法ですね。チュートリアルも親切。でもリファレンス読むのは難しい。div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>投稿者span classfn>Seiya Tokui/span>/span>span classpost-timestamp>時刻:a classtimestamp-link hrefhttps://blog.beam2d.net/2011/05/pca.html relbookmark titlepermanent link>abbr classpublished title2011-05-28T18:23:00+09:00>18:23/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttps://blog.beam2d.net/2011/05/pca.html#comment-form onclick>0コメント/a>/span>span classpost-icons>span classitem-control blog-admin pid-527181677>a hrefhttps://www.blogger.com/post-edit.g?blogID8241445299985430179&postID4846875704901488528&frompencil title投稿を編集>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID4846875704901488528&targetemail target_blank titleメールで送信>span classshare-button-link-text>メールで送信/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID4846875704901488528&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID4846875704901488528&targettwitter target_blank titleX で共有>span classshare-button-link-text>X で共有/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID4846875704901488528&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleFacebook で共有する>span classshare-button-link-text>Facebook で共有する/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID8241445299985430179&postID4846875704901488528&targetpinterest target_blank titlePinterest に共有>span classshare-button-link-text>Pinterest に共有/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> /div>div classblog-pager idblog-pager>span idblog-pager-older-link>a classblog-pager-older-link hrefhttps://blog.beam2d.net/search?updated-max2011-05-28T18:23:00%2B09:00&max-results7 idBlog1_blog-pager-older-link title前の投稿>前の投稿/a>/span>a classhome-link hrefhttps://blog.beam2d.net/>ホーム/a>/div>div classclear>/div>div classblog-feeds>div classfeed-links>登録:a classfeed-link hrefhttps://blog.beam2d.net/feeds/posts/default target_blank typeapplication/atom+xml>コメント (Atom)/a>/div>/div>/div>/div>/div>/div>div classcolumn-left-outer>div classcolumn-left-inner>aside>div classsidebar section idsidebar-left-1>div classwidget AdSense data-version1 idAdSense1>div classwidget-content>script typetext/javascript>!--google_ad_clientpub-3074158404074723;google_ad_hostpub-1556223355139109;google_alternate_ad_urlhttp://img2.blogblog.com/img/blogger_ad.html;google_ad_width200;google_ad_height200;google_ad_format200x200_as;google_ad_typetext_image;google_ad_host_channel0001;google_color_borderFFFFFF;google_color_bgFFFFFF;google_color_link000000;google_color_url2288BB;google_color_text222222;//-->/script>script typetext/javascript srchttps://pagead2.googlesyndication.com/pagead/show_ads.js>/script>div classclear>/div>/div>/div>div classwidget Followers data-version1 idFollowers1>h2 classtitle>フォロワー/h2>div classwidget-content>div idFollowers1-wrapper>div stylemargin-right:2px;>div>script typetext/javascript srchttps://apis.google.com/js/platform.js>/script>div idfollowers-iframe-container>/div>script typetext/javascript> window.followersIframe null; function followersIframeOpen(url) { gapi.load(gapi.iframes, function() { if (gapi.iframes && gapi.iframes.getContext) { window.followersIframe gapi.iframes.getContext().openChild({ url: url, where: document.getElementById(followers-iframe-container), messageHandlersFilter: gapi.iframes.CROSS_ORIGIN_IFRAMES_FILTER, messageHandlers: { _ready: function(obj) { window.followersIframe.getIframeEl().height obj.height; }, reset: function() { window.followersIframe.close(); followersIframeOpen(https://www.blogger.com/followers/frame/8241445299985430179?colors\x3dCgt0cmFuc3BhcmVudBILdHJhbnNwYXJlbnQaByMzMzMzMzMiByNkNTJhMzMqByNmY2ZiZjUyByMzMzMzMzM6ByMzMzMzMzNCByNkNTJhMzNKByM2NjY2NjZSByNkNTJhMzNaC3RyYW5zcGFyZW50\x26pageSize\x3d21\x26hl\x3dja\x26origin\x3dhttp://blog.beam2d.net); }, open: function(url) { window.followersIframe.close(); followersIframeOpen(url); } } }); } }); } followersIframeOpen(https://www.blogger.com/followers/frame/8241445299985430179?colors\x3dCgt0cmFuc3BhcmVudBILdHJhbnNwYXJlbnQaByMzMzMzMzMiByNkNTJhMzMqByNmY2ZiZjUyByMzMzMzMzM6ByMzMzMzMzNCByNkNTJhMzNKByM2NjY2NjZSByNkNTJhMzNaC3RyYW5zcGFyZW50\x26pageSize\x3d21\x26hl\x3dja\x26origin\x3dhttp://blog.beam2d.net); /script>/div>/div>/div>div classclear>/div>/div>/div>div classwidget BlogArchive data-version1 idBlogArchive1>h2>ブログ アーカイブ/h2>div classwidget-content>div idArchiveList>div idBlogArchive1_ArchiveList>ul classhierarchy>li classarchivedate expanded>a classtoggle hrefjavascript:void(0)>span classzippy toggle-open> ▼ /span>/a>a classpost-count-link hrefhttps://blog.beam2d.net/2012/>2012/a>span classpost-count dirltr>(1)/span>ul classhierarchy>li classarchivedate expanded>a classtoggle hrefjavascript:void(0)>span classzippy toggle-open> ▼ /span>/a>a classpost-count-link hrefhttps://blog.beam2d.net/2012/03/>3月/a>span classpost-count dirltr>(1)/span>ul classposts>li>a hrefhttps://blog.beam2d.net/2012/03/my-campus-life.html>大学生活/a>/li>/ul>/li>/ul>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttps://blog.beam2d.net/2011/>2011/a>span classpost-count dirltr>(7)/span>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttps://blog.beam2d.net/2011/12/>12月/a>span classpost-count dirltr>(1)/span>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttps://blog.beam2d.net/2011/08/>8月/a>span classpost-count dirltr>(1)/span>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttps://blog.beam2d.net/2011/07/>7月/a>span classpost-count dirltr>(2)/span>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttps://blog.beam2d.net/2011/06/>6月/a>span classpost-count dirltr>(1)/span>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttps://blog.beam2d.net/2011/05/>5月/a>span classpost-count dirltr>(1)/span>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttps://blog.beam2d.net/2011/02/>2月/a>span classpost-count dirltr>(1)/span>/li>/ul>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttps://blog.beam2d.net/2010/>2010/a>span classpost-count dirltr>(2)/span>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttps://blog.beam2d.net/2010/12/>12月/a>span classpost-count dirltr>(2)/span>/li>/ul>/li>/ul>/div>/div>div classclear>/div>/div>/div>div classwidget Profile data-version1 idProfile1>h2>自己紹介/h2>div classwidget-content>dl classprofile-datablock>dt classprofile-data>a classprofile-name-link g-profile hrefhttps://www.blogger.com/profile/16450714075725786395 relauthor stylebackground-image: url(//www.blogger.com/img/logo-16.png);>Seiya Tokui/a>/dt>/dl>a classprofile-link hrefhttps://www.blogger.com/profile/16450714075725786395 relauthor>詳細プロフィールを表示/a>div classclear>/div>/div>/div>div classwidget HTML data-version1 idHTML1>h2 classtitle>Google Code Prettify/h2>div classwidget-content>style typetext/css>@import http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css;pre.prettyprint { font-size: 93%;}/style>script srchttps://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js typetext/javascript>/script>script typetext/javascript>function prettify() { prettyPrint();}if (window.addEventListener) { window.addEventListener(load, prettify, false);} else if (window.attachEvent) { window.attachEvent(onload, prettify);} else { window.onload prettify;}/script>/div>div classclear>/div>/div>/div>/aside>/div>/div>div classcolumn-right-outer>div classcolumn-right-inner>aside>/aside>/div>/div>/div>div styleclear: both>/div>!-- columns -->/div>!-- main -->/div>/div>div classmain-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>footer>div classfooter-outer>div classfooter-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left footer-fauxborder-left>div classfauxborder-right footer-fauxborder-right>/div>div classregion-inner footer-inner>div classfoot no-items section idfooter-1>/div>table border0 cellpadding0 cellspacing0 classsection-columns columns-2>tbody>tr>td classfirst columns-cell>div classfoot no-items section idfooter-2-1>/div>/td>td classcolumns-cell>div classfoot no-items section idfooter-2-2>/div>/td>/tr>/tbody>/table>!-- outside of the include in order to lock Attribution widget -->div classfoot section idfooter-3 nameフッター>div classwidget Attribution data-version1 idAttribution1>div classwidget-content styletext-align: center;>Powered by a hrefhttps://www.blogger.com target_blank>Blogger/a>./div>div classclear>/div>/div>/div>/div>/div>div classfooter-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/footer>!-- content -->/div>/div>div classcontent-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/div>script typetext/javascript> window.setTimeout(function() { document.body.className document.body.className.replace(loading, ); }, 10); /script>script typetext/javascript srchttps://www.blogger.com/static/v1/widgets/2028843038-widgets.js>/script>script typetext/javascript>window__wavt AOuZoY7FaziWryKVY_C_HQk98UriwCRpFg:1770749177631;_WidgetManager._Init(//www.blogger.com/rearrange?blogID\x3d8241445299985430179,//blog.beam2d.net/,8241445299985430179);_WidgetManager._SetDataContext({name: blog, data: {blogId: 8241445299985430179, title: \u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8, url: http://blog.beam2d.net/, canonicalUrl: http://blog.beam2d.net/, homepageUrl: http://blog.beam2d.net/, searchUrl: http://blog.beam2d.net/search, canonicalHomepageUrl: http://blog.beam2d.net/, blogspotFaviconUrl: http://blog.beam2d.net/favicon.ico, bloggerUrl: https://www.blogger.com, hasCustomDomain: true, httpsEnabled: false, enabledCommentProfileImages: true, gPlusViewType: FILTERED_POSTMOD, adultContent: false, analyticsAccountNumber: , encoding: UTF-8, locale: ja, localeUnderscoreDelimited: ja, languageDirection: ltr, isPrivate: false, isMobile: false, isMobileRequest: false, mobileClass: , isPrivateBlog: false, isDynamicViewsAvailable: true, feedLinks: \x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22\u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8 - Atom\x22 href\x3d\x22http://blog.beam2d.net/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22\u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8 - RSS\x22 href\x3d\x22http://blog.beam2d.net/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22\u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8 - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/8241445299985430179/posts/default\x22 /\x3e\n, meTag: \x3clink rel\x3d\x22me\x22 href\x3d\x22https://www.blogger.com/profile/16450714075725786395\x22 /\x3e\n, adsenseClientId: ca-pub-3074158404074723, adsenseHostId: ca-host-pub-1556223355139109, adsenseHasAds: true, adsenseAutoAds: false, boqCommentIframeForm: true, loginRedirectParam: , view: , dynamicViewsCommentsSrc: //www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js, dynamicViewsScriptSrc: //www.blogblog.com/dynamicviews/a61ea7faac3eb272, plusOneApiSrc: https://apis.google.com/js/platform.js, disableGComments: true, interstitialAccepted: false, sharing: {platforms: {name: \u30ea\u30f3\u30af\u3092\u53d6\u5f97, key: link, shareMessage: \u30ea\u30f3\u30af\u3092\u53d6\u5f97, target: }, {name: Facebook, key: facebook, shareMessage: Facebook \u3067\u5171\u6709, target: facebook}, {name: BlogThis!, key: blogThis, shareMessage: BlogThis!, target: blog}, {name: \xd7, key: twitter, shareMessage: \xd7 \u3067\u5171\u6709, target: twitter}, {name: Pinterest, key: pinterest, shareMessage: Pinterest \u3067\u5171\u6709, target: pinterest}, {name: \u30e1\u30fc\u30eb, key: email, shareMessage: \u30e1\u30fc\u30eb, target: email}, disableGooglePlus: true, googlePlusShareButtonWidth: 0, googlePlusBootstrap: \x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27ja\x27};\x3c/script\x3e}, hasCustomJumpLinkMessage: false, jumpLinkMessage: \u7d9a\u304d\u3092\u8aad\u3080, pageType: index, pageName: , pageTitle: \u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8}}, {name: features, data: {}}, {name: messages, data: {edit: \u7de8\u96c6, linkCopiedToClipboard: \u30ea\u30f3\u30af\u3092\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\u3002, ok: OK, postLink: \u6295\u7a3f\u306e\u30ea\u30f3\u30af}}, {name: template, data: {isResponsive: false, isAlternateRendering: false, isCustom: false}}, {name: view, data: {classic: {name: classic, url: ?view\x3dclassic}, flipcard: {name: flipcard, url: ?view\x3dflipcard}, magazine: {name: magazine, url: ?view\x3dmagazine}, mosaic: {name: mosaic, url: ?view\x3dmosaic}, sidebar: {name: sidebar, url: ?view\x3dsidebar}, snapshot: {name: snapshot, url: ?view\x3dsnapshot}, timeslide: {name: timeslide, url: ?view\x3dtimeslide}, isMobile: false, title: \u30d3\u30fc\u30e0\u306e\u5831\u544a\u66f8, description: , url: http://blog.beam2d.net/, type: feed, isSingleItem: false, isMultipleItems: true, isError: false, isPage: false, isPost: false, isHomepage: true, isArchive: false, isLabelSearch: false}});_WidgetManager._RegisterWidget(_NavbarView, new _WidgetInfo(Navbar1, navbar, document.getElementById(Navbar1), {}, displayModeFull));_WidgetManager._RegisterWidget(_HeaderView, new _WidgetInfo(Header1, header, document.getElementById(Header1), {}, displayModeFull));_WidgetManager._RegisterWidget(_BlogView, new _WidgetInfo(Blog1, main, document.getElementById(Blog1), {cmtInteractionsEnabled: false, lightboxEnabled: true, lightboxModuleUrl: https://www.blogger.com/static/v1/jsbin/616846968-lbx__ja.js, lightboxCssUrl: https://www.blogger.com/static/v1/v-css/828616780-lightbox_bundle.css}, displayModeFull));_WidgetManager._RegisterWidget(_AdSenseView, new _WidgetInfo(AdSense1, sidebar-left-1, document.getElementById(AdSense1), {}, displayModeFull));_WidgetManager._RegisterWidget(_FollowersView, new _WidgetInfo(Followers1, sidebar-left-1, document.getElementById(Followers1), {}, displayModeFull));_WidgetManager._RegisterWidget(_BlogArchiveView, new _WidgetInfo(BlogArchive1, sidebar-left-1, document.getElementById(BlogArchive1), {languageDirection: ltr, loadingMessage: \u8aad\u307f\u8fbc\u307f\u4e2d\x26hellip;}, displayModeFull));_WidgetManager._RegisterWidget(_ProfileView, new _WidgetInfo(Profile1, sidebar-left-1, document.getElementById(Profile1), {}, displayModeFull));_WidgetManager._RegisterWidget(_HTMLView, new _WidgetInfo(HTML1, sidebar-left-1, document.getElementById(HTML1), {}, displayModeFull));_WidgetManager._RegisterWidget(_AttributionView, new _WidgetInfo(Attribution1, footer-3, document.getElementById(Attribution1), {}, displayModeFull));/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]