Takahiko HORIUCHI

並行処理と非同期処理

並行処理と並列処理

並行処理(Concurrent Processing)

複数の処理を同時に実行すること。ただしある瞬間には1つの処理だけを実行している。シングルコアCPUで実装可能。擬似的に同時に進んでいるように見える。普通の人の頭は並行処理しかできない。

並列処理(Parallel Processing)

複数の処理を同時に実行すること。ある瞬間に複数の処理を実行している。マルチコアCPUやマルチプロセッサー、GPUなど、ハードウェアのサポートが必要。伝説によれば聖徳太子の頭では並列処理ができたようだ。

続きを読む

量子コンピューターのプログラミング

2016年に IBM が IBM Q Experience として 5量子ビットの量子コンピュータをクラウド上に無料で開放して数年、Microsoft の Azure Quantum と Amazon の Amazon Bracket が、限定公開ながら相次いで発表されました。量子コンピュータが誰でも使える環境が整いつつあります。

動作原理が現行コンピュータとは根本から異なる上に、現時点ではアセンブラレベルのプログラミング言語しか用意されておらず、しかも実用的なアプリケーションへの適用がまだできないと、3重苦のような環境ですが、20年後は日常的に使われているのではないかと夢想します。

といっても、今の機械学習がアルゴリズムの詳細を理解しなくても使えるように、量子プログラミングもライブラリを呼ぶだけになるのだと思います。論理回路を知らなくてもウェブサイトは作れるし、イーサネットケーブルを流れる信号について知らなくても HTTP で通信できます。

知らなくても使える。でも知らないで使うのは嫌なので、20年後を目指して、量子プログラミングの勉強をすることにしました。
続きを読む

リモートワークを試験的に導入してみる

技術部門の責任者を務めている堀内です。リンクバルでは、リモートワークの導入を試験的に少しずつ進めています。2018年10月から、エンジニアの一部で週一回の運用を始めました。特に表面化した問題も見当たらなかったため、2019年9月から週二回に増やしました。それと同時期に、非エンジニアにも対象を拡大しています。今のところ、特に困ったことは起きていません。

オフィス勤務と在宅勤務、社員と業務委託の違い

現在リンクバルには東京とハノイを合わせて正社員エンジニアが30名弱、個人の業務委託先が5名います。業務委託5名は全員在宅勤務で、うち3名は元社員です。在宅勤務には通勤がなくなるという利点がある一方で、オフィス勤務にも、物理的な距離の近さという利点があります。
続きを読む

リンクバルのデータ系基盤

リンクバルにはデータ分析者が5名ほどと、機械学習のエンジニアが数名いる。社員90名弱という規模の中では、データ活用に大きいリソースを割いている方だと思う。全社員の3分の2程度が、彼らが作り出したダッシュボードや、分析レポートや、予測結果などを見ながら日々の業務を行っている。

もともと、それほどデータを活用する会社ではなかったが、2016年秋に街コンジャパンをフルリニューアルしてアプリケーション側のデータが綺麗になったのを機に、データ系の基盤を整備した。
続きを読む

いまご飯を食べるスキルと、10年後も生きるためのスキル

2018年の初頭、語学と数学の能力を上げようという目標を立てた。60歳で引退すると仮定した場合、僕の社会人人生の、ちょうど真ん中だったこともあって、人生に大きな方針を立てたかったのだ。年末になって振り返ると、自分が希望するよりは能力が上がらなかったなと、残念に思う。

それでも最近、英語面接にも少しは慣れてきたし、ほんの少しだけ、中国語で聞こえる音が増えてきたし、ベトナム語教室では発音がいいと褒められるので、進歩はしているようだ。ベトナム語の発音がいいといっても、あくまでも他の日本人と比べて、だが。

数学は、高校数学の微分積分を半分くらいしか復習できなかったものの、log x を微分すると 1/x になる、という程度は思い出せた。ちなみに、いまお世話になっている数学の教科書は、これだ。

初めから学べると評判の大学基礎数学微分積分キャンパス・ゼミ
https://www.amazon.co.jp/dp/4866150319/

書名も表紙も怪しいが、中身はいい。と思う。
続きを読む

GitLabの導入(Backlog + GitHub からの移行)

いま、社内に GitLab を導入中です。数ヶ月かけて、これまで利用していた Backlog と GitHub を、GitLab に置きかえていく予定です。

Backlog は課金額がユーザ数に依存しません。そこで、いろいろな人が関わる課題管理には Backlog を利用しています。過去の履歴を見ると、2013年から 5年以上もお世話になっています。現在のアクティブユーザー数は120名ほど。

一方 Backlog の Gitリポジトリ機能はそれほど魅力的ではないため、コード管理には GitHub を利用しています。しかし GitHub はユーザ毎にお金がかかるため、コードを書く人に限定して使っています。現在のアクティブユーザー数は50名ほど。

開発の流れ

