Arch LinuxをMac Book Proにインストールした

こんにちは.

やっとの事でArch Linuxのインストールに成功したので,やったことを書いておきます.

Bootable USB

以下のWikiのコマンドでいけます.4GのUSBでも十分でした.

USB インストールメディア - ArchWiki

Install

手順は,下記のブログを参考にしてコマンドを打っていったらできます.ありがとうございます.

Arch LinuxをUEFI + GPT環境にインストールする

ここで最後にarch-chrootから抜けてrebootをするのですが,僕は無線LANでネットに繋いでおりwifi-menuというコマンドを使っていました. このコマンドはインストールメディア内だったら動くのですが,実際にインストールしたディスク上では動きません. その理由として,wifi-menuの起動に必要なwpa_supplicantdialogが存在しないからです.

arch-chrootを抜ける前に,以下のコマンドでInstallすることを忘れないようにしましょう.(wifi-menuを利用する場合)

 pacman -S wpa_supplicant dialog 

ちなみにwifi-menu -oとするとnetctl用の設定を吐いてくれるので,後はnetctl enable <config file>とかで設定してネットワーク設定も可能です.

Configuration

以下の二つの記事を見つつ設定すると,動きました

ここは特に問題なくいけました.

Keyring

gitを使う上で毎回パスワードを求められる現象が起こるので,以下の記事を参考に設定します.

hajime-mat.hateblo.jp

その他

以下の記事も参考にしました.

qiita.com

qiita.com

まとめ

今の所は,起動がすげぇ早かったりMacで動かなかったHaskellのコードが動いたりありがたい感じの毎日を過ごしています.

すぐ消して再度インストールできるようにインストールスクリプトを作成しようと思います.

#builderscon 参加記 3日目

builderscon 三日目

聞いた話のメモと感想を書いていきます.

全てのエンジニアに知ってもらいたいOSの中身について

speakerdeck.com

ariakiさん MEDIA DO

最近のOS事情

  • OSの選択やOSのカスタマイズをする必要があまりなくなって来た
  • Dockerなどが登場して関心ごとがアプリケーション側へ
  • setenforce 0
  • OS認知の低下
  • PaaS, FaaSの流行り
  • Web,機械学習の流行
  • アセンブラC言語の認知度の低下
  • OSの中身を知ると少し幸せになるかも

CPU

  • x86はIntel8086が元,x86,16bit ia32,32bit
  • 40年前のCPUと互換動作する
  • メモリが1MBだったら640KBしかアクセスできず,セグメントで区切られている
  • プロテクトモードにバグがあり,使えないはずの64KBが使えるようになった
  • バグだったがこのバグを閉じず,今も使用できる

レジスタ

  • 変数を記憶できるやつ
  • めちゃくちゃ早い
  • メモリよりレジスタの方がCPUの中にあるので高速
  • 汎用レジスタは4つしかない

モード

  • リアルモード -> プロテクトモード -> ロングモード
  • リアルモード,いろんな場所に書き込み可能,フリーダム
  • プロテクトモードでいろいろと制限されるようになった

プロテクトモード

特権管理

一般保護例外

メモリ管理

  • 一番小さい範囲 -> ページ
  • ページのリストみたいな -> PTE
  • PTEのリストみたいな -> PDE
  • ページング
  • リニアアドレス(上記の領域)をまとめた区間 -> セグメント

タスク管理

ブートシーケンス

  • BIOS -> Bootstrap Loader -> Kernel Loader -> Kernel
  • 0x7c00に書き込む -> 先頭は予約されており末尾から読み込むことを考えた

システムコール

  • Application -> User Land -> System call -> Kernel
  • User Landにはシェルなどが入っている
  • straceでシステムコールを確認
  • puts -> writeが呼ばれる

system call table

感想

結構知らなかった知識がふんだんに盛り込まれていたので,楽しく聴くことができました. やっぱり昔を振り返ることも重要なんだなと思いました.

高集積コンテナホスティングにおけるボトルネックとその解法

speakerdeck.com

pyama86さん ボトルネックの探し方

sntsを作成

HACONIWA -> mruby製コンテナエンジン

コンテナの話

  • コンテナ=プロセス

namespace

  • ip a -> bash -> unshare --net -> ip a
  • unshareでホストとゲスト間の分離を行える

