東村アキコについて

 一年に一度の楽しみである、かくかくしかじかの新刊が発売された。毎年、かくかくしかじかの新刊を買って読むたびに、ムズムズとした気持ちになるので、俺と東村アキコの話を書く。

出会い

 俺が初めて読んだ東村漫画は、大学の寮に入寮したての頃に読んだ、『ひまわりっ健一レジェンド〜』だった。寮で同じ部屋員となった、医学部のN君が毎週狂ったように買ってくる週刊モーニングに連載されていた作品である(今思えば、彼が毎週モーニング買ってなかったら、こんなに東村作品を読んでいなかっただろう)。

 正直にいうと、「この漫画面白いけど、力強すぎて、そんなに流行らないかもなぁ」と思ったのだけれど、意味不明なノリに圧倒され一発で好きになった(東村作品は、基本的にキャラクターのテンションが異常に高く、身内ネタや80~90年代ドラマネタ、宮崎県のローカルネタなどが毎度鬼のように繰り返される)。「この面白さがわかるのは俺だけ」というような歪んだ親心も、自然と芽生えた。

 かくして東村アキコは、俺の中で『俺だけが認める漫画家』となり、ホノオモユルにとっての高橋留美子的存在となったのだった。

俺だけの東村アキコでなくなった

 あれはたしか、大学3年の冬だった。 大学の図書館でそれとなくネットニュースかなんかみていたら、突然東村アキコの名前が目に飛び込んできた。『ママはテンパリスト』この漫画を読め!一位受賞のニュースである。

 ここからの東村アキコは本当にすごかった。ママテンに続き、『海月姫』の大ヒット。少女漫画感と、独特の狂ったテンションをきっちり両立させ、ノイタミナ枠でアニメ化までされる怪作となった。

 自分が好きな漫画家が有名になったことが非常にうれしい反面、何ともいえないひっかかりが胸に残った。東村アキコは、 俺だけの東村アキコでなくなったのだ。

かくかくしかじか

 俺は大学を卒業し、なんとなく仕事を始めて、季節は冬になった。途中まで集めていた『主に泣いてます』は大学卒業と同時に売ってしまい、東村作品とは少し距離を置くようになっていた(もちろん後で全巻買い直しました)。そんな矢先、新刊コーナーに平積みされた、『かくかくしかじか』を本八幡くまざわ書店で見かけたのだった。

 表紙に描かれた、絵筆を加えた女子高生は、明らかにアキコだった。この時点で彼女自身のことを描いた作品なのだとわかったが、表情はどことなくキッとしていて、『ママはテンパリスト』や『ひまわりっ』のアキコとは雰囲気が違っていた。

 実際に読んでみると、やはりこれまでの作品とも、単なる自伝的作品とも違っていた。自伝というよりは、 彼女の懺悔や後悔の念の固まりである。

 なるべきだった自分と、今の自分を真剣に見比べると、色々やり直したくなってくるのは皆同じなのだ。もうどうにもならないことというのは、どうしてこんなにどうにかしたくなるのか。やっぱり世の中、失敗も成功も、本人の思い通りにいかんもんだよなぁ。 

 しかしまぁ、そんな話だけで終わらないのが、東村アキコの作家性(人間性?)である。やっぱり、この人頭おかしい。もちろんいい意味で。

俺と東村アキコ

 「すごいと思う漫画家は?」と聞かれたら、色々と考えてしまうが、「好きな漫画家は?」と聞かれたら、俺は東村アキコと即答する。

 東村作品については、もはや冷静に分析しながら読むことはできなくてっている。 なんかもう、よくわからんけど好きなのだ。アキコが前からの知り合いみたいな気持ちになってる人は、たぶん俺だけでないはず(っていうかそう願いたい)。

 ちなみに俺が一番好きな東村キャラクターは、二見です。キャラクターではないが。ご本人いらっしゃるが。

さくらVPS上にWebサービスを公開したはなし

正月で生活習慣が乱れまくったので、睡眠習慣を記録するWebサービスを作った。

おふとんグラフ
http://ofline.biz/

f:id:yuizho:20140103150520p:plain

使用したもの

・サーバ:さくらVPS
・言語:Python
フレームワーク:Flask(flask-oauth, flask-wtf, sqlalchemy)
・HTTPサーバ:nginx
・DB:MySQL

サービスを公開するにあたって、やったことをメモする。

さくらVPSのリモート設定

参考URL