当社の開発の流れは、だいたい次のようになっています。

  1. 誰かが「○○をやりたい」と提案する。誰が何を提案してもいい。要点をまとめて Backlog に proposal(提案)として登録する。
  2. やるか、やらないか、優先度はどうするか、を毎朝のミーティングで決める。
  3. やることになった案件は planning(企画)フェーズに移行し、ディレクター、デザイナー、エンジニアなど案件毎に適切な人が仕様を決める。
  4. planningフェーズの仕様をレビューして問題がなければ、dev フェーズに移行させる。課題の優先度は毎朝の会議で決める。
  5. 優先度高の課題の中から好きなものを、手が空いたエンジニアが自分で取っていく。
  6. 開発が終わったら、提案者やディレクターがテストする。問題がなければリリース待ちとなる。
  7. リリースする。「街コンジャパン」の場合、少ない日で 1件、多い日で 10件くらいのリリースをする。ただし、売上が一番多いのが土日祝であるため、休みの前日のリリースはなるべく避ける。
    続きを読む

開発組織の育て方 – エンジニア3人から30人へ

リンクバルの堀内です。技術部門の責任者をさせていただいています。リンクバルでは現在、業務委託やリモートワークも含めて約30名のエンジニアが活躍しています。ほんの3年ほど前は10名、5年前はたったの3名でした。当社の主力事業は、男女が出会うためのイベントのチケットを販売する、イベントECサイト「街コンジャパン」です。創業時からいままで、常にイベント掲載数が右肩上がりで増え続け、現在は月間2万件ほどのイベントを掲載している、日本最大のサイトです。

エンジニアが足りなくて困っているのは昔も今も同じですが、悩みの質はだいぶ変わりました。当時は、とにかく人がいない。増収増益を続けるマザーズ上場企業だったのに、人が採れない。今は優秀なエンジニアが揃っているので、人が足りないながらも、スケジュールのやりくりで、やりたいことはできるようになりました。

当時、うまくいかなかった要因はいくつもありました。年間数十億円を販売するECサイトなのに WordPress で作られているから関心を示すエンジニアが少ない。「チャラい若者で溢れる出会い系企業」だから自分には合わないとエンジニアから敬遠される。当時の人事部が問題を抱えていて人材紹介会社からの評判が悪かった。超絶技巧的に WordPress を使いこなしていた影響で、保守だけで精一杯になり、新しいことに目を向ける余裕がなかった、など。

ちなみに、リンクバルに「チャラい若者」はあまりおらず、中から見るとむしろ地味な人が多い印象です。
続きを読む

ベトナム語、中国語、日本語は似ている

最近、ベトナム語と中国語を勉強している堀内です。

職業人生の半分を経過しようとしている今、物覚えも悪くなり、むしろ物忘れをするようになりました。以前は決して忘れなかった携帯を、ここ一年で数回、飲み会の場において店を出るという失態を演じてショックを受けています。

この歳になって、若者に混じって React とか Kotlin とか頑張っても、覚えたころには別のものが流行っていそうなので、劣化しにくいスキルの習得に力を入れようとしています。今後数年は語学と数学を狙っています。数学もコミュニケーションの手段と考えると、語学の一種かなとも思います。

続きを読む

国勢調査のデータと R を使って結婚について考える

未婚のアラフォー、堀内(♂)です。

弊社は恋愛をテーマとする会社であるためか、我ら技術部のメンバーも既婚だったり、同棲していたり、恋人持ちだったりする割合が多いようです。僕が新卒で入った技術100%みたいな会社の壊滅的な状況と比べると異次元です。まあ、技術部は30代が多いですしね。みな結婚を考える時期です。

部署の外に目をやると、イベント系の方々がたくさんいます。弊社は基本的にイベント会社なのです。新卒でも恋人持ちが多いらしく(伝聞:あまり話したことがない)、そのリア充ぶりに卒倒しそうです。そんな中で、僕に恋人がいないのは日本の政治が悪いに違いなかろうと、国勢調査のデータを調べてみることにしました。ツールは R です。

まず、「国勢調査の配偶関係データを R で取得する」で作成した、都道府県別の婚姻状況データを読み込みます。このデータは、15歳以上の日本の居住者を、都道府県毎、年齢毎、性別毎に、「未婚」「離別」「死別」「配偶関係不詳」「有配偶」に分けて記載しています。一般的には未婚、既婚の2分類を使いますが、国勢調査では婚姻関係を結んだ後の離別(離婚)と死別(配偶者の死亡)も区別しています。

[code lang=”r”]
census <- read.csv(‘prefs.csv’)
attach(census)
census$age <- as.integer(sub(‘歳.*’, ”, age))
census$area_code <- as.factor(area_code)
census$area <- ordered(area, levels=unique(area))
census$marital_status <- ordered(
marital_status,
levels=rev(c(‘未婚’, ‘離別’, ‘死別’, ‘配偶関係「不詳」’, ‘有配偶’))
)
detach()
[/code]

このデータは、全人口と、日本人の人口の両方を持っているので、外国人比率も参考までに押さえておきましょう。

