2015年10月25日日曜日

【Scala】CentOS7でScalatraを使えるようにする

環境構築しようと思って、CentOSにインストールしたらハマったのでメモ。

■結論■
yumで簡単インストール禁止

■現象■
調べてみると、下記の手順でやれって出てくる。

1.Javaインストール
2.Typesafeリポジトリの追加
3.typesafe-stackインストール
4.csをインストール
5.giter8インストール
6.g8コマンドでテンプレートのコピー

その辺見れば手順書いてあるので詳細は割愛。
んで、重要なのはtypesafeリポジトリの内容が古い。
scalaは2.9とか入ってくる。(作業時最新2.11.7)
その流れでgiter8は0.5.3になる。
最後にテンプレートコピーが終わった段階でcontainer:startするとエラーが出て止まる。

■対応方法■
Scala、sbtを探してきてインストール。

問題は特に下記。
①Scalaが古い
→Centのリポジトリからならほぼ最新版だからこっちから入れる。 
②Scalaインストール時にgitがインストールされるけどCentの公式リポジトリ上のgitのバージョンが古い
→先にgitを入れる。古くても実害はないかも??他で問題が出ることがあるので、最新版を入れておくのを推奨
③sbtを公式リポジトリからyumで入れようとすると、OpenJDKが入ってくる
→yumdownloaderコマンドでsbtを落として、rpm -ivh sbt-*.rpmでインストールする。
 oracle javaじゃない人はこのままでいいですよ?

■おまけ■
conscriptとgiter8について、アンインストールしたかったのにさくっと検索できなかったので、書いときます。

コマンドでremoveやらuninstallやらあるかと思ったら削除するのが基本ぽい?
そもそも削除はしないのが前提なのか。

まず削除
$~/.sbt
$~/.conscript

で、sbtから再構築
$sbt
$curl https://raw.githubusercontent.com/n8han/conscript/master/setup.sh | sh
$cs n8han/giter8
これでg8コマンドが使えるようになります。

あ、結局アップデートはどうやってやるのか不明だった。
MacばっかりでLinuxの情報が少ないのも物悲しい。

2014年7月1日火曜日

【Linux】SoftEther VPN

便利なSoftEther VPN

今まではUbuntuにOpenswan+xl2tpでIPSecを構成してたんだけど、
デスクトップPCやスマホからはいいものの、Ubuntu同士での接続がうまくいかなかった。。

評判が良さそうなので、乗り換えてみることに。

ていうかSoftEther VPNってどんなの

よく知らずに使おうとしてたんだけど、これはVPN系ソフトの塊だったのね。
PPTPとかIPSecとかOpenVPNとかいっぱい入ってる。

まぁ、使うのはIPSecだけなんだけどw

とりあえず入れてみる

とりあえず入れようかなーとか思って、aptitudeで探したらない。
まじかよ。makeとかだりーなとか思ってtar探してみる。

えーっと、

  1. makeに必要なパッケージ入れる
  2. makeする
  3. agreeとかyesとかする
  4. 使いやすように配置する
  5. init.dにスタートアップスクリプトを置く
  6. ランレベルとか設定する
これで終わってくれたら余裕じゃん。
→参考にさせて頂きました某模型メーカー中の人のサーバー管理帳

うーん。

最後までやって気がついた。
これって、Windowsから管理できんのか。
超便利じゃん!

ということで、Windows向けのManagerもインストール。

起動確認。
Openswan+xl2tpに比べてメンテ超楽じゃん。
なんかワクワクしてきた!

ここまでは躓かなかったけど、この先が長かった・・・

DHCPでIPが取れない!!

まず、Lunixで仮想HUBからブリッジ接続を行った場合、ブリッジしたインターフェースとは接続できません。

そうとも知らずに、ブリッジ接続したIFからDHCPを待っても・・・
IPが取れない!!

気がついた時には面倒だったので、物理IFを追加し、同じセグメントへ設定。

