2015年1月26日月曜日

ラーメン もかすけ

鶏白湯ラーメン


函南町にある鶏白湯スープメインのラーメン屋のもかすけさんで食べてきました。


鶏だしのスープはあっさりしていて美味しかったです、油多めのしっとりした感じのチャーシュウでスープとマッチしてバランスが良いなって感じのラーメンでした。

ちなみに醤油ラーメンも食べましたが、私的にはあまりイけていませんでした。

そのほかまだ豚骨系の種類もあるので、再度食べてみたいとおもいます。



2015年1月25日日曜日

wineでKindle for Windows

wineで普通に見れました


Windowsがないのと、Linux用のKindleがなさげなので、Wineでインストールしてみました
karky7 ~ # emerge app-emulation/wine
これだけです、そしたら「Kindle for PC(Windows8.1,8,7)」をダウンロードしてインストールする


コマンドラインからなら普通のユーザーで実行する

cuomo@karky7 ~ $ wine ~/Downloads/exe/KindleForPC-installer.exe
 デスクトップにアイコンが出ました、HOMEディレクトリの.wine以下にインストールされます


 普通にみれました


 何の苦労もなく普通にみれました、wineって軽くていいね


2015年1月24日土曜日

gentooでglibcをgdbする

gentooならglibcのデバッグも安全快適にできる


いつも周囲から、「なぜ、今時gentooをつかうのか?」とか「yumな時代に、いまどき時間かけてコンパイルってどうなの?」とか色々言われますが、僕は小声でいいたい

Oh、マイ、ガッ!、君はコンパイルしてる意味が分からないの?、、こんなに安全に、ソースから色々なことができるのに、なぜそれが理解できないの?」...外人風に...

といような、前置きを考えるのに何時間も使ってしまうので最近面倒、ブログって大変。
ということで、gentooなら簡単に?glibcのデバッグが出きることを紹介します。



意外と自分のプログラムはデバッグするけど共有ライブラリなんかデバックしないから案外、「そこどうなってんだろ?」って疑問に感じたときにツッコミにくい所だったりしますよね、でもgentooなら出きるんです。

glibcをデバックオプション付きでビルドする


なにせ、熱いglibcをビルドするので、仮想環境などでやった方が良いと思われますので、実機でやる場合は、ご注意ください。
portageのビルドの設定をチョットいじる、ファイル名は何でもいいということです

/etc/portage/env/debug-cflags
CFLAGS="-O2 -ggdb -pipe"
FEATURES="${FEATURES} splitdebug nostrip"
それから以下のファイルに、先ほど書いたファイル名のパッケージ名の次に書く

/etc/portage/package.env
sys-libs/glibc debug-cflags
そしたら、debug付きでglibcをビルドする
karky7 ~ # USE="debug" emerge sys-libs/glibc
これで、デバック情報の追加されたglibcが展開されます

ソースを持ってくる


emergeしたglibcのソースコードを持ってくる、コードを持ってきてパッチまで当ててくれる
karky7 ~ # ebuild /usr/portage/sys-libs/glibc/glibc-2.17.ebuild unpack
 * glibc-2.17.tar.xz SHA256 SHA512 WHIRLPOOL size ;-) ...                    [ ok ]
 * glibc-2.17-patches-8.tar.bz2 SHA256 SHA512 WHIRLPOOL size ;-) ...         [ ok ]
 * checking ebuild checksums ;-) ...                                         [ ok ]
 * checking auxfile checksums ;-) ...                                        [ ok ]
 * checking miscfile checksums ;-) ...  
...
...
...
そのまま自分のhomeへコピー、そのままでもいいけど消えちゃう場合があるので...
karky7 ~ # mkdir /home/cuomo/src
karky7 ~ # cp -rf /var/tmp/portage/sys-libs/glibc-2.17/work/glibc-2.17/ /home/cuomo/src/
karky7 ~ # chown -R cuomo:cuomo /home/cuomo/src/

.gdbinitファイルへソースファイル情報を追加


