Bash on Ubuntu on WindowsとWindowsでクリップボード共有っぽいことする

初投稿です.既出だったら許してください. Qiitaに投稿したやつをここにも残しときます

qiita.com

Windows10は2017年4月11日にCreators Updateが配信されました. そこで新しく追加された機能の中に「Windowsアプリケーションとの相互運用」があります.
今回はこれを利用して,Bash on Ubuntu on Windows(以下BoW)とWindowsとのクリップボード共有まがいのことをしてみようと思います.

準備

Windows10側での準備

まずはWindows10でのCreators Updateを行ってください.
そのあとghuntley/pasteboardreleasesから「pasteboard-v1.1.0.zip」をダウンロードしてください.この中の pbpaste.exe を使います.

ダウンロードし,展開したフォルダpasteboard-v1.1.0pasteboard にリネームした後,任意の場所に移動,コピーして環境変数pasteboard-v1.1.0 までのパスを追加します.

ここでは C:\app\pasteboard環境変数に追加しました.

コマンドプロンプトpbpaste と打って動くか確認したら準備は終了です.

BoW側での準備

改行コードや文字コードの変換に必要なnkf をインストールします.
sudo apt-get install nkf でインストール出来ます.Linuxはコマンド一つでインストール出来てとても楽ですね.

nkf --help と打ってヘルプが表示されたら準備は終了です.

作業

さぁ,実際に使うための作業をしましょう.
BoWを起動し,vim ~/.bashrc などで.bashrc を開きます.
ここに以下のコードを追加してください.

alias wcopy='clip.exe'
alias wpaste='pbpaste.exe'

保存して,source ~/.bashrc するかBoWを再起動してください.

使ってみる

windowsで適当なテキストファイルを作りましょう.ここではデスクトップにhoge.txt を作ってみます.

ばっしゅおんうぶんつおんうぃんどうず

ぽよよ

BoWで/mnt/c/Users/{Windowsのユーザ名}/Desktop に移動します.

cat hoge.txt | wcopy と入力するとコピーが出来ます.

その後pbpaste と打つとターミナルにコピーした内容が表示されますが,文字化けしていると思います.そこで間にnkf をはさみ,文字コードを変換してからコピーするようにします.

nkf -w hoge.txt | wcopy
(ちなみに,ここで改行コードをLFに変換してもclip.exe の仕様のせいかCRLFになってしまうっぽいのでwpaste したあとに改行コードを変換する必要があります)

wpaste で確認すると文字化けが解消されているかと思います.

また wpaste > out.txt とすることで wpaste の内容をout.txt に保存することが出来ます.

使い方まとめ

  • cat ファイル名 | wcopy でコピー
  • wpaste でコピーした内容が見れる
    • wpaste > ファイル名 でファイルに出力できる

以上でクリップボード共有まがいを実現する計画は完了です.
もし何かあったら,コメントかTwitterでリプしてくださると助かります.

2016年リリースデレマス曲個人的ランキング

この記事はProlab Advent Calendar 2016の"23"[::-1]日目の記事です.

www.adventar.org

だれ?

kurokoji(@kuro_koji_)です.
沖縄高専のメディア情報工学科2年の人間です.
久留米高専生ではないです.
情報オリンピック本選に出ます.宜しくお願いします.

藤忍佐々木千枝の担当をしています.

最近ではデレステのコミュ第39話 「The Words for LOVE」 にて,千枝が向井拓海藤本里奈大和亜季らを一喝するシーン

f:id:kurokoji:20170102003858j:plain

を見て

f:id:kurokoji:20170102003944j:plain

となっていました.

2016年リリースデレマス曲個人的ランキング

3位: Love∞Destiny

Love∞Destiny(佐久間まゆ,北条加蓮,小日向美穂,多田李衣菜,緒方智絵里)

第3位はデレステイベント LIVE Groove Dance burst(2016年6月30日から7月7日まで開催) にて登場した「Love∞Destiny」です.

出逢った瞬間に ココロは決まっていたの 未来永劫 添い遂げるって

好きな人に対する深い愛がストレートに伝わってくる曲であります. また,ぼくはこの曲のダンスが好きで,特に

f:id:kurokoji:20170102004004p:plain

f:id:kurokoji:20170102004008p:plain