なのに・・・
IPが取れない!!

まじかよ。
めんどくさいと思いつつ、dnsmasqの設定を変更して、DHCPを振られるように再調整・・・・
IPが取れない!!

ええー。もうなにこれ。どうしたらいいのかわかんなーい。
追加した物理IFもDHCPで振られるようにしたら・・・
IPが取れた!!

とれたよ!
あれかよ、IFのstatic設定がダメだっただけかよ・・・
もういいよ。このまま運用しよう。。

dnsmasqの設定を綺麗にして、稼働状況まで持って終了!

だけど、Openswan+xl2tpに比べて若干速度が落ちた気がする。
管理しやすくなったし、何でも接続できるようになったから、まぁいっかw

次はディザスタリカバリ用のUbuntuサーバーへこの設定を行いにいかなきゃw


【Typefi】自動組版 その2

ニッチなんだよね2

いつのまにかCS7ならぬCCまで出てしまいました。
久しぶりに更新しようかなーとか思います。

右流れ組版

ME版の起動

いつの間にか仕事では実際に使用してましたね・・・
InDesign CS6から、ME版の機能がデフォルトで組み込まれています。

ですが、日本語版インストーラーではME版をインストールすることはできません。

実は、日本語版インストールでインストールできるのは英語と日本語なのですが、
英語版をインストールすると、「CJKVはサポートしてねぇから、対応したバージョン入れろよ!」って怒られます。
英語版では、日本語版で作成したファイルを開くことすらできません。
これは、Wikipediaに書いてる情報を信じると・・・

Adobe InDesign日本語版は、日本でのニーズに合わせて大規模な改修が行われており、ことに日本語特有の多様な文字組みルールを実現している点で、「日本語ローカライズ製品」というよりも「日本市場用製品」といえる製品に仕上がっている。

とのことなので、開くことができないのは頷けますねー。
自分の予想では、日本語対応段落コンポーザーだと睨んでいるんですが、調べてはいませんw

InDesign Serverでは、使用可能な言語は全てインストールできます。
が、おすすめは「English(International)」です。
InDesign Server自体の情報があまり(特に日本語は)ありませんが、言語特有の問題を起こしにくいというのが理由です。

さて、話しを戻します。

ME版は日本語版でもインストール自体はされています。
ですが、編集言語設定がレジストリに隠されているため、この設定をME版(アラビア語版)に変更しなくては行けません。
※UIの言語設定もありますが、こちらはいじってもあまり意味無いです。
  1. InDesignを終了しておく
  2. レジストリエディターを起動する
  3. HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\InDesign\8.0\Feature Set Locale Setting の値を103にする
  4. Windowsを再起動する
これでME版が立ち上がります。

ワークスペース等の情報が別で保存されてしまいますが、日本語版に戻すと元の情報を読み込みます。

ME版の注意点

注意点は色々あるんですが、大きくは↓な感じですかね?
  • テキストフレーム自体がME版用のため、使い回しは厳禁
  • 段落は段落設定で右寄せ、右流れに変更する
  • 多言語複数段落コンポーザーにする
カシダスやらディジット変換やら色々ありますが、これは自動組版をする際の問題(どのようにレイアウトするか)とイコールなので、ME版を使用すること自体では問題は起きにくいかと思います。

英語版やME版のメニューを見ると、日本語版のメニューの多さにビビります。

ME版の問題は、組版以上に言語特有のルールが大きな壁になります。
インド数字・ペルシア数字間における拡張数字の違いや、括弧やハイフン、ピリオドなどに起こるディレクションの問題がそれです。

慣れればいいんですかね?!
タイ語に比べれば可愛いものです!!
※InDesignがタイ語に対応していないため、TypefiもInDesignと同じ状況になります。

Typefiでの組版

