表音文字としての中国語

木簡によって万葉集以前の日本語表記がだんだん明らかになってきていますが、木簡の和歌(歌木簡)はすべて一字一音の字音表記で書かれているようです。

万葉集の万葉仮名のように訓読みがまざっていない。

漢字を表音文字として使っています。

 

まるで現代の中国語で西洋人の名前を漢字で書くのと同じなので、発音体系がまったく違うので似て非なるものだっただろうと思うものの、この方法であの時代の歌が残ったと考えるとすばらしいことだと思います。

 

表音文字として漢字をつかった例は他にもあって、仏典の翻訳時には

 

サンスクリット表音文字)を読み上げ -> 中国語に音写 -> 中国語に翻訳

 

という手順をとったそうです。この「中国語に音写」の部分が漢字を表音文字としてつかっている部分です。

 

また、元朝秘史というモンゴルの歴史書があってこれが中国語なのですが、ウイグル文字によるモンゴル語から漢字で音写して、中国語の訳をつけたものとして残っているそうです。ウィキペディアに画像があります。

これはその時代13世紀あたりの中国語もわかるので一石二鳥ですね。

 

参考

万葉集から古代を読みとく 上野誠

仏典はどう漢訳されたのか 船山徹

 

 

 

 

鬱という漢字の覚え方

躁うつ病とかのウツという漢字があります。

この字の覚え方はどういうのだったか忘れたので検索してみました。

 

昔会社で習ったのがでてきて、

 

きかんきわこめのはこいりひにみっつ(木缶木ワ米の凵いりヒに彡つ)

 

うむ。なるほどこれは覚えにくい、だから忘れたのか。

 

ほかにもあって

 

リンカーンアメリカンコーヒーを3杯飲んで鬱(林缶はあメリかン凵ーヒーを彡ばいのんでウツ)

 

というのがありました。こっちの方がいいね。

 


リンカーンは米のコーヒーを3杯飲んで鬱(林缶は米の凵ーヒーを彡ばいのんでウツ)
リンカーンコメダのコーヒーを3杯飲んで鬱(林缶は米ダの凵ーヒーを彡ばいのんでウツ)

 

とか。

Haskell演算子、中置記法の記号の読み方

--Haskell演算子中置記法の記号の読み方
! -> アレーのインデクス。(!) :: Ix i => Array i e -> i -> e
! -> 正格(strict)フラグ。foo !x -> foo strict x。とか
!! -> リストのインデクス。(!!) :: [a] -> Int -> a
$ -> カッコのかわり ($) :: (a -> b) -> a -> b
$! -> カッコのかわりの正格バージョン。$!以降が先に評価される
&& -> 論理積。(&&) :: Bool -> Bool -> Bool
() -> カッコ。ユニット型。() :: ()
* -> 掛け算。(*) :: Num a => a -> a -> a
*,#,?,??,~ -> カインド。型制約
*>,<*>,<* -> アプリカティブ。Applicative f => f a -> f b -> f b、f (a -> b) -> f a -> f b、f a -> f b -> f a
++ concat。(++) :: [a] -> [a] -> [a]
, -> カンマ。タプル型コンストラクタ。(,) :: a -> b -> (a, b)
-> -> 型コンストラクタ。カインド
. -> ピリオド。パイプ。関数の合成。(.) :: (b -> c) -> (a -> b) -> a -> c
/ -> 割り算。(/) :: Fractional a => a -> a -> a
/= -> 論理否定。(/=) :: Eq a => a -> a -> Bool
: -> コロン。コンス。リスト型コンストラクタ。(:) :: a -> [a] -> [a]
:: -> (の)タイプ(は)
:{,:} -> ghci上で複数行
< -> 小なり。Ord a => a -> a -> Bool
<$,<$> -> ファンクタ。(f)map。Functor f => a -> f b -> f a、 (a -> b) -> f a -> f b
<- -> 束縛、バインド(IOアクション)
<= -> 小なりイコール。Ord a => a -> a -> Bool
<> -> mappend。(<>) :: Monoid m => m -> m -> m
== -> イコール。(==) :: Eq a => a -> a -> Bool
=> -> 型制約。Ord a => a、とか。
> -> 大なり。Ord a => a -> a -> Bool
>= -> 大なりイコール。Ord a => a -> a -> Bool
>>,>>=,=<< -> モナド。バインド。Monad m => m a -> m b -> m b、m a -> (a -> m b) -> m b、(a -> m b) -> m a -> m b
@ -> as。アズパターン。ll@(l:ls)とか。
[ ] -> 空リスト。[ ] :: [t]
\ -> ラムダlambda。(\x -> x ^2) 3 -> 9
\& -> 空文字列"" -> 文字列パース用
_ -> ワイルドカードパターン。
| -> ガードの区切り。内包表記list comprehensionの区切り
|| -> 論理和。(||) :: Bool -> Bool -> Bool
~ -> 反駁不可能パターン。レイジーパターン。irrefutable pattners, lazy patterns
{ } -> レコード構文、記法(フィールドに名前をつける)ときの大カッコ。
^ -> 累乗。(^) :: (Integral b, Num a) => a -> b -> a
% -> 有理数有理数割り算。(%) :: Integral a => a -> a -> Ratio a


