<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Advent Calendar on something tech.</title><link>https://blog.web-apps.tech/tags/Advent-Calendar/</link><description>Recent content in Advent Calendar on something tech.</description><generator>Hugo -- 0.164.0</generator><language>ja-jp</language><copyright>@nasa9084</copyright><lastBuildDate>Tue, 02 Dec 2025 00:00:00 +0900</lastBuildDate><atom:link href="https://blog.web-apps.tech/tags/Advent-Calendar/index.xml" rel="self" type="application/rss+xml"/><item><title>串鳥</title><link>https://blog.web-apps.tech/kushidori/</link><pubDate>Tue, 02 Dec 2025 00:00:00 +0900</pubDate><guid>https://blog.web-apps.tech/kushidori/</guid><description>&lt;p&gt;本記事は&lt;a href="https://adventar.org/calendars/11865" target="_blank" rel="noopener"&gt;吉祥寺.pmについての25個の小さな話、またはMagnolia.Kの雑記 Advent Calendar 2025&lt;/a&gt;
2日目の記事です。
昨日はKaitouさんの&lt;a href="https://kaitou.hatenadiary.com/entry/%E5%A4%A7%E5%90%89%E7%A5%A5%E5%AF%BApm2025_%E3%82%B5%E3%82%B3%E3%83%83%E3%82%B7%E3%83%A5" target="_blank" rel="noopener"&gt;大吉祥寺.pmのPCが入るサコッシュを勝手に作ったお知らせ #kichijojipm&lt;/a&gt;
でした。
吉祥寺.pm、ロゴが可愛いのでサコッシュになっても映えますね。ちょっとほしいけどPCをサコッシュに入れて持って歩くことはなさそう・・・&lt;/p&gt;
&lt;p&gt;扨、実は吉祥寺.pmは&lt;a href="https://blog.web-apps.tech/dai-kichijoji-pm/"&gt;昨年の大吉祥寺.pmに行った&lt;/a&gt;
だけで、通常の吉祥寺.pmに行ったことも無く、吉祥寺自体も大吉祥寺.pm以外に1回行ったことがあるかないか、というレベルなのですが、&lt;a href="https://x.com/kichijojipm/status/1987871600092610748" target="_blank" rel="noopener"&gt;吉祥寺.pm公式のX Post&lt;/a&gt;
によれば、吉祥寺の美味しいもの情報でも可、ということなので、吉祥寺の美味しいものとして&lt;a href="https://kushidori.com/" target="_blank" rel="noopener"&gt;串鳥&lt;/a&gt;
をご紹介いたします。&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="ja" dir="ltr"&gt;なんかアドベントカレンダー熱が再燃したので、初めての吉祥寺.pmアドベントカレンダーを作りました&lt;br&gt;&lt;br&gt;吉祥寺の美味しいもの情報でも可です&lt;a href="https://t.co/jVZZWhByxx"&gt;https://t.co/jVZZWhByxx&lt;/a&gt;&lt;a href="https://x.com/hashtag/kichijojipm?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#kichijojipm&lt;/a&gt;&lt;/p&gt;&amp;mdash; 吉祥寺.pm (@kichijojipm) &lt;a href="https://x.com/kichijojipm/status/1987871600092610748?ref_src=twsrc%5Etfw"&gt;November 10, 2025&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.x.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;h2 id="串鳥"&gt;串鳥&lt;/h2&gt;
&lt;p&gt;串鳥は北海道札幌市に本社を置き、本日時点で北海道に31店舗、仙台に5店舗、そして吉祥寺に店舗のある焼き鳥チェーン店です。
なお、筆者は現在北海道札幌市在住で、前述の通り吉祥寺にはほとんど行ったことがないため、串鳥吉祥寺南口店にも行ったことがありません。
本記事中の写真は串鳥東区役所前店で撮影しました。&lt;/p&gt;
&lt;p&gt;まさか誰も、吉祥寺.pmのアドベントカレンダーの2日目にして札幌の焼き鳥屋の話を書くとは思わなかろう。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://maps.app.goo.gl/M9yKLssBvjC35ocA9" target="_blank" rel="noopener"&gt;噂&lt;/a&gt;
によれば、吉祥寺南口店は駅から武蔵野公会堂方面に出た時、駅前すぐにあるようです。&lt;/p&gt;
&lt;p&gt;以下、串鳥で食べたものの写真を掲載します:&lt;/p&gt;
&lt;p&gt;
&lt;img loading="lazy" src="https://blog.web-apps.tech/kushidori/images/soup_hu_c91ed35560d373dc.jpg" alt="鶏ガラスープ" /&gt;
&lt;/p&gt;
&lt;p&gt;串鳥といえば鶏ガラスープ。これはサービスで出てくるもので、ポットで出てくるので好きなだけ飲めます。
写真を撮るのを忘れたのですが、お通しとしてこれとともに大根おろしが出てきます。&lt;/p&gt;
&lt;p&gt;噂によると吉祥寺南口店では大根おろしが出てこないという話もあるので、一度確認しに行きたいところです。&lt;/p&gt;
&lt;p&gt;
&lt;img loading="lazy" src="https://blog.web-apps.tech/kushidori/images/1_hu_6ec95074f5cbe1c8.jpg" alt="ひな皮、手羽先、つくね" /&gt;
&lt;img loading="lazy" src="https://blog.web-apps.tech/kushidori/images/2_hu_d1d9790bd5cb431f.jpg" alt="もちベーコン、豚精肉" /&gt;
&lt;/p&gt;
&lt;p&gt;ひな皮、手羽先、つくね(梅しそ)。
これは東区役所前店特有のやつだとおもうんですが、「店長のおまかせセット」なるものがあり、この日はそれが少し安いです、ということだったので頼みました。
もちベーコン、串鳥以外で見たことない気がする。&lt;/p&gt;
&lt;p&gt;
&lt;img loading="lazy" src="https://blog.web-apps.tech/kushidori/images/3_hu_5be12ad7e22d4994.jpg" alt="岩下の新生姜豚巻、焼きカチョカヴァロ" /&gt;
&lt;img loading="lazy" src="https://blog.web-apps.tech/kushidori/images/4_hu_6a0c54999b2c2e80.jpg" alt="焼きカチョカヴァロのメニュー" /&gt;
&lt;/p&gt;
&lt;p&gt;岩下の新生姜豚巻き、焼きカチョカヴァロ。
チーズが焼かれてるとなんか食べたくなりますよね。&lt;/p&gt;
&lt;p&gt;
&lt;img loading="lazy" src="https://blog.web-apps.tech/kushidori/images/5_hu_38c9b3549cbc059e.jpg" alt="ぽんぽち、豚味噌海苔巻き、豚しそ巻き" /&gt;
&lt;/p&gt;
&lt;p&gt;ぽんぽち、豚味噌海苔巻き、豚しそ巻き。
豚を巻いた、豚味噌海苔巻きと豚しそ巻きも串鳥といえば、のメニューの一つですね。&lt;/p&gt;
&lt;p&gt;
&lt;img loading="lazy" src="https://blog.web-apps.tech/kushidori/images/6_hu_a974160f4e7d15e3.jpg" alt="鳥ももハニーマスタード、チキン南蛮" /&gt;
&lt;/p&gt;
&lt;p&gt;鳥ももハニーマスタード、チキン南蛮。チキン南蛮はなんかフェアメニュー的なやつでした。&lt;/p&gt;
&lt;h2 id="コラボグッズ"&gt;コラボグッズ&lt;/h2&gt;
&lt;p&gt;最近、串鳥と&lt;a href="https://www.shimamura.co.jp/" target="_blank" rel="noopener"&gt;島村楽器&lt;/a&gt;
のコラボアイテムが発売されまして、地元企業とのコラボグッズは嬉しいな〜など思いながら買いました:&lt;/p&gt;
&lt;p&gt;
&lt;img loading="lazy" src="https://blog.web-apps.tech/kushidori/images/strap_hu_3435a39b39798e01.jpg" alt="ギターストラップとピック" /&gt;
&lt;/p&gt;
&lt;p&gt;改めて島村楽器のお知らせ一覧を眺めていると、ここ最近で九州乳業やら矢場とんやらとのコラボもやっているらしく、各地元企業がフィーチャーされるというのは良いことだな、と思います。&lt;/p&gt;
&lt;h2 id="締めの一句"&gt;締めの一句&lt;/h2&gt;
&lt;p&gt;しってるか&lt;br&gt;
吉祥寺にも&lt;br&gt;
串鳥が&lt;/p&gt;</description></item><item><title>go-openapi を書き直しています</title><link>https://blog.web-apps.tech/nasa9084-go-openapi-rewriting/</link><pubDate>Fri, 20 Dec 2019 08:15:39 +0000</pubDate><guid>https://blog.web-apps.tech/nasa9084-go-openapi-rewriting/</guid><description>&lt;p&gt;本記事は&lt;a href="https://qiita.com/advent-calendar/2019/go2" target="_blank" rel="noopener"&gt;Go2 Advent Calendar&lt;/a&gt;
の20日目の記事です。昨日はyaegashiさんによる、&lt;a href="https://l0w.dev/posts/jsonex.go/" target="_blank" rel="noopener"&gt;jsonx.go&lt;/a&gt;
でした。&lt;/p&gt;
&lt;p&gt;皆さんは&lt;a href="https://github.com/OAI/OpenAPI-Specification" target="_blank" rel="noopener"&gt;OpenAPI Specification&lt;/a&gt;
というモノをご存じでしょうか。OpenAPI SpecificationはJSONまたはYAMLでREST APIを表現するための仕様で、現在&lt;a href="https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.2.md" target="_blank" rel="noopener"&gt;バージョン3.0.2&lt;/a&gt;
が最新です。いわゆる&lt;a href="https://swagger.io/" target="_blank" rel="noopener"&gt;Swagger&lt;/a&gt;
の後継で、バージョン1系、2系がSwagger、3系以降がOpenAPI、ということになっています(Swaggerなら聞いたことがある/使っているという人も多いのではないでしょうか)。&lt;/p&gt;
&lt;p&gt;OpenAPI Specificationは人間にも機械にも(比較的)読みやすい仕様書として、コード生成や、ドキュメントページの生成に使用することが可能です。&lt;/p&gt;
&lt;p&gt;個人的には専らコード生成に使用しており、Go言語向けの実装として&lt;a href="https://github.com/nasa9084/go-openapi" target="_blank" rel="noopener"&gt;github.com/nasa9084/go-openapi&lt;/a&gt;
(以下go-openapi)を実装・公開しています。
go-openapiは2017年ごろから細々と実装を続けており、(多分)二番目か三番目には古いと思われるOpenAPIのGo実装です。&lt;/p&gt;
&lt;p&gt;基本的にはただひたすらOpenAPIのオブジェクトをGoの構造体として定義、値のバリデーション関数を用意しているといったもので、特別な機能はほとんどありません。
YAMLのパーサも、&lt;a href="https://github.com/go-yaml/yaml" target="_blank" rel="noopener"&gt;go-yaml/yaml&lt;/a&gt;
を使用しており、自前では実装していません。&lt;/p&gt;
&lt;p&gt;そんな中、&lt;a href="https://twitter.com/goccy54" target="_blank" rel="noopener"&gt;@goccy&lt;/a&gt;
さんが、encoding/jsonとコンパチなインターフェースを持ったYAMLパーサを開発した、という話を耳にし、これを機に、とgo-openapiの実装を一から書き直し始めました。
もともと、パースは完全にgo-yaml/yamlに依存しており、Unmarshal系のメソッドも実装していなかった(途中から全部書くのはつらかったので・・・)ため、一部バリデーションに必要な関数を埋め込んだりもできなかったので、書き直したいとは思っていたのです。&lt;/p&gt;
&lt;p&gt;現時点ではまだ&lt;a href="https://github.com/nasa9084/go-openapi/pull/3" target="_blank" rel="noopener"&gt;マージしておらず&lt;/a&gt;
、書いている途中なのですが、大きな変更点として次の様なものがあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;もともとパブリックだったフィールドをすべてプライベートに変更し、ゲッターをはやした&lt;/li&gt;
&lt;li&gt;各構造体に対応する&lt;code&gt;UnmarshalYAML()&lt;/code&gt;メソッドをすべてコード生成するようにした&lt;/li&gt;
&lt;li&gt;YAMLパーサは&lt;a href="https://github.com/goccy/go-yaml" target="_blank" rel="noopener"&gt;github.com/goccy/go-yaml&lt;/a&gt;
に乗り換えた&lt;/li&gt;
&lt;li&gt;rootオブジェクトを各構造体に埋め込むことで、バリデーションをとりやすくした&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;今後はよりコード生成に便利なメソッドを追加していきたいと思っています。&lt;/p&gt;
&lt;p&gt;時間の都合で今日はここまで。技術的な話が全然無い記事になってしまった・・・&lt;/p&gt;</description></item><item><title>gitにもaliasの指定ができる件</title><link>https://blog.web-apps.tech/git-aliases/</link><pubDate>Wed, 12 Dec 2018 06:16:37 +0000</pubDate><guid>https://blog.web-apps.tech/git-aliases/</guid><description>&lt;h2 id="tldr"&gt;tl;dr&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.gitconfig&lt;/code&gt;にもaliasの登録ができる
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[alias]&lt;/code&gt;ブロックにaliasを登録する&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags&lt;/code&gt;で単数・複数の悩みを解消する&lt;/li&gt;
&lt;li&gt;&lt;code&gt;discard&lt;/code&gt;で変更を取り消す&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unstage&lt;/code&gt;でaddを取り消す&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uncommit&lt;/code&gt;でcommitを取り消す&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ignore&lt;/code&gt;で&lt;code&gt;.gitignore&lt;/code&gt;を生成する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="git-aliases"&gt;git aliases&lt;/h2&gt;
&lt;p&gt;この記事は&lt;a href="https://qiita.com/advent-calendar/2018/yumemi01_one-liner" target="_blank" rel="noopener"&gt;今すぐalias登録すべきワンライナー by ゆめみ① Advent Calendar 2018&lt;/a&gt;
の6日目の穴埋め記事です。
こちらのアドベントカレンダーは今すぐalias登録べきワンライナーということで、みなさん&lt;code&gt;.bashrc&lt;/code&gt;や&lt;code&gt;.zshrc&lt;/code&gt;のaliasについて記事を書いてらっしゃいますが、実は&lt;code&gt;.gitconfig&lt;/code&gt;という、&lt;code&gt;git&lt;/code&gt;コマンドの設定を書いておくファイルにもaliasの指定ができます。
誰もshellのaliasとは言ってない！(・・・はず)ので、いくつか&lt;code&gt;.gitconfig&lt;/code&gt;用に便利なaliasを紹介していきましょう&lt;/p&gt;
&lt;h3 id="aliasの登録方法"&gt;aliasの登録方法&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.gitconfig&lt;/code&gt;は基本的にiniファイルです。そのため、次のように登録します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[alias]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;aliasname1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;some command 1st&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;aliasname2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;some command 2nd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;簡単ですね？ &lt;code&gt;[alias]&lt;/code&gt;というブロックを作成し、alias名=コマンドの形で記述します。
このときコマンドは&lt;code&gt;git xxx&lt;/code&gt;の形で実行される、&lt;code&gt;xxx&lt;/code&gt;の部分のみを指定します。&lt;/p&gt;
&lt;p&gt;例えば、&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[alias]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;stat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;git status&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;と指定すると実際の実行時には&lt;code&gt;git git status&lt;/code&gt;という形で実行されてしまいエラーになるので注意しましょう。
&lt;code&gt;git&lt;/code&gt;のつかないコマンドを実行したい場合は頭に&lt;code&gt;!&lt;/code&gt;をつけます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[alias]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;!ls&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;このように記載すると、&lt;code&gt;git ls&lt;/code&gt;で&lt;code&gt;ls&lt;/code&gt;が実行されます。&lt;/p&gt;
&lt;h3 id="git-tags"&gt;&lt;code&gt;git tags&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;git tag&lt;/code&gt;というコマンドがありまして。まぁみなさんご存知でしょうが、tagの一覧を出したり、新しいtagを作ったりするコマンドです。これ単体では特に問題がないのですが、リモートリポジトリと合わせて使うと、ちょっと悩みが発生します。
&lt;code&gt;git tag&lt;/code&gt;コマンドでタグをつけた後、リモートリポジトリにpushするときのコマンドは&lt;code&gt;git push --tags&lt;/code&gt;です。これはtagをまとめてpushするので、複数形なんでしょう。しかしです。tagの一覧を出すときに使うのも&lt;code&gt;git tag&lt;/code&gt;と単数形なんですね。
ついつい&lt;code&gt;git tags&lt;/code&gt;と打ってしまいませんか？&lt;/p&gt;
&lt;p&gt;そんなあなたはこんなaliasを登録しておきましょう&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[alias]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;tag&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;地味ですが、これで単数形か複数形か悩まずに済みます。&lt;/p&gt;</description></item><item><title>go-sqlrow</title><link>https://blog.web-apps.tech/go-sqlrow/</link><pubDate>Wed, 13 Dec 2017 02:44:32 +0000</pubDate><guid>https://blog.web-apps.tech/go-sqlrow/</guid><description>&lt;p&gt;この記事は&lt;a href="https://qiita.com/advent-calendar/2017/go2" target="_blank" rel="noopener"&gt;Go2 Advent Calendar 2017&lt;/a&gt;
13日目の記事です。
昨日は&lt;a href="https://qiita.com/kami_zh" target="_blank" rel="noopener"&gt;@kami_zh&lt;/a&gt;
さんの &lt;a href="https://qiita.com/kami_zh/items/e6bea56db36bac8ca108" target="_blank" rel="noopener"&gt;Goで標準出力をキャプチャするパッケージを書いた&lt;/a&gt;
でした。&lt;/p&gt;
&lt;h2 id="go-sqlrow"&gt;go-sqlrow&lt;/h2&gt;
&lt;p&gt;Go言語で標準パッケージを使用してRDBMSからデータを取ってくるには、以下の様に書きます&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;struct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;dn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;dsn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;`SELECT id, name FROM person where id=&amp;#39;foo&amp;#39;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;SQL文を発行するまではいいのですが、最後の行、&lt;code&gt;sql.Row#Scan&lt;/code&gt;がくせ者です。
上記の例のように、&lt;code&gt;sql.row#Scan&lt;/code&gt;は可変長個のポインタを引数にとり、それらにそれぞれ値をセットします。この例では値の数が2つのため大きな問題ではありませんが、値の数が増えた場合などは非常に面倒です。また、テーブルの構造が変わった場合なども非常に面倒です。&lt;/p&gt;
&lt;p&gt;この問題を解決するため、&lt;a href="https://github.com/nasa9084/go-sqlrow" target="_blank" rel="noopener"&gt;go-sqlrow&lt;/a&gt;
という小さなパッケージを作りました&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;。
これは上記の&lt;code&gt;row.Scan&lt;/code&gt;を代わりにやってくれるパッケージです。&lt;/p&gt;
&lt;p&gt;機能・使い方は簡単で、先ほどの例を次の様に書き換えます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;struct&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;dn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;dsn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;`SELECT id, name FROM person where id=&amp;#39;foo&amp;#39;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;sqlrow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;後は内部で&lt;code&gt;row.Scan&lt;/code&gt;相当の処理を行います。
unexportedなフィールドは&lt;code&gt;encoding/json&lt;/code&gt;同様、&lt;code&gt;sql.Row&lt;/code&gt;との対応がとれませんので、注意が必要です。&lt;/p&gt;</description></item><item><title>学生が勉強会/コミュニティを運営するということ</title><link>https://blog.web-apps.tech/community_advent/</link><pubDate>Sat, 17 Dec 2016 06:37:00 +0000</pubDate><guid>https://blog.web-apps.tech/community_advent/</guid><description>&lt;p&gt;この記事は&lt;a href="http://qiita.com/advent-calendar/2016/event-management" target="_blank" rel="noopener"&gt;IT勉強会/コミュニティ運営 Advent Calendar 2016&lt;/a&gt;
に寄せて書いた記事です。
執筆者は&lt;a href="https://twitter.com/nasa9084" target="_blank" rel="noopener"&gt;@nasa9084&lt;/a&gt;
です。
前日の記事は一般社団法人LOCALさんの&lt;a href="http://qiita.com/local_hokkaido/items/e15c8e80034e7f1c45ac" target="_blank" rel="noopener"&gt;一般社団法人LOCAL のご紹介&lt;/a&gt;
でした。&lt;/p&gt;
&lt;h1 id="まずはじめに"&gt;まずはじめに&lt;/h1&gt;
&lt;p&gt;あまりネット上、特にブログで自己紹介をする機会というのは多くなく、このブログ単体で言うならば、とある理由があって以前書いていたブログから移行してきたばかりなので、自己紹介というものをすこしはしているのですが、折角の機会でもあるので、ある程度きちんと自己紹介から始めさせていただくこととします。
どうもこんにちは&lt;a href="https://twitter.com/nasa9084" target="_blank" rel="noopener"&gt;nasa9084&lt;/a&gt;
といいます。
現在試される大地であるところの北海道は札幌市に住んでいる大学生(0x17歳)です。
来春4月から、東京で就職予定ですが、卒業論文の進捗が芳しくありません。
&lt;a href="https://builderscon.io][builderscon]]%e3%82%84%e3%80%81[[https://www.pycon.jp" target="_blank" rel="noopener"&gt;PyCon JP&lt;/a&gt;
というカンファレンスのスタッフをしたりしています。&lt;/p&gt;
&lt;h1 id="でじぽろという勉強会"&gt;「でじぽろ」という勉強会&lt;/h1&gt;
&lt;p&gt;昨年のから今年の10月まで、札幌で&lt;a href="https://digiporo.charakoba.com" target="_blank" rel="noopener"&gt;&lt;strong&gt;でじぽろ&lt;/strong&gt;&lt;/a&gt;
という勉強会を主催していました。
でじぽろはIT技術初心者、もう少し具体的に言うと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;UNIX/Linuxに興味がある/使ったことがある&lt;/li&gt;
&lt;li&gt;プログラミングに興味がある/すこしやったことがある&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;といったレベルの方を対象として月に一回開催していた勉強会です。&lt;/p&gt;
&lt;p&gt;私と、&lt;a href="https://twitter.com/chamaharun" target="_blank" rel="noopener"&gt;@chamaharun&lt;/a&gt;
の二人で主催をしていて、内容としては&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP入門&lt;/li&gt;
&lt;li&gt;SQL入門&lt;/li&gt;
&lt;li&gt;プログラミング言語大横断&lt;/li&gt;
&lt;li&gt;Linuxディストリビューションの紹介&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;なんかをやったりしていました。&lt;/p&gt;
&lt;h1 id="勉強会を開催するということ"&gt;勉強会を開催するということ&lt;/h1&gt;
&lt;p&gt;扨、少しばかり前置きが長くなってしまいましたが、そろそろ本題であるところの運営に関する部分の話をしなきゃいけないですね。
今回は&lt;a href="http://qiita.com/advent-calendar/2016/event-management" target="_blank" rel="noopener"&gt;IT勉強会/コミュニティ運営 Advent Calendar&lt;/a&gt;
ですから、多くの大事なところは他の大人な方々が書いてくれてますので、今日は私が特に気をつけたほうがいいと思っていることだったり、おすすめの方法論だったりについて書きましょう。&lt;/p&gt;
&lt;h2 id="持ち出しはしない"&gt;持ち出しはしない&lt;/h2&gt;
&lt;p&gt;勉強会を継続的に運営するにあたり、主催者やスタッフの財布からお金が出ていくことは避けたほうがよいと思います。
楽しいことがしたいと思って始める(であろう)勉強会ですが、事前準備や当日の運営、終わったあとの処理など、結構な時間や労力がかかります。これは大きな負担で、この上開催にお金がかかるとなると、金額が大したことない額だったとしても、継続するのは心理的に困難になるでしょう。
せっかく立ち上がった勉強会も、「主催のお金がないので継続開催できません」では悲しいものがあります。
初回開催など、立て替える必要がある場面はあると思いますが、開催後にでも精算を行って、主催者・スタッフのマイナスが無いようにしたほうがよいです。&lt;/p&gt;
&lt;h2 id="自分に強制するという選択肢"&gt;自分に強制する、という選択肢&lt;/h2&gt;
&lt;p&gt;多くのコミュニティ運営者は、「勉強会やコミュニティの運営は仕事ではないので、開催しなければならないという意識を持って開催するのはつらいからやめたほうがいい」と言っている様に思います。
わたしも多くの部分で賛成ですが、個人の性格だったり、勉強会の目的次第では、「&lt;strong&gt;強制的に開催する&lt;/strong&gt;」という選択肢もある、と覚えておいてください。&lt;/p&gt;
&lt;p&gt;私が主催していたでじぽろの目的の一つに、「主催も勉強する」というものがあります。初心者向けなんて謳っているけれど、主催も学生だから、一緒に勉強していきましょう！ということです。
加えて、主催である私も、&lt;a href="https://twitter.com/chamaharun" target="_blank" rel="noopener"&gt;@chamaharun&lt;/a&gt;
も、比較的怠惰な性格をしています。
そこで、でじぽろ運営にあたって、一つルールを決めました。
それが、「つらくても、話すネタがなくても、とにかく月に一回開催する」というルールです。&lt;/p&gt;
&lt;p&gt;不定期開催というのは、心理的負担も減りますが、それと同時に、気づいたら二回目の開催がないまま時間だけが過ぎていた、なんてことになりやすい開催方式でもあります。
定期的に開催することを自分に義務付けることで、勉強会を開催することが習慣になります。
継続開催を目標の一つとする場合、この選択は大きな助けともなってくれることと思います。
&lt;strong&gt;でじぽろ&lt;/strong&gt;は、このルールのおかげで、一年間毎月開催することができたと思っています。&lt;/p&gt;
&lt;h2 id="あまり深く考えない"&gt;あまり深く考えない&lt;/h2&gt;
&lt;p&gt;勉強会を主催するということは、実はそれほどハードルの高いことではありません。「とりあえず気が向いたからはじめてみた」くらいの気持ちで十分です。
でじぽろも、はじめは友人との呑みの席で、「なんか勉強会とかやってみたいよね」で始まったのでした。
皆言ってることでは有りますが、&lt;em&gt;仕事ではない&lt;/em&gt;のです。辛かったり、つまらなかったらやめていいんです。
そして、気が向いたらまた新しく始めてみたらいいと思いますよ。&lt;/p&gt;
&lt;h2 id="懇親会をする"&gt;懇親会をする&lt;/h2&gt;
&lt;p&gt;個人的にこれはとても重要なことだと思っているのですが、懇親会はぜひやったほうがいいと思います。4日の&lt;a href="http://blog.hotolab.net/entry/gotandajs_1st_anniv" target="_blank" rel="noopener"&gt;エンジニアコミュニティのつくりかた&lt;/a&gt;
でも書かれていましたが、&lt;strong&gt;懇親会が本編だと考えています&lt;/strong&gt;。
多くの場合、勉強会で発表されることは、今の御時世ですから、検索したら出てきます。わざわざオフラインで集まってスクリーンの前で発表なんて聞かなくてもいいんです。
それでもやっぱり勉強会/コミュニティに集まるというのは、&lt;strong&gt;人と人との出会い&lt;/strong&gt;が重要だからだと思います。
そして、発表のときというのは、座っているうち8割9割の人は質問もしないですし、発表後に発表者に挨拶に行ったりもしません。
これでは、休みの日に、わざわざ集まっている意味は無いと思います。&lt;/p&gt;
&lt;p&gt;懇親会を開催することで、大勢の前の発表では言えないことだったり、発表するほどでは無いけど趣味で触っている新技術の話だったり、そういったものに大きな意味が有ります。twitterやfacebookでつながりを持つことに意味があるんです。&lt;/p&gt;
&lt;h1 id="学生が勉強会を運営するということ"&gt;「学生が」勉強会を運営するということ&lt;/h1&gt;
&lt;p&gt;扨、それなりの量を書いた(気になっている)のですが、他の記事を書いている方々は皆さん大人(学生ではない)の方々ですね。
ココで一つ、「&lt;strong&gt;学生が勉強会を運営すること&lt;/strong&gt;」のメリットを考えてみます。&lt;/p&gt;</description></item><item><title>pyorgというパッケージを作りました</title><link>https://blog.web-apps.tech/create_pyorg/</link><pubDate>Mon, 12 Dec 2016 17:19:00 +0000</pubDate><guid>https://blog.web-apps.tech/create_pyorg/</guid><description>&lt;p&gt;この記事は&lt;a href="http://qiita.com/advent-calendar/2016/emacs" target="_blank" rel="noopener"&gt;Emacs Advent Calendar 2016&lt;/a&gt;
の、13日目の記事で、執筆者は &lt;a href="https://twitter.com/nasa9084" target="_blank" rel="noopener"&gt;@nasa9084&lt;/a&gt;
です。
前日はfujimisakariさんの&lt;a href="http://blog.fujimisakari.com/elisp_useful_for_programming/" target="_blank" rel="noopener"&gt;プログラミングに役立つelisp10選&lt;/a&gt;
でした。&lt;/p&gt;
&lt;h1 id="org記法でブログを書きたい"&gt;org記法でブログを書きたい&lt;/h1&gt;
&lt;p&gt;全国のEmacsユーザの皆さん、org-modeは使っていますか？私は使っています。
普段Pythonを書く私にとって、&lt;code&gt;#&lt;/code&gt;はコメントアウトのイメージで、&lt;code&gt;#&lt;/code&gt;を見出しに使うmarkdownは(ダメってほどじゃないですけど)なんとなく好きになれません。Emacsユーザということもあり、細かいメモを取るときや、スライドを作るときはorg-modeを使っています。&lt;/p&gt;
&lt;p&gt;そんなわけで、慣れ親しんだorg記法。ブログを書くときも使いたいと考えました。
しかし、マークダウンで書くことができるブログや、或いはorgで書いたものをwordpressにアップすることができるelispなんかも有りましたが、どうもしっくり来ません。
そんな折に運用していたWordPressが使えなくなり、このブログシステムを作りました。
Pythonで使えるorg記法パーサも探したのですが、どれもブログで使えるようなものではなく、自分で変換機構も作成することにしました。
最初はブログシステムの中にorgをHTMLに変換するフィルターを作ればいいかな、と思って書き出したのですが、コレがなかなかうまく行かず。最終的にパーサとしてパッケージ化したので、そのお話をさせていただこうと思います。&lt;/p&gt;
&lt;h1 id="正規表現の置換だけで実装してみた"&gt;正規表現の置換だけで実装してみた&lt;/h1&gt;
&lt;p&gt;org記法を使いたいとは言っても、ブログ記事を書くのに使いたいだけなので、チェックボックスや時間に関する部分など、org-modeの大部分は必要ありません。文字の装飾部や見出し、リストが実装されれば十分です。
ですので、最初はわざわざ構文木などを作らずとも、単純に正規表現で置換すればいいのではと考えて実装を始めました。
しかしコレが大きな間違いだったのです。&lt;/p&gt;
&lt;h2 id="リスト"&gt;リスト&lt;/h2&gt;
&lt;p&gt;問題の１つめは、ネストしたリストを使えないことでした。
単純に正規表現で行ごとに置換していく都合上、ネストしたリストを解析することができません。この段階で、ネストしたリストは使わないことにしよう、と考えました。
しかし、実際に実装してみてわかったのですが(気づくのが遅い)、問題はそれだけではありませんでした。
リストが始まったことや終わったことを判断できないのです。いま置換している行はリストの始めなのか(つまり&lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;が必要なのか)、真ん中なのか、終わりなのか、判断することができないのです。これは困りました。&lt;/p&gt;
&lt;h2 id="スラッシュ"&gt;スラッシュ&lt;/h2&gt;
&lt;p&gt;更に大きな問題が潜んでいました。斜体とリンクです。
ご存知のように、URLは区切り文字としてスラッシュを多用します。また、org-modeでは斜体をスラッシュで挟んだ形で表します。
このせいで、URLの一部が斜体としてマークアップされてしまう事態が発生しました。
これはちょっと困ったものです。とりあえず斜体を使わないこととしましたが、これには不満が残ります。&lt;/p&gt;
&lt;h2 id="結局パーサとしてパッケージ化"&gt;結局パーサとしてパッケージ化&lt;/h2&gt;
&lt;p&gt;更に、テーブルの実装ができないなど、org記法が使える！というには不満点が多すぎました。
そんなわけで、改めて外部モジュールとして、org記法のパーサを書きました。org記法で書かれたテキストを読み込み、解析し、抽象構文木を生成します。そこからHTMLを出力することも可能です。GitHub上でソースも公開しています(&lt;a href="https://github.com/nasa9084/py-org][nasa9084/py-org" target="_blank" rel="noopener"&gt;nasa9084/py-org&lt;/a&gt;
)。
コレをブログシステムに組み込むことでorgでブログを書くことができるという寸法です。
また、当初予定してはいなかったのですが、gitのsubmoduleで管理するのはバージョンアップの際などいろいろと面倒なので、パッケージ化してPyPIへとアップしました(&lt;a href="https://pypi.python.org/pypi/pyorg" target="_blank" rel="noopener"&gt;pyorg&lt;/a&gt;
)。
現在はバージョン0.1.3として、見出し、リスト、テーブル、リンク、画像、引用、文字の強調を実装済みです。今後、少しずつ拡張予定ですが、当面はリファクタリングを進めようと思っています。&lt;/p&gt;
&lt;p&gt;以上、pyorgのお話でした。&lt;/p&gt;</description></item><item><title>Pythonとわたし</title><link>https://blog.web-apps.tech/python_with_me/</link><pubDate>Mon, 05 Dec 2016 08:13:00 +0000</pubDate><guid>https://blog.web-apps.tech/python_with_me/</guid><description>&lt;p&gt;この記事は、&lt;a href="http://www.adventar.org/calendars/1741" target="_blank" rel="noopener"&gt;PyCon JP Advent Calendar&lt;/a&gt;
5日目へ寄せて書いた記事です。
執筆は&lt;a href="https://twitter.com/nasa9084" target="_blank" rel="noopener"&gt;@nasa9084&lt;/a&gt;
です。
昨日は寺田さんによる、&lt;a href="https://www.cmscom.jp/blog/v63gcs" target="_blank" rel="noopener"&gt;PyCon JPの立ち上げ&lt;/a&gt;
という記事でした。&lt;/p&gt;
&lt;h1 id="pythonと私の想い出"&gt;Pythonと私の想い出&lt;/h1&gt;
&lt;p&gt;PyCon JPアドベントカレンダーのテーマは「&lt;strong&gt;Pythonと私の想い出&lt;/strong&gt;」だそうです。
私が初めてまぁそれなりと言える程度にかけるようになったプログラミング言語がPythonでした。
なんどもCに挑戦しては挫折し、を繰り返していたのですが、Pythonのおかげで簡単なプログラムはかけるようになったんでした。&lt;/p&gt;
&lt;p&gt;扨、すでに行き先がよくわからなくなってきているこの記事ですが、もう少し私とPythonとの関わりを書いていきましょうかね。&lt;/p&gt;
&lt;h2 id="pythonを使う理由"&gt;Pythonを使う理由&lt;/h2&gt;
&lt;p&gt;もともと、私はHTMLから、ソースコードというものをエディタで書く、という世界に入ってきたんです。小学校高学年くらいの頃だったでしょうか。
最初はホームページビルダーでWebサイトを書いていたんですが、当時(今でもあるのかな？)、小学生でも使えるJavaScript集みたいなサイトがありまして、例えば、headタグの直後にコピペするとなんかカーソルにきらきらしたのがくっついてくるようになる、とかですね、今となってはとっても懐かしい感じのものがたくさんあったわけですよ。
そんなのをコピペするために、ホームページビルダーでソースコードビュー的なものを開きまして、コピペをしていたわけですね。
HTMLなんてまだまだ書けなかった私ですが、なんとなくルールがわかるんですね。そうすると、なんだか無駄っぽいのがあるわけですよ。
そういうのを、ちょこちょこと手作業で消していってみるわけです。
今思うと、リファクタリングのはしりみたいなもんです。これが私のソースコードを編集することの原点だったんです。&lt;/p&gt;
&lt;p&gt;ときは流れまして、Pythonという言語に出会います。
聞くところによると、この言語、&lt;strong&gt;インデントをきちんとしないと動作しない&lt;/strong&gt;そうじゃないですか。だれが書いてもそれなりに読みやすいコードになると。
もともとソースコードを綺麗にするのが楽しくてソースコードを触り始めた私ですから、これはとても気に入りました。
そうして私はPythonの世界にずぶずぶと浸かっていくのでありました・・・&lt;/p&gt;
&lt;h2 id="github-repository"&gt;GitHub Repository&lt;/h2&gt;
&lt;p&gt;現在、私のGitHubリポジトリ(&lt;a href="https://github.com/nasa9084" target="_blank" rel="noopener"&gt;https://github.com/nasa9084&lt;/a&gt;
)の数は、ちょうど20だそうです。自分が主となって開発しているものの、意味づけという理由があったりしてOrganizationを切り分けているものもありますから、20以上30未満、といったところでしょうか。
このうち、主にPythonで書いているリポジトリは10個程度で、半分には届かないものの、かなりの割合を占めています。&lt;/p&gt;
&lt;h2 id="pycon-jp-2016"&gt;PyCon JP 2016&lt;/h2&gt;
&lt;p&gt;2016年はPyCon JP 2016のスタッフをしました。PyCon JPは東京開催で、もちろんスタッフの多くは東京(または東京近郊)在住で、オフラインミーティングや作業日の開催地も東京です。
一応、都合のつく限りリモートでも参加をするんですが、これがなかなか難しいのです。
解決方法はまだわからないのですが、来年は東京で就職なので、遠方のスタッフがもっと溶け込みやすいようになにか頑張りたいと思っています。&lt;/p&gt;
&lt;h2 id="eureka"&gt;Eureka&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;実は、このブログのシステムもPythonで書かれています。構成としては、プログラム部がbottle + beaker + jinja2、アプリケーションサーバがuWSGI、HTTPサーバがnginxという構成です。
現状、JavaScriptは一切使っていないため、(特に管理画面において)残念な仕様の部分が多いです。
なんとかしたい。&lt;/del&gt;
ブログ移転で違うシステムになりました。&lt;/p&gt;
&lt;h1 id="まとめ的な"&gt;まとめ的な&lt;/h1&gt;
&lt;p&gt;そろそろ長くなってきましたし、もうなんの話かわからなくなってきましたので、この辺で終わりにしようと思います。
とりあえずですね。何が言いたいかというと、&lt;strong&gt;Pythonはいいぞ&lt;/strong&gt;ということです。
ぜひPyCon JP 2017にもお越しください。&lt;/p&gt;</description></item></channel></rss>