chroot

cgroup

  • リソース割り当て

capability

  • プロセスが持つ特権を調べる
  • LXCで学ぶコンテナ入門が参考になるらしい

FastContainerアーキテクチャ

  • FastCGIから
  • プロセスをフォークし一定時間動いたら止める
  • コンテナを起動して,一定時間動いたら止める
  • データはストレージに置く

コンテナの起動をいかに早くするか

  • 監視コンテナが落ちる
  • ネットワークネームスペースの追加に一分ぐらいかかってる
  • ipコマンドでネットワークネームスペースを区切る
  • 名前が被ってるかも? -> そんなことはなかったらしい
  • straceコマンドでしらべる
  • unshareコマンドが遅いらしい
  • perf recode call graph -> 重くなっている処理を確認できる
  • slab -> deactivate_slabが重いらしい
  • dentryキャッシュ(ファイルのパスのキャッシュ)が多かった
  • キャッシュをクリアするようにして解決

  • Linuxブリッジの上限がある

  • ブリッジを分散して解決

  • cadvisor -> コンテナの情報を取れる

  • gdb -> コマンドの履歴を取得できる

  • ボトルネックが遷移した

  • 2500コンテナにするとまた遅くなる
  • ipコマンドにいらない処理があったので削除して高速化
  • valgrind -> HEAPのサマリーをとる
  • 4000コンテナ弱の起動ができた

感想

流れるようなプレゼンでそれでも多くの知識を漏らさず丁寧に発表されており,すげぇといった感じでした. 知らない便利コマンドがいろいろ知れてよかったです.

遠いようで身近なサウンドエンジニアリング

speakerdeck.com

@karupaneruraさん DeNA

趣味:サウンドエンジニア

レコーディング

一発どり

  • ノリでいけるが編集しづらい

バラどり

  • 楽器が多くなると編集が大変になってしまう
  • 市販のイヤホンで聞いて,聞きやすい音質に調整する
  • リマスター版とかは,音質をより良いものに調整して再配布する感じ
  • マイクは音の振動を電圧の変化に変換する
  • コンピュータの限界の音量を越えると音割れする

実際のギターによる実演

  • ギターの録音する位置によって音が違う (すごい)

感想

いきなりギターが出てきたときは,すげぇってなりました. でもサウンドにもいろいろ気を配ったりする箇所があるのだと知れて,とても嬉しかったです.

業務時間で書いたパッチは誰のもの? OSS 活動にまつわる罠

uchan_nosさん サイボウズ SRE

OSSに問題があったら自分で直す

OSSに不具合があったら,パッチを書く.そして貢献する.

もともと趣味で作っていたものが業務で使われている

業務時間を趣味のプロダクトに使っているのはいいのか?

ポリシー

Read the Docsで公開

policy

感想

まだ学生なので仕事上でのOSSの貢献の大変さについて知れてよかったです.

Building Self-Hosted Kubernetes

nasa9084さん

自動化された自律システム

いい感じにしてくれる

システムが落ちた時に自動で直してくれる

k8s

  • マイクロサービスと相性がいい
  • k8sもマイクロサービスである
  • k8sk8sで管理したい
  • k8s on k8s,上の層はk8sで管理されているが,下の層は人間が管理しないといけない

self hostedでのk8s

  • k8sを自分で自動で管理
  • k8s自体のログ:kubectl logs
  • k8s自体のstatus:kubectl describe

感想

k8sという言葉を無限に聴くことができて幸せでした. k8s on k8s は夢が広がります.

自作キーボード

speakerdeck.com

残念ながら立ち見でTwitterしかしていなかったのですが,自作キーボードあるあるが非常に詰め込まれてて共感できました. 私もつい先日自作キーボードのために半田付けやらをやっていて,今もまだ少し動いていない状態で放置しています. なので帰ったらまた再チャレンジしたいと思います.

LT

クッソ面白かった

まとめ

学生でぺーぺーの自分が初めてカンファレンスに参加して,それでも大いに楽しめたのでbuildersconに感謝してもしきれません. また来年も機会があれば行きたみが深いです.

#builderscon 参加記 2日目

builderscon 二日目

二日目から本格的にカンファレンスがスタートし,いろんなトラックで発表者がたくさんの面白いことを発表していきます. とりあえず僕が聞いた話の書いたメモと感想を少しずつ載せていきます.