の部分がめっちゃ好きです.

2位: 咲いてJewel

咲いてJewel(鷺沢文香,速水奏,橘ありす,塩見周子,二宮飛鳥)

第2位にランクインしたのはTHE IDOLM@STER CINDERELLA MASTER Cool jewelries! 003 に収録されている,「咲いてJewel」です.

前奏とかのテレテレテレテレ↑テレテレテレテレ↓テン↑テテテン↓(楽曲試聴で11秒あたりとか)がすごい好きです.

曲中の

「誰も知らない調べが」

の部分はありす (橘ですっ!!) が歌っているのですが,これがね,最高なんですよ.

1位: ハイファイ☆デイズ

ハイファイ☆デイズ(佐々木千枝,櫻井桃華,市原仁奈,龍崎薫,赤城みりあ)

堂々の1位にランクインしたのはLIVE Groove Dance burst(2016年3月31日から4月7日まで開催) にて登場した「ハイファイ☆デイズ」です.担当の千枝がいるよ!!

「昨日の涙は今日の勇気」

流した涙は決して無駄ではない,未来への糧となるんだというのが伝わってきます. 落ち込んでいるときに是非聴きたいパッションな曲です.

番外編 ~カバー曲~

jewelriesシリーズには,選出メンバーそれぞれがカバーした曲も収録されています.その中で好きなものを上げたいと思います.

きみにとどけ

きみにとどけ(橘ありす)

THE IDOLM@STER CINDERELLA MASTER Cool jewelries! 003 に収録されている,橘ありすが歌う「きみにとどけ」.

「きみにとどけ」は2009年10月6日から放送されたTVアニメ「君に届け」の主題歌です.

一番最初に聴いたとき,ありす(佐藤亜美菜さん)のウィスパーボイスと歌詞・メロディがマッチしており耳がとろけるかと思いました. 大音量&(イヤホン|ヘッドホン) で聴くことを強くオススメします.

佐藤亜美菜さんは天才だと思います.
リクエストしたミノPさんは天才だと思います.

みんなCD買おう

どうでしょうか.言葉は少々足りないと思いますが,多少は興味を持ってもらえたのではないでしょうか.

これは裏話なんですが,ぼくが初めてCDを買ったのがこのデレマス関係でして(このときはTulipとPaJe002を買った)自分でも驚きです.お金を掛けられるほど好きなものが出来たのも初めてです.デレマス,いや,アイマスはこれからの僕の人生に大きい影響を与えそうです.

デレマス全然しらないぞ,デレマス分かるけどデレステ程度でしか曲聴かんぞ,という方もこの機会に是非ともCDをご購入いただき,この世界にどっぷりと浸かって頂きたいです.
jewelriesシリーズはボイスドラマも入ってるし最高だよ!!最高!!

明日はふなちさんです.

第16回日本情報オリンピック 2016/2017 予選に参加した話

結果

これと比較した感じだと380点でした.
提出ミスしてなければ幸いです.
(追記) 360点で予選通過してました.プロ各位宜しくお願いします.ちなみに5問目の1ケースにinputを投げてしまい,20点を失いました.

1問目

やるだけ.もうちょっとコンパクトなコードを書きたかった.無駄な部分が多い.

// テンプレ省略

signed main() {
  int a, b, c, d, e;
  cin >> a >> b >> c >> d >> e;

  int ans = 0;
  if (b == a) {
    print(ans);
    return 0;
  }
  if (a < 0) {
    ans += c * abs(a);
    a = 0;
  }
  if (a == b) {
    print(ans);
    return 0;
  }
  if (a == 0) {
    ans += d;
  }
  print(ans + (b - a) * e);

  return 0;
}

2問目

これもやるだけ.b は使わなくていい.

signed main() {
  int n, m;
  cin >> n >> m;
  int ans = 0;
  vi a(m);
  REP(i, m) {
    int b;
    cin >> a[i] >> b;
  }
  sort(ALL(a));
  reverse(ALL(a));
  REP(i, m - 1) {
    if (a[i] < n) {
      ans += (n - a[i]);
    }
  }
  print(ans);

  return 0;
}

3問目

