Bashで実数で計算する時のメモ(awkを使う)

某Qiitaで記事がない

 自分も、Qiita時々参考にしたりしますよ。記事によっては、とても参考になるから。  でも、結構多くの記事がまったく参考にならない数行で終わるポエムとか多々あるんですよ。ここのブログの内容で人のこと言えるのか怪しいけど。  今回の内容がそんな例。今日は、某Qiitaの記事を真似て超短く記事を書くのがテーマ。

やりたい事

 整数と実数を格納した変数を2つ用意して、結果を新たな変数に格納する。(シェルスクリプトで)

 某Qii(ry では bc を使った方法が転がってるんで、そっちに興味がある方は勝手に参考にしてもらって、コッチでは、 awk にパイプラインで繋げて、結果を 変数 に格納する方法を取ります。(bcコマンド は桁数設定してやらないといけないから面倒い)  

例のコードでは、 半径 x = 5 、 π = 3.14 として計算するヤツ。

#/bin/bash
x=5
readonly pi=3.14

ans=`echo ${x} ${pi} | awk '{print $1 ^ 2 * $2}'`
 
echo ${ans}

 

 Qiitaってアレ、いくら記事が💩でも、SEOに強いから検索結果の上位に来られるからホント困る。(別にQiitaを嫌ってるわけではないんです。すっごい参考になる記事はある。ただ、それに対してホント💩なページが多すぎるのが問題なだけ。)

 Googleには、記事の内容を上手く判断するのアルゴリズムを作って貰いたいわ。

Unixの考え方なSwiftプログラムを書いてみる。の巻

中の人、すぐ影響を受ける

 最近、「ゼロから作るDeep Learning」とか、「実践 Deep Learning」とか、「Python機械学習プログラミング」とか機械学習関係の本に手を出しすぎてる感があったので、一歩引いて、「少しは設計思想的な分野を齧ってみよう!」と思い、Unixの設計思想を学ぼうと「 UNIXという考え方―その設計思想と哲学」を読んだわけですわ。

 その中の「Small is beautiful.」と「全てのプログラムはフィルターとして振る舞うように作れ。」 に特に感化され...といった感じで書いたプログラムのお話。

 

どんなものを作るか問題

 今回は、実験 & ノウハウの獲得が目的なので、以下のような簡単なもの。    

  • MacのFontBookで有名な宮沢賢治の「ポラーノの広場」の一節を標準出力で返すプログラム。(returnStringと呼ぶ事にする)
  • 標準入力で受け取った文字列の文字数をカウントするプログラム。(countと呼ぶ事にする)

(特定の文字列を出すプログラムはまだしも、文字数カウントなんてwcコマンドじゃないかとか、車輪の再発明Unix哲学に反するぞ!とかは禁句)

 上の2つのプログラムをパイプでつないで、最終的にテキストファイルに結果を書き出すまでが今回の実験。

イメージ的にはこんな感じ↓

f:id:Hiro2201:20180516234350p:plain
それぞれのプログラムをシェルスクリプトでつないで、結果をリダイレクトしたい。

さっそく、コードを書く

 二つのコードはそれぞれこんな感じ。特徴としては、print()readLine()ではなく、FileHandle.StandardInputFileHandle.StandardOutputを使っている点。

 

returnString.swift

// returnString
import Foundation

func returnString() -> String {
    let SquarePolano : String = """
              あのイーハトーヴォの
              すきとおった風、
              夏でも底に冷たさをもつ青いそら、
              うつくしい森で飾られたモーリオ市、
              郊外のぎらぎらひかる草の波。
              """
    return SquarePolano
}

let result = returnString() + "\n"
FileHandle.standardOutput.write(result.data(using: String.Encoding.utf8)!)

 

count.swift

// count
import Foundation

func count() -> Int {
    let standardInput = FileHandle.standardInput.availableData
    var dataString = String(data: standardInput, encoding: .utf8)
    dataString = dataString?.replacingOccurrences(of: "\n", with: "")
    dataString = dataString?.replacingOccurrences(of: " ", with: "")
    dataString = dataString?.replacingOccurrences(of: ".", with: "")
    dataString = dataString?.replacingOccurrences(of: ",", with: "")

    return (dataString?.count)!
}


let result = count()

let standardOutput = FileHandle.standardOutput
let dataout = "\(result)\n".data(using: .utf8)
standardOutput.write(dataout!)

 

 「文字コードがASCIIじゃなくてUTF-8じゃないか!教義に則ってないじゃなか!」とかって怒られそうだけど、UTF-8の方が世界の共通言語だし、移植性の面からみてもUTF-8の方がいいだろJKって事でコッチを採用(笑)

で、あとはコンパイルして、シェルスクリプト書いて実行すればOK

 当然のことですが、生成される実行ファイルはそれぞれ同じディレクリにある前提です。もちろん、シェルスクリプトも。    

cmd.sh

#!/bin/bash
cmd="./returnString | ./count > foo.txt"
eval ${cmd}

 あとは、同じディレクトリ上に生成された foo.txt の中身を確認してあげる。65が書き込まれているはず。

f:id:Hiro2201:20180517000942p:plain

終わりに

 今回の目的はSwift4の標準入出力を使ってパイプラインが可能なコマンドラインツールを作るのが目的だったので、なんとか完成。 Swift 3以前のNSFileHandleの記事は、いくつかあったもののSwift4は全く見つからなかったので、色々大変だった。

 みんな、iOSばっか書きすぎてパイプラインなんて興味ないのかね(笑)

UNIXという考え方―その設計思想と哲学

UNIXという考え方―その設計思想と哲学

実践 Deep Learning ―PythonとTensorFlowで学ぶ次世代の機械学習アルゴリズム (オライリー・ジャパン)

実践 Deep Learning ―PythonとTensorFlowで学ぶ次世代の機械学習アルゴリズム (オライリー・ジャパン)

[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

[第2版]Python 機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

Swift For TensFlow - Array input is not a constant array of tensors とエラーが出たら...

 最近、macOS上で使えるMarkdownエディタのQuiverを使って大学の研究室仲間や秋以降に研究室入りする3年生達のためにディープラーニング 用の教科書を書いてる(って言っても、ゼロから作るDeepLearningをベースに更に噛み砕いてるような物だけど...)今日この頃。

 今回は昨日に引き続き、Swift for TensorFlowのネタ。Playground上ではなく、Xcodeのプロジェクト上で走らせようと格闘していた時にで出来たエラーの解決法のお話。

 ちなみに、今回のこのページはMarkdownで書くってのが裏テーマ。

続きを読む

Swift For TensofFlow!

 いや〜、TensorFlow Swift いよいよ公開されましたね。TensorFlow Dev Summit で発表される前から、ずっとSwiftはポストPythonになるに違いないって勝手に思ってたわけですが(ry

youtu.be


てな訳で、今回は前回前々回と打って変わって真面目に技術系の話をチョチョっと書いておきます。


 後日、TensorFlowの勉強をしながらコード書くけど、今日はHello, Worldがわりにテンソル同士の足し算を↓



import TensorFlow
func test() {
    let a: Tensor<Float> = [[1,2], [3,4]]
    let b: Tensor<Float> = [[5,6],[7,8]]
    let sum = a + b
    print("Sum: \(sum)")
}
test()    // Sum: [[6.0, 8.0], [10.0, 12.0]]


あと、Swift、NumPy みたいなPythonのライブラリをそのままSwiftのコードに埋め込むことが出来るようになってるみたいなので、これは本格的にSwiftがPythonを駆逐して深層学習用の主要言語になって来るんじゃないか??Python → 研究用, Swift → 製品開発用 みたいな感じ?
github.com


Appleさん、Turi Create公開したけど、Googleにまたやられちゃったね...
でも、Swift for TensorFlow、macOS上のみって縛りがある代わりに、Metal2 APIを使えばAMDや噂のAppleGPUを使ったディープラーニングの高速化が出来るんじゃない?素人考えだけど…

また後日、ちゃんとしたポエムを書く予定。(未定)

「からかい上手の高木さん」 のドラマCDはミュージックじゃないねん。って話

 からかい上手の高木さん ブルーレイ1巻 最高でしたね。前回の高木さん for Windows on Macの話、まさかのフィンランド🇫🇮、ハンガリー🇭🇺、韓国🇰🇷、タイ🇹🇭、台湾🇹🇼、アメリカ🇺🇸となかなか国際色豊かな方がアクセスして頂いたらしく若干困惑😅

f:id:Hiro2201:20180418175924p:plain

Google Analytics (みんな高木さん好きだね笑)

 

 さて、本日(2018/04/18)は「からかい上手の高木さん Blu-ray 2巻」発売日。初回特典は「オーディオドラマCD 1」ということで、今回のテーマは

 

 「ドラマCDはミュージックじゃなくて別のアプリに分けたいんだ!!」

  

続きを読む