まっちは静かに暮らしたい

日々のアウトプットや技術系の備忘として。

【技術書典7】サークル参加のお知らせ

こんにちは、まっちです。

今回は、技術書典7にサークルとして参加することになったのでお知らせです。
概要は以下となります。
 

サークル参加概要
  • 場所:け06D

f:id:maaaaatch:20190908181156j:plain
サークル場所

  • 頒布物:

  ◇ チートシート3種セット(ラミネート加工)
    ➡︎ pandas, matplotlibのライブラリのまとめ、前処理全般に関するまとめ
  ◇DLカード
    ➡︎ 電子版+Github URL

  • 値段:1000円

 
 
サンプルはこのような感じです。
イベント後には、boothとnoteでの販売も行いますので、当日参加できない方も購入いただけます。

f:id:maaaaatch:20190908181428j:plain
pandas サンプル
f:id:maaaaatch:20190908181448j:plain
matplotlib サンプル
f:id:maaaaatch:20190908181513j:plain
前処理 サンプル
 
 
興味がある方は、サークルチェックをいただけると嬉しいです。

techbookfest.org
 
それでは、当日よろしくお願いします!
 

中国出張に行ってきました

こんにちは、まっちです。
先日中国出張に行ってきたので、そのレポートをします。

f:id:maaaaatch:20190825171842p:plain

期間・滞在先

 期間は8月頭から2週間程度。滞在先は北京。
 

目的

 出張の目的は、アジャイル開発のオフショア導入です。

 私は、6月より新規システムの立ち上げPJにPMとして参加してます。本PJでは、オフショアとともにアジャイルでの開発に挑戦しようということで、ルール整備などを行ってきました。8月からの開発開始にともない、現地にて導入指導を行ってきました。

アジャイルでの開発は初めてなので、日本もオフショアも手探りで進めていくことになります。そのオーバーヘッドを軽減できればいいなといったところです。
 

活動内容

 現地では以下のことを行ってきました。大そうなことはしていません。

 

出張の成果と課題

 実際に現地2週間スプリントを回してみて、成果と課題が出てきました。
 サイト間の心理的・物理的距離を如何に埋めるかが、今後の鍵となりそうです。

◇成果
  • 日本とオフショアのアジャイルの認識を合わせ、開発開始のオーバーヘッドを低減した。
  • デイリースクラムにて、通常の報告では現れてこない開発者の機微を捉えることができた。
  • 密なコミュニケーションとフラットなチーム体制により、PJメンバーの当事者意識を高め、積極的なコミットを促進できた。
◇課題
  • ビデオ通話可能なチャットツールを利用できない。            (slack、skype、wechat全部社内標準外SW)
  • 顧客、弊社、オフショアのサイトがバラバラであり、各方向でのやりとりが必要。
  • 顧客の案件管理はWF型WBSベースであり、それに合わせた報告も必要。

 

中国での所感

 私は中国に初めて行ましたが、日本とは異なる点を多々感じました。
 特に、ITサービス面で進歩しているのが印象的でした。
 

  • 決済、レストランの注文、自転車のレンタルなど何でもQRコードで完結する。   レストランでは卓上のQRを読み込むとメニューが見れて注文もできる。      ファミレスみたいに何種類のメニューを用意しなくて済むし、言語対応も容易にできるのでは?
  • Uber eatsの中国版が流行している。サービス利用した方が半額程度になるというバグみたいな仕様。
  • スマホ=命みたいなものなので、レストランなどにはモバイルバッテリーの自販機が設置してある。時間制でレンタルすることができる。もちろんQRコードで。

 

 また、セキュリティ面でのチェックが厳しく、地下鉄の改札では毎回荷物検査があったり、観光地ではパスポートでの事前予約が必須であったりと、戸惑うことも多かったです。

 パンダは中国でも人気だが、個体数が多いので価値は低いとのことでした。
f:id:maaaaatch:20190825171435j:plain
 
 
 