D という長さになればいいのである地点から東西南北4方向を見て# でなければそこからdfsをして,深さがD になったら答えに1加える.方向を引数でもってやればいい.最終的に出た数は被りがあるので2で割ってやる.別にfor でやっても良かった.
例年の3問目よりかなり簡単なのでは.多分ここらへんまでで30~40分.

int n, m, d;
char s[128][128];
int ans;

void dfs(int y, int x, int dep, int ddy, int ddx) {
  if (dep == d) {
    ans++;
    return;
  }
  int ny = y + ddy, nx = x + ddx;
  if (!inside(ny, nx, n, m)) return;
  if (s[ny][nx] == '#') return;
  dfs(ny, nx, dep + 1, ddy, ddx);
}

signed main() {
  cin >> n >> m >> d;
  REP(i, n) cin >> s[i];

  REP(i, n) REP(j, m) {
    if (s[i][j] != '#') {
      REP(k, 4) {
        int ny = i + dy[k], nx = j + dx[k];
        if (!inside(ny, nx, n, m)) continue;
        if (s[ny][nx] == '#') continue;
        dfs(i, j, 1, dy[k], dx[k]);
      }
    }
  }
  print(ans / 2);

  return 0;
}

4問目

テストケース1~3まで通しました.bitDPらしいですね.わかりません.
脳を完全に停止してnext_permutation() をし,順列を全列挙した.順列は最大でm! 種類あるのでm が大きい値だと計算量がまずい.このコードだとO(n * m!)になりますかねえ.ひどいなこれ. 順列と元のぬいぐるみと比較して,違う種類だったらカウント.そしてmin をとる.1時間ぐらいずっと回してた.

signed main() {
  int n, m;
  cin >> n >> m;
  vi a(n), b(m), cnt(n + 1);
  REP(i, m) b[i] = i + 1;
  REP(i, n) {
    cin >> a[i];
    cnt[a[i]]++;
  }
  int res = INF;
  do {
    int c = 0;
    int idx = 0;
    REP(i, m) REP(j, cnt[b[i]]) {
        if (a[idx++] != b[i]) c++;
      }
    }
    chmin(res, c);
  } while (next_permutation(ALL(b)));
  print(res);
  
  return 0;
}

問題5

解法が思いつかず,適当にdfsしたら1ケース目は通った.残りはなんかセグフォが起きたので諦めた.

int h, w;
vvi a;
int sum = 0;
bool vis[1000][1000];

void dfs(int y, int x, bool fi = false) {
  bool flg = false;
  REP(i, 4) {
    int ny = y + dy[i], nx = x + dx[i];
    if (!inside(ny, nx, h, w)) continue;
    if (a[y][x] > a[ny][nx]) {
      flg = true;
      dfs(ny, nx);
    }
  }
  if (!flg && !fi && !vis[y][x]) {
    sum++;
    vis[y][x] = true;
  }
}

signed main() {
  cin >> h >> w;
  a = vvi(h, vi(w));
  REP(i, h) REP(j, w) cin >> a[i][j];
  int res = 0;
  REP(i, h) REP(j, w) {
    memset(vis, 0, sizeof(vis));
    sum = 0;
    dfs(i, j);
    if (sum > 1) res++;
  }
  print(res);

  return 0;
}

問題6

拡張dijkstraらしいですね.
「いい感じにするdijkstraやろ!w」
と思ったけど,ぼくはスーパー適当なdijkstraを書いてsampleが通らないけど取り敢えず出しました.全ケース落ちました.コードは載せません. まぁでも,去年はdijkstraという言葉すら知らかったので成長はしたのかなという感じです.

感想

つらいです.3問目までめっちゃ簡単で「いけるやろ~」と調子に乗ったら,難易度が跳ね上がりました.明らかに精進不足です. もし予選通ってたら,本選までにDPとか克服していきたいです.

あと3問目まで答えを格納する変数名がans なのに4問目からres なのウケますね.

あー ねんまつ

JOI予選お疲れ様です

疲れました.僕は多分380点です.

この記事はICT Advent Calender2016 11日目の記事です.

僕が今年出た大会まとめ

今年は,去年より大会に出たいという気持ちが大きかったからか,多くの大会に出てるような気がします.
この中では,パソコン甲子園2016プログラミング部門もう一つの本選で8位になれたことは印象に残っていて,「工藤忍北条加蓮というチーム名がPCKのホームページに載っているのが面白かったです.因みに,FirstACも取れてウケてます.来年は本選に行きたいと思います.

