きょうこログ

初心忘れず、最後まで全力で頑張ります。よろしくお願いします。

LINEスタンプをリリースした記録

先日ようやく就職活動が終了し、少しずつ心の余裕と時間のゆとりを持てるようになりました。ブログの更新は久しぶりですが、これからはまた少しずつ書いていけたらいいなぁと思っています。ということで、今回は「LINEスタンプをリリースした記録」をテーマに記事を書こうと思います。記事としては短いかも…笑

変な表現や言葉遣い等、気になる所ありましたら連絡して頂けると嬉しいです。よろしくお願いします。


先日、2018年度にしたいことリストを作りました。

この中の1つとして挙げていたのが、LINEスタンプを作ることです。進路が決まってから、早速作り始めて見たのですが、結論から言うと 想像以上に簡単 でした。具体的には、

  • 自分の使っているLINEアカウントからすぐに登録できる
  • すぐに申請して、すぐにリリースできる
  • イラスト用のアプリケーション(Adobe Illustrator など)が無くても作れる
  • イラスト用のデバイス(ペンタブレット など)が無くても作れる

などです。ちなみに制作を初めてからリリースされるまで5日も経っていません。ビックリするぐらい早く作る事が出来ました。

…前置きはこの辺にして、早速 紹介させてください!

自分の好きな くま と色々なものを混ぜてみました。なかなかスタンプっぽいスタンプを作るのは難しいですね笑 想像以上に簡単とはいえ、絵を40個描いて色をつけるだけなのに、なかなか骨の折れる作業でした。イラストレーターの方って凄い…

今回、スタンプ制作初体験でしたが、初めてにしては凄く楽しく作れました! 友人らとアイデアを出し合ったり出来たことも、面白かったです笑 かなりアマチュアなスタンプですが、良かったら感想を頂けると(買わなくても!)嬉しいです。ぜひよろしくお願いします。


以上が私が2018年にしたかった事 No. 6 です。あと90個近くも残ってます…! 卒業研究や学校生活も楽しみつつ、残りの10ヶ月弱で今までしたかった事を消化していきます! 良ければご協力頂けると嬉しいです。

ありがとうございました!

【2018年度】100個のしたい事リスト 06.21更新

小学生の頃から行動する前に目標を決める習慣があって、いつも自分の部屋には目標をたくさん書いた紙が貼ってありました。特に中学生の頃は「砲丸投げで12m50飛ばす!」とか「定期試験で全部90点以上取る!」とか(達成出来たかどうかは別にして…)とにかく目の前の目標に向かって猛進していた記憶があります。

ただ最近になってから、ふと自分の今の目標を見返すと、今まで私が立ててきた目標に比べて 野心 が足りないんじゃ無いかと思うようになりました。何と無くふんわりしているというか…定量的で無いというか…

そこで今のふんわりな自分から脱却する為、一念発起して 100個のしたい事リスト を作ってみることにしました。100個書けば3割くらいは野心丸出しの目標になるはず…!

とりあえず書いてみます。気になる所や変な所がご連絡いただけると嬉しいです!よろしくお願いします。

【06.21 追記】いくつかしたいことを達成しました!


就活

  1. 就活を成功させる 達成!

できたら凄そうなこと

  1. メールは全部1分以内に返す 達成中!
  2. 授業は寝ずに全部聞く
  3. 英語がペラペラ話せるようになる
  4. インドネシア語がペラペラ話せるようになる
  5. 自分の作ったものをどこかで売る / 売ってもらう
  6. 腹筋を6つに割る
  7. 背筋をパンパンに鍛える
  8. 胸筋をパンパンに鍛える

健康と美容のこと

  1. 体重を58kg以下まで落とす
  2. 180度開脚が出来るようになる
  3. もさもさしない髪の毛を目指す 達成中!
  4. 脱毛を終わらせる
  5. 言葉遣いを直す
  6. 姿勢を綺麗に直す
  7. 眉毛カットに行く
  8. 整体に行ってO脚を直す
  9. お化粧が上手に出来るようになる

毎日したいこと

  1. 毎月の収支を正確に把握する
  2. 毎日寝る前は部屋を片付ける
  3. 毎日顔パックする
  4. 毎日次の日の準備をする 達成中!
  5. 毎日体重を測る
  6. 毎日ストレッチをする
  7. 毎日ラジオ体操をする
  8. ブログを月に2回ペースで更新する

スポーツ

  1. 全国高専大会 砲丸投げで3連覇する
  2. 砲丸投げで10m50飛ばす
  3. 円盤投げで30m00飛ばす
  4. やり投げで30m00飛ばす
  5. 陸上競技以外のスポーツに挑戦する
  6. 陸上競技以外のスポーツの大会に出場する
  7. 何かスポーツを観戦しに行く

技術系 / 作りたいもの

  1. セキュリティの勉強をする
  2. RasPiを使って何か作る
  3. Arduinoを使って何か作る
  4. オリジナルのWebアプリケーションを作る
  5. LINEbotを作る
  6. LINEスタンプを作ってLINE STOREで公開する 現在申請中!
  7. 経済学を勉強する
  8. デザインの勉強をする
  9. GitHubを全体的に緑にする

人と話すこと

  1. エンジニアの友達を作る
  2. きゅんくんさんと会って話をする
  3. 糸井重里さんと会って話をする
  4. 家族と日頃からたくさん話す 達成中!
  5. 友達と日頃からたくさん話す

行きたいところ

  1. ディズニーランド or ディズニーシーに行く
  2. お買いものパンダカフェに行く
  3. 楽天本社でお買いものパンダと写真を撮る
  4. 京都で観光する
  5. メイドカフェに行く
  6. 淡路島に行く
  7. 大鳴門橋記念館に行く
  8. 玉ねぎキャッチャーで遊ぶ
  9. 浴衣を着る
  10. 花火大会に行く
  11. 温泉旅行に行く
  12. 水着を着てプールに行く
  13. 海辺で夕焼けを見る
  14. 海外旅行に行く
  15. エレカシのライブに行く
  16. 釣りをしに行く

