読者です 読者をやめる 読者になる 読者になる

SUB.V8OS.NET

V8OS.NET のサブブログ

Let’s Encryptで手動で証明書を取得してみた

ある日、新しくドメインを取得してサイトを立ち上げようとした時に気がついた... Let’s Encrypt取得できない!

続きを読む

zshで便利なオプションの解説

zshには、便利な機能を有効化させるオプションが多数有ります。 しかし、多すぎたり、機能の名前がわからなかったりしています。 そこで、他の人の.zshrcをお借りして、機能の調査と解説をしようと思います。 調べたら、追記する方式なので、投稿の最初の方は何も書いてません!

続きを読む

Ubuntuでzplugを試してみる

最近、oh-my-zshがとっても遅い。git管理をしているフォルダに移動すると、コマンド毎に1秒止まる。。。 原因はわからない。もはや大きすぎて、手のつけようがない..。 なんとなせねば、

そう思い、新しいzshプラグインマネージャを導入してみたのであった

続きを読む

JuliaをHomebrewを使ってインストールしました!

Juliaは、科学計算や数値計算など高度な計算を行なうためのプログラミング言語です。

Julia lang公式サイト: https://github.com/JuliaLang/julia

Juliaインストール

MacOSXを前提に話を進めます。 Homebrewを使って、ちゃっちゃとインストールしちゃいましょう。 Github公式ページのページ下に「OS X Homebrew Tap」があるので、「brew tap」を利用します。

このインストール方法に従って、インストールを行います。

$ brew tap staticfloat/julia
Updating Homebrew...
==> Tapping staticfloat/julia
Cloning into '/usr/local/Homebrew/Library/Taps/staticfloat/homebrew-julia'...
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 10 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (10/10), done.
Tapped 5 formulae (40 files, 60.3K)
$ brew install julia

依存が結構ある...。インストールは5分ぐらいでした。

対話シェルはこんな感じ

上手くインストール出来ない場合

gccとかのバージョンによっては、正常にインストール出来ない場合があるみたいです。

libgfortran.dylibについてのエラーが出た場合は、以下のコマンドを打って再インストールしてくれ」って言ってます。

$ brew update
$ brew rm gcc openblas-julia suite-sparse-julia arpack-julia
$ brew install gcc openblas-julia suite-sparse-julia arpack-julia 

では、使ってみましょう

変数

とりあえず、こんな感じ

julia> x = 10
10

julia> x + 1
11

julia> x = 1 + 1
2

julia> x = "Hello World"
"Hello World"

それから、UTF-8文字も変数名に使用することが出来ます。もし、δを入力したかったら、\delta-tab と入力するとδに変換します。

julia> δ = 0.00001
1.0e-5

julia> 안녕하세요 = "Hello"
"Hello"

幾つかの組み込み変数も存在します。

julia> pi
π = 3.1415926535897...

型(Integer, Float)

Type Signed? Number of bits Smallest value Largest value
Int8 8 -27 27-1
UInt8 8 0 28-1
Int16 16 -215 215-1
UInt16 16 0 216-1
Int32 32 -231 231-1
UInt32 32 0 232-1
Int64 64 -263 263-1
UInt64 64 0 264-1
Int128 128 -2127 2127-1
UInt128 128 0 2128-1
Bool N/A 8 false(0) true(1)

ウェルノウンポートについて調べてみた

TCP/IPを利用した通信を行なう際に、特定の著名なサービスやプロトコルが利用することを予め予約されているポートをウェルノンポート(又は、予約ポート)と呼びます。

コンピュータにはポートが0~65535まで存在し、そのうち0~1023までがウェルノンポートとして使用されます。通常、アプリケーションでは1024~のポートを使用することが習慣となっています。

ポート番号の割当は、インターネットに関連する番号を統合管理している組織「Internet Assigned Numbers Authority(IANA) 」が管理をしています。

番号 TCP/UDP サービス/プロトコル 説明
20 TCP FTP(データ) ファイル転送(データ)
21 TCP FTP(制御) ファイル転送(制御)
22 TCP/UDP ssh セキュアシェル
23 TCP Telnet リモートアクセス
25 TCP/UDP SMTP メール転送

