C#のメモ

VSCSharp_CoreTweet_01
VisualStudio の右上にある 「クイック起動(Ctrl+Q)」に「coretweet」と入力しエンター。
VSCSharp_CoreTweet_02
「インストール」をクリック

あとは、CSファイルで

using CoreTweet;

と追加すればOK。


string TW_API_KEY = “xxxxxxxxxxxxxxxxxxxxxxxxxxxx”;
string TW_API_KEY_S = “xxxxxxxxxxxxxxxxxxxxxxxxxxxx”;
string TW_ACC_TKN = “xxxxxxxxxxxxxxxxxxxxxxxxxxxx”;
string TW_ACC_TKN_S = “xxxxxxxxxxxxxxxxxxxxxxxxxxxx”;

StringBuilder Tweet_text = new StringBuilder();

var tokens = CoreTweet.Tokens.Create(TW_API_KEY, TW_API_KEY_S, TW_ACC_TKN, TW_ACC_TKN_S);

foreach (var status in tokens.Statuses.HomeTimeline(count => 10).Where(x => x.Text.Length > 60))
{
Tweet_text.Append(status.Text + “\r\n\r\n”);
}
TweetArea.Text = Tweet_text.ToString();


Excel vba でセルの値が変更されたら実行する処理を書いてみる

例えば、顧客管理の中で配送業者名(あるいはその記号)を入力した時に、セルの色を変えたいなんてことがあった。

Worksheet_change_01

こんな感じで、運送業者や配送方法によってセルの色を変えたいという要望ね。

Excel2007以降は「条件付き書式」でいくつも指定できるから、単純にセルの色だけを変えたい場合にはそれを使っても良いでしょう。

しかし、今回は他の処理も同時に行いたいという要望もあったので「条件付き書式」では対応が出来なかった。

そこで使うのが「change」というイベントプロシージャ。

Worksheet_change_02

changeというイベントプロシージャは、そのワークシートのどこかのセルが変更されたら実行するもの。

そして、「Target As Range」ということから、Targetという変数にはRangeが渡される(正しくはRangeオブジェクト)。

実行される処理としては、変更されたセルがH列の場合にセルの色を変える内容が書かれている。

まぁ、この例は単純なもので、

case “s”
Cells(Target.Row, Target.Column).Interior.ColorIndex = 35

の後に

 Cells(Target>row, Target.Column + 1).value = “佐川急便元払”

とか、なにか処理を続けても良いと思うのね。

 
このchangeイベントはけっこう便利。

AmazonのSellerCentralから取得した情報をExcelで処理してみる

FBAがスゴク便利で、ちょいちょいAmazonに出品する機会がある。

そのなかで、Amazonの集客力を利用して赤字で在庫を処分する、というケースも想定される。

この場合、SellerCentralの「Amazon出品コーチ」が指示してくれる「在庫の補充を推奨する商品」では、さすがに自動的に弾いてくれるという事はない。

これは単純に過去の販売数量と在庫数あたりから補充の推奨を促しているだけなので、赤字でも格安で処分に走った商品なのか、今が旬の売れ筋商品なのかまでは気を遣ってくれない。当たり前だけど。

そこで、今回はExcel君に頑張ってもらった。

目的としてはFBA在庫として拡販・処分販売を行っていく商品の選別というのが第一。

そこで参照する、SellerCentralからダウンロードできるレポートで必要なのは

「レポート」→「ビジネスレポート」→「詳細ページ 売上・トラフィック」のCSVデータ
 ※ 直近30日の売上データを参照したい

「在庫」→「出品レポート」→「出品詳細レポート」のTAB区切りなtxtファイル
 ※ 現在価格や出品者側の在庫数を参照したい

「レポート」→「フルフィルメント」→「在庫受領レポート」
 ※ FBA納品日や数量を参照したい

「レポート」→「フルフィルメント」→「在庫健全性レポート」
 ※ 「売上・トラフィック」のCSVと被るが、過去30日、90日、または保管手数料などを参照したい

「SKUと自社で使用している販売管理ソフトなどで登録されている商品コード等との紐付けファイル」
 ※ こればかりは会社によって事業所によって異なると思う。
   AmazonでのSKUから、直接、仕切や社内在庫が検索できるなら不要。
   しかし、SKUがそのまま社内で使用している販売管理システムで通用するわけではないと思うので、
   今回は、SKUと社内で使用中の管理システムとを橋渡ししてやるためのリストを作った。
   データベースでいうところのリレーションというやつかしらね?

という、これら5つのファイルを用意する。

とはいっても、4つはAmazonが自動的に作ってくれるもの。

もう1つはSKUと自社システムとの紐付けファイルだけど、これは結局、運用するExcelファイルにシートとして用意して随時入力する方式とした。
(SKUと自社システムの管理コードが完全一致ならメチャ楽、ということなんだけど、逆をいえば、SKUと自社システムの管理コードとに全く関連がないと、全て手作業で入力しなければならないという可能性がなきにしもあらず)

で、出来上がったのがこんな画面。

fba_01


当たり障りのないデータを用意してみたつもりだけど、モザイクがうざくてすみません。