やっとこ本題ですね・・・
Typefiでは特に問題なく右流れを組みことが可能です。ほぼ。
ほぼと言うのは自分でチェックができないからです!
まぁ、アラビア語圏の人間ではないですしね・・・
ネイティブの方にチェックはしてもらいますが、やはり何か不安が残ってしまうのは日本人だからなんでしょうか?

それと、左流れと右流れの言語を1つのInDesignファイルにまとめることはおすすめしません。
テキストフレームが右流れ専用というのもそうですが、InDesng上で両側から開始とか気持ち悪い事ができないためです。

できるソフトもあるんですがね・・・

段落スタイル、文字スタイルなどのスタイル系の設定は問題ありませんが、表は問題が起こります。

右流れの言語では、表も右端の列が開始列になるため、自動組版では左右の入れ替えを行わなくてはならない等の問題が起きます。

InDesignでは表のディレクションチェンジが可能なのですが、Typefi上からはその設定を行うことができません。

この場合は別途プラグイン、もしくはJavaScriptなどで表のディレクションチェンジを行います。




2013年7月18日木曜日

【XSLT】 XSLTで2つのXMLをマージしてみた

XSLTで2つのデータのマージをしたいとおもって色々探しまわったけど、見つからなかったので自作してみた。

こういう用途ってないのかな??

saxonでしか確認してない。そもそも2.0でしか動かない!

call-templateはネストすると処理が重くなるため、apply-templatesで処理してます。
nodes1に放り込んだxmlに対して、nodes2を上書きしていきます。

要素の順番はnodes1側に引きづられ、nodes2側にしかない要素(追加したい要素)は兄弟要素として末尾に追加されます。

マージしたxmlに対してxpathで取得する際には問題が起きにくいですが、ノード番号等で取得するような場合は注意が必要です。

さて、次はドキュメント比較用のXSLTを作らねば・・・

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()" mode="marge">
 <xsl:param name="nodes1" as="item()*" />
 <xsl:param name="nodes2" as="item()*" />
 <xsl:variable name="node1" select="$nodes1[1]" as="item()*" />
 <xsl:variable name="node2" as="item()*">
  <xsl:choose>
   <xsl:when test="$node1">
    <xsl:copy-of select="$nodes2[name() = $node1/name()][position() = 1]" />
   </xsl:when>
   <xsl:otherwise>
    <xsl:copy-of select="$nodes2[1]" />
   </xsl:otherwise>
  </xsl:choose>
 </xsl:variable>
 <xsl:variable name="nodes1After" as="item()*">
  <xsl:copy-of select="$nodes1[position() != 1]" />
 </xsl:variable>
 <xsl:variable name="nodes2After" as="item()*">
  <xsl:choose>
   <xsl:when test="$node1">
    <xsl:copy-of select="$nodes2[not(name() = $node1/name() and position() = 1)]" />
   </xsl:when>
   <xsl:otherwise>
    <xsl:copy-of select="$nodes2[position() != 1]"></xsl:copy-of>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:variable>
 
 <xsl:choose>
  <xsl:when test="not($node1)">
   <xsl:copy-of select="$node2" />
  </xsl:when>
  <xsl:when test="$node1">
   <xsl:element name="{$node1/name()}">
    <xsl:apply-templates select="$node1/@*" />
    <xsl:apply-templates select="$node2/@*" />
    <!-- 子要素 -->
    <xsl:apply-templates select="self::node()" mode="marge">
     <xsl:with-param name="nodes1" select="$node1/node()" />
     <xsl:with-param name="nodes2" select="$node2/node()" />
    </xsl:apply-templates>
   </xsl:element>
   <xsl:apply-templates select="self::node()" mode="marge">
    <xsl:with-param name="nodes1" select="$nodes1After" />
    <xsl:with-param name="nodes2" select="$nodes2After" />
   </xsl:apply-templates>
  </xsl:when>
  <xsl:otherwise />
 </xsl:choose>
</xsl:template>
</xsl:stylesheet>

2013年6月26日水曜日

【Javascript】クラス化ってどうよ?

