sifue's blog

プログラマな二児の父の日常

ネットのスモールコミュニティの育て方

今までネットのスモールコミュニティを運営してきた自分が、ネットのコミュニティ(ネトゲのギルド、自作OSSのユーザーコミュニティ、同好会、IRC、Slack、Discordなど)を運営する中で重要なことをまとめたいと思います。

まずネットのコミュニティのリーダーとなり、モデレーターをしていくことは非常に大変な事です。得られるのは自身が楽しめるコミュニティと、たまに得られる(得られないこともある)労いの言葉と、コミュニティ運営経験です。ですが、このどれもかけがえのないものだと思います。基本的にテキストベースのコミュニティを運営するものと仮定します。

特に若い世代には、人生経験にもなるので自分のコミュニティづくりのために励んでもらえればと思います。もし炎上や荒らしにあってコミュニティが崩壊して荒野になっても、それが良い経験になるとポジティブに捉えましょう。

まず最初にリーダーに一番求められるのは

  • 日々の声掛け
  • 信頼できる自身の情報の開示

です。日々の声掛けを具体的に言えば、

  • 日々のゲームやイベントのお誘い
  • 日々の話題振り
  • 発言者へのポジティブなレスポンス
  • 挨拶
  • 新人の歓迎

です。これをやっているだけで十分なコミュニティリーダーと言えます。もちろんコミュニティが育たないうちはレスポンスが得られないことも多いので、1ヶ月以上そういうことが続いてもめげない鋼の心がまずは必要なものと言えます。

次に信頼できる自身の情報の開示です。これはゲームコミュニティなのかOSSコミュニティなのかにもより程度が異なりますが、自分から相手を信頼して情報開示していかないとなかなか信頼関係を構築することは難しいです。

  • 所属
  • 年齢
  • 住んでる地方
  • 性別
  • どんな経験をしてきた人か
  • どんな趣向を持ってる人か
  • 身の上話

これらは個人情報ではありますが、コミュニティごとの開示の程度を意識して公開したり、もしくは信頼できる人には伝えると信頼関係を構築しやすいです。OSSのコミュニティによっては

  • 顔写真
  • 実名
  • 所属

こんなこともわかっていると信頼関係を築きやすかったりします。有名なエンジニアで信頼を集めている方はこれらを全部公開している方が多いです。

そしてコミュニティが育ってきたら気をつけないといけないことが2つあります。

  • 人を攻撃する人を排除する
  • 不正ツール利用や犯罪などモラルに反することをする人を排除する

この2つです。これはしないとコミュニティが炎上で一瞬でコミュニティが崩壊します。少しでも怪しいと思ったら迅速な対処が必要です。

もしBANがしづらいという状態の時は、プライベートな別なコミュニティをさっさと立ち上げて、信頼の置ける人だけを呼んでお引っ越しをしましょう。そうするとみんな幸せになります。

特に人を攻撃し始めて熱くなってる人は絶対相手にしてはいけません。「相手にしない」これがお互いが幸せになる最善の方法と言えます。あと犯罪傾向が高い人もそうで、彼らは悪い事とは思わず不正ツール利用や違法ダウンロード等を行っているため、それを議論するのはなかなか難しいです。そういう人たちは、厳しく排除するか、そこに所属しつつ信頼できる人だけで主拠点をすぐに別なコミュニティに移動するというのが重要です。

あと、最後にコミュニティを常連化させず長持ちさせたい場合には

  • 特権や階級を厳しく作らない

というのも重要です。これがあると古参がコミュニティで強くなり、新しい人が入りづらくなります。反面、現状のメンバーでの結束が強まるので使い所は考えると良いと思います。

コミュニティを開始する際には、まずは信頼できる人数人ではじめるのが良いです。その方が信頼関係の輪を広げていきましょう。

以上が、ネットのスモールコミュニティを育てるための方法でした。ぜひ自分のネットのコミュニティを育てていってください。