覚えた・習得したこと

  • C#(高専プロコンでGUIを作った)
  • 競プロ(去年からやっているが今年は結構成長出来たと思う)
  • vim(今年からプラグインとか入れてる)
  • 画像処理(高専プロコンでほんのすこし触った)

興味があること

  • マラソンマッチ系の大会(まだ出たことないのでCodingameとかやっていきたい)
  • CTF(少しだけやって結構面白かったのでやりたい)
  • 画像処理(面白そう)
  • バイル系アプリ開発(Androidとかやりたい)
  • Python(面白そう)

欲しいもの

今年なんかめっちゃオタクになったっぽい

もうちょっとでモバマスのほうもPLvが100超えそうですし,デレステも楽しいですし(絶対特権主張しますっ!がすき),佐々木千枝は心臓が痛くなるほど可愛いし,工藤忍はリンゴの皮を剥くのが上手いです.
CDも結構買ったような気もします.

あと最近は冴島清美ちゃんが僕の中でキテます.














逸れ!w話が逸れ過ぎてシルク・ド・ソレイユになった!w














そんなことはどうでもよくて

来年からどうなるんだろうという不安があります.
何でも出来る人@orisano先輩が卒業されるので,ICT委員会の技術力が著しく低下するのでは,ということがあります.

僕もorisano先輩には色々教わっていますし,他の人もそうだと思います.しかし,来年はいません.今度は僕らが後輩に教えないといけません.特に競技プログラミングは誰が引っ張っていくのでしょうか.今,一番出来る人は@37kt_先輩なので是非とも後輩教育をお願いしたいものです.僕もやりますけど.

来年の目標

  • 高専プロコン競技部門†優勝†
  • パソコン甲子園2017プログラミング部門本選出場
  • SuperCon2017本選で上位

この3つの目標を達成するために頑張っていきたいです.

最後に

以上です.

明日は@yagamian_sobaya先輩と@Luzhiledです.
昨日は@manae_manawayでした.

#procon27 でホントの魅力はミエなかった(競技)

皆さんお疲れ様でした.
初めてのプロコン参加です.

結果

僕達,沖縄高専「罪深さ優先探索」は準決勝敗退でした.
悔しい,というかスッキリとしない結果になってしまいました.

というのも

今回の競技部門は

「ホントの魅力がミエますか?」

というタイトルで,概要としては

(1) 1 つの図形から切り出した複数の「ピース」と1つの「わく」が与えられます。
(2) 「わく」の内にすべての「ピース」を早く並べるパズルです。余分な「ピース」はありません。
(3) 競技終了後,「ピース」が重なっていたり,「わく」からはみ出していた場合には,審判がその「ピ ース」を取り除きます。取り除いた「ピース」はカウントされません。
(4) 「わく」の内にすべての「ピース」を並べ,かつ最も回答時間が早いチームが勝ちとなります。
すべての「ピース」が並べられない場合は,多くの「ピース」を並べたチームの勝ちとなります。
第27回プロコン募集要項

です.

去年の「石畳職人Z」と大きく違い,解答するときに提出するものがアナログであることに違和感を覚えました.
またピースやわくの情報もデジタルで与えられず,自分らでそれを取得する必要があるのも驚きました.

チームの方針

当初はスタンドスキャナでピースやわくを撮影し頂点座標を取得する予定でしたが,いざやってみると画像の歪みが発生してしまうこと,環境固定が面倒なことから,本番1週間前くらいにバスパワー駆動するフラッドヘッドスキャナで撮影する,というふうになりました.
もっと早い段階でこのことに気づけば結果は変わったんですかね(?) 画像処理担当はコーヤ先輩でした.詳しい話は後々上がると思います.

ソルバはorisano先輩でした.こちらも詳しい話は後々上がると思います.

ちなみに僕の担当はGUIで.ピースやわくの表示,それらをソルバに渡すなどのパイプ的役割の部分を担っており,割と重要な部分でした.フォームなどの作りやすさから,言語はC#を選択しました.実際に使ったやつ↓

github.com

本番

本番の1回戦
枠のマージに失敗してしまい,完全に人力になりました.(通過)

