アゴドリルの備忘録

まったり競技プログラミングとCTFなど

dockerについて

学内でGit,dockerなどの開発環境について勉強する(ゆるふわ)勉強会があったので物理学科ながら参加してみた。そこでdockerにふれたので忘れないように書きます。

dockerとは

Docker Inc.が開発した軽量なコンテナ型の仮想化ツール

仮想マシンとコンテナ型仮想化の違い

Virtualboxなどの仮想マシンはもともと動いているホストOSの上にVirtual boxなどの仮想マシンを立てて、そこでゲストOSを立ててそこでプロセスなどを実行する

dockerなどのコンテナ型の仮想環境ではコンテナという領域でプロセスを実行する

コンテナは仮想マシンに比べて余計なものが動かない→軽い!!!


dockerの公式ドキュメント
Docker Documentation | Docker Documentation


imageとcontainerについて

・image
コンテナの実行環境、ファイルシステム、操作方法みたいなのをまとめたもの
自分でOS,コマンドなども編集可能

・container
imageによって作成した仮想環境のこと


コンテナの起動まで

イメージの取得
$ docker pull [image名]

https://hub.docker.com/explore/
上のリンクからpullできるものは確認できる


version指定をしたいときは

$ docker pull ubuntu:14.04

上のように":"をつけてversionを指定


コンテナの起動
$ docker run [option] image [command]

imageがローカルにないか自動で確認してくれて、ないときは自動でpullをおこなってから起動をする


オプション

-i インタラクティブ
-t 擬似端末接続
-d バックグラウンドで実行

$ docker run -it ubuntu:16.04 /bin/bash

↑よく使う

上のコマンドを実行すると、起動したubuntuのコンテナのターミナルに接続ができる


コンテナ名を指定

$ docker run --name hoge ubuntu

コンテナ名:hogeのコンテナを作成
(通常、コンテナ名はランダムに作成される)


よく使いそうなコマンド一覧

起動中のコンテナにログイン
$ docker attach [コンテナ名 or ID]

起動中でないとアタッチはできない

コンテナの起動
$ docker start [コンテナ名 or ID]


-aオプションを加えて

$ docker start -a [コンテナ名 or ID]

で起動と同時にコンテナにアタッチ(ログイン)することもできる


imageの一覧を表示
$ docker images
実行中のコンテナの一覧を表示する
$ docker container ls
すべてのコンテナ(実行中でないものも含む)を表示する
$ docker container ls -a
コンテナ/イメージの削除
$ docker rm container名
$ docker rm image名
コンテナ/イメージの全削除(実行中のものは除く)
$ docker container prune
$ docker image prune

そういえば

dockerのインストールが成功しているのにも関わらず、dockerの起動の際にpermission deniedなどと表示されるときはユーザがdockerグループに所属していないためにsudoを毎回打つ必要があります。そのためユーザをdockerグループに所属させると、毎回sudoを打つ必要がなくなります。詳しくは

qiita.com

自分はこの方法で解決しました。


参考
http://qiita.com/voluntas/items/68c1fd04dd3d507d4083

Gitの基本操作

学内でGit,dockerなどの開発環境について勉強する(ゆるふわ)勉強会があったので物理学科ながら参加してみた。Git回だったのでまずはローカルでのgitの基本操作について復習としてまとめてみる。

基本的なコマンド

  • git init
  • git add
  • git commit
  • git status

gitレポジトリの作成

今回は作業用ディレクトリとしてzinken_reviewを作成し移動。

$ mkdir zinken_review
$ cd zinken_review

gitで管理したいのでgit initコマンドを使用してgitレポジトリを作成する。

$ git init

そうするとInitialized empty Git repository in ~/zinken_review/.gitと表示されて空のgitレポジトリが作成されてgitで管理・運用ができるようになる。

確認としてlsコマンド

$ ls -a

を実行すると.gitファイルがあるのが確認できる。

基本の流れ

ファイルの作成・変更→git add→git commit
の順に作業をしていく。

空の状態なので新たにテスト用ファイル(今回はtest1.txt)を作成・編集をして、これをコミットする作業を行う。