欲しいもの

  1. Nintendo Switchを買う 達成!
  2. マリオオデッセイを買う 達成!
  3. とびだせ どうぶつの森を買う
  4. お気に入りの服を見つけて自分で買う
  5. フットマッサージ機を買う
  6. ヨガマットを買う
  7. (2019年度に向けて)筆箱を新調する

食べたいもの

  1. 焼肉を食べに行く
  2. ちょっと高級なお寿司屋さんに行く
  3. 美味しい生牡蠣を食べに行く
  4. めっちゃ美味しいかき氷を食べに行く
  5. 和菓子を自分で作って食べる
  6. 色んなアイスを食べて記録する

勉強のこと

  1. 卒業論文で1番の成績をとる
  2. 定期テストのクラス順位で3位以上に入る
  3. 本をたくさん読む 達成中…?
  4. 毎月1冊以上本を読んで記録する
  5. TOEICで800点をとる
  6. 応用情報の資格を取る

20歳になったらしたいこと

  1. 美味しいお酒を飲んでみる
  2. 自分でお酒を作る
  3. 友達と居酒屋さんに行ってみる
  4. 自分で書類を作る
  5. バイクの免許をとる

その他

  1. アイシングクッキーの教室に行ってみる
  2. アイシングクッキーをマスターする
  3. ぬいぐるみを作る
  4. 夏休みに一人暮らしをする
  5. 料理を練習する
  6. アルバイトをする
  7. (1回だけでいいから)制服を着る
  8. 楽器が弾けるようになる
  9. イデアコンテストに応募する
  10. イデアコンテストで入賞する
  11. 誰と喋っても優しいと思われる人になる
  12. 落ち込んでも1日以上引きずら無いようにする
  13. 携帯電話の画面を直す

ようやく書き終わりました。80個目ぐらいまでは調子が良かったんですが、最後の20個がなかなか出てこなかったです。目標にしていいのか微妙なやつもいくつかありますが…笑 とりあえず100個書いてみて、いくつか野心丸出しの目標も出すことが出来たんじゃなかなぁ と思います。それと、私が心の中でしたいと思っていた事もリストに出来て良かったです。

他の色々なサイトを参考にさせて頂いたのですが、私がこの目標を出した方法としては、

  1. とりあえずいっぱい書く
  2. 書くことが無くなったら分類してみる
  3. 全体のバランスを見て目標が少ないところを中心に増やす

でした。今後も達成出来次第、追記していければいいなぁ と思っています。


せっかく沢山目標を書き出すことが出来た & 公開することが出来たので、口先だけにならないように気をつけます笑 頑張るぞー!

2年前の高専ロボコンでチームリーダーをした記録

2014年から2016年まで、明石高専ロボット工学研究部 ( = ロボ研 ) に在籍し、NHKロボコンに参加していました。高専に入学してからの3年間をロボ研で過ごして、4年目の高専生活も終え、就職を1年後に控えた今、ロボコンを通じて考えた事や学んだ事を記録を残しておきたいと思います。とは言ってもロボコンの技術的な内容は、いつか使わなくなってしまうので… この記事のテーマは「2年前の高専ロボコンでチームリーダーをした記録」です。

上手くまとめられるかな… 文章の内容や書き方などに疑問点があれば、ご連絡頂けると凄く嬉しいです。どうぞよろしくお願いします。

そもそも私達はどんなロボットを作ったのか

2年前 (2016年) の高専ロボコンのテーマは「ロボット・ニューフロンティア」でした。ルールは簡単に言うと「箱運び & 箱積み」です。詳しい内容は当時のルールブックをご覧ください。

今年の競技はロボットによる「新大陸開拓」です。

みなさんは「探検家」として新大陸を目指します。待ち受ける障害をロボット で乗り越え、新大陸を開拓した証としてブロックを積み上げ「砦」を築き上げ ます。

高専ロボコン2016ルールブック

私が所属していたのは、明石高専Bチーム「あさごん」です。私達のチームでは数々の試作を経て、バンブー田城 (写真左) や カストーレ竹田 (写真右) 、橋の わたる と とおる を制作しました。… 凄く懐かしい名前ですね笑 下から箱を滑り込ませる機構や大容量の箱運びが特徴のロボット達です。

f:id:f_respectful12:20180414193133j:plain


ちょっとだけ寂しかった経験

私が高専に入学したのは2014年の4月。その頃はロボコンなんて1mmも知りませんでしたが、当時の先輩が動かして見せてくれた 球を飛ばすロボット ( 多分、2014年の近畿合ロボに出したロボット ) にうっかり心を揺さぶられてしまい、そのまま ロボ研への入部を決めてしまいました。

ですが、実際に入部したロボ研は、想像以上に(私にとって)キツい環境で、ちょっとだけ寂しさを感じていました。具体的には、

  1. 女子が圧倒的に少ない(後期開始の時点で1人)
  2. 機械工学科の人が大半で電気情報工学科の私には アウェー
  3. 同級生はロボコン経験者が多く、知識量で追いつけない
  4. そして 技術的にも追いつけない
  5. そもそも高専生的な知識 (アニメとか数学とか) に乏しくて 普通の会話に混ざれない
  6. 1年間でかなりの数の部員が辞めていく

などです。技術的なトコロでロボ研の力になれない上、他の部員の方ともイマイチ仲良くなりきれない状況は、なかなか辛いものがあり、実際にロボ研を辞めていった同級生達も同じ気持ちだったんじゃないかなぁ…と感じています。また最初の1年間で、辞めてしまった上級生の方々が何人もいらっしゃって、もしかして部活楽しくなかったのかな…?と考えたりもしていました。

ロボ研1年目を終えて、私がロボコンにおいて1番重要だと思ったのは「いかにロボコンを楽しむか」です。楽しい学校生活にする為に楽しいロボコンをしたかったことも理由の1つですが、何より私が初めて見た 2014年の全国高専ロボコン優勝されたチーム の凄く楽しそうな様子が印象的だったからです。

