みちのいに!!

自分のメモと、他にもハマる人がいそうなことを書く

Nimでintの累乗が実は ^ で出来る話

プログラミングに慣れている人ほど引っかかりそう.

Nimで累乗計算するときはmathモジュールをインポートします.

mathモジュール内には累乗に関する以下の3つの函数が定義されています.

proc `^`*[T](x: T, y: Natural): T 
proc pow(x, y: float32): float32
proc pow(x, y: float64): float64

指数が自然数の場合は^を使いましょう.

以下雑感

続きを読む

Nimをnodejsにコンパイルして競技プログラミングした

こんにちは 最近Nimで競技プログラミングをすることにハマっています.

準備

Nimとは?

プログラミング言語です.Pythonライクな文法で気軽に書けます.C言語を介してバイナリを吐くので実行時間はとても早いです.JavaScriptも吐くことができます.

競技プログラミングとは?

問題をプログラミングで解くコンテストです.国内のコンテストサイトには Atcoder, Aizu Online Judge(AOJ), yukicoder, paizaなどがあります.

背景

  • AOJを解こうとしたらNimが使えなかった.
    • ちなみにAtcoderとyukicoderでは使えます.
  • どうしてもNimで書きたかった.
  • Nimの良さの一つは早いことだがこの際仕方ない.JavaScriptで吐いて提出しよう.

解説

普通に解いてコンパイルして投げるだけと思いきや,JavaScriptに吐くときはstdinが使えません.この点だけ注意します.

AOJ 1000 A + B Problem を例に解説します.問題自体は足すだけです.

1.普通にNimで解く

普通に解きます. ただし,NimのstdinはCのstdio.h由来であるため,JSにコンパイルするときは利用できません.そこで,以下のように入力を受け取るmain函数を作ります. mainの引数には適当にテスト用の文字列でも埋め込んでください.

import strutils, sequtils

proc main(inputLines:string): void=
  var 
    input = inputLines.split('\n')
  for line in input:
    var 
      tmp = line.split.map(parseInt)
      a = tmp[0]
      b = tmp[1]
    echo a+b

main("4 6\n3 1\n2 1")

2. JavaScriptコンパイルする

$ nim js -d:nodejs -o:aoj1000.js aoj1000.nim

aoj1000.jsが出力されます.

3. JavaScriptのファイルを編集する

ファイルを開くとやたら長いコードが出てきますが,一番下までスクロールします. すると,

main_53001(makeNimstrLit("4 6\x0A3 1\x0A2 1"));

という部分が一番下にあります.

この部分を標準入力を読み込むように改変します.

ここでは,http://koturn.hatenablog.com/entry/2016/02/04/050000 を参考にしました.

(function() {
  'use strict';
 
  var lines = [];
  require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
  }).on('line', function(line) {
    lines.push(line);
  });
  process.stdin.on('end', function() {
    main_53001(makeNimstrLit(lines.join("\x0A")));
  });
})();

4 完成

完成です.ファイルを全部コピーして提出します.

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=2961239#1

シェルにアスタリスク入れたらファイル一覧が出てきた

きっかけ

dotfiles(設定ファイルをGitHubに置いてどこでもマイ環境を構築できるスクリプト)を作ろうと思い,他人の設定を参考にしていたときに目にしたShell Scriptがこちら

cd ${DOT_DIRECTORY}

for f in .??*
do
  [[ ${f} = ".git" ]] && continue
  [[ ${f} = ".gitignore" ]] && continue
  ln -snfv ${DOT_DIRECTORY}/${f} ${HOME}/${f}
done

.??* ってなんだ?????????? どっと はてな はてな あすたりすく????????

続きを読む

GASでMastodonの投稿をTwitterに1分おきに同期する

2018-08-16追記: フォロワーのみ,Directは同期しないように変更 そのへんをいじりたい時は47行目あたりをいい感じに

目的

Mastodonの投稿を高頻度でTwitterに同期したい できれば無料で

おおまかな手順

  1. GASにプログラムをコピペする
  2. Twitterのアクセストークン,Mastodonのアクセストークンを取得する
  3. ライブラリを追加する
  4. 認証する
  5. トリガーを設定して1分おきに同期するようにする
続きを読む

JavaScriptで手っ取り早く64bit符号なし整数文字列の大小関係を比較

JavaScriptが53bitまでしか整数をまともに扱えないのはよく知られた話です.

JavaScriptの整数の精度が保たれるのは9007199254740991まで - Qiita

Twitterからのレスポンスは

id_str:'12345678765543212345'

のように文字列でJSONが降ってきます.

これをそのまま大小関係を比較するのはよくありません.

javascript 文字列のまま数字を比較すると危険が危ない。 - かもメモに詳しいように

'99'<'100' // false

となります.