それでは〜
 

PythonでABC132

こんにちは、まっちです。

今回は、PythonでABC132のA〜D問題を解きました。


atcoder.jp

A - Fifty-Fifty

4文字の文字列が、2種類の文字がそれぞれ2文字ずつ含まれるかを判定する。
対象が4文字と少ないので、全パターンを調べます。

S = str(input())

if S[0] == S[1]:
	if S[0] != S[2] and S[2] == S[3] :
		print('Yes')
	else:
		print('No')
else:
	if (S[0] == S[2] and S[1] == S[3]) or (S[0] == S[3] and S[1] == S[2]):
		print('Yes')
	else:
		print('No')
 


B - Ordinary Number

素数nの数列から連続する3要素を取り出した時に、真ん中の要素が2番目に大きくなるパターンを数え上げる。
3要素が単調増加/減少のパターンが該当するので、比較演算子を用いた判定を行う。

N = int(input())
P = list(map(int, input().split()))

ans  = 0

for i in range(N-2):
	if (P[i] < P[i+1] and P[i+1] < P[i+2]) or (P[i] > P[i+1] and P[i+1] > P[i+2]):
		ans += 1

print(ans)
 


C - Divide the Problems

素数Nの数列を半分に分ける閾値Kはいくつあるかを求める。
数列をソートして、N/2の境界にある要素の差がKの数となります。

N = int(input())
D = list(map(int, input().split()))
D.sort()
M = int(N/2)
print(D[M]-D[M-1])
 


D - Blue and Red Balls

K個の青玉とN-K個の赤玉がある。
青玉がi個の区画に別れるような玉の並べ方の総数をiの値ごとに求める。

回答方針は以下としました。

  • 青玉をi個の区画に分ける組合せを求める。

 {}_{K-1}\mathrm{C}_{i-1}

  • その青玉区画をi個の仕切りとみなし、N-K個の赤玉とi個の仕切りの組合せを求める。

 {}_{N-K+1}\mathrm{C}_{i}

  • 上記の事象は独立のため、各組み合わせの積を取る。(重複組合せ)

 {}_{K-1}\mathrm{C}_{i-1}\times{}_{N-K+1}\mathrm{C}_{i}

import math

def comb(n,r):
	if n >= r:
		return math.factorial(n)//(math.factorial(n-r)*math.factorial(r))
	else:
		return 0

N, K = map(int, input().split())

for i in range(1,K+1):
	print(comb(K-1,i-1)*comb(N-K+1,i)%(10**9+7))
 




以上となります。
明日のABC133も頑張りましょう。

それでは。

PythonでABC131

こんにちは、まっちです。

今回は、PythonでABC131のA〜D問題まで解きました。


atcoder.jp

A - Security

4桁の数字の中に、連続した同じ数字を含むかを判定する。
隣り合う桁を順に比較し、同じ数字だったら処理を抜けます。

S = str(input())
 
ans = 'Good'
 
for i in range(3):
	if S[i] == S[i+1]:
		ans = 'Bad'
		break

print(ans)
 


B - Bite Eating

N個の数字の中で、総和の差分が最小となるように要素を1つ除外する。
絶対値が最小の要素を除外すれば良いです。
単調増加の要素という点に注目し、以下のように条件分岐をさせます。

  • Lが正値 → 先頭の要素を除外
  • Lが負値、かつNがLの絶対値以下 → 末尾の要素を除外
  • Lが負値、かつNがLの絶対値より大きい → 除外なし(0が除外対象)
N, L = map(int, input().split())
ans = 0

if L >= 0:
	A = range(2,N+1)
elif L <= 0 and N <= abs(L):
	A = range(1,N)
else:
	A = range(1,N+1)

for i in A:
	ans += L + i - 1

print(ans)
 


C - Anti-Division