すげー久々に更新したりしてみたり。

最近、JavaScriptと仲良しです。
といっても、ブラウザ向けじゃなくて、Adobe向けっていうのがまた変なんですが・・・

InDesign、Illustrator、Photoshop、Acrobat(いじった時間が多い順)とかやってて思ったのが、
クラス化してない人が多いな、と。

JavaScriptはなんちゃって(プロトタイプ)オブジェクト指向なので、クラス化する意味あるのかなーとかずっと思ってたんだけど、やってみると超便利だったっていうことがわかった。

結局、Adobe系のjsについてはデータドリブンな部分がhtmlに比べて少なく、メソッドチェーンが効果を発揮するのは自分でデータセットを準備した後のようなイメージ。

じゃあ、データ揃うまではどうすんの?って話に成るんだけど、関数やらでごまかしても限界があって二度手間、三度手間が発生しちゃう。

かといって、クラス化してるJavaScriptはあまり無かったもんだからさぁ困ったっていう話。

今、サンプルが手元にないので偉そうなこと言えないな・・・

今度アップします。


2013年4月12日金曜日

【Linux】RAID1が縮退運転しおった


やられたぜ・・・・

/dev/md0:
        Version : 1.2
  Creation Time : Mon Dec  3 17:39:14 2012
     Raid Level : raid1
     Array Size : 97590144 (93.07 GiB 99.93 GB)
  Used Dev Size : 97590144 (93.07 GiB 99.93 GB)
   Raid Devices : 2
  Total Devices : 1
    Persistence : Superblock is persistent

    Update Time : Fri Apr 12 00:31:47 2013
          State : clean, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           UUID : 84c532e6:58e0cc48:c30029c5:37eb4163
         Events : 731

    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       18        1      active sync   /dev/sdb2

交換用のHDD買うか・・・・

とりあえず買ってみたものの、sdbのgrubが起動しない。

環境はこんなかんじ
Ubuntu 12.04
md0: sda2 sdb2
md1: sda3 sdb3
md2: sda4 sdb4

grubのOS選択画面で再起動がかかり、BIOS画面と行ったり来たりする。
grubの設定を変更してもだめ、grubシェルでlsしようとしたり、insmodしようとして、補完でTABキー打つと再起動する。
意味分かんない。

旧sdaから新sdaを全部コピーしてみたらできたので、物理的に新しいHDDにした状態で上の状態になった。

あとはmdadm /dev/md0 -a /dev/sda2とかしてリビルドして完了。

なぜか1パーテーションがビジーって言われたけど、再起動したら無問題だった。
よかったよかった。

2013年4月4日木曜日

【CakePHP】$this->renderとbeforeRenderの関係

今日はまった出来事。

権限によってviewを変更しようと思って、どこで調整しようかなーと考えてて、
beforeRenderならひと通りできそうだしいいじゃね?!と思ってやってみたらダメだった。

やろうとしている人が居られたら注意を。

■環境
・CentOS 6.5
・PHP 5.3
・CakePHP 2.3.1

なんでかなーと思って調べました。
Controllerの順序は↓な感じだと思う。

beforeFilter
(action)
beforeRender
(view)
afterFilter

使ってる人はご存知の通り、Controller中で$this->renderを使用したタイミングでviewへ処理が移行してしまい、Controllerでの処理が続行できない。
これは、autoRenderが働くためと思われる。詳細は調べてないのです。
$this->outputを呼び出しているせいで、その時点でview用のデータがセットされてしまうとのこと。

んで、重要なのはbeforeRenderと$this->renderのタイミング。

どうやら、beforeRenderはこの$this->outputを呼び出したあとに処理される模様。
普通に考えてみりゃそりゃそうだ。

プレフィックスルーティングもだるいし、viewだけディレクトリ切って各権限毎に振り分ける場合とかどうしたらいいんだべ?

今回は諦めてctpファイルを調整することにします。