初めて東京のウィークリーマンションで一人暮らしする人に教えること

はじめて地方から出てきて東京のウィークリーマンションで一人暮らしをはじめる人向けに、位置確認しなくてはならないもの、買わなくてはいけないもの、知らなくてはいけないことをまとめました。

位置確認

  • 100円ショップ
  • 最寄駅
  • スーパー
  • コンビニ
  • 薬局
  • 病院 (保険証があれば)
  • 郵便局
  • 警察署
  • ATM
  • 安い外食店 (牛丼屋チェーン、サイゼリヤなど安定)

なければ買うもの

  • 水道水がダメなら水
  • コップ
  • シリアル皿 (シリアル好きなら)
  • ラーメン鍋
  • 箸、スプーン、フォーク
  • 食器洗い洗剤
  • 食器洗いスポンジ
  • 毛布
  • トイレットペーパー
  • ティッシュ
  • 袋麺 (予備)
  • 冷凍食品 (予備)
  • 髭剃り
  • シェービングクリーム (必要なら)
  • 洗面用具 (なければ)
  • シャンプー
  • 石鹸
  • タオル、または、ボディタオル
  • バスタオル
  • 洗濯洗剤
  • 洗濯干し紐
  • 雑巾またはフロアワイパー
  • ゴミ袋
  • 延長コード (必要であれば)

説明

  • 規則正しい生活の送り方、睡眠重要
  • 最低限の身だしなみ (服装、髪、髭、口臭、体臭)、上司を通じてメンバーから苦情の前に
  • 最低限の礼儀の実践 (挨拶、笑顔、感謝、謝罪)、上司を通じてメンバーから苦情の前に
  • 洗濯の仕方、洗濯機の回し方
  • 掃除の仕方、都会のホコリの溜まり方はひどい
  • 電子レンジの使い方
  • T-fal(ティファール)の使い方
  • 浴室乾燥機の使い方、風呂出たら回さないとカビがすぐ生える
  • 冷蔵庫の使い方
  • ごみの捨て方、集積所の場所の確認
  • おとなりさんとの付き合い方、喧嘩しない
  • 食費の節約方法 (レトルト、冷凍食品の活用)
  • 湿気や結露に対して、換気や日差しの利用
  • 地下鉄の乗り方 (リュックで怒られることも)
  • タクシーの乗り方、タクシー乗り場が安定
  • 地方と違って公共交通機関でものを食べない
  • エスカレーターは左側に立つ
  • 貴重品の管理の仕方、基本常に携帯
  • いざという時のお金は別にする
  • セールスの断り方、とにかく無視
  • オススメの東京観光、皇居、秋葉原、渋谷、原宿、代々木公園、新宿都庁、お台場、東大、浅草
  • 750円のJR都区内パスについて
  • 病気になった時にどうするか、とにかく睡眠と栄養をとるのが重要
  • カフェインとアルコールとの付き合い方、栄養ドリンク飲み過ぎで急性カフェイン中毒注意、飲まされそうでも断る
  • 日頃の運動不足解消の仕方、一駅歩く、近所散策
  • サプリや野菜ジュースによるビタミン摂取、ビタミン取らないと風邪ひきやすくなる
  • 眠れない時でも目をつぶり横になって休む事が重要、熟睡しなくても良い
  • コーヒーショップの使い方、都内は座って休むところない、本日のコーヒーがオススメ
  • 漫画喫茶、ネットカフェの使い方、都内は座って充電できるところがない、要身分証明書
  • 東京の地域ごとの外食の相場、500円から5000円まで、高い所に要注意
  • 東京の有名な本屋、東京丸善、新宿紀伊国屋、神保町三省堂秋葉原書泉タワー
  • 1ヶ月の食費計算
  • 生活費と自由に使えるお金の計画の立て方
  • コンビニ(冷凍食品だけ例外)、外食は高くつく事について
  • 郵送の仕方 (受け取り、集荷)
  • Amazonの使い方
  • 出前館の使い方
  • 女、お金のトラブルの対処法、異性と付き合うとお金と時間がコストとして結構かかる、好きにできるお金と時間が増えた大学生からがオススメ、お金は親族を頼る
  • 変な人に絡まれた時の対処法、無言で逃げる
  • 街頭配布物やアンケートのお願いやキャッチは絶対ガン無視、宗教勧誘に気をつける
  • 東京の危ないエリア (歌舞伎町、池袋、六本木、渋谷道玄坂)、マジで怖い人たちがいる
  • 交通事故にあった時にすること、絶対最初に110番
  • 事件に巻き込まれた時にすること、絶対最初に110番
  • 地震の時にすること、会社や学校の指示、地方自治体の指示に従う
  • 大雪の時にすること、絶対に走らない、スマホ持って転ぶと骨折する
  • 交流が欲しい時には、お世話になっている会社や学校の人づてが安心
  • 秋葉原のオススメスポット、ラジオ会館、アキヨド、千石秋月、ツクモ
  • 東京でオフ会に参加する時気をつけること、ネットだけの知り合いと会うのは成人してからがオススメ、おかしい人、ヤバい人もいる、飲み物残して席を立たない(液体睡眠薬に気を付ける)