A以上B以下の数字のうち、CでもDでも割り切れない数字の個数を求める。
下記のようにベン図を用いた集合計算が思い浮かべました。

  • (A以上B以下の個数) - (Cで割り切れる個数) - (Dで割り切れる個数) + (CでもDでも割り切れる個数)
% 最小公約数 
def gcd(a, b):
	while b:
		a, b = b, a % b
	return a

% 最大公約数
def lcm(a, b):
	return a * b // gcd (a, b)


A, B, C, D = map(int, input().split())

N = B - A + 1

E = B//C - (A-1)//C
F = B//D - (A-1)//D
G = B//(lcm(D,C)) - (A-1)//(lcm(D,C))

ans = N - (E + F - G)

print(ans)
 

CとDの最小公倍数を求めるにあたり、下記を参考にしました。
cocodrips.hateblo.jp

D - Megalomania

N個のタスクについて、各時限内で完了するような実行順序を求める。

回答の方針は、以下としました。

  • 時限Bが短いものから順に実行する。(可能な実行順序を1つ見つければ良い。)
  • 上記の順で工数Aを積み上げていき、時限を超えたら処理を抜ける。
N = int(input())
A = [0]*N
B = [0]*N
for i in range(N):
	A[i], B[i] = map(int, input().split())

S = 0
ans = 'Yes'

L = sorted(range(N), key=lambda k: B[k])
for j in L:
	S += A[j]
	if S > B[j]:
		ans = 'No'
		break

print(ans)
 

sortのindexを返す方法については、下記を参考にしました。
codeday.me
 


以上となります。
間違い等あれば、ご指摘いただけると嬉しいです。

それでは。

PythonでABC130

こんにちは、まっちです。

今回は、PythonでABC130に参加した記事です。
ABC126に続き、2回目の参加となります。

atcoder.jp

終結

A,B,C問題の3完で、44:16でした。(B回答ミスのペナルティ含む)
f:id:maaaaatch:20190616224308p:plain

私の回答

備忘と戒めを込めて、クソコードを記載します。

A - Rounding

X, Aを比較し、XがA未満なら0を、XがA以上なら10を出力する。
単純に条件分岐させます。

X, A = map(int, input().split())

if X < A:
	print(0)
else:
	print(10)
 


B - Bounding

素数Nの数列を順に足し込み、X以下となる回数を求める。
for文でリストの要素を1つずつ足し、毎回Xと比較します。

N, X = map(int, input().split())
S = list(map(int, input().split()))
l = len(S)

ans = 1
num = 0

for i in range(l):
	num += S[i]
	if num <= X:
		ans += 1

print(ans)
 

1度目は、リストの総和がX以下となるケースをケアできておらず、回答ミスとなりました。

C - Rectangle Cutting

xy座標上の四角領域を、座標(x,y)を通る直線で二分する。
そのうち、小さい方の領域面積の最大値とそれを実現する直線の数(1本or複数)を判定する。

回答の方針は、以下としました。

  • 領域内の座標(x,y)を通る直線で二分する場合、最大値は全体面積の半分となる。
  • 座標(x,y)が領域の中心の場合、直線は複数存在する。
W, H, x, y = map(int, input().split())

S = "{0:.6f}".format(float(W*H/2))

if x == W/2 and y == H/2:
	print(S, 1)
else:
	print(S, 0)
 


D - Enough Array

素数Nの数列Aから、任意の長さの連続部分列を取り出す。
その和がK以下となる部分列の数を求める。

回答の方針は、以下としました。

  • ウィンドウWを設定し、数列Aの中を動かしていく。
  • Nまで動かしたら、Wの幅を広げ上記の処理を再度行う。
N, K = map(int, input().split())
A = list(map(int, input().split()))

ans = 0

for W in range(1,N+1):
	for i in range(N+1-W):
		S = sum(A[i:i+W])
		if S >= K:
			ans += 1

print(ans)
 

自信はあったのですが、テストケース14からTLEとなってしまいました。
問題文の記述をケアしてあげないといけなかったのかもしれません。