要は、これで現在価格と粗利、損益分岐点(ボーダー)、FBAへ最後に納品した日とその数量、納品アラート、過去30日間・90日間の販売数、ほぼリアルタイムに近い直近30日間の販売数、それらから求める月間予想粗利あたりがパッと見でわかる。
(粗利とはいっても販売手数料とFBA送料はさっ引いてるので、わりと純利益に近いかも)

で、わりと面倒なのがFBAへの納品手続き。

一つの商品を納品するならまだしも、複数の商品を納品しようとしたら「納品プランファイルをアップロード」という機能を使うと超便利。

その為に、ユーザーフォームを作って、出荷を推奨するデータのみに絞り、そこから本当に出荷すべき商品を「納品プランファイル」として作成するようにした。

こんな画面で作成時間のわりに、以外と使いやすかったりする。

fba_02


この画面だと「粗利率 1.99%」みたいになってる2919行目の商品は、もうやめてもいいよね。
3005行目も5%切ってるし、直近の30日間で2個しか売れてないとか、販売する意味ないよね。

そんな感じで「納品推奨」の中から「本当に納品すべきもの」を絞り込んでリストを作る。

納品したい商品にチェックを入れて、納品したい数量を入力して、「納品プランファイル作成」ボタンを押す。

出来上がったファイルをAmazonにアップロードすれば、後は「配送ラベル」を出力して、

混在在庫なら、商品を梱包し、

混在在庫じゃなければ、それぞれの商品にラベルを貼って梱包し、

発送すれば完了。

SellerCentralって確かに便利なんだけど、FBAに納品すべきかどうかを判断するのには、いくつかのレポートを見たり、在庫状況を確認したり、手数料を確認したり、なんだかんだでステップ数があるので、こうしてExcelにでもしておくと便利。

FBAへの出荷はおかげで漏れがなくなってきたかな。

Amazon MWS クライアントライブラリ を使ってみる 【 PHP 】

まずは設置。

とりあえず、フィードAPIのクライアントライブラリをダウンロード。

解凍すると[src]配下に[MarketplaceWebService]ができ、さらにその下に [Mock] [Model] [Samples] の3つのフォルダが出来上がる。

これらをサーバーの適当な場所に放り込む。

尚、「MarketplaceWebService」という名称は変更しない方が無難。
最初、必要なものだけ抜き出そうとして、フォルダ名を変更したら全く機能しなかった。
フォルダ名を戻したらOKだった、みたいなことがあったので、変更しない方が良いのかもしれない。

さて、フィードAPIの場合、編集が必要なファイルは「.config.inc.php」

アクセスキーIDやらシークレットアクセスキーやら、そのあたりを適宜変更。
「set_include_path」も変更が必要かな?
ここはこのライブラリをどこに置くでも変わってくるので、環境によりけりで要調整。

「Samples」フォルダから「SubmitFeedSample.php」「GetFeedSubmissionListSample.php」「GetFeedSubmissionResultSample.php」の3つをsrcフォルダに置く。

と、この「src」はあまりにもアレなので、適当に「Amazon」とでもリネームしてみた。

コピーしてきた3つのファイルも中身を適宜変更。

SubmitFeedでフィードを送り、GetFeedSubmissionListでリストを取得し、GetFeedSubmissionResulで結果を取得。

あとはFeedTypeにどんなのがあって、どんな書式になってるのか、利用シーンに合わせて勉強が必要か・・・

とりあえずは、ゲリラ的なタイムセールをやりたいときの時間帯指定セール価格変更が出来たのでよしとしよう。

親ページなら子ページのリストを、子ページなら記事本文を表示する その2

前回、リスト化する方法でこんなことを書いた。

が、こんなもっと良い方法があった。

「custom-xxxxx.php」というファイルを作るところまでは共通で、その中身。

wp_list_pages を使うともっとすっきりもっとわかりやすくもっと使いやすい。

// リスト化したいページのIDを指定
$allow_list_id = array('0','108','122','146');