プログラミング初学者におすすめしたい日々の情報収集

特にWebプログラミングの世界では、一年間で技術トレンドが変わったり、セキュリティの新しい考え方が出てきたりと常に新しい情報を取り入れなければいけなかったりします。

そんな中、どの情報を取得するのがおすすめかというのを6個だけランキング形式で紹介していこうと思います。

1位 はてなブックマーク - テクノロジー

とりあえずこれです。これさえ見ておけばとりあえず流行りのITニュースはなんとかキャッチアップできるかなと思います。なおRSSリーダーを利用している方は、

を登録しておけばよいでしょう。また普段から非テクノロジーのニュースも集めたいという方は、ホットエントリーや新着エントリーも追いかけても良いと思います。ただ新着エントリーは見るコストがとても高いです。 なお自分はFeedlyRSSリーダーとして利用しています。更にiOSではReaderというアプリを連携させていて便利に使えます。

2 位 Twitter

自分が気になる技術領域の有名エンジニアを、海外の方含めてフォローしておきましょう。プログラマは、ツイ廃(ツイッター廃人)の方が多いので、セキュリティに関するニュースやイベントに関しても重要な情報が得られる場合が多いです。Twitterサブアカウント運用している方は学習アカウントを作るのも良いと思います。またリストを作って運用するのも良いです。

自分はこのように気になるエンジニアはリストにしています。

ある程度自分の技術領域が固まったエンジニアの方は、常にその単語で検索して交流するというのは常識なように思います。昔は「Scala」を発言すると常にいろんな人にアドバイスがもらえるというメリットがありました。よりニッチな技術領域を学習している方こそ、このTwitterは役に立つかなと思います。自分と同じ技術を学ぶ人を見つけるためにも、どんどん発言していくと良いでしょう。

3位 GitHub

普段開発に使っているGitHubも良いニュースソースになります。とにかく自分が使っているWebフレームワークぐらいはWatchしておくとよいです。 あと利用しているプロダクトでバージョンアップを監視したいようなツールやDBなどは、タグのRSSRSSリーダーや普段使いのSlackなどに通知しておくとなお良いです。ちなみにPlay Frameworkだと、

がニュースを取得できるRSSフィードのURLとなっています。 リポジトリのURLの最期にtags.atomを付ければ取得できるようになっています。 あと暇があるときは気になるプロダクトのソースコードを。iPhoneiPadなどのタッチデバイスで眺めるのも非常に学びがあります。普段からコードを読む習慣をつけておけば、やはり書く時にも非常に役に立つことが多いです。

4位 Qiita

これまた自分が気になる技術領域の有名エンジニアのフォローや自分がかかわる技術のタグのフォローをしておくとよいです。ページにアクセスするだけである程度の新しい情報が入ってくるようになります。