f:id:f_respectful12:20180415174959p:plain

チームリーダーとして目指した環境

そんな私も、なんやかんやで3年生に進級し、ロボコンのチームリーダーを担当するまでになりました。チームリーダとして1番に目指したのは「全員が仲良く楽しく真剣に全力を出せる環境作り」です。そんな環境作りの為に、絶対に外せない要素として、

  • 初心者の1年生に壁を感じさせない
  • ベテランの上級生にストレスを感じさせない
  • スケジュールを可視化する
  • 完成形のイメージを共有する
  • (ロボコンと関係なく) チームメイトとの親交を深める
  • 自分のストレスはチームメイトに見せない
  • とりあえず色んなメンバーと喋りまくる

を意識してチームを作りました。

…ご存知の方もいらっしゃるかもしれませんが、この時の明石高専Bチームの目標は「絶対全国優勝 ~ All of us make the aim perfect! ~」です。チーム内やメディアの前では「絶対全国優勝」の方を多く口にしていたのですが、実は同じぐらい「 All of us make the aim perfect! 」も大切にしていました。意味は「チーム全員で目標を成し遂げよう!」です。(正しい英語なのかは微妙…)"All of us" ( チーム全員 ) っていう言葉がポイントで、1人でも多くロボコンを真剣に楽しむ人が増えるように 心がけていました。


以下はチーム作りの中でも特に大事にした部分です。

1. 初心者の1年生に壁を感じさせない

具体的な方策

  • 基本的に話し合いや会議では専門用語を使わない
  • 可能な限り報告会を開催しロボコンの流れを感じてもらう

高専ロボコンに参加する1年生は、

  1. ロボコン経験者 or やたら技術的な事をよく知ってる子
  2. ロボコン未経験者 or 技術はまだ分からないけどロボコンに興味がある

といった2つのタイプに分かれることが多いです。ちなみに私は 2. の方でした。

少し話が変わりますが、高専に入学する全ての人は多かれ少なかれ「自分よりもよく出来る人が近くにいる」と感じたことがあるんじゃないかと思います。私はそうでした。自分には付いていけない専門的な話で盛り上がる同級生や先輩を見て、微妙に劣等感を感じていました。

私がチームリーダーになって最初に始めたのは、この 1.2. どちらのタイプの1年生にも壁や劣等感を感じさせずロボコンを楽しんでもらうことです。1年生がロボコン楽しみながら積極的に活動に参加してくれると、単純に作業人員が確保できます。その上、私の居たチームでは純粋にロボコンを楽しむ1年生に引っ張られて上級生も楽しく作業していたんじゃないかと思っています。

2. スケジュールを可視化する

f:id:f_respectful12:20180423170740p:plain

当時はLINEのノート機能を使ってこんな風にスケジュールをチームで共有していました。今はもっといいアプリや機能があると思いますが、どんなものを使うにせよ チームメンバー全員でスケジュールを確認し合える環境 は必要だったと思います。

ちなみに、これらのスケジュールは私 ( = チームリーダー ) だけで決めていた訳ではありません。定期的に3年生 ( = 当時のチームの最高学年 ) に集まってもらって、スケジュールや全体の流れを確認して貰ってから決定していました。

3. 完成形のイメージを共有する

f:id:f_respectful12:20180423171107p:plain

これは6月頃に設計前の段階で描いたロボットの凄くざっくりした計画図です。試作で決定した機構がどこに使用されるか。他の機構との兼ね合いはどうか。をチームで共有するために書きました。

ロボコンには加工、設計、回路、制御 etc... 様々な役割があります。その分チームのメンバーがそれぞれ持っている専門知識や経験も様々です。そんな色んな役割の人達が1つのものを作る為には 同じ ゴールイメージ が見えていないと難しいんじゃないかなぁ〜と思っています。その点では( 微妙な完成度のざっくりした計画図でも )色んな役割・学年の人が 同じ図を見てイメージを共有できて、良かったんじゃないかと思います。

4. 自分のストレスはチームメイトに見せない

大会が近づいてくると、メンバー同士の口調のきつい議論が増えたり、チーム全体がイライラした雰囲気に包まれることは、どんなチームであっても少なからずあると思います。( ロボットの調子が悪い時にも起こりがち… )

私がここでチームリーダーとして大事にしたのは「いかにメンバーが余裕を持って作業できるか」です。その為には私の感じていたストレスは外に出さず、出来るだけ余裕を持ってチーム内ではいつでもニヤニヤしているように、心がけていました。( 本当に出来ていたかどうかは怪しい )

また、チームの一部で切羽詰まった議論が発生した場合は、一度その場で議論を停止してもらい、落ち着いた後にチーム全員で話し合いを行いました。チームに発生した問題を全体に共有できるだけでなく、全員で落ち着いて話し合いが出来ると後からわだかまりとして残らないので、良かったと思います。


以上が私の「2年前の高専ロボコンでチームリーダーをした記録」です。本当はもう少し、心の中でこっそり考えていたことや意識して行動していたことがあるのですが、恥ずかしいのでこの位にしておきます…!

こんな事を書くと怒られてしまいそうですが、まずは楽しんでみるっていうのも、1つのアイデアなんじゃないかなぁと思います。もちろんロボコンにしかない自由な発想も高専でしか身につけられない技術も大事だと思いますが、あまり求められているものに縛られ過ぎず、楽しくロボコンをする人が増えれば嬉しいなーって思います。こんなまとめで伝わるかな…笑

…いつか書こうと思っていたこの記事もようやく書き終わり、ようやく私の中のロボコンは一区切りつきました。チームリーダーをした1年間も含めてロボコンと関わった3年間は、色んな事が出来て色んな人に出会えて、凄くいい経験になりました。これからもロボコンが続いていくんだろうなぁって考えると、嬉しいような寂しいような… 本当に有難うございました。

現役の ( +未来の? ) ロボコニストの皆さんこれからも頑張ってください!私も頑張るぞー!

おまけ

