スキップしてメイン コンテンツに移動

投稿

ARC092/ABC091 D - Two Sequences

 ARC092/ABC091 D - Two Sequencesを解いていきます。 問題 https://beta.atcoder.jp/contests/arc092/tasks/arc092_b 感想  本番でC問題も解けず、焦ってこの問題見たら絶望しました。  何か規則性はないものかと必死で探して見たものの見つからず、解ける気がしませんでした。今後のために解法を書いておく事にしました。  結果はもちろん0完。。。 解法  aとbを足した全ての値を全て計算すると、計算量はO(n^2)となり最大で400億になってしまうので間に合わない。  そこで二進数の各位ごとに計算する。    10進数 2進数 0 0 1 1 2 10 3 11 4 100 5 101 6 110 7 111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111 16 10000    この表を見ると2^kの位は0と1が2^k個づつ交互に並んでいることがわかる。  よって、  ai + bj の 2^kの位 の値は、ai + bj の値が...  0 ≤ ai+bj < 2^k の時 0    2^k ≤ ai+bj < 2*2^k の時 1    2*2^k ≤ ai+bj < 3*2^k の時 0    3*2^k ≤ ai+bj < 4*2^k の時 1  4*2^k ≤ ai+bj < 5*2^k の時 0    5*2^k ≤ ai+bj < 6*2^k の時 1   ...... となる。  これは、mod(2*2^k)としてしまっても構わないので、     ai ≡ n (mod 2*2^k)     bj ≡ m (mod 2*2^k)  とすると、 0 ≤ n+m < 2^k の時 0 2^k ≤ n+m < 2*2^k の時 1 2*2^k ≤ n+m < 3*2^k の時 0 3*2^k ≤ n...

barba.jsとanime.jsでクールに画面遷移

 webサービスでのページ遷移をスムーズにできるbarba.jsを使って画面遷移をするときに手間取ったのでやり方を書いていきます。  私が作ったページは こちら  「はじめる」ボタンを押せばページ遷移が始まります。 barba.js  barba.jsはwebページ間の遷移をネイティブのアプリケーションのように遷移するためのライブラリです。  Github :  https://github.com/luruke/barba.js  導入にはnpmやcdnを使います。ここにはcdn用のコードを貼っておきます。 <script src="https://cdnjs.cloudflare.com/ajax/libs/barba.js/1.0.0/barba.min.js" type="text/javascript"></script> 使い方 ページ遷移の際に読み込みたい部分を、 <div id="barba-wrapper"> <div class="barba-container"> </div> </div>  で囲みます。その後、 Barba.Pjax.start();  とJavaScriptにかけばbarba.jsは最小限これで動きます。 設定  まずは公式のデモのコードを見てみます。このコードを使うと上のbarba-wrapperで囲んだ範囲がフェードアウトして遷移先のbarba-wrapperで囲まれた部分がフェードインします。 var FadeTransition = Barba.BaseTransition.extend({ start: function() { /** * This function is automatically called as soon the Transition starts * this.newContainerLoading is a Promise for the loading of the new container * (Barba...

MONIT でmacの通知センターにCPU、メモリなどの情報を表示する

 mac上で、 LinuxでいうConkyのようなシステム状況が一目でわかるようなソフトを購入したので紹介します。 MONIT  MONITは、macの通知センター上にCPU、メモリ、ディスク、バッテリー、ネットワークの情報を表示してくれるソフトです。  Mac App Storeからインストールすることができます。(有料:¥360,(2017年12月現在)) MONIT を Mac App Store で             起動すると最初にこんな画面が出てきて、 通知センターの一番下のある編集ボタンからMONITを追加しろと言われます。  追加したところはこんな感じ。   ここで、右上の i マークをクリックすると設定画面が開く。  ここでは表示するシステム情報の種類、温度表示、背景の色を変えることができる。  背景色は白と黒の二種類で、白を選ぶとこんな感じ。 自分は黒の方が好みなので、黒に設定した。   また、それぞれのシステム情報についての詳細が見たいときは、それぞれの項目付近をクリックする。  CPUの情報の表示はこんな感じ。  次はメモリ。  円グラフがわかりやすい。メモリ情報は意外と重宝します。  次はディスク情報。 BootCampがやばい...  また、最後に">"がついている項目はクリックするとさらに詳細な情報が出てくる。  次はバッテリー情報。   Cycle Countが地味に嬉しい。。。  最後にネットワーク。  全体的に、いろんな情報がシンプルにまとまっていてかなり見やすい。 感想  必要な情報がシンプルに、スタイリッシュにまとまっていて感動した。  システムの情報が一目で、詳細な数値でみることができるのは非常に大きいと思う。  macの標準アプリ、アクティビティでは表示される情報が多すぎてわかりづらい。  また、通知センターに常に表示されているので、見たいと思った時に1秒もかからずにみる事が出来るのも嬉しい点。  しばらく使って見ての感想は、  M...