Haskell : タプルとリストの相互変換

-- convertlist.hs
-- 各種convertのプログラム。-> 練習問題
-- 1.タプルとリストの相互変換 -> [[1,2],[3,4]] -> [(1,2),(3,4)]
-- 2.タプルから2つのリストへ相互変換 -> [(1,'a'),(2,'b')] -> [1,2]['a','b']
-- 3.タプルからフラットリストへ相互変換 -> [(1,2),(3,4)] -> [1,2,3,4]
-- 4.任意の長さのタプルとリストの相互変換 -> (1,2,3,4) -> [1,2,3,4]
-- 5.リストからすべての組み合わせのタプルをつくる
-- 6.タプルから要素を抜き出してリストをつくる


-- concat flattens a list 1 tier at a time
-- concat [[1,2],[3,4]] -> [1,2,3,4]
-- implement concat'
concat' :: a -> [a]
concat'[ ] = [ ]
concat' (x:xs) = x ++ concat' (xs)

-- tuppleToList
-- tuppleToList [(1,2),(3,4)] -> [[1,2],[3,4]]
tuppleToList :: [(t, t)] -> [ [ t ] ]
tuppleToList = map (\(x,y) -> [x,y])

-- listToTupple
-- listToTupple [[1,2],[3,4]] -> [(1,2),(3,4)]
listToTupple :: [ [ t ] ] -> [(t, t)]
listToTupple = map (\[x,y] -> (x,y))