自分のフォロー中のタグはこのような感じになっています。最近は初心者の手習い記事が増えてしまって残念なのですが、それでもたまにすごく良い記事があったりします。フォロワーさんのいいねは、比較的良い記事のことが多いように思います。

5位 Slack/IRCなどのチャットサービス

自分の会社のSlack/IRCなど、自分が加わっているコミュニティのチャットサービスも重要なニュースソースになります。自分が気になる技術領域のチャンネルがあれば加わり、なければ作って人を集めて盛り上がりましょう。 自分の関わるニュースについてそれを投稿して、それらについて議論してそのニュースの意味について理解を深めるということは非常に重要なことだったりします。

6位 お気に入りの技術ブログ

お気に入りの技術ブログを見つけたら、それをRSSリーダーなどに登録しておきましょう。ほとんどの場合、はてなブックマークなどで上がってくる場合が多いですが、ニッチなニュースだとこちらにしか引っかからない場合があります。 特に自分が関わっている技術を利用している会社の技術ブログは非常に学びになることが多いので、見ておくことをおすすめしたいです。これもまたSlackで普段見ているチャンネルにRSSフィードを登録しておくとよいです。

なお自分が毎回良いなぁと思っているのはクラスメソッドさんの技術ブログです。

おわりに

以上がプログラミング初学者にお勧めしたい日々の情報収集です。

勿論ニュースでわからないことがあったら、その際に調べて学ぶのが良いと思います。無論プログラマはコードを書かないとコードを書けるようにはならないのですが、このような日々の情報収取も非常に重要かなと思います。

なお紹介はしませんでしたが、ある程度ニッチな技術領域を深めている方はさらにStackOverFlowの英語版の

にて、自分が興味のある技術領域を常に監視している方が多いように思います。

では楽しいプログラミングライフを!

ゆるい競プロ、ABC073の感想

N高等学校のコンピューター部がパソコン甲子園で頑張っているのに触発されて久しぶりに、AtCoder Beginner Contest 073 にチャレンジ。

AtCoder Beginner Contest 073 - AtCoder Beginner Contest 073 | AtCoder

結論から言うと、A, B, C はすぐ終わったもののDがハマって解けなかった。 解法的にはあってたっぽい。

Aは、除算と剰余ができればOK。

Bは、for文で回して足し合わせができればOK。

Cは、setに突っ込んだり、消したりして最後に数を数えればOK。

そして最後のDだけを考える。

最短経路問題なので、ダイクストラかワーシャルフロイドで解けそうということがわかる。

方針として通らなきゃいけない町の集合Rの順列を作っても8!で計算できそうだったので 全ての町間の最短距離を計算すればええやんという話に。

で、結局解けずw

解法的にはあってたっぽいけれどハマったところ

  1. 町は0からはじまりじゃなく1からははじまりなのにfor文ミスる
    • これはforマクロそろそろ用意した方が良いんじゃないかという気がした。
  2. INT_MAX + INT_MAX があってオーバーフローして負の数字が出てたサンプルが全部通ったけどこれに気づかずに1時間以上悩んだ
    • 解説を見て #define INF (1 << 29) とかを使った方が良いということを学んだ
  3. next_permutationはvectorをちゃんとソートしてないと使えない
    • ドキュメントちゃんと読んでなかった奴
    • これまた中途半端に通ったりしたのでハマった

最終的に解けたけどいろいろ学びのあるABCだった。というかまたAtCoder、テストケースの内容をぜひアップロードしてほしい…。間違いに気づくのが本当に大変でした。

ソースコードは、

sifue/cpp-study

N高の生徒たちもすごくがんばって学んでいるので、自分も競プロ初心者ながら、アリ本を少しずつ学んでAtCoderにもモリモリ参加していこうと思います。