Electronによるアプリケーション開発事情2018

speakerdeck.com

h3potetoさん

普段はTeraformをいじっている

Mastodonクライアントを作っている

Electron

  • Chromium + Node.js
  • Webフロントの技術が利用できる
  • vue-cliにelectronのテンプレートがあるらしい
  • main, rendererプロセスが存在していて,mainがバックグラウンドでごにょごにょ値が変更されたらviewに反映
  • React, Vueの差分レンダリングはよさみが深く,開発者はデータをどう反映させるかだけを重視すればよい
  • Chromiumは更新されており,それに伴ってElectronもアップデートされて行くよさがある.

リリースの話

electron-builder

  • アプリケーションのパッケージングを行うやつ
  • electron-packagerより機能が増えている

アイコン

  • linuxだけmain.js内に書かないといけない
  • それ以外はpackage.jsonに書いたら動いてくれる

効果音

  • 圧縮されてしまうと読み込めないので,圧縮せずにpackageに含めるように設定する

証明書

  • electron-packagerだと勝手にやってくれる
  • MAS(Mac App Store)だけcodesignコマンドなどを利用する必要がある

Mastodonクライアントの話

  • Slackっぽいクライアント
  • 海外の反応「良い!だけどElectronか」
  • Electronは,メモリをたくさん食ってしまう

メモリと戦う

  • Streamingを切るとメモリが増えない
  • Streamingを増やしてもあまり変わらない
  • 流速が早いと結構変わる
  • 取得したトゥートを片っ端からレンダリングしていた
  • iOSだと画面に表示されている部分のみをレンダリングされている(UITableViewController)
  • 表示部分を含めたセルの高さを算出するやつがいて,そいつが良い感じにレンダリングを調整するらしい

  • 解決策:最新40件のみを保持していて,そしてそれ以降のトゥートを読み込まれた時にレンダリングする

vue.js

api周り

  • mastodon-api,POSTパラメータをbodyではなくurlパラメータに埋めて送信するらしい
  • Bodyに埋め込みたいので,ないので作った

障害周り

  • インスタンスを立てないとわからない問題もある
  • Gemによる障害を解決するために,revertしたプルリクを送ったらしい
  • 今は最新のGemが入っているらしい

感想

リリースなどしたことがなく,そこからのパフォーマンス面の改善の話などそこまで話題に上がらないが重要なトピックが聞けて非常に満足です. vue.js + Electron,良さそうだなと思いました.

Algorithms in React

speakerdeck.com

koba04さん サイボウズ

仮装DOMの話より内部の話

Reactの内部

  • いろいろパッケージに別れている
  • Component -> Reconciler -> Renderer -> Hostという流れ
  • ReconcilerはCとかでも実装するつもりなので基本的に依存が少ない

Stack Reconciler

  • traverseして差分があれば,即反映
  • 同期的に更新するように実装されている

ReactElement

  • DOMと対応している
  • 毎回生成し直して描画

二つのInstance

  • Public Instance
    • 状態を持つ
  • Internal Instance
    • ReactのAPIをいろいろつかうやつ
    • Public Instanceに触らせたくないやつを持っている

ReactInstanceMap

  • Public InstanceとInternal Instanceを紐付け

Stackの実装の問題点

  • 同期的に処理をしないといけない
  • traverseするのに時間がかかってしまったりする

Fiber Reconciler

  • render, commitフェーズの二つのフェーズ
  • renderは途中で止めれたりできる

Fiber

  • ReactElementと1:1で作られる
  • ReactElementをLinkedListで持つ
  • ダブルフバッファリングのような構造を持っている
  • 軽量のスレッド

Linked List

  • InsertとDeleteが早いので利用,要素は順にトラバースしていくので特に問題はない
  • parent, childの関係があり,二つ目からのchildは一つ目のchildからsiblingという関係を持ちparentに関係を持つ.
  • parent -> child -> sibling -> parentという流れで探索

Double Buffer

  • CurrentとWork in progressの二つを持っており,commitするとバッファを切り替える

render, commitフェーズ

  • renderはasyncで動いて,全ての処理が終わったらcommitしてcurrentに反映
  • ComponentWillMountは非推奨らしい