出力が 32bit整数型に収まらない場合があることに注意してください。


※2019/6/17追記

本問は、尺取り法という解法が有効だったみたいです。
私の解法はいわゆる全数探索だったため、O(N^2)の計算量となっていました。
尺取り法では、O(N)の計算量に抑えることができます。

qiita.com


以下のコードで正答できました。

N, K = map(int, input().split())
A = list(map(int, input().split()))

ans = 0
S = 0
j = 0

for i in range(N):
	while S < K:
		if j == N:
			break
		S += A[j]
		j += 1
	if S >= K:
		ans += N - j + 1
		S -= A[i]

print(ans)
 


総評

2回目にしては、割と解けたのではないかという印象でした。
今後の課題としては、以下でしょうか。

  • 基本構文を覚え、A,B問題の回答タイムを上げる。
  • A,B問題での回答ミスをなくす。
  • C問題も運ではなく、実力で回答できるようにする。
  • D問題では正答だけなく、処理ウィンドウに収まるよう、コードを工夫する。

当面はD問題まで解けるよう、過去問に触れていきます。


それでは。

技術書を作成した話

こんにちは、まっちです。
今回は、先日公開した技術書を作成した話を書きたいと思います。

作成した技術書

技術書は以下となります。BOOTHとnoteで公開しています。

data-analysis-cs.booth.pm

note.mu

”Data Analysis Cheat Sheet”というタイトル通り、薄い本ではなく、データ分析を行う際のノウハウをまとめたシートです。
Pythonライブラリ”pandas”, ”matplotlib”のコマンド、およびデータ前処理の基本手法をそれぞれ1枚のシートにまとめています。


作成のきっかけ

技術書作成のきっかけは、友人と行なっていた勉強会です。

私は友人に誘われて昨年8月頃からPythonを始め、週一で機械学習の勉強会を行なっていました。
その中で、何かアウトプットをしようということになり、技術書の作成を決めました。

当初は技術書典6での頒布を考えていましたが、抽選に落ちてしまったため、BOOTHとnoteで公開しました。


タスクとスケジュール

公開までのタスクとスケジュールは以下です。作成期間は約3ヶ月でした。

 1/14~1/26    matplotlib、pandasのパワポ作成
 2/3~2/23     前処理のパワポ、notebook作成
 3/2~3/16     matplotlib、pandasのnotebook作成
 3/23~4/6     デザイン、内容精査
 4/7~4/12     公開内容の最終決定
 4/13       公開

f:id:maaaaatch:20190502172017p:plain
WBSでスケジュール管理

技術書を作成してみて

大変だったこと
  • 基本的に週末作業であり、時間が限られている
  • シート1枚に収めるため、内容と紙面のマネジメントが難しい
  • 内容変更があると、紙面の手戻りが半端ない
  • 完成度を80% → 100% にする作業に最も工数が必要
  • 圧 倒 的 デ ザ イ ン セ ン ス 不 足
良かったこと
  • 購入されると本当に嬉しい
  • サポートやBOOSTをいただくとさらに嬉しい
  • 作成を通して、自分の理解も深まる
  • 売上を次の技術書作成の資金にできる

大変なこともありましたが、作品が売れたときの喜びはそれ以上の価値があると思いました。
こんな処女作でも、お金を出して手に取っていただけることに感謝しかありません。


今回の経験を通して

技術書作成という初の挑戦でしたが、大変刺激的な経験となりました。
知識を受信する側から発信する側に回ることによって、知識伝播サイクルに参加できたという気持ちです。
このサイクルに乗り続けることが技術者にとって重要だと思いますので、売上を資金にして次回の技術書作成にも取り組んでいきます。


それでは。


※購入いただいた方へ

この度は、本作品を購入いただきありがとうございます。
稚作ではありますが、ご活用いただければ幸いです。

使用したご感想やご指摘など、忌憚のない意見もお待ちしております。

