山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

Windowsから定期的にSlackに投稿する

はじめに

  • WindowsからSlackにメッセージを投げたい事があって、面倒だろうなと思って調べてみたらあまりにも簡単だったのでメモ。
    • 自分通知用にSlackメッセージ投げたい事あるよね?ない??
  • 一言で言うと「Windowsのタスクスケジューラでbash上でシェルを動かして、Slackにメッセージを投げる。」だけ。
  • Windows上でシェルが動くと楽で良い。

もうちょっと詳しく

  • 定期実行にはWindowsデフォルトのタスクスケジューラを使用。
  • Slackにメッセージを投げるにはIncoming WebHooksを使用して、規定のURLにPostする。
  • Postするにはシェルを使用。
    • 素のバッチで実行するのは面倒っぽい。
  • シェルを実行するにはWSL(Windows Subsystem for LinuxBash on Ubuntu on Windows)でインストールされるbashを使用。

手順

#!/bin/sh
# Incoming WebHooksのURL
WEBHOOKURL="https://hooks.slack.com/services/XXXX/XXXX/XXXX"
# slack 送信チャンネル
CHANNEL="#test"
# slack 送信名
BOTNAME="my_bot"
# slack アイコン
FACEICON=":ghost:"

WEBMESSAGE="Hello Slack!"

#Incoming WebHooks送信
curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${WEBMESSAGE}\" }" ${WEBHOOKURL} > /dev/null
  • タスクスケジューラ起動

f:id:yamap_55:20171208234801p:plain

  • 「基本タスクの作成」 or 「タスクの作成」
  • 名前やトリガーは適切な値に設定
  • 操作

f:id:yamap_55:20171208234805p:plain

注意

  • シェルの文字コードは「UTF-8」、改行コードは「LF」。
  • シェルに色々書きたい人は、Ubuntuのデフォルトシェルがbashじゃなくてdashであることを頭に入れておいたほうが良いかも?

Slackにメッセージ投げる部分抜粋

  • Slackに投げるだけなら、curlが使える環境ならPostするだけなので超簡単。
curl -s -S -X POST --data-urlencode "payload={\"text\": \"test dayo\" }" https://hooks.slack.com/services/XXXX/XXXX/XXXX" > /dev/null

Slackに投げる部分をもうちょっと汎用的にした奴

いくつか投げたい通知があったので、少し汎用的にして使っています。

#!/bin/sh

# Slack通知スクリプト
# 引数1(必須) : メッセージそのものか、メッセージが記載されたファイルPATH(PATHは/mnt/c/...形式)
# 引数2(任意) : 出力するユーザ名(未指定の場合は「mybot」)

MESSAGEFILE=$1

# slack 送信名
BOTNAME=$2
if [ "$BOTNAME" = "" ] ; then
  BOTNAME="mybot"
fi

ls ${MESSAGEFILE} > /dev/null 2>&1
if [ $? = 0 ] ; then
  WEBMESSAGE=`cat ${MESSAGEFILE}`
else
  WEBMESSAGE=${MESSAGEFILE}
fi
#WEBMESSAGE=`cat ${MESSAGEFILE}`

# Incoming WebHooksのURL
WEBHOOKURL="https://hooks.slack.com/services/XXXX/XXXX/XXXX""
# slack 送信チャンネル
CHANNEL="#test"
# slack アイコン
FACEICON=":ghost:"

#Incoming WebHooks送信
curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${WEBMESSAGE}\" }" ${WEBHOOKURL} > /dev/null

使う時

  • shから
/mnt/c/tools/notification2slack.sh "ほげほげでした。" "ほげ通知"
  • batから
bash "/mnt/c/tools/notification2slack.sh" "ほげほげでした。" "ほげ通知"

参考

lsとpwdをコマンドプロンプトで使う

c:\work\20170929>ls
'ls' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

はじめに

コマンドプロンプトで「ls」や「pwd」と打って怒られたので、カッとなってやりました。

真面目に使いたいなら↓辺りを参考に色々使ってみれば良いと思います。