複数のアップデート

  • update queue
  • こうより:this.setState({count: this.state.count+1})
  • こう書いた方がいい:this.setState({state => ({count: state.count + 1})})

expiration time

  • いつ更新されるかを定める,優先度のようなもの
  • Eventごとに優先度が異なっている.
  • ユーザの入力を受け取るものは優先度が高い

Demo

  • 入力した文字をカウントの数だけ文字をレンダリングする
  • 何もいじってないとテキストの入力時に,レンダリングの負荷がかかりブラウザが入力を受け付けなくなる
  • テキストフォームの優先度をあげることにより,入力を先に行い遅れて文字が表示されるようにできる

bit演算

  • reactはbit演算が多用されている
  • bit演算により,状態を抽出する
  • 今がどのモードかどうかをbit演算で判定
  • Context APIでもbit演算で分岐が可能

suspence

  • Demoがあり,lodingという文字を何秒後とかに出したりできる

感想

普段Reactを触ってますが,裏ではそう動いているのかと知らない世界が見れて嬉しかったです. これからのReactを頑張って追っかけていこうと思います.

事前知識なしで理解する、静的検査のいろは

speakerdeck.com

DeNA Kuniwakさん

CSの知識なしでの静的解析

静的検査

  • 実行しないまま検査をする
  • なぜ静的に検査したいのか
  • 動的検査だと実行時に通ってないコードを検査できない
  • 静的検査だと網羅的に検査できるが,正確さは低い(実行していないから)

抽象構文木

  • コードを木構造で表している
  • メジャーな言語の抽象構文木は気軽に見れる

構文解析

  • 再起下降法の単純な実装を紹介
  • 文法規則をいろいろ掘って行き,構文規則に当てはまる文字列を探す

解析プログラム

  • 引数は文と始める位置
  • 戻り値は,Nodeと終わりのインデックス

感想

静的解析を行う方法をすごく手軽に説明しており,非常にわかりやすかったです. Go言語でつくるインタプリタでも少し出てた内容だったりもでていて,再確認にもなりました.

ボクが考える i18n の未来

speakerdeck.com

kazuponさん Vue.js core team

Abount i18n

  • i18n -> 国の文化に依存しない
  • l10n -> 国の文化に適応させる
  • Numeronym 単語の文字数を名称にする -> i18nなどはそういう書き方
  • i18nしていないと色々いちいち変更しないといけない
  • デフォルトでi18nが入っているものも多い

content of i18n

i18nの問題

  • 一つの国に複数の言語
  • 税金だったりGDPR
  • 文章の対応
    • LTR -> 左から右の文字列
    • RTL -> 右から左への文字列

未来のi18n

  • Saas
  • i18n framework
    • Progressive Frameworkという考えの導入
    • 複数のレイヤーに道具を分け,組み合わせて利用する

感想

i18n考えることがすごく多そうで,その大変さを知れたのがすごく大きかったと思います. 勉強します.

Javacardの世界

speakerdeck.com

moznionさん java card applet

java card

smart card

  • intelligent smart card
  • memory card

APDU

UICC

  • カードの方

JCRE

  • Java Card上で動くランタイム
  • GCがあるかどうかはカードによって変わる

Java card memory

  • インスタンス変数はメモリに未来永劫残り続ける
  • インスタンス変数にデータを書き込みまくるとカードが壊れる
  • RAMは非常に小さいので,狭いスコープの一時的な変数のみを格納する

Java Cardの開発

書き込みのお話

  • 認証機関から出ている鍵がないと書き込むことができない
  • つまり個人では書き込みは不可能

感想

発表がすごくJava Cardの話で爆笑していました. でも本当に知らない世界を知れてよかったなと思ってます.

lld − 開発ツールの主要コンポーネントの1つをスクラッチから作成した話

Rui Ueyamaさん lldリンカ

lld

  • LLVMのサブプロジェクト
  • FreeBSDは時期バージョンではlldを利用していたり
  • 現在chrome, firefoxで使われてたり
  • コンパイラが中間ファイルのリロケーションを使ってリンクするのがリンカの仕事

開発のきっかけ

  • webフロントを触って来たけど飽きて来てしまった
  • 趣味でコンパイラを作成していた
  • 仕事でコンパイラとリンカ,どっちが作りたい?と聞かれてリンカを作成したらしい

  • アセンブラ書いてバイナリ吐いて,それを読んでそのバイナリを吐けるプログラムを作成して行く

  • Hello world作成まで数ヶ月