gdbが参照できるようにソース情報を作成する
cuomo@karky7 ~/src/glibc-2.17 $ find /home/cuomo/src/glibc-2.17 -type d | xargs -i echo "dir {}" >> ~/.gdbinit
cuomo@karky7 ~/src/glibc-2.17 $ cat ~/.gdbinit | head -n 10
dir /home/cuomo/src/glibc-2.17/posix
dir /home/cuomo/src/glibc-2.17/posix/rxspencer
dir /home/cuomo/src/glibc-2.17/posix/bits
dir /home/cuomo/src/glibc-2.17/posix/sys
dir /home/cuomo/src/glibc-2.17/grp
dir /home/cuomo/src/glibc-2.17/localedata
dir /home/cuomo/src/glibc-2.17/localedata/charmaps
dir /home/cuomo/src/glibc-2.17/localedata/tst-fmon-locales
dir /home/cuomo/src/glibc-2.17/localedata/locales
dir /home/cuomo/src/glibc-2.17/localedata/tests-mbwc
cuomo@localhost ~/src/glibc-2.17 $

サンプルコードで試す


サンプルコード
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
  char *p = NULL;

  p = (char*)malloc(sizeof(char) * 1024);
  if(p) {
    strcpy(p, "OK マロックさんが着ました\n");
    puts(p);
  } else {
    puts("無理っす\n");
  }
  return 0;
}
そしてビルド
cuomo@karky7 ~ $ gcc -g malloc_test.c -o malloc_test

emacsからgdb起動