①test1.txtを作成・編集

②ファイルをステージングエリアにあげる

ステージングエリアにあげるにはgit addコマンドを使用する。

$ git add test1.txt

③コミットをする。コミットをするにはgit commitコマンドを使用する。実行するとviが起動してコミットメッセージを書くことができる。

$ git commit


コミットメッセージをemacsで書きたい場合は、以下のコマンドを実行するとコミットメッセージがemacsでかけるようになる。

$ git config --global core.editor 'emacs -nw'

これで更新終了。

ファイルの編集・追加→git add→git commitが一連の流れ

↑これ大事

git statusについて

どれをステージングエリアに上げたか否か、コミットしたか否かを調べるにはgit statusコマンドを使う。

変更したファイルをステージングエリアに上げていない状態でgit statusコマンドを使用すると以下のような表示になる。

f:id:agodoriru:20170809190858j:plain


変更・追加したファイルをステージングエリアに上げて、コミットしていない状態でgit statusコマンドを使用すると下のような表示が出る。

f:id:agodoriru:20170809190848j:plain


すべてのファイルがコミットまでされて最新の状態である場合は下のようになる。

f:id:agodoriru:20170809191532j:plain


ブランチ関連のコマンド

  • git branch
  • git checkout
  • git merge

ブランチの作成・切り替え・結合

ブランチを作成する時はgit branchコマンドを使用する。
試しにtest_branchという名前のブランチを作成する。

$ git branch test_branch

現在のブランチ一覧を確認するときも同様にgit branchコマンドを使用するとbranchの一覧が表示される。

$ git branch

"*"マークが付いているところが現在いるブランチである。


ブランチの切り替えをしたい場合にはgit checkoutコマンドを実行する。

$ git checkout test_branch


ブランチを結合するにはgit mergeコマンドを使用する。
masterにtest_branchをmergeする場合には、まずmasterに移動する。それからgit margeコマンドを用いてブランチを結合する。

$ git checkout master
$ git merge test_branch


他にもgit logコマンドやGithubとの連携など、様々なコマンドがあるので調べてまとめたい。

参考
Git - Book
サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ

ICPC国内予選2017敗戦記

チーム:kurodoriru5で参加しました


結果

結果はA,B,Cの3問を解いて113位でした

f:id:agodoriru:20170715204043p:plain

チーム練習、模擬国内同様A,B,C,Dの4完したいという目標で進めていきました
相変わらずのペアプロ方式で進めていきました

本番

Aはソートしてやればいいとc氏に言われ言われるがまま実装
A,AC

Bをj氏と考える
文字列扱う系の問題でj氏が得意な問題だと勝手に思ってた
""の中だけを考えてる問題だと二人とも誤読したりしていた
実装方針が大きく変わってc氏にPCを渡す

Cはc氏がいつの間にACを出していた
問題も見ていない

Bを再びPCでコーディングしていくj氏
できたと思ってサンプル通すとすべてあってた
これは来たと提出
WAが返ってきた
あれー、ということで二人で悩んでいたが最後に何かしらの文字がある時のことを考えてなかったっぽい(詳しくは覚えてない)
サンプル見るとその時のパターンがなくてやられましたねということを話していた
j氏がさくっと直して問題なさそうだったので提出
B,AC

終了まで確か45分くらい
Dを解こうとc氏奮闘、
xorを使う、DPを使うっぽいって確か言ってたなあ

残念ながらDのACを獲得することはできず、短い3時間がおわってしまいました

ABCの3完で113位
学内で4位、RICORAサークル内では2位という結果になりました

感想

楽しかったけど、悔しいです。悔しいけど2ヶ月くらい前から1週間に1回、チームで集まってAOJ-ICPCの過去問を解くなどできる限りでやれることをやってきました。それで進出できなかったので悔しいけど、やりきった達成感もあります。
そして、このチームメンバーと一緒にICPCに出られたことが嬉しいです。このチームは2年生2人、3年生1人のチームなのでみんな来年も出ようとすれば出れるので、もしできるのであればこのチームで来年も出てリベンジを果たしたいなあと1人で勝手に思っています。
サークル内で1位のチームも3完ということで弊サークルからのアジア予選進出のチームは残念ながらいませんでした。