生徒たちの間で競技プログラミングの面白さ伝えていきたいところ。大学になってから特に数学死ぬほど苦手だったけど、数学とも少しずつ仲良くなっていきたい。 少なくともABCぐらいだったらあんまり数学関係ないけど、ある程度行くと数学がどうしても必要になってくるということがわかってきた今日この頃。

ドリキャプ HDMIキャプチャーカード DC-HA1をWindows10で動かしてNintendo Switchの出力をキャプチャする

f:id:sifue:20170720094853p:plain

ずいぶん昔、6年以上前に買ったドリキャプ HDMIキャプチャーカード DC-HA1をWindows10で動かしてNintendo Switchの出力をキャプチャするためにやったことまとめます。最終的にスクリーンショットの通り、OBS Studioなんかで映像キャプチャデバイスとしてキャプチャできるようになりました。

ずいぶん古いHDMIキャプチャボードなのでまあ普通にドライバ見つかりませんが、中華サイトをひたすら百度で検索しながら回っていると互換品のHD70Aのドライバが見つかります。まずこれを探すのにめっちゃ苦労しました。いっぱいマルウェアやウイルス配布しているサイトがあるので気をつけながらなんとかゲット。あまりに大変だったのでGoogle Driveにドライバあげておきます。ダウンロードはこちらから。

hd70a_driver_v130_beta.rar - Google ドライブ

rar圧縮なので7zipなどのアプリで解凍してください。ちなみにWindows7のころに動いていた、もともとのCDに入っていたドライバもこちらに置いておきます。

Drecap_dc-hc1_drivers.zip - Google ドライブ

むろんこの古いドライバはWindows 10 64bitでは動きません。ただWindows7をまだお使いならばこれで十分でしょう。

やることは上のHD70Aのドライバをダウンロードして、x64\TLHD70A_10.infを右クリックしてインストール。あとはデバイスマネージャーから認識されてないデバイスを探して、Timeleak社のHD70Aを指定してインストール。そうするとこのようになります。

f:id:sifue:20170720095906p:plain

なお、残念ながらこれだけじゃ動かなくて、やはりメモリが4GB以上認識されているとダメだったようです。なので、Windows 10のメモリを4GBに設定します。なお自分は16GBのメモリを積んでいるマシンですが、キャプチャの時は4GBに直しています。

よくあるご質問|地デジチューナーやビデオキャプチャなどパソコン周辺機器の製造・販売ならエスケイネット

以上の手順で設定します。実はこのためにメモリが4GBしか載っていないWindows10を用意したのですが、それでもだめでこのmsconfigの設定をしてやる必要がありました。

あとはNintendo Switch側の設定です。1080pの出力ではなぜかおかしなキャプチャしかされないため(左上だけキャプチャされカクカクする)、設定 > テレビ出力 > 解像度を720pにしてやる必要がありました。どっちにしろ自分が配信するゲームはフルHDを要求するゲームではなかったためこれで満足しています。一応1080iにはドリキャプは対応しているはずなのですが、Nintendo Switchが1080pでしか出力できないという仕様であるためしかたがないようです。

これでOBS Studioの映像キャプチャデバイスでDC-HA1から映像を取って配信したり録画したりすることができます。アマレコTV 4系でも一応動作を確認できました。これを動かすのに一晩かかってしまった…。

これあとでわかったのですが、まずアマレコTV 4系で一度動作確認を行うと、OBS Studioでも映像キャプチャできるようになるようです。不思議です。

では、楽しい配信/録画ライフを!

競技プログラミングをゆる~くやりはじめた

もともと競技プログラミングや数学があまり得意な方ではなかったなんですが、N高等学校で競技プログラミングを教えるということもあるし、N高生には競技プログラミングがまじで得意な生徒さんやら、アドバイザーのドワンゴ社員もいるのでこれはチャンスと思い自分もゼロから競技プログラミングをはじめてみることにしました。

競技プログラミングといいつつ、かなりゆるくやっていこうと決意。たぶん、競技ゲーみたいに勝負と思ってやると心折れそうだったので、低い山から自分なりの目標を持ってやるということで、まずはAtCoder Beginner Contest(通称ABC)の001からはじめて見ることにしました。