作成したリンカ

  • 遅い
  • 作り直したら,10倍くらい早くなった
  • 自然と早くなるものを書くことが大事
  • データ構造を工夫して一回のアクセスでたどり着けるようにする
  • 異なるOSでのリンクのためにしたことは,別々のファイルとして書き特に抽象化なども行わないようにした

感想

自分が良いと思ったパターンによる実装を行うというすごいことを学びました. 普段はすごく抽象化してコードの少しの差異を埋めようとするのですが,最初からそれらを別のコードに落とし込むことを聞いて非常に目から鱗でした.

懇親会

クッキーが割られていたり,飯がうまかったりで最高でした. ある程度いろんな人と話せた感覚があるので,良い懇親会だったと思います.

builderscon参加記 1日目

builderscon1日目は前夜祭ということで,みんなで酒を飲みながらトークを聞こうという流れでした. 残念ながら僕は,自分に甘えまくってしまい30分ほど遅刻しました. なので二つ目のセッションの途中から参戦しました.

タイムテーブル

タイムテーブルは以下にあります.

タイムテーブル

ウェアラブル謎ガジェット

遅刻したので見れてないのですが,何やら電子名刺なるものがあるらしい.(すごい) 文字もちゃんと読める形で表示してくれており,すげぇって感じでした.

自作BLEキーボードのその後

途中から聞きました. mbed vs arduinoの話だったり,市販のガジェットだと少し応用力にかけると思ったらmbedで作ったらいいみたいなお話が興味深かったです. mbedは高いけど,32bitでオンラインにIDEがあり環境構築がほぼしなくてよいのが,良さそうだと感じました. 自作キーボードのためにmbed始めても良さそう.

www.mbed.com

闇の話

やばかった😱

人類バーチャル化のすすめ

まさかの3Dモデルでのプレゼン,かつHMDを顔に装着している!すごい!となかなかに驚かされた発表でした. そしてちゃんと両手に持っているコントローラーを動かすと,キャラの腕が動いたりスライドのポインタを操作したりすごい未来を感じました. 正直,ほぼ画面の3Dモデルに目がいってしまいました. 画面に映っていたのは,ヨハトちゃんです.

twitter.com

そして一番面白いトピックがVR面接です. しかしまだデバイスを持っている同士でしか面接できなかったり,実現するのは少し厳しめらしいです. でも個人的に面接官が可愛い美少女だったら,面接のモチベーションは非常に高いものになると思うので,是非ガンガンやっていってほしいです.

panora.tokyo

ペパボ Make部: デモ2連発

ロボットボールと歯ブラシスタンド,二本立てでのプレゼンでした.

まずロボットボールですが,ちょうど良いサイズのロボットボールがなかったから作ったというすごくかっこいい背景でした. そして完成品のデモでは,すごく機敏に動くしいろんな色で光るしで,かっこよさが際立ってました. 光るとやっぱり動いている感が出るというか,重要なのだなと再認識しました. また今度,キーボードを光らせようと思いました.

medium.com

二つ目は歯ブラシスタンドをハックして,磨き始めと磨き終わりのデータを取れるようにしたものを作成した話でした. 子供に歯ブラシスタンドを使わせた時に,子供は容赦無く歯ブラシをスタンドめがけてぶっ刺してしまい,壊れてしまったみたいな話にすごく物理を感じました.子供怖い. そして歯ブラシスタンドは何も光ることはないので,壊れてもわからないという話が個人的にツボです. ハードは壊れてもわかりづらいのは,本当に大変だなぁと思いました.

また冒頭で紹介されてた光るチャリはめっちゃかっこいいと思いました.

スライドは以下に上がっているようです.

speakerdeck.com

まとめ

1日目からなかなかに濃い内容の話が聞けて個人的に大満足でした. また明日も頑張って参加します.

部活の制作合宿でやったこと

部活の制作合宿が2018/09/01~03にありました.そこでやったことをここに書いておこうと思います.

1日目

戦術的DDD講座をした

speakerdeck.com

個人的に色々なサイトを見たりエリックエヴァンス本を読んでいたので,戦術的なDDDの内容をまとめました. アーキテクチャ周り多めの内容です. 擬似コードJavaっぽいなにかのようなアレですね😇