-- tuppleToTwoList
-- tuppleToTwoList [(1,'a'),(2,'b')] -> ([1,2], ['a','b'])
-- Prelude has zip and unzip
-- zip [1,2] ['a','b'] -> [(1,'a'),(2,'b')]
-- unzip [(1,'a'),(2,'b)] -> ([1,2],"ab")

-- tuppleToFlatList
-- tuppleToFlatList [(1,2),(3,4)] -> [1,2,3,4]
-- (concat.tuppleToList) [(1,2),(3,4)] -> [1,2,3,4]

-- tuppleToList4
-- tuppleToList4 (1,2,3,4) -> [1,2,3,4]
tuppleToList4 :: (a,a,a,a) -> [a]; tuppleToList4 (a,b,c,d) = [a,b,c,d]

-- make all the combination from a list
-- using list comprehension
-- (\ xs -> [(x, y) | x <- xs, y <- xs, x /= y]) ['a', 'b', 'c']
-- > [('a','b'),('a','c'),('b','a'),('b','c'),('c','a'),('c','b')]

-- filter from tupple list
-- map snd $ filter (odd.fst) [(1, 'a'), (2, 'b'), (3, 'c')]
-- "ac"

Haskellで行番号をつける

問題 : 任意のテキストファイルの各行に行番号をつけて画面に出すプログラムを作れ。

 

解答例

-- numberlines.hs
-- runghc numberlines.hs filename

import Data.List
import System.Environment
import Text.Printf

main :: IO ()
main = do
    args <- getArgs
    contents <- readFile $ head args
    let lineslist = lines contents
    let newlines = zipWith (\n str -> printf "%6.6d\t%s" n str) [1:: Int ..] lineslist
    let newcontents = unlines newlines
    putStr newcontents

 

出力例

runghc numberlines.hs sample.txt

000001 There was an Old Man of Nantucket
000002 Who kept all his cash in a bucket.
000003 His daughter, called Nan,
000004 Ran away with a man,
000005 And as for the bucket, Nantucket.
000006 anonymous

 

Haskellのランダムについて

Hakellは関数型言語で参照透過性とかを保証するために、同じことをやったら同じ結果が出ることが保証されているために、randomについてはちょっとというか相当ややこしい。


いまの私の理解は以下のようなものですが、これで合ってるか。

 

import System.Random
let dice=do;n<-getStdRandom(randomR(1,6::Int));return n

 

として、diceと打ち込むと1から6の範囲でランダムに数字を返してくれるので一見ランダムに見える。
がしかし、これは数字でないのでそのままでは使い物にならない。

 

dice + 3 -- > errorになる
n = dice -- > errorになる

 

タイプを調べてみると

 

:t dice -- > IO Int

 

となって、ただのIntに変換するためには一旦再度IOを通す必要がある。

 

n <- dice

 

とすると数字になる。


リストにしてみたらどうか。

import Control.Monad
replicateM 10 $ getStdRandom(randomR(1,6::Int))
-- > [5,6,5,4,4,2,3,5,1,6]

 

とかも IO [Int]なので、sumすることもできない。sumするためには

 

list <- replicateM 10 $ getStdRandom(randomR(1,6::Int))
list -- > [1,6,6,3,6,2,4,3,5,2]
sum list -- > 38


ということ。


Haskellは同じランダムのたねを入れるとランダムの返す値が同じになる。
なので、setStdGenで毎回同じタネを入れると同じランダム値になってしまう。

 

setStdGen(mkStdGen 12)
getStdRandom(randomR(0, 1.0))
0.13293852220286906
setStdGen(mkStdGen 12)
getStdRandom(randomR(0, 1.0))
0.13293852220286906

 

getStdGenで生成するStdGenは起動時にセットされたものを返してくるので、使うたびにStdGenを書き換えるnewStdGenとか、getStdRandomを使う必要がある。

 

getStdGenを使うとこんな感じです。ランダムな値が全部同じになってしまいます。
gen <- getStdGen
take 10 $ randomRs (1,6) gen
[1,6,5,1,3,5,6,5,5,4]
take 10 $ randomRs (1,6) gen
[1,6,5,1,3,5,6,5,5,4]
gen <- getStdGen
take 10 $ randomRs (1,6) gen
[1,6,5,1,3,5,6,5,5,4]

 

newStdGenを使うと次のように毎回違った値になりますが、やはり毎回呼び出す必要がある。


gen <- newStdGen
take 10 $ randomRs (1,6) gen
[4,1,3,3,4,2,3,2,6,4]
gen <- newStdGen
take 10 $ randomRs (1,6) gen
[5,2,4,2,3,3,3,5,1,6]
gen <- newStdGen
take 10 $ randomRs (1,6) gen
[1,2,2,2,4,3,3,4,3,3]
gen <- newStdGen
take 10 $ randomRs (1,6) gen
[3,1,1,3,5,1,5,5,6,6]

 

これだとIO Intではなくてただのリスト[Int]なので扱いは楽です。

 

ラムダ式にくるんで、ひとつの関数内でIO IntからIntにできないかと考えたのですが、できませんでした。できたら関数プログラミングでなくなってしまう。かも。

 

いまの結論:


newStdGenを使う。毎回呼び出す。gen <- newStdGen。
randomRsを使う。

 

問題1: '0123456789ABCDEEFGHIJKLMNOPQRSTUVWXYZ'内の文字をランダムに並べる。
問題2: 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん'をランダムに用いて5,7,5の俳句をつくる。

 

問題1: 解答例

-- random36.hs
-- runghc rndom36.hs

import System.Random
import Data.List
import Control.Monad

main :: IO ()
main = do
    gen <- newStdGen
    let randomlist = take 30 $ randomRs (0,35::Int) gen
    let result = map (str!!) randomlist
    putStrLn result

str="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

 -- 出力例

Z8CIZZB9OTO6RDTHI2YW0A0LN9RFU2
R6PZKKZ4MVJFKI8ALNU7GGWXB48987

 

 

問題2: 解答例

-- randomhaiku.hs
-- runghc randomhaiuku.hs

import System.Random
import Data.List
import Control.Monad

main :: IO ()
main = do
    gen <- newStdGen
    let first = map (str!!) $ take 5 $ randomRs (0, 47::Int) gen
    gen <- newStdGen
    let second = map (str!!) $ take 7 $ randomRs (0, 47::Int) gen
    gen <- newStdGen
    let third = map (str!!) $ take 5 $ randomRs (0, 47::Int) gen
    let result = unwords [first, second, third]
    putStrLn result

str="あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん"

-- 作品例
-- やふるれな えかねもひんは よゆいのて
-- はゐへおき れつしゐきによ ぬきよるお
-- ゆんのしは おはすおはねせ らそむあね
-- ねろれすと りなのかとおな なえうわつ
-- ゆつゆのき おらとちすへち らふゑすお
-- りんうなあ くとりせきはり ゆこさけを
-- いははつろ つえけころれや をももかる
-- ぬんみやい らなとへいゐや とこゑねれ
-- やあなもも おふえふもりれ むちほつひ
-- ゑとしゐろ せをあよろめか んやとむる
-- ねかもはさ りみねてさやゆ はたろせう
-- むそうへめ いもらにりとけ ほのさちみ
-- むみうおわ いえりゐわなり ほれさるや
-- わほゆうみ しいはわみきと ゑりえりほ
-- ねうぬへん りへかにんころ はすみちゑ
-- てえならち もほえみちろう たてほひそ

 

 

Ubuntuのマウスポインターを大きくする

マウスのポインターを大きくする方法です。

 

目が悪くなってきたのと、起動時に無線マウスの反応が悪くて、マウスの矢印がすこしでも大きいといいかな、と思い探してやってみました。うまく行ったのでご報告。

 

環境はUbuntu 16.04です。

 

echo "Xcursor.size: 48" | tee ~/.Xresources
gsettings set com.canonical.Unity.Interface cursor-scale-factor 2

この方法だと再起動しても元に戻らない。

 

先日書いた方法(deconf-tools)では、再起動するともとにもどってしまうので、 記事を書き換えました。

 

以上