当時の部長が作ってくださったロボットの紹介PVです。面白くてめちゃめちゃ気に入ってます。しかもめっちゃいい声。よかったら是非見てみてください!

言語処理100本ノック【第3章 前編】

課題研究で言語処理100本ノック 2015に取り組んでいます。前回の続きです。使用言語はPython3です。今回からは第3章 正規表現 です。まずは第3章前半の5つを説明します。よければプログラムも説明文も、間違ったところや変なところがあればアドバイス頂けるとすごく嬉しいです!

第3章の概要

Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある.

1行に1記事の情報がJSON形式で格納される 各行には記事名が"title"キーに,記事本文が"text"キーの辞書オブジェクトに格納され,そのオブジェクトがJSON形式で書き出される ファイル全体はgzipで圧縮される 以下の処理を行うプログラムを作成せよ.

20. JSONデータの読み込み

Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.

ソースコード

import json

with open("jawiki-country.json", "r") as f:
  for i in f:
    a = json.loads(i) 
    if a.get("title") == "イギリス":
      print(a)

このプログラムではJSONファイルを読み込みの前段階として、withを使用しています。これまでのプログラムでは、open()でファイルオブジェクトを取得しclose()でメモリを解放する ( = ファイル操作を終わる ) までが一連の流れでした。しかしwith open() asを使ってファイルオブジェクトを取得すると、withブロックを抜けるタイミングで自動的にcloseするので、close()を明示する必要がありません。めっちゃ便利。

JSONデータを読み込むには、jsonモジュールのloads関数を用います。そもそもJSONとはデータを表現するための記法の1つで、難しい構造のデータを人間にも分かり易く表現することができます。例えば、

{
    "名前":[
        "きょうこ",
        "KYOKO",
    ],
    "出身地" : "日本",
    "生年月日":[
        "" : "1998",
        "" : "12",
        "" : "26"
    ]
}

と書くことで、人物のデータをまとめることが出来ます。loads関数を用いることで、与えられたJSONデータを辞書型に変換しました。

出力結果