ksnctf #7 Programming 解けなかった。

 ksnctfの7問目、Programmingを解こうとしたけど解けなかった話。 問題   http://ksnctf.sweetduet.info/q/7/program.cpp  問題ページにはc++のコードっぽいものが書いてありました。  空白やタブばかりでぐちゃぐちゃだったので綺麗にしてみた。(これが落とし穴...) #include <stdio.h> #include <string.h> int main(){ const char *s =" " "0123456789" " "" "" " "ABCDEFGHIJ" ; printf("%c",strlen(s)); int i = 020000000 + 001000000 + 000600000 + 000040000 + 000007000 + 000000500 + 000000020 + 000000002; printf("%s",&i); long long l = 2LL * 11LL * 229LL * 614741LL * 9576751LL + 5LL; printf("%s",&l); float f = 1.0962664770776731080774868826855754386638240000e-38f; printf("%s", &f); double d = 6.7386412564254706622868098890859398199406890000e-308; printf("%s",&d); }  これを実行してみると... FROG_This_is_wrong_...

ksnctf #6 Login を解く。

 ksnctfの6問目、"Login"を解いていきます。 問題   http://ksnctf.sweetduet.info/problem/6  問題ページには次のurlのみありました。   http://ctfq.sweetduet.info:10080/~q6/  このページにアクセスすると、  上のようなログイン画面が出てきます。  どうやら"admin"としてログインしろとのこと。  これはSQLインジェクションで解けそう。 解法  とりあえず定番の" ' OR 1=1 --"をID欄に入力して送信ボタンを押してみた。  ちなみに" ' OR 1=1 --"は1=1が常に真となり、'--'でそれ以降の文をコメント扱いにしてしまうので、SQL文全体が真となって必ずログインできるという優れもの。 Congratulations! It's too easy? Don't worry. The flag is admin's password. Hint: <?php function h($s){return htmlspecialchars($s,ENT_QUOTES,'UTF-8');} $id = isset($_POST['id']) ? $_POST['id'] : ''; $pass = isset($_POST['pass']) ? $_POST['pass'] : ''; $login = false; $err = ''; if ($id!=='') { $db = new PDO('sqlite:database.db'); $r = $db->query("SELECT * FROM user WHERE id='$id...

ksnctf #5 Onion

 ksnctfの5問目、"Onion"を解いていきます。 問題   http://ksnctf.sweetduet.info/problem/5  問題文は意味不明な文字列が並べられているだけ。  とりあえず暗号か何かを疑ってみたりしましたが、文字列には空白文字もなければ意味不明な場所で改行していたりと全く手がかりを見つけることができなかった。   一時間ほど粘ってみたが、自分の知識ではどうにかなるものではないと悟った。  ここで先人の知恵を拝借。 解法   ヒントが書かれたページ を見ると hint1:base64 hint2:fileコマンド便利だよね と書いてあった とりあえず問題文をファイルにしてfileコマンドに投げてみると $ file onion onion: ASCII text   ここで問題文はASCIIコードで表すことのできる文字のみで構成されていることが判明。  次にbase64について調べると、 7ビットで表されるASCII文字しかやり取りできない環境で、他のデータも送受信可能にする為に元データを6ビットずつに分割し、分割された値に対応するASCII文字を割り当てている。 '000000'~'111111'に対応するASCII文字(= 'A'~'Z' , 'a'~'z' , '0'~'9' , '+' , '/')と'='のみで構成される。 76文字ごとに改行が入る。  また、デコードはweb上でもコマンドでもできる模様。  base64には改行が含まれているようなので、web上で実行しました。  一回デコードするとまたbase64らしき文字列が出てくるので、デコードできなくなるまでデコードを繰り返すと、 begin 666 <data> 51DQ!1U]&94QG4#-3:4%797I74$AU end  こんなのが出てきた。  これも暗号っぽいのでgoogle先生に聞いてみると、"...