特に参考にしたのは,「現場で役立つシステム設計の原則」という本です.皆さんも是非読んで見てください.

gihyo.jp

2日目

ここからようやっと重い腰をあげて制作を始めたんですけど,自分で一から制作するの少ししんどいなぁと思い,GitHubOSSのプロダクトをforkして自分の好みのものに仕上げました.

利用したOSSは,codeskyblue/gohttpserverです.すごく良くできたファイルサーバで非常にありがたくコードを読ませてもらいました.

やったこととしては,画像ファイルのサムネイル表示を行なったりおそらく特に必要ないインデックス作成処理を削除しました. Twitterシェアボタンを導入しようとしたのですが,画像をどうやって投稿しようと悩み放置しました. 後日とりあえず画像とテキストを合わせて投稿できるようになりましたが,画像がリンクのみで表示されたりツイートが二回されたり,もう少しなんとかならんかなぁとか思ってます. シェアボタンの処理は,sallar/github-contributions-chartを参考に実装しました.画像シェア系の知見があまりないのが,なかなかつらみ.

3日目

speakerdeck.com

とりあえず発表を行い,他の人の発表を聞いて色々質問して終わりました.スライドの構築方法は古いやつなので,最新の構築方法はmitubaEX/imclを参照してください.

まとめ

DDDについていつかまとめたいと思っていたので,いい機会だったかなと思います. 制作はあまりがっつりできなかったので,今度はもう少しがっつりやろうかなと思います.

Clovaスキルの作り方 (Python編)

LINEが販売しているClovaのスキルを作成したので,その方法を記しておきます.

Clovaスキルのチャンネル作成する

clova-developers.line.me

Clova Developer Centerに行き,ログインしてもらってスキルチャンネルを作成してください.

f:id:MitubaEX:20180820235002p:plain

プロバイダーは自分のプロバイダーを選択,Extension IDは自分で適当に決めてください. あとは必要事項を入力して作成を押してください.

対話モデルの作成する

対話モデルにはインテントとスロットという二つの定義する必要があります.

  • インテント
    • サンプル発話を登録し,どういった発話を認識させるかを定義する
  • スロット
    • 実際に取得した単語の辞書を定義します.

インテントの作成する

カスタムインテントの+ボタンを押して,インテントを作成してください.

f:id:MitubaEX:20180821000756p:plain

名前は適当でいいと思います.作成したら以下の画面になると思います.

f:id:MitubaEX:20180821001014p:plain

そしてサンプル発話リストに,受け取りたい発話サンプルを入力してください.追加後は以下のような感じになると思います.今回は「たこ焼き食べたいな」の「たこ焼き」をスロット(辞書)に登録し,「たこ焼き」という単語をClovaが取得できるようにしてみます.最後に保存を押してくださいね.

f:id:MitubaEX:20180821001232p:plain

スロットの作成する

カスタムスロットの+ボタンを押して,スロットを作成してください.

f:id:MitubaEX:20180821001653p:plain

取得したい単語を入力して保存してください.今回はお好み焼きも追加しておきます.これによりたこ焼きに加えて,お好み焼きも取得できるようになります.

f:id:MitubaEX:20180821001933p:plain

インテントにスロットを適応する

サンプル発話のどこの単語を取りたいかを指定します.取りたい単語をマウスか何かしらで選択すると,以下のような画面になると思います.

f:id:MitubaEX:20180821002233p:plain

スロットの名前は適当で大丈夫です. そしてスロットタイプは先ほど作成したスロットを選択してください.

f:id:MitubaEX:20180821002757p:plain

ここまでできたら左上のビルドを押してください.ビルドには3~5分ほどかかるので,その間にプログラムを書いていきましょう.

プログラムを作成する

今回はPythonを利用します.バージョンは3.6.5です.(3系だったらおそらく大丈夫です)

ライブラリとしては以下の二つを利用します.

install

pipを利用して,installします.

pip3 install flask
pip3 install clova-cek-sdk

pip3で入らなかったら,pipでinstallしてください

コード

基本的には,起動時やインテント取得時などでハンドラを作成していきます.そして各ハンドラでは最後にメッセージを返してあげて終了です.アプリケーションIDは各自の設定したIDに置き換えてください.