{{redirect|UK}}
{{基礎情報 国
|略名 = イギリス
|日本語国名 = グレートブリテン及び北アイルランド連合王国
(中略)
[[Category:島国|くれいとふりてん]]
[[Category:1801年に設立された州・地域]]

21. カテゴリ名を含む行を抽出

記事中でカテゴリ名を宣言している行を抽出せよ.

ソースコード

import json

with open("jawiki-country.json", "r") as f:
  for i in f:
    a = json.loads(i) 
    if a.get("title") == "イギリス":
      b = a.get("text").split("\n")

for i in b:
  if "Category" in i:
    print(i)

split()は文字列を任意の区切り文字で分割する関数で、このプログラムではイギリスに関する記事を \n ごとに区切りました。区切った各行に対してinステートメントを使って、"Category" という文字列を含む行のみを抽出しています。

実行結果

[[Category:イギリス|*]]
[[Category:英連邦王国|*]]
[[Category:G8加盟国]]
[[Category:欧州連合加盟国]]
[[Category:海洋国家]]
[[Category:君主国]]
[[Category:島国|くれいとふりてん]]
[[Category:1801年に設立された州・地域]]

22. カテゴリ名の抽出

記事のカテゴリ名を(行単位ではなく名前で)抽出せよ.

ソースコード

import json
import re

with open("jawiki-country.json", "r") as f:
  for i in f:
    a = json.loads(i) 
    if a.get("title") == "イギリス":
      b = a.get("text").split("\n")

regex = re.compile("^\[\[Category:(.*?)(\|.*)*\]\]$")

for j in b:
  if "Category" in j:
    print(regex.search(j).group(1))

このプログラムでは、jsonモジュールとreモジュールをインポートしました。1つ前の 21. カテゴリ名を含む行を抽出 で抽出した行に対して正規表現を使用し、カテゴリ名を抜き出します。re.compile()は、正規表現オブジェクトをコンパイルする関数です。この関数で生成したオブジェクトに対して、reモジュールの関数を使用することができます。

この問題のポイントは、行によって抽出のパターンが2通り考えられることです。例えば、

f:id:f_respectful12:20180405150051p:plain

のように、パターン①では |* を除去して "イギリス" のみ抽出する必要がありますが、パターン②では "欧州連合加盟国" だけを抽出します。ここでは、"|"からはじまる0文字以上の文字を考えることで、2つのパターンから必要な情報だけを抜き出しました。

^[[Category:(.?)(|.)*]]$

正規表現 意味
^ 行のはじまり
[[Category: 全て一致
(.*?) 任意の0文字以上の文字: グループ
(|.*) "|"からはじまる0文字以上の文字: グループ
*]] 全て一致
$ 行のおわり

search()正規表現がマッチする最初の場所を探す関数です。正規表現オブジェクト.search(検索対象の文字列)で検索結果 ( = マッチオブジェクト ) を返します。group()はマッチオブジェクトを解読して、抽出したグループを取り出す関数です。正規表現では抽出対象をグループ化することが出来ます。この例では、(.*?)(\|.*)などです。group()の引数にはグループ番号を指定します。グループ番号は正規表現の左から順番に 1, 2, 3... です。抽出対象全体は 0 で指定できます。

実行結果

イギリス
英連邦王国
G8加盟国
欧州連合加盟国
海洋国家
君主国
島国
1801年に設立された州・地域

23. セクション構造

記事中に含まれるセクション名とそのレベル(例えば"== セクション名 =="なら1)を表示せよ.

ソースコード

import json
import re

with open("jawiki-country.json", "r") as f:
  for i in f:
    a = json.loads(i) 
    if a.get("title") == "イギリス":
      b = a.get("text").split("\n")

regex = re.compile(u"^(==+)\s*(.*?)\s*(==+)$")

for j in b:
  c = regex.search(j)
  if c != None: print("{0} [{1}]".format(c.group(2), len(c.group(1)) - 1))

このプログラムでは、==国名====歴史==といった風に与えられているセクション名から構造を読み解き、構造の深さを数値化して出力します。

f:id:f_respectful12:20180405161602p:plain

ここで使用した正規表現は以下の通りです。

^(==+)\s(.?)\s*(==+)$

正規表現 意味
^ 行のはじまり
(==+) "=="と1回以上一致する"="だけで構成される文字
\s* 任意の0文字以上の空白文字
(.*?) 任意の0文字以上の文字
\s* 任意の0文字以上の空白文字
(==+) "=="と1回以上一致する"="だけで構成される文字
$ 行のおわり

2番目のfor文では、上記の正規表現と一致するときセクション名と構造の深さを出力します。group(1)の長さから1引いたものを、構造の深さと考えました。

実行結果

国名 [1]
歴史 [1]
地理 [1]
気候 [2]
政治 [1]
外交と軍事 [1]
地方行政区分 [1]
(中略)
関連項目 [1]
外部リンク [1]

24. ファイル参照の抽出

記事から参照されているメディアファイルをすべて抜き出せ.

ソースコード

import json
import re

with open("jawiki-country.json", "r") as f:
  for i in f:
    a = json.loads(i) 
    if a.get("title") == "イギリス":
      b = a.get("text").split("\n")

regex = re.compile("(File|ファイル):(.*?)\|")

for j in b:
  c = regex.search(j)
  if c != None:
    print(c.group(2))

記事から参照されているメディアファイルは、

|国章画像 = [[ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章]]

[[File:Battle of Waterloo 1815.PNG|thumb|left|[[ワーテルローの戦い]]での勝利により[[ナポレオン戦争]]は終止符が打たれ、[[パクス・ブリタニカ]]の時代が到来した。]]

のように、ファイル:もしくはFile:| で囲まれた範囲に記されていることが分かります。これから考えられる正規表現は、

(File|ファイル):(.*?)|

正規表現 意味
(File ファイル) |"ファイル"もしくは"File"と一致
: 全て一致
(.*?) 任意の0文字以上の文字
| 全て一致

です。

実行結果

Royal Coat of Arms of the United Kingdom.svg
Battle of Waterloo 1815.PNG
The British Empire.png
Uk topo en.jpg
BenNevis2005.jpg
Elizabeth II greets NASA GSFC employees, May 8, 2007 edit.jpg
(中略)
London Tower (1).JPG
Wembley Stadium, illuminated.jpg

エントリーシートに時間を取られてたら、いつの間にか高専5年生になっていました。添削して下さった方々、本当にありがとうございます。 学生最後の1年間、インプットもアウトプットも楽しみまくるぞー!

面白法人カヤックさんとブレスト面談をさせて頂いた記録

3月5日から3月9日までの1週間、面白法人カヤック さんのところへ技術部インターンに行ってきました。場所は鎌倉にある本社ではなく、私の地元神戸の上位互換とも言われる横浜にある綺麗なオフィスです。オルタナティ部 というデバイス制作寄りの部署に配属されたため、インターン期間中はArduinoを主に触っていました。

今回のインターンに関して書きたい事は山程ありますが、その中でも1番感動&興奮した ブレスト面談 について、記録を残しておきたいと思います。

※まだ文章を書く練習をしている最中なので、もしかしたら文章の途中に変な表現や良くない表現が混じっているかもしれません。その時はご連絡頂けると凄く嬉しいです。どうぞよろしくお願いします。

そもそも私について

現在は、兵庫県の瀬戸内海が見える 明石高専 というところの 電気情報工学科 で勉強しています。2014年から2016年まで NHK高専ロボコン に参加していました。高専に入るまでは ゲームを作るプログラマーを漠然と目指していましたが、ロボコンも含めた高専での経験を経て、現在は開発チームのディレクターを最終目標に就職活動をしています。

実はちょうど1年前に企画部として、カヤックさんの所へインターンに行ったことがあります。その時凄く面白かった経験があって、今後のキャリアを考えつつ、技術部として再びインターンに参加するに至りました。

面白法人カヤックさんについて

つくる人を増やす」を経営理念に、面白いこと(を主軸に色んなこと)をされている会社です。雑な説明になってしまいましたが、HPをご覧頂くと、雰囲気が掴めるような気がします。インターンでお世話になった方も含めて、カヤックさんのもとで働く方々は、凄く親切で凄く楽しそうでした。しかも、何かしらでアウトプットを残している方ばかりです。

カヤックさんの Vision の1つに、「始まりも終わりもブレスト」と言うものがあって、ほとんど1日中社内の各所でブレストが行われていました。 私が今回この記事で書きたい ブレスト面談 も、恐らくここに関連するところです。

ブレスト面談の記録

ブレスト面談とは、就活生や内定者と実際にカヤックで働く方々が、進路や配属の希望などを ブレインストーミング を通して 解決方法を導いたり明らかにする面談のことだそうです。

インターン最終日に私のこれからのキャリアプランを相談させて頂いたところ、私の担当をして下さった方がブレストが得意な方を呼んで、場をセッティングしてくださいました。

私の現在のキャリアプランは、もの凄くざっくり言うと下の図のような感じです。最終目標である "凄いディレクター" は、世界的に愛されるコンテンツやプロダクトを作るチームをディレクションすることを1つの目安にしています。

f:id:f_respectful12:20180310055013p:plain

そこでカヤックの方々は私をクライアントと想定し、現在の私が最終目標を達成するための方法について、ブレストをすることで沢山のアイデアを提案してくださいました。

f:id:f_respectful12:20180310065244p:plain

1時間程のブレスト面談を終えた結果はこのような感じです。

f:id:f_respectful12:20180310201332j:plain

ブレストの内容をまとめると…

目標までの最短ルート上にある企業に入社する方法は3つある

  • 新卒採用
    • 希望の職種に就くまでに時間がかかる可能性が高い
    • 倍率が高い
  • 中途採用 or MBO
    • 今までしてきたことを生かした働き方ができる可能性が高い
    • さらにMBOなら理想的

MBO ( = 企業に買収されること ) される為には、どこかで目に止まる ( = バズる? )ことが必要で、その為に今から面白いアイデアや新しい遊びを考えて公開してみるのがいいんじゃないか

例えば…

  • YouTubeに作ったものを投稿する
  • 自分で作ったものを自分で実況する( 自作自演 )
  • Twitterで1日1ゲーム

コンスタントに遊びやアイデアを出せるようになる為には練習が必要

せっかくなら今まで経験してきたロボコンや制御的な要素を加えられるとなおいい


そもそも新しい遊びを考える手法も大きく3つある

  • ゴールのイメージを先行して決める
  • 突然ひらめく
  • 今あるものを組み合わせる
    • この方法が1番の主流
    • 面白いもの × みんなが知っているもの

他にも、元のアイデアから切り出したり、色んな人向けに拡張したりすることで、全く別の遊びと見なせることもある。

面白さを分析する為に今あるルールをまとめてみるのも効果的

例えば…世の中の遊びは大きく4つの要素に分けられる

  • 競争 : かけっこ, ランキング
  • 運試し : じゃんけん, ガチャ
  • めまい : ブランコ, ジェットコースター
  • 真似事 : ままごと

これらの要素をバランスよく組み合わされている

ブレスト面談を終えて

正直に言うとここまで話が広がって、ここまで沢山のアイデアを頂けるとは思っていませんでした。私もロボコンのアイデア会議だったり、Co+work の授業でアイデアを出すことは何度かあったのですが、日常生活の一部にも活用したのは初めてです。今までの私はとりあえず前進する事ばかり考えていて、1度立ち止まって方針を考えてみるだけで、思考がクリアになることも衝撃でした。

反省点を挙げるとするなら、ブレスト面談の記録をもっとしっかりとっておけば良かったなぁというところと、ブレストの技術がまだまだ足りなかったなぁというところです。ただブレストの技術に関しては、カヤックで働く方々は、日常の会話でもお仕事でも沢山ブレストをされていて、環境や経験値によっても変わってくるものがあるんじゃないかと思いました。凄かった。

いつもの癖で気持ちだけで喋ってしまう場面も沢山あったのですが、優しくフォローしてくださった方々、本当に有難うございました。

今後の作戦

高専で専門的なことを勉強してきましたが、私の最終目標はエンジニアではなくディレクターです。ただ、エンジニアとしての経験も私がディレクターを目指す上では必要だと思っているので、残り1年の高専生活は、今の研究内容以外のエンジニア的スキルを身につけつつ、アイデアを出す練習や面白さを見つける練習をするのが最善手なんじゃないかと思いました。具体的には、

  • エンジニアになる作戦
    • まずはサーバーサイド関連のインターン or 勉強会に参加する
    • 出来る人におすすめの技術書を聞いて読む
    • 月1くらいでアウトプットをする
  • ディレクターになる作戦
    • 今流行ってるものや面白いものについて考えてみる
    • イデアをメモにストックしておく(している人が多い)
    • 色んな人と話す&遊ぶ

というような感じです。今まで私がしてきたことに後悔がある訳ではありませんが、就職活動を始めてから社会人の方とお話することが増えて、"もう少し上手くやってれば…" とか、"あの人みたいな選択をしていたら…" とか、思うことが凄く多くあります。でもまだ19才なので! もっと大人になってから後悔しないように、今から出来ることを増やしていきます。


以上が面白法人カヤックさんとブレスト面談をさせていただいた記録です。ちゃんと書けたかな… ブレスト面談は勿論、インターン中にお世話になった皆さん、話を聞かせて下さった皆さん、本当にありがとうございました。いつか私も同じ目線で話せるようになればいいなぁ~

もしこの記事をご覧になった優しい方がいらっしゃれば、ぜひご指摘やアドバイスをお待ちしています! おすすめの本やインターンの情報もあれば、そっと教えて頂けると凄く嬉しいです! どうぞよろしくお願いします。

言語処理100本ノック【第2章 後編】

課題研究で言語処理100本ノック 2015に取り組んでいます。前回の続きです。使用言語はPython3です。今回は第2章後半の5つを説明します。

15. 末尾のN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.

ソースコード

import sys

args = sys.argv

f = open("hightemp.txt", "r")
lines = f.readlines()

for i in range(len(lines) - int(args[1]), len(lines)):
  print(lines[i], end = "")

f.close()

前回説明した、14. 先頭からN行を出力 と全体的な構成がほとんど同じです。このプログラムでは末尾のN行を出力するので、range()内の値を工夫しました。range()は指定して引数に従ってリストオブジェクトを返す関数です。range()の第一引数に、テキストファイルの全体の行数 - 自然数Nを指定することで、末尾のN行の先頭の行番号から末尾までの行を出力します。

UNIXコマンド

tail -n N hightemp.txt

tailはテキストファイルの先頭のN行またはNバイトを抜き出すコマンドです。-nオプションを指定すると、指定したテキストファイルの先頭からN行を抜き出します。(headと同じ使い方!)

実行結果

N = 3 の時

山梨県    大月  39.9    1990-07-19
山形県   鶴岡  39.9    1978-08-03
愛知県   名古屋   39.9    1942-08-02

16. ファイルをN分割する

自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

ソースコード

import sys

args = sys.argv

f = open("hightemp.txt", "r")
lines = f.readlines()

n = 0

for i in range(int(args[1])):
  a = open("16out/out" + str(i) + ".txt", "w")
  for j in range((len(lines) + i) // int(args[1])):
    a.write(lines[n])
    n += 1
  a.close()

f.close()

この問題は、少しあやふやなところがあって、研究室内でもちょっとした議論になりました。議論の詳細はもうちょっと後に書きます。まずはプログラムの説明からです。

このプログラム上ではA行のテキストをN個のファイルにA / N 行ずつ均等に分けます。例えば、5行のテキストを3個のファイルに分けると下の図の様になります。

f:id:f_respectful12:20180304233612p:plain

この例で考えると、この問題のポイントは分けたあとのファイルが2行だったり1行だったりすることです。そこで分けた後の何番目のファイルに何行が対応するかを計算式で与えていきます。初めのfor分で何番目のファイルかを i に記録し、2つ目のfor文で ( ( 元のファイルの行数 len(lines) + 分けたあとのファイルの順番 i ) // 分けたあとのファイルの数 N ) を計算して、何行が対応するかを求めました。ここで//演算子は、切り捨て除算を表します。

実行結果

N = 7の場合(out0.txtからout6.txtまで生成される)

out0.txt

高知県    江川崎   41  2013-08-12
埼玉県   熊谷  40.9    2007-08-16
岐阜県   多治見   40.9    2007-08-16
山形県   山形  40.8    1933-07-25

前述の通り、この問題には少しあやふやなところがあります。問題の解説文を確認すると、

自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

とあります。N分割というのは一般的に全体をN個に分けることを言うのでは無いかと思っていました。しかし、この問題で言及されているsplitは、全体をN個ずつ分けるコマンドです。どっちが問題の本質なのか…もっと凄いやり方があるのか… よければ是非、ご指摘&ご意見頂けると嬉しいです。

17. 1列目の文字列の異なり

1列目の文字列の種類(異なる文字列の集合)を求めよ.確認にはsort, uniqコマンドを用いよ.

ソースコード

f = open("hightemp.txt", "r")
lines = f.readlines()

a = set([])

for i in range(len(lines)):
  line = lines[i].split("\t")
  a.add(line[0])

print(a)

f.close()

問題で与えられたファイルhightemp.txtの1列目は、都道府県の名前です。2列目は重複しない都市の名前ですが、1列目は重複する場合があります。この問題では、その重複を考えず、1列目で得られる都道府県の種類を答えます。

はじめに、空のリストをset()でセットに変換します。セットは集合を表すデータ型なので、重複した値を持ちません。この性質を利用して、split("\t")で分割した行の1列目をadd()メソッドでセットに全て追加しました。

UNIXコマンド

cat hightemp.txt | awk '{print $1}' | sort | uniq

|(パイプ)は複数のコマンドを組み合わせる為に用いられます。|の左側の処理の出力を右側の処理に渡すのが主な働きです。ここでは、|を使ってcat awk sort uniq の4つのコマンドを組み合わせています。4つのコマンドそれぞれの働きは、下の表で説明します。

コマンド名 コマンドの働き
cat 指定したファイルを全て出力する
awk テキストのパターン処理を行う('{print $1}' は1列目を抜き出す)
sort 行ごとに辞書順に並び替える
uniq 連続して重複した行を1つにまとめる

実行結果

{'愛知県', '山梨県', '群馬県', '静岡県', '岐阜県', '和歌山県', '大阪府', '千葉県', '愛媛県', '高知県', '埼玉県', '山形県'}

18. 各行を3コラム目の数値の降順にソート

各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).

ソースコード

import sys

args = sys.argv

f = open("hightemp.txt", "r")
lines = f.readlines()

a = {}

for i in range(len(lines)):
  line = lines[i].split("\t")
  a[lines[i]] = line[2]

b = sorted(a.items(), key=lambda x: x[1])

for i in reversed(b):
  print(i[0], end = "")

f.close()

このプログラムでは各行の内容とその行の3カラム目の内容を辞書で対応させて、3カラム目の内容でソートしました。辞書のソートにはsorted()関数とlambda記法を用いました。 sorted( 辞書名.items(), key = lambda x: x[1]) とすることで、[ ( 辞書のキー1, 辞書の値1 ), ( 辞書のキー2, 辞書の値2 ) ... ] といった、タプルのリストが返ってきます。 またreversed()はリストの順番を反転させる関数で、これによって降順のソートに並び替えられます。

UNIXコマンド




ごめんなさい。まだ出来てません。しばしお待ちください。

実行結果

高知県    江川崎   41  2013-08-12
岐阜県   多治見   40.9    2007-08-16
埼玉県   熊谷  40.9    2007-08-16
(中略)
埼玉県   鳩山  39.9    1997-07-05
千葉県   茂原  39.9    2013-08-11

20. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる

各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.

ソースコード

import sys

args = sys.argv

f = open("hightemp.txt", "r")
lines = f.readlines()

a = {}

for i in range(len(lines)):
  line = lines[i].split("\t")
  a[line[0]] = a.get(line[0], 0) + 1

b = sorted(a.items(), key=lambda x: x[1])

for i in reversed(b):
  print(i)

f.close()

get()は辞書からキーを指定して値を取り出すメソッドです。get()メソッドの特徴はキーが登録されていない時にデフォルト値を返すという点で、デフォルト値はget()メソッドの第2引数に指定します。このプログラムでは、辞書に都道府県名と出現頻度を対応させました。都道府県名 (キー) に対応する出現頻度 () が無ければ0を返し、1ずつ足すことで、都道府県ごとの出現頻度を保持します。

UNIXコード

cut -f1 hightemp.txt | sort | uniq -c | sort --reverse

実行結果

('群馬県', 3)
('山梨県', 3)
('山形県', 3)
(中略)
('和歌山県', 1)
('高知県', 1)

実は今、横浜へインターンに来ています。自然言語処理は全く関係のない業界の会社です笑 でも、どんなことでも、面白いことが出来るのは凄く幸せだと思ってます。まだまだ頑張るぞー!

言語処理100本ノック【第2章 前編】

課題研究で言語処理100本ノック 2015に取り組んでいます。前回の続きです。使用言語はPython3です。今回からは第2章 UNIXコマンドの基礎 です。まずは第2章前半の5つを説明します。

第2章の概要

hightemp.txtは,日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである.以下の処理を行うプログラムを作成し,hightemp.txtを入力ファイルとして実行せよ.さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ

10. 行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ.

ソースコード

f = open("hightemp.txt", "r")
print(len(f.readlines()))
f.close()

open()はファイルオブジェクトを取得する関数です。第1引数には対象のファイル名、第2引数にはオブジェクトを取得する際のモードを指定します。このプログラムではファイルを読み込ん(read)で操作するので、 r モードを指定しました。実はopen()関数の第2引数はデフォルトで r を指定するので、ファイルを読み込みたい時は、モードを省略することもできます。

readlines()open()関数のメソッドで、読み込んだファイルをリストにして返します。リストの要素はファイルの各行です。例えば、

みかんは美味しい
りんごも美味しい
いちごも美味しい

というテキストファイルに対して、readlines()メソッドを用いると ["みかんは美味しい", "りんごも美味しい", "いちごも美味しい"] というリストが返ってきます。このリストの長さを数えることで行数をカウントしました。

取得した(開いた)ファイルオブジェクトは、close()メソッドで閉じ、メモリを解放します。(C言語と一緒)

UNIXコマンド

wc -l hightemp.txt

wcはファイルのバイト数、行数、文字数または単語数をカウントするコマンドです。-lをオプションに指定すると、ファイルの行数を数えることが出来ます。

実行結果

24

11. タブをスペースに置換

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

ソースコード

f = open("hightemp.txt", "r")
print(f.read().replace("\t", " "), end="")
f.close()

read()open()関数のメソッドで、読み込んだファイルの全てのデータを文字列型で読み込みます。replace()は文字列を置換する関数で、第1引数に指定した文字を第2引数に指定した文字に置き換えます。

read()メソッドで読み込んだデータをそのまま出力すると、print()関数の都合上末尾に 改行コードが付与されてしまいます。ここでは、endオプションを用いて末尾で改行されないようにしました。endオプションは指定した文字列を出力の末尾に付与します。(デフォルトは \n

UNIXコマンド

expand -t 1 hightemp.txt

私はUNIXコマンドにはexpandを使いました。expandはタブをスペースに変換するコマンドです。-tオプションでタブ幅( = スペースに変換すると何文字分の幅を取っているか)を指定しています。

実行結果

高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
(中略)
山形県 鶴岡 39.9 1978-08-03
愛知県 名古屋 39.9 1942-08-02

12. 1列目をcol1.txtに,2列目をcol2.txtに保存

ソースコード

f = open("hightemp.txt", "r")
a = open("col1.txt", "w")
b = open("col2.txt", "w")

lines = f.readlines()

for line in lines:
  datas = line.split()
  a.writelines(datas[0] + "\n")
  b.writelines(datas[1] + "\n")

f.close()
a.close()
b.close()

結果を出力するファイルである col1.txt と col2.txt は、w モードで取得します。wモードを用いると、取得したファイルオブジェクトに対して書き込み(write)を行えます。ファイルの行ごとのデータを持つ lines リストに対してfor文を実行し、得た文字列 line に対して列のデータを取得しました。列は縦向きに並んでいるデータです。

writelines()open()関数のメソッドで、ファイルオブジェクトに対して1行ずつ書き込みを行います。print()関数と違ってデフォルトで末尾に改行コードが付与されないので、改行する場合は別に \n を追記する必要があります。

UNIXコマンド

cut -f 1 hightemp.txt > col1.txt #1列目について
cut -f 2 hightemp.txt > col2.txt #2列目について

cutは文字列から所定の位置にある文字列を抜き出すコマンドです。-fオプションを用いると、指定した順番のフィールドだけを切り出す事ができます。フィールドとは特定の区切り文字列で区切られた文字列のことです。例えば、

りんご みかん いちご

という文字列に対して、"りんご"、”みかん"、”いちご” といったフィールドが順番に得られます。cutコマンドで得た出力を > を用いて別のファイルに保存しました。

実行結果

col1.txt

高知県
埼玉県
岐阜県
(中略)
山形県
愛知県

col2.txt

江川崎
熊谷
多治見
(中略)
鶴岡
名古屋

13. col1.txtとcol2.txtをマージ

12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.

ソースコード

a = open("col1.txt", "r")
b = open("col2.txt", "r")
f = open("col.txt", "w")

col1 = a.readlines()
col2 = b.readlines()

for data1, data2 in zip(col1, col2):
  f.writelines(data1.replace("\n", "") + "\t" + data2);

a.close()
b.close()
f.close()

col1.txt と col2.txt の結果をそれぞれ行ごとのリストで取得します。zip()は、複数のシーケンス型オブジェクトをまとめてループさせる為の関数です。このプログラムでは、2つのリストに対して先頭から同じ順番に要素を得ています。col1 から得られるデータには、不要な \n がついているので、replace()を使って除去しました。

UNIXコマンド

paste col1.txt col2.txt > col.txt

pasteは複数のファイルを行単位で連結するコマンドです。-dオプションを指定しない場合、タブ文字で連結されます。

実行結果

高知県    江川崎
埼玉県   熊谷
岐阜県   多治見
(中略)
山形県   鶴岡
愛知県   名古屋

14. 先頭からN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.

ソースコード

import sys

args = sys.argv

f = open("hightemp.txt", "r")
lines = f.readlines()

for i in range(int(args[1])):
  print(lines[i], end = "")

f.close()

コマンドライン引数をプログラムで使用するために、sysモジュールをインポートしました。sys.argvコマンドライン引数をリストで返す関数で、args[0]では実行したプログラム名が得られます。例えば、

python 13.py 3

といった風にプログラムを実行すると、args[0] = "13.py"args[1] = "3" が取得できます。このプログラムでは args[1]自然数N(ただし文字列型)が得られることが分かっているので、int()関数で int型に変換して、N個分の行を出力しました。

UNIXコマンド

head -n N hightemp.txt

headはテキストファイルの先頭のN行またはNバイトを抜き出すコマンドです。-nオプションを指定すると、指定したテキストファイルの先頭からN行を抜き出します。

実行結果

N = 3 の時

高知県    江川崎   41  2013-08-12
埼玉県   熊谷  40.9    2007-08-16
岐阜県   多治見   40.9    2007-08-16

実はこの記事は1度途中まで書いていたのですが、途中でWifiが切れてデータが吹っ飛んでしまったので、泣く泣く最初から書き直しました。こまめに保存しとくのってめっちゃ大事や…