ksnctf #4 Villager A 初めての書式文字列攻撃。

 ksnctfの4問目、Villager A を解きました。 問題 https://ksnctf.sweetduet.info/problem/4  問題ページにはアドレス、ID、パスワードが書かれているのでSSHでログイン。  ログインしたら、とりあえずls。 $ ls flag.txt q4 readme.txt  readmeには大したこと書いてなかった。  flag.txtはもちろん開けない。  とりあえずq4を実行してみる。 $ ./q4 What's your name? Sugita Genpaku Hi, Sugita Genpaku Do you want the flag? はい Do you want the flag? yes Do you want the flag? نعم فعلا Do you want the flag? いいえ Do you want the flag? no I see. Good bye.  "no"と答えるまで煽られ続ける模様。  ユーザーが入力した値を出力しているあたり、この前本で読んだばかりの書式文字列攻撃を使うっぽい。  いきなりアセンブリ読むのもアレなのでstringsかけてみる。  stringsコマンドは、ファイルに含まれる文字列を出力してくれる。 strings q4 /lib/ld-linux.so.2 libstdc++.so.6 __gmon_start__ _Jv_RegisterClasses __gxx_personality_v0 libm.so.6 libgcc_s.so.1 libc.so.6 _IO_stdin_used fopen puts putchar stdin printf fgets strcmp __libc_start_main CXXABI_1.3 GLIBC_2.1 GLIBC_2.0 PTRh [^_] What's your name? Hi, Do you want the flag? I see. Good bye. flag.txt  どうにかすればfopenでflag.txtの中身を出力してくれると予想。  ここでもう一度...