from cek import Clova

# 設定
application_id = "<Your Application ID>"
clova = Clova(application_id=application_id,
              default_language="ja", debug_mode=False)

# 起動時に実行
@clova.handle.launch
def launch_request_handler(clova_request):
    return clova.response("こんにちは,たこ焼き食べたいなと言ってください")


# 終了時に実行
@clova.handle.end
def end_handler(clova_request):
    return


# インテントを取得したら実行
@clova.handle.intent("FoodsIntent")
def intent_handler(clova_request):
    # Konamonスロットタイプの単語を取得
    food_name = clova_request.slot_value('Konamon')
    return clova.response(str(food_name))



# デフォルトはこれを実行
@clova.handle.default
def default_handler(clova_request):
    return clova.response("すみません.もう一度お願いします")


from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/', methods=['POST'])
def my_service():
    resp = clova.route(request.data, request.headers)
    resp = jsonify(resp)
    # make sure we have correct Content-Type that CEK expects
    resp.headers['Content-Type'] = 'application/json;charset-UTF-8'
    return resp


if __name__ == "__main__":
    app.run()

実行

python3 main.py

ngrokによる,外部公開

別のターミナルを開いて,以下のコマンドを実行してください. ngrokが入っていない場合は,brew cask install ngrokで入ると思います.

ngrok http 5000

## 実行結果
Session Status                online
Session Expires               7 hours, 49 minutes
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://****.ngrok.io -> localhost:5000
Forwarding                    https://****.ngrok.io -> localhost:5000

この実行結果のForwardingのhttpsの方をコピーしておいてください.

アドレスをClova Developer Centerに登録する

スキルのページで基本情報の修正を選択してください.そしてサーバー設定を選択してください.

f:id:MitubaEX:20180821011338p:plain

先ほどコピーしたngrokのアドレスをサーバーのURLに貼り付けて,保存してください.

f:id:MitubaEX:20180821011506p:plain

これであとは対話モデルをテストするだけです.

対話モデルのテスト

対話モデルのウィンドウのテストを選択してください.

f:id:MitubaEX:20180821011745p:plain

さて,サンプル発話を入力して,テストを押してみましょう.

サーバーのURLが正しくできていた場合,ちゃんとレスポンスが返ってきてテスト結果に表示されたと思います.おそらく以下のような感じ.

f:id:MitubaEX:20180821012020p:plain

ついでにお好み焼きもスロットに登録しておいたので,試してみます.

f:id:MitubaEX:20180821012224p:plain

ちゃんと返ってきました.🎉

スロットに登録していない用語も試してみます.

f:id:MitubaEX:20180821012259p:plain

Noneが返ってきました.これはPython側で値を取得しようとしたけど,値がなかったことを意味します.辞書に登録してないものも取得できたら嬉しいなと思ったりしたりしなかったり.

実機テスト

実機でテストする際はスキルを作成したLINEアカウントとClovaでのLINEアカウントを同一にしておくと,「Clova,<スキル名>を起動して」で起動してくれます.実機で試す時の設定が特に必要ないのがいいところだと思いました.

サーバーを外部サーバーにデプロイする

私はherokuを利用しましたが,みなさんお好きな場所に置いてください.デプロイについては各自検索してもらえると助かります.🙇‍♂️

まとめ

今回はスキルの作成方法をざっくり説明してきました.jsでサーバーを書いている人が多い印象でしたが,今回は個人的に好きなPythonで書きました.みなさんもぜひClovaのスキルを作成してみてくださいね.😎

もっと拡張したい場合は,ライブラリの英語の公式ドキュメントを頑張って読んでもらえると助かります.

Project Euler No. 1 ~ No.10 を解いた

No.1 ~ 10までのコードをペタペタしていきます.

No.1 Multiples of 3 and 5

1000以下のxについて,x mod 5 == 0, x mod 3 == 0の数の合計を求める

check :: Int -> [Int]
check a =
  if (a `mod` 3 == 0 || a `mod` 5 == 0)
  then a : (check $ a + 1)
  else check $ a + 1

main = do
  print $ sum . takeWhile (\x -> x < 1000) $ check 1

やってることは,checkで無限リストを作成して,takeWhileで1,000以下のものを取ってくる.その後,合計を求めて終わりです.