手順

  • 以下の内容を「ls.bat」というファイル名で保存。
@echo off
dir %1
  • 以下の内容を「pwd.bat」というファイル名で保存。
@echo off
@cd
  • ↑で作成したファイルをパスの通った所に置く。
  • 使う。
c:\work\20170929>ls
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は DE0A-E8AA です

 c:\work\20170929 のディレクトリ

2017/09/29  04:51    <DIR>          .
2017/09/29  04:51    <DIR>          ..
               0 個のファイル                   0 バイト
               2 個のディレクトリ  173,906,067,456 バイトの空き領域

c:\work\20170929>pwd
c:\work\20170929

コマンドでやる

mkdir c:\shortcuta
cd c:\shortcuta
echo @echo off >> ls.bat
echo dir %1 >> ls.bat
echo @echo off >> pwd.bat
echo @cd >> pwd.bat
set PATH=%PATH%;c:\shortcut
ls
pwd

環境変数に追加は手でやってください。

後書き

Windowsでもエイリアスの設定ができるらしいので、こっちが楽かも。

MarkdownでSlide作成して自分のGitHub Pagesで公開する

MarkdownでSlide作成して自分のGitHub Pagesで公開する奴を作りました。 資料がアチラコチラに散らばることがなく、テキストでGitなので差分が見れたりと結構便利です。 動きがあるスライドなどは辛いですが、さくっと作る時には良いかと思いますので良かったら使ってみてください。

忙しい人用まとめ

経緯とか

