Hatena::ブログ(Diary)

Marginalia

2017-04-27

Linux のマルチブートについて(Ubuntu 17.04)

GParted の画像を見て下さい。
f:id:obelisk2:20170427233127p:image:w500

f:id:obelisk2:20170427233126p:image:w500
上の sda が本体の PC で、下の sdb は外付けHDD です。全部で 6つの Linux ディストリビューションインストールされているのがわかるかと思います。

sdb3 の Kubuntuいらない子なので、ここに Ubuntu 17.04 を入れてみようと思います。

まず、ubuntu-17.04-desktop-amd64.isoUbuntu の公式サイトからダウンロードして下さい。
それを Brasero などで DVD-ROM にイメージとして焼いて(ファイルのコピーではありません)インストールするのがふつうですが、僕の中古PC は DVDドライブの調子が悪いので、USBメモリにディスクイメージを焼きました。

$ su
# cat ubuntu-17.04-desktop-amd64.iso > /dev/sdX
# sync

sdX の X には実際の USBメモリデバイス名を入れて下さい。ここを間違えると簡単にシステムがぶっ壊れますので、慎重に。なお、USBメモリ内のすべてのデータが上書きされて失われますので、気をつけて下さい。

PC を再起動し、USBメモリをブートデバイス選択して(自分の PC では PC 起動時に [F12] キーで起動デバイス選択できます)インストールを開始します。USBメモリからのブートはどの PC でも可能なわけではないようです。無理な場合はふつうに DVD-ROM からブートして下さい。


f:id:obelisk2:20170428031556p:image:w500
インストールの言語に [日本語] を選びます。

f:id:obelisk2:20170428031553p:image:w500
[それ以外] を選びます。マルチブートはこれでやる必要があります。

f:id:obelisk2:20170428031702p:image:w500
今回は /dev/sdb3 にインストールします。

f:id:obelisk2:20170428031701p:image:w300
[利用方法] は ext4 を、[マウントポイント] は「/」を選択します。[初期化] はどちらでもよいでしょう。

f:id:obelisk2:20170428031700p:image:w500
ブートローダをどこに入れるかですが、HDD の先頭に入れればこの OSデフォルトのそれになります。ここでは外付けHDDGRUB をいれたくないので、/dev/sdb3 に入れることにします。ただし、これを選択するとそのままではインストールしたこの OSGRUB の起動メニューに現れないので、あとでフォローが必要になります。それで取り敢えず [インストール] を押せばあとはさほど問題ないでしょう(すべてデフォルトのままでいけると思います)。


さて、インストールが終了して PC を再起動させますが、このままでは入れた Ubuntu 17.04 が GRUB の起動メニューにありません。なので他のインストール済の OS から Grub Customizer を立ち上げます。Grub Customizer が入っていなければ、

$ sudo add-apt-repository ppa:danielrichter2007/grub-customizer
$ sudo apt-get update && sudo apt-get install grub-customizer

で入れます。
f:id:obelisk2:20170428031658p:image:w500
このように、インストールした Ubuntu 17.04 がメニューに出ているので、[保存] を押せば修正おわりです。

あとはもう一度再起動してみて、きちんと Ubuntu 17.04 が立ち上がるか確認して下さい。お疲れ様でした。


なお、以上はレガシーBIOS の場合です。最近の UEFI BIOS の場合はこれとは多少ちがうので注意して下さい。

意味不明

Linux Mint Debian Edition 2

W: http://packages.domain.com/dists/jessie/InRelease の取得に失敗しました  

W: http://packages.linuxmint-jp.net/linuxmint-ja/./InRelease の取得に失敗しました  

W: http://packages.domain.com/dists/jessie/Release.gpg の取得に失敗しました  packages.domain.com:http へ接続できません:

W: http://packages.linuxmint-jp.net/linuxmint-ja/./Release.gpg の取得に失敗しました  packages.linuxmint-jp.net:http へ接続できません:

W: http://dl.google.com/linux/chrome/deb/dists/stable/Release の取得に失敗しました  期待されるエントリ 'main/binary-i386/Packages' が Release ファイル内に見つかりません (誤った sources.list エントリか、壊れたファイル)

W: いくつかのインデックスファイルのダウンロードに失敗しました。これらは無視されるか、古いものが代わりに使われます。

「C言語 関数リファレンス」の pdf化

http://www.orchid.co.jp/computer/cschool/cref.html
このページを Rubyスクレイピングして pdf化する。
 

require 'bundler/setup'
require 'mechanize'

Dir.chdir('/home/***/man')
url = 'http://www.orchid.co.jp/computer/cschool/cref.html'
`wkhtmltopdf #{url} 001.pdf`

co = 2
agent = Mechanize.new
agent.user_agent_alias = 'Linux Firefox'
agent.get(url).css('table')[3].css('a').each_with_index do |node, i|
  next if i.odd?
  u = URI(url).merge(node.attribute('href').value).to_s
  `wkhtmltopdf #{u} #{("%03d" % co) + '.pdf'}`
  sleep(1)
  co += 1
end
`pdftk *.pdf cat output c.pdf`

「wkhtmltopdf」と「pdftk」が必要。Linux Mint 18 で確認済み。

2017-04-14

OpenGL の Ruby ミニライブラリ

まだ開発中です。

miniopengl.rb

require 'opengl'
require 'glu'
require 'glut'
require 'matrix'
include Gl, Glu, Glut, Math


module MiniOpenGL
  class Tool
    def initialize
      @clear_clr = [0, 0, 0]
      @clear_color_alpha = 0
      @color_alpha = 1
      @buffering = 0
      @depth_buffer = 0
      @depth = 0
    end
    attr_accessor :clear_clr, :clear_color_alpha, :color_alpha, :buffering, :depth_buffer, :depth
    
    def draw(&bk)
      glutDisplayFunc(bk)
    end
    
    def reshape(&bk)
      glutReshapeFunc(bk)
    end
    
    def repeat(msec, value = 0, &bk)
      a = proc do
        yield
        glutTimerFunc(msec, a, value)
      end
      glutTimerFunc(msec, a, value)
    end
    
    def timer(msec, prc, value = 0)
      glutTimerFunc(msec, prc, value)
    end
    
    def block(c)
      glBegin(c)
      yield
      glEnd
    end
    
    def line(x1, y1, x2, y2)
      block(GL_LINES) do
        glVertex2d(x1, y1)
        glVertex2d(x2, y2)
      end
    end
    
    def line3(x1, y1, z1, x2, y2, z2)
      block(GL_LINES) do
        glVertex3d(x1, y1, z1)
        glVertex3d(x2, y2, z2)
      end
    end
    
    def color(r, g, b)
      glColor4f(r, g, b, @color_alpha)
    end
    
    def clear_color(r, g, b)
      @clear_clr = [r, g, b]
    end
    
    def clear
      glClear(GL_COLOR_BUFFER_BIT | @depth_buffer)
    end
    
    alias display glFlush
    alias finish glFinish
    alias redisplay glutPostRedisplay
    alias clr_matrix glLoadIdentity
    alias swap_buffers glutSwapBuffers
    
    def init_modelview
      modelview
      clr_matrix
    end
    
    def init_projection
      projection
      clr_matrix
    end
    
    def modelview
      glMatrixMode(GL_MODELVIEW)
    end
    
    def projection
      glMatrixMode(GL_PROJECTION)
    end
    
    alias mmap glMultMatrixd
    alias mload glLoadMatrixd
    alias translate glTranslated
    alias rotate glRotated
    alias scale glScaled
    alias viewport glViewport
    alias perspective gluPerspective
    alias frustum glFrustum
    alias mpush glPushMatrix
    alias mpop glPopMatrix
    
    def stack
      mpush
      yield
      mpop
    end
    
    alias look_at gluLookAt
    
    def key_in(&bk)
      glutKeyboardFunc(bk)
    end
    
    def draw_vertex(c, dim, vtx)
      glEnableClientState(GL_VERTEX_ARRAY)     #頂点配列の有効化
      glVertexPointer(dim, GL_DOUBLE, 0, vtx)  #頂点配列の定義
      glDrawArrays(c, 0, vtx.size / dim)     #頂点配列の描画指定
    end
    
    def draw_elements(c, dim, vtx, id)
      glEnableClientState(GL_VERTEX_ARRAY)
      glVertexPointer(dim, GL_DOUBLE, 0, vtx)
      glDrawElements(c, id.size, GL_UNSIGNED_BYTE, id)
    end
  end
  
  def self.app(width: 300, height: 300, x: 200, y: 100, buffering: :off, depth_buffer: :off, title: "MiniOpenGL", &bk)
    t = Tool.new
    
    t.buffering = GLUT_DOUBLE if buffering == :on
    if depth_buffer == :on
      t.depth_buffer = GL_DEPTH_BUFFER_BIT
      t.depth = GLUT_DEPTH
    end
    glutInit
    glutInitWindowSize(width, height)
    glutInitWindowPosition(x, y)
    glutCreateWindow(title)
    glutInitDisplayMode(GLUT_RGBA | t.buffering | t.depth)
    
    t.init_modelview
    t.init_projection
    t.clear
    
    t.instance_eval(&bk)
    
    glClearColor(t.clear_clr[0], t.clear_clr[1], t.clear_clr[2], t.clear_color_alpha)
    glutMainLoop
  end