No.2 Even Fibonacci numbers

フィボナッチから偶数を取り出して,合計を求める.

main = do
  let fibo = 0 : 1 : zipWith (\x y -> x + y) (tail fibo) fibo
  print $ sum $ filter even $ takeWhile (\x -> x < 4000000) fibo

fiboというフィボナッチの無限リストを作成し,それからtakeWhileしてsumするだけ.

No.3 Largest prime factor

600851475143の最大の素因数を求める.

factors :: Integer -> [Integer]
factors n = [x | x <- [1..n], n `mod` x == 0]

factorization :: Integer -> [Integer]
factorization 1 = []
factorization x = v : factorization (x `div` v)
  where
    v = (factors x) !! 1

main = do
  print $ factorization 600851475143

以下のブログのものを利用しました.ありがとうございます🙇‍♂️

tnomura9.exblog.jp

No.4 Largest palindrome product

100..999までの数字をかけて,回文となる数値を求める.

reverseInt :: Integer -> Integer
reverseInt x = read . reverse . show $ x

check :: Integer -> Integer
check a = if a == reverseInt a then a else 0

main = do
  let initList = [100,101..999]
  print . maximum . fmap check $ (*) <$> initList <*> initList

数字を文字列にして反転して数値化し,元の数値と比較する.等しければ,その数値を返す.あとはmaxとって終わり.

No.5 Smallest multiple

1..20までの最大公約数を求める問題.

check :: [Integer] -> Integer
check [] = 1
check (x:xs) = lcm (x) (check xs)

main = do
  print $ check [1..20]

Listを回して,lcm(最大公約数を求める関数)するだけ.

No. 6 Sum square difference

(a ^ 2 + b ^ 2... ) - (a + b ...) ^ 2 の解を求める.範囲は1..100

main = do
  let sumNum = sum [1..100]
  let a = (*) sumNum sumNum
  let b = sum $ fmap (\x -> x * x) [1..100]
  print $ a - b

aが各要素を足したあと最後に二乗した数値.そしてbが各要素を二乗していき,最後に合計を求めた数値.最後にa - bをして終わり.

No.7 10001st prime

10001番目の素数を求める.

import Data.Numbers.Primes
main = do
  print . last . take 10001 $ wheelSieve 1

素数を求める時には,Data.Numbers.Primesパッケージを利用しました.

インストールする必要があるので,stack install primesでインストールしてください.

No.8 Largest product in a series

与えられた数値の隣り合う13桁の数を取り出していき,その13個の数の積の最大を求める.

calc :: [Integer] -> Integer
calc (a:b:c:d:e:f:g:h:i:j:k:l:m:[]) = a * b * c * d * e * f * g * h * i * j * k * l * m
calc otherwise = 0

check :: [String] -> [Integer]
check xss@(a:b:c:d:e:f:g:h:i:j:k:l:m:xs) = (calc $ fmap read [a,b,c,d,e,f,g,h,i,j,k,l,m]) : (check $ tail xss)
check otherwise = []

main = do
  print $ maximum $ check $ fmap (:[]) $ show 7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450

なかなかゴリ押ししている感じがあったりします.まず与えられた数値をリストにして,一つずつ右にずらしていき13個ずつ取って行く. あとはそれらの最大をとって終わり.

No.9 Special Pythagorean triplet

ピタゴラスの定理が成り立つa, b, cをとり,a + b + c = 1000になるものを求める.

main = do
  print $ [z | z <- (\x y -> let c = sqrt ((x * x) + (y * y))
      in if x < y && x + y + c == 1000.0
        then Just (x,y,c)
        else Nothing) <$> [1..999] <*> [1..999], not (z == Nothing)] !! 0

ゴリ押しました.[1..999]のリストを二つ与えて,条件にあったもののみをJustに包んで返します.そしてリスト内包表記でNothingを弾きます.(多分もっといい方法ありそう)

No.10 Summation of primes

2,000,000以下の素数の合計を求める.

import Data.Numbers.Primes
main = do
  print $ sum $ takeWhile (\x -> x < 2000000) $ wheelSieve 1

特に言うことがない

まとめ

Haskellの練習がてら少しやったのですが,Haskellのすごさを色々と思い知り感動させてもらいました.また隙間時間に解いて行きます.🙇‍♂️