しかし64bit整数は数値に変換しても不正確になるジレンマがあります.

そこで,

// ES5版
const pad0 = function(num){return ('00000000000000000000'+num).slice(-20)}
// ES6版
const pad0 = num => ('0'.repeat(21)+num).slice(-20)

pad0('99')<pad0('100') // true

という強引な解決策を提案します

'99'>'100'となる理由は桁が揃ってないから起こるのであり,桁を揃えてしまえばいいのです.

Ubuntu18.04などのGNOME3環境でデュアルディスプレイで壁紙を異なる画像にしたいならHydraPaper

つまりこういうことをしたいわけです. f:id:nakei:20180525214836j:plain

デスクトップごとに別の背景にしたいのです.

What is HydraPaper?

今年(2018年)作られたばかりの新しいアプリケーションです.

github.com

A Gtk utility to set two different backgrounds for each monitor on GNOME (which lacks this feature)

GNOMEでモニタごとに別の背景をセットするGtkUtility

最高ですね!!! 私は一年前からGNOME3を常用しているのですが,これができなくて悲しい思いをしていました.しかし,それも今日で終わりです!!!!!!!!!!

Ubuntuなどを使っている場合

Flatpakを用いてインストールします.

FlatHub: https://beta.flathub.org/apps/details/org.gabmus.hydrapaper

Flatpakの導入方法

https://flatpak.org/setup/Ubuntu/ の通り実行します

  1. デスクトップ上で右クリック→端末を開く
  2. sudo apt update
  3. sudo apt upgrade
  4. sudo apt install flatpak
  5. sudo apt install gnome-software-plugin-flatpak
  6. flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

ここで再起動すると,FlatHubからインストールできるようになるらしいのですが,現時点ではUbuntu18.04におけるflatpakの動作がおかしいので端末からインストールします. 7. flatpak install flathub org.gabmus.hydrapaper

左下のアプリケーション一覧からhydrapaperを検索すると起動します.

ArchLinux系を使っている場合

AURからhydrapaper-gitをインストールしてください.

packer -S hydrapaper-git

使い方

こんな感じ f:id:nakei:20180525222955p:plain

  1. Monitorを選択する
  2. 画像を選択する
  3. 右上の青いチェックボタンを押す

左上の三ボタンから対象ディレクトリの追加ができるようですが,私は動きませんでした.Pictureフォルダに追加しましょう.

三の右のボタンでウィンドウが全部閉じます. 壁紙を眺めましょう

プレゼンは結局なにを使えばいいんだ

にゃーん

この記事は3割愚痴です。

にゃん

プレゼン書くの辛い。よくわからない中二病を発症しているので、PowerPointは使いたくない。もっと良いツールがあるはずだ

なぜPowerPointを使わないのか

  • Linuxで書けない
  • なんか負けた気がする
  • 中二病
  • なぜWordを嫌ってLaTeXを使うのに、プレゼンはMSOfficeを使わなければならないのか??

使ってきたもの

  • reveal.js
  • Marp
  • Google Slides
  • Talkie.js

reveal.js

初めて使ったもの。JSのフレームワーク。長く使っていたので評価が甘い

よいところ

  • Markdown/HTMLで書ける
  • 数式がTeXで書ける(MathJax)
  • ブラウザで動く
  • 見た目がかっこいい
  • 左右と上下に動ける
  • Overview機能で効率よく移動できる
  • PDFに吐いて印刷できる
  • 発表者モードがある

つらいところ

  • デフォルトのCSSテーマが日本語にあまり合わない
  • Markdown中心で書こうとして多分自ら辛くなった

Marp

Electron製。和製。クロスプラットフォームアプリケーション(Win/Mac/Linux) 一回しかつかってない

よいところ

  • Markdownで書ける
  • 純粋にMarkdownだけで書ける
  • PDF出力
  • 発表者モード

つらいところ

Google Slides

Googleスプレッドシートの仲間

よいところ

つらいところ

Talkie.js

和製Reveal.jsって感じ

よいところ

  • 和製なので日本語で作ってもレイアウトに違和感が少ない
  • Markdown使える(使ってないけど)
  • ブラウザで動く
  • 構造が把握しやすいので好きにいじれる。(Reveal.jsは真面目にそういうことをしようとしたことがないだけかもしれない)

つらいところ

  • Reveal.jsより機能的にはシンプル
  • PDFも外部ツールを使えば吐けるようだがビルドできない
  • まだ発表してないけど、発表者モードがconsole.logだけらしい

結局

今書いてるスライドはTalkie.jsを使っている。Reveal.jsで日本語が書きやすいCSSを誰か書いてくれ〜〜。
Webslidesとかも気になっている。

Markdownでスライドを書く限界も感じているから、補完で高速にHTMLを書いていくのが後々のことを考えるといいのかもしれない。