去年のICPC終わってからモチベーションの低下と大学のレポート三昧で全然競プロする時間がなかったと思うので今年はこの悔しさを糧にして頑張りたいと思います。
実装力をつけて来年こそはアジア進出するぞ!

最後に

アジア予選進出した方はアジア地区予選でも頑張ってください!
監督を引き受けていただいたS先生、ありがとうございました。

ICPC 模擬国内予選2017 参加記

チームkurodoriru5で出ました

j氏(RICORAの長)、c氏(葛飾のプロ)、a(私)の3人です

 

 

 

毎週土曜のチーム練習で1人1問担当ではなく、ペアプロ方式で解くことになってたのでいつも通りその感じで解いていきました。C,Dは3人で解いてました

14:00(開始予定時刻)

あれ、つながらない

Twitter情報 「15分遅延」

3人「まじかー」 

 

14:15

Twitter情報「遅延」

3人「まじか、運営がんばれ」

 

 

15:00開始(0分経過)

3人「お、問題出てる」

 

a「A解きます」

c「見てます」

j「B見てます」

 

15:20(20分経過)

c氏にアドバイスもらいながらA実装完了

(言われた通りに実装してた)

a&c「Aできたね」

j氏に提出方法を教えてもらう

 

15:25(25分経過)A.AC

3人「おー」

j「B書きます」

a「見てます」

 

15:50(50分経過)B.AC

3人「おー」

c「j氏実装お願いします」

j「指示お願いします」

a「後ろから見てます」

 

16:30(90分経過)

?「できたけどサンプル合わない」

3人でバグ探す

?「ソートの位置、違うんじゃない?」

「あー、ほんとだ」

直して提出

2WA

?「あれ、何でだ?」

c「ここ違くないですか」(どこかにバグがあった)

j&a「ほんとだ」

直して提出 

16:50

C提出

1ケース目AC

2ケース目、通す前に障害発生

Dにいく

 

17:15(135分経過)

c「D問題二分探索?」

j,a「頼んだ」

 

17:30(150分経過)C.AC

システム直ったらしい

C,AC

 

17:55(175分経過)

3人「D問題うまくいかないね、、、」

 

18:00(180経過)

twitter開いて30分延長を知る

Dを解く

 

18:20(200分経過)

c「D実装終わった」

j「Dサンプル通った」

コマンドミス、、、不穏な空気が漂う

3人「あれ、やばい」

 

18:30(210分経過)コンテスト終了

3人「お疲れ様です」

 

 結果

f:id:agodoriru:20170703002038p:plain

 

A,B,C3完

93位

 

よかった点

  • 何回かチーム練をしていて、A,Bを今までになく早く解けた(気がする)
  • Cのバグを3人で協力して(割と早く)見つけられた

ミスった点

  • 入出力コマンドミスでトラブル。D問題を提出できなかった→ファイル名を間違えないように決める
  • CでWAを出してしまった

私個人

  • Dを解くときまで頭が回らずj氏、c氏の2人に任せきりになってしまって、非常に申し訳なかった→3時間考えきる脳力が必要
  • ちょいちょい後ろからミスを指摘できてよかった

 

まとめ

チーム戦、楽しかった

コンテスト中も笑いありで非常によかった

トラブルがあったけど運営の人たち、お疲れ様でした

本番も頑張る

 

Sublime Text 3のテーマ・カラースキームを変えた

こんにちは。
Sublime Text 3のカラースキーム・テーマを変えたので変更の方法をまとめたいと思います。

f:id:agodoriru:20170609193807p:plain
(現在のテーマ:Cobalt2)

デフォルトで入っているカラースキームを使う方法

sublimeにはデフォルトでもカラースキームが豊富に用意されています。
これらを使うには[Preferences]→[Color Scheme]→[Color Scheme - Default] としていくとデフォルトで入っているカラースキームを選ぶことができます。