[code lang=”r”]
num_of_all <- sum(census[census$nationality==’総数(国籍)’,]$value, na.rm=T)
num_of_japanese <- sum(census[census$nationality==’日本人’,]$value, na.rm=T)
print(sprintf(
‘全人口は %s 人、外国人居住者は %s 人で、全体の %f %% を占める。’,
prettyNum(num_of_all, big.mark=’,’),
prettyNum(num_of_all – num_of_japanese, big.mark=’,’),
(num_of_all – num_of_japanese) / num_of_all * 100)
)
=> [1] "全人口は 109,754,177 人、外国人居住者は 2,129,711 人で、全体の 1.940437 % を占める。"
[/code]

全人口1.1億というのは少ないと思われるでしょうが、このデータには15才未満が含まれていないのです。婚姻関係を追うものですから。

15歳で結婚

参考までに、15〜18才の婚姻状態を調べてみましょう。

[code lang=”r”]
census %>%
dplyr::filter(age <= 18, nationality == ‘総数(国籍)’, marital_status == ‘有配偶’) %>%
na.omit() %>%
group_by(gender, age) %>%
summarize(population=sum(value)) %>%
spread(gender, population)
[/code]

15歳の女性が144人、男性が86人も配偶者を持っているのですね。民法では女性16歳、男性18歳から婚姻が認められますが、国勢調査の「有配偶」は、届出の有無に関係なく、実態を表しています。事実上、周囲から夫婦であると認められている状態です。一般的な言葉で言えば「事実婚」です。

続きを読む

国勢調査の配偶関係データを R で取得する

平成27年国勢調査のうち、配偶関係(婚姻関係)のデータを R で取得します。ここでは estatapi パッケージを使います。appId は、e-statのサイトで事前に取得しておきましょう。

[code lang=text]
library(estatapi)
statslist %>%
dplyr::filter(grepl('平成27年.*配偶', STATISTICS_NAME)) %>%
select(`@id`, TITLE) %>%
mutate(TITLE=substr(TITLE, 0, 50))
[/code]

求めるデータの @id が 0003149791 であることがわかったので、メタ情報を取得します。

[code lang=text]
metainfo <- estat_getMetaInfo(appId='xxxxx', statsDataId='0003149791')
metainfo
[/code]

[code lang=text]
metainfo$cat04
# A tibble: 10 × 3
@code @name @level

1 0000 総数(配偶関係) 1
2 0010 未婚 1
3 0020 有配偶 1
4 0040 死別 1
5 0050 離別 1
6 0070 配偶関係「不詳」 1
7 0080 (配偶関係別割合(%)) 未婚 1
8 0090 (配偶関係別割合(%)) 有配偶 1
9 0110 (配偶関係別割合(%)) 死別 1
10 0120 (配偶関係別割合(%)) 離別 1
[/code]

メタ情報には、様々な「コード」が入っています。上記はカテゴリ04(cat04)のコードの例。

データ取得時間短縮のため、メタ情報の @code を用いて絞り込んだデータを取得します。データ取得には数分かかります。

[code lang=text]
census <- estat_getStatsData(
appId='xxxxx',
statsDataId='0003149791',
cdCat02=c('0010', '0020'), # 男、女
cdCat04=c('0010', '0020', '0040', '0050', '0070'), # 未婚、有配偶、死別、離別、配偶関係「不詳」
cdCat05='00710' # 全域
)
census$tab_code <- NULL
census$表章項目 <- NULL
census$cat01_code <- NULL
census$cat02_code <- NULL
census$cat03_code <- NULL
census$cat04_code <- NULL
census$cat05_code <- NULL
census$`全域・人口集中地区(2015)` <- NULL
census$time_code <- NULL
census$`時間軸(年次)` <- NULL
names(census) <- c('nationality', 'gender', 'age', 'marital_status', 'area_code', 'area', 'value')
census <- census[!grepl('総数|平均|再掲', census$age),]
census <- census[!grepl('市部$|郡部$', census$area),]
attach(census)
census$nationality <- as.factor(nationality)
census$gender <- as.factor(gender)
census$age <- ordered(age, levels=c(paste(15:99, '歳', sep=''), '100歳以上'))
census$marital_status <- as.factor(marital_status)
census$area_code <- as.factor(area_code)
census$area <- as.factor(area)
[/code]

都道府県別、都市別のデータを取り出します。

[code lang=text]
census_prefs <- census %>%
dplyr::filter(
area_code != '00000',
as.numeric(levels(area_code))[area_code] %% 1000 == 0
)

census_cities <- census %>%
dplyr::filter(as.numeric(levels(area_code))[area_code] %% 1000 != 0)
[/code]

今後の利用のために CSV で保存しておきます。

[code lang=text]
write.csv(census_prefs, 'prefs.csv', row.names=F)
write.csv(census_cities, 'cities.csv', row.names=F)
[/code]

この中に入っているデータは、こんな形式のものです。


リンクバルでは、Ruby と React と R を使って世の中をハッピーにしたいエンジニアを募集中です。この記事にピンと来た方は、是非ご応募ください。