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

ズートピアのキャラクターのモデルを考えみた

世界観

  • ズートピア=アメリカ
  • ZPD=FBI

草食動物

  • 草食動物=マジョリティー(白人)
  • ウサギ=あなた
  • ウサギの両親=中産階級の白人両親(悪意なく差別)
  • 羊副市長=トランプ?ヒラリークリントン?(戦争賛成、イラスム原理主義の過激派をの危険性を訴える)
  • ガゼル歌手=被差別を訴える南米系白人歌手(この声優のプロフィール)
  • バッファロー署長=白人警官

肉食動物

  • 肉食動物=マイノリティー(非白人)
  • キツネ=メキシコ系移民ヒスパニック(差別されて生活、貧困層)
  • イタチ=アフリカ系黒人(盗難、海賊版DVD販売など)
  • トラ=黒人警官、(警察署には肉食も草食もいるけどトップは白人で現場には黒人が多い)
  • ライオン市長=オバマ(黒人のアメリカ大統領、黒人、白人に人気あり、テロリストを捕まえて拷問)
  • 凶暴化肉食動物の保護施設の狼=CIA(と思ったけどCIAは白人が多い組織なはず、わからない)
  • 肉食動物の凶暴化=テロリスト
  • 夜の遠吠え=アッラーフアクバル
  • 交通局の怠け者=動物自体に意味はなく役所の手続きの遅さの揶揄
  • ネズミ=イタリア系移民(ゴッドファーザー)
  • ネズミの手下の白熊=黒人マフィア、

日本人が出てこないなと思っていたら、こちらを発見。 ブログデンティティー ズートピア

ネズミサイズの小さなアイスを何本も作ってレミングたちに売りさばき大儲け。 一匹が買ったら全員買うレミングのサラリーマンは、なんとなく日本人サラリーマンを揶揄している気がします。

なるほど

レミングで調べてみるとこんな記事も レミングの集団自殺神話 第一章 レミングの集団自殺について (Introduction)

日本人の周りと同じ行動をとるという国民性を、一緒に行動をするという性質を持つレミングで表現しているようです。

しかしレミングは草食動物なんですよね。当初の予想の草食動物=非白人から外れてしまいます。 肉食動物はアメリカでのマイノリティで、草食動物は先進諸国のその他の人たちという括りが正しいのかもしれません。

あとユダヤ人はどこかに描かれているはずだとは思うのですがわかりませんでした。 差別されていて金を稼ぐという意味ではキツネがユダヤ人という可能性もありますけど、子供の時にボーイスカウトでいじめられているので違うかと思います。

これ以外にもより細かくキャラクター設定は決まっていそうですね。

他にもズートピアのキャラクターのモデルやシーンの現実との対比に気がついた方は教えてください。

JAL国内ツアー 【ツアー】予約確認・座席指定・eチケットお客さま控発行、JMBお得意様番号登録方法

公式サイトに上記手順が見つからないので記事にしてみました。

共通

  • 1 JAL国内線−航空券 予約・空席照会・運賃案内−にアクセス
  • 2 国内線ご予約・購入済みのお客様をクリック f:id:sona-zip:20160212120405p:plain
  • 3 【ツアー】予約確認・座席指定・eチケットお客さま控発行 をクリック f:id:sona-zip:20160212120416p:plain
  • 4 必要な情報を入力して検索するをクリック f:id:sona-zip:20160212120423p:plain
  • 5 あとは予約確認・座席指定・eチケットお客さま控発行、JMBお得意様番号登録を実施してください。

eチケットお客さま控発行の場合

  • 1 先ほどのページ下部にスクロールして、タッチ&ゴーで搭乗する という項目の、eチケットお客様控えを発行するをクリック
    f:id:sona-zip:20160212120438p:plain

  • 2 送信したいユーザにチェックを入れてメールアドレスを入力して送信するをクリック
    f:id:sona-zip:20160212120444p:plain

  • 3 完了

スノーボードのビス(ネジ)、ショートビスについて

スノーボードのビスは専用品としてネットで1000円くらいで売っていますが、わざわざ高価な専用品を買う必要はありません。 ホームセンターやネット通販で安価に購入することが可能です。

ビスの紹介

