PhoEniBiR~DevDiary

[Linux] cronでスケジュールを登録し、自動実行させる方法・設定


[Linux] cronでスケジュールを登録し、自動実行させる方法・設定
目的

手作業で定期的に実行しているプログラムをcronで自動実行させ、作業を漏れ無く実施するよう自動化する

目次
  • 1. cronってなに?(。・ω・。)
  • 2. 3通りのcronの設定方法
    ① crontabコマンド
    ② ファイル直接編集
    ③ スクリプト格納
  • 3. cron設定ファイルの書き方
  • 4. 起動ログの確認方法
1. cronってなに?(。・ω・。)

Linuxのスケジューラ機能です(Windowsでいう「タスクスケジューラ」に該当するもの)。事前にスケジュールを登録しておけば、決まったタイミングで決まったお仕事をしてくれるので、作業実施忘れを防いだり、工数削減に役立ちます(。・ω・。)

2. 3通りのcronの設定方法(① crontabコマンド)

下記コマンドを打つと、cronの設定ファイルが開きます。また、rootユーザでログイン時や、sudoでルート権限ログインをすれば、他のユーザのcronの設定もできます。ちなみに、現在の設定を確認する際は「crontab -l」コマンドで確認できます。

# cronタブコマンドの利用方法
crontab -e

# 他のユーザのcron設定方法
crontab -u [ユーザID] -e
2. 3通りのcronの設定方法(② ファイル直接編集)

下記ファイルを編集することで、設定ファイルを直接編集できます。

# cronファイルを直接編集する
vim /etc/crontab
2. 3通りのcronの設定方法(③ スクリプト格納)

下記cronフォルダにスクリプトを格納するだけで、定期実行されます(。・ω・。)

# 下記フォルダに格納することで、自動的にスクリプトが実行される
/etc/cron.hourly  # 1時間1回
/etc/cron.daily  # 1日1回
/etc/cron.weekly # 1週間1回
/etc/cron.monthly # 1ヶ月1回

ちなみに上記フォルダに格納した際の実行時間は、crontab -e にて確認できます。

# crontab -e
 ...
 01 * * * * root run-parts /etc/cron.hourly
 02 4 * * * root run-parts /etc/cron.daily
 22 4 * * 0 root run-parts /etc/cron.weekly
 42 4 1 * * root run-parts /etc/cron.monthly
 ...
3. cron設定ファイルの書き方

cron設定ファイルの書き方は、まとめると下記のとおりです。

  • 「分 時 日 月 曜日 コマンド」の並びで設定
  • 「* = 毎」の意味
  • 「-」で数字をつなげると、範囲指定
  • 「,(カンマ)」で区切るとその度
  • 「/数字」で[数字]おきに実行

以上です。。って、わかりにくいですよね(ノд・。)いくつか設定例を紹介します!

30 21 * * *  # 21:30に実行
0 12 * * *  # 12:00に実行
0 12 * * 1  # 毎週月曜の12:00に実行
0,30 12 * * 0,2,3  # 毎週日・火・水曜の12:00と12:30に実行
0-10 17 1 * *  # 毎月1日の17:00から17:10まで1分毎に実行
0 17 * * 1-6  # 月曜日から土曜まで17:00に実行
*/10 * * * *  # 10分おきに実行
0 */1 * * *  # 毎時0分に1時間おきに実行
* 1 * * *  # 1:00から 1:59まで 1分おきに実行
2 8-20/3 * * * # 8時〜20時までの間、3時間おきに、2分に実行
4. 起動ログの確認方法

cronの起動ログを確認する際は、下記コマンドにて確認可能です。

# cron起動ログを確認するコマンド
tail -f /var/log/cron

# 10行以上表示させる場合
tail -n [行数] -f /var/log/cron

# 該当の文言が入ったログのみ表示する場合
tail -n [行数] -f /var/log/cron | grep [文言]

[DB共通] 経年劣化によるクエリのパフォーマンス劣化を未然に防ぐ

[DB共通] 経年劣化によるクエリのパフォーマンス劣化を未然に防ぐ
目的