http://blog.hybridism.com/?p=140
http://dogmap.jp/2011/05/12/vps-security/
※rootログインの禁止とか、ポートの変更とかは上記のサイトをそのまま参考にした。
  公開鍵設定もほとんどそのままだけど、おぼえられんのでメモ。

公開鍵の設定

・クライアント側

~/.ssh に任意のフォルダを作り、その中に公開・秘密鍵を生成する
GitHubとか使ってると鍵がごちゃつくので、VPS用のフォルダを任意の名前で作っておく

$ mkdir ~/.ssh/サーバ名
$ cd ~/.ssh/サーバ名
$ ssh-keygen -t rsa -C "鍵名"   ~公開鍵を作成~ 
  Enter file in which to save the key (/home/yui/.ssh/id_rsa): /home/yui/.ssh/サーバ名/秘密鍵名('id_rsa-サーバ名'とかにすると管理しやすい)
  Enter passphrase (empty for no passphrase): パスワード(2回入れる)

秘密鍵:id_rsa-サーバ名
公開鍵:id_rsa-サーバ名.pub
が生成される。

秘密鍵の権限を600に変更しておく

$ chmod 600 ~/.ssh/サーバ名/id_rsa-サーバ名

公開鍵をscpコマンドでサーバに送っておく

$ scp ~/.ssh/サーバ名/id_rsa-サーバ名.pub ユーザ名@xx.xx.xx.xx:
公開鍵を指定して、ユーザのホームフォルダにコピーする


・サーバ側

.sshに公開鍵をauthorized_keysに設定(なければ空のファイルを作っておく)

$ touch authorized_keys
authorized_keys(空ファイル)を作る

$ cat さっき送った公開鍵 >> authorized_keys
authorized_keysに公開鍵の内容を設定(上書き。複数のクライアントを設定することあるので。)さっき送った公開鍵はサーバから消しておく。

$ chmod 600 authorized_keys
ここが間違っていて、はまりました

sshdの設定ファイル変更

/etc/ssh/sshd_configを以下のように修正(バックアップはとっておくこと)

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
#(コメント)を外して公開鍵認証を有効にする

PasswordAuthentication no
パスワード認証を禁止にする

sshdを再起動する

$ service sshd restart


・クライアントから正常にログインできるかチェック

$ ssh ユーザ名@xxx.xxx.xxx -i ~/.ssh/サーバ名/id_rsa-サーバ名
-i オプションで秘密鍵の場所をを指定すること
正しくつながれば、鍵を生成したときのパスワードを入力してログインできる

サーバ側のauthorized_keysの権限設定が間違ってたりすると
Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
となってログインに失敗する……

設定してない端末からログインできないことも必ず確認しておく。

バックアップ設定

参考URL

 http://mukaer.com/archives/2012/03/14/vpscentos/
 ※mysqlのdumpとか、毎日定期的にバックアップとるようにした。
  参考URLのやり方をほぼまねさせてもらった。

正月に読む本

  • JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

プログラマが知るべき97のこと

プログラマが知るべき97のこと

地下室の手記 (新潮文庫)

地下室の手記 (新潮文庫)

レスポンスでcsvを返した時の問題

HTTPのレスポンスでcsvファイルを返す処理で問題発生。
ローカル環境で実行したときは正常にcsvを返せていたが、
IISを介して実行すると中身が空のcsvファイルが返ってきてしまう。

原因を調べていたところ、似たような現象についての記事を発見
http://stackoverflow.com/questions/11526396/how-to-response-write-on-iis7-5
※画面中断のBryan氏の回答

Fiddler2を使用してcsvファイルを返しているHTTPレスポンスをキャプチャしてみると、
bodyは空で、記事と同じようにContent-Encodingがgzipで返ってきていた。

やはり、IISが圧縮してからレスポンスを返してきているようだったので、
以下を参考にして圧縮設定を解除したところ、正常にcsvファイルを返すことできた。
http://technet.microsoft.com/ja-jp/library/ee431600.aspx

その際、動的圧縮だけでなく静的圧縮の設定も解除する必要があった。
静的圧縮を許している場合、一定サイズを超えたファイルを自動で圧縮するらしい。
http://blog.progfast.jp/labs/index.php/arts/iis-7-static-gzip/


その他参考:
http://niyodiary.cocolog-nifty.com/blog/2009/06/aspnetc-7eae.html
http://social.msdn.microsoft.com/Forums/en-US/914c6b1c-343f-4b9a-84b3-5960b33a51f0/responseend-responseclose-
http://pub.ne.jp/Chunn/?entry_id=1293658