phantomjsをnodejsから利用する!

phantomjs。web関係に携わる人ならば、知らない人はほぼいないのでは無いでしょうか?

まぁ、知らない人もいるかと思うので、端的に説明すると「画面の無いブラウザ」です。 内部動作とか、あるURLに飛んだりとかをプログラマブルに利用することが出来ます。

しかしながら、このphantomjsはphantomjsというバイナリ中にjavascriptエンジンが組み込まれており、 nodejsなどのライブラリでは提供されていないために、利用するのが少々不自由です。

そこで、nodejsからphantomjsの機能を利用する方法を探しました。

有力そうなのは、この2つでした。

javascriptで策定中のasyncなどの新しい機能を積極的に取り入れる作者の心意気や、 apiのわかりやすさの面から、自分はphantomjs-nodeが良いのではという印象を受けました。

phantomjs-nodeを早速使ってみたいと思います。

準備

nodejsからphantomjsを使うための準備をしましょう

$ mkdir phantom-test && cd $_
$ npm init

# nodejsのバージョンがv5以上 <= (githubではそう書いてあるのだが、v7でないと動かなかった)
$ npm install phantom --save 

# nodejsのバージョンがv5未満
$ npm install phantom@2 --save

index.js

const phantom = require('phantom');

const USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36";


(async function() {
    const instance = await phantom.create();
    const page = await instance.createPage();
    await page.setting('userAgent', USER_AGENT)
    await page.on("onResourceRequested", function(requestData) {
        console.info('Requesting', requestData.url)
    });

    const status = await page.open('https://www.google.com');
    console.log(status);

    const content = await page.property('content');
    console.log(content);

    await instance.exit();
}());
$ node --harmony-async-await index.js

まとめ

以外に簡単に使うことが出来、非常に分かりやすかったです。

Elixirを初めてさわってみて、その感想

elixirインストール

$ brew install elixir
# これ、とても時間がかかる

標準ビルドツールmixの存在

$ mix new vercheckex

これでビルドしようって思ったら、対話環境あった

$ iex
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.3.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>

Hello Worldしてみる

iex(1)> IO.puts("はろーわーるど")
はろーわーるど
:ok
iex(2)> print
** (CompileError) iex:2: undefined function print/0

iex(2)> IO.puts("Hello World")
Hello World
:ok
iex(3)>

これをやってみる

(via 2016-2017年位にWeb界隈で流行りそうな言語、特にElixirについて by yodatomato)

iex(6)> 1..10 |> Enum.map &(&1 * 2) |> IO.puts
warning: parentheses are required when piping into a function call. For example:

    foo 1 |> bar 2 |> baz 3

is ambiguous and should be written as

    foo(1) |> bar(2) |> baz(3)

Ambiguous pipe found at:
  iex:6

2
4
6
8
10
12
14
16
18
20
[:ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok, :ok]
iex(7)>

出来たけど、なんかエラーでた。原因究明は後。次!

と、思ったけど対話じゃきつくなったので、ファイルで対応。拡張子は.exs。今回はfizzbuzz.exsで作成

$ cat fizzbuzz.exs
defmodule Calc do
  def doubleEven(num) when rem(num, 2) == 1, do: "odd"
  def doubleEven(num) do
    num * 2
  end
end

1..10
|> Enum.map &(Calc.doubleEven(&1))
|> IO.puts
$ elixir fizzbuzz.exs                                    1 ↵
warning: parentheses are required when piping into a function call. For example:

    foo 1 |> bar 2 |> baz 3

is ambiguous and should be written as

    foo(1) |> bar(2) |> baz(3)

Ambiguous pipe found at:
  fizzbuzz.exs:9

odd
4
odd
8
odd
12
odd
16
odd
20

出来た。またエラーが...

感想

まぁ、普通の言語。だが、関数型言語特有のワンライナーで書け、わかりやすいコードと気持ちよさ。 たまらん。

参考サイト