ビスの種類としては、「トラス頭 小ネジ サイズ M6 ピッチ1mm」が一般的なスノーボードで使われるものになります。 長さは一概には言えませんが、「 16mm」が一般的なビスで、「 15mm」が国産の板で利用することが多いショートビスになります。(長いものだと17mm,短いものだと14mmが最適な場合もあるようです) どちらを買えばいいかわからないという方は、安価ですので両方を買って試してみましょう。

購入

これらはホームセンターで1本30円 * 8で合計240円になります。ホームセンターに在庫がなかった場合には、工具通販モノタロウで「トラス頭小ネジ M6」と検索してみてください。

検索で一番上にヒットしたレビュー件数が多い「(+)トラス頭小ねじ(ステンレス)」を買いましょう。 2016/2/7(日)現在では32個入りで689円になります。専用品の8個入りより安いです。 材質としては、ステンレスと鉄の2種類が検索でヒットしますがスノーボードでは錆びにくいステンレスが一般的のようです。

他にも購入可能なサイトを見つけたので貼っておきます。 ステンレス SUS316L(A4)(+) トラス頭 小ねじ (全ねじ)

その他こだわりポイント

材質の違いによる重量の違い

より軽量な材質であるチタンのビスを使ってみると良いかもしれません。約半分の重量になります。(参考ステンレス1本5g, 8本で40g、チタン1本2.2g、8本で17.6g、22.4gの差になります) 大した差ではないですね・・・

緩み止め加工

ステンレス(+)トラス頭 小ねじ (全ねじ) (アロック加工・緩み止処理)

おまけ 詳細説明

条件の一致が必須な項目

スノーボードのビスは以下のスペックになります。

  • トラス頭(ネジの頭の部分の形状)
  • 小ネジ(ネジの種類)
  • M6(ネジの直径)
  • ピッチ 1mm(ネジの回すところのサイズ)

必須ではない項目

  • 長さ 15mm or 16mm(ネジの長さ) バインと板の組み合わせによる。
  • 材質 ステンレス、鉄、チタン(ネジの材質) 普通はステンレス、金があるならチタンでもよし
  • 緩み防止加工 アロック加工(ネジの止めるところの緩み防止の加工) 金があるならあロック加工してあるのでもよし
  • 表面加工 ? (錆び防止などのための加工) よくわからないけど色々ある模様

clang-format Style Options 日本語翻訳 & サンプル集 #clang #llvm

Linux emacs Program

随時更新予定

概要

clangにはclang-formatと言うフォーマッタが存在しておりC言語,C++,Objective Cのインデントなどのファイルフォーマットを自動的に揃えることができます。(vim,emacs,SublimeText向けプラグインも用意されています。)

これらのフォーマットスタイルを詳細に設定可能なのですが、各設定項目が具体的にどういうものかイメージできないので、実際に試して確認していきたいと思います。

いずれはすべてのオプションの意味を理解したいのですが、まずは標準で用意されている LLVM, Google, Chromium, Mozilla, WebKitのフォーマットの差分から特徴的なオプションから日本語訳していきたいと思います。 またC++だけに適用されるフォーマットの優先順位は下げています。

デフォルトオプションの確認方法

以下のようなコマンドを実行すると、styleに指定したオプションが具体的にどのようなものかわかります。

clang-format -style=llvm -dump-config

clang-format Style Options

  • AccessModifierOffset
    intのためマイナス指定可能 publicのindent幅? よくわからず

  • AlignEscapedNewlinesLeft
    よくわからず

  • AllowAllParametersOfDeclarationOnNextLine
    Allow putting all parameters of a function declaration onto the next line even if BinPackParameters is false.
    ???

  • BinPackParameters
    If false, a function call's or function definition's parameters will either all be on the same line or will have one line each.
    ???

  • AllowShortIfStatementsOnASingleLine
    true or false
    括弧なしのif文を1行にするかどうか

- if (a)
-   printf("sample");
+ if (a) printf("sample");
  • AllowShortLoopsOnASingleLine
    true or false
    括弧なしのwhile文を1行にするかどうか