f:id:agodoriru:20170609152412j:plain

f:id:agodoriru:20170609152408j:plain





デフォルトで入っていないカラースキーム・テーマを使う方法

デフォルトで入っていないカラースキーム・テーマを使いたい場合にはインストール作業と設定作業が必要です。

インストール方法

まず、[Ctrl]+[Shift]+[p]を同時に押すとコマンドパレットが出てきます。
コマンドパレットに "install package" と打つと下に "Package Control:Install Package" と出てくるのでそこをクリックします。

f:id:agodoriru:20170609162556p:plain

そこに"Theme +自分の使いたいテーマ名"を打ちます。

f:id:agodoriru:20170609162553p:plain

インストールしたいテーマをクリックして左下に"successfully installed"と表示されるとインストール終了です。
次に設定方法です。

設定方法

[Prefereces]→[Settings]をクリックして、 "Preferences.sublime-setting-User" と名前のついたファイルに下のようにカラースキームとテーマを付け加えます。

"color_scheme":"hogehoge",
"theme":"hogehoge"

f:id:agodoriru:20170609164921j:plain
(画像はデフォルト時)


これを保存して再起動するとカラースキーム・テーマが変更されます。

このようにしてsublimeのカラースキーム・テーマを変更することができます。

個人的なおすすめ

Cobalt2(←これに変えました!!!)

青基調の爽やか系。良さみが深い。

設定

"color_scheme":"Packages/Theme - Cobalt2/cobalt2.tmTheme",
"theme":"Cobalt2.sublime-theme"


f:id:agodoriru:20170609193807p:plain

Tech49

ダーク系でかっこいい。

設定

"color_scheme":"Packages/Theme - Tech49/Tech49.tmTheme",
"theme":"Tech49.sublime-theme"


f:id:agodoriru:20170609194240p:plain

material -Darker

ダーク系だけど、Tech49に比べて落ち着いた色合いでよいです。

設定

"color_scheme":"Packages/Material Theme/schemes/Material-Theme-Darker.tmTheme",
"theme":"Material-Theme-Darker.sublime-theme"


f:id:agodoriru:20170609194440p:plain



こんな感じでテーマを変えてsublimeをカスタマイズしてみてください!
P.S.早くライセンス買わねば

参考・参照した記事
Sublime Text のテーマやカラースキームを変更する方法 - 情報系大学院生のWebメモ
コードがはっきりと見やすくて、使いやすい Sublime Text 3 のテーマのまとめ | コリス

ABC031B 運動管理

レポートが進まないのと、Virtual Contestでやったので書きます

解法


与えられたA_iがL,Hの大小と比較して場合分け

①A_i < Lの時、L-A_iを出力
②L ≦ A_i ≦ Hの時、0を出力
③h < A_iの時、-1を出力

コード

#include <iostream>

using namespace std;

int main(){
	int l,h,n;

	cin>>l>>h>>n;
	
	for(int i=0;i<n;i++){
		int tmp;
		cin>>tmp;

		if(tmp<l){
			cout<<l-tmp<<endl;
		}else if((l<=tmp)&&(tmp<=h)){
			cout<<0<<endl;
		}else{
			cout<<-1<<endl;
		}
	}

	return 0;
}

ABC052B Increment Decrement

Virtual Contestやったので書く

方針

問題にもある通り、sのi番目がIかDかを見て、xの値を変えていく
この際、最大値を保持する変数を1個用意してそこに最大値を保持する
(以下のコードの場合、ans)
xの値とansの値を比較してxのほうが大きい場合はansにxを代入することで最大値をとることができる

コード

#include <iostream>
#include <string>

using namespace std;

int main(){
    int n,x=0;
    string s;

    int ans=0;//最大値を保持する変数

    cin>>n>>s;

    for(int i=0;i<n;i++){
        if(s[i]=='I')x++;
        else if(s[i]=='D')x--;

        if(x>ans){//xの値が現在の最大値より大きいとき、最大値を更新する
            ans=x;
        }
    }
    cout<<ans<<endl;
    return 0;
}