Bitbucketのprivate repositoryとJenkinsの連携について

Bitbucketのprivate repositoryとJenkins使ってCIできる環境を作った。
主に以下の記事を参考にすれば解決だったが、自分用にメモを残す。
URL: http://qiita.com/ka_/items/acd019118eab298101f6

【環境】

Jenkins

JenkinsはさくらVPSCentOS 6.3上で動いている。
yumでインストールしたので、OS上にJenkinsユーザが追加されている状態
Git Pluginは既に追加済み。
※インストール時、以下のURLを参考にした
http://snickerjp.blogspot.jp/2013/10/yum-Install-Jenkins.html
http://futurismo.biz/archives/1348

Bitbucket

Gitでprivate repositoryを作成済み

【手順】

1. Jenkinsの公開鍵を作成する

以下のコマンドを実行して、Jenkinsユーザの公開鍵を作成する。
ssh-keygen 実行した際に、パスフレーズを聞かれるがEnterで跳ばしてOK

$ sudo su - jenkins
$ ssh-keygen

※~/.ssh の下に、id_rsa, id_sa.pub ができるのを確認する。

2.Bitbucketに公開鍵を登録する

Bitbucketに作成しておいたリポジトリの、
 設定(対象リポジトリ内の歯車マーク) > デプロイ鍵 > 鍵を追加
とたどって、keyに1.で作成した公開鍵(id_rsa.pub)の内容をコピペして鍵を追加する。

f:id:yuizho:20131124172545p:plain

※ここまでの手順は以下の記事が参考になった
http://morizyun.github.io/blog/ssh-key-bitbucket-github/

3. Bitbucketにフックを設定する

設定(リポジトリ内の歯車マーク) > フック
からとたどって、プルダウンからPOSTを選択する。
その状態で、ホックを追加を押すとURLの入力を求められるので、以下の形式のURLを設定する。

http://Jenkinsのドメイン:8080/git/notifyCommit?url=git@bitbucket.org:xxxxxx/xxxxxx.git
4.Jenkins側の設定

Jenkinsにログインし、ダッシュボード > 新規ジョブ作成 から新しいjobを作成する。
ジョブを作成したら、そのジョブの設定から以下のように各設定を追加する。

ソースコード管理システム
 ・Repositories(Repository URL) 対象リポジトリのURL(SSH)
 ・リポジトリ・ブラウザ bitbucketwebを選択し、URLに対象リポジトリのURLを入力

f:id:yuizho:20131124174415p:plain

※Repositories(Repository URL)にURLを入力した際、初回はエラーが表示される。
コンソールから、以下のコマンドなど実行して.sshのknown_hostsにBitbucketを追加しておく。途中の質問にはyesを入力する。

$ git ls-remote -h git@bitbucket.org:xxxxx/xxxxx.git HEAD

とか

$ ssh bitbucket.org


■ビルド・トリガ
 ・SCMをポーリングにチェックを入れる。
  ※スケジュールは空でOK

 f:id:yuizho:20131124175556p:plain


あとは、接続テストとかビルドとかやってうまくいってるか確認すればOK
※接続テストに関しては、本文先頭の参考した記事参照


ここまで設定を行えば、Bitbucketにpushしたタイミングで、Jenkinsが自動でビルドするようになる。
準備は整ったので、次はnoseを使ってpythonのソースを自動でテストするとこまでできるようにする。

早起きについて

色々うまくいかない。
もっと勉強しなきゃいけないのに、時間がないからできない。

……と思っていたが、冷静に考えて単純に僕は起きるのが遅すぎるという結論に達した。

以下の書籍をダーッと読んで、とりあえず自分なりの戦略を立てることにする。
ただ早く起きれるようになりたいので(あと短絡的すぎて馬鹿っぽいのが厭なので)、「早起きで人生がうまくいく」的なタイトルの本は省いた。
※読んで考えたこととか、決めたこととか随時追記する。

「朝がつらい」がなくなる本―ぐっすり眠る、すっきり起きる習慣術。 (知的生きかた文庫)

「朝がつらい」がなくなる本―ぐっすり眠る、すっきり起きる習慣術。 (知的生きかた文庫)

快適睡眠のすすめ (岩波新書)