Union-Find木を実装する。。。

 最近競プロを始めて、UnionFindを使う問題に出会うことが増えたので実装してみた。 Union-Findとは  UnionFindは、素集合(互いに素な集合)を求めるアルゴリズムです。  例えば、グラフのある二つの頂点が連結されているかどうか調べたり、ある頂点にいくつの頂点が繋がっているかなどを調べるためのアルゴリズムです。 コード  チーター本の実装をアレンジした形になっています。 class UnionFind{ public: vector<int> uni; UnionFind(int s) : uni(s, -1) { } //頂点aが所属するグループを調べる int root(int a) { if (uni[a] < 0) return a; return uni[a] = root(uni[a]); } //頂点aと頂点bを繋ぐ。もともと同じグループの時falseを返す bool connect(int a,int b) { a = root(a); b = root(b); if (a == b) return false; if (uni[a] > uni[b]) { a ^= b; b ^= a; a ^= b; } uni[a] = uni[a] + uni[b]; uni[b] = a; return true; } //頂点a,bが同じグループであるかを調べる bool isConnect(int a,int b) { return root(...

ARC087 / ABC082 A~D解こうとしてみた。

 ARC087 / ABC082を解いたので、初心者なりに考え方などを書いて行きます。  AtCoderの解説放送を参考にしています。 https://www.youtube.com/watch?v=GDuzZIuWs2Q A - Round Up the Mean  a+b+1の平均を取れば良い。 #include <bits/stdc++.h> using namespace std; int main() { cin.tie(0); ios::sync_with_stdio(false); int a,b; cin >> a >> b; cout << (a+b+1) / 2 << endl; return 0; } B - Two Anagrams  s,tをソートして、tを逆順にして比較すればおk。 #include <bits/stdc++.h> using namespace std; int main() { cin.tie(0); ios::sync_with_stdio(false); string s,t; cin >> s >> t; sort(s.begin(),s.end()); sort(t.begin(),t.end()); reverse(t.begin(),t.end()); cout << (s < t ? "Yes" : "No") << endl; return 0; } C - Good Sequence  数字が出てきた回数がその数字よりも少なかったら出てきた回数、多かったら回数-その数字で良い数列にすることができます。  数字が出てきた回数を数え上げるところで少し悩んだ。 #include <bits/stdc++.h> using namespace std; int main() { cin.tie(0); ios...

ksnctf #3 Crawling Chaos解いた

 ksnctf3問目の、Crawling Chaosを解いていきます。 問題   http://ksnctf.sweetduet.info/q/3/unya.html  と書いてあるだけです。こんなの初心者にはわかる筈ありません。3分も考えずに答えを見てしまいました。  どうやら書かれているurlのページへ行きソースを見ると、怪しい文字列が書いてあるようです。 <!DOCTYPE> <html> <head> <meta charset="utf-8"> <title>Crawling Chaos</title> <style> form { text-align: center; margin-top: 4em; } input { font-size: x-large; } </style> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> <script> (ᒧᆞωᆞ)=(/ᆞωᆞ/),(ᒧᆞωᆞ).ᒧうー=-!!(/ᆞωᆞ/).にゃー,(〳ᆞωᆞ)=(ᒧᆞωᆞ),(〳ᆞωᆞ).〳にゃー=- -!(ᒧᆞωᆞ).ᒧうー,(ᒧᆞωᆞ).ᒧうーー=(〳ᆞωᆞ).〳にゃー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーー=(ᒧᆞωᆞ).ᒧうーー- -(〳ᆞωᆞ).〳にゃー,(ᒧᆞωᆞ).ᒧうーー=(〳ᆞωᆞ).〳にゃーー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーー=(ᒧᆞωᆞ).ᒧうーー- -(〳ᆞωᆞ).〳にゃー,(ᒧᆞωᆞ).ᒧうーーー=(〳ᆞωᆞ).〳にゃーー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーーー=(ᒧᆞωᆞ).ᒧうーーー- -(〳ᆞωᆞ).〳にゃー,(ᒧᆞωᆞ).ᒧうーーー=(〳ᆞωᆞ).〳にゃーーー- -!(ᒧᆞωᆞ).ᒧうー,(〳ᆞωᆞ).〳にゃーーー=(ᒧᆞωᆞ)....

ksnctf #2 シーザー暗号を解くプログラムを作る

 CTFの練習のために、今回からksnctfの問題を解いていこうと思います。   http://ksnctf.sweetduet.info/  ksnctfの1問目はフラグをコピペするだけなので飛ばします。 問題   http://ksnctf.sweetduet.info/problem/2   EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.  問題ページには、この文字列だけ書かれています。  この暗号は、シーザー暗号と呼ばれるもので、アルファベットを同じだけずらしていくことで答えを得ることができるようです。  アルファベットを一つずつ自分でずらしていくのもアレなので、プログラムを書いてみました。C++です。 #include <iostream> #include <string> using namespace std; int main() { //暗号を入力 cout << "Code : "; string s; getline(cin, s); //フラグに必ず含まれるアルファベットを入力 cout << endl << "KeyWord : "; string key; getline(cin,key); for (int a = 0;a < 26;a++){ //一つずつずらす for (int i = 0;i < s.length();i++){ if (s[...

macbook proのretinaディスプレイでi3wmを楽しむ

 以前このブログでi3ウィンドウマネージャを紹介したことがあります。   https://linuxnosusume.blogspot.jp/2017/07/i3wm.html  i3wmは通常のモニターなら問題なく使えますが、macのretinaディスプレイのような高密度なモニターで使おうとすると、文字が小さすぎて使い物になりません。 小せぇ......  そこで、今回はi3wmをretinaディスプレイで使うために試した方法を紹介したいと思います。 自分の環境:  macbook pro 2016 13インチ(2560x1600)    parallels desktop lite 上のarch linux  ※parallels toolsをインストールし、表示>Retinaの解像度 を間隔を広くするに設定   ("サイズ調整される"を選ぶと解像度が落ちてしまうため) 方法 ~/.Xresourcesに以下の内容を書き込んでください。 Xft.dpi: 150 数値の部分は好みで変えても構いません。 書き込んだら以下のコマンドで反映して、i3wmを再起動してください。 $ xrdb ~/.Xresources 再起動すると表示が大きくなっているはずです。 終わりに  今回はi3wmのretinaディスプレイ用の設定を紹介しました。  お役に立てれば嬉しいです。

【Sierra】Macから出る音声を聞きながら録音【eqMac】

    ある日、急に、Macから出ている音を録音したい衝動にかられ調べてみると、どうやら"Soundflower"なるソフトの一強であることを知りました。   Soundflower  しかし、このアプリ、ダウンロードしようとするとGoogleから警告が来たり、いざ勇気を出してインストールしようとしてもエラーが出てできませんでした...  そこで、ダメもとで設定の サウンド>入力 を見てみると...  んっ? あれっ?  えぇぇぇ、eqMacあるやん!!!! eqMacとは  eqMacは、Macの為のイコライザで、昔macでイコライザを使いたい衝動にかられたときに導入したものでした。   eqMac  ダウンロードは上のサイトから無料でできます。  eqMacはMacにはオーディオデバイスとして認識されるようで、出力デバイスだけだと思っていたものが入力デバイスとしても認識されていたので驚いたのでした。 いざ、設定  設定の サウンド>入力 で"eqMac"を選択したら QuickTime Playerを起動し、ファイル>新規オーディオ収録 を選択します。 頼む!! そこで現れたこのウィンドウでいざ収録!! 結果  結果、eqMacでオーディオ収録、できました!!  音質もほとんど落ちることなく、自分も音声を聴きながら録音できました。 最後に    Soundflowerの欠点である、音が聞けない点をカバーし、しっかり録音もしてくれるeqMacをMacの録音に使うのもアリだと思います。  eqMacはイコライザとしても優れているので、ぜひ使ってみてください!    

unityでgoogle cardboardのゲームを作る時にコケた話

画像暗くてスミマセン  unityのバージョンアップやGoogle VR SDK for unityのバージョンアップでかなりネット上の情報が古くなってしまったのでうpします。  ツールのバージョン:      unity : 5.6.0f3 Personal                Google VR SDK : 1.60.0 どこが変わった?          一つサンプルプロジェクトを作ったのでそれを使って説明したいと思います。  まずは、Google VR SDKを落として来ましょう: https://developers.google.com/vr/  そうしたらunityでインポートしてください。 とりあえずGoogleVR/Demos/Environmentにあったかっこよさげなものを配置してみました。(マテリアルを黒くしています)  ここからが変わった部分です。  まずCreate Emptyして適当に名前をつけてそこにカメラを入れてください。  そこにGoogleVR/Prefabsにある、 GvrEditorEmulator をカメラと同じ階層に配置してください。  その後、GvrEditorEmulatorを選択し  上のCameraの部分に同じ階層にあるカメラを選択してください。  ちなみに、ここでGame Viewにしても二眼にはならないので注意してください。 また暗くてスイマセン  また、Altキーを押しながらマウスを動かすと、スマホの傾きをエミュレートすることができます。  次に、File > Build Settingsからプラットホームを選択し、Player Settingsを開きます。  上のVirtual Reality Supportedにチェックを入れ、Virtual Reality SDKsにCardboardを追加します。  後は通常通りビルドして実行するだけです。 二眼になりました! 最後に 今回はネット上に情報が少なかったので書いてみました。 ...

i3wm 厨二感溢れる軽量デスクトップ環境

 皆さんは、i3というデスクトップ環境をご存知ですか?  i3(i3ウィンドウマネージャ, i3wm)は、マウスをほとんど使わずに操作することができる、超軽量デスクトップ環境です。  またi3wmは、今現在最も新しい タイル型ウィンドウマネージャー で、マウスを使わずにカタカタカタ、ッターンとショートカットを打ち込むだけで画面がどんどん変わっていくので、側から見ると厨二感溢れるデスクトップ環境となっています。  今回は、i3wmのインストール方法と、使い方を紹介します。  余談ですが、i3に関してネットで調べるときには"i3"と検索するのではなく"i3wm"と調べると、ヒットしやすくなります。(某CPUや某電気自動車などが出てくるので) i3wmのインストール  今回は、ubuntuへのインストールです。(ちなみに自分はubuntu17.04)  まずはi3wm本体のインストール $ sudo apt install i3 次にdmenuとcomptonをインストール $ sudo apt install dmenu compton dmenuはi3wmでアプリケーションを起動するときに使い、 comptonはターミナルの透過のために必要なものです。 インストールが終わったら再起動してログイン画面でデスクトップ環境を"i3"にしてログインします。 使い方  i3wmが開くと次のような質問をされます。 ~/.config/i3/config を作るか modキーは何にするか configファイルは作っておいたほうがいいと思います。  modキーはi3wmにおいてショートカットを使うときに押すキーです。これはwindowsキーやcommandキーがいいと思います。  ここにショートカットに一覧を載せておきます。  (ちなみに下の変なマークはmodキー) Basics  + ↩︎ open new terminal  +  j focus left  +  k focus down  +  l focus up  +  ; focus right ...

ページビューの合計

ラベル一覧を表示