準決勝
ピースに0角形が含まれていてバグる.
手動で修正して,枠を撮影せずにorisano先輩が作ったいい感じの組み合わせを作ってくれるやつに流し込んだ.
それをほんのちょっと参考に(本当か?)しながら人力でやっていました.(敗退)

準決勝の結果(沖縄は第1試合)を見てもらえば分かると思いますが,通過した3チームは全て3分以内で提出しており(人力),尚且つmax-1なので,ピースの読み込みに4分くらい掛かる僕達のシステムではどうあがいても無理でした.

つらい

ひたすら題材がつらいイメージの競技部門でした.
あと,運営が決めたレギュレーションに運営自身が違反するというなんともいえないことも起き,めちゃくちゃでした.

極めつけは
優勝が人力
であることです.

これは一体何コンテストなんだろうか...
運営さん.三重のホントの魅力はミエましたか?僕はミエませんでした.

来年はまともな出題であることを祈っています.

反省

やはり一通りシステムを動かすというのは大切です.動かさないと見えない問題などもあるからです.
実は通しをしたのが当日のAM4:00で,そりゃ本番で動かないよなと納得できてしまいました.
これは毎年言われてるそうなので,改善すべき一番のポイントなのかなと感じます.
また,ソルバを書く人が一人しか居なかったことも問題でした.
マラソンマッチ的な競技では,複数のアルゴリズムを実装すべきでしたが今年はソルバを書く人がorisano先輩しかおらず非常に申し訳ないという気持ちと自分の実力不足が身にしみて分かりました.
そのためにはマラソンマッチに慣れる必要があるので,今日以降からは積極的に取り組んでいきたいと思っています.

高専プロコンに出場された皆様,及び関係者の皆さんお疲れ様でした. #procon28でまた会いましょう.

AOJ0595 - Schedule

DPが出来なさすぎてつらいので練習

AOJ0595(Schedule)

コード

// 8種類の選び方 N日のスケジュール
int dp[8][1010];
const int mod = 1e4 + 7;

int getid(char c)
{
  if (c == 'J') return 0;
  if (c == 'O') return 1;
  return 2;
}

// 責任者が居ない場合を除外
void exclude(int now, int id)
{
  REP(i, 8) {
    if ((i & (1 << id)) == 0) {
      dp[i][now] = 0;
    }
  }
}

signed main()
{
  int N;
  string s;
  cin >> N >> s;

  REP(i, N) {
    // 一日目はJの参加が必須
    if (i == 0) {
      REP(j, 8) dp[j][i] = 1;
      exclude(i, 0);
    } else {
      REP(j, 8) {
        REP(k, 8) {
          // 前日に居た人が一人でも居なければ飛ばす
          if (j & k) {
            dp[k][i] = (dp[k][i] + dp[j][i - 1]) % mod;
          }
        }
      }
    }
    exclude(i, getid(s[i]));
  }
  int ans = 0;
  REP(i, 8) {
    ans = (ans + dp[i][N - 1]) % mod;
  }
  print(ans);

  return 0;
}

メモ

分からなかったのでJOIの解説を見ながら実装した.
dp[出席状況][何日目] = スケジュールの場合の数 を表す.
dp[k][i] = (dp[k][i] + dp[j][i - 1]) % mod は前日までの場合の数( dp[j][i - 1] )を足していく処理.
REP(j, 8) REP(k, 8) の部分で昨日の出席状況に合わせ,ありうる今日の出席状況を全列挙している.(ここでは責任者がいない場合は考慮していない)
そのあとのexclude(i, getid(s[i])) で責任者がいない出席状況のときの場合の数を0 にしている.

出席状況をbitで管理するのは面白いなぁと感じた.

こんな感じで1 が立ってるところは出席していると判断する.

I O J
0 0 0 0
1 0 0 1
2 0 1 0
3 0 1 1
4 1 0 0
5 1 0 1
6 1 1 0
7 1 1 1

exclude() の中で責任者がいない場合を判断するために論理和を使っている.
if (j & k) は前日に居た人が居なかったら飛ばす(鍵が無いので出席できないから)ところでも論理和を使って上手く判定している.

また配るDPは最後に足す処理があることが多いらしい.覚えておこう.