emacsを起動してから「M-x gdb」でgdbして、breakをmallocに設定する
Current directory is ~/src/
GNU gdb (Gentoo 7.6.2 p1) 7.6.2
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type \"show copying\"
and \"show warranty\" for details.
This GDB was configured as \"x86_64-pc-linux-gnu\".
For bug reporting instructions, please see:
<http://bugs.gentoo.org/>...
Warning: /home/cuomo/src/glibc-2.17/autom4te.cache: \\343\\201\\235\\343\\201...
Reading symbols from /home/cuomo/src/malloc_test...done.
(gdb) l
1   #include <stdio.h>
2   #include <stdlib.h>
3   #include <string.h>
4
5   int main(void)
6   {
7     char *p = NULL;
8
9     p = (char*)malloc(sizeof(char) * 1024);
10    if(p) {
(gdb) b malloc
Breakpoint 1 at 0x400530
(gdb)
で動かすと
(gdb) r
Starting program: /home/cuomo/src/malloc_test
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
(gdb) 
そうするとglibcの中のmalloc関数でブレークする、emacsの別フレームにブレークしたソース箇所が表示さる
...
...
    alloc_last_block = (void *) alloc_ptr;
    alloc_ptr += n;
    return alloc_last_block;
  }

  void * weak_function
  malloc (size_t n)
  {
B =>return __libc_memalign (sizeof (double), n);
  }

  /* We use this function occasionally since the real implementation may
     be optimized when it can assume the memory it returns already is
     set to NUL.  */
  void * weak_function
...
...
と言う感じでmallocで停止してくれる、これは便利、他のパッケージでも同じ、これならいろんなコードを読めて動かせる

gentooって素晴らしい...すいません、チョットふざけ過ぎました。


2015年1月18日日曜日

Yesodのhamletテンプレートで変数展開

hamletの変数展開でチョットしたメモ


YesodでHTMLのテンプレートエンジンでhamletを使っているのですが、適当にやり過ぎていたのでチョット真面目に調べてみました、と言ってもたいした量ではないのですが。


こわいな...

Handlerからテンプレートへ変数をアサインする


Handlerでlet式で変数定義したものをテンプレート内で利用する
getHomeR :: Handler Html
getHomeR = defaultLayout $ do
      let cs = ".kazuto .g" :: Text
          tag = "<div>Kazuto g</div>" :: Text
          tag2 = [hamlet|<div>Kazuto g|]
      setTitle "最近キャバクラに..."
      caba <- setCabaName "jito"
      $(widgetFile "home")

setCabaName :: MonadWidget m => String -> m String
setCabaName tailstr = return $ "A" ++ tailstr

そしてテンプレートに変数展開する
<p .#{cs}>Here
#{tag}
^{tag2}
#{caba}

するとHTMLの出力には最終的にこうなる
<p class=".kazuto .g">Here</p>
&lt;div&gt;Kazuto g&lt;/div&gt;
<div>Kazuto g</div>
Ajito

タグのclass属性に出力する場合は、.#で出力しなければならないらしい、変数に保存されているHTMLを出力する場合は、widgetを利用する

Yesodでhamletの気に入ってるところ


皆さんそれぞれだとは思いますが、私として気に入っているところは、終了タグを書くとエラーになるところですかね。
インデントでタグの終了を判断するので初めは「チョット面倒だな」って思ったのですが、HTMLが複雑になってくると逆に見通しがよく、分かりやすい構造になっている事に気づいちゃいます。案外、HTMLってコピペして適当にかかれちゃう時があるので、これくらいの制約があってもいいんじゃないかと思いました。

Hamletって骸骨とかいっぱいで怖い、Yesod楽しいです

2015年1月9日金曜日

弊社新サービス crayon(クレヨン)のコマーシャルが放映されました

crayon(クレヨン)


e-shops crayon とは最近リリースした新サービスで、スマホメインのCMS機能です。

 

HTMLとか書かなくても指だけでサイトを構築できちゃう簡単ユーザーインターフェースをもったシステムです。



スマホが爆発的に普及してしまった現在、スマホも必要不可欠な収益源だと思いますよね。そういったショップ様にオススメな新機能です。基本的には無料で利用できますので、一度使ってみてください。

今後、弊社クレヨン開発チームが続々と新機能を追加していく予定ですのでご期待下さい。

今ならお得な何かがあったような!?

e-shops crayon


こちらがサービス紹介ページです

 

2015年1月3日土曜日

Yesod Authのカスタムログインフォーム

Yesod Authのカスタムログインフォーム


やっぱり次の要望としてログインフォームをイジりたくなってしまいます、英語で「Login」とか書かれても純粋日本男児としては体が受け付けません。
どうやったらカスタマイズ出きるかと調べたのでメモ。

Foundation.hsのYesodAuthインスタンスをイジる

authHashDBWithForm関数の宣言
import Yesod.Auth.HashDB (authHashDBWithForm, getAuthIdHashDB, HashDBUser(..))


authPluginsをauthHashDBからauthHashDBWithFormへ修正する
instance YesodAuth App where
    type AuthId App = UserId

    -- Where to send a user after successful login
    loginDest _ = HomeR
    -- Where to send a user after logout
    logoutDest _ = HomeR
    -- Override the above two destinations when a Referer: header is present
    redirectToReferer _ = True

    getAuthId creds = getAuthIdHashDB AuthR (Just . UniqueUser) creds
    authPlugins _ = [authHashDBWithForm loginForm (Just . UniqueUser)]
    ...
    ...

カスタムテンプレートを出力する関数を用意する
loginForm :: Route App -> Widget
loginForm action = $(whamletFile "templates/loginform.hamlet")

そして最後にhamletテンプレートファイルを作成
<div style="text-align:center">
    <h2>日本語でログインフォーム
    <form method="post" action="@{action}">
        <table border="0" cellpadding="0" cellspacing="0" style="margin-left: auto; margin-right: auto">
            <tbody>
                <tr>
                    <td valign="top">ログインID:
                    <td valign="top">
                        <input name="username" style="width:250px">
                <tr>
                    <td valign="top">パスワード:
                    <td valign="top">
                        <input type="password" name="password" style="width:250px">
                <tr>
                    <td colspan="2" valign="top">
                        <input type="submit" value="乱入じゃなくてログインする">

これで起動すると
となりした、オリジナルのログインフォームはjavascriptが動いていましたがこのフォームは動きません。authHashDB関数辺りを調べれば分かるような気がします。

参考にしたサイト


Authentication plugin for Yesod.

って書いてあるじゃないか、ちゃんとドキュメントを最初にしっかり読みましょう


2015年1月2日金曜日

YesodのAuthorizationについてメモ

Authorizationのしかた

雪が降った後でヤバいのですが、YesodでログインしたあとのAuthorization(認可)のやり方を調べたのでメモ。

簡単に言ってしまうと、YesodクラスのisAuthorized関数をいじると出来ちゃう、具体的には


* Foundation.hsを修正
instance Yesod App where
    -- Controls the base of generated URLs. For more information on modifying,
    -- see: https://github.com/yesodweb/yesod/wiki/Overriding-approot
    approot = ApprootMaster $ appRoot . appSettings
...
...
...

    -- Default to Authorized for now.
    -- ここをisLoginedで書き換え         
    isAuthorized _ _ = isLogined
...
...

-- ログインしていたらAuthorizedを返す
isLogined::HandlerT App IO AuthResult
isLogined = do
  mu <- maybeAuthId
  return $ case mu of
    Nothing -> AuthenticationRequired
    Just _ -> Authorized
isAuthorizedの引数を指定すれば対応するURLにAuthorizationがかかるらしい(適当ですいません)、なるほどぉ