開発環境整備

言語は、競技プログラミングプログラミング言語はほとんどの人がC++を利用しているということで、自分もC++ではじめることにしました。思えば、CとかJavaとかはそこそこ書いたりするのですが、C++をしっかり書き始めるのははじめてなので環境整備から。

最初CLionとかのIDEを使って書こうと思っていたのですが、ほとんどの参加者がエディタでやるということで、自分もUbuntuのg++とVimでやることにしました。

構成は、VirtualBoxVagrantをインストールして、そこにUbuntu16を入れ、そこでg++とVimをインストールして使っています。そのへんの構成の構築はQiitaにも書いたとおりです。

エディタは、VS Codeでもよかったのですが、生放送配信とかする時に VS Codeの画面がうまくキャプチャできなかったのでVimではじめたというのが理由です。なお.vimrcはこちら

VimC++の環境を整備して思ったのは、vim-clangというプラグインで利用できる、clang-formatが思いのほか便利ということ。このVimでもVS Codeと遜色なくコーディングすることができました。

あと、大会によってはエディタでないと困ることもあるようなので予めVimEmacsなどのコンソールエディタに慣れておくのは結構良さそうです。

というわけで実際にここまで説いた問題のメモをまとめていきます。 コード自体は、GitHubsifue/cpp-studyにまとめてあります。

ABC 001

まず、最初の001で結構な洗礼をうけましたw

A問題

これに関しては、C++の標準入力と標準出力の行い方の手習いという感じでした。特に難なく終了。

B問題

突然長いif文をかかなきゃいけなくなり苦戦。そもそもC++の標準出力のフォーマットの仕方がわからなかったのですが、 C++ の iostream フォーマット指定早見表 のおかげでなんとかなる。

C問題

巨大なswitch文とif文を書くことになり心が折れる。 0~31までの数を。"N"とかの文字列に変換するところなどでバグを埋め込んでしまい、その修正に結構時間をかけてしまうということをしました。 得られた教訓としては、できるだけデータ構造にぶっこんでswitchとかifとか長いの書かないほうがよいということです。最期は <<= にし忘れていたという凡ミスでした。

D問題

境界値が重要ということを思い知らされた問題。 60分と0分って同じなんですが、処理の過程でやりやすくするためにどちらかに統一しないとミソ。データのマージ自体はまあ職業プログラマなら約やっていると思うのでアルゴリズムに関しては特に何か気になることはありませんでした。 ただ、この問題もバグでひたすら苦しんでいました。 C++ の iostream フォーマット指定早見表 が神でした。

ABC 002

突然問題がストーリー形式になって、なぜか楽しみながらできるようになりました。 やはり面白い問題文のほうがやる気がでますw

A問題

if文がかければ大丈夫な問題でした。

B問題

とりあえず配列に文字を全部突っ込んでチェック。 この時に久しぶりに配列を使ってみて便利ー、と思っていたのがD問題で罠でした。

C問題

精度に気をつけなきゃいけない問題でしたが、なんとか正解。 ただ、intとdoubleの計算時の変換などは、ある程度CとJavaで知識があったから良かったものの、intをdoubleで四則演算するとdoubleになっちゃうなんていう情報は、プログラミング初心者は知らないだろうなぁと思いつつ。 多分このへんでC++の文法の本を読み始めたいとおもう問題に作ってるあるのだなぁと思いました。

D問題

ドハマリしました。 最初は議員の関係の表を作って、その一つの関係から探索して最大を探すような貪欲法的プログラみムを書いていたのですが、なぜかWrong Answer。ちゃんとだめなパターンが入っているようです。 で、結局最後は全パターンを調べるということで深さ優先探索で全パターンを作ってACとなりました。 まあ計算できる計算量なら最初から全探索したほうがよいということでしょうか。 あとここではじめて再帰が必要になったりして、だんだん競技プログラミングらしくなってきたなというふうに感じました。