クエリのパフォーマンス劣化の罠にかからないためのプロローグ
※経年劣化:月日が経つことにより、性能や機能が劣化すること

1. 日々件数が増加するトランザクションテーブルで、パフォーマンスが落ちるようなクエリになっていないか?

日々件数が増加するようなテーブルに対するクエリは、テーブルのデータ件数によるパフォーマンス劣化が顕著にあらわれるので特に気をつける必要があります(ノд・。) 例えば、トランザクションテーブル全件取得としていると、日々取得件数が増えるので、だんだんクエリが遅くなってきます。トランザクションテーブルのデータが増えても、きちんと条件で絞ったりされる設計になっているか?を検討しましょう( • ̀ω•́ )✧
※全件取得できるような抜け道はないか?も検討しておくとBetter(。・ω・。)

2. インデックスが効いている項目を、検索項目として利用しているか?

特にテーブルのデータ件数が多い時、インデックス(索引)が効いている項目をWHERE句にしているかどうかで、パフォーマンスに影響が出ます。(本の索引があれば、本全体を読み返さなくても対象のページにたどり着ける可能性があるのと同じです)
クエリがインデックスをうまく使えていない場合は、対象列にインデックスを付与する等して、インデックスを有効活用できるようにしましょう(ただし、次の項目No.3に注意)

3. インデックスを追加する場合、その項目は頻繁に更新・削除は発生しないか?

インデックスを貼れば何でも検索が早くなるわけではありません。その項目が頻繁に更新、削除される場合は、インデックスを貼っても効果が目減りしていきます(本の索引はあるけど、ページが破れているため、結局すべてのページを探しに行くようなイメージ)
インデックスを付与する対象列の更新頻度等も気を配っていきましょう(。・д・。)

4. テーブルの件数が増加するトランザクション系の場合、データのローテートが実施されているか?

クエリを気にかけることも大切ですが、テーブルのローテートにも気を配りましょう。どんなにWHERE句の条件を厳しく設定しても、テーブルデータが500億件あったとすると、検索には時間がかかります(*´・д・)(・д・`*)

メモ(。・ω・。)φ...データベースへのアクセス回数が減らすことができるか検討しているか?

経年劣化とはまた違う話ですが、データベースへのアクセス回数を減らすことができるのであれば、ネットワーク負荷が軽減できるので良いです!プログラム側で何度もクエリを発行するのではなく、DB側でスクリプトを実行し、アクセスする回数を減らす等、色々試してみましょうv(。・ω・。)

[Windows] フォルダのアクセス権限の違い(共有タブ・セキュリティタブ)

[Windows] フォルダのアクセス権限の違い(共有タブ・セキュリティタブ)(。・ω・。)
目的

Windowsのフォルダアクセス制御を勉強し、正しくアクセス制御が設定できるようになる

Windows フォルダのアクセス権限概要図
Windowsに用意された2つのアクセス制御

Windowsには、共有タブにて設定する共有のアクセス制御と、セキュリティタブにて設定するNTFSのアクセス制御の2種類が存在します。

  • 共有のアクセス制御
    ハードディスクドライブが「FAT16/FAT32」でフォーマットされていた場合に利用されていました。「FAT16/32」にはアクセス制御の概念が無く、設定も出来ないため、アクセス制御を実施する場合はこのタブでのみ制御設定ができます。
  • NTFSアクセス制御
    NTFSはセキュリティを重視した「Windows NT」で採用されたフォーマット形式です。ユーザー個々にローカルなアクセス制御をするような、細かな設定をする場合はこちらを設定します。
2つのアクセス制御の違い

共有のアクセス制御は、ネットワーク経由で共有フォルダに接続してきたユーザにのみ適用され、ローカルにログオンしたユーザやリモート デスクトップを使用してログオンしたユーザには影響しません。一方、NTFSのアクセス制御では、全てのユーザに対して制御が適用されます。

  • 共有のアクセス制御
    ・ファイル共有を経由したアクセスの時にのみ適用される
  • NTFSアクセス制御
    ・ファイル共有を経由したアクセスの時、およびローカルアクセスの時の両方に適用される
    ・「Windows NT」でフォーマットされたものに対してのみ、設定可能

尚、両方設定されている場合は論理積の権限が適用されます。

推奨される設定

共有のアクセス権とNTFSアクセス権の2重管理を避けたい点から、下記が推奨されています(。・д・。)

  • 共有のアクセス権は常にEveryoneフルコントロール
  • NTFSのアクセス権でのみ制御する

[MySQL] 設定ファイルの設定値(my.conf)

[MySQL] 設定ファイルの設定値(my.conf)
目的

MySQL環境構築時に、設定ファイルの設定漏れがないようにするための備忘録

最大同時接続数(max_connection)

DBへの最大同時接続数を設定できます。多すぎるとメモリの消費量が大きくなるので、パフォーマンスを確認しつつ値を変更していきます(。・ω・。)

max_connections=400
スレッドのキャッシュ数(thread_cache_size)

スレッドのキャッシュ数を設定できます。一般的には、max_connections/3で設定します( • ̀ω•́ )✧

thread_cache_size=150
接続維持時間(wait_timeout・interactive_timeout)

接続維持時間を設定できます。デフォルト28800秒(8時間)で設定されており、接続持ったままになるので変更したほうが良いです(´・д・`)