- while (a)
-   printf("sample");
+ while (a) printf("sample");
  • AlwaysBreakTemplateDeclarations
    for C++
    If true, always break after the template<...> of a template declaration.

  • AlwaysBreakBeforeMultilineStrings
    ???
    If true, always break before multiline string literals.

  • ConstructorInitializerAllOnOneLineOrOnePerLine
    for C++ ?

  • SpacesInParentheses
    true or false
    "("の後と")"の前にスペースを入れる 

-switch (a) {
+switch ( a ) {
  • SpaceInEmptyParentheses
    true or false
    空白括弧()の中にスペースを入れる 
- int test() {
+ int test( ) {
  • SpacesInCStyleCastParentheses キャスト時の括弧()の中にスペースを入れる。
- int abc = (int)def;
+ int abc = ( int )def;
  • SpaceAfterControlStatementKeyword 制御文の後にスペースを入れる。
- switch(a) {
+ switch (a) {
  • SpaceBeforeAssignmentOperators 演算子の前にスペースを入れる。
- int a= 1;
+ int a = 1;
  • IndentCaseLabels
    true or false
    caseラベルをswitch文からインデントするかどうか。
 switch (a) {
- case 1:
-   printf("1");
-   break;
+   case 1:
+     printf("1");
+     break;
}
  • BreakBeforeBraces
    中括弧{}のスタイル設定
    Attach, Linux, Stroustrup, Allman or GNU
    Attach
-int test12345(int a, int b, int c)
-{
-  if (a == 1)
-    {
-      printf("abc");
-    }
-  else {
+int test12345(int a, int b, int c) {
+  if (a == 1) {
+    printf("abc");
+  } else {
     printf("def");
   }

   return 1;
 }

-int test1111(int a){
-  if (a == 1){
+int test1111(int a) {
+  if (a == 1) {
     printf("a");
-  }else{
+  } else {
     printf("d");
   }
   return 0;
 }

Linux

 int test12345(int a, int b, int c)
 {
-  if (a == 1)
-    {
-      printf("abc");
-    }
-  else {
+  if (a == 1) {
+    printf("abc");
+  } else {
     printf("def");
   }

   return 1;
 }

-int test1111(int a){
-  if (a == 1){
+int test1111(int a)
+{
+  if (a == 1) {
     printf("a");
-  }else{
+  } else {
     printf("d");
   }
   return 0;
 }

Stroustrup

 int test12345(int a, int b, int c)
 {
-  if (a == 1)
-    {
-      printf("abc");
-    }
-  else {
+  if (a == 1) {
+    printf("abc");
+  } else {
     printf("def");
   }

   return 1;
 }

-int test1111(int a){
-  if (a == 1){
+int test1111(int a)
+{
+  if (a == 1) {
     printf("a");
-  }else{
+  } else {
     printf("d");
   }
   return 0;
 }

Allman

 int test12345(int a, int b, int c)
 {
   if (a == 1)
-    {
-      printf("abc");
-    }
-  else {
+  {
+    printf("abc");
+  }
+  else
+  {
     printf("def");
   }

   return 1;
 }

-int test1111(int a){
-  if (a == 1){
+int test1111(int a)
+{
+  if (a == 1)
+  {
     printf("a");
-  }else{
+  }
+  else
+  {
     printf("d");
   }
   return 0;
 }

GNU
いわゆるGNUスタイルとは少し違うような?

-int test12345(int a, int b, int c)
-{
-  if (a == 1)
-    {
-      printf("abc");
-    }
-  else {
+int test12345(int a, int b, int c) {
+  if (a == 1) {
+    printf("abc");
+  } else {
     printf("def");
   }

   return 1;
 }

-int test1111(int a){
-  if (a == 1){
+int test1111(int a) {
+  if (a == 1) {
     printf("a");
-  }else{
+  } else {
     printf("d");
   }
   return 0;
 }
  • BreakBeforeBinaryOperators
    2項演算子の改行に関する設定、詳細未確認

  • BreakBeforeTernaryOperators
    3項演算子の改行に関する設定、詳細未確認

  • BreakConstructorInitializersBeforeComma
    ???

  • PenaltyReturnTypeOnItsOwnLine ? 関数定義の返り値の方指定を1行に書くかどうか? けどint指定だから別の意味のような気がする。 よくわからず

  • PointerBindsToType
    *や&を型の右に配置(true),変数の左に配置(false) true

- int *tset;
+ int* test;
int* abc;

false

int *tset;
-int* abc;
+int *abc;
  • DerivePointerBinding
    ファイルを解析して最も多い配置に従って、*や&の位置を決定する。 PointerBindsToTypeを自動判定するようなもの?

  • SpacesBeforeTrailingComments
    命令とコメントの間のスペース幅。1行内にコメントを記述する場合。
    1を指定した場合

-int *tset;/* test value */
+int *tset; /* test value */
  • AlignTrailingComments
    true or false
    命令の後に続くコメントが複数行続く場合にアラインを整える。
 int *tset; /* test value */
-int *abc; /* abc value */
+int *abc;  /* abc value */
  • IndentFunctionDeclarationAfterType
    If true, indent when breaking function declarations which are not also definitions after the type.
    詳細不明 関数宣言に関するインデント?

  • Standard サポート言語
    Cpp03, Cpp11 or Auto
    C89とかはないようです。

  • IndentWidth
    インデント幅

  • ContinuationIndentWidth
    行継続のためのインデント幅
    Indent width for line continuations. 詳細不明

  • TabWidth
    タブの幅

  • UseTab
    タブを使うかどうか
    Never, Always or ForIndentation

  • ColumnLimit
    行の最大文字数
    ここで指定した文字数を1行で超えると改行される。

  • MaxEmptyLinesToKeep
    最大空白行数
    指定前

printf("test");


return 1;

1指定

printf("test");

return 1;

参考

ClangFormat — Clang 3.5 documentation

Clang-Format Style Options — Clang 3.5 documentation

clang: clang::format::FormatStyle Struct Reference

LibFormat — Clang 3.5 documentation

clang-format-diff.py実行時のエラーの解決

Linux Program

エラー

# clang-format-diff.py
Traceback (most recent call last):
  File "/usr/local/bin/clang-format-diff.py", line 24, in <module>
    import argparse
ImportError: No module named argparse

解決

easy_installをインストールして、easy_installでargparseを導入する。

mkdir /usr/local/src/python
cd /usr/local/src/python
wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py
easy_install argparse
clang-format-diff.py a
usage: clang-format-diff.py [-h] [-i] [-p P] [-style STYLE]
clang-format-diff.py: error: unrecognized arguments: a 

初めての関数型言語 #emacs #lisp #ruby

Program emacs

概要

1年ぶりにemacs lisp環境を整理していて、文字列のリストの各要素に特定の文字列を追加するということがしたくなりました。

しかし今まではemacs lispは他の人のの設定をコピペしたり変数に代入する程度のことしかしたことがなく、いざ書こうととしたら宣言型ではまったく書けません。 (仕事ではC言語でバリバリの手続き型)

ということで、それを解決するまでの過程ををまとめていきたいと思います。

いきなりemacs lispはハードルが高いので、まずは文法に少しは慣れているRubyで書いてみたいと思います。 1歩1歩進んで行きましょう。

Rubyで手続き的に書いてみる

具体的にやりたいことはこういうことです。

root_dir = "/home/sona_tar/";                             
inc_dirs = ["include", "test/include","abc/include"];
include_dirs = Array.new;                                 
                                                          
inc_dirs.each {|dir|                                      
  include_dirs.push(root_dir << dir);                      
}                                                         
                                                          
p include_dirs;                                           

実行結果

$ ruby loop.rb
["/home/sona_tar/include", "/home/sona_tar/test/include", "/home/sona_tar/abc/include"]

とりあえず手続き型ではできました。 普段はC言語で書いているので配列の要素番号を指定して値を参照しなくて済むだけで高級に感じます。

Rubyでmapを使って書いてみる。

続いてmapを使ってみます。

root_dir = "/home/sona_tar/";                             
inc_dirs = Array["include", "test/include","abc/include"];
include_dirs = inc_dirs.map {|dir| root_dir << dir }       
                                                          
p include_dirs;

実行結果

$ ruby loop.rb
["/home/sona_tar/include", "/home/sona_tar/test/include", "/home/sona_tar/abc/include"]

すっきりしました。いちいちリストに追加するという処理を記述する必要がありません。

Rubyでlistに対する処理だけで記述してみる。

冗長ですがこんな書き方もできますね。

root_dir = ["/home/sona_tar/"];                          
inc_dirs = Array["include", "test/include","abc/include"];
include_dirs = root_dir.product(inc_dirs).map {|dir| dir.join }   
                                                          
p include_dirs;

実行結果

$ ruby loop.rb
["/home/sona_tar/include", "/home/sona_tar/test/include", "/home/sona_tar/abc/include"]

emacs lispで手続き的に書いてみる

これを書くのが一番苦労しました。 その割りに空のリストの宣言だったりループしてたりとかっこ悪い。

(setq root_dir "/home/sona_tar/")                                                     
(setq inc_dirs '("include" "test/include" "abc/include"))                             
(setq include_dirs)                                                                   
(dolist (dir inc_dirs)  (setq include_dirs (cons (concat root_dir dir) include_dirs)))
(message "%s" include_dirs)                                                                                  

実行結果

M-x eval-buffer
(/home/sona_tar/include /home/sona_tar/test/include /home/sona_tar/abc/include)

emacs lispでcollectを使って書いてみる。

続いてcl-loopとcollectを使ってみます。

(setq root_dir "/home/sona_tar/")                        
(setq inc_dirs '("include" "test/include" "abc/include"))
(setq include_dirs (cl-loop for dir in inc_dirs collect (concat root_dir dir)))
(message "%s" include_dirs)                                                                            

実行結果

M-x eval-buffer
(/home/sona_tar/include /home/sona_tar/test/include /home/sona_tar/abc/include)

emacs lispでmapcarを使って書いてみる。

続いてmapcarとlambdaを使ってみます。

(setq root_dir "/home/sona_tar/")                        
(setq inc_dirs '("include" "test/include" "abc/include"))
(setq include_dirs (mapcar  '(lambda (dir) (concat root_dir dir)) inc_dirs))
(message "%s" include_dirs)                                                                            

実行結果

M-x eval-buffer
(/home/sona_tar/include /home/sona_tar/test/include /home/sona_tar/abc/include)

まとめ

関数型言語風に書くとloopの記述と状態を保持するリストへの追加処理がなくなり、副作用のないすっきりしたコードになりました。

ただし慣れるまでは頭の使い方が違うので、どのように書けばいいのか考えるのに苦労します。(emacs lispは手続き的に書く方が難しかったですがw)

要訓練です。

もっとスマートな書き方がRubyやemacs lispでありましたら教えてください!

参考

Emacs Lisp勉強会(基礎編) — ありえるえりあ
Emacs Lispのメモ
Loop Facility - Common Lisp Extensions

http proxy環境でkickstartを利用したネットワークインストール方法

Linux Server

社内ネットワークなどのhttp proxy環境でkickstartを利用したネットワークインストール方法の紹介です。

基本的には通常のネットワークインストールと同じですが、ネットワークインストール時にhttpアクセスが発生する2カ所で正しくproxyサーバを設定しなければいけません。

  • proxyオプション --proxy=[protocol://][username[:password]@]host[:port]

  • url
    ネットワークインストールするためのinstall.imgを取得するために必要となります。

  • repo
    パッケージインストール時にパッケージを取得するために必要となります。

kickstartファイル例

install
url --url=http://ftp.riken.jp/Linux/centos/6.5/os/x86_64/ --proxy="http://proxy.example.co.jp:10080"
lang ja_JP..UTF-8
keyboard jp106
network --onboot yes --device eth0 --bootproto static --ip 192.168.1.123 --netmask 255.255.255.0 --gateway 192.168.1.1 --noipv6 --nameserver 192.168.1.3 --hostname server_name
# network --onboot yes --device eth0 --bootproto dhcp --noipv6 --hostname server_name
rootpw  --iscrypted パスワード
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --disabled
timezone Asia/Tokyo
bootloader --location=mbr --driveorder=vda --append="crashkernel=aauto"
repo --name="CentOS"  --baseurl=http://ftp.riken.jp/Linux/centos/6.5/os/x86_64/ --proxy="http://proxy.example.co.jp:10080" --cost=100

%packages --nobase
@core
%end

私は上記のkickstartファイルをKVMで利用しています。

KVM環境にCentOS6.5をインストール(kickstart利用) - GeekなNooblog
http://geekna.hatenablog.jp/entry/2014/01/02/134333