あと最初2次元配列で実装したのですが、関数での引き渡しの際は参照渡ししても二次元配列の二次元目は固定長でなくてはならず、結局ポインタ操作になってしまう非常に面倒くさいことになったので、コンテナを使ったほうが良いということを学びました。

cpprefjp - C++日本語リファレンス

以上のサイトのAPIリファレンスが神でした。とりあえず存在するコンテナを一通り確認して、サイトの右上にあるカスタム検索でvector、set、map、pair、priority_queue、queue、stackなんかを探して使うことに。

なお、C++のデータ構造、代入し直した瞬間にコピーになるので、関数とかで&をつけて参照渡ししたいときだけは気をつける必要がありそう。とはいえ、参照渡ししないといけないほどシビアになることはまだなさそう。

ABC 003

だんだん難しくなりつつあることに怯えながらのチャレンジ。

A問題

合計して割るだけ。for文がかければなんとか。 なおintとdoubleの変換もあり。

B問題

過去の教訓から配列ではなく、setを使って排除。 コンテナの便利さを感じた瞬間でした。

C問題

priority_queueとstackを使って処理。とにかくC++のコンテナが偉大。 ただ最後は精度の問題があってハマったので、long doubleという型を初めて使いました。

D問題

3日悩んで結局解けず。先程回答を見ました。 1000000007という素数が出てきてなんとなくmodule演算をしてほしいのだなぁと思いつつ。やっていたのですが、配置で壁に沿ってなくてはいけないという部分が難しすぎて断念。 module演算に関しては、

にまとまっていて、ありがたいなぁと思いつつこれを使って計算。ただここに載っているフェルマーの小定理、理解しておらず。

これは部分点だけとれて満足すればよかったのかもしれないと思いつつ。なお、解説を見てもいまいちわからないという状態。解答を見ると、

というのを使って解いていたということが判明。 パスカルの三角形って使えるのか…ということにもびっくりしつつ、フェルマーの小定理も使えるようにして、再度100点の問題だけ説いてみようかなという感じです。

とりあえず、答え見たので答えどおりに実装してみたいところ。

ABC 065

たまたま夜にやっていたので、これにもチャレンジ。

A問題

if文を使った数値判定。

B問題

mapを利用してパスを消しながら検索していくというスタイルで解く。 やはりC++はコンテナが優秀。

C問題

ちょうどABC003のD問題で調べていたmodule演算がそのまま使えたので適用。 ただ、掛け算のときはintからあふれるのでその部分にハマり、最終的に型をlong longにして解決。

D問題

結局未実装なので、どこかで解きたい。 全探索すると10000!というでかい数になってしまうので、結局全パスから最も離れている2点を探して、それを両端として片方から貪欲法で道をなぞっていくのがよいかなとおもったりしつつ、実装はしていない。 他にも罠がありそう。ただ絶対値で係船できるのでC++複素数ライブラリを使うと実装量が減らせそうだなぁと思ったりしてました。

おわりに

とりあえず、ここまで解いたABCの問題のメモをまとめてみました。まだ解けてないD問題が003と065とあるので、これからやってみたいところ。

だんだん数学的なテクニックが必要とされてきてるので、ある程度やって無理だったら答えを見ながら実装して学んでいくというスタイルでも良いのかなぁと思いました。

これらかも、ゆる~く競技プログラミングをやっていきたいなと思います。

プログラミング初心者のためのワークブック「高校生からはじめる プログラミング」を発売しました

f:id:sifue:20170414190217j:plain

この度、N高等学校/N予備校のプログラミング入門コースで授業した内容の最初の3か月の部分が本になりました!

表紙や中の扉絵がソードアートオンラインなのは、中高生の皆さんにとりあえず興味を持ってもらえるようにそのようになっています。川原礫先生、本当にありがとうございます。(あと一応キリトくんの趣味はプログラミングだそうです。そして、最近映画見に行きました。)