wait_timeout=15
interactive_timeout=15
クエリのキャッシュサイズ(query_cache_size)

クエリのキャッシュサイズを設定できます。32Mで設定するのが一般的ですが、パフォーマンスを見ながら増減して下さいv(。・ω・。)♪

query_cache_size=32M
私的設定ファイル設定値(my.conf)
[mysqld]
# -------------------------------------
# DBサービス関連
# -------------------------------------
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

# 利用するポート番号を変更する    
port=****

# DNSで名前解決を実施しない
skip-name-resolve

# -------------------------------------
# サーバのコネクション・スレッド関連
# -------------------------------------
# 最大同時接続数を制限する(多すぎるとメモリ消費が大きくなる)
max_connections=400

# スレッドのキャッシュ数を指定(一般的にはmax_connections/3)
thread_cache_size=150

# 接続維持時間を変更(デフォルト28800秒(8時間))
wait_timeout=15
interactive_timeout=15

# -------------------------------------
# コネクション・スレッド毎のバッファ関連
# -------------------------------------
# ソート用のメモリサイズ
sort_buffer_size=2M

# -------------------------------------
# クエリキャッシュ関連
# -------------------------------------
# キャッシュクエリ機能をONにする(全てのSELECTクエリをキャッシュに入れる)
query_cache_type=1

# クエリキャッシュサイズ(32Mが一般的)
query_cache_size=32M

# テーブルキャッシュのサイズを指定
table_cache=450

# -------------------------------------
# 文字コード関連
# -------------------------------------
# 文字コード(UTF-8に統一)
default-character-set=utf8
skip-character-set-client-handshake

# -------------------------------------
# ログ関連
# -------------------------------------
# スロークエリログの収集
log-slow-queries=/var/log/mysql/slow_query.log
long-query-time=3
log-queries-not-using-indexes
log-slow-admin-statements

# 全クエリログ(容量が膨大になるため、デフォルトではコメントアウトしておく)
#log=/var/log/mysql/query.log

[SublimeText] テキストエディタを便利にするおすすめ設定集




[SublimeText] テキストエディタを便利にするおすすめ設定集
目的
  • 筆者愛用中のWindowsでもMacでも利用できるテキストエディタを、初期設定値からより便利にする
1. パッケージコントロールのインストール
  • 1. Ctrl + @ で、コマンド入力画面を開く
  • 2. 下記呪文を入力し、実行
  • import urllib2,os; pf='Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please restart Sublime Text to finish installation') 
  • 3. Sublime再起動
2. テーマのインストール [Sublime Text 2 Theme – Flatland]

一目惚れしたFlatlandテーマを利用しています。ここは、お好きなテーマをインストールしてください(。・ω・。)

  • 1. Ctrl + Shift + P で、パッケージコントロールを開く
  • 2. [Package Control: Install Package]を選択する
  • 3. [Theme – Flatland]を選択する(インストール)
  • 4. ユーザ設定に、下記を追加する(カラーはMonokaiを使う)
  • "theme": "Flatland Dark.sublime-theme"
    , "color_scheme": "Packages/Theme - Flatland/Flatland Monokai.tmTheme"