end

2017-03-17

Chrome Extension Note

https://developer.chrome.com/extensions
https://developer.chrome.com/extensions/api_index

注意

http://stackoverflow.com/questions/13591983/onclick-within-chrome-extension-not-working
Chrome Extension ではインライン JavaScript が書けない。なので onclick などの代わりに

document.getElementById("jump").addEventListener("click", hoge);

などで hoge() 関数を呼ぶようにする。

サンプル

ページの <body> 内の HTML を出力する拡張機能

manifest.json

{
  "manifest_version": 2,
  "name": "Sample Extension",
  "version": "0.0.1",
  "browser_action": {
    "default_title": "",
    "default_icon": "icon_19.png",
    "default_popup": "popup.html"
  },
  "permissions": [
    "notifications", "tabs", "https://*/*", "http://*/*"]
}

popup.html

<link rel="stylesheet" type="text/css" href="popup.css">
<script type="text/javascript" src="popup.js"></script>
<p id="message">test</p>

popup.css

p {color: blue;}

popup.js

chrome.tabs.query({
  "currentWindow": true,
  "status": "complete",
  "active": true
}, function(ar) {
   chrome.tabs.executeScript(null, {file: "getPageSource.js"});
});

chrome.runtime.onMessage.addListener(function(html) {
  html = html.replace(/</g, "&lt;")
  document.getElementById('message').innerHTML = html;
});

getPageSource.js

var html = document.getElementsByTagName('body');
html = html[0].innerHTML;
chrome.runtime.sendMessage(html);

2017-03-15

OCaml を Linux Mint にインストール

OCaml.jp

$ sudo apt-get install ocaml

$ ocaml
        OCaml version 4.02.3

# print_string "Hello, World!\n";;
Hello, World!
- : unit = ()
# #quit;;
$

 
コンパイル

$ ocamlc helloworld.ml
$ ./a.out
Hello, World!
$ ocamlc -o hello helloworld.ml
$ ./hello
Hello, World!

helloworld.ml

print_string "Hello, World!\n"

Linux Mint 18 で確認。

サンプルコード

階乗
factorial.ml

let rec factorial n =
  match n with
    0 -> 1
  | n -> n * factorial(n - 1) in
print_int(factorial 5)
(* 120 *)

フィボナッチ数列
fibonacci.ml

let rec fib n =
  if n < 2 then 1 else fib(n - 1) + fib(n - 2);;
let main () =
  let arg = int_of_string Sys.argv.(1) in
  print_int(fib arg);
  print_newline();
  exit 0;;
main ();;
$ ocamlc fibonacci.ml
$ ./a.out 10
89