f:id:sifue:20170406172144j:plain

内容は、初めてPCを触る(最近はタッチデバイスしか触ったことがない生徒さんが多い)、中学卒業程度の英語と数学を持つ方を対象としたガチのプログラミング初心者本となっています。具体的に言うと、一番最初はGoogle Chromeのインストールからスタートし、Webプログラミングを通じてプログラミングの基礎を学んでいきます。

f:id:sifue:20170406174052j:plain

目次はこのような感じです。この本で学ぶと、プログラミング経験ゼロの初心者が、Twitterに投稿可能な診断メーカーのような動くWebページをゼロから作れるようになります。

f:id:sifue:20170414215610p:plain

なおこの内容は、 この本の内容はN高等学校の生徒約2200名のうち700名以上が学んだものです。この一年間で授業やQ&Aで生徒から出てきた疑問や質問が解消されるよう、内容を加筆/修正したものとなっています。

  • キーボードのキー配置、文字ごとの入力方法など操作法の説明
  • ブラウザやエディタのインストールから利用方法までの環境構築の手ほどき
  • WindowsMacのファイル操作の説明
  • 中学数学範囲外の内容である論理(かつ、または)などの説明
  • 登場する英単語の説明

f:id:sifue:20170406173252j:plain

f:id:sifue:20170406173321j:plain

上の写真のような内容です。学習は、コードを読み、書き、改変するということをプロダクトを作りながら学んでいくようになっています。実際に手を動かして物を作り、反応を見ながら、最終的にオリジナルのプロダクトを作る。プログラミングを楽しみながら学ぶ内容になるよう心がけました。

作るもの一覧はこのようになっています。

f:id:sifue:20170414220348p:plain

この教材はPC、それも5年以上前のPCでも十分にプログラミングを学べます。

最近プログラミング教育ブームとなっており、小中学生にはScratchやProcessing、ArduinoRaspberry Piといったプラットフォームでのプログラミング教育が盛んにおこなわれています。本書はそういうものとはちょっと違い、かなり実践的ではありますが、中高生がWebプログラミングを通じて普段利用しているサービスの仕組みの一部を知り、プログラミングを体験できる教材になっています。

またこの内容を学ぶと、例えばブログなどでHTML編集の機能を使ったり、Webページのチェックボックスをすべてオンにするスクリプトを書いたり、HTMLとJavaScriptで抽選プログラムを作ったり、そんなことができるようになります。

そしてそれは、Webがあらゆるところで使われている現代において、中高生が学んで実生活において決して損にはならない内容であると思います。

最近「中高生にプログラミングの教育をしてくれ」と頼まれるWebエンジニアもいたりするのではないかなと思います。 そういう時にこの本は教科書として最適です。ぜひこの本書を活用し、中高生へのWebプログラミングを通じたプログラミングを教えていただければ幸いです。

本当に初心者で、特に何かやりたいことが決まってはないけれどプログラミング入門してみたいというみなさんも、ぜひこの本でプログラミングを楽しんでもらえると非常にうれしく思います。どうぞよろしくお願いします 。

アマゾンへのリンク

高校生からはじめる プログラミング

高校生からはじめる プログラミング

追伸

この内容も含め、続くLinux開発環境構築、Node.jsを使ったWebセキュリティ、フレームワークを使ったWebアプリ開発、Scalaを使ったオブジェクト指向プログラミング、関数型プログラミングAndroidアプリ開発の教材は、N予備校にて月額1000円で一般向けに提供されています。なおiOSアプリは2017年4月、並行処理プログラミングは7月には公開予定です。この本を読んで、続きが気になるよって状態になった方、ぜひ N予備校 プログラミング を体験してみてください。

またこのN予備校の教材を作ったコンセプト、背景などは、Qiitaの記事「高校生にWeb上でプログラミングを教え始めたエンジニアがこの8ヶ月間で得た気づき」 にまとめてありますので是非ご覧ください。