快適睡眠のすすめ (岩波新書)


 ・生活時間帯の移動を頻繁に行うと生活習慣全体が不規則になる。
  週を通して、睡眠を取る時簡単は変動しても1時間以内に。
  夜更かし、朝寝坊も週に1回にしておくのが望ましい。
 ・睡眠時間の短縮は可能だが、無理なく縮められる時間は6時間。
  睡眠時間を短縮する動機づけの強さが成功の鍵。
 

睡眠の科学―なぜ眠るのかなぜ目覚めるのか (ブルーバックス)

睡眠の科学―なぜ眠るのかなぜ目覚めるのか (ブルーバックス)

ぐっすり眠れる3つの習慣 (ベスト新書)

ぐっすり眠れる3つの習慣 (ベスト新書)

4時間半熟睡法

4時間半熟睡法

「全身の疲れ」がスッキリ取れる本 (知的生きかた文庫)

「全身の疲れ」がスッキリ取れる本 (知的生きかた文庫)

 
  ・目を覚ましたら、伸びをする。
   伸びをした後よく寝たと念ずる。
  ・自己暗示をかければ脳が満足してウンタラ〜

□試してみること
 ・目を覚ましたら、深呼吸・伸びをする。伸びをした後よく寝たと念ずる。
 ・目覚ましは、だらだらならさない。一発ならすだけにする。
 ・起きたら朝の光を一分浴びる。体動かす。
 ・目覚ましの位置を毎日変える
 ・5時間40分〜6時間00分睡眠(起床時間をレム睡眠時にぶつける)

年月日ばらばらのテキストボックス

年・月・日がばらばらのテキストボックスの、検証についてなど

基本的な方針は、年・月・日の入力内容を結合するテキストボックスを作り
その内容をCustomValidatorで検証する感じ。


.aspx側

<div>
    <asp:TextBox ID="TxtYear" runat="server" Width="60" class="DateTextBox" 
        value=""></asp:TextBox><asp:TextBox ID="TxtMonth" runat="server" Width="60"  class="DateTextBox"  
        value=""></asp:TextBox><asp:TextBox ID="TxtDay" runat="server" Width="60"  class="DateTextBox"  
        value=""></asp:TextBox><!-- 検証用のテキストボックス(年/月/日を結合する) -->
    <asp:TextBox ID="TxtDate" runat="server"></asp:TextBox>
    <asp:Button ID="SendButton" runat="server" Text="検証" 
        ValidationGroup="DateValidator" onclick="SendButton_Click" />
    <!--  -->
    <asp:CustomValidator ID="DateValidator" runat="server" 
        ErrorMessage="正しい日付を入力して下さい。" ValidationGroup="DateValidator" 
        ControlToValidate="TxtDate" 
        onservervalidate="DateValidator_ServerValidate"></asp:CustomValidator>

    <script type="text/javascript">
        $(function () {
          //タグのVisible="false"で非表示にすると、
            //HTML出力時タグごと無くなるので、検証が失敗する。
            $("#<%= TxtDate.ClientID %>").hide();

            //「YYYY/MM/DD」形式に結合してDateTextBoxにセット
            $(".DateTextBox").change(function () {
                yearValue = $("#<%= TxtYear.ClientID %>").val();
                monthValue = $("#<%= TxtMonth.ClientID %>").val();
                dayValue = $("#<%= TxtDay.ClientID %>").val();
                $("#<%= TxtDate.ClientID %>").val(yearValue + "/" +
                                                    monthValue + "/" +
                                                    dayValue);
            });
        });
    </script>
</div>

.aspx.cs側

protected void DateValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
    DateTime dt;
    args.IsValid = (DateTime.TryParse(args.Value, out dt) ? true : false);
}

protected void Button2_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
    {
        //検証成功時の処理
        foo();
    }
}

[IsValidプロパティについて]
検証コントロールを使用する場合、IsValidプロパティを使用して検証の成否を判定する必要がある。
※検証コントロールはあくまで、検証エラー時にエラーメッセージを表示するだけである。クライアントサイドで検証を行っている場合は必要ないが、基本的にはすべて検証の処理で成否判定を行うべきである。


【追記】
ユーザコントロール化して汎用的に使うなら、以下のようにValidatorGroup
をプロパティにして、呼び出し側からセットしてやればよい。

ascx.cs側

public partial class DateTextBox : System.Web.UI.UserControl
{
    public string validtorGroup
    {
        set { DateValidator.ValidationGroup = value; }
        get { return DateValidator.ValidationGroup ; }
    }

~以下省略~

aspx.cs側

public partial class ValidTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DateTextBox1.validtorGroup = "DateValidator";
    }

~以下省略~