技術書典6に行ってきました。

こんにちは、まっちです。

今回は技術書典に行ってきた話を書きたいと思います。

技術書典について

技術書典とは、技術書オンリーの同人イベントです。
技術書であれば何でもOKという、技術者にとっては夢のようなイベントです。
今回で6回目となり、私は前回に続き2回目の参加でした。

◼︎公式サイト
techbookfest.org


当日の流れ

今回はイベント初の有料参加が導入されました。
11〜13時が有料となり、1000円でチケットが購入できます。

10時からチケット発売ということで、9:45に会場に到着。
この時点で300人くらい並んでいましたね。

並んでいると予定通り、10時からチケット販売開始。

f:id:maaaaatch:20190415210100j:plain
有料参加のチケット(番号は連番ではないみたいです。)


11時から入場開始し、私は11時10分頃入場できました。

f:id:maaaaatch:20190415210200j:plain
入場時の会場の様子


購入した技術書

今回は14冊購入しました。
GWに読んで感想を書きたいと思っています。

f:id:maaaaatch:20190415210228j:plain
戦利品たち


 ・技術をつたえるテクニック ~分かりやすい書き方・話し方~(mochikoAsTech)
mochikoastech.booth.pm

 ・技術同人誌を書いたあなたへ ~著者のしあわせなミライ~(mochikoAsTech)
mochikoastech.booth.pm

 ・挫折論への招待(Growthfaction 成長と充実を研究する会)
growthfaction.booth.pm

 ・チーム開発1年目の教科書(しがないラジオ)
booth.pm

 ・ml5.jsとp5.jsでつくる機械学習コンテンツプログラミング(きゃべ)
booth.pm

 ・Nuxt.jsとPythonでつくる『ぬるさくAIアプリ開発入門』(ノルウェイギーク
booth.pm

 ・Developers Magazine vol. 1(六本木未来ラボ)
booth.pm

 ・マンガで分かるPRML(鳩屋)
booth.pm

 ・旅するエンジニア2(旅するエンジニア)
booth.pm

 ・ひとり情シスのネタ帳(clear-mint)
booth.pm

 ・技術書を書く人のための得する制度、損する行動(増井技術士事務所)
booth.pm

 ・WANTEDLY TECHBOOK NO.5(Wantedly執筆部)

 ・WANTEDLY TECHBOOK NO.6(Wantedly執筆部)


所感

前回に引き続き、2回目の参加となった今回の技術書典の感想です。

  • 有料参加は大正解。会場の混雑は多少緩和されていた。
  • ただ、有料でも11時30分頃にはすれ違うのも難しい状況だったので、序盤組で行くか無料参加の二択。
  • 前回と比べ、読み物が多かった印象。
  • 特に、技術書を書くための読み物が多く、技術書執筆の関心の高さが窺える。
  • 技術関連では、GO・Vue・Nuxt・Rubyなど、ホットな言語が会場のメインどころに配置されていた。
  • エンジニアの人数の多さと秘めたる熱量を肌で感じることができた。

次回の技術書典に向けて

惜しながらも、大盛況に終わった技術書典。
次回はおそらく10月開催だと思いますが、必ず参加します。

今回、抽選に落ちてしまいサークル参加ができませんでした。
次回は是非とも出品側で参加し、エンジニアたちの熱量を味わいたいですね。

f:id:maaaaatch:20190415210257j:plain


最後に告知

今回サークル参加はできませんでしたが、技術書典に合わせ作品を公開しています。
『Data Analysis Cheat Sheet』と題して、データ分析に用いられるコマンドや手法を3枚のシートにまとめています。

無料サンプルも合わせて公開していますので、ご覧になっていただけると嬉しいです。

data-analysis-cs.booth.pm

f:id:maaaaatch:20190415211330p:plain

f:id:maaaaatch:20190415211354p:plain

f:id:maaaaatch:20190415211422p:plain
作品サンプル



それでは〜。