3. ファイル比較プラグインをインストール

簡単にファイル比較が実施できるよう、ファイル比較プラグインを導入します( • ̀ω•́ )✧

  • 1. Ctrl + Shift + P で、パッケージコントロールを開く
  • 2. [Package Control: Install Package]を選択する
  • 3. [FileDiffs]を選択する(インストール)
4. Shift-jisファイル形式を開けるようにする

SublimeText、実は初期設定ではShift-jisが文字化けしてしまいます(ノд・。)ということで、設定追加です!

  • 1. Ctrl + Shift + P で、パッケージコントロールを開く
  • 2. [Package Control: Install Package]を選択する
  • 3. [ConvertToUTF8]を選択する(インストール)
私的おすすめユーザ設定ファイル

オススメの私的設定ファイルを公開します!使えそうなものがあれば、ご利用下さいv(。・ω・。)ィェィ♪

// Settings in here override those in "Default/Preferences.sublime-settings", and
// are overridden in turn by file type specific settings.
//# ----------------------------------------------------------------
//# PhoEniBiR Setting
//# ----------------------------------------------------------------
{
  //# テーマの設定(Flatlandテーマインストール後)
  //"theme" : "Default.sublime-theme"
  "theme": "Flatland Dark.sublime-theme"
  , "color_scheme": "Packages/Theme - Flatland/Flatland Monokai.tmTheme"

  //# デフォルトのエンコーディング
  , "default_encoding" : "UTF-8"
  
  //# デフォルトの改行コード(UNIX:LFに設定)
  , "default_line_ending" : "unix"
  
  //# フォント
  , "font_face" : "Meiryo UI"
  , "font_size" : 13

  //# 行番号の表示
  , "line_numbers" : true

  //# タブサイズ
  , "tab_size" : 2

  //# タブ・スペース変換
  , "translate_tabs_to_spaces" : true

  //# 横スクロール
  , "word_wrap" : false

  //# フォーカス行のハイライト
  , "highlight_line" : true

  //# 対応する[]の強調
  , "match_brackets_square" : true

  //# 対応する{}の強調
  , "match_brackets_braces" : true

  //# 対応する<>の強調
  , "match_brackets_angle" : true

  //# 対応するタグの強調
  , "match_tags" : true

  //# ガーターの表示
  , "gutter": true

  //# 折り畳みボタン
  , "fold_buttons" : true

  //# オートインデント
  , "auto_indent" : true

  //# 空行のインデントを取り除く
  , "trim_automatic_white_space" : true

  //# プログラムのソースコード:折り返さない・普通のテキストファイルなら折り返し
  , "word_wrap": "auto"

  //# 折り返し幅(0:ウィンドウ幅で折り返す)
  , "wrap_width" : 0

  //# 折り返し後の開始位置(true:インデント行に折り返し)
  , "indent_subsequent_lines" : true

  //# かっこ等を補完
  , "auto_match_enabled" : true

  //# ミニマップに、枠を表示する
  , "draw_minimap_border" : true

  //# 同じ単語を強調する(選択時、白枠で囲む)
  , "match_selection" : true

  //# タブ補完
  , "tab_completion" : true

  //# オートコンプリート
  , "auto_complete" : true

  //# どの位置にいても、Shift + Tabでインデント削除
  , "shift_tab_unindent" : false

  //# 文字を選択した状態で検索すると、デフォルトで選択文字が入力される
  , "find_selected_text" : true

  //# FOLDERSを太文字にする
  , "bold_folder_labels" : true

  //# 未保存のタブをハイライト
  , "highlight_modified_tabs" : true

  //# 新規ファイルを既存のWindowで開く
  , "open_files_in_new_window" : false
}

[Intra-mart] IMMマスタ情報取得クエリ集




[Intra-mart] IMMマスタ情報を確認するクエリ集(。・ω・。)
目的

Intra-martマスタ情報の設定状況を調査するために、確認するクエリを集めました

環境
  • WebPlatform /AppFramework Version7.2x
  • SQL Server
ユーザが所属しているロール一覧を取得するクエリ

ユーザが保持するロールの一覧を取得しています。
USER_CODEに調査対象のユーザを入力して下さい。

--# ---------------------------------------------------
--# ユーザが所属しているロール一覧を取得
--# ---------------------------------------------------
--# ユーザID
DECLARE @USER_CODE NVARCHAR(20) = 'sample_user_cd'
DECLARE @COUNTRY_CODE NVARCHAR(20) = 'ja'

--# ロール情報一覧取得
SELECT
 a.user_id 'ユーザID'
 , a.role_id 'ロールID'
 , b.display_name 'ロール名称'
FROM
 b_m_account_role_b a
 LEFT JOIN b_m_role_i b
  ON
   a.role_id = b.role_id --# ロールは期間化されないため時系列比較不要
   AND b.locale_id = @COUNTRY_CODE
WHERE
 user_id = @USER_CODE
 AND CONVERT(NVARCHAR, GETDATE(), 111) BETWEEN valid_start_date AND valid_end_date

パブリックグループに所属するメンバー一覧を取得するクエリ

パブリックグループを指定し、そのパブリックグループが保持する役割、所属するユーザ一覧を取得します。PUBLIC_CODEに調査対象のパブリックグループを入力して下さい。

--# -------------------------------------------
--# PGに所属している人一覧を取得
--# -------------------------------------------
--# パブリックグループコード
DECLARE @PUBLIC_CODE NVARCHAR(30) = 'public_cd'

SELECT
 ipga.public_group_cd 'PGコード'
 , ipg.public_group_name 'PG名称'
 , ipgra.role_cd '役割コード'
 , ipgr.role_name '役割名称'
 , ipga.user_cd 'ユーザコード'
FROM
 imm_public_grp_ath ipga --# パブグル紐付け
 LEFT JOIN imm_public_grp ipg
  ON
   ipg.public_group_cd  = ipga.public_group_cd
   AND ipg.delete_flag = '0'
   AND GETDATE() BETWEEN ipg.start_date AND ipg.end_date
 LEFT JOIN imm_public_grp_role_ath ipgra
  ON
   ipgra.public_group_cd = ipg.public_group_cd
   AND ipgra.user_cd = ipga.user_cd
   AND ipgra.delete_flag = '0'
   AND GETDATE() BETWEEN ipgra.start_date AND ipgra.end_date
 LEFT JOIN imm_public_grp_role ipgr
  ON
   ipgr.role_cd = ipgra.role_cd
   AND ipgr.public_group_set_cd = ipgra.public_group_set_cd
   AND ipgr.delete_flag = '0'
   AND GETDATE() BETWEEN ipgr.start_date AND ipgr.end_date
WHERE
 ipga.delete_flag = '0'
 AND GETDATE() BETWEEN ipga.start_date AND ipga.end_date
 AND ipga.public_group_cd = @PUBLIC_CODE
ユーザの所属情報を取得するクエリ(IMマスタ)

ユーザの所属情報一覧を取得します

--# -------------------------------------------------------------------------
--# ユーザの所属情報を取得するクエリ(IMマスタ)
--# -------------------------------------------------------------------------
SELECT
 a.user_cd 'ユーザID'
 , a.user_name 'ユーザ名'
-- , c.company_cd '会社コード'
 , b.department_cd '人事組織コード'
 , d.department_name '会社名'
 , c.department_name '組織名'
 , b.department_main '主所属フラグ'
FROM
 imm_user a --# ユーザマスタ
 LEFT JOIN imm_department_ath b --# 組織ーユーザ紐付けマスタ
  ON
   b.user_cd = a.user_cd
   AND GETDATE() BETWEEN b.start_date AND b.end_date
   AND b.delete_flag = '0'
 LEFT JOIN imm_department c --# 組織マスタ
  ON
   c.department_cd = b.department_cd
   AND c.delete_flag = '0'
   AND c.company_cd = b.company_cd
   AND GETDATE() BETWEEN c.start_date AND c.end_date
 LEFT JOIN imm_department d --# 組織マスタ(会社名取得用)
  ON
   d.company_cd = d.department_cd
   AND d.company_cd = c.company_cd
   AND d.delete_flag = '0'
   AND GETDATE() BETWEEN d.start_date AND d.end_date
WHERE
 a.delete_flag = '0'
 AND GETDATE() BETWEEN a.start_date AND a.end_date
 AND a.locale_id = 'ja'
ORDER BY
 a.user_cd ASC
 , b.department_main DESC

[Blogger] GoogleBloggerでソーシャルボタン設置する方法まとめ(ボックス)




[Blogger] GoogleBloggerでソーシャルボタン設置する方法まとめ(ボックス)
目的

ソーシャルボタンをつくり、シェアしてもらうことで、検索エンジン以外からのアクセス数を増やす

仕様
  • ソーシャルボタンは、全てボックス型とする
  • 対象のSNSは、Facebook、twitter、はてぶ、Google+、Pocketとする
作成手順
  • 1. 横並び用のCSSを追加する
  • 2. Facebook用に、bodyタグ直後にAPIを埋め込む
  • 3. ソーシャルボタンを表示したい位置に、コードを配置する
1. 横並び用のCSSを追加する

ソーシャルボタンを横並びで表示するために、CSSを追加する

/* ○リストの中身を上下左右センター揃え */ 
.socialButtonLine {
  position: relative;
  overflow: hidden;
}
.socialButtonLine ul {
  float: left;
  position: relative;
  left: 50%;
}
.socialButtonLine li {
  position: relative;
  margin: 0 0 0 10px;
  left: -50%;
  display: table-cell;
  vertical-align: middle;
  float: left;
}
2. Facebook用に、bodyタグ直後にAPIを埋め込む

Facebookのいいねボタンを表示させるために、下記コードをbodyタグ直後に挿入する

<!-- [FacebookAPI] START -->
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=v2.0";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<!-- [FacebookAPI] END --> 
3. ソーシャルボタンを表示したい位置に、コードを配置する

ソーシャルボタンを表示したい場所に、下記コードを追加する

<!-- [SocialButton] START -->
<div class='socialButtonLine' style='margin:10px 0 30px 0;'>
<ul>
<li>
  <!-- [SB] Facebook -->
  <div class="fb-like" expr:data-href="data:post.url" data-layout="box_count" data-action="like" data-show-faces="false" data-share="false"/>
</li>
<li>
  <!-- [SB] Hatebu -->
  <a class='hatena-bookmark-button' data-hatena-bookmark-layout='vertical-balloon' data-hatena-bookmark-lang='ja' expr:data-hatena-bookmark-title='data:post.title' expr:href='"http://b.hatena.ne.jp/entry/" + data:post.canonicalUrl' title='このエントリーをはてなブックマークに追加'><img src='http://b.st-hatena.com/images/entry-button/button-only@2x.png' alt='このエントリーをはてなブックマークに追加' width='20' height='20' style='border: none;' /></a><script type='text/javascript' src='http://b.st-hatena.com/js/bookmark_button.js' charset='utf-8' async='async'></script>
</li>
<li>
  <!-- [SB] Twitter -->
  <a class='twitter-share-button' data-count='vertical' data-hashtags='写真撮影テク' href='https://twitter.com/share'>Tweet</a>
  <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>
</li>
<li>
  <!-- [SB] Google+ -->
  <script src='https://apis.google.com/js/platform.js' type='text/javascript'/>
  <div class='g-plusone' data-size='tall'/>
</li>
<li>
  <!-- [SB] Pocket -->
  <a class='pocket-btn' data-lang='en' data-pocket-count='vertical' data-pocket-label='pocket'/>
  <script type='text/javascript'>!function(d,i){if(!d.getElementById(i)){var j=d.createElement("script");j.id=i;j.src="https://widgets.getpocket.com/v1/j/btn.js?v=1";var w=d.getElementById(i);d.body.appendChild(j);}}(document,"pocket-btn-js");</script>
</li>
</ul>
</div>
<!-- [SocialButton] END -->

いかがでしょうか?うまく表示できない場合は、遠慮なくお問い合わせ下さい(。・ω・。)