// array_search で $allow_list_id の中に現ID(get_theid())=リストを表示したいページが含まれているかどうか判別
if(array_search(get_the_id(),$allow_list_id)){
 
 // パラメータ chiled_of を指定することで、そのページのサブページを表示させる
 $child_of = get_the_id();
 
 $list_paras = array(
     'post_type'   => 'カスタム投稿タイプ名',
     'show_date'   => '',
     'exclude'     => '',
     'depth'       => '0',
     'date_format' => get_option('date_format'),
     'child_of'    => $child_of,
     'title_li'    => '',
     'echo'        => 1,
     'sort_column' => 'post_modified',
     'link_before' => '',
     'link_after'  => '',
     'exclude_tree'=> '' );

 // てことで表示
 wp_list_pages($list_paras);

パラメータは環境によってお好きなように。。。

前回の方法より、今回の方が使いやすいかな。

親ページなら子ページのリストを、子ページなら記事本文を表示する

カスタム投稿タイプでいくつかのページを作ったけど、親ページには子ページのリストを表示したい!
ということで、下記の方法に辿り着いたわけだけど、なんか、もっと簡単な方法ないのかな。。。?

とりあえずはできてるのでメモ

テンプレートヒエラルキー抜粋

上図をみるとカスタム投稿は single-$posttype.php を見に行く。
そして、ブログ投稿は single-post.php を見る。

そこで、まず、single-post.php があるかどうか確認。
標準で存在するものと思っていたファイルだけれど、なかったので single.php を single-post.php としてコピー。

また、single.php は最終的に他のテンプレートからも参照される可能性があるので、カスタム投稿ファイル用に single-$posttype.php なるものを作るほうがベターかも。
これは、「親ページでは子ページのリストを表示したいカスタム投稿タイプ」のページ分、作る必要がありそう。

とはいえ、上図で single.php を参照するもう一つは「添付ファイル投稿」なので、直接 single.php を書き換えてしまっても良いのかな。
(実は、今のところ、直接 single.php を書き換えてたりする)

さて、これで「ブログ投稿」は「single-post.php」を参照、「カスタム投稿タイプ」は「sinle.php」を参照することになる。

ということは、single.php に手を加えれば、リスト表示ができる?

確かに、single.php にリスト化するスクリプトを記述すれば表示はされる。
けど、よく見るとコンテンツを表示するために「get_template_part()」が使われている。

「ブログ投稿」の場合には「get_template_part( 'content', get_post_format() );」となっていて
content-[post_format].php というファイルが読み込まれるようになっている。

であれば、「カスタム投稿タイプ」を表示する際には「single.php」を読み込み、さらにそこから「custom-xxxxx.php」といったファイルを読み込ませれば効率的。

この場合には「get_template_part( 'content', 'xxxxx' );」といった具合に。
xxxxxは任意で、今回は「custom」としてみようかと思う。

というわけで、content.php を content-custom.php とでもしてコピーし、下記内容に適宜書き換える。

 <?php if ( is_search() ) : // Only display Excerpts for Search ?>
  <div class=”entry-summary”>
   <?php the_excerpt(); ?>
  </div><!– .entry-summary –>
 <?php else : ?>
  <div class=”entry-content”>

// 親ページかどうかの判別。親ページは $post->post_parent が「0」
  <?php if ( is_single() && $post->post_parent == 0 ) : ?>
   <ul>
    <?php
    $all_lists = get_posts( array( 'post_type' => get_post_type($post),
                                   &#39orderby&#39 => 'menu_order',
                                   'order' => 'ASC',
                                   'posts_per_page' => 30));
    array_shift($all_lists);
    foreach($all_lists as $post) {
     setup_postdata($post);
    ?>
    <li>
     <a href=”<?php the_permalink() ?>”><?php the_title() ?></a>
    </li>
    <?php
    }
    ?>
   </ul>
  <?php else : // 子ページなら投稿記事本文を表示 ?>
   <?php the_content( __( 'Continue reading <span class=”meta-nav”>→</span>', 'twentytwelve' ) ); ?>
   <?php wp_link_pages( array( 'before' => '<div class=”page-links”>' . __( 'Pages:', 'twentytwelve' ), 'after' => '</div>' ) ); ?>
  <?php endif; ?>
  </div><!– .entry-content –>
 <?php endif; ?>

とまぁ、ざっと書いちゃったけど、大事なのは以下の部分かな。

    $all_lists = get_posts( array( 'post_type' => get_post_type($post),
                                   'orderby' => 'menu_order',
                                   'order' => 'ASC',
                                   'posts_per_page' => 30));

‘orderby’ => ‘menu_order’
‘order’ => ‘ASC’
で、「ページ属性」の「順序」通りに並び替える。

‘posts_per_page’ => 30
は、まぁ、適当に子ページが30を越えてるなら、50とか100にね。

array_shift($all_lists);
おそらく、親ページの「ページ属性」「順序」は「0」としているはず。
とすると、配列の先頭に親ページがくるので、array_shift()で先頭を取り出してしまう。
(親ページに子ページのリストを表示したいんだから、親ページは不要でしょ?)
もし、「ページ属性」「順序」「0」が他にもあるなら、期待した動作にならないので、要注意。
個人的には、親ページの順序は「0」子ページは「1」から振ってくようにしている。
(ただ、親ページを最初に作っておけば、「0」でも大丈夫みたいだけどね、念のため)

    foreach($all_lists as $post) {
     setup_postdata($post);
    ?>
    <li>
     <a href=”<?php the_permalink() ?>”><?php the_title() ?></a>
    </li>
    <?php
    }
    ?>
   </ul>

あとは、foreachで回して、タイトルとパーマリンクを使ってリストにする。

  <?php else : // 子ページなら投稿記事本文を表示 ?>
   <?php the_content( __( 'Continue reading <span class=”meta-nav”>→</span>', 'twentytwelve' ) ); ?>
   <?php wp_link_pages( array( 'before' => '<div class=”page-links”>' . __( 'Pages:', 'twentytwelve' ), 'after' => '</div>' ) ); ?>
  <?php endif; ?>
  </div><!– .entry-content –>
 <?php endif; ?>

ここは content.php の中身そのままなので、特筆なし。