私はスライド資料をPowerPointKeynoteで作るのが嫌なのでMarkdownで作成しGitHubで管理しています。*1今までは、そのスライドをSlideck(https://slideck.io/)というサービス*2でスライド表示していたのですが、たまに繋がらない事があったり、HTTPSで警告が出るようになったりとしていて、最近サイト自体が消えてドメインが別の方のものになってました。😂

代替サービスも色々探してはいたのですが中々しっくりくるものに巡り会えず。(一応下の方にまとめておきます。)自分でなんとかしようとなった次第です。

Markdownをスライド表示するreveal.jsは以前少しだけ触ったことがあったので、外部ファイルからファイルを読み込める事ができることは知っていました。なので、GitHubにあるMarkdownファイルを直接読ませたら表示できるのでは?っと読ませたら普通にスライドが表示されました。*3

という事で、最終的にはGitHub Pagesとして作成してみました。

使い方

初回

スライド追加

PDF出力をする場合

注意点

  • GitHub Pagesなので更新が遅い場合があります
    • ブラウザにキャッシュされている場合もある(キャッシュクリアや別ブラウザ、シークレットモードなどで確認)
  • 古いブラウザは考慮していません
  • オフラインでは見れません(↓のPDF化参照)

調査した代替サービス(覚えているものだけ)

  • GitPitch
    • GitHubで管理
    • × リポジトリ1つが1スライド
    • × ヘッダやフッタに色々ついてくるっぽい
  • Qiita
    • ○ Qiitaの記事をスライドで表示可能
    • × GitHub管理ではない(資料が分散してしまう、芝が生えない)
    • ○ たくさんの人に見てもらえる
  • Marp
    • × クライアントアプリケーション
      • 好きなアプリケーションを入れられない場合があるかも?そもそも自分のPCが使えない場合もあるかも?
    • ○ 結構盛り上がってるっぽい : 参考
    • GitHubに☆がいっぱい! : 参考
  • WikiNote
    • △ 匿名
    • × 誰でも変更可能
    • × GitHub管理ではない(資料が分散してしまう、芝が生えない)
    • × スライドモードでスライドが2枚づつ作成されている?
  • Generate Google Slides from markdown

*1:どこでもアクセス可能、履歴、差分見れる、芝生えるとメリットいっぱい

*2:ボケてなどを作ってる、ゆーすけべーさんが作成。 http://blog.yusuke.be/entry/2016/03/18/150640

*3:raw表示を行うURLを渡しましょう。 https://raw.githubusercontent.com/…

We Are JavaScripters! @10thに参加してきた #WeJS #yahoolodge

資料など、随時更新します。

はじめに

  • 8月25日(金)に「We Are JavaScripters! @10th」という勉強会に参加してきた時のメモです。
  • 全てLT、酒飲みながらのメモなので*1、興味のある発表については資料見たほうが早いかと思います。
    • 資料については公開され次第、随時追記します。
  • 記念すべき10回目!
  • ちなみに、登壇者で応募しましたが抽選で落ちました😂
  • 6人枠の所に14人?とか。辛い。
  • 登壇者9人中6人が、発表タイトルにReactが入っている。
    • 人数が↑と合わないのは、スポンサー枠、主催者枠のため。
  • ハッシュタグ : #yahoolodge #WeJS

概要

「JSの勉強会って、登壇する人がハイレベルな人ばっかりだな〜」
と思ったのがきっかけで作った勉強会、「We Are JavaScripters」!

自分が学んだこと/気づいたこと/面白かったこと/失敗したこと/ハマったこと/挑戦したこと/デバッグテクニック/オススメツール・開発環境/お気に入りのライブラリ/オレオレライブラリ/実はこうだった言語仕様/tips などなど、

お酒を片手に、気軽に発信できる場を目指しています^^/

※誰でも怖がらずに登壇できる空気を作りたいだけだけなので、もちろん玄人のみなさんも登壇大歓迎です!!

LT.1:Reactのフォーム画面開発で発生する問題をredux-formで解決する @kazuaki_okamoto

LT.2:Reactに不変の愛を @boiyaa

LT.3:Take into Accessibility in React @usagi-f

  • 発表資料
    • まだ公開されていない?
  • 元デザイナーの方
  • Accessibilityを意識したReactの話。
  • 実は相性が良いReactとアクセシビリティ
    • UIが容易に制御
    • 既に多くの拡張がある
  • WAI-ARIA
    • Web Accessibility Initiative - Accessible Rich Internet Applicationsの頭文字であり、HTMLやSVGで利用できるアクセシビリティ確保のための属性の仕様です。
  • aタグのhrefは必須じゃない
    • この属性は、プレースホルダーリンクを生成するために省略できます (HTML5)。プレースホルダーリンクは従来のハイパーリンクに似ていますが、どこにも移動しません。
  • ta11y?

LT.4:CSSの嫌なところを解決できる。そうCSS Houdiniならね。 @fukaminmin

LT.5:Chromeデベロッパーツールを自分色に染める @jumpei_ikegami

LT.6:flowがReactにもたらすもの @takanorip

  • 発表資料
    • まだ公開されていない?
  • 技術書展出店予定
  • flow?
    • 静的型チェッカー
  • 小さく試せる
    • レガシー環境下でも使える
  • AltJSではないのでESの機能すべて使える
  • Reactと相性がいい
    • 作ってる所が一緒
  • エラーが出た時に参考にできる情報がない
  • flowは後から入れても大丈夫なので、小さく入れてみると良い

LT.7:ReactでPDF帳票を出力する @stakezaki

LT.8:レガシーな環境にTypeScriptを導入した話 @ama

  • 発表資料
    • まだ公開されていない?
  • レガシーな環境とは。
  • 型があるって素晴らしい!
  • ある程度は書き方が統一できる
  • jQueryを使っていたら、jQueryの型定義が既にある。
  • 独自の型定義をどこまで頑張るのか問題。
  • JavaC#のエンジニアが多い場合にはTypeScriptがいい!

LT.9:同じとは @chikoski

*1:特に後半

JJUG ナイトセミナー 「Java O/Rマッパー特集」に参加してきました #jjug

久しぶりに?JJUGナイトセミナーに参加してきましたその際のメモになります。

あくまでもメモなので、抜けている箇所や誤っている箇所がある可能性があります。セッションの資料はかなりわかりやすかったので、是非各スライドをご参照ください

概要

時間 内容
19:00-19:05 オープニング
19:05-19:30 「25分でわかるJPA
19:30-19:55 「MyBatis を利用した Web Application 開発についてのご紹介」
19:55-20:05 休憩
20:05-20:30 「ざっくりわかるDoma
20:30-20:55 「Reladomo入門」
20:55-21:00 クロージング
21:00- 懇親会

25分でわかるJPA

  • スピーカー
    • 多田真敏 (@suke_masa)
    • 株式会社カサレアル
  • 発表資料
  • 25分でわかるJPA → 25分で(難しさが)わかるJPA
  • JPAとは
    • JAVA EEの一部(仕様のみ)
    • JPA実装ライブラリ
      • 仕様のみなので実装が必要
      • 実装によって挙動がぜんぜん違う
      • Hibernate
        • 今回はこちらを使用して説明する
      • EclipseLink
    • SQLはかかない
  • 実際に実行されるSQLは絶対にログに出せ!
  • エンティティの状態
    • めっちゃ重要
    • 永続化コンテキストに含まれるか否か
    • EntityManagerのメソッドで状態を変更する
  • エンティティの状態遷移のスライドが最大に重要
  • mergeメソッドの引数のオブジェクトは状態変更されない
    • 返り値のオブジェクトが状態変更されている
  • JPQLとは
    • SELECT,UPDATE,DEKETEのみ
    • INSERT、集合演算、FROMでの副問合せはできない
    • 殆どSQLと一緒だが、ちょっと違う
  • リレーションとN+1問題
    • フェッチは基本LAZY
      • EAGERは不要なデータを読み込むため
    • LAZYからEAGERから動的に変更も可能
      • JOIN FETCH文
      • DISTINCTを使用する
        • SQLに加えてListの重複を取り除く
  • Spring Data JPA
    • 超おすすめ
    • 便利機能満載
  • JPAは使えるのか?
    • 使える
    • ただし、正しい知識、シチュエーションを選ぶ必要がある
  • JPAを使っていい条件
    • DBを新規に設計できる
    • 集合演算やFROM区
    • パーフェクトJava EEを読破した人がプロジェクトに1人以上いる
    • ↑が1つでも当てはまらないならば他のORマッパーを使ったほうが良い

MyBatis を利用した Web Application 開発についてのご紹介

  • スピーカー
  • 発表資料
  • MyBatisとは
  • SQLは直接書く
    • interfaceを通じて呼び出す
  • 結果をBeanにMappingする
  • シンプルなので学習コストが低い
  • どんなスキーマでも使える
    • 手でSQLを書くため
    • 主キーがなくても
    • サブクエリなど複雑なクエリも簡単に使える
  • 完全にDB製品に依存する
    • 手でSQLを書くため
    • JPAとか使っていても結局、なんだかんだあってそのまま移行は難しい
  • 発行されるクエリが人間に読みやすい
    • 手で書くため
  • 3つの書き方
  • 困ったときに検索するとStack Overflowに引っかかるので大丈夫
  • Intellij IDEAがあれば、色々補完が効くので結構大丈夫
  • Spring bootのサポートが手厚い
  • Spring Initializrってのがかなりいいらしい
  • 利点
    • SQLが直接書いてある
      • コードレビューが容易
      • スロークエリのリカバリが容易
    • ドキュメントが充実
      • Qiitaの記事が結構いい
    • コードがシンプル
  • 欠点

ざっくりわかるDoma

  • スピーカー
  • 発表資料
  • Domaとは
    • Pluggable Annotation Processiong APIを利用
    • ORMというよりResultSet Mapper
    • SelectはSQLファイルを書く
    • Java8対応
      • Optionalとかいい感じに使える
  • DaoとエンティティでDB操作
  • SQLはMETA-INF配下に置く
  • SQLにロジックもかけたりする(後が辛い
  • Daoでできること
  • Streamで複数件検索する場合はStreamを直接返すメソッドは警告がFunctionを返すメソッドを使用する
  • forUpdate対応
  • 挿入、更新、削除でSQLファイルを書くことも可能
  • Domaができないこと
    • Selectクエリの自動生成
    • 親子などの構造を持ったエンティティへのマッピング
  • ドメインクラス
    • StringやIntegerなどの基本型だらけになりがちだけれども、値オブジェクトを使用可能
    • 引数の順番間違えでもコンパイルエラーになるからわかりやすい
    • シグネチャに現れる
    • IDEの補完がきく
  • ドメインクラスのデメリット
    • クラスが多くなる
    • 作るの面倒
  • コンパイル時検査
    • 割といい感じにコンパイル時にエラー出してくれる
    • SQLファイル内で変数をバインドしているのに使ってないなどもエラー
    • タイポ検出が結構嬉しい
  • Domaだけで使える
    • 依存jarがない
  • Spring Bootにプラグインありで使いやすいとのこと
  • Domaは日本語ドキュメントあり
  • DomaSeasarからの派生

Reladomo入門

  • スピーカー
  • 発表資料
  • 「りらども」と読むらしい
  • Relational Domain Object
  • ゴールドマン・サックスが2016/9に公開
    • OSSとしては日が浅いが、2004年に開発開始している
  • XMLからコード/DDLの自動生成
  • 強力に型付けられたクエリ言語
    • SQLは書かない
  • 具象クラス
  • Finderクラスを用いてOperationを生成
    • 複雑なクエリを型安全で柔軟に書ける
  • キャッシュ
    • 複数のキャッシュを持つ
    • キャッシュはかなり賢い
    • あまり深く考えなくても自動でDBアクセスを最小に保てる
  • セッターに値渡すといきなり更新が走る
  • Listで一括で複数更新も可能
  • 関連はXMLで定義
  • N+1問題
    • deepFetchというAPIを利用する
    • 取得したい関連をdeepFetch指定
  • みんなでアホになってフレームワークに任せましょう
  • GS Collectionsのサポートが手厚い
  • Eclipse Collectionsは現在サポートされていない
    • まもなくサポートされる予定
  • JUnitサポート
    • h2でいい感じに使える
  • バイテンポラルモデルサポート

We Are JavaScripters! @9thに参加してきた #WeJS #21cafe

はじめに

  • 7月20日(木)に「We Are JavaScripters! @9th」という勉強会に参加してきた時のメモです。
  • 全てLT、酒飲みながらのメモなので*1、興味のある発表については資料見たほうが早いかと思います。
    • 資料については、2017/07/21 9:00現在公開されていないようなので、公開され次第追記します。
  • ここ何回かは参加できていませんでしたが、もう9回目かという感じ。早いなー

概要

「JSの勉強会って、登壇する人がハイレベルな人ばっかりだな〜」
と思ったのがきっかけで作った勉強会、「We Are JavaScripters」!

自分が学んだこと/気づいたこと/面白かったこと/失敗したこと/ハマったこと/挑戦したこと/デバッグテクニック/オススメツール・開発環境/お気に入りのライブラリ/オレオレライブラリ/実はこうだった言語仕様/tips などなど、

お酒を片手に、気軽に発信できる場を目指しています^^/

※誰でも怖がらずに登壇できる空気を作りたいだけだけなので、もちろん玄人のみなさんも登壇大歓迎です!!

LT.1:JavaScriptパターンシリーズ ~オブザーバパターン~ @ta__miyan

LT.2:新卒エンジニアが Angular と React の比較をしてみた @atsushi

  • 発表資料
  • 新卒の方らしい。
  • Angular4
    • 独自ルールはだるい。
    • 先行事例が少なくてつらい。
    • 開発ツール使うと感動の嵐。
  • React
    • 先行事例が多い(日本語情報多い)
    • jsxが気持ち悪い
    • ライブラリの依存関係が多くてだるい
    • 開発ツール使うと感動の嵐。
  • RxJSは鬼ムズイ
  • Reduxはめんどくさい
    • ルールがかっちりしてるので、ちょっとしたことに対する手続きが多い。

LT.3:非SPAで小さく始めるReactアーキテクチャ @masarufuruya

LT.4:Reduxでmiddlewareを酷使するためにスロットマシーン書いた @腹筋コントローラーの力を信じろ

  • 発表資料
  • そこそこのアプリにならないとわからない。 → 作ってみた
  • Actionの分解。
  • Middlewareは何に反応して何に処理を繋ぐかだけを考えれば良い。
  • 結構いいんじゃない?という感想。
  • まかないてっく#1杯目 〜フロントエンドを語ろう〜の参加者募集中!
  • 前提の知識が私に足りなかったため、あまりメモれず。。。

LT.5:JavascriptでチャットCLIツール作成!@akane_256

  • 発表資料
  • チャットボット流行ってるので何か作ってみたい。
  • GoogleAPI.AIが便利そう。
    • Node.jsのSDKがある。
    • 言い回しのゆらぎを吸収。
  • コンソールに「ピザ食べたい」。
  • API.AIはサンプルコードがあるので、JavaScriptがわかれば簡単。
  • 楽しむの大事。
  • API.AIは今のところは無料らしい。
    • そのうち有料化の話もある??
  • API.AIのサンプルはピザ注文らしい。(チュートリアル?)

LT.6:JavaScript で味わう、関数型プログラミングのメリット @k5jp1015

  • 発表資料
  • 何故関数型なのか。
    • モジュール性が高まる。
    • テストが楽。
    • コードの正しさの証明。
  • small is beautiful
  • 個人的にわかった感がかなり大きい発表。
  • ☆後で見直す。

LT.7:Generate a QR code with your image by Vue.js! @schwalbe

  • 発表資料
  • LTするどころか、見ることもはじめて。
  • 本業はコンサルらしい。
  • とても初心者とは思えないw
  • 今後もプログラミングは続けていくとのこと。

LT.8:いまさらのPromise再入門 @chikoski

  • 発表資料
  • いずれされる処理を表すオブジェクト
  • 状態を2種類持っている。
    • if文(成功 or 失敗)
    • 仕事する前を含めて3つ
  • 直列化、並列化
  • エラー処理と本筋と分けて書ける
  • 普通の処理もPromiseで書いちゃう
  • thenの中でthenといったネストしたPromiseはよく考えた方が良い。
  • Promiseの本

*1:特に後半

Redshiftの文字列はバイト数換算

Amazon RedshiftはPostgreSQL互換ですが、多くの違いがあります。異なる点については公式を始めとして各所にまとまっていますが、タイトルの件についてはあまり記載を見なかったのでメモしときます。

PostgreSQLは文字数

SQLは2つの主要な文字データ型を定義しています。 character varying(n)とcharacter(n)です。 ここでnは正の整数です。 これらのデータ型は2つともn文字長(バイト数ではなく)までの文字列を保存できます。

わざわざ、バイト数ではなく と強調して書かれています。

create table hoge(c1 varchar(5));
insert into hoge(c1) values('12345'); -- OK
insert into hoge(c1) values('あいうえお'); -- OK
select * from hoge;

insert into hoge(c1) values('あいうえおa'); -- NG

実際にSQLを実行しても文字数換算です。

Redshiftはバイト数

公式から引用

CHAR および VARCHAR のデータ型は、文字単位でなくバイト単位で定義されます。CHAR 列にはシングルバイト文字のみを含めることができます。したがって、CHAR(10) 列には、最大 10 バイト長の文字列を含めることができます。VARCHAR にはマルチバイト文字 (1 文字あたり最大で 4 バイトまで) を含めることができます。例えば、VARCHAR(12) 列には、シングルバイト文字なら 12 個、2 バイト文字なら 6 個、3 バイト文字なら 4 個、4 バイト文字なら 3 個含めることができます。

こちらも、わざわざ文字単位ではなく と強調して書かれています。

create table hoge(c1 varchar(5));
insert into hoge(c1) values('あいうえお'); -- NG

insert into hoge(c1) values('12345'); -- OK
select * from hoge;

実際にSQLを実行してもバイト数換算です。ちなみに、日本語は3-4バイトになるので注意が必要です。

insert into hoge(c1) values('あ12'); -- OK
insert into hoge(c1) values('あ123'); -- NG

insert into hoge(c1) values('𠮷1'); -- OK
insert into hoge(c